linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv3 0/3] perf python: Add support to access tracepoint fields
@ 2016-07-16 16:11 Jiri Olsa
  2016-07-16 16:11 ` [PATCH 1/3] perf script python: Fix string vs byte array resolving Jiri Olsa
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: Jiri Olsa @ 2016-07-16 16:11 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Steven Rostedt (Red Hat),
	Jiri Pirko

hi,
adding support to access tracepoint fields in python scripts.

v3 changes:
  - once again fixed is_printable_array [Steven]
  - patch 3/3 already merged
  - added new patch 3/3 with automated test for is_printable_array

v2 changes:
  - most of the patches is already pulled in,
    this is just leftover
  - fixed is_printable_array [Steven]
  - making is_printable_array global
  - attached unrelated fix 3/3

With this patchset it's possible to access tracepoint fields
in event python object like:

  print "time %u prev_comm=%s prev_pid=%d prev_prio=%d prev_state=0x%x ==> next_comm=%s next_pid=%d next_prio=%d" % (
         event.sample_time,
         event.prev_comm,
         event.prev_pid,
         event.prev_prio,
         event.prev_state,
         event.next_comm,
         event.next_pid,
         event.next_prio)

Also available in:
  git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
  perf/fixes

thanks,
jirka

---
Jiri Olsa (3):
      perf script python: Fix string vs byte array resolving
      perf tools: Make is_printable_array global
      perf tests: Add is_printable_array test

 tools/perf/tests/Build                                 |  1 +
 tools/perf/tests/builtin-test.c                        |  4 ++++
 tools/perf/tests/is_printable_array.c                  | 36 ++++++++++++++++++++++++++++++++++++
 tools/perf/tests/tests.h                               |  1 +
 tools/perf/util/python.c                               | 12 ------------
 tools/perf/util/scripting-engines/trace-event-python.c | 25 ++++++++++++++++++-------
 tools/perf/util/util.c                                 | 16 ++++++++++++++++
 tools/perf/util/util.h                                 |  1 +
 8 files changed, 77 insertions(+), 19 deletions(-)
 create mode 100644 tools/perf/tests/is_printable_array.c

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/3] perf script python: Fix string vs byte array resolving
  2016-07-16 16:11 [PATCHv3 0/3] perf python: Add support to access tracepoint fields Jiri Olsa
@ 2016-07-16 16:11 ` Jiri Olsa
  2016-07-18 11:44   ` Jiri Pirko
  2016-07-19  6:54   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-07-16 16:11 ` [PATCH 2/3] perf tools: Make is_printable_array global Jiri Olsa
  2016-07-16 16:11 ` [PATCH 3/3] perf tests: Add is_printable_array test Jiri Olsa
  2 siblings, 2 replies; 12+ messages in thread
From: Jiri Olsa @ 2016-07-16 16:11 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Steven Rostedt (Red Hat),
	Jiri Pirko

Jirka reported that python code returns all arrays as strings.
This makes impossible to get all items for byte array tracepoint
field containing 0x00 value item.

Fixing this by scanning full length of the array and returning
it as PyByteArray object in case non printable byte is found.

Link: http://lkml.kernel.org/n/tip-22f4vhhz5uytegkggy1on8u3@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 .../util/scripting-engines/trace-event-python.c    | 39 ++++++++++++++++++----
 1 file changed, 33 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 6ac6b7a33f42..7bd6da80533e 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -386,6 +386,21 @@ exit:
 	return pylist;
 }
 
+static int is_printable_array(char *p, unsigned int len)
+{
+	unsigned int i;
+
+	if (!p || !len || p[len - 1] != 0)
+		return 0;
+
+	len--;
+
+	for (i = 0; i < len; i++) {
+		if (!isprint(p[i]) && !isspace(p[i]))
+			return 0;
+	}
+	return 1;
+}
 
 static void python_process_tracepoint(struct perf_sample *sample,
 				      struct perf_evsel *evsel,
@@ -457,14 +472,26 @@ static void python_process_tracepoint(struct perf_sample *sample,
 		pydict_set_item_string_decref(dict, "common_callchain", callchain);
 	}
 	for (field = event->format.fields; field; field = field->next) {
-		if (field->flags & FIELD_IS_STRING) {
-			int offset;
+		unsigned int offset, len;
+		unsigned long long val;
+
+		if (field->flags & FIELD_IS_ARRAY) {
+			offset = field->offset;
+			len    = field->size;
 			if (field->flags & FIELD_IS_DYNAMIC) {
-				offset = *(int *)(data + field->offset);
+				val     = pevent_read_number(scripting_context->pevent,
+							     data + offset, len);
+				offset  = val;
+				len     = offset >> 16;
 				offset &= 0xffff;
-			} else
-				offset = field->offset;
-			obj = PyString_FromString((char *)data + offset);
+			}
+			if (field->flags & FIELD_IS_STRING &&
+			    is_printable_array(data + offset, len)) {
+				obj = PyString_FromString((char *) data + offset);
+			} else {
+				obj = PyByteArray_FromStringAndSize((const char *) data + offset, len);
+				field->flags &= ~FIELD_IS_STRING;
+			}
 		} else { /* FIELD_IS_NUMERIC */
 			obj = get_field_numeric_entry(event, field, data);
 		}
-- 
2.4.11

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/3] perf tools: Make is_printable_array global
  2016-07-16 16:11 [PATCHv3 0/3] perf python: Add support to access tracepoint fields Jiri Olsa
  2016-07-16 16:11 ` [PATCH 1/3] perf script python: Fix string vs byte array resolving Jiri Olsa
