[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 07/18] IOMMU/x86: perform PV Dom0 mappings in batches
On Fri, Dec 10, 2021 at 12:41:31PM +0100, Jan Beulich wrote: > On 10.12.2021 10:36, Roger Pau Monné wrote: > > On Fri, Dec 03, 2021 at 01:38:48PM +0100, Jan Beulich wrote: > >> On 02.12.2021 15:10, Roger Pau Monné wrote: > >>> On Fri, Sep 24, 2021 at 11:47:41AM +0200, Jan Beulich wrote: > >>>> @@ -720,6 +795,17 @@ int __init dom0_construct_pv(struct doma > >>>> /* Pages that are part of page tables must be read only. */ > >>>> mark_pv_pt_pages_rdonly(d, l4start, vpt_start, nr_pt_pages); > >>>> > >>>> + /* > >>>> + * This needs to come after all potentially excess > >>>> + * get_page_and_type(..., PGT_writable_page) invocations; see the > >>>> loop a > >>>> + * few lines further up, where the effect of calling that function > >>>> in an > >>>> + * earlier loop iteration may get overwritten by a later one. > >>>> + */ > >>>> + if ( need_iommu_pt_sync(d) && > >>>> + iommu_unmap(d, _dfn(PFN_DOWN(mpt_alloc) - nr_pt_pages), > >>>> nr_pt_pages, > >>>> + &flush_flags) ) > >>>> + BUG(); > >>> > >>> Wouldn't such unmap better happen as part of changing the types of the > >>> pages that become part of the guest page tables? > >> > >> Not sure - it's a single call here, but would be a call per page when > >> e.g. moved into mark_pv_pt_pages_rdonly(). > > > > I see. So this would result in multiple calls when moved, plus all the > > involved page shattering and aggregation logic. Overall it would be > > less error prone, as the iommu unmap would happen next to the type > > change, but I'm not going to insist if you think it's not worth it. > > The page table structure pages shouldn't be that many anyway? > > Typically it wouldn't be that many, true. I'm not sure about "less > error prone", though: We'd have more problems if the range unmapped > here wasn't properly representing the set of page tables used. I have to admit I'm biased regarding the PV dom0 building code because I find it utterly hard to follow, so IMO pairing the unmap call with the code that marks the pages as read-only seemed less error prone and less likely to go out of sync with regards to future changes. That said, if you still feel it's better to do it in a block here I won't argue anymore. > >>>> @@ -372,16 +372,30 @@ void __hwdom_init arch_iommu_hwdom_init( > >>>> perms & IOMMUF_writable ? > >>>> p2m_access_rw > >>>> : > >>>> p2m_access_r, > >>>> 0); > >>>> + else if ( pfn != start + count || perms != start_perms ) > >>>> + { > >>>> + commit: > >>>> + rc = iommu_map(d, _dfn(start), _mfn(start), count, > >>>> + start_perms, &flush_flags); > >>>> + SWAP(start, pfn); > >>>> + start_perms = perms; > >>>> + count = 1; > >>>> + } > >>>> else > >>>> - rc = iommu_map(d, _dfn(pfn), _mfn(pfn), 1ul << > >>>> PAGE_ORDER_4K, > >>>> - perms, &flush_flags); > >>>> + { > >>>> + ++count; > >>>> + rc = 0; > >>>> + } > >>>> > >>>> if ( rc ) > >>>> printk(XENLOG_WARNING "%pd: identity %smapping of %lx > >>>> failed: %d\n", > >>>> d, !paging_mode_translate(d) ? "IOMMU " : "", pfn, > >>>> rc); > >>> > >>> Would be nice to print the count (or end pfn) in case it's a range. > >> > >> I can do so if you think it's worth further extra code. I can't use > >> "count" here in particular, as that was updated already (in context > >> above). The most reasonable change towards this would perhaps be to > >> duplicate the printk() into both the "if()" and the "else if()" bodies. > > > > Maybe. The current message gives the impression that a single pfn has > > been added and failed, but without printing the range that failed the > > message will not be that helpful in diagnosing further issues that > > might arise due to the mapping failure. > > I guess I'll make the change then. I'm still not really convinced though, > as the presence of the message should be far more concerning than whether > it's a single page or a range. As middle ground, would > > printk(XENLOG_WARNING "%pd: identity %smapping of %lx... failed: > %d\n", > > be indicative enough of this perhaps not having been just a single page? Let's go with that last suggestion then. I would like to attempt to simplify part of the logic here, at which point it might be easier to print a unified message for both the translated and non-translated guests. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |