[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/iommu: switch the hwdom mapping function to use page_get_type
commit 6bf0be5af852f2317b75ab94f1d2bb045ebef452 Author: Roger Pau Monné <roger.pau@xxxxxxxxxx> AuthorDate: Fri Sep 7 11:08:00 2018 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Wed Sep 12 16:32:58 2018 +0200 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> --- 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); -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |