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


Groups > linux.kernel > #1268702 > unrolled thread

[PATCH] perf probe: Clear probe_trace_event when add_probe_trace_event() fails

Started byWang Nan <wangnan0@huawei.com>
First post2015-11-13 10:10 +0100
Last post2015-11-14 04:40 +0100
Articles 2 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] perf probe: Clear probe_trace_event when add_probe_trace_event() fails Wang Nan <wangnan0@huawei.com> - 2015-11-13 10:10 +0100
    RE: [PATCH] perf probe: Clear probe_trace_event when  add_probe_trace_event() fails 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-11-14 04:40 +0100

#1268702 — [PATCH] perf probe: Clear probe_trace_event when add_probe_trace_event() fails

FromWang Nan <wangnan0@huawei.com>
Date2015-11-13 10:10 +0100
Subject[PATCH] perf probe: Clear probe_trace_event when add_probe_trace_event() fails
Message-ID<quiwN-4sk-1@gated-at.bofh.it>
When probe with glob, error in add_probe_trace_event() won't be passed
to debuginfo__find_trace_events() because it whould be modified by
probe_point_search_cb(). It causes segfault if perf failed to find
argument for one probing point matched by the glob. For example:

 # ./perf probe -v -n 'SyS_dup? oldfd'
 probe-definition(0): SyS_dup? oldfd
 symbol:SyS_dup? file:(null) line:0 offset:0 return:0 lazy:(null)
 parsing arg: oldfd into oldfd
 1 arguments
 Looking at the vmlinux_path (7 entries long)
 Using /lib/modules/4.3.0-rc4+/build/vmlinux for symbols
 Open Debuginfo file: /lib/modules/4.3.0-rc4+/build/vmlinux
 Try to find probe point from debuginfo.
 Matched function: SyS_dup3
 found inline addr: 0xffffffff812095c0
 Probe point found: SyS_dup3+0
 Searching 'oldfd' variable in context.
 Converting variable oldfd into trace event.
 oldfd type is long int.
 found inline addr: 0xffffffff812096d4
 Probe point found: SyS_dup2+36
 Searching 'oldfd' variable in context.
 Failed to find 'oldfd' in this function.
 Matched function: SyS_dup3
 Probe point found: SyS_dup3+0
 Searching 'oldfd' variable in context.
 Converting variable oldfd into trace event.
 oldfd type is long int.
 Matched function: SyS_dup2
 Probe point found: SyS_dup2+0
 Searching 'oldfd' variable in context.
 Converting variable oldfd into trace event.
 oldfd type is long int.
 Found 4 probe_trace_events.
 Opening /sys/kernel/debug/tracing//kprobe_events write=1
 Writing event: p:probe/SyS_dup3 _text+2135488 oldfd=%di:s64
 Segmentation fault (core dumped)

This patch ensures add_probe_trace_event() not touch tf->ntevs and
tf->tevs if it returns failure.

Here is testing result:

 # perf probe  'SyS_dup? oldfd'
 Failed to find 'oldfd' in this function.
 Added new events:
   probe:SyS_dup3       (on SyS_dup? with oldfd)
   probe:SyS_dup3_1     (on SyS_dup? with oldfd)
   probe:SyS_dup2       (on SyS_dup? with oldfd)

 You can now use it in all perf tools, such as:

	perf record -e probe:SyS_dup2 -aR sleep 1

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
---
 tools/perf/util/probe-finder.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 63993d7..05012bb 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1183,7 +1183,7 @@ static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
 			container_of(pf, struct trace_event_finder, pf);
 	struct perf_probe_point *pp = &pf->pev->point;
 	struct probe_trace_event *tev;
-	struct perf_probe_arg *args;
+	struct perf_probe_arg *args = NULL;
 	int ret, i;
 
 	/* Check number of tevs */
@@ -1198,19 +1198,23 @@ static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
 	ret = convert_to_trace_point(&pf->sp_die, tf->mod, pf->addr,
 				     pp->retprobe, pp->function, &tev->point);
 	if (ret < 0)
-		return ret;
+		goto end;
 
 	tev->point.realname = strdup(dwarf_diename(sc_die));
-	if (!tev->point.realname)
-		return -ENOMEM;
+	if (!tev->point.realname) {
+		ret = -ENOMEM;
+		goto end;
+	}
 
 	pr_debug("Probe point found: %s+%lu\n", tev->point.symbol,
 		 tev->point.offset);
 
 	/* Expand special probe argument if exist */
 	args = zalloc(sizeof(struct perf_probe_arg) * MAX_PROBE_ARGS);
