Messages in this thread Patch in this message | | | Date | Mon, 13 Jul 2009 15:36:12 -0400 | From | Casey Dahlin <> | Subject | [PATCH] Fix strange panic message selection logic when swiotlb fills up |
| |
swiotlb_full in lib/swiotlb.c contains the following code snippet to produce a panic when the software iotlb is too full to handle a new allocation:
if (size > io_tlb_overflow && do_panic) { if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) panic("DMA: Memory would be corrupted\n"); if (dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL) panic("DMA: Random memory would be DMAed\n"); }
Note the path when dir == DMA_BIDIRECTIONAL. The first panic() will be called always, yet the second if statement still checks for DMA_BIDIRECTIONAL. Unless we intend to panic twice, this is somewhat confusing.
This patch adds a third, separate error for DMA_BIDIRECTIONAL to make things a bit clearer.
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index bffe6d7..35e01b3 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c @@ -625,12 +625,15 @@ swiotlb_full(struct device *dev, size_t size, int dir, int do_panic) printk(KERN_ERR "DMA: Out of SW-IOMMU space for %zu bytes at " "device %s\n", size, dev ? dev_name(dev) : "?"); - if (size > io_tlb_overflow && do_panic) { - if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) - panic("DMA: Memory would be corrupted\n"); - if (dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL) - panic("DMA: Random memory would be DMAed\n"); - } + if (size <= io_tlb_overflow || !do_panic) + return; + + if (dir == DMA_BIDIRECTIONAL) + panic("DMA: Random memory could be corrupted or DMAed\n"); + if (dir == DMA_FROM_DEVICE) + panic("DMA: Memory would be corrupted\n"); + if (dir == DMA_TO_DEVICE) + panic("DMA: Random memory would be DMAed\n"); } /*
| |