qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset
@ 2014-09-26 15:19 Boris Sukholitko
  2014-09-26 15:19 ` [Qemu-devel] [PATCH 1/2] virtio-9p: Add support for 9p migration Boris Sukholitko
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Boris Sukholitko @ 2014-09-26 15:19 UTC (permalink / raw)
  To: qemu-devel

This patchset is a small rebase of the 9p live migration patches made a year
ago by Benoit Canet.

See http://lists.gnu.org/archive/html/qemu-devel/2013-04/msg02190.html
for the previous thread.

I took the liberty to drop the second patch (waiting for completion of 9p
operations) as it wasn't working in my testing.

Thanks,
Boris.

Boris Sukholitko (2):
  virtio-9p: Add support for 9p migration.
  virtio-9p: Remove migration blockers.

 hw/9pfs/virtio-9p-device.c | 152 +++++++++++++++++++++++++++++++++++++++++++++
 hw/9pfs/virtio-9p.c        |  24 -------
 hw/9pfs/virtio-9p.h        |   2 -
 3 files changed, 152 insertions(+), 26 deletions(-)

-- 
2.0.2

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 1/2] virtio-9p: Add support for 9p migration.
  2014-09-26 15:19 [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset Boris Sukholitko
@ 2014-09-26 15:19 ` Boris Sukholitko
  2014-09-29 21:48   ` Benoît Canet
  2014-09-26 15:19 ` [Qemu-devel] [PATCH 2/2] virtio-9p: Remove migration blockers Boris Sukholitko
  2014-09-29 21:46 ` [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset Benoît Canet
  2 siblings, 1 reply; 9+ messages in thread
From: Boris Sukholitko @ 2014-09-26 15:19 UTC (permalink / raw)
  To: qemu-devel

This patch is a rebase of Aneesh Kumar's and Benoit Canet's previous
work.

Signed-off-by: Boris Sukholitko <boriss@gmail.com>
---
 hw/9pfs/virtio-9p-device.c | 152 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 152 insertions(+)

diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c
index 2572747..078ad39 100644
--- a/hw/9pfs/virtio-9p-device.c
+++ b/hw/9pfs/virtio-9p-device.c
@@ -21,6 +21,149 @@
 #include "virtio-9p-coth.h"
 #include "hw/virtio/virtio-access.h"
 
+static void virtio_9p_save_path(QEMUFile *f, V9fsPath *path)
+{
+    qemu_put_be16(f, path->size);
+    qemu_put_buffer(f, (const uint8_t *) path->data, path->size);
+}
+
+static void virtio_9p_save_string(QEMUFile *f, V9fsString *s)
+{
+    qemu_put_be16(f, s->size);
+    qemu_put_buffer(f, (const uint8_t *) s->data, s->size);
+}
+
+static void virtio_9p_save_xattr(QEMUFile *f, V9fsXattr *xattr)
+{
+    qemu_put_be64(f, xattr->copied_len);
+    qemu_put_be64(f, xattr->len);
+    qemu_put_buffer(f, (const uint8_t *) xattr->value, xattr->len);
+    virtio_9p_save_string(f, &xattr->name);
+    qemu_put_be32(f, xattr->flags);
+}
+
+static void virtio_9p_save_fid(QEMUFile *f, V9fsFidState *fid)
+{
+    /* First close the fid and mark it for reopen if migration fail */
+    if (fid->fid_type == P9_FID_FILE) {
+        close(fid->fs.fd);
+        fid->fs.fd = -1;
+    } else if (fid->fid_type == P9_FID_DIR) {
+        closedir(fid->fs.dir);
+        fid->fs.dir = NULL;
+    }
+
+    qemu_put_be32(f, fid->fid_type);
+    if (fid->fid_type == P9_FID_XATTR) {
+        /* we don't save fs_reclaim */
+        virtio_9p_save_xattr(f, &fid->fs.xattr);
+    }
+    qemu_put_be32(f, fid->fid);
+    virtio_9p_save_path(f, &fid->path);
+    qemu_put_be32(f, fid->flags);
+    qemu_put_be32(f, fid->open_flags);
+    qemu_put_be32(f, fid->uid);
+    qemu_put_be32(f, fid->ref);
+    qemu_put_be32(f, fid->clunked);
+}
+
+static void virtio_9p_save(QEMUFile *f, void *opaque)
+{
+    int fidcount = 0;
+    V9fsState *s = opaque;
+    V9fsFidState *fid;
+
+    virtio_save(VIRTIO_DEVICE(s), f);
+
+    for (fid = s->fid_list; fid; fid = fid->next) {
+        fidcount++;
+    }
+    /* Write the total number of fid structure */
+    qemu_put_be32(f, fidcount);
+
+    for (fid = s->fid_list; fid; fid = fid->next) {
+        virtio_9p_save_fid(f, fid);
+    }
+
+    qemu_put_be32(f, s->proto_version);
+    qemu_put_be32(f, s->msize);
+}
+
+static void virtio_9p_load_path(QEMUFile *f, V9fsPath *path)
+{
+    path->size = qemu_get_be16(f);
+    path->data = g_malloc0(path->size);
+    qemu_get_buffer(f, (uint8_t *) path->data, path->size);
+}
+
+static void virtio_9p_load_string(QEMUFile *f, V9fsString *s)
+{
+    s->size = qemu_get_be16(f);
+    s->data = g_malloc0(s->size);
+    qemu_get_buffer(f, (uint8_t *) s->data, s->size);
+}
+
+static void virtio_9p_load_xattr(QEMUFile *f, V9fsXattr *xattr)
+{
+    xattr->copied_len = qemu_get_be64(f);
+    xattr->len = qemu_get_be64(f);
+    qemu_get_buffer(f, (uint8_t *) xattr->value, xattr->len);
+    virtio_9p_load_string(f, &xattr->name);
+    xattr->flags = qemu_get_be32(f);
+}
+
+static V9fsFidState *virtio_9p_load_fid(QEMUFile *f)
+{
+    V9fsFidState *fid;
+    fid = g_new0(V9fsFidState, 1);
+
+    fid->fid_type    = qemu_get_be32(f);
+    if (fid->fid_type == P9_FID_XATTR) {
+        virtio_9p_load_xattr(f, &fid->fs.xattr);
+    }
+    fid->fid         = qemu_get_be32(f);
+    virtio_9p_load_path(f, &fid->path);
+    fid->flags       = qemu_get_be32(f);
+    fid->open_flags  = qemu_get_be32(f);
+    fid->uid         = qemu_get_be32(f);
+    fid->ref         = qemu_get_be32(f);
+    fid->clunked     = qemu_get_be32(f);
+
+    /* If it's a file fid mark the file descriptors as closed.
+     * DIR is null thanks to g_new0.
+     * When doing get_fid v9fs_reopen_fid will reopen the file or the directory.
+     */
+    if (fid->fid_type == P9_FID_FILE) {
+        fid->fs.fd = -1;
+    }
+    return fid;
+}
+
+static int virtio_9p_load(QEMUFile *f, void *opaque, int version_id)
+{
+    int fidcount;
+    V9fsState *s = opaque;
+    V9fsFidState **fid;
+
+    if (version_id != 2) {
+        return -EINVAL;
+    }
+    virtio_load(VIRTIO_DEVICE(s), f, version_id);
+    fidcount = qemu_get_be32(f);
+
+    fid = &s->fid_list;
+    while (fidcount) {
+        *fid = virtio_9p_load_fid(f);
+        fid = &((*fid)->next);
+        fidcount--;
+    }
+
+    s->proto_version  = qemu_get_be32(f);
+    s->msize          = qemu_get_be32(f);
+
+    return 0;
+}
+
 static uint32_t virtio_9p_get_features(VirtIODevice *vdev, uint32_t features)
 {
     features |= 1 << VIRTIO_9P_MOUNT_TAG;
@@ -50,6 +193,7 @@ static void virtio_9p_device_realize(DeviceState *dev, Error **errp)
     struct stat stat;
     FsDriverEntry *fse;
     V9fsPath path;
+    static int virtio_9p_id;
 
     virtio_init(vdev, "virtio-9p", VIRTIO_ID_9P,
                 sizeof(struct virtio_9p_config) + MAX_TAG_LEN);
@@ -98,6 +242,14 @@ static void virtio_9p_device_realize(DeviceState *dev, Error **errp)
     s->ops = fse->ops;
     s->config_size = sizeof(struct virtio_9p_config) + len;
     s->fid_list = NULL;
+
+    /* Original patch says that instance id must be derived of tag
+     * name. Hash functions do have collisions so why would it be better
+     * than an increment ?
+     */
+    register_savevm(dev, "virtio-9p", virtio_9p_id++, 2,
+                    virtio_9p_save, virtio_9p_load, s);
+
     qemu_co_rwlock_init(&s->rename_lock);
 
     if (s->ops->init(&s->ctx) < 0) {
-- 
2.0.2

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 2/2] virtio-9p: Remove migration blockers.
  2014-09-26 15:19 [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset Boris Sukholitko
  2014-09-26 15:19 ` [Qemu-devel] [PATCH 1/2] virtio-9p: Add support for 9p migration Boris Sukholitko
@ 2014-09-26 15:19 ` Boris Sukholitko
  2014-09-29 21:46 ` [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset Benoît Canet
  2 siblings, 0 replies; 9+ messages in thread
From: Boris Sukholitko @ 2014-09-26 15:19 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Boris Sukholitko <boriss@gmail.com>
---
 hw/9pfs/virtio-9p.c | 24 ------------------------
 hw/9pfs/virtio-9p.h |  2 --
 2 files changed, 26 deletions(-)

diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 5861a5b..2bf3c0a 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -332,19 +332,6 @@ static int put_fid(V9fsPDU *pdu, V9fsFidState *fidp)
      * Don't free the fid if it is in reclaim list
      */
     if (!fidp->ref && fidp->clunked) {
-        if (fidp->fid == pdu->s->root_fid) {
-            /*
-             * if the clunked fid is root fid then we
-             * have unmounted the fs on the client side.
-             * delete the migration blocker. Ideally, this
-             * should be hooked to transport close notification
-             */
-            if (pdu->s->migration_blocker) {
-                migrate_del_blocker(pdu->s->migration_blocker);
-                error_free(pdu->s->migration_blocker);
-                pdu->s->migration_blocker = NULL;
-            }
-        }
         return free_fid(pdu, fidp);
     }
     return 0;
@@ -979,17 +966,6 @@ static void v9fs_attach(void *opaque)
     err += offset;
     trace_v9fs_attach_return(pdu->tag, pdu->id,
                              qid.type, qid.version, qid.path);
-    /*
-     * disable migration if we haven't done already.
-     * attach could get called multiple times for the same export.
-     */
-    if (!s->migration_blocker) {
-        s->root_fid = fid;
-        error_setg(&s->migration_blocker,
-                   "Migration is disabled when VirtFS export path '%s' is mounted in the guest using mount_tag '%s'",
-                   s->ctx.fs_root ? s->ctx.fs_root : "NULL", s->tag);
-        migrate_add_blocker(s->migration_blocker);
-    }
 out:
     put_fid(pdu, fidp);
 out_nofid:
diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h
index 2c3603a..23f8eba 100644
--- a/hw/9pfs/virtio-9p.h
+++ b/hw/9pfs/virtio-9p.h
@@ -222,8 +222,6 @@ typedef struct V9fsState
      * on rename.
      */
     CoRwlock rename_lock;
-    int32_t root_fid;
-    Error *migration_blocker;
     V9fsConf fsconf;
 } V9fsState;
 
