qemu-config: load modules when instantiating option groups

Right now the SPICE module is special cased to be loaded when processing
of the -spice command line option.  However, the spice option group
can also be brought in via -readconfig, in which case the module is
not loaded.

Add a generic hook to load modules that provide a QemuOpts group,
and use it for the "spice" and "iscsi" groups.

Fixes: #194
Fixes: https://bugs.launchpad.net/qemu/+bug/1910696
Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit 632a887350)
Signed-off-by: Michael Roth <michael.roth@amd.com>
This commit is contained in:
Paolo Bonzini 2021-05-18 09:08:17 -04:00 committed by Michael Roth
parent 4e1eef8611
commit 701ff59cc4
5 changed files with 26 additions and 5 deletions

View File

@ -1,7 +1,7 @@
#ifndef QEMU_CONFIG_FILE_H
#define QEMU_CONFIG_FILE_H
void qemu_load_module_for_opts(const char *group);
QemuOptsList *qemu_find_opts(const char *group);
QemuOptsList *qemu_find_opts_err(const char *group, Error **errp);
QemuOpts *qemu_find_opts_singleton(const char *group);

View File

@ -2613,6 +2613,23 @@ void qmp_x_exit_preconfig(Error **errp)
}
}
#ifdef CONFIG_MODULES
void qemu_load_module_for_opts(const char *group)
{
static bool spice_tried;
if (g_str_equal(group, "spice") && !spice_tried) {
ui_module_load_one("spice-core");
spice_tried = true;
}
static bool iscsi_tried;
if (g_str_equal(group, "iscsi") && !iscsi_tried) {
block_module_load_one("iscsi");
iscsi_tried = true;
}
}
#endif
void qemu_init(int argc, char **argv, char **envp)
{
QemuOpts *opts;
@ -3372,10 +3389,6 @@ void qemu_init(int argc, char **argv, char **envp)
break;
case QEMU_OPTION_spice:
olist = qemu_find_opts_err("spice", NULL);
if (!olist) {
ui_module_load_one("spice-core");
olist = qemu_find_opts("spice");
}
if (!olist) {
error_report("spice support is disabled");
exit(1);

View File

@ -22,6 +22,7 @@ stub_ss.add(files('isa-bus.c'))
stub_ss.add(files('is-daemonized.c'))
stub_ss.add(when: 'CONFIG_LINUX_AIO', if_true: files('linux-aio.c'))
stub_ss.add(files('migr-blocker.c'))
stub_ss.add(files('module-opts.c'))
stub_ss.add(files('monitor.c'))
stub_ss.add(files('monitor-core.c'))
stub_ss.add(files('pci-bus.c'))

6
stubs/module-opts.c Normal file
View File

@ -0,0 +1,6 @@
#include "qemu/osdep.h"
#include "qemu/config-file.h"
void qemu_load_module_for_opts(const char *group)
{
}

View File

@ -16,6 +16,7 @@ static QemuOptsList *find_list(QemuOptsList **lists, const char *group,
{
int i;
qemu_load_module_for_opts(group);
for (i = 0; lists[i] != NULL; i++) {
if (strcmp(lists[i]->name, group) == 0)
break;