mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
rk: cma: attempt to allocate same range memory while cma allocation failure
This commit is contained in:
parent
a874c3009d
commit
17beed5e65
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user