拔掉以太网电缆时负载较高

拔掉以太网电缆时负载较高

我正在使用 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中仍在使用。

msleepin 中可见的函数是top -Hlan87xx_read_status()in调用的drivers/net/phy/smsc.c

我通过将 PHY 芯片的节点添加到设备树中并带有禁用省电模式的标志来解决该问题:

&davinci_mdio {
    ethernetphy0: ethernet-phy@0 {
        reg = <0>;
        smsc,disable-energy-detect;
    };
};

CONFIG_PM驱动程序忽略内核配置选项,这是禁用此行为的唯一方法。)

相关内容