Messages in this thread | | | Date | Wed, 4 Sep 2013 09:44:17 +0200 | Subject | Re: [RFC][PATCH 14/10] sched, fair: Fix the group_capacity computation | From | Vincent Guittot <> |
| |
On 28 August 2013 13:16, Peter Zijlstra <peterz@infradead.org> wrote: > > Subject: sched, fair: Fix the group_capacity computation > From: Peter Zijlstra <peterz@infradead.org> > Date: Wed Aug 28 12:40:38 CEST 2013 > > Do away with 'phantom' cores due to N*frac(smt_power) >= 1 by limiting > the capacity to the actual number of cores. >
Peter,
your patch also solves the 'phantom' big cores that can appear on HMP system because big cores have a cpu_power >= SCHED_POWER_SCALE in order to express a higher capacity than LITTLE cores.
Acked-by Vincent Guittot <vincent.guitto@linaro.org>
Vincent
> The assumption of 1 < smt_power < 2 is an actual requirement because > of what SMT is so this should work regardless of the SMT > implementation. > > It can still be defeated by creative use of cpu hotplug, but if you're > one of those freaks, you get to live with it. > > Signed-off-by: Peter Zijlstra <peterz@infradead.org> > --- > kernel/sched/fair.c | 20 +++++++++++++------- > 1 file changed, 13 insertions(+), 7 deletions(-) > > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -4554,18 +4554,24 @@ static inline int sg_imbalanced(struct s > /* > * Compute the group capacity. > * > - * For now the capacity is simply the number of power units in the group_power. > - * A power unit represents a full core. > - * > - * This has an issue where N*frac(smt_power) >= 1, in that case we'll see extra > - * 'cores' that aren't actually there. > + * Avoid the issue where N*frac(smt_power) >= 1 creates 'phantom' cores by > + * first dividing out the smt factor and computing the actual number of cores > + * and limit power unit capacity with that. > */ > static inline int sg_capacity(struct lb_env *env, struct sched_group *group) > { > + unsigned int capacity, smt, cpus; > + unsigned int power, power_orig; > + > + power = group->sgp->power; > + power_orig = group->sgp->power_orig; > + cpus = group->group_weight; > > - unsigned int power = group->sgp->power; > - unsigned int capacity = DIV_ROUND_CLOSEST(power, SCHED_POWER_SCALE); > + /* smt := ceil(cpus / power), assumes: 1 < smt_power < 2 */ > + smt = DIV_ROUND_UP(SCHED_POWER_SCALE * cpus, power_orig); > + capacity = cpus / smt; /* cores */ > > + capacity = min_t(capacity, DIV_ROUND_CLOSEST(power, SCHED_POWER_SCALE)); > if (!capacity) > capacity = fix_small_capacity(env->sd, group); >
| |