• Imre Deak's avatar
    locking/lockdep: Fix merging of hlocks with non-zero references · d9349850
    Imre Deak authored
    The sequence
    
    	static DEFINE_WW_CLASS(test_ww_class);
    
    	struct ww_acquire_ctx ww_ctx;
    	struct ww_mutex ww_lock_a;
    	struct ww_mutex ww_lock_b;
    	struct ww_mutex ww_lock_c;
    	struct mutex lock_c;
    
    	ww_acquire_init(&ww_ctx, &test_ww_class);
    
    	ww_mutex_init(&ww_lock_a, &test_ww_class);
    	ww_mutex_init(&ww_lock_b, &test_ww_class);
    	ww_mutex_init(&ww_lock_c, &test_ww_class);
    
    	mutex_init(&lock_c);
    
    	ww_mutex_lock(&ww_lock_a, &ww_ctx);
    
    	mutex_lock(&lock_c);
    
    	ww_mutex_lock(&ww_lock_b, &ww_ctx);
    	ww_mutex_lock(&ww_lock_c, &ww_ctx);
    
    	mutex_unlock(&lock_c);	(*)
    
    	ww_mutex_unlock(&ww_lock_c);
    	ww_mutex_unlock(&ww_lock_b);
    	ww_mutex_unlock(&ww_lock_a);
    
    	ww_acquire_fini(&ww_ctx); (**)
    
    will trigger the following error in __lock_release() when calling
    mutex_release() at **:
    
    	DEBUG_LOCKS_WARN_ON(depth <= 0)
    
    The problem is that the hlock merging happening at * updates the
    references for test_ww_class incorrectly to 3 whereas it should've
    updated it to 4 (representing all the instances for ww_ctx and
    ww_lock_[abc]).
    
    Fix this by updating the references during merging correctly taking into
    account that we can have non-zero references (both for the hlock that we
    merge into another hlock or for the hlock we are merging into).
    Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Will Deacon <will.deacon@arm.com>
    Link: https://lkml.kernel.org/r/20190524201509.9199-2-imre.deak@intel.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    d9349850
lockdep.c 132 KB