如何防止任务从一个CPU移动到另一个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

我目前正在构建一个内核模块,我希望以一种非常理想的方式面对SMP问题

目前,我有一组对象,每个对象都绑定到一个特定的CPU。以下代码说明了这一点:

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
  • 设置当前任务的处理器相关性,使其与当前CPU保持一致
  • 再次启用抢占,释放锁
  • 用()做一些工作
  • 将关联重置为其以前的状态
  • 对我来说,这是相当野蛮的,我想知道是否有更聪明和更轻的方式来做这件事

    提前谢谢


    编辑: 如评论中所述,我进行编辑是为了解释为什么我觉得我需要这些功能。 我必须在文件系统级别执行动态加密。
    为此,我将使用内核内置的加密支持(
    struct crypto\u tfm
    和friends)。这是原版

    在多核机器上,可以同时执行多个R/W操作。公共fs层可以做到这一点,而且做得很好。但是,我来了,把事情搞砸了:

    • 类似于
      struct crypto\u tfm
      的对象负责加密操作
    • 不能同时使用同一个变换对象,因为某些参数可能会被更改(私钥和初始化向量),从而影响整个过程
    • 由于crypto内置了复杂的密码分配系统,下面描述的简单解决方案是完全不可能的。
    • 分配
      crypto\u tfm
      转换
    • 执行加密操作
    • 释放转换对象
    • 只有一个转换可用的经典方案可防止多个并发R/W操作,因为一个任务必须等待另一个任务释放为保护转换对象而持有的锁
    出于这些原因,我需要处理多个转换对象。我必须找到一个有效的方案,允许并发R/W。我觉得我的“Y”是“简单、整洁、错误的解决方案”。 任何建议都将不胜感激


    注意:如果我使用像我在原始问题中给出的解决方案,我会将其限制在非常短的部分,以避免对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
    ,但同时不必一开始就分配很多。