Текущие реализации спин-блокировок используют два совершенно отдельных механизма для обеспечения взаимного исключения, один для работы с межпроцессорным исключением и один для работы с потоками локального процессора и обработчиками прерываний.
Существует сам spin_lock, который предназначен только для обеспечения взаимной блокировки между двумя или более ядрами процессора. Любой процессор, попавший в заблокированную спин-блокировку, в основном застревает до тех пор, пока ее не освободит другой процессор. Спин-блокировки не имеют смысла в однопроцессорных системах - кроме как для повышения вероятности полной взаимной блокировки - поэтому они обычно удаляются во время компиляции ядра.
Чтобы обеспечить мьютекс локального процессора, spin_lock () вызывает preempt_disable () (в системах с упреждающим планированием), чтобы предотвратить запуск любого другого потока, пока удерживается блокировка; аналогично spin_lock_irqsave () также делает эквивалент local_irq_save () для отключения прерываний, чтобы вообще ничего не запускать на локальном процессоре.
Как должно быть очевидно из вышесказанного, использование спиновых блокировок может привести к застреванию всей машины, поэтому спиновые блокировки следует использовать только в течение очень коротких периодов времени, и вы никогда не должны делать ничего, что могло бы вызвать перепланирование, удерживая блокировку.
Случай с mutex_lock совершенно другой - затрагиваются только потоки, пытающиеся получить доступ к блокировке, и если поток достигает заблокированного мьютекса, то происходит перепланирование. По этой причине mutex_locks нельзя использовать в прерываниях (или других элементарных) контекстах.