mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user