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 <mdr...@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