[Devel] [PATCH RHEL9 COMMIT] ms/vmalloc: back off when the current task is OOM-killed

Konstantin Khorenko khorenko at virtuozzo.com
Fri Nov 12 20:30:27 MSK 2021


The commit is pushed to "branch-rh9-5.14.vz9.1.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh9-5.14.0-4.vz9.10.26
------>
commit cdf66e27a042a06224cb9e3850bf90d4a082dda3
Author: Vasily Averin <vvs at virtuozzo.com>
Date:   Fri Nov 12 20:30:27 2021 +0300

    ms/vmalloc: back off when the current task is OOM-killed
    
    Huge vmalloc allocation on heavy loaded node can lead to a global memory
    shortage.  Task called vmalloc can have worst badness and be selected by
    OOM-killer, however taken fatal signal does not interrupt allocation
    cycle.  Vmalloc repeat page allocaions again and again, exacerbating the
    crisis and consuming the memory freed up by another killed tasks.
    
    After a successful completion of the allocation procedure, a fatal
    signal will be processed and task will be destroyed finally.  However it
    may not release the consumed memory, since the allocated object may have
    a lifetime unrelated to the completed task.  In the worst case, this can
    lead to the host will panic due to "Out of memory and no killable
    processes..."
    
    This patch allows OOM-killer to break vmalloc cycle, makes OOM more
    effective and avoid host panic.  It does not check oom condition
    directly, however, and breaks page allocation cycle when fatal signal
    was received.
    
    This may trigger some hidden problems, when caller does not handle
    vmalloc failures, or when rollaback after failed vmalloc calls own
    vmallocs inside.  However all of these scenarios are incorrect: vmalloc
    does not guarantee successful allocation, it has never been called with
    __GFP_NOFAIL and threfore either should not be used for any rollbacks or
    should handle such errors correctly and not lead to critical failures.
    
    Link: https://lkml.kernel.org/r/83efc664-3a65-2adb-d7c4-2885784cf109@virtuozzo.com
    Signed-off-by: Vasily Averin <vvs at virtuozzo.com>
    
    Acked-by: Michal Hocko <mhocko at suse.com>
    Cc: Johannes Weiner <hannes at cmpxchg.org>
    Cc: Vladimir Davydov <vdavydov.dev at gmail.com>
    Cc: Tetsuo Handa <penguin-kernel at i-love.sakura.ne.jp>
    Cc: Uladzislau Rezki (Sony) <urezki at gmail.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
    https://jira.sw.ru/browse/PSBM-134774
    (cherry picked from commit dd544141b9eb8f3c58dedc9c1dcc4803de0eed45)
    Signed-off-by: Vasily Averin <vvs at virtuozzo.com>
---
 mm/vmalloc.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index e06162043885..0ce0847d6a1e 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -2804,6 +2804,9 @@ vm_area_alloc_pages(gfp_t gfp, int nid,
 		struct page *page;
 		int i;
 
+		if (fatal_signal_pending(current))
+			break;
+
 		page = alloc_pages_node(nid, gfp, order);
 		if (unlikely(!page))
 			break;


More information about the Devel mailing list