description/scheduler: Capacity Asymmetry Detection

This commit is contained in:
Cheng Jian
2022-05-01 16:10:48 +08:00
parent 4e99d8b5fd
commit ed8c7efa2c
+62 -7
View File
@@ -1691,18 +1691,58 @@ EAS 主线合入的特性时间线: [EAS Development for Mainline Linux](https:/
在整个调度域过载(sd->overutilized) 的时候, 内核将禁用 EAS, 选择使用 CAS 来作为异构平台的首选调度器. CAS 的思路很简单, 通过 task_fits_capacity() 判断当前调度域或者 CPU 的 capacity 是否能满足当前进程的要求, 然后尽可能为进程选择 capacity 满足要求的 CPU.
#### 7.2.4.1 Capacity Asymmetry Detection
-------
CAS 特性是通过 STATIC_KEY sched_asym_cpucapacity 控制的.
EAS 特性是通过 STATIC_KEY sched_energy_present 控制的.
#### 7.2.4.1 Capacity Asymmetry Detection
-------
* 显式指定的 SD_ASYM_CPUCAPACITY 标记 @4.9
v4.9 [sched: Clean-ups and asymmetric cpu capacity support](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=3273163c6775c4c21823985304c2364b08ca6ea2) 为增加了系统对 AMP 架构的支持. 这是一次最基础的尝试. 引入了 SD_ASYM_CPUCAPACITY 标记那些具有不同 capacity 的 sched_domain, 并且完成了 WAKEUP 路径的 capacityt aware. 允许 SD_ASYM_CPUCAPACITY 域内做 SD_BALANCE_WAKE, 并且 wake_affine 时引入了 wake_cap() 检查是否满足其 capacity. 但是这个实现是非常基础的, SD_ASYM_CPUCAPACITY 标记需要在 (Android 的) DTB 中显式设置.
* set SD_ASYM_CPUCAPACITY automatically & STATIC_KEY sched_asym_cpucapacity @4.20
v4.20 [sched/topology: Set SD_ASYM_CPUCAPACITY flag automatically](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=e1799a80a4f5a463f252b7325da8bb66dfd55471) 实现了系统启动后自动识别当前系统是否是 AMP 架构(具有相同架构, 但是 CPU 具有不同 capacity 或者微架构), 并在合适的 sched_domain 域内设置 SD_ASYM_CPUCAPACITY.
1. 启动过程中 [build_sched_domains() 时](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=05484e0984487d42e97c417cbb0697fa9d16e7e9), 先通过 asym_cpu_capacity_level() 检查到具有不同 capacity 的[那层调度域层级 tl_asym](https://elixir.bootlin.com/linux/v4.20/source/kernel/sched/topology.c#L1721), 然后所有属于这个层级的调度域都会被[标记上 SD_ASYM_CPUCAPACITY](https://elixir.bootlin.com/linux/v4.20/source/kernel/sched/topology.c#L1732). 通过这种方式使得系统具备了自动识别 SD_ASYM_CPUCAPACITY 的能力.
2. 如果 [CPU 的 capacity 发生了变化](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bb1fbdd3c3fd12b612c7d8cdf13bd6bfeebdefa3), 可能会使得 AMP 架构发生一些变化, 此时则会通过 update_topology_flags_work 重新构建调度域. 这一功能同时支持了 [ARM](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e1799a80a4f5a463f252b7325da8bb66dfd55471) 和 [ARM64](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3ba09df4b8b6e3f01ed6381e8fb890840fd0bca3).
紧随其后, [commit df054e8445 ("sched/topology: Add static_key for asymmetric CPU capacity optimizations")](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=df054e8445a4011e3d693c2268129c0456108663) 借助 capacity asymmetry detection 引入了 [has_asym 标记](https://elixir.bootlin.com/linux/v4.20/source/kernel/sched/topology.c#L1733)和 [STATIC_KEY sched_asym_cpucapacity](https://elixir.bootlin.com/linux/v4.20/source/kernel/sched/topology.c#L1787), 用来标记 AMP 系统, 并使能适合 AMP 系统的调度策略.
* Advance SD_ASYM_CPUCAPACITY @5.14
当前版本 asym_cpu_capacity_level 存在几个问题.
1. 只能支持到最低的拓扑级别, 对全局的拓扑域不可见.
2. 不支持 NUMA 级别的异构, 因为初始化 NUMA 级别的 sd_numa_mask 中不包含其他 NODE, 最终 sched_domain_span 是在构建调度域的时候进行的更新的.
这对于大多数现有的不对称设计很实用, 但是却不支持普适的 AMP 架构. 这可能不是最好的方法, 在稍微高一些层级调度域可能看不到任何不对称. 这对于不合适的迁移和能效感知的迁移都可能会有问题. 因此, 对于受影响的平台, 它可能导致对唤醒和 CPU 选择路径的自定义更改.
因此 v5.14-rc1 [Rework CPU capacity asymmetry detection](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=adf3c31e18b765ea24eba7b0c1efc076b8ee3d55) 修改了执行非对称检测的方式, 允许将非对称拓扑级别固定在最低的拓扑级别上, 在最低的拓扑级别上, 给定调度域中的所有 CPU 都可以看到整个 CPU 容量范围. asym_cpu_capacity_level 还将跟踪那些观察到任何非对称范围的级别, 以使用 SD_ASYM_CPUCAPACITY 标志表示相应的调度域, 并为这些域启用不匹配迁移. 为了区分局部和全范围 CPU 容量不对称的调度域, 引入了新的调度域标志: SD_ASYM_CPUCAPACITY_FULL.
[asym_cpu_capacity_scan()](https://elixir.bootlin.com/linux/v5.16/source/kernel/sched/topology.c#L2349) -=> asym_cpu_capacity_update_data() 更新和维护了当前 AMP 系统的 capacity 多样性, capacity 的各类值[存储在链表 asym_cap_list](https://elixir.bootlin.com/linux/v5.16/source/kernel/sched/topology.c#L1343), 包含各类 capacity 全集的 CPU 集合存储在 cpu_capacity_span(entry) 的闭包中.
```cpp
sched_init_domains()
-=> arch_update_cpu_topology()
-=> asym_cpu_capacity_scan()
-=> asym_cpu_capacity_update_data()
-=> build_sched_domains()
```
[sd_init 初始化构建调度域](https://elixir.bootlin.com/linux/v5.16/source/kernel/sched/topology.c#L1581)时, [asym_cpu_capacity_classify()](https://elixir.bootlin.com/linux/v5.16/source/kernel/sched/topology.c#L1304) 就依据 asym_cap_list 和对应 entry 的 cpu_capacity_span 来决策当前调度域的 ASYM 标记, 系统中所有包含了不同 capacity 的 异构 CPU 的调度域层级[都会被标记为 SD_ASYM_CPUCAPACITY](https://elixir.bootlin.com/linux/v5.16/source/kernel/sched/topology.c#L1330), 表明这是一个异构的调度域, 包含的 CPU 具有不同的 capacity. 包含了系统中所有 capacity 类型的调度域会[被标记为 SD_ASYM_CPUCAPACITY_FULL](https://elixir.bootlin.com/linux/v5.16/source/kernel/sched/topology.c#L1333), 表明这个调度域层级下 CPU capacity 的种类是全系统 CPU capacity 的全集.
| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 |
|:----:|:----:|:---:|:---:|:----------:|:----:|
| 2016/07/25 | Morten Rasmussen <morten.rasmussen@arm.com> | [sched/core: Introduce SD_ASYM_CPUCAPACITY sched_domain topology flag](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1f6e6c7cb9bcd58abb5ee11243e0eefe6b36fc8e) | [sched: Clean-ups and asymmetric cpu capacity support/PART 1](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=3273163c6775c4c21823985304c2364b08ca6ea2) 是调度器 Capacity Awareness 的第一次尝试. 当前补丁新增了 SD_ASYM_CPUCAPACITY 用来标记那些 AMP 架构下 CPU 具有不同 capacity 的 sched_domain. | v3 ☑✓ 4.9-rc1 | [LORE v3,0/13](https://lore.kernel.org/all/1469453670-2660-1-git-send-email-morten.rasmussen@arm.com), [关注 COMMIT](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1f6e6c7cb9bcd58abb5ee11243e0eefe6b36fc8e) |
| 2018/07/20 | Morten Rasmussen <morten.rasmussen@arm.com> | [sched/topology: Set SD_ASYM_CPUCAPACITY flag automatically](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=e1799a80a4f5a463f252b7325da8bb66dfd55471) | 1532093554-30504-1-git-send-email-morten.rasmussen@arm.com | v1 ☑✓ 4.20-rc1 | [LORE v1,0/4](https://lore.kernel.org/all/1532093554-30504-1-git-send-email-morten.rasmussen@arm.com) |
| 2019/10/23 | Valentin Schneider <valentin.schneider@arm.com> | [sched/topology: Asymmetric topologies fixes](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=e284df705cf1eeedb5ec3a66ed82d17a64659150) | 允许 sched_asym_cpucapacity 被 disable.<br>[sched_asym_cpucapacity 默认是关闭](https://elixir.bootlin.com/linux/v5.16/source/kernel/sched/topology.c#L651)的, 但是启动过程中 [build_sched_domains()](https://elixir.bootlin.com/linux/v5.16/source/kernel/sched/topology.c#L2271) 如果识别当前系统是大小核异构(比如 ARM big.LITTLE 等)的系统, 就会[标记 has_asym](https://elixir.bootlin.com/linux/v5.16/source/kernel/sched/topology.c#L2220), 然后把 STATIC_KEY sched_asym_cpucapacity 开启, 但一旦打开, 它将永远保持启用状态. 这意味着, 如果我们从一个非对称系统开始, 热插拔出足够多的 CPU, 最终得到一个 SMP 系统, sched_asym_cpucapacity 依旧将保持开启状态, 这显然是错误的. 应该检测到这一点, 并关闭不匹配迁移和容量感知唤醒等功能. 这个补丁就完成了这个功能. | v4 ☑✓ 5.4-rc6 | [LORE v4,0/2](https://lore.kernel.org/all/20191023153745.19515-1-valentin.schneider@arm.com) |
| 2021/06/03 | Valentin Schneider | [Rework CPU capacity asymmetry detection](https://lore.kernel.org/patchwork/cover/1424708) | 当前版本 asym_cpu_capacity_level 存在几个问题.<br>1. 只能支持到最低的拓扑级别, 对全局的拓扑域不可见.<br>2. 不支持 NUMA 级别的异构, 因为初始化 NUMA 级别的 sd_numa_mask 中不包含其他 NODE, 最终 sched_domain_span 是在构建调度域的时候进行的更新的.<br>这对于大多数现有的不对称设计很实用, 但是却不支持普适的性能异构架构.这可能不是最好的方法, 在一些领域可能看不到任何不对称. 这对于不合适的迁移和能量感知的安置可能会有问题. 因此, 对于受影响的平台, 它可能导致对唤醒和 CPU 选择路径的自定义更改.<br>这组补丁修改了执行非对称检测的方式, 允许将非对称拓扑级别固定在最低的拓扑级别上, 在最低的拓扑级别上, 给定调度域中的所有 CPU 都可以看到整个 CPU 容量范围. asym_cpu_capacity_level 还将跟踪那些观察到任何非对称范围的级别, 以使用 SD_ASYM_CPUCAPACITY 标志表示相应的调度域, 并为这些域启用不匹配迁移. 为了区分局部和全范围 CPU 容量不对称的调度域, 引入了新的调度域标志: SD_ASYM_CPUCAPACITY_FULL. | v7 ☑ 5.14-rc1 | [PatchWork v1](https://lore.kernel.org/patchwork/cover/1414557)<br>*-*-*-*-*-*-*-* <br>[PatchWork v7](https://lore.kernel.org/all/20210603140627.8409-1-beata.michalska@arm.com) |
| 2021/06/03 | Valentin Schneider | [Rework CPU capacity asymmetry detection](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=adf3c31e18b765ea24eba7b0c1efc076b8ee3d55) | 当前版本 asym_cpu_capacity_level 存在几个问题.<br>1. 只能支持到最低的拓扑级别, 对全局的拓扑域不可见.<br>2. 不支持 NUMA 级别的异构, 因为初始化 NUMA 级别的 sd_numa_mask 中不包含其他 NODE, 最终 sched_domain_span 是在构建调度域的时候进行的更新的.<br>这对于大多数现有的不对称设计很实用, 但是却不支持普适的性能异构架构.这可能不是最好的方法, 在一些领域可能看不到任何不对称. 这对于不合适的迁移和能量感知的安置可能会有问题. 因此, 对于受影响的平台, 它可能导致对唤醒和 CPU 选择路径的自定义更改.<br>这组补丁修改了执行非对称检测的方式, 允许将非对称拓扑级别固定在最低的拓扑级别上, 在最低的拓扑级别上, 给定调度域中的所有 CPU 都可以看到整个 CPU 容量范围. asym_cpu_capacity_level 还将跟踪那些观察到任何非对称范围的级别, 以使用 SD_ASYM_CPUCAPACITY 标志表示相应的调度域, 并为这些域启用不匹配迁移. 为了区分局部和全范围 CPU 容量不对称的调度域, 引入了新的调度域标志: SD_ASYM_CPUCAPACITY_FULL. | v7 ☑ 5.14-rc1 | [LORE v1](https://lore.kernel.org/lkml/1618578085-29584-1-git-send-email-beata.michalska@arm.com)<br>*-*-*-*-*-*-*-* <br>[LORE v7](https://lore.kernel.org/all/20210603140627.8409-1-beata.michalska@arm.com) |
| 2022/04/27 | Vincent Donnefort <vincent.donnefort@arm.com> | [feec() energy margin removal](https://lore.kernel.org/all/20220427143304.3950488-1-vincent.donnefort@arm.com) | 20220427143304.3950488-1-vincent.donnefort@arm.com | v7 ☐☑✓ | [LORE v7,0/7](https://lore.kernel.org/all/20220427143304.3950488-1-vincent.donnefort@arm.com) |
@@ -1723,7 +1763,7 @@ EAS 特性是通过 STATIC_KEY sched_energy_present 控制的.
接着 v4.10 [sched: Clean-ups and asymmetric cpu capacity support](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=893c5d2279041afeb593f1fa8edd9d02edf5b7cb) 为调度器实现 Capacity Awareness 的时候, 针对 load_balance 路径做了优化.
在低利用率(low-utilization scenarios)的场景下, find_idlest_group() 中比较相对负载 runnable_load 和 avg_load 并不总是最优的选择. 在这些场景中, 如果系统组包含不同数量的 CPU 或不同计算能力的 CPU, 那么这时候考虑空闲容量, 系统的性能会明显优于只考虑相对负载的情况. 因此 [commit2 6a0b19c0f39a("sched/fair: Consider spare capacity in find_idlest_group()](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6a0b19c0f39a7a7b7fb77d3867a733136ff059a3) 实现了 find_idlest_group() 对剩余容量的考虑, 除了现有的基于负载的搜索之外, 如果有足够的空闲容量, 还会找到并选择一个[剩余容量最大的 sched_group most_spare_sg 作为备选](https://elixir.bootlin.com/linux/v4.10/source/kernel/sched/fair.c#L5489). 如果没有, 则保留现有的行为.
在低利用率(low-utilization scenarios)的场景下, find_idlest_group() 中比较相对负载 [avg_load](https://elixir.bootlin.com/linux/v4.10/source/kernel/sched/fair.c#L5459) 和 [runnable_load](https://elixir.bootlin.com/linux/v4.10/source/kernel/sched/fair.c#L5461) 并不总是最优的选择. 在这些场景中, 如果系统组包含不同数量的 CPU 或不同计算能力的 CPU, 那么这时候考虑空闲容量, 系统的性能会明显优于只考虑相对负载的情况. 因此 [COMMIT2 6a0b19c0f39a("sched/fair: Consider spare capacity in find_idlest_group()](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6a0b19c0f39a7a7b7fb77d3867a733136ff059a3) 实现了 find_idlest_group() 对剩余容量的考虑, 除了现有的基于负载的搜索之外, 如果有足够的空闲容量, 还会找到并选择一个[剩余容量最大的 sched_group most_spare_sg 作为备选](https://elixir.bootlin.com/linux/v4.10/source/kernel/sched/fair.c#L5489). 如果没有, 则保留现有的行为.
struct sched_group_capacity 当前表示 sched_group 内所有 CPU 的计算容量之和. 即使用它除以 group_weight 来得到每个 CPU 的平均容量, 它也隐藏了 AMP 系统中 CPU capacity 的差异(例如高 RT/IRQ 负载或 ARM big.LITTLE 架构). 因此 [commit bf475ce0a3dd ("sched/fair: Add per-CPU min capacity to sched_group_capacity")](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bf475ce0a3dd75b5d1df6c6c14ae25168caa15ac) 通过扩展 struct sched_group_capacity, 添加 min_capacity 字段以指示组中 CPU 的最小容量. 可以更容易地找到针对给定任务负载的合适 sched_group, 从而可以让高负载的任务避免使用容量较少的 CPU.
@@ -1750,13 +1790,28 @@ struct sched_group_capacity 当前表示 sched_group 内所有 CPU 的计算容
注意 v4.10 版本的 select_idle_capacity() 在 select_idle_sibling() 路径下是截断了 wake_affine 有限选择 prev 和 waker CPU 的逻辑的. 因此移除了 wake_cap() 将导致 wake_affine 的 capacity aware 缺失了对 prev 和 waker CPU 的优选. 这个问题在 v5.10 [commit b4c9c9f15649 ("sched/fair: Prefer prev cpu in asymmetric wakeup path")](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b4c9c9f15649c98a5b45408919d1ff4fd7f5531c) 被处理. select_idle_sibling() 中在优选 prev 以及 waker CPU 时必须保证它们能满足进程运行所需, 即 asym_fits_capacity(), 理所当然 [select_idle_capacity()](https://elixir.bootlin.com/linux/v5.10/source/kernel/sched/fair.c#L6285) 自然被移动到了优选 prev 以及 waker CPU 的处理后.
* Capacity Spare Wake in the slow path
早在 4.10 就发现在 AMP 系统下, load_balance 的时候只考虑 sched_group 的相对负载 runnable_load 和 avg_load, 而不考虑其 CPU capacity 的差异是非常不合适的. 当时扩展 struct sched_group_capacity, 引入 min_capacity 字段以指示组中 CPU 的最小容量. 从而可以让高负载的任务避免使用容量较少的 CPU. 参见 [sched: Clean-ups and asymmetric cpu capacity support/PART 2](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=893c5d2279041afeb593f1fa8edd9d02edf5b7cb). 引入了 [cpu_util_wake(cpu, p)](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=104cb16d9eb684f071d5bf3aa87c0d01af259b7c) 来记录进程 P 被唤醒后从 cpu 上被迁走的情况下, cpu 的剩余负载. 使用 capacity_spare_wake()] 则记录了 P 从 CPU 上迁走后, CPU 的剩余 capacity.
在 RT 和 IRQ 负载高的情况下, 我们选择的可能并不是选择一个合适的 sched_group. v4.16-rc1 [commit f453ae2200b0 ("sched/fair: Consider RT/IRQ pressure in capacity_spare_wake()")](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f453ae2200b0d1b7abc0c3794ce088899ac7a2af) 通过在 capacity_spare_wake() 中使用 capacity_of() 而不是 capacity_orig_of() 来修复这个问题.(与 capacity_orig_of() 不同的是 capacity_of() 刨去了 RT/DEADLINE/IRQ 的负载. 参见 [scale_rt_capacity()](https://elixir.bootlin.com/linux/v5.10/source/kernel/sched/fair.c#L8090).)
随后在 v4.20-rc1 实现 Misfit Task 的过程中, 又在 [struct sched_group_capacity 引入 max_capacity 字段](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e3d6d0cb66f2351cbfd09fbae04eb9804afe9577), 它被用来 update_sd_pick_busiest() 中用来判断[是否可以进行 PULL 操作](https://elixir.bootlin.com/linux/v4.20/source/kernel/sched/fair.c#L7992), 如果 local sched_group 不应该从 max_capacity 比自己还小的备选 busiest sched_group 中 PULL 任务过来.
随后有一些简单的重构, 参见:
v4.20-rc3 [sched/fair: Fix cpu_util_wake() for 'execl' type workloads](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c469933e772132aad040bd6a2adc8edf9ad6f825) 在处理 Unixbench execl 的性能劣化时, 重命名 cpu_util_wake() -=> cpu_util_without(), capacity_spare_wake() -=> capacity_spare_without().
v5.13-rc1 [commit 4aed8aa41524 ("sched/fair: Introduce a CPU capacity comparison helper")](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=4aed8aa41524a1fc6439171881c2bb7ace197528) 引入了 capacity_greater 替代了 group_smaller_min_cpu_capacity() 和 group_smaller_max_cpu_capacity().
| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 |
|:----:|:----:|:---:|:---:|:----------:|:----:|
| 2016/07/25 | Morten Rasmussen <morten.rasmussen@arm.com> | [sched: Clean-ups and asymmetric cpu capacity support/PART 1](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=3273163c6775c4c21823985304c2364b08ca6ea2) | NA | v3 ☑✓ 4.9-rc1 | [LORE v3,0/13](https://lore.kernel.org/all/1469453670-2660-1-git-send-email-morten.rasmussen@arm.com) |
| 2016/07/25 | Morten Rasmussen <morten.rasmussen@arm.com> | [sched: Clean-ups and asymmetric cpu capacity support/PART 1](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=3273163c6775c4c21823985304c2364b08ca6ea2) | 为调度器实现 Capacity Awareness. 这是一次最基础的尝试. 完成了 wakeup 路径的 capacityt aware. 允许 SD_ASYM_CPUCAPACITY 域内做 SD_BALANCE_WAKE, 并且 wake_affine 时引入了 wake_cap(). | v3 ☑✓ 4.9-rc1 | [LORE v3,0/13](https://lore.kernel.org/all/1469453670-2660-1-git-send-email-morten.rasmussen@arm.com) |
| 2016/10/14 | Morten Rasmussen <morten.rasmussen@arm.com> | [sched: Clean-ups and asymmetric cpu capacity support/PART 2](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=893c5d2279041afeb593f1fa8edd9d02edf5b7cb) | 本系列主要对任务唤醒路径进行了一些调整, 从而为调度器提供了 Capacity Aware 的能力, 该路径考虑了唤醒时的计算能力, 而不仅仅是 CPU 是否 IDLE 或者是不是 idlest. 这使我们在部分利用的情况下获得了一致且可能更高的吞吐量.<br>[COMMIT 1](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=104cb16d9eb684f071d5bf3aa87c0d01af259b7c) 修复了唤醒路径的任务利用率不准确的问题.<br>COMMIT 2-5 为调度器改善了 capacity awareness.<br>COMMIT 6 修复了注释. | v5 ☐☑✓ 4.10-rc1 | [LORE v5,0/6](https://lore.kernel.org/all/1476452472-24740-1-git-send-email-morten.rasmussen@arm.com) |
| 2020/02/06 | Valentin Schneider <valentin.schneider@arm.com> | [sched/fair: Capacity aware wakeup rework](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=000619680c3714020ce9db17eef6a4a7ce2dc28b) | 异构 CPU 上 wakeup 路径优化. 实现了 select_idle_capacity(), wakeup 进程时, 为进程选择 capacity 更合适的 CPU. | v4 ☑✓ 5.7-rc1 | [LORE v4,0/4](https://lore.kernel.org/all/20200206191957.12325-1-valentin.schneider@arm.com) |
| 2020/12/19 | Vincent Guittot <vincent.guittot@linaro.org> | [sched/fair: Prefer prev cpu in asymmetric wakeup path](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=b4c9c9f15649c98a5b45408919d1ff4fd7f5531c) | 异构 CPU 上 wakeup 路径倾向于使用 prev CPU | v1 ☑✓ 5.10-rc4 | [LORE v3](https://lore.kernel.org/all/20201029161824.26389-1-vincent.guittot@linaro.org) |
| 2017/12/14 | Joel Fernandes <joelaf@google.com> | [sched/fair: Consider RT/IRQ pressure in capacity_spare_wake](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f453ae2200b0d1b7abc0c3794ce088899ac7a2af) | NA | v2 ☐☑✓ | [LORE](https://lore.kernel.org/all/20171214212158.188190-1-joelaf@google.com) |
* Capacity Aware Fork