Linux カーネル 3.1 + EXPI9402PT Intel PRO/1000 PT Dual Port Server Adapter で Detected Hardware Unit Hang を吐く問題


 Linux Kernel 3.1.1 にしてからだと思うが、Intel EXPI9402PT サーバアダプタの調子が悪い。具体的には、以下メッセージが出て NIC が5〜10秒間前後停止する。

e1000e 0000:01:00.0: eth1: Detected Hardware Unit Hang:
TDH                  <36>
TDT                  <36>
next_to_use          <36>
next_to_clean        <4a>
buffer_info[next_to_clean]:
time_stamp           <1010a56e9>
next_to_watch        <4f>
jiffies              <1010a612f>
next_to_watch.status <0>
MAC Status             <80383>
PHY Status             <792d>
PHY 1000BASE-T Status  <3800>
PHY Extended Status    <3000>
PCI Status             <10>
------------[ cut here ]------------
WARNING: at net/sched/sch_generic.c:255 dev_watchdog+0x251/0x260()
Hardware name:
NETDEV WATCHDOG: eth1 (e1000e): transmit queue 0 timed out
Modules linked in: pppoe pppox e1000e coretemp snd_seq_dummy snd_seq_oss snd_seq_midi_event snd_seq snd_seq_device snd_pcm_oss snd_mixer_oss snd_hda_codec_analog snd_hda_intel snd_hda_codec snd_hwdep snd_pcm snd_timer snd uvcvideo snd_page_alloc
Pid: 0, comm: swapper Not tainted 3.1.1-gentoo #3
Call Trace:
  [] ? warn_slowpath_common+0x7b/0xc0
[] ? warn_slowpath_fmt+0x45/0x50
[] ? dev_watchdog+0x251/0x260
[] ? run_timer_softirq+0x12f/0x250
[] ? qdisc_reset+0x40/0x40
[] ? tick_handle_oneshot_broadcast+0xec/0x120
[] ? __do_softirq+0x98/0x120
[] ? call_softirq+0x1c/0x30
[] ? do_softirq+0x4d/0x80
[] ? irq_exit+0x8e/0xb0
[] ? do_IRQ+0x5c/0xd0
[] ? common_interrupt+0x6b/0x6b
  [] ? acpi_idle_enter_simple+0xd2/0x104
[] ? acpi_idle_enter_simple+0xcd/0x104
[] ? acpi_idle_enter_bm+0xdf/0x264
[] ? cpuidle_idle_call+0xa7/0x100
[] ? cpu_idle+0x6a/0xc0
[] ? start_kernel+0x32d/0x338
---[ end trace a9d593cc6daa51d1 ]---
e1000e 0000:01:00.0: eth1: Reset adapter

 「————[ cut here ]————」以降のトレースは滅多に出ないが、「 Detected Hardware Unit Hang」が出ると数秒後にドライバが NIC をリセットするまで通信が止まってしまう。そのため、このポートでサービスしている何かに対して死活監視しているとアラートが上がることがある。少なくとも私はいくつかの Web サービスに対する死活監視アラートが届いてこの問題に気づいた。

 eth1 の ethtool -i の結果は以下。

driver: e1000e
version: 1.6.3-NAPI
firmware-version: 5.11-2
bus-info: 0000:01:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes

 上記は Intel からダウンロードできる最新のドライバ 1.6.3 のものだが、カーネル添付の 1.4.4 でも同様の問題が発生する。

 少しググってみると、 e1000e-dev メーリングリストでも報告されていた: [E1000-devel] 82571EB: Detected Hardware Unit Hang この問題は、RHEL でリリースされているカーネル 2.6.18-274.el5 + EXPI9402PT Intel PRO/1000 PT Dual Port Server Adapter が積んでいるコントローラ i82571EB で発生しているらしい。どうやらパッチができて RedHat の Bugzilla に貼られているらしいが、関係者にのみ公開されているようで Bugzilla にログインしてもアクセス拒否されるので試すことができない。ここにパッチの大まかな流れもあるのでこの通り実装すればいいのだが……