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

标签 linux linux-kernel 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 */

我无法理解它的作用。

最佳答案

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;

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

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

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

您还可以查看 scheduler commit that introduced jump label use看看代码过去如何更简单但效率不高。

关于linux - 调度程序中的 sched_feat 宏是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790656/

相关文章:

linux - 查看 Linux 文件权限号

Linux I/O 重定向

copy_from_user函数打印垃圾值

windows - 如何静态获取Windows系统调用程序集?

android - Linux 下是 iwconfig,Android 下呢

linux - 如何在 Linux 中提取具有多种模式的行?

linux wake_up_interruptible() 无效

linux - 从内核模块读取 x86 MSR

android - 内核 bash 脚本编译错误

c - 如何在 linux 内核中以编程方式读取 linux 文件权限