#c #linux #linux-kernel
#c #linux #linux-ядро
Вопрос:
Я читал о том, как спин-блокировки для hardirq и softirq.
Это документы: https://www.kernel.org/doc/htmldocs/kernel-locking/hardirq-context.html
Я понимаю, что локальное прерывание отключено, чтобы предотвратить бесконечное вращение hardirq (обработчика прерываний) и никогда не давать softirq шанса, из среды UP и, возможно, если оба расположены в локальном процессоре, если SMP.
Однако я не понимаю, что означает «во-вторых, критическая область может быть введена аппаратным прерыванием на другом процессоре».
Может ли hardirq, запущенный с другого процессора, потенциально зайти в тупик? Если да, то как?
Комментарии:
1. «Может ли hardirq, запущенный с другого процессора, потенциально зайти в тупик?» — Нет, при правильной блокировке он не может зайти в тупик. Правильная блокировка описана в документах, на которые вы ссылаетесь: вызовы
spin_lock_irq
softirq , вызовы hardirq либоspin_lock
илиspin_lock_irq
.2. @Tsyvarev Я конкретно говорю о том, как spin_lock_irq спасет меня от hardirq, запущенного с другого процессора, когда весь код — это отключить локальное прерывание? также я считаю, что вся строка прерывания для обработчика уже отключена при вводе, так что в любом случае все спорно? Мой вопрос заключался в том, что означало это предложение в документе.
3. «Я полагаю, что вся строка прерываний для обработчика уже отключена при вводе» — при
spin_lock_irq
отключении прерываний только на текущем процессоре . Таким образом, прерывания могут возникать на других процессорах.4. @Tsyvarev хм… Я где-то читал, что строки прерываний автоматически маскируются до тех пор, пока обработчик прерываний не завершит и не включит их на выходе.. Итак, у меня создалось впечатление, что обработчики прерываний с того же номера irq не должны запускаться с других процессоров.
5. Если два жестких обработчика IRQ, работающих на разных процессорах (возможно, выполняющих одну и ту же процедуру IRQ или, возможно, выполняющих разные процедуры IRQ), используют одну и ту же спин-блокировку, тогда им необходимо вызвать
spin_lock_irqsave
andspin_unlock_irqrestore
. В противном случае им нужно только вызватьspin_lock
andspin_unlock
.