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


Groups > linux.kernel > #1213737 > unrolled thread

[PATCH v3 0/6] perf probe, tracing/uprobes: Support probing at absolute address

Started byWang Nan <wangnan0@huawei.com>
First post2015-08-26 13:00 +0200
Last post2015-08-26 13:10 +0200
Articles 17 — 4 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v3 0/6] perf probe, tracing/uprobes: Support probing at absolute address Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:00 +0200
    [PATCH v3 6/6] tracing/uprobes: Do not print '0x (null)' when offset is 0 Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:00 +0200
      [tip:perf/core] tracing/uprobes: Do not print '0x (null)'   when offset is 0 tip-bot for Wang Nan <tipbot@zytor.com> - 2015-08-28 08:50 +0200
    [PATCH v3 2/6] perf probe: Fix list result when symbol can't be found Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:00 +0200
      RE: [PATCH v3 2/6] perf probe: Fix list result when symbol can't be  found 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-08-26 14:30 +0200
      [tip:perf/core] perf probe: Fix list result when symbol can'  t be found tip-bot for Wang Nan <tipbot@zytor.com> - 2015-08-28 08:50 +0200
    [PATCH v3 5/6] perf probe: Support probing at absolute address Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:00 +0200
      RE: [PATCH v3 5/6] perf probe: Support probing at absolute address 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-08-26 14:20 +0200
      [tip:perf/core] perf probe: Support probing at absolute address tip-bot for Wang Nan <tipbot@zytor.com> - 2015-08-28 08:50 +0200
    [PATCH v3 4/6] perf probe: Fix error reported when offset without function Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:00 +0200
      RE: [PATCH v3 4/6] perf probe: Fix error reported when offset  without function 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-08-26 14:30 +0200
      [tip:perf/core] perf probe:   Fix error reported when offset without function tip-bot for Wang Nan <tipbot@zytor.com> - 2015-08-28 08:50 +0200
    [PATCH v3 3/6] perf probe: Fix list result when address is zero Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:10 +0200
      RE: [PATCH v3 3/6] perf probe: Fix list result when address is zero 平松雅巳 / HIRAMATU,MASAMI   <masami.hiramatsu.pt@hitachi.com> - 2015-08-26 14:20 +0200
      [tip:perf/core] perf probe: Fix list result when address is zero tip-bot for Wang Nan <tipbot@zytor.com> - 2015-08-28 08:50 +0200
    Re: [PATCH v3 2/6] perf probe: Fix list result when neither dwarf  nor map can't find symbol "Wangnan (F)" <wangnan0@huawei.com> - 2015-08-26 13:10 +0200
    [PATCH v3 2/6] perf probe: Fix list result when neither dwarf nor map can't find symbol Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:10 +0200

#1213737 — [PATCH v3 0/6] perf probe, tracing/uprobes: Support probing at absolute address

FromWang Nan <wangnan0@huawei.com>
Date2015-08-26 13:00 +0200
Subject[PATCH v3 0/6] perf probe, tracing/uprobes: Support probing at absolute address
Message-ID<q1GAW-3v0-5@gated-at.bofh.it>
The goal of these 4 patches is to allow perf probing at absolute address
for uprobes and kprobes. During the development several small problem in
'perf probe -l' is found and fixed.

Patch v2 can be found from [1].

Following Masami's suggestion, v3 splits bugfixs into their own
patches instead of merging with feature.

In this series, patch 1/6 to 4/6 are small bugfix. Patch 5/6 is the main
patch which support the new syntax. Patch 6/6 is a kernel side small bugfix.

Patch 1/6 and 6/6 have already been acked by Masami Hiramatsu.

[1] http://lkml.kernel.org/r/1440574825-221187-1-git-send-email-wangnan0@huawei.com

Wang Nan (6):
  perf probe: Prevent segfault when reading probe point with absolute
    address
  perf probe: Fix list result when symbol can't be found
  perf probe: Fix list result when address is zero
  perf probe: Fix error reported when offset without function
  perf probe: Support probing at absolute address
  tracing/uprobes: Do not print '0x (null)' when offset is 0

 kernel/trace/trace_uprobe.c    |  17 +++-
 tools/perf/util/probe-event.c  | 210 +++++++++++++++++++++++++++++++++++++----
 tools/perf/util/probe-event.h  |   4 +
 tools/perf/util/probe-finder.c |  21 +----
 4 files changed, 216 insertions(+), 36 deletions(-)

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


#1213738 — [PATCH v3 6/6] tracing/uprobes: Do not print '0x (null)' when offset is 0

FromWang Nan <wangnan0@huawei.com>
Date2015-08-26 13:00 +0200
Subject[PATCH v3 6/6] tracing/uprobes: Do not print '0x (null)' when offset is 0
Message-ID<q1GAW-3v0-11@gated-at.bofh.it>
In reply to#1213737
When manually added uprobe point with zero address, 'uprobe_events' output
'(null)' instead of 0x00000000:

 # echo p:probe_libc/abs_0 /path/to/lib.bin:0x0 arg1=%ax > \
            /sys/kernel/debug/tracing/uprobe_events

 # cat /sys/kernel/debug/tracing/uprobe_events
   p:probe_libc/abs_0 /path/to/lib.bin:0x          (null) arg1=%ax

This patch fixes this behavior:

 # cat /sys/kernel/debug/tracing/uprobe_events
 p:probe_libc/abs_0 /path/to/lib.bin:0x0000000000000000

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 kernel/trace/trace_uprobe.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
index f97479f..d2f6d0b 100644
--- a/kernel/trace/trace_uprobe.c
+++ b/kernel/trace/trace_uprobe.c
@@ -601,7 +601,22 @@ static int probes_seq_show(struct seq_file *m, void *v)
 
 	seq_printf(m, "%c:%s/%s", c, tu->tp.call.class->system,
 			trace_event_name(&tu->tp.call));
-	seq_printf(m, " %s:0x%p", tu->filename, (void *)tu->offset);
+	seq_printf(m, " %s:", tu->filename);
+
+	/* Don't print "0x  (null)" when offset is 0 */
+	if (tu->offset) {
+		seq_printf(m, "0x%p", (void *)tu->offset);
+	} else {
+		switch (sizeof(void *)) {
+		case 4:
+			seq_printf(m, "0x00000000");
+			break;
+		case 8:
+		default:
+			seq_printf(m, "0x0000000000000000");
+			break;
+		}
+	}
 
 	for (i = 0; i < tu->tp.nr_args; i++)
 		seq_printf(m, " %s=%s", tu->tp.args[i].name, tu->tp.args[i].comm);
-- 
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] | [prev] | [next] | [standalone]


#1215142 — [tip:perf/core] tracing/uprobes: Do not print '0x (null)' when offset is 0

Fromtip-bot for Wang Nan <tipbot@zytor.com>
Date2015-08-28 08:50 +0200
Subject[tip:perf/core] tracing/uprobes: Do not print '0x (null)' when offset is 0
Message-ID<q2lE7-3R6-29@gated-at.bofh.it>
In reply to#1213738
Commit-ID:  a2fb3382edbea83c6f2bf6ac15e3673b2e254aad
Gitweb:     http://git.kernel.org/tip/a2fb3382edbea83c6f2bf6ac15e3673b2e254aad
Author:     Wang Nan <wangnan0@huawei.com>
AuthorDate: Wed, 26 Aug 2015 10:57:46 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 26 Aug 2015 10:43:01 -0300

tracing/uprobes: Do not print '0x (null)' when offset is 0

When manually added uprobe point with zero address, 'uprobe_events'
output '(null)' instead of 0x00000000:

  # echo p:probe_libc/abs_0 /path/to/lib.bin:0x0 arg1=%ax > \
            /sys/kernel/debug/tracing/uprobe_events

  # cat /sys/kernel/debug/tracing/uprobe_events
    p:probe_libc/abs_0 /path/to/lib.bin:0x          (null) arg1=%ax

 This patch fixes this behavior:

  # cat /sys/kernel/debug/tracing/uprobe_events
  p:probe_libc/abs_0 /path/to/lib.bin:0x0000000000000000

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1440586666-235233-8-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 kernel/trace/trace_uprobe.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
index f97479f..d2f6d0b 100644
--- a/kernel/trace/trace_uprobe.c
+++ b/kernel/trace/trace_uprobe.c
@@ -601,7 +601,22 @@ static int probes_seq_show(struct seq_file *m, void *v)
 
 	seq_printf(m, "%c:%s/%s", c, tu->tp.call.class->system,
 			trace_event_name(&tu->tp.call));
-	seq_printf(m, " %s:0x%p", tu->filename, (void *)tu->offset);
+	seq_printf(m, " %s:", tu->filename);
+
+	/* Don't print "0x  (null)" when offset is 0 */
+	if (tu->offset) {
+		seq_printf(m, "0x%p", (void *)tu->offset);
+	} else {
+		switch (sizeof(void *)) {
+		case 4:
+			seq_printf(m, "0x00000000");
+			break;
+		case 8:
+		default:
+			seq_printf(m, "0x0000000000000000");
+			break;
+		}
+	}
 
 	for (i = 0; i < tu->tp.nr_args; i++)
 		seq_printf(m, " %s=%s", tu->tp.args[i].name, tu->tp.args[i].comm);
--
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]


#1213739 — [PATCH v3 2/6] perf probe: Fix list result when symbol can't be found

FromWang Nan <wangnan0@huawei.com>
Date2015-08-26 13:00 +0200
Subject[PATCH v3 2/6] perf probe: Fix list result when symbol can't be found
Message-ID<q1GAW-3v0-9@gated-at.bofh.it>
In reply to#1213737
'perf probe -l' reports error if it is unable find symbol through
address. Here is an example.

 # echo 'p:probe_libc/abs_5 /lib64/libc.so.6:0x5' >
          /sys/kernel/debug/tracing/uprobe_events
 # cat /sys/kernel/debug/tracing/uprobe_events
  p:probe_libc/abs_5 /lib64/libc.so.6:0x0000000000000005
 # perf probe -l
   Error: Failed to show event list

Also, this situation triggers a logical inconsistency in
convert_to_perf_probe_point() that, it returns ENOMEM but actually
it never try strdup().

This patch removes !tp->module && !is_kprobe condition, so it
always uses address to build function name if symbol not found.

Test result:

 # perf probe -l
   probe_libc:abs_5     (on 0x5 in /lib64/libc.so.6)

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 tools/perf/util/probe-event.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 6c7e538..f7bacbb 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1866,7 +1866,7 @@ static int convert_to_perf_probe_point(struct probe_trace_point *tp,
 	if (tp->symbol) {
 		pp->function = strdup(tp->symbol);
 		pp->offset = tp->offset;
-	} else if (!tp->module && !is_kprobe) {
+	} else {
 		ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address);
 		if (ret < 0)
 			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] | [prev] | [next] | [standalone]


#1213790 — RE: [PATCH v3 2/6] perf probe: Fix list result when symbol can't be found

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-08-26 14:30 +0200
SubjectRE: [PATCH v3 2/6] perf probe: Fix list result when symbol can't be found
Message-ID<q1I02-5Dg-13@gated-at.bofh.it>
In reply to#1213739
PiBGcm9tOiBXYW5nIE5hbiBbbWFpbHRvOndhbmduYW4wQGh1YXdlaS5jb21dDQo+IA0KPiAncGVy
ZiBwcm9iZSAtbCcgcmVwb3J0cyBlcnJvciBpZiBpdCBpcyB1bmFibGUgZmluZCBzeW1ib2wgdGhy
b3VnaA0KPiBhZGRyZXNzLiBIZXJlIGlzIGFuIGV4YW1wbGUuDQo+IA0KPiAgIyBlY2hvICdwOnBy
b2JlX2xpYmMvYWJzXzUgL2xpYjY0L2xpYmMuc28uNjoweDUnID4NCj4gICAgICAgICAgIC9zeXMv
a2VybmVsL2RlYnVnL3RyYWNpbmcvdXByb2JlX2V2ZW50cw0KPiAgIyBjYXQgL3N5cy9rZXJuZWwv
ZGVidWcvdHJhY2luZy91cHJvYmVfZXZlbnRzDQo+ICAgcDpwcm9iZV9saWJjL2Fic181IC9saWI2
NC9saWJjLnNvLjY6MHgwMDAwMDAwMDAwMDAwMDA1DQo+ICAjIHBlcmYgcHJvYmUgLWwNCj4gICAg
RXJyb3I6IEZhaWxlZCB0byBzaG93IGV2ZW50IGxpc3QNCj4gDQo+IEFsc28sIHRoaXMgc2l0dWF0
aW9uIHRyaWdnZXJzIGEgbG9naWNhbCBpbmNvbnNpc3RlbmN5IGluDQo+IGNvbnZlcnRfdG9fcGVy
Zl9wcm9iZV9wb2ludCgpIHRoYXQsIGl0IHJldHVybnMgRU5PTUVNIGJ1dCBhY3R1YWxseQ0KPiBp
dCBuZXZlciB0cnkgc3RyZHVwKCkuDQo+IA0KPiBUaGlzIHBhdGNoIHJlbW92ZXMgIXRwLT5tb2R1
bGUgJiYgIWlzX2twcm9iZSBjb25kaXRpb24sIHNvIGl0DQo+IGFsd2F5cyB1c2VzIGFkZHJlc3Mg
dG8gYnVpbGQgZnVuY3Rpb24gbmFtZSBpZiBzeW1ib2wgbm90IGZvdW5kLg0KPiANCj4gVGVzdCBy
ZXN1bHQ6DQo+IA0KPiAgIyBwZXJmIHByb2JlIC1sDQo+ICAgIHByb2JlX2xpYmM6YWJzXzUgICAg
IChvbiAweDUgaW4gL2xpYjY0L2xpYmMuc28uNikNCj4gDQoNCkxvb2tzIGdvb2QhDQoNCkFja2Vk
LWJ5OiBNYXNhbWkgSGlyYW1hdHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29tPg0K
DQpUaGFuayB5b3UhDQoNCj4gU2lnbmVkLW9mZi1ieTogV2FuZyBOYW4gPHdhbmduYW4wQGh1YXdl
aS5jb20+DQo+IENjOiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAa2VybmVsLm9yZz4N
Cj4gQ2M6IEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPg0KPiBDYzogTWFzYW1pIEhpcmFt
YXRzdSA8bWFzYW1pLmhpcmFtYXRzdS5wdEBoaXRhY2hpLmNvbT4NCj4gQ2M6IE5hbWh5dW5nIEtp
bSA8bmFtaHl1bmdAa2VybmVsLm9yZz4NCj4gQ2M6IFN0ZXZlbiBSb3N0ZWR0IDxyb3N0ZWR0QGdv
b2RtaXMub3JnPg0KPiAtLS0NCj4gIHRvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jIHwgMiAr
LQ0KPiAgMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCAxIGRlbGV0aW9uKC0pDQo+IA0K
PiBkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMgYi90b29scy9wZXJm
L3V0aWwvcHJvYmUtZXZlbnQuYw0KPiBpbmRleCA2YzdlNTM4Li5mN2JhY2JiIDEwMDY0NA0KPiAt
LS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYw0KPiArKysgYi90b29scy9wZXJmL3V0
aWwvcHJvYmUtZXZlbnQuYw0KPiBAQCAtMTg2Niw3ICsxODY2LDcgQEAgc3RhdGljIGludCBjb252
ZXJ0X3RvX3BlcmZfcHJvYmVfcG9pbnQoc3RydWN0IHByb2JlX3RyYWNlX3BvaW50ICp0cCwNCj4g
IAlpZiAodHAtPnN5bWJvbCkgew0KPiAgCQlwcC0+ZnVuY3Rpb24gPSBzdHJkdXAodHAtPnN5bWJv
bCk7DQo+ICAJCXBwLT5vZmZzZXQgPSB0cC0+b2Zmc2V0Ow0KPiAtCX0gZWxzZSBpZiAoIXRwLT5t
b2R1bGUgJiYgIWlzX2twcm9iZSkgew0KPiArCX0gZWxzZSB7DQo+ICAJCXJldCA9IGVfc25wcmlu
dGYoYnVmLCAxMjgsICIweCUiIFBSSXg2NCwgKHU2NCl0cC0+YWRkcmVzcyk7DQo+ICAJCWlmIChy
ZXQgPCAwKQ0KPiAgCQkJcmV0dXJuIHJldDsNCj4gLS0NCj4gMS44LjMuNA0KDQo=
--
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]


#1215139 — [tip:perf/core] perf probe: Fix list result when symbol can' t be found

Fromtip-bot for Wang Nan <tipbot@zytor.com>
Date2015-08-28 08:50 +0200
Subject[tip:perf/core] perf probe: Fix list result when symbol can' t be found
Message-ID<q2lE6-3R6-17@gated-at.bofh.it>
In reply to#1213739
Commit-ID:  614e2fdbd79b47ddf63a1ccd3f2343e98c3077fb
Gitweb:     http://git.kernel.org/tip/614e2fdbd79b47ddf63a1ccd3f2343e98c3077fb
Author:     Wang Nan <wangnan0@huawei.com>
AuthorDate: Wed, 26 Aug 2015 10:57:42 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 26 Aug 2015 10:36:04 -0300

perf probe: Fix list result when symbol can't be found

'perf probe -l' reports error if it is unable find symbol through
address. Here is an example.

  # echo 'p:probe_libc/abs_5 /lib64/libc.so.6:0x5' >
          /sys/kernel/debug/tracing/uprobe_events
  # cat /sys/kernel/debug/tracing/uprobe_events
   p:probe_libc/abs_5 /lib64/libc.so.6:0x0000000000000005
  # perf probe -l
    Error: Failed to show event list

Also, this situation triggers a logical inconsistency in
convert_to_perf_probe_point() that, it returns ENOMEM but actually it
never try strdup().

This patch removes !tp->module && !is_kprobe condition, so it always
uses address to build function name if symbol not found.

Test result:

  # perf probe -l
    probe_libc:abs_5     (on 0x5 in /lib64/libc.so.6)

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1440586666-235233-4-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/probe-event.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 6c7e538..f7bacbb 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1866,7 +1866,7 @@ static int convert_to_perf_probe_point(struct probe_trace_point *tp,
 	if (tp->symbol) {
 		pp->function = strdup(tp->symbol);
 		pp->offset = tp->offset;
-	} else if (!tp->module && !is_kprobe) {
+	} else {
 		ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address);
 		if (ret < 0)
 			return ret;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1213740 — [PATCH v3 5/6] perf probe: Support probing at absolute address

FromWang Nan <wangnan0@huawei.com>
Date2015-08-26 13:00 +0200
Subject[PATCH v3 5/6] perf probe: Support probing at absolute address
Message-ID<q1GAW-3v0-17@gated-at.bofh.it>
In reply to#1213737
It should be useful to allow 'perf probe' probe at absolute offset of
a target. For example, when (u)probing at a instruction of a shared
object in a embedded system where debuginfo is not avaliable but we
know the offset of that instruction by manually digging.

This patch enables following perf probe command syntax:

 # perf probe 0xffffffff811e6615

And

 # perf probe /lib/x86_64-linux-gnu/libc-2.19.so 0xeb860

In the above example, we don't need a anchor symbol, so it is possible
to compute absolute addresses using other methods and then use
'perf probe' to create the probing points.

v1 -> v2:
  Drop the leading '+' in cmdline;
  Allow uprobing at offset 0x0;
  Improve 'perf probe -l' result when uprobe at area without debuginfo.

v2 -> v3:
  Split bugfix to a separated patch.

Test result:

 # perf probe 0xffffffff8119d175 %ax
 # perf probe sys_write %ax
 # perf probe /lib64/libc-2.18.so 0x0 %ax
 # perf probe /lib64/libc-2.18.so 0x5 %ax
 # perf probe /lib64/libc-2.18.so 0xd8e40 %ax
 # perf probe /lib64/libc-2.18.so __write %ax
 # perf probe /lib64/libc-2.18.so 0xd8e49 %ax
 # cat /sys/kernel/debug/tracing/uprobe_events

 p:probe_libc/abs_0 /lib64/libc-2.18.so:0x          (null) arg1=%ax
 p:probe_libc/abs_5 /lib64/libc-2.18.so:0x0000000000000005 arg1=%ax
 p:probe_libc/abs_d8e40 /lib64/libc-2.18.so:0x00000000000d8e40 arg1=%ax
 p:probe_libc/__write /lib64/libc-2.18.so:0x00000000000d8e40 arg1=%ax
 p:probe_libc/abs_d8e49 /lib64/libc-2.18.so:0x00000000000d8e49 arg1=%ax

 # cat /sys/kernel/debug/tracing/kprobe_events

 p:probe/abs_ffffffff8119d175 0xffffffff8119d175 arg1=%ax
 p:probe/sys_write _text+1692016 arg1=%ax

 # perf probe -l

 Failed to find debug information for address 5
   probe:abs_ffffffff8119d175 (on sys_write+5 with arg1)
   probe:sys_write      (on sys_write with arg1)
   probe_libc:__write   (on @unix/syscall-template.S:81 in /lib64/libc-2.18.so with arg1)
   probe_libc:abs_0     (on 0x0 in /lib64/libc-2.18.so with arg1)
   probe_libc:abs_5     (on 0x5 in /lib64/libc-2.18.so with arg1)
   probe_libc:abs_d8e40 (on @unix/syscall-template.S:81 in /lib64/libc-2.18.so with arg1)
   probe_libc:abs_d8e49 (on __GI___libc_write+9 in /lib64/libc-2.18.so with arg1)

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 tools/perf/util/probe-event.c  | 162 +++++++++++++++++++++++++++++++++++++++--
 tools/perf/util/probe-event.h  |   4 +
 tools/perf/util/probe-finder.c |  21 +-----
 3 files changed, 163 insertions(+), 24 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index eaacb58..eb5f18b 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1204,9 +1204,27 @@ static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev)
 
 	if (file_spec)
 		pp->file = tmp;
-	else
+	else {
 		pp->function = tmp;
 
+		/*
+		 * Keep pp->function even if this is absolute address,
+		 * so it can mark whether abs_address is valid.
+		 * Which make 'perf probe lib.bin 0x0' possible.
+		 *
+		 * Note that checking length of tmp is not needed
+		 * because when we access tmp[1] we know tmp[0] is '0',
+		 * so tmp[1] should always valid (but could be '\0').
+		 */
+		if (tmp && !strncmp(tmp, "0x", 2)) {
+			pp->abs_address = strtoul(pp->function, &tmp, 0);
+			if (*tmp != '\0') {
+				semantic_error("Invalid absolute address.\n");
+				return -EINVAL;
+			}
+		}
+	}
+
 	/* Parse other options */
 	while (ptr) {
 		arg = ptr;
@@ -1804,14 +1822,29 @@ char *synthesize_probe_trace_command(struct probe_trace_event *tev)
 	if (len <= 0)
 		goto error;
 
-	/* Uprobes must have tp->address and tp->module */
-	if (tev->uprobes && (!tp->address || !tp->module))
+	/* Uprobes must have tp->module */
+	if (tev->uprobes && !tp->module)
 		goto error;
+	/*
+	 * If tp->address == 0, then this point must be a
+	 * absolute address uprobe.
+	 * try_to_find_absolute_address() should have made
+	 * tp->symbol to "0x0".
+	 */
+	if (tev->uprobes && !tp->address) {
+		if (!tp->symbol || strcmp(tp->symbol, "0x0"))
+			goto error;
+	}
 
 	/* Use the tp->address for uprobes */
 	if (tev->uprobes)
 		ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s:0x%lx",
 				 tp->module, tp->address);
+	else if (!strncmp(tp->symbol, "0x", 2))
+		/* Absolute address. See try_to_find_absolute_address() */
+		ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s0x%lx",
+				 tp->module ?: "", tp->module ? ":" : "",
+				 tp->address);
 	else
 		ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s%s+%lu",
 				 tp->module ?: "", tp->module ? ":" : "",
@@ -1874,8 +1907,8 @@ out:
 }
 
 static int convert_to_perf_probe_point(struct probe_trace_point *tp,
-					struct perf_probe_point *pp,
-					bool is_kprobe)
+				       struct perf_probe_point *pp,
+				       bool is_kprobe)
 {
 	char buf[128];
 	int ret;
@@ -2331,7 +2364,9 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
 	if (pev->event)
 		event = pev->event;
 	else
-		if (pev->point.function && !strisglob(pev->point.function))
+		if (pev->point.function &&
+			(strncmp(pev->point.function, "0x", 2) != 0) &&
+			!strisglob(pev->point.function))
 			event = pev->point.function;
 		else
 			event = tev->point.realname;
@@ -2598,6 +2633,98 @@ err_out:
 	goto out;
 }
 
