动态tasklet或工作队列

时间:2013-08-29 09:37:23

标签: linux-kernel kernel-module kernel netfilter tasklet

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

  1. Tasklets解决方案。 Preferrable。我可以创建和启动tasklet 每个数据包,但谁将删除此tasklet? Tasklet功能?一世 不要认为这是一个好主意 - 尽管dealloc tasklet 执行。创建全局的tasklet池?好吧,既然不行 在一个处理器上执行2个tasklet,池大小将是 处理器数量。但是如何找出tasklet何时可用 用于新用途?只有两种状态:脱落和跑步,但有 没有“完成”状态。好吧,我可能可以用一些struct包装tasklet 与国旗。但这不是太过分了吗?

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

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

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

1 个答案:

答案 0 :(得分:2)

可以使用高优先级WQ_HIGH_PRI),未绑定WQ_UNBOUND)工作队列并坚持使用 option3 在问题中列出。

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