-	if (args == NULL)
-		return -ENOMEM;
+	if (args == NULL) {
+		ret = -ENOMEM;
+		goto end;
+	}
 
 	ret = expand_probe_args(sc_die, pf, args);
 	if (ret < 0)
@@ -1234,6 +1238,10 @@ static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
 	}
 
 end:
+	if (ret) {
+		clear_probe_trace_event(tev);
+		tf->ntevs--;
+	}
 	free(args);
 	return ret;
 }
-- 
1.8.3.4

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


#1269417 — RE: [PATCH] perf probe: Clear probe_trace_event when add_probe_trace_event() fails

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-11-14 04:40 +0100
SubjectRE: [PATCH] perf probe: Clear probe_trace_event when add_probe_trace_event() fails
Message-ID<quzQZ-76M-5@gated-at.bofh.it>
In reply to#1268702
PkZyb206IFdhbmcgTmFuIFttYWlsdG86d2FuZ25hbjBAaHVhd2VpLmNvbV0NCj4NCj5XaGVuIHBy
b2JlIHdpdGggZ2xvYiwgZXJyb3IgaW4gYWRkX3Byb2JlX3RyYWNlX2V2ZW50KCkgd29uJ3QgYmUg
cGFzc2VkDQo+dG8gZGVidWdpbmZvX19maW5kX3RyYWNlX2V2ZW50cygpIGJlY2F1c2UgaXQgd2hv
dWxkIGJlIG1vZGlmaWVkIGJ5DQo+cHJvYmVfcG9pbnRfc2VhcmNoX2NiKCkuIEl0IGNhdXNlcyBz
ZWdmYXVsdCBpZiBwZXJmIGZhaWxlZCB0byBmaW5kDQo+YXJndW1lbnQgZm9yIG9uZSBwcm9iaW5n
IHBvaW50IG1hdGNoZWQgYnkgdGhlIGdsb2IuIEZvciBleGFtcGxlOg0KPg0KPiAjIC4vcGVyZiBw
cm9iZSAtdiAtbiAnU3lTX2R1cD8gb2xkZmQnDQo+IHByb2JlLWRlZmluaXRpb24oMCk6IFN5U19k
dXA/IG9sZGZkDQo+IHN5bWJvbDpTeVNfZHVwPyBmaWxlOihudWxsKSBsaW5lOjAgb2Zmc2V0OjAg
cmV0dXJuOjAgbGF6eToobnVsbCkNCj4gcGFyc2luZyBhcmc6IG9sZGZkIGludG8gb2xkZmQNCj4g
MSBhcmd1bWVudHMNCj4gTG9va2luZyBhdCB0aGUgdm1saW51eF9wYXRoICg3IGVudHJpZXMgbG9u
ZykNCj4gVXNpbmcgL2xpYi9tb2R1bGVzLzQuMy4wLXJjNCsvYnVpbGQvdm1saW51eCBmb3Igc3lt
Ym9scw0KPiBPcGVuIERlYnVnaW5mbyBmaWxlOiAvbGliL21vZHVsZXMvNC4zLjAtcmM0Ky9idWls
ZC92bWxpbnV4DQo+IFRyeSB0byBmaW5kIHByb2JlIHBvaW50IGZyb20gZGVidWdpbmZvLg0KPiBN
YXRjaGVkIGZ1bmN0aW9uOiBTeVNfZHVwMw0KPiBmb3VuZCBpbmxpbmUgYWRkcjogMHhmZmZmZmZm
ZjgxMjA5NWMwDQo+IFByb2JlIHBvaW50IGZvdW5kOiBTeVNfZHVwMyswDQo+IFNlYXJjaGluZyAn
b2xkZmQnIHZhcmlhYmxlIGluIGNvbnRleHQuDQo+IENvbnZlcnRpbmcgdmFyaWFibGUgb2xkZmQg
aW50byB0cmFjZSBldmVudC4NCj4gb2xkZmQgdHlwZSBpcyBsb25nIGludC4NCj4gZm91bmQgaW5s
aW5lIGFkZHI6IDB4ZmZmZmZmZmY4MTIwOTZkNA0KPiBQcm9iZSBwb2ludCBmb3VuZDogU3lTX2R1
cDIrMzYNCj4gU2VhcmNoaW5nICdvbGRmZCcgdmFyaWFibGUgaW4gY29udGV4dC4NCj4gRmFpbGVk
IHRvIGZpbmQgJ29sZGZkJyBpbiB0aGlzIGZ1bmN0aW9uLg0KPiBNYXRjaGVkIGZ1bmN0aW9uOiBT
eVNfZHVwMw0KPiBQcm9iZSBwb2ludCBmb3VuZDogU3lTX2R1cDMrMA0KPiBTZWFyY2hpbmcgJ29s
ZGZkJyB2YXJpYWJsZSBpbiBjb250ZXh0Lg0KPiBDb252ZXJ0aW5nIHZhcmlhYmxlIG9sZGZkIGlu
dG8gdHJhY2UgZXZlbnQuDQo+IG9sZGZkIHR5cGUgaXMgbG9uZyBpbnQuDQo+IE1hdGNoZWQgZnVu
Y3Rpb246IFN5U19kdXAyDQo+IFByb2JlIHBvaW50IGZvdW5kOiBTeVNfZHVwMiswDQo+IFNlYXJj
aGluZyAnb2xkZmQnIHZhcmlhYmxlIGluIGNvbnRleHQuDQo+IENvbnZlcnRpbmcgdmFyaWFibGUg
b2xkZmQgaW50byB0cmFjZSBldmVudC4NCj4gb2xkZmQgdHlwZSBpcyBsb25nIGludC4NCj4gRm91
bmQgNCBwcm9iZV90cmFjZV9ldmVudHMuDQo+IE9wZW5pbmcgL3N5cy9rZXJuZWwvZGVidWcvdHJh
Y2luZy8va3Byb2JlX2V2ZW50cyB3cml0ZT0xDQo+IFdyaXRpbmcgZXZlbnQ6IHA6cHJvYmUvU3lT
X2R1cDMgX3RleHQrMjEzNTQ4OCBvbGRmZD0lZGk6czY0DQo+IFNlZ21lbnRhdGlvbiBmYXVsdCAo
Y29yZSBkdW1wZWQpDQo+DQo+VGhpcyBwYXRjaCBlbnN1cmVzIGFkZF9wcm9iZV90cmFjZV9ldmVu
dCgpIG5vdCB0b3VjaCB0Zi0+bnRldnMgYW5kDQo+dGYtPnRldnMgaWYgaXQgcmV0dXJucyBmYWls
dXJlLg0KPg0KPkhlcmUgaXMgdGVzdGluZyByZXN1bHQ6DQo+DQo+ICMgcGVyZiBwcm9iZSAgJ1N5
U19kdXA/IG9sZGZkJw0KPiBGYWlsZWQgdG8gZmluZCAnb2xkZmQnIGluIHRoaXMgZnVuY3Rpb24u
DQo+IEFkZGVkIG5ldyBldmVudHM6DQo+ICAgcHJvYmU6U3lTX2R1cDMgICAgICAgKG9uIFN5U19k
dXA/IHdpdGggb2xkZmQpDQo+ICAgcHJvYmU6U3lTX2R1cDNfMSAgICAgKG9uIFN5U19kdXA/IHdp
dGggb2xkZmQpDQo+ICAgcHJvYmU6U3lTX2R1cDIgICAgICAgKG9uIFN5U19kdXA/IHdpdGggb2xk
ZmQpDQo+DQo+IFlvdSBjYW4gbm93IHVzZSBpdCBpbiBhbGwgcGVyZiB0b29scywgc3VjaCBhczoN
Cj4NCj4JcGVyZiByZWNvcmQgLWUgcHJvYmU6U3lTX2R1cDIgLWFSIHNsZWVwIDENCg0KR29vZCBj
YXRjaCENCg0KQWNrZWQtYnk6IE1hc2FtaSBIaXJhbWF0c3UgPG1hc2FtaS5oaXJhbWF0c3UucHRA
aGl0YWNoaS5jb20+DQoNClRoYW5rcyENCg0KPg0KPlNpZ25lZC1vZmYtYnk6IFdhbmcgTmFuIDx3
YW5nbmFuMEBodWF3ZWkuY29tPg0KPkNjOiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVA
cmVkaGF0LmNvbT4NCj5DYzogTWFzYW1pIEhpcmFtYXRzdSA8bWFzYW1pLmhpcmFtYXRzdS5wdEBo
aXRhY2hpLmNvbT4NCj5DYzogWmVmYW4gTGkgPGxpemVmYW5AaHVhd2VpLmNvbT4NCj5DYzogcGkz
b3JhbWFAMTYzLmNvbQ0KPi0tLQ0KPiB0b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMgfCAy
MCArKysrKysrKysrKysrKy0tLS0tLQ0KPiAxIGZpbGUgY2hhbmdlZCwgMTQgaW5zZXJ0aW9ucygr
KSwgNiBkZWxldGlvbnMoLSkNCj4NCj5kaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2Jl
LWZpbmRlci5jIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jDQo+aW5kZXggNjM5OTNk
Ny4uMDUwMTJiYiAxMDA2NDQNCj4tLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMN
Cj4rKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMNCj5AQCAtMTE4Myw3ICsxMTgz
LDcgQEAgc3RhdGljIGludCBhZGRfcHJvYmVfdHJhY2VfZXZlbnQoRHdhcmZfRGllICpzY19kaWUs
IHN0cnVjdCBwcm9iZV9maW5kZXIgKnBmKQ0KPiAJCQljb250YWluZXJfb2YocGYsIHN0cnVjdCB0
cmFjZV9ldmVudF9maW5kZXIsIHBmKTsNCj4gCXN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpwcCA9
ICZwZi0+cGV2LT5wb2ludDsNCj4gCXN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2Ow0KPi0J
c3RydWN0IHBlcmZfcHJvYmVfYXJnICphcmdzOw0KPisJc3RydWN0IHBlcmZfcHJvYmVfYXJnICph
cmdzID0gTlVMTDsNCj4gCWludCByZXQsIGk7DQo+DQo+IAkvKiBDaGVjayBudW1iZXIgb2YgdGV2
cyAqLw0KPkBAIC0xMTk4LDE5ICsxMTk4LDIzIEBAIHN0YXRpYyBpbnQgYWRkX3Byb2JlX3RyYWNl
X2V2ZW50KER3YXJmX0RpZSAqc2NfZGllLCBzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikNCj4gCXJl
dCA9IGNvbnZlcnRfdG9fdHJhY2VfcG9pbnQoJnBmLT5zcF9kaWUsIHRmLT5tb2QsIHBmLT5hZGRy
LA0KPiAJCQkJICAgICBwcC0+cmV0cHJvYmUsIHBwLT5mdW5jdGlvbiwgJnRldi0+cG9pbnQpOw0K
PiAJaWYgKHJldCA8IDApDQo+LQkJcmV0dXJuIHJldDsNCj4rCQlnb3RvIGVuZDsNCj4NCj4gCXRl
di0+cG9pbnQucmVhbG5hbWUgPSBzdHJkdXAoZHdhcmZfZGllbmFtZShzY19kaWUpKTsNCj4tCWlm
ICghdGV2LT5wb2ludC5yZWFsbmFtZSkNCj4tCQlyZXR1cm4gLUVOT01FTTsNCj4rCWlmICghdGV2
LT5wb2ludC5yZWFsbmFtZSkgew0KPisJCXJldCA9IC1FTk9NRU07DQo+KwkJZ290byBlbmQ7DQo+
Kwl9DQo+DQo+IAlwcl9kZWJ1ZygiUHJvYmUgcG9pbnQgZm91bmQ6ICVzKyVsdVxuIiwgdGV2LT5w
b2ludC5zeW1ib2wsDQo+IAkJIHRldi0+cG9pbnQub2Zmc2V0KTsNCj4NCj4gCS8qIEV4cGFuZCBz
cGVjaWFsIHByb2JlIGFyZ3VtZW50IGlmIGV4aXN0ICovDQo+IAlhcmdzID0gemFsbG9jKHNpemVv
ZihzdHJ1Y3QgcGVyZl9wcm9iZV9hcmcpICogTUFYX1BST0JFX0FSR1MpOw0KPi0JaWYgKGFyZ3Mg
PT0gTlVMTCkNCj4tCQlyZXR1cm4gLUVOT01FTTsNCj4rCWlmIChhcmdzID09IE5VTEwpIHsNCj4r
CQlyZXQgPSAtRU5PTUVNOw0KPisJCWdvdG8gZW5kOw0KPisJfQ0KPg0KPiAJcmV0ID0gZXhwYW5k
X3Byb2JlX2FyZ3Moc2NfZGllLCBwZiwgYXJncyk7DQo+IAlpZiAocmV0IDwgMCkNCj5AQCAtMTIz
NCw2ICsxMjM4LDEwIEBAIHN0YXRpYyBpbnQgYWRkX3Byb2JlX3RyYWNlX2V2ZW50KER3YXJmX0Rp
ZSAqc2NfZGllLCBzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikNCj4gCX0NCj4NCj4gZW5kOg0KPisJ
aWYgKHJldCkgew0KPisJCWNsZWFyX3Byb2JlX3RyYWNlX2V2ZW50KHRldik7DQo+KwkJdGYtPm50
ZXZzLS07DQo+Kwl9DQo+IAlmcmVlKGFyZ3MpOw0KPiAJcmV0dXJuIHJldDsNCj4gfQ0KPi0tDQo+
MS44LjMuNA0KDQo=
--
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