zoukankan      html  css  js  c++  java
  • qemu vhost_net + vhost_dev_init

    https://blog.csdn.net/qq_20817327/article/details/106655151

    net/tap.c 

    static void net_init_tap_one
    {
    699             vhostfd = open("/dev/vhost-net", O_RDWR);
    700             if (vhostfd < 0) {
    701                 if (tap->has_vhostforce && tap->vhostforce) {
    702                     error_setg_errno(errp, errno,
    703                                      "tap: open vhost char device failed");
    704                 } else {
    705                     warn_report("tap: open vhost char device failed: %s",
    706                                 strerror(errno));
    707                 }
    708                 return;
    709             }
    710             qemu_set_nonblock(vhostfd);
    711         }
    712         options.opaque = (void *)(uintptr_t)vhostfd;
    713 
    714         s->vhost_net = vhost_net_init(&options);
    }

     vhost_virtqueue_init

    [root@bogon qemu]# grep 'vhost_ops =' -rn *
    backends/cryptodev-vhost.c:161:    vhost_ops = crypto->dev.vhost_ops;
    hw/virtio/vhost-vsock.c:42:    const VhostOps *vhost_ops = vsock->vhost_dev.vhost_ops;
    hw/virtio/vhost-vsock.c:59:    const VhostOps *vhost_ops = vsock->vhost_dev.vhost_ops;
    hw/virtio/vhost-backend.c:280:        dev->vhost_ops = &kernel_ops;
    hw/virtio/vhost-backend.c:285:        dev->vhost_ops = &user_ops;
    hw/scsi/vhost-scsi.c:46:    const VhostOps *vhost_ops = vsc->dev.vhost_ops;
    hw/scsi/vhost-scsi.c:64:    const VhostOps *vhost_ops = vsc->dev.vhost_ops;
    hw/scsi/vhost-scsi.c:75:    const VhostOps *vhost_ops = vsc->dev.vhost_ops;
    hw/net/vhost_net.c:384:    const VhostOps *vhost_ops = net->dev.vhost_ops;
    hw/net/vhost_net.c:431:    const VhostOps *vhost_ops = net->dev.vhost_ops;
    hw/net/vhost_net.c:444:    const VhostOps *vhost_ops = net->dev.vhost_ops;
    [root@bogon qemu]# 
    [root@bogon qemu]# grep 'vhost_net =' -rn *
    hw/net/vhost_net.c:405:    VHostNetState *vhost_net = 0;
    hw/net/vhost_net.c:413:        vhost_net = tap_get_vhost_net(nc);
    hw/net/vhost_net.c:417:        vhost_net = vhost_user_get_vhost_net(nc);
    net/vhost-user.c:107:        s->vhost_net = net;
    net/vhost-user.c:157:        s->vhost_net = NULL;
    net/tap.c:317:        s->vhost_net = NULL;
    net/tap.c:392:    s->vhost_net = NULL;
    net/tap.c:714:        s->vhost_net = vhost_net_init(&options)
    403 VHostNetState *get_vhost_net(NetClientState *nc)
    404 {
    405     VHostNetState *vhost_net = 0;
    406 
    407     if (!nc) {
    408         return 0;
    409     }
    410 
    411     switch (nc->info->type) {
    412     case NET_CLIENT_DRIVER_TAP:
    413         vhost_net = tap_get_vhost_net(nc);
    414         break;
    415 #ifdef CONFIG_VHOST_NET_USER
    416     case NET_CLIENT_DRIVER_VHOST_USER:
    417         vhost_net = vhost_user_get_vhost_net(nc);
    418         assert(vhost_net);
    419         break;
    420 #endif
    421     default:
    422         break;
    423     }
    424 
    425     return vhost_net;
    426 }
    [root@bogon qemu]# grep vhost_user_get_vhost_net -rn *
    Binary file build/aarch64-softmmu/qemu-system-aarch64 matches
    Binary file build/net/vhost-user.o matches
    Binary file build/hw/net/vhost_net.o matches
    hw/net/vhost_net.c:417:        vhost_net = vhost_user_get_vhost_net(nc);
    include/net/vhost-user.h:15:struct vhost_net *vhost_user_get_vhost_net(NetClientState *nc);
    net/vhost-user.c:34:VHostNetState *vhost_user_get_vhost_net(NetClientState *nc)
    [root@bogon qemu]# vi 
    1147 static int vhost_virtqueue_init(struct vhost_dev *dev,
    1148                                 struct vhost_virtqueue *vq, int n)
    1149 {
    1150     int vhost_vq_index = dev->vhost_ops->vhost_get_vq_index(dev, n);
    1151     struct vhost_vring_file file = {
    1152         .index = vhost_vq_index,
    1153     };
    1154     int r = event_notifier_init(&vq->masked_notifier, 0);
    1155     if (r < 0) {
    1156         return r;
    1157     }
    1158 
    1159     file.fd = event_notifier_get_fd(&vq->masked_notifier);
    1160     r = dev->vhost_ops->vhost_set_vring_call(dev, &file);
    1161     if (r) {
    1162         VHOST_OPS_DEBUG("vhost_set_vring_call failed");
    1163         r = -errno;
    1164         goto fail_call;
    1165     }
    1166 
    1167     vq->dev = dev;
    1168 
    1169     return 0;
    1170 fail_call:
    1171     event_notifier_cleanup(&vq->masked_notifier);
    1172     return r;
    1173 }
    hw/virtio/vhost.c 
    hw/virtio/vhost.c:1043:        r = dev->vhost_ops->vhost_set_vring_call(dev, &file);
    hw/virtio/vhost.c:1160:    r = dev->vhost_ops->vhost_set_vring_call(dev, &file);
    hw/virtio/vhost.c:1162:        VHOST_OPS_DEBUG("vhost_set_vring_call failed");
    hw/virtio/vhost.c:1420:    r = hdev->vhost_ops->vhost_set_vring_call(hdev, &file);
    hw/virtio/vhost.c:1422:        VHOST_OPS_DEBUG("vhost_set_vring_call failed");
    hw/virtio/vhost-user.c:1935:        .vhost_set_vring_call = vhost_user_set_vring_call,
    hw/virtio/vhost-backend.c:256:        .vhost_set_vring_call = vhost_kernel_set_vring_call,
    include/hw/virtio/vhost-backend.h:67:typedef int (*vhost_set_vring_call_op)(struct vhost_dev *dev,
    include/hw/virtio/vhost-backend.h:133:    vhost_set_vring_call_op vhost_set_vring_call;
    [root@bogon qemu]# 
    vhost_kernel_set_vring_call
    139 static int vhost_kernel_set_vring_call(struct vhost_dev *dev,
    140                                        struct vhost_vring_file *file)
    141 {
    142     return vhost_kernel_call(dev, VHOST_SET_VRING_CALL, file);
    143 }
     21 static int vhost_kernel_call(struct vhost_dev *dev, unsigned long int request,
     22                              void *arg)
     23 {
     24     int fd = (uintptr_t) dev->opaque;
     25 
     26     assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_KERNEL);
     27 
     28     return ioctl(fd, request, arg);
     29 }
    vhost_user_set_vring_call
     795 static int vhost_user_set_vring_call(struct vhost_dev *dev,
     796                                      struct vhost_vring_file *file)
     797 {
     798     return vhost_set_vring_file(dev, VHOST_USER_SET_VRING_CALL, file);
     799 }
     763 static int vhost_set_vring_file(struct vhost_dev *dev,
     764                                 VhostUserRequest request,
     765                                 struct vhost_vring_file *file)
     766 {
     767     int fds[VHOST_MEMORY_MAX_NREGIONS];
     768     size_t fd_num = 0;
     769     VhostUserMsg msg = {
     770         .hdr.request = request,
     771         .hdr.flags = VHOST_USER_VERSION,
     772         .payload.u64 = file->index & VHOST_USER_VRING_IDX_MASK,
     773         .hdr.size = sizeof(msg.payload.u64),
     774     };
     775 
     776     if (ioeventfd_enabled() && file->fd > 0) {
     777         fds[fd_num++] = file->fd;
     778     } else {
     779         msg.payload.u64 |= VHOST_USER_VRING_NOFD_MASK;
     780     }
     781 
     782     if (vhost_user_write(dev, &msg, fds, fd_num) < 0) {
     783         return -1;
     784     }
     785 
     786     return 0;
     787 }
  • 相关阅读:
    Flush the AOS cache from code
    EntityConnectionStringBuilder 构造EF连接字符串
    AX中文转拼音
    AX2012 AOT中Web部署显示二级以上菜单
    clearCompanyCache
    AX2009 打印到PDF优化
    AX ODBC读取其他SQL数据库服务器数据
    AX2009报表打印固定长度Barcode条码
    Create Product Variant
    Rename AOT Object
  • 原文地址:https://www.cnblogs.com/dream397/p/13867714.html
Copyright © 2011-2022 走看看