diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2017-10-25 17:01:18 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2017-10-31 17:25:23 +0100 |
commit | 2a221ee32e7fa17b1dd983f520768ff455603912 (patch) | |
tree | 7fae52acd90b0fcb15bb6211617838ec79eaad8a /src/peer.c | |
parent | bd6692ea74658bc084ba8fa1979549beda104be7 (diff) |
peer: store total number of peers instead of iterating
This is faster, since it means adding a new peer is O(1) instead of
O(n). It's also safe to do because we're holding the device_update_lock
on both the ++ and the --.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src/peer.c')
-rw-r--r-- | src/peer.c | 15 |
1 files changed, 3 insertions, 12 deletions
@@ -20,8 +20,9 @@ struct wireguard_peer *peer_create(struct wireguard_device *wg, const u8 public_ lockdep_assert_held(&wg->device_update_lock); - if (peer_total_count(wg) >= MAX_PEERS_PER_DEVICE) + if (wg->num_peers >= MAX_PEERS_PER_DEVICE) return NULL; + ++wg->num_peers; peer = kzalloc(sizeof(struct wireguard_peer), GFP_KERNEL); if (!peer) @@ -89,6 +90,7 @@ void peer_remove(struct wireguard_peer *peer) flush_workqueue(peer->device->packet_crypt_wq); /* The first flush is for encrypt/decrypt step. */ flush_workqueue(peer->device->packet_crypt_wq); /* The second flush is for send/receive step. */ flush_workqueue(peer->device->handshake_send_wq); + --peer->device->num_peers; peer_put(peer); } @@ -127,14 +129,3 @@ void peer_remove_all(struct wireguard_device *wg) list_for_each_entry_safe (peer, temp, &wg->peer_list, peer_list) peer_remove(peer); } - -unsigned int peer_total_count(struct wireguard_device *wg) -{ - unsigned int i = 0; - struct wireguard_peer *peer; - - lockdep_assert_held(&wg->device_update_lock); - list_for_each_entry (peer, &wg->peer_list, peer_list) - ++i; - return i; -} |