переопределение обработчика опроса сети, не являющегося NAPI, модулем ядра - PullRequest
1 голос
/ 27 сентября 2010

Как известно тем, кто знаком с драйверами сетевых устройств, интерфейс между ядром и драйвером был изменен для использования NAPI (новый API). В этой парадигме функция опроса связана с napi_struct, которая является новой структурой, которая должна быть выделена драйвером устройства. В любом случае, у меня есть старый драйвер, и у меня нет времени / желания конвертировать его в NAPI. Поскольку ядро ​​было модифицировано для учета NAPI, они используют функцию по умолчанию "process_backlog" (/net/core/dev.c) для обработки функций, предшествующих NAPI. Эта функция по-прежнему вызывается в контексте прерывания для каждого пакета (в отличие от NAPI, который опрашивает очередь, поэтому ее не нужно прерывать каждый раз). Мне нужно переопределить эту функцию, но моя проблема в том, что в отличие от функции опроса NAPI, которая назначается и создается драйвером устройства, process_backlog связан с входной очередью для каждого процессора во время загрузки. Когда я загружаю модуль, я могу переопределить метод, используя

   struct softnet_data *queue, backup;
   queue = &__get_cpu_var(softnet_data);
   backup = *queue;
   queue->backlog.poll = my_process_backlog; 

Проблема здесь в том, что это только переопределение очереди в ЦПУ, в котором находится модуль. Есть ли какой-нибудь способ, которым я могу перебрать все процессоры в контексте модуля? Я чувствую, что должен быть какой-то способ сделать это.

Приветствия

1 Ответ

1 голос
/ 28 сентября 2010

Это действительно плохая идея.

Но если вы хотите установить другие для каждой переменной процессора, вы можете использовать per_cpu(name, cpu).

Обновление : почему это плохая идея?

Потому что вы двоично исправляете часть основного сетевого кода, когда загружается ваш драйвер. Это влияет на каждый сетевой драйвер в системе, а не только на ваш. Это похоже на наличие модуля ядра, который заменяет планировщик. Если бы остальное ядро ​​было написано так, оно бы никогда не работало.

Да, и вы не забыли вернуться к исходному process_backlog(), когда ваш модуль удален, верно?

Если вы действительно думаете, что вам нужно изменить process_backlog(), вам следует внести изменения в исходный код и распространять собственное ядро. Или объясните изменения, которые вам нужны, вышестоящему сетевому сообществу и примите их в апстриме.

Или, возможно, лучше просто конвертировать драйвер в NAPI, это не так сложно.

...