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