linux-kernel - 动态微线程或工作队列

标签 linux-kernel kernel-module kernel netfilter tasklet

背景:我正在编写网络流量处理内核模块。 我正在使用 netfilter Hook 获取数据包。所有过滤都是在钩子(Hook)函数内完成的,但我不想在这里进行数据包处理。所以解决方案是微线程或工作队列。我知道它们之间的区别,我可以同时使用它们,但是我遇到了一些问题,需要建议。

  1. Tasklet 解决方案。最好。我可以创建并启动tasklet 每个数据包,但是谁会删除这个tasklet呢?小任务函数?我 不认为这是一个好主意 - 释放tasklet 执行。创建全局微线程池?好吧,既然不能 如果一个处理器上有 2 个正在执行的微线程,则池大小将为 处理器数量。但是如何知道tasklet何时可用 新用途?只有两种状态:棚和跑,但是有 没有“完成”状态。好吧,我可能可以用一些结构来包装 tasklet 与旗帜。但这会不会太过分了?

  2. 工作队列解决方案。同样的问题:谁会删除作品?与微线程相同的“解决方案”?

  3. 工作队列解决方案2。只需通过模块加载创建永久工作,将数据包保存到某个队列并在工作中处理它们。可能有两个工作和两个队列:传入和传出。但我担心,通过该解决方案,我将仅使用一个(或两个)处理器,因为看起来工作无法同时在几个处理器上执行。

  4. 还有其他解决方案吗?

最佳答案

可以使用高优先级( WQ_HIGH_PRI )、未绑定(bind)( WQ_UNBOUND )工作队列并坚持使用列在问题。

WQ_HIGH_PRI 保证尽快启动处理。 WQ_UNBOUND 消除了单 CPU 瓶颈,因为调度程序会立即将工作分配给任何可用的 CPU。

关于linux-kernel - 动态微线程或工作队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18507308/

相关文章:

c - 如何在 Linux 内核中找到信号处理程序定义?

c - 如果回调函数的处理时间是动态的,如何使用hrtimer?

ubuntu - 声音驱动程序 - AWS EC2 ubuntu 16.04 实例的 snd-aloop 内核模块设置问题

c++ - OSX 内核空间中的 uuid.h?

java - OpenCL 构建错误

linux - 识别内核空间中二进制文件的编译时间

linux-kernel - ARMv8 AARCH64 指令中止处理程序?

c - 为什么我的linux系统调用时间几乎是0us?

c - 在 Linux 内核模块中设置动态变量

c++ - 无法将 'idt_entry_t (*)[256] 转换为 u8int*