• Peter Zijlstra's avatar
    lockdep: re-annotate scheduler runqueues · 1b12bbc7
    Peter Zijlstra authored
    Instead of using a per-rq lock class, use the regular nesting operations.
    
    However, take extra care with double_lock_balance() as it can release the
    already held rq->lock (and therefore change its nesting class).
    
    So what can happen is:
    
     spin_lock(rq->lock);	// this rq subclass 0
    
     double_lock_balance(rq, other_rq);
       // release rq
       // acquire other_rq->lock subclass 0
       // acquire rq->lock subclass 1
    
     spin_unlock(other_rq->lock);
    
    leaving you with rq->lock in subclass 1
    
    So a subsequent double_lock_balance() call can try to nest a subclass 1
    lock while already holding a subclass 1 lock.
    
    Fix this by introducing double_unlock_balance() which releases the other
    rq's lock, but also re-sets the subclass for this rq's lock to 0.
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    1b12bbc7
sched.c 220 KB