Одна вещь, которую я заметил во многих проектах, это то, что люди, кажется, неправильно используют спин-блокировки, они привыкли вместо других примитивов блокировки, которые должны были использоваться.
Спин-блокировка linux существует только в многопроцессорных сборках (в однопроцессных сборках препроцессор блокировок определяется как пустые) спин-блокировки предназначены для краткосрочных блокировок на многопроцессорной платформе.
Если код не может получить спин-блокировку, он просто раскручивает процессор, пока блокировка не освободится. Таким образом, либо другой процесс, работающий на другом процессоре, должен освободить блокировку, либо, возможно, он может быть освобожден обработчиком прерывания, но механизм события ожидания является гораздо лучшим способом ожидания прерывания.
Примитив irqsave spinlock - это аккуратный способ отключения / включения прерываний, чтобы драйвер мог заблокировать обработчик прерываний, но это следует проводить только достаточно долго, чтобы процесс обновлял некоторые переменные, используемые совместно с обработчиком прерываний, если вы отключите перехваты вы не собираетесь планировать.
Если вам нужно заблокировать обработчик прерываний, используйте спин-блокировку с irqsave.
Для общей блокировки ядра вы должны использовать API mutex / семафор, который будет спать в блокировке, если потребуется.
Чтобы заблокировать код, запущенный в других процессах, используйте muxtex / семафор
Чтобы заблокировать код, работающий в контексте прерывания, используйте irq save / restore или spinlock_irq save / restore
Чтобы заблокировать код, запущенный на других процессорах, используйте спин-блокировки и избегайте длительного удержания блокировки.
Надеюсь, это поможет