[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 2/2] xen: move TLB-flush filtering out into populate_physmap during vm creation
>>> On 12.09.16 at 10:16, <dongli.zhang@xxxxxxxxxx> wrote: > --- a/xen/common/domain.c > +++ b/xen/common/domain.c > @@ -303,6 +303,8 @@ struct domain *domain_create(domid_t domid, unsigned int > domcr_flags, > if ( !zalloc_cpumask_var(&d->domain_dirty_cpumask) ) > goto fail; > > + d->is_ever_unpaused = false; This it not needed - struct domain starts out as all zeros anyway. > @@ -1004,6 +1006,15 @@ int domain_unpause_by_systemcontroller(struct domain > *d) > { > int old, new, prev = d->controller_pause_count; > > + /* > + * Set is_ever_unpaused to true when this domain gets unpaused for the > + * first time. We record this information here to help populate_physmap > + * verify whether the domain has ever been unpaused. MEMF_no_tlbflush > + * is allowed to be set by populate_physmap only during vm creation. > + */ > + if ( unlikely(!d->is_ever_unpaused) ) > + d->is_ever_unpaused = true; As mentioned before, the conditional is pointless. And just like Dario, I dislike the name of the field. How about "has_run", "was_unpaused", or "is_alive"? Or even better, how about combining this with the is_shutting_down and is_shut_down into an enum? For that latter variant, that would presumably better be a patch on its own then. > @@ -150,6 +152,14 @@ static void populate_physmap(struct memop_args *a) > max_order(curr_d)) ) > return; > > + /* > + * MEMF_no_tlbflush can be set only during vm creation phase when > + * is_ever_unpaused is still false before this domain gets unpaused for > + * the first time. > + */ > + if ( unlikely(!d->is_ever_unpaused) ) > + a->memflags |= MEMF_no_tlbflush; So you no longer mean to expose this to the caller? > @@ -214,6 +224,20 @@ static void populate_physmap(struct memop_args *a) > goto out; > } > > + if ( unlikely(!d->is_ever_unpaused) ) Please check MEMF_no_tlbflush here instead. > + { > + for ( j = 0; j < (1U << a->extent_order); j++ ) > + { > + if ( page_needs_tlbflush(&page[j], need_tlbflush, > + tlbflush_timestamp, > + tlbflush_current_time()) ) > + { > + need_tlbflush = true; > + tlbflush_timestamp = page[j].tlbflush_timestamp; > + } > + } > + } > + > mfn = page_to_mfn(page); > } > > @@ -232,6 +256,16 @@ static void populate_physmap(struct memop_args *a) > } > > out: > + if ( need_tlbflush ) > + { > + cpumask_t mask = cpu_online_map; > + tlbflush_filter(mask, tlbflush_timestamp); Blank line between declarations and statements please. Also, considering this repeats what gets done in page_alloc.c, I think it should also be factored out into a function. And along those lines I think the other abstraction should then also go further and take care of the updating of need_tlbflush and tlbflush_timestamp. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |