[PATCH 02/20] kernel/dma/direct: refine dma_direct_alloc zone selection
Benjamin Herrenschmidt
benh at kernel.crashing.org
Thu Aug 23 10:01:45 AEST 2018
On Wed, 2018-08-22 at 08:58 +0200, Christoph Hellwig wrote:
> On Thu, Aug 09, 2018 at 09:54:33AM +1000, Benjamin Herrenschmidt wrote:
> > On Mon, 2018-07-30 at 18:38 +0200, Christoph Hellwig wrote:
> > > We need to take the DMA offset and encryption bit into account when selecting
> > > a zone. Add a helper that takes those into account and use it.
> >
> > That whole "encryption" stuff seems to be completely specific to the
> > way x86 does memory encryption, or am I mistaken ? It's not clear to me
> > what that does in practice and how it relates to DMA mappings.
>
> Not even all of x86, but AMD in particular, Intel does it yet another
> way. But it still is easier to take this into the core with a few
> overrides than duplicating all the code.
>
> > I'm also not sure about that whole business with ZONE_DMA and
> > ARCH_ZONE_DMA_BITS...
>
> ZONE_DMA usually (but not always) maps to 24-bits of address space,
> if it doesn't (I mostly through about s390 with it's odd 31-bits)
> the architecture can override it if it cares).
>
> > On ppc64, unless you enable swiotlb (which we only do currently on
> > some embedded platforms), you have all of memory in ZONE_DMA.
> >
> > [ 0.000000] Zone ranges:
> > [ 0.000000] DMA [mem 0x0000000000000000-0x0000001fffffffff]
> > [ 0.000000] DMA32 empty
> > [ 0.000000] Normal empty
> > [ 0.000000] Device empty
>
> This is really weird. Why would you wire up ZONE_DMA like this?
We always did :-) It predates my involvement and I think it predates
even Pauls. It's quite silly actually since the first powerpc machines
actually had ISA devices in them, but that's how it's been for ever. I
suppose we could change it but that would mean digging out some old
stuff to test.
> The general scheme that architectures should implement is:
>
> ZONE_DMA: Any memory below a magic threshold that is lower than
> 32-bit. Only enabled if actually required (usually
> either 24-bit for ISA, or some other weird architecture
> specific value like 32-bit for S/390)
It should have been ZONE_ISA_DMA :-)
> ZONE_DMA32: Memory <= 32-bit if the architecture supports more than
> 32-bits worth of physical address space. Should generally
> be enabled on all 64-bit architectures unless you have
> a very good reason not to.
Yeah so we sort-of enable the config option but only populate the zone
on platforms using swiotlb (freescale stuff). It's a bit messy at the
moment I must admit.
> ZONE_NORMAL: Everything above 32-bit not falling into HIGHMEM or
> MOVEABLE.
Cheers,
Ben.
More information about the Linuxppc-dev
mailing list