[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration st
From: |
Greg Kurz |
Subject: |
[Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream |
Date: |
Wed, 14 May 2014 17:41:38 +0200 |
User-agent: |
StGit/0.16 |
There is a need to add some more fields to VirtIODevice that should be
migrated (broken status, endianness). The problem is that we do not
want to break compatibility while adding a new feature... This issue has
been addressed in the generic VMState code with the use of optional
subsections. As a *temporary* alternative to port the whole virtio
migration code to VMState, this patch mimics a similar subsectionning
ability for virtio.
Since each virtio device is streamed in its own section, the idea is to
stream subsections between the end of the device section and the start
of the next sections. This allows an older QEMU to complain and exit
when fed with subsections:
Unknown savevm section type 5
Error -22 while loading VM state
All users of virtio_load()/virtio_save() need to be patched because the
subsections are streamed AFTER the device itself.
Suggested-by: Alexander Graf <address@hidden>
Signed-off-by: Greg Kurz <address@hidden>
---
hw/virtio/virtio.c | 65 ++++++++++++++++++++++++++++++++++++++++++++
include/hw/virtio/virtio.h | 4 +++
2 files changed, 69 insertions(+)
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index aeabf3a..f4eaa3f 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -19,6 +19,7 @@
#include "hw/virtio/virtio.h"
#include "qemu/atomic.h"
#include "hw/virtio/virtio-bus.h"
+#include "migration/migration.h"
/*
* The alignment to use between consumer and producer parts of vring.
@@ -833,6 +834,70 @@ void virtio_notify_config(VirtIODevice *vdev)
virtio_notify_vector(vdev, vdev->config_vector);
}
+static const struct VirtIOSubsectionDescStruct {
+ const char *name;
+ int version_id;
+ void (*save)(VirtIODevice *vdev, QEMUFile *f);
+ int (*load)(VirtIODevice *vdev, QEMUFile *f);
+} virtio_subsection[] = {
+ { .name = NULL }
+};
+
+void virtio_save_subsections(VirtIODevice *vdev, QEMUFile *f)
+{
+ int i;
+
+ for (i = 0; virtio_subsection[i].name; i++) {
+ const char *name = virtio_subsection[i].name;
+ uint8_t len = strlen(name);
+
+ qemu_put_byte(f, QEMU_VM_SUBSECTION);
+ qemu_put_byte(f, len);
+ qemu_put_buffer(f, (uint8_t *) name, len);
+ qemu_put_be32(f, virtio_subsection[i].version_id);
+ (*virtio_subsection[i].save)(vdev, f);
+ }
+}
+
+int virtio_load_subsections(VirtIODevice *vdev, QEMUFile *f)
+{
+ while (qemu_peek_byte(f, 0) == QEMU_VM_SUBSECTION) {
+ char idstr[256];
+ uint8_t len, size;
+ int i;
+
+ len = qemu_peek_byte(f, 1);
+ size = qemu_peek_buffer(f, (uint8_t *) idstr, len, 2);
+ if (size != len) {
+ break;
+ }
+
+ idstr[size] = 0;
+
+ for (i = 0; virtio_subsection[i].name; i++) {
+ if (strcmp(virtio_subsection[i].name, idstr) == 0) {
+ uint32_t version_id;
+ int ret;
+
+ qemu_file_skip(f, 1); /* subsection */
+ qemu_file_skip(f, 1); /* len */
+ qemu_file_skip(f, len); /* idstr */
+
+ version_id = qemu_get_be32(f);
+ if (version_id > virtio_subsection[i].version_id) {
+ return -EINVAL;
+ }
+ ret = (*virtio_subsection[i].load)(vdev, f);
+ if (ret) {
+ return ret;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
void virtio_save(VirtIODevice *vdev, QEMUFile *f)
{
BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index 3e54e90..82f852f 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -186,6 +186,10 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f);
int virtio_load(VirtIODevice *vdev, QEMUFile *f);
+void virtio_save_subsections(VirtIODevice *vdev, QEMUFile *f);
+
+int virtio_load_subsections(VirtIODevice *vdev, QEMUFile *f);
+
void virtio_notify_config(VirtIODevice *vdev);
void virtio_queue_set_notification(VirtQueue *vq, int enable);
- [Qemu-devel] [PATCH RFC 0/8] virtio: migrate new properties, Greg Kurz, 2014/05/14
- [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream,
Greg Kurz <=
- Re: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream, Amit Shah, 2014/05/15
- Re: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream, Michael S. Tsirkin, 2014/05/15
- Re: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream, Amit Shah, 2014/05/15
- Re: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream, Greg Kurz, 2014/05/15
- Re: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream, Andreas Färber, 2014/05/15
- Re: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream, Michael S. Tsirkin, 2014/05/15
- Re: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream, Andreas Färber, 2014/05/15
- Re: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream, Michael S. Tsirkin, 2014/05/15
- Re: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream, Andreas Färber, 2014/05/15
- Re: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream, Michael S. Tsirkin, 2014/05/15