繁体   English   中英

为什么sched_setaffinity在kthread上无法按预期工作

[英]Why doesn't sched_setaffinity work as expected on kthread

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

我创建函数来更改kthread的CPU。 看起来像“ int change_cpu(int cpu_to_change)”。 它在将参数pid作为“ thread_pid”传递时使用sched_setaffinity()。 即它调用像“ 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.
}

sched_setaffinity()似乎无法正常工作的一种可能原因与内核的动态电源管理有关。 当核心电源关闭时,在该核心上运行的所有线程都将从该核心迁移。 结果,将相应地更新cpumask。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM