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 <[email protected]>
---
 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

Reply via email to