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))) + 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