All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/4] add support for spice migration
@ 2012-08-16  8:23 Yonit Halperin
  2012-08-16  8:23 ` [Qemu-devel] [PATCH 1/4] spice: notify spice server on vm start/stop Yonit Halperin
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Yonit Halperin @ 2012-08-16  8:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: mprivozn, Yonit Halperin, kraxel

The following series introduces support for keeping the spice session active after migration.
For more details about spice seamless migration, see
http://lists.freedesktop.org/archives/spice-devel/2012-August/010412.html

Spice branches with seamless migration support can be found at:
spice-protocol: http://cgit.freedesktop.org/~yhalperi/spice-protocol/log/?h=seamless-migration.v1
spice-common: http://cgit.freedesktop.org/~yhalperi/spice-common/log/
spice: http://cgit.freedesktop.org/~yhalperi/spice/log/?h=seamless-migration.v1
spicei-gtk: http://cgit.freedesktop.org/~yhalperi/spice-gtk/log/

Regards,
Yonit.

Yonit Halperin (4):
  spice: notify spice server on vm start/stop
  spice migration: add QEVENT_SPICE_MIGRATE_COMPLETED
  spice: add 'migrated' flag to spice info
  spice: adding seamless-migration option to the command line

 hmp.c            |    2 ++
 monitor.c        |    1 +
 monitor.h        |    1 +
 qapi-schema.json |    5 ++++-
 qemu-config.c    |    3 +++
 qemu-options.hx  |    3 +++
 ui/spice-core.c  |   34 +++++++++++++++++++++++++++++++++-
 7 files changed, 47 insertions(+), 2 deletions(-)

-- 
1.7.7.6

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

* [Qemu-devel] [PATCH 1/4] spice: notify spice server on vm start/stop
  2012-08-16  8:23 [Qemu-devel] [PATCH 0/4] add support for spice migration Yonit Halperin
@ 2012-08-16  8:23 ` Yonit Halperin
  2012-08-16  9:42   ` Gerd Hoffmann
  2012-08-16  8:23 ` [Qemu-devel] [PATCH 2/4] spice migration: add QEVENT_SPICE_MIGRATE_COMPLETED Yonit Halperin
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Yonit Halperin @ 2012-08-16  8:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: mprivozn, Yonit Halperin, kraxel

Spice server needs to know about the vm state in order to prevent
attempts to write to devices when they are stopped, mainly during
the non-live stage of migration.
Instead, spice will take care of restoring this writes, on the migration
target side, after migration completes.

Signed-off-by: Yonit Halperin <yhalperi@redhat.com>
---
 ui/spice-core.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/ui/spice-core.c b/ui/spice-core.c
index 4fc48f8..32de1f1 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -545,6 +545,18 @@ static int add_channel(const char *name, const char *value, void *opaque)
     return 0;
 }
 
+static void vm_change_state_handler(void *opaque, int running,
+                                    RunState state)
+{
+#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */
+    if (running) {
+        spice_server_vm_start(spice_server);
+    } else {
+        spice_server_vm_stop(spice_server);
+    }
+#endif
+}
+
 void qemu_spice_init(void)
 {
     QemuOpts *opts = QTAILQ_FIRST(&qemu_spice_opts.head);
@@ -718,6 +730,8 @@ void qemu_spice_init(void)
     qemu_spice_input_init();
     qemu_spice_audio_init();
 
+    qemu_add_vm_change_state_handler(vm_change_state_handler, &spice_server);
+
     g_free(x509_key_file);
     g_free(x509_cert_file);
     g_free(x509_cacert_file);
-- 
1.7.7.6

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

* [Qemu-devel] [PATCH 2/4] spice migration: add QEVENT_SPICE_MIGRATE_COMPLETED
  2012-08-16  8:23 [Qemu-devel] [PATCH 0/4] add support for spice migration Yonit Halperin
  2012-08-16  8:23 ` [Qemu-devel] [PATCH 1/4] spice: notify spice server on vm start/stop Yonit Halperin
@ 2012-08-16  8:23 ` Yonit Halperin
  2012-08-16  8:23 ` [Qemu-devel] [PATCH 3/4] spice: add 'migrated' flag to spice info Yonit Halperin
  2012-08-16  8:23 ` [Qemu-devel] [PATCH 4/4] spice: adding seamless-migration option to the command line Yonit Halperin
  3 siblings, 0 replies; 8+ messages in thread
From: Yonit Halperin @ 2012-08-16  8:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: mprivozn, Yonit Halperin, kraxel

When migrating, libvirt queries the migration status, and upon migration
completions, it closes the migration src. On the other hand, when
migration is completed, spice transfers data from the src to destination
via the client. This data is required for keeping the spice session
after migration, without suffering from data loss and inconsistencies.
In order to allow this data transfer, we add QEVENT for signaling
libvirt that spice migration has completed, and libvirt needs to wait
for this event before quitting the src process.

Signed-off-by: Yonit Halperin <yhalperi@redhat.com>
---
 monitor.c       |    1 +
 monitor.h       |    1 +
 ui/spice-core.c |    9 ++++++++-
 3 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/monitor.c b/monitor.c
index ce42466..584efe0 100644
--- a/monitor.c
+++ b/monitor.c
@@ -455,6 +455,7 @@ static const char *monitor_event_names[] = {
     [QEVENT_SUSPEND_DISK] = "SUSPEND_DISK",
     [QEVENT_WAKEUP] = "WAKEUP",
     [QEVENT_BALLOON_CHANGE] = "BALLOON_CHANGE",
+    [QEVENT_SPICE_MIGRATE_COMPLETED] = "SPICE_MIGRATE_COMPLETED",
 };
 QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX)
 
diff --git a/monitor.h b/monitor.h
index 47d556b..5fc2983 100644
--- a/monitor.h
+++ b/monitor.h
@@ -43,6 +43,7 @@ typedef enum MonitorEvent {
     QEVENT_SUSPEND_DISK,
     QEVENT_WAKEUP,
     QEVENT_BALLOON_CHANGE,
+    QEVENT_SPICE_MIGRATE_COMPLETED,
 
     /* Add to 'monitor_event_names' array in monitor.c when
      * defining new events here */
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 32de1f1..6b4d216 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -284,6 +284,7 @@ typedef struct SpiceMigration {
 } SpiceMigration;
 
 static void migrate_connect_complete_cb(SpiceMigrateInstance *sin);
+static void migrate_end_complete_cb(SpiceMigrateInstance *sin);
 
 static const SpiceMigrateInterface migrate_interface = {
     .base.type = SPICE_INTERFACE_MIGRATION,
@@ -291,7 +292,7 @@ static const SpiceMigrateInterface migrate_interface = {
     .base.major_version = SPICE_INTERFACE_MIGRATION_MAJOR,
     .base.minor_version = SPICE_INTERFACE_MIGRATION_MINOR,
     .migrate_connect_complete = migrate_connect_complete_cb,
-    .migrate_end_complete = NULL,
+    .migrate_end_complete = migrate_end_complete_cb,
 };
 
 static SpiceMigration spice_migrate;
@@ -304,6 +305,11 @@ static void migrate_connect_complete_cb(SpiceMigrateInstance *sin)
     }
     sm->connect_complete.cb = NULL;
 }
+
+static void migrate_end_complete_cb(SpiceMigrateInstance *sin)
+{
+    monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL);
+}
 #endif
 
 /* config string parsing */
