• Andrey Ryabinin's avatar
    mm/vmscan: wake up flushers for legacy cgroups too · 1c610d5f
    Andrey Ryabinin authored
    Commit 726d061f ("mm: vmscan: kick flushers when we encounter dirty
    pages on the LRU") added flusher invocation to shrink_inactive_list()
    when many dirty pages on the LRU are encountered.
    
    However, shrink_inactive_list() doesn't wake up flushers for legacy
    cgroup reclaim, so the next commit bbef9384 ("mm: vmscan: remove old
    flusher wakeup from direct reclaim path") removed the only source of
    flusher's wake up in legacy mem cgroup reclaim path.
    
    This leads to premature OOM if there is too many dirty pages in cgroup:
        # mkdir /sys/fs/cgroup/memory/test
        # echo $$ > /sys/fs/cgroup/memory/test/tasks
        # echo 50M > /sys/fs/cgroup/memory/test/memory.limit_in_bytes
        # dd if=/dev/zero of=tmp_file bs=1M count=100
        Killed
    
        dd invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=0
    
        Call Trace:
         dump_stack+0x46/0x65
         dump_header+0x6b/0x2ac
         oom_kill_process+0x21c/0x4a0
         out_of_memory+0x2a5/0x4b0
         mem_cgroup_out_of_memory+0x3b/0x60
         mem_cgroup_oom_synchronize+0x2ed/0x330
         pagefault_out_of_memory+0x24/0x54
         __do_page_fault+0x521/0x540
         page_fault+0x45/0x50
    
        Task in /test killed as a result of limit of /test
        memory: usage 51200kB, limit 51200kB, failcnt 73
        memory+swap: usage 51200kB, limit 9007199254740988kB, failcnt 0
        kmem: usage 296kB, limit 9007199254740988kB, failcnt 0
        Memory cgroup stats for /test: cache:49632KB rss:1056KB rss_huge:0KB shmem:0KB
                mapped_file:0KB dirty:49500KB writeback:0KB swap:0KB inactive_anon:0KB
    	    active_anon:1168KB inactive_file:24760KB active_file:24960KB unevictable:0KB
        Memory cgroup out of memory: Kill process 3861 (bash) score 88 or sacrifice child
        Killed process 3876 (dd) total-vm:8484kB, anon-rss:1052kB, file-rss:1720kB, shmem-rss:0kB
        oom_reaper: reaped process 3876 (dd), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
    
    Wake up flushers in legacy cgroup reclaim too.
    
    Link: http://lkml.kernel.org/r/20180315164553.17856-1-aryabinin@virtuozzo.com
    Fixes: bbef9384 ("mm: vmscan: remove old flusher wakeup from direct reclaim path")
    Signed-off-by: default avatarAndrey Ryabinin <aryabinin@virtuozzo.com>
    Tested-by: default avatarShakeel Butt <shakeelb@google.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    1c610d5f
vmscan.c 113 KB