[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 7/8] xen: arm: use superpages in p2m when pages are suitably aligned
On Wed, 2014-06-11 at 23:19 +0100, Julien Grall wrote: > Hi Ian, > > While I was looking closer to this patch I found something strange. Why > all the callers of guest_physmap_add_page in the directory common don't > check that the function success to create the mapping? "directory common"? I don't get your meaning. > On 11/06/14 17:40, Ian Campbell wrote: > > + page = alloc_domheap_pages(d, level_shift - PAGE_SHIFT, 0); > > + if ( page ) > > + { > > + pte = mfn_to_p2m_entry(page_to_mfn(page), mattr, t); > > + if ( level != 3 ) > > + pte.p2m.table = 0; > > + p2m_write_pte(entry, pte, flush_cache); > > + p2m->stats.mappings[level]++; > > It looks like you forgot to update the *addr here. > > Did you try this code path? With the 1:1 workaround this part is never used. Yes, this probably hasn't been executed. I'll see about forcing it. > > + return P2M_ONE_PROGRESS; > > + } > > + else if ( level == 3 ) > > + return -ENOMEM; > > + } > > + > > + BUG_ON(level == 3); /* L3 is always superpage aligned */ > > Did you mean page-aligned? What I meant was that an L3 entry is always "superpage aligned" because it is the smallest possible element. Since I wrote that I renamed my is_superpage_aligned function to is_mapping_aligned. I should perhaps update this comment to reflect that, which would make it clearer. > [..] > > > + case INSERT: > > + if ( is_mapping_aligned(*addr, end_gpaddr, *maddr, level_size) && > > + /* We do not handle replacing an existing table with a > > superpage */ > > + (level == 3 || !p2m_table(orig_pte)) ) > > + { > > + /* New mapping is superpage aligned, make it */ > > + pte = mfn_to_p2m_entry(*maddr >> PAGE_SHIFT, mattr, t); > > + if ( level < 3 ) > > It's funny, sometimes you use level < 3 and some level != 3 (see in > ALLOCATE). True. > I think this pte.p2m.table set can be handled directly in > mfn_to_p2m_entry. This will avoid duplicating code. It can't because mfn_to_p2m_entry is used to create both table and mapping style entries. > > [..] > > > + } > > + else > > + { > > + /* New mapping is not superpage aligned, create a new table > > entry */ > > + BUG_ON(level == 3); /* L3 is always superpage aligned */ > > Did you mean page-aligned? > > [..] > > > - /* Got the next page */ > > - addr += PAGE_SIZE; > > + rc = apply_one_level(d, &third[third_table_offset(addr)], > > + 3, flush_pt, op, > > + start_gpaddr, end_gpaddr, > > + &addr, &maddr, &flush, > > + mattr, t); > > + if ( rc < 0 ) goto out; > > Shall we redo the whole range if the mapping has failed here? s/redo/undo/? > > diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h > > index 911d32d..821d9ef 100644 > > --- a/xen/include/asm-arm/p2m.h > > +++ b/xen/include/asm-arm/p2m.h > > [..] > > > +/* */ > > Did you intend to add a comment here? I guess one isn't really needed. > > +void p2m_dump_info(struct domain *d); > > + > > /* Look up the MFN corresponding to a domain's PFN. */ > > paddr_t p2m_lookup(struct domain *d, paddr_t gpfn, p2m_type_t *t); > > > > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |