Re: [PATCH tip/locking/core v9 6/6] locking/pvqspinlock: Queue node adaptive spinning

From: Waiman Long
Date: Mon Nov 09 2015 - 11:51:32 EST

On 11/06/2015 03:37 PM, Peter Zijlstra wrote:
On Fri, Nov 06, 2015 at 12:54:06PM -0500, Waiman Long wrote:
+static void pv_wait_node(struct mcs_spinlock *node, struct mcs_spinlock *prev)
struct pv_node *pn = (struct pv_node *)node;
+ struct pv_node *pp = (struct pv_node *)prev;
int waitcnt = 0;
int loop;
+ bool wait_early;

/* waitcnt processing will be compiled out if !QUEUED_LOCK_STAT */
for (;; waitcnt++) {
- for (loop = SPIN_THRESHOLD; loop; loop--) {
+ for (wait_early = false, loop = SPIN_THRESHOLD; loop; loop--) {
if (READ_ONCE(node->locked))
+ if (pv_wait_early(pp, loop)) {
+ wait_early = true;
+ break;
+ }

So if prev points to another node, it will never see vcpu_running. Was
that fully intended?
I had added code in pv_wait_head_or_lock to set the state appropriately for
the queue head vCPU.
Yes, but that's the head, for nodes we'll always have halted or hashed.

The node state was initialized to be vcpu_running. In pv_wait_node(), it will be changed to vcpu_halted before sleeping and back to vcpu_running after that. So it is not true that it is either halted or hashed.

In case, it was changed to vcpu_hashed, it will be changed back to vcpu_running in pv_wait_head_lock before entering the active spinning loop. There are definitely a small amount of time where the node state does not reflect the actual vCPU state, but that is the best we can do so far.

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at
Please read the FAQ at