Re: [PATCH v2 2/3] mutex: Queue mutex spinners with MCS lock toreduce cacheline contention
From: Ingo Molnar
Date:  Tue Apr 16 2013 - 05:10:37 EST
* Waiman Long <Waiman.Long@xxxxxx> wrote:
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -3021,9 +3021,6 @@ static inline bool owner_running(struct mutex *lock, struct task_struct *owner)
>   */
>  int mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner)
>  {
> -	if (!sched_feat(OWNER_SPIN))
> -		return 0;
> -
>  	rcu_read_lock();
>  	while (owner_running(lock, owner)) {
>  		if (need_resched())
> @@ -3040,6 +3037,27 @@ int mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner)
>  	 */
>  	return lock->owner == NULL;
>  }
> +
> +/*
> + * Initial check for entering the mutex spinning loop
> + */
> +int mutex_can_spin_on_owner(struct mutex *lock)
> +{
> +	int retval = 1;
> +
> +	if (!sched_feat(OWNER_SPIN))
> +		return 0;
> +
> +	rcu_read_lock();
> +	if (lock->owner)
> +		retval = lock->owner->on_cpu;
> +	rcu_read_unlock();
> +	/*
> +	 * if lock->owner is not set, the mutex owner may have just acquired
> +	 * it and not set the owner yet or the mutex has been released.
> +	 */
> +	return retval;
> +}
The SCHED_FEAT_OWNER_SPIN was really just an early hack we did to make 
with/without mutex-spinning testable.
I'd suggest a preparatory patch that gets rid of that flag and moves these two 
functions from sched/core.c to mutex.c where they belong.
This will also allow the removal of the mutex prototypes from sched.h.
Thanks,
	Ingo
--
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/