linux-rt-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated
@ 2021-03-05  7:34 Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 01/14] cyclictest: Fix printf format specifier Daniel Wagner
                   ` (14 more replies)
  0 siblings, 15 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

v2:
  - added 'return_code' to the common section of the JSON output
  - dropped 'inversion' as we have 'return_code' in pip_stress
  - dropped 'success' as we have 'return code in ssdd

The first two patches fixes the format string issue. Then there are a
couple of patches which fixes the common JSON entries (command line,
start_time, end_time).

Then there are patches which add the --output parameter to the missing
rt-tests programs.

All patches are also available at:

  https://github.com/igaw/rt-tests/tree/json-output-2021-03-05

Daniel Wagner (14):
  cyclictest: Fix printf format specifier
  cyclicdeadline.c: Fix printf format specifier
  signaltest: Add missing --output usage info
  rt-util: Copy command line before getopt_long() is called
  rt-util: Add start time of test execution for JSON output
  rt-util: Add return_code to common section of JSON output
  pip_stress: Move test result output to main
  pip_stress: Return failure code if test fails
  pip_stress: Prepare arg parser to accept only long options
  pip_stress: Add JSON output feature
  pi_stress: Prepare command line parser for long options only
  pi_stress: Add JSON output feature
  ssdd: Add quiet command line option
  ssdd: Add JSON output feature

 src/cyclictest/cyclictest.c           | 13 ++--
 src/include/rt-utils.h                |  9 ++-
 src/lib/rt-utils.c                    | 86 ++++++++++++++++-----------
 src/oslat/oslat.c                     |  6 +-
 src/pi_tests/pi_stress.c              | 65 ++++++++++++++++----
 src/pi_tests/pip_stress.c             | 40 +++++++++----
 src/pmqtest/pmqtest.c                 |  4 +-
 src/ptsematest/ptsematest.c           |  4 +-
 src/rt-migrate-test/rt-migrate-test.c |  4 +-
 src/sched_deadline/cyclicdeadline.c   | 12 ++--
 src/signaltest/signaltest.c           |  5 +-
 src/sigwaittest/sigwaittest.c         |  4 +-
 src/ssdd/ssdd.c                       | 43 +++++++++++---
 src/svsematest/svsematest.c           |  4 +-
 14 files changed, 207 insertions(+), 92 deletions(-)

-- 
2.30.1


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

* [PATCH rt-tests v2 01/14] cyclictest: Fix printf format specifier
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-14 22:45   ` John Kacur
  2021-03-05  7:34 ` [PATCH rt-tests v2 02/14] cyclicdeadline.c: " Daniel Wagner
                   ` (13 subsequent siblings)
  14 siblings, 1 reply; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

The fields are not uint64 just longs, update the printf format
specifiers.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/cyclictest/cyclictest.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
index 157047837259..c43dd7cbbd64 100644
--- a/src/cyclictest/cyclictest.c
+++ b/src/cyclictest/cyclictest.c
@@ -11,7 +11,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
-#include <inttypes.h>
 #include <stdarg.h>
 #include <unistd.h>
 #include <fcntl.h>
@@ -1751,15 +1750,15 @@ static void write_stats(FILE *f, void *data)
 			if (s->hist_array[j] == 0)
 				continue;
 			fprintf(f, "%s", comma ? ",\n" : "\n");
-			fprintf(f, "        \"%u\": %" PRIu64, j, s->hist_array[j]);
+			fprintf(f, "        \"%u\": %ld", j, s->hist_array[j]);
 			comma = 1;
 		}
 		if (comma)
 			fprintf(f, "\n");
 		fprintf(f, "      },\n");
-		fprintf(f, "      \"cycles\": %" PRIu64 ",\n", s->cycles);
-		fprintf(f, "      \"min\": %" PRIu64 ",\n", s->min);
-		fprintf(f, "      \"max\": %" PRIu64 ",\n", s->max);
+		fprintf(f, "      \"cycles\": %ld,\n", s->cycles);
+		fprintf(f, "      \"min\": %ld,\n", s->min);
+		fprintf(f, "      \"max\": %ld,\n", s->max);
 		fprintf(f, "      \"avg\": %.2f,\n", s->avg/s->cycles);
 		fprintf(f, "      \"cpu\": %d,\n", par[i]->cpu);
 		fprintf(f, "      \"node\": %d\n", par[i]->node);
-- 
2.30.1


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

* [PATCH rt-tests v2 02/14] cyclicdeadline.c: Fix printf format specifier
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 01/14] cyclictest: Fix printf format specifier Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-14 22:45   ` John Kacur
  2021-03-05  7:34 ` [PATCH rt-tests v2 03/14] signaltest: Add missing --output usage info Daniel Wagner
                   ` (12 subsequent siblings)
  14 siblings, 1 reply; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

The fields are not uint64 just longs, update the printf format
specifiers.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/sched_deadline/cyclicdeadline.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c
index 33bac8cda898..d7aa9bb5d269 100644
--- a/src/sched_deadline/cyclicdeadline.c
+++ b/src/sched_deadline/cyclicdeadline.c
@@ -18,7 +18,6 @@
 #include <errno.h>
 #include <signal.h>
 #include <getopt.h>
-#include <inttypes.h>
 
 #include <sys/syscall.h>
 #include <sys/types.h>
@@ -976,9 +975,9 @@ static void write_stats(FILE *f, void *data)
 	for (i = 0; i < nr_threads; i++) {
 		s = &sd[i].stat;
 		fprintf(f, "    \"%u\": {\n", i);
-		fprintf(f, "	 \"cycles\": %" PRIu64 ",\n", s->cycles);
-		fprintf(f, "	 \"min\": %" PRIu64 ",\n", s->min);
-		fprintf(f, "	 \"max\": %" PRIu64 ",\n", s->max);
+		fprintf(f, "	 \"cycles\": %ld,\n", s->cycles);
+		fprintf(f, "	 \"min\": %ld,\n", s->min);
+		fprintf(f, "	 \"max\": %ld\n", s->max);
 		fprintf(f, "	 \"avg\": %.2f\n", s->avg/s->cycles);
 		fprintf(f, "    }%s\n", i == nr_threads - 1 ? "" : ",");
 	}
-- 
2.30.1


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

* [PATCH rt-tests v2 03/14] signaltest: Add missing --output usage info
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 01/14] cyclictest: Fix printf format specifier Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 02/14] cyclicdeadline.c: " Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-14 22:47   ` John Kacur
  2021-03-05  7:34 ` [PATCH rt-tests v2 04/14] rt-util: Copy command line before getopt_long() is called Daniel Wagner
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/signaltest/signaltest.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/signaltest/signaltest.c b/src/signaltest/signaltest.c
index b1a7e1db8302..e2ffc0bb8693 100644
--- a/src/signaltest/signaltest.c
+++ b/src/signaltest/signaltest.c
@@ -189,6 +189,7 @@ static void display_help(int error)
 		"-h       --help            display usage information\n"
 		"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
 		"-m       --mlockall        lock current and future memory allocations\n"
+		"         --output=FILENAME write final results into FILENAME, JSON formatted\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"
-- 
2.30.1


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

* [PATCH rt-tests v2 04/14] rt-util: Copy command line before getopt_long() is called
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (2 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 03/14] signaltest: Add missing --output usage info Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-15  5:47   ` John Kacur
  2021-03-05  7:34 ` [PATCH rt-tests v2 05/14] rt-util: Add start time of test execution for JSON output Daniel Wagner
                   ` (10 subsequent siblings)
  14 siblings, 1 reply; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

By default, getopt_long() permutes the contents of argv as it scans,
so that eventually all the nonoptions are at the end. This is
confusing in the JSON output, thus copy the command line before we
call getopt_long().

Introduce a rt_init() which copies the command line. This makes also
rt_write_json() function arguments a bit cleaner.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/cyclictest/cyclictest.c           |  3 +-
 src/include/rt-utils.h                |  7 +++--
 src/lib/rt-utils.c                    | 45 ++++++++++++---------------
 src/oslat/oslat.c                     |  5 +--
 src/pmqtest/pmqtest.c                 |  3 +-
 src/ptsematest/ptsematest.c           |  3 +-
 src/rt-migrate-test/rt-migrate-test.c |  3 +-
 src/sched_deadline/cyclicdeadline.c   |  4 ++-
 src/signaltest/signaltest.c           |  3 +-
 src/sigwaittest/sigwaittest.c         |  3 +-
 src/svsematest/svsematest.c           |  3 +-
 11 files changed, 44 insertions(+), 38 deletions(-)

diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
index c43dd7cbbd64..3f3b91bab53b 100644
--- a/src/cyclictest/cyclictest.c
+++ b/src/cyclictest/cyclictest.c
@@ -1778,6 +1778,7 @@ int main(int argc, char **argv)
 	int i, ret = -1;
 	int status;
 
+	rt_init(argc, argv);
 	process_options(argc, argv, max_cpus);
 
 	if (check_privs())
@@ -2133,7 +2134,7 @@ int main(int argc, char **argv)
 		printf("\033[%dB", num_threads + 2);
 
 	if (strlen(outfile) != 0)
-		rt_write_json(outfile, argc, argv, write_stats, NULL);
+		rt_write_json(outfile, write_stats, NULL);
 
 	if (quiet)
 		quiet = 2;
diff --git a/src/include/rt-utils.h b/src/include/rt-utils.h
index 36af92b170df..11d69ea7e49a 100644
--- a/src/include/rt-utils.h
+++ b/src/include/rt-utils.h
@@ -80,8 +80,9 @@ static inline int64_t calctime(struct timespec t)
 	return time;
 }
 
-void rt_write_json(const char *filename, int argc, char *argv[],
-		   void (*cb)(FILE *, void *),
-		   void *data);
+void rt_init(int argc, char *argv[]);
+
+void rt_write_json(const char *filename,
+		   void (*cb)(FILE *, void *), void *data);
 
 #endif	/* __RT_UTILS.H */
diff --git a/src/lib/rt-utils.c b/src/lib/rt-utils.c
index 00907c573d6a..9c9d0dee3255 100644
--- a/src/lib/rt-utils.c
+++ b/src/lib/rt-utils.c
@@ -29,12 +29,14 @@
 #include "rt-error.h"
 
 #define  TRACEBUFSIZ  1024
+#define  MAX_COMMAND_LINE 4096
 
 static char debugfileprefix[MAX_PATH];
 static char *fileprefix;
 static int trace_fd = -1;
 static int tracemark_fd = -1;
 static __thread char tracebuf[TRACEBUFSIZ];
+static char cmdline[MAX_COMMAND_LINE];
 
 /*
  * Finds the tracing directory in a mounted debugfs
@@ -486,40 +488,40 @@ void disable_trace_mark(void)
 	close_tracemark_fd();
 }
 
-static char *get_cmdline(int argc, char *argv[])
+void rt_init(int argc, char *argv[])
 {
-	char *cmdline;
+	int offset = 0;
 	int len, i;
 
-	len = 0;
-	for (i = 0; i < argc; i++)
-		len += strlen(argv[i]) + 1;
+	cmdline[0] = '\0';
 
-	cmdline = malloc(len);
-	if (!cmdline)
-		err_exit(ENOMEM, "Could not copy cmdline");
-
-	memset(cmdline, 0, len);
+	/*
+	 * getopt_long() permutes the contents of argv as it scans, so
+	 * that eventually all the nonoptions are at the end. Make a
+	 * copy before calling getopt_long().
+	 */
 	for (i = 0; i < argc;) {
-		cmdline = strcat(cmdline, argv[i]);
+		len = strlen(argv[i]);
+		if (offset + len + 1 >= MAX_COMMAND_LINE)
+			break;
+
+		strcat(cmdline, argv[i]);
 		i++;
 		if (i < argc)
-			cmdline = strcat(cmdline, " ");
-	}
+			strcat(cmdline, " ");
 
