perf test: Restore sample rate for perf_event_attr
authorVeronika Molnarova <vmolnaro@redhat.com>
Thu, 3 Oct 2024 12:51:36 +0000 (14:51 +0200)
committerNamhyung Kim <namhyung@kernel.org>
Thu, 3 Oct 2024 16:46:12 +0000 (09:46 -0700)
Test "Setup struct perf_event_attr" consists of multiple test cases that
can affect the max sample rate value for perf events. Some test cases
check this value as it should not be lowered under the set minimum for
the given test. Currently, it is possible for the test cases to affect
each other as the previous tests can lower the sample rate, leading to
a possible failure of some of the future test cases as the value is not
restored at any point.

   # 10: Setup struct perf_event_attr:
    --- start ---
    test child forked, pid 104220
    Using CPUID 0x00000000413fd0c1
    running './tests/attr/test-record-C0'
    Current sample rate: 10000
    running './tests/attr/test-record-basic'
    Current sample rate: 900
    running './tests/attr/test-record-branch-any'
    Current sample rate: 600
    running './tests/attr/test-record-dummy-C0'
    Current sample rate: 600
    expected sample_period=4000, got 600
    FAILED './tests/attr/test-record-dummy-C0' - match failure

Restore the max sample rate value for perf events to a reasonable value
before each test case if its value was lowered too much to ensure the
same conditions for each test case.

   # 10: Setup struct perf_event_attr:
    --- start ---
    test child forked, pid 107222
    Using CPUID 0x00000000413fd0c1
    running './tests/attr/test-record-C0'
    Current sample rate: 10000
    running './tests/attr/test-record-basic'
    Current sample rate: 800
    running './tests/attr/test-record-branch-any'
    Current sample rate: 700
    unsupp  './tests/attr/test-record-branch-any'
    running './tests/attr/test-record-branch-filter-any'
    Current sample rate: 10000
    running './tests/attr/test-record-count'
    Current sample rate: 10000
    running './tests/attr/test-record-data'
    Current sample rate: 600
    running './tests/attr/test-record-dummy-C0'
    Current sample rate: 800
    running './tests/attr/test-record-freq'
    Current sample rate: 10000
    ...

Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Radostin Stoyanov <rstoyano@redhat.com>
Signed-off-by: Veronika Molnarova <vmolnaro@redhat.com>
Link: https://lore.kernel.org/r/20241003125136.15918-1-vmolnaro@redhat.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/tests/attr.py

index e890c261ad2695d83061be879a280778a283c79a..3db9a7d78715f1d941a7af0f8d667049a82f97c4 100644 (file)
@@ -246,6 +246,23 @@ class Test(object):
                 return False
         return True
 
+    def restore_sample_rate(self, value=10000):
+        try:
+            # Check value of sample_rate
+            with open("/proc/sys/kernel/perf_event_max_sample_rate", "r") as fIn:
+                curr_value = fIn.readline()
+            # If too low restore to reasonable value
+            if not curr_value or int(curr_value) < int(value):
+                with open("/proc/sys/kernel/perf_event_max_sample_rate", "w") as fOut:
+                    fOut.write(str(value))
+
+        except IOError as e:
+            log.warning("couldn't restore sample_rate value: I/O error %s" % e)
+        except ValueError as e:
+            log.warning("couldn't restore sample_rate value: Value error %s" % e)
+        except TypeError as e:
+            log.warning("couldn't restore sample_rate value: Type error %s" % e)
+
     def load_events(self, path, events):
         parser_event = configparser.ConfigParser()
         parser_event.read(path)
@@ -283,6 +300,7 @@ class Test(object):
         if self.skip_test_kernel_until():
             raise Notest(self, "new kernel skip")
 
+        self.restore_sample_rate()
         cmd = "PERF_TEST_ATTR=%s %s %s -o %s/perf.data %s" % (tempdir,
               self.perf, self.command, tempdir, self.args)
         ret = os.WEXITSTATUS(os.system(cmd))