* Re: [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint
2026-10-03 20:27 [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint Ravi Jonnalagadda
@ 2026-10-03 20:37 ` sashiko-bot
2026-10-04 8:01 ` SJ Park
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: sashiko-bot @ 2026-10-03 20:37 UTC (permalink / raw)
To: Ravi Jonnalagadda; +Cc: damon, linux-trace-kernel
> Add a tracepoint for DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP quota goal
> evaluation. The tracepoint fires once per quota-score computation when
> the goal metric is DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP, exposing
> context_idx, scheme_idx, nid, target_value, and current_value.
> current_value is reported as the quota tuning sees it, after the goal's
> complement setting is applied.
>
> The DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP metric expresses node memory
> occupancy as basis points of eligible bytes. This information is not
> exposed through any existing external interface (perf stat, /proc, or
> sysfs), so the tracepoint is the only way for userspace to observe the
> target and current eligible-memory basis point values at quota-scoring
> time.
>
> Link: https://lore.kernel.org/linux-mm/20260428030520.701-1-ravis.opensrc@gmail.com/
> Signed-off-by: Ravi Jonnalagadda <ravis.opensrc@gmail.com>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261003202727.3673-1-ravis.opensrc@gmail.com?part=1
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint
2026-10-03 20:27 [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint Ravi Jonnalagadda
2026-10-03 20:37 ` sashiko-bot
@ 2026-10-04 8:01 ` SJ Park
2026-10-10 0:10 ` Ravi Jonnalagadda
2026-10-04 9:16 ` Steven Rostedt
2026-10-05 10:04 ` Kunwu Chan
3 siblings, 1 reply; 8+ messages in thread
From: SJ Park @ 2026-10-04 8:01 UTC (permalink / raw)
To: Ravi Jonnalagadda
Cc: SJ Park, Andrew Morton, damon, linux-mm, linux-kernel,
linux-trace-kernel, Steven Rostedt, Masami Hiramatsu,
Jonathan Corbet, Bijan Tabatabai, Ajay Joshi, Honggyu Kim,
Yunjeong Mun, Akinobu Mita, Lian Wang, Kunwu Chan
Hi Ravi,
On Sat, 3 Oct 2026 13:27:27 -0700 Ravi Jonnalagadda <ravis.opensrc@gmail.com> wrote:
> Add a tracepoint for DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP quota goal
> evaluation. The tracepoint fires once per quota-score computation when
> the goal metric is DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP, exposing
> context_idx, scheme_idx, nid, target_value, and current_value.
> current_value is reported as the quota tuning sees it, after the goal's
> complement setting is applied.
>
> The DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP metric expresses node memory
> occupancy as basis points of eligible bytes. This information is not
> exposed through any existing external interface (perf stat, /proc, or
> sysfs), so the tracepoint is the only way for userspace to observe the
> target and current eligible-memory basis point values at quota-scoring
> time.
Thank you for this patch!
We have damos_esz tracepoint. Have you considered using it? It doesn't expose
the current value, though. I thought it wouldn't be real problem in most
cases, but I can show it could be problematic for node_eligible_mem_bp case, as
the metric value is not straightforward to see without using DAMON.
If you really need to know the current_value, I'm open to add a new tracepoint.
But I think it has no reason to make it only eligible_mem_bp specific. How
about adding more general purpose tracepoint, and/or update the current_value
file [1] under the goal sysfs directory to show the current current_value for
all goal types?
[1] https://origin.kernel.org/doc/html/latest/admin-guide/mm/damon/usage.html#sysfs-schemes-quota-goals
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint
2026-10-04 8:01 ` SJ Park
@ 2026-10-10 0:10 ` Ravi Jonnalagadda
0 siblings, 0 replies; 8+ messages in thread
From: Ravi Jonnalagadda @ 2026-10-10 0:10 UTC (permalink / raw)
To: SJ Park
Cc: Andrew Morton, damon, linux-mm, linux-kernel, linux-trace-kernel,
Steven Rostedt, Masami Hiramatsu, Jonathan Corbet,
Bijan Tabatabai, Ajay Joshi, Honggyu Kim, Yunjeong Mun,
Akinobu Mita, Lian Wang, Kunwu Chan
On Sun, Oct 4, 2026 at 1:01 AM SJ Park <sj@kernel.org> wrote:
>
> Hi Ravi,
>
> On Sat, 3 Oct 2026 13:27:27 -0700 Ravi Jonnalagadda <ravis.opensrc@gmail.com> wrote:
>
> > Add a tracepoint for DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP quota goal
> > evaluation. The tracepoint fires once per quota-score computation when
> > the goal metric is DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP, exposing
> > context_idx, scheme_idx, nid, target_value, and current_value.
> > current_value is reported as the quota tuning sees it, after the goal's
> > complement setting is applied.
> >
> > The DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP metric expresses node memory
> > occupancy as basis points of eligible bytes. This information is not
> > exposed through any existing external interface (perf stat, /proc, or
> > sysfs), so the tracepoint is the only way for userspace to observe the
> > target and current eligible-memory basis point values at quota-scoring
> > time.
>
> Thank you for this patch!
>
> We have damos_esz tracepoint. Have you considered using it? It doesn't expose
> the current value, though. I thought it wouldn't be real problem in most
> cases, but I can show it could be problematic for node_eligible_mem_bp case, as
> the metric value is not straightforward to see without using DAMON.
Hi SJ,
Yes, with the temporal goal tuner, damos_esz only
tells whether the goal is met, not how close current_value is to
target_value, and damo needs that to know when a step has settled.
>
> If you really need to know the current_value, I'm open to add a new tracepoint.
> But I think it has no reason to make it only eligible_mem_bp specific. How
> about adding more general purpose tracepoint, and/or update the current_value
> file [1] under the goal sysfs directory to show the current current_value for
> all goal types?
>
Agreed, nothing in it needs to be specific to node_eligible_mem_bp. I
will rework it as a general quota goal tracepoint, emitted for each goal
evaluation with the goal's metric, target_value and current_value, the
node id for the node metrics, and the memcg id for the memcg metrics.
I would leave the current_value file as it is for now. It would need a
stats update command or refresh_ms to stay current, and damo wants every
evaluation as it happens, which the tracepoint gives it.
Thanks,
Ravi.
> [1] https://origin.kernel.org/doc/html/latest/admin-guide/mm/damon/usage.html#sysfs-schemes-quota-goals
>
>
> Thanks,
> SJ
>
> [...]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint
2026-10-03 20:27 [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint Ravi Jonnalagadda
2026-10-03 20:37 ` sashiko-bot
2026-10-04 8:01 ` SJ Park
@ 2026-10-04 9:16 ` Steven Rostedt
2026-10-10 0:20 ` Ravi Jonnalagadda
2026-10-05 10:04 ` Kunwu Chan
3 siblings, 1 reply; 8+ messages in thread
From: Steven Rostedt @ 2026-10-04 9:16 UTC (permalink / raw)
To: Ravi Jonnalagadda
Cc: Andrew Morton, SJ Park, damon, linux-mm, linux-kernel,
linux-trace-kernel, Masami Hiramatsu, Jonathan Corbet,
Bijan Tabatabai, Ajay Joshi, Honggyu Kim, Yunjeong Mun,
Akinobu Mita, Lian Wang, Kunwu Chan
On Sat, 3 Oct 2026 13:27:27 -0700
Ravi Jonnalagadda <ravis.opensrc@gmail.com> wrote:
> Add a tracepoint for DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP quota goal
> evaluation. The tracepoint fires once per quota-score computation when
> the goal metric is DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP, exposing
> context_idx, scheme_idx, nid, target_value, and current_value.
> current_value is reported as the quota tuning sees it, after the goal's
> complement setting is applied.
>
> The DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP metric expresses node memory
> occupancy as basis points of eligible bytes. This information is not
> exposed through any existing external interface (perf stat, /proc, or
> sysfs), so the tracepoint is the only way for userspace to observe the
> target and current eligible-memory basis point values at quota-scoring
> time.
>
> Link: https://lore.kernel.org/linux-mm/20260428030520.701-1-ravis.opensrc@gmail.com/
> Signed-off-by: Ravi Jonnalagadda <ravis.opensrc@gmail.com>
> ---
> include/trace/events/damon.h | 31 +++++++++++++++++++++++++++++++
> mm/damon/core.c | 16 ++++++++++++++++
> 2 files changed, 47 insertions(+)
>
> diff --git a/include/trace/events/damon.h b/include/trace/events/damon.h
> index 8851727ae162..2c7249cc7c88 100644
> --- a/include/trace/events/damon.h
> +++ b/include/trace/events/damon.h
> @@ -74,6 +74,37 @@ TRACE_EVENT(damos_esz,
> __entry->esz)
> );
>
> +/* Per-tick DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP goal evaluation. */
> +TRACE_EVENT(damos_node_eligible_mem_bp,
> +
> + TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
> + int nid,
> + unsigned long target_value, unsigned long current_value),
> +
> + TP_ARGS(context_idx, scheme_idx, nid, target_value, current_value),
> +
> + TP_STRUCT__entry(
> + __field(unsigned int, context_idx)
> + __field(unsigned int, scheme_idx)
> + __field(int, nid)
Can you move the nid after the two unsigned long values below. This
creates a structure, and on 64bit machines, this adds a 4 byte padding
in the middle of the ring buffer.
> + __field(unsigned long, target_value)
> + __field(unsigned long, current_value)
> + ),
> +
> + TP_fast_assign(
> + __entry->context_idx = context_idx;
> + __entry->scheme_idx = scheme_idx;
> + __entry->nid = nid;
> + __entry->target_value = target_value;
> + __entry->current_value = current_value;
> + ),
> +
> + TP_printk("ctx_idx=%u scheme_idx=%u nid=%d target_value=%lu current_value=%lu",
> + __entry->context_idx, __entry->scheme_idx,
> + __entry->nid,
> + __entry->target_value, __entry->current_value)
> +);
> +
> TRACE_EVENT_CONDITION(damos_before_apply,
>
> TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
> diff --git a/mm/damon/core.c b/mm/damon/core.c
> index b63e60ef8990..6ddd15dc4f55 100644
> --- a/mm/damon/core.c
> +++ b/mm/damon/core.c
> @@ -3294,6 +3294,22 @@ static unsigned long damos_quota_score(struct damon_ctx *c, struct damos *s)
> highest_score = max(highest_score,
> mult_frac(goal->current_value, 10000,
> goal->target_value));
> +
> + if (goal->metric == DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP &&
> + trace_damos_node_eligible_mem_bp_enabled()) {
If you move the trace_damos_node_eligible_mem_bp_enabled() before the
goal->metric check, you will save yourself a branch when tracing is
off. As the trace_*_enabled() is a static branch (nop or jmp) it has no
cmp branch, but the above will keep the goal->metric still exposed. By
swapping the two compares, the goal->metric check will be hidder behind
the 'nop' when tracing is disabled.
-- Steve
> + unsigned int cidx = 0, sidx = 0;
> + struct damos *siter;
> +
> + damon_for_each_scheme(siter, c) {
> + if (siter == s)
> + break;
> + sidx++;
> + }
> + trace_damos_node_eligible_mem_bp(cidx, sidx,
> + goal->nid,
> + goal->target_value,
> + goal->current_value);
> + }
> }
>
> return highest_score;
>
> base-commit: 763ad0211c7b587344f03bc4d1299810aeb736f4
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint
2026-10-04 9:16 ` Steven Rostedt
@ 2026-10-10 0:20 ` Ravi Jonnalagadda
0 siblings, 0 replies; 8+ messages in thread
From: Ravi Jonnalagadda @ 2026-10-10 0:20 UTC (permalink / raw)
To: Steven Rostedt
Cc: Andrew Morton, SJ Park, damon, linux-mm, linux-kernel,
linux-trace-kernel, Masami Hiramatsu, Jonathan Corbet,
Bijan Tabatabai, Ajay Joshi, Honggyu Kim, Yunjeong Mun,
Akinobu Mita, Lian Wang, Kunwu Chan
On Sun, Oct 4, 2026 at 2:16 AM Steven Rostedt <rostedt@goodmis.org> wrote:
>
> On Sat, 3 Oct 2026 13:27:27 -0700
> Ravi Jonnalagadda <ravis.opensrc@gmail.com> wrote:
>
> > Add a tracepoint for DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP quota goal
> > evaluation. The tracepoint fires once per quota-score computation when
> > the goal metric is DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP, exposing
> > context_idx, scheme_idx, nid, target_value, and current_value.
> > current_value is reported as the quota tuning sees it, after the goal's
> > complement setting is applied.
> >
> > The DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP metric expresses node memory
> > occupancy as basis points of eligible bytes. This information is not
> > exposed through any existing external interface (perf stat, /proc, or
> > sysfs), so the tracepoint is the only way for userspace to observe the
> > target and current eligible-memory basis point values at quota-scoring
> > time.
> >
> > Link: https://lore.kernel.org/linux-mm/20260428030520.701-1-ravis.opensrc@gmail.com/
> > Signed-off-by: Ravi Jonnalagadda <ravis.opensrc@gmail.com>
> > ---
> > include/trace/events/damon.h | 31 +++++++++++++++++++++++++++++++
> > mm/damon/core.c | 16 ++++++++++++++++
> > 2 files changed, 47 insertions(+)
> >
> > diff --git a/include/trace/events/damon.h b/include/trace/events/damon.h
> > index 8851727ae162..2c7249cc7c88 100644
> > --- a/include/trace/events/damon.h
> > +++ b/include/trace/events/damon.h
> > @@ -74,6 +74,37 @@ TRACE_EVENT(damos_esz,
> > __entry->esz)
> > );
> >
> > +/* Per-tick DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP goal evaluation. */
> > +TRACE_EVENT(damos_node_eligible_mem_bp,
> > +
> > + TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
> > + int nid,
> > + unsigned long target_value, unsigned long current_value),
> > +
> > + TP_ARGS(context_idx, scheme_idx, nid, target_value, current_value),
> > +
> > + TP_STRUCT__entry(
> > + __field(unsigned int, context_idx)
> > + __field(unsigned int, scheme_idx)
> > + __field(int, nid)
>
> Can you move the nid after the two unsigned long values below. This
> creates a structure, and on 64bit machines, this adds a 4 byte padding
> in the middle of the ring buffer.
Hi Steve,
Thank you. Will do; in the next version the 8-byte fields come first
and nid follows them.
>
> > + __field(unsigned long, target_value)
> > + __field(unsigned long, current_value)
> > + ),
> > +
> > + TP_fast_assign(
> > + __entry->context_idx = context_idx;
> > + __entry->scheme_idx = scheme_idx;
> > + __entry->nid = nid;
> > + __entry->target_value = target_value;
> > + __entry->current_value = current_value;
> > + ),
> > +
> > + TP_printk("ctx_idx=%u scheme_idx=%u nid=%d target_value=%lu current_value=%lu",
> > + __entry->context_idx, __entry->scheme_idx,
> > + __entry->nid,
> > + __entry->target_value, __entry->current_value)
> > +);
> > +
> > TRACE_EVENT_CONDITION(damos_before_apply,
> >
> > TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
> > diff --git a/mm/damon/core.c b/mm/damon/core.c
> > index b63e60ef8990..6ddd15dc4f55 100644
> > --- a/mm/damon/core.c
> > +++ b/mm/damon/core.c
> > @@ -3294,6 +3294,22 @@ static unsigned long damos_quota_score(struct damon_ctx *c, struct damos *s)
> > highest_score = max(highest_score,
> > mult_frac(goal->current_value, 10000,
> > goal->target_value));
> > +
> > + if (goal->metric == DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP &&
> > + trace_damos_node_eligible_mem_bp_enabled()) {
>
> If you move the trace_damos_node_eligible_mem_bp_enabled() before the
> goal->metric check, you will save yourself a branch when tracing is
> off. As the trace_*_enabled() is a static branch (nop or jmp) it has no
> cmp branch, but the above will keep the goal->metric still exposed. By
> swapping the two compares, the goal->metric check will be hidder behind
> the 'nop' when tracing is disabled.
>
> -- Steve
Makes sense; I will put the trace_*_enabled() check first. SJ asked for
the event to cover every quota goal rather than this metric only, so
the next version may not need the metric check at all, but the enabled
check will lead either way.
Thanks,
Ravi
>
>
> > + unsigned int cidx = 0, sidx = 0;
> > + struct damos *siter;
> > +
> > + damon_for_each_scheme(siter, c) {
> > + if (siter == s)
> > + break;
> > + sidx++;
> > + }
> > + trace_damos_node_eligible_mem_bp(cidx, sidx,
> > + goal->nid,
> > + goal->target_value,
> > + goal->current_value);
> > + }
> > }
> >
> > return highest_score;
> >
> > base-commit: 763ad0211c7b587344f03bc4d1299810aeb736f4
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint
2026-10-03 20:27 [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint Ravi Jonnalagadda
` (2 preceding siblings ...)
2026-10-04 9:16 ` Steven Rostedt
@ 2026-10-05 10:04 ` Kunwu Chan
2026-10-10 0:23 ` Ravi Jonnalagadda
3 siblings, 1 reply; 8+ messages in thread
From: Kunwu Chan @ 2026-10-05 10:04 UTC (permalink / raw)
To: Ravi Jonnalagadda
Cc: Kunwu Chan, Andrew Morton, SJ Park, damon, linux-mm, linux-kernel,
linux-trace-kernel, Steven Rostedt, Masami Hiramatsu,
Jonathan Corbet, Bijan Tabatabai, Ajay Joshi, Honggyu Kim,
Yunjeong Mun, Akinobu Mita, Lian Wang, Kunwu Chan
Hi Ravi,
I agree with SJ that this would be more useful as a general quota-goal
tracepoint rather than being specific to NODE_ELIGIBLE_MEM_BP. The
target_value and current_value fields are not metric-specific.
On Sat, 3 Oct 2026 13:27:27 -0700 Ravi Jonnalagadda <ravis.opensrc@gmail.com> wrote:
> Add a tracepoint for DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP quota goal
> evaluation. The tracepoint fires once per quota-score computation when
> the goal metric is DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP, exposing
> context_idx, scheme_idx, nid, target_value, and current_value.
> current_value is reported as the quota tuning sees it, after the goal's
> complement setting is applied.
>
> The DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP metric expresses node memory
> occupancy as basis points of eligible bytes. This information is not
> exposed through any existing external interface (perf stat, /proc, or
> sysfs), so the tracepoint is the only way for userspace to observe the
> target and current eligible-memory basis point values at quota-scoring
> time.
>
> Link: https://lore.kernel.org/linux-mm/20260428030520.701-1-ravis.opensrc@gmail.com/
> Signed-off-by: Ravi Jonnalagadda <ravis.opensrc@gmail.com>
> ---
> include/trace/events/damon.h | 31 +++++++++++++++++++++++++++++++
> mm/damon/core.c | 16 ++++++++++++++++
> 2 files changed, 47 insertions(+)
>
> diff --git a/include/trace/events/damon.h b/include/trace/events/damon.h
> index 8851727ae162..2c7249cc7c88 100644
> --- a/include/trace/events/damon.h
> +++ b/include/trace/events/damon.h
> @@ -74,6 +74,37 @@ TRACE_EVENT(damos_esz,
> __entry->esz)
> );
>
> +/* Per-tick DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP goal evaluation. */
The comment says "Per-tick", but the event is emitted for each matching
goal in damos_quota_score(). "Per quota-goal evaluation" would be more
precise.
> +TRACE_EVENT(damos_node_eligible_mem_bp,
> +
> + TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
> + int nid,
> + unsigned long target_value, unsigned long current_value),
> +
> + TP_ARGS(context_idx, scheme_idx, nid, target_value, current_value),
> +
> + TP_STRUCT__entry(
> + __field(unsigned int, context_idx)
> + __field(unsigned int, scheme_idx)
> + __field(int, nid)
> + __field(unsigned long, target_value)
> + __field(unsigned long, current_value)
Also, context_idx is currently always 0 here, since
damos_quota_score() only has struct damon_ctx * and no context index.
If this tracepoint is generalized, it may be worth considering how the
context/scheme are identified rather than introducing another tracepoint
field that is currently always 0.
Thanks,
Kunwu
> + ),
> +
> + TP_fast_assign(
> + __entry->context_idx = context_idx;
> + __entry->scheme_idx = scheme_idx;
> + __entry->nid = nid;
> + __entry->target_value = target_value;
> + __entry->current_value = current_value;
> + ),
> +
> + TP_printk("ctx_idx=%u scheme_idx=%u nid=%d target_value=%lu current_value=%lu",
> + __entry->context_idx, __entry->scheme_idx,
> + __entry->nid,
> + __entry->target_value, __entry->current_value)
> +);
> +
> TRACE_EVENT_CONDITION(damos_before_apply,
>
> TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
> diff --git a/mm/damon/core.c b/mm/damon/core.c
> index b63e60ef8990..6ddd15dc4f55 100644
> --- a/mm/damon/core.c
> +++ b/mm/damon/core.c
> @@ -3294,6 +3294,22 @@ static unsigned long damos_quota_score(struct damon_ctx *c, struct damos *s)
> highest_score = max(highest_score,
> mult_frac(goal->current_value, 10000,
> goal->target_value));
> +
> + if (goal->metric == DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP &&
> + trace_damos_node_eligible_mem_bp_enabled()) {
> + unsigned int cidx = 0, sidx = 0;
> + struct damos *siter;
> +
> + damon_for_each_scheme(siter, c) {
> + if (siter == s)
> + break;
> + sidx++;
> + }
> + trace_damos_node_eligible_mem_bp(cidx, sidx,
> + goal->nid,
> + goal->target_value,
> + goal->current_value);
> + }
> }
>
> return highest_score;
>
> base-commit: 763ad0211c7b587344f03bc4d1299810aeb736f4
> --
> 2.54.0 (Apple Git-157)
>
>
Sent using hkml (https://github.com/sjp38/hackermail)
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH] mm/damon: add damos_node_eligible_mem_bp tracepoint
2026-10-05 10:04 ` Kunwu Chan
@ 2026-10-10 0:23 ` Ravi Jonnalagadda
0 siblings, 0 replies; 8+ messages in thread
From: Ravi Jonnalagadda @ 2026-10-10 0:23 UTC (permalink / raw)
To: Kunwu Chan
Cc: Andrew Morton, SJ Park, damon, linux-mm, linux-kernel,
linux-trace-kernel, Steven Rostedt, Masami Hiramatsu,
Jonathan Corbet, Bijan Tabatabai, Ajay Joshi, Honggyu Kim,
Yunjeong Mun, Akinobu Mita, Lian Wang, Kunwu Chan
On Mon, Oct 5, 2026 at 3:04 AM Kunwu Chan <kunwu.chan@gmail.com> wrote:
>
>
> Hi Ravi,
>
> I agree with SJ that this would be more useful as a general quota-goal
> tracepoint rather than being specific to NODE_ELIGIBLE_MEM_BP. The
> target_value and current_value fields are not metric-specific.
Hi Kunwu,
Thank you for the review. Agreed; I will make it a general quota goal
tracepoint, as I wrote in my reply to SJ.
>
> On Sat, 3 Oct 2026 13:27:27 -0700 Ravi Jonnalagadda <ravis.opensrc@gmail.com> wrote:
>
> > Add a tracepoint for DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP quota goal
> > evaluation. The tracepoint fires once per quota-score computation when
> > the goal metric is DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP, exposing
> > context_idx, scheme_idx, nid, target_value, and current_value.
> > current_value is reported as the quota tuning sees it, after the goal's
> > complement setting is applied.
> >
> > The DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP metric expresses node memory
> > occupancy as basis points of eligible bytes. This information is not
> > exposed through any existing external interface (perf stat, /proc, or
> > sysfs), so the tracepoint is the only way for userspace to observe the
> > target and current eligible-memory basis point values at quota-scoring
> > time.
> >
> > Link: https://lore.kernel.org/linux-mm/20260428030520.701-1-ravis.opensrc@gmail.com/
> > Signed-off-by: Ravi Jonnalagadda <ravis.opensrc@gmail.com>
> > ---
> > include/trace/events/damon.h | 31 +++++++++++++++++++++++++++++++
> > mm/damon/core.c | 16 ++++++++++++++++
> > 2 files changed, 47 insertions(+)
> >
> > diff --git a/include/trace/events/damon.h b/include/trace/events/damon.h
> > index 8851727ae162..2c7249cc7c88 100644
> > --- a/include/trace/events/damon.h
> > +++ b/include/trace/events/damon.h
> > @@ -74,6 +74,37 @@ TRACE_EVENT(damos_esz,
> > __entry->esz)
> > );
> >
> > +/* Per-tick DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP goal evaluation. */
>
> The comment says "Per-tick", but the event is emitted for each matching
> goal in damos_quota_score(). "Per quota-goal evaluation" would be more
> precise.
Right, I will fix the comment.
>
> > +TRACE_EVENT(damos_node_eligible_mem_bp,
> > +
> > + TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
> > + int nid,
> > + unsigned long target_value, unsigned long current_value),
> > +
> > + TP_ARGS(context_idx, scheme_idx, nid, target_value, current_value),
> > +
> > + TP_STRUCT__entry(
> > + __field(unsigned int, context_idx)
> > + __field(unsigned int, scheme_idx)
> > + __field(int, nid)
> > + __field(unsigned long, target_value)
> > + __field(unsigned long, current_value)
>
> Also, context_idx is currently always 0 here, since
> damos_quota_score() only has struct damon_ctx * and no context index.
> If this tracepoint is generalized, it may be worth considering how the
> context/scheme are identified rather than introducing another tracepoint
> field that is currently always 0.
I kept context_idx for consistency with damos_esz and
damos_before_apply, which carry the same field and also pass 0 today,
since a kdamond runs one context. I will follow whatever SJ prefers
for identifying the context in the generalized event.
Thanks,
Ravi.
>
> Thanks,
> Kunwu
>
> > + ),
> > +
> > + TP_fast_assign(
> > + __entry->context_idx = context_idx;
> > + __entry->scheme_idx = scheme_idx;
> > + __entry->nid = nid;
> > + __entry->target_value = target_value;
> > + __entry->current_value = current_value;
> > + ),
> > +
> > + TP_printk("ctx_idx=%u scheme_idx=%u nid=%d target_value=%lu current_value=%lu",
> > + __entry->context_idx, __entry->scheme_idx,
> > + __entry->nid,
> > + __entry->target_value, __entry->current_value)
> > +);
> > +
> > TRACE_EVENT_CONDITION(damos_before_apply,
> >
> > TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
> > diff --git a/mm/damon/core.c b/mm/damon/core.c
> > index b63e60ef8990..6ddd15dc4f55 100644
> > --- a/mm/damon/core.c
> > +++ b/mm/damon/core.c
> > @@ -3294,6 +3294,22 @@ static unsigned long damos_quota_score(struct damon_ctx *c, struct damos *s)
> > highest_score = max(highest_score,
> > mult_frac(goal->current_value, 10000,
> > goal->target_value));
> > +
> > + if (goal->metric == DAMOS_QUOTA_NODE_ELIGIBLE_MEM_BP &&
> > + trace_damos_node_eligible_mem_bp_enabled()) {
> > + unsigned int cidx = 0, sidx = 0;
> > + struct damos *siter;
> > +
> > + damon_for_each_scheme(siter, c) {
> > + if (siter == s)
> > + break;
> > + sidx++;
> > + }
> > + trace_damos_node_eligible_mem_bp(cidx, sidx,
> > + goal->nid,
> > + goal->target_value,
> > + goal->current_value);
> > + }
> > }
> >
> > return highest_score;
> >
> > base-commit: 763ad0211c7b587344f03bc4d1299810aeb736f4
> > --
> > 2.54.0 (Apple Git-157)
> >
> >
>
> Sent using hkml (https://github.com/sjp38/hackermail)
^ permalink raw reply [flat|nested] 8+ messages in thread