dma-pool: add additional coherent pools to map to gfp mask
authorDavid Rientjes <rientjes@google.com>
Wed, 15 Apr 2020 00:04:55 +0000 (17:04 -0700)
committerChristoph Hellwig <hch@lst.de>
Mon, 20 Apr 2020 10:09:40 +0000 (12:09 +0200)
commitc84dc6e68a1d2464e050d9694be4e4ff49e32bfd
tree990649dd5eb1b134f558641e0f1f02609478897d
parente860c299ac0d738b44ff91693f11e63080a29698
dma-pool: add additional coherent pools to map to gfp mask

The single atomic pool is allocated from the lowest zone possible since
it is guaranteed to be applicable for any DMA allocation.

Devices may allocate through the DMA API but not have a strict reliance
on GFP_DMA memory.  Since the atomic pool will be used for all
non-blockable allocations, returning all memory from ZONE_DMA may
unnecessarily deplete the zone.

Provision for multiple atomic pools that will map to the optimal gfp
mask of the device.

When allocating non-blockable memory, determine the optimal gfp mask of
the device and use the appropriate atomic pool.

The coherent DMA mask will remain the same between allocation and free
and, thus, memory will be freed to the same atomic pool it was allocated
from.

__dma_atomic_pool_init() will be changed to return struct gen_pool *
later once dynamic expansion is added.

Signed-off-by: David Rientjes <rientjes@google.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/iommu/dma-iommu.c
include/linux/dma-direct.h
include/linux/dma-mapping.h
kernel/dma/direct.c
kernel/dma/pool.c