-- 
2.0.2

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset
  2014-09-26 15:19 [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset Boris Sukholitko
  2014-09-26 15:19 ` [Qemu-devel] [PATCH 1/2] virtio-9p: Add support for 9p migration Boris Sukholitko
  2014-09-26 15:19 ` [Qemu-devel] [PATCH 2/2] virtio-9p: Remove migration blockers Boris Sukholitko
@ 2014-09-29 21:46 ` Benoît Canet
  2014-09-30 19:08   ` Boris Sukholitko
  2 siblings, 1 reply; 9+ messages in thread
From: Benoît Canet @ 2014-09-29 21:46 UTC (permalink / raw)
  To: Boris Sukholitko; +Cc: qemu-devel

The Friday 26 Sep 2014 à 18:19:55 (+0300), Boris Sukholitko wrote :
> This patchset is a small rebase of the 9p live migration patches made a year
> ago by Benoit Canet.
> 
> See http://lists.gnu.org/archive/html/qemu-devel/2013-04/msg02190.html
> for the previous thread.
> 
> I took the liberty to drop the second patch (waiting for completion of 9p
> operations) as it wasn't working in my testing.

It's probable that the second patch has bitrot but I remember I was asked to
write it for a meaningfull reason.
Maybe you should give it a bit more love to resurect it properly.

Best regards

Benoît

> 
> Thanks,
> Boris.
> 
> Boris Sukholitko (2):
>   virtio-9p: Add support for 9p migration.
>   virtio-9p: Remove migration blockers.
> 
>  hw/9pfs/virtio-9p-device.c | 152 +++++++++++++++++++++++++++++++++++++++++++++
>  hw/9pfs/virtio-9p.c        |  24 -------
>  hw/9pfs/virtio-9p.h        |   2 -
>  3 files changed, 152 insertions(+), 26 deletions(-)
> 
> -- 
> 2.0.2
> 
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] virtio-9p: Add support for 9p migration.
  2014-09-26 15:19 ` [Qemu-devel] [PATCH 1/2] virtio-9p: Add support for 9p migration Boris Sukholitko
@ 2014-09-29 21:48   ` Benoît Canet
  2014-09-30 19:13     ` Boris Sukholitko
  0 siblings, 1 reply; 9+ messages in thread
From: Benoît Canet @ 2014-09-29 21:48 UTC (permalink / raw)
  To: Boris Sukholitko; +Cc: qemu-devel

The Friday 26 Sep 2014 à 18:19:56 (+0300), Boris Sukholitko wrote :


> This patch is a rebase of Aneesh Kumar's and Benoit Canet's previous
> work.
> 
> Signed-off-by: Boris Sukholitko <boriss@gmail.com>

If Aneesh and me worked on this you should also keep our signed-off in addition
of yours.

Best regards

Benoît

> ---
>  hw/9pfs/virtio-9p-device.c | 152 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 152 insertions(+)
> 
> diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c
> index 2572747..078ad39 100644
> --- a/hw/9pfs/virtio-9p-device.c
> +++ b/hw/9pfs/virtio-9p-device.c
> @@ -21,6 +21,149 @@
>  #include "virtio-9p-coth.h"
>  #include "hw/virtio/virtio-access.h"
>  
> +static void virtio_9p_save_path(QEMUFile *f, V9fsPath *path)
> +{
> +    qemu_put_be16(f, path->size);
> +    qemu_put_buffer(f, (const uint8_t *) path->data, path->size);
> +}
> +
> +static void virtio_9p_save_string(QEMUFile *f, V9fsString *s)
> +{
> +    qemu_put_be16(f, s->size);
> +    qemu_put_buffer(f, (const uint8_t *) s->data, s->size);
> +}
> +
> +static void virtio_9p_save_xattr(QEMUFile *f, V9fsXattr *xattr)
> +{
> +    qemu_put_be64(f, xattr->copied_len);
> +    qemu_put_be64(f, xattr->len);
> +    qemu_put_buffer(f, (const uint8_t *) xattr->value, xattr->len);
> +    virtio_9p_save_string(f, &xattr->name);
> +    qemu_put_be32(f, xattr->flags);
> +}
> +
> +static void virtio_9p_save_fid(QEMUFile *f, V9fsFidState *fid)
> +{
> +    /* First close the fid and mark it for reopen if migration fail */
> +    if (fid->fid_type == P9_FID_FILE) {
> +        close(fid->fs.fd);
> +        fid->fs.fd = -1;
> +    } else if (fid->fid_type == P9_FID_DIR) {
> +        closedir(fid->fs.dir);
> +        fid->fs.dir = NULL;
> +    }
> +
> +    qemu_put_be32(f, fid->fid_type);
> +    if (fid->fid_type == P9_FID_XATTR) {
> +        /* we don't save fs_reclaim */
> +        virtio_9p_save_xattr(f, &fid->fs.xattr);
> +    }
> +    qemu_put_be32(f, fid->fid);
> +    virtio_9p_save_path(f, &fid->path);
> +    qemu_put_be32(f, fid->flags);
> +    qemu_put_be32(f, fid->open_flags);
> +    qemu_put_be32(f, fid->uid);
> +    qemu_put_be32(f, fid->ref);
> +    qemu_put_be32(f, fid->clunked);
> +}
> +
> +static void virtio_9p_save(QEMUFile *f, void *opaque)
> +{
> +    int fidcount = 0;
> +    V9fsState *s = opaque;
> +    V9fsFidState *fid;
> +
> +    virtio_save(VIRTIO_DEVICE(s), f);
> +
> +    for (fid = s->fid_list; fid; fid = fid->next) {
> +        fidcount++;
> +    }
> +    /* Write the total number of fid structure */
> +    qemu_put_be32(f, fidcount);
> +
> +    for (fid = s->fid_list; fid; fid = fid->next) {
> +        virtio_9p_save_fid(f, fid);
> +    }
> +
> +    qemu_put_be32(f, s->proto_version);
> +    qemu_put_be32(f, s->msize);
> +}
> +
> +static void virtio_9p_load_path(QEMUFile *f, V9fsPath *path)
> +{
> +    path->size = qemu_get_be16(f);
> +    path->data = g_malloc0(path->size);
> +    qemu_get_buffer(f, (uint8_t *) path->data, path->size);
> +}
> +
> +static void virtio_9p_load_string(QEMUFile *f, V9fsString *s)
> +{
> +    s->size = qemu_get_be16(f);
> +    s->data = g_malloc0(s->size);
> +    qemu_get_buffer(f, (uint8_t *) s->data, s->size);
> +}
> +
> +static void virtio_9p_load_xattr(QEMUFile *f, V9fsXattr *xattr)
> +{
> +    xattr->copied_len = qemu_get_be64(f);
> +    xattr->len = qemu_get_be64(f);
> +    qemu_get_buffer(f, (uint8_t *) xattr->value, xattr->len);
> +    virtio_9p_load_string(f, &xattr->name);
> +    xattr->flags = qemu_get_be32(f);
> +}
> +
> +static V9fsFidState *virtio_9p_load_fid(QEMUFile *f)
> +{
> +    V9fsFidState *fid;
> +    fid = g_new0(V9fsFidState, 1);
> +
> +    fid->fid_type    = qemu_get_be32(f);
> +    if (fid->fid_type == P9_FID_XATTR) {
> +        virtio_9p_load_xattr(f, &fid->fs.xattr);
> +    }
> +    fid->fid         = qemu_get_be32(f);
> +    virtio_9p_load_path(f, &fid->path);
> +    fid->flags       = qemu_get_be32(f);
> +    fid->open_flags  = qemu_get_be32(f);
> +    fid->uid         = qemu_get_be32(f);
> +    fid->ref         = qemu_get_be32(f);
> +    fid->clunked     = qemu_get_be32(f);
> +
> +    /* If it's a file fid mark the file descriptors as closed.
> +     * DIR is null thanks to g_new0.
> +     * When doing get_fid v9fs_reopen_fid will reopen the file or the directory.
> +     */
> +    if (fid->fid_type == P9_FID_FILE) {
> +        fid->fs.fd = -1;
> +    }
> +    return fid;
> +}
> +
> +static int virtio_9p_load(QEMUFile *f, void *opaque, int version_id)
> +{
> +    int fidcount;
> +    V9fsState *s = opaque;
> +    V9fsFidState **fid;
> +
> +    if (version_id != 2) {
> +        return -EINVAL;
> +    }
> +    virtio_load(VIRTIO_DEVICE(s), f, version_id);
> +    fidcount = qemu_get_be32(f);
> +
> +    fid = &s->fid_list;
> +    while (fidcount) {
> +        *fid = virtio_9p_load_fid(f);
> +        fid = &((*fid)->next);
> +        fidcount--;
> +    }
> +
> +    s->proto_version  = qemu_get_be32(f);
> +    s->msize          = qemu_get_be32(f);
> +
> +    return 0;
> +}
> +
>  static uint32_t virtio_9p_get_features(VirtIODevice *vdev, uint32_t features)
>  {
>      features |= 1 << VIRTIO_9P_MOUNT_TAG;
> @@ -50,6 +193,7 @@ static void virtio_9p_device_realize(DeviceState *dev, Error **errp)
>      struct stat stat;
>      FsDriverEntry *fse;
>      V9fsPath path;
> +    static int virtio_9p_id;
>  
>      virtio_init(vdev, "virtio-9p", VIRTIO_ID_9P,
>                  sizeof(struct virtio_9p_config) + MAX_TAG_LEN);
> @@ -98,6 +242,14 @@ static void virtio_9p_device_realize(DeviceState *dev, Error **errp)
>      s->ops = fse->ops;
>      s->config_size = sizeof(struct virtio_9p_config) + len;
>      s->fid_list = NULL;
> +
> +    /* Original patch says that instance id must be derived of tag
> +     * name. Hash functions do have collisions so why would it be better
> +     * than an increment ?
> +     */
> +    register_savevm(dev, "virtio-9p", virtio_9p_id++, 2,
> +                    virtio_9p_save, virtio_9p_load, s);
> +
>      qemu_co_rwlock_init(&s->rename_lock);
>  
>      if (s->ops->init(&s->ctx) < 0) {
> -- 
> 2.0.2
> 
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset
  2014-09-29 21:46 ` [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset Benoît Canet
@ 2014-09-30 19:08   ` Boris Sukholitko
  2014-09-30 19:17     ` Benoît Canet
  0 siblings, 1 reply; 9+ messages in thread
From: Boris Sukholitko @ 2014-09-30 19:08 UTC (permalink / raw)
  To: Benoît Canet; +Cc: qemu-devel

On Tue, Sep 30, 2014 at 12:46 AM, Benoît Canet <benoit.canet@irqsave.net> wrote:
> The Friday 26 Sep 2014 à 18:19:55 (+0300), Boris Sukholitko wrote :
>> This patchset is a small rebase of the 9p live migration patches made a year
>> ago by Benoit Canet.
>>
>> See http://lists.gnu.org/archive/html/qemu-devel/2013-04/msg02190.html
>> for the previous thread.
>>
>> I took the liberty to drop the second patch (waiting for completion of 9p
>> operations) as it wasn't working in my testing.
>
> It's probable that the second patch has bitrot but I remember I was asked to
> write it for a meaningfull reason.

AFAICT, the reason was to drain requests queue before saving the state.

Unfortunately, releasing BQL haven't led to the callbacks being executed.
Therefore deadlock ensued.

> Maybe you should give it a bit more love to resurect it properly.
>

I probably should. Still, IMHO, the two patches work good enough
to deserve merging on their own right :)

