Merge "Update pci stat pools based on PCI device changes" into stable/rocky

This commit is contained in:
Zuul 2021-05-25 10:24:26 +00:00 committed by Gerrit Code Review
commit d83efbf3b4
4 changed files with 63 additions and 0 deletions

View File

@ -225,6 +225,7 @@ class PciDevTracker(object):
self.stale[new_value['address']] = new_value
else:
existed.update_device(new_value)
self.stats.update_device(existed)
# Track newly discovered devices.
for dev in [dev for dev in devices if

View File

@ -97,6 +97,32 @@ class PciDeviceStats(object):
pool.update(tags)
return pool
def _get_pool_with_device_type_mismatch(self, dev):
"""Check for device type mismatch in the pools for a given device.
Return (pool, device) if device type does not match or a single None
if the device type matches.
"""
for pool in self.pools:
for device in pool['devices']:
if device.address == dev.address:
if dev.dev_type != pool["dev_type"]:
return pool, device
return None
return None
def update_device(self, dev):
"""Update a device to its matching pool."""
pool_device_info = self._get_pool_with_device_type_mismatch(dev)
if pool_device_info is None:
return
pool, device = pool_device_info
pool['devices'].remove(device)
self._decrease_pool_count(self.pools, pool)
self.add_device(dev)
def add_device(self, dev):
"""Add a device to its matching pool."""
dev_pool = self._create_pool_keys_from_dev(dev)

View File

@ -533,6 +533,30 @@ class PciDeviceStatsWithTagsTestCase(test.NoDBTestCase):
self.pci_stats.remove_device(dev2)
self._assertPools()
def test_update_device(self):
# Update device type of one of the device from type-PCI to
# type-PF. Verify if the existing pool is updated and a new
# pool is created with dev_type type-PF.
self._create_pci_devices()
dev1 = self.pci_tagged_devices.pop()
dev1.dev_type = 'type-PF'
self.pci_stats.update_device(dev1)
self.assertEqual(3, len(self.pci_stats.pools))
self._assertPoolContent(self.pci_stats.pools[0], '1137', '0072',
len(self.pci_untagged_devices))
self.assertEqual(self.pci_untagged_devices,
self.pci_stats.pools[0]['devices'])
self._assertPoolContent(self.pci_stats.pools[1], '1137', '0071',
len(self.pci_tagged_devices),
physical_network='physnet1')
self.assertEqual(self.pci_tagged_devices,
self.pci_stats.pools[1]['devices'])
self._assertPoolContent(self.pci_stats.pools[2], '1137', '0071',
1,
physical_network='physnet1')
self.assertEqual(dev1,
self.pci_stats.pools[2]['devices'][0])
class PciDeviceVFPFStatsTestCase(test.NoDBTestCase):

View File

@ -0,0 +1,12 @@
---
fixes:
- |
Fixes `bug 1892361`_ in which the pci stat pools are not updated when an
existing device is enabled with SRIOV capability. Restart of nova-compute
service updates the pci device type from type-PCI to type-PF but the pools
still maintain the device type as type-PCI. And so the PF is considered for
allocation to instance that requests vnic_type=direct. With this fix, the
pci device type updates are detected and the pci stat pools are updated
properly.
.. _bug 1892361: https://bugs.launchpad.net/nova/+bug/1892361