接前一篇文章:
上一回解析了setup_vq函数的前3步,本回继续解析余下的步骤。为了便于理解和加深印象,再次贴出setup_vq函数的源码,在Linux内核源码/drivers/virtio/virtio_pci_modern.c中,代码如下:
static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
struct virtio_pci_vq_info *info,
unsigned int index,
void (*callback)(struct virtqueue *vq),
const char *name,
bool ctx,
u16 msix_vec)
{
struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
bool (*notify)(struct virtqueue *vq);
struct virtqueue *vq;
u16 num;
int err;
if (__virtio_test_bit(&vp_dev->vdev, VIRTIO_F_NOTIFICATION_DATA))
notify = vp_notify_with_data;
else
notify = vp_notify;
if (index >= vp_modern_get_num_queues(mdev))
return ERR_PTR(-EINVAL);
/* Check if qu
本文继续探讨QEMU virtio设备的实现,重点解析`setup_vq`函数剩余步骤,涉及virtqueue的创建过程。通过vring_create_virtqueue函数,区分了支持VIRTIO_F_RING_PACKED特性的packed ring和不支持时的split ring。packed ring优化了内存访问,减少cache冲突,而split ring将descriptor、available和used ring分开。文章还介绍了两种ring的工作原理及其在virtqueue创建中的应用。
订阅专栏 解锁全文
1626

被折叠的 条评论
为什么被折叠?



