gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:56 30 4
gpt4 key购买 nike

只有一个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' ) 在编译你的内核之前。

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com