From: Marek VavruĊĦa Date: Tue, 21 Jul 2015 16:00:25 +0000 (+0200) Subject: daemon/worker: per-pkt pools X-Git-Tag: v1.0.0-beta1~66 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7728fb26119bcc7c7511f364614d400ee571a8e9;p=thirdparty%2Fknot-resolver.git daemon/worker: per-pkt pools --- diff --git a/daemon/io.c b/daemon/io.c index f4073fba1..f29747ebb 100644 --- a/daemon/io.c +++ b/daemon/io.c @@ -16,6 +16,8 @@ #include #include +#include +#include #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) diff --git a/daemon/worker.c b/daemon/worker.c index 98fea4973..71c43f9de 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -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; } diff --git a/daemon/worker.h b/daemon/worker.h index 21cc0b97a..f2cf3db5b 100644 --- a/daemon/worker.h +++ b/daemon/worker.h @@ -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; }; /**