From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S938583AbcLTTV6 (ORCPT ); Tue, 20 Dec 2016 14:21:58 -0500 Received: from terminus.zytor.com ([198.137.202.10]:35210 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753885AbcLTTVz (ORCPT ); Tue, 20 Dec 2016 14:21:55 -0500 Date: Tue, 20 Dec 2016 11:19:33 -0800 From: tip-bot for Namhyung Kim Message-ID: Cc: namhyung@kernel.org, linux-kernel@vger.kernel.org, andi@firstfloor.org, mingo@kernel.org, jolsa@kernel.org, tglx@linutronix.de, hpa@zytor.com, acme@redhat.com, peterz@infradead.org, minchan@kernel.org, dsahern@gmail.com Reply-To: jolsa@kernel.org, andi@firstfloor.org, mingo@kernel.org, linux-kernel@vger.kernel.org, namhyung@kernel.org, minchan@kernel.org, peterz@infradead.org, dsahern@gmail.com, hpa@zytor.com, tglx@linutronix.de, acme@redhat.com In-Reply-To: <20161208144755.16673-2-namhyung@kernel.org> References: <20161208144755.16673-2-namhyung@kernel.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/urgent] perf sched timehist: Split is_idle_sample() Git-Commit-ID: 96039c7c52e03b7d6dd773664e74b79e3ae9856a X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 96039c7c52e03b7d6dd773664e74b79e3ae9856a Gitweb: http://git.kernel.org/tip/96039c7c52e03b7d6dd773664e74b79e3ae9856a Author: Namhyung Kim AuthorDate: Thu, 8 Dec 2016 23:47:50 +0900 Committer: Arnaldo Carvalho de Melo CommitDate: Thu, 15 Dec 2016 16:25:44 -0300 perf sched timehist: Split is_idle_sample() 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 preferred than just checking sample->pid since it's possible, although rare, to have invalid 0 pid/tid on scheduling an exiting task. Signed-off-by: Namhyung Kim Acked-by: David Ahern Cc: Andi Kleen Cc: Jiri Olsa Cc: Minchan Kim Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/20161208144755.16673-2-namhyung@kernel.org [ Remove some needless () in some return statements ] Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-sched.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 1a3f1be..966eddc 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -1939,39 +1939,40 @@ 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 perf_evsel *evsel) { - struct thread *thread; - struct callchain_cursor *cursor = &callchain_cursor; - /* pid 0 == swapper == idle task */ - if (sample->pid == 0) - return true; + if (strcmp(perf_evsel__name(evsel), "sched:sched_switch") == 0) + return perf_evsel__intval(evsel, sample, "prev_pid") == 0; - if (strcmp(perf_evsel__name(evsel), "sched:sched_switch") == 0) { - if (perf_evsel__intval(evsel, sample, "prev_pid") == 0) - return true; - } + return sample->pid == 0; +} + +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 +1995,6 @@ static bool is_idle_sample(struct perf_sched *sched, callchain_cursor_advance(cursor); } - - return false; } /* @@ -2111,7 +2110,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, evsel)) { thread = get_idle_thread(sample->cpu); if (thread == NULL) pr_err("Failed to get idle thread for cpu %d.\n", sample->cpu); @@ -2124,6 +2123,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;