All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Jinchao Wang" <wangjinchao600@gmail.com>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [RFC PATCH 04/13] HWBP: Add modify_wide_hw_breakpoint_local() API
Date: Tue, 14 Jul 2026 19:41:26 +0000	[thread overview]
Message-ID: <20260714194127.2460E1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260714183049.12383-1-wangjinchao600@gmail.com>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] In-place mutation of active hardware breakpoint state (`bp->hw.info`) without disabling the event causes NMI data races and error-path corruption.
- [High] The DRn debug address register is updated while the hardware breakpoint is still enabled in DR7, risking spurious debug exceptions.
- [Medium] `modify_wide_hw_breakpoint_local` fails to update `bp->attr` on successful modification, causing state desynchronization.
--

--- Patch [4]: [RFC PATCH 04/13] HWBP: Add modify_wide_hw_breakpoint_local() API ---
commit 861178eefb9a8774dffa3900f118da48cde078a9
Author: Masami Hiramatsu (Google) <mhiramat@kernel.org>

    HWBP: Add modify_wide_hw_breakpoint_local() API
    
    Add modify_wide_hw_breakpoint_local() arch-wide interface which allows
    hwbp users to update watch address on-line. This is available if the
    arch supports CONFIG_HAVE_REINSTALL_HW_BREAKPOINT.

[ ... ]

> diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c
> index 789add0c185a0..20ca64f305083 100644
> --- a/kernel/events/hw_breakpoint.c
> +++ b/kernel/events/hw_breakpoint.c
> @@ -888,6 +888,43 @@ void unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events)

[ ... ]

> +int modify_wide_hw_breakpoint_local(struct perf_event *bp,
> +				    struct perf_event_attr *attr)
> +{
> +	int ret;
> +
> +	if (find_slot_idx(bp->attr.bp_type) != find_slot_idx(attr->bp_type))
> +		return -EINVAL;
> +
> +	ret = hw_breakpoint_arch_parse(bp, attr, counter_arch_bp(bp));

[Severity: High]
Does this code call hw_breakpoint_arch_parse() on the active event's hardware
info without temporarily disabling the event?

Architecture implementations like x86's arch_build_bp_info() mutate the struct
incrementally:

arch/x86/kernel/hw_breakpoint.c:arch_build_bp_info() {
	hw->address = attr->bp_addr;
	hw->mask = 0;

	/* Type */
	switch (attr->bp_type) {
...
}

If validation fails midway, does bp->hw.info remain partially overwritten and
corrupted?

Additionally, could an NMI hitting the active breakpoint during this window
read torn state?

> +	if (ret)
> +		return ret;
> +
> +	return arch_reinstall_hw_breakpoint(bp);

[Severity: High]
Does arch_reinstall_hw_breakpoint() risk spurious debug exceptions here?

Because modify_wide_hw_breakpoint_local() does not temporarily disable the
breakpoint first, the slot is already enabled in the physical DR7.

Modifying DRn before the control register DR7 is cleared or updated can
violate architectural rules:

arch/x86/kernel/hw_breakpoint.c:setup_hwbp() {
	set_debugreg(info->address, slot);
	__this_cpu_write(cpu_debugreg[slot], info->address);

	dr7 = this_cpu_read(cpu_dr7);
	/*
	 * Clear the slot's stale len/type and enable bits first
...
}

Could this trigger spurious #DB debug exceptions if the CPU accesses the new
address during the window before DR7 is updated?

[Severity: Medium]
When this modification is successful, should bp->attr be updated with the new
user-provided attributes?

It looks like the newly parsed attr is never copied back to bp->attr.

Any subsequent read of the breakpoint properties or perf sample
initializations might silently use the old, stale address and length:

kernel/events/core.c:perf_bp_event() {
	perf_sample_data_init(&sample, bp->attr.bp_addr, 0);
...
}

Will this cause state desynchronization and silently corrupt trace data?

> +}
> +#else
> +int modify_wide_hw_breakpoint_local(struct perf_event *bp,
> +				    struct perf_event_attr *attr)
> +{
> +	return -EOPNOTSUPP;
> +}
> +#endif

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260714182243.10687-1-wangjinchao600@gmail.com?part=4

  reply	other threads:[~2026-07-14 19:41 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-14 18:22 [RFC PATCH 00/13] mm/kwatch: dynamic hardware watchpoints for hunting memory corruption Jinchao Wang
2026-07-14 18:22 ` [RFC PATCH 01/13] arch: add HAVE_REINSTALL_HW_BREAKPOINT Jinchao Wang
2026-07-14 18:22 ` [RFC PATCH 02/13] x86/hw_breakpoint: Unify breakpoint install/uninstall Jinchao Wang
2026-07-14 18:47   ` sashiko-bot
2026-07-14 18:22 ` [RFC PATCH 03/13] x86/hw_breakpoint: Add arch_reinstall_hw_breakpoint Jinchao Wang
2026-07-14 19:22   ` sashiko-bot
2026-07-14 18:30 ` [RFC PATCH 04/13] HWBP: Add modify_wide_hw_breakpoint_local() API Jinchao Wang
2026-07-14 19:41   ` sashiko-bot [this message]
2026-07-14 18:31 ` [RFC PATCH 05/13] mm/kwatch: add watch expression parser and dereference engine Jinchao Wang
2026-07-14 18:45   ` sashiko-bot
2026-07-14 18:31 ` [RFC PATCH 06/13] mm/kwatch: add lockless per-task context pool Jinchao Wang
2026-07-14 18:44   ` sashiko-bot
2026-07-14 18:31 ` [RFC PATCH 07/13] stacktrace: export stack_trace_save_regs() Jinchao Wang
2026-07-14 18:42   ` sashiko-bot
2026-07-14 18:32 ` [RFC PATCH 08/13] mm/kwatch: add hardware breakpoint backend Jinchao Wang
2026-07-14 18:50   ` sashiko-bot
2026-07-14 21:14   ` Steven Rostedt
2026-07-14 18:32 ` [RFC PATCH 09/13] mm/kwatch: add probe lifecycle runtime Jinchao Wang
2026-07-14 19:53   ` sashiko-bot
2026-07-14 18:32 ` [RFC PATCH 10/13] mm/kwatch: add anchor thread for global watchpoints Jinchao Wang
2026-07-14 18:48   ` sashiko-bot
2026-07-14 18:33 ` [RFC PATCH 11/13] mm/kwatch: add debugfs control plane Jinchao Wang
2026-07-14 18:58   ` sashiko-bot
2026-07-14 18:33 ` [RFC PATCH 12/13] mm/kwatch: add KUnit tests for the watch expression parser Jinchao Wang
2026-07-14 18:50   ` sashiko-bot
2026-07-14 18:33 ` [RFC PATCH 13/13] Documentation/dev-tools: document KWatch Jinchao Wang
2026-07-14 18:48   ` sashiko-bot

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=20260714194127.2460E1F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=wangjinchao600@gmail.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.