OSDN Git Service

sched/topology: Propagate SD_ASYM_CPUCAPACITY upwards
authorValentin Schneider <valentin.schneider@arm.com>
Mon, 17 Aug 2020 11:29:56 +0000 (12:29 +0100)
committerIngo Molnar <mingo@kernel.org>
Wed, 19 Aug 2020 08:49:49 +0000 (10:49 +0200)
commitc200191d4c2c1aa2ffb62a984b756ac1f02dc55c
tree23b960dd43e9050577d00ea337abc0b15e284b22
parentab65afb094c7b2e954e8d56ffbc7df843211c2c8
sched/topology: Propagate SD_ASYM_CPUCAPACITY upwards

We currently set this flag *only* on domains whose topology level exactly
match the level where we detect asymmetry (as returned by
asym_cpu_capacity_level()). This is rather problematic.

Say there are two clusters in the system, one with a lone big CPU and the
other with a mix of big and LITTLE CPUs (as is allowed by DynamIQ):

  DIE [                ]
  MC  [             ][ ]
       0   1   2   3  4
       L   L   B   B  B

asym_cpu_capacity_level() will figure out that the MC level is the one
where all CPUs can see a CPU of max capacity, and we will thus set
SD_ASYM_CPUCAPACITY at MC level for all CPUs.

That lone big CPU will degenerate its MC domain, since it would be alone in
there, and will end up with just a DIE domain. Since the flag was only set
at MC, this CPU ends up not seeing any SD with the flag set, which is
broken.

Rather than clearing dflags at every topology level, clear it before
entering the topology level loop. This will properly propagate upwards
flags that are set starting from a certain level.

Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Quentin Perret <qperret@google.com>
Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: https://lore.kernel.org/r/20200817113003.20802-11-valentin.schneider@arm.com
include/linux/sched/sd_flags.h
kernel/sched/topology.c