diff options
Diffstat (limited to 'debian/patches-rt/list_bl-fixup-bogus-lockdep-warning.patch')
-rw-r--r-- | debian/patches-rt/list_bl-fixup-bogus-lockdep-warning.patch | 98 |
1 files changed, 0 insertions, 98 deletions
diff --git a/debian/patches-rt/list_bl-fixup-bogus-lockdep-warning.patch b/debian/patches-rt/list_bl-fixup-bogus-lockdep-warning.patch deleted file mode 100644 index 1938c0b32..000000000 --- a/debian/patches-rt/list_bl-fixup-bogus-lockdep-warning.patch +++ /dev/null @@ -1,98 +0,0 @@ -From: Josh Cartwright <joshc@ni.com> -Date: Thu, 31 Mar 2016 00:04:25 -0500 -Subject: [PATCH] list_bl: fixup bogus lockdep warning -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.2/older/patches-5.2.17-rt9.tar.xz - -At first glance, the use of 'static inline' seems appropriate for -INIT_HLIST_BL_HEAD(). - -However, when a 'static inline' function invocation is inlined by gcc, -all callers share any static local data declared within that inline -function. - -This presents a problem for how lockdep classes are setup. raw_spinlocks, for -example, when CONFIG_DEBUG_SPINLOCK, - - # define raw_spin_lock_init(lock) \ - do { \ - static struct lock_class_key __key; \ - \ - __raw_spin_lock_init((lock), #lock, &__key); \ - } while (0) - -When this macro is expanded into a 'static inline' caller, like -INIT_HLIST_BL_HEAD(): - - static inline INIT_HLIST_BL_HEAD(struct hlist_bl_head *h) - { - h->first = NULL; - raw_spin_lock_init(&h->lock); - } - -...the static local lock_class_key object is made a function static. - -For compilation units which initialize invoke INIT_HLIST_BL_HEAD() more -than once, then, all of the invocations share this same static local -object. - -This can lead to some very confusing lockdep splats (example below). -Solve this problem by forcing the INIT_HLIST_BL_HEAD() to be a macro, -which prevents the lockdep class object sharing. - - ============================================= - [ INFO: possible recursive locking detected ] - 4.4.4-rt11 #4 Not tainted - --------------------------------------------- - kswapd0/59 is trying to acquire lock: - (&h->lock#2){+.+.-.}, at: mb_cache_shrink_scan - - but task is already holding lock: - (&h->lock#2){+.+.-.}, at: mb_cache_shrink_scan - - other info that might help us debug this: - Possible unsafe locking scenario: - - CPU0 - ---- - lock(&h->lock#2); - lock(&h->lock#2); - - *** DEADLOCK *** - - May be due to missing lock nesting notation - - 2 locks held by kswapd0/59: - #0: (shrinker_rwsem){+.+...}, at: rt_down_read_trylock - #1: (&h->lock#2){+.+.-.}, at: mb_cache_shrink_scan - -Reported-by: Luis Claudio R. Goncalves <lclaudio@uudg.org> -Tested-by: Luis Claudio R. Goncalves <lclaudio@uudg.org> -Signed-off-by: Josh Cartwright <joshc@ni.com> -Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> ---- - include/linux/list_bl.h | 12 +++++++----- - 1 file changed, 7 insertions(+), 5 deletions(-) - ---- a/include/linux/list_bl.h -+++ b/include/linux/list_bl.h -@@ -43,13 +43,15 @@ struct hlist_bl_node { - struct hlist_bl_node *next, **pprev; - }; - --static inline void INIT_HLIST_BL_HEAD(struct hlist_bl_head *h) --{ -- h->first = NULL; - #ifdef CONFIG_PREEMPT_RT_BASE -- raw_spin_lock_init(&h->lock); -+#define INIT_HLIST_BL_HEAD(h) \ -+do { \ -+ (h)->first = NULL; \ -+ raw_spin_lock_init(&(h)->lock); \ -+} while (0) -+#else -+#define INIT_HLIST_BL_HEAD(h) (h)->first = NULL - #endif --} - - static inline void INIT_HLIST_BL_NODE(struct hlist_bl_node *h) - { |