On Mon, Sep 15, 2025 at 10:30:58PM +0300, Vladimir Sementsov-Ogievskiy wrote:
> Use common qemu_set_blocking() instead.
>
> Note that pre-patch the behavior of Win32 and Linux realizations
> are inconsistent: we ignore failure for Win32, and assert success
> for Linux.
>
> How do we convert the callers?
>
> 1. Most of callers call qemu_socket_set_nonblock() on a
> freshly created socket fd, in conditions when we may simply
> report an error. Seems correct switching to error handling
> both for Windows (pre-patch error is ignored) and Linux
> (pre-patch we assert success). Anyway, we normally don't
> expect errors in these cases.
>
> Still in tests let's use &error_abort for simplicity.
>
> What are exclusions?
>
> 2. hw/virtio/vhost-user.c - we are inside #ifdef CONFIG_LINUX,
> so no damage in switching to error handling from assertion.
>
> 3. io/channel-socket.c: here we convert both old calls to
> qemu_socket_set_nonblock() and qemu_socket_set_block() to
> one new call. Pre-patch we assert success for Linux in
> qemu_socket_set_nonblock(), and ignore all other errors here.
> So, for Windows switch is a bit dangerous: we may get
> new errors or crashes(when error_abort is passed) in
> cases where we have silently ignored the error before
> (was it correct in all such cases, if they were?) Still,
> there is no other way to stricter API than take
> this risk.
>
> 4. util/vhost-user-server - compiled only for Linux (see
> util/meson.build), so we are safe, switching from assertion to
> &error_abort.
>
> Note: In qga/channel-posix.c we use g_warning(), where g_printerr()
> would actually be a better choice. Still let's for now follow
> common style of qga, where g_warning() is commonly used to print
> such messages, and no call to g_printerr(). Converting everything
> to use g_printerr() should better be another series.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
> ---
> contrib/ivshmem-server/ivshmem-server.c | 9 ++++++++-
> hw/hyperv/syndbg.c | 4 +++-
> hw/virtio/vhost-user.c | 5 ++++-
> include/qemu/sockets.h | 1 -
> io/channel-socket.c | 7 +++----
> net/dgram.c | 16 +++++++++++++---
> net/l2tpv3.c | 5 +++--
> net/socket.c | 20 ++++++++++++++++----
> qga/channel-posix.c | 7 ++++++-
> tests/unit/socket-helpers.c | 4 +++-
> tests/unit/test-crypto-tlssession.c | 8 ++++----
> util/oslib-posix.c | 7 -------
> util/oslib-win32.c | 5 -----
> util/vhost-user-server.c | 4 ++--
> 14 files changed, 65 insertions(+), 37 deletions(-)
> diff --git a/util/vhost-user-server.c b/util/vhost-user-server.c
> index d805a92394..b3416ab956 100644
> --- a/util/vhost-user-server.c
> +++ b/util/vhost-user-server.c
> @@ -78,7 +78,7 @@ static void vmsg_unblock_fds(VhostUserMsg *vmsg)
> }
>
> for (i = 0; i < vmsg->fd_num; i++) {
> - qemu_socket_set_nonblock(vmsg->fds[i]);
> + qemu_set_blocking(vmsg->fds[i], false, &error_abort);
> }
> }
The caller of this method is able to handle errors more gracefully
than abort.
> @@ -303,7 +303,7 @@ set_watch(VuDev *vu_dev, int fd, int vu_evt,
>
> vu_fd_watch->fd = fd;
> vu_fd_watch->cb = cb;
> - qemu_socket_set_nonblock(fd);
> + qemu_set_blocking(fd, false, &error_abort);
> aio_set_fd_handler(server->ctx, fd, kick_handler,
> NULL, NULL, NULL, vu_fd_watch);
> vu_fd_watch->vu_dev = vu_dev;
Can we put a TODO here that error_abort should be fixed to be more
graceful - either by moving the set_blocking call out of this
callback entirely, or allowing this method to return errors.
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 :|