From nobody Fri Jun 12 12:42:37 2026 Received: from out-170.mta1.migadu.com (out-170.mta1.migadu.com [95.215.58.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C6C744C97 for ; Fri, 15 May 2026 00:53:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778806390; cv=none; b=ZgRLJUtSXMdw3hNVXtislEqvtys4uQGv4YbXbqisEJHG64tWM4/jjZ8Xs+AOhMuvzN6wqLD7XzDNltiJKw3mwXUWs4zZiM4cxFvL/zTfLxh87AD07hAYaUwSySYGPReZcYpfKLIcOR5p0EftDcejZh09i9oKirXEMOlZEVoRB6I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778806390; c=relaxed/simple; bh=/6E4Uj1V5dxCdPU6zojMhfvBzk9DWzYdC9lbgSXe2yg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A7KGyaIeUVayCi9C2ijkhp3foI2rv1FSyHkpcXmzyb2/BrY15+c0dLdjnoPNloVfu1LD+7KtN4SF6WLfnR43toNlOroD7qJ8g2S9p83btWbvOjTBGUNhWr9PLIzYsicqdJ2iooaed/FgyKGNAtDBV8hjQVqBqGBZw/ftwiL7+vQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=AYaB7YA3; arc=none smtp.client-ip=95.215.58.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="AYaB7YA3" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1778806386; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ALIqiwZGQGc8gWzhYBCduPwwRPxukG0LlNeus3Maqs8=; b=AYaB7YA3qVXOXxtMJSRL+dGec7b6tqc/xr9oRj4ssLiK9Y5RcAZlvsEBM9aQoTAYSoC5JY 0YMGBfpr4X6apFQ3qj5+WCO8MabSpKTXzQj6bDOwtefBSsoOQvGWMmerKKRoR6To9ubmQy YSqAsJf1YAWhYb2mG3UHcDDM7q3SR+o= From: Ihor Solodrai To: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Eduard Zingerman , Kumar Kartikeya Dwivedi Cc: Puranjay Mohan , Shakeel Butt , Mykyta Yatsenko , bpf@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH bpf-next v5 1/3] bpf: Factor out stack_map_build_id_set_ip() in stackmap.c Date: Thu, 14 May 2026 17:52:42 -0700 Message-ID: <20260515005244.1333013-2-ihor.solodrai@linux.dev> In-Reply-To: <20260515005244.1333013-1-ihor.solodrai@linux.dev> References: <20260515005244.1333013-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Factor out a small helper from stack_map_get_build_id_offset() in preparation for adding a sleepable build ID resolution path. No functional changes. Acked-by: Mykyta Yatsenko Signed-off-by: Ihor Solodrai --- kernel/bpf/stackmap.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index da3d328f5c15..4ef0fd06cea5 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c @@ -152,6 +152,12 @@ static int fetch_build_id(struct vm_area_struct *vma, = unsigned char *build_id, b : build_id_parse_nofault(vma, build_id, NULL); } =20 +static inline void stack_map_build_id_set_ip(struct bpf_stack_build_id *id) +{ + id->status =3D BPF_STACK_BUILD_ID_IP; + memset(id->build_id, 0, BUILD_ID_SIZE_MAX); +} + /* * Expects all id_offs[i].ip values to be set to correct initial IPs. * They will be subsequently: @@ -165,23 +171,21 @@ static int fetch_build_id(struct vm_area_struct *vma,= unsigned char *build_id, b static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_of= fs, u32 trace_nr, bool user, bool may_fault) { - int i; struct mmap_unlock_irq_work *work =3D NULL; bool irq_work_busy =3D bpf_mmap_unlock_get_irq_work(&work); + bool has_user_ctx =3D user && current && current->mm; struct vm_area_struct *vma, *prev_vma =3D NULL; const char *prev_build_id; + int i; =20 /* If the irq_work is in use, fall back to report ips. Same * fallback is used for kernel stack (!user) on a stackmap with * build_id. */ - if (!user || !current || !current->mm || irq_work_busy || - !mmap_read_trylock(current->mm)) { + if (!has_user_ctx || irq_work_busy || !mmap_read_trylock(current->mm)) { /* cannot access current->mm, fall back to ips */ - for (i =3D 0; i < trace_nr; i++) { - id_offs[i].status =3D BPF_STACK_BUILD_ID_IP; - memset(id_offs[i].build_id, 0, BUILD_ID_SIZE_MAX); - } + for (i =3D 0; i < trace_nr; i++) + stack_map_build_id_set_ip(&id_offs[i]); return; } =20 @@ -196,8 +200,7 @@ static void stack_map_get_build_id_offset(struct bpf_st= ack_build_id *id_offs, vma =3D find_vma(current->mm, ip); if (!vma || fetch_build_id(vma, id_offs[i].build_id, may_fault)) { /* per entry fall back to ips */ - id_offs[i].status =3D BPF_STACK_BUILD_ID_IP; - memset(id_offs[i].build_id, 0, BUILD_ID_SIZE_MAX); + stack_map_build_id_set_ip(&id_offs[i]); continue; } build_id_valid: --=20 2.54.0 From nobody Fri Jun 12 12:42:37 2026 Received: from out-173.mta1.migadu.com (out-173.mta1.migadu.com [95.215.58.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EAFA036308F for ; Fri, 15 May 2026 00:53:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778806393; cv=none; b=Fm9g22Hoj3OiAKCweL4UCAskrmxFt4geRekuYPQce4JhT07vyKq7/ANuY6tnZFlYQLmonwzxpO/3m+iaeOtwZGqHY8MwdJaVUNxgh3H14l8Mk92LxyUZ7KSHaAMPhCd8T293cNQWa5WBDEMRTh2rldMEl1jCiCHVVgd4TT2IarA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778806393; c=relaxed/simple; bh=nlRC9LSJKm7nyiFU+68qzUc9cXr7fKv8RPut4e5vTBs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cMsi/cK+dd3t2iLqYMuYNhPaL7QODH9xoFTImpPq1Mgizb6UsP9ugiQZBDqBISzQZaoFvRJPqysjY3KYO6WIHJqDoz+b9DJZec5rCqMdJBDET+/qvXNXWzW69/IPrEhDgIBWlyMDBwdBGC9oIp8rQ9e8vJ+t5mfSDIrqxR0g6Q8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=RcP6sT9e; arc=none smtp.client-ip=95.215.58.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="RcP6sT9e" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1778806389; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IPMdFo+wk5C2wi7fcGI7iiRmyVjxlC+u2pym/b4gu3U=; b=RcP6sT9eSE84ChazrVXYh/osc1hvyVObm88zzhyRtH4lv4oAxpvk5Kq0WFXwHJxNNSnk9l xn4t5KQSjat08z6lytF9m2AVrhya5jh0/yH7pc5ZvE/1StbHDRVzVxq91xm/1c4YtJdPSk jHufd09IQjrgV06y+IU9ffnXSjOhGOQ= From: Ihor Solodrai To: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Eduard Zingerman , Kumar Kartikeya Dwivedi Cc: Puranjay Mohan , Shakeel Butt , Mykyta Yatsenko , bpf@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH bpf-next v5 2/3] bpf: Avoid faultable build ID reads under mm locks Date: Thu, 14 May 2026 17:52:43 -0700 Message-ID: <20260515005244.1333013-3-ihor.solodrai@linux.dev> In-Reply-To: <20260515005244.1333013-1-ihor.solodrai@linux.dev> References: <20260515005244.1333013-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Sleepable build ID parsing can block in __kernel_read() [1], so the stackmap sleepable path must not call it while holding mmap_lock or a per-VMA read lock. The issue and the fix are conceptually similar to a recent procfs patch [2]. Resolve each covered VMA with a stable read-side reference, preferring lock_vma_under_rcu() and falling back to mmap_read_trylock() only long enough to acquire the VMA read lock. Take a reference to the backing file, drop the VMA lock, and then parse the build ID through (sleepable) build_id_parse_file(). We have to use mmap_read_trylock() (and give up on failure) in this context because taking mmap_read_lock() is generally unsafe on code paths reachable from BPF programs [3], and may lead to deadlocks. [1] https://lore.kernel.org/all/20251218005818.614819-1-shakeel.butt@linux.= dev/ [2] https://lore.kernel.org/all/20260128183232.2854138-1-andrii@kernel.org/ [3] https://lore.kernel.org/bpf/2895ecd8-df1e-4cc0-b9f9-aef893dc2360@linux.= dev/ Fixes: d4dd9775ec24 ("bpf: wire up sleepable bpf_get_stack() and bpf_get_ta= sk_stack() helpers") Suggested-by: Puranjay Mohan Signed-off-by: Ihor Solodrai --- kernel/bpf/stackmap.c | 109 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index 4ef0fd06cea5..08f7659505d1 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "percpu_freelist.h" #include "mmap_unlock_work.h" =20 @@ -158,6 +159,109 @@ static inline void stack_map_build_id_set_ip(struct b= pf_stack_build_id *id) memset(id->build_id, 0, BUILD_ID_SIZE_MAX); } =20 +struct stack_map_vma_lock { + bool vma_locked; + struct vm_area_struct *vma; + struct mm_struct *mm; +}; + +static struct vm_area_struct * +stack_map_lock_vma(struct stack_map_vma_lock *lock, unsigned long ip) +{ + struct mm_struct *mm =3D lock->mm; + struct vm_area_struct *vma; + + if (WARN_ON_ONCE(!mm)) + return NULL; + + vma =3D lock_vma_under_rcu(mm, ip); + if (vma) + goto vma_locked; + + /* + * Taking mmap_read_lock() is unsafe here, because the caller + * BPF program might already hold it, causing a deadlock. + */ + if (!mmap_read_trylock(mm)) + return NULL; + + vma =3D vma_lookup(mm, ip); + if (!vma) { + mmap_read_unlock(mm); + return NULL; + } + +#ifdef CONFIG_PER_VMA_LOCK + if (!vma_start_read_locked(vma)) { + mmap_read_unlock(mm); + return NULL; + } + mmap_read_unlock(mm); +#else + mmap_read_unlock(mm); + return NULL; +#endif +vma_locked: + lock->vma_locked =3D true; + lock->vma =3D vma; + return vma; +} + +static void stack_map_unlock_vma(struct stack_map_vma_lock *lock) +{ + struct vm_area_struct *vma =3D lock->vma; + + if (lock->vma_locked) { + if (WARN_ON_ONCE(!vma)) + goto out; + vma_end_read(vma); + } +out: + lock->vma_locked =3D false; + lock->vma =3D NULL; +} + +static void stack_map_get_build_id_offset_sleepable(struct bpf_stack_build= _id *id_offs, + u32 trace_nr) +{ + struct mm_struct *mm =3D current->mm; + struct stack_map_vma_lock lock =3D { + .vma_locked =3D false, + .vma =3D NULL, + .mm =3D mm, + }; + unsigned long vm_pgoff, vm_start; + struct vm_area_struct *vma; + struct file *file; + u64 ip; + + for (u32 i =3D 0; i < trace_nr; i++) { + ip =3D READ_ONCE(id_offs[i].ip); + vma =3D stack_map_lock_vma(&lock, ip); + if (!vma || !vma->vm_file) { + stack_map_build_id_set_ip(&id_offs[i]); + stack_map_unlock_vma(&lock); + continue; + } + + file =3D get_file(vma->vm_file); + vm_pgoff =3D vma->vm_pgoff; + vm_start =3D vma->vm_start; + stack_map_unlock_vma(&lock); + + /* build_id_parse_file() may block on filesystem reads */ + if (build_id_parse_file(file, id_offs[i].build_id, NULL)) { + stack_map_build_id_set_ip(&id_offs[i]); + fput(file); + continue; + } + fput(file); + + id_offs[i].offset =3D (vm_pgoff << PAGE_SHIFT) + ip - vm_start; + id_offs[i].status =3D BPF_STACK_BUILD_ID_VALID; + } +} + /* * Expects all id_offs[i].ip values to be set to correct initial IPs. * They will be subsequently: @@ -178,6 +282,11 @@ static void stack_map_get_build_id_offset(struct bpf_s= tack_build_id *id_offs, const char *prev_build_id; int i; =20 + if (may_fault && has_user_ctx) { + stack_map_get_build_id_offset_sleepable(id_offs, trace_nr); + return; + } + /* If the irq_work is in use, fall back to report ips. Same * fallback is used for kernel stack (!user) on a stackmap with * build_id. --=20 2.54.0 From nobody Fri Jun 12 12:42:37 2026 Received: from out-187.mta1.migadu.com (out-187.mta1.migadu.com [95.215.58.187]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3686E365A11 for ; Fri, 15 May 2026 00:53:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.187 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778806397; cv=none; b=dUCqhqazY7b9jFPJfar6JFCFTWN4LuXUX/1s2WgQo9pJPGc/3Qdw5FpHKy5RRUVGoSMe+3K5CIV410W3SCEJO71umd9giztCSQxa1HGvVQ6e0P2SscN8d+YiztcaYjjdFHzuCsvRc4fsJHAlS3AbUjCENWHXne/OCgEfac1zy1g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778806397; c=relaxed/simple; bh=mzpNBAnnZtlTx7xoe9u25CdBveL0M7o9RwpTD4ywYx8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qCgFN3Ykc/NWt2VAYzQ0KQfwnKC8P9DOc9Y/Utsih7VRjDXpSinKxN5j68GxoVGl9cFidpjKpw7xa6pofdT5tZe1f3+p++qvV5kK040KHH5RNcj6LItKpQJgguTCgA/utE0MoCmau4TwmUNj4pJsWG56QKEcIkMEQtCVEHqi6b0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=XiPfRUva; arc=none smtp.client-ip=95.215.58.187 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="XiPfRUva" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1778806391; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=G6cvev44iqtouhYC9OJx9EHS+oUV8c83927GdbHHCjI=; b=XiPfRUvaxoNdZx2uY4Wax+VLJqdA8jaIHC2T6Lleii3Hc2zDzEM2X6yXK/mwrbMvZTmGVZ kcwu8m2T9FSA1gviU4x9jpW7FC6kD9iUXo9A1V4ihxraHa0DJHU2bL2JKoLfJ39A3VE1lb TgojvCN8uh2Hf0LwS6WavdNnLewJtj0= From: Ihor Solodrai To: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Eduard Zingerman , Kumar Kartikeya Dwivedi Cc: Puranjay Mohan , Shakeel Butt , Mykyta Yatsenko , bpf@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH bpf-next v5 3/3] bpf: Cache build IDs in sleepable stackmap path Date: Thu, 14 May 2026 17:52:44 -0700 Message-ID: <20260515005244.1333013-4-ihor.solodrai@linux.dev> In-Reply-To: <20260515005244.1333013-1-ihor.solodrai@linux.dev> References: <20260515005244.1333013-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Stack traces often contain adjacent IPs from the same VMA or from different VMAs backed by the same ELF file. Cache the last successfully parsed build ID together with the resolved VMA range and backing file so the sleepable build-ID path can avoid repeated VMA locking and file parsing in common cases. Suggested-by: Mykyta Yatsenko Acked-by: Mykyta Yatsenko Signed-off-by: Ihor Solodrai --- kernel/bpf/stackmap.c | 56 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index 08f7659505d1..7336fd55c856 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c @@ -230,13 +230,33 @@ static void stack_map_get_build_id_offset_sleepable(s= truct bpf_stack_build_id *i .vma =3D NULL, .mm =3D mm, }; - unsigned long vm_pgoff, vm_start; + struct { + struct file *file; + const unsigned char *build_id; + unsigned long vm_start; + unsigned long vm_end; + unsigned long vm_pgoff; + } cache =3D {}; + unsigned long vm_pgoff, vm_start, vm_end; struct vm_area_struct *vma; struct file *file; u64 ip; =20 for (u32 i =3D 0; i < trace_nr; i++) { ip =3D READ_ONCE(id_offs[i].ip); + + /* + * Range cache fast path: if ip falls within the previously + * resolved VMA range, reuse the cache build_id without + * re-acquiring the VMA lock. + */ + if (cache.build_id && ip >=3D cache.vm_start && ip < cache.vm_end) { + vm_start =3D cache.vm_start; + vm_end =3D cache.vm_end; + vm_pgoff =3D cache.vm_pgoff; + goto build_id_valid; + } + vma =3D stack_map_lock_vma(&lock, ip); if (!vma || !vma->vm_file) { stack_map_build_id_set_ip(&id_offs[i]); @@ -244,9 +264,21 @@ static void stack_map_get_build_id_offset_sleepable(st= ruct bpf_stack_build_id *i continue; } =20 - file =3D get_file(vma->vm_file); + file =3D vma->vm_file; vm_pgoff =3D vma->vm_pgoff; vm_start =3D vma->vm_start; + vm_end =3D vma->vm_end; + + if (file =3D=3D cache.file) { + /* + * Same backing file as previous (e.g. different VMAs + * of the same ELF binary). Reuse the cache build_id. + */ + stack_map_unlock_vma(&lock); + goto build_id_valid; + } + + file =3D get_file(file); stack_map_unlock_vma(&lock); =20 /* build_id_parse_file() may block on filesystem reads */ @@ -255,11 +287,29 @@ static void stack_map_get_build_id_offset_sleepable(s= truct bpf_stack_build_id *i fput(file); continue; } - fput(file); =20 + if (cache.file) + fput(cache.file); + cache.file =3D file; + cache.build_id =3D id_offs[i].build_id; + +build_id_valid: + /* + * In the slow path cache.build_id points to id_offs[i].build_id. + * Cache hits leave cache.build_id pointing at a prior slot, + * triggering the memcpy here. + */ + if (cache.build_id !=3D id_offs[i].build_id) + memcpy(id_offs[i].build_id, cache.build_id, BUILD_ID_SIZE_MAX); + cache.vm_start =3D vm_start; + cache.vm_end =3D vm_end; + cache.vm_pgoff =3D vm_pgoff; id_offs[i].offset =3D (vm_pgoff << PAGE_SHIFT) + ip - vm_start; id_offs[i].status =3D BPF_STACK_BUILD_ID_VALID; } + + if (cache.file) + fput(cache.file); } =20 /* --=20 2.54.0