From 5221eceb39a8a4f9bd637ebfa7c0f9c0958e8afa Mon Sep 17 00:00:00 2001 From: Jonathan Neuschäfer Date: Thu, 5 Jul 2018 22:27:29 +0200 Subject: receive: use NAPI on the receive path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Suggested-by: Jason A. Donenfeld [Jason: fixed up the flushing of the rx_queue in peer_remove] Signed-off-by: Jonathan Neuschäfer Signed-off-by: Jason A. Donenfeld --- src/receive.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'src/receive.c') diff --git a/src/receive.c b/src/receive.c index 7dc3a61..1e8a242 100644 --- a/src/receive.c +++ b/src/receive.c @@ -368,17 +368,17 @@ packet_processed: dev_kfree_skb(skb); } -void packet_rx_worker(struct work_struct *work) +int packet_rx_poll(struct napi_struct *napi, int budget) { - struct crypt_queue *queue = container_of(work, struct crypt_queue, work); - struct wireguard_peer *peer; + struct wireguard_peer *peer = container_of(napi, struct wireguard_peer, napi); + struct crypt_queue *queue = &peer->rx_queue; struct noise_keypair *keypair; struct sk_buff *skb; struct endpoint endpoint; enum packet_state state; + int work_done = 0; bool free; - local_bh_disable(); while ((skb = __ptr_ring_peek(&queue->ring)) != NULL && (state = atomic_read(&PACKET_CB(skb)->state)) != PACKET_STATE_UNCRYPTED) { __ptr_ring_discard_one(&queue->ring); peer = PACKET_PEER(skb); @@ -405,8 +405,15 @@ next: peer_put(peer); if (unlikely(free)) dev_kfree_skb(skb); + + if (++work_done >= budget) + break; } - local_bh_enable(); + + if (work_done < budget) + napi_complete_done(napi, work_done); + + return work_done; } void packet_decrypt_worker(struct work_struct *work) @@ -417,7 +424,7 @@ void packet_decrypt_worker(struct work_struct *work) while ((skb = ptr_ring_consume_bh(&queue->ring)) != NULL) { enum packet_state state = likely(skb_decrypt(skb, &PACKET_CB(skb)->keypair->receiving, have_simd)) ? PACKET_STATE_CRYPTED : PACKET_STATE_DEAD; - queue_enqueue_per_peer(&PACKET_PEER(skb)->rx_queue, skb, state); + queue_enqueue_per_peer_napi(&PACKET_PEER(skb)->rx_queue, skb, state); have_simd = simd_relax(have_simd); } -- cgit v1.2.3