[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen: sched: don't call hooks of the wrong scheduler via VCPU2OP
On 16/03/17 22:30, Dario Faggioli wrote: > Within context_saved(), we call the context_saved hook, > and we use VCPU2OP() to determine from what scheduler. > VCPU2OP uses DOM2OP, which uses d->cpupool, which is > NULL when d is the idle domain. And in that case, > DOM2OP just returns ops, the scheduler of cpupool0. > > Therefore, if: > - cpupool0's scheduler defines context_saved (like > Credit2 and RTDS do), > - we are not in cpupool0 (i.e., our scheduler is > not ops), > - we are context switching from idle, > > we call VCPU2OP(idle_vcpu), which means > DOM2OP(idle->cpupool), which is ops. > > Therefore, we both: > - check if context_saved is defined in the wrong > scheduler; > - if yes, call the wrong one. > > When using Credit2 at boot, and also Credit2 in > the other cpupool, this is wrong but innocuous, > because it only involves the idle vcpus. > > When using Credit2 at boot, and Credit1 in the > other cpupool, this is *totally* wrong, and > it's by chance it does not explode! > > When using Credit2 and other schedulers I'm > developping, I hit the following assert (in > sched_credit2.c, on a CPU inside a cpupool that > does not use Credit2): > > csched2_context_saved() > { > ... > ASSERT(!vcpu_on_runq(svc)); > ... > } > > Fix this by taking care, in VCPU2OP, of the case > when the vcpu is an idle one. > > Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> Reviewed-by: Juergen Gross <jgross@xxxxxxxx> ... with or without the remark below addressed. > --- > Cc: George Dunlap <george.dunlap@xxxxxxxxxx> > Cc: Juergen Gross <jgross@xxxxxxxx> > Cc: Jan Beulich <jbeulich@xxxxxxxx> > --- > Cc-ing Jan, as this should be backported at least to 4.8, but, IMO, as back as > possible. > --- > xen/common/schedule.c | 14 +++++++++++++- > 1 file changed, 13 insertions(+), 1 deletion(-) > > diff --git a/xen/common/schedule.c b/xen/common/schedule.c > index 223a120..d12f346 100644 > --- a/xen/common/schedule.c > +++ b/xen/common/schedule.c > @@ -78,7 +78,19 @@ static struct scheduler __read_mostly ops; > : (typeof((opsptr)->fn(opsptr, ##__VA_ARGS__)))0 ) > > #define DOM2OP(_d) (((_d)->cpupool == NULL) ? &ops : > ((_d)->cpupool->sched)) > -#define VCPU2OP(_v) (DOM2OP((_v)->domain)) > +static inline struct scheduler* VCPU2OP(const struct vcpu *v) Rename, e.g. get_scheduler() ? > +{ > + struct domain *d = v->domain; > + > + if ( likely(d->cpupool != NULL) ) > + return d->cpupool->sched; > + > + /* v->processor never changes for idle vcpus, so using it here is safe */ > + if ( likely(is_idle_domain(d)) ) > + return per_cpu(scheduler, v->processor); > + else > + return &ops; > +} > #define VCPU2ONLINE(_v) cpupool_domain_cpumask((_v)->domain) > > static inline void trace_runstate_change(struct vcpu *v, int new_state) Juergen _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |