调度程序代码中使用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,以了解更多信息细节,但是简而言之,跳转标签是一种使用运行时二进制修补程序使标志的条件测试便宜得多的方法,但代价是使标志的更改更加昂贵.