背景:我正在编写网络流量处理内核模块。我正在使用 netfilter 钩子获取数据包。所有过滤都在钩子函数内完成,但我不想在这里进行数据包处理。所以解决方案是小任务或工作队列。我知道它们之间的区别,我可以同时使用它们,但是我有一些问题,我需要一个建议。
小任务解决方案。首选。我可以为每个数据包创建和启动 tasklet,但谁来删除这个 tasklet?小任务功能?我认为这不是一个好主意 - 在 tasklet 执行时释放它。创建全局小任务池?好吧,因为在一个处理器上不可能有 2 个正在执行的小任务,所以池大小将是处理器的数量。但是如何确定 tasklet 何时可用于新用途?只有两种状态:shed 和 run,但没有“done”状态。好的,我可能可以用一些带有标志的结构来包装 tasklet。但这会不会太过分了?
工作队列解决方案。同样的问题:谁会删除工作?与小任务相同的“解决方案”?
工作队列解决方案 2. 由于模块加载,只需创建永久工作,将数据包保存到某个队列并在工作内部处理它们。可能是两个作品和两个队列:传入和传出。但我担心使用该解决方案我将只使用一个(或两个)处理器,因为看起来无法同时在几个处理器上执行工作。
还有其他解决方案吗?