+static int try_to_find_absolute_address(struct perf_probe_event *pev,
+					struct probe_trace_event **tevs)
+{
+	struct perf_probe_point *pp = &pev->point;
+	struct probe_trace_event *tev;
+	struct probe_trace_point *tp;
+	int i, err;
+
+	if (!(pev->point.function && !strncmp(pev->point.function, "0x", 2)))
+		return -EINVAL;
+	if (perf_probe_event_need_dwarf(pev))
+		return -EINVAL;
+
+	/*
+	 * This is 'perf probe /lib/libc.so 0xabcd'. Try to probe at
+	 * absolute address.
+	 *
+	 * Only one tev can be generated by this.
+	 */
+	*tevs = zalloc(sizeof(*tev));
+	if (!*tevs)
+		return -ENOMEM;
+
+	tev = *tevs;
+	tp = &tev->point;
+
+	/*
+	 * Don't use tp->offset, use address directly, because
+	 * in synthesize_probe_trace_command() address cannot be
+	 * zero.
+	 */
+	tp->address = pev->point.abs_address;
+	tp->retprobe = pp->retprobe;
+	tev->uprobes = pev->uprobes;
+
+	err = -ENOMEM;
+	/*
+	 * Give it a '0x' leading symbol name.
+	 * In __add_probe_trace_events, a NULL symbol is interpreted as
+	 * invalud.
+	 */
+	if (asprintf(&tp->symbol, "0x%lx", tp->address) < 0)
+		goto errout;
+
+	/* For kprobe, check range */
+	if ((!tev->uprobes) &&
+	    (kprobe_warn_out_range(tev->point.symbol,
+				   tev->point.address))) {
+		err = -EACCES;
+		goto errout;
+	}
+
+	if (asprintf(&tp->realname, "abs_%lx", tp->address) < 0)
+		goto errout;
+
+	if (pev->target) {
+		tp->module = strdup(pev->target);
+		if (!tp->module)
+			goto errout;
+	}
+
+	if (tev->group) {
+		tev->group = strdup(pev->group);
+		if (!tev->group)
+			goto errout;
+	}
+
+	if (pev->event) {
+		tev->event = strdup(pev->event);
+		if (!tev->event)
+			goto errout;
+	}
+
+	tev->nargs = pev->nargs;
+	tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs);
+	if (!tev->args) {
+		err = -ENOMEM;
+		goto errout;
+	}
+	for (i = 0; i < tev->nargs; i++)
+		copy_to_probe_trace_arg(&tev->args[i], &pev->args[i]);
+
+	return 1;
+
+errout:
+	if (*tevs) {
+		clear_probe_trace_events(*tevs, 1);
+		*tevs = NULL;
+	}
+	return err;
+}
+
 bool __weak arch__prefers_symtab(void) { return false; }
 
 static int convert_to_probe_trace_events(struct perf_probe_event *pev,
@@ -2614,6 +2741,10 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
 		}
 	}
 
+	ret = try_to_find_absolute_address(pev, tevs);
+	if (ret > 0)
+		return ret;
+
 	if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) {
 		ret = find_probe_trace_events_from_map(pev, tevs);
 		if (ret > 0)
@@ -2784,3 +2915,22 @@ end:
 	return ret;
 }
 
+int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
+			    struct perf_probe_arg *pvar)
+{
+	tvar->value = strdup(pvar->var);
+	if (tvar->value == NULL)
+		return -ENOMEM;
+	if (pvar->type) {
+		tvar->type = strdup(pvar->type);
+		if (tvar->type == NULL)
+			return -ENOMEM;
+	}
+	if (pvar->name) {
+		tvar->name = strdup(pvar->name);
+		if (tvar->name == NULL)
+			return -ENOMEM;
+	} else
+		tvar->name = NULL;
+	return 0;
+}
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 83ee95e..6e7ec68 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -59,6 +59,7 @@ struct perf_probe_point {
 	bool		retprobe;	/* Return probe flag */
 	char		*lazy_line;	/* Lazy matching pattern */
 	unsigned long	offset;		/* Offset from function entry */
+	unsigned long	abs_address;	/* Absolute address of the point */
 };
 
 /* Perf probe probing argument field chain */
@@ -156,4 +157,7 @@ int e_snprintf(char *str, size_t size, const char *format, ...)
 /* Maximum index number of event-name postfix */
 #define MAX_EVENT_INDEX	1024
 
+int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
+			    struct perf_probe_arg *pvar);
+
 #endif /*_PROBE_EVENT_H */
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 7b80f8c..29c43c068 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -553,24 +553,9 @@ static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf)
 	char buf[32], *ptr;
 	int ret = 0;
 
-	if (!is_c_varname(pf->pvar->var)) {
-		/* Copy raw parameters */
-		pf->tvar->value = strdup(pf->pvar->var);
-		if (pf->tvar->value == NULL)
-			return -ENOMEM;
-		if (pf->pvar->type) {
-			pf->tvar->type = strdup(pf->pvar->type);
-			if (pf->tvar->type == NULL)
-				return -ENOMEM;
-		}
-		if (pf->pvar->name) {
-			pf->tvar->name = strdup(pf->pvar->name);
-			if (pf->tvar->name == NULL)
-				return -ENOMEM;
-		} else
-			pf->tvar->name = NULL;
-		return 0;
-	}
+	/* Copy raw parameters */
+	if (!is_c_varname(pf->pvar->var))
+		return copy_to_probe_trace_arg(pf->tvar, pf->pvar);
 
 	if (pf->pvar->name)
 		pf->tvar->name = strdup(pf->pvar->name);
-- 
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] | [prev] | [next] | [standalone]


