There is a bunch of code an comments in the iommu type1 code that suggest we can pin memory that is not page backed. > int vfio_pin_pages(struct vfio_device *device, dma_addr_t iova, > + int npage, int prot, struct page **phys_page) I don't think phys_page makes much sense as an argument name. I'd just call this pages. > + phys_page[i] = pfn_to_page(vpfn->pfn); Please store the actual page pointer in the vfio_pfn structure. > remote_vaddr = dma->vaddr + (iova - dma->iova); > - ret = vfio_pin_page_external(dma, remote_vaddr, &phys_pfn[i], > + ret = vfio_pin_page_external(dma, remote_vaddr, &phys_pfn, > do_accounting); Please just return the actual page from vaddr_get_pfns through vfio_pin_pages_remote and vfio_pin_page_external, maybe even as a prep patch as that is a fair amount of churn.