forked from rpms/libvirt
- docs: update description of virsh nodedev-detach --driver option
- qemu: turn two multiline log messages into single line - util: add stub driver name to virPCIDevice object - util: honor stubDriverName when probing/binding stub driver for a device - util: permit existing binding to VFIO variant driver - util: probe stub driver from within function that binds to stub driver - util: rename virPCIDeviceGetDriverPathAndName - util: use "stubDriverType" instead of just "stubDriver" - node_device: support binding other drivers with virNodeDeviceDetachFlags()
This commit is contained in:
parent
274bcf4b7f
commit
5777ea00a7
@ -0,0 +1,53 @@
|
||||
From bbfcf18f504b0eb165c0bbfe2f34b4e20d11c355 Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@redhat.com>
|
||||
Date: Fri, 25 Aug 2023 00:09:54 -0400
|
||||
Subject: [PATCH] docs: update description of virsh nodedev-detach --driver
|
||||
option
|
||||
|
||||
--driver can now be used to specify a specific driver to bind to the
|
||||
device being detached from the host driver (e.g. vfio-pci-igbvf), not
|
||||
just the *type* of driver (e.g. "vfio" or "xen", which are unnecessary
|
||||
anyway, since they are implicit in which hypervisor driver is in use)
|
||||
|
||||
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
docs/manpages/virsh.rst | 25 +++++++++++++++++--------
|
||||
1 file changed, 17 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
|
||||
index 673812036d3..91e1d5de37d 100644
|
||||
--- a/docs/manpages/virsh.rst
|
||||
+++ b/docs/manpages/virsh.rst
|
||||
@@ -5388,14 +5388,23 @@ nodedev-detach
|
||||
|
||||
nodedev-detach nodedev [--driver backend_driver]
|
||||
|
||||
-Detach *nodedev* from the host, so that it can safely be used by
|
||||
-guests via <hostdev> passthrough. This is reversed with
|
||||
-``nodedev-reattach``, and is done automatically for managed devices.
|
||||
-
|
||||
-Different backend drivers expect the device to be bound to different
|
||||
-dummy devices. For example, QEMU's "vfio" backend driver expects the
|
||||
-device to be bound to vfio-pci. The *--driver* parameter can be used
|
||||
-to specify the desired backend driver.
|
||||
+Detach *nodedev* from the host driver and bind it to a special driver
|
||||
+that provides the API needed by the hypervisor for assigning the
|
||||
+device to a virtual machine (using <hostdev> in the domain XML
|
||||
+definition). This is reversed with ``nodedev-reattach``, and is done
|
||||
+automatically by the hypervisor driver for managed devices (those
|
||||
+devices with "managed='yes'" in their XML definition).
|
||||
+
|
||||
+Different hypervisors expect the device being assigned to be bound to
|
||||
+different drivers. For example, QEMU's "vfio" backend requires the
|
||||
+device to be bound to the driver "vfio-pci" or to a "VFIO variant"
|
||||
+driver (this is a driver that supports the full API provided by
|
||||
+vfio-pci, plus some other APIs to support things like live
|
||||
+migration). The *--driver* parameter can be used to specify a
|
||||
+particular driver (e.g. a device-specific VFIO variant driver) the
|
||||
+device should be bound to. When *--driver* is omitted, the default
|
||||
+driver for the hypervisor is used ("vfio-pci" for QEMU, "pciback" for
|
||||
+Xen).
|
||||
|
||||
|
||||
nodedev-dumpxml
|
@ -0,0 +1,178 @@
|
||||
From 24beaffec33efa3fa077d7b8596d97aa9a038a01 Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@redhat.com>
|
||||
Date: Sun, 9 Jul 2023 00:37:45 -0400
|
||||
Subject: [PATCH] node_device: support binding other drivers with
|
||||
virNodeDeviceDetachFlags()
|
||||
|
||||
In the past, the only allowable values for the "driver" field of
|
||||
virNodeDeviceDetachFlags() were "kvm" or "vfio" for the QEMU driver,
|
||||
and "xen" for the libxl driver. Then "kvm" was deprecated and removed,
|
||||
so the driver name became essentially irrelevant (because it is always
|
||||
called via a particular hypervisor driver, and so the "xen" or "vfio"
|
||||
can be (and almost always is) implied.
|
||||
|
||||
With the advent of VFIO variant drivers, the ability to explicitly
|
||||
specify a driver name once again becomes useful - it can be used to
|
||||
name the exact VFIO driver that we want bound to the device in place
|
||||
of vfio-pci, so this patch allows those other names to be passed down
|
||||
the call chain, where the code in virpci.c can make use of them.
|
||||
|
||||
The names "vfio", "kvm", and "xen" retain their special meaning, though:
|
||||
|
||||
1) because there may be some application or configuration that still
|
||||
calls virNodeDeviceDetachFlags() with driverName="vfio", this
|
||||
single value is substituted with the synonym of NULL, which means
|
||||
"bind the default driver for this device and hypervisor". This
|
||||
will currently result in the vfio-pci driver being bound to the
|
||||
device.
|
||||
|
||||
2) in the case of the libxl driver, "xen" means to use the standard
|
||||
driver used in the case of Xen ("pciback").
|
||||
|
||||
3) "kvm" as a driver name always results in an error, as legacy KVM
|
||||
device assignment was removed from the kernel around 10 years ago.
|
||||
|
||||
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/hypervisor/domain_driver.c | 11 ++++++-----
|
||||
src/hypervisor/domain_driver.h | 2 ++
|
||||
src/libxl/libxl_driver.c | 3 ++-
|
||||
src/qemu/qemu_driver.c | 33 +++++++++++++++++++--------------
|
||||
4 files changed, 29 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/src/hypervisor/domain_driver.c b/src/hypervisor/domain_driver.c
|
||||
index a70f75f3ae8..d9469ad6f96 100644
|
||||
--- a/src/hypervisor/domain_driver.c
|
||||
+++ b/src/hypervisor/domain_driver.c
|
||||
@@ -462,6 +462,7 @@ virDomainDriverNodeDeviceReAttach(virNodeDevicePtr dev,
|
||||
int
|
||||
virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
|
||||
virHostdevManager *hostdevMgr,
|
||||
+ virPCIStubDriver driverType,
|
||||
const char *driverName)
|
||||
{
|
||||
g_autoptr(virPCIDevice) pci = NULL;
|
||||
@@ -471,8 +472,10 @@ virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
|
||||
g_autoptr(virConnect) nodeconn = NULL;
|
||||
g_autoptr(virNodeDevice) nodedev = NULL;
|
||||
|
||||
- if (!driverName)
|
||||
+ if (driverType == VIR_PCI_STUB_DRIVER_NONE) {
|
||||
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("driver type not set"));
|
||||
return -1;
|
||||
+ }
|
||||
|
||||
if (!(nodeconn = virGetConnectNodeDev()))
|
||||
return -1;
|
||||
@@ -504,10 +507,8 @@ virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
|
||||
if (!pci)
|
||||
return -1;
|
||||
|
||||
- if (STREQ(driverName, "vfio"))
|
||||
- virPCIDeviceSetStubDriverType(pci, VIR_PCI_STUB_DRIVER_VFIO);
|
||||
- else if (STREQ(driverName, "xen"))
|
||||
- virPCIDeviceSetStubDriverType(pci, VIR_PCI_STUB_DRIVER_XEN);
|
||||
+ virPCIDeviceSetStubDriverType(pci, driverType);
|
||||
+ virPCIDeviceSetStubDriverName(pci, driverName);
|
||||
|
||||
return virHostdevPCINodeDeviceDetach(hostdevMgr, pci);
|
||||
}
|
||||
diff --git a/src/hypervisor/domain_driver.h b/src/hypervisor/domain_driver.h
|
||||
index 4241c869320..9942f58fda1 100644
|
||||
--- a/src/hypervisor/domain_driver.h
|
||||
+++ b/src/hypervisor/domain_driver.h
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include "node_device_conf.h"
|
||||
#include "virhostdev.h"
|
||||
+#include "virpci.h"
|
||||
|
||||
char *
|
||||
virDomainDriverGenerateRootHash(const char *drivername,
|
||||
@@ -58,6 +59,7 @@ int virDomainDriverNodeDeviceReAttach(virNodeDevicePtr dev,
|
||||
|
||||
int virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
|
||||
virHostdevManager *hostdevMgr,
|
||||
+ virPCIStubDriver driverType,
|
||||
const char *driverName);
|
||||
|
||||
int virDomainDriverAddIOThreadCheck(virDomainDef *def,
|
||||
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
|
||||
index 3d10f458508..079922dd32a 100644
|
||||
--- a/src/libxl/libxl_driver.c
|
||||
+++ b/src/libxl/libxl_driver.c
|
||||
@@ -5876,7 +5876,8 @@ libxlNodeDeviceDetachFlags(virNodeDevicePtr dev,
|
||||
|
||||
/* virNodeDeviceDetachFlagsEnsureACL() is being called by
|
||||
* virDomainDriverNodeDeviceDetachFlags() */
|
||||
- return virDomainDriverNodeDeviceDetachFlags(dev, hostdev_mgr, driverName);
|
||||
+ return virDomainDriverNodeDeviceDetachFlags(dev, hostdev_mgr,
|
||||
+ VIR_PCI_STUB_DRIVER_XEN, NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||
index 73fa499e40d..5128b643642 100644
|
||||
--- a/src/qemu/qemu_driver.c
|
||||
+++ b/src/qemu/qemu_driver.c
|
||||
@@ -70,7 +70,6 @@
|
||||
#include "domain_driver.h"
|
||||
#include "domain_postparse.h"
|
||||
#include "domain_validate.h"
|
||||
-#include "virpci.h"
|
||||
#include "virpidfile.h"
|
||||
#include "virprocess.h"
|
||||
#include "libvirt_internal.h"
|
||||
@@ -11407,24 +11406,28 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
|
||||
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
- if (!driverName)
|
||||
- driverName = "vfio";
|
||||
-
|
||||
- /* Only the 'vfio' driver is supported and a special error message for
|
||||
- * the previously supported 'kvm' driver is provided below. */
|
||||
- if (STRNEQ(driverName, "vfio") && STRNEQ(driverName, "kvm")) {
|
||||
- virReportError(VIR_ERR_INVALID_ARG,
|
||||
- _("unknown driver name '%1$s'"), driverName);
|
||||
- return -1;
|
||||
- }
|
||||
+ /* For historical reasons, if driverName is "vfio", that is the
|
||||
+ * same as NULL, i.e. the default vfio driver for this device
|
||||
+ */
|
||||
+ if (STREQ_NULLABLE(driverName, "vfio"))
|
||||
+ driverName = NULL;
|
||||
|
||||
- if (STREQ(driverName, "kvm")) {
|
||||
+ /* the "kvm" driver name was used a very long time ago to force
|
||||
+ * "legacy KVM device assignment", which hasn't been supported in
|
||||
+ * over 10 years.
|
||||
+ */
|
||||
+ if (STREQ_NULLABLE(driverName, "kvm")) {
|
||||
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
|
||||
- _("KVM device assignment is no longer "
|
||||
+ _("'legacy KVM' device assignment is no longer "
|
||||
"supported on this system"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ /* for any other driver, we can't know whether or not it is a VFIO
|
||||
+ * driver until the device has been bound to it, so we will defer
|
||||
+ * further validation until then.
|
||||
+ */
|
||||
+
|
||||
if (!qemuHostdevHostSupportsPassthroughVFIO()) {
|
||||
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
|
||||
_("VFIO device assignment is currently not "
|
||||
@@ -11434,7 +11437,9 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
|
||||
|
||||
/* virNodeDeviceDetachFlagsEnsureACL() is being called by
|
||||
* virDomainDriverNodeDeviceDetachFlags() */
|
||||
- return virDomainDriverNodeDeviceDetachFlags(dev, hostdev_mgr, driverName);
|
||||
+ return virDomainDriverNodeDeviceDetachFlags(dev, hostdev_mgr,
|
||||
+ VIR_PCI_STUB_DRIVER_VFIO,
|
||||
+ driverName);
|
||||
}
|
||||
|
||||
static int
|
@ -0,0 +1,38 @@
|
||||
From 10e8a518a05922d5592d1405054aed3195aebf06 Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@redhat.com>
|
||||
Date: Fri, 18 Aug 2023 16:13:16 -0400
|
||||
Subject: [PATCH] qemu: turn two multiline log messages into single line
|
||||
|
||||
Normally I wouldn't bother with a change like this, but I was touching
|
||||
the function anyway, and wanted to leave it looking nice and tidy.
|
||||
|
||||
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/qemu/qemu_driver.c | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
||||
index 5128b643642..5db42f07533 100644
|
||||
--- a/src/qemu/qemu_driver.c
|
||||
+++ b/src/qemu/qemu_driver.c
|
||||
@@ -11418,8 +11418,7 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
|
||||
*/
|
||||
if (STREQ_NULLABLE(driverName, "kvm")) {
|
||||
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
|
||||
- _("'legacy KVM' device assignment is no longer "
|
||||
- "supported on this system"));
|
||||
+ _("'legacy KVM' device assignment is no longer supported on this system"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -11430,8 +11429,7 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
|
||||
|
||||
if (!qemuHostdevHostSupportsPassthroughVFIO()) {
|
||||
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
|
||||
- _("VFIO device assignment is currently not "
|
||||
- "supported on this system"));
|
||||
+ _("VFIO device assignment is currently not supported on this system"));
|
||||
return -1;
|
||||
}
|
||||
|
@ -0,0 +1,99 @@
|
||||
From 1bb961797153a92a40a3c517114e4920c65672d4 Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@redhat.com>
|
||||
Date: Sat, 8 Jul 2023 22:20:39 -0400
|
||||
Subject: [PATCH] util: add stub driver name to virPCIDevice object
|
||||
|
||||
There can be many different drivers that are of the type "VFIO", so
|
||||
add the driver name to the object and allow getting/setting it.
|
||||
|
||||
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/libvirt_private.syms | 2 ++
|
||||
src/util/virpci.c | 17 +++++++++++++++++
|
||||
src/util/virpci.h | 3 +++
|
||||
3 files changed, 22 insertions(+)
|
||||
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 190bebdd625..0ca63f09552 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -3082,6 +3082,7 @@ virPCIDeviceGetManaged;
|
||||
virPCIDeviceGetName;
|
||||
virPCIDeviceGetRemoveSlot;
|
||||
virPCIDeviceGetReprobe;
|
||||
+virPCIDeviceGetStubDriverName;
|
||||
virPCIDeviceGetStubDriverType;
|
||||
virPCIDeviceGetUnbindFromStub;
|
||||
virPCIDeviceGetUsedBy;
|
||||
@@ -3108,6 +3109,7 @@ virPCIDeviceReset;
|
||||
virPCIDeviceSetManaged;
|
||||
virPCIDeviceSetRemoveSlot;
|
||||
virPCIDeviceSetReprobe;
|
||||
+virPCIDeviceSetStubDriverName;
|
||||
virPCIDeviceSetStubDriverType;
|
||||
virPCIDeviceSetUnbindFromStub;
|
||||
virPCIDeviceSetUsedBy;
|
||||
diff --git a/src/util/virpci.c b/src/util/virpci.c
|
||||
index d86a81c2b1d..a53a51d55e2 100644
|
||||
--- a/src/util/virpci.c
|
||||
+++ b/src/util/virpci.c
|
||||
@@ -88,6 +88,7 @@ struct _virPCIDevice {
|
||||
bool managed;
|
||||
|
||||
virPCIStubDriver stubDriverType;
|
||||
+ char *stubDriverName; /* if blank, use default for type */
|
||||
|
||||
/* used by reattach function */
|
||||
bool unbind_from_stub;
|
||||
@@ -1508,6 +1509,7 @@ virPCIDeviceCopy(virPCIDevice *dev)
|
||||
copy->path = g_strdup(dev->path);
|
||||
copy->used_by_drvname = g_strdup(dev->used_by_drvname);
|
||||
copy->used_by_domname = g_strdup(dev->used_by_domname);
|
||||
+ copy->stubDriverName = g_strdup(dev->stubDriverName);
|
||||
return copy;
|
||||
}
|
||||
|
||||
@@ -1522,6 +1524,7 @@ virPCIDeviceFree(virPCIDevice *dev)
|
||||
g_free(dev->path);
|
||||
g_free(dev->used_by_drvname);
|
||||
g_free(dev->used_by_domname);
|
||||
+ g_free(dev->stubDriverName);
|
||||
g_free(dev);
|
||||
}
|
||||
|
||||
@@ -1581,6 +1584,20 @@ virPCIDeviceGetStubDriverType(virPCIDevice *dev)
|
||||
return dev->stubDriverType;
|
||||
}
|
||||
|
||||
+void
|
||||
+virPCIDeviceSetStubDriverName(virPCIDevice *dev,
|
||||
+ const char *driverName)
|
||||
+{
|
||||
+ g_free(dev->stubDriverName);
|
||||
+ dev->stubDriverName = g_strdup(driverName);
|
||||
+}
|
||||
+
|
||||
+const char *
|
||||
+virPCIDeviceGetStubDriverName(virPCIDevice *dev)
|
||||
+{
|
||||
+ return dev->stubDriverName;
|
||||
+}
|
||||
+
|
||||
bool
|
||||
virPCIDeviceGetUnbindFromStub(virPCIDevice *dev)
|
||||
{
|
||||
diff --git a/src/util/virpci.h b/src/util/virpci.h
|
||||
index 485f535bc91..f8f98f39de7 100644
|
||||
--- a/src/util/virpci.h
|
||||
+++ b/src/util/virpci.h
|
||||
@@ -137,6 +137,9 @@ bool virPCIDeviceGetManaged(virPCIDevice *dev);
|
||||
void virPCIDeviceSetStubDriverType(virPCIDevice *dev,
|
||||
virPCIStubDriver driverType);
|
||||
virPCIStubDriver virPCIDeviceGetStubDriverType(virPCIDevice *dev);
|
||||
+void virPCIDeviceSetStubDriverName(virPCIDevice *dev,
|
||||
+ const char *driverName);
|
||||
+const char *virPCIDeviceGetStubDriverName(virPCIDevice *dev);
|
||||
virPCIDeviceAddress *virPCIDeviceGetAddress(virPCIDevice *dev);
|
||||
int virPCIDeviceSetUsedBy(virPCIDevice *dev,
|
||||
const char *drv_name,
|
40
SOURCES/libvirt-util-honor-stubDriverName-when-probing.patch
Normal file
40
SOURCES/libvirt-util-honor-stubDriverName-when-probing.patch
Normal file
@ -0,0 +1,40 @@
|
||||
From 928296b044647fd3cbe409db6903afc791863a90 Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@redhat.com>
|
||||
Date: Sat, 8 Jul 2023 23:05:44 -0400
|
||||
Subject: [PATCH] util: honor stubDriverName when probing/binding stub driver
|
||||
for a device
|
||||
|
||||
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/util/virpci.c | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/util/virpci.c b/src/util/virpci.c
|
||||
index f1936795da7..1158e468bf9 100644
|
||||
--- a/src/util/virpci.c
|
||||
+++ b/src/util/virpci.c
|
||||
@@ -1290,17 +1290,20 @@ virPCIDeviceUnbindFromStub(virPCIDevice *dev)
|
||||
static int
|
||||
virPCIDeviceBindToStub(virPCIDevice *dev)
|
||||
{
|
||||
- const char *stubDriverName;
|
||||
+ const char *stubDriverName = dev->stubDriverName;
|
||||
g_autofree char *stubDriverPath = NULL;
|
||||
g_autofree char *driverLink = NULL;
|
||||
|
||||
- /* Check the device is configured to use one of the known stub drivers */
|
||||
+
|
||||
if (dev->stubDriverType == VIR_PCI_STUB_DRIVER_NONE) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("No stub driver configured for PCI device %1$s"),
|
||||
dev->name);
|
||||
return -1;
|
||||
- } else if (!(stubDriverName = virPCIStubDriverTypeToString(dev->stubDriverType))) {
|
||||
+ }
|
||||
+
|
||||
+ if (!stubDriverName
|
||||
+ && !(stubDriverName = virPCIStubDriverTypeToString(dev->stubDriverType))) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Unknown stub driver configured for PCI device %1$s"),
|
||||
dev->name);
|
@ -0,0 +1,250 @@
|
||||
From 6ce071f6097d9e96892d5a6c7bd3040f43cc925b Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@redhat.com>
|
||||
Date: Fri, 2 Jun 2023 14:34:51 -0400
|
||||
Subject: [PATCH] util: permit existing binding to VFIO variant driver
|
||||
|
||||
Before a PCI device can be assigned to a guest with VFIO, that device
|
||||
must be bound to the vfio-pci driver rather than to the device's
|
||||
normal host driver. The vfio-pci driver provides APIs that permit QEMU
|
||||
to perform all the necessary operations to make the device accessible
|
||||
to the guest.
|
||||
|
||||
In the past vfio-pci was the only driver that supplied these APIs, but
|
||||
there are now vendor/device-specific "VFIO variant" drivers that
|
||||
provide the basic vfio-pci driver functionality/API while adding
|
||||
support for device-specific operations (for example these
|
||||
device-specific drivers may support live migration of certain
|
||||
devices). All that is needed to make this functionality available is
|
||||
to bind the vendor-specific "VFIO variant" driver to the device
|
||||
(rather than the generic vfio-pci driver, which will continue to work,
|
||||
just without the extra functionality).
|
||||
|
||||
But until now libvirt has required that all PCI devices being assigned
|
||||
to a guest with VFIO specifically have the "vfio-pci" driver bound to
|
||||
the device. So even if the user manually binds a shiny new
|
||||
vendor-specific VFIO variant driver to the device (and puts
|
||||
"managed='no'" in the config to prevent libvirt from changing the
|
||||
binding), libvirt will just fail during startup of the guest (or
|
||||
during hotplug) because the driver bound to the device isn't exactly
|
||||
"vfio-pci".
|
||||
|
||||
Beginning with kernel 6.1, it's possible to determine from the sysfs
|
||||
directory for a device whether the currently-bound driver is the
|
||||
vfio-pci driver or a VFIO variant - the device directory will have a
|
||||
subdirectory called "vfio-dev". We can use that to appropriately widen
|
||||
the list of drivers that libvirt will allow for VFIO device
|
||||
assignment.
|
||||
|
||||
This patch doesn't remove the explicit check for the exact "vfio-pci"
|
||||
driver (since that would cause systems with pre-6.1 kernels to behave
|
||||
incorrectly), but adds an additional check for the vfio-dev directory,
|
||||
so that any VFIO variant driver is acceptable for libvirt to continue
|
||||
setting up for VFIO device assignment.
|
||||
|
||||
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/hypervisor/virhostdev.c | 28 +++++--------
|
||||
src/libvirt_private.syms | 1 +
|
||||
src/util/virpci.c | 78 ++++++++++++++++++++++++++++++++++---
|
||||
src/util/virpci.h | 3 ++
|
||||
4 files changed, 87 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c
|
||||
index 244f057c6ce..b95d6bf3d61 100644
|
||||
--- a/src/hypervisor/virhostdev.c
|
||||
+++ b/src/hypervisor/virhostdev.c
|
||||
@@ -743,9 +743,8 @@ virHostdevPreparePCIDevicesImpl(virHostdevManager *mgr,
|
||||
mgr->inactivePCIHostdevs) < 0)
|
||||
goto reattachdevs;
|
||||
} else {
|
||||
- g_autofree char *driverPath = NULL;
|
||||
- g_autofree char *driverName = NULL;
|
||||
- int stub;
|
||||
+ g_autofree char *drvName = NULL;
|
||||
+ virPCIStubDriver drvType;
|
||||
|
||||
/* Unmanaged devices should already have been marked as
|
||||
* inactive: if that's the case, we can simply move on */
|
||||
@@ -765,19 +764,17 @@ virHostdevPreparePCIDevicesImpl(virHostdevManager *mgr,
|
||||
* information about active / inactive device across
|
||||
* daemon restarts has been implemented */
|
||||
|
||||
- if (virPCIDeviceGetCurrentDriverPathAndName(pci, &driverPath,
|
||||
- &driverName) < 0) {
|
||||
+ if (virPCIDeviceGetCurrentDriverNameAndType(pci, &drvName,
|
||||
+ &drvType) < 0) {
|
||||
goto reattachdevs;
|
||||
}
|
||||
|
||||
- stub = virPCIStubDriverTypeFromString(driverName);
|
||||
-
|
||||
- if (stub > VIR_PCI_STUB_DRIVER_NONE &&
|
||||
- stub < VIR_PCI_STUB_DRIVER_LAST) {
|
||||
+ if (drvType > VIR_PCI_STUB_DRIVER_NONE) {
|
||||
|
||||
/* The device is bound to a known stub driver: store this
|
||||
* information and add a copy to the inactive list */
|
||||
- virPCIDeviceSetStubDriverType(pci, stub);
|
||||
+ virPCIDeviceSetStubDriverType(pci, drvType);
|
||||
+ virPCIDeviceSetStubDriverName(pci, drvName);
|
||||
|
||||
VIR_DEBUG("Adding PCI device %s to inactive list",
|
||||
virPCIDeviceGetName(pci));
|
||||
@@ -2291,18 +2288,13 @@ virHostdevPrepareOneNVMeDevice(virHostdevManager *hostdev_mgr,
|
||||
/* Let's check if all PCI devices are NVMe disks. */
|
||||
for (i = 0; i < virPCIDeviceListCount(pciDevices); i++) {
|
||||
virPCIDevice *pci = virPCIDeviceListGet(pciDevices, i);
|
||||
- g_autofree char *drvPath = NULL;
|
||||
g_autofree char *drvName = NULL;
|
||||
- int stub = VIR_PCI_STUB_DRIVER_NONE;
|
||||
+ virPCIStubDriver drvType;
|
||||
|
||||
- if (virPCIDeviceGetCurrentDriverPathAndName(pci, &drvPath, &drvName) < 0)
|
||||
+ if (virPCIDeviceGetCurrentDriverNameAndType(pci, &drvName, &drvType) < 0)
|
||||
goto cleanup;
|
||||
|
||||
- if (drvName)
|
||||
- stub = virPCIStubDriverTypeFromString(drvName);
|
||||
-
|
||||
- if (stub == VIR_PCI_STUB_DRIVER_VFIO ||
|
||||
- STREQ_NULLABLE(drvName, "nvme"))
|
||||
+ if (drvType == VIR_PCI_STUB_DRIVER_VFIO || STREQ_NULLABLE(drvName, "nvme"))
|
||||
continue;
|
||||
|
||||
VIR_WARN("Suspicious NVMe disk assignment. PCI device "
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index cc564928170..ab049b38584 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -3074,6 +3074,7 @@ virPCIDeviceFileIterate;
|
||||
virPCIDeviceFree;
|
||||
virPCIDeviceGetAddress;
|
||||
virPCIDeviceGetConfigPath;
|
||||
+virPCIDeviceGetCurrentDriverNameAndType;
|
||||
virPCIDeviceGetCurrentDriverPathAndName;
|
||||
virPCIDeviceGetIOMMUGroupDev;
|
||||
virPCIDeviceGetIOMMUGroupList;
|
||||
diff --git a/src/util/virpci.c b/src/util/virpci.c
|
||||
index e6f7554b232..253ddccabdd 100644
|
||||
--- a/src/util/virpci.c
|
||||
+++ b/src/util/virpci.c
|
||||
@@ -280,6 +280,73 @@ virPCIDeviceGetCurrentDriverPathAndName(virPCIDevice *dev,
|
||||
}
|
||||
|
||||
|
||||
+/**
|
||||
+ * virPCIDeviceGetCurrentDriverNameAndType:
|
||||
+ * @dev: virPCIDevice object to examine
|
||||
+ * @drvName: returns name of driver bound to this device (if any)
|
||||
+ * @drvType: returns type of driver if it is a known stub driver type
|
||||
+ *
|
||||
+ * Find the name of the driver bound to @dev (if any) and the type of
|
||||
+ * the driver if it is a known/recognized "stub" driver (based on the
|
||||
+ * driver name).
|
||||
+ *
|
||||
+ * There are vfio "variant" drivers that provide all the basic
|
||||
+ * functionality of the standard vfio-pci driver as well as additional
|
||||
+ * stuff. As of kernel 6.1, the vfio-pci driver and all vfio variant
|
||||
+ * drivers can be identified (once the driver has been bound to a
|
||||
+ * device) by looking for the subdirectory "vfio-dev" in the device's
|
||||
+ * sysfs directory; for example, if the directory
|
||||
+ * /sys/bus/pci/devices/0000:04:11.4/vfio-dev exists, then the driver
|
||||
+ * that is currently bound to PCI device 0000:04:11.4 is either
|
||||
+ * vfio-pci, or a vfio-pci variant driver.
|
||||
+ *
|
||||
+ * Return 0 on success, -1 on failure. If -1 is returned, then an error
|
||||
+ * message has been logged.
|
||||
+ */
|
||||
+int
|
||||
+virPCIDeviceGetCurrentDriverNameAndType(virPCIDevice *dev,
|
||||
+ char **drvName,
|
||||
+ virPCIStubDriver *drvType)
|
||||
+{
|
||||
+ g_autofree char *drvPath = NULL;
|
||||
+ g_autofree char *vfioDevDir = NULL;
|
||||
+ int tmpType;
|
||||
+
|
||||
+ if (virPCIDeviceGetCurrentDriverPathAndName(dev, &drvPath, drvName) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ if (!*drvName) {
|
||||
+ *drvType = VIR_PCI_STUB_DRIVER_NONE;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ tmpType = virPCIStubDriverTypeFromString(*drvName);
|
||||
+
|
||||
+ if (tmpType > VIR_PCI_STUB_DRIVER_NONE) {
|
||||
+ *drvType = tmpType;
|
||||
+ return 0; /* exact match of a known driver name (or no name) */
|
||||
+ }
|
||||
+
|
||||
+ /* If the sysfs directory of this device contains a directory
|
||||
+ * named "vfio-dev" then the currently-bound driver is a vfio
|
||||
+ * variant driver.
|
||||
+ */
|
||||
+
|
||||
+ vfioDevDir = virPCIFile(dev->name, "vfio-dev");
|
||||
+
|
||||
+ if (virFileIsDir(vfioDevDir)) {
|
||||
+ VIR_DEBUG("Driver %s is a vfio_pci driver", *drvName);
|
||||
+ *drvType = VIR_PCI_STUB_DRIVER_VFIO;
|
||||
+ } else {
|
||||
+ VIR_DEBUG("Driver %s is NOT a vfio_pci driver, or kernel is too old",
|
||||
+ *drvName);
|
||||
+ *drvType = VIR_PCI_STUB_DRIVER_NONE;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
static int
|
||||
virPCIDeviceConfigOpenInternal(virPCIDevice *dev, bool readonly, bool fatal)
|
||||
{
|
||||
@@ -1007,8 +1074,8 @@ virPCIDeviceReset(virPCIDevice *dev,
|
||||
virPCIDeviceList *activeDevs,
|
||||
virPCIDeviceList *inactiveDevs)
|
||||
{
|
||||
- g_autofree char *drvPath = NULL;
|
||||
g_autofree char *drvName = NULL;
|
||||
+ virPCIStubDriver drvType;
|
||||
int ret = -1;
|
||||
int fd = -1;
|
||||
int hdrType = -1;
|
||||
@@ -1034,15 +1101,16 @@ virPCIDeviceReset(virPCIDevice *dev,
|
||||
* reset it whenever appropriate, so doing it ourselves would just
|
||||
* be redundant.
|
||||
*/
|
||||
- if (virPCIDeviceGetCurrentDriverPathAndName(dev, &drvPath, &drvName) < 0)
|
||||
+ if (virPCIDeviceGetCurrentDriverNameAndType(dev, &drvName, &drvType) < 0)
|
||||
goto cleanup;
|
||||
|
||||
- if (virPCIStubDriverTypeFromString(drvName) == VIR_PCI_STUB_DRIVER_VFIO) {
|
||||
- VIR_DEBUG("Device %s is bound to vfio-pci - skip reset",
|
||||
- dev->name);
|
||||
+ if (drvType == VIR_PCI_STUB_DRIVER_VFIO) {
|
||||
+
|
||||
+ VIR_DEBUG("Device %s is bound to %s - skip reset", dev->name, drvName);
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
+
|
||||
VIR_DEBUG("Resetting device %s", dev->name);
|
||||
|
||||
if ((fd = virPCIDeviceConfigOpenWrite(dev)) < 0)
|
||||
diff --git a/src/util/virpci.h b/src/util/virpci.h
|
||||
index 19c910202a2..faca6cf6f99 100644
|
||||
--- a/src/util/virpci.h
|
||||
+++ b/src/util/virpci.h
|
||||
@@ -283,6 +283,9 @@ int virPCIDeviceRebind(virPCIDevice *dev);
|
||||
int virPCIDeviceGetCurrentDriverPathAndName(virPCIDevice *dev,
|
||||
char **path,
|
||||
char **name);
|
||||
+int virPCIDeviceGetCurrentDriverNameAndType(virPCIDevice *dev,
|
||||
+ char **drvName,
|
||||
+ virPCIStubDriver *drvType);
|
||||
|
||||
int virPCIDeviceIsPCIExpress(virPCIDevice *dev);
|
||||
int virPCIDeviceHasPCIExpressLink(virPCIDevice *dev);
|
@ -0,0 +1,107 @@
|
||||
From 2d9c9445b9cc093c870f101eb884ddeac3ae40f7 Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@redhat.com>
|
||||
Date: Sun, 9 Jul 2023 15:00:26 -0400
|
||||
Subject: [PATCH] util: probe stub driver from within function that binds to
|
||||
stub driver
|
||||
|
||||
virPCIProbeStubDriver() and virPCIDeviceBindToStub() both have
|
||||
very similar code that locally sets a driver name (based on
|
||||
stubDriverType). These two functions are each also called in just one
|
||||
place (virPCIDeviceDetach()), with just a small bit of validation code
|
||||
in between.
|
||||
|
||||
To eliminate the "duplicated" code (which is going to be expanded
|
||||
slightly in upcoming patches to support manually or automatically
|
||||
picking a VFIO variant driver), this patch modifies
|
||||
virPCIProbeStubDriver() to take the driver name as an argument
|
||||
(rather than the virPCIDevice object), and calls it from within
|
||||
virPCIDeviceBindToStub() (rather than from that function's caller),
|
||||
using the driverName it has just figured out with the
|
||||
now-not-duplicated code.
|
||||
|
||||
(NB: Since it could be used to probe *any* driver module, the name is
|
||||
changed to virPCIProbeDriver()).
|
||||
|
||||
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/util/virpci.c | 33 ++++++++++++---------------------
|
||||
1 file changed, 12 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/src/util/virpci.c b/src/util/virpci.c
|
||||
index 253ddccabdd..f1936795da7 100644
|
||||
--- a/src/util/virpci.c
|
||||
+++ b/src/util/virpci.c
|
||||
@@ -1154,28 +1154,19 @@ virPCIDeviceReset(virPCIDevice *dev,
|
||||
|
||||
|
||||
static int
|
||||
-virPCIProbeStubDriver(virPCIStubDriver driver)
|
||||
+virPCIProbeDriver(const char *driverName)
|
||||
{
|
||||
- const char *drvname = NULL;
|
||||
g_autofree char *drvpath = NULL;
|
||||
g_autofree char *errbuf = NULL;
|
||||
|
||||
- if (driver == VIR_PCI_STUB_DRIVER_NONE ||
|
||||
- !(drvname = virPCIStubDriverTypeToString(driver))) {
|
||||
- virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
- "%s",
|
||||
- _("Attempting to use unknown stub driver"));
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- drvpath = virPCIDriverDir(drvname);
|
||||
+ drvpath = virPCIDriverDir(driverName);
|
||||
|
||||
/* driver previously loaded, return */
|
||||
if (virFileExists(drvpath))
|
||||
return 0;
|
||||
|
||||
- if ((errbuf = virKModLoad(drvname))) {
|
||||
- VIR_WARN("failed to load driver %s: %s", drvname, errbuf);
|
||||
+ if ((errbuf = virKModLoad(driverName))) {
|
||||
+ VIR_WARN("failed to load driver %s: %s", driverName, errbuf);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@@ -1187,14 +1178,14 @@ virPCIProbeStubDriver(virPCIStubDriver driver)
|
||||
/* If we know failure was because of admin config, let's report that;
|
||||
* otherwise, report a more generic failure message
|
||||
*/
|
||||
- if (virKModIsProhibited(drvname)) {
|
||||
+ if (virKModIsProhibited(driverName)) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
- _("Failed to load PCI stub module %1$s: administratively prohibited"),
|
||||
- drvname);
|
||||
+ _("Failed to load PCI driver module %1$s: administratively prohibited"),
|
||||
+ driverName);
|
||||
} else {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
- _("Failed to load PCI stub module %1$s"),
|
||||
- drvname);
|
||||
+ _("Failed to load PCI driver module %1$s"),
|
||||
+ driverName);
|
||||
}
|
||||
|
||||
return -1;
|
||||
@@ -1316,6 +1307,9 @@ virPCIDeviceBindToStub(virPCIDevice *dev)
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ if (virPCIProbeDriver(stubDriverName) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
stubDriverPath = virPCIDriverDir(stubDriverName);
|
||||
driverLink = virPCIFile(dev->name, "driver");
|
||||
|
||||
@@ -1359,9 +1353,6 @@ virPCIDeviceDetach(virPCIDevice *dev,
|
||||
virPCIDeviceList *activeDevs,
|
||||
virPCIDeviceList *inactiveDevs)
|
||||
{
|
||||
- if (virPCIProbeStubDriver(dev->stubDriverType) < 0)
|
||||
- return -1;
|
||||
-
|
||||
if (activeDevs && virPCIDeviceListFind(activeDevs, &dev->address)) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Not detaching active device %1$s"), dev->name);
|
@ -0,0 +1,132 @@
|
||||
From 222b66974e8256965c089fb0f244dc1e01f708e7 Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@redhat.com>
|
||||
Date: Sat, 8 Jul 2023 23:12:09 -0400
|
||||
Subject: [PATCH] util: rename virPCIDeviceGetDriverPathAndName
|
||||
|
||||
Instead, call it virPCIDeviceGetCurrentDriverPathAndName() to avoid
|
||||
confusion with the device name that is stored in the virPCIDevice
|
||||
object - that one is not necessarily the name of the current driver
|
||||
for the device, but could instead be the driver that we want to be
|
||||
bound to the device in the future.
|
||||
|
||||
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/hypervisor/virhostdev.c | 7 ++++---
|
||||
src/libvirt_private.syms | 2 +-
|
||||
src/util/virpci.c | 10 ++++++----
|
||||
src/util/virpci.h | 6 +++---
|
||||
tests/virpcitest.c | 2 +-
|
||||
5 files changed, 15 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c
|
||||
index c437ca9d22d..244f057c6ce 100644
|
||||
--- a/src/hypervisor/virhostdev.c
|
||||
+++ b/src/hypervisor/virhostdev.c
|
||||
@@ -765,9 +765,10 @@ virHostdevPreparePCIDevicesImpl(virHostdevManager *mgr,
|
||||
* information about active / inactive device across
|
||||
* daemon restarts has been implemented */
|
||||
|
||||
- if (virPCIDeviceGetDriverPathAndName(pci,
|
||||
- &driverPath, &driverName) < 0)
|
||||
+ if (virPCIDeviceGetCurrentDriverPathAndName(pci, &driverPath,
|
||||
+ &driverName) < 0) {
|
||||
goto reattachdevs;
|
||||
+ }
|
||||
|
||||
stub = virPCIStubDriverTypeFromString(driverName);
|
||||
|
||||
@@ -2294,7 +2295,7 @@ virHostdevPrepareOneNVMeDevice(virHostdevManager *hostdev_mgr,
|
||||
g_autofree char *drvName = NULL;
|
||||
int stub = VIR_PCI_STUB_DRIVER_NONE;
|
||||
|
||||
- if (virPCIDeviceGetDriverPathAndName(pci, &drvPath, &drvName) < 0)
|
||||
+ if (virPCIDeviceGetCurrentDriverPathAndName(pci, &drvPath, &drvName) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (drvName)
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 0ca63f09552..cc564928170 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -3074,7 +3074,7 @@ virPCIDeviceFileIterate;
|
||||
virPCIDeviceFree;
|
||||
virPCIDeviceGetAddress;
|
||||
virPCIDeviceGetConfigPath;
|
||||
-virPCIDeviceGetDriverPathAndName;
|
||||
+virPCIDeviceGetCurrentDriverPathAndName;
|
||||
virPCIDeviceGetIOMMUGroupDev;
|
||||
virPCIDeviceGetIOMMUGroupList;
|
||||
virPCIDeviceGetLinkCapSta;
|
||||
diff --git a/src/util/virpci.c b/src/util/virpci.c
|
||||
index a53a51d55e2..e6f7554b232 100644
|
||||
--- a/src/util/virpci.c
|
||||
+++ b/src/util/virpci.c
|
||||
@@ -228,7 +228,7 @@ virPCIFile(const char *device, const char *file)
|
||||
}
|
||||
|
||||
|
||||
-/* virPCIDeviceGetDriverPathAndName - put the path to the driver
|
||||
+/* virPCIDeviceGetCurrentDriverPathAndName - put the path to the driver
|
||||
* directory of the driver in use for this device in @path and the
|
||||
* name of the driver in @name. Both could be NULL if it's not bound
|
||||
* to any driver.
|
||||
@@ -236,7 +236,9 @@ virPCIFile(const char *device, const char *file)
|
||||
* Return 0 for success, -1 for error.
|
||||
*/
|
||||
int
|
||||
-virPCIDeviceGetDriverPathAndName(virPCIDevice *dev, char **path, char **name)
|
||||
+virPCIDeviceGetCurrentDriverPathAndName(virPCIDevice *dev,
|
||||
+ char **path,
|
||||
+ char **name)
|
||||
{
|
||||
int ret = -1;
|
||||
g_autofree char *drvlink = NULL;
|
||||
@@ -1032,7 +1034,7 @@ virPCIDeviceReset(virPCIDevice *dev,
|
||||
* reset it whenever appropriate, so doing it ourselves would just
|
||||
* be redundant.
|
||||
*/
|
||||
- if (virPCIDeviceGetDriverPathAndName(dev, &drvPath, &drvName) < 0)
|
||||
+ if (virPCIDeviceGetCurrentDriverPathAndName(dev, &drvPath, &drvName) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virPCIStubDriverTypeFromString(drvName) == VIR_PCI_STUB_DRIVER_VFIO) {
|
||||
@@ -1137,7 +1139,7 @@ virPCIDeviceUnbind(virPCIDevice *dev)
|
||||
g_autofree char *drvpath = NULL;
|
||||
g_autofree char *driver = NULL;
|
||||
|
||||
- if (virPCIDeviceGetDriverPathAndName(dev, &drvpath, &driver) < 0)
|
||||
+ if (virPCIDeviceGetCurrentDriverPathAndName(dev, &drvpath, &driver) < 0)
|
||||
return -1;
|
||||
|
||||
if (!driver)
|
||||
diff --git a/src/util/virpci.h b/src/util/virpci.h
|
||||
index f8f98f39de7..19c910202a2 100644
|
||||
--- a/src/util/virpci.h
|
||||
+++ b/src/util/virpci.h
|
||||
@@ -280,9 +280,9 @@ virPCIVPDResource * virPCIDeviceGetVPD(virPCIDevice *dev);
|
||||
|
||||
int virPCIDeviceUnbind(virPCIDevice *dev);
|
||||
int virPCIDeviceRebind(virPCIDevice *dev);
|
||||
-int virPCIDeviceGetDriverPathAndName(virPCIDevice *dev,
|
||||
- char **path,
|
||||
- char **name);
|
||||
+int virPCIDeviceGetCurrentDriverPathAndName(virPCIDevice *dev,
|
||||
+ char **path,
|
||||
+ char **name);
|
||||
|
||||
int virPCIDeviceIsPCIExpress(virPCIDevice *dev);
|
||||
int virPCIDeviceHasPCIExpressLink(virPCIDevice *dev);
|
||||
diff --git a/tests/virpcitest.c b/tests/virpcitest.c
|
||||
index 92cc8c07c6f..d69a1b51183 100644
|
||||
--- a/tests/virpcitest.c
|
||||
+++ b/tests/virpcitest.c
|
||||
@@ -37,7 +37,7 @@ testVirPCIDeviceCheckDriver(virPCIDevice *dev, const char *expected)
|
||||
g_autofree char *path = NULL;
|
||||
g_autofree char *driver = NULL;
|
||||
|
||||
- if (virPCIDeviceGetDriverPathAndName(dev, &path, &driver) < 0)
|
||||
+ if (virPCIDeviceGetCurrentDriverPathAndName(dev, &path, &driver) < 0)
|
||||
return -1;
|
||||
|
||||
if (STRNEQ_NULLABLE(driver, expected)) {
|
@ -0,0 +1,251 @@
|
||||
From cd2843f5463d93eee00fab31fe259ad1b5b27a27 Mon Sep 17 00:00:00 2001
|
||||
From: Laine Stump <laine@redhat.com>
|
||||
Date: Sat, 8 Jul 2023 22:11:06 -0400
|
||||
Subject: [PATCH] util: use "stubDriverType" instead of just "stubDriver"
|
||||
|
||||
In the past we just kept track of the type of the "stub driver" (the
|
||||
driver that is bound to a device in order to assign it to a
|
||||
guest). The next commit will add a stubDriverName to go along with
|
||||
type, so lets use stubDriverType for the existing enum to make it
|
||||
easier to keep track of whether we're talking about the name or the
|
||||
type.
|
||||
|
||||
Signed-off-by: Laine Stump <laine@redhat.com>
|
||||
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||
---
|
||||
src/hypervisor/domain_driver.c | 4 ++--
|
||||
src/hypervisor/virhostdev.c | 8 ++++----
|
||||
src/libvirt_private.syms | 4 ++--
|
||||
src/util/virnvme.c | 2 +-
|
||||
src/util/virpci.c | 23 ++++++++++++-----------
|
||||
src/util/virpci.h | 6 +++---
|
||||
tests/virhostdevtest.c | 2 +-
|
||||
tests/virpcitest.c | 8 ++++----
|
||||
8 files changed, 29 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/src/hypervisor/domain_driver.c b/src/hypervisor/domain_driver.c
|
||||
index 66e09ffb04f..a70f75f3ae8 100644
|
||||
--- a/src/hypervisor/domain_driver.c
|
||||
+++ b/src/hypervisor/domain_driver.c
|
||||
@@ -505,9 +505,9 @@ virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
|
||||
return -1;
|
||||
|
||||
if (STREQ(driverName, "vfio"))
|
||||
- virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_VFIO);
|
||||
+ virPCIDeviceSetStubDriverType(pci, VIR_PCI_STUB_DRIVER_VFIO);
|
||||
else if (STREQ(driverName, "xen"))
|
||||
- virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_XEN);
|
||||
+ virPCIDeviceSetStubDriverType(pci, VIR_PCI_STUB_DRIVER_XEN);
|
||||
|
||||
return virHostdevPCINodeDeviceDetach(hostdevMgr, pci);
|
||||
}
|
||||
diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c
|
||||
index eac34747836..c437ca9d22d 100644
|
||||
--- a/src/hypervisor/virhostdev.c
|
||||
+++ b/src/hypervisor/virhostdev.c
|
||||
@@ -244,9 +244,9 @@ virHostdevGetPCIHostDevice(const virDomainHostdevDef *hostdev,
|
||||
virPCIDeviceSetManaged(actual, hostdev->managed);
|
||||
|
||||
if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
|
||||
- virPCIDeviceSetStubDriver(actual, VIR_PCI_STUB_DRIVER_VFIO);
|
||||
+ virPCIDeviceSetStubDriverType(actual, VIR_PCI_STUB_DRIVER_VFIO);
|
||||
} else if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN) {
|
||||
- virPCIDeviceSetStubDriver(actual, VIR_PCI_STUB_DRIVER_XEN);
|
||||
+ virPCIDeviceSetStubDriverType(actual, VIR_PCI_STUB_DRIVER_XEN);
|
||||
} else {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("pci backend driver '%1$s' is not supported"),
|
||||
@@ -679,7 +679,7 @@ virHostdevPreparePCIDevicesImpl(virHostdevManager *mgr,
|
||||
for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) {
|
||||
virPCIDevice *pci = virPCIDeviceListGet(pcidevs, i);
|
||||
bool strict_acs_check = !!(flags & VIR_HOSTDEV_STRICT_ACS_CHECK);
|
||||
- bool usesVFIO = (virPCIDeviceGetStubDriver(pci) == VIR_PCI_STUB_DRIVER_VFIO);
|
||||
+ bool usesVFIO = (virPCIDeviceGetStubDriverType(pci) == VIR_PCI_STUB_DRIVER_VFIO);
|
||||
struct virHostdevIsPCINodeDeviceUsedData data = {mgr, drv_name, dom_name, false};
|
||||
int hdrType = -1;
|
||||
|
||||
@@ -776,7 +776,7 @@ virHostdevPreparePCIDevicesImpl(virHostdevManager *mgr,
|
||||
|
||||
/* The device is bound to a known stub driver: store this
|
||||
* information and add a copy to the inactive list */
|
||||
- virPCIDeviceSetStubDriver(pci, stub);
|
||||
+ virPCIDeviceSetStubDriverType(pci, stub);
|
||||
|
||||
VIR_DEBUG("Adding PCI device %s to inactive list",
|
||||
virPCIDeviceGetName(pci));
|
||||
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||||
index 00cf32d49e8..190bebdd625 100644
|
||||
--- a/src/libvirt_private.syms
|
||||
+++ b/src/libvirt_private.syms
|
||||
@@ -3082,7 +3082,7 @@ virPCIDeviceGetManaged;
|
||||
virPCIDeviceGetName;
|
||||
virPCIDeviceGetRemoveSlot;
|
||||
virPCIDeviceGetReprobe;
|
||||
-virPCIDeviceGetStubDriver;
|
||||
+virPCIDeviceGetStubDriverType;
|
||||
virPCIDeviceGetUnbindFromStub;
|
||||
virPCIDeviceGetUsedBy;
|
||||
virPCIDeviceGetVPD;
|
||||
@@ -3108,7 +3108,7 @@ virPCIDeviceReset;
|
||||
virPCIDeviceSetManaged;
|
||||
virPCIDeviceSetRemoveSlot;
|
||||
virPCIDeviceSetReprobe;
|
||||
-virPCIDeviceSetStubDriver;
|
||||
+virPCIDeviceSetStubDriverType;
|
||||
virPCIDeviceSetUnbindFromStub;
|
||||
virPCIDeviceSetUsedBy;
|
||||
virPCIDeviceUnbind;
|
||||
diff --git a/src/util/virnvme.c b/src/util/virnvme.c
|
||||
index f7f8dc5ea91..37333d515b4 100644
|
||||
--- a/src/util/virnvme.c
|
||||
+++ b/src/util/virnvme.c
|
||||
@@ -292,7 +292,7 @@ virNVMeDeviceCreatePCIDevice(const virNVMeDevice *nvme)
|
||||
return NULL;
|
||||
|
||||
/* NVMe devices must be bound to vfio */
|
||||
- virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_VFIO);
|
||||
+ virPCIDeviceSetStubDriverType(pci, VIR_PCI_STUB_DRIVER_VFIO);
|
||||
virPCIDeviceSetManaged(pci, nvme->managed);
|
||||
|
||||
return g_steal_pointer(&pci);
|
||||
diff --git a/src/util/virpci.c b/src/util/virpci.c
|
||||
index cc2b07bbba0..d86a81c2b1d 100644
|
||||
--- a/src/util/virpci.c
|
||||
+++ b/src/util/virpci.c
|
||||
@@ -87,7 +87,7 @@ struct _virPCIDevice {
|
||||
|
||||
bool managed;
|
||||
|
||||
- virPCIStubDriver stubDriver;
|
||||
+ virPCIStubDriver stubDriverType;
|
||||
|
||||
/* used by reattach function */
|
||||
bool unbind_from_stub;
|
||||
@@ -1233,12 +1233,12 @@ virPCIDeviceBindToStub(virPCIDevice *dev)
|
||||
g_autofree char *driverLink = NULL;
|
||||
|
||||
/* Check the device is configured to use one of the known stub drivers */
|
||||
- if (dev->stubDriver == VIR_PCI_STUB_DRIVER_NONE) {
|
||||
+ if (dev->stubDriverType == VIR_PCI_STUB_DRIVER_NONE) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("No stub driver configured for PCI device %1$s"),
|
||||
dev->name);
|
||||
return -1;
|
||||
- } else if (!(stubDriverName = virPCIStubDriverTypeToString(dev->stubDriver))) {
|
||||
+ } else if (!(stubDriverName = virPCIStubDriverTypeToString(dev->stubDriverType))) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Unknown stub driver configured for PCI device %1$s"),
|
||||
dev->name);
|
||||
@@ -1267,9 +1267,10 @@ virPCIDeviceBindToStub(virPCIDevice *dev)
|
||||
/* virPCIDeviceDetach:
|
||||
*
|
||||
* Detach this device from the host driver, attach it to the stub
|
||||
- * driver (previously set with virPCIDeviceSetStubDriver(), and add *a
|
||||
- * copy* of the object to the inactiveDevs list (if provided). This
|
||||
- * function will *never* consume dev, so the caller should free it.
|
||||
+ * driver (previously set with virPCIDeviceSetStubDriverType(), and
|
||||
+ * add *a copy* of the object to the inactiveDevs list (if provided).
|
||||
+ * This function will *never* consume dev, so the caller should free
|
||||
+ * it.
|
||||
*
|
||||
* Returns 0 on success, -1 on failure (will fail if the device is
|
||||
* already in the activeDevs list, but will be a NOP if the device is
|
||||
@@ -1287,7 +1288,7 @@ virPCIDeviceDetach(virPCIDevice *dev,
|
||||
virPCIDeviceList *activeDevs,
|
||||
virPCIDeviceList *inactiveDevs)
|
||||
{
|
||||
- if (virPCIProbeStubDriver(dev->stubDriver) < 0)
|
||||
+ if (virPCIProbeStubDriver(dev->stubDriverType) < 0)
|
||||
return -1;
|
||||
|
||||
if (activeDevs && virPCIDeviceListFind(activeDevs, &dev->address)) {
|
||||
@@ -1569,15 +1570,15 @@ virPCIDeviceGetManaged(virPCIDevice *dev)
|
||||
}
|
||||
|
||||
void
|
||||
-virPCIDeviceSetStubDriver(virPCIDevice *dev, virPCIStubDriver driver)
|
||||
+virPCIDeviceSetStubDriverType(virPCIDevice *dev, virPCIStubDriver driverType)
|
||||
{
|
||||
- dev->stubDriver = driver;
|
||||
+ dev->stubDriverType = driverType;
|
||||
}
|
||||
|
||||
virPCIStubDriver
|
||||
-virPCIDeviceGetStubDriver(virPCIDevice *dev)
|
||||
+virPCIDeviceGetStubDriverType(virPCIDevice *dev)
|
||||
{
|
||||
- return dev->stubDriver;
|
||||
+ return dev->stubDriverType;
|
||||
}
|
||||
|
||||
bool
|
||||
diff --git a/src/util/virpci.h b/src/util/virpci.h
|
||||
index 4d9193f24e5..485f535bc91 100644
|
||||
--- a/src/util/virpci.h
|
||||
+++ b/src/util/virpci.h
|
||||
@@ -134,9 +134,9 @@ int virPCIDeviceReset(virPCIDevice *dev,
|
||||
void virPCIDeviceSetManaged(virPCIDevice *dev,
|
||||
bool managed);
|
||||
bool virPCIDeviceGetManaged(virPCIDevice *dev);
|
||||
-void virPCIDeviceSetStubDriver(virPCIDevice *dev,
|
||||
- virPCIStubDriver driver);
|
||||
-virPCIStubDriver virPCIDeviceGetStubDriver(virPCIDevice *dev);
|
||||
+void virPCIDeviceSetStubDriverType(virPCIDevice *dev,
|
||||
+ virPCIStubDriver driverType);
|
||||
+virPCIStubDriver virPCIDeviceGetStubDriverType(virPCIDevice *dev);
|
||||
virPCIDeviceAddress *virPCIDeviceGetAddress(virPCIDevice *dev);
|
||||
int virPCIDeviceSetUsedBy(virPCIDevice *dev,
|
||||
const char *drv_name,
|
||||
diff --git a/tests/virhostdevtest.c b/tests/virhostdevtest.c
|
||||
index ee0d1c1e6b8..04e6c009081 100644
|
||||
--- a/tests/virhostdevtest.c
|
||||
+++ b/tests/virhostdevtest.c
|
||||
@@ -142,7 +142,7 @@ myInit(void)
|
||||
if (!(dev[i] = virPCIDeviceNew(&subsys->u.pci.addr)))
|
||||
goto cleanup;
|
||||
|
||||
- virPCIDeviceSetStubDriver(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
|
||||
+ virPCIDeviceSetStubDriverType(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
|
||||
}
|
||||
|
||||
for (i = 0; i < ndisks; i++) {
|
||||
diff --git a/tests/virpcitest.c b/tests/virpcitest.c
|
||||
index 769175d7c46..92cc8c07c6f 100644
|
||||
--- a/tests/virpcitest.c
|
||||
+++ b/tests/virpcitest.c
|
||||
@@ -107,7 +107,7 @@ testVirPCIDeviceDetach(const void *opaque G_GNUC_UNUSED)
|
||||
if (!(dev[i] = virPCIDeviceNew(&devAddr)))
|
||||
goto cleanup;
|
||||
|
||||
- virPCIDeviceSetStubDriver(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
|
||||
+ virPCIDeviceSetStubDriverType(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
|
||||
|
||||
if (virPCIDeviceDetach(dev[i], activeDevs, inactiveDevs) < 0)
|
||||
goto cleanup;
|
||||
@@ -149,7 +149,7 @@ testVirPCIDeviceReset(const void *opaque G_GNUC_UNUSED)
|
||||
if (!(dev[i] = virPCIDeviceNew(&devAddr)))
|
||||
goto cleanup;
|
||||
|
||||
- virPCIDeviceSetStubDriver(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
|
||||
+ virPCIDeviceSetStubDriverType(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
|
||||
|
||||
if (virPCIDeviceReset(dev[i], activeDevs, inactiveDevs) < 0)
|
||||
goto cleanup;
|
||||
@@ -190,7 +190,7 @@ testVirPCIDeviceReattach(const void *opaque G_GNUC_UNUSED)
|
||||
CHECK_LIST_COUNT(activeDevs, 0);
|
||||
CHECK_LIST_COUNT(inactiveDevs, i + 1);
|
||||
|
||||
- virPCIDeviceSetStubDriver(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
|
||||
+ virPCIDeviceSetStubDriverType(dev[i], VIR_PCI_STUB_DRIVER_VFIO);
|
||||
}
|
||||
|
||||
CHECK_LIST_COUNT(activeDevs, 0);
|
||||
@@ -249,7 +249,7 @@ testVirPCIDeviceDetachSingle(const void *opaque)
|
||||
if (!dev)
|
||||
goto cleanup;
|
||||
|
||||
- virPCIDeviceSetStubDriver(dev, VIR_PCI_STUB_DRIVER_VFIO);
|
||||
+ virPCIDeviceSetStubDriverType(dev, VIR_PCI_STUB_DRIVER_VFIO);
|
||||
|
||||
if (virPCIDeviceDetach(dev, NULL, NULL) < 0)
|
||||
goto cleanup;
|
@ -229,7 +229,7 @@
|
||||
Summary: Library providing a simple virtualization API
|
||||
Name: libvirt
|
||||
Version: 9.5.0
|
||||
Release: 6%{?dist}%{?extra_release}
|
||||
Release: 7%{?dist}%{?extra_release}.alma.1
|
||||
License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1
|
||||
URL: https://libvirt.org/
|
||||
|
||||
@ -273,6 +273,25 @@ Patch32: libvirt-conf-Don-t-default-to-raw-format-for-loader-NVRAM.patch
|
||||
Patch33: libvirt-tests-Rename-firmware-auto-efi-format-loader-qcow2-nvram-path.patch
|
||||
Patch34: libvirt-tests-Reintroduce-firmware-auto-efi-format-mismatch.patch
|
||||
|
||||
# Patches were taken from:
|
||||
# https://github.com/libvirt/libvirt/commit/cd2843f5463d93eee00fab31fe259ad1b5b27a27.patch
|
||||
Patch35: libvirt-util-use-stubDriverType-instead-of-just-stubDriver.patch
|
||||
# https://github.com/libvirt/libvirt/commit/1bb961797153a92a40a3c517114e4920c65672d4.patch
|
||||
Patch36: libvirt-util-add-stub-driver-name-to-virPCIDevice-object.patch
|
||||
# https://github.com/libvirt/libvirt/commit/222b66974e8256965c089fb0f244dc1e01f708e7.patch
|
||||
Patch37: libvirt-util-rename-virPCIDeviceGetDriverPathAndName.patch
|
||||
# https://github.com/libvirt/libvirt/commit/6ce071f6097d9e96892d5a6c7bd3040f43cc925b.patch
|
||||
Patch38: libvirt-util-permit-existing-binding-to-VFIO-variant-driver.patch
|
||||
# https://github.com/libvirt/libvirt/commit/2d9c9445b9cc093c870f101eb884ddeac3ae40f7.patch
|
||||
Patch39: libvirt-util-probe-stub-driver-from-within-function-that-binds-to-stub-driver.patch
|
||||
# https://github.com/libvirt/libvirt/commit/928296b044647fd3cbe409db6903afc791863a90.patch
|
||||
Patch40: libvirt-util-honor-stubDriverName-when-probing.patch
|
||||
# https://github.com/libvirt/libvirt/commit/24beaffec33efa3fa077d7b8596d97aa9a038a01.patch
|
||||
Patch41: libvirt-node_device-support-binding-other-drivers-with-virNodeDevice.patch
|
||||
# https://github.com/libvirt/libvirt/commit/10e8a518a05922d5592d1405054aed3195aebf06.patch
|
||||
Patch42: libvirt-qemu-turn-two-multiline-log-messages-into-single-line.patch
|
||||
# https://github.com/libvirt/libvirt/commit/bbfcf18f504b0eb165c0bbfe2f34b4e20d11c355.patch
|
||||
Patch43: libvirt-docs-update-description-of-virsh-nodedev-detach.patch
|
||||
|
||||
Requires: libvirt-daemon = %{version}-%{release}
|
||||
Requires: libvirt-daemon-config-network = %{version}-%{release}
|
||||
@ -2519,6 +2538,18 @@ exit 0
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Thu Sep 05 2023 Eduard Abdullin <eabdullin@almalinux.org> - 9.5.0-7.alma.1
|
||||
- docs: update description of virsh nodedev-detach --driver option
|
||||
- qemu: turn two multiline log messages into single line
|
||||
- util: add stub driver name to virPCIDevice object
|
||||
- util: honor stubDriverName when probing/binding stub driver for a device
|
||||
- util: permit existing binding to VFIO variant driver
|
||||
- util: probe stub driver from within function that binds to stub driver
|
||||
- util: rename virPCIDeviceGetDriverPathAndName
|
||||
- util: use "stubDriverType" instead of just "stubDriver"
|
||||
- node_device: support binding other drivers with virNodeDeviceDetachFlags()
|
||||
|
||||
|
||||
* Fri Aug 25 2023 Jiri Denemark <jdenemar@redhat.com> - 9.5.0-6
|
||||
- tests: Use DO_TEST_CAPS_*_ABI_UPDATE() for ppc64 (rhbz#2196178)
|
||||
- tests: Switch to firmware autoselection for hvf (rhbz#2196178)
|
||||
|
Loading…
Reference in New Issue
Block a user