Messages in this thread | | | Subject | Re: bug in tty ldisc and friends | From | Peter Zijlstra <> | Date | Wed, 17 Jun 2009 10:32:03 +0200 |
| |
On Tue, 2009-06-16 at 12:36 +0200, Ingo Molnar wrote:
> +++ b/lib/dma-debug.c > @@ -62,6 +62,8 @@ struct dma_debug_entry { > #endif > }; > > +static struct lock_class_key hash_bucket_class; > + > struct hash_bucket { > struct list_head list; > spinlock_t lock; > @@ -716,7 +718,8 @@ void dma_debug_init(u32 num_entries) > > for (i = 0; i < HASH_SIZE; ++i) { > INIT_LIST_HEAD(&dma_entry_hash[i].list); > - dma_entry_hash[i].lock = SPIN_LOCK_UNLOCKED; > + spin_lock_init(&dma_entry_hash[i].lock); > + lockdep_set_lock_class(&dma_entry_hash[i].lock, &hash_bucket_class); > } > > if (dma_debug_fs_init() != 0) {
I don't see what you need that lockdep_set_class() for, the spin_lock_init() would already set a class specific to the callsite. And since all these buckets are initialized from the same place (ie, this loop), they'd all share the same class.
Its just that the old style SPIN_LOCK_UNLOCKED doesn't set a class and then reverts to the static address of the lock object itself that these locks used to have different classes.
So in short, yes the above patch should fix it, but it could be done shorter..
and..
we really should do another round of SPIN_LOCK_UNLOCKED cleanups and finally remove that thing.
| |