LINUX.ORG.RU

SPI в Линуксе

 , ,


1

1

Пишу драйвер для чипа, общающегося с SoC'ом (i.MX233) по SPI. Изучив исходники этой подсистемы пришёл к не очень радостным выводам.

1) Обработка сообщений происходит в отдельном системном потоке (Workqueue)

2) Возможность получить DEADLOCK в ситуации вызова spi_sync в функции обратного вызова spi_async. spi_sync использует wait_for_completion для текущего процесса, а если этот процесс является обработчиком сообщений spi, то получается выстрел себе в ногу.

3) Если в момент обработки сообщения, а именно в момент передачи данных между процессором и spi-мастером (в нём есть спинлоки) произойдёт прерывание, в котором есть вызов spi_sync, также произойдёт DEADLOCK

Кто знает, не упустил ли я чего? Есть ли выход из ситуации?


Есть ли выход из ситуации?

Не делать так, лол

anonymous
()

1) Обработка сообщений происходит в отдельном системном потоке (Workqueue)

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

Dead ★★★★
()
Ответ на: комментарий от anonymous

linux-spi@vger.kernel.org

Спасибо! Буду знать.

Таки 2-й пункт это не баг, а фича. Просто недостаток подсистемы SPI. Кто хочет лопатить её - на здоровье! А про 3-й пункт - это я уже сам косячу. В исходниках написано, что вызывать spi_sync можно только в контексте «can sleep», т.е. в прерываниях нельзя.

dfdfg
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.