#1213784 — RE: [PATCH v3 5/6] perf probe: Support probing at absolute address

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-08-26 14:20 +0200
SubjectRE: [PATCH v3 5/6] perf probe: Support probing at absolute address
Message-ID<q1HQm-5s4-19@gated-at.bofh.it>
In reply to#1213740
PiBGcm9tOiBXYW5nIE5hbiBbbWFpbHRvOndhbmduYW4wQGh1YXdlaS5jb21dDQo+IA0KPiBJdCBz
aG91bGQgYmUgdXNlZnVsIHRvIGFsbG93ICdwZXJmIHByb2JlJyBwcm9iZSBhdCBhYnNvbHV0ZSBv
ZmZzZXQgb2YNCj4gYSB0YXJnZXQuIEZvciBleGFtcGxlLCB3aGVuICh1KXByb2JpbmcgYXQgYSBp
bnN0cnVjdGlvbiBvZiBhIHNoYXJlZA0KPiBvYmplY3QgaW4gYSBlbWJlZGRlZCBzeXN0ZW0gd2hl
cmUgZGVidWdpbmZvIGlzIG5vdCBhdmFsaWFibGUgYnV0IHdlDQo+IGtub3cgdGhlIG9mZnNldCBv
ZiB0aGF0IGluc3RydWN0aW9uIGJ5IG1hbnVhbGx5IGRpZ2dpbmcuDQo+IA0KPiBUaGlzIHBhdGNo
IGVuYWJsZXMgZm9sbG93aW5nIHBlcmYgcHJvYmUgY29tbWFuZCBzeW50YXg6DQo+IA0KPiAgIyBw
ZXJmIHByb2JlIDB4ZmZmZmZmZmY4MTFlNjYxNQ0KPiANCj4gQW5kDQo+IA0KPiAgIyBwZXJmIHBy
b2JlIC9saWIveDg2XzY0LWxpbnV4LWdudS9saWJjLTIuMTkuc28gMHhlYjg2MA0KPiANCj4gSW4g
dGhlIGFib3ZlIGV4YW1wbGUsIHdlIGRvbid0IG5lZWQgYSBhbmNob3Igc3ltYm9sLCBzbyBpdCBp
cyBwb3NzaWJsZQ0KPiB0byBjb21wdXRlIGFic29sdXRlIGFkZHJlc3NlcyB1c2luZyBvdGhlciBt
ZXRob2RzIGFuZCB0aGVuIHVzZQ0KPiAncGVyZiBwcm9iZScgdG8gY3JlYXRlIHRoZSBwcm9iaW5n
IHBvaW50cy4NCg0KT0ssIG5vdyBsb29rcyBnb29kIHRvIG1lIDpEDQoNCkFja2VkLWJ5OiBNYXNh
bWkgSGlyYW1hdHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29tPg0KDQpUaGFuayB5
b3UsDQoNCj4gDQo+IHYxIC0+IHYyOg0KPiAgIERyb3AgdGhlIGxlYWRpbmcgJysnIGluIGNtZGxp
bmU7DQo+ICAgQWxsb3cgdXByb2JpbmcgYXQgb2Zmc2V0IDB4MDsNCj4gICBJbXByb3ZlICdwZXJm
IHByb2JlIC1sJyByZXN1bHQgd2hlbiB1cHJvYmUgYXQgYXJlYSB3aXRob3V0IGRlYnVnaW5mby4N
Cj4gDQo+IHYyIC0+IHYzOg0KPiAgIFNwbGl0IGJ1Z2ZpeCB0byBhIHNlcGFyYXRlZCBwYXRjaC4N
Cj4gDQo+IFRlc3QgcmVzdWx0Og0KPiANCj4gICMgcGVyZiBwcm9iZSAweGZmZmZmZmZmODExOWQx
NzUgJWF4DQo+ICAjIHBlcmYgcHJvYmUgc3lzX3dyaXRlICVheA0KPiAgIyBwZXJmIHByb2JlIC9s
aWI2NC9saWJjLTIuMTguc28gMHgwICVheA0KPiAgIyBwZXJmIHByb2JlIC9saWI2NC9saWJjLTIu
MTguc28gMHg1ICVheA0KPiAgIyBwZXJmIHByb2JlIC9saWI2NC9saWJjLTIuMTguc28gMHhkOGU0
MCAlYXgNCj4gICMgcGVyZiBwcm9iZSAvbGliNjQvbGliYy0yLjE4LnNvIF9fd3JpdGUgJWF4DQo+
ICAjIHBlcmYgcHJvYmUgL2xpYjY0L2xpYmMtMi4xOC5zbyAweGQ4ZTQ5ICVheA0KPiAgIyBjYXQg
L3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy91cHJvYmVfZXZlbnRzDQo+IA0KPiAgcDpwcm9iZV9s
aWJjL2Fic18wIC9saWI2NC9saWJjLTIuMTguc286MHggICAgICAgICAgKG51bGwpIGFyZzE9JWF4
DQo+ICBwOnByb2JlX2xpYmMvYWJzXzUgL2xpYjY0L2xpYmMtMi4xOC5zbzoweDAwMDAwMDAwMDAw
MDAwMDUgYXJnMT0lYXgNCj4gIHA6cHJvYmVfbGliYy9hYnNfZDhlNDAgL2xpYjY0L2xpYmMtMi4x
OC5zbzoweDAwMDAwMDAwMDAwZDhlNDAgYXJnMT0lYXgNCj4gIHA6cHJvYmVfbGliYy9fX3dyaXRl
IC9saWI2NC9saWJjLTIuMTguc286MHgwMDAwMDAwMDAwMGQ4ZTQwIGFyZzE9JWF4DQo+ICBwOnBy
b2JlX2xpYmMvYWJzX2Q4ZTQ5IC9saWI2NC9saWJjLTIuMTguc286MHgwMDAwMDAwMDAwMGQ4ZTQ5
IGFyZzE9JWF4DQo+IA0KPiAgIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy9rcHJvYmVf
ZXZlbnRzDQo+IA0KPiAgcDpwcm9iZS9hYnNfZmZmZmZmZmY4MTE5ZDE3NSAweGZmZmZmZmZmODEx
OWQxNzUgYXJnMT0lYXgNCj4gIHA6cHJvYmUvc3lzX3dyaXRlIF90ZXh0KzE2OTIwMTYgYXJnMT0l
YXgNCj4gDQo+ICAjIHBlcmYgcHJvYmUgLWwNCj4gDQo+ICBGYWlsZWQgdG8gZmluZCBkZWJ1ZyBp
bmZvcm1hdGlvbiBmb3IgYWRkcmVzcyA1DQo+ICAgIHByb2JlOmFic19mZmZmZmZmZjgxMTlkMTc1
IChvbiBzeXNfd3JpdGUrNSB3aXRoIGFyZzEpDQo+ICAgIHByb2JlOnN5c193cml0ZSAgICAgIChv
biBzeXNfd3JpdGUgd2l0aCBhcmcxKQ0KPiAgICBwcm9iZV9saWJjOl9fd3JpdGUgICAob24gQHVu
aXgvc3lzY2FsbC10ZW1wbGF0ZS5TOjgxIGluIC9saWI2NC9saWJjLTIuMTguc28gd2l0aCBhcmcx
KQ0KPiAgICBwcm9iZV9saWJjOmFic18wICAgICAob24gMHgwIGluIC9saWI2NC9saWJjLTIuMTgu
c28gd2l0aCBhcmcxKQ0KPiAgICBwcm9iZV9saWJjOmFic181ICAgICAob24gMHg1IGluIC9saWI2
NC9saWJjLTIuMTguc28gd2l0aCBhcmcxKQ0KPiAgICBwcm9iZV9saWJjOmFic19kOGU0MCAob24g
QHVuaXgvc3lzY2FsbC10ZW1wbGF0ZS5TOjgxIGluIC9saWI2NC9saWJjLTIuMTguc28gd2l0aCBh
cmcxKQ0KPiAgICBwcm9iZV9saWJjOmFic19kOGU0OSAob24gX19HSV9fX2xpYmNfd3JpdGUrOSBp
biAvbGliNjQvbGliYy0yLjE4LnNvIHdpdGggYXJnMSkNCj4gDQo+IFNpZ25lZC1vZmYtYnk6IFdh
bmcgTmFuIDx3YW5nbmFuMEBodWF3ZWkuY29tPg0KPiBDYzogQXJuYWxkbyBDYXJ2YWxobyBkZSBN
ZWxvIDxhY21lQGtlcm5lbC5vcmc+DQo+IENjOiBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNv
bT4NCj4gQ2M6IE1hc2FtaSBIaXJhbWF0c3UgPG1hc2FtaS5oaXJhbWF0c3UucHRAaGl0YWNoaS5j
b20+DQo+IENjOiBOYW1oeXVuZyBLaW0gPG5hbWh5dW5nQGtlcm5lbC5vcmc+DQo+IENjOiBTdGV2
ZW4gUm9zdGVkdCA8cm9zdGVkdEBnb29kbWlzLm9yZz4NCj4gLS0tDQo+ICB0b29scy9wZXJmL3V0
aWwvcHJvYmUtZXZlbnQuYyAgfCAxNjIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrLS0NCj4gIHRvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oICB8ICAgNCArDQo+ICB0
b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMgfCAgMjEgKy0tLS0tDQo+ICAzIGZpbGVzIGNo
YW5nZWQsIDE2MyBpbnNlcnRpb25zKCspLCAyNCBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1n
aXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9i
ZS1ldmVudC5jDQo+IGluZGV4IGVhYWNiNTguLmViNWYxOGIgMTAwNjQ0DQo+IC0tLSBhL3Rvb2xz
L3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jDQo+ICsrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1l
dmVudC5jDQo+IEBAIC0xMjA0LDkgKzEyMDQsMjcgQEAgc3RhdGljIGludCBwYXJzZV9wZXJmX3By
b2JlX3BvaW50KGNoYXIgKmFyZywgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldikNCj4gDQo+
ICAJaWYgKGZpbGVfc3BlYykNCj4gIAkJcHAtPmZpbGUgPSB0bXA7DQo+IC0JZWxzZQ0KPiArCWVs
c2Ugew0KPiAgCQlwcC0+ZnVuY3Rpb24gPSB0bXA7DQo+IA0KPiArCQkvKg0KPiArCQkgKiBLZWVw
IHBwLT5mdW5jdGlvbiBldmVuIGlmIHRoaXMgaXMgYWJzb2x1dGUgYWRkcmVzcywNCj4gKwkJICog
c28gaXQgY2FuIG1hcmsgd2hldGhlciBhYnNfYWRkcmVzcyBpcyB2YWxpZC4NCj4gKwkJICogV2hp
Y2ggbWFrZSAncGVyZiBwcm9iZSBsaWIuYmluIDB4MCcgcG9zc2libGUuDQo+ICsJCSAqDQo+ICsJ
CSAqIE5vdGUgdGhhdCBjaGVja2luZyBsZW5ndGggb2YgdG1wIGlzIG5vdCBuZWVkZWQNCj4gKwkJ
ICogYmVjYXVzZSB3aGVuIHdlIGFjY2VzcyB0bXBbMV0gd2Uga25vdyB0bXBbMF0gaXMgJzAnLA0K
PiArCQkgKiBzbyB0bXBbMV0gc2hvdWxkIGFsd2F5cyB2YWxpZCAoYnV0IGNvdWxkIGJlICdcMCcp
Lg0KPiArCQkgKi8NCj4gKwkJaWYgKHRtcCAmJiAhc3RybmNtcCh0bXAsICIweCIsIDIpKSB7DQo+
ICsJCQlwcC0+YWJzX2FkZHJlc3MgPSBzdHJ0b3VsKHBwLT5mdW5jdGlvbiwgJnRtcCwgMCk7DQo+
ICsJCQlpZiAoKnRtcCAhPSAnXDAnKSB7DQo+ICsJCQkJc2VtYW50aWNfZXJyb3IoIkludmFsaWQg
YWJzb2x1dGUgYWRkcmVzcy5cbiIpOw0KPiArCQkJCXJldHVybiAtRUlOVkFMOw0KPiArCQkJfQ0K
PiArCQl9DQo+ICsJfQ0KPiArDQo+ICAJLyogUGFyc2Ugb3RoZXIgb3B0aW9ucyAqLw0KPiAgCXdo
aWxlIChwdHIpIHsNCj4gIAkJYXJnID0gcHRyOw0KPiBAQCAtMTgwNCwxNCArMTgyMiwyOSBAQCBj
aGFyICpzeW50aGVzaXplX3Byb2JlX3RyYWNlX2NvbW1hbmQoc3RydWN0IHByb2JlX3RyYWNlX2V2
ZW50ICp0ZXYpDQo+ICAJaWYgKGxlbiA8PSAwKQ0KPiAgCQlnb3RvIGVycm9yOw0KPiANCj4gLQkv
KiBVcHJvYmVzIG11c3QgaGF2ZSB0cC0+YWRkcmVzcyBhbmQgdHAtPm1vZHVsZSAqLw0KPiAtCWlm
ICh0ZXYtPnVwcm9iZXMgJiYgKCF0cC0+YWRkcmVzcyB8fCAhdHAtPm1vZHVsZSkpDQo+ICsJLyog
VXByb2JlcyBtdXN0IGhhdmUgdHAtPm1vZHVsZSAqLw0KPiArCWlmICh0ZXYtPnVwcm9iZXMgJiYg
IXRwLT5tb2R1bGUpDQo+ICAJCWdvdG8gZXJyb3I7DQo+ICsJLyoNCj4gKwkgKiBJZiB0cC0+YWRk
cmVzcyA9PSAwLCB0aGVuIHRoaXMgcG9pbnQgbXVzdCBiZSBhDQo+ICsJICogYWJzb2x1dGUgYWRk
cmVzcyB1cHJvYmUuDQo+ICsJICogdHJ5X3RvX2ZpbmRfYWJzb2x1dGVfYWRkcmVzcygpIHNob3Vs
ZCBoYXZlIG1hZGUNCj4gKwkgKiB0cC0+c3ltYm9sIHRvICIweDAiLg0KPiArCSAqLw0KPiArCWlm
ICh0ZXYtPnVwcm9iZXMgJiYgIXRwLT5hZGRyZXNzKSB7DQo+ICsJCWlmICghdHAtPnN5bWJvbCB8
fCBzdHJjbXAodHAtPnN5bWJvbCwgIjB4MCIpKQ0KPiArCQkJZ290byBlcnJvcjsNCj4gKwl9DQo+
IA0KPiAgCS8qIFVzZSB0aGUgdHAtPmFkZHJlc3MgZm9yIHVwcm9iZXMgKi8NCj4gIAlpZiAodGV2
LT51cHJvYmVzKQ0KPiAgCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiArIGxlbiwgTUFYX0NNRExFTiAt
IGxlbiwgIiVzOjB4JWx4IiwNCj4gIAkJCQkgdHAtPm1vZHVsZSwgdHAtPmFkZHJlc3MpOw0KPiAr
CWVsc2UgaWYgKCFzdHJuY21wKHRwLT5zeW1ib2wsICIweCIsIDIpKQ0KPiArCQkvKiBBYnNvbHV0
ZSBhZGRyZXNzLiBTZWUgdHJ5X3RvX2ZpbmRfYWJzb2x1dGVfYWRkcmVzcygpICovDQo+ICsJCXJl
dCA9IGVfc25wcmludGYoYnVmICsgbGVuLCBNQVhfQ01ETEVOIC0gbGVuLCAiJXMlczB4JWx4IiwN
Cj4gKwkJCQkgdHAtPm1vZHVsZSA/OiAiIiwgdHAtPm1vZHVsZSA/ICI6IiA6ICIiLA0KPiArCQkJ
CSB0cC0+YWRkcmVzcyk7DQo+ICAJZWxzZQ0KPiAgCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiArIGxl
biwgTUFYX0NNRExFTiAtIGxlbiwgIiVzJXMlcyslbHUiLA0KPiAgCQkJCSB0cC0+bW9kdWxlID86
ICIiLCB0cC0+bW9kdWxlID8gIjoiIDogIiIsDQo+IEBAIC0xODc0LDggKzE5MDcsOCBAQCBvdXQ6
DQo+ICB9DQo+IA0KPiAgc3RhdGljIGludCBjb252ZXJ0X3RvX3BlcmZfcHJvYmVfcG9pbnQoc3Ry
dWN0IHByb2JlX3RyYWNlX3BvaW50ICp0cCwNCj4gLQkJCQkJc3RydWN0IHBlcmZfcHJvYmVfcG9p
bnQgKnBwLA0KPiAtCQkJCQlib29sIGlzX2twcm9iZSkNCj4gKwkJCQkgICAgICAgc3RydWN0IHBl
cmZfcHJvYmVfcG9pbnQgKnBwLA0KPiArCQkJCSAgICAgICBib29sIGlzX2twcm9iZSkNCj4gIHsN
Cj4gIAljaGFyIGJ1ZlsxMjhdOw0KPiAgCWludCByZXQ7DQo+IEBAIC0yMzMxLDcgKzIzNjQsOSBA
QCBzdGF0aWMgaW50IHByb2JlX3RyYWNlX2V2ZW50X19zZXRfbmFtZShzdHJ1Y3QgcHJvYmVfdHJh
Y2VfZXZlbnQgKnRldiwNCj4gIAlpZiAocGV2LT5ldmVudCkNCj4gIAkJZXZlbnQgPSBwZXYtPmV2
ZW50Ow0KPiAgCWVsc2UNCj4gLQkJaWYgKHBldi0+cG9pbnQuZnVuY3Rpb24gJiYgIXN0cmlzZ2xv
YihwZXYtPnBvaW50LmZ1bmN0aW9uKSkNCj4gKwkJaWYgKHBldi0+cG9pbnQuZnVuY3Rpb24gJiYN
Cj4gKwkJCShzdHJuY21wKHBldi0+cG9pbnQuZnVuY3Rpb24sICIweCIsIDIpICE9IDApICYmDQo+
ICsJCQkhc3RyaXNnbG9iKHBldi0+cG9pbnQuZnVuY3Rpb24pKQ0KPiAgCQkJZXZlbnQgPSBwZXYt
PnBvaW50LmZ1bmN0aW9uOw0KPiAgCQllbHNlDQo+ICAJCQlldmVudCA9IHRldi0+cG9pbnQucmVh
bG5hbWU7DQo+IEBAIC0yNTk4LDYgKzI2MzMsOTggQEAgZXJyX291dDoNCj4gIAlnb3RvIG91dDsN
Cj4gIH0NCj4gDQo+ICtzdGF0aWMgaW50IHRyeV90b19maW5kX2Fic29sdXRlX2FkZHJlc3Moc3Ry
dWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwNCj4gKwkJCQkJc3RydWN0IHByb2JlX3RyYWNlX2V2
ZW50ICoqdGV2cykNCj4gK3sNCj4gKwlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAgPSAmcGV2
LT5wb2ludDsNCj4gKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldjsNCj4gKwlzdHJ1Y3Qg
cHJvYmVfdHJhY2VfcG9pbnQgKnRwOw0KPiArCWludCBpLCBlcnI7DQo+ICsNCj4gKwlpZiAoIShw
ZXYtPnBvaW50LmZ1bmN0aW9uICYmICFzdHJuY21wKHBldi0+cG9pbnQuZnVuY3Rpb24sICIweCIs
IDIpKSkNCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJaWYgKHBlcmZfcHJvYmVfZXZlbnRfbmVl
ZF9kd2FyZihwZXYpKQ0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArCS8qDQo+ICsJICog
VGhpcyBpcyAncGVyZiBwcm9iZSAvbGliL2xpYmMuc28gMHhhYmNkJy4gVHJ5IHRvIHByb2JlIGF0
DQo+ICsJICogYWJzb2x1dGUgYWRkcmVzcy4NCj4gKwkgKg0KPiArCSAqIE9ubHkgb25lIHRldiBj
YW4gYmUgZ2VuZXJhdGVkIGJ5IHRoaXMuDQo+ICsJICovDQo+ICsJKnRldnMgPSB6YWxsb2Moc2l6
ZW9mKCp0ZXYpKTsNCj4gKwlpZiAoISp0ZXZzKQ0KPiArCQlyZXR1cm4gLUVOT01FTTsNCj4gKw0K
PiArCXRldiA9ICp0ZXZzOw0KPiArCXRwID0gJnRldi0+cG9pbnQ7DQo+ICsNCj4gKwkvKg0KPiAr
CSAqIERvbid0IHVzZSB0cC0+b2Zmc2V0LCB1c2UgYWRkcmVzcyBkaXJlY3RseSwgYmVjYXVzZQ0K
PiArCSAqIGluIHN5bnRoZXNpemVfcHJvYmVfdHJhY2VfY29tbWFuZCgpIGFkZHJlc3MgY2Fubm90
IGJlDQo+ICsJICogemVyby4NCj4gKwkgKi8NCj4gKwl0cC0+YWRkcmVzcyA9IHBldi0+cG9pbnQu
YWJzX2FkZHJlc3M7DQo+ICsJdHAtPnJldHByb2JlID0gcHAtPnJldHByb2JlOw0KPiArCXRldi0+
dXByb2JlcyA9IHBldi0+dXByb2JlczsNCj4gKw0KPiArCWVyciA9IC1FTk9NRU07DQo+ICsJLyoN
Cj4gKwkgKiBHaXZlIGl0IGEgJzB4JyBsZWFkaW5nIHN5bWJvbCBuYW1lLg0KPiArCSAqIEluIF9f
YWRkX3Byb2JlX3RyYWNlX2V2ZW50cywgYSBOVUxMIHN5bWJvbCBpcyBpbnRlcnByZXRlZCBhcw0K
PiArCSAqIGludmFsdWQuDQo+ICsJICovDQo+ICsJaWYgKGFzcHJpbnRmKCZ0cC0+c3ltYm9sLCAi
MHglbHgiLCB0cC0+YWRkcmVzcykgPCAwKQ0KPiArCQlnb3RvIGVycm91dDsNCj4gKw0KPiArCS8q
IEZvciBrcHJvYmUsIGNoZWNrIHJhbmdlICovDQo+ICsJaWYgKCghdGV2LT51cHJvYmVzKSAmJg0K
PiArCSAgICAoa3Byb2JlX3dhcm5fb3V0X3JhbmdlKHRldi0+cG9pbnQuc3ltYm9sLA0KPiArCQkJ
CSAgIHRldi0+cG9pbnQuYWRkcmVzcykpKSB7DQo+ICsJCWVyciA9IC1FQUNDRVM7DQo+ICsJCWdv
dG8gZXJyb3V0Ow0KPiArCX0NCj4gKw0KPiArCWlmIChhc3ByaW50ZigmdHAtPnJlYWxuYW1lLCAi
YWJzXyVseCIsIHRwLT5hZGRyZXNzKSA8IDApDQo+ICsJCWdvdG8gZXJyb3V0Ow0KPiArDQo+ICsJ
aWYgKHBldi0+dGFyZ2V0KSB7DQo+ICsJCXRwLT5tb2R1bGUgPSBzdHJkdXAocGV2LT50YXJnZXQp
Ow0KPiArCQlpZiAoIXRwLT5tb2R1bGUpDQo+ICsJCQlnb3RvIGVycm91dDsNCj4gKwl9DQo+ICsN
Cj4gKwlpZiAodGV2LT5ncm91cCkgew0KPiArCQl0ZXYtPmdyb3VwID0gc3RyZHVwKHBldi0+Z3Jv
dXApOw0KPiArCQlpZiAoIXRldi0+Z3JvdXApDQo+ICsJCQlnb3RvIGVycm91dDsNCj4gKwl9DQo+
ICsNCj4gKwlpZiAocGV2LT5ldmVudCkgew0KPiArCQl0ZXYtPmV2ZW50ID0gc3RyZHVwKHBldi0+
ZXZlbnQpOw0KPiArCQlpZiAoIXRldi0+ZXZlbnQpDQo+ICsJCQlnb3RvIGVycm91dDsNCj4gKwl9
DQo+ICsNCj4gKwl0ZXYtPm5hcmdzID0gcGV2LT5uYXJnczsNCj4gKwl0ZXYtPmFyZ3MgPSB6YWxs
b2Moc2l6ZW9mKHN0cnVjdCBwcm9iZV90cmFjZV9hcmcpICogdGV2LT5uYXJncyk7DQo+ICsJaWYg
KCF0ZXYtPmFyZ3MpIHsNCj4gKwkJZXJyID0gLUVOT01FTTsNCj4gKwkJZ290byBlcnJvdXQ7DQo+
ICsJfQ0KPiArCWZvciAoaSA9IDA7IGkgPCB0ZXYtPm5hcmdzOyBpKyspDQo+ICsJCWNvcHlfdG9f
cHJvYmVfdHJhY2VfYXJnKCZ0ZXYtPmFyZ3NbaV0sICZwZXYtPmFyZ3NbaV0pOw0KPiArDQo+ICsJ
cmV0dXJuIDE7DQo+ICsNCj4gK2Vycm91dDoNCj4gKwlpZiAoKnRldnMpIHsNCj4gKwkJY2xlYXJf
cHJvYmVfdHJhY2VfZXZlbnRzKCp0ZXZzLCAxKTsNCj4gKwkJKnRldnMgPSBOVUxMOw0KPiArCX0N
Cj4gKwlyZXR1cm4gZXJyOw0KPiArfQ0KPiArDQo+ICBib29sIF9fd2VhayBhcmNoX19wcmVmZXJz
X3N5bXRhYih2b2lkKSB7IHJldHVybiBmYWxzZTsgfQ0KPiANCj4gIHN0YXRpYyBpbnQgY29udmVy
dF90b19wcm9iZV90cmFjZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwNCj4g
QEAgLTI2MTQsNiArMjc0MSwxMCBAQCBzdGF0aWMgaW50IGNvbnZlcnRfdG9fcHJvYmVfdHJhY2Vf
ZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsDQo+ICAJCX0NCj4gIAl9DQo+IA0K
PiArCXJldCA9IHRyeV90b19maW5kX2Fic29sdXRlX2FkZHJlc3MocGV2LCB0ZXZzKTsNCj4gKwlp
ZiAocmV0ID4gMCkNCj4gKwkJcmV0dXJuIHJldDsNCj4gKw0KPiAgCWlmIChhcmNoX19wcmVmZXJz
X3N5bXRhYigpICYmICFwZXJmX3Byb2JlX2V2ZW50X25lZWRfZHdhcmYocGV2KSkgew0KPiAgCQly
ZXQgPSBmaW5kX3Byb2JlX3RyYWNlX2V2ZW50c19mcm9tX21hcChwZXYsIHRldnMpOw0KPiAgCQlp
ZiAocmV0ID4gMCkNCj4gQEAgLTI3ODQsMyArMjkxNSwyMiBAQCBlbmQ6DQo+ICAJcmV0dXJuIHJl
dDsNCj4gIH0NCj4gDQo+ICtpbnQgY29weV90b19wcm9iZV90cmFjZV9hcmcoc3RydWN0IHByb2Jl
X3RyYWNlX2FyZyAqdHZhciwNCj4gKwkJCSAgICBzdHJ1Y3QgcGVyZl9wcm9iZV9hcmcgKnB2YXIp
DQo+ICt7DQo+ICsJdHZhci0+dmFsdWUgPSBzdHJkdXAocHZhci0+dmFyKTsNCj4gKwlpZiAodHZh
ci0+dmFsdWUgPT0gTlVMTCkNCj4gKwkJcmV0dXJuIC1FTk9NRU07DQo+ICsJaWYgKHB2YXItPnR5
cGUpIHsNCj4gKwkJdHZhci0+dHlwZSA9IHN0cmR1cChwdmFyLT50eXBlKTsNCj4gKwkJaWYgKHR2
YXItPnR5cGUgPT0gTlVMTCkNCj4gKwkJCXJldHVybiAtRU5PTUVNOw0KPiArCX0NCj4gKwlpZiAo
cHZhci0+bmFtZSkgew0KPiArCQl0dmFyLT5uYW1lID0gc3RyZHVwKHB2YXItPm5hbWUpOw0KPiAr
CQlpZiAodHZhci0+bmFtZSA9PSBOVUxMKQ0KPiArCQkJcmV0dXJuIC1FTk9NRU07DQo+ICsJfSBl
bHNlDQo+ICsJCXR2YXItPm5hbWUgPSBOVUxMOw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiBkaWZm
IC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmggYi90b29scy9wZXJmL3V0aWwv
cHJvYmUtZXZlbnQuaA0KPiBpbmRleCA4M2VlOTVlLi42ZTdlYzY4IDEwMDY0NA0KPiAtLS0gYS90
b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaA0KPiArKysgYi90b29scy9wZXJmL3V0aWwvcHJv
YmUtZXZlbnQuaA0KPiBAQCAtNTksNiArNTksNyBAQCBzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCB7
DQo+ICAJYm9vbAkJcmV0cHJvYmU7CS8qIFJldHVybiBwcm9iZSBmbGFnICovDQo+ICAJY2hhcgkJ
KmxhenlfbGluZTsJLyogTGF6eSBtYXRjaGluZyBwYXR0ZXJuICovDQo+ICAJdW5zaWduZWQgbG9u
ZwlvZmZzZXQ7CQkvKiBPZmZzZXQgZnJvbSBmdW5jdGlvbiBlbnRyeSAqLw0KPiArCXVuc2lnbmVk
IGxvbmcJYWJzX2FkZHJlc3M7CS8qIEFic29sdXRlIGFkZHJlc3Mgb2YgdGhlIHBvaW50ICovDQo+
ICB9Ow0KPiANCj4gIC8qIFBlcmYgcHJvYmUgcHJvYmluZyBhcmd1bWVudCBmaWVsZCBjaGFpbiAq
Lw0KPiBAQCAtMTU2LDQgKzE1Nyw3IEBAIGludCBlX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90
IHNpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQ0KPiAgLyogTWF4aW11bSBpbmRleCBudW1i
ZXIgb2YgZXZlbnQtbmFtZSBwb3N0Zml4ICovDQo+ICAjZGVmaW5lIE1BWF9FVkVOVF9JTkRFWAkx
MDI0DQo+IA0KPiAraW50IGNvcHlfdG9fcHJvYmVfdHJhY2VfYXJnKHN0cnVjdCBwcm9iZV90cmFj
ZV9hcmcgKnR2YXIsDQo+ICsJCQkgICAgc3RydWN0IHBlcmZfcHJvYmVfYXJnICpwdmFyKTsNCj4g
Kw0KPiAgI2VuZGlmIC8qX1BST0JFX0VWRU5UX0ggKi8NCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL3Bl
cmYvdXRpbC9wcm9iZS1maW5kZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYw0K
PiBpbmRleCA3YjgwZjhjLi4yOWM0M2MwNjggMTAwNjQ0DQo+IC0tLSBhL3Rvb2xzL3BlcmYvdXRp
bC9wcm9iZS1maW5kZXIuYw0KPiArKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMN
Cj4gQEAgLTU1MywyNCArNTUzLDkgQEAgc3RhdGljIGludCBmaW5kX3ZhcmlhYmxlKER3YXJmX0Rp
ZSAqc2NfZGllLCBzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikNCj4gIAljaGFyIGJ1ZlszMl0sICpw
dHI7DQo+ICAJaW50IHJldCA9IDA7DQo+IA0KPiAtCWlmICghaXNfY192YXJuYW1lKHBmLT5wdmFy
LT52YXIpKSB7DQo+IC0JCS8qIENvcHkgcmF3IHBhcmFtZXRlcnMgKi8NCj4gLQkJcGYtPnR2YXIt
PnZhbHVlID0gc3RyZHVwKHBmLT5wdmFyLT52YXIpOw0KPiAtCQlpZiAocGYtPnR2YXItPnZhbHVl
ID09IE5VTEwpDQo+IC0JCQlyZXR1cm4gLUVOT01FTTsNCj4gLQkJaWYgKHBmLT5wdmFyLT50eXBl
KSB7DQo+IC0JCQlwZi0+dHZhci0+dHlwZSA9IHN0cmR1cChwZi0+cHZhci0+dHlwZSk7DQo+IC0J
CQlpZiAocGYtPnR2YXItPnR5cGUgPT0gTlVMTCkNCj4gLQkJCQlyZXR1cm4gLUVOT01FTTsNCj4g
LQkJfQ0KPiAtCQlpZiAocGYtPnB2YXItPm5hbWUpIHsNCj4gLQkJCXBmLT50dmFyLT5uYW1lID0g
c3RyZHVwKHBmLT5wdmFyLT5uYW1lKTsNCj4gLQkJCWlmIChwZi0+dHZhci0+bmFtZSA9PSBOVUxM
KQ0KPiAtCQkJCXJldHVybiAtRU5PTUVNOw0KPiAtCQl9IGVsc2UNCj4gLQkJCXBmLT50dmFyLT5u
YW1lID0gTlVMTDsNCj4gLQkJcmV0dXJuIDA7DQo+IC0JfQ0KPiArCS8qIENvcHkgcmF3IHBhcmFt
ZXRlcnMgKi8NCj4gKwlpZiAoIWlzX2NfdmFybmFtZShwZi0+cHZhci0+dmFyKSkNCj4gKwkJcmV0
dXJuIGNvcHlfdG9fcHJvYmVfdHJhY2VfYXJnKHBmLT50dmFyLCBwZi0+cHZhcik7DQo+IA0KPiAg
CWlmIChwZi0+cHZhci0+bmFtZSkNCj4gIAkJcGYtPnR2YXItPm5hbWUgPSBzdHJkdXAocGYtPnB2
YXItPm5hbWUpOw0KPiAtLQ0KPiAxLjguMy40DQoNCg==
--
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]


