dma-debug: add cacheline to user/kernel space dump messages
authorDesnes Nunes <desnesn@redhat.com>
Thu, 16 Mar 2023 14:09:11 +0000 (11:09 -0300)
committerChristoph Hellwig <hch@lst.de>
Tue, 28 Mar 2023 01:34:05 +0000 (10:34 +0900)
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>
Signed-off-by: Christoph Hellwig <hch@lst.de>
kernel/dma/debug.c

index 9aa5100..6761420 100644 (file)
@@ -397,37 +397,6 @@ static unsigned long long phys_addr(struct dma_debug_entry *entry)
 }
 
 /*
- * 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
  * scatterlist, or the cacheline specified in dma_map_single) insert
@@ -548,6 +517,70 @@ static void active_cacheline_remove(struct dma_debug_entry *entry)
 }
 
 /*
+ * 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);