Messages in this thread | | | Date | Tue, 2 Feb 2016 13:19:06 -0800 | From | Davidlohr Bueso <> | Subject | Re: [PATCH] locking/mutex: Avoid spinner vs waiter starvation |
| |
On Mon, 01 Feb 2016, Peter Zijlstra wrote:
>Subject: locking/mutex: Avoid spinner vs waiter starvation >From: Peter Zijlstra <peterz@infradead.org> >Date: Fri, 22 Jan 2016 12:06:53 +0100 > >Ding Tianhong reported that under his load the optimistic spinners >would totally starve a task that ended up on the wait list. > >Fix this by ensuring the top waiter also partakes in the optimistic >spin queue. > >There are a few subtle differences between the assumed state of >regular optimistic spinners and those already on the wait list, which >result in the @acquired complication of the acquire path. > >Most notable are: > > - waiters are on the wait list and need to be taken off > - mutex_optimistic_spin() sets the lock->count to 0 on acquire > even though there might be more tasks on the wait list.
Right, the main impact I see with these complications are that the window of when a waiter takes the lock via spinning and then acquires the wait_lock to remove itself from the list, will allow an unlock thread to set the lock as available in the fastpath which could in turn allow a third thread the steal the lock. With high contention, this window will be come obviously larger as we contend for the wait_lock.
CPU-0 CPU-1 CPU-3 __mutex_lock_common mutex_optimistic_spin (->count now 0) __mutex_fastpath_unlock (->count now 1) __mutex_fastpath_lock (stolen)
spin_lock_mutex(&lock->wait_lock, flags);
But we've always been bad when it comes to counter and waiters.
Thanks, Davidlohr
| |