Prev: gigaset: patches for 2.6.34
Next: [tip:tracing/core] tracing: Simplify memory recycle of trace_define_field
From: David Miller on 26 Feb 2010 04:40 From: Robert Hancock <hancockrwd(a)gmail.com> Date: Mon, 22 Feb 2010 20:45:45 -0600 > Many networking drivers have issues with the use of the NETIF_F_HIGHDMA flag. > This flag actually indicates whether or not the device/driver can handle > skbs located in high memory (as opposed to lowmem). However, many drivers > incorrectly treat this flag as indicating that 64-bit DMA is supported, which > has nothing to do with its actual function. It makes no sense to make setting > NETIF_F_HIGHDMA conditional on whether a 64-bit DMA mask has been set, as many > drivers do, since if highmem DMA is supported at all, it should work regardless > of whether 64-bit DMA is supported. Failing to set NETIF_F_HIGHDMA when it > should be can hurt performance on architectures which use highmem since it > results in needless data copying. > > This fixes up the networking drivers which currently use NETIF_F_HIGHDMA to > not do so conditionally on DMA mask settings. > > For the USB kaweth and usbnet drivers, this patch also uncomments and corrects > some code to set NETIF_F_HIGHDMA based on the USB host controller's DMA mask. > These drivers should be able to access highmem unless the host controller is > non-DMA-capable, which is indicated by the DMA mask being null. > > Signed-off-by: Robert Hancock <hancockrwd(a)gmail.com> Well, if the device isn't using 64-bit DMA addressing and the platform uses direct (no-iommu) mapping of physical to DMA addresses , won't your change break things? The device will get a >4GB DMA address or the DMA mapping layer will signal an error. That's really part of the what the issue is I think. So, this trigger the check in check_addr() in arch/x86/kernel/pci-nommu.c when such packets try to get mapped by the driver, right? That will make the DMA mapping call fail, and the packet will be dropped permanently. And hey, on top of it, many of these drivers you remove the setting from don't even check the mapping call return values for errors. So even bigger breakage. One example is drivers/net/8139cp.c, it just does dma_map_single() and uses the result. It really depends upon that NETIF_F_HIGHDMA setting for correct operation. And even if something like swiotlb is available, now we're going to do bounce buffering which is largely equivalent to what a lack of NETIF_F_HIGHDMA will do. Except that once NETIF_F_HIGHDMA copies the packet to lowmem it will only do that once, whereas if the packet goes to multiple devices swiotlb might copy the packet to a bounce buffer multiple times. We definitely can't apply your patch as-is. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: David Miller on 27 Feb 2010 05:00 From: Robert Hancock <hancockrwd(a)gmail.com> Date: Fri, 26 Feb 2010 21:08:04 -0600 > That seems like a reasonable approach to me. Only question is how to > implement the check for DMA_64BIT. Can we just check page_to_phys on > each of the pages in the skb to see if it's > 0xffffffff ? Are there > any architectures where it's more complicated than that? On almost every platform it's "more complicated than that". This is the whole issue. What matters is the final DMA address and since we have IOMMUs and the like, it is absolutely not tenable to solve this by checking physical address attributes. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: David Miller on 27 Feb 2010 07:10 From: Bartlomiej Zolnierkiewicz <bzolnier(a)gmail.com> Date: Sat, 27 Feb 2010 12:59:31 +0100 > Having IOMMU (even if it is only a software one, i.e. this would > mean swiotlb for x86-32/highmem) always in place would simplify > things greatly.. I agree, things would be a lot simpler. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: David Miller on 28 Feb 2010 03:20
From: FUJITA Tomonori <fujita.tomonori(a)lab.ntt.co.jp> Date: Sun, 28 Feb 2010 03:38:19 +0900 > When I proposed such approach (always use swiotlb) before, IIRC, > the objections were: > > - better to make allocation respect dma_mask. (I don't think that this > approach is possible since we don't know which device handles data > later when we allocate memory). And such objects might end up being processed by multiple devices with different DMA restrictions. > - swiotlb is not good for small systems since it allocates too much > memory (we can fix this though). Indeed. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |