From b9858b2981fbdc52c0721d29cc15abce93371544 Mon Sep 17 00:00:00 2001 From: Nikola Dipanov Date: Thu, 7 Apr 2016 18:53:52 +0100 Subject: [PATCH] pci: Make sure PF is 'available' when last VF is freed We were adding the PF back to the pools but not setting the status properly. The reason this was not caught by tests is because tests were broken as well (we were using assertTrue instead of assertEqual which always passes). Change-Id: I62d4a810d8d7c4453865db0290029c269225c139 Closes-bug: #1567549 --- nova/objects/pci_device.py | 1 + nova/tests/unit/objects/test_pci_device.py | 26 +++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/nova/objects/pci_device.py b/nova/objects/pci_device.py index 87e55645e952..2e7c01538b58 100644 --- a/nova/objects/pci_device.py +++ b/nova/objects/pci_device.py @@ -418,6 +418,7 @@ class PciDevice(base.NovaPersistentObject, base.NovaObject): vfs_list = parent.child_devices if all([vf.is_available() for vf in vfs_list if vf.id != self.id]): + parent.status = fields.PciDeviceStatus.AVAILABLE free_devs.append(parent) old_status = self.status self.status = fields.PciDeviceStatus.AVAILABLE diff --git a/nova/tests/unit/objects/test_pci_device.py b/nova/tests/unit/objects/test_pci_device.py index b56cb455fe19..8d39d9b6a0cc 100644 --- a/nova/tests/unit/objects/test_pci_device.py +++ b/nova/tests/unit/objects/test_pci_device.py @@ -521,7 +521,7 @@ class _TestSRIOVPciDeviceObject(object): 'parent_addr': None, 'numa_node': 0} pci_dev_obj = objects.PciDevice.create(None, pci_dev) - pci_dev_obj.id = num_pfs + 81 + pci_dev_obj.id = dev + 81 pci_dev_obj.child_devices = [] self.sriov_pf_devices.append(pci_dev_obj) @@ -537,7 +537,7 @@ class _TestSRIOVPciDeviceObject(object): 'parent_addr': '0000:81:00.%d' % int(dev / 4), 'numa_node': 0} pci_dev_obj = objects.PciDevice.create(None, pci_dev) - pci_dev_obj.id = num_vfs + 1 + pci_dev_obj.id = dev + 1 pci_dev_obj.parent_device = self.sriov_pf_devices[int(dev / 4)] pci_dev_obj.parent_device.child_devices.append(pci_dev_obj) self.sriov_vf_devices.append(pci_dev_obj) @@ -596,7 +596,7 @@ class _TestSRIOVPciDeviceObject(object): # check if parent device status has been changed to UNCLAIMABLE parent = self._get_parent_by_address(devobj.parent_addr) - self.assertTrue(fields.PciDeviceStatus.UNCLAIMABLE, parent.status) + self.assertEqual(fields.PciDeviceStatus.UNCLAIMABLE, parent.status) def test_allocate_PF(self): self._create_fake_instance() @@ -694,19 +694,19 @@ class _TestSRIOVPciDeviceObject(object): devobj.claim(self.inst.uuid) devobj.allocate(self.inst) self.assertEqual(devobj.status, - fields.PciDeviceStatus.ALLOCATED) - for devobj in dependents[:3]: + fields.PciDeviceStatus.ALLOCATED) + for devobj in dependents[:-1]: devobj.free(self.inst) # check if parent device status is still UNAVAILABLE parent = self._get_parent_by_address(devobj.parent_addr) - self.assertTrue(fields.PciDeviceStatus.UNAVAILABLE, - parent.status) - for devobj in dependents[3:]: - devobj.free(self.inst) - # check if parent device status is now AVAILABLE - parent = self._get_parent_by_address(devobj.parent_addr) - self.assertTrue(fields.PciDeviceStatus.AVAILABLE, - parent.status) + self.assertEqual(fields.PciDeviceStatus.UNAVAILABLE, + parent.status) + devobj = dependents[-1] + devobj.free(self.inst) + # check if parent device status is now AVAILABLE + parent = self._get_parent_by_address(devobj.parent_addr) + self.assertEqual(fields.PciDeviceStatus.AVAILABLE, + parent.status) class TestSRIOVPciDeviceListObject(test_objects._LocalTest,