forked from Minki/linux
dma-contiguous: cleanup dma_alloc_contiguous
Split out a cma_alloc_aligned helper to deal with the "interesting" calling conventions for cma_alloc, which then allows to the main function to be written straight forward. This also takes advantage of the fact that NULL dev arguments have been gone from the DMA API for a while. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Nicolin Chen <nicoleotsuka@gmail.com> Reviewed-by: Barry Song <song.bao.hua@hisilicon.com>
This commit is contained in:
parent
23efed6fa7
commit
274b3f7bf3
@ -215,6 +215,13 @@ bool dma_release_from_contiguous(struct device *dev, struct page *pages,
|
|||||||
return cma_release(dev_get_cma_area(dev), pages, count);
|
return cma_release(dev_get_cma_area(dev), pages, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct page *cma_alloc_aligned(struct cma *cma, size_t size, gfp_t gfp)
|
||||||
|
{
|
||||||
|
unsigned int align = min(get_order(size), CONFIG_CMA_ALIGNMENT);
|
||||||
|
|
||||||
|
return cma_alloc(cma, size >> PAGE_SHIFT, align, gfp & __GFP_NOWARN);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dma_alloc_contiguous() - allocate contiguous pages
|
* dma_alloc_contiguous() - allocate contiguous pages
|
||||||
* @dev: Pointer to device for which the allocation is performed.
|
* @dev: Pointer to device for which the allocation is performed.
|
||||||
@ -231,24 +238,14 @@ bool dma_release_from_contiguous(struct device *dev, struct page *pages,
|
|||||||
*/
|
*/
|
||||||
struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp)
|
struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp)
|
||||||
{
|
{
|
||||||
size_t count = size >> PAGE_SHIFT;
|
|
||||||
struct page *page = NULL;
|
|
||||||
struct cma *cma = NULL;
|
|
||||||
|
|
||||||
if (dev && dev->cma_area)
|
|
||||||
cma = dev->cma_area;
|
|
||||||
else if (count > 1)
|
|
||||||
cma = dma_contiguous_default_area;
|
|
||||||
|
|
||||||
/* CMA can be used only in the context which permits sleeping */
|
/* CMA can be used only in the context which permits sleeping */
|
||||||
if (cma && gfpflags_allow_blocking(gfp)) {
|
if (!gfpflags_allow_blocking(gfp))
|
||||||
size_t align = get_order(size);
|
return NULL;
|
||||||
size_t cma_align = min_t(size_t, align, CONFIG_CMA_ALIGNMENT);
|
if (dev->cma_area)
|
||||||
|
return cma_alloc_aligned(dev->cma_area, size, gfp);
|
||||||
page = cma_alloc(cma, count, cma_align, gfp & __GFP_NOWARN);
|
if (size <= PAGE_SIZE || !dma_contiguous_default_area)
|
||||||
}
|
return NULL;
|
||||||
|
return cma_alloc_aligned(dma_contiguous_default_area, size, gfp);
|
||||||
return page;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user