• Yu Zhao's avatar
    mm/codetag: fix pgalloc_tag_split() · 95599ef6
    Yu Zhao authored
    The current assumption is that a large folio can only be split into
    order-0 folios.  That is not the case for hugeTLB demotion, nor for THP
    split: see commit c010d47f ("mm: thp: split huge page to any lower
    order pages").
    
    When a large folio is split into ones of a lower non-zero order, only the
    new head pages should be tagged.  Tagging tail pages can cause imbalanced
    "calls" counters, since only head pages are untagged by pgalloc_tag_sub()
    and the "calls" counts on tail pages are leaked, e.g.,
    
      # echo 2048kB >/sys/kernel/mm/hugepages/hugepages-1048576kB/demote_size
      # echo 700 >/sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
      # time echo 700 >/sys/kernel/mm/hugepages/hugepages-1048576kB/demote
      # echo 0 >/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
      # grep alloc_gigantic_folio /proc/allocinfo
    
    Before this patch:
      0  549427200  mm/hugetlb.c:1549 func:alloc_gigantic_folio
    
      real  0m2.057s
      user  0m0.000s
      sys   0m2.051s
    
    After this patch:
      0          0  mm/hugetlb.c:1549 func:alloc_gigantic_folio
    
      real  0m1.711s
      user  0m0.000s
      sys   0m1.704s
    
    Not tagging tail pages also improves the splitting time, e.g., by about
    15% when demoting 1GB hugeTLB folios to 2MB ones, as shown above.
    
    Link: https://lkml.kernel.org/r/20240906042108.1150526-2-yuzhao@google.com
    Fixes: be25d1d4 ("mm: create new codetag references during page splitting")
    Signed-off-by: default avatarYu Zhao <yuzhao@google.com>
    Acked-by: default avatarSuren Baghdasaryan <surenb@google.com>
    Cc: Kent Overstreet <kent.overstreet@linux.dev>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    95599ef6
page_alloc.c 197 KB