spin_lock_irqsave по сравнению с spin_lock_irq

На машине SMP мы должны использовать spin_lock_irqsave и нет spin_lock_irq от контекста прерывания.

Почему мы хотели бы сохранить флаги (которые содержат ЕСЛИ)?

Есть ли другая процедура прерывания, которая могла прервать нас?

26
задан psmears 26 November 2015 в 10:43
поделиться

1 ответ

Я новичок в ядре, но из того, что я почерпнул из книги Роберта Лава «Разработка ядра 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...
22
ответ дан 28 November 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: