Kernel

拔下乙太網電纜時的高負載

  • April 15, 2020

我正在使用 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 in 的程序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 repo 中的 v4.19.79-ti-r30 核心(使用omap2plus_defconfig)。

另一個令人困惑的地方是,每次啟動後都不會出現該問題。如果電路板不存在,則重新啟動電路板通常會使它出現,但reboot不一定。(我不確定我使用哪種方法是否真的有影響,或者它只是在我有限的試驗中出現。)

該問題是由 BeagleBone Black 上的 SMSC LAN8710A PHY 晶片引起的。當它進入省電模式時,它無法檢測電纜是否已連接。為了解決這個問題,核心驅動程序會定期喚醒 PHY 晶片以測試連接,並且此解決方法的細節在 v3.8.13-bone80(用於Debian 7.11)和 v4.4.9(用於Debian 8.4)之間發生了變化. 新方法仍在 Linux 核心 v5.6.4 中使用。

msleep可見的函式是從intop -H呼叫的。lan87xx_read_status()``drivers/net/phy/smsc.c

我通過將 PHY 晶片的節點添加到設備樹中並帶有禁用省電模式的標誌來解決了這個問題:

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

CONFIG_PM驅動程序忽略核心配置選項,這是禁用此行為的唯一方法。)

引用自:https://unix.stackexchange.com/questions/575324