diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 491b3b0a8a21..140797269127 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -222,3 +222,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_flush_work_wait_start); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_flush_work_wait_finish); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_enable_thermal_genl_check); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_pages_entry); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_unref_folios_to_pcp_bypass); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 393d7c5b0232..dc99585e39f5 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -11,6 +11,7 @@ struct shmem_inode_info; struct folio; +struct folio_batch; DECLARE_RESTRICTED_HOOK(android_rvh_shmem_get_folio, TP_PROTO(struct shmem_inode_info *info, struct folio **folio), @@ -87,6 +88,10 @@ DECLARE_HOOK(android_vh_alloc_pages_entry, TP_PROTO(gfp_t *gfp, unsigned int order, int preferred_nid, nodemask_t *nodemask), TP_ARGS(gfp, order, preferred_nid, nodemask)); + +DECLARE_HOOK(android_vh_free_unref_folios_to_pcp_bypass, + TP_PROTO(struct folio_batch *folios, bool *bypass), + TP_ARGS(folios, bypass)); #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a821316fa5c7..46921ecdd773 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2703,6 +2703,7 @@ void free_unref_folios(struct folio_batch *folios) struct per_cpu_pages *pcp = NULL; struct zone *locked_zone = NULL; int i, j; + bool skip_free = false; /* Prepare folios for freeing */ for (i = 0, j = 0; i < folios->nr; i++) { @@ -2728,6 +2729,10 @@ void free_unref_folios(struct folio_batch *folios) } folios->nr = j; + trace_android_vh_free_unref_folios_to_pcp_bypass(folios, &skip_free); + if (skip_free) + goto out; + for (i = 0; i < folios->nr; i++) { struct folio *folio = folios->folios[i]; struct zone *zone = folio_zone(folio); @@ -2789,6 +2794,7 @@ void free_unref_folios(struct folio_batch *folios) pcp_spin_unlock(pcp); pcp_trylock_finish(UP_flags); } +out: folio_batch_reinit(folios); }