All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Olsa <olsajiri@gmail.com>
To: Jiri Olsa <olsajiri@gmail.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Masami Hiramatsu <mhiramat@kernel.org>
Cc: "Oleg Nesterov" <oleg@redhat.com>,
	"Andrii Nakryiko" <andrii@kernel.org>,
	"Alejandro Colomar" <alx@kernel.org>,
	"Eyal Birger" <eyal.birger@gmail.com>,
	kees@kernel.org, bpf@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
	x86@kernel.org, "Song Liu" <songliubraving@fb.com>,
	"Yonghong Song" <yhs@fb.com>,
	"John Fastabend" <john.fastabend@gmail.com>,
	"Hao Luo" <haoluo@google.com>,
	"Steven Rostedt" <rostedt@goodmis.org>,
	"Alan Maguire" <alan.maguire@oracle.com>,
	"David Laight" <David.Laight@aculab.com>,
	"Thomas Weißschuh" <thomas@t-8ch.de>,
	"Ingo Molnar" <mingo@kernel.org>
Subject: Re: [PATCHv3 perf/core 00/22] uprobes: Add support to optimize usdt probes on x86_64
Date: Tue, 24 Jun 2025 10:36:29 +0200	[thread overview]
Message-ID: <aFpjjeYKO5uBuwcl@krava> (raw)
In-Reply-To: <aFFouFEKLFsYhVOe@krava>

ping

On Tue, Jun 17, 2025 at 03:08:08PM +0200, Jiri Olsa wrote:
> hi, ping
> 
> thanks,
> jirka
> 
> On Thu, Jun 05, 2025 at 03:23:27PM +0200, Jiri Olsa wrote:
> > hi,
> > this patchset adds support to optimize usdt probes on top of 5-byte
> > nop instruction.
> > 
> > The generic approach (optimize all uprobes) is hard due to emulating
> > possible multiple original instructions and its related issues. The
> > usdt case, which stores 5-byte nop seems much easier, so starting
> > with that.
> > 
> > The basic idea is to replace breakpoint exception with syscall which
> > is faster on x86_64. For more details please see changelog of patch 8.
> > 
> > The run_bench_uprobes.sh benchmark triggers uprobe (on top of different
> > original instructions) in a loop and counts how many of those happened
> > per second (the unit below is million loops).
> > 
> > There's big speed up if you consider current usdt implementation
> > (uprobe-nop) compared to proposed usdt (uprobe-nop5):
> > 
> > current:
> >         usermode-count :  152.501 ± 0.012M/s
> >         syscall-count  :   14.463 ± 0.062M/s
> > -->     uprobe-nop     :    3.160 ± 0.005M/s
> >         uprobe-push    :    3.003 ± 0.003M/s
> >         uprobe-ret     :    1.100 ± 0.003M/s
> >         uprobe-nop5    :    3.132 ± 0.012M/s
> >         uretprobe-nop  :    2.103 ± 0.002M/s
> >         uretprobe-push :    2.027 ± 0.004M/s
> >         uretprobe-ret  :    0.914 ± 0.002M/s
> >         uretprobe-nop5 :    2.115 ± 0.002M/s
> > 
> > after the change:
> >         usermode-count :  152.343 ± 0.400M/s
> >         syscall-count  :   14.851 ± 0.033M/s
> >         uprobe-nop     :    3.204 ± 0.005M/s
> >         uprobe-push    :    3.040 ± 0.005M/s
> >         uprobe-ret     :    1.098 ± 0.003M/s
> > -->     uprobe-nop5    :    7.286 ± 0.017M/s
> >         uretprobe-nop  :    2.144 ± 0.001M/s
> >         uretprobe-push :    2.069 ± 0.002M/s
> >         uretprobe-ret  :    0.922 ± 0.000M/s
> >         uretprobe-nop5 :    3.487 ± 0.001M/s
> > 
> > I see bit more speed up on Intel (above) compared to AMD. The big nop5
> > speed up is partly due to emulating nop5 and partly due to optimization.
> > 
> > The key speed up we do this for is the USDT switch from nop to nop5:
> > 	uprobe-nop     :    3.160 ± 0.005M/s
> > 	uprobe-nop5    :    7.286 ± 0.017M/s
> > 
> > 
> > Changes from v2:
> > - rebased on top of tip/master + mm/mm-stable + 1 extra change [1]
> > - added acks [Oleg,Andrii]
> > - more details changelog for patch 1 [Masami]
> > - several tests changes [Andrii]
> > - add explicit PAGE_SIZE low limit to vm_unmapped_area call [Andrii]
> > 
> > 
> > This patchset is adding new syscall, here are notes to check list items
> > in Documentation/process/adding-syscalls.rst:
> > 
> > - System Call Alternatives
> >   New syscall seems like the best way in here, because we need
> >   just to quickly enter kernel with no extra arguments processing,
> >   which we'd need to do if we decided to use another syscall.
> > 
> > - Designing the API: Planning for Extension
> >   The uprobe syscall is very specific and most likely won't be
> >   extended in the future.
> > 
> > - Designing the API: Other Considerations
> >   N/A because uprobe syscall does not return reference to kernel
> >   object.
> > 
> > - Proposing the API
> >   Wiring up of the uprobe system call is in separate change,
> >   selftests and man page changes are part of the patchset.
> > 
> > - Generic System Call Implementation
> >   There's no CONFIG option for the new functionality because it
> >   keeps the same behaviour from the user POV.
> > 
> > - x86 System Call Implementation
> >   It's 64-bit syscall only.
> > 
> > - Compatibility System Calls (Generic)
> >   N/A uprobe syscall has no arguments and is not supported
> >   for compat processes.
> > 
> > - Compatibility System Calls (x86)
> >   N/A uprobe syscall is not supported for compat processes.
> > 
> > - System Calls Returning Elsewhere
> >   N/A.
> > 
> > - Other Details
> >   N/A.
> > 
> > - Testing
> >   Adding new bpf selftests.
> > 
> > - Man Page
> >   Attached.
> > 
> > - Do not call System Calls in the Kernel
> >   N/A
> > 
> > pending todo (or follow ups):
> > - use PROCMAP_QUERY in tests
> > - alloc 'struct uprobes_state' for mm_struct only when needed [Andrii]
> > - use mm_cpumask(vma->vm_mm) in text_poke_sync
> > 
> > thanks,
> > jirka
> > 
> > 
> > Cc: Alejandro Colomar <alx@kernel.org>
> > Cc: Eyal Birger <eyal.birger@gmail.com>
> > Cc: kees@kernel.org
> > 
> > [1] https://lore.kernel.org/linux-trace-kernel/20250514101809.2010193-1-jolsa@kernel.org/T/#u
> > ---
> > Jiri Olsa (21):
> >       uprobes: Remove breakpoint in unapply_uprobe under mmap_write_lock
> >       uprobes: Rename arch_uretprobe_trampoline function
> >       uprobes: Make copy_from_page global
> >       uprobes: Add uprobe_write function
> >       uprobes: Add nbytes argument to uprobe_write
> >       uprobes: Add is_register argument to uprobe_write and uprobe_write_opcode
> >       uprobes: Add do_ref_ctr argument to uprobe_write function
> >       uprobes/x86: Add mapping for optimized uprobe trampolines
> >       uprobes/x86: Add uprobe syscall to speed up uprobe
> >       uprobes/x86: Add support to optimize uprobes
> >       selftests/bpf: Import usdt.h from libbpf/usdt project
> >       selftests/bpf: Reorg the uprobe_syscall test function
> >       selftests/bpf: Rename uprobe_syscall_executed prog to test_uretprobe_multi
> >       selftests/bpf: Add uprobe/usdt syscall tests
> >       selftests/bpf: Add hit/attach/detach race optimized uprobe test
> >       selftests/bpf: Add uprobe syscall sigill signal test
> >       selftests/bpf: Add optimized usdt variant for basic usdt test
> >       selftests/bpf: Add uprobe_regs_equal test
> >       selftests/bpf: Change test_uretprobe_regs_change for uprobe and uretprobe
> >       seccomp: passthrough uprobe systemcall without filtering
> >       selftests/seccomp: validate uprobe syscall passes through seccomp
> > 
> >  arch/arm/probes/uprobes/core.c                              |   2 +-
> >  arch/x86/entry/syscalls/syscall_64.tbl                      |   1 +
> >  arch/x86/include/asm/uprobes.h                              |   7 ++
> >  arch/x86/kernel/uprobes.c                                   | 525 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> >  include/linux/syscalls.h                                    |   2 +
> >  include/linux/uprobes.h                                     |  20 +++-
> >  kernel/events/uprobes.c                                     | 100 ++++++++++++-----
> >  kernel/fork.c                                               |   1 +
> >  kernel/seccomp.c                                            |  32 ++++--
> >  kernel/sys_ni.c                                             |   1 +
> >  tools/testing/selftests/bpf/prog_tests/uprobe_syscall.c     | 523 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
> >  tools/testing/selftests/bpf/prog_tests/usdt.c               |  38 ++++---
> >  tools/testing/selftests/bpf/progs/uprobe_syscall.c          |   4 +-
> >  tools/testing/selftests/bpf/progs/uprobe_syscall_executed.c |  60 +++++++++-
> >  tools/testing/selftests/bpf/test_kmods/bpf_testmod.c        |  11 +-
> >  tools/testing/selftests/bpf/usdt.h                          | 545 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  tools/testing/selftests/seccomp/seccomp_bpf.c               | 107 ++++++++++++++----
> >  17 files changed, 1867 insertions(+), 112 deletions(-)
> >  create mode 100644 tools/testing/selftests/bpf/usdt.h
> > 
> > 
> > Jiri Olsa (1):
> >       man2: Add uprobe syscall page
> > 
> >  man/man2/uprobe.2    |  1 +
> >  man/man2/uretprobe.2 | 36 ++++++++++++++++++++++++------------
> >  2 files changed, 25 insertions(+), 12 deletions(-)
> >  create mode 100644 man/man2/uprobe.2

  reply	other threads:[~2025-06-24  8:36 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-05 13:23 [PATCHv3 perf/core 00/22] uprobes: Add support to optimize usdt probes on x86_64 Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 01/22] uprobes: Remove breakpoint in unapply_uprobe under mmap_write_lock Jiri Olsa
2025-06-25  6:04   ` Masami Hiramatsu
2025-06-05 13:23 ` [PATCHv3 perf/core 02/22] uprobes: Rename arch_uretprobe_trampoline function Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 03/22] uprobes: Make copy_from_page global Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 04/22] uprobes: Add uprobe_write function Jiri Olsa
2025-06-25  6:12   ` Masami Hiramatsu
2025-06-05 13:23 ` [PATCHv3 perf/core 05/22] uprobes: Add nbytes argument to uprobe_write Jiri Olsa
2025-06-25  6:13   ` Masami Hiramatsu
2025-06-05 13:23 ` [PATCHv3 perf/core 06/22] uprobes: Add is_register argument to uprobe_write and uprobe_write_opcode Jiri Olsa
2025-06-25  6:32   ` Masami Hiramatsu
2025-06-05 13:23 ` [PATCHv3 perf/core 07/22] uprobes: Add do_ref_ctr argument to uprobe_write function Jiri Olsa
2025-06-25  6:42   ` Masami Hiramatsu
2025-06-25 15:11     ` Jiri Olsa
2025-06-27  4:58       ` Masami Hiramatsu
2025-06-05 13:23 ` [PATCHv3 perf/core 08/22] uprobes/x86: Add mapping for optimized uprobe trampolines Jiri Olsa
2025-06-25  8:21   ` Masami Hiramatsu
2025-06-25 15:16     ` Jiri Olsa
2025-06-27  6:01       ` Masami Hiramatsu
2025-06-27 12:39         ` Jiri Olsa
2025-07-04  8:23           ` Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 09/22] uprobes/x86: Add uprobe syscall to speed up uprobe Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 10/22] uprobes/x86: Add support to optimize uprobes Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 11/22] selftests/bpf: Import usdt.h from libbpf/usdt project Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 12/22] selftests/bpf: Reorg the uprobe_syscall test function Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 13/22] selftests/bpf: Rename uprobe_syscall_executed prog to test_uretprobe_multi Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 14/22] selftests/bpf: Add uprobe/usdt syscall tests Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 15/22] selftests/bpf: Add hit/attach/detach race optimized uprobe test Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 16/22] selftests/bpf: Add uprobe syscall sigill signal test Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 17/22] selftests/bpf: Add optimized usdt variant for basic usdt test Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 18/22] selftests/bpf: Add uprobe_regs_equal test Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 19/22] selftests/bpf: Change test_uretprobe_regs_change for uprobe and uretprobe Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 20/22] seccomp: passthrough uprobe systemcall without filtering Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 perf/core 21/22] selftests/seccomp: validate uprobe syscall passes through seccomp Jiri Olsa
2025-06-05 13:23 ` [PATCHv3 22/22] man2: Add uprobe syscall page Jiri Olsa
2025-06-11  8:30   ` Alejandro Colomar
2025-06-17 13:08 ` [PATCHv3 perf/core 00/22] uprobes: Add support to optimize usdt probes on x86_64 Jiri Olsa
2025-06-24  8:36   ` Jiri Olsa [this message]
2025-06-25  6:05     ` Masami Hiramatsu

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=aFpjjeYKO5uBuwcl@krava \
    --to=olsajiri@gmail.com \
    --cc=David.Laight@aculab.com \
    --cc=alan.maguire@oracle.com \
    --cc=alx@kernel.org \
    --cc=andrii@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=eyal.birger@gmail.com \
    --cc=haoluo@google.com \
    --cc=john.fastabend@gmail.com \
    --cc=kees@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=mingo@kernel.org \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=songliubraving@fb.com \
    --cc=thomas@t-8ch.de \
    --cc=x86@kernel.org \
    --cc=yhs@fb.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.