On 10/26/23 12:30, Zhenzhong Duan wrote:
> Only spapr supports a customed host window list, other vfio driver
> assume 64bit host window. So remove the check in listener callback
> and move vfio_host_win_add/del into spapr.c and make static.
>
> Suggested-by: Alex Williamson <alex.williamson@redhat.com>
> 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 | 5 ---
> hw/vfio/common.c | 64 -----------------------------------
> hw/vfio/container.c | 16 ---------
> hw/vfio/spapr.c | 38 +++++++++++++++++++++
> 4 files changed, 38 insertions(+), 85 deletions(-)
>
> diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
> index f3174b3c5c..b9c7a7e588 100644
> --- a/include/hw/vfio/vfio-common.h
> +++ b/include/hw/vfio/vfio-common.h
> @@ -207,11 +207,6 @@ typedef struct {
> hwaddr pages;
> } VFIOBitmap;
>
> -void vfio_host_win_add(VFIOContainer *container,
> - hwaddr min_iova, hwaddr max_iova,
> - uint64_t iova_pgsizes);
> -int vfio_host_win_del(VFIOContainer *container, hwaddr min_iova,
> - hwaddr max_iova);
> VFIOAddressSpace *vfio_get_address_space(AddressSpace *as);
> void vfio_put_address_space(VFIOAddressSpace *space);
> bool vfio_devices_all_running_and_saving(VFIOContainer *container);
> diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> index e72055e752..0ebf4d9256 100644
> --- a/hw/vfio/common.c
> +++ b/hw/vfio/common.c
> @@ -245,44 +245,6 @@ bool vfio_devices_all_running_and_mig_active(VFIOContainer *container)
> return true;
> }
>
> -void vfio_host_win_add(VFIOContainer *container, hwaddr min_iova,
> - hwaddr max_iova, uint64_t iova_pgsizes)
> -{
> - VFIOHostDMAWindow *hostwin;
> -
> - QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) {
> - if (ranges_overlap(hostwin->min_iova,
> - hostwin->max_iova - hostwin->min_iova + 1,
> - min_iova,
> - max_iova - min_iova + 1)) {
> - hw_error("%s: Overlapped IOMMU are not enabled", __func__);
> - }
> - }
> -
> - hostwin = g_malloc0(sizeof(*hostwin));
> -
> - hostwin->min_iova = min_iova;
> - hostwin->max_iova = max_iova;
> - hostwin->iova_pgsizes = iova_pgsizes;
> - QLIST_INSERT_HEAD(&container->hostwin_list, hostwin, hostwin_next);
> -}
> -
> -int vfio_host_win_del(VFIOContainer *container,
> - hwaddr min_iova, hwaddr max_iova)
> -{
> - VFIOHostDMAWindow *hostwin;
> -
> - QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) {
> - if (hostwin->min_iova == min_iova && hostwin->max_iova == max_iova) {
> - QLIST_REMOVE(hostwin, hostwin_next);
> - g_free(hostwin);
> - return 0;
> - }
> - }
> -
> - return -1;
> -}
> -
> static bool vfio_listener_skipped_section(MemoryRegionSection *section)
> {
> return (!memory_region_is_ram(section->mr) &&
> @@ -531,22 +493,6 @@ static void vfio_unregister_ram_discard_listener(VFIOContainer *container,
> g_free(vrdl);
> }
>
> -static VFIOHostDMAWindow *vfio_find_hostwin(VFIOContainer *container,
> - hwaddr iova, hwaddr end)
> -{
> - VFIOHostDMAWindow *hostwin;
> - bool hostwin_found = false;
> -
> - QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) {
> - if (hostwin->min_iova <= iova && end <= hostwin->max_iova) {
> - hostwin_found = true;
> - break;
> - }
> - }
> -
> - return hostwin_found ? hostwin : NULL;
> -}
> -
> static bool vfio_known_safe_misalignment(MemoryRegionSection *section)
> {
> MemoryRegion *mr = section->mr;
> @@ -647,13 +593,6 @@ static void vfio_listener_region_add(MemoryListener *listener,
> goto fail;
> }
>
> - hostwin = vfio_find_hostwin(container, iova, end);
> - if (!hostwin) {
> - error_setg(&err, "Container %p can't map guest IOVA region"
> - " 0x%"HWADDR_PRIx"..0x%"HWADDR_PRIx, container, iova, end);
> - goto fail;
> - }
> -
> memory_region_ref(section->mr);
>
> if (memory_region_is_iommu(section->mr)) {
> @@ -835,9 +774,6 @@ static void vfio_listener_region_del(MemoryListener *listener,
> hwaddr pgmask;
> VFIOHostDMAWindow *hostwin;
>
> - hostwin = vfio_find_hostwin(container, iova, end);
> - assert(hostwin); /* or region_add() would have failed */
> -
> pgmask = (1ULL << ctz64(hostwin->iova_pgsizes)) - 1;
> try_unmap = !((iova & pgmask) || (int128_get64(llsize) & pgmask));
> } else if (memory_region_has_ram_discard_manager(section->mr)) {
> diff --git a/hw/vfio/container.c b/hw/vfio/container.c
> index 204b244b11..242010036a 100644
> --- a/hw/vfio/container.c
> +++ b/hw/vfio/container.c
> @@ -551,7 +551,6 @@ static int vfio_connect_container(VFIOGroup *group, AddressSpace *as,
> container->dma_max_mappings = 0;
> container->iova_ranges = NULL;
> QLIST_INIT(&container->giommu_list);
> - QLIST_INIT(&container->hostwin_list);
> QLIST_INIT(&container->vrdl_list);
>
> ret = vfio_init_container(container, group->fd, errp);
> @@ -591,14 +590,6 @@ static int vfio_connect_container(VFIOGroup *group, AddressSpace *as,
>
> vfio_get_iommu_info_migration(container, info);
> g_free(info);
> -
> - /*
> - * FIXME: We should parse VFIO_IOMMU_TYPE1_INFO_CAP_IOVA_RANGE
> - * information to get the actual window extent rather than assume
> - * a 64-bit IOVA address space.
> - */
> - vfio_host_win_add(container, 0, (hwaddr)-1, container->pgsizes);
> -
> break;
> }
> case VFIO_SPAPR_TCE_v2_IOMMU:
> @@ -687,7 +678,6 @@ static void vfio_disconnect_container(VFIOGroup *group)
> if (QLIST_EMPTY(&container->group_list)) {
> VFIOAddressSpace *space = container->space;
> VFIOGuestIOMMU *giommu, *tmp;
> - VFIOHostDMAWindow *hostwin, *next;
>
> QLIST_REMOVE(container, next);
>
> @@ -698,12 +688,6 @@ static void vfio_disconnect_container(VFIOGroup *group)
> g_free(giommu);
> }
>
> - QLIST_FOREACH_SAFE(hostwin, &container->hostwin_list, hostwin_next,
> - next) {
> - QLIST_REMOVE(hostwin, hostwin_next);
> - g_free(hostwin);
> - }
> -
> trace_vfio_disconnect_container(container->fd);
> close(container->fd);
> vfio_free_container(container);
> diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c
> index 43adbdb7b3..3495737ab2 100644
> --- a/hw/vfio/spapr.c
> +++ b/hw/vfio/spapr.c
> @@ -146,6 +146,44 @@ static const MemoryListener vfio_prereg_listener = {
> .region_del = vfio_prereg_listener_region_del,
> };
>
> +static void vfio_host_win_add(VFIOContainer *container, hwaddr min_iova,
> + hwaddr max_iova, uint64_t iova_pgsizes)
> +{
> + VFIOHostDMAWindow *hostwin;
> +
> + QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) {
> + if (ranges_overlap(hostwin->min_iova,
> + hostwin->max_iova - hostwin->min_iova + 1,
> + min_iova,
> + max_iova - min_iova + 1)) {
> + hw_error("%s: Overlapped IOMMU are not enabled", __func__);
> + }
> + }
> +
> + hostwin = g_malloc0(sizeof(*hostwin));
> +
> + hostwin->min_iova = min_iova;
> + hostwin->max_iova = max_iova;
> + hostwin->iova_pgsizes = iova_pgsizes;
> + QLIST_INSERT_HEAD(&container->hostwin_list, hostwin, hostwin_next);
> +}
> +
> +static int vfio_host_win_del(VFIOContainer *container,
> + hwaddr min_iova, hwaddr max_iova)
> +{
> + VFIOHostDMAWindow *hostwin;
> +
> + QLIST_FOREACH(hostwin, &container->hostwin_list, hostwin_next) {
> + if (hostwin->min_iova == min_iova && hostwin->max_iova == max_iova) {
> + QLIST_REMOVE(hostwin, hostwin_next);
> + g_free(hostwin);
> + return 0;
> + }
> + }
> +
> + return -1;
> +}
> +
> static int vfio_spapr_remove_window(VFIOContainer *container,
> hwaddr offset_within_address_space)
> {