Re: [PATCH v2 06/18] perf/hw_breakpoint: add arch-independent hw_breakpoint_modify_local()
From: Jinchao Wang <hidden>
Date: 2025-09-08 05:36:08
Also in:
linux-mm, linux-perf-users, lkml
On Thu, Sep 04, 2025 at 08:44:48AM +0200, Peter Zijlstra wrote:
On Thu, Sep 04, 2025 at 08:21:03AM +0800, Jinchao Wang wrote:quoted
Introduce hw_breakpoint_modify_local() as a generic helper to modify an existing hardware breakpoint. The function invokes hw_breakpoint_arch_parse() and delegates the reinstall step to the architecture via arch_reinstall_hw_breakpoint(). A weak default implementation of arch_reinstall_hw_breakpoint() is provided, returning -EOPNOTSUPP on architectures without support. This makes the interface arch-independent while allowing x86 (and others) to provide their own implementation. Signed-off-by: Jinchao Wang <redacted> --- include/linux/hw_breakpoint.h | 1 + kernel/events/hw_breakpoint.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+)diff --git a/include/linux/hw_breakpoint.h b/include/linux/hw_breakpoint.h index db199d653dd1..9453b5bdb443 100644 --- a/include/linux/hw_breakpoint.h +++ b/include/linux/hw_breakpoint.h@@ -67,6 +67,7 @@ extern int modify_user_hw_breakpoint_check(struct perf_event *bp, struct perf_event_attr *attr, bool check); +int hw_breakpoint_modify_local(struct perf_event *bp, struct perf_event_attr *attr); /* * Kernel breakpoints are not associated with any particular thread. */diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index 8ec2cb688903..ff428739f71e 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c@@ -983,6 +983,24 @@ static void hw_breakpoint_del(struct perf_event *bp, int flags) arch_uninstall_hw_breakpoint(bp); } +int hw_breakpoint_modify_local(struct perf_event *bp, struct perf_event_attr *attr) +{ + int err; + + err = hw_breakpoint_arch_parse(bp, attr, counter_arch_bp(bp)); + if (err) + return err; + + return arch_reinstall_hw_breakpoint(bp); +} +EXPORT_SYMBOL(hw_breakpoint_modify_local); + +/* weak fallback for arches without support */ +__weak int arch_reinstall_hw_breakpoint(struct perf_event *bp) +{ + return -EOPNOTSUPP; +}Again, so much fail :/
So we have:
{register,modify,unregister}_user_hw_breakpoint()
and
{register,unregister}_wide_hw_breakpoint()
And you choose to extend this latter with hw_breakpoint_modify_local()
instead of sticking with the naming scheme and say adding:
modify_wide_hw_breakpoint_local().
Also, again, that EXPORT is a fail, these other interfaces are all
EXPORT_SYMBOL_GPL().Thanks for your patience. I was misled by another family: - hw_breakpoint_add - hw_breakpoint_del - hw_breakpoint_start - hw_breakpoint_stop Since this logic was also added in the wprobe series by Masami, I will adopt his version instead.
Also note that modify_user_hw_breakpoint() doesn't seem to need new arch hooks. Yet you fail to explain why you think you do.
Thanks for feedback, I will study existing code to better handle the arch dependencies.