【问题标题】:overriding non-NAPI network polling handler with a kernel module使用内核模块覆盖非 NAPI 网络轮询处理程序
【发布时间】:2011-04-17 23:12:03
【问题描述】:

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

覆盖该方法
   struct softnet_data *queue, backup;
   queue = &__get_cpu_var(softnet_data);
   backup = *queue;
   queue->backlog.poll = my_process_backlog; 

这里的问题是这只会覆盖初始化模块的 CPU 上的队列。有什么方法可以循环遍历模块上下文中的所有 CPU 吗?我觉得必须有某种方法可以做到这一点。

干杯

【问题讨论】:

    标签: c network-programming module linux-kernel


    【解决方案1】:

    这是一个真的坏主意。

    但是,如果你想为每个 cpu 变量设置一些 other,你可以使用per_cpu(name, cpu)

    更新:为什么这是个坏主意?

    因为在加载驱动程序时,您正在对部分核心网络代码进行二进制修补。这会影响系统中的每个网络驱动程序,而不仅仅是您的。这就像拥有一个替换调度程序的内核模块。如果内核的其余部分是这样编写的,它将永远无法工作。

    哦,你记得在你的模块被删除时改回原来的process_backlog() 对吧?

    如果您真的认为需要更改process_backlog(),那么您应该在源代码中进行更改并分发自定义内核。或者向上游网络社区解释您需要的更改,并让上游接受。

    或者最好还是将您的驱动程序转换为 NAPI,这并不难。

    【讨论】:

    • 你能详细说明为什么这很糟糕吗?注意 - 我不是想制作一些通用的东西或适用于所有事情的东西。我正在为特定目的制作特定硬件的特定驱动程序。
    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 2016-08-26
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多