From 8dbfecd66315cb2ac0b8c767e2a2a45e592589ed Mon Sep 17 00:00:00 2001 From: Artom Lifshitz Date: Fri, 23 Feb 2024 10:04:02 -0500 Subject: [PATCH] Add cpuset_reserved helper to instance NUMA topology When we pin emulator threads with the `isolate` policy, those pins are stored in the `cpuset_reserved` field in each NUMACell. In subsequent patches we'll need those pins for the whole instance, so this patch adds a helper property that does this for us, similar to how the `cpu_pinning` property helper currently works. Related-bug: 2056612 Change-Id: I8597f13e8089106434018b94e9bbc2091f95fee9 --- nova/objects/instance_numa.py | 6 ++++++ nova/tests/unit/objects/test_instance_numa.py | 10 ++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/nova/objects/instance_numa.py b/nova/objects/instance_numa.py index 61c35e2a6e33..b497f4ae9973 100644 --- a/nova/objects/instance_numa.py +++ b/nova/objects/instance_numa.py @@ -295,6 +295,12 @@ class InstanceNUMATopology(base.NovaObject, cell.cpu_pinning.values() for cell in self.cells if cell.cpu_pinning])) + @property + def cpuset_reserved(self): + return set(itertools.chain.from_iterable([ + cell.cpuset_reserved for cell in self.cells + if cell.cpuset_reserved])) + def clear_host_pinning(self): """Clear any data related to how instance is pinned to the host. diff --git a/nova/tests/unit/objects/test_instance_numa.py b/nova/tests/unit/objects/test_instance_numa.py index 0d3bd0dba059..5a4c6da1cffe 100644 --- a/nova/tests/unit/objects/test_instance_numa.py +++ b/nova/tests/unit/objects/test_instance_numa.py @@ -29,10 +29,12 @@ fake_obj_numa_topology = objects.InstanceNUMATopology( instance_uuid=fake_instance_uuid, cells=[ objects.InstanceNUMACell( - id=0, cpuset=set(), pcpuset=set([1, 2]), memory=512, + id=0, cpuset=set(), pcpuset=set([1, 2]), + cpuset_reserved=set([5, 6]), memory=512, pagesize=2048), objects.InstanceNUMACell( - id=1, cpuset=set(), pcpuset=set([3, 4]), memory=512, + id=1, cpuset=set(), pcpuset=set([3, 4]), + cpuset_reserved=set([7, 8]), memory=512, pagesize=2048), ]) @@ -155,6 +157,10 @@ class _TestInstanceNUMACell(object): topo_obj.cells[1].pin_vcpus((3, 0), (4, 1)) self.assertEqual(set([0, 1, 10, 11]), topo_obj.cpu_pinning) + def test_cpuset_reserved(self): + topo_obj = get_fake_obj_numa_topology(self.context) + self.assertEqual(set([5, 6, 7, 8]), topo_obj.cpuset_reserved) + def test_clear_host_pinning(self): topo_obj = get_fake_obj_numa_topology(self.context) topo_obj.cells[0].pin_vcpus((1, 10), (2, 11))