Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1218875 > unrolled thread

[PATCH v2 1/5] perf probe: Split add_perf_probe_events()

Started byNamhyung Kim <namhyung@kernel.org>
First post2015-09-04 14:20 +0200
Last post2015-09-08 16:40 +0200
Articles 16 — 5 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v2 1/5] perf probe: Split add_perf_probe_events() Namhyung Kim <namhyung@kernel.org> - 2015-09-04 14:20 +0200
    [PATCH v2 2/5] perf probe: Attach trace_probe_event with perf_probe_event Namhyung Kim <namhyung@kernel.org> - 2015-09-04 14:20 +0200
      [tip:perf/core] perf probe:   Link trace_probe_event into perf_probe_event tip-bot for Wang Nan <tipbot@zytor.com> - 2015-09-08 16:50 +0200
    [PATCH v2 5/5] perf probe: Print deleted events in cmd_probe() Namhyung Kim <namhyung@kernel.org> - 2015-09-04 14:20 +0200
      RE: [PATCH v2 5/5] perf probe: Print deleted events in cmd_probe() 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-09-07 03:20 +0200
      [tip:perf/core] perf probe: Print deleted events in cmd_probe() tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-09-08 16:50 +0200
    [PATCH v2 4/5] perf probe: Split del_perf_probe_events() Namhyung Kim <namhyung@kernel.org> - 2015-09-04 14:30 +0200
      [tip:perf/core] perf probe: Split del_perf_probe_events() tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-09-08 16:50 +0200
    Re: [PATCH v2 1/5] perf probe: Split add_perf_probe_events() "Wangnan (F)" <wangnan0@huawei.com> - 2015-09-06 09:50 +0200
      Re: [PATCH v2 1/5] perf probe: Split add_perf_probe_events() Namhyung Kim <namhyung@kernel.org> - 2015-09-08 04:00 +0200
      Re: [PATCH v2 1/5] perf probe: Split add_perf_probe_events() Namhyung Kim <namhyung@kernel.org> - 2015-09-10 04:30 +0200
        RE: Re: [PATCH v2 1/5] perf probe: Split add_perf_probe_events() 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-09-10 07:10 +0200
          Re: Re: [PATCH v2 1/5] perf probe: Split add_perf_probe_events() Namhyung Kim <namhyung@kernel.org> - 2015-09-10 08:50 +0200
            RE: Re: [PATCH v2 1/5] perf probe: Split add_perf_probe_events() 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-09-10 10:20 +0200
              Re: Re: [PATCH v2 1/5] perf probe: Split add_perf_probe_events() Namhyung Kim <namhyung@kernel.org> - 2015-09-11 18:40 +0200
    [tip:perf/core] perf probe: Split add_perf_probe_events() tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-09-08 16:40 +0200

#1218875 — [PATCH v2 1/5] perf probe: Split add_perf_probe_events()

FromNamhyung Kim <namhyung@kernel.org>
Date2015-09-04 14:20 +0200
Subject[PATCH v2 1/5] perf probe: Split add_perf_probe_events()
Message-ID<q4Y8i-1MD-3@gated-at.bofh.it>
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.

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 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 eb5f18b75402..2c762f41e7a5 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;
 }
-- 
2.5.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/

[toc] | [next] | [standalone]


#1218880 — [PATCH v2 2/5] perf probe: Attach trace_probe_event with perf_probe_event

FromNamhyung Kim <namhyung@kernel.org>
Date2015-09-04 14:20 +0200
Subject[PATCH v2 2/5] perf probe: Attach trace_probe_event with perf_probe_event
Message-ID<q4Y8i-1MD-17@gated-at.bofh.it>
In reply to#1218875
From: Wang Nan <wangnan0@huawei.com>

This patch drops struct __event_package structure.  Instead, it adds
trace_probe_event into 'struct perf_probe_event'.

trace_probe_event information gives further patches a chance to access
actual probe points and actual arguments.  Using them, perf probe can
get whole list of added probes and print them at once.

Other users like upcoming bpf_loader will be able to attach one bpf
program to different probing points of an inline functions (which has
multiple probing points) and glob functions.  Moreover, by reading
arguments information, bpf code for reading those arguments can be
generated.

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Wang Nan <wangnan0@huawei.com>
[namhyung: extract necessary part from the existing patch]
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/probe-event.c | 57 +++++++++++++------------------------------
 tools/perf/util/probe-event.h |  5 ++++
 2 files changed, 22 insertions(+), 40 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 2c762f41e7a5..0d3a051b9202 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2759,59 +2759,39 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
 	return find_probe_trace_events_from_map(pev, tevs);
 }
 
-struct __event_package {
-	struct perf_probe_event		*pev;
-	struct probe_trace_event	*tevs;
-	int				ntevs;
-};
-
-static int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs,
-				     struct __event_package **ppkgs)
+int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs)
 {
 	int i, ret;
-	struct __event_package *pkgs;
-
-	ret = 0;
-	pkgs = zalloc(sizeof(struct __event_package) * npevs);
-
-	if (pkgs == NULL)
-		return -ENOMEM;
 
 	ret = init_symbol_maps(pevs->uprobes);
-	if (ret < 0) {
-		free(pkgs);
+	if (ret < 0)
 		return ret;
-	}
 
 	/* Loop 1: convert all events */
 	for (i = 0; i < npevs; i++) {
-		pkgs[i].pev = &pevs[i];
 		/* Init kprobe blacklist if needed */
-		if (!pkgs[i].pev->uprobes)
+		if (!pevs[i].uprobes)
 			kprobe_blacklist__init();
 		/* Convert with or without debuginfo */
-		ret  = convert_to_probe_trace_events(pkgs[i].pev,
-						     &pkgs[i].tevs);
+		ret  = convert_to_probe_trace_events(&pevs[i], &pevs[i].tevs);
 		if (ret < 0)
 			return ret;
-		pkgs[i].ntevs = ret;
+		pevs[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 apply_perf_probe_events(struct perf_probe_event *pevs, 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,
-					       pkgs[i].ntevs,
+		ret = __add_probe_trace_events(&pevs[i], pevs[i].tevs,
+					       pevs[i].ntevs,
 					       probe_conf.force_add);
 		if (ret < 0)
 			break;
@@ -2819,33 +2799,30 @@ static int apply_perf_probe_events(struct __event_package *pkgs, int npevs)
 	return ret;
 }
 
-static void cleanup_perf_probe_events(struct __event_package *pkgs, int npevs)
+void cleanup_perf_probe_events(struct perf_probe_event *pevs, 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++)
-			clear_probe_trace_event(&pkgs[i].tevs[j]);
-		zfree(&pkgs[i].tevs);
+		for (j = 0; j < pevs[i].ntevs; j++)
+			clear_probe_trace_event(&pevs[i].tevs[j]);
+		zfree(&pevs[i].tevs);
+		pevs[i].ntevs = 0;
 	}
-	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);
+	ret = convert_perf_probe_events(pevs, npevs);
 	if (ret == 0)
-		ret = apply_perf_probe_events(pkgs, npevs);
+		ret = apply_perf_probe_events(pevs, npevs);
 
-	cleanup_perf_probe_events(pkgs, npevs);
+	cleanup_perf_probe_events(pevs, npevs);
 
 	return ret;
 }
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 6e7ec68a4aa8..70c327bd61de 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -87,6 +87,8 @@ struct perf_probe_event {
 	bool			uprobes;	/* Uprobe event flag */
 	char			*target;	/* Target binary */
 	struct perf_probe_arg	*args;	/* Arguments */
+	struct probe_trace_event *tevs;
+	int			ntevs;
 };
 
 /* Line range */
@@ -138,6 +140,9 @@ extern void line_range__clear(struct line_range *lr);
 extern int line_range__init(struct line_range *lr);
 
 extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
+extern int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs);
+extern int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
+extern void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern int del_perf_probe_events(struct strfilter *filter);
 extern int show_perf_probe_events(struct strfilter *filter);
 extern int show_line_range(struct line_range *lr, const char *module,
-- 
2.5.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/

[toc] | [prev] | [next] | [standalone]


#1220902 — [tip:perf/core] perf probe: Link trace_probe_event into perf_probe_event

Fromtip-bot for Wang Nan <tipbot@zytor.com>
Date2015-09-08 16:50 +0200
Subject[tip:perf/core] perf probe: Link trace_probe_event into perf_probe_event
Message-ID<q6snE-7de-41@gated-at.bofh.it>
In reply to#1218880
Commit-ID:  12fae5ef6dc6031ffcf4dffc6be5a16080e7dd7d
Gitweb:     http://git.kernel.org/tip/12fae5ef6dc6031ffcf4dffc6be5a16080e7dd7d
Author:     Wang Nan <wangnan0@huawei.com>
AuthorDate: Fri, 4 Sep 2015 21:16:00 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Fri, 4 Sep 2015 12:34:23 -0300

perf probe: Link trace_probe_event into perf_probe_event

This patch drops struct __event_package structure.  Instead, it adds a
'struct trace_probe_event' pointer to 'struct perf_probe_event'.

The trace_probe_event information gives further patches a chance to
access actual probe points and actual arguments.

Using them, 'perf probe' can get the whole list of added probes and
print them at once.

Other users like the upcoming bpf_loader will be able to attach one bpf
program to different probing points of an inline function (which has
multiple probing points) and glob functions.

Moreover, by reading the arguments information, bpf code for reading
those arguments can be generated.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1441368963-11565-2-git-send-email-namhyung@kernel.org
[namhyung: extract necessary part from the existing patch]
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/probe-event.c | 57 +++++++++++++------------------------------
 tools/perf/util/probe-event.h |  5 ++++
 2 files changed, 22 insertions(+), 40 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 2c762f4..0d3a051 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2759,59 +2759,39 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
 	return find_probe_trace_events_from_map(pev, tevs);
 }
 
-struct __event_package {
-	struct perf_probe_event		*pev;
-	struct probe_trace_event	*tevs;
-	int				ntevs;
-};
-
-static int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs,
-				     struct __event_package **ppkgs)
+int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs)
 {
 	int i, ret;
-	struct __event_package *pkgs;
-
-	ret = 0;
-	pkgs = zalloc(sizeof(struct __event_package) * npevs);
-
-	if (pkgs == NULL)
-		return -ENOMEM;
 
 	ret = init_symbol_maps(pevs->uprobes);
-	if (ret < 0) {
-		free(pkgs);
+	if (ret < 0)
 		return ret;
-	}
 
 	/* Loop 1: convert all events */
 	for (i = 0; i < npevs; i++) {
-		pkgs[i].pev = &pevs[i];
 		/* Init kprobe blacklist if needed */
-		if (!pkgs[i].pev->uprobes)
+		if (!pevs[i].uprobes)
 			kprobe_blacklist__init();
 		/* Convert with or without debuginfo */
-		ret  = convert_to_probe_trace_events(pkgs[i].pev,
-						     &pkgs[i].tevs);
+		ret  = convert_to_probe_trace_events(&pevs[i], &pevs[i].tevs);
 		if (ret < 0)
 			return ret;
-		pkgs[i].ntevs = ret;
+		pevs[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 apply_perf_probe_events(struct perf_probe_event *pevs, 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,
-					       pkgs[i].ntevs,
+		ret = __add_probe_trace_events(&pevs[i], pevs[i].tevs,
+					       pevs[i].ntevs,
 					       probe_conf.force_add);
 		if (ret < 0)
 			break;
@@ -2819,33 +2799,30 @@ static int apply_perf_probe_events(struct __event_package *pkgs, int npevs)
 	return ret;
 }
 
-static void cleanup_perf_probe_events(struct __event_package *pkgs, int npevs)
+void cleanup_perf_probe_events(struct perf_probe_event *pevs, 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++)
-			clear_probe_trace_event(&pkgs[i].tevs[j]);
-		zfree(&pkgs[i].tevs);
+		for (j = 0; j < pevs[i].ntevs; j++)
+			clear_probe_trace_event(&pevs[i].tevs[j]);
+		zfree(&pevs[i].tevs);
+		pevs[i].ntevs = 0;
 	}
-	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);
+	ret = convert_perf_probe_events(pevs, npevs);
 	if (ret == 0)
-		ret = apply_perf_probe_events(pkgs, npevs);
+		ret = apply_perf_probe_events(pevs, npevs);
 
-	cleanup_perf_probe_events(pkgs, npevs);
+	cleanup_perf_probe_events(pevs, npevs);
 
 	return ret;
 }
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 6e7ec68..70c327b 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -87,6 +87,8 @@ struct perf_probe_event {
 	bool			uprobes;	/* Uprobe event flag */
 	char			*target;	/* Target binary */
 	struct perf_probe_arg	*args;	/* Arguments */
+	struct probe_trace_event *tevs;
+	int			ntevs;
 };
 
 /* Line range */
@@ -138,6 +140,9 @@ extern void line_range__clear(struct line_range *lr);
 extern int line_range__init(struct line_range *lr);
 
 extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
+extern int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs);
+extern int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
+extern void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern int del_perf_probe_events(struct strfilter *filter);
 extern int show_perf_probe_events(struct strfilter *filter);
 extern int show_line_range(struct line_range *lr, const char *module,
--
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/

[toc] | [prev] | [next] | [standalone]


#1218886 — [PATCH v2 5/5] perf probe: Print deleted events in cmd_probe()

FromNamhyung Kim <namhyung@kernel.org>
Date2015-09-04 14:20 +0200
Subject[PATCH v2 5/5] perf probe: Print deleted events in cmd_probe()
Message-ID<q4Y8k-1MD-33@gated-at.bofh.it>
In reply to#1218875
Showing actual trace event when deleteing perf events is only needed in
perf probe command.  But the add functionality itself can be used by
other places.  So move the printing code into the cmd_probe().

The output is not changed.

Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/builtin-probe.c    | 62 ++++++++++++++++++++++++++++++++++++++++++-
 tools/perf/util/probe-event.c |  5 ----
 tools/perf/util/probe-event.h |  1 +
 tools/perf/util/probe-file.c  |  7 +++--
 tools/perf/util/probe-file.h  |  4 +++
 5 files changed, 69 insertions(+), 10 deletions(-)

diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index b8cf6cb7e1bf..ee2c46d8353e 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -41,6 +41,7 @@
 #include "util/parse-options.h"
 #include "util/probe-finder.h"
 #include "util/probe-event.h"
+#include "util/probe-file.h"
 
 #define DEFAULT_VAR_FILTER "!__k???tab_* & !__crc_*"
 #define DEFAULT_FUNC_FILTER "!_*"
@@ -357,6 +358,65 @@ out_cleanup:
 	return ret;
 }
 
+static int perf_del_probe_events(struct strfilter *filter)
+{
+	int ret, ret2, ufd = -1, kfd = -1;
+	char *str = strfilter__string(filter);
+	struct strlist *klist = NULL, *ulist = NULL;
+	struct str_node *ent;
+
+	if (!str)
+		return -EINVAL;
+
+	pr_debug("Delete filter: \'%s\'\n", str);
+
+	/* Get current event names */
+	ret = probe_file__open_both(&kfd, &ufd, PF_FL_RW);
+	if (ret < 0)
+		goto out;
+
+	klist = strlist__new(NULL, NULL);
+	if (!klist)
+		return -ENOMEM;
+
+	ret = probe_file__get_events(kfd, filter, klist);
+	if (ret == 0) {
+		strlist__for_each(ent, klist)
+			pr_info("Removed event: %s\n", ent->s);
+
+		ret = probe_file__del_strlist(kfd, klist);
+		if (ret < 0)
+			goto error;
+	}
+
+	ret2 = probe_file__get_events(ufd, filter, ulist);
+	if (ret2 == 0) {
+		strlist__for_each(ent, ulist)
+			pr_info("Removed event: %s\n", ent->s);
+
+		ret2 = probe_file__del_strlist(ufd, ulist);
+		if (ret2 < 0)
+			goto error;
+	}
+
+	if (ret == -ENOENT && ret2 == -ENOENT)
+		pr_debug("\"%s\" does not hit any event.\n", str);
+		/* Note that this is silently ignored */
+	ret = 0;
+
+error:
+	if (kfd >= 0)
+		close(kfd);
+	if (ufd >= 0)
+		close(ufd);
+out:
+	strlist__delete(klist);
+	strlist__delete(ulist);
+	free(str);
+
+	return ret;
+}
+
 static int
 __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
 {
@@ -529,7 +589,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
 		return ret;
 #endif
 	case 'd':
-		ret = del_perf_probe_events(params.filter);
+		ret = perf_del_probe_events(params.filter);
 		if (ret < 0) {
 			pr_err_with_code("  Error: Failed to delete events.", ret);
 			return ret;
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 01b9a5bd9449..3da9e1c792fa 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2819,8 +2819,6 @@ int del_perf_probe_events(struct strfilter *filter)
 	if (!str)
 		return -EINVAL;
 
-	pr_debug("Delete filter: \'%s\'\n", str);
-
 	/* Get current event names */
 	ret = probe_file__open_both(&kfd, &ufd, PF_FL_RW);
 	if (ret < 0)
@@ -2835,9 +2833,6 @@ int del_perf_probe_events(struct strfilter *filter)
 		ret = ret2;
 		goto error;
 	}
-	if (ret == -ENOENT && ret2 == -ENOENT)
-		pr_debug("\"%s\" does not hit any event.\n", str);
-		/* Note that this is silently ignored */
 	ret = 0;
 
 error:
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 610f743671e1..9bcea36359f2 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -144,6 +144,7 @@ extern int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern int del_perf_probe_events(struct strfilter *filter);
+
 extern int show_perf_probe_event(const char *group, const char *event,
 				 struct perf_probe_event *pev,
 				 const char *module, bool use_stdout);
diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
index f00b0df56dfe..38c0a62039cc 100644
--- a/tools/perf/util/probe-file.c
+++ b/tools/perf/util/probe-file.c
@@ -267,7 +267,6 @@ static int __del_trace_probe_event(int fd, struct str_node *ent)
 		goto error;
 	}
 
-	pr_info("Removed event: %s\n", ent->s);
 	return 0;
 error:
 	pr_warning("Failed to delete event: %s\n",
@@ -275,8 +274,8 @@ error:
 	return ret;
 }
 
-static int probe_file__get_events(int fd, struct strfilter *filter,
-				  struct strlist *plist)
+int probe_file__get_events(int fd, struct strfilter *filter,
+			   struct strlist *plist)
 {
 	struct strlist *namelist;
 	struct str_node *ent;
@@ -300,7 +299,7 @@ static int probe_file__get_events(int fd, struct strfilter *filter,
 	return ret;
 }
 
-static int probe_file__del_strlist(int fd, struct strlist *namelist)
+int probe_file__del_strlist(int fd, struct strlist *namelist)
 {
 	int ret = 0;
 	struct str_node *ent;
diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h
index ada94a242a17..18ac9cf51c34 100644
--- a/tools/perf/util/probe-file.h
+++ b/tools/perf/util/probe-file.h
@@ -14,5 +14,9 @@ struct strlist *probe_file__get_namelist(int fd);
 struct strlist *probe_file__get_rawlist(int fd);
 int probe_file__add_event(int fd, struct probe_trace_event *tev);
 int probe_file__del_events(int fd, struct strfilter *filter);
+int probe_file__get_events(int fd, struct strfilter *filter,
+				  struct strlist *plist);
+int probe_file__del_strlist(int fd, struct strlist *namelist);
+
 
 #endif
-- 
2.5.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/

[toc] | [prev] | [next] | [standalone]


#1219885 — RE: [PATCH v2 5/5] perf probe: Print deleted events in cmd_probe()

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-09-07 03:20 +0200
SubjectRE: [PATCH v2 5/5] perf probe: Print deleted events in cmd_probe()
Message-ID<q5Tgd-7mF-1@gated-at.bofh.it>
In reply to#1218886
PkZyb206IE5hbWh5dW5nIEtpbSBbbWFpbHRvOm5hbWh5dW5nQGdtYWlsLmNvbV0gT24gQmVoYWxm
IE9mIE5hbWh5dW5nIEtpbQ0KPg0KPlNob3dpbmcgYWN0dWFsIHRyYWNlIGV2ZW50IHdoZW4gZGVs
ZXRlaW5nIHBlcmYgZXZlbnRzIGlzIG9ubHkgbmVlZGVkIGluDQo+cGVyZiBwcm9iZSBjb21tYW5k
LiAgQnV0IHRoZSBhZGQgZnVuY3Rpb25hbGl0eSBpdHNlbGYgY2FuIGJlIHVzZWQgYnkNCj5vdGhl
ciBwbGFjZXMuICBTbyBtb3ZlIHRoZSBwcmludGluZyBjb2RlIGludG8gdGhlIGNtZF9wcm9iZSgp
Lg0KPg0KPlRoZSBvdXRwdXQgaXMgbm90IGNoYW5nZWQuDQo+DQoNCkxvb2tzIGdvb2QgdG8gbWUg
OikNCg0KQWNrZWQtYnk6IE1hc2FtaSBIaXJhbWF0c3UgPG1hc2FtaS5oaXJhbWF0c3UucHRAaGl0
YWNoaS5jb20+DQoNClRoYW5rcyENCg0KPkNjOiBNYXNhbWkgSGlyYW1hdHN1IDxtYXNhbWkuaGly
YW1hdHN1LnB0QGhpdGFjaGkuY29tPg0KPlNpZ25lZC1vZmYtYnk6IE5hbWh5dW5nIEtpbSA8bmFt
aHl1bmdAa2VybmVsLm9yZz4NCj4tLS0NCj4gdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMgICAg
fCA2MiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystDQo+IHRvb2xz
L3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jIHwgIDUgLS0tLQ0KPiB0b29scy9wZXJmL3V0aWwvcHJv
YmUtZXZlbnQuaCB8ICAxICsNCj4gdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuYyAgfCAgNyAr
KystLQ0KPiB0b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5oICB8ICA0ICsrKw0KPiA1IGZpbGVz
IGNoYW5nZWQsIDY5IGluc2VydGlvbnMoKyksIDEwIGRlbGV0aW9ucygtKQ0KPg0KPmRpZmYgLS1n
aXQgYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9i
ZS5jDQo+aW5kZXggYjhjZjZjYjdlMWJmLi5lZTJjNDZkODM1M2UgMTAwNjQ0DQo+LS0tIGEvdG9v
bHMvcGVyZi9idWlsdGluLXByb2JlLmMNCj4rKysgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUu
Yw0KPkBAIC00MSw2ICs0MSw3IEBADQo+ICNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIN
Cj4gI2luY2x1ZGUgInV0aWwvcHJvYmUtZmluZGVyLmgiDQo+ICNpbmNsdWRlICJ1dGlsL3Byb2Jl
LWV2ZW50LmgiDQo+KyNpbmNsdWRlICJ1dGlsL3Byb2JlLWZpbGUuaCINCj4NCj4gI2RlZmluZSBE
RUZBVUxUX1ZBUl9GSUxURVIgIiFfX2s/Pz90YWJfKiAmICFfX2NyY18qIg0KPiAjZGVmaW5lIERF
RkFVTFRfRlVOQ19GSUxURVIgIiFfKiINCj5AQCAtMzU3LDYgKzM1OCw2NSBAQCBvdXRfY2xlYW51
cDoNCj4gCXJldHVybiByZXQ7DQo+IH0NCj4NCj4rc3RhdGljIGludCBwZXJmX2RlbF9wcm9iZV9l
dmVudHMoc3RydWN0IHN0cmZpbHRlciAqZmlsdGVyKQ0KPit7DQo+KwlpbnQgcmV0LCByZXQyLCB1
ZmQgPSAtMSwga2ZkID0gLTE7DQo+KwljaGFyICpzdHIgPSBzdHJmaWx0ZXJfX3N0cmluZyhmaWx0
ZXIpOw0KPisJc3RydWN0IHN0cmxpc3QgKmtsaXN0ID0gTlVMTCwgKnVsaXN0ID0gTlVMTDsNCj4r
CXN0cnVjdCBzdHJfbm9kZSAqZW50Ow0KPisNCj4rCWlmICghc3RyKQ0KPisJCXJldHVybiAtRUlO
VkFMOw0KPisNCj4rCXByX2RlYnVnKCJEZWxldGUgZmlsdGVyOiBcJyVzXCdcbiIsIHN0cik7DQo+
Kw0KPisJLyogR2V0IGN1cnJlbnQgZXZlbnQgbmFtZXMgKi8NCj4rCXJldCA9IHByb2JlX2ZpbGVf
X29wZW5fYm90aCgma2ZkLCAmdWZkLCBQRl9GTF9SVyk7DQo+KwlpZiAocmV0IDwgMCkNCj4rCQln
b3RvIG91dDsNCj4rDQo+KwlrbGlzdCA9IHN0cmxpc3RfX25ldyhOVUxMLCBOVUxMKTsNCj4rCWlm
ICgha2xpc3QpDQo+KwkJcmV0dXJuIC1FTk9NRU07DQo+Kw0KPisJcmV0ID0gcHJvYmVfZmlsZV9f
Z2V0X2V2ZW50cyhrZmQsIGZpbHRlciwga2xpc3QpOw0KPisJaWYgKHJldCA9PSAwKSB7DQo+KwkJ
c3RybGlzdF9fZm9yX2VhY2goZW50LCBrbGlzdCkNCj4rCQkJcHJfaW5mbygiUmVtb3ZlZCBldmVu
dDogJXNcbiIsIGVudC0+cyk7DQo+Kw0KPisJCXJldCA9IHByb2JlX2ZpbGVfX2RlbF9zdHJsaXN0
KGtmZCwga2xpc3QpOw0KPisJCWlmIChyZXQgPCAwKQ0KPisJCQlnb3RvIGVycm9yOw0KPisJfQ0K
PisNCj4rCXJldDIgPSBwcm9iZV9maWxlX19nZXRfZXZlbnRzKHVmZCwgZmlsdGVyLCB1bGlzdCk7
DQo+KwlpZiAocmV0MiA9PSAwKSB7DQo+KwkJc3RybGlzdF9fZm9yX2VhY2goZW50LCB1bGlzdCkN
Cj4rCQkJcHJfaW5mbygiUmVtb3ZlZCBldmVudDogJXNcbiIsIGVudC0+cyk7DQo+Kw0KPisJCXJl
dDIgPSBwcm9iZV9maWxlX19kZWxfc3RybGlzdCh1ZmQsIHVsaXN0KTsNCj4rCQlpZiAocmV0MiA8
IDApDQo+KwkJCWdvdG8gZXJyb3I7DQo+Kwl9DQo+Kw0KPisJaWYgKHJldCA9PSAtRU5PRU5UICYm
IHJldDIgPT0gLUVOT0VOVCkNCj4rCQlwcl9kZWJ1ZygiXCIlc1wiIGRvZXMgbm90IGhpdCBhbnkg
ZXZlbnQuXG4iLCBzdHIpOw0KPisJCS8qIE5vdGUgdGhhdCB0aGlzIGlzIHNpbGVudGx5IGlnbm9y
ZWQgKi8NCj4rCXJldCA9IDA7DQo+Kw0KPitlcnJvcjoNCj4rCWlmIChrZmQgPj0gMCkNCj4rCQlj
bG9zZShrZmQpOw0KPisJaWYgKHVmZCA+PSAwKQ0KPisJCWNsb3NlKHVmZCk7DQo+K291dDoNCj4r
CXN0cmxpc3RfX2RlbGV0ZShrbGlzdCk7DQo+KwlzdHJsaXN0X19kZWxldGUodWxpc3QpOw0KPisJ
ZnJlZShzdHIpOw0KPisNCj4rCXJldHVybiByZXQ7DQo+K30NCj4rDQo+IHN0YXRpYyBpbnQNCj4g
X19jbWRfcHJvYmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVm
aXggX19tYXliZV91bnVzZWQpDQo+IHsNCj5AQCAtNTI5LDcgKzU4OSw3IEBAIF9fY21kX3Byb2Jl
KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVf
dW51c2VkKQ0KPiAJCXJldHVybiByZXQ7DQo+ICNlbmRpZg0KPiAJY2FzZSAnZCc6DQo+LQkJcmV0
ID0gZGVsX3BlcmZfcHJvYmVfZXZlbnRzKHBhcmFtcy5maWx0ZXIpOw0KPisJCXJldCA9IHBlcmZf
ZGVsX3Byb2JlX2V2ZW50cyhwYXJhbXMuZmlsdGVyKTsNCj4gCQlpZiAocmV0IDwgMCkgew0KPiAJ
CQlwcl9lcnJfd2l0aF9jb2RlKCIgIEVycm9yOiBGYWlsZWQgdG8gZGVsZXRlIGV2ZW50cy4iLCBy
ZXQpOw0KPiAJCQlyZXR1cm4gcmV0Ow0KPmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJv
YmUtZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jDQo+aW5kZXggMDFiOWE1
YmQ5NDQ5Li4zZGE5ZTFjNzkyZmEgMTAwNjQ0DQo+LS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2Jl
LWV2ZW50LmMNCj4rKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYw0KPkBAIC0yODE5
LDggKzI4MTksNiBAQCBpbnQgZGVsX3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBzdHJmaWx0ZXIg
KmZpbHRlcikNCj4gCWlmICghc3RyKQ0KPiAJCXJldHVybiAtRUlOVkFMOw0KPg0KPi0JcHJfZGVi
dWcoIkRlbGV0ZSBmaWx0ZXI6IFwnJXNcJ1xuIiwgc3RyKTsNCj4tDQo+IAkvKiBHZXQgY3VycmVu
dCBldmVudCBuYW1lcyAqLw0KPiAJcmV0ID0gcHJvYmVfZmlsZV9fb3Blbl9ib3RoKCZrZmQsICZ1
ZmQsIFBGX0ZMX1JXKTsNCj4gCWlmIChyZXQgPCAwKQ0KPkBAIC0yODM1LDkgKzI4MzMsNiBAQCBp
bnQgZGVsX3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBzdHJmaWx0ZXIgKmZpbHRlcikNCj4gCQly
ZXQgPSByZXQyOw0KPiAJCWdvdG8gZXJyb3I7DQo+IAl9DQo+LQlpZiAocmV0ID09IC1FTk9FTlQg
JiYgcmV0MiA9PSAtRU5PRU5UKQ0KPi0JCXByX2RlYnVnKCJcIiVzXCIgZG9lcyBub3QgaGl0IGFu
eSBldmVudC5cbiIsIHN0cik7DQo+LQkJLyogTm90ZSB0aGF0IHRoaXMgaXMgc2lsZW50bHkgaWdu
b3JlZCAqLw0KPiAJcmV0ID0gMDsNCj4NCj4gZXJyb3I6DQo+ZGlmZiAtLWdpdCBhL3Rvb2xzL3Bl
cmYvdXRpbC9wcm9iZS1ldmVudC5oIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmgNCj5p
bmRleCA2MTBmNzQzNjcxZTEuLjliY2VhMzYzNTlmMiAxMDA2NDQNCj4tLS0gYS90b29scy9wZXJm
L3V0aWwvcHJvYmUtZXZlbnQuaA0KPisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5o
DQo+QEAgLTE0NCw2ICsxNDQsNyBAQCBleHRlcm4gaW50IGNvbnZlcnRfcGVyZl9wcm9iZV9ldmVu
dHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cyk7DQo+IGV4dGVybiBp
bnQgYXBwbHlfcGVyZl9wcm9iZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMs
IGludCBucGV2cyk7DQo+IGV4dGVybiB2b2lkIGNsZWFudXBfcGVyZl9wcm9iZV9ldmVudHMoc3Ry
dWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cyk7DQo+IGV4dGVybiBpbnQgZGVs
X3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBzdHJmaWx0ZXIgKmZpbHRlcik7DQo+Kw0KPiBleHRl
cm4gaW50IHNob3dfcGVyZl9wcm9iZV9ldmVudChjb25zdCBjaGFyICpncm91cCwgY29uc3QgY2hh
ciAqZXZlbnQsDQo+IAkJCQkgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwNCj4gCQkJCSBj
b25zdCBjaGFyICptb2R1bGUsIGJvb2wgdXNlX3N0ZG91dCk7DQo+ZGlmZiAtLWdpdCBhL3Rvb2xz
L3BlcmYvdXRpbC9wcm9iZS1maWxlLmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5jDQo+
aW5kZXggZjAwYjBkZjU2ZGZlLi4zOGMwYTYyMDM5Y2MgMTAwNjQ0DQo+LS0tIGEvdG9vbHMvcGVy
Zi91dGlsL3Byb2JlLWZpbGUuYw0KPisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmMN
Cj5AQCAtMjY3LDcgKzI2Nyw2IEBAIHN0YXRpYyBpbnQgX19kZWxfdHJhY2VfcHJvYmVfZXZlbnQo
aW50IGZkLCBzdHJ1Y3Qgc3RyX25vZGUgKmVudCkNCj4gCQlnb3RvIGVycm9yOw0KPiAJfQ0KPg0K
Pi0JcHJfaW5mbygiUmVtb3ZlZCBldmVudDogJXNcbiIsIGVudC0+cyk7DQo+IAlyZXR1cm4gMDsN
Cj4gZXJyb3I6DQo+IAlwcl93YXJuaW5nKCJGYWlsZWQgdG8gZGVsZXRlIGV2ZW50OiAlc1xuIiwN
Cj5AQCAtMjc1LDggKzI3NCw4IEBAIGVycm9yOg0KPiAJcmV0dXJuIHJldDsNCj4gfQ0KPg0KPi1z
dGF0aWMgaW50IHByb2JlX2ZpbGVfX2dldF9ldmVudHMoaW50IGZkLCBzdHJ1Y3Qgc3RyZmlsdGVy
ICpmaWx0ZXIsDQo+LQkJCQkgIHN0cnVjdCBzdHJsaXN0ICpwbGlzdCkNCj4raW50IHByb2JlX2Zp
bGVfX2dldF9ldmVudHMoaW50IGZkLCBzdHJ1Y3Qgc3RyZmlsdGVyICpmaWx0ZXIsDQo+KwkJCSAg
IHN0cnVjdCBzdHJsaXN0ICpwbGlzdCkNCj4gew0KPiAJc3RydWN0IHN0cmxpc3QgKm5hbWVsaXN0
Ow0KPiAJc3RydWN0IHN0cl9ub2RlICplbnQ7DQo+QEAgLTMwMCw3ICsyOTksNyBAQCBzdGF0aWMg
aW50IHByb2JlX2ZpbGVfX2dldF9ldmVudHMoaW50IGZkLCBzdHJ1Y3Qgc3RyZmlsdGVyICpmaWx0
ZXIsDQo+IAlyZXR1cm4gcmV0Ow0KPiB9DQo+DQo+LXN0YXRpYyBpbnQgcHJvYmVfZmlsZV9fZGVs
X3N0cmxpc3QoaW50IGZkLCBzdHJ1Y3Qgc3RybGlzdCAqbmFtZWxpc3QpDQo+K2ludCBwcm9iZV9m
aWxlX19kZWxfc3RybGlzdChpbnQgZmQsIHN0cnVjdCBzdHJsaXN0ICpuYW1lbGlzdCkNCj4gew0K
PiAJaW50IHJldCA9IDA7DQo+IAlzdHJ1Y3Qgc3RyX25vZGUgKmVudDsNCj5kaWZmIC0tZ2l0IGEv
dG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxl
LmgNCj5pbmRleCBhZGE5NGEyNDJhMTcuLjE4YWM5Y2Y1MWMzNCAxMDA2NDQNCj4tLS0gYS90b29s
cy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5oDQo+KysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZp
bGUuaA0KPkBAIC0xNCw1ICsxNCw5IEBAIHN0cnVjdCBzdHJsaXN0ICpwcm9iZV9maWxlX19nZXRf
bmFtZWxpc3QoaW50IGZkKTsNCj4gc3RydWN0IHN0cmxpc3QgKnByb2JlX2ZpbGVfX2dldF9yYXds
aXN0KGludCBmZCk7DQo+IGludCBwcm9iZV9maWxlX19hZGRfZXZlbnQoaW50IGZkLCBzdHJ1Y3Qg
cHJvYmVfdHJhY2VfZXZlbnQgKnRldik7DQo+IGludCBwcm9iZV9maWxlX19kZWxfZXZlbnRzKGlu
dCBmZCwgc3RydWN0IHN0cmZpbHRlciAqZmlsdGVyKTsNCj4raW50IHByb2JlX2ZpbGVfX2dldF9l
dmVudHMoaW50IGZkLCBzdHJ1Y3Qgc3RyZmlsdGVyICpmaWx0ZXIsDQo+KwkJCQkgIHN0cnVjdCBz
dHJsaXN0ICpwbGlzdCk7DQo+K2ludCBwcm9iZV9maWxlX19kZWxfc3RybGlzdChpbnQgZmQsIHN0
cnVjdCBzdHJsaXN0ICpuYW1lbGlzdCk7DQo+Kw0KPg0KPiAjZW5kaWYNCj4tLQ0KPjIuNS4wDQoN
Cg==
--
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/

[toc] | [prev] | [next] | [standalone]


#1220896 — [tip:perf/core] perf probe: Print deleted events in cmd_probe()

Fromtip-bot for Namhyung Kim <tipbot@zytor.com>
Date2015-09-08 16:50 +0200
Subject[tip:perf/core] perf probe: Print deleted events in cmd_probe()
Message-ID<q6snD-7de-15@gated-at.bofh.it>
In reply to#1218886
Commit-ID:  e607f1426b584f2bd3f688a2d416baf963251e7a
Gitweb:     http://git.kernel.org/tip/e607f1426b584f2bd3f688a2d416baf963251e7a
Author:     Namhyung Kim <namhyung@kernel.org>
AuthorDate: Fri, 4 Sep 2015 21:16:03 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Fri, 4 Sep 2015 12:43:44 -0300

perf probe: Print deleted events in cmd_probe()

Showing actual trace event when deleteing perf events is only needed in
perf probe command.  But the add functionality itself can be used by
other places.  So move the printing code into the cmd_probe().

The output is not changed.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1441368963-11565-5-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-probe.c    | 62 ++++++++++++++++++++++++++++++++++++++++++-
 tools/perf/util/probe-event.c |  5 ----
 tools/perf/util/probe-event.h |  1 +
 tools/perf/util/probe-file.c  |  7 +++--
 tools/perf/util/probe-file.h  |  4 +++
 5 files changed, 69 insertions(+), 10 deletions(-)

diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index b8cf6cb..ee2c46d 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -41,6 +41,7 @@
 #include "util/parse-options.h"
 #include "util/probe-finder.h"
 #include "util/probe-event.h"
+#include "util/probe-file.h"
 
 #define DEFAULT_VAR_FILTER "!__k???tab_* & !__crc_*"
 #define DEFAULT_FUNC_FILTER "!_*"
@@ -357,6 +358,65 @@ out_cleanup:
 	return ret;
 }
 
+static int perf_del_probe_events(struct strfilter *filter)
+{
+	int ret, ret2, ufd = -1, kfd = -1;
+	char *str = strfilter__string(filter);
+	struct strlist *klist = NULL, *ulist = NULL;
+	struct str_node *ent;
+
+	if (!str)
+		return -EINVAL;
+
+	pr_debug("Delete filter: \'%s\'\n", str);
+
+	/* Get current event names */
+	ret = probe_file__open_both(&kfd, &ufd, PF_FL_RW);
+	if (ret < 0)
+		goto out;
+
+	klist = strlist__new(NULL, NULL);
+	if (!klist)
+		return -ENOMEM;
+
+	ret = probe_file__get_events(kfd, filter, klist);
+	if (ret == 0) {
+		strlist__for_each(ent, klist)
+			pr_info("Removed event: %s\n", ent->s);
+
+		ret = probe_file__del_strlist(kfd, klist);
+		if (ret < 0)
+			goto error;
+	}
+
+	ret2 = probe_file__get_events(ufd, filter, ulist);
+	if (ret2 == 0) {
+		strlist__for_each(ent, ulist)
+			pr_info("Removed event: %s\n", ent->s);
+
+		ret2 = probe_file__del_strlist(ufd, ulist);
+		if (ret2 < 0)
+			goto error;
+	}
+
+	if (ret == -ENOENT && ret2 == -ENOENT)
+		pr_debug("\"%s\" does not hit any event.\n", str);
+		/* Note that this is silently ignored */
+	ret = 0;
+
+error:
+	if (kfd >= 0)
+		close(kfd);
+	if (ufd >= 0)
+		close(ufd);
+out:
+	strlist__delete(klist);
+	strlist__delete(ulist);
+	free(str);
+
+	return ret;
+}
+
 static int
 __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
 {
@@ -529,7 +589,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
 		return ret;
 #endif
 	case 'd':
-		ret = del_perf_probe_events(params.filter);
+		ret = perf_del_probe_events(params.filter);
 		if (ret < 0) {
 			pr_err_with_code("  Error: Failed to delete events.", ret);
 			return ret;
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 01b9a5b..3da9e1c 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2819,8 +2819,6 @@ int del_perf_probe_events(struct strfilter *filter)
 	if (!str)
 		return -EINVAL;
 
-	pr_debug("Delete filter: \'%s\'\n", str);
-
 	/* Get current event names */
 	ret = probe_file__open_both(&kfd, &ufd, PF_FL_RW);
 	if (ret < 0)
@@ -2835,9 +2833,6 @@ int del_perf_probe_events(struct strfilter *filter)
 		ret = ret2;
 		goto error;
 	}
-	if (ret == -ENOENT && ret2 == -ENOENT)
-		pr_debug("\"%s\" does not hit any event.\n", str);
-		/* Note that this is silently ignored */
 	ret = 0;
 
 error:
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 610f743..9bcea36 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -144,6 +144,7 @@ extern int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern int del_perf_probe_events(struct strfilter *filter);
+
 extern int show_perf_probe_event(const char *group, const char *event,
 				 struct perf_probe_event *pev,
 				 const char *module, bool use_stdout);
diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
index f00b0df..38c0a62 100644
--- a/tools/perf/util/probe-file.c
+++ b/tools/perf/util/probe-file.c
@@ -267,7 +267,6 @@ static int __del_trace_probe_event(int fd, struct str_node *ent)
 		goto error;
 	}
 
-	pr_info("Removed event: %s\n", ent->s);
 	return 0;
 error:
 	pr_warning("Failed to delete event: %s\n",
@@ -275,8 +274,8 @@ error:
 	return ret;
 }
 
-static int probe_file__get_events(int fd, struct strfilter *filter,
-				  struct strlist *plist)
+int probe_file__get_events(int fd, struct strfilter *filter,
+			   struct strlist *plist)
 {
 	struct strlist *namelist;
 	struct str_node *ent;
@@ -300,7 +299,7 @@ static int probe_file__get_events(int fd, struct strfilter *filter,
 	return ret;
 }
 
-static int probe_file__del_strlist(int fd, struct strlist *namelist)
+int probe_file__del_strlist(int fd, struct strlist *namelist)
 {
 	int ret = 0;
 	struct str_node *ent;
diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h
index ada94a2..18ac9cf 100644
--- a/tools/perf/util/probe-file.h
+++ b/tools/perf/util/probe-file.h
@@ -14,5 +14,9 @@ struct strlist *probe_file__get_namelist(int fd);
 struct strlist *probe_file__get_rawlist(int fd);
 int probe_file__add_event(int fd, struct probe_trace_event *tev);
 int probe_file__del_events(int fd, struct strfilter *filter);
+int probe_file__get_events(int fd, struct strfilter *filter,
+				  struct strlist *plist);
+int probe_file__del_strlist(int fd, struct strlist *namelist);
+
 
 #endif
--
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/

[toc] | [prev] | [next] | [standalone]


#1218892 — [PATCH v2 4/5] perf probe: Split del_perf_probe_events()

FromNamhyung Kim <namhyung@kernel.org>
Date2015-09-04 14:30 +0200
Subject[PATCH v2 4/5] perf probe: Split del_perf_probe_events()
Message-ID<q4YhZ-1XT-33@gated-at.bofh.it>
In reply to#1218875
The del_perf_probe_events() does 2 things:

1. find existing events which match to filter
2. delete such trace events from kernel

But sometimes we need to do something with the trace events.  So split
the funtion into two, so that it can access intermediate trace events
name using strlist if needed.

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/probe-file.c | 40 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 36 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
index bbb243717ec8..f00b0df56dfe 100644
--- a/tools/perf/util/probe-file.c
+++ b/tools/perf/util/probe-file.c
@@ -275,7 +275,8 @@ error:
 	return ret;
 }
 
-int probe_file__del_events(int fd, struct strfilter *filter)
+static int probe_file__get_events(int fd, struct strfilter *filter,
+				  struct strlist *plist)
 {
 	struct strlist *namelist;
 	struct str_node *ent;
@@ -290,12 +291,43 @@ int probe_file__del_events(int fd, struct strfilter *filter)
 		p = strchr(ent->s, ':');
 		if ((p && strfilter__compare(filter, p + 1)) ||
 		    strfilter__compare(filter, ent->s)) {
-			ret = __del_trace_probe_event(fd, ent);
-			if (ret < 0)
-				break;
+			strlist__add(plist, ent->s);
+			ret = 0;
 		}
 	}
 	strlist__delete(namelist);
 
 	return ret;
 }
+
+static int probe_file__del_strlist(int fd, struct strlist *namelist)
+{
+	int ret = 0;
+	struct str_node *ent;
+
+	strlist__for_each(ent, namelist) {
+		ret = __del_trace_probe_event(fd, ent);
+		if (ret < 0)
+			break;
+	}
+	return ret;
+}
+
+int probe_file__del_events(int fd, struct strfilter *filter)
+{
+	struct strlist *namelist;
+	int ret;
+
+	namelist = strlist__new(NULL, NULL);
+	if (!namelist)
+		return -ENOMEM;
+
+	ret = probe_file__get_events(fd, filter, namelist);
+	if (ret < 0)
+		return ret;
+
+	ret = probe_file__del_strlist(fd, namelist);
+	strlist__delete(namelist);
+
+	return ret;
+}
-- 
2.5.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/

[toc] | [prev] | [next] | [standalone]


#1220899 — [tip:perf/core] perf probe: Split del_perf_probe_events()

Fromtip-bot for Namhyung Kim <tipbot@zytor.com>
Date2015-09-08 16:50 +0200
Subject[tip:perf/core] perf probe: Split del_perf_probe_events()
Message-ID<q6snE-7de-31@gated-at.bofh.it>
In reply to#1218892
Commit-ID:  e7895e422e4da63daedacad0a2ed1a5a6b502d66
Gitweb:     http://git.kernel.org/tip/e7895e422e4da63daedacad0a2ed1a5a6b502d66
Author:     Namhyung Kim <namhyung@kernel.org>
AuthorDate: Fri, 4 Sep 2015 21:16:02 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Fri, 4 Sep 2015 12:43:19 -0300

perf probe: Split del_perf_probe_events()

The del_perf_probe_events() does 2 things:

1. find existing events which match to filter
2. delete such trace events from kernel

But sometimes we need to do something with the trace events.  So split
the funtion into two, so that it can access intermediate trace events
name using strlist if needed.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1441368963-11565-4-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/probe-file.c | 40 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 36 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
index bbb2437..f00b0df 100644
--- a/tools/perf/util/probe-file.c
+++ b/tools/perf/util/probe-file.c
@@ -275,7 +275,8 @@ error:
 	return ret;
 }
 
-int probe_file__del_events(int fd, struct strfilter *filter)
+static int probe_file__get_events(int fd, struct strfilter *filter,
+				  struct strlist *plist)
 {
 	struct strlist *namelist;
 	struct str_node *ent;
@@ -290,12 +291,43 @@ int probe_file__del_events(int fd, struct strfilter *filter)
 		p = strchr(ent->s, ':');
 		if ((p && strfilter__compare(filter, p + 1)) ||
 		    strfilter__compare(filter, ent->s)) {
-			ret = __del_trace_probe_event(fd, ent);
-			if (ret < 0)
-				break;
+			strlist__add(plist, ent->s);
+			ret = 0;
 		}
 	}
 	strlist__delete(namelist);
 
 	return ret;
 }
+
+static int probe_file__del_strlist(int fd, struct strlist *namelist)
+{
+	int ret = 0;
+	struct str_node *ent;
+
+	strlist__for_each(ent, namelist) {
+		ret = __del_trace_probe_event(fd, ent);
+		if (ret < 0)
+			break;
+	}
+	return ret;
+}
+
+int probe_file__del_events(int fd, struct strfilter *filter)
+{
+	struct strlist *namelist;
+	int ret;
+
+	namelist = strlist__new(NULL, NULL);
+	if (!namelist)
+		return -ENOMEM;
+
+	ret = probe_file__get_events(fd, filter, namelist);
+	if (ret < 0)
+		return ret;
+
+	ret = probe_file__del_strlist(fd, namelist);
+	strlist__delete(namelist);
+
+	return ret;
+}
--
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/

[toc] | [prev] | [next] | [standalone]


#1219770

From"Wangnan (F)" <wangnan0@huawei.com>
Date2015-09-06 09:50 +0200
Message-ID<q5CS5-NJ-1@gated-at.bofh.it>
In reply to#1218875
Hi Namhyung,

Thanks for this patchset.

Could you plase have a look at patch 5/27 and 6/27 in my newest pull 
request?
These 2 patches utilize new probing API to create probe point and collect
probe_trace_events. I'm not very sure I fully understand your design 
principle,
especially the cleanup part, because I can see different functions 
dealing with
cleanup:

cleanup_perf_probe_events
del_perf_probe_events
clear_perf_probe_event
clear_probe_trace_event

But non of them works perfectly for me.

In bpf_prog_priv__clear() function of 6/27, I copied some code from
cleanup_perf_probe_events(), because I think when destroying bpf programs,
the probe_trace_events should also be cleanuped, but we don't need call
exit_symbol_maps() many times, because we are in 'perf record', and not
sure whether other parts of perf need symbol maps. Otherwise I think 
directly
calling cleanup_perf_probe_events() sould be better.

You can find patch from:

http://lkml.kernel.org/n/1441523623-152703-6-git-send-email-wangnan0@huawei.com

http://lkml.kernel.org/n/1441523623-152703-7-git-send-email-wangnan0@huawei.com

Thank you.

On 2015/9/4 20:15, Namhyung Kim wrote:
> 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.
>
> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>   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 eb5f18b75402..2c762f41e7a5 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;
>   }


--
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/

[toc] | [prev] | [next] | [standalone]


#1220449

FromNamhyung Kim <namhyung@kernel.org>
Date2015-09-08 04:00 +0200
Message-ID<q6gmt-6J6-3@gated-at.bofh.it>
In reply to#1219770
On Sun, Sep 06, 2015 at 03:47:37PM +0800, Wangnan (F) wrote:
> Hi Namhyung,

Hi,

I'm off until Wednesday.  I'll be able to take a look at it on
Thursday.

Thanks,
Namhyung


> 
> Thanks for this patchset.
> 
> Could you plase have a look at patch 5/27 and 6/27 in my newest pull
> request?
> These 2 patches utilize new probing API to create probe point and collect
> probe_trace_events. I'm not very sure I fully understand your design
> principle,
> especially the cleanup part, because I can see different functions dealing
> with
> cleanup:
> 
> cleanup_perf_probe_events
> del_perf_probe_events
> clear_perf_probe_event
> clear_probe_trace_event
> 
> But non of them works perfectly for me.
> 
> In bpf_prog_priv__clear() function of 6/27, I copied some code from
> cleanup_perf_probe_events(), because I think when destroying bpf programs,
> the probe_trace_events should also be cleanuped, but we don't need call
> exit_symbol_maps() many times, because we are in 'perf record', and not
> sure whether other parts of perf need symbol maps. Otherwise I think
> directly
> calling cleanup_perf_probe_events() sould be better.
> 
> You can find patch from:
> 
> http://lkml.kernel.org/n/1441523623-152703-6-git-send-email-wangnan0@huawei.com
> 
> http://lkml.kernel.org/n/1441523623-152703-7-git-send-email-wangnan0@huawei.com
> 
> Thank you.
> 
> On 2015/9/4 20:15, Namhyung Kim wrote:
> >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.
> >
> >Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> >Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> >---
> >  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 eb5f18b75402..2c762f41e7a5 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;
> >  }
> 
> 
--
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/

[toc] | [prev] | [next] | [standalone]


#1221852

FromNamhyung Kim <namhyung@kernel.org>
Date2015-09-10 04:30 +0200
Message-ID<q6ZMC-4XO-9@gated-at.bofh.it>
In reply to#1219770
On Sun, Sep 06, 2015 at 03:47:37PM +0800, Wangnan (F) wrote:
> Hi Namhyung,

Hi,

> 
> Thanks for this patchset.
> 
> Could you plase have a look at patch 5/27 and 6/27 in my newest pull
> request?
> These 2 patches utilize new probing API to create probe point and collect
> probe_trace_events. I'm not very sure I fully understand your design
> principle,
> especially the cleanup part, because I can see different functions dealing
> with
> cleanup:
> 
> cleanup_perf_probe_events
> del_perf_probe_events
> clear_perf_probe_event
> clear_probe_trace_event
> 
> But non of them works perfectly for me.

The cleanup_perf_probe_events() is just to keep the existing logic as
long as possible.  But I think it needs to call
clear_perf_probe_event().

The del_perf_probe_events() uses strfilter, but I think it can be
problematic if other instances or users are using similar events at
the same time.

So for your case, IMHO it'd better keeping the perf/trace events after
probing and reusing the events for unprobing.  I'll take a look at it.


