Может ли блокировка вращения блокироваться при прерывании с другого процессора при блокировке между hardirq и softirq?

#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 and spin_unlock_irqrestore . В противном случае им нужно только вызвать spin_lock and spin_unlock .