2015-07-05 2 views
1

Я пишу драйвер устройства Linux и довольно новичок в этом, поэтому я быстро изучаю, как НЕ делать что-то. В настоящее время я использую пару мьютексов для предотвращения одновременного чтения некоторых функций с устройства и включения в deadlocks при возобновлении с приостановки. Моя проблема в два раза:Защита ресурсов драйвера Linux

1) Обработчик прерываний назначает рабочее время для чтения из FIFO устройства и данных процесса. FIFO нужно читать без перерыва другими чтениями, поэтому я поместил блокировку/разблокировку мьютекса (A) в функции чтения и записи.

2) Конфигурация устройства - это последовательность чтения и записи с использованием тех же функций чтения и записи, что и выше, которые должны выполняться без прерывания другими чтениями или записью, поэтому я установил блокировку/разблокировку мьютекса (B) в конфиге функции. Функции конфигурации устройства вызывают узлы SYSFS.

Проблема возникает, когда система возобновляет работу с приостановки, прерывание запускает вызов FIFO, и в то же время более высокие уровни записывают на узлы SYSFS для установки параметров конфигурации, и система, похоже, зашла в тупик во время последовательности конфигурации. Моя проблема только в том, что я использую мьютекс, который спит, где я должен использовать спин-блокировку? Или я об этом ошибаюсь?

+1

Привет - Я не уверен в конкретной проблеме, но эти две ссылки могут помочь: [API-интерфейсы ядра, часть 2: Отложенные функции, ящики-задачи и рабочие очереди: введение в нижние половины] (http: // www.ibm.com/developerworks/library/l-tasklets/) и [Верхние и нижние половинки] (http://www.makelinux.net/ldd3/chp-10-sect-4) – paulsm4

ответ

0
  1. Получить прерывание.
  2. Ack/отключить прерывание в обработчике прерываний.
  3. Запустить рабочую очередь.
  4. Выполняйте высокоприоритетную обработку, например, получать данные с устройства и в очередь.
  5. Включить прерывание устройства и перейти к работе с низкоприоритетными данными в рабочей очереди.

две разностных мьютексы здесь не могут работать, потому что порядок фиксации может быть A-> B [где пытаются приобрести мьютекс B, удерживая мьютекс A], а другой путь B-> А, который является учебник смертельного объятием.

Решение состоит в том, чтобы перестроить обработку в высокоприоритетную работу (очень ограниченная задача), чтобы предоставить данные для работы с более низким приоритетом.

Если тест на занятость/доступность больше, чем просто тест «да/нет», используйте переменную условия для защиты комплексного тестирования.

Смежные вопросы