mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 11:23:43 +08:00
chardev/spice: simplify chardev setup
Initialize spice before chardevs. That allows to register the spice chardevs directly in the init function and removes the need to maintain a linked list of chardevs just for registration. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-id: 20201014121120.13482-5-kraxel@redhat.com
This commit is contained in:
parent
70122d6230
commit
93ab5844b2
@ -14,9 +14,6 @@ typedef struct SpiceCharSource {
|
|||||||
SpiceChardev *scd;
|
SpiceChardev *scd;
|
||||||
} SpiceCharSource;
|
} SpiceCharSource;
|
||||||
|
|
||||||
static QLIST_HEAD(, SpiceChardev) spice_chars =
|
|
||||||
QLIST_HEAD_INITIALIZER(spice_chars);
|
|
||||||
|
|
||||||
static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len)
|
static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len)
|
||||||
{
|
{
|
||||||
SpiceChardev *scd = container_of(sin, SpiceChardev, sin);
|
SpiceChardev *scd = container_of(sin, SpiceChardev, sin);
|
||||||
@ -216,8 +213,6 @@ static void char_spice_finalize(Object *obj)
|
|||||||
|
|
||||||
vmc_unregister_interface(s);
|
vmc_unregister_interface(s);
|
||||||
|
|
||||||
QLIST_SAFE_REMOVE(s, next);
|
|
||||||
|
|
||||||
g_free((char *)s->sin.subtype);
|
g_free((char *)s->sin.subtype);
|
||||||
g_free((char *)s->sin.portname);
|
g_free((char *)s->sin.portname);
|
||||||
}
|
}
|
||||||
@ -256,8 +251,6 @@ static void chr_open(Chardev *chr, const char *subtype)
|
|||||||
|
|
||||||
s->active = false;
|
s->active = false;
|
||||||
s->sin.subtype = g_strdup(subtype);
|
s->sin.subtype = g_strdup(subtype);
|
||||||
|
|
||||||
QLIST_INSERT_HEAD(&spice_chars, s, next);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qemu_chr_open_spice_vmc(Chardev *chr,
|
static void qemu_chr_open_spice_vmc(Chardev *chr,
|
||||||
@ -310,28 +303,18 @@ static void qemu_chr_open_spice_port(Chardev *chr,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!using_spice) {
|
||||||
|
error_setg(errp, "spice not enabled");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
chr_open(chr, "port");
|
chr_open(chr, "port");
|
||||||
|
|
||||||
*be_opened = false;
|
*be_opened = false;
|
||||||
s = SPICE_CHARDEV(chr);
|
s = SPICE_CHARDEV(chr);
|
||||||
s->sin.portname = g_strdup(name);
|
s->sin.portname = g_strdup(name);
|
||||||
|
|
||||||
if (using_spice) {
|
vmc_register_interface(s);
|
||||||
/* spice server already created */
|
|
||||||
vmc_register_interface(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void qemu_spice_register_ports(void)
|
|
||||||
{
|
|
||||||
SpiceChardev *s;
|
|
||||||
|
|
||||||
QLIST_FOREACH(s, &spice_chars, next) {
|
|
||||||
if (s->sin.portname == NULL) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
vmc_register_interface(s);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qemu_chr_parse_spice_vmc(QemuOpts *opts, ChardevBackend *backend,
|
static void qemu_chr_parse_spice_vmc(QemuOpts *opts, ChardevBackend *backend,
|
||||||
|
@ -13,7 +13,6 @@ struct SpiceChardev {
|
|||||||
bool blocked;
|
bool blocked;
|
||||||
const uint8_t *datapos;
|
const uint8_t *datapos;
|
||||||
int datalen;
|
int datalen;
|
||||||
QLIST_ENTRY(SpiceChardev) next;
|
|
||||||
};
|
};
|
||||||
typedef struct SpiceChardev SpiceChardev;
|
typedef struct SpiceChardev SpiceChardev;
|
||||||
|
|
||||||
|
@ -45,7 +45,6 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port,
|
|||||||
#else
|
#else
|
||||||
#define SPICE_NEEDS_SET_MM_TIME 0
|
#define SPICE_NEEDS_SET_MM_TIME 0
|
||||||
#endif
|
#endif
|
||||||
void qemu_spice_register_ports(void);
|
|
||||||
|
|
||||||
#else /* CONFIG_SPICE */
|
#else /* CONFIG_SPICE */
|
||||||
|
|
||||||
|
@ -4148,6 +4148,11 @@ void qemu_init(int argc, char **argv, char **envp)
|
|||||||
user_creatable_add_opts_foreach,
|
user_creatable_add_opts_foreach,
|
||||||
object_create_initial, &error_fatal);
|
object_create_initial, &error_fatal);
|
||||||
|
|
||||||
|
/* spice needs the timers to be initialized by this point */
|
||||||
|
/* spice must initialize before audio as it changes the default auiodev */
|
||||||
|
/* spice must initialize before chardevs (for spicevmc and spiceport) */
|
||||||
|
qemu_spice_init();
|
||||||
|
|
||||||
qemu_opts_foreach(qemu_find_opts("chardev"),
|
qemu_opts_foreach(qemu_find_opts("chardev"),
|
||||||
chardev_init_func, NULL, &error_fatal);
|
chardev_init_func, NULL, &error_fatal);
|
||||||
|
|
||||||
@ -4156,10 +4161,6 @@ void qemu_init(int argc, char **argv, char **envp)
|
|||||||
fsdev_init_func, NULL, &error_fatal);
|
fsdev_init_func, NULL, &error_fatal);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* spice needs the timers to be initialized by this point */
|
|
||||||
/* spice must initialize before audio as it changes the default auiodev */
|
|
||||||
qemu_spice_init();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: we need to create audio and block backends before
|
* Note: we need to create audio and block backends before
|
||||||
* machine_set_property(), so machine properties can refer to
|
* machine_set_property(), so machine properties can refer to
|
||||||
|
@ -129,7 +129,6 @@ static void spice_app_atexit(void)
|
|||||||
static void spice_app_display_early_init(DisplayOptions *opts)
|
static void spice_app_display_early_init(DisplayOptions *opts)
|
||||||
{
|
{
|
||||||
QemuOpts *qopts;
|
QemuOpts *qopts;
|
||||||
ChardevBackend *be = chr_spice_backend_new();
|
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
|
|
||||||
if (opts->has_full_screen) {
|
if (opts->has_full_screen) {
|
||||||
@ -174,6 +173,15 @@ static void spice_app_display_early_init(DisplayOptions *opts)
|
|||||||
qemu_opt_set(qopts, "gl", opts->has_gl ? "on" : "off", &error_abort);
|
qemu_opt_set(qopts, "gl", opts->has_gl ? "on" : "off", &error_abort);
|
||||||
display_opengl = opts->has_gl;
|
display_opengl = opts->has_gl;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void spice_app_display_init(DisplayState *ds, DisplayOptions *opts)
|
||||||
|
{
|
||||||
|
ChardevBackend *be = chr_spice_backend_new();
|
||||||
|
QemuOpts *qopts;
|
||||||
|
GError *err = NULL;
|
||||||
|
gchar *uri;
|
||||||
|
|
||||||
be->u.spiceport.data->fqdn = g_strdup("org.qemu.monitor.qmp.0");
|
be->u.spiceport.data->fqdn = g_strdup("org.qemu.monitor.qmp.0");
|
||||||
qemu_chardev_new("org.qemu.monitor.qmp", TYPE_CHARDEV_SPICEPORT,
|
qemu_chardev_new("org.qemu.monitor.qmp", TYPE_CHARDEV_SPICEPORT,
|
||||||
be, NULL, &error_abort);
|
be, NULL, &error_abort);
|
||||||
@ -183,13 +191,6 @@ static void spice_app_display_early_init(DisplayOptions *opts)
|
|||||||
qemu_opt_set(qopts, "mode", "control", &error_abort);
|
qemu_opt_set(qopts, "mode", "control", &error_abort);
|
||||||
|
|
||||||
qapi_free_ChardevBackend(be);
|
qapi_free_ChardevBackend(be);
|
||||||
}
|
|
||||||
|
|
||||||
static void spice_app_display_init(DisplayState *ds, DisplayOptions *opts)
|
|
||||||
{
|
|
||||||
GError *err = NULL;
|
|
||||||
gchar *uri;
|
|
||||||
|
|
||||||
uri = g_strjoin("", "spice+unix://", app_dir, "/", "spice.sock", NULL);
|
uri = g_strjoin("", "spice+unix://", app_dir, "/", "spice.sock", NULL);
|
||||||
info_report("Launching display with URI: %s", uri);
|
info_report("Launching display with URI: %s", uri);
|
||||||
g_app_info_launch_default_for_uri(uri, NULL, &err);
|
g_app_info_launch_default_for_uri(uri, NULL, &err);
|
||||||
|
@ -812,8 +812,6 @@ void qemu_spice_init(void)
|
|||||||
g_free(x509_cert_file);
|
g_free(x509_cert_file);
|
||||||
g_free(x509_cacert_file);
|
g_free(x509_cacert_file);
|
||||||
|
|
||||||
qemu_spice_register_ports();
|
|
||||||
|
|
||||||
#ifdef HAVE_SPICE_GL
|
#ifdef HAVE_SPICE_GL
|
||||||
if (qemu_opt_get_bool(opts, "gl", 0)) {
|
if (qemu_opt_get_bool(opts, "gl", 0)) {
|
||||||
if ((port != 0) || (tls_port != 0)) {
|
if ((port != 0) || (tls_port != 0)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user