On Wed, Sep 10, 2025 at 10:44:40AM +0800, Yafang Shao wrote: > The new BPF capability enables finer-grained THP policy decisions by > introducing separate handling for swap faults versus normal page faults. > > As highlighted by Barry: > > We’ve observed that swapping in large folios can lead to more > swap thrashing for some workloads- e.g. kernel build. Consequently, > some workloads might prefer swapping in smaller folios than those > allocated by alloc_anon_folio(). > > While prtcl() could potentially be extended to leverage this new policy, > doing so would require modifications to the uAPI. > > Signed-off-by: Yafang Shao <laoar.shao@xxxxxxxxx> Other than nits, these seems fine, so: Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> > Cc: Barry Song <21cnbao@xxxxxxxxx> > --- > include/linux/huge_mm.h | 3 ++- > mm/huge_memory.c | 2 +- > mm/memory.c | 2 +- > 3 files changed, 4 insertions(+), 3 deletions(-) > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index f72a5fd04e4f..b9742453806f 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -97,9 +97,10 @@ extern struct kobj_attribute thpsize_shmem_enabled_attr; > > enum tva_type { > TVA_SMAPS, /* Exposing "THPeligible:" in smaps. */ > - TVA_PAGEFAULT, /* Serving a page fault. */ > + TVA_PAGEFAULT, /* Serving a non-swap page fault. */ > TVA_KHUGEPAGED, /* Khugepaged collapse. */ > TVA_FORCED_COLLAPSE, /* Forced collapse (e.g. MADV_COLLAPSE). */ > + TVA_SWAP, /* Serving a swap */ Serving a swap what? :) I think TVA_SWAP_PAGEFAULT would be better here right? And 'serving a swap page fault'. > }; > > #define thp_vma_allowable_order(vma, vm_flags, type, order) \ > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 26cedfcd7418..523153d21a41 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -103,7 +103,7 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma, > unsigned long orders) > { > const bool smaps = type == TVA_SMAPS; > - const bool in_pf = type == TVA_PAGEFAULT; > + const bool in_pf = (type == TVA_PAGEFAULT || type == TVA_SWAP); > const bool forced_collapse = type == TVA_FORCED_COLLAPSE; > unsigned long supported_orders; > > diff --git a/mm/memory.c b/mm/memory.c > index d9de6c056179..d8819cac7930 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -4515,7 +4515,7 @@ static struct folio *alloc_swap_folio(struct vm_fault *vmf) > * Get a list of all the (large) orders below PMD_ORDER that are enabled > * and suitable for swapping THP. > */ > - orders = thp_vma_allowable_orders(vma, vma->vm_flags, TVA_PAGEFAULT, > + orders = thp_vma_allowable_orders(vma, vma->vm_flags, TVA_SWAP, > BIT(PMD_ORDER) - 1); > orders = thp_vma_suitable_orders(vma, vmf->address, orders); > orders = thp_swap_suitable_orders(swp_offset(entry), > -- > 2.47.3 >