In message <[email protected]>, 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 <[email protected]>
FreeBSD UNIX: <[email protected]> Web: http://www.FreeBSD.org
The need of the many outweighs the greed of the few.
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"