#1215144 — [tip:perf/core] perf probe: Support probing at absolute address

Fromtip-bot for Wang Nan <tipbot@zytor.com>
Date2015-08-28 08:50 +0200
Subject[tip:perf/core] perf probe: Support probing at absolute address
Message-ID<q2lE7-3R6-31@gated-at.bofh.it>
In reply to#1213740
Commit-ID:  da15bd9df4afd2f9f78cf29f85f013e3a38402b5
Gitweb:     http://git.kernel.org/tip/da15bd9df4afd2f9f78cf29f85f013e3a38402b5
Author:     Wang Nan <wangnan0@huawei.com>
AuthorDate: Wed, 26 Aug 2015 10:57:45 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 26 Aug 2015 10:41:12 -0300

perf probe: Support probing at absolute address

It should be useful to allow 'perf probe' probe at absolute offset of a
target. For example, when (u)probing at a instruction of a shared object
in a embedded system where debuginfo is not avaliable but we know the
offset of that instruction by manually digging.

This patch enables following perf probe command syntax:

  # perf probe 0xffffffff811e6615

And

  # perf probe /lib/x86_64-linux-gnu/libc-2.19.so 0xeb860

In the above example, we don't need a anchor symbol, so it is possible
to compute absolute addresses using other methods and then use 'perf
probe' to create the probing points.

