[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1 of 6 v2] xen: sched_credit: improve picking up the idlal CPU for a VCPU
>>> On 14.12.12 at 20:50, George Dunlap <george.dunlap@xxxxxxxxxxxxx> wrote: > On 12/12/12 10:04, Jan Beulich wrote: >>>>> On 12.12.12 at 03:52, Dario Faggioli <dario.faggioli@xxxxxxxxxx> wrote: >>> --- a/xen/common/sched_credit.c >>> +++ b/xen/common/sched_credit.c >>> @@ -59,6 +59,8 @@ >>> #define CSCHED_VCPU(_vcpu) ((struct csched_vcpu *) (_vcpu)->sched_priv) >>> #define CSCHED_DOM(_dom) ((struct csched_dom *) (_dom)->sched_priv) >>> #define RUNQ(_cpu) (&(CSCHED_PCPU(_cpu)->runq)) >>> +/* Is the first element of _cpu's runq its idle vcpu? */ >>> +#define IS_RUNQ_IDLE(_cpu) >>> (is_idle_vcpu(__runq_elem(RUNQ(_cpu)->next)->vcpu)) >>> >>> >>> /* >>> @@ -479,9 +481,14 @@ static int >>> * distinct cores first and guarantees we don't do something stupid >>> * like run two VCPUs on co-hyperthreads while there are idle cores >>> * or sockets. >>> + * >>> + * Notice that, when computing the "idleness" of cpu, we may want to >>> + * discount vc. That is, iff vc is the currently running and the only >>> + * runnable vcpu on cpu, we add cpu to the idlers. >>> */ >>> cpumask_and(&idlers, &cpu_online_map, CSCHED_PRIV(ops)->idlers); >>> - cpumask_set_cpu(cpu, &idlers); >>> + if ( current_on_cpu(cpu) == vc && IS_RUNQ_IDLE(cpu) ) >>> + cpumask_set_cpu(cpu, &idlers); >>> cpumask_and(&cpus, &cpus, &idlers); >>> cpumask_clear_cpu(cpu, &cpus); >>> >>> @@ -489,7 +496,7 @@ static int >>> { >>> cpumask_t cpu_idlers; >>> cpumask_t nxt_idlers; >>> - int nxt, weight_cpu, weight_nxt; >>> + int nxt, nr_idlers_cpu, nr_idlers_nxt; >>> int migrate_factor; >>> >>> nxt = cpumask_cycle(cpu, &cpus); >>> @@ -513,12 +520,12 @@ static int >>> cpumask_and(&nxt_idlers, &idlers, per_cpu(cpu_core_mask, >>> nxt)); >>> } >>> >>> - weight_cpu = cpumask_weight(&cpu_idlers); >>> - weight_nxt = cpumask_weight(&nxt_idlers); >>> + nr_idlers_cpu = cpumask_weight(&cpu_idlers); >>> + nr_idlers_nxt = cpumask_weight(&nxt_idlers); >>> /* smt_power_savings: consolidate work rather than spreading it */ >>> if ( sched_smt_power_savings ? >>> - weight_cpu > weight_nxt : >>> - weight_cpu * migrate_factor < weight_nxt ) >>> + nr_idlers_cpu > nr_idlers_nxt : >>> + nr_idlers_cpu * migrate_factor < nr_idlers_nxt ) >>> { >>> cpumask_and(&nxt_idlers, &cpus, &nxt_idlers); >>> spc = CSCHED_PCPU(nxt); >> Despite you mentioning this in the description, these last two hunks >> are, afaict, only renaming variables (and that's even debatable, as >> the current names aren't really misleading imo), and hence I don't >> think belong in a patch that clearly has the potential for causing >> (performance) regressions. >> >> That said - I don't think it will (and even more, I'm agreeable to the >> change done). >> >>> --- a/xen/include/xen/sched.h >>> +++ b/xen/include/xen/sched.h >>> @@ -396,6 +396,9 @@ extern struct vcpu *idle_vcpu[NR_CPUS]; >>> #define is_idle_domain(d) ((d)->domain_id == DOMID_IDLE) >>> #define is_idle_vcpu(v) (is_idle_domain((v)->domain)) >>> >>> +#define current_on_cpu(_c) \ >>> + ( (per_cpu(schedule_data, _c).curr) ) >>> + >> This, imo, really belings into sched-if.h. > > Hmm, it looks like there are a number of things that could live in > either sched-if.h or sched.h; but I think this one probably most closely > links with thins like vcpu_is_runnable() and cpu_is_haltable(), both of > which are in sched.h; so sched.h is where I'd put it. Any use of schedule_data, the type of which is declared in sched-if.h, should be in sched-if.h - someone only including sched.h can't make use of it anyway (and it's intended to be used by scheduler code, i.e. shouldn't be visible to other code). >> Plus - what's the point of double parentheses, when in fact none >> at all would be needed? >> >> And finally, why "_c" and not just "c"? > > I think the underscore is pretty standard in macros. It's bad practice imo; I have always understood this as questionable attempts of people to avoid name clashes (which is understandable only for variables declared locally inside a macro definition). Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |