|
@@ -101,8 +101,13 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size,
|
|
|
again:
|
|
|
page = NULL;
|
|
|
/* CMA can be used only in the context which permits sleeping */
|
|
|
- if (flag & __GFP_WAIT)
|
|
|
+ if (flag & __GFP_WAIT) {
|
|
|
page = dma_alloc_from_contiguous(dev, count, get_order(size));
|
|
|
+ if (page && page_to_phys(page) + size > dma_mask) {
|
|
|
+ dma_release_from_contiguous(dev, page, count);
|
|
|
+ page = NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
/* fallback */
|
|
|
if (!page)
|
|
|
page = alloc_pages_node(dev_to_node(dev), flag, get_order(size));
|