3

次のマクロはで定義されています./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 */

それがどのような役割を果たしているのか理解できません。

4

1 に答える 1

4

この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です。

たとえば、システムのデフォルト設定を変更していない場合は、に「OWNER_SPIN」と表示されます/sys/kernel/debug/sched_features。これは、!sched_feat(OWNER_SPIN)上記のスニペットのがfalseと評価され、スケジューラコードがの残りのコードに続くことを意味しますmutex_spin_on_owner()

部分的にコピーしたマクロ定義が予想よりも複雑である理由は、頻繁に実行されるスケジューラコードパスでこれらの条件付きテストのオーバーヘッドを排除するために、使用可能な場合はジャンプラベル機能を使用するためです。(ジャンプラベルバージョンはHAVE_JUMP_LABEL、明らかな理由で、が構成で設定されている場合にのみ使用さSCHED_DEBUGれます。そうでない場合、スケジューラ機能ビットは実行時に変更できないため、が設定されます)詳細については、上記のリンクをたどってlwn.netにアクセスしてください。しかし、一言で言えば、ジャンプラベルは、ランタイムバイナリパッチを使用してフラグの条件付きテストをはるかに安価にする方法ですが、フラグの変更ははるかに高価になります。

また、ジャンプラベルの使用を導入したスケジューラーコミットを調べて、コードが少し単純であったが、それほど効率的ではなかったことを確認することもできます。

于 2012-10-09T06:25:43.997 に答える