From 6242d2d7ca79b09be8e1395d7c1eaf7167df5623 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Mon, 5 Aug 2019 11:30:29 -0400 Subject: [PATCH] import rt-tests-1.3-20.el8 --- .gitignore | 1 + .rt-tests.metadata | 1 + SOURCES/Add-queuelat-manpage.patch | 83 ++ .../Add-ssdd-test-to-the-rt-tests-suite.patch | 373 ++++++++ SOURCES/Remove-numa-option.patch | 93 ++ SOURCES/add-h-option-to-queuelat.patch | 72 ++ ...compiler-warning-about-srncpy-output.patch | 41 + ...sure-affinity-is-respected-when-numa.patch | 56 ++ ...x_with_expected_identifier_in_latest.patch | 44 + SOURCES/cyclictest-remove-ftrace-code.patch | 881 ++++++++++++++++++ ...t-disable-enable-c-state-transitions.patch | 77 ++ ...ueuelat-and-queuelat-scripts-in-path.patch | 115 +++ ...ll-queuelat-helper-scripts-from-make.patch | 29 + ...euelat-use-mfence-for-rdtsc-ordering.patch | 31 + ...s-Makefile-Change-syntax-for-python3.patch | 29 + ...e-ssdd-Incoroporate-ssdd-into-the-rt.patch | 48 + ...all-and-build-of-backfire-and-sendme.patch | 64 ++ ...sts-cyclictest-Remove-numa-from-help.patch | 85 ++ ...e_test-Add-NULL-check-before-freeing.patch | 30 + ...rt-tests-deadline_test-Add-a-manpage.patch | 101 ++ .../rt-tests-hwlatdetect-Code-clean-up.patch | 97 ++ ...s-Modify-makefile-for-queuelat.8-and.patch | 30 + ..._stress-remove-unused-report-options.patch | 32 + ...d-an-initial-man-page-for-pip_stress.patch | 70 ++ ...s-ssdd-Add-a-simple-manpage-for-ssdd.patch | 65 ++ SOURCES/ssdd-change-the-written-pid.patch | 48 + SOURCES/ssdd-make-every-function-static.patch | 61 ++ SOURCES/ssdd-remove-sleeps.patch | 53 ++ SPECS/rt-tests.spec | 764 +++++++++++++++ 29 files changed, 3474 insertions(+) create mode 100644 .gitignore create mode 100644 .rt-tests.metadata create mode 100644 SOURCES/Add-queuelat-manpage.patch create mode 100644 SOURCES/Add-ssdd-test-to-the-rt-tests-suite.patch create mode 100644 SOURCES/Remove-numa-option.patch create mode 100644 SOURCES/add-h-option-to-queuelat.patch create mode 100644 SOURCES/cyclictest-Fix-compiler-warning-about-srncpy-output.patch create mode 100644 SOURCES/cyclictest-Make-sure-affinity-is-respected-when-numa.patch create mode 100644 SOURCES/cyclictest-fix_with_expected_identifier_in_latest.patch create mode 100644 SOURCES/cyclictest-remove-ftrace-code.patch create mode 100644 SOURCES/hwlatdetect-disable-enable-c-state-transitions.patch create mode 100644 SOURCES/queuelat-Assume-queuelat-and-queuelat-scripts-in-path.patch create mode 100644 SOURCES/queuelat-Install-queuelat-helper-scripts-from-make.patch create mode 100644 SOURCES/queuelat-use-mfence-for-rdtsc-ordering.patch create mode 100644 SOURCES/rt-tests-Makefile-Change-syntax-for-python3.patch create mode 100644 SOURCES/rt-tests-Makefile-ssdd-Incoroporate-ssdd-into-the-rt.patch create mode 100644 SOURCES/rt-tests-Remove-install-and-build-of-backfire-and-sendme.patch create mode 100644 SOURCES/rt-tests-cyclictest-Remove-numa-from-help.patch create mode 100644 SOURCES/rt-tests-deadline_test-Add-NULL-check-before-freeing.patch create mode 100644 SOURCES/rt-tests-deadline_test-Add-a-manpage.patch create mode 100644 SOURCES/rt-tests-hwlatdetect-Code-clean-up.patch create mode 100644 SOURCES/rt-tests-manpages-Modify-makefile-for-queuelat.8-and.patch create mode 100644 SOURCES/rt-tests-pi_stress-remove-unused-report-options.patch create mode 100644 SOURCES/rt-tests-pip_stress-Add-an-initial-man-page-for-pip_stress.patch create mode 100644 SOURCES/rt-tests-ssdd-Add-a-simple-manpage-for-ssdd.patch create mode 100644 SOURCES/ssdd-change-the-written-pid.patch create mode 100644 SOURCES/ssdd-make-every-function-static.patch create mode 100644 SOURCES/ssdd-remove-sleeps.patch create mode 100644 SPECS/rt-tests.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..06179b1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/rt-tests-1.3.tar.gz diff --git a/.rt-tests.metadata b/.rt-tests.metadata new file mode 100644 index 0000000..ca835b7 --- /dev/null +++ b/.rt-tests.metadata @@ -0,0 +1 @@ +0df302aeb536bbc4fc64922815bbd2426efb3184 SOURCES/rt-tests-1.3.tar.gz diff --git a/SOURCES/Add-queuelat-manpage.patch b/SOURCES/Add-queuelat-manpage.patch new file mode 100644 index 0000000..bae08c5 --- /dev/null +++ b/SOURCES/Add-queuelat-manpage.patch @@ -0,0 +1,83 @@ +From f234e04e76e24d497754876f5e7c896dc9693f3e Mon Sep 17 00:00:00 2001 +From: Marcelo Tosatti +Date: Tue, 4 Sep 2018 08:56:35 -0300 +Subject: [PATCH 2/2] Add queuelat manpage + +Add a man page for queuelat, with a short introduction +and description for each option. + +Signed-off-by: Marcelo Tosatti +Signed-off-by: John Kacur +--- + src/queuelat/queuelat.8 | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 59 insertions(+) + create mode 100644 src/queuelat/queuelat.8 + +diff --git a/src/queuelat/queuelat.8 b/src/queuelat/queuelat.8 +new file mode 100644 +index 000000000000..d68beb98bff7 +--- /dev/null ++++ b/src/queuelat/queuelat.8 +@@ -0,0 +1,59 @@ ++.\" Hey, EMACS: -*- nroff -*- ++.TH QUEUELAT 8 "Sept 3, 2018" ++.\" Please adjust this date whenever revising the manpage. ++.\" ++.\" Some roff macros, for reference: ++.\" .nh disable hyphenation ++.\" .hy enable hyphenation ++.\" .ad l left justify ++.\" .ad b justify to both left and right margins ++.\" .nf disable filling ++.\" .fi enable filling ++.\" .br insert line break ++.\" .sp insert n+1 empty lines ++.\" for manpage-specific macros, see man(7) ++.SH NAME ++queuelat \- Queue latency test program ++.SH SYNOPSIS ++.B queuelat ++.RI "[\-h] [\-m " max-queue-len "] [\-c " cycles-per-packet "] [\-p " mpps "] [\-f " tsc-freq "] [\-t " timeout "] \ ++ ++.SH DESCRIPTION ++queuelat simulates a network queue checking for latency ++violations in packet processing. ++ ++.SH OPTIONS ++A summary of options is included below. ++.TP ++.B \-h ++Show help ++.br ++.TP ++.B \-m max-queue-len ++Maximum allowed latency, in nanoseconds. If latency to process ++.br ++any packet exceeds this value, the program quits, ++writing ++.br ++a message to the trace buffer. ++.TP ++.B \-c cycles-per-packet ++Estimated number of cycles it takes to process one packet. ++.br ++This value should come from the envisioned packet ++.br ++forwarding application being simulated. ++.TP ++.B \-p mpps ++Million packets per second that arrive for processing. ++.TP ++.B \-f tsc-freq-mhz ++TSC frequency in MHz. ++.TP ++.B \-t timeout ++Timeout in seconds to quit the program. ++ ++ ++.SH AUTHOR ++queuelat was written by Marcelo Tosatti ++.br +-- +2.14.4 + 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/Remove-numa-option.patch b/SOURCES/Remove-numa-option.patch new file mode 100644 index 0000000..23e4d80 --- /dev/null +++ b/SOURCES/Remove-numa-option.patch @@ -0,0 +1,93 @@ +From be3ef7f9d228c3753ba805a9d25ee4dd26171d67 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Tue, 19 Jun 2018 01:38:48 +0200 +Subject: [PATCH] Remove --numa option + +Signed-off-by: John Kacur +--- + src/cyclictest/cyclictest.c | 30 ++++++++++++++---------------- + src/cyclictest/rt_numa.h | 6 ------ + 2 files changed, 14 insertions(+), 22 deletions(-) + +diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c +index 1dce8fc2bb64..484ea7fa3130 100644 +--- a/src/cyclictest/cyclictest.c ++++ b/src/cyclictest/cyclictest.c +@@ -1207,7 +1207,6 @@ static void process_options (int argc, char *argv[], int max_cpus) + {"spike-nodes", required_argument, NULL, OPT_TRIGGER_NODES }, + {"threads", optional_argument, NULL, OPT_THREADS }, + {"unbuffered", no_argument, NULL, OPT_UNBUFFERED }, +- {"numa", no_argument, NULL, OPT_NUMA }, + {"verbose", no_argument, NULL, OPT_VERBOSE }, + {"dbg_cyclictest", no_argument, NULL, OPT_DBGCYCLIC }, + {"policy", required_argument, NULL, OPT_POLICY }, +@@ -1215,7 +1214,7 @@ static void process_options (int argc, char *argv[], int max_cpus) + {"posix_timers", no_argument, NULL, OPT_POSIX_TIMERS }, + {NULL, 0, NULL, 0 }, + }; +- int c = getopt_long(argc, argv, "a::A::b:c:d:D:h:H:i:l:MNo:p:mqrRsSt::uUvD:x", ++ int c = getopt_long(argc, argv, "a::A::b:c:d:D:h:H:i:l:MNo:p:mqrRsSt::uvD:x", + long_options, &option_index); + if (c == -1) + break; +@@ -1350,20 +1349,6 @@ static void process_options (int argc, char *argv[], int max_cpus) + case 'u': + case OPT_UNBUFFERED: + setvbuf(stdout, NULL, _IONBF, 0); break; +- case 'U': +- case OPT_NUMA: /* NUMA testing */ +- numa = 1; /* Turn numa on */ +- if (smp) +- fatal("numa and smp options are mutually exclusive\n"); +- numa_on_and_available(); +-#ifdef NUMA +- num_threads = max_cpus; +- setaffinity = AFFINITY_USEALL; +-#else +- warn("cyclictest was not built with the numa option\n"); +- warn("ignoring --numa or -U\n"); +-#endif +- break; + case 'v': + case OPT_VERBOSE: verbose = 1; break; + case 'x': +@@ -1399,6 +1384,19 @@ static void process_options (int argc, char *argv[], int max_cpus) + } + } + ++ if (!smp) { /* if smp wasn't requested, test for numa automatically */ ++#ifdef NUMA ++ if (numa_available() != -1) { ++ numa = 1; ++ num_threads = max_cpus; ++ setaffinity = AFFINITY_USEALL; ++#else ++ warn("cyclictest was not built with the numa option\n"); ++ numa = 0; ++#endif ++ } ++ } ++ + if (option_affinity) { + if (smp) { + warn("-a ignored due to --smp\n"); +diff --git a/src/cyclictest/rt_numa.h b/src/cyclictest/rt_numa.h +index ec2994314e80..3970e681fe7b 100644 +--- a/src/cyclictest/rt_numa.h ++++ b/src/cyclictest/rt_numa.h +@@ -192,12 +192,6 @@ static inline void rt_bitmask_free(struct bitmask *mask) + + #endif /* LIBNUMA_API_VERSION */ + +-static void numa_on_and_available() +-{ +- if (numa && (numa_available() == -1)) +- fatal("--numa specified and numa functions not available.\n"); +-} +- + #else /* ! NUMA */ + + struct bitmask { +-- +2.14.4 + diff --git a/SOURCES/add-h-option-to-queuelat.patch b/SOURCES/add-h-option-to-queuelat.patch new file mode 100644 index 0000000..2aaaa20 --- /dev/null +++ b/SOURCES/add-h-option-to-queuelat.patch @@ -0,0 +1,72 @@ +From 05a1ceb9b490b2cb0aff2f10c4753849df05dec0 Mon Sep 17 00:00:00 2001 +From: Marcelo Tosatti +Date: Tue, 4 Sep 2018 08:56:34 -0300 +Subject: [PATCH 1/2] add -h option to queuelat + +Add -h (help) option to queuelat, which lists all +options. + +Signed-off-by: Marcelo Tosatti +Signed-off-by: John Kacur +--- + src/queuelat/README | 1 + + src/queuelat/queuelat.c | 17 ++++++++++++++++- + 2 files changed, 17 insertions(+), 1 deletion(-) + +diff --git a/src/queuelat/README b/src/queuelat/README +index 790de3e13c17..4ffdb3753bbd 100644 +--- a/src/queuelat/README ++++ b/src/queuelat/README +@@ -51,6 +51,7 @@ cycles_per_packet: number of cycles to process one packet (int). + mpps(million-packet-per-sec): million packets per second (float). + tsc_freq_mhz: TSC frequency in MHz, as measured by TSC PIT calibration + (search for "Detected XXX MHz processor" in dmesg, and use the integer part). ++timeout: timeout (in seconds). + + How it works + ============ +diff --git a/src/queuelat/queuelat.c b/src/queuelat/queuelat.c +index 8bfed274ccab..2230d04bf391 100644 +--- a/src/queuelat/queuelat.c ++++ b/src/queuelat/queuelat.c +@@ -532,6 +532,18 @@ int calculate_nr_packets_drain_per_block(void) + return nr_packets_drain_per_block; + } + ++ ++void print_help(void) ++{ ++ printf("usage: queuelat [options]\n"); ++ printf("-h show this help menu\n"); ++ printf("-m max-queue-len (maximum latency allowed, in nanoseconds) (int)\n"); ++ printf("-c cycles-per-packet (number of cycles to process one packet (int)\n"); ++ printf("-p million-packet-per-sec (million packets per second) (float)\n"); ++ printf("-f tsc-freq-mhz (TSC frequency in MHz) (float)\n"); ++ printf("-t timeout (timeout, in seconds) (int)\n"); ++} ++ + int main(int argc, char **argv) + { + double tsc_freq_mhz; +@@ -549,7 +561,7 @@ int main(int argc, char **argv) + + opterr = 0; + +- while ((c = getopt (argc, argv, "m:c:p:f:t:q:")) != -1) ++ while ((c = getopt (argc, argv, "m:c:p:f:t:q:h")) != -1) + switch (c) + { + case 'm': +@@ -570,6 +582,9 @@ int main(int argc, char **argv) + case 'q': + qvalue = optarg; + break; ++ case 'h': ++ print_help(); ++ return 0; + case '?': + if (optopt == 'm' || optopt == 'c' || optopt == 'p' || + optopt == 'f' || optopt == 't' || optopt == 'q') +-- +2.14.4 + 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/cyclictest-remove-ftrace-code.patch b/SOURCES/cyclictest-remove-ftrace-code.patch new file mode 100644 index 0000000..30a323f --- /dev/null +++ b/SOURCES/cyclictest-remove-ftrace-code.patch @@ -0,0 +1,881 @@ +From f5ccfbe4d6641e48f56152be135d901dd31cba7e Mon Sep 17 00:00:00 2001 +From: Clark Williams +Date: Tue, 16 Jan 2018 15:37:17 -0600 +Subject: [PATCH 1/3] cyclictest: remove ftrace code + +Remove all the code that manipulates tracing values with the exception +of the breaktrace logic. Cyclictest now presumes that any tracing +will be done by the trace-cmd command and will only *stop* tracing +if the breaktrace value is hit. + +Signed-off-by: Clark Williams +(cherry picked from commit 26838f86d54e3ff74223165cbbcc2d211becdaf2) +Signed-off-by: John Kacur +--- + src/cyclictest/cyclictest.c | 537 +++----------------------------------------- + 1 file changed, 32 insertions(+), 505 deletions(-) + +diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c +index 8d9ec80fc239..1dce8fc2bb64 100644 +--- a/src/cyclictest/cyclictest.c ++++ b/src/cyclictest/cyclictest.c +@@ -118,23 +118,8 @@ extern int clock_nanosleep(clockid_t __clock_id, int __flags, + #define MSR_SMI_COUNT 0x00000034 + #define MSR_SMI_COUNT_MASK 0xFFFFFFFF + +-int enable_events; +- + static char *policyname(int policy); + +-enum { +- NOTRACE, +- CTXTSWITCH, +- IRQSOFF, +- PREEMPTOFF, +- PREEMPTIRQSOFF, +- WAKEUP, +- WAKEUPRT, +- LATENCY, +- FUNCTION, +- CUSTOM, +-}; +- + /* Struct to transfer parameters to the thread */ + struct thread_param { + int prio; +@@ -201,14 +186,9 @@ static void trigger_update(struct thread_param *par, int diff, int64_t ts); + + static int shutdown; + static int tracelimit = 0; +-static int notrace = 0; +-static int trace_marker = 0; +-static int ftrace = 0; +-static int kernelversion; + static int verbose = 0; + static int oscope_reduction = 1; + static int lockall = 0; +-static int tracetype = NOTRACE; + static int histogram = 0; + static int histofall = 0; + static int duration = 0; +@@ -243,20 +223,10 @@ static pthread_barrier_t align_barr; + static pthread_barrier_t globalt_barr; + static struct timespec globalt; + +-/* Backup of kernel variables that we modify */ +-static struct kvars { +- char name[KVARNAMELEN]; +- char value[KVALUELEN]; +-} kv[KVARS]; +- + static char *procfileprefix = "/proc/sys/kernel/"; + static char *fileprefix; +-static char tracer[MAX_PATH]; + static char fifopath[MAX_PATH]; + static char histfile[MAX_PATH]; +-static char **traceptr; +-static int traceopt_count; +-static int traceopt_size; + + static struct thread_param **parameters; + static struct thread_stat **statistics; +@@ -311,101 +281,14 @@ static void set_latency_target(void) + } + + +-enum kernelversion { +- KV_NOT_SUPPORTED, +- KV_26_LT18, +- KV_26_LT24, +- KV_26_33, +- KV_30 +-}; +- + enum { + ERROR_GENERAL = -1, + ERROR_NOTFOUND = -2, + }; + +-static char functiontracer[MAX_PATH]; +-static char traceroptions[MAX_PATH]; +- + static int trace_fd = -1; + static int tracemark_fd = -1; + +-static int kernvar(int mode, const char *name, char *value, size_t sizeofvalue) +-{ +- char filename[128]; +- int retval = 1; +- int path; +- size_t len_prefix = strlen(fileprefix), len_name = strlen(name); +- +- if (len_prefix + len_name + 1 > sizeof(filename)) { +- errno = ENOMEM; +- return 1; +- } +- +- memcpy(filename, fileprefix, len_prefix); +- memcpy(filename + len_prefix, name, len_name + 1); +- +- path = open(filename, mode); +- if (path >= 0) { +- if (mode == O_RDONLY) { +- int got; +- if ((got = read(path, value, sizeofvalue)) > 0) { +- retval = 0; +- value[got-1] = '\0'; +- } +- } else if (mode == O_WRONLY) { +- if (write(path, value, sizeofvalue) == sizeofvalue) +- retval = 0; +- } +- close(path); +- } +- return retval; +-} +- +-static void setkernvar(const char *name, char *value) +-{ +- int i; +- char oldvalue[KVALUELEN]; +- +- if (kernelversion < KV_26_33) { +- if (kernvar(O_RDONLY, name, oldvalue, sizeof(oldvalue))) +- fprintf(stderr, "could not retrieve %s\n", name); +- else { +- for (i = 0; i < KVARS; i++) { +- if (!strcmp(kv[i].name, name)) +- break; +- if (kv[i].name[0] == '\0') { +- strncpy(kv[i].name, name, +- sizeof(kv[i].name)); +- strncpy(kv[i].value, oldvalue, +- sizeof(kv[i].value)); +- break; +- } +- } +- if (i == KVARS) +- fprintf(stderr, "could not backup %s (%s)\n", +- name, oldvalue); +- } +- } +- if (kernvar(O_WRONLY, name, value, strlen(value))) +- fprintf(stderr, "could not set %s to %s\n", name, value); +- +-} +- +-static void restorekernvars(void) +-{ +- int i; +- +- for (i = 0; i < KVARS; i++) { +- if (kv[i].name[0] != '\0') { +- if (kernvar(O_WRONLY, kv[i].name, kv[i].value, +- strlen(kv[i].value))) +- fprintf(stderr, "could not restore %s to %s\n", +- kv[i].name, kv[i].value); +- } +- } +-} +- + static inline void tsnorm(struct timespec *ts) + { + while (ts->tv_nsec >= NSEC_PER_SEC) { +@@ -422,8 +305,7 @@ static inline int tsgreater(struct timespec *a, struct timespec *b) + + static inline int64_t calcdiff(struct timespec t1, struct timespec t2) + { +- int64_t diff; +- diff = USEC_PER_SEC * (long long)((int) t1.tv_sec - (int) t2.tv_sec); ++ int64_t diff = USEC_PER_SEC * (long long)((int) t1.tv_sec - (int) t2.tv_sec); + diff += ((int) t1.tv_nsec - (int) t2.tv_nsec) / 1000; + return diff; + } +@@ -444,32 +326,13 @@ static inline int64_t calctime(struct timespec t) + return time; + } + +-static void traceopt(char *option) +-{ +- char *ptr; +- if (traceopt_count + 1 > traceopt_size) { +- traceopt_size += 16; +- printf("expanding traceopt buffer to %d entries\n", traceopt_size); +- traceptr = realloc(traceptr, sizeof(char*) * traceopt_size); +- if (traceptr == NULL) +- fatal ("Error allocating space for %d trace options\n", +- traceopt_count+1); +- } +- ptr = malloc(strlen(option)+1); +- if (ptr == NULL) +- fatal("error allocating space for trace option %s\n", option); +- printf("adding traceopt %s\n", option); +- strcpy(ptr, option); +- traceptr[traceopt_count++] = ptr; +-} +- + static int trace_file_exists(char *name) + { +- struct stat sbuf; +- char *tracing_prefix = get_debugfileprefix(); +- char path[MAX_PATH]; +- strcat(strcpy(path, tracing_prefix), name); +- return stat(path, &sbuf) ? 0 : 1; ++ struct stat sbuf; ++ char *tracing_prefix = get_debugfileprefix(); ++ char path[MAX_PATH]; ++ strcat(strcpy(path, tracing_prefix), name); ++ return stat(path, &sbuf) ? 0 : 1; + } + + #define TRACEBUFSIZ 1024 +@@ -483,7 +346,7 @@ static void tracemark(char *fmt, ...) + + /* bail out if we're not tracing */ + /* or if the kernel doesn't support trace_mark */ +- if (tracemark_fd < 0) ++ if (tracemark_fd < 0 || trace_fd < 0) + return; + + va_start(ap, fmt); +@@ -497,45 +360,6 @@ static void tracemark(char *fmt, ...) + write(trace_fd, "0\n", 2); + } + +- +- +-static void tracing(int on) +-{ +- if (notrace) +- return; +- +- if (on) { +- switch (kernelversion) { +- case KV_26_LT18: gettimeofday(0,(struct timezone *)1); break; +- case KV_26_LT24: prctl(0, 1); break; +- case KV_26_33: +- case KV_30: +- write(trace_fd, "1", 1); +- break; +- default: break; +- } +- } else { +- switch (kernelversion) { +- case KV_26_LT18: gettimeofday(0,0); break; +- case KV_26_LT24: prctl(0, 0); break; +- case KV_26_33: +- case KV_30: +- write(trace_fd, "0", 1); +- break; +- default: break; +- } +- } +-} +- +-static int settracer(char *tracer) +-{ +- if (valid_tracer(tracer)) { +- setkernvar("current_tracer", tracer); +- return 0; +- } +- return -1; +-} +- + static void open_tracemark_fd(void) + { + char path[MAX_PATH]; +@@ -557,7 +381,7 @@ static void open_tracemark_fd(void) + * open the tracing_on file so that we can stop the trace + * if we hit a breaktrace threshold + */ +- if (notrace && trace_fd < 0) { ++ if (trace_fd < 0) { + sprintf(path, "%s/%s", fileprefix, "tracing_on"); + if ((trace_fd = open(path, O_WRONLY)) < 0) + warn("unable to open tracing_on file: %s\n", path); +@@ -569,166 +393,19 @@ static void debugfs_prepare(void) + if (mount_debugfs(NULL)) + fatal("could not mount debugfs"); + +- if (kernelversion >= KV_26_33) { +- char testname[MAX_PATH]; +- +- fileprefix = get_debugfileprefix(); +- if (!trace_file_exists("tracing_enabled") && +- !trace_file_exists("tracing_on")) +- warn("tracing_enabled or tracing_on not found\n" +- "debug fs not mounted, " +- "TRACERs not configured?\n", testname); +- } else +- fileprefix = procfileprefix; ++ fileprefix = get_debugfileprefix(); ++ if (!trace_file_exists("tracing_enabled") && ++ !trace_file_exists("tracing_on")) ++ warn("tracing_enabled or tracing_on not found\n" ++ "debug fs not mounted"); + } + + static void enable_trace_mark(void) + { +- if (!trace_marker) +- return; +- +- if (!tracelimit) +- fatal("--tracemark requires -b\n"); +- + debugfs_prepare(); + open_tracemark_fd(); + } + +-static void setup_tracer(void) +-{ +- if (!tracelimit || notrace) +- return; +- +- debugfs_prepare(); +- +- if (kernelversion >= KV_26_33) { +- int ret; +- +- if (trace_file_exists("tracing_enabled") && +- !trace_file_exists("tracing_on")) +- setkernvar("tracing_enabled", "1"); +- +- /* ftrace_enabled is a sysctl variable */ +- /* turn it on if you're doing anything but nop or event tracing */ +- +- fileprefix = procfileprefix; +- if (tracetype) +- setkernvar("ftrace_enabled", "1"); +- else +- setkernvar("ftrace_enabled", "0"); +- fileprefix = get_debugfileprefix(); +- +- /* +- * Set default tracer to nop. +- * this also has the nice side effect of clearing out +- * old traces. +- */ +- ret = settracer("nop"); +- +- switch (tracetype) { +- case NOTRACE: +- /* no tracer specified, use events */ +- enable_events = 1; +- break; +- case FUNCTION: +- ret = settracer("function"); +- break; +- case IRQSOFF: +- ret = settracer("irqsoff"); +- break; +- case PREEMPTOFF: +- ret = settracer("preemptoff"); +- break; +- case PREEMPTIRQSOFF: +- ret = settracer("preemptirqsoff"); +- break; +- case CTXTSWITCH: +- if (valid_tracer("sched_switch")) +- ret = settracer("sched_switch"); +- else { +- if ((ret = event_enable("sched/sched_wakeup"))) +- break; +- ret = event_enable("sched/sched_switch"); +- } +- break; +- case WAKEUP: +- ret = settracer("wakeup"); +- break; +- case WAKEUPRT: +- ret = settracer("wakeup_rt"); +- break; +- default: +- if (strlen(tracer)) { +- ret = settracer(tracer); +- if (strcmp(tracer, "events") == 0 && ftrace) +- ret = settracer(functiontracer); +- } +- else { +- printf("cyclictest: unknown tracer!\n"); +- ret = 0; +- } +- break; +- } +- +- if (enable_events) +- /* turn on all events */ +- event_enable_all(); +- +- if (ret) +- fprintf(stderr, "Requested tracer '%s' not available\n", tracer); +- +- setkernvar(traceroptions, "print-parent"); +- setkernvar(traceroptions, "latency-format"); +- if (verbose) { +- setkernvar(traceroptions, "sym-offset"); +- setkernvar(traceroptions, "sym-addr"); +- setkernvar(traceroptions, "verbose"); +- } else { +- setkernvar(traceroptions, "nosym-offset"); +- setkernvar(traceroptions, "nosym-addr"); +- setkernvar(traceroptions, "noverbose"); +- } +- if (traceopt_count) { +- int i; +- for (i = 0; i < traceopt_count; i++) +- setkernvar(traceroptions, traceptr[i]); +- } +- setkernvar("tracing_max_latency", "0"); +- if (trace_file_exists("latency_hist")) +- setkernvar("latency_hist/wakeup/reset", "1"); +- +- /* open the tracing on file descriptor */ +- if (trace_fd == -1) { +- char path[MAX_PATH]; +- strcpy(path, fileprefix); +- if (trace_file_exists("tracing_on")) +- strcat(path, "tracing_on"); +- else +- strcat(path, "tracing_enabled"); +- if ((trace_fd = open(path, O_WRONLY)) == -1) +- fatal("unable to open %s for tracing", path); +- } +- +- open_tracemark_fd(); +- } else { +- setkernvar("trace_all_cpus", "1"); +- setkernvar("trace_freerunning", "1"); +- setkernvar("trace_print_on_crash", "0"); +- setkernvar("trace_user_triggered", "1"); +- setkernvar("trace_user_trigger_irq", "-1"); +- setkernvar("trace_verbose", "0"); +- setkernvar("preempt_thresh", "0"); +- setkernvar("wakeup_timing", "0"); +- setkernvar("preempt_max_latency", "0"); +- if (ftrace) +- setkernvar("mcount_enabled", "1"); +- setkernvar("trace_enabled", "1"); +- setkernvar("latency_hist/wakeup_latency/reset", "1"); +- } +- +- tracing(1); +-} +- + /* + * parse an input value as a base10 value followed by an optional + * suffix. The input value is presumed to be in seconds, unless +@@ -987,7 +664,9 @@ static void *timerthread(void *param) + int stopped = 0; + cpu_set_t mask; + pthread_t thread; +- unsigned long smi_now, smi_old; ++ unsigned long smi_now, smi_old = 0; ++ ++ memset(&stop, 0, sizeof(stop)); + + /* if we're running in numa mode, set our memory node */ + if (par->node != -1) +@@ -1195,7 +874,6 @@ static void *timerthread(void *param) + stopped++; + tracemark("hit latency threshold (%llu > %d)", + (unsigned long long) diff, tracelimit); +- tracing(0); + shutdown++; + pthread_mutex_lock(&break_thread_id_lock); + if (break_thread_id == 0) +@@ -1281,18 +959,6 @@ out: + /* Print usage information */ + static void display_help(int error) + { +- char tracers[MAX_PATH]; +- char *prefix; +- +- prefix = get_debugfileprefix(); +- if (prefix[0] == '\0') +- strcpy(tracers, "unavailable (debugfs not mounted)"); +- else { +- fileprefix = prefix; +- if (kernvar(O_RDONLY, "available_tracers", tracers, sizeof(tracers))) +- strcpy(tracers, "none"); +- } +- + printf("cyclictest V %1.2f\n", VERSION); + printf("Usage:\n" + "cyclictest \n\n" +@@ -1309,17 +975,13 @@ static void display_help(int error) + #endif + "-A USEC --aligned=USEC align thread wakeups to a specific offset\n" + "-b USEC --breaktrace=USEC send break trace command when latency > USEC\n" +- "-B --preemptirqs both preempt and irqsoff tracing (used with -b)\n" + "-c CLOCK --clock=CLOCK select clock\n" + " 0 = CLOCK_MONOTONIC (default)\n" + " 1 = CLOCK_REALTIME\n" +- "-C --context context switch tracing (used with -b)\n" + "-d DIST --distance=DIST distance of thread intervals in us, default=500\n" + "-D --duration=TIME specify a length for the test run.\n" + " Append 'm', 'h', or 'd' to specify minutes, hours or days.\n" + " --latency=PM_QOS write PM_QOS to /dev/cpu_dma_latency\n" +- "-E --event event tracing (used with -b)\n" +- "-f --ftrace function trace (when -b is active)\n" + "-F --fifo= create a named pipe at path and write stats to it\n" + "-h --histogram=US dump a latency histogram to stdout after the run\n" + " US is the max latency time to be be tracked in microseconds\n" +@@ -1327,7 +989,6 @@ static void display_help(int error) + "-H --histofall=US same as -h except with an additional summary column\n" + " --histfile= dump the latency histogram to instead of stdout\n" + "-i INTV --interval=INTV base interval of thread in us default=1000\n" +- "-I --irqsoff Irqsoff tracing (used with -b)\n" + "-l LOOPS --loops=LOOPS number of loops: default=0(endless)\n" + " --laptop Save battery when running cyclictest\n" + " This will give you poorer realtime results\n" +@@ -1335,12 +996,9 @@ static void display_help(int error) + "-m --mlockall lock current and future memory allocations\n" + "-M --refresh_on_max delay updating the screen until a new max\n" + " latency is hit. Userful for low bandwidth.\n" +- " --notrace suppress tracing\n" + "-N --nsecs print results in ns instead of us (default us)\n" + "-o RED --oscope=RED oscilloscope mode, reduce verbose output by RED\n" +- "-O TOPT --traceopt=TOPT trace option\n" + "-p PRIO --priority=PRIO priority of highest prio thread\n" +- "-P --preemptoff Preempt off tracing (used with -b)\n" + " --policy=NAME policy of measurement thread, where NAME may be one\n" + " of: other, normal, batch, idle, fifo or rr.\n" + " --priospread spread priority levels starting at specified value\n" +@@ -1366,8 +1024,6 @@ static void display_help(int error) + " without NUM, threads = max_cpus\n" + " without -t default = 1\n" + " --tracemark write a trace mark when -b latency is exceeded\n" +- "-T TRACE --tracer=TRACER set tracing function\n" +- " configured tracers: %s\n" + "-u --unbuffered force unbuffered output for live processing\n" + #ifdef NUMA + "-U --numa Standard NUMA testing (similar to SMP option)\n" +@@ -1375,11 +1031,8 @@ static void display_help(int error) + #endif + "-v --verbose output values on stdout for statistics\n" + " format: n:c:v n=tasknum c=count v=value in us\n" +- "-w --wakeup task wakeup tracing (used with -b)\n" +- "-W --wakeuprt rt task wakeup tracing (used with -b)\n" + " --dbg_cyclictest print info useful for debugging cyclictest\n" +- "-x --posix_timers use POSIX timers instead of clock_nanosleep.\n", +- tracers ++ "-x --posix_timers use POSIX timers instead of clock_nanosleep.\n" + ); + if (error) + exit(EXIT_FAILURE); +@@ -1497,17 +1150,17 @@ static char *policyname(int policy) + + + enum option_values { +- OPT_AFFINITY=1, OPT_NOTRACE, OPT_BREAKTRACE, OPT_PREEMPTIRQ, OPT_CLOCK, +- OPT_CONTEXT, OPT_DISTANCE, OPT_DURATION, OPT_LATENCY, OPT_EVENT, +- OPT_FTRACE, OPT_FIFO, OPT_HISTOGRAM, OPT_HISTOFALL, OPT_HISTFILE, +- OPT_INTERVAL, OPT_IRQSOFF, OPT_LOOPS, OPT_MLOCKALL, OPT_REFRESH, +- OPT_NANOSLEEP, OPT_NSECS, OPT_OSCOPE, OPT_TRACEOPT, OPT_PRIORITY, +- OPT_PREEMPTOFF, OPT_QUIET, OPT_PRIOSPREAD, OPT_RELATIVE, OPT_RESOLUTION, +- OPT_SYSTEM, OPT_SMP, OPT_THREADS, OPT_TRACER, OPT_TRIGGER, +- OPT_TRIGGER_NODES, OPT_UNBUFFERED, OPT_NUMA, OPT_VERBOSE, OPT_WAKEUP, +- OPT_WAKEUPRT, OPT_DBGCYCLIC, OPT_POLICY, OPT_HELP, OPT_NUMOPTS, +- OPT_ALIGNED, OPT_SECALIGNED, OPT_LAPTOP, OPT_SMI, OPT_TRACEMARK, +- OPT_POSIX_TIMERS, ++ OPT_AFFINITY=1, OPT_BREAKTRACE, OPT_CLOCK, ++ OPT_DISTANCE, OPT_DURATION, OPT_LATENCY, ++ OPT_FIFO, OPT_HISTOGRAM, OPT_HISTOFALL, OPT_HISTFILE, ++ OPT_INTERVAL, OPT_LOOPS, OPT_MLOCKALL, OPT_REFRESH, ++ OPT_NANOSLEEP, OPT_NSECS, OPT_OSCOPE, OPT_PRIORITY, ++ OPT_QUIET, OPT_PRIOSPREAD, OPT_RELATIVE, OPT_RESOLUTION, ++ OPT_SYSTEM, OPT_SMP, OPT_THREADS, OPT_TRIGGER, ++ OPT_TRIGGER_NODES, OPT_UNBUFFERED, OPT_NUMA, OPT_VERBOSE, ++ OPT_DBGCYCLIC, OPT_POLICY, OPT_HELP, OPT_NUMOPTS, ++ OPT_ALIGNED, OPT_SECALIGNED, OPT_LAPTOP, OPT_SMI, ++ OPT_TRACEMARK, OPT_POSIX_TIMERS, + }; + + /* Process commandline options */ +@@ -1524,32 +1177,24 @@ static void process_options (int argc, char *argv[], int max_cpus) + */ + static struct option long_options[] = { + {"affinity", optional_argument, NULL, OPT_AFFINITY}, +- {"notrace", no_argument, NULL, OPT_NOTRACE }, + {"aligned", optional_argument, NULL, OPT_ALIGNED }, + {"breaktrace", required_argument, NULL, OPT_BREAKTRACE }, +- {"preemptirqs", no_argument, NULL, OPT_PREEMPTIRQ }, + {"clock", required_argument, NULL, OPT_CLOCK }, +- {"context", no_argument, NULL, OPT_CONTEXT }, + {"distance", required_argument, NULL, OPT_DISTANCE }, + {"duration", required_argument, NULL, OPT_DURATION }, + {"latency", required_argument, NULL, OPT_LATENCY }, +- {"event", no_argument, NULL, OPT_EVENT }, +- {"ftrace", no_argument, NULL, OPT_FTRACE }, + {"fifo", required_argument, NULL, OPT_FIFO }, + {"histogram", required_argument, NULL, OPT_HISTOGRAM }, + {"histofall", required_argument, NULL, OPT_HISTOFALL }, + {"histfile", required_argument, NULL, OPT_HISTFILE }, + {"interval", required_argument, NULL, OPT_INTERVAL }, +- {"irqsoff", no_argument, NULL, OPT_IRQSOFF }, + {"laptop", no_argument, NULL, OPT_LAPTOP }, + {"loops", required_argument, NULL, OPT_LOOPS }, + {"mlockall", no_argument, NULL, OPT_MLOCKALL }, + {"refresh_on_max", no_argument, NULL, OPT_REFRESH }, + {"nsecs", no_argument, NULL, OPT_NSECS }, + {"oscope", required_argument, NULL, OPT_OSCOPE }, +- {"traceopt", required_argument, NULL, OPT_TRACEOPT }, + {"priority", required_argument, NULL, OPT_PRIORITY }, +- {"preemptoff", no_argument, NULL, OPT_PREEMPTOFF }, + {"quiet", no_argument, NULL, OPT_QUIET }, + {"priospread", no_argument, NULL, OPT_PRIOSPREAD }, + {"relative", no_argument, NULL, OPT_RELATIVE }, +@@ -1561,20 +1206,16 @@ static void process_options (int argc, char *argv[], int max_cpus) + {"spike", required_argument, NULL, OPT_TRIGGER }, + {"spike-nodes", required_argument, NULL, OPT_TRIGGER_NODES }, + {"threads", optional_argument, NULL, OPT_THREADS }, +- {"tracemark", no_argument, NULL, OPT_TRACEMARK }, +- {"tracer", required_argument, NULL, OPT_TRACER }, + {"unbuffered", no_argument, NULL, OPT_UNBUFFERED }, + {"numa", no_argument, NULL, OPT_NUMA }, + {"verbose", no_argument, NULL, OPT_VERBOSE }, +- {"wakeup", no_argument, NULL, OPT_WAKEUP }, +- {"wakeuprt", no_argument, NULL, OPT_WAKEUPRT }, + {"dbg_cyclictest", no_argument, NULL, OPT_DBGCYCLIC }, + {"policy", required_argument, NULL, OPT_POLICY }, + {"help", no_argument, NULL, OPT_HELP }, + {"posix_timers", no_argument, NULL, OPT_POSIX_TIMERS }, +- {NULL, 0, NULL, 0} ++ {NULL, 0, NULL, 0 }, + }; +- int c = getopt_long(argc, argv, "a::A::b:Bc:Cd:D:Efh:H:i:Il:MNo:O:p:PmqrRsSt::uUvD:wWT:x", ++ int c = getopt_long(argc, argv, "a::A::b:c:d:D:h:H:i:l:MNo:p:mqrRsSt::uUvD:x", + long_options, &option_index); + if (c == -1) + break; +@@ -1607,15 +1248,10 @@ static void process_options (int argc, char *argv[], int max_cpus) + case 'b': + case OPT_BREAKTRACE: + tracelimit = atoi(optarg); break; +- case 'B': +- case OPT_PREEMPTIRQ: +- tracetype = PREEMPTIRQSOFF; break; + case 'c': + case OPT_CLOCK: + clocksel = atoi(optarg); break; + case 'C': +- case OPT_CONTEXT: +- tracetype = CTXTSWITCH; break; + case 'd': + case OPT_DISTANCE: + distance = atoi(optarg); break; +@@ -1623,17 +1259,11 @@ static void process_options (int argc, char *argv[], int max_cpus) + case OPT_DURATION: + duration = parse_time_string(optarg); break; + case 'E': +- case OPT_EVENT: +- enable_events = 1; break; +- case 'f': +- case OPT_FTRACE: +- tracetype = FUNCTION; ftrace = 1; break; + case 'F': + case OPT_FIFO: + use_fifo = 1; + strncpy(fifopath, optarg, strlen(optarg)); + break; +- + case 'H': + case OPT_HISTOFALL: + histofall = 1; /* fall through */ +@@ -1647,16 +1277,6 @@ static void process_options (int argc, char *argv[], int max_cpus) + case 'i': + case OPT_INTERVAL: + interval = atoi(optarg); break; +- case 'I': +- case OPT_IRQSOFF: +- if (tracetype == PREEMPTOFF) { +- tracetype = PREEMPTIRQSOFF; +- strncpy(tracer, "preemptirqsoff", sizeof(tracer)); +- } else { +- tracetype = IRQSOFF; +- strncpy(tracer, "irqsoff", sizeof(tracer)); +- } +- break; + case 'l': + case OPT_LOOPS: + max_cycles = atoi(optarg); break; +@@ -1672,25 +1292,12 @@ static void process_options (int argc, char *argv[], int max_cpus) + case 'o': + case OPT_OSCOPE: + oscope_reduction = atoi(optarg); break; +- case 'O': +- case OPT_TRACEOPT: +- traceopt(optarg); break; + case 'p': + case OPT_PRIORITY: + priority = atoi(optarg); + if (policy != SCHED_FIFO && policy != SCHED_RR) + policy = SCHED_FIFO; + break; +- case 'P': +- case OPT_PREEMPTOFF: +- if (tracetype == IRQSOFF) { +- tracetype = PREEMPTIRQSOFF; +- strncpy(tracer, "preemptirqsoff", sizeof(tracer)); +- } else { +- tracetype = PREEMPTOFF; +- strncpy(tracer, "preemptoff", sizeof(tracer)); +- } +- break; + case 'q': + case OPT_QUIET: + quiet = 1; break; +@@ -1740,11 +1347,6 @@ static void process_options (int argc, char *argv[], int max_cpus) + if (trigger) + trigger_list_size = atoi(optarg); + break; +- case 'T': +- case OPT_TRACER: +- tracetype = CUSTOM; +- strncpy(tracer, optarg, sizeof(tracer)); +- break; + case 'u': + case OPT_UNBUFFERED: + setvbuf(stdout, NULL, _IONBF, 0); break; +@@ -1764,12 +1366,6 @@ static void process_options (int argc, char *argv[], int max_cpus) + break; + case 'v': + case OPT_VERBOSE: verbose = 1; break; +- case 'w': +- case OPT_WAKEUP: +- tracetype = WAKEUP; break; +- case 'W': +- case OPT_WAKEUPRT: +- tracetype = WAKEUPRT; break; + case 'x': + case OPT_POSIX_TIMERS: + use_nanosleep = MODE_CYCLIC; break; +@@ -1787,8 +1383,6 @@ static void process_options (int argc, char *argv[], int max_cpus) + if (latency_target_value < 0) + latency_target_value = 0; + break; +- case OPT_NOTRACE: +- notrace = 1; break; + case OPT_POLICY: + handlepolicy(optarg); break; + case OPT_DBGCYCLIC: +@@ -1802,9 +1396,6 @@ static void process_options (int argc, char *argv[], int max_cpus) + fatal("--smi is not available on your arch\n"); + #endif + break; +- case OPT_TRACEMARK: +- notrace = 1; /* using --tracemark implies --notrace */ +- trace_marker = 1; break; + } + } + +@@ -1887,43 +1478,6 @@ static void process_options (int argc, char *argv[], int max_cpus) + } + } + +-static int check_kernel(void) +-{ +- struct utsname kname; +- int maj, min, sub, kv, ret; +- +- ret = uname(&kname); +- if (ret) { +- fprintf(stderr, "uname failed: %s. Assuming not 2.6\n", +- strerror(errno)); +- return KV_NOT_SUPPORTED; +- } +- sscanf(kname.release, "%d.%d.%d", &maj, &min, &sub); +- if (maj == 2 && min == 6) { +- if (sub < 18) +- kv = KV_26_LT18; +- else if (sub < 24) +- kv = KV_26_LT24; +- else if (sub < 28) { +- kv = KV_26_33; +- strcpy(functiontracer, "ftrace"); +- strcpy(traceroptions, "iter_ctrl"); +- } else { +- kv = KV_26_33; +- strcpy(functiontracer, "function"); +- strcpy(traceroptions, "trace_options"); +- } +- } else if (maj >= 3) { +- kv = KV_30; +- strcpy(functiontracer, "function"); +- strcpy(traceroptions, "trace_options"); +- +- } else +- kv = KV_NOT_SUPPORTED; +- +- return kv; +-} +- + static int check_timer(void) + { + struct timespec ts; +@@ -1952,8 +1506,6 @@ static void sighand(int sig) + shutdown = 1; + if (refresh_on_max) + pthread_cond_signal(&refresh_on_max_cond); +- if (tracelimit) +- tracing(0); + } + + static void print_tids(struct thread_param *par[], int nthreads) +@@ -2240,14 +1792,8 @@ int main(int argc, char **argv) + /* use the /dev/cpu_dma_latency trick if it's there */ + set_latency_target(); + +- kernelversion = check_kernel(); +- +- if (kernelversion == KV_NOT_SUPPORTED) +- warn("Running on unknown kernel version...YMMV\n"); +- +- setup_tracer(); +- +- enable_trace_mark(); ++ if (tracelimit) ++ enable_trace_mark(); + + if (check_timer()) + warn("High resolution timers not available\n"); +@@ -2597,35 +2143,16 @@ int main(int argc, char **argv) + threadfree(parameters[i], sizeof(struct thread_param), parameters[i]->node); + } + out: +- /* ensure that the tracer is stopped */ +- if (tracelimit) +- tracing(0); +- +- + /* close any tracer file descriptors */ + if (tracemark_fd >= 0) + close(tracemark_fd); + if (trace_fd >= 0) + close(trace_fd); + +- if (enable_events) +- /* turn off all events */ +- event_disable_all(); +- +- /* turn off the function tracer */ +- fileprefix = procfileprefix; +- if (tracetype && !notrace) +- setkernvar("ftrace_enabled", "0"); +- fileprefix = get_debugfileprefix(); +- + /* unlock everything */ + if (lockall) + munlockall(); + +- /* Be a nice program, cleanup */ +- if (kernelversion < KV_26_33) +- restorekernvars(); +- + /* close the latency_target_fd if it's open */ + if (latency_target_fd >= 0) + close(latency_target_fd); +-- +2.14.3 + 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/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/queuelat-use-mfence-for-rdtsc-ordering.patch b/SOURCES/queuelat-use-mfence-for-rdtsc-ordering.patch new file mode 100644 index 0000000..4db3c3e --- /dev/null +++ b/SOURCES/queuelat-use-mfence-for-rdtsc-ordering.patch @@ -0,0 +1,31 @@ +From 5c7ee5d6a0444f785a96811b88e604954a1f1ef4 Mon Sep 17 00:00:00 2001 +From: Marcelo Tosatti +Date: Mon, 7 Jan 2019 15:35:56 -0200 +Subject: [PATCH] queuelat: use mfence for rdtsc ordering + +cpuid is causing register corruption: use mfence instead. + +Signed-off-by: Marcelo Tosatti + +v2: fix signed-off-by line +Signed-off-by: John Kacur +--- + src/queuelat/queuelat.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/queuelat/queuelat.c b/src/queuelat/queuelat.c +index 2230d04bf391..3b291f168768 100644 +--- a/src/queuelat/queuelat.c ++++ b/src/queuelat/queuelat.c +@@ -265,7 +265,7 @@ static inline unsigned long long __rdtscll(void) + { + DECLARE_ARGS(val, low, high); + +- asm volatile("cpuid; rdtsc" : EAX_EDX_RET(val, low, high)); ++ asm volatile("mfence; rdtsc" : EAX_EDX_RET(val, low, high)); + + return EAX_EDX_VAL(val, low, high); + } +-- +2.20.1 + diff --git a/SOURCES/rt-tests-Makefile-Change-syntax-for-python3.patch b/SOURCES/rt-tests-Makefile-Change-syntax-for-python3.patch new file mode 100644 index 0000000..f1902cd --- /dev/null +++ b/SOURCES/rt-tests-Makefile-Change-syntax-for-python3.patch @@ -0,0 +1,29 @@ +From 026f2a31c505b244bbb4a811ba5329225e3f66f1 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Wed, 13 Jun 2018 01:53:11 +0200 +Subject: [PATCH] rt-tests: Makefile: Change syntax for python3 + +When testing for the PYLIB version, we need to explicitly +specify python3 and fix the print syntax + +Signed-off-by: John Kacur +--- + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index cffb255d96d1..8b08385890fe 100644 +--- a/Makefile ++++ b/Makefile +@@ -33,7 +33,7 @@ CFLAGS ?= -Wall -Wno-nonnull + CPPFLAGS += -D_GNU_SOURCE -Isrc/include + LDFLAGS ?= + +-PYLIB ?= $(shell python -c 'import distutils.sysconfig; print distutils.sysconfig.get_python_lib()') ++PYLIB ?= $(shell python3 -c 'import distutils.sysconfig; print (distutils.sysconfig.get_python_lib())') + + ifndef DEBUG + CFLAGS += -O2 -g +-- +2.14.4 + 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-Remove-install-and-build-of-backfire-and-sendme.patch b/SOURCES/rt-tests-Remove-install-and-build-of-backfire-and-sendme.patch new file mode 100644 index 0000000..914e00a --- /dev/null +++ b/SOURCES/rt-tests-Remove-install-and-build-of-backfire-and-sendme.patch @@ -0,0 +1,64 @@ +From 1b68647387067fea4779a1c80d4155be2187ed21 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Mon, 8 Oct 2018 15:11:43 +0200 +Subject: [PATCH] rt-tests: Remove install and build of backfire and sendme + +Leave the source code in place but remove the install and build of +backfire and sendme for now as it is broken + +Signed-off-by: John Kacur +--- + Makefile | 9 --------- + 1 file changed, 9 deletions(-) + +diff --git a/Makefile b/Makefile +index 5447ca9de108..26dd96f0c5fd 100644 +--- a/Makefile ++++ b/Makefile +@@ -11,7 +11,6 @@ sources = cyclictest.c \ + pmqtest.c \ + ptsematest.c \ + rt-migrate-test.c \ +- sendme.c \ + signaltest.c \ + sigwaittest.c \ + svsematest.c \ +@@ -83,7 +82,6 @@ VPATH += src/ptsematest: + VPATH += src/sigwaittest: + VPATH += src/svsematest: + VPATH += src/pmqtest: +-VPATH += src/backfire: + VPATH += src/lib: + VPATH += src/hackbench: + VPATH += src/sched_deadline: +@@ -139,9 +137,6 @@ svsematest: $(OBJDIR)/svsematest.o $(OBJDIR)/librttest.a + pmqtest: $(OBJDIR)/pmqtest.o $(OBJDIR)/librttest.a + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(RTTESTLIB) $(EXTRA_LIBS) + +-sendme: $(OBJDIR)/sendme.o $(OBJDIR)/librttest.a +- $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(RTTESTLIB) $(EXTRA_LIBS) +- + pip_stress: $(OBJDIR)/pip_stress.o $(OBJDIR)/librttest.a + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(RTTESTLIB) + +@@ -180,9 +175,6 @@ install: all install_hwlatdetect + mkdir -p "$(DESTDIR)$(bindir)" "$(DESTDIR)$(mandir)/man4" + mkdir -p "$(DESTDIR)$(srcdir)" "$(DESTDIR)$(mandir)/man8" + cp $(TARGETS) "$(DESTDIR)$(bindir)" +- install -D -m 644 src/backfire/backfire.c "$(DESTDIR)$(srcdir)/backfire/backfire.c" +- install -m 644 src/backfire/Makefile "$(DESTDIR)$(srcdir)/backfire/Makefile" +- gzip -c src/backfire/backfire.4 >"$(DESTDIR)$(mandir)/man4/backfire.4.gz" + 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" +@@ -190,7 +182,6 @@ install: all install_hwlatdetect + gzip -c src/sigwaittest/sigwaittest.8 >"$(DESTDIR)$(mandir)/man8/sigwaittest.8.gz" + gzip -c src/svsematest/svsematest.8 >"$(DESTDIR)$(mandir)/man8/svsematest.8.gz" + gzip -c src/pmqtest/pmqtest.8 >"$(DESTDIR)$(mandir)/man8/pmqtest.8.gz" +- gzip -c src/backfire/sendme.8 >"$(DESTDIR)$(mandir)/man8/sendme.8.gz" + gzip -c src/hackbench/hackbench.8 >"$(DESTDIR)$(mandir)/man8/hackbench.8.gz" + gzip -c src/signaltest/signaltest.8 >"$(DESTDIR)$(mandir)/man8/signaltest.8.gz" + gzip -c src/pi_tests/pip_stress.8 >"$(DESTDIR)$(mandir)/man8/pip_stress.8.gz" +-- +2.14.4 + diff --git a/SOURCES/rt-tests-cyclictest-Remove-numa-from-help.patch b/SOURCES/rt-tests-cyclictest-Remove-numa-from-help.patch new file mode 100644 index 0000000..0bfba17 --- /dev/null +++ b/SOURCES/rt-tests-cyclictest-Remove-numa-from-help.patch @@ -0,0 +1,85 @@ +From 7ea837b01d7e75e403a935bb40b11824f8568d4a Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Mon, 5 Nov 2018 15:11:31 +0100 +Subject: [PATCH] rt-tests: cyclictest: Remove numa from help + +The numa mode is invoked automatically now, and not from the commandline. +Remove it from help and the man page as well. +Clean-up messages to refer to "numa" or "numa" mode instead of "--numa" + +Even though --smp can still be invoked, change messages to "smp mode" +for consistency. + +Signed-off-by: John Kacur +--- + src/cyclictest/cyclictest.8 | 3 --- + src/cyclictest/cyclictest.c | 10 +++------- + src/cyclictest/rt_numa.h | 2 +- + 3 files changed, 4 insertions(+), 11 deletions(-) + +diff --git a/src/cyclictest/cyclictest.8 b/src/cyclictest/cyclictest.8 +index 36edacc3209f..a05d1f4c9d4a 100644 +--- a/src/cyclictest/cyclictest.8 ++++ b/src/cyclictest/cyclictest.8 +@@ -185,9 +185,6 @@ of the trace functions available from /kernel/debug/tracing/ + .B \-u, \-\-unbuffered + force unbuffered output for live processing + .TP +-.B \-U, --numa +-Standard NUMA testing (similar to SMP option) thread data structures allocated from local node. +-.TP + .B \-v, \-\-verbose + Output values on stdout for statistics. This option is used to gather statistical information about the latency distribution. The output is sent to stdout. The output format is: + +diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c +index 8bba9fc63ee3..188a202c5171 100644 +--- a/src/cyclictest/cyclictest.c ++++ b/src/cyclictest/cyclictest.c +@@ -1025,10 +1025,6 @@ static void display_help(int error) + " without -t default = 1\n" + " --tracemark write a trace mark when -b latency is exceeded\n" + "-u --unbuffered force unbuffered output for live processing\n" +-#ifdef NUMA +- "-U --numa Standard NUMA testing (similar to SMP option)\n" +- " thread data structures allocated from local node\n" +-#endif + "-v --verbose output values on stdout for statistics\n" + " format: n:c:v n=tasknum c=count v=value in us\n" + " --dbg_cyclictest print info useful for debugging cyclictest\n" +@@ -1329,7 +1325,7 @@ static void process_options (int argc, char *argv[], int max_cpus) + case 't': + case OPT_THREADS: + if (smp) { +- warn("-t ignored due to --smp\n"); ++ warn("-t ignored due to smp mode\n"); + break; + } + if (optarg != NULL) +@@ -1399,9 +1395,9 @@ static void process_options (int argc, char *argv[], int max_cpus) + + if (option_affinity) { + if (smp) { +- warn("-a ignored due to --smp\n"); ++ warn("-a ignored due to smp mode\n"); + } else if (numa) { +- warn("-a ignored due to --numa\n"); ++ warn("-a ignored due to numa mode\n"); + } + } + +diff --git a/src/cyclictest/rt_numa.h b/src/cyclictest/rt_numa.h +index 3970e681fe7b..e8cd7f481baa 100644 +--- a/src/cyclictest/rt_numa.h ++++ b/src/cyclictest/rt_numa.h +@@ -253,7 +253,7 @@ static inline void rt_bitmask_free(struct bitmask *mask) + static void numa_on_and_available() + { + if (numa) /* NUMA is not defined here */ +- fatal("--numa specified and numa functions not available.\n"); ++ fatal("numa mode and numa functions not available.\n"); + } + + #endif /* NUMA */ +-- +2.14.5 + diff --git a/SOURCES/rt-tests-deadline_test-Add-NULL-check-before-freeing.patch b/SOURCES/rt-tests-deadline_test-Add-NULL-check-before-freeing.patch new file mode 100644 index 0000000..14fb0f8 --- /dev/null +++ b/SOURCES/rt-tests-deadline_test-Add-NULL-check-before-freeing.patch @@ -0,0 +1,30 @@ +From ed58e7ad038f11a8e5f194fb9314ebc791e21b99 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Thu, 15 Nov 2018 13:00:06 +0100 +Subject: [PATCH] rt-tests: deadline_test: Add NULL check before freeing + setcpu_buf + +setcpu_buf doesn't always call malloc, so NULL check it before freeing + +Signed-off-by: John Kacur +--- + src/sched_deadline/deadline_test.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/sched_deadline/deadline_test.c b/src/sched_deadline/deadline_test.c +index 2a63c5f91639..b213c206559c 100644 +--- a/src/sched_deadline/deadline_test.c ++++ b/src/sched_deadline/deadline_test.c +@@ -2092,6 +2092,8 @@ int main (int argc, char **argv) + printf("\n"); + } + +- free(setcpu_buf); ++ if (!setcpu_buf) ++ free(setcpu_buf); ++ + return 0; + } +-- +2.14.5 + diff --git a/SOURCES/rt-tests-deadline_test-Add-a-manpage.patch b/SOURCES/rt-tests-deadline_test-Add-a-manpage.patch new file mode 100644 index 0000000..15cc291 --- /dev/null +++ b/SOURCES/rt-tests-deadline_test-Add-a-manpage.patch @@ -0,0 +1,101 @@ +From 803c33cfe83a8e215bdb4f393f90d1e175f78318 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Fri, 2 Nov 2018 16:16:45 +0100 +Subject: [PATCH] rt-tests: deadline_test: Add a manpage + +Add an initial manpage for deadline_test. +Modify the Makefile to install it too. + +Signed-off-by: John Kacur +--- + Makefile | 1 + + src/sched_deadline/deadline_test.8 | 65 ++++++++++++++++++++++++++++++++++++++ + 2 files changed, 66 insertions(+) + create mode 100644 src/sched_deadline/deadline_test.8 + +diff --git a/Makefile b/Makefile +index 26dd96f0c5fd..06f399cc629d 100644 +--- a/Makefile ++++ b/Makefile +@@ -186,6 +186,7 @@ install: all install_hwlatdetect + gzip -c src/signaltest/signaltest.8 >"$(DESTDIR)$(mandir)/man8/signaltest.8.gz" + 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" + + .PHONY: install_hwlatdetect + install_hwlatdetect: hwlatdetect +diff --git a/src/sched_deadline/deadline_test.8 b/src/sched_deadline/deadline_test.8 +new file mode 100644 +index 000000000000..5dc99c0bfc63 +--- /dev/null ++++ b/src/sched_deadline/deadline_test.8 +@@ -0,0 +1,65 @@ ++.\" Hey, EMACS: -*- nroff -*- ++.TH DEADLINE_TEST 8 "November 1, 2018" ++.\" Please adjust this date whenever revising the manpage. ++.\" ++.\" Some roff macros, for reference: ++.\" .nh disable hyphenation ++.\" .hy enable hyphenation ++.\" .ad l left justify ++.\" .ad b justify to both left and right margins ++.\" .nf disable filling ++.\" .fi enable filling ++.\" .br insert line break ++.\" .sp insert n+1 empty lines ++.\" for manpage-specific macros, see man(7) ++.SH NAME ++deadline_test \- High resolution test program ++.SH DESCRIPTION ++.PP ++This program is used to test the deadline scheduler (SCHED_DEADLINE tasks) ++.SH SYNOPSIS ++.B deadline_test ++.RI "[ \-hb ] [ \-r prio ] [ \-c cpulist ] [ \-i interval ] [ \-p percent ] [ \-P percent ] [ \-t threads ] [ \-s step[us) ]" ++ ++.SH OPTIONS ++.TP ++.B \-h ++Show this help menu ++.br ++.TP ++.B \-b ++Bind on the last cpu. (shortcut for -c ) ++.br ++.TP ++.B \-r prio ++Add an RT task with given prio to stress system ++.br ++.TP ++.B \-c cpulist ++Comma/hyphen separated list of CPUs to run deadline tasks on ++.br ++.TP ++.B \-i interval ++The shortest deadline for the tasks ++.br ++.TP ++.B \-p percent ++The percent of bandwidth to use (1-90%) ++.br ++.TP ++.B \-P percent ++The percent of runtime for execution completion ++ (Default 100%) ++.br ++.TP ++.B \-t threads ++The number of threads to run as deadline (default 1) ++.br ++.TP ++.B \-s step(us) ++The amount to increase the deadline for each task (default 500us) ++.br ++.SH AUTHOR ++Deadline test was written by Steven Rostedt ++.PP ++This manual page was written by John Kacur +-- +2.14.5 + 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-manpages-Modify-makefile-for-queuelat.8-and.patch b/SOURCES/rt-tests-manpages-Modify-makefile-for-queuelat.8-and.patch new file mode 100644 index 0000000..c8bb2b6 --- /dev/null +++ b/SOURCES/rt-tests-manpages-Modify-makefile-for-queuelat.8-and.patch @@ -0,0 +1,30 @@ +From 77be335d8b09afa662eb0965b9b18a6105fa9dcc Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Tue, 18 Sep 2018 02:30:00 +0200 +Subject: [PATCH] rt-tests: manpages: Modify makefile for queuelat.8 and + pip_stress.8 + +Modify the manpage to include queuelat.8 and pip_stress.8 for the +install + +Signed-off-by: John Kacur +--- + Makefile | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/Makefile b/Makefile +index 8b08385890fe..5447ca9de108 100644 +--- a/Makefile ++++ b/Makefile +@@ -193,6 +193,8 @@ install: all install_hwlatdetect + gzip -c src/backfire/sendme.8 >"$(DESTDIR)$(mandir)/man8/sendme.8.gz" + gzip -c src/hackbench/hackbench.8 >"$(DESTDIR)$(mandir)/man8/hackbench.8.gz" + gzip -c src/signaltest/signaltest.8 >"$(DESTDIR)$(mandir)/man8/signaltest.8.gz" ++ 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" + + .PHONY: install_hwlatdetect + install_hwlatdetect: hwlatdetect +-- +2.14.4 + diff --git a/SOURCES/rt-tests-pi_stress-remove-unused-report-options.patch b/SOURCES/rt-tests-pi_stress-remove-unused-report-options.patch new file mode 100644 index 0000000..e5ba8a1 --- /dev/null +++ b/SOURCES/rt-tests-pi_stress-remove-unused-report-options.patch @@ -0,0 +1,32 @@ +From 4b58d4277496b5ad61b66cbc6fb4aea91ceec6dd Mon Sep 17 00:00:00 2001 +From: Juri Lelli +Date: Fri, 14 Sep 2018 12:04:48 +0200 +Subject: [PATCH 1/5] rt-tests: pi_stress: remove unused report option from + help + +Command line --report option is not actually implemented (even if +advertised on --help). + +Remove it from the help banner. + +Signed-off-by: Juri Lelli +Signed-off-by: John Kacur +--- + src/pi_tests/pi_stress.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/src/pi_tests/pi_stress.c b/src/pi_tests/pi_stress.c +index 36b64ca1672c..ac7646cd2613 100644 +--- a/src/pi_tests/pi_stress.c ++++ b/src/pi_tests/pi_stress.c +@@ -1032,7 +1032,6 @@ void usage(void) + ngroups); + printf + ("\t--inversions=- number of inversions per group [infinite]\n"); +- printf("\t--report=\t- output to file [/dev/null]\n"); + printf("\t--rr\t\t- use SCHED_RR for test threads [SCHED_FIFO]\n"); + printf("\t--sched\t\t- scheduling options per thread type:\n"); + printf("\t\tid=[high|med|low]\t\t\t- select thread\n"); +-- +2.14.4 + diff --git a/SOURCES/rt-tests-pip_stress-Add-an-initial-man-page-for-pip_stress.patch b/SOURCES/rt-tests-pip_stress-Add-an-initial-man-page-for-pip_stress.patch new file mode 100644 index 0000000..12566e7 --- /dev/null +++ b/SOURCES/rt-tests-pip_stress-Add-an-initial-man-page-for-pip_stress.patch @@ -0,0 +1,70 @@ +From 2342d8be62a510569f8cbc9fe41574b6bc370073 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Mon, 17 Sep 2018 23:13:53 +0200 +Subject: [PATCH 3/5] rt-tests: pip_stress: Add an initial man page for + pip_stress + +This adds a man page for pip_stress + +Signed-off-by: John Kacur +--- + src/pi_tests/pip_stress.8 | 47 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 47 insertions(+) + create mode 100644 src/pi_tests/pip_stress.8 + +diff --git a/src/pi_tests/pip_stress.8 b/src/pi_tests/pip_stress.8 +new file mode 100644 +index 000000000000..1808330b2e17 +--- /dev/null ++++ b/src/pi_tests/pip_stress.8 +@@ -0,0 +1,47 @@ ++.\" ++.TH PIP\ STRESS 8 "September 17, 2018" ++.SH NAME ++.B pip_stress \- Priority Inheritance with processes ++.SH SYNOPSIS ++.B pip_stress ++ ++.SH DESCRIPTION ++This program demonstrates the technique of using priority inheritance (PI) ++mutexes with processes instead of threads. ++The way to do this is to obtain some shared memory - in this case with ++mmap that backs a pthread_mutex_t since this will support PI. ++Pay particular attention to how this is intialized to support processes. ++Function init_shared_pthread_mutex() does this by setting the ++pthread_mutexattr to PTHREAD_PROCESS_SHARED and the mutex protocol to ++PTHREAD_PRIO_INHERIT. ++In this program we purposely try to invoke a classic priority inversion. ++A low priority process grabs the mutex and does some work. ++A high priority process comes a long and is blocked since the mutex is taken. ++A medium priority process that doesn't require the mutex then takes the ++processor. Because the processes are restricted to one cpu, the low priority ++processes never makes any progress because the medium priority process ++runs in an infinite loop. This is a priority inversion because the ++medium priority process is running at the expensive of the high priority ++process. However, since we have used PRIO_INHERIT and are running on a ++machine that supports preemption, the high priority process will lend it's ++priority to the low priority process which will preempt the medium priority ++process. The low priority process will then release the mutex which the ++high priority process can obtain. When the high priority process gets to run ++it kills the medium priority process. ++The state structure keeps track of the progress. Although this program ++is set up to likely trigger an inversion, there is no guarantee that ++scheduling will make that happen. After the program completes it reports ++whether a priority inversion occurred or not. In either case this program ++demonstrates how to use priority inheritance mutexes with processes. ++In fact, you would be better off to avoid scenarios in which a priority ++inversion occurs if possible - this program tries to trigger them just ++to show that it works. If you are having difficulty triggering an inversion, ++merely increase the time that the low priority process sleeps while ++holding the lock. (usleep); ++Also note that you have to run as a user with permission to change ++scheduling priorities. ++.BR ++.SH AUTHOR ++pip_stress was written by John Kacur ++.PP ++This manual page was also written by John Kacur +-- +2.14.4 + 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 new file mode 100644 index 0000000..c849e7c --- /dev/null +++ b/SPECS/rt-tests.spec @@ -0,0 +1,764 @@ +Summary: Programs that test various rt-features +Name: rt-tests +# These will be setup by the "make rpm" logic +# Version: 1.0 +# BuildRequires: numactl-devel +# Numa argument to make: NUMA=1 +# +Version: 1.3 +Release: 20%{?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 +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 +Patch6: add-h-option-to-queuelat.patch +Patch7: Add-queuelat-manpage.patch +Patch8: rt-tests-manpages-Modify-makefile-for-queuelat.8-and.patch +Patch9: rt-tests-Remove-install-and-build-of-backfire-and-sendme.patch +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 + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root +Obsoletes: cyclictest signaltest pi_tests +ExclusiveArch: x86_64 +BuildRequires: numactl-devel python3-devel +%{?__python3:Requires: %{__python3}} + +%description +rt-tests is a set of programs that test and measure various components of +real-time kernel behavior. This package measures timer, signal, and hardware +latency. It also tests the functioning of priority-inheritance mutexes. + +%prep +%setup -q +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%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 + +%build +make NUMA=1 HAVE_PARSE_CPUSTRING_ALL=1 + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/%{python3_sitelib} +make DESTDIR=$RPM_BUILD_ROOT prefix=/usr install + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root,-) +%{python3_sitelib}/hwlatdetect.py* +%{python3_sitelib}/__pycache__/hwlatdetect* +%caps(cap_sys_rawio+ep) /usr/bin/cyclictest +/usr/bin/pi_stress +/usr/bin/signaltest +/usr/bin/hwlatdetect +/usr/bin/rt-migrate-test +/usr/bin/pip_stress +/usr/bin/ptsematest +/usr/bin/sigwaittest +/usr/bin/svsematest +/usr/bin/pmqtest +/usr/bin/hackbench +/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 +/usr/share/man/man8/hwlatdetect.8.gz +/usr/share/man/man8/pi_stress.8.gz +/usr/share/man/man8/pmqtest.8.gz +/usr/share/man/man8/ptsematest.8.gz +/usr/share/man/man8/rt-migrate-test.8.gz +/usr/share/man/man8/signaltest.8.gz +/usr/share/man/man8/sigwaittest.8.gz +/usr/share/man/man8/svsematest.8.gz +/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 +* 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 + +* Thu Nov 15 2018 John Kacur - 1.3-12 +- Add NULL check before freeing setcpu_buf +Resolves: rhbz#1641971 + +* Tue Nov 06 2018 John Kacur - 1.3-11 +- Fix the spec file to remove debuginfo from the standard queuelat files +Resolves: rhbz#1641978 + +* Mon Nov 05 2018 John Kacur - 1.3-10 +- Remove numa from help since it is invokved automatically +Resolves: rhbz#1646121 + +* Fri Nov 02 2018 John Kacur - 1.3-9 +- Add a manpage for deadline_test +Resolves: rhbz#1645071 + +* Mon Oct 08 2018 John Kacur - 1.3-8 +- Remove backfire and sendme +Resolves: rhbz#1624885 + +* Fri Sep 28 2018 John Kacur - 1.3-7 +- Change python3 to platform-python +Resolves: rhbz#1633607 + +* Mon Sep 17 2018 John Kacur - 1.3-6 +- rt-tests-pi_stress-remove-unused-report-options.patch +- rt-tests-pip_stress-Add-an-initial-man-page-for-pip_stress.patch +- add-h-option-to-queuelat.patch +- Add-queuelat-manpage.patch +- Modify makefile for queuelat.8 and pip_stress.8 +Resolves: rhbz#1614783 + +* Fri Jun 22 2018 John Kacur - 1.3-5 +- Reimplement the removal of --numa, and automate it's detction +Resolves: rhbz#1594273 + +* Tue Jun 12 2018 John Kacur - 1.3-4 +- A few more python3 changes + +* Wed May 30 2018 John Kacur - 1.3-3 +- Add patches that remove --sma and --numa and automate it +Resolves: rhbz#1518708 + +* Wed May 30 2018 John Kacur - 1.3-2 +- cyclictest: remove tracing, in favour of external tracing +Resolves: rhbz#1518268 + +* Mon Apr 30 2018 John Kacur - 1.3-1 +- New build +- Add test queuelat +- Adds changes for python3 in hwlatdetect +Resolves: rhbz#1543030 +Resolves: rhbz#1559520 + +* Tue Mar 27 2018 John Kacur - 1.2-1 +- Remove old patches from the source files +Resolves: rhbz#1559930 + +* Mon Mar 26 2018 John Kacur - 1.2-0 +- Initial Build for 8.0 +Resolves: rhbz#1559930 + +* Wed Dec 20 2017 John Kacur - 1.0.13 +- rt-tests-Need-to-generate-debug-info-for-rpms.patch +Resolves: rhbz#1523752 + +* Thu Nov 02 2017 John Kacur - 1.0.12 +- cyclictest: cannot stop when running with -M option +Resolves: rhbz#1473786 + +* Tue Apr 25 2017 John Kacur - 1.0.11 +- cyclictest-touch-threadstacks-on-numa-to-pre-fault-t.patch +Resolves: rhbz1445058 + +* Thu Mar 23 2017 John Kacur - 1.0.10 +- hwlatdetect: modify hwlatdetector.py to use the ftrace hwlatdetector +- hwlatdetect: removed smi_detector support +Resolves: rhbz1365961 + +* Thu Mar 23 2017 John Kacur - 1.0.9 +- hwlatdetect: Add --hardlimit to define the real test failing criteria +Resolves: rhbz1434827 + +* Thu Mar 23 2017 John Kacur - 1.0.8 +- cyclicdeadline: Fix minor spelling mistake +- cyclictest: Correct short option 's' +Resolves: rhbz1434825 + +* Tue Mar 21 2017 John Kacur - 1.0.7 +- rt-tests: hwlatdetect: Improve message if max latency is below threshold +Resolves: rhbz1366289 + +* Thu Jun 30 2016 John Kacur - 1.0-6 +- deadline_test: Made '-i' work and added help text for it +Resolves: rhbz1346771 + +* Tue Jun 28 2016 John Kacur - 1.0-5 +- z-stream release + +* Thu Jun 23 2016 John Kacur - 1.0-4 +- Add cyclicdeadline and deadline_test to rt-tests +Resolves: rhbz#1349032 + +* Fri Jun 17 2016 John Kacur - 1.0-3 +- Install cyclictest with cap_sys_rawio to access msr and cpuid registers +- Fixed url in Source0 +Resolves: rhbz#1346771 + +* Wed Jun 01 2016 John Kacur - 1.0-2 +- cyclictest: new CPUs with SMI counter support +Resolves: rhbz#1341226 + +* Fri May 20 2016 John Kacur - 1.0-1 +- Upgrade to 1.0 +Clark Williams (1): + cyclictest: stop any tracing after hitting a breaktrace threshold +John Kacur (8): + rt-tests: Makefile: Assume numa_parse_cpustring_all available + rt-tests: Add man page for rt-migrate-test + rt-tests: Update the cyclictest man page + rt-tests: Add missing option to hwlatdetect man page + rt-tests: Housekeeping fix some spelling errors. + rt-tests: hwlat.txt: smidetect renamed to hwlatdetect + rt-tests: Remove doc/release-checklist.txt + rt-tests: Makefile - bump version to 1.0 +- Add patch to install rt-migrate-test.8-man-page +Resolves: rhbz#1283264 +- The latest build also includes fixes for undocumented options in cyclictest and hwlatdetect, as well as many more documentation fixes. +Resolves: rhbz#1263718 +- Also documenting here that the new feature cyclictest: SMI count/detection via MSR/SMI counter was added in v0.97 +Resolves: rhbz#1314869 + +* Tue May 10 2016 John Kacur - 0.97-3 +- cyclictest: stop any tracing after hitting a breaktrace threshold +- Resolves: rhbz#1333762 + +* Tue Apr 26 2016 John Kacur - 0.97-2 +- Change spec file to compile with HAVE_PARSE_CPUSTRING_ALL=1 + - This makes numa_parse_cpustring_all() available which is needed for + running cyclictest on isolated cpus. +- Resolves: rhbz#1330468 + +* Mon Apr 04 2016 John Kacur - 0.97-1 +- Changes from v0.93 to v0.97 +Clark Williams (9): + hwlatdetect: initial cut at tracking the amount of SMIs that occurred + during a run + rt-migrate-test: updated to latest code from rostedt + Makefile: add target to create OBJDIR before use + specfile: add signaltest manpage to files section and remove trailing + whitespace in changelog + Makefile: have distclean remove .asc file for tarball + Makefile: fixed dropped quote in help target text + hwlatdetect: handle hwlat_detector being builtin rather than module + hwlatdetect: modify to handle python3 prints + hwlatdetect: make reading sample date work with python2 and python3 +Daniel Bristot de Oliveira (2): + cyclictest: SMI count/detection via MSR/SMI counter + cyclictest: Add --smi description on cyclictest man page +Darren Hart (2): + rt-tests: Allow for user-specified PYLIB + rt-tests: Break out install_hwlatdetect +Henrik Austad (10): + Add CROSS_COMPILE-switch to CC and AR + Add syscall-number for sched_(gs)etattr() for tile + Add a rebuild-switch to Makefile + Makefile: add librttest to rt-migrate-test + android: adjust target for android + cyclictest: move redefine of CPUSET back to uclib + Android: clean up the bypass ifdeffery + Android: rename arch from bionic to android + Android: Expand match for android in ostype + rt-sched.h: do not unconditionally define syscall-numbers +John Kacur (26): + Fix VERSION in rt-migrate-test + numa_on_and_available: Remove from main in cyclictest + Version bump to v0.94 + Explicitly separate VPATH paths with a colon + build: Generate .o, .a, and .d files in bld dir + signaltest: call process_options before calling check_privs + signaltest: Check the status of pthread_create + rt-utils: Add John Kacur to the copyright + rt-utils: Fix some checkpatch errors in rt-utils.c + signaltest: Add a man page to signaltest + Makefile: Document certain compiling options + Makefile: Only call cc -dumpmachine once in the makefile + Bionic: Move android functionality into it's own arch Makefile + maintainence: VERSION bump and Change-log update + cyclictest: Clean-ups in timerthread before working on it + Makefile: OBJDIR should be an order-only-prerequisite + Makefile: Move TARGETS back to a more logical place in the Makefile + cyclictest: Add a feature to record spikes + cyclictest: fix #ifdef broken by NO_PTHREAD_SETAFFINITY + Makefile: Version bump to v0.96 + Remove rt-tests.spec-in + gitattributes: add doc, remove rt.spec-in + Makefile: Remove anything to do with rpms, specs etc + Revert changes to rt-migrate-test for exit(1) + cyclictest: Make the tracemark option imply notrace + rt-tests: Makefile: Bump version number to 0.97 +Josh Cartwright (8): + rt-tests: workaround poor gzip implementations + hackbench: cleanup error handling in create_worker + cyclictest: consistently make all functions 'static' + cyclictest: use correct type when allocating cpu bitmask size + cyclictest: drop impossible use_fifo conditional + cyclictest: fail if use_fifo && thread creation failed + error: mark fatal, err_exit, err_quit as being noreturn + cyclictest: add option for dumping the histogram in a file +Khem Raj (1): + Makefile: Set CC/AR variable only if it doesn't have a value +Luiz Capitulino (5): + don't use exit(-1) for failures + cyclictest: move tracemark_fd handling to its own function + cyclictest: tracing(): check for notrace + cyclictest: move debugfs init code to its own function + cyclictest: add --tracemark option +Uwe Kleine-König (5): + backfire: remove unused header file + remove several unused Makefiles + rt-migrate-test: remove space before \n + drop compiling without NPTL support + Fix some trivial typos found by codespell(1) +- Resolves: rhbz#1283264 + + * Wed Aug 12 2015 Clark Williams - 0.93-1 +John Kacur (6): + makefile: Create an rt-tests.tar file using git-archiv + makefile: Change VERSION_STRING to VERSIO + 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): + 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 +Anna-Maria Gleixner (2): + cyclictest: Convert the offset of the alignment option to microseconds + cyclictest: Align measurement threads to the next full second + cyclictest: Ensure that next wakeup time is never in the past +Daniel Wagner (1): + pi_stress: Clear affinity for DEADLINE tasks +John Kacur (3): + Fix minor grammar mistake in the help output + Allow building with -DHAVE_PARSE_CPUSTRING_ALL + Add a MAINTAINERS file +Michael Olbrich (2): + Makefile: pi_stress need librttest.a so it should depend on it + Makefile: cleanup linking to librttest.a +Sebastian Andrzej Siewior (1): + cyclictest: consider the 4 as the major version + + * Tue Feb 17 2015 Clark Williams - 0.91-1 +- From Boris Egorov + - rt-migrate-test: exit early if nr_runs is non-positive + - rt-migrate-test: use variables instead of macros +- From Uwe Kleine-König + - pi_stress: remove timestamp of compilation from version output +- rt-migrate-test: make sure input parameters are converted to correct units +- rt-migrate-test: sanity check --prio value + +* Tue Jan 27 2015 Clark Williams - 0.90-1 +- pip_stress: parameterize usleep value to work-around platform issues +- From Daniel Wagner : + - pi_stress: Store schedule attributes per thread + - rt-utils: Add gettid() + - rt-utils: Add helper to parse/print scheduling policies + - rt-sched: Add sched_setattr/sched_getattr API + - pi_stress: Use error.h for logging and debugging + - error: Add debug() function + - pi_stress: Remove unused TIMER_SIGNAL definition + - rt-tests.h: Remove unused header file + - hackbench: Don't re-assign context for each fd +- From Joakim Hernberg : + - cyclictest: make affinity option only use number of online cpus +- From John Kacur : + - cyclictest: Add long option --laptop to preserve battery power + - cyclictest: Fix help for long options only + - cyclictest: Change the output from function sighand() to stderr + - cyclictest: Always print an err message if write of 0 to cpu-dma_latency fails + - rt_numa.h: Suppress discards 'const' qualifier warning + - lib: Rework err_msg_n to output strerror after message +- From Alexey Brodkin : + - Makefile: allow building selected tests with non-NPTL toolchain + +* Sun Mar 30 2014 Clark Williams - 0.89-1 +- clean up debugging comments and printfs from last release +- ran hwlatdetect.py through 2to3, works for both python2 and 3 + +* Fri Mar 28 2014 Clark Williams - 0.88-1 +- From Uwe Kleine-König : + - cyclictest: Fix tracemark output when the latency threshold is hit on ARM +- From Gary S. Robertson : + - cyclictest: Restore CPU affinity function for non-NUMA builds + - cyclictest: Don't offer --numa option when unavailable + +* Wed Dec 11 2013 Clark Williams - 0.87-1 +- From Aaron Fabbri : + - cyclictest: CPU affinity now takes arbitrary set of cpus + +* Fri Nov 15 2013 Clark Williams - 0.86-1 +- cyclictest: allow break threshold without doing any tracing +- cyclictest: add named fifo for statistics +- from John Kacur : + - cyclictest: Align option fixes + - Makefile: Don't tag files in dir BUILD from rpm builds + - Makefile: Add BUILDROOT and SPECS to the dirs to remove for distclean + - Makefile: Add tmp dir to distclean and "make release" call distclean + - Makefile: Don't tag tmp files created when making a release +- from Nicholas Mc Guire : + - cyclictest: add align thread wakeup times option +- cyclictest: modify option handling to use enumerated types +- from Sebastian Andrzej Siewior : + - hackbench: init child's struct before using it +- from Jim Somerville : + - cyclictest: finish removal of 1 second first loops +- from Frank Rowand : + - rt-tests: NUMA optional for make rpm + - cyclictest: white space cleanup + +* Tue Nov 13 2012 Clark Williams - 0.85-1 +- [cyclictest] add tracemark function back to breaktrace logic +- from Frank Rowand : + - [cyclictest] report large measured clock latency + - [cyclictest] cleanup getopt_long() parameters +- from John Kacur : + - [Makefile] add CPPFLAGS to pattern rule for dependencies + - [gitignore] exclude patches and .a archives +- from Uwe Kleine-König : + - Makefile: separate CFLAGS and CPPFLAGS + - have printf use %s format for strings +- from Bhavesh Davda : + - cyclictest: histogram overflow instance tracking + - cyclictest: whitespace cleanup + +* Wed May 9 2012 Clark Williams - 0.84-1 +- [cyclictest] added -Q/--priospread option to +- from Markus Kohlhase + - [docs] added description from osadl.org +- from Darren Hart + - Makefile: Support user supplied CFLAGS and LDFLAGS +- from Steven Rostedt + - rt-tests: Update rt-migrate-test to use ftrace infrastructure +- from John Kacur + - .gitignore: differentiate between program names and directories + - pi_stress: Check the status of sched_getaffinity + - Makefile: Introduce a static library + - Move info, warn, and fatal functions to error.[ch] + - install: Fix failed to create symbolic link hwlatdetect file exists + - cyclictest: Make cyclictest fail if it cannot run with requested priority +- from Frank Rowand + - cyclictest: segfault with '-a' + - cyclictest: avoid unneeded warning + - cyclictest: warn of interaction between '-a', '--smp', and '--numa' + - Makefile: get machinetype from compiler instead of uname + - cyclictest: incorrect first latency value for --verbose option + - cyclictest: printf format compile warning + +* Mon Sep 26 2011 Clark Williams - 0.83-1 +- modified Makefile to be smarter about building with NUMA + +* Wed Sep 21 2011 Clark Williams - 0.82-1 +- fix print that causes error in histogram processing + +* Tue Sep 20 2011 Clark Williams - 0.81-1 +- cleaned up previous hack for /dev/cpu_dma_latency interface + +* Tue Sep 20 2011 Clark Williams - 0.80-1 +- use /dev/cpu_dma_latency interface to prevent cstate transitions + in cyclictest + +* Thu Sep 15 2011 Clark Williams - 0.79-1 +- added signal_workers routine to hackbench +- added -F/--fifo option to hackbench + +* Wed Sep 14 2011 Clark Williams - 0.78-1 +- modified hackebench signal logic + +* Fri Sep 9 2011 Clark Williams - 0.77-1 +- removed tracemark functions (too much contention on multiprocessors) + +* Wed Sep 7 2011 Clark Williams - 0.76-1 +- only turn on /proc/sys/kernel/ftrace_enabled for a tracer that + needs it +- make sure to set current_tracer to function for -f switch + +* Fri Sep 2 2011 Clark Williams - 0.75-1 +- added utility routines for mounting debugfs and event/tracing manipulation +- from Steven Rostedt : + - allow events for all tracers + - Have -I and -P together also be -B + - do not touch tracing_thresh + - only check file descriptor in tracemark() function + - use interval on first loop instead of 1 second + - allow tracemark() to take variable args + +* Thu Aug 18 2011 Clark Williams - 0.74-1 +- changes to deal with 3.0 kernel +- fixed buildrequires in specfile for Python +- fixed spelling error in printf in cyclictest +- from John Kacur + - Make the function header style consistent with the rest of cyclictest. + - Spelling clean-ups +- from Uwe Kleine-König + - fix possible buffer overflow in string handling + +* Mon May 9 2011 Clark Williams - 0.73-1 +- fixed signal handling in hackbench (avoid thousands of zombies) +- from Geunsik Lim + - fix incorrect wakeup interface in cyclictest +- from Wolfram Sang + - Simplify Makefile using -D option to install +- from Carsten Emde + - add histogram summary column option (-H) to cyclictest +- from Daniel Sangorrin + - fix sched_setaffinity type error when building with UCLIB +- from Uwe Kleine-König + - install backfire's Makefile + - modernize backfire's Makefile + +* Fri Jun 25 2010 Clark Williams - 0.72-1 +- changed 'diff' variable in timerthread() routine to be unsigned + 64-bit to avoid overflow issues in debugging +- included and changed all 'long long' declarations to + use uint64_t and int64_t + +* Tue May 18 2010 Clark Williams - 0.71-1 +- from Michal Schmit : + - fix accumulating overruns in periodic timer mode + +* Fri Apr 9 2010 Clark Williams - 0.70-1 +- from Olaf Hering + - skip python dependency during install if python not available + +* Fri Apr 9 2010 Clark Williams - 0.69-1 +- fix bus error in cyclictest on NUMA systems with more than 16 cores +- reset default cyclictest policy to SCHED_OTHER +- from Carsten Emde + - add pmqest program for testing posix message queue performance + - misc doc fixes + +* Fri Mar 19 2010 Clark Williams - 0.68-1 +- fix tracing difference between 2.6.24 and 2.6.33 + +* Tue Mar 16 2010 Clark Williams - 0.67-1 +- modified specfile to add hackbench +- modified internal ftrace logic for correct tracing +- Changed rpm %description field to be more descriptive (BZ# 572323) +- from Carsten Emde + - added smp option to svsematest + - fixed policy display in cyclictest +- from John Kacur + - changed default scheduling policy to SCHED_FIFO + - fixed spelling mistake on cyclictest man page + - use symbolic names for scheduling policy + - reverted commit 582be2a52c43801a10d318de7491f1cc7243d5cf to + deal with bug in priority distribution +- from Uwe Kleine-König + - renamed pip to pip_stress + - eliminated use of temp files in dependency generation + - install backfire.c module source in /usr/src/backfire +- from David Sommerseth + - added new-and-improved hackbench to rt-tests + +* Mon Feb 15 2010 Clark Williams - 0.66-1 +- fix incorrect usage of sched_setscheduler in check_privs() + +* Mon Feb 8 2010 Clark Williams - 0.65-1 +- add workaround to hwlatdetect for incorrect initializer in + smi_detector.ko + +* Fri Jan 29 2010 Clark Williams - 0.64-1 +- from John Kacur + - automatic dependency generation + - style cleanups + - libnuma code cleanups + - add copyright to rt_numa.h + +* Wed Jan 27 2010 Clark Williams - 0.63-1 +- added support for libnuma V1 API + +* Tue Jan 26 2010 Clark Williams - 0.62-1 +- added NUMA option +- patch from Uwe Kleine-König + to clarify source copyrights +- moved hwlatdetect to python site-library + +* Wed Jan 13 2010 Clark Williams - 0.61-1 +- added --smp/-S option to setup for basic SMP testing +- added warn() and fatal() utility functions + +* Tue Dec 29 2009 Clark Williams - 0.60-1 +- John Kacur : + - added pip test (process based priority inheritance) + - refactored some error routines into the common library + - added 'make tags' option to Makefile +- Michael Olbrich added an unbuffered + output option to cyclictest (-u/--unbuffered) + +* Mon Dec 21 2009 Clark Williams - 0.59-1 +- deleted classic_pi +- David Sommerseth : + - added help text for -M (refresh-on-max) option for cyclictest + - fixed parsing of --mlockall in signaltest +- Carsten Emde provided a better explaination + for using the kernel module with the backfire program +- John Kacur cleaned up the trailing comments + on the guard macros in src/lib/rt-utils.h + +* Mon Dec 21 2009 Clark Williams - 0.58-1 +- merged jkacur's portable getcpu() code +- fixed inadvertent conversion of some source to DOS text files + +* Mon Dec 14 2009 Clark Williams - 0.57-1 +- John Kacur folded in Carsten Emde's tests + - ptsematest + - sigwaittest + - svsematest + - sendme +- Carsten Emde created a utility library + moving functions from cyclictest into src/lib/rt-utils.c +- Makefile cleanups from jkacur + +* Thu Dec 10 2009 Clark Williams - 0.56-1 +- cyclictest: added code to print break thread id with -b + +* Thu Nov 19 2009 Clark Williams - 0.55-1 +- pi_stress: cosmetic newline added +- fixes from John Kacur + - pi_stress: Remove racy state variables that cause watchdog to trigger + - pi_stress: Check whether quiet is set, before taking shutdown_mtx + - pi_stress: Use a pthread_mutex_t for the global variable shutdown + +* Tue Nov 17 2009 Clark Williams - 0.54-1 +- patches from John Kacur + - fix source style issues in pi_stress + - add a DEBUG option to the Makefile + - use CFLAGS for C compiler options + - label targets as PHONY if not generating actual file +- patch to remove rt-tests.spec from .PHONY in Makefile + +* Mon Nov 16 2009 Clark Williams - 0.53-2 +- added back missing dist tag for release + +* Tue Oct 6 2009 Clark Williams - 0.53-1 +- fixed incorrect format string in hwlatdetect.py +- added docs/release-checklist.txt + +* Mon Sep 21 2009 Clark Williams - 0.52-1 +- fixes and cleanups to pi_stress from jkacur +- added rostedt's rt-migrate-test + +* Thu Sep 3 2009 Clark Williams - 0.51-1 +- two manpage fixes from Uwe Kleine-König +- added -M option from Arnaldo Carvahlo de Melo + (for use on low-bandwidth connections, defer's update until new max hit) + +* Fri Jul 24 2009 Clark Williams - 0.50-2 +- minor patch to fix reporting option of hwlatdetect + +* Thu Jul 16 2009 Clark Williams - 0.50-1 +- patch to cyclictest from Sebastian Andrzej Siewior + to process options before checking for root user +- patch to cyclictest from Sebastian Andrzej Siewior + to exit with proper error code on exit +- added scripts/do-git-push script +- added push target to Makefile +- rewrite of hwlatdetect script to handle old smi_detector module + +* Sun Jul 5 2009 Clark Williams - 0.47-1 +- patch from GeunSik Lim to reorder options for readability +- patch from GeunSik Lim to add --policy option +- patch from GeunSik Lim to clarify -h option usage +- modified --policy to take scheduler policy name instead of integers + +* Thu Jul 2 2009 Clark Williams - 0.46-1 +- added fix from Daniel Gollub (doomsday latency) + +* Thu Jul 2 2009 Clark Williams - 0.45-1 +- bugfix from Daniel Gollub (fix cyclictest segfault) +- cyclictest format change from Sven-Thorsten Dietrich +- added help target to Makefile + +* Tue Jun 30 2009 Clark Williams - 0.44-1 +- fix to specfile (renamed smidetect to hwlatdetect) +- added code to hwlatdetect allow setting window and width properly + +* Thu Jun 25 2009 Clark Williams - 0.43-1 +- manpage fixes from Uwe Kleine-Konig + +* Fri Jun 12 2009 Clark Williams - 0.42-1 +- renamed smidetect -> hwlatdetect + +* Thu May 28 2009 Clark Williams - 0.41-1 +- added Stefan Agner's patch to fix calculating time difference + when delta is bigger than 2147 seconds + +* Wed May 13 2009 Clark Williams - 0.40-1 +- added smidetect + +* Thu Jan 03 2008 Clark Williams - 0.18-1 +- Initial build.