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 <lleshchi@redhat.com>
This commit is contained in:
Leah Leshchinsky 2022-11-14 10:55:51 -05:00
parent 5463623d28
commit edf57d7dee
No known key found for this signature in database
GPG Key ID: 1674BC3F464A7C0C
4 changed files with 307 additions and 2 deletions

View File

@ -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 <lleshchi@redhat.com> - 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 <jkacur@redhat.com> - 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 <jkacur@redhat.com> - 2.4-3
- Remove arbitrary limits on number of threads

View File

@ -0,0 +1,34 @@
From 8c7532b710390882ffd7e96d50e75fce99a8249f Mon Sep 17 00:00:00 2001
From: John Kacur <jkacur@redhat.com>
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 <jkacur@redhat.com>
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

View File

@ -0,0 +1,34 @@
From 1eaa7feae3225ae82d00d2e1f02986e34c31a38d Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
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 <lleshchi@redhat.com>
Signed-off-by: John Kacur <jkacur@redhat.com>
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

View File

@ -0,0 +1,225 @@
From d9acad79fa157f90522b3dc2b745bbb3b72fef1d Mon Sep 17 00:00:00 2001
From: Leah Leshchinsky <lleshchi@redhat.com>
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 <lleshchi@redhat.com>
Signed-off-by: John Kacur <jkacur@redhat.com>
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