vfio:vfio_group是iommu_group的封裝,vfio_device是device的封裝。
vfio_iommu_type1:vfio_iommu是vfio_container在本驅動的代表,vfio_domain是iommu_domain的封裝,vfio_group是iommu_group的封裝
static struct vfio {
struct class *class; /*vfio_group設備的設備類,下放一堆vfio_group設備,/dev/vfio/* */
struct list_head iommu_drivers_list; /*vfio_iommu_driver_ops_type1,tce_iommu_driver_ops,vfio_noiommu_ops*/
struct mutex iommu_drivers_lock;
struct list_head group_list; /*用於鏈表vfio_group->vfio_next*/
struct idr group_idr; /*用於分配vfio_group的全局唯一號MINOR,不同於iommu_group->id*/
struct mutex group_lock;
struct cdev group_cdev; /*用於註冊字符設備類型,vfio_group_fops*/
dev_t group_devt; /*字符設備MAJOR號*/
wait_queue_head_t release_q;
} vfio;
struct vfio_container {
struct kref kref;
struct list_head group_list; /*用於鏈表vfio_group->container_next*/
struct rw_semaphore group_lock;
struct vfio_iommu_driver *iommu_driver;
void *iommu_data;
bool noiommu;
};
struct vfio_group {
struct kref kref;
int minor; /*從vfio->group_idr中分配的全局唯一的MINOR號*/
atomic_t container_users;
struct iommu_group *iommu_group; /*指向對應的iommu_group*/
struct vfio_container *container; /*指向對應的vfio_container*/
struct list_head device_list; /*用於鏈表vfio_device->group_next*/
struct mutex device_lock;
struct device *dev; /*vfio_group設備在sysfs與devtmpfs中的表現*/
struct notifier_block nb;
struct list_head vfio_next; /*用於掛載到vfio.group_list中*/
struct list_head container_next; /*用於掛載到vfio_container->group_list鏈表中*/
struct list_head unbound_list;
struct mutex unbound_lock;
atomic_t opened;
wait_queue_head_t container_q;
bool noiommu;
struct kvm *kvm;
struct blocking_notifier_head notifier;
};
struct vfio_device {
struct kref kref;
struct device *dev; /*指向對應的device*/
const struct vfio_device_ops *ops; /*vfio_pci_ops,被vfio_device_fops封裝*/
struct vfio_group *group; /*指向vfio_group*/
struct list_head group_next; /*用於掛載到vfio_group->device_list鏈表中*/
void *device_data; /*指向vfio_pci_device,其又是pci_dev的封裝,pci_dev->dev又指向device*/
};
struct vfio_iommu { /*vfio_container的代表*/
struct list_head domain_list; /用於鏈表vfio_domain->next*/
struct list_head iova_list; /*可用的iova區間鏈表*/
struct vfio_domain *external_domain; /* domain for external user */
struct mutex lock;
struct rb_root dma_list; /*已經建立的dma mapping表*/
struct blocking_notifier_head notifier;
unsigned int dma_avail;
bool v2;
bool nesting;
};
struct vfio_domain {
struct iommu_domain *domain; /*指向dmar_domain->iommu_domain*/
struct list_head next; /*用於掛載到vfio_iommu->domain_list*/
struct list_head group_list; /*用於鏈表vfio_group->next*/
int prot; /* IOMMU_CACHE */
bool fgsp; /* Fine-grained super pages */
};
struct vfio_group { /*不同於vfio驅動中的vfio_group*/
struct iommu_group *iommu_group; /*封裝了iommu_group*/
struct list_head next; /*用於掛載到vfio_domain->group_list*/
bool mdev_group; /* An mdev group */
};