На машине SMP мы должны использовать spin_lock_irqsave
и нет spin_lock_irq
от контекста прерывания.
Почему мы хотели бы сохранить флаги (которые содержат ЕСЛИ)?
Есть ли другая процедура прерывания, которая могла прервать нас?
Я новичок в ядре, но из того, что я почерпнул из книги Роберта Лава «Разработка ядра 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...