All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@redhat.com>
To: Song Liu <songliubraving@fb.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	ast@kernel.org, daniel@iogearbox.net, kernel-team@fb.com,
	peterz@infradead.org, jolsa@kernel.org, namhyung@kernel.org
Subject: Re: [PATCH v2 perf,bpf 07/11] perf, bpf: save btf in a rbtree in perf_env
Date: Fri, 15 Feb 2019 12:30:55 -0200	[thread overview]
Message-ID: <20190215143055.GE5784@redhat.com> (raw)
In-Reply-To: <20190215000010.2590505-6-songliubraving@fb.com>

Em Thu, Feb 14, 2019 at 04:00:08PM -0800, Song Liu escreveu:
> btf contains information necessary to annotate bpf programs. This patch
> saves btf for bpf programs loaded in the system.
> 
> Signed-off-by: Song Liu <songliubraving@fb.com>
> ---
>  tools/perf/util/bpf-event.c | 22 +++++++++++++
>  tools/perf/util/bpf-event.h |  7 ++++
>  tools/perf/util/env.c       | 65 +++++++++++++++++++++++++++++++++++++
>  tools/perf/util/env.h       |  3 ++
>  4 files changed, 97 insertions(+)
> 
> diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c
> index ead599bc4f4e..37a5b8134e00 100644
> --- a/tools/perf/util/bpf-event.c
> +++ b/tools/perf/util/bpf-event.c
> @@ -30,6 +30,27 @@ int machine__process_bpf_event(struct machine *machine __maybe_unused,
>  	return 0;
>  }
>  
> +static int perf_fetch_btf(struct perf_env *env, u32 btf_id, struct btf *btf)

Please use perf_env__fetch_bpf

> +{
> +	struct btf_node *node;
> +	u32 data_size;
> +	const void *data;
> +
> +	data = btf__get_raw_data(btf, &data_size);
> +
> +	node = malloc(data_size + sizeof(struct btf_node));
> +
> +	if (!node)
> +		return -1;
> +
> +	node->id = btf_id;
> +	node->data_size = data_size;
> +	memcpy(node->data, data, data_size);
> +
> +	perf_env__insert_btf(env, node);

Just like you did above :-)

> +	return 0;
> +}
> +
>  /*
>   * Synthesize PERF_RECORD_KSYMBOL and PERF_RECORD_BPF_EVENT for one bpf
>   * program. One PERF_RECORD_BPF_EVENT is generated for the program. And
> @@ -109,6 +130,7 @@ static int perf_event__synthesize_one_bpf_prog(struct perf_session *session,
>  			goto out;
>  		}
>  		has_btf = true;
> +		perf_fetch_btf(env, info->btf_id, btf);
>  	}
>  
>  	/* Synthesize PERF_RECORD_KSYMBOL */
> diff --git a/tools/perf/util/bpf-event.h b/tools/perf/util/bpf-event.h
> index 11e6730b6105..60ce24e4e5c6 100644
> --- a/tools/perf/util/bpf-event.h
> +++ b/tools/perf/util/bpf-event.h
> @@ -20,6 +20,13 @@ struct bpf_prog_info_node {
>  	struct rb_node			rb_node;
>  };
>  
> +struct btf_node {
> +	struct rb_node	rb_node;
> +	u32		id;
> +	u32		data_size;
> +	char		data[];
> +};
> +
>  #ifdef HAVE_LIBBPF_SUPPORT
>  int machine__process_bpf_event(struct machine *machine, union perf_event *event,
>  			       struct perf_sample *sample);
> diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c
> index 665b6fe3c7b2..6f9e3d4b94bc 100644
> --- a/tools/perf/util/env.c
> +++ b/tools/perf/util/env.c
> @@ -61,6 +61,57 @@ struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,
>  	return node;
>  }
>  
> +void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node)
> +{
> +	struct rb_node *parent = NULL;
> +	__u32 btf_id = btf_node->id;
> +	struct btf_node *node;
> +	struct rb_node **p;
> +
> +	down_write(&env->bpf_info_lock);
> +	p = &env->btfs.rb_node;
> +
> +	while (*p != NULL) {
> +		parent = *p;
> +		node = rb_entry(parent, struct btf_node, rb_node);
> +		if (btf_id < node->id) {
> +			p = &(*p)->rb_left;
> +		} else if (btf_id > node->id) {
> +			p = &(*p)->rb_right;
> +		} else {
> +			pr_debug("duplicated btf %u\n", btf_id);

			goto out:

> +			up_write(&env->bpf_info_lock);
> +			return;
> +		}
> +	}
> +
> +	rb_link_node(&btf_node->rb_node, parent, p);
> +	rb_insert_color(&btf_node->rb_node, &env->btfs);
out:
> +	up_write(&env->bpf_info_lock);
> +}
> +
> +struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id)
> +{
> +	struct btf_node *node = NULL;
> +	struct rb_node *n;
> +
> +	down_read(&env->bpf_info_lock);
> +	n = env->btfs.rb_node;
> +
> +	while (n) {
> +		node = rb_entry(n, struct btf_node, rb_node);
> +		if (btf_id < node->id)
> +			n = n->rb_left;
> +		else if (btf_id > node->id)
> +			n = n->rb_right;
> +		else
> +			break;
> +	}
> +
> +	up_read(&env->bpf_info_lock);
> +	return node;
> +}
> +
>  /* purge data in bpf_prog_infos tree */
>  static void purge_bpf_info(struct perf_env *env)

