Author: mjg
Date: Fri Jan 12 13:40:50 2018
New Revision: 327875
URL: https://svnweb.freebsd.org/changeset/base/327875

Log:
  mtx: use fcmpset to cover setting MTX_CONTESTED

Modified:
  head/sys/kern/kern_mutex.c

Modified: head/sys/kern/kern_mutex.c
==============================================================================
--- head/sys/kern/kern_mutex.c  Fri Jan 12 13:39:02 2018        (r327874)
+++ head/sys/kern/kern_mutex.c  Fri Jan 12 13:40:50 2018        (r327875)
@@ -578,6 +578,7 @@ __mtx_lock_sleep(volatile uintptr_t *c, uintptr_t v)
 
                ts = turnstile_trywait(&m->lock_object);
                v = MTX_READ_VALUE(m);
+retry_turnstile:
 
                /*
                 * Check if the lock has been released while spinning for
@@ -609,10 +610,8 @@ __mtx_lock_sleep(volatile uintptr_t *c, uintptr_t v)
                 * or the state of the MTX_RECURSED bit changed.
                 */
                if ((v & MTX_CONTESTED) == 0 &&
-                   !atomic_cmpset_ptr(&m->mtx_lock, v, v | MTX_CONTESTED)) {
-                       turnstile_cancel(ts);
-                       v = MTX_READ_VALUE(m);
-                       continue;
+                   !atomic_fcmpset_ptr(&m->mtx_lock, &v, v | MTX_CONTESTED)) {
+                       goto retry_turnstile;
                }
 
                /*
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to