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-Tag: v9.17.1~109^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a0d36d760199e71281e17fa8e4bb276a7cabf839;p=thirdparty%2Fbind9.git Make nm->recvbuf larger and heap allocated, to allow uv_recvmmsg usage. Upcoming version of libuv will suport uv_recvmmsg and uv_sendmmsg. To use uv_recvmmsg we need to provide a larger buffer and be able to properly free it. --- diff --git a/lib/isc/netmgr/netmgr-int.h b/lib/isc/netmgr/netmgr-int.h index 653aa01cb07..2c788004060 100644 --- a/lib/isc/netmgr/netmgr-int.h +++ b/lib/isc/netmgr/netmgr-int.h @@ -35,6 +35,19 @@ #define ISC_NETMGR_TID_UNKNOWN -1 +#if !defined(WIN32) +/* + * New versions of libuv support recvmmsg on unices. + * Since recvbuf is only allocated per worker allocating a bigger one is not + * that wasteful. + * 20 here is UV__MMSG_MAXWIDTH taken from the current libuv source, nothing + * will break if the original value changes. + */ +#define ISC_NETMGR_RECVBUF_SIZE (20 * 65536) +#else +#define ISC_NETMGR_RECVBUF_SIZE (65536) +#endif + /* * Single network event loop worker. */ @@ -56,7 +69,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 d4a4730eb6a..ca0b1850076 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -196,6 +196,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 @@ -268,6 +269,8 @@ 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); } @@ -960,14 +963,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 @@ -982,8 +985,13 @@ 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; }