* [PATCH RESEND] lockdep: Move list.h inclusion into lockdep.h
@ 2020-07-16 6:36 Herbert Xu
2020-07-16 8:30 ` Will Deacon
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Herbert Xu @ 2020-07-16 6:36 UTC (permalink / raw)
To: Peter Zijlstra
Cc: Petr Mladek, Sergey Senozhatsky, Steven Rostedt,
Linux Kernel Mailing List, Ingo Molnar, Will Deacon,
Heiko Carstens, Vasily Gorbik, Christian Borntraeger, linux-s390,
Stephen Rothwell, Linux Next Mailing List, Andy Shevchenko
Currently lockdep_types.h includes list.h without actually using any
of its macros or functions. All it needs are the type definitions
which were moved into types.h long ago. This potentially causes
inclusion loops because both are included by many core header
files.
This patch moves the list.h inclusion into lockdep.h. Note that
we could probably remove it completely but that could potentially
result in compile failures should any end users not include list.h
directly and also be unlucky enough to not get list.h via some other
header file.
Reported-by: Petr Mladek <pmladek@suse.com>
Tested-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
index 3b73cf84f77d..b1ad5c045353 100644
--- a/include/linux/lockdep.h
+++ b/include/linux/lockdep.h
@@ -21,6 +21,7 @@ extern int lock_stat;
#ifdef CONFIG_LOCKDEP
#include <linux/linkage.h>
+#include <linux/list.h>
#include <linux/debug_locks.h>
#include <linux/stacktrace.h>
diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h
index 7b9350624577..bb35b449f533 100644
--- a/include/linux/lockdep_types.h
+++ b/include/linux/lockdep_types.h
@@ -32,8 +32,6 @@ enum lockdep_wait_type {
#ifdef CONFIG_LOCKDEP
-#include <linux/list.h>
-
/*
* We'd rather not expose kernel/lockdep_states.h this wide, but we do need
* the total number of states... :-(
--
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH RESEND] lockdep: Move list.h inclusion into lockdep.h 2020-07-16 6:36 [PATCH RESEND] lockdep: Move list.h inclusion into lockdep.h Herbert Xu @ 2020-07-16 8:30 ` Will Deacon 2020-07-17 11:22 ` [tip: locking/core] " tip-bot2 for Herbert Xu 2020-07-28 8:50 ` [tip: locking/header] " tip-bot2 for Herbert Xu 2 siblings, 0 replies; 5+ messages in thread From: Will Deacon @ 2020-07-16 8:30 UTC (permalink / raw) To: Herbert Xu Cc: Peter Zijlstra, Petr Mladek, Sergey Senozhatsky, Steven Rostedt, Linux Kernel Mailing List, Ingo Molnar, Heiko Carstens, Vasily Gorbik, Christian Borntraeger, linux-s390, Stephen Rothwell, Linux Next Mailing List, Andy Shevchenko On Thu, Jul 16, 2020 at 04:36:50PM +1000, Herbert Xu wrote: > Currently lockdep_types.h includes list.h without actually using any > of its macros or functions. All it needs are the type definitions > which were moved into types.h long ago. This potentially causes > inclusion loops because both are included by many core header > files. > > This patch moves the list.h inclusion into lockdep.h. Note that > we could probably remove it completely but that could potentially > result in compile failures should any end users not include list.h > directly and also be unlucky enough to not get list.h via some other > header file. > > Reported-by: Petr Mladek <pmladek@suse.com> > Tested-by: Petr Mladek <pmladek@suse.com> > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Acked-by: Will Deacon <will@kernel.org> Will ^ permalink raw reply [flat|nested] 5+ messages in thread
* [tip: locking/core] lockdep: Move list.h inclusion into lockdep.h 2020-07-16 6:36 [PATCH RESEND] lockdep: Move list.h inclusion into lockdep.h Herbert Xu 2020-07-16 8:30 ` Will Deacon @ 2020-07-17 11:22 ` tip-bot2 for Herbert Xu 2020-07-28 8:50 ` [tip: locking/header] " tip-bot2 for Herbert Xu 2 siblings, 0 replies; 5+ messages in thread From: tip-bot2 for Herbert Xu @ 2020-07-17 11:22 UTC (permalink / raw) To: linux-tip-commits Cc: Petr Mladek, Herbert Xu, Peter Zijlstra (Intel), x86, LKML The following commit has been merged into the locking/core branch of tip: Commit-ID: 5be542e945cb39a2457aa2cfe8b84aac95ef0f2d Gitweb: https://git.kernel.org/tip/5be542e945cb39a2457aa2cfe8b84aac95ef0f2d Author: Herbert Xu <herbert@gondor.apana.org.au> AuthorDate: Thu, 16 Jul 2020 16:36:50 +10:00 Committer: Peter Zijlstra <peterz@infradead.org> CommitterDate: Thu, 16 Jul 2020 23:19:51 +02:00 lockdep: Move list.h inclusion into lockdep.h Currently lockdep_types.h includes list.h without actually using any of its macros or functions. All it needs are the type definitions which were moved into types.h long ago. This potentially causes inclusion loops because both are included by many core header files. This patch moves the list.h inclusion into lockdep.h. Note that we could probably remove it completely but that could potentially result in compile failures should any end users not include list.h directly and also be unlucky enough to not get list.h via some other header file. Reported-by: Petr Mladek <pmladek@suse.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Petr Mladek <pmladek@suse.com> Link: https://lkml.kernel.org/r/20200716063649.GA23065@gondor.apana.org.au --- include/linux/lockdep.h | 1 + include/linux/lockdep_types.h | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index fd04b9e..7aafba0 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -22,6 +22,7 @@ extern int lock_stat; #ifdef CONFIG_LOCKDEP #include <linux/linkage.h> +#include <linux/list.h> #include <linux/debug_locks.h> #include <linux/stacktrace.h> diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h index 7b93506..bb35b44 100644 --- a/include/linux/lockdep_types.h +++ b/include/linux/lockdep_types.h @@ -32,8 +32,6 @@ enum lockdep_wait_type { #ifdef CONFIG_LOCKDEP -#include <linux/list.h> - /* * We'd rather not expose kernel/lockdep_states.h this wide, but we do need * the total number of states... :-( ^ permalink raw reply [flat|nested] 5+ messages in thread
* [tip: locking/header] lockdep: Move list.h inclusion into lockdep.h 2020-07-16 6:36 [PATCH RESEND] lockdep: Move list.h inclusion into lockdep.h Herbert Xu 2020-07-16 8:30 ` Will Deacon 2020-07-17 11:22 ` [tip: locking/core] " tip-bot2 for Herbert Xu @ 2020-07-28 8:50 ` tip-bot2 for Herbert Xu 2 siblings, 0 replies; 5+ messages in thread From: tip-bot2 for Herbert Xu @ 2020-07-28 8:50 UTC (permalink / raw) To: linux-tip-commits Cc: Petr Mladek, Herbert Xu, Peter Zijlstra (Intel), x86, LKML The following commit has been merged into the locking/header branch of tip: Commit-ID: e885d5d94793ef342e49d55672baabbc16e32bb1 Gitweb: https://git.kernel.org/tip/e885d5d94793ef342e49d55672baabbc16e32bb1 Author: Herbert Xu <herbert@gondor.apana.org.au> AuthorDate: Thu, 16 Jul 2020 16:36:50 +10:00 Committer: Peter Zijlstra <peterz@infradead.org> CommitterDate: Tue, 28 Jul 2020 10:45:46 +02:00 lockdep: Move list.h inclusion into lockdep.h Currently lockdep_types.h includes list.h without actually using any of its macros or functions. All it needs are the type definitions which were moved into types.h long ago. This potentially causes inclusion loops because both are included by many core header files. This patch moves the list.h inclusion into lockdep.h. Note that we could probably remove it completely but that could potentially result in compile failures should any end users not include list.h directly and also be unlucky enough to not get list.h via some other header file. Reported-by: Petr Mladek <pmladek@suse.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Petr Mladek <pmladek@suse.com> Link: https://lkml.kernel.org/r/20200716063649.GA23065@gondor.apana.org.au --- include/linux/lockdep.h | 1 + include/linux/lockdep_types.h | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 3b73cf8..b1ad5c0 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -21,6 +21,7 @@ extern int lock_stat; #ifdef CONFIG_LOCKDEP #include <linux/linkage.h> +#include <linux/list.h> #include <linux/debug_locks.h> #include <linux/stacktrace.h> diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h index 7b93506..bb35b44 100644 --- a/include/linux/lockdep_types.h +++ b/include/linux/lockdep_types.h @@ -32,8 +32,6 @@ enum lockdep_wait_type { #ifdef CONFIG_LOCKDEP -#include <linux/list.h> - /* * We'd rather not expose kernel/lockdep_states.h this wide, but we do need * the total number of states... :-( ^ permalink raw reply [flat|nested] 5+ messages in thread
* [v3 PATCH 0/2] Splitting ratelimit.h and lockdep.h @ 2020-06-17 7:15 Herbert Xu 2020-06-17 7:17 ` [v3 PATCH 1/2] lockdep: Split header file into lockdep and lockdep_types Herbert Xu 0 siblings, 1 reply; 5+ messages in thread From: Herbert Xu @ 2020-06-17 7:15 UTC (permalink / raw) To: Petr Mladek, Sergey Senozhatsky, Steven Rostedt, Linux Kernel Mailing List, Peter Zijlstra, Ingo Molnar, Will Deacon, Heiko Carstens, Vasily Gorbik, Christian Borntraeger, linux-s390 Hi: v3 Split into two patches. -- This patch series splits ratelimit.h and lockdep.h to avoid header loops involving kernel.h and printk.h. Cheers, -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 5+ messages in thread
* [v3 PATCH 1/2] lockdep: Split header file into lockdep and lockdep_types 2020-06-17 7:15 [v3 PATCH 0/2] Splitting ratelimit.h and lockdep.h Herbert Xu @ 2020-06-17 7:17 ` Herbert Xu 2020-06-17 8:24 ` Peter Zijlstra 0 siblings, 1 reply; 5+ messages in thread From: Herbert Xu @ 2020-06-17 7:17 UTC (permalink / raw) To: Petr Mladek, Sergey Senozhatsky, Steven Rostedt, Linux Kernel Mailing List, Peter Zijlstra, Ingo Molnar, Will Deacon, Heiko Carstens, Vasily Gorbik, Christian Borntraeger, linux-s390 There is a header file inclusion loop between asm-generic/bug.h and linux/kernel.h. This causes potential compile failurs depending on the which file is included first. One way of breaking this loop is to stop spinlock_types.h from including lockdep.h. This patch splits lockdep.h into two files for this purpose. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> Acked-by: Petr Mladek <pmladek@suse.com> Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> --- include/linux/lockdep.h | 178 ------------------------------------- include/linux/lockdep_types.h | 196 +++++++++++++++++++++++++++++++++++++++++ include/linux/spinlock.h | 1 include/linux/spinlock_types.h | 2 4 files changed, 200 insertions(+), 177 deletions(-) diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 8fce5c98a4b0e..3b73cf84f77dd 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -10,181 +10,20 @@ #ifndef __LINUX_LOCKDEP_H #define __LINUX_LOCKDEP_H +#include <linux/lockdep_types.h> + struct task_struct; -struct lockdep_map; /* for sysctl */ extern int prove_locking; extern int lock_stat; -#define MAX_LOCKDEP_SUBCLASSES 8UL - -#include <linux/types.h> - -enum lockdep_wait_type { - LD_WAIT_INV = 0, /* not checked, catch all */ - - LD_WAIT_FREE, /* wait free, rcu etc.. */ - LD_WAIT_SPIN, /* spin loops, raw_spinlock_t etc.. */ - -#ifdef CONFIG_PROVE_RAW_LOCK_NESTING - LD_WAIT_CONFIG, /* CONFIG_PREEMPT_LOCK, spinlock_t etc.. */ -#else - LD_WAIT_CONFIG = LD_WAIT_SPIN, -#endif - LD_WAIT_SLEEP, /* sleeping locks, mutex_t etc.. */ - - LD_WAIT_MAX, /* must be last */ -}; - #ifdef CONFIG_LOCKDEP #include <linux/linkage.h> -#include <linux/list.h> #include <linux/debug_locks.h> #include <linux/stacktrace.h> -/* - * We'd rather not expose kernel/lockdep_states.h this wide, but we do need - * the total number of states... :-( - */ -#define XXX_LOCK_USAGE_STATES (1+2*4) - -/* - * NR_LOCKDEP_CACHING_CLASSES ... Number of classes - * cached in the instance of lockdep_map - * - * Currently main class (subclass == 0) and signle depth subclass - * are cached in lockdep_map. This optimization is mainly targeting - * on rq->lock. double_rq_lock() acquires this highly competitive with - * single depth. - */ -#define NR_LOCKDEP_CACHING_CLASSES 2 - -/* - * A lockdep key is associated with each lock object. For static locks we use - * the lock address itself as the key. Dynamically allocated lock objects can - * have a statically or dynamically allocated key. Dynamically allocated lock - * keys must be registered before being used and must be unregistered before - * the key memory is freed. - */ -struct lockdep_subclass_key { - char __one_byte; -} __attribute__ ((__packed__)); - -/* hash_entry is used to keep track of dynamically allocated keys. */ -struct lock_class_key { - union { - struct hlist_node hash_entry; - struct lockdep_subclass_key subkeys[MAX_LOCKDEP_SUBCLASSES]; - }; -}; - -extern struct lock_class_key __lockdep_no_validate__; - -struct lock_trace; - -#define LOCKSTAT_POINTS 4 - -/* - * The lock-class itself. The order of the structure members matters. - * reinit_class() zeroes the key member and all subsequent members. - */ -struct lock_class { - /* - * class-hash: - */ - struct hlist_node hash_entry; - - /* - * Entry in all_lock_classes when in use. Entry in free_lock_classes - * when not in use. Instances that are being freed are on one of the - * zapped_classes lists. - */ - struct list_head lock_entry; - - /* - * These fields represent a directed graph of lock dependencies, - * to every node we attach a list of "forward" and a list of - * "backward" graph nodes. - */ - struct list_head locks_after, locks_before; - - const struct lockdep_subclass_key *key; - unsigned int subclass; - unsigned int dep_gen_id; - - /* - * IRQ/softirq usage tracking bits: - */ - unsigned long usage_mask; - const struct lock_trace *usage_traces[XXX_LOCK_USAGE_STATES]; - - /* - * Generation counter, when doing certain classes of graph walking, - * to ensure that we check one node only once: - */ - int name_version; - const char *name; - - short wait_type_inner; - short wait_type_outer; - -#ifdef CONFIG_LOCK_STAT - unsigned long contention_point[LOCKSTAT_POINTS]; - unsigned long contending_point[LOCKSTAT_POINTS]; -#endif -} __no_randomize_layout; - -#ifdef CONFIG_LOCK_STAT -struct lock_time { - s64 min; - s64 max; - s64 total; - unsigned long nr; -}; - -enum bounce_type { - bounce_acquired_write, - bounce_acquired_read, - bounce_contended_write, - bounce_contended_read, - nr_bounce_types, - - bounce_acquired = bounce_acquired_write, - bounce_contended = bounce_contended_write, -}; - -struct lock_class_stats { - unsigned long contention_point[LOCKSTAT_POINTS]; - unsigned long contending_point[LOCKSTAT_POINTS]; - struct lock_time read_waittime; - struct lock_time write_waittime; - struct lock_time read_holdtime; - struct lock_time write_holdtime; - unsigned long bounces[nr_bounce_types]; -}; - -struct lock_class_stats lock_stats(struct lock_class *class); -void clear_lock_stats(struct lock_class *class); -#endif - -/* - * Map the lock object (the lock instance) to the lock-class object. - * This is embedded into specific lock instances: - */ -struct lockdep_map { - struct lock_class_key *key; - struct lock_class *class_cache[NR_LOCKDEP_CACHING_CLASSES]; - const char *name; - short wait_type_outer; /* can be taken in this context */ - short wait_type_inner; /* presents this context */ -#ifdef CONFIG_LOCK_STAT - int cpu; - unsigned long ip; -#endif -}; - static inline void lockdep_copy_map(struct lockdep_map *to, struct lockdep_map *from) { @@ -440,8 +279,6 @@ static inline void lock_set_subclass(struct lockdep_map *lock, extern void lock_downgrade(struct lockdep_map *lock, unsigned long ip); -struct pin_cookie { unsigned int val; }; - #define NIL_COOKIE (struct pin_cookie){ .val = 0U, } extern struct pin_cookie lock_pin_lock(struct lockdep_map *lock); @@ -520,10 +357,6 @@ static inline void lockdep_set_selftest_task(struct task_struct *task) # define lockdep_reset() do { debug_locks = 1; } while (0) # define lockdep_free_key_range(start, size) do { } while (0) # define lockdep_sys_exit() do { } while (0) -/* - * The class key takes no space if lockdep is disabled: - */ -struct lock_class_key { }; static inline void lockdep_register_key(struct lock_class_key *key) { @@ -533,11 +366,6 @@ static inline void lockdep_unregister_key(struct lock_class_key *key) { } -/* - * The lockdep_map takes no space if lockdep is disabled: - */ -struct lockdep_map { }; - #define lockdep_depth(tsk) (0) #define lockdep_is_held_type(l, r) (1) @@ -549,8 +377,6 @@ struct lockdep_map { }; #define lockdep_recursing(tsk) (0) -struct pin_cookie { }; - #define NIL_COOKIE (struct pin_cookie){ } #define lockdep_pin_lock(l) ({ struct pin_cookie cookie = { }; cookie; }) diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h new file mode 100644 index 0000000000000..7b9350624577c --- /dev/null +++ b/include/linux/lockdep_types.h @@ -0,0 +1,196 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Runtime locking correctness validator + * + * Copyright (C) 2006,2007 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> + * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra + * + * see Documentation/locking/lockdep-design.rst for more details. + */ +#ifndef __LINUX_LOCKDEP_TYPES_H +#define __LINUX_LOCKDEP_TYPES_H + +#include <linux/types.h> + +#define MAX_LOCKDEP_SUBCLASSES 8UL + +enum lockdep_wait_type { + LD_WAIT_INV = 0, /* not checked, catch all */ + + LD_WAIT_FREE, /* wait free, rcu etc.. */ + LD_WAIT_SPIN, /* spin loops, raw_spinlock_t etc.. */ + +#ifdef CONFIG_PROVE_RAW_LOCK_NESTING + LD_WAIT_CONFIG, /* CONFIG_PREEMPT_LOCK, spinlock_t etc.. */ +#else + LD_WAIT_CONFIG = LD_WAIT_SPIN, +#endif + LD_WAIT_SLEEP, /* sleeping locks, mutex_t etc.. */ + + LD_WAIT_MAX, /* must be last */ +}; + +#ifdef CONFIG_LOCKDEP + +#include <linux/list.h> + +/* + * We'd rather not expose kernel/lockdep_states.h this wide, but we do need + * the total number of states... :-( + */ +#define XXX_LOCK_USAGE_STATES (1+2*4) + +/* + * NR_LOCKDEP_CACHING_CLASSES ... Number of classes + * cached in the instance of lockdep_map + * + * Currently main class (subclass == 0) and signle depth subclass + * are cached in lockdep_map. This optimization is mainly targeting + * on rq->lock. double_rq_lock() acquires this highly competitive with + * single depth. + */ +#define NR_LOCKDEP_CACHING_CLASSES 2 + +/* + * A lockdep key is associated with each lock object. For static locks we use + * the lock address itself as the key. Dynamically allocated lock objects can + * have a statically or dynamically allocated key. Dynamically allocated lock + * keys must be registered before being used and must be unregistered before + * the key memory is freed. + */ +struct lockdep_subclass_key { + char __one_byte; +} __attribute__ ((__packed__)); + +/* hash_entry is used to keep track of dynamically allocated keys. */ +struct lock_class_key { + union { + struct hlist_node hash_entry; + struct lockdep_subclass_key subkeys[MAX_LOCKDEP_SUBCLASSES]; + }; +}; + +extern struct lock_class_key __lockdep_no_validate__; + +struct lock_trace; + +#define LOCKSTAT_POINTS 4 + +/* + * The lock-class itself. The order of the structure members matters. + * reinit_class() zeroes the key member and all subsequent members. + */ +struct lock_class { + /* + * class-hash: + */ + struct hlist_node hash_entry; + + /* + * Entry in all_lock_classes when in use. Entry in free_lock_classes + * when not in use. Instances that are being freed are on one of the + * zapped_classes lists. + */ + struct list_head lock_entry; + + /* + * These fields represent a directed graph of lock dependencies, + * to every node we attach a list of "forward" and a list of + * "backward" graph nodes. + */ + struct list_head locks_after, locks_before; + + const struct lockdep_subclass_key *key; + unsigned int subclass; + unsigned int dep_gen_id; + + /* + * IRQ/softirq usage tracking bits: + */ + unsigned long usage_mask; + const struct lock_trace *usage_traces[XXX_LOCK_USAGE_STATES]; + + /* + * Generation counter, when doing certain classes of graph walking, + * to ensure that we check one node only once: + */ + int name_version; + const char *name; + + short wait_type_inner; + short wait_type_outer; + +#ifdef CONFIG_LOCK_STAT + unsigned long contention_point[LOCKSTAT_POINTS]; + unsigned long contending_point[LOCKSTAT_POINTS]; +#endif +} __no_randomize_layout; + +#ifdef CONFIG_LOCK_STAT +struct lock_time { + s64 min; + s64 max; + s64 total; + unsigned long nr; +}; + +enum bounce_type { + bounce_acquired_write, + bounce_acquired_read, + bounce_contended_write, + bounce_contended_read, + nr_bounce_types, + + bounce_acquired = bounce_acquired_write, + bounce_contended = bounce_contended_write, +}; + +struct lock_class_stats { + unsigned long contention_point[LOCKSTAT_POINTS]; + unsigned long contending_point[LOCKSTAT_POINTS]; + struct lock_time read_waittime; + struct lock_time write_waittime; + struct lock_time read_holdtime; + struct lock_time write_holdtime; + unsigned long bounces[nr_bounce_types]; +}; + +struct lock_class_stats lock_stats(struct lock_class *class); +void clear_lock_stats(struct lock_class *class); +#endif + +/* + * Map the lock object (the lock instance) to the lock-class object. + * This is embedded into specific lock instances: + */ +struct lockdep_map { + struct lock_class_key *key; + struct lock_class *class_cache[NR_LOCKDEP_CACHING_CLASSES]; + const char *name; + short wait_type_outer; /* can be taken in this context */ + short wait_type_inner; /* presents this context */ +#ifdef CONFIG_LOCK_STAT + int cpu; + unsigned long ip; +#endif +}; + +struct pin_cookie { unsigned int val; }; + +#else /* !CONFIG_LOCKDEP */ + +/* + * The class key takes no space if lockdep is disabled: + */ +struct lock_class_key { }; + +/* + * The lockdep_map takes no space if lockdep is disabled: + */ +struct lockdep_map { }; + +struct pin_cookie { }; + +#endif /* !LOCKDEP */ + +#endif /* __LINUX_LOCKDEP_TYPES_H */ diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h index d3770b3f9d9a9..f2f12d746dbdb 100644 --- a/include/linux/spinlock.h +++ b/include/linux/spinlock.h @@ -56,6 +56,7 @@ #include <linux/kernel.h> #include <linux/stringify.h> #include <linux/bottom_half.h> +#include <linux/lockdep.h> #include <asm/barrier.h> #include <asm/mmiowb.h> diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h index 6102e6bff3aeb..b981caafe8bf1 100644 --- a/include/linux/spinlock_types.h +++ b/include/linux/spinlock_types.h @@ -15,7 +15,7 @@ # include <linux/spinlock_types_up.h> #endif -#include <linux/lockdep.h> +#include <linux/lockdep_types.h> typedef struct raw_spinlock { arch_spinlock_t raw_lock; ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [v3 PATCH 1/2] lockdep: Split header file into lockdep and lockdep_types 2020-06-17 7:17 ` [v3 PATCH 1/2] lockdep: Split header file into lockdep and lockdep_types Herbert Xu @ 2020-06-17 8:24 ` Peter Zijlstra 2020-06-17 12:24 ` Petr Mladek 0 siblings, 1 reply; 5+ messages in thread From: Peter Zijlstra @ 2020-06-17 8:24 UTC (permalink / raw) To: Herbert Xu Cc: Petr Mladek, Sergey Senozhatsky, Steven Rostedt, Linux Kernel Mailing List, Ingo Molnar, Will Deacon, Heiko Carstens, Vasily Gorbik, Christian Borntraeger, linux-s390 On Wed, Jun 17, 2020 at 05:17:19PM +1000, Herbert Xu wrote: > There is a header file inclusion loop between asm-generic/bug.h > and linux/kernel.h. This causes potential compile failurs depending > on the which file is included first. One way of breaking this loop > is to stop spinlock_types.h from including lockdep.h. This patch > splits lockdep.h into two files for this purpose. > > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> > Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> > Acked-by: Petr Mladek <pmladek@suse.com> > Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Looks good. Petr, how about I stick this in tip/locking/header for us both to share? ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [v3 PATCH 1/2] lockdep: Split header file into lockdep and lockdep_types 2020-06-17 8:24 ` Peter Zijlstra @ 2020-06-17 12:24 ` Petr Mladek 2020-06-18 14:37 ` Peter Zijlstra 0 siblings, 1 reply; 5+ messages in thread From: Petr Mladek @ 2020-06-17 12:24 UTC (permalink / raw) To: Peter Zijlstra Cc: Herbert Xu, Sergey Senozhatsky, Steven Rostedt, Linux Kernel Mailing List, Ingo Molnar, Will Deacon, Heiko Carstens, Vasily Gorbik, Christian Borntraeger, linux-s390 On Wed 2020-06-17 10:24:59, Peter Zijlstra wrote: > On Wed, Jun 17, 2020 at 05:17:19PM +1000, Herbert Xu wrote: > > There is a header file inclusion loop between asm-generic/bug.h > > and linux/kernel.h. This causes potential compile failurs depending > > on the which file is included first. One way of breaking this loop > > is to stop spinlock_types.h from including lockdep.h. This patch > > splits lockdep.h into two files for this purpose. > > > > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> > > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> > > Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> > > Acked-by: Petr Mladek <pmladek@suse.com> > > Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> > > Looks good. > > Petr, how about I stick this in tip/locking/header for us both to share? Sure. Sounds good to me. Best Regards, Petr ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [v3 PATCH 1/2] lockdep: Split header file into lockdep and lockdep_types 2020-06-17 12:24 ` Petr Mladek @ 2020-06-18 14:37 ` Peter Zijlstra 2020-07-07 3:42 ` [PATCH RESEND] lockdep: Move list.h inclusion into lockdep.h Herbert Xu 0 siblings, 1 reply; 5+ messages in thread From: Peter Zijlstra @ 2020-06-18 14:37 UTC (permalink / raw) To: Petr Mladek Cc: Herbert Xu, Sergey Senozhatsky, Steven Rostedt, Linux Kernel Mailing List, Ingo Molnar, Will Deacon, Heiko Carstens, Vasily Gorbik, Christian Borntraeger, linux-s390 On Wed, Jun 17, 2020 at 02:24:50PM +0200, Petr Mladek wrote: > On Wed 2020-06-17 10:24:59, Peter Zijlstra wrote: > > On Wed, Jun 17, 2020 at 05:17:19PM +1000, Herbert Xu wrote: > > > There is a header file inclusion loop between asm-generic/bug.h > > > and linux/kernel.h. This causes potential compile failurs depending > > > on the which file is included first. One way of breaking this loop > > > is to stop spinlock_types.h from including lockdep.h. This patch > > > splits lockdep.h into two files for this purpose. > > > > > > Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> > > > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> > > > Reviewed-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> > > > Acked-by: Petr Mladek <pmladek@suse.com> > > > Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> > > > > Looks good. > > > > Petr, how about I stick this in tip/locking/header for us both to share? > > Sure. Sounds good to me. OK, done. tip/locking/header should contain just this patch, and that branch also got merged into tip/locking/core. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH RESEND] lockdep: Move list.h inclusion into lockdep.h 2020-06-18 14:37 ` Peter Zijlstra @ 2020-07-07 3:42 ` Herbert Xu 0 siblings, 0 replies; 5+ messages in thread From: Herbert Xu @ 2020-07-07 3:42 UTC (permalink / raw) To: Peter Zijlstra Cc: Petr Mladek, Sergey Senozhatsky, Steven Rostedt, Linux Kernel Mailing List, Ingo Molnar, Will Deacon, Heiko Carstens, Vasily Gorbik, Christian Borntraeger, linux-s390, Stephen Rothwell, Linux Next Mailing List, Andy Shevchenko On Thu, Jun 18, 2020 at 04:37:35PM +0200, Peter Zijlstra wrote: > > OK, done. tip/locking/header should contain just this patch, and that > branch also got merged into tip/locking/core. Hi Peter: Could you please apply this patch on top as there is still a header loop otherwise? Thanks! ---8<--- Currently lockdep_types.h includes list.h without actually using any of its macros or functions. All it needs are the type definitions which were moved into types.h long ago. This potentially causes inclusion loops because both are included by many core header files. This patch moves the list.h inclusion into lockdep.h. Note that we could probably remove it completely but that could potentially result in compile failures should any end users not include list.h directly and also be unlucky enough to not get list.h via some other header file. Reported-by: Petr Mladek <pmladek@suse.com> Tested-by: Petr Mladek <pmladek@suse.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 3b73cf84f77d..b1ad5c045353 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -21,6 +21,7 @@ extern int lock_stat; #ifdef CONFIG_LOCKDEP #include <linux/linkage.h> +#include <linux/list.h> #include <linux/debug_locks.h> #include <linux/stacktrace.h> diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h index 7b9350624577..bb35b449f533 100644 --- a/include/linux/lockdep_types.h +++ b/include/linux/lockdep_types.h @@ -32,8 +32,6 @@ enum lockdep_wait_type { #ifdef CONFIG_LOCKDEP -#include <linux/list.h> - /* * We'd rather not expose kernel/lockdep_states.h this wide, but we do need * the total number of states... :-( -- Email: Herbert Xu <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-07-28 8:50 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-07-16 6:36 [PATCH RESEND] lockdep: Move list.h inclusion into lockdep.h Herbert Xu 2020-07-16 8:30 ` Will Deacon 2020-07-17 11:22 ` [tip: locking/core] " tip-bot2 for Herbert Xu 2020-07-28 8:50 ` [tip: locking/header] " tip-bot2 for Herbert Xu -- strict thread matches above, loose matches on Subject: below -- 2020-06-17 7:15 [v3 PATCH 0/2] Splitting ratelimit.h and lockdep.h Herbert Xu 2020-06-17 7:17 ` [v3 PATCH 1/2] lockdep: Split header file into lockdep and lockdep_types Herbert Xu 2020-06-17 8:24 ` Peter Zijlstra 2020-06-17 12:24 ` Petr Mladek 2020-06-18 14:37 ` Peter Zijlstra 2020-07-07 3:42 ` [PATCH RESEND] lockdep: Move list.h inclusion into lockdep.h Herbert Xu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®