From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_MUTT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 11E9FC43381 for ; Mon, 4 Mar 2019 20:37:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id DF34220823 for ; Mon, 4 Mar 2019 20:37:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726728AbfCDUhu (ORCPT ); Mon, 4 Mar 2019 15:37:50 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40992 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726418AbfCDUhu (ORCPT ); Mon, 4 Mar 2019 15:37:50 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B84F130832DC; Mon, 4 Mar 2019 20:37:49 +0000 (UTC) Received: from krava (ovpn-204-135.brq.redhat.com [10.40.204.135]) by smtp.corp.redhat.com (Postfix) with SMTP id 26D476085B; Mon, 4 Mar 2019 20:37:46 +0000 (UTC) Date: Mon, 4 Mar 2019 21:37:44 +0100 From: Jiri Olsa To: Song Liu Cc: Networking , linux-kernel , "ast@kernel.org" , "daniel@iogearbox.net" , Kernel Team , "peterz@infradead.org" , "acme@redhat.com" , "jolsa@kernel.org" , "namhyung@kernel.org" Subject: Re: [PATCH v5 perf,bpf 07/15] perf, bpf: save bpf_prog_info information as headers to perf.data Message-ID: <20190304203744.GD2563@krava> References: <20190228050643.958685-1-songliubraving@fb.com> <20190228050643.958685-8-songliubraving@fb.com> <20190304135251.GG19809@krava> <8EE733B5-439C-4203-AD39-5DCA22E6ACC1@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8EE733B5-439C-4203-AD39-5DCA22E6ACC1@fb.com> User-Agent: Mutt/1.10.1 (2018-07-13) X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Mon, 04 Mar 2019 20:37:49 +0000 (UTC) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Mon, Mar 04, 2019 at 07:41:10PM +0000, Song Liu wrote: > > > > On Mar 4, 2019, at 5:52 AM, Jiri Olsa wrote: > > > > On Wed, Feb 27, 2019 at 09:06:35PM -0800, Song Liu wrote: > >> This patch enables perf-record to save bpf_prog_info information as > >> headers to perf.data. A new header type HEADER_BPF_PROG_INFO is > >> introduced for this data. > >> > >> Signed-off-by: Song Liu > >> --- > >> tools/perf/util/header.c | 143 ++++++++++++++++++++++++++++++++++++++- > >> tools/perf/util/header.h | 1 + > >> 2 files changed, 143 insertions(+), 1 deletion(-) > >> > >> diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c > >> index 4b88de5e9192..16f5bedb0b7d 100644 > >> --- a/tools/perf/util/header.c > >> +++ b/tools/perf/util/header.c > >> @@ -18,6 +18,7 @@ > >> #include > >> #include > >> #include > >> +#include > >> > >> #include "evlist.h" > >> #include "evsel.h" > >> @@ -39,6 +40,7 @@ > >> #include "tool.h" > >> #include "time-utils.h" > >> #include "units.h" > >> +#include "bpf-event.h" > >> > >> #include "sane_ctype.h" > >> > >> @@ -1074,6 +1076,51 @@ static int write_clockid(struct feat_fd *ff, > >> sizeof(ff->ph->env.clockid_res_ns)); > >> } > >> > >> +static int write_bpf_prog_info(struct feat_fd *ff, > >> + struct perf_evlist *evlist __maybe_unused) > >> +{ > >> + struct perf_env *env = &ff->ph->env; > >> + struct rb_root *root; > >> + struct rb_node *next; > >> + u32 count = 0; > >> + int ret; > >> + > >> + down_read(&env->bpf_progs.lock); > >> + > >> + root = &env->bpf_progs.infos; > >> + next = rb_first(root); > >> + while (next) { > >> + ++count; > >> + next = rb_next(next); > >> + } > >> + > >> + ret = do_write(ff, &count, sizeof(count)); > >> + > >> + if (ret < 0) > >> + goto out; > >> + > >> + next = rb_first(root); > >> + while (next) { > >> + struct bpf_prog_info_node *node; > >> + size_t len; > >> + > >> + node = rb_entry(next, struct bpf_prog_info_node, rb_node); > >> + next = rb_next(&node->rb_node); > >> + len = sizeof(struct bpf_prog_info_linear) + > >> + node->info_linear->data_len; > >> + > >> + /* before writing to file, translate address to offset */ > >> + bpf_program__bpil_addr_to_offs(node->info_linear); > >> + ret = do_write(ff, node->info_linear, len); > >> + bpf_program__bpil_offs_to_addr(node->info_linear); > > > > what's the reason to call this before the error check? > > This will translate the all the pointers to the right address > (instead of offsets). We only need the offsets when writing to > files. With this approach, the data is not changed whether the > function succeeds or not. It is probably not necessary right > now. But I think this may save us some debugging efforts in > the future. ok, please make comment with this jirka