diff --git a/SOURCES/Add-ssdd-test-to-the-rt-tests-suite.patch b/SOURCES/Add-ssdd-test-to-the-rt-tests-suite.patch new file mode 100644 index 0000000..ea69217 --- /dev/null +++ b/SOURCES/Add-ssdd-test-to-the-rt-tests-suite.patch @@ -0,0 +1,373 @@ +From 88b17cb724c653391a92be00b48378432a1036a5 Mon Sep 17 00:00:00 2001 +From: Joe Korty +Date: Mon, 14 Jan 2019 17:29:26 +0100 +Subject: [PATCH 1/5] Add ssdd test to the rt-tests suite + +The following program might make a good addition to the rt +test suite. It tests the reliability of PTRACE_SINGLESTEP. +It does by default 10,000 ssteps against a simple, +spinner tracee. Also by default, it spins off ten of these +tracer/tracee pairs, all of which are to run concurrently. + +Starting with 4.13-rt, this test occasionally encounters a +sstep whose waitpid returns a WIFSIGNALED (signal SIGTRAP) +rather than a WIFSTOPPED. This usually happens after +thousands of ssteps have executed. Having multiple +tracer/tracee pairs running dramatically increases the +chances of failure. + +The is what the test output looks like for a good run: + +forktest#0/22872: STARTING +forktest#7/22879: STARTING +forktest#8/22880: STARTING +forktest#6/22878: STARTING +forktest#5/22877: STARTING +forktest#3/22875: STARTING +forktest#4/22876: STARTING +forktest#9/22882: STARTING +forktest#2/22874: STARTING +forktest#1/22873: STARTING +forktest#0/22872: EXITING, no error +forktest#8/22880: EXITING, no error +forktest#3/22875: EXITING, no error +forktest#7/22879: EXITING, no error +forktest#6/22878: EXITING, no error +forktest#5/22877: EXITING, no error +forktest#2/22874: EXITING, no error +forktest#4/22876: EXITING, no error +forktest#9/22882: EXITING, no error +forktest#1/22873: EXITING, no error +All tests PASSED. + +Signed-off-by: Joe Korty +Signed-off-by: John Kacur +--- + src/ssdd/ssdd.c | 315 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 315 insertions(+) + create mode 100644 src/ssdd/ssdd.c + +diff --git a/src/ssdd/ssdd.c b/src/ssdd/ssdd.c +new file mode 100644 +index 000000000000..6d09d54e34e1 +--- /dev/null ++++ b/src/ssdd/ssdd.c +@@ -0,0 +1,315 @@ ++/* ++ * Have a tracer do a bunch of PTRACE_SINGLESTEPs against ++ * a tracee as fast as possible. Create several of these ++ * tracer/tracee pairs and see if they can be made to ++ * interfere with each other. ++ * ++ * Usage: ++ * ssdd nforks niters ++ * Where: ++ * nforks - number of tracer/tracee pairs to fork off. ++ * default 10. ++ * niters - number of PTRACE_SINGLESTEP iterations to ++ * do before declaring success, for each tracer/ ++ * tracee pair set up. Default 10,000. ++ * ++ * The tracer waits on each PTRACE_SINGLESTEP with a waitpid(2) ++ * and checks that waitpid's return values for correctness. ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++/* do_wait return values */ ++#define STATE_EXITED 1 ++#define STATE_STOPPED 2 ++#define STATE_SIGNALED 3 ++#define STATE_UNKNOWN 4 ++#define STATE_ECHILD 5 ++#define STATE_EXITED_TSIG 6 /* exited with termination signal */ ++#define STATE_EXITED_ERRSTAT 7 /* exited with non-zero status */ ++ ++char *state_name[] = { ++ [STATE_EXITED] = "STATE_EXITED", ++ [STATE_STOPPED] = "STATE_STOPPED", ++ [STATE_SIGNALED] = "STATE_SIGNALED", ++ [STATE_UNKNOWN] = "STATE_UNKNOWN", ++ [STATE_ECHILD] = "STATE_ECHILD", ++ [STATE_EXITED_TSIG] = "STATE_EXITED_TSIG", ++ [STATE_EXITED_ERRSTAT] = "STATE_EXITED_ERRSTAT" ++}; ++ ++const char *get_state_name(int state) ++{ ++ if (state < STATE_EXITED || state > STATE_EXITED_ERRSTAT) ++ return "?"; ++ return state_name[state]; ++} ++ ++#define unused __attribute__((unused)) ++ ++static int got_sigchld; ++ ++static int do_wait(pid_t *wait_pid, int *ret_sig) ++{ ++ int status, child_status; ++ ++ *ret_sig = -1; /* initially mark 'nothing returned' */ ++ ++ while (1) { ++ status = waitpid(-1, &child_status, WUNTRACED | __WALL); ++ if (status == -1) { ++ if (errno == EINTR) ++ continue; ++ if (errno == ECHILD) { ++ *wait_pid = (pid_t)0; ++ return STATE_ECHILD; ++ } ++ printf("do_wait/%d: EXITING, ERROR: " ++ "waitpid() returned errno %d\n", ++ getpid(), errno); ++ exit(1); ++ } ++ break; ++ } ++ *wait_pid = (pid_t)status; ++ ++ if (WIFEXITED(child_status)) { ++ if (WIFSIGNALED(child_status)) ++ return STATE_EXITED_TSIG; ++ if (WEXITSTATUS(child_status)) ++ return STATE_EXITED_ERRSTAT; ++ return STATE_EXITED; ++ } ++ if (WIFSTOPPED(child_status)) { ++ *ret_sig = WSTOPSIG(child_status); ++ return STATE_STOPPED; ++ } ++ if (WIFSIGNALED(child_status)) { ++ *ret_sig = WTERMSIG(child_status); ++ return STATE_SIGNALED; ++ } ++ return STATE_UNKNOWN; ++} ++ ++int check_sigchld(void) ++{ ++ int i; ++ /* ++ * The signal is asynchronous so give it some ++ * time to arrive. ++ */ ++ for (i = 0; i < 10 && !got_sigchld; i++) ++ usleep(1000); /* 10 msecs */ ++ for (i = 0; i < 10 && !got_sigchld; i++) ++ usleep(2000); /* 20 + 10 = 30 msecs */ ++ for (i = 0; i < 10 && !got_sigchld; i++) ++ usleep(4000); /* 40 + 30 = 70 msecs */ ++ for (i = 0; i < 10 && !got_sigchld; i++) ++ usleep(8000); /* 80 + 70 = 150 msecs */ ++ for (i = 0; i < 10 && !got_sigchld; i++) ++ usleep(16000); /* 160 + 150 = 310 msecs */ ++ ++ return got_sigchld; ++} ++ ++pid_t parent; ++int nforks = 10; ++int nsteps = 10000; ++ ++static void sigchld(int sig, unused siginfo_t * info, unused void *arg) ++{ ++ got_sigchld = 1; ++} ++ ++static void child_process(void) ++{ ++ unused volatile int i; ++ ++ /* wait for ptrace attach */ ++ usleep(100000); ++ while (1) ++ i = 0; ++} ++ ++static int forktests(int testid) ++{ ++ int i, status, ret_sig; ++ long pstatus; ++ pid_t child, wait_pid; ++ struct sigaction act, oact; ++ ++ parent = getpid(); ++ printf("forktest#%d/%d: STARTING\n", testid, parent); ++ ++ child = fork(); ++ if (child == -1) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "fork returned errno %d\n", testid, parent, errno); ++ exit(1); ++ } ++ if (!child) ++ child_process(); ++ ++ act.sa_sigaction = sigchld; ++ sigemptyset(&act.sa_mask); ++ act.sa_flags = SA_SIGINFO; ++ status = sigaction(SIGCHLD, &act, &oact); ++ if (status) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "sigaction returned %d, errno %d\n", ++ testid, parent, status, errno); ++ exit(1); ++ } ++ ++ /* give both our child and parent time to set things up */ ++ usleep(125000); ++ ++ /* ++ * Attach to the child. ++ */ ++ pstatus = ptrace(PTRACE_ATTACH, child, NULL, NULL); ++ if (pstatus == ~0l) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "attach failed. errno %d\n", ++ testid, getpid(), errno); ++ exit(1); ++ } ++ ++ /* ++ * The attach should cause the child to receive a signal. ++ */ ++ status = do_wait(&wait_pid, &ret_sig); ++ if (wait_pid != child) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "attach: Unexpected wait pid %d\n", ++ testid, getpid(), wait_pid); ++ exit(1); ++ } ++ if (status != STATE_STOPPED) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "attach: wait on PTRACE_ATTACH returned %d " ++ "[%s, wanted STATE_STOPPED], signo %d\n", ++ testid, getpid(), status, get_state_name(status), ++ ret_sig); ++ exit(1); ++ } ++ else if (!check_sigchld()) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "wait on PTRACE_ATTACH saw a SIGCHLD count of %d, should be 1\n", ++ testid, getpid(), got_sigchld); ++ exit(1); ++ } ++ got_sigchld = 0; ++ ++ ++ /* ++ * Generate 'nsteps' PTRACE_SINGLESTEPs, make sure they all actually ++ * step the tracee. ++ */ ++ for (i = 0; i < nsteps; i++) { ++ pstatus = ptrace(PTRACE_SINGLESTEP, child, NULL, NULL); ++ ++ if (pstatus) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "PTRACE_SINGLESTEP #%d: returned status %ld, " ++ "errno %d, signo %d\n", ++ testid, getpid(), i, pstatus, errno, ret_sig); ++ exit(1); ++ } ++ ++ status = do_wait(&wait_pid, &ret_sig); ++ if (wait_pid != child) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "wait on PTRACE_SINGLESTEP #%d: returned wrong pid %d, " ++ "expected %d\n", ++ testid, getpid(), i, wait_pid, child); ++ exit(1); ++ } ++ if (status != STATE_STOPPED) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "wait on PTRACE_SINGLESTEP #%d: wanted STATE_STOPPED, " ++ "saw %s instead (and saw signo %d too)\n", ++ testid, getpid(), i, ++ get_state_name(status), ret_sig); ++ exit(1); ++ } ++ if (ret_sig != SIGTRAP) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "wait on PTRACE_SINGLESTEP #%d: returned signal %d, " ++ "wanted SIGTRAP\n", ++ testid, getpid(), i, ret_sig); ++ exit(1); ++ } ++ if (!check_sigchld()) { ++ printf("forktest#%d/%d: EXITING, ERROR: " ++ "wait on PTRACE_SINGLESTEP #%d: no SIGCHLD seen " ++ "(signal count == 0), signo %d\n", ++ testid, getpid(), i, ret_sig); ++ exit(1); ++ } ++ got_sigchld = 0; ++ } ++ ++ /* 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); ++ exit(0); ++} ++ ++int main(int argc, char **argv) ++{ ++ int i, ret_sig, status; ++ pid_t child = 0, wait_pid; ++ int error = 0; ++ ++ setbuf(stdout, NULL); ++ ++ argc--, argv++; ++ if (argc) { ++ nforks = atoi(*argv); ++ argc--, argv++; ++ if (argc) ++ nsteps = atoi(*argv); ++ } ++ printf("#forks: %d\n", nforks); ++ printf("#steps: %d\n", nsteps); ++ printf("\n"); ++ ++ for (i = 0; i < nforks; i++) { ++ child = fork(); ++ if (child == -1) { ++ printf("main: fork returned errno %d\n", errno); ++ exit(1); ++ } ++ if (!child) ++ forktests(i); ++ } ++ ++ for (i = 0; i < nforks; i++) { ++ status = do_wait(&wait_pid, &ret_sig); ++ if (status != STATE_EXITED) { ++ if (0) printf("main/%d: ERROR: " ++ "forktest#%d unexpected do_wait status %d " ++ "[%s, wanted STATE_EXITED]\n", ++ getpid(), wait_pid, status, ++ get_state_name(status)); ++ error = 1; ++ } ++ } ++ ++ printf("%s.\n", error ? ++ "One or more tests FAILED" : ++ "All tests PASSED"); ++ exit(error); ++} +-- +2.20.1 + diff --git a/SOURCES/cyclictest-Fix-compiler-warning-about-srncpy-output.patch b/SOURCES/cyclictest-Fix-compiler-warning-about-srncpy-output.patch new file mode 100644 index 0000000..c6d3a2a --- /dev/null +++ b/SOURCES/cyclictest-Fix-compiler-warning-about-srncpy-output.patch @@ -0,0 +1,41 @@ +From 2b126beda6e76f89fb95c14bc421bc13a376cf2e Mon Sep 17 00:00:00 2001 +From: Clark Williams +Date: Tue, 19 Feb 2019 16:10:38 +0100 +Subject: [PATCH] cyclictest: Fix compiler warning about srncpy output + truncated + +Fix compiler warning about strncpy output truncated before terminating +nul copying as many bytes from a string as its length + +Signed-off-by: Clark Williams +Signed-off-by: John Kacur +Extracted from a patch from Clark +--- + src/cyclictest/cyclictest.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c +index 68b3836405c1..1bd63fd93dce 100644 +--- a/src/cyclictest/cyclictest.c ++++ b/src/cyclictest/cyclictest.c +@@ -1257,7 +1257,7 @@ static void process_options (int argc, char *argv[], int max_cpus) + case 'F': + case OPT_FIFO: + use_fifo = 1; +- strncpy(fifopath, optarg, strlen(optarg)); ++ strncpy(fifopath, optarg, strnlen(optarg, MAX_PATH-1)); + break; + case 'H': + case OPT_HISTOFALL: +@@ -1267,7 +1267,7 @@ static void process_options (int argc, char *argv[], int max_cpus) + histogram = atoi(optarg); break; + case OPT_HISTFILE: + use_histfile = 1; +- strncpy(histfile, optarg, strlen(optarg)); ++ strncpy(histfile, optarg, strnlen(optarg, MAX_PATH-1)); + break; + case 'i': + case OPT_INTERVAL: +-- +2.20.1 + diff --git a/SOURCES/cyclictest-Make-sure-affinity-is-respected-when-numa.patch b/SOURCES/cyclictest-Make-sure-affinity-is-respected-when-numa.patch new file mode 100644 index 0000000..508a4bc --- /dev/null +++ b/SOURCES/cyclictest-Make-sure-affinity-is-respected-when-numa.patch @@ -0,0 +1,56 @@ +From 966b4eeda61b4c623a5ef423236dc710b31c1532 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Wed, 20 Feb 2019 23:16:34 +0100 +Subject: [PATCH] cyclictest: Make sure affinity is respected when numa is + detected + +Make sure affinity is respected when numa is automatically detected and +when smp is not specified. Don't break the way smp currently works. + +Signed-off-by: John Kacur +--- + src/cyclictest/cyclictest.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c +index 1bd63fd93dce..ed59edefbf97 100644 +--- a/src/cyclictest/cyclictest.c ++++ b/src/cyclictest/cyclictest.c +@@ -1218,7 +1218,7 @@ static void process_options (int argc, char *argv[], int max_cpus) + case 'a': + case OPT_AFFINITY: + option_affinity = 1; +- if (smp || numa) ++ if (smp) + break; + if (optarg != NULL) { + parse_cpumask(optarg, max_cpus); +@@ -1384,8 +1384,10 @@ static void process_options (int argc, char *argv[], int max_cpus) + #ifdef NUMA + if (numa_available() != -1) { + numa = 1; +- num_threads = max_cpus; +- setaffinity = AFFINITY_USEALL; ++ if (setaffinity == AFFINITY_UNSPECIFIED) { ++ num_threads = max_cpus; ++ setaffinity = AFFINITY_USEALL; ++ } + } + #else + warn("cyclictest was not built with the numa option\n"); +@@ -1394,11 +1396,8 @@ static void process_options (int argc, char *argv[], int max_cpus) + } + + if (option_affinity) { +- if (smp) { ++ if (smp) + warn("-a ignored due to smp mode\n"); +- } else if (numa) { +- warn("-a ignored due to numa mode\n"); +- } + } + + if (smi) { +-- +2.20.1 + diff --git a/SOURCES/cyclictest-fix_with_expected_identifier_in_latest.patch b/SOURCES/cyclictest-fix_with_expected_identifier_in_latest.patch new file mode 100644 index 0000000..fb6257c --- /dev/null +++ b/SOURCES/cyclictest-fix_with_expected_identifier_in_latest.patch @@ -0,0 +1,44 @@ +From e1fa2cda6a6cc2e5eb916638e0325b3d334adbe4 Mon Sep 17 00:00:00 2001 +From: Li Xiaoming +Date: Thu, 10 Jan 2019 10:21:59 +0800 +Subject: [PATCH] cyclictest: fix_with_expected_identifier_in_latest + +An error occurred during the build process: +src/cyclictest/cyclictest.c:1396:2: error: expected identifier or '(' before 'if' + if (option_affinity) { + +The expected identifier "}" for "if (option_affinity){" occurs in another place. + +Signed-off-by: Li Xiaoming +Signed-off-by: Zhong Lu + +- Fixed the indentation of the bracket +- Fixed the indentation of the block where NUMA is not defined + +Signed-off-by: John Kacur +--- + src/cyclictest/cyclictest.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c +index 188a202c5171..68b3836405c1 100644 +--- a/src/cyclictest/cyclictest.c ++++ b/src/cyclictest/cyclictest.c +@@ -1386,11 +1386,11 @@ static void process_options (int argc, char *argv[], int max_cpus) + numa = 1; + num_threads = max_cpus; + setaffinity = AFFINITY_USEALL; ++ } + #else +- warn("cyclictest was not built with the numa option\n"); +- numa = 0; ++ warn("cyclictest was not built with the numa option\n"); ++ numa = 0; + #endif +- } + } + + if (option_affinity) { +-- +2.20.1 + diff --git a/SOURCES/hwlatdetect-disable-enable-c-state-transitions.patch b/SOURCES/hwlatdetect-disable-enable-c-state-transitions.patch new file mode 100644 index 0000000..3ae3ec6 --- /dev/null +++ b/SOURCES/hwlatdetect-disable-enable-c-state-transitions.patch @@ -0,0 +1,77 @@ +From ef49ccfab821010319d4ff6b1332fa890889aeac Mon Sep 17 00:00:00 2001 +From: Clark Williams +Date: Mon, 6 May 2019 14:40:46 -0500 +Subject: [PATCH 1/2] hwlatdetect: disable/enable c-state transitions during + detection + +Recent performance tuning problems led me to realize that just running +at fifo:99 and turning off interrupts isn't enough while looking for +BIOS induced latencies. Power savings logic is built into most modern +cpus and so must be disabled while looking for BIOS induced (SMI/NMI) +latencies. + +Use the /dev/cpu_dma_latency mechanism to disable c-state transitions +while running the hardware latency detector. Open the file +/dev/cpu_dma_latency and write a 32-bit zero to it, which will prevent +c-state transitions while the file is open. + +Signed-off-by: Clark Williams +Signed-off-by: John Kacur +--- + src/hwlatdetect/hwlatdetect.py | 20 +++++++++++++++++++- + 1 file changed, 19 insertions(+), 1 deletion(-) + +diff --git a/src/hwlatdetect/hwlatdetect.py b/src/hwlatdetect/hwlatdetect.py +index 2c8f9f160419..368079a158b1 100755 +--- a/src/hwlatdetect/hwlatdetect.py ++++ b/src/hwlatdetect/hwlatdetect.py +@@ -1,6 +1,6 @@ + #!/usr/bin/python3 + +-# (C) 2018 Clark Williams ++# (C) 2018,2019 Clark Williams + # (C) 2015,2016 Clark Williams + # (C) 2009 Clark Williams + # +@@ -213,6 +213,22 @@ class Detector(object): + counts = [ int(x.strip()) for x in p.stdout.readlines()] + return counts + ++ # methods for preventing/enabling c-state transitions ++ # openinging /dev/cpu_dma_latency and writeing a 32-bit zero to that file will prevent ++ # c-state transitions while the file descriptor is open. ++ # use c_states_off() to disable c-state transitions ++ # use c_states_on() to close the file descriptor and re-enable c-states ++ # ++ def c_states_off(self): ++ self.dma_latency_handle = os.open("/dev/cpu_dma_latency", os.O_WRONLY) ++ os.write(self.dma_latency_handle, b'\x00\x00\x00\x00') ++ debug("c-states disabled") ++ ++ def c_states_on(self): ++ if self.dma_latency_handle: ++ os.close(self.dma_latency_handle) ++ debug("c-states enabled") ++ + def cleanup(self): + raise RuntimeError("must override base method 'cleanup'!") + +@@ -235,6 +251,7 @@ class Detector(object): + def start(self): + count = 0 + threshold = int(self.get("threshold")) ++ self.c_states_off() + debug("enabling detector module (threshold: %d)" % threshold) + self.set("enable", 1) + while self.get("enable") == 0: +@@ -258,6 +275,7 @@ class Detector(object): + time.sleep(0.1) + debug("retrying disable of detector module(%d)" % count) + self.set("enable", 0) ++ self.c_states_on() + debug("detector module disabled") + + def detect(self): +-- +2.20.1 + diff --git a/SOURCES/ptsematest-sigwaittest-pmqtest-svsematest-reprot-err.patch b/SOURCES/ptsematest-sigwaittest-pmqtest-svsematest-reprot-err.patch new file mode 100644 index 0000000..9f4da69 --- /dev/null +++ b/SOURCES/ptsematest-sigwaittest-pmqtest-svsematest-reprot-err.patch @@ -0,0 +1,77 @@ +From 40eb214cc9b43f99df3d20b3303b7df1d149b5e2 Mon Sep 17 00:00:00 2001 +From: Qiao Zhao +Date: Thu, 25 Jul 2019 10:49:15 +0800 +Subject: [PATCH] ptsematest, sigwaittest, pmqtest, svsematest reprot error + "Could not access /sys/kernel/debug/tracing/tracing_enabled" + +tracing_enabled was deprecated a long time ago and is no longer +available, use tracing_on instead + +To reproduce + +This patches fixes that + +Signed-off-by: Qiao Zhao +Signed-off-by: John Kacur +--- + src/pmqtest/pmqtest.c | 2 +- + src/ptsematest/ptsematest.c | 2 +- + src/sigwaittest/sigwaittest.c | 2 +- + src/svsematest/svsematest.c | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/pmqtest/pmqtest.c b/src/pmqtest/pmqtest.c +index 2191710961fe..a04fc49872bf 100644 +--- a/src/pmqtest/pmqtest.c ++++ b/src/pmqtest/pmqtest.c +@@ -204,7 +204,7 @@ void *pmqthread(void *param) + char tracing_enabled_file[MAX_PATH]; + + strcpy(tracing_enabled_file, get_debugfileprefix()); +- strcat(tracing_enabled_file, "tracing_enabled"); ++ strcat(tracing_enabled_file, "tracing_on"); + int tracing_enabled = + open(tracing_enabled_file, O_WRONLY); + if (tracing_enabled >= 0) { +diff --git a/src/ptsematest/ptsematest.c b/src/ptsematest/ptsematest.c +index e8a3177b63dd..553759212ac9 100644 +--- a/src/ptsematest/ptsematest.c ++++ b/src/ptsematest/ptsematest.c +@@ -131,7 +131,7 @@ void *semathread(void *param) + char tracing_enabled_file[MAX_PATH]; + + strcpy(tracing_enabled_file, get_debugfileprefix()); +- strcat(tracing_enabled_file, "tracing_enabled"); ++ strcat(tracing_enabled_file, "tracing_on"); + int tracing_enabled = + open(tracing_enabled_file, O_WRONLY); + if (tracing_enabled >= 0) { +diff --git a/src/sigwaittest/sigwaittest.c b/src/sigwaittest/sigwaittest.c +index 4579f903c909..59f28a5babcb 100644 +--- a/src/sigwaittest/sigwaittest.c ++++ b/src/sigwaittest/sigwaittest.c +@@ -179,7 +179,7 @@ void *semathread(void *param) + char tracing_enabled_file[MAX_PATH]; + + strcpy(tracing_enabled_file, get_debugfileprefix()); +- strcat(tracing_enabled_file, "tracing_enabled"); ++ strcat(tracing_enabled_file, "tracing_on"); + int tracing_enabled = + open(tracing_enabled_file, O_WRONLY); + if (tracing_enabled >= 0) { +diff --git a/src/svsematest/svsematest.c b/src/svsematest/svsematest.c +index 01083d13dde6..8f880786ec0f 100644 +--- a/src/svsematest/svsematest.c ++++ b/src/svsematest/svsematest.c +@@ -185,7 +185,7 @@ void *semathread(void *param) + char tracing_enabled_file[MAX_PATH]; + + strcpy(tracing_enabled_file, get_debugfileprefix()); +- strcat(tracing_enabled_file, "tracing_enabled"); ++ strcat(tracing_enabled_file, "tracing_on"); + int tracing_enabled = + open(tracing_enabled_file, O_WRONLY); + if (tracing_enabled >= 0) { +-- +2.20.1 + diff --git a/SOURCES/queuelat-Assume-queuelat-and-queuelat-scripts-in-path.patch b/SOURCES/queuelat-Assume-queuelat-and-queuelat-scripts-in-path.patch new file mode 100644 index 0000000..16b1b28 --- /dev/null +++ b/SOURCES/queuelat-Assume-queuelat-and-queuelat-scripts-in-path.patch @@ -0,0 +1,115 @@ +From 59c7b5e334940fff29ea49aa722d1c43c88a436b Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Tue, 7 May 2019 15:26:38 +0200 +Subject: [PATCH 1/2] queuelat: Assume queuelat and queuelat scripts are in the + path + +Assume queuelat and queuelat scripts are in the path. Don't hardcode +their location. + +Write the temporary data to /usr/tmp/outfile + +Signed-off-by: John Kacur +--- + src/queuelat/determine_maximum_mpps.sh | 35 +++++++++++++------------- + 1 file changed, 17 insertions(+), 18 deletions(-) + +diff --git a/src/queuelat/determine_maximum_mpps.sh b/src/queuelat/determine_maximum_mpps.sh +index cf7a8cab9cc4..cd45454720f7 100755 +--- a/src/queuelat/determine_maximum_mpps.sh ++++ b/src/queuelat/determine_maximum_mpps.sh +@@ -8,6 +8,7 @@ + PREAMBLE="taskset -c 2 chrt -f 1" + MAXLAT="20000" + CYCLES_PER_PACKET="300" ++OUTFILE=/usr/tmp/outfile + + echo "Determining maximum mpps the machine can handle" + echo "Will take a few minutes to determine mpps value" +@@ -16,10 +17,10 @@ echo "And 10 minutes run to confirm the final mpps value is stable" + for mpps in `seq 3 3 50`; do + echo testing $mpps Mpps + +- outfile=`mktemp` +- $PREAMBLE ./queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `sh ./get_cpuinfo_mhz.sh` -p $mpps -t 30 > $outfile ++ OUTFILE=`mktemp` ++ $PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `sh get_cpuinfo_mhz.sh` -p $mpps -t 30 > $OUTFILE + +- exceeded=`grep exceeded $outfile` ++ exceeded=`grep exceeded $OUTFILE` + if [ ! -z "$exceeded" ]; then + echo mpps failed: $mpps + break; +@@ -32,10 +33,10 @@ first_mpps=$(($mpps - 1)) + for mpps in `seq $first_mpps -1 3`; do + echo testing $mpps Mpps + +- outfile=`mktemp` +- $PREAMBLE ./queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `sh ./get_cpuinfo_mhz.sh` -p $mpps -t 30 > $outfile ++ OUTFILE=`mktemp` ++ $PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `sh get_cpuinfo_mhz.sh` -p $mpps -t 30 > $OUTFILE + +- exceeded=`grep exceeded $outfile` ++ exceeded=`grep exceeded $OUTFILE` + if [ -z "$exceeded" ]; then + echo mpps success $mpps + break; +@@ -49,10 +50,10 @@ echo second loop mpps: $mpps + for mpps in `seq $second_mpps 0.3 $first_mpps`; do + echo testing $mpps Mpps + +- outfile=`mktemp` +- $PREAMBLE ./queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `sh ./get_cpuinfo_mhz.sh` -p $mpps -t 30 > $outfile ++ OUTFILE=`mktemp` ++ $PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `sh get_cpuinfo_mhz.sh` -p $mpps -t 30 > $OUTFILE + +- exceeded=`grep exceeded $outfile` ++ exceeded=`grep exceeded $OUTFILE` + if [ ! -z "$exceeded" ]; then + echo mpps failure $mpps + break; +@@ -66,10 +67,10 @@ third_mpps=`echo "$mpps -0.1" | bc` + for mpps in `seq $third_mpps -0.1 3`; do + echo testing $mpps Mpps + +- outfile=`mktemp` +- $PREAMBLE ./queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `sh ./get_cpuinfo_mhz.sh` -p $mpps -t 30 > $outfile ++ OUTFILE=`mktemp` ++ $PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `sh get_cpuinfo_mhz.sh` -p $mpps -t 30 > $OUTFILE + +- exceeded=`grep exceeded $outfile` ++ exceeded=`grep exceeded $OUTFILE` + if [ -z "$exceeded" ]; then + echo mpps success $mpps + break; +@@ -86,8 +87,8 @@ while [ $queuelat_failure == 1 ]; do + echo "$mpps Mpps" + + for i in `seq 1 10`; do +- $PREAMBLE ./queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `./get_cpuinfo_mhz.sh` -p $mpps -t 30 > $outfile +- exceeded=`grep exceeded $outfile` ++ $PREAMBLE ./queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `get_cpuinfo_mhz.sh` -p $mpps -t 30 > $OUTFILE ++ exceeded=`grep exceeded $OUTFILE` + + if [ ! -z "$exceeded" ]; then + echo "mpps failure (run $i) $mpps" +@@ -108,8 +109,8 @@ while [ $queuelat_failure == 1 ]; do + echo -n "Starting 10 minutes run with " + echo "$mpps Mpps" + +- $PREAMBLE ./queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `./get_cpuinfo_mhz.sh` -p $mpps -t 600 > $outfile +- exceeded=`grep exceeded $outfile` ++ $PREAMBLE queuelat -m $MAXLAT -c $CYCLES_PER_PACKET -f `get_cpuinfo_mhz.sh` -p $mpps -t 600 > $OUTFILE ++ exceeded=`grep exceeded $OUTFILE` + + if [ ! -z "$exceeded" ]; then + echo "mpps failure (run $i) $mpps" +@@ -124,5 +125,3 @@ echo Final mpps is: $mpps + + unset queuelat_failure + unset mpps +- +- +-- +2.20.1 + diff --git a/SOURCES/queuelat-Install-queuelat-helper-scripts-from-make.patch b/SOURCES/queuelat-Install-queuelat-helper-scripts-from-make.patch new file mode 100644 index 0000000..8d980a6 --- /dev/null +++ b/SOURCES/queuelat-Install-queuelat-helper-scripts-from-make.patch @@ -0,0 +1,29 @@ +From 38e7eb899ffbf23773f8c396c7195e6af0dad099 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Tue, 7 May 2019 15:47:55 +0200 +Subject: [PATCH 2/2] queuelat: Install queuelat helper scripts from the + rt-tests Makefile + +Install queuelat helper scripts from the rt-tests Makefile + +Signed-off-by: John Kacur +--- + Makefile | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/Makefile b/Makefile +index 16cd2f9bdd03..ea80923918f7 100644 +--- a/Makefile ++++ b/Makefile +@@ -180,6 +180,8 @@ install: all install_hwlatdetect + mkdir -p "$(DESTDIR)$(bindir)" "$(DESTDIR)$(mandir)/man4" + mkdir -p "$(DESTDIR)$(srcdir)" "$(DESTDIR)$(mandir)/man8" + cp $(TARGETS) "$(DESTDIR)$(bindir)" ++ install src/queuelat/get_cpuinfo_mhz.sh "$(DESTDIR)$(bindir)" ++ install src/queuelat/determine_maximum_mpps.sh "${DESTDIR}${bindir}" + gzip -c src/cyclictest/cyclictest.8 >"$(DESTDIR)$(mandir)/man8/cyclictest.8.gz" + gzip -c src/pi_tests/pi_stress.8 >"$(DESTDIR)$(mandir)/man8/pi_stress.8.gz" + gzip -c src/ptsematest/ptsematest.8 >"$(DESTDIR)$(mandir)/man8/ptsematest.8.gz" +-- +2.20.1 + diff --git a/SOURCES/rt-tests-Makefile-ssdd-Incoroporate-ssdd-into-the-rt.patch b/SOURCES/rt-tests-Makefile-ssdd-Incoroporate-ssdd-into-the-rt.patch new file mode 100644 index 0000000..1270dd0 --- /dev/null +++ b/SOURCES/rt-tests-Makefile-ssdd-Incoroporate-ssdd-into-the-rt.patch @@ -0,0 +1,48 @@ +From 524aebc39039e0035a768b423ad66c4d03098a35 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Mon, 14 Jan 2019 21:39:47 +0100 +Subject: [PATCH 2/5] rt-tests: Makefile: ssdd: Incoroporate ssdd into the + rt-tests Makefile + +Incoroporate ssdd into the rt-tests build + +Signed-off-by: John Kacur +--- + Makefile | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index 06f399cc629d..16cd2f9bdd03 100644 +--- a/Makefile ++++ b/Makefile +@@ -16,7 +16,8 @@ sources = cyclictest.c \ + svsematest.c \ + cyclicdeadline.c \ + deadline_test.c \ +- queuelat.c ++ queuelat.c \ ++ ssdd.c + + TARGETS = $(sources:.c=) + LIBS = -lrt -lpthread +@@ -86,6 +87,7 @@ VPATH += src/lib: + VPATH += src/hackbench: + VPATH += src/sched_deadline: + VPATH += src/queuelat: ++VPATH += src/ssdd: + + $(OBJDIR)/%.o: %.c | $(OBJDIR) + $(CC) -D VERSION=$(VERSION) -c $< $(CFLAGS) $(CPPFLAGS) -o $@ +@@ -146,6 +148,9 @@ hackbench: $(OBJDIR)/hackbench.o + queuelat: $(OBJDIR)/queuelat.o $(OBJDIR)/librttest.a + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(RTTESTLIB) + ++ssdd: $(OBJDIR)/ssdd.o $(OBJDIR)/librttest.a ++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(RTTESTLIB) ++ + LIBOBJS =$(addprefix $(OBJDIR)/,error.o rt-get_cpu.o rt-sched.o rt-utils.o) + $(OBJDIR)/librttest.a: $(LIBOBJS) + $(AR) rcs $@ $^ +-- +2.20.1 + diff --git a/SOURCES/rt-tests-hwlatdetect-Code-clean-up.patch b/SOURCES/rt-tests-hwlatdetect-Code-clean-up.patch new file mode 100644 index 0000000..deff24e --- /dev/null +++ b/SOURCES/rt-tests-hwlatdetect-Code-clean-up.patch @@ -0,0 +1,97 @@ +From bbf4d5adf23fa2b81a1cdb92c40c3451376ac672 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Fri, 10 May 2019 15:58:39 +0200 +Subject: [PATCH 2/2] rt-tests: hwlatdetect.py: Code clean-up + +- Remove obsolete from __future__ +- Fix spacing around calls to print, open and brackets +- Fix spacing around assignments + +Signed-off-by: John Kacur +--- + src/hwlatdetect/hwlatdetect.py | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/src/hwlatdetect/hwlatdetect.py b/src/hwlatdetect/hwlatdetect.py +index 368079a158b1..b72bdc3aa930 100755 +--- a/src/hwlatdetect/hwlatdetect.py ++++ b/src/hwlatdetect/hwlatdetect.py +@@ -8,7 +8,7 @@ + # modify it under the terms of the GNU General Public License Version 2 + # as published by the Free Software Foundation. + +-from __future__ import print_function ++ + + import sys + import os +@@ -84,7 +84,7 @@ class DebugFS(object): + try: + val = f.readline() + except OSError as e: +- print ("errno: %s" % e) ++ print("errno: %s" % e) + if e.errno == errno.EAGAIN: + val = None + else: +@@ -159,7 +159,7 @@ class Kmod(object): + return + + # now look for already loaded module +- for l in open ('/proc/modules'): ++ for l in open('/proc/modules'): + field = l.split() + if self.name in field[0]: + self.preloaded = True +@@ -210,7 +210,7 @@ class Detector(object): + if self.have_msr: + p = subprocess.Popen(['/usr/sbin/rdmsr', '-a', '-d', '0x34'], stdout=subprocess.PIPE) + p.wait() +- counts = [ int(x.strip()) for x in p.stdout.readlines()] ++ counts = [int(x.strip()) for x in p.stdout.readlines()] + return counts + + # methods for preventing/enabling c-state transitions +@@ -295,11 +295,11 @@ class Tracer(Detector): + + class Sample(object): + 'private class for tracer sample data' +- __slots__= 'timestamp', 'inner', 'outer', ++ __slots__ = 'timestamp', 'inner', 'outer', + def __init__(self, line): + fields = line.split() + i,o = fields[6].split('/') +- ts=fields[7][3:] ++ ts = fields[7][3:] + self.timestamp = str(ts) + self.inner = int(i) + self.outer = int(o) +@@ -332,14 +332,14 @@ class Tracer(Detector): + self.set('current_tracer', 'hwlat') + + def set(self, field, val): +- path=self.translate(field) ++ path = self.translate(field) + self.debugfs.putval(path, str(val)) + + def get(self, field): + if field == "count": + return len(self.samples) + elif field == "max": +- max=0 ++ max = 0 + for values in self.samples: + s = int(values.largest()) + if s > max: +@@ -435,7 +435,7 @@ class Hwlat(Detector): + + def display(self): + for s in self.samples: +- print (s) ++ print(s) + + def save(self, output=None): + if output: +-- +2.20.1 + diff --git a/SOURCES/rt-tests-ssdd-Add-a-simple-manpage-for-ssdd.patch b/SOURCES/rt-tests-ssdd-Add-a-simple-manpage-for-ssdd.patch new file mode 100644 index 0000000..341299f --- /dev/null +++ b/SOURCES/rt-tests-ssdd-Add-a-simple-manpage-for-ssdd.patch @@ -0,0 +1,65 @@ +From e86709cd38349514dddbef0bf2b43c1d459797d3 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Fri, 14 Jun 2019 15:03:26 +0200 +Subject: [PATCH] rt-tests: ssdd: Add a simple manpage for ssdd + +Add a simple manpage to rt-tests for ssdd, and modify the manpage to +install it + +Signed-off-by: John Kacur +--- + Makefile | 1 + + src/ssdd/ssdd.8 | 29 +++++++++++++++++++++++++++++ + 2 files changed, 30 insertions(+) + create mode 100644 src/ssdd/ssdd.8 + +diff --git a/Makefile b/Makefile +index ea80923918f7..0258fe9b6dfd 100644 +--- a/Makefile ++++ b/Makefile +@@ -194,6 +194,7 @@ install: all install_hwlatdetect + gzip -c src/pi_tests/pip_stress.8 >"$(DESTDIR)$(mandir)/man8/pip_stress.8.gz" + gzip -c src/queuelat/queuelat.8 >"$(DESTDIR)$(mandir)/man8/queuelat.8.gz" + gzip -c src/sched_deadline/deadline_test.8 >"$(DESTDIR)$(mandir)/man8/deadline_test.8.gz" ++ gzip -c src/ssdd/ssdd.8 >"$(DESTDIR)$(mandir)/man8/ssdd.8.gz" + + .PHONY: install_hwlatdetect + install_hwlatdetect: hwlatdetect +diff --git a/src/ssdd/ssdd.8 b/src/ssdd/ssdd.8 +new file mode 100644 +index 000000000000..44638489f0d1 +--- /dev/null ++++ b/src/ssdd/ssdd.8 +@@ -0,0 +1,29 @@ ++.TH SSDD 8 "June 13, 2019" ++.SH NAME ++ssdd \- have a tracer do a bunch of PTRACE_SINGLESTEPs ++.SH SYNOPSIS ++.B ssdd ++.RI "[nforks] [niters]" ++.SH DESCRIPTION ++Have a tracer do a bunch of PTRACE_SINGLESTEPs against ++a tracee as fast as possible. Create several of these ++tracer/tracee pairs and see if they can be made to ++interfere with each other. ++The tracer waits on each PTRACE_SINGLESTEP with a waitpid(2) ++and checks that waitpid's return values for correctness. ++.SH OPTIONS ++.B nforks ++number of tracer/tracee pairs to fork off. ++Default is 10. ++.br ++.TP ++.B niters ++number of PTRACE_SINGLESTEP iterations to ++do before declaring success, for each tracer/ ++tracee pair set up. Default is 10,000. ++ ++.SH AUTHOR ++ssdd was written by Joe Korty ++.PP ++This manual page was written by John Kacur ++ +-- +2.20.1 + diff --git a/SOURCES/ssdd-change-the-written-pid.patch b/SOURCES/ssdd-change-the-written-pid.patch new file mode 100644 index 0000000..7ff2e91 --- /dev/null +++ b/SOURCES/ssdd-change-the-written-pid.patch @@ -0,0 +1,48 @@ +From 153c8171e07d88260b4d40fc7894eca220bbee5b Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 15 Jan 2019 11:32:26 +0100 +Subject: [PATCH 5/5] ssdd: change the written pid + +During debugging it turned out to be helpful to see the parent pid +and mostly the two tasks interact with each other: the tracer and +tracee. +Add this information it can searched for it. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: John Kacur +--- + src/ssdd/ssdd.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/ssdd/ssdd.c b/src/ssdd/ssdd.c +index 68a426266dd9..4e293586526e 100644 +--- a/src/ssdd/ssdd.c ++++ b/src/ssdd/ssdd.c +@@ -144,7 +144,6 @@ static int forktests(int testid) + struct sigaction act, oact; + + parent = getpid(); +- printf("forktest#%d/%d: STARTING\n", testid, parent); + + child = fork(); + if (child == -1) { +@@ -155,6 +154,8 @@ static int forktests(int testid) + if (!child) + child_process(); + ++ printf("forktest#%d/%d/%d: STARTING\n", testid, parent, child); ++ + act.sa_sigaction = sigchld; + sigemptyset(&act.sa_mask); + act.sa_flags = SA_SIGINFO; +@@ -275,6 +276,7 @@ int main(int argc, char **argv) + if (argc) + nsteps = atoi(*argv); + } ++ printf("#main : %d\n", getpid()); + printf("#forks: %d\n", nforks); + printf("#steps: %d\n", nsteps); + printf("\n"); +-- +2.20.1 + diff --git a/SOURCES/ssdd-make-every-function-static.patch b/SOURCES/ssdd-make-every-function-static.patch new file mode 100644 index 0000000..6f9620a --- /dev/null +++ b/SOURCES/ssdd-make-every-function-static.patch @@ -0,0 +1,61 @@ +From c3521e2c81e99078e7d32c43ddbd2287c67ff859 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 15 Jan 2019 11:32:24 +0100 +Subject: [PATCH 3/5] ssdd: make every function static + +Those functions and variables are not used outside of main so they can +be static. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: John Kacur +--- + src/ssdd/ssdd.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/src/ssdd/ssdd.c b/src/ssdd/ssdd.c +index 6d09d54e34e1..9b85dfa9d223 100644 +--- a/src/ssdd/ssdd.c ++++ b/src/ssdd/ssdd.c +@@ -37,7 +37,7 @@ + #define STATE_EXITED_TSIG 6 /* exited with termination signal */ + #define STATE_EXITED_ERRSTAT 7 /* exited with non-zero status */ + +-char *state_name[] = { ++static char *state_name[] = { + [STATE_EXITED] = "STATE_EXITED", + [STATE_STOPPED] = "STATE_STOPPED", + [STATE_SIGNALED] = "STATE_SIGNALED", +@@ -47,7 +47,7 @@ char *state_name[] = { + [STATE_EXITED_ERRSTAT] = "STATE_EXITED_ERRSTAT" + }; + +-const char *get_state_name(int state) ++static const char *get_state_name(int state) + { + if (state < STATE_EXITED || state > STATE_EXITED_ERRSTAT) + return "?"; +@@ -100,7 +100,7 @@ static int do_wait(pid_t *wait_pid, int *ret_sig) + return STATE_UNKNOWN; + } + +-int check_sigchld(void) ++static int check_sigchld(void) + { + int i; + /* +@@ -121,9 +121,9 @@ int check_sigchld(void) + return got_sigchld; + } + +-pid_t parent; +-int nforks = 10; +-int nsteps = 10000; ++static pid_t parent; ++static int nforks = 10; ++static int nsteps = 10000; + + static void sigchld(int sig, unused siginfo_t * info, unused void *arg) + { +-- +2.20.1 + diff --git a/SOURCES/ssdd-remove-sleeps.patch b/SOURCES/ssdd-remove-sleeps.patch new file mode 100644 index 0000000..6db562c --- /dev/null +++ b/SOURCES/ssdd-remove-sleeps.patch @@ -0,0 +1,53 @@ +From b9f812a0c49584d82c37582c7523a5808628b985 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 15 Jan 2019 11:32:25 +0100 +Subject: [PATCH 4/5] ssdd: remove sleeps +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +There two sleep functions which ensure that the forked function sleeps +and does not spin until everything is setup. There is no need for that, +the scheduler will take care of that anyway. Also that sleep may +complete before or after the testcase starts. If it completes afterwards +then the testcase waits to start so… + +Remove the sleep, it does change the outcome of the testcase. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: John Kacur +--- + src/ssdd/ssdd.c | 9 +-------- + 1 file changed, 1 insertion(+), 8 deletions(-) + +diff --git a/src/ssdd/ssdd.c b/src/ssdd/ssdd.c +index 9b85dfa9d223..68a426266dd9 100644 +--- a/src/ssdd/ssdd.c ++++ b/src/ssdd/ssdd.c +@@ -132,12 +132,8 @@ static void sigchld(int sig, unused siginfo_t * info, unused void *arg) + + static void child_process(void) + { +- unused volatile int i; +- +- /* wait for ptrace attach */ +- usleep(100000); + while (1) +- i = 0; ++ ; + } + + static int forktests(int testid) +@@ -170,9 +166,6 @@ static int forktests(int testid) + exit(1); + } + +- /* give both our child and parent time to set things up */ +- usleep(125000); +- + /* + * Attach to the child. + */ +-- +2.20.1 + diff --git a/SPECS/rt-tests.spec b/SPECS/rt-tests.spec index fa808d3..9c11ee6 100644 --- a/SPECS/rt-tests.spec +++ b/SPECS/rt-tests.spec @@ -6,14 +6,14 @@ Name: rt-tests # Numa argument to make: NUMA=1 # Version: 1.3 -Release: 13%{?dist} +Release: 21%{?dist} License: GPLv2 Group: Development/Tools URL: git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git Source0: https://www.kernel.org/pub/linux/utils/rt-tests/%{name}-%{version}.tar.gz Patch1: cyclictest-remove-ftrace-code.patch -Patch2: rt-tests-Makefile-Change-syntax-for-python3.patch +Patch2: rt-tests-Makefile-Change-syntax-for-python3.patch Patch3: Remove-numa-option.patch Patch4: rt-tests-pi_stress-remove-unused-report-options.patch Patch5: rt-tests-pip_stress-Add-an-initial-man-page-for-pip_stress.patch @@ -25,6 +25,20 @@ Patch10: rt-tests-deadline_test-Add-a-manpage.patch Patch11: rt-tests-cyclictest-Remove-numa-from-help.patch Patch12: rt-tests-deadline_test-Add-NULL-check-before-freeing.patch Patch13: queuelat-use-mfence-for-rdtsc-ordering.patch +Patch14: cyclictest-fix_with_expected_identifier_in_latest.patch +Patch15: cyclictest-Fix-compiler-warning-about-srncpy-output.patch +Patch16: cyclictest-Make-sure-affinity-is-respected-when-numa.patch +Patch17: Add-ssdd-test-to-the-rt-tests-suite.patch +Patch18: rt-tests-Makefile-ssdd-Incoroporate-ssdd-into-the-rt.patch +Patch19: ssdd-make-every-function-static.patch +Patch20: ssdd-remove-sleeps.patch +Patch21: ssdd-change-the-written-pid.patch +Patch22: queuelat-Assume-queuelat-and-queuelat-scripts-in-path.patch +Patch23: queuelat-Install-queuelat-helper-scripts-from-make.patch +Patch24: hwlatdetect-disable-enable-c-state-transitions.patch +Patch25: rt-tests-hwlatdetect-Code-clean-up.patch +Patch26: rt-tests-ssdd-Add-a-simple-manpage-for-ssdd.patch +Patch27: ptsematest-sigwaittest-pmqtest-svsematest-reprot-err.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root Obsoletes: cyclictest signaltest pi_tests @@ -52,6 +66,20 @@ latency. It also tests the functioning of priority-inheritance mutexes. %patch11 -p1 %patch12 -p1 %patch13 -p1 +%patch14 -p1 +%patch15 -p1 +%patch16 -p1 +%patch17 -p1 +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 +%patch21 -p1 +%patch22 -p1 +%patch23 -p1 +%patch24 -p1 +%patch25 -p1 +%patch26 -p1 +%patch27 -p1 %build make NUMA=1 HAVE_PARSE_CPUSTRING_ALL=1 @@ -83,6 +111,9 @@ rm -rf $RPM_BUILD_ROOT /usr/bin/cyclicdeadline /usr/bin/deadline_test /usr/bin/queuelat +/usr/bin/ssdd +/usr/bin/determine_maximum_mpps.sh +/usr/bin/get_cpuinfo_mhz.sh %doc /usr/share/man/man8/cyclictest.8.gz /usr/share/man/man8/hackbench.8.gz @@ -97,8 +128,35 @@ rm -rf $RPM_BUILD_ROOT /usr/share/man/man8/pip_stress.8.gz /usr/share/man/man8/queuelat.8.gz /usr/share/man/man8/deadline_test.8.gz +/usr/share/man/man8/ssdd.8.gz %changelog +* Wed Jul 31 2019 John Kacur - 1.3-21 +- Fix problem when tests use tracing_enabled which is no longer supported +Resolves: rhbz#1731336 + +* Fri Jun 14 2019 John Kacur - 1.3-20 +- Add a manpage for ssdd +Resolves: rhbz#1718735 + +* Fri May 10 2019 John Kacur - 1.3-19 +- Disable/enable c-state transitions during hwlatdetect run +Resolves: rhbz#1707505 + +* Tue May 07 2019 John Kacur - 1.3-18 +- Install queuelat scripts +Resolves: rhbz#1686494 + +* Thu Apr 25 2019 John Kacur - 1.3-17 +- Add ssdd test to the rt-tests suite +Resolves: rhbz#1666351 + +* Thu Mar 28 2019 John Kacur - 1.3-16 +- cyclictest-Make-sure-affinity-is-respected-when-numa.patch +- cyclictest-Fix-compiler-warning-about-srncpy-output.patch +- cyclictest-fix_with_expected_identifier_in_latest.patch +Resolves: rhbz#1596857 + * Tue Jan 08 2019 John Kacur - 1.3-13 - queuelat: use mfence for rdtsc ordering Resolves: rhbz#1663865 @@ -332,18 +390,18 @@ Uwe Kleine-König (5): John Kacur (6): makefile: Create an rt-tests.tar file using git-archiv makefile: Change VERSION_STRING to VERSIO - Add .tar files to .gitignor + Add .tar files to .gitignor Create a .gitattribute file to specify what files git-archive should ignore pi_stress: Fix possible exit on error without releasing mutex pip_stress: Fix warning: unused variable ‘c’ Alexander Stein (1): cyclictest: Fix long priority help text option -Clark Williams (3): +Clark Williams (3): hwlatdetect: added --watch option to watch output in realtime doc: fix VERSION in release-checklist.tx makefile: fixed release targ - * Tue Jun 09 2015 John Kacur - 0.92-1 + * Tue Jun 09 2015 John Kacur - 0.92-1 Anna-Maria Gleixner (2): cyclictest: Convert the offset of the alignment option to microseconds cyclictest: Align measurement threads to the next full second