[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/iommu: remove usage of {set/clear}_identity_p2m_entry against PV domains
On 02.08.2019 11:22, Roger Pau Monne wrote: > Switch rmrr_identity_mapping to use iommu_{un}map in order to > establish RMRR mappings for PV domains, like it's done in > arch_iommu_hwdom_init. This solves the issue of a PV hardware domain > not getting RMRR mappings because {set/clear}_identity_p2m_entry was > not properly updating the iommu page tables. In which was this was not happening properly is still not really understood, yet I think this (or at least a plausible theory) is a prereq for any kind of fix. The code paths for PV and HVM are probably different enough such that we don't need to be afraid of there being a similar problem on the HVM side, but what if there's a more general problem that we would better take care of, rather perhaps than getting into a similarly puzzling situation again later on. > As rmrr_identity_mapping was the last user of > {set/clear}_identity_p2m_entry against PV domains modify the function > so it's only usable against translated domains, as the other p2m > related functions. Looking at the resulting code I'm actually not convinced that this is a good move. I would, however, specifically like to hear George's opinion here. > @@ -1995,13 +1996,20 @@ static int rmrr_identity_mapping(struct domain *d, > bool_t map, > > while ( base_pfn < end_pfn ) > { > - if ( clear_identity_p2m_entry(d, base_pfn) ) > - ret = -ENXIO; > + if ( paging_mode_translate(d) ) > + ret = clear_identity_p2m_entry(d, base_pfn); > + else > + ret = iommu_unmap(d, _dfn(base_pfn), PAGE_ORDER_4K, > + &flush_flags); > base_pfn++; > } > > list_del(&mrmrr->list); > xfree(mrmrr); > + /* Keep the previous error code if there's one. */ > + err = iommu_iotlb_flush_all(d, flush_flags); > + if ( !ret ) > + ret = err; > return ret; > } > } > @@ -2011,8 +2019,13 @@ static int rmrr_identity_mapping(struct domain *d, > bool_t map, > > while ( base_pfn < end_pfn ) > { > - int err = set_identity_p2m_entry(d, base_pfn, p2m_access_rw, flag); > + int err; > > + if ( paging_mode_translate(d) ) > + err = set_identity_p2m_entry(d, base_pfn, p2m_access_rw, flag); > + else > + err = iommu_map(d, _dfn(base_pfn), _mfn(base_pfn), PAGE_ORDER_4K, > + IOMMUF_readable | IOMMUF_writable, &flush_flags); > if ( err ) > return err; > base_pfn++; > @@ -2026,7 +2039,7 @@ static int rmrr_identity_mapping(struct domain *d, > bool_t map, > mrmrr->count = 1; > list_add_tail(&mrmrr->list, &hd->arch.mapped_rmrrs); > > - return 0; > + return iommu_iotlb_flush_all(d, flush_flags); This is VT-d code - is there a particular reason why you go through the generic code wrappers everywhere here? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |