Re: [RFC 1/3] rv: add per-edge dwell-time statistics primitive
flat view
From: sashiko-bot@kernel.org
Date: 2026-08-27 07:34:18
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] NMI Deadlock / Lock Reentrancy on 32-bit architectures -- commit 29c9d40bef06feb46125ab67ac5762b58ace9c11 Author: Tobias Schaffner [off-list ref] rv: add per-edge dwell-time statistics primitive Add a small primitive that records, per automaton edge, how long the monitor dwelled before taking it with a count, a sum and a maximum. The counters are kept in local64_t variables so a monitor's hot path can update them without disabling interrupts.
quoted hunk ↗ jump to hunk
diff --git a/include/linux/rv_edge_stat.h b/include/linux/rv_edge_stat.h new file mode 100644 index 0000000000000..751de8074dcc3 --- /dev/null +++ b/include/linux/rv_edge_stat.h
[ ... ]
quoted hunk ↗ jump to hunk
+static __always_inline +void rv_edge_stat_account(struct rv_edge_stat *s, u64 dwell_ns) +{ + s64 max; + + local64_inc(&s->count); + local64_add(dwell_ns, &s->sum_ns); + + /* Keep the largest dwell; retry only if a nested update raced us. */ + max = local64_read(&s->max_ns); + while (dwell_ns > (u64)max) { + s64 prev = local64_cmpxchg(&s->max_ns, max, dwell_ns);
[Severity: High] Could this cause an NMI deadlock on 32-bit architectures? The commit message notes these counters are lock-free, but on 32-bit platforms lacking native 64-bit atomics (e.g., ARMv6 or RISC-V 32 with CONFIG_GENERIC_ATOMIC64=y), local64_t operations fall back to atomic64_t. The generic atomic64 implementation uses a hashed array of spinlocks acquired via local_irq_save(), which disables regular interrupts but not NMIs. If an NMI interrupts rv_edge_stat_account() while it holds one of these non-reentrant spinlocks, and the NMI handler triggers an RV monitor event that hashes to the same lock, would the CPU deadlock attempting to acquire the already-held spinlock? Does this implementation need an explicit check to abort if IS_ENABLED(CONFIG_GENERIC_ATOMIC64) && in_nmi(), similar to the protection used in the trace ring buffer?
quoted hunk ↗ jump to hunk
+ + if (prev == max) + break; + max = prev; + } +} + +#endif /* _LINUX_RV_EDGE_STAT_H */
-- Sashiko AI review · https://sashiko.dev/#/patchset/20260827072400.45734-1-tobias.schaffner@siemens.com?part=1