Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Aug 2018 16:24:27 +0000 (UTC)
From:      Navdeep Parhar <np@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r338254 - head/sys/dev/cxgbe
Message-ID:  <201808231624.w7NGORwl010478@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: np
Date: Thu Aug 23 16:24:27 2018
New Revision: 338254
URL: https://svnweb.freebsd.org/changeset/base/338254

Log:
  cxgbe(4): Use fcmpset instead of cmpset when appropriate.
  
  Suggested by:	mjg@
  MFC after:	1 month
  Sponsored by:	Chelsio Communications

Modified:
  head/sys/dev/cxgbe/t4_mp_ring.c

Modified: head/sys/dev/cxgbe/t4_mp_ring.c
==============================================================================
--- head/sys/dev/cxgbe/t4_mp_ring.c	Thu Aug 23 16:10:28 2018	(r338253)
+++ head/sys/dev/cxgbe/t4_mp_ring.c	Thu Aug 23 16:24:27 2018	(r338254)
@@ -122,11 +122,12 @@ drain_ring(struct mp_ring *r, union ring_state os, uin
 		n = r->drain(r, cidx, pidx);
 		if (n == 0) {
 			critical_enter();
+			os.state = r->state;
 			do {
-				os.state = ns.state = r->state;
+				ns.state = os.state;
 				ns.cidx = cidx;
 				ns.flags = STALLED;
-			} while (atomic_cmpset_64(&r->state, os.state,
+			} while (atomic_fcmpset_64(&r->state, &os.state,
 			    ns.state) == 0);
 			critical_exit();
 			if (prev != STALLED)
@@ -149,11 +150,12 @@ drain_ring(struct mp_ring *r, union ring_state os, uin
 		if (cidx != pidx && pending < 64 && total < budget)
 			continue;
 		critical_enter();
+		os.state = r->state;
 		do {
-			os.state = ns.state = r->state;
+			ns.state = os.state;
 			ns.cidx = cidx;
 			ns.flags = state_to_flags(ns, total >= budget);
-		} while (atomic_cmpset_acq_64(&r->state, os.state, ns.state) == 0);
+		} while (atomic_fcmpset_acq_64(&r->state, &os.state, ns.state) == 0);
 		critical_exit();
 
 		if (ns.flags == ABDICATED)
@@ -259,8 +261,8 @@ mp_ring_enqueue(struct mp_ring *r, void **items, int n
 	 * Reserve room for the new items.  Our reservation, if successful, is
 	 * from 'pidx_start' to 'pidx_stop'.
 	 */
+	os.state = r->state;
 	for (;;) {
-		os.state = r->state;
 		if (n >= space_available(r, os)) {
 			counter_u64_add(r->drops, n);
 			MPASS(os.flags != IDLE);
@@ -271,7 +273,7 @@ mp_ring_enqueue(struct mp_ring *r, void **items, int n
 		ns.state = os.state;
 		ns.pidx_head = increment_idx(r, os.pidx_head, n);
 		critical_enter();
-		if (atomic_cmpset_64(&r->state, os.state, ns.state))
+		if (atomic_fcmpset_64(&r->state, &os.state, ns.state))
 			break;
 		critical_exit();
 		cpu_spinwait();
@@ -301,11 +303,12 @@ mp_ring_enqueue(struct mp_ring *r, void **items, int n
 	 * Update the ring's pidx_tail.  The release style atomic guarantees
 	 * that the items are visible to any thread that sees the updated pidx.
 	 */
+	os.state = r->state;
 	do {
-		os.state = ns.state = r->state;
+		ns.state = os.state;
 		ns.pidx_tail = pidx_stop;
 		ns.flags = BUSY;
-	} while (atomic_cmpset_rel_64(&r->state, os.state, ns.state) == 0);
+	} while (atomic_fcmpset_rel_64(&r->state, &os.state, ns.state) == 0);
 	critical_exit();
 	counter_u64_add(r->enqueues, n);
 



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