vhost-vsock: set vhostfd to non-blocking mode
vhost IOTLB API uses read()/write() to exchange iotlb messages with the kernel module. The QEMU implementation expects a non-blocking fd, indeed commitc471ad0e9b
("vhost_net: device IOTLB support") set it for vhost-net. Without this patch, if we enable iommu for the vhost-vsock device, QEMU can hang when exchanging IOTLB messages. As commit894022e616
("net: check if the file descriptor is valid before using it") did for tap, let's use qemu_try_set_nonblock() when fd is provided by the user. Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> Message-Id: <20201029144849.70958-1-sgarzare@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
9aa47edd4e
commit
384c2561bd
@ -16,6 +16,7 @@
|
||||
#include "qapi/error.h"
|
||||
#include "hw/virtio/virtio-access.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/sockets.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/virtio/vhost-vsock.h"
|
||||
#include "monitor/monitor.h"
|
||||
@ -148,6 +149,13 @@ static void vhost_vsock_device_realize(DeviceState *dev, Error **errp)
|
||||
error_prepend(errp, "vhost-vsock: unable to parse vhostfd: ");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = qemu_try_set_nonblock(vhostfd);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret,
|
||||
"vhost-vsock: unable to set non-blocking mode");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
vhostfd = open("/dev/vhost-vsock", O_RDWR);
|
||||
if (vhostfd < 0) {
|
||||
@ -155,6 +163,8 @@ static void vhost_vsock_device_realize(DeviceState *dev, Error **errp)
|
||||
"vhost-vsock: failed to open vhost device");
|
||||
return;
|
||||
}
|
||||
|
||||
qemu_set_nonblock(vhostfd);
|
||||
}
|
||||
|
||||
vhost_vsock_common_realize(vdev, "vhost-vsock");
|
||||
|
Loading…
Reference in New Issue
Block a user