mirror of
https://github.com/Motorhead1991/qemu.git
synced 2026-01-06 06:27:41 -07:00
vfio/iommufd: use IOMMU_IOAS_MAP_FILE
Use IOMMU_IOAS_MAP_FILE when the mapped region is backed by a file. Such a mapping can be preserved without modification during CPR, because it depends on the file's address space, which does not change, rather than on the process's address space, which does change. Signed-off-by: Steve Sistare <steven.sistare@oracle.com> Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Link: https://lore.kernel.org/qemu-devel/1751493538-202042-9-git-send-email-steven.sistare@oracle.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
parent
d7ae4a740c
commit
fb32965b6d
3 changed files with 37 additions and 0 deletions
|
|
@ -78,7 +78,16 @@ int vfio_container_dma_map(VFIOContainerBase *bcontainer,
|
|||
void *vaddr, bool readonly, MemoryRegion *mr)
|
||||
{
|
||||
VFIOIOMMUClass *vioc = VFIO_IOMMU_GET_CLASS(bcontainer);
|
||||
RAMBlock *rb = mr->ram_block;
|
||||
int mfd = rb ? qemu_ram_get_fd(rb) : -1;
|
||||
|
||||
if (mfd >= 0 && vioc->dma_map_file) {
|
||||
unsigned long start = vaddr - qemu_ram_get_host_addr(rb);
|
||||
unsigned long offset = qemu_ram_get_fd_offset(rb);
|
||||
|
||||
return vioc->dma_map_file(bcontainer, iova, size, mfd, start + offset,
|
||||
readonly);
|
||||
}
|
||||
g_assert(vioc->dma_map);
|
||||
return vioc->dma_map(bcontainer, iova, size, vaddr, readonly, mr);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,6 +45,18 @@ static int iommufd_cdev_map(const VFIOContainerBase *bcontainer, hwaddr iova,
|
|||
iova, size, vaddr, readonly);
|
||||
}
|
||||
|
||||
static int iommufd_cdev_map_file(const VFIOContainerBase *bcontainer,
|
||||
hwaddr iova, ram_addr_t size,
|
||||
int fd, unsigned long start, bool readonly)
|
||||
{
|
||||
const VFIOIOMMUFDContainer *container =
|
||||
container_of(bcontainer, VFIOIOMMUFDContainer, bcontainer);
|
||||
|
||||
return iommufd_backend_map_file_dma(container->be,
|
||||
container->ioas_id,
|
||||
iova, size, fd, start, readonly);
|
||||
}
|
||||
|
||||
static int iommufd_cdev_unmap(const VFIOContainerBase *bcontainer,
|
||||
hwaddr iova, ram_addr_t size,
|
||||
IOMMUTLBEntry *iotlb, bool unmap_all)
|
||||
|
|
@ -807,6 +819,7 @@ static void vfio_iommu_iommufd_class_init(ObjectClass *klass, const void *data)
|
|||
VFIOIOMMUClass *vioc = VFIO_IOMMU_CLASS(klass);
|
||||
|
||||
vioc->dma_map = iommufd_cdev_map;
|
||||
vioc->dma_map_file = iommufd_cdev_map_file;
|
||||
vioc->dma_unmap = iommufd_cdev_unmap;
|
||||
vioc->attach_device = iommufd_cdev_attach;
|
||||
vioc->detach_device = iommufd_cdev_detach;
|
||||
|
|
|
|||
|
|
@ -167,6 +167,21 @@ struct VFIOIOMMUClass {
|
|||
int (*dma_map)(const VFIOContainerBase *bcontainer,
|
||||
hwaddr iova, ram_addr_t size,
|
||||
void *vaddr, bool readonly, MemoryRegion *mr);
|
||||
/**
|
||||
* @dma_map_file
|
||||
*
|
||||
* Map a file range for the container.
|
||||
*
|
||||
* @bcontainer: #VFIOContainerBase to use for map
|
||||
* @iova: start address to map
|
||||
* @size: size of the range to map
|
||||
* @fd: descriptor of the file to map
|
||||
* @start: starting file offset of the range to map
|
||||
* @readonly: map read only if true
|
||||
*/
|
||||
int (*dma_map_file)(const VFIOContainerBase *bcontainer,
|
||||
hwaddr iova, ram_addr_t size,
|
||||
int fd, unsigned long start, bool readonly);
|
||||
/**
|
||||
* @dma_unmap
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue