2015-04-13 2 views
5

Есть ли прямой механизм для определения того, вызывается ли данная функция в контексте прерывания или из контекста процесса. Это первая часть вопроса. Вторая часть: Как синхронизировать 2 процесса, один из которых находится в контексте прерывания, а другой - в контексте процесса. Если мое понимание правильное, мы не можем использовать мьютексы для процесса в контексте прерывания, поскольку ему не разрешено спать. С другой стороны, если я использую spinlocks, другой процесс будет использовать циклы CPU. Каков наилучший способ синхронизации этих двух процессов. Поправьте меня, если мое понимание совершенно неверно.В каком контексте данная функция вызывается в Linux Kernel

ответ

4

Вы можете определить, была ли функция выполнена как обработчик IRQ с использованием функции in_irq(). Но я не думаю, что это хорошая практика. Вы должны увидеть только код, в контексте которого выполняется ваша функция. В противном случае я бы сказал, что у вашего кода плохой дизайн.

Что касается механизма синхронизации - вы правы, вам нужно использовать spinlock, потому что вам нужно выполнить синхронизацию в атомном контексте (например, прерывание) - не то, чтобы у вас был большой выбор здесь. Вы также правы, что многие циклы процессора будут потрачены впустую при ожидании спин-блокировки, поэтому вы должны попытаться свести к минимуму количество вашего кода под блокировкой.

0

Добавление к ответу Сэма - вы должны спроектировать обработчик прерываний с нижней половиной и верхней половиной секций. Это позволяет вам иметь минимальный код (верхняя половина) в обработчике прерываний (который вы регистрируете при запросе irq в драйвере), а остальное (нижняя половина) вы можете планировать с помощью рабочей очереди. У вас может быть эта верхняя половина (где вы просто обрабатываете прерывание и выполняете минимальные красные/записи с устройства) внутри атомного контекста, защищенного спин-блокировкой, так что меньшее количество циклов процессора теряется в ожидании спин-блокировки.

Смежные вопросы