关于Orangepi-3-LTS系统驱动导致的负载问题

Oranagpi-3-lts使用UWE5622芯片提供WIFI和蓝牙功能,但是驱动有问题,导致始终显示系统负载为1。

可以直接卸载掉这个内核驱动模块停用WIFI解决问题,详见回复:

RainThings Posted March 28, 2023↗
You can use this command [modprobe -r sprdwl_ng ] to unload that kmod.
You can use the htop command and show kernel threads, a thread with a “sprdwl_TX” in D state will be terminated.
This is actually related to the WiFi driver, which not only causes the WiFi not to work, but also causes this problem.

其中有效部分是:

sudo modprobe -r sprdwl_ng

也可以直接注释掉,位置在/etc/modules-load.d/modules.conf

顺便,蓝牙模块是sprdbt_tty。

目前出现问题的内核版本为5.10.160,在5.16.17中这个问题似乎解决了。

好吧,是错觉,它又回来了,这个bug需要运行一会,所以开机之后大约需要几分钟才能让一个核达到满载。

可怜的全志H6拢共才4个核。

下面贴出来自官方论坛论坛英文版面的一个回复,更详细的解释了问题:

l8gravely post at 2023-3-22 04:31:51↗
I’m seeing the same issue, and I guess I need to pull down the Armbian source code for this and try to figure out what’s going on here.
Just looking at the Linux kernel I don’t see any mention of thisSPRDWL_TX_QUEUE anywhere, so maybe it’s part of the built init daemon? Or maybe it’s part of the ‘sprdwl_ng’ wireless module.
And yes, that’s where it’s coming from, since I can see that string in the file /usr/lib/modules/5.15.93-sunxi64/kernel/drivers/net/wireless/uwe5622/unisocwifi/sprdwl_ng.ko
And that’s it, if I unload the module, then the load drops down nicely.So the problem is somewhere in that module.So now to find the source for the uwe5622 wifi driver and see what it’s doing.It’s probably busy waiting on a sysfs file or something while waiting for a transmit to come in or something silly like that.
John

这个回复指出了问题并找到了原因,但很遗憾的是直到Orangepi3-lts_3.0.8_debian_bullseye_server_linux5.16.17-sun50iw6这个最新版本镜像为止,这个问题并没有修复。

这个镜像↗发布时间是23年5月,确认时间为2024年8月8日,这么看的话这个板子大约已经停止支持了。

通过搜索量来看,很可能是没人反馈这个问题的,中文搜不到,英文帖子只有我搜到的这两个,而且官方论坛的帖子里一堆水军AI,这能也解释为什么这个问题这么久都没解决。

持久化禁用的方式是编辑/etc/modules-load.d/modules.conf,注释掉其中的内核模块名称即可,每行一个。/etc/modules.conf同样可编辑,同样起效,但这个文件似乎是一个历史遗留问题。

参照这个帖子:

If I recall correctly, /etc/modules.conf is a very old name for what eventually became /etc/modprobe.conf, and then /etc/modprobe.d/*.conf. That was way back, in the era of 1.2 or 2.0 kernel series I think.
telcoM Mar 14, 2023 at 19:42↗

另外,加载内核的办法是:

modprobe sprdwl_ng