• Mel Gorman's avatar
    mm: consider whether to decivate based on eligible zones inactive ratio · f8d1a311
    Mel Gorman authored
    Minchan Kim reported that with per-zone lru state it was possible to
    identify that a normal zone with 8^M anonymous pages could trigger OOM
    with non-atomic order-0 allocations as all pages in the zone were in the
    active list.
    
       gfp_mask=0x26004c0(GFP_KERNEL|__GFP_REPEAT|__GFP_NOTRACK), order=0
       Call Trace:
         __alloc_pages_nodemask+0xe52/0xe60
         ? new_slab+0x39c/0x3b0
         new_slab+0x39c/0x3b0
         ___slab_alloc.constprop.87+0x6da/0x840
         ? __alloc_skb+0x3c/0x260
         ? enqueue_task_fair+0x73/0xbf0
         ? poll_select_copy_remaining+0x140/0x140
         __slab_alloc.isra.81.constprop.86+0x40/0x6d
         ? __alloc_skb+0x3c/0x260
         kmem_cache_alloc+0x22c/0x260
         ? __alloc_skb+0x3c/0x260
         __alloc_skb+0x3c/0x260
         alloc_skb_with_frags+0x4e/0x1a0
         sock_alloc_send_pskb+0x16a/0x1b0
         ? wait_for_unix_gc+0x31/0x90
         unix_stream_sendmsg+0x28d/0x340
         sock_sendmsg+0x2d/0x40
         sock_write_iter+0x6c/0xc0
         __vfs_write+0xc0/0x120
         vfs_write+0x9b/0x1a0
         ? __might_fault+0x49/0xa0
         SyS_write+0x44/0x90
         do_fast_syscall_32+0xa6/0x1e0
    
       Mem-Info:
       active_anon:101103 inactive_anon:102219 isolated_anon:0
        active_file:503 inactive_file:544 isolated_file:0
        unevictable:0 dirty:0 writeback:34 unstable:0
        slab_reclaimable:6298 slab_unreclaimable:74669
        mapped:863 shmem:0 pagetables:100998 bounce:0
        free:23573 free_pcp:1861 free_cma:0
       Node 0 active_anon:404412kB inactive_anon:409040kB active_file:2012kB inactive_file:2176kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:3452kB dirty:0kB writeback:136kB shmem:0kB writeback_tmp:0kB unstable:0kB pages_scanned:1320845 all_unreclaimable? yes
       DMA free:3296kB min:68kB low:84kB high:100kB active_anon:5540kB inactive_anon:0kB active_file:0kB inactive_file:0kB present:15992kB managed:15916kB mlocked:0kB slab_reclaimable:248kB slab_unreclaimable:2628kB kernel_stack:792kB pagetables:2316kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
       lowmem_reserve[]: 0 809 1965 1965
       Normal free:3600kB min:3604kB low:4504kB high:5404kB active_anon:86304kB inactive_anon:0kB active_file:160kB inactive_file:376kB present:897016kB managed:858524kB mlocked:0kB slab_reclaimable:24944kB slab_unreclaimable:296048kB kernel_stack:163832kB pagetables:35892kB bounce:0kB free_pcp:3076kB local_pcp:656kB free_cma:0kB
       lowmem_reserve[]: 0 0 9247 9247
       HighMem free:86156kB min:512kB low:1796kB high:3080kB active_anon:312852kB inactive_anon:410024kB active_file:1924kB inactive_file:2012kB present:1183736kB managed:1183736kB mlocked:0kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:365784kB bounce:0kB free_pcp:3868kB local_pcp:720kB free_cma:0kB
       lowmem_reserve[]: 0 0 0 0
       DMA: 8*4kB (UM) 8*8kB (UM) 4*16kB (M) 2*32kB (UM) 2*64kB (UM) 1*128kB (M) 3*256kB (UME) 2*512kB (UE) 1*1024kB (E) 0*2048kB 0*4096kB = 3296kB
       Normal: 240*4kB (UME) 160*8kB (UME) 23*16kB (ME) 3*32kB (UE) 3*64kB (UME) 2*128kB (ME) 1*256kB (U) 0*512kB 0*1024kB 0*2048kB 0*4096kB = 3408kB
       HighMem: 10942*4kB (UM) 3102*8kB (UM) 866*16kB (UM) 76*32kB (UM) 11*64kB (UM) 4*128kB (UM) 1*256kB (M) 0*512kB 0*1024kB 0*2048kB 0*4096kB = 86344kB
       Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
       54409 total pagecache pages
       53215 pages in swap cache
       Swap cache stats: add 300982, delete 247765, find 157978/226539
       Free swap  = 3803244kB
       Total swap = 4192252kB
       524186 pages RAM
       295934 pages HighMem/MovableOnly
       9642 pages reserved
       0 pages cma reserved
    
    The problem is due to the active deactivation logic in
    inactive_list_is_low:
    
    	Node 0 active_anon:404412kB inactive_anon:409040kB
    
    IOW, (inactive_anon of node * inactive_ratio > active_anon of node) due
    to highmem anonymous stat so VM never deactivates normal zone's
    anonymous pages.
    
    This patch is a modified version of Minchan's original solution but
    based upon it.  The problem with Minchan's patch is that any low zone
    with an imbalanced list could force a rotation.
    
    In this patch, a zone-constrained global reclaim will rotate the list if
    the inactive/active ratio of all eligible zones needs to be corrected.
    It is possible that higher zone pages will be initially rotated
    prematurely but this is the safer choice to maintain overall LRU age.
    
    Link: http://lkml.kernel.org/r/20160722090929.GJ10438@techsingularity.netSigned-off-by: default avatarMinchan Kim <minchan@kernel.org>
    Signed-off-by: default avatarMel Gorman <mgorman@techsingularity.net>
    Acked-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@suse.cz>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f8d1a311
vmscan.c 110 KB