Commit 1d244b42 authored by Andreas Färber's avatar Andreas Färber Committed by Paolo Bonzini
Browse files

virtio: Start converting VirtioDevice to QOM realize



Temporarily allow either VirtioDeviceClass::init or
VirtioDeviceClass::realize.

Introduce VirtioDeviceClass::unrealize for symmetry.

Signed-off-by: default avatarAndreas Färber <afaerber@suse.de>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 7598f0f3
Loading
Loading
Loading
Loading
+27 −15
Original line number Diff line number Diff line
@@ -1150,40 +1150,52 @@ void virtio_device_set_child_bus_name(VirtIODevice *vdev, char *bus_name)
    }
}

static int virtio_device_init(DeviceState *qdev)
static void virtio_device_realize(DeviceState *dev, Error **errp)
{
    VirtIODevice *vdev = VIRTIO_DEVICE(qdev);
    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(qdev);
    assert(k->init != NULL);
    if (k->init(vdev) < 0) {
        return -1;
    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;
}

+3 −1
Original line number Diff line number Diff line
@@ -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);