All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1] rt-tests: Add --duration argument to tests
@ 2019-03-12 15:47 Daniel Wagner
  2019-04-05 15:11 ` John Kacur
  0 siblings, 1 reply; 3+ messages in thread
From: Daniel Wagner @ 2019-03-12 15:47 UTC (permalink / raw)
  To: John Kacur, Clark Williams; +Cc: linux-rt-users, Daniel Wagner

Many of the test programs have the --loop argument for automatic
stopping. The main problem with the --loop argument is how long is
--loop 1000?

To simplify automated tests  introduce a --duration argument which
allows to set the time how long a test should run. This allows the
test suite to define the executation time and also the timeout which a
normal human can understand.

For example run the test for 10 minutes and timeout at 11 minutes:

  # timeout 11m sigwaittest --duration 10m

Signed-off-by: Daniel Wagner <daniel.wagner@siemens.com>
---
Hi,

I tried to patch all tests where possible. Not all tests need it,
e.g. pip_stress.

There are two memory corruption bugs in cyclicdeadline and
deadline_test. The setcpu_buf gets corrupted but I haven't figured
where it happens. valgrind doesn't help :(

Thanks,
Daniel

 src/cyclictest/cyclictest.c           | 33 --------------------------
 src/include/rt-utils.h                |  2 ++
 src/lib/rt-utils.c                    | 34 +++++++++++++++++++++++++++
 src/pi_tests/pi_stress.8              |  4 ++++
 src/pi_tests/pi_stress.c              |  9 +++----
 src/pmqtest/pmqtest.8                 |  5 ++++
 src/pmqtest/pmqtest.c                 | 17 ++++++++++++--
 src/ptsematest/ptsematest.8           |  5 ++++
 src/ptsematest/ptsematest.c           | 14 ++++++++++-
 src/rt-migrate-test/rt-migrate-test.8 |  5 ++++
 src/rt-migrate-test/rt-migrate-test.c | 12 +++++++++-
 src/sched_deadline/cyclicdeadline.c   | 12 +++++++++-
 src/signaltest/signaltest.8           |  5 ++++
 src/signaltest/signaltest.c           | 14 ++++++++++-
 src/sigwaittest/sigwaittest.8         |  5 ++++
 src/sigwaittest/sigwaittest.c         | 15 +++++++++++-
 src/svsematest/svsematest.8           |  5 ++++
 src/svsematest/svsematest.c           | 15 +++++++++++-
 18 files changed, 166 insertions(+), 45 deletions(-)

diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
index ed59edefbf97..03d56e4f520c 100644
--- a/src/cyclictest/cyclictest.c
+++ b/src/cyclictest/cyclictest.c
@@ -406,39 +406,6 @@ static void enable_trace_mark(void)
 	open_tracemark_fd();
 }
 
-/*
- * parse an input value as a base10 value followed by an optional
- * suffix. The input value is presumed to be in seconds, unless
- * followed by a modifier suffix: m=minutes, h=hours, d=days
- *
- * the return value is a value in seconds
- */
-static int parse_time_string(char *val)
-{
-	char *end;
-	int t = strtol(val, &end, 10);
-	if (end) {
-		switch (*end) {
-		case 'm':
-		case 'M':
-			t *= 60;
-			break;
-
-		case 'h':
-		case 'H':
-			t *= 60*60;
-			break;
-
-		case 'd':
-		case 'D':
-			t *= 24*60*60;
-			break;
-
-		}
-	}
-	return t;
-}
-
 /*
  * Raise the soft priority limit up to prio, if that is less than or equal
  * to the hard limit
diff --git a/src/include/rt-utils.h b/src/include/rt-utils.h
index ef0f6acf4ab5..405fa7855346 100644
--- a/src/include/rt-utils.h
+++ b/src/include/rt-utils.h
@@ -24,4 +24,6 @@ uint32_t string_to_policy(const char *str);
 
 pid_t gettid(void);
 
+int parse_time_string(char *val);
+
 #endif	/* __RT_UTILS.H */
diff --git a/src/lib/rt-utils.c b/src/lib/rt-utils.c
index ac6878ccacf1..e1b166afcd6c 100644
--- a/src/lib/rt-utils.c
+++ b/src/lib/rt-utils.c
@@ -13,6 +13,7 @@
 #include <sched.h>
 #include <stdarg.h>
 #include <errno.h>
+#include <ctype.h>
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -320,3 +321,36 @@ pid_t gettid(void)
 {
 	return syscall(SYS_gettid);
 }
+
+/*
+ * parse an input value as a base10 value followed by an optional
+ * suffix. The input value is presumed to be in seconds, unless
+ * followed by a modifier suffix: m=minutes, h=hours, d=days
+ *
+ * the return value is a value in seconds
+ */
+int parse_time_string(char *val)
+{
+	char *end;
+	int t = strtol(val, &end, 10);
+	if (end) {
+		switch (*end) {
+		case 'm':
+		case 'M':
+			t *= 60;
+			break;
+
+		case 'h':
+		case 'H':
+			t *= 60*60;
+			break;
+
+		case 'd':
+		case 'D':
+			t *= 24*60*60;
+			break;
+
+		}
+	}
+	return t;
+}
diff --git a/src/pi_tests/pi_stress.8 b/src/pi_tests/pi_stress.8
index c92b4bdf5609..475d3c34f135 100644
--- a/src/pi_tests/pi_stress.8
+++ b/src/pi_tests/pi_stress.8
@@ -57,6 +57,10 @@ seconds and then terminate.
 The number of inversion groups to run. Defaults to 10.
 .IP \-d|\-\-debug
 Run in debug mode; lots of extra prints
+.IP "\-D, \-\-duration=TIME"
+Specify a length for the test run.
+.br
+Append 'm', 'h', or 'd' to specify minutes, hours or days.
 .IP \-v|\-\-verbose
 Run with verbose messages
 .IP \-s|\-\-signal
diff --git a/src/pi_tests/pi_stress.c b/src/pi_tests/pi_stress.c
index ac7646cd2613..eac782a8d355 100644
--- a/src/pi_tests/pi_stress.c
+++ b/src/pi_tests/pi_stress.c
@@ -146,7 +146,7 @@ int lockall = 0;
 
 /* command line options */
 struct option options[] = {
-	{"duration", required_argument, NULL, 't'},
+	{"duration", required_argument, NULL, 'D'},
 	{"verbose", no_argument, NULL, 'v'},
 	{"quiet", no_argument, NULL, 'q'},
 	{"groups", required_argument, NULL, 'g'},
@@ -1027,7 +1027,8 @@ void usage(void)
 	printf("\t--verbose\t- lots of output\n");
 	printf("\t--quiet\t\t- suppress running output\n");
 	printf
-	    ("\t--duration=<n>- length of the test run in seconds [infinite]\n");
+	    ("\t--duration=<n>\t- length of the test run in seconds [infinite]\n");
+	printf("\t\t\t  Append 'm', 'h', or 'd' to specify minutes, hours or days.\n");
 	printf("\t--groups=<n>\t- set the number of inversion groups [%d]\n",
 	       ngroups);
 	printf
@@ -1328,8 +1329,8 @@ void process_command_line(int argc, char **argv)
 		case 'h':
 			usage();
 			exit(0);
-		case 't':
-			duration = strtol(optarg, NULL, 10);
+		case 'D':
+			duration = parse_time_string(optarg);
 			break;
 		case 'v':
 			verbose = 1;
diff --git a/src/pmqtest/pmqtest.8 b/src/pmqtest/pmqtest.8
index 05421e01e70b..9108a939b9f7 100644
--- a/src/pmqtest/pmqtest.8
+++ b/src/pmqtest/pmqtest.8
@@ -21,6 +21,11 @@ It is useful to track down unexpected large latencies of a system.
 .B \-d, \-\-distance=DIST
 Set the distance of thread intervals in microseconds (default is 500 us). When pmqtest is called with the -t option and more than one thread is created, then this distance value is added to the interval of the threads: Interval(thread N) = Interval(thread N-1) + DIST
 .TP
+.B \-D, \-\-duration=TIME
+Specify a length for the test run.
+.br
+Append 'm', 'h', or 'd' to specify minutes, hours or days.
+.TP
 .B \-f, \-\-forcetimeout=TO
 Set an artificial delay of the send function to force timeout of the receiver, requires the -T option
 .TP
diff --git a/src/pmqtest/pmqtest.c b/src/pmqtest/pmqtest.c
index 75d5ee8185a0..054768d161a7 100644
--- a/src/pmqtest/pmqtest.c
+++ b/src/pmqtest/pmqtest.c
@@ -252,6 +252,8 @@ static void display_help(void)
 	"-f TO    --forcetimeout=TO force timeout of mq_timedreceive(), requires -T\n"
 	"-i INTV  --interval=INTV   base interval of thread in us default=1000\n"
 	"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
+	"-D       --duration=TIME   specify a length for the test run.\n"
+	"                           Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
 	"-p PRIO  --prio=PRIO       priority\n"
 	"-S       --smp             SMP testing: options -a -t and same priority\n"
         "                           of all threads\n"
@@ -271,6 +273,7 @@ static int tracelimit;
 static int priority;
 static int num_threads = 1;
 static int max_cycles;
+static int duration;
 static int interval = 1000;
 static int distance = 500;
 static int smp;
@@ -293,6 +296,7 @@ static void process_options (int argc, char *argv[])
 			{"forcetimeout", required_argument, NULL, 'f'},
 			{"interval", required_argument, NULL, 'i'},
 			{"loops", required_argument, NULL, 'l'},
+			{"duration", required_argument, NULL, 'D'},
 			{"priority", required_argument, NULL, 'p'},
 			{"smp", no_argument, NULL, 'S'},
 			{"threads", optional_argument, NULL, 't'},
@@ -300,7 +304,7 @@ static void process_options (int argc, char *argv[])
 			{"help", no_argument, NULL, '?'},
 			{NULL, 0, NULL, 0}
 		};
-		int c = getopt_long (argc, argv, "a::b:d:f:i:l:p:St::T:",
+		int c = getopt_long (argc, argv, "a::b:d:f:i:l:D:p:St::T:",
 			long_options, &option_index);
 		if (c == -1)
 			break;
@@ -325,6 +329,7 @@ static void process_options (int argc, char *argv[])
 		case 'f': forcetimeout = atoi(optarg); break;
 		case 'i': interval = atoi(optarg); break;
 		case 'l': max_cycles = atoi(optarg); break;
+		case 'D': duration = parse_time_string(optarg); break;
 		case 'p': priority = atoi(optarg); break;
 		case 'S':
 			smp = 1;
@@ -369,7 +374,10 @@ static void process_options (int argc, char *argv[])
 
 	if (forcetimeout && !timeout)
 		error = 1;
- 
+
+	if (duration < 0)
+		error = 1;
+
 	if (priority && smp)
 		sameprio = 1;
 
@@ -418,10 +426,15 @@ int main(int argc, char *argv[])
 	sigemptyset(&sigset);
 	sigaddset(&sigset, SIGTERM);
 	sigaddset(&sigset, SIGINT);
+	sigaddset(&sigset, SIGALRM);
 	pthread_sigmask(SIG_SETMASK, &sigset, NULL);
 
 	signal(SIGINT, sighand);
 	signal(SIGTERM, sighand);
+	signal(SIGALRM, sighand);
+
+	if (duration)
+		alarm(duration);
 
 	receiver = calloc(num_threads, sizeof(struct params));
 	sender = calloc(num_threads, sizeof(struct params));
diff --git a/src/ptsematest/ptsematest.8 b/src/ptsematest/ptsematest.8
index 9d835337ec27..289f3a1d7ae8 100644
--- a/src/ptsematest/ptsematest.8
+++ b/src/ptsematest/ptsematest.8
@@ -21,6 +21,11 @@ It is useful to track down unexpected large latencies of a system.
 .B \-d, \-\-distance=DIST
 Set the distance of thread intervals in microseconds (default is 500 us). When  cyclictest is called with the -t option and more than one thread is created, then this distance value is added to the interval of the threads: Interval(thread N) = Interval(thread N-1) + DIST
 .TP
+.B \-D, \-\-duration=TIME
+Specify a length for the test run.
+.br
+Append 'm', 'h', or 'd' to specify minutes, hours or days.
+.TP
 .B \-i, \-\-interval=INTV
 Set the base interval of the thread(s) in microseconds (default is 1000 us). This sets the interval of the first thread. See also -d.
 .TP
diff --git a/src/ptsematest/ptsematest.c b/src/ptsematest/ptsematest.c
index a31c745ec928..6bedbc81b572 100644
--- a/src/ptsematest/ptsematest.c
+++ b/src/ptsematest/ptsematest.c
@@ -173,6 +173,8 @@ static void display_help(void)
 	"-d DIST  --distance=DIST   distance of thread intervals in us default=500\n"
 	"-i INTV  --interval=INTV   base interval of thread in us default=1000\n"
 	"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
+	"-D       --duration=TIME   specify a length for the test run.\n"
+	"                           Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
 	"-p PRIO  --prio=PRIO       priority\n"
 	"-S       --smp             SMP testing: options -a -t and same priority\n"
         "                           of all threads\n"
@@ -190,6 +192,7 @@ static int tracelimit;
 static int priority;
 static int num_threads = 1;
 static int max_cycles;
+static int duration;
 static int interval = 1000;
 static int distance = 500;
 static int smp;
@@ -209,13 +212,14 @@ static void process_options (int argc, char *argv[])
 			{"distance", required_argument, NULL, 'd'},
 			{"interval", required_argument, NULL, 'i'},
 			{"loops", required_argument, NULL, 'l'},
+			{"duration", required_argument, NULL, 'D'},
 			{"priority", required_argument, NULL, 'p'},
 			{"smp", no_argument, NULL, 'S'},
 			{"threads", optional_argument, NULL, 't'},
 			{"help", no_argument, NULL, '?'},
 			{NULL, 0, NULL, 0}
 		};
-		int c = getopt_long (argc, argv, "a::b:d:i:l:p:St::",
+		int c = getopt_long (argc, argv, "a::b:d:i:l:D:p:St::",
 			long_options, &option_index);
 		if (c == -1)
 			break;
@@ -239,6 +243,7 @@ static void process_options (int argc, char *argv[])
 		case 'd': distance = atoi(optarg); break;
 		case 'i': interval = atoi(optarg); break;
 		case 'l': max_cycles = atoi(optarg); break;
+		case 'D': duration = parse_time_string(optarg); break;
 		case 'p': priority = atoi(optarg); break;
 		case 'S':
 			smp = 1;
@@ -280,6 +285,9 @@ static void process_options (int argc, char *argv[])
 	if (num_threads < 1)
 		error = 1;
 
+	if (duration < 0)
+		error = 1;
+
 	if (priority && smp)
 		sameprio = 1;
 
@@ -317,6 +325,10 @@ int main(int argc, char *argv[])
 
 	signal(SIGINT, sighand);
 	signal(SIGTERM, sighand);
+	signal(SIGALRM, sighand);
+
+	if (duration)
+		alarm(duration);
 
 	receiver = calloc(num_threads, sizeof(struct params));
 	sender = calloc(num_threads, sizeof(struct params));
diff --git a/src/rt-migrate-test/rt-migrate-test.8 b/src/rt-migrate-test/rt-migrate-test.8
index 8af50e54291d..b9c07f1ed80a 100644
--- a/src/rt-migrate-test/rt-migrate-test.8
+++ b/src/rt-migrate-test/rt-migrate-test.8
@@ -15,6 +15,11 @@ This program follows the usual GNU command line syntax, with long options starti
 In the summary of options, a value in brackets (), indicates a default value
 .br
 .TP
+.B \-D, \-\-duration=TIME
+Specify a length for the test run.
+.br
+Append 'm', 'h', or 'd' to specify minutes, hours or days.
+.TP
 .B \-p, \-\-prio=prio
 base priority to start RT tasks with (2)
 .br
diff --git a/src/rt-migrate-test/rt-migrate-test.c b/src/rt-migrate-test/rt-migrate-test.c
index 0a0bb77ab661..8223d6669a37 100644
--- a/src/rt-migrate-test/rt-migrate-test.c
+++ b/src/rt-migrate-test/rt-migrate-test.c
@@ -41,6 +41,7 @@
 #include <errno.h>
 #include <sched.h>
 #include <pthread.h>
+#include "rt-utils.h"
 
 #define gettid() syscall(__NR_gettid)
 
@@ -115,6 +116,7 @@ static unsigned long long now;
 
 static int done;
 static int loop;
+static int duration;
 
 static pthread_barrier_t start_barrier;
 static pthread_barrier_t end_barrier;
@@ -180,6 +182,8 @@ static void usage(char **argv)
 	       "-s time --sleep-time time   Sleep time (ms) between intervals (100)\n"
 	       "-m time --maxerr time       Max allowed error (microsecs)\n"
 	       "-l loops --loops loops      Number of iterations to run (50)\n"
+	       "-D       --duration=TIME    specify a length for the test run.\n"
+	       "                            Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
 	       "-e                          Use equal prio for #CPU-1 tasks (requires > 2 CPUS)\n"
 	       "-c    --check               Stop if lower prio task is quicker than higher (off)\n"
 	       "-h    --help\n"
@@ -199,11 +203,12 @@ static void parse_options (int argc, char *argv[])
 			{"sleep-time", required_argument, NULL, 's'},
 			{"maxerr", required_argument, NULL, 'm'},
 			{"loops", required_argument, NULL, 'l'},
+			{"duration", required_argument, NULL, 'D'},
 			{"check", no_argument, NULL, 'c'},
 			{"help", no_argument, NULL, '?'},
 			{NULL, 0, NULL, 0}
 		};
-		int c = getopt_long (argc, argv, "p:r:s:m:l:ech",
+		int c = getopt_long (argc, argv, "p:r:s:m:l:D:ech",
 			long_options, &option_index);
 		if (c == -1)
 			break;
@@ -214,6 +219,7 @@ static void parse_options (int argc, char *argv[])
 			break;
 		case 's': interval = atoi(optarg); break;
 		case 'l': nr_runs = atoi(optarg); break;
+		case 'D': duration = parse_time_string(optarg); break;
 		case 'm': max_err = usec2nano(atoi(optarg)); break;
 		case 'e': equal = 1; break;
 		case 'c': check = 1; break;
@@ -472,6 +478,10 @@ int main (int argc, char **argv)
 	parse_options(argc, argv);
 
 	signal(SIGINT, stop_log);
+	signal(SIGALRM, stop_log);
+
+	if (duration)
+		alarm(duration);
 
 	if (argc >= (optind + 1))
 		nr_tasks = atoi(argv[optind]);
diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c
index 761f8d7d7483..577ad95cfee1 100644
--- a/src/sched_deadline/cyclicdeadline.c
+++ b/src/sched_deadline/cyclicdeadline.c
@@ -21,6 +21,8 @@
 #include <linux/unistd.h>
 #include <linux/magic.h>
 
+#include <rt-utils.h>
+
 #ifdef __i386__
 #ifndef __NR_sched_setattr
 #define __NR_sched_setattr		351
@@ -1049,6 +1051,7 @@ int main (int argc, char **argv)
 	unsigned int interval = 1000;
 	unsigned int step = 500;
 	int percent = 60;
+	int duration = 0;
 	u64 runtime;
 	u64 start_period;
 	u64 end_period;
@@ -1062,7 +1065,7 @@ int main (int argc, char **argv)
 		exit(-1);
 	}
 
-	while ((c = getopt(argc, argv, "+hac:t:")) >= 0) {
+	while ((c = getopt(argc, argv, "+hac:t:D:")) >= 0) {
 		switch (c) {
 		case 'a':
 			all_cpus = 1;
@@ -1081,6 +1084,9 @@ int main (int argc, char **argv)
 		case 't':
 			nr_threads = atoi(optarg);
 			break;
+		case 'D':
+			duration = parse_time_string(optarg);
+			break;
 		case 'h':
 		default:
 			usage(argv);
@@ -1246,6 +1252,10 @@ int main (int argc, char **argv)
 
 	signal(SIGINT, sighand);
 	signal(SIGTERM, sighand);
+	signal(SIGALRM, sighand);
+
+	if (duration)
+		alarm(duration);
 
 	if (!fail)
 		loop(sched_data, nr_threads);
diff --git a/src/signaltest/signaltest.8 b/src/signaltest/signaltest.8
index 634d392a6da5..bd6ffe5c7a36 100644
--- a/src/signaltest/signaltest.8
+++ b/src/signaltest/signaltest.8
@@ -13,6 +13,11 @@ starting with two dashes ('\-\-').
 .B \-b, \-\-breaktrace=USEC
 Send break trace command when latency > USEC
 .TP
+.B \-D, \-\-duration=TIME
+Specify a length for the test run.
+.br
+Append 'm', 'h', or 'd' to specify minutes, hours or days.
+.TP
 .B \-l, \-\-loops=LOOPS
 Number of loops: default=0 (endless)
 .TP
diff --git a/src/signaltest/signaltest.c b/src/signaltest/signaltest.c
index 59f979ec5ad1..a168191b7573 100644
--- a/src/signaltest/signaltest.c
+++ b/src/signaltest/signaltest.c
@@ -208,6 +208,8 @@ static void display_help(void)
 		"signaltest <options>\n\n"
 		"-b USEC  --breaktrace=USEC send break trace command when latency > USEC\n"
 		"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
+		"-D       --duration=TIME   specify a length for the test run.\n"
+		"                           Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
 		"-p PRIO  --prio=PRIO       priority of highest prio thread\n"
 		"-q       --quiet           print a summary only on exit\n"
 		"-t NUM   --threads=NUM     number of threads: default=2\n"
@@ -221,6 +223,7 @@ static void display_help(void)
 static int priority;
 static int num_threads = 2;
 static int max_cycles;
+static int duration;
 static int verbose;
 static int quiet;
 static int lockall = 0;
@@ -235,6 +238,7 @@ static void process_options (int argc, char *argv[])
 		static struct option long_options[] = {
 			{"breaktrace", required_argument, NULL, 'b'},
 			{"loops", required_argument, NULL, 'l'},
+			{"duration", required_argument, NULL, 'D'},
 			{"priority", required_argument, NULL, 'p'},
 			{"quiet", no_argument, NULL, 'q'},
 			{"threads", required_argument, NULL, 't'},
@@ -243,13 +247,14 @@ static void process_options (int argc, char *argv[])
 			{"help", no_argument, NULL, '?'},
 			{NULL, 0, NULL, 0}
 		};
-		int c = getopt_long (argc, argv, "b:c:d:i:l:np:qrsmt:v",
+		int c = getopt_long (argc, argv, "b:c:d:i:l:D:np:qrsmt:v",
 			long_options, &option_index);
 		if (c == -1)
 			break;
 		switch (c) {
 		case 'b': tracelimit = atoi(optarg); break;
 		case 'l': max_cycles = atoi(optarg); break;
+		case 'D': duration = parse_time_string(optarg); break;
 		case 'p': priority = atoi(optarg); break;
 		case 'q': quiet = 1; break;
 		case 't': num_threads = atoi(optarg); break;
@@ -259,6 +264,9 @@ static void process_options (int argc, char *argv[])
 		}
 	}
 
+	if (duration < 0)
+		error = 1;
+
 	if (priority < 0 || priority > 99)
 		error = 1;
 
@@ -340,6 +348,10 @@ int main(int argc, char **argv)
 
 	signal(SIGINT, sighand);
 	signal(SIGTERM, sighand);
+	signal(SIGALRM, sighand);
+
+	if (duration)
+		alarm(duration);
 
 	par = calloc(num_threads, sizeof(struct thread_param));
 	if (!par)
diff --git a/src/sigwaittest/sigwaittest.8 b/src/sigwaittest/sigwaittest.8
index 2290ca2c76bc..5bedf2ced0dd 100644
--- a/src/sigwaittest/sigwaittest.8
+++ b/src/sigwaittest/sigwaittest.8
@@ -21,6 +21,11 @@ It is useful to track down unexpected large latencies of a system.
 .B \-d, \-\-distance=DIST
 Set the distance of thread intervals in microseconds (default is 500 us). When  cyclictest is called with the -t option and more than one thread is created, then this distance value is added to the interval of the threads: Interval(thread N) = Interval(thread N-1) + DIST
 .TP
+.B \-D, \-\-duration=TIME
+Specify a length for the test run.
+.br
+Append 'm', 'h', or 'd' to specify minutes, hours or days.
+.TP
 .B \-f, \-\-fork
 Instead of creating threads (which is the default), fork new processes
 .TP
diff --git a/src/sigwaittest/sigwaittest.c b/src/sigwaittest/sigwaittest.c
index 91fcdaa5f185..6e3c28330447 100644
--- a/src/sigwaittest/sigwaittest.c
+++ b/src/sigwaittest/sigwaittest.c
@@ -222,6 +222,8 @@ static void display_help(void)
 	"-f       --fork            fork new processes instead of creating threads\n"
 	"-i INTV  --interval=INTV   base interval of thread in us default=1000\n"
 	"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
+	"-D       --duration=TIME   specify a length for the test run.\n"
+	"                           Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
 	"-p PRIO  --prio=PRIO       priority\n"
 	"-t       --threads         one thread per available processor\n"
 	"-t [NUM] --threads=NUM     number of threads:\n"
@@ -236,6 +238,7 @@ static int affinity;
 static int priority;
 static int num_threads = 1;
 static int max_cycles;
+static int duration;
 static int interval = 1000;
 static int distance = 500;
 
@@ -255,12 +258,13 @@ static void process_options (int argc, char *argv[])
 			{"fork", optional_argument, NULL, 'f'},
 			{"interval", required_argument, NULL, 'i'},
 			{"loops", required_argument, NULL, 'l'},
+			{"duration", required_argument, NULL, 'D'},
 			{"priority", required_argument, NULL, 'p'},
 			{"threads", optional_argument, NULL, 't'},
 			{"help", no_argument, NULL, '?'},
 			{NULL, 0, NULL, 0}
 		};
-		int c = getopt_long (argc, argv, "a::b:d:f::i:l:p:t::",
+		int c = getopt_long (argc, argv, "a::b:d:f::i:l:D:p:t::",
 			long_options, &option_index);
 		if (c == -1)
 			break;
@@ -291,6 +295,7 @@ static void process_options (int argc, char *argv[])
 			break;
 		case 'i': interval = atoi(optarg); break;
 		case 'l': max_cycles = atoi(optarg); break;
+		case 'D': duration = parse_time_string(optarg); break;
 		case 'p': priority = atoi(optarg); break;
 		case 't':
 			if (optarg != NULL)
@@ -316,6 +321,9 @@ static void process_options (int argc, char *argv[])
 			}
 		}
 
+		if (duration < 0)
+			error = 1;
+
 		if (num_threads < 1 || num_threads > 255)
 			error = 1;
 
@@ -433,9 +441,13 @@ int main(int argc, char *argv[])
 
 	signal(SIGINT, sighand);
 	signal(SIGTERM, sighand);
+	signal(SIGALRM, sighand);
 	sigemptyset(&sigset);
 	pthread_sigmask(SIG_SETMASK, &sigset, NULL);
 
+	if (duration)
+		alarm(duration);
+
 	if (!mustfork && !wasforked) {
 		receiver = calloc(num_threads, sizeof(struct params));
 		sender = calloc(num_threads, sizeof(struct params));
@@ -578,6 +590,7 @@ int main(int argc, char *argv[])
 		sigemptyset(&sigset);
 		sigaddset(&sigset, SIGTERM);
 		sigaddset(&sigset, SIGINT);
+		sigaddset(&sigset, SIGALRM);
 		pthread_sigmask(SIG_SETMASK, &sigset, NULL);
 
 		nanosleep(&maindelay, NULL);
diff --git a/src/svsematest/svsematest.8 b/src/svsematest/svsematest.8
index 0d4eaf3bb7ff..da64e9875d9f 100644
--- a/src/svsematest/svsematest.8
+++ b/src/svsematest/svsematest.8
@@ -21,6 +21,11 @@ It is useful to track down unexpected large latencies of a system.
 .B \-d, \-\-distance=DIST
 Set the distance of thread intervals in microseconds (default is 500 us). When  cyclictest is called with the -t option and more than one thread is created, then this distance value is added to the interval of the threads: Interval(thread N) = Interval(thread N-1) + DIST
 .TP
+.B \-D, \-\-duration=TIME
+Specify a length for the test run.
+.br
+Append 'm', 'h', or 'd' to specify minutes, hours or days.
+.TP
 .B \-f, \-\-fork
 Instead of creating threads (which is the default), fork new processes
 .TP
diff --git a/src/svsematest/svsematest.c b/src/svsematest/svsematest.c
index eeb82858720a..dfa4660c0e43 100644
--- a/src/svsematest/svsematest.c
+++ b/src/svsematest/svsematest.c
@@ -248,6 +248,8 @@ static void display_help(void)
 	"-f       --fork            fork new processes instead of creating threads\n"
 	"-i INTV  --interval=INTV   base interval of thread in us default=1000\n"
 	"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
+	"-D       --duration=TIME   specify a length for the test run.\n"
+	"                           Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
 	"-p PRIO  --prio=PRIO       priority\n"
 	"-S       --smp             SMP testing: options -a -t and same priority\n"
         "                           of all threads\n"
@@ -264,6 +266,7 @@ static int affinity;
 static int priority;
 static int num_threads = 1;
 static int max_cycles;
+static int duration;
 static int interval = 1000;
 static int distance = 500;
 static int smp;
@@ -285,13 +288,14 @@ static void process_options (int argc, char *argv[])
 			{"fork", optional_argument, NULL, 'f'},
 			{"interval", required_argument, NULL, 'i'},
 			{"loops", required_argument, NULL, 'l'},
+			{"duration", required_argument, NULL, 'D'},
 			{"priority", required_argument, NULL, 'p'},
 			{"smp", no_argument, NULL, 'S'},
 			{"threads", optional_argument, NULL, 't'},
 			{"help", no_argument, NULL, '?'},
 			{NULL, 0, NULL, 0}
 		};
-		int c = getopt_long (argc, argv, "a::b:d:f::i:l:p:St::",
+		int c = getopt_long (argc, argv, "a::b:d:f::i:l:D:p:St::",
 			long_options, &option_index);
 		if (c == -1)
 			break;
@@ -326,6 +330,7 @@ static void process_options (int argc, char *argv[])
 			break;
 		case 'i': interval = atoi(optarg); break;
 		case 'l': max_cycles = atoi(optarg); break;
+		case 'D': duration = parse_time_string(optarg); break;
 		case 'p': priority = atoi(optarg); break;
 		case 'S':
 			smp = 1;
@@ -360,6 +365,9 @@ static void process_options (int argc, char *argv[])
 			}
 		}
 
+		if (duration < 0)
+			error = 0;
+
 		if (num_threads < 1 || num_threads > 255)
 			error = 1;
 
@@ -486,10 +494,14 @@ int main(int argc, char *argv[])
 
 	signal(SIGINT, sighand);
 	signal(SIGTERM, sighand);
+	signal(SIGALRM, sighand);
 
 	sigemptyset(&sigset);
 	pthread_sigmask(SIG_SETMASK, &sigset, NULL);
 
+	if (duration)
+		alarm(duration);
+
 	if (!mustfork && !wasforked) {
 		receiver = calloc(num_threads, sizeof(struct params));
 		sender = calloc(num_threads, sizeof(struct params));
@@ -663,6 +675,7 @@ int main(int argc, char *argv[])
 		sigemptyset(&sigset);
 		sigaddset(&sigset, SIGTERM);
 		sigaddset(&sigset, SIGINT);
+		sigaddset(&sigset, SIGALRM);
 		pthread_sigmask(SIG_SETMASK, &sigset, NULL);
 
 		nanosleep(&maindelay, NULL);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v1] rt-tests: Add --duration argument to tests
  2019-03-12 15:47 [PATCH v1] rt-tests: Add --duration argument to tests Daniel Wagner
@ 2019-04-05 15:11 ` John Kacur
  2019-04-15  9:06   ` Daniel Wagner
  0 siblings, 1 reply; 3+ messages in thread
From: John Kacur @ 2019-04-05 15:11 UTC (permalink / raw)
  To: Daniel Wagner; +Cc: Clark Williams, linux-rt-users



On Tue, 12 Mar 2019, Daniel Wagner wrote:

> Many of the test programs have the --loop argument for automatic
> stopping. The main problem with the --loop argument is how long is
> --loop 1000?
> 
> To simplify automated tests  introduce a --duration argument which
> allows to set the time how long a test should run. This allows the
> test suite to define the executation time and also the timeout which a
> normal human can understand.
> 
> For example run the test for 10 minutes and timeout at 11 minutes:
> 
>   # timeout 11m sigwaittest --duration 10m
> 
> Signed-off-by: Daniel Wagner <daniel.wagner@siemens.com>
> ---
> Hi,
> 
> I tried to patch all tests where possible. Not all tests need it,
> e.g. pip_stress.
> 
> There are two memory corruption bugs in cyclicdeadline and
> deadline_test. The setcpu_buf gets corrupted but I haven't figured
> where it happens. valgrind doesn't help :(
> 
> Thanks,
> Daniel
> 
>  src/cyclictest/cyclictest.c           | 33 --------------------------
>  src/include/rt-utils.h                |  2 ++
>  src/lib/rt-utils.c                    | 34 +++++++++++++++++++++++++++
>  src/pi_tests/pi_stress.8              |  4 ++++
>  src/pi_tests/pi_stress.c              |  9 +++----
>  src/pmqtest/pmqtest.8                 |  5 ++++
>  src/pmqtest/pmqtest.c                 | 17 ++++++++++++--
>  src/ptsematest/ptsematest.8           |  5 ++++
>  src/ptsematest/ptsematest.c           | 14 ++++++++++-
>  src/rt-migrate-test/rt-migrate-test.8 |  5 ++++
>  src/rt-migrate-test/rt-migrate-test.c | 12 +++++++++-
>  src/sched_deadline/cyclicdeadline.c   | 12 +++++++++-
>  src/signaltest/signaltest.8           |  5 ++++
>  src/signaltest/signaltest.c           | 14 ++++++++++-
>  src/sigwaittest/sigwaittest.8         |  5 ++++
>  src/sigwaittest/sigwaittest.c         | 15 +++++++++++-
>  src/svsematest/svsematest.8           |  5 ++++
>  src/svsematest/svsematest.c           | 15 +++++++++++-
>  18 files changed, 166 insertions(+), 45 deletions(-)
> 
> diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
> index ed59edefbf97..03d56e4f520c 100644
> --- a/src/cyclictest/cyclictest.c
> +++ b/src/cyclictest/cyclictest.c
> @@ -406,39 +406,6 @@ static void enable_trace_mark(void)
>  	open_tracemark_fd();
>  }
>  
> -/*
> - * parse an input value as a base10 value followed by an optional
> - * suffix. The input value is presumed to be in seconds, unless
> - * followed by a modifier suffix: m=minutes, h=hours, d=days
> - *
> - * the return value is a value in seconds
> - */
> -static int parse_time_string(char *val)
> -{
> -	char *end;
> -	int t = strtol(val, &end, 10);
> -	if (end) {
> -		switch (*end) {
> -		case 'm':
> -		case 'M':
> -			t *= 60;
> -			break;
> -
> -		case 'h':
> -		case 'H':
> -			t *= 60*60;
> -			break;
> -
> -		case 'd':
> -		case 'D':
> -			t *= 24*60*60;
> -			break;
> -
> -		}
> -	}
> -	return t;
> -}
> -
>  /*
>   * Raise the soft priority limit up to prio, if that is less than or equal
>   * to the hard limit
> diff --git a/src/include/rt-utils.h b/src/include/rt-utils.h
> index ef0f6acf4ab5..405fa7855346 100644
> --- a/src/include/rt-utils.h
> +++ b/src/include/rt-utils.h
> @@ -24,4 +24,6 @@ uint32_t string_to_policy(const char *str);
>  
>  pid_t gettid(void);
>  
> +int parse_time_string(char *val);
> +
>  #endif	/* __RT_UTILS.H */
> diff --git a/src/lib/rt-utils.c b/src/lib/rt-utils.c
> index ac6878ccacf1..e1b166afcd6c 100644
> --- a/src/lib/rt-utils.c
> +++ b/src/lib/rt-utils.c
> @@ -13,6 +13,7 @@
>  #include <sched.h>
>  #include <stdarg.h>
>  #include <errno.h>
> +#include <ctype.h>
>  #include <fcntl.h>
>  #include <sys/types.h>
>  #include <sys/stat.h>
> @@ -320,3 +321,36 @@ pid_t gettid(void)
>  {
>  	return syscall(SYS_gettid);
>  }
> +
> +/*
> + * parse an input value as a base10 value followed by an optional
> + * suffix. The input value is presumed to be in seconds, unless
> + * followed by a modifier suffix: m=minutes, h=hours, d=days
> + *
> + * the return value is a value in seconds
> + */
> +int parse_time_string(char *val)
> +{
> +	char *end;
> +	int t = strtol(val, &end, 10);
> +	if (end) {
> +		switch (*end) {
> +		case 'm':
> +		case 'M':
> +			t *= 60;
> +			break;
> +
> +		case 'h':
> +		case 'H':
> +			t *= 60*60;
> +			break;
> +
> +		case 'd':
> +		case 'D':
> +			t *= 24*60*60;
> +			break;
> +
> +		}
> +	}
> +	return t;
> +}
> diff --git a/src/pi_tests/pi_stress.8 b/src/pi_tests/pi_stress.8
> index c92b4bdf5609..475d3c34f135 100644
> --- a/src/pi_tests/pi_stress.8
> +++ b/src/pi_tests/pi_stress.8
> @@ -57,6 +57,10 @@ seconds and then terminate.
>  The number of inversion groups to run. Defaults to 10.
>  .IP \-d|\-\-debug
>  Run in debug mode; lots of extra prints
> +.IP "\-D, \-\-duration=TIME"
> +Specify a length for the test run.
> +.br
> +Append 'm', 'h', or 'd' to specify minutes, hours or days.
>  .IP \-v|\-\-verbose
>  Run with verbose messages
>  .IP \-s|\-\-signal
> diff --git a/src/pi_tests/pi_stress.c b/src/pi_tests/pi_stress.c
> index ac7646cd2613..eac782a8d355 100644
> --- a/src/pi_tests/pi_stress.c
> +++ b/src/pi_tests/pi_stress.c
> @@ -146,7 +146,7 @@ int lockall = 0;
>  
>  /* command line options */
>  struct option options[] = {
> -	{"duration", required_argument, NULL, 't'},
> +	{"duration", required_argument, NULL, 'D'},
>  	{"verbose", no_argument, NULL, 'v'},
>  	{"quiet", no_argument, NULL, 'q'},
>  	{"groups", required_argument, NULL, 'g'},
> @@ -1027,7 +1027,8 @@ void usage(void)
>  	printf("\t--verbose\t- lots of output\n");
>  	printf("\t--quiet\t\t- suppress running output\n");
>  	printf
> -	    ("\t--duration=<n>- length of the test run in seconds [infinite]\n");
> +	    ("\t--duration=<n>\t- length of the test run in seconds [infinite]\n");
> +	printf("\t\t\t  Append 'm', 'h', or 'd' to specify minutes, hours or days.\n");
>  	printf("\t--groups=<n>\t- set the number of inversion groups [%d]\n",
>  	       ngroups);
>  	printf
> @@ -1328,8 +1329,8 @@ void process_command_line(int argc, char **argv)
>  		case 'h':
>  			usage();
>  			exit(0);
> -		case 't':
> -			duration = strtol(optarg, NULL, 10);
> +		case 'D':
> +			duration = parse_time_string(optarg);
>  			break;
>  		case 'v':
>  			verbose = 1;
> diff --git a/src/pmqtest/pmqtest.8 b/src/pmqtest/pmqtest.8
> index 05421e01e70b..9108a939b9f7 100644
> --- a/src/pmqtest/pmqtest.8
> +++ b/src/pmqtest/pmqtest.8
> @@ -21,6 +21,11 @@ It is useful to track down unexpected large latencies of a system.
>  .B \-d, \-\-distance=DIST
>  Set the distance of thread intervals in microseconds (default is 500 us). When pmqtest is called with the -t option and more than one thread is created, then this distance value is added to the interval of the threads: Interval(thread N) = Interval(thread N-1) + DIST
>  .TP
> +.B \-D, \-\-duration=TIME
> +Specify a length for the test run.
> +.br
> +Append 'm', 'h', or 'd' to specify minutes, hours or days.
> +.TP
>  .B \-f, \-\-forcetimeout=TO
>  Set an artificial delay of the send function to force timeout of the receiver, requires the -T option
>  .TP
> diff --git a/src/pmqtest/pmqtest.c b/src/pmqtest/pmqtest.c
> index 75d5ee8185a0..054768d161a7 100644
> --- a/src/pmqtest/pmqtest.c
> +++ b/src/pmqtest/pmqtest.c
> @@ -252,6 +252,8 @@ static void display_help(void)
>  	"-f TO    --forcetimeout=TO force timeout of mq_timedreceive(), requires -T\n"
>  	"-i INTV  --interval=INTV   base interval of thread in us default=1000\n"
>  	"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
> +	"-D       --duration=TIME   specify a length for the test run.\n"
> +	"                           Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
>  	"-p PRIO  --prio=PRIO       priority\n"
>  	"-S       --smp             SMP testing: options -a -t and same priority\n"
>          "                           of all threads\n"
> @@ -271,6 +273,7 @@ static int tracelimit;
>  static int priority;
>  static int num_threads = 1;
>  static int max_cycles;
> +static int duration;
>  static int interval = 1000;
>  static int distance = 500;
>  static int smp;
> @@ -293,6 +296,7 @@ static void process_options (int argc, char *argv[])
>  			{"forcetimeout", required_argument, NULL, 'f'},
>  			{"interval", required_argument, NULL, 'i'},
>  			{"loops", required_argument, NULL, 'l'},
> +			{"duration", required_argument, NULL, 'D'},
>  			{"priority", required_argument, NULL, 'p'},
>  			{"smp", no_argument, NULL, 'S'},
>  			{"threads", optional_argument, NULL, 't'},
> @@ -300,7 +304,7 @@ static void process_options (int argc, char *argv[])
>  			{"help", no_argument, NULL, '?'},
>  			{NULL, 0, NULL, 0}
>  		};
> -		int c = getopt_long (argc, argv, "a::b:d:f:i:l:p:St::T:",
> +		int c = getopt_long (argc, argv, "a::b:d:f:i:l:D:p:St::T:",
>  			long_options, &option_index);
>  		if (c == -1)
>  			break;
> @@ -325,6 +329,7 @@ static void process_options (int argc, char *argv[])
>  		case 'f': forcetimeout = atoi(optarg); break;
>  		case 'i': interval = atoi(optarg); break;
>  		case 'l': max_cycles = atoi(optarg); break;
> +		case 'D': duration = parse_time_string(optarg); break;
>  		case 'p': priority = atoi(optarg); break;
>  		case 'S':
>  			smp = 1;
> @@ -369,7 +374,10 @@ static void process_options (int argc, char *argv[])
>  
>  	if (forcetimeout && !timeout)
>  		error = 1;
> - 
> +
> +	if (duration < 0)
> +		error = 1;
> +
>  	if (priority && smp)
>  		sameprio = 1;
>  
> @@ -418,10 +426,15 @@ int main(int argc, char *argv[])
>  	sigemptyset(&sigset);
>  	sigaddset(&sigset, SIGTERM);
>  	sigaddset(&sigset, SIGINT);
> +	sigaddset(&sigset, SIGALRM);
>  	pthread_sigmask(SIG_SETMASK, &sigset, NULL);
>  
>  	signal(SIGINT, sighand);
>  	signal(SIGTERM, sighand);
> +	signal(SIGALRM, sighand);
> +
> +	if (duration)
> +		alarm(duration);
>  
>  	receiver = calloc(num_threads, sizeof(struct params));
>  	sender = calloc(num_threads, sizeof(struct params));
> diff --git a/src/ptsematest/ptsematest.8 b/src/ptsematest/ptsematest.8
> index 9d835337ec27..289f3a1d7ae8 100644
> --- a/src/ptsematest/ptsematest.8
> +++ b/src/ptsematest/ptsematest.8
> @@ -21,6 +21,11 @@ It is useful to track down unexpected large latencies of a system.
>  .B \-d, \-\-distance=DIST
>  Set the distance of thread intervals in microseconds (default is 500 us). When  cyclictest is called with the -t option and more than one thread is created, then this distance value is added to the interval of the threads: Interval(thread N) = Interval(thread N-1) + DIST
>  .TP
> +.B \-D, \-\-duration=TIME
> +Specify a length for the test run.
> +.br
> +Append 'm', 'h', or 'd' to specify minutes, hours or days.
> +.TP
>  .B \-i, \-\-interval=INTV
>  Set the base interval of the thread(s) in microseconds (default is 1000 us). This sets the interval of the first thread. See also -d.
>  .TP
> diff --git a/src/ptsematest/ptsematest.c b/src/ptsematest/ptsematest.c
> index a31c745ec928..6bedbc81b572 100644
> --- a/src/ptsematest/ptsematest.c
> +++ b/src/ptsematest/ptsematest.c
> @@ -173,6 +173,8 @@ static void display_help(void)
>  	"-d DIST  --distance=DIST   distance of thread intervals in us default=500\n"
>  	"-i INTV  --interval=INTV   base interval of thread in us default=1000\n"
>  	"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
> +	"-D       --duration=TIME   specify a length for the test run.\n"
> +	"                           Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
>  	"-p PRIO  --prio=PRIO       priority\n"
>  	"-S       --smp             SMP testing: options -a -t and same priority\n"
>          "                           of all threads\n"
> @@ -190,6 +192,7 @@ static int tracelimit;
>  static int priority;
>  static int num_threads = 1;
>  static int max_cycles;
> +static int duration;
>  static int interval = 1000;
>  static int distance = 500;
>  static int smp;
> @@ -209,13 +212,14 @@ static void process_options (int argc, char *argv[])
->  			{"distance", required_argument, NULL, 'd'},
>  			{"interval", required_argument, NULL, 'i'},
>  			{"loops", required_argument, NULL, 'l'},
> +			{"duration", required_argument, NULL, 'D'},
>  			{"priority", required_argument, NULL, 'p'},
>  			{"smp", no_argument, NULL, 'S'},
>  			{"threads", optional_argument, NULL, 't'},
>  			{"help", no_argument, NULL, '?'},
>  			{NULL, 0, NULL, 0}
>  		};
> -		int c = getopt_long (argc, argv, "a::b:d:i:l:p:St::",
> +		int c = getopt_long (argc, argv, "a::b:d:i:l:D:p:St::",
>  			long_options, &option_index);
>  		if (c == -1)
>  			break;
> @@ -239,6 +243,7 @@ static void process_options (int argc, char *argv[])
>  		case 'd': distance = atoi(optarg); break;
>  		case 'i': interval = atoi(optarg); break;
>  		case 'l': max_cycles = atoi(optarg); break;
> +		case 'D': duration = parse_time_string(optarg); break;
>  		case 'p': priority = atoi(optarg); break;
>  		case 'S':
>  			smp = 1;
> @@ -280,6 +285,9 @@ static void process_options (int argc, char *argv[])
>  	if (num_threads < 1)
>  		error = 1;
>  
> +	if (duration < 0)
> +		error = 1;
> +
>  	if (priority && smp)
>  		sameprio = 1;
>  
> @@ -317,6 +325,10 @@ int main(int argc, char *argv[])
>  
>  	signal(SIGINT, sighand);
>  	signal(SIGTERM, sighand);
> +	signal(SIGALRM, sighand);
> +
> +	if (duration)
> +		alarm(duration);
>  
>  	receiver = calloc(num_threads, sizeof(struct params));
>  	sender = calloc(num_threads, sizeof(struct params));
> diff --git a/src/rt-migrate-test/rt-migrate-test.8 b/src/rt-migrate-test/rt-migrate-test.8
> index 8af50e54291d..b9c07f1ed80a 100644
> --- a/src/rt-migrate-test/rt-migrate-test.8
> +++ b/src/rt-migrate-test/rt-migrate-test.8
> @@ -15,6 +15,11 @@ This program follows the usual GNU command line syntax, with long options starti
>  In the summary of options, a value in brackets (), indicates a default value
>  .br
>  .TP
> +.B \-D, \-\-duration=TIME
> +Specify a length for the test run.
> +.br
> +Append 'm', 'h', or 'd' to specify minutes, hours or days.
> +.TP
>  .B \-p, \-\-prio=prio
>  base priority to start RT tasks with (2)
>  .br
> diff --git a/src/rt-migrate-test/rt-migrate-test.c b/src/rt-migrate-test/rt-migrate-test.c
> index 0a0bb77ab661..8223d6669a37 100644
> --- a/src/rt-migrate-test/rt-migrate-test.c
> +++ b/src/rt-migrate-test/rt-migrate-test.c
> @@ -41,6 +41,7 @@
>  #include <errno.h>
>  #include <sched.h>
>  #include <pthread.h>
> +#include "rt-utils.h"
>  
>  #define gettid() syscall(__NR_gettid)
>  
> @@ -115,6 +116,7 @@ static unsigned long long now;
>  
>  static int done;
>  static int loop;
> +static int duration;
>  
>  static pthread_barrier_t start_barrier;
>  static pthread_barrier_t end_barrier;
> @@ -180,6 +182,8 @@ static void usage(char **argv)
>  	       "-s time --sleep-time time   Sleep time (ms) between intervals (100)\n"
>  	       "-m time --maxerr time       Max allowed error (microsecs)\n"
>  	       "-l loops --loops loops      Number of iterations to run (50)\n"
> +	       "-D       --duration=TIME    specify a length for the test run.\n"
> +	       "                            Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
>  	       "-e                          Use equal prio for #CPU-1 tasks (requires > 2 CPUS)\n"
>  	       "-c    --check               Stop if lower prio task is quicker than higher (off)\n"
>  	       "-h    --help\n"
> @@ -199,11 +203,12 @@ static void parse_options (int argc, char *argv[])
>  			{"sleep-time", required_argument, NULL, 's'},
>  			{"maxerr", required_argument, NULL, 'm'},
>  			{"loops", required_argument, NULL, 'l'},
> +			{"duration", required_argument, NULL, 'D'},
>  			{"check", no_argument, NULL, 'c'},
>  			{"help", no_argument, NULL, '?'},
>  			{NULL, 0, NULL, 0}
>  		};
> -		int c = getopt_long (argc, argv, "p:r:s:m:l:ech",
> +		int c = getopt_long (argc, argv, "p:r:s:m:l:D:ech",
>  			long_options, &option_index);
>  		if (c == -1)
>  			break;
> @@ -214,6 +219,7 @@ static void parse_options (int argc, char *argv[])
>  			break;
>  		case 's': interval = atoi(optarg); break;
>  		case 'l': nr_runs = atoi(optarg); break;
> +		case 'D': duration = parse_time_string(optarg); break;
>  		case 'm': max_err = usec2nano(atoi(optarg)); break;
>  		case 'e': equal = 1; break;
>  		case 'c': check = 1; break;
> @@ -472,6 +478,10 @@ int main (int argc, char **argv)
>  	parse_options(argc, argv);
>  
>  	signal(SIGINT, stop_log);
> +	signal(SIGALRM, stop_log);
> +
> +	if (duration)
> +		alarm(duration);
>  
>  	if (argc >= (optind + 1))
>  		nr_tasks = atoi(argv[optind]);
> diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c
> index 761f8d7d7483..577ad95cfee1 100644
> --- a/src/sched_deadline/cyclicdeadline.c
> +++ b/src/sched_deadline/cyclicdeadline.c
> @@ -21,6 +21,8 @@
>  #include <linux/unistd.h>
>  #include <linux/magic.h>
>  
> +#include <rt-utils.h>
> +
>  #ifdef __i386__
>  #ifndef __NR_sched_setattr
>  #define __NR_sched_setattr		351
> @@ -1049,6 +1051,7 @@ int main (int argc, char **argv)
>  	unsigned int interval = 1000;
>  	unsigned int step = 500;
>  	int percent = 60;
> +	int duration = 0;
>  	u64 runtime;
>  	u64 start_period;
>  	u64 end_period;
> @@ -1062,7 +1065,7 @@ int main (int argc, char **argv)
>  		exit(-1);
>  	}
>  
> -	while ((c = getopt(argc, argv, "+hac:t:")) >= 0) {
> +	while ((c = getopt(argc, argv, "+hac:t:D:")) >= 0) {
>  		switch (c) {
>  		case 'a':
>  			all_cpus = 1;
> @@ -1081,6 +1084,9 @@ int main (int argc, char **argv)
>  		case 't':
>  			nr_threads = atoi(optarg);
>  			break;
> +		case 'D':
> +			duration = parse_time_string(optarg);
> +			break;
>  		case 'h':
>  		default:
>  			usage(argv);
> @@ -1246,6 +1252,10 @@ int main (int argc, char **argv)
>  
>  	signal(SIGINT, sighand);
>  	signal(SIGTERM, sighand);
> +	signal(SIGALRM, sighand);
> +
> +	if (duration)
> +		alarm(duration);
>  
>  	if (!fail)
>  		loop(sched_data, nr_threads);
> diff --git a/src/signaltest/signaltest.8 b/src/signaltest/signaltest.8
> index 634d392a6da5..bd6ffe5c7a36 100644
> --- a/src/signaltest/signaltest.8
> +++ b/src/signaltest/signaltest.8
> @@ -13,6 +13,11 @@ starting with two dashes ('\-\-').
>  .B \-b, \-\-breaktrace=USEC
>  Send break trace command when latency > USEC
>  .TP
> +.B \-D, \-\-duration=TIME
> +Specify a length for the test run.
> +.br
> +Append 'm', 'h', or 'd' to specify minutes, hours or days.
> +.TP
>  .B \-l, \-\-loops=LOOPS
>  Number of loops: default=0 (endless)
>  .TP
> diff --git a/src/signaltest/signaltest.c b/src/signaltest/signaltest.c
> index 59f979ec5ad1..a168191b7573 100644
> --- a/src/signaltest/signaltest.c
> +++ b/src/signaltest/signaltest.c
> @@ -208,6 +208,8 @@ static void display_help(void)
>  		"signaltest <options>\n\n"
>  		"-b USEC  --breaktrace=USEC send break trace command when latency > USEC\n"
>  		"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
> +		"-D       --duration=TIME   specify a length for the test run.\n"
> +		"                           Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
>  		"-p PRIO  --prio=PRIO       priority of highest prio thread\n"
>  		"-q       --quiet           print a summary only on exit\n"
>  		"-t NUM   --threads=NUM     number of threads: default=2\n"
> @@ -221,6 +223,7 @@ static void display_help(void)
>  static int priority;
>  static int num_threads = 2;
>  static int max_cycles;
> +static int duration;
>  static int verbose;
>  static int quiet;
>  static int lockall = 0;
> @@ -235,6 +238,7 @@ static void process_options (int argc, char *argv[])
>  		static struct option long_options[] = {
>  			{"breaktrace", required_argument, NULL, 'b'},
>  			{"loops", required_argument, NULL, 'l'},
> +			{"duration", required_argument, NULL, 'D'},
>  			{"priority", required_argument, NULL, 'p'},
>  			{"quiet", no_argument, NULL, 'q'},
>  			{"threads", required_argument, NULL, 't'},
> @@ -243,13 +247,14 @@ static void process_options (int argc, char *argv[])
>  			{"help", no_argument, NULL, '?'},
>  			{NULL, 0, NULL, 0}
>  		};
> -		int c = getopt_long (argc, argv, "b:c:d:i:l:np:qrsmt:v",
> +		int c = getopt_long (argc, argv, "b:c:d:i:l:D:np:qrsmt:v",
>  			long_options, &option_index);
>  		if (c == -1)
>  			break;
>  		switch (c) {
>  		case 'b': tracelimit = atoi(optarg); break;
>  		case 'l': max_cycles = atoi(optarg); break;
> +		case 'D': duration = parse_time_string(optarg); break;
>  		case 'p': priority = atoi(optarg); break;
>  		case 'q': quiet = 1; break;
>  		case 't': num_threads = atoi(optarg); break;
> @@ -259,6 +264,9 @@ static void process_options (int argc, char *argv[])
>  		}
>  	}
>  
> +	if (duration < 0)
> +		error = 1;
> +
>  	if (priority < 0 || priority > 99)
>  		error = 1;
>  
> @@ -340,6 +348,10 @@ int main(int argc, char **argv)
>  
>  	signal(SIGINT, sighand);
>  	signal(SIGTERM, sighand);
> +	signal(SIGALRM, sighand);
> +
> +	if (duration)
> +		alarm(duration);
>  
>  	par = calloc(num_threads, sizeof(struct thread_param));
>  	if (!par)
> diff --git a/src/sigwaittest/sigwaittest.8 b/src/sigwaittest/sigwaittest.8
> index 2290ca2c76bc..5bedf2ced0dd 100644
> --- a/src/sigwaittest/sigwaittest.8
> +++ b/src/sigwaittest/sigwaittest.8
> @@ -21,6 +21,11 @@ It is useful to track down unexpected large latencies of a system.
>  .B \-d, \-\-distance=DIST
>  Set the distance of thread intervals in microseconds (default is 500 us). When  cyclictest is called with the -t option and more than one thread is created, then this distance value is added to the interval of the threads: Interval(thread N) = Interval(thread N-1) + DIST
>  .TP
> +.B \-D, \-\-duration=TIME
> +Specify a length for the test run.
> +.br
> +Append 'm', 'h', or 'd' to specify minutes, hours or days.
> +.TP
>  .B \-f, \-\-fork
>  Instead of creating threads (which is the default), fork new processes
>  .TP
> diff --git a/src/sigwaittest/sigwaittest.c b/src/sigwaittest/sigwaittest.c
> index 91fcdaa5f185..6e3c28330447 100644
> --- a/src/sigwaittest/sigwaittest.c
> +++ b/src/sigwaittest/sigwaittest.c
> @@ -222,6 +222,8 @@ static void display_help(void)
>  	"-f       --fork            fork new processes instead of creating threads\n"
>  	"-i INTV  --interval=INTV   base interval of thread in us default=1000\n"
>  	"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
> +	"-D       --duration=TIME   specify a length for the test run.\n"
> +	"                           Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
>  	"-p PRIO  --prio=PRIO       priority\n"
>  	"-t       --threads         one thread per available processor\n"
>  	"-t [NUM] --threads=NUM     number of threads:\n"
> @@ -236,6 +238,7 @@ static int affinity;
>  static int priority;
>  static int num_threads = 1;
>  static int max_cycles;
> +static int duration;
>  static int interval = 1000;
>  static int distance = 500;
>  
> @@ -255,12 +258,13 @@ static void process_options (int argc, char *argv[])
>  			{"fork", optional_argument, NULL, 'f'},
>  			{"interval", required_argument, NULL, 'i'},
>  			{"loops", required_argument, NULL, 'l'},
> +			{"duration", required_argument, NULL, 'D'},
>  			{"priority", required_argument, NULL, 'p'},
>  			{"threads", optional_argument, NULL, 't'},
>  			{"help", no_argument, NULL, '?'},
>  			{NULL, 0, NULL, 0}
>  		};
> -		int c = getopt_long (argc, argv, "a::b:d:f::i:l:p:t::",
> +		int c = getopt_long (argc, argv, "a::b:d:f::i:l:D:p:t::",
>  			long_options, &option_index);
>  		if (c == -1)
>  			break;
> @@ -291,6 +295,7 @@ static void process_options (int argc, char *argv[])
>  			break;
>  		case 'i': interval = atoi(optarg); break;
>  		case 'l': max_cycles = atoi(optarg); break;
> +		case 'D': duration = parse_time_string(optarg); break;
>  		case 'p': priority = atoi(optarg); break;
>  		case 't':
>  			if (optarg != NULL)
> @@ -316,6 +321,9 @@ static void process_options (int argc, char *argv[])
>  			}
>  		}
>  
> +		if (duration < 0)
> +			error = 1;
> +
>  		if (num_threads < 1 || num_threads > 255)
>  			error = 1;
>  
> @@ -433,9 +441,13 @@ int main(int argc, char *argv[])
>  
>  	signal(SIGINT, sighand);
>  	signal(SIGTERM, sighand);
> +	signal(SIGALRM, sighand);
>  	sigemptyset(&sigset);
>  	pthread_sigmask(SIG_SETMASK, &sigset, NULL);
>  
> +	if (duration)
> +		alarm(duration);
> +
>  	if (!mustfork && !wasforked) {
>  		receiver = calloc(num_threads, sizeof(struct params));
>  		sender = calloc(num_threads, sizeof(struct params));
> @@ -578,6 +590,7 @@ int main(int argc, char *argv[])
>  		sigemptyset(&sigset);
>  		sigaddset(&sigset, SIGTERM);
>  		sigaddset(&sigset, SIGINT);
> +		sigaddset(&sigset, SIGALRM);
>  		pthread_sigmask(SIG_SETMASK, &sigset, NULL);
>  
>  		nanosleep(&maindelay, NULL);
> diff --git a/src/svsematest/svsematest.8 b/src/svsematest/svsematest.8
> index 0d4eaf3bb7ff..da64e9875d9f 100644
> --- a/src/svsematest/svsematest.8
> +++ b/src/svsematest/svsematest.8
> @@ -21,6 +21,11 @@ It is useful to track down unexpected large latencies of a system.
>  .B \-d, \-\-distance=DIST
>  Set the distance of thread intervals in microseconds (default is 500 us). When  cyclictest is called with the -t option and more than one thread is created, then this distance value is added to the interval of the threads: Interval(thread N) = Interval(thread N-1) + DIST
>  .TP
> +.B \-D, \-\-duration=TIME
> +Specify a length for the test run.
> +.br
> +Append 'm', 'h', or 'd' to specify minutes, hours or days.
> +.TP
>  .B \-f, \-\-fork
>  Instead of creating threads (which is the default), fork new processes
>  .TP
> diff --git a/src/svsematest/svsematest.c b/src/svsematest/svsematest.c
> index eeb82858720a..dfa4660c0e43 100644
> --- a/src/svsematest/svsematest.c
> +++ b/src/svsematest/svsematest.c
> @@ -248,6 +248,8 @@ static void display_help(void)
>  	"-f       --fork            fork new processes instead of creating threads\n"
>  	"-i INTV  --interval=INTV   base interval of thread in us default=1000\n"
>  	"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
> +	"-D       --duration=TIME   specify a length for the test run.\n"
> +	"                           Append 'm', 'h', or 'd' to specify minutes, hours or days.\n"
>  	"-p PRIO  --prio=PRIO       priority\n"
>  	"-S       --smp             SMP testing: options -a -t and same priority\n"
>          "                           of all threads\n"
> @@ -264,6 +266,7 @@ static int affinity;
>  static int priority;
>  static int num_threads = 1;
>  static int max_cycles;
> +static int duration;
>  static int interval = 1000;
>  static int distance = 500;
>  static int smp;
> @@ -285,13 +288,14 @@ static void process_options (int argc, char *argv[])
>  			{"fork", optional_argument, NULL, 'f'},
>  			{"interval", required_argument, NULL, 'i'},
>  			{"loops", required_argument, NULL, 'l'},
> +			{"duration", required_argument, NULL, 'D'},
>  			{"priority", required_argument, NULL, 'p'},
>  			{"smp", no_argument, NULL, 'S'},
>  			{"threads", optional_argument, NULL, 't'},
>  			{"help", no_argument, NULL, '?'},
>  			{NULL, 0, NULL, 0}
>  		};
> -		int c = getopt_long (argc, argv, "a::b:d:f::i:l:p:St::",
> +		int c = getopt_long (argc, argv, "a::b:d:f::i:l:D:p:St::",
>  			long_options, &option_index);
>  		if (c == -1)
>  			break;
> @@ -326,6 +330,7 @@ static void process_options (int argc, char *argv[])
>  			break;
>  		case 'i': interval = atoi(optarg); break;
>  		case 'l': max_cycles = atoi(optarg); break;
> +		case 'D': duration = parse_time_string(optarg); break;
>  		case 'p': priority = atoi(optarg); break;
>  		case 'S':
>  			smp = 1;
> @@ -360,6 +365,9 @@ static void process_options (int argc, char *argv[])
>  			}
>  		}
>  
> +		if (duration < 0)
> +			error = 0;
> +
>  		if (num_threads < 1 || num_threads > 255)
>  			error = 1;
>  
> @@ -486,10 +494,14 @@ int main(int argc, char *argv[])
>  
>  	signal(SIGINT, sighand);
>  	signal(SIGTERM, sighand);
> +	signal(SIGALRM, sighand);
>  
>  	sigemptyset(&sigset);
>  	pthread_sigmask(SIG_SETMASK, &sigset, NULL);
>  
> +	if (duration)
> +		alarm(duration);
> +
>  	if (!mustfork && !wasforked) {
>  		receiver = calloc(num_threads, sizeof(struct params));
>  		sender = calloc(num_threads, sizeof(struct params));
> @@ -663,6 +675,7 @@ int main(int argc, char *argv[])
>  		sigemptyset(&sigset);
>  		sigaddset(&sigset, SIGTERM);
>  		sigaddset(&sigset, SIGINT);
> +		sigaddset(&sigset, SIGALRM);
>  		pthread_sigmask(SIG_SETMASK, &sigset, NULL);
>  
>  		nanosleep(&maindelay, NULL);
> -- 
> 2.20.1
> 
> 

I like the idea, I am happy to apply it, but 
this is a huge patch and it isn't applying cleanly
- could you break it up in separate patches for different tests?
- somehow (maybe your text editor) has added a few dos style line endings
- make sure this is against unstable/devel/latest

Thanks

John




^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v1] rt-tests: Add --duration argument to tests
  2019-04-05 15:11 ` John Kacur
@ 2019-04-15  9:06   ` Daniel Wagner
  0 siblings, 0 replies; 3+ messages in thread
From: Daniel Wagner @ 2019-04-15  9:06 UTC (permalink / raw)
  To: John Kacur; +Cc: Clark Williams, linux-rt-users

Hi John,

On 05.04.19 17:11, John Kacur wrote:
> I like the idea, I am happy to apply it, but 
> this is a huge patch and it isn't applying cleanly> - could you break it up in separate patches for different tests?

Sure, will do.

> - somehow (maybe your text editor) has added a few dos style line endings

No idea what happened and I blame emacs :)

> - make sure this is against unstable/devel/latest

Maybe that was the error and I used an different branch. I'll rebase my
changes on this branch. Sorry for the inconveniences.

Thanks,
Daniel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-04-15  9:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-12 15:47 [PATCH v1] rt-tests: Add --duration argument to tests Daniel Wagner
2019-04-05 15:11 ` John Kacur
2019-04-15  9:06   ` Daniel Wagner

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.