3b5704b2f8
Live migration with spice works like this today: (1) client_migrate_info monitor cmd (2) spice server notifies client, client connects to target host. (3) qemu waits until spice client connect is finished. (4) send over vmstate (i.e. main part of live migration). (5) spice handover to target host. (3) is implemented by making client_migrate_info a async monitor command. This is the only async monitor command we have. The original reason to implement this dance was that qemu did not accept new tcp connections while the incoming migration was running, so (2) and (4) could not be done in parallel. That issue was fixed long ago though. Qemu version 1.3.0 (released Dec 2012) and newer happily accept tcp connects while the incoming migration runs. Time to drop step (3). This patch does exactly that, by making the monitor command synchronous and removing the code needed to handle the async monitor command in ui/spice-core.c Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
96 lines
2.8 KiB
C
96 lines
2.8 KiB
C
/*
|
|
* Copyright (C) 2010 Red Hat, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 or
|
|
* (at your option) version 3 of the License.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef QEMU_SPICE_H
|
|
#define QEMU_SPICE_H
|
|
|
|
#include "config-host.h"
|
|
|
|
#ifdef CONFIG_SPICE
|
|
|
|
#include <spice.h>
|
|
|
|
#include "qemu/option.h"
|
|
#include "qemu/config-file.h"
|
|
#include "monitor/monitor.h"
|
|
|
|
extern int using_spice;
|
|
|
|
void qemu_spice_init(void);
|
|
void qemu_spice_input_init(void);
|
|
void qemu_spice_audio_init(void);
|
|
void qemu_spice_display_init(void);
|
|
int qemu_spice_display_add_client(int csock, int skipauth, int tls);
|
|
int qemu_spice_add_interface(SpiceBaseInstance *sin);
|
|
bool qemu_spice_have_display_interface(QemuConsole *con);
|
|
int qemu_spice_add_display_interface(QXLInstance *qxlin, QemuConsole *con);
|
|
int qemu_spice_set_passwd(const char *passwd,
|
|
bool fail_if_connected, bool disconnect_if_connected);
|
|
int qemu_spice_set_pw_expire(time_t expires);
|
|
int qemu_spice_migrate_info(const char *hostname, int port, int tls_port,
|
|
const char *subject);
|
|
|
|
CharDriverState *qemu_chr_open_spice_vmc(const char *type);
|
|
#if SPICE_SERVER_VERSION >= 0x000c02
|
|
CharDriverState *qemu_chr_open_spice_port(const char *name);
|
|
void qemu_spice_register_ports(void);
|
|
#else
|
|
static inline CharDriverState *qemu_chr_open_spice_port(const char *name)
|
|
{ return NULL; }
|
|
#endif
|
|
|
|
#else /* CONFIG_SPICE */
|
|
#include "monitor/monitor.h"
|
|
|
|
#define using_spice 0
|
|
#define spice_displays 0
|
|
static inline int qemu_spice_set_passwd(const char *passwd,
|
|
bool fail_if_connected,
|
|
bool disconnect_if_connected)
|
|
{
|
|
return -1;
|
|
}
|
|
static inline int qemu_spice_set_pw_expire(time_t expires)
|
|
{
|
|
return -1;
|
|
}
|
|
static inline int qemu_spice_migrate_info(const char *h, int p, int t,
|
|
const char *s)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
static inline int qemu_spice_display_add_client(int csock, int skipauth,
|
|
int tls)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
#endif /* CONFIG_SPICE */
|
|
|
|
static inline bool qemu_using_spice(Error **errp)
|
|
{
|
|
if (!using_spice) {
|
|
error_set(errp, ERROR_CLASS_DEVICE_NOT_ACTIVE,
|
|
"SPICE is not in use");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
#endif /* QEMU_SPICE_H */
|