From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: Konstantin Kostiuk <kkostiuk@redhat.com>,
Michael Roth <michael.roth@amd.com>
Cc: qemu-devel@nongnu.org, Markus Armbruster <armbru@redhat.com>,
qemu-arm@nongnu.org, qemu-ppc@nongnu.org, qemu-block@nongnu.org,
qemu-s390x@nongnu.org
Subject: Re: [RFC PATCH v2 21/22] qapi: Inline and remove QERR_UNSUPPORTED definition
Date: Wed, 12 Jun 2024 14:23:09 +0200 [thread overview]
Message-ID: <18739a67-84bb-4fd3-adb6-0db0f0eb7af1@linaro.org> (raw)
In-Reply-To: <87mswx5n63.fsf@pond.sub.org>
Michael, Konstantin, QERR_UNSUPPORTED is only used by QGA.
Do you mind giving our maintainer's position on Markus
analysis so we can know how to proceed with this definition?
Regards,
Phil.
On 5/10/23 13:22, Markus Armbruster wrote:
> Philippe Mathieu-Daudé <philmd@linaro.org> writes:
>
>> Address the comment added in commit 4629ed1e98
>> ("qerror: Finally unused, clean up"), from 2015:
>>
>> /*
>> * These macros will go away, please don't use
>> * in new code, and do not add new ones!
>> */
>>
>> Mechanical transformation using:
>>
>> $ sed -i -e 's/QERR_UNSUPPORTED/"this feature or command is not currently supported"/' \
>> $(git grep -wl QERR_UNSUPPORTED)
>>
>> then manually removing the definition in include/qapi/qmp/qerror.h.
>>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> ---
>> RFC: Not sure what is the best way to change the comment
>> in qga/qapi-schema.json...
>> ---
>> qga/qapi-schema.json | 5 +++--
>> include/qapi/qmp/qerror.h | 3 ---
>> qga/commands-bsd.c | 8 +++----
>> qga/commands-posix.c | 46 +++++++++++++++++++--------------------
>> qga/commands-win32.c | 22 +++++++++----------
>> 5 files changed, 41 insertions(+), 43 deletions(-)
>>
>> diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
>> index b720dd4379..51683f4dc2 100644
>> --- a/qga/qapi-schema.json
>> +++ b/qga/qapi-schema.json
>> @@ -6,8 +6,9 @@
> ##
> # = General note concerning the use of guest agent interfaces
>> #
>> # "unsupported" is a higher-level error than the errors that
>> # individual commands might document. The caller should always be
>> -# prepared to receive QERR_UNSUPPORTED, even if the given command
>> -# doesn't specify it, or doesn't document any failure mode at all.
>> +# prepared to receive the "this feature or command is not currently supported"
>> +# message, even if the given command doesn't specify it, or doesn't document
>> +# any failure mode at all.
>> ##
>>
>> ##
>
> The comment is problematic before the patch. It's a doc comment,
> i.e. it goes into the "QEMU Guest Agent Protocol Reference" manual,
> where QERR_UNSUPPORTED is meaningless. Back when the comment was added
> (commit 9481ecd737b "qga schema: document generic QERR_UNSUPPORTED"), it
> was still internal documentation, where QERR_UNSUPPORTED made sense. It
> became external documentation four years later (commit 56e8bdd46a8
> "build-sys: add qapi doc generation targets")
>
> I'm not sure how useful the comment is.
>
> I guess we could instead simply point out that clients should always be
> prepared for errors, even when the command doesn't document any, simply
> because commands need not exist in all versions or builds of qemu-ga.
>
>> diff --git a/include/qapi/qmp/qerror.h b/include/qapi/qmp/qerror.h
>> index 840831cc6a..7606f4525d 100644
>> --- a/include/qapi/qmp/qerror.h
>> +++ b/include/qapi/qmp/qerror.h
>> @@ -17,7 +17,4 @@
>> * add new ones!
>> */
>>
>> -#define QERR_UNSUPPORTED \
>> - "this feature or command is not currently supported"
>> -
>> #endif /* QERROR_H */
>> diff --git a/qga/commands-bsd.c b/qga/commands-bsd.c
>> index 17bddda1cf..11536f148f 100644
>> --- a/qga/commands-bsd.c
>> +++ b/qga/commands-bsd.c
>> @@ -152,25 +152,25 @@ int qmp_guest_fsfreeze_do_thaw(Error **errp)
>>
>> GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestDiskInfoList *qmp_guest_get_disks(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestDiskStatsInfoList *qmp_guest_get_diskstats(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestCpuStatsList *qmp_guest_get_cpustats(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>
> These are all commands that are not supported by this build of qemu-ga.
> We could use the opportunity to improve the error message: scratch
> "feature or ". Or maybe change the message to "this command is not
> supported in this version of qemu-ga".
>
> More of the same below, marked [*].
>
> Taking a step back... Do we really need to make this a failure of its
> own? Why not fail exactly as if the command didn't exist? Why would a
> client ever care for the difference between "command doesn't exist in
> this build of qemu-ga (but it does in other builds of this version of
> qemu-ga)" and "command doesn't exist in this build of qemu-ga (and it
> won't in any build of this version of qemu-ga)"?
>
> If clients don't care, we could instead unregister these commands,
> i.e. undo qmp_register_command(). The command will then fail exactly
> like any other unknown command. We still need to provide the functions
> to make the linker happy (unless we play with weak symbols), but they
> can simply abort().
>
> Michael and/or Konstantin, do you have comments as maintainers? A
> preference even?
>
> Hmm, there's yet another mechanism to disable commands:
> qmp_disable_command() & friends. Looks like its purpose is letting
> guest system administrators disable commands, and also to disable a
> bunch of commands in "frozen state", whatever that is. Alright, I
> didn't see that, lalala.
>
>> #endif /* CONFIG_FSFREEZE */
>> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
>> index 6169bbf7a0..f510add366 100644
>> --- a/qga/commands-posix.c
>> +++ b/qga/commands-posix.c
>> @@ -165,7 +165,7 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
>> }
>>
>> if (!hwclock_available) {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return;
>> }
>>
>
> !hwclock_available means /sbin/hwclock grants execute permission for the
> process's real UID and GID. I'm not sure why we bother to check that.
> Why not let execl() fail, and report that error? Oh, we don't:
>
> /* Use '/sbin/hwclock -w' to set RTC from the system time,
> * or '/sbin/hwclock -s' to set the system time from RTC. */
> execl(hwclock_path, "hwclock", has_time ? "-w" : "-s", NULL);
> _exit(EXIT_FAILURE);
>
> This is wrong. We should error_setg_errno(errp, errno, ...); return
> instead. Not your patch's problem.
>
> Until we do that: [*]
>
>> @@ -1540,7 +1540,7 @@ GuestDiskInfoList *qmp_guest_get_disks(Error **errp)
>>
>> GuestDiskInfoList *qmp_guest_get_disks(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>
> Command not supported by this build of qemu-qa: [*].
>
>>
>> @@ -2235,7 +2235,7 @@ void qmp_guest_set_user_password(const char *username,
>> bool crypted,
>> Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> }
>> #endif /* __linux__ || __FreeBSD__ */
>>
>> @@ -2751,47 +2751,47 @@ GuestCpuStatsList *qmp_guest_get_cpustats(Error **errp)
>>
>> void qmp_guest_suspend_disk(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> }
>>
>> void qmp_guest_suspend_ram(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> }
>>
>> void qmp_guest_suspend_hybrid(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> }
>>
>> GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return -1;
>> }
>>
>> GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestMemoryBlockResponseList *
>> qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> @@ -3056,7 +3056,7 @@ error:
>>
>> GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> @@ -3066,20 +3066,20 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>>
>> GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>>
>> return 0;
>> }
>>
>> int64_t qmp_guest_fsfreeze_freeze(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>>
>> return 0;
>> }
>> @@ -3088,33 +3088,33 @@ int64_t qmp_guest_fsfreeze_freeze_list(bool has_mountpoints,
>> strList *mountpoints,
>> Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>>
>> return 0;
>> }
>>
>> int64_t qmp_guest_fsfreeze_thaw(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>>
>> return 0;
>> }
>>
>> GuestDiskInfoList *qmp_guest_get_disks(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestDiskStatsInfoList *qmp_guest_get_diskstats(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestCpuStatsList *qmp_guest_get_cpustats(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> @@ -3124,7 +3124,7 @@ GuestCpuStatsList *qmp_guest_get_cpustats(Error **errp)
>> GuestFilesystemTrimResponse *
>> qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>> #endif
>> @@ -3243,7 +3243,7 @@ GuestUserList *qmp_guest_get_users(Error **errp)
>>
>> GuestUserList *qmp_guest_get_users(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> @@ -3386,7 +3386,7 @@ GuestOSInfo *qmp_guest_get_osinfo(Error **errp)
>>
>> GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>>
>> return NULL;
>> }
>
> Commands not supported by this build of qemu-qa: [*].
>
>> diff --git a/qga/commands-win32.c b/qga/commands-win32.c
>> index aa8c9770d4..5c9f8e0923 100644
>> --- a/qga/commands-win32.c
>> +++ b/qga/commands-win32.c
>> @@ -1213,7 +1213,7 @@ GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
>> GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **errp)
>> {
>> if (!vss_initialized()) {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return 0;
>> }
>>
>> @@ -1241,7 +1241,7 @@ int64_t qmp_guest_fsfreeze_freeze_list(bool has_mountpoints,
>> Error *local_err = NULL;
>>
>> if (!vss_initialized()) {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return 0;
>> }
>>
>> @@ -1276,7 +1276,7 @@ int64_t qmp_guest_fsfreeze_thaw(Error **errp)
>> int i;
>>
>> if (!vss_initialized()) {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return 0;
>> }
>>
>
> !vss_initialized() means qga-vss.dll failed to load and initialize.
>
> Another [*].
>
>> @@ -1509,7 +1509,7 @@ out:
>>
>> void qmp_guest_suspend_hybrid(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> }
>>
>> static IP_ADAPTER_ADDRESSES *guest_get_adapters_addresses(Error **errp)
>> @@ -1877,7 +1877,7 @@ GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
>>
>> int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return -1;
>> }
>>
>
> Commands not supported by this build of qemu-qa: [*].
>
>> @@ -1938,7 +1938,7 @@ void qmp_guest_set_user_password(const char *username,
>> GError *gerr = NULL;
>>
>> if (crypted) {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return;
>> }
>
> Command does not support "crypted": true in this build of qemu-ga. The
> error message is crap. Better would be some variation of "this machine
> supports only clear-text passwords".
>
>>
>> @@ -1983,20 +1983,20 @@ done:
>>
>> GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestMemoryBlockResponseList *
>> qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> @@ -2522,12 +2522,12 @@ char *qga_get_host_name(Error **errp)
>>
>> GuestDiskStatsInfoList *qmp_guest_get_diskstats(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>>
>> GuestCpuStatsList *qmp_guest_get_cpustats(Error **errp)
>> {
>> - error_setg(errp, QERR_UNSUPPORTED);
>> + error_setg(errp, "this feature or command is not currently supported");
>> return NULL;
>> }
>
> Commands not supported by this build of qemu-qa: [*].
>
> Summary of my review:
>
> * You're unsure about your change to the "General note concerning the
> use of guest agent interfaces". I suggested a way to rewrite it.
>
> * Error messages could use improvement. Since your patch doesn't change
> any, feel free to leave that for another day.
>
> * How we do compiled-out commands could use improvement. Feel even more
> free to leave for another day. I'd like to hear the maintainers'
> opinion, though.
>
>
next prev parent reply other threads:[~2024-06-12 12:23 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-05 4:50 [PATCH v2 00/22] qapi: Kill 'qapi/qmp/qerror.h' for good Philippe Mathieu-Daudé
2023-10-05 4:50 ` [PATCH v2 01/22] qapi: Inline and remove QERR_BUS_NO_HOTPLUG definition Philippe Mathieu-Daudé
2023-10-05 5:55 ` Cédric Le Goater
2023-10-20 5:49 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 02/22] qapi: Inline and remove QERR_DEVICE_HAS_NO_MEDIUM definition Philippe Mathieu-Daudé
2023-10-20 6:00 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 03/22] qapi: Inline and remove QERR_DEVICE_IN_USE definition Philippe Mathieu-Daudé
2023-10-05 4:50 ` [PATCH v2 04/22] qapi: Inline and remove QERR_DEVICE_NO_HOTPLUG definition Philippe Mathieu-Daudé
2023-10-20 6:03 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 05/22] qapi: Inline QERR_INVALID_PARAMETER definition (constant parameter) Philippe Mathieu-Daudé
2023-10-20 7:07 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 06/22] qapi: Inline and remove QERR_INVALID_PARAMETER definition Philippe Mathieu-Daudé
2023-10-20 7:16 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 07/22] qapi: Inline QERR_INVALID_PARAMETER_TYPE definition (constant param) Philippe Mathieu-Daudé
2023-10-20 7:18 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 08/22] qapi: Inline QERR_INVALID_PARAMETER_TYPE definition (constant value) Philippe Mathieu-Daudé
2023-10-05 4:50 ` [PATCH v2 09/22] qapi: Inline and remove QERR_INVALID_PARAMETER_TYPE definition Philippe Mathieu-Daudé
2023-10-05 4:50 ` [PATCH v2 10/22] qapi: Correct error message for 'vcpu_dirty_limit' parameter Philippe Mathieu-Daudé
2023-10-05 6:33 ` Juan Quintela
2023-10-20 8:33 ` Markus Armbruster
2023-10-20 9:55 ` Juan Quintela
2023-10-05 4:50 ` [PATCH v2 11/22] qapi: Inline QERR_INVALID_PARAMETER_VALUE definition (constant value) Philippe Mathieu-Daudé
2023-10-05 6:34 ` Juan Quintela
2023-10-20 11:32 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 12/22] qapi: Inline QERR_INVALID_PARAMETER_VALUE definition (constant param) Philippe Mathieu-Daudé
2023-10-05 4:50 ` [PATCH v2 13/22] qapi: Inline and remove QERR_INVALID_PARAMETER_VALUE definition Philippe Mathieu-Daudé
2023-10-05 4:50 ` [PATCH v2 14/22] qapi: Inline and remove QERR_IO_ERROR definition Philippe Mathieu-Daudé
2023-10-20 11:50 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 15/22] qapi: Inline and remove QERR_MIGRATION_ACTIVE definition Philippe Mathieu-Daudé
2023-10-05 4:50 ` [PATCH v2 16/22] qapi: Inline QERR_MISSING_PARAMETER definition (constant parameter) Philippe Mathieu-Daudé
2023-10-20 12:58 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 17/22] qapi: Inline and remove QERR_MISSING_PARAMETER definition Philippe Mathieu-Daudé
2023-10-05 4:50 ` [PATCH v2 18/22] qapi: Inline and remove QERR_PROPERTY_VALUE_BAD definition Philippe Mathieu-Daudé
2023-10-20 13:00 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 19/22] qapi: Inline and remove QERR_PROPERTY_VALUE_OUT_OF_RANGE definition Philippe Mathieu-Daudé
2023-10-20 13:08 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 20/22] qapi: Inline and remove QERR_QGA_COMMAND_FAILED definition Philippe Mathieu-Daudé
2023-10-20 13:03 ` Markus Armbruster
2023-10-05 4:50 ` [RFC PATCH v2 21/22] qapi: Inline and remove QERR_UNSUPPORTED definition Philippe Mathieu-Daudé
2023-10-05 11:22 ` Markus Armbruster
2023-10-05 11:57 ` Markus Armbruster
2024-06-12 12:23 ` Philippe Mathieu-Daudé [this message]
2024-06-12 13:07 ` Markus Armbruster
2024-06-12 13:27 ` Konstantin Kostiuk
2024-06-12 13:45 ` Philippe Mathieu-Daudé
2023-10-05 11:57 ` Markus Armbruster
2023-10-05 4:50 ` [PATCH v2 22/22] qapi: Remove 'qapi/qmp/qerror.h' header Philippe Mathieu-Daudé
2023-10-05 9:26 ` [PATCH v2 00/22] qapi: Kill 'qapi/qmp/qerror.h' for good Markus Armbruster
2023-10-20 13:15 ` Markus Armbruster
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=18739a67-84bb-4fd3-adb6-0db0f0eb7af1@linaro.org \
--to=philmd@linaro.org \
--cc=armbru@redhat.com \
--cc=kkostiuk@redhat.com \
--cc=michael.roth@amd.com \
--cc=qemu-arm@nongnu.org \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=qemu-s390x@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).