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:
		
				
					committed by
					
						
						Michael S. Tsirkin
					
				
			
			
				
	
			
			
			
						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");
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user