为什么sched_setaffinity在kthread上没有按预期工作

时间:2014-01-08 01:19:39

标签: c linux

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

我创建了更改kthread的CPU的函数。 它看起来像“int change_cpu(int cpu_to_change)”。 它使用sched_setaffinity(),同时将参数pid作为“thread_pid”传递。 即它调用“sched_setaffinity(thread_pid,cpu_mask_to_change);”。 并且它将参数“cpu_to_change”的值存储到全局变量中。让它叫做“thread_cpu”。

kthread有断言,例如“ASSERT(smc_processor_id()== thread_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.
}

1 个答案:

答案 0 :(得分:0)

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

为了防止核心断电,您需要选择" no"对于配置内核时的HOTPLUG_CPU,或者您可以手动将默认值设置为' n'在编译内核之前,在Kconfig文件(arch / [architecture] / Kconfig)中。