From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34609) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZgvS2-0000iu-UM for qemu-devel@nongnu.org; Tue, 29 Sep 2015 10:00:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZgvRt-0002Y2-5N for qemu-devel@nongnu.org; Tue, 29 Sep 2015 10:00:14 -0400 Received: from mail-wi0-f179.google.com ([209.85.212.179]:33756) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZgvRs-0002Vd-TS for qemu-devel@nongnu.org; Tue, 29 Sep 2015 10:00:05 -0400 Received: by wiclk2 with SMTP id lk2so152603319wic.0 for ; Tue, 29 Sep 2015 07:00:04 -0700 (PDT) From: Christian Pinto Date: Tue, 29 Sep 2015 15:57:34 +0200 Message-Id: <1443535059-26010-4-git-send-email-c.pinto@virtualopensystems.com> In-Reply-To: <1443535059-26010-1-git-send-email-c.pinto@virtualopensystems.com> References: <1443535059-26010-1-git-send-email-c.pinto@virtualopensystems.com> Subject: [Qemu-devel] [RFC PATCH 3/8] migration: add shared migration type List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Baptiste Reynal , Jani.Kokkonen@huawei.com, tech@virtualopensystems.com, Claudio.Fontana@huawei.com, Christian Pinto From: Baptiste Reynal A QEMU instance can now wait for the instantiation of the memory by the master while shared-memory backend is used. Use: -incoming "shared:" Signed-off-by: Baptiste Reynal --- backends/hostmem-shared.c | 9 +++++++++ include/migration/migration.h | 2 ++ migration/Makefile.objs | 2 +- migration/migration.c | 2 ++ migration/shared.c | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 migration/shared.c diff --git a/backends/hostmem-shared.c b/backends/hostmem-shared.c index a96ccdf..0e79019 100644 --- a/backends/hostmem-shared.c +++ b/backends/hostmem-shared.c @@ -11,6 +11,7 @@ */ #include "sysemu/hostmem-shared.h" +#include "migration/vmstate.h" static void shared_backend_init_shm(HostMemoryBackendShared *shm, int shmd, size_t size, off_t offset) { @@ -29,6 +30,8 @@ static void shared_backend_init_shm(HostMemoryBackendShared *shm, int shmd, memory_region_add_subregion(&backend->mr, 0, &shm->shared_region); + + vmstate_register_ram_global(&shm->shared_region); } /* Callback function if a fd is received over the socket */ @@ -46,6 +49,7 @@ static void set_shared_memory(MSClient *c, const char *message, void *opaque) } shared_backend_init_shm(shm, fd, infos[0], infos[1]); + event_notifier_set(shm->levent); } static void @@ -87,6 +91,11 @@ shared_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) set_shared_memory, shm); } } + + shm->levent = g_new(EventNotifier, 1); + event_notifier_init(shm->levent, 0); + + shm->event = event_notifier_get_fd(shm->levent); } static void diff --git a/include/migration/migration.h b/include/migration/migration.h index 8334621..0d4efa5 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -114,6 +114,8 @@ void migrate_fd_connect(MigrationState *s); int migrate_fd_close(MigrationState *s); +void shared_start_incoming_migration(const char *name, Error **errp); + void add_migration_state_change_notifier(Notifier *notify); void remove_migration_state_change_notifier(Notifier *notify); bool migration_in_setup(MigrationState *); diff --git a/migration/Makefile.objs b/migration/Makefile.objs index d929e96..08c96f7 100644 --- a/migration/Makefile.objs +++ b/migration/Makefile.objs @@ -7,4 +7,4 @@ common-obj-$(CONFIG_RDMA) += rdma.o common-obj-$(CONFIG_POSIX) += exec.o unix.o fd.o common-obj-y += block.o - +common-obj-y += shared.o diff --git a/migration/migration.c b/migration/migration.c index 662e77e..9f68983 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -249,6 +249,8 @@ void qemu_start_incoming_migration(const char *uri, Error **errp) deferred_incoming_migration(errp); } else if (strstart(uri, "tcp:", &p)) { tcp_start_incoming_migration(p, errp); + } else if (strstart(uri, "shared:", &p)) { + shared_start_incoming_migration(p, errp); #ifdef CONFIG_RDMA } else if (strstart(uri, "rdma:", &p)) { rdma_start_incoming_migration(p, errp); diff --git a/migration/shared.c b/migration/shared.c new file mode 100644 index 0000000..fc3ee08 --- /dev/null +++ b/migration/shared.c @@ -0,0 +1,32 @@ +#include "qemu-common.h" +#include "qemu/main-loop.h" +#include "qemu/sockets.h" +#include "migration/migration.h" +#include "monitor/monitor.h" +#include "migration/qemu-file.h" +#include "block/block.h" +#include "sysemu/hostmem-shared.h" + +static void shared_accept_incoming_migration(void *opaque) { + QEMUFile *f = opaque; + printf("Start !\n"); + + qemu_set_fd_handler(qemu_get_fd(f), NULL, NULL, NULL); + vm_start(); +} + +void shared_start_incoming_migration(const char *id, Error **errp) +{ + HostMemoryBackendShared *shm = (HostMemoryBackendShared *) + object_resolve_path_type(id, TYPE_MEMORY_BACKEND_SHARED, NULL); + QEMUFile *f; + + if (shm == NULL) { + printf("Error: Cannot find shared memory %s\n", id); + exit(-1); + } + + f = qemu_fdopen(shm->event, "rb"); + + qemu_set_fd_handler(shm->event, shared_accept_incoming_migration, NULL, f); +} -- 1.9.1