aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/queueing.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2017-10-04 05:05:51 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2017-10-05 15:27:29 +0200
commitaa4d07187b66bf83bfddfa6d964f7c141518ba7b (patch)
treedd5d948dce7251d25079bea81ae103d7a0ae9bc8 /src/queueing.c
parentreceive: we're not planning on turning that into a while loop now (diff)
downloadwireguard-monolithic-historical-aa4d07187b66bf83bfddfa6d964f7c141518ba7b.tar.xz
wireguard-monolithic-historical-aa4d07187b66bf83bfddfa6d964f7c141518ba7b.zip
queueing: use ptr_ring instead of linked lists
Diffstat (limited to 'src/queueing.c')
-rw-r--r--src/queueing.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/queueing.c b/src/queueing.c
index 2e00d63..f1ae4f1 100644
--- a/src/queueing.c
+++ b/src/queueing.c
@@ -20,11 +20,14 @@ struct multicore_worker __percpu *packet_alloc_percpu_multicore_worker(work_func
return worker;
}
-int packet_queue_init(struct crypt_queue *queue, work_func_t function, bool multicore)
+int packet_queue_init(struct crypt_queue *queue, work_func_t function, bool multicore, unsigned int len)
{
- INIT_LIST_HEAD(&queue->queue);
- queue->len = 0;
- spin_lock_init(&queue->lock);
+ int ret;
+
+ memset(queue, 0, sizeof(*queue));
+ ret = ptr_ring_init(&queue->ring, len, GFP_KERNEL);
+ if (ret)
+ return ret;
if (multicore) {
queue->worker = packet_alloc_percpu_multicore_worker(function, queue);
if (!queue->worker)
@@ -34,6 +37,14 @@ int packet_queue_init(struct crypt_queue *queue, work_func_t function, bool mult
return 0;
}
+void packet_queue_free(struct crypt_queue *queue, bool multicore)
+{
+ if (multicore)
+ free_percpu(queue->worker);
+ WARN_ON(!ptr_ring_empty_bh(&queue->ring));
+ ptr_ring_cleanup(&queue->ring, NULL);
+}
+
int __init crypt_ctx_cache_init(void)
{
crypt_ctx_cache = KMEM_CACHE(crypt_ctx, 0);