From edf57d7deecec6d7f0342b6a1472bc725a9025e1 Mon Sep 17 00:00:00 2001 From: Leah Leshchinsky Date: Mon, 14 Nov 2022 10:55:51 -0500 Subject: [PATCH] hwlatdetect: Convert to fstrings - hwlatdetect: Convert to fstrings - hwlatdetect: Update to integer division - hwlatdetect: Fix incorrect comment about test duration Resolves: rhbz#2121150 Signed-off-by: Leah Leshchinsky --- realtime-tests.spec | 16 +- ...tect-Fix-incorrect-comment-about-tes.patch | 34 +++ ...latdetect-Update-to-integer-division.patch | 34 +++ ...s-hwlatdetect.py-Covert-to-f-strings.patch | 225 ++++++++++++++++++ 4 files changed, 307 insertions(+), 2 deletions(-) create mode 100644 rt-tests-hwlatdetect-Fix-incorrect-comment-about-tes.patch create mode 100644 rt-tests-hwlatdetect-Update-to-integer-division.patch create mode 100644 rt-tests-hwlatdetect.py-Covert-to-f-strings.patch diff --git a/realtime-tests.spec b/realtime-tests.spec index bc753dd..db2aec9 100644 --- a/realtime-tests.spec +++ b/realtime-tests.spec @@ -6,7 +6,7 @@ Name: realtime-tests # Numa argument to make: NUMA=1 # Version: 2.4 -Release: 4%{?dist} +Release: 5%{?dist} License: GPLv2 URL: https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git Source0: https://www.kernel.org/pub/linux/utils/rt-tests/rt-tests-%{version}.tar.xz @@ -24,6 +24,9 @@ Patch1: rt-tests-Remove-arbitrary-num-of-threads-limits.patch Patch2: rt-tests-hackbench-Add-error-checking-to-connect-and.patch Patch3: rt-tests-hackbench-Fix-compile-comparison-of-differe.patch Patch4: rt-tests-hackbench-Fix-compile-warning-about-fall-th.patch +Patch5: rt-tests-hwlatdetect.py-Covert-to-f-strings.patch +Patch6: rt-tests-hwlatdetect-Update-to-integer-division.patch +Patch7: rt-tests-hwlatdetect-Fix-incorrect-comment-about-tes.patch %description realtime-tests is a set of programs that test and measure various components of @@ -36,6 +39,9 @@ latency. It also tests the functioning of priority-inheritance mutexes. %patch2 -p1 %patch3 -p1 %patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 %build %set_build_flags @@ -86,11 +92,17 @@ latency. It also tests the functioning of priority-inheritance mutexes. %{_mandir}/man8/determine_maximum_mpps.8.* %changelog +* Mon Nov 14 2022 Leah Leshchinsky - 2.4-5 +- hwlatdetect: Convert to fstrings +- hwlatdetect: Update to integer division +- hwlatdetect: Fix incorrect comment about test duration +Resolves: rhbz#2121150 + * Wed Nov 02 2022 John Kacur - 2.4-4 - Add error checking in hackbench to connect and getsockname - Fix compile warnings in hackbench because of comparison of different signs - Fix compile warnings in hackbench because of warnings about fall through -Resolves: rhbz#bz2115067 +Resolves: rhbz#2115067 * Fri Oct 07 2022 John Kacur - 2.4-3 - Remove arbitrary limits on number of threads diff --git a/rt-tests-hwlatdetect-Fix-incorrect-comment-about-tes.patch b/rt-tests-hwlatdetect-Fix-incorrect-comment-about-tes.patch new file mode 100644 index 0000000..82ec325 --- /dev/null +++ b/rt-tests-hwlatdetect-Fix-incorrect-comment-about-tes.patch @@ -0,0 +1,34 @@ +From 8c7532b710390882ffd7e96d50e75fce99a8249f Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Fri, 11 Nov 2022 14:48:15 -0500 +Subject: [PATCH 3/3] rt-tests: hwlatdetect: Fix incorrect comment about + testduration + +At some point +self.testduration = 10 +was changed to +self.testduration = 30 + +but retained the comment, "ten seconds" + +Just change the comment to say, "in seconds" so it's clear what unit +we are talking about. + +Signed-off-by: John Kacur + +diff --git a/src/hwlatdetect/hwlatdetect.py b/src/hwlatdetect/hwlatdetect.py +index c5b3a689dcd1..68df58f7e2d0 100755 +--- a/src/hwlatdetect/hwlatdetect.py ++++ b/src/hwlatdetect/hwlatdetect.py +@@ -130,7 +130,7 @@ class Detector: + if not self.debugfs.mount(): + raise RuntimeError("failed to mount debugfs") + self.samples = [] +- self.testduration = 30 # ten seconds ++ self.testduration = 30 # in seconds + self.have_msr = False + self.initsmi = [] + if os.path.exists('/usr/sbin/rdmsr'): +-- +2.31.1 + diff --git a/rt-tests-hwlatdetect-Update-to-integer-division.patch b/rt-tests-hwlatdetect-Update-to-integer-division.patch new file mode 100644 index 0000000..2b086a5 --- /dev/null +++ b/rt-tests-hwlatdetect-Update-to-integer-division.patch @@ -0,0 +1,34 @@ +From 1eaa7feae3225ae82d00d2e1f02986e34c31a38d Mon Sep 17 00:00:00 2001 +From: Leah Leshchinsky +Date: Thu, 10 Nov 2022 10:35:27 -0500 +Subject: [PATCH 2/3] rt-tests: hwlatdetect: Update to integer division + +In Python 3, "/" is a float division operator, as opposed to Python 2, +which defaults to integer division. This results in an error when +calculating width, which assumes an integer. + +Update width division to integer division with the "//" operator. + +Signed-off-by: Leah Leshchinsky +Signed-off-by: John Kacur + +diff --git a/src/hwlatdetect/hwlatdetect.py b/src/hwlatdetect/hwlatdetect.py +index 1efbe7a60059..c5b3a689dcd1 100755 +--- a/src/hwlatdetect/hwlatdetect.py ++++ b/src/hwlatdetect/hwlatdetect.py +@@ -454,9 +454,10 @@ if __name__ == '__main__': + + if args.window: + w = microseconds(args.window) ++ width = w//2 + if w < int(detect.get("width")): +- debug(f"shrinking width to {w//2} for new window of {w}") +- detect.set("width", w/2) ++ debug(f"shrinking width to {width} for new window of {w}") ++ detect.set("width", width) + debug(f"window parameter = {w}") + detect.set("window", w) + debug(f"window for sampling set to {w}us") +-- +2.31.1 + diff --git a/rt-tests-hwlatdetect.py-Covert-to-f-strings.patch b/rt-tests-hwlatdetect.py-Covert-to-f-strings.patch new file mode 100644 index 0000000..f09e92d --- /dev/null +++ b/rt-tests-hwlatdetect.py-Covert-to-f-strings.patch @@ -0,0 +1,225 @@ +From d9acad79fa157f90522b3dc2b745bbb3b72fef1d Mon Sep 17 00:00:00 2001 +From: Leah Leshchinsky +Date: Fri, 11 Nov 2022 13:49:33 -0500 +Subject: [PATCH 1/3] rt-tests: hwlatdetect.py Covert to f-strings + +Add f-strings where applicable for readability. + +Signed-off-by: Leah Leshchinsky +Signed-off-by: John Kacur + +diff --git a/src/hwlatdetect/hwlatdetect.py b/src/hwlatdetect/hwlatdetect.py +index 9ef50f862127..1efbe7a60059 100755 +--- a/src/hwlatdetect/hwlatdetect.py ++++ b/src/hwlatdetect/hwlatdetect.py +@@ -59,7 +59,7 @@ class DebugFS: + if self.premounted or self.mounted: + debug("not mounting debugfs") + return True +- debug("mounting debugfs at %s" % path) ++ debug(f"mounting debugfs at {path}") + self.mountpoint = path + cmd = ['/bin/mount', '-t', 'debugfs', 'none', path] + self.mounted = (subprocess.call(cmd) == 0) +@@ -90,7 +90,7 @@ class DebugFS: + try: + val = f.readline() + except OSError as e: +- print("errno: %s" % e) ++ print(f"errno: {e}") + if e.errno == errno.EAGAIN: + val = None + else: +@@ -192,18 +192,18 @@ class Detector: + count = 0 + threshold = int(self.get("threshold")) + self.c_states_off() +- debug("enabling detector module (threshold: %d)" % threshold) ++ debug(f"enabling detector module (threshold: {threshold})") + self.set("enable", 1) + while self.get("enable") == 0: + debug("still disabled, retrying in a bit") + count += 1 + time.sleep(0.1) +- debug("retrying enable of detector module (%d)" % count) ++ debug(f"retrying enable of detector module ({count})") + self.set("enable", 1) + if self.get("threshold") != threshold: + debug("start: threshold reset by start, fixing") + self.set("threshold", threshold) +- debug("detector module enabled (threshold: %d)" % int(self.get("threshold"))) ++ debug(f"detector module enabled (threshold: {int(self.get('threshold'))})") + + def stop(self): + """ disable the detector """ +@@ -214,7 +214,7 @@ class Detector: + debug("still enabled, retrying in a bit") + count += 1 + time.sleep(0.1) +- debug("retrying disable of detector module(%d)" % count) ++ debug(f"retrying disable of detector module({count})") + self.set("enable", 0) + self.c_states_on() + debug("detector module disabled") +@@ -248,7 +248,7 @@ class Tracer(Detector): + self.outer = int(o) + + def __str__(self): +- return "ts: %s, inner:%d, outer:%d" % (self.timestamp, self.inner, self.outer) ++ return f"ts: {self.timestamp}, inner:{self.inner}, outer:{self.outer}" + + def display(self): + """ convert object to string and print """ +@@ -322,8 +322,8 @@ class Tracer(Detector): + if output: + with open(output, "w") as f: + for s in self.samples: +- f.write("%s\n" % str(s)) +- print("report saved to %s (%d samples)" % (output, len(self.samples))) ++ f.write(f"{s}\n") ++ print(f"report saved to {output} ({len(self.samples)} samples)") + + def display(self): + for s in self.samples: +@@ -341,7 +341,7 @@ def seconds(sval): + if sval.isdigit(): + return int(sval) + if sval[-2].isalpha(): +- raise RuntimeError("illegal suffix for seconds: '%s'" % sval[-2:-1]) ++ raise RuntimeError(f"illegal suffix for seconds: '{sval[-2:-1]}'") + if sval[-1:] == 's': + return int(sval[0:-1]) + if sval[-1:] == 'm': +@@ -352,7 +352,7 @@ def seconds(sval): + return int(sval[0:-1]) * 86400 + if sval[-1:] == 'w': + return int(sval[0:-1]) * 86400 * 7 +- raise RuntimeError("invalid input for seconds: '%s'" % sval) ++ raise RuntimeError(f"invalid input for seconds: '{sval}'") + + + def milliseconds(sval): +@@ -367,7 +367,7 @@ def milliseconds(sval): + return int(sval[0:-1]) * 1000 * 60 + if sval[-1] == 'h': + return int(sval[0:-1]) * 1000 * 60 * 60 +- raise RuntimeError("invalid input for milliseconds: %s" % sval) ++ raise RuntimeError(f"invalid input for milliseconds: {sval}") + + + def microseconds(sval): +@@ -380,7 +380,7 @@ def microseconds(sval): + return int(sval[0:-2]) + if sval[-1:] == 's': + return int(sval[0:-1]) * 1000 * 1000 +- raise RuntimeError("invalid input for microseconds: '%s'" % sval) ++ raise RuntimeError(f"invalid input for microseconds: '{sval}'") + + + if __name__ == '__main__': +@@ -444,37 +444,37 @@ if __name__ == '__main__': + if args.threshold: + t = microseconds(args.threshold) + detect.set("threshold", t) +- debug("threshold set to %dus" % t) ++ debug(f"threshold set to {t}us") + + if args.hardlimit: + hardlimit = microseconds(args.hardlimit) + else: + hardlimit = int(detect.get("threshold")) +- debug("hardlimit set to %dus" % hardlimit) ++ debug(f"hardlimit set to {hardlimit}us") + + if args.window: + w = microseconds(args.window) + if w < int(detect.get("width")): +- debug("shrinking width to %d for new window of %d" % (w/2, w)) ++ debug(f"shrinking width to {w//2} for new window of {w}") + detect.set("width", w/2) +- debug("window parameter = %d" % w) ++ debug(f"window parameter = {w}") + detect.set("window", w) +- debug("window for sampling set to %dus" % w) ++ debug(f"window for sampling set to {w}us") + + if args.width: + w = microseconds(args.width) + if w > int(detect.get("window")): +- debug("widening window to %d for new width of %d" % (w*2, w)) ++ debug(f"widening window to {w*2} for new width of {w}") + detect.set("window", w*2) +- debug("width parameter = %d" % w) ++ debug(f"width parameter = {w}") + detect.set("width", w) +- debug("sample width set to %dus" % w) ++ debug(f"sample width set to {w}us") + + if args.duration: + detect.testduration = seconds(args.duration) + else: + detect.testduration = 120 # 2 minutes +- debug("test duration is %ds" % detect.testduration) ++ debug(f"test duration is {detect.testduration}s") + + if args.watch: + watch = True +@@ -491,18 +491,18 @@ if __name__ == '__main__': + l, r = map(int, [c, c]) + for i in range(l, r + 1): + cpumask |= (1 << i) +- debug("set tracing_cpumask to %x" % cpumask) +- detect.set("cpumask", "%x" % cpumask) ++ debug(f"set tracing_cpumask to {cpumask:x}") ++ detect.set("cpumask", f"{cpumask:x}") + +- info("hwlatdetect: test duration %d seconds" % detect.testduration) +- info(" detector: %s" % detect.type) ++ info(f"hwlatdetect: test duration {detect.testduration} seconds") ++ info(f" detector: {detect.type}") + info(" parameters:") +- info(" CPU list: %s" % args.cpulist) +- info(" Latency threshold: %dus" % int(detect.get("threshold"))) +- info(" Sample window: %dus" % int(detect.get("window"))) +- info(" Sample width: %dus" % int(detect.get("width"))) +- info(" Non-sampling period: %dus" % (int(detect.get("window")) - int(detect.get("width")))) +- info(" Output File: %s" % reportfile) ++ info(f" CPU list: {args.cpulist}") ++ info(f" Latency threshold: {int(detect.get('threshold'))}us") ++ info(f" Sample window: {int(detect.get('window'))}us") ++ info(f" Sample width: {int(detect.get('width'))}us") ++ info(f" Non-sampling period: {(int(detect.get('window')) - int(detect.get('width')))}us") ++ info(f" Output File: {reportfile}") + info("\nStarting test") + + detect.detect() +@@ -513,12 +513,12 @@ if __name__ == '__main__': + if max_latency == 0: + info("Max Latency: Below threshold") + else: +- info("Max Latency: %dus" % max_latency) ++ info(f"Max Latency: {int(max_latency)}us") + +- info("Samples recorded: %d" % len(detect.samples)) ++ info(f"Samples recorded: {len(detect.samples)}") + + exceeding = detect.get("count") +- info("Samples exceeding threshold: %d" % exceeding) ++ info(f"Samples exceeding threshold: {exceeding}") + + if detect.have_msr: + finishsmi = detect.getsmicounts() +@@ -527,8 +527,8 @@ if __name__ == '__main__': + if count > detect.initsmi[i]: + smis = count - detect.initsmi[i] + total_smis += smis +- print("%d SMIs occured on cpu %d" % (smis, i)) +- info("SMIs during run: %d" % total_smis) ++ print(f"{smis} SMIs occured on cpu {i}") ++ info(f"SMIs during run: {total_smis}") + + maxlatency = int(detect.get("max")) + +-- +2.31.1 +