gpt4 book ai didi

c - 用内核模块覆盖非 NAPI 网络轮询处理程序

转载 作者:太空宇宙 更新时间:2023-11-04 04:07:47 28 4
gpt4 key购买 nike

熟悉网络设备驱动程序的人都知道,内核和驱动程序之间的接口(interface)已更改为使用 NAPI(新 API)。在此范例中,轮询函数与 napi_struct 相关联,napi_struct 是必须由设备驱动程序分配的新结构。无论如何,我有一个旧驱动程序并且没有时间/意愿将其转换为 NAPI。由于内核已修改为考虑 NAPI,因此他们使用默认函数“process_backlog”(/net/core/dev.c) 来处理 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 吗?我觉得必须有某种方法可以做到这一点。

干杯

最佳答案

这是一个真的坏主意。

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

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

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

哦,你记得当你的模块被移除时改回原来的 process_backlog() 吗?

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

或者可能更好的做法是将您的驱动程序转换为 NAPI,这并不难。

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com