Спинлок не работает для защиты критической секции в многоядерной системе

У меня есть драйвер символьного устройства, который вызывает системный тупик в многоядерной системе. Вызов записи имеет критическую секцию, защищенную спин-блокировкой (spin_lock_irqsave). ISR должен получить эту блокировку, чтобы завершить свою задачу. Если ISR вызывается на одном ядре, в то время как запись выполняет критическую секцию на другом, возникает паника из-за того, что сторожевой таймер обнаруживает жесткую блокировку ядра для ISR. Процесс записи никогда не возвращается, чтобы завершить выполнение. Разве процесс записи не должен продолжать выполняться на своем ядре, снять блокировку, которая позволит другому ядру в его ISR работать?

Критический раздел требует около 5us для завершения. Жесткая блокировка происходит через 5 секунд.

Я предполагаю, что я делаю что-то не так, но не знаю что.

Цени любую помощь!

1 ответ

Решение

Оказывается, критический раздел вызывал wait_for_completion_timeout. Несмотря на то, что тайм-аут был нулевым, он все еще спал и не просыпался, чтобы разблокировать спин-блокировку, если в секции блокировки произошло прерывание. Использование try_wait_for_completion в этом случае решило проблему.

Я бы опубликовал исходный код, но он охватывает много модулей и имеет абстракции архитектуры для переносимости между операционными системами. Был бы беспорядок.

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