Linux spin_lock против NT KeAcquireSpinLock - PullRequest
       54

Linux spin_lock против NT KeAcquireSpinLock

6 голосов
/ 15 октября 2011

Из того, что я могу собрать:

  • NT KeAcquireSpinLock эквивалентно spin_lock_bh: один повышает IRQL до DISPATCH_LEVEL, другой маскирует прерывания нижней половины - функционально то же самое. В то время как вариант NT сохраняет OldIrql, вариант Linux, похоже, нигде не хранит «wereInterruptsAlreadyMasked». Означает ли это, что spin_unlock_bh всегда их разоблачает?
  • NT KeAcquireInterruptSpinLock похоже на spin_lock_irqsave.

Что такое NT-эквивалент spin_lock?

Если spin_unlock_bh всегда демаскирует прерывания (в NT-говорит, всегда сбрасывает IRQL до spin_lock сродни KeAcquireSpinLockAtDpcLevel?

1 Ответ

2 голосов
/ 16 октября 2011

Необработанный spin_lock может использоваться, когда вы не знаете, что прерывания или нижние половины когда-либо будут бороться за блокировку. Избегая маскирования прерываний, вы уменьшаете задержку прерывания, в то же время избегая накладных расходов на мьютекс для критических секций, достаточно коротких для вращения.

На практике они, по-видимому, в основном используются такими вещами, как драйверы файловой системы, для блокировки структур внутреннего кэша и другими вещами, в которых нет необходимости блокировать ввод-вывод при удержании блокировки. Поскольку задние половины и прерывания драйвера никогда не касаются драйвера FS напрямую, нет необходимости маскировать прерывания.

Я подозреваю, что эквивалент Windows будет CRITICAL_SECTION, или каким-либо другим эквивалентом API ядра NT; однако, в отличие от критической секции NT, спин-блокировки Linux не возвращаются к мьютексу, когда утверждаются; они просто вращаются.

И, да, spin_unlock_bh безусловно восстанавливает нижние половины. Вы можете либо отслеживать, когда включать / отключать вручную (поскольку вы обычно должны снимать блокировки в обратном порядке получения, это обычно не проблема), либо просто прибегнуть к spin_lock_irqsave.

...