@@ -506,6 +506,7 @@ static void vfio_listener_region_add(MemoryListener *listener,
if (memory_region_is_iommu(section->mr)) {
VFIOGuestIOMMU *giommu;
IOMMUMemoryRegion *iommu_mr = IOMMU_MEMORY_REGION(section->mr);
+ IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_GET_CLASS(iommu_mr);
trace_vfio_listener_region_add_iommu(iova, end);
/*
@@ -526,6 +527,9 @@ static void vfio_listener_region_add(MemoryListener *listener,
IOMMU_NOTIFIER_ALL,
section->offset_within_region,
int128_get64(llend));
+ if (imrc->set_page_size_mask) {
+ imrc->set_page_size_mask(iommu_mr, container->page_size_mask);
+ }
QLIST_INSERT_HEAD(&container->giommu_list, giommu, giommu_next);
memory_region_register_iommu_notifier(section->mr, &giommu->n);
@@ -1053,6 +1057,7 @@ static int vfio_connect_container(VFIOGroup *group, AddressSpace *as,
/* Assume 4k IOVA page size */
info.iova_pgsizes = 4096;
}
+ container->page_size_mask = info.iova_pgsizes;
vfio_host_win_add(container, 0, (hwaddr)-1, info.iova_pgsizes);
} else if (ioctl(fd, VFIO_CHECK_EXTENSION, VFIO_SPAPR_TCE_IOMMU) ||
ioctl(fd, VFIO_CHECK_EXTENSION, VFIO_SPAPR_TCE_v2_IOMMU)) {
@@ -79,6 +79,7 @@ typedef struct VFIOContainer {
int fd; /* /dev/vfio/vfio, empowered by the attached groups */
MemoryListener listener;
MemoryListener prereg_listener;
+ uint64_t page_size_mask; /* page sizes supported for this container */
unsigned iommu_type;
int error;
bool initialized;
We store the page_size_mask in the container and on vfio_listener_region_add(), the information is conveyed to the IOMMUMemoryRegion. Signed-off-by: Eric Auger <eric.auger@redhat.com> --- hw/vfio/common.c | 5 +++++ include/hw/vfio/vfio-common.h | 1 + 2 files changed, 6 insertions(+)