Я новичок в ядре, но из того, что я почерпнул из книги Роберта Лава "Разработка ядра Linux", если прерывания уже отключены на процессоре до того, как ваш код начинает блокироваться, при вызове spin_unlock_irq вы снимаете блокировку с ошибкой манера. Если вы сохраните флаги и отпустите их с флагами, функция spin_lock_irqsave просто вернет прерывание в предыдущее состояние.
Пример с spin_lock_irqsave
spinlock_t mLock = SPIN_LOCK_UNLOCK;
unsigned long flags;
spin_lock_irqsave(&mLock, flags); // save the state, if locked already it is saved in flags
// Critical section
spin_unlock_irqrestore(&mLock, flags); // return to the formally state specified in flags
Пример с spin_lock_irq
(без irqsave):
spinlock_t mLock = SPIN_LOCK_UNLOCK;
unsigned long flags;
spin_lock_irq(&mLock); // Does not know if already locked
// Critical section
spin_unlock_irq(&mLock); // Could result in an error unlock...