From e8ba3596215ae991010cb818a17c80ace01de13f Mon Sep 17 00:00:00 2001 From: Jonathan Neuschäfer Date: Mon, 28 May 2018 00:40:09 +0200 Subject: [WIP] Implement a lock-free MPMC ring buffer TODO: actually use the right memory barriers in the right places TODO: eliminate false sharing between mpmc_ptr_ring members TODO: reconsider atomic_long_t vs. atomic_t, vs. the type of size in _init() TODO: sprinkle likely/unlikely on some branches FIXME: it still crashes --- src/send.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/send.c') diff --git a/src/send.c b/src/send.c index f0f53d4..745594e 100644 --- a/src/send.c +++ b/src/send.c @@ -224,8 +224,8 @@ void packet_tx_worker(struct work_struct *work) struct sk_buff *first; enum packet_state state; - while ((first = __ptr_ring_peek(&queue->ring)) != NULL && (state = atomic_read(&PACKET_CB(first)->state)) != PACKET_STATE_UNCRYPTED) { - __ptr_ring_discard_one(&queue->ring); + while ((first = __mpmc_ptr_ring_peek(&queue->ring)) != NULL && (state = atomic_read(&PACKET_CB(first)->state)) != PACKET_STATE_UNCRYPTED) { + __mpmc_ptr_ring_discard_one(&queue->ring); peer = PACKET_PEER(first); keypair = PACKET_CB(first)->keypair; @@ -245,7 +245,7 @@ void packet_encrypt_worker(struct work_struct *work) struct sk_buff *first, *skb, *next; bool have_simd = simd_get(); - while ((first = ptr_ring_consume_bh(&queue->ring)) != NULL) { + while ((first = mpmc_ptr_ring_consume(&queue->ring)) != NULL) { enum packet_state state = PACKET_STATE_CRYPTED; skb_walk_null_queue_safe(first, skb, next) { -- cgit v1.2.3-59-g8ed1b