]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Make nm->recvbuf larger and heap allocated, to allow uv_recvmmsg usage.
authorWitold Kręcicki <wpk@isc.org>
Wed, 29 Jan 2020 12:16:04 +0000 (13:16 +0100)
committerWitold Kręcicki <wpk@isc.org>
Fri, 7 Feb 2020 08:41:48 +0000 (09:41 +0100)
lib/isc/netmgr/netmgr-int.h
lib/isc/netmgr/netmgr.c

index 7dfa8872e64ef4a1c8585974d9d4fba2bc047911..468c8c9563e0ea12ca4440a180df0a5e310787af 100644 (file)
@@ -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;
 
index 41d4cce7b30000cdb3a89e7e3fc30d1c6d9b286c..3ad2f80a1be3e0cd0de0db057a096de10bea6946 100644 (file)
@@ -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;
 }