#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.
*/
* worker is paused */
isc_refcount_t references;
atomic_int_fast64_t pktcount;
- char recvbuf[65536];
+ char *recvbuf;
bool recvbuf_inuse;
} isc__networker_t;
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
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);
}
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
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;
}