From 3dd71156b35cfb6636d59cd48df3cd04ff108219 Mon Sep 17 00:00:00 2001 From: yan chang Date: Tue, 12 Aug 2025 14:34:39 +0800 Subject: [PATCH] ANDROID: vendor_hook: customize gfp and decide whether to bypass in the large folio allocation path This hook is used as a supplement to the previous hook to dynamic modify the gfp and bypass of order pmd: https://android-review.googlesource.com/c/kernel/common/+/3227165 Bug: 438090847 Change-Id: Ia33fdc62ab466cf5cfcc53d02b515e28a1ac1431 Signed-off-by: yan chang --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/mm.h | 3 +++ mm/huge_memory.c | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 55910f0877ad..34764706c6e9 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -582,6 +582,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mem_cgroup_charge); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_filemap_add_folio); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shrink_node); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_customize_thp_gfp_orders); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_customize_pmd_gfp_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_thp_vma_allowable_orders); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpuset_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_uid); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 215f3518caf3..f2fb13af2140 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -603,6 +603,9 @@ DECLARE_HOOK(android_vh_mm_try_split_folio_bypass, DECLARE_HOOK(android_vh_customize_thp_gfp_orders, TP_PROTO(gfp_t *gfp_mask, unsigned long *orders, int *order), TP_ARGS(gfp_mask, orders, order)); +DECLARE_HOOK(android_vh_customize_pmd_gfp_bypass, + TP_PROTO(gfp_t *gfp_mask, bool *bypass), + TP_ARGS(gfp_mask, bypass)); DECLARE_HOOK(android_vh_thp_vma_allowable_orders, TP_PROTO(struct vm_area_struct *vma, unsigned long *orders), TP_ARGS(vma, orders)); diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 230850cda3a2..d7efcca2f33c 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -1281,6 +1281,7 @@ vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf) struct folio *folio; unsigned long haddr = vmf->address & HPAGE_PMD_MASK; vm_fault_t ret; + bool bypass = false; if (!thp_vma_suitable_order(vma, haddr, PMD_ORDER)) return VM_FAULT_FALLBACK; @@ -1330,6 +1331,9 @@ vm_fault_t do_huge_pmd_anonymous_page(struct vm_fault *vmf) return ret; } gfp = vma_thp_gfp_mask(vma); + trace_android_vh_customize_pmd_gfp_bypass(&gfp, &bypass); + if (bypass) + return VM_FAULT_FALLBACK; folio = vma_alloc_folio(gfp, HPAGE_PMD_ORDER, vma, haddr, true); if (unlikely(!folio)) { count_vm_event(THP_FAULT_FALLBACK);