>>> On 01.10.18 at 09:16, <jgross@xxxxxxxx> wrote: > 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() > -> xen_clear_irq_pending() Doesn't the last line above ... > frees the lock > -> xen_qlock_kick(cpu2) ... need to be below here? > 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@xxxxxxxxxxxxxxx > Cc: Waiman.Long@xxxxxx > Cc: peterz@xxxxxxxxxxxxx > Signed-off-by: Juergen Gross <jgross@xxxxxxxx> Patch itself Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Jan