From: KONRAD Frederic <fred.kon...@greensocs.com> Signed-off-by: KONRAD Frederic <fred.kon...@greensocs.com> --- hw/s390-virtio-bus.c | 7 ------- hw/vhost.c | 38 +++++++++++++++++++++++++----------- hw/virtio-bus.c | 17 ----------------- hw/virtio-bus.h | 4 ---- hw/virtio-pci.c | 13 ------------- hw/virtio.c | 54 +++++++++++++++++++++++++++++++--------------------- hw/virtio.h | 19 ------------------ 7 files changed, 59 insertions(+), 93 deletions(-)
diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c index 017fc0d..7b9cb60 100644 --- a/hw/s390-virtio-bus.c +++ b/hw/s390-virtio-bus.c @@ -52,8 +52,6 @@ static const TypeInfo s390_virtio_bus_info = { .instance_size = sizeof(VirtIOS390Bus), }; -static const VirtIOBindings virtio_s390_bindings; - static ram_addr_t s390_virtio_device_num_vq(VirtIOS390Device *dev); /* length of VirtIO device pages */ @@ -429,11 +427,6 @@ static unsigned virtio_s390_get_features(DeviceState *d) /**************** S390 Virtio Bus Device Descriptions *******************/ -static const VirtIOBindings virtio_s390_bindings = { - .notify = virtio_s390_notify, - .get_features = virtio_s390_get_features, -}; - static Property s390_virtio_net_properties[] = { DEFINE_NIC_PROPERTIES(VirtIONetS390, nic), DEFINE_PROP_UINT32("x-txtimer", VirtIONetS390, diff --git a/hw/vhost.c b/hw/vhost.c index 4e1cb47..7e9171d 100644 --- a/hw/vhost.c +++ b/hw/vhost.c @@ -19,6 +19,7 @@ #include "qemu/range.h" #include <linux/vhost.h> #include "exec/address-spaces.h" +#include "virtio-bus.h" static void vhost_dev_sync_region(struct vhost_dev *dev, MemoryRegionSection *section, @@ -811,9 +812,13 @@ void vhost_dev_cleanup(struct vhost_dev *hdev) bool vhost_dev_query(struct vhost_dev *hdev, VirtIODevice *vdev) { - return !vdev->binding->query_guest_notifiers || - vdev->binding->query_guest_notifiers(vdev->binding_opaque) || - hdev->force; + BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); + VirtioBusState *vbus = VIRTIO_BUS(qbus); + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); + + return !k->query_guest_notifiers || + k->query_guest_notifiers(qbus->parent) || + hdev->force; } /* Stop processing guest IO notifications in qemu. @@ -821,15 +826,18 @@ bool vhost_dev_query(struct vhost_dev *hdev, VirtIODevice *vdev) */ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) { + BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); + VirtioBusState *vbus = VIRTIO_BUS(qbus); + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); int i, r; - if (!vdev->binding->set_host_notifier) { + if (!k->set_host_notifier) { fprintf(stderr, "binding does not support host notifiers\n"); r = -ENOSYS; goto fail; } for (i = 0; i < hdev->nvqs; ++i) { - r = vdev->binding->set_host_notifier(vdev->binding_opaque, i, true); + r = k->set_host_notifier(qbus->parent, i, true); if (r < 0) { fprintf(stderr, "vhost VQ %d notifier binding failed: %d\n", i, -r); goto fail_vq; @@ -839,7 +847,7 @@ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) return 0; fail_vq: while (--i >= 0) { - r = vdev->binding->set_host_notifier(vdev->binding_opaque, i, false); + r = k->set_host_notifier(qbus->parent, i, false); if (r < 0) { fprintf(stderr, "vhost VQ %d notifier cleanup error: %d\n", i, -r); fflush(stderr); @@ -857,10 +865,13 @@ fail: */ void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) { + BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); + VirtioBusState *vbus = VIRTIO_BUS(qbus); + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); int i, r; for (i = 0; i < hdev->nvqs; ++i) { - r = vdev->binding->set_host_notifier(vdev->binding_opaque, i, false); + r = k->set_host_notifier(qbus->parent, i, false); if (r < 0) { fprintf(stderr, "vhost VQ %d notifier cleanup failed: %d\n", i, -r); fflush(stderr); @@ -872,14 +883,17 @@ void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) /* Host notifiers must be enabled at this point. */ int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev) { + BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); + VirtioBusState *vbus = VIRTIO_BUS(qbus); + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); int i, r; - if (!vdev->binding->set_guest_notifiers) { + if (!k->set_guest_notifiers) { fprintf(stderr, "binding does not support guest notifiers\n"); r = -ENOSYS; goto fail; } - r = vdev->binding->set_guest_notifiers(vdev->binding_opaque, true); + r = k->set_guest_notifiers(qbus->parent, true); if (r < 0) { fprintf(stderr, "Error binding guest notifier: %d\n", -r); goto fail_notifiers; @@ -929,7 +943,7 @@ fail_vq: } fail_mem: fail_features: - vdev->binding->set_guest_notifiers(vdev->binding_opaque, false); + k->set_guest_notifiers(qbus->parent, false); fail_notifiers: fail: return r; @@ -938,6 +952,8 @@ fail: /* Host notifiers must be enabled at this point. */ void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev) { + BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus); int i, r; for (i = 0; i < hdev->nvqs; ++i) { @@ -950,7 +966,7 @@ void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev) vhost_sync_dirty_bitmap(hdev, &hdev->mem_sections[i], 0, (hwaddr)~0x0ull); } - r = vdev->binding->set_guest_notifiers(vdev->binding_opaque, false); + r = k->set_guest_notifiers(qbus->parent, false); if (r < 0) { fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", r); fflush(stderr); diff --git a/hw/virtio-bus.c b/hw/virtio-bus.c index c5e67b0..ff93997 100644 --- a/hw/virtio-bus.c +++ b/hw/virtio-bus.c @@ -48,23 +48,6 @@ int virtio_bus_plug_device(VirtIODevice *vdev) bus->vdev = vdev; - /* - * The lines below will disappear when we drop VirtIOBindings, at the end - * of the series. - */ - bus->bindings.notify = klass->notify; - bus->bindings.save_config = klass->save_config; - bus->bindings.save_queue = klass->save_queue; - bus->bindings.load_config = klass->load_config; - bus->bindings.load_queue = klass->load_queue; - bus->bindings.load_done = klass->load_done; - bus->bindings.get_features = klass->get_features; - bus->bindings.query_guest_notifiers = klass->query_guest_notifiers; - bus->bindings.set_guest_notifiers = klass->set_guest_notifiers; - bus->bindings.set_host_notifier = klass->set_host_notifier; - bus->bindings.vmstate_change = klass->vmstate_change; - virtio_bind_device(bus->vdev, &bus->bindings, qbus->parent); - if (klass->device_plugged != NULL) { klass->device_plugged(qbus->parent); } diff --git a/hw/virtio-bus.h b/hw/virtio-bus.h index 7bea64a..9a43728 100644 --- a/hw/virtio-bus.h +++ b/hw/virtio-bus.h @@ -70,10 +70,6 @@ struct VirtioBusState { * Only one VirtIODevice can be plugged on the bus. */ VirtIODevice *vdev; - /* - * This will be removed at the end of the series. - */ - VirtIOBindings bindings; }; int virtio_bus_plug_device(VirtIODevice *vdev); diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 4588073..581ab76 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -712,19 +712,6 @@ static void virtio_pci_vmstate_change(DeviceState *d, bool running) } } -static const VirtIOBindings virtio_pci_bindings = { - .notify = virtio_pci_notify, - .save_config = virtio_pci_save_config, - .load_config = virtio_pci_load_config, - .save_queue = virtio_pci_save_queue, - .load_queue = virtio_pci_load_queue, - .get_features = virtio_pci_get_features, - .query_guest_notifiers = virtio_pci_query_guest_notifiers, - .set_host_notifier = virtio_pci_set_host_notifier, - .set_guest_notifiers = virtio_pci_set_guest_notifiers, - .vmstate_change = virtio_pci_vmstate_change, -}; - /* * virtio-pci : This is the PCIDevice which have a virtio-pci-bus. */ diff --git a/hw/virtio.c b/hw/virtio.c index d72b84a..a852adf 100644 --- a/hw/virtio.c +++ b/hw/virtio.c @@ -505,8 +505,12 @@ int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem) /* virtio device */ static void virtio_notify_vector(VirtIODevice *vdev, uint16_t vector) { - if (vdev->binding->notify) { - vdev->binding->notify(vdev->binding_opaque, vector); + BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); + VirtioBusState *vbus = VIRTIO_BUS(qbus); + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); + + if (k->notify) { + k->notify(qbus->parent, vector); } } @@ -776,10 +780,14 @@ void virtio_notify_config(VirtIODevice *vdev) void virtio_save(VirtIODevice *vdev, QEMUFile *f) { + BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); + VirtioBusState *vbus = VIRTIO_BUS(qbus); + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); int i; - if (vdev->binding->save_config) - vdev->binding->save_config(vdev->binding_opaque, f); + if (k->save_config) { + k->save_config(qbus->parent, f); + } qemu_put_8s(f, &vdev->status); qemu_put_8s(f, &vdev->isr); @@ -802,16 +810,19 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f) qemu_put_be32(f, vdev->vq[i].vring.num); qemu_put_be64(f, vdev->vq[i].pa); qemu_put_be16s(f, &vdev->vq[i].last_avail_idx); - if (vdev->binding->save_queue) - vdev->binding->save_queue(vdev->binding_opaque, i, f); + if (k->save_queue) { + k->save_queue(qbus->parent, i, f); + } } } int virtio_set_features(VirtIODevice *vdev, uint32_t val) { + BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); + VirtioBusState *vbus = VIRTIO_BUS(qbus); + VirtioBusClass *vbusk = VIRTIO_BUS_GET_CLASS(vbus); VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); - uint32_t supported_features = - vdev->binding->get_features(vdev->binding_opaque); + uint32_t supported_features = vbusk->get_features(qbus->parent); bool bad = (val & ~supported_features) != 0; val &= supported_features; @@ -827,9 +838,12 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f) int num, i, ret; uint32_t features; uint32_t supported_features; + BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); + VirtioBusState *vbus = VIRTIO_BUS(qbus); + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); - if (vdev->binding->load_config) { - ret = vdev->binding->load_config(vdev->binding_opaque, f); + if (k->load_config) { + ret = k->load_config(qbus->parent, f); if (ret) return ret; } @@ -840,7 +854,7 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f) qemu_get_be32s(f, &features); if (virtio_set_features(vdev, features) < 0) { - supported_features = vdev->binding->get_features(vdev->binding_opaque); + supported_features = k->get_features(qbus->parent); error_report("Features 0x%x unsupported. Allowed features: 0x%x", features, supported_features); return -1; @@ -876,8 +890,8 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f) i, vdev->vq[i].last_avail_idx); return -1; } - if (vdev->binding->load_queue) { - ret = vdev->binding->load_queue(vdev->binding_opaque, i, f); + if (k->load_queue) { + ret = k->load_queue(qbus->parent, i, f); if (ret) return ret; } @@ -903,6 +917,9 @@ void virtio_cleanup(VirtIODevice *vdev) static void virtio_vmstate_change(void *opaque, int running, RunState state) { VirtIODevice *vdev = opaque; + BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); + VirtioBusState *vbus = VIRTIO_BUS(qbus); + VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); bool backend_run = running && (vdev->status & VIRTIO_CONFIG_S_DRIVER_OK); vdev->vm_running = running; @@ -910,8 +927,8 @@ static void virtio_vmstate_change(void *opaque, int running, RunState state) virtio_set_status(vdev, vdev->status); } - if (vdev->binding->vmstate_change) { - vdev->binding->vmstate_change(vdev->binding_opaque, backend_run); + if (k->vmstate_change) { + k->vmstate_change(qbus->parent, backend_run); } if (!backend_run) { @@ -955,13 +972,6 @@ VirtIODevice *virtio_common_init(const char *name, uint16_t device_id, return vdev; } -void virtio_bind_device(VirtIODevice *vdev, const VirtIOBindings *binding, - DeviceState *opaque) -{ - vdev->binding = binding; - vdev->binding_opaque = opaque; -} - hwaddr virtio_queue_get_desc_addr(VirtIODevice *vdev, int n) { return vdev->vq[n].vring.desc; diff --git a/hw/virtio.h b/hw/virtio.h index fbbf8e8..3199676 100644 --- a/hw/virtio.h +++ b/hw/virtio.h @@ -90,20 +90,6 @@ typedef struct VirtQueueElement struct iovec out_sg[VIRTQUEUE_MAX_SIZE]; } VirtQueueElement; -typedef struct { - void (*notify)(DeviceState *d, uint16_t vector); - void (*save_config)(DeviceState *d, QEMUFile *f); - void (*save_queue)(DeviceState *d, int n, QEMUFile *f); - int (*load_config)(DeviceState *d, QEMUFile *f); - int (*load_queue)(DeviceState *d, int n, QEMUFile *f); - int (*load_done)(DeviceState *d, QEMUFile *f); - unsigned (*get_features)(DeviceState *d); - bool (*query_guest_notifiers)(DeviceState *d); - int (*set_guest_notifiers)(DeviceState *d, bool assigned); - int (*set_host_notifier)(DeviceState *d, int n, bool assigned); - void (*vmstate_change)(DeviceState *d, bool running); -} VirtIOBindings; - #define VIRTIO_PCI_QUEUE_MAX 64 #define VIRTIO_NO_VECTOR 0xffff @@ -129,8 +115,6 @@ struct VirtIODevice uint16_t config_vector; int nvectors; VirtQueue *vq; - const VirtIOBindings *binding; - DeviceState *binding_opaque; uint16_t device_id; bool vm_running; VMChangeStateEntry *vmstate; @@ -209,9 +193,6 @@ void virtio_reset(void *opaque); void virtio_update_irq(VirtIODevice *vdev); int virtio_set_features(VirtIODevice *vdev, uint32_t val); -void virtio_bind_device(VirtIODevice *vdev, const VirtIOBindings *binding, - DeviceState *opaque); - /* Base devices. */ typedef struct VirtIOBlkConf VirtIOBlkConf; VirtIODevice *virtio_blk_init(DeviceState *dev, VirtIOBlkConf *blk); -- 1.7.11.7