diff mbox series

[v5,43/50] multi-process/mig: Load VMSD in the proxy object

Message ID 728f5cdb2108ccfd0916c1efcc8c7dab99daf6ad.1582576372.git.jag.raman@oracle.com
State New
Headers show
Series Initial support for multi-process qemu | expand

Commit Message

Jag Raman Feb. 24, 2020, 8:55 p.m. UTC
From: Elena Ufimtseva <elena.ufimtseva@oracle.com>

The Proxy object loads the VMSD of remote process in source
and send it to the remote process in the destination

Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
---
 hw/proxy/qemu-proxy.c    | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
 include/io/mpqemu-link.h |  1 +
 2 files changed, 51 insertions(+)

Comments

Dr. David Alan Gilbert March 5, 2020, 3:28 p.m. UTC | #1
* Jagannathan Raman (jag.raman@oracle.com) wrote:
> From: Elena Ufimtseva <elena.ufimtseva@oracle.com>
> 
> The Proxy object loads the VMSD of remote process in source
> and send it to the remote process in the destination
> 
> Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
> Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
> Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
> ---
>  hw/proxy/qemu-proxy.c    | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
>  include/io/mpqemu-link.h |  1 +
>  2 files changed, 51 insertions(+)
> 
> diff --git a/hw/proxy/qemu-proxy.c b/hw/proxy/qemu-proxy.c
> index 19f0dbb..1649f60 100644
> --- a/hw/proxy/qemu-proxy.c
> +++ b/hw/proxy/qemu-proxy.c
> @@ -581,12 +581,62 @@ static int proxy_post_save(void *opaque)
>      return 0;
>  }
>  
> +static int proxy_post_load(void *opaque, int version_id)
> +{
> +    MigrationIncomingState *mis = migration_incoming_get_current();
> +    PCIProxyDev *pdev = opaque;
> +    QEMUFile *f_remote;
> +    MPQemuMsg msg = {0};
> +    Error *err = NULL;
> +    QIOChannel *ioc;
> +    uint64_t size;
> +    uint8_t byte;
> +    int fd[2];
> +
> +    if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) {
> +        return -1;
> +    }
> +
> +    ioc = qio_channel_new_fd(fd[0], &err);
> +    if (err) {
> +        error_report_err(err);
> +        return -1;
> +    }
> +
> +    qio_channel_set_name(QIO_CHANNEL(ioc), "proxy-migration-channel");
> +
> +    f_remote = qemu_fopen_channel_output(ioc);
> +
> +    msg.cmd = START_MIG_IN;
> +    msg.bytestream = 0;
> +    msg.num_fds = 1;
> +    msg.fds[0] = fd[1];
> +
> +    mpqemu_msg_send(&msg, pdev->mpqemu_link->com);
> +
> +    size = pdev->migsize;
> +
> +    while (size) {
> +        byte = qemu_get_byte(mis->from_src_file);
> +        qemu_put_byte(f_remote, byte);

My suggestion on the previous patch about using the VMSTATE_BUFFERV
means you'd malloc on size, and do the put_byte's to the remote in the
post_load.

> +        size--;
> +    }
> +
> +    qemu_fflush(f_remote);
> +    qemu_fclose(f_remote);
> +
> +    close(fd[1]);
> +
> +    return 0;
> +}
> +
>  const VMStateDescription vmstate_pci_proxy_device = {
>      .name = "PCIProxyDevice",
>      .version_id = 2,
>      .minimum_version_id = 1,
>      .pre_save = proxy_pre_save,
>      .post_save = proxy_post_save,
> +    .post_load = proxy_post_load,
>      .fields = (VMStateField[]) {
>          VMSTATE_PCI_DEVICE(parent_dev, PCIProxyDev),
>          VMSTATE_UINT64(migsize, PCIProxyDev),
> diff --git a/include/io/mpqemu-link.h b/include/io/mpqemu-link.h
> index b42c003..01371fc 100644
> --- a/include/io/mpqemu-link.h
> +++ b/include/io/mpqemu-link.h
> @@ -64,6 +64,7 @@ typedef enum {
>      MMIO_RETURN,
>      DEVICE_RESET,
>      START_MIG_OUT,
> +    START_MIG_IN,
>      MAX,
>  } mpqemu_cmd_t;
>  
> -- 
> 1.8.3.1
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
diff mbox series

Patch

diff --git a/hw/proxy/qemu-proxy.c b/hw/proxy/qemu-proxy.c
index 19f0dbb..1649f60 100644
--- a/hw/proxy/qemu-proxy.c
+++ b/hw/proxy/qemu-proxy.c
@@ -581,12 +581,62 @@  static int proxy_post_save(void *opaque)
     return 0;
 }
 
+static int proxy_post_load(void *opaque, int version_id)
+{
+    MigrationIncomingState *mis = migration_incoming_get_current();
+    PCIProxyDev *pdev = opaque;
+    QEMUFile *f_remote;
+    MPQemuMsg msg = {0};
+    Error *err = NULL;
+    QIOChannel *ioc;
+    uint64_t size;
+    uint8_t byte;
+    int fd[2];
+
+    if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) {
+        return -1;
+    }
+
+    ioc = qio_channel_new_fd(fd[0], &err);
+    if (err) {
+        error_report_err(err);
+        return -1;
+    }
+
+    qio_channel_set_name(QIO_CHANNEL(ioc), "proxy-migration-channel");
+
+    f_remote = qemu_fopen_channel_output(ioc);
+
+    msg.cmd = START_MIG_IN;
+    msg.bytestream = 0;
+    msg.num_fds = 1;
+    msg.fds[0] = fd[1];
+
+    mpqemu_msg_send(&msg, pdev->mpqemu_link->com);
+
+    size = pdev->migsize;
+
+    while (size) {
+        byte = qemu_get_byte(mis->from_src_file);
+        qemu_put_byte(f_remote, byte);
+        size--;
+    }
+
+    qemu_fflush(f_remote);
+    qemu_fclose(f_remote);
+
+    close(fd[1]);
+
+    return 0;
+}
+
 const VMStateDescription vmstate_pci_proxy_device = {
     .name = "PCIProxyDevice",
     .version_id = 2,
     .minimum_version_id = 1,
     .pre_save = proxy_pre_save,
     .post_save = proxy_post_save,
+    .post_load = proxy_post_load,
     .fields = (VMStateField[]) {
         VMSTATE_PCI_DEVICE(parent_dev, PCIProxyDev),
         VMSTATE_UINT64(migsize, PCIProxyDev),
diff --git a/include/io/mpqemu-link.h b/include/io/mpqemu-link.h
index b42c003..01371fc 100644
--- a/include/io/mpqemu-link.h
+++ b/include/io/mpqemu-link.h
@@ -64,6 +64,7 @@  typedef enum {
     MMIO_RETURN,
     DEVICE_RESET,
     START_MIG_OUT,
+    START_MIG_IN,
     MAX,
 } mpqemu_cmd_t;