From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932308AbcLMIHt (ORCPT ); Tue, 13 Dec 2016 03:07:49 -0500 Received: from mail-pg0-f67.google.com ([74.125.83.67]:36638 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752597AbcLMIHr (ORCPT ); Tue, 13 Dec 2016 03:07:47 -0500 From: Namhyung Kim To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , David Ahern , Andi Kleen , Minchan Kim Subject: [PATCH 1/2] perf sched timehist: Fix --idle-hist when no callchains Date: Tue, 13 Dec 2016 17:06:31 +0900 Message-Id: <20161213080632.19099-1-namhyung@kernel.org> X-Mailer: git-send-email 2.10.2 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When idle hist is enabled, the itr->last_thread should be set so that it can find which thread run before idle task. But it was only set in the save_idle_callchain(). This makes idle task doesn't show up in the output when callchain is not recorded. Before: $ perf sched timehist --idle-hist Samples do not have callchains. time cpu task name wait time sch delay run time [tid/pid] (msec) (msec) (msec) --------------- ------ -------------------- --------- --------- --------- 197731.753834 [0001] perf[27469] 0.000 0.000 0.000 197731.753915 [0003] migration/3[23] 0.000 0.000 0.000 197731.754335 [0002] firefox[17773/17739] 0.000 0.000 0.000 197731.754486 [0001] sleep[27470] 0.000 0.000 0.000 197731.754981 [0002] firefox[17773/17739] 0.000 0.000 0.000 197731.755994 [0002] firefox[17773/17739] 0.000 0.000 0.000 ... After: 197731.753834 [0001] perf[27469] 0.000 0.000 0.000 197731.753914 [0001] 0.000 0.000 0.079 197731.753915 [0003] migration/3[23] 0.000 0.000 0.000 197731.754335 [0002] firefox[17773/17739] 0.000 0.000 0.000 197731.754486 [0001] sleep[27470] 0.000 0.000 0.000 197731.754903 [0002] 0.047 0.000 0.567 197731.754981 [0002] firefox[17773/17739] 0.000 0.000 0.567 197731.755922 [0002] 0.078 0.000 0.941 197731.755994 [0002] firefox[17773/17739] 0.000 0.000 0.941 197731.756625 [0003] 0.123 0.000 2.709 ... Signed-off-by: Namhyung Kim --- tools/perf/builtin-sched.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 0750e938a656..405a91d0515f 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -2102,26 +2102,12 @@ static struct thread *get_idle_thread(int cpu) return idle_threads[cpu]; } -static void save_idle_callchain(struct thread *thread, +static void save_idle_callchain(struct idle_thread_runtime *itr, struct perf_sample *sample) { - struct thread *idle; - struct idle_thread_runtime *itr; - if (!symbol_conf.use_callchain || sample->callchain == NULL) return; - idle = get_idle_thread(sample->cpu); - if (idle == NULL) { - pr_err("Failed to get idle thread for cpu %d.\n", sample->cpu); - return; - } - - itr = thread__priv(idle); - if (itr == NULL) - return; - - itr->last_thread = thread; callchain_cursor__copy(&itr->cursor, &callchain_cursor); } @@ -2179,9 +2165,24 @@ static struct thread *timehist_get_thread(struct perf_sched *sched, save_task_callchain(sched, sample, evsel, machine); if (sched->idle_hist) { + struct thread *idle; + struct idle_thread_runtime *itr; + + idle = get_idle_thread(sample->cpu); + if (idle == NULL) { + pr_err("Failed to get idle thread for cpu %d.\n", sample->cpu); + return NULL; + } + + itr = thread__priv(idle); + if (itr == NULL) + return NULL; + + itr->last_thread = thread; + /* copy task callchain when entering to idle */ if (perf_evsel__intval(evsel, sample, "next_pid") == 0) - save_idle_callchain(thread, sample); + save_idle_callchain(itr, sample); } } -- 2.10.2