Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932418AbbEHT3V (ORCPT ); Fri, 8 May 2015 15:29:21 -0400 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:63082 "EHLO mx0b-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932318AbbEHT3S (ORCPT ); Fri, 8 May 2015 15:29:18 -0400 From: Josef Bacik To: , , Subject: [PATCH 2/5] trace-cmd: group schedule stacktraces together with --merge Date: Fri, 8 May 2015 15:29:01 -0400 Message-ID: <1431113344-22579-3-git-send-email-jbacik@fb.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1431113344-22579-1-git-send-email-jbacik@fb.com> References: <1431113344-22579-1-git-send-email-jbacik@fb.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [192.168.52.13] X-Proofpoint-Spam-Reason: safe X-FB-Internal: Safe X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.14.151,1.0.33,0.0.0000 definitions=2015-05-08_07:2015-05-08,2015-05-08,1970-01-01 signatures=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2963 Lines: 85 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 --- 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/