From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Manos Pitsidianakis" <manos.pitsidianakis@linaro.org>,
"Hanna Reitz" <hreitz@redhat.com>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Christian Schoenebeck" <qemu_oss@crudebyte.com>,
"Dr. David Alan Gilbert" <dave@treblig.org>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
devel@lists.libvirt.org, qemu-block@nongnu.org,
qemu-rust@nongnu.org, "Stefan Weil" <sw@weilnetz.de>,
"Kevin Wolf" <kwolf@redhat.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Eric Blake" <eblake@redhat.com>
Subject: Re: [PATCH v5 14/24] monitor: move error_vprintf back to error-report.c
Date: Wed, 14 Jan 2026 12:09:58 +0000 [thread overview]
Message-ID: <aWeHlpz7m4hpPQCA@redhat.com> (raw)
In-Reply-To: <87jyxl8wfo.fsf@pond.sub.org>
On Tue, Jan 13, 2026 at 02:38:19PM +0100, Markus Armbruster wrote:
> Daniel P. Berrangé <berrange@redhat.com> writes:
>
> > The current unit tests rely on monitor.o not being linked, such
> > that the monitor stubs get linked instead. Since error_vprintf
> > is in monitor.o this allows a stub error_vprintf impl to be used
> > that calls g_test_message.
> >
> > This takes a different approach, with error_vprintf moving
> > back to error-report.c such that it is always linked into the
> > tests. The monitor_vprintf() stub is then changed to use
> > g_test_message if QTEST_SILENT_ERRORS is set, otherwise it will
> > return -1 and trigger error_vprintf to call vfprintf.
> >
> > The end result is functionally equivalent for the purposes of
> > the unit tests.
> >
> > Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> > Reviewed-by: Eric Blake <eblake@redhat.com>
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> > monitor/monitor.c | 15 ---------------
> > stubs/error-printf.c | 18 ------------------
> > stubs/meson.build | 1 -
> > stubs/monitor-core.c | 14 +++++++++++++-
> > util/error-report.c | 15 +++++++++++++++
> > 5 files changed, 28 insertions(+), 35 deletions(-)
> > delete mode 100644 stubs/error-printf.c
> >
> > diff --git a/monitor/monitor.c b/monitor/monitor.c
> > index 627a59b23e..6dc5a7016d 100644
> > --- a/monitor/monitor.c
> > +++ b/monitor/monitor.c
> > @@ -268,21 +268,6 @@ void monitor_printc(Monitor *mon, int c)
> > monitor_printf(mon, "'");
> > }
> >
> > -int error_vprintf(const char *fmt, va_list ap)
> > -{
> > - Monitor *cur_mon = monitor_cur();
> > - /*
> > - * This will return -1 if 'cur_mon' is NULL, or is QMP.
> > - * IOW this will only print if in HMP, otherwise we
> > - * fallback to stderr for QMP / no-monitor scenarios.
> > - */
> > - int ret = monitor_vprintf(cur_mon, fmt, ap);
> > - if (ret == -1) {
> > - ret = vfprintf(stderr, fmt, ap);
> > - }
> > - return ret;
> > -}
> > -
> > static MonitorQAPIEventConf monitor_qapi_event_conf[QAPI_EVENT__MAX] = {
> > /* Limit guest-triggerable events to 1 per second */
> > [QAPI_EVENT_RTC_CHANGE] = { 1000 * SCALE_MS },
> > diff --git a/stubs/error-printf.c b/stubs/error-printf.c
> > deleted file mode 100644
> > index 1afa0f62ca..0000000000
> > --- a/stubs/error-printf.c
> > +++ /dev/null
> > @@ -1,18 +0,0 @@
> > -#include "qemu/osdep.h"
> > -#include "qemu/error-report.h"
> > -#include "monitor/monitor.h"
> > -
> > -int error_vprintf(const char *fmt, va_list ap)
> > -{
> > - int ret;
> > -
> > - if (g_test_initialized() && !g_test_subprocess() &&
> > - getenv("QTEST_SILENT_ERRORS")) {
> > - char *msg = g_strdup_vprintf(fmt, ap);
> > - g_test_message("%s", msg);
> > - ret = strlen(msg);
> > - g_free(msg);
> > - return ret;
> > - }
> > - return vfprintf(stderr, fmt, ap);
> > -}
> > diff --git a/stubs/meson.build b/stubs/meson.build
> > index 0b2778c568..3d77458a3f 100644
> > --- a/stubs/meson.build
> > +++ b/stubs/meson.build
> > @@ -3,7 +3,6 @@
> > # below, so that it is clear who needs the stubbed functionality.
> >
> > stub_ss.add(files('cpu-get-clock.c'))
> > -stub_ss.add(files('error-printf.c'))
> > stub_ss.add(files('fdset.c'))
> > stub_ss.add(files('iothread-lock.c'))
> > stub_ss.add(files('is-daemonized.c'))
> > diff --git a/stubs/monitor-core.c b/stubs/monitor-core.c
> > index 1894cdfe1f..a7c32297c9 100644
> > --- a/stubs/monitor-core.c
> > +++ b/stubs/monitor-core.c
> > @@ -18,5 +18,17 @@ void qapi_event_emit(QAPIEvent event, QDict *qdict)
> >
> > int monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
> > {
> > - abort();
> > + /*
> > + * Pretend 'g_test_message' is our monitor console to
> > + * stop the caller sending messages to stderr
> > + */
> > + if (g_test_initialized() && !g_test_subprocess() &&
> > + getenv("QTEST_SILENT_ERRORS")) {
> > + char *msg = g_strdup_vprintf(fmt, ap);
> > + g_test_message("%s", msg);
> > + size_t ret = strlen(msg);
> > + g_free(msg);
> > + return ret;
> > + }
> > + return -1;
> > }
> > diff --git a/util/error-report.c b/util/error-report.c
> > index 1b17c11de1..b262ad01cb 100644
> > --- a/util/error-report.c
> > +++ b/util/error-report.c
> > @@ -29,6 +29,21 @@ bool message_with_timestamp;
> > bool error_with_guestname;
> > const char *error_guest_name;
> >
> > +int error_vprintf(const char *fmt, va_list ap)
> > +{
> > + Monitor *cur_mon = monitor_cur();
> > + /*
> > + * This will return -1 if 'cur_mon' is NULL, or is QMP.
> > + * IOW this will only print if in HMP, otherwise we
> > + * fallback to stderr for QMP / no-monitor scenarios.
> > + */
> > + int ret = monitor_vprintf(cur_mon, fmt, ap);
> > + if (ret == -1) {
> > + ret = vfprintf(stderr, fmt, ap);
> > + }
> > + return ret;
> > +}
> > +
> > int error_printf(const char *fmt, ...)
> > {
> > va_list ap;
>
> Without stubs, no change in behavior.
>
> With both stubs, before the patch:
>
> monitor_vprintf() is not supposed to run, and aborts
>
> error_vprintf() calls g_test_message() for tests, else vfprintf()
>
> afterwards:
>
> monitor_vprintf() calls g_test_message() and succeeds in tests, else
> fails
>
> error_vprintf() calls monitor_printf(), and when it fails falls back
> to vfprintf().
>
> Alright, error_vprintf() behaves the same as before.
>
> monitor_vprintf() no longer aborts. Hmm. What if we somehow acquire
> calls? In tests, they'll go to g_test_message(), which is fine, I
> guess. Outside tests, they'll fail. So does the non-stub version
> unless the current monitor is HMP. Also fine, I guess.
>
> Is it possible to link just one of the stubs?
There is only 1 stub after this patch - for monitor_vprintf().
error_vprintf() is never stubbed anymore.
The interesting scenario outside there tests is the non-system emulator
binaries.
Those will not have the monitor code, so will get the monitor_vprintf
stub. That will report g_test_initialized() == false, and so the stub
will return -1. error_vprintf() will see this -1 return value and
thus call to vfprintf().
So the behaviour is again the same as before this patch AFAICT for all
linkage scenarios.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2026-01-14 12:12 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-08 17:03 [PATCH v5 00/24] util: sync error_report & qemu_log output more closely Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 01/24] qemu-options: remove extraneous [] around arg values Daniel P. Berrangé
2026-01-13 7:47 ` Markus Armbruster
2026-01-08 17:03 ` [PATCH v5 02/24] include: define constant for early constructor priority Daniel P. Berrangé
2026-01-09 11:39 ` Paolo Bonzini
2026-01-09 11:46 ` Daniel P. Berrangé
2026-01-09 12:09 ` Paolo Bonzini
2026-01-13 9:04 ` Markus Armbruster
2026-01-13 9:32 ` Paolo Bonzini
2026-01-14 11:20 ` Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 03/24] monitor: initialize global data from a constructor Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 04/24] system: unconditionally enable thread naming Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 05/24] util: expose qemu_thread_set_name Daniel P. Berrangé
2026-01-13 9:16 ` Markus Armbruster
2026-01-13 10:41 ` Daniel P. Berrangé
2026-02-10 17:13 ` Daniel P. Berrangé
2026-02-11 5:56 ` Markus Armbruster
2026-01-08 17:03 ` [PATCH v5 06/24] audio: make jackaudio use qemu_thread_set_name Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 07/24] util: set the name for the 'main' thread Daniel P. Berrangé
2026-01-09 11:45 ` Paolo Bonzini
2026-01-09 11:52 ` Daniel P. Berrangé
2026-01-09 12:04 ` Paolo Bonzini
2026-01-08 17:03 ` [PATCH v5 08/24] util: add API to fetch the current thread name Daniel P. Berrangé
2026-01-09 11:49 ` Paolo Bonzini
2026-01-09 11:56 ` Daniel P. Berrangé
2026-01-09 12:11 ` Paolo Bonzini
2026-01-13 9:27 ` Markus Armbruster
2026-01-13 10:00 ` Daniel P. Berrangé
2026-01-13 13:00 ` Markus Armbruster
2026-01-13 15:49 ` Paolo Bonzini
2026-01-14 11:28 ` Daniel P. Berrangé
2026-01-14 11:27 ` Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 09/24] util: introduce some API docs for logging APIs Daniel P. Berrangé
2026-01-13 9:59 ` Markus Armbruster
2026-01-13 10:49 ` Daniel P. Berrangé
2026-01-13 10:52 ` Daniel P. Berrangé
2026-01-13 13:04 ` Markus Armbruster
2026-01-08 17:03 ` [PATCH v5 10/24] util: avoid repeated prefix on incremental qemu_log calls Daniel P. Berrangé
2026-01-13 10:19 ` Markus Armbruster
2026-01-13 11:56 ` Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 11/24] ui/vnc: remove use of error_printf_unless_qmp() Daniel P. Berrangé
2026-01-13 13:11 ` Markus Armbruster
2026-01-13 14:44 ` Markus Armbruster
2026-01-08 17:03 ` [PATCH v5 12/24] monitor: remove redundant error_[v]printf_unless_qmp Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 13/24] monitor: refactor error_vprintf() Daniel P. Berrangé
2026-01-13 13:17 ` Markus Armbruster
2026-01-14 11:34 ` Markus Armbruster
2026-01-14 12:01 ` Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 14/24] monitor: move error_vprintf back to error-report.c Daniel P. Berrangé
2026-01-13 13:38 ` Markus Armbruster
2026-01-14 12:09 ` Daniel P. Berrangé [this message]
2026-01-14 13:13 ` Markus Armbruster
2026-01-08 17:03 ` [PATCH v5 15/24] monitor: introduce monitor_cur_is_hmp() helper Daniel P. Berrangé
2026-01-13 14:57 ` Markus Armbruster
2026-01-14 12:46 ` Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 16/24] util: don't skip error prefixes when QMP is active Daniel P. Berrangé
2026-01-11 22:25 ` Richard Henderson
2026-01-13 15:19 ` Markus Armbruster
2026-01-14 12:53 ` Markus Armbruster
2026-01-08 17:03 ` [PATCH v5 17/24] util: fix interleaving of error & trace output Daniel P. Berrangé
2026-01-11 22:28 ` Richard Henderson
2026-01-14 13:00 ` Markus Armbruster
2026-01-08 17:03 ` [PATCH v5 18/24] util: fix interleaving of error prefixes Daniel P. Berrangé
2026-01-14 14:00 ` Markus Armbruster
2026-01-08 17:03 ` [PATCH v5 19/24] util: introduce common helper for error-report & log code Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 20/24] util: convert error-report & log to message API for timestamp Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 21/24] util: add support for formatting a workload name in messages Daniel P. Berrangé
2026-01-08 17:03 ` [PATCH v5 22/24] util: add support for formatting a program " Daniel P. Berrangé
2026-01-11 22:31 ` Richard Henderson
2026-01-08 17:03 ` [PATCH v5 23/24] util: add support for formatting thread info " Daniel P. Berrangé
2026-01-11 22:32 ` Richard Henderson
2026-01-08 17:03 ` [PATCH v5 24/24] util: add brackets around guest name in message context Daniel P. Berrangé
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=aWeHlpz7m4hpPQCA@redhat.com \
--to=berrange@redhat.com \
--cc=armbru@redhat.com \
--cc=dave@treblig.org \
--cc=devel@lists.libvirt.org \
--cc=eblake@redhat.com \
--cc=hreitz@redhat.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=manos.pitsidianakis@linaro.org \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-rust@nongnu.org \
--cc=qemu_oss@crudebyte.com \
--cc=richard.henderson@linaro.org \
--cc=sw@weilnetz.de \
/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