熟悉网络设备驱动程序的人都知道,内核和驱动程序之间的接口已更改为使用NAPI(New API)。在此范例中,轮询函数与napi结构相关联,napi结构是必须由设备驱动程序分配的新结构。无论如何,我有一个老司机,没有时间/意愿把它转换成NAPI。由于内核已被修改为考虑NAPI,因此它们使用默认函数“process_backlog”(/net/core/dev.c)来处理NAPI之前的功能。此函数仍在中断上下文中以每个数据包为基础调用(与NAPI相反,NAPI轮询队列,因此它不需要每次都被中断)。我需要重写此函数,但我的问题是,与设备驱动程序分配和创建的NAPI poll函数不同,进程积压与启动时的每个CPU输入队列关联。加载模块时,可以使用

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

这里的问题是,这只是覆盖初始化模块的CPU上的队列。有什么方法可以让我在一个模块上下文中遍历所有的CPU吗?我觉得必须有办法做到这一点。
干杯

最佳答案

那真是个坏主意。
但是,如果您想为每个cpu变量设置其他变量,可以使用per_cpu(name, cpu)
更新:为什么这是个坏主意?
因为在加载驱动程序时,您正在对核心网络代码的一部分进行二进制修补。这会影响系统中的每个网络驱动程序,而不仅仅是你的。这就像有一个内核模块来代替调度程序。如果内核的其余部分是那样写的,它就永远不会工作。
哦,当你的模块被移除时,你还记得改回原来的process_backlog(),对吧?
如果您真的认为需要更改process_backlog(),那么您应该在源代码中进行更改并分发自定义内核。或者向上游网络社区解释你需要做的改变,并让它在上游被接受。
或者最好还是把你的司机换成NAPI,没那么难。

关于c - 用内核模块覆盖非NAPI网络轮询处理程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3807356/

10-12 16:13