只有一个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.
}
答案 0 :(得分:0)
sched_setaffinity()看起来无法正常工作的一个可能原因与核心的动态电源管理相关联。当核心断电时,在该核心上运行的所有线程都将从该核心迁移出去。因此,cpumask将相应更新。
为了防止核心断电,您需要选择" no"对于配置内核时的HOTPLUG_CPU,或者您可以手动将默认值设置为' n'在编译内核之前,在Kconfig文件(arch / [architecture] / Kconfig)中。