Blame SOURCES/bz1477461-1-main-Add-option-to-set-priority.patch

df4b1e
From a008448efb2b1d45c432867caf08f0bcf2b4b9b0 Mon Sep 17 00:00:00 2001
df4b1e
From: Jan Friesse <jfriesse@redhat.com>
df4b1e
Date: Fri, 7 Jul 2017 17:49:46 +0200
df4b1e
Subject: [PATCH] main: Add option to set priority
df4b1e
df4b1e
Option -P takes numeric value with same meaning
df4b1e
as nice or values min / max, meaning maximal / minimal priority (so
df4b1e
minimal / maximal nice value).
df4b1e
df4b1e
Scheduler / priority setting is moved in code so it is now executed
df4b1e
after logsys is configured so errors are logged.
df4b1e
df4b1e
Setting maximal priority is also used as fallback when realtime
df4b1e
scheduling is requested and sched_setscheduler fails.
df4b1e
df4b1e
Signed-off-by: Jan Friesse <jfriesse@redhat.com>
df4b1e
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
df4b1e
---
df4b1e
 exec/main.c    |   71 ++++++++++++++++++++++++++++++++++++++++++++------------
df4b1e
 man/corosync.8 |   22 +++++++++++++----
df4b1e
 2 files changed, 73 insertions(+), 20 deletions(-)
df4b1e
df4b1e
diff --git a/exec/main.c b/exec/main.c
df4b1e
index 0d381c2..60c01a4 100644
df4b1e
--- a/exec/main.c
df4b1e
+++ b/exec/main.c
df4b1e
@@ -862,8 +862,10 @@ static void timer_function_scheduler_timeout (void *data)
df4b1e
 }
df4b1e
 
df4b1e
 
df4b1e
-static void corosync_setscheduler (void)
df4b1e
+static int corosync_set_rr_scheduler (void)
df4b1e
 {
df4b1e
+	int ret_val = 0;
df4b1e
+
df4b1e
 #if defined(HAVE_PTHREAD_SETSCHEDPARAM) && defined(HAVE_SCHED_GET_PRIORITY_MAX) && defined(HAVE_SCHED_SETSCHEDULER)
df4b1e
 	int res;
df4b1e
 
df4b1e
@@ -880,6 +882,7 @@ static void corosync_setscheduler (void)
df4b1e
 #ifdef HAVE_QB_LOG_THREAD_PRIORITY_SET
df4b1e
 			qb_log_thread_priority_set (SCHED_OTHER, 0);
df4b1e
 #endif
df4b1e
+			ret_val = -1;
df4b1e
 		} else {
df4b1e
 
df4b1e
 			/*
df4b1e
@@ -901,11 +904,15 @@ static void corosync_setscheduler (void)
df4b1e
 		LOGSYS_PERROR (errno, LOGSYS_LEVEL_WARNING,
df4b1e
 			"Could not get maximum scheduler priority");
df4b1e
 		sched_priority = 0;
df4b1e
+		ret_val = -1;
df4b1e
 	}
df4b1e
 #else
df4b1e
 	log_printf(LOGSYS_LEVEL_WARNING,
df4b1e
 		"The Platform is missing process priority setting features.  Leaving at default.");
df4b1e
+	ret_val = -1;
df4b1e
 #endif
df4b1e
+
df4b1e
+	return (ret_val);
df4b1e
 }
df4b1e
 
df4b1e
 
df4b1e
@@ -1132,29 +1139,48 @@ int main (int argc, char **argv, char **envp)
df4b1e
 	const char *error_string;
df4b1e
 	struct totem_config totem_config;
df4b1e
 	int res, ch;
df4b1e
-	int background, setprio, testonly;
df4b1e
+	int background, sched_rr, prio, testonly;
df4b1e
 	struct stat stat_out;
df4b1e
 	enum e_corosync_done flock_err;
df4b1e
 	uint64_t totem_config_warnings;
df4b1e
 	struct scheduler_pause_timeout_data scheduler_pause_timeout_data;
df4b1e
+	long int tmpli;
df4b1e
+	char *ep;
df4b1e
 
df4b1e
 	/* default configuration
df4b1e
 	 */
df4b1e
 	background = 1;
df4b1e
-	setprio = 1;
df4b1e
+	sched_rr = 1;
df4b1e
+	prio = 0;
df4b1e
 	testonly = 0;
df4b1e
 
df4b1e
-	while ((ch = getopt (argc, argv, "fprtv")) != EOF) {
df4b1e
+	while ((ch = getopt (argc, argv, "fP:prtv")) != EOF) {
df4b1e
 
df4b1e
 		switch (ch) {
df4b1e
 			case 'f':
df4b1e
 				background = 0;
df4b1e
 				break;
df4b1e
 			case 'p':
df4b1e
-				setprio = 0;
df4b1e
+				sched_rr = 0;
df4b1e
+				break;
df4b1e
+			case 'P':
df4b1e
+				if (strcmp(optarg, "max") == 0) {
df4b1e
+					prio = INT_MIN;
df4b1e
+				} else if (strcmp(optarg, "min") == 0) {
df4b1e
+					prio = INT_MAX;
df4b1e
+				} else {
df4b1e
+					tmpli = strtol(optarg, &ep, 10);
df4b1e
+					if (errno != 0 || *ep != '\0' || tmpli > INT_MAX || tmpli < INT_MIN) {
df4b1e
+						fprintf(stderr, "Priority value %s is invalid", optarg);
df4b1e
+						logsys_system_fini();
df4b1e
+						return EXIT_FAILURE;
df4b1e
+					}
df4b1e
+
df4b1e
+					prio = tmpli;
df4b1e
+				}
df4b1e
 				break;
df4b1e
 			case 'r':
df4b1e
-				setprio = 1;
df4b1e
+				sched_rr = 1;
df4b1e
 				break;
df4b1e
 			case 't':
df4b1e
 				testonly = 1;
df4b1e
@@ -1170,8 +1196,9 @@ int main (int argc, char **argv, char **envp)
df4b1e
 				fprintf(stderr, \
df4b1e
 					"usage:\n"\
df4b1e
 					"        -f     : Start application in foreground.\n"\
df4b1e
-					"        -p     : Do not set process priority.\n"\
df4b1e
+					"        -p     : Do not set realtime scheduling.\n"\
df4b1e
 					"        -r     : Set round robin realtime scheduling (default).\n"\
df4b1e
+					"        -P num : Set priority of process (no effect when -r is used)\n"\
df4b1e
 					"        -t     : Test configuration and exit.\n"\
df4b1e
 					"        -v     : Display version and SVN revision of Corosync and exit.\n");
df4b1e
 				logsys_system_fini();
df4b1e
@@ -1179,14 +1206,6 @@ int main (int argc, char **argv, char **envp)
df4b1e
 		}
df4b1e
 	}
df4b1e
 
df4b1e
-	/*
df4b1e
-	 * Set round robin realtime scheduling with priority 99
df4b1e
-	 * Lock all memory to avoid page faults which may interrupt
df4b1e
-	 * application healthchecking
df4b1e
-	 */
df4b1e
-	if (setprio) {
df4b1e
-		corosync_setscheduler ();
df4b1e
-	}
df4b1e
 
df4b1e
 	/*
df4b1e
 	 * Other signals are registered later via qb_loop_signal_add
df4b1e
@@ -1293,6 +1312,24 @@ int main (int argc, char **argv, char **envp)
df4b1e
 		corosync_exit_error (COROSYNC_DONE_EXIT);
df4b1e
 	}
df4b1e
 
df4b1e
+	/*
df4b1e
+	 * Set round robin realtime scheduling with priority 99
df4b1e
+	 */
df4b1e
+	if (sched_rr) {
df4b1e
+		if (corosync_set_rr_scheduler () != 0) {
df4b1e
+			prio = INT_MIN;
df4b1e
+		} else {
df4b1e
+			prio = 0;
df4b1e
+		}
df4b1e
+	}
df4b1e
+
df4b1e
+	if (prio != 0) {
df4b1e
+		if (setpriority(PRIO_PGRP, 0, prio) != 0) {
df4b1e
+			LOGSYS_PERROR(errno, LOGSYS_LEVEL_WARNING,
df4b1e
+				"Could not set priority %d", prio);
df4b1e
+		}
df4b1e
+	}
df4b1e
+
df4b1e
 	ip_version = totem_config.ip_version;
df4b1e
 
df4b1e
 	totem_config.totem_memb_ring_id_create_or_load = corosync_ring_id_create_or_load;
df4b1e
@@ -1319,6 +1356,10 @@ int main (int argc, char **argv, char **envp)
df4b1e
 		corosync_tty_detach ();
df4b1e
 	}
df4b1e
 
df4b1e
+	/*
df4b1e
+	 * Lock all memory to avoid page faults which may interrupt
df4b1e
+	 * application healthchecking
df4b1e
+	 */
df4b1e
 	corosync_mlockall ();
df4b1e
 
df4b1e
 	corosync_poll_handle = qb_loop_create ();
df4b1e
diff --git a/man/corosync.8 b/man/corosync.8
df4b1e
index 89ab771..dc596d1 100644
df4b1e
--- a/man/corosync.8
df4b1e
+++ b/man/corosync.8
df4b1e
@@ -1,5 +1,5 @@
df4b1e
 .\"/*
df4b1e
-.\" * Copyright (C) 2010 Red Hat, Inc.
df4b1e
+.\" * Copyright (C) 2010-2017 Red Hat, Inc.
df4b1e
 .\" *
df4b1e
 .\" * All rights reserved.
df4b1e
 .\" *
df4b1e
@@ -31,11 +31,11 @@
df4b1e
 .\" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
df4b1e
 .\" * THE POSSIBILITY OF SUCH DAMAGE.
df4b1e
 .\" */
df4b1e
-.TH COROSYNC 8 2010-05-30
df4b1e
+.TH COROSYNC 8 2017-07-07
df4b1e
 .SH NAME
df4b1e
 corosync \- The Corosync Cluster Engine.
df4b1e
 .SH SYNOPSIS
df4b1e
-.B "corosync [\-f] [\-p] [\-r] [\-t] [\-v]"
df4b1e
+.B "corosync [\-f] [\-P num] [\-p] [\-r] [\-t] [\-v]"
df4b1e
 .SH DESCRIPTION
df4b1e
 .B corosync
df4b1e
 Corosync provides clustering infrastructure such as membership, messaging and quorum.
df4b1e
@@ -45,10 +45,22 @@ Corosync provides clustering infrastructure such as membership, messaging and qu
df4b1e
 Start application in foreground.
df4b1e
 .TP
df4b1e
 .B -p
df4b1e
-Do not set process priority.
df4b1e
+Do not set realtime scheduling.
df4b1e
 .TP
df4b1e
+.B -P
df4b1e
+Set priority of process. Has effect only when
df4b1e
 .B -r
df4b1e
-Set round robin realtime scheduling (default).
df4b1e
+is not used. Can be ether numeric value with similar meaning as
df4b1e
+.BR nice (1)
df4b1e
+or
df4b1e
+.B max
df4b1e
+/
df4b1e
+.B min
df4b1e
+meaning maximal / minimal priority (so minimal / maximal nice value).
df4b1e
+.TP
df4b1e
+.B -r
df4b1e
+Set round robin realtime scheduling with maximal priority (default). When setting
df4b1e
+of scheduler fails, fallback to set maximal priority.
df4b1e
 .TP
df4b1e
 .B -t
df4b1e
 Test configuration and then exit.
df4b1e
-- 
df4b1e
1.7.1
df4b1e