From f8b57d580aeec5ffd5a23eba1ad626e9614e70a4 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sat, 16 Jun 2018 02:23:42 +0200 Subject: queueing: re-enable preemption periodically to lower latency --- src/receive.c | 12 ++++++++++++ src/send.c | 6 ++++++ 2 files changed, 18 insertions(+) (limited to 'src') diff --git a/src/receive.c b/src/receive.c index 99d6b19..f33941b 100644 --- a/src/receive.c +++ b/src/receive.c @@ -404,6 +404,12 @@ next: peer_put(peer); if (unlikely(free)) dev_kfree_skb(skb); + + /* Don't totally kill scheduling latency by keeping preemption disabled forever. */ + if (need_resched()) { + local_bh_enable(); + local_bh_disable(); + } } local_bh_enable(); } @@ -418,6 +424,12 @@ void packet_decrypt_worker(struct work_struct *work) 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); + + /* Don't totally kill scheduling latency by keeping preemption disabled forever. */ + if (have_simd && need_resched()) { + chacha20poly1305_deinit_simd(have_simd); + have_simd = chacha20poly1305_init_simd(); + } } chacha20poly1305_deinit_simd(have_simd); diff --git a/src/send.c b/src/send.c index 5151466..e97e439 100644 --- a/src/send.c +++ b/src/send.c @@ -256,6 +256,12 @@ void packet_encrypt_worker(struct work_struct *work) } } queue_enqueue_per_peer(&PACKET_PEER(first)->tx_queue, first, state); + + /* Don't totally kill scheduling latency by keeping preemption disabled forever. */ + if (have_simd && need_resched()) { + chacha20poly1305_deinit_simd(have_simd); + have_simd = chacha20poly1305_init_simd(); + } } chacha20poly1305_deinit_simd(have_simd); } -- cgit v1.2.3-59-g8ed1b