]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/worker: per-pkt pools
authorMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 21 Jul 2015 16:00:25 +0000 (18:00 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 21 Jul 2015 16:00:25 +0000 (18:00 +0200)
daemon/io.c
daemon/worker.c
daemon/worker.h

index f4073fba1ad4885a6152dc57a7eece4b7a0c8e48..f29747ebbf5cb268e81fa6489997e0a18a6fc2e5 100644 (file)
@@ -16,6 +16,8 @@
 
 #include <libknot/errcode.h>
 #include <libknot/internal/utils.h>
+#include <contrib/ucw/lib.h>
+#include <contrib/ucw/mempool.h>
 
 #include "daemon/io.h"
 #include "daemon/network.h"
@@ -58,10 +60,10 @@ void udp_recv(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf,
                return;
        }
 
-       knot_pkt_t *query = knot_pkt_new(buf->base, nread, worker->mm);
+       knot_pkt_t *query = knot_pkt_new(buf->base, nread, &worker->pkt_pool);
        query->max_size = KNOT_WIRE_MAX_PKTSIZE;
        worker_exec(worker, (uv_handle_t *)handle, query, addr);
-       knot_pkt_free(&query);
+       mp_flush(worker->pkt_pool.ctx);
 }
 
 int udp_bind(struct endpoint *ep, struct sockaddr *addr)
@@ -107,7 +109,7 @@ static void tcp_recv(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf)
                return;
        }
 
-       knot_pkt_t *query = knot_pkt_new(buf->base + 2, nbytes, worker->mm);
+       knot_pkt_t *query = knot_pkt_new(buf->base + 2, nbytes, &worker->pkt_pool);
        query->max_size = sizeof(worker->wire_buf);
        int ret = worker_exec(worker, (uv_handle_t *)handle, query, NULL);
        if (ret == 0) {
@@ -118,7 +120,7 @@ static void tcp_recv(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf)
                uv_unref((uv_handle_t *)handle);
                io_stop_read((uv_handle_t *)handle);
        }
-       knot_pkt_free(&query);
+       mp_flush(worker->pkt_pool.ctx);
 }
 
 static void tcp_accept(uv_stream_t *master, int status)
index 98fea497355cbd73c946495773b937ca034d05b1..71c43f9de613238a535b014aaf116756638f470b 100644 (file)
@@ -425,7 +425,13 @@ int worker_resolve(struct worker_ctx *worker, knot_pkt_t *query, unsigned option
 int worker_reserve(struct worker_ctx *worker, size_t ring_maxlen)
 {
        array_init(worker->pools);
-       return array_reserve(worker->pools, ring_maxlen);
+       array_init(worker->ioreqs);
+       array_reserve(worker->pools, ring_maxlen);
+       array_reserve(worker->ioreqs, ring_maxlen);
+       memset(&worker->pkt_pool, 0, sizeof(worker->pkt_pool));
+       worker->pkt_pool.ctx = mp_new (4 * sizeof(knot_pkt_t));
+       worker->pkt_pool.alloc = (mm_alloc_t) mp_alloc;
+       return kr_ok();
 }
 
 #define reclaim_freelist(list, cb) \
@@ -438,4 +444,6 @@ void worker_reclaim(struct worker_ctx *worker)
 {
        reclaim_freelist(worker->pools, mp_delete);
        reclaim_freelist(worker->ioreqs, free);
+       mp_delete(worker->pkt_pool.ctx);
+       worker->pkt_pool.ctx = NULL;
 }
index 21cc0b97adf5f0a3f8a94ab790f5df6f3301ed76..f2cf3db5b2b10f7a691ef4ace56268cd60499a77 100644 (file)
@@ -31,7 +31,6 @@ typedef array_t(void *) mp_freelist_t;
 struct worker_ctx {
        struct engine *engine;
        uv_loop_t *loop;
-       mm_ctx_t *mm;
 #if __linux__
        uint8_t wire_buf[RECVMMSG_BATCH * KNOT_WIRE_MAX_PKTSIZE];
 #else
@@ -46,6 +45,7 @@ struct worker_ctx {
        } stats;
        mp_freelist_t pools;
        mp_freelist_t ioreqs;
+       mm_ctx_t pkt_pool;
 };
 
 /**