gpt4 book ai didi

linux-kernel - 如何实现永不休眠的内核线程?

转载 作者:行者123 更新时间:2023-12-05 07:58:23 25 4
gpt4 key购买 nike

问题

我需要一个能够长时间工作而不会屈服的内核线程,基本上是按需将一个 CPU 内核完全专用于它:

int my_kthread(void *arg)
{
while(!kthread_should_stop()) {
do_some_work();
if(sleeping_enabled) msleep(1000);
else {
// What to do here to avoid lockup warnings
// and ensure system stability?
}
}
return 0;
}

背景

当我正在处理的模块被加载时,线程是这样创建的:

my_task = kthread_run(&my_kthread, (void *)some_data, "My KThread")
set_cpus_allowed(my_task, *cpumask_of(10)); // Pin thread to core #10

并在卸载模块时像这样停止:

kthread_stop(my_task);

sleeping_enabledtrue 时一切正常。

否则,线程启动后不久,内核就会提示明显的锁定。起初,我只是为了避免各种警告,例如

BUG: soft lockup - CPU#10 stuck for 22s!

INFO: rcu_sched detected stalls on CPUs/tasks: { 10} (detected by 15, t=30567 jiffies)

因为他们倾向于用所有 >20 个内核的转储淹没我的控制台,并且“锁定”是所需的行为。

我试过像这样戳看门狗:

if(sleeping_enabled) msleep(1000);
else touch_softlockup_watchdog();

结合 (echo 1 >/sys/module/rcupdate/parameters/rcu_cpu_stall_suppress)并且几乎得到了我想要的东西(一个永不休眠的线程成功地完成了我想要的并且控制台中没有垃圾邮件)。

但是,这个“解决方案”不仅让人感觉像是在作弊,而且似乎我完全破坏了某个内核:当通过 rmmod 卸载模块时,整个系统会卡住。控制台开始定期在所有内核上转储软锁定,并带有以下调用跟踪:

[<ffffffff810c96b0>] ? queue_stop_cpus_work+0xd0/0xd0
[<ffffffff810c9903>] cpu_stopper_thread+0xe3/0x1b0
[<ffffffff8108639a>] ? finish_task_switch+0x4a/0xf0
[<ffffffff8169e654>] ? __schedule+0x3c4/0x700
[<ffffffff81080e98>] ? __wake_up_common+0x58/0x90
[<ffffffff810c9820>] ? __stop_cpus+0x80/0x80
[<ffffffff81077e93>] kthread+0x93/0xa0
[<ffffffff816a9724>] kernel_thread_helper+0x4/0x10
[<ffffffff81077e00>] ? flush_kthread_worker+0xb0/0xb0
[<ffffffff816a9720>] ? gs_change+0x13/0x13

与此同时,我的内核线程继续运行(正如它不时打印出的一些控制台消息所证明的那样),因此它从未看到 kthread_should_stop() 返回 true .

卸载确实工作正常并在我切换到完全不休眠之前停止了线程。现在,我无法在不重新启动的情况下进行迭代修改。

请注意,我在这里简化了很多描述。我正在尝试将这样一个线程(轮询一些硬件寄存器并记录它们的更改)添加到 GPU 驱动程序,因此可能有依赖于模块的原因导致卸载卡住。但是,这不会改变我关于如何最好地实现永不休眠线程的一般问题。

最佳答案

我觉得这个问题和你的问题很相似"whole one core dedicated to single process" ,请查看那里的回复。

关于linux-kernel - 如何实现永不休眠的内核线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24786592/

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