From: Witold Kręcicki Date: Wed, 29 Jan 2020 12:16:04 +0000 (+0100) Subject: Make nm->recvbuf larger and heap allocated, to allow uv_recvmmsg usage. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2873ad7f46ceec93419ecb3735b68904577984ba;p=thirdparty%2Fbind9.git Make nm->recvbuf larger and heap allocated, to allow uv_recvmmsg usage. --- diff --git a/lib/isc/netmgr/netmgr-int.h b/lib/isc/netmgr/netmgr-int.h index 7dfa8872e64..468c8c9563e 100644 --- a/lib/isc/netmgr/netmgr-int.h +++ b/lib/isc/netmgr/netmgr-int.h @@ -33,7 +33,7 @@ #include "uv-compat.h" #define ISC_NETMGR_TID_UNKNOWN -1 - +#define ISC_NETMGR_RECVBUF_SIZE (20*65536) /* * Single network event loop worker. */ @@ -55,7 +55,7 @@ typedef struct isc__networker { * worker is paused */ isc_refcount_t references; atomic_int_fast64_t pktcount; - char recvbuf[65536]; + char * recvbuf; bool recvbuf_inuse; } isc__networker_t; diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c index 41d4cce7b30..3ad2f80a1be 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -210,6 +210,7 @@ isc_nm_start(isc_mem_t *mctx, uint32_t workers) { worker->ievents = isc_queue_new(mgr->mctx, 128); worker->ievents_prio = isc_queue_new(mgr->mctx, 128); + worker->recvbuf = isc_mem_get(mctx, ISC_NETMGR_RECVBUF_SIZE); /* * We need to do this here and not in nm_thread to avoid a @@ -281,6 +282,7 @@ nm_destroy(isc_nm_t **mgr0) { isc_queue_destroy(worker->ievents); isc_queue_destroy(worker->ievents_prio); + isc_mem_put(mgr->mctx, worker->recvbuf, ISC_NETMGR_RECVBUF_SIZE); isc_thread_join(worker->thread, NULL); } @@ -982,14 +984,14 @@ isc__nm_alloc_cb(uv_handle_t *handle, size_t size, uv_buf_t *buf) { REQUIRE(VALID_NMSOCK(sock)); REQUIRE(isc__nm_in_netthread()); - REQUIRE(size <= 65536); + REQUIRE(size <= ISC_NETMGR_RECVBUF_SIZE); worker = &sock->mgr->workers[sock->tid]; INSIST(!worker->recvbuf_inuse); buf->base = worker->recvbuf; worker->recvbuf_inuse = true; - buf->len = size; + buf->len = ISC_NETMGR_RECVBUF_SIZE; } void @@ -1004,8 +1006,11 @@ isc__nm_free_uvbuf(isc_nmsocket_t *sock, const uv_buf_t *buf) { worker = &sock->mgr->workers[sock->tid]; REQUIRE(worker->recvbuf_inuse); + if (buf->base > worker->recvbuf && buf->base <= worker->recvbuf + ISC_NETMGR_RECVBUF_SIZE) { + /* Can happen in case of recvmmsg */ + return; + } REQUIRE(buf->base == worker->recvbuf); - worker->recvbuf_inuse = false; }