"""
Simultaneous Multithreading (SMT) parsers
=========================================
Parsers included in this module are:
CpuSMTActive - file ``/sys/devices/system/cpu/smt/active``
----------------------------------------------------------
CpuSMTControl - file ``/sys/devices/system/cpu/smt/control``
------------------------------------------------------------
CpuCoreOnline - files matching ``/sys/devices/system/cpu/cpu[0-9]*/online``
---------------------------------------------------------------------------
CpuSiblings - files matching ``/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_list``
------------------------------------------------------------------------------------------------
"""
import re
from insights.core import Parser
from insights.core.exceptions import SkipComponent
from insights.core.plugins import parser
from insights.specs import Specs
[docs]@parser(Specs.cpu_smt_active)
class CpuSMTActive(Parser):
"""
Class for parsing ``/sys/devices/system/cpu/smt/active`` file.
Reports whether SMT is enabled and active.
Typical output of this command is::
1
Raises:
SkipComponent: When content is empty or cannot be parsed.
Examples:
>>> cpu_smt_active.on
True
"""
[docs] def parse_content(self, content):
if not content:
raise SkipComponent("No content.")
self.on = bool(int(content[0]))
[docs]@parser(Specs.cpu_smt_control)
class CpuSMTControl(Parser):
"""
Class for parsing ``/sys/devices/system/cpu/smt/control`` file.
Reports whether SMT is user-controllable.
Four settings are possible::
on: SMT enabled
off: SMT disabled
forceoff: SMT disabled, cannot change at runtime
notsupported: CPU does not support SMT
Typical output of this command is::
off
Raises:
SkipComponent: When content is empty or cannot be parsed.
Examples:
>>> cpu_smt_control.on
False
>>> cpu_smt_control.modifiable
True
>>> cpu_smt_control.supported
True
"""
SMT_CONTROL = {
"on": [True, True, True],
"off": [False, True, True],
"forceoff": [False, False, True],
"notsupported": [False, False, False]
}
[docs] def parse_content(self, content):
if not content:
raise SkipComponent("No content.")
values = self.SMT_CONTROL[content[0]]
self.on = values[0]
self.modifiable = values[1]
self.supported = values[2]
[docs]@parser(Specs.cpu_cores)
class CpuCoreOnline(Parser):
"""
Class for parsing ``/sys/devices/system/cpu/cpu[0-9]*/online`` matching files. Reports whether
a CPU core is online. Cpu0 is always online, so it does not have the "online" file.
Typical output of this command is::
1
1
1
Raises:
SkipComponent: When content is empty or cannot be parsed
Examples:
>>> cpu_core_online.core_id
0
>>> cpu_core_online.on
True
"""
cpu_core_path = r'/sys/devices/system/cpu/cpu(\d+)/online'
[docs] def parse_content(self, content):
if not content:
raise SkipComponent("No content.")
self.on = bool(int(content[0]))
self.core_id = int(re.match(CpuCoreOnline.cpu_core_path, self.file_path).group(1))
def __repr__(self):
return "[Core {0}: {1}]".format(self.core_id, "Online" if self.on else "Offline")
[docs]@parser(Specs.cpu_siblings)
class CpuSiblings(Parser):
"""
Class for parsing ``/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_list``
matching files. Reports CPU core siblings.
Typical output of this command is::
0,2
1,3
0,2
1,3
Raises:
SkipComponent: When content is empty or cannot be parsed
Examples:
>>> cpu_siblings.core_id
0
>>> cpu_siblings.siblings
[0, 2]
"""
cpu_siblings_path = r'/sys/devices/system/cpu/cpu(\d+)/topology/thread_siblings_list'
[docs] def parse_content(self, content):
if not content:
raise SkipComponent("No content.")
# The separator in the sibling list may be either in the format 0-1 or 0,2 depending on
# the CPU model
if "-" in content[0]:
cpu_range = [int(x) for x in content[0].split("-")]
self.siblings = [x for x in range(cpu_range[0], cpu_range[1] + 1)]
elif "," in content[0]:
self.siblings = [int(x) for x in content[0].split(",")]
else:
self.siblings = [int(content[0])]
self.core_id = int(re.match(CpuSiblings.cpu_siblings_path, self.file_path).group(1))
def __repr__(self):
return "[Core {0} Siblings: {1}]".format(self.core_id, self.siblings)