lkml.org 
[lkml]   [2015]   [Aug]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 31/31] tools lib traceevent: Support function __get_dynamic_array_len
    Date
    From: He Kuang <hekuang@huawei.com>

    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 <hekuang@huawei.com>
    Acked-by: Namhyung Kim <namhyung@kernel.org>
    Cc: Alexei Starovoitov <ast@plumgrid.com>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: pi3orama@163.com
    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    Link: http://lkml.kernel.org/n/1437448130-134621-2-git-send-email-hekuang@huawei.com
    ---
    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 4d88593..1244797 100644
    --- a/tools/lib/traceevent/event-parse.c
    +++ b/tools/lib/traceevent/event-parse.c
    @@ -848,6 +848,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:
    @@ -2729,6 +2730,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;
    @@ -2975,6 +3012,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) {
    @@ -3655,14 +3696,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 204befb..6fc83c7 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... */
    --
    2.1.0


    \
     
     \ /
      Last update: 2015-08-29 06:41    [W:4.971 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site