v1 -> v2:
  Drop the leading '+' in cmdline;
  Allow uprobing at offset 0x0;
  Improve 'perf probe -l' result when uprobe at area without debuginfo.

v2 -> v3:
  Split bugfix to a separated patch.

Test result:

  # perf probe 0xffffffff8119d175 %ax
  # perf probe sys_write %ax
  # perf probe /lib64/libc-2.18.so 0x0 %ax
  # perf probe /lib64/libc-2.18.so 0x5 %ax
  # perf probe /lib64/libc-2.18.so 0xd8e40 %ax
  # perf probe /lib64/libc-2.18.so __write %ax
  # perf probe /lib64/libc-2.18.so 0xd8e49 %ax
  # cat /sys/kernel/debug/tracing/uprobe_events

  p:probe_libc/abs_0 /lib64/libc-2.18.so:0x          (null) arg1=%ax
  p:probe_libc/abs_5 /lib64/libc-2.18.so:0x0000000000000005 arg1=%ax
  p:probe_libc/abs_d8e40 /lib64/libc-2.18.so:0x00000000000d8e40 arg1=%ax
  p:probe_libc/__write /lib64/libc-2.18.so:0x00000000000d8e40 arg1=%ax
  p:probe_libc/abs_d8e49 /lib64/libc-2.18.so:0x00000000000d8e49 arg1=%ax

  # cat /sys/kernel/debug/tracing/kprobe_events

  p:probe/abs_ffffffff8119d175 0xffffffff8119d175 arg1=%ax
  p:probe/sys_write _text+1692016 arg1=%ax

  # perf probe -l

  Failed to find debug information for address 5
    probe:abs_ffffffff8119d175 (on sys_write+5 with arg1)
    probe:sys_write      (on sys_write with arg1)
    probe_libc:__write   (on @unix/syscall-template.S:81 in /lib64/libc-2.18.so with arg1)
    probe_libc:abs_0     (on 0x0 in /lib64/libc-2.18.so with arg1)
    probe_libc:abs_5     (on 0x5 in /lib64/libc-2.18.so with arg1)
    probe_libc:abs_d8e40 (on @unix/syscall-template.S:81 in /lib64/libc-2.18.so with arg1)
    probe_libc:abs_d8e49 (on __GI___libc_write+9 in /lib64/libc-2.18.so with arg1)

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1440586666-235233-7-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/probe-event.c  | 162 +++++++++++++++++++++++++++++++++++++++--
 tools/perf/util/probe-event.h  |   4 +
 tools/perf/util/probe-finder.c |  21 +-----
 3 files changed, 163 insertions(+), 24 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index eaacb58..eb5f18b 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1204,9 +1204,27 @@ static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev)
 
 	if (file_spec)
 		pp->file = tmp;
-	else
+	else {
 		pp->function = tmp;
 
+		/*
+		 * Keep pp->function even if this is absolute address,
+		 * so it can mark whether abs_address is valid.
+		 * Which make 'perf probe lib.bin 0x0' possible.
+		 *
+		 * Note that checking length of tmp is not needed
+		 * because when we access tmp[1] we know tmp[0] is '0',
+		 * so tmp[1] should always valid (but could be '\0').
+		 */
+		if (tmp && !strncmp(tmp, "0x", 2)) {
+			pp->abs_address = strtoul(pp->function, &tmp, 0);
+			if (*tmp != '\0') {
+				semantic_error("Invalid absolute address.\n");
+				return -EINVAL;
+			}
+		}
+	}
+
 	/* Parse other options */
 	while (ptr) {
 		arg = ptr;
@@ -1804,14 +1822,29 @@ char *synthesize_probe_trace_command(struct probe_trace_event *tev)
 	if (len <= 0)
 		goto error;
 
-	/* Uprobes must have tp->address and tp->module */
-	if (tev->uprobes && (!tp->address || !tp->module))
+	/* Uprobes must have tp->module */
+	if (tev->uprobes && !tp->module)
 		goto error;
+	/*
+	 * If tp->address == 0, then this point must be a
+	 * absolute address uprobe.
+	 * try_to_find_absolute_address() should have made
+	 * tp->symbol to "0x0".
+	 */
+	if (tev->uprobes && !tp->address) {
+		if (!tp->symbol || strcmp(tp->symbol, "0x0"))
+			goto error;
+	}
 
 	/* Use the tp->address for uprobes */
 	if (tev->uprobes)
 		ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s:0x%lx",
 				 tp->module, tp->address);
+	else if (!strncmp(tp->symbol, "0x", 2))
+		/* Absolute address. See try_to_find_absolute_address() */
+		ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s0x%lx",
+				 tp->module ?: "", tp->module ? ":" : "",
+				 tp->address);
 	else
 		ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s%s+%lu",
 				 tp->module ?: "", tp->module ? ":" : "",
@@ -1874,8 +1907,8 @@ out:
 }
 
 static int convert_to_perf_probe_point(struct probe_trace_point *tp,
-					struct perf_probe_point *pp,
-					bool is_kprobe)
+				       struct perf_probe_point *pp,
+				       bool is_kprobe)
 {
 	char buf[128];
 	int ret;
@@ -2331,7 +2364,9 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
 	if (pev->event)
 		event = pev->event;
 	else
-		if (pev->point.function && !strisglob(pev->point.function))
+		if (pev->point.function &&
+			(strncmp(pev->point.function, "0x", 2) != 0) &&
+			!strisglob(pev->point.function))
 			event = pev->point.function;
 		else
 			event = tev->point.realname;
@@ -2598,6 +2633,98 @@ err_out:
 	goto out;
 }
 
+static int try_to_find_absolute_address(struct perf_probe_event *pev,
+					struct probe_trace_event **tevs)
+{
+	struct perf_probe_point *pp = &pev->point;
+	struct probe_trace_event *tev;
+	struct probe_trace_point *tp;
+	int i, err;
+
+	if (!(pev->point.function && !strncmp(pev->point.function, "0x", 2)))
+		return -EINVAL;
+	if (perf_probe_event_need_dwarf(pev))
+		return -EINVAL;
+
+	/*
+	 * This is 'perf probe /lib/libc.so 0xabcd'. Try to probe at
+	 * absolute address.
+	 *
+	 * Only one tev can be generated by this.
+	 */
+	*tevs = zalloc(sizeof(*tev));
+	if (!*tevs)
+		return -ENOMEM;
+
+	tev = *tevs;
+	tp = &tev->point;
+
+	/*
+	 * Don't use tp->offset, use address directly, because
+	 * in synthesize_probe_trace_command() address cannot be
+	 * zero.
+	 */
+	tp->address = pev->point.abs_address;
+	tp->retprobe = pp->retprobe;
+	tev->uprobes = pev->uprobes;
+
+	err = -ENOMEM;
+	/*
+	 * Give it a '0x' leading symbol name.
+	 * In __add_probe_trace_events, a NULL symbol is interpreted as
+	 * invalud.
+	 */
+	if (asprintf(&tp->symbol, "0x%lx", tp->address) < 0)
+		goto errout;
+
+	/* For kprobe, check range */
+	if ((!tev->uprobes) &&
+	    (kprobe_warn_out_range(tev->point.symbol,
+				   tev->point.address))) {
+		err = -EACCES;
+		goto errout;
+	}
+
+	if (asprintf(&tp->realname, "abs_%lx", tp->address) < 0)
+		goto errout;
+
+	if (pev->target) {
+		tp->module = strdup(pev->target);
+		if (!tp->module)
+			goto errout;
+	}
+
+	if (tev->group) {
+		tev->group = strdup(pev->group);
+		if (!tev->group)
+			goto errout;
+	}
+
+	if (pev->event) {
+		tev->event = strdup(pev->event);
+		if (!tev->event)
+			goto errout;
+	}
+
+	tev->nargs = pev->nargs;
+	tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs);
+	if (!tev->args) {
+		err = -ENOMEM;
+		goto errout;
+	}
+	for (i = 0; i < tev->nargs; i++)
+		copy_to_probe_trace_arg(&tev->args[i], &pev->args[i]);
+
+	return 1;
+
+errout:
+	if (*tevs) {
+		clear_probe_trace_events(*tevs, 1);
+		*tevs = NULL;
+	}
+	return err;
+}
+
 bool __weak arch__prefers_symtab(void) { return false; }
 
 static int convert_to_probe_trace_events(struct perf_probe_event *pev,
@@ -2614,6 +2741,10 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
 		}
 	}
 
+	ret = try_to_find_absolute_address(pev, tevs);
+	if (ret > 0)
+		return ret;
+
 	if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) {
 		ret = find_probe_trace_events_from_map(pev, tevs);
 		if (ret > 0)
@@ -2784,3 +2915,22 @@ end:
 	return ret;
 }
 
+int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
+			    struct perf_probe_arg *pvar)
+{
+	tvar->value = strdup(pvar->var);
+	if (tvar->value == NULL)
+		return -ENOMEM;
+	if (pvar->type) {
+		tvar->type = strdup(pvar->type);
+		if (tvar->type == NULL)
+			return -ENOMEM;
+	}
+	if (pvar->name) {
+		tvar->name = strdup(pvar->name);
+		if (tvar->name == NULL)
+			return -ENOMEM;
+	} else
+		tvar->name = NULL;
+	return 0;
+}
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 83ee95e..6e7ec68 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -59,6 +59,7 @@ struct perf_probe_point {
 	bool		retprobe;	/* Return probe flag */
 	char		*lazy_line;	/* Lazy matching pattern */
 	unsigned long	offset;		/* Offset from function entry */
+	unsigned long	abs_address;	/* Absolute address of the point */
 };
 
 /* Perf probe probing argument field chain */
@@ -156,4 +157,7 @@ int e_snprintf(char *str, size_t size, const char *format, ...)
 /* Maximum index number of event-name postfix */
 #define MAX_EVENT_INDEX	1024
 
