Re: [PATCH v6 5/6] locking/pvqspinlock: Allow 1 lock stealing attempt

From: Waiman Long
Date: Mon Sep 14 2015 - 15:19:47 EST


On 09/14/2015 10:04 AM, Peter Zijlstra wrote:
On Fri, Sep 11, 2015 at 02:37:37PM -0400, Waiman Long wrote:
This patch allows one attempt for the lock waiter to steal the lock
when entering the PV slowpath. This helps to reduce the performance
penalty caused by lock waiter preemption while not having much of
the downsides of a real unfair lock.

@@ -416,7 +414,8 @@ queue:
* does not imply a full barrier.
*
*/
If it really were once, like the Changelog says it is, then you could
have simply added:

if (pv_try_steal_lock(...))
goto release;

My previous mail has clarified where the lock stealing happen. Will add the necessary comment to the patch.

here, and not wrecked pv_wait_head() like you did. Note that if you do
it like this, you also do not need to play games with the hash, because
you'll never get into that situation.

- pv_wait_head(lock, node);
+ if (pv_wait_head_and_lock(lock, node, tail))
+ goto release;
while ((val = smp_load_acquire(&lock->val.counter))& _Q_LOCKED_PENDING_MASK)
cpu_relax();


Because we need to use atomic op to get the lock, we can't use the native logic to do the acquire. I know it is kind of hacky, but I don't have a good alternative here.

Cheers,
Longman
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/