为什么sched_setaffinity不能在kthread上按预期工作

为什么sched_setaffinity不能在kthread上按预期工作,c,linux,C,Linux,只有一个kthread,我想控制它在特定的CPU上运行。 主进程通过kthread_create and wake_up_进程函数创建和唤醒kthread。 创建kthread时,maie进程将kthread的pid存储在全局变量中。让它称为线程 我创建函数来更改kthread的CPU。 看起来像是int-change\u-cpuint-cpu-to-change。 它使用sched_setaffinity,同时将参数pid作为线程pid传递。 i、 它调用sched\u setaffinity

只有一个kthread,我想控制它在特定的CPU上运行。 主进程通过kthread_create and wake_up_进程函数创建和唤醒kthread。 创建kthread时,maie进程将kthread的pid存储在全局变量中。让它称为线程

我创建函数来更改kthread的CPU。 看起来像是int-change\u-cpuint-cpu-to-change。 它使用sched_setaffinity,同时将参数pid作为线程pid传递。 i、 它调用sched\u setaffinitythread\u pid、cpu\u mask\u to\u change;。 它将参数cpu_到_的值存储为全局变量。让它称为线程\ cpu

kthread具有断言,例如ASSERTsmc\u processor\u id==thread\u cpu。 kthread通常不会运行,而是等待完成

我希望在调用change_cpu函数后,kthread能够正常工作,不会出现断言失败的情况。 但是断言失败了,即使sched_setaffinity也能成功工作。 为什么它不能像预期的那样工作? 我想知道为什么这样不行

为了更好地理解,这里有一些虚拟代码

int thread_cpu;
int thread_pid;

int dummy_kthread(void *args)
{
  while(1) {
    wait_for_completion();

    ASSERT( smc_processor_id() == thread_cpu );

    '''
    do something
    '''

    complete();
  }
}

int change_cpu(int cpu_to_change)
{
  struct cpumask * cpu_mask;

  thread_cpu = cpu_to_change;
  cpu_mask = set_cpumask(cpu_to_change);  // this is not actually exist function.
  return sched_setaffinity(thread_pid, cpu_mask);
}

int main(){
  struct task_struct *dummy;

  dummy = kthread_create(dummy_kthread, NULL, "dummy_kthread");
  thread_pid = get_pid(dummy);  // this is not actually exist function.
}

sched_setaffinity似乎无法正常工作的一个可能原因与内核的动态电源管理有关。当内核断电时,该内核上运行的所有线程都将从该内核迁移出去。因此,cpumask将相应更新


为了防止内核断电,在配置内核时需要为热插拔CPU选择“否”,或者在编译内核之前,可以在Kconfig文件arch/[architecture]/Kconfig中将默认值手动设置为“n”。

什么版本的linux?您应该使用sched_getcpu和cpu_set。另外,sched_setaffinity用于进程,而不是线程。你为什么提到sched_getcpu?我不明白。