Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1215691 > unrolled thread
| Started by | Wang Nan <wangnan0@huawei.com> |
|---|---|
| First post | 2015-08-29 06:30 +0200 |
| Last post | 2015-09-04 03:40 +0200 |
| Articles | 8 — 5 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH 14/31] perf tools: Suppress probing messages when probing by BPF loading Wang Nan <wangnan0@huawei.com> - 2015-08-29 06:30 +0200
Re: [PATCH 14/31] perf tools: Suppress probing messages when probing by BPF loading Namhyung Kim <namhyung@kernel.org> - 2015-09-03 02:40 +0200
RE: Re: [PATCH 14/31] perf tools: Suppress probing messages when probing by BPF loading 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> - 2015-09-03 04:50 +0200
[PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> - 2015-09-03 14:20 +0200
RE: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> - 2015-09-03 14:20 +0200
Re: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe Namhyung Kim <namhyung@kernel.org> - 2015-09-03 19:30 +0200
Re: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-09-03 22:30 +0200
RE: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> - 2015-09-04 03:40 +0200
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-08-29 06:30 +0200 |
| Subject | [PATCH 14/31] perf tools: Suppress probing messages when probing by BPF loading |
| Message-ID | <q2FWa-7Rj-25@gated-at.bofh.it> |
This patch suppresses message output by add_perf_probe_events() and
del_perf_probe_events() if they are triggered by BPF loading. Before
this patch, when using 'perf record' with BPF object/source as event
selector, following message will be output:
Added new event:
perf_bpf_probe:lock_page_ret (on __lock_page%return)
You can now use it in all perf tools, such as:
perf record -e perf_bpf_probe:lock_page_ret -aR sleep 1
...
Removed event: perf_bpf_probe:lock_page_ret
Which is misleading, especially 'use it in all perf tools' because they
will be removed after 'pref record' exit.
In this patch, a 'silent' field is appended into probe_conf to control
output. bpf__{,un}probe() set it to true when calling
{add,del}_perf_probe_events().
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kaixu Xia <xiakaixu@huawei.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/n/1440151770-129878-12-git-send-email-wangnan0@huawei.com
---
tools/perf/util/bpf-loader.c | 6 ++++++
tools/perf/util/probe-event.c | 17 ++++++++++++-----
tools/perf/util/probe-event.h | 1 +
tools/perf/util/probe-file.c | 5 ++++-
4 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
index c3bc0a8..77eeb99 100644
--- a/tools/perf/util/bpf-loader.c
+++ b/tools/perf/util/bpf-loader.c
@@ -188,6 +188,7 @@ static bool is_probed;
int bpf__unprobe(void)
{
struct strfilter *delfilter;
+ bool old_silent = probe_conf.silent;
int ret;
if (!is_probed)
@@ -199,7 +200,9 @@ int bpf__unprobe(void)
return -ENOMEM;
}
+ probe_conf.silent = true;
ret = del_perf_probe_events(delfilter);
+ probe_conf.silent = old_silent;
strfilter__delete(delfilter);
if (ret < 0 && is_probed)
pr_debug("Error: failed to delete events: %s\n",
@@ -215,6 +218,7 @@ int bpf__probe(void)
struct bpf_object *obj, *tmp;
struct bpf_program *prog;
struct perf_probe_event *pevs;
+ bool old_silent = probe_conf.silent;
pevs = calloc(MAX_PROBES, sizeof(pevs[0]));
if (!pevs)
@@ -235,9 +239,11 @@ int bpf__probe(void)
}
}
+ probe_conf.silent = true;
probe_conf.max_probes = MAX_PROBES;
/* Let add_perf_probe_events generates probe_trace_event (tevs) */
err = add_perf_probe_events(pevs, nr_events, false);
+ probe_conf.silent = old_silent;
/* add_perf_probe_events return negative when fail */
if (err < 0) {
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 57a7bae..e720913 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -52,7 +52,9 @@
#define PERFPROBE_GROUP "probe"
bool probe_event_dry_run; /* Dry run flag */
-struct probe_conf probe_conf;
+struct probe_conf probe_conf = {
+ .silent = false,
+};
#define semantic_error(msg ...) pr_err("Semantic error :" msg)
@@ -2192,10 +2194,12 @@ static int show_perf_probe_event(const char *group, const char *event,
ret = perf_probe_event__sprintf(group, event, pev, module, &buf);
if (ret >= 0) {
- if (use_stdout)
+ if (use_stdout && !probe_conf.silent)
printf("%s\n", buf.buf);
- else
+ else if (!probe_conf.silent)
pr_info("%s\n", buf.buf);
+ else
+ pr_debug("%s\n", buf.buf);
}
strbuf_release(&buf);
@@ -2418,7 +2422,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
}
ret = 0;
- pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
+ if (!probe_conf.silent)
+ pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
+ else
+ pr_debug("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
for (i = 0; i < ntevs; i++) {
tev = &tevs[i];
/* Skip if the symbol is out of .text or blacklisted */
@@ -2454,7 +2461,7 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
warn_uprobe_event_compat(tev);
/* Note that it is possible to skip all events because of blacklist */
- if (ret >= 0 && event) {
+ if (ret >= 0 && event && !probe_conf.silent) {
/* Show how to use the event. */
pr_info("\nYou can now use it in all perf tools, such as:\n\n");
pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 915f0d8..3ab9c3e 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -13,6 +13,7 @@ struct probe_conf {
bool force_add;
bool no_inlines;
int max_probes;
+ bool silent;
};
extern struct probe_conf probe_conf;
extern bool probe_event_dry_run;
diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
index bbb2437..db7bd4c 100644
--- a/tools/perf/util/probe-file.c
+++ b/tools/perf/util/probe-file.c
@@ -267,7 +267,10 @@ static int __del_trace_probe_event(int fd, struct str_node *ent)
goto error;
}
- pr_info("Removed event: %s\n", ent->s);
+ if (!probe_conf.silent)
+ pr_info("Removed event: %s\n", ent->s);
+ else
+ pr_debug("Removed event: %s\n", ent->s);
return 0;
error:
pr_warning("Failed to delete event: %s\n",
--
2.1.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-09-03 02:40 +0200 |
| Subject | Re: [PATCH 14/31] perf tools: Suppress probing messages when probing by BPF loading |
| Message-ID | <q4qJk-4mi-5@gated-at.bofh.it> |
| In reply to | #1215691 |
On Sat, Aug 29, 2015 at 04:21:48AM +0000, Wang Nan wrote:
> This patch suppresses message output by add_perf_probe_events() and
> del_perf_probe_events() if they are triggered by BPF loading. Before
> this patch, when using 'perf record' with BPF object/source as event
> selector, following message will be output:
>
> Added new event:
> perf_bpf_probe:lock_page_ret (on __lock_page%return)
> You can now use it in all perf tools, such as:
> perf record -e perf_bpf_probe:lock_page_ret -aR sleep 1
> ...
> Removed event: perf_bpf_probe:lock_page_ret
>
> Which is misleading, especially 'use it in all perf tools' because they
> will be removed after 'pref record' exit.
>
> In this patch, a 'silent' field is appended into probe_conf to control
> output. bpf__{,un}probe() set it to true when calling
> {add,del}_perf_probe_events().
I think that printing those messages should be done in cmd_probe()
rather than add/del_perf_probe_events()..
Thanks,
Namhyung
>
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Alexei Starovoitov <ast@plumgrid.com>
> Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: David Ahern <dsahern@gmail.com>
> Cc: He Kuang <hekuang@huawei.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: Kaixu Xia <xiakaixu@huawei.com>
> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Zefan Li <lizefan@huawei.com>
> Cc: pi3orama@163.com
> Link: http://lkml.kernel.org/n/1440151770-129878-12-git-send-email-wangnan0@huawei.com
> ---
> tools/perf/util/bpf-loader.c | 6 ++++++
> tools/perf/util/probe-event.c | 17 ++++++++++++-----
> tools/perf/util/probe-event.h | 1 +
> tools/perf/util/probe-file.c | 5 ++++-
> 4 files changed, 23 insertions(+), 6 deletions(-)
>
> diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
> index c3bc0a8..77eeb99 100644
> --- a/tools/perf/util/bpf-loader.c
> +++ b/tools/perf/util/bpf-loader.c
> @@ -188,6 +188,7 @@ static bool is_probed;
> int bpf__unprobe(void)
> {
> struct strfilter *delfilter;
> + bool old_silent = probe_conf.silent;
> int ret;
>
> if (!is_probed)
> @@ -199,7 +200,9 @@ int bpf__unprobe(void)
> return -ENOMEM;
> }
>
> + probe_conf.silent = true;
> ret = del_perf_probe_events(delfilter);
> + probe_conf.silent = old_silent;
> strfilter__delete(delfilter);
> if (ret < 0 && is_probed)
> pr_debug("Error: failed to delete events: %s\n",
> @@ -215,6 +218,7 @@ int bpf__probe(void)
> struct bpf_object *obj, *tmp;
> struct bpf_program *prog;
> struct perf_probe_event *pevs;
> + bool old_silent = probe_conf.silent;
>
> pevs = calloc(MAX_PROBES, sizeof(pevs[0]));
> if (!pevs)
> @@ -235,9 +239,11 @@ int bpf__probe(void)
> }
> }
>
> + probe_conf.silent = true;
> probe_conf.max_probes = MAX_PROBES;
> /* Let add_perf_probe_events generates probe_trace_event (tevs) */
> err = add_perf_probe_events(pevs, nr_events, false);
> + probe_conf.silent = old_silent;
>
> /* add_perf_probe_events return negative when fail */
> if (err < 0) {
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 57a7bae..e720913 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -52,7 +52,9 @@
> #define PERFPROBE_GROUP "probe"
>
> bool probe_event_dry_run; /* Dry run flag */
> -struct probe_conf probe_conf;
> +struct probe_conf probe_conf = {
> + .silent = false,
> +};
>
> #define semantic_error(msg ...) pr_err("Semantic error :" msg)
>
> @@ -2192,10 +2194,12 @@ static int show_perf_probe_event(const char *group, const char *event,
>
> ret = perf_probe_event__sprintf(group, event, pev, module, &buf);
> if (ret >= 0) {
> - if (use_stdout)
> + if (use_stdout && !probe_conf.silent)
> printf("%s\n", buf.buf);
> - else
> + else if (!probe_conf.silent)
> pr_info("%s\n", buf.buf);
> + else
> + pr_debug("%s\n", buf.buf);
> }
> strbuf_release(&buf);
>
> @@ -2418,7 +2422,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> }
>
> ret = 0;
> - pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
> + if (!probe_conf.silent)
> + pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
> + else
> + pr_debug("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
> for (i = 0; i < ntevs; i++) {
> tev = &tevs[i];
> /* Skip if the symbol is out of .text or blacklisted */
> @@ -2454,7 +2461,7 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> warn_uprobe_event_compat(tev);
>
> /* Note that it is possible to skip all events because of blacklist */
> - if (ret >= 0 && event) {
> + if (ret >= 0 && event && !probe_conf.silent) {
> /* Show how to use the event. */
> pr_info("\nYou can now use it in all perf tools, such as:\n\n");
> pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
> diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
> index 915f0d8..3ab9c3e 100644
> --- a/tools/perf/util/probe-event.h
> +++ b/tools/perf/util/probe-event.h
> @@ -13,6 +13,7 @@ struct probe_conf {
> bool force_add;
> bool no_inlines;
> int max_probes;
> + bool silent;
> };
> extern struct probe_conf probe_conf;
> extern bool probe_event_dry_run;
> diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
> index bbb2437..db7bd4c 100644
> --- a/tools/perf/util/probe-file.c
> +++ b/tools/perf/util/probe-file.c
> @@ -267,7 +267,10 @@ static int __del_trace_probe_event(int fd, struct str_node *ent)
> goto error;
> }
>
> - pr_info("Removed event: %s\n", ent->s);
> + if (!probe_conf.silent)
> + pr_info("Removed event: %s\n", ent->s);
> + else
> + pr_debug("Removed event: %s\n", ent->s);
> return 0;
> error:
> pr_warning("Failed to delete event: %s\n",
> --
> 2.1.0
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-09-03 04:50 +0200 |
| Subject | RE: Re: [PATCH 14/31] perf tools: Suppress probing messages when probing by BPF loading |
| Message-ID | <q4sL7-7ii-3@gated-at.bofh.it> |
| In reply to | #1217967 |
PiBGcm9tOiBOYW1oeXVuZyBLaW0gW21haWx0bzpuYW1oeXVuZ0BnbWFpbC5jb21dIE9uIEJlaGFs ZiBPZiBOYW1oeXVuZyBLaW0NCj4gDQo+IE9uIFNhdCwgQXVnIDI5LCAyMDE1IGF0IDA0OjIxOjQ4 QU0gKzAwMDAsIFdhbmcgTmFuIHdyb3RlOg0KPiA+IFRoaXMgcGF0Y2ggc3VwcHJlc3NlcyBtZXNz YWdlIG91dHB1dCBieSBhZGRfcGVyZl9wcm9iZV9ldmVudHMoKSBhbmQNCj4gPiBkZWxfcGVyZl9w cm9iZV9ldmVudHMoKSBpZiB0aGV5IGFyZSB0cmlnZ2VyZWQgYnkgQlBGIGxvYWRpbmcuIEJlZm9y ZQ0KPiA+IHRoaXMgcGF0Y2gsIHdoZW4gdXNpbmcgJ3BlcmYgcmVjb3JkJyB3aXRoIEJQRiBvYmpl Y3Qvc291cmNlIGFzIGV2ZW50DQo+ID4gc2VsZWN0b3IsIGZvbGxvd2luZyBtZXNzYWdlIHdpbGwg YmUgb3V0cHV0Og0KPiA+DQo+ID4gICAgICBBZGRlZCBuZXcgZXZlbnQ6DQo+ID4gICAgICAgICAg ICBwZXJmX2JwZl9wcm9iZTpsb2NrX3BhZ2VfcmV0IChvbiBfX2xvY2tfcGFnZSVyZXR1cm4pDQo+ ID4gICAgICAgICBZb3UgY2FuIG5vdyB1c2UgaXQgaW4gYWxsIHBlcmYgdG9vbHMsIHN1Y2ggYXM6 DQo+ID4gCSAgICAgICAgICAgIHBlcmYgcmVjb3JkIC1lIHBlcmZfYnBmX3Byb2JlOmxvY2tfcGFn ZV9yZXQgLWFSIHNsZWVwIDENCj4gPiAgICAgIC4uLg0KPiA+ICAgICAgUmVtb3ZlZCBldmVudDog cGVyZl9icGZfcHJvYmU6bG9ja19wYWdlX3JldA0KPiA+DQo+ID4gV2hpY2ggaXMgbWlzbGVhZGlu ZywgZXNwZWNpYWxseSAndXNlIGl0IGluIGFsbCBwZXJmIHRvb2xzJyBiZWNhdXNlIHRoZXkNCj4g PiB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgJ3ByZWYgcmVjb3JkJyBleGl0Lg0KPiA+DQo+ID4gSW4g dGhpcyBwYXRjaCwgYSAnc2lsZW50JyBmaWVsZCBpcyBhcHBlbmRlZCBpbnRvIHByb2JlX2NvbmYg dG8gY29udHJvbA0KPiA+IG91dHB1dC4gYnBmX197LHVufXByb2JlKCkgc2V0IGl0IHRvIHRydWUg d2hlbiBjYWxsaW5nDQo+ID4ge2FkZCxkZWx9X3BlcmZfcHJvYmVfZXZlbnRzKCkuDQo+IA0KPiBJ IHRoaW5rIHRoYXQgcHJpbnRpbmcgdGhvc2UgbWVzc2FnZXMgc2hvdWxkIGJlIGRvbmUgaW4gY21k X3Byb2JlKCkNCj4gcmF0aGVyIHRoYW4gYWRkL2RlbF9wZXJmX3Byb2JlX2V2ZW50cygpLi4NCg0K V2VsbC4uLiB0cnkgdG8gY2xlYW51cCB0aGUgbWVzc2FnZXMuIA0KDQpUaGFua3MhDQoNCj4gDQoN 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]
| From | Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-09-03 14:20 +0200 |
| Subject | [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe |
| Message-ID | <q4BEK-3hX-21@gated-at.bofh.it> |
| In reply to | #1217967 |
Output the normal result of adding/deleting probe in buildin-probe
instead of showing it by add/del_perf_probe_events.
All the result string is stored into "result" strbuf parameter.
If you want to ignore the result string, pass a NULL to the "result".
Note that all warning/debug strings are still in the
add/del_perf_probe_events.
Suggested-by: Namhyung Kim <namhyung@gmail.com>
Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
---
tools/perf/builtin-probe.c | 9 +++++++--
tools/perf/util/probe-event.c | 33 ++++++++++++++++++++-------------
tools/perf/util/probe-event.h | 6 ++++--
tools/perf/util/probe-file.c | 5 +++--
tools/perf/util/probe-file.h | 4 +++-
5 files changed, 37 insertions(+), 20 deletions(-)
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index b81cec3..d11ad21 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -402,6 +402,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
"Enable kernel symbol demangling"),
OPT_END()
};
+ struct strbuf buf = STRBUF_INIT;
int ret;
set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE);
@@ -483,7 +484,9 @@ __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 = del_perf_probe_events(params.filter, &buf);
+ /* Even if failed, we should show the result first */
+ pr_info("%s", buf.buf);
if (ret < 0) {
pr_err_with_code(" Error: Failed to delete events.", ret);
return ret;
@@ -496,7 +499,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
usage_with_options(probe_usage, options);
}
- ret = add_perf_probe_events(params.events, params.nevents);
+ ret = add_perf_probe_events(params.events, params.nevents, &buf);
+ /* Even if failed, we should show the result first */
+ pr_info("%s", buf.buf);
if (ret < 0) {
pr_err_with_code(" Error: Failed to add events.", ret);
return ret;
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index eb5f18b..1a3ed7c 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2395,7 +2395,8 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
static int __add_probe_trace_events(struct perf_probe_event *pev,
struct probe_trace_event *tevs,
- int ntevs, bool allow_suffix)
+ int ntevs, bool allow_suffix,
+ struct strbuf *buf)
{
int i, fd, ret;
struct probe_trace_event *tev = NULL;
@@ -2415,7 +2416,9 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
}
ret = 0;
- pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
+ if (buf)
+ strbuf_addf(buf, "Added new event%s\n",
+ (ntevs > 1) ? "s:" : ":");
for (i = 0; i < ntevs; i++) {
tev = &tevs[i];
/* Skip if the symbol is out of .text or blacklisted */
@@ -2432,9 +2435,12 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
if (ret < 0)
break;
- /* We use tev's name for showing new events */
- show_perf_probe_event(tev->group, tev->event, pev,
- tev->point.module, false);
+ if (buf) {
+ /* We use tev's name for showing new events */
+ perf_probe_event__sprintf(tev->group, tev->event,
+ pev, tev->point.module, buf);
+ strbuf_addch(buf, '\n');
+ }
/* Save the last valid name */
event = tev->event;
group = tev->group;
@@ -2451,10 +2457,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
warn_uprobe_event_compat(tev);
/* Note that it is possible to skip all events because of blacklist */
- if (ret >= 0 && event) {
+ if (ret >= 0 && event && buf) {
/* Show how to use the event. */
- pr_info("\nYou can now use it in all perf tools, such as:\n\n");
- pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
+ strbuf_addf(buf, "\nYou can now use it in all perf tools, such as:\n\n");
+ strbuf_addf(buf, "\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
}
strlist__delete(namelist);
@@ -2765,7 +2771,8 @@ struct __event_package {
int ntevs;
};
-int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
+int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
+ struct strbuf *result)
{
int i, j, ret;
struct __event_package *pkgs;
@@ -2802,7 +2809,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
for (i = 0; i < npevs; i++) {
ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs,
pkgs[i].ntevs,
- probe_conf.force_add);
+ probe_conf.force_add, result);
if (ret < 0)
break;
}
@@ -2819,7 +2826,7 @@ end:
return ret;
}
-int del_perf_probe_events(struct strfilter *filter)
+int del_perf_probe_events(struct strfilter *filter, struct strbuf *result)
{
int ret, ret2, ufd = -1, kfd = -1;
char *str = strfilter__string(filter);
@@ -2834,11 +2841,11 @@ int del_perf_probe_events(struct strfilter *filter)
if (ret < 0)
goto out;
- ret = probe_file__del_events(kfd, filter);
+ ret = probe_file__del_events(kfd, filter, result);
if (ret < 0 && ret != -ENOENT)
goto error;
- ret2 = probe_file__del_events(ufd, filter);
+ ret2 = probe_file__del_events(ufd, filter, result);
if (ret2 < 0 && ret2 != -ENOENT) {
ret = ret2;
goto error;
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 6e7ec68..9855dbf 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -137,8 +137,10 @@ extern void line_range__clear(struct line_range *lr);
/* Initialize line range */
extern int line_range__init(struct line_range *lr);
-extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
-extern int del_perf_probe_events(struct strfilter *filter);
+extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
+ struct strbuf *result);
+extern int del_perf_probe_events(struct strfilter *filter,
+ struct strbuf *result);
extern int show_perf_probe_events(struct strfilter *filter);
extern int show_line_range(struct line_range *lr, const char *module,
bool user);
diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
index bbb2437..e22fa12 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,7 +274,7 @@ error:
return ret;
}
-int probe_file__del_events(int fd, struct strfilter *filter)
+int probe_file__del_events(int fd, struct strfilter *filter, struct strbuf *buf)
{
struct strlist *namelist;
struct str_node *ent;
@@ -293,6 +292,8 @@ int probe_file__del_events(int fd, struct strfilter *filter)
ret = __del_trace_probe_event(fd, ent);
if (ret < 0)
break;
+ if (buf)
+ strbuf_addf(buf, "Removed event: %s\n", ent->s);
}
}
strlist__delete(namelist);
diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h
index ada94a2..ee89ef0 100644
--- a/tools/perf/util/probe-file.h
+++ b/tools/perf/util/probe-file.h
@@ -1,6 +1,7 @@
#ifndef __PROBE_FILE_H
#define __PROBE_FILE_H
+#include "strbuf.h"
#include "strlist.h"
#include "strfilter.h"
#include "probe-event.h"
@@ -13,6 +14,7 @@ int probe_file__open_both(int *kfd, int *ufd, int flag);
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__del_events(int fd, struct strfilter *filter,
+ struct strbuf *buf);
#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]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-09-03 14:20 +0200 |
| Subject | RE: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe |
| Message-ID | <q4BEL-3hX-39@gated-at.bofh.it> |
| In reply to | #1218203 |
SGkgTmFtaHl1bmcsDQoNClNvLCBJIGhvcGUgdGhpcyB3b3VsZCBiZSB3aGF0IHlvdSd2ZSBzdWdn ZXN0ZWQuDQoNClRoYW5rIHlvdSwNCg0KLS0gDQpNYXNhbWkgSElSQU1BVFNVDQpMaW51eCBUZWNo bm9sb2d5IFJlc2VhcmNoIENlbnRlciwgU3lzdGVtIFByb2R1Y3Rpdml0eSBSZXNlYXJjaCBEZXB0 Lg0KQ2VudGVyIGZvciBUZWNobm9sb2d5IElubm92YXRpb24gLSBTeXN0ZW1zIEVuZ2luZWVyaW5n DQpIaXRhY2hpLCBMdGQuLCBSZXNlYXJjaCAmIERldmVsb3BtZW50IEdyb3VwDQpFLW1haWw6IG1h c2FtaS5oaXJhbWF0c3UucHRAaGl0YWNoaS5jb20NCg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2Fn ZS0tLS0tDQo+IEZyb206IE1hc2FtaSBIaXJhbWF0c3UgW21haWx0bzptYXNhbWkuaGlyYW1hdHN1 LnB0QGhpdGFjaGkuY29tXQ0KPiBTZW50OiBUaHVyc2RheSwgU2VwdGVtYmVyIDAzLCAyMDE1IDk6 MTEgUE0NCj4gVG86IE5hbWh5dW5nIEtpbTsgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvDQo+IENj OiBXYW5nIE5hbjsgS2FpeHUgWGlhOyBQZXRlciBaaWpsc3RyYTsgRGFuaWVsIEJvcmttYW5uOyBs aW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnOyBIZSBLdWFuZzsgbGl6ZWZhbkBodWF3ZWkuY29t Ow0KPiBKaXJpIE9sc2E7IERhdmlkIEFoZXJuOyBCcmVuZGFuIEdyZWdnOyBtaW5nb0BrZXJuZWwu b3JnOyBhc3RAcGx1bWdyaWQuY29tDQo+IFN1YmplY3Q6IFtQQVRDSCBwZXJmL2NvcmUgXSBwZXJm LXByb2JlOiBPdXRwdXQgdGhlIHJlc3VsdCBvZiBhZGRpbmcvZGVsZXRpbmcgcHJvYmUgaW4gYnVp bGRpbi1wcm9iZQ0KPiANCj4gT3V0cHV0IHRoZSBub3JtYWwgcmVzdWx0IG9mIGFkZGluZy9kZWxl dGluZyBwcm9iZSBpbiBidWlsZGluLXByb2JlDQo+IGluc3RlYWQgb2Ygc2hvd2luZyBpdCBieSBh ZGQvZGVsX3BlcmZfcHJvYmVfZXZlbnRzLg0KPiBBbGwgdGhlIHJlc3VsdCBzdHJpbmcgaXMgc3Rv cmVkIGludG8gInJlc3VsdCIgc3RyYnVmIHBhcmFtZXRlci4NCj4gSWYgeW91IHdhbnQgdG8gaWdu b3JlIHRoZSByZXN1bHQgc3RyaW5nLCBwYXNzIGEgTlVMTCB0byB0aGUgInJlc3VsdCIuDQo+IE5v dGUgdGhhdCBhbGwgd2FybmluZy9kZWJ1ZyBzdHJpbmdzIGFyZSBzdGlsbCBpbiB0aGUNCj4gYWRk L2RlbF9wZXJmX3Byb2JlX2V2ZW50cy4NCj4gDQo+IFN1Z2dlc3RlZC1ieTogTmFtaHl1bmcgS2lt IDxuYW1oeXVuZ0BnbWFpbC5jb20+DQo+IFNpZ25lZC1vZmYtYnk6IE1hc2FtaSBIaXJhbWF0c3Ug PG1hc2FtaS5oaXJhbWF0c3UucHRAaGl0YWNoaS5jb20+DQo+IC0tLQ0KPiAgdG9vbHMvcGVyZi9i dWlsdGluLXByb2JlLmMgICAgfCAgICA5ICsrKysrKystLQ0KPiAgdG9vbHMvcGVyZi91dGlsL3By b2JlLWV2ZW50LmMgfCAgIDMzICsrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLQ0KPiAg dG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmggfCAgICA2ICsrKystLQ0KPiAgdG9vbHMvcGVy Zi91dGlsL3Byb2JlLWZpbGUuYyAgfCAgICA1ICsrKy0tDQo+ICB0b29scy9wZXJmL3V0aWwvcHJv YmUtZmlsZS5oICB8ICAgIDQgKysrLQ0KPiAgNSBmaWxlcyBjaGFuZ2VkLCAzNyBpbnNlcnRpb25z KCspLCAyMCBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0 aW4tcHJvYmUuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jDQo+IGluZGV4IGI4MWNlYzMu LmQxMWFkMjEgMTAwNjQ0DQo+IC0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jDQo+ICsr KyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jDQo+IEBAIC00MDIsNiArNDAyLDcgQEAgX19j bWRfcHJvYmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgg X19tYXliZV91bnVzZWQpDQo+ICAJCSAgICAiRW5hYmxlIGtlcm5lbCBzeW1ib2wgZGVtYW5nbGlu ZyIpLA0KPiAgCU9QVF9FTkQoKQ0KPiAgCX07DQo+ICsJc3RydWN0IHN0cmJ1ZiBidWYgPSBTVFJC VUZfSU5JVDsNCj4gIAlpbnQgcmV0Ow0KPiANCj4gIAlzZXRfb3B0aW9uX2ZsYWcob3B0aW9ucywg J2EnLCAiYWRkIiwgUEFSU0VfT1BUX0VYQ0xVU0lWRSk7DQo+IEBAIC00ODMsNyArNDg0LDkgQEAg X19jbWRfcHJvYmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVm aXggX19tYXliZV91bnVzZWQpDQo+ICAJCXJldHVybiByZXQ7DQo+ICAjZW5kaWYNCj4gIAljYXNl ICdkJzoNCj4gLQkJcmV0ID0gZGVsX3BlcmZfcHJvYmVfZXZlbnRzKHBhcmFtcy5maWx0ZXIpOw0K PiArCQlyZXQgPSBkZWxfcGVyZl9wcm9iZV9ldmVudHMocGFyYW1zLmZpbHRlciwgJmJ1Zik7DQo+ ICsJCS8qIEV2ZW4gaWYgZmFpbGVkLCB3ZSBzaG91bGQgc2hvdyB0aGUgcmVzdWx0IGZpcnN0ICov DQo+ICsJCXByX2luZm8oIiVzIiwgYnVmLmJ1Zik7DQo+ICAJCWlmIChyZXQgPCAwKSB7DQo+ICAJ CQlwcl9lcnJfd2l0aF9jb2RlKCIgIEVycm9yOiBGYWlsZWQgdG8gZGVsZXRlIGV2ZW50cy4iLCBy ZXQpOw0KPiAgCQkJcmV0dXJuIHJldDsNCj4gQEAgLTQ5Niw3ICs0OTksOSBAQCBfX2NtZF9wcm9i ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX21heWJl X3VudXNlZCkNCj4gIAkJCXVzYWdlX3dpdGhfb3B0aW9ucyhwcm9iZV91c2FnZSwgb3B0aW9ucyk7 DQo+ICAJCX0NCj4gDQo+IC0JCXJldCA9IGFkZF9wZXJmX3Byb2JlX2V2ZW50cyhwYXJhbXMuZXZl bnRzLCBwYXJhbXMubmV2ZW50cyk7DQo+ICsJCXJldCA9IGFkZF9wZXJmX3Byb2JlX2V2ZW50cyhw YXJhbXMuZXZlbnRzLCBwYXJhbXMubmV2ZW50cywgJmJ1Zik7DQo+ICsJCS8qIEV2ZW4gaWYgZmFp bGVkLCB3ZSBzaG91bGQgc2hvdyB0aGUgcmVzdWx0IGZpcnN0ICovDQo+ICsJCXByX2luZm8oIiVz IiwgYnVmLmJ1Zik7DQo+ICAJCWlmIChyZXQgPCAwKSB7DQo+ICAJCQlwcl9lcnJfd2l0aF9jb2Rl KCIgIEVycm9yOiBGYWlsZWQgdG8gYWRkIGV2ZW50cy4iLCByZXQpOw0KPiAgCQkJcmV0dXJuIHJl dDsNCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jIGIvdG9vbHMv cGVyZi91dGlsL3Byb2JlLWV2ZW50LmMNCj4gaW5kZXggZWI1ZjE4Yi4uMWEzZWQ3YyAxMDA2NDQN Cj4gLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMNCj4gKysrIGIvdG9vbHMvcGVy Zi91dGlsL3Byb2JlLWV2ZW50LmMNCj4gQEAgLTIzOTUsNyArMjM5NSw4IEBAIHN0YXRpYyBpbnQg cHJvYmVfdHJhY2VfZXZlbnRfX3NldF9uYW1lKHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2 LA0KPiANCj4gIHN0YXRpYyBpbnQgX19hZGRfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJm X3Byb2JlX2V2ZW50ICpwZXYsDQo+ICAJCQkJICAgICBzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQg KnRldnMsDQo+IC0JCQkJICAgICBpbnQgbnRldnMsIGJvb2wgYWxsb3dfc3VmZml4KQ0KPiArCQkJ CSAgICAgaW50IG50ZXZzLCBib29sIGFsbG93X3N1ZmZpeCwNCj4gKwkJCQkgICAgIHN0cnVjdCBz dHJidWYgKmJ1ZikNCj4gIHsNCj4gIAlpbnQgaSwgZmQsIHJldDsNCj4gIAlzdHJ1Y3QgcHJvYmVf dHJhY2VfZXZlbnQgKnRldiA9IE5VTEw7DQo+IEBAIC0yNDE1LDcgKzI0MTYsOSBAQCBzdGF0aWMg aW50IF9fYWRkX3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2 LA0KPiAgCX0NCj4gDQo+ICAJcmV0ID0gMDsNCj4gLQlwcl9pbmZvKCJBZGRlZCBuZXcgZXZlbnQl c1xuIiwgKG50ZXZzID4gMSkgPyAiczoiIDogIjoiKTsNCj4gKwlpZiAoYnVmKQ0KPiArCQlzdHJi dWZfYWRkZihidWYsICJBZGRlZCBuZXcgZXZlbnQlc1xuIiwNCj4gKwkJCSAgICAobnRldnMgPiAx KSA/ICJzOiIgOiAiOiIpOw0KPiAgCWZvciAoaSA9IDA7IGkgPCBudGV2czsgaSsrKSB7DQo+ICAJ CXRldiA9ICZ0ZXZzW2ldOw0KPiAgCQkvKiBTa2lwIGlmIHRoZSBzeW1ib2wgaXMgb3V0IG9mIC50 ZXh0IG9yIGJsYWNrbGlzdGVkICovDQo+IEBAIC0yNDMyLDkgKzI0MzUsMTIgQEAgc3RhdGljIGlu dCBfX2FkZF9wcm9iZV90cmFjZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwN Cj4gIAkJaWYgKHJldCA8IDApDQo+ICAJCQlicmVhazsNCj4gDQo+IC0JCS8qIFdlIHVzZSB0ZXYn cyBuYW1lIGZvciBzaG93aW5nIG5ldyBldmVudHMgKi8NCj4gLQkJc2hvd19wZXJmX3Byb2JlX2V2 ZW50KHRldi0+Z3JvdXAsIHRldi0+ZXZlbnQsIHBldiwNCj4gLQkJCQkgICAgICB0ZXYtPnBvaW50 Lm1vZHVsZSwgZmFsc2UpOw0KPiArCQlpZiAoYnVmKSB7DQo+ICsJCQkvKiBXZSB1c2UgdGV2J3Mg bmFtZSBmb3Igc2hvd2luZyBuZXcgZXZlbnRzICovDQo+ICsJCQlwZXJmX3Byb2JlX2V2ZW50X19z cHJpbnRmKHRldi0+Z3JvdXAsIHRldi0+ZXZlbnQsDQo+ICsJCQkJCQkgIHBldiwgdGV2LT5wb2lu dC5tb2R1bGUsIGJ1Zik7DQo+ICsJCQlzdHJidWZfYWRkY2goYnVmLCAnXG4nKTsNCj4gKwkJfQ0K PiAgCQkvKiBTYXZlIHRoZSBsYXN0IHZhbGlkIG5hbWUgKi8NCj4gIAkJZXZlbnQgPSB0ZXYtPmV2 ZW50Ow0KPiAgCQlncm91cCA9IHRldi0+Z3JvdXA7DQo+IEBAIC0yNDUxLDEwICsyNDU3LDEwIEBA IHN0YXRpYyBpbnQgX19hZGRfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2 ZW50ICpwZXYsDQo+ICAJCXdhcm5fdXByb2JlX2V2ZW50X2NvbXBhdCh0ZXYpOw0KPiANCj4gIAkv KiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gc2tpcCBhbGwgZXZlbnRzIGJlY2F1c2Ugb2Yg YmxhY2tsaXN0ICovDQo+IC0JaWYgKHJldCA+PSAwICYmIGV2ZW50KSB7DQo+ICsJaWYgKHJldCA+ PSAwICYmIGV2ZW50ICYmIGJ1Zikgew0KPiAgCQkvKiBTaG93IGhvdyB0byB1c2UgdGhlIGV2ZW50 LiAqLw0KPiAtCQlwcl9pbmZvKCJcbllvdSBjYW4gbm93IHVzZSBpdCBpbiBhbGwgcGVyZiB0b29s cywgc3VjaCBhczpcblxuIik7DQo+IC0JCXByX2luZm8oIlx0cGVyZiByZWNvcmQgLWUgJXM6JXMg LWFSIHNsZWVwIDFcblxuIiwgZ3JvdXAsIGV2ZW50KTsNCj4gKwkJc3RyYnVmX2FkZGYoYnVmLCAi XG5Zb3UgY2FuIG5vdyB1c2UgaXQgaW4gYWxsIHBlcmYgdG9vbHMsIHN1Y2ggYXM6XG5cbiIpOw0K PiArCQlzdHJidWZfYWRkZihidWYsICJcdHBlcmYgcmVjb3JkIC1lICVzOiVzIC1hUiBzbGVlcCAx XG5cbiIsIGdyb3VwLCBldmVudCk7DQo+ICAJfQ0KPiANCj4gIAlzdHJsaXN0X19kZWxldGUobmFt ZWxpc3QpOw0KPiBAQCAtMjc2NSw3ICsyNzcxLDggQEAgc3RydWN0IF9fZXZlbnRfcGFja2FnZSB7 DQo+ICAJaW50CQkJCW50ZXZzOw0KPiAgfTsNCj4gDQo+IC1pbnQgYWRkX3BlcmZfcHJvYmVfZXZl bnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpDQo+ICtpbnQgYWRk X3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBl dnMsDQo+ICsJCQkgIHN0cnVjdCBzdHJidWYgKnJlc3VsdCkNCj4gIHsNCj4gIAlpbnQgaSwgaiwg cmV0Ow0KPiAgCXN0cnVjdCBfX2V2ZW50X3BhY2thZ2UgKnBrZ3M7DQo+IEBAIC0yODAyLDcgKzI4 MDksNyBAQCBpbnQgYWRkX3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50 ICpwZXZzLCBpbnQgbnBldnMpDQo+ICAJZm9yIChpID0gMDsgaSA8IG5wZXZzOyBpKyspIHsNCj4g IAkJcmV0ID0gX19hZGRfcHJvYmVfdHJhY2VfZXZlbnRzKHBrZ3NbaV0ucGV2LCBwa2dzW2ldLnRl dnMsDQo+ICAJCQkJCSAgICAgICBwa2dzW2ldLm50ZXZzLA0KPiAtCQkJCQkgICAgICAgcHJvYmVf Y29uZi5mb3JjZV9hZGQpOw0KPiArCQkJCQkgICAgICAgcHJvYmVfY29uZi5mb3JjZV9hZGQsIHJl c3VsdCk7DQo+ICAJCWlmIChyZXQgPCAwKQ0KPiAgCQkJYnJlYWs7DQo+ICAJfQ0KPiBAQCAtMjgx OSw3ICsyODI2LDcgQEAgZW5kOg0KPiAgCXJldHVybiByZXQ7DQo+ICB9DQo+IA0KPiAtaW50IGRl bF9wZXJmX3Byb2JlX2V2ZW50cyhzdHJ1Y3Qgc3RyZmlsdGVyICpmaWx0ZXIpDQo+ICtpbnQgZGVs X3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBzdHJmaWx0ZXIgKmZpbHRlciwgc3RydWN0IHN0cmJ1 ZiAqcmVzdWx0KQ0KPiAgew0KPiAgCWludCByZXQsIHJldDIsIHVmZCA9IC0xLCBrZmQgPSAtMTsN Cj4gIAljaGFyICpzdHIgPSBzdHJmaWx0ZXJfX3N0cmluZyhmaWx0ZXIpOw0KPiBAQCAtMjgzNCwx MSArMjg0MSwxMSBAQCBpbnQgZGVsX3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBzdHJmaWx0ZXIg KmZpbHRlcikNCj4gIAlpZiAocmV0IDwgMCkNCj4gIAkJZ290byBvdXQ7DQo+IA0KPiAtCXJldCA9 IHByb2JlX2ZpbGVfX2RlbF9ldmVudHMoa2ZkLCBmaWx0ZXIpOw0KPiArCXJldCA9IHByb2JlX2Zp bGVfX2RlbF9ldmVudHMoa2ZkLCBmaWx0ZXIsIHJlc3VsdCk7DQo+ICAJaWYgKHJldCA8IDAgJiYg cmV0ICE9IC1FTk9FTlQpDQo+ICAJCWdvdG8gZXJyb3I7DQo+IA0KPiAtCXJldDIgPSBwcm9iZV9m aWxlX19kZWxfZXZlbnRzKHVmZCwgZmlsdGVyKTsNCj4gKwlyZXQyID0gcHJvYmVfZmlsZV9fZGVs X2V2ZW50cyh1ZmQsIGZpbHRlciwgcmVzdWx0KTsNCj4gIAlpZiAocmV0MiA8IDAgJiYgcmV0MiAh PSAtRU5PRU5UKSB7DQo+ICAJCXJldCA9IHJldDI7DQo+ICAJCWdvdG8gZXJyb3I7DQo+IGRpZmYg LS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9w cm9iZS1ldmVudC5oDQo+IGluZGV4IDZlN2VjNjguLjk4NTVkYmYgMTAwNjQ0DQo+IC0tLSBhL3Rv b2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oDQo+ICsrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9i ZS1ldmVudC5oDQo+IEBAIC0xMzcsOCArMTM3LDEwIEBAIGV4dGVybiB2b2lkIGxpbmVfcmFuZ2Vf X2NsZWFyKHN0cnVjdCBsaW5lX3JhbmdlICpscik7DQo+ICAvKiBJbml0aWFsaXplIGxpbmUgcmFu Z2UgKi8NCj4gIGV4dGVybiBpbnQgbGluZV9yYW5nZV9faW5pdChzdHJ1Y3QgbGluZV9yYW5nZSAq bHIpOw0KPiANCj4gLWV4dGVybiBpbnQgYWRkX3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJm X3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOw0KPiAtZXh0ZXJuIGludCBkZWxfcGVyZl9w cm9iZV9ldmVudHMoc3RydWN0IHN0cmZpbHRlciAqZmlsdGVyKTsNCj4gK2V4dGVybiBpbnQgYWRk X3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBl dnMsDQo+ICsJCQkJIHN0cnVjdCBzdHJidWYgKnJlc3VsdCk7DQo+ICtleHRlcm4gaW50IGRlbF9w ZXJmX3Byb2JlX2V2ZW50cyhzdHJ1Y3Qgc3RyZmlsdGVyICpmaWx0ZXIsDQo+ICsJCQkJIHN0cnVj dCBzdHJidWYgKnJlc3VsdCk7DQo+ICBleHRlcm4gaW50IHNob3dfcGVyZl9wcm9iZV9ldmVudHMo c3RydWN0IHN0cmZpbHRlciAqZmlsdGVyKTsNCj4gIGV4dGVybiBpbnQgc2hvd19saW5lX3Jhbmdl KHN0cnVjdCBsaW5lX3JhbmdlICpsciwgY29uc3QgY2hhciAqbW9kdWxlLA0KPiAgCQkJICAgYm9v bCB1c2VyKTsNCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmMgYi90 b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5jDQo+IGluZGV4IGJiYjI0MzcuLmUyMmZhMTIgMTAw NjQ0DQo+IC0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmMNCj4gKysrIGIvdG9vbHMv cGVyZi91dGlsL3Byb2JlLWZpbGUuYw0KPiBAQCAtMjY3LDcgKzI2Nyw2IEBAIHN0YXRpYyBpbnQg X19kZWxfdHJhY2VfcHJvYmVfZXZlbnQoaW50IGZkLCBzdHJ1Y3Qgc3RyX25vZGUgKmVudCkNCj4g IAkJZ290byBlcnJvcjsNCj4gIAl9DQo+IA0KPiAtCXByX2luZm8oIlJlbW92ZWQgZXZlbnQ6ICVz XG4iLCBlbnQtPnMpOw0KPiAgCXJldHVybiAwOw0KPiAgZXJyb3I6DQo+ICAJcHJfd2FybmluZygi RmFpbGVkIHRvIGRlbGV0ZSBldmVudDogJXNcbiIsDQo+IEBAIC0yNzUsNyArMjc0LDcgQEAgZXJy b3I6DQo+ICAJcmV0dXJuIHJldDsNCj4gIH0NCj4gDQo+IC1pbnQgcHJvYmVfZmlsZV9fZGVsX2V2 ZW50cyhpbnQgZmQsIHN0cnVjdCBzdHJmaWx0ZXIgKmZpbHRlcikNCj4gK2ludCBwcm9iZV9maWxl X19kZWxfZXZlbnRzKGludCBmZCwgc3RydWN0IHN0cmZpbHRlciAqZmlsdGVyLCBzdHJ1Y3Qgc3Ry YnVmICpidWYpDQo+ICB7DQo+ICAJc3RydWN0IHN0cmxpc3QgKm5hbWVsaXN0Ow0KPiAgCXN0cnVj dCBzdHJfbm9kZSAqZW50Ow0KPiBAQCAtMjkzLDYgKzI5Miw4IEBAIGludCBwcm9iZV9maWxlX19k ZWxfZXZlbnRzKGludCBmZCwgc3RydWN0IHN0cmZpbHRlciAqZmlsdGVyKQ0KPiAgCQkJcmV0ID0g X19kZWxfdHJhY2VfcHJvYmVfZXZlbnQoZmQsIGVudCk7DQo+ICAJCQlpZiAocmV0IDwgMCkNCj4g IAkJCQlicmVhazsNCj4gKwkJCWlmIChidWYpDQo+ICsJCQkJc3RyYnVmX2FkZGYoYnVmLCAiUmVt b3ZlZCBldmVudDogJXNcbiIsIGVudC0+cyk7DQo+ICAJCX0NCj4gIAl9DQo+ICAJc3RybGlzdF9f ZGVsZXRlKG5hbWVsaXN0KTsNCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1m aWxlLmggYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5oDQo+IGluZGV4IGFkYTk0YTIuLmVl ODllZjAgMTAwNjQ0DQo+IC0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmgNCj4gKysr IGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuaA0KPiBAQCAtMSw2ICsxLDcgQEANCj4gICNp Zm5kZWYgX19QUk9CRV9GSUxFX0gNCj4gICNkZWZpbmUgX19QUk9CRV9GSUxFX0gNCj4gDQo+ICsj aW5jbHVkZSAic3RyYnVmLmgiDQo+ICAjaW5jbHVkZSAic3RybGlzdC5oIg0KPiAgI2luY2x1ZGUg InN0cmZpbHRlci5oIg0KPiAgI2luY2x1ZGUgInByb2JlLWV2ZW50LmgiDQo+IEBAIC0xMyw2ICsx NCw3IEBAIGludCBwcm9iZV9maWxlX19vcGVuX2JvdGgoaW50ICprZmQsIGludCAqdWZkLCBpbnQg ZmxhZyk7DQo+ICBzdHJ1Y3Qgc3RybGlzdCAqcHJvYmVfZmlsZV9fZ2V0X25hbWVsaXN0KGludCBm ZCk7DQo+ICBzdHJ1Y3Qgc3RybGlzdCAqcHJvYmVfZmlsZV9fZ2V0X3Jhd2xpc3QoaW50IGZkKTsN Cj4gIGludCBwcm9iZV9maWxlX19hZGRfZXZlbnQoaW50IGZkLCBzdHJ1Y3QgcHJvYmVfdHJhY2Vf ZXZlbnQgKnRldik7DQo+IC1pbnQgcHJvYmVfZmlsZV9fZGVsX2V2ZW50cyhpbnQgZmQsIHN0cnVj dCBzdHJmaWx0ZXIgKmZpbHRlcik7DQo+ICtpbnQgcHJvYmVfZmlsZV9fZGVsX2V2ZW50cyhpbnQg ZmQsIHN0cnVjdCBzdHJmaWx0ZXIgKmZpbHRlciwNCj4gKwkJCSAgIHN0cnVjdCBzdHJidWYgKmJ1 Zik7DQo+IA0KPiAgI2VuZGlmDQo+IA0KDQo= -- 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]
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-09-03 19:30 +0200 |
| Subject | Re: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe |
| Message-ID | <q4GuK-1LD-23@gated-at.bofh.it> |
| In reply to | #1218209 |
On Thu, Sep 03, 2015 at 12:18:28PM +0000, 平松雅巳 / HIRAMATU,MASAMI wrote:
> Hi Namhyung,
>
> So, I hope this would be what you've suggested.
>
> Thank you,
Hi Masami,
I think something different, but this can be ok. Anyway, I'll send my
idea soon..
Thanks,
Namhyung
>
> --
> Masami HIRAMATSU
> Linux Technology Research Center, System Productivity Research Dept.
> Center for Technology Innovation - Systems Engineering
> Hitachi, Ltd., Research & Development Group
> E-mail: masami.hiramatsu.pt@hitachi.com
>
>
> > -----Original Message-----
> > From: Masami Hiramatsu [mailto:masami.hiramatsu.pt@hitachi.com]
> > Sent: Thursday, September 03, 2015 9:11 PM
> > To: Namhyung Kim; Arnaldo Carvalho de Melo
> > Cc: Wang Nan; Kaixu Xia; Peter Zijlstra; Daniel Borkmann; linux-kernel@vger.kernel.org; He Kuang; lizefan@huawei.com;
> > Jiri Olsa; David Ahern; Brendan Gregg; mingo@kernel.org; ast@plumgrid.com
> > Subject: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe
> >
> > Output the normal result of adding/deleting probe in buildin-probe
> > instead of showing it by add/del_perf_probe_events.
> > All the result string is stored into "result" strbuf parameter.
> > If you want to ignore the result string, pass a NULL to the "result".
> > Note that all warning/debug strings are still in the
> > add/del_perf_probe_events.
> >
> > Suggested-by: Namhyung Kim <namhyung@gmail.com>
> > Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> > ---
> > tools/perf/builtin-probe.c | 9 +++++++--
> > tools/perf/util/probe-event.c | 33 ++++++++++++++++++++-------------
> > tools/perf/util/probe-event.h | 6 ++++--
> > tools/perf/util/probe-file.c | 5 +++--
> > tools/perf/util/probe-file.h | 4 +++-
> > 5 files changed, 37 insertions(+), 20 deletions(-)
> >
> > diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
> > index b81cec3..d11ad21 100644
> > --- a/tools/perf/builtin-probe.c
> > +++ b/tools/perf/builtin-probe.c
> > @@ -402,6 +402,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
> > "Enable kernel symbol demangling"),
> > OPT_END()
> > };
> > + struct strbuf buf = STRBUF_INIT;
> > int ret;
> >
> > set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE);
> > @@ -483,7 +484,9 @@ __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 = del_perf_probe_events(params.filter, &buf);
> > + /* Even if failed, we should show the result first */
> > + pr_info("%s", buf.buf);
> > if (ret < 0) {
> > pr_err_with_code(" Error: Failed to delete events.", ret);
> > return ret;
> > @@ -496,7 +499,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
> > usage_with_options(probe_usage, options);
> > }
> >
> > - ret = add_perf_probe_events(params.events, params.nevents);
> > + ret = add_perf_probe_events(params.events, params.nevents, &buf);
> > + /* Even if failed, we should show the result first */
> > + pr_info("%s", buf.buf);
> > if (ret < 0) {
> > pr_err_with_code(" Error: Failed to add events.", ret);
> > return ret;
> > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> > index eb5f18b..1a3ed7c 100644
> > --- a/tools/perf/util/probe-event.c
> > +++ b/tools/perf/util/probe-event.c
> > @@ -2395,7 +2395,8 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
> >
> > static int __add_probe_trace_events(struct perf_probe_event *pev,
> > struct probe_trace_event *tevs,
> > - int ntevs, bool allow_suffix)
> > + int ntevs, bool allow_suffix,
> > + struct strbuf *buf)
> > {
> > int i, fd, ret;
> > struct probe_trace_event *tev = NULL;
> > @@ -2415,7 +2416,9 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> > }
> >
> > ret = 0;
> > - pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
> > + if (buf)
> > + strbuf_addf(buf, "Added new event%s\n",
> > + (ntevs > 1) ? "s:" : ":");
> > for (i = 0; i < ntevs; i++) {
> > tev = &tevs[i];
> > /* Skip if the symbol is out of .text or blacklisted */
> > @@ -2432,9 +2435,12 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> > if (ret < 0)
> > break;
> >
> > - /* We use tev's name for showing new events */
> > - show_perf_probe_event(tev->group, tev->event, pev,
> > - tev->point.module, false);
> > + if (buf) {
> > + /* We use tev's name for showing new events */
> > + perf_probe_event__sprintf(tev->group, tev->event,
> > + pev, tev->point.module, buf);
> > + strbuf_addch(buf, '\n');
> > + }
> > /* Save the last valid name */
> > event = tev->event;
> > group = tev->group;
> > @@ -2451,10 +2457,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> > warn_uprobe_event_compat(tev);
> >
> > /* Note that it is possible to skip all events because of blacklist */
> > - if (ret >= 0 && event) {
> > + if (ret >= 0 && event && buf) {
> > /* Show how to use the event. */
> > - pr_info("\nYou can now use it in all perf tools, such as:\n\n");
> > - pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
> > + strbuf_addf(buf, "\nYou can now use it in all perf tools, such as:\n\n");
> > + strbuf_addf(buf, "\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
> > }
> >
> > strlist__delete(namelist);
> > @@ -2765,7 +2771,8 @@ struct __event_package {
> > int ntevs;
> > };
> >
> > -int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
> > +int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
> > + struct strbuf *result)
> > {
> > int i, j, ret;
> > struct __event_package *pkgs;
> > @@ -2802,7 +2809,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
> > for (i = 0; i < npevs; i++) {
> > ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs,
> > pkgs[i].ntevs,
> > - probe_conf.force_add);
> > + probe_conf.force_add, result);
> > if (ret < 0)
> > break;
> > }
> > @@ -2819,7 +2826,7 @@ end:
> > return ret;
> > }
> >
> > -int del_perf_probe_events(struct strfilter *filter)
> > +int del_perf_probe_events(struct strfilter *filter, struct strbuf *result)
> > {
> > int ret, ret2, ufd = -1, kfd = -1;
> > char *str = strfilter__string(filter);
> > @@ -2834,11 +2841,11 @@ int del_perf_probe_events(struct strfilter *filter)
> > if (ret < 0)
> > goto out;
> >
> > - ret = probe_file__del_events(kfd, filter);
> > + ret = probe_file__del_events(kfd, filter, result);
> > if (ret < 0 && ret != -ENOENT)
> > goto error;
> >
> > - ret2 = probe_file__del_events(ufd, filter);
> > + ret2 = probe_file__del_events(ufd, filter, result);
> > if (ret2 < 0 && ret2 != -ENOENT) {
> > ret = ret2;
> > goto error;
> > diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
> > index 6e7ec68..9855dbf 100644
> > --- a/tools/perf/util/probe-event.h
> > +++ b/tools/perf/util/probe-event.h
> > @@ -137,8 +137,10 @@ extern void line_range__clear(struct line_range *lr);
> > /* Initialize line range */
> > extern int line_range__init(struct line_range *lr);
> >
> > -extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
> > -extern int del_perf_probe_events(struct strfilter *filter);
> > +extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
> > + struct strbuf *result);
> > +extern int del_perf_probe_events(struct strfilter *filter,
> > + struct strbuf *result);
> > extern int show_perf_probe_events(struct strfilter *filter);
> > extern int show_line_range(struct line_range *lr, const char *module,
> > bool user);
> > diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
> > index bbb2437..e22fa12 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,7 +274,7 @@ error:
> > return ret;
> > }
> >
> > -int probe_file__del_events(int fd, struct strfilter *filter)
> > +int probe_file__del_events(int fd, struct strfilter *filter, struct strbuf *buf)
> > {
> > struct strlist *namelist;
> > struct str_node *ent;
> > @@ -293,6 +292,8 @@ int probe_file__del_events(int fd, struct strfilter *filter)
> > ret = __del_trace_probe_event(fd, ent);
> > if (ret < 0)
> > break;
> > + if (buf)
> > + strbuf_addf(buf, "Removed event: %s\n", ent->s);
> > }
> > }
> > strlist__delete(namelist);
> > diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h
> > index ada94a2..ee89ef0 100644
> > --- a/tools/perf/util/probe-file.h
> > +++ b/tools/perf/util/probe-file.h
> > @@ -1,6 +1,7 @@
> > #ifndef __PROBE_FILE_H
> > #define __PROBE_FILE_H
> >
> > +#include "strbuf.h"
> > #include "strlist.h"
> > #include "strfilter.h"
> > #include "probe-event.h"
> > @@ -13,6 +14,7 @@ int probe_file__open_both(int *kfd, int *ufd, int flag);
> > 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__del_events(int fd, struct strfilter *filter,
> > + struct strbuf *buf);
> >
> > #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]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2015-09-03 22:30 +0200 |
| Subject | Re: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe |
| Message-ID | <q4JiV-5N2-13@gated-at.bofh.it> |
| In reply to | #1218203 |
Em Thu, Sep 03, 2015 at 09:10:35PM +0900, Masami Hiramatsu escreveu:
> Output the normal result of adding/deleting probe in buildin-probe
> instead of showing it by add/del_perf_probe_events.
> All the result string is stored into "result" strbuf parameter.
> If you want to ignore the result string, pass a NULL to the "result".
> Note that all warning/debug strings are still in the
> add/del_perf_probe_events.
Please provide the before and after output of the affected tools.
But I'll wait for you to react to Namyung's RFC.
- Arnaldo
> Suggested-by: Namhyung Kim <namhyung@gmail.com>
> Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> ---
> tools/perf/builtin-probe.c | 9 +++++++--
> tools/perf/util/probe-event.c | 33 ++++++++++++++++++++-------------
> tools/perf/util/probe-event.h | 6 ++++--
> tools/perf/util/probe-file.c | 5 +++--
> tools/perf/util/probe-file.h | 4 +++-
> 5 files changed, 37 insertions(+), 20 deletions(-)
>
> diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
> index b81cec3..d11ad21 100644
> --- a/tools/perf/builtin-probe.c
> +++ b/tools/perf/builtin-probe.c
> @@ -402,6 +402,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
> "Enable kernel symbol demangling"),
> OPT_END()
> };
> + struct strbuf buf = STRBUF_INIT;
> int ret;
>
> set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE);
> @@ -483,7 +484,9 @@ __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 = del_perf_probe_events(params.filter, &buf);
> + /* Even if failed, we should show the result first */
> + pr_info("%s", buf.buf);
> if (ret < 0) {
> pr_err_with_code(" Error: Failed to delete events.", ret);
> return ret;
> @@ -496,7 +499,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
> usage_with_options(probe_usage, options);
> }
>
> - ret = add_perf_probe_events(params.events, params.nevents);
> + ret = add_perf_probe_events(params.events, params.nevents, &buf);
> + /* Even if failed, we should show the result first */
> + pr_info("%s", buf.buf);
> if (ret < 0) {
> pr_err_with_code(" Error: Failed to add events.", ret);
> return ret;
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index eb5f18b..1a3ed7c 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -2395,7 +2395,8 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
>
> static int __add_probe_trace_events(struct perf_probe_event *pev,
> struct probe_trace_event *tevs,
> - int ntevs, bool allow_suffix)
> + int ntevs, bool allow_suffix,
> + struct strbuf *buf)
> {
> int i, fd, ret;
> struct probe_trace_event *tev = NULL;
> @@ -2415,7 +2416,9 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> }
>
> ret = 0;
> - pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
> + if (buf)
> + strbuf_addf(buf, "Added new event%s\n",
> + (ntevs > 1) ? "s:" : ":");
> for (i = 0; i < ntevs; i++) {
> tev = &tevs[i];
> /* Skip if the symbol is out of .text or blacklisted */
> @@ -2432,9 +2435,12 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> if (ret < 0)
> break;
>
> - /* We use tev's name for showing new events */
> - show_perf_probe_event(tev->group, tev->event, pev,
> - tev->point.module, false);
> + if (buf) {
> + /* We use tev's name for showing new events */
> + perf_probe_event__sprintf(tev->group, tev->event,
> + pev, tev->point.module, buf);
> + strbuf_addch(buf, '\n');
> + }
> /* Save the last valid name */
> event = tev->event;
> group = tev->group;
> @@ -2451,10 +2457,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> warn_uprobe_event_compat(tev);
>
> /* Note that it is possible to skip all events because of blacklist */
> - if (ret >= 0 && event) {
> + if (ret >= 0 && event && buf) {
> /* Show how to use the event. */
> - pr_info("\nYou can now use it in all perf tools, such as:\n\n");
> - pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
> + strbuf_addf(buf, "\nYou can now use it in all perf tools, such as:\n\n");
> + strbuf_addf(buf, "\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
> }
>
> strlist__delete(namelist);
> @@ -2765,7 +2771,8 @@ struct __event_package {
> int ntevs;
> };
>
> -int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
> +int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
> + struct strbuf *result)
> {
> int i, j, ret;
> struct __event_package *pkgs;
> @@ -2802,7 +2809,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
> for (i = 0; i < npevs; i++) {
> ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs,
> pkgs[i].ntevs,
> - probe_conf.force_add);
> + probe_conf.force_add, result);
> if (ret < 0)
> break;
> }
> @@ -2819,7 +2826,7 @@ end:
> return ret;
> }
>
> -int del_perf_probe_events(struct strfilter *filter)
> +int del_perf_probe_events(struct strfilter *filter, struct strbuf *result)
> {
> int ret, ret2, ufd = -1, kfd = -1;
> char *str = strfilter__string(filter);
> @@ -2834,11 +2841,11 @@ int del_perf_probe_events(struct strfilter *filter)
> if (ret < 0)
> goto out;
>
> - ret = probe_file__del_events(kfd, filter);
> + ret = probe_file__del_events(kfd, filter, result);
> if (ret < 0 && ret != -ENOENT)
> goto error;
>
> - ret2 = probe_file__del_events(ufd, filter);
> + ret2 = probe_file__del_events(ufd, filter, result);
> if (ret2 < 0 && ret2 != -ENOENT) {
> ret = ret2;
> goto error;
> diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
> index 6e7ec68..9855dbf 100644
> --- a/tools/perf/util/probe-event.h
> +++ b/tools/perf/util/probe-event.h
> @@ -137,8 +137,10 @@ extern void line_range__clear(struct line_range *lr);
> /* Initialize line range */
> extern int line_range__init(struct line_range *lr);
>
> -extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
> -extern int del_perf_probe_events(struct strfilter *filter);
> +extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
> + struct strbuf *result);
> +extern int del_perf_probe_events(struct strfilter *filter,
> + struct strbuf *result);
> extern int show_perf_probe_events(struct strfilter *filter);
> extern int show_line_range(struct line_range *lr, const char *module,
> bool user);
> diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
> index bbb2437..e22fa12 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,7 +274,7 @@ error:
> return ret;
> }
>
> -int probe_file__del_events(int fd, struct strfilter *filter)
> +int probe_file__del_events(int fd, struct strfilter *filter, struct strbuf *buf)
> {
> struct strlist *namelist;
> struct str_node *ent;
> @@ -293,6 +292,8 @@ int probe_file__del_events(int fd, struct strfilter *filter)
> ret = __del_trace_probe_event(fd, ent);
> if (ret < 0)
> break;
> + if (buf)
> + strbuf_addf(buf, "Removed event: %s\n", ent->s);
> }
> }
> strlist__delete(namelist);
> diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h
> index ada94a2..ee89ef0 100644
> --- a/tools/perf/util/probe-file.h
> +++ b/tools/perf/util/probe-file.h
> @@ -1,6 +1,7 @@
> #ifndef __PROBE_FILE_H
> #define __PROBE_FILE_H
>
> +#include "strbuf.h"
> #include "strlist.h"
> #include "strfilter.h"
> #include "probe-event.h"
> @@ -13,6 +14,7 @@ int probe_file__open_both(int *kfd, int *ufd, int flag);
> 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__del_events(int fd, struct strfilter *filter,
> + struct strbuf *buf);
>
> #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]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-09-04 03:40 +0200 |
| Subject | RE: [PATCH perf/core ] perf-probe: Output the result of adding/deleting probe in buildin-probe |
| Message-ID | <q4O8W-4aE-9@gated-at.bofh.it> |
| In reply to | #1218561 |
> From: Arnaldo Carvalho de Melo [mailto:acme@kernel.org]
>
> Em Thu, Sep 03, 2015 at 09:10:35PM +0900, Masami Hiramatsu escreveu:
> > Output the normal result of adding/deleting probe in buildin-probe
> > instead of showing it by add/del_perf_probe_events.
> > All the result string is stored into "result" strbuf parameter.
> > If you want to ignore the result string, pass a NULL to the "result".
> > Note that all warning/debug strings are still in the
> > add/del_perf_probe_events.
>
> Please provide the before and after output of the affected tools.
>
> But I'll wait for you to react to Namyung's RFC.
Yeah, I think his series is much better than this add-hoc fix :)
I'll reply him asap.
Thanks!
>
> - Arnaldo
>
> > Suggested-by: Namhyung Kim <namhyung@gmail.com>
> > Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> > ---
> > tools/perf/builtin-probe.c | 9 +++++++--
> > tools/perf/util/probe-event.c | 33 ++++++++++++++++++++-------------
> > tools/perf/util/probe-event.h | 6 ++++--
> > tools/perf/util/probe-file.c | 5 +++--
> > tools/perf/util/probe-file.h | 4 +++-
> > 5 files changed, 37 insertions(+), 20 deletions(-)
> >
> > diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
> > index b81cec3..d11ad21 100644
> > --- a/tools/perf/builtin-probe.c
> > +++ b/tools/perf/builtin-probe.c
> > @@ -402,6 +402,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
> > "Enable kernel symbol demangling"),
> > OPT_END()
> > };
> > + struct strbuf buf = STRBUF_INIT;
> > int ret;
> >
> > set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE);
> > @@ -483,7 +484,9 @@ __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 = del_perf_probe_events(params.filter, &buf);
> > + /* Even if failed, we should show the result first */
> > + pr_info("%s", buf.buf);
> > if (ret < 0) {
> > pr_err_with_code(" Error: Failed to delete events.", ret);
> > return ret;
> > @@ -496,7 +499,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
> > usage_with_options(probe_usage, options);
> > }
> >
> > - ret = add_perf_probe_events(params.events, params.nevents);
> > + ret = add_perf_probe_events(params.events, params.nevents, &buf);
> > + /* Even if failed, we should show the result first */
> > + pr_info("%s", buf.buf);
> > if (ret < 0) {
> > pr_err_with_code(" Error: Failed to add events.", ret);
> > return ret;
> > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> > index eb5f18b..1a3ed7c 100644
> > --- a/tools/perf/util/probe-event.c
> > +++ b/tools/perf/util/probe-event.c
> > @@ -2395,7 +2395,8 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
> >
> > static int __add_probe_trace_events(struct perf_probe_event *pev,
> > struct probe_trace_event *tevs,
> > - int ntevs, bool allow_suffix)
> > + int ntevs, bool allow_suffix,
> > + struct strbuf *buf)
> > {
> > int i, fd, ret;
> > struct probe_trace_event *tev = NULL;
> > @@ -2415,7 +2416,9 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> > }
> >
> > ret = 0;
> > - pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
> > + if (buf)
> > + strbuf_addf(buf, "Added new event%s\n",
> > + (ntevs > 1) ? "s:" : ":");
> > for (i = 0; i < ntevs; i++) {
> > tev = &tevs[i];
> > /* Skip if the symbol is out of .text or blacklisted */
> > @@ -2432,9 +2435,12 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> > if (ret < 0)
> > break;
> >
> > - /* We use tev's name for showing new events */
> > - show_perf_probe_event(tev->group, tev->event, pev,
> > - tev->point.module, false);
> > + if (buf) {
> > + /* We use tev's name for showing new events */
> > + perf_probe_event__sprintf(tev->group, tev->event,
> > + pev, tev->point.module, buf);
> > + strbuf_addch(buf, '\n');
> > + }
> > /* Save the last valid name */
> > event = tev->event;
> > group = tev->group;
> > @@ -2451,10 +2457,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
> > warn_uprobe_event_compat(tev);
> >
> > /* Note that it is possible to skip all events because of blacklist */
> > - if (ret >= 0 && event) {
> > + if (ret >= 0 && event && buf) {
> > /* Show how to use the event. */
> > - pr_info("\nYou can now use it in all perf tools, such as:\n\n");
> > - pr_info("\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
> > + strbuf_addf(buf, "\nYou can now use it in all perf tools, such as:\n\n");
> > + strbuf_addf(buf, "\tperf record -e %s:%s -aR sleep 1\n\n", group, event);
> > }
> >
> > strlist__delete(namelist);
> > @@ -2765,7 +2771,8 @@ struct __event_package {
> > int ntevs;
> > };
> >
> > -int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
> > +int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
> > + struct strbuf *result)
> > {
> > int i, j, ret;
> > struct __event_package *pkgs;
> > @@ -2802,7 +2809,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs)
> > for (i = 0; i < npevs; i++) {
> > ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs,
> > pkgs[i].ntevs,
> > - probe_conf.force_add);
> > + probe_conf.force_add, result);
> > if (ret < 0)
> > break;
> > }
> > @@ -2819,7 +2826,7 @@ end:
> > return ret;
> > }
> >
> > -int del_perf_probe_events(struct strfilter *filter)
> > +int del_perf_probe_events(struct strfilter *filter, struct strbuf *result)
> > {
> > int ret, ret2, ufd = -1, kfd = -1;
> > char *str = strfilter__string(filter);
> > @@ -2834,11 +2841,11 @@ int del_perf_probe_events(struct strfilter *filter)
> > if (ret < 0)
> > goto out;
> >
> > - ret = probe_file__del_events(kfd, filter);
> > + ret = probe_file__del_events(kfd, filter, result);
> > if (ret < 0 && ret != -ENOENT)
> > goto error;
> >
> > - ret2 = probe_file__del_events(ufd, filter);
> > + ret2 = probe_file__del_events(ufd, filter, result);
> > if (ret2 < 0 && ret2 != -ENOENT) {
> > ret = ret2;
> > goto error;
> > diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
> > index 6e7ec68..9855dbf 100644
> > --- a/tools/perf/util/probe-event.h
> > +++ b/tools/perf/util/probe-event.h
> > @@ -137,8 +137,10 @@ extern void line_range__clear(struct line_range *lr);
> > /* Initialize line range */
> > extern int line_range__init(struct line_range *lr);
> >
> > -extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs);
> > -extern int del_perf_probe_events(struct strfilter *filter);
> > +extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
> > + struct strbuf *result);
> > +extern int del_perf_probe_events(struct strfilter *filter,
> > + struct strbuf *result);
> > extern int show_perf_probe_events(struct strfilter *filter);
> > extern int show_line_range(struct line_range *lr, const char *module,
> > bool user);
> > diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
> > index bbb2437..e22fa12 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,7 +274,7 @@ error:
> > return ret;
> > }
> >
> > -int probe_file__del_events(int fd, struct strfilter *filter)
> > +int probe_file__del_events(int fd, struct strfilter *filter, struct strbuf *buf)
> > {
> > struct strlist *namelist;
> > struct str_node *ent;
> > @@ -293,6 +292,8 @@ int probe_file__del_events(int fd, struct strfilter *filter)
> > ret = __del_trace_probe_event(fd, ent);
> > if (ret < 0)
> > break;
> > + if (buf)
> > + strbuf_addf(buf, "Removed event: %s\n", ent->s);
> > }
> > }
> > strlist__delete(namelist);
> > diff --git a/tools/perf/util/probe-file.h b/tools/perf/util/probe-file.h
> > index ada94a2..ee89ef0 100644
> > --- a/tools/perf/util/probe-file.h
> > +++ b/tools/perf/util/probe-file.h
> > @@ -1,6 +1,7 @@
> > #ifndef __PROBE_FILE_H
> > #define __PROBE_FILE_H
> >
> > +#include "strbuf.h"
> > #include "strlist.h"
> > #include "strfilter.h"
> > #include "probe-event.h"
> > @@ -13,6 +14,7 @@ int probe_file__open_both(int *kfd, int *ufd, int flag);
> > 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__del_events(int fd, struct strfilter *filter,
> > + struct strbuf *buf);
> >
> > #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] | [standalone]
Back to top | Article view | linux.kernel
csiph-web