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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 83784C3DA64 for ; Wed, 31 Jul 2024 21:56:16 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 033426B0083; Wed, 31 Jul 2024 17:56:16 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id F25796B0088; Wed, 31 Jul 2024 17:56:15 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DED276B0089; Wed, 31 Jul 2024 17:56:15 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id BFB5A6B0083 for ; Wed, 31 Jul 2024 17:56:15 -0400 (EDT) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 78482120832 for ; Wed, 31 Jul 2024 21:56:15 +0000 (UTC) X-FDA: 82401406710.06.DF64AD1 Received: from mail-pj1-f44.google.com (mail-pj1-f44.google.com [209.85.216.44]) by imf15.hostedemail.com (Postfix) with ESMTP id 9E000A0027 for ; Wed, 31 Jul 2024 21:56:13 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=bdhS5zP5; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf15.hostedemail.com: domain of andrii.nakryiko@gmail.com designates 209.85.216.44 as permitted sender) smtp.mailfrom=andrii.nakryiko@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1722462968; a=rsa-sha256; cv=none; b=jxCVzfB+jPl0nMd+LcyMw0aZeRhMuX45evRJ8dvbT/v/YIwJkF1/tTlVOhgwJG7dCPrvhj PRfVgKRr/3udeu7w0xIbwmJ0TUpzGSwNNMwxDKH2ZdczZw43hHwEG6yv/dqiWYiuxbeyJb lyQmrhluVxHHXkI3zYQFkbl7CzBTL8I= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=bdhS5zP5; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf15.hostedemail.com: domain of andrii.nakryiko@gmail.com designates 209.85.216.44 as permitted sender) smtp.mailfrom=andrii.nakryiko@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1722462968; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=0iTY5UqVu8uZVhVMhHr7OAfSPC1ARBRldJ7iTIrUPv4=; b=I9hA26yaCyD1m/DTDpfsEAKBhxInyQTcJy1wh2SAbddEUHZ5+KMtYdO9Hy+kmYSvU7COKe TwpRpmEtnY4/2hK2B5KKizh+iVQw8wRaXwPiQXPcuL5XwgMlR+XZg5EJmo2D+loAFMUncb cGF7+pMrPr+Nz/IqH2ZPJtKX+kti2kk= Received: by mail-pj1-f44.google.com with SMTP id 98e67ed59e1d1-2cd34c8c588so4057836a91.0 for ; Wed, 31 Jul 2024 14:56:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1722462972; x=1723067772; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=0iTY5UqVu8uZVhVMhHr7OAfSPC1ARBRldJ7iTIrUPv4=; b=bdhS5zP5KffaTUR4rPuT43yQ9wM+UgezGSS2a1SBU41fyz1EOMQmoLSV7IYT0aYjix k5+TY5WQlArfj2yh+AhWHk7bSpZRafCOZWzBZjuRUnQDtme/D7ngI6HP5NBgHD6GpXRl DN3pF+/bH95hJqPlK0eEHNUxULiTP/hP2RqOqnUdI1/rKMWHgssa5QQ7vugN7ragjh64 RekF36CACDyNXWR5uHNokM4Ad+N62mRT/XHaetxponjH2E2jQuIAsDewldFvGVBkdSur ZTTVJ9T5fx1OBAfX0jZp/A2kR9dsaB3UT51FMqDPE9HBiHV48z8jNhA+gQi9CR/Zx485 PQtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722462972; x=1723067772; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0iTY5UqVu8uZVhVMhHr7OAfSPC1ARBRldJ7iTIrUPv4=; b=vwhcAZ7u/GrBmtiB5qfVkDgI5WRFu5AobT3uOz2UHoOO4DXufbgEZStLemXCrTprcu tO59+b94nwNrOoaeh0Twtq9VZh0GYiZmXbaWLolHSsZ1m5mhHh9nAuCHH/ZwMZ7XwPO2 TSqK6aR+gK1dqnccs+CFIALaHT5biBkWYgJ14yy1xslkCfAsk3ZbJygE4uzu0igJG6o4 WDVIgvxSrtPFz9SJjxBvurfrZ4zT9pjFYsicy/bpCSZpgudtarh5aYNPhcw3BHc29nWV c7iffTmQmW1PphBkqnx4dnf/q95PqYjBMxeLkewQ7l3f4oa0SLFnoMoxqXKsIaRMSXgv BhzQ== X-Forwarded-Encrypted: i=1; AJvYcCWzTDdsYcaGdHsn9YLjNDwkIEhh8D3gxMLRbYys4Gk3i7lmMGO49T2Ikz5I0kfyeV+/CbiYC9LuHnfhYBkKozXg7uk= X-Gm-Message-State: AOJu0YyQ/xJ8wwIK68iZVKe/gh2PxioxFrX+ULtmfXjruss4xtYM4UPP atw8Wvj4pM/OyZYSwadpOM+jpIGai7X1YW+WsXl79OUDZRbWIUTSCXmYZyCXupjhJDklUTDY3oB mDDYAr2WEMfBT7fDhUgPMkyxVoCjRGA== X-Google-Smtp-Source: AGHT+IE+7C1Z1ljiOO1HRIW3D2FiNaeVWWq8y9+LOitbh1kE3c69ST+B0ykHqjJmAwjq2dXv/p2L8L0pmmMv/ty4POM= X-Received: by 2002:a17:90b:4a8f:b0:2c9:9eb3:8477 with SMTP id 98e67ed59e1d1-2cfe7871306mr752884a91.16.1722462972221; Wed, 31 Jul 2024 14:56:12 -0700 (PDT) MIME-Version: 1.0 References: <20240730203914.1182569-1-andrii@kernel.org> <20240730203914.1182569-7-andrii@kernel.org> In-Reply-To: <20240730203914.1182569-7-andrii@kernel.org> From: Andrii Nakryiko Date: Wed, 31 Jul 2024 14:56:00 -0700 Message-ID: Subject: Re: [PATCH v3 bpf-next 06/10] lib/buildid: implement sleepable build_id_parse() API To: Andrii Nakryiko , shakeel.butt@linux.dev, Johannes Weiner Cc: bpf@vger.kernel.org, linux-mm@kvack.org, akpm@linux-foundation.org, adobriyan@gmail.com, ak@linux.intel.com, osandov@osandov.com, song@kernel.org, jannh@google.com, Omar Sandoval Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspam-User: X-Rspamd-Queue-Id: 9E000A0027 X-Rspamd-Server: rspam01 X-Stat-Signature: xc9c3ee9ercy9jt5r8o3eomx6ah4kanb X-HE-Tag: 1722462973-35820 X-HE-Meta: U2FsdGVkX1+jmAQ/j7t0YajiUukXgDEE2FTxV12HH+09p3TPDxfv+BsP8JlwcFDsGHAnfWaPPOHwjIyeS+slwQsW7KIiGMPJZJb/v2kaebyqaFNdZFNvXTe6rbR39Xdi3rSJSvHz6/rQoSVmRFq2w/rFSml+0Mklbz6vZwWZc5qsvsaIHkWVSWWLZTJnxRv1QYOrctB3wHxW5HoMfp+VaeIIA/t2OT4LmJYaxiwMxG4FZtZljXeKuf2vqhoZBAwVQvUpMGu7zeZhUoGvYb/X08fjNUBATDsPKWyGRTBZgZ6u+DwCJ924by5duU/871T+5orWaSYwpGxmcuIK+y/SMUO47Bh2OjHoYJgrK30FPKRm8mhXtcy8+bn6xsL2iiiQLPqvvEUvNU1dqoV8X8tw5OstqRafMCXf46RL0rBzl0B2Z9jq5VmX0UGKE9dj25kr9ppVOS/DpK3mUrhz5ABxjQzUrgVyqHG9thzEnfIqO2+oPVhe9rsXVCUyLLCTEapkggW5QHPkI071x1GG+C+6WkhndEMSn6dq15EA8HbWwsj9WC/pZHYxLihwY867RFO/z3JKQfSn1ipTk7PWEVeO45n/pDwlYdzeLWmT8HbGk4vueEAPgDVeonaNfZz9UppEfhHJjYhJ4mSNckw2eOhOmRIKVOERhzet62HBhD5fGBr87yHXXNDsJsUORaEGErcXl35xUwxH3dXoTxOyQSNPFanU6zZ543B0AXY7fHJKHhwXlCLc4IhSIWtwAD3oeCbXDJfu6s3EYjBI5qPYld/nD1U3BZD2sNeOR+lyNJg1LPXvEwuTKq+hwsGKZ2IjYNTEhSGwFq8TC4FIvg8EQWmjJjwZQXz0TZr81MzCAdwSyiIgPUvulCgFB819VdH0D2YiDne9d9aU89DapAQ5hvEhTd6nNbbRg5fHfYaaSUq+3+dd2aw2BftHQvCz83eJx5dGoEtq6/ip4gvIvNKqgwZ aGcE0POr ATCSZR3llPCLjO+mxrDoaN69BiGQdk1c5fwFCuRnPC2Z9rCTh1vrEbZjo01jbBTuw5VnAR9BCft7IxafN66xO+ch1ItCr45L70qs3/xO08M1ooYd38q7E/+XA3a6UuYo0NT6mEuwkcnFmJMOXqv4fOmgsrQu2Rfyyr/GElt8SxJAOP2tAMXbA73NGYrAGEf283yuzaCayHOXa00Qi/2heM2cnDKuqX39b9qGrV+WpQeFNvy+BbpkPjq9K+0tD4FaSJ5jh0zQrinLoAifzYQPXM2sUojOQ+4ekbg5yxjwFu9K9Q5LlZYxk7pSttGMd+swRCDYfTBeW5tcRfldy6R/6ozvbCIUz9aULqojXdHrJES+mjAPjPUjeFTi9yO9Chey/HhO3EeBw5ZtEHNKYnYfO23NX849bYoJ6mfw++C+qJMuExb45qVZl3dQ6GGP8VGk+l3HXx/Ow4JFywU3WgbdKRNTkoPrb8i2TBr4v66iFqz2jkB2I89dMR9ePCo14SbUHy3qryS2I5sbE6dcm8Bq4lh28GQI/blERtl1AjAUQ6tDElRY= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Tue, Jul 30, 2024 at 1:39=E2=80=AFPM Andrii Nakryiko = wrote: > > Extend freader with a flag specifying whether it's OK to cause page > fault to fetch file data that is not already physically present in > memory. With this, it's now easy to wait for data if the caller is > running in sleepable (faultable) context. > > We utilize read_cache_folio() to bring the desired file page into page > cache, after which the rest of the logic works just the same at page leve= l. > > Suggested-by: Omar Sandoval > Cc: Shakeel Butt > Cc: Johannes Weiner > Signed-off-by: Andrii Nakryiko > --- > lib/buildid.c | 50 ++++++++++++++++++++++++++++++++++---------------- > 1 file changed, 34 insertions(+), 16 deletions(-) > > diff --git a/lib/buildid.c b/lib/buildid.c > index 5c869a2a30ab..6b5558cd95bf 100644 > --- a/lib/buildid.c > +++ b/lib/buildid.c > @@ -20,6 +20,7 @@ struct freader { > struct page *page; > void *page_addr; > u64 file_off; > + bool may_fault; > }; > struct { > const char *data; > @@ -29,12 +30,13 @@ struct freader { > }; > > static void freader_init_from_file(struct freader *r, void *buf, u32 buf= _sz, > - struct address_space *mapping) > + struct address_space *mapping, bool ma= y_fault) > { > memset(r, 0, sizeof(*r)); > r->buf =3D buf; > r->buf_sz =3D buf_sz; > r->mapping =3D mapping; > + r->may_fault =3D may_fault; > } > > static void freader_init_from_mem(struct freader *r, const char *data, u= 64 data_sz) > @@ -60,6 +62,17 @@ static int freader_get_page(struct freader *r, u64 fil= e_off) > freader_put_page(r); > > r->page =3D find_get_page(r->mapping, pg_off); > + > + if (!r->page && r->may_fault) { > + struct folio *folio; > + > + folio =3D read_cache_folio(r->mapping, pg_off, NULL, NULL= ); > + if (IS_ERR(folio)) > + return PTR_ERR(folio); > + > + r->page =3D folio_file_page(folio, pg_off); > + } > + mm folks, is this the sane way to do this? Can you please take a look and provide your ack? Thank you! > if (!r->page) > return -EFAULT; /* page not mapped */ > > @@ -273,18 +286,8 @@ static int get_build_id_64(struct freader *r, unsign= ed char *build_id, __u32 *si > /* enough for Elf64_Ehdr, Elf64_Phdr, and all the smaller requests */ > #define MAX_FREADER_BUF_SZ 64 > > -/* > - * Parse build ID of ELF file mapped to vma > - * @vma: vma object > - * @build_id: buffer to store build id, at least BUILD_ID_SIZE long > - * @size: returns actual build id size in case of success > - * > - * Assumes no page fault can be taken, so if relevant portions of ELF fi= le are > - * not already paged in, fetching of build ID fails. > - * > - * Return: 0 on success; negative error, otherwise > - */ > -int build_id_parse_nofault(struct vm_area_struct *vma, unsigned char *bu= ild_id, __u32 *size) > +static int __build_id_parse(struct vm_area_struct *vma, unsigned char *b= uild_id, > + __u32 *size, bool may_fault) > { > const Elf32_Ehdr *ehdr; > struct freader r; > @@ -295,7 +298,7 @@ int build_id_parse_nofault(struct vm_area_struct *vma= , unsigned char *build_id, > if (!vma->vm_file) > return -EINVAL; > > - freader_init_from_file(&r, buf, sizeof(buf), vma->vm_file->f_mapp= ing); > + freader_init_from_file(&r, buf, sizeof(buf), vma->vm_file->f_mapp= ing, may_fault); > > /* fetch first 18 bytes of ELF header for checks */ > ehdr =3D freader_fetch(&r, 0, offsetofend(Elf32_Ehdr, e_type)); > @@ -323,6 +326,22 @@ int build_id_parse_nofault(struct vm_area_struct *vm= a, unsigned char *build_id, > return ret; > } > > +/* > + * Parse build ID of ELF file mapped to vma > + * @vma: vma object > + * @build_id: buffer to store build id, at least BUILD_ID_SIZE long > + * @size: returns actual build id size in case of success > + * > + * Assumes no page fault can be taken, so if relevant portions of ELF fi= le are > + * not already paged in, fetching of build ID fails. > + * > + * Return: 0 on success; negative error, otherwise > + */ > +int build_id_parse_nofault(struct vm_area_struct *vma, unsigned char *bu= ild_id, __u32 *size) > +{ > + return __build_id_parse(vma, build_id, size, false /* !may_fault = */); > +} > + > /* > * Parse build ID of ELF file mapped to VMA > * @vma: vma object > @@ -336,8 +355,7 @@ int build_id_parse_nofault(struct vm_area_struct *vma= , unsigned char *build_id, > */ > int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id, = __u32 *size) > { > - /* fallback to non-faultable version for now */ > - return build_id_parse_nofault(vma, build_id, size); > + return __build_id_parse(vma, build_id, size, true /* may_fault */= ); > } > > /** > -- > 2.43.0 > >