Messages in this thread | | | Date | Thu, 19 Apr 2012 11:48:11 -0700 | From | Andrew Morton <> | Subject | Re: [PATCH] dma-debug: Fix deadlock with netconsole or other drivers that use the DMA API |
| |
On Thu, 19 Apr 2012 11:12:53 -0700 Roland Dreier <roland@kernel.org> wrote:
> From: Roland Dreier <roland@purestorage.com> > > If we exhaust the free_entries list, then we print the error message > > DMA-API: debugging out of memory - disabling > > to the kernel log, while holding free_entries_lock. Unfortunately, if > the console driver ends up calling back into the DMA API to map a > buffer, as eg a NIC driver is quite likely to for the packet netconsole > asks it to send, this will deadlock on free_entries_lock. > > A fix is pretty simple: if we flip the order of setting global_disable > to be before we print the error message, then the nested call into the > DMA API will bail out before trying to get free_entries_lock. > > Signed-off-by: Roland Dreier <roland@purestorage.com> > --- > lib/dma-debug.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/lib/dma-debug.c b/lib/dma-debug.c > index 13ef233..f198b4e 100644 > --- a/lib/dma-debug.c > +++ b/lib/dma-debug.c > @@ -436,8 +436,8 @@ static struct dma_debug_entry *dma_entry_alloc(void) > spin_lock_irqsave(&free_entries_lock, flags); > > if (list_empty(&free_entries)) { > - pr_err("DMA-API: debugging out of memory - disabling\n"); > global_disable = true; > + pr_err("DMA-API: debugging out of memory - disabling\n"); > goto out; > }
So *any* printk can deadlock if free_entries_lock is held and global_disable==false?
In that case we're going to need much sterner fixes. Any list_head operation can do a printk if list_head debugging is enabled. dma_debug_resize_entries() does a kfree() under free_entries_lock(!).
Methinks we need a more general fix?
| |