vfio_pin_pages_remote //将要映射的物理页先pin住,以防被swap出去,导致dma时物理页不存在 vfio_iommu_map //建立iova<->hpa的映射 iommu_map vfio_dma_bitmap_alloc //判断dirty_page_tracking若为1,说明此时dma logging正在进行,故此时iova映射完成后 //立马把其对应的vfio_dma->bitmap也分配了 //vfio_...
登录后复制vfio_dma_do_map: vfio_pin_map_dmawhile(size) {/* Pin a contiguous chunk of memory */npage = vfio_pin_pages_remote(dma, vaddr + dma- >size,size> > PAGE_SHIFT, &pfn, limit);/* Map it! */vfio_iommu_map(iommu, iova + dma- >size, pfn, npage, dma- >prot); list...
其中vfio_pin_page_external一方面调用vaddr_get_pfn --> get_user_pages_*获取PFN并pin住内存,另一方面还调用vfio_lock_acct增加了mm->locked_vm的计数,确保了对已经pin住的内存页数的统计没有遗漏。 当Parent Device利用pin_pages操作pin住物理内存后,它就会使用Linux内核提供的dma_map_*函数来分配pIOVA,这个p...
ret = vfio_pin_map_dma(iommu, dma, size); …… } 首先对入参进行检查,再申请一个dma 对象并填充其成员变量,然后对填充完了的dma 进行vfio_pin_map_dma()操作。 static int vfio_pin_map_dma(struct vfio_iommu *iommu, struct vfio_dma *dma, size_t map_size) { dma_addr_t iova = dma->i...
vfio_pin_map_dma(struct vfio_iommu *iommu, struct vfio_dma *dma,size_t map_size) //需要map_size大小 ---vfio_iommu_map(iommu, iova + dma->size, pfn, npage,dma->prot) ---iommu_map(d->domain, iova, (phys_addr_t)pfn << PAGE_SHIFT, npage << PAGE_SHIFT, prot | d->prot) ...
VFIO_IOMMU_MAP_DMA:指定设备端看到的IO地址到进程的虚拟地址之间的映射 第二个层面,group的操作是通过打开/dev/vifo/<group_id>文件, 对其执行ioctl操作,主要的操作有: VFIO_GROUP_GET_STATUS:获取group 的状态信息 VFIO_GROUP_SET_CONTAINER:设置group 和container 之间的绑定关系 ...
在以非root用户身份运行VFIO时遇到了同样的问题,因为这里似乎没有解决方案。我增加了锁定内存的限制,在...
>> peer-to-peer DMA ranges. When the device is backed by an IOMMU, >> vfio_dma_map() will pin pages to establish a fixed IOMMU translation. >> vfio_pin_pages() comes into play when the device we're assigning is not >> backed by the IOMMU, which can be the case with a mediate...
vfio_iommu_driver:为vfio提供了IOMMU重映射驱动,即向用户空间暴露DMA操作,如container的ioctl选项VFIO_IOMMU_MAP_DMA即由vfio containter设备文件对应的 file_operations 的ioctl转发到vfio_iommu_driver的ioctl实现,已实现的vfio_iommu_driver包括vfio_iommu_type1、vfio_spapr_eeh等,这里重点分析vfio_iommu_type1。
VFIO.简称虚拟功能I/O,VFIO是一套完整的用户态驱动(userspace driver)方案,它可以安全地把设备I/O、中断、DMA等能力呈现给用户空间。 目的。VFIO驱动程序框架旨在替换KVM PCI特定设备分配代码,并提供比UIO更安全、功能更强大的用户空间驱动程序环境,通过VFIO向用户态开放IOMMU的功能,编写用户态的驱动。