[PATCH] mm/vmscan: add tracepoint for changes in min_seq and max_s=
From: w00021541
Date: Tue Mar 31 2026 - 04:00:48 EST
Currently, when tracking the changes in min_seq and max_seq of mglru,
it can only be done through debugfs. The granularity of debugfs is too
coarse when we debug the generations of mglru. there's no way to trace
the increase in min_seq and max_seq, so we add 2 tracepoints,
mm_vmscan_lru_inc_min_seq and mm_vmscan_lru_inc_max_seq.
Test results:
kswapd0-94 [003] d..1. 72.664921: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D87 type=3D0 swappiness=3D140 min_seq=3D2
kswapd0-94 [003] d..1. 72.664922: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D87 type=3D1 swappiness=3D140 min_seq=3D1
kswapd0-94 [003] d..1. 72.667303: mm_vmscan_lru_inc_max_seq: memcg_=
id=3D87 swappiness=3D140 max_seq=3D4
kswapd0-94 [000] d..1. 72.807691: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D25 type=3D0 swappiness=3D140 min_seq=3D2
kswapd0-94 [000] d..1. 72.807692: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D25 type=3D1 swappiness=3D140 min_seq=3D1
kswapd0-94 [000] d..1. 72.810955: mm_vmscan_lru_inc_max_seq: memcg_=
id=3D25 swappiness=3D140 max_seq=3D4
kswapd0-94 [005] d..1. 73.482586: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D91 type=3D0 swappiness=3D140 min_seq=3D2
kswapd0-94 [005] d..1. 73.482588: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D91 type=3D1 swappiness=3D140 min_seq=3D1
kswapd0-94 [005] d..1. 73.485509: mm_vmscan_lru_inc_max_seq: memcg_=
id=3D91 swappiness=3D140 max_seq=3D4
kswapd0-94 [000] d..1. 77.708630: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D88 type=3D0 swappiness=3D140 min_seq=3D1
kswapd0-94 [000] d..1. 77.709491: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D88 type=3D0 swappiness=3D140 min_seq=3D2
kswapd0-94 [000] d..1. 77.709491: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D88 type=3D1 swappiness=3D140 min_seq=3D1
kswapd0-94 [000] d..1. 77.715550: mm_vmscan_lru_inc_max_seq: memcg_=
id=3D88 swappiness=3D140 max_seq=3D4
kswapd0-94 [003] d..1. 77.749288: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D4 type=3D0 swappiness=3D140 min_seq=3D2
kswapd0-94 [003] d..1. 77.749290: mm_vmscan_lru_inc_min_seq: memcg_=
id=3D4 type=3D1 swappiness=3D140 min_seq=3D1
kswapd0-94 [003] d..1. 77.763055: mm_vmscan_lru_inc_max_seq: memcg_=
id=3D4 swappiness=3D140 max_seq=3D4
Signed-off-by: w00021541 <wangzhen5@xxxxxxxxxxx>
---
include/trace/events/vmscan.h | 49 +++++++++++++++++++++++++++++++++++
mm/vmscan.c | 6 +++++
2 files changed, 55 insertions(+)
diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h
index ea58e4656abf..6f2ae5c597fd 100644
--- a/include/trace/events/vmscan.h
+++ b/include/trace/events/vmscan.h
@@ -488,6 +488,55 @@ TRACE_EVENT(mm_vmscan_lru_shrink_active,
show_reclaim_flags(__entry->reclaim_flags))
);
=20
+#ifdef CONFIG_LRU_GEN
+TRACE_EVENT(mm_vmscan_lru_inc_min_seq,
+
+ TP_PROTO(struct mem_cgroup *memcg, int type, int swappiness, unsigned lon=
g min_seq),
+
+ TP_ARGS(memcg, type, swappiness, min_seq),
+
+ TP_STRUCT__entry(
+ __field(int, id)
+ __field(int, type)
+ __field(int, swappiness)
+ __field(unsigned long, min_seq)
+ ),
+
+ TP_fast_assign(
+ __entry->id =3D mem_cgroup_id(memcg);
+ __entry->type =3D type;
+ __entry->swappiness =3D swappiness;
+ __entry->min_seq =3D min_seq;
+ ),
+
+ TP_printk("memcg_id=3D%d type=3D%d swappiness=3D%d min_seq=3D%ld",
+ __entry->id, __entry->type,
+ __entry->swappiness, __entry->min_seq)
+);
+
+TRACE_EVENT(mm_vmscan_lru_inc_max_seq,
+
+ TP_PROTO(struct mem_cgroup *memcg, int swappiness, unsigned long max_seq)=
,
+
+ TP_ARGS(memcg, swappiness, max_seq),
+
+ TP_STRUCT__entry(
+ __field(int, id)
+ __field(int, swappiness)
+ __field(unsigned long, max_seq)
+ ),
+
+ TP_fast_assign(
+ __entry->id =3D mem_cgroup_id(memcg);
+ __entry->swappiness =3D swappiness;
+ __entry->max_seq =3D max_seq;
+ ),
+
+ TP_printk("memcg_id=3D%d swappiness=3D%d max_seq=3D%ld",
+ __entry->id, __entry->swappiness, __entry->max_seq)
+);
+#endif /* CONFIG_LRU_GEN */
+
TRACE_EVENT(mm_vmscan_node_reclaim_begin,
=20
TP_PROTO(int nid, int order, gfp_t gfp_flags),
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 0fc9373e8251..6b5d21ee45ba 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -3848,6 +3848,7 @@ static bool inc_min_seq(struct lruvec *lruvec, int ty=
pe, int swappiness)
int zone;
int remaining =3D MAX_LRU_BATCH;
struct lru_gen_folio *lrugen =3D &lruvec->lrugen;
+ struct mem_cgroup *memcg =3D lruvec_memcg(lruvec);
int hist =3D lru_hist_from_seq(lrugen->min_seq[type]);
int new_gen, old_gen =3D lru_gen_from_seq(lrugen->min_seq[type]);
=20
@@ -3892,6 +3893,7 @@ static bool inc_min_seq(struct lruvec *lruvec, int ty=
pe, int swappiness)
done:
reset_ctrl_pos(lruvec, type, true);
WRITE_ONCE(lrugen->min_seq[type], lrugen->min_seq[type] + 1);
+ trace_mm_vmscan_lru_inc_min_seq(memcg, type, swappiness, lrugen->min_seq[=
type]);
=20
return true;
}
@@ -3902,6 +3904,7 @@ static bool try_to_inc_min_seq(struct lruvec *lruvec,=
int swappiness)
bool success =3D false;
bool seq_inc_flag =3D false;
struct lru_gen_folio *lrugen =3D &lruvec->lrugen;
+ struct mem_cgroup *memcg =3D lruvec_memcg(lruvec);
DEFINE_MIN_SEQ(lruvec);
=20
VM_WARN_ON_ONCE(!seq_is_valid(lruvec));
@@ -3947,6 +3950,7 @@ static bool try_to_inc_min_seq(struct lruvec *lruvec,=
int swappiness)
=20
reset_ctrl_pos(lruvec, type, true);
WRITE_ONCE(lrugen->min_seq[type], min_seq[type]);
+ trace_mm_vmscan_lru_inc_min_seq(memcg, type, swappiness, lrugen->min_seq=
[type]);
success =3D true;
}
=20
@@ -3959,6 +3963,7 @@ static bool inc_max_seq(struct lruvec *lruvec, unsign=
ed long seq, int swappiness
int prev, next;
int type, zone;
struct lru_gen_folio *lrugen =3D &lruvec->lrugen;
+ struct mem_cgroup *memcg =3D lruvec_memcg(lruvec);
restart:
if (seq < READ_ONCE(lrugen->max_seq))
return false;
@@ -4012,6 +4017,7 @@ static bool inc_max_seq(struct lruvec *lruvec, unsign=
ed long seq, int swappiness
WRITE_ONCE(lrugen->timestamps[next], jiffies);
/* make sure preceding modifications appear */
smp_store_release(&lrugen->max_seq, lrugen->max_seq + 1);
+ trace_mm_vmscan_lru_inc_max_seq(memcg, swappiness, lrugen->max_seq);
unlock:
spin_unlock_irq(&lruvec->lru_lock);
=20
--=20
2.17.1