イーサネットケーブルを抜くと負荷が高くなる

イーサネットケーブルを抜くと負荷が高くなる

私はv4.19.106カーネルとBeagleBone Black用のBusyBoxでシステムイメージを構築するためにbuildroot 2020.02を使用しています。結果 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チップを起動して接続をテストします。Debian 7.11)とv4.4.9(用Debian 8.4)。新しい方法は、Linuxカーネルv5.6.4でまだ使用されています。

msleepinに表示される関数は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ドライバは、この動作を無効にする唯一の方法であるカーネル設定オプションを無視します。)

関連情報