Blob Blame History Raw
From 140ae14a4d6374530c9ab19a29c246abbf6d60b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemensik@redhat.com>
Date: Fri, 11 Feb 2022 13:29:03 +0100
Subject: [PATCH] Add extra hp workers parameter

May be needed by dyndb plugins to prepare extra worker threads. If they
use isc_task_send, their threads need to have initialized enough thread
identifiers in isc_hp_init. New parameters allow that.

Allows specification of both relative and absolute number of extra
workers.

Adds new function isc_managers_create2() with extra parameter, call
original function from many tests and tools unchanged.
---
 bin/named/include/named/globals.h |  2 ++
 bin/named/include/named/main.h    |  2 +-
 bin/named/main.c                  | 29 +++++++++++++++++++++++++----
 bin/named/named.rst               |  9 +++++++++
 lib/isc/include/isc/managers.h    |  5 +++++
 lib/isc/managers.c                | 11 ++++++++++-
 6 files changed, 52 insertions(+), 6 deletions(-)

diff --git a/bin/named/include/named/globals.h b/bin/named/include/named/globals.h
index 82b632ef04..d46e62b94d 100644
--- a/bin/named/include/named/globals.h
+++ b/bin/named/include/named/globals.h
@@ -53,6 +53,8 @@ EXTERN unsigned int named_g_udpdisp	      INIT(0);
 EXTERN isc_taskmgr_t *named_g_taskmgr	      INIT(NULL);
 EXTERN dns_dispatchmgr_t *named_g_dispatchmgr INIT(NULL);
 EXTERN unsigned int named_g_cpus_detected     INIT(1);
+EXTERN unsigned int named_g_hp_extra_workers  INIT(0);
+EXTERN unsigned int named_g_hp_extra_percent  INIT(100);
 
 #ifdef ENABLE_AFL
 EXTERN bool named_g_run_done INIT(false);
diff --git a/bin/named/include/named/main.h b/bin/named/include/named/main.h
index 816aeae7a0..9618251f4d 100644
--- a/bin/named/include/named/main.h
+++ b/bin/named/include/named/main.h
@@ -23,7 +23,7 @@
 /*
  * Commandline arguments for named; also referenced in win32/ntservice.c
  */
-#define NAMED_MAIN_ARGS "46A:c:d:D:E:fFgL:M:m:n:N:p:sS:t:T:U:u:vVx:X:"
+#define NAMED_MAIN_ARGS "46A:c:d:D:E:fFgh:H:L:M:m:n:N:p:sS:t:T:U:u:vVx:X:"
 
 ISC_PLATFORM_NORETURN_PRE void
 named_main_earlyfatal(const char *format, ...)
diff --git a/bin/named/main.c b/bin/named/main.c
index 9ad2d0e277..fbe4c8d011 100644
--- a/bin/named/main.c
+++ b/bin/named/main.c
@@ -351,7 +351,8 @@ usage(void) {
 			"username] [-U listeners]\n"
 			"             [-X lockfile] [-m "
 			"{usage|trace|record|size|mctx}]\n"
-			"             [-M fill|nofill]\n"
+			"             [-M fill|nofill] [-h extra_workers] "
+			"[-H extra_percent]\n"
 			"usage: named [-v|-V]\n");
 }
 
@@ -792,6 +793,21 @@ parse_command_line(int argc, char *argv[]) {
 			named_g_foreground = true;
 			named_g_logstderr = true;
 			break;
+		case 'h':
+			named_g_hp_extra_workers =
+				parse_int(isc_commandline_argument,
+					  "number of extra workers");
+			break;
+		case 'H':
+			named_g_hp_extra_percent =
+				parse_int(isc_commandline_argument,
+					  "percent of extra workers");
+			if (named_g_hp_extra_percent < 100) {
+				named_main_earlyfatal(
+					"percent of extra workers "
+					"cannot be less than 100");
+			}
+			break;
 		case 'L':
 			named_g_logfile = isc_commandline_argument;
 			break;
@@ -904,6 +920,10 @@ create_managers(void) {
 	if (named_g_cpus == 0) {
 		named_g_cpus = named_g_cpus_detected;
 	}
+	if (named_g_hp_extra_percent > 100) {
+		named_g_hp_extra_workers +=
+			named_g_cpus * (named_g_hp_extra_percent - 100) / 100;
+	}
 	isc_log_write(
 		named_g_lctx, NAMED_LOGCATEGORY_GENERAL, NAMED_LOGMODULE_SERVER,
 		ISC_LOG_INFO, "found %u CPU%s, using %u worker thread%s",
@@ -924,11 +944,12 @@ create_managers(void) {
 		      "using %u UDP listener%s per interface", named_g_udpdisp,
 		      named_g_udpdisp == 1 ? "" : "s");
 
-	result = isc_managers_create(named_g_mctx, named_g_cpus, 0, &named_g_nm,
-				     &named_g_taskmgr);
+	result = isc_managers_create2(named_g_mctx, named_g_cpus, 0,
+				      named_g_hp_extra_workers, &named_g_nm,
+				      &named_g_taskmgr);
 	if (result != ISC_R_SUCCESS) {
 		UNEXPECTED_ERROR(__FILE__, __LINE__,
-				 "isc_managers_create() failed: %s",
+				 "isc_managers_create2() failed: %s",
 				 isc_result_totext(result));
 		return (ISC_R_UNEXPECTED);
 	}
diff --git a/bin/named/named.rst b/bin/named/named.rst
index 39c445f5f9..b5bf95398c 100644
--- a/bin/named/named.rst
+++ b/bin/named/named.rst
@@ -75,6 +75,15 @@ Options
 ``-g``
    This option runs the server in the foreground and forces all logging to ``stderr``.
 
+``-h #workers``
+   This option requests extra worker threads initialized by hazard pointers. Used only for
+   dyndb plugins.
+
+``-H workers%``
+   This option requests extra worker threads initialized by hazard pointers. Value is
+   computed as percent of number of cpus set by ``-n`` parameter. Minimal value is 100%.
+   Used only for dyndb plugins.
+
 ``-L logfile``
    This option sets the log to the file ``logfile`` by default, instead of the system log.
 
diff --git a/lib/isc/include/isc/managers.h b/lib/isc/include/isc/managers.h
index 0ed17ff31d..712ea3e3ed 100644
--- a/lib/isc/include/isc/managers.h
+++ b/lib/isc/include/isc/managers.h
@@ -25,5 +25,10 @@ isc_result_t
 isc_managers_create(isc_mem_t *mctx, size_t workers, size_t quantum,
 		    isc_nm_t **netmgrp, isc_taskmgr_t **taskmgrp);
 
+isc_result_t
+isc_managers_create2(isc_mem_t *mctx, size_t workers, size_t quantum,
+		     size_t hp_extra, isc_nm_t **netmgrp,
+		     isc_taskmgr_t **taskmgrp);
+
 void
 isc_managers_destroy(isc_nm_t **netmgrp, isc_taskmgr_t **taskmgrp);
diff --git a/lib/isc/managers.c b/lib/isc/managers.c
index a285e80d8a..daf19c5596 100644
--- a/lib/isc/managers.c
+++ b/lib/isc/managers.c
@@ -21,15 +21,24 @@
 isc_result_t
 isc_managers_create(isc_mem_t *mctx, size_t workers, size_t quantum,
 		    isc_nm_t **netmgrp, isc_taskmgr_t **taskmgrp) {
+	return isc_managers_create2(mctx, workers, quantum, 0, netmgrp,
+				    taskmgrp);
+}
+
+isc_result_t
+isc_managers_create2(isc_mem_t *mctx, size_t workers, size_t quantum,
+		     size_t hp_extra, isc_nm_t **netmgrp,
+		     isc_taskmgr_t **taskmgrp) {
 	isc_result_t result;
 	isc_taskmgr_t *taskmgr = NULL;
 	isc_nm_t *netmgr = NULL;
+	size_t hp_workers = 4 * (workers + hp_extra);
 
 	/*
 	 * We have ncpus network threads, ncpus old network threads - make
 	 * it 4x just to be on the safe side.
 	 */
-	isc_hp_init(4 * workers);
+	isc_hp_init(hp_workers);
 
 	REQUIRE(netmgrp != NULL && *netmgrp == NULL);
 	isc__netmgr_create(mctx, workers, &netmgr);
-- 
2.34.1