Решение проблемы Spinlock

В драйверах устройств Linux. Когда он вводит спин-блокировки, он дает следующий пример:

Ваш драйвер выполняется и только что снял блокировку, которая контролирует доступ к его устройству. Пока блокировка удерживается, устройство выдает прерывание, которое вызывает запуск вашего обработчика прерываний. Обработчик прерываний, прежде чем получить доступ к устройству, также должен получить блокировку. Удаление спин-блокировки в обработчике прерываний - законная вещь; это одна из причин того, что операции спин-блокировки не спят. Но что произойдет, если подпрограмма прерывания выполняется в том же процессоре, что и код, который первоначально снял блокировку? Пока обработчик прерываний вращается, непрерывный код не сможет работать, чтобы снять блокировку. Этот процессор будет вращаться вечно.

Как решить эту проблему? Используя семафоры? Пожалуйста помоги.

1 ответ

Решение

Ты используешь spin_lock_irqsave из кода без прерываний, чтобы отключить аппаратные прерывания на текущем ядре, или использовать любой из инструментов, описанных в разделе "Альтернативы блокировке" в той же главе.

Изменить 0:

Не помню там точных деталей, но теория такова:

  • В системах UP вам не нужны спин-блокировки вообще - достаточно отключить прерывания из кода BH, который обращается к данным, передаваемым обработчикам прерываний.
  • В системах SMP вам нужна спин-блокировка для защиты от того же кода BH, выполняемого на других ядрах, и, если вы имеете дело с аппаратным обеспечением, вы также хотите отключить прерывания на том же ядре, чтобы избежать взаимоблокировки с процедурой IRQ.
  • Обработчику прерываний всегда нужно отключать прерывания, удерживая при этом любые блокировки, чтобы избежать взаимоблокировки с самим собой.

Надеюсь это поможет.

Другие вопросы по тегам