Searched hist:"2 ac2a7d4d9ff4e01e36f9c3d116582f6f655ab47" (Results 1 – 1 of 1) sorted by relevance
/openbmc/linux/arch/x86/xen/ |
H A D | spinlock.c | diff 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>
|