virtio: Start converting VirtioDevice to QOM realize
authorAndreas Färber <afaerber@suse.de>
Mon, 29 Jul 2013 22:50:27 +0000 (00:50 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 9 Dec 2013 20:46:49 +0000 (21:46 +0100)
Temporarily allow either VirtioDeviceClass::init or
VirtioDeviceClass::realize.

Introduce VirtioDeviceClass::unrealize for symmetry.

Signed-off-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
hw/virtio/virtio.c
include/hw/virtio/virtio.h

index 965b2c0233bec0dd9e2e64e39a83c2ad41e76826..4070b37d641c44ded94672aa800d7edefdb520df 100644 (file)
@@ -1150,40 +1150,52 @@ void virtio_device_set_child_bus_name(VirtIODevice *vdev, char *bus_name)
     }
 }
 
-static int virtio_device_init(DeviceState *qdev)
-{
-    VirtIODevice *vdev = VIRTIO_DEVICE(qdev);
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(qdev);
-    assert(k->init != NULL);
-    if (k->init(vdev) < 0) {
-        return -1;
+static void virtio_device_realize(DeviceState *dev, Error **errp)
+{
+    VirtIODevice *vdev = VIRTIO_DEVICE(dev);
+    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev);
+    Error *err = NULL;
+
+    assert(vdc->init != NULL || vdc->realize != NULL);
+    if (vdc->realize != NULL) {
+        vdc->realize(dev, &err);
+        if (err != NULL) {
+            error_propagate(errp, err);
+            return;
+        }
+    } else {
+        if (vdc->init(vdev) < 0) {
+            error_setg(errp, "Device initialization failed.");
+            return;
+        }
     }
     virtio_bus_device_plugged(vdev);
-    return 0;
 }
 
-static int virtio_device_exit(DeviceState *qdev)
+static void virtio_device_unrealize(DeviceState *dev, Error **errp)
 {
-    VirtIODevice *vdev = VIRTIO_DEVICE(qdev);
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(qdev);
+    VirtIODevice *vdev = VIRTIO_DEVICE(dev);
+    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(dev);
 
     virtio_bus_device_unplugged(vdev);
-    if (k->exit) {
+
+    if (k->exit != NULL) {
         k->exit(vdev);
     }
+
     if (vdev->bus_name) {
         g_free(vdev->bus_name);
         vdev->bus_name = NULL;
     }
-    return 0;
 }
 
 static void virtio_device_class_init(ObjectClass *klass, void *data)
 {
     /* Set the default value here. */
     DeviceClass *dc = DEVICE_CLASS(klass);
-    dc->init = virtio_device_init;
-    dc->exit = virtio_device_exit;
+
+    dc->realize = virtio_device_realize;
+    dc->unrealize = virtio_device_unrealize;
     dc->bus_type = TYPE_VIRTIO_BUS;
 }
 
index 59756c29b9da77174c8619592cb09a13abb31505..54c5efe4d0497b1443ccb61370e38bdc19e6509a 100644 (file)
@@ -124,10 +124,12 @@ struct VirtIODevice
 };
 
 typedef struct VirtioDeviceClass {
-    /* This is what a VirtioDevice must implement */
     DeviceClass parent;
+
+    /* This is what a VirtioDevice must implement */
     int (*init)(VirtIODevice *vdev);
     void (*exit)(VirtIODevice *vdev);
+    DeviceRealize realize;
     uint32_t (*get_features)(VirtIODevice *vdev, uint32_t requested_features);
     uint32_t (*bad_features)(VirtIODevice *vdev);
     void (*set_features)(VirtIODevice *vdev, uint32_t val);