Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Nov 2017 23:21:18 -0800
From:      Cy Schubert <Cy.Schubert@komquats.com>
To:        Mateusz Guzik <mjg@FreeBSD.org>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r325920 - head/sys/kern
Message-ID:  <201711170721.vAH7LIfW004556@slippy.cwsent.com>
In-Reply-To: Message from Mateusz Guzik <mjg@FreeBSD.org> of "Fri, 17 Nov 2017 02:25:04 %2B0000." <201711170225.vAH2P4jY046885@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
In message <201711170225.vAH2P4jY046885@repo.freebsd.org>, Mateusz Guzik 
writes
:
> Author: mjg
> Date: Fri Nov 17 02:25:04 2017
> New Revision: 325920
> URL: https://svnweb.freebsd.org/changeset/base/325920
> 
> Log:
>   mtx: unlock before traversing threads to wake up
>   
>   This shortens the lock hold time while not affecting corretness.
>   All the woken up threads end up competing can lose the race against
>   a completely unrelated thread getting the lock anyway.
> 
> Modified:
>   head/sys/kern/kern_mutex.c
> 
> Modified: head/sys/kern/kern_mutex.c
> =============================================================================
> =
> --- head/sys/kern/kern_mutex.c	Fri Nov 17 02:22:51 2017	(r32591
> 9)
> +++ head/sys/kern/kern_mutex.c	Fri Nov 17 02:25:04 2017	(r32592
> 0)
> @@ -629,7 +629,8 @@ __mtx_lock_sleep(volatile uintptr_t *c, uintptr_t v)
>  #ifdef KDTRACE_HOOKS
>  		sleep_time -= lockstat_nsecs(&m->lock_object);
>  #endif
> -		turnstile_wait(ts, mtx_owner(m), TS_EXCLUSIVE_QUEUE);
> +		MPASS(owner == mtx_owner(m));

Should this be conditional when ADAPTIVE_MUTEXES is defined? Otherwise it 
fails to build.

> +		turnstile_wait(ts, owner, TS_EXCLUSIVE_QUEUE);
>  #ifdef KDTRACE_HOOKS
>  		sleep_time += lockstat_nsecs(&m->lock_object);
>  		sleep_cnt++;
> @@ -1002,7 +1003,7 @@ __mtx_unlock_sleep(volatile uintptr_t *c)
>  {
>  	struct mtx *m;
>  	struct turnstile *ts;
> -	uintptr_t tid, v;
> +	uintptr_t tid;
>  
>  	if (SCHEDULER_STOPPED())
>  		return;
> @@ -1028,12 +1029,12 @@ __mtx_unlock_sleep(volatile uintptr_t *c)
>  	 * can be removed from the hash list if it is empty.
>  	 */
>  	turnstile_chain_lock(&m->lock_object);
> +	_mtx_release_lock_quick(m);
>  	ts = turnstile_lookup(&m->lock_object);
> +	MPASS(ts != NULL);
>  	if (LOCK_LOG_TEST(&m->lock_object, opts))
>  		CTR1(KTR_LOCK, "_mtx_unlock_sleep: %p contested", m);
> -	MPASS(ts != NULL);
>  	turnstile_broadcast(ts, TS_EXCLUSIVE_QUEUE);
> -	_mtx_release_lock_quick(m);
>  
>  	/*
>  	 * This turnstile is now no longer associated with the mutex.  We can
> 


-- 
Cheers,
Cy Schubert <Cy.Schubert@cschubert.com>
FreeBSD UNIX:  <cy@FreeBSD.org>   Web:  http://www.FreeBSD.org

	The need of the many outweighs the greed of the few.





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201711170721.vAH7LIfW004556>