mm: fix dead loop if signal pending for cma alloc task [1/1]
authorTao Zeng <tao.zeng@amlogic.com>
Thu, 10 Jan 2019 02:35:14 +0000 (10:35 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Mon, 14 Jan 2019 02:28:15 +0000 (18:28 -0800)
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>
drivers/amlogic/memory_ext/aml_cma.c

index 450af9a..1eabadb 100644 (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;
        }