Может ли SoftIRQ предотвращать запуск того же SoftIRQ с ядром Linux?
Я работаю над улучшением производительности драйвера и должен рассмотреть возможность тупика. В контексте SoftIRQ, spin_lock будет удерживаться и защищать некоторую переменную. В этом случае я должен использовать spin_lock или spin_lock_bh? spin_lock_bh звучит как безопаснее, но у меня есть общий вопрос о реализации SoftIRQ.
- та же функция softIRQ может быть запланирована на том же процессоре во время выполнения SoftIRQ -> нам нужно использовать spin_lock_bh в SoftIRQ
- та же функция softIRQ может быть запланирована на другом процессоре, но не на том же процессоре -> мы можем использовать spin_lock в SoftIRQ
Что верно из приведенного выше утверждения?
1 ответ
Решение
Из Linux Kernel Development (2-е издание):
Softirq никогда не вытесняет другой softirq.
Причина проста: во время программного обеспечения softIRQ прерывания отключены.
Так что достаточно использовать обычный spin_lock()
в функции softIRQ.