Используйте spin_lock () против down_interruptible () в рабочей очереди - PullRequest
0 голосов
/ 23 октября 2018

Я сталкиваюсь с ситуацией, когда использование spin_lock() внутри рабочей очереди приводит к зависанию системы в случае слишком коротких интервалов между несколькими прерываниями.После изменения spin_lock() на down_interruptible() проблема исчезла.

Однако я видел несколько нижних половин реализации в коде ядра , которые используют spin_lock() вместо мьютекса / семафора (например, функцию irq в request_threaded_irq()).Что было бы причиной этого?Мое лучшее предположение, что мьютекс / семпахор может быть излишним в этой ситуации.

1 Ответ

0 голосов
/ 23 октября 2018

Это полностью зависит от того, какие данные вы пытаетесь защитить с помощью этой блокировки и откуда (в каком контексте) эти данные могут быть доступны (кроме рабочей очереди).Если к блокировке и соответствующим данным также можно получить доступ из атомарного контекста (например, обработчики прерываний), вам следует использовать соответствующую блокировку .

Рабочая очередь составляет около контекст процесса , поэтому при необходимости разрешается переходить в спящий режим.Также ложиться спать, удерживая spin_lock, будет фатальной ошибкой.Таким образом, в рабочей очереди вы можете использовать спящие функции, но не удерживая spin_lock.

Семафоры - это спящие блокировки, такие как мьютексы , поэтому, если ваши данные и соответствующая блокировка не будутиспользуется изнутри атомный контекст , я не вижу причин отказываться от мьютексов / семафоров.

Дополнительная информация:

Прерывания, спин-блокировки и вытеснение

Защита мьютекса обработчика прерываний ядра Linux .

...