From b327006e8cd335c75e97aeebec48940f3f960962 Mon Sep 17 00:00:00 2001 From: Rafael Folco Date: Mon, 11 Jul 2016 22:07:14 +0000 Subject: [PATCH] Fix incorrect cellid numbering for NUMA memnode cellid should contain node index, but it actually has the cell nodeset. For the given node topology cells: 0 1 16 17 Wrong cellid: Correct cellid: Change-Id: Iae337410492879a7964bcbb4711b057b920bdf79 Closes-Bug: #1602023 --- nova/tests/unit/virt/libvirt/test_driver.py | 30 +++++++++++++++++++++ nova/virt/libvirt/driver.py | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index d4fe02502202..1a3fee8079dd 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -2949,6 +2949,36 @@ class LibvirtConnTestCase(test.NoDBTestCase): conf = drvr._get_cpu_numa_config_from_instance(None, False) self.assertIsNone(conf) + @mock.patch.object(libvirt_driver.LibvirtDriver, "_has_numa_support", + return_value=True) + def test_get_memnode_numa_config_from_instance(self, mock_numa): + instance_topology = objects.InstanceNUMATopology(cells=[ + objects.InstanceNUMACell(id=0, cpuset=set([1, 2]), memory=128), + objects.InstanceNUMACell(id=1, cpuset=set([3, 4]), memory=128), + objects.InstanceNUMACell(id=16, cpuset=set([5, 6]), memory=128) + ]) + + host_topology = objects.NUMATopology( + cells=[ + objects.NUMACell( + id=0, cpuset=set([1, 2]), memory=1024, mempages=[]), + objects.NUMACell( + id=1, cpuset=set([3, 4]), memory=1024, mempages=[]), + objects.NUMACell( + id=16, cpuset=set([5, 6]), memory=1024, mempages=[])]) + + drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) + with test.nested( + mock.patch.object(drvr, "_get_host_numa_topology", + return_value=host_topology)): + guest_numa_config = drvr._get_guest_numa_config(instance_topology, + flavor={}, allowed_cpus=[1, 2, 3, 4, 5, 6], image_meta={}) + self.assertEqual(2, guest_numa_config.numatune.memnodes[2].cellid) + self.assertEqual([16], + guest_numa_config.numatune.memnodes[2].nodeset) + self.assertEqual(set([5, 6]), + guest_numa_config.numaconfig.cells[2].cpus) + @mock.patch.object(host.Host, 'has_version', return_value=True) def test_has_cpu_policy_support(self, mock_has_version): drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 31f1a2ca623a..622ac45549bc 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -3867,7 +3867,7 @@ class LibvirtDriver(driver.ComputeDriver): guest_cpu_numa_config.cells): if guest_config_cell.id == host_cell.id: node = numa_memnodes[guest_node_id] - node.cellid = guest_config_cell.id + node.cellid = guest_node_id node.nodeset = [host_cell.id] node.mode = "strict"