>From: Namhyung Kim [mailto:namhyung@gmail.com] On Behalf Of Namhyung Kim > >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. > Looks good to me :) Acked-by: Masami Hiramatsu Thanks! >Cc: Masami Hiramatsu >Signed-off-by: Namhyung Kim >--- > 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 {.n++%ݶw{.n+{G{ayʇڙ,jfhz_(階ݢj"mG?&~iOzv^m ?I