All of lore.kernel.org
 help / color / mirror / Atom feed
From: Song Liu <songliubraving@fb.com>
To: Jiri Olsa <jolsa@redhat.com>
Cc: Netdev <netdev@vger.kernel.org>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	"ast@kernel.org" <ast@kernel.org>,
	"daniel@iogearbox.net" <daniel@iogearbox.net>,
	Kernel Team <Kernel-team@fb.com>,
	"peterz@infradead.org" <peterz@infradead.org>,
	"acme@redhat.com" <acme@redhat.com>,
	"jolsa@kernel.org" <jolsa@kernel.org>,
	"namhyung@kernel.org" <namhyung@kernel.org>
Subject: Re: [PATCH v4 perf,bpf 06/15] perf, bpf: save bpf_prog_info in a rbtree in perf_env
Date: Wed, 27 Feb 2019 17:38:03 +0000	[thread overview]
Message-ID: <B857ABD1-046A-4B1F-B498-C09273B1FD5E@fb.com> (raw)
In-Reply-To: <20190227132123.GE18893@krava>



> On Feb 27, 2019, at 5:21 AM, Jiri Olsa <jolsa@redhat.com> wrote:
> 
> On Mon, Feb 25, 2019 at 04:20:10PM -0800, Song Liu wrote:
>> bpf_prog_info contains information necessary to annotate bpf programs.
>> This patch saves bpf_prog_info for bpf programs loaded in the system.
>> 
>> Signed-off-by: Song Liu <songliubraving@fb.com>
>> ---
>> tools/perf/util/bpf-event.c | 32 +++++++++++++-
>> tools/perf/util/bpf-event.h |  7 ++-
>> tools/perf/util/env.c       | 85 +++++++++++++++++++++++++++++++++++++
>> tools/perf/util/env.h       | 17 ++++++++
>> 4 files changed, 139 insertions(+), 2 deletions(-)
>> 
>> diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c
>> index ff7ee149ec46..ce81b2c43a51 100644
>> --- a/tools/perf/util/bpf-event.c
>> +++ b/tools/perf/util/bpf-event.c
>> @@ -10,6 +10,7 @@
>> #include "debug.h"
>> #include "symbol.h"
>> #include "machine.h"
>> +#include "env.h"
>> #include "session.h"
>> 
>> #define ptr_to_u64(ptr)    ((__u64)(unsigned long)(ptr))
>> @@ -54,17 +55,28 @@ static int perf_event__synthesize_one_bpf_prog(struct perf_session *session,
>> 	struct bpf_event *bpf_event = &event->bpf_event;
>> 	struct bpf_prog_info_linear *info_linear;
>> 	struct perf_tool *tool = session->tool;
>> +	struct bpf_prog_info_node *info_node;
>> 	struct bpf_prog_info *info;
>> 	struct btf *btf = NULL;
>> 	bool has_btf = false;
>> +	struct perf_env *env;
>> 	u32 sub_prog_cnt, i;
>> 	int err = 0;
>> 	u64 arrays;
>> 
>> +	/*
>> +	 * for perf-record and perf-report use header.env;
>> +	 * otherwise, use global perf_env.
>> +	 */
>> +	env = session->data ? &session->header.env : &perf_env;
>> +
>> 	arrays = 1UL << BPF_PROG_INFO_JITED_KSYMS;
>> 	arrays |= 1UL << BPF_PROG_INFO_JITED_FUNC_LENS;
>> 	arrays |= 1UL << BPF_PROG_INFO_FUNC_INFO;
>> 	arrays |= 1UL << BPF_PROG_INFO_PROG_TAGS;
>> +	arrays |= 1UL << BPF_PROG_INFO_JITED_INSNS;
>> +	arrays |= 1UL << BPF_PROG_INFO_LINE_INFO;
>> +	arrays |= 1UL << BPF_PROG_INFO_JITED_LINE_INFO;
>> 
>> 	info_linear = bpf_program__get_prog_info_linear(fd, arrays);
>> 	if (IS_ERR_OR_NULL(info_linear)) {
>> @@ -153,8 +165,8 @@ static int perf_event__synthesize_one_bpf_prog(struct perf_session *session,
>> 						     machine, process);
>> 	}
>> 
>> -	/* Synthesize PERF_RECORD_BPF_EVENT */
>> 	if (opts->bpf_event) {
>> +		/* Synthesize PERF_RECORD_BPF_EVENT */
>> 		*bpf_event = (struct bpf_event){
>> 			.header = {
>> 				.type = PERF_RECORD_BPF_EVENT,
>> @@ -167,6 +179,24 @@ static int perf_event__synthesize_one_bpf_prog(struct perf_session *session,
>> 		memcpy(bpf_event->tag, info->tag, BPF_TAG_SIZE);
>> 		memset((void *)event + event->header.size, 0, machine->id_hdr_size);
>> 		event->header.size += machine->id_hdr_size;
>> +
>> +		/* save bpf_prog_info to env */
> 
> why do we save this to perf_env in here? we just
> synthesize the same data as event, so report and
> top will read it and fill perf_env again, right?

The synthesized events are same as PERF_RECORD_BPF_EVENT
PROG_LOAD. We need to process them and fill perf_env as
soon as we get PROG_LOAD. Otherwise, the program might 
unload before we process them. 

> 
> could you please explain the whole flow of the
> bpf events and its respective data in perf_env
> and put it into the changelog

I will add more information to the change log. 

> 
>> +		info_node = malloc(sizeof(struct bpf_prog_info_node));
>> +
>> +		/*
>> +		 * Do not bail out for !info_node, as we still want to
>> +		 * call  perf_tool__process_synth_event()
> 
> well, we are out of memory, so I dont think perf_tool__process_synth_event
> will get too far.. also the perf_env data would be inconsistent with what
> you store as event.. how can that work?

It is OK we have PERF_RECORD_BPF_EVENT but not related
bpf_prog_info and btf. The perf.data file will show 
a BPF program was loaded, but we won't be able to do 
annotation. Does this make sense?

Thanks,
Song

> 
> thanks,
> jirka
> 
>> +		 */
>> +		if (info_node) {
>> +			info_node->info_linear = info_linear;
>> +			perf_env__insert_bpf_prog_info(env, info_node);
>> +			info_linear = NULL;
>> +		}
>> +
> 
> SNIP


  reply	other threads:[~2019-02-27 17:39 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-26  0:20 [PATCH v4 perf,bpf 00/15] perf annotation of BPF programs Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 01/15] perf, bpf: consider events with attr.bpf_event as side-band events Song Liu
2019-03-09 19:46   ` [tip:perf/urgent] perf, bpf: Consider " tip-bot for Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 02/15] bpf: libbpf: introduce bpf_program__get_prog_info_linear() Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 03/15] bpf: bpftool: use bpf_program__get_prog_info_linear() in prog.c:do_dump() Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 04/15] perf, bpf: synthesize bpf events with bpf_program__get_prog_info_linear() Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 05/15] perf: change prototype of perf_event__synthesize_bpf_events() Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 06/15] perf, bpf: save bpf_prog_info in a rbtree in perf_env Song Liu
2019-02-27 13:21   ` Jiri Olsa
2019-02-27 17:38     ` Song Liu [this message]
2019-02-27 13:21   ` Jiri Olsa
2019-02-27 13:21   ` Jiri Olsa
2019-02-26  0:20 ` [PATCH v4 perf,bpf 07/15] perf, bpf: save bpf_prog_info information as headers to perf.data Song Liu
2019-02-27 13:21   ` Jiri Olsa
2019-02-27 17:28     ` Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 08/15] perf, bpf: save btf in a rbtree in perf_env Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 09/15] perf, bpf: save btf information as headers to perf.data Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 10/15] perf-top: add option --no-bpf-event Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 11/15] perf: add -lopcodes to feature-libbfd Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 12/15] perf, bpf: enable annotation of bpf program Song Liu
2019-02-27 13:21   ` Jiri Olsa
2019-02-27 13:22   ` Jiri Olsa
2019-02-26  0:20 ` [PATCH v4 perf,bpf 13/15] perf, bpf: process PERF_BPF_EVENT_PROG_LOAD for annotation Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 14/15] perf: introduce side band thread Song Liu
2019-02-27 13:21   ` Jiri Olsa
2019-02-27 17:52     ` Song Liu
2019-03-04 13:52       ` Jiri Olsa
2019-03-04 19:49         ` Song Liu
2019-03-04 20:41           ` Jiri Olsa
2019-03-04 20:44             ` Song Liu
2019-03-04 21:40     ` Song Liu
2019-03-05 11:03       ` Jiri Olsa
2019-03-05 20:37         ` Song Liu
2019-02-26  0:20 ` [PATCH v4 perf,bpf 15/15] perf, bpf: save information about short living bpf programs Song Liu
2019-02-27 13:21   ` Jiri Olsa
2019-02-27 17:42     ` 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=B857ABD1-046A-4B1F-B498-C09273B1FD5E@fb.com \
    --to=songliubraving@fb.com \
    --cc=Kernel-team@fb.com \
    --cc=acme@redhat.com \
    --cc=ast@kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=jolsa@kernel.org \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=namhyung@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=peterz@infradead.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.