Message ID | 20231026103104.1686921-17-zhenzhong.duan@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio: Adopt iommufd | expand |
On 10/26/23 12:30, Zhenzhong Duan wrote: > From: Eric Auger <eric.auger@redhat.com> > > No functional change intended. > > Signed-off-by: Eric Auger <eric.auger@redhat.com> > Signed-off-by: Yi Liu <yi.l.liu@intel.com> > Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com> > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > Signed-off-by: Cédric Le Goater <clg@redhat.com> Drop the Sob please, Reviewed-by: Cédric Le Goater <clg@redhat.com> Thanks, C. > --- > include/hw/vfio/vfio-common.h | 2 -- > include/hw/vfio/vfio-container-base.h | 2 ++ > hw/vfio/container.c | 11 ++++++----- > 3 files changed, 8 insertions(+), 7 deletions(-) > > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index 56452018a9..423ab2436c 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -80,8 +80,6 @@ typedef struct VFIOContainer { > int fd; /* /dev/vfio/vfio, empowered by the attached groups */ > MemoryListener prereg_listener; > unsigned iommu_type; > - uint64_t dirty_pgsizes; > - uint64_t max_dirty_bitmap_size; > QLIST_HEAD(, VFIOHostDMAWindow) hostwin_list; > QLIST_HEAD(, VFIOGroup) group_list; > GList *iova_ranges; > diff --git a/include/hw/vfio/vfio-container-base.h b/include/hw/vfio/vfio-container-base.h > index 89642e6b45..526d23acfd 100644 > --- a/include/hw/vfio/vfio-container-base.h > +++ b/include/hw/vfio/vfio-container-base.h > @@ -53,6 +53,8 @@ typedef struct VFIOContainerBase { > MemoryListener listener; > Error *error; > bool initialized; > + uint64_t dirty_pgsizes; > + uint64_t max_dirty_bitmap_size; > unsigned long pgsizes; > unsigned int dma_max_mappings; > bool dirty_pages_supported; > diff --git a/hw/vfio/container.c b/hw/vfio/container.c > index b8f36f56d2..68dc6d240f 100644 > --- a/hw/vfio/container.c > +++ b/hw/vfio/container.c > @@ -64,6 +64,7 @@ static int vfio_dma_unmap_bitmap(VFIOContainer *container, > hwaddr iova, ram_addr_t size, > IOMMUTLBEntry *iotlb) > { > + VFIOContainerBase *bcontainer = &container->bcontainer; > struct vfio_iommu_type1_dma_unmap *unmap; > struct vfio_bitmap *bitmap; > VFIOBitmap vbmap; > @@ -91,7 +92,7 @@ static int vfio_dma_unmap_bitmap(VFIOContainer *container, > bitmap->size = vbmap.size; > bitmap->data = (__u64 *)vbmap.bitmap; > > - if (vbmap.size > container->max_dirty_bitmap_size) { > + if (vbmap.size > bcontainer->max_dirty_bitmap_size) { > error_report("UNMAP: Size of bitmap too big 0x%"PRIx64, vbmap.size); > ret = -E2BIG; > goto unmap_exit; > @@ -131,7 +132,7 @@ static int vfio_legacy_dma_unmap(VFIOContainerBase *bcontainer, hwaddr iova, > > if (iotlb && vfio_devices_all_running_and_mig_active(bcontainer)) { > if (!vfio_devices_all_device_dirty_tracking(bcontainer) && > - container->bcontainer.dirty_pages_supported) { > + bcontainer->dirty_pages_supported) { > return vfio_dma_unmap_bitmap(container, iova, size, iotlb); > } > > @@ -154,7 +155,7 @@ static int vfio_legacy_dma_unmap(VFIOContainerBase *bcontainer, hwaddr iova, > if (errno == EINVAL && unmap.size && !(unmap.iova + unmap.size) && > container->iommu_type == VFIO_TYPE1v2_IOMMU) { > trace_vfio_legacy_dma_unmap_overflow_workaround(); > - unmap.size -= 1ULL << ctz64(container->bcontainer.pgsizes); > + unmap.size -= 1ULL << ctz64(bcontainer->pgsizes); > continue; > } > error_report("VFIO_UNMAP_DMA failed: %s", strerror(errno)); > @@ -469,8 +470,8 @@ static void vfio_get_iommu_info_migration(VFIOContainer *container, > */ > if (cap_mig->pgsize_bitmap & qemu_real_host_page_size()) { > bcontainer->dirty_pages_supported = true; > - container->max_dirty_bitmap_size = cap_mig->max_dirty_bitmap_size; > - container->dirty_pgsizes = cap_mig->pgsize_bitmap; > + bcontainer->max_dirty_bitmap_size = cap_mig->max_dirty_bitmap_size; > + bcontainer->dirty_pgsizes = cap_mig->pgsize_bitmap; > } > } >
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index 56452018a9..423ab2436c 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -80,8 +80,6 @@ typedef struct VFIOContainer { int fd; /* /dev/vfio/vfio, empowered by the attached groups */ MemoryListener prereg_listener; unsigned iommu_type; - uint64_t dirty_pgsizes; - uint64_t max_dirty_bitmap_size; QLIST_HEAD(, VFIOHostDMAWindow) hostwin_list; QLIST_HEAD(, VFIOGroup) group_list; GList *iova_ranges; diff --git a/include/hw/vfio/vfio-container-base.h b/include/hw/vfio/vfio-container-base.h index 89642e6b45..526d23acfd 100644 --- a/include/hw/vfio/vfio-container-base.h +++ b/include/hw/vfio/vfio-container-base.h @@ -53,6 +53,8 @@ typedef struct VFIOContainerBase { MemoryListener listener; Error *error; bool initialized; + uint64_t dirty_pgsizes; + uint64_t max_dirty_bitmap_size; unsigned long pgsizes; unsigned int dma_max_mappings; bool dirty_pages_supported; diff --git a/hw/vfio/container.c b/hw/vfio/container.c index b8f36f56d2..68dc6d240f 100644 --- a/hw/vfio/container.c +++ b/hw/vfio/container.c @@ -64,6 +64,7 @@ static int vfio_dma_unmap_bitmap(VFIOContainer *container, hwaddr iova, ram_addr_t size, IOMMUTLBEntry *iotlb) { + VFIOContainerBase *bcontainer = &container->bcontainer; struct vfio_iommu_type1_dma_unmap *unmap; struct vfio_bitmap *bitmap; VFIOBitmap vbmap; @@ -91,7 +92,7 @@ static int vfio_dma_unmap_bitmap(VFIOContainer *container, bitmap->size = vbmap.size; bitmap->data = (__u64 *)vbmap.bitmap; - if (vbmap.size > container->max_dirty_bitmap_size) { + if (vbmap.size > bcontainer->max_dirty_bitmap_size) { error_report("UNMAP: Size of bitmap too big 0x%"PRIx64, vbmap.size); ret = -E2BIG; goto unmap_exit; @@ -131,7 +132,7 @@ static int vfio_legacy_dma_unmap(VFIOContainerBase *bcontainer, hwaddr iova, if (iotlb && vfio_devices_all_running_and_mig_active(bcontainer)) { if (!vfio_devices_all_device_dirty_tracking(bcontainer) && - container->bcontainer.dirty_pages_supported) { + bcontainer->dirty_pages_supported) { return vfio_dma_unmap_bitmap(container, iova, size, iotlb); } @@ -154,7 +155,7 @@ static int vfio_legacy_dma_unmap(VFIOContainerBase *bcontainer, hwaddr iova, if (errno == EINVAL && unmap.size && !(unmap.iova + unmap.size) && container->iommu_type == VFIO_TYPE1v2_IOMMU) { trace_vfio_legacy_dma_unmap_overflow_workaround(); - unmap.size -= 1ULL << ctz64(container->bcontainer.pgsizes); + unmap.size -= 1ULL << ctz64(bcontainer->pgsizes); continue; } error_report("VFIO_UNMAP_DMA failed: %s", strerror(errno)); @@ -469,8 +470,8 @@ static void vfio_get_iommu_info_migration(VFIOContainer *container, */ if (cap_mig->pgsize_bitmap & qemu_real_host_page_size()) { bcontainer->dirty_pages_supported = true; - container->max_dirty_bitmap_size = cap_mig->max_dirty_bitmap_size; - container->dirty_pgsizes = cap_mig->pgsize_bitmap; + bcontainer->max_dirty_bitmap_size = cap_mig->max_dirty_bitmap_size; + bcontainer->dirty_pgsizes = cap_mig->pgsize_bitmap; } }