On Sun, Feb 01, 2026 at 08:36:29PM +0300, Vladimir Sementsov-Ogievskiy wrote:
> logfd is blocking, so we don't need to care about EAGAIN.
> Let's simply use qemu_write_full().
Are you sure logfd is always blocking ? It can be an FD passed in
from outside QEMU, and off-hand, I'm not sure where we force that to
be blocking. Though we could argue it is the client't fault if they
passed a non-blocking FD to QEMU.
NB, we can *not* assume logfd is a plain file as libvirt will pass
in a pipe to send logging via virtlogd.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> ---
> chardev/char.c | 22 +++++-----------------
> 1 file changed, 5 insertions(+), 17 deletions(-)
>
> diff --git a/chardev/char.c b/chardev/char.c
> index 3e432195a5..64006a3119 100644
> --- a/chardev/char.c
> +++ b/chardev/char.c
> @@ -82,29 +82,17 @@ void qemu_chr_be_event(Chardev *s, QEMUChrEvent event)
> CHARDEV_GET_CLASS(s)->chr_be_event(s, event);
> }
>
> -/* Not reporting errors from writing to logfile, as logs are
> - * defined to be "best effort" only */
> static void qemu_chr_write_log(Chardev *s, const uint8_t *buf, size_t len)
> {
> - size_t done = 0;
> - ssize_t ret;
> -
> if (s->logfd < 0) {
> return;
> }
>
> - while (done < len) {
> - retry:
> - ret = write(s->logfd, buf + done, len - done);
> - if (ret == -1 && errno == EAGAIN) {
> - g_usleep(100);
> - goto retry;
> - }
> -
> - if (ret <= 0) {
> - return;
> - }
> - done += ret;
> + if (qemu_write_full(s->logfd, buf, len) < len) {
> + /*
> + * qemu_write_full() is defined with G_GNUC_WARN_UNUSED_RESULT,
> + * but logging is best‑effort, we do ignore errors.
> + */
> }
> }
>
> --
> 2.52.0
>
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 :|