mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 09:43:56 -06:00
plugin: propagate errors
qemu_finish_machine_init currently can only exit QEMU if it fails. Prepare for giving it proper error propagation, and possibly for adding a plugin_add monitor command that calls an accelerator method. While at it, make all errors from plugin_load look the same. Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
f2ce39b4f0
commit
0572f558cb
4 changed files with 21 additions and 25 deletions
|
@ -150,7 +150,7 @@ static uint64_t xorshift64star(uint64_t x)
|
|||
return x * UINT64_C(2685821657736338717);
|
||||
}
|
||||
|
||||
static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info)
|
||||
static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info, Error **errp)
|
||||
{
|
||||
qemu_plugin_install_func_t install;
|
||||
struct qemu_plugin_ctx *ctx;
|
||||
|
@ -163,37 +163,37 @@ static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info)
|
|||
|
||||
ctx->handle = g_module_open(desc->path, G_MODULE_BIND_LOCAL);
|
||||
if (ctx->handle == NULL) {
|
||||
error_report("%s: %s", __func__, g_module_error());
|
||||
error_setg(errp, "Could not load plugin %s: %s", desc->path, g_module_error());
|
||||
goto err_dlopen;
|
||||
}
|
||||
|
||||
if (!g_module_symbol(ctx->handle, "qemu_plugin_install", &sym)) {
|
||||
error_report("%s: %s", __func__, g_module_error());
|
||||
error_setg(errp, "Could not load plugin %s: %s", desc->path, g_module_error());
|
||||
goto err_symbol;
|
||||
}
|
||||
install = (qemu_plugin_install_func_t) sym;
|
||||
/* symbol was found; it could be NULL though */
|
||||
if (install == NULL) {
|
||||
error_report("%s: %s: qemu_plugin_install is NULL",
|
||||
__func__, desc->path);
|
||||
error_setg(errp, "Could not load plugin %s: qemu_plugin_install is NULL",
|
||||
desc->path);
|
||||
goto err_symbol;
|
||||
}
|
||||
|
||||
if (!g_module_symbol(ctx->handle, "qemu_plugin_version", &sym)) {
|
||||
error_report("TCG plugin %s does not declare API version %s",
|
||||
desc->path, g_module_error());
|
||||
error_setg(errp, "Could not load plugin %s: plugin does not declare API version %s",
|
||||
desc->path, g_module_error());
|
||||
goto err_symbol;
|
||||
} else {
|
||||
int version = *(int *)sym;
|
||||
if (version < QEMU_PLUGIN_MIN_VERSION) {
|
||||
error_report("TCG plugin %s requires API version %d, but "
|
||||
"this QEMU supports only a minimum version of %d",
|
||||
desc->path, version, QEMU_PLUGIN_MIN_VERSION);
|
||||
error_setg(errp, "Could not load plugin %s: plugin requires API version %d, but "
|
||||
"this QEMU supports only a minimum version of %d",
|
||||
desc->path, version, QEMU_PLUGIN_MIN_VERSION);
|
||||
goto err_symbol;
|
||||
} else if (version > QEMU_PLUGIN_VERSION) {
|
||||
error_report("TCG plugin %s requires API version %d, but "
|
||||
"this QEMU supports only up to version %d",
|
||||
desc->path, version, QEMU_PLUGIN_VERSION);
|
||||
error_setg(errp, "Could not load plugin %s: plugin requires API version %d, but "
|
||||
"this QEMU supports only up to version %d",
|
||||
desc->path, version, QEMU_PLUGIN_VERSION);
|
||||
goto err_symbol;
|
||||
}
|
||||
}
|
||||
|
@ -220,8 +220,8 @@ static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info)
|
|||
rc = install(ctx->id, info, desc->argc, desc->argv);
|
||||
ctx->installing = false;
|
||||
if (rc) {
|
||||
error_report("%s: qemu_plugin_install returned error code %d",
|
||||
__func__, rc);
|
||||
error_setg(errp, "Could not load plugin %s: qemu_plugin_install returned error code %d",
|
||||
desc->path, rc);
|
||||
/*
|
||||
* we cannot rely on the plugin doing its own cleanup, so
|
||||
* call a full uninstall if the plugin did not yet call it.
|
||||
|
@ -263,7 +263,7 @@ static void plugin_desc_free(struct qemu_plugin_desc *desc)
|
|||
* Note: the descriptor of each successfully installed plugin is removed
|
||||
* from the list given by @head.
|
||||
*/
|
||||
int qemu_plugin_load_list(QemuPluginList *head)
|
||||
int qemu_plugin_load_list(QemuPluginList *head, Error **errp)
|
||||
{
|
||||
struct qemu_plugin_desc *desc, *next;
|
||||
g_autofree qemu_info_t *info = g_new0(qemu_info_t, 1);
|
||||
|
@ -283,7 +283,7 @@ int qemu_plugin_load_list(QemuPluginList *head)
|
|||
QTAILQ_FOREACH_SAFE(desc, head, entry, next) {
|
||||
int err;
|
||||
|
||||
err = plugin_load(desc, info);
|
||||
err = plugin_load(desc, info, errp);
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue