Another way we could approach this is to get rid of ZONE_DMA. Make GFP_DMA a flag which doesn't map to a zone. Rather, it redirects to a separate allocator. At boot, we hand all memory under 16MB to the DMA allocator. The DMA allocator can have a shrinker which just hands back all the memory once we're under memory pressure (if it's never had an allocation).

I think we can get rid of the GFP_DMA support in slab/slub. We still need to be able to allocate pages to support bounce buffers / dma_alloc_foo, but there's really no reason to allocate sub-pages at this point.

On Sat, Apr 28, 2018, 14:55 Luis R. Rodriguez, <mcgrof@kernel.org> wrote:
On Sat, Apr 28, 2018 at 01:42:21AM -0700, Christoph Hellwig wrote:
> On Fri, Apr 27, 2018 at 04:14:56PM +0000, Luis R. Rodriguez wrote:
> > Do we have a list of users for x86 with a small DMA mask?
> > Or, given that I'm not aware of a tool to be able to look
> > for this in an easy way, would it be good to find out which
> > x86 drivers do have a small mask?
>
> Basically you'll have to grep for calls to dma_set_mask/
> dma_set_coherent_mask/dma_set_mask_and_coherent and their pci_*
> wrappers with masks smaller 32-bit.  Some use numeric values,
> some use DMA_BIT_MASK and various places uses local variables
> or struct members to parse them, so finding them will be a bit
> more work.  Nothing a coccinelle expert couldn't solve, though :)

Thing is unless we have a specific flag used consistently I don't believe we
can do this search with Coccinelle. ie, if we have local variables and based on
some series of variables things are set, this makes the grammatical expression
difficult to express.  So Cocinelle is not designed for this purpose.

But I believe smatch [0] is intended exactly for this sort of purpose, is that
right Dan? I gave a cursory look and I think it'd take me significant time to
get such hunt down.

[0] https://lwn.net/Articles/691882/

  Luis