| 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); |
| } |
| |