CentOS7でDPDK20 SDKを試す ②DPDKドライバの制御

### はじめに
DPDK18 SDKではDPDKドライバもmakeしていたが、DPDK20ではLinux標準のドライバを使うのが標準みたい。DPDK18でmakeされるドライバ（igb_uio）は動作が安定していたが、Linux標準ドライバはどうなのかちょっと不安なところ。

igb_uioはカーネルが更新される度にmakeし直すが必要があったが、Linux標準のドライバではその手間がなくなるというメリットがある。

いろいろなドライバ名が出てくるので最初に整理しておくと。

|ドライバ名|DPDK対応|Linux標準| 備考|
|:---|:---:|:---:|:---|
|e1000e|NO|YES|インテル1G NIC|
|ixgbe|NO|YES|インテル10G NIC|
|igb_uio|YES|NO|SDKでmake|
|uio_pci_generic|YES|YES||
|vfio-pci|YES|YES|IOMMU対応|

### 「ドライバ付け外し」コマンド dpdk-devbind を使ってみる


dpdk-devbindコマンドはよく使うので、以下のようにaliasでdbと短くして使っている。

```
alias db='/usr/local/bin/dpdk-devbind.py'
```
DPDKドライバ未登録状態で、dbコマンドを使ってみると以下のようになる。

```
# db -s

Network devices using kernel driver
===================================
0000:00:1f.6 'Ethernet Connection (2) I219-V 15b8' if=eno1 drv=e1000e unused= *Active*
0000:01:00.0 'Ethernet Controller 10G X550T 1563' if=enp1s0f0 drv=ixgbe unused=
0000:01:00.1 'Ethernet Controller 10G X550T 1563' if=enp1s0f1 drv=ixgbe unused=
（後略）
```

3つのNICポートにカーネル標準のドライバ（e1000eとixgbe）が割り当てられているのが分かる。ここでDPDK対応ドライバを登録して、再度同じコマンドを入れると、

```
# modprobe uio
# modprobe uio_pci_generic
# modprobe vfio-pci
# db -s

Network devices using kernel driver
===================================
0000:00:1f.6 'Ethernet Connection (2) I219-V 15b8' if=eno1 drv=e1000e unused=vfio-pci,uio_pci_generic *Active*
0000:01:00.0 'Ethernet Controller 10G X550T 1563' if=enp1s0f0 drv=ixgbe unused=vfio-pci,uio_pci_generic
0000:01:00.1 'Ethernet Controller 10G X550T 1563' if=enp1s0f1 drv=ixgbe unused=vfio-pci,uio_pci_generic
（後略）
```

3つのNICポートに「DKDK対応ドライバ」（vfio-pciとuio_pci_generic）が適用可能なことが表示されるようになった。注：まだ適用されてない。
X550Tの2つのNICポートをカーネル標準ドライバ（ixgbe）からDPDK対応用（uio_pci_generic）に付け替えてみる。

```
# db -b uio_pci_generic 0000:01:00.0
# db -b uio_pci_generic 0000:01:00.1
# db -s

Network devices using DPDK-compatible driver
============================================
0000:01:00.0 'Ethernet Controller 10G X550T 1563' drv=uio_pci_generic unused=ixgbe,vfio-pci
0000:01:00.1 'Ethernet Controller 10G X550T 1563' drv=uio_pci_generic unused=ixgbe,vfio-pci

Network devices using kernel driver
===================================
0000:00:1f.6 'Ethernet Connection (2) I219-V 15b8' if=eno1 drv=e1000e unused=vfio-pci,uio_pci_generic *Active*
（後略）
```
nmcliコマンドで確認すると、以下のようにX550Tの2つのNICポートがカーネルから見えなくなっている。

```
# nmcli d
DEVICE       TYPE      STATE      CONNECTION
eno1         ethernet  connected  Wired connection 3
lo           loopback  unmanaged  --
```
X550Tの2つのNICポートをDPDK対応用（uio_pci_generic）からカーネル標準ドライバ（ixgbe）に戻してみる。

```
# db -b ixgbe 0000:01:00.0
# db -b ixgbe 0000:01:00.1
# nmcli d
DEVICE       TYPE      STATE         CONNECTION
eno1         ethernet  connected     Wired connection 3
enp1s0f0     ethernet  disconnected  --
enp1s0f1     ethernet  unavailable   --
lo           loopback  unmanaged     --

# db -s

Network devices using kernel driver
===================================
0000:00:1f.6 'Ethernet Connection (2) I219-V 15b8' if=eno1 drv=e1000e unused=vfio-pci,uio_pci_generic *Active*
0000:01:00.0 'Ethernet Controller 10G X550T 1563' if=enp1s0f0 drv=ixgbe unused=vfio-pci,uio_pci_generic
0000:01:00.1 'Ethernet Controller 10G X550T 1563' if=enp1s0f1 drv=ixgbe unused=vfio-pci,uio_pci_generic
（後略）
```
もとに戻った。

### 次回予告

次回はSR-IOVの設定をしてみたい。