Я использовал spin_lock () для получения блокировки без отключения irq или softirqs
IRQ / SoftIRQ не имеет ничего общего с системными вызовами. Отключение IRQ или программных IRIR необходимо, когда защищенная структура данных потенциально может использоваться из контекста прерывания . Между прочим, существуют специальные spin_lock
-API, такие как spin_lock_bh()/spin_unlock_bh()
, spin_lock_irq()
/ spin_unlock_irq()
и др. c. Вы должны прочитать это руководство .
происходит ли переключение контекста?
Я не вижу ничего, чтобы остановить это (если вы имеете в виду переключение контекста syscall). Когда происходит системный вызов, он входит в режим ядра (переключение контекста) в контексте пользователя (в контексте процесса - например, в контекст процесса, который вызвал системный вызов), а не в контекст прерывания или мягкого прерывания. Поэтому, если к вашей структуре данных можно получить доступ только из пользовательского контекста - вы должны использовать обычные API блокировки для пользовательского контекста.
Что касается переключения контекста в режиме ядра при удержании спин-блокировки - это не может произойти, потому что сама по себе спин-блокировка отключает preemption:
static inline void __raw_spin_lock(raw_spinlock_t *lock)
{
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);
}
Тогда выгрузить может только код с более высоким приоритетом (IRQ, softIRQ), но ему нечего беспокоиться (с точки зрения взаимоблокировок), если этот код с более высоким приоритетом победил не пытайтесь получить блокировку, которую вы держите.
Что, если тот же spin_lock () будет использоваться и в бэкэнде IOCTL?
Это определенно будет "вращаться", пока вы не отпустите блокировку.
Приводит ли это к тупику?
В зависимости от того, как вы будет использовать его.
PS что не так с мьютексами?
Читайте также: