vhost_protocal

vhost message types front-end 1

  • FEATURE

    • VHOST_USER_GET_FEATURES

      从底层 vhost 实现中获取特性位掩码。特性位 VHOST_USER_F_PROTOCOL_FEATURES 表示后 端支持 VHOST_USER_GET_PROTOCOL_FEATURES 和 VHOST_USER_SET_PROTOCOL_FEATURES。

    • VHOST_USER_SET_FEATURES

      使能底层实现的一些feature.(例如vhost_log_global_start()会使能 VHOST_F_LOG_ALL feature )

    • VHOST_USER_GET_PROTOCOL_FEATURES

      获取protocol feature, 这相当于一个子feature,仅和协议扩展相关。

    • VHOST_USER_SET_PROTOCOL_FEATURES

      使能某些 protocol features.

  • OWNER

    • VHOST_USER_SET_OWNER

      在新建立链接的时候,前端向后端发送,表示发送方已经标记为 拥有该会话的前端,此时,后端可以认为会话已经开始。

      很类似于tcp三次握手中的(seq->ack->ack)中的第二次ack, server 端在收到client端发送的ack后,认为该连接已经建立,为其该连接 分配相关资源(新版本kernel是这样做的)

    • VHOST_USER_RESET_OWNER

      目前已经弃用,之前用其来disabling all ring(仍想保持会话建立), 但是后端会将其解 释 为还要 discard connect state(类似于close), 建议后端直接忽略次消息,要么仅用 其来disable all rings.

  • MEMORY REGION

    • VHOST_USER_SET_MEM_TABLE

      将虚拟机内存信息传递到后端, 让后端可以访问这片内存,同时,需要给vhost 这片内存 和GPA的映射关系.

      主要传递的信息有:

      • fds[]

      • VhostUserMemoryRegion[]

        • guest_phys_addr

        • memory_size

        • userspace_addr

        • mmap_offset

      这里有两个数组, 两个数组中相同index的数组成员表示一个内存区域, 其中fds[] 存放的是文件描述符, vhost front-end 通过其建立好的socket通道,通过socket的Ancillary messages机制2将文件描述符传递到back-end().

      另外, VhostUserMemoryRegion会增加一些描述信息, 其主要的目的是将guest memory region([guest_phy_addr(gpa), gpa + memory_size])和该文件的region ([mmap_offset, mmap_offset + memory_size])的绑定关系get到, 然后调用vfio 相关接口配置iommu.

      vhost_user_client_and_guest_mr
    • VHOST_USER_GET_MAX_MEM_SLOTS

    • VHOST_USER_ADD_MEM_REG

    • VHOST_USER_REM_MEM_REG

  • LOG

    • VHOST_USER_SET_LOG_BASE

    • VHOST_USER_SET_LOG_FD

  • VRING

    • set

      • VHOST_USER_SET_VRING_NUM

      • VHOST_USER_SET_VRING_ADDR

      • VHOST_USER_SET_VRING_BASE

      • VHOST_USER_SET_VRING_KICK

      • VHOST_USER_SET_VRING_ERR

      • VHOST_USER_SET_VRING_ENABLE

      • VHOST_USER_SET_VRING_CALL

      • VHOST_USER_SET_VRING_ENDIAN

      这些一般会在guest modify common_cap.dev_status为3.1

      DRIVER_OK (4) Indicates that the driver is set up and ready to drive 
      the device.

      表示guest driver 已经最好准备驱动设备了,设备可以工作了.

    • get

      • VHOST_USER_GET_VRING_BASE

      • VHOST_USER_GET_QUEUE_NUM

  • migration postcopy

    • VHOST_USER_POSTCOPY_ADVISE

    • VHOST_USER_POSTCOPY_LISTEN

    • VHOST_USER_POSTCOPY_END

  • RESET

    • VHOST_USER_RESET_DEVICE

  • OTHER

    • VHOST_USER_SEND_RARP

    • VHOST_USER_NET_SET_MTU

    • VHOST_USER_SET_BACKEND_REQ_FD

    • VHOST_USER_IOTLB_MSG

    • VHOST_USER_GET_CONFIG

    • VHOST_USER_SET_CONFIG

    • VHOST_USER_CLOSE_CRYPTO_SESSION

    • VHOST_USER_SET_INFLIGHT_FD

    • VHOST_USER_GPU_SET_SOCKET

    • VHOST_USER_SET_STATUS

    • VHOST_USER_GET_STATUS

    • VHOST_USER_GET_SHARED_OBJECT

    • VHOST_USER_SET_DEVICE_STATE_FD

    • VHOST_USER_CHECK_DEVICE_STATE

堆栈

附录

vhost_virtqueue_start() stack

vhost_user_set_vring_call stack

vhost_set_vring_enable

TODO

  1. virtio_pci_set_guest_notifiers

    • msix mask/unmask notify

    • vhost_set_vring_call

参考链接

  1. virtio spec status field

    • 3.1 section 2.1 Device Status Field

    • 3.2 section 4.3 Common configuration structure layout

Last updated