2

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

  1. 小任务解决方案。首选。我可以为每个数据包创建和启动 tasklet,但谁来删除这个 tasklet?小任务功能?我认为这不是一个好主意 - 在 tasklet 执行时释放它。创建全局小任务池?好吧,因为在一个处理器上不可能有 2 个正在执行的小任务,所以池大小将是处理器的数量。但是如何确定 tasklet 何时可用于新用途?只有两种状态:shed 和 run,但没有“done”状态。好的,我可能可以用一些带有标志的结构来包装 tasklet。但这会不会太过分了?

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

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

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

4

1 回答 1

2

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

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

于 2013-08-29T09:49:27.173 回答