diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2017-04-05 14:45:20 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2017-04-08 01:49:32 +0200 |
commit | 0136e8870974b8fa92030d80064f1a4549bfab46 (patch) | |
tree | 7afc886f043cdcd57617a41deb6cc87e952b3160 /src | |
parent | ad05185de7870e47ae1b5b6a4b32cb31d2d9e155 (diff) |
data: cleanup parallel workqueue and use two max_active
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/data.c | 4 | ||||
-rw-r--r-- | src/device.c | 36 | ||||
-rw-r--r-- | src/device.h | 8 | ||||
-rw-r--r-- | src/peer.c | 4 | ||||
-rw-r--r-- | src/receive.c | 4 | ||||
-rw-r--r-- | src/send.c | 2 | ||||
-rw-r--r-- | src/timers.c | 2 |
7 files changed, 31 insertions, 29 deletions
@@ -304,7 +304,7 @@ int packet_create_data(struct sk_buff_head *queue, struct wireguard_peer *peer) if (unlikely(!ctx->peer)) goto err_parallel; atomic_inc(&peer->parallel_encryption_inflight); - if (unlikely(padata_do_parallel(peer->device->parallel_send, &ctx->padata, choose_cpu(keypair->remote_index)))) { + if (unlikely(padata_do_parallel(peer->device->encrypt_pd, &ctx->padata, choose_cpu(keypair->remote_index)))) { atomic_dec(&peer->parallel_encryption_inflight); peer_put(ctx->peer); err_parallel: @@ -397,7 +397,7 @@ void packet_consume_data(struct sk_buff *skb, struct wireguard_device *wg) memset(&ctx->padata, 0, sizeof(ctx->padata)); ctx->padata.parallel = begin_parallel_decryption; ctx->padata.serial = finish_parallel_decryption; - if (unlikely(padata_do_parallel(wg->parallel_receive, &ctx->padata, choose_cpu(idx)))) { + if (unlikely(padata_do_parallel(wg->decrypt_pd, &ctx->padata, choose_cpu(idx)))) { kmem_cache_free(decryption_ctx_cache, ctx); goto err_peer; } diff --git a/src/device.c b/src/device.c index 190e6aa..fb87ccd 100644 --- a/src/device.c +++ b/src/device.c @@ -233,11 +233,11 @@ static void destruct(struct net_device *dev) mutex_lock(&wg->device_update_lock); peer_remove_all(wg); wg->incoming_port = 0; - destroy_workqueue(wg->workqueue); + destroy_workqueue(wg->handshake_wq); #ifdef CONFIG_WIREGUARD_PARALLEL - padata_free(wg->parallel_send); - padata_free(wg->parallel_receive); - destroy_workqueue(wg->parallelqueue); + padata_free(wg->encrypt_pd); + padata_free(wg->decrypt_pd); + destroy_workqueue(wg->crypt_wq); #endif routing_table_free(&wg->peer_routing_table); memzero_explicit(&wg->static_identity, sizeof(struct noise_static_identity)); @@ -306,24 +306,24 @@ static int newlink(struct net *src_net, struct net_device *dev, struct nlattr *t if (!dev->tstats) goto error_1; - wg->workqueue = alloc_workqueue("wg-%s", WQ_UNBOUND | WQ_FREEZABLE, 0, dev->name); - if (!wg->workqueue) + wg->handshake_wq = alloc_workqueue("wg-kex-%s", WQ_UNBOUND | WQ_FREEZABLE, 0, dev->name); + if (!wg->handshake_wq) goto error_2; #ifdef CONFIG_WIREGUARD_PARALLEL - wg->parallelqueue = alloc_workqueue("wg-crypt-%s", WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM, 1, dev->name); - if (!wg->parallelqueue) + wg->crypt_wq = alloc_workqueue("wg-crypt-%s", WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM, 2, dev->name); + if (!wg->crypt_wq) goto error_3; - wg->parallel_send = padata_alloc_possible(wg->parallelqueue); - if (!wg->parallel_send) + wg->encrypt_pd = padata_alloc_possible(wg->crypt_wq); + if (!wg->encrypt_pd) goto error_4; - padata_start(wg->parallel_send); + padata_start(wg->encrypt_pd); - wg->parallel_receive = padata_alloc_possible(wg->parallelqueue); - if (!wg->parallel_receive) + wg->decrypt_pd = padata_alloc_possible(wg->crypt_wq); + if (!wg->decrypt_pd) goto error_5; - padata_start(wg->parallel_receive); + padata_start(wg->decrypt_pd); #endif ret = cookie_checker_init(&wg->cookie_checker, wg); @@ -353,14 +353,14 @@ error_7: cookie_checker_uninit(&wg->cookie_checker); error_6: #ifdef CONFIG_WIREGUARD_PARALLEL - padata_free(wg->parallel_receive); + padata_free(wg->decrypt_pd); error_5: - padata_free(wg->parallel_send); + padata_free(wg->encrypt_pd); error_4: - destroy_workqueue(wg->parallelqueue); + destroy_workqueue(wg->crypt_wq); error_3: #endif - destroy_workqueue(wg->workqueue); + destroy_workqueue(wg->handshake_wq); error_2: free_percpu(dev->tstats); error_1: diff --git a/src/device.h b/src/device.h index 855ec27..cdfb5f7 100644 --- a/src/device.h +++ b/src/device.h @@ -21,9 +21,7 @@ struct wireguard_device { u16 incoming_port; u32 fwmark; struct net *creating_net; - struct workqueue_struct *workqueue; - struct workqueue_struct *parallelqueue; - struct padata_instance *parallel_send, *parallel_receive; + struct workqueue_struct *handshake_wq; struct noise_static_identity static_identity; struct sk_buff_head incoming_handshakes; struct work_struct incoming_handshakes_work; @@ -37,6 +35,10 @@ struct wireguard_device { #ifdef CONFIG_PM_SLEEP struct notifier_block clear_peers_on_suspend; #endif +#ifdef CONFIG_WIREGUARD_PARALLEL + struct workqueue_struct *crypt_wq; + struct padata_instance *encrypt_pd, *decrypt_pd; +#endif }; int device_init(void); @@ -77,8 +77,8 @@ void peer_remove(struct wireguard_peer *peer) timers_uninit_peer(peer); routing_table_remove_by_peer(&peer->device->peer_routing_table, peer); pubkey_hashtable_remove(&peer->device->peer_hashtable, peer); - if (peer->device->workqueue) - flush_workqueue(peer->device->workqueue); + if (peer->device->handshake_wq) + flush_workqueue(peer->device->handshake_wq); skb_queue_purge(&peer->tx_packet_queue); peer_put(peer); } diff --git a/src/receive.c b/src/receive.c index 929d723..06be5f7 100644 --- a/src/receive.c +++ b/src/receive.c @@ -179,7 +179,7 @@ void packet_process_queued_handshake_packets(struct work_struct *work) receive_handshake_packet(wg, skb); dev_kfree_skb(skb); if (++num_processed == MAX_BURST_INCOMING_HANDSHAKES) { - queue_work(wg->workqueue, &wg->incoming_handshakes_work); + queue_work(wg->handshake_wq, &wg->incoming_handshakes_work); return; } } @@ -296,7 +296,7 @@ void packet_receive(struct wireguard_device *wg, struct sk_buff *skb) } skb_queue_tail(&wg->incoming_handshakes, skb); /* Queues up a call to packet_process_queued_handshake_packets(skb): */ - queue_work(wg->workqueue, &wg->incoming_handshakes_work); + queue_work(wg->handshake_wq, &wg->incoming_handshakes_work); break; case MESSAGE_DATA: PACKET_CB(skb)->ds = ip_tunnel_get_dsfield(ip_hdr(skb), skb); @@ -56,7 +56,7 @@ void packet_queue_handshake_initiation(struct wireguard_peer *peer) return; /* Queues up calling packet_send_queued_handshakes(peer), where we do a peer_put(peer) after: */ - if (!queue_work(peer->device->workqueue, &peer->transmit_handshake_work)) + if (!queue_work(peer->device->handshake_wq, &peer->transmit_handshake_work)) peer_put(peer); /* If the work was already queued, we want to drop the extra reference */ } diff --git a/src/timers.c b/src/timers.c index 4fd9ec8..92c7c78 100644 --- a/src/timers.c +++ b/src/timers.c @@ -74,7 +74,7 @@ static void expired_new_handshake(unsigned long ptr) static void expired_kill_ephemerals(unsigned long ptr) { peer_get_from_ptr(ptr); - if (!queue_work(peer->device->workqueue, &peer->clear_peer_work)) /* Takes our reference. */ + if (!queue_work(peer->device->handshake_wq, &peer->clear_peer_work)) /* Takes our reference. */ peer_put(peer); /* If the work was already on the queue, we want to drop the extra reference */ } static void queued_expired_kill_ephemerals(struct work_struct *work) |