gpt4 book ai didi

linux - 内核代码 wait_event() 和 wake_up() 下系统挂起和 CPU 高

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

我有两个内核线程,分别运行 a() 和 b()。 a() 正在尝试唤醒 b(),如下所示。

a() {
while(1) {
while( atomic_read(status) != SET_SLEEP )
msleep(10);

atomic_set(status, SET_RUN);
printk( "..." );
wake_up( wq );
}

b() {
while(1) {
atomic_set(status, SET_SLEEP);
printk( "..." );
wait_event( wq, atomic_read(status) != SET_SLEEP );
printk( "..." );
}

长时间运行后,整个系统会挂起,CPU 会变高。没有打印任何 panic 信息。有没有人有想法?

最佳答案

我们想解决的越多,得到的就越少....

正如 Lizz 所说,我添加了很多 printk 来打印一些调试信息。但我什么也没得到,因为“printk”是造成该错误的主要原因。

我做了下面的实验,我发现了一个令人难以置信的结果。
运行 a() 的 1 个线程和 b() 的 1024 个线程。 a() 在 while 循环中唤醒每个 b()
修改printk如下。

write_lock_bh( &pk_lock );
printk( "print some debugging message" );
write_unlock_bh( &pk_lock );

有锁运行一次,无锁运行一次。
没有锁,它挂了。
带锁,正常运行。

最初,printk 是为了调试。现在这似乎是根本原因。

有没有人有这样的经验?

关于linux - 内核代码 wait_event() 和 wake_up() 下系统挂起和 CPU 高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19372205/

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