lkml.org 
[lkml]   [2016]   [Dec]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 04/10] perf sched timehist: Split is_idle_sample()
    Date
    The is_idle_sample() function actually does more than determining
    whether sample come from idle task. Split the callchain part into
    save_task_callchain() to make it clearer. Also checking prev_pid from
    trace data looks unnecessary since it should be always same as
    sample->pid.

    Signed-off-by: Namhyung Kim <namhyung@kernel.org>
    ---
    tools/perf/builtin-sched.c | 35 ++++++++++++++++-------------------
    1 file changed, 16 insertions(+), 19 deletions(-)

    diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
    index e34a71166b4a..5f69c9b9c78f 100644
    --- a/tools/perf/builtin-sched.c
    +++ b/tools/perf/builtin-sched.c
    @@ -1939,39 +1939,36 @@ static void timehist_update_runtime_stats(struct thread_runtime *r,
    r->total_run_time += r->dt_run;
    }

    -static bool is_idle_sample(struct perf_sched *sched,
    - struct perf_sample *sample,
    - struct perf_evsel *evsel,
    - struct machine *machine)
    +static bool is_idle_sample(struct perf_sample *sample)
    {
    - struct thread *thread;
    - struct callchain_cursor *cursor = &callchain_cursor;
    -
    /* pid 0 == swapper == idle task */
    - if (sample->pid == 0)
    - return true;
    + return (sample->pid == 0);
    +}

    - if (strcmp(perf_evsel__name(evsel), "sched:sched_switch") == 0) {
    - if (perf_evsel__intval(evsel, sample, "prev_pid") == 0)
    - return true;
    - }
    +static void save_task_callchain(struct perf_sched *sched,
    + struct perf_sample *sample,
    + struct perf_evsel *evsel,
    + struct machine *machine)
    +{
    + struct callchain_cursor *cursor = &callchain_cursor;
    + struct thread *thread;

    /* want main thread for process - has maps */
    thread = machine__findnew_thread(machine, sample->pid, sample->pid);
    if (thread == NULL) {
    pr_debug("Failed to get thread for pid %d.\n", sample->pid);
    - return false;
    + return;
    }

    if (!symbol_conf.use_callchain || sample->callchain == NULL)
    - return false;
    + return;

    if (thread__resolve_callchain(thread, cursor, evsel, sample,
    NULL, NULL, sched->max_stack + 2) != 0) {
    if (verbose)
    error("Failed to resolve callchain. Skipping\n");

    - return false;
    + return;
    }

    callchain_cursor_commit(cursor);
    @@ -1994,8 +1991,6 @@ static bool is_idle_sample(struct perf_sched *sched,

    callchain_cursor_advance(cursor);
    }
    -
    - return false;
    }

    /*
    @@ -2112,7 +2107,7 @@ static struct thread *timehist_get_thread(struct perf_sched *sched,
    {
    struct thread *thread;

    - if (is_idle_sample(sched, sample, evsel, machine)) {
    + if (is_idle_sample(sample)) {
    thread = get_idle_thread(sample->cpu);
    if (thread == NULL)
    pr_err("Failed to get idle thread for cpu %d.\n", sample->cpu);
    @@ -2125,6 +2120,8 @@ static struct thread *timehist_get_thread(struct perf_sched *sched,
    pr_debug("Failed to get thread for tid %d. skipping sample.\n",
    sample->tid);
    }
    +
    + save_task_callchain(sched, sample, evsel, machine);
    }

    return thread;
    --
    2.10.1
    \
     
     \ /
      Last update: 2016-12-06 04:43    [W:2.313 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site