1) Есть некий ресурс А, который в обработчике прерывания защищается спомощью spin_lock
2) К этому же ресурсу (А) имеет доступ код модуля работающий в котексте процесса и защищает его с помощью spin_lock_irqsave
3) Случается ситуация когда возникает прерывание на том же CPU что и взяло доступ к ресурсу А в контексте процесса (с помощью spin_lock_irqsave)
Не могу понять как такое может произойти ведь локальные прерывания заблокированы. Код детально изучен и с уверенность могу сказать: 1) что в контексте процесса для доступа к ресурсу А используется исключительно spin_lock_irqsave/spin_unlock_irqrestore; 2) прерывание возникает на том же процессоре что и взяло доступ к ресурсу с помощью spin_lock_irqsave
Есть некие предположения. Я использую вложенные (относительно spin_lock_irqsave(ресурс А)) спинлоки для доступа к другим ресурсам (скажем Б и В). Поскольку я не делаю доступ к этим ресурсам в контексте прерывания (я их использую в тасклетах) - доступ к ним я защищаю с помощью spin_lock_bh/spin_unlock_bh. Не может ли вызов spin_unlock_bh разрешить локальные прерывания?
Код: Выделить всё
func#1
spin_lock_irqsave(А)
func#2
spin_lock_bh(Б)
spin_unlock_bh(Б)
!!! С этих пор прерывания разрешены !!!
return
spin_unlock_irqrestore(А)
return