On Thu, 7 Jan 2021 14:34:17 +0100 David Hildenbrand <da...@redhat.com> wrote:
> Let's query the maximum number of possible DMA mappings by querying the > available mappings when creating the container (before any mappings are > created). We'll use this informaton soon to perform some sanity checks > and warn the user. > > Cc: Paolo Bonzini <pbonz...@redhat.com> > Cc: "Michael S. Tsirkin" <m...@redhat.com> > Cc: Alex Williamson <alex.william...@redhat.com> > Cc: Dr. David Alan Gilbert <dgilb...@redhat.com> > Cc: Igor Mammedov <imamm...@redhat.com> > Cc: Pankaj Gupta <pankaj.gupta.li...@gmail.com> > Cc: Peter Xu <pet...@redhat.com> > Cc: Auger Eric <eric.au...@redhat.com> > Cc: Wei Yang <richard.weiy...@linux.alibaba.com> > Cc: teawater <teawat...@linux.alibaba.com> > Cc: Marek Kedzierski <mkedz...@redhat.com> > Signed-off-by: David Hildenbrand <da...@redhat.com> > --- > hw/vfio/common.c | 4 ++++ > include/hw/vfio/vfio-common.h | 1 + > 2 files changed, 5 insertions(+) > > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 2bd219cf1d..1babb6bb99 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -1934,6 +1934,7 @@ static int vfio_connect_container(VFIOGroup *group, > AddressSpace *as, > container->fd = fd; > container->error = NULL; > container->dirty_pages_supported = false; > + container->dma_max_mappings = 0; > QLIST_INIT(&container->giommu_list); > QLIST_INIT(&container->hostwin_list); > QLIST_INIT(&container->vrdl_list); > @@ -1965,7 +1966,10 @@ static int vfio_connect_container(VFIOGroup *group, > AddressSpace *as, > vfio_host_win_add(container, 0, (hwaddr)-1, info->iova_pgsizes); > container->pgsizes = info->iova_pgsizes; > > + /* The default in the kernel ("dma_entry_limit") is 65535. */ > + container->dma_max_mappings = 65535; > if (!ret) { > + vfio_get_info_dma_avail(info, &container->dma_max_mappings); > vfio_get_iommu_info_migration(container, info); > } > g_free(info); > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index af6f8d1b22..4b28c6e8ac 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -88,6 +88,7 @@ typedef struct VFIOContainer { > uint64_t dirty_pgsizes; > uint64_t max_dirty_bitmap_size; > unsigned long pgsizes; > + unsigned int dma_max_mappings; > QLIST_HEAD(, VFIOGuestIOMMU) giommu_list; > QLIST_HEAD(, VFIOHostDMAWindow) hostwin_list; > QLIST_HEAD(, VFIOGroup) group_list; Reviewed-by: Alex Williamson <alex.william...@redhat.com> Acked-by: Alex Williamson <alex.william...@redhat.com>