我正在使用 buildroot 2020.02 为 BeagleBone Black 构建带有 v4.19.106 内核和 BusyBox 的系统映像。如果我从生成的 SD 卡启动主板,我会看到一个奇怪的行为:系统负载保持在 0.60 到 0.75 之间,而 CPU 使用率低于 1%,并且在没有连接以太网电缆时没有服务运行。一旦我插入电缆,负载就会降至 0.00-0.01。
拔掉电缆后,我在以下位置看到这一行top -H
:
PID USER TIME+ S WCHAN COMMAND
42 root 0:03.03 D msleep [kworker/0:3+events_power_efficient]
输出片段ip link
:
4: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether 4c:3f:d3:91:f2:66 brd ff:ff:ff:ff:ff:ff
输出片段ifconfig
:
eth0 Link encap:Ethernet HWaddr 4C:3F:D3:91:F2:66
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:49
当我插入电缆时,我看到以下消息:
# [ 3811.689083] cpsw 4a100000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off
此后,不再有进程状态为 D 的进程top -H
,并且负载下降。
ip link
插入电缆后的输出片段:
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 4c:3f:d3:91:f2:66 brd ff:ff:ff:ff:ff:ff
ifconfig
插入电缆的输出片段:
eth0 Link encap:Ethernet HWaddr 4C:3F:D3:91:F2:66
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:66 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7605 (7.4 KiB) TX bytes:0 (0.0 B)
Interrupt:49
拔掉电缆会恢复高负载。
我的 eth0 配置在/etc/network/interfaces
:
auto eth0
iface eth0 inet dhcp
如果我使用allow-hotplug eth0
,当启动时拔掉电缆时,接口保持关闭状态(并且负载保持正常),但是当我连接电缆时,就在我运行时,它不会出现ifup eth0
。
如何防止电缆拔出时出现高负载,并在插入时获得正常连接?是否有我应该检查的内核配置或设备树条目?
更新:
该问题出现在使用板的默认配置构建的映像上(beaglebone_defconfig)。它用来自 beagleboard 存储库的 v4.19.79-ti-r30 内核(和omap2plus_defconfig)。
另一个令人困惑的地方是,该问题不会在每次启动后出现。如果电路板不存在,则对电路板重新通电通常会使其出现,但reboot
不一定。 (我不确定我使用的方法是否真的有影响,或者只是在我有限的试验次数中出现了这种情况。)
答案1
该问题是由 BeagleBone Black 上的 SMSC LAN8710A PHY 芯片引起的。当进入省电模式时,无法检测电缆是否已连接。为了解决这个问题,内核驱动程序会定期唤醒 PHY 芯片来测试连接,并且此解决方法的细节在 v3.8.13-bone80(用于Debian 7.11)和 v4.4.9(用于Debian 8.4)。新方法在Linux内核v5.6.4中仍在使用。
msleep
in 中可见的函数是top -H
从lan87xx_read_status()
in调用的drivers/net/phy/smsc.c
。
我通过将 PHY 芯片的节点添加到设备树中并带有禁用省电模式的标志来解决该问题:
&davinci_mdio {
ethernetphy0: ethernet-phy@0 {
reg = <0>;
smsc,disable-energy-detect;
};
};
(CONFIG_PM
驱动程序忽略内核配置选项,这是禁用此行为的唯一方法。)