From: Namhyung Kim <namhyung@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Jiri Olsa <jolsa@kernel.org>, LKML <linux-kernel@vger.kernel.org>,
David Ahern <dsahern@gmail.com>, Andi Kleen <andi@firstfloor.org>,
Minchan Kim <minchan@kernel.org>
Subject: [PATCH 10/10] perf sched timehist: Show callchains for idle stat
Date: Tue, 6 Dec 2016 12:40:10 +0900 [thread overview]
Message-ID: <20161206034010.6499-11-namhyung@kernel.org> (raw)
In-Reply-To: <20161206034010.6499-1-namhyung@kernel.org>
When --idle-hist option is used with --summary, it now shows idle stats
with callchains like below:
Idle stats by callchain:
CPU 0: 902.195 msec
Idle time (msec) Count Callchains
---------------- -------- --------------------------------------------------
370.589 69 futex_wait_queue_me <- futex_wait <- do_futex <- sys_futex <- entry_SYSCALL_64_fastpath
178.799 17 worker_thread <- kthread <- ret_from_fork
128.352 17 schedule_timeout <- rcu_gp_kthread <- kthread <- ret_from_fork
125.111 19 schedule_hrtimeout_range_clock <- schedule_hrtimeout_range <- poll_schedule_timeout <- do_select <- core_sys_select
71.599 50 schedule_hrtimeout_range_clock <- schedule_hrtimeout_range <- poll_schedule_timeout <- do_sys_poll <- sys_poll
23.146 1 rcu_gp_kthread <- kthread <- ret_from_fork
4.510 1 schedule_hrtimeout_range_clock <- schedule_hrtimeout_range <- ep_poll <- sys_epoll_wait <- do_syscall_64
0.085 1 schedule_hrtimeout_range_clock <- schedule_hrtimeout_range <- poll_schedule_timeout <- do_sys_poll <- do_restart_poll
...
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/builtin-sched.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 86 insertions(+)
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index 7a5a497d9fa2..acd8ed5af438 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -2436,6 +2436,9 @@ static int timehist_sched_change_event(struct perf_tool *tool,
goto out;
timehist_update_runtime_stats(last_tr, t, tprev);
+ if (itr->cursor.nr)
+ callchain_append(&itr->callchain, &itr->cursor,
+ t - tprev);
itr->last_thread = NULL;
}
@@ -2546,6 +2549,60 @@ static int show_deadthread_runtime(struct thread *t, void *priv)
return __show_thread_runtime(t, priv);
}
+static size_t callchain__fprintf_folded(FILE *fp, struct callchain_node *node)
+{
+ const char *sep = " <- ";
+ struct callchain_list *chain;
+ size_t ret = 0;
+ char bf[1024];
+ bool first;
+
+ if (node == NULL)
+ return 0;
+
+ ret = callchain__fprintf_folded(fp, node->parent);
+ first = (ret == 0);
+
+ list_for_each_entry(chain, &node->val, list) {
+ if (chain->ip >= PERF_CONTEXT_MAX)
+ continue;
+ if (chain->ms.sym && chain->ms.sym->ignore)
+ continue;
+ ret += fprintf(fp, "%s%s", first ? "" : sep,
+ callchain_list__sym_name(chain, bf, sizeof(bf),
+ false));
+ first = false;
+ }
+
+ return ret;
+}
+
+static size_t timehist_print_idlehist_callchain(struct rb_root *root)
+{
+ size_t ret = 0;
+ FILE *fp = stdout;
+ struct callchain_node *chain;
+ struct rb_node *rb_node = rb_first(root);
+
+ printf(" %16s %8s %s\n", "Idle time (msec)", "Count", "Callchains");
+ printf(" %.16s %.8s %.50s\n", graph_dotted_line, graph_dotted_line,
+ graph_dotted_line);
+
+ while (rb_node) {
+ chain = rb_entry(rb_node, struct callchain_node, rb_node);
+ rb_node = rb_next(rb_node);
+
+ ret += fprintf(fp, " ");
+ print_sched_time(chain->hit, 12);
+ ret += 16; /* print_sched_time returns 2nd arg + 4 */
+ ret += fprintf(fp, " %8d ", chain->count);
+ ret += callchain__fprintf_folded(fp, chain);
+ ret += fprintf(fp, "\n");
+ }
+
+ return ret;
+}
+
static void timehist_print_summary(struct perf_sched *sched,
struct perf_session *session)
{
@@ -2604,6 +2661,35 @@ static void timehist_print_summary(struct perf_sched *sched,
printf(" CPU %2d idle entire time window\n", i);
}
+ if (sched->idle_hist && symbol_conf.use_callchain) {
+ callchain_param.mode = CHAIN_FOLDED;
+ callchain_param.value = CCVAL_PERIOD;
+
+ callchain_register_param(&callchain_param);
+
+ printf("\nIdle stats by callchain:\n");
+ for (i = 0; i < idle_max_cpu; ++i) {
+ struct idle_thread_runtime *itr;
+
+ t = idle_threads[i];
+ if (!t)
+ continue;
+
+ itr = thread__priv(t);
+ if (itr == NULL)
+ continue;
+
+ callchain_param.sort(&itr->sorted_root, &itr->callchain,
+ 0, &callchain_param);
+
+ printf(" CPU %2d:", i);
+ print_sched_time(itr->tr.total_run_time, 6);
+ printf(" msec\n");
+ timehist_print_idlehist_callchain(&itr->sorted_root);
+ printf("\n");
+ }
+ }
+
printf("\n"
" Total number of unique tasks: %" PRIu64 "\n"
"Total number of context switches: %" PRIu64 "\n"
--
2.10.1
next prev parent reply other threads:[~2016-12-06 3:41 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-06 3:40 [PATCHSET 00/10] perf sched timehist: Introduce --idle-hist option (v1) Namhyung Kim
2016-12-06 3:40 ` [PATCH 01/10] perf sched: Cleanup option processing Namhyung Kim
2016-12-06 3:58 ` David Ahern
2016-12-07 18:24 ` [tip:perf/core] " tip-bot for Namhyung Kim
2016-12-06 3:40 ` [PATCH 02/10] perf tools: Introduce callchain_cursor__copy() Namhyung Kim
2016-12-07 18:25 ` [tip:perf/core] perf callchain: " tip-bot for Namhyung Kim
2016-12-06 3:40 ` [PATCH 03/10] perf sched timehist: Handle zero sample->tid properly Namhyung Kim
2016-12-06 3:52 ` David Ahern
2016-12-06 3:59 ` Namhyung Kim
2016-12-06 4:01 ` David Ahern
2016-12-07 2:06 ` Namhyung Kim
2016-12-08 14:19 ` Namhyung Kim
2016-12-07 18:25 ` [tip:perf/core] " tip-bot for Namhyung Kim
2016-12-06 3:40 ` [PATCH 04/10] perf sched timehist: Split is_idle_sample() Namhyung Kim
2016-12-06 3:57 ` David Ahern
2016-12-07 1:26 ` Namhyung Kim
2016-12-06 3:40 ` [PATCH 05/10] perf sched timehist: Cleanup idle_max_cpu handling Namhyung Kim
2016-12-06 4:00 ` David Ahern
2016-12-07 18:26 ` [tip:perf/core] " tip-bot for Namhyung Kim
2016-12-06 3:40 ` [PATCH 06/10] perf sched timehist: Introduce struct idle_time_data Namhyung Kim
2016-12-06 4:07 ` David Ahern
2016-12-07 2:12 ` Namhyung Kim
2016-12-06 3:40 ` [PATCH 07/10] perf sched timehist: Save callchain when entering idle Namhyung Kim
2016-12-06 3:40 ` [PATCH 08/10] perf sched timehist: Skip non-idle events when necessary Namhyung Kim
2016-12-06 3:40 ` [PATCH 09/10] perf sched timehist: Add -I/--idle-hist option Namhyung Kim
2016-12-06 3:40 ` Namhyung Kim [this message]
2016-12-06 19:44 ` [PATCHSET 00/10] perf sched timehist: Introduce --idle-hist option (v1) Arnaldo Carvalho de Melo
2016-12-06 21:31 ` David Ahern
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=20161206034010.6499-11-namhyung@kernel.org \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=andi@firstfloor.org \
--cc=dsahern@gmail.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=minchan@kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.