Messages in this thread | | | Date | Mon, 15 Feb 2016 17:06:52 -0500 | From | Waiman Long <> | Subject | Re: [PATCH v2 1/4] locking/mutex: Add waiter parameter to mutex_optimistic_spin() |
| |
On 02/12/2016 03:23 PM, Peter Zijlstra wrote: > On Fri, Feb 12, 2016 at 12:32:12PM -0500, Waiman Long wrote: >> This patch adds a new waiter parameter to the mutex_optimistic_spin() >> function to prepare it to be used by a waiter-spinner that doesn't >> need to go into the OSQ as there can only be one waiter-spinner which >> is the head of the waiting queue. > Does not explain why.. > >> static bool mutex_optimistic_spin(struct mutex *lock, >> + struct ww_acquire_ctx *ww_ctx, >> + const bool use_ww_ctx, int waiter) >> { >> struct task_struct *task = current; >> + bool acquired = false; >> >> + if (!waiter) { >> + if (!mutex_can_spin_on_owner(lock)) >> + goto done; > Why doesn't the waiter have to check mutex_can_spin_on_owner() ?
The reason why regular spinner need to call mutex_can_spin_on_owner is because we want to avoid the overhead of the OSQ if we can't spin. As mutex_can_spin_on_owner() is similar to mutex_spin_on_owner(), the waiter-spinner will exit spinning after calling mutex_spin_on_owner().
Cheers, Longman
| |