On 29 May 2025, at 4:23, Baolin Wang wrote: > The MADV_COLLAPSE will ignore the system-wide Anon THP sysfs settings, which > means that even though we have disabled the Anon THP configuration, MADV_COLLAPSE > will still attempt to collapse into a Anon THP. This violates the rule we have > agreed upon: never means never. > > To address this issue, should check whether the Anon THP configuration is disabled > in thp_vma_allowable_orders(), even when the TVA_ENFORCE_SYSFS flag is set. > > Signed-off-by: Baolin Wang <baolin.wang@xxxxxxxxxxxxxxxxx> > --- > include/linux/huge_mm.h | 23 +++++++++++++++++++---- > 1 file changed, 19 insertions(+), 4 deletions(-) > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index 2f190c90192d..199ddc9f04a1 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -287,20 +287,35 @@ unsigned long thp_vma_allowable_orders(struct vm_area_struct *vma, > unsigned long orders) > { > /* Optimization to check if required orders are enabled early. */ > - if ((tva_flags & TVA_ENFORCE_SYSFS) && vma_is_anonymous(vma)) { > - unsigned long mask = READ_ONCE(huge_anon_orders_always); > + if (vma_is_anonymous(vma)) { > + unsigned long always = READ_ONCE(huge_anon_orders_always); > + unsigned long madvise = READ_ONCE(huge_anon_orders_madvise); > + unsigned long inherit = READ_ONCE(huge_anon_orders_inherit); > + unsigned long mask = always | madvise; > + > + /* > + * If the system-wide THP/mTHP sysfs settings are disabled, > + * then we should never allow hugepages. > + */ > + if (!(mask & orders) && !(hugepage_global_enabled() && (inherit & orders))) Can you explain the logic here? Is it equivalent to: 1. if THP is set to always, always_mask & orders == 0, or 2. if THP if set to madvise, madvise_mask & order == 0, or 3. if THP is set to inherit, inherit_mask & order == 0? I cannot figure out why (always | madvise) & orders does not check THP enablement case, but inherit & orders checks hugepage_global_enabled(). Thanks. > + return 0; > + > + if (!(tva_flags & TVA_ENFORCE_SYSFS)) > + goto skip; > > + mask = always; > if (vm_flags & VM_HUGEPAGE) > - mask |= READ_ONCE(huge_anon_orders_madvise); > + mask |= madvise; > if (hugepage_global_always() || > ((vm_flags & VM_HUGEPAGE) && hugepage_global_enabled())) > - mask |= READ_ONCE(huge_anon_orders_inherit); > + mask |= inherit; > > orders &= mask; > if (!orders) > return 0; > } > > +skip: > return __thp_vma_allowable_orders(vma, vm_flags, tva_flags, orders); > } > > -- > 2.43.5 Best Regards, Yan, Zi