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]>

Reply via email to