From 78d7cfd2e333001fb6b725052befc5c767a2e9a5 Mon Sep 17 00:00:00 2001 Message-Id: <78d7cfd2e333001fb6b725052befc5c767a2e9a5.1386348947.git.jdenemar@redhat.com> From: Laine Stump Date: Tue, 3 Dec 2013 03:30:32 -0700 Subject: [PATCH] qemu: default to vfio for nodedev-detach This patch resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1035188 Commit f094aaac48a6 changed the PCI device assignment in qemu domains to default to using VFIO rather than legacy KVM device assignment (when VFIO is available). It didn't change which driver was used by default for virNodeDeviceDetachFlags(), though, so that API (and the virsh nodedev-detach command) was still binding to the pci-stub driver, used by legacy KVM assignment, by default. This patch publicizes (only within the qemu module, though, so no additions to the symbol exports are needed) the functions that check for presence of KVM and VFIO device assignment, then uses those functions to decide what to do when no driver is specified for virNodeDeviceDetachFlags(); if the vfio driver is loaded, the device will be bound to vfio-pci, or if legacy KVM assignment is supported on this system, the device will be bound to pci-stub; if neither method is available, the detach will fail. (cherry picked from commit 47b9aae0ae0652738d3a65d6cdd6b0bb16b3a2ec) Signed-off-by: Jiri Denemark --- src/qemu/qemu_driver.c | 19 ++++++++++++++++--- src/qemu/qemu_hostdev.c | 6 +++--- src/qemu/qemu_hostdev.h | 4 +++- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e7b0f37..09345b1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11005,12 +11005,25 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, if (!pci) goto cleanup; - if (!driverName || STREQ(driverName, "kvm")) { - if (virPCIDeviceSetStubDriver(pci, "pci-stub") < 0) - goto cleanup; + if (!driverName) { + /* prefer vfio */ + if (qemuHostdevHostSupportsPassthroughVFIO()) + driverName = "vfio"; + else if (qemuHostdevHostSupportsPassthroughLegacy()) + driverName = "kvm"; + } + + 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 (virPCIDeviceSetStubDriver(pci, "vfio-pci") < 0) goto cleanup; + } else if (STREQ(driverName, "kvm")) { + if (virPCIDeviceSetStubDriver(pci, "pci-stub") < 0) + goto cleanup; } else { virReportError(VIR_ERR_INVALID_ARG, _("unknown driver name '%s'"), driverName); diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index ca26dde..b78f080 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -501,7 +501,7 @@ qemuDomainHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev, } -static bool +bool qemuHostdevHostSupportsPassthroughVFIO(void) { DIR *iommuDir = NULL; @@ -541,7 +541,7 @@ cleanup: #if HAVE_LINUX_KVM_H # include -static bool +bool qemuHostdevHostSupportsPassthroughLegacy(void) { int kvmfd = -1; @@ -563,7 +563,7 @@ cleanup: return ret; } #else -static bool +bool qemuHostdevHostSupportsPassthroughLegacy(void) { return false; diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h index 272086e..ffb3167 100644 --- a/src/qemu/qemu_hostdev.h +++ b/src/qemu/qemu_hostdev.h @@ -1,7 +1,7 @@ /* * qemu_hostdev.h: QEMU hostdev management * - * Copyright (C) 2006-2007, 2009-2010 Red Hat, Inc. + * Copyright (C) 2006-2007, 2009-2013 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -33,6 +33,8 @@ int qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, virDomainDefPtr def); int qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver, virDomainDefPtr def); +bool qemuHostdevHostSupportsPassthroughLegacy(void); +bool qemuHostdevHostSupportsPassthroughVFIO(void); int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, const char *name, const unsigned char *uuid, -- 1.8.4.5