Почему в ядре Linux нет функции или макроса wait_event _..._ irqsave ()? - PullRequest
0 голосов
/ 24 июня 2019

В ядре Linux в include/linux/wait.h предусмотрена функция wait_event_lock_irq(wq_head, condition, lock), которая ожидает удержания lock и разблокирует / блокирует ее, используя spin_lock_irq() и spin_unlock_irq(). Есть ли конкретная причина, по которой что-то вроде wait_event_lock_irqsave(), использующее spin_lock_irqsave() / spin_lock_irqrestore(), не предоставлено?

1 Ответ

0 голосов
/ 24 июня 2019

spin_lock_irqsave() и spin_unlock_irqrestore() сохраняют и восстанавливают флаги состояния процессора «разрешены прерывания». Если вы знаете, что вы не работаете в контексте прерываний с включенными прерываниями, но вам нужно синхронизировать их с блокировками, взятыми в контексте прерываний, вы можете использовать spin_lock_irq() и spin_unlock_irq() для отключения и повторного включения прерываний без сохранения «включенных прерываний». "флаги состояния.

Макросы wait_event_...() должны никогда не вызываться из контекста прерывания (потому что они могут спать), поэтому для них безопасно предположить, что они не вызываются из контекста прерывания, поэтому существует нет необходимости сохранять флаги состояния процессора «включены прерывания». Обычные (не IRQ) макросы wait_event_...() также должны никогда не вызываться с отключенными прерываниями (опять же, потому что они могут спать), поэтому для них безопасно предположить, что прерывания не отключены. Конечно, макрос wait_event_..._lock_irq() вызывается с отключенными прерываниями, но они предполагают, что прерывания были включены до предыдущего вызова на spin_lock_irq() и что прерывания можно безопасно повторно включить.

...