を使用している IRQ がありhandle_level_irq()
ます。ほとんどの場合、ISR は下位半分をスケジュールする必要がありますが、場合によっては、それが偽であると判断でき、(パフォーマンス上の理由から) 下位半分をスケジュールしたくない場合があります。問題は、後者の場合、競合状態が発生することです。ISR がスプリアスであると判断した場合、割り込みのマスクを解除し、終了する準備をします (desc->lock
この時点では、ISR は によって保護されていないことに注意してください)。handle_level_irq()
しかし、その後、2 番目の CPU で割り込みがトリガーされます。2 番目の CPU は、グラブに従ってdesc->lock
IRQ をマスクし、1 番目の CPU で ISR が進行中であると判断するため、ロックを解除desc->lock
して終了します。最初の CPU の元の ISR も終了し、割り込みは常にマスクされたままになります。
必要がない限り、下半分をスケジュールできないようにしたいので、上記の競合状態を回避しながら、ISR がマスクを解除する方法はありますか?