浅析DPDK驱动管理:vhost

文章目录

    • 概述
    • DPDK vhost工作机制
      • DPDK vhost工作模式
    • DPDK vhost管理结构
    • DPDK vhost接口
      • 注册vhost驱动:rte_vhost_driver_register
      • 启动vhost:rte_vhost_driver_start
        • vhost消息处理
    • 相关参考

概述

DPDK提供了一套vhost库,用于加速virtio后端,对比于内核态的vhost方案,由于DPDK vhost是在用户态空间实现,因而也称作vhost-user。

DPDK vhost工作机制

DPDK vhost方案的核心是将数据面的处理放到用户空间中,而控制面的逻辑则通过Unix域套接字进行配置。DPDK vhost的整体框架如下:
在这里插入图片描述

DPDK应用程序作为单独的进程运行在宿主机上,通过Unix domain socket与QEMU完成设备控制信息的交互,包括设备属性、功能以及virtqueue配置等。virtio设备的模拟仍然由QEMU处理;在完成virtio设备的配置后,DPDK应用程序会以轮询的方式从VM的virtqueue中获得请求并进行处理。

DPDK vhost工作模式

DPDK vhost使用UNIX域套接字传输控制消息,根据vhost是作为server或client运行,vhost-user支持两种配置模式:

  • vhost-user:vhost-user作为服务端运行,创建Unix域套接字服务文件,并监听来自前端的连接。这是最初vhost-user支持的模式,但存在一旦DPDK业务进程挂掉,就会对所有VM造成影响;
  • vhost-user-client:vhost-user作为客户端运行,由DPDK业务进程负责发起对服务端的连接。

DPDK vhost管理结构

DPDK vhost核心数据结构关联如下:
在这里插入图片描述

其中:

  • vhost_user:vhost-user全局管理结构,维护所有vhost驱动
  • vhost_user_socket:对于每个vhost驱动,都维护着一个Unix domain socket,负责与外部应用进行通信;
  • vhost_user_connection:

DPDK vhost接口

DPDK本身提供的是一套vhost库接口,由上层应用通过调用对应的接口实现特定的vhost驱动,目前已有的实现包括DPDK自带的vhost-net驱动、SPDK基于DPDK vhost接口实现的vhost-blk和vhost-scsi驱动等。DPDK vhost提供的几个关键接口如下:

  • rte_vhost_driver_register:注册vhost驱动;
  • rte_vhost_driver_set_features:设置vhost驱动的feature信息;
  • rte_vhost_driver_callback_register:注册vhost驱动特定的回调,由vhost-user在合适的流程中进行调用;
  • rte_vhost_driver_start:启动vhost;
  • rte_vhost_enqueue_burst:从Host向Guest传输数据;
  • rte_vhost_dequeue_burst:从身体Guest接收数据。

注册vhost驱动:rte_vhost_driver_register

在这里插入图片描述

启动vhost:rte_vhost_driver_start

在这里插入图片描述

vhost消息处理

vhost_user_read_cb负责接收Unix domain socket的消息,并进行处理。
在这里插入图片描述

相关参考

  • Vhost Library