The patch titled Subject: dma-debug: fix locking bug in check_unmap() has been added to the -mm tree. Its filename is dma-debug-fix-locking-bug-in-check_unmap.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Alexander Duyck <alexander.h.duyck@xxxxxxxxx> Subject: dma-debug: fix locking bug in check_unmap() In check_unmap() it is possible to get into a dead-locked state if dma_mapping_error is called. The problem is that the bucket is locked in check_unmap, and locked again by debug_dma_mapping_error which is called by dma_mapping_error. To resolve that we must release the lock on the bucket before making the call to dma_mapping_error. Signed-off-by: Alexander Duyck <alexander.h.duyck@xxxxxxxxx> Cc: Joerg Roedel <joro@xxxxxxxxxx> Cc: Shuah Khan <shuah.khan@xxxxxx> Cc: Jakub Kicinski <kubakici@xxxxx> Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- lib/dma-debug.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff -puN lib/dma-debug.c~dma-debug-fix-locking-bug-in-check_unmap lib/dma-debug.c --- a/lib/dma-debug.c~dma-debug-fix-locking-bug-in-check_unmap +++ a/lib/dma-debug.c @@ -862,17 +862,18 @@ static void check_unmap(struct dma_debug entry = bucket_find_exact(bucket, ref); if (!entry) { + /* must drop lock before calling dma_mapping_error */ + put_hash_bucket(bucket, &flags); + if (dma_mapping_error(ref->dev, ref->dev_addr)) { err_printk(ref->dev, NULL, - "DMA-API: device driver tries " - "to free an invalid DMA memory address\n"); - return; + "DMA-API: device driver tries to free an invalid DMA memory address\n"); + } else { + err_printk(ref->dev, NULL, + "DMA-API: device driver tries to free DMA memory it has not allocated [device address=0x%016llx] [size=%llu bytes]\n", + ref->dev_addr, ref->size); } - err_printk(ref->dev, NULL, "DMA-API: device driver tries " - "to free DMA memory it has not allocated " - "[device address=0x%016llx] [size=%llu bytes]\n", - ref->dev_addr, ref->size); - goto out; + return; } if (ref->size != entry->size) { @@ -936,7 +937,6 @@ static void check_unmap(struct dma_debug hash_bucket_del(entry); dma_entry_free(entry); -out: put_hash_bucket(bucket, &flags); } _ Patches currently in -mm which might be from alexander.h.duyck@xxxxxxxxx are linux-next.patch dma-debug-fix-locking-bug-in-check_unmap.patch dma-debug-fix-locking-bug-in-check_unmap-fix.patch dma-debug-update-dma-debug-api-to-better-handle-multiple-mappings-of-a-buffer.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html