linux/lib/dma-debug.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2008 Advanced Micro Devices, Inc.
   3 *
   4 * Author: Joerg Roedel <joerg.roedel@amd.com>
   5 *
   6 * This program is free software; you can redistribute it and/or modify it
   7 * under the terms of the GNU General Public License version 2 as published
   8 * by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License
  16 * along with this program; if not, write to the Free Software
  17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  18 */
  19
  20#include <linux/scatterlist.h>
  21#include <linux/dma-mapping.h>
  22#include <linux/stacktrace.h>
  23#include <linux/dma-debug.h>
  24#include <linux/spinlock.h>
  25#include <linux/debugfs.h>
  26#include <linux/uaccess.h>
  27#include <linux/device.h>
  28#include <linux/types.h>
  29#include <linux/sched.h>
  30#include <linux/ctype.h>
  31#include <linux/list.h>
  32#include <linux/slab.h>
  33
  34#include <asm/sections.h>
  35
  36#define HASH_SIZE       1024ULL
  37#define HASH_FN_SHIFT   13
  38#define HASH_FN_MASK    (HASH_SIZE - 1)
  39
  40enum {
  41        dma_debug_single,
  42        dma_debug_page,
  43        dma_debug_sg,
  44        dma_debug_coherent,
  45};
  46
  47#define DMA_DEBUG_STACKTRACE_ENTRIES 5
  48
  49struct dma_debug_entry {
  50        struct list_head list;
  51        struct device    *dev;
  52        int              type;
  53        phys_addr_t      paddr;
  54        u64              dev_addr;
  55        u64              size;
  56        int              direction;
  57        int              sg_call_ents;
  58        int              sg_mapped_ents;
  59#ifdef CONFIG_STACKTRACE
  60        struct           stack_trace stacktrace;
  61        unsigned long    st_entries[DMA_DEBUG_STACKTRACE_ENTRIES];
  62#endif
  63};
  64
  65struct hash_bucket {
  66        struct list_head list;
  67        spinlock_t lock;
  68} ____cacheline_aligned_in_smp;
  69
  70/* Hash list to save the allocated dma addresses */
  71static struct hash_bucket dma_entry_hash[HASH_SIZE];
  72/* List of pre-allocated dma_debug_entry's */
  73static LIST_HEAD(free_entries);
  74/* Lock for the list above */
  75static DEFINE_SPINLOCK(free_entries_lock);
  76
  77/* Global disable flag - will be set in case of an error */
  78static bool global_disable __read_mostly;
  79
  80/* Global error count */
  81static u32 error_count;
  82
  83/* Global error show enable*/
  84static u32 show_all_errors __read_mostly;
  85/* Number of errors to show */
  86static u32 show_num_errors = 1;
  87
  88static u32 num_free_entries;
  89static u32 min_free_entries;
  90static u32 nr_total_entries;
  91
  92/* number of preallocated entries requested by kernel cmdline */
  93static u32 req_entries;
  94
  95/* debugfs dentry's for the stuff above */
  96static struct dentry *dma_debug_dent        __read_mostly;
  97static struct dentry *global_disable_dent   __read_mostly;
  98static struct dentry *error_count_dent      __read_mostly;
  99static struct dentry *show_all_errors_dent  __read_mostly;
 100static struct dentry *show_num_errors_dent  __read_mostly;
 101static struct dentry *num_free_entries_dent __read_mostly;
 102static struct dentry *min_free_entries_dent __read_mostly;
 103static struct dentry *filter_dent           __read_mostly;
 104
 105/* per-driver filter related state */
 106
 107#define NAME_MAX_LEN    64
 108
 109static char                  current_driver_name[NAME_MAX_LEN] __read_mostly;
 110static struct device_driver *current_driver                    __read_mostly;
 111
 112static DEFINE_RWLOCK(driver_name_lock);
 113
 114static const char *type2name[4] = { "single", "page",
 115                                    "scather-gather", "coherent" };
 116
 117static const char *dir2name[4] = { "DMA_BIDIRECTIONAL", "DMA_TO_DEVICE",
 118                                   "DMA_FROM_DEVICE", "DMA_NONE" };
 119
 120/* little merge helper - remove it after the merge window */
 121#ifndef BUS_NOTIFY_UNBOUND_DRIVER
 122#define BUS_NOTIFY_UNBOUND_DRIVER 0x0005
 123#endif
 124
 125/*
 126 * The access to some variables in this macro is racy. We can't use atomic_t
 127 * here because all these variables are exported to debugfs. Some of them even
 128 * writeable. This is also the reason why a lock won't help much. But anyway,
 129 * the races are no big deal. Here is why:
 130 *
 131 *   error_count: the addition is racy, but the worst thing that can happen is
 132 *                that we don't count some errors
 133 *   show_num_errors: the subtraction is racy. Also no big deal because in
 134 *                    worst case this will result in one warning more in the
 135 *                    system log than the user configured. This variable is
 136 *                    writeable via debugfs.
 137 */
 138static inline void dump_entry_trace(struct dma_debug_entry *entry)
 139{
 140#ifdef CONFIG_STACKTRACE
 141        if (entry) {
 142                pr_warning("Mapped at:\n");
 143                print_stack_trace(&entry->stacktrace, 0);
 144        }
 145#endif
 146}
 147
 148static bool driver_filter(struct device *dev)
 149{
 150        struct device_driver *drv;
 151        unsigned long flags;
 152        bool ret;
 153
 154        /* driver filter off */
 155        if (likely(!current_driver_name[0]))
 156                return true;
 157
 158        /* driver filter on and initialized */
 159        if (current_driver && dev && dev->driver == current_driver)
 160                return true;
 161
 162        /* driver filter on, but we can't filter on a NULL device... */
 163        if (!dev)
 164                return false;
 165
 166        if (current_driver || !current_driver_name[0])
 167                return false;
 168
 169        /* driver filter on but not yet initialized */
 170        drv = get_driver(dev->driver);
 171        if (!drv)
 172                return false;
 173
 174        /* lock to protect against change of current_driver_name */
 175        read_lock_irqsave(&driver_name_lock, flags);
 176
 177        ret = false;
 178        if (drv->name &&
 179            strncmp(current_driver_name, drv->name, NAME_MAX_LEN - 1) == 0) {
 180                current_driver = drv;
 181                ret = true;
 182        }
 183
 184        read_unlock_irqrestore(&driver_name_lock, flags);
 185        put_driver(drv);
 186
 187        return ret;
 188}
 189
 190#define err_printk(dev, entry, format, arg...) do {                     \
 191                error_count += 1;                                       \
 192                if (driver_filter(dev) &&                               \
 193                    (show_all_errors || show_num_errors > 0)) {         \
 194                        WARN(1, "%s %s: " format,                       \
 195                             dev ? dev_driver_string(dev) : "NULL",     \
 196                             dev ? dev_name(dev) : "NULL", ## arg);     \
 197                        dump_entry_trace(entry);                        \
 198                }                                                       \
 199                if (!show_all_errors && show_num_errors > 0)            \
 200                        show_num_errors -= 1;                           \
 201        } while (0);
 202
 203/*
 204 * Hash related functions
 205 *
 206 * Every DMA-API request is saved into a struct dma_debug_entry. To
 207 * have quick access to these structs they are stored into a hash.
 208 */
 209static int hash_fn(struct dma_debug_entry *entry)
 210{
 211        /*
 212         * Hash function is based on the dma address.
 213         * We use bits 20-27 here as the index into the hash
 214         */
 215        return (entry->dev_addr >> HASH_FN_SHIFT) & HASH_FN_MASK;
 216}
 217
 218/*
 219 * Request exclusive access to a hash bucket for a given dma_debug_entry.
 220 */
 221static struct hash_bucket *get_hash_bucket(struct dma_debug_entry *entry,
 222                                           unsigned long *flags)
 223{
 224        int idx = hash_fn(entry);
 225        unsigned long __flags;
 226
 227        spin_lock_irqsave(&dma_entry_hash[idx].lock, __flags);
 228        *flags = __flags;
 229        return &dma_entry_hash[idx];
 230}
 231
 232/*
 233 * Give up exclusive access to the hash bucket
 234 */
 235static void put_hash_bucket(struct hash_bucket *bucket,
 236                            unsigned long *flags)
 237{
 238        unsigned long __flags = *flags;
 239
 240        spin_unlock_irqrestore(&bucket->lock, __flags);
 241}
 242
 243/*
 244 * Search a given entry in the hash bucket list
 245 */
 246static struct dma_debug_entry *hash_bucket_find(struct hash_bucket *bucket,
 247                                                struct dma_debug_entry *ref)
 248{
 249        struct dma_debug_entry *entry, *ret = NULL;
 250        int matches = 0, match_lvl, last_lvl = 0;
 251
 252        list_for_each_entry(entry, &bucket->list, list) {
 253                if ((entry->dev_addr != ref->dev_addr) ||
 254                    (entry->dev != ref->dev))
 255                        continue;
 256
 257                /*
 258                 * Some drivers map the same physical address multiple
 259                 * times. Without a hardware IOMMU this results in the
 260                 * same device addresses being put into the dma-debug
 261                 * hash multiple times too. This can result in false
 262                 * positives being reported. Therefore we implement a
 263                 * best-fit algorithm here which returns the entry from
 264                 * the hash which fits best to the reference value
 265                 * instead of the first-fit.
 266                 */
 267                matches += 1;
 268                match_lvl = 0;
 269                entry->size         == ref->size         ? ++match_lvl : 0;
 270                entry->type         == ref->type         ? ++match_lvl : 0;
 271                entry->direction    == ref->direction    ? ++match_lvl : 0;
 272                entry->sg_call_ents == ref->sg_call_ents ? ++match_lvl : 0;
 273
 274                if (match_lvl == 4) {
 275                        /* perfect-fit - return the result */
 276                        return entry;
 277                } else if (match_lvl > last_lvl) {
 278                        /*
 279                         * We found an entry that fits better then the
 280                         * previous one
 281                         */
 282                        last_lvl = match_lvl;
 283                        ret      = entry;
 284                }
 285        }
 286
 287        /*
 288         * If we have multiple matches but no perfect-fit, just return
 289         * NULL.
 290         */
 291        ret = (matches == 1) ? ret : NULL;
 292
 293        return ret;
 294}
 295
 296/*
 297 * Add an entry to a hash bucket
 298 */
 299static void hash_bucket_add(struct hash_bucket *bucket,
 300                            struct dma_debug_entry *entry)
 301{
 302        list_add_tail(&entry->list, &bucket->list);
 303}
 304
 305/*
 306 * Remove entry from a hash bucket list
 307 */
 308static void hash_bucket_del(struct dma_debug_entry *entry)
 309{
 310        list_del(&entry->list);
 311}
 312
 313/*
 314 * Dump mapping entries for debugging purposes
 315 */
 316void debug_dma_dump_mappings(struct device *dev)
 317{
 318        int idx;
 319
 320        for (idx = 0; idx < HASH_SIZE; idx++) {
 321                struct hash_bucket *bucket = &dma_entry_hash[idx];
 322                struct dma_debug_entry *entry;
 323                unsigned long flags;
 324
 325                spin_lock_irqsave(&bucket->lock, flags);
 326
 327                list_for_each_entry(entry, &bucket->list, list) {
 328                        if (!dev || dev == entry->dev) {
 329                                dev_info(entry->dev,
 330                                         "%s idx %d P=%Lx D=%Lx L=%Lx %s\n",
 331                                         type2name[entry->type], idx,
 332                                         (unsigned long long)entry->paddr,
 333                                         entry->dev_addr, entry->size,
 334                                         dir2name[entry->direction]);
 335                        }
 336                }
 337
 338                spin_unlock_irqrestore(&bucket->lock, flags);
 339        }
 340}
 341EXPORT_SYMBOL(debug_dma_dump_mappings);
 342
 343/*
 344 * Wrapper function for adding an entry to the hash.
 345 * This function takes care of locking itself.
 346 */
 347static void add_dma_entry(struct dma_debug_entry *entry)
 348{
 349        struct hash_bucket *bucket;
 350        unsigned long flags;
 351
 352        bucket = get_hash_bucket(entry, &flags);
 353        hash_bucket_add(bucket, entry);
 354        put_hash_bucket(bucket, &flags);
 355}
 356
 357static struct dma_debug_entry *__dma_entry_alloc(void)
 358{
 359        struct dma_debug_entry *entry;
 360
 361        entry = list_entry(free_entries.next, struct dma_debug_entry, list);
 362        list_del(&entry->list);
 363        memset(entry, 0, sizeof(*entry));
 364
 365        num_free_entries -= 1;
 366        if (num_free_entries < min_free_entries)
 367                min_free_entries = num_free_entries;
 368
 369        return entry;
 370}
 371
 372/* struct dma_entry allocator
 373 *
 374 * The next two functions implement the allocator for
 375 * struct dma_debug_entries.
 376 */
 377static struct dma_debug_entry *dma_entry_alloc(void)
 378{
 379        struct dma_debug_entry *entry = NULL;
 380        unsigned long flags;
 381
 382        spin_lock_irqsave(&free_entries_lock, flags);
 383
 384        if (list_empty(&free_entries)) {
 385                pr_err("DMA-API: debugging out of memory - disabling\n");
 386                global_disable = true;
 387                goto out;
 388        }
 389
 390        entry = __dma_entry_alloc();
 391
 392#ifdef CONFIG_STACKTRACE
 393        entry->stacktrace.max_entries = DMA_DEBUG_STACKTRACE_ENTRIES;
 394        entry->stacktrace.entries = entry->st_entries;
 395        entry->stacktrace.skip = 2;
 396        save_stack_trace(&entry->stacktrace);
 397#endif
 398
 399out:
 400        spin_unlock_irqrestore(&free_entries_lock, flags);
 401
 402        return entry;
 403}
 404
 405static void dma_entry_free(struct dma_debug_entry *entry)
 406{
 407        unsigned long flags;
 408
 409        /*
 410         * add to beginning of the list - this way the entries are
 411         * more likely cache hot when they are reallocated.
 412         */
 413        spin_lock_irqsave(&free_entries_lock, flags);
 414        list_add(&entry->list, &free_entries);
 415        num_free_entries += 1;
 416        spin_unlock_irqrestore(&free_entries_lock, flags);
 417}
 418
 419int dma_debug_resize_entries(u32 num_entries)
 420{
 421        int i, delta, ret = 0;
 422        unsigned long flags;
 423        struct dma_debug_entry *entry;
 424        LIST_HEAD(tmp);
 425
 426        spin_lock_irqsave(&free_entries_lock, flags);
 427
 428        if (nr_total_entries < num_entries) {
 429                delta = num_entries - nr_total_entries;
 430
 431                spin_unlock_irqrestore(&free_entries_lock, flags);
 432
 433                for (i = 0; i < delta; i++) {
 434                        entry = kzalloc(sizeof(*entry), GFP_KERNEL);
 435                        if (!entry)
 436                                break;
 437
 438                        list_add_tail(&entry->list, &tmp);
 439                }
 440
 441                spin_lock_irqsave(&free_entries_lock, flags);
 442
 443                list_splice(&tmp, &free_entries);
 444                nr_total_entries += i;
 445                num_free_entries += i;
 446        } else {
 447                delta = nr_total_entries - num_entries;
 448
 449                for (i = 0; i < delta && !list_empty(&free_entries); i++) {
 450                        entry = __dma_entry_alloc();
 451                        kfree(entry);
 452                }
 453
 454                nr_total_entries -= i;
 455        }
 456
 457        if (nr_total_entries != num_entries)
 458                ret = 1;
 459
 460        spin_unlock_irqrestore(&free_entries_lock, flags);
 461
 462        return ret;
 463}
 464EXPORT_SYMBOL(dma_debug_resize_entries);
 465
 466/*
 467 * DMA-API debugging init code
 468 *
 469 * The init code does two things:
 470 *   1. Initialize core data structures
 471 *   2. Preallocate a given number of dma_debug_entry structs
 472 */
 473
 474static int prealloc_memory(u32 num_entries)
 475{
 476        struct dma_debug_entry *entry, *next_entry;
 477        int i;
 478
 479        for (i = 0; i < num_entries; ++i) {
 480                entry = kzalloc(sizeof(*entry), GFP_KERNEL);
 481                if (!entry)
 482                        goto out_err;
 483
 484                list_add_tail(&entry->list, &free_entries);
 485        }
 486
 487        num_free_entries = num_entries;
 488        min_free_entries = num_entries;
 489
 490        pr_info("DMA-API: preallocated %d debug entries\n", num_entries);
 491
 492        return 0;
 493
 494out_err:
 495
 496        list_for_each_entry_safe(entry, next_entry, &free_entries, list) {
 497                list_del(&entry->list);
 498                kfree(entry);
 499        }
 500
 501        return -ENOMEM;
 502}
 503
 504static ssize_t filter_read(struct file *file, char __user *user_buf,
 505                           size_t count, loff_t *ppos)
 506{
 507        char buf[NAME_MAX_LEN + 1];
 508        unsigned long flags;
 509        int len;
 510
 511        if (!current_driver_name[0])
 512                return 0;
 513
 514        /*
 515         * We can't copy to userspace directly because current_driver_name can
 516         * only be read under the driver_name_lock with irqs disabled. So
 517         * create a temporary copy first.
 518         */
 519        read_lock_irqsave(&driver_name_lock, flags);
 520        len = scnprintf(buf, NAME_MAX_LEN + 1, "%s\n", current_driver_name);
 521        read_unlock_irqrestore(&driver_name_lock, flags);
 522
 523        return simple_read_from_buffer(user_buf, count, ppos, buf, len);
 524}
 525
 526static ssize_t filter_write(struct file *file, const char __user *userbuf,
 527                            size_t count, loff_t *ppos)
 528{
 529        char buf[NAME_MAX_LEN];
 530        unsigned long flags;
 531        size_t len;
 532        int i;
 533
 534        /*
 535         * We can't copy from userspace directly. Access to
 536         * current_driver_name is protected with a write_lock with irqs
 537         * disabled. Since copy_from_user can fault and may sleep we
 538         * need to copy to temporary buffer first
 539         */
 540        len = min(count, (size_t)(NAME_MAX_LEN - 1));
 541        if (copy_from_user(buf, userbuf, len))
 542                return -EFAULT;
 543
 544        buf[len] = 0;
 545
 546        write_lock_irqsave(&driver_name_lock, flags);
 547
 548        /*
 549         * Now handle the string we got from userspace very carefully.
 550         * The rules are:
 551         *         - only use the first token we got
 552         *         - token delimiter is everything looking like a space
 553         *           character (' ', '\n', '\t' ...)
 554         *
 555         */
 556        if (!isalnum(buf[0])) {
 557                /*
 558                 * If the first character userspace gave us is not
 559                 * alphanumerical then assume the filter should be
 560                 * switched off.
 561                 */
 562                if (current_driver_name[0])
 563                        pr_info("DMA-API: switching off dma-debug driver filter\n");
 564                current_driver_name[0] = 0;
 565                current_driver = NULL;
 566                goto out_unlock;
 567        }
 568
 569        /*
 570         * Now parse out the first token and use it as the name for the
 571         * driver to filter for.
 572         */
 573        for (i = 0; i < NAME_MAX_LEN - 1; ++i) {
 574                current_driver_name[i] = buf[i];
 575                if (isspace(buf[i]) || buf[i] == ' ' || buf[i] == 0)
 576                        break;
 577        }
 578        current_driver_name[i] = 0;
 579        current_driver = NULL;
 580
 581        pr_info("DMA-API: enable driver filter for driver [%s]\n",
 582                current_driver_name);
 583
 584out_unlock:
 585        write_unlock_irqrestore(&driver_name_lock, flags);
 586
 587        return count;
 588}
 589
 590static const struct file_operations filter_fops = {
 591        .read  = filter_read,
 592        .write = filter_write,
 593        .llseek = default_llseek,
 594};
 595
 596static int dma_debug_fs_init(void)
 597{
 598        dma_debug_dent = debugfs_create_dir("dma-api", NULL);
 599        if (!dma_debug_dent) {
 600                pr_err("DMA-API: can not create debugfs directory\n");
 601                return -ENOMEM;
 602        }
 603
 604        global_disable_dent = debugfs_create_bool("disabled", 0444,
 605                        dma_debug_dent,
 606                        (u32 *)&global_disable);
 607        if (!global_disable_dent)
 608                goto out_err;
 609
 610        error_count_dent = debugfs_create_u32("error_count", 0444,
 611                        dma_debug_dent, &error_count);
 612        if (!error_count_dent)
 613                goto out_err;
 614
 615        show_all_errors_dent = debugfs_create_u32("all_errors", 0644,
 616                        dma_debug_dent,
 617                        &show_all_errors);
 618        if (!show_all_errors_dent)
 619                goto out_err;
 620
 621        show_num_errors_dent = debugfs_create_u32("num_errors", 0644,
 622                        dma_debug_dent,
 623                        &show_num_errors);
 624        if (!show_num_errors_dent)
 625                goto out_err;
 626
 627        num_free_entries_dent = debugfs_create_u32("num_free_entries", 0444,
 628                        dma_debug_dent,
 629                        &num_free_entries);
 630        if (!num_free_entries_dent)
 631                goto out_err;
 632
 633        min_free_entries_dent = debugfs_create_u32("min_free_entries", 0444,
 634                        dma_debug_dent,
 635                        &min_free_entries);
 636        if (!min_free_entries_dent)
 637                goto out_err;
 638
 639        filter_dent = debugfs_create_file("driver_filter", 0644,
 640                                          dma_debug_dent, NULL, &filter_fops);
 641        if (!filter_dent)
 642                goto out_err;
 643
 644        return 0;
 645
 646out_err:
 647        debugfs_remove_recursive(dma_debug_dent);
 648
 649        return -ENOMEM;
 650}
 651
 652static int device_dma_allocations(struct device *dev)
 653{
 654        struct dma_debug_entry *entry;
 655        unsigned long flags;
 656        int count = 0, i;
 657
 658        local_irq_save(flags);
 659
 660        for (i = 0; i < HASH_SIZE; ++i) {
 661                spin_lock(&dma_entry_hash[i].lock);
 662                list_for_each_entry(entry, &dma_entry_hash[i].list, list) {
 663                        if (entry->dev == dev)
 664                                count += 1;
 665                }
 666                spin_unlock(&dma_entry_hash[i].lock);
 667        }
 668
 669        local_irq_restore(flags);
 670
 671        return count;
 672}
 673
 674static int dma_debug_device_change(struct notifier_block *nb, unsigned long action, void *data)
 675{
 676        struct device *dev = data;
 677        int count;
 678
 679        if (global_disable)
 680                return 0;
 681
 682        switch (action) {
 683        case BUS_NOTIFY_UNBOUND_DRIVER:
 684                count = device_dma_allocations(dev);
 685                if (count == 0)
 686                        break;
 687                err_printk(dev, NULL, "DMA-API: device driver has pending "
 688                                "DMA allocations while released from device "
 689                                "[count=%d]\n", count);
 690                break;
 691        default:
 692                break;
 693        }
 694
 695        return 0;
 696}
 697
 698void dma_debug_add_bus(struct bus_type *bus)
 699{
 700        struct notifier_block *nb;
 701
 702        if (global_disable)
 703                return;
 704
 705        nb = kzalloc(sizeof(struct notifier_block), GFP_KERNEL);
 706        if (nb == NULL) {
 707                pr_err("dma_debug_add_bus: out of memory\n");
 708                return;
 709        }
 710
 711        nb->notifier_call = dma_debug_device_change;
 712
 713        bus_register_notifier(bus, nb);
 714}
 715
 716/*
 717 * Let the architectures decide how many entries should be preallocated.
 718 */
 719void dma_debug_init(u32 num_entries)
 720{
 721        int i;
 722
 723        if (global_disable)
 724                return;
 725
 726        for (i = 0; i < HASH_SIZE; ++i) {
 727                INIT_LIST_HEAD(&dma_entry_hash[i].list);
 728                spin_lock_init(&dma_entry_hash[i].lock);
 729        }
 730
 731        if (dma_debug_fs_init() != 0) {
 732                pr_err("DMA-API: error creating debugfs entries - disabling\n");
 733                global_disable = true;
 734
 735                return;
 736        }
 737
 738        if (req_entries)
 739                num_entries = req_entries;
 740
 741        if (prealloc_memory(num_entries) != 0) {
 742                pr_err("DMA-API: debugging out of memory error - disabled\n");
 743                global_disable = true;
 744
 745                return;
 746        }
 747
 748        nr_total_entries = num_free_entries;
 749
 750        pr_info("DMA-API: debugging enabled by kernel config\n");
 751}
 752
 753static __init int dma_debug_cmdline(char *str)
 754{
 755        if (!str)
 756                return -EINVAL;
 757
 758        if (strncmp(str, "off", 3) == 0) {
 759                pr_info("DMA-API: debugging disabled on kernel command line\n");
 760                global_disable = true;
 761        }
 762
 763        return 0;
 764}
 765
 766static __init int dma_debug_entries_cmdline(char *str)
 767{
 768        int res;
 769
 770        if (!str)
 771                return -EINVAL;
 772
 773        res = get_option(&str, &req_entries);
 774
 775        if (!res)
 776                req_entries = 0;
 777
 778        return 0;
 779}
 780
 781__setup("dma_debug=", dma_debug_cmdline);
 782__setup("dma_debug_entries=", dma_debug_entries_cmdline);
 783
 784static void check_unmap(struct dma_debug_entry *ref)
 785{
 786        struct dma_debug_entry *entry;
 787        struct hash_bucket *bucket;
 788        unsigned long flags;
 789
 790        if (dma_mapping_error(ref->dev, ref->dev_addr)) {
 791                err_printk(ref->dev, NULL, "DMA-API: device driver tries "
 792                           "to free an invalid DMA memory address\n");
 793                return;
 794        }
 795
 796        bucket = get_hash_bucket(ref, &flags);
 797        entry = hash_bucket_find(bucket, ref);
 798
 799        if (!entry) {
 800                err_printk(ref->dev, NULL, "DMA-API: device driver tries "
 801                           "to free DMA memory it has not allocated "
 802                           "[device address=0x%016llx] [size=%llu bytes]\n",
 803                           ref->dev_addr, ref->size);
 804                goto out;
 805        }
 806
 807        if (ref->size != entry->size) {
 808                err_printk(ref->dev, entry, "DMA-API: device driver frees "
 809                           "DMA memory with different size "
 810                           "[device address=0x%016llx] [map size=%llu bytes] "
 811                           "[unmap size=%llu bytes]\n",
 812                           ref->dev_addr, entry->size, ref->size);
 813        }
 814
 815        if (ref->type != entry->type) {
 816                err_printk(ref->dev, entry, "DMA-API: device driver frees "
 817                           "DMA memory with wrong function "
 818                           "[device address=0x%016llx] [size=%llu bytes] "
 819                           "[mapped as %s] [unmapped as %s]\n",
 820                           ref->dev_addr, ref->size,
 821                           type2name[entry->type], type2name[ref->type]);
 822        } else if ((entry->type == dma_debug_coherent) &&
 823                   (ref->paddr != entry->paddr)) {
 824                err_printk(ref->dev, entry, "DMA-API: device driver frees "
 825                           "DMA memory with different CPU address "
 826                           "[device address=0x%016llx] [size=%llu bytes] "
 827                           "[cpu alloc address=0x%016llx] "
 828                           "[cpu free address=0x%016llx]",
 829                           ref->dev_addr, ref->size,
 830                           (unsigned long long)entry->paddr,
 831                           (unsigned long long)ref->paddr);
 832        }
 833
 834        if (ref->sg_call_ents && ref->type == dma_debug_sg &&
 835            ref->sg_call_ents != entry->sg_call_ents) {
 836                err_printk(ref->dev, entry, "DMA-API: device driver frees "
 837                           "DMA sg list with different entry count "
 838                           "[map count=%d] [unmap count=%d]\n",
 839                           entry->sg_call_ents, ref->sg_call_ents);
 840        }
 841
 842        /*
 843         * This may be no bug in reality - but most implementations of the
 844         * DMA API don't handle this properly, so check for it here
 845         */
 846        if (ref->direction != entry->direction) {
 847                err_printk(ref->dev, entry, "DMA-API: device driver frees "
 848                           "DMA memory with different direction "
 849                           "[device address=0x%016llx] [size=%llu bytes] "
 850                           "[mapped with %s] [unmapped with %s]\n",
 851                           ref->dev_addr, ref->size,
 852                           dir2name[entry->direction],
 853                           dir2name[ref->direction]);
 854        }
 855
 856        hash_bucket_del(entry);
 857        dma_entry_free(entry);
 858
 859out:
 860        put_hash_bucket(bucket, &flags);
 861}
 862
 863static void check_for_stack(struct device *dev, void *addr)
 864{
 865        if (object_is_on_stack(addr))
 866                err_printk(dev, NULL, "DMA-API: device driver maps memory from"
 867                                "stack [addr=%p]\n", addr);
 868}
 869
 870static inline bool overlap(void *addr, unsigned long len, void *start, void *end)
 871{
 872        unsigned long a1 = (unsigned long)addr;
 873        unsigned long b1 = a1 + len;
 874        unsigned long a2 = (unsigned long)start;
 875        unsigned long b2 = (unsigned long)end;
 876
 877        return !(b1 <= a2 || a1 >= b2);
 878}
 879
 880static void check_for_illegal_area(struct device *dev, void *addr, unsigned long len)
 881{
 882        if (overlap(addr, len, _text, _etext) ||
 883            overlap(addr, len, __start_rodata, __end_rodata))
 884                err_printk(dev, NULL, "DMA-API: device driver maps memory from kernel text or rodata [addr=%p] [len=%lu]\n", addr, len);
 885}
 886
 887static void check_sync(struct device *dev,
 888                       struct dma_debug_entry *ref,
 889                       bool to_cpu)
 890{
 891        struct dma_debug_entry *entry;
 892        struct hash_bucket *bucket;
 893        unsigned long flags;
 894
 895        bucket = get_hash_bucket(ref, &flags);
 896
 897        entry = hash_bucket_find(bucket, ref);
 898
 899        if (!entry) {
 900                err_printk(dev, NULL, "DMA-API: device driver tries "
 901                                "to sync DMA memory it has not allocated "
 902                                "[device address=0x%016llx] [size=%llu bytes]\n",
 903                                (unsigned long long)ref->dev_addr, ref->size);
 904                goto out;
 905        }
 906
 907        if (ref->size > entry->size) {
 908                err_printk(dev, entry, "DMA-API: device driver syncs"
 909                                " DMA memory outside allocated range "
 910                                "[device address=0x%016llx] "
 911                                "[allocation size=%llu bytes] "
 912                                "[sync offset+size=%llu]\n",
 913                                entry->dev_addr, entry->size,
 914                                ref->size);
 915        }
 916
 917        if (entry->direction == DMA_BIDIRECTIONAL)
 918                goto out;
 919
 920        if (ref->direction != entry->direction) {
 921                err_printk(dev, entry, "DMA-API: device driver syncs "
 922                                "DMA memory with different direction "
 923                                "[device address=0x%016llx] [size=%llu bytes] "
 924                                "[mapped with %s] [synced with %s]\n",
 925                                (unsigned long long)ref->dev_addr, entry->size,
 926                                dir2name[entry->direction],
 927                                dir2name[ref->direction]);
 928        }
 929
 930        if (to_cpu && !(entry->direction == DMA_FROM_DEVICE) &&
 931                      !(ref->direction == DMA_TO_DEVICE))
 932                err_printk(dev, entry, "DMA-API: device driver syncs "
 933                                "device read-only DMA memory for cpu "
 934                                "[device address=0x%016llx] [size=%llu bytes] "
 935                                "[mapped with %s] [synced with %s]\n",
 936                                (unsigned long long)ref->dev_addr, entry->size,
 937                                dir2name[entry->direction],
 938                                dir2name[ref->direction]);
 939
 940        if (!to_cpu && !(entry->direction == DMA_TO_DEVICE) &&
 941                       !(ref->direction == DMA_FROM_DEVICE))
 942                err_printk(dev, entry, "DMA-API: device driver syncs "
 943                                "device write-only DMA memory to device "
 944                                "[device address=0x%016llx] [size=%llu bytes] "
 945                                "[mapped with %s] [synced with %s]\n",
 946                                (unsigned long long)ref->dev_addr, entry->size,
 947                                dir2name[entry->direction],
 948                                dir2name[ref->direction]);
 949
 950out:
 951        put_hash_bucket(bucket, &flags);
 952}
 953
 954void debug_dma_map_page(struct device *dev, struct page *page, size_t offset,
 955                        size_t size, int direction, dma_addr_t dma_addr,
 956                        bool map_single)
 957{
 958        struct dma_debug_entry *entry;
 959
 960        if (unlikely(global_disable))
 961                return;
 962
 963        if (unlikely(dma_mapping_error(dev, dma_addr)))
 964                return;
 965
 966        entry = dma_entry_alloc();
 967        if (!entry)
 968                return;
 969
 970        entry->dev       = dev;
 971        entry->type      = dma_debug_page;
 972        entry->paddr     = page_to_phys(page) + offset;
 973        entry->dev_addr  = dma_addr;
 974        entry->size      = size;
 975        entry->direction = direction;
 976
 977        if (map_single)
 978                entry->type = dma_debug_single;
 979
 980        if (!PageHighMem(page)) {
 981                void *addr = page_address(page) + offset;
 982
 983                check_for_stack(dev, addr);
 984                check_for_illegal_area(dev, addr, size);
 985        }
 986
 987        add_dma_entry(entry);
 988}
 989EXPORT_SYMBOL(debug_dma_map_page);
 990
 991void debug_dma_unmap_page(struct device *dev, dma_addr_t addr,
 992                          size_t size, int direction, bool map_single)
 993{
 994        struct dma_debug_entry ref = {
 995                .type           = dma_debug_page,
 996                .dev            = dev,
 997                .dev_addr       = addr,
 998                .size           = size,
 999                .direction      = direction,
1000        };
1001
1002        if (unlikely(global_disable))
1003                return;
1004
1005        if (map_single)
1006                ref.type = dma_debug_single;
1007
1008        check_unmap(&ref);
1009}
1010EXPORT_SYMBOL(debug_dma_unmap_page);
1011
1012void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
1013                      int nents, int mapped_ents, int direction)
1014{
1015        struct dma_debug_entry *entry;
1016        struct scatterlist *s;
1017        int i;
1018
1019        if (unlikely(global_disable))
1020                return;
1021
1022        for_each_sg(sg, s, mapped_ents, i) {
1023                entry = dma_entry_alloc();
1024                if (!entry)
1025                        return;
1026
1027                entry->type           = dma_debug_sg;
1028                entry->dev            = dev;
1029                entry->paddr          = sg_phys(s);
1030                entry->size           = sg_dma_len(s);
1031                entry->dev_addr       = sg_dma_address(s);
1032                entry->direction      = direction;
1033                entry->sg_call_ents   = nents;
1034                entry->sg_mapped_ents = mapped_ents;
1035
1036                if (!PageHighMem(sg_page(s))) {
1037                        check_for_stack(dev, sg_virt(s));
1038                        check_for_illegal_area(dev, sg_virt(s), sg_dma_len(s));
1039                }
1040
1041                add_dma_entry(entry);
1042        }
1043}
1044EXPORT_SYMBOL(debug_dma_map_sg);
1045
1046static int get_nr_mapped_entries(struct device *dev,
1047                                 struct dma_debug_entry *ref)
1048{
1049        struct dma_debug_entry *entry;
1050        struct hash_bucket *bucket;
1051        unsigned long flags;
1052        int mapped_ents;
1053
1054        bucket       = get_hash_bucket(ref, &flags);
1055        entry        = hash_bucket_find(bucket, ref);
1056        mapped_ents  = 0;
1057
1058        if (entry)
1059                mapped_ents = entry->sg_mapped_ents;
1060        put_hash_bucket(bucket, &flags);
1061
1062        return mapped_ents;
1063}
1064
1065void debug_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
1066                        int nelems, int dir)
1067{
1068        struct scatterlist *s;
1069        int mapped_ents = 0, i;
1070
1071        if (unlikely(global_disable))
1072                return;
1073
1074        for_each_sg(sglist, s, nelems, i) {
1075
1076                struct dma_debug_entry ref = {
1077                        .type           = dma_debug_sg,
1078                        .dev            = dev,
1079                        .paddr          = sg_phys(s),
1080                        .dev_addr       = sg_dma_address(s),
1081                        .size           = sg_dma_len(s),
1082                        .direction      = dir,
1083                        .sg_call_ents   = nelems,
1084                };
1085
1086                if (mapped_ents && i >= mapped_ents)
1087                        break;
1088
1089                if (!i)
1090                        mapped_ents = get_nr_mapped_entries(dev, &ref);
1091
1092                check_unmap(&ref);
1093        }
1094}
1095EXPORT_SYMBOL(debug_dma_unmap_sg);
1096
1097void debug_dma_alloc_coherent(struct device *dev, size_t size,
1098                              dma_addr_t dma_addr, void *virt)
1099{
1100        struct dma_debug_entry *entry;
1101
1102        if (unlikely(global_disable))
1103                return;
1104
1105        if (unlikely(virt == NULL))
1106                return;
1107
1108        entry = dma_entry_alloc();
1109        if (!entry)
1110                return;
1111
1112        entry->type      = dma_debug_coherent;
1113        entry->dev       = dev;
1114        entry->paddr     = virt_to_phys(virt);
1115        entry->size      = size;
1116        entry->dev_addr  = dma_addr;
1117        entry->direction = DMA_BIDIRECTIONAL;
1118
1119        add_dma_entry(entry);
1120}
1121EXPORT_SYMBOL(debug_dma_alloc_coherent);
1122
1123void debug_dma_free_coherent(struct device *dev, size_t size,
1124                         void *virt, dma_addr_t addr)
1125{
1126        struct dma_debug_entry ref = {
1127                .type           = dma_debug_coherent,
1128                .dev            = dev,
1129                .paddr          = virt_to_phys(virt),
1130                .dev_addr       = addr,
1131                .size           = size,
1132                .direction      = DMA_BIDIRECTIONAL,
1133        };
1134
1135        if (unlikely(global_disable))
1136                return;
1137
1138        check_unmap(&ref);
1139}
1140EXPORT_SYMBOL(debug_dma_free_coherent);
1141
1142void debug_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
1143                                   size_t size, int direction)
1144{
1145        struct dma_debug_entry ref;
1146
1147        if (unlikely(global_disable))
1148                return;
1149
1150        ref.type         = dma_debug_single;
1151        ref.dev          = dev;
1152        ref.dev_addr     = dma_handle;
1153        ref.size         = size;
1154        ref.direction    = direction;
1155        ref.sg_call_ents = 0;
1156
1157        check_sync(dev, &ref, true);
1158}
1159EXPORT_SYMBOL(debug_dma_sync_single_for_cpu);
1160
1161void debug_dma_sync_single_for_device(struct device *dev,
1162                                      dma_addr_t dma_handle, size_t size,
1163                                      int direction)
1164{
1165        struct dma_debug_entry ref;
1166
1167        if (unlikely(global_disable))
1168                return;
1169
1170        ref.type         = dma_debug_single;
1171        ref.dev          = dev;
1172        ref.dev_addr     = dma_handle;
1173        ref.size         = size;
1174        ref.direction    = direction;
1175        ref.sg_call_ents = 0;
1176
1177        check_sync(dev, &ref, false);
1178}
1179EXPORT_SYMBOL(debug_dma_sync_single_for_device);
1180
1181void debug_dma_sync_single_range_for_cpu(struct device *dev,
1182                                         dma_addr_t dma_handle,
1183                                         unsigned long offset, size_t size,
1184                                         int direction)
1185{
1186        struct dma_debug_entry ref;
1187
1188        if (unlikely(global_disable))
1189                return;
1190
1191        ref.type         = dma_debug_single;
1192        ref.dev          = dev;
1193        ref.dev_addr     = dma_handle;
1194        ref.size         = offset + size;
1195        ref.direction    = direction;
1196        ref.sg_call_ents = 0;
1197
1198        check_sync(dev, &ref, true);
1199}
1200EXPORT_SYMBOL(debug_dma_sync_single_range_for_cpu);
1201
1202void debug_dma_sync_single_range_for_device(struct device *dev,
1203                                            dma_addr_t dma_handle,
1204                                            unsigned long offset,
1205                                            size_t size, int direction)
1206{
1207        struct dma_debug_entry ref;
1208
1209        if (unlikely(global_disable))
1210                return;
1211
1212        ref.type         = dma_debug_single;
1213        ref.dev          = dev;
1214        ref.dev_addr     = dma_handle;
1215        ref.size         = offset + size;
1216        ref.direction    = direction;
1217        ref.sg_call_ents = 0;
1218
1219        check_sync(dev, &ref, false);
1220}
1221EXPORT_SYMBOL(debug_dma_sync_single_range_for_device);
1222
1223void debug_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
1224                               int nelems, int direction)
1225{
1226        struct scatterlist *s;
1227        int mapped_ents = 0, i;
1228
1229        if (unlikely(global_disable))
1230                return;
1231
1232        for_each_sg(sg, s, nelems, i) {
1233
1234                struct dma_debug_entry ref = {
1235                        .type           = dma_debug_sg,
1236                        .dev            = dev,
1237                        .paddr          = sg_phys(s),
1238                        .dev_addr       = sg_dma_address(s),
1239                        .size           = sg_dma_len(s),
1240                        .direction      = direction,
1241                        .sg_call_ents   = nelems,
1242                };
1243
1244                if (!i)
1245                        mapped_ents = get_nr_mapped_entries(dev, &ref);
1246
1247                if (i >= mapped_ents)
1248                        break;
1249
1250                check_sync(dev, &ref, true);
1251        }
1252}
1253EXPORT_SYMBOL(debug_dma_sync_sg_for_cpu);
1254
1255void debug_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
1256                                  int nelems, int direction)
1257{
1258        struct scatterlist *s;
1259        int mapped_ents = 0, i;
1260
1261        if (unlikely(global_disable))
1262                return;
1263
1264        for_each_sg(sg, s, nelems, i) {
1265
1266                struct dma_debug_entry ref = {
1267                        .type           = dma_debug_sg,
1268                        .dev            = dev,
1269                        .paddr          = sg_phys(s),
1270                        .dev_addr       = sg_dma_address(s),
1271                        .size           = sg_dma_len(s),
1272                        .direction      = direction,
1273                        .sg_call_ents   = nelems,
1274                };
1275                if (!i)
1276                        mapped_ents = get_nr_mapped_entries(dev, &ref);
1277
1278                if (i >= mapped_ents)
1279                        break;
1280
1281                check_sync(dev, &ref, false);
1282        }
1283}
1284EXPORT_SYMBOL(debug_dma_sync_sg_for_device);
1285
1286static int __init dma_debug_driver_setup(char *str)
1287{
1288        int i;
1289
1290        for (i = 0; i < NAME_MAX_LEN - 1; ++i, ++str) {
1291                current_driver_name[i] = *str;
1292                if (*str == 0)
1293                        break;
1294        }
1295
1296        if (current_driver_name[0])
1297                pr_info("DMA-API: enable driver filter for driver [%s]\n",
1298                        current_driver_name);
1299
1300
1301        return 1;
1302}
1303__setup("dma_debug_driver=", dma_debug_driver_setup);
1304