Message ID | 728f5cdb2108ccfd0916c1efcc8c7dab99daf6ad.1582576372.git.jag.raman@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Initial support for multi-process qemu | expand |
* 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 --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;