modules: misc fixes & tweaks.

modules: build spice chardevs as module.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.22 (GNU/Linux)
 
 iQIcBAABCgAGBQJfiEYvAAoJEEy22O7T6HE4i7MP/j1wCGxhNIR6GnKqLZf7Gvka
 Sx6rQDoKGh+OSVA5PRsc3pxCIt0taXjU9zkEbr+mDixoCfReUFLfjUncD0YHYc1o
 p430QpnJJwnt1Ked5OYrspY+vJTEEwVEP6TqMVLH9tEKbBwrSSgZyy40zWtUZVe4
 Xjx2Z1HmjQ0vQXKwOE3GxSw/7xUgwh/NTSy2UKTACE35MXxBb9AqY4gCnoFjEdok
 vdbuHxcEdQZq0XU6bTAPBaTtBAMwdcGsc3gXyjOGwnpqL7FLO+AX2iNIpZ18efg2
 u9qIEdFSpd9NcinamXaNSTqLMCNMR5il35aS1moHJsbP57/SX8iV0D+Zlnqqvgfn
 U5ulYddUVpJnbeoZnrWmt9B5urTaD3KXtYTgapnVaFeBsENPZXnFwZ8iY+Ko405A
 DfM345i/h2/0kiSaOYYaC1zXZUWwoGju7BM5+HzuD9uD7ET4IAiCGXWJP1c6C0G5
 cxwP/PHgEOOleAmdptDFycQbtiszqcQBf7sXs6qmC4P56AaNJ9zrh4xAsm8zfFVq
 DF4aesPh71qZmkGVSycx+e1+kJO+ffeFbQjNkWDCnRuwC5w4KZEQQv3KByShESaB
 lsMVfnh6LeUw47aOom0cDt1WfIjaFG2MzIWvs3MIWZNPWelUn496LVkHbT9+KMX5
 9cRNesEm1NyMFqIVLRi5
 =UuQI
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/kraxel/tags/modules-20201015-pull-request' into staging

modules: misc fixes & tweaks.
modules: build spice chardevs as module.

# gpg: Signature made Thu 15 Oct 2020 13:53:03 BST
# gpg:                using RSA key 4CB6D8EED3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" [full]
# gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>" [full]
# gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>" [full]
# Primary key fingerprint: A032 8CFF B93A 17A7 9901  FE7D 4CB6 D8EE D3E8 7138

* remotes/kraxel/tags/modules-20201015-pull-request:
  chardev/spice: build spice chardevs as module
  meson: add spice dependency to core spice source files.
  meson: add spice_headers dependency.
  chardev/spice: simplify chardev setup
  chardev/spice: make qemu_chr_open_spice_port static
  ui/spice-app: don't use qemu_chr_open_spice_port directly
  modules: update qom object module comment
  module: silence errors for module_load_qom_all().

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2020-10-15 22:20:46 +01:00
commit 6214addcc6
14 changed files with 68 additions and 70 deletions

View file

@ -1,5 +1,5 @@
softmmu_ss.add([spice_headers, files('audio.c')])
softmmu_ss.add(files(
'audio.c',
'audio_legacy.c',
'mixeng.c',
'noaudio.c',

View file

@ -26,7 +26,6 @@ chardev_ss.add(when: 'CONFIG_WIN32', if_true: files(
chardev_ss = chardev_ss.apply(config_host, strict: false)
softmmu_ss.add(files('chardev-sysemu.c', 'msmouse.c', 'wctablet.c', 'testdev.c'))
softmmu_ss.add(when: ['CONFIG_SPICE', spice], if_true: files('spice.c'))
chardev_modules = {}
@ -36,4 +35,10 @@ if config_host.has_key('CONFIG_BRLAPI')
chardev_modules += { 'baum': module_ss }
endif
if config_host.has_key('CONFIG_SPICE')
module_ss = ss.source_set()
module_ss.add(when: [spice], if_true: files('spice.c'))
chardev_modules += { 'spice': module_ss }
endif
modules += { 'chardev': chardev_modules }

View file

@ -14,9 +14,6 @@ typedef struct SpiceCharSource {
SpiceChardev *scd;
} SpiceCharSource;
static QLIST_HEAD(, SpiceChardev) spice_chars =
QLIST_HEAD_INITIALIZER(spice_chars);
static int vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len)
{
SpiceChardev *scd = container_of(sin, SpiceChardev, sin);
@ -216,8 +213,6 @@ static void char_spice_finalize(Object *obj)
vmc_unregister_interface(s);
QLIST_SAFE_REMOVE(s, next);
g_free((char *)s->sin.subtype);
g_free((char *)s->sin.portname);
}
@ -256,8 +251,6 @@ static void chr_open(Chardev *chr, const char *subtype)
s->active = false;
s->sin.subtype = g_strdup(subtype);
QLIST_INSERT_HEAD(&spice_chars, s, next);
}
static void qemu_chr_open_spice_vmc(Chardev *chr,
@ -296,10 +289,10 @@ static void qemu_chr_open_spice_vmc(Chardev *chr,
chr_open(chr, type);
}
void qemu_chr_open_spice_port(Chardev *chr,
ChardevBackend *backend,
bool *be_opened,
Error **errp)
static void qemu_chr_open_spice_port(Chardev *chr,
ChardevBackend *backend,
bool *be_opened,
Error **errp)
{
ChardevSpicePort *spiceport = backend->u.spiceport.data;
const char *name = spiceport->fqdn;
@ -310,28 +303,18 @@ void qemu_chr_open_spice_port(Chardev *chr,
return;
}
if (!using_spice) {
error_setg(errp, "spice not enabled");
return;
}
chr_open(chr, "port");
*be_opened = false;
s = SPICE_CHARDEV(chr);
s->sin.portname = g_strdup(name);
if (using_spice) {
/* 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);
}
vmc_register_interface(s);
}
static void qemu_chr_parse_spice_vmc(QemuOpts *opts, ChardevBackend *backend,

View file

@ -13,7 +13,6 @@ struct SpiceChardev {
bool blocked;
const uint8_t *datapos;
int datalen;
QLIST_ENTRY(SpiceChardev) next;
};
typedef struct SpiceChardev SpiceChardev;
@ -24,7 +23,4 @@ typedef struct SpiceChardev SpiceChardev;
DECLARE_INSTANCE_CHECKER(SpiceChardev, SPICE_CHARDEV,
TYPE_CHARDEV_SPICE)
void qemu_chr_open_spice_port(Chardev *chr, ChardevBackend *backend,
bool *be_opened, Error **errp);
#endif

View file

@ -61,15 +61,15 @@ typedef enum {
#define fuzz_target_init(function) module_init(function, \
MODULE_INIT_FUZZ_TARGET)
#define migration_init(function) module_init(function, MODULE_INIT_MIGRATION)
#define block_module_load_one(lib) module_load_one("block-", lib)
#define ui_module_load_one(lib) module_load_one("ui-", lib)
#define audio_module_load_one(lib) module_load_one("audio-", lib)
#define block_module_load_one(lib) module_load_one("block-", lib, false)
#define ui_module_load_one(lib) module_load_one("ui-", lib, false)
#define audio_module_load_one(lib) module_load_one("audio-", lib, false)
void register_module_init(void (*fn)(void), module_init_type type);
void register_dso_module_init(void (*fn)(void), module_init_type type);
void module_call_init(module_init_type type);
bool module_load_one(const char *prefix, const char *lib_name);
bool module_load_one(const char *prefix, const char *lib_name, bool mayfail);
void module_load_qom_one(const char *type);
void module_load_qom_all(void);

View file

@ -45,7 +45,6 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port,
#else
#define SPICE_NEEDS_SET_MM_TIME 0
#endif
void qemu_spice_register_ports(void);
#else /* CONFIG_SPICE */

View file

@ -321,9 +321,11 @@ if 'CONFIG_LIBJACK' in config_host
jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
endif
spice = not_found
spice_headers = not_found
if 'CONFIG_SPICE' in config_host
spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
link_args: config_host['SPICE_LIBS'].split())
spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
endif
rt = cc.find_library('rt', required: false)
libdl = not_found

View file

@ -3,7 +3,7 @@ qmp_ss.add(files('monitor.c', 'qmp.c', 'qmp-cmds-control.c'))
softmmu_ss.add(files(
'hmp-cmds.c',
'hmp.c',
'qmp-cmds.c',
))
softmmu_ss.add([spice_headers, files('qmp-cmds.c')])
specific_ss.add(when: 'CONFIG_SOFTMMU', if_true: [files('misc.c'), spice])

View file

@ -757,7 +757,7 @@ static void qtest_process_command(CharBackend *chr, gchar **words)
g_assert(words[1] && words[2]);
qtest_send_prefix(chr);
if (module_load_one(words[1], words[2])) {
if (module_load_one(words[1], words[2], false)) {
qtest_sendf(chr, "OK\n");
} else {
qtest_sendf(chr, "FAIL\n");

View file

@ -4148,6 +4148,11 @@ void qemu_init(int argc, char **argv, char **envp)
user_creatable_add_opts_foreach,
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"),
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);
#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
* machine_set_property(), so machine properties can refer to

View file

@ -14,7 +14,7 @@ softmmu_ss.add(files(
))
softmmu_ss.add(when: 'CONFIG_LINUX', if_true: files('input-linux.c'))
softmmu_ss.add(when: 'CONFIG_SPICE', if_true: files('spice-core.c', 'spice-input.c', 'spice-display.c'))
softmmu_ss.add(when: [spice, 'CONFIG_SPICE'], if_true: files('spice-core.c', 'spice-input.c', 'spice-display.c'))
softmmu_ss.add(when: cocoa, if_true: files('cocoa.m'))
vnc_ss = ss.source_set()

View file

@ -44,11 +44,15 @@ static char *sock_path;
struct VCChardev {
SpiceChardev parent;
};
typedef struct VCChardev VCChardev;
struct VCChardevClass {
ChardevClass parent;
void (*parent_open)(Chardev *chr, ChardevBackend *backend,
bool *be_opened, Error **errp);
};
#define TYPE_CHARDEV_VC "chardev-vc"
DECLARE_INSTANCE_CHECKER(VCChardev, VC_CHARDEV,
TYPE_CHARDEV_VC)
OBJECT_DECLARE_TYPE(VCChardev, VCChardevClass, CHARDEV_VC)
static ChardevBackend *
chr_spice_backend_new(void)
@ -66,6 +70,7 @@ static void vc_chr_open(Chardev *chr,
bool *be_opened,
Error **errp)
{
VCChardevClass *vc = CHARDEV_VC_GET_CLASS(chr);
ChardevBackend *be;
const char *fqdn = NULL;
@ -80,7 +85,7 @@ static void vc_chr_open(Chardev *chr,
be = chr_spice_backend_new();
be->u.spiceport.data->fqdn = fqdn ?
g_strdup(fqdn) : g_strdup_printf("org.qemu.console.%s", chr->label);
qemu_chr_open_spice_port(chr, be, be_opened, errp);
vc->parent_open(chr, be, be_opened, errp);
qapi_free_ChardevBackend(be);
}
@ -91,8 +96,11 @@ static void vc_chr_set_echo(Chardev *chr, bool echo)
static void char_vc_class_init(ObjectClass *oc, void *data)
{
VCChardevClass *vc = CHARDEV_VC_CLASS(oc);
ChardevClass *cc = CHARDEV_CLASS(oc);
vc->parent_open = cc->open;
cc->parse = qemu_chr_parse_vc;
cc->open = vc_chr_open;
cc->chr_set_echo = vc_chr_set_echo;
@ -103,6 +111,7 @@ static const TypeInfo char_vc_type_info = {
.parent = TYPE_CHARDEV_SPICEPORT,
.instance_size = sizeof(VCChardev),
.class_init = char_vc_class_init,
.class_size = sizeof(VCChardevClass),
};
static void spice_app_atexit(void)
@ -120,7 +129,6 @@ static void spice_app_atexit(void)
static void spice_app_display_early_init(DisplayOptions *opts)
{
QemuOpts *qopts;
ChardevBackend *be = chr_spice_backend_new();
GError *err = NULL;
if (opts->has_full_screen) {
@ -165,6 +173,15 @@ static void spice_app_display_early_init(DisplayOptions *opts)
qemu_opt_set(qopts, "gl", opts->has_gl ? "on" : "off", &error_abort);
display_opengl = opts->has_gl;
#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");
qemu_chardev_new("org.qemu.monitor.qmp", TYPE_CHARDEV_SPICEPORT,
be, NULL, &error_abort);
@ -174,13 +191,6 @@ static void spice_app_display_early_init(DisplayOptions *opts)
qemu_opt_set(qopts, "mode", "control", &error_abort);
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);
info_report("Launching display with URI: %s", uri);
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_cacert_file);
qemu_spice_register_ports();
#ifdef HAVE_SPICE_GL
if (qemu_opt_get_bool(opts, "gl", 0)) {
if ((port != 0) || (tls_port != 0)) {

View file

@ -110,7 +110,7 @@ void module_call_init(module_init_type type)
}
#ifdef CONFIG_MODULES
static int module_load_file(const char *fname)
static int module_load_file(const char *fname, bool mayfail)
{
GModule *g_module;
void (*sym)(void);
@ -134,8 +134,10 @@ static int module_load_file(const char *fname)
g_module = g_module_open(fname, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
if (!g_module) {
fprintf(stderr, "Failed to open module: %s\n",
g_module_error());
if (!mayfail) {
fprintf(stderr, "Failed to open module: %s\n",
g_module_error());
}
ret = -EINVAL;
goto out;
}
@ -167,7 +169,7 @@ out:
}
#endif
bool module_load_one(const char *prefix, const char *lib_name)
bool module_load_one(const char *prefix, const char *lib_name, bool mayfail)
{
bool success = false;
@ -218,7 +220,7 @@ bool module_load_one(const char *prefix, const char *lib_name)
for (i = 0; i < n_dirs; i++) {
fname = g_strdup_printf("%s/%s%s",
dirs[i], module_name, CONFIG_HOST_DSOSUF);
ret = module_load_file(fname);
ret = module_load_file(fname, mayfail);
g_free(fname);
fname = NULL;
/* Try loading until loaded a module file */
@ -248,8 +250,10 @@ bool module_load_one(const char *prefix, const char *lib_name)
* only a very few devices & objects.
*
* So with the expectation that this will be rather the exception than
* to rule and the list will not gain that many entries go with a
* the rule and the list will not gain that many entries, go with a
* simple manually maintained list for now.
*
* The list must be sorted by module (module_load_qom_all() needs this).
*/
static struct {
const char *type;
@ -264,6 +268,8 @@ static struct {
{ "virtio-gpu-device", "hw-", "display-virtio-gpu" },
{ "vhost-user-gpu", "hw-", "display-virtio-gpu" },
{ "chardev-braille", "chardev-", "baum" },
{ "chardev-spicevmc", "chardev-", "spice" },
{ "chardev-spiceport", "chardev-", "spice" },
};
static bool module_loaded_qom_all;
@ -275,13 +281,11 @@ void module_load_qom_one(const char *type)
if (!type) {
return;
}
if (module_loaded_qom_all) {
return;
}
for (i = 0; i < ARRAY_SIZE(qom_modules); i++) {
if (strcmp(qom_modules[i].type, type) == 0) {
module_load_one(qom_modules[i].prefix,
qom_modules[i].module);
qom_modules[i].module,
false);
return;
}
}
@ -302,7 +306,7 @@ void module_load_qom_all(void)
/* one module implementing multiple types -> load only once */
continue;
}
module_load_one(qom_modules[i].prefix, qom_modules[i].module);
module_load_one(qom_modules[i].prefix, qom_modules[i].module, true);
}
module_loaded_qom_all = true;
}