-	return cmdline;
+		offset += len + 1;
+	}
 }
 
-void rt_write_json(const char *filename, int argc, char *argv[],
-		  void (*cb)(FILE *, void *),
-		  void *data)
+void rt_write_json(const char *filename,
+		   void (*cb)(FILE *, void *), void *data)
 {
 	unsigned char buf[1];
 	struct utsname uts;
 	struct timeval tv;
 	char tsbuf[64];
 	struct tm *tm;
-	char *cmdline;
 	FILE *f, *s;
 	time_t t;
 	size_t n;
@@ -533,11 +535,6 @@ void rt_write_json(const char *filename, int argc, char *argv[],
 			err_exit(errno, "Failed to open '%s'\n", filename);
 	}
 
-	cmdline = get_cmdline(argc, argv);
-	if (!cmdline)
-		err_exit(ENOMEM, "get_cmdline()");
-
-
 	gettimeofday(&tv, NULL);
 	t = tv.tv_sec;
 	tm = localtime(&t);
@@ -573,8 +570,6 @@ void rt_write_json(const char *filename, int argc, char *argv[],
 
 	fprintf(f, "}\n");
 
-	free(cmdline);
-
 	if (!filename || strcmp("-", filename))
 		fclose(f);
 }
diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c
index 465a694cdd1d..ac54d05697ef 100644
--- a/src/oslat/oslat.c
+++ b/src/oslat/oslat.c
@@ -796,6 +796,8 @@ int main(int argc, char *argv[])
 		exit(1);
 	}
 
+	rt_init(argc, argv);
+
 	g.app_name = argv[0];
 	g.rtprio = 0;
 	g.bucket_size = BUCKET_SIZE;
@@ -860,8 +862,7 @@ int main(int argc, char *argv[])
 	write_summary(threads);
 
 	if (strlen(g.outfile) != 0)
-		rt_write_json(g.outfile, argc, argv,
-			write_summary_json, threads);
+		rt_write_json(g.outfile, write_summary_json, threads);
 
 	if (g.cpu_list) {
 		free(g.cpu_list);
diff --git a/src/pmqtest/pmqtest.c b/src/pmqtest/pmqtest.c
index e1f59836ea07..f96b3d0bf400 100644
--- a/src/pmqtest/pmqtest.c
+++ b/src/pmqtest/pmqtest.c
@@ -502,6 +502,7 @@ int main(int argc, char *argv[])
 	mqstat.mq_msgsize = 8;
 	mqstat.mq_flags = 0;
 
+	rt_init(argc, argv);
 	process_options(argc, argv);
 
 	if (check_privs())
@@ -650,7 +651,7 @@ int main(int argc, char *argv[])
 			.receiver = receiver,
 			.sender = sender,
 		};
-		rt_write_json(outfile, argc, argv, write_stats, &ps);
+		rt_write_json(outfile, write_stats, &ps);
 	}
 
 nomem:
diff --git a/src/ptsematest/ptsematest.c b/src/ptsematest/ptsematest.c
index 2755bfde5210..a32bfc1698f0 100644
--- a/src/ptsematest/ptsematest.c
+++ b/src/ptsematest/ptsematest.c
@@ -401,6 +401,7 @@ int main(int argc, char *argv[])
 	sigset_t sigset;
 	struct timespec maindelay;
 
+	rt_init(argc, argv);
 	process_options(argc, argv);
 
 	if (check_privs())
@@ -518,7 +519,7 @@ int main(int argc, char *argv[])
 			.receiver = receiver,
 			.sender = sender,
 		};
-		rt_write_json(outfile, argc, argv, write_stats, &ps);
+		rt_write_json(outfile, write_stats, &ps);
 	}
 
 nomem:
diff --git a/src/rt-migrate-test/rt-migrate-test.c b/src/rt-migrate-test/rt-migrate-test.c
index 56b7b66ccdf4..cdfbfafb200b 100644
--- a/src/rt-migrate-test/rt-migrate-test.c
+++ b/src/rt-migrate-test/rt-migrate-test.c
@@ -535,6 +535,7 @@ int main (int argc, char **argv)
 	struct timespec intv;
 	struct sched_param param;
 
+	rt_init(argc, argv);
 	parse_options(argc, argv);
 
 	signal(SIGINT, stop_log);
@@ -662,7 +663,7 @@ int main (int argc, char **argv)
 	print_results();
 
 	if (strlen(outfile) != 0)
