Patchwork [RFC,V8,14/15] virtio : Remove VirtIOBindings.

login
register
mail settings
Submitter fred.konrad@greensocs.com
Date Dec. 19, 2012, 9:53 a.m.
Message ID <1355910821-21302-15-git-send-email-fred.konrad@greensocs.com>
Download mbox | patch
Permalink /patch/207316/
State New
Headers show

Comments

fred.konrad@greensocs.com - Dec. 19, 2012, 9:53 a.m.
From: KONRAD Frederic <fred.konrad@greensocs.com>

This remove VirtIOBindings and use VirtioBusClass instead. It should be applied
when all the device have been refactored.

Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
---
 hw/virtio-bus.c | 20 --------------------
 hw/virtio-bus.h |  6 ------
 hw/virtio.c     | 52 +++++++++++++++++++++++++++++++---------------------
 hw/virtio.h     | 19 -------------------
 4 files changed, 31 insertions(+), 66 deletions(-)
Blue Swirl - Dec. 19, 2012, 7:54 p.m.
On Wed, Dec 19, 2012 at 9:53 AM,  <fred.konrad@greensocs.com> wrote:
> From: KONRAD Frederic <fred.konrad@greensocs.com>
>
> This remove VirtIOBindings and use VirtioBusClass instead. It should be applied
> when all the device have been refactored.
>
> Signed-off-by: KONRAD Frederic <fred.konrad@greensocs.com>
> ---
>  hw/virtio-bus.c | 20 --------------------
>  hw/virtio-bus.h |  6 ------
>  hw/virtio.c     | 52 +++++++++++++++++++++++++++++++---------------------
>  hw/virtio.h     | 19 -------------------
>  4 files changed, 31 insertions(+), 66 deletions(-)
>
> diff --git a/hw/virtio-bus.c b/hw/virtio-bus.c
> index 7a3d06e..6da587d 100644
> --- a/hw/virtio-bus.c
> +++ b/hw/virtio-bus.c
> @@ -51,26 +51,6 @@ int virtio_bus_plug_device(VirtIODevice *vdev)
>      if (klass->device_plugged != NULL) {
>          klass->device_plugged(qbus->parent);
>      }
> -
> -    /*
> -     * The lines below will disappear when we drop VirtIOBindings, at the end
> -     * of the serie.
> -     */
> -    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);
> -    /*
> -     */
> -
>      return 0;
>  }
>
> diff --git a/hw/virtio-bus.h b/hw/virtio-bus.h
> index a2e2012..a5e2a87 100644
> --- a/hw/virtio-bus.h
> +++ b/hw/virtio-bus.h
> @@ -70,12 +70,6 @@ struct VirtioBusState {
>       * Only one VirtIODevice can be plugged on the bus.
>       */
>      VirtIODevice *vdev;
> -    /*
> -     * This will be removed at the end of the serie.
> -     */
> -    VirtIOBindings bindings;
> -    /*
> -     */
>  };
>
>  int virtio_bus_plug_device(VirtIODevice *vdev);
> diff --git a/hw/virtio.c b/hw/virtio.c
> index 82bf3dd..d124ca0 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)

Please add braces.

> +            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);
> +        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,
> -                        void *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 857fd78..82726a3 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)(void * opaque, uint16_t vector);
> -    void (*save_config)(void * opaque, QEMUFile *f);
> -    void (*save_queue)(void * opaque, int n, QEMUFile *f);
> -    int (*load_config)(void * opaque, QEMUFile *f);
> -    int (*load_queue)(void * opaque, int n, QEMUFile *f);
> -    int (*load_done)(void * opaque, QEMUFile *f);
> -    unsigned (*get_features)(void * opaque);
> -    bool (*query_guest_notifiers)(void * opaque);
> -    int (*set_guest_notifiers)(void * opaque, bool assigned);
> -    int (*set_host_notifier)(void * opaque, int n, bool assigned);
> -    void (*vmstate_change)(void * opaque, 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;
> -    void *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,
> -                        void *opaque);
> -
>  /* Base devices.  */
>  typedef struct VirtIOBlkConf VirtIOBlkConf;
>  VirtIODevice *virtio_blk_init(DeviceState *dev, VirtIOBlkConf *blk);
> --
> 1.7.11.7
>
>

Patch

diff --git a/hw/virtio-bus.c b/hw/virtio-bus.c
index 7a3d06e..6da587d 100644
--- a/hw/virtio-bus.c
+++ b/hw/virtio-bus.c
@@ -51,26 +51,6 @@  int virtio_bus_plug_device(VirtIODevice *vdev)
     if (klass->device_plugged != NULL) {
         klass->device_plugged(qbus->parent);
     }
-
-    /*
-     * The lines below will disappear when we drop VirtIOBindings, at the end
-     * of the serie.
-     */
-    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);
-    /*
-     */
-
     return 0;
 }
 
diff --git a/hw/virtio-bus.h b/hw/virtio-bus.h
index a2e2012..a5e2a87 100644
--- a/hw/virtio-bus.h
+++ b/hw/virtio-bus.h
@@ -70,12 +70,6 @@  struct VirtioBusState {
      * Only one VirtIODevice can be plugged on the bus.
      */
     VirtIODevice *vdev;
-    /*
-     * This will be removed at the end of the serie.
-     */
-    VirtIOBindings bindings;
-    /*
-     */
 };
 
 int virtio_bus_plug_device(VirtIODevice *vdev);
diff --git a/hw/virtio.c b/hw/virtio.c
index 82bf3dd..d124ca0 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);
+        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,
-                        void *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 857fd78..82726a3 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)(void * opaque, uint16_t vector);
-    void (*save_config)(void * opaque, QEMUFile *f);
-    void (*save_queue)(void * opaque, int n, QEMUFile *f);
-    int (*load_config)(void * opaque, QEMUFile *f);
-    int (*load_queue)(void * opaque, int n, QEMUFile *f);
-    int (*load_done)(void * opaque, QEMUFile *f);
-    unsigned (*get_features)(void * opaque);
-    bool (*query_guest_notifiers)(void * opaque);
-    int (*set_guest_notifiers)(void * opaque, bool assigned);
-    int (*set_host_notifier)(void * opaque, int n, bool assigned);
-    void (*vmstate_change)(void * opaque, 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;
-    void *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,
-                        void *opaque);
-
 /* Base devices.  */
 typedef struct VirtIOBlkConf VirtIOBlkConf;
 VirtIODevice *virtio_blk_init(DeviceState *dev, VirtIOBlkConf *blk);