svn commit: r347390 - head/sys/net

Marius Strobl marius at FreeBSD.org
Thu May 9 11:34:48 UTC 2019


Author: marius
Date: Thu May  9 11:34:46 2019
New Revision: 347390
URL: https://svnweb.freebsd.org/changeset/base/347390

Log:
  - Merge r338254 from cxgbe(4):
    Use fcmpset instead of cmpset when appropriate.
  - Revert r277226 of cxgbe(4), obsolete since r334320.

Modified:
  head/sys/net/mp_ring.c

Modified: head/sys/net/mp_ring.c
==============================================================================
--- head/sys/net/mp_ring.c	Thu May  9 11:04:10 2019	(r347389)
+++ head/sys/net/mp_ring.c	Thu May  9 11:34:46 2019	(r347390)
@@ -36,12 +36,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/mutex.h>
 #include <sys/malloc.h>
 #include <machine/cpu.h>
-
-#if defined(__i386__)
-#define atomic_cmpset_acq_64 atomic_cmpset_64
-#define atomic_cmpset_rel_64 atomic_cmpset_64
-#endif
-
 #include <net/mp_ring.h>
 
 union ring_state {
@@ -195,11 +189,12 @@ drain_ring_lockless(struct ifmp_ring *r, union ring_st
 		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)
@@ -222,11 +217,13 @@ drain_ring_lockless(struct ifmp_ring *r, union ring_st
 		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)
@@ -379,10 +376,8 @@ ifmp_ring_enqueue(struct ifmp_ring *r, void **items, i
 	if (abdicate) {
 		if (os.flags == IDLE)
 			ns.flags = ABDICATED;
-	}
-	else {
+	} else
 		ns.flags = BUSY;
-	}
 	r->state = ns.state;
 	counter_u64_add(r->enqueues, n);
 
@@ -398,7 +393,6 @@ ifmp_ring_enqueue(struct ifmp_ring *r, void **items, i
 	mtx_unlock(&r->lock);
 	return (0);
 }
-
 #else
 int
 ifmp_ring_enqueue(struct ifmp_ring *r, void **items, int n, int budget, int abdicate)
@@ -414,8 +408,8 @@ ifmp_ring_enqueue(struct ifmp_ring *r, void **items, i
 	 * 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);
@@ -426,7 +420,7 @@ ifmp_ring_enqueue(struct ifmp_ring *r, void **items, i
 		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();
@@ -456,17 +450,16 @@ ifmp_ring_enqueue(struct ifmp_ring *r, void **items, i
 	 * 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;
 		if (abdicate) {
 			if (os.flags == IDLE)
 				ns.flags = ABDICATED;
-		}
-		else {
+		} else
 			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);
 


More information about the svn-src-all mailing list