ARM: dma: Drop __GFP_COMP for iommu dma memory allocations
__iommu_alloc_buffer wants to split pages after allocation in order to reduce the memory footprint. This does not work well with __GFP_COMP pages, so drop this flag before allocation One failure example is snd_malloc_dev_pages call dma_alloc_coherent with __GFP_COMP. Signed-off-by: Richard Zhao <rizhao@nvidia.com> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
This commit is contained in:
committed by
Marek Szyprowski
parent
63c181922f
commit
5b91a98c61
@@ -1328,6 +1328,15 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size,
|
|||||||
if (gfp & GFP_ATOMIC)
|
if (gfp & GFP_ATOMIC)
|
||||||
return __iommu_alloc_atomic(dev, size, handle);
|
return __iommu_alloc_atomic(dev, size, handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Following is a work-around (a.k.a. hack) to prevent pages
|
||||||
|
* with __GFP_COMP being passed to split_page() which cannot
|
||||||
|
* handle them. The real problem is that this flag probably
|
||||||
|
* should be 0 on ARM as it is not supported on this
|
||||||
|
* platform; see CONFIG_HUGETLBFS.
|
||||||
|
*/
|
||||||
|
gfp &= ~(__GFP_COMP);
|
||||||
|
|
||||||
pages = __iommu_alloc_buffer(dev, size, gfp, attrs);
|
pages = __iommu_alloc_buffer(dev, size, gfp, attrs);
|
||||||
if (!pages)
|
if (!pages)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Reference in New Issue
Block a user