+int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
+			    struct perf_probe_arg *pvar);
+
 #endif /*_PROBE_EVENT_H */
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 7b80f8c..29c43c068 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -553,24 +553,9 @@ static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf)
 	char buf[32], *ptr;
 	int ret = 0;
 
-	if (!is_c_varname(pf->pvar->var)) {
-		/* Copy raw parameters */
-		pf->tvar->value = strdup(pf->pvar->var);
-		if (pf->tvar->value == NULL)
-			return -ENOMEM;
-		if (pf->pvar->type) {
-			pf->tvar->type = strdup(pf->pvar->type);
-			if (pf->tvar->type == NULL)
-				return -ENOMEM;
-		}
-		if (pf->pvar->name) {
-			pf->tvar->name = strdup(pf->pvar->name);
-			if (pf->tvar->name == NULL)
-				return -ENOMEM;
-		} else
-			pf->tvar->name = NULL;
-		return 0;
-	}
+	/* Copy raw parameters */
+	if (!is_c_varname(pf->pvar->var))
+		return copy_to_probe_trace_arg(pf->tvar, pf->pvar);
 
 	if (pf->pvar->name)
 		pf->tvar->name = strdup(pf->pvar->name);
--
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]


#1213741 — [PATCH v3 4/6] perf probe: Fix error reported when offset without function

FromWang Nan <wangnan0@huawei.com>
Date2015-08-26 13:00 +0200
Subject[PATCH v3 4/6] perf probe: Fix error reported when offset without function
Message-ID<q1GAX-3v0-23@gated-at.bofh.it>
In reply to#1213737
This patch fixes a bug that, when offset is provided but function is
lost, parse_perf_probe_point() will give a "" string as function name,
so the checking code at the end of parse_perf_probe_point() become useless.
For example:

 # perf probe +0x1234
 Failed to find symbol  in kernel
   Error: Failed to add events.

After this patch:

 # perf probe +0x1234
 Semantic error :Offset requires an entry function.
   Error: Command Parse Error.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 tools/perf/util/probe-event.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 926bcec..eaacb58 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1194,9 +1194,13 @@ static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev)
 		*ptr++ = '\0';
 	}
 
-	tmp = strdup(arg);
-	if (tmp == NULL)
-		return -ENOMEM;
+	if (arg[0] == '\0')
+		tmp = NULL;
+	else {
+		tmp = strdup(arg);
+		if (tmp == NULL)
+			return -ENOMEM;
+	}
 
 	if (file_spec)
 		pp->file = tmp;
-- 
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] | [prev] | [next] | [standalone]


#1213785 — RE: [PATCH v3 4/6] perf probe: Fix error reported when offset without function

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-08-26 14:30 +0200
SubjectRE: [PATCH v3 4/6] perf probe: Fix error reported when offset without function
Message-ID<q1I02-5Dg-1@gated-at.bofh.it>
In reply to#1213741
PiBGcm9tOiBXYW5nIE5hbiBbbWFpbHRvOndhbmduYW4wQGh1YXdlaS5jb21dDQo+IA0KPiBUaGlz
IHBhdGNoIGZpeGVzIGEgYnVnIHRoYXQsIHdoZW4gb2Zmc2V0IGlzIHByb3ZpZGVkIGJ1dCBmdW5j
dGlvbiBpcw0KPiBsb3N0LCBwYXJzZV9wZXJmX3Byb2JlX3BvaW50KCkgd2lsbCBnaXZlIGEgIiIg
c3RyaW5nIGFzIGZ1bmN0aW9uIG5hbWUsDQo+IHNvIHRoZSBjaGVja2luZyBjb2RlIGF0IHRoZSBl
bmQgb2YgcGFyc2VfcGVyZl9wcm9iZV9wb2ludCgpIGJlY29tZSB1c2VsZXNzLg0KPiBGb3IgZXhh
bXBsZToNCj4gDQo+ICAjIHBlcmYgcHJvYmUgKzB4MTIzNA0KPiAgRmFpbGVkIHRvIGZpbmQgc3lt
Ym9sICBpbiBrZXJuZWwNCj4gICAgRXJyb3I6IEZhaWxlZCB0byBhZGQgZXZlbnRzLg0KPiANCj4g
QWZ0ZXIgdGhpcyBwYXRjaDoNCj4gDQo+ICAjIHBlcmYgcHJvYmUgKzB4MTIzNA0KPiAgU2VtYW50
aWMgZXJyb3IgOk9mZnNldCByZXF1aXJlcyBhbiBlbnRyeSBmdW5jdGlvbi4NCj4gICAgRXJyb3I6
IENvbW1hbmQgUGFyc2UgRXJyb3IuDQoNCk9LLCBzZWVtcyBzYW5lIG5vdyA6KQ0KDQpBY2tlZC1i
eTogTWFzYW1pIEhpcmFtYXRzdSA8bWFzYW1pLmhpcmFtYXRzdS5wdEBoaXRhY2hpLmNvbT4NCg0K
VGhhbmtzIQ0KDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBXYW5nIE5hbiA8d2FuZ25hbjBAaHVhd2Vp
LmNvbT4NCj4gQ2M6IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBrZXJuZWwub3JnPg0K
PiBDYzogSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+DQo+IENjOiBNYXNhbWkgSGlyYW1h
dHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29tPg0KPiBDYzogTmFtaHl1bmcgS2lt
IDxuYW1oeXVuZ0BrZXJuZWwub3JnPg0KPiBDYzogU3RldmVuIFJvc3RlZHQgPHJvc3RlZHRAZ29v
ZG1pcy5vcmc+DQo+IC0tLQ0KPiAgdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMgfCAxMCAr
KysrKysrLS0tDQo+ICAxIGZpbGUgY2hhbmdlZCwgNyBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9u
cygtKQ0KPiANCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jIGIv
dG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMNCj4gaW5kZXggOTI2YmNlYy4uZWFhY2I1OCAx
MDA2NDQNCj4gLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMNCj4gKysrIGIvdG9v
bHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMNCj4gQEAgLTExOTQsOSArMTE5NCwxMyBAQCBzdGF0
aWMgaW50IHBhcnNlX3BlcmZfcHJvYmVfcG9pbnQoY2hhciAqYXJnLCBzdHJ1Y3QgcGVyZl9wcm9i
ZV9ldmVudCAqcGV2KQ0KPiAgCQkqcHRyKysgPSAnXDAnOw0KPiAgCX0NCj4gDQo+IC0JdG1wID0g
c3RyZHVwKGFyZyk7DQo+IC0JaWYgKHRtcCA9PSBOVUxMKQ0KPiAtCQlyZXR1cm4gLUVOT01FTTsN
Cj4gKwlpZiAoYXJnWzBdID09ICdcMCcpDQo+ICsJCXRtcCA9IE5VTEw7DQo+ICsJZWxzZSB7DQo+
ICsJCXRtcCA9IHN0cmR1cChhcmcpOw0KPiArCQlpZiAodG1wID09IE5VTEwpDQo+ICsJCQlyZXR1
cm4gLUVOT01FTTsNCj4gKwl9DQo+IA0KPiAgCWlmIChmaWxlX3NwZWMpDQo+ICAJCXBwLT5maWxl
ID0gdG1wOw0KPiAtLQ0KPiAxLjguMy40DQoNCg==
--
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]


#1215133 — [tip:perf/core] perf probe: Fix error reported when offset without function

Fromtip-bot for Wang Nan <tipbot@zytor.com>
Date2015-08-28 08:50 +0200
Subject[tip:perf/core] perf probe: Fix error reported when offset without function
Message-ID<q2lE6-3R6-9@gated-at.bofh.it>
In reply to#1213741
Commit-ID:  6c6e024f0a62a6a08c06002fd3caa2307cc54fd0
Gitweb:     http://git.kernel.org/tip/6c6e024f0a62a6a08c06002fd3caa2307cc54fd0
Author:     Wang Nan <wangnan0@huawei.com>
AuthorDate: Wed, 26 Aug 2015 10:57:44 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 26 Aug 2015 10:40:34 -0300

perf probe: Fix error reported when offset without function

This patch fixes a bug that, when offset is provided but function is
lost, parse_perf_probe_point() will give a "" string as function name,
so the checking code at the end of parse_perf_probe_point() become
useless.  For example:

  # perf probe +0x1234
  Failed to find symbol  in kernel
    Error: Failed to add events.

After this patch:

  # perf probe +0x1234
  Semantic error :Offset requires an entry function.
    Error: Command Parse Error.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1440586666-235233-6-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/probe-event.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 926bcec..eaacb58 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1194,9 +1194,13 @@ static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev)
 		*ptr++ = '\0';
 	}
 
-	tmp = strdup(arg);
-	if (tmp == NULL)
-		return -ENOMEM;
+	if (arg[0] == '\0')
+		tmp = NULL;
+	else {
+		tmp = strdup(arg);
+		if (tmp == NULL)
+			return -ENOMEM;
+	}
 
 	if (file_spec)
 		pp->file = tmp;
--
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]


#1213742 — [PATCH v3 3/6] perf probe: Fix list result when address is zero

FromWang Nan <wangnan0@huawei.com>
Date2015-08-26 13:10 +0200
Subject[PATCH v3 3/6] perf probe: Fix list result when address is zero
Message-ID<q1GKC-3VH-9@gated-at.bofh.it>
In reply to#1213737
When manually added uprobe point with zero address, 'perf probe -l'
reports error. For example:

 # echo p:probe_libc/abs_0 /path/to/lib.bin:0x0 arg1=%ax > \
           /sys/kernel/debug/tracing/uprobe_events

 # perf probe -l
 Error: Failed to show event list.

Probing at 0x0 is possible and useful when lib.bin is not a normal
shared object but is manually mapped. However, in this case kernel
report:

 # cat /sys/kernel/debug/tracing/uprobe_events
 p:probe_libc/abs_0 /path/to/lib.bin:0x          (null) arg1=%ax

This patch supports the above kernel output.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 tools/perf/util/probe-event.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index f7bacbb..926bcec 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1519,9 +1519,31 @@ int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev)
 	} else
 		p = argv[1];
 	fmt1_str = strtok_r(p, "+", &fmt);
