vfio代碼閱讀筆記

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 */
};
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章