Отключает ли Linux spin_lock_irqsave() прерывание ARM FIQ?

#linux #linux-kernel #spinlock #fiq

#linux #linux-ядро #блокировка вращения #ошибка

Вопрос:

Я пишу драйвер устройства Linux, и мне нужно сериализовать доступ к критическим разделам драйвера из задач и прерываний. Я разрабатываю для ARM.

Если я использую spin_lock_irqsave() и spin_unlock_irqrestore() pair для защиты своих критических разделов, заблокирован ли FIQ в этих критических разделах?

В частности, я попытался посмотреть на реализации этих двух функций spin_lock_irqsave() . Мое первоначальное впечатление заключается в том, что FIQ не отключен. Просто хочу проверить это у здешних экспертов.

Пожалуйста, просветите меня. Спасибо!

Ответ №1:

Я не думаю, что Linux использует FIQ, поэтому FIQ не будет конфликтовать с ISR Linux. Тем не менее, я полагаю, что он использует:

 cpsid i
  

Это отключает обычные прерывания. Чтобы также отключить FIQ, ему нужно было бы сделать

 cpsid if
  

Смотрите: https://elixir.bootlin.com/linux/latest/source/arch/arm/include/asm/irqflags.h#L25

Комментарии:

1. Привет @stark, просто чтобы уточнить, я придерживаюсь того же мнения, что Linux, скорее всего, не использует FIQ, но кодовая база, над которой я работаю, использует FIQ для своих собственных целей. Этот FIQ вызывает мой код драйвера.

2. Если вам нужно отключить FIQ, вы могли бы создать свой собственный irq_save.

3. … но следите за условиями гонки в порядке отключения / включения.