[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/1] xen: move TLB-flush filtering out into populate_physmap
On Tue, Sep 06, 2016 at 01:17:38PM +0800, Dongli Zhang wrote: > This patch implemented parts of TODO left in commit id > a902c12ee45fc9389eb8fe54eeddaf267a555c58. It moved TLB-flush filtering out > into populate_physmap. > > Because of TLB-flush in alloc_heap_pages, it's very slow to create a guest > with memory size of more than 100GB on host with 100+ cpus. > > This patch introduced a "MEMF_no_tlbflush" bit to memflag to indicate > whether TLB-flush should be done in alloc_heap_pages or its caller > populate_physmap. Once this bit is set in memflag, alloc_heap_pages will > ignore TLB-flush. > > Signed-off-by: Dongli Zhang <dongli.zhang@xxxxxxxxxx> > --- > xen/common/memory.c | 26 ++++++++++++++++++++++++++ > xen/common/page_alloc.c | 3 ++- > xen/include/xen/mm.h | 2 ++ > 3 files changed, 30 insertions(+), 1 deletion(-) > > diff --git a/xen/common/memory.c b/xen/common/memory.c > index f34dd56..14ec5fa 100644 > --- a/xen/common/memory.c > +++ b/xen/common/memory.c > @@ -141,6 +141,8 @@ static void populate_physmap(struct memop_args *a) > unsigned int i, j; > xen_pfn_t gpfn, mfn; > struct domain *d = a->domain, *curr_d = current->domain; > + bool_t need_tlbflush = 0; > + uint32_t tlbflush_timestamp = 0; > > if ( !guest_handle_subrange_okay(a->extent_list, a->nr_done, > a->nr_extents-1) ) > @@ -149,6 +151,8 @@ static void populate_physmap(struct memop_args *a) > if ( a->extent_order > (a->memflags & MEMF_populate_on_demand ? > MAX_ORDER : > max_order(curr_d)) ) > return; > + > + a->memflags |= MEMF_no_tlbflush; > > for ( i = a->nr_done; i < a->nr_extents; i++ ) > { > @@ -213,6 +217,18 @@ static void populate_physmap(struct memop_args *a) > i, a->nr_extents); > goto out; > } > + > + for ( j = 0; j < (1U << a->extent_order); j++ ) > + { > + if ( page[j].u.free.need_tlbflush && > + (page[j].tlbflush_timestamp <= > tlbflush_current_time()) && > + (!need_tlbflush || > + (page[j].tlbflush_timestamp > > tlbflush_timestamp)) ) > + { > + need_tlbflush = 1; > + tlbflush_timestamp = > page[j].tlbflush_timestamp; > + } > + } > Indentation seems rather wrong. Please configure your editor properly. Wei. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |