This patch allows the user-space to know whether msi-pages are automatically mapped with some magic iova or not. Even if the msi-pages are automatically mapped, still user-space wants to over-ride the automatic iova selection for msi-mapping. For this user-space need to know whether it is allowed to change the automatic mapping or not and this API provides this mechanism. Follow up patches will provide how to over-ride this. Signed-off-by: Bharat Bhushan <Bharat.Bhushan@xxxxxxxxxxxxx> --- drivers/vfio/vfio_iommu_type1.c | 32 ++++++++++++++++++++++++++++++++ include/uapi/linux/vfio.h | 3 +++ 2 files changed, 35 insertions(+) diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index fa5d3e4..3315fb6 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c @@ -59,6 +59,7 @@ struct vfio_iommu { struct rb_root dma_list; bool v2; bool nesting; + bool allow_msi_reconfig; struct list_head reserved_iova_list; }; @@ -1117,6 +1118,23 @@ static int vfio_domains_have_iommu_cache(struct vfio_iommu *iommu) return ret; } +static +int vfio_domains_get_msi_maps(struct vfio_iommu *iommu, + struct iommu_domain_msi_maps *msi_maps) +{ + struct vfio_domain *d; + int ret; + + mutex_lock(&iommu->lock); + /* All domains have same msi-automap property, pick first */ + d = list_first_entry(&iommu->domain_list, struct vfio_domain, next); + ret = iommu_domain_get_attr(d->domain, DOMAIN_ATTR_MSI_MAPPING, + msi_maps); + mutex_unlock(&iommu->lock); + + return ret; +} + static long vfio_iommu_type1_ioctl(void *iommu_data, unsigned int cmd, unsigned long arg) { @@ -1138,6 +1156,8 @@ static long vfio_iommu_type1_ioctl(void *iommu_data, } } else if (cmd == VFIO_IOMMU_GET_INFO) { struct vfio_iommu_type1_info info; + struct iommu_domain_msi_maps msi_maps; + int ret; minsz = offsetofend(struct vfio_iommu_type1_info, iova_pgsizes); @@ -1149,6 +1169,18 @@ static long vfio_iommu_type1_ioctl(void *iommu_data, info.flags = 0; + ret = vfio_domains_get_msi_maps(iommu, &msi_maps); + if (ret) + return ret; + + if (msi_maps.override_automap) { + info.flags |= VFIO_IOMMU_INFO_MSI_ALLOW_RECONFIG; + iommu->allow_msi_reconfig = true; + } + + if (msi_maps.automap) + info.flags |= VFIO_IOMMU_INFO_MSI_AUTOMAP; + info.iova_pgsizes = vfio_pgsize_bitmap(iommu); return copy_to_user((void __user *)arg, &info, minsz); diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 1abd1a9..9998f6e 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -391,6 +391,9 @@ struct vfio_iommu_type1_info { __u32 argsz; __u32 flags; #define VFIO_IOMMU_INFO_PGSIZES (1 << 0) /* supported page sizes info */ +#define VFIO_IOMMU_INFO_MSI_AUTOMAP (1 << 1) /* MSI pages are auto-mapped + in iommu */ +#define VFIO_IOMMU_INFO_MSI_ALLOW_RECONFIG (1 << 2) /* Allows reconfig automap*/ __u64 iova_pgsizes; /* Bitmap of supported page sizes */ }; -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html