* [RESEND PATCH v8 0/2] Add array printing support to libtraceevent @ 2015-03-20 18:12 Javi Merino 2015-03-20 18:12 ` [RESEND PATCH v8 1/2] tools lib traceevent: factor out allocating and processing args Javi Merino ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Javi Merino @ 2015-03-20 18:12 UTC (permalink / raw) To: acme, jolsa; +Cc: linux-kernel, Javi Merino This series add support to libtraceevent for dynamic arrays in traces. The kernel learned to create this traces in 6ea22486ba46 ("tracing: Add array printing helper"), which was merged for v4.0-rc1. Changes since v7[0]: - Call the fields of the struct print_arg_int_array "field", "count" and "el_size" to match the definition of __print_array as Namhyung Kim suggests. Incorporate his Acked-by. Changes since v6[1]: - s/alloc_and_process_arg/alloc_and_process_delim/ as Steven Rostedt suggests [0] http://thread.gmane.org/gmane.linux.kernel/1897935 [1] http://thread.gmane.org/gmane.linux.kernel/1896232 Javi Merino (2): tools lib traceevent: factor out allocating and processing args tools lib traceevent: Add support for __print_array() tools/lib/traceevent/event-parse.c | 158 +++++++++++++++++++++++++++++-------- tools/lib/traceevent/event-parse.h | 8 ++ 2 files changed, 135 insertions(+), 31 deletions(-) -- 1.9.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [RESEND PATCH v8 1/2] tools lib traceevent: factor out allocating and processing args 2015-03-20 18:12 [RESEND PATCH v8 0/2] Add array printing support to libtraceevent Javi Merino @ 2015-03-20 18:12 ` Javi Merino 2015-03-24 16:31 ` [tip:perf/core] tools lib traceevent: Factor " tip-bot for Javi Merino 2015-03-20 18:12 ` [RESEND PATCH v8 2/2] tools lib traceevent: Add support for __print_array() Javi Merino 2015-03-23 16:18 ` [RESEND PATCH v8 0/2] Add array printing support to libtraceevent Arnaldo Carvalho de Melo 2 siblings, 1 reply; 9+ messages in thread From: Javi Merino @ 2015-03-20 18:12 UTC (permalink / raw) To: acme, jolsa; +Cc: linux-kernel, Javi Merino The sequence of allocating the print_arg field, calling process_arg() and verifying that the next event delimiter is repeated twice in process_hex() and will also be used for process_int_array(). Factor it out to a function to avoid writing the same code again and again. Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Acked-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Javi Merino <javi.merino@arm.com> --- tools/lib/traceevent/event-parse.c | 77 ++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index afe20ed9fac8..ac20601257de 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c @@ -2014,6 +2014,38 @@ process_entry(struct event_format *event __maybe_unused, struct print_arg *arg, return EVENT_ERROR; } +static int alloc_and_process_delim(struct event_format *event, char *next_token, + struct print_arg **print_arg) +{ + struct print_arg *field; + enum event_type type; + char *token; + int ret = 0; + + field = alloc_arg(); + if (!field) { + do_warning_event(event, "%s: not enough memory!", __func__); + errno = ENOMEM; + return -1; + } + + type = process_arg(event, field, &token); + + if (test_type_token(type, token, EVENT_DELIM, next_token)) { + errno = EINVAL; + ret = -1; + free_arg(field); + goto out_free_token; + } + + *print_arg = field; + +out_free_token: + free_token(token); + + return ret; +} + static char *arg_eval (struct print_arg *arg); static unsigned long long @@ -2486,49 +2518,20 @@ out_free: static enum event_type process_hex(struct event_format *event, struct print_arg *arg, char **tok) { - struct print_arg *field; - enum event_type type; - char *token = NULL; - memset(arg, 0, sizeof(*arg)); arg->type = PRINT_HEX; - field = alloc_arg(); - if (!field) { - do_warning_event(event, "%s: not enough memory!", __func__); - goto out_free; - } - - type = process_arg(event, field, &token); - - if (test_type_token(type, token, EVENT_DELIM, ",")) - goto out_free; - - arg->hex.field = field; - - free_token(token); - - field = alloc_arg(); - if (!field) { - do_warning_event(event, "%s: not enough memory!", __func__); - *tok = NULL; - return EVENT_ERROR; - } - - type = process_arg(event, field, &token); - - if (test_type_token(type, token, EVENT_DELIM, ")")) - goto out_free; + if (alloc_and_process_delim(event, ",", &arg->hex.field)) + goto out; - arg->hex.size = field; + if (alloc_and_process_delim(event, ")", &arg->hex.size)) + goto free_field; - free_token(token); - type = read_token_item(tok); - return type; + return read_token_item(tok); - out_free: - free_arg(field); - free_token(token); +free_field: + free_arg(arg->hex.field); +out: *tok = NULL; return EVENT_ERROR; } -- 1.9.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [tip:perf/core] tools lib traceevent: Factor out allocating and processing args 2015-03-20 18:12 ` [RESEND PATCH v8 1/2] tools lib traceevent: factor out allocating and processing args Javi Merino @ 2015-03-24 16:31 ` tip-bot for Javi Merino 0 siblings, 0 replies; 9+ messages in thread From: tip-bot for Javi Merino @ 2015-03-24 16:31 UTC (permalink / raw) To: linux-tip-commits Cc: acme, linux-kernel, hpa, namhyung, javi.merino, jolsa, tglx, mingo, rostedt Commit-ID: 929a6bb71aa5ae6cb15b4b42ab7ac183ee286a1a Gitweb: http://git.kernel.org/tip/929a6bb71aa5ae6cb15b4b42ab7ac183ee286a1a Author: Javi Merino <javi.merino@arm.com> AuthorDate: Fri, 20 Mar 2015 18:12:55 +0000 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Tue, 24 Mar 2015 12:07:05 -0300 tools lib traceevent: Factor out allocating and processing args The sequence of allocating the print_arg field, calling process_arg() and verifying that the next event delimiter is repeated twice in process_hex() and will also be used for process_int_array(). Factor it out to a function to avoid writing the same code again and again. Signed-off-by: Javi Merino <javi.merino@arm.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Steven Rostedt <rostedt@goodmis.org> Cc: Jiri Olsa <jolsa@redhat.com> Link: http://lkml.kernel.org/r/1426875176-30244-2-git-send-email-javi.merino@arm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/lib/traceevent/event-parse.c | 77 ++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index d7c37a7..8e5e4f6 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c @@ -2014,6 +2014,38 @@ process_entry(struct event_format *event __maybe_unused, struct print_arg *arg, return EVENT_ERROR; } +static int alloc_and_process_delim(struct event_format *event, char *next_token, + struct print_arg **print_arg) +{ + struct print_arg *field; + enum event_type type; + char *token; + int ret = 0; + + field = alloc_arg(); + if (!field) { + do_warning_event(event, "%s: not enough memory!", __func__); + errno = ENOMEM; + return -1; + } + + type = process_arg(event, field, &token); + + if (test_type_token(type, token, EVENT_DELIM, next_token)) { + errno = EINVAL; + ret = -1; + free_arg(field); + goto out_free_token; + } + + *print_arg = field; + +out_free_token: + free_token(token); + + return ret; +} + static char *arg_eval (struct print_arg *arg); static unsigned long long @@ -2486,49 +2518,20 @@ out_free: static enum event_type process_hex(struct event_format *event, struct print_arg *arg, char **tok) { - struct print_arg *field; - enum event_type type; - char *token = NULL; - memset(arg, 0, sizeof(*arg)); arg->type = PRINT_HEX; - field = alloc_arg(); - if (!field) { - do_warning_event(event, "%s: not enough memory!", __func__); - goto out_free; - } - - type = process_arg(event, field, &token); - - if (test_type_token(type, token, EVENT_DELIM, ",")) - goto out_free; - - arg->hex.field = field; - - free_token(token); - - field = alloc_arg(); - if (!field) { - do_warning_event(event, "%s: not enough memory!", __func__); - *tok = NULL; - return EVENT_ERROR; - } - - type = process_arg(event, field, &token); - - if (test_type_token(type, token, EVENT_DELIM, ")")) - goto out_free; + if (alloc_and_process_delim(event, ",", &arg->hex.field)) + goto out; - arg->hex.size = field; + if (alloc_and_process_delim(event, ")", &arg->hex.size)) + goto free_field; - free_token(token); - type = read_token_item(tok); - return type; + return read_token_item(tok); - out_free: - free_arg(field); - free_token(token); +free_field: + free_arg(arg->hex.field); +out: *tok = NULL; return EVENT_ERROR; } ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [RESEND PATCH v8 2/2] tools lib traceevent: Add support for __print_array() 2015-03-20 18:12 [RESEND PATCH v8 0/2] Add array printing support to libtraceevent Javi Merino 2015-03-20 18:12 ` [RESEND PATCH v8 1/2] tools lib traceevent: factor out allocating and processing args Javi Merino @ 2015-03-20 18:12 ` Javi Merino 2015-03-23 16:20 ` Arnaldo Carvalho de Melo 2015-03-23 16:18 ` [RESEND PATCH v8 0/2] Add array printing support to libtraceevent Arnaldo Carvalho de Melo 2 siblings, 1 reply; 9+ messages in thread From: Javi Merino @ 2015-03-20 18:12 UTC (permalink / raw) To: acme, jolsa; +Cc: linux-kernel, Javi Merino Since 6ea22486ba46 ("tracing: Add array printing helper") trace can traces with variable element size arrays. Add support to parse them. Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Acked-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Javi Merino <javi.merino@arm.com> --- tools/lib/traceevent/event-parse.c | 93 ++++++++++++++++++++++++++++++++++++++ tools/lib/traceevent/event-parse.h | 8 ++++ 2 files changed, 101 insertions(+) diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index ac20601257de..838405ece41d 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c @@ -758,6 +758,11 @@ static void free_arg(struct print_arg *arg) free_arg(arg->hex.field); free_arg(arg->hex.size); break; + case PRINT_INT_ARRAY: + free_arg(arg->int_array.field); + free_arg(arg->int_array.count); + free_arg(arg->int_array.el_size); + break; case PRINT_TYPE: free(arg->typecast.type); free_arg(arg->typecast.item); @@ -2537,6 +2542,32 @@ out: } static enum event_type +process_int_array(struct event_format *event, struct print_arg *arg, char **tok) +{ + memset(arg, 0, sizeof(*arg)); + arg->type = PRINT_INT_ARRAY; + + if (alloc_and_process_delim(event, ",", &arg->int_array.field)) + goto out; + + if (alloc_and_process_delim(event, ",", &arg->int_array.count)) + goto free_field; + + if (alloc_and_process_delim(event, ")", &arg->int_array.el_size)) + goto free_size; + + return read_token_item(tok); + +free_size: + free_arg(arg->int_array.count); +free_field: + free_arg(arg->int_array.field); +out: + *tok = NULL; + return EVENT_ERROR; +} + +static enum event_type process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok) { struct format_field *field; @@ -2831,6 +2862,10 @@ process_function(struct event_format *event, struct print_arg *arg, free_token(token); return process_hex(event, arg, tok); } + if (strcmp(token, "__print_array") == 0) { + free_token(token); + return process_int_array(event, arg, tok); + } if (strcmp(token, "__get_str") == 0) { free_token(token); return process_str(event, arg, tok); @@ -3359,6 +3394,7 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg break; case PRINT_FLAGS: case PRINT_SYMBOL: + case PRINT_INT_ARRAY: case PRINT_HEX: break; case PRINT_TYPE: @@ -3769,6 +3805,54 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, } break; + case PRINT_INT_ARRAY: { + void *num; + int el_size; + + if (arg->int_array.field->type == PRINT_DYNAMIC_ARRAY) { + unsigned long offset; + struct format_field *field = + arg->int_array.field->dynarray.field; + offset = pevent_read_number(pevent, + data + field->offset, + field->size); + num = data + (offset & 0xffff); + } else { + field = arg->int_array.field->field.field; + if (!field) { + str = arg->int_array.field->field.name; + field = pevent_find_any_field(event, str); + if (!field) + goto out_warning_field; + arg->int_array.field->field.field = field; + } + num = data + field->offset; + } + len = eval_num_arg(data, size, event, arg->int_array.count); + el_size = eval_num_arg(data, size, event, + arg->int_array.el_size); + for (i = 0; i < len; i++) { + if (i) + trace_seq_putc(s, ' '); + + if (el_size == 1) { + trace_seq_printf(s, "%u", *(uint8_t *)num); + } else if (el_size == 2) { + trace_seq_printf(s, "%u", *(uint16_t *)num); + } else if (el_size == 4) { + trace_seq_printf(s, "%u", *(uint32_t *)num); + } else if (el_size == 8) { + trace_seq_printf(s, "%llu", *(uint64_t *)num); + } else { + trace_seq_printf(s, "BAD SIZE:%d 0x%x", + el_size, *(uint8_t *)num); + el_size = 1; + } + + num += el_size; + } + break; + } case PRINT_TYPE: break; case PRINT_STRING: { @@ -5259,6 +5343,15 @@ static void print_args(struct print_arg *args) print_args(args->hex.size); printf(")"); break; + case PRINT_INT_ARRAY: + printf("__print_array("); + print_args(args->int_array.field); + printf(", "); + print_args(args->int_array.count); + printf(", "); + print_args(args->int_array.el_size); + printf(")"); + break; case PRINT_STRING: case PRINT_BSTRING: printf("__get_str(%s)", args->string.string); diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h index 7a3873ff9a4f..94c514a0f045 100644 --- a/tools/lib/traceevent/event-parse.h +++ b/tools/lib/traceevent/event-parse.h @@ -245,6 +245,12 @@ struct print_arg_hex { struct print_arg *size; }; +struct print_arg_int_array { + struct print_arg *field; + struct print_arg *count; + struct print_arg *el_size; +}; + struct print_arg_dynarray { struct format_field *field; struct print_arg *index; @@ -273,6 +279,7 @@ enum print_arg_type { PRINT_FLAGS, PRINT_SYMBOL, PRINT_HEX, + PRINT_INT_ARRAY, PRINT_TYPE, PRINT_STRING, PRINT_BSTRING, @@ -292,6 +299,7 @@ struct print_arg { struct print_arg_flags flags; struct print_arg_symbol symbol; struct print_arg_hex hex; + struct print_arg_int_array int_array; struct print_arg_func func; struct print_arg_string string; struct print_arg_bitmask bitmask; -- 1.9.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [RESEND PATCH v8 2/2] tools lib traceevent: Add support for __print_array() 2015-03-20 18:12 ` [RESEND PATCH v8 2/2] tools lib traceevent: Add support for __print_array() Javi Merino @ 2015-03-23 16:20 ` Arnaldo Carvalho de Melo 2015-03-24 11:07 ` [PATCH v9] " Javi Merino 0 siblings, 1 reply; 9+ messages in thread From: Arnaldo Carvalho de Melo @ 2015-03-23 16:20 UTC (permalink / raw) To: Javi Merino; +Cc: jolsa, linux-kernel Em Fri, Mar 20, 2015 at 06:12:56PM +0000, Javi Merino escreveu: > Since 6ea22486ba46 ("tracing: Add array printing helper") trace can > traces with variable element size arrays. Add support to parse them. > > Cc: Arnaldo Carvalho de Melo <acme@redhat.com> > Cc: Jiri Olsa <jolsa@redhat.com> > Acked-by: Steven Rostedt <rostedt@goodmis.org> > Acked-by: Namhyung Kim <namhyung@kernel.org> > Signed-off-by: Javi Merino <javi.merino@arm.com> Oops: CC util/pmu-flex.o util/scripting-engines/trace-event-python.c: In function ‘define_event_symbols’: util/scripting-engines/trace-event-python.c:205:2: error: enumeration value ‘PRINT_INT_ARRAY’ not handled in switch [-Werror=switch-enum] switch (args->type) { ^ cc1: all warnings being treated as errors make[6]: *** [util/scripting-engines/trace-event-python.o] Error 1 make[6]: *** Waiting for unfinished jobs.... util/scripting-engines/trace-event-perl.c: In function ‘define_event_symbols’: util/scripting-engines/trace-event-perl.c:190:2: error: enumeration value ‘PRINT_INT_ARRAY’ not handled in switch [-Werror=switch-enum] switch (args->type) { ^ cc1: all warnings being treated as errors make[6]: *** [util/scripting-engines/trace-event-perl.o] Error 1 make[5]: *** [scripting-engines] Error 2 make[5]: *** Waiting for unfinished jobs.... make[4]: *** [util] Error 2 make[3]: *** [libperf-in.o] Error 2 make[2]: *** [all] Error 2 test: test -x ./perf make[1]: *** [make_pure] Error 1 make: *** [build-test] Error 2 make: Leaving directory `/home/acme/git/linux/tools/perf' real 0m14.738s user 1m2.124s sys 0m8.653s [acme@ssdandy linux]$ First one is applied, please fix this one. [acme@ssdandy linux]$ gcc -v Using built-in specs. COLLECT_GCC=/usr/bin/gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.3/lto-wrapper Target: x86_64-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.3-20140911/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.3-20140911/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux Thread model: posix gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) [acme@ssdandy linux]$ - Arnaldo ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v9] tools lib traceevent: Add support for __print_array() 2015-03-23 16:20 ` Arnaldo Carvalho de Melo @ 2015-03-24 11:07 ` Javi Merino 2015-03-24 15:48 ` Arnaldo Carvalho de Melo 2015-03-24 16:35 ` [tip:perf/core] " tip-bot for Javi Merino 0 siblings, 2 replies; 9+ messages in thread From: Javi Merino @ 2015-03-24 11:07 UTC (permalink / raw) To: acme, jolsa; +Cc: linux-kernel, namhyung, Javi Merino Since 6ea22486ba46 ("tracing: Add array printing helper") trace can generate traces with variable element size arrays. Add support to parse them. Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Acked-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Javi Merino <javi.merino@arm.com> --- Changes since v8: - Add PRINT_INT_ARRAY to define_event_symbols() in perf's scripting engines as Arnaldo suggested. - Use %lu instead of %llu for uint64_t Note, I'm not familiar with perf, so I've only compile-tested the changes in tools/perf/util/scripting-engines/trace-event-python.c and tools/perf/util/scripting-engines/trace-event-perl.c by imitating the code that is around. I'm not sure if that is the correct fix or it should be ignored like PRINT_DYNAMIC_ARRAY and friends. tools/lib/traceevent/event-parse.c | 93 ++++++++++++++++++++++ tools/lib/traceevent/event-parse.h | 8 ++ .../perf/util/scripting-engines/trace-event-perl.c | 5 ++ .../util/scripting-engines/trace-event-python.c | 5 ++ 4 files changed, 111 insertions(+) diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index 8e5e4f6137bb..080d02714fb5 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c @@ -758,6 +758,11 @@ static void free_arg(struct print_arg *arg) free_arg(arg->hex.field); free_arg(arg->hex.size); break; + case PRINT_INT_ARRAY: + free_arg(arg->int_array.field); + free_arg(arg->int_array.count); + free_arg(arg->int_array.el_size); + break; case PRINT_TYPE: free(arg->typecast.type); free_arg(arg->typecast.item); @@ -2537,6 +2542,32 @@ out: } static enum event_type +process_int_array(struct event_format *event, struct print_arg *arg, char **tok) +{ + memset(arg, 0, sizeof(*arg)); + arg->type = PRINT_INT_ARRAY; + + if (alloc_and_process_delim(event, ",", &arg->int_array.field)) + goto out; + + if (alloc_and_process_delim(event, ",", &arg->int_array.count)) + goto free_field; + + if (alloc_and_process_delim(event, ")", &arg->int_array.el_size)) + goto free_size; + + return read_token_item(tok); + +free_size: + free_arg(arg->int_array.count); +free_field: + free_arg(arg->int_array.field); +out: + *tok = NULL; + return EVENT_ERROR; +} + +static enum event_type process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok) { struct format_field *field; @@ -2831,6 +2862,10 @@ process_function(struct event_format *event, struct print_arg *arg, free_token(token); return process_hex(event, arg, tok); } + if (strcmp(token, "__print_array") == 0) { + free_token(token); + return process_int_array(event, arg, tok); + } if (strcmp(token, "__get_str") == 0) { free_token(token); return process_str(event, arg, tok); @@ -3359,6 +3394,7 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg break; case PRINT_FLAGS: case PRINT_SYMBOL: + case PRINT_INT_ARRAY: case PRINT_HEX: break; case PRINT_TYPE: @@ -3769,6 +3805,54 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, } break; + case PRINT_INT_ARRAY: { + void *num; + int el_size; + + if (arg->int_array.field->type == PRINT_DYNAMIC_ARRAY) { + unsigned long offset; + struct format_field *field = + arg->int_array.field->dynarray.field; + offset = pevent_read_number(pevent, + data + field->offset, + field->size); + num = data + (offset & 0xffff); + } else { + field = arg->int_array.field->field.field; + if (!field) { + str = arg->int_array.field->field.name; + field = pevent_find_any_field(event, str); + if (!field) + goto out_warning_field; + arg->int_array.field->field.field = field; + } + num = data + field->offset; + } + len = eval_num_arg(data, size, event, arg->int_array.count); + el_size = eval_num_arg(data, size, event, + arg->int_array.el_size); + for (i = 0; i < len; i++) { + if (i) + trace_seq_putc(s, ' '); + + if (el_size == 1) { + trace_seq_printf(s, "%u", *(uint8_t *)num); + } else if (el_size == 2) { + trace_seq_printf(s, "%u", *(uint16_t *)num); + } else if (el_size == 4) { + trace_seq_printf(s, "%u", *(uint32_t *)num); + } else if (el_size == 8) { + trace_seq_printf(s, "%lu", *(uint64_t *)num); + } else { + trace_seq_printf(s, "BAD SIZE:%d 0x%x", + el_size, *(uint8_t *)num); + el_size = 1; + } + + num += el_size; + } + break; + } case PRINT_TYPE: break; case PRINT_STRING: { @@ -5259,6 +5343,15 @@ static void print_args(struct print_arg *args) print_args(args->hex.size); printf(")"); break; + case PRINT_INT_ARRAY: + printf("__print_array("); + print_args(args->int_array.field); + printf(", "); + print_args(args->int_array.count); + printf(", "); + print_args(args->int_array.el_size); + printf(")"); + break; case PRINT_STRING: case PRINT_BSTRING: printf("__get_str(%s)", args->string.string); diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h index 6abda54d76f2..6285bea0610b 100644 --- a/tools/lib/traceevent/event-parse.h +++ b/tools/lib/traceevent/event-parse.h @@ -247,6 +247,12 @@ struct print_arg_hex { struct print_arg *size; }; +struct print_arg_int_array { + struct print_arg *field; + struct print_arg *count; + struct print_arg *el_size; +}; + struct print_arg_dynarray { struct format_field *field; struct print_arg *index; @@ -275,6 +281,7 @@ enum print_arg_type { PRINT_FLAGS, PRINT_SYMBOL, PRINT_HEX, + PRINT_INT_ARRAY, PRINT_TYPE, PRINT_STRING, PRINT_BSTRING, @@ -294,6 +301,7 @@ struct print_arg { struct print_arg_flags flags; struct print_arg_symbol symbol; struct print_arg_hex hex; + struct print_arg_int_array int_array; struct print_arg_func func; struct print_arg_string string; struct print_arg_bitmask bitmask; diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c index 22ebc46226e7..8171fed4136e 100644 --- a/tools/perf/util/scripting-engines/trace-event-perl.c +++ b/tools/perf/util/scripting-engines/trace-event-perl.c @@ -214,6 +214,11 @@ static void define_event_symbols(struct event_format *event, define_event_symbols(event, ev_name, args->hex.field); define_event_symbols(event, ev_name, args->hex.size); break; + case PRINT_INT_ARRAY: + define_event_symbols(event, ev_name, args->int_array.field); + define_event_symbols(event, ev_name, args->int_array.count); + define_event_symbols(event, ev_name, args->int_array.el_size); + break; case PRINT_BSTRING: case PRINT_DYNAMIC_ARRAY: case PRINT_STRING: diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index 0c815a40a6e8..2ec5dfb5a456 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -231,6 +231,11 @@ static void define_event_symbols(struct event_format *event, define_event_symbols(event, ev_name, args->hex.field); define_event_symbols(event, ev_name, args->hex.size); break; + case PRINT_INT_ARRAY: + define_event_symbols(event, ev_name, args->int_array.field); + define_event_symbols(event, ev_name, args->int_array.count); + define_event_symbols(event, ev_name, args->int_array.el_size); + break; case PRINT_STRING: break; case PRINT_TYPE: -- 1.9.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v9] tools lib traceevent: Add support for __print_array() 2015-03-24 11:07 ` [PATCH v9] " Javi Merino @ 2015-03-24 15:48 ` Arnaldo Carvalho de Melo 2015-03-24 16:35 ` [tip:perf/core] " tip-bot for Javi Merino 1 sibling, 0 replies; 9+ messages in thread From: Arnaldo Carvalho de Melo @ 2015-03-24 15:48 UTC (permalink / raw) To: Javi Merino; +Cc: jolsa, linux-kernel, namhyung, Steven Rostedt Em Tue, Mar 24, 2015 at 11:07:19AM +0000, Javi Merino escreveu: > Since 6ea22486ba46 ("tracing: Add array printing helper") trace can > generate traces with variable element size arrays. Add support to > parse them. > > Cc: Arnaldo Carvalho de Melo <acme@redhat.com> > Cc: Jiri Olsa <jolsa@redhat.com> > Acked-by: Steven Rostedt <rostedt@goodmis.org> > Acked-by: Namhyung Kim <namhyung@kernel.org> > Signed-off-by: Javi Merino <javi.merino@arm.com> > --- > > Changes since v8: > - Add PRINT_INT_ARRAY to define_event_symbols() in perf's scripting > engines as Arnaldo suggested. > - Use %lu instead of %llu for uint64_t > > Note, I'm not familiar with perf, so I've only compile-tested the > changes in tools/perf/util/scripting-engines/trace-event-python.c and > tools/perf/util/scripting-engines/trace-event-perl.c by imitating the > code that is around. I'm not sure if that is the correct fix or it > should be ignored like PRINT_DYNAMIC_ARRAY and friends. Yeah, would be good to get some acked-by tags, Steven? Jiri? Namhyung? What you did is equivalent, but explicitely ignoring it on the switches, so I think I can keep the acks you got, just checking... And now it builds fine, thanks. - Arnaldo > tools/lib/traceevent/event-parse.c | 93 ++++++++++++++++++++++ > tools/lib/traceevent/event-parse.h | 8 ++ > .../perf/util/scripting-engines/trace-event-perl.c | 5 ++ > .../util/scripting-engines/trace-event-python.c | 5 ++ > 4 files changed, 111 insertions(+) > > diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c > index 8e5e4f6137bb..080d02714fb5 100644 > --- a/tools/lib/traceevent/event-parse.c > +++ b/tools/lib/traceevent/event-parse.c > @@ -758,6 +758,11 @@ static void free_arg(struct print_arg *arg) > free_arg(arg->hex.field); > free_arg(arg->hex.size); > break; > + case PRINT_INT_ARRAY: > + free_arg(arg->int_array.field); > + free_arg(arg->int_array.count); > + free_arg(arg->int_array.el_size); > + break; > case PRINT_TYPE: > free(arg->typecast.type); > free_arg(arg->typecast.item); > @@ -2537,6 +2542,32 @@ out: > } > > static enum event_type > +process_int_array(struct event_format *event, struct print_arg *arg, char **tok) > +{ > + memset(arg, 0, sizeof(*arg)); > + arg->type = PRINT_INT_ARRAY; > + > + if (alloc_and_process_delim(event, ",", &arg->int_array.field)) > + goto out; > + > + if (alloc_and_process_delim(event, ",", &arg->int_array.count)) > + goto free_field; > + > + if (alloc_and_process_delim(event, ")", &arg->int_array.el_size)) > + goto free_size; > + > + return read_token_item(tok); > + > +free_size: > + free_arg(arg->int_array.count); > +free_field: > + free_arg(arg->int_array.field); > +out: > + *tok = NULL; > + return EVENT_ERROR; > +} > + > +static enum event_type > process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok) > { > struct format_field *field; > @@ -2831,6 +2862,10 @@ process_function(struct event_format *event, struct print_arg *arg, > free_token(token); > return process_hex(event, arg, tok); > } > + if (strcmp(token, "__print_array") == 0) { > + free_token(token); > + return process_int_array(event, arg, tok); > + } > if (strcmp(token, "__get_str") == 0) { > free_token(token); > return process_str(event, arg, tok); > @@ -3359,6 +3394,7 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg > break; > case PRINT_FLAGS: > case PRINT_SYMBOL: > + case PRINT_INT_ARRAY: > case PRINT_HEX: > break; > case PRINT_TYPE: > @@ -3769,6 +3805,54 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, > } > break; > > + case PRINT_INT_ARRAY: { > + void *num; > + int el_size; > + > + if (arg->int_array.field->type == PRINT_DYNAMIC_ARRAY) { > + unsigned long offset; > + struct format_field *field = > + arg->int_array.field->dynarray.field; > + offset = pevent_read_number(pevent, > + data + field->offset, > + field->size); > + num = data + (offset & 0xffff); > + } else { > + field = arg->int_array.field->field.field; > + if (!field) { > + str = arg->int_array.field->field.name; > + field = pevent_find_any_field(event, str); > + if (!field) > + goto out_warning_field; > + arg->int_array.field->field.field = field; > + } > + num = data + field->offset; > + } > + len = eval_num_arg(data, size, event, arg->int_array.count); > + el_size = eval_num_arg(data, size, event, > + arg->int_array.el_size); > + for (i = 0; i < len; i++) { > + if (i) > + trace_seq_putc(s, ' '); > + > + if (el_size == 1) { > + trace_seq_printf(s, "%u", *(uint8_t *)num); > + } else if (el_size == 2) { > + trace_seq_printf(s, "%u", *(uint16_t *)num); > + } else if (el_size == 4) { > + trace_seq_printf(s, "%u", *(uint32_t *)num); > + } else if (el_size == 8) { > + trace_seq_printf(s, "%lu", *(uint64_t *)num); > + } else { > + trace_seq_printf(s, "BAD SIZE:%d 0x%x", > + el_size, *(uint8_t *)num); > + el_size = 1; > + } > + > + num += el_size; > + } > + break; > + } > case PRINT_TYPE: > break; > case PRINT_STRING: { > @@ -5259,6 +5343,15 @@ static void print_args(struct print_arg *args) > print_args(args->hex.size); > printf(")"); > break; > + case PRINT_INT_ARRAY: > + printf("__print_array("); > + print_args(args->int_array.field); > + printf(", "); > + print_args(args->int_array.count); > + printf(", "); > + print_args(args->int_array.el_size); > + printf(")"); > + break; > case PRINT_STRING: > case PRINT_BSTRING: > printf("__get_str(%s)", args->string.string); > diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h > index 6abda54d76f2..6285bea0610b 100644 > --- a/tools/lib/traceevent/event-parse.h > +++ b/tools/lib/traceevent/event-parse.h > @@ -247,6 +247,12 @@ struct print_arg_hex { > struct print_arg *size; > }; > > +struct print_arg_int_array { > + struct print_arg *field; > + struct print_arg *count; > + struct print_arg *el_size; > +}; > + > struct print_arg_dynarray { > struct format_field *field; > struct print_arg *index; > @@ -275,6 +281,7 @@ enum print_arg_type { > PRINT_FLAGS, > PRINT_SYMBOL, > PRINT_HEX, > + PRINT_INT_ARRAY, > PRINT_TYPE, > PRINT_STRING, > PRINT_BSTRING, > @@ -294,6 +301,7 @@ struct print_arg { > struct print_arg_flags flags; > struct print_arg_symbol symbol; > struct print_arg_hex hex; > + struct print_arg_int_array int_array; > struct print_arg_func func; > struct print_arg_string string; > struct print_arg_bitmask bitmask; > diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c > index 22ebc46226e7..8171fed4136e 100644 > --- a/tools/perf/util/scripting-engines/trace-event-perl.c > +++ b/tools/perf/util/scripting-engines/trace-event-perl.c > @@ -214,6 +214,11 @@ static void define_event_symbols(struct event_format *event, > define_event_symbols(event, ev_name, args->hex.field); > define_event_symbols(event, ev_name, args->hex.size); > break; > + case PRINT_INT_ARRAY: > + define_event_symbols(event, ev_name, args->int_array.field); > + define_event_symbols(event, ev_name, args->int_array.count); > + define_event_symbols(event, ev_name, args->int_array.el_size); > + break; > case PRINT_BSTRING: > case PRINT_DYNAMIC_ARRAY: > case PRINT_STRING: > diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c > index 0c815a40a6e8..2ec5dfb5a456 100644 > --- a/tools/perf/util/scripting-engines/trace-event-python.c > +++ b/tools/perf/util/scripting-engines/trace-event-python.c > @@ -231,6 +231,11 @@ static void define_event_symbols(struct event_format *event, > define_event_symbols(event, ev_name, args->hex.field); > define_event_symbols(event, ev_name, args->hex.size); > break; > + case PRINT_INT_ARRAY: > + define_event_symbols(event, ev_name, args->int_array.field); > + define_event_symbols(event, ev_name, args->int_array.count); > + define_event_symbols(event, ev_name, args->int_array.el_size); > + break; > case PRINT_STRING: > break; > case PRINT_TYPE: > -- > 1.9.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [tip:perf/core] tools lib traceevent: Add support for __print_array() 2015-03-24 11:07 ` [PATCH v9] " Javi Merino 2015-03-24 15:48 ` Arnaldo Carvalho de Melo @ 2015-03-24 16:35 ` tip-bot for Javi Merino 1 sibling, 0 replies; 9+ messages in thread From: tip-bot for Javi Merino @ 2015-03-24 16:35 UTC (permalink / raw) To: linux-tip-commits Cc: jolsa, rostedt, acme, javi.merino, linux-kernel, mingo, tglx, namhyung, hpa Commit-ID: b839e1e846edb15cff322e262e8ce412d298232e Gitweb: http://git.kernel.org/tip/b839e1e846edb15cff322e262e8ce412d298232e Author: Javi Merino <javi.merino@arm.com> AuthorDate: Tue, 24 Mar 2015 11:07:19 +0000 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Tue, 24 Mar 2015 12:46:39 -0300 tools lib traceevent: Add support for __print_array() Since 6ea22486ba46 ("tracing: Add array printing helper") trace can generate traces with variable element size arrays. Add support to parse them. Signed-off-by: Javi Merino <javi.merino@arm.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Steven Rostedt <rostedt@goodmis.org> Cc: Jiri Olsa <jolsa@redhat.com> Link: http://lkml.kernel.org/r/1427195239-15730-1-git-send-email-javi.merino@arm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/lib/traceevent/event-parse.c | 93 ++++++++++++++++++++++ tools/lib/traceevent/event-parse.h | 8 ++ .../perf/util/scripting-engines/trace-event-perl.c | 5 ++ .../util/scripting-engines/trace-event-python.c | 5 ++ 4 files changed, 111 insertions(+) diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index bc22722..b6d11ee 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c @@ -766,6 +766,11 @@ static void free_arg(struct print_arg *arg) free_arg(arg->hex.field); free_arg(arg->hex.size); break; + case PRINT_INT_ARRAY: + free_arg(arg->int_array.field); + free_arg(arg->int_array.count); + free_arg(arg->int_array.el_size); + break; case PRINT_TYPE: free(arg->typecast.type); free_arg(arg->typecast.item); @@ -2545,6 +2550,32 @@ out: } static enum event_type +process_int_array(struct event_format *event, struct print_arg *arg, char **tok) +{ + memset(arg, 0, sizeof(*arg)); + arg->type = PRINT_INT_ARRAY; + + if (alloc_and_process_delim(event, ",", &arg->int_array.field)) + goto out; + + if (alloc_and_process_delim(event, ",", &arg->int_array.count)) + goto free_field; + + if (alloc_and_process_delim(event, ")", &arg->int_array.el_size)) + goto free_size; + + return read_token_item(tok); + +free_size: + free_arg(arg->int_array.count); +free_field: + free_arg(arg->int_array.field); +out: + *tok = NULL; + return EVENT_ERROR; +} + +static enum event_type process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok) { struct format_field *field; @@ -2839,6 +2870,10 @@ process_function(struct event_format *event, struct print_arg *arg, free_token(token); return process_hex(event, arg, tok); } + if (strcmp(token, "__print_array") == 0) { + free_token(token); + return process_int_array(event, arg, tok); + } if (strcmp(token, "__get_str") == 0) { free_token(token); return process_str(event, arg, tok); @@ -3367,6 +3402,7 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg break; case PRINT_FLAGS: case PRINT_SYMBOL: + case PRINT_INT_ARRAY: case PRINT_HEX: break; case PRINT_TYPE: @@ -3777,6 +3813,54 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, } break; + case PRINT_INT_ARRAY: { + void *num; + int el_size; + + if (arg->int_array.field->type == PRINT_DYNAMIC_ARRAY) { + unsigned long offset; + struct format_field *field = + arg->int_array.field->dynarray.field; + offset = pevent_read_number(pevent, + data + field->offset, + field->size); + num = data + (offset & 0xffff); + } else { + field = arg->int_array.field->field.field; + if (!field) { + str = arg->int_array.field->field.name; + field = pevent_find_any_field(event, str); + if (!field) + goto out_warning_field; + arg->int_array.field->field.field = field; + } + num = data + field->offset; + } + len = eval_num_arg(data, size, event, arg->int_array.count); + el_size = eval_num_arg(data, size, event, + arg->int_array.el_size); + for (i = 0; i < len; i++) { + if (i) + trace_seq_putc(s, ' '); + + if (el_size == 1) { + trace_seq_printf(s, "%u", *(uint8_t *)num); + } else if (el_size == 2) { + trace_seq_printf(s, "%u", *(uint16_t *)num); + } else if (el_size == 4) { + trace_seq_printf(s, "%u", *(uint32_t *)num); + } else if (el_size == 8) { + trace_seq_printf(s, "%lu", *(uint64_t *)num); + } else { + trace_seq_printf(s, "BAD SIZE:%d 0x%x", + el_size, *(uint8_t *)num); + el_size = 1; + } + + num += el_size; + } + break; + } case PRINT_TYPE: break; case PRINT_STRING: { @@ -5361,6 +5445,15 @@ static void print_args(struct print_arg *args) print_args(args->hex.size); printf(")"); break; + case PRINT_INT_ARRAY: + printf("__print_array("); + print_args(args->int_array.field); + printf(", "); + print_args(args->int_array.count); + printf(", "); + print_args(args->int_array.el_size); + printf(")"); + break; case PRINT_STRING: case PRINT_BSTRING: printf("__get_str(%s)", args->string.string); diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h index 8ca1b8e..86a5839 100644 --- a/tools/lib/traceevent/event-parse.h +++ b/tools/lib/traceevent/event-parse.h @@ -251,6 +251,12 @@ struct print_arg_hex { struct print_arg *size; }; +struct print_arg_int_array { + struct print_arg *field; + struct print_arg *count; + struct print_arg *el_size; +}; + struct print_arg_dynarray { struct format_field *field; struct print_arg *index; @@ -279,6 +285,7 @@ enum print_arg_type { PRINT_FLAGS, PRINT_SYMBOL, PRINT_HEX, + PRINT_INT_ARRAY, PRINT_TYPE, PRINT_STRING, PRINT_BSTRING, @@ -298,6 +305,7 @@ struct print_arg { struct print_arg_flags flags; struct print_arg_symbol symbol; struct print_arg_hex hex; + struct print_arg_int_array int_array; struct print_arg_func func; struct print_arg_string string; struct print_arg_bitmask bitmask; diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c index 22ebc46..8171fed 100644 --- a/tools/perf/util/scripting-engines/trace-event-perl.c +++ b/tools/perf/util/scripting-engines/trace-event-perl.c @@ -214,6 +214,11 @@ static void define_event_symbols(struct event_format *event, define_event_symbols(event, ev_name, args->hex.field); define_event_symbols(event, ev_name, args->hex.size); break; + case PRINT_INT_ARRAY: + define_event_symbols(event, ev_name, args->int_array.field); + define_event_symbols(event, ev_name, args->int_array.count); + define_event_symbols(event, ev_name, args->int_array.el_size); + break; case PRINT_BSTRING: case PRINT_DYNAMIC_ARRAY: case PRINT_STRING: diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index 0c815a4..2ec5dfb 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -231,6 +231,11 @@ static void define_event_symbols(struct event_format *event, define_event_symbols(event, ev_name, args->hex.field); define_event_symbols(event, ev_name, args->hex.size); break; + case PRINT_INT_ARRAY: + define_event_symbols(event, ev_name, args->int_array.field); + define_event_symbols(event, ev_name, args->int_array.count); + define_event_symbols(event, ev_name, args->int_array.el_size); + break; case PRINT_STRING: break; case PRINT_TYPE: ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [RESEND PATCH v8 0/2] Add array printing support to libtraceevent 2015-03-20 18:12 [RESEND PATCH v8 0/2] Add array printing support to libtraceevent Javi Merino 2015-03-20 18:12 ` [RESEND PATCH v8 1/2] tools lib traceevent: factor out allocating and processing args Javi Merino 2015-03-20 18:12 ` [RESEND PATCH v8 2/2] tools lib traceevent: Add support for __print_array() Javi Merino @ 2015-03-23 16:18 ` Arnaldo Carvalho de Melo 2 siblings, 0 replies; 9+ messages in thread From: Arnaldo Carvalho de Melo @ 2015-03-23 16:18 UTC (permalink / raw) To: Javi Merino; +Cc: jolsa, linux-kernel Em Fri, Mar 20, 2015 at 06:12:54PM +0000, Javi Merino escreveu: > This series add support to libtraceevent for dynamic arrays in traces. > The kernel learned to create this traces in 6ea22486ba46 ("tracing: Add > array printing helper"), which was merged for v4.0-rc1. > > Changes since v7[0]: > - Call the fields of the struct print_arg_int_array "field", "count" > and "el_size" to match the definition of __print_array as Namhyung > Kim suggests. Incorporate his Acked-by. > > Changes since v6[1]: > - s/alloc_and_process_arg/alloc_and_process_delim/ as Steven > Rostedt suggests > Thanks, applied. ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2015-03-24 16:36 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-03-20 18:12 [RESEND PATCH v8 0/2] Add array printing support to libtraceevent Javi Merino 2015-03-20 18:12 ` [RESEND PATCH v8 1/2] tools lib traceevent: factor out allocating and processing args Javi Merino 2015-03-24 16:31 ` [tip:perf/core] tools lib traceevent: Factor " tip-bot for Javi Merino 2015-03-20 18:12 ` [RESEND PATCH v8 2/2] tools lib traceevent: Add support for __print_array() Javi Merino 2015-03-23 16:20 ` Arnaldo Carvalho de Melo 2015-03-24 11:07 ` [PATCH v9] " Javi Merino 2015-03-24 15:48 ` Arnaldo Carvalho de Melo 2015-03-24 16:35 ` [tip:perf/core] " tip-bot for Javi Merino 2015-03-23 16:18 ` [RESEND PATCH v8 0/2] Add array printing support to libtraceevent Arnaldo Carvalho de Melo
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).