【问题标题】:what does sched_feat macro in scheduler mean调度程序中的 sched_feat 宏是什么意思
【发布时间】:2012-10-08 22:59:38
【问题描述】:

下面的宏定义在./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 */

我无法理解它的作用。

【问题讨论】:

    标签: linux linux-kernel kernel


    【解决方案1】:

    sched_feat() 宏在调度程序代码中用于测试是否启用了某个调度程序功能。比如kernel/sched/core.c里面有一个sn-p的代码

    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”,这意味着上面 sn-p 中的!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,了解以前的代码更简单但效率不高。

    【讨论】:

    • 谢谢。有什么好的地方我可以阅读有关内核的实现特定细节。这会很有帮助。
    猜你喜欢
    • 2014-11-21
    • 2014-01-17
    • 2012-12-30
    • 1970-01-01
    • 2015-01-09
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多