diff mbox

[13/13] virtio: convert virtio_save/virtio_load interfaces to accept Visitors

Message ID 1319739445-17629-14-git-send-email-mdroth@linux.vnet.ibm.com
State New
Headers show

Commit Message

Michael Roth Oct. 27, 2011, 6:17 p.m. UTC
With all virtio_save/virtio_load users converted to visitors, modify the
interface to accept a Visitor directly, along with an Error** for error
propagation.

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
 hw/virtio-balloon.c    |    4 ++--
 hw/virtio-blk.c        |    4 ++--
 hw/virtio-net.c        |    4 ++--
 hw/virtio-pci.c        |   12 ++++--------
 hw/virtio-serial-bus.c |    4 ++--
 hw/virtio.c            |   37 +++++++++++++++++++------------------
 hw/virtio.h            |   14 +++++++-------
 7 files changed, 38 insertions(+), 41 deletions(-)
diff mbox

Patch

diff --git a/hw/virtio-balloon.c b/hw/virtio-balloon.c
index 242c58d..2ba8c91 100644
--- a/hw/virtio-balloon.c
+++ b/hw/virtio-balloon.c
@@ -251,7 +251,7 @@  static void virtio_balloon_save(QEMUFile *f, void *opaque)
 
     visit_start_struct(v, NULL, NULL, "virtio_balloon", 0, &err);
 
-    virtio_save(&s->vdev, f);
+    virtio_save(&s->vdev, v, &err);
 
     visit_type_uint32(v, &s->num_pages, "num_pages", &err);
     visit_type_uint32(v, &s->actual, "actual", &err);
@@ -275,7 +275,7 @@  static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id)
 
     visit_start_struct(v, NULL, NULL, "virtio_balloon", 0, &err);
 
-    virtio_load(&s->vdev, f);
+    virtio_load(&s->vdev, v, &err);
 
     visit_type_uint32(v, &s->num_pages, "num_pages", &err);
     visit_type_uint32(v, &s->actual, "actual", &err);
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index 2ddcc1e..4efc70e 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -518,7 +518,7 @@  static void virtio_blk_save(QEMUFile *f, void *opaque)
 
     visit_start_struct(v, NULL, NULL, "virtio_blk", 0, &err);
 
-    virtio_save(&s->vdev, f);
+    virtio_save(&s->vdev, v, &err);
     
     visit_start_list(v, "requests", &err);
     while (req) {
@@ -564,7 +564,7 @@  static int virtio_blk_load(QEMUFile *f, void *opaque, int version_id)
 
     visit_start_struct(v, NULL, NULL, "virtio_blk", 0, &err);
 
-    virtio_load(&s->vdev, f);
+    virtio_load(&s->vdev, v, &err);
 
     visit_start_list(v, "requests", &err);
     while (1) {
diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index 974af5c..a4ea61e 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -873,7 +873,7 @@  static void virtio_net_save(QEMUFile *f, void *opaque)
 
     visit_start_struct(v, NULL, NULL, "virtio_net", 0, &err);
 
-    virtio_save(&n->vdev, f);
+    virtio_save(&n->vdev, v, &err);
 
     visit_start_array(v, NULL, "mac", ETH_ALEN, 1, &err);
     for (i = 0; i < ETH_ALEN; i++) {
@@ -932,7 +932,7 @@  static int virtio_net_load(QEMUFile *f, void *opaque, int version_id)
 
     visit_start_struct(v, NULL, NULL, "virtio_net", 0, &err);
 
-    virtio_load(&n->vdev, f);
+    virtio_load(&n->vdev, v, &err);
 
     visit_start_array(v, NULL, "mac", ETH_ALEN, 1, &err);
     for (i = 0; i < ETH_ALEN; i++) {
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index cede802..051bcad 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -100,10 +100,9 @@  static void virtio_pci_notify(void *opaque, uint16_t vector)
         qemu_set_irq(proxy->pci_dev.irq[0], proxy->vdev->isr & 1);
 }
 
-static void virtio_pci_save_config(void * opaque, QEMUFile *f)
+static void virtio_pci_save_config(void * opaque, Visitor *v, Error **errp)
 {
     VirtIOPCIProxy *proxy = opaque;
-    Visitor *v = qemu_file_get_visitor(f);
     Error *err = NULL;
 
     pci_device_save(&proxy->pci_dev, v, &err);
@@ -119,10 +118,9 @@  static void virtio_pci_save_config(void * opaque, QEMUFile *f)
     }
 }
 
-static void virtio_pci_save_queue(void * opaque, int n, QEMUFile *f)
+static void virtio_pci_save_queue(void * opaque, int n, Visitor *v, Error **errp)
 {
     VirtIOPCIProxy *proxy = opaque;
-    Visitor *v = qemu_file_get_visitor(f);
     Error *err = NULL;
     uint16_t vector;
 
@@ -137,10 +135,9 @@  static void virtio_pci_save_queue(void * opaque, int n, QEMUFile *f)
     }
 }
 
-static int virtio_pci_load_config(void * opaque, QEMUFile *f)
+static int virtio_pci_load_config(void * opaque, Visitor *v, Error **errp)
 {
     VirtIOPCIProxy *proxy = opaque;
-    Visitor *v = qemu_file_get_visitor(f);
     Error *err = NULL;
     int ret;
 
@@ -167,10 +164,9 @@  out:
     return ret;
 }
 
-static int virtio_pci_load_queue(void * opaque, int n, QEMUFile *f)
+static int virtio_pci_load_queue(void * opaque, int n, Visitor *v, Error **errp)
 {
     VirtIOPCIProxy *proxy = opaque;
-    Visitor *v = qemu_file_get_visitor(f);
     Error *err = NULL;
     uint16_t vector;
     int ret = 0;
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
index 78cd643..97d389f 100644
--- a/hw/virtio-serial-bus.c
+++ b/hw/virtio-serial-bus.c
@@ -528,7 +528,7 @@  static void virtio_serial_save(QEMUFile *f, void *opaque)
     visit_start_struct(v, NULL, NULL, "virtio_serial", 0, &err);
 
     /* The virtio device */
-    virtio_save(&s->vdev, f);
+    virtio_save(&s->vdev, v, &err);
 
     /* The config space */
     visit_type_uint16(v, &s->config.cols, "config.cols", &err);
@@ -612,7 +612,7 @@  static int virtio_serial_load(QEMUFile *f, void *opaque, int version_id)
     visit_start_struct(v, NULL, NULL, "virtio_serial", 0, &err);
 
     /* The virtio device */
-    virtio_load(&s->vdev, f);
+    virtio_load(&s->vdev, v, &err);
 
     if (version_id < 2) {
         goto out;
diff --git a/hw/virtio.c b/hw/virtio.c
index 0471c54..1791083 100644
--- a/hw/virtio.c
+++ b/hw/virtio.c
@@ -730,10 +730,9 @@  void virtio_notify_config(VirtIODevice *vdev)
     virtio_notify_vector(vdev, vdev->config_vector);
 }
 
-void virtio_save(VirtIODevice *vdev, QEMUFile *f)
+void virtio_save(VirtIODevice *vdev, Visitor *v, Error **errp)
 {
     int i;
-    Visitor *v = qemu_file_get_visitor(f);
     Error *err = NULL;
     uint8_t *config;
     uint64_t tmp;
@@ -741,7 +740,7 @@  void virtio_save(VirtIODevice *vdev, QEMUFile *f)
     visit_start_struct(v, NULL, NULL, "vdev", 0, &err);
 
     if (vdev->binding->save_config) {
-        vdev->binding->save_config(vdev->binding_opaque, f);
+        vdev->binding->save_config(vdev->binding_opaque, v, &err);
     }
 
     visit_type_uint8(v, &vdev->status, "status", &err);
@@ -781,7 +780,7 @@  void virtio_save(VirtIODevice *vdev, QEMUFile *f)
         visit_type_uint16(v, &vdev->vq[i].last_avail_idx, "last_avail_idx",
                           &err);
         if (vdev->binding->save_queue) {
-            vdev->binding->save_queue(vdev->binding_opaque, i, f);
+            vdev->binding->save_queue(vdev->binding_opaque, i, v, &err);
         }
         
         visit_end_struct(v, &err);
@@ -792,17 +791,16 @@  void virtio_save(VirtIODevice *vdev, QEMUFile *f)
 
     if (err) {
         error_report("error saving virtio state: %s", error_get_pretty(err));
-        error_free(err);
+        error_propagate(errp, err);
     }
 }
 
-int virtio_load(VirtIODevice *vdev, QEMUFile *f)
+int virtio_load(VirtIODevice *vdev, Visitor *v, Error **errp)
 {
     uint32_t num, i, ret;
     uint32_t features;
     uint32_t supported_features =
         vdev->binding->get_features(vdev->binding_opaque);
-    Visitor *v = qemu_file_get_visitor(f);
     Error *err = NULL;
     uint8_t *config;
     uint64_t tmp;
@@ -810,9 +808,9 @@  int virtio_load(VirtIODevice *vdev, QEMUFile *f)
     visit_start_struct(v, NULL, NULL, "vdev", 0, &err);
 
     if (vdev->binding->load_config) {
-        ret = vdev->binding->load_config(vdev->binding_opaque, f);
+        ret = vdev->binding->load_config(vdev->binding_opaque, v, &err);
         if (ret) {
-            return ret;
+            goto out;
         }
     }
 
@@ -823,7 +821,8 @@  int virtio_load(VirtIODevice *vdev, QEMUFile *f)
     if (features & ~supported_features) {
         error_report("Features 0x%x unsupported. Allowed features: 0x%x",
                      features, supported_features);
-        return -1;
+        ret = -1;
+        goto out;
     }
     if (vdev->set_features)
         vdev->set_features(vdev, features);
@@ -862,18 +861,20 @@  int virtio_load(VirtIODevice *vdev, QEMUFile *f)
                              i, vdev->vq[i].vring.num,
                              vring_avail_idx(&vdev->vq[i]),
                              vdev->vq[i].last_avail_idx, nheads);
-                return -1;
+                ret = -1;
+                goto out;
             }
         } else if (vdev->vq[i].last_avail_idx) {
             error_report("VQ %d address 0x0 "
                          "inconsistent with Host index 0x%x",
                          i, vdev->vq[i].last_avail_idx);
-            return -1;
+            ret = -1;
+            goto out;
         }
         if (vdev->binding->load_queue) {
-            ret = vdev->binding->load_queue(vdev->binding_opaque, i, f);
+            ret = vdev->binding->load_queue(vdev->binding_opaque, i, v, &err);
             if (ret) {
-                return ret;
+                goto out;
             }
         }
         visit_end_struct(v, &err);
@@ -882,14 +883,14 @@  int virtio_load(VirtIODevice *vdev, QEMUFile *f)
 
     visit_end_struct(v, &err);
 
+    virtio_notify_vector(vdev, VIRTIO_NO_VECTOR);
+out:
     if (err) {
         error_report("error loading virtio state: %s", error_get_pretty(err));
-        error_free(err);
-        return -1;
+        error_propagate(errp, err);
     }
 
-    virtio_notify_vector(vdev, VIRTIO_NO_VECTOR);
-    return 0;
+    return ret;
 }
 
 void virtio_cleanup(VirtIODevice *vdev)
diff --git a/hw/virtio.h b/hw/virtio.h
index 2d18209..0695606 100644
--- a/hw/virtio.h
+++ b/hw/virtio.h
@@ -93,11 +93,11 @@  typedef struct 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);
+    void (*save_config)(void * opaque, Visitor *v, Error **errp);
+    void (*save_queue)(void * opaque, int n, Visitor *v, Error **errp);
+    int (*load_config)(void * opaque, Visitor *v, Error **errp);
+    int (*load_queue)(void * opaque, int n, Visitor *v, Error **errp);
+    int (*load_done)(void * opaque, Visitor *v, Error **errp);
     unsigned (*get_features)(void * opaque);
     bool (*query_guest_notifiers)(void * opaque);
     int (*set_guest_notifiers)(void * opaque, bool assigned);
@@ -152,9 +152,9 @@  int virtqueue_avail_bytes(VirtQueue *vq, int in_bytes, int out_bytes);
 
 void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
 
-void virtio_save(VirtIODevice *vdev, QEMUFile *f);
+void virtio_save(VirtIODevice *vdev, Visitor *v, Error **errp);
 
-int virtio_load(VirtIODevice *vdev, QEMUFile *f);
+int virtio_load(VirtIODevice *vdev, Visitor *v, Error **errp);
 
 void virtio_cleanup(VirtIODevice *vdev);