Hey Andrew, Thanks for taking time to review! I really appreciate your time! BR, Lance On Mon, Jan 29, 2024 at 6:47 PM Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> wrote: > > > The patch titled > Subject: mm/khugepaged: bypassing unnecessary scans with MMF_DISABLE_THP check > has been added to the -mm mm-unstable branch. Its filename is > mm-khugepaged-bypassing-unnecessary-scans-with-mmf_disable_thp-checkpatch > > This patch will shortly appear at > https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/mm-khugepaged-bypassing-unnecessary-scans-with-mmf_disable_thp-check.patch > > This patch will later appear in the mm-unstable branch at > git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm > > Before you just go and hit "reply", please: > a) Consider who else should be cc'ed > b) Prefer to cc a suitable mailing list as well > c) Ideally: find the original patch on the mailing list and do a > reply-to-all to that, adding suitable additional cc's > > *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** > > The -mm tree is included into linux-next via the mm-everything > branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm > and is updated there every 2-3 working days > > ------------------------------------------------------ > From: Lance Yang <ioworker0@xxxxxxxxx> > Subject: mm/khugepaged: bypassing unnecessary scans with MMF_DISABLE_THP check > Date: Mon, 29 Jan 2024 13:45:51 +0800 > > khugepaged scans the entire address space in the background for each given > mm, looking for opportunities to merge sequences of basic pages into huge > pages. However, when an mm is inserted to the mm_slots list, and the > MMF_DISABLE_THP flag is set later, this scanning process becomes > unnecessary for that mm and can be skipped to avoid redundant operations, > especially in scenarios with a large address space. > > This commit introduces a check before each scanning process to test the > MMF_DISABLE_THP flag for the given mm; if the flag is set, the scanning > process is bypassed, thereby improving the efficiency of khugepaged. > > Link: https://lkml.kernel.org/r/20240129054551.57728-1-ioworker0@xxxxxxxxx > Signed-off-by: Lance Yang <ioworker0@xxxxxxxxx> > Cc: David Hildenbrand <david@xxxxxxxxxx> > Cc: Michal Hocko <mhocko@xxxxxxxx> > Cc: Minchan Kim <minchan@xxxxxxxxxx> > Cc: Muchun Song <songmuchun@xxxxxxxxxxxxx> > Cc: Peter Xu <peterx@xxxxxxxxxx> > Cc: Zach O'Keefe <zokeefe@xxxxxxxxxx> > Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > --- > > mm/khugepaged.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > --- a/mm/khugepaged.c~mm-khugepaged-bypassing-unnecessary-scans-with-mmf_disable_thp-check > +++ a/mm/khugepaged.c > @@ -410,6 +410,12 @@ static inline int hpage_collapse_test_ex > return atomic_read(&mm->mm_users) == 0; > } > > +static inline int hpage_collapse_test_exit_or_disable(struct mm_struct *mm) > +{ > + return hpage_collapse_test_exit(mm) || > + test_bit(MMF_DISABLE_THP, &mm->flags); > +} > + > void __khugepaged_enter(struct mm_struct *mm) > { > struct khugepaged_mm_slot *mm_slot; > @@ -1422,7 +1428,7 @@ static void collect_mm_slot(struct khuge > > lockdep_assert_held(&khugepaged_mm_lock); > > - if (hpage_collapse_test_exit(mm)) { > + if (hpage_collapse_test_exit_or_disable(mm)) { > /* free mm_slot */ > hash_del(&slot->hash); > list_del(&slot->mm_node); > @@ -2360,7 +2366,7 @@ static unsigned int khugepaged_scan_mm_s > goto breakouterloop_mmap_lock; > > progress++; > - if (unlikely(hpage_collapse_test_exit(mm))) > + if (unlikely(hpage_collapse_test_exit_or_disable(mm))) > goto breakouterloop; > > vma_iter_init(&vmi, mm, khugepaged_scan.address); > @@ -2368,7 +2374,7 @@ static unsigned int khugepaged_scan_mm_s > unsigned long hstart, hend; > > cond_resched(); > - if (unlikely(hpage_collapse_test_exit(mm))) { > + if (unlikely(hpage_collapse_test_exit_or_disable(mm))) { > progress++; > break; > } > @@ -2390,7 +2396,7 @@ skip: > bool mmap_locked = true; > > cond_resched(); > - if (unlikely(hpage_collapse_test_exit(mm))) > + if (unlikely(hpage_collapse_test_exit_or_disable(mm))) > goto breakouterloop; > > VM_BUG_ON(khugepaged_scan.address < hstart || > @@ -2408,7 +2414,7 @@ skip: > fput(file); > if (*result == SCAN_PTE_MAPPED_HUGEPAGE) { > mmap_read_lock(mm); > - if (hpage_collapse_test_exit(mm)) > + if (hpage_collapse_test_exit_or_disable(mm)) > goto breakouterloop; > *result = collapse_pte_mapped_thp(mm, > khugepaged_scan.address, false); > @@ -2450,7 +2456,7 @@ breakouterloop_mmap_lock: > * Release the current mm_slot if this mm is about to die, or > * if we scanned all vmas of this mm. > */ > - if (hpage_collapse_test_exit(mm) || !vma) { > + if (hpage_collapse_test_exit_or_disable(mm) || !vma) { > /* > * Make sure that if mm_users is reaching zero while > * khugepaged runs here, khugepaged_exit will find > _ > > Patches currently in -mm which might be from ioworker0@xxxxxxxxx are > > mm-khugepaged-bypassing-unnecessary-scans-with-mmf_disable_thp-check.patch >