Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp2257914pxk; Mon, 14 Sep 2020 08:36:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzZyqr8yUhC6pLXpfLH1k5LjnsrOcO0xlwrLXtXtWRFWZYUr9DSofXd/Y9S6PLll9E7oR68 X-Received: by 2002:a17:906:6b95:: with SMTP id l21mr14970060ejr.317.1600097805717; Mon, 14 Sep 2020 08:36:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600097805; cv=none; d=google.com; s=arc-20160816; b=ZFPRWs19WnJjvoVXT/hapdzLbi0cQ7J4ocqGrYsdvKCzbvxgC8Nh0zEzIUAPa1fg70 xG6ln8G1O7s+hidnfmYZgNb+Ss+gMEEVF7820c+r0G5OPkhIxaEAzDYxpoodhJVVqj1R wwe2wOt1mzCtsuvjq84jHCl4NKf7s6O9krv0Y79rf8daltU9G6+AXxsQTc/qQ1AkQp8o 3rL2PGXwU+mWe+C8i67aHXmGuEfTE5n/gk29pPGGtA+lucATpzm5fBQX1ZwQjeH5dCE3 DpGCXwd7GxwNBZtWYgcsx1MH8CgqvUFzOHddJalAhahR4nTmDqeQ8DNMqG0YU25f80bj UDiA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature; bh=RJWCUd5LnCg+A7IBnU7VykwH2w3/Wx2TFkD3b+vwbBQ=; b=SbZgoWOqbeTge7OaZQFnoeoITcpK6xdgjO6X96P3fCObU6QBigi8WvqV3qGG0OoO8o 56LYG8jg4gfe6NhB+0lN3mkHz+GybfHe6MWNvQXSqI5yScvu6nqeLe61iRsMFcJ1Hmj2 cC/sdAq+bDyyIRAbXbpHLhbtoDq1uWyQCNQbk+xmlnljcsud1lWBX59lgwkl4KrZbBnf DIklYb0iB8HsI3GkhxNx5eBGuqR6o3ajilB325E+0g4J9x8VBMHudzZynw2Qz2deJlNA /+j2Z6ETQcAzMXPymu06t5bIVoVQnna78sRqDQDXf01zEQRGN8XKoORGI21zs1YECOWE x0mw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=kXOmq4vV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w5si7244211eja.645.2020.09.14.08.36.23; Mon, 14 Sep 2020 08:36:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=kXOmq4vV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726055AbgINPcf (ORCPT + 99 others); Mon, 14 Sep 2020 11:32:35 -0400 Received: from mail.kernel.org ([198.145.29.99]:43492 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726162AbgINPbh (ORCPT ); Mon, 14 Sep 2020 11:31:37 -0400 Received: from quaco.ghostprotocols.net (unknown [179.97.37.151]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 62289206E9; Mon, 14 Sep 2020 15:31:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1600097496; bh=bY+sNBkXI2ggFeeCJOo1XX2mwQTY0MJ7iOB2YVasCdo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=kXOmq4vVktr+rSXCovBFuB6kcGFlz5iUOZRRAmTIHHHoFj6r/Od+4CbmMf3flvO4D tewG692L3NXKJS9JyM83H+H5ktJvoTK4wtMPKLHq+pPhjrvlzk6Q8HOl76gC4vvMtQ cD5jPBHsYCp9IftkWL7/iDqfl77ey+6yvBMOLwe0= Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id 6E0AA40D3D; Mon, 14 Sep 2020 12:31:34 -0300 (-03) Date: Mon, 14 Sep 2020 12:31:34 -0300 From: Arnaldo Carvalho de Melo To: Stephane Eranian Cc: Jiri Olsa , lkml , Peter Zijlstra , Ingo Molnar , Mark Rutland , Namhyung Kim , Alexander Shishkin , Michael Petlan , Song Liu , "Frank Ch. Eigler" , Ian Rogers , Alexey Budankov , Andi Kleen , Adrian Hunter Subject: Re: [PATCH 02/26] perf: Introduce mmap3 version of mmap event Message-ID: <20200914153134.GD160517@kernel.org> References: <20200913210313.1985612-1-jolsa@kernel.org> <20200913210313.1985612-3-jolsa@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Url: http://acmel.wordpress.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Sun, Sep 13, 2020 at 11:41:00PM -0700, Stephane Eranian escreveu: > On Sun, Sep 13, 2020 at 2:03 PM Jiri Olsa wrote: > > > > Add new version of mmap event. The MMAP3 record is an > > augmented version of MMAP2, it adds build id value to > > identify the exact binary object behind memory map: > > > > struct { > > struct perf_event_header header; > > > > u32 pid, tid; > > u64 addr; > > u64 len; > > u64 pgoff; > > u32 maj; > > u32 min; > > u64 ino; > > u64 ino_generation; > > u32 prot, flags; > > u32 reserved; > > u8 buildid[20]; > > char filename[]; > > struct sample_id sample_id; > > }; > > > > Adding 4 bytes reserved field to align buildid data to 8 bytes, > > so sample_id data is properly aligned. > > > > The mmap3 event is enabled by new mmap3 bit in perf_event_attr > > struct. When set for an event, it enables the build id retrieval > > and will use mmap3 format for the event. > > > > Keeping track of mmap3 events and calling build_id_parse > > in perf_event_mmap_event only if we have any defined. > > > > Having build id attached directly to the mmap event will help > > tool like perf to skip final search through perf data for > > binaries that are needed in the report time. Also it prevents > > possible race when the binary could be removed or replaced > > during profiling. > > > > Signed-off-by: Jiri Olsa > > --- > > include/uapi/linux/perf_event.h | 27 ++++++++++++++++++++++- > > kernel/events/core.c | 38 +++++++++++++++++++++++++++------ > > 2 files changed, 57 insertions(+), 8 deletions(-) > > > > diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h > > index 077e7ee69e3d..facfc3c673ed 100644 > > --- a/include/uapi/linux/perf_event.h > > +++ b/include/uapi/linux/perf_event.h > > @@ -384,7 +384,8 @@ struct perf_event_attr { > > aux_output : 1, /* generate AUX records instead of events */ > > cgroup : 1, /* include cgroup events */ > > text_poke : 1, /* include text poke events */ > > - __reserved_1 : 30; > > + mmap3 : 1, /* include bpf events */ > > + __reserved_1 : 29; > > > what happens if I set mmap3 and mmap2? > > I think using mmap3 for every mmap may be overkill as you add useless > 20 bytes to an mmap record. So use just PERF_RECORD_MMAP2. I think if the user says: I need buildids, then, in kernels with support for getting the buildid in MMAP records, use it as its more accurate, otherwise fall back to traversing all records at the end to go over lots of files haversting those build-ids. If the user says I don't want build-ids, nothing changes, no collection at the end, perf continues using PERF_RECORD_MMAP2. > I am not sure if your code handles the case where mmap3 is not needed > because there is no buildid, e.g, anonymous memory. > It seems to me you've written the patch in such a way that if the user > tool supports mmap3, then it supersedes mmap2, and thus > you need all the fields of mmap2. But if could be more interesting to > return either MMAP2 or MMAP3 depending on tool support > and type of mmap, that would certainly save 20 bytes on any anon mmap. > But maybe that logic is already in your patch and I missed it. Right, it should take into account if the user asked for build-ids or not in addition to checking if the kernel supports MMAP3. - Arnaldo > > > union { > > __u32 wakeup_events; /* wakeup every n events */ > > @@ -1060,6 +1061,30 @@ enum perf_event_type { > > */ > > PERF_RECORD_TEXT_POKE = 20, > > > > + /* > > + * The MMAP3 records are an augmented version of MMAP2, they add > > + * build id value to identify the exact binary behind map > > + * > > + * struct { > > + * struct perf_event_header header; > > + * > > + * u32 pid, tid; > > + * u64 addr; > > + * u64 len; > > + * u64 pgoff; > > + * u32 maj; > > + * u32 min; > > + * u64 ino; > > + * u64 ino_generation; > > + * u32 prot, flags; > > + * u32 reserved; > > + * u8 buildid[20]; > > + * char filename[]; > > + * struct sample_id sample_id; > > + * }; > > + */ > > + PERF_RECORD_MMAP3 = 21, > > + > > PERF_RECORD_MAX, /* non-ABI */ > > }; > > > > diff --git a/kernel/events/core.c b/kernel/events/core.c > > index 7ed5248f0445..719894492dac 100644 > > --- a/kernel/events/core.c > > +++ b/kernel/events/core.c > > @@ -51,6 +51,7 @@ > > #include > > #include > > #include > > +#include > > > > #include "internal.h" > > > > @@ -386,6 +387,7 @@ static DEFINE_PER_CPU(int, perf_sched_cb_usages); > > static DEFINE_PER_CPU(struct pmu_event_list, pmu_sb_events); > > > > static atomic_t nr_mmap_events __read_mostly; > > +static atomic_t nr_mmap3_events __read_mostly; > > static atomic_t nr_comm_events __read_mostly; > > static atomic_t nr_namespaces_events __read_mostly; > > static atomic_t nr_task_events __read_mostly; > > @@ -4588,7 +4590,7 @@ static bool is_sb_event(struct perf_event *event) > > return false; > > > > if (attr->mmap || attr->mmap_data || attr->mmap2 || > > - attr->comm || attr->comm_exec || > > + attr->mmap3 || attr->comm || attr->comm_exec || > > attr->task || attr->ksymbol || > > attr->context_switch || attr->text_poke || > > attr->bpf_event) > > @@ -4644,6 +4646,8 @@ static void unaccount_event(struct perf_event *event) > > dec = true; > > if (event->attr.mmap || event->attr.mmap_data) > > atomic_dec(&nr_mmap_events); > > + if (event->attr.mmap3) > > + atomic_dec(&nr_mmap3_events); > > if (event->attr.comm) > > atomic_dec(&nr_comm_events); > > if (event->attr.namespaces) > > @@ -7465,7 +7469,7 @@ static void perf_pmu_output_stop(struct perf_event *event) > > /* > > * task tracking -- fork/exit > > * > > - * enabled by: attr.comm | attr.mmap | attr.mmap2 | attr.mmap_data | attr.task > > + * enabled by: attr.comm | attr.mmap | attr.mmap2 | attr.mmap3 | attr.mmap_data | attr.task > > */ > > > > struct perf_task_event { > > @@ -7486,8 +7490,8 @@ struct perf_task_event { > > static int perf_event_task_match(struct perf_event *event) > > { > > return event->attr.comm || event->attr.mmap || > > - event->attr.mmap2 || event->attr.mmap_data || > > - event->attr.task; > > + event->attr.mmap2 || event->attr.mmap3 || > > + event->attr.mmap_data || event->attr.task; > > } > > > > static void perf_event_task_output(struct perf_event *event, > > @@ -7913,6 +7917,7 @@ struct perf_mmap_event { > > u64 ino; > > u64 ino_generation; > > u32 prot, flags; > > + u8 buildid[BUILD_ID_SIZE]; > > > > struct { > > struct perf_event_header header; > > @@ -7933,7 +7938,7 @@ static int perf_event_mmap_match(struct perf_event *event, > > int executable = vma->vm_flags & VM_EXEC; > > > > return (!executable && event->attr.mmap_data) || > > - (executable && (event->attr.mmap || event->attr.mmap2)); > > + (executable && (event->attr.mmap || event->attr.mmap2 || event->attr.mmap3)); > > } > > > > static void perf_event_mmap_output(struct perf_event *event, > > @@ -7949,7 +7954,7 @@ static void perf_event_mmap_output(struct perf_event *event, > > if (!perf_event_mmap_match(event, data)) > > return; > > > > - if (event->attr.mmap2) { > > + if (event->attr.mmap2 || event->attr.mmap3) { > > mmap_event->event_id.header.type = PERF_RECORD_MMAP2; > > mmap_event->event_id.header.size += sizeof(mmap_event->maj); > > mmap_event->event_id.header.size += sizeof(mmap_event->min); > > @@ -7959,6 +7964,12 @@ static void perf_event_mmap_output(struct perf_event *event, > > mmap_event->event_id.header.size += sizeof(mmap_event->flags); > > } > > > > + if (event->attr.mmap3) { > > + mmap_event->event_id.header.type = PERF_RECORD_MMAP3; > > + mmap_event->event_id.header.size += sizeof(u32); > > + mmap_event->event_id.header.size += sizeof(mmap_event->buildid); > > + } > > + > > perf_event_header__init_id(&mmap_event->event_id.header, &sample, event); > > ret = perf_output_begin(&handle, event, > > mmap_event->event_id.header.size); > > @@ -7970,7 +7981,7 @@ static void perf_event_mmap_output(struct perf_event *event, > > > > perf_output_put(&handle, mmap_event->event_id); > > > > - if (event->attr.mmap2) { > > + if (event->attr.mmap2 || event->attr.mmap3) { > > perf_output_put(&handle, mmap_event->maj); > > perf_output_put(&handle, mmap_event->min); > > perf_output_put(&handle, mmap_event->ino); > > @@ -7979,6 +7990,13 @@ static void perf_event_mmap_output(struct perf_event *event, > > perf_output_put(&handle, mmap_event->flags); > > } > > > > + if (event->attr.mmap3) { > > + u32 reserved = 0; > > + > > + perf_output_put(&handle, reserved); > > + __output_copy(&handle, mmap_event->buildid, BUILD_ID_SIZE); > > + } > > + > > __output_copy(&handle, mmap_event->file_name, > > mmap_event->file_size); > > > > @@ -8098,6 +8116,9 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) > > mmap_event->prot = prot; > > mmap_event->flags = flags; > > > > + if (atomic_read(&nr_mmap3_events)) > > + build_id_parse(vma, mmap_event->buildid); > > + > > if (!(vma->vm_flags & VM_EXEC)) > > mmap_event->event_id.header.misc |= PERF_RECORD_MISC_MMAP_DATA; > > > > @@ -8241,6 +8262,7 @@ void perf_event_mmap(struct vm_area_struct *vma) > > /* .ino_generation (attr_mmap2 only) */ > > /* .prot (attr_mmap2 only) */ > > /* .flags (attr_mmap2 only) */ > > + /* .buildid (attr_mmap3 only) */ > > }; > > > > perf_addr_filters_adjust(vma); > > @@ -11040,6 +11062,8 @@ static void account_event(struct perf_event *event) > > inc = true; > > if (event->attr.mmap || event->attr.mmap_data) > > atomic_inc(&nr_mmap_events); > > + if (event->attr.mmap3) > > + atomic_inc(&nr_mmap3_events); > > if (event->attr.comm) > > atomic_inc(&nr_comm_events); > > if (event->attr.namespaces) > > -- > > 2.26.2 > > -- - Arnaldo