-		rt_write_json(outfile, argc, argv, write_stats, NULL);
+		rt_write_json(outfile, write_stats, NULL);
 
 	if (stop) {
 		/*
diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c
index d7aa9bb5d269..e6811838b62d 100644
--- a/src/sched_deadline/cyclicdeadline.c
+++ b/src/sched_deadline/cyclicdeadline.c
@@ -1009,6 +1009,8 @@ int main(int argc, char **argv)
 	int i;
 	int c;
 
+	rt_init(argc, argv);
+
 	cpu_count = sysconf(_SC_NPROCESSORS_CONF);
 	if (cpu_count < 1)
 		err_quit("Can not calculate number of CPUS\n");
@@ -1225,7 +1227,7 @@ int main(int argc, char **argv)
 	}
 
 	if (strlen(outfile) != 0)
-		rt_write_json(outfile, argc, argv, write_stats, sched_data);
+		rt_write_json(outfile, write_stats, sched_data);
 
 	if (setcpu_buf)
 		free(setcpu_buf);
diff --git a/src/signaltest/signaltest.c b/src/signaltest/signaltest.c
index e2ffc0bb8693..6abf38b7821c 100644
--- a/src/signaltest/signaltest.c
+++ b/src/signaltest/signaltest.c
@@ -414,6 +414,7 @@ int main(int argc, char **argv)
 	int status, cpu;
 	int max_cpus = sysconf(_SC_NPROCESSORS_ONLN);
 
+	rt_init(argc, argv);
 	process_options(argc, argv, max_cpus);
 
 	if (check_privs())
@@ -557,7 +558,7 @@ int main(int argc, char **argv)
 			free(stat[i].values);
 	}
 	if (strlen(outfile) != 0)
-		rt_write_json(outfile, argc, argv, write_stats, par);
+		rt_write_json(outfile, write_stats, par);
 
 	free(stat);
  outpar:
diff --git a/src/sigwaittest/sigwaittest.c b/src/sigwaittest/sigwaittest.c
index 0cdf30a6a769..142419f9e315 100644
--- a/src/sigwaittest/sigwaittest.c
+++ b/src/sigwaittest/sigwaittest.c
@@ -473,6 +473,7 @@ int main(int argc, char *argv[])
 	char f_opt[14];
 	struct timespec launchdelay, maindelay;
 
+	rt_init(argc, argv);
 	process_options(argc, argv);
 
 	if (check_privs())
@@ -705,7 +706,7 @@ int main(int argc, char *argv[])
 			.receiver = receiver,
 			.sender = sender,
 		};
-		rt_write_json(outfile, argc, argv, write_stats, &ps);
+		rt_write_json(outfile, write_stats, &ps);
 	}
 
 nomem:
diff --git a/src/svsematest/svsematest.c b/src/svsematest/svsematest.c
index 23f84bcbd3dc..7c9d21edbab2 100644
--- a/src/svsematest/svsematest.c
+++ b/src/svsematest/svsematest.c
@@ -514,6 +514,7 @@ int main(int argc, char *argv[])
 	if (myfile == NULL)
 		myfile = argv[0];
 
+	rt_init(argc, argv);
 	process_options(argc, argv);
 
 	if (check_privs())
@@ -777,7 +778,7 @@ int main(int argc, char *argv[])
 			.receiver = receiver,
 			.sender = sender,
 		};
-		rt_write_json(outfile, argc, argv, write_stats, &ps);
+		rt_write_json(outfile, write_stats, &ps);
 	}
 
 nosem:
-- 
2.30.1


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

* [PATCH rt-tests v2 05/14] rt-util: Add start time of test execution for JSON output
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (3 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 04/14] rt-util: Copy command line before getopt_long() is called Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 06/14] rt-util: Add return_code to common section of " Daniel Wagner
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

Store the start time when the test starts to execute in the JSON
output.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/cyclictest/cyclictest.c           |  1 +
 src/include/rt-utils.h                |  2 ++
 src/lib/rt-utils.c                    | 34 +++++++++++++++++++--------
 src/oslat/oslat.c                     |  1 +
 src/pmqtest/pmqtest.c                 |  1 +
 src/ptsematest/ptsematest.c           |  1 +
 src/rt-migrate-test/rt-migrate-test.c |  1 +
 src/sched_deadline/cyclicdeadline.c   |  1 +
 src/signaltest/signaltest.c           |  1 +
 src/sigwaittest/sigwaittest.c         |  1 +
 src/svsematest/svsematest.c           |  1 +
 11 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
index 3f3b91bab53b..033b95a3a19a 100644
--- a/src/cyclictest/cyclictest.c
+++ b/src/cyclictest/cyclictest.c
@@ -615,6 +615,7 @@ static void *timerthread(void *param)
 		setitimer(ITIMER_REAL, &itimer, NULL);
 	}
 
+	rt_test_start();
 	stat->threadstarted++;
 
 	while (!shutdown) {
diff --git a/src/include/rt-utils.h b/src/include/rt-utils.h
index 11d69ea7e49a..d83f11930998 100644
--- a/src/include/rt-utils.h
+++ b/src/include/rt-utils.h
@@ -82,6 +82,8 @@ static inline int64_t calctime(struct timespec t)
 
 void rt_init(int argc, char *argv[]);
 
+void rt_test_start(void);
+
 void rt_write_json(const char *filename,
 		   void (*cb)(FILE *, void *), void *data);
 
diff --git a/src/lib/rt-utils.c b/src/lib/rt-utils.c
index 9c9d0dee3255..09d79170c371 100644
--- a/src/lib/rt-utils.c
+++ b/src/lib/rt-utils.c
@@ -30,6 +30,7 @@
 
 #define  TRACEBUFSIZ  1024
 #define  MAX_COMMAND_LINE 4096
+#define  MAX_TS_SIZE 64
 
 static char debugfileprefix[MAX_PATH];
 static char *fileprefix;
@@ -37,6 +38,7 @@ static int trace_fd = -1;
 static int tracemark_fd = -1;
 static __thread char tracebuf[TRACEBUFSIZ];
 static char cmdline[MAX_COMMAND_LINE];
+static char ts_start[MAX_TS_SIZE];
 
 /*
  * Finds the tracing directory in a mounted debugfs
@@ -514,16 +516,31 @@ void rt_init(int argc, char *argv[])
 	}
 }
 
+static void get_timestamp(char *tsbuf)
+{
+	struct timeval tv;
+	struct tm *tm;
+	time_t t;
+
+	gettimeofday(&tv, NULL);
+	t = tv.tv_sec;
+	tm = localtime(&t);
+	/* RFC 2822-compliant date format */
+	strftime(tsbuf, MAX_TS_SIZE, "%a, %d %b %Y %T %z", tm);
+}
+
+void rt_test_start(void)
+{
+	get_timestamp(ts_start);
+}
+
 void rt_write_json(const char *filename,
 		   void (*cb)(FILE *, void *), void *data)
 {
 	unsigned char buf[1];
 	struct utsname uts;
-	struct timeval tv;
-	char tsbuf[64];
-	struct tm *tm;
+	char ts_end[MAX_TS_SIZE];
 	FILE *f, *s;
-	time_t t;
 	size_t n;
 	int rt = 0;
 
@@ -535,11 +552,7 @@ void rt_write_json(const char *filename,
 			err_exit(errno, "Failed to open '%s'\n", filename);
 	}
 
-	gettimeofday(&tv, NULL);
-	t = tv.tv_sec;
-	tm = localtime(&t);
-	/* RFC 2822-compliant date format */
-	strftime(tsbuf, sizeof(tsbuf), "%a, %d %b %Y %T %z", tm);
+	get_timestamp(ts_end);
 
 	s = fopen("/sys/kernel/realtime", "r");
 	if (s) {
@@ -556,7 +569,8 @@ void rt_write_json(const char *filename,
 	fprintf(f, "  \"file_version\": 1,\n");
 	fprintf(f, "  \"cmdline:\": \"%s\",\n", cmdline);
 	fprintf(f, "  \"rt_test_version:\": \"%1.2f\",\n", VERSION);
-	fprintf(f, "  \"finished\": \"%s\",\n", tsbuf);
+	fprintf(f, "  \"start_time\": \"%s\",\n", ts_start);
+	fprintf(f, "  \"end_time\": \"%s\",\n", ts_end);
 	fprintf(f, "  \"sysinfo\": {\n");
 	fprintf(f, "    \"sysname\": \"%s\",\n", uts.sysname);
 	fprintf(f, "    \"nodename\": \"%s\",\n", uts.nodename);
diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c
index ac54d05697ef..2f02f5399405 100644
--- a/src/oslat/oslat.c
+++ b/src/oslat/oslat.c
@@ -854,6 +854,7 @@ int main(int argc, char *argv[])
 		printf("Test starts...\n");
 	/* Reset n_threads to always run on all the cores */
 	g.n_threads = g.n_threads_total;
+	rt_test_start();
 	run_expt(threads, g.runtime);
 
 	if (!g.quiet)
diff --git a/src/pmqtest/pmqtest.c b/src/pmqtest/pmqtest.c
index f96b3d0bf400..adf72c10ce83 100644
--- a/src/pmqtest/pmqtest.c
+++ b/src/pmqtest/pmqtest.c
@@ -583,6 +583,7 @@ int main(int argc, char *argv[])
 	sigemptyset(&sigset);
 	pthread_sigmask(SIG_SETMASK, &sigset, NULL);
 
+	rt_test_start();
 	do {
 		int newsamples = 0, newtimeoutcount = 0;
 		int minsamples = INT_MAX;
diff --git a/src/ptsematest/ptsematest.c b/src/ptsematest/ptsematest.c
index a32bfc1698f0..471f1b307c14 100644
--- a/src/ptsematest/ptsematest.c
+++ b/src/ptsematest/ptsematest.c
@@ -468,6 +468,7 @@ int main(int argc, char *argv[])
 	maindelay.tv_sec = 0;
 	maindelay.tv_nsec = 50000000; /* 50 ms */
 
+	rt_test_start();
 	while (!shutdown) {
 		for (i = 0; i < num_threads; i++)
 			shutdown |= receiver[i].shutdown | sender[i].shutdown;
diff --git a/src/rt-migrate-test/rt-migrate-test.c b/src/rt-migrate-test/rt-migrate-test.c
index cdfbfafb200b..8f628d347a23 100644
--- a/src/rt-migrate-test/rt-migrate-test.c
+++ b/src/rt-migrate-test/rt-migrate-test.c
@@ -621,6 +621,7 @@ int main (int argc, char **argv)
 
 	setup_ftrace_marker();
 
+	rt_test_start();
 	for (loop=0; loop < nr_runs; loop++) {
 		unsigned long long end;
 
diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c
index e6811838b62d..a649e5a0fe5e 100644
--- a/src/sched_deadline/cyclicdeadline.c
+++ b/src/sched_deadline/cyclicdeadline.c
@@ -1213,6 +1213,7 @@ int main(int argc, char **argv)
 	if (duration)
 		alarm(duration);
 
+	rt_test_start();
 	loop(sched_data, nr_threads);
 
 	for (i = 0; i < nr_threads; i++) {
diff --git a/src/signaltest/signaltest.c b/src/signaltest/signaltest.c
index 6abf38b7821c..7327d0d0144d 100644
--- a/src/signaltest/signaltest.c
+++ b/src/signaltest/signaltest.c
@@ -500,6 +500,7 @@ int main(int argc, char **argv)
 			      strerror(status));
 	}
 
+	rt_test_start();
 	while (!shutdown) {
 		int allstarted = 1;
 
diff --git a/src/sigwaittest/sigwaittest.c b/src/sigwaittest/sigwaittest.c
index 142419f9e315..6e8bc7b50d5f 100644
--- a/src/sigwaittest/sigwaittest.c
+++ b/src/sigwaittest/sigwaittest.c
@@ -652,6 +652,7 @@ int main(int argc, char *argv[])
 			    &sender[i]);
 	}
 
+	rt_test_start();
 	while (!mustshutdown) {
 		for (i = 0; i < num_threads; i++)
 			mustshutdown |= receiver[i].shutdown |
diff --git a/src/svsematest/svsematest.c b/src/svsematest/svsematest.c
index 7c9d21edbab2..7533b1b569cc 100644
--- a/src/svsematest/svsematest.c
+++ b/src/svsematest/svsematest.c
@@ -724,6 +724,7 @@ int main(int argc, char *argv[])
 			    &sender[i]);
 	}
 
+	rt_test_start();
 	while (!mustshutdown) {
 		for (i = 0; i < num_threads; i++)
 			mustshutdown |= receiver[i].shutdown |
-- 
2.30.1


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

* [PATCH rt-tests v2 06/14] rt-util: Add return_code to common section of JSON output
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (4 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 05/14] rt-util: Add start time of test execution for JSON output Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 07/14] pip_stress: Move test result output to main Daniel Wagner
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

Many rt-tests return an error code if the test fails. Let's add
this information to the common section.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/cyclictest/cyclictest.c           |  2 +-
 src/include/rt-utils.h                |  2 +-
 src/lib/rt-utils.c                    | 11 ++++++++---
 src/oslat/oslat.c                     |  2 +-
 src/pmqtest/pmqtest.c                 |  2 +-
 src/ptsematest/ptsematest.c           |  2 +-
 src/rt-migrate-test/rt-migrate-test.c |  2 +-
 src/sched_deadline/cyclicdeadline.c   |  2 +-
 src/signaltest/signaltest.c           |  2 +-
 src/sigwaittest/sigwaittest.c         |  2 +-
 src/svsematest/svsematest.c           |  2 +-
 11 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
index 033b95a3a19a..59dda1973b1a 100644
--- a/src/cyclictest/cyclictest.c
+++ b/src/cyclictest/cyclictest.c
@@ -2135,7 +2135,7 @@ int main(int argc, char **argv)
 		printf("\033[%dB", num_threads + 2);
 
 	if (strlen(outfile) != 0)
-		rt_write_json(outfile, write_stats, NULL);
+		rt_write_json(outfile, ret, write_stats, NULL);
 
 	if (quiet)
 		quiet = 2;
diff --git a/src/include/rt-utils.h b/src/include/rt-utils.h
index d83f11930998..5194c239d648 100644
--- a/src/include/rt-utils.h
+++ b/src/include/rt-utils.h
@@ -84,7 +84,7 @@ void rt_init(int argc, char *argv[]);
 
 void rt_test_start(void);
 
-void rt_write_json(const char *filename,
+void rt_write_json(const char *filename, int return_code,
 		   void (*cb)(FILE *, void *), void *data);
 
 #endif	/* __RT_UTILS.H */
diff --git a/src/lib/rt-utils.c b/src/lib/rt-utils.c
index 09d79170c371..69f3b4669c9b 100644
--- a/src/lib/rt-utils.c
+++ b/src/lib/rt-utils.c
@@ -534,7 +534,7 @@ void rt_test_start(void)
 	get_timestamp(ts_start);
 }
 
-void rt_write_json(const char *filename,
+void rt_write_json(const char *filename, int return_code,
 		   void (*cb)(FILE *, void *), void *data)
 {
 	unsigned char buf[1];
@@ -571,6 +571,7 @@ void rt_write_json(const char *filename,
 	fprintf(f, "  \"rt_test_version:\": \"%1.2f\",\n", VERSION);
 	fprintf(f, "  \"start_time\": \"%s\",\n", ts_start);
 	fprintf(f, "  \"end_time\": \"%s\",\n", ts_end);
+	fprintf(f, "  \"return_code\": %d,\n", return_code);
 	fprintf(f, "  \"sysinfo\": {\n");
 	fprintf(f, "    \"sysname\": \"%s\",\n", uts.sysname);
 	fprintf(f, "    \"nodename\": \"%s\",\n", uts.nodename);
@@ -578,9 +579,13 @@ void rt_write_json(const char *filename,
 	fprintf(f, "    \"version\": \"%s\",\n", uts.version);
 	fprintf(f, "    \"machine\": \"%s\",\n", uts.machine);
 	fprintf(f, "    \"realtime\": %d\n", rt);
-	fprintf(f, "  },\n");
 
-	(cb)(f, data);
+	if (cb) {
+		fprintf(f, "  },\n");
+		(cb)(f, data);
+	} else {
+		fprintf(f, "  }\n");
+	}
 
 	fprintf(f, "}\n");
 
diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c
index 2f02f5399405..37d528f0f7ff 100644
--- a/src/oslat/oslat.c
+++ b/src/oslat/oslat.c
@@ -863,7 +863,7 @@ int main(int argc, char *argv[])
 	write_summary(threads);
 
 	if (strlen(g.outfile) != 0)
-		rt_write_json(g.outfile, write_summary_json, threads);
+		rt_write_json(g.outfile, 0, write_summary_json, threads);
 
 	if (g.cpu_list) {
 		free(g.cpu_list);
diff --git a/src/pmqtest/pmqtest.c b/src/pmqtest/pmqtest.c
index adf72c10ce83..af10b416600c 100644
--- a/src/pmqtest/pmqtest.c
+++ b/src/pmqtest/pmqtest.c
@@ -652,7 +652,7 @@ int main(int argc, char *argv[])
 			.receiver = receiver,
 			.sender = sender,
 		};
-		rt_write_json(outfile, write_stats, &ps);
+		rt_write_json(outfile, 0, write_stats, &ps);
 	}
 
 nomem:
diff --git a/src/ptsematest/ptsematest.c b/src/ptsematest/ptsematest.c
index 471f1b307c14..70eb79e89635 100644
--- a/src/ptsematest/ptsematest.c
+++ b/src/ptsematest/ptsematest.c
@@ -520,7 +520,7 @@ int main(int argc, char *argv[])
 			.receiver = receiver,
 			.sender = sender,
 		};
-		rt_write_json(outfile, write_stats, &ps);
+		rt_write_json(outfile, 0, write_stats, &ps);
 	}
 
 nomem:
diff --git a/src/rt-migrate-test/rt-migrate-test.c b/src/rt-migrate-test/rt-migrate-test.c
index 8f628d347a23..1e0abdd6c0fa 100644
--- a/src/rt-migrate-test/rt-migrate-test.c
+++ b/src/rt-migrate-test/rt-migrate-test.c
@@ -664,7 +664,7 @@ int main (int argc, char **argv)
 	print_results();
 
 	if (strlen(outfile) != 0)
-		rt_write_json(outfile, write_stats, NULL);
+		rt_write_json(outfile, check < 0, write_stats, NULL);
 
 	if (stop) {
 		/*
diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c
index a649e5a0fe5e..8d801b4c154a 100644
--- a/src/sched_deadline/cyclicdeadline.c
+++ b/src/sched_deadline/cyclicdeadline.c
@@ -1228,7 +1228,7 @@ int main(int argc, char **argv)
 	}
 
 	if (strlen(outfile) != 0)
-		rt_write_json(outfile, write_stats, sched_data);
+		rt_write_json(outfile, 0, write_stats, sched_data);
 
 	if (setcpu_buf)
 		free(setcpu_buf);
diff --git a/src/signaltest/signaltest.c b/src/signaltest/signaltest.c
index 7327d0d0144d..f43920e1a853 100644
--- a/src/signaltest/signaltest.c
+++ b/src/signaltest/signaltest.c
@@ -559,7 +559,7 @@ int main(int argc, char **argv)
 			free(stat[i].values);
 	}
 	if (strlen(outfile) != 0)
-		rt_write_json(outfile, write_stats, par);
+		rt_write_json(outfile, ret, write_stats, par);
 
 	free(stat);
  outpar:
diff --git a/src/sigwaittest/sigwaittest.c b/src/sigwaittest/sigwaittest.c
index 6e8bc7b50d5f..fda44724dd62 100644
--- a/src/sigwaittest/sigwaittest.c
+++ b/src/sigwaittest/sigwaittest.c
@@ -707,7 +707,7 @@ int main(int argc, char *argv[])
 			.receiver = receiver,
 			.sender = sender,
 		};
-		rt_write_json(outfile, write_stats, &ps);
+		rt_write_json(outfile, 0, write_stats, &ps);
 	}
 
 nomem:
diff --git a/src/svsematest/svsematest.c b/src/svsematest/svsematest.c
index 7533b1b569cc..9485ab6d95c8 100644
--- a/src/svsematest/svsematest.c
+++ b/src/svsematest/svsematest.c
@@ -779,7 +779,7 @@ int main(int argc, char *argv[])
 			.receiver = receiver,
 			.sender = sender,
 		};
-		rt_write_json(outfile, write_stats, &ps);
+		rt_write_json(outfile, 0, write_stats, &ps);
 	}
 
 nosem:
-- 
2.30.1


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

* [PATCH rt-tests v2 07/14] pip_stress: Move test result output to main
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (5 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 06/14] rt-util: Add return_code to common section of " Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 08/14] pip_stress: Return failure code if test fails Daniel Wagner
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

Instead printing the result high() close directly move it to main()
function to simplify the return code if the test fails.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/pi_tests/pip_stress.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/src/pi_tests/pip_stress.c b/src/pi_tests/pip_stress.c
index 8b91578f9ab8..2c3288984202 100644
--- a/src/pi_tests/pip_stress.c
+++ b/src/pi_tests/pip_stress.c
@@ -146,6 +146,7 @@ int main(int argc, char *argv[])
 		exit(1);
 	} else if (pid1 != 0) {		/* parent code */
 		low(pid1);
+		exit(0);
 	} else {			/* child code */
 		pid2 = fork();		/* parent code */
 		if (pid2 == -1) {
@@ -155,9 +156,15 @@ int main(int argc, char *argv[])
 			high(pid2);
 		} else {			/* child code */
 			medium();
+			exit(0);
 		}
 	}
 
+	if (statep->inversion)
+		printf("Successfully used priority inheritance to handle an inversion\n");
+	else
+		printf("No inversion incurred\n");
+
 	exit(0);
 }
 
@@ -222,14 +229,6 @@ void high(pid_t pid)
 	Pthread_mutex_unlock(resource);
 	kill(pid, SIGKILL);	/* kill the medium thread */
 	waitpid(pid, &status, 0);
-
-	Pthread_mutex_lock(statep->mutex);
-
-	if (statep->inversion)
-		printf("Successfully used priority inheritance to handle an inversion\n");
-	else
-		printf("No inversion incurred\n");
-	Pthread_mutex_unlock(statep->mutex);
 }
 
 /* mmap a page of anonymous shared memory */
-- 
2.30.1


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

* [PATCH rt-tests v2 08/14] pip_stress: Return failure code if test fails
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (6 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 07/14] pip_stress: Move test result output to main Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 09/14] pip_stress: Prepare arg parser to accept only long options Daniel Wagner
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

Let the test return a failure code when the test fails.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/pi_tests/pip_stress.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/pi_tests/pip_stress.c b/src/pi_tests/pip_stress.c
index 2c3288984202..ed034799da66 100644
--- a/src/pi_tests/pip_stress.c
+++ b/src/pi_tests/pip_stress.c
@@ -160,11 +160,11 @@ int main(int argc, char *argv[])
 		}
 	}
 
-	if (statep->inversion)
-		printf("Successfully used priority inheritance to handle an inversion\n");
-	else
+	if (!statep->inversion) {
 		printf("No inversion incurred\n");
-
+		exit(1);
+	}
+	printf("Successfully used priority inheritance to handle an inversion\n");
 	exit(0);
 }
 
-- 
2.30.1


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

* [PATCH rt-tests v2 09/14] pip_stress: Prepare arg parser to accept only long options
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (7 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 08/14] pip_stress: Return failure code if test fails Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 10/14] pip_stress: Add JSON output feature Daniel Wagner
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

Introduce the option value enums to be able to parse only long
options.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/pi_tests/pip_stress.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/pi_tests/pip_stress.c b/src/pi_tests/pip_stress.c
index ed034799da66..0831f698ff1d 100644
--- a/src/pi_tests/pip_stress.c
+++ b/src/pi_tests/pip_stress.c
@@ -77,6 +77,10 @@ static void usage(int error)
 	exit(error);
 }
 
+enum option_values {
+	OPT_HELP=1
+};
+
 int main(int argc, char *argv[])
 {
 	void *mptr;	/* memory pointer */
@@ -87,14 +91,15 @@ int main(int argc, char *argv[])
 
 	for (;;) {
 		struct option long_options[] = {
-			{ "help",	no_argument,		NULL,	'h' },
-			{ NULL,		0,			NULL,	0 },
+			{"help",	no_argument,		NULL, OPT_HELP},
+			{NULL,		0,			NULL, 0}
 		};
 
-		int c = getopt_long(argc, argv, "s:h", long_options, NULL);
+		int c = getopt_long(argc, argv, "h", long_options, NULL);
 		if (c == -1)
 			break;
 		switch (c) {
+		case OPT_HELP:
 		case 'h':
 			usage(0);
 			break;
-- 
2.30.1


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

* [PATCH rt-tests v2 10/14] pip_stress: Add JSON output feature
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (8 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 09/14] pip_stress: Prepare arg parser to accept only long options Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 11/14] pi_stress: Prepare command line parser for long options only Daniel Wagner
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

Write the test results as JSON output to a file. This allows to
simplifies any parsing later on.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/pi_tests/pip_stress.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/pi_tests/pip_stress.c b/src/pi_tests/pip_stress.c
index 0831f698ff1d..f6096a2de273 100644
--- a/src/pi_tests/pip_stress.c
+++ b/src/pi_tests/pip_stress.c
@@ -67,18 +67,21 @@ struct State *statep;
 const int policy = SCHED_FIFO;
 static int prio_min;	/* Initialized for the minimum priority of policy */
 
+static char outfile[MAX_PATH];
+
 static void usage(int error)
 {
 	printf("pip_stress V %1.2f\n", VERSION);
 	printf("Usage:\n"
 	       "pip_stress <options>\n"\
-	       "-h	--help                  Show this help menu.\n"
+	       "-h	 --help            Show this help menu.\n"
+	       "         --output=FILENAME write final results into FILENAME, JSON formatted\n"
 	       );
 	exit(error);
 }
 
 enum option_values {
-	OPT_HELP=1
+	OPT_HELP=1, OPT_OUTPUT,
 };
 
 int main(int argc, char *argv[])
@@ -89,9 +92,11 @@ int main(int argc, char *argv[])
 	int res;
 	int *minimum_priority = (int*)&prio_min;
 
+	rt_init(argc, argv);
 	for (;;) {
 		struct option long_options[] = {
 			{"help",	no_argument,		NULL, OPT_HELP},
+			{"output",	required_argument,	NULL, OPT_OUTPUT },
 			{NULL,		0,			NULL, 0}
 		};
 
@@ -103,6 +108,9 @@ int main(int argc, char *argv[])
 		case 'h':
 			usage(0);
 			break;
+		case OPT_OUTPUT:
+			strncpy(outfile, optarg, strnlen(optarg, MAX_PATH-1));
+			break;
 		default:
 			usage(1);
 			break;
@@ -145,6 +153,7 @@ int main(int argc, char *argv[])
 		err_exit(err, NULL);
 	}
 
+	rt_test_start();
 	pid1 = fork();
 	if (pid1 == -1) {
 		perror("fork");
@@ -165,6 +174,9 @@ int main(int argc, char *argv[])
 		}
 	}
 
+	if (strlen(outfile) != 0)
+		rt_write_json(outfile, !statep->inversion, NULL, NULL);
+
 	if (!statep->inversion) {
 		printf("No inversion incurred\n");
 		exit(1);
-- 
2.30.1


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

* [PATCH rt-tests v2 11/14] pi_stress: Prepare command line parser for long options only
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (9 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 10/14] pip_stress: Add JSON output feature Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 12/14] pi_stress: Add JSON output feature Daniel Wagner
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

Introduce option value enums in order to be able to parse long options
only.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/pi_tests/pi_stress.c | 45 ++++++++++++++++++++++++++++------------
 1 file changed, 32 insertions(+), 13 deletions(-)

diff --git a/src/pi_tests/pi_stress.c b/src/pi_tests/pi_stress.c
index 49f89b7b0136..73f0e6a402e3 100644
--- a/src/pi_tests/pi_stress.c
+++ b/src/pi_tests/pi_stress.c
@@ -1274,23 +1274,29 @@ int process_sched_line(const char *arg)
 	return retval;
 }
 
