tuntap vhost virtio-net-pci

qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: net_client_init_fun call  10
+ switch=virbr0
+ '[' -n tap1 ']'
++ whoami
+ ip tuntap add tap1 mode tap user root
ioctl(TUNSETIFF): Device or resource busy
+ ip link set tap1 up
+ sleep 0.5s
+ ip link set tap1 master virbr0
+ exit 0
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: vhost_net_init call vhost_dev_init
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: vhost_dev_init call hdev->vhost_ops->vhost_backend_init 、host_set_owne、 vhost_get_features
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: vhost_dev_init call vhost_virtqueue_init
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: vhost_virtqueue_init vhost_set_vring_call : File descriptor in bad state (77)
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: vhost_dev_init call vhost_virtqueue_init
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: vhost_virtqueue_init vhost_set_vring_call : File descriptor in bad state (77)
qemu-system-aarch64: info: vhost_net_start vhost_net_start_one
qemu-system-aarch64: info: vhost.c vhost_dev_start
qemu-system-aarch64: vhost_dev_start call vhost_set_mem_table: No buffer space available (105)
qemu-system-aarch64: vhost_dev_start call vhost_virtqueue_start: No buffer space available (105)
qemu-system-aarch64: vhost_virtqueue_start: No buffer space available (105)
qemu-system-aarch64: vhost_dev_start call vhost_virtqueue_start: Resource temporarily unavailable (11)
qemu-system-aarch64: vhost_virtqueue_start: Resource temporarily unavailable (11)


qemu-system-aarch64: info: tcp_chr_connect call qemu_chr_be_event CHR_EVENT_OPENED   ---nc 连接时
#define _VHOST_DEBUG 1

#ifdef _VHOST_DEBUG
#define VHOST_OPS_DEBUG(fmt, ...) 
    do { error_report(fmt ": %s (%d)", ## __VA_ARGS__, 
                      strerror(errno), errno); } while (0)
#else
#define VHOST_OPS_DEBUG(fmt, ...) 
    do { } while (0)
#endif

虚拟机侧

主机侧

qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: net_client_init_fun call  10
+ switch=virbr0
+ '[' -n tap1 ']'
++ whoami
+ ip tuntap add tap1 mode tap user root
ioctl(TUNSETIFF): Device or resource busy
+ ip link set tap1 up
+ sleep 0.5s
+ ip link set tap1 master virbr0
+ exit 0

[root@localhost ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.5254000d3f71       yes             enp125s0f1
                                                        tap1
                                                        virbr0-nic
[root@localhost ~]# 

+ switch=virbr0
+ '[' -n tap1 ']'
++ whoami
+ ip tuntap add tap1 mode tap user root
ioctl(TUNSETIFF): Device or resource busy
+ ip link set tap1 up
+ sleep 0.5s
+ ip link set tap1 master virbr0
+ exit 0
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: vhost_net_init call vhost_dev_init
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: vhost_dev_init call hdev->vhost_ops->vhost_backend_init 、host_set_owne、 vhost_get_features
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: vhost_dev_init call vhost_virtqueue_init
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: vhost_virtqueue_init vhost_set_vring_call
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: vhost_dev_init call vhost_virtqueue_init
qemu-system-aarch64: -netdev tap,ifname=tap1,id=network-0,vhost=on,script=../qemu-ifup,vnet_hdr=on: info: vhost_virtqueue_init vhost_set_vring_call
qemu-system-aarch64: info: vhost_net_start vhost_net_start_one
qemu-system-aarch64: info: vhost.c vhost_dev_start
qemu-system-aarch64: info: vhost_dev_start call vhost_set_mem_table
qemu-system-aarch64: info: vhost_dev_start call vhost_virtqueue_start
qemu-system-aarch64: info: vhost_virtqueue_start
qemu-system-aarch64: info: vhost_virtqueue_start vhost_set_vring_kick
qemu-system-aarch64: info: vhost_dev_start call vhost_virtqueue_start
qemu-system-aarch64: info: vhost_virtqueue_start
qemu-system-aarch64: info: vhost_virtqueue_start vhost_set_vring_kick

-object memory-backend-file,id=mem,size=4096M,mem-path=/mnt/huge1

主机侧

 虚拟机侧

设置了numa参数

最后我们看下设置了numa参数的情况,我们刚才说之前两种情况都不能满足vhost_user的使用,因为无法内存共享。那么我们看下使用vhost_user时的qemu参数的例子:

-object memory-backend-file,id=ram-node0,prealloc=yes,mem-path=/dev/hugepages/,share=yes,size=17179869184 -numa node,nodeid=0,cpus=0-29,memdev=ram-node0

没错我们需要指定numa参数,同时也要指定mem-path。numa参数的会导致在parse_numa函数中解析,并对nb_numa_nodes++。这里还有注意,指定了numa时也指定了memory-backend-file参数,这会导致qemu创建一个struct HostMemoryBackend内存对象(object)。

下面我们回到memory_region_allocate_system_memory具体分析。

原文地址:https://www.cnblogs.com/dream397/p/13962298.html