Thanks,
Boris.

> Best regards
>
> Benoît
>
>>
>> Thanks,
>> Boris.
>>
>> Boris Sukholitko (2):
>>   virtio-9p: Add support for 9p migration.
>>   virtio-9p: Remove migration blockers.
>>
>>  hw/9pfs/virtio-9p-device.c | 152 +++++++++++++++++++++++++++++++++++++++++++++
>>  hw/9pfs/virtio-9p.c        |  24 -------
>>  hw/9pfs/virtio-9p.h        |   2 -
>>  3 files changed, 152 insertions(+), 26 deletions(-)
>>
>> --
>> 2.0.2
>>
>>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] virtio-9p: Add support for 9p migration.
  2014-09-29 21:48   ` Benoît Canet
@ 2014-09-30 19:13     ` Boris Sukholitko
  0 siblings, 0 replies; 9+ messages in thread
From: Boris Sukholitko @ 2014-09-30 19:13 UTC (permalink / raw)
  To: Benoît Canet, aneesh.kumar; +Cc: qemu-devel

On Tue, Sep 30, 2014 at 12:48 AM, Benoît Canet <benoit.canet@irqsave.net> wrote:
> The Friday 26 Sep 2014 à 18:19:56 (+0300), Boris Sukholitko wrote :
>
>
>> This patch is a rebase of Aneesh Kumar's and Benoit Canet's previous
>> work.
>>
>> Signed-off-by: Boris Sukholitko <boriss@gmail.com>
>
> If Aneesh and me worked on this you should also keep our signed-off in addition
> of yours.
>

