From 8fb77f6f9d20be56cd76b579b2830eb287e2e8bb Mon Sep 17 00:00:00 2001 From: Yang Yang Date: Wed, 4 Jun 2025 12:04:42 +0800 Subject: [PATCH] ANDROID: mm: Reset unused page flag bits on free Add vendor hook to reset unused bits in page flags to zero when releasing a page. This reserves space for OEMs to define vendor-specific features. Bug: 420361650 Change-Id: Ife2b96de64eea670d257f1a8d9fd07d16c0ddc83 Signed-off-by: Yang Yang --- drivers/android/vendor_hooks.c | 1 + include/trace/hooks/mm.h | 3 +++ mm/page_alloc.c | 2 ++ 3 files changed, 6 insertions(+) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 83c2a3762a12..eaea41831d1f 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -490,6 +490,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_lruvec_add_folio); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_lruvec_del_folio); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_add_lazyfree_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_do_async_mmap_readahead); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_free_page); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_update_page_mapcount); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_add_page_to_lrulist); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_del_page_from_lrulist); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index ff7a58282371..00df4c5ea263 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -431,6 +431,9 @@ DECLARE_HOOK(android_vh_add_lazyfree_bypass, DECLARE_HOOK(android_vh_do_async_mmap_readahead, TP_PROTO(struct vm_fault *vmf, struct folio *folio, bool *skip), TP_ARGS(vmf, folio, skip)); +DECLARE_HOOK(android_vh_mm_free_page, + TP_PROTO(struct page *page), + TP_ARGS(page)); DECLARE_HOOK(android_vh_cma_debug_show_areas, TP_PROTO(bool *show), diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 419e9bbd2c0c..fa46ee0edb8d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1238,6 +1238,7 @@ static __always_inline bool free_pages_prepare(struct page *page, } } (page + i)->flags &= ~PAGE_FLAGS_CHECK_AT_PREP; + trace_android_vh_mm_free_page(page + i); } } if (PageMappingFlags(page)) @@ -1253,6 +1254,7 @@ static __always_inline bool free_pages_prepare(struct page *page, page_cpupid_reset_last(page); page->flags &= ~PAGE_FLAGS_CHECK_AT_PREP; + trace_android_vh_mm_free_page(page); reset_page_owner(page, order); free_page_pinner(page, order); page_table_check_free(page, order);