On Tue, Jun 23, 2020 at 08:12:32PM +0200, Peter Zijlstra wrote: > Fair enough; I'll rip it all up and boot a KCSAN kernel, see what if > anything happens. OK, so the below patch doesn't seem to have any nasty recursion issues here. The only 'problem' is that lockdep now sees report_lock can cause deadlocks. It is completely right about it too, but I don't suspect there's much we can do about it, it's pretty much the standard printk() with scheduler locks held report. --- diff --git a/kernel/kcsan/core.c b/kernel/kcsan/core.c index 15f67949d11e..732623c30359 100644 --- a/kernel/kcsan/core.c +++ b/kernel/kcsan/core.c @@ -397,8 +397,7 @@ kcsan_setup_watchpoint(const volatile void *ptr, size_t size, int type) } if (!kcsan_interrupt_watcher) - /* Use raw to avoid lockdep recursion via IRQ flags tracing. */ - raw_local_irq_save(irq_flags); + local_irq_save(irq_flags); watchpoint = insert_watchpoint((unsigned long)ptr, size, is_write); if (watchpoint == NULL) { @@ -539,7 +538,7 @@ kcsan_setup_watchpoint(const volatile void *ptr, size_t size, int type) kcsan_counter_dec(KCSAN_COUNTER_USED_WATCHPOINTS); out_unlock: if (!kcsan_interrupt_watcher) - raw_local_irq_restore(irq_flags); + local_irq_restore(irq_flags); out: user_access_restore(ua_flags); } diff --git a/kernel/kcsan/report.c b/kernel/kcsan/report.c index ac5f8345bae9..ef31c1d2dac3 100644 --- a/kernel/kcsan/report.c +++ b/kernel/kcsan/report.c @@ -605,14 +605,6 @@ void kcsan_report(const volatile void *ptr, size_t size, int access_type, if (WARN_ON(watchpoint_idx < 0 || watchpoint_idx >= ARRAY_SIZE(other_infos))) goto out; - /* - * With TRACE_IRQFLAGS, lockdep's IRQ trace state becomes corrupted if - * we do not turn off lockdep here; this could happen due to recursion - * into lockdep via KCSAN if we detect a race in utilities used by - * lockdep. - */ - lockdep_off(); - if (prepare_report(&flags, type, &ai, other_info)) { /* * Never report if value_change is FALSE, only if we it is @@ -628,7 +620,6 @@ void kcsan_report(const volatile void *ptr, size_t size, int access_type, release_report(&flags, other_info); } - lockdep_on(); out: kcsan_enable_current(); }