[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250304154846.1937958-1-david@redhat.com>
Date: Tue, 4 Mar 2025 16:48:43 +0100
From: David Hildenbrand <david@...hat.com>
To: linux-kernel@...r.kernel.org
Cc: linux-mm@...ck.org,
linux-arm-kernel@...ts.infradead.org,
linux-trace-kernel@...r.kernel.org,
linux-perf-users@...r.kernel.org,
David Hildenbrand <david@...hat.com>,
Andrew Morton <akpm@...ux-foundation.org>,
Matthew Wilcox <willy@...radead.org>,
Russell King <linux@...linux.org.uk>,
Masami Hiramatsu <mhiramat@...nel.org>,
Oleg Nesterov <oleg@...hat.com>,
Peter Zijlstra <peterz@...radead.org>,
Ingo Molnar <mingo@...hat.com>,
Arnaldo Carvalho de Melo <acme@...nel.org>,
Namhyung Kim <namhyung@...nel.org>,
Mark Rutland <mark.rutland@....com>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Jiri Olsa <jolsa@...nel.org>,
Ian Rogers <irogers@...gle.com>,
Adrian Hunter <adrian.hunter@...el.com>,
"Liang, Kan" <kan.liang@...ux.intel.com>,
Tong Tiangen <tongtiangen@...wei.com>
Subject: [PATCH -next v1 0/3] kernel/events/uprobes: uprobe_write_opcode() rewrite
Based on -next, because a related fix [1] is not in mm.git. This is
the follow-up to [2] (later than I wanted to send it out), now that
Willy also stumbled over this [3].
Since the RFC, I rewrote it once again, now using a folio_walk instead of
our old pagewalk infrastructure.
Currently, uprobe_write_opcode() implements COW-breaking manually, which is
really far from ideal. Further, there is interest in supporting uprobes on
hugetlb pages [1], and leaving at least the COW-breaking to the core will
make this much easier.
Also, I think the current code doesn't really handle some things
properly (see patch #3) when replacing/zapping pages.
Let's rewrite it, to leave COW-breaking to the fault handler, and handle
registration/unregistration by temporarily unmapping the anonymous page,
modifying it, and mapping it again. We still have to implement
zapping of anonymous pages ourselves, unfortunately.
We could look into not performing the temporary unmapping if we can
perform the write atomically, which would likely also make adding hugetlb
support a lot easier. But, limited (e.g., only PMD/PUD) hugetlb support
could be added on top of this with some tweaking.
Note that we now won't have to allocate another anonymous folio when
unregistering (which will be beneficial for hugetlb as well), we can simply
modify the already-mapped one from the registration (if any). When
registering a uprobe, we'll first trigger a ptrace-like write fault to
break COW, to then modify the already-mapped page.
Briefly sanity tested with perf:
[root@...alhost ~]# perf probe -x /usr/bin/bash -a main
...
[root@...alhost ~]# perf record -e probe_bash:main -aR sleep 10 &
[1] 2196
[root@...alhost ~]# bash
[root@...alhost ~]# exit
exit
[root@...alhost ~]# bash
[root@...alhost ~]# exit
exit
[root@...alhost ~]# [ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.287 MB perf.data (8 samples) ]
...
[root@...alhost ~]# perf report --stdio
# To display the perf.data header info, please use --header/--header-only optio>
#
#
# Total Lost Samples: 0
#
# Samples: 8 of event 'probe_bash:main'
# Event count (approx.): 8
#
# Overhead Command Shared Object Symbol
# ........ ........... ............. ........
#
75.00% grepconf.sh bash [.] main
25.00% bash bash [.] main
...
Are there any uprobe tests / benchmarks that are worth running?
RFC -> v1:
* Use folio_walk and simplify the logic
Cc: Andrew Morton <akpm@...ux-foundation.org>
Cc: Matthew Wilcox <willy@...radead.org>
Cc: Russell King <linux@...linux.org.uk>
Cc: Masami Hiramatsu <mhiramat@...nel.org>
Cc: Oleg Nesterov <oleg@...hat.com>
Cc: Peter Zijlstra <peterz@...radead.org>
Cc: Ingo Molnar <mingo@...hat.com>
Cc: Arnaldo Carvalho de Melo <acme@...nel.org>
Cc: Namhyung Kim <namhyung@...nel.org>
Cc: Mark Rutland <mark.rutland@....com>
Cc: Alexander Shishkin <alexander.shishkin@...ux.intel.com>
Cc: Jiri Olsa <jolsa@...nel.org>
Cc: Ian Rogers <irogers@...gle.com>
Cc: Adrian Hunter <adrian.hunter@...el.com>
Cc: "Liang, Kan" <kan.liang@...ux.intel.com>
Cc: Tong Tiangen <tongtiangen@...wei.com>
[1] https://lkml.kernel.org/r/20250224031149.1598949-1-tongtiangen@huawei.com
[2] https://lore.kernel.org/linux-mm/20240604122548.359952-2-david@redhat.com/T/
[3] https://lore.kernel.org/all/d7971673-19ed-448a-9e54-8ffbde5059dc@redhat.com/T/
[4] https://lkml.kernel.org/r/ZiK50qob9yl5e0Xz@bender.morinfr.org
David Hildenbrand (3):
kernel/events/uprobes: pass VMA instead of MM to remove_breakpoint()
kernel/events/uprobes: pass VMA to set_swbp(), set_orig_insn() and
uprobe_write_opcode()
kernel/events/uprobes: uprobe_write_opcode() rewrite
arch/arm/probes/uprobes/core.c | 4 +-
include/linux/uprobes.h | 6 +-
kernel/events/uprobes.c | 363 +++++++++++++++++----------------
3 files changed, 190 insertions(+), 183 deletions(-)
base-commit: cd3215bbcb9d4321def93fea6cfad4d5b42b9d1d
--
2.48.1
Powered by blists - more mailing lists