]> git.proxmox.com Git - qemu-server.git/commitdiff
pci: workaround nvidia driver issue on mdev cleanup
authorDominik Csapak <d.csapak@proxmox.com>
Fri, 24 Feb 2023 13:04:31 +0000 (14:04 +0100)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Thu, 16 Mar 2023 08:08:34 +0000 (09:08 +0100)
in some nvidia grid drivers (e.g. 14.4 and 15.x), their kernel module
tries to clean up the mdev device when the vm is shutdown and if it
cannot do that (e.g. becaues we already cleaned it up), their removal
process cancels with an error such that the vgpu does still exist inside
their book-keeping, but can't be used/recreated/freed until a reboot.

since there seems no obvious way to detect if thats the case besides
either parsing dmesg (which is racy), or the nvidia kernel module
version(which i'd rather not do), we simply test the pci device vendor
for nvidia and add a 10s sleep. that should give the driver enough time
to clean up and we will not find the path anymore and skip the cleanup.

This way, it works with both the newer and older versions of the driver
(some of the older drivers are LTS releases, so they're still
supported).

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
PVE/QemuServer.pm

index 349cfe4e5b4f042ff7fcc68081ca47f4cb58653f..b5836f7ac1a2d1775a31383e31186d2eb74b69d5 100644 (file)
@@ -6166,6 +6166,15 @@ sub cleanup_pci_devices {
            # NOTE: avoid PVE::SysFSTools::pci_cleanup_mdev_device as it requires PCI ID and we
            # don't want to break ABI just for this two liner
            my $dev_sysfs_dir = "/sys/bus/mdev/devices/$uuid";
+
+           # some nvidia vgpu driver versions want to clean the mdevs up themselves, and error
+           # out when we do it first. so wait for 10 seconds and then try it
+           my $pciid = $d->{pciid}->[0]->{id};
+           my $info = PVE::SysFSTools::pci_device_info("$pciid");
+           if ($info->{vendor} eq '10de') {
+               sleep 10;
+           }
+
            PVE::SysFSTools::file_write("$dev_sysfs_dir/remove", "1") if -e $dev_sysfs_dir;
        }
     }