14. 英特尔硬件上用于调度的硬件反馈接口¶
14.1. 概述¶
英特尔在《英特尔 64 和 IA-32 架构软件开发人员手册》(英特尔 SDM)第 3 卷第 14.6 节中描述了硬件反馈接口 (HFI) [1]。
HFI 为操作系统提供了系统中每个 CPU 的性能和能效能力数据。Linux 可以使用来自 HFI 的信息来影响任务放置决策。
14.2. 硬件反馈接口¶
硬件反馈接口向操作系统提供有关系统中每个 CPU 的性能和能效信息。每个能力都以无单位的数量表示,范围为 [0-255]。较高的值表示较高的能力。能效和性能在单独的能力中报告。即使在某些系统上,这两个指标可能相关,但在英特尔 SDM 中,它们被指定为独立的能力。
这些能力可能会因系统运行条件的变化或外部因素的作用而在运行时发生变化。这些能力更新的速率特定于每个处理器型号。在某些型号上,能力在启动时设置且永远不会更改。在其他型号上,能力可能会每几十毫秒更改一次。例如,可以使用远程机制来降低热设计功耗。这种变化可以反映在 HFI 中。同样,如果系统因过热而需要节流,HFI 可能会反映特定 CPU 的性能降低。
内核或用户空间策略守护程序可以使用这些能力来修改任务放置决策。例如,如果给定逻辑处理器的性能或能量能力变为零,则表示硬件建议操作系统不要出于性能或能效原因在该处理器上调度任何任务。
14.3. Linux 的实现细节¶
处理热事件中断的基础结构有两个部分。在 CPU 的本地 APIC 的本地向量表中,存在一个用于热监控寄存器的寄存器。此寄存器控制当热监控器生成中断时如何将中断传递给 CPU。更多详细信息可以在英特尔 SDM 第 3 卷第 10.5 节中找到 [1]。
热监控器可以为每个 CPU 或每个封装生成中断。HFI 生成封装级中断。此监控器通过一组特定于机器的寄存器进行配置和初始化。具体来说,HFI 中断和状态分别通过 IA32_PACKAGE_THERM_INTERRUPT 和 IA32_PACKAGE_THERM_STATUS 寄存器中的指定位进行控制。每个封装存在一个 HFI 表。更多详细信息可以在英特尔 SDM 第 3 卷第 14.9 节中找到 [1]。
硬件在更新 HFI 表后发出 HFI 中断,并准备好让操作系统使用它。CPU 通过本地 APIC 的本地向量表中的热条目接收此类中断。
在处理此类中断时,HFI 驱动程序会解析更新后的表,并使用热通知框架将更新中继到用户空间。鉴于每秒可能存在许多 HFI 更新,中继到用户空间的更新以 CONFIG_HZ jiffies 的速率进行限制。