diff --git a/lib/isc/netmgr/http.c b/lib/isc/netmgr/http.c index fe083667b8..d33d778df6 100644 --- a/lib/isc/netmgr/http.c +++ b/lib/isc/netmgr/http.c @@ -1482,7 +1482,7 @@ isc_nm_httpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer, local = &local_interface; } - sock = isc_mem_get(worker->mctx, sizeof(*sock)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, isc_nm_httpsocket, local, NULL); http_initsocket(sock); @@ -1694,7 +1694,7 @@ server_on_begin_headers_callback(nghttp2_session *ngsession, INSIST(session->handle->sock->tid == isc_tid()); worker = session->handle->sock->worker; - socket = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t)); + socket = isc_mempool_get(worker->nmsocket_pool); local = isc_nmhandle_localaddr(session->handle); isc__nmsocket_init(socket, worker, isc_nm_httpsocket, &local, NULL); http_initsocket(socket); @@ -2515,7 +2515,7 @@ isc_nm_listenhttp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface, REQUIRE(isc_tid() == 0); worker = &mgr->workers[isc_tid()]; - sock = isc_mem_get(worker->mctx, sizeof(*sock)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, isc_nm_httplistener, iface, NULL); http_initsocket(sock); atomic_init(&sock->h2->max_concurrent_streams, diff --git a/lib/isc/netmgr/netmgr-int.h b/lib/isc/netmgr/netmgr-int.h index 1c5da3cbe3..13485dfb58 100644 --- a/lib/isc/netmgr/netmgr-int.h +++ b/lib/isc/netmgr/netmgr-int.h @@ -109,6 +109,7 @@ STATIC_ASSERT(ISC_NETMGR_TCP_RECVBUF_SIZE <= ISC_NETMGR_RECVBUF_SIZE, * How many isc_nmhandles and isc_nm_uvreqs will we be * caching for reuse in a socket. */ +#define ISC_NM_NMSOCKET_MAX 64 #define ISC_NM_NMHANDLES_MAX 64 #define ISC_NM_UVREQS_MAX 64 @@ -210,6 +211,7 @@ typedef struct isc__networker { ISC_LIST(isc_nmsocket_t) active_sockets; + isc_mempool_t *nmsocket_pool; isc_mempool_t *uvreq_pool; } isc__networker_t; diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c index 84b7604982..f410c2e7a1 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -222,6 +222,11 @@ isc_netmgr_create(isc_mem_t *mctx, isc_loopmgr_t *loopmgr, isc_nm_t **netmgrp) { isc_mem_attach(loop->mctx, &worker->mctx); + isc_mempool_create(worker->mctx, sizeof(isc_nmsocket_t), + &worker->nmsocket_pool); + isc_mempool_setfreemax(worker->nmsocket_pool, + ISC_NM_NMSOCKET_MAX); + isc_mempool_create(worker->mctx, sizeof(isc__nm_uvreq_t), &worker->uvreq_pool); isc_mempool_setfreemax(worker->uvreq_pool, ISC_NM_UVREQS_MAX); @@ -492,7 +497,7 @@ nmsocket_cleanup(void *arg) { ISC_LIST_UNLINK(worker->active_sockets, sock, active_link); - isc_mem_put(worker->mctx, sock, sizeof(*sock)); + isc_mempool_put(worker->nmsocket_pool, sock); } isc__networker_detach(&worker); @@ -2571,6 +2576,7 @@ isc__networker_destroy(isc__networker_t *worker) { isc_loop_detach(&worker->loop); isc_mempool_destroy(&worker->uvreq_pool); + isc_mempool_destroy(&worker->nmsocket_pool); isc_mem_putanddetach(&worker->mctx, worker->recvbuf, ISC_NETMGR_RECVBUF_SIZE); diff --git a/lib/isc/netmgr/proxystream.c b/lib/isc/netmgr/proxystream.c index 893f1ccf0d..c24ed26278 100644 --- a/lib/isc/netmgr/proxystream.c +++ b/lib/isc/netmgr/proxystream.c @@ -236,7 +236,7 @@ proxystream_sock_new(isc__networker_t *worker, const isc_nmsocket_type_t type, INSIST(type == isc_nm_proxystreamsocket || type == isc_nm_proxystreamlistener); - sock = isc_mem_get(worker->mctx, sizeof(*sock)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, type, addr, NULL); sock->result = ISC_R_UNSET; if (type == isc_nm_proxystreamsocket) { diff --git a/lib/isc/netmgr/proxyudp.c b/lib/isc/netmgr/proxyudp.c index 99acc579bc..49a372563d 100644 --- a/lib/isc/netmgr/proxyudp.c +++ b/lib/isc/netmgr/proxyudp.c @@ -209,7 +209,7 @@ proxyudp_sock_new(isc__networker_t *worker, const isc_nmsocket_type_t type, INSIST(type == isc_nm_proxyudpsocket || type == isc_nm_proxyudplistener); - sock = isc_mem_get(worker->mctx, sizeof(*sock)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, type, addr, NULL); sock->result = ISC_R_UNSET; if (type == isc_nm_proxyudpsocket) { diff --git a/lib/isc/netmgr/streamdns.c b/lib/isc/netmgr/streamdns.c index 9460121e02..cab9c22f62 100644 --- a/lib/isc/netmgr/streamdns.c +++ b/lib/isc/netmgr/streamdns.c @@ -250,7 +250,7 @@ streamdns_sock_new(isc__networker_t *worker, const isc_nmsocket_type_t type, INSIST(type == isc_nm_streamdnssocket || type == isc_nm_streamdnslistener); - sock = isc_mem_get(worker->mctx, sizeof(*sock)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, type, addr, NULL); sock->result = ISC_R_UNSET; if (type == isc_nm_streamdnssocket) { diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c index b6545a912d..63612bf130 100644 --- a/lib/isc/netmgr/tcp.c +++ b/lib/isc/netmgr/tcp.c @@ -245,7 +245,7 @@ isc_nm_tcpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer, return; } - sock = isc_mem_get(worker->mctx, sizeof(*sock)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, isc_nm_tcpsocket, local, NULL); sock->connect_timeout = timeout; @@ -459,7 +459,7 @@ isc_nm_listentcp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface, REQUIRE(workers <= mgr->nloops); worker = &mgr->workers[0]; - sock = isc_mem_get(worker->mctx, sizeof(*sock)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, isc_nm_tcplistener, iface, NULL); sock->nchildren = (workers == ISC_NM_LISTEN_ALL) ? (uint32_t)mgr->nloops @@ -539,8 +539,7 @@ tcp_connection_cb(uv_stream_t *server, int status) { } /* Prepare the child socket */ - isc_nmsocket_t *csock = isc_mem_get(ssock->worker->mctx, - sizeof(isc_nmsocket_t)); + isc_nmsocket_t *csock = isc_mempool_get(ssock->worker->nmsocket_pool); isc__nmsocket_init(csock, ssock->worker, isc_nm_tcpsocket, &ssock->iface, NULL); isc__nmsocket_attach(ssock, &csock->server); diff --git a/lib/isc/netmgr/tlsstream.c b/lib/isc/netmgr/tlsstream.c index 654e1921e6..7990351217 100644 --- a/lib/isc/netmgr/tlsstream.c +++ b/lib/isc/netmgr/tlsstream.c @@ -913,7 +913,7 @@ tlslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) { /* * We need to create a 'wrapper' tlssocket for this connection. */ - tlssock = isc_mem_get(handle->sock->worker->mctx, sizeof(*tlssock)); + tlssock = isc_mempool_get(handle->sock->worker->nmsocket_pool); isc__nmsocket_init(tlssock, handle->sock->worker, isc_nm_tlssocket, &local, NULL); @@ -978,8 +978,7 @@ isc_nm_listentls(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface, } REQUIRE(workers <= mgr->nloops); - tlssock = isc_mem_get(worker->mctx, sizeof(*tlssock)); - + tlssock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(tlssock, worker, isc_nm_tlslistener, iface, NULL); tlssock->accept_cb = accept_cb; tlssock->accept_cbarg = accept_cbarg; @@ -1213,7 +1212,7 @@ isc_nm_tlsconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer, return; } - sock = isc_mem_get(worker->mctx, sizeof(*sock)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, isc_nm_tlssocket, local, NULL); sock->connect_cb = connect_cb; sock->connect_cbarg = connect_cbarg; diff --git a/lib/isc/netmgr/udp.c b/lib/isc/netmgr/udp.c index d9aa3f7716..1bcff168b2 100644 --- a/lib/isc/netmgr/udp.c +++ b/lib/isc/netmgr/udp.c @@ -227,7 +227,7 @@ isc_nm_listenudp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface, } REQUIRE(workers <= mgr->nloops); - sock = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, isc_nm_udplistener, iface, NULL); sock->nchildren = (workers == ISC_NM_LISTEN_ALL) ? (uint32_t)mgr->nloops @@ -376,7 +376,7 @@ isc_nm_routeconnect(isc_nm_t *mgr, isc_nm_cb_t cb, void *cbarg) { return (result); } - sock = isc_mem_get(worker->mctx, sizeof(*sock)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, isc_nm_udpsocket, NULL, NULL); sock->connect_cb = cb; @@ -796,8 +796,7 @@ isc_nm_udpconnect(isc_nm_t *mgr, isc_sockaddr_t *local, isc_sockaddr_t *peer, } /* Initialize the new socket */ - /* FIXME: Use per-worker mempool for new sockets */ - sock = isc_mem_get(worker->mctx, sizeof(isc_nmsocket_t)); + sock = isc_mempool_get(worker->nmsocket_pool); isc__nmsocket_init(sock, worker, isc_nm_udpsocket, local, NULL); sock->connect_cb = cb;