Какой спинлок использовать в make_request? - PullRequest
2 голосов
/ 17 ноября 2011

Я пишу модуль ядра Linux, который предоставляет (виртуальное) блочное устройство (поэтому фактический аппаратный IO не выполняется).

В настоящее время я использую spin_lock_irqsave / spin_unlock_irqrestore для обработки блокировок.

В непроцессном контексте работает только одна функция, и это функция make_request блочного устройства.

Безопасно ли использовать spin_lock_bh / spin_unlock_bh для обработки блокировок?Я предполагаю, что простого spin_lock недостаточно, поскольку make_request не запускается процессом (это правильно?).

Заранее спасибо.

1 Ответ

2 голосов
/ 18 ноября 2011

Ваша функция make_request действительно выполняется в контексте процесса. Единственный вызывающий q->make_request_fn - это generic_make_request() уровня блока, который предполагает контекст процесса (например, посмотрите, как он использует current). И как еще один пример, drivers / md / md.c имеет md_make_request(), который явно спит в очереди ожидания.

Таким образом, вы полностью безопасны, используя обычный spin_lock() / spin_unlock(), если весь остальной код также является контекстом процесса.

...