[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1 of 2] After preparing a page for page-in, allow immediate fill-in of the page contents
Hi, This looks good to me. I think it needs two more things to make it correct (as well as the tools patch 2/2): - an update to the xenpaging tool to use the new interface; and - a possible update to the paging state machine --- after all, if the prep call allocates the pageand fills its contents, do we need any more stages on the page-in path? One more comment below: At 16:52 -0500 on 29 Nov (1322585560), Andres Lagar-Cavilla wrote: > diff -r 4ee6d40edc2c -r 0ce71e5bfaac xen/arch/x86/mm/p2m.c > --- a/xen/arch/x86/mm/p2m.c > +++ b/xen/arch/x86/mm/p2m.c > @@ -974,14 +974,43 @@ void p2m_mem_paging_populate(struct doma > * mfn if populate was called for gfn which was nominated but not evicted. > In > * this case only the p2mt needs to be forwarded. > */ > -int p2m_mem_paging_prep(struct domain *d, unsigned long gfn) > +int p2m_mem_paging_prep(struct domain *d, unsigned long gfn, uint64_t buffer) > { > struct page_info *page; > p2m_type_t p2mt; > p2m_access_t a; > - mfn_t mfn; > + mfn_t mfn, buf_mfn = _mfn(INVALID_MFN); > struct p2m_domain *p2m = p2m_get_hostp2m(d); > - int ret; > + int ret, page_extant = 1; > + void *buf_map = NULL; > + > + /* Map buffer page, if any, and get a reference */ > + if ( buffer ) > + { > + l1_pgentry_t l1e; > + unsigned long buf_gfn; > + p2m_type_t buf_p2mt; > + > + if ( (buffer & (PAGE_SIZE - 1)) || > + (!access_ok(buffer, PAGE_SIZE)) ) > + return -EINVAL; > + > + guest_get_eff_l1e(current, buffer, &l1e); > + buf_gfn = l1e_get_pfn(l1e); > + buf_mfn = get_gfn(current->domain, buf_gfn, > + &buf_p2mt); > + > + if ( likely( mfn_valid(buf_mfn) && > + p2m_is_ram(buf_p2mt) ) ) > + { > + get_page(mfn_to_page(buf_mfn), current->domain); > + buf_map = map_domain_page(mfn_x(buf_mfn)); > + put_gfn(current->domain, buf_gfn); > + } else { > + put_gfn(current->domain, buf_gfn); > + return -EINVAL; > + } > + } We could maybe avoid all this mechanism by doing a copy_from_user() of the buffer contents directly into the new page, instead of an explicit map-and-memcpy(). Cheers, Tim. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |