qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: aliguori@us.ibm.com, mdroth@linux.vnet.ibm.com, quintela@redhat.com
Subject: [Qemu-devel] [PATCH 13/13] virtio: convert virtio_save/virtio_load interfaces to accept Visitors
Date: Thu, 27 Oct 2011 13:17:25 -0500	[thread overview]
Message-ID: <1319739445-17629-14-git-send-email-mdroth@linux.vnet.ibm.com> (raw)
In-Reply-To: <1319739445-17629-1-git-send-email-mdroth@linux.vnet.ibm.com>

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 --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);
 
-- 
1.7.4.1

      parent reply	other threads:[~2011-10-27 18:23 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-27 18:17 [Qemu-devel] [PATCH 00/13] Convert slirp/ivshmem/virtio save/load to Visitors Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 01/13] slirp: convert save/load function to visitor interface Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 02/13] ivshmem: convert save/load to visitor Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 03/13] virtio-pci: convert save/load to visitors Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 04/13] msix: convert save/load to visitors (including interfaces) Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 05/13] openpic: convert save/load to visitors Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 06/13] i440fx: " Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 07/13] pci: convert pci_device_(save|load) interfaces to accept Visitors Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 08/13] virtio: convert common virtio save/load to visitors Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 09/13] virtio-balloon: convert " Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 10/13] virtio-blk: " Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 11/13] virtio-net: " Michael Roth
2011-10-27 18:17 ` [Qemu-devel] [PATCH 12/13] virtio-serial: " Michael Roth
2011-10-27 18:17 ` Michael Roth [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1319739445-17629-14-git-send-email-mdroth@linux.vnet.ibm.com \
    --to=mdroth@linux.vnet.ibm.com \
    --cc=aliguori@us.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).