diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 13d6d60d70..2d3b24a813 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -9741,7 +9741,9 @@ out: } static int -qemuNodeDeviceDettach(virNodeDevicePtr dev) +qemuNodeDeviceDetachFlags(virNodeDevicePtr dev, + const char *driverName, + unsigned int flags) { virQEMUDriverPtr driver = dev->conn->privateData; virPCIDevicePtr pci; @@ -9749,6 +9751,8 @@ qemuNodeDeviceDettach(virNodeDevicePtr dev) int ret = -1; bool in_inactive_list = false; + virCheckFlags(0, -1); + if (qemuNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0) return -1; @@ -9756,12 +9760,22 @@ qemuNodeDeviceDettach(virNodeDevicePtr dev) if (!pci) return -1; + if (!driverName || STREQ(driverName, "kvm")) { + virPCIDeviceSetStubDriver(pci, "pci-stub"); + } else if (STREQ(driverName, "vfio")) { + virPCIDeviceSetStubDriver(pci, "vfio-pci"); + } else { + virReportError(VIR_ERR_INVALID_ARG, + _("unknown driver name '%s'"), driverName); + goto out; + } + virObjectLock(driver->activePciHostdevs); virObjectLock(driver->inactivePciHostdevs); in_inactive_list = virPCIDeviceListFind(driver->inactivePciHostdevs, pci); if (virPCIDeviceDetach(pci, driver->activePciHostdevs, - driver->inactivePciHostdevs, "pci-stub") < 0) + driver->inactivePciHostdevs, NULL) < 0) goto out; ret = 0; @@ -9773,6 +9787,12 @@ out: return ret; } +static int +qemuNodeDeviceDettach(virNodeDevicePtr dev) +{ + return qemuNodeDeviceDetachFlags(dev, NULL, 0); +} + static int qemuNodeDeviceReAttach(virNodeDevicePtr dev) { @@ -14721,6 +14741,7 @@ static virDriver qemuDriver = { .domainMigratePrepare2 = qemuDomainMigratePrepare2, /* 0.5.0 */ .domainMigrateFinish2 = qemuDomainMigrateFinish2, /* 0.5.0 */ .nodeDeviceDettach = qemuNodeDeviceDettach, /* 0.6.1 */ + .nodeDeviceDetachFlags = qemuNodeDeviceDetachFlags, /* 1.0.5 */ .nodeDeviceReAttach = qemuNodeDeviceReAttach, /* 0.6.1 */ .nodeDeviceReset = qemuNodeDeviceReset, /* 0.6.1 */ .domainMigratePrepareTunnel = qemuDomainMigratePrepareTunnel, /* 0.7.2 */