Может ли 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

Что верно из приведенного выше утверждения?


person Owen Kwon    schedule 13.01.2017    source источник


Ответы (1)


Из разработка ядра Linux (2-е издание):

Программное прерывание никогда не вытесняет другое программное прерывание.

Причина проста: во время softIRQ программные прерывания отключены.

Поэтому достаточно использовать обычный spin_lock() в функции softIRQ.

person Tsyvarev    schedule 14.01.2017