return virHostdevPCINodeDeviceReAttach(hostdevMgr, pci);
}
+
+int
+virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
+ virHostdevManagerPtr hostdevMgr,
+ const char *driverName)
+{
+ virPCIDevicePtr pci = NULL;
+ virPCIDeviceAddress devAddr;
+ int ret = -1;
+ virNodeDeviceDefPtr def = NULL;
+ g_autofree char *xml = NULL;
+ virConnectPtr nodeconn = NULL;
+ virNodeDevicePtr nodedev = NULL;
+
+ if (!driverName)
+ return -1;
+
+ if (!(nodeconn = virGetConnectNodeDev()))
+ goto cleanup;
+
+ /* 'dev' is associated with virConnectPtr, so for split
+ * daemons, we need to get a copy that is associated with
+ * the virnodedevd daemon. */
+ if (!(nodedev = virNodeDeviceLookupByName(nodeconn,
+ virNodeDeviceGetName(dev))))
+ goto cleanup;
+
+ xml = virNodeDeviceGetXMLDesc(nodedev, 0);
+ if (!xml)
+ goto cleanup;
+
+ def = virNodeDeviceDefParseString(xml, EXISTING_DEVICE, NULL);
+ if (!def)
+ goto cleanup;
+
+ /* ACL check must happen against original 'dev',
+ * not the new 'nodedev' we acquired */
+ if (virNodeDeviceDetachFlagsEnsureACL(dev->conn, def) < 0)
+ goto cleanup;
+
+ if (virDomainDriverNodeDeviceGetPCIInfo(def, &devAddr) < 0)
+ goto cleanup;
+
+ pci = virPCIDeviceNew(&devAddr);
+ if (!pci)
+ goto cleanup;
+
+ if (STREQ(driverName, "vfio"))
+ virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_VFIO);
+ else if (STREQ(driverName, "xen"))
+ virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_XEN);
+
+ ret = virHostdevPCINodeDeviceDetach(hostdevMgr, pci);
+ cleanup:
+ virPCIDeviceFree(pci);
+ virNodeDeviceDefFree(def);
+ virObjectUnref(nodedev);
+ virObjectUnref(nodeconn);
+ return ret;
+}
int virDomainDriverNodeDeviceReAttach(virNodeDevicePtr dev,
virHostdevManagerPtr hostdevMgr);
+
+int virDomainDriverNodeDeviceDetachFlags(virNodeDevicePtr dev,
+ virHostdevManagerPtr hostdevMgr,
+ const char *driverName);
virDomainDriverGenerateMachineName;
virDomainDriverGenerateRootHash;
virDomainDriverMergeBlkioDevice;
+virDomainDriverNodeDeviceDetachFlags;
virDomainDriverNodeDeviceGetPCIInfo;
virDomainDriverNodeDeviceReAttach;
virDomainDriverNodeDeviceReset;
const char *driverName,
unsigned int flags)
{
- virPCIDevicePtr pci = NULL;
- virPCIDeviceAddress devAddr;
- int ret = -1;
- virNodeDeviceDefPtr def = NULL;
- g_autofree char *xml = NULL;
libxlDriverPrivatePtr driver = dev->conn->privateData;
virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
- virConnectPtr nodeconn = NULL;
- virNodeDevicePtr nodedev = NULL;
virCheckFlags(0, -1);
return -1;
}
- if (!(nodeconn = virGetConnectNodeDev()))
- goto cleanup;
-
- /* 'dev' is associated with the QEMU virConnectPtr,
- * so for split daemons, we need to get a copy that
- * is associated with the virnodedevd daemon.
- */
- if (!(nodedev = virNodeDeviceLookupByName(nodeconn,
- virNodeDeviceGetName(dev))))
- goto cleanup;
-
- xml = virNodeDeviceGetXMLDesc(nodedev, 0);
- if (!xml)
- goto cleanup;
-
- def = virNodeDeviceDefParseString(xml, EXISTING_DEVICE, NULL);
- if (!def)
- goto cleanup;
-
- /* ACL check must happen against original 'dev',
- * not the new 'nodedev' we acquired */
- if (virNodeDeviceDetachFlagsEnsureACL(dev->conn, def) < 0)
- goto cleanup;
-
- if (virDomainDriverNodeDeviceGetPCIInfo(def, &devAddr) < 0)
- goto cleanup;
-
- pci = virPCIDeviceNew(&devAddr);
- if (!pci)
- goto cleanup;
-
- virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_XEN);
-
- if (virHostdevPCINodeDeviceDetach(hostdev_mgr, pci) < 0)
- goto cleanup;
-
- ret = 0;
- cleanup:
- virPCIDeviceFree(pci);
- virNodeDeviceDefFree(def);
- virObjectUnref(nodedev);
- virObjectUnref(nodeconn);
- return ret;
+ /* virNodeDeviceDetachFlagsEnsureACL() is being called by
+ * virDomainDriverNodeDeviceDetachFlags() */
+ return virDomainDriverNodeDeviceDetachFlags(dev, hostdev_mgr, driverName);
}
static int
unsigned int flags)
{
virQEMUDriverPtr driver = dev->conn->privateData;
- virPCIDevicePtr pci = NULL;
- virPCIDeviceAddress devAddr;
- int ret = -1;
- virNodeDeviceDefPtr def = NULL;
- g_autofree char *xml = NULL;
bool vfio = qemuHostdevHostSupportsPassthroughVFIO();
virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
- virConnectPtr nodeconn = NULL;
- virNodeDevicePtr nodedev = NULL;
virCheckFlags(0, -1);
return -1;
}
- if (!(nodeconn = virGetConnectNodeDev()))
- goto cleanup;
-
- /* 'dev' is associated with the QEMU virConnectPtr,
- * so for split daemons, we need to get a copy that
- * is associated with the virnodedevd daemon.
- */
- if (!(nodedev = virNodeDeviceLookupByName(nodeconn,
- virNodeDeviceGetName(dev))))
- goto cleanup;
-
- xml = virNodeDeviceGetXMLDesc(nodedev, 0);
- if (!xml)
- goto cleanup;
-
- def = virNodeDeviceDefParseString(xml, EXISTING_DEVICE, NULL);
- if (!def)
- goto cleanup;
- /* ACL check must happen against original 'dev',
- * not the new 'nodedev' we acquired */
- if (virNodeDeviceDetachFlagsEnsureACL(dev->conn, def) < 0)
- goto cleanup;
-
- if (virDomainDriverNodeDeviceGetPCIInfo(def, &devAddr) < 0)
- goto cleanup;
-
- pci = virPCIDeviceNew(&devAddr);
- if (!pci)
- goto cleanup;
-
- virPCIDeviceSetStubDriver(pci, VIR_PCI_STUB_DRIVER_VFIO);
-
- ret = virHostdevPCINodeDeviceDetach(hostdev_mgr, pci);
- cleanup:
- virPCIDeviceFree(pci);
- virNodeDeviceDefFree(def);
- virObjectUnref(nodedev);
- virObjectUnref(nodeconn);
- return ret;
+ /* virNodeDeviceDetachFlagsEnsureACL() is being called by
+ * virDomainDriverNodeDeviceDetachFlags() */
+ return virDomainDriverNodeDeviceDetachFlags(dev, hostdev_mgr, driverName);
}
static int