[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v7 06/10] xen/x86: factor out map and unmap from the memory_mapping DOMCTL
>>> On 05.05.14 at 17:54, <avanzini.arianna@xxxxxxxxx> wrote: > --- a/xen/arch/x86/domctl.c > +++ b/xen/arch/x86/domctl.c > @@ -646,19 +646,21 @@ long arch_do_domctl( > unsigned long gfn = domctl->u.memory_mapping.first_gfn; > unsigned long mfn = domctl->u.memory_mapping.first_mfn; > unsigned long nr_mfns = domctl->u.memory_mapping.nr_mfns; > + unsigned long mfn_end = mfn + nr_mfns - 1; > + unsigned long gfn_end = gfn + nr_mfns - 1; > int add = domctl->u.memory_mapping.add_mapping; > > ret = -EINVAL; > - if ( (mfn + nr_mfns - 1) < mfn || /* wrap? */ > - ((mfn | (mfn + nr_mfns - 1)) >> (paddr_bits - PAGE_SHIFT)) || > - (gfn + nr_mfns - 1) < gfn ) /* wrap? */ > + if ( mfn_end < mfn || /* wrap? */ > + ((mfn | mfn_end) >> (paddr_bits - PAGE_SHIFT)) || > + gfn_end < gfn ) /* wrap? */ > break; > > ret = -EPERM; > - if ( !iomem_access_permitted(current->domain, mfn, mfn + nr_mfns - > 1) ) > + if ( !iomem_access_permitted(current->domain, mfn, mfn_end) ) > break; > > - ret = xsm_iomem_mapping(XSM_HOOK, d, mfn, mfn + nr_mfns - 1, add); > + ret = xsm_iomem_mapping(XSM_HOOK, d, mfn, mfn_end, add); > if ( ret ) > break; > With the switch to passing nr_mfns to the helper functions all of the above and some of the change further down (i.e. anything substituting [gm]fn_end are now unrelated to the patch. If you feel strongly about doing this replacement, this should be a separate patch, making the review of this one easier. > --- a/xen/arch/x86/mm/p2m.c > +++ b/xen/arch/x86/mm/p2m.c > @@ -1650,6 +1650,47 @@ unsigned long paging_gva_to_gfn(struct vcpu *v, > return hostmode->gva_to_gfn(v, hostp2m, va, pfec); > } > > +int map_mmio_regions(struct domain *d, > + unsigned long start_gfn, > + unsigned long nr_mfns, > + mfn_t mfn) > +{ > + int ret = 0; > + unsigned long i; > + > + if ( !paging_mode_translate(d) ) > + return 0; > + > + for ( i = 0; !ret && i < nr_mfns; i++ ) > + ret |= set_mmio_p2m_entry(d, start_gfn + i, _mfn(mfn_x(mfn) + i)); The |= it pointless considering the loop termination condition. Just use =. > + if ( ret ) > + { > + unmap_mmio_regions(d, start_gfn, start_gfn + i, mfn); > + ret = -EIO; And without using |= there's then also no point in overriding the return value from set_mmio_p2m_entry(). > +int unmap_mmio_regions(struct domain *d, > + unsigned long start_gfn, > + unsigned long nr_mfns, > + mfn_t mfn) > +{ > + int ret = 0; > + unsigned long i; > + > + if ( !paging_mode_translate(d) ) > + return 0; > + > + for ( i = 0; i < nr_mfns; i++ ) > + ret |= clear_mmio_p2m_entry(d, start_gfn + i, _mfn(mfn_x(mfn) + i)); > + > + if ( ret ) > + return -EIO; Same here regarding the return value override: Avoid the |= and instead latch either the first or last error (if any), just like done by the original code. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |