From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754243AbbCaOcm (ORCPT ); Tue, 31 Mar 2015 10:32:42 -0400 Received: from mail-ie0-f182.google.com ([209.85.223.182]:34653 "EHLO mail-ie0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752540AbbCaOcj (ORCPT ); Tue, 31 Mar 2015 10:32:39 -0400 Message-ID: <551AB005.8080102@gmail.com> Date: Tue, 31 Mar 2015 08:32:37 -0600 From: David Ahern User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Yunlong Song , a.p.zijlstra@chello.nl, paulus@samba.org, mingo@redhat.com, acme@kernel.org CC: linux-kernel@vger.kernel.org, wangnan0@huawei.com Subject: Re: [PATCH 3/9] perf sched replay: Alloc the memory of pid_to_task dynamically to adapt to the unexpected change of pid_max References: <1427809596-29559-1-git-send-email-yunlong.song@huawei.com> <1427809596-29559-4-git-send-email-yunlong.song@huawei.com> In-Reply-To: <1427809596-29559-4-git-send-email-yunlong.song@huawei.com> Content-Type: multipart/mixed; boundary="------------010604060108050007030901" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a multi-part message in MIME format. --------------010604060108050007030901 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit On 3/31/15 7:46 AM, Yunlong Song wrote: > diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c > index c466104..20d887b 100644 > --- a/tools/perf/builtin-sched.c > +++ b/tools/perf/builtin-sched.c > @@ -23,6 +23,7 @@ > #include > #include > #include > +#include > > #define PR_SET_NAME 15 /* Set process name */ > #define MAX_CPUS 4096 > @@ -124,7 +125,7 @@ struct perf_sched { > struct perf_tool tool; > const char *sort_order; > unsigned long nr_tasks; > - struct task_desc *pid_to_task[MAX_PID]; > + struct task_desc **pid_to_task; > struct task_desc **tasks; > const struct trace_sched_handler *tp_handler; > pthread_mutex_t start_work_mutex; > @@ -326,8 +327,14 @@ static struct task_desc *register_pid(struct perf_sched *sched, > unsigned long pid, const char *comm) > { > struct task_desc *task; > + static int pid_max; > > - BUG_ON(pid >= MAX_PID); > + if (sched->pid_to_task == NULL) { > + if (sysctl__read_int("kernel/pid_max", &pid_max) < 0) > + pid_max = MAX_PID; > + BUG_ON((sched->pid_to_task = calloc(pid_max, sizeof(struct task_desc *))) == NULL); > + } > + BUG_ON(pid >= (unsigned long)pid_max); > so why the previous patch bumping the MAX_PID count if you move to dynamic here? And shouldn't MAX_PID get dropped here as well? So attached is what i put together last week; just have not had time to send it out. --------------010604060108050007030901 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="0003-perf-sched-Remove-max-pid-assumption-from-perf-sched.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0003-perf-sched-Remove-max-pid-assumption-from-perf-sched.pa"; filename*1="tch" >>From 159dc732e0ad66d9151e93761bc9c685872e9fa4 Mon Sep 17 00:00:00 2001 From: David Ahern Date: Tue, 24 Mar 2015 16:57:10 -0400 Subject: [PATCH 3/5] perf sched: Remove max pid assumption from perf-sched 'perf sched replay' currently fails on sparc64: $ perf sched replay run measurement overhead: 2475 nsecs sleep measurement overhead: 56165 nsecs the run test took 999705 nsecs the sleep test took 1059270 nsecs perf: builtin-sched.c:384: register_pid: Assertion `!(pid >= 65536)' failed. Aborted The max pid limitation is removed by converting pid_to_task from a pid based array to an intlist (rblist) with the pid as the index and task_desc stored in the priv element. In the process pid is converted from a long int to int. Signed-off-by: David Ahern --- tools/perf/builtin-sched.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index cc52c993a1fa..858d85396d81 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -33,13 +33,12 @@ #define MAX_CPUS 4096 #define COMM_LEN 20 #define SYM_LEN 129 -#define MAX_PID 65536 struct sched_atom; struct task_desc { unsigned long nr; - unsigned long pid; + int pid; char comm[COMM_LEN]; unsigned long nr_events; @@ -129,7 +128,7 @@ struct perf_sched { struct perf_tool tool; const char *sort_order; unsigned long nr_tasks; - struct task_desc *pid_to_task[MAX_PID]; + struct intlist *pid_to_task; struct task_desc **tasks; const struct trace_sched_handler *tp_handler; pthread_mutex_t start_work_mutex; @@ -377,14 +376,18 @@ static void add_sched_event_sleep(struct perf_sched *sched, struct task_desc *ta } static struct task_desc *register_pid(struct perf_sched *sched, - unsigned long pid, const char *comm) + int pid, const char *comm) { - struct task_desc *task; - BUG_ON(pid >= MAX_PID); + struct int_node *node = intlist__findnew(sched->pid_to_task, pid); + struct task_desc *task; - task = sched->pid_to_task[pid]; + if (node == NULL) { + pr_err("Failed to allocate entry for task\n"); + return NULL; + } + task = (struct task_desc *) node->priv; if (task) return task; @@ -392,20 +395,21 @@ static struct task_desc *register_pid(struct perf_sched *sched, task->pid = pid; task->nr = sched->nr_tasks; strcpy(task->comm, comm); + /* * every task starts in sleeping state - this gets ignored * if there's no wakeup pointing to this sleep state: */ add_sched_event_sleep(sched, task, 0, 0); - sched->pid_to_task[pid] = task; + node->priv = task; sched->nr_tasks++; sched->tasks = realloc(sched->tasks, sched->nr_tasks * sizeof(struct task_task *)); BUG_ON(!sched->tasks); sched->tasks[task->nr] = task; if (verbose) - printf("registered task #%ld, PID %ld (%s)\n", sched->nr_tasks, pid, comm); + printf("registered task #%ld, PID %d (%s)\n", sched->nr_tasks, pid, comm); return task; } @@ -418,7 +422,7 @@ static void print_task_traces(struct perf_sched *sched) for (i = 0; i < sched->nr_tasks; i++) { task = sched->tasks[i]; - printf("task %6ld (%20s:%10ld), nr_events: %ld\n", + printf("task %6ld (%20s:%10d), nr_events: %ld\n", task->nr, task->comm, task->pid, task->nr_events); } } @@ -2981,6 +2985,12 @@ int cmd_sched(int argc, const char **argv, const char *prefix __maybe_unused) }; unsigned int i; + sched.pid_to_task = intlist__new(NULL); + if (sched.pid_to_task == NULL) { + pr_err("Failed to allocate intlist for tracking tasks\n"); + return -ENOMEM; + } + for (i = 0; i < ARRAY_SIZE(sched.curr_pid); i++) sched.curr_pid[i] = -1; -- 2.3.0 --------------010604060108050007030901--