[PATCH 2/5] trace-cmd: group schedule stacktraces together with --merge

From: Josef Bacik
Date: Fri May 08 2015 - 15:30:25 EST


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@xxxxxx>
---
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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/