• Charan Teja Kalla's avatar
    mm: page_alloc: correct high atomic reserve calculations · d68e39fc
    Charan Teja Kalla authored
    Patch series "mm: page_alloc: fixes for high atomic reserve
    caluculations", v3.
    
    The state of the system where the issue exposed shown in oom kill logs:
    
    [  295.998653] Normal free:7728kB boost:0kB min:804kB low:1004kB high:1204kB reserved_highatomic:8192KB active_anon:4kB inactive_anon:0kB active_file:24kB inactive_file:24kB unevictable:1220kB writepending:0kB present:70732kB managed:49224kB mlocked:0kB bounce:0kB free_pcp:688kBlocal_pcp:492kB free_cma:0kB
    [  295.998656] lowmem_reserve[]: 0 32
    [  295.998659] Normal: 508*4kB (UMEH) 241*8kB (UMEH) 143*16kB (UMEH)
    33*32kB (UH) 7*64kB (UH) 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 7752kB
    
    From the above, it is seen that ~16MB of memory reserved for high atomic
    reserves against the expectation of 1% reserves which is fixed in the 1st
    patch.
    
    Don't reserve the high atomic page blocks if 1% of zone memory size is
    below a pageblock size.
    
    
    This patch (of 2):
    
    reserve_highatomic_pageblock() aims to reserve the 1% of the managed pages
    of a zone, which is used for the high order atomic allocations.
    
    It uses the below calculation to reserve:
    static void reserve_highatomic_pageblock(struct page *page, ....) {
    
       .......
       max_managed = (zone_managed_pages(zone) / 100) + pageblock_nr_pages;
    
       if (zone->nr_reserved_highatomic >= max_managed)
           goto out;
    
       zone->nr_reserved_highatomic += pageblock_nr_pages;
       set_pageblock_migratetype(page, MIGRATE_HIGHATOMIC);
       move_freepages_block(zone, page, MIGRATE_HIGHATOMIC, NULL);
    
    out:
       ....
    }
    
    Since we are always appending the 1% of zone managed pages count to
    pageblock_nr_pages, the minimum it is turning into 2 pageblocks as the
    nr_reserved_highatomic is incremented/decremented in pageblock sizes.
    
    Encountered a system(actually a VM running on the Linux kernel) with the
    below zone configuration:
    Normal free:7728kB boost:0kB min:804kB low:1004kB high:1204kB
    reserved_highatomic:8192KB managed:49224kB
    
    The existing calculations making it to reserve the 8MB(with pageblock size
    of 4MB) i.e.  16% of the zone managed memory.  Reserving such high amount
    of memory can easily exert memory pressure in the system thus may lead
    into unnecessary reclaims till unreserving of high atomic reserves.
    
    Since high atomic reserves are managed in pageblock size granules, as
    MIGRATE_HIGHATOMIC is set for such pageblock, fix the calculations for
    high atomic reserves as, minimum is pageblock size , maximum is
    approximately 1% of the zone managed pages.
    
    Link: https://lkml.kernel.org/r/cover.1700821416.git.quic_charante@quicinc.com
    Link: https://lkml.kernel.org/r/1660034138397b82a0a8b6ae51cbe96bd583d89e.1700821416.git.quic_charante@quicinc.com
    
    Signed-off-by: default avatarCharan Teja Kalla <quic_charante@quicinc.com>
    Acked-by: default avatarMel Gorman <mgorman@techsingularity.net>
    Acked-by: default avatarDavid Rientjes <rientjes@google.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Pavankumar Kondeti <quic_pkondeti@quicinc.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    d68e39fc
page_alloc.c 191 KB