@@ -487,6 +493,7 @@ static void migration_state_notifier(Notifier *notifier, void *data)
     } else if (migration_has_finished(s)) {
 #ifndef SPICE_INTERFACE_MIGRATION
         spice_server_migrate_switch(spice_server);
+        monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL);
 #else
         spice_server_migrate_end(spice_server, true);
     } else if (migration_has_failed(s)) {
-- 
1.7.7.6

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

* [Qemu-devel] [PATCH 3/4] spice: add 'migrated' flag to spice info
  2012-08-16  8:23 [Qemu-devel] [PATCH 0/4] add support for spice migration Yonit Halperin
  2012-08-16  8:23 ` [Qemu-devel] [PATCH 1/4] spice: notify spice server on vm start/stop Yonit Halperin
  2012-08-16  8:23 ` [Qemu-devel] [PATCH 2/4] spice migration: add QEVENT_SPICE_MIGRATE_COMPLETED Yonit Halperin
@ 2012-08-16  8:23 ` Yonit Halperin
  2012-08-16  8:23 ` [Qemu-devel] [PATCH 4/4] spice: adding seamless-migration option to the command line Yonit Halperin
  3 siblings, 0 replies; 8+ messages in thread
From: Yonit Halperin @ 2012-08-16  8:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: mprivozn, Yonit Halperin, kraxel

The flag is 'true' when spice migration has completed on the src side.
It is needed for a case where libvirt dies before migration completes
and it misses the event QEVENT_SPICE_MIGRATE_COMPLETED.
When libvirt is restored and queries the migration status, it also needs
to query spice and check if its migration has completed.

Signed-off-by: Yonit Halperin <yhalperi@redhat.com>
---
 hmp.c            |    2 ++
 qapi-schema.json |    5 ++++-
 ui/spice-core.c  |    4 ++++
 3 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/hmp.c b/hmp.c
index a9d5675..62f4dee 100644
--- a/hmp.c
+++ b/hmp.c
@@ -413,6 +413,8 @@ void hmp_info_spice(Monitor *mon)
         monitor_printf(mon, "     address: %s:%" PRId64 " [tls]\n",
                        info->host, info->tls_port);
     }
+    monitor_printf(mon, "    migrated: %s\n",
+                   info->migrated ? "true" : "false");
     monitor_printf(mon, "        auth: %s\n", info->auth);
     monitor_printf(mon, "    compiled: %s\n", info->compiled_version);
     monitor_printf(mon, "  mouse-mode: %s\n",
diff --git a/qapi-schema.json b/qapi-schema.json
index 3d2b2d1..bf3f924 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -808,6 +808,9 @@
 #
 # @enabled: true if the SPICE server is enabled, false otherwise
 #
+# @migrated: true if the last guest migration completed and spice
+#            migration had completed as well. false otherwise.
+#
 # @host: #optional The hostname the SPICE server is bound to.  This depends on
 #        the name resolution on the host and may be an IP address.
 #
@@ -833,7 +836,7 @@
 # Since: 0.14.0
 ##
 { 'type': 'SpiceInfo',
-  'data': {'enabled': 'bool', '*host': 'str', '*port': 'int',
+  'data': {'enabled': 'bool', 'migrated': 'bool', '*host': 'str', '*port': 'int',
            '*tls-port': 'int', '*auth': 'str', '*compiled-version': 'str',
            'mouse-mode': 'SpiceQueryMouseMode', '*channels': ['SpiceChannel']} }
 
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 6b4d216..4d3d05e 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -45,6 +45,7 @@ static Notifier migration_state;
 static const char *auth = "spice";
 static char *auth_passwd;
 static time_t auth_expires = TIME_MAX;
+static int spice_migration_completed;
 int using_spice = 0;
 
 static QemuThread me;
@@ -309,6 +310,7 @@ static void migrate_connect_complete_cb(SpiceMigrateInstance *sin)
 static void migrate_end_complete_cb(SpiceMigrateInstance *sin)
 {
     monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL);
+    spice_migration_completed = true;
 }
 #endif
 
@@ -441,6 +443,7 @@ SpiceInfo *qmp_query_spice(Error **errp)
     }
 
     info->enabled = true;
+    info->migrated = spice_migration_completed;
 
     addr = qemu_opt_get(opts, "addr");
     port = qemu_opt_get_number(opts, "port", 0);
