mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
kcsan: avoid unintended access checking in NMIs
If a watcher deliberately disables interrupts (either by user choice, or
because we're dealing with a scoped reordered access) to avoid detecting
any data races in interrupts, NMIs are still able to fire.
When we set up a watchpoint on a scoped reordered access, we disabled
interrupts because the same CPU cannot observe reordering of its own
accesses. To ensure we observe no false positives from NMIs, disable
access checking for interrupt contexts as well.
Fixes: 69562e4983 ("kcsan: Add core support for a subset of weak memory modeling")
Signed-off-by: Marco Elver <elver@google.com>
This commit is contained in:
+10
-2
@@ -585,8 +585,14 @@ kcsan_setup_watchpoint(const volatile void *ptr, size_t size, int type, unsigned
|
||||
* information is lost if dirtied by KCSAN.
|
||||
*/
|
||||
kcsan_save_irqtrace(current);
|
||||
if (!interrupt_watcher)
|
||||
if (!interrupt_watcher) {
|
||||
local_irq_save(irq_flags);
|
||||
/*
|
||||
* NMIs can still fire, disable checking for all interrupt
|
||||
* contexts.
|
||||
*/
|
||||
raw_cpu_ptr(&kcsan_cpu_ctx)->disable_count++;
|
||||
}
|
||||
|
||||
watchpoint = insert_watchpoint((unsigned long)ptr, size, is_write);
|
||||
if (watchpoint == NULL) {
|
||||
@@ -699,8 +705,10 @@ kcsan_setup_watchpoint(const volatile void *ptr, size_t size, int type, unsigned
|
||||
atomic_long_dec(&kcsan_counters[KCSAN_COUNTER_USED_WATCHPOINTS]);
|
||||
|
||||
out_unlock:
|
||||
if (!interrupt_watcher)
|
||||
if (!interrupt_watcher) {
|
||||
raw_cpu_ptr(&kcsan_cpu_ctx)->disable_count--;
|
||||
local_irq_restore(irq_flags);
|
||||
}
|
||||
kcsan_restore_irqtrace(current);
|
||||
ctx->disable_scoped--;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user