Не отключает ли raw_spin_lock в Linux прерывания hrtimer?
На одном процессоре в том же потоке сначала вызывается raw_spin_lock (), затем он запускает hrtimer и снова возвращается к raw_spin_lock (), где он будет вращаться там. В функции обработчика прерываний hrtimer будет вызвана raw_spin_unlock ().
Это приведет к тупику или нет? Будет ли вращение на raw_spin_lock () отключать прерывание?
1 ответ
raw_spin_lock_irq()
а также raw_spin_lock_irqsave()
отключите локальные прерывания, однако прерывания на других процессорах все еще могут возникать. raw_spin_lock()
не.
Неосторожное использование спин-блокировок с локально активированными прерываниями может привести к тупику, если какой-либо обработчик прерываний попытается заблокировать уже удерживаемую спин-блокировку. По той же причине ни одна из упомянутых мной функций не является входящей. Владелец замка не сможет снять блокировку. Тем не менее, поскольку в этом случае ISR снимет блокировку блокировки, это не должно быть проблемой.
Я думаю, вам также следует проверить переменные завершения, которые были разработаны для того, чтобы делать то, что вы пытаетесь выполнить, используя спин-блокировку таким необычным способом. Смотрите это, а также функции wait_on_completion(_interruptible)(_timeout)()
здесь
Более подробную информацию о спин блокировки можно найти здесь.