223. vhost/virtio-user interrupt mode with cbdma test plan

223.1. Description

Virtio-user interrupt need test with l3fwd-power sample, small packets send from traffic generator to virtio side, check virtio-user cores can be wakeup status, and virtio-user cores should be sleep status after stop sending packets from traffic generator. This test plan tests virtio-user Rx interrupt and LSC interrupt with vhost-user as the backend when cbdma enable.

Note

DPDK local patch that about vhost pmd is needed when testing Vhost asynchronous data path with testpmd.

223.2. Prerequisites

223.2.1. Software

Scapy

223.2.2. General set up

  1. Compile DPDK:

    # CC=gcc meson --werror -Denable_kmods=True -Dlibdir=lib -Dexamples=all --default-library=static <dpdk build dir>
    # ninja -C <dpdk build dir> -j 110
    For example:
    CC=gcc meson --werror -Denable_kmods=True -Dlibdir=lib -Dexamples=all --default-library=static x86_64-native-linuxapp-gcc
    ninja -C x86_64-native-linuxapp-gcc -j 110
    
  2. Get the PCI device ID and DMA device ID of DUT, for example, 0000:18:00.0 is PCI device ID, 0000:00:04.0, 0000:00:04.1 is DMA device ID:

    <dpdk dir># ./usertools/dpdk-devbind.py -s
    
    Network devices using kernel driver
    ===================================
    0000:18:00.0 'Device 159b' if=ens785f0 drv=ice unused=vfio-pci
    
    DMA devices using kernel driver
    ===============================
    0000:00:04.0 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci
    0000:00:04.1 'Sky Lake-E CBDMA Registers 2021' drv=ioatdma unused=vfio-pci
    

223.3. Test case

223.3.1. Test Case 1: Split ring LSC event between vhost-user and virtio-user with cbdma enable

This case tests the LSC interrupt of split ring virtio-user with vhost-user as the back-end when vhost uses the asynchronous operations with CBDMA channels. Flow: Vhost <–> Virtio

  1. Bind 1 CBDMA port to vfio-pci driver, then start vhost-user side:

    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x3000 -n 4 -a 0000:00:04.0 --file-prefix=vhost \
    --vdev 'net_vhost0,iface=vhost-net,queues=1,client=0,dmas=[txq0@0000:00:04.0;rxq0@0000:00:04.0]' \
    -- -i
    testpmd> set fwd mac
    testpmd> start
    
  2. Start virtio-user side:

    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0xc000 -n 4 --no-pci --file-prefix=virtio \
    --vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net \
    -- -i --tx-offloads=0x00
    testpmd> set fwd mac
    testpmd> start
    
  3. Check the virtio-user side link status:

    testpmd>  show port info 0
    #it should show "up"
    
  4. Quit the vhost-user side with testpmd, then check the virtio-user side link status:

    testpmd>  show port info 0
    #it should show "down"
    

223.3.2. Test Case 2: Split ring virtio-user interrupt test with vhost-user as backend and cbdma enable

This case tests Rx interrupt of split ring virtio-user with vhost-user as the back-end when vhost uses the asynchronous operations with CBDMA channels. Flow: TG –> NIC –> Vhost –> Virtio

  1. Bind 1 CBDMA port and 1 NIC port to vfio-pci, launch testpmd with a virtual vhost device as backend:

    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7c -n 4 -a 0000:af:00.0 -a 0000:00:04.0 \
    --vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[txq0@0000:00:04.0;rxq0@0000:00:04.0]' \
    -- -i  --rxq=1 --txq=1
    testpmd> start
    
  2. Start l3fwd-power with a virtio-user device:

    ./x86_64-native-linuxapp-gcc/examples/dpdk-l3fwd-power -c 0xc000 -n 4 --log-level='user1,7' --no-pci --file-prefix=l3fwd-pwd \
    --vdev=virtio_user0,path=./vhost-net -- -p 1 --config="(0,0,14)" --parse-ptype --interrupt-only
    
  3. Send packets with packet generator, check the virtio-user related core can be wakeup status.

  4. Stop sending packets with packet generator, check virtio-user related core change to sleep status.

  5. Restart sending packets with packet generator, check virtio-user related core change to wakeup status again.

223.3.3. Test Case 3: Packed ring LSC event between vhost-user and virtio-user with cbdma enable

This case tests the LSC interrupt of packed ring virtio-user with vhost-user as the back-end when vhost uses the asynchronous operations with CBDMA channels. Flow: Vhost <–> Virtio

  1. Bind 1 CBDMA port to vfio-pci driver, then start vhost-user side:

    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x3000 -n 4 -a 0000:00:04.0 --file-prefix=vhost \
    --vdev 'net_vhost0,iface=vhost-net,queues=1,client=0,dmas=[txq0@0000:00:04.0;rxq0@0000:00:04.0]' \
    -- -i
    testpmd> set fwd mac
    testpmd> start
    
  2. Start virtio-user side:

    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0xc000 -n 4 --no-pci --file-prefix=virtio \
    --vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,packed_vq=1 \
    -- -i --tx-offloads=0x00
    testpmd> set fwd mac
    testpmd> start
    
  3. Check the virtio-user side link status:

    testpmd>  show port info 0
    #it should show "up"
    
  4. Quit the vhost-user side with testpmd, then check the virtio-user side link status:

    testpmd>  show port info 0
    #it should show "down"
    