> 
> In bpf_prog_priv__clear() function of 6/27, I copied some code from
> cleanup_perf_probe_events(), because I think when destroying bpf programs,
> the probe_trace_events should also be cleanuped, but we don't need call
> exit_symbol_maps() many times, because we are in 'perf record', and not
> sure whether other parts of perf need symbol maps. Otherwise I think
> directly
> calling cleanup_perf_probe_events() sould be better.

Yeah, I also think exit_symbol_maps() should not be a part of the
cleanup.  I'll send a patch soon.


> 
> You can find patch from:
> 
> http://lkml.kernel.org/n/1441523623-152703-6-git-send-email-wangnan0@huawei.com
> 
> http://lkml.kernel.org/n/1441523623-152703-7-git-send-email-wangnan0@huawei.com

Thanks for your work!
Namhyung
--
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/

[toc] | [prev] | [next] | [standalone]


#1221918

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-09-10 07:10 +0200
Message-ID<q72hr-bR-1@gated-at.bofh.it>
In reply to#1221852
PkZyb206IE5hbWh5dW5nIEtpbSBbbWFpbHRvOm5hbWh5dW5nQGdtYWlsLmNvbV0gT24gQmVoYWxm
IE9mIE5hbWh5dW5nIEtpbQ0KPg0KPk9uIFN1biwgU2VwIDA2LCAyMDE1IGF0IDAzOjQ3OjM3UE0g
KzA4MDAsIFdhbmduYW4gKEYpIHdyb3RlOg0KPj4gSGkgTmFtaHl1bmcsDQo+DQo+SGksDQo+DQo+
Pg0KPj4gVGhhbmtzIGZvciB0aGlzIHBhdGNoc2V0Lg0KPj4NCj4+IENvdWxkIHlvdSBwbGFzZSBo
YXZlIGEgbG9vayBhdCBwYXRjaCA1LzI3IGFuZCA2LzI3IGluIG15IG5ld2VzdCBwdWxsDQo+PiBy
ZXF1ZXN0Pw0KPj4gVGhlc2UgMiBwYXRjaGVzIHV0aWxpemUgbmV3IHByb2JpbmcgQVBJIHRvIGNy
ZWF0ZSBwcm9iZSBwb2ludCBhbmQgY29sbGVjdA0KPj4gcHJvYmVfdHJhY2VfZXZlbnRzLiBJJ20g
bm90IHZlcnkgc3VyZSBJIGZ1bGx5IHVuZGVyc3RhbmQgeW91ciBkZXNpZ24NCj4+IHByaW5jaXBs
ZSwNCj4+IGVzcGVjaWFsbHkgdGhlIGNsZWFudXAgcGFydCwgYmVjYXVzZSBJIGNhbiBzZWUgZGlm
ZmVyZW50IGZ1bmN0aW9ucyBkZWFsaW5nDQo+PiB3aXRoDQo+PiBjbGVhbnVwOg0KPj4NCj4+IGNs
ZWFudXBfcGVyZl9wcm9iZV9ldmVudHMNCg0KVGhpcyBpcyBmb3IgY2xlYXJpbmcgYW4gYXJyYXkg
b2YgcHJvYmUgZXZlbnRzLg0KDQo+PiBkZWxfcGVyZl9wcm9iZV9ldmVudHMNCg0KVGhpcyBpcyBu
b3QgZm9yIGNsZWFudXAsIGJ1dCBmb3IgcmVtb3ZpbmcgcHJvYmVzIGluIHRoZSBrZXJuZWwuDQoN
Cj4+IGNsZWFyX3BlcmZfcHJvYmVfZXZlbnQNCj4+IGNsZWFyX3Byb2JlX3RyYWNlX2V2ZW50DQoN
ClRoZXNlIGFyZSB0aGUgY2xlYW51cCBlYWNoIGV2ZW50LiBBaCwgcmlnaHQsIHNpbmNlIG5vdyBw
ZXJmX3Byb2JlX2V2ZW50IGhhcyBwcm9iZV90cmFjZV9ldmVudHMsDQpjbGVhcl9wZXJmX3Byb2Jl
X2V2ZW50IGhhcyB0byBjYWxsIGNsZWFyX3Byb2JlX3RyYWNlX2V2ZW50Lg0KDQo+Pg0KPj4gQnV0
IG5vbiBvZiB0aGVtIHdvcmtzIHBlcmZlY3RseSBmb3IgbWUuDQo+DQo+VGhlIGNsZWFudXBfcGVy
Zl9wcm9iZV9ldmVudHMoKSBpcyBqdXN0IHRvIGtlZXAgdGhlIGV4aXN0aW5nIGxvZ2ljIGFzDQo+
bG9uZyBhcyBwb3NzaWJsZS4gIEJ1dCBJIHRoaW5rIGl0IG5lZWRzIHRvIGNhbGwNCj5jbGVhcl9w
ZXJmX3Byb2JlX2V2ZW50KCkuDQo+DQo+VGhlIGRlbF9wZXJmX3Byb2JlX2V2ZW50cygpIHVzZXMg
c3RyZmlsdGVyLCBidXQgSSB0aGluayBpdCBjYW4gYmUNCj5wcm9ibGVtYXRpYyBpZiBvdGhlciBp
bnN0YW5jZXMgb3IgdXNlcnMgYXJlIHVzaW5nIHNpbWlsYXIgZXZlbnRzIGF0DQo+dGhlIHNhbWUg
dGltZS4NCg0KWWVhaCwgc2luY2UgcGVyZiBwcm9iZSBkb2Vzbid0IGxvY2sgdGhlIGZ0cmFjZSwg
dGhlcmUgc2hvdWxkIGJlIGENCnRpbWluZyBidWcsIGJ1dCBpdCBjYW4gYmUgZml4ZWQgZWFzaWx5
IGJ5IGlnbm9yaW5nIC1FTk9FTlQuIDopIA0KDQo+U28gZm9yIHlvdXIgY2FzZSwgSU1ITyBpdCdk
IGJldHRlciBrZWVwaW5nIHRoZSBwZXJmL3RyYWNlIGV2ZW50cyBhZnRlcg0KPnByb2JpbmcgYW5k
IHJldXNpbmcgdGhlIGV2ZW50cyBmb3IgdW5wcm9iaW5nLiAgSSdsbCB0YWtlIGEgbG9vayBhdCBp
dC4NCj4NCj4NCj4+DQo+PiBJbiBicGZfcHJvZ19wcml2X19jbGVhcigpIGZ1bmN0aW9uIG9mIDYv
MjcsIEkgY29waWVkIHNvbWUgY29kZSBmcm9tDQo+PiBjbGVhbnVwX3BlcmZfcHJvYmVfZXZlbnRz
KCksIGJlY2F1c2UgSSB0aGluayB3aGVuIGRlc3Ryb3lpbmcgYnBmIHByb2dyYW1zLA0KPj4gdGhl
IHByb2JlX3RyYWNlX2V2ZW50cyBzaG91bGQgYWxzbyBiZSBjbGVhbnVwZWQsIGJ1dCB3ZSBkb24n
dCBuZWVkIGNhbGwNCj4+IGV4aXRfc3ltYm9sX21hcHMoKSBtYW55IHRpbWVzLCBiZWNhdXNlIHdl
IGFyZSBpbiAncGVyZiByZWNvcmQnLCBhbmQgbm90DQo+PiBzdXJlIHdoZXRoZXIgb3RoZXIgcGFy
dHMgb2YgcGVyZiBuZWVkIHN5bWJvbCBtYXBzLiBPdGhlcndpc2UgSSB0aGluaw0KPj4gZGlyZWN0
bHkNCj4+IGNhbGxpbmcgY2xlYW51cF9wZXJmX3Byb2JlX2V2ZW50cygpIHNvdWxkIGJlIGJldHRl
ci4NCj4NCj5ZZWFoLCBJIGFsc28gdGhpbmsgZXhpdF9zeW1ib2xfbWFwcygpIHNob3VsZCBub3Qg
YmUgYSBwYXJ0IG9mIHRoZQ0KPmNsZWFudXAuICBJJ2xsIHNlbmQgYSBwYXRjaCBzb29uLg0KDQpP
Sy4NCg0KDQpUaGFua3MhDQo=
--
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/

[toc] | [prev] | [next] | [standalone]


#1221956

FromNamhyung Kim <namhyung@kernel.org>
Date2015-09-10 08:50 +0200
Message-ID<q73Qe-2gG-7@gated-at.bofh.it>
In reply to#1221918
Hi Masami,

On Thu, Sep 10, 2015 at 05:00:07AM +0000, 平松雅巳 / HIRAMATU,MASAMI wrote:
> >From: Namhyung Kim [mailto:namhyung@gmail.com] On Behalf Of Namhyung Kim
> >The del_perf_probe_events() uses strfilter, but I think it can be
> >problematic if other instances or users are using similar events at
> >the same time.
> 
> Yeah, since perf probe doesn't lock the ftrace, there should be a
> timing bug, but it can be fixed easily by ignoring -ENOENT. :) 

By ignoring -ENOENT?  Are you saying that there's a race between two
deleters?  Yes, of course, but I think that the bug will hit an adder
and a deleter especially if automatic probing is used (by eBPF and/or
SDT recording).

What about this?


From 45dba35cb0f5fa1b2e78fec8c05faf5e9a1b200e Mon Sep 17 00:00:00 2001
From: Namhyung Kim <namhyung@kernel.org>
Date: Thu, 10 Sep 2015 15:25:28 +0900
Subject: [PATCH] perf probe: Support deleting trace events directly

Currently del_perf_probe_events() deletes events which match to a given
filter.  But it might have a timing bug when other users also set probes
with similar names.  So it'd be better deleting our events directly
rather than pattern matching.

Since the del_perf_probe_events() has no user at this time, change it to
receive perf_probe_event's.  It is more consistent to other APIs as well.

Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Wang Nan <wangnan0@huawei.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/probe-event.c | 30 +++++++++++-------------------
 tools/perf/util/probe-event.h |  2 +-
 tools/perf/util/probe-file.c  | 24 ++++++++++++++++++++++++
 tools/perf/util/probe-file.h  |  1 +
 4 files changed, 37 insertions(+), 20 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 2b78e8f19b45..88d7ef87ab99 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2810,37 +2810,29 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
 	return ret;
 }
 