@ 2016-07-16 16:11 ` Jiri Olsa
  2016-07-18 11:44   ` Jiri Pirko
  2016-07-19  6:54   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2016-07-16 16:11 ` [PATCH 3/3] perf tests: Add is_printable_array test Jiri Olsa
  2 siblings, 2 replies; 12+ messages in thread
From: Jiri Olsa @ 2016-07-16 16:11 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Steven Rostedt (Red Hat),
	Jiri Pirko

It's used from 2 objects in perf, so it's better
to keep just one copy.

Link: http://lkml.kernel.org/n/tip-dss4lxnywysgpyjd8p7paffg@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/python.c                               | 12 ------------
 tools/perf/util/scripting-engines/trace-event-python.c | 16 ----------------
 tools/perf/util/util.c                                 | 16 ++++++++++++++++
 tools/perf/util/util.h                                 |  1 +
 4 files changed, 17 insertions(+), 28 deletions(-)

diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index d32f97033718..a5fbc012e3df 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -295,18 +295,6 @@ static bool is_tracepoint(struct pyrf_event *pevent)
 	return pevent->evsel->attr.type == PERF_TYPE_TRACEPOINT;
 }
 
-static int is_printable_array(char *p, unsigned int len)
-{
-	unsigned int i;
-
-	for (i = 0; i < len; i++) {
-		if (!isprint(p[i]) && !isspace(p[i]))
-			return 0;
-	}
-
-	return 1;
-}
-
 static PyObject*
 tracepoint_field(struct pyrf_event *pe, struct format_field *field)
 {
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 7bd6da80533e..e0203b979474 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -386,22 +386,6 @@ exit:
 	return pylist;
 }
 
-static int is_printable_array(char *p, unsigned int len)
-{
-	unsigned int i;
-
-	if (!p || !len || p[len - 1] != 0)
-		return 0;
-
-	len--;
-
-	for (i = 0; i < len; i++) {
-		if (!isprint(p[i]) && !isspace(p[i]))
-			return 0;
-	}
-	return 1;
-}
-
 static void python_process_tracepoint(struct perf_sample *sample,
 				      struct perf_evsel *evsel,
 				      struct addr_location *al)
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index 5f44a21955cd..cee559d8c9e8 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -746,3 +746,19 @@ void print_binary(unsigned char *data, size_t len,
 	}
 	printer(BINARY_PRINT_DATA_END, -1, extra);
 }
+
+int is_printable_array(char *p, unsigned int len)
+{
+	unsigned int i;
+
+	if (!p || !len || p[len - 1] != 0)
+		return 0;
+
+	len--;
+
+	for (i = 0; i < len; i++) {
+		if (!isprint(p[i]) && !isspace(p[i]))
+			return 0;
+	}
+	return 1;
+}
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 843cbba8f9d3..e5f55477491d 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -364,4 +364,5 @@ void print_binary(unsigned char *data, size_t len,
 extern int sched_getcpu(void);
 #endif
 
+int is_printable_array(char *p, unsigned int len);
 #endif /* GIT_COMPAT_UTIL_H */
-- 
2.4.11

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/3] perf tests: Add is_printable_array test
  2016-07-16 16:11 [PATCHv3 0/3] perf python: Add support to access tracepoint fields Jiri Olsa
  2016-07-16 16:11 ` [PATCH 1/3] perf script python: Fix string vs byte array resolving Jiri Olsa
  2016-07-16 16:11 ` [PATCH 2/3] perf tools: Make is_printable_array global Jiri Olsa
@ 2016-07-16 16:11 ` Jiri Olsa
  2016-07-18 11:46   ` Jiri Pirko
  2016-07-19  6:55   ` [tip:perf/core] " tip-bot for Jiri Olsa
  2 siblings, 2 replies; 12+ messages in thread
