Skip to content

Commit

Permalink
Add package2cpus and packages2uncores matcher functions
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
sgruszka committed Jul 23, 2024
1 parent 5d5dbfc commit 9312ac2
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 0 deletions.
59 changes: 59 additions & 0 deletions tuned/profiles/functions/function_package2cpus.py
Original file line number Diff line number Diff line change
@@ -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
71 changes: 71 additions & 0 deletions tuned/profiles/functions/function_package2uncores.py
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 9312ac2

Please sign in to comment.