Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Jan 2018 13:40:50 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r327875 - head/sys/kern
Message-ID:  <201801121340.w0CDeoI9046644@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;
 		}
 
 		/*



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