• Oleg Nesterov's avatar
    lockdep: Don't create the wrong dependency on hlock->check == 0 · 1b5ff816
    Oleg Nesterov authored
    Test-case:
    
    	DEFINE_MUTEX(m1);
    	DEFINE_MUTEX(m2);
    	DEFINE_MUTEX(mx);
    
    	void lockdep_should_complain(void)
    	{
    		lockdep_set_novalidate_class(&mx);
    
    		// m1 -> mx -> m2
    		mutex_lock(&m1);
    		mutex_lock(&mx);
    		mutex_lock(&m2);
    		mutex_unlock(&m2);
    		mutex_unlock(&mx);
    		mutex_unlock(&m1);
    
    		// m2 -> m1 ; should trigger the warning
    		mutex_lock(&m2);
    		mutex_lock(&m1);
    		mutex_unlock(&m1);
    		mutex_unlock(&m2);
    	}
    
    this doesn't trigger any warning, lockdep can't detect the trivial
    deadlock.
    
    This is because lock(&mx) correctly avoids m1 -> mx dependency, it
    skips validate_chain() due to mx->check == 0. But lock(&m2) wrongly
    adds mx -> m2 and thus m1 -> m2 is not created.
    
    rcu_lock_acquire()->lock_acquire(check => 0) is fine due to read == 2,
    so currently only __lockdep_no_validate__ can trigger this problem.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Dave Jones <davej@redhat.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: Sasha Levin <sasha.levin@oracle.com>
    Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/20140120182010.GA26498@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    1b5ff816
lockdep.c 104 KB