-int del_perf_probe_events(struct strfilter *filter)
+int del_perf_probe_events(struct perf_probe_event *pevs, int npevs)
 {
-	int ret, ret2, ufd = -1, kfd = -1;
-	char *str = strfilter__string(filter);
+	int i, j, ret, ret2;
+	int ufd = -1, kfd = -1;
 
-	if (!str)
-		return -EINVAL;
-
-	/* Get current event names */
 	ret = probe_file__open_both(&kfd, &ufd, PF_FL_RW);
 	if (ret < 0)
-		goto out;
+		return ret;
 
-	ret = probe_file__del_events(kfd, filter);
-	if (ret < 0 && ret != -ENOENT)
-		goto error;
+	for (i = 0; i < npevs; i++) {
+		int fd = pevs[i].uprobes ? ufd : kfd;
 
-	ret2 = probe_file__del_events(ufd, filter);
-	if (ret2 < 0 && ret2 != -ENOENT) {
-		ret = ret2;
-		goto error;
+		for (j = 0; j < pevs[i].ntevs; j++) {
+			ret2 = probe_file__del_trace_event(fd, &pevs[i].tevs[j]);
+			if (ret == 0)
+				ret = ret2;
+		}
 	}
-	ret = 0;
 
-error:
 	if (kfd >= 0)
 		close(kfd);
 	if (ufd >= 0)
 		close(ufd);
-out:
-	free(str);
 
 	return ret;
 }
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index ba926c30f8cd..cb58b981cc92 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -145,7 +145,7 @@ extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 extern void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs);
-extern int del_perf_probe_events(struct strfilter *filter);
+extern int del_perf_probe_events(struct perf_probe_event *pevs, int npevs);
 
 extern int show_perf_probe_event(const char *group, const char *event,
 				 struct perf_probe_event *pev,
diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
index 89dbeb92c68e..334b7b75b55b 100644
--- a/tools/perf/util/probe-file.c
+++ b/tools/perf/util/probe-file.c
@@ -319,3 +319,27 @@ int probe_file__del_events(int fd, struct strfilter *filter)
 
 	return ret;
 }
+
+int probe_file__del_trace_event(int fd, struct probe_trace_event *tev)
+{
+	char buf[128];
+	int ret;
+
+	/* Convert from perf-probe event to trace-probe event */
+	ret = e_snprintf(buf, 128, "-:%s/%s", tev->group, tev->event);
+	if (ret < 0)
+		goto error;
+
+	pr_debug("Writing event: %s\n", buf);
+	ret = write(fd, buf, strlen(buf));
+	if (ret < 0) {
+		ret = -errno;
+		goto error;
+	}
+
+	return 0;
+error:
+	pr_warning("Failed to delete event: %s\n",
+		   strerror_r(-ret, buf, sizeof(buf)));
+	return ret;
+}
diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h
index 18ac9cf51c34..02515ea12f1e 100644
--- a/tools/perf/util/probe-file.h
+++ b/tools/perf/util/probe-file.h
@@ -17,6 +17,7 @@ int probe_file__del_events(int fd, struct strfilter *filter);
 int probe_file__get_events(int fd, struct strfilter *filter,
 				  struct strlist *plist);
 int probe_file__del_strlist(int fd, struct strlist *namelist);
+int probe_file__del_trace_event(int fd, struct probe_trace_event *tev);
 
 
 #endif
-- 
2.5.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/

[toc] | [prev] | [next] | [standalone]


#1221996

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-09-10 10:20 +0200
Message-ID<q75fk-4cM-7@gated-at.bofh.it>
In reply to#1221956
SGkgTmFtaHl1bmcsDQoNCkZyb206IE5hbWh5dW5nIEtpbSBbbWFpbHRvOm5hbWh5dW5nQGdtYWls
LmNvbV0gT24gQmVoYWxmIE9mIE5hbWh5dW5nIEtpbQ0KPg0KPkhpIE1hc2FtaSwNCj4NCj5PbiBU
aHUsIFNlcCAxMCwgMjAxNSBhdCAwNTowMDowN0FNICswMDAwLCDlubPmnb7pm4Xlt7MgLyBISVJB
TUFUVe+8jE1BU0FNSSB3cm90ZToNCj4+ID5Gcm9tOiBOYW1oeXVuZyBLaW0gW21haWx0bzpuYW1o
eXVuZ0BnbWFpbC5jb21dIE9uIEJlaGFsZiBPZiBOYW1oeXVuZyBLaW0NCj4+ID5UaGUgZGVsX3Bl
cmZfcHJvYmVfZXZlbnRzKCkgdXNlcyBzdHJmaWx0ZXIsIGJ1dCBJIHRoaW5rIGl0IGNhbiBiZQ0K
Pj4gPnByb2JsZW1hdGljIGlmIG90aGVyIGluc3RhbmNlcyBvciB1c2VycyBhcmUgdXNpbmcgc2lt
aWxhciBldmVudHMgYXQNCj4+ID50aGUgc2FtZSB0aW1lLg0KPj4NCj4+IFllYWgsIHNpbmNlIHBl
cmYgcHJvYmUgZG9lc24ndCBsb2NrIHRoZSBmdHJhY2UsIHRoZXJlIHNob3VsZCBiZSBhDQo+PiB0
aW1pbmcgYnVnLCBidXQgaXQgY2FuIGJlIGZpeGVkIGVhc2lseSBieSBpZ25vcmluZyAtRU5PRU5U
LiA6KQ0KPg0KPkJ5IGlnbm9yaW5nIC1FTk9FTlQ/ICBBcmUgeW91IHNheWluZyB0aGF0IHRoZXJl
J3MgYSByYWNlIGJldHdlZW4gdHdvDQo+ZGVsZXRlcnM/ICBZZXMsIG9mIGNvdXJzZSwgYnV0IEkg
dGhpbmsgdGhhdCB0aGUgYnVnIHdpbGwgaGl0IGFuIGFkZGVyDQo+YW5kIGEgZGVsZXRlciBlc3Bl
Y2lhbGx5IGlmIGF1dG9tYXRpYyBwcm9iaW5nIGlzIHVzZWQgKGJ5IGVCUEYgYW5kL29yDQo+U0RU
IHJlY29yZGluZykuDQoNClNvLCBJIGRvbid0IHRoaW5rIHdlIG5lZWQgdGhlIGF1dG9tYXRpYyBl
dmVudCByZW1vdmluZy4gSW5zdGVhZCwgSSdkIGxpa2UgdG8NCnN1Z2dlc3QgdG8ga2VlcCBpdCBv
biB0aGUgbGlzdC4NCg0KPldoYXQgYWJvdXQgdGhpcz8NCg0KU2luY2UgcHJvYmUgZXZlbnRzIGFy
ZSBpZGVudGlmaWVkIG9ubHkgYnkgaXRzIG5hbWUsIHN0cmZpbHRlciBzdGlsbCB3b3Jrcy4NCllv
dSBjYW4gcmVtb3ZlIHNwZWNpZmljIGV2ZW50IHdpdGhvdXQgYW55IHdpbGRjYXJkLg0KDQpUaGFu
a3MsDQoNCg0KPkZyb20gNDVkYmEzNWNiMGY1ZmExYjJlNzhmZWM4YzA1ZmFmNWU5YTFiMjAwZSBN
b24gU2VwIDE3IDAwOjAwOjAwIDIwMDENCj5Gcm9tOiBOYW1oeXVuZyBLaW0gPG5hbWh5dW5nQGtl
cm5lbC5vcmc+DQo+RGF0ZTogVGh1LCAxMCBTZXAgMjAxNSAxNToyNToyOCArMDkwMA0KPlN1Ympl
Y3Q6IFtQQVRDSF0gcGVyZiBwcm9iZTogU3VwcG9ydCBkZWxldGluZyB0cmFjZSBldmVudHMgZGly
ZWN0bHkNCj4NCj5DdXJyZW50bHkgZGVsX3BlcmZfcHJvYmVfZXZlbnRzKCkgZGVsZXRlcyBldmVu
dHMgd2hpY2ggbWF0Y2ggdG8gYSBnaXZlbg0KPmZpbHRlci4gIEJ1dCBpdCBtaWdodCBoYXZlIGEg
dGltaW5nIGJ1ZyB3aGVuIG90aGVyIHVzZXJzIGFsc28gc2V0IHByb2Jlcw0KPndpdGggc2ltaWxh
ciBuYW1lcy4gIFNvIGl0J2QgYmUgYmV0dGVyIGRlbGV0aW5nIG91ciBldmVudHMgZGlyZWN0bHkN
Cj5yYXRoZXIgdGhhbiBwYXR0ZXJuIG1hdGNoaW5nLg0KPg0KPlNpbmNlIHRoZSBkZWxfcGVyZl9w
cm9iZV9ldmVudHMoKSBoYXMgbm8gdXNlciBhdCB0aGlzIHRpbWUsIGNoYW5nZSBpdCB0bw0KPnJl
Y2VpdmUgcGVyZl9wcm9iZV9ldmVudCdzLiAgSXQgaXMgbW9yZSBjb25zaXN0ZW50IHRvIG90aGVy
IEFQSXMgYXMgd2VsbC4NCj4NCj5DYzogTWFzYW1pIEhpcmFtYXRzdSA8bWFzYW1pLmhpcmFtYXRz
dS5wdEBoaXRhY2hpLmNvbT4NCj5DYzogV2FuZyBOYW4gPHdhbmduYW4wQGh1YXdlaS5jb20+DQo+
U2lnbmVkLW9mZi1ieTogTmFtaHl1bmcgS2ltIDxuYW1oeXVuZ0BrZXJuZWwub3JnPg0KPi0tLQ0K
PiB0b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYyB8IDMwICsrKysrKysrKysrLS0tLS0tLS0t
LS0tLS0tLS0tLQ0KPiB0b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaCB8ICAyICstDQo+IHRv
b2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmMgIHwgMjQgKysrKysrKysrKysrKysrKysrKysrKysr
DQo+IHRvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmggIHwgIDEgKw0KPiA0IGZpbGVzIGNoYW5n
ZWQsIDM3IGluc2VydGlvbnMoKyksIDIwIGRlbGV0aW9ucygtKQ0KPg0KPmRpZmYgLS1naXQgYS90
b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVu
dC5jDQo+aW5kZXggMmI3OGU4ZjE5YjQ1Li44OGQ3ZWY4N2FiOTkgMTAwNjQ0DQo+LS0tIGEvdG9v
bHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMNCj4rKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUt
ZXZlbnQuYw0KPkBAIC0yODEwLDM3ICsyODEwLDI5IEBAIGludCBhZGRfcGVyZl9wcm9iZV9ldmVu
dHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cykNCj4gCXJldHVybiBy
ZXQ7DQo+IH0NCj4NCj4taW50IGRlbF9wZXJmX3Byb2JlX2V2ZW50cyhzdHJ1Y3Qgc3RyZmlsdGVy
ICpmaWx0ZXIpDQo+K2ludCBkZWxfcGVyZl9wcm9iZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVf
ZXZlbnQgKnBldnMsIGludCBucGV2cykNCj4gew0KPi0JaW50IHJldCwgcmV0MiwgdWZkID0gLTEs
IGtmZCA9IC0xOw0KPi0JY2hhciAqc3RyID0gc3RyZmlsdGVyX19zdHJpbmcoZmlsdGVyKTsNCj4r
CWludCBpLCBqLCByZXQsIHJldDI7DQo+KwlpbnQgdWZkID0gLTEsIGtmZCA9IC0xOw0KPg0KPi0J
aWYgKCFzdHIpDQo+LQkJcmV0dXJuIC1FSU5WQUw7DQo+LQ0KPi0JLyogR2V0IGN1cnJlbnQgZXZl
bnQgbmFtZXMgKi8NCj4gCXJldCA9IHByb2JlX2ZpbGVfX29wZW5fYm90aCgma2ZkLCAmdWZkLCBQ
Rl9GTF9SVyk7DQo+IAlpZiAocmV0IDwgMCkNCj4tCQlnb3RvIG91dDsNCj4rCQlyZXR1cm4gcmV0
Ow0KPg0KPi0JcmV0ID0gcHJvYmVfZmlsZV9fZGVsX2V2ZW50cyhrZmQsIGZpbHRlcik7DQo+LQlp
ZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0VOVCkNCj4tCQlnb3RvIGVycm9yOw0KPisJZm9yIChp
ID0gMDsgaSA8IG5wZXZzOyBpKyspIHsNCj4rCQlpbnQgZmQgPSBwZXZzW2ldLnVwcm9iZXMgPyB1
ZmQgOiBrZmQ7DQo+DQo+LQlyZXQyID0gcHJvYmVfZmlsZV9fZGVsX2V2ZW50cyh1ZmQsIGZpbHRl
cik7DQo+LQlpZiAocmV0MiA8IDAgJiYgcmV0MiAhPSAtRU5PRU5UKSB7DQo+LQkJcmV0ID0gcmV0
MjsNCj4tCQlnb3RvIGVycm9yOw0KPisJCWZvciAoaiA9IDA7IGogPCBwZXZzW2ldLm50ZXZzOyBq
KyspIHsNCj4rCQkJcmV0MiA9IHByb2JlX2ZpbGVfX2RlbF90cmFjZV9ldmVudChmZCwgJnBldnNb
aV0udGV2c1tqXSk7DQo+KwkJCWlmIChyZXQgPT0gMCkNCj4rCQkJCXJldCA9IHJldDI7DQo+KwkJ
fQ0KPiAJfQ0KPi0JcmV0ID0gMDsNCj4NCj4tZXJyb3I6DQo+IAlpZiAoa2ZkID49IDApDQo+IAkJ
Y2xvc2Uoa2ZkKTsNCj4gCWlmICh1ZmQgPj0gMCkNCj4gCQljbG9zZSh1ZmQpOw0KPi1vdXQ6DQo+
LQlmcmVlKHN0cik7DQo+DQo+IAlyZXR1cm4gcmV0Ow0KPiB9DQo+ZGlmZiAtLWdpdCBhL3Rvb2xz
L3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmgN
Cj5pbmRleCBiYTkyNmMzMGY4Y2QuLmNiNThiOTgxY2M5MiAxMDA2NDQNCj4tLS0gYS90b29scy9w
ZXJmL3V0aWwvcHJvYmUtZXZlbnQuaA0KPisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVu
dC5oDQo+QEAgLTE0NSw3ICsxNDUsNyBAQCBleHRlcm4gaW50IGFkZF9wZXJmX3Byb2JlX2V2ZW50
cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2cywgaW50IG5wZXZzKTsNCj4gZXh0ZXJuIGlu
dCBjb252ZXJ0X3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZz
LCBpbnQgbnBldnMpOw0KPiBleHRlcm4gaW50IGFwcGx5X3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVj
dCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOw0KPiBleHRlcm4gdm9pZCBjbGVh
bnVwX3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQg
bnBldnMpOw0KPi1leHRlcm4gaW50IGRlbF9wZXJmX3Byb2JlX2V2ZW50cyhzdHJ1Y3Qgc3RyZmls
dGVyICpmaWx0ZXIpOw0KPitleHRlcm4gaW50IGRlbF9wZXJmX3Byb2JlX2V2ZW50cyhzdHJ1Y3Qg
cGVyZl9wcm9iZV9ldmVudCAqcGV2cywgaW50IG5wZXZzKTsNCj4NCj4gZXh0ZXJuIGludCBzaG93
X3BlcmZfcHJvYmVfZXZlbnQoY29uc3QgY2hhciAqZ3JvdXAsIGNvbnN0IGNoYXIgKmV2ZW50LA0K
PiAJCQkJIHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsDQo+ZGlmZiAtLWdpdCBhL3Rvb2xz
L3BlcmYvdXRpbC9wcm9iZS1maWxlLmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5jDQo+
aW5kZXggODlkYmViOTJjNjhlLi4zMzRiN2I3NWI1NWIgMTAwNjQ0DQo+LS0tIGEvdG9vbHMvcGVy
Zi91dGlsL3Byb2JlLWZpbGUuYw0KPisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmMN
Cj5AQCAtMzE5LDMgKzMxOSwyNyBAQCBpbnQgcHJvYmVfZmlsZV9fZGVsX2V2ZW50cyhpbnQgZmQs
IHN0cnVjdCBzdHJmaWx0ZXIgKmZpbHRlcikNCj4NCj4gCXJldHVybiByZXQ7DQo+IH0NCj4rDQo+
K2ludCBwcm9iZV9maWxlX19kZWxfdHJhY2VfZXZlbnQoaW50IGZkLCBzdHJ1Y3QgcHJvYmVfdHJh
Y2VfZXZlbnQgKnRldikNCj4rew0KPisJY2hhciBidWZbMTI4XTsNCj4rCWludCByZXQ7DQo+Kw0K
PisJLyogQ29udmVydCBmcm9tIHBlcmYtcHJvYmUgZXZlbnQgdG8gdHJhY2UtcHJvYmUgZXZlbnQg
Ki8NCj4rCXJldCA9IGVfc25wcmludGYoYnVmLCAxMjgsICItOiVzLyVzIiwgdGV2LT5ncm91cCwg
dGV2LT5ldmVudCk7DQo+KwlpZiAocmV0IDwgMCkNCj4rCQlnb3RvIGVycm9yOw0KPisNCj4rCXBy
X2RlYnVnKCJXcml0aW5nIGV2ZW50OiAlc1xuIiwgYnVmKTsNCj4rCXJldCA9IHdyaXRlKGZkLCBi
dWYsIHN0cmxlbihidWYpKTsNCj4rCWlmIChyZXQgPCAwKSB7DQo+KwkJcmV0ID0gLWVycm5vOw0K
PisJCWdvdG8gZXJyb3I7DQo+Kwl9DQo+Kw0KPisJcmV0dXJuIDA7DQo+K2Vycm9yOg0KPisJcHJf
d2FybmluZygiRmFpbGVkIHRvIGRlbGV0ZSBldmVudDogJXNcbiIsDQo+KwkJICAgc3RyZXJyb3Jf
cigtcmV0LCBidWYsIHNpemVvZihidWYpKSk7DQo+KwlyZXR1cm4gcmV0Ow0KPit9DQo+ZGlmZiAt
LWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmggYi90b29scy9wZXJmL3V0aWwvcHJv
YmUtZmlsZS5oDQo+aW5kZXggMThhYzljZjUxYzM0Li4wMjUxNWVhMTJmMWUgMTAwNjQ0DQo+LS0t
IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuaA0KPisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9w
cm9iZS1maWxlLmgNCj5AQCAtMTcsNiArMTcsNyBAQCBpbnQgcHJvYmVfZmlsZV9fZGVsX2V2ZW50
cyhpbnQgZmQsIHN0cnVjdCBzdHJmaWx0ZXIgKmZpbHRlcik7DQo+IGludCBwcm9iZV9maWxlX19n
ZXRfZXZlbnRzKGludCBmZCwgc3RydWN0IHN0cmZpbHRlciAqZmlsdGVyLA0KPiAJCQkJICBzdHJ1
Y3Qgc3RybGlzdCAqcGxpc3QpOw0KPiBpbnQgcHJvYmVfZmlsZV9fZGVsX3N0cmxpc3QoaW50IGZk
LCBzdHJ1Y3Qgc3RybGlzdCAqbmFtZWxpc3QpOw0KPitpbnQgcHJvYmVfZmlsZV9fZGVsX3RyYWNl
X2V2ZW50KGludCBmZCwgc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICp0ZXYpOw0KPg0KPg0KPiAj
ZW5kaWYNCj4tLQ0KPjIuNS4wDQoNCg==
--
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/

[toc] | [prev] | [next] | [standalone]


#1222957

FromNamhyung Kim <namhyung@kernel.org>
Date2015-09-11 18:40 +0200
Message-ID<q7zwJ-78E-5@gated-at.bofh.it>
In reply to#1221996
On Thu, Sep 10, 2015 at 08:10:16AM +0000, 平松雅巳 / HIRAMATU,MASAMI wrote:
> Hi Namhyung,
> 
> From: Namhyung Kim [mailto:namhyung@gmail.com] On Behalf Of Namhyung Kim
> >
> >Hi Masami,
> >
> >On Thu, Sep 10, 2015 at 05:00:07AM +0000, 平松雅巳 / HIRAMATU,MASAMI wrote:
> >> >From: Namhyung Kim [mailto:namhyung@gmail.com] On Behalf Of Namhyung Kim
> >> >The del_perf_probe_events() uses strfilter, but I think it can be
> >> >problematic if other instances or users are using similar events at
> >> >the same time.
> >>
> >> Yeah, since perf probe doesn't lock the ftrace, there should be a
> >> timing bug, but it can be fixed easily by ignoring -ENOENT. :)
> >
> >By ignoring -ENOENT?  Are you saying that there's a race between two
> >deleters?  Yes, of course, but I think that the bug will hit an adder
> >and a deleter especially if automatic probing is used (by eBPF and/or
> >SDT recording).
> 
> So, I don't think we need the automatic event removing. Instead, I'd like to
> suggest to keep it on the list.

But why?  Do you want reuse the probes for next record session?

I think if something is generated automatically, it should be removed
automatically..

Thanks,
Namhyung
--
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/

[toc] | [prev] | [next] | [standalone]


#1220877 — [tip:perf/core] perf probe: Split add_perf_probe_events()

Fromtip-bot for Namhyung Kim <tipbot@zytor.com>
Date2015-09-08 16:40 +0200
Subject[tip:perf/core] perf probe: Split add_perf_probe_events()
Message-ID<q6se0-71F-61@gated-at.bofh.it>
In reply to#1218875
Commit-ID:  844dffa598b55fca6a83a856214fc0cfc3da24e5
Gitweb:     http://git.kernel.org/tip/844dffa598b55fca6a83a856214fc0cfc3da24e5
Author:     Namhyung Kim <namhyung@kernel.org>
AuthorDate: Fri, 4 Sep 2015 21:15:59 +0900
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
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 <namhyung@kernel.org>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
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 <acme@redhat.com>
---
 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;
 }
--
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/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web