调度程序中的 sched_feat 宏是什么意思

Ama*_*tam 3 linux kernel linux-kernel

下面的宏定义在./kernel/sched/sched.h

#define sched_feat(x) (static_branch_##x(&sched_feat_keys[__SCHED_FEAT_##x]))
#else /* !(SCHED_DEBUG && HAVE_JUMP_LABEL) */
#define sched_feat(x) (sysctl_sched_features & (1UL << __SCHED_FEAT_##x))
#endif /* SCHED_DEBUG && HAVE_JUMP_LABEL */
Run Code Online (Sandbox Code Playgroud)

我无法理解它扮演什么角色。

Rol*_*and 5

sched_feat()宏在调度程序代码中用于测试是否启用了某个调度程序功能。例如,在 中kernel/sched/core.c,有一段代码

int mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner)
{
        if (!sched_feat(OWNER_SPIN))
                return 0;
Run Code Online (Sandbox Code Playgroud)

它正在测试是否设置了“如果互斥体所有者正在运行,则在互斥体获取时旋转等待”功能。您可以在 中看到调度程序功能的完整列表,kernel/sched/features.h但简短的总结是它们是可在运行时设置的可调参数,无需通过 重建内核/sys/kernel/debug/sched_features

例如,如果您没有更改系统上的默认设置,您将在 中看到“OWNER_SPIN” /sys/kernel/debug/sched_features,这意味着!sched_feat(OWNER_SPIN)上面代码段中的 计算结果为 false,并且调度程序代码将继续进入 中的其余代码mutex_spin_on_owner()

您部分复制的宏定义比您预期的更复杂的原因是,它在可用且需要时使用跳转标签功能,以消除频繁运行的调度程序代码路径中这些条件测试的开销。(跳转标签版本仅HAVE_JUMP_LABEL在配置中设置时使用,原因显而易见,并且在SCHED_DEBUG设置时使用,否则调度程序功能位无法在运行时更改)您可以点击上面的链接访问 lwn.net 了解更多详细信息,但简而言之,跳转标签是一种使用运行时二进制修补来使标志的条件测试便宜得多的方法,但代价是使更改标志变得更加昂贵。

您还可以查看引入跳转标签使用的调度程序提交,以了解代码如何变得更简单但效率不那么高。