Предыстория: я пишу модуль ядра для обработки сетевого трафика. Я получаю пакеты, используя перехватчики netfilter. Вся фильтрация выполняется внутри функции ловушки, но я не хочу здесь обрабатывать пакеты. Таким образом, решение - это тасклеты или рабочие очереди. Я знаю разницу между ними, я могу использовать оба, но у меня есть некоторые проблемы, и мне нужен совет.
Решение тасклетов. Предпочтительно. Я могу создать и запустить тасклет для каждого пакета, но кто будет удалять этот тасклет? Функция тасклета? Я не думаю, что это хорошая идея - освобождать тасклет во время его выполнения. Создать глобальный пул тасклетов? Ну, так как на одном процессоре не может быть 2 исполняемых тасклетов, размер пула будет равен количеству процессоров. Но как узнать, когда тасклет доступен для нового использования? Есть только два состояния: shed и run, но нет состояния "done". Хорошо, я, наверное, могу обернуть тасклет какой-нибудь структурой с флагом. Но не будет ли все это слишком излишним?
Решение рабочей очереди. Та же проблема: кто удалит работу? То же «решение», что и для тасклетов?
Решение Workqueue 2. Просто создайте постоянную работу из-за загрузки модуля, сохраните пакеты в какую-то очередь и обработайте их внутри работы. Может быть две работы и две очереди: входящая и исходящая. Но я боюсь, что с таким решением я буду использовать только один (или два) процессора, так как работа не может выполняться на нескольких процессорах одновременно.
Любые другие решения?