[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 2/5] xen: sched/credit1: make vcpu_migration_delay per-cpupool
On 02/23/2018 04:41 PM, Dario Faggioli wrote: > Right now, vCPU migration delay is controlled by > the vcpu_migration_delay boot parameter. This means > the same value will always be used for every instance > of Credit1, in any cpupool that will be created. > > Also, in order to get and set such value, a special > purpose libxc interface is defined, and used by the > xenpm tool. And this is problematic if Xen is built > without Credit1 support. > > This commit adds a vcpu_migr_delay field inside > struct csched_private, so that we can get/set the > migration delay indepently for each Credit1 instance, > in different cpupools. > > Getting and setting now happens via XEN_SYSCTL_SCHEDOP_*, > which is much better suited for this parameter. > > The value of the boot time parameter is used for > initializing the vcpu_migr_delay field of the private > structure of all the scheduler instances, when they're > created. > > While there, save reading NOW() and doing any s_time_t > operation, when the migration delay of a scheduler is > zero (as it is, by default), in > __csched_vcpu_is_cache_hot(). > > Finally, note that, from this commit on, using `xenpm > {set,get}-vcpu-migration-delay' is not effective any > longer. > > Signed-off-by: Dario Faggioli <dfaggioli@xxxxxxxx> > --- > Cc: George Dunlap <george.dunlap@xxxxxxxxxxxxx> > Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> > --- > xen/common/sched_credit.c | 38 +++++++++++++++++++++++++++----------- > xen/include/public/sysctl.h | 3 +++ > 2 files changed, 30 insertions(+), 11 deletions(-) > > diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c > index a2c5d43e33..fd6dbd02aa 100644 > --- a/xen/common/sched_credit.c > +++ b/xen/common/sched_credit.c > @@ -214,7 +214,7 @@ struct csched_private { > > /* Period of master and tick in milliseconds */ > unsigned int tick_period_us, ticks_per_tslice; > - s_time_t ratelimit, tslice; > + s_time_t ratelimit, tslice, vcpu_migr_delay; > > struct list_head active_sdom; > uint32_t weight; > @@ -690,11 +690,11 @@ unsigned int get_vcpu_migration_delay(void) > return vcpu_migration_delay; > } > > -static inline int > -__csched_vcpu_is_cache_hot(struct vcpu *v) > +static inline bool > +__csched_vcpu_is_cache_hot(const struct csched_private *prv, struct vcpu *v) > { > - int hot = ((NOW() - v->last_run_time) < > - ((uint64_t)vcpu_migration_delay * 1000u)); > + bool hot = prv->vcpu_migr_delay && > + (NOW() - v->last_run_time) < prv->vcpu_migr_delay; > > if ( hot ) > SCHED_STAT_CRANK(vcpu_hot); > @@ -703,7 +703,8 @@ __csched_vcpu_is_cache_hot(struct vcpu *v) > } > > static inline int > -__csched_vcpu_is_migrateable(struct vcpu *vc, int dest_cpu, cpumask_t *mask) > +__csched_vcpu_is_migrateable(const struct csched_private *prv, struct vcpu > *vc, > + int dest_cpu, cpumask_t *mask) > { > /* > * Don't pick up work that's hot on peer PCPU, or that can't (or > @@ -714,7 +715,7 @@ __csched_vcpu_is_migrateable(struct vcpu *vc, int > dest_cpu, cpumask_t *mask) > */ > ASSERT(!vc->is_running); > > - return !__csched_vcpu_is_cache_hot(vc) && > + return !__csched_vcpu_is_cache_hot(prv, vc) && > cpumask_test_cpu(dest_cpu, mask); > } > > @@ -1251,7 +1252,9 @@ csched_sys_cntl(const struct scheduler *ops, > || (params->ratelimit_us > && (params->ratelimit_us > XEN_SYSCTL_SCHED_RATELIMIT_MAX > || params->ratelimit_us < > XEN_SYSCTL_SCHED_RATELIMIT_MIN)) > - || MICROSECS(params->ratelimit_us) > > MILLISECS(params->tslice_ms) ) > + || MICROSECS(params->ratelimit_us) > > MILLISECS(params->tslice_ms) > + || (params->vcpu_migr_delay_us > + && MICROSECS(params->vcpu_migr_delay_us) >= > XEN_SYSCTL_CSCHED_MGR_DLY_MAX) ) > goto out; > > spin_lock_irqsave(&prv->lock, flags); > @@ -1261,12 +1264,14 @@ csched_sys_cntl(const struct scheduler *ops, > else if ( prv->ratelimit && !params->ratelimit_us ) > printk(XENLOG_INFO "Disabling context switch rate limiting\n"); > prv->ratelimit = MICROSECS(params->ratelimit_us); > + prv->vcpu_migr_delay = MICROSECS(params->vcpu_migr_delay_us); > spin_unlock_irqrestore(&prv->lock, flags); > > /* FALLTHRU */ > case XEN_SYSCTL_SCHEDOP_getinfo: > params->tslice_ms = prv->tslice / MILLISECS(1); > params->ratelimit_us = prv->ratelimit / MICROSECS(1); > + params->vcpu_migr_delay_us = prv->vcpu_migr_delay / MICROSECS(1); > rc = 0; > break; > } > @@ -1608,6 +1613,7 @@ csched_tick(void *_cpu) > static struct csched_vcpu * > csched_runq_steal(int peer_cpu, int cpu, int pri, int balance_step) > { > + const struct csched_private * const prv = CSCHED_PRIV(per_cpu(scheduler, > cpu)); > const struct csched_pcpu * const peer_pcpu = CSCHED_PCPU(peer_cpu); > struct csched_vcpu *speer; > struct list_head *iter; > @@ -1657,7 +1663,7 @@ csched_runq_steal(int peer_cpu, int cpu, int pri, int > balance_step) > continue; > > affinity_balance_cpumask(vc, balance_step, cpumask_scratch); > - if ( __csched_vcpu_is_migrateable(vc, cpu, cpumask_scratch) ) > + if ( __csched_vcpu_is_migrateable(prv, vc, cpu, cpumask_scratch) ) > { > /* We got a candidate. Grab it! */ > TRACE_3D(TRC_CSCHED_STOLEN_VCPU, peer_cpu, > @@ -2114,7 +2120,7 @@ csched_dump(const struct scheduler *ops) > "\tratelimit = %"PRI_stime"us\n" > "\tcredits per msec = %d\n" > "\tticks per tslice = %d\n" > - "\tmigration delay = %uus\n", > + "\tmigration delay = %"PRI_stime"us\n", > prv->ncpus, > prv->master, > prv->credit, > @@ -2126,7 +2132,7 @@ csched_dump(const struct scheduler *ops) > prv->ratelimit / MICROSECS(1), > CSCHED_CREDITS_PER_MSEC, > prv->ticks_per_tslice, > - vcpu_migration_delay); > + prv->vcpu_migr_delay/ MICROSECS(1)); > > cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), prv->idlers); > printk("idlers: %s\n", idlers_buf); > @@ -2209,6 +2215,16 @@ csched_init(struct scheduler *ops) > } > else > prv->ratelimit = MICROSECS(sched_ratelimit_us); > + > + if ( !vcpu_migration_delay && vcpu_migration_delay > MILLISECS(100) ) Also, this expression can never evaluate to true; the first element requires 0, the second requires non-zero. I think you want to get rid of the `!`. -George _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |