概要
4ポート版の I350-T4V2
を買って SR-IOV を有効化しようとしたらどうやっても有効にならなかったのが発端。
当初は偽物かと疑ったが 真贋比較写真 を見る限りは本物っぽいし不良品?と思いながらさらに調べると、一部メーカー(Dell)のサーバーに付属してたものは無効にされている事があるらしいと分かった。
えーーとなるも詳しく読んだら EEPROM を直接変更することでこれを有効化出来ると書いてあったので実際に有効化した記録。
reference
- 使えないという自分と同じ症状を訴えるスレッド
- 有効化する方法が投稿されているML
- I350 のデータシート
作業の記録
やる事はMLの投稿が全てなのだが、肝心の書き込む値が省略されている。 (おそらく)無保証の行為だし、NICが壊れるリスクもあるから自分で計算して自己責任でやれの念を感じたのでそうしました。
元の状態(lspci -v
)
# lspci -v 04:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) Subsystem: Intel Corporation Ethernet Server Adapter I350-T4 Flags: bus master, fast devsel, latency 0, IRQ 39, IOMMU group 21 Memory at fbd00000 (32-bit, non-prefetchable) [size=1M] Memory at fc00c000 (32-bit, non-prefetchable) [size=16K] Expansion ROM at fbf80000 [disabled] [size=512K] Capabilities: [40] Power Management version 3 Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+ Capabilities: [70] MSI-X: Enable+ Count=10 Masked- Capabilities: [a0] Express Endpoint, MSI 00 Capabilities: [e0] Vital Product Data Capabilities: [100] Advanced Error Reporting Capabilities: [140] Device Serial Number XX-XX-XX-XX-XX-XX-XX-XX Capabilities: [150] Alternative Routing-ID Interpretation (ARI) Capabilities: [1a0] Transaction Processing Hints Capabilities: [1c0] Latency Tolerance Reporting Capabilities: [1d0] Access Control Services Kernel driver in use: igb Kernel modules: igb
対象デバイスは enp4s0f0
~ enp4s0f3
# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp4s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether a0:36:9f:be:ef:00 brd ff:ff:ff:ff:ff:ff 3: enp4s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether a0:36:9f:be:ef:01 brd ff:ff:ff:ff:ff:ff 4: enp4s0f2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether a0:36:9f:be:ef:02 brd ff:ff:ff:ff:ff:ff 5: enp4s0f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether a0:36:9f:be:ef:03 brd ff:ff:ff:ff:ff:ff 6: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff inet 192.168.168.168/24 scope global enp5s0 valid_lft forever preferred_lft forever
4つ認識されているが、EEPROM は共通らしいので enp4s0f0
を対象にする。
まずは現在の EEPROM をバックアップ
# ethtool --eeprom-dump enp4s0f0 raw on > eeprom-backup.bin
EEPROM の該当の設定が入っている部分を表示する
# ethtool --eeprom-dump enp4s0f0 offset 0x4a length 1 > Offset Values > ------ ------ > 0x004a: 16
この Values は16進数なので 0x16
が現在の値。MLの人は 0xf6
だったらしい。
MLの投稿と I350 のデータシートの該当ページ 6.2.25 I/O Virtualization (IOV) Control (Word 0x25)
によるとこれは設定の上位8ビットらしい。
下位8ビットも含めて設定全体を取得してみる。リトルエンディアンなので offset は前のアドレスになるのね……
# ethtool --eeprom-dump enp4s0f0 offset 0x49 length 2 > Offset Values > ------ ------ > 0x0049: 00 16
0x00
と 0x16
をビットにすると 0b00000000
0b00010110
つまり設定全体の値は 0b0000000000010110
これをIntelのドキュメントに従って割り当てるとこうなる
0000000000010110 自分のやつ xxxxxxxx11110110 MLの人の値(下位ビットは不明) - drop_vm_lpbk: 0b ------ Reserved: 0x0 - ARI Enabled: 1b --- Max VFs: 0x7 -- MSI-X table: 0x2 - 64bit Advertisement: 1b - Prefetchable: 0b - IOV Enabled: 1b
現在の設定を見ると自分の I350 は IOV無効化だけでなく、 VFs の最大数も0、ARI Enabled のビットもデフォルトから変更されている。
ARI については後にするとして、上位8ビットのアドレス 0x4a
に書き込むべき値は {省略されました}
ethtool --change-eeprom enp4s0f0 magic 0x15218086 offset 0x4a length 1 value {省略されました}
再起動して lspci -v
# lspci -v 04:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) Subsystem: Intel Corporation Ethernet Server Adapter I350-T4 Flags: bus master, fast devsel, latency 0, IRQ 39, IOMMU group 21 Memory at fbd00000 (32-bit, non-prefetchable) [size=1M] Memory at fc00c000 (32-bit, non-prefetchable) [size=16K] Expansion ROM at fbf80000 [disabled] [size=512K] Capabilities: [40] Power Management version 3 Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+ Capabilities: [70] MSI-X: Enable+ Count=10 Masked- Capabilities: [a0] Express Endpoint, MSI 00 Capabilities: [e0] Vital Product Data Capabilities: [100] Advanced Error Reporting Capabilities: [140] Device Serial Number XX-XX-XX-XX-XX-XX-XX-XX Capabilities: [150] Alternative Routing-ID Interpretation (ARI) Capabilities: [160] Single Root I/O Virtualization (SR-IOV) Capabilities: [1a0] Transaction Processing Hints Capabilities: [1c0] Latency Tolerance Reporting Capabilities: [1d0] Access Control Services Kernel driver in use: igb Kernel modules: igb
Capabilities: [160] Single Root I/O Virtualization (SR-IOV)
の表示が追加されて SR-IOV が有効になっている!
試しに VFs を生やしてみる
# echo 7 > "/sys/bus/pci/devices/0000:04:00.0/sriov_numvfs"
# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp4s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether a0:36:9f:be:ef:00 brd ff:ff:ff:ff:ff:ff 3: enp4s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether a0:36:9f:be:ef:01 brd ff:ff:ff:ff:ff:ff 4: enp4s0f2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether a0:36:9f:be:ef:02 brd ff:ff:ff:ff:ff:ff 5: enp4s0f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether a0:36:9f:be:ef:03 brd ff:ff:ff:ff:ff:ff 6: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff inet 192.168.168.168/24 scope global enp5s0 valid_lft forever preferred_lft forever 7: enp4s0f0v0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether aa:bb:cc:dd:ee:f0 brd ff:ff:ff:ff:ff:ff permaddr 3e:93:d1:b4:85:81 8: enp4s0f0v1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether aa:bb:cc:dd:ee:f1 brd ff:ff:ff:ff:ff:ff permaddr 3a:75:f1:cb:2f:73 9: enp4s0f0v2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether aa:bb:cc:dd:ee:f2 brd ff:ff:ff:ff:ff:ff permaddr 9e:e7:5b:7b:f3:8b 10: enp4s0f0v3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether aa:bb:cc:dd:ee:f3 brd ff:ff:ff:ff:ff:ff permaddr 66:21:16:f8:2a:68 11: enp4s0f0v4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether aa:bb:cc:dd:ee:f4 brd ff:ff:ff:ff:ff:ff permaddr b2:fb:03:03:6c:e5 12: enp4s0f0v5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether aa:bb:cc:dd:ee:f5 brd ff:ff:ff:ff:ff:ff permaddr 02:53:89:6e:44:6b 13: enp4s0f0v6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether aa:bb:cc:dd:ee:f6 brd ff:ff:ff:ff:ff:ff permaddr 52:19:44:96:0c:2e
ちゃんと VF が生えてきた!
lspci -v
でも VF を確認出来る
lspci -v 05:10.0 Ethernet controller: Intel Corporation I350 Ethernet Controller Virtual Function (rev 01) Subsystem: Intel Corporation I350 Ethernet Controller Virtual Function Flags: bus master, fast devsel, latency 0, IOMMU group 31 Memory at fb900000 (64-bit, prefetchable) [virtual] [size=16K] Memory at fb920000 (64-bit, prefetchable) [virtual] [size=16K] Capabilities: [70] MSI-X: Enable+ Count=3 Masked- Capabilities: [a0] Express Endpoint, MSI 00 Capabilities: [100] Advanced Error Reporting Capabilities: [150] Alternative Routing-ID Interpretation (ARI) Capabilities: [1a0] Transaction Processing Hints Capabilities: [1d0] Access Control Services Kernel driver in use: igbvf Kernel modules: igbvf
これで全ポートに VFs を生やす設定を入れて28ポートNICとして認識されました。 ip addr
の結果がキモくておもしろかったです。
後回しにした ARI について
ARI とは? Alternative Routing-ID Interpretation (ARI)
のことらしい。
検索した出てきたドキュメントによると気にしなくても強制的に有効になるっぽい?
https://www.intel.co.jp/content/www/jp/ja/docs/programmable/683140/21-4-4-0-0/sr-iov-implementation.html
SR-IOVを有効にすると、ARI機能は常に有効になります。
lspci
の結果を見ても有効になってそうなので気にしないことにしました。
おしまい