From: Jincheng Miao <jmiao(a)redhat.com>
https://bugzilla.redhat.com/show_bug.cgi?id=1046919
If none (KVM, VFIO) of the supported PCI passthrough methods is known to
work on a host, it's better to fail right away with a nice error message
rather than letting attachment fail with a more cryptic message such as
Failed to bind PCI device '0000:07:05.0' to vfio-pci: No such device
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_driver.c | 32 +++++++++++++++++++++++---------
1 file changed, 23 insertions(+), 9 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b964b3c..55ce6ec 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -10789,6 +10789,8 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
int ret = -1;
virNodeDeviceDefPtr def = NULL;
char *xml = NULL;
+ bool legacy = qemuHostdevHostSupportsPassthroughLegacy();
+ bool vfio = qemuHostdevHostSupportsPassthroughVFIO();
virCheckFlags(0, -1);
@@ -10811,22 +10813,34 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
goto cleanup;
if (!driverName) {
- /* prefer vfio */
- if (qemuHostdevHostSupportsPassthroughVFIO())
+ if (vfio) {
driverName = "vfio";
- else if (qemuHostdevHostSupportsPassthroughLegacy())
+ } 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) {
- virReportError(VIR_ERR_INVALID_ARG, "%s",
- _("neither VFIO nor kvm device assignment is "
- "currently supported on this system"));
- goto cleanup;
- } else if (STREQ(driverName, "vfio")) {
+ if (STREQ(driverName, "vfio")) {
+ if (!vfio) {
+ virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
+ _("VFIO device assignment is currently not "
+ "supported on this system"));
+ goto cleanup;
+ }
if (virPCIDeviceSetStubDriver(pci, "vfio-pci") < 0)
goto cleanup;
} 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;
+ }
if (virPCIDeviceSetStubDriver(pci, "pci-stub") < 0)
goto cleanup;
} else {
--
1.8.5.3