[prev in list] [next in list] [prev in thread] [next in thread]
List: kvm
Subject: [RFC PATCH 3/6] vfio: Extend iommu-info to return MSIs automap state
From: Bharat Bhushan <Bharat.Bhushan () freescale ! com>
Date: 2015-09-30 9:37:55
Message-ID: 1443624989-24346-3-git-send-email-Bharat.Bhushan () freescale ! com
[Download RAW message or body]
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@freescale.com>
---
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@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic