 46d4d36d0b
			
		
	
	
		46d4d36d0b
		
	
	
	
	
		
			
			If netdev_add tap,id=net0,...,vhost=on failed in net_init_tap_one(),
the followed up device_add virtio-net-pci,netdev=net0 will fail
too, prints:
   TUNSETOFFLOAD ioctl() failed: Bad file descriptor TUNSETOFFLOAD
   ioctl() failed: Bad file descriptor
The reason is that the fd of tap is closed when error occured after
calling net_init_tap_one().
The fd should be closed when calling net_init_tap_one failed:
   - if tap_set_sndbuf() failed
   - if tap_set_sndbuf() succeeded but vhost failed to open or
     initialize with vhostforce flag on
   - with wrong vhost command line parameter
The fd should not be closed just because vhost failed to open or
initialize but without vhostforce flag. So the followed up
device_add can fall back to userspace virtio successfully.
Suggested-by: Michael S. Tsirkin <mst@redhat.com>
Suggested-by: Igor Mammedov <imammedo@redhat.com>
Suggested-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Jay Zhou <jianjay.zhou@huawei.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
		
	
			
		
			
				
	
	
		
			44 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef VHOST_NET_H
 | |
| #define VHOST_NET_H
 | |
| 
 | |
| #include "net/net.h"
 | |
| #include "hw/virtio/vhost-backend.h"
 | |
| 
 | |
| #define VHOST_NET_INIT_FAILED \
 | |
|     "vhost-net requested but could not be initialized"
 | |
| 
 | |
| struct vhost_net;
 | |
| typedef struct vhost_net VHostNetState;
 | |
| 
 | |
| typedef struct VhostNetOptions {
 | |
|     VhostBackendType backend_type;
 | |
|     NetClientState *net_backend;
 | |
|     uint32_t busyloop_timeout;
 | |
|     void *opaque;
 | |
| } VhostNetOptions;
 | |
| 
 | |
| uint64_t vhost_net_get_max_queues(VHostNetState *net);
 | |
| struct vhost_net *vhost_net_init(VhostNetOptions *options);
 | |
| 
 | |
| int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, int total_queues);
 | |
| void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs, int total_queues);
 | |
| 
 | |
| void vhost_net_cleanup(VHostNetState *net);
 | |
| 
 | |
| uint64_t vhost_net_get_features(VHostNetState *net, uint64_t features);
 | |
| void vhost_net_ack_features(VHostNetState *net, uint64_t features);
 | |
| 
 | |
| bool vhost_net_virtqueue_pending(VHostNetState *net, int n);
 | |
| void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev,
 | |
|                               int idx, bool mask);
 | |
| int vhost_net_notify_migration_done(VHostNetState *net, char* mac_addr);
 | |
| VHostNetState *get_vhost_net(NetClientState *nc);
 | |
| 
 | |
| int vhost_set_vring_enable(NetClientState * nc, int enable);
 | |
| 
 | |
| uint64_t vhost_net_get_acked_features(VHostNetState *net);
 | |
| 
 | |
| int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu);
 | |
| 
 | |
| #endif
 |