Re: [RFC][PATCH 14/10] sched, fair: Fix the group_capacity computation
From: Vincent Guittot
Date: Wed Sep 04 2013 - 03:44:23 EST
On 28 August 2013 13:16, Peter Zijlstra <peterz@xxxxxxxxxxxxx> wrote:
>
> Subject: sched, fair: Fix the group_capacity computation
> From: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
> 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@xxxxxxxxxx>
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@xxxxxxxxxxxxx>
> ---
> 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);
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/