From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932274AbbIHOju (ORCPT ); Tue, 8 Sep 2015 10:39:50 -0400 Received: from terminus.zytor.com ([198.137.202.10]:52490 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932256AbbIHOjp (ORCPT ); Tue, 8 Sep 2015 10:39:45 -0400 Date: Tue, 8 Sep 2015 07:39:04 -0700 From: tip-bot for Namhyung Kim Message-ID: Cc: masami.hiramatsu.pt@hitachi.com, mingo@kernel.org, tglx@linutronix.de, wangnan0@huawei.com, hpa@zytor.com, linux-kernel@vger.kernel.org, jolsa@redhat.com, a.p.zijlstra@chello.nl, namhyung@kernel.org, acme@redhat.com Reply-To: namhyung@kernel.org, acme@redhat.com, jolsa@redhat.com, linux-kernel@vger.kernel.org, a.p.zijlstra@chello.nl, hpa@zytor.com, wangnan0@huawei.com, tglx@linutronix.de, mingo@kernel.org, masami.hiramatsu.pt@hitachi.com In-Reply-To: <1441368963-11565-1-git-send-email-namhyung@kernel.org> References: <1441368963-11565-1-git-send-email-namhyung@kernel.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf probe: Split add_perf_probe_events() Git-Commit-ID: 844dffa598b55fca6a83a856214fc0cfc3da24e5 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: 844dffa598b55fca6a83a856214fc0cfc3da24e5 Gitweb: http://git.kernel.org/tip/844dffa598b55fca6a83a856214fc0cfc3da24e5 Author: Namhyung Kim AuthorDate: Fri, 4 Sep 2015 21:15:59 +0900 Committer: Arnaldo Carvalho de Melo CommitDate: Fri, 4 Sep 2015 12:33:02 -0300 perf probe: Split add_perf_probe_events() The add_perf_probe_events() does 3 things: 1. convert all perf events to trace events 2. add all trace events to kernel 3. cleanup all trace events But sometimes we need to do something with the trace events. So split the funtion into three, so that it can access intermediate trace events via struct __event_package if needed. Signed-off-by: Namhyung Kim Acked-by: Masami Hiramatsu Cc: Jiri Olsa Cc: Peter Zijlstra Cc: Wang Nan Cc: pi3orama@163.com Link: http://lkml.kernel.org/r/1441368963-11565-1-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/probe-event.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index eb5f18b..2c762f4 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -2765,9 +2765,10 @@ struct __event_package { int ntevs; }; -int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) +static int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs, + struct __event_package **ppkgs) { - int i, j, ret; + int i, ret; struct __event_package *pkgs; ret = 0; @@ -2792,12 +2793,21 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) ret = convert_to_probe_trace_events(pkgs[i].pev, &pkgs[i].tevs); if (ret < 0) - goto end; + return ret; pkgs[i].ntevs = ret; } /* This just release blacklist only if allocated */ kprobe_blacklist__release(); + *ppkgs = pkgs; + + return 0; +} + +static int apply_perf_probe_events(struct __event_package *pkgs, int npevs) +{ + int i, ret = 0; + /* Loop 2: add all events */ for (i = 0; i < npevs; i++) { ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs, @@ -2806,7 +2816,16 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) if (ret < 0) break; } -end: + return ret; +} + +static void cleanup_perf_probe_events(struct __event_package *pkgs, int npevs) +{ + int i, j; + + if (pkgs == NULL) + return; + /* Loop 3: cleanup and free trace events */ for (i = 0; i < npevs; i++) { for (j = 0; j < pkgs[i].ntevs; j++) @@ -2815,6 +2834,18 @@ end: } free(pkgs); exit_symbol_maps(); +} + +int add_perf_probe_events(struct perf_probe_event *pevs, int npevs) +{ + int ret; + struct __event_package *pkgs = NULL; + + ret = convert_perf_probe_events(pevs, npevs, &pkgs); + if (ret == 0) + ret = apply_perf_probe_events(pkgs, npevs); + + cleanup_perf_probe_events(pkgs, npevs); return ret; }