1
0
Fork 0
tuned/tuned/profiles/functions/function_package2uncores.py
Pavol Žáčik ceb1ae61b4
functions: Derive function name from module name
Prevents redundancy. The same thing is already
done for plugins.
2026-03-03 16:28:26 +01:00

80 lines
1.8 KiB
Python

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):
"""
Returns a comma-separated list of uncore devices for a package (socket).
Multiple socket numbers can be specified in separate arguments.
====
On a system with a single socket and a single die,
the following will return `package_00_die_00`:
----
${f:package2uncores:0}
----
====
"""
def __init__(self):
super(Package2Uncores, self).__init__(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