From 1f1c270c9dd217fb0d01a41e69a2a10ce597606e Mon Sep 17 00:00:00 2001 From: Kumar Date: Mon, 18 May 2026 10:55:57 +0530 Subject: [PATCH 1/3] [avocado-misc] Perf: Use the built perf binary - Introduced support for specifying a custom perf binary path. - Updated perf test scripts to use ensure_tool() from distro_packages for handling dependent packages when a perf binary path is provided. - Added corresponding .data/ YAML files for test configuration. Signed-off-by: Sumit Kumar Co-authored-by: Cursor --- perf/perf_basic.py | 37 ++++++++-------- perf/perf_basic.py.data/perf_basic.yaml | 1 + perf/perf_duplicate_probe.py | 36 ++++++++-------- .../perf_basic.yaml | 1 + perf/perf_events_crash_test.py | 35 ++++++++------- .../perf_basic.yaml | 1 + perf/perf_events_test.py | 39 ++++++++--------- perf/perf_events_test.py.data/perf_basic.yaml | 1 + perf/perf_script_bug.py | 40 +++++++++-------- perf/perf_script_bug.py.data/perf_basic.yaml | 1 + perf/perfmon.py | 34 +++++++++------ perf/perfmon.py.data/perf_basic.yaml | 1 + perf/perftool_test.py | 43 ++++++++++--------- perf/perftool_test.py.data/perf_basic.yaml | 1 + 14 files changed, 140 insertions(+), 131 deletions(-) create mode 100644 perf/perf_basic.py.data/perf_basic.yaml create mode 100644 perf/perf_duplicate_probe.py.data/perf_basic.yaml create mode 100644 perf/perf_events_crash_test.py.data/perf_basic.yaml create mode 100644 perf/perf_events_test.py.data/perf_basic.yaml create mode 100644 perf/perf_script_bug.py.data/perf_basic.yaml create mode 100644 perf/perfmon.py.data/perf_basic.yaml create mode 100644 perf/perftool_test.py.data/perf_basic.yaml diff --git a/perf/perf_basic.py b/perf/perf_basic.py index b988d603c..7a19600af 100644 --- a/perf/perf_basic.py +++ b/perf/perf_basic.py @@ -18,8 +18,8 @@ import re import tempfile from avocado import Test -from avocado.utils import process, distro, dmesg -from avocado.utils.software_manager.manager import SoftwareManager +from avocado.utils import process, dmesg +from avocado.utils.software_manager.distro_packages import ensure_tool class PerfBasic(Test): @@ -59,28 +59,25 @@ def run_cmd(self, cmd, verbose=True): 'Segmentation fault']) def setUp(self): - smg = SoftwareManager() - dist = distro.detect() - if dist.name in ['Ubuntu']: - linux_tools = "linux-tools-" + os.uname()[2] - pkgs = [linux_tools] - if dist.name in ['Ubuntu']: - pkgs.extend(['linux-tools-common']) - elif dist.name in ['debian']: - pkgs = ['linux-perf'] - elif dist.name in ['centos', 'fedora', 'rhel', 'SuSE']: - pkgs = ['perf'] - else: - self.cancel("perf is not supported on %s" % dist.name) + perf_path = self.params.get('perf_bin', default='') + distro_pkg_map = { + "Ubuntu": [f"linux-tools-{os.uname()[2]}", "linux-tools-common", "gcc", "make"], + "debian": ["linux-perf"], + "centos": ["perf"], + "fedora": ["perf"], + "rhel": ["perf"], + "SuSE": ["perf"], + } + try: + perf_version = ensure_tool("perf", custom_path=perf_path, distro_pkg_map=distro_pkg_map) + self.log.info(f"Perf version: {perf_version}") + self.perf_bin = perf_path if perf_path else "perf" + except RuntimeError as e: + self.cancel(str(e)) self.temp_file = tempfile.NamedTemporaryFile().name dmesg.clear_dmesg() - for pkg in pkgs: - if not smg.check_installed(pkg) and not smg.install(pkg): - self.cancel( - "Package %s is missing/could not be installed" % pkg) - def test_perf_help(self): self.run_cmd("perf --help", False) diff --git a/perf/perf_basic.py.data/perf_basic.yaml b/perf/perf_basic.py.data/perf_basic.yaml new file mode 100644 index 000000000..a05c90006 --- /dev/null +++ b/perf/perf_basic.py.data/perf_basic.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perf_duplicate_probe.py b/perf/perf_duplicate_probe.py index ef53a306f..853a704e9 100644 --- a/perf/perf_duplicate_probe.py +++ b/perf/perf_duplicate_probe.py @@ -14,10 +14,10 @@ # Copyright: 2019 IBM # Author: Shirisha G -import platform +import os from avocado import Test -from avocado.utils import distro, genio, process -from avocado.utils.software_manager.manager import SoftwareManager +from avocado.utils import process, genio +from avocado.utils.software_manager.distro_packages import ensure_tool class PerfDuplicateProbe(Test): @@ -27,21 +27,21 @@ def setUp(self): Install the basic packages to support perf and systemtap-sdt-devel ''' # Check for basic utilities - smm = SoftwareManager() - distro_name = distro.detect().name - deps = [] - run_type = self.params.get('type', default='distro') - if 'Ubuntu' in distro_name: - deps.extend(['linux-tools-common', 'linux-tools-%s' % - platform.uname()[2]]) - elif distro_name in ['rhel', 'SuSE', 'fedora', 'centos']: - deps.extend(['perf']) - else: - self.cancel("Install the package for perf supported\ - by %s" % distro_name) - for package in deps: - if not smm.check_installed(package) and not smm.install(package): - self.cancel('%s is needed for the test to be run' % package) + perf_path = self.params.get('perf_bin', default='') + distro_pkg_map = { + "Ubuntu": [f"linux-tools-{os.uname()[2]}", "linux-tools-common", "gcc", "make"], + "debian": ["linux-perf"], + "centos": ["perf"], + "fedora": ["perf"], + "rhel": ["perf"], + "SuSE": ["perf"], + } + try: + perf_version = ensure_tool("perf", custom_path=perf_path, distro_pkg_map=distro_pkg_map) + self.log.info(f"Perf version: {perf_version}") + self.perf_bin = perf_path if perf_path else "perf" + except RuntimeError as e: + self.cancel(str(e)) self.fail_flag = False def _check_duplicate_probe(self, outpt): diff --git a/perf/perf_duplicate_probe.py.data/perf_basic.yaml b/perf/perf_duplicate_probe.py.data/perf_basic.yaml new file mode 100644 index 000000000..a05c90006 --- /dev/null +++ b/perf/perf_duplicate_probe.py.data/perf_basic.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perf_events_crash_test.py b/perf/perf_events_crash_test.py index e4a2bf1df..616d9752c 100644 --- a/perf/perf_events_crash_test.py +++ b/perf/perf_events_crash_test.py @@ -15,11 +15,10 @@ # Author:Kamalesh Babulal # -import platform import os from avocado import Test -from avocado.utils import archive, build, process, distro -from avocado.utils.software_manager.manager import SoftwareManager +from avocado.utils import archive, build, process +from avocado.utils.software_manager.distro_packages import ensure_tool class Perf_crashevent(Test): @@ -40,21 +39,21 @@ def setUp(self): Install the packages ''' # Check for basic utilities - smm = SoftwareManager() - detected_distro = distro.detect() - deps = ['gcc', 'make'] - if 'Ubuntu' in detected_distro.name: - kernel_ver = platform.uname()[2] - deps.extend(['linux-tools-common', 'linux-tools-%s' - % kernel_ver]) - elif detected_distro.name in ['rhel', 'SuSE', 'fedora']: - deps.extend(['perf']) - else: - self.cancel("Install the package for perf supported by %s" - % detected_distro.name) - for package in deps: - if not smm.check_installed(package) and not smm.install(package): - self.cancel('%s is needed for the test to be run' % package) + perf_path = self.params.get('perf_bin', default='') + distro_pkg_map = { + "Ubuntu": [f"linux-tools-{os.uname()[2]}", "linux-tools-common", "gcc", "make"], + "debian": ["linux-perf", "gcc", "make"], + "centos": ["perf", "gcc", "make", "gcc-c++"], + "fedora": ["perf", "gcc", "make", "gcc-c++"], + "rhel": ["perf", "gcc", "make", "gcc-c++"], + "SuSE": ["perf", "gcc", "make", "gcc-c++"], + } + try: + perf_version = ensure_tool("perf", custom_path=perf_path, distro_pkg_map=distro_pkg_map) + self.log.info(f"Perf version: {perf_version}") + self.perf_bin = perf_path if perf_path else "perf" + except RuntimeError as e: + self.cancel(str(e)) def build_perf_test(self): """ diff --git a/perf/perf_events_crash_test.py.data/perf_basic.yaml b/perf/perf_events_crash_test.py.data/perf_basic.yaml new file mode 100644 index 000000000..a05c90006 --- /dev/null +++ b/perf/perf_events_crash_test.py.data/perf_basic.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perf_events_test.py b/perf/perf_events_test.py index 9565facb0..5312db582 100755 --- a/perf/perf_events_test.py +++ b/perf/perf_events_test.py @@ -15,15 +15,13 @@ # Author:Shriya Kulkarni # -import platform import os from avocado import Test -from avocado.utils import archive, build, process, distro, genio -from avocado.utils.software_manager.manager import SoftwareManager +from avocado.utils import archive, build, process, genio +from avocado.utils.software_manager.distro_packages import ensure_tool class Perf_subsystem(Test): - """ This series of test is meant to validate that the perf_event subsystem is working @@ -39,24 +37,21 @@ def setUp(self): Install the packages ''' # Check for basic utilities - smm = SoftwareManager() - detected_distro = distro.detect() - deps = ['gcc', 'make'] - if 'Ubuntu' in detected_distro.name: - kernel_ver = platform.uname()[2] - deps.extend(['linux-tools-common', 'linux-tools-%s' - % kernel_ver]) - elif 'debian' in detected_distro.name: - kernel_ver = platform.uname()[2][3] - deps.extend(['linux-tools-%s' % kernel_ver]) - elif detected_distro.name in ['rhel', 'SuSE', 'fedora']: - deps.extend(['perf']) - else: - self.cancel("Install the package for perf supported by %s" - % detected_distro.name) - for package in deps: - if not smm.check_installed(package) and not smm.install(package): - self.cancel('%s is needed for the test to be run' % package) + perf_path = self.params.get('perf_bin', default='') + distro_pkg_map = { + "Ubuntu": [f"linux-tools-{os.uname()[2]}", "linux-tools-common", "gcc", "make"], + "debian": ["linux-perf", "gcc", "make"], + "centos": ["perf", "gcc", "make", "gcc-c++"], + "fedora": ["perf", "gcc", "make", "gcc-c++"], + "rhel": ["perf", "gcc", "make", "gcc-c++"], + "SuSE": ["perf", "gcc", "make", "gcc-c++"], + } + try: + perf_version = ensure_tool("perf", custom_path=perf_path, distro_pkg_map=distro_pkg_map) + self.log.info(f"Perf version: {perf_version}") + self.perf_bin = perf_path if perf_path else "perf" + except RuntimeError as e: + self.cancel(str(e)) def build_perf_test(self): """ diff --git a/perf/perf_events_test.py.data/perf_basic.yaml b/perf/perf_events_test.py.data/perf_basic.yaml new file mode 100644 index 000000000..a05c90006 --- /dev/null +++ b/perf/perf_events_test.py.data/perf_basic.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perf_script_bug.py b/perf/perf_script_bug.py index 7583d416c..165f141b9 100644 --- a/perf/perf_script_bug.py +++ b/perf/perf_script_bug.py @@ -15,13 +15,12 @@ # Author: Shirisha import os -import platform import tempfile import shutil import configparser from avocado import Test -from avocado.utils import build, distro, process -from avocado.utils.software_manager.manager import SoftwareManager +from avocado.utils import build, process, distro +from avocado.utils.software_manager.distro_packages import ensure_tool class PerfScript(Test): @@ -31,24 +30,29 @@ def setUp(self): Install the basic packages to support PerfProbe test ''' # Check for basic utilities - smm = SoftwareManager() - detected_distro = distro.detect() + perf_path = self.params.get('perf_bin', default='') parser = configparser.ConfigParser() parser.read(self.get_data('probe.cfg')) - self.perf_probe = parser.get(detected_distro.name, 'probepoint') - deps = ['gcc', 'make'] - if detected_distro.name in ['rhel', 'SuSE', 'fedora', 'centos']: - deps.extend(['perf']) - elif detected_distro.name in ['Ubuntu']: - deps.extend(['linux-tools-common', 'linux-tools-%s' % - platform.uname()[2]]) + # self.perf_probe = parser.get(detected_distro.name, 'probepoint') + distro_pkg_map = { + "Ubuntu": [f"linux-tools-{os.uname()[2]}", "linux-tools-common", "gcc", "make"], + "debian": ["linux-perf", "gcc", "make"], + "centos": ["perf", "gcc", "make", "gcc-c++"], + "fedora": ["perf", "gcc", "make", "gcc-c++"], + "rhel": ["perf", "gcc", "make", "gcc-c++"], + "SuSE": ["perf", "gcc", "make", "gcc-c++"], + } + try: + perf_version = ensure_tool("perf", custom_path=perf_path, distro_pkg_map=distro_pkg_map) + self.log.info(f"Perf version: {perf_version}") + self.perf_bin = perf_path if perf_path else "perf" + except RuntimeError as e: + self.cancel(str(e)) + dist_name = distro.detect().name + if parser.has_section(dist_name): + self.perf_probe = parser.get(dist_name, 'probepoint') else: - self.cancel("Install the package perf\ - for %s" % detected_distro.name) - for package in deps: - if not smm.check_installed(package) and not smm.install(package): - self.cancel('%s is needed for the test to be run' % package) - + self.perf_probe = parser.get('Ubuntu', 'probepoint') shutil.copyfile(self.get_data('perf_test.c'), os.path.join(self.teststmpdir, 'perf_test.c')) shutil.copyfile(self.get_data('Makefile'), diff --git a/perf/perf_script_bug.py.data/perf_basic.yaml b/perf/perf_script_bug.py.data/perf_basic.yaml new file mode 100644 index 000000000..a05c90006 --- /dev/null +++ b/perf/perf_script_bug.py.data/perf_basic.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perfmon.py b/perf/perfmon.py index 024b28423..1ac33fce6 100644 --- a/perf/perfmon.py +++ b/perf/perfmon.py @@ -18,8 +18,8 @@ import os from avocado import Test -from avocado.utils import process, build, git, distro -from avocado.utils.software_manager.manager import SoftwareManager +from avocado.utils import process, build, git +from avocado.utils.software_manager.distro_packages import ensure_tool class Perfmon(Test): @@ -32,18 +32,24 @@ class Perfmon(Test): def setUp(self): # Check for basic utilities - smm = SoftwareManager() - dist = distro.detect() - - deps = ["gcc", "make"] - if dist.name in ['Ubuntu', 'debian']: - deps.extend(['libncurses-dev']) - elif dist.name in ['rhel', 'SuSE']: - deps.extend(['ncurses-devel']) - for package in deps: - if not smm.check_installed(package) and not smm.install(package): - self.cancel( - "Fail to install %s required for this test." % package) + perf_path = self.params.get('perf_bin', default='') + + # Define distro-aware package map for build deps + distro_pkg_map = { + "Ubuntu": ["libncurses-dev", "gcc", "make"], + "debian": ["libncurses-dev", "gcc", "make"], + "centos": ["ncurses-devel", "gcc", "make"], + "fedora": ["ncurses-devel", "gcc", "make"], + "rhel": ["ncurses-devel", "gcc", "make"], + "SuSE": ["ncurses-devel", "gcc", "make"], + } + + try: + # Ensure toolchain and ncurses dev packages are present + ensure_tool("gcc", distro_pkg_map=distro_pkg_map) + ensure_tool("make", distro_pkg_map=distro_pkg_map) + except RuntimeError as e: + self.cancel(str(e)) git.get_repo('https://git.code.sf.net/p/perfmon2/libpfm4', destination_dir=self.workdir) diff --git a/perf/perfmon.py.data/perf_basic.yaml b/perf/perfmon.py.data/perf_basic.yaml new file mode 100644 index 000000000..a05c90006 --- /dev/null +++ b/perf/perfmon.py.data/perf_basic.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perftool_test.py b/perf/perftool_test.py index 5f121eea7..9ba791060 100644 --- a/perf/perftool_test.py +++ b/perf/perftool_test.py @@ -16,14 +16,12 @@ # :Sachin Sant import os -import platform from avocado import Test -from avocado.utils import archive, build, distro -from avocado.utils.software_manager.manager import SoftwareManager +from avocado.utils import archive, build +from avocado.utils.software_manager.distro_packages import ensure_tool class Perftool(Test): - """ perftool-testsuite :avocado: tags=perf,testsuite @@ -35,23 +33,26 @@ def setUp(self): ''' # Check for basic utilities - smm = SoftwareManager() - detected_distro = distro.detect() - deps = ['gcc', 'make'] - if 'Ubuntu' in detected_distro.name: - deps.extend(['linux-tools-common', 'linux-tools-%s' % - platform.uname()[2]]) - elif 'debian' in detected_distro.name: - deps.extend(['linux-tools-%s' % platform.uname()[2][3]]) - elif detected_distro.name in ['rhel', 'SuSE', 'fedora', - 'centos']: - deps.extend(['perf', 'gcc-c++']) - else: - self.cancel("Install the package for perf supported\ - by %s" % detected_distro.name) - for package in deps: - if not smm.check_installed(package) and not smm.install(package): - self.cancel('%s is needed for the test to be run' % package) + perf_path = self.params.get('perf_bin', default='') + + # Define distro-aware package map for perf and build deps + distro_pkg_map = { + "Ubuntu": [f"linux-tools-{os.uname()[2]}", "linux-tools-common", "gcc", "make"], + "debian": [f"linux-tools-{os.uname()[2][3]}", "gcc", "make"], + "centos": ["perf", "gcc", "make", "gcc-c++"], + "fedora": ["perf", "gcc", "make", "gcc-c++"], + "rhel": ["perf", "gcc", "make", "gcc-c++"], + "SuSE": ["perf", "gcc", "make", "gcc-c++"], + } + + try: + perf_version = ensure_tool("perf", + custom_path=perf_path, + distro_pkg_map=distro_pkg_map) + self.log.info(f"Perf version: {perf_version}") + self.perf_bin = perf_path if perf_path else "perf" + except RuntimeError as e: + self.cancel(str(e)) locations = ["https://github.com/rfmvh/perftool-testsuite/archive/" "master.zip"] diff --git a/perf/perftool_test.py.data/perf_basic.yaml b/perf/perftool_test.py.data/perf_basic.yaml new file mode 100644 index 000000000..a05c90006 --- /dev/null +++ b/perf/perftool_test.py.data/perf_basic.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' \ No newline at end of file From 67aad1f00b9b978c37374b008ad31094d325a013 Mon Sep 17 00:00:00 2001 From: Kumar Date: Mon, 18 May 2026 10:56:03 +0530 Subject: [PATCH 2/3] perf: Address review feedback for perf tests - Rename .data YAML files to match test module names; set perf_bin to /tmp/perf. - Restore perf_duplicate.yaml mux (run_type) for perf_duplicate_probe. - perfmon: mux perf_bin without ensure_tool; install only build deps. - perf_script_bug: align with ensure_tool and perf_script_bug.yaml naming. Signed-off-by: Sumit Kumar Co-authored-by: Cursor --- perf/perf_basic.py.data/perf_basic.yaml | 2 +- .../perf_basic.yaml | 1 - .../perf_duplicate_probe.yaml | 1 + .../perf_basic.yaml | 1 - .../perf_events_crash_test.yaml | 1 + perf/perf_events_test.py.data/perf_basic.yaml | 1 - .../perf_events_test.yaml | 1 + perf/perf_script_bug.py | 12 ++-- perf/perf_script_bug.py.data/perf_basic.yaml | 1 - .../perf_script_bug.yaml | 1 + perf/perfmon.py | 63 ++++++++++++------- perf/perfmon.py.data/perf_basic.yaml | 1 - perf/perfmon.py.data/perfmon.yaml | 1 + perf/perftool_test.py.data/perf_basic.yaml | 1 - perf/perftool_test.py.data/perftool_test.yaml | 1 + 15 files changed, 56 insertions(+), 33 deletions(-) delete mode 100644 perf/perf_duplicate_probe.py.data/perf_basic.yaml create mode 100644 perf/perf_duplicate_probe.py.data/perf_duplicate_probe.yaml delete mode 100644 perf/perf_events_crash_test.py.data/perf_basic.yaml create mode 100644 perf/perf_events_crash_test.py.data/perf_events_crash_test.yaml delete mode 100644 perf/perf_events_test.py.data/perf_basic.yaml create mode 100644 perf/perf_events_test.py.data/perf_events_test.yaml delete mode 100644 perf/perf_script_bug.py.data/perf_basic.yaml create mode 100644 perf/perf_script_bug.py.data/perf_script_bug.yaml delete mode 100644 perf/perfmon.py.data/perf_basic.yaml create mode 100644 perf/perfmon.py.data/perfmon.yaml delete mode 100644 perf/perftool_test.py.data/perf_basic.yaml create mode 100644 perf/perftool_test.py.data/perftool_test.yaml diff --git a/perf/perf_basic.py.data/perf_basic.yaml b/perf/perf_basic.py.data/perf_basic.yaml index a05c90006..1f2c3a9ee 100644 --- a/perf/perf_basic.py.data/perf_basic.yaml +++ b/perf/perf_basic.py.data/perf_basic.yaml @@ -1 +1 @@ -perf_bin: '/tmp/perf' \ No newline at end of file +perf_bin: '/tmp/perf' diff --git a/perf/perf_duplicate_probe.py.data/perf_basic.yaml b/perf/perf_duplicate_probe.py.data/perf_basic.yaml deleted file mode 100644 index a05c90006..000000000 --- a/perf/perf_duplicate_probe.py.data/perf_basic.yaml +++ /dev/null @@ -1 +0,0 @@ -perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perf_duplicate_probe.py.data/perf_duplicate_probe.yaml b/perf/perf_duplicate_probe.py.data/perf_duplicate_probe.yaml new file mode 100644 index 000000000..1f2c3a9ee --- /dev/null +++ b/perf/perf_duplicate_probe.py.data/perf_duplicate_probe.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' diff --git a/perf/perf_events_crash_test.py.data/perf_basic.yaml b/perf/perf_events_crash_test.py.data/perf_basic.yaml deleted file mode 100644 index a05c90006..000000000 --- a/perf/perf_events_crash_test.py.data/perf_basic.yaml +++ /dev/null @@ -1 +0,0 @@ -perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perf_events_crash_test.py.data/perf_events_crash_test.yaml b/perf/perf_events_crash_test.py.data/perf_events_crash_test.yaml new file mode 100644 index 000000000..1f2c3a9ee --- /dev/null +++ b/perf/perf_events_crash_test.py.data/perf_events_crash_test.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' diff --git a/perf/perf_events_test.py.data/perf_basic.yaml b/perf/perf_events_test.py.data/perf_basic.yaml deleted file mode 100644 index a05c90006..000000000 --- a/perf/perf_events_test.py.data/perf_basic.yaml +++ /dev/null @@ -1 +0,0 @@ -perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perf_events_test.py.data/perf_events_test.yaml b/perf/perf_events_test.py.data/perf_events_test.yaml new file mode 100644 index 000000000..1f2c3a9ee --- /dev/null +++ b/perf/perf_events_test.py.data/perf_events_test.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' diff --git a/perf/perf_script_bug.py b/perf/perf_script_bug.py index 165f141b9..2d092d13d 100644 --- a/perf/perf_script_bug.py +++ b/perf/perf_script_bug.py @@ -33,7 +33,6 @@ def setUp(self): perf_path = self.params.get('perf_bin', default='') parser = configparser.ConfigParser() parser.read(self.get_data('probe.cfg')) - # self.perf_probe = parser.get(detected_distro.name, 'probepoint') distro_pkg_map = { "Ubuntu": [f"linux-tools-{os.uname()[2]}", "linux-tools-common", "gcc", "make"], "debian": ["linux-perf", "gcc", "make"], @@ -63,13 +62,16 @@ def setUp(self): def test_script_probe(self): # Creating temporary file to collect the perf.data self.temp_file = tempfile.NamedTemporaryFile().name - probe = "perf probe -x perf_test 'perf_test.c:%s'" % self.perf_probe + probe = "%s probe -x perf_test 'perf_test.c:%s'" % ( + self.perf_bin, self.perf_probe) process.run(probe, sudo=True, shell=True) - record = "perf record -e \'{cpu/cpu-cycles,period=10000/,probe_perf_test:main}:S\' -o %s ./perf_test" % self.temp_file + record = ("%s record -e '{cpu/cpu-cycles,period=10000/," + "probe_perf_test:main}:S' -o %s ./perf_test" % ( + self.perf_bin, self.temp_file)) process.run(record, sudo=True, shell=True) - output = process.run("perf script -i %s" % self.temp_file, + output = process.run("%s script -i %s" % (self.perf_bin, self.temp_file), ignore_status=True, sudo=True, shell=True) - probe_del = "perf probe -d probe_perf_test:main" + probe_del = "%s probe -d probe_perf_test:main" % self.perf_bin process.run(probe_del) if output.exit_status == -11: self.fail("perf script command segfaulted") diff --git a/perf/perf_script_bug.py.data/perf_basic.yaml b/perf/perf_script_bug.py.data/perf_basic.yaml deleted file mode 100644 index a05c90006..000000000 --- a/perf/perf_script_bug.py.data/perf_basic.yaml +++ /dev/null @@ -1 +0,0 @@ -perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perf_script_bug.py.data/perf_script_bug.yaml b/perf/perf_script_bug.py.data/perf_script_bug.yaml new file mode 100644 index 000000000..1f2c3a9ee --- /dev/null +++ b/perf/perf_script_bug.py.data/perf_script_bug.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' diff --git a/perf/perfmon.py b/perf/perfmon.py index 1ac33fce6..5cd36ce64 100644 --- a/perf/perfmon.py +++ b/perf/perfmon.py @@ -18,38 +18,51 @@ import os from avocado import Test -from avocado.utils import process, build, git -from avocado.utils.software_manager.distro_packages import ensure_tool +from avocado.utils import process, build, git, distro +from avocado.utils.software_manager.manager import SoftwareManager class Perfmon(Test): """ - performance monitoring on Linux : test perf_events on Linux + performance monitoring on Linux : test perf_events on Linux :avocado: tags=perf,perfmon """ def setUp(self): - # Check for basic utilities - perf_path = self.params.get('perf_bin', default='') + # libpfm4 build deps only (gcc, make, ncurses) — no linux-tools / perf packages here. + smm = SoftwareManager() + dist = distro.detect() - # Define distro-aware package map for build deps - distro_pkg_map = { - "Ubuntu": ["libncurses-dev", "gcc", "make"], - "debian": ["libncurses-dev", "gcc", "make"], - "centos": ["ncurses-devel", "gcc", "make"], - "fedora": ["ncurses-devel", "gcc", "make"], - "rhel": ["ncurses-devel", "gcc", "make"], - "SuSE": ["ncurses-devel", "gcc", "make"], - } + deps = ["gcc", "make"] + if dist.name in ['Ubuntu', 'debian']: + deps.extend(['libncurses-dev']) + elif dist.name in ['rhel', 'SuSE']: + deps.extend(['ncurses-devel']) + for package in deps: + if not smm.check_installed(package) and not smm.install(package): + self.cancel( + "Fail to install %s required for this test." % package) - try: - # Ensure toolchain and ncurses dev packages are present - ensure_tool("gcc", distro_pkg_map=distro_pkg_map) - ensure_tool("make", distro_pkg_map=distro_pkg_map) - except RuntimeError as e: - self.cancel(str(e)) + # Optional mux: `perf_bin` in perfmon.py.data/*.yaml — tests/validate uses `perf` from PATH. + perf_path = (self.params.get('perf_bin', default='') or '').strip() + self._mux_perf_bin = bool(perf_path) + self._saved_path = os.environ.get("PATH", "") + if perf_path: + if not os.path.isfile(perf_path): + self.cancel("perf not found at %s" % perf_path) + ret = process.run("%s --version" % perf_path, ignore_status=True, + shell=True) + if ret.exit_status != 0: + self.cancel("perf at %s is not functional" % perf_path) + ver = getattr(ret, "stdout_text", ret.stdout.decode()).strip() + self.log.info("Perf version: %s", ver) + self.perf_bin = perf_path + bindir = os.path.dirname(os.path.abspath(perf_path)) + os.environ["PATH"] = bindir + os.pathsep + self._saved_path + else: + self.perf_bin = "perf" git.get_repo('https://git.code.sf.net/p/perfmon2/libpfm4', destination_dir=self.workdir) @@ -60,7 +73,15 @@ def setUp(self): def test(self): + self.log.info("Running tests/validate with perf resolved as: %s", + self.perf_bin) out = process.system_output('%s ' % os.path.join( - self.workdir, 'tests/validate')).decode("utf-8") + self.workdir, 'tests', 'validate')) + if isinstance(out, bytes): + out = out.decode("utf-8") if 'fail' in out: self.fail("test failed:check manually") + + def tearDown(self): + if getattr(self, "_mux_perf_bin", False): + os.environ["PATH"] = self._saved_path diff --git a/perf/perfmon.py.data/perf_basic.yaml b/perf/perfmon.py.data/perf_basic.yaml deleted file mode 100644 index a05c90006..000000000 --- a/perf/perfmon.py.data/perf_basic.yaml +++ /dev/null @@ -1 +0,0 @@ -perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perfmon.py.data/perfmon.yaml b/perf/perfmon.py.data/perfmon.yaml new file mode 100644 index 000000000..1f2c3a9ee --- /dev/null +++ b/perf/perfmon.py.data/perfmon.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' diff --git a/perf/perftool_test.py.data/perf_basic.yaml b/perf/perftool_test.py.data/perf_basic.yaml deleted file mode 100644 index a05c90006..000000000 --- a/perf/perftool_test.py.data/perf_basic.yaml +++ /dev/null @@ -1 +0,0 @@ -perf_bin: '/tmp/perf' \ No newline at end of file diff --git a/perf/perftool_test.py.data/perftool_test.yaml b/perf/perftool_test.py.data/perftool_test.yaml new file mode 100644 index 000000000..1f2c3a9ee --- /dev/null +++ b/perf/perftool_test.py.data/perftool_test.yaml @@ -0,0 +1 @@ +perf_bin: '/tmp/perf' From db52022b067198cb52ef5371126bdd318d02098b Mon Sep 17 00:00:00 2001 From: Kumar Date: Mon, 25 May 2026 12:44:15 +0530 Subject: [PATCH 3/3] perf/perfmon: drop unused perf_bin mux and stale comment Address review feedback from @disgoel on PR #3087: - Remove the perf_bin mux block in setUp(); tests/validate uses system perf via PATH, so self.perf_bin was never consumed. - Drop associated state (_mux_perf_bin, _saved_path) and PATH restore logic that only existed to support the dead block. - Remove the unnecessary "libpfm4 build deps only" comment. - Trim now-dead perf_bin entries from perfmon.py.data yaml(s). Signed-off-by: Sumit Kumar Co-authored-by: Cursor --- perf/perfmon.py | 26 -------------------------- perf/perfmon.py.data/perfmon.yaml | 1 - 2 files changed, 27 deletions(-) delete mode 100644 perf/perfmon.py.data/perfmon.yaml diff --git a/perf/perfmon.py b/perf/perfmon.py index 5cd36ce64..a18e68144 100644 --- a/perf/perfmon.py +++ b/perf/perfmon.py @@ -31,7 +31,6 @@ class Perfmon(Test): def setUp(self): - # libpfm4 build deps only (gcc, make, ncurses) — no linux-tools / perf packages here. smm = SoftwareManager() dist = distro.detect() @@ -45,25 +44,6 @@ def setUp(self): self.cancel( "Fail to install %s required for this test." % package) - # Optional mux: `perf_bin` in perfmon.py.data/*.yaml — tests/validate uses `perf` from PATH. - perf_path = (self.params.get('perf_bin', default='') or '').strip() - self._mux_perf_bin = bool(perf_path) - self._saved_path = os.environ.get("PATH", "") - if perf_path: - if not os.path.isfile(perf_path): - self.cancel("perf not found at %s" % perf_path) - ret = process.run("%s --version" % perf_path, ignore_status=True, - shell=True) - if ret.exit_status != 0: - self.cancel("perf at %s is not functional" % perf_path) - ver = getattr(ret, "stdout_text", ret.stdout.decode()).strip() - self.log.info("Perf version: %s", ver) - self.perf_bin = perf_path - bindir = os.path.dirname(os.path.abspath(perf_path)) - os.environ["PATH"] = bindir + os.pathsep + self._saved_path - else: - self.perf_bin = "perf" - git.get_repo('https://git.code.sf.net/p/perfmon2/libpfm4', destination_dir=self.workdir) @@ -73,15 +53,9 @@ def setUp(self): def test(self): - self.log.info("Running tests/validate with perf resolved as: %s", - self.perf_bin) out = process.system_output('%s ' % os.path.join( self.workdir, 'tests', 'validate')) if isinstance(out, bytes): out = out.decode("utf-8") if 'fail' in out: self.fail("test failed:check manually") - - def tearDown(self): - if getattr(self, "_mux_perf_bin", False): - os.environ["PATH"] = self._saved_path diff --git a/perf/perfmon.py.data/perfmon.yaml b/perf/perfmon.py.data/perfmon.yaml deleted file mode 100644 index 1f2c3a9ee..000000000 --- a/perf/perfmon.py.data/perfmon.yaml +++ /dev/null @@ -1 +0,0 @@ -perf_bin: '/tmp/perf'