• Beata Michalska's avatar
    sched/topology: Rework CPU capacity asymmetry detection · c744dc4a
    Beata Michalska authored
    Currently the CPU capacity asymmetry detection, performed through
    asym_cpu_capacity_level, tries to identify the lowest topology level
    at which the highest CPU capacity is being observed, not necessarily
    finding the level at which all possible capacity values are visible
    to all CPUs, which might be bit problematic for some possible/valid
    asymmetric topologies i.e.:
    
    DIE      [                                ]
    MC       [                       ][       ]
    
    CPU       [0] [1] [2] [3] [4] [5]  [6] [7]
    Capacity  |.....| |.....| |.....|  |.....|
    	     L	     M       B        B
    
    Where:
     arch_scale_cpu_capacity(L) = 512
     arch_scale_cpu_capacity(M) = 871
     arch_scale_cpu_capacity(B) = 1024
    
    In this particular case, the asymmetric topology level will point
    at MC, as all possible CPU masks for that level do cover the CPU
    with the highest capacity. It will work just fine for the first
    cluster, not so much for the second one though (consider the
    find_energy_efficient_cpu which might end up attempting the energy
    aware wake-up for a domain that does not see any asymmetry at all)
    
    Rework the way the capacity asymmetry levels are being detected,
    allowing to point to the lowest topology level (for a given CPU), where
    full set of available CPU capacities is visible to all CPUs within given
    domain. As a result, the per-cpu sd_asym_cpucapacity might differ across
    the domains. This will have an impact on EAS wake-up placement in a way
    that it might see different range of CPUs to be considered, depending on
    the given current and target CPUs.
    
    Additionally, those levels, where any range of asymmetry (not
    necessarily full) is being detected will get identified as well.
    The selected asymmetric topology level will be denoted by
    SD_ASYM_CPUCAPACITY_FULL sched domain flag whereas the 'sub-levels'
    would receive the already used SD_ASYM_CPUCAPACITY flag. This allows
    maintaining the current behaviour for asymmetric topologies, with
    misfit migration operating correctly on lower levels, if applicable,
    as any asymmetry is enough to trigger the misfit migration.
    The logic there relies on the SD_ASYM_CPUCAPACITY flag and does not
    relate to the full asymmetry level denoted by the sd_asym_cpucapacity
    pointer.
    
    Detecting the CPU capacity asymmetry is being based on a set of
    available CPU capacities for all possible CPUs. This data is being
    generated upon init and updated once CPU topology changes are being
    detected (through arch_update_cpu_topology). As such, any changes
    to identified CPU capacities (like initializing cpufreq) need to be
    explicitly advertised by corresponding archs to trigger rebuilding
    the data.
    
    Additional -dflags- parameter, used when building sched domains, has
    been removed as well, as the asymmetry flags are now being set directly
    in sd_init.
    Suggested-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Suggested-by: default avatarValentin Schneider <valentin.schneider@arm.com>
    Signed-off-by: default avatarBeata Michalska <beata.michalska@arm.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarValentin Schneider <valentin.schneider@arm.com>
    Reviewed-by: default avatarDietmar Eggemann <dietmar.eggemann@arm.com>
    Tested-by: default avatarValentin Schneider <valentin.schneider@arm.com>
    Link: https://lore.kernel.org/r/20210603140627.8409-3-beata.michalska@arm.com
    c744dc4a
topology.c 62.1 KB