aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorThomas Gschwantner <tharre3@gmail.com>2018-05-30 02:47:28 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-06-04 20:30:02 +0200
commit4a3ee6d856779aee44822cc9131b138f5eeae543 (patch)
tree3741357048025229fac3293a8ea0df1debb5b308
parentWIP4 (diff)
downloadwireguard-monolithic-historical-4a3ee6d856779aee44822cc9131b138f5eeae543.tar.xz
wireguard-monolithic-historical-4a3ee6d856779aee44822cc9131b138f5eeae543.zip
WIP5
-rw-r--r--src/mpmc_ring.h19
1 files changed, 10 insertions, 9 deletions
diff --git a/src/mpmc_ring.h b/src/mpmc_ring.h
index 9c46007..1d19a7f 100644
--- a/src/mpmc_ring.h
+++ b/src/mpmc_ring.h
@@ -141,7 +141,7 @@ _ck_ring_enqueue_mp(struct ck_ring *ring, const void *entry, unsigned int ts,
ck_pr_fence_load();
consumer = ck_pr_load_uint(&ring->c_head);
- delta = producer + 1;
+ delta = (producer + 1) & mask;
/*
* Only try to CAS if the producer is not clearly stale (not
@@ -182,7 +182,7 @@ _ck_ring_enqueue_mp(struct ck_ring *ring, const void *entry, unsigned int ts,
}
}
- buffer = (char *)ring->queue + ts * (producer & mask);
+ buffer = (char *)ring->queue + ts * producer;
//pr_err("memcpy(%p, %p, %u)", buffer, entry, ts);
memcpy(buffer, entry, ts);
@@ -236,11 +236,11 @@ _ck_ring_trydequeue_mc(struct ck_ring *ring,
ck_pr_fence_load();
- buffer = (const char *)ring->queue + size * (consumer & mask);
+ buffer = (const char *)ring->queue + size * consumer;
memcpy(data, buffer, size);
ck_pr_fence_store_atomic();
- return ck_pr_cas_uint(&ring->c_head, consumer, consumer + 1);
+ return ck_pr_cas_uint(&ring->c_head, consumer, (consumer + 1) & mask);
}
CK_CC_FORCE_INLINE static bool
@@ -267,14 +267,14 @@ _ck_ring_dequeue_mc(struct ck_ring *ring,
ck_pr_fence_load();
- target = (const char *)ring->queue + ts * (consumer & mask);
+ target = (const char *)ring->queue + ts * consumer;
memcpy(data, target, ts);
/* Serialize load with respect to head update. */
ck_pr_fence_store_atomic();
} while (ck_pr_cas_uint_value(&ring->c_head,
consumer,
- consumer + 1,
+ (consumer + 1) & mask,
&consumer) == false);
return true;
@@ -324,9 +324,10 @@ static __always_inline bool mpmc_ptr_ring_peek(struct ck_ring *ring, void *data,
static __always_inline void mpmc_ptr_ring_discard(struct ck_ring *ring)
{
- smp_mb__before_atomic();
- atomic_inc(&ring->c_head);
- smp_mb__after_atomic();
+ const unsigned int mask = ring->mask;
+ unsigned int consumer = consumer = ck_pr_load_uint(&ring->c_head);
+
+ atomic_set(&ring->c_head, (consumer + 1) & mask);
}
/*