All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Wangnan (F)" <wangnan0@huawei.com>
To: He Kuang <hekuang@huawei.com>, <rostedt@goodmis.org>,
	<ast@plumgrid.com>, <masami.hiramatsu.pt@hitachi.com>,
	<acme@kernel.org>, <a.p.zijlstra@chello.nl>, <mingo@redhat.com>,
	<namhyung@kernel.org>, <jolsa@kernel.org>
Cc: <pi3orama@163.com>, <linux-kernel@vger.kernel.org>
Subject: Re: [RFC PATCH v5 2/3] tools lib traceevent: Add function to get dynamic arrays length
Date: Fri, 17 Jul 2015 11:36:54 +0800	[thread overview]
Message-ID: <55A87856.6080004@huawei.com> (raw)
In-Reply-To: <1436839171-31527-3-git-send-email-hekuang@huawei.com>



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 <hekuang@huawei.com>
> ---
>   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;
>   	}



  reply	other threads:[~2015-07-17  3:37 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-14  1:59 [RFC PATCH v5 0/3] Make eBPF programs output data to perf He Kuang
2015-07-14  1:59 ` [RFC PATCH v5 1/3] tracing/events: Fix wrong sample output by storing array length instead of size He Kuang
2015-07-14  1:59 ` [RFC PATCH v5 2/3] tools lib traceevent: Add function to get dynamic arrays length He Kuang
2015-07-17  3:36   ` Wangnan (F) [this message]
2015-07-17 14:36     ` Steven Rostedt
2015-07-17 14:43       ` pi3orama
2015-07-14  1:59 ` [RFC PATCH v5 3/3] bpf: Introduce function for outputing trace event data He Kuang
2015-07-14  3:08   ` Alexei Starovoitov
2015-07-14  3:10 ` [RFC PATCH v5 0/3] Make eBPF programs output data to perf Alexei Starovoitov
2015-07-14 13:35   ` Steven Rostedt
2015-07-17  2:31     ` He Kuang
2015-07-17  2:38       ` Steven Rostedt
2015-07-17  2:39       ` Wangnan (F)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55A87856.6080004@huawei.com \
    --to=wangnan0@huawei.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=ast@plumgrid.com \
    --cc=hekuang@huawei.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=pi3orama@163.com \
    --cc=rostedt@goodmis.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.