diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2017-10-04 05:05:51 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2017-10-05 15:27:29 +0200 |
commit | 4a6e3b549f11220991bd8fce2b50b1a7f092837e (patch) | |
tree | c999c2fc6aaba2dafc292314a5030dfacbfe3570 /src/queueing.c | |
parent | 48d7390a2ed1c615d56d426ed8e7a2f31d4542fd (diff) |
queueing: use ptr_ring instead of linked lists
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src/queueing.c')
-rw-r--r-- | src/queueing.c | 19 |
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); |