Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754271AbbGQDhi (ORCPT ); Thu, 16 Jul 2015 23:37:38 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:63208 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751976AbbGQDhh (ORCPT ); Thu, 16 Jul 2015 23:37:37 -0400 Message-ID: <55A87856.6080004@huawei.com> Date: Fri, 17 Jul 2015 11:36:54 +0800 From: "Wangnan (F)" User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-Version: 1.0 To: He Kuang , , , , , , , , CC: , Subject: Re: [RFC PATCH v5 2/3] tools lib traceevent: Add function to get dynamic arrays length References: <1436839171-31527-1-git-send-email-hekuang@huawei.com> <1436839171-31527-3-git-send-email-hekuang@huawei.com> In-Reply-To: <1436839171-31527-3-git-send-email-hekuang@huawei.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.111.66.109] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020202.55A8786E.0139,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 46d2e2efcf0c308ae3216dffa7851f63 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4878 Lines: 149 On 2015/7/14 9:59, He Kuang wrote: > To print a trace event with a dynamic array, __print_array(array, len, > element_size) requires the number of items in the array, which can be > got by the helper function __get_dynamic_array_len(), currently it is > not an available function in the function list in process_function(). > > Add new arg type PRINT_DYNAMIC_ARRAY_LEN which returns the array > length embedded in the __data_loc_##item field to eval_num_arg(). > > Signed-off-by: He Kuang > --- > tools/lib/traceevent/event-parse.c | 52 ++++++++++++++++++++++ > tools/lib/traceevent/event-parse.h | 1 + > .../util/scripting-engines/trace-event-python.c | 1 + > 3 files changed, 54 insertions(+) > > diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c > index cc25f05..55fc3b6c 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,6 +3622,17 @@ 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 actual 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, > 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-python.c b/tools/perf/util/scripting-engines/trace-event-python.c > index ace2484..d309341 100644 > --- a/tools/perf/util/scripting-engines/trace-event-python.c > +++ b/tools/perf/util/scripting-engines/trace-event-python.c > @@ -253,6 +253,7 @@ static void define_event_symbols(struct event_format *event, > case PRINT_DYNAMIC_ARRAY: > case PRINT_FUNC: > case PRINT_BITMASK: > + case PRINT_DYNAMIC_ARRAY_LEN: Here is a small problem in this patch that, it only updates trace-event-python.c, leaves trace-event-perf.c unchanged. If CONFIG_LIBPERL is on, a compiling error will raise. I fixed this in my own git repository. Steven, could you please cherry-pick this one instead? https://github.com/WangNan0/linux/commit/951d78339e8c7819e9a1a9faeaf15e2c0b1aaa10 Note that the author field of it is still He Kuang. Thank you. > /* we should warn... */ > return; > } -- 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/