2024-06-13 14:30:08

by Waiman Long

[permalink] [raw]
Subject: [PATCH] lockdep: Improve consistency between lockdep and hardware hardirqs states

There are occasional instances where a lockdep splat complains about
incorrect hardirqs state even when the hardware hardirqs state as
shown in the flags register is correct. This can happen when a
local_irq_disable() is followed by a raw_local_irq_enable(), for
instance.

It can be hard to catch this kind of mismatch as the offending call
site can be far apart from the place where the lockdep splat happens.
Add more lockdep checks into local_irq_disable() and local_irq_save()
when trace_hardirqs_off() is not being called with the hope that lockdep
splat can happen closer to the offending site.

The irqflags related lockdep code in lockdep.h are extracted into a
separate lockdep_irqflags.h header file that can be included by
irqflags.h safely to make that possible.

There shouldn't be any overhead if CONFIG_PROVE_LOCKING isn't set.

Signed-off-by: Waiman Long <[email protected]>
---
include/linux/irqflags.h | 6 +++
include/linux/lockdep.h | 64 +--------------------------
include/linux/lockdep_irqflags.h | 76 ++++++++++++++++++++++++++++++++
3 files changed, 83 insertions(+), 63 deletions(-)
create mode 100644 include/linux/lockdep_irqflags.h

diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h
index 3f003d5fde53..89c951c34a6a 100644
--- a/include/linux/irqflags.h
+++ b/include/linux/irqflags.h
@@ -191,6 +191,8 @@ extern void warn_bogus_irq_restore(void);
*/
#ifdef CONFIG_TRACE_IRQFLAGS

+#include <linux/lockdep_irqflags.h>
+
#define local_irq_enable() \
do { \
trace_hardirqs_on(); \
@@ -203,6 +205,8 @@ extern void warn_bogus_irq_restore(void);
raw_local_irq_disable(); \
if (!was_disabled) \
trace_hardirqs_off(); \
+ else \
+ lockdep_assert_irqs_disabled(); \
} while (0)

#define local_irq_save(flags) \
@@ -210,6 +214,8 @@ extern void warn_bogus_irq_restore(void);
raw_local_irq_save(flags); \
if (!raw_irqs_disabled_flags(flags)) \
trace_hardirqs_off(); \
+ else \
+ lockdep_assert_irqs_disabled(); \
} while (0)

#define local_irq_restore(flags) \
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index 08b0d1d9d78b..8a2b288bc866 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -11,8 +11,8 @@
#define __LINUX_LOCKDEP_H

#include <linux/lockdep_types.h>
+#include <linux/lockdep_irqflags.h>
#include <linux/smp.h>
-#include <asm/percpu.h>

struct task_struct;

@@ -547,72 +547,10 @@ do { \
lock_release(&(lock)->dep_map, _THIS_IP_); \
} while (0)

-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_assert_irqs_enabled() \
-do { \
- WARN_ON_ONCE(__lockdep_enabled && !this_cpu_read(hardirqs_enabled)); \
-} while (0)
-
-#define lockdep_assert_irqs_disabled() \
-do { \
- WARN_ON_ONCE(__lockdep_enabled && this_cpu_read(hardirqs_enabled)); \
-} while (0)
-
-#define lockdep_assert_in_irq() \
-do { \
- WARN_ON_ONCE(__lockdep_enabled && !this_cpu_read(hardirq_context)); \
-} while (0)
-
-#define lockdep_assert_no_hardirq() \
-do { \
- WARN_ON_ONCE(__lockdep_enabled && (this_cpu_read(hardirq_context) || \
- !this_cpu_read(hardirqs_enabled))); \
-} while (0)
-
-#define lockdep_assert_preemption_enabled() \
-do { \
- WARN_ON_ONCE(IS_ENABLED(CONFIG_PREEMPT_COUNT) && \
- __lockdep_enabled && \
- (preempt_count() != 0 || \
- !this_cpu_read(hardirqs_enabled))); \
-} while (0)
-
-#define lockdep_assert_preemption_disabled() \
-do { \
- WARN_ON_ONCE(IS_ENABLED(CONFIG_PREEMPT_COUNT) && \
- __lockdep_enabled && \
- (preempt_count() == 0 && \
- this_cpu_read(hardirqs_enabled))); \
-} while (0)
-
-/*
- * Acceptable for protecting per-CPU resources accessed from BH.
- * Much like in_softirq() - semantics are ambiguous, use carefully.
- */
-#define lockdep_assert_in_softirq() \
-do { \
- WARN_ON_ONCE(__lockdep_enabled && \
- (!in_softirq() || in_irq() || in_nmi())); \
-} while (0)
-
#else
# define might_lock(lock) do { } while (0)
# define might_lock_read(lock) do { } while (0)
# define might_lock_nested(lock, subclass) do { } while (0)
-
-# define lockdep_assert_irqs_enabled() do { } while (0)
-# define lockdep_assert_irqs_disabled() do { } while (0)
-# define lockdep_assert_in_irq() do { } while (0)
-# define lockdep_assert_no_hardirq() do { } while (0)
-
-# define lockdep_assert_preemption_enabled() do { } while (0)
-# define lockdep_assert_preemption_disabled() do { } while (0)
-# define lockdep_assert_in_softirq() do { } while (0)
#endif

#ifdef CONFIG_PROVE_RAW_LOCK_NESTING
diff --git a/include/linux/lockdep_irqflags.h b/include/linux/lockdep_irqflags.h
new file mode 100644
index 000000000000..d8633c1839d9
--- /dev/null
+++ b/include/linux/lockdep_irqflags.h
@@ -0,0 +1,76 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __LINUX_LOCKDEP_IRQFLAGS_H
+#define __LINUX_LOCKDEP_IRQFLAGS_H
+
+#include <linux/debug_locks.h>
+#include <linux/kconfig.h>
+#include <linux/preempt.h>
+#include <asm/bug.h>
+#include <asm/percpu.h>
+
+#ifdef CONFIG_PROVE_LOCKING
+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_assert_irqs_enabled() \
+do { \
+ WARN_ON_ONCE(__lockdep_enabled && !this_cpu_read(hardirqs_enabled)); \
+} while (0)
+
+#define lockdep_assert_irqs_disabled() \
+do { \
+ WARN_ON_ONCE(__lockdep_enabled && this_cpu_read(hardirqs_enabled)); \
+} while (0)
+
+#define lockdep_assert_in_irq() \
+do { \
+ WARN_ON_ONCE(__lockdep_enabled && !this_cpu_read(hardirq_context)); \
+} while (0)
+
+#define lockdep_assert_no_hardirq() \
+do { \
+ WARN_ON_ONCE(__lockdep_enabled && (this_cpu_read(hardirq_context) || \
+ !this_cpu_read(hardirqs_enabled))); \
+} while (0)
+
+#define lockdep_assert_preemption_enabled() \
+do { \
+ WARN_ON_ONCE(IS_ENABLED(CONFIG_PREEMPT_COUNT) && \
+ __lockdep_enabled && \
+ (preempt_count() != 0 || \
+ !this_cpu_read(hardirqs_enabled))); \
+} while (0)
+
+#define lockdep_assert_preemption_disabled() \
+do { \
+ WARN_ON_ONCE(IS_ENABLED(CONFIG_PREEMPT_COUNT) && \
+ __lockdep_enabled && \
+ (preempt_count() == 0 && \
+ this_cpu_read(hardirqs_enabled))); \
+} while (0)
+
+/*
+ * Acceptable for protecting per-CPU resources accessed from BH.
+ * Much like in_softirq() - semantics are ambiguous, use carefully.
+ */
+#define lockdep_assert_in_softirq() \
+do { \
+ WARN_ON_ONCE(__lockdep_enabled && \
+ (!in_softirq() || in_irq() || in_nmi())); \
+} while (0)
+
+#else
+# define lockdep_assert_irqs_enabled() do { } while (0)
+# define lockdep_assert_irqs_disabled() do { } while (0)
+# define lockdep_assert_in_irq() do { } while (0)
+# define lockdep_assert_no_hardirq() do { } while (0)
+
+# define lockdep_assert_preemption_enabled() do { } while (0)
+# define lockdep_assert_preemption_disabled() do { } while (0)
+# define lockdep_assert_in_softirq() do { } while (0)
+#endif
+
+#endif /* __LINUX_LOCKDEP_IRQFLAGS_H */
--
2.39.3



2024-06-14 14:17:29

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] lockdep: Improve consistency between lockdep and hardware hardirqs states

Hi Waiman,

kernel test robot noticed the following build errors:

[auto build test ERROR on tip/locking/core]
[also build test ERROR on linus/master v6.10-rc3 next-20240613]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Waiman-Long/lockdep-Improve-consistency-between-lockdep-and-hardware-hardirqs-states/20240613-223309
base: tip/locking/core
patch link: https://lore.kernel.org/r/20240613142929.132220-1-longman%40redhat.com
patch subject: [PATCH] lockdep: Improve consistency between lockdep and hardware hardirqs states
config: parisc-randconfig-001-20240614 (https://download.01.org/0day-ci/archive/20240614/[email protected]/config)
compiler: hppa-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240614/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All error/warnings (new ones prefixed by >>):

WARNING: unmet direct dependencies detected for REGMAP_SPI
Depends on [n]: SPI [=n]
Selected by [y]:
- AD9739A [=y] && IIO [=y] && (SPI [=n] || COMPILE_TEST [=y])
In file included from include/linux/lockdep_irqflags.h:5,
from include/linux/irqflags.h:194,
from include/asm-generic/cmpxchg-local.h:6,
from arch/parisc/include/asm/cmpxchg.h:87,
from arch/parisc/include/asm/atomic.h:10,
from include/linux/atomic.h:7,
from arch/parisc/include/asm/bitops.h:13,
from include/linux/bitops.h:63,
from include/linux/kernel.h:23,
from arch/parisc/include/asm/bug.h:5,
from include/linux/bug.h:5,
from include/linux/page-flags.h:10,
from kernel/bounds.c:10:
include/linux/debug_locks.h: In function '__debug_locks_off':
include/linux/debug_locks.h:16:16: error: implicit declaration of function 'xchg' [-Werror=implicit-function-declaration]
16 | return xchg(&debug_locks, 0);
| ^~~~
In file included from include/asm-generic/preempt.h:5,
from ./arch/parisc/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:79,
from include/linux/lockdep_irqflags.h:7:
include/linux/thread_info.h: In function 'set_ti_thread_flag':
include/linux/thread_info.h:89:9: error: implicit declaration of function 'set_bit'; did you mean 'test_bit'? [-Werror=implicit-function-declaration]
89 | set_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~
| test_bit
include/linux/thread_info.h: In function 'clear_ti_thread_flag':
include/linux/thread_info.h:94:9: error: implicit declaration of function 'clear_bit' [-Werror=implicit-function-declaration]
94 | clear_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~
include/linux/thread_info.h: In function 'test_and_set_ti_thread_flag':
include/linux/thread_info.h:108:16: error: implicit declaration of function 'test_and_set_bit' [-Werror=implicit-function-declaration]
108 | return test_and_set_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~~~~~~~~
include/linux/thread_info.h: In function 'test_and_clear_ti_thread_flag':
include/linux/thread_info.h:113:16: error: implicit declaration of function 'test_and_clear_bit'; did you mean 'const___clear_bit'? [-Werror=implicit-function-declaration]
113 | return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~~~~~~~~~~
| const___clear_bit
include/linux/thread_info.h: In function 'test_ti_thread_flag':
include/linux/bitops.h:56:47: error: implicit declaration of function '_test_bit'; did you mean 'test_bit'? [-Werror=implicit-function-declaration]
56 | #define test_bit(nr, addr) bitop(_test_bit, nr, addr)
| ^~~~~~~~~
include/linux/bitops.h:48:32: note: in definition of macro 'bitop'
48 | const##op(nr, addr) : op(nr, addr))
| ^~
include/linux/thread_info.h:118:16: note: in expansion of macro 'test_bit'
118 | return test_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~
include/linux/thread_info.h: In function 'check_copy_size':
>> include/linux/thread_info.h:249:13: error: implicit declaration of function 'WARN_ON_ONCE' [-Werror=implicit-function-declaration]
249 | if (WARN_ON_ONCE(bytes > INT_MAX))
| ^~~~~~~~~~~~
In file included from include/linux/irqflags.h:17:
include/linux/irqflags.h: In function 'class_irq_constructor':
include/asm-generic/percpu.h:31:40: error: implicit declaration of function 'raw_smp_processor_id' [-Werror=implicit-function-declaration]
31 | #define __my_cpu_offset per_cpu_offset(raw_smp_processor_id())
| ^~~~~~~~~~~~~~~~~~~~
include/linux/cleanup.h:228:9: note: in definition of macro '__DEFINE_LOCK_GUARD_0'
228 | _lock; | ^~~~~
include/linux/irqflags.h:265:1: note: in expansion of macro 'DEFINE_LOCK_GUARD_0'
265 | DEFINE_LOCK_GUARD_0(irq, local_irq_disable(), local_irq_enable())
| ^~~~~~~~~~~~~~~~~~~
include/linux/compiler_types.h:475:9: note: in expansion of macro '__compiletime_assert'
475 | __compiletime_assert(condition, msg, prefix, suffix)
| ^~~~~~~~~~~~~~~~~~~~
include/linux/compiler_types.h:487:9: note: in expansion of macro '_compiletime_assert'
487 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), | ^~~~~~~~~~~~~~~~~~
include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word'
36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), | ^~~~~~~~~~~~~
include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type'
49 | compiletime_assert_rwonce_type(x); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/asm-generic/percpu.h:127:18: note: in expansion of macro 'READ_ONCE'
127 | ___ret = READ_ONCE(*raw_cpu_ptr(&(pcp))); | ^~~~~~~~~
include/linux/percpu-defs.h:231:9: note: in expansion of macro 'RELOC_HIDE'
231 | RELOC_HIDE((typeof(*(__p)) __kernel __force *)(__p), (__offset))
| ^~~~~~~~~~
include/asm-generic/percpu.h:44:31: note: in expansion of macro 'SHIFT_PERCPU_PTR'
44 | #define arch_raw_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, __my_cpu_offset)
| ^~~~~~~~~~~~~~~~
include/asm-generic/percpu.h:31:25: note: in expansion of macro 'per_cpu_offset'
31 | #define __my_cpu_offset per_cpu_offset(raw_smp_processor_id())
| ^~~~~~~~~~~~~~
include/asm-generic/percpu.h:44:53: note: in expansion of macro '__my_cpu_offset'
44 | #define arch_raw_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, __my_cpu_offset)
| ^~~~~~~~~~~~~~~
include/linux/percpu-defs.h:242:9: note: in expansion of macro 'arch_raw_cpu_ptr'
242 | arch_raw_cpu_ptr(ptr); | ^~~~~~~~~~~~~~~~
include/asm-generic/percpu.h:127:29: note: in expansion of macro 'raw_cpu_ptr'
127 | ___ret = READ_ONCE(*raw_cpu_ptr(&(pcp))); | ^~~~~~~~~~~
include/asm-generic/percpu.h:146:25: note: in expansion of macro '__this_cpu_generic_read_nopreempt'
146 | __ret = __this_cpu_generic_read_nopreempt(pcp); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/asm-generic/percpu.h:375:41: note: in expansion of macro 'this_cpu_generic_read'
375 | #define this_cpu_read_1(pcp) this_cpu_generic_read(pcp)
| ^~~~~~~~~~~~~~~~~~~~~
include/linux/percpu-defs.h:321:30: note: in expansion of macro 'this_cpu_read_1'
321 | case 1: pscr_ret__ = stem##1(variable); break; | ^~~~
include/linux/percpu-defs.h:489:41: note: in expansion of macro '__pcpu_size_call_return'
489 | #define this_cpu_read(pcp) __pcpu_size_call_return(this_cpu_read_, pcp)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/lockdep_irqflags.h:16:50: note: in expansion of macro 'this_cpu_read'
16 | #define __lockdep_enabled (debug_locks && !this_cpu_read(lockdep_recursion))
| ^~~~~~~~~~~~~
include/linux/lockdep_irqflags.h:25:22: note: in expansion of macro '__lockdep_enabled'
25 | WARN_ON_ONCE(__lockdep_enabled && this_cpu_read(hardirqs_enabled)); | ^~~~~~~~~~~~~~~~~
include/linux/irqflags.h:209:25: note: in expansion of macro 'lockdep_assert_irqs_disabled'
209 | lockdep_assert_irqs_disabled(); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/irqflags.h:265:26: note: in expansion of macro 'local_irq_disable'
265 | DEFINE_LOCK_GUARD_0(irq, local_irq_disable(), local_irq_enable())
| ^~~~~~~~~~~~~~~~~
arch/parisc/include/asm/bitops.h: At top level:
>> arch/parisc/include/asm/bitops.h:21:24: warning: conflicting types for 'set_bit'; have 'void(int, volatile long unsigned int *)'
21 | static __inline__ void set_bit(int nr, volatile unsigned long * addr)
| ^~~~~~~
>> arch/parisc/include/asm/bitops.h:21:24: error: static declaration of 'set_bit' follows non-static declaration
include/linux/thread_info.h:89:9: note: previous implicit declaration of 'set_bit' with type 'void(int, volatile long unsigned int *)'
89 | set_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~
>> arch/parisc/include/asm/bitops.h:32:24: warning: conflicting types for 'clear_bit'; have 'void(int, volatile long unsigned int *)'
32 | static __inline__ void clear_bit(int nr, volatile unsigned long * addr)
| ^~~~~~~~~
>> arch/parisc/include/asm/bitops.h:32:24: error: static declaration of 'clear_bit' follows non-static declaration
include/linux/thread_info.h:94:9: note: previous implicit declaration of 'clear_bit' with type 'void(int, volatile long unsigned int *)'
94 | clear_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~
>> arch/parisc/include/asm/bitops.h:54:23: error: static declaration of 'test_and_set_bit' follows non-static declaration
54 | static __inline__ int test_and_set_bit(int nr, volatile unsigned long * addr)
| ^~~~~~~~~~~~~~~~
include/linux/thread_info.h:108:16: note: previous implicit declaration of 'test_and_set_bit' with type 'int()'
108 | return test_and_set_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~~~~~~~~
>> arch/parisc/include/asm/bitops.h:72:23: error: static declaration of 'test_and_clear_bit' follows non-static declaration
72 | static __inline__ int test_and_clear_bit(int nr, volatile unsigned long * addr)
| ^~~~~~~~~~~~~~~~~~
include/linux/thread_info.h:113:16: note: previous implicit declaration of 'test_and_clear_bit' with type 'int()'
113 | return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
make[3]: *** [scripts/Makefile.build:117: kernel/bounds.s] Error 1 shuffle=1782652799
make[3]: Target 'prepare' not remade because of errors.
make[2]: *** [Makefile:1208: prepare0] Error 2 shuffle=1782652799
make[2]: Target 'prepare' not remade because of errors.
make[1]: *** [Makefile:240: __sub-make] Error 2 shuffle=1782652799
make[1]: Target 'prepare' not remade because of errors.
make: *** [Makefile:240: __sub-make] Error 2 shuffle=1782652799
make: Target 'prepare' not remade because of errors.

Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for REGMAP_SPI
Depends on [n]: SPI [=n]
Selected by [y]:
- AD9739A [=y] && IIO [=y] && (SPI [=n] || COMPILE_TEST [=y])


vim +/WARN_ON_ONCE +249 include/linux/thread_info.h

^1da177e4c3f41 Linus Torvalds 2005-04-16 115
^1da177e4c3f41 Linus Torvalds 2005-04-16 116 static inline int test_ti_thread_flag(struct thread_info *ti, int flag)
^1da177e4c3f41 Linus Torvalds 2005-04-16 117 {
5548fecdff5617 Jeremy Fitzhardinge 2008-01-30 @118 return test_bit(flag, (unsigned long *)&ti->flags);
^1da177e4c3f41 Linus Torvalds 2005-04-16 119 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 120
7ad639840acf28 Mark Rutland 2021-11-29 121 /*
7ad639840acf28 Mark Rutland 2021-11-29 122 * This may be used in noinstr code, and needs to be __always_inline to prevent
7ad639840acf28 Mark Rutland 2021-11-29 123 * inadvertent instrumentation.
7ad639840acf28 Mark Rutland 2021-11-29 124 */
7ad639840acf28 Mark Rutland 2021-11-29 125 static __always_inline unsigned long read_ti_thread_flags(struct thread_info *ti)
7ad639840acf28 Mark Rutland 2021-11-29 126 {
7ad639840acf28 Mark Rutland 2021-11-29 127 return READ_ONCE(ti->flags);
7ad639840acf28 Mark Rutland 2021-11-29 128 }
7ad639840acf28 Mark Rutland 2021-11-29 129
3b66a1edb01b82 Roman Zippel 2005-11-13 130 #define set_thread_flag(flag) \
3b66a1edb01b82 Roman Zippel 2005-11-13 131 set_ti_thread_flag(current_thread_info(), flag)
3b66a1edb01b82 Roman Zippel 2005-11-13 132 #define clear_thread_flag(flag) \
3b66a1edb01b82 Roman Zippel 2005-11-13 133 clear_ti_thread_flag(current_thread_info(), flag)
93ee37c2a6a97e Dave Martin 2018-04-11 134 #define update_thread_flag(flag, value) \
93ee37c2a6a97e Dave Martin 2018-04-11 135 update_ti_thread_flag(current_thread_info(), flag, value)
3b66a1edb01b82 Roman Zippel 2005-11-13 136 #define test_and_set_thread_flag(flag) \
3b66a1edb01b82 Roman Zippel 2005-11-13 137 test_and_set_ti_thread_flag(current_thread_info(), flag)
3b66a1edb01b82 Roman Zippel 2005-11-13 138 #define test_and_clear_thread_flag(flag) \
3b66a1edb01b82 Roman Zippel 2005-11-13 139 test_and_clear_ti_thread_flag(current_thread_info(), flag)
3b66a1edb01b82 Roman Zippel 2005-11-13 140 #define test_thread_flag(flag) \
3b66a1edb01b82 Roman Zippel 2005-11-13 141 test_ti_thread_flag(current_thread_info(), flag)
7ad639840acf28 Mark Rutland 2021-11-29 142 #define read_thread_flags() \
7ad639840acf28 Mark Rutland 2021-11-29 143 read_ti_thread_flags(current_thread_info())
7ad639840acf28 Mark Rutland 2021-11-29 144
7ad639840acf28 Mark Rutland 2021-11-29 145 #define read_task_thread_flags(t) \
7ad639840acf28 Mark Rutland 2021-11-29 146 read_ti_thread_flags(task_thread_info(t))
3b66a1edb01b82 Roman Zippel 2005-11-13 147
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 148 #ifdef CONFIG_GENERIC_ENTRY
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 149 #define set_syscall_work(fl) \
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 150 set_bit(SYSCALL_WORK_BIT_##fl, &current_thread_info()->syscall_work)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 151 #define test_syscall_work(fl) \
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 152 test_bit(SYSCALL_WORK_BIT_##fl, &current_thread_info()->syscall_work)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 153 #define clear_syscall_work(fl) \
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 154 clear_bit(SYSCALL_WORK_BIT_##fl, &current_thread_info()->syscall_work)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 155
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 156 #define set_task_syscall_work(t, fl) \
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 157 set_bit(SYSCALL_WORK_BIT_##fl, &task_thread_info(t)->syscall_work)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 158 #define test_task_syscall_work(t, fl) \
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 159 test_bit(SYSCALL_WORK_BIT_##fl, &task_thread_info(t)->syscall_work)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 160 #define clear_task_syscall_work(t, fl) \
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 161 clear_bit(SYSCALL_WORK_BIT_##fl, &task_thread_info(t)->syscall_work)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 162
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 163 #else /* CONFIG_GENERIC_ENTRY */
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 164
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 165 #define set_syscall_work(fl) \
5903f61e035320 Gabriel Krisman Bertazi 2020-11-23 166 set_ti_thread_flag(current_thread_info(), TIF_##fl)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 167 #define test_syscall_work(fl) \
5903f61e035320 Gabriel Krisman Bertazi 2020-11-23 168 test_ti_thread_flag(current_thread_info(), TIF_##fl)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 169 #define clear_syscall_work(fl) \
5903f61e035320 Gabriel Krisman Bertazi 2020-11-23 170 clear_ti_thread_flag(current_thread_info(), TIF_##fl)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 171
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 172 #define set_task_syscall_work(t, fl) \
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 173 set_ti_thread_flag(task_thread_info(t), TIF_##fl)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 174 #define test_task_syscall_work(t, fl) \
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 175 test_ti_thread_flag(task_thread_info(t), TIF_##fl)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 176 #define clear_task_syscall_work(t, fl) \
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 177 clear_ti_thread_flag(task_thread_info(t), TIF_##fl)
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 178 #endif /* !CONFIG_GENERIC_ENTRY */
3136b93c3fb2b7 Gabriel Krisman Bertazi 2020-11-16 179
e4df1511e1f4bc Peter Zijlstra 2023-01-12 180 #ifdef _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H
e4df1511e1f4bc Peter Zijlstra 2023-01-12 181
e4df1511e1f4bc Peter Zijlstra 2023-01-12 182 static __always_inline bool tif_need_resched(void)
e4df1511e1f4bc Peter Zijlstra 2023-01-12 183 {
e4df1511e1f4bc Peter Zijlstra 2023-01-12 184 return arch_test_bit(TIF_NEED_RESCHED,
e4df1511e1f4bc Peter Zijlstra 2023-01-12 185 (unsigned long *)(&current_thread_info()->flags));
e4df1511e1f4bc Peter Zijlstra 2023-01-12 186 }
e4df1511e1f4bc Peter Zijlstra 2023-01-12 187
e4df1511e1f4bc Peter Zijlstra 2023-01-12 188 #else
e4df1511e1f4bc Peter Zijlstra 2023-01-12 189
e4df1511e1f4bc Peter Zijlstra 2023-01-12 190 static __always_inline bool tif_need_resched(void)
e4df1511e1f4bc Peter Zijlstra 2023-01-12 191 {
e4df1511e1f4bc Peter Zijlstra 2023-01-12 192 return test_bit(TIF_NEED_RESCHED,
e4df1511e1f4bc Peter Zijlstra 2023-01-12 193 (unsigned long *)(&current_thread_info()->flags));
e4df1511e1f4bc Peter Zijlstra 2023-01-12 194 }
e4df1511e1f4bc Peter Zijlstra 2023-01-12 195
e4df1511e1f4bc Peter Zijlstra 2023-01-12 196 #endif /* _ASM_GENERIC_BITOPS_INSTRUMENTED_NON_ATOMIC_H */
ea8117478918a4 Peter Zijlstra 2013-09-11 197
0f60a8efe4005a Kees Cook 2016-07-12 198 #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
0f60a8efe4005a Kees Cook 2016-07-12 199 static inline int arch_within_stack_frames(const void * const stack,
0f60a8efe4005a Kees Cook 2016-07-12 200 const void * const stackend,
0f60a8efe4005a Kees Cook 2016-07-12 201 const void *obj, unsigned long len)
0f60a8efe4005a Kees Cook 2016-07-12 202 {
0f60a8efe4005a Kees Cook 2016-07-12 203 return 0;
0f60a8efe4005a Kees Cook 2016-07-12 204 }
0f60a8efe4005a Kees Cook 2016-07-12 205 #endif
0f60a8efe4005a Kees Cook 2016-07-12 206
f5509cc18daa7f Kees Cook 2016-06-07 207 #ifdef CONFIG_HARDENED_USERCOPY
f5509cc18daa7f Kees Cook 2016-06-07 208 extern void __check_object_size(const void *ptr, unsigned long n,
f5509cc18daa7f Kees Cook 2016-06-07 209 bool to_user);
f5509cc18daa7f Kees Cook 2016-06-07 210
a85d6b8242dc78 Kees Cook 2016-09-07 211 static __always_inline void check_object_size(const void *ptr, unsigned long n,
f5509cc18daa7f Kees Cook 2016-06-07 212 bool to_user)
f5509cc18daa7f Kees Cook 2016-06-07 213 {
81409e9e280588 Kees Cook 2016-08-31 214 if (!__builtin_constant_p(n))
f5509cc18daa7f Kees Cook 2016-06-07 215 __check_object_size(ptr, n, to_user);
f5509cc18daa7f Kees Cook 2016-06-07 216 }
f5509cc18daa7f Kees Cook 2016-06-07 217 #else
f5509cc18daa7f Kees Cook 2016-06-07 218 static inline void check_object_size(const void *ptr, unsigned long n,
f5509cc18daa7f Kees Cook 2016-06-07 219 bool to_user)
f5509cc18daa7f Kees Cook 2016-06-07 220 { }
f5509cc18daa7f Kees Cook 2016-06-07 221 #endif /* CONFIG_HARDENED_USERCOPY */
f5509cc18daa7f Kees Cook 2016-06-07 222
b0377fedb65280 Al Viro 2017-06-29 223 extern void __compiletime_error("copy source size is too small")
b0377fedb65280 Al Viro 2017-06-29 224 __bad_copy_from(void);
b0377fedb65280 Al Viro 2017-06-29 225 extern void __compiletime_error("copy destination size is too small")
b0377fedb65280 Al Viro 2017-06-29 226 __bad_copy_to(void);
b0377fedb65280 Al Viro 2017-06-29 227
ad7489d5262d2a Christophe Leroy 2022-03-22 228 void __copy_overflow(int size, unsigned long count);
ad7489d5262d2a Christophe Leroy 2022-03-22 229
b0377fedb65280 Al Viro 2017-06-29 230 static inline void copy_overflow(int size, unsigned long count)
b0377fedb65280 Al Viro 2017-06-29 231 {
ad7489d5262d2a Christophe Leroy 2022-03-22 232 if (IS_ENABLED(CONFIG_BUG))
ad7489d5262d2a Christophe Leroy 2022-03-22 233 __copy_overflow(size, count);
b0377fedb65280 Al Viro 2017-06-29 234 }
b0377fedb65280 Al Viro 2017-06-29 235
9dd819a15162f8 Kees Cook 2019-09-25 236 static __always_inline __must_check bool
b0377fedb65280 Al Viro 2017-06-29 237 check_copy_size(const void *addr, size_t bytes, bool is_source)
b0377fedb65280 Al Viro 2017-06-29 238 {
c80d92fbb67b2c Kees Cook 2021-06-17 239 int sz = __builtin_object_size(addr, 0);
b0377fedb65280 Al Viro 2017-06-29 240 if (unlikely(sz >= 0 && sz < bytes)) {
b0377fedb65280 Al Viro 2017-06-29 241 if (!__builtin_constant_p(bytes))
b0377fedb65280 Al Viro 2017-06-29 242 copy_overflow(sz, bytes);
b0377fedb65280 Al Viro 2017-06-29 243 else if (is_source)
b0377fedb65280 Al Viro 2017-06-29 244 __bad_copy_from();
b0377fedb65280 Al Viro 2017-06-29 245 else
b0377fedb65280 Al Viro 2017-06-29 246 __bad_copy_to();
b0377fedb65280 Al Viro 2017-06-29 247 return false;
b0377fedb65280 Al Viro 2017-06-29 248 }
6d13de1489b6bf Kees Cook 2019-12-04 @249 if (WARN_ON_ONCE(bytes > INT_MAX))
6d13de1489b6bf Kees Cook 2019-12-04 250 return false;
b0377fedb65280 Al Viro 2017-06-29 251 check_object_size(addr, bytes, is_source);
b0377fedb65280 Al Viro 2017-06-29 252 return true;
b0377fedb65280 Al Viro 2017-06-29 253 }
b0377fedb65280 Al Viro 2017-06-29 254

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

2024-06-14 14:30:58

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] lockdep: Improve consistency between lockdep and hardware hardirqs states

Hi Waiman,

kernel test robot noticed the following build errors:

[auto build test ERROR on tip/locking/core]
[also build test ERROR on linus/master v6.10-rc3 next-20240613]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Waiman-Long/lockdep-Improve-consistency-between-lockdep-and-hardware-hardirqs-states/20240613-223309
base: tip/locking/core
patch link: https://lore.kernel.org/r/20240613142929.132220-1-longman%40redhat.com
patch subject: [PATCH] lockdep: Improve consistency between lockdep and hardware hardirqs states
config: csky-randconfig-002-20240614 (https://download.01.org/0day-ci/archive/20240614/[email protected]/config)
compiler: csky-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240614/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All error/warnings (new ones prefixed by >>):

In file included from include/linux/lockdep_irqflags.h:5,
from include/linux/irqflags.h:194,
from include/asm-generic/cmpxchg.h:15,
from arch/csky/include/asm/cmpxchg.h:162,
from include/asm-generic/atomic.h:12,
from arch/csky/include/asm/atomic.h:199,
from include/linux/atomic.h:7,
from include/asm-generic/bitops/lock.h:5,
from arch/csky/include/asm/bitops.h:69,
from include/linux/bitops.h:63,
from include/linux/log2.h:12,
from kernel/bounds.c:13:
include/linux/debug_locks.h: In function '__debug_locks_off':
>> include/linux/debug_locks.h:16:16: error: implicit declaration of function 'xchg' [-Werror=implicit-function-declaration]
16 | return xchg(&debug_locks, 0);
| ^~~~
In file included from arch/csky/include/asm/page.h:92,
from arch/csky/include/asm/thread_info.h:9,
from include/linux/thread_info.h:60,
from include/asm-generic/preempt.h:5,
from ./arch/csky/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:79,
from include/linux/lockdep_irqflags.h:7:
include/asm-generic/getorder.h: In function 'get_order':
>> include/asm-generic/getorder.h:38:24: error: implicit declaration of function 'ilog2' [-Werror=implicit-function-declaration]
38 | return ilog2((size) - 1) - PAGE_SHIFT + 1;
| ^~~~~
include/linux/thread_info.h: In function 'set_ti_thread_flag':
>> include/linux/thread_info.h:89:9: error: implicit declaration of function 'set_bit'; did you mean 'test_bit'? [-Werror=implicit-function-declaration]
89 | set_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~
| test_bit
include/linux/thread_info.h: In function 'clear_ti_thread_flag':
>> include/linux/thread_info.h:94:9: error: implicit declaration of function 'clear_bit' [-Werror=implicit-function-declaration]
94 | clear_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~
include/linux/thread_info.h: In function 'test_and_set_ti_thread_flag':
>> include/linux/thread_info.h:108:16: error: implicit declaration of function 'test_and_set_bit' [-Werror=implicit-function-declaration]
108 | return test_and_set_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~~~~~~~~
include/linux/thread_info.h: In function 'test_and_clear_ti_thread_flag':
>> include/linux/thread_info.h:113:16: error: implicit declaration of function 'test_and_clear_bit'; did you mean 'const___clear_bit'? [-Werror=implicit-function-declaration]
113 | return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~~~~~~~~~~
| const___clear_bit
include/linux/thread_info.h: In function 'test_ti_thread_flag':
>> include/linux/bitops.h:56:47: error: implicit declaration of function '_test_bit'; did you mean 'test_bit'? [-Werror=implicit-function-declaration]
56 | #define test_bit(nr, addr) bitop(_test_bit, nr, addr)
| ^~~~~~~~~
include/linux/bitops.h:48:32: note: in definition of macro 'bitop'
48 | const##op(nr, addr) : op(nr, addr))
| ^~
include/linux/thread_info.h:118:16: note: in expansion of macro 'test_bit'
118 | return test_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~
In file included from include/asm-generic/bitops/atomic.h:68,
from arch/csky/include/asm/bitops.h:70:
include/asm-generic/bitops/instrumented-atomic.h: At top level:
>> include/asm-generic/bitops/instrumented-atomic.h:26:29: warning: conflicting types for 'set_bit'; have 'void(long int, volatile long unsigned int *)'
26 | static __always_inline void set_bit(long nr, volatile unsigned long *addr)
| ^~~~~~~
>> include/asm-generic/bitops/instrumented-atomic.h:26:29: error: static declaration of 'set_bit' follows non-static declaration
include/linux/thread_info.h:89:9: note: previous implicit declaration of 'set_bit' with type 'void(long int, volatile long unsigned int *)'
89 | set_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~
>> include/asm-generic/bitops/instrumented-atomic.h:39:29: warning: conflicting types for 'clear_bit'; have 'void(long int, volatile long unsigned int *)'
39 | static __always_inline void clear_bit(long nr, volatile unsigned long *addr)
| ^~~~~~~~~
>> include/asm-generic/bitops/instrumented-atomic.h:39:29: error: static declaration of 'clear_bit' follows non-static declaration
include/linux/thread_info.h:94:9: note: previous implicit declaration of 'clear_bit' with type 'void(long int, volatile long unsigned int *)'
94 | clear_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~
>> include/asm-generic/bitops/instrumented-atomic.h:68:29: error: conflicting types for 'test_and_set_bit'; have 'bool(long int, volatile long unsigned int *)' {aka '_Bool(long int, volatile long unsigned int *)'}
68 | static __always_inline bool test_and_set_bit(long nr, volatile unsigned long *addr)
| ^~~~~~~~~~~~~~~~
include/linux/thread_info.h:108:16: note: previous implicit declaration of 'test_and_set_bit' with type 'int()'
108 | return test_and_set_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~~~~~~~~
>> include/asm-generic/bitops/instrumented-atomic.h:82:29: error: conflicting types for 'test_and_clear_bit'; have 'bool(long int, volatile long unsigned int *)' {aka '_Bool(long int, volatile long unsigned int *)'}
82 | static __always_inline bool test_and_clear_bit(long nr, volatile unsigned long *addr)
| ^~~~~~~~~~~~~~~~~~
include/linux/thread_info.h:113:16: note: previous implicit declaration of 'test_and_clear_bit' with type 'int()'
113 | return test_and_clear_bit(flag, (unsigned long *)&ti->flags);
| ^~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
make[3]: *** [scripts/Makefile.build:117: kernel/bounds.s] Error 1 shuffle=1930064556
make[3]: Target 'prepare' not remade because of errors.
make[2]: *** [Makefile:1208: prepare0] Error 2 shuffle=1930064556
make[2]: Target 'prepare' not remade because of errors.
make[1]: *** [Makefile:240: __sub-make] Error 2 shuffle=1930064556
make[1]: Target 'prepare' not remade because of errors.
make: *** [Makefile:240: __sub-make] Error 2 shuffle=1930064556
make: Target 'prepare' not remade because of errors.


vim +/xchg +16 include/linux/debug_locks.h

9a11b49a805665 Ingo Molnar 2006-07-03 12
9eeba6138cefc0 Frederic Weisbecker 2009-04-11 13
6eebad1ad303db Peter Zijlstra 2020-06-03 14 static __always_inline int __debug_locks_off(void)
9eeba6138cefc0 Frederic Weisbecker 2009-04-11 15 {
9eeba6138cefc0 Frederic Weisbecker 2009-04-11 @16 return xchg(&debug_locks, 0);
9eeba6138cefc0 Frederic Weisbecker 2009-04-11 17 }
9eeba6138cefc0 Frederic Weisbecker 2009-04-11 18

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki