接前一篇文章:
上一回解析了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;elsenotify = vp_notify;if (index >= vp_modern_get_num_queues(mdev))return ERR_PTR(-EINVAL);/* Check if queue is either not available or already active. */num = vp_modern_get_queue_size(mdev, index);if (!num || vp_modern_get_queue_enable(md