[PATCH 7/8] perf sched timehist: Add support for context-switch event
From: David Ahern
Date: Mon Nov 18 2013 - 15:34:47 EST
Context switch events are 64 bytes; sched_switch events are 136 bytes. Both
indicate scheduling changes, so allow user to leverage the smaller event. If
both events exist in a data file, then context-switch event is ignored.
Signed-off-by: David Ahern <dsahern@xxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxxxxx>
Cc: Frederic Weisbecker <fweisbec@xxxxxxxxx>
Cc: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>
Cc: Mike Galbraith <efault@xxxxxx>
Cc: Jiri Olsa <jolsa@xxxxxxxxxx>
Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
Cc: Stephane Eranian <eranian@xxxxxxxxxx>
Cc: Pekka Enberg <penberg@xxxxxxxxxx>
---
tools/perf/builtin-sched.c | 40 +++++++++++++++++++++++++++++++++++-----
1 file changed, 35 insertions(+), 5 deletions(-)
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index ffe11067083c..79a94655d3ed 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -180,6 +180,7 @@ struct perf_sched {
unsigned int max_stack;
bool show_cpu_visual;
bool show_wakeups;
+ bool have_traces;
/* process and task id's of interest */
struct target target;
struct intlist *pid, *tid;
@@ -2070,6 +2071,15 @@ out:
return rc;
}
+static int timehist_cs_event(struct perf_tool *tool __maybe_unused,
+ union perf_event *event,
+ struct perf_evsel *evsel,
+ struct perf_sample *sample,
+ struct machine *machine __maybe_unused)
+{
+ return timehist_sched_change_event(tool, event, evsel, sample, machine);
+}
+
static int timehist_sched_switch_event(struct perf_tool *tool,
union perf_event *event,
struct perf_evsel *evsel,
@@ -2293,10 +2303,25 @@ static int parse_target_str(struct perf_sched *sched)
static int timehist_check_attr(struct perf_sched *sched,
struct perf_evlist *evlist)
{
- struct perf_evsel *evsel;
+ struct perf_evsel *evsel, *cs_evsel = NULL;
struct evsel_runtime *er;
+ const char *evname;
+ bool have_cs_event = false, have_sched_event = false;
list_for_each_entry(evsel, &evlist->entries, node) {
+ if (evsel->attr.type == PERF_TYPE_TRACEPOINT)
+ sched->have_traces = true;
+
+ evname = perf_evsel__name(evsel);
+ if (strcmp(evname, "cs") == 0 ||
+ strcmp(evname, "context-switch") == 0) {
+ cs_evsel = evsel;
+ have_cs_event = true;
+ } else if (strcmp(evname, "sched:sched_switch") == 0) {
+ have_sched_event = true;
+ }
+
+
er = perf_evsel__get_runtime(evsel);
if (er == NULL) {
pr_err("Failed to allocate memory for evsel runtime data\n");
@@ -2311,6 +2336,13 @@ static int timehist_check_attr(struct perf_sched *sched,
}
}
+ if (have_cs_event && have_sched_event) {
+ pr_debug("Both schedule change events exist. Ignoring context-switch event\n");
+ } else if (have_cs_event) {
+ pr_debug("Using context-switch events.\n");
+ cs_evsel->handler = timehist_cs_event;
+ }
+
return 0;
}
@@ -2367,10 +2399,8 @@ static int perf_sched__timehist(struct perf_sched *sched)
setup_pager();
/* setup per-evsel handlers */
- if (perf_session__set_tracepoints_handlers(session, handlers))
- goto out;
-
- if (!perf_session__has_traces(session, "record -R"))
+ if (sched->have_traces &&
+ perf_session__set_tracepoints_handlers(session, handlers))
goto out;
/* pre-allocate struct for per-CPU idle stats */
--
1.8.3.4 (Apple Git-47)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/