lkml.org 
[lkml]   [2015]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/5] trace-cmd: group schedule stacktraces together with --merge
    Date
    With --merge we want to be able to merge the scheduling information as well so
    we can see how the whole app spent its time. This is a little tricky because we
    have to sort based on comm instead of pid. It works out well enough because we
    store the intermediate information in the per task hash, but we want to group
    the final information together.

    Signed-off-by: Josef Bacik <jbacik@fb.com>
    ---
    trace-profile.c | 22 ++++++++++++++++++----
    1 file changed, 18 insertions(+), 4 deletions(-)

    diff --git a/trace-profile.c b/trace-profile.c
    index bd775e8..eee026e 100644
    --- a/trace-profile.c
    +++ b/trace-profile.c
    @@ -985,6 +985,7 @@ static int handle_sched_switch_event(struct handle_data *h,
    unsigned long long prev_pid;
    unsigned long long prev_state;
    unsigned long long next_pid;
    + unsigned long long val = 0;
    struct start_data *start;

    /* pid_field holds prev_pid, data_field holds prev_state */
    @@ -1019,6 +1020,12 @@ static int handle_sched_switch_event(struct handle_data *h,
    if (!task->comm)
    add_task_comm(h, task, h->switch_next_comm, record);

    + if (task->comm && task->group) {
    + char *str = task->comm;
    + while (*str) val += (int)*(str++);
    + } else
    + val = next_pid;
    +
    /*
    * If the next task was blocked, it required a wakeup to
    * restart, and there should be one.
    @@ -1028,10 +1035,10 @@ static int handle_sched_switch_event(struct handle_data *h,
    *
    * event_data->start holds the sched_wakeup event data.
    */
    - find_and_update_start(task, event_data->start, record->ts, next_pid);
    + find_and_update_start(task, event_data->start, record->ts, val);

    /* Look for this task if it was preempted (no wakeup found). */
    - find_and_update_start(task, event_data, record->ts, next_pid);
    + find_and_update_start(task, event_data, record->ts, val);

    return 0;
    }
    @@ -1186,6 +1193,7 @@ static int handle_sched_wakeup_event(struct handle_data *h,
    struct task_data *task = NULL;
    struct start_data *start;
    unsigned long long success;
    + unsigned long long val = 0;

    proxy = find_task(h, pid);

    @@ -1224,11 +1232,17 @@ static int handle_sched_wakeup_event(struct handle_data *h,
    */
    proxy->proxy = task;

    + if (task->comm && task->group) {
    + char *str = task->comm;
    + while (*str) val += (int)*(str++);
    + } else
    + val = pid;
    +
    /* There should be a blocked schedule out of this task */
    - find_and_update_start(task, event_data->start, record->ts, pid);
    + find_and_update_start(task, event_data->start, record->ts, val);

    /* Set this up for timing how long the wakeup takes */
    - start = add_start(task, event_data, record, pid, pid);
    + start = add_start(task, event_data, record, val, val);
    task->last_event = NULL;
    task->last_start = start;

    --
    2.1.0


    \
     
     \ /
      Last update: 2015-05-08 21:41    [W:6.285 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site