From: Jiri Olsa <jolsa@kernel.org>
To: Masami Hiramatsu <mhiramat@kernel.org>,
Naveen N Rao <naveen@kernel.org>,
"David S. Miller" <davem@davemloft.net>
Cc: Peter Zijlstra <peterz@infradead.org>,
Josh Poimboeuf <jpoimboe@kernel.org>,
Jason Baron <jbaron@akamai.com>,
Alice Ryhl <aliceryhl@google.com>,
Steven Rostedt <rostedt@goodmis.org>,
Ard Biesheuvel <ardb@kernel.org>,
Thomas Gleixner <tglx@kernel.org>, Ingo Molnar <mingo@redhat.com>,
Alan Maguire <almagui@kernel.org>,
x86@kernel.org, linux-trace-kernel@vger.kernel.org,
linux-kernel@vger.kernel.org, bpf@vger.kernel.org
Subject: [PATCH 00/13] kprobes: Reduce registration and optimization lookup costs
Date: Mon, 9 Nov 2026 20:49:03 +0100 [thread overview]
Message-ID: <20261109194916.1089703-1-jolsa@kernel.org> (raw)
hi,
this series reduces repeated lookup work when registering and preparing
large numbers of kprobes, particularly on x86 with optimized probes.
The kernel already provides interfaces for registering large numbers of
kprobes. Faster registration will become more important for our planned
inline function tracing support, which will use kprobes.
The changes address two kinds of lookup:
- add indexes sorted by code address for core static-call and jump-label
reservation checks. The original tables remain sorted by key for
updates. Build the indexes during late init and retain linear scans
if allocation fails. Module reservation checks remain linear.
- add an address-ordered rbtree of registered kprobes and iterators for
ranges and monotonically increasing addresses. Convert instruction
recovery and optimization checks to reuse these iterators instead
of repeatedly looking up individual addresses.
The series also determines x86 jump-label instruction sizes directly
from their opcode or NOP encoding, avoiding instruction decoding.
The final samples patch is included only to demonstrate the testing and
is not intended for merging. It adds 50k functions to the kernel, along
with sample module code that registers kprobes on them, simulating kprobes
on inline kernel functions.
There's overall speedup about 10x for registering the kprobe, please check
the perf stats below. Plus there's one more low hanging fruit leftover I
plan to send later for bug entry lookup that will add bit more speed up.
The test below measures perf stat for the probe_many_example.ko module to
attach kprobes to 20,000 functions.
Performance counter stats for:
'insmod ./samples/kprobes/kprobe_many_example.ko nr_functions=20000':
Before:
50,908,260,992 cycles:k
53,886,723,615 instructions:k
10.072721766 seconds time elapsed
After:
5,122,978,035 cycles:k
5,620,945,319 instructions:k
1.027289983 seconds time elapsed
thanks,
jirka
Assisted-by: LLM
---
Jiri Olsa (13):
static_call: Index code text reservation lookups
jump_label: Index text reservation lookups
jump_label/x86: Avoid decoding instructions for jump entry size
kprobes: Maintain an rbtree of registered probes
kprobes: Add an iterator for address ranges
kprobes: Add an address iterator for probe lookup
kprobes: Use kprobe iterator in get_optimized_kprobe
x86/kprobes: Use kprobe iterator in __recover_optprobed_insn
x86/kprobes: Use kprobe iterator in arch_check_optimized_kprobe
x86/kprobes: Use kprobe address iterator in can_optimize
x86/kprobes: Use kprobe address iterator in can_probe
x86/kprobes: Use kprobe address iterator in in copy_optimized_instructions
samples/kprobes: Add batch probe example
arch/x86/kernel/jump_label.c | 14 +++++++----
arch/x86/kernel/kprobes/common.h | 7 +++---
arch/x86/kernel/kprobes/core.c | 26 +++++++++++--------
arch/x86/kernel/kprobes/opt.c | 32 ++++++++++++++---------
include/linux/kprobes.h | 25 ++++++++++++++++++
kernel/Makefile | 3 +++
kernel/jump_label.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
kernel/kprobes.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
kernel/kprobes_many.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
kernel/static_call_inline.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
samples/Kconfig | 8 ++++++
samples/kprobes/Makefile | 1 +
samples/kprobes/kprobe_many_example.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
13 files changed, 598 insertions(+), 42 deletions(-)
create mode 100644 kernel/kprobes_many.c
create mode 100644 samples/kprobes/kprobe_many_example.c
next reply other threads:[~2026-11-09 19:49 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-09 19:49 Jiri Olsa [this message]
2026-11-09 19:49 ` [PATCH 01/13] static_call: Index code text reservation lookups Jiri Olsa
2026-11-09 19:49 ` [PATCH 02/13] jump_label: Index " Jiri Olsa
2026-11-09 19:49 ` [PATCH 03/13] jump_label/x86: Avoid decoding instructions for jump entry size Jiri Olsa
2026-11-09 19:55 ` [PATCH 04/13] kprobes: Maintain an rbtree of registered probes Jiri Olsa
2026-11-09 19:56 ` [PATCH 05/13] kprobes: Add an iterator for address ranges Jiri Olsa
2026-11-09 19:56 ` [PATCH 06/13] kprobes: Add an address iterator for probe lookup Jiri Olsa
2026-11-09 19:56 ` [PATCH 07/13] kprobes: Use kprobe iterator in get_optimized_kprobe Jiri Olsa
2026-11-09 19:57 ` [PATCH 08/13] x86/kprobes: Use kprobe iterator in __recover_optprobed_insn Jiri Olsa
2026-11-09 19:57 ` [PATCH 09/13] x86/kprobes: Use kprobe iterator in arch_check_optimized_kprobe Jiri Olsa
2026-11-09 19:57 ` [PATCH 10/13] x86/kprobes: Use kprobe address iterator in can_optimize Jiri Olsa
2026-11-09 19:57 ` [PATCH 11/13] x86/kprobes: Use kprobe address iterator in can_probe Jiri Olsa
2026-11-09 19:58 ` [PATCH 12/13] x86/kprobes: Use kprobe address iterator in in copy_optimized_instructions Jiri Olsa
2026-11-09 19:58 ` [PATCH 13/13] samples/kprobes: Add batch probe example Jiri Olsa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261109194916.1089703-1-jolsa@kernel.org \
--to=jolsa@kernel.org \
--cc=aliceryhl@google.com \
--cc=almagui@kernel.org \
--cc=ardb@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=davem@davemloft.net \
--cc=jbaron@akamai.com \
--cc=jpoimboe@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=naveen@kernel.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@kernel.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®