Re: [3/3] Use the DMA32 zone for dma_alloc_coherent()/pci_alloc_consistent on x86-64

From: Andi Kleen
Date: Mon Sep 12 2005 - 13:00:46 EST


On Monday 12 September 2005 19:41, Linus Torvalds wrote:
> On Sun, 11 Sep 2005, Andi Kleen wrote:
> > Use the DMA32 zone for dma_alloc_coherent()/pci_alloc_consistent on
> > x86-64
> >
> > Signed-off-by: Andi Kleen <ak@xxxxxxx>
> >
> > Index: linux/arch/x86_64/kernel/pci-gart.c
> > ===================================================================
> > --- linux.orig/arch/x86_64/kernel/pci-gart.c
> > +++ linux/arch/x86_64/kernel/pci-gart.c
> > @@ -219,6 +219,8 @@ dma_alloc_coherent(struct device *dev, s
> > /* Kludge to make it bug-to-bug compatible with i386. i386
> > uses the normal dma_mask for alloc_coherent. */
> > dma_mask &= *dev->dma_mask;
> > + if (dma_mask <= 0xffffffff)
> > + gfp |= GFP_DMA32;
>
> How can this be right?

No that's intentional. The rationale is that usually the mask is bigger
than 16MB, so you first try it in the higher zone where you already
have some chance to get the right memory, and then only
if you don't get it fall back to the "precious" zone.

The cost is very low because the allocators are fast enough.

Given for a real 0xfffff allocation it is not very likely it will
work, but most <4GB allocations are bigger than that.

I had the same algorithm previously with GFP_DMA.

> Let's say that dma_mask is 0xfffff (ie 20-bit legacy DMA). It will trigger
> the test, and set the GFP_DMA32 bit. Which can't be right.
>
> I'm going to drop the DMA32 parts of the patches, they seem to be pretty
> raw.

Please don't.


-Andi
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/