Linux kernel 动态Tasklet或工作队列

Linux kernel 动态Tasklet或工作队列,linux-kernel,kernel-module,kernel,netfilter,tasklet,Linux Kernel,Kernel Module,Kernel,Netfilter,Tasklet,背景:我正在编写网络流量处理核心模块。 我正在使用netfilter挂钩获取数据包。所有过滤都在hook函数中完成,但我不想在这里进行数据包处理。所以解决方案是微线程或工作队列。我知道它们之间的区别,我可以两者都用,但我有一些问题,我需要一个建议 微线程解决方案。更可取。我可以为创建和启动tasklet 每个数据包,但谁将删除此tasklet?微线程函数?我 不要认为这是一个好主意-在tasklet运行时释放它 执行。创建微线程的全局池?好吧,既然不能 如果两个微线程在一个处理器上执行,则池大小

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

  • 微线程解决方案。更可取。我可以为创建和启动tasklet 每个数据包,但谁将删除此tasklet?微线程函数?我 不要认为这是一个好主意-在tasklet运行时释放它 执行。创建微线程的全局池?好吧,既然不能 如果两个微线程在一个处理器上执行,则池大小将为 处理器的数量。但如何确定tasklet何时可用 新用途?只有两种状态:shed和run,但有 没有“完成”状态。好的,我可能可以用一些结构来包装tasklet 带着国旗。但这不是太过分了吗

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

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

  • 还有其他解决办法吗


  • 您可以使用高优先级()、未绑定()工作队列,并坚持使用问题中列出的选项3


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

    谢谢,听起来很有希望。