From 590f2cb171b2fb66c6b3e2a6bfd0b75ee3f0904d Mon Sep 17 00:00:00 2001 From: Swapnil Sapkal Date: Thu, 12 Oct 2023 09:32:24 +0000 Subject: [PATCH 1/5] selftests/amd-pstate: Fix broken paths to run workloads in amd-pstate-ut ANBZ: #24121 commit 27aabb2c4390561538ca76a5bd418d95037f28d5 upstream. In selftests/amd-pstate, tbench and gitsource microbenchmarks are used to compare the performance with different governors. In current implementation the relative path to run amd_pstate_tracer.py is broken. Fix this by using absolute paths. Signed-off-by: Swapnil Sapkal Reviewed-by: Mario Limonciello Signed-off-by: Shuah Khan Signed-off-by: Qinyun Tan --- .../x86/amd_pstate_tracer/amd_pstate_trace.py | 3 +-- tools/testing/selftests/amd-pstate/gitsource.sh | 17 +++++++++++------ tools/testing/selftests/amd-pstate/run.sh | 9 ++++++--- tools/testing/selftests/amd-pstate/tbench.sh | 2 +- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py b/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py index 904df0ea0a1e..feb9f9421c7b 100755 --- a/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py +++ b/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py @@ -30,8 +30,7 @@ import getopt import Gnuplot from numpy import * from decimal import * -sys.path.append('../intel_pstate_tracer') -#import intel_pstate_tracer +sys.path.append(os.path.join(os.path.dirname(__file__), "..", "intel_pstate_tracer")) import intel_pstate_tracer as ipt __license__ = "GPL version 2" diff --git a/tools/testing/selftests/amd-pstate/gitsource.sh b/tools/testing/selftests/amd-pstate/gitsource.sh index 5f2171f0116d..ab195ddcba4d 100755 --- a/tools/testing/selftests/amd-pstate/gitsource.sh +++ b/tools/testing/selftests/amd-pstate/gitsource.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Testing and monitor the cpu desire performance, frequency, load, @@ -66,12 +66,15 @@ post_clear_gitsource() install_gitsource() { - if [ ! -d $git_name ]; then + if [ ! -d $SCRIPTDIR/$git_name ]; then + pushd $(pwd) > /dev/null 2>&1 + cd $SCRIPTDIR printf "Download gitsource, please wait a moment ...\n\n" wget -O $git_tar $gitsource_url > /dev/null 2>&1 printf "Tar gitsource ...\n\n" tar -xzf $git_tar + popd > /dev/null 2>&1 fi } @@ -79,12 +82,14 @@ install_gitsource() run_gitsource() { echo "Launching amd pstate tracer for $1 #$2 tracer_interval: $TRACER_INTERVAL" - ./amd_pstate_trace.py -n tracer-gitsource-$1-$2 -i $TRACER_INTERVAL > /dev/null 2>&1 & + $TRACER -n tracer-gitsource-$1-$2 -i $TRACER_INTERVAL > /dev/null 2>&1 & printf "Make and test gitsource for $1 #$2 make_cpus: $MAKE_CPUS\n" - cd $git_name - perf stat -a --per-socket -I 1000 -e power/energy-pkg/ /usr/bin/time -o ../$OUTFILE_GIT.time-gitsource-$1-$2.log make test -j$MAKE_CPUS > ../$OUTFILE_GIT-perf-$1-$2.log 2>&1 - cd .. + BACKUP_DIR=$(pwd) + pushd $BACKUP_DIR > /dev/null 2>&1 + cd $SCRIPTDIR/$git_name + perf stat -a --per-socket -I 1000 -e power/energy-pkg/ /usr/bin/time -o $BACKUP_DIR/$OUTFILE_GIT.time-gitsource-$1-$2.log make test -j$MAKE_CPUS > $BACKUP_DIR/$OUTFILE_GIT-perf-$1-$2.log 2>&1 + popd > /dev/null 2>&1 for job in `jobs -p` do diff --git a/tools/testing/selftests/amd-pstate/run.sh b/tools/testing/selftests/amd-pstate/run.sh index de4d8e9c9565..279d073c5728 100755 --- a/tools/testing/selftests/amd-pstate/run.sh +++ b/tools/testing/selftests/amd-pstate/run.sh @@ -8,9 +8,12 @@ else FILE_MAIN=DONE fi -source basic.sh -source tbench.sh -source gitsource.sh +SCRIPTDIR=`dirname "$0"` +TRACER=$SCRIPTDIR/../../../power/x86/amd_pstate_tracer/amd_pstate_trace.py + +source $SCRIPTDIR/basic.sh +source $SCRIPTDIR/tbench.sh +source $SCRIPTDIR/gitsource.sh # amd-pstate-ut only run on x86/x86_64 AMD systems. ARCH=$(uname -m 2>/dev/null | sed -e 's/i.86/x86/' -e 's/x86_64/x86/') diff --git a/tools/testing/selftests/amd-pstate/tbench.sh b/tools/testing/selftests/amd-pstate/tbench.sh index 49c9850341f6..4d2e8ce2da3b 100755 --- a/tools/testing/selftests/amd-pstate/tbench.sh +++ b/tools/testing/selftests/amd-pstate/tbench.sh @@ -64,7 +64,7 @@ post_clear_tbench() run_tbench() { echo "Launching amd pstate tracer for $1 #$2 tracer_interval: $TRACER_INTERVAL" - ./amd_pstate_trace.py -n tracer-tbench-$1-$2 -i $TRACER_INTERVAL > /dev/null 2>&1 & + $TRACER -n tracer-tbench-$1-$2 -i $TRACER_INTERVAL > /dev/null 2>&1 & printf "Test tbench for $1 #$2 time_limit: $TIME_LIMIT procs_num: $PROCESS_NUM\n" tbench_srv > /dev/null 2>&1 & -- Gitee From f8fd93f2d602581683d37598a26cdf269d3ddc72 Mon Sep 17 00:00:00 2001 From: Swapnil Sapkal Date: Thu, 12 Oct 2023 09:32:25 +0000 Subject: [PATCH 2/5] selftests/amd-pstate: Added option to provide perf binary path ANBZ: #24121 commit 0996e6742399e56b547319c4b8061af79be071b2 upstream. In selftests/amd-pstate, distro `perf` is used to capture `perf stat` while running microbenchmarks. Distro `perf` is not working with upstream kernel. Fix this by providing an option to give the perf binary path. Reviewed-by: Mario Limonciello Signed-off-by: Swapnil Sapkal Signed-off-by: Shuah Khan Signed-off-by: Qinyun Tan --- tools/testing/selftests/amd-pstate/gitsource.sh | 2 +- tools/testing/selftests/amd-pstate/run.sh | 12 +++++++++--- tools/testing/selftests/amd-pstate/tbench.sh | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/amd-pstate/gitsource.sh b/tools/testing/selftests/amd-pstate/gitsource.sh index ab195ddcba4d..4cde62f90468 100755 --- a/tools/testing/selftests/amd-pstate/gitsource.sh +++ b/tools/testing/selftests/amd-pstate/gitsource.sh @@ -88,7 +88,7 @@ run_gitsource() BACKUP_DIR=$(pwd) pushd $BACKUP_DIR > /dev/null 2>&1 cd $SCRIPTDIR/$git_name - perf stat -a --per-socket -I 1000 -e power/energy-pkg/ /usr/bin/time -o $BACKUP_DIR/$OUTFILE_GIT.time-gitsource-$1-$2.log make test -j$MAKE_CPUS > $BACKUP_DIR/$OUTFILE_GIT-perf-$1-$2.log 2>&1 + $PERF stat -a --per-socket -I 1000 -e power/energy-pkg/ /usr/bin/time -o $BACKUP_DIR/$OUTFILE_GIT.time-gitsource-$1-$2.log make test -j$MAKE_CPUS > $BACKUP_DIR/$OUTFILE_GIT-perf-$1-$2.log 2>&1 popd > /dev/null 2>&1 for job in `jobs -p` diff --git a/tools/testing/selftests/amd-pstate/run.sh b/tools/testing/selftests/amd-pstate/run.sh index 279d073c5728..b053eea8bb19 100755 --- a/tools/testing/selftests/amd-pstate/run.sh +++ b/tools/testing/selftests/amd-pstate/run.sh @@ -25,6 +25,7 @@ OUTFILE=selftest OUTFILE_TBENCH="$OUTFILE.tbench" OUTFILE_GIT="$OUTFILE.gitsource" +PERF=/usr/bin/perf SYSFS= CPUROOT= CPUFREQROOT= @@ -154,6 +155,7 @@ help() [-p ] [-l ] [-i ] + [-b ] [-m ] \n" exit 2 @@ -161,7 +163,7 @@ help() parse_arguments() { - while getopts ho:c:t:p:l:i:m: arg + while getopts ho:c:t:p:l:i:b:m: arg do case $arg in h) # --help @@ -192,6 +194,10 @@ parse_arguments() TRACER_INTERVAL=$OPTARG ;; + b) # --perf-binary + PERF=`realpath $OPTARG` + ;; + m) # --comparative-test COMPARATIVE_TEST=$OPTARG ;; @@ -205,8 +211,8 @@ parse_arguments() command_perf() { - if ! command -v perf > /dev/null; then - echo $msg please install perf. >&2 + if ! $PERF -v; then + echo $msg please install perf or provide perf binary path as argument >&2 exit $ksft_skip fi } diff --git a/tools/testing/selftests/amd-pstate/tbench.sh b/tools/testing/selftests/amd-pstate/tbench.sh index 4d2e8ce2da3b..2a98d9c9202e 100755 --- a/tools/testing/selftests/amd-pstate/tbench.sh +++ b/tools/testing/selftests/amd-pstate/tbench.sh @@ -68,7 +68,7 @@ run_tbench() printf "Test tbench for $1 #$2 time_limit: $TIME_LIMIT procs_num: $PROCESS_NUM\n" tbench_srv > /dev/null 2>&1 & - perf stat -a --per-socket -I 1000 -e power/energy-pkg/ tbench -t $TIME_LIMIT $PROCESS_NUM > $OUTFILE_TBENCH-perf-$1-$2.log 2>&1 + $PERF stat -a --per-socket -I 1000 -e power/energy-pkg/ tbench -t $TIME_LIMIT $PROCESS_NUM > $OUTFILE_TBENCH-perf-$1-$2.log 2>&1 pid=`pidof tbench_srv` kill $pid -- Gitee From 3c7ed3e45f1c8d92fcca1f9c43b707f1d2ce20fb Mon Sep 17 00:00:00 2001 From: Kuan-Wei Chiu Date: Mon, 25 Aug 2025 04:09:02 +0800 Subject: [PATCH 3/5] tools/power/x86/amd_pstate_tracer: Fix python gnuplot package names ANBZ: #24121 commit e3f761be5a178bdd5cd80351c5ca0a0cf675ef7e upstream. The prerequisites section listed non-existent packages "phython-gnuplot" and "phython3-gnuplot", which may mislead users and cause installation failures. Update the names to the correct distribution package names "python-gnuplot" and "python3-gnuplot", helping users avoid confusion and saving time for those following the instructions. Signed-off-by: Kuan-Wei Chiu Reviewed-by: Mario Limonciello Signed-off-by: Mario Limonciello (AMD) Signed-off-by: Qinyun Tan --- tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py b/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py index feb9f9421c7b..875b086550d1 100755 --- a/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py +++ b/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py @@ -11,7 +11,7 @@ Prerequisites: gnuplot 5.0 or higher gnuplot-py 1.8 or higher (Most of the distributions have these required packages. They may be called - gnuplot-py, phython-gnuplot or phython3-gnuplot, gnuplot-nox, ... ) + gnuplot-py, python-gnuplot or python3-gnuplot, gnuplot-nox, ... ) Kernel config for Linux trace is enabled -- Gitee From 4be9609682254c5c56d4ae9a662222ebde6f6af3 Mon Sep 17 00:00:00 2001 From: Doug Smythies Date: Sun, 17 Sep 2023 21:03:54 -0700 Subject: [PATCH 4/5] tools/power/x86/intel_pstate_tracer: python minimum version ANBZ: #24121 commit e68cb15bdc93b076eb222e6e435f89532d5a12e8 upstream. Change the minimum python version from 2.7 to 3.6. Remove a 2.X backwards compatibility line. Signed-off-by: Doug Smythies Acked-by: Srinivas Pandruvada Reviewed-by: Mario Limonciello Tested-by: Swapnil Sapkal Signed-off-by: Rafael J. Wysocki Signed-off-by: Qinyun Tan --- .../x86/intel_pstate_tracer/intel_pstate_tracer.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py b/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py index ec3323100e1a..38cfbdcdedb7 100755 --- a/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py +++ b/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0-only # -*- coding: utf-8 -*- # @@ -11,11 +11,11 @@ then this utility enables and collects trace data for a user specified interval and generates performance plots. Prerequisites: - Python version 2.7.x or higher + Python version 3.6.x or higher gnuplot 5.0 or higher - gnuplot-py 1.8 or higher + python3-gnuplot 1.8 or higher (Most of the distributions have these required packages. They may be called - gnuplot-py, phython-gnuplot or phython3-gnuplot, gnuplot-nox, ... ) + gnuplot-py, python-gnuplot or python3-gnuplot, gnuplot-nox, ... ) HWP (Hardware P-States are disabled) Kernel config for Linux trace is enabled @@ -23,7 +23,7 @@ Prerequisites: see print_help(): for Usage and Output details """ -from __future__ import print_function + from datetime import datetime import subprocess import os @@ -562,7 +562,7 @@ if __name__ == "__main__": # Temporary (or perhaps not) cur_version = sys.version_info - print('python version (should be >= 2.7):') + print('python version (should be >= 3.6):') print(cur_version) # Left as "cleanup" for potential future re-run ability. -- Gitee From c77cbee228259097990a1550480e406c3d1eaf86 Mon Sep 17 00:00:00 2001 From: Qinyun Tan Date: Wed, 17 Dec 2025 11:05:45 +0800 Subject: [PATCH 5/5] anolis: tools/power: Add graceful fallback for missing Gnuplot module ANBZ: #24121 Add proper error handling for missing Gnuplot module in both amd_pstate_trace.py and intel_pstate_tracer.py. The tools now: - Detect Gnuplot availability at import time - Skip plot generation gracefully when Gnuplot is unavailable - Still generate CSV files for data analysis - Provide clear warning messages to users This ensures compatibility with modern Python environments where the deprecated Gnuplot module may not be installed, while maintaining full functionality when the module is available. Signed-off-by: Qinyun Tan --- .../x86/amd_pstate_tracer/amd_pstate_trace.py | 24 ++++++++++++------- .../intel_pstate_tracer.py | 5 +++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py b/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py index 875b086550d1..752580ab13b3 100755 --- a/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py +++ b/tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py @@ -27,7 +27,12 @@ import re import signal import sys import getopt -import Gnuplot +try: + import Gnuplot + GNUPLOT_AVAILABLE = True +except ImportError: + GNUPLOT_AVAILABLE = False + print("Warning: Gnuplot module not available. Plotting will be skipped.") from numpy import * from decimal import * sys.path.append(os.path.join(os.path.dirname(__file__), "..", "intel_pstate_tracer")) @@ -337,14 +342,17 @@ if graph_data_present == False: print('No valid data to plot') sys.exit(2) -for cpu_no in range(0, current_max_cpu + 1): - plot_per_cpu_freq(cpu_no) - plot_per_cpu_des_perf(cpu_no) - plot_per_cpu_load(cpu_no) +if GNUPLOT_AVAILABLE: + for cpu_no in range(0, current_max_cpu + 1): + plot_per_cpu_freq(cpu_no) + plot_per_cpu_des_perf(cpu_no) + plot_per_cpu_load(cpu_no) -plot_all_cpu_des_perf() -plot_all_cpu_frequency() -plot_all_cpu_load() + plot_all_cpu_des_perf() + plot_all_cpu_frequency() + plot_all_cpu_load() +else: + print('Gnuplot not available. Skipping plot generation. CSV files have been generated.') for root, dirs, files in os.walk('.'): for f in files: diff --git a/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py b/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py index 38cfbdcdedb7..8a49140b3656 100755 --- a/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py +++ b/tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py @@ -32,7 +32,10 @@ import re import signal import sys import getopt -import Gnuplot +try: + import Gnuplot +except ImportError: + Gnuplot = None from numpy import * from decimal import * -- Gitee