From nobody Fri Apr 3 11:10:07 2026 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 4870D33EAE7; Fri, 20 Feb 2026 10:42:46 +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=1771584166; cv=none; b=lG8QDEjOK9eUBaNSsfXJIZVgAAFhbhY6TPXLNQzd6yTtKGV1tvw4xgE70veLSWao/pE5SAuxHlN6s7joP8Cq5tEF/pqci0njRzNJf8Pw7uyhpUjTN/D0PIWJtEYxPcdkNWkMsaUBZCUcx6epG8HjYMuCsXkaM4CzWpljJ4b+PCM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771584166; c=relaxed/simple; bh=Gb3Elkny7jCdBeuIV/xdQ1NCvtvANwyTKBH0kHt03sI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Zo6nmvJzxwANe0UhXyx83GHKCl9xB57mGpwIMR9WQGIGo6ZxTSfcKoby6BP7obKaXOwrFSp7TxMzLqGnLEwb32PdfUFvFemBRrN7dFm147anwQYFU72bV4msbxdrkSLx68QIwZlOJCiBRr2C6TsZNdpOh6a1enr+/eOdQYKGLn4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Dk1qeQ5/; 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="Dk1qeQ5/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 31D69C19425; Fri, 20 Feb 2026 10:42:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771584166; bh=Gb3Elkny7jCdBeuIV/xdQ1NCvtvANwyTKBH0kHt03sI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Dk1qeQ5/4eQ3O+DdcMnGmE5YoRwd+9xkorx0l84GFIEdHW4MJDd1ozqAHk04lVxmT Z0SrswxWXbKxGS8lqVYkGLLad1HWANg6BPmrNbv6GcSkNvN9T1z/UUPQa6p3xRUSpg L2TD+lSNpPmH4ZfbqLYeBgkRJ3Cs7YoTd3hcjjsgT78BcR9pnb0jRRtkMTvFxR6vWK tq19+L/Jfk/bZ/fw4IHxZLezo2XgnIx3plLOw4LyP2ZaKXOFWI6jTEwV4xJBLWu58o 8OUxbr6EwgR9eKUuMjVILzP6fB2oMIP3248SkWS4OipOFfvwMEhz60Kgmu3rKWE12M 0tYUnd3vML5qg== From: Jiri Olsa To: Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, Song Liu , Yonghong Song , John Fastabend Subject: [PATCHv4 bpf-next 1/5] libbpf: Add uprobe syscall feature detection Date: Fri, 20 Feb 2026 11:42:16 +0100 Message-ID: <20260220104220.634154-2-jolsa@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260220104220.634154-1-jolsa@kernel.org> References: <20260220104220.634154-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 uprobe syscall feature detection that will be used in following changes. Signed-off-by: Jiri Olsa --- tools/lib/bpf/features.c | 24 ++++++++++++++++++++++++ tools/lib/bpf/libbpf_internal.h | 2 ++ 2 files changed, 26 insertions(+) diff --git a/tools/lib/bpf/features.c b/tools/lib/bpf/features.c index 2fa434f09cce..adcad221c601 100644 --- a/tools/lib/bpf/features.c +++ b/tools/lib/bpf/features.c @@ -568,6 +568,27 @@ static int probe_ldimm64_full_range_off(int token_fd) return 1; } =20 +#ifdef __x86_64__ + +#ifndef __NR_uprobe +#define __NR_uprobe 336 +#endif + +static int probe_uprobe_syscall(int token_fd) +{ + /* + * If kernel supports uprobe() syscall, it will return -ENXIO when called + * from the outside of a kernel-generated uprobe trampoline. + */ + return syscall(__NR_uprobe) < 0 && errno =3D=3D ENXIO; +} +#else +static int probe_uprobe_syscall(int token_fd) +{ + return 0; +} +#endif + typedef int (*feature_probe_fn)(int /* token_fd */); =20 static struct kern_feature_cache feature_cache; @@ -646,6 +667,9 @@ static struct kern_feature_desc { [FEAT_LDIMM64_FULL_RANGE_OFF] =3D { "full range LDIMM64 support", probe_ldimm64_full_range_off, }, + [FEAT_UPROBE_SYSCALL] =3D { + "kernel supports uprobe syscall", probe_uprobe_syscall, + }, }; =20 bool feat_supported(struct kern_feature_cache *cache, enum kern_feature_id= feat_id) diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_interna= l.h index 974147e8a8aa..4bcb6ca69bb1 100644 --- a/tools/lib/bpf/libbpf_internal.h +++ b/tools/lib/bpf/libbpf_internal.h @@ -394,6 +394,8 @@ enum kern_feature_id { FEAT_BTF_QMARK_DATASEC, /* Kernel supports LDIMM64 imm offsets past 512 MiB. */ FEAT_LDIMM64_FULL_RANGE_OFF, + /* Kernel supports uprobe syscall */ + FEAT_UPROBE_SYSCALL, __FEAT_CNT, }; =20 --=20 2.53.0 From nobody Fri Apr 3 11:10:07 2026 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 34F08337BAD; Fri, 20 Feb 2026 10:42:57 +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=1771584178; cv=none; b=KdQ2sP9+UsQg1F5m9uAVJ6uGJmoZJ8sXM4fJu6ziMLxGggDI3NwqZMN1MsC2HheMx6g3T2H+iDtrCU5AY/lOvfI/A11wGQw7dJ1bKHdq0JkBysFfqUKxzLYLH3Y+HPrj6FULr1sW7PkjsGZbTYvgI/t4G/eLsUPsirdYqdMLYXY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771584178; c=relaxed/simple; bh=T01UZTS7Rh6lX2vUBu1yk7ioVwV3kY+g3pgCsKy39j8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=n/P/wNKp3q6OEivEkoC5dH+RbdrFXmTTubsixyYXPx5dGOJ2q2RBwyDXC+9W2n5XWsIf6t530qO/RI529NQCgGxhwGDOzn8az+2DSdXXET6aA48dAup/5MaJGGLdKx57t6x7gvmdmQZqBBo8Fj/mq/Fj99Rr3qOxuuLwtE4W3lc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=q3w0d0bn; 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="q3w0d0bn" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C409AC116C6; Fri, 20 Feb 2026 10:42:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771584177; bh=T01UZTS7Rh6lX2vUBu1yk7ioVwV3kY+g3pgCsKy39j8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=q3w0d0bniDRWarDHw0EkOjBbnTNAoq1yDLjxHx6NB5v/mzdxN56W84SPeEDRqG935 UuaLpElMBVzESwXyu5Wjq0KfFd/c5uX8EcgXspe8i2lx3qnvaZcLlaN1PqY2LVLBJU xupqSfVgcDhZhuxChUl331NzWsowK5reomPjgln6iQhsZBxLwh2SXoVu5lKkfILXTa 8Zi25l1rbp+B4QJrD9TO+yorX8QtJPQnmPFldkEqR9dF1e1G2HCQUZYWGSQeIV1SXV oyYNXUUcp2zH0LfZo79FKzGjnDiP7mn8skZd4tG7PiYuWveDM8ht28qq7vjpcX2Z+W 4PVmDKbHSVXwg== From: Jiri Olsa To: Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, Song Liu , Yonghong Song , John Fastabend Subject: [PATCHv4 bpf-next 2/5] libbpf: Add support to detect nop,nop5 instructions combo for usdt probe Date: Fri, 20 Feb 2026 11:42:17 +0100 Message-ID: <20260220104220.634154-3-jolsa@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260220104220.634154-1-jolsa@kernel.org> References: <20260220104220.634154-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 detect nop,nop5 instructions combo for usdt probe by checking on probe's following nop5 instruction. When the nop,nop5 combo is detected together with uprobe syscall, we can place the probe on top of nop5 and get it optimized. Signed-off-by: Jiri Olsa --- tools/lib/bpf/usdt.c | 47 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/tools/lib/bpf/usdt.c b/tools/lib/bpf/usdt.c index d1524f6f54ae..c81e0a58caf5 100644 --- a/tools/lib/bpf/usdt.c +++ b/tools/lib/bpf/usdt.c @@ -262,6 +262,7 @@ struct usdt_manager { bool has_bpf_cookie; bool has_sema_refcnt; bool has_uprobe_multi; + bool has_uprobe_syscall; }; =20 struct usdt_manager *usdt_manager_new(struct bpf_object *obj) @@ -301,6 +302,13 @@ struct usdt_manager *usdt_manager_new(struct bpf_objec= t *obj) * usdt probes. */ man->has_uprobe_multi =3D kernel_supports(obj, FEAT_UPROBE_MULTI_LINK); + + /* + * Detect kernel support for uprobe() syscall, it's presence means we can + * take advantage of faster nop5 uprobe handling. + * Added in: 56101b69c919 ("uprobes/x86: Add uprobe syscall to speed up u= probe") + */ + man->has_uprobe_syscall =3D kernel_supports(obj, FEAT_UPROBE_SYSCALL); return man; } =20 @@ -585,13 +593,34 @@ static int parse_usdt_note(GElf_Nhdr *nhdr, const cha= r *data, size_t name_off, =20 static int parse_usdt_spec(struct usdt_spec *spec, const struct usdt_note = *note, __u64 usdt_cookie); =20 -static int collect_usdt_targets(struct usdt_manager *man, Elf *elf, const = char *path, pid_t pid, - const char *usdt_provider, const char *usdt_name, __u64 usdt_cookie, - struct usdt_target **out_targets, size_t *out_target_cnt) +#if defined(__x86_64__) +static bool has_nop_combo(int fd, long off) +{ + static unsigned char nop_combo[6] =3D { + 0x90, 0x0f, 0x1f, 0x44, 0x00, 0x00 /* nop,nop5 */ + }; + unsigned char buf[6] =3D {}; + + if (pread(fd, buf, 6, off) !=3D 6) + return false; + return memcmp(buf, nop_combo, 6) =3D=3D 0; +} +#else +static bool has_nop_combo(int fd, long off) +{ + return false; +} +#endif + +static int collect_usdt_targets(struct usdt_manager *man, struct elf_fd *e= lf_fd, const char *path, + pid_t pid, const char *usdt_provider, const char *usdt_name, + __u64 usdt_cookie, struct usdt_target **out_targets, + size_t *out_target_cnt) { size_t off, name_off, desc_off, seg_cnt =3D 0, vma_seg_cnt =3D 0, target_= cnt =3D 0; struct elf_seg *segs =3D NULL, *vma_segs =3D NULL; struct usdt_target *targets =3D NULL, *target; + Elf *elf =3D elf_fd->elf; long base_addr =3D 0; Elf_Scn *notes_scn, *base_scn; GElf_Shdr base_shdr, notes_shdr; @@ -784,6 +813,16 @@ static int collect_usdt_targets(struct usdt_manager *m= an, Elf *elf, const char * target =3D &targets[target_cnt]; memset(target, 0, sizeof(*target)); =20 + /* + * We have uprobe syscall and usdt with nop,nop5 instructions combo, + * so we can place the uprobe directly on nop5 (+1) and get this probe + * optimized. + */ + if (man->has_uprobe_syscall && has_nop_combo(elf_fd->fd, usdt_rel_ip)) { + usdt_abs_ip++; + usdt_rel_ip++; + } + target->abs_ip =3D usdt_abs_ip; target->rel_ip =3D usdt_rel_ip; target->sema_off =3D usdt_sema_off; @@ -998,7 +1037,7 @@ struct bpf_link *usdt_manager_attach_usdt(struct usdt_= manager *man, const struct /* discover USDT in given binary, optionally limiting * activations to a given PID, if pid > 0 */ - err =3D collect_usdt_targets(man, elf_fd.elf, path, pid, usdt_provider, u= sdt_name, + err =3D collect_usdt_targets(man, &elf_fd, path, pid, usdt_provider, usdt= _name, usdt_cookie, &targets, &target_cnt); if (err <=3D 0) { err =3D (err =3D=3D 0) ? -ENOENT : err; --=20 2.53.0 From nobody Fri Apr 3 11:10:07 2026 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 7C7F02D130C; Fri, 20 Feb 2026 10:43: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=1771584189; cv=none; b=lDqRoNVErGhCaUtpJVUFKK6VpdpeMEqOoUL8Nsvz17qCwBtMjr9KoGYMeJE+0TgbOWWSVz6eY/d9bhsfpW5jEKna1tLEzCOyPsYzPoK7zwBUvF8Hyk2FJeiHHLXAD1Wmj2NBCDpSAKuAiwQsypddiYfhtOD676j1wRdGCz9ecEU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771584189; c=relaxed/simple; bh=DQxx4sQpSRlmKFD8OqooGbohxZ8Wbb2yF5Xw1ruqRyM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dvZRigbvvI2JD8aWkNzDaaZB0QVHA2gIB8ZCDLf3hj/+gDx0/OrjpnQJ1mphlP5EZd2Bks+xYcG08jrsKrxn86gfWulR741oof7dx1w8lSpgad6aPDjIfqGY4eeOZiIpCKa7UiLZgeSg5RIZxtSWKP295FTIHZc4R9JctAWyDgw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=c17VmpJu; 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="c17VmpJu" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2749DC116C6; Fri, 20 Feb 2026 10:43:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771584189; bh=DQxx4sQpSRlmKFD8OqooGbohxZ8Wbb2yF5Xw1ruqRyM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=c17VmpJuz11GwbeiO26NDPg7IgheqQRKiXnsmr46h8QbVl6rPABErdqI7J1FOmlJY ww545R3gFhNIfiupFxard4MzIsvM7Bv9oEsdAa55ArP70sBK1i+WbCptSlW6opQsrH pn75GppporEs2rOnxiVvwa4LStcyG+66FiMDa8aWlksxkui0fkLkL4BN3oWG4Y2PRm vcmuZDzS4grwZMbqsbEmkB0ibZwQoRmmNQu0UWfywvFwM2iY42baijV9Z9kbgLQgZj NgPHn9vRaUMhP5C6kX+K/5t161LMnBkxFma+OMPPTkokw9MHvWupi8FedDD4RdS8IM rgALCdjOJJb9g== From: Jiri Olsa To: Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, Song Liu , Yonghong Song , John Fastabend Subject: [PATCHv4 bpf-next 3/5] selftests/bpf: Emit nop,nop5 instructions combo for x86_64 arch Date: Fri, 20 Feb 2026 11:42:18 +0100 Message-ID: <20260220104220.634154-4-jolsa@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260220104220.634154-1-jolsa@kernel.org> References: <20260220104220.634154-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" Syncing latest usdt.h change [1]. Now that we have nop5 optimization support in kernel, let's emit nop,nop5 for usdt probe. We leave it up to the library to use desirable nop instruction. [1] https://github.com/libbpf/usdt/commit/c9865d158984fb2b73e3cbbdcdfb4f583= ad36a73 Signed-off-by: Jiri Olsa --- tools/testing/selftests/bpf/usdt.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/testing/selftests/bpf/usdt.h b/tools/testing/selftests/b= pf/usdt.h index 549d1f774810..c71e21df38b3 100644 --- a/tools/testing/selftests/bpf/usdt.h +++ b/tools/testing/selftests/bpf/usdt.h @@ -312,6 +312,8 @@ struct usdt_sema { volatile unsigned short active; }; #ifndef USDT_NOP #if defined(__ia64__) || defined(__s390__) || defined(__s390x__) #define USDT_NOP nop 0 +#elif defined(__x86_64__) +#define USDT_NOP .byte 0x90, 0x0f, 0x1f, 0x44, 0x00,= 0x0 /* nop, nop5 */ #else #define USDT_NOP nop #endif --=20 2.53.0 From nobody Fri Apr 3 11:10:07 2026 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 14B1B3382DA; Fri, 20 Feb 2026 10:43: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=1771584201; cv=none; b=t65IqFp+XU2r3Jh5DOVDgdBtU+8E/xK+y3VEytu9DjdgVsMPTXr5flQXBpaS/tjqoVDlGepHpoJQVlldtn54AD3MMwYViuHO/mRzUeeuIhlInFndyDqUwrxMfbfzIMz2UAerBlTbrU1Tp2TomF5XYBJ+RiS22ndjzE7q82ktYzI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771584201; c=relaxed/simple; bh=aMVzuAIk1dN5DYG5umlxXnQpvAHaohfIb8cpPlQAlvo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UuDVNnoETnnGhxgTbHz2JewBve+/exzKmSOvatRipTlj6LdXsCJtennTvpVQotDP6ppSyIGUeLWTFxKHDeDGu+ik78ITkydSsKL7G/yldDaMRP/dUzGrnn7gWSJn4l32SXXPwpo1EgXXvM7NS3LbM7nE65hZJYQRvvq5hhDDpus= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hQ2Ms7Rt; 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="hQ2Ms7Rt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9D4D2C19425; Fri, 20 Feb 2026 10:43:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771584200; bh=aMVzuAIk1dN5DYG5umlxXnQpvAHaohfIb8cpPlQAlvo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hQ2Ms7RtbrdyAHxH9kKfPCLsv9014J1RfrQ+x4llH6rYKLX7qNYYe6/zvwYC08VWY Y0VuiBI1ZnkZ6bJwzMYMbU97svLuViHvNysW4XW5x0I5ttr2c/xg+xDccO1P/uc/Di j/rUsVV6Po2fZNC8RkyQnb82sOqtFr4Ut//PH0ou73/U7BEp6Xx09pl+ApF7FePn4j zPTaWV6UMNIAMhcrk2NQSBquiSPwVKlEYEx4IX9k6AX1P8tHo6ndqdsFbCn0QoQHW8 KISjhyi20mwlHFzRB3v+76xkfCg7myDDMw6mG4LBsKeOjtqGt7/fviCg/Z5ooiZoUd DPo2qQTUTOMDQ== From: Jiri Olsa To: Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, Song Liu , Yonghong Song , John Fastabend Subject: [PATCHv4 bpf-next 4/5] selftests/bpf: Add test for checking correct nop of optimized usdt Date: Fri, 20 Feb 2026 11:42:19 +0100 Message-ID: <20260220104220.634154-5-jolsa@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260220104220.634154-1-jolsa@kernel.org> References: <20260220104220.634154-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 that attaches bpf program on usdt probe in 2 scenarios; - attach program on top of usdt_1, which is single nop instruction, so the probe stays on nop instruction and is not optimized. - attach program on top of usdt_2 which is probe defined on top of nop,nop5 combo, so the probe is placed on top of nop5 and is optimized. Signed-off-by: Jiri Olsa --- tools/testing/selftests/bpf/.gitignore | 2 + tools/testing/selftests/bpf/Makefile | 3 +- tools/testing/selftests/bpf/prog_tests/usdt.c | 92 +++++++++++++++++++ tools/testing/selftests/bpf/progs/test_usdt.c | 12 +++ tools/testing/selftests/bpf/usdt_1.c | 18 ++++ tools/testing/selftests/bpf/usdt_2.c | 16 ++++ 6 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/bpf/usdt_1.c create mode 100644 tools/testing/selftests/bpf/usdt_2.c diff --git a/tools/testing/selftests/bpf/.gitignore b/tools/testing/selftes= ts/bpf/.gitignore index a3ea98211ea6..bfdc5518ecc8 100644 --- a/tools/testing/selftests/bpf/.gitignore +++ b/tools/testing/selftests/bpf/.gitignore @@ -47,3 +47,5 @@ verification_cert.h *.BTF *.BTF_ids *.BTF.base +usdt_1 +usdt_2 diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests= /bpf/Makefile index 6776158f1f3e..23857d17fc5b 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -749,7 +749,8 @@ TRUNNER_EXTRA_SOURCES :=3D test_progs.c \ $(VERIFY_SIG_HDR) \ flow_dissector_load.h \ ip_check_defrag_frags.h \ - bpftool_helpers.c + bpftool_helpers.c \ + usdt_1.c usdt_2.c TRUNNER_LIB_SOURCES :=3D find_bit.c TRUNNER_EXTRA_FILES :=3D $(OUTPUT)/urandom_read \ $(OUTPUT)/liburandom_read.so \ diff --git a/tools/testing/selftests/bpf/prog_tests/usdt.c b/tools/testing/= selftests/bpf/prog_tests/usdt.c index f4be5269fa90..69759b27794d 100644 --- a/tools/testing/selftests/bpf/prog_tests/usdt.c +++ b/tools/testing/selftests/bpf/prog_tests/usdt.c @@ -247,6 +247,96 @@ static void subtest_basic_usdt(bool optimized) #undef TRIGGER } =20 +#ifdef __x86_64__ +extern void usdt_1(void); +extern void usdt_2(void); + +static unsigned char nop1[1] =3D { 0x90 }; +static unsigned char nop1_nop5_combo[6] =3D { 0x90, 0x0f, 0x1f, 0x44, 0x00= , 0x00 }; + +static void *find_instr(void *fn, unsigned char *instr, size_t cnt) +{ + int i; + + for (i =3D 0; i < 10; i++) { + if (!memcmp(instr, fn + i, cnt)) + return fn + i; + } + return NULL; +} + +static void subtest_optimized_attach(void) +{ + struct test_usdt *skel; + __u8 *addr_1, *addr_2; + + /* usdt_1 USDT probe has single nop instruction */ + addr_1 =3D find_instr(usdt_1, nop1_nop5_combo, 6); + if (!ASSERT_NULL(addr_1, "usdt_1_find_nop1_nop5_combo")) + return; + + addr_1 =3D find_instr(usdt_1, nop1, 1); + if (!ASSERT_OK_PTR(addr_1, "usdt_1_find_nop1")) + return; + + /* usdt_2 USDT probe has nop,nop5 instructions combo */ + addr_2 =3D find_instr(usdt_2, nop1_nop5_combo, 6); + if (!ASSERT_OK_PTR(addr_2, "usdt_2_find_nop1_nop5_combo")) + return; + + skel =3D test_usdt__open_and_load(); + if (!ASSERT_OK_PTR(skel, "test_usdt__open_and_load")) + return; + + skel->bss->expected_ip =3D (unsigned long) addr_1; + + /* + * Attach program on top of usdt_1 which is single nop probe, + * so the probe won't get optimized. + */ + skel->links.usdt_executed =3D bpf_program__attach_usdt(skel->progs.usdt_e= xecuted, + 0 /*self*/, "/proc/self/exe", + "optimized_attach", "usdt_1", NULL); + if (!ASSERT_OK_PTR(skel->links.usdt_executed, "bpf_program__attach_usdt")) + goto cleanup; + + usdt_1(); + usdt_1(); + + /* int3 is on addr_1 address */ + ASSERT_EQ(*addr_1, 0xcc, "int3"); + ASSERT_EQ(skel->bss->executed, 2, "executed"); + + bpf_link__destroy(skel->links.usdt_executed); + + /* we expect the nop5 ip */ + skel->bss->expected_ip =3D (unsigned long) addr_2 + 1; + + /* + * Attach program on top of usdt_2 which is probe defined on top + * of nop1,nop5 combo, so the probe gets optimized on top of nop5. + */ + skel->links.usdt_executed =3D bpf_program__attach_usdt(skel->progs.usdt_e= xecuted, + 0 /*self*/, "/proc/self/exe", + "optimized_attach", "usdt_2", NULL); + if (!ASSERT_OK_PTR(skel->links.usdt_executed, "bpf_program__attach_usdt")) + goto cleanup; + + usdt_2(); + usdt_2(); + + /* nop stays on addr_2 address */ + ASSERT_EQ(*addr_2, 0x90, "nop"); + + /* call is on addr_2 + 1 address */ + ASSERT_EQ(*(addr_2 + 1), 0xe8, "call"); + ASSERT_EQ(skel->bss->executed, 4, "executed"); + +cleanup: + test_usdt__destroy(skel); +} +#endif + unsigned short test_usdt_100_semaphore SEC(".probes"); unsigned short test_usdt_300_semaphore SEC(".probes"); unsigned short test_usdt_400_semaphore SEC(".probes"); @@ -516,6 +606,8 @@ void test_usdt(void) #ifdef __x86_64__ if (test__start_subtest("basic_optimized")) subtest_basic_usdt(true); + if (test__start_subtest("optimized_attach")) + subtest_optimized_attach(); #endif if (test__start_subtest("multispec")) subtest_multispec_usdt(); diff --git a/tools/testing/selftests/bpf/progs/test_usdt.c b/tools/testing/= selftests/bpf/progs/test_usdt.c index a78c87537b07..f00cb52874e0 100644 --- a/tools/testing/selftests/bpf/progs/test_usdt.c +++ b/tools/testing/selftests/bpf/progs/test_usdt.c @@ -138,4 +138,16 @@ int usdt_sib(struct pt_regs *ctx) return 0; } =20 +#ifdef __TARGET_ARCH_x86 +int executed; +unsigned long expected_ip; + +SEC("usdt") +int usdt_executed(struct pt_regs *ctx) +{ + if (expected_ip =3D=3D ctx->ip) + executed++; + return 0; +} +#endif char _license[] SEC("license") =3D "GPL"; diff --git a/tools/testing/selftests/bpf/usdt_1.c b/tools/testing/selftests= /bpf/usdt_1.c new file mode 100644 index 000000000000..4f06e8bcf58b --- /dev/null +++ b/tools/testing/selftests/bpf/usdt_1.c @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0 + +#if defined(__x86_64__) + +/* + * Include usdt.h with defined USDT_NOP macro to use single + * nop instruction. + */ +#define USDT_NOP .byte 0x90 +#include "usdt.h" + +__attribute__((aligned(16))) +void usdt_1(void) +{ + USDT(optimized_attach, usdt_1); +} + +#endif diff --git a/tools/testing/selftests/bpf/usdt_2.c b/tools/testing/selftests= /bpf/usdt_2.c new file mode 100644 index 000000000000..789883aaca4c --- /dev/null +++ b/tools/testing/selftests/bpf/usdt_2.c @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-2.0 + +#if defined(__x86_64__) + +/* + * Include usdt.h with default nop,nop5 instructions combo. + */ +#include "usdt.h" + +__attribute__((aligned(16))) +void usdt_2(void) +{ + USDT(optimized_attach, usdt_2); +} + +#endif --=20 2.53.0 From nobody Fri Apr 3 11:10:07 2026 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 7AAB733E363; Fri, 20 Feb 2026 10:43:32 +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=1771584212; cv=none; b=exPKLo/zlFqkxoftx5RX5hkSt4AhZjXbYm4z7JIvRk41b9UCyL5KSRZuGpezcAufvO3IBuIzgpwZNaVUvejluZ3XleNmBdmUITP1uC1S1elVC3RrQwQzdt8QPt4IgV+MO02SqqfRHeK2lVEmp71yCUmSu225lpytRoTkj90cAfY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771584212; c=relaxed/simple; bh=F+27PLKRsMR9oBOYaHEH2ngLd8FV0hMP80Zyg/41MHs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ot2uWGxQ6sNBgwuYCfQ66it+y+SBpjJ1SJ37zvlD7qbszzD2aoybPc3rGqxz+9ia2YKhiPBk81vAvYB2E18DaXi8aGWWFGsrlS7wtRjqPr/tSkH7sZlno97LAcMYIQNYXnmMAWKte5yykz4S3DDWpOVPTGQhdykn9d59Z4ndSHA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uhQ4xRpV; 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="uhQ4xRpV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0CB82C116C6; Fri, 20 Feb 2026 10:43:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771584212; bh=F+27PLKRsMR9oBOYaHEH2ngLd8FV0hMP80Zyg/41MHs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uhQ4xRpVUcQdy2uwh67rw2Hpbru1mtwwzhLmkyOVuBT2xOi8F1u4OrHRZh2op0Lut 00H9JnEXx7Ky2Yd6XuQtgqjOA4UHYC79GddrybufA8PnP4mJDIZzisfTJ/aZeHNEFD kvKzZ5NnySxFUR5PwZzBzmWIBr2m/yA5TFqU7GGTeT9NrdU/XelhGn7gYZ6WLvk+qu jHnaLU9mw9BSbba4Z1jx5tkVuMpsHdQxcqOwZOJ9A2BGUgOV0h2pmwmlT8j4WuVon2 khzIIN6ReXVYr0AuweLGa9IHYFA4q6BKOtTNMhZubGfE44O4CE2ihKkgY/zh3YRK8G y42d5GKbehZrA== From: Jiri Olsa To: Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, Song Liu , Yonghong Song , John Fastabend Subject: [PATCHv4 bpf-next 5/5] selftests/bpf: Add usdt trigger bench Date: Fri, 20 Feb 2026 11:42:20 +0100 Message-ID: <20260220104220.634154-6-jolsa@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260220104220.634154-1-jolsa@kernel.org> References: <20260220104220.634154-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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Adding usdt trigger bench for usdt: trig-usdt-nop - usdt on top of nop1 instruction trig-usdt-nop5 - usdt on top of nop1/nop5 combo Adding it to benchs/run_bench_uprobes.sh script. Example run on x86_64 kernel with uprobe syscall: # ./benchs/run_bench_uprobes.sh usermode-count : 152.507 =C2=B1 0.098M/s syscall-count : 14.309 =C2=B1 0.093M/s uprobe-nop : 3.190 =C2=B1 0.012M/s uprobe-push : 3.057 =C2=B1 0.004M/s uprobe-ret : 1.095 =C2=B1 0.009M/s uprobe-nop5 : 7.305 =C2=B1 0.034M/s uretprobe-nop : 2.175 =C2=B1 0.005M/s uretprobe-push : 2.109 =C2=B1 0.003M/s uretprobe-ret : 0.945 =C2=B1 0.002M/s uretprobe-nop5 : 3.530 =C2=B1 0.006M/s usdt-nop : 3.235 =C2=B1 0.008M/s <-- added usdt-nop5 : 7.511 =C2=B1 0.045M/s <-- added Signed-off-by: Jiri Olsa --- tools/testing/selftests/bpf/Makefile | 2 + tools/testing/selftests/bpf/bench.c | 4 ++ .../selftests/bpf/benchs/bench_trigger.c | 60 +++++++++++++++++++ .../selftests/bpf/benchs/run_bench_uprobes.sh | 2 +- .../selftests/bpf/progs/trigger_bench.c | 10 +++- 5 files changed, 76 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests= /bpf/Makefile index 23857d17fc5b..8196128251d5 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -874,6 +874,8 @@ $(OUTPUT)/bench: $(OUTPUT)/bench.o \ $(OUTPUT)/bench_bpf_crypto.o \ $(OUTPUT)/bench_sockmap.o \ $(OUTPUT)/bench_lpm_trie_map.o \ + $(OUTPUT)/usdt_1.o \ + $(OUTPUT)/usdt_2.o \ # $(call msg,BINARY,,$@) $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@ diff --git a/tools/testing/selftests/bpf/bench.c b/tools/testing/selftests/= bpf/bench.c index 8368bd3a0665..029b3e21f438 100644 --- a/tools/testing/selftests/bpf/bench.c +++ b/tools/testing/selftests/bpf/bench.c @@ -541,6 +541,8 @@ extern const struct bench bench_trig_uprobe_nop5; extern const struct bench bench_trig_uretprobe_nop5; extern const struct bench bench_trig_uprobe_multi_nop5; extern const struct bench bench_trig_uretprobe_multi_nop5; +extern const struct bench bench_trig_usdt_nop; +extern const struct bench bench_trig_usdt_nop5; #endif =20 extern const struct bench bench_rb_libbpf; @@ -617,6 +619,8 @@ static const struct bench *benchs[] =3D { &bench_trig_uretprobe_nop5, &bench_trig_uprobe_multi_nop5, &bench_trig_uretprobe_multi_nop5, + &bench_trig_usdt_nop, + &bench_trig_usdt_nop5, #endif /* ringbuf/perfbuf benchmarks */ &bench_rb_libbpf, diff --git a/tools/testing/selftests/bpf/benchs/bench_trigger.c b/tools/tes= ting/selftests/bpf/benchs/bench_trigger.c index aeec9edd3851..2ee6a2df2c26 100644 --- a/tools/testing/selftests/bpf/benchs/bench_trigger.c +++ b/tools/testing/selftests/bpf/benchs/bench_trigger.c @@ -405,6 +405,23 @@ static void *uprobe_producer_nop5(void *input) uprobe_target_nop5(); return NULL; } + +void usdt_1(void); +void usdt_2(void); + +static void *uprobe_producer_usdt_nop(void *input) +{ + while (true) + usdt_1(); + return NULL; +} + +static void *uprobe_producer_usdt_nop5(void *input) +{ + while (true) + usdt_2(); + return NULL; +} #endif =20 static void usetup(bool use_retprobe, bool use_multi, void *target_addr) @@ -542,6 +559,47 @@ static void uretprobe_multi_nop5_setup(void) { usetup(true, true /* use_multi */, &uprobe_target_nop5); } + +static void usdt_setup(const char *name) +{ + struct bpf_link *link; + int err; + + setup_libbpf(); + + ctx.skel =3D trigger_bench__open(); + if (!ctx.skel) { + fprintf(stderr, "failed to open skeleton\n"); + exit(1); + } + + bpf_program__set_autoload(ctx.skel->progs.bench_trigger_usdt, true); + + err =3D trigger_bench__load(ctx.skel); + if (err) { + fprintf(stderr, "failed to load skeleton\n"); + exit(1); + } + + link =3D bpf_program__attach_usdt(ctx.skel->progs.bench_trigger_usdt, + 0 /*self*/, "/proc/self/exe", + "optimized_attach", name, NULL); + if (libbpf_get_error(link)) { + fprintf(stderr, "failed to attach optimized_attach:%s usdt probe\n", nam= e); + exit(1); + } + ctx.skel->links.bench_trigger_usdt =3D link; +} + +static void usdt_nop_setup(void) +{ + usdt_setup("usdt_1"); +} + +static void usdt_nop5_setup(void) +{ + usdt_setup("usdt_2"); +} #endif =20 const struct bench bench_trig_syscall_count =3D { @@ -609,4 +667,6 @@ BENCH_TRIG_USERMODE(uprobe_nop5, nop5, "uprobe-nop5"); BENCH_TRIG_USERMODE(uretprobe_nop5, nop5, "uretprobe-nop5"); BENCH_TRIG_USERMODE(uprobe_multi_nop5, nop5, "uprobe-multi-nop5"); BENCH_TRIG_USERMODE(uretprobe_multi_nop5, nop5, "uretprobe-multi-nop5"); +BENCH_TRIG_USERMODE(usdt_nop, usdt_nop, "usdt-nop"); +BENCH_TRIG_USERMODE(usdt_nop5, usdt_nop5, "usdt-nop5"); #endif diff --git a/tools/testing/selftests/bpf/benchs/run_bench_uprobes.sh b/tool= s/testing/selftests/bpf/benchs/run_bench_uprobes.sh index 03f55405484b..9ec59423b949 100755 --- a/tools/testing/selftests/bpf/benchs/run_bench_uprobes.sh +++ b/tools/testing/selftests/bpf/benchs/run_bench_uprobes.sh @@ -2,7 +2,7 @@ =20 set -eufo pipefail =20 -for i in usermode-count syscall-count {uprobe,uretprobe}-{nop,push,ret,nop= 5} +for i in usermode-count syscall-count {uprobe,uretprobe}-{nop,push,ret,nop= 5} usdt-nop usdt-nop5 do summary=3D$(sudo ./bench -w2 -d5 -a trig-$i | tail -n1 | cut -d'(' -f1 | = cut -d' ' -f3-) printf "%-15s: %s\n" $i "$summary" diff --git a/tools/testing/selftests/bpf/progs/trigger_bench.c b/tools/test= ing/selftests/bpf/progs/trigger_bench.c index 4ea0422d1042..3225b4aee8ff 100644 --- a/tools/testing/selftests/bpf/progs/trigger_bench.c +++ b/tools/testing/selftests/bpf/progs/trigger_bench.c @@ -1,10 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 // Copyright (c) 2020 Facebook -#include +#include "vmlinux.h" #include #include #include #include "bpf_misc.h" +#include "bpf/usdt.bpf.h" =20 char _license[] SEC("license") =3D "GPL"; =20 @@ -180,3 +181,10 @@ int bench_trigger_rawtp(void *ctx) handle(ctx); return 0; } + +SEC("?usdt") +int bench_trigger_usdt(void *ctx) +{ + inc_counter(); + return 0; +} --=20 2.53.0