From: Jiri Olsa @ 2016-07-16 16:11 UTC (permalink / raw)
  To: Arnaldo Carvalho de Melo
  Cc: lkml, David Ahern, Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Steven Rostedt (Red Hat),
	Jiri Pirko

Add automated test for is_printable_array function.

Link: http://lkml.kernel.org/n/tip-if70lj3zhdc3csdqm5webjvc@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/tests/Build                |  1 +
 tools/perf/tests/builtin-test.c       |  4 ++++
 tools/perf/tests/is_printable_array.c | 36 +++++++++++++++++++++++++++++++++++
 tools/perf/tests/tests.h              |  1 +
 4 files changed, 42 insertions(+)
 create mode 100644 tools/perf/tests/is_printable_array.c

diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 4158422cc2a6..cb20ae1c0d35 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -40,6 +40,7 @@ perf-y += event_update.o
 perf-y += event-times.o
 perf-y += backward-ring-buffer.o
 perf-y += sdt.o
+perf-y += is_printable_array.o
 
 $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c tests/Build
 	$(call rule_mkdir)
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 4dd2d050788a..10eb30686c9c 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -222,6 +222,10 @@ static struct test generic_tests[] = {
 		.func = test__sdt_event,
 	},
 	{
+		.desc = "Test is_printable_array function",
+		.func = test__is_printable_array,
+	},
+	{
 		.func = NULL,
 	},
 };
diff --git a/tools/perf/tests/is_printable_array.c b/tools/perf/tests/is_printable_array.c
new file mode 100644
index 000000000000..42e13393e502
--- /dev/null
+++ b/tools/perf/tests/is_printable_array.c
@@ -0,0 +1,36 @@
+#include <linux/compiler.h>
+#include "tests.h"
+#include "debug.h"
+#include "util.h"
+
+int test__is_printable_array(int subtest __maybe_unused)
+{
+	char buf1[] = { 'k', 'r', 4, 'v', 'a', 0 };
+	char buf2[] = { 'k', 'r', 'a', 'v', 4, 0 };
+	struct {
+		char		*buf;
+		unsigned int	 len;
+		int		 ret;
+	} t[] = {
+		{ (char *) "krava",	sizeof("krava"),	1 },
+		{ (char *) "krava",	sizeof("krava") - 1,	0 },
+		{ (char *) "",		sizeof(""),		1 },
+		{ (char *) "",		0,			0 },
+		{ NULL,			0,			0 },
+		{ buf1,			sizeof(buf1),		0 },
+		{ buf2,			sizeof(buf2),		0 },
+	};
+	unsigned int i;
+
+	for (i = 0; i < ARRAY_SIZE(t); i++) {
+		int ret;
+
+		ret = is_printable_array((char *) t[i].buf, t[i].len);
+		if (ret != t[i].ret) {
+			pr_err("failed: test %u\n", i);
+			return TEST_FAIL;
+		}
+	}
+
+	return TEST_OK;
+}
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index a0288f8092b2..9bfc0e06c61a 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -89,6 +89,7 @@ int test__event_times(int subtest);
 int test__backward_ring_buffer(int subtest);
 int test__cpu_map_print(int subtest);
 int test__sdt_event(int subtest);
+int test__is_printable_array(int subtest);
 
 #if defined(__arm__) || defined(__aarch64__)
 #ifdef HAVE_DWARF_UNWIND_SUPPORT
-- 
2.4.11

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/3] perf script python: Fix string vs byte array resolving
  2016-07-16 16:11 ` [PATCH 1/3] perf script python: Fix string vs byte array resolving Jiri Olsa
@ 2016-07-18 11:44   ` Jiri Pirko
  2016-07-19  6:54   ` [tip:perf/core] " tip-bot for Jiri Olsa
  1 sibling, 0 replies; 12+ messages in thread
From: Jiri Pirko @ 2016-07-18 11:44 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Arnaldo Carvalho de Melo, lkml, David Ahern, Ingo Molnar,
	Namhyung Kim, Peter Zijlstra, Steven Rostedt (Red Hat)

Sat, Jul 16, 2016 at 06:11:18PM CEST, jolsa@kernel.org wrote:
>Jirka reported that python code returns all arrays as strings.
>This makes impossible to get all items for byte array tracepoint
>field containing 0x00 value item.
>
>Fixing this by scanning full length of the array and returning
>it as PyByteArray object in case non printable byte is found.
>
>Link: http://lkml.kernel.org/n/tip-22f4vhhz5uytegkggy1on8u3@git.kernel.org
>Signed-off-by: Jiri Olsa <jolsa@kernel.org>

Tested-by: Jiri Pirko <jiri@mellanox.com>



>---
> .../util/scripting-engines/trace-event-python.c    | 39 ++++++++++++++++++----
> 1 file changed, 33 insertions(+), 6 deletions(-)
>
>diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
>index 6ac6b7a33f42..7bd6da80533e 100644
>--- a/tools/perf/util/scripting-engines/trace-event-python.c
>+++ b/tools/perf/util/scripting-engines/trace-event-python.c
>@@ -386,6 +386,21 @@ exit:
> 	return pylist;
> }
> 
>+static int is_printable_array(char *p, unsigned int len)
>+{
>+	unsigned int i;
>+
>+	if (!p || !len || p[len - 1] != 0)
>+		return 0;
>+
>+	len--;
>+
>+	for (i = 0; i < len; i++) {
>+		if (!isprint(p[i]) && !isspace(p[i]))
>+			return 0;
>+	}
>+	return 1;
>+}
> 
> static void python_process_tracepoint(struct perf_sample *sample,
> 				      struct perf_evsel *evsel,
>@@ -457,14 +472,26 @@ static void python_process_tracepoint(struct perf_sample *sample,
> 		pydict_set_item_string_decref(dict, "common_callchain", callchain);
> 	}
> 	for (field = event->format.fields; field; field = field->next) {
>-		if (field->flags & FIELD_IS_STRING) {
>-			int offset;
>+		unsigned int offset, len;
>+		unsigned long long val;
>+
>+		if (field->flags & FIELD_IS_ARRAY) {
>+			offset = field->offset;
>+			len    = field->size;
> 			if (field->flags & FIELD_IS_DYNAMIC) {
>-				offset = *(int *)(data + field->offset);
>+				val     = pevent_read_number(scripting_context->pevent,
>+							     data + offset, len);
>+				offset  = val;
>+				len     = offset >> 16;
> 				offset &= 0xffff;
>-			} else
>-				offset = field->offset;
>-			obj = PyString_FromString((char *)data + offset);
>+			}
>+			if (field->flags & FIELD_IS_STRING &&
>+			    is_printable_array(data + offset, len)) {
>+				obj = PyString_FromString((char *) data + offset);
>+			} else {
>+				obj = PyByteArray_FromStringAndSize((const char *) data + offset, len);
>+				field->flags &= ~FIELD_IS_STRING;
>+			}
> 		} else { /* FIELD_IS_NUMERIC */
> 			obj = get_field_numeric_entry(event, field, data);
> 		}
>-- 
>2.4.11
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/3] perf tools: Make is_printable_array global
  2016-07-16 16:11 ` [PATCH 2/3] perf tools: Make is_printable_array global Jiri Olsa
@ 2016-07-18 11:44   ` Jiri Pirko
  2016-07-19  6:54   ` [tip:perf/core] " tip-bot for Jiri Olsa
  1 sibling, 0 replies; 12+ messages in thread
From: Jiri Pirko @ 2016-07-18 11:44 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Arnaldo Carvalho de Melo, lkml, David Ahern, Ingo Molnar,
	Namhyung Kim, Peter Zijlstra, Steven Rostedt (Red Hat)

Sat, Jul 16, 2016 at 06:11:19PM CEST, jolsa@kernel.org wrote:
>It's used from 2 objects in perf, so it's better
>to keep just one copy.
>
>Link: http://lkml.kernel.org/n/tip-dss4lxnywysgpyjd8p7paffg@git.kernel.org
>Signed-off-by: Jiri Olsa <jolsa@kernel.org>

Tested-by: Jiri Pirko <jiri@mellanox.com>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/3] perf tests: Add is_printable_array test
  2016-07-16 16:11 ` [PATCH 3/3] perf tests: Add is_printable_array test Jiri Olsa
@ 2016-07-18 11:46   ` Jiri Pirko
  2016-07-18 12:14     ` Jiri Olsa
  2016-07-19  6:55   ` [tip:perf/core] " tip-bot for Jiri Olsa
  1 sibling, 1 reply; 12+ messages in thread
From: Jiri Pirko @ 2016-07-18 11:46 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Arnaldo Carvalho de Melo, lkml, David Ahern, Ingo Molnar,
	Namhyung Kim, Peter Zijlstra, Steven Rostedt (Red Hat)

Sat, Jul 16, 2016 at 06:11:20PM CEST, jolsa@kernel.org wrote:
>Add automated test for is_printable_array function.
>
>Link: http://lkml.kernel.org/n/tip-if70lj3zhdc3csdqm5webjvc@git.kernel.org
>Signed-off-by: Jiri Olsa <jolsa@kernel.org>
>---
> tools/perf/tests/Build                |  1 +
> tools/perf/tests/builtin-test.c       |  4 ++++
> tools/perf/tests/is_printable_array.c | 36 +++++++++++++++++++++++++++++++++++
> tools/perf/tests/tests.h              |  1 +
> 4 files changed, 42 insertions(+)
> create mode 100644 tools/perf/tests/is_printable_array.c
>
>diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
>index 4158422cc2a6..cb20ae1c0d35 100644
>--- a/tools/perf/tests/Build
>+++ b/tools/perf/tests/Build
>@@ -40,6 +40,7 @@ perf-y += event_update.o
> perf-y += event-times.o
> perf-y += backward-ring-buffer.o
> perf-y += sdt.o
>+perf-y += is_printable_array.o
> 
> $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c tests/Build
> 	$(call rule_mkdir)
>diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
>index 4dd2d050788a..10eb30686c9c 100644
>--- a/tools/perf/tests/builtin-test.c
>+++ b/tools/perf/tests/builtin-test.c
>@@ -222,6 +222,10 @@ static struct test generic_tests[] = {
> 		.func = test__sdt_event,
> 	},
> 	{
>+		.desc = "Test is_printable_array function",
>+		.func = test__is_printable_array,
>+	},
>+	{
> 		.func = NULL,
> 	},
> };
>diff --git a/tools/perf/tests/is_printable_array.c b/tools/perf/tests/is_printable_array.c
>new file mode 100644
>index 000000000000..42e13393e502
>--- /dev/null
>+++ b/tools/perf/tests/is_printable_array.c
>@@ -0,0 +1,36 @@
>+#include <linux/compiler.h>
>+#include "tests.h"
>+#include "debug.h"
>+#include "util.h"
>+
>+int test__is_printable_array(int subtest __maybe_unused)
>+{
>+	char buf1[] = { 'k', 'r', 4, 'v', 'a', 0 };
>+	char buf2[] = { 'k', 'r', 'a', 'v', 4, 0 };
>+	struct {
>+		char		*buf;
>+		unsigned int	 len;
>+		int		 ret;
>+	} t[] = {
>+		{ (char *) "krava",	sizeof("krava"),	1 },
>+		{ (char *) "krava",	sizeof("krava") - 1,	0 },

"a cow" ? Really? :))

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/3] perf tests: Add is_printable_array test
  2016-07-18 11:46   ` Jiri Pirko
@ 2016-07-18 12:14     ` Jiri Olsa
  2016-07-18 22:49       ` Arnaldo Carvalho de Melo
  0 siblings, 1 reply; 12+ messages in thread
From: Jiri Olsa @ 2016-07-18 12:14 UTC (permalink / raw)
  To: Jiri Pirko
  Cc: Jiri Olsa, Arnaldo Carvalho de Melo, lkml, David Ahern,
	Ingo Molnar, Namhyung Kim, Peter Zijlstra,
	Steven Rostedt (Red Hat)

On Mon, Jul 18, 2016 at 01:46:02PM +0200, Jiri Pirko wrote:

SNIP

> >diff --git a/tools/perf/tests/is_printable_array.c b/tools/perf/tests/is_printable_array.c
> >new file mode 100644
> >index 000000000000..42e13393e502
> >--- /dev/null
> >+++ b/tools/perf/tests/is_printable_array.c
> >@@ -0,0 +1,36 @@
> >+#include <linux/compiler.h>
> >+#include "tests.h"
> >+#include "debug.h"
> >+#include "util.h"
> >+
> >+int test__is_printable_array(int subtest __maybe_unused)
> >+{
> >+	char buf1[] = { 'k', 'r', 4, 'v', 'a', 0 };
> >+	char buf2[] = { 'k', 'r', 'a', 'v', 4, 0 };
> >+	struct {
> >+		char		*buf;
> >+		unsigned int	 len;
> >+		int		 ret;
> >+	} t[] = {
> >+		{ (char *) "krava",	sizeof("krava"),	1 },
> >+		{ (char *) "krava",	sizeof("krava") - 1,	0 },
> 
> "a cow" ? Really? :))

yea, trying to force it as 'perf animal' instead of that pony stuff ;-)

http://www.brendangregg.com/blog/2015-07-08/choosing-a-linux-tracer.html

jirka

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/3] perf tests: Add is_printable_array test
  2016-07-18 12:14     ` Jiri Olsa
@ 2016-07-18 22:49       ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 12+ messages in thread
From: Arnaldo Carvalho de Melo @ 2016-07-18 22:49 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Jiri Pirko, Jiri Olsa, lkml, David Ahern, Ingo Molnar,
	Namhyung Kim, Peter Zijlstra, Steven Rostedt (Red Hat)

Em Mon, Jul 18, 2016 at 02:14:09PM +0200, Jiri Olsa escreveu:
> On Mon, Jul 18, 2016 at 01:46:02PM +0200, Jiri Pirko wrote:
> 
> SNIP
> 
> > >diff --git a/tools/perf/tests/is_printable_array.c b/tools/perf/tests/is_printable_array.c
> > >new file mode 100644
> > >index 000000000000..42e13393e502
> > >--- /dev/null
> > >+++ b/tools/perf/tests/is_printable_array.c
> > >@@ -0,0 +1,36 @@
> > >+#include <linux/compiler.h>
> > >+#include "tests.h"
> > >+#include "debug.h"
> > >+#include "util.h"
> > >+
> > >+int test__is_printable_array(int subtest __maybe_unused)
> > >+{
> > >+	char buf1[] = { 'k', 'r', 4, 'v', 'a', 0 };
> > >+	char buf2[] = { 'k', 'r', 'a', 'v', 4, 0 };
> > >+	struct {
> > >+		char		*buf;
> > >+		unsigned int	 len;
> > >+		int		 ret;
> > >+	} t[] = {
> > >+		{ (char *) "krava",	sizeof("krava"),	1 },
> > >+		{ (char *) "krava",	sizeof("krava") - 1,	0 },
> > 
> > "a cow" ? Really? :))
> 
> yea, trying to force it as 'perf animal' instead of that pony stuff ;-)
> 
> http://www.brendangregg.com/blog/2015-07-08/choosing-a-linux-tracer.html

Yeah, a vaca! 8-)

- ARnaldo

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [tip:perf/core] perf script python: Fix string vs byte array resolving
  2016-07-16 16:11 ` [PATCH 1/3] perf script python: Fix string vs byte array resolving Jiri Olsa
  2016-07-18 11:44   ` Jiri Pirko
@ 2016-07-19  6:54   ` tip-bot for Jiri Olsa
  1 sibling, 0 replies; 12+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-07-19  6:54 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: tglx, linux-kernel, namhyung, mingo, hpa, rostedt, acme, jiri,
	a.p.zijlstra, jolsa, dsahern

Commit-ID:  249de6e074580988d3ee4902236803098e2cda4c
Gitweb:     http://git.kernel.org/tip/249de6e074580988d3ee4902236803098e2cda4c
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Sat, 16 Jul 2016 18:11:18 +0200
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 18 Jul 2016 19:48:04 -0300

perf script python: Fix string vs byte array resolving

Jirka reported that python code returns all arrays as strings.  This
makes impossible to get all items for byte array tracepoint field
containing 0x00 value item.

Fixing this by scanning full length of the array and returning it as
PyByteArray object in case non printable byte is found.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Reported-and-Tested-by: Jiri Pirko <jiri@mellanox.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1468685480-18951-2-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 .../util/scripting-engines/trace-event-python.c    | 39 ++++++++++++++++++----
 1 file changed, 33 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 6ac6b7a..7bd6da8 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -386,6 +386,21 @@ exit:
 	return pylist;
 }
 
+static int is_printable_array(char *p, unsigned int len)
+{
+	unsigned int i;
+
+	if (!p || !len || p[len - 1] != 0)
+		return 0;
+
+	len--;
+
+	for (i = 0; i < len; i++) {
+		if (!isprint(p[i]) && !isspace(p[i]))
+			return 0;
+	}
+	return 1;
+}
 
 static void python_process_tracepoint(struct perf_sample *sample,
 				      struct perf_evsel *evsel,
@@ -457,14 +472,26 @@ static void python_process_tracepoint(struct perf_sample *sample,
 		pydict_set_item_string_decref(dict, "common_callchain", callchain);
 	}
 	for (field = event->format.fields; field; field = field->next) {
-		if (field->flags & FIELD_IS_STRING) {
-			int offset;
+		unsigned int offset, len;
+		unsigned long long val;
+
+		if (field->flags & FIELD_IS_ARRAY) {
+			offset = field->offset;
+			len    = field->size;
 			if (field->flags & FIELD_IS_DYNAMIC) {
-				offset = *(int *)(data + field->offset);
+				val     = pevent_read_number(scripting_context->pevent,
+							     data + offset, len);
+				offset  = val;
+				len     = offset >> 16;
 				offset &= 0xffff;
-			} else
-				offset = field->offset;
-			obj = PyString_FromString((char *)data + offset);
+			}
+			if (field->flags & FIELD_IS_STRING &&
+			    is_printable_array(data + offset, len)) {
+				obj = PyString_FromString((char *) data + offset);
+			} else {
+				obj = PyByteArray_FromStringAndSize((const char *) data + offset, len);
+				field->flags &= ~FIELD_IS_STRING;
+			}
 		} else { /* FIELD_IS_NUMERIC */
 			obj = get_field_numeric_entry(event, field, data);
 		}

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [tip:perf/core] perf tools: Make is_printable_array global
  2016-07-16 16:11 ` [PATCH 2/3] perf tools: Make is_printable_array global Jiri Olsa
  2016-07-18 11:44   ` Jiri Pirko
@ 2016-07-19  6:54   ` tip-bot for Jiri Olsa
  1 sibling, 0 replies; 12+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-07-19  6:54 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: jolsa, hpa, rostedt, jiri, acme, tglx, mingo, namhyung,
	a.p.zijlstra, dsahern, linux-kernel

Commit-ID:  accaed2659530b4047678070cb23fd1d9a1c1a59
Gitweb:     http://git.kernel.org/tip/accaed2659530b4047678070cb23fd1d9a1c1a59
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Sat, 16 Jul 2016 18:11:19 +0200
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 18 Jul 2016 19:49:47 -0300

perf tools: Make is_printable_array global

It's used from 2 objects in perf, so it's better to keep just one copy.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Pirko <jiri@mellanox.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1468685480-18951-3-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/python.c                               | 12 ------------
 tools/perf/util/scripting-engines/trace-event-python.c | 16 ----------------
 tools/perf/util/util.c                                 | 16 ++++++++++++++++
 tools/perf/util/util.h                                 |  1 +
 4 files changed, 17 insertions(+), 28 deletions(-)

diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index d32f970..a5fbc01 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -295,18 +295,6 @@ static bool is_tracepoint(struct pyrf_event *pevent)
 	return pevent->evsel->attr.type == PERF_TYPE_TRACEPOINT;
 }
 
-static int is_printable_array(char *p, unsigned int len)
-{
-	unsigned int i;
-
-	for (i = 0; i < len; i++) {
-		if (!isprint(p[i]) && !isspace(p[i]))
-			return 0;
-	}
-
-	return 1;
-}
-
 static PyObject*
 tracepoint_field(struct pyrf_event *pe, struct format_field *field)
 {
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 7bd6da8..e0203b9 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -386,22 +386,6 @@ exit:
 	return pylist;
 }
 
-static int is_printable_array(char *p, unsigned int len)
-{
-	unsigned int i;
-
-	if (!p || !len || p[len - 1] != 0)
-		return 0;
-
-	len--;
-
-	for (i = 0; i < len; i++) {
-		if (!isprint(p[i]) && !isspace(p[i]))
-			return 0;
-	}
-	return 1;
-}
-
 static void python_process_tracepoint(struct perf_sample *sample,
 				      struct perf_evsel *evsel,
 				      struct addr_location *al)
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index 5f44a21..cee559d 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -746,3 +746,19 @@ void print_binary(unsigned char *data, size_t len,
 	}
 	printer(BINARY_PRINT_DATA_END, -1, extra);
 }
