mm: fix dead loop if signal pending for cma alloc task [1/1]

PD#GH-17

Problem:
If a task be killed during CMA allocation, then it will abort
cma allocation in function compact_unlock_should_abort. But in
function aml_cma_alloc_range, it will return -EBUSY. Which cause
cma allocation loop won't exit and run again and again.

Solution:
return -EINT for this case to exit cma allocaion loop.

Verify:
newman platform

Change-Id: I6559bb184fc035ae68c8ccd001407767e1e22f0c
Signed-off-by: Tao Zeng <tao.zeng@amlogic.com>
This commit is contained in:
Tao Zeng
2019-01-10 10:35:14 +08:00
committed by Luke Go
parent d502d2bb21
commit cd6058593d

View File

@@ -577,6 +577,7 @@ int aml_cma_alloc_range(unsigned long start, unsigned long end)
.mode = MIGRATE_SYNC,
.page_type = COMPACT_CMA,
.ignore_skip_hint = true,
.contended = false,
};
INIT_LIST_HEAD(&cc.migratepages);
@@ -611,11 +612,8 @@ try_again:
outer_start = start;
while (!PageBuddy(pfn_to_page(outer_start))) {
if (++order >= MAX_ORDER) {
ret = -EBUSY;
try_times++;
if (try_times < 10)
goto try_again;
goto done;
outer_start = start;
break;
}
outer_start &= ~0UL << order;
}
@@ -647,7 +645,11 @@ try_again:
/* Grab isolated pages from freelists. */
outer_end = isolate_freepages_range(&cc, outer_start, end);
if (!outer_end) {
ret = -EBUSY;
if (cc.contended) {
ret = -EINTR;
pr_info("cma_alloc [%lx-%lx] aborted\n", start, end);
} else
ret = -EBUSY;
goto done;
}