Open 7134956 opened 6 years ago
Судя по всему, во время блокировки семафора vfd->lock внутри процедуры dotled_store (которая, в свою очередь, вызывается из-за записи vfdd в "точечные" индикаторы), возникает прерывание по таймеру которое, в свою очередь, вызывает процедуру vfd_timer_sr (которая собственно и обновляет экран 10 раз в секунду). Внутри этой процедуры также блокируется семафор vfd->lock, что и приводит к ошибке (если бы ядро "честно" бы выполнило блокировку, всё бы повисло нафиг).
В целом, как мне кажется "по-быстрому", можно просто убрать mutex_lock(&vfd->lock) и mutex_unlock(&vfd->lock) из функции vfd_timer_sr(). В процедуре прерывания нельзя использовать семафоры.
P.S. Закоммитил 4bda2730d936b63b887e37b132d7fbf896097a4c
Здравствуй, Андрей. Спасибо за драйвер. Пользуюсь подправленной своей версией. Не часто, но выскакивает предупреждение ядра. На более старом коде пару раз было это:
Мой последний код тут https://github.com/7134956/linux_vfd/commits/master C ним выскочило это :
Баг стал проявляться при включении регулятора ondemand 2000 - 500 (Мгц) Есть ли идеи по решению этой архитектурной проблемы?