mp_ring: avoid items offset difference between iflib and mp_ring

on architectures without 64-bit atomics

Reported by:	Augustin Cavalier <waddlesplash@gmail.com>
This commit is contained in:
Matt Macy 2019-01-03 23:06:05 +00:00
parent 27e05a1902
commit 5881181d8c
2 changed files with 9 additions and 9 deletions

View File

@ -37,10 +37,6 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h> #include <sys/malloc.h>
#include <machine/cpu.h> #include <machine/cpu.h>
#if defined(__powerpc__) || defined(__mips__) || defined(__i386__)
#define NO_64BIT_ATOMICS
#endif
#if defined(__i386__) #if defined(__i386__)
#define atomic_cmpset_acq_64 atomic_cmpset_64 #define atomic_cmpset_acq_64 atomic_cmpset_64
#define atomic_cmpset_rel_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); return (BUSY);
} }
#ifdef NO_64BIT_ATOMICS #ifdef MP_RING_NO_64BIT_ATOMICS
static void static void
drain_ring_locked(struct ifmp_ring *r, union ring_state os, uint16_t prev, int budget) 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; *pr = r;
#ifdef NO_64BIT_ATOMICS #ifdef MP_RING_NO_64BIT_ATOMICS
mtx_init(&r->lock, "mp_ring lock", NULL, MTX_DEF); mtx_init(&r->lock, "mp_ring lock", NULL, MTX_DEF);
#endif #endif
return (0); return (0);
@ -325,7 +321,7 @@ ifmp_ring_free(struct ifmp_ring *r)
* *
* Returns an errno. * Returns an errno.
*/ */
#ifdef NO_64BIT_ATOMICS #ifdef MP_RING_NO_64BIT_ATOMICS
int int
ifmp_ring_enqueue(struct ifmp_ring *r, void **items, int n, int budget, int abdicate) 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; ns.flags = BUSY;
#ifdef NO_64BIT_ATOMICS #ifdef MP_RING_NO_64BIT_ATOMICS
mtx_lock(&r->lock); mtx_lock(&r->lock);
if (r->state != os.state) { if (r->state != os.state) {
mtx_unlock(&r->lock); mtx_unlock(&r->lock);

View File

@ -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 u_int (*mp_ring_can_drain_t)(struct ifmp_ring *);
typedef void (*mp_ring_serial_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 { struct ifmp_ring {
volatile uint64_t state __aligned(CACHE_LINE_SIZE); volatile uint64_t state __aligned(CACHE_LINE_SIZE);
@ -54,7 +58,7 @@ struct ifmp_ring {
counter_u64_t stalls; counter_u64_t stalls;
counter_u64_t restarts; /* recovered after stalling */ counter_u64_t restarts; /* recovered after stalling */
counter_u64_t abdications; counter_u64_t abdications;
#ifdef NO_64BIT_ATOMICS #ifdef MP_RING_NO_64BIT_ATOMICS
struct mtx lock; struct mtx lock;
#endif #endif
void * volatile items[] __aligned(CACHE_LINE_SIZE); void * volatile items[] __aligned(CACHE_LINE_SIZE);