* [PATCH RFC v3 1/7] mm/memcontrol: drop unused vmscan tracepoint include
2026-10-13 13:13 [PATCH RFC v3 0/7] mm/vmscan: move vmscan tracepoints to a local header Ridong Chen
@ 2026-10-13 13:13 ` Ridong Chen
2026-10-13 13:13 ` [PATCH RFC v3 2/7] mm/vmscan: move vmscan tracepoints to a local header Ridong Chen
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Ridong Chen @ 2026-10-13 13:13 UTC (permalink / raw)
To: Steven Rostedt, Masami Hiramatsu, Johannes Weiner, Michal Hocko,
Roman Gushchin, Shakeel Butt, Andrew Morton, Dave Chinner
Cc: Mathieu Desnoyers, Muchun Song, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Kairui Song, Barry Song, Axel Rasmussen,
Yuanchu Xie, Wei Xu, Baoquan He, Baolin Wang, linux-kernel,
linux-trace-kernel,
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:BPF [MISC]:Keyword:(?:b|_)bpf(?:b|_), Ridong Chen,
Ridong Chen
From: Ridong Chen <chenridong@xiaomi.com>
memcontrol.c includes <trace/events/vmscan.h> but does not use any of
the tracepoints or macros it defines: all tracepoints invoked here come
from memcg.h and writeback.h.
Drop it ahead of moving the vmscan trace header under mm/, after which
<trace/events/vmscan.h> will no longer exist.
No functional change.
Assisted-by: LLM
Acked-by: Muchun Song <muchun.song@linux.dev>
Signed-off-by: Ridong Chen <chenridong@xiaomi.com>
---
mm/memcontrol.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index aad0498a7bd6..95c2322d4a6f 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -77,8 +77,6 @@
#include <trace/events/memcg.h>
#undef CREATE_TRACE_POINTS
-#include <trace/events/vmscan.h>
-
struct cgroup_subsys memory_cgrp_subsys __read_mostly;
EXPORT_SYMBOL(memory_cgrp_subsys);
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC v3 2/7] mm/vmscan: move vmscan tracepoints to a local header
2026-10-13 13:13 [PATCH RFC v3 0/7] mm/vmscan: move vmscan tracepoints to a local header Ridong Chen
2026-10-13 13:13 ` [PATCH RFC v3 1/7] mm/memcontrol: drop unused vmscan tracepoint include Ridong Chen
@ 2026-10-13 13:13 ` Ridong Chen
2026-10-13 13:13 ` [PATCH RFC v3 3/7] mm/vmscan: move struct scan_control to a dedicated header Ridong Chen
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Ridong Chen @ 2026-10-13 13:13 UTC (permalink / raw)
To: Steven Rostedt, Masami Hiramatsu, Johannes Weiner, Michal Hocko,
Roman Gushchin, Shakeel Butt, Andrew Morton, Dave Chinner
Cc: Mathieu Desnoyers, Muchun Song, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Kairui Song, Barry Song, Axel Rasmussen,
Yuanchu Xie, Wei Xu, Baoquan He, Baolin Wang, linux-kernel,
linux-trace-kernel,
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:BPF [MISC]:Keyword:(?:b|_)bpf(?:b|_), Ridong Chen,
Ridong Chen
From: Ridong Chen <chenridong@xiaomi.com>
Move include/trace/events/vmscan.h to mm/trace_vmscan.h so that the
tracepoints can be extended to reference vmscan-internal structures such
as struct scan_control, which is not visible outside mm/. This mirrors
what several other subsystems already do with their trace headers (e.g.
arch/x86/kvm/trace.h, drivers/gpu/drm/drm_trace.h, net/xfrm/trace_iptfs.h).
As they do, use a relative TRACE_INCLUDE_PATH so that no Makefile change
is needed.
No functional change.
Assisted-by: LLM
Signed-off-by: Ridong Chen <chenridong@xiaomi.com>
---
MAINTAINERS | 2 ++
mm/shrinker.c | 2 +-
include/trace/events/vmscan.h => mm/trace_vmscan.h | 4 ++++
mm/vmscan.c | 2 +-
4 files changed, 8 insertions(+), 2 deletions(-)
rename include/trace/events/vmscan.h => mm/trace_vmscan.h (99%)
diff --git a/MAINTAINERS b/MAINTAINERS
index c5519d67b6f4..80d2a9dd0525 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17575,6 +17575,7 @@ F: Documentation/admin-guide/mm/multigen_lru.rst
F: Documentation/mm/multigen_lru.rst
F: include/linux/mm_inline.h
F: include/linux/mmzone.h
+F: mm/trace_vmscan.h
F: mm/vmscan.c
F: mm/workingset.c
@@ -17722,6 +17723,7 @@ R: Shakeel Butt <shakeel.butt@linux.dev>
R: Lorenzo Stoakes <ljs@kernel.org>
L: linux-mm@kvack.org
S: Maintained
+F: mm/trace_vmscan.h
F: mm/vmscan.c
F: mm/workingset.c
diff --git a/mm/shrinker.c b/mm/shrinker.c
index 7ec2a9704f6f..3c3e87c4b61c 100644
--- a/mm/shrinker.c
+++ b/mm/shrinker.c
@@ -3,7 +3,7 @@
#include <linux/rwsem.h>
#include <linux/shrinker.h>
#include <linux/rculist.h>
-#include <trace/events/vmscan.h>
+#include "trace_vmscan.h"
#include "internal.h"
diff --git a/include/trace/events/vmscan.h b/mm/trace_vmscan.h
similarity index 99%
rename from include/trace/events/vmscan.h
rename to mm/trace_vmscan.h
index 8a872990b4be..c5d824fef554 100644
--- a/include/trace/events/vmscan.h
+++ b/mm/trace_vmscan.h
@@ -648,4 +648,8 @@ TRACE_EVENT(mm_vmscan_kswapd_clear_hopeless,
#endif /* _TRACE_VMSCAN_H */
/* This part must be outside protection */
+#undef TRACE_INCLUDE_FILE
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH ../../mm
+#define TRACE_INCLUDE_FILE trace_vmscan
#include <trace/define_trace.h>
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 29b31446fc11..6207dad9e644 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -71,7 +71,7 @@
#include "swap.h"
#define CREATE_TRACE_POINTS
-#include <trace/events/vmscan.h>
+#include "trace_vmscan.h"
struct scan_control {
/* How many pages shrink_list() should reclaim */
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC v3 3/7] mm/vmscan: move struct scan_control to a dedicated header
2026-10-13 13:13 [PATCH RFC v3 0/7] mm/vmscan: move vmscan tracepoints to a local header Ridong Chen
2026-10-13 13:13 ` [PATCH RFC v3 1/7] mm/memcontrol: drop unused vmscan tracepoint include Ridong Chen
2026-10-13 13:13 ` [PATCH RFC v3 2/7] mm/vmscan: move vmscan tracepoints to a local header Ridong Chen
@ 2026-10-13 13:13 ` Ridong Chen
2026-10-13 13:13 ` [PATCH RFC v3 4/7] mm/vmscan: pass scan_control to the reclaim-begin tracepoints Ridong Chen
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Ridong Chen @ 2026-10-13 13:13 UTC (permalink / raw)
To: Steven Rostedt, Masami Hiramatsu, Johannes Weiner, Michal Hocko,
Roman Gushchin, Shakeel Butt, Andrew Morton, Dave Chinner
Cc: Mathieu Desnoyers, Muchun Song, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Kairui Song, Barry Song, Axel Rasmussen,
Yuanchu Xie, Wei Xu, Baoquan He, Baolin Wang, linux-kernel,
linux-trace-kernel,
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:BPF [MISC]:Keyword:(?:b|_)bpf(?:b|_), Ridong Chen,
Ridong Chen
From: Ridong Chen <chenridong@xiaomi.com>
The definition of struct scan_control has lived inline at the top of
mm/vmscan.c. Move it out to a new mm/vmscan.h so the reclaim-internal
state can be referenced from other reclaim translation units without
duplicating the definition.
The header uses an ordinary include guard and pulls in only what the
struct needs (nodemask_t, gfp_t and struct reclaim_state).
mm/trace_vmscan.h includes the new header directly so that any
translation unit pulling in the trace events (mm/vmscan.c, mm/shrinker.c)
sees the full definition of struct scan_control regardless of include
order.
No functional change.
Assisted-by: LLM
Signed-off-by: Ridong Chen <chenridong@xiaomi.com>
---
MAINTAINERS | 2 +
mm/trace_vmscan.h | 2 +
mm/vmscan.c | 108 ------------------------------------------
mm/vmscan.h | 118 ++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 122 insertions(+), 108 deletions(-)
create mode 100644 mm/vmscan.h
diff --git a/MAINTAINERS b/MAINTAINERS
index 80d2a9dd0525..1f2d7dcbfd1b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17577,6 +17577,7 @@ F: include/linux/mm_inline.h
F: include/linux/mmzone.h
F: mm/trace_vmscan.h
F: mm/vmscan.c
+F: mm/vmscan.h
F: mm/workingset.c
MEMORY MANAGEMENT - MIGRATION
@@ -17725,6 +17726,7 @@ L: linux-mm@kvack.org
S: Maintained
F: mm/trace_vmscan.h
F: mm/vmscan.c
+F: mm/vmscan.h
F: mm/workingset.c
MEMORY MANAGEMENT - RMAP (REVERSE MAPPING)
diff --git a/mm/trace_vmscan.h b/mm/trace_vmscan.h
index c5d824fef554..91fb1c30dd46 100644
--- a/mm/trace_vmscan.h
+++ b/mm/trace_vmscan.h
@@ -11,6 +11,8 @@
#include <linux/memcontrol.h>
#include <trace/events/mmflags.h>
+#include "vmscan.h"
+
#define RECLAIM_WB_ANON 0x0001u
#define RECLAIM_WB_FILE 0x0002u
#define RECLAIM_WB_MIXED 0x0010u
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 6207dad9e644..ab118f6b32eb 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -73,114 +73,6 @@
#define CREATE_TRACE_POINTS
#include "trace_vmscan.h"
-struct scan_control {
- /* How many pages shrink_list() should reclaim */
- unsigned long nr_to_reclaim;
-
- /*
- * Nodemask of nodes allowed by the caller. If NULL, all nodes
- * are scanned.
- */
- const nodemask_t *nodemask;
-
- /*
- * The memory cgroup that hit its limit and as a result is the
- * primary target of this reclaim invocation.
- */
- struct mem_cgroup *target_mem_cgroup;
-
- /*
- * Scan pressure balancing between anon and file LRUs
- */
- unsigned long anon_cost;
- unsigned long file_cost;
-
- /* Swappiness value for proactive reclaim. Always use sc_swappiness()! */
- int *proactive_swappiness;
-
- /* Can active folios be deactivated as part of reclaim? */
-#define DEACTIVATE_ANON 1
-#define DEACTIVATE_FILE 2
- unsigned int may_deactivate:2;
- unsigned int force_deactivate:1;
- unsigned int skipped_deactivate:1;
-
- /* zone_reclaim_mode, boost reclaim */
- unsigned int may_writepage:1;
-
- /* zone_reclaim_mode */
- unsigned int may_unmap:1;
-
- /* zone_reclaim_mode, boost reclaim, cgroup restrictions */
- unsigned int may_swap:1;
-
- /* Not allow cache_trim_mode to be turned on as part of reclaim? */
- unsigned int no_cache_trim_mode:1;
-
- /* Has cache_trim_mode failed at least once? */
- unsigned int cache_trim_mode_failed:1;
-
- /* Proactive reclaim invoked by userspace */
- unsigned int proactive:1;
-
- /*
- * Cgroup memory below memory.low is protected as long as we
- * don't threaten to OOM. If any cgroup is reclaimed at
- * reduced force or passed over entirely due to its memory.low
- * setting (memcg_low_skipped), and nothing is reclaimed as a
- * result, then go back for one more cycle that reclaims the protected
- * memory (memcg_low_reclaim) to avert OOM.
- */
- unsigned int memcg_low_reclaim:1;
- unsigned int memcg_low_skipped:1;
-
- /* Shared cgroup tree walk failed, rescan the whole tree */
- unsigned int memcg_full_walk:1;
-
- unsigned int hibernation_mode:1;
-
- /* One of the zones is ready for compaction */
- unsigned int compaction_ready:1;
-
- /* There is easily reclaimable cold cache in the current node */
- unsigned int cache_trim_mode:1;
-
- /* The file folios on the current node are dangerously low */
- unsigned int file_is_tiny:1;
-
- /* Always discard instead of demoting to lower tier memory */
- unsigned int no_demotion:1;
-
- /* Allocation order */
- s8 order;
-
- /* Scan (total_size >> priority) pages at once */
- s8 priority;
-
- /* The highest zone to isolate folios for reclaim from */
- s8 reclaim_idx;
-
- /* This context's GFP mask */
- gfp_t gfp_mask;
-
- /* Incremented by the number of inactive pages that were scanned */
- unsigned long nr_scanned;
-
- /* Number of pages freed so far during a call to shrink_zones() */
- unsigned long nr_reclaimed;
-
- struct {
- unsigned int dirty;
- unsigned int congested;
- unsigned int writeback;
- unsigned int immediate;
- unsigned int taken;
- } nr;
-
- /* for recording the reclaimed slab by now */
- struct reclaim_state reclaim_state;
-};
-
#ifdef ARCH_HAS_PREFETCHW
static inline void prefetchw_prev_lru_folio(struct folio *folio,
struct list_head *base)
diff --git a/mm/vmscan.h b/mm/vmscan.h
new file mode 100644
index 000000000000..adb22e80d760
--- /dev/null
+++ b/mm/vmscan.h
@@ -0,0 +1,118 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _MM_VMSCAN_H
+#define _MM_VMSCAN_H
+
+#include <linux/gfp_types.h>
+#include <linux/nodemask.h>
+#include <linux/swap.h>
+#include <linux/types.h>
+
+struct scan_control {
+ /* How many pages shrink_list() should reclaim */
+ unsigned long nr_to_reclaim;
+
+ /*
+ * Nodemask of nodes allowed by the caller. If NULL, all nodes
+ * are scanned.
+ */
+ const nodemask_t *nodemask;
+
+ /*
+ * The memory cgroup that hit its limit and as a result is the
+ * primary target of this reclaim invocation.
+ */
+ struct mem_cgroup *target_mem_cgroup;
+
+ /*
+ * Scan pressure balancing between anon and file LRUs
+ */
+ unsigned long anon_cost;
+ unsigned long file_cost;
+
+ /* Swappiness value for proactive reclaim. Always use sc_swappiness()! */
+ int *proactive_swappiness;
+
+ /* Can active folios be deactivated as part of reclaim? */
+#define DEACTIVATE_ANON 1
+#define DEACTIVATE_FILE 2
+ unsigned int may_deactivate:2;
+ unsigned int force_deactivate:1;
+ unsigned int skipped_deactivate:1;
+
+ /* zone_reclaim_mode, boost reclaim */
+ unsigned int may_writepage:1;
+
+ /* zone_reclaim_mode */
+ unsigned int may_unmap:1;
+
+ /* zone_reclaim_mode, boost reclaim, cgroup restrictions */
+ unsigned int may_swap:1;
+
+ /* Not allow cache_trim_mode to be turned on as part of reclaim? */
+ unsigned int no_cache_trim_mode:1;
+
+ /* Has cache_trim_mode failed at least once? */
+ unsigned int cache_trim_mode_failed:1;
+
+ /* Proactive reclaim invoked by userspace */
+ unsigned int proactive:1;
+
+ /*
+ * Cgroup memory below memory.low is protected as long as we
+ * don't threaten to OOM. If any cgroup is reclaimed at
+ * reduced force or passed over entirely due to its memory.low
+ * setting (memcg_low_skipped), and nothing is reclaimed as a
+ * result, then go back for one more cycle that reclaims the protected
+ * memory (memcg_low_reclaim) to avert OOM.
+ */
+ unsigned int memcg_low_reclaim:1;
+ unsigned int memcg_low_skipped:1;
+
+ /* Shared cgroup tree walk failed, rescan the whole tree */
+ unsigned int memcg_full_walk:1;
+
+ unsigned int hibernation_mode:1;
+
+ /* One of the zones is ready for compaction */
+ unsigned int compaction_ready:1;
+
+ /* There is easily reclaimable cold cache in the current node */
+ unsigned int cache_trim_mode:1;
+
+ /* The file folios on the current node are dangerously low */
+ unsigned int file_is_tiny:1;
+
+ /* Always discard instead of demoting to lower tier memory */
+ unsigned int no_demotion:1;
+
+ /* Allocation order */
+ s8 order;
+
+ /* Scan (total_size >> priority) pages at once */
+ s8 priority;
+
+ /* The highest zone to isolate folios for reclaim from */
+ s8 reclaim_idx;
+
+ /* This context's GFP mask */
+ gfp_t gfp_mask;
+
+ /* Incremented by the number of inactive pages that were scanned */
+ unsigned long nr_scanned;
+
+ /* Number of pages freed so far during a call to shrink_zones() */
+ unsigned long nr_reclaimed;
+
+ struct {
+ unsigned int dirty;
+ unsigned int congested;
+ unsigned int writeback;
+ unsigned int immediate;
+ unsigned int taken;
+ } nr;
+
+ /* for recording the reclaimed slab by now */
+ struct reclaim_state reclaim_state;
+};
+
+#endif /* _MM_VMSCAN_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC v3 4/7] mm/vmscan: pass scan_control to the reclaim-begin tracepoints
2026-10-13 13:13 [PATCH RFC v3 0/7] mm/vmscan: move vmscan tracepoints to a local header Ridong Chen
` (2 preceding siblings ...)
2026-10-13 13:13 ` [PATCH RFC v3 3/7] mm/vmscan: move struct scan_control to a dedicated header Ridong Chen
@ 2026-10-13 13:13 ` Ridong Chen
2026-10-13 13:13 ` [PATCH RFC v3 5/7] mm/vmscan: pass scan_control to the LRU isolate/shrink tracepoints Ridong Chen
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Ridong Chen @ 2026-10-13 13:13 UTC (permalink / raw)
To: Steven Rostedt, Masami Hiramatsu, Johannes Weiner, Michal Hocko,
Roman Gushchin, Shakeel Butt, Andrew Morton, Dave Chinner
Cc: Mathieu Desnoyers, Muchun Song, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Kairui Song, Barry Song, Axel Rasmussen,
Yuanchu Xie, Wei Xu, Baoquan He, Baolin Wang, linux-kernel,
linux-trace-kernel,
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:BPF [MISC]:Keyword:(?:b|_)bpf(?:b|_), Ridong Chen,
Ridong Chen
From: Ridong Chen <chenridong@xiaomi.com>
The reclaim-begin tracepoints describe the entry conditions of a reclaim
invocation, which struct scan_control already carries. Now that the struct
is visible from the trace header, pass sc directly and pick the fields out
in TP_fast_assign instead of spelling out gfp_mask and order at every
callsite.
No functional change. The tracefs event format (TP_STRUCT__entry and
TP_printk) is unchanged, so tracefs-based consumers are unaffected.
BPF programs attached via raw_tp/tp_btf see the new TP_PROTO and need
to be adjusted; tracepoints are not a stable ABI (see
Documentation/bpf/bpf_design_QA.rst).
Assisted-by: LLM
Signed-off-by: Ridong Chen <chenridong@xiaomi.com>
---
mm/trace_vmscan.h | 24 ++++++++++++------------
mm/vmscan.c | 7 +++----
2 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/mm/trace_vmscan.h b/mm/trace_vmscan.h
index 91fb1c30dd46..28561fda83b3 100644
--- a/mm/trace_vmscan.h
+++ b/mm/trace_vmscan.h
@@ -178,9 +178,9 @@ TRACE_EVENT(mm_vmscan_wakeup_kswapd,
DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_begin_template,
- TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg),
+ TP_PROTO(struct scan_control *sc, struct mem_cgroup *memcg),
- TP_ARGS(gfp_flags, order, memcg),
+ TP_ARGS(sc, memcg),
TP_STRUCT__entry(
__field( unsigned long, gfp_flags )
@@ -189,8 +189,8 @@ DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_begin_template,
),
TP_fast_assign(
- __entry->gfp_flags = (__force unsigned long)gfp_flags;
- __entry->order = order;
+ __entry->gfp_flags = (__force unsigned long)sc->gfp_mask;
+ __entry->order = sc->order;
__entry->memcg_id = mem_cgroup_id(memcg);
),
@@ -204,17 +204,17 @@ DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_begin_template,
DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_direct_reclaim_begin,
- TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg),
+ TP_PROTO(struct scan_control *sc, struct mem_cgroup *memcg),
- TP_ARGS(gfp_flags, order, memcg)
+ TP_ARGS(sc, memcg)
);
#ifdef CONFIG_MEMCG
DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_reclaim_begin,
- TP_PROTO(gfp_t gfp_flags, int order, struct mem_cgroup *memcg),
+ TP_PROTO(struct scan_control *sc, struct mem_cgroup *memcg),
- TP_ARGS(gfp_flags, order, memcg)
+ TP_ARGS(sc, memcg)
);
#endif /* CONFIG_MEMCG */
@@ -551,9 +551,9 @@ TRACE_EVENT(mm_vmscan_lru_shrink_active,
TRACE_EVENT(mm_vmscan_node_reclaim_begin,
- TP_PROTO(int nid, int order, gfp_t gfp_flags),
+ TP_PROTO(int nid, struct scan_control *sc),
- TP_ARGS(nid, order, gfp_flags),
+ TP_ARGS(nid, sc),
TP_STRUCT__entry(
__field(int, nid)
@@ -563,8 +563,8 @@ TRACE_EVENT(mm_vmscan_node_reclaim_begin,
TP_fast_assign(
__entry->nid = nid;
- __entry->order = order;
- __entry->gfp_flags = (__force unsigned long)gfp_flags;
+ __entry->order = sc->order;
+ __entry->gfp_flags = (__force unsigned long)sc->gfp_mask;
),
TP_printk("nid=%d order=%d gfp_flags=%s",
diff --git a/mm/vmscan.c b/mm/vmscan.c
index ab118f6b32eb..2979d0d819a8 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -6885,7 +6885,7 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
return 1;
set_task_reclaim_state(current, &sc.reclaim_state);
- trace_mm_vmscan_direct_reclaim_begin(sc.gfp_mask, order, NULL);
+ trace_mm_vmscan_direct_reclaim_begin(&sc, NULL);
nr_reclaimed = do_try_to_free_pages(zonelist, &sc);
@@ -6926,7 +6926,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,
struct zonelist *zonelist = node_zonelist(numa_node_id(), sc.gfp_mask);
set_task_reclaim_state(current, &sc.reclaim_state);
- trace_mm_vmscan_memcg_reclaim_begin(sc.gfp_mask, 0, memcg);
+ trace_mm_vmscan_memcg_reclaim_begin(&sc, memcg);
noreclaim_flag = memalloc_noreclaim_save();
nr_reclaimed = do_try_to_free_pages(zonelist, &sc);
@@ -7882,8 +7882,7 @@ static unsigned long __node_reclaim(struct pglist_data *pgdat,
unsigned int noreclaim_flag;
unsigned long pflags;
- trace_mm_vmscan_node_reclaim_begin(pgdat->node_id, sc->order,
- sc->gfp_mask);
+ trace_mm_vmscan_node_reclaim_begin(pgdat->node_id, sc);
cond_resched();
psi_memstall_enter(&pflags);
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC v3 5/7] mm/vmscan: pass scan_control to the LRU isolate/shrink tracepoints
2026-10-13 13:13 [PATCH RFC v3 0/7] mm/vmscan: move vmscan tracepoints to a local header Ridong Chen
` (3 preceding siblings ...)
2026-10-13 13:13 ` [PATCH RFC v3 4/7] mm/vmscan: pass scan_control to the reclaim-begin tracepoints Ridong Chen
@ 2026-10-13 13:13 ` Ridong Chen
2026-10-13 13:13 ` [PATCH RFC v3 6/7] mm/vmscan: pass scan_control to mm_vmscan_reclaim_pages Ridong Chen
2026-10-13 13:13 ` [PATCH RFC v3 7/7] mm/vmscan: pass scan_control to mm_vmscan_balance_pgdat_end Ridong Chen
6 siblings, 0 replies; 8+ messages in thread
From: Ridong Chen @ 2026-10-13 13:13 UTC (permalink / raw)
To: Steven Rostedt, Masami Hiramatsu, Johannes Weiner, Michal Hocko,
Roman Gushchin, Shakeel Butt, Andrew Morton, Dave Chinner
Cc: Mathieu Desnoyers, Muchun Song, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Kairui Song, Barry Song, Axel Rasmussen,
Yuanchu Xie, Wei Xu, Baoquan He, Baolin Wang, linux-kernel,
linux-trace-kernel,
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:BPF [MISC]:Keyword:(?:b|_)bpf(?:b|_), Ridong Chen,
Ridong Chen
From: Ridong Chen <chenridong@xiaomi.com>
mm_vmscan_lru_isolate, mm_vmscan_lru_shrink_inactive and
mm_vmscan_lru_shrink_active spell out reclaim state (reclaim_idx, order,
priority) as individual arguments, all of which the caller already holds
in struct scan_control. Now that the struct is visible from the trace
header, pass sc directly and pick the fields out in TP_fast_assign.
No functional change. The tracefs event format (TP_STRUCT__entry and
TP_printk) is unchanged, so tracefs-based consumers are unaffected.
BPF programs attached via raw_tp/tp_btf see the new TP_PROTO and need
to be adjusted; tracepoints are not a stable ABI (see
Documentation/bpf/bpf_design_QA.rst).
Assisted-by: LLM
Signed-off-by: Ridong Chen <chenridong@xiaomi.com>
---
mm/trace_vmscan.h | 31 +++++++++++++++----------------
mm/vmscan.c | 14 +++++++-------
2 files changed, 22 insertions(+), 23 deletions(-)
diff --git a/mm/trace_vmscan.h b/mm/trace_vmscan.h
index 28561fda83b3..aa27cb9524bb 100644
--- a/mm/trace_vmscan.h
+++ b/mm/trace_vmscan.h
@@ -350,15 +350,14 @@ TRACE_EVENT(mm_shrink_slab_end,
);
TRACE_EVENT(mm_vmscan_lru_isolate,
- TP_PROTO(int highest_zoneidx,
- int order,
- unsigned long nr_requested,
- unsigned long nr_scanned,
- unsigned long nr_skipped,
- unsigned long nr_taken,
- int lru),
+ TP_PROTO(struct scan_control *sc,
+ unsigned long nr_requested,
+ unsigned long nr_scanned,
+ unsigned long nr_skipped,
+ unsigned long nr_taken,
+ int lru),
- TP_ARGS(highest_zoneidx, order, nr_requested, nr_scanned, nr_skipped, nr_taken, lru),
+ TP_ARGS(sc, nr_requested, nr_scanned, nr_skipped, nr_taken, lru),
TP_STRUCT__entry(
__field(int, highest_zoneidx)
@@ -371,8 +370,8 @@ TRACE_EVENT(mm_vmscan_lru_isolate,
),
TP_fast_assign(
- __entry->highest_zoneidx = highest_zoneidx;
- __entry->order = order;
+ __entry->highest_zoneidx = sc->reclaim_idx;
+ __entry->order = sc->order;
__entry->nr_requested = nr_requested;
__entry->nr_scanned = nr_scanned;
__entry->nr_skipped = nr_skipped;
@@ -466,9 +465,9 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive,
TP_PROTO(int nid,
unsigned long nr_scanned, unsigned long nr_reclaimed,
- struct reclaim_stat *stat, int priority, int file),
+ struct reclaim_stat *stat, struct scan_control *sc, int file),
- TP_ARGS(nid, nr_scanned, nr_reclaimed, stat, priority, file),
+ TP_ARGS(nid, nr_scanned, nr_reclaimed, stat, sc, file),
TP_STRUCT__entry(
__field(int, nid)
@@ -498,7 +497,7 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive,
__entry->nr_activate1 = stat->nr_activate[1];
__entry->nr_ref_keep = stat->nr_ref_keep;
__entry->nr_unmap_fail = stat->nr_unmap_fail;
- __entry->priority = priority;
+ __entry->priority = sc->priority;
__entry->reclaim_flags = trace_reclaim_flags(file);
),
@@ -517,9 +516,9 @@ TRACE_EVENT(mm_vmscan_lru_shrink_active,
TP_PROTO(int nid, unsigned long nr_taken,
unsigned long nr_active, unsigned long nr_deactivated,
- unsigned long nr_referenced, int priority, int file),
+ unsigned long nr_referenced, struct scan_control *sc, int file),
- TP_ARGS(nid, nr_taken, nr_active, nr_deactivated, nr_referenced, priority, file),
+ TP_ARGS(nid, nr_taken, nr_active, nr_deactivated, nr_referenced, sc, file),
TP_STRUCT__entry(
__field(int, nid)
@@ -537,7 +536,7 @@ TRACE_EVENT(mm_vmscan_lru_shrink_active,
__entry->nr_active = nr_active;
__entry->nr_deactivated = nr_deactivated;
__entry->nr_referenced = nr_referenced;
- __entry->priority = priority;
+ __entry->priority = sc->priority;
__entry->reclaim_flags = trace_reclaim_flags(file);
),
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 2979d0d819a8..c25ba910149d 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1764,7 +1764,7 @@ static unsigned long isolate_lru_folios(unsigned long nr_to_scan,
}
}
*nr_scanned = total_scan;
- trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, nr_to_scan,
+ trace_mm_vmscan_lru_isolate(sc, nr_to_scan,
total_scan, skipped, nr_taken, lru);
update_lru_sizes(lruvec, lru, nr_zone_taken);
return nr_taken;
@@ -2053,7 +2053,7 @@ static unsigned long shrink_inactive_list(unsigned long nr_to_scan,
handle_reclaim_writeback(nr_taken, pgdat, sc, &stat);
trace_mm_vmscan_lru_shrink_inactive(pgdat->node_id,
- nr_scanned, nr_reclaimed, &stat, sc->priority, file);
+ nr_scanned, nr_reclaimed, &stat, sc, file);
return nr_reclaimed;
}
@@ -2160,7 +2160,7 @@ static void shrink_active_list(unsigned long nr_to_scan,
mod_lruvec_state(lruvec, PGROTATE_ANON + file, nr_rotated);
trace_mm_vmscan_lru_shrink_active(pgdat->node_id, nr_taken, nr_activate,
- nr_deactivate, nr_rotated, sc->priority, file);
+ nr_deactivate, nr_rotated, sc, file);
}
static unsigned int reclaim_folio_list(struct list_head *folio_list,
@@ -4850,9 +4850,9 @@ static int scan_folios(unsigned long nr_to_scan, struct lruvec *lruvec,
mod_lruvec_state(lruvec, item, isolated);
mod_lruvec_state(lruvec, PGREFILL, sorted);
mod_lruvec_state(lruvec, PGSCAN_ANON + type, isolated);
- trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, nr_to_scan,
- scanned, skipped, isolated,
- type ? LRU_INACTIVE_FILE : LRU_INACTIVE_ANON);
+ trace_mm_vmscan_lru_isolate(sc, nr_to_scan,
+ scanned, skipped, isolated,
+ type ? LRU_INACTIVE_FILE : LRU_INACTIVE_ANON);
*isolatedp = isolated;
return scanned;
@@ -4991,7 +4991,7 @@ static int evict_folios(unsigned long nr_to_scan, struct lruvec *lruvec,
if (isolated)
handle_reclaim_writeback(isolated, pgdat, sc, &stat);
trace_mm_vmscan_lru_shrink_inactive(pgdat->node_id,
- type_scanned, reclaimed, &stat, sc->priority,
+ type_scanned, reclaimed, &stat, sc,
type ? LRU_INACTIVE_FILE : LRU_INACTIVE_ANON);
list_for_each_entry_safe_reverse(folio, next, &list, lru) {
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC v3 6/7] mm/vmscan: pass scan_control to mm_vmscan_reclaim_pages
2026-10-13 13:13 [PATCH RFC v3 0/7] mm/vmscan: move vmscan tracepoints to a local header Ridong Chen
` (4 preceding siblings ...)
2026-10-13 13:13 ` [PATCH RFC v3 5/7] mm/vmscan: pass scan_control to the LRU isolate/shrink tracepoints Ridong Chen
@ 2026-10-13 13:13 ` Ridong Chen
2026-10-13 13:13 ` [PATCH RFC v3 7/7] mm/vmscan: pass scan_control to mm_vmscan_balance_pgdat_end Ridong Chen
6 siblings, 0 replies; 8+ messages in thread
From: Ridong Chen @ 2026-10-13 13:13 UTC (permalink / raw)
To: Steven Rostedt, Masami Hiramatsu, Johannes Weiner, Michal Hocko,
Roman Gushchin, Shakeel Butt, Andrew Morton, Dave Chinner
Cc: Mathieu Desnoyers, Muchun Song, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Kairui Song, Barry Song, Axel Rasmussen,
Yuanchu Xie, Wei Xu, Baoquan He, Baolin Wang, linux-kernel,
linux-trace-kernel,
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:BPF [MISC]:Keyword:(?:b|_)bpf(?:b|_), Ridong Chen,
Ridong Chen
From: Ridong Chen <chenridong@xiaomi.com>
reclaim_folio_list() passes sc.nr_scanned to mm_vmscan_reclaim_pages as
a bare argument. Pass the enclosing struct scan_control instead and read
nr_scanned out in TP_fast_assign, consistent with the other reclaim
tracepoints. nr_reclaimed stays a separate argument: it is the return
value of shrink_folio_list(), which does not update sc->nr_reclaimed.
No functional change. The tracefs event format (TP_STRUCT__entry and
TP_printk) is unchanged, so tracefs-based consumers are unaffected.
BPF programs attached via raw_tp/tp_btf see the new TP_PROTO and need
to be adjusted; tracepoints are not a stable ABI (see
Documentation/bpf/bpf_design_QA.rst).
Assisted-by: LLM
Signed-off-by: Ridong Chen <chenridong@xiaomi.com>
---
mm/trace_vmscan.h | 10 +++++-----
mm/vmscan.c | 2 +-
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/mm/trace_vmscan.h b/mm/trace_vmscan.h
index aa27cb9524bb..96e41f444924 100644
--- a/mm/trace_vmscan.h
+++ b/mm/trace_vmscan.h
@@ -418,11 +418,11 @@ TRACE_EVENT(mm_vmscan_write_folio,
TRACE_EVENT(mm_vmscan_reclaim_pages,
- TP_PROTO(int nid,
- unsigned long nr_scanned, unsigned long nr_reclaimed,
- struct reclaim_stat *stat),
+ TP_PROTO(int nid, struct scan_control *sc,
+ unsigned long nr_reclaimed,
+ struct reclaim_stat *stat),
- TP_ARGS(nid, nr_scanned, nr_reclaimed, stat),
+ TP_ARGS(nid, sc, nr_reclaimed, stat),
TP_STRUCT__entry(
__field(int, nid)
@@ -440,7 +440,7 @@ TRACE_EVENT(mm_vmscan_reclaim_pages,
TP_fast_assign(
__entry->nid = nid;
- __entry->nr_scanned = nr_scanned;
+ __entry->nr_scanned = sc->nr_scanned;
__entry->nr_reclaimed = nr_reclaimed;
__entry->nr_dirty = stat->nr_dirty;
__entry->nr_writeback = stat->nr_writeback;
diff --git a/mm/vmscan.c b/mm/vmscan.c
index c25ba910149d..b3278dbe47bf 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2183,7 +2183,7 @@ static unsigned int reclaim_folio_list(struct list_head *folio_list,
list_del(&folio->lru);
folio_putback_lru(folio);
}
- trace_mm_vmscan_reclaim_pages(pgdat->node_id, sc.nr_scanned, nr_reclaimed, &stat);
+ trace_mm_vmscan_reclaim_pages(pgdat->node_id, &sc, nr_reclaimed, &stat);
return nr_reclaimed;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH RFC v3 7/7] mm/vmscan: pass scan_control to mm_vmscan_balance_pgdat_end
2026-10-13 13:13 [PATCH RFC v3 0/7] mm/vmscan: move vmscan tracepoints to a local header Ridong Chen
` (5 preceding siblings ...)
2026-10-13 13:13 ` [PATCH RFC v3 6/7] mm/vmscan: pass scan_control to mm_vmscan_reclaim_pages Ridong Chen
@ 2026-10-13 13:13 ` Ridong Chen
6 siblings, 0 replies; 8+ messages in thread
From: Ridong Chen @ 2026-10-13 13:13 UTC (permalink / raw)
To: Steven Rostedt, Masami Hiramatsu, Johannes Weiner, Michal Hocko,
Roman Gushchin, Shakeel Butt, Andrew Morton, Dave Chinner
Cc: Mathieu Desnoyers, Muchun Song, Qi Zheng, David Hildenbrand,
Lorenzo Stoakes, Kairui Song, Barry Song, Axel Rasmussen,
Yuanchu Xie, Wei Xu, Baoquan He, Baolin Wang, linux-kernel,
linux-trace-kernel,
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG),
open list:BPF [MISC]:Keyword:(?:b|_)bpf(?:b|_), Ridong Chen,
Ridong Chen
From: Ridong Chen <chenridong@xiaomi.com>
balance_pgdat() passes sc.order and sc.nr_reclaimed to
mm_vmscan_balance_pgdat_end as bare arguments. Pass the enclosing
struct scan_control instead and read the fields out in TP_fast_assign,
consistent with the other reclaim tracepoints. highest_zoneidx stays a
separate argument: it is a balance_pgdat() parameter, and
sc.reclaim_idx may differ from it by the time the end event fires.
No functional change. The tracefs event format (TP_STRUCT__entry and
TP_printk) is unchanged, so tracefs-based consumers are unaffected.
BPF programs attached via raw_tp/tp_btf see the new TP_PROTO and need
to be adjusted; tracepoints are not a stable ABI (see
Documentation/bpf/bpf_design_QA.rst).
Assisted-by: LLM
Signed-off-by: Ridong Chen <chenridong@xiaomi.com>
---
mm/trace_vmscan.h | 9 ++++-----
mm/vmscan.c | 3 +--
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/mm/trace_vmscan.h b/mm/trace_vmscan.h
index 96e41f444924..10b3cda1c435 100644
--- a/mm/trace_vmscan.h
+++ b/mm/trace_vmscan.h
@@ -124,10 +124,9 @@ TRACE_EVENT(mm_vmscan_balance_pgdat_begin,
TRACE_EVENT(mm_vmscan_balance_pgdat_end,
- TP_PROTO(int nid, int order, int highest_zoneidx,
- unsigned long nr_reclaimed),
+ TP_PROTO(int nid, struct scan_control *sc, int highest_zoneidx),
- TP_ARGS(nid, order, highest_zoneidx, nr_reclaimed),
+ TP_ARGS(nid, sc, highest_zoneidx),
TP_STRUCT__entry(
__field(int, nid)
@@ -138,9 +137,9 @@ TRACE_EVENT(mm_vmscan_balance_pgdat_end,
TP_fast_assign(
__entry->nid = nid;
- __entry->order = order;
+ __entry->order = sc->order;
__entry->highest_zoneidx = highest_zoneidx;
- __entry->nr_reclaimed = nr_reclaimed;
+ __entry->nr_reclaimed = sc->nr_reclaimed;
),
TP_printk("nid=%d order=%d highest_zoneidx=%-8s nr_reclaimed=%lu",
diff --git a/mm/vmscan.c b/mm/vmscan.c
index b3278dbe47bf..561e14dd490c 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -7403,8 +7403,7 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx)
psi_memstall_leave(&pflags);
set_task_reclaim_state(current, NULL);
- trace_mm_vmscan_balance_pgdat_end(pgdat->node_id, sc.order,
- highest_zoneidx, sc.nr_reclaimed);
+ trace_mm_vmscan_balance_pgdat_end(pgdat->node_id, &sc, highest_zoneidx);
/*
* Return the order kswapd stopped reclaiming at as
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread