Skip to content

Commit fba99fa

Browse files
fujitatorvalds
authored andcommitted
swiotlb: fix wrong panic
swiotlb's map_page wrongly calls panic() when it can't find a buffer fit for device's dma mask. It should return an error instead. Devices with an odd dma mask (i.e. under 4G) like b44 network card hit this bug (the system crashes): http://marc.info/?l=linux-kernel&m=129648943830106&w=2 If swiotlb returns an error, b44 driver can use the own bouncing mechanism. Reported-by: Chuck Ebbert <[email protected]> Signed-off-by: FUJITA Tomonori <[email protected]> Tested-by: Arkadiusz Miskiewicz <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent f8407f2 commit fba99fa

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

lib/swiotlb.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,8 +686,10 @@ dma_addr_t swiotlb_map_page(struct device *dev, struct page *page,
686686
/*
687687
* Ensure that the address returned is DMA'ble
688688
*/
689-
if (!dma_capable(dev, dev_addr, size))
690-
panic("map_single: bounce buffer is not DMA'ble");
689+
if (!dma_capable(dev, dev_addr, size)) {
690+
swiotlb_tbl_unmap_single(dev, map, size, dir);
691+
dev_addr = swiotlb_virt_to_bus(dev, io_tlb_overflow_buffer);
692+
}
691693

692694
return dev_addr;
693695
}

0 commit comments

Comments
 (0)