• D
    Revert "cpufreq: schedutil: Don't restrict kthread to related_cpus unnecessarily" · 1b04722c
    Dietmar Eggemann 提交于
    This reverts commit e2cabe48.
    
    Lifting the restriction that the sugov kthread is bound to the
    policy->related_cpus for a system with a slow switching cpufreq driver,
    which is able to perform DVFS from any cpu (e.g. cpufreq-dt), is not
    only not beneficial it also harms Enery-Aware Scheduling (EAS) on
    systems with asymmetric cpu capacities (e.g. Arm big.LITTLE).
    
    The sugov kthread which does the update for the little cpus could
    potentially run on a big cpu. It could prevent that the big cluster goes
    into deeper idle states although all the tasks are running on the little
    cluster.
    
    Example: hikey960 w/ 4.16.0-rc6-+
             Arm big.LITTLE with per-cluster DVFS
    
    root@h960:~# cat /proc/cpuinfo | grep "^CPU part"
    CPU part        : 0xd03 (Cortex-A53, little cpu)
    CPU part        : 0xd03
    CPU part        : 0xd03
    CPU part        : 0xd03
    CPU part        : 0xd09 (Cortex-A73, big cpu)
    CPU part        : 0xd09
    CPU part        : 0xd09
    CPU part        : 0xd09
    
    root@h960:/sys/devices/system/cpu/cpufreq# ls
    policy0  policy4  schedutil
    
    root@h960:/sys/devices/system/cpu/cpufreq# cat policy*/related_cpus
    0 1 2 3
    4 5 6 7
    
    (1) w/o the revert:
    
    root@h960:~# ps -eo pid,class,rtprio,pri,psr,comm | awk 'NR == 1 ||
    /sugov/'
      PID CLS RTPRIO PRI PSR COMMAND
      1489 #6      0 140   1 sugov:0
      1490 #6      0 140   0 sugov:4
    
    The sugov kthread sugov:4 responsible for policy4 runs on cpu0. (In this
    case both sugov kthreads run on little cpus).
    
    cross policy (cluster) remote callback example:
    ...
    migration/1-14 [001] enqueue_task_fair: this_cpu=1 cpu_of(rq)=5
    migration/1-14 [001] sugov_update_shared: this_cpu=1 sg_cpu->cpu=5
                         sg_cpu->sg_policy->policy->related_cpus=4-7
      sugov:4-1490 [000] sugov_work: this_cpu=0
                         sg_cpu->sg_policy->policy->related_cpus=4-7
    ...
    
    The remote callback (this_cpu=1, target_cpu=5) is executed on cpu=0.
    
    (2) w/ the revert:
    
    root@h960:~# ps -eo pid,class,rtprio,pri,psr,comm | awk 'NR == 1 ||
    /sugov/'
      PID CLS RTPRIO PRI PSR COMMAND
      1491 #6      0 140   2 sugov:0
      1492 #6      0 140   4 sugov:4
    
    The sugov kthread sugov:4 responsible for policy4 runs on cpu4.
    
    cross policy (cluster) remote callback example:
    ...
    migration/1-14 [001] enqueue_task_fair: this_cpu=1 cpu_of(rq)=7
    migration/1-14 [001] sugov_update_shared: this_cpu=1 sg_cpu->cpu=7
                         sg_cpu->sg_policy->policy->related_cpus=4-7
      sugov:4-1492 [004] sugov_work: this_cpu=4
                         sg_cpu->sg_policy->policy->related_cpus=4-7
    ...
    
    The remote callback (this_cpu=1, target_cpu=7) is executed on cpu=4.
    
    Now the sugov kthread executes again on the policy (cluster) for which
    the Operating Performance Point (OPP) should be changed.
    It avoids the problem that an otherwise idle policy (cluster) is running
    schedutil (the sugov kthread) for another one.
    Signed-off-by: NDietmar Eggemann <dietmar.eggemann@arm.com>
    Acked-by: NViresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
    1b04722c
cpufreq_schedutil.c 18.7 KB