Важно, чтобы каждая блокировка была четко связана с тем, что она блокирует. Еще более важно — это защищать
struct foo блокируется с помощью блокировки foo_lock. С данной блокировкой также необходимо ассоциировать некоторые данные. Если к некоторым данным осуществляется доступ, то необходимо гарантировать, что этот доступ будет безопасным. Наиболее часто это означает, что перед тем, как осуществить манипуляции с данными, необходимо захватить соответствующую блокировку и освободить эту блокировку нужно после завершения манипуляций.Если точно известно, что прерывания разрешены, то нет необходимости восстанавливать предыдущее состояние системы прерываний. Можно просто разрешить прерывания при освобождении блокировки. В этом случае оптимальным будет использование функций spin_lock_irq()
spin_unlock_irq().spinlock_t mr_lock = SPIN_LOCK_UNLOCKED;
spin_lock_irq(&mr_lock) ;
/* критический участок ... */
spin_unlock_irq(&mr_lock);
Для любого участка кода очень сложно гарантировать, что прерывания всегда разрешены. В связи с этим не рекомендуется использовать функцию spinlock_irq()
Параметр конфигурации ядра CONFIG_DEBUG_SPINLOCK
Другие средства работы со спин-блокировками
Функция spin_lock_init()
spinlock_t, к которой нет прямого доступа, а есть только указатель на нее).Функция spin_try_lock()
spin_is_locked() возвращает ненулевое значение, если блокировка в данный момент захвачена. В противном случае возвращается нуль. Эта функция никогда не захватывает блокировку[48].В табл. 9.3 приведен полный список функций работы со спин-блокировками.
Таблица 9.3
. Список функций работы со спин-блокировками