• Nicolin Chen's avatar
    dma-contiguous: add dma_{alloc,free}_contiguous() helpers · b1d2dc00
    Nicolin Chen authored
    Both dma_alloc_from_contiguous() and dma_release_from_contiguous() are
    very simply implemented, but requiring callers to pass certain
    parameters like count and align, and taking a boolean parameter to check
    __GFP_NOWARN in the allocation flags. So every function call duplicates
    similar work:
    
    	unsigned long order = get_order(size);
    	size_t count = size >> PAGE_SHIFT;
    
    	page = dma_alloc_from_contiguous(dev, count, order,
    			gfp & __GFP_NOWARN);
    
    	[...]
    
    	dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT);
    
    Additionally, as CMA can be used only in the context which permits
    sleeping, most of callers do a gfpflags_allow_blocking() check and a
    corresponding fallback allocation of normal pages upon any false result:
    
    	if (gfpflags_allow_blocking(flag))
    		page = dma_alloc_from_contiguous();
    	if (!page)
    		page = alloc_pages();
    
    	[...]
    
    	if (!dma_release_from_contiguous(dev, page, count))
    		__free_pages(page, get_order(size));
    
    So this patch simplifies those function calls by abstracting these
    operations into the two new functions: dma_{alloc,free}_contiguous.
    
    As some callers of dma_{alloc,release}_from_contiguous() might be
    complicated, this patch just implements these two new functions to
    kernel/dma/direct.c only as an initial step.
    Suggested-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarNicolin Chen <nicoleotsuka@gmail.com>
    Tested-by: default avatardann frazier <dann.frazier@canonical.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    b1d2dc00
contiguous.c 9.57 KB