From 9312ac2df54c99557b858115b143e75b99f77006 Mon Sep 17 00:00:00 2001 From: Stanislaw Gruszka Date: Wed, 6 Mar 2024 20:46:39 +0100 Subject: [PATCH] Add package2cpus and packages2uncores matcher functions Allow to specify CPUs and uncores using package (socket) number. type=cpu devices=${f:package2cpus:2} # cpus from package 2 type=cpu devices=${f:package2cpus:1*} # cpus from any package started from 1 i.e. 11, 12, 13 ... type=uncore devices=${f:package2uncores:1:5:9} # uncores from package 1, 5 and 9 Signed-off-by: Stanislaw Gruszka --- .../functions/function_package2cpus.py | 59 +++++++++++++++ .../functions/function_package2uncores.py | 71 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 tuned/profiles/functions/function_package2cpus.py create mode 100644 tuned/profiles/functions/function_package2uncores.py diff --git a/tuned/profiles/functions/function_package2cpus.py b/tuned/profiles/functions/function_package2cpus.py new file mode 100644 index 00000000..ff0daf55 --- /dev/null +++ b/tuned/profiles/functions/function_package2cpus.py @@ -0,0 +1,59 @@ +import os +import fnmatch + +from . import base +from tuned.utils.commands import commands +from tuned import logs + +log = logs.get() +cmd = commands() + +SYSFS_DIR = "/sys/devices/system/cpu/" + +class package2cpus(base.Function): + """ + Provides cpu device list for a package (socket) + """ + + def __init__(self): + super(package2cpus, self).__init__("package2cpus", 0) + + def execute(self, args): + if not super(package2cpus, self).execute(args): + return None + + if len(args) <= 0: + return None + + try: + all_cpus = fnmatch.filter(os.listdir(SYSFS_DIR), "cpu[0-9]*") + except OSError: + return None + + devices = [] + + for cpu in all_cpus: + f = SYSFS_DIR + cpu + "/topology/physical_package_id" + if not os.path.exists(f): + log.warning("File '%s' does not exist" % f) + continue + + value = cmd.read_file(f) + + try: + package_id = int(value) + except ValueError: + log.warning("Invalid package id '%s' for cpu '%s'" % (value, cpu)) + continue + + for package_pattern in args: + try: + this_package_id = int(package_pattern) + except ValueError: + if fnmatch.fnmatch(value, package_pattern): + devices.append(cpu) + else: + if package_id == this_package_id: + devices.append(cpu) + + return ",".join(devices) if len(devices) > 0 else None diff --git a/tuned/profiles/functions/function_package2uncores.py b/tuned/profiles/functions/function_package2uncores.py new file mode 100644 index 00000000..4b20434e --- /dev/null +++ b/tuned/profiles/functions/function_package2uncores.py @@ -0,0 +1,71 @@ +import os +import fnmatch + +from . import base +from tuned.utils.commands import commands +from tuned import logs + +log = logs.get() +cmd = commands() + +SYSFS_DIR = "/sys/devices/system/cpu/intel_uncore_frequency/" + +class package2uncores(base.Function): + """ + Provides uncore device list for a package (socket) + """ + + def __init__(self): + super(package2uncores, self).__init__("package2uncores", 0) + + def execute(self, args): + if not super(package2uncores, self).execute(args): + return None + + if len(args) <= 0: + return None + + try: + all_uncores = os.listdir(SYSFS_DIR) + except OSError: + return None + + # For new TPMI interface use only uncore devices + tpmi_devices = fnmatch.filter(all_uncores, 'uncore*') + if len(tpmi_devices) > 0: + is_tpmi = True + all_uncores = tpmi_devices + else: + is_tpmi = False + + devices = [] + + for uncore in all_uncores: + if is_tpmi: + f = SYSFS_DIR + uncore + "/package_id" + if not os.path.exists(f): + log.warning("File '%s' does not exist" % f) + continue + + value = cmd.read_file(f) + else: + # uncore string is in form: package_NN_die_MM, do not expect more than 99 packages + value = uncore[8:10] + + try: + package_id = int(value) + except ValueError: + log.warning("Invalid package id '%s' for uncore '%s'" % (value, uncore)) + continue + + for package_pattern in args: + try: + this_package_id = int(package_pattern) + except ValueError: + if fnmatch.fnmatch(value, package_pattern): + devices.append(uncore) + else: + if package_id == this_package_id: + devices.append(uncore) + + return ",".join(devices) if len(devices) > 0 else None