mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-28 01:28:59 +00:00
89 lines
3.3 KiB
Diff
89 lines
3.3 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: "Jason A. Donenfeld" <Jason@zx2c4.com>
|
||
|
Date: Wed, 6 May 2020 15:33:06 -0600
|
||
|
Subject: [PATCH] wireguard: send/receive: use explicit unlikely branch instead
|
||
|
of implicit coalescing
|
||
|
|
||
|
commit 243f2148937adc72bcaaa590d482d599c936efde upstream.
|
||
|
|
||
|
It's very unlikely that send will become true. It's nearly always false
|
||
|
between 0 and 120 seconds of a session, and in most cases becomes true
|
||
|
only between 120 and 121 seconds before becoming false again. So,
|
||
|
unlikely(send) is clearly the right option here.
|
||
|
|
||
|
What happened before was that we had this complex boolean expression
|
||
|
with multiple likely and unlikely clauses nested. Since this is
|
||
|
evaluated left-to-right anyway, the whole thing got converted to
|
||
|
unlikely. So, we can clean this up to better represent what's going on.
|
||
|
|
||
|
The generated code is the same.
|
||
|
|
||
|
Suggested-by: Sultan Alsawaf <sultan@kerneltoast.com>
|
||
|
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
|
||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
|
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
|
||
|
---
|
||
|
drivers/net/wireguard/receive.c | 13 ++++++-------
|
||
|
drivers/net/wireguard/send.c | 15 ++++++---------
|
||
|
2 files changed, 12 insertions(+), 16 deletions(-)
|
||
|
|
||
|
--- a/drivers/net/wireguard/receive.c
|
||
|
+++ b/drivers/net/wireguard/receive.c
|
||
|
@@ -226,21 +226,20 @@ void wg_packet_handshake_receive_worker(
|
||
|
static void keep_key_fresh(struct wg_peer *peer)
|
||
|
{
|
||
|
struct noise_keypair *keypair;
|
||
|
- bool send = false;
|
||
|
+ bool send;
|
||
|
|
||
|
if (peer->sent_lastminute_handshake)
|
||
|
return;
|
||
|
|
||
|
rcu_read_lock_bh();
|
||
|
keypair = rcu_dereference_bh(peer->keypairs.current_keypair);
|
||
|
- if (likely(keypair && READ_ONCE(keypair->sending.is_valid)) &&
|
||
|
- keypair->i_am_the_initiator &&
|
||
|
- unlikely(wg_birthdate_has_expired(keypair->sending.birthdate,
|
||
|
- REJECT_AFTER_TIME - KEEPALIVE_TIMEOUT - REKEY_TIMEOUT)))
|
||
|
- send = true;
|
||
|
+ send = keypair && READ_ONCE(keypair->sending.is_valid) &&
|
||
|
+ keypair->i_am_the_initiator &&
|
||
|
+ wg_birthdate_has_expired(keypair->sending.birthdate,
|
||
|
+ REJECT_AFTER_TIME - KEEPALIVE_TIMEOUT - REKEY_TIMEOUT);
|
||
|
rcu_read_unlock_bh();
|
||
|
|
||
|
- if (send) {
|
||
|
+ if (unlikely(send)) {
|
||
|
peer->sent_lastminute_handshake = true;
|
||
|
wg_packet_send_queued_handshake_initiation(peer, false);
|
||
|
}
|
||
|
--- a/drivers/net/wireguard/send.c
|
||
|
+++ b/drivers/net/wireguard/send.c
|
||
|
@@ -124,20 +124,17 @@ void wg_packet_send_handshake_cookie(str
|
||
|
static void keep_key_fresh(struct wg_peer *peer)
|
||
|
{
|
||
|
struct noise_keypair *keypair;
|
||
|
- bool send = false;
|
||
|
+ bool send;
|
||
|
|
||
|
rcu_read_lock_bh();
|
||
|
keypair = rcu_dereference_bh(peer->keypairs.current_keypair);
|
||
|
- if (likely(keypair && READ_ONCE(keypair->sending.is_valid)) &&
|
||
|
- (unlikely(atomic64_read(&keypair->sending.counter.counter) >
|
||
|
- REKEY_AFTER_MESSAGES) ||
|
||
|
- (keypair->i_am_the_initiator &&
|
||
|
- unlikely(wg_birthdate_has_expired(keypair->sending.birthdate,
|
||
|
- REKEY_AFTER_TIME)))))
|
||
|
- send = true;
|
||
|
+ send = keypair && READ_ONCE(keypair->sending.is_valid) &&
|
||
|
+ (atomic64_read(&keypair->sending.counter.counter) > REKEY_AFTER_MESSAGES ||
|
||
|
+ (keypair->i_am_the_initiator &&
|
||
|
+ wg_birthdate_has_expired(keypair->sending.birthdate, REKEY_AFTER_TIME)));
|
||
|
rcu_read_unlock_bh();
|
||
|
|
||
|
- if (send)
|
||
|
+ if (unlikely(send))
|
||
|
wg_packet_send_queued_handshake_initiation(peer, false);
|
||
|
}
|
||
|
|