diff options
author | Jakub Kicinski <kuba@kernel.org> | 2021-02-23 15:54:08 -0800 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2021-02-23 15:59:35 -0800 |
commit | ea085e5da33496b0aa965481787dc56410e5eda7 (patch) | |
tree | 9c09875378fc2a23dd0b8d4f13bad8b98ab9836d /drivers/net/wireguard/peer.c | |
parent | 1bb13d02e6fff32818ccde759efe88c70afd008e (diff) | |
parent | b955554b47aff90e56ba402dfce4122cb9b28a4e (diff) | |
download | wireguard-linux-trimmed-ea085e5da33496b0aa965481787dc56410e5eda7.tar.gz wireguard-linux-trimmed-ea085e5da33496b0aa965481787dc56410e5eda7.zip |
Merge branch 'wireguard-fixes-for-5-12-rc1'
Jason Donenfeld says:
====================
wireguard fixes for 5.12-rc1
This series has a collection of fixes that have piled up for a little
while now, that I unfortunately didn't get a chance to send out earlier.
1) Removes unlikely() from IS_ERR(), since it's already implied.
2) Remove a bogus sparse annotation that hasn't been needed for years.
3) Addition test in the test suite for stressing parallel ndo_start_xmit.
4) Slight struct reordering in preparation for subsequent fix.
5) If skb->protocol is bogus, we no longer attempt to send icmp messages.
6) Massive memory usage fix, hit by larger deployments.
7) Fix typo in kconfig dependency logic.
(1) and (2) are tiny cleanups, and (3) is just a test, so if you're
trying to reduce churn, you could not backport these. But (4), (5), (6),
and (7) fix problems and should be applied to stable. IMO, it's probably
easiest to just apply them all to stable.
====================
Link: https://lore.kernel.org/r/20210222162549.3252778-1-Jason@zx2c4.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers/net/wireguard/peer.c')
-rw-r--r-- | drivers/net/wireguard/peer.c | 28 |
1 files changed, 9 insertions, 19 deletions
diff --git a/drivers/net/wireguard/peer.c b/drivers/net/wireguard/peer.c index b3b6370..cd5cb02 100644 --- a/drivers/net/wireguard/peer.c +++ b/drivers/net/wireguard/peer.c @@ -32,27 +32,22 @@ struct wg_peer *wg_peer_create(struct wg_device *wg, peer = kzalloc(sizeof(*peer), GFP_KERNEL); if (unlikely(!peer)) return ERR_PTR(ret); - peer->device = wg; + if (dst_cache_init(&peer->endpoint_cache, GFP_KERNEL)) + goto err; + peer->device = wg; wg_noise_handshake_init(&peer->handshake, &wg->static_identity, public_key, preshared_key, peer); - if (dst_cache_init(&peer->endpoint_cache, GFP_KERNEL)) - goto err_1; - if (wg_packet_queue_init(&peer->tx_queue, wg_packet_tx_worker, false, - MAX_QUEUED_PACKETS)) - goto err_2; - if (wg_packet_queue_init(&peer->rx_queue, NULL, false, - MAX_QUEUED_PACKETS)) - goto err_3; - peer->internal_id = atomic64_inc_return(&peer_counter); peer->serial_work_cpu = nr_cpumask_bits; wg_cookie_init(&peer->latest_cookie); wg_timers_init(peer); wg_cookie_checker_precompute_peer_keys(peer); spin_lock_init(&peer->keypairs.keypair_update_lock); - INIT_WORK(&peer->transmit_handshake_work, - wg_packet_handshake_send_worker); + INIT_WORK(&peer->transmit_handshake_work, wg_packet_handshake_send_worker); + INIT_WORK(&peer->transmit_packet_work, wg_packet_tx_worker); + wg_prev_queue_init(&peer->tx_queue); + wg_prev_queue_init(&peer->rx_queue); rwlock_init(&peer->endpoint_lock); kref_init(&peer->refcount); skb_queue_head_init(&peer->staged_packet_queue); @@ -68,11 +63,7 @@ struct wg_peer *wg_peer_create(struct wg_device *wg, pr_debug("%s: Peer %llu created\n", wg->dev->name, peer->internal_id); return peer; -err_3: - wg_packet_queue_free(&peer->tx_queue, false); -err_2: - dst_cache_destroy(&peer->endpoint_cache); -err_1: +err: kfree(peer); return ERR_PTR(ret); } @@ -197,8 +188,7 @@ static void rcu_release(struct rcu_head *rcu) struct wg_peer *peer = container_of(rcu, struct wg_peer, rcu); dst_cache_destroy(&peer->endpoint_cache); - wg_packet_queue_free(&peer->rx_queue, false); - wg_packet_queue_free(&peer->tx_queue, false); + WARN_ON(wg_prev_queue_peek(&peer->tx_queue) || wg_prev_queue_peek(&peer->rx_queue)); /* The final zeroing takes care of clearing any remaining handshake key * material and other potentially sensitive information. |