schedule()を呼び出すことができませんハードウェア割り込みからですか? たとえば、scheduler_tick()からschedule()を直接にコールすることはできません。代わりにneed_reschedフラグを使用する必要がありますか?schedule()をハードウェア割り込みから直接呼び出すことができないのはなぜですか?
私は答えを探してみましたが、手が空いてきました。どんな助けでも大歓迎です。
schedule()を呼び出すことができませんハードウェア割り込みからですか? たとえば、scheduler_tick()からschedule()を直接にコールすることはできません。代わりにneed_reschedフラグを使用する必要がありますか?schedule()をハードウェア割り込みから直接呼び出すことができないのはなぜですか?
私は答えを探してみましたが、手が空いてきました。どんな助けでも大歓迎です。
スケジューリングはタイマー割り込みで発生します。基本的なルールは、一度に1つの割り込みしか開くことができないため、「デバイスXからのデータを取得しました」割り込みでスリープ状態になると、タイマー割り込みを実行してそれをスケジューリングすることはできません。
割り込みも何度も重複して発生します。あなたは "持っているデータ"割り込みをスリープ状態にしてから、より多くのデータを取得するとどうなりますか?それは、キャッチオールルールが、割り込みで眠っていないということを十分に混乱させる(そして壊れやすい)。あなたはそれを間違えます。
割り込みを処理するスピンロックを持つCPUを考えてみましょう。あなたがschedule()を実行すると、CPUを使わないスピンロック所有者の不変量に違反します。ほとんどの場合、スピンロックは割り込みを無効にしないことに注意してください。割り込みハンドラに関連するロックがあり、そのような場合にはspin_lock_irqおよび/またはspin_lock_irqsaveが使用されることがあります。