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:
Gerd Hoffmann 2020-10-14 14:11:17 +02:00
parent 70122d6230
commit 93ab5844b2
6 changed files with 20 additions and 39 deletions

View File

@ -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) {
/* spice server already created */
vmc_register_interface(s); 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,

View File

@ -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;

View File

@ -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 */

View File

@ -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

View File

@ -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);

View File

@ -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)) {