I will resend the patches with your Signed-off.

Aneesh, should I add your Signed-off as well?

Thanks,
Boris.


> Best regards
>
> Benoît
>
>> ---
>>  hw/9pfs/virtio-9p-device.c | 152 +++++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 152 insertions(+)
>>
>> diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c
>> index 2572747..078ad39 100644
>> --- a/hw/9pfs/virtio-9p-device.c
>> +++ b/hw/9pfs/virtio-9p-device.c
>> @@ -21,6 +21,149 @@
>>  #include "virtio-9p-coth.h"
>>  #include "hw/virtio/virtio-access.h"
>>
>> +static void virtio_9p_save_path(QEMUFile *f, V9fsPath *path)
>> +{
>> +    qemu_put_be16(f, path->size);
>> +    qemu_put_buffer(f, (const uint8_t *) path->data, path->size);
>> +}
>> +
>> +static void virtio_9p_save_string(QEMUFile *f, V9fsString *s)
>> +{
>> +    qemu_put_be16(f, s->size);
>> +    qemu_put_buffer(f, (const uint8_t *) s->data, s->size);
>> +}
>> +
>> +static void virtio_9p_save_xattr(QEMUFile *f, V9fsXattr *xattr)
>> +{
>> +    qemu_put_be64(f, xattr->copied_len);
>> +    qemu_put_be64(f, xattr->len);
>> +    qemu_put_buffer(f, (const uint8_t *) xattr->value, xattr->len);
>> +    virtio_9p_save_string(f, &xattr->name);
>> +    qemu_put_be32(f, xattr->flags);
>> +}
>> +
>> +static void virtio_9p_save_fid(QEMUFile *f, V9fsFidState *fid)
>> +{
>> +    /* First close the fid and mark it for reopen if migration fail */
>> +    if (fid->fid_type == P9_FID_FILE) {
>> +        close(fid->fs.fd);
>> +        fid->fs.fd = -1;
>> +    } else if (fid->fid_type == P9_FID_DIR) {
>> +        closedir(fid->fs.dir);
>> +        fid->fs.dir = NULL;
>> +    }
>> +
>> +    qemu_put_be32(f, fid->fid_type);
>> +    if (fid->fid_type == P9_FID_XATTR) {
>> +        /* we don't save fs_reclaim */
>> +        virtio_9p_save_xattr(f, &fid->fs.xattr);
>> +    }
>> +    qemu_put_be32(f, fid->fid);
>> +    virtio_9p_save_path(f, &fid->path);
>> +    qemu_put_be32(f, fid->flags);
>> +    qemu_put_be32(f, fid->open_flags);
>> +    qemu_put_be32(f, fid->uid);
>> +    qemu_put_be32(f, fid->ref);
>> +    qemu_put_be32(f, fid->clunked);
>> +}
>> +
>> +static void virtio_9p_save(QEMUFile *f, void *opaque)
>> +{
>> +    int fidcount = 0;
>> +    V9fsState *s = opaque;
>> +    V9fsFidState *fid;
>> +
>> +    virtio_save(VIRTIO_DEVICE(s), f);
>> +
>> +    for (fid = s->fid_list; fid; fid = fid->next) {
>> +        fidcount++;
>> +    }
>> +    /* Write the total number of fid structure */
>> +    qemu_put_be32(f, fidcount);
>> +
>> +    for (fid = s->fid_list; fid; fid = fid->next) {
>> +        virtio_9p_save_fid(f, fid);
>> +    }
>> +
>> +    qemu_put_be32(f, s->proto_version);
>> +    qemu_put_be32(f, s->msize);
>> +}
>> +
>> +static void virtio_9p_load_path(QEMUFile *f, V9fsPath *path)
>> +{
>> +    path->size = qemu_get_be16(f);
>> +    path->data = g_malloc0(path->size);
>> +    qemu_get_buffer(f, (uint8_t *) path->data, path->size);
>> +}
>> +
>> +static void virtio_9p_load_string(QEMUFile *f, V9fsString *s)
>> +{
>> +    s->size = qemu_get_be16(f);
>> +    s->data = g_malloc0(s->size);
>> +    qemu_get_buffer(f, (uint8_t *) s->data, s->size);
>> +}
>> +
>> +static void virtio_9p_load_xattr(QEMUFile *f, V9fsXattr *xattr)
>> +{
>> +    xattr->copied_len = qemu_get_be64(f);
>> +    xattr->len = qemu_get_be64(f);
>> +    qemu_get_buffer(f, (uint8_t *) xattr->value, xattr->len);
>> +    virtio_9p_load_string(f, &xattr->name);
>> +    xattr->flags = qemu_get_be32(f);
>> +}
>> +
>> +static V9fsFidState *virtio_9p_load_fid(QEMUFile *f)
>> +{
>> +    V9fsFidState *fid;
>> +    fid = g_new0(V9fsFidState, 1);
>> +
>> +    fid->fid_type    = qemu_get_be32(f);
>> +    if (fid->fid_type == P9_FID_XATTR) {
>> +        virtio_9p_load_xattr(f, &fid->fs.xattr);
>> +    }
>> +    fid->fid         = qemu_get_be32(f);
>> +    virtio_9p_load_path(f, &fid->path);
>> +    fid->flags       = qemu_get_be32(f);
>> +    fid->open_flags  = qemu_get_be32(f);
>> +    fid->uid         = qemu_get_be32(f);
>> +    fid->ref         = qemu_get_be32(f);
>> +    fid->clunked     = qemu_get_be32(f);
>> +
>> +    /* If it's a file fid mark the file descriptors as closed.
>> +     * DIR is null thanks to g_new0.
>> +     * When doing get_fid v9fs_reopen_fid will reopen the file or the directory.
>> +     */
>> +    if (fid->fid_type == P9_FID_FILE) {
>> +        fid->fs.fd = -1;
>> +    }
>> +    return fid;
>> +}
>> +
>> +static int virtio_9p_load(QEMUFile *f, void *opaque, int version_id)
>> +{
>> +    int fidcount;
>> +    V9fsState *s = opaque;
>> +    V9fsFidState **fid;
>> +
>> +    if (version_id != 2) {
>> +        return -EINVAL;
>> +    }
>> +    virtio_load(VIRTIO_DEVICE(s), f, version_id);
>> +    fidcount = qemu_get_be32(f);
>> +
>> +    fid = &s->fid_list;
>> +    while (fidcount) {
>> +        *fid = virtio_9p_load_fid(f);
>> +        fid = &((*fid)->next);
>> +        fidcount--;
>> +    }
>> +
>> +    s->proto_version  = qemu_get_be32(f);
>> +    s->msize          = qemu_get_be32(f);
>> +
>> +    return 0;
>> +}
>> +
>>  static uint32_t virtio_9p_get_features(VirtIODevice *vdev, uint32_t features)
>>  {
>>      features |= 1 << VIRTIO_9P_MOUNT_TAG;
>> @@ -50,6 +193,7 @@ static void virtio_9p_device_realize(DeviceState *dev, Error **errp)
>>      struct stat stat;
>>      FsDriverEntry *fse;
>>      V9fsPath path;
>> +    static int virtio_9p_id;
>>
>>      virtio_init(vdev, "virtio-9p", VIRTIO_ID_9P,
>>                  sizeof(struct virtio_9p_config) + MAX_TAG_LEN);
>> @@ -98,6 +242,14 @@ static void virtio_9p_device_realize(DeviceState *dev, Error **errp)
>>      s->ops = fse->ops;
>>      s->config_size = sizeof(struct virtio_9p_config) + len;
>>      s->fid_list = NULL;
>> +
>> +    /* Original patch says that instance id must be derived of tag
>> +     * name. Hash functions do have collisions so why would it be better
>> +     * than an increment ?
>> +     */
>> +    register_savevm(dev, "virtio-9p", virtio_9p_id++, 2,
>> +                    virtio_9p_save, virtio_9p_load, s);
>> +
>>      qemu_co_rwlock_init(&s->rename_lock);
>>
>>      if (s->ops->init(&s->ctx) < 0) {
>> --
>> 2.0.2
>>
>>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset
  2014-09-30 19:08   ` Boris Sukholitko
@ 2014-09-30 19:17     ` Benoît Canet
  2014-10-01  6:43       ` Markus Armbruster
  0 siblings, 1 reply; 9+ messages in thread
From: Benoît Canet @ 2014-09-30 19:17 UTC (permalink / raw)
  To: Boris Sukholitko; +Cc: Benoît Canet, qemu-devel

The Tuesday 30 Sep 2014 à 22:08:12 (+0300), Boris Sukholitko wrote :
> On Tue, Sep 30, 2014 at 12:46 AM, Benoît Canet <benoit.canet@irqsave.net> wrote:
> > The Friday 26 Sep 2014 à 18:19:55 (+0300), Boris Sukholitko wrote :
> >> This patchset is a small rebase of the 9p live migration patches made a year
> >> ago by Benoit Canet.
> >>
> >> See http://lists.gnu.org/archive/html/qemu-devel/2013-04/msg02190.html
> >> for the previous thread.
> >>
> >> I took the liberty to drop the second patch (waiting for completion of 9p
> >> operations) as it wasn't working in my testing.
> >
> > It's probable that the second patch has bitrot but I remember I was asked to
> > write it for a meaningfull reason.
> 
> AFAICT, the reason was to drain requests queue before saving the state.
> 
> Unfortunately, releasing BQL haven't led to the callbacks being executed.
> Therefore deadlock ensued.
> 
> > Maybe you should give it a bit more love to resurect it properly.
> >
> 
> I probably should. Still, IMHO, the two patches work good enough
> to deserve merging on their own right :)

I am afraid nobody will want to merge a patchset where there is a
theorical potential bug.

It should work as well on paper as on silicon.

Best regards

Benoît

> 
> Thanks,
> Boris.
> 
> > Best regards
> >
> > Benoît
> >
> >>
> >> Thanks,
> >> Boris.
> >>
> >> Boris Sukholitko (2):
> >>   virtio-9p: Add support for 9p migration.
> >>   virtio-9p: Remove migration blockers.
> >>
> >>  hw/9pfs/virtio-9p-device.c | 152 +++++++++++++++++++++++++++++++++++++++++++++
> >>  hw/9pfs/virtio-9p.c        |  24 -------
> >>  hw/9pfs/virtio-9p.h        |   2 -
> >>  3 files changed, 152 insertions(+), 26 deletions(-)
> >>
> >> --
> >> 2.0.2
> >>
> >>
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset
  2014-09-30 19:17     ` Benoît Canet
@ 2014-10-01  6:43       ` Markus Armbruster
  0 siblings, 0 replies; 9+ messages in thread
From: Markus Armbruster @ 2014-10-01  6:43 UTC (permalink / raw)
  To: Benoît Canet; +Cc: Boris Sukholitko, qemu-devel

Benoît Canet <benoit.canet@irqsave.net> writes:

> The Tuesday 30 Sep 2014 à 22:08:12 (+0300), Boris Sukholitko wrote :
>> On Tue, Sep 30, 2014 at 12:46 AM, Benoît Canet
>> <benoit.canet@irqsave.net> wrote:
>> > The Friday 26 Sep 2014 à 18:19:55 (+0300), Boris Sukholitko wrote :
>> >> This patchset is a small rebase of the 9p live migration patches
>> >> made a year
>> >> ago by Benoit Canet.
>> >>
>> >> See http://lists.gnu.org/archive/html/qemu-devel/2013-04/msg02190.html
>> >> for the previous thread.
>> >>
>> >> I took the liberty to drop the second patch (waiting for completion of 9p
>> >> operations) as it wasn't working in my testing.
>> >
>> > It's probable that the second patch has bitrot but I remember I was asked to
>> > write it for a meaningfull reason.
>> 
>> AFAICT, the reason was to drain requests queue before saving the state.
>> 
>> Unfortunately, releasing BQL haven't led to the callbacks being executed.
>> Therefore deadlock ensued.
>> 
>> > Maybe you should give it a bit more love to resurect it properly.
>> >
>> 
>> I probably should. Still, IMHO, the two patches work good enough
>> to deserve merging on their own right :)
>
> I am afraid nobody will want to merge a patchset where there is a
> theorical potential bug.
>
> It should work as well on paper as on silicon.

Imperfect or incomplete patches *may* be acceptable when

A. they strictly improve things, and

B. their shortcomings are written down.

Example of a strict improvement: before the patch, live migration always
fails.  After the patch, it succeeds most of the time, but can still
fail in certain states.

Counter-example: before the patch, live migration always fails.  After
the patch, it succeeds, but can corrupt data in certain states.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2014-10-01  6:43 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-26 15:19 [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset Boris Sukholitko
2014-09-26 15:19 ` [Qemu-devel] [PATCH 1/2] virtio-9p: Add support for 9p migration Boris Sukholitko
2014-09-29 21:48   ` Benoît Canet
2014-09-30 19:13     ` Boris Sukholitko
2014-09-26 15:19 ` [Qemu-devel] [PATCH 2/2] virtio-9p: Remove migration blockers Boris Sukholitko
2014-09-29 21:46 ` [Qemu-devel] [PATCH 0/2] Virtio-9p live migration patchset Benoît Canet
2014-09-30 19:08   ` Boris Sukholitko
2014-09-30 19:17     ` Benoît Canet
2014-10-01  6:43       ` Markus Armbruster

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).