Если бы вы использовали spin_lock()
в неперегрузочном ядре для защиты данных от обработчика прерываний, вы бы зашли в тупик (на однопроцессорной машине).
Если обработчик прерываний работает водругой код ядра удерживает блокировку, он будет вращаться вечно, поскольку обычный код ядра не сможет возобновить и снять блокировку.
Спин-блокировки могут использоваться только в том случае, если держатель блокировки всегда может работать до завершения.
Решением для блокировки, которая может потребоваться обработчику прерываний, является использование spin_lock_irqsave()
, которое отключает прерывания, пока удерживается спин-блокировка.С 1 процессором никакой обработчик прерываний не может работать, поэтому не будет тупиков.В smp обработчик прерываний может начать вращаться на другом процессоре, но поскольку процессор, удерживающий блокировку, не может быть прерван, блокировка в конечном итоге будет снята.