Commit ac26c18bd35d982d1ba06020a992b1085fefc3e2

Authored by David Woodhouse
Committed by Joerg Roedel
1 parent a31fba5d68

dma-debug: add function to dump dma mappings

This adds a function to dump the DMA mappings that the debugging code is
aware of -- either for a single device, or for _all_ devices.

This can be useful for debugging -- sticking a call to it in the DMA
page fault handler, for example, to see if the faulting address _should_
be mapped or not, and hence work out whether it's IOMMU bugs we're
seeing, or driver bugs.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>

Showing 2 changed files with 36 additions and 0 deletions Side-by-side Diff

include/linux/dma-debug.h
... ... @@ -76,6 +76,8 @@
76 76 struct scatterlist *sg,
77 77 int nelems, int direction);
78 78  
  79 +extern void debug_dma_dump_mappings(struct device *dev);
  80 +
79 81 #else /* CONFIG_DMA_API_DEBUG */
80 82  
81 83 static inline void dma_debug_init(u32 num_entries)
... ... @@ -153,6 +155,10 @@
153 155 static inline void debug_dma_sync_sg_for_device(struct device *dev,
154 156 struct scatterlist *sg,
155 157 int nelems, int direction)
  158 +{
  159 +}
  160 +
  161 +static inline void debug_dma_dump_mappings(struct device *dev)
156 162 {
157 163 }
158 164  
... ... @@ -194,6 +194,36 @@
194 194 }
195 195  
196 196 /*
  197 + * Dump mapping entries for debugging purposes
  198 + */
  199 +void debug_dma_dump_mappings(struct device *dev)
  200 +{
  201 + int idx;
  202 +
  203 + for (idx = 0; idx < HASH_SIZE; idx++) {
  204 + struct hash_bucket *bucket = &dma_entry_hash[idx];
  205 + struct dma_debug_entry *entry;
  206 + unsigned long flags;
  207 +
  208 + spin_lock_irqsave(&bucket->lock, flags);
  209 +
  210 + list_for_each_entry(entry, &bucket->list, list) {
  211 + if (!dev || dev == entry->dev) {
  212 + dev_info(entry->dev,
  213 + "%s idx %d P=%Lx D=%Lx L=%Lx %s\n",
  214 + type2name[entry->type], idx,
  215 + (unsigned long long)entry->paddr,
  216 + entry->dev_addr, entry->size,
  217 + dir2name[entry->direction]);
  218 + }
  219 + }
  220 +
  221 + spin_unlock_irqrestore(&bucket->lock, flags);
  222 + }
  223 +}
  224 +EXPORT_SYMBOL(debug_dma_dump_mappings);
  225 +
  226 +/*
197 227 * Wrapper function for adding an entry to the hash.
198 228 * This function takes care of locking itself.
199 229 */