From: Markus Armbruster <armbru@redhat.com>
To: "Philippe Mathieu-Daudé" <f4bug@amsat.org>
Cc: "Claudio Fontana" <cfontana@suse.de>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Kevin Wolf" <kwolf@redhat.com>,
qemu-devel@nongnu.org, dinechin@redhat.com,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Daniel P.Berrangé" <berrange@redhat.com>
Subject: Re: [PATCH v4 2/3] module: add Error arguments to module_load_one and module_load_qom_one
Date: Wed, 21 Sep 2022 14:16:50 +0200 [thread overview]
Message-ID: <87y1ucdirx.fsf@pond.sub.org> (raw)
In-Reply-To: <76775f64-e49a-1c3c-0d73-10d93eff34e4@amsat.org> ("Philippe Mathieu-Daudé"'s message of "Mon, 19 Sep 2022 12:18:16 +0200")
Philippe Mathieu-Daudé <f4bug@amsat.org> writes:
> On 16/9/22 11:27, Markus Armbruster wrote:
>> Claudio Fontana <cfontana@suse.de> writes:
>>
>>> improve error handling during module load, by changing:
>>>
>>> bool module_load_one(const char *prefix, const char *lib_name);
>>> void module_load_qom_one(const char *type);
>>>
>>> to:
>>>
>>> bool module_load_one(const char *prefix, const char *name, Error **errp);
>>> bool module_load_qom_one(const char *type, Error **errp);
>>>
>>> module_load_qom_one has been introduced in:
>>>
>>> commit 28457744c345 ("module: qom module support"), which built on top of
>>> module_load_one, but discarded the bool return value. Restore it.
>>>
>>> Adapt all callers to emit errors, or ignore them, or fail hard,
>>> as appropriate in each context.
>>
>> How exactly does behavior change? The commit message is mum on the
>> behavior before the patch, and vague on the behavior afterwards.
>>
>>> Signed-off-by: Claudio Fontana <cfontana@suse.de>
>>> ---
>>> audio/audio.c | 9 ++-
>>> block.c | 15 ++++-
>>> block/dmg.c | 18 +++++-
>>> hw/core/qdev.c | 10 ++-
>>> include/qemu/module.h | 38 ++++++++++--
>>> qom/object.c | 18 +++++-
>>> softmmu/qtest.c | 6 +-
>>> ui/console.c | 18 +++++-
>>> util/module.c | 140 ++++++++++++++++++++++++------------------
>>> 9 files changed, 194 insertions(+), 78 deletions(-)
>
>>> diff --git a/include/qemu/module.h b/include/qemu/module.h
>>> index 8c012bbe03..78d4c4de96 100644
>>> --- a/include/qemu/module.h
>>> +++ b/include/qemu/module.h
>>> @@ -61,16 +61,44 @@ typedef enum {
>
>>>
>>> void module_call_init(module_init_type type);
>>> -bool module_load_one(const char *prefix, const char *lib_name);
>>> -void module_load_qom_one(const char *type);
>>> +
>>> +/*
>>> + * module_load_one: attempt to load a module from a set of directories
>>> + *
>>> + * directories searched are:
>>> + * - getenv("QEMU_MODULE_DIR")
>>> + * - get_relocated_path(CONFIG_QEMU_MODDIR);
>>> + * - /var/run/qemu/${version_dir}
>>> + *
>>> + * prefix: a subsystem prefix, or the empty string ("audio-", ..., "")
>>> + * name: name of the module
>>> + * errp: error to set in case the module is found, but load failed.
>>> + *
>>> + * Return value: true on success (found and loaded);
>>> + * if module if found, but load failed, errp will be set.
>>> + * if module is not found, errp will not be set.
>>
>> I understand you need to distingush two failure modes "found, but load
>> failed" and "not found".
>>
>> Functions that set an error on some failures only tend to be awkward: in
>> addition to checking the return value for failure, you have to check
>> @errp for special failures. This is particularly cumbersome when it
>> requires a @local_err and an error_propagate() just for that. I
>> generally prefer to return an error code and always set an error.
>
> I notice the same issue, therefore would suggest this alternative
> prototype:
>
> bool module_load_one(const char *prefix, const char *name,
> bool ignore_if_missing, Error **errp);
> which always sets *errp when returning false:
>
> * Return value: if ignore_if_missing is true:
> * true on success (found or missing), false on
> * load failure.
> * if ignore_if_missing is false:
> * true on success (found and loaded); false if
> * not found or load failed.
> * errp will be set if the returned value is false.
> */
I think this interface is less surprising.
If having to pass a flag turns out to to be a legibility issue, we can
have wrapper functions.
next prev parent reply other threads:[~2022-09-21 13:08 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-08 18:30 [PATCH v4 0/3] improve error handling for module load Claudio Fontana
2022-09-08 18:30 ` [PATCH v4 1/3] module: removed unused function argument "mayfail" Claudio Fontana
2022-09-08 18:30 ` [PATCH v4 2/3] module: add Error arguments to module_load_one and module_load_qom_one Claudio Fontana
2022-09-15 8:43 ` Claudio Fontana
2022-09-16 8:13 ` Richard Henderson
2022-09-16 8:16 ` Claudio Fontana
2022-09-16 9:27 ` Markus Armbruster
2022-09-16 10:48 ` Claudio Fontana
2022-09-16 14:26 ` Markus Armbruster
2022-09-16 15:06 ` Claudio Fontana
2022-09-19 8:17 ` Markus Armbruster
2022-09-19 8:45 ` Claudio Fontana
2022-09-21 12:47 ` Markus Armbruster
2022-09-19 10:18 ` Philippe Mathieu-Daudé via
2022-09-21 12:16 ` Markus Armbruster [this message]
2022-09-21 16:03 ` Claudio Fontana
2022-09-22 6:07 ` Markus Armbruster
2022-09-22 8:28 ` Daniel P. Berrangé
2022-09-22 9:20 ` Claudio Fontana
2022-09-22 9:21 ` Claudio Fontana
2022-09-22 9:27 ` Claudio Fontana
2022-09-22 9:31 ` Daniel P. Berrangé
2022-09-22 9:34 ` Claudio Fontana
2022-09-22 10:37 ` Daniel P. Berrangé
2022-09-22 12:30 ` Claudio Fontana
2022-09-22 12:33 ` Daniel P. Berrangé
2022-09-22 12:35 ` Claudio Fontana
2022-09-22 9:38 ` Markus Armbruster
2022-09-22 9:43 ` Claudio Fontana
2022-09-22 12:42 ` Markus Armbruster
2022-09-22 12:45 ` Claudio Fontana
2022-09-22 13:20 ` Markus Armbruster
2022-09-22 13:33 ` Claudio Fontana
2022-09-22 14:36 ` Markus Armbruster
2022-09-22 15:22 ` Claudio Fontana
2022-09-23 5:31 ` Markus Armbruster
2022-09-23 9:40 ` Claudio Fontana
2022-09-22 13:34 ` Philippe Mathieu-Daudé via
2022-09-22 13:42 ` Claudio Fontana
2022-09-22 13:44 ` Daniel P. Berrangé
2022-09-22 14:01 ` Claudio Fontana
2022-09-22 14:54 ` Kevin Wolf
2022-09-22 15:08 ` Claudio Fontana
2022-09-22 15:27 ` Markus Armbruster
2022-09-22 15:51 ` Claudio Fontana
2022-09-22 17:05 ` Kevin Wolf
2022-09-23 9:42 ` Claudio Fontana
2022-09-23 9:44 ` Claudio Fontana
2022-09-25 10:35 ` Richard Henderson
2022-09-08 18:30 ` [PATCH v4 3/3] accel: abort if we fail to load the accelerator plugin Claudio Fontana
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y1ucdirx.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=cfontana@suse.de \
--cc=dinechin@redhat.com \
--cc=f4bug@amsat.org \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.