株式会社はてなに入社しました

株式会社はてなに入社しました

中古の Intel I350 NIC を買ったら SR-IOV が無効にされていたので有効化した

概要

4ポート版の I350-T4V2 を買って SR-IOV を有効化しようとしたらどうやっても有効にならなかったのが発端。 当初は偽物かと疑ったが 真贋比較写真 を見る限りは本物っぽいし不良品?と思いながらさらに調べると、一部メーカー(Dell)のサーバーに付属してたものは無効にされている事があるらしいと分かった。 えーーとなるも詳しく読んだら EEPROM を直接変更することでこれを有効化出来ると書いてあったので実際に有効化した記録。

reference

作業の記録

やる事は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

対象デバイスenp4s0f0enp4s0f3

# 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

0x000x16 をビットにすると 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 の結果を見ても有効になってそうなので気にしないことにしました。

おしまい