只有一个kthread,我想控制它在特定的cpu上运行。
主进程通过kthread_create()和wake_up_process()函数创建并唤醒kthread。
创建kthread时,maie进程在全局变量中存储kthread的pid。让它叫做“线程PID”。
我创建函数来更改kthread的cpu。
它看起来像“int change_cpu(intcpu_to_change)”。
它使用sched_setaffinity(),同时将参数pid作为“thread_pid”传递。
例如,它调用“sched_setaffinity(thread_pid,cpu_mask_to_change)”。
并将参数“cpu_to_change”的值存储为全局变量。让它称为“线程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将相应地更新。
为了防止内核关闭,在配置内核时需要为热插拔CPU选择“否”,或者在编译内核之前,可以在kconfig文件(arch/[architecture]/kconfig)中手动将默认值设置为“n”。

关于c - 为什么sched_setaffinity在kthread上无法按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20985309/

10-12 05:29