[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3] IOMMU/x86: make page type checks consistent when mapping pages
On 06.09.2019 11:37, Roger Pau Monné wrote: > On Wed, Jul 03, 2019 at 12:18:45PM +0000, Jan Beulich wrote: >> --- a/xen/arch/x86/mm/p2m.c >> +++ b/xen/arch/x86/mm/p2m.c >> @@ -829,13 +829,13 @@ guest_physmap_add_page(struct domain *d, >> * >> * Retain this property by grabbing a writable type ref and then >> * dropping it immediately. The result will be pages that have a >> - * writable type (and an IOMMU entry), but a count of 0 (such that >> - * any guest-requested type changes succeed and remove the IOMMU >> - * entry). >> + * writable type (and an IOMMU entry if necessary), but a count of 0 >> + * (such that any guest-requested type changes succeed and remove >> the >> + * IOMMU entry). >> */ >> for ( i = 0; i < (1UL << page_order); ++i, ++page ) >> { >> - if ( !need_iommu_pt_sync(d) ) >> + if ( !iommu_enabled ) > > That's kind of a strong check for a domain that might never use the > iommu at all. Isn't it fine to just rely on > arch_iommu_populate_page_table finding non-writable pages and thus not > adding them to the iommu page-tables? No - the code change here is to take care of page additions to the domain after it has booted. >> --- a/xen/drivers/passthrough/iommu.c >> +++ b/xen/drivers/passthrough/iommu.c >> @@ -192,28 +192,46 @@ void __hwdom_init iommu_hwdom_init(struc >> unsigned int i = 0, flush_flags = 0; >> int rc = 0; >> >> + this_cpu(iommu_dont_flush_iotlb) = true; >> + >> page_list_for_each ( page, &d->page_list ) >> { >> - unsigned long mfn = mfn_x(page_to_mfn(page)); >> - unsigned long dfn = mfn_to_gmfn(d, mfn); >> - unsigned int mapping = IOMMUF_readable; >> - int ret; >> - >> - if ( ((page->u.inuse.type_info & PGT_count_mask) == 0) || >> - ((page->u.inuse.type_info & PGT_type_mask) >> - == PGT_writable_page) ) >> - mapping |= IOMMUF_writable; >> - >> - ret = iommu_map(d, _dfn(dfn), _mfn(mfn), 0, mapping, >> - &flush_flags); >> - >> - if ( !rc ) >> - rc = ret; >> + switch ( page->u.inuse.type_info & PGT_type_mask ) >> + { >> + case PGT_none: >> + if ( is_pv_domain(d) ) >> + { >> + ASSERT(!(page->u.inuse.type_info & PGT_count_mask)); >> + if ( get_page_and_type(page, d, PGT_writable_page) ) > > Could you add a comment that get_page_and_type will add an iommu > entry if succeeding? Well, yes, I could, but this would just re-state what the respective section of the big comment at the top of mm.c effectively says. Anyway - as long as Paul's "remove late (on-demand) construction of IOMMU page tables" would go in any time soon, this will all become unnecessary anyway. >> + { >> + put_page_and_type(page); >> + flush_flags |= IOMMUF_readable | IOMMUF_writable; >> + } >> + else if ( !rc ) >> + rc = -EBUSY; > > Is it fine to return an error here? AFAICT you could have a RO page > shared with Xen with PGT_none, and not having an iommu mapping for it > would be expected, hence returning an error seems wrong? No, pages shared with Xen don't live on d->page_list (which is what the loop iterates over). 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 |