+
+int is_printable_array(char *p, unsigned int len)
+{
+	unsigned int i;
+
+	if (!p || !len || p[len - 1] != 0)
+		return 0;
+
+	len--;
+
+	for (i = 0; i < len; i++) {
+		if (!isprint(p[i]) && !isspace(p[i]))
+			return 0;
+	}
+	return 1;
+}
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 843cbba..e5f5547 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -364,4 +364,5 @@ void print_binary(unsigned char *data, size_t len,
 extern int sched_getcpu(void);
 #endif
 
+int is_printable_array(char *p, unsigned int len);
 #endif /* GIT_COMPAT_UTIL_H */

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [tip:perf/core] perf tests: Add is_printable_array test
  2016-07-16 16:11 ` [PATCH 3/3] perf tests: Add is_printable_array test Jiri Olsa
  2016-07-18 11:46   ` Jiri Pirko
@ 2016-07-19  6:55   ` tip-bot for Jiri Olsa
  1 sibling, 0 replies; 12+ messages in thread
From: tip-bot for Jiri Olsa @ 2016-07-19  6:55 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: jiri, acme, jolsa, hpa, a.p.zijlstra, namhyung, tglx, dsahern,
	linux-kernel, mingo, rostedt

Commit-ID:  988dd774dcbd9151c2a643fc7284c5c3c4d0adb7
Gitweb:     http://git.kernel.org/tip/988dd774dcbd9151c2a643fc7284c5c3c4d0adb7
Author:     Jiri Olsa <jolsa@kernel.org>
AuthorDate: Sat, 16 Jul 2016 18:11:20 +0200
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 18 Jul 2016 19:50:35 -0300

perf tests: Add is_printable_array test

Add automated test for is_printable_array function.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Pirko <jiri@mellanox.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1468685480-18951-4-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/tests/Build                |  1 +
 tools/perf/tests/builtin-test.c       |  4 ++++
 tools/perf/tests/is_printable_array.c | 36 +++++++++++++++++++++++++++++++++++
 tools/perf/tests/tests.h              |  1 +
 4 files changed, 42 insertions(+)

diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 4158422..cb20ae1 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -40,6 +40,7 @@ perf-y += event_update.o
 perf-y += event-times.o
 perf-y += backward-ring-buffer.o
 perf-y += sdt.o
+perf-y += is_printable_array.o
 
 $(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c tests/Build
 	$(call rule_mkdir)
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 4dd2d05..10eb306 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -222,6 +222,10 @@ static struct test generic_tests[] = {
 		.func = test__sdt_event,
 	},
 	{
+		.desc = "Test is_printable_array function",
+		.func = test__is_printable_array,
+	},
+	{
 		.func = NULL,
 	},
 };
diff --git a/tools/perf/tests/is_printable_array.c b/tools/perf/tests/is_printable_array.c
new file mode 100644
index 0000000..42e1339
--- /dev/null
+++ b/tools/perf/tests/is_printable_array.c
@@ -0,0 +1,36 @@
+#include <linux/compiler.h>
+#include "tests.h"
+#include "debug.h"
+#include "util.h"
+
+int test__is_printable_array(int subtest __maybe_unused)
+{
+	char buf1[] = { 'k', 'r', 4, 'v', 'a', 0 };
+	char buf2[] = { 'k', 'r', 'a', 'v', 4, 0 };
+	struct {
+		char		*buf;
+		unsigned int	 len;
+		int		 ret;
+	} t[] = {
+		{ (char *) "krava",	sizeof("krava"),	1 },
+		{ (char *) "krava",	sizeof("krava") - 1,	0 },
+		{ (char *) "",		sizeof(""),		1 },
+		{ (char *) "",		0,			0 },
+		{ NULL,			0,			0 },
+		{ buf1,			sizeof(buf1),		0 },
+		{ buf2,			sizeof(buf2),		0 },
+	};
+	unsigned int i;
+
+	for (i = 0; i < ARRAY_SIZE(t); i++) {
+		int ret;
+
+		ret = is_printable_array((char *) t[i].buf, t[i].len);
+		if (ret != t[i].ret) {
+			pr_err("failed: test %u\n", i);
+			return TEST_FAIL;
+		}
+	}
+
+	return TEST_OK;
+}
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index a0288f8..9bfc0e0 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -89,6 +89,7 @@ int test__event_times(int subtest);
 int test__backward_ring_buffer(int subtest);
 int test__cpu_map_print(int subtest);
 int test__sdt_event(int subtest);
+int test__is_printable_array(int subtest);
 
 #if defined(__arm__) || defined(__aarch64__)
 #ifdef HAVE_DWARF_UNWIND_SUPPORT

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2016-07-19  6:55 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-16 16:11 [PATCHv3 0/3] perf python: Add support to access tracepoint fields Jiri Olsa
2016-07-16 16:11 ` [PATCH 1/3] perf script python: Fix string vs byte array resolving Jiri Olsa
2016-07-18 11:44   ` Jiri Pirko
2016-07-19  6:54   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-07-16 16:11 ` [PATCH 2/3] perf tools: Make is_printable_array global Jiri Olsa
2016-07-18 11:44   ` Jiri Pirko
2016-07-19  6:54   ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-07-16 16:11 ` [PATCH 3/3] perf tests: Add is_printable_array test Jiri Olsa
2016-07-18 11:46   ` Jiri Pirko
2016-07-18 12:14     ` Jiri Olsa
2016-07-18 22:49       ` Arnaldo Carvalho de Melo
2016-07-19  6:55   ` [tip:perf/core] " tip-bot for Jiri Olsa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).