+enum option_values {
+	OPT_DEBUG=1, OPT_DURATION, OPT_GROUPS, OPT_HELP, OPT_INVERSIONS,
+	OPT_MLOCKALL, OPT_PROMPT, OPT_QUIET, OPT_RR, OPT_SCHED,
+	OPT_UNIPROCESSOR, OPT_VERBOSE, OPT_VERSION,
+};
+
 void process_command_line(int argc, char **argv)
 {
 	for (;;) {
 		struct option options[] = {
-			{"debug",		no_argument,		NULL, 'd'},
-			{"duration",		required_argument,	NULL, 'D'},
-			{"groups",		required_argument,	NULL, 'g'},
-			{"help",		no_argument,		NULL, 'h'},
-			{"inversions",		required_argument,	NULL, 'i'},
-			{"mlockall",		no_argument,		NULL, 'm'},
-			{"prompt",		no_argument,		NULL, 'p'},
-			{"quiet",		no_argument,		NULL, 'q'},
-			{"rr",			no_argument,		NULL, 'r'},
-			{"sched",		required_argument,	NULL, 's'},
-			{"uniprocessor",	no_argument,		NULL, 'u'},
-			{"verbose",		no_argument,		NULL, 'v'},
-			{"version",		no_argument,		NULL, 'V'},
+			{"debug",		no_argument,		NULL, OPT_DEBUG},
+			{"duration",		required_argument,	NULL, OPT_DURATION},
+			{"groups",		required_argument,	NULL, OPT_GROUPS},
+			{"help",		no_argument,		NULL, OPT_HELP},
+			{"inversions",		required_argument,	NULL, OPT_INVERSIONS},
+			{"mlockall",		no_argument,		NULL, OPT_MLOCKALL},
+			{"prompt",		no_argument,		NULL, OPT_PROMPT},
+			{"quiet",		no_argument,		NULL, OPT_QUIET},
+			{"rr",			no_argument,		NULL, OPT_RR},
+			{"sched",		required_argument,	NULL, OPT_SCHED},
+			{"uniprocessor",	no_argument,		NULL, OPT_UNIPROCESSOR},
+			{"verbose",		no_argument,		NULL, OPT_VERBOSE},
+			{"version",		no_argument,		NULL, OPT_VERSION},
 			{NULL, 0, NULL, 0},
 		};
 
@@ -1298,12 +1304,15 @@ void process_command_line(int argc, char **argv)
 		if (c == -1)
 			break;
 		switch (c) {
+		case OPT_DEBUG:
 		case 'd':
 			debugging = 1;
 			break;
+		case OPT_DURATION:
 		case 'D':
 			duration = parse_time_string(optarg);
 			break;
+		case OPT_GROUPS:
 		case 'g':
 			ngroups = strtol(optarg, NULL, 10);
 			if (ngroups > num_processors) {
@@ -1314,37 +1323,47 @@ void process_command_line(int argc, char **argv)
 			}
 			pi_info("number of groups set to %d\n", ngroups);
 			break;
+		case OPT_HELP:
 		case 'h':
 			usage(0);
 			break;
+		case OPT_INVERSIONS:
 		case 'i':
 			inversions = strtol(optarg, NULL, 10);
 			pi_info("doing %d inversion per group\n", inversions);
 			break;
+		case OPT_MLOCKALL:
 		case 'm':
 			lockall = 1;
 			break;
+		case OPT_PROMPT:
 		case 'p':
 			prompt = 1;
 			break;
+		case OPT_QUIET:
 		case 'q':
 			verbose = 0;
 			quiet = 1;
 			break;
+		case OPT_RR:
 		case 'r':
 			policy = SCHED_RR;
 			break;
+		case OPT_SCHED:
 		case 's':
 			if (process_sched_line(optarg))
 				pi_error("ignoring invalid options '%s'\n", optarg);
 			break;
+		case OPT_UNIPROCESSOR:
 		case 'u':
 			uniprocessor = 1;
 			break;
+		case OPT_VERBOSE:
 		case 'v':
 			verbose = 1;
 			quiet = 0;
 			break;
+		case OPT_VERSION:
 		case 'V':
 			printf("pi_stress v%1.2f ", VERSION);
 			exit(0);
-- 
2.30.1


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

* [PATCH rt-tests v2 12/14] pi_stress: Add JSON output feature
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (10 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 11/14] pi_stress: Prepare command line parser for long options only Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-05  7:34 ` [PATCH rt-tests v2 13/14] ssdd: Add quiet command line option Daniel Wagner
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

Write the test results as JSON output to a file. This allows to
simplifies any parsing later on.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/pi_tests/pi_stress.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/pi_tests/pi_stress.c b/src/pi_tests/pi_stress.c
index 73f0e6a402e3..3f93d4aadd53 100644
--- a/src/pi_tests/pi_stress.c
+++ b/src/pi_tests/pi_stress.c
@@ -99,6 +99,9 @@ int debugging = 0;
 
 int quiet = 0;	/* turn off all prints, default = 0 (off) */
 
+/* filename for JSON output */
+char outfile[MAX_PATH];
+
 /* prompt to start test */
 int prompt = 0;
 
@@ -209,6 +212,7 @@ int create_group(struct group_parameters *group);
 unsigned long total_inversions(void);
 void banner(void);
 void summary(void);
+void write_stats(FILE *f, void *data);
 void wait_for_termination(void);
 int barrier_init(pthread_barrier_t *b, const pthread_barrierattr_t *attr,
 		 unsigned int count, const char *name);
@@ -235,6 +239,7 @@ int main(int argc, char **argv)
 
 
 	/* process command line arguments */
+	rt_init(argc, argv);
 	process_command_line(argc, argv);
 
 	/* set default sched attributes */
@@ -299,6 +304,7 @@ int main(int argc, char **argv)
 	}
 	/* report */
 	banner();
+	rt_test_start();
 	start = time(NULL);
 
 	/* turn loose the threads */
@@ -335,6 +341,10 @@ int main(int argc, char **argv)
 		kill(0, SIGTERM);
 	finish = time(NULL);
 	summary();
+
+	if (strlen(outfile) != 0)
+		rt_write_json(outfile, retval, write_stats, NULL);
+
 	if (lockall)
 		munlockall();
 	exit(retval);
@@ -983,6 +993,7 @@ void usage(int error)
 	       "-h       --help            print this message\n"
 	       "-i INV   --inversions=INV  number of inversions per group (default is infinite)\n"
 	       "-m       --mlockall        lock current and future memory\n"
+	       "         --output=FILENAME write final results into FILENAME, JSON formatted\n"
 	       "-p       --prompt          prompt before starting the test\n"
 	       "-q       --quiet           suppress running output\n"
 	       "-r       --rr              use SCHED_RR for test threads [SCHED_FIFO]\n"
@@ -1276,7 +1287,7 @@ int process_sched_line(const char *arg)
 
 enum option_values {
 	OPT_DEBUG=1, OPT_DURATION, OPT_GROUPS, OPT_HELP, OPT_INVERSIONS,
-	OPT_MLOCKALL, OPT_PROMPT, OPT_QUIET, OPT_RR, OPT_SCHED,
+	OPT_MLOCKALL, OPT_OUTPUT, OPT_PROMPT, OPT_QUIET, OPT_RR, OPT_SCHED,
 	OPT_UNIPROCESSOR, OPT_VERBOSE, OPT_VERSION,
 };
 
@@ -1290,6 +1301,7 @@ void process_command_line(int argc, char **argv)
 			{"help",		no_argument,		NULL, OPT_HELP},
 			{"inversions",		required_argument,	NULL, OPT_INVERSIONS},
 			{"mlockall",		no_argument,		NULL, OPT_MLOCKALL},
+			{"output",		required_argument,	NULL, OPT_OUTPUT},
 			{"prompt",		no_argument,		NULL, OPT_PROMPT},
 			{"quiet",		no_argument,		NULL, OPT_QUIET},
 			{"rr",			no_argument,		NULL, OPT_RR},
@@ -1336,6 +1348,9 @@ void process_command_line(int argc, char **argv)
 		case 'm':
 			lockall = 1;
 			break;
+		case OPT_OUTPUT:
+			strncpy(outfile, optarg, strnlen(optarg, MAX_PATH-1));
+			break;
 		case OPT_PROMPT:
 		case 'p':
 			prompt = 1;
@@ -1439,6 +1454,11 @@ void summary(void)
 	       t->tm_yday, t->tm_hour, t->tm_min, t->tm_sec);
 }
 
+void write_stats(FILE *f, void *data)
+{
+	fprintf(f, "  \"inversion\": %lu\n", total_inversions());
+}
+
 int
 barrier_init(pthread_barrier_t *b, const pthread_barrierattr_t *attr,
 	     unsigned int count, const char *name)
-- 
2.30.1


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

* [PATCH rt-tests v2 13/14] ssdd: Add quiet command line option
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (11 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 12/14] pi_stress: Add JSON output feature Daniel Wagner
@ 2021-03-05  7:34 ` Daniel Wagner
  2021-03-05  7:35 ` [PATCH rt-tests v2 14/14] ssdd: Add JSON output feature Daniel Wagner
  2021-03-05  7:41 ` [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
  14 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:34 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

The quiet option is useful for automated test setups where
only the final result of the run is interesting.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/ssdd/ssdd.c | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/src/ssdd/ssdd.c b/src/ssdd/ssdd.c
index 9fa61f39f6e3..50bec824b2e8 100644
--- a/src/ssdd/ssdd.c
+++ b/src/ssdd/ssdd.c
@@ -64,9 +64,11 @@ static const char *get_state_name(int state)
 
 #define unused __attribute__((unused))
 
+static int quiet;
+
 static int got_sigchld;
 
-enum option_value { OPT_NFORKS=1, OPT_NITERS, OPT_HELP };
+enum option_value { OPT_NFORKS=1, OPT_NITERS, OPT_HELP, OPT_QUIET };
 
 static void usage(int error)
 {
@@ -75,6 +77,7 @@ static void usage(int error)
 	       "ssdd <options>\n\n"
 	       "-f       --forks=NUM       number of forks\n"
 	       "-h       --help            print this message\n"
+	       "-q       --quiet           suppress running output\n"
 	       "-i       --iters=NUM       number of iterations\n"
 	       );
 	exit(error);
@@ -176,7 +179,8 @@ static int forktests(int testid)
 	if (!child)
 		child_process();
 
-	printf("forktest#%d/%d/%d: STARTING\n", testid, parent, child);
+	if (!quiet)
+		printf("forktest#%d/%d/%d: STARTING\n", testid, parent, child);
 
 	act.sa_sigaction = sigchld;
 	sigemptyset(&act.sa_mask);
@@ -278,8 +282,8 @@ static int forktests(int testid)
 	/* There is no need for the tracer to kill the tracee. It will
 	 * automatically exit when its owner, ie, us, exits.
 	 */
-
-	printf("forktest#%d/%d: EXITING, no error\n", testid, parent);
+	if (!quiet)
+		printf("forktest#%d/%d: EXITING, no error\n", testid, parent);
 	exit(0);
 }
 
@@ -297,10 +301,11 @@ int main(int argc, char **argv)
 		static struct option long_options[] = {
 			{"forks",		required_argument,	NULL, OPT_NFORKS},
 			{"help",		no_argument,		NULL, OPT_HELP},
+			{"quiet",		no_argument,		NULL, OPT_QUIET},
 			{"iters",		required_argument,	NULL, OPT_NITERS},
 			{NULL, 0, NULL, 0},
 		};
-		int c = getopt_long(argc, argv, "f:hi:", long_options, &option_index);
+		int c = getopt_long(argc, argv, "f:hqi:", long_options, &option_index);
 		if (c == -1)
 			break;
 		switch(c) {
@@ -312,6 +317,10 @@ int main(int argc, char **argv)
 		case OPT_HELP:
 			usage(0);
 			break;
+		case OPT_QUIET:
+		case 'q':
+			quiet = 1;
+			break;
 		case 'i':
 		case OPT_NITERS:
 			nsteps = atoi(optarg);
@@ -322,10 +331,12 @@ int main(int argc, char **argv)
 		}
 	}
 
-	printf("#main : %d\n", getpid());
-	printf("#forks: %d\n", nforks);
-	printf("#steps: %d\n", nsteps);
-	printf("\n");
+	if (!quiet) {
+		printf("#main : %d\n", getpid());
+		printf("#forks: %d\n", nforks);
+		printf("#steps: %d\n", nsteps);
+		printf("\n");
+	}
 
 	for (i = 0; i < nforks; i++) {
 		child = fork();
-- 
2.30.1


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

* [PATCH rt-tests v2 14/14] ssdd: Add JSON output feature
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (12 preceding siblings ...)
  2021-03-05  7:34 ` [PATCH rt-tests v2 13/14] ssdd: Add quiet command line option Daniel Wagner
@ 2021-03-05  7:35 ` Daniel Wagner
  2021-03-05  7:41 ` [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
  14 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:35 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users, Daniel Wagner

Write the test results as JSON output to a file. This allows to
simplifies any parsing later on.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/ssdd/ssdd.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/ssdd/ssdd.c b/src/ssdd/ssdd.c
index 50bec824b2e8..3ead14d0127e 100644
--- a/src/ssdd/ssdd.c
+++ b/src/ssdd/ssdd.c
@@ -36,6 +36,8 @@
 #include <sys/wait.h>
 #include <sys/ptrace.h>
 
+#include "rt-utils.h"
+
 /* do_wait return values */
 #define STATE_EXITED	1
 #define STATE_STOPPED	2
@@ -65,10 +67,11 @@ static const char *get_state_name(int state)
 #define unused __attribute__((unused))
 
 static int quiet;
+static char outfile[MAX_PATH];
 
 static int got_sigchld;
 
-enum option_value { OPT_NFORKS=1, OPT_NITERS, OPT_HELP, OPT_QUIET };
+enum option_value { OPT_NFORKS=1, OPT_NITERS, OPT_HELP, OPT_OUTPUT, OPT_QUIET };
 
 static void usage(int error)
 {
@@ -77,6 +80,7 @@ static void usage(int error)
 	       "ssdd <options>\n\n"
 	       "-f       --forks=NUM       number of forks\n"
 	       "-h       --help            print this message\n"
+	       "         --output=FILENAME write final results into FILENAME, JSON formatted\n"
 	       "-q       --quiet           suppress running output\n"
 	       "-i       --iters=NUM       number of iterations\n"
 	       );
@@ -295,12 +299,14 @@ int main(int argc, char **argv)
 
 	setbuf(stdout, NULL);
 
+	rt_init(argc, argv);
 	for (;;) {
 		int option_index = 0;
 
 		static struct option long_options[] = {
 			{"forks",		required_argument,	NULL, OPT_NFORKS},
 			{"help",		no_argument,		NULL, OPT_HELP},
+			{"output",		required_argument,	NULL, OPT_OUTPUT},
 			{"quiet",		no_argument,		NULL, OPT_QUIET},
 			{"iters",		required_argument,	NULL, OPT_NITERS},
 			{NULL, 0, NULL, 0},
@@ -317,6 +323,9 @@ int main(int argc, char **argv)
 		case OPT_HELP:
 			usage(0);
 			break;
+		case OPT_OUTPUT:
+			strncpy(outfile, optarg, strnlen(optarg, MAX_PATH-1));
+			break;
 		case OPT_QUIET:
 		case 'q':
 			quiet = 1;
@@ -348,6 +357,7 @@ int main(int argc, char **argv)
 			forktests(i);
 	}
 
+	rt_test_start();
 	for (i = 0; i < nforks; i++) {
 		status = do_wait(&wait_pid, &ret_sig);
 		if (status != STATE_EXITED) {
@@ -363,5 +373,9 @@ int main(int argc, char **argv)
 	printf("%s.\n", error ?
 		"One or more tests FAILED" :
 		"All tests PASSED");
+
+	if (strlen(outfile) != 0)
+		rt_write_json(outfile, error, NULL, NULL);
+
 	exit(error);
 }
-- 
2.30.1


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

* Re: [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated
  2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
                   ` (13 preceding siblings ...)
  2021-03-05  7:35 ` [PATCH rt-tests v2 14/14] ssdd: Add JSON output feature Daniel Wagner
@ 2021-03-05  7:41 ` Daniel Wagner
  2021-03-05 15:29   ` John Kacur
  14 siblings, 1 reply; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05  7:41 UTC (permalink / raw)
  To: Clark Williams, John Kacur; +Cc: linux-rt-users

Hi John,

On Fri, Mar 05, 2021 at 08:34:46AM +0100, Daniel Wagner wrote:
> v2:
>   - added 'return_code' to the common section of the JSON output
>   - dropped 'inversion' as we have 'return_code' in pip_stress
>   - dropped 'success' as we have 'return code in ssdd

I am pretty happy with the this version now. That means I don't plan to
change more on the JSON feature. Well, one thing I am still not really
happy is the name '--output'. But as no one had any better idea, let's
keep it as it is. Hopefully no one wants it changed in 2 weeks from now
:)

So if you want to do a release, please go ahead.

Thanks,
Daniel

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

* Re: [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated
  2021-03-05  7:41 ` [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
@ 2021-03-05 15:29   ` John Kacur
  2021-03-05 15:41     ` Daniel Wagner
  0 siblings, 1 reply; 27+ messages in thread
From: John Kacur @ 2021-03-05 15:29 UTC (permalink / raw)
  To: Daniel Wagner; +Cc: Clark Williams, linux-rt-users



On Fri, 5 Mar 2021, Daniel Wagner wrote:

> Hi John,
> 
> On Fri, Mar 05, 2021 at 08:34:46AM +0100, Daniel Wagner wrote:
> > v2:
> >   - added 'return_code' to the common section of the JSON output
> >   - dropped 'inversion' as we have 'return_code' in pip_stress
> >   - dropped 'success' as we have 'return code in ssdd
> 
> I am pretty happy with the this version now. That means I don't plan to
> change more on the JSON feature. Well, one thing I am still not really
> happy is the name '--output'. But as no one had any better idea, let's
> keep it as it is. Hopefully no one wants it changed in 2 weeks from now
> :)
> 
> So if you want to do a release, please go ahead.
> 
> Thanks,
> Daniel
> 

How about --json ?
Description, "Optionally output final results to FILENAME in JSON format"

John

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

* Re: [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated
  2021-03-05 15:29   ` John Kacur
@ 2021-03-05 15:41     ` Daniel Wagner
  2021-03-05 15:51       ` John Kacur
  0 siblings, 1 reply; 27+ messages in thread
From: Daniel Wagner @ 2021-03-05 15:41 UTC (permalink / raw)
  To: John Kacur; +Cc: Clark Williams, linux-rt-users

On 05.03.21 16:29, John Kacur wrote:
> How about --json ?
> Description, "Optionally output final results to FILENAME in JSON format"

Ah, that reminds me why I opted for output initially. We had the 
discussion to support different output formats. But if we just stick 
with JSON, --json is way better.

What about finishing this series first and then I send the output -> 
json cleanup?


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

* Re: [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated
  2021-03-05 15:41     ` Daniel Wagner
@ 2021-03-05 15:51       ` John Kacur
  0 siblings, 0 replies; 27+ messages in thread
From: John Kacur @ 2021-03-05 15:51 UTC (permalink / raw)
  To: Daniel Wagner; +Cc: Clark Williams, linux-rt-users



On Fri, 5 Mar 2021, Daniel Wagner wrote:

> On 05.03.21 16:29, John Kacur wrote:
> > How about --json ?
> > Description, "Optionally output final results to FILENAME in JSON format"
> 
> Ah, that reminds me why I opted for output initially. We had the discussion to
> support different output formats. But if we just stick with JSON, --json is
> way better.
> 
> What about finishing this series first and then I send the output -> json
> cleanup?
> 
> 

Fair enough.

John

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

* Re: [PATCH rt-tests v2 01/14] cyclictest: Fix printf format specifier
  2021-03-05  7:34 ` [PATCH rt-tests v2 01/14] cyclictest: Fix printf format specifier Daniel Wagner
@ 2021-03-14 22:45   ` John Kacur
  2021-03-15  8:57     ` Daniel Wagner
  0 siblings, 1 reply; 27+ messages in thread
From: John Kacur @ 2021-03-14 22:45 UTC (permalink / raw)
  To: Daniel Wagner; +Cc: Clark Williams, linux-rt-users



On Fri, 5 Mar 2021, Daniel Wagner wrote:

> The fields are not uint64 just longs, update the printf format
> specifiers.
> 
> Signed-off-by: Daniel Wagner <dwagner@suse.de>
> ---
>  src/cyclictest/cyclictest.c | 9 ++++-----
>  1 file changed, 4 insertions(+), 5 deletions(-)
> 
> diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
> index 157047837259..c43dd7cbbd64 100644
> --- a/src/cyclictest/cyclictest.c
> +++ b/src/cyclictest/cyclictest.c
> @@ -11,7 +11,6 @@
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <stdint.h>
> -#include <inttypes.h>
>  #include <stdarg.h>
>  #include <unistd.h>
>  #include <fcntl.h>
> @@ -1751,15 +1750,15 @@ static void write_stats(FILE *f, void *data)
>  			if (s->hist_array[j] == 0)
>  				continue;
>  			fprintf(f, "%s", comma ? ",\n" : "\n");
> -			fprintf(f, "        \"%u\": %" PRIu64, j, s->hist_array[j]);
> +			fprintf(f, "        \"%u\": %ld", j, s->hist_array[j]);
>  			comma = 1;
>  		}
>  		if (comma)
>  			fprintf(f, "\n");
>  		fprintf(f, "      },\n");
> -		fprintf(f, "      \"cycles\": %" PRIu64 ",\n", s->cycles);
> -		fprintf(f, "      \"min\": %" PRIu64 ",\n", s->min);
> -		fprintf(f, "      \"max\": %" PRIu64 ",\n", s->max);
> +		fprintf(f, "      \"cycles\": %ld,\n", s->cycles);
> +		fprintf(f, "      \"min\": %ld,\n", s->min);
> +		fprintf(f, "      \"max\": %ld,\n", s->max);
>  		fprintf(f, "      \"avg\": %.2f,\n", s->avg/s->cycles);
>  		fprintf(f, "      \"cpu\": %d,\n", par[i]->cpu);
>  		fprintf(f, "      \"node\": %d\n", par[i]->node);
> -- 
> 2.30.1
> 
> 

This had already been added before

John

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

* Re: [PATCH rt-tests v2 02/14] cyclicdeadline.c: Fix printf format specifier
  2021-03-05  7:34 ` [PATCH rt-tests v2 02/14] cyclicdeadline.c: " Daniel Wagner
@ 2021-03-14 22:45   ` John Kacur
  0 siblings, 0 replies; 27+ messages in thread
From: John Kacur @ 2021-03-14 22:45 UTC (permalink / raw)
  To: Daniel Wagner; +Cc: Clark Williams, linux-rt-users



On Fri, 5 Mar 2021, Daniel Wagner wrote:

> The fields are not uint64 just longs, update the printf format
> specifiers.
> 
> Signed-off-by: Daniel Wagner <dwagner@suse.de>
> ---
>  src/sched_deadline/cyclicdeadline.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c
> index 33bac8cda898..d7aa9bb5d269 100644
> --- a/src/sched_deadline/cyclicdeadline.c
> +++ b/src/sched_deadline/cyclicdeadline.c
> @@ -18,7 +18,6 @@
>  #include <errno.h>
>  #include <signal.h>
>  #include <getopt.h>
> -#include <inttypes.h>
>  
>  #include <sys/syscall.h>
>  #include <sys/types.h>
> @@ -976,9 +975,9 @@ static void write_stats(FILE *f, void *data)
>  	for (i = 0; i < nr_threads; i++) {
>  		s = &sd[i].stat;
>  		fprintf(f, "    \"%u\": {\n", i);
> -		fprintf(f, "	 \"cycles\": %" PRIu64 ",\n", s->cycles);
> -		fprintf(f, "	 \"min\": %" PRIu64 ",\n", s->min);
> -		fprintf(f, "	 \"max\": %" PRIu64 ",\n", s->max);
> +		fprintf(f, "	 \"cycles\": %ld,\n", s->cycles);
> +		fprintf(f, "	 \"min\": %ld,\n", s->min);
> +		fprintf(f, "	 \"max\": %ld\n", s->max);
>  		fprintf(f, "	 \"avg\": %.2f\n", s->avg/s->cycles);
>  		fprintf(f, "    }%s\n", i == nr_threads - 1 ? "" : ",");
>  	}
> -- 
> 2.30.1
> 
> 

This has also already been added before.

John

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

* Re: [PATCH rt-tests v2 03/14] signaltest: Add missing --output usage info
  2021-03-05  7:34 ` [PATCH rt-tests v2 03/14] signaltest: Add missing --output usage info Daniel Wagner
@ 2021-03-14 22:47   ` John Kacur
  0 siblings, 0 replies; 27+ messages in thread
From: John Kacur @ 2021-03-14 22:47 UTC (permalink / raw)
  To: Daniel Wagner; +Cc: Clark Williams, linux-rt-users



On Fri, 5 Mar 2021, Daniel Wagner wrote:

> Signed-off-by: Daniel Wagner <dwagner@suse.de>
> ---
>  src/signaltest/signaltest.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/src/signaltest/signaltest.c b/src/signaltest/signaltest.c
> index b1a7e1db8302..e2ffc0bb8693 100644
> --- a/src/signaltest/signaltest.c
> +++ b/src/signaltest/signaltest.c
> @@ -189,6 +189,7 @@ static void display_help(int error)
>  		"-h       --help            display usage information\n"
>  		"-l LOOPS --loops=LOOPS     number of loops: default=0(endless)\n"
>  		"-m       --mlockall        lock current and future memory allocations\n"
> +		"         --output=FILENAME write final results into FILENAME, JSON formatted\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"
> -- 
> 2.30.1
> 
> 
    Added missing commit description
    Signed-off-by: John Kacur <jkacur@redhat.com>

Please don't forget to add a short commit description, even if you feel 
that the title explains everything

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

* Re: [PATCH rt-tests v2 04/14] rt-util: Copy command line before getopt_long() is called
  2021-03-05  7:34 ` [PATCH rt-tests v2 04/14] rt-util: Copy command line before getopt_long() is called Daniel Wagner
@ 2021-03-15  5:47   ` John Kacur
  2021-03-15  8:56     ` Daniel Wagner
  0 siblings, 1 reply; 27+ messages in thread
From: John Kacur @ 2021-03-15  5:47 UTC (permalink / raw)
  To: Daniel Wagner; +Cc: Clark Williams, linux-rt-users



On Fri, 5 Mar 2021, Daniel Wagner wrote:

> By default, getopt_long() permutes the contents of argv as it scans,
> so that eventually all the nonoptions are at the end. This is
> confusing in the JSON output, thus copy the command line before we
> call getopt_long().
> 
> Introduce a rt_init() which copies the command line. This makes also
> rt_write_json() function arguments a bit cleaner.
> 
> Signed-off-by: Daniel Wagner <dwagner@suse.de>
> ---
>  src/cyclictest/cyclictest.c           |  3 +-
>  src/include/rt-utils.h                |  7 +++--
>  src/lib/rt-utils.c                    | 45 ++++++++++++---------------
>  src/oslat/oslat.c                     |  5 +--
>  src/pmqtest/pmqtest.c                 |  3 +-
>  src/ptsematest/ptsematest.c           |  3 +-
>  src/rt-migrate-test/rt-migrate-test.c |  3 +-
>  src/sched_deadline/cyclicdeadline.c   |  4 ++-
>  src/signaltest/signaltest.c           |  3 +-
>  src/sigwaittest/sigwaittest.c         |  3 +-
>  src/svsematest/svsematest.c           |  3 +-
>  11 files changed, 44 insertions(+), 38 deletions(-)
> 
> diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
> index c43dd7cbbd64..3f3b91bab53b 100644
> --- a/src/cyclictest/cyclictest.c
> +++ b/src/cyclictest/cyclictest.c
> @@ -1778,6 +1778,7 @@ int main(int argc, char **argv)
>  	int i, ret = -1;
>  	int status;
>  
> +	rt_init(argc, argv);

Why should we call this if we're not using formatted output?

>  	process_options(argc, argv, max_cpus);
>  
>  	if (check_privs())
> @@ -2133,7 +2134,7 @@ int main(int argc, char **argv)
>  		printf("\033[%dB", num_threads + 2);
>  
>  	if (strlen(outfile) != 0)
> -		rt_write_json(outfile, argc, argv, write_stats, NULL);
> +		rt_write_json(outfile, write_stats, NULL);
>  
>  	if (quiet)
>  		quiet = 2;
> diff --git a/src/include/rt-utils.h b/src/include/rt-utils.h
> index 36af92b170df..11d69ea7e49a 100644
> --- a/src/include/rt-utils.h
> +++ b/src/include/rt-utils.h
> @@ -80,8 +80,9 @@ static inline int64_t calctime(struct timespec t)
>  	return time;
>  }
>  
> -void rt_write_json(const char *filename, int argc, char *argv[],
> -		   void (*cb)(FILE *, void *),
> -		   void *data);
> +void rt_init(int argc, char *argv[]);
> +
> +void rt_write_json(const char *filename,
> +		   void (*cb)(FILE *, void *), void *data);
>  
>  #endif	/* __RT_UTILS.H */
> diff --git a/src/lib/rt-utils.c b/src/lib/rt-utils.c
> index 00907c573d6a..9c9d0dee3255 100644
> --- a/src/lib/rt-utils.c
> +++ b/src/lib/rt-utils.c
> @@ -29,12 +29,14 @@
>  #include "rt-error.h"
>  
>  #define  TRACEBUFSIZ  1024
> +#define  MAX_COMMAND_LINE 4096
>  
>  static char debugfileprefix[MAX_PATH];
>  static char *fileprefix;
>  static int trace_fd = -1;
>  static int tracemark_fd = -1;
>  static __thread char tracebuf[TRACEBUFSIZ];
> +static char cmdline[MAX_COMMAND_LINE];

whoa, so we're going to use 4096 even if we're not using formatted output?
I suppose most people won't care, but embedded folks might. We can do 
better. Why not loop through once and calculate the size, and then malloc 
the memory, and only if the person choses the formatted output option.

>  
>  /*
>   * Finds the tracing directory in a mounted debugfs
> @@ -486,40 +488,40 @@ void disable_trace_mark(void)
>  	close_tracemark_fd();
>  }
>  
> -static char *get_cmdline(int argc, char *argv[])
> +void rt_init(int argc, char *argv[])
>  {
> -	char *cmdline;
> +	int offset = 0;
>  	int len, i;
>  
> -	len = 0;
> -	for (i = 0; i < argc; i++)
> -		len += strlen(argv[i]) + 1;
> +	cmdline[0] = '\0';

Couldn't you have done this where you declared it?

>  
> -	cmdline = malloc(len);
> -	if (!cmdline)
> -		err_exit(ENOMEM, "Could not copy cmdline");
> -
> -	memset(cmdline, 0, len);
> +	/*
> +	 * getopt_long() permutes the contents of argv as it scans, so
> +	 * that eventually all the nonoptions are at the end. Make a
> +	 * copy before calling getopt_long().
> +	 */
>  	for (i = 0; i < argc;) {
> -		cmdline = strcat(cmdline, argv[i]);
> +		len = strlen(argv[i]);
> +		if (offset + len + 1 >= MAX_COMMAND_LINE)
> +			break;
> +
> +		strcat(cmdline, argv[i]);
>  		i++;
>  		if (i < argc)

So just because you didn't want to test i < argc -1
you put the i++ here instead of in the for loop where we would expect it?
Looks ugly, and is unnecessary.

> -			cmdline = strcat(cmdline, " ");
> -	}
> +			strcat(cmdline, " ");
>  
> -	return cmdline;
> +		offset += len + 1;


Why are you doing this again, you already did this, you could have stored 
it then. offset is misleading to, the whole thing could look like this

       for (i = 0; i < argc; i++) {
		size += strlen(argv[i]) + 1;
		strcat(cmdline, argv[i]);
		if (i < argc - 1)
			strcat(cmdline, " ");
 	}

Not including looping through it once to determine the size to malloc
that should only happen if the user is using formatted output.


> +	}
>  }
>  
> -void rt_write_json(const char *filename, int argc, char *argv[],
> -		  void (*cb)(FILE *, void *),
> -		  void *data)
> +void rt_write_json(const char *filename,
> +		   void (*cb)(FILE *, void *), void *data)
>  {
>  	unsigned char buf[1];
>  	struct utsname uts;
>  	struct timeval tv;
>  	char tsbuf[64];
>  	struct tm *tm;
> -	char *cmdline;
>  	FILE *f, *s;
>  	time_t t;
>  	size_t n;
> @@ -533,11 +535,6 @@ void rt_write_json(const char *filename, int argc, char *argv[],
>  			err_exit(errno, "Failed to open '%s'\n", filename);
>  	}
>  
> -	cmdline = get_cmdline(argc, argv);
> -	if (!cmdline)
> -		err_exit(ENOMEM, "get_cmdline()");
> -
> -
>  	gettimeofday(&tv, NULL);
>  	t = tv.tv_sec;
>  	tm = localtime(&t);
> @@ -573,8 +570,6 @@ void rt_write_json(const char *filename, int argc, char *argv[],
>  
>  	fprintf(f, "}\n");
>  
> -	free(cmdline);
> -
>  	if (!filename || strcmp("-", filename))
>  		fclose(f);
>  }
> diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c
> index 465a694cdd1d..ac54d05697ef 100644
> --- a/src/oslat/oslat.c
> +++ b/src/oslat/oslat.c
> @@ -796,6 +796,8 @@ int main(int argc, char *argv[])
>  		exit(1);
>  	}
>  
> +	rt_init(argc, argv);
> +
>  	g.app_name = argv[0];
>  	g.rtprio = 0;
>  	g.bucket_size = BUCKET_SIZE;
> @@ -860,8 +862,7 @@ int main(int argc, char *argv[])
>  	write_summary(threads);
>  
>  	if (strlen(g.outfile) != 0)
> -		rt_write_json(g.outfile, argc, argv,
> -			write_summary_json, threads);
> +		rt_write_json(g.outfile, write_summary_json, threads);
>  
>  	if (g.cpu_list) {
>  		free(g.cpu_list);
> diff --git a/src/pmqtest/pmqtest.c b/src/pmqtest/pmqtest.c
> index e1f59836ea07..f96b3d0bf400 100644
> --- a/src/pmqtest/pmqtest.c
> +++ b/src/pmqtest/pmqtest.c
> @@ -502,6 +502,7 @@ int main(int argc, char *argv[])
>  	mqstat.mq_msgsize = 8;
>  	mqstat.mq_flags = 0;
>  
> +	rt_init(argc, argv);
>  	process_options(argc, argv);
>  
>  	if (check_privs())
> @@ -650,7 +651,7 @@ int main(int argc, char *argv[])
>  			.receiver = receiver,
>  			.sender = sender,
>  		};
> -		rt_write_json(outfile, argc, argv, write_stats, &ps);
> +		rt_write_json(outfile, write_stats, &ps);
>  	}
>  
>  nomem:
> diff --git a/src/ptsematest/ptsematest.c b/src/ptsematest/ptsematest.c
> index 2755bfde5210..a32bfc1698f0 100644
> --- a/src/ptsematest/ptsematest.c
> +++ b/src/ptsematest/ptsematest.c
> @@ -401,6 +401,7 @@ int main(int argc, char *argv[])
>  	sigset_t sigset;
>  	struct timespec maindelay;
>  
> +	rt_init(argc, argv);
>  	process_options(argc, argv);
>  
>  	if (check_privs())
> @@ -518,7 +519,7 @@ int main(int argc, char *argv[])
>  			.receiver = receiver,
>  			.sender = sender,
>  		};
> -		rt_write_json(outfile, argc, argv, write_stats, &ps);
> +		rt_write_json(outfile, write_stats, &ps);
>  	}
>  
>  nomem:
> diff --git a/src/rt-migrate-test/rt-migrate-test.c b/src/rt-migrate-test/rt-migrate-test.c
> index 56b7b66ccdf4..cdfbfafb200b 100644
> --- a/src/rt-migrate-test/rt-migrate-test.c
> +++ b/src/rt-migrate-test/rt-migrate-test.c
> @@ -535,6 +535,7 @@ int main (int argc, char **argv)
>  	struct timespec intv;
>  	struct sched_param param;
>  
> +	rt_init(argc, argv);
>  	parse_options(argc, argv);
>  
>  	signal(SIGINT, stop_log);
> @@ -662,7 +663,7 @@ int main (int argc, char **argv)
>  	print_results();
>  
>  	if (strlen(outfile) != 0)
> -		rt_write_json(outfile, argc, argv, write_stats, NULL);
> +		rt_write_json(outfile, write_stats, NULL);
>  
>  	if (stop) {
>  		/*
> diff --git a/src/sched_deadline/cyclicdeadline.c b/src/sched_deadline/cyclicdeadline.c
> index d7aa9bb5d269..e6811838b62d 100644
> --- a/src/sched_deadline/cyclicdeadline.c
> +++ b/src/sched_deadline/cyclicdeadline.c
> @@ -1009,6 +1009,8 @@ int main(int argc, char **argv)
>  	int i;
>  	int c;
>  
> +	rt_init(argc, argv);
> +
>  	cpu_count = sysconf(_SC_NPROCESSORS_CONF);
>  	if (cpu_count < 1)
>  		err_quit("Can not calculate number of CPUS\n");
> @@ -1225,7 +1227,7 @@ int main(int argc, char **argv)
>  	}
>  
>  	if (strlen(outfile) != 0)
> -		rt_write_json(outfile, argc, argv, write_stats, sched_data);
> +		rt_write_json(outfile, write_stats, sched_data);
>  
>  	if (setcpu_buf)
>  		free(setcpu_buf);
> diff --git a/src/signaltest/signaltest.c b/src/signaltest/signaltest.c
> index e2ffc0bb8693..6abf38b7821c 100644
> --- a/src/signaltest/signaltest.c
> +++ b/src/signaltest/signaltest.c
> @@ -414,6 +414,7 @@ int main(int argc, char **argv)
>  	int status, cpu;
>  	int max_cpus = sysconf(_SC_NPROCESSORS_ONLN);
>  
> +	rt_init(argc, argv);
>  	process_options(argc, argv, max_cpus);
>  
>  	if (check_privs())
> @@ -557,7 +558,7 @@ int main(int argc, char **argv)
>  			free(stat[i].values);
>  	}
>  	if (strlen(outfile) != 0)
> -		rt_write_json(outfile, argc, argv, write_stats, par);
> +		rt_write_json(outfile, write_stats, par);
>  
>  	free(stat);
>   outpar:
> diff --git a/src/sigwaittest/sigwaittest.c b/src/sigwaittest/sigwaittest.c
> index 0cdf30a6a769..142419f9e315 100644
> --- a/src/sigwaittest/sigwaittest.c
> +++ b/src/sigwaittest/sigwaittest.c
> @@ -473,6 +473,7 @@ int main(int argc, char *argv[])
>  	char f_opt[14];
>  	struct timespec launchdelay, maindelay;
>  
> +	rt_init(argc, argv);
>  	process_options(argc, argv);
>  
>  	if (check_privs())
> @@ -705,7 +706,7 @@ int main(int argc, char *argv[])
>  			.receiver = receiver,
>  			.sender = sender,
>  		};
> -		rt_write_json(outfile, argc, argv, write_stats, &ps);
> +		rt_write_json(outfile, write_stats, &ps);
>  	}
>  
>  nomem:
> diff --git a/src/svsematest/svsematest.c b/src/svsematest/svsematest.c
> index 23f84bcbd3dc..7c9d21edbab2 100644
> --- a/src/svsematest/svsematest.c
> +++ b/src/svsematest/svsematest.c
> @@ -514,6 +514,7 @@ int main(int argc, char *argv[])
>  	if (myfile == NULL)
>  		myfile = argv[0];
>  
> +	rt_init(argc, argv);
>  	process_options(argc, argv);
>  
>  	if (check_privs())
> @@ -777,7 +778,7 @@ int main(int argc, char *argv[])
>  			.receiver = receiver,
>  			.sender = sender,
>  		};
> -		rt_write_json(outfile, argc, argv, write_stats, &ps);
> +		rt_write_json(outfile, write_stats, &ps);
>  	}
>  
>  nosem:
> -- 
> 2.30.1
> 
> 


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

* Re: [PATCH rt-tests v2 04/14] rt-util: Copy command line before getopt_long() is called
  2021-03-15  5:47   ` John Kacur
@ 2021-03-15  8:56     ` Daniel Wagner
  2021-03-15 14:41       ` John Kacur
  0 siblings, 1 reply; 27+ messages in thread
From: Daniel Wagner @ 2021-03-15  8:56 UTC (permalink / raw)
  To: John Kacur; +Cc: Clark Williams, linux-rt-users

On Mon, Mar 15, 2021 at 01:47:22AM -0400, John Kacur wrote:
> 
> 
> On Fri, 5 Mar 2021, Daniel Wagner wrote:
> 
> > By default, getopt_long() permutes the contents of argv as it scans,
> > so that eventually all the nonoptions are at the end. This is
> > confusing in the JSON output, thus copy the command line before we
> > call getopt_long().
> > 
> > Introduce a rt_init() which copies the command line. This makes also
> > rt_write_json() function arguments a bit cleaner.
> > 
> > Signed-off-by: Daniel Wagner <dwagner@suse.de>
> > ---
> >  src/cyclictest/cyclictest.c           |  3 +-
> >  src/include/rt-utils.h                |  7 +++--
> >  src/lib/rt-utils.c                    | 45 ++++++++++++---------------
> >  src/oslat/oslat.c                     |  5 +--
> >  src/pmqtest/pmqtest.c                 |  3 +-
> >  src/ptsematest/ptsematest.c           |  3 +-
> >  src/rt-migrate-test/rt-migrate-test.c |  3 +-
> >  src/sched_deadline/cyclicdeadline.c   |  4 ++-
> >  src/signaltest/signaltest.c           |  3 +-
> >  src/sigwaittest/sigwaittest.c         |  3 +-
> >  src/svsematest/svsematest.c           |  3 +-
> >  11 files changed, 44 insertions(+), 38 deletions(-)
> > 
> > diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
> > index c43dd7cbbd64..3f3b91bab53b 100644
> > --- a/src/cyclictest/cyclictest.c
> > +++ b/src/cyclictest/cyclictest.c
> > @@ -1778,6 +1778,7 @@ int main(int argc, char **argv)
> >  	int i, ret = -1;
> >  	int status;
> >  
> > +	rt_init(argc, argv);
> 
> Why should we call this if we're not using formatted output?

Yes unfortunately. We only know after we used getopt_long() that we should
have stored argv, kind of chicken-egg situation.

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

* Re: [PATCH rt-tests v2 01/14] cyclictest: Fix printf format specifier
  2021-03-14 22:45   ` John Kacur
@ 2021-03-15  8:57     ` Daniel Wagner
  2021-03-15  8:58       ` Daniel Wagner
  0 siblings, 1 reply; 27+ messages in thread
From: Daniel Wagner @ 2021-03-15  8:57 UTC (permalink / raw)
  To: John Kacur; +Cc: Clark Williams, linux-rt-users

On Sun, Mar 14, 2021 at 06:45:16PM -0400, John Kacur wrote:
> This had already been added before

Okay, I didn't show up when I pulled.

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

* Re: [PATCH rt-tests v2 01/14] cyclictest: Fix printf format specifier
  2021-03-15  8:57     ` Daniel Wagner
@ 2021-03-15  8:58       ` Daniel Wagner
  0 siblings, 0 replies; 27+ messages in thread
From: Daniel Wagner @ 2021-03-15  8:58 UTC (permalink / raw)
  To: John Kacur; +Cc: Clark Williams, linux-rt-users

On Mon, Mar 15, 2021 at 09:57:33AM +0100, Daniel Wagner wrote:
> On Sun, Mar 14, 2021 at 06:45:16PM -0400, John Kacur wrote:
> > This had already been added before
> 
> Okay, I didn't show up when I pulled.

arg, need more coffee: "it didn't..."

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

* Re: [PATCH rt-tests v2 04/14] rt-util: Copy command line before getopt_long() is called
  2021-03-15  8:56     ` Daniel Wagner
@ 2021-03-15 14:41       ` John Kacur
  0 siblings, 0 replies; 27+ messages in thread
From: John Kacur @ 2021-03-15 14:41 UTC (permalink / raw)
  To: Daniel Wagner; +Cc: Clark Williams, linux-rt-users



On Mon, 15 Mar 2021, Daniel Wagner wrote:

> On Mon, Mar 15, 2021 at 01:47:22AM -0400, John Kacur wrote:
> > 
> > 
> > On Fri, 5 Mar 2021, Daniel Wagner wrote:
> > 
> > > By default, getopt_long() permutes the contents of argv as it scans,
> > > so that eventually all the nonoptions are at the end. This is
> > > confusing in the JSON output, thus copy the command line before we
> > > call getopt_long().
> > > 
> > > Introduce a rt_init() which copies the command line. This makes also
> > > rt_write_json() function arguments a bit cleaner.
> > > 
> > > Signed-off-by: Daniel Wagner <dwagner@suse.de>
> > > ---
> > >  src/cyclictest/cyclictest.c           |  3 +-
> > >  src/include/rt-utils.h                |  7 +++--
> > >  src/lib/rt-utils.c                    | 45 ++++++++++++---------------
> > >  src/oslat/oslat.c                     |  5 +--
> > >  src/pmqtest/pmqtest.c                 |  3 +-
> > >  src/ptsematest/ptsematest.c           |  3 +-
> > >  src/rt-migrate-test/rt-migrate-test.c |  3 +-
> > >  src/sched_deadline/cyclicdeadline.c   |  4 ++-
> > >  src/signaltest/signaltest.c           |  3 +-
> > >  src/sigwaittest/sigwaittest.c         |  3 +-
> > >  src/svsematest/svsematest.c           |  3 +-
> > >  11 files changed, 44 insertions(+), 38 deletions(-)
> > > 
> > > diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
> > > index c43dd7cbbd64..3f3b91bab53b 100644
> > > --- a/src/cyclictest/cyclictest.c
> > > +++ b/src/cyclictest/cyclictest.c
> > > @@ -1778,6 +1778,7 @@ int main(int argc, char **argv)
> > >  	int i, ret = -1;
> > >  	int status;
> > >  
> > > +	rt_init(argc, argv);
> > 
> > Why should we call this if we're not using formatted output?
> 
> Yes unfortunately. We only know after we used getopt_long() that we should
> have stored argv, kind of chicken-egg situation.
> 

One more thing, could you please break your patches up into smaller more
manageable sizes?
I would put for example changes to rt-utils in one patch

It might be a pain to then create a separate patch for each test to 
interact with it, but imagine that we get the situation where the changes
don't work well with a particular test, I'd rather just revert the one 
test that revert everything.

Thanks

John

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

end of thread, other threads:[~2021-03-15 14:43 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-05  7:34 [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
2021-03-05  7:34 ` [PATCH rt-tests v2 01/14] cyclictest: Fix printf format specifier Daniel Wagner
2021-03-14 22:45   ` John Kacur
2021-03-15  8:57     ` Daniel Wagner
2021-03-15  8:58       ` Daniel Wagner
2021-03-05  7:34 ` [PATCH rt-tests v2 02/14] cyclicdeadline.c: " Daniel Wagner
2021-03-14 22:45   ` John Kacur
2021-03-05  7:34 ` [PATCH rt-tests v2 03/14] signaltest: Add missing --output usage info Daniel Wagner
2021-03-14 22:47   ` John Kacur
2021-03-05  7:34 ` [PATCH rt-tests v2 04/14] rt-util: Copy command line before getopt_long() is called Daniel Wagner
2021-03-15  5:47   ` John Kacur
2021-03-15  8:56     ` Daniel Wagner
2021-03-15 14:41       ` John Kacur
2021-03-05  7:34 ` [PATCH rt-tests v2 05/14] rt-util: Add start time of test execution for JSON output Daniel Wagner
2021-03-05  7:34 ` [PATCH rt-tests v2 06/14] rt-util: Add return_code to common section of " Daniel Wagner
2021-03-05  7:34 ` [PATCH rt-tests v2 07/14] pip_stress: Move test result output to main Daniel Wagner
2021-03-05  7:34 ` [PATCH rt-tests v2 08/14] pip_stress: Return failure code if test fails Daniel Wagner
2021-03-05  7:34 ` [PATCH rt-tests v2 09/14] pip_stress: Prepare arg parser to accept only long options Daniel Wagner
2021-03-05  7:34 ` [PATCH rt-tests v2 10/14] pip_stress: Add JSON output feature Daniel Wagner
2021-03-05  7:34 ` [PATCH rt-tests v2 11/14] pi_stress: Prepare command line parser for long options only Daniel Wagner
2021-03-05  7:34 ` [PATCH rt-tests v2 12/14] pi_stress: Add JSON output feature Daniel Wagner
2021-03-05  7:34 ` [PATCH rt-tests v2 13/14] ssdd: Add quiet command line option Daniel Wagner
2021-03-05  7:35 ` [PATCH rt-tests v2 14/14] ssdd: Add JSON output feature Daniel Wagner
2021-03-05  7:41 ` [PATCH rt-tests v2 00/14] JSON cleanups and more tests updated Daniel Wagner
2021-03-05 15:29   ` John Kacur
2021-03-05 15:41     ` Daniel Wagner
2021-03-05 15:51       ` John Kacur

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).