The above should've been perf_env__purge_bpf()

>  {
> @@ -80,6 +131,19 @@ static void purge_bpf_info(struct perf_env *env)
>  		rb_erase_init(&node->rb_node, root);
>  		free(node);
>  	}
> +
> +	root = &env->btfs;
> +	next = rb_first(root);
> +
> +	while (next) {
> +		struct btf_node *node;
> +
> +		node = rb_entry(next, struct btf_node, rb_node);
> +		next = rb_next(&node->rb_node);
> +		rb_erase_init(&node->rb_node, root);
> +		free(node);
> +	}
> +
>  	up_write(&env->bpf_info_lock);
>  }
>  
> @@ -117,6 +181,7 @@ void perf_env__exit(struct perf_env *env)
>  static void init_bpf_rb_trees(struct perf_env *env)
>  {
>  	env->bpf_prog_infos = RB_ROOT;
> +	env->btfs = RB_ROOT;
>  	init_rwsem(&env->bpf_info_lock);
>  }
>  
> diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h
> index a6d25e91bc98..f0c74255423c 100644
> --- a/tools/perf/util/env.h
> +++ b/tools/perf/util/env.h
> @@ -74,6 +74,7 @@ struct perf_env {
>  	 */
>  	struct rw_semaphore	bpf_info_lock;
>  	struct rb_root		bpf_prog_infos;
> +	struct rb_root		btfs;
>  };
>  
>  extern struct perf_env perf_env;
> @@ -94,4 +95,6 @@ void perf_env__insert_bpf_prog_info(struct perf_env *env,
>  				    struct bpf_prog_info_node *info_node);
>  struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,
>  							__u32 prog_id);
> +void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
> +struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id);
>  #endif /* __PERF_ENV_H */
> -- 
> 2.17.1

  reply	other threads:[~2019-02-15 14:31 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-14 23:56 [PATCH v2 perf,bpf 00/11] perf annotation of BPF programs Song Liu
2019-02-14 23:58 ` [PATCH v2 perf,bpf 01/11] perf, bpf: consider events with attr.bpf_event as side-band events Song Liu
2019-02-15 14:14   ` Arnaldo Carvalho de Melo
2019-02-15 17:02     ` Song Liu
2019-02-15 18:04       ` Arnaldo Carvalho de Melo
2019-02-15  0:00 ` [PATCH v2 perf,bpf 02/11] bpf: libbpf: introduce bpf_program__get_prog_info_linear() Song Liu
2019-02-15  0:00   ` [PATCH v2 perf,bpf 03/11] bpf: bpftool: use bpf_program__get_prog_info_linear() in prog.c:do_dump() Song Liu
2019-02-15  0:00   ` [PATCH v2 perf,bpf 04/11] perf, bpf: synthesize bpf events with bpf_program__get_prog_info_linear() Song Liu
2019-02-15  0:00   ` [PATCH v2 perf,bpf 05/11] perf, bpf: save bpf_prog_info in a rbtree in perf_env Song Liu
2019-02-15 14:21     ` Arnaldo Carvalho de Melo
2019-02-15 17:04       ` Song Liu
2019-02-15  0:00   ` [PATCH v2 perf,bpf 06/11] perf, bpf: save bpf_prog_info information as headers to perf.data Song Liu
2019-02-15  0:00   ` [PATCH v2 perf,bpf 07/11] perf, bpf: save btf in a rbtree in perf_env Song Liu
2019-02-15 14:30     ` Arnaldo Carvalho de Melo [this message]
2019-02-15  0:00   ` [PATCH v2 perf,bpf 08/11] perf, bpf: save btf information as headers to perf.data Song Liu
2019-02-15 14:26     ` Arnaldo Carvalho de Melo
2019-02-15 17:25       ` Song Liu
2019-02-15 17:40         ` Arnaldo Carvalho de Melo
2019-02-15 17:47           ` Song Liu
2019-02-15 18:20             ` Arnaldo Carvalho de Melo
2019-02-15 18:59               ` Song Liu
2019-02-15  0:00   ` [PATCH v2 perf,bpf 09/11] perf-top: add option --bpf-event Song Liu
2019-02-15 14:27     ` Arnaldo Carvalho de Melo
2019-02-15 17:06       ` Song Liu
2019-02-15 18:05         ` Arnaldo Carvalho de Melo
2019-02-15  0:00 ` [PATCH v2 perf,bpf 10/11] perf, bpf: enable annotation of bpf program Song Liu
2019-02-15  0:00   ` [PATCH v2 perf,bpf 11/11] perf, bpf: save information about short living bpf programs Song Liu
2019-02-15 14:41     ` Arnaldo Carvalho de Melo
2019-02-15 17:13       ` Song Liu
2019-02-15 18:09         ` Arnaldo Carvalho de Melo
2019-02-15 18:13           ` Song Liu

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=20190215143055.GE5784@redhat.com \
    --to=acme@redhat.com \
    --cc=ast@kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=jolsa@kernel.org \
    --cc=kernel-team@fb.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=namhyung@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=songliubraving@fb.com \
    /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.