rk: cma: attempt to allocate same range memory while cma allocation failure

This commit is contained in:
CMY 2014-07-21 18:18:36 +08:00
parent a874c3009d
commit 17beed5e65
3 changed files with 21 additions and 0 deletions

View File

@ -209,6 +209,7 @@ CONFIG_RFKILL=y
CONFIG_RFKILL_RK=y
CONFIG_DEVTMPFS=y
CONFIG_DMA_CMA=y
CONFIG_CMA_ALLOC_RETRY=20
CONFIG_BLK_DEV_LOOP=y
CONFIG_UID_STAT=y
CONFIG_SRAM=y

View File

@ -278,6 +278,14 @@ config CMA_AREAS
If unsure, leave the default value "7".
config CMA_ALLOC_RETRY
int "Maximum count to retry of the CMA Allocation"
depends on ARCH_ROCKCHIP
default 20
help
CMA allocation range may be busy at this time, we can try again a few
time to make allocate successful.
endif
endmenu

View File

@ -297,12 +297,18 @@ struct page *dma_alloc_from_contiguous(struct device *dev, int count,
mutex_lock(&cma_mutex);
for (;;) {
#ifdef CONFIG_CMA_ALLOC_RETRY
int retry = 0;
#endif
pageno = bitmap_find_next_zero_area(cma->bitmap, cma->count,
start, count, mask);
if (pageno >= cma->count)
break;
pfn = cma->base_pfn + pageno;
#ifdef CONFIG_CMA_ALLOC_RETRY
do {
#endif
ret = alloc_contig_range(pfn, pfn + count, MIGRATE_CMA);
if (ret == 0) {
bitmap_set(cma->bitmap, pageno, count);
@ -311,6 +317,12 @@ struct page *dma_alloc_from_contiguous(struct device *dev, int count,
} else if (ret != -EBUSY) {
break;
}
#ifdef CONFIG_CMA_ALLOC_RETRY
}while (++retry<=CONFIG_CMA_ALLOC_RETRY);
if (retry<=CONFIG_CMA_ALLOC_RETRY)
break;
#endif
pr_debug("%s(): memory range at %p is busy, retrying\n",
__func__, pfn_to_page(pfn));
/* try again with a bit different memory target */