| From ab2a47bd242d6cdcf6b2b64797f271c6f0a6d338 Mon Sep 17 00:00:00 2001 |
| From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Date: Fri, 22 Jul 2011 12:51:48 -0400 |
| Subject: xen-swiotlb: Fix wrong panic. |
| |
| From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| |
| commit ab2a47bd242d6cdcf6b2b64797f271c6f0a6d338 upstream. |
| |
| Propagate the baremetal git commit "swiotlb: fix wrong panic" |
| (fba99fa38b023224680308a482e12a0eca87e4e1) in the Xen-SWIOTLB version. |
| wherein 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 xen-swiotlb returns an error, b44 driver can use the own bouncing |
| mechanism. |
| |
| Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/xen/swiotlb-xen.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/xen/swiotlb-xen.c |
| +++ b/drivers/xen/swiotlb-xen.c |
| @@ -278,9 +278,10 @@ dma_addr_t xen_swiotlb_map_page(struct d |
| /* |
| * Ensure that the address returned is DMA'ble |
| */ |
| - if (!dma_capable(dev, dev_addr, size)) |
| - panic("map_single: bounce buffer is not DMA'ble"); |
| - |
| + if (!dma_capable(dev, dev_addr, size)) { |
| + swiotlb_tbl_unmap_single(dev, map, size, dir); |
| + dev_addr = 0; |
| + } |
| return dev_addr; |
| } |
| EXPORT_SYMBOL_GPL(xen_swiotlb_map_page); |