223.3.4. Test Case 4: Packed ring virtio-user interrupt test with vhost-user as backend and cbdma enable

This case tests Rx interrupt of packed ring virtio-user with vhost-user as the back-end when vhost uses the asynchronous operations with CBDMA channels.

flow: TG –> NIC –> Vhost –> Virtio

  1. Bind 1 CBDMA port and 1 NIC port to vfio-pci, launch testpmd with a virtual vhost device as backend:

    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7c -n 4 -a 0000:af:00.0 -a 0000:00:04.0 \
    --vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[txq0@0000:00:04.0;rxq0@0000:00:04.0]' \
    -- -i  --rxq=1 --txq=1
    testpmd> start
    
  2. Start l3fwd-power with a virtio-user device:

    ./x86_64-native-linuxapp-gcc/examples/dpdk-l3fwd-power -c 0xc000 -n 4 --log-level='user1,7' --no-pci --file-prefix=l3fwd-pwd \
    --vdev=virtio_user0,path=./vhost-net,packed_vq=1 -- -p 1 --config="(0,0,14)" --parse-ptype --interrupt-only
    
  3. Send packets with packet generator, check the virtio-user related core can be wakeup status.

  4. Stop sending packets with packet generator, check virtio-user related core change to sleep status.

  5. Restart sending packets with packet generator, check virtio-user related core change to wakeup status again.

223.3.5. Test Case 5: Split ring multi-queues virtio-user interrupt test with vhost-user as backend and cbdma enable

This case tests Rx interrupt of split ring virtio-user with multi-queues and vhost-user as the back-end when vhost uses the asynchronous operations with CBDMA channels.

flow: TG –> NIC –> Vhost –> Virtio

  1. Bind 1 CBDMA port and 1 NIC port to vfio-pci, launch testpmd with a virtual vhost device as backend:

    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7c -n 4 -a 0000:af:00.0 -a 0000:00:04.0 \
    --vdev 'net_vhost0,iface=vhost-net,queues=2,dmas=[txq0@0000:00:04.0;rxq0@0000:00:04.0;txq1@0000:00:04.0;rxq1@0000:00:04.0]' \
    -- -i  --rxq=2 --txq=2
    testpmd> start
    
  2. Start l3fwd-power with a virtio-user device:

    ./x86_64-native-linuxapp-gcc/examples/dpdk-l3fwd-power -c 0xc000 -n 4 --log-level='user1,7' --no-pci --file-prefix=l3fwd-pwd \
    --vdev=virtio_user0,path=./vhost-net,queues=2 -- -p 1 --config="(0,0,14),(0,1,15)" --parse-ptype --interrupt-only
    
  3. Send packets with random ip from packet generator, check packets can forward back and both 2 queues exist packets, check the virtio-user related core can be wakeup status.

  4. Stop sending packets with packet generator, check virtio-user related core change to sleep status.

  5. Restart sending packets with packet generator, check virtio-user related core change to wakeup status again.

223.3.6. Test Case 6: Packed ring multi-queues virtio-user interrupt test with vhost-user as backend and cbdma enable

This case tests Rx interrupt of packed ring virtio-user with multi-queues and vhost-user as the back-end when vhost uses the asynchronous operations with CBDMA channels.

flow: TG –> NIC –> Vhost –> Virtio

  1. Bind 1 CBDMA port and 1 NIC port to vfio-pci, launch testpmd with a virtual vhost device as backend:

    ./x86_64-native-linuxapp-gcc/app/dpdk-testpmd -c 0x7c -n 4 -a 0000:af:00.0 -a 0000:00:04.0 \
    --vdev 'net_vhost0,iface=vhost-net,queues=2,dmas=[txq0@0000:00:04.0;rxq0@0000:00:04.0;txq1@0000:00:04.0;rxq1@0000:00:04.0]' \
    -- -i  --rxq=2 --txq=2
    testpmd> start
    
  2. Start l3fwd-power with a virtio-user device:

    ./x86_64-native-linuxapp-gcc/examples/dpdk-l3fwd-power -c 0xc000 -n 4 --log-level='user1,7' --no-pci --file-prefix=l3fwd-pwd \
    --vdev=virtio_user0,path=./vhost-net,queues=2,packed_vq=1 -- -p 1 --config="(0,0,14),(0,1,15)" --parse-ptype --interrupt-only
    
  3. Send packets with random ip from packet generator, check packets can forward back and both 2 queues exist packets, check the virtio-user related core can be wakeup status.

  4. Stop sending packets with packet generator, check virtio-user related core change to sleep status.

  5. Restart sending packets with packet generator, check virtio-user related core change to wakeup status again.