• Nicolai Hähnle's avatar
    locking/ww_mutex: Re-check ww->ctx in the inner optimistic spin loop · 25f13b40
    Nicolai Hähnle authored
    In the following scenario, thread #1 should back off its attempt to lock
    ww1 and unlock ww2 (assuming the acquire context stamps are ordered
    accordingly).
    
        Thread #0               Thread #1
        ---------               ---------
                                successfully lock ww2
        set ww1->base.owner
                                attempt to lock ww1
                                confirm ww1->ctx == NULL
                                enter mutex_spin_on_owner
        set ww1->ctx
    
    What was likely to happen previously is:
    
        attempt to lock ww2
        refuse to spin because
          ww2->ctx != NULL
        schedule()
                                detect thread #0 is off CPU
                                stop optimistic spin
                                return -EDEADLK
                                unlock ww2
                                wakeup thread #0
        lock ww2
    
    Now, we are more likely to see:
    
                                detect ww1->ctx != NULL
                                stop optimistic spin
                                return -EDEADLK
                                unlock ww2
        successfully lock ww2
    
    ... because thread #1 will stop its optimistic spin as soon as possible.
    
    The whole scenario is quite unlikely, since it requires thread #1 to get
    between thread #0 setting the owner and setting the ctx. But since we're
    idling here anyway, the additional check is basically free.
    
    Found by inspection.
    Signed-off-by: default avatarNicolai Hähnle <Nicolai.Haehnle@amd.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Chris Wilson <chris@chris-wilson.co.uk>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Maarten Lankhorst <dev@mblankhorst.nl>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: dri-devel@lists.freedesktop.org
    Link: http://lkml.kernel.org/r/1482346000-9927-10-git-send-email-nhaehnle@gmail.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    25f13b40
mutex.c 29.8 KB