Skip to content
  • Akinobu Mita's avatar
    x86: make dma_alloc_coherent() return zeroed memory if CMA is enabled · d92ef66c
    Akinobu Mita authored
    
    
    This patchset enhances the DMA Contiguous Memory Allocator on x86.
    
    Currently the DMA CMA is only supported with pci-nommu dma_map_ops and
    furthermore it can't be enabled on x86_64.  But I would like to allocate
    big contiguous memory with dma_alloc_coherent() and tell it to the device
    that requires it, regardless of which dma mapping implementation is
    actually used in the system.
    
    So this makes it work with swiotlb and intel-iommu dma_map_ops, too.  And
    this also extends "cma=" kernel parameter to specify placement constraint
    by the physical address range of memory allocations.  For example, CMA
    allocates memory below 4GB by "cma=64M@0-4G", it is required for the
    devices only supporting 32-bit addressing on 64-bit systems without iommu.
    
    This patch (of 5):
    
    Calling dma_alloc_coherent() with __GFP_ZERO must return zeroed memory.
    
    But when the contiguous memory allocator (CMA) is enabled on x86 and the
    memory region is allocated by dma_alloc_from_contiguous(), it doesn't
    return zeroed memory.  Because dma_generic_alloc_coherent() forgot to fill
    the memory region with zero if it was allocated by
    dma_alloc_from_contiguous()
    
    Most implementations of dma_alloc_coherent() return zeroed memory
    regardless of whether __GFP_ZERO is specified.  So this fixes it by
    unconditionally zeroing the allocated memory region.
    
    Alternatively, we could fix dma_alloc_from_contiguous() to return zeroed
    out memory and remove memset() from all caller of it.  But we can't simply
    remove the memset on arm because __dma_clear_buffer() is used there for
    ensuring cache flushing and it is used in many places.  Of course we can
    do redundant memset in dma_alloc_from_contiguous(), but I think this patch
    is less impact for fixing this problem.
    
    Signed-off-by: default avatarAkinobu Mita <akinobu.mita@gmail.com>
    Cc: Marek Szyprowski <m.szyprowski@samsung.com>
    Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Cc: David Woodhouse <dwmw2@infradead.org>
    Cc: Don Dutile <ddutile@redhat.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Andi Kleen <andi@firstfloor.org>
    Cc: Yinghai Lu <yinghai@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d92ef66c