众所周知,虚拟队列数据传输的基本流程是——virtio驱动向available队列添加buffer描述符并且触发驱动事件来通知后端device。Device执行前端的request,当结束时标记已经被使用的buffer,然后向驱动发送中断。在device处理过程中,并不一定要求按照virtio device加入avaible队列的顺序来使用buffer。这就造成virtio驱动必须一个一个描述符来处理数据。
然而,一些硬件vhost device可以保证按照avaiblering的顺序使用buffer,这时就可以提供VIRTIO_F_IN_ORDER feature。如果feature被协商成功,就可以使用优化过的驱动程序。
在未正式发布的Virtio spec对IN_ORDER的实现有如下要求:
当VIRTIO_F_IN_ORDER协商成功之后,virtio驱动要按照ring的顺序使用描述符,从table 0开始并且在table 结束的位置做回滚。当virtio device添加available ring描述符时, 如果其中一个位置为x的描述符中VRING_DESC_F_NEXT被设置到flag上,描述符中next的值必须为x+1或者是0(如果x是最末位)。如果是使用INDIRECT描述符时,indirect描述符队列中的索引数值也需要连续,从0开始然后按顺序1,2,以此类推。
作为对应的实现,18.08中virtio user pmd中加入了两个新的收发函数:virtio_recv_mergeable_pkts_inorder和virtio_xmit_pkts_inorder。为了配置in order和Rx_mrg这个对virtio pmd Rx/Tx path选择上非常重要的feature, 加入了两个新的virtio vdev参数。一个是mrg_rxbuf 用来配置virtio user device支持VIRTIO_