On Thu, 2012-09-13 at 11:39 +0200, Maarten Lankhorst wrote: > It is considered good form to lock the lock you claim to be nested in.
Uhm yeah.. cute. You actually found a site where this triggered? > Signed-off-by: Maarten Lankhorst <maarten.lankho...@canonical.com> > --- > diff --git a/kernel/lockdep.c b/kernel/lockdep.c > index ea9ee45..7175447 100644 > --- a/kernel/lockdep.c > +++ b/kernel/lockdep.c > @@ -2998,6 +2998,43 @@ EXPORT_SYMBOL_GPL(lockdep_init_map); > > struct lock_class_key __lockdep_no_validate__; > > +static int > +print_lock_nested_lock_not_held(struct task_struct *curr, > + struct held_lock *lock, > + struct lockdep_map *nest, > + unsigned long ip) > +{ > + if (!debug_locks_off()) > + return 0; > + if (debug_locks_silent) > + return 0; > + > + printk("\n"); > + printk("==================================\n"); > + printk("[ BUG: Nested lock was not taken ]\n"); > + print_kernel_ident(); > + printk("----------------------------------\n"); > + > + printk("%s/%d is trying to lock:\n", curr->comm, task_pid_nr(curr)); > + print_lock(lock); > + > + printk("\nbut this task is not holding:\n"); > + printk("%s\n", nest->name); > + > + printk("\nstack backtrace:\n"); > + dump_stack(); > + > + printk("\nother info that might help us debug this:\n"); > + lockdep_print_held_locks(curr); > + > + printk("\nstack backtrace:\n"); > + dump_stack(); > + > + return 0; > +} > + > +static int __lock_is_held(struct lockdep_map *lock); > + > /* > * This gets called for every mutex_lock*()/spin_lock*() operation. > * We maintain the dependency maps and validate the locking attempt: > @@ -3139,6 +3176,10 @@ static int __lock_acquire(struct lockdep_map *lock, > unsigned int subclass, > } > chain_key = iterate_chain_key(chain_key, id); > > + if (nest_lock && !__lock_is_held(nest_lock)) > + return print_lock_nested_lock_not_held(curr, hlock, > + nest_lock, ip); At this time we've already set hlock->nest_lock, so I've shortened the argument list here a little. > if (!validate_chain(curr, lock, hlock, chain_head, chain_key)) > return 0; > > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/