• Barry Song's avatar
    mm: prohibit the last subpage from reusing the entire large folio · cd197c3a
    Barry Song authored
    In a Copy-on-Write (CoW) scenario, the last subpage will reuse the entire
    large folio, resulting in the waste of (nr_pages - 1) pages.  This wasted
    memory remains allocated until it is either unmapped or memory reclamation
    occurs.
    
    The following small program can serve as evidence of this behavior
    
     main()
     {
     #define SIZE 1024 * 1024 * 1024UL
             void *p = malloc(SIZE);
             memset(p, 0x11, SIZE);
             if (fork() == 0)
                     _exit(0);
             memset(p, 0x12, SIZE);
             printf("done\n");
             while(1);
     }
    
    For example, using a 1024KiB mTHP by:
     echo always > /sys/kernel/mm/transparent_hugepage/hugepages-1024kB/enabled
    
    (1) w/o the patch, it takes 2GiB,
    
    Before running the test program,
     / # free -m
                    total        used        free      shared  buff/cache   available
     Mem:            5754          84        5692           0          17        5669
     Swap:              0           0           0
    
     / # /a.out &
     / # done
    
    After running the test program,
     / # free -m
                     total        used        free      shared  buff/cache   available
     Mem:            5754        2149        3627           0          19        3605
     Swap:              0           0           0
    
    (2) w/ the patch, it takes 1GiB only,
    
    Before running the test program,
     / # free -m
                     total        used        free      shared  buff/cache   available
     Mem:            5754          89        5687           0          17        5664
     Swap:              0           0           0
    
     / # /a.out &
     / # done
    
    After running the test program,
     / # free -m
                    total        used        free      shared  buff/cache   available
     Mem:            5754        1122        4655           0          17        4632
     Swap:              0           0           0
    
    This patch migrates the last subpage to a small folio and immediately
    returns the large folio to the system. It benefits both memory availability
    and anti-fragmentation.
    
    Link: https://lkml.kernel.org/r/20240308092721.144735-1-21cnbao@gmail.comSigned-off-by: default avatarBarry Song <v-songbaohua@oppo.com>
    Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
    Cc: Ryan Roberts <ryan.roberts@arm.com>
    Cc: Lance Yang <ioworker0@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    cd197c3a
memory.c 175 KB