lkml.org 
[lkml]   [2023]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 2/3] dma-debug: add cacheline to user/kernel space dump messages
    Date
    Having the cacheline also printed on the debug_dma_dump_mappings() and
    dump_show() is useful for debugging. Furthermore, this also standardizes
    the messages shown on both dump functions.

    Signed-off-by: Desnes Nunes <desnesn@redhat.com>
    ---
    kernel/dma/debug.c | 122 ++++++++++++++++++++++++---------------------
    1 file changed, 64 insertions(+), 58 deletions(-)

    diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c
    index e0ad8db1ec25..19cc59829ffd 100644
    --- a/kernel/dma/debug.c
    +++ b/kernel/dma/debug.c
    @@ -396,37 +396,6 @@ static unsigned long long phys_addr(struct dma_debug_entry *entry)
    return page_to_phys(pfn_to_page(entry->pfn)) + entry->offset;
    }

    -/*
    - * Dump mapping entries for debugging purposes
    - */
    -void debug_dma_dump_mappings(struct device *dev)
    -{
    - int idx;
    -
    - for (idx = 0; idx < HASH_SIZE; idx++) {
    - struct hash_bucket *bucket = &dma_entry_hash[idx];
    - struct dma_debug_entry *entry;
    - unsigned long flags;
    -
    - spin_lock_irqsave(&bucket->lock, flags);
    -
    - list_for_each_entry(entry, &bucket->list, list) {
    - if (!dev || dev == entry->dev) {
    - dev_info(entry->dev,
    - "%s idx %d P=%Lx N=%lx D=%Lx L=%Lx %s %s\n",
    - type2name[entry->type], idx,
    - phys_addr(entry), entry->pfn,
    - entry->dev_addr, entry->size,
    - dir2name[entry->direction],
    - maperr2str[entry->map_err_type]);
    - }
    - }
    -
    - spin_unlock_irqrestore(&bucket->lock, flags);
    - cond_resched();
    - }
    -}
    -
    /*
    * For each mapping (initial cacheline in the case of
    * dma_alloc_coherent/dma_map_page, initial cacheline in each page of a
    @@ -547,6 +516,70 @@ static void active_cacheline_remove(struct dma_debug_entry *entry)
    spin_unlock_irqrestore(&radix_lock, flags);
    }

    +/*
    + * Dump mappings entries on kernel space for debugging purposes
    + */
    +void debug_dma_dump_mappings(struct device *dev)
    +{
    + int idx;
    + phys_addr_t cln;
    +
    + for (idx = 0; idx < HASH_SIZE; idx++) {
    + struct hash_bucket *bucket = &dma_entry_hash[idx];
    + struct dma_debug_entry *entry;
    + unsigned long flags;
    +
    + spin_lock_irqsave(&bucket->lock, flags);
    + list_for_each_entry(entry, &bucket->list, list) {
    + if (!dev || dev == entry->dev) {
    + cln = to_cacheline_number(entry);
    + dev_info(entry->dev,
    + "%s idx %d P=%llx N=%lx D=%llx L=%llx cln=%llx %s %s\n",
    + type2name[entry->type], idx,
    + phys_addr(entry), entry->pfn,
    + entry->dev_addr, entry->size,
    + cln, dir2name[entry->direction],
    + maperr2str[entry->map_err_type]);
    + }
    + }
    + spin_unlock_irqrestore(&bucket->lock, flags);
    +
    + cond_resched();
    + }
    +}
    +
    +/*
    + * Dump mappings entries on user space via debugfs
    + */
    +static int dump_show(struct seq_file *seq, void *v)
    +{
    + int idx;
    + phys_addr_t cln;
    +
    + for (idx = 0; idx < HASH_SIZE; idx++) {
    + struct hash_bucket *bucket = &dma_entry_hash[idx];
    + struct dma_debug_entry *entry;
    + unsigned long flags;
    +
    + spin_lock_irqsave(&bucket->lock, flags);
    + list_for_each_entry(entry, &bucket->list, list) {
    + cln = to_cacheline_number(entry);
    + seq_printf(seq,
    + "%s %s %s idx %d P=%llx N=%lx D=%llx L=%llx cln=%llx %s %s\n",
    + dev_driver_string(entry->dev),
    + dev_name(entry->dev),
    + type2name[entry->type], idx,
    + phys_addr(entry), entry->pfn,
    + entry->dev_addr, entry->size,
    + cln, dir2name[entry->direction],
    + maperr2str[entry->map_err_type]);
    + }
    + spin_unlock_irqrestore(&bucket->lock, flags);
    + }
    + return 0;
    +}
    +DEFINE_SHOW_ATTRIBUTE(dump);
    +
    /*
    * Wrapper function for adding an entry to the hash.
    * This function takes care of locking itself.
    @@ -765,33 +798,6 @@ static const struct file_operations filter_fops = {
    .llseek = default_llseek,
    };

    -static int dump_show(struct seq_file *seq, void *v)
    -{
    - int idx;
    -
    - for (idx = 0; idx < HASH_SIZE; idx++) {
    - struct hash_bucket *bucket = &dma_entry_hash[idx];
    - struct dma_debug_entry *entry;
    - unsigned long flags;
    -
    - spin_lock_irqsave(&bucket->lock, flags);
    - list_for_each_entry(entry, &bucket->list, list) {
    - seq_printf(seq,
    - "%s %s %s idx %d P=%llx N=%lx D=%llx L=%llx %s %s\n",
    - dev_name(entry->dev),
    - dev_driver_string(entry->dev),
    - type2name[entry->type], idx,
    - phys_addr(entry), entry->pfn,
    - entry->dev_addr, entry->size,
    - dir2name[entry->direction],
    - maperr2str[entry->map_err_type]);
    - }
    - spin_unlock_irqrestore(&bucket->lock, flags);
    - }
    - return 0;
    -}
    -DEFINE_SHOW_ATTRIBUTE(dump);
    -
    static int __init dma_debug_fs_init(void)
    {
    struct dentry *dentry = debugfs_create_dir("dma-api", NULL);
    --
    2.39.1
    \
     
     \ /
      Last update: 2023-03-27 01:04    [W:3.842 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site