Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1218875 > unrolled thread
| Started by | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| First post | 2015-09-04 14:20 +0200 |
| Last post | 2015-09-06 09:50 +0200 |
| Articles | 6 — 3 participants |
Back to article view | Back to linux.kernel
[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
[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
[PATCH v2 4/5] perf probe: Split del_perf_probe_events() Namhyung Kim <namhyung@kernel.org> - 2015-09-04 14:30 +0200
Re: [PATCH v2 1/5] perf probe: Split add_perf_probe_events() "Wangnan (F)" <wangnan0@huawei.com> - 2015-09-06 09:50 +0200
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-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]
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-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]
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-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]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-09-07 03:20 +0200 |
| Subject | RE: [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]
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-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]
| From | "Wangnan (F)" <wangnan0@huawei.com> |
|---|---|
| Date | 2015-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] | [standalone]
Back to top | Article view | linux.kernel
csiph-web