aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMatt Macy <mmacy@FreeBSD.org>2019-01-03 23:06:05 +0000
committerMatt Macy <mmacy@FreeBSD.org>2019-01-03 23:06:05 +0000
commit5881181d8c80609034204c128975fbbac77baaed (patch)
treebc0405abfdd34afa38dd3b60e19216263f133c1d /sys
parent27e05a190218064b43e9106869c1ad9f036920b5 (diff)
downloadsrc-5881181d8c80609034204c128975fbbac77baaed.tar.gz
src-5881181d8c80609034204c128975fbbac77baaed.zip
mp_ring: avoid items offset difference between iflib and mp_ring
on architectures without 64-bit atomics Reported by: Augustin Cavalier <waddlesplash@gmail.com>
Notes
Notes: svn path=/head/; revision=342749
Diffstat (limited to 'sys')
-rw-r--r--sys/net/mp_ring.c12
-rw-r--r--sys/net/mp_ring.h6
2 files changed, 9 insertions, 9 deletions
diff --git a/sys/net/mp_ring.c b/sys/net/mp_ring.c
index 0a1956f1168a..8e04e6142e35 100644
--- a/sys/net/mp_ring.c
+++ b/sys/net/mp_ring.c
@@ -37,10 +37,6 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h>
#include <machine/cpu.h>
-#if defined(__powerpc__) || defined(__mips__) || defined(__i386__)
-#define NO_64BIT_ATOMICS
-#endif
-
#if defined(__i386__)
#define atomic_cmpset_acq_64 atomic_cmpset_64
#define atomic_cmpset_rel_64 atomic_cmpset_64
@@ -101,7 +97,7 @@ state_to_flags(union ring_state s, int abdicate)
return (BUSY);
}
-#ifdef NO_64BIT_ATOMICS
+#ifdef MP_RING_NO_64BIT_ATOMICS
static void
drain_ring_locked(struct ifmp_ring *r, union ring_state os, uint16_t prev, int budget)
{
@@ -291,7 +287,7 @@ ifmp_ring_alloc(struct ifmp_ring **pr, int size, void *cookie, mp_ring_drain_t d
}
*pr = r;
-#ifdef NO_64BIT_ATOMICS
+#ifdef MP_RING_NO_64BIT_ATOMICS
mtx_init(&r->lock, "mp_ring lock", NULL, MTX_DEF);
#endif
return (0);
@@ -325,7 +321,7 @@ ifmp_ring_free(struct ifmp_ring *r)
*
* Returns an errno.
*/
-#ifdef NO_64BIT_ATOMICS
+#ifdef MP_RING_NO_64BIT_ATOMICS
int
ifmp_ring_enqueue(struct ifmp_ring *r, void **items, int n, int budget, int abdicate)
{
@@ -503,7 +499,7 @@ ifmp_ring_check_drainage(struct ifmp_ring *r, int budget)
ns.flags = BUSY;
-#ifdef NO_64BIT_ATOMICS
+#ifdef MP_RING_NO_64BIT_ATOMICS
mtx_lock(&r->lock);
if (r->state != os.state) {
mtx_unlock(&r->lock);
diff --git a/sys/net/mp_ring.h b/sys/net/mp_ring.h
index ebec3ae487d7..6dea325dc435 100644
--- a/sys/net/mp_ring.h
+++ b/sys/net/mp_ring.h
@@ -40,6 +40,10 @@ typedef u_int (*mp_ring_drain_t)(struct ifmp_ring *, u_int, u_int);
typedef u_int (*mp_ring_can_drain_t)(struct ifmp_ring *);
typedef void (*mp_ring_serial_t)(struct ifmp_ring *);
+#if defined(__powerpc__) || defined(__mips__) || defined(__i386__)
+#define MP_RING_NO_64BIT_ATOMICS
+#endif
+
struct ifmp_ring {
volatile uint64_t state __aligned(CACHE_LINE_SIZE);
@@ -54,7 +58,7 @@ struct ifmp_ring {
counter_u64_t stalls;
counter_u64_t restarts; /* recovered after stalling */
counter_u64_t abdications;
-#ifdef NO_64BIT_ATOMICS
+#ifdef MP_RING_NO_64BIT_ATOMICS
struct mtx lock;
#endif
void * volatile items[] __aligned(CACHE_LINE_SIZE);