[英]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.