[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 09/30] x86/vtd: fix and simplify mapping RMRR regions
>>> On 27.09.16 at 17:57, <roger.pau@xxxxxxxxxx> wrote: > The current code used by Intel VTd will only map RMRR regions for the > hardware domain, but will fail to map RMRR regions for unprivileged domains > unless the page tables are shared between EPT and IOMMU. Okay, if that's the case it surely should get fixed. > Fix this and > simplify the code, removing the {set/clear}_identity_p2m_entry helpers and > just using the normal MMIO mapping functions. This simplification, however, goes too far. Namely ... > -int set_identity_p2m_entry(struct domain *d, unsigned long gfn, > - p2m_access_t p2ma, unsigned int flag) > -{ > - p2m_type_t p2mt; > - p2m_access_t a; > - mfn_t mfn; > - struct p2m_domain *p2m = p2m_get_hostp2m(d); > - int ret; > - > - if ( !paging_mode_translate(p2m->domain) ) > - { > - if ( !need_iommu(d) ) > - return 0; > - return iommu_map_page(d, gfn, gfn, IOMMUF_readable|IOMMUF_writable); > - } > - > - gfn_lock(p2m, gfn, 0); > - > - mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, 0, NULL, NULL); > - > - if ( p2mt == p2m_invalid || p2mt == p2m_mmio_dm ) > - ret = p2m_set_entry(p2m, gfn, _mfn(gfn), PAGE_ORDER_4K, > - p2m_mmio_direct, p2ma); > - else if ( mfn_x(mfn) == gfn && p2mt == p2m_mmio_direct && a == p2ma ) > - { > - ret = 0; > - /* > - * PVH fixme: during Dom0 PVH construction, p2m entries are being set > - * but iomem regions are not mapped with IOMMU. This makes sure that > - * RMRRs are correctly mapped with IOMMU. > - */ > - if ( is_hardware_domain(d) && !iommu_use_hap_pt(d) ) > - ret = iommu_map_page(d, gfn, gfn, > IOMMUF_readable|IOMMUF_writable); > - } > - else > - { > - if ( flag & XEN_DOMCTL_DEV_RDM_RELAXED ) > - ret = 0; > - else > - ret = -EBUSY; > - printk(XENLOG_G_WARNING > - "Cannot setup identity map d%d:%lx," > - " gfn already mapped to %lx.\n", > - d->domain_id, gfn, mfn_x(mfn)); ... this logic (and its clear side counterpart) should not be removed without replacement. Note in this context how you render "flag" an unused parameter of rmrr_identity_mapping(). > --- a/xen/include/xen/p2m-common.h > +++ b/xen/include/xen/p2m-common.h > @@ -2,6 +2,7 @@ > #define _XEN_P2M_COMMON_H > > #include <public/vm_event.h> > +#include <xen/softirq.h> > > /* > * Additional access types, which are used to further restrict > @@ -46,6 +47,35 @@ int unmap_mmio_regions(struct domain *d, > mfn_t mfn); > > /* > + * Preemptive Helper for mapping/unmapping MMIO regions. > + */ Single line comment. > +static inline int modify_mmio_11(struct domain *d, unsigned long pfn, > + unsigned long nr_pages, bool map) Why do you make this an inline function? And I have to admit that I dislike this strange use of number 11 - what's wrong with continuing to use the term "direct map" in one way or another? > +{ > + int rc; > + > + while ( nr_pages > 0 ) > + { > + rc = (map ? map_mmio_regions : unmap_mmio_regions) > + (d, _gfn(pfn), nr_pages, _mfn(pfn)); > + if ( rc == 0 ) > + break; > + if ( rc < 0 ) > + { > + printk(XENLOG_ERR > + "Failed to %smap %#lx - %#lx into domain %d memory map: > %d\n", "Failed to identity %smap [%#lx,%#lx) for d%d: %d\n" And I think XENLOG_WARNING would do - whether this actually is a problem depends on further factors. > + map ? "" : "un", pfn, pfn + nr_pages, d->domain_id, rc); > + return rc; > + } > + nr_pages -= rc; > + pfn += rc; > + process_pending_softirqs(); Is this what you call "preemptive"? > + } > + > + return rc; The way this is coded it appears to possibly return non-zero even in success case. I think this would therefore better be a for ( ; ; ) loop. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |