PERFORCE change 100121 for review

John Baldwin jhb at freebsd.org
Tue Jun 27 15:56:08 UTC 2006


On Tuesday 27 June 2006 03:42, Kip Macy wrote:
> http://perforce.freebsd.org/chv.cgi?CH=100121
> 
> Change 100121 by kmacy at kmacy_storage:sun4v_work_sleepq on 2006/06/27 
07:41:14
> 
> 	avoid pointless turnstile contention if mutex owner is running

Yes, I did this already in jhb_lock for both mutexes and rwlocks at BSDCan.  
Kris said my patch panic'd for him at BSDCan but I don't have an SMP machine 
I can test it on now to debug it. :(

> 
> Affected files ...
> 
> .. //depot/projects/kmacy_sun4v/src/sys/kern/kern_mutex.c#20 edit
> 
> Differences ...
> 
> ==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_mutex.c#20 (text+ko) 
====
> 
> @@ -176,7 +176,7 @@
>  static int mutex_prof_maxrecords = MPROF_HASH_SIZE;
>  SYSCTL_INT(_debug_mutex_prof, OID_AUTO, maxrecords, CTLFLAG_RD,
>      &mutex_prof_maxrecords, 0, "Maximum number of profiling records");
> -int mutex_prof_rejected;
> +int mutex_prof_rejected = 0;
>  SYSCTL_INT(_debug_mutex_prof, OID_AUTO, rejected, CTLFLAG_RD,
>      &mutex_prof_rejected, 0, "Number of rejected profiling records");
>  static int mutex_prof_hashsize = MPROF_HASH_SIZE;
> @@ -418,6 +418,16 @@
>  
>  	while (!_obtain_lock(m, tid)) {
>  		lock_profile_obtain_lock_failed(&m->mtx_object, &contested);
> +#if defined(SMP) && !defined(NO_ADAPTIVE_MUTEXES)
> +		/*
> +		 * If the current owner of the lock is executing on another
> +		 * CPU, spin instead of blocking.
> +		 */
> +		for (owner = mtx_owner(m); owner && TD_IS_RUNNING(owner); owner = 
mtx_owner(m))
> +			cpu_spinwait();
> +		if (mtx_unowned(m))
> +			continue;
> +#endif	/* SMP && !NO_ADAPTIVE_MUTEXES */
>  		turnstile_lock(&m->mtx_object);
>  		v = m->mtx_lock;
>  
> @@ -425,7 +435,7 @@
>  		 * Check if the lock has been released while spinning for
>  		 * the turnstile chain lock.
>  		 */
> -		if (v == MTX_UNOWNED) {
> +		if (mtx_unowned(m)) {
>  			turnstile_release(&m->mtx_object);
>  			cpu_spinwait();
>  			continue;
> @@ -837,6 +847,8 @@
>  	mtx_validate(m);
>  #endif
>  
> +
> +
>  	/* Determine lock class and lock flags. */
>  	if (opts & MTX_SPIN)
>  		class = &lock_class_mtx_spin;
> 

-- 
John Baldwin


More information about the p4-projects mailing list