|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 03/11] IOMMU/MMU: enhance the call trees of IOMMU unmapping and mapping
On April 25, 2016 5:51 PM, Jan Beulich <JBeulich@xxxxxxxx> wrote:
> >>> On 18.04.16 at 16:00, <quan.xu@xxxxxxxxx> wrote:
> > --- a/xen/arch/x86/mm.c
> > +++ b/xen/arch/x86/mm.c
> > @@ -2467,7 +2467,7 @@ static int __get_page_type(struct page_info
> *page, unsigned long type,
> > int preemptible) {
> > unsigned long nx, x, y = page->u.inuse.type_info;
> > - int rc = 0;
> > + int rc = 0, ret = 0;
> >
> > ASSERT(!(type & ~(PGT_type_mask | PGT_pae_xen_l2)));
> >
> > @@ -2578,11 +2578,11 @@ static int __get_page_type(struct page_info
> *page, unsigned long type,
> > if ( d && is_pv_domain(d) && unlikely(need_iommu(d)) )
> > {
> > if ( (x & PGT_type_mask) == PGT_writable_page )
> > - iommu_unmap_page(d, mfn_to_gmfn(d, page_to_mfn(page)));
> > + ret = iommu_unmap_page(d, mfn_to_gmfn(d,
> > + page_to_mfn(page)));
> > else if ( type == PGT_writable_page )
> > - iommu_map_page(d, mfn_to_gmfn(d, page_to_mfn(page)),
> > - page_to_mfn(page),
> > - IOMMUF_readable|IOMMUF_writable);
> > + ret = iommu_map_page(d, mfn_to_gmfn(d, page_to_mfn(page)),
> > + page_to_mfn(page),
> > +
> > + IOMMUF_readable|IOMMUF_writable);
> > }
> > }
> >
> > @@ -2599,6 +2599,9 @@ static int __get_page_type(struct page_info
> *page, unsigned long type,
> > if ( (x & PGT_partial) && !(nx & PGT_partial) )
> > put_page(page);
> >
> > + if ( unlikely(ret) )
> > + rc = ret;
>
> Please don't overwrite the more relevant "rc" value in situations like this in
> case that is already non-zero. In this specific case you can actually get away
> without introducing a second error code variable, since the only place rc gets
> altered is between the two hunks above, and overwriting the rc value from
> map/unmap is then exactly what we want (but I'd much appreciate if you
> added a comment to this effect).
>
Make sense.
I hope I have got your point.. then, I will modify it as below:
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -2578,11 +2578,11 @@ static int __get_page_type(struct page_info *page,
unsigned long type,
if ( d && is_pv_domain(d) && unlikely(need_iommu(d)) )
{
if ( (x & PGT_type_mask) == PGT_writable_page )
- iommu_unmap_page(d, mfn_to_gmfn(d, page_to_mfn(page)));
+ rc = iommu_unmap_page(d, mfn_to_gmfn(d, page_to_mfn(page)));
else if ( type == PGT_writable_page )
- iommu_map_page(d, mfn_to_gmfn(d, page_to_mfn(page)),
- page_to_mfn(page),
- IOMMUF_readable|IOMMUF_writable);
+ rc = iommu_map_page(d, mfn_to_gmfn(d, page_to_mfn(page)),
+ page_to_mfn(page),
+ IOMMUF_readable|IOMMUF_writable);
}
}
@@ -2593,6 +2593,8 @@ static int __get_page_type(struct page_info *page,
unsigned long type,
page->nr_validated_ptes = 0;
page->partial_pte = 0;
}
+
+ /* Overwrite the rc value from IOMMU map and unmap. */
rc = alloc_page_type(page, type, preemptible);
}
btw, I am clumsy at comment, I'd be pleased if you could help me enhance it.
> > --- a/xen/arch/x86/mm/p2m-ept.c
> > +++ b/xen/arch/x86/mm/p2m-ept.c
> > @@ -665,7 +665,7 @@ ept_set_entry(struct p2m_domain *p2m, unsigned
> long gfn, mfn_t mfn,
> > ept_entry_t *table, *ept_entry = NULL;
> > unsigned long gfn_remainder = gfn;
> > unsigned int i, target = order / EPT_TABLE_ORDER;
> > - int ret, rc = 0;
> > + int ret, err = 0, rc = 0;
>
> Just like Kevin, and despite your reply to him I do not see the need fir the
> 3rd
> error indicator variable here:
>
Agreed.
> > @@ -182,10 +184,20 @@ void __hwdom_init iommu_hwdom_init(struct
> domain *d)
> > ((page->u.inuse.type_info & PGT_type_mask)
> > == PGT_writable_page) )
> > mapping |= IOMMUF_writable;
> > - hd->platform_ops->map_page(d, gfn, mfn, mapping);
> > +
> > + ret = hd->platform_ops->map_page(d, gfn, mfn, mapping);
> > +
> > + if ( unlikely(ret) )
> > + rc = ret;
> > +
> > if ( !(i++ & 0xfffff) )
> > process_pending_softirqs();
> > }
> > +
> > + if ( rc )
> > + printk(XENLOG_G_ERR
> > + "dom%d: IOMMU mapping is failed for hardware domain.",
> > + d->domain_id);
>
> Leaving the admin / developer with no indication of at least one specific case
> of a page where a failure occurred. As said in various places before: Log
> messages should provide useful information for at least getting started at
> investigating the issue, without first of all having to further instrument the
> code.
>
> In any event the "is" should be dropped from the text.
>
What about:
+ if ( rc )
+ printk(XENLOG_WARNING
+ "iommu_hwdom_init: IOMMU mapping failed for dom%d.",
+ d->domain_id);
If this is still not what you want, could you help me enhance it and I can
follow it as a pattern. Sorry to bother you with such a case.
Quan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |