From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 8868E309DB5; Tue, 2 Sep 2025 14:35:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823726; cv=none; b=mmJJSOuLqBR3mi5t2BAhLKXrFOZEqg6pzsXgeTS+mYXg9EtWyKa55lxq+uAltvFvGJejomYL5K1RZHj/SRFVi8gIDEZsBMagYFvdA13jh+0V3z82Uk0LzsH4qT37DvupoETRvV2VIghpdU3r5iH+uEzoEIBOgA+g9KWTSYP1Q5c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823726; c=relaxed/simple; bh=tDmYNAmIv1AO38nKYIGGnLwjJ4+wCAxin6PUU3wtmPc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JSTmGBVlnhku8+sBGaoCTnKkJk9jhl14Exc28A8YwdhSF6iNTmawnPhePd3wKqY4VdKW5iqSkzAJY8zoK1xPyILVSOpYaBl7fxMuKC9D9S7O2oRwAeGddTZVtJHkF4fr7D5Y4WqmOXxBkyC2XUKhahOdJK+TBnxinD308JteDg8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dFlSDziQ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dFlSDziQ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8E478C4CEED; Tue, 2 Sep 2025 14:35:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823726; bh=tDmYNAmIv1AO38nKYIGGnLwjJ4+wCAxin6PUU3wtmPc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dFlSDziQfQjciFA3+labMmTVTZOcmG2QAcSZNF+zyid4HQIDg4rj2+MLWOS3US1xS VK6PVezRNlO8d6SJfrYY8n5GFmT7KRk5pskHfXrqZRT8YayKqIUXH6I1FUnJ7SQsCm NfEZa6ZJX6F0UIXO4gwTZOHxzQpY+PYUhXWc6QU0gA7M+JmgqAoTjmvwUlgkIo3wiW KdU67JG8Y+uT8YqtgHEryoynGf/Z2TxzJojXN+Zu1neRCBT49iKZk9p7T3AFjxp5wc 8lctWLh4ysbfj3hTJKQVz+8gu4fBNS2KDkdej6334+8cLfvW7Iq9+kCvmMSVI/dRqN 1qCNa2XZjtgsQ== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 01/11] uprobes: Add unique flag to uprobe consumer Date: Tue, 2 Sep 2025 16:34:54 +0200 Message-ID: <20250902143504.1224726-2-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Adding unique flag to uprobe consumer to ensure it's the only consumer attached on the uprobe. This is helpful for use cases when consumer wants to change user space registers, which might confuse other consumers. With this change we can ensure there's only one consumer on specific uprobe. Signed-off-by: Jiri Olsa --- include/linux/uprobes.h | 1 + kernel/events/uprobes.c | 30 ++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h index 08ef78439d0d..0df849dee720 100644 --- a/include/linux/uprobes.h +++ b/include/linux/uprobes.h @@ -60,6 +60,7 @@ struct uprobe_consumer { struct list_head cons_node; =20 __u64 id; /* set when uprobe_consumer is registered */ + bool is_unique; /* the only consumer on uprobe */ }; =20 #ifdef CONFIG_UPROBES diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 996a81080d56..b9b088f7333a 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -1024,14 +1024,35 @@ static struct uprobe *alloc_uprobe(struct inode *in= ode, loff_t offset, return uprobe; } =20 -static void consumer_add(struct uprobe *uprobe, struct uprobe_consumer *uc) +static bool consumer_can_add(struct list_head *head, struct uprobe_consume= r *uc) +{ + /* Uprobe has no consumer, we can add any. */ + if (list_empty(head)) + return true; + /* Uprobe has consumer/s, we can't add unique one. */ + if (uc->is_unique) + return false; + /* + * Uprobe has consumer/s, we can add nother consumer only if the + * current consumer is not unique. + **/ + return !list_first_entry(head, struct uprobe_consumer, cons_node)->is_uni= que; +} + +static int consumer_add(struct uprobe *uprobe, struct uprobe_consumer *uc) { static atomic64_t id; + int ret =3D -EBUSY; =20 down_write(&uprobe->consumer_rwsem); + if (!consumer_can_add(&uprobe->consumers, uc)) + goto unlock; list_add_rcu(&uc->cons_node, &uprobe->consumers); uc->id =3D (__u64) atomic64_inc_return(&id); + ret =3D 0; +unlock: up_write(&uprobe->consumer_rwsem); + return ret; } =20 /* @@ -1420,7 +1441,12 @@ struct uprobe *uprobe_register(struct inode *inode, return uprobe; =20 down_write(&uprobe->register_rwsem); - consumer_add(uprobe, uc); + ret =3D consumer_add(uprobe, uc); + if (ret) { + put_uprobe(uprobe); + up_write(&uprobe->register_rwsem); + return ERR_PTR(ret); + } ret =3D register_for_each_vma(uprobe, uc); up_write(&uprobe->register_rwsem); =20 --=20 2.51.0 From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 6A242313538; Tue, 2 Sep 2025 14:35:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823737; cv=none; b=qNtTLb9ywZjmw9YVPZFzUrsPT0cmiYWpc5WtgcnHrar3pjU+p3nU4KijnfxMa59B2GCNGv3fHG0HA+nsyu+Z9Yt2ulMmYdbXopUnvcpQzMMdV35tSBDc/8xlfPn3P1HVGk1RRlyH8vIBvGV4YaOCnTBRSZ56F34GbkSML5zONI8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823737; c=relaxed/simple; bh=UXYiSTNdvGRRIKwbtj+YYd94kdNwShC5KeHjHnOGO/o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fR5vxqXOVl+1wm8fW3wjB0ltQ11GBqfbYOV6j7j1UGialyDJCK3m3yDguEv2UuaX4+BpwJOnWxIGMcsOBv1AOkGL4IswIXBvkLnuaEtK3PUuVReKqyhLHGsoxY5Ssr5S2+7TQDFCYZJGMHZYQ5b7GFXFns6Tf8MKbQBT/qifLM0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QO+ypgHn; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QO+ypgHn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 83987C4CEED; Tue, 2 Sep 2025 14:35:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823737; bh=UXYiSTNdvGRRIKwbtj+YYd94kdNwShC5KeHjHnOGO/o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QO+ypgHn86/YE53znM/cNDWDF7eXK0lZ/ce692MfM6qZADLXqnWh3b5vRXj6g3jTP Wppu5qAtadCXEcBaTpE4VoRjEJCn6osOdn4GKoKYmnZ5d8V72HtRPrs8KZl3Spk6nf uoxBqLuHeOdZIsJ/msv6eQT0MipuhX/93Btng2aD3x4+Pfp1uLhXeZ16ZVYAzkza1V rdBctkL9i+PKTubz8ER4KrIa4mKPOpkZrnNU5uq23Z6K8q+KGUopaokiqyz4pGjivd EqLl6d9zD8hXdCGRyXsjoYfO08rDkmFYtiIfoGPF0BZ6BNf8PGyjMVS/ujAidC8bbW edMlz5Z01Q/Aw== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 02/11] uprobes: Skip emulate/sstep on unique uprobe when ip is changed Date: Tue, 2 Sep 2025 16:34:55 +0200 Message-ID: <20250902143504.1224726-3-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" If uprobe consumer changes instruction pointer we still execute (single step or emulate) the original instruction and increment the ip register with the size of the instruction. In case the instruction is emulated, the new ip register value is incremented with the instructions size and process is likely to crash with illegal instruction. In case the instruction is single-stepped, the ip register change is lost and process continues with the original ip register value. If user decided to take execution elsewhere, it makes little sense to execute the original instruction, so let's skip it. Allowing this behaviour only for uprobe with unique consumer attached. Signed-off-by: Jiri Olsa --- kernel/events/uprobes.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index b9b088f7333a..da8291941c6b 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -2568,7 +2568,7 @@ static bool ignore_ret_handler(int rc) return rc =3D=3D UPROBE_HANDLER_REMOVE || rc =3D=3D UPROBE_HANDLER_IGNORE; } =20 -static void handler_chain(struct uprobe *uprobe, struct pt_regs *regs) +static void handler_chain(struct uprobe *uprobe, struct pt_regs *regs, boo= l *is_unique) { struct uprobe_consumer *uc; bool has_consumers =3D false, remove =3D true; @@ -2582,6 +2582,9 @@ static void handler_chain(struct uprobe *uprobe, stru= ct pt_regs *regs) __u64 cookie =3D 0; int rc =3D 0; =20 + if (is_unique) + *is_unique |=3D uc->is_unique; + if (uc->handler) { rc =3D uc->handler(uc, regs, &cookie); WARN(rc < 0 || rc > 2, @@ -2735,6 +2738,7 @@ static void handle_swbp(struct pt_regs *regs) { struct uprobe *uprobe; unsigned long bp_vaddr; + bool is_unique =3D false; int is_swbp; =20 bp_vaddr =3D uprobe_get_swbp_addr(regs); @@ -2789,7 +2793,10 @@ static void handle_swbp(struct pt_regs *regs) if (arch_uprobe_ignore(&uprobe->arch, regs)) goto out; =20 - handler_chain(uprobe, regs); + handler_chain(uprobe, regs, &is_unique); + + if (is_unique && instruction_pointer(regs) !=3D bp_vaddr) + goto out; =20 /* Try to optimize after first hit. */ arch_uprobe_optimize(&uprobe->arch, bp_vaddr); @@ -2819,7 +2826,7 @@ void handle_syscall_uprobe(struct pt_regs *regs, unsi= gned long bp_vaddr) return; if (arch_uprobe_ignore(&uprobe->arch, regs)) return; - handler_chain(uprobe, regs); + handler_chain(uprobe, regs, NULL); } =20 /* --=20 2.51.0 From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 4FAA12F361D; Tue, 2 Sep 2025 14:35:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823748; cv=none; b=EId35X7pmhOciRIzZhLrhLZoK7A9ThflzgqYhZ68senx5UmD2yaSQhb06IImGSbKanQVBpR9ECco/AZa41vJhPKJWxl4A6wlbuOM9RaX4ramtnoICrTV2vnWGO0KZPa4Qf4SzoInDwaRpHEMt4U3QsZ43zFoHNddTKyUNvsq08w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823748; c=relaxed/simple; bh=FR+1AdMvmpUyMMVlgESextRgMfPsqzjwtFh0yzY02k4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KkVicEMW5Er5fPgWKb0C8roLRsfOPoyfum2qLJGP7vHe4J8cYSoRXg27B45zPXYBAi+DzdqtZ1Eql/utJ8kljeq0XbBEVCPE9CTGsbePogVQFkMW1THITC9pvPx3/D1abcGtwXEo/Uap+t3BP7DXiGQH5Zgyuki65nbOEn+yoYg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lVFW6xgK; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lVFW6xgK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 607BFC4CEED; Tue, 2 Sep 2025 14:35:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823747; bh=FR+1AdMvmpUyMMVlgESextRgMfPsqzjwtFh0yzY02k4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lVFW6xgK2tjpZ7ID8C0wJj5vuo2tQlWFlV9+aIT+UO2qjO3nLOji6L02le5T1gH2b KNL0S2lueH//gEkeu13OuAw+NYxGFFSBlPkAnogXV/JcGIraRYFBWWZIyb2oEPysQI maeiVk2J+pjlinGrPxwboN2mEqAkucmSQm5u1BOylER5nQS1dTB0rNNLSDQvvmKZ5m CLmoWoaeIiewkD/cxTDGcPIGxomePvjUdB4XYyvc4urXcVUzWRSrt0Kiifqqr9BlNt idtlq3NKZFRxYdhLxRs9WTWtx4Met/yWtJIvcriRnw1DBPzdcXdqRCg8XFTYjE5tz5 bTrlq8xFOrnzA== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 03/11] perf: Add support to attach standard unique uprobe Date: Tue, 2 Sep 2025 16:34:56 +0200 Message-ID: <20250902143504.1224726-4-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Adding support to attach unique probe through perf uprobe pmu. Adding new 'unique' format attribute that allows to pass the request to create unique uprobe the uprobe consumer. Signed-off-by: Jiri Olsa --- include/linux/trace_events.h | 2 +- kernel/events/core.c | 8 ++++++-- kernel/trace/trace_event_perf.c | 4 ++-- kernel/trace/trace_probe.h | 2 +- kernel/trace/trace_uprobe.c | 9 +++++---- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index 04307a19cde3..1d35727fda27 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -877,7 +877,7 @@ extern int bpf_get_kprobe_info(const struct perf_event = *event, #endif #ifdef CONFIG_UPROBE_EVENTS extern int perf_uprobe_init(struct perf_event *event, - unsigned long ref_ctr_offset, bool is_retprobe); + unsigned long ref_ctr_offset, bool is_retprobe, bool is_unique); extern void perf_uprobe_destroy(struct perf_event *event); extern int bpf_get_uprobe_info(const struct perf_event *event, u32 *fd_type, const char **filename, diff --git a/kernel/events/core.c b/kernel/events/core.c index 28de3baff792..10a9341c638f 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -11046,11 +11046,13 @@ EXPORT_SYMBOL_GPL(perf_tp_event); */ enum perf_probe_config { PERF_PROBE_CONFIG_IS_RETPROBE =3D 1U << 0, /* [k,u]retprobe */ + PERF_PROBE_CONFIG_IS_UNIQUE =3D 1U << 1, /* unique uprobe */ PERF_UPROBE_REF_CTR_OFFSET_BITS =3D 32, PERF_UPROBE_REF_CTR_OFFSET_SHIFT =3D 64 - PERF_UPROBE_REF_CTR_OFFSET_BITS, }; =20 PMU_FORMAT_ATTR(retprobe, "config:0"); +PMU_FORMAT_ATTR(unique, "config:1"); #endif =20 #ifdef CONFIG_KPROBE_EVENTS @@ -11114,6 +11116,7 @@ PMU_FORMAT_ATTR(ref_ctr_offset, "config:32-63"); =20 static struct attribute *uprobe_attrs[] =3D { &format_attr_retprobe.attr, + &format_attr_unique.attr, &format_attr_ref_ctr_offset.attr, NULL, }; @@ -11144,7 +11147,7 @@ static int perf_uprobe_event_init(struct perf_event= *event) { int err; unsigned long ref_ctr_offset; - bool is_retprobe; + bool is_retprobe, is_unique; =20 if (event->attr.type !=3D perf_uprobe.type) return -ENOENT; @@ -11159,8 +11162,9 @@ static int perf_uprobe_event_init(struct perf_event= *event) return -EOPNOTSUPP; =20 is_retprobe =3D event->attr.config & PERF_PROBE_CONFIG_IS_RETPROBE; + is_unique =3D event->attr.config & PERF_PROBE_CONFIG_IS_UNIQUE; ref_ctr_offset =3D event->attr.config >> PERF_UPROBE_REF_CTR_OFFSET_SHIFT; - err =3D perf_uprobe_init(event, ref_ctr_offset, is_retprobe); + err =3D perf_uprobe_init(event, ref_ctr_offset, is_retprobe, is_unique); if (err) return err; =20 diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_per= f.c index a6bb7577e8c5..b4383ab21d88 100644 --- a/kernel/trace/trace_event_perf.c +++ b/kernel/trace/trace_event_perf.c @@ -296,7 +296,7 @@ void perf_kprobe_destroy(struct perf_event *p_event) =20 #ifdef CONFIG_UPROBE_EVENTS int perf_uprobe_init(struct perf_event *p_event, - unsigned long ref_ctr_offset, bool is_retprobe) + unsigned long ref_ctr_offset, bool is_retprobe, bool is_unique) { int ret; char *path =3D NULL; @@ -317,7 +317,7 @@ int perf_uprobe_init(struct perf_event *p_event, } =20 tp_event =3D create_local_trace_uprobe(path, p_event->attr.probe_offset, - ref_ctr_offset, is_retprobe); + ref_ctr_offset, is_retprobe, is_unique); if (IS_ERR(tp_event)) { ret =3D PTR_ERR(tp_event); goto out; diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h index 842383fbc03b..92870b98b296 100644 --- a/kernel/trace/trace_probe.h +++ b/kernel/trace/trace_probe.h @@ -469,7 +469,7 @@ extern void destroy_local_trace_kprobe(struct trace_eve= nt_call *event_call); =20 extern struct trace_event_call * create_local_trace_uprobe(char *name, unsigned long offs, - unsigned long ref_ctr_offset, bool is_return); + unsigned long ref_ctr_offset, bool is_return, bool is_unique); extern void destroy_local_trace_uprobe(struct trace_event_call *event_call= ); #endif extern int traceprobe_define_arg_fields(struct trace_event_call *event_cal= l, diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index 8b0bcc0d8f41..4ecb6083f949 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c @@ -333,7 +333,7 @@ trace_uprobe_primary_from_call(struct trace_event_call = *call) * Allocate new trace_uprobe and initialize it (including uprobes). */ static struct trace_uprobe * -alloc_trace_uprobe(const char *group, const char *event, int nargs, bool i= s_ret) +alloc_trace_uprobe(const char *group, const char *event, int nargs, bool i= s_ret, bool is_unique) { struct trace_uprobe *tu; int ret; @@ -356,6 +356,7 @@ alloc_trace_uprobe(const char *group, const char *event= , int nargs, bool is_ret) tu->consumer.handler =3D uprobe_dispatcher; if (is_ret) tu->consumer.ret_handler =3D uretprobe_dispatcher; + tu->consumer.is_unique =3D is_unique; init_trace_uprobe_filter(tu->tp.event->filter); return tu; =20 @@ -688,7 +689,7 @@ static int __trace_uprobe_create(int argc, const char *= *argv) argc -=3D 2; argv +=3D 2; =20 - tu =3D alloc_trace_uprobe(group, event, argc, is_return); + tu =3D alloc_trace_uprobe(group, event, argc, is_return, false /* unique = */); if (IS_ERR(tu)) { ret =3D PTR_ERR(tu); /* This must return -ENOMEM otherwise there is a bug */ @@ -1636,7 +1637,7 @@ static int unregister_uprobe_event(struct trace_uprob= e *tu) #ifdef CONFIG_PERF_EVENTS struct trace_event_call * create_local_trace_uprobe(char *name, unsigned long offs, - unsigned long ref_ctr_offset, bool is_return) + unsigned long ref_ctr_offset, bool is_return, bool is_unique) { enum probe_print_type ptype; struct trace_uprobe *tu; @@ -1658,7 +1659,7 @@ create_local_trace_uprobe(char *name, unsigned long o= ffs, * duplicated name "DUMMY_EVENT" here. */ tu =3D alloc_trace_uprobe(UPROBE_EVENT_SYSTEM, "DUMMY_EVENT", 0, - is_return); + is_return, is_unique); =20 if (IS_ERR(tu)) { pr_info("Failed to allocate trace_uprobe.(%d)\n", --=20 2.51.0 From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 44E1B2FB975; Tue, 2 Sep 2025 14:35:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823759; cv=none; b=nlhi+GDIjfB3Sc35UMJeci92gtnb/B4oaaiUnCqbt5DQmRrajFt33zs2SfjnP9xU5IaohIsmNgPEV8zrc4lz3iAGSwBsWcC7tjw/Cc/Zi3peYMLl6x4WV9IN694D2Sv6YgbOOxFT0ma4zUrL2YKkyWTBDFemmqo4iH7XtI6HWE4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823759; c=relaxed/simple; bh=t3UXooaazEhhUvhuEd2T+tvKknhfUjTYkjtwmq08f+k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DJBivUKUNsXZfg4nHM/dpKs7iMC3IPkF/F9s+QuGYoGIBUDrdwf3jZmp42sRqMnj8hCa5dUkG9v/s/hU0BDKhog5/BrQ5C2sSUyNU3r+u5cBaiOcEaHQN333YewNkDMr/7Yu0MvvALYsLdXLRe6+RR9vYgn/+3ETHc7DARHRotw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=K8p0Hgey; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="K8p0Hgey" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3C0ECC4CEED; Tue, 2 Sep 2025 14:35:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823758; bh=t3UXooaazEhhUvhuEd2T+tvKknhfUjTYkjtwmq08f+k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K8p0HgeyswS62wDW4Mzla2zdjTCHIXLx9uHWrj+2KFE0sbUuFs8C5wTrGC2B8Of6R VDD7xG/KVOTVdPLHXQeGTXy7r/ksoTJ8MPAOrOr3HNDtvBsvWeqndbnSt6LBPMIBES /uqWPGqOlAWHqWblK4EdkEgNOkFVqOcv1BcMloAJ7c7EcVZR5qO33C4ktLW/+88hXW a5CAQadi0BzuR9knBJTVt8YSilxhNvDKDUVtxfzbLqn3vSzx6EuCgBXb0BwA+ykTSg aoz+P/+Trz2b2FAJ56pc2X9zNFCcAW4CNqJya03K4tOWXCPGKDX6mvzInmI5bo+Tfw 7ewSsC/rmwPHw== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 04/11] bpf: Add support to attach uprobe_multi unique uprobe Date: Tue, 2 Sep 2025 16:34:57 +0200 Message-ID: <20250902143504.1224726-5-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Adding support to attach unique uprobe through uprobe multi link interface. Adding new BPF_F_UPROBE_MULTI_UNIQUE flag that denotes the unique uprobe creation. Signed-off-by: Jiri Olsa --- include/uapi/linux/bpf.h | 3 ++- kernel/trace/bpf_trace.c | 4 +++- tools/include/uapi/linux/bpf.h | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 233de8677382..3de9eb469fe2 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -1300,7 +1300,8 @@ enum { * BPF_TRACE_UPROBE_MULTI attach type to create return probe. */ enum { - BPF_F_UPROBE_MULTI_RETURN =3D (1U << 0) + BPF_F_UPROBE_MULTI_RETURN =3D (1U << 0), + BPF_F_UPROBE_MULTI_UNIQUE =3D (1U << 1), }; =20 /* link_create.netfilter.flags used in LINK_CREATE command for diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 3ae52978cae6..0674d5ac7b55 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -3349,7 +3349,7 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr= *attr, struct bpf_prog *pr return -EINVAL; =20 flags =3D attr->link_create.uprobe_multi.flags; - if (flags & ~BPF_F_UPROBE_MULTI_RETURN) + if (flags & ~(BPF_F_UPROBE_MULTI_RETURN|BPF_F_UPROBE_MULTI_UNIQUE)) return -EINVAL; =20 /* @@ -3423,6 +3423,8 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr= *attr, struct bpf_prog *pr =20 uprobes[i].link =3D link; =20 + if (flags & BPF_F_UPROBE_MULTI_UNIQUE) + uprobes[i].consumer.is_unique =3D true; if (!(flags & BPF_F_UPROBE_MULTI_RETURN)) uprobes[i].consumer.handler =3D uprobe_multi_link_handler; if (flags & BPF_F_UPROBE_MULTI_RETURN || is_uprobe_session(prog)) diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 233de8677382..3de9eb469fe2 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -1300,7 +1300,8 @@ enum { * BPF_TRACE_UPROBE_MULTI attach type to create return probe. */ enum { - BPF_F_UPROBE_MULTI_RETURN =3D (1U << 0) + BPF_F_UPROBE_MULTI_RETURN =3D (1U << 0), + BPF_F_UPROBE_MULTI_UNIQUE =3D (1U << 1), }; =20 /* link_create.netfilter.flags used in LINK_CREATE command for --=20 2.51.0 From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 D55802EA49D; Tue, 2 Sep 2025 14:36:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823769; cv=none; b=ob0ZDWlRZEzdfnSFtB2AyX3Kzcehi8qOGDskT289D49lfTW68lEUGv7zJgLXUIlTLhvkav0vmNvqtmd0B72P/J0TOOjY5MJh4PYI4tHhG0RA8XGFWNXTgI1XQ1V6peiNfkvltuIISKuWbJjYzu45xYAXUx2tWvKciDFTKosJ408= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823769; c=relaxed/simple; bh=ixNZrhvRsdTd9sVuo3xMKCH4jWWm/B/SYs1iIFGaOwY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lV3i153rb+vGMqUxl5bDZ9B8SqizWFoCcZaWj0JN32N/+NfqPfGzWyHzphnWlsD9BfDctfEPIQGS2xOZWy3bT7kLvLkHrBFZsXgSJmKpWrNBHMHpGClvGkqcgZhSVtGgOBQont03qjuT2s4FwlwRPZhuK7VLGyt2MLChHJwp20c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=d1bxLkE+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="d1bxLkE+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 001D4C4CEED; Tue, 2 Sep 2025 14:36:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823769; bh=ixNZrhvRsdTd9sVuo3xMKCH4jWWm/B/SYs1iIFGaOwY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=d1bxLkE+vJ2Jcv16rcCmbgKvG5AXEsVwszB2+3qCX8136suKG2rtaK8KORVWprSdM Mj9HnFLaU409NBr4b0DPVmYTyouAaWbByyos/DoxWLlKzaus61DjOPUmc7bsCXELyX oS38Qv8bIOMCXg8x69kVzrD5gdAQIj7hnLeHOskJ9WPILr217R1rizWQwBXC5hNVB2 +cQLDalAKiSwp2Mk443NCJIeN3c10TP0kU56wHtwoHVnDKfxMjkY+Pfx8DKrNw+QLR //GjF7lR72/lEXwjf9EH6uMomByNT+vkZqhBGKLw2she13IRzDdGruCITP64u1BR1n ZsxikY+c712mA== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 05/11] bpf: Allow uprobe program to change context registers Date: Tue, 2 Sep 2025 16:34:58 +0200 Message-ID: <20250902143504.1224726-6-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Currently uprobe (BPF_PROG_TYPE_KPROBE) program can't write to the context registers data. While this makes sense for kprobe attachments, for uprobe attachment it might make sense to be able to change user space registers to alter application execution. Since uprobe and kprobe programs share the same type (BPF_PROG_TYPE_KPROBE), we can't deny write access to context during the program load. We need to check on it during program attachment to see if it's going to be kprobe or uprobe. Storing the program's write attempt to context and checking on it during the attachment. Signed-off-by: Jiri Olsa --- include/linux/bpf.h | 1 + kernel/events/core.c | 4 ++++ kernel/trace/bpf_trace.c | 3 +-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index cc700925b802..404a30cde84e 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1619,6 +1619,7 @@ struct bpf_prog_aux { bool priv_stack_requested; bool changes_pkt_data; bool might_sleep; + bool kprobe_write_ctx; u64 prog_array_member_cnt; /* counts how many times as member of prog_arr= ay */ struct mutex ext_mutex; /* mutex for is_extended and prog_array_member_cn= t */ struct bpf_arena *arena; diff --git a/kernel/events/core.c b/kernel/events/core.c index 10a9341c638f..74bb5008a1c4 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -11242,6 +11242,10 @@ static int __perf_event_set_bpf_prog(struct perf_e= vent *event, if (prog->kprobe_override && !is_kprobe) return -EINVAL; =20 + /* Writing to context allowed only for uprobes. */ + if (prog->aux->kprobe_write_ctx && !is_uprobe) + return -EINVAL; + if (is_tracepoint || is_syscall_tp) { int off =3D trace_event_get_offsets(event->tp_event); =20 diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 0674d5ac7b55..6fdec68563bd 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -1521,8 +1521,6 @@ static bool kprobe_prog_is_valid_access(int off, int = size, enum bpf_access_type { if (off < 0 || off >=3D sizeof(struct pt_regs)) return false; - if (type !=3D BPF_READ) - return false; if (off % size !=3D 0) return false; /* @@ -1532,6 +1530,7 @@ static bool kprobe_prog_is_valid_access(int off, int = size, enum bpf_access_type if (off + size > sizeof(struct pt_regs)) return false; =20 + prog->aux->kprobe_write_ctx |=3D type =3D=3D BPF_WRITE; return true; } =20 --=20 2.51.0 From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 6A0562EA49D; Tue, 2 Sep 2025 14:36:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823781; cv=none; b=h6JolQKmN6tgwDS+vrju0YGKaXjy8M0JKwM/d6iORUwxOUDBB080TyaQzxEuYZFsh/IDiUyh5fHHpM9F8zoOLQAG7cD3vx7+y3MMPC2ZIg+9gu3PqyRZW2nwr5n5uS5gX1kuk7/vB8xZkt+3s9megG6TO1m108fVLY14elH626M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823781; c=relaxed/simple; bh=4JOoZz3iZN1zacKGCHmVDgQlHUbUlhkai0CbLI11oAo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iiRbrrDl7yICO/6u0efmcEj0IgiXqg6oSX5cIojivwIk/0bBh7/r2FrfrxlbkNQfAhFFsD9WfAnDgZTZyB0+xZLxv37qjfK3xUdQRk7BnrFfUvqgWr8vK6sHSK+ftIustKhnela1SmY6IatHqCZ5Sacep2DKmrVF1oq3UA/TvjA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=W3S1b54n; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="W3S1b54n" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 86A04C4CEED; Tue, 2 Sep 2025 14:36:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823780; bh=4JOoZz3iZN1zacKGCHmVDgQlHUbUlhkai0CbLI11oAo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=W3S1b54naU/RQWH8K4HgD4xC3woY8aWCaUWMAuVxoE2wrsza65fyOr9RowvFGZeve d7EyT+8WaxP9uK1d/0whZnWEfzf2fSY8XlBTkhWy1ix5GQIkFjp+SxP+nfDZR6YXuj dEcagW56EIZqb0VsQ4SHqhYI1iUxdp3XcTGS9O4BtIwRLlug1j0Oltr7jRMD1E2CiZ nDrOdeT+pFaE+Rg7MapBCAOHKELq56ZFKh7kLVvE7ZTUAPKxZ0hNmlKx64S0QglWzB mEbqwBw44BuSx4zHtvDhLC6XgEnr6QU6aKpB2SVHyMGwOiq+7kbBz7eGcT37glRzNW jMc4NCbVzI21w== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 06/11] libbpf: Add support to attach unique uprobe_multi uprobe Date: Tue, 2 Sep 2025 16:34:59 +0200 Message-ID: <20250902143504.1224726-7-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Adding support to attach unique uprobe multi by adding the 'unique' bool flag to struct bpf_uprobe_multi_opts. Also adding "uprobe.unique[.s]" auto load sections to create uprobe_multi unique uprobe. Signed-off-by: Jiri Olsa --- tools/lib/bpf/libbpf.c | 7 ++++++- tools/lib/bpf/libbpf.h | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 8f5a81b672e1..1f613a5f95b6 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -9525,6 +9525,8 @@ static const struct bpf_sec_def section_defs[] =3D { SEC_DEF("uprobe.multi+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_NONE, attach= _uprobe_multi), SEC_DEF("uretprobe.multi+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_NONE, att= ach_uprobe_multi), SEC_DEF("uprobe.session+", KPROBE, BPF_TRACE_UPROBE_SESSION, SEC_NONE, at= tach_uprobe_multi), + SEC_DEF("uprobe.unique+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_NONE, attac= h_uprobe_multi), + SEC_DEF("uprobe.unique.s+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_SLEEPABLE= , attach_uprobe_multi), SEC_DEF("uprobe.multi.s+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_SLEEPABLE,= attach_uprobe_multi), SEC_DEF("uretprobe.multi.s+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_SLEEPAB= LE, attach_uprobe_multi), SEC_DEF("uprobe.session.s+", KPROBE, BPF_TRACE_UPROBE_SESSION, SEC_SLEEPA= BLE, attach_uprobe_multi), @@ -11880,6 +11882,7 @@ static int attach_uprobe_multi(const struct bpf_pro= gram *prog, long cookie, stru case 3: opts.session =3D str_has_pfx(probe_type, "uprobe.session"); opts.retprobe =3D str_has_pfx(probe_type, "uretprobe.multi"); + opts.unique =3D str_has_pfx(probe_type, "uprobe.unique"); =20 *link =3D bpf_program__attach_uprobe_multi(prog, -1, binary_path, func_n= ame, &opts); ret =3D libbpf_get_error(*link); @@ -12116,10 +12119,10 @@ bpf_program__attach_uprobe_multi(const struct bpf= _program *prog, LIBBPF_OPTS(bpf_link_create_opts, lopts); unsigned long *resolved_offsets =3D NULL; enum bpf_attach_type attach_type; + bool retprobe, session, unique; int err =3D 0, link_fd, prog_fd; struct bpf_link *link =3D NULL; char full_path[PATH_MAX]; - bool retprobe, session; const __u64 *cookies; const char **syms; size_t cnt; @@ -12141,6 +12144,7 @@ bpf_program__attach_uprobe_multi(const struct bpf_p= rogram *prog, cnt =3D OPTS_GET(opts, cnt, 0); retprobe =3D OPTS_GET(opts, retprobe, false); session =3D OPTS_GET(opts, session, false); + unique =3D OPTS_GET(opts, unique, false); =20 /* * User can specify 2 mutually exclusive set of inputs: @@ -12203,6 +12207,7 @@ bpf_program__attach_uprobe_multi(const struct bpf_p= rogram *prog, lopts.uprobe_multi.cookies =3D cookies; lopts.uprobe_multi.cnt =3D cnt; lopts.uprobe_multi.flags =3D retprobe ? BPF_F_UPROBE_MULTI_RETURN : 0; + lopts.uprobe_multi.flags |=3D unique ? BPF_F_UPROBE_MULTI_UNIQUE : 0; =20 if (pid =3D=3D 0) pid =3D getpid(); diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 455a957cb702..13a10299331b 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -596,10 +596,12 @@ struct bpf_uprobe_multi_opts { bool retprobe; /* create session kprobes */ bool session; + /* create unique uprobe */ + bool unique; size_t :0; }; =20 -#define bpf_uprobe_multi_opts__last_field session +#define bpf_uprobe_multi_opts__last_field unique =20 /** * @brief **bpf_program__attach_uprobe_multi()** attaches a BPF program --=20 2.51.0 From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 16A1B2EA49D; Tue, 2 Sep 2025 14:36:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823791; cv=none; b=EfcbBGFBHlkUS0XevPfA4atAXTjtjJu5e1taBDlQoTW6kiH2V4des8U1ZbJhBtSPFzeKdWPx8p65p41qKe5R+tJ5LxPKpgpF2QbJKCk1prfqZrEntQF27Ew3LCK0UXSVc+5Oox68U7z1kDasa+gcmhYwr8586wqBkZf4ZketkeI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823791; c=relaxed/simple; bh=6eENUiVylxO8M48Iw25t4r5Dlvc4cgE0fyAMvijAXqI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bJ+BIXMepQ4b89wQaPOx+WoC3SRQ1ADF3FHvYFCwqbDr8gD9w0U5UzeM6alfninqQ5HY49Kqj3Ytz0LBV7G8xCe3k3BCV1NhXyUaxYPrIiSWd+t6jtYub0sVcyLTA67JVLVKObtNVhsNFTDse1IAk2CMIxjkNKMSQs+QDcCoWjE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uYFRTdC2; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uYFRTdC2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 30040C4CEED; Tue, 2 Sep 2025 14:36:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823790; bh=6eENUiVylxO8M48Iw25t4r5Dlvc4cgE0fyAMvijAXqI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uYFRTdC2bVHsR6rOQwmGc6m2GBNR/uvQND2mKnY+Z6aoOjOxVMemdvWw5x8eR1vKA 42YIUzOt7NVII2BKTGY7c/oLyUZd83+b4/rIlUam53z+G2Nng3RsC9SCLmv2ZmyuEF idLe4uf+fcQ0nOFqUd4BdA3cb1EtdH2h7asNQo756wKvkIxCEXVqa8hy4ixC/5vnVJ nETBusXUKbHlYfyxIgRE/sTstszy/JdrFTg+wsrrkn/Vg+TSgXnMYp5VspYp3sZF52 Xaisxqeb8ayCSct/XhkAqYHbBA112NYdgx771FrtJgZjUkS5GQNqc13Wj0eignhSEA CvHchmEK56QJw== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 07/11] libbpf: Add support to attach generic unique uprobe Date: Tue, 2 Sep 2025 16:35:00 +0200 Message-ID: <20250902143504.1224726-8-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Adding support to attach unique generic uprobe by adding the 'unique' bool flag to struct bpf_uprobe_opts. Signed-off-by: Jiri Olsa --- tools/lib/bpf/libbpf.c | 29 ++++++++++++++++++++++++----- tools/lib/bpf/libbpf.h | 4 +++- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 1f613a5f95b6..aac2bd4fb95e 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -11045,11 +11045,19 @@ static int determine_uprobe_retprobe_bit(void) return parse_uint_from_file(file, "config:%d\n"); } =20 +static int determine_uprobe_unique_bit(void) +{ + const char *file =3D "/sys/bus/event_source/devices/uprobe/format/unique"; + + return parse_uint_from_file(file, "config:%d\n"); +} + #define PERF_UPROBE_REF_CTR_OFFSET_BITS 32 #define PERF_UPROBE_REF_CTR_OFFSET_SHIFT 32 =20 static int perf_event_open_probe(bool uprobe, bool retprobe, const char *n= ame, - uint64_t offset, int pid, size_t ref_ctr_off) + uint64_t offset, int pid, size_t ref_ctr_off, + bool unique) { const size_t attr_sz =3D sizeof(struct perf_event_attr); struct perf_event_attr attr; @@ -11080,6 +11088,16 @@ static int perf_event_open_probe(bool uprobe, bool= retprobe, const char *name, } attr.config |=3D 1 << bit; } + if (uprobe && unique) { + int bit =3D determine_uprobe_unique_bit(); + + if (bit < 0) { + pr_warn("failed to determine uprobe unique bit: %s\n", + errstr(bit)); + return bit; + } + attr.config |=3D 1 << bit; + } attr.size =3D attr_sz; attr.type =3D type; attr.config |=3D (__u64)ref_ctr_off << PERF_UPROBE_REF_CTR_OFFSET_SHIFT; @@ -11286,7 +11304,7 @@ int probe_kern_syscall_wrapper(int token_fd) if (determine_kprobe_perf_type() >=3D 0) { int pfd; =20 - pfd =3D perf_event_open_probe(false, false, syscall_name, 0, getpid(), 0= ); + pfd =3D perf_event_open_probe(false, false, syscall_name, 0, getpid(), 0= , false); if (pfd >=3D 0) close(pfd); =20 @@ -11348,7 +11366,7 @@ bpf_program__attach_kprobe_opts(const struct bpf_pr= ogram *prog, if (!legacy) { pfd =3D perf_event_open_probe(false /* uprobe */, retprobe, func_name, offset, - -1 /* pid */, 0 /* ref_ctr_off */); + -1 /* pid */, 0 /* ref_ctr_off */, false /* unique */); } else { char probe_name[MAX_EVENT_NAME_LEN]; =20 @@ -12251,7 +12269,7 @@ bpf_program__attach_uprobe_opts(const struct bpf_pr= ogram *prog, pid_t pid, struct bpf_link *link; size_t ref_ctr_off; int pfd, err; - bool retprobe, legacy; + bool retprobe, legacy, unique; const char *func_name; =20 if (!OPTS_VALID(opts, bpf_uprobe_opts)) @@ -12261,6 +12279,7 @@ bpf_program__attach_uprobe_opts(const struct bpf_pr= ogram *prog, pid_t pid, retprobe =3D OPTS_GET(opts, retprobe, false); ref_ctr_off =3D OPTS_GET(opts, ref_ctr_offset, 0); pe_opts.bpf_cookie =3D OPTS_GET(opts, bpf_cookie, 0); + unique =3D OPTS_GET(opts, unique, false); =20 if (!binary_path) return libbpf_err_ptr(-EINVAL); @@ -12321,7 +12340,7 @@ bpf_program__attach_uprobe_opts(const struct bpf_pr= ogram *prog, pid_t pid, =20 if (!legacy) { pfd =3D perf_event_open_probe(true /* uprobe */, retprobe, binary_path, - func_offset, pid, ref_ctr_off); + func_offset, pid, ref_ctr_off, unique); } else { char probe_name[MAX_EVENT_NAME_LEN]; =20 diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 13a10299331b..0a38dee1d9c1 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -701,9 +701,11 @@ struct bpf_uprobe_opts { const char *func_name; /* uprobe attach mode */ enum probe_attach_mode attach_mode; + /* create unique uprobe */ + bool unique; size_t :0; }; -#define bpf_uprobe_opts__last_field attach_mode +#define bpf_uprobe_opts__last_field unique =20 /** * @brief **bpf_program__attach_uprobe()** attaches a BPF program --=20 2.51.0 From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 5316931E11F; Tue, 2 Sep 2025 14:36:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823802; cv=none; b=ZTqW/INqrJE28zPAUQGXj4ZTYI5i7Y54ElrkpHy4/TxXFxNODGMFHioX2r5bh0ggZ2FDfQo4FpkPA6Gc3P3pYSeWDrwn18ObOYx7udeCP+Oc+0rwqYFCDimac8SiiwhXkC7kXrfNA9FvYPtE4EL0PYhwSMULtXf/EsarBR1LMOM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823802; c=relaxed/simple; bh=jOrI1/r9cXIWWIBL1iahAvqnnE3/HtGeDR9yXqysb2U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fhbvH2gSDi7eatJ2eXcdyCsdS58+bPRBFVKgcFLStAK+WySqtDxw2s6Gk+NAzV3ypAUQwYM80dDeyhw9lYIXxFQGiE7OTiWaz0rkCb4I15O5pxI8aSRcb6mk1mCQKsz7Q0m1lADDYdWJCeivW2OHqu1fZ+HC9hP8MAoDgvquAYk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=t2QYEvUk; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="t2QYEvUk" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E7D7AC4CEF6; Tue, 2 Sep 2025 14:36:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823801; bh=jOrI1/r9cXIWWIBL1iahAvqnnE3/HtGeDR9yXqysb2U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=t2QYEvUkKHXFGrZgaFJ5Y/lV7+xo/IzLJoEXKH+zFjw4X0+9P2QUJ2iC7KT3T62P6 uVNzwA6GklARr6xTRoUVF+u0MPIOg5tGIY31GFRKtqFnnjI6EBFjUNeq0ifqWuu6Ct xNpw5o/DtxjJGd8OYFWZaKWXgBiIIro5WSnNwF9bxQ6HsKDEYjTPqhFrjcz8+7fZAr +xqvBmsHjcnH/1eXjlVUMO4DQrtT57NzKCmKa4AyDcsOHycvs42HEahkSZTvADAiUp xLSAMAd0l7I2j+9uT0bWZbnXH7O1VzSSBr2/H8ilEvjnABe+hxvbzs/25erndtT5H0 2xRcnAbvAYztA== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 08/11] selftests/bpf: Add uprobe multi context registers changes test Date: Tue, 2 Sep 2025 16:35:01 +0200 Message-ID: <20250902143504.1224726-9-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Adding test to check we can change common register values through uprobe program. It's x86_64 specific test. Signed-off-by: Jiri Olsa --- .../selftests/bpf/prog_tests/bpf_cookie.c | 1 + .../bpf/prog_tests/uprobe_multi_test.c | 107 ++++++++++++++++++ .../selftests/bpf/progs/uprobe_multi.c | 24 ++++ 3 files changed, 132 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c b/tools/te= sting/selftests/bpf/prog_tests/bpf_cookie.c index 4a0670c056ba..2425fd26d1ea 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include diff --git a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c b/t= ools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c index 2ee17ef1dae2..012652b07399 100644 --- a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c +++ b/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c @@ -2,6 +2,7 @@ =20 #include #include +#include #include #include "uprobe_multi.skel.h" #include "uprobe_multi_bench.skel.h" @@ -1340,6 +1341,111 @@ static void test_bench_attach_usdt(void) printf("%s: detached in %7.3lfs\n", __func__, detach_delta); } =20 +#ifdef __x86_64__ +__naked __maybe_unused unsigned long uprobe_regs_change_trigger(void) +{ + asm volatile ( + "ret\n" + ); +} + +static __naked void uprobe_regs_change(struct pt_regs *before, struct pt_r= egs *after) +{ + asm volatile ( + "movq %r11, 48(%rdi)\n" + "movq %r10, 56(%rdi)\n" + "movq %r9, 64(%rdi)\n" + "movq %r8, 72(%rdi)\n" + "movq %rax, 80(%rdi)\n" + "movq %rcx, 88(%rdi)\n" + "movq %rdx, 96(%rdi)\n" + "movq %rsi, 104(%rdi)\n" + "movq %rdi, 112(%rdi)\n" + + /* save 2nd argument */ + "pushq %rsi\n" + "call uprobe_regs_change_trigger\n" + + /* save return value and load 2nd argument pointer to rax */ + "pushq %rax\n" + "movq 8(%rsp), %rax\n" + + "movq %r11, 48(%rax)\n" + "movq %r10, 56(%rax)\n" + "movq %r9, 64(%rax)\n" + "movq %r8, 72(%rax)\n" + "movq %rcx, 88(%rax)\n" + "movq %rdx, 96(%rax)\n" + "movq %rsi, 104(%rax)\n" + "movq %rdi, 112(%rax)\n" + + /* restore return value and 2nd argument */ + "pop %rax\n" + "pop %rsi\n" + + "movq %rax, 80(%rsi)\n" + "ret\n" + ); +} + +static void unique_regs_common(void) +{ + struct pt_regs before =3D {}, after =3D {}, expected =3D { + .rax =3D 0xc0ffe, + .rcx =3D 0xbad, + .rdx =3D 0xdead, + .r8 =3D 0x8, + .r9 =3D 0x9, + .r10 =3D 0x10, + .r11 =3D 0x11, + .rdi =3D 0x12, + .rsi =3D 0x13, + }; + LIBBPF_OPTS(bpf_uprobe_multi_opts, opts, + .unique =3D true, + ); + struct uprobe_multi *skel; + + skel =3D uprobe_multi__open_and_load(); + if (!ASSERT_OK_PTR(skel, "skel_open")) + return; + + skel->bss->pid =3D getpid(); + skel->bss->regs =3D expected; + + skel->links.uprobe_change_regs =3D bpf_program__attach_uprobe_multi( + skel->progs.uprobe_change_regs, + -1, "/proc/self/exe", + "uprobe_regs_change_trigger", + &opts); + if (!ASSERT_OK_PTR(skel->links.uprobe_change_regs, "bpf_program__attach_u= probe_multi")) + goto cleanup; + + uprobe_regs_change(&before, &after); + + ASSERT_EQ(after.rax, expected.rax, "ax"); + ASSERT_EQ(after.rcx, expected.rcx, "cx"); + ASSERT_EQ(after.rdx, expected.rdx, "dx"); + ASSERT_EQ(after.r8, expected.r8, "r8"); + ASSERT_EQ(after.r9, expected.r9, "r9"); + ASSERT_EQ(after.r10, expected.r10, "r10"); + ASSERT_EQ(after.r11, expected.r11, "r11"); + ASSERT_EQ(after.rdi, expected.rdi, "rdi"); + ASSERT_EQ(after.rsi, expected.rsi, "rsi"); + +cleanup: + uprobe_multi__destroy(skel); +} + +static void test_unique(void) +{ + if (test__start_subtest("unique_regs_common")) + unique_regs_common(); +} +#else +static void test_unique(void) { } +#endif + void test_uprobe_multi_test(void) { if (test__start_subtest("skel_api")) @@ -1372,5 +1478,6 @@ void test_uprobe_multi_test(void) test_session_cookie_skel_api(); if (test__start_subtest("session_cookie_recursive")) test_session_recursive_skel_api(); + test_unique(); RUN_TESTS(uprobe_multi_verifier); } diff --git a/tools/testing/selftests/bpf/progs/uprobe_multi.c b/tools/testi= ng/selftests/bpf/progs/uprobe_multi.c index 44190efcdba2..f26f8b840985 100644 --- a/tools/testing/selftests/bpf/progs/uprobe_multi.c +++ b/tools/testing/selftests/bpf/progs/uprobe_multi.c @@ -141,3 +141,27 @@ int usdt_extra(struct pt_regs *ctx) /* we need this one just to mix PID-filtered and global USDT probes */ return 0; } + +#if defined(__TARGET_ARCH_x86) +struct pt_regs regs; + +SEC("uprobe.unique") +int BPF_UPROBE(uprobe_change_regs) +{ + pid_t cur_pid =3D bpf_get_current_pid_tgid() >> 32; + + if (cur_pid !=3D pid) + return 0; + + ctx->ax =3D regs.ax; + ctx->cx =3D regs.cx; + ctx->dx =3D regs.dx; + ctx->r8 =3D regs.r8; + ctx->r9 =3D regs.r9; + ctx->r10 =3D regs.r10; + ctx->r11 =3D regs.r11; + ctx->di =3D regs.di; + ctx->si =3D regs.si; + return 0; +} +#endif --=20 2.51.0 From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 316DA32ED34; Tue, 2 Sep 2025 14:36:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823813; cv=none; b=B1hSgCvhwkwRdA9wSDP2f/eqDJyekUEtxnxhaVxBnpVqEEKd6zUj1uY9D5XLEbPqe52cE6Q4Oty/C4pPcNEjiW3KFI5CIn/szr6kI/30Scewm1GxKzHkJ2nhLHwWFtKDfCfIfxPz0IOgKN3kieXhe/tCFBa2e2dE6o/GhI/3MAE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823813; c=relaxed/simple; bh=+Fy5/n5q5O6S2Jq0jxYE4pCKd/S3K2EoH3z8PsCyozo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jdlZVvkqCylt1MN7Zp8G75wKMWgv/LiTp69QCvr9MfO09wH4D3N9anF0hfymDx0Elv62XjT+WrB8/EpoGXHAxsfqlcCEoszksFcj3x1IDQWMZyoFS01UtvvE6soPyO6BU95b9WIOPCk4FLNwulAAYPKhL4WQYMTjd73cHtJI4Jk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HlP9p4MB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HlP9p4MB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4CDEEC4CEF6; Tue, 2 Sep 2025 14:36:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823812; bh=+Fy5/n5q5O6S2Jq0jxYE4pCKd/S3K2EoH3z8PsCyozo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HlP9p4MBPA2f0AcAshbsjPmV0TtniAo9YQd7e7qhJawNPHMDb3mbhR+kRo5AjfVob L3Z7fvB5rqpI5i7ZpweK5RV6ohS0bJ/KqjIjDKFG0LPRFkA/2vZHRcL1+TVbhDAroG JmUMI2Gzvgp7ztWS//JSYDwXtEHs2h5Rtv1qSABceZL57yhe31T5nceHNMToYLku4z fEF0l1/PYPIKfnjT63RXkSkEw2D8Qllt8bDLbypMkewkM3bsKBEEsrs7SkEiC8c9IO isEUjA5vCfx7in0zi6XfTslCbD9m7hOSMqraUtFgFKTqNf8Ram5GRxvICrrogRJv5w 11HsK+MGGRICg== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 09/11] selftests/bpf: Add uprobe multi context ip register change test Date: Tue, 2 Sep 2025 16:35:02 +0200 Message-ID: <20250902143504.1224726-10-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Adding test to check we can change the application execution through instruction pointer change through uprobe program. It's x86_64 specific test. Signed-off-by: Jiri Olsa --- .../bpf/prog_tests/uprobe_multi_test.c | 42 +++++++++++++++++++ .../selftests/bpf/progs/uprobe_multi.c | 14 +++++++ 2 files changed, 56 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c b/t= ools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c index 012652b07399..4630a6c65c3c 100644 --- a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c +++ b/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c @@ -1437,10 +1437,52 @@ static void unique_regs_common(void) uprobe_multi__destroy(skel); } =20 +noinline static unsigned long uprobe_regs_change_ip_1(void) +{ + return 0xc0ffee; +} + +noinline static unsigned long uprobe_regs_change_ip_2(void) +{ + return 0xdeadbeef; +} + +static void unique_regs_ip(void) +{ + LIBBPF_OPTS(bpf_uprobe_multi_opts, opts, + .unique =3D true, + ); + struct uprobe_multi *skel; + int ret; + + skel =3D uprobe_multi__open_and_load(); + if (!ASSERT_OK_PTR(skel, "skel_open")) + return; + + skel->bss->pid =3D getpid(); + skel->bss->ip =3D (unsigned long) uprobe_regs_change_ip_2; + + skel->links.uprobe_change_ip =3D bpf_program__attach_uprobe_multi( + skel->progs.uprobe_change_ip, + -1, "/proc/self/exe", + "uprobe_regs_change_ip_1", + &opts); + if (!ASSERT_OK_PTR(skel->links.uprobe_change_ip, "bpf_program__attach_upr= obe_multi")) + goto cleanup; + + ret =3D uprobe_regs_change_ip_1(); + ASSERT_EQ(ret, 0xdeadbeef, "ret"); + +cleanup: + uprobe_multi__destroy(skel); +} + static void test_unique(void) { if (test__start_subtest("unique_regs_common")) unique_regs_common(); + if (test__start_subtest("unique_regs_ip")) + unique_regs_ip(); } #else static void test_unique(void) { } diff --git a/tools/testing/selftests/bpf/progs/uprobe_multi.c b/tools/testi= ng/selftests/bpf/progs/uprobe_multi.c index f26f8b840985..563fd37ed77d 100644 --- a/tools/testing/selftests/bpf/progs/uprobe_multi.c +++ b/tools/testing/selftests/bpf/progs/uprobe_multi.c @@ -164,4 +164,18 @@ int BPF_UPROBE(uprobe_change_regs) ctx->si =3D regs.si; return 0; } + +unsigned long ip; + +SEC("uprobe.unique") +int BPF_UPROBE(uprobe_change_ip) +{ + pid_t cur_pid =3D bpf_get_current_pid_tgid() >> 32; + + if (cur_pid !=3D pid) + return 0; + + ctx->ip =3D ip; + return 0; +} #endif --=20 2.51.0 From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 AA42731AF2A; Tue, 2 Sep 2025 14:37:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823823; cv=none; b=dAmivKeMKx/UaT1X0PpazvXoRDDPb7e725824QH4ZOUBGjDIzm0NX/uDTAi4b37vyKJSdNMIWqlYMuL7YqN9pX/L5i9+ybSEpcWuXOv8V6wMx68IJBlU5VB6ImtJ37qaDxdF5fL1TQ8Nukl1aYN1bOGVLjkPvo3UVzpfw1zBsZc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823823; c=relaxed/simple; bh=U58L1T99uUbwn0HcZc+ldzOCdS/KBLvjySrspupL31s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YtTlXLNzHeAwSB1z7aruJuE6fMxQy0BqjIWg1RUOQ+THA7ErKXo/uMqW2VC0Bq5/9/XHPT8ddZyTohVt49+60ouS2djyR07HF2q043X5xxDif50eui6L77X8r6/bHQjtXjsrdh0q4gnINKjxhisJppMoE7hN1374l6m0QtMbm2s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bK9dtusF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bK9dtusF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB92DC4CEF5; Tue, 2 Sep 2025 14:36:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823823; bh=U58L1T99uUbwn0HcZc+ldzOCdS/KBLvjySrspupL31s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bK9dtusFypGXWOXcTKV4gb1oKv2meDiM+gwmZheGuwQCUB50ixKxtTaEgDzy7bn59 Tkh7mQCNj3KJz3jivETh4i5I749p49B5g+bjaZjPh3a5+DdjpLEwDrKl1lk4j6ZCkH Q+KAFAM76PW/egl3y1Xpjxw6U49dxCX+nrxHcFIc5zLS5SFyMC5a3gfN4JIRxZdGw/ pZYFCwPC2e4FwO1Xr2I1cwSnhWpOiD1reDeWf9Drx7AUWThfOErwkHZ4vfDhPjYOS2 BfHPt7OvbKgIubZ30T2uUyb5gZHoaJ3RSboAUmcuc3FHnqI1UTbTyXDz1wLx1w3bYj 1kK8jSxx9vWOg== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 10/11] selftests/bpf: Add uprobe multi unique attach test Date: Tue, 2 Sep 2025 16:35:03 +0200 Message-ID: <20250902143504.1224726-11-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Adding test to check the unique uprobe attchment together with not-unique uprobe on top of uprobe_multi link. Signed-off-by: Jiri Olsa --- .../bpf/prog_tests/uprobe_multi_test.c | 99 +++++++++++++++++++ .../selftests/bpf/progs/uprobe_multi_unique.c | 34 +++++++ 2 files changed, 133 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/uprobe_multi_unique.c diff --git a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c b/t= ools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c index 4630a6c65c3c..1043bc4387e8 100644 --- a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c +++ b/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c @@ -14,6 +14,7 @@ #include "uprobe_multi_session_cookie.skel.h" #include "uprobe_multi_session_recursive.skel.h" #include "uprobe_multi_verifier.skel.h" +#include "uprobe_multi_unique.skel.h" #include "bpf/libbpf_internal.h" #include "testing_helpers.h" #include "../sdt.h" @@ -1477,12 +1478,110 @@ static void unique_regs_ip(void) uprobe_multi__destroy(skel); } =20 +static void unique_attach(void) +{ + LIBBPF_OPTS(bpf_uprobe_multi_opts, opts, + .unique =3D true, + ); + struct bpf_link *link_1, *link_2 =3D NULL; + struct bpf_program *prog_1, *prog_2; + struct uprobe_multi_unique *skel; + + skel =3D uprobe_multi_unique__open_and_load(); + if (!ASSERT_OK_PTR(skel, "uprobe_multi_unique__open_and_load")) + return; + + skel->bss->my_pid =3D getpid(); + + prog_1 =3D skel->progs.test1; + prog_2 =3D skel->progs.test2; + + /* not-unique and unique */ + link_1 =3D bpf_program__attach_uprobe_multi(prog_1, -1, "/proc/self/exe", + "uprobe_multi_func_1", + NULL); + if (!ASSERT_OK_PTR(link_1, "bpf_program__attach_uprobe_multi")) + goto cleanup; + + link_2 =3D bpf_program__attach_uprobe_multi(prog_2, -1, "/proc/self/exe", + "uprobe_multi_func_1", + &opts); + if (!ASSERT_ERR_PTR(link_2, "bpf_program__attach_uprobe_multi")) { + bpf_link__destroy(link_2); + goto cleanup; + } + + bpf_link__destroy(link_1); + + /* unique and unique */ + link_1 =3D bpf_program__attach_uprobe_multi(prog_1, -1, "/proc/self/exe", + "uprobe_multi_func_1", + &opts); + if (!ASSERT_OK_PTR(link_1, "bpf_program__attach_uprobe_multi")) + goto cleanup; + + link_2 =3D bpf_program__attach_uprobe_multi(prog_2, -1, "/proc/self/exe", + "uprobe_multi_func_1", + &opts); + if (!ASSERT_ERR_PTR(link_2, "bpf_program__attach_uprobe_multi")) { + bpf_link__destroy(link_2); + goto cleanup; + } + + bpf_link__destroy(link_1); + + /* unique and not-unique */ + link_1 =3D bpf_program__attach_uprobe_multi(prog_1, -1, "/proc/self/exe", + "uprobe_multi_func_1", + &opts); + if (!ASSERT_OK_PTR(link_1, "bpf_program__attach_uprobe_multi")) + goto cleanup; + + link_2 =3D bpf_program__attach_uprobe_multi(prog_2, -1, "/proc/self/exe", + "uprobe_multi_func_1", + NULL); + if (!ASSERT_ERR_PTR(link_2, "bpf_program__attach_uprobe_multi")) { + bpf_link__destroy(link_2); + goto cleanup; + } + + bpf_link__destroy(link_1); + + /* not-unique and not-unique */ + link_1 =3D bpf_program__attach_uprobe_multi(prog_1, -1, "/proc/self/exe", + "uprobe_multi_func_1", + NULL); + if (!ASSERT_OK_PTR(link_1, "bpf_program__attach_uprobe_multi")) + goto cleanup; + + link_2 =3D bpf_program__attach_uprobe_multi(prog_2, -1, "/proc/self/exe", + "uprobe_multi_func_1", + NULL); + if (!ASSERT_OK_PTR(link_2, "bpf_program__attach_uprobe_multi")) { + bpf_link__destroy(link_1); + goto cleanup; + } + + uprobe_multi_func_1(); + + ASSERT_EQ(skel->bss->test1_result, 1, "test1_result"); + ASSERT_EQ(skel->bss->test2_result, 1, "test2_result"); + + bpf_link__destroy(link_1); + bpf_link__destroy(link_2); + +cleanup: + uprobe_multi_unique__destroy(skel); +} + static void test_unique(void) { if (test__start_subtest("unique_regs_common")) unique_regs_common(); if (test__start_subtest("unique_regs_ip")) unique_regs_ip(); + if (test__start_subtest("unique_attach")) + unique_attach(); } #else static void test_unique(void) { } diff --git a/tools/testing/selftests/bpf/progs/uprobe_multi_unique.c b/tool= s/testing/selftests/bpf/progs/uprobe_multi_unique.c new file mode 100644 index 000000000000..e31e17bd85ea --- /dev/null +++ b/tools/testing/selftests/bpf/progs/uprobe_multi_unique.c @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "vmlinux.h" +#include +#include + +pid_t my_pid =3D 0; + +int test1_result =3D 0; +int test2_result =3D 0; + +SEC("uprobe.multi") +int BPF_UPROBE(test1) +{ + pid_t pid =3D bpf_get_current_pid_tgid() >> 32; + + if (pid !=3D my_pid) + return 0; + + test1_result =3D 1; + return 0; +} + +SEC("uprobe.multi") +int BPF_UPROBE(test2) +{ + pid_t pid =3D bpf_get_current_pid_tgid() >> 32; + + if (pid !=3D my_pid) + return 0; + + test2_result =3D 1; + return 0; +} --=20 2.51.0 From nobody Fri Oct 3 10:11:25 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 DCB253002BB; Tue, 2 Sep 2025 14:37:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823837; cv=none; b=D0bA9PmBL8dUgl5hyQjC1dKY06H2pXOI0X/+1Qa4pvvQ8eJ2yim3xBcNbDfizHwgIUVgLaOV4LvJCieH0ClW3IYXtI1UpjX9wbK6W9xQtJz3QfalPiRe3bkn8UZ0pCYe5vDQVy2znIPzpwJ1hMvZrYxMWBPHFASOCFXlyW8ZKA4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756823837; c=relaxed/simple; bh=U92VCsC0ZBHxBm+P1kswlbRRmd+LYWTcaMx17qX9d1A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EsnIGIvAWq0jFFVz35G9sx/RDRS/QZxtY82eHXI0lMOIMOCGCpBu+EBxcBzK2GqncMFwd7wzlnenkuUBhV7vKBN1iOHT0Tvh5U5HCPnnoceMWubYCQIdBrqlmL0qRHqZaBm95onZZvCXB96ssK0o7r+OxZi3iEz+aGa4cHgTBJ0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=pA+33WIy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="pA+33WIy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E1642C4CEED; Tue, 2 Sep 2025 14:37:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756823834; bh=U92VCsC0ZBHxBm+P1kswlbRRmd+LYWTcaMx17qX9d1A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pA+33WIyaP0wcH/pODyKD6UBB0ixOMFAJA5p0Cohwck6HWtiRd2gXr4lcAxKArUqR sQEDl+xRGD7nT1HDjhL02fJJvQbTS/O9YaVVr3N9BaWa/CLjqekwqJw3+QUUG32M3y BgpYmXoIIPtmME4yrpZmsqiu03ki79URy94Lo+1xn9+/VOpIzCfF26l+OeYWSbqn/x knqJ62ZuA7ElPUH2yYOsg1kQB7VDVw36JQayfEDWDKhn235TVhn64QY5csSJeVJw15 694W8y2xkGzPD5jC12y3ZACTW6SOCrviqs6VESuFD5NP0+EvKv2LzraPqhKORD1/DQ AN/k+POHHrwQA== From: Jiri Olsa To: Oleg Nesterov , Masami Hiramatsu , Peter Zijlstra , Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, x86@kernel.org, Song Liu , Yonghong Song , John Fastabend , Hao Luo , Steven Rostedt , Ingo Molnar Subject: [PATCH perf/core 11/11] selftests/bpf: Add uprobe unique attach test Date: Tue, 2 Sep 2025 16:35:04 +0200 Message-ID: <20250902143504.1224726-12-jolsa@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250902143504.1224726-1-jolsa@kernel.org> References: <20250902143504.1224726-1-jolsa@kernel.org> 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 Content-Type: text/plain; charset="utf-8" Adding test to check the unique uprobe attchment together with not-unique uprobe on top perf uprobe pmu. Signed-off-by: Jiri Olsa --- .../testing/selftests/bpf/prog_tests/uprobe.c | 111 +++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/bpf/prog_tests/uprobe.c b/tools/testin= g/selftests/bpf/prog_tests/uprobe.c index cf3e0e7a64fa..4e1be03d863d 100644 --- a/tools/testing/selftests/bpf/prog_tests/uprobe.c +++ b/tools/testing/selftests/bpf/prog_tests/uprobe.c @@ -33,7 +33,7 @@ static int urand_trigger(FILE **urand_pipe) return exit_code; } =20 -void test_uprobe(void) +static void test_uprobe_urandlib(void) { LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); struct test_uprobe *skel; @@ -93,3 +93,112 @@ void test_uprobe(void) pclose(urand_pipe); test_uprobe__destroy(skel); } + +static noinline void uprobe_unique_trigger(void) +{ + asm volatile (""); +} + +static void test_uprobe_unique(void) +{ + LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts, + .func_name =3D "uprobe_unique_trigger", + ); + struct bpf_link *link_1, *link_2 =3D NULL; + struct bpf_program *prog_1, *prog_2; + struct test_uprobe *skel; + + skel =3D test_uprobe__open_and_load(); + if (!ASSERT_OK_PTR(skel, "test_uprobe__open_and_load")) + return; + + skel->bss->my_pid =3D getpid(); + + prog_1 =3D skel->progs.test1; + prog_2 =3D skel->progs.test2; + + /* not-unique and unique */ + uprobe_opts.unique =3D false; + link_1 =3D bpf_program__attach_uprobe_opts(prog_1, -1, "/proc/self/exe", + 0 /* offset */, &uprobe_opts); + if (!ASSERT_OK_PTR(link_1, "bpf_program__attach_uprobe_opts_1")) + goto cleanup; + + uprobe_opts.unique =3D true; + link_2 =3D bpf_program__attach_uprobe_opts(prog_2, -1, "/proc/self/exe", + 0 /* offset */, &uprobe_opts); + if (!ASSERT_ERR_PTR(link_2, "bpf_program__attach_uprobe_opts_2")) { + bpf_link__destroy(link_2); + goto cleanup; + } + + bpf_link__destroy(link_1); + + /* unique and unique */ + uprobe_opts.unique =3D true; + link_1 =3D bpf_program__attach_uprobe_opts(prog_1, -1, "/proc/self/exe", + 0 /* offset */, &uprobe_opts); + if (!ASSERT_OK_PTR(link_1, "bpf_program__attach_uprobe_opts_1")) + goto cleanup; + + uprobe_opts.unique =3D true; + link_2 =3D bpf_program__attach_uprobe_opts(prog_2, -1, "/proc/self/exe", + 0 /* offset */, &uprobe_opts); + if (!ASSERT_ERR_PTR(link_2, "bpf_program__attach_uprobe_opts_2")) { + bpf_link__destroy(link_2); + goto cleanup; + } + + bpf_link__destroy(link_1); + + /* unique and not-unique */ + uprobe_opts.unique =3D true; + link_1 =3D bpf_program__attach_uprobe_opts(prog_1, -1, "/proc/self/exe", + 0 /* offset */, &uprobe_opts); + if (!ASSERT_OK_PTR(link_1, "bpf_program__attach_uprobe_opts_1")) + goto cleanup; + + uprobe_opts.unique =3D false; + link_2 =3D bpf_program__attach_uprobe_opts(prog_2, -1, "/proc/self/exe", + 0 /* offset */, &uprobe_opts); + if (!ASSERT_ERR_PTR(link_2, "bpf_program__attach_uprobe_opts_2")) { + bpf_link__destroy(link_2); + goto cleanup; + } + + bpf_link__destroy(link_1); + + /* not-unique and not-unique */ + uprobe_opts.unique =3D false; + link_1 =3D bpf_program__attach_uprobe_opts(prog_1, -1, "/proc/self/exe", + 0 /* offset */, &uprobe_opts); + if (!ASSERT_OK_PTR(link_1, "bpf_program__attach_uprobe_opts_1")) + goto cleanup; + + uprobe_opts.unique =3D false; + link_2 =3D bpf_program__attach_uprobe_opts(prog_2, -1, "/proc/self/exe", + 0 /* offset */, &uprobe_opts); + if (!ASSERT_OK_PTR(link_2, "bpf_program__attach_uprobe_opts_2")) { + bpf_link__destroy(link_1); + goto cleanup; + } + + uprobe_unique_trigger(); + + ASSERT_EQ(skel->bss->test1_result, 1, "test1_result"); + ASSERT_EQ(skel->bss->test2_result, 1, "test2_result"); + + bpf_link__destroy(link_1); + bpf_link__destroy(link_2); + +cleanup: + test_uprobe__destroy(skel); +} + +void test_uprobe(void) +{ + if (test__start_subtest("urandlib")) + test_uprobe_urandlib(); + if (test__start_subtest("unique")) + test_uprobe_unique(); +} --=20 2.51.0