From: CMY Date: Mon, 21 Jul 2014 10:18:36 +0000 (+0800) Subject: rk: cma: attempt to allocate same range memory while cma allocation failure X-Git-Tag: firefly_0821_release~4958 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=17beed5e65b338169ff45cfc6f9c4f28f86b3899;p=firefly-linux-kernel-4.4.55.git rk: cma: attempt to allocate same range memory while cma allocation failure --- diff --git a/arch/arm/configs/rockchip_defconfig b/arch/arm/configs/rockchip_defconfig index 00c4bb505c8b..994680bae324 100644 --- a/arch/arm/configs/rockchip_defconfig +++ b/arch/arm/configs/rockchip_defconfig @@ -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 diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig index 10cd80af2aec..5f58056429e6 100644 --- a/drivers/base/Kconfig +++ b/drivers/base/Kconfig @@ -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 diff --git a/drivers/base/dma-contiguous.c b/drivers/base/dma-contiguous.c index 99802d6f3c60..3bf898d5f866 100644 --- a/drivers/base/dma-contiguous.c +++ b/drivers/base/dma-contiguous.c @@ -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 */