> + down_read(&ioas->iopt.iova_rwsem); > + info.flags = VFIO_IOMMU_INFO_PGSIZES; > + info.iova_pgsizes = iommufd_get_pagesizes(ioas); > + info.cap_offset = 0; The iommufd_get_pagesizes() obtains the domains_rwsem and cannot be called under the iova_rwsem due to lock odering. The test suite already covers this, but it turns out my test environment had lockdep disabled since it hits a Intel iommu lockdep splat on boot starting in v6.1-rc1 :\ Syzkaller found it because it runs the VM with different options and avoids the boot splat. @@ -371,11 +371,11 @@ static int iommufd_vfio_iommu_get_info(struct iommufd_ctx *ictx, if (IS_ERR(ioas)) return PTR_ERR(ioas); - down_read(&ioas->iopt.iova_rwsem); info.flags = VFIO_IOMMU_INFO_PGSIZES; info.iova_pgsizes = iommufd_get_pagesizes(ioas); info.cap_offset = 0; + down_read(&ioas->iopt.iova_rwsem); total_cap_size = sizeof(info); for (i = 0; i != ARRAY_SIZE(fill_fns); i++) { int cap_size; Jason