Home
last modified time | relevance | path

Searched hist:"2 ac2a7d4d9ff4e01e36f9c3d116582f6f655ab47" (Results 1 – 1 of 1) sorted by relevance

/openbmc/linux/arch/x86/xen/
H A Dspinlock.cdiff 2ac2a7d4d9ff4e01e36f9c3d116582f6f655ab47 Mon Oct 01 00:57:42 CDT 2018 Juergen Gross <jgross@suse.com> xen: fix race in xen_qlock_wait()

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: Juergen Gross <jgross@suse.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>