• Juergen Gross's avatar
    xen: fix race in xen_qlock_wait() · 2ac2a7d4
    Juergen Gross authored
    In the following situation a vcpu waiting for a lock might not be
    woken up from xen_poll_irq():
    
    CPU 1:                CPU 2:                      CPU 3:
    takes a spinlock
                          tries to get lock
                          -> xen_qlock_wait()
    frees the lock
    -> xen_qlock_kick(cpu2)
                            -> xen_clear_irq_pending()
    
    takes lock again
                                                      tries to get lock
                                                      -> *lock = _Q_SLOW_VAL
                            -> *lock == _Q_SLOW_VAL ?
                            -> xen_poll_irq()
    frees the lock
    -> xen_qlock_kick(cpu3)
    
    And cpu 2 will sleep forever.
    
    This can be avoided easily by modifying xen_qlock_wait() to call
    xen_poll_irq() only if the related irq was not pending and to call
    xen_clear_irq_pending() only if it was pending.
    
    Cc: stable@vger.kernel.org
    Cc: Waiman.Long@hp.com
    Cc: peterz@infradead.org
    Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
    Reviewed-by: default avatarJan Beulich <jbeulich@suse.com>
    Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
    2ac2a7d4
spinlock.c 3.53 KB