78 lines
2.9 KiB
Diff
78 lines
2.9 KiB
Diff
From ef49ccfab821010319d4ff6b1332fa890889aeac Mon Sep 17 00:00:00 2001
|
|
From: Clark Williams <williams@redhat.com>
|
|
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 <williams@redhat.com>
|
|
Signed-off-by: John Kacur <jkacur@redhat.com>
|
|
---
|
|
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 <williams@redhat.com>
|
|
+# (C) 2018,2019 Clark Williams <williams@redhat.com>
|
|
# (C) 2015,2016 Clark Williams <williams@redhat.com>
|
|
# (C) 2009 Clark Williams <williams@redhat.com>
|
|
#
|
|
@@ -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
|
|
|