On Sat, 16 Jul 2016, Wanpeng Li wrote:
From: Wanpeng Li <[email protected]>When the lock holder vCPU is racing with the queue head vCPU: lock holder vCPU queue head vCPU ===================== ================== node->locked = 1; <preemption> READ_ONCE(node->locked) ... pv_wait_head_or_lock(): SPIN_THRESHOLD loop; pv_hash(); lock->locked = _Q_SLOW_VAL; node->state = vcpu_hashed; pv_kick_node(): cmpxchg(node->state, vcpu_halted, vcpu_hashed); lock->locked = _Q_SLOW_VAL; pv_hash(); With preemption at the right moment, it is possible that both the lock holder and queue head vCPUs can be racing to set node->state which can result in hash entry race. Making sure the state is never set to vcpu_halted will prevent this racing from happening. This patch fix it by setting vcpu_hashed after we did all hash thing. Reviewed-by: Pan Xinhui <[email protected]> Cc: Peter Zijlstra (Intel) <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Waiman Long <[email protected]> Cc: Davidlohr Bueso <[email protected]> Signed-off-by: Wanpeng Li <[email protected]>
Reviewed-by: Davidlohr Bueso <[email protected]>

