Я написал модуль ядра Linux для устройства USB.Драйвер USB предоставляет 2 символьных устройства только для чтения, которые могут быть открыты только одним процессом:
Устройство USB может обрабатывать только один запрос за один раз.
Установка теста следующая:
- Процессы A считывают данные с 1-го устройства:
dd if=/dev/cdev_a of=/tmp/a bs=X
- Процессы B считывают данные со 2-го устройства:
dd if=/dev/cdev_b of=/tmp/b bs=X
- Процессы A и B выполняются параллельно
- Через 10 секунд оба процесса завершаются и сравнивается размер обоих выходных файлов.
Для определенных значений X
существует значительная разница в размере между двумя файлами, чего я не ожидаю.
При вызове чтения для драйвера выполняется следующее:
mutex_lock_interruptible(iolock)
usb_bulk_msg(dev, pipe, buf, X, timeout)
mutex_unlock(iolock)
copy_to_user(buf)
Что бы я хотеложидается следующее:
- Proc A:
mutex_lock_interruptible(iolock)
- Proc A:
usb_bulk_msg(dev, pipe, buf, X, timeout)
- Планирование: A -> B
- Proc B:
mutex_lock_interruptible(iolock)
-> блоки - Планирование: B -> A
- Процесс A:
mutex_unlock(iolock)
- Процесс A:
copy_to_user(buf)
- Процесс A:
mutex_lock_interruptible(iolock)
-> блоки - Планирование: A -> B
- Proc B:
usb_bulk_msg(dev, pipe, buf, X, timeout)
Но с помощью ftrace я вижу, что на шаге 8 процесс A все еще продолжается.И кажется, что для определенных значений X время внутри критической области кратно временному интервалу, поэтому процесс B всегда получает временной интервал, когда критическая область блокируется.Что будет лучшим решением для этого?Я думал о том, чтобы звонить schedule()
каждый раз после копирования в пространство пользователя или воспроизведения с хорошими значениями или использования wait_queues?