Add tracing support to track - start and end of scanning. - migration. CC: Steven Rostedt <rostedt@xxxxxxxxxxx> CC: Masami Hiramatsu <mhiramat@xxxxxxxxxx> CC: linux-trace-kernel@xxxxxxxxxxxxxxx Signed-off-by: Raghavendra K T <raghavendra.kt@xxxxxxx> --- Changes done based Steves feedback: 1) Using EVENT class for similar traces 2) Dropping task_comm 3) remove unnecessary module name in print include/trace/events/kmem.h | 90 +++++++++++++++++++++++++++++++++++++ mm/kmmscand.c | 8 ++++ 2 files changed, 98 insertions(+) diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h index b37eb0a7060f..cef527ef9d79 100644 --- a/include/trace/events/kmem.h +++ b/include/trace/events/kmem.h @@ -9,6 +9,96 @@ #include <linux/tracepoint.h> #include <trace/events/mmflags.h> +DECLARE_EVENT_CLASS(kmem_mm_class, + + TP_PROTO(struct mm_struct *mm), + + TP_ARGS(mm), + + TP_STRUCT__entry( + __field( struct mm_struct *, mm ) + ), + + TP_fast_assign( + __entry->mm = mm; + ), + + TP_printk("mm = %p", __entry->mm) +); + +DEFINE_EVENT(kmem_mm_class, kmem_mm_enter, + TP_PROTO(struct mm_struct *mm), + TP_ARGS(mm) +); + +DEFINE_EVENT(kmem_mm_class, kmem_mm_exit, + TP_PROTO(struct mm_struct *mm), + TP_ARGS(mm) +); + +DEFINE_EVENT(kmem_mm_class, kmem_scan_mm_start, + TP_PROTO(struct mm_struct *mm), + TP_ARGS(mm) +); + +TRACE_EVENT(kmem_scan_mm_end, + + TP_PROTO( struct mm_struct *mm, + unsigned long start, + unsigned long total, + unsigned long scan_period, + unsigned long scan_size, + int target_node), + + TP_ARGS(mm, start, total, scan_period, scan_size, target_node), + + TP_STRUCT__entry( + __field( struct mm_struct *, mm ) + __field( unsigned long, start ) + __field( unsigned long, total ) + __field( unsigned long, scan_period ) + __field( unsigned long, scan_size ) + __field( int, target_node ) + ), + + TP_fast_assign( + __entry->mm = mm; + __entry->start = start; + __entry->total = total; + __entry->scan_period = scan_period; + __entry->scan_size = scan_size; + __entry->target_node = target_node; + ), + + TP_printk("mm=%p, start = %ld, total = %ld, scan_period = %ld, scan_size = %ld node = %d", + __entry->mm, __entry->start, __entry->total, __entry->scan_period, + __entry->scan_size, __entry->target_node) +); + +TRACE_EVENT(kmem_scan_mm_migrate, + + TP_PROTO(struct mm_struct *mm, + int rc, + int target_node), + + TP_ARGS(mm, rc, target_node), + + TP_STRUCT__entry( + __field( struct mm_struct *, mm ) + __field( int, rc ) + __field( int, target_node ) + ), + + TP_fast_assign( + __entry->mm = mm; + __entry->rc = rc; + __entry->target_node = target_node; + ), + + TP_printk("mm = %p rc = %d node = %d", + __entry->mm, __entry->rc, __entry->target_node) +); + TRACE_EVENT(kmem_cache_alloc, TP_PROTO(unsigned long call_site, diff --git a/mm/kmmscand.c b/mm/kmmscand.c index c88b30e0fc7d..38d7825c0d62 100644 --- a/mm/kmmscand.c +++ b/mm/kmmscand.c @@ -945,6 +945,7 @@ static void kmmscand_migrate_folio(void) } ret = kmmscand_promote_folio(info, dest); + trace_kmem_scan_mm_migrate(info->mm, ret, dest); } /* TBD: encode migrated count here, currently assume folio_nr_pages */ @@ -1115,6 +1116,9 @@ static unsigned long kmmscand_scan_mm_slot(void) mm_target_node = READ_ONCE(mm->target_node); if (mm_target_node != mm_slot_target_node) WRITE_ONCE(mm->target_node, mm_slot_target_node); + + trace_kmem_scan_mm_start(mm); + now = jiffies; if (mm_slot_next_scan && time_before(now, mm_slot_next_scan)) @@ -1172,6 +1176,8 @@ static unsigned long kmmscand_scan_mm_slot(void) kmmscand_update_mmslot_info(mm_slot, total, target_node); } + trace_kmem_scan_mm_end(mm, address, total, mm_slot_scan_period, + mm_slot_scan_size, target_node); outerloop: /* exit_mmap will destroy ptes after this */ @@ -1323,6 +1329,7 @@ void __kmmscand_enter(struct mm_struct *mm) spin_unlock(&kmmscand_mm_lock); mmgrab(mm); + trace_kmem_mm_enter(mm); if (wakeup) wake_up_interruptible(&kmmscand_wait); } @@ -1333,6 +1340,7 @@ void __kmmscand_exit(struct mm_struct *mm) struct mm_slot *slot; int free = 0, serialize = 1; + trace_kmem_mm_exit(mm); spin_lock(&kmmscand_mm_lock); slot = mm_slot_lookup(kmmscand_slots_hash, mm); mm_slot = mm_slot_entry(slot, struct kmmscand_mm_slot, slot); -- 2.34.1