On Fri, Mar 12, 2021 at 10:22:09AM +0100, Greg Kurz wrote: > The slave channel is implemented with socketpair() : QEMU creates > the pair, passes one of the socket to virtiofsd and monitors the > other one with the main event loop using qemu_set_fd_handler(). > > In order to fix a potential deadlock between QEMU and a vhost-user > external process (e.g. virtiofsd with DAX), we want to be able to > monitor and service the slave channel while handling vhost-user > requests. > > Prepare ground for this by converting the slave channel to be a > QIOChannelSocket. This will make monitoring of the slave channel > as simple as calling qio_channel_add_watch_source(). Since the > connection is already established between the two sockets, only > incoming I/O (G_IO_IN) and disconnect (G_IO_HUP) need to be > serviced. > > This also allows to get rid of the ancillary data parsing since > QIOChannelSocket can do this for us. Note that the MSG_CTRUNC > check is dropped on the way because QIOChannelSocket ignores this > case. This isn't a problem since slave_read() provisions space for > 8 file descriptors, but affected vhost-user slave protocol messages > generally only convey one. If for some reason a buggy implementation > passes more file descriptors, no need to break the connection, just > like we don't break it if some other type of ancillary data is > received : this isn't explicitely violating the protocol per-se so > it seems better to ignore it. > > The current code errors out on short reads and writes. Use the > qio_channel_*_all() variants to address this on the way. > > Signed-off-by: Greg Kurz > --- > v2: - also monitor G_IO_HUP (Stefan) > - use the qio_channel_*_all() variants (Daniel) > - simplified thanks to previous refactoring > --- > hw/virtio/vhost-user.c | 99 +++++++++++++++++------------------------- > 1 file changed, 39 insertions(+), 60 deletions(-) Reviewed-by: Stefan Hajnoczi