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


Groups > linux.kernel > #1445919

[PATCH 13/15] perf script python: Fix string vs byte array resolving

From Arnaldo Carvalho de Melo <acme@kernel.org>
Newsgroups linux.kernel
Subject [PATCH 13/15] perf script python: Fix string vs byte array resolving
Date 2016-07-19 01:40 +0200
Message-ID <rWqiJ-4rm-21@gated-at.bofh.it> (permalink)
References <rWqiJ-4rm-5@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Jiri Olsa <jolsa@kernel.org>

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 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.7.4

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[GIT PULL 00/15] perf/core improvements and fixes Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 01/15] perf jit: Add missing curly braces Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 11/15] perf cpu_map: Add more helpers Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 07/15] tools: Copy the bitops files accessed from the kernel and check for drift Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 13/15] perf script python: Fix string vs byte array resolving Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 10/15] perf stat: Balance opening and reading events Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 12/15] perf probe: Warn unmatched function filter correctly Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 08/15] perf tools: Remove include/linux/list.h from perf's MANIFEST Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 05/15] perf tools: Remove tools/perf/util/include/linux/const.h Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 06/15] Remove: kernel unistd*h files from perf's MANIFEST, not used Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 04/15] perf tools: Remove tools/perf/util/include/asm/byteorder.h Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 02/15] perf jit: Remove some no-op error handling Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  [PATCH 14/15] perf tools: Make is_printable_array global Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-07-19 01:40 +0200
  Re: [GIT PULL 00/15] perf/core improvements and fixes Ingo Molnar <mingo@kernel.org> - 2016-07-19 08:50 +0200

csiph-web