[PATCH 1/5] rteval: systopology.py: Add support for systems that don't have Numa

Punit Agrawal
2021-09-01T08:08:32Z

From: Punit Agrawal <punit1.agrawal@toshiba.co.jp>

Certain systems such as Arm v7 do not have support for Numa nodes,
i.e., "/sys/devices/system/node*" does not exist. Instead of erroring
out in this situation, it would be better if rteval could use
alternate sources to get the system topology and memory information.

Introduce the notion of a fake Numa node (as a class) which is used
when no numa nodes are found on the system. Other than the
constructor, it provides the same interface as the existing NumaNode
class so existing users should work without any changes.

Signed-off-by: Punit Agrawal <punit1.agrawal@toshiba.co.jp>
---
rteval/systopology.py | 38 ++++++++++++++++++++++++++++++++------
1 file changed, 32 insertions(+), 6 deletions(-)

diff --git a/rteval/systopology.py b/rteval/systopology.py
index c61ec1a58514..7ce9a8c4f707 100644
--- a/rteval/systopology.py
+++ b/rteval/systopology.py
@@ -191,6 +191,31 @@ class NumaNode:
""" return list of cpus for this node """
return self.cpus.getcpulist()

+class FakeNumaNode(NumaNode):
+ """class representing a fake NUMA node. The fake NUMA node is used on
+ systems which don't have NUMA enabled (no
+ /sys/devices/system/node) such as Arm v7
+
+ """
+
+ cpupath = '/sys/devices/system/cpu'
+ mempath = '/proc/meminfo'
+
+ def __init__(self):
+ self.nodeid = 0
+ self.cpus = CpuList(sysread(FakeNumaNode.cpupath, "possible"))
+ self.getmeminfo()
+
+ def getmeminfo(self):
+ self.meminfo = {}
+ for l in open(FakeNumaNode.mempath, "r"):
+ elements = l.split()
+ key = elements[0][0:-1]
+ val = int(elements[1])
+ if len(elements) == 3 and elements[2] == "kB":
+ val *= 1024
+ self.meminfo[key] = val
+
#
# Class to abstract the system topology of numa nodes and cpus
#
@@ -238,12 +263,13 @@ class SysTopology:

def getinfo(self):
nodes = glob.glob(os.path.join(SysTopology.nodepath, 'node[0-9]*'))
- if not nodes:
- raise RuntimeError("No valid nodes found in %s!" % SysTopology.nodepath)
- nodes.sort()
- for n in nodes:
- node = int(os.path.basename(n)[4:])
- self.nodes[node] = NumaNode(n)
+ if nodes:
+ nodes.sort()
+ for n in nodes:
+ node = int(os.path.basename(n)[4:])
+ self.nodes[node] = NumaNode(n)
+ else:
+ self.nodes[0] = FakeNumaNode()

def getnodes(self):
return list(self.nodes.keys())
--
2.32.0