Message ID | 20231102071302.1818071-25-zhenzhong.duan@intel.com |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | [v4,01/41] vfio/container: Move IBM EEH related functions into spapr_pci_vfio.c | expand |
On 11/2/23 08:12, Zhenzhong Duan wrote: > No functional changes intended. > > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Thanks, C. > --- > include/hw/vfio/vfio-common.h | 1 - > hw/vfio/spapr.c | 36 +++++++++++++++++++---------------- > 2 files changed, 20 insertions(+), 17 deletions(-) > > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index ed6148c058..24ecc0e7ee 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -79,7 +79,6 @@ typedef struct VFIOContainer { > VFIOContainerBase bcontainer; > int fd; /* /dev/vfio/vfio, empowered by the attached groups */ > unsigned iommu_type; > - QLIST_HEAD(, VFIOHostDMAWindow) hostwin_list; > QLIST_HEAD(, VFIOGroup) group_list; > } VFIOContainer; > > diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c > index 68c3dd6c75..5c6426e697 100644 > --- a/hw/vfio/spapr.c > +++ b/hw/vfio/spapr.c > @@ -27,6 +27,7 @@ > typedef struct VFIOSpaprContainer { > VFIOContainer container; > MemoryListener prereg_listener; > + QLIST_HEAD(, VFIOHostDMAWindow) hostwin_list; > } VFIOSpaprContainer; > > static bool vfio_prereg_listener_skipped_section(MemoryRegionSection *section) > @@ -154,12 +155,12 @@ static const MemoryListener vfio_prereg_listener = { > .region_del = vfio_prereg_listener_region_del, > }; > > -static void vfio_host_win_add(VFIOContainer *container, hwaddr min_iova, > +static void vfio_host_win_add(VFIOSpaprContainer *scontainer, hwaddr min_iova, > hwaddr max_iova, uint64_t iova_pgsizes) > { > VFIOHostDMAWindow *hostwin; > > - QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) { > + QLIST_FOREACH(hostwin, &scontainer->hostwin_list, hostwin_next) { > if (ranges_overlap(hostwin->min_iova, > hostwin->max_iova - hostwin->min_iova + 1, > min_iova, > @@ -173,15 +174,15 @@ static void vfio_host_win_add(VFIOContainer *container, hwaddr min_iova, > hostwin->min_iova = min_iova; > hostwin->max_iova = max_iova; > hostwin->iova_pgsizes = iova_pgsizes; > - QLIST_INSERT_HEAD(&container->hostwin_list, hostwin, hostwin_next); > + QLIST_INSERT_HEAD(&scontainer->hostwin_list, hostwin, hostwin_next); > } > > -static int vfio_host_win_del(VFIOContainer *container, > +static int vfio_host_win_del(VFIOSpaprContainer *scontainer, > hwaddr min_iova, hwaddr max_iova) > { > VFIOHostDMAWindow *hostwin; > > - QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) { > + QLIST_FOREACH(hostwin, &scontainer->hostwin_list, hostwin_next) { > if (hostwin->min_iova == min_iova && hostwin->max_iova == max_iova) { > QLIST_REMOVE(hostwin, hostwin_next); > g_free(hostwin); > @@ -192,7 +193,7 @@ static int vfio_host_win_del(VFIOContainer *container, > return -1; > } > > -static VFIOHostDMAWindow *vfio_find_hostwin(VFIOContainer *container, > +static VFIOHostDMAWindow *vfio_find_hostwin(VFIOSpaprContainer *container, > hwaddr iova, hwaddr end) > { > VFIOHostDMAWindow *hostwin; > @@ -329,6 +330,8 @@ vfio_spapr_container_add_section_window(VFIOContainerBase *bcontainer, > { > VFIOContainer *container = container_of(bcontainer, VFIOContainer, > bcontainer); > + VFIOSpaprContainer *scontainer = container_of(container, VFIOSpaprContainer, > + container); > VFIOHostDMAWindow *hostwin; > hwaddr pgsize = 0; > int ret; > @@ -344,7 +347,7 @@ vfio_spapr_container_add_section_window(VFIOContainerBase *bcontainer, > iova = section->offset_within_address_space; > end = iova + int128_get64(section->size) - 1; > > - if (!vfio_find_hostwin(container, iova, end)) { > + if (!vfio_find_hostwin(scontainer, iova, end)) { > error_setg(errp, "Container %p can't map guest IOVA region" > " 0x%"HWADDR_PRIx"..0x%"HWADDR_PRIx, container, > iova, end); > @@ -358,7 +361,7 @@ vfio_spapr_container_add_section_window(VFIOContainerBase *bcontainer, > } > > /* For now intersections are not allowed, we may relax this later */ > - QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) { > + QLIST_FOREACH(hostwin, &scontainer->hostwin_list, hostwin_next) { > if (ranges_overlap(hostwin->min_iova, > hostwin->max_iova - hostwin->min_iova + 1, > section->offset_within_address_space, > @@ -380,7 +383,7 @@ vfio_spapr_container_add_section_window(VFIOContainerBase *bcontainer, > return ret; > } > > - vfio_host_win_add(container, section->offset_within_address_space, > + vfio_host_win_add(scontainer, section->offset_within_address_space, > section->offset_within_address_space + > int128_get64(section->size) - 1, pgsize); > #ifdef CONFIG_KVM > @@ -419,6 +422,8 @@ vfio_spapr_container_del_section_window(VFIOContainerBase *bcontainer, > { > VFIOContainer *container = container_of(bcontainer, VFIOContainer, > bcontainer); > + VFIOSpaprContainer *scontainer = container_of(container, VFIOSpaprContainer, > + container); > > if (container->iommu_type != VFIO_SPAPR_TCE_v2_IOMMU) { > return; > @@ -426,7 +431,7 @@ vfio_spapr_container_del_section_window(VFIOContainerBase *bcontainer, > > vfio_spapr_remove_window(container, > section->offset_within_address_space); > - if (vfio_host_win_del(container, > + if (vfio_host_win_del(scontainer, > section->offset_within_address_space, > section->offset_within_address_space + > int128_get64(section->size) - 1) < 0) { > @@ -454,7 +459,7 @@ int vfio_spapr_container_init(VFIOContainer *container, Error **errp) > bool v2 = container->iommu_type == VFIO_SPAPR_TCE_v2_IOMMU; > int ret, fd = container->fd; > > - QLIST_INIT(&container->hostwin_list); > + QLIST_INIT(&scontainer->hostwin_list); > > /* > * The host kernel code implementing VFIO_IOMMU_DISABLE is called > @@ -506,7 +511,7 @@ int vfio_spapr_container_init(VFIOContainer *container, Error **errp) > } else { > /* The default table uses 4K pages */ > bcontainer->pgsizes = 0x1000; > - vfio_host_win_add(container, info.dma32_window_start, > + vfio_host_win_add(scontainer, info.dma32_window_start, > info.dma32_window_start + > info.dma32_window_size - 1, > 0x1000); > @@ -525,15 +530,14 @@ listener_unregister_exit: > > void vfio_spapr_container_deinit(VFIOContainer *container) > { > + VFIOSpaprContainer *scontainer = container_of(container, VFIOSpaprContainer, > + container); > VFIOHostDMAWindow *hostwin, *next; > > if (container->iommu_type == VFIO_SPAPR_TCE_v2_IOMMU) { > - VFIOSpaprContainer *scontainer = container_of(container, > - VFIOSpaprContainer, > - container); > memory_listener_unregister(&scontainer->prereg_listener); > } > - QLIST_FOREACH_SAFE(hostwin, &container->hostwin_list, hostwin_next, > + QLIST_FOREACH_SAFE(hostwin, &scontainer->hostwin_list, hostwin_next, > next) { > QLIST_REMOVE(hostwin, hostwin_next); > g_free(hostwin);
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index ed6148c058..24ecc0e7ee 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -79,7 +79,6 @@ typedef struct VFIOContainer { VFIOContainerBase bcontainer; int fd; /* /dev/vfio/vfio, empowered by the attached groups */ unsigned iommu_type; - QLIST_HEAD(, VFIOHostDMAWindow) hostwin_list; QLIST_HEAD(, VFIOGroup) group_list; } VFIOContainer; diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c index 68c3dd6c75..5c6426e697 100644 --- a/hw/vfio/spapr.c +++ b/hw/vfio/spapr.c @@ -27,6 +27,7 @@ typedef struct VFIOSpaprContainer { VFIOContainer container; MemoryListener prereg_listener; + QLIST_HEAD(, VFIOHostDMAWindow) hostwin_list; } VFIOSpaprContainer; static bool vfio_prereg_listener_skipped_section(MemoryRegionSection *section) @@ -154,12 +155,12 @@ static const MemoryListener vfio_prereg_listener = { .region_del = vfio_prereg_listener_region_del, }; -static void vfio_host_win_add(VFIOContainer *container, hwaddr min_iova, +static void vfio_host_win_add(VFIOSpaprContainer *scontainer, hwaddr min_iova, hwaddr max_iova, uint64_t iova_pgsizes) { VFIOHostDMAWindow *hostwin; - QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) { + QLIST_FOREACH(hostwin, &scontainer->hostwin_list, hostwin_next) { if (ranges_overlap(hostwin->min_iova, hostwin->max_iova - hostwin->min_iova + 1, min_iova, @@ -173,15 +174,15 @@ static void vfio_host_win_add(VFIOContainer *container, hwaddr min_iova, hostwin->min_iova = min_iova; hostwin->max_iova = max_iova; hostwin->iova_pgsizes = iova_pgsizes; - QLIST_INSERT_HEAD(&container->hostwin_list, hostwin, hostwin_next); + QLIST_INSERT_HEAD(&scontainer->hostwin_list, hostwin, hostwin_next); } -static int vfio_host_win_del(VFIOContainer *container, +static int vfio_host_win_del(VFIOSpaprContainer *scontainer, hwaddr min_iova, hwaddr max_iova) { VFIOHostDMAWindow *hostwin; - QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) { + QLIST_FOREACH(hostwin, &scontainer->hostwin_list, hostwin_next) { if (hostwin->min_iova == min_iova && hostwin->max_iova == max_iova) { QLIST_REMOVE(hostwin, hostwin_next); g_free(hostwin); @@ -192,7 +193,7 @@ static int vfio_host_win_del(VFIOContainer *container, return -1; } -static VFIOHostDMAWindow *vfio_find_hostwin(VFIOContainer *container, +static VFIOHostDMAWindow *vfio_find_hostwin(VFIOSpaprContainer *container, hwaddr iova, hwaddr end) { VFIOHostDMAWindow *hostwin; @@ -329,6 +330,8 @@ vfio_spapr_container_add_section_window(VFIOContainerBase *bcontainer, { VFIOContainer *container = container_of(bcontainer, VFIOContainer, bcontainer); + VFIOSpaprContainer *scontainer = container_of(container, VFIOSpaprContainer, + container); VFIOHostDMAWindow *hostwin; hwaddr pgsize = 0; int ret; @@ -344,7 +347,7 @@ vfio_spapr_container_add_section_window(VFIOContainerBase *bcontainer, iova = section->offset_within_address_space; end = iova + int128_get64(section->size) - 1; - if (!vfio_find_hostwin(container, iova, end)) { + if (!vfio_find_hostwin(scontainer, iova, end)) { error_setg(errp, "Container %p can't map guest IOVA region" " 0x%"HWADDR_PRIx"..0x%"HWADDR_PRIx, container, iova, end); @@ -358,7 +361,7 @@ vfio_spapr_container_add_section_window(VFIOContainerBase *bcontainer, } /* For now intersections are not allowed, we may relax this later */ - QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) { + QLIST_FOREACH(hostwin, &scontainer->hostwin_list, hostwin_next) { if (ranges_overlap(hostwin->min_iova, hostwin->max_iova - hostwin->min_iova + 1, section->offset_within_address_space, @@ -380,7 +383,7 @@ vfio_spapr_container_add_section_window(VFIOContainerBase *bcontainer, return ret; } - vfio_host_win_add(container, section->offset_within_address_space, + vfio_host_win_add(scontainer, section->offset_within_address_space, section->offset_within_address_space + int128_get64(section->size) - 1, pgsize); #ifdef CONFIG_KVM @@ -419,6 +422,8 @@ vfio_spapr_container_del_section_window(VFIOContainerBase *bcontainer, { VFIOContainer *container = container_of(bcontainer, VFIOContainer, bcontainer); + VFIOSpaprContainer *scontainer = container_of(container, VFIOSpaprContainer, + container); if (container->iommu_type != VFIO_SPAPR_TCE_v2_IOMMU) { return; @@ -426,7 +431,7 @@ vfio_spapr_container_del_section_window(VFIOContainerBase *bcontainer, vfio_spapr_remove_window(container, section->offset_within_address_space); - if (vfio_host_win_del(container, + if (vfio_host_win_del(scontainer, section->offset_within_address_space, section->offset_within_address_space + int128_get64(section->size) - 1) < 0) { @@ -454,7 +459,7 @@ int vfio_spapr_container_init(VFIOContainer *container, Error **errp) bool v2 = container->iommu_type == VFIO_SPAPR_TCE_v2_IOMMU; int ret, fd = container->fd; - QLIST_INIT(&container->hostwin_list); + QLIST_INIT(&scontainer->hostwin_list); /* * The host kernel code implementing VFIO_IOMMU_DISABLE is called @@ -506,7 +511,7 @@ int vfio_spapr_container_init(VFIOContainer *container, Error **errp) } else { /* The default table uses 4K pages */ bcontainer->pgsizes = 0x1000; - vfio_host_win_add(container, info.dma32_window_start, + vfio_host_win_add(scontainer, info.dma32_window_start, info.dma32_window_start + info.dma32_window_size - 1, 0x1000); @@ -525,15 +530,14 @@ listener_unregister_exit: void vfio_spapr_container_deinit(VFIOContainer *container) { + VFIOSpaprContainer *scontainer = container_of(container, VFIOSpaprContainer, + container); VFIOHostDMAWindow *hostwin, *next; if (container->iommu_type == VFIO_SPAPR_TCE_v2_IOMMU) { - VFIOSpaprContainer *scontainer = container_of(container, - VFIOSpaprContainer, - container); memory_listener_unregister(&scontainer->prereg_listener); } - QLIST_FOREACH_SAFE(hostwin, &container->hostwin_list, hostwin_next, + QLIST_FOREACH_SAFE(hostwin, &scontainer->hostwin_list, hostwin_next, next) { QLIST_REMOVE(hostwin, hostwin_next); g_free(hostwin);
No functional changes intended. Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> --- include/hw/vfio/vfio-common.h | 1 - hw/vfio/spapr.c | 36 +++++++++++++++++++---------------- 2 files changed, 20 insertions(+), 17 deletions(-)