From 5a883fb75e3aa713c4e59ca78ab9acd09b78890e Mon Sep 17 00:00:00 2001 From: Shiraz Hashim Date: Tue, 1 May 2018 17:58:51 +0530 Subject: [PATCH] mm: cma: Increase retries if less blocks available If a particular cma region has lesser free blocks then increase retries to avoid allocation failure due to page being temporarily busy. Change-Id: I92021fd75315b266a978f7a5b0235344c800cba2 Signed-off-by: Shiraz Hashim Signed-off-by: Vinayak Menon --- mm/cma.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/mm/cma.c b/mm/cma.c index 6fdd2fd00bb8..57e8ec5e8c84 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -454,6 +454,8 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align, struct page *page = NULL; int ret = -ENOMEM; int retry_after_sleep = 0; + int max_retries = 2; + int available_regions = 0; if (!cma || !cma->count) return NULL; @@ -478,8 +480,15 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align, bitmap_maxno, start, bitmap_count, mask, offset); if (bitmap_no >= bitmap_maxno) { - if (retry_after_sleep < 2) { + if (retry_after_sleep < max_retries) { start = 0; + /* + * update max retries if available free regions + * are less. + */ + if (available_regions < 3) + max_retries = 5; + available_regions = 0; /* * Page may be momentarily pinned by some other * process which has been scheduled out, eg. @@ -497,6 +506,8 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align, break; } } + + available_regions++; bitmap_set(cma->bitmap, bitmap_no, bitmap_count); /* * It's safe to drop the lock here. We've marked this region for