У меня есть драйвер устройства, с которым я работаю, который имеет общий ресурс между ISR (точнее, нижней половиной ISR) и вызовом read()
.
ISR ничего не делает, кроме как звонит schedule_work()
, чтобы получить нижнюю половину для выполнения тяжелой работы. Ресурс распределяется между read()
(то есть пользовательским контекстом) и функцией, которая реализует нижнюю половину, поэтому я блокирую с spin_lock_bh()
.
Чего я не понимаю, так это механики блокировки. Скажем, кто-то в данный момент удерживает блокировку, что происходит, когда ISR достигает schedule_work()
(то есть аппаратное прерывание сработало, пока мы удерживали блокировку)? Работы по-прежнему планируются, а затем выполняются позднее или же они падают на пол? Другими словами ... что на самом деле «заблокировано» или предотвращено (то есть очередь работ или выполнение работы)? Обновляется ли рабочая очередь?
Чтобы противопоставить мой вопрос, я понимаю, что, если бы я использовал spin_lock_irqsave()
, ISR был бы отключен, удерживая блокировку, поэтому я бы не получил schedule_work()
, во-первых, но учитывая, как ресурс поделился, я не думаю, что мне нужно или не нужно отключать аппаратные прерывания при удержании блокировки.