@@ -494,6 +497,7 @@ static void migration_state_notifier(Notifier *notifier, void *data)
 #ifndef SPICE_INTERFACE_MIGRATION
         spice_server_migrate_switch(spice_server);
         monitor_protocol_event(QEVENT_SPICE_MIGRATE_COMPLETED, NULL);
+        spice_migration_completed = true;
 #else
         spice_server_migrate_end(spice_server, true);
     } else if (migration_has_failed(s)) {
-- 
1.7.7.6

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

* [Qemu-devel] [PATCH 4/4] spice: adding seamless-migration option to the command line
  2012-08-16  8:23 [Qemu-devel] [PATCH 0/4] add support for spice migration Yonit Halperin
                   ` (2 preceding siblings ...)
  2012-08-16  8:23 ` [Qemu-devel] [PATCH 3/4] spice: add 'migrated' flag to spice info Yonit Halperin
@ 2012-08-16  8:23 ` Yonit Halperin
  3 siblings, 0 replies; 8+ messages in thread
From: Yonit Halperin @ 2012-08-16  8:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: mprivozn, Yonit Halperin, kraxel

The seamless-migration flag is required in order to identify
whether libvirt supports the new QEVENT_SPICE_MIGRATE_COMPLETED or not
(by default the flag is off).
New libvirt versions that wait for QEVENT_SPICE_MIGRATE_COMPLETED should turn on this flag.
When this flag is off, spice fallbacks to its old migration method, which
can result in data loss.

Signed-off-by: Yonit Halperin <yhalperi@redhat.com>
---
 qemu-config.c   |    3 +++
 qemu-options.hx |    3 +++
 ui/spice-core.c |    7 +++++++
 3 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/qemu-config.c b/qemu-config.c
index 5c3296b..b7bb28f 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -524,6 +524,9 @@ QemuOptsList qemu_spice_opts = {
         },{
             .name = "playback-compression",
             .type = QEMU_OPT_BOOL,
+        }, {
+            .name = "seamless-migration",
+            .type = QEMU_OPT_BOOL,
         },
         { /* end of list */ }
     },
diff --git a/qemu-options.hx b/qemu-options.hx
index 47cb5bd..0727f4f 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -917,6 +917,9 @@ Enable/disable passing mouse events via vdagent.  Default is on.
 @item playback-compression=[on|off]
 Enable/disable audio stream compression (using celt 0.5.1).  Default is on.
 
+@item seamless-migration=[on|off]
+Enable/disable spice seamless migration. Default is off.
+
 @end table
 ETEXI
 
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 4d3d05e..f5e2d5c 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -581,6 +581,9 @@ void qemu_spice_init(void)
     int port, tls_port, len, addr_flags;
     spice_image_compression_t compression;
     spice_wan_compression_t wan_compr;
+#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */
+    bool seamless_migration;
+#endif
 
     qemu_thread_get_self(&me);
 
@@ -724,6 +727,10 @@ void qemu_spice_init(void)
     spice_server_set_uuid(spice_server, qemu_uuid);
 #endif
 
+#if SPICE_SERVER_VERSION >= 0x000b02 /* 0.11.2 */
+    seamless_migration = qemu_opt_get_bool(opts, "seamless-migration", 0);
+    spice_server_set_seamless_migration(spice_server, seamless_migration);
+#endif
     if (0 != spice_server_init(spice_server, &core_interface)) {
         error_report("failed to initialize spice server");
         exit(1);
-- 
1.7.7.6

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

* Re: [Qemu-devel] [PATCH 1/4] spice: notify spice server on vm start/stop
  2012-08-16  8:23 ` [Qemu-devel] [PATCH 1/4] spice: notify spice server on vm start/stop Yonit Halperin
@ 2012-08-16  9:42   ` Gerd Hoffmann
  2012-08-16 13:00     ` Yonit Halperin
  0 siblings, 1 reply; 8+ messages in thread
From: Gerd Hoffmann @ 2012-08-16  9:42 UTC (permalink / raw)
  To: Yonit Halperin; +Cc: mprivozn, qemu-devel

On 08/16/12 10:23, Yonit Halperin wrote:
> Spice server needs to know about the vm state in order to prevent
> attempts to write to devices when they are stopped, mainly during
> the non-live stage of migration.

Why this new hook?

qemu already notifies spice-server using QXLWorker start/stop callbacks.

cheers,
  Gerd

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

* Re: [Qemu-devel] [PATCH 1/4] spice: notify spice server on vm start/stop
  2012-08-16  9:42   ` Gerd Hoffmann
@ 2012-08-16 13:00     ` Yonit Halperin
  2012-08-16 18:19       ` Gerd Hoffmann
  0 siblings, 1 reply; 8+ messages in thread
From: Yonit Halperin @ 2012-08-16 13:00 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: mprivozn, qemu-devel

On 08/16/2012 12:42 PM, Gerd Hoffmann wrote:
> On 08/16/12 10:23, Yonit Halperin wrote:
>> Spice server needs to know about the vm state in order to prevent
>> attempts to write to devices when they are stopped, mainly during
>> the non-live stage of migration.
>
> Why this new hook?
>
> qemu already notifies spice-server using QXLWorker start/stop callbacks.
It notifies the QXLWorker, and it goes to the display_channel. Spice api 
changes anyway, by adding spice_server_set_seamless_migration, and as 
other channels need this notification as well, it would be nicer to 
explicitly notify the server about the vm start/stop and not abuse the 
QXLWorker notification. Another option would have been to add notifier 
for SpiceCharDeviceInterface as well, and then to any other new 
interface that will require it.

Regards,
Yonit.

>
> cheers,
>    Gerd
>
>

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

* Re: [Qemu-devel] [PATCH 1/4] spice: notify spice server on vm start/stop
  2012-08-16 13:00     ` Yonit Halperin
@ 2012-08-16 18:19       ` Gerd Hoffmann
  0 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2012-08-16 18:19 UTC (permalink / raw)
  To: Yonit Halperin; +Cc: mprivozn, qemu-devel

On 08/16/12 15:00, Yonit Halperin wrote:
> On 08/16/2012 12:42 PM, Gerd Hoffmann wrote:
>> On 08/16/12 10:23, Yonit Halperin wrote:
>>> Spice server needs to know about the vm state in order to prevent
>>> attempts to write to devices when they are stopped, mainly during
>>> the non-live stage of migration.
>>
>> Why this new hook?
>>
>> qemu already notifies spice-server using QXLWorker start/stop callbacks.
> It notifies the QXLWorker, and it goes to the display_channel. Spice api
> changes anyway, by adding spice_server_set_seamless_migration, and as
> other channels need this notification as well, it would be nicer to
> explicitly notify the server about the vm start/stop and not abuse the
> QXLWorker notification.

It is indeed cleaner API-wise.  Is it possible to skip QXLWorker
notification when calling the new spice_server_vm_{start,stop} functions?

cheers,
  Gerd

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

end of thread, other threads:[~2012-08-16 18:19 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-16  8:23 [Qemu-devel] [PATCH 0/4] add support for spice migration Yonit Halperin
2012-08-16  8:23 ` [Qemu-devel] [PATCH 1/4] spice: notify spice server on vm start/stop Yonit Halperin
2012-08-16  9:42   ` Gerd Hoffmann
2012-08-16 13:00     ` Yonit Halperin
2012-08-16 18:19       ` Gerd Hoffmann
2012-08-16  8:23 ` [Qemu-devel] [PATCH 2/4] spice migration: add QEVENT_SPICE_MIGRATE_COMPLETED Yonit Halperin
2012-08-16  8:23 ` [Qemu-devel] [PATCH 3/4] spice: add 'migrated' flag to spice info Yonit Halperin
2012-08-16  8:23 ` [Qemu-devel] [PATCH 4/4] spice: adding seamless-migration option to the command line Yonit Halperin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.