Использование спиновых вариантов в сетевой обработке
Я написал модуль ядра, который взаимодействует с перехватчиками сетевых фильтров. Хуки сетевого фильтра работают в контексте Softirq.
Я обращаюсь к глобальной структуре данных "Хэш-таблица" из контекста softirq, а также из контекста процесса. Доступ к контексту процесса связан с использованием файла sysctl для изменения содержимого хэш-таблицы.
Я использую spinlock_irq_save.
Это правильный выбор spin_lock api?? С точки зрения производительности и стандартов блокировки.
что произойдет, если прерывание запланировано на другом процессоре? в то время как на текущем процессоре блокировка уже удерживается кодом контекста процесса?
2 ответа
Во-первых:
Итак, со всеми вышеизложенными деталями я пришел к выводу, что мои softirq могут работать одновременно на обоих ядрах.
Да, это правильно. Ваш обработчик softirq может выполняться "одновременно на более чем одном процессоре".
Ваш вывод об использовании спинлоков звучит правильно для меня. Однако это предполагает, что критическая секция (т. Е. Та, которая выполняется с удерживаемой спин-блокировкой) имеет следующие свойства:
- Он не должен спать (например, приобрести блокирующий мьютекс)
- Это должно быть как можно короче
Как правило, если вы просто обновляете свою хеш-таблицу, у вас все будет в порядке.
Если обработчик IRQ пытается получить спин-блокировку, которая удерживается контекстом процесса, это нормально. Пока ваш контекст процесса не спит с удерживаемой блокировкой, блокировка должна быть снята в течение короткого промежутка времени, что позволяет обработчику IRQ продвигаться вперед.
Я думаю, что решение является подходящим. Softirqs в любом случае работает с отключенным преимущественным вытеснением. Чтобы поделиться данными с процессом, процесс также должен отключить как прерывание, так и прерывания. В случае таймера, который только уменьшает отметку времени записи, это может быть сделано атомарно, т.е. переменная отметки времени должна быть атомарной. Если в другом ядре программы работают и хотят получить спин-блокировку, когда она уже находится в другом ядре, она должна подождать.