Messages in this thread Patch in this message | | | From | Namhyung Kim <> | Subject | [PATCH 1/2] perf sched timehist: Fix --idle-hist when no callchains | Date | Tue, 13 Dec 2016 17:06:31 +0900 |
| |
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] <idle> 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] <idle> 0.047 0.000 0.567 197731.754981 [0002] firefox[17773/17739] 0.000 0.000 0.567 197731.755922 [0002] <idle> 0.078 0.000 0.941 197731.755994 [0002] firefox[17773/17739] 0.000 0.000 0.941 197731.756625 [0003] <idle> 0.123 0.000 2.709 ...
Signed-off-by: Namhyung Kim <namhyung@kernel.org> --- 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
| |