On Mon, Jul 18, 2016 at 04:39:24PM -0400, Waiman Long wrote:
@@ -302,22 +306,42 @@ static inline bool mutex_try_to_acquire(struct mutex *lock)If the OSQ lock were a full FIFO it would in fact be fair, but its not
*
* Returns true when the lock was taken, otherwise false, indicating
* that we need to jump to the slowpath and sleep.
+ *
+ * The waiter flag is set to true if the spinner is a waiter in the wait
+ * queue. As the waiter has slept for a while, it should have priority to
+ * get the lock over the regular spinners. So going to wait at the end of
+ * the OSQ isn't fair to the waiter.
and things can drop out the middle and go (back) to sleep.
This has nothing to do with the end or not.
Instead, it will spin on the lockNote that this isn't starvation proof in any way.
+ * directly and concurrently with the spinner at the head of the OSQ, if
+ * present.
There may be a bit more cacheline contention in this case.This is relevant how ?
+ * The waiter also needs to set the lock to -1 instead of 0 on lockThis is unrelated to the previous bits and thus should not be in the
+ * acquisition.
same paragraph. Also, a 'why' would be more helpful.