]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Drop KVM assignment
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 3 May 2019 13:25:07 +0000 (15:25 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 23 Aug 2019 08:48:27 +0000 (10:48 +0200)
KVM style of PCI devices assignment was dropped in kernel in
favor of vfio pci (see kernel commit v4.12-rc1~68^2~65). Since
vfio is around for quite some time now and is far superior
discourage people in using KVM style.

Ideally, I'd make QEMU_CAPS_VFIO_PCI implicitly assumed but turns
out qemu-3.0.0 doesn't support vfio-pci device for RISC-V.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Tested-by: Daniel Henrique Barboza <danielhb413@gmail.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_command.c
src/qemu/qemu_command.h
src/qemu/qemu_driver.c
src/qemu/qemu_hostdev.c
src/qemu/qemu_hostdev.h
src/qemu/qemu_hotplug.c
tests/domaincapstest.c

index c9677315ab7afae8467de2b74a2a7db961b97159..73300128ea68917c83d84cb499f3e864efd6f6db 100644 (file)
@@ -5338,7 +5338,6 @@ static int
 virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCapsPtr qemuCaps,
                                        virDomainCapsDeviceHostdevPtr hostdev)
 {
-    bool supportsPassthroughKVM = qemuHostdevHostSupportsPassthroughLegacy();
     bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO();
 
     hostdev->supported = VIR_TRISTATE_BOOL_YES;
@@ -5374,11 +5373,6 @@ virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCapsPtr qemuCaps,
                                  VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO);
     }
 
-    if (supportsPassthroughKVM) {
-        VIR_DOMAIN_CAPS_ENUM_SET(hostdev->pciBackend,
-                                 VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT,
-                                 VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM);
-    }
     return 0;
 }
 
index 60e00042c743732e1fe0f18329d6d915957a1251..520da8222c10b185680fde44e120fbd681871ad2 100644 (file)
@@ -4904,7 +4904,6 @@ char *
 qemuBuildPCIHostdevDevStr(const virDomainDef *def,
                           virDomainHostdevDefPtr dev,
                           unsigned int bootIndex, /* used iff dev->info->bootIndex == 0 */
-                          const char *configfd,
                           virQEMUCapsPtr qemuCaps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
@@ -4913,16 +4912,11 @@ qemuBuildPCIHostdevDevStr(const virDomainDef *def,
 
     /* caller has to assign proper passthrough backend type */
     switch ((virDomainHostdevSubsysPCIBackendType)backend) {
-    case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM:
-        virBufferAddLit(&buf, "pci-assign");
-        if (configfd && *configfd)
-            virBufferAsprintf(&buf, ",configfd=%s", configfd);
-        break;
-
     case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO:
         virBufferAddLit(&buf, "vfio-pci");
         break;
 
+    case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM:
     case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT:
     case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN:
     case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST:
@@ -5676,7 +5670,6 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd,
                 }
             }
 
-            char *configfd_name = NULL;
             unsigned int bootIndex = hostdev->info->bootIndex;
 
             /* bootNet will be non-0 if boot order was set and no other
@@ -5686,27 +5679,12 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd,
                 bootIndex = *bootHostdevNet;
                 *bootHostdevNet = 0;
             }
-            if (backend != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
-                int configfd = qemuOpenPCIConfig(hostdev);
-
-                if (configfd >= 0) {
-                    if (virAsprintf(&configfd_name, "%d", configfd) < 0) {
-                        VIR_FORCE_CLOSE(configfd);
-                        return -1;
-                    }
-
-                    virCommandPassFD(cmd, configfd,
-                                     VIR_COMMAND_PASS_FD_CLOSE_PARENT);
-                }
-            }
 
             if (qemuCommandAddExtDevice(cmd, hostdev->info) < 0)
                 return -1;
 
             virCommandAddArg(cmd, "-device");
-            devstr = qemuBuildPCIHostdevDevStr(def, hostdev, bootIndex,
-                                               configfd_name, qemuCaps);
-            VIR_FREE(configfd_name);
+            devstr = qemuBuildPCIHostdevDevStr(def, hostdev, bootIndex, qemuCaps);
             if (!devstr)
                 return -1;
             virCommandAddArg(cmd, devstr);
index 7e2dc5a60ae1374c102ec374373ec06f4ebb4ccc..e3983bedb2320249b8cdcab6d9580e878484d17c 100644 (file)
@@ -148,7 +148,6 @@ char *qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem,
 char *qemuBuildPCIHostdevDevStr(const virDomainDef *def,
                                 virDomainHostdevDefPtr dev,
                                 unsigned int bootIndex,
-                                const char *configfd,
                                 virQEMUCapsPtr qemuCaps);
 
 char *qemuBuildRNGDevStr(const virDomainDef *def,
index 11f97dbc65344f22645a8d1124cc528688c6eb3c..1b051a94244e0218836a4671124eed5cdc4bec94 100644 (file)
@@ -13517,7 +13517,6 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
     int ret = -1;
     virNodeDeviceDefPtr def = NULL;
     char *xml = NULL;
-    bool legacy = qemuHostdevHostSupportsPassthroughLegacy();
     bool vfio = qemuHostdevHostSupportsPassthroughVFIO();
     virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
 
@@ -13541,18 +13540,8 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
     if (!pci)
         goto cleanup;
 
-    if (!driverName) {
-        if (vfio) {
-            driverName = "vfio";
-        } else if (legacy) {
-            driverName = "kvm";
-        } else {
-            virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
-                           _("neither VFIO nor KVM device assignment is "
-                             "currently supported on this system"));
-            goto cleanup;
-        }
-    }
+    if (!driverName)
+        driverName = "vfio";
 
     if (STREQ(driverName, "vfio")) {
         if (!vfio) {
@@ -13563,13 +13552,10 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
         }
         virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_VFIO);
     } else if (STREQ(driverName, "kvm")) {
-        if (!legacy) {
-            virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
-                           _("KVM device assignment is currently not "
-                             "supported on this system"));
-            goto cleanup;
-        }
-        virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_KVM);
+        virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
+                       _("KVM device assignment is no longer "
+                         "supported on this system"));
+        goto cleanup;
     } else {
         virReportError(VIR_ERR_INVALID_ARG,
                        _("unknown driver name '%s'"), driverName);
index 92b037e1edf6560b257dde50dc11765c2689ec5f..af41c3267972ef5bfc66cf38467c9382b964721e 100644 (file)
@@ -133,44 +133,11 @@ qemuHostdevHostSupportsPassthroughVFIO(void)
 }
 
 
-#if HAVE_LINUX_KVM_H
-# include <linux/kvm.h>
-bool
-qemuHostdevHostSupportsPassthroughLegacy(void)
-{
-    int kvmfd = -1;
-    bool ret = false;
-
-    if ((kvmfd = open("/dev/kvm", O_RDONLY)) < 0)
-        goto cleanup;
-
-# ifdef KVM_CAP_IOMMU
-    if ((ioctl(kvmfd, KVM_CHECK_EXTENSION, KVM_CAP_IOMMU)) <= 0)
-        goto cleanup;
-
-    ret = true;
-# endif
-
- cleanup:
-    VIR_FORCE_CLOSE(kvmfd);
-
-    return ret;
-}
-#else
-bool
-qemuHostdevHostSupportsPassthroughLegacy(void)
-{
-    return false;
-}
-#endif
-
-
 static bool
 qemuHostdevPreparePCIDevicesCheckSupport(virDomainHostdevDefPtr *hostdevs,
                                          size_t nhostdevs,
                                          virQEMUCapsPtr qemuCaps)
 {
-    bool supportsPassthroughKVM = qemuHostdevHostSupportsPassthroughLegacy();
     bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO();
     size_t i;
 
@@ -189,8 +156,6 @@ qemuHostdevPreparePCIDevicesCheckSupport(virDomainHostdevDefPtr *hostdevs,
             if (supportsPassthroughVFIO &&
                 virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
                 *backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
-            } else if (supportsPassthroughKVM) {
-                *backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM;
             } else {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                                _("host doesn't support passthrough of "
@@ -209,12 +174,9 @@ qemuHostdevPreparePCIDevicesCheckSupport(virDomainHostdevDefPtr *hostdevs,
             break;
 
         case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM:
-            if (!supportsPassthroughKVM) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("host doesn't support legacy PCI passthrough"));
-                return false;
-            }
-
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("host doesn't support legacy PCI passthrough"));
+            return false;
             break;
 
         case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN:
index f6d76c1c2a88aa0e4d22c0be7a1d70fd05f60ce7..e99c204961a8877f32de9bada855249794491e33 100644 (file)
@@ -24,7 +24,6 @@
 #include "qemu_conf.h"
 #include "domain_conf.h"
 
-bool qemuHostdevHostSupportsPassthroughLegacy(void);
 bool qemuHostdevHostSupportsPassthroughVFIO(void);
 
 int qemuHostdevUpdateActiveMediatedDevices(virQEMUDriverPtr driver,
index d8be63b71c595e87e265da81b6b4a8a43b54c9b3..63acb9c451a241c7905f89b8f00b84503cb8eebf 100644 (file)
@@ -1465,8 +1465,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
     virDomainDeviceInfoPtr info = hostdev->info;
     int ret;
     char *devstr = NULL;
-    int configfd = -1;
-    char *configfd_name = NULL;
     bool releaseaddr = false;
     bool teardowncgroup = false;
     bool teardownlabel = false;
@@ -1547,13 +1545,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
     if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0)
         goto error;
     releaseaddr = true;
-    if (backend != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
-        configfd = qemuOpenPCIConfig(hostdev);
-        if (configfd >= 0) {
-            if (virAsprintf(&configfd_name, "fd-%s", info->alias) < 0)
-                goto error;
-        }
-    }
 
     if (!virDomainObjIsActive(vm)) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -1561,8 +1552,7 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
         goto error;
     }
 
-    if (!(devstr = qemuBuildPCIHostdevDevStr(vm->def, hostdev, 0,
-                                             configfd_name, priv->qemuCaps)))
+    if (!(devstr = qemuBuildPCIHostdevDevStr(vm->def, hostdev, 0, priv->qemuCaps)))
         goto error;
 
     qemuDomainObjEnterMonitor(driver, vm);
@@ -1570,10 +1560,8 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
     if ((ret = qemuDomainAttachExtensionDevice(priv->mon, hostdev->info)) < 0)
         goto exit_monitor;
 
-    if ((ret = qemuMonitorAddDeviceWithFd(priv->mon, devstr,
-                                          configfd, configfd_name)) < 0) {
+    if ((ret = qemuMonitorAddDevice(priv->mon, devstr)) < 0)
         ignore_value(qemuDomainDetachExtensionDevice(priv->mon, hostdev->info));
-    }
 
  exit_monitor:
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
@@ -1586,8 +1574,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
     vm->def->hostdevs[vm->def->nhostdevs++] = hostdev;
 
     VIR_FREE(devstr);
-    VIR_FREE(configfd_name);
-    VIR_FORCE_CLOSE(configfd);
 
     return 0;
 
@@ -1607,8 +1593,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
     qemuHostdevReAttachPCIDevices(driver, vm->def->name, &hostdev, 1);
 
     VIR_FREE(devstr);
-    VIR_FREE(configfd_name);
-    VIR_FORCE_CLOSE(configfd);
 
  cleanup:
     return -1;
index 45ecfe61ac0d0582aa56c204af3b8ca05d1e981f..77acefa6b0910c62161fedb8e5cb413e72af2a72 100644 (file)
@@ -111,8 +111,7 @@ fillQemuCaps(virDomainCapsPtr domCaps,
                                   cfg->nfirmwares) < 0)
         goto cleanup;
 
-    /* The function above tries to query host's KVM & VFIO capabilities by
-     * calling qemuHostdevHostSupportsPassthroughLegacy() and
+    /* The function above tries to query host's VFIO capabilities by calling
      * qemuHostdevHostSupportsPassthroughVFIO() which, however, can't be
      * successfully mocked as they are not exposed as internal APIs. Therefore,
      * instead of mocking set the expected values here by hand. */