[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 07/13] xen/arm: compile and initialize vmap
On Thu, 25 Apr 2013, Ian Campbell wrote: > On Wed, 2013-04-24 at 20:07 +0100, Stefano Stabellini wrote: > > Rename EARLY_VMAP_VIRT_END and EARLY_VMAP_VIRT_START to > > VMAP_VIRT_END and VMAP_VIRT_START. > > > > Defining VMAP_VIRT_START triggers the compilation of common/vmap.c. > > > > Define PAGE_HYPERVISOR and MAP_SMALL_PAGES (unused on ARM). > > So our vmap is 2MB mappings only? I suppose that's ok, at least for now. No, I explained myself poorly, I meant that we only support 4K mappings so MAP_SMALL_PAGES is useless (always set). > > Implement map_pages_to_xen and destroy_xen_mappings. > > This involves moving the prototypes from x86 to generic, so needs Jan + > Keir, CCd. > > > > > Call vm_init from start_xen. > > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > > > +static int create_xen_table(lpae_t *entry) > > +{ > > + void *p; > > + lpae_t pte; > > + > > + p = alloc_xenheap_pages(0, 0); > > + if ( p == NULL ) > > + return -ENOMEM; > > + clear_page(p); > > + pte = mfn_to_xen_entry(virt_to_mfn(p)); > > + pte.pt.table = 1; > > + write_pte(entry, pte); > > + return 0; > > +} > > + > > +enum xenmap_operation { > > + INSERT, > > + REMOVE > > +}; > > + > > +static int create_xen_entries(enum xenmap_operation op, > > + unsigned long virt, > > + unsigned long mfn, > > + unsigned long nr_mfns) > > Shame this can't be combined with create_p2m_entries, but that uses > domain pages and this uses xenheap pages. > > > +{ > > + int rc; > > + unsigned long addr = virt, addr_end = addr + nr_mfns * PAGE_SIZE; > > + lpae_t pte; > > + lpae_t *third = NULL; > > + > > + for(; addr < addr_end; addr += PAGE_SIZE, mfn++) > > + { > > + if ( !xen_second[second_linear_offset(addr)].pt.valid || > > + !xen_second[second_linear_offset(addr)].pt.table ) > > + { > > + rc = create_xen_table(&xen_second[second_linear_offset(addr)]); > > + if ( rc < 0 ) { > > + printk("create_xen_entries: L2 failed\n"); > > + goto out; > > + } > > + } > > + > > + BUG_ON(!xen_second[second_linear_offset(addr)].pt.valid); > > + > > + third = > > __va((paddr_t)xen_second[second_linear_offset(addr)].pt.base > > + << PAGE_SHIFT); > > + if ( third[third_table_offset(addr)].pt.valid ) > > + flush_tlb_local(); > > Why this flush? (I notice create_p2m_mapping does the same but with > _all_local()) I dropped the _all_local because we don't want to flush all VMIDs here, only the hypervisor mappings. However I am not sure that this flush is actually necessary as we are going to flush the mapping later on after the pte has been written. > Isn't it a bug for the third to be already mapped? that suggests > something is overwriting the mapping, does vmap do that? I don't know, but I thought that this function should be able to handle that case. > > + > > + switch ( op ) { > > + case INSERT: > > + pte = mfn_to_xen_entry(mfn); > > + pte.pt.table = 1; > > + write_pte(&third[third_table_offset(addr)], pte); > > + break; > > + case REMOVE: > > + memset(&pte, 0x00, sizeof(pte)); > > AKA: pte.bits = 0; OK > > + write_pte(&third[third_table_offset(addr)], pte); > > + break; > > + default: > > + printk("create_xen_entries: invalid op\n"); > > ASSERT? This really can never happen. Right. A BUG might be better then. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |