|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v8 5/6] x86/iommu: switch the hwdom mapping function to use page_get_type
This avoids repeated calls to page_is_ram_type which improves
performance and makes the code easier to read.
Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
Changes since v7:
- Switch to use mfn_t with page_get_ram_type.
Changes since v4:
- New in this version.
---
Cc: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/drivers/passthrough/x86/iommu.c | 62 ++++++++++++++++-------------
1 file changed, 34 insertions(+), 28 deletions(-)
diff --git a/xen/drivers/passthrough/x86/iommu.c
b/xen/drivers/passthrough/x86/iommu.c
index 25e1ebf8b3..5809027573 100644
--- a/xen/drivers/passthrough/x86/iommu.c
+++ b/xen/drivers/passthrough/x86/iommu.c
@@ -134,6 +134,39 @@ void arch_iommu_domain_destroy(struct domain *d)
{
}
+static bool __hwdom_init hwdom_iommu_map(const struct domain *d,
+ unsigned long pfn,
+ unsigned long max_pfn)
+{
+ mfn_t mfn = _mfn(pfn);
+
+ /*
+ * Set up 1:1 mapping for dom0. Default to include only conventional RAM
+ * areas and let RMRRs include needed reserved regions. When set, the
+ * inclusive mapping additionally maps in every pfn up to 4GB except those
+ * that fall in unusable ranges.
+ */
+ if ( (pfn > max_pfn && !mfn_valid(mfn)) || xen_in_range(pfn) )
+ return false;
+
+ switch ( page_get_ram_type(mfn) )
+ {
+ case RAM_TYPE_UNUSABLE:
+ return false;
+
+ case RAM_TYPE_CONVENTIONAL:
+ if ( iommu_hwdom_strict )
+ return false;
+ break;
+
+ default:
+ if ( !iommu_hwdom_inclusive || pfn > max_pfn )
+ return false;
+ }
+
+ return true;
+}
+
void __hwdom_init arch_iommu_hwdom_init(struct domain *d)
{
unsigned long i, top, max_pfn;
@@ -149,36 +182,9 @@ void __hwdom_init arch_iommu_hwdom_init(struct domain *d)
for ( i = 0; i < top; i++ )
{
unsigned long pfn = pdx_to_pfn(i);
- bool map;
int rc;
- /*
- * Set up 1:1 mapping for dom0. Default to include only
- * conventional RAM areas and let RMRRs include needed reserved
- * regions. When set, the inclusive mapping additionally maps in
- * every pfn up to 4GB except those that fall in unusable ranges.
- */
- if ( pfn > max_pfn && !mfn_valid(_mfn(pfn)) )
- continue;
-
- if ( iommu_hwdom_inclusive && pfn <= max_pfn )
- map = !page_is_ram_type(pfn, RAM_TYPE_UNUSABLE);
- else
- map = page_is_ram_type(pfn, RAM_TYPE_CONVENTIONAL);
-
- if ( !map )
- continue;
-
- /* Exclude Xen bits */
- if ( xen_in_range(pfn) )
- continue;
-
- /*
- * If dom0-strict mode is enabled then exclude conventional RAM
- * and let the common code map dom0's pages.
- */
- if ( iommu_hwdom_strict &&
- page_is_ram_type(pfn, RAM_TYPE_CONVENTIONAL) )
+ if ( !hwdom_iommu_map(d, pfn, max_pfn) )
continue;
rc = iommu_map_page(d, pfn, pfn, IOMMUF_readable|IOMMUF_writable);
--
2.18.0
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |