Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933018AbbGUPK6 (ORCPT ); Tue, 21 Jul 2015 11:10:58 -0400 Received: from mail-pa0-f48.google.com ([209.85.220.48]:33344 "EHLO mail-pa0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932067AbbGUPK5 (ORCPT ); Tue, 21 Jul 2015 11:10:57 -0400 Date: Wed, 22 Jul 2015 00:08:33 +0900 From: Namhyung Kim To: He Kuang Cc: rostedt@goodmis.org, ast@plumgrid.com, masami.hiramatsu.pt@hitachi.com, acme@kernel.org, a.p.zijlstra@chello.nl, mingo@redhat.com, jolsa@kernel.org, wangnan0@huawei.com, pi3orama@163.com, linux-kernel@vger.kernel.org Subject: Re: [RFC PATCH v6 1/2] tools lib traceevent: Support function __get_dynamic_array_len Message-ID: <20150721150833.GB10689@danjae.kornet> References: <1437448130-134621-1-git-send-email-hekuang@huawei.com> <1437448130-134621-2-git-send-email-hekuang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1437448130-134621-2-git-send-email-hekuang@huawei.com> User-Agent: Mutt/1.5.23+89 (0255b37be491) (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5589 Lines: 163 On Tue, Jul 21, 2015 at 03:08:49AM +0000, He Kuang wrote: > Support helper function __get_dynamic_array_len() in libtraceevent, > this function is used accompany with __print_array() or __print_hex(), > but currently it is not an available function in the function list of > process_function(). > > The total allocated length of the dynamic array is embedded in the top > half of __data_loc_##item field. This patch adds new arg type > PRINT_DYNAMIC_ARRAY_LEN to return the length to eval_num_arg(), > > Signed-off-by: He Kuang Acked-by: Namhyung Kim Thanks, Namhyung > --- > tools/lib/traceevent/event-parse.c | 56 +++++++++++++++++++++- > tools/lib/traceevent/event-parse.h | 1 + > .../perf/util/scripting-engines/trace-event-perl.c | 1 + > .../util/scripting-engines/trace-event-python.c | 1 + > 4 files changed, 57 insertions(+), 2 deletions(-) > > diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c > index cc25f05..3af69cf 100644 > --- a/tools/lib/traceevent/event-parse.c > +++ b/tools/lib/traceevent/event-parse.c > @@ -783,6 +783,7 @@ static void free_arg(struct print_arg *arg) > free(arg->bitmask.bitmask); > break; > case PRINT_DYNAMIC_ARRAY: > + case PRINT_DYNAMIC_ARRAY_LEN: > free(arg->dynarray.index); > break; > case PRINT_OP: > @@ -2655,6 +2656,42 @@ process_dynamic_array(struct event_format *event, struct print_arg *arg, char ** > } > > static enum event_type > +process_dynamic_array_len(struct event_format *event, struct print_arg *arg, > + char **tok) > +{ > + struct format_field *field; > + enum event_type type; > + char *token; > + > + if (read_expect_type(EVENT_ITEM, &token) < 0) > + goto out_free; > + > + arg->type = PRINT_DYNAMIC_ARRAY_LEN; > + > + /* Find the field */ > + field = pevent_find_field(event, token); > + if (!field) > + goto out_free; > + > + arg->dynarray.field = field; > + arg->dynarray.index = 0; > + > + if (read_expected(EVENT_DELIM, ")") < 0) > + goto out_err; > + > + type = read_token(&token); > + *tok = token; > + > + return type; > + > + out_free: > + free_token(token); > + out_err: > + *tok = NULL; > + return EVENT_ERROR; > +} > + > +static enum event_type > process_paren(struct event_format *event, struct print_arg *arg, char **tok) > { > struct print_arg *item_arg; > @@ -2901,6 +2938,10 @@ process_function(struct event_format *event, struct print_arg *arg, > free_token(token); > return process_dynamic_array(event, arg, tok); > } > + if (strcmp(token, "__get_dynamic_array_len") == 0) { > + free_token(token); > + return process_dynamic_array_len(event, arg, tok); > + } > > func = find_func_handler(event->pevent, token); > if (func) { > @@ -3581,14 +3622,25 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg > goto out_warning_op; > } > break; > + case PRINT_DYNAMIC_ARRAY_LEN: > + offset = pevent_read_number(pevent, > + data + arg->dynarray.field->offset, > + arg->dynarray.field->size); > + /* > + * The total allocated length of the dynamic array is > + * stored in the top half of the field, and the offset > + * is in the bottom half of the 32 bit field. > + */ > + val = (unsigned long long)(offset >> 16); > + break; > case PRINT_DYNAMIC_ARRAY: > /* Without [], we pass the address to the dynamic data */ > offset = pevent_read_number(pevent, > data + arg->dynarray.field->offset, > arg->dynarray.field->size); > /* > - * The actual length of the dynamic array is stored > - * in the top half of the field, and the offset > + * The total allocated length of the dynamic array is > + * stored in the top half of the field, and the offset > * is in the bottom half of the 32 bit field. > */ > offset &= 0xffff; > diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h > index 063b197..94543aa 100644 > --- a/tools/lib/traceevent/event-parse.h > +++ b/tools/lib/traceevent/event-parse.h > @@ -294,6 +294,7 @@ enum print_arg_type { > PRINT_OP, > PRINT_FUNC, > PRINT_BITMASK, > + PRINT_DYNAMIC_ARRAY_LEN, > }; > > struct print_arg { > diff --git a/tools/perf/util/scripting-engines/trace-event-perl.c b/tools/perf/util/scripting-engines/trace-event-perl.c > index 1bd593b..544509c 100644 > --- a/tools/perf/util/scripting-engines/trace-event-perl.c > +++ b/tools/perf/util/scripting-engines/trace-event-perl.c > @@ -221,6 +221,7 @@ static void define_event_symbols(struct event_format *event, > break; > case PRINT_BSTRING: > case PRINT_DYNAMIC_ARRAY: > + case PRINT_DYNAMIC_ARRAY_LEN: > case PRINT_STRING: > case PRINT_BITMASK: > break; > diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c > index ace2484..aa9e125 100644 > --- a/tools/perf/util/scripting-engines/trace-event-python.c > +++ b/tools/perf/util/scripting-engines/trace-event-python.c > @@ -251,6 +251,7 @@ static void define_event_symbols(struct event_format *event, > /* gcc warns for these? */ > case PRINT_BSTRING: > case PRINT_DYNAMIC_ARRAY: > + case PRINT_DYNAMIC_ARRAY_LEN: > case PRINT_FUNC: > case PRINT_BITMASK: > /* we should warn... */ > -- > 1.8.5.2 > -- 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/