[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/3] x86/mm: Consolidate all Xen L4 slot writing into init_xen_l4_slots()
On 12/10/17 16:08, Jan Beulich wrote: >>>> On 12.10.17 at 15:54, <andrew.cooper3@xxxxxxxxxx> wrote: >> --- a/xen/arch/x86/mm/hap/hap.c >> +++ b/xen/arch/x86/mm/hap/hap.c >> @@ -391,41 +391,24 @@ int hap_set_allocation(struct domain *d, unsigned int >> pages, bool *preempted) >> return 0; >> } >> >> -static void hap_install_xen_entries_in_l4(struct vcpu *v, mfn_t l4mfn) >> -{ >> - struct domain *d = v->domain; >> - l4_pgentry_t *l4e; >> - >> - l4e = map_domain_page(l4mfn); >> - >> - /* Copy the common Xen mappings from the idle domain */ >> - memcpy(&l4e[ROOT_PAGETABLE_FIRST_XEN_SLOT], >> - &idle_pg_table[ROOT_PAGETABLE_FIRST_XEN_SLOT], >> - ROOT_PAGETABLE_XEN_SLOTS * sizeof(l4_pgentry_t)); >> - >> - /* Install the per-domain mappings for this domain */ >> - l4e[l4_table_offset(PERDOMAIN_VIRT_START)] = >> - l4e_from_page(d->arch.perdomain_l3_pg, __PAGE_HYPERVISOR_RW); >> - >> - /* Install a linear mapping */ >> - l4e[l4_table_offset(LINEAR_PT_VIRT_START)] = >> - l4e_from_mfn(l4mfn, __PAGE_HYPERVISOR_RW); >> - >> - unmap_domain_page(l4e); >> -} >> - >> static mfn_t hap_make_monitor_table(struct vcpu *v) >> { >> struct domain *d = v->domain; >> struct page_info *pg; >> + l4_pgentry_t *l4e; >> mfn_t m4mfn; >> >> ASSERT(pagetable_get_pfn(v->arch.monitor_table) == 0); >> >> if ( (pg = hap_alloc(d)) == NULL ) >> goto oom; >> + >> m4mfn = page_to_mfn(pg); >> - hap_install_xen_entries_in_l4(v, m4mfn); >> + l4e = __map_domain_page(pg); > If you obtain the MFN anyway, map_domain_page() is cheaper > generated code wise. Ah yes. Given that __map_domain_page() is a define, I'd hope the compiler can spot and optimise away the double page_to_mfn(). Either way, fixed. > >> --- a/xen/arch/x86/pv/domain.c >> +++ b/xen/arch/x86/pv/domain.c >> @@ -35,7 +35,7 @@ static int setup_compat_l4(struct vcpu *v) >> >> l4tab = __map_domain_page(pg); >> clear_page(l4tab); >> - init_guest_l4_table(l4tab, v->domain, 1); >> + init_xen_l4_slots(l4tab, page_to_mfn(pg), v->domain, INVALID_MFN, >> false); > Perhaps worth avoiding the double translation here too. > > In any event > Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Just to confirm, the additional delta is: andrewcoop@andrewcoop:/local/xen.git/xen$ git diff diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c index 1e7e8d0..41deb90 100644 --- a/xen/arch/x86/mm/hap/hap.c +++ b/xen/arch/x86/mm/hap/hap.c @@ -404,7 +404,7 @@ static mfn_t hap_make_monitor_table(struct vcpu *v) goto oom; m4mfn = page_to_mfn(pg); - l4e = __map_domain_page(pg); + l4e = map_domain_page(m4mfn); init_xen_l4_slots(l4e, m4mfn, d, INVALID_MFN, false); unmap_domain_page(l4e); diff --git a/xen/arch/x86/pv/domain.c b/xen/arch/x86/pv/domain.c index a242037..2fb1996 100644 --- a/xen/arch/x86/pv/domain.c +++ b/xen/arch/x86/pv/domain.c @@ -28,14 +28,16 @@ static int setup_compat_l4(struct vcpu *v) { struct page_info *pg; l4_pgentry_t *l4tab; + mfn_t mfn; pg = alloc_domheap_page(v->domain, MEMF_no_owner); if ( pg == NULL ) return -ENOMEM; - l4tab = __map_domain_page(pg); + mfn = page_to_mfn(pg); + l4tab = map_domain_page(mfn); clear_page(l4tab); - init_xen_l4_slots(l4tab, page_to_mfn(pg), v->domain, INVALID_MFN, false); + init_xen_l4_slots(l4tab, mfn, v->domain, INVALID_MFN, false); unmap_domain_page(l4tab); /* This page needs to look like a pagetable so that it can be shadowed */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |