On Sat, Mar 19, 2016 at 09:33:34AM +0100, Thomas Gleixner wrote: > On Mon, 14 Mar 2016, Luis Claudio R. Goncalves wrote: > > > Hello, > > > > I just started using 4.4.4-rt11 this afternoon and saw the lockdep splat below. > > Is this something new or did I miss a patch floating on the list? > > That's new. Looking into it. It looks like the way that INIT_HLIST_BL_HEAD() is authored, all instances of the contained raw spinlock will share the same lockdep class. That, coupled with the following in mb_cache_shrink(), is triggering the lockdep violation: void mb_cache_shrink(struct block_device *bdev) { [..] /* * Prevent any find or get operation on the entry. */ hlist_bl_lock(ce->e_block_hash_p); hlist_bl_lock(ce->e_index_hash_p); Josh diff --git a/include/linux/list_bl.h b/include/linux/list_bl.h index 44f0b55..d13428a 100644 --- a/include/linux/list_bl.h +++ b/include/linux/list_bl.h @@ -42,13 +42,18 @@ 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) \ +do { \ + (h)->first = NULL; \ +} while (0) #endif -} static inline void INIT_HLIST_BL_NODE(struct hlist_bl_node *h) {
Attachment:
signature.asc
Description: PGP signature