diff --git a/nova/privsep/libvirt.py b/nova/privsep/libvirt.py index 6ca99b98b4..08122a4117 100644 --- a/nova/privsep/libvirt.py +++ b/nova/privsep/libvirt.py @@ -24,7 +24,6 @@ import stat from oslo_concurrency import processutils from oslo_log import log as logging from oslo_utils import units -from oslo_utils import uuidutils import nova.privsep @@ -191,18 +190,6 @@ def readpty(path): return '' -@nova.privsep.sys_admin_pctxt.entrypoint -def create_mdev(physical_device, mdev_type, uuid=None): - """Instantiate a mediated device.""" - if uuid is None: - uuid = uuidutils.generate_uuid() - fpath = '/sys/class/mdev_bus/{0}/mdev_supported_types/{1}/create' - fpath = fpath.format(physical_device, mdev_type) - with open(fpath, 'w') as f: - f.write(uuid) - return uuid - - @nova.privsep.sys_admin_pctxt.entrypoint def systemd_run_qb_mount(qb_vol, mnt_base, cfg_file=None): """Mount QB volume in separate CGROUP""" diff --git a/nova/tests/functional/libvirt/test_vgpu.py b/nova/tests/functional/libvirt/test_vgpu.py index f9f6f3e863..1827ae5344 100644 --- a/nova/tests/functional/libvirt/test_vgpu.py +++ b/nova/tests/functional/libvirt/test_vgpu.py @@ -19,7 +19,6 @@ import os_resource_classes as orc from oslo_config import cfg from oslo_log import log as logging from oslo_utils import uuidutils -from oslo_utils import versionutils from nova.compute import instance_actions import nova.conf @@ -56,16 +55,10 @@ class VGPUTestBase(base.ServersTestBase): 'used': 44, 'free': 84, } - # Persistent mdevs in libvirt >= 7.3.0 - if self.FAKE_LIBVIRT_VERSION < versionutils.convert_version_to_int( - libvirt_driver.MIN_LIBVIRT_PERSISTENT_MDEV): - create_mdev_str = 'nova.privsep.libvirt.create_mdev' - else: - create_mdev_str = ( - 'nova.virt.libvirt.driver.LibvirtDriver._create_mdev') - self._create_mdev = self._create_mdev_7_3 self.useFixture( - fixtures.MockPatch(create_mdev_str, side_effect=self._create_mdev)) + fixtures.MockPatch( + 'nova.virt.libvirt.driver.LibvirtDriver._create_mdev', + side_effect=self._create_mdev)) # for the sake of resizing, we need to patch the two methods below self.useFixture(fixtures.MockPatch( @@ -104,25 +97,7 @@ class VGPUTestBase(base.ServersTestBase): def libvirt2pci_address(self, dev_name): return "{}:{}:{}.{}".format(*dev_name[4:].split('_')) - def _create_mdev(self, physical_device, mdev_type, uuid=None): - # We need to fake the newly created sysfs object by adding a new - # FakeMdevDevice in the existing persisted Connection object so - # when asking to get the existing mdevs, we would see it. - if not uuid: - uuid = uuidutils.generate_uuid() - mdev_name = libvirt_utils.mdev_uuid2name(uuid) - libvirt_parent = self.pci2libvirt_address(physical_device) - # Here, we get the right compute thanks by the self.current_host that - # was modified just before - connection = self.computes[ - self._current_host].driver._host.get_connection() - connection.mdev_info.devices.update( - {mdev_name: fakelibvirt.FakeMdevDevice(dev_name=mdev_name, - type_id=mdev_type, - parent=libvirt_parent)}) - return uuid - - def _create_mdev_7_3(self, dev_name, mdev_type, uuid=None): + def _create_mdev(self, dev_name, mdev_type, uuid=None): # We need to fake the newly created sysfs object by adding a new # FakeMdevDevice in the existing persisted Connection object so # when asking to get the existing mdevs, we would see it. diff --git a/nova/tests/unit/privsep/test_libvirt.py b/nova/tests/unit/privsep/test_libvirt.py index eebcf6c231..0c66cf91a6 100644 --- a/nova/tests/unit/privsep/test_libvirt.py +++ b/nova/tests/unit/privsep/test_libvirt.py @@ -148,18 +148,6 @@ class LibvirtTestCase(test.NoDBTestCase): mock_fcntl.F_SETFL, 32769 | os.O_NONBLOCK)]) self.assertIn(mock.call('/fake/path', 'r'), mock_open.mock_calls) - def test_create_nmdev(self): - mock_open = mock.mock_open() - with mock.patch('builtins.open', new=mock_open) as mock_open: - nova.privsep.libvirt.create_mdev('phys', 'mdevtype', - uuid='fakeuuid') - - handle = mock_open() - self.assertTrue(mock.call('/sys/class/mdev_bus/phys/' - 'mdev_supported_types/mdevtype/create', - 'w') in mock_open.mock_calls) - handle.write.assert_called_with('fakeuuid') - @mock.patch('oslo_concurrency.processutils.execute') def test_umount(self, mock_execute): nova.privsep.libvirt.umount('/fake/path') diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index 298cdb3a60..ff3d7cf0e5 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -22702,13 +22702,10 @@ class LibvirtConnTestCase(test.NoDBTestCase, @mock.patch.object(fakelibvirt.Connection, 'getLibVersion', return_value=versionutils.convert_version_to_int( libvirt_driver.MIN_LIBVIRT_MAXPHYSADDR)) - @mock.patch.object(fakelibvirt.Connection, 'getVersion', - return_value=versionutils.convert_version_to_int( - libvirt_driver.MIN_QEMU_MAXPHYSADDR)) @mock.patch.object(fakelibvirt.Connection, 'getType', return_value=host.HV_DRIVER_QEMU) def test_update_host_specific_capabilities_with_maxphysaddr( - self, mock_get_lib_version, mock_get_version, mock_type): + self, mock_get_lib_version, mock_type): driver = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI()) driver._update_host_specific_capabilities() self.assertTrue( @@ -22738,14 +22735,11 @@ class LibvirtConnTestCase(test.NoDBTestCase, @mock.patch.object(fakelibvirt.Connection, 'getLibVersion', return_value=versionutils.convert_version_to_int( - libvirt_driver.MIN_LIBVIRT_MAXPHYSADDR)) - @mock.patch.object(fakelibvirt.Connection, 'getVersion', - return_value=versionutils.convert_version_to_int( - libvirt_driver.MIN_QEMU_MAXPHYSADDR) - 1) + libvirt_driver.MIN_LIBVIRT_MAXPHYSADDR) - 1) @mock.patch.object(fakelibvirt.Connection, 'getType', return_value=host.HV_DRIVER_QEMU) def test_update_host_specific_capabilities_without_maxphysaddr( - self, mock_get_lib_version, mock_get_version, mock_type): + self, mock_get_lib_version, mock_type): driver = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI()) driver._update_host_specific_capabilities() self.assertFalse( @@ -22753,33 +22747,7 @@ class LibvirtConnTestCase(test.NoDBTestCase, self.assertFalse( driver.capabilities.get('supports_address_space_emulated')) - @mock.patch.object(fakelibvirt.Connection, 'getLibVersion', - return_value=versionutils.convert_version_to_int( - libvirt_driver.MIN_LIBVIRT_TB_CACHE_SIZE) - 1) - def test_supports_tb_cache_size_fail(self, mock_getversion): - self.flags(virt_type='qemu', group='libvirt') - self.flags(tb_cache_size=10, group='libvirt') - driver = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) - - self.assertRaises(exception.InvalidConfiguration, - driver.init_host, 'dummyhost') - - @mock.patch.object(libvirt_driver.LibvirtDriver, - '_register_all_undefined_instance_details', - new=mock.Mock()) - @mock.patch.object(fakelibvirt.Connection, 'getLibVersion', - return_value=versionutils.convert_version_to_int( - libvirt_driver.MIN_LIBVIRT_TB_CACHE_SIZE)) - def test_supports_tb_cache_size_ok(self, mock_getversion): - self.flags(virt_type='qemu', group='libvirt') - self.flags(tb_cache_size=10, group='libvirt') - driver = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False) - driver.init_host('dummyhost') - - @mock.patch.object(fakelibvirt.Connection, 'getLibVersion', - return_value=versionutils.convert_version_to_int( - libvirt_driver.MIN_LIBVIRT_TB_CACHE_SIZE)) - def test_get_guest_config_feature_tcg(self, mock_getversion): + def test_get_guest_config_feature_tcg(self): self.flags(virt_type='qemu', group='libvirt') self.flags(tb_cache_size=10, group='libvirt') drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True) @@ -28358,7 +28326,6 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin): get_unassigned_mdevs.assert_called_once_with('pci_0000_06_00_0', ['nvidia-11']) - @mock.patch.object(nova.privsep.libvirt, 'create_mdev') @mock.patch.object(libvirt_driver.LibvirtDriver, '_get_mdev_capable_devices') @mock.patch.object(libvirt_driver.LibvirtDriver, @@ -28368,8 +28335,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin): def test_allocate_mdevs_with_no_gpu_capacity(self, get_supported_mdev_rcs, unallocated_mdevs, - get_mdev_capable_devs, - privsep_create_mdev): + get_mdev_capable_devs): self.flags(enabled_mdev_types=['nvidia-11'], group='devices') allocations = { uuids.rp1: { diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 965bc6ddc1..69f495a8aa 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -225,8 +225,6 @@ NEXT_MIN_QEMU_VERSION = (8, 2, 2) # vIOMMU model value `virtio` minimal support version MIN_LIBVIRT_VIOMMU_VIRTIO_MODEL = (8, 3, 0) -MIN_LIBVIRT_TB_CACHE_SIZE = (8, 0, 0) - # Virtuozzo driver support MIN_VIRTUOZZO_VERSION = (7, 0, 0) @@ -244,19 +242,10 @@ VGPU_RESOURCE_SEMAPHORE = 'vgpu_resources' MIN_MDEV_LIVEMIG_LIBVIRT_VERSION = (8, 6, 0) MIN_MDEV_LIVEMIG_QEMU_VERSION = (8, 1, 0) -# Minimum version supporting persistent mdevs. -# https://libvirt.org/drvnodedev.html#mediated-devices-mdevs -MIN_LIBVIRT_PERSISTENT_MDEV = (7, 3, 0) - -# Autostart appears to be available starting in 7.8.0 -# https://github.com/libvirt/libvirt/commit/c6607a25b93bd6b0188405785d6608fdf71c8e0a -MIN_LIBVIRT_NODEDEV_AUTOSTART = (7, 8, 0) - LIBVIRT_PERF_EVENT_PREFIX = 'VIR_PERF_PARAM_' # Maxphysaddr minimal support version. MIN_LIBVIRT_MAXPHYSADDR = (8, 7, 0) -MIN_QEMU_MAXPHYSADDR = (2, 7, 0) # stateless firmware support MIN_LIBVIRT_STATELESS_FIRMWARE = (8, 6, 0) @@ -801,9 +790,6 @@ class LibvirtDriver(driver.ComputeDriver): self._check_my_ip() - # TODO(ykarel) This can be dropped when MIN_LIBVIRT_VERSION>=8.0.0 - self._supports_tb_cache_size() - if (CONF.libvirt.virt_type == 'lxc' and not (CONF.libvirt.uid_maps and CONF.libvirt.gid_maps)): LOG.warning("Running libvirt-lxc without user namespaces is " @@ -891,18 +877,10 @@ class LibvirtDriver(driver.ComputeDriver): # wrongly modified. self.cpu_api.power_down_all_dedicated_cpus() - if not self._host.has_min_version(MIN_LIBVIRT_PERSISTENT_MDEV): - # TODO(sbauza): Remove this code once mediated devices are - # persisted across reboots. - # TODO(Uggla): Remove in bump cleanup patch - self._recreate_assigned_mediated_devices() - else: - # NOTE(melwitt): We shouldn't need to do this with libvirt 7.8.0 - # and newer because we're setting autostart=True on the devices -- - # but if that fails for whatever reason and any devices become - # inactive, we can start them here. With libvirt version < 7.8.0, - # this is needed because autostart is not available. - self._start_inactive_mediated_devices() + # NOTE(melwitt): We shouldn't need to do this because we're setting + # autostart=True on the devices -- but if that fails for whatever + # reason and any devices become inactive, we can start them here. + self._start_inactive_mediated_devices() self._check_cpu_compatibility() @@ -953,7 +931,6 @@ class LibvirtDriver(driver.ComputeDriver): supports_maxphysaddr = self._host.has_min_version( lv_ver=MIN_LIBVIRT_MAXPHYSADDR, - hv_ver=MIN_QEMU_MAXPHYSADDR, hv_type=host.HV_DRIVER_QEMU, ) @@ -1244,35 +1221,6 @@ class LibvirtDriver(driver.ComputeDriver): # See https://bugzilla.redhat.com/show_bug.cgi?id=1376907 for ref. return os.path.exists('/sys/bus/mdev/devices/{0}'.format(uuid)) - def _recreate_assigned_mediated_devices(self): - """Recreate assigned mdevs that could have disappeared if we reboot - the host. - """ - # NOTE(sbauza): This method just calls sysfs to recreate mediated - # devices by looking up existing guest XMLs and doesn't use - # the Placement API so it works with or without a vGPU reshape. - mdevs = self._get_all_assigned_mediated_devices() - for (mdev_uuid, instance_uuid) in mdevs.items(): - if not self._is_existing_mdev(mdev_uuid): - dev_name = libvirt_utils.mdev_uuid2name(mdev_uuid) - dev_info = self._get_mediated_device_information(dev_name) - parent = dev_info['parent'] - parent_type = self._get_vgpu_type_per_pgpu(parent) - if dev_info['type'] != parent_type: - # NOTE(sbauza): The mdev was created by using a different - # vGPU type. We can't recreate the mdev until the operator - # modifies the configuration. - parent = "{}:{}:{}.{}".format(*parent[4:].split('_')) - msg = ("The instance UUID %(inst)s uses a mediated device " - "type %(type)s that is no longer supported by the " - "parent PCI device, %(parent)s. Please correct " - "the configuration accordingly." % - {'inst': instance_uuid, - 'parent': parent, - 'type': dev_info['type']}) - raise exception.InvalidLibvirtMdevConfig(reason=msg) - self._create_new_mediated_device(parent, uuid=mdev_uuid) - def _check_my_ip(self): ips = compute_utils.get_machine_ips() if CONF.my_ip not in ips: @@ -1344,19 +1292,6 @@ class LibvirtDriver(driver.ComputeDriver): "cpu_shared_set' and '[compute] cpu_dedicated_set', " "respectively, and undefine 'vcpu_pin_set'.") - def _supports_tb_cache_size(self): - if ( - CONF.libvirt.virt_type == 'qemu' and - CONF.libvirt.tb_cache_size and - CONF.libvirt.tb_cache_size > 0 - ): - if not self._host.has_min_version(MIN_LIBVIRT_TB_CACHE_SIZE): - raise exception.InvalidConfiguration( - _("Nova requires libvirt version %s or greater " - "with '[libvirt] tb_cache_size' " - "configured.") % - libvirt_utils.version_to_string(MIN_LIBVIRT_TB_CACHE_SIZE)) - def _prepare_migration_flags(self): migration_flags = 0 @@ -9042,23 +8977,17 @@ class LibvirtDriver(driver.ComputeDriver): self._host.device_create(conf) # Define it to make it persistent. mdev_dev = self._host.device_define(conf) - # TODO(Uggla): Remove this in the libvirt bump cleanup patch - # As we are not setting autostart anymore, because we are not - # passing in following code. - # It makes test_allocate_mdevs_with_no_mdevs_but_capacity test to fail. - # So removing the tests. - if self._host.has_min_version(MIN_LIBVIRT_NODEDEV_AUTOSTART): - # Set it to automatically start when the compute host boots or the - # parent device becomes available. - # NOTE(melwitt): Make this not fatal because we can try to manually - # start mdevs in init_host() if they didn't start automatically - # after a host reboot. - try: - self._host.device_set_autostart(mdev_dev, autostart=True) - except Exception as e: - LOG.info( - 'Failed to set autostart to True for mdev ' - f'{mdev_dev.name()} with UUID {uuid}: {str(e)}.') + # Set it to automatically start when the compute host boots or the + # parent device becomes available. + # NOTE(melwitt): Make this not fatal because we can try to manually + # start mdevs in init_host() if they didn't start automatically + # after a host reboot. + try: + self._host.device_set_autostart(mdev_dev, autostart=True) + except Exception as e: + LOG.info( + 'Failed to set autostart to True for mdev ' + f'{mdev_dev.name()} with UUID {uuid}: {str(e)}.') return uuid def _create_new_mediated_device(self, parent, uuid=None): @@ -9090,12 +9019,8 @@ class LibvirtDriver(driver.ComputeDriver): # We need the PCI address, not the libvirt name # The libvirt name is like 'pci_0000_84_00_0' pci_addr = "{}:{}:{}.{}".format(*dev_name[4:].split('_')) - if not self._host.has_min_version(MIN_LIBVIRT_PERSISTENT_MDEV): - chosen_mdev = nova.privsep.libvirt.create_mdev( - pci_addr, dev_supported_type, uuid=uuid) - else: - chosen_mdev = self._create_mdev( - dev_name, dev_supported_type, uuid=uuid) + chosen_mdev = self._create_mdev( + dev_name, dev_supported_type, uuid=uuid) LOG.info('Created mdev: %s on pGPU: %s.', chosen_mdev, pci_addr) return chosen_mdev