如何防止任务从一个CPU移动到另一个CPU?
我目前正在构建一个内核模块,我希望以一种非常理想的方式面对SMP问题 目前,我有一组对象,每个对象都绑定到一个特定的CPU。以下代码说明了这一点:如何防止任务从一个CPU移动到另一个CPU?,c,concurrency,linux-kernel,C,Concurrency,Linux Kernel,我目前正在构建一个内核模块,我希望以一种非常理想的方式面对SMP问题 目前,我有一组对象,每个对象都绑定到一个特定的CPU。以下代码说明了这一点: struct my\u对象{ INTA_字段; }; 结构my_对象cpu_对象[NR_cpu]; /* *cpu_对象[i]已“绑定”到cpu编号“i”! */ 对smp\u processor\u id()的简单调用将为我提供运行当前代码的处理器。因此,如果我有一个函数foo,它使用上面描述的CPU绑定对象执行一些工作,它可能看起来像: voi
struct my\u对象{
INTA_字段;
};
结构my_对象cpu_对象[NR_cpu];
/*
*cpu_对象[i]已“绑定”到cpu编号“i”!
*/
对smp\u processor\u id()
的简单调用将为我提供运行当前代码的处理器。因此,如果我有一个函数foo
,它使用上面描述的CPU绑定对象执行一些工作,它可能看起来像:
void foo()
{
int cpu=smp_处理器_id();
使用(cpu对象[cpu])进行一些工作;
}
问题是:如何保证这一点
CPU
分配和是否使用进行一些工作之间没有CPU切换
do\u some\u work\u with()
仅在cpu
上运行smp\u处理器\u id获取CPU
编辑: 如评论中所述,我进行编辑是为了解释为什么我觉得我需要这些功能。 我必须在文件系统级别执行动态加密。
为此,我将使用内核内置的加密支持(
struct crypto\u tfm
和friends)。这是原版
在多核机器上,可以同时执行多个R/W操作。公共fs层可以做到这一点,而且做得很好。但是,我来了,把事情搞砸了:
- 类似于
的对象负责加密操作struct crypto\u tfm
- 不能同时使用同一个变换对象,因为某些参数可能会被更改(私钥和初始化向量),从而影响整个过程
- 由于crypto内置了复杂的密码分配系统,下面描述的简单解决方案是完全不可能的。
- 分配
转换crypto\u tfm
- 执行加密操作
- 释放转换对象
- 只有一个转换可用的经典方案可防止多个并发R/W操作,因为一个任务必须等待另一个任务释放为保护转换对象而持有的锁
注意:如果我使用像我在原始问题中给出的解决方案,我会将其限制在非常短的部分,以避免对CPU负载平衡造成严重影响。因此,根据您编辑的问题,我不得不说,我认为您的解决方案是错误的 正确的做法是有一个“每个操作”
crypto\u tfm
,它在CPU的操作之后进行。使用“当前CPU”在这里不是正确的做法。[如果this在具有热插拔CPU的系统上运行,并且有人断开了您的任务所运行的CPU的连接,并且从未将其放回原位,会发生什么情况?]
如果为每个操作分配一个
crypto\u tfm
代价很高,那么您必须找到一些方法来避免分配/释放对象-拥有一个对象池并为当前操作分配一个可用对象,当操作完成后,将其重新放回可用列表 为什么你认为有必要实施这种级别的控制?如果你没有,你的模块会有问题吗?我强烈感觉你的整体方法是错误的。强制内核在特定CPU上运行内核线程肯定是不对的。我确实相信你所描述的方法会奏效,但它似乎非常错误。@MatsPeterson我也有同样的感觉。。。但我不知道如何在需要运行的任务中保证SMP的顺利进行。我可以编辑你的上下文来解释我认为这种可怕的事情可能有帮助-因为我觉得这是一个典型的XY问题-你瘦的正确的解决办法是Y来解决X,所以你问如何做Y. @ MatsPetersson编辑,你应该有“X”现在什么是可用的政策当没有对象准备使用,除了这两个明显的问题(分配一个新对象,或者只是等待现有对象可用)之外?从我到目前为止所读的资料来看,如果一个任务不能移动到另一个任务,那么CPU就不能热插拔。我能想到的只有这两个。好吧,我想第三个“混合”的是基于if(num_allocated_crypt_tfm
-这样,您可以限制有多少个crypt\u tfm
,但同时不必一开始就分配很多。