Во-первых - название немного вводит в заблуждение, так как срыв RCU, вероятно, является лишь признаком проблемы.
Для полноты:
Платформа: Zynq SoC (FPGA + 2-ядерная ARM + периферия)
Ядро 4.14.0 (от Xilinx)
Вот ситуация: у меня есть процесс, который выполняется в пространстве пользователя, и драйвер, который выполняется в пространстве ядра. Я удалил любое использование политик RT_ * из потоков пользовательского кода.
ПЛИС записывает данные в кольцевой буфер в памяти ядра (ersatz DMA).
Функция драйвера read () считывает данные из кольцевого буфера и копирует их в пространство пользователя. Он ждет, когда данные станут доступными, вызывая wait_event_interruptible_timeout ().
Обработчик прерываний, перехваченный с помощью вызова devm_request_threaded_irq (), вызывается, когда FPGA вызывает прерывание (GPIO), когда оно завершает запись заданного объема данных (завершение "DMA"). Это делает простую уборку, а затем вызывает wake_up_interruptible (). Существует пять экземпляров этого драйвера, который читает данные, которые создаются с разной скоростью. Полные прерывания прямого доступа к памяти для этих пяти происходят в 200, 200, 100, 31 и 10 Гц, соответственно. Тик системы составляет 100 Гц.
Этот код работает от нескольких минут до пары недель, а затем RCU начинает сообщать о задержках, и все тщательно скрывается.
Я использовал kgdb, чтобы перехватить жалобу RCU, но RCU начинает жаловаться только через 20 секунд после того, как начал замечать срывы. В списке процессов (из kdb) всегда указывается одна задача irq / независимо от выполняемой, за которой следует сообщение об ошибке, указывающее, что это не соответствует таблице запущенных процессов. Это всегда был другой обработчик irq, и никогда не мой.
ПЛИС все еще успешно записывает данные и выдает прерывания после того, как это происходит, что приводит к выводу, что прерывания каким-то образом отключены или, по крайней мере, отключаются на длительные периоды времени. Я все еще получаю консольный вывод жалоб RCU, так что что-то может работать.
Я не эксперт по ядру, так что, скорее всего, я что-то упустил. Как я могу узнать, что происходит? Или есть что-то очевидное, что не так с вещами, как я их описал?
Помощь!
Спасибо
-Nick