-
Notifications
You must be signed in to change notification settings - Fork 184
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]>
- Loading branch information
Showing
2 changed files
with
130 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |