From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
John Stultz <john.stultz@linaro.org>,
Eric Dumazet <edumazet@google.com>,
Anna-Maria Gleixner <anna-maria@linutronix.de>,
"Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
linux-pm@vger.kernel.org, Arjan van de Ven <arjan@infradead.org>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
Rik van Riel <riel@redhat.com>,
Steven Rostedt <rostedt@goodmis.org>
Subject: [patch V2 09/10] timer_migration: Add tracepoints
Date: Tue, 18 Apr 2017 13:11:11 +0200 [thread overview]
Message-ID: <20170418111401.115623457@linutronix.de> (raw)
In-Reply-To: 20170418111102.490432548@linutronix.de
[-- Attachment #1: timer-migration-Add-tracepoints.patch --]
[-- Type: text/plain, Size: 7283 bytes --]
The timer pull logic needs proper debugging aids. Add tracepoints so the
hierarchical idle machinery can be diagnosed.
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
V2: Reordered trace point storage to avoid holes.
include/trace/events/timer_migration.h | 173 +++++++++++++++++++++++++++++++++
kernel/time/timer_migration.c | 17 +++
2 files changed, 190 insertions(+)
--- /dev/null
+++ b/include/trace/events/timer_migration.h
@@ -0,0 +1,173 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM timer_migration
+
+#if !defined(_TRACE_TIMER_MIGRATION_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_TIMER_MIGRATION_H
+
+#include <linux/tracepoint.h>
+
+/* Group events */
+DECLARE_EVENT_CLASS(tmigr_group,
+
+ TP_PROTO(struct tmigr_group *group),
+
+ TP_ARGS(group),
+
+ TP_STRUCT__entry(
+ __field( void *, group )
+ __field( void *, parent )
+ __field( u64, nextevt )
+ __field( unsigned int, lvl )
+ __field( unsigned int, numa_node )
+ __field( unsigned int, active )
+ __field( unsigned int, migrator )
+ __field( unsigned int, num_childs )
+ __field( unsigned int, evtcpu )
+ ),
+
+ TP_fast_assign(
+ __entry->group = group;
+ __entry->lvl = group->level;
+ __entry->numa_node = group->numa_node;
+ __entry->active = group->active;
+ __entry->migrator = group->migrator;
+ __entry->num_childs = group->num_childs;
+ __entry->parent = group->parent;
+ __entry->nextevt = group->groupevt.nextevt.expires;
+ __entry->evtcpu = group->groupevt.cpu;
+ ),
+
+ TP_printk("group=%p lvl=%d numa=%d active=%d migrator=%d num_childs=%d "
+ "parent=%p nextevt=%llu evtcpu=%d",
+ __entry->group, __entry->lvl, __entry->numa_node,
+ __entry->active, __entry->migrator, __entry->num_childs,
+ __entry->parent, __entry->nextevt, __entry->evtcpu)
+);
+
+DEFINE_EVENT(tmigr_group, tmigr_group_addevt,
+
+ TP_PROTO(struct tmigr_group *group),
+
+ TP_ARGS(group)
+);
+
+DEFINE_EVENT(tmigr_group, tmigr_group_removeevt,
+
+ TP_PROTO(struct tmigr_group *group),
+
+ TP_ARGS(group)
+);
+
+DEFINE_EVENT(tmigr_group, tmigr_group_set_cpu_inactive,
+
+ TP_PROTO(struct tmigr_group *group),
+
+ TP_ARGS(group)
+);
+
+DEFINE_EVENT(tmigr_group, tmigr_group_set_cpu_active,
+
+ TP_PROTO(struct tmigr_group *group),
+
+ TP_ARGS(group)
+);
+
+DEFINE_EVENT(tmigr_group, tmigr_group_free,
+
+ TP_PROTO(struct tmigr_group *group),
+
+ TP_ARGS(group)
+);
+
+DEFINE_EVENT(tmigr_group, tmigr_group_set,
+
+ TP_PROTO(struct tmigr_group *group),
+
+ TP_ARGS(group)
+);
+
+DEFINE_EVENT(tmigr_group, tmigr_group_setup_parents,
+
+ TP_PROTO(struct tmigr_group *group),
+
+ TP_ARGS(group)
+);
+
+/* CPU events*/
+DECLARE_EVENT_CLASS(tmigr_cpugroup,
+
+ TP_PROTO(struct tmigr_cpu *tcpu, unsigned int cpu),
+
+ TP_ARGS(tcpu, cpu),
+
+ TP_STRUCT__entry(
+ __field( void *, parent)
+ __field( unsigned int, cpu)
+ ),
+
+ TP_fast_assign(
+ __entry->cpu = cpu;
+ __entry->parent = tcpu->tmgroup;
+ ),
+
+ TP_printk("cpu=%d parent=%p", __entry->cpu, __entry->parent)
+);
+
+DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_update_remote,
+
+ TP_PROTO(struct tmigr_cpu *tcpu, unsigned int cpu),
+
+ TP_ARGS(tcpu, cpu)
+);
+
+DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_add,
+
+ TP_PROTO(struct tmigr_cpu *tcpu, unsigned int cpu),
+
+ TP_ARGS(tcpu, cpu)
+);
+
+/* Other events */
+TRACE_EVENT(tmigr_handle_remote,
+
+ TP_PROTO(struct tmigr_group *group, unsigned int cpu),
+
+ TP_ARGS(group, cpu),
+
+ TP_STRUCT__entry(
+ __field( void *, group )
+ __field( void *, parent )
+ __field( u64, nextevt )
+ __field( unsigned int, lvl )
+ __field( unsigned int, numa_node )
+ __field( unsigned int, active )
+ __field( unsigned int, migrator )
+ __field( unsigned int, num_childs )
+ __field( unsigned int, evtcpu )
+ __field( unsigned int, cpu )
+ ),
+
+ TP_fast_assign(
+ __entry->group = group;
+ __entry->lvl = group->level;
+ __entry->numa_node = group->numa_node;
+ __entry->active = group->active;
+ __entry->migrator = group->migrator;
+ __entry->num_childs = group->num_childs;
+ __entry->parent = group->parent;
+ __entry->nextevt = group->groupevt.nextevt.expires;
+ __entry->evtcpu = group->groupevt.cpu;
+ __entry->cpu = cpu;
+ ),
+
+ TP_printk("group=%p lvl=%d numa=%d active=%d migrator=%d num_childs=%d "
+ "parent=%p nextevt=%llu evtcpu=%d cpu=%d",
+ __entry->group, __entry->lvl, __entry->numa_node,
+ __entry->active, __entry->migrator, __entry->num_childs,
+ __entry->parent, __entry->nextevt, __entry->evtcpu, __entry->cpu)
+);
+
+#endif /* _TRACE_TIMER_MIGRATION_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
--- a/kernel/time/timer_migration.c
+++ b/kernel/time/timer_migration.c
@@ -16,6 +16,9 @@
#include "timer_migration.h"
#include "tick-internal.h"
+#define CREATE_TRACE_POINTS
+#include <trace/events/timer_migration.h>
+
#ifdef DEBUG
# define DBG_BUG_ON(x) BUG_ON(x)
#else
@@ -53,6 +56,8 @@ static void tmigr_add_evt(struct tmigr_g
group->groupevt.nextevt.expires = evt->nextevt.expires;
group->groupevt.cpu = evt->cpu;
}
+
+ trace_tmigr_group_addevt(group);
}
static void tmigr_remove_evt(struct tmigr_group *group, struct tmigr_event *evt)
@@ -86,6 +91,8 @@ static void tmigr_remove_evt(struct tmig
group->groupevt.nextevt.expires = nextevt->nextevt.expires;
group->groupevt.cpu = nextevt->cpu;
}
+
+ trace_tmigr_group_removeevt(group);
}
static void tmigr_update_remote(unsigned int cpu, u64 now, unsigned long jif)
@@ -142,6 +149,7 @@ static void tmigr_update_remote(unsigned
tmigr_add_evt(group, &tmc->cpuevt);
done:
+ trace_tmigr_cpu_update_remote(tmc, cpu);
raw_spin_unlock(&group->lock);
raw_spin_unlock_irq(&tmc->lock);
}
@@ -153,6 +161,8 @@ static void __tmigr_handle_remote(struct
struct tmigr_group *parent;
struct tmigr_event *evt;
+ trace_tmigr_handle_remote(group, cpu);
+
again:
raw_spin_lock_irq(&group->lock);
/*
@@ -332,6 +342,7 @@ static u64 tmigr_set_cpu_inactive(struct
nextevt = group->groupevt.nextevt.expires;
}
done:
+ trace_tmigr_group_set_cpu_inactive(group);
raw_spin_unlock(&group->lock);
return nextevt;
}
@@ -390,6 +401,9 @@ static void tmigr_set_cpu_active(struct
if (parent)
tmigr_set_cpu_active(parent, &group->groupevt, cpu);
}
+
+ trace_tmigr_group_set_cpu_active(group);
+
/*
* Update groupevt and dequeue @evt. Must be called after parent
* groups have been updated above so @group->groupevt is inactive.
@@ -425,6 +439,7 @@ static void tmigr_free_group(struct tmig
if (!group->parent->num_childs)
tmigr_free_group(group->parent);
}
+ trace_tmigr_group_free(group);
list_del(&group->list);
free_cpumask_var(group->cpus);
kfree(group);
@@ -475,6 +490,7 @@ static struct tmigr_group *tmigr_get_gro
tmigr_init_group(group, lvl, node);
/* Setup successful. Add it to the hierarchy */
list_add(&group->list, &tmigr_level_list[lvl]);
+ trace_tmigr_group_set(group);
return group;
}
@@ -502,6 +518,7 @@ static int tmigr_setup_parents(unsigned
if (group->active)
tmigr_set_cpu_active(parent, NULL, group->migrator);
raw_spin_unlock_irq(&group->lock);
+ trace_tmigr_group_setup_parents(group);
ret = 1;
}
return ret;
next prev parent reply other threads:[~2017-04-18 16:45 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-18 11:11 [patch V2 00/10] timer: Move from a push remote at enqueue to a pull at expiry model Thomas Gleixner
2017-04-18 11:11 ` [patch V2 01/10] timer: Invoke timer_start_debug() where it makes sense Thomas Gleixner
2017-04-18 11:11 ` [patch V2 02/10] timerqueue: Document return values of timerqueue_add/del() Thomas Gleixner
2017-04-18 11:11 ` [patch V2 03/10] timers: Rework idle logic Thomas Gleixner
2017-04-19 6:50 ` Peter Zijlstra
2017-04-21 14:43 ` Frederic Weisbecker
2017-04-18 11:11 ` [patch V2 04/10] timer: Keep the pinned timers separate from the others Thomas Gleixner
2017-04-18 11:11 ` [patch V2 05/10] timer: Retrieve next expiry of pinned/non-pinned timers seperately Thomas Gleixner
2017-04-19 7:05 ` Peter Zijlstra
2017-04-19 9:56 ` Thomas Gleixner
2017-04-18 11:11 ` [patch V2 06/10] timer: Restructure internal locking Thomas Gleixner
2017-04-19 7:07 ` Peter Zijlstra
2017-04-18 11:11 ` [patch V2 07/10] tick/sched: Split out jiffies update helper function Thomas Gleixner
2017-04-18 11:11 ` [patch V2 08/10] timer: Implement the hierarchical pull model Thomas Gleixner
2017-04-19 7:20 ` Peter Zijlstra
2017-04-19 7:24 ` Peter Zijlstra
2017-04-19 7:34 ` Peter Zijlstra
2017-04-19 7:38 ` Peter Zijlstra
2017-04-19 8:11 ` Peter Zijlstra
2017-04-19 8:31 ` Thomas Gleixner
2017-04-19 8:36 ` Peter Zijlstra
2017-04-19 9:03 ` Thomas Gleixner
2017-04-19 8:52 ` Peter Zijlstra
2017-04-19 9:09 ` Peter Zijlstra
2017-04-19 9:43 ` Thomas Gleixner
2017-04-19 9:52 ` Peter Zijlstra
2017-04-19 9:44 ` Peter Zijlstra
2017-04-19 9:53 ` Peter Zijlstra
2017-04-19 9:20 ` Peter Zijlstra
2017-04-19 10:22 ` Peter Zijlstra
2017-04-18 11:11 ` Thomas Gleixner [this message]
2017-04-18 11:11 ` [patch V2 10/10] timer: Always queue timers on the local CPU Thomas Gleixner
2017-04-21 19:28 ` [patch V2 00/10] timer: Move from a push remote at enqueue to a pull at expiry model Paul E. McKenney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170418111401.115623457@linutronix.de \
--to=tglx@linutronix.de \
--cc=anna-maria@linutronix.de \
--cc=arjan@infradead.org \
--cc=edumazet@google.com \
--cc=fweisbec@gmail.com \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=rafael.j.wysocki@intel.com \
--cc=riel@redhat.com \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).