Skip to content

Commit

Permalink
dma-debug: Make leak-like behaviour apparent
Browse files Browse the repository at this point in the history
Now that we can dynamically allocate DMA debug entries to cope with
drivers maintaining excessively large numbers of live mappings, a driver
which *does* actually have a bug leaking mappings (and is not unloaded)
will no longer trigger the "DMA-API: debugging out of memory - disabling"
message until it gets to actual kernel OOM conditions, which means it
could go unnoticed for a while. To that end, let's inform the user each
time the pool has grown to a multiple of its initial size, which should
make it apparent that they either have a leak or might want to increase
the preallocation size.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Tested-by: Qian Cai <cai@lca.pw>
Signed-off-by: Christoph Hellwig <hch@lst.de>
  • Loading branch information
Robin Murphy authored and Christoph Hellwig committed Dec 11, 2018
1 parent 2b9d9ac commit ceb5117
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
6 changes: 5 additions & 1 deletion Documentation/DMA-API.txt
Original file line number Diff line number Diff line change
Expand Up @@ -747,7 +747,11 @@ driver afterwards. This filter can be disabled or changed later using debugfs.
When the code disables itself at runtime this is most likely because it ran
out of dma_debug_entries and was unable to allocate more on-demand. 65536
entries are preallocated at boot - if this is too low for you boot with
'dma_debug_entries=<your_desired_number>' to overwrite the default.
'dma_debug_entries=<your_desired_number>' to overwrite the default. The
code will print to the kernel log each time it has dynamically allocated
as many entries as were initially preallocated. This is to indicate that a
larger preallocation size may be appropriate, or if it happens continually
that a driver may be leaking mappings.

::

Expand Down
13 changes: 13 additions & 0 deletions kernel/dma/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,18 @@ static struct dma_debug_entry *__dma_entry_alloc(void)
return entry;
}

void __dma_entry_alloc_check_leak(void)
{
u32 tmp = nr_total_entries % nr_prealloc_entries;

/* Shout each time we tick over some multiple of the initial pool */
if (tmp < DMA_DEBUG_DYNAMIC_ENTRIES) {
pr_info("dma_debug_entry pool grown to %u (%u00%%)\n",
nr_total_entries,
(nr_total_entries / nr_prealloc_entries));
}
}

/* struct dma_entry allocator
*
* The next two functions implement the allocator for
Expand All @@ -710,6 +722,7 @@ static struct dma_debug_entry *dma_entry_alloc(void)
pr_err("debugging out of memory - disabling\n");
return NULL;
}
__dma_entry_alloc_check_leak();
}

entry = __dma_entry_alloc();
Expand Down

0 comments on commit ceb5117

Please sign in to comment.