Re: [PATCH v19 24/40] locking/lockdep: prevent various lockdep assertions when lockdep_off()'ed

[email protected] Tue, 07 Jul 2026 07:33:41 +0000
Newsgroups gmane.linux.kernel.modules,gmane.comp.video.dri.devel,gmane.linux.ide,gmane.linux.kernel
Message-ID <[email protected]>
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] The patch introduces a performance regression on fast paths when CONFIG_PROVE_LOCKING is enabled by adding an out-of-line function call to a macro that is unconditionally evaluated before checking if the assertion actually fails.
--

commit a2a5c1f9c5f68f19a3e991808b6e812dde3fa53a
Author: Byungchul Park <[email protected]>
locking/lockdep: prevent various lockdep assertions when lockdep_off()'ed

This commit adds a check for lockdep_recursing(current) to the
__lockdep_enabled macro. To avoid header dependency issues, it introduces
an out-of-line function lockdep_recursing_current().

> diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
> index 60b17a2ff555f..5113b7053b621 100644
> --- a/include/linux/lockdep.h
> +++ b/include/linux/lockdep.h
[ ... ]
> @@ -630,7 +631,7 @@ DECLARE_PER_CPU(int, hardirqs_enabled);
>  DECLARE_PER_CPU(int, hardirq_context);
>  DECLARE_PER_CPU(unsigned int, lockdep_recursion);
>  
> -#define __lockdep_enabled	(debug_locks && !this_cpu_read(lockdep_recursion))
> +#define __lockdep_enabled	(debug_locks && !this_cpu_read(lockdep_recursion) && !lockdep_recursing_current())
>  
>  #define lockdep_assert_irqs_enabled()					\
>  do {									\

[Severity: Medium]
Will this out-of-line call introduce measurable overhead on fast paths?

Since debug_locks and !this_cpu_read(lockdep_recursion) are almost always
true in healthy systems, lockdep_recursing_current() will be evaluated every
time __lockdep_enabled is checked.

For example, in lockdep_assert_irqs_enabled():

    WARN_ON_ONCE(__lockdep_enabled && !this_cpu_read(hardirqs_enabled));

Because __lockdep_enabled is the first operand, the out-of-line call executes
before checking if the assertion actually fails.

Could we move __lockdep_enabled to the end of the && chain in these
assertions?

    WARN_ON_ONCE(!this_cpu_read(hardirqs_enabled) && __lockdep_enabled);

Placing the failure condition first would ensure the out-of-line function is
only evaluated on the slow path when the assertion is already failing, avoiding
the function call overhead on hot paths entirely.

-- 
Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=24