+Mon Mar 2 17:19:23 CET 2009 Daniel Veillard <veillard@redhat.com>
+
+ * include/libvirt/libvirt.h include/libvirt/libvirt.h.in
+ src/driver.h src/libvirt.c src/libvirt_public.syms
+ src/lxc_driver.c src/openvz_driver.c src/qemu_driver.c
+ src/test.c src/uml_driver.c: add the public APIs for
+ virNodeDeviceDettach virNodeDeviceReAttach and virNodeDeviceReset
+ and extends the driver structure accordingly.
+
Mon Mar 2 17:07:44 CET 2009 Daniel Veillard <veillard@redhat.com>
* configure.in po/POTFILES.in src/Makefile.am src/libvirt_private.syms
int virNodeDeviceRef (virNodeDevicePtr dev);
int virNodeDeviceFree (virNodeDevicePtr dev);
+int virNodeDeviceDettach (virNodeDevicePtr dev);
+int virNodeDeviceReAttach (virNodeDevicePtr dev);
+int virNodeDeviceReset (virNodeDevicePtr dev);
+
/*
* Domain Event Notification
*/
int virNodeDeviceRef (virNodeDevicePtr dev);
int virNodeDeviceFree (virNodeDevicePtr dev);
+int virNodeDeviceDettach (virNodeDevicePtr dev);
+int virNodeDeviceReAttach (virNodeDevicePtr dev);
+int virNodeDeviceReset (virNodeDevicePtr dev);
+
/*
* Domain Event Notification
*/
unsigned long flags,
int retcode);
+typedef int
+ (*virDrvNodeDeviceDettach)
+ (virNodeDevicePtr dev);
+typedef int
+ (*virDrvNodeDeviceReAttach)
+ (virNodeDevicePtr dev);
+typedef int
+ (*virDrvNodeDeviceReset)
+ (virNodeDevicePtr dev);
+
/**
* _virDriver:
*
virDrvDomainEventDeregister domainEventDeregister;
virDrvDomainMigratePrepare2 domainMigratePrepare2;
virDrvDomainMigrateFinish2 domainMigrateFinish2;
+ virDrvNodeDeviceDettach nodeDeviceDettach;
+ virDrvNodeDeviceReAttach nodeDeviceReAttach;
+ virDrvNodeDeviceReset nodeDeviceReset;
};
typedef int
return 0;
}
+/**
+ * virNodeDeviceAttach:
+ * @dev: pointer to the node device
+ *
+ * Dettach the node device from the node itself so that it may be
+ * assigned to a guest domain.
+ *
+ * Depending on the hypervisor, this may involve operations such
+ * as unbinding any device drivers from the device, binding the
+ * device to a dummy device driver and resetting the device.
+ *
+ * If the device is currently in use by the node, this method may
+ * fail.
+ *
+ * Once the device is not assigned to any guest, it may be re-attached
+ * to the node using the virNodeDeviceReattach() method.
+ */
+int
+virNodeDeviceDettach(virNodeDevicePtr dev)
+{
+ DEBUG("dev=%p, conn=%p", dev, dev ? dev->conn : NULL);
+
+ virResetLastError();
+
+ if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
+ virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
+ return (-1);
+ }
+
+ if (dev->conn->driver->nodeDeviceDettach) {
+ int ret;
+ ret = dev->conn->driver->nodeDeviceDettach (dev);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError(dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virSetConnError(dev->conn);
+ return (-1);
+}
+
+/**
+ * virNodeDeviceReAttach:
+ * @dev: pointer to the node device
+ *
+ * Re-attach a previously dettached node device to the node so that it
+ * may be used by the node again.
+ *
+ * Depending on the hypervisor, this may involve operations such
+ * as resetting the device, unbinding it from a dummy device driver
+ * and binding it to its appropriate driver.
+ *
+ * If the device is currently in use by a guest, this method may fail.
+ */
+int
+virNodeDeviceReAttach(virNodeDevicePtr dev)
+{
+ DEBUG("dev=%p, conn=%p", dev, dev ? dev->conn : NULL);
+
+ virResetLastError();
+
+ if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
+ virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
+ return (-1);
+ }
+
+ if (dev->conn->driver->nodeDeviceReAttach) {
+ int ret;
+ ret = dev->conn->driver->nodeDeviceReAttach (dev);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError(dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virSetConnError(dev->conn);
+ return (-1);
+}
+
+/**
+ * virNodeDeviceReset:
+ * @dev: pointer to the node device
+ *
+ * Reset a previously dettached node device to the node before or
+ * after assigning it to a guest.
+ *
+ * The exact reset semantics depends on the hypervisor and device
+ * type but, for example, KVM will attempt to reset PCI devices with
+ * a Function Level Reset, Secondary Bus Reset or a Power Management
+ * D-State reset.
+ *
+ * If the reset will affect other devices which are currently in use,
+ * this function may fail.
+ */
+int
+virNodeDeviceReset(virNodeDevicePtr dev)
+{
+ DEBUG("dev=%p, conn=%p", dev, dev ? dev->conn : NULL);
+
+ virResetLastError();
+
+ if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
+ virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
+ return (-1);
+ }
+
+ if (dev->conn->driver->nodeDeviceReset) {
+ int ret;
+ ret = dev->conn->driver->nodeDeviceReset (dev);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError(dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virSetConnError(dev->conn);
+ return (-1);
+}
+
/*
* Domain Event Notification
global:
virFreeError;
virSaveLastError;
+ virNodeDeviceDettach;
+ virNodeDeviceReAttach;
+ virNodeDeviceReset;
} LIBVIRT_0.6.0;
# .... define new API here using predicted next version number ....
NULL, /* domainEventDeregister */
NULL, /* domainMigratePrepare2 */
NULL, /* domainMigrateFinish2 */
+ NULL, /* nodeDeviceAttach */
+ NULL, /* nodeDeviceReAttach */
+ NULL, /* nodeDeviceReset */
};
static virStateDriver lxcStateDriver = {
NULL, /* domainEventDeregister */
NULL, /* domainMigratePrepare2 */
NULL, /* domainMigrateFinish2 */
+ NULL, /* nodeDeviceAttach */
+ NULL, /* nodeDeviceReAttach */
+ NULL, /* nodeDeviceReset */
};
int openvzRegister(void) {
qemudDomainEventDeregister, /* domainEventDeregister */
qemudDomainMigratePrepare2, /* domainMigratePrepare2 */
qemudDomainMigrateFinish2, /* domainMigrateFinish2 */
+ NULL, /* nodeDeviceDettach */
+ NULL, /* nodeDeviceReAttach */
+ NULL, /* nodeDeviceReset */
};
testDomainEventDeregister, /* domainEventDeregister */
NULL, /* domainMigratePrepare2 */
NULL, /* domainMigrateFinish2 */
+ NULL, /* nodeDeviceAttach */
+ NULL, /* nodeDeviceReAttach */
+ NULL, /* nodeDeviceReset */
};
static virNetworkDriver testNetworkDriver = {
NULL, /* domainEventUnregister */
NULL, /* domainMigratePrepare2 */
NULL, /* domainMigrateFinish2 */
+ NULL, /* nodeDeviceAttach */
+ NULL, /* nodeDeviceReAttach */
+ NULL, /* nodeDeviceReset */
};