обработка прерываний с низкой задержкой (ожидаемое среднее время возврата из ядра в пространство пользователя?) - PullRequest
2 голосов
/ 18 сентября 2010

У меня есть оптоволоконная связь с проприетарным драйвером устройства.
Ссылка идет на карту PCIe. Работа на RHEL 5.2 (2.6.18-128 ~)
Я mmap редактировал интерфейс на карте для настройки и доступа к FIFO и т. Д., И эти операции чтения / записи занимают несколько мкс, так что все хорошо.

Но, конечно, это нельзя использовать для прерываний, поэтому я должен использовать предоставленный модуль ядра с его пользовательским интерфейсом lib.

WaitForInterrupt(); // API lib interface to kernel module
// Interrupt occurs and am returned to my code in user space
time = CurrentTime() - LatchedTime(); // time to get to here

Для возврата из WaitForInterrupt () требуется около 70 мкс. (Время срабатывания прерывания фиксируется в прошивке, я читаю это, что, как я уже сказал выше, занимает ~ 2 мкс, и сравнивает его с текущим временем в прошивке)

Какое ожидаемое время доступа между возникновением прерывания и возвратом метода ожидания вызова прерывания API пользовательского пространства?

Сетевые / другие высокоскоростные интерфейсы занимают?

Ответы [ 3 ]

3 голосов
/ 19 сентября 2010

500 мс на много порядков больше, чем простое переключение между пользовательским пространством / ядром, но, как кто-то упоминал в комментариях, linux не является операционной системой реального времени, поэтому нет никаких гарантий 500 мсек "взлеты"не будет отображаться время от времени.

Невозможно сказать, кто виноват, драйвер устройства может просто попытаться объединить данные, чтобы повысить эффективность.

Тем не менее, у нас были бесконечные проблемы с некоторыми пользовательскими картами и взаимодействиями как с APIC, так и с ACPI, требующими тонкого баланса настроек BIOS, какая карта входит в какой слот PCI и не испортила ли конкретная видеокартавсе - вероятно, причина сомнительного драйвера, взаимодействующего с более или менее глючными биосами / видеокартами.

2 голосов
/ 20 сентября 2010

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

По моему опыту, задержка для пробуждения пользовательского потока при прерывании должна быть менее 10 мкс, хотя (как говорили другие) Linux не дает никаких гарантий задержки.

2 голосов
/ 19 сентября 2010

Если у вас последнее ядро, вы можете использовать инструмент perf sched, чтобы измерить задержку и посмотреть, где используется время.(500us звучат немного на высокой стороне, в зависимости от вашего процессора, сколько задач выполняется, ...)

...