-	if (fmt1_str[0] == '0')	/* only the address started with 0x */
-		tp->address = strtoul(fmt1_str, NULL, 0);
-	else {
+	/* only the address started with 0x */
+	if (fmt1_str[0] == '0')	{
+		/*
+		 * Fix a special case:
+		 * if address == 0, kernel reports something like:
+		 * p:probe_libc/abs_0 /lib/libc-2.18.so:0x          (null) arg1=%ax
+		 * Newer kernel may fix that, but we want to
+		 * support old kernel also.
+		 */
+		if (strcmp(fmt1_str, "0x") == 0) {
+			if (!argv[2] || strcmp(argv[2], "(null)")) {
+				ret = -EINVAL;
+				goto out;
+			}
+			tp->address = 0;
+
+			free(argv[2]);
+			for (i = 2; argv[i + 1] != NULL; i++)
+				argv[i] = argv[i + 1];
+
+			argv[i] = NULL;
+			argc -= 1;
+		} else
+			tp->address = strtoul(fmt1_str, NULL, 0);
+	} else {
 		/* Only the symbol-based probe has offset */
 		tp->symbol = strdup(fmt1_str);
 		if (tp->symbol == NULL) {
-- 
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] | [prev] | [next] | [standalone]


#1213780 — RE: [PATCH v3 3/6] perf probe: Fix list result when address is zero

From平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com>
Date2015-08-26 14:20 +0200
SubjectRE: [PATCH v3 3/6] perf probe: Fix list result when address is zero
Message-ID<q1HQm-5s4-13@gated-at.bofh.it>
In reply to#1213742
PiBGcm9tOiBXYW5nIE5hbiBbbWFpbHRvOndhbmduYW4wQGh1YXdlaS5jb21dDQo+IA0KPiBXaGVu
IG1hbnVhbGx5IGFkZGVkIHVwcm9iZSBwb2ludCB3aXRoIHplcm8gYWRkcmVzcywgJ3BlcmYgcHJv
YmUgLWwnDQo+IHJlcG9ydHMgZXJyb3IuIEZvciBleGFtcGxlOg0KPiANCj4gICMgZWNobyBwOnBy
b2JlX2xpYmMvYWJzXzAgL3BhdGgvdG8vbGliLmJpbjoweDAgYXJnMT0lYXggPiBcDQo+ICAgICAg
ICAgICAgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy91cHJvYmVfZXZlbnRzDQo+IA0KPiAgIyBw
ZXJmIHByb2JlIC1sDQo+ICBFcnJvcjogRmFpbGVkIHRvIHNob3cgZXZlbnQgbGlzdC4NCj4gDQo+
IFByb2JpbmcgYXQgMHgwIGlzIHBvc3NpYmxlIGFuZCB1c2VmdWwgd2hlbiBsaWIuYmluIGlzIG5v
dCBhIG5vcm1hbA0KPiBzaGFyZWQgb2JqZWN0IGJ1dCBpcyBtYW51YWxseSBtYXBwZWQuIEhvd2V2
ZXIsIGluIHRoaXMgY2FzZSBrZXJuZWwNCj4gcmVwb3J0Og0KPiANCj4gICMgY2F0IC9zeXMva2Vy
bmVsL2RlYnVnL3RyYWNpbmcvdXByb2JlX2V2ZW50cw0KPiAgcDpwcm9iZV9saWJjL2Fic18wIC9w
YXRoL3RvL2xpYi5iaW46MHggICAgICAgICAgKG51bGwpIGFyZzE9JWF4DQo+IA0KPiBUaGlzIHBh
dGNoIHN1cHBvcnRzIHRoZSBhYm92ZSBrZXJuZWwgb3V0cHV0Lg0KDQpPSywgTG9va3MgZ29vZCB0
byBtZTopDQoNCg0KQWNrZWQtYnk6IE1hc2FtaSBIaXJhbWF0c3UgPG1hc2FtaS5oaXJhbWF0c3Uu
cHRAaGl0YWNoaS5jb20+DQoNClRoYW5rcyENCg0KDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBXYW5n
IE5hbiA8d2FuZ25hbjBAaHVhd2VpLmNvbT4NCj4gQ2M6IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVs
byA8YWNtZUBrZXJuZWwub3JnPg0KPiBDYzogSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+
DQo+IENjOiBNYXNhbWkgSGlyYW1hdHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29t
Pg0KPiBDYzogTmFtaHl1bmcgS2ltIDxuYW1oeXVuZ0BrZXJuZWwub3JnPg0KPiBDYzogU3RldmVu
IFJvc3RlZHQgPHJvc3RlZHRAZ29vZG1pcy5vcmc+DQo+IC0tLQ0KPiAgdG9vbHMvcGVyZi91dGls
L3Byb2JlLWV2ZW50LmMgfCAyOCArKysrKysrKysrKysrKysrKysrKysrKysrLS0tDQo+ICAxIGZp
bGUgY2hhbmdlZCwgMjUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYg
LS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9w
cm9iZS1ldmVudC5jDQo+IGluZGV4IGY3YmFjYmIuLjkyNmJjZWMgMTAwNjQ0DQo+IC0tLSBhL3Rv
b2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jDQo+ICsrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9i
ZS1ldmVudC5jDQo+IEBAIC0xNTE5LDkgKzE1MTksMzEgQEAgaW50IHBhcnNlX3Byb2JlX3RyYWNl
X2NvbW1hbmQoY29uc3QgY2hhciAqY21kLCBzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldikN
Cj4gIAl9IGVsc2UNCj4gIAkJcCA9IGFyZ3ZbMV07DQo+ICAJZm10MV9zdHIgPSBzdHJ0b2tfcihw
LCAiKyIsICZmbXQpOw0KPiAtCWlmIChmbXQxX3N0clswXSA9PSAnMCcpCS8qIG9ubHkgdGhlIGFk
ZHJlc3Mgc3RhcnRlZCB3aXRoIDB4ICovDQo+IC0JCXRwLT5hZGRyZXNzID0gc3RydG91bChmbXQx
X3N0ciwgTlVMTCwgMCk7DQo+IC0JZWxzZSB7DQo+ICsJLyogb25seSB0aGUgYWRkcmVzcyBzdGFy
dGVkIHdpdGggMHggKi8NCj4gKwlpZiAoZm10MV9zdHJbMF0gPT0gJzAnKQl7DQo+ICsJCS8qDQo+
ICsJCSAqIEZpeCBhIHNwZWNpYWwgY2FzZToNCj4gKwkJICogaWYgYWRkcmVzcyA9PSAwLCBrZXJu
ZWwgcmVwb3J0cyBzb21ldGhpbmcgbGlrZToNCj4gKwkJICogcDpwcm9iZV9saWJjL2Fic18wIC9s
aWIvbGliYy0yLjE4LnNvOjB4ICAgICAgICAgIChudWxsKSBhcmcxPSVheA0KPiArCQkgKiBOZXdl
ciBrZXJuZWwgbWF5IGZpeCB0aGF0LCBidXQgd2Ugd2FudCB0bw0KPiArCQkgKiBzdXBwb3J0IG9s
ZCBrZXJuZWwgYWxzby4NCj4gKwkJICovDQo+ICsJCWlmIChzdHJjbXAoZm10MV9zdHIsICIweCIp
ID09IDApIHsNCj4gKwkJCWlmICghYXJndlsyXSB8fCBzdHJjbXAoYXJndlsyXSwgIihudWxsKSIp
KSB7DQo+ICsJCQkJcmV0ID0gLUVJTlZBTDsNCj4gKwkJCQlnb3RvIG91dDsNCj4gKwkJCX0NCj4g
KwkJCXRwLT5hZGRyZXNzID0gMDsNCj4gKw0KPiArCQkJZnJlZShhcmd2WzJdKTsNCj4gKwkJCWZv
ciAoaSA9IDI7IGFyZ3ZbaSArIDFdICE9IE5VTEw7IGkrKykNCj4gKwkJCQlhcmd2W2ldID0gYXJn
dltpICsgMV07DQo+ICsNCj4gKwkJCWFyZ3ZbaV0gPSBOVUxMOw0KPiArCQkJYXJnYyAtPSAxOw0K
PiArCQl9IGVsc2UNCj4gKwkJCXRwLT5hZGRyZXNzID0gc3RydG91bChmbXQxX3N0ciwgTlVMTCwg
MCk7DQo+ICsJfSBlbHNlIHsNCj4gIAkJLyogT25seSB0aGUgc3ltYm9sLWJhc2VkIHByb2JlIGhh
cyBvZmZzZXQgKi8NCj4gIAkJdHAtPnN5bWJvbCA9IHN0cmR1cChmbXQxX3N0cik7DQo+ICAJCWlm
ICh0cC0+c3ltYm9sID09IE5VTEwpIHsNCj4gLS0NCj4gMS44LjMuNA0KDQo=
--
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]


#1215149 — [tip:perf/core] perf probe: Fix list result when address is zero

Fromtip-bot for Wang Nan <tipbot@zytor.com>
Date2015-08-28 08:50 +0200
Subject[tip:perf/core] perf probe: Fix list result when address is zero
Message-ID<q2lE7-3R6-43@gated-at.bofh.it>
In reply to#1213742
Commit-ID:  be07afe92a09638db9159d2c0794487d66a437a2
Gitweb:     http://git.kernel.org/tip/be07afe92a09638db9159d2c0794487d66a437a2
Author:     Wang Nan <wangnan0@huawei.com>
AuthorDate: Wed, 26 Aug 2015 10:57:43 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 26 Aug 2015 10:39:20 -0300

perf probe: Fix list result when address is zero

When manually added uprobe point with zero address, 'perf probe -l'
reports error. For example:

  # echo p:probe_libc/abs_0 /path/to/lib.bin:0x0 arg1=%ax > \
           /sys/kernel/debug/tracing/uprobe_events

  # perf probe -l
  Error: Failed to show event list.

Probing at 0x0 is possible and useful when lib.bin is not a normal
shared object but is manually mapped. However, in this case kernel
report:

  # cat /sys/kernel/debug/tracing/uprobe_events
  p:probe_libc/abs_0 /path/to/lib.bin:0x          (null) arg1=%ax

This patch supports the above kernel output.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1440586666-235233-5-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/probe-event.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index f7bacbb..926bcec 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1519,9 +1519,31 @@ int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev)
 	} else
 		p = argv[1];
 	fmt1_str = strtok_r(p, "+", &fmt);
-	if (fmt1_str[0] == '0')	/* only the address started with 0x */
-		tp->address = strtoul(fmt1_str, NULL, 0);
-	else {
+	/* only the address started with 0x */
+	if (fmt1_str[0] == '0')	{
+		/*
+		 * Fix a special case:
+		 * if address == 0, kernel reports something like:
+		 * p:probe_libc/abs_0 /lib/libc-2.18.so:0x          (null) arg1=%ax
+		 * Newer kernel may fix that, but we want to
+		 * support old kernel also.
+		 */
+		if (strcmp(fmt1_str, "0x") == 0) {
+			if (!argv[2] || strcmp(argv[2], "(null)")) {
+				ret = -EINVAL;
+				goto out;
+			}
+			tp->address = 0;
+
+			free(argv[2]);
+			for (i = 2; argv[i + 1] != NULL; i++)
+				argv[i] = argv[i + 1];
+
+			argv[i] = NULL;
+			argc -= 1;
+		} else
+			tp->address = strtoul(fmt1_str, NULL, 0);
+	} else {
 		/* Only the symbol-based probe has offset */
 		tp->symbol = strdup(fmt1_str);
 		if (tp->symbol == NULL) {
--
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]


#1213745 — Re: [PATCH v3 2/6] perf probe: Fix list result when neither dwarf nor map can't find symbol

From"Wangnan (F)" <wangnan0@huawei.com>
Date2015-08-26 13:10 +0200
SubjectRe: [PATCH v3 2/6] perf probe: Fix list result when neither dwarf nor map can't find symbol
Message-ID<q1GKC-3VH-19@gated-at.bofh.it>
In reply to#1213737
Please ignore this one, and use the identical one with shorter title.

Sorry for the noisy.

On 2015/8/26 18:57, Wang Nan wrote:
> 'perf probe -l' reports error if it is unable find symbol through
> address. Here is an example.
>
>   # echo 'p:probe_libc/abs_5 /lib64/libc.so.6:0x5' >
>            /sys/kernel/debug/tracing/uprobe_events
>   # cat /sys/kernel/debug/tracing/uprobe_events
>    p:probe_libc/abs_5 /lib64/libc.so.6:0x0000000000000005
>   # perf probe -l
>     Error: Failed to show event list
>
> Also, this situation triggers a logical inconsistency in
> convert_to_perf_probe_point() that, it returns ENOMEM but actually
> it never try strdup().
>
> This patch removes !tp->module && !is_kprobe condition, so it
> always uses address to build function name if symbol not found.
>
> Test result:
>
>   # perf probe -l
>     probe_libc:abs_5     (on 0x5 in /lib64/libc.so.6)
>
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> ---
>   tools/perf/util/probe-event.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 6c7e538..f7bacbb 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -1866,7 +1866,7 @@ static int convert_to_perf_probe_point(struct probe_trace_point *tp,
>   	if (tp->symbol) {
>   		pp->function = strdup(tp->symbol);
>   		pp->offset = tp->offset;
> -	} else if (!tp->module && !is_kprobe) {
> +	} else {
>   		ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address);
>   		if (ret < 0)
>   			return ret;


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

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


#1213746 — [PATCH v3 2/6] perf probe: Fix list result when neither dwarf nor map can't find symbol

FromWang Nan <wangnan0@huawei.com>
Date2015-08-26 13:10 +0200
Subject[PATCH v3 2/6] perf probe: Fix list result when neither dwarf nor map can't find symbol
Message-ID<q1GKC-3VH-21@gated-at.bofh.it>
In reply to#1213737
'perf probe -l' reports error if it is unable find symbol through
address. Here is an example.

 # echo 'p:probe_libc/abs_5 /lib64/libc.so.6:0x5' >
          /sys/kernel/debug/tracing/uprobe_events
 # cat /sys/kernel/debug/tracing/uprobe_events
  p:probe_libc/abs_5 /lib64/libc.so.6:0x0000000000000005
 # perf probe -l
   Error: Failed to show event list

Also, this situation triggers a logical inconsistency in
convert_to_perf_probe_point() that, it returns ENOMEM but actually
it never try strdup().

This patch removes !tp->module && !is_kprobe condition, so it
always uses address to build function name if symbol not found.

Test result:

 # perf probe -l
   probe_libc:abs_5     (on 0x5 in /lib64/libc.so.6)

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 tools/perf/util/probe-event.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 6c7e538..f7bacbb 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1866,7 +1866,7 @@ static int convert_to_perf_probe_point(struct probe_trace_point *tp,
 	if (tp->symbol) {
 		pp->function = strdup(tp->symbol);
 		pp->offset = tp->offset;
-	} else if (!tp->module && !is_kprobe) {
+	} else {
 		ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address);
 		if (ret < 0)
 			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] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web