安価なNICモジュール、蟹さんで有名な Realtek RTL8111/6186 ですが、open ではないので別配布になっている realtek ルーツのドライバで、昔とは打って変わって結構安定しています。(Intel NIC 程ではありませんが)

elrepo の kmod-r8168 がメンテナンスもされていてお薦めです。EL5,6 のモジュールも別ディレクトリにあります。

ここで使われているのが、kmod という仕組みで、モジュールに、モジュールがコンパイルされたときのカーネルAPI(kABI)の情報が入っています。新しいカーネルをインストールすると、API互換性チェックが行われ、モジュールが(表面上は)使えるとわかると、 /lib/modules/(新カーネル)/weak-updates/ にシンボリックリンクが作られ、depmod すれば、モジュールがそのまま使い回せます。
(APIに手が加わると、API情報が合わなくなるので、kmod-xxxx の src.rpm から再構築が必要です。)

この仕組みを MODVERSIONS と言うのですが、4.4.9 まで、elrepo の kernel-ml には入っていませんでした。これを有効にしてコンパイルしてみたのですが、さすがメインラインですね。APIの細かな変更が頻繁に入るので、安定版の RHELカーネルや kernel-lt のように、何度も使い回すことはできませんでした。だから disable されてたんですかね。

そんな方には dkms で、起動時に毎回カーネルモジュールを build する方法がお薦めです。

ところで、この kmod-r8168 は、多く使われる Realtek RTL8111/8168 シリーズ用ドライバモジュールとして、なぜか姉妹機種の r8169 がロードされてしまう問題への解決なのです。r8169 は r8168 と基本部分の設計が同じなので、見かけ上動いてしまうのですが、DMAやオフロードなどの細かい違いの部分が問題になったときにエラー対処が異なっているので、一度問題が発生すると途端に動かなくなるんです。ちょっとの差なら、組込ドライバが r8168 もきちんとハンドルしてくれれば良いのですが…。

r8168 を入れても、jumbo frame がうまく動かないという話をよく見かけます。もともと RTL の DMA転送やオフロード周りは怪しいので、jumbo frame はお薦めできません(効果も限定的ですし)が、型番によって、チップが対応している最大サイズが異なります。ドライバ側ではこれを超える値も設定手来てしまう(?)ので、ご注意下さい。型番は、lspci, dmidecode, dmesg といったコマンドではわからないので、メーカの Specification を読んでください。

Jumbo Frame 最大サイズ
RTL8168B/8111B – 4kB
RTL8168C/8111C – 6kB
RTL8168CP/8111CP – 6kB
RTL8168D/8111D – 9kB
RTL8168DP/8111DP – 9kB
RTL8168E/8111E – 9kB
RTL8168EP/8111EP – 9kB
RTL8168E-VL/8111E-VL – 9kB
RTL8168F/8111F – 9kB
RTL8168G/8111G – 9kB
RTL8168H/8111H – 9kB

9kB が一般的な 9000バイトなのか、9kiB(9126バイト)なのかイマイチ不明です。ソースコードをぱっと見た限りは、9kB(9216バイト)で定義されているように見えますが、ドライババッファサイズとハードウエアの実装が一致するとは限りません。また、これが MTU として、ヘッダの40を引いた値を設定しないといけないのかもしれません。安定しない人は試してみて下さい。上限9216バイトなら、ヘッダを含めない値だとしても、MTU 9000 で安定して欲しいところですが。。。

Jumbo Frame 安定しないけど jumbo frame したい人のMTUサイズ
RTL8168B/8111B – 3960
RTL8168C/8111C – 5960
RTL8168D/8111D以降 – 8960

Posted in Linux
Share this post, let the world know

Comments are closed