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>
.mode = MIGRATE_SYNC,
.page_type = COMPACT_CMA,
.ignore_skip_hint = true,
+ .contended = false,
};
INIT_LIST_HEAD(&cc.migratepages);
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;
}
/* 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;
}