Messages in this thread | | | Subject | Re: Mysterious lockdep warning from the SCSI workqueue code | From | Peter Zijlstra <> | Date | Sun, 23 Dec 2007 00:16:45 +0100 |
| |
On Sat, 2007-12-22 at 23:56 +0100, Rafael J. Wysocki wrote: > On Saturday, 22 of December 2007, James Bottomley wrote: > > I've no idea why this is occurring: > > > > WARNING: at kernel/lockdep.c:700 look_up_lock_class() > > Pid: 2068, comm: scsi_wq_3 Not tainted 2.6.24-rc6 #38 > > [<c010535a>] show_trace_log_lvl+0x1a/0x30 > > [<c0105ce2>] show_trace+0x12/0x20 > > [<c010601c>] dump_stack+0x6c/0x80 > > [<c014696d>] __lock_acquire+0x46d/0x10b0 > > [<c0147628>] lock_acquire+0x78/0xa0 > > [<c0136d18>] run_workqueue+0x128/0x1d0 > > [<c013795c>] worker_thread+0x8c/0xf0 > > [<c013ab32>] kthread+0x42/0x70 > > [<c0104f47>] kernel_thread_helper+0x7/0x10 > > ======================= > > > > it looks to be happening on the initial workqueue.c:run_workqueue() > > > > spin_lock_irq(&cwq->lock); > > > > It's caused by lockdep.c:look_up_lock_class() > > > > WARN_ON_ONCE(class->name != lock->name); > > > > but I'm not entirely sure what this actually means, not fully > > understanding lockdep classes and how we acquire them in scsi. > > I guess Ingo and/or Peter should have a look at this.
This makes me think of an invalid use of lockdep_set_class(). The typical way to trigger this is:
struct lock_class_key my_keys[10];
struct my_obj *create_my_obj1() { ... spin_lock_init(&my_obj.lock); lockdep_set_class(&my_obj.lock, my_keys + foo); ... }
struct my_obj *create_my_obj2() { ... spin_lock_init(&my_obj.lock); lockdep_set_class(&my_obj.lock, my_keys + bar); ... }
This initializes &my_obj.lock to the same class (provides foo and bar evaluate to the same), but give it a different name.
#define lockdep_set_class(lock, key) \ lockdep_init_map(&(lock)->dep_map, #key, key, 0)
The name is #key, so: "my_keys + foo" vs "my_keys + bar"
The possible fixes are: - make key identical by changing the expression - use lockdep_set_class_and_name() and specify a consistent name by hand.
| |