qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kurz <gkurz@linux.vnet.ibm.com>
To: Kevin Wolf <kwolf@redhat.com>,
	Anthony Liguori <aliguori@amazon.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Amit Shah <amit.shah@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Cc: "Juan Quintela" <quintela@redhat.com>,
	"Fam Zheng" <famz@redhat.com>, "Alexander Graf" <agraf@suse.de>,
	"Andreas Färber" <afaerber@suse.de>,
	qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream
Date: Wed, 14 May 2014 17:41:38 +0200	[thread overview]
Message-ID: <20140514154137.10746.94708.stgit@bahia.local> (raw)
In-Reply-To: <20140514154130.10746.1412.stgit@bahia.local>

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 <agraf@suse.de>
Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
---
 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);

  reply	other threads:[~2014-05-14 15:42 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-14 15:41 [Qemu-devel] [PATCH RFC 0/8] virtio: migrate new properties Greg Kurz
2014-05-14 15:41 ` Greg Kurz [this message]
2014-05-15  6:04   ` [Qemu-devel] [PATCH RFC 1/8] virtio: add subsections to the migration stream Amit Shah
2014-05-15  6:23     ` Michael S. Tsirkin
2014-05-15  6:46       ` Amit Shah
2014-05-15  7:04         ` Greg Kurz
2014-05-15  9:20           ` Andreas Färber
2014-05-15  9:52             ` Michael S. Tsirkin
2014-05-15  9:58               ` Andreas Färber
2014-05-15 10:03                 ` Michael S. Tsirkin
2014-05-15 10:11                   ` Andreas Färber
2014-05-15 10:16                     ` Michael S. Tsirkin
2014-05-15 12:00                       ` Andreas Färber
2014-05-15 12:20                         ` Michael S. Tsirkin
2014-05-15 13:47                           ` Markus Armbruster
2014-05-15 13:49                         ` Greg Kurz
2014-05-15 12:33               ` Markus Armbruster
2014-05-15 12:58                 ` Michael S. Tsirkin
2014-05-15 13:35                   ` Greg Kurz
2014-05-15 10:08             ` Greg Kurz
2014-05-15 10:12               ` Michael S. Tsirkin
2014-05-15 10:21                 ` Greg Kurz
2014-05-15 10:16               ` Greg Kurz
2014-05-16  9:14               ` Fam Zheng
2014-05-16  9:22                 ` Andreas Färber
2014-05-16  9:40                   ` Fam Zheng
2014-05-16  9:48                     ` Greg Kurz
2014-05-17 18:29           ` Michael S. Tsirkin
2014-05-15  7:14         ` Michael S. Tsirkin
2014-05-15  6:49     ` Greg Kurz
2014-05-15  6:55       ` Amit Shah
2014-05-15  7:12       ` Michael S. Tsirkin
2014-05-14 15:41 ` [Qemu-devel] [PATCH RFC 2/8] virtio-net: migrate subsections Greg Kurz
2014-05-14 15:41 ` [Qemu-devel] [PATCH RFC 3/8] virtio-blk: " Greg Kurz
2014-05-14 15:42 ` [Qemu-devel] [PATCH RFC 4/8] virtio-scsi: " Greg Kurz
2014-05-14 15:42 ` [Qemu-devel] [PATCH RFC 5/8] virtio-serial: " Greg Kurz
2014-05-14 15:42 ` [Qemu-devel] [PATCH RFC 6/8] virtio-balloon: " Greg Kurz
2014-05-14 15:42 ` [Qemu-devel] [PATCH RFC 7/8] virtio-rng: " Greg Kurz
2014-05-14 15:42 ` [Qemu-devel] [PATCH RFC 8/8] virtio: add endian-ambivalent support to VirtIODevice Greg Kurz
     [not found]   ` <5384A8D2.8050104@redhat.com>
     [not found]     ` <20140529111253.4ff55199@bahia.local>
     [not found]       ` <538708FA.4070309@redhat.com>
2014-06-12  7:43         ` Greg Kurz
2014-06-12  7:54           ` Michael S. Tsirkin
2014-06-12  8:47             ` Greg Kurz
2014-06-12  9:05               ` Michael S. Tsirkin
2014-06-12  9:06               ` Alexander Graf
2014-06-12  8:55             ` Alexander Graf
2014-06-12  9:07               ` Michael S. Tsirkin
2014-06-12  9:08                 ` Alexander Graf
2014-06-12  8:55           ` Paolo Bonzini
2014-06-12  8:57             ` Alexander Graf
2014-06-12  9:06             ` Greg Kurz
2014-06-12  9:19               ` Paolo Bonzini
2014-06-12  9:37                 ` Michael S. Tsirkin
2014-06-12  9:39                   ` Paolo Bonzini
2014-06-12  9:43                     ` Alexander Graf
2014-06-12 10:14                       ` Greg Kurz
2014-06-12 10:39                         ` Alexander Graf
2014-06-12 10:50                           ` Greg Kurz
2014-06-12 10:58                             ` Alexander Graf
2014-06-12 10:59                             ` Michael S. Tsirkin
2014-06-12 11:10                               ` Greg Kurz
2014-06-12 10:57                         ` Michael S. Tsirkin
2014-06-12 10:56                       ` Michael S. Tsirkin
2014-06-12 10:55                     ` Michael S. Tsirkin

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=20140514154137.10746.94708.stgit@bahia.local \
    --to=gkurz@linux.vnet.ibm.com \
    --cc=afaerber@suse.de \
    --cc=agraf@suse.de \
    --cc=aliguori@amazon.com \
    --cc=amit.shah@redhat.com \
    --cc=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=stefanha@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).