Не отключает ли 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)() здесь

Более подробную информацию о спин блокировки можно найти здесь.

Другие вопросы по тегам