Files
linux/include/trace/events/damon.h
SJ Park bcea0202d4 mm/damon/core: use damon_nr_accesses_mvsum() for damos region tracing
damon_nr_accesses_mvsum() returns a value same to nr_accesses_bp.  Also
the function is more simple and therefore more tolerant to errors. 
Execution of the function would be more expensive than the simple read of
the field, but because the function is quite simple, the overhead should
be negligible.  Use it in the DAMON region exporting trace points instead
of the nr_accesses_bp.

Link: https://lore.kernel.org/20260630040812.149729-7-sj@kernel.org
Signed-off-by: SJ Park <sj@kernel.org>
Cc: Brendan Higgins <brendan.higgins@linux.dev>
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2026-07-30 19:40:33 -07:00

208 lines
5.4 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM damon
#if !defined(_TRACE_DAMON_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_DAMON_H
#include <linux/damon.h>
#include <linux/types.h>
#include <linux/tracepoint.h>
TRACE_EVENT(damos_stat_after_apply_interval,
TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
struct damos_stat *stat),
TP_ARGS(context_idx, scheme_idx, stat),
TP_STRUCT__entry(
__field(unsigned int, context_idx)
__field(unsigned int, scheme_idx)
__field(unsigned long, nr_tried)
__field(unsigned long, sz_tried)
__field(unsigned long, nr_applied)
__field(unsigned long, sz_applied)
__field(unsigned long, sz_ops_filter_passed)
__field(unsigned long, qt_exceeds)
__field(unsigned long, nr_snapshots)
),
TP_fast_assign(
__entry->context_idx = context_idx;
__entry->scheme_idx = scheme_idx;
__entry->nr_tried = stat->nr_tried;
__entry->sz_tried = stat->sz_tried;
__entry->nr_applied = stat->nr_applied;
__entry->sz_applied = stat->sz_applied;
__entry->sz_ops_filter_passed = stat->sz_ops_filter_passed;
__entry->qt_exceeds = stat->qt_exceeds;
__entry->nr_snapshots = stat->nr_snapshots;
),
TP_printk("ctx_idx=%u scheme_idx=%u nr_tried=%lu sz_tried=%lu "
"nr_applied=%lu sz_applied=%lu sz_ops_filter_passed=%lu "
"qt_exceeds=%lu nr_snapshots=%lu",
__entry->context_idx, __entry->scheme_idx,
__entry->nr_tried, __entry->sz_tried,
__entry->nr_applied, __entry->sz_applied,
__entry->sz_ops_filter_passed, __entry->qt_exceeds,
__entry->nr_snapshots)
);
TRACE_EVENT(damos_esz,
TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
unsigned long esz),
TP_ARGS(context_idx, scheme_idx, esz),
TP_STRUCT__entry(
__field(unsigned int, context_idx)
__field(unsigned int, scheme_idx)
__field(unsigned long, esz)
),
TP_fast_assign(
__entry->context_idx = context_idx;
__entry->scheme_idx = scheme_idx;
__entry->esz = esz;
),
TP_printk("ctx_idx=%u scheme_idx=%u esz=%lu",
__entry->context_idx, __entry->scheme_idx,
__entry->esz)
);
TRACE_EVENT_CONDITION(damos_before_apply,
TP_PROTO(unsigned int context_idx, unsigned int scheme_idx,
unsigned int target_idx, struct damon_region *r,
unsigned int nr_accesses, unsigned int nr_regions,
bool do_trace),
TP_ARGS(context_idx, scheme_idx, target_idx, r, nr_accesses,
nr_regions, do_trace),
TP_CONDITION(do_trace),
TP_STRUCT__entry(
__field(unsigned int, context_idx)
__field(unsigned int, scheme_idx)
__field(unsigned long, target_idx)
__field(unsigned long, start)
__field(unsigned long, end)
__field(unsigned int, nr_accesses)
__field(unsigned int, age)
__field(unsigned int, nr_regions)
),
TP_fast_assign(
__entry->context_idx = context_idx;
__entry->scheme_idx = scheme_idx;
__entry->target_idx = target_idx;
__entry->start = r->ar.start;
__entry->end = r->ar.end;
__entry->nr_accesses = nr_accesses;
__entry->age = r->age;
__entry->nr_regions = nr_regions;
),
TP_printk("ctx_idx=%u scheme_idx=%u target_idx=%lu nr_regions=%u %lu-%lu: %u %u",
__entry->context_idx, __entry->scheme_idx,
__entry->target_idx, __entry->nr_regions,
__entry->start, __entry->end,
__entry->nr_accesses, __entry->age)
);
TRACE_EVENT(damon_monitor_intervals_tune,
TP_PROTO(unsigned long sample_us),
TP_ARGS(sample_us),
TP_STRUCT__entry(
__field(unsigned long, sample_us)
),
TP_fast_assign(
__entry->sample_us = sample_us;
),
TP_printk("sample_us=%lu", __entry->sample_us)
);
TRACE_EVENT_CONDITION(damon_region_aggregated,
TP_PROTO(unsigned int target_id, struct damon_region *r,
unsigned int nr_regions, unsigned int nr_probes),
TP_ARGS(target_id, r, nr_regions, nr_probes),
TP_CONDITION(nr_probes > 0),
TP_STRUCT__entry(
__field(unsigned long, target_id)
__field(unsigned long, start)
__field(unsigned long, end)
__field(unsigned int, nr_regions)
__field(unsigned int, nr_accesses)
__field(unsigned int, age)
__dynamic_array(unsigned char, probe_hits, nr_probes)
),
TP_fast_assign(
__entry->target_id = target_id;
__entry->start = r->ar.start;
__entry->end = r->ar.end;
__entry->nr_regions = nr_regions;
__entry->nr_accesses = r->nr_accesses;
__entry->age = r->age;
memcpy(__get_dynamic_array(probe_hits), r->probe_hits,
sizeof(*r->probe_hits) * nr_probes);
),
TP_printk("target_id=%lu nr_regions=%u %lu-%lu: %u %u probe_hits=%s",
__entry->target_id, __entry->nr_regions,
__entry->start, __entry->end,
__entry->nr_accesses, __entry->age,
__print_hex(__get_dynamic_array(probe_hits),
__get_dynamic_array_len(probe_hits)))
);
TRACE_EVENT(damon_aggregated,
TP_PROTO(unsigned int target_id, struct damon_region *r,
unsigned int nr_regions),
TP_ARGS(target_id, r, nr_regions),
TP_STRUCT__entry(
__field(unsigned long, target_id)
__field(unsigned int, nr_regions)
__field(unsigned long, start)
__field(unsigned long, end)
__field(unsigned int, nr_accesses)
__field(unsigned int, age)
),
TP_fast_assign(
__entry->target_id = target_id;
__entry->nr_regions = nr_regions;
__entry->start = r->ar.start;
__entry->end = r->ar.end;
__entry->nr_accesses = r->nr_accesses;
__entry->age = r->age;
),
TP_printk("target_id=%lu nr_regions=%u %lu-%lu: %u %u",
__entry->target_id, __entry->nr_regions,
__entry->start, __entry->end,
__entry->nr_accesses, __entry->age)
);
#endif /* _TRACE_DAMON_H */
/* This part must be outside protection */
#include <trace/define_trace.h>