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 <[email protected]> > --- > 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 :|
