Re: [PATCH 02/20] kernel/dma/direct: refine dma_direct_alloc zone selection
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2018-08-23 00:02:07
Also in:
linux-iommu
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:quoted
On Mon, 2018-07-30 at 18:38 +0200, Christoph Hellwig wrote:quoted
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.quoted
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).quoted
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 emptyThis 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.