test suite reviews and discussions
 help / color / mirror / Atom feed
* [dts] [PATCH V1 0/5] rework test plan for runtime vf queue number
@ 2019-01-29 17:06 Lijuan Tu
  2019-01-29 17:06 ` [dts] [PATCH V1 1/5] test_plans: remove test plan for runtime " Lijuan Tu
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Lijuan Tu @ 2019-01-29 17:06 UTC (permalink / raw)
  To: dts, yuan.peng, zhirun.yan; +Cc: Lijuan Tu

Since DPDK 19.02 re-defined the EAL parameter "queue-num-per-vf" to
reserve queue number per vf. At the same time, it also extended the
maxinum queue numbers to 16 that VF could request from PF. Furthermore,
It supports both DPDK PF and Kernel PF.

* removed the old test plan
* new test plan was seperated to a series of 3 files due to simplify script.
* attached a picture to describe test topology

Lijuan Tu (5):
  test_plans: remove test plan for runtime queue number
  test_plans: add a picture to clarify test topology
  test_plans: add the main test plan for runtime vf queue number
  test_plans: add supplementary runtime vf queue number test plan
  test_plans: add test plan for runtime vf queue number( DPDK PF + DPDK
    VF)

 test_plans/image/2vf1pf.png                        | Bin 0 -> 24020 bytes
 test_plans/runtime_queue_number_test_plan.rst      | 465 ---------------------
 .../runtime_vf_queue_number_kernel_test_plan.rst   | 232 ++++++++++
 .../runtime_vf_queue_number_maxinum_test_plan.rst  | 134 ++++++
 test_plans/runtime_vf_queue_number_test_plan.rst   | 372 +++++++++++++++++
 5 files changed, 738 insertions(+), 465 deletions(-)
 create mode 100644 test_plans/image/2vf1pf.png
 delete mode 100644 test_plans/runtime_queue_number_test_plan.rst
 create mode 100644 test_plans/runtime_vf_queue_number_kernel_test_plan.rst
 create mode 100644 test_plans/runtime_vf_queue_number_maxinum_test_plan.rst
 create mode 100644 test_plans/runtime_vf_queue_number_test_plan.rst

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1 1/5] test_plans: remove test plan for runtime queue number
  2019-01-29 17:06 [dts] [PATCH V1 0/5] rework test plan for runtime vf queue number Lijuan Tu
@ 2019-01-29 17:06 ` Lijuan Tu
  2019-01-29 17:06 ` [dts] [PATCH V1 2/5] test_plans: add a picture to clarify test topology Lijuan Tu
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Lijuan Tu @ 2019-01-29 17:06 UTC (permalink / raw)
  To: dts, yuan.peng, zhirun.yan; +Cc: Lijuan Tu

Since DPDK 19.02 changed the defination of queue-num-per-vf,
This test plan is out of date, so remove it.

Signed-off-by: Lijuan Tu <lijuan.tu@intel.com>
---
 test_plans/runtime_queue_number_test_plan.rst | 465 --------------------------
 1 file changed, 465 deletions(-)
 delete mode 100644 test_plans/runtime_queue_number_test_plan.rst

diff --git a/test_plans/runtime_queue_number_test_plan.rst b/test_plans/runtime_queue_number_test_plan.rst
deleted file mode 100644
index 30eb073..0000000
--- a/test_plans/runtime_queue_number_test_plan.rst
+++ /dev/null
@@ -1,465 +0,0 @@
-.. Copyright (c) <2018>, Intel Corporation
-      All rights reserved.
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions
-   are met:
-
-   - Redistributions of source code must retain the above copyright
-     notice, this list of conditions and the following disclaimer.
-
-   - Redistributions in binary form must reproduce the above copyright
-     notice, this list of conditions and the following disclaimer in
-     the documentation and/or other materials provided with the
-     distribution.
-
-   - Neither the name of Intel Corporation nor the names of its
-     contributors may be used to endorse or promote products derived
-     from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
-   OF THE POSSIBILITY OF SUCH DAMAGE.
-
-=====================================
-Dynamically Configure VF Queue Number
-=====================================
-
-Description
-===========
-
-   Now RTE_LIBRTE_I40E_QUEUE_NUM_PER_VF is used to determine the max queue
-   number per VF. It's not friendly to the users because it means the users
-   must decide the max queue number when compiling. There's no chance to
-   change it when deploying their APP. It's good to make the queue number
-   to be configurable so the users can change it when launching the APP.
-   This requirement is meaningless to ixgbe since the queue is fixed on
-   ixgbe.
-   The number of queues per i40e VF can be determinated
-   during run time. For example, if the PCI address of an i40e PF is
-   aaaa:bb.cc, with the EAL parameter -w aaaa:bb.cc,queue-num-per-vf=8,
-   the number of queues per VF created from this PF is 8.
-   Set the VF max queue number with the PF EAL parameter "queue-num-per-vf".
-   the valid values includes 1,2,4,8,16; if the value after the
-   "queue-num-per-vf" is invalid, it is set as 4 forcibly;
-   if there is no "queue-num-per-vf" setting in EAL parameters,
-   it is 4 by default as before.
-
-Prerequisites
-=============
-
-1. Hardware:
-   Fortville
-
-2. Software:
-   dpdk: http://dpdk.org/git/dpdk
-   scapy: http://www.secdev.org/projects/scapy/
-
-3. Bind the pf port to dpdk driver::
-
-    ./usertools/dpdk-devbind.py -b igb_uio 05:00.0
-
-4. Set up two vfs from the pf with DPDK driver::
-
-    echo 2 > /sys/bus/pci/devices/0000\:05\:00.0/max_vfs
-
-   Bind the two vfs to DPDK driver::
-
-    ./usertools/dpdk-devbind.py -b vfio-pci 05:02.0 05:02.1
-
-Test case: set valid VF max queue number 
-========================================
-
-1. Try the valid values 1::
-
-    ./testpmd -c f -n 4 -w 05:00.0,queue-num-per-vf=1 \
-    --file-prefix=test1 --socket-mem 1024,1024 -- -i
-  
-   Testpmd can be started normally without any wrong or error.
-
-2. Start VF testpmd with "--rxq=1 --txq=1", the number of rxq and txq is
-   consistent with the configured VF max queue number::
-
-    ./testpmd -c 0xf0 -n 4 -w 05:02.0 \
-    --file-prefix=test2 --socket-mem 1024,1024 -- -i --rxq=1 --txq=1
-
-   Check the Max possible RX queues and TX queues is 1::
-
-    testpmd> show port info all
-    Max possible RX queues: 1
-    Max possible number of RXDs per queue: 4096
-    Min possible number of RXDs per queue: 64
-    RXDs number alignment: 32
-    Max possible TX queues: 1
-    Max possible number of TXDs per queue: 4096
-    Min possible number of TXDs per queue: 64
-    TXDs number alignment: 32
- 
-   Start forwarding, you can see the actual queue number is 1::
-
-    testpmd> start
-    RX queues=1 - RX desc=128 - RX free threshold=32
-    TX queues=1 - TX desc=512 - TX free threshold=32 
-
-3. Repeat step1-2 with "queue-num-per-vf=2/4/8/16", and start VF testpmd
-   with consistent rxq and txq number. check the max queue num and actual
-   queue number is 2/4/8/16.
-
-Test case: set invalid VF max queue number
-==========================================
-
-1. Try the invalid value 0::
-
-    ./testpmd -c f -n 4 -w 05:00.0,queue-num-per-vf=0 \
-    --file-prefix=test1 --socket-mem 1024,1024 -- -i
-
-   Testpmd started with "i40e_pf_parse_vf_queue_number_handler(): Wrong
-   VF queue number = 0, it must be power of 2 and equal or less than 16 !,
-   Now it is kept the value = 4"
-
-2. Start VF testpmd with "--rxq=4 --txq=4", the number of rxq and txq is
-   consistent with the default VF max queue number::
-
-    ./testpmd -c 0xf0 -n 4 -w 05:02.0 --file-prefix=test2 \
-    --socket-mem 1024,1024 -- -i --rxq=4 --txq=4
-
-   Check the Max possible RX queues and TX queues is 4::
-
-    testpmd> show port info all
-    Max possible RX queues: 4
-    Max possible TX queues: 4
-
-   Start forwarding, you can see the actual queue number is 4::
-
-    testpmd> start
-    RX queues=4 - RX desc=128 - RX free threshold=32
-    TX queues=4 - TX desc=512 - TX free threshold=32
-
-3. Repeat step1-2 with "queue-num-per-vf=6/17/32", and start VF testpmd
-   with default max rxq and txq number. check the max queue num and actual
-   queue number is 4.
-
-Test case: set VF queue number in testpmd command-line options
-==============================================================
-
-1. Set VF max queue number::
-
-    ./testpmd -c f -n 4 -w 05:00.0,queue-num-per-vf=8 \
-    --file-prefix=test1 --socket-mem 1024,1024 -- -i
-
-2. Start VF testpmd with "--rxq=3 --txq=3"::
-
-    ./testpmd -c 0xf0 -n 4 -w 05:02.0 --file-prefix=test2 \
-    --socket-mem 1024,1024 -- -i --rxq=3 --txq=3
-
-   Check the Max possible RX queues and TX queues is 8::
-
-    testpmd> show port info all
-    Max possible RX queues: 8
-    Max possible TX queues: 8
-
-   Start forwarding, you can see the actual queue number is 3::
-
-    testpmd> start
-    RX queues=3 - RX desc=128 - RX free threshold=32
-    TX queues=3 - TX desc=512 - TX free threshold=32
-
-3. Quit the VF testpmd, then restart VF testpmd with "--rxq=9 --txq=9"::
-
-    ./testpmd -c 0xf0 -n 4 -w 05:02.0 --file-prefix=test2 \
-    --socket-mem 1024,1024 -- -i --rxq=9 --txq=9
-
-   VF testpmd failed to start with the print::
-
-    Fail: nb_rxq(9) is greater than max_rx_queues(8)
-
-Test case: set VF queue number with testpmd function command
-============================================================
-
-1. Set VF max queue number::
-
-    ./testpmd -c f -n 4 -w 05:00.0,queue-num-per-vf=8 \
-    --file-prefix=test1 --socket-mem 1024,1024 -- -i
-
-2. Start VF testpmd without setting "rxq" and "txq"::
-
-    ./testpmd -c 0xf0 -n 4 -w 05:02.0 --file-prefix=test2 \
-    --socket-mem 1024,1024 -- -i
-
-   Check the Max possible RX queues and TX queues is 8,
-   and actual RX queue number and TX queue number is 1::
-
-    testpmd> show port info all
-    Current number of RX queues: 1
-    Max possible RX queues: 8
-    Current number of TX queues: 1
-    Max possible TX queues: 8
-
-3. Set rx queue number and tx queue number with testpmd function command::
-
-    testpmd> port stop all
-    testpmd> port config all rxq 8
-    testpmd> port config all txq 8
-    testpmd> port start all
-
-4. Start forwarding, you can see the actual queue number is 8::
-
-    testpmd> show port info all
-    Current number of RX queues: 8
-    Max possible RX queues: 8
-    Current number of TX queues: 8
-    Max possible TX queues: 8
-
-5. Reset rx queue number and tx queue number to 7::
-
-    testpmd> port stop all
-    testpmd> port config all rxq 7
-    testpmd> port config all txq 7
-    testpmd> port start all
-
-   Start forwarding, you can see the actual queue number is 7::
-
-    testpmd> show port info all
-    Current number of RX queues: 7
-    Max possible RX queues: 8
-    Current number of TX queues: 7
-    Max possible TX queues: 8
-
-6. Reset rx queue number and tx queue number to 9::
-
-    testpmd> port stop all
-    testpmd> port config all txq 9
-    Fail: nb_txq(9) is greater than max_tx_queues(8)
-    testpmd> port config all rxq 9
-    Fail: nb_rxq(9) is greater than max_rx_queues(8)
-    testpmd> port start all
-
-   Start forwarding, you can see the actual queue number is still 7::
-
-    testpmd> show port info all
-    Current number of RX queues: 7
-    Max possible RX queues: 8
-    Current number of TX queues: 7
-    Max possible TX queues: 8
-
-Test case: VF max queue number when VF bound to kernel driver
-=============================================================
-
-1. Set VF max queue number by PF::
-
-    ./testpmd -c f -n 4 -w 05:00.0,queue-num-per-vf=2 \
-    --file-prefix=test1 --socket-mem 1024,1024 -- -i
-
-2. Check the VF0 rxq and txq number is 2::
-
-    # ethtool -S enp5s2
-    NIC statistics:
-         rx_bytes: 0
-         rx_unicast: 0
-         rx_multicast: 0
-         rx_broadcast: 0
-         rx_discards: 0
-         rx_unknown_protocol: 0
-         tx_bytes: 0
-         tx_unicast: 0
-         tx_multicast: 0
-         tx_broadcast: 0
-         tx_discards: 0
-         tx_errors: 0
-         tx-0.packets: 0
-         tx-0.bytes: 0
-         tx-1.packets: 0
-         tx-1.bytes: 0
-         rx-0.packets: 0
-         rx-0.bytes: 0
-         rx-1.packets: 0
-         rx-1.bytes: 0
-
-   Check the VF1 rxq and txq number is 2 too.
- 
-3. Repeat step1-2 with "queue-num-per-vf=1/4/8/16", check the rxq and txq
-   number is 1/4/8/16.
-
-Test case: set VF max queue number with max VFs on one PF port
-==============================================================
-
-1. Set up max VFs from one PF with DPDK driver
-   Create 32 vfs on four ports fortville NIC::
-
-    echo 32 > /sys/bus/pci/devices/0000\:05\:00.0/max_vfs
-
-   Create 64 vfs on two ports fortville NIC::
-
-    echo 64 > /sys/bus/pci/devices/0000\:05\:00.0/max_vfs
-
-   Bind the two of the VFs to DPDK driver::
-
-    ./usertools/dpdk-devbind.py -b vfio-pci 05:02.0 05:05.7
-
-2. Set VF max queue number to 16::
-
-    ./testpmd -c f -n 4 -w 05:00.0,queue-num-per-vf=16 \
-    --file-prefix=test1 --socket-mem 1024,1024 -- -i
-
-   PF port failed to started with "i40e_pf_parameter_init():
-   Failed to allocate 577 queues, which exceeds the hardware maximum 384"
-   If create 64 vfs, the maximum is 768.
-
-3. Set VF max queue number to 8::
-
-    ./testpmd -c f -n 4 -w 05:00.0,queue-num-per-vf=8 \
-    --file-prefix=test1 --socket-mem 1024,1024 -- -i
-
-4. Start the two VFs testpmd with "--rxq=8 --txq=8" and "--rxq=6 --txq=6"::
-
-    ./testpmd -c 0xf0 -n 4 -w 05:02.0 --file-prefix=test2 \
-    --socket-mem 1024,1024 -- -i --rxq=8 --txq=8
-
-    ./testpmd -c 0xf00 -n 4 -w 05:05.7 --file-prefix=test3 \
-    --socket-mem 1024,1024 -- -i --rxq=6 --txq=6
-
-   Check the Max possible RX queues and TX queues of the two VFs are both 8::
-
-    testpmd> show port info all
-    Max possible RX queues: 8
-    Max possible TX queues: 8
-
-   Start forwarding, you can see the actual queue number
-   VF0::
-
-    testpmd> start
-    RX queues=8 - RX desc=128 - RX free threshold=32
-    TX queues=8 - TX desc=512 - TX free threshold=32
-
-   VF1::
-
-    testpmd> start
-    RX queues=6 - RX desc=128 - RX free threshold=32
-    TX queues=6 - TX desc=512 - TX free threshold=32
-
-   Modify the queue number of VF1::
-
-    testpmd> stop
-    testpmd> port stop all
-    testpmd> port config all rxq 8
-    testpmd> port config all txq 7
-    testpmd> port start all
-
-   Start forwarding, you can see the VF1 actual queue number is 8 and 7::
-
-    testpmd> start
-    RX queues=8 - RX desc=128 - RX free threshold=32
-    TX queues=7 - TX desc=512 - TX free threshold=32
-
-5. Send 256 packets to VF0 and VF1, make sure packets can be distributed
-   to all the queues.
-
-Test case: pass through VF to VM
-================================
-
-1. Bind the pf to dpdk driver::
-
-    ./usertools/dpdk-devbind.py -b igb_uio 05:00.0
-
-   Create 1 vf from pf::
-
-    echo 1 >/sys/bus/pci/devices/0000:05:00.0/max_vfs
-
-   Detach VF from the host, bind them to pci-stub driver::
-
-    modprobe pci-stub
-    echo "8086 154c" > /sys/bus/pci/drivers/pci-stub/new_id
-    echo "0000:05:02.0" > /sys/bus/pci/drivers/i40evf/unbind
-    echo "0000:05:02.0" > /sys/bus/pci/drivers/pci-stub/bind
-
-   Lauch the VM with the VF PCI passthrough::
-
-    taskset -c 5-20 qemu-system-x86_64 \
-    -enable-kvm -m 8192 -smp cores=16,sockets=1 -cpu host -name dpdk1-vm1 \
-    -drive file=/home/VM/ubuntu-14.04.img \
-    -device pci-assign,host=0000:05:02.0 \
-    -netdev tap,id=ipvm1,ifname=tap3,script=/etc/qemu-ifup -device rtl8139,netdev=ipvm1,id=net0,mac=00:00:00:00:00:01 \
-    -localtime -vnc :2 -daemonize
-
-2. Set VF Max possible RX queues and TX queues to 8 by PF::
-
-    ./testpmd -c f -n 4 -w 05:00.0,queue-num-per-vf=8 \
-    --file-prefix=test1 --socket-mem 1024,1024 -- -i
-
-   Testpmd can be started normally without any wrong or error.
-
-3. Start VF testpmd with "--rxq=6 --txq=6", the number of rxq and txq is
-   consistent with the configured VF max queue number::
-
-    ./testpmd -c 0xf -n 4 -- -i --rxq=6 --txq=6
-
-   Check the Max possible RX queues and TX queues is 8::
-
-    testpmd> show port info all
-    Max possible RX queues: 8
-    Max possible TX queues: 8
-
-   Start forwarding, you can see the actual queue number is 6::
-
-    testpmd> start
-    RX queues=6 - RX desc=128 - RX free threshold=32
-    TX queues=6 - TX desc=512 - TX free threshold=32
-
-   Modify the queue number of VF::
-
-    testpmd> stop
-    testpmd> port stop all
-    testpmd> port config all rxq 8
-    testpmd> port config all txq 8
-    testpmd> port start all
-
-   Start forwarding, you can see the VF1 actual queue number is 8::
-
-    testpmd> start
-    RX queues=8 - RX desc=128 - RX free threshold=32
-    TX queues=8 - TX desc=512 - TX free threshold=32
-
-4. Repeat step2-3 with "queue-num-per-vf=1/2/4/16", and start VF testpmd
-   with consistent rxq and txq number. check the max queue num and actual
-   queue number is 1/2/4/16.
- 
-5. Bind VF to kernel driver i40evf, check the rxq and txq number.
-   if set VF Max possible RX queues and TX queues to 2 by PF,
-   the VF rxq and txq number is 2
-
-.. code-block:: console
-
-    #ethtool -S eth0
-    NIC statistics:
-         rx_bytes: 0
-         rx_unicast: 0
-         rx_multicast: 0
-         rx_broadcast: 0
-         rx_discards: 0
-         rx_unknown_protocol: 0
-         tx_bytes: 70
-         tx_unicast: 0
-         tx_multicast: 1
-         tx_broadcast: 0
-         tx_discards: 0
-         tx_errors: 0
-         tx-0.packets: 2
-         tx-0.bytes: 140
-         tx-1.packets: 6
-         tx-1.bytes: 1044
-         rx-0.packets: 0
-         rx-0.bytes: 0
-         rx-1.packets: 0
-         rx-1.bytes: 0
-
-   Try to set VF Max possible RX queues and TX queues to 1/4/8/16 by PF,
-   the VF rxq and txq number is 1/4/8/16::
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1 2/5] test_plans: add a picture to clarify test topology
  2019-01-29 17:06 [dts] [PATCH V1 0/5] rework test plan for runtime vf queue number Lijuan Tu
  2019-01-29 17:06 ` [dts] [PATCH V1 1/5] test_plans: remove test plan for runtime " Lijuan Tu
@ 2019-01-29 17:06 ` Lijuan Tu
  2019-01-29 17:06 ` [dts] [PATCH V1 3/5] test_plans: add the main test plan for runtime vf queue number Lijuan Tu
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Lijuan Tu @ 2019-01-29 17:06 UTC (permalink / raw)
  To: dts, yuan.peng, zhirun.yan; +Cc: Lijuan Tu

A picture is more vivid while discribe a test topology.

Signed-off-by: Lijuan Tu <lijuan.tu@intel.com>
---
 test_plans/image/2vf1pf.png | Bin 0 -> 24020 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test_plans/image/2vf1pf.png

diff --git a/test_plans/image/2vf1pf.png b/test_plans/image/2vf1pf.png
new file mode 100644
index 0000000000000000000000000000000000000000..c53320a1f7a3344cc5315cd11d24df174f912b91
GIT binary patch
literal 24020
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
aZ^qXTD1T?w4pd?nIB#NkrsT9s)IR}_rEJ0g

literal 0
HcmV?d00001

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1 3/5] test_plans: add the main test plan for runtime vf queue number
  2019-01-29 17:06 [dts] [PATCH V1 0/5] rework test plan for runtime vf queue number Lijuan Tu
  2019-01-29 17:06 ` [dts] [PATCH V1 1/5] test_plans: remove test plan for runtime " Lijuan Tu
  2019-01-29 17:06 ` [dts] [PATCH V1 2/5] test_plans: add a picture to clarify test topology Lijuan Tu
@ 2019-01-29 17:06 ` Lijuan Tu
  2019-01-29 17:06 ` [dts] [PATCH V1 4/5] test_plans: add supplementary runtime vf queue number test plan Lijuan Tu
  2019-01-29 17:06 ` [dts] [PATCH V1 5/5] test_plans: add test plan for runtime vf queue number( DPDK PF + DPDK VF) Lijuan Tu
  4 siblings, 0 replies; 6+ messages in thread
From: Lijuan Tu @ 2019-01-29 17:06 UTC (permalink / raw)
  To: dts, yuan.peng, zhirun.yan; +Cc: Lijuan Tu

this test plan covers general cases in test scenario of DPDK PF + DPDK VF
except the test cases of maxmine vf queue number.

Signed-off-by: Lijuan Tu <lijuan.tu@intel.com>
---
 test_plans/runtime_vf_queue_number_test_plan.rst | 372 +++++++++++++++++++++++
 1 file changed, 372 insertions(+)
 create mode 100644 test_plans/runtime_vf_queue_number_test_plan.rst

diff --git a/test_plans/runtime_vf_queue_number_test_plan.rst b/test_plans/runtime_vf_queue_number_test_plan.rst
new file mode 100644
index 0000000..8ac7dc4
--- /dev/null
+++ b/test_plans/runtime_vf_queue_number_test_plan.rst
@@ -0,0 +1,372 @@
+.. Copyright (c) <2019>, Intel Corporation
+      All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+
+   - Neither the name of Intel Corporation nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+   OF THE POSSIBILITY OF SUCH DAMAGE.
+
+====================================
+VF Request Queue Number At Runtime
+====================================
+
+Both kernel driver, I40E and DPDK PMD driver, igb_uio/vfio-pci support
+VF request queue number at runtime, that means the users could configure
+the VF queue number at runtime. 
+
+Snice DPDK 19.02, VF is able to request max to 16 queues and the PF EAL 
+parameter 'queue-num-per-vf' is redefined as the number of reserved queue
+per VF. For example, if the PCI address of an i40e PF is aaaa:bb.cc,
+with the EAL parameter -w aaaa:bb.cc,queue-num-per-vf=8, the number of
+reserved queue per VF created from this PF is 8. The valid values of
+queue-num-per-vf inclues 1,2,4,8,16, if the value of queue-num-per-vf
+is invalid, it is set as 4 forcibly, if there is no queue-num-per-vf
+setting in EAL parameters, it is 4 by default. If VF request more than
+reserved queues per VF, PF will able to allocate max to 16 queues after
+a VF reset. If VF request smaller than reserved queues per VF, PF will
+able to allocate the request queues without a VF reset.
+
+Note: there are 3 test plans about VF Request Queue Number At Runtime.
+Please read all test plans to get complete information.
+
+* runtime_vf_queue_number_test_plan.rst
+* runtime_vf_queue_number_maxinum_test_plan.rst 
+* runtime_vf_queue_number_kernel_test_plan.rst
+
+Prerequisites
+=============
+
+1. Hardware:
+
+-  Fortville(X710/XXV710/XL710)
+
+2. Software:
+
+- DPDK: http://dpdk.org/git/dpdk (version: 19.02+)
+- Scapy: http://www.secdev.org/projects/scapy/
+
+3. Scenario:
+
+- DPDK PF + DPDK VF
+
+4. test topology:
+
+.. figure:: image/2vf1pf.png
+
+Set up scenario
+===============
+
+Assume create 2 vf from 1pf. 
+
+1. Bind PF to DPDK driver, igb_uio::
+
+     ./usertools/dpdk-devbind.py -b igb_uio 0000:18:00.0
+
+2. Create 2 vf from PF::
+
+     echo 2 >/sys/bus/pci/devices/0000:18:00.0/max_vfs
+
+     usertools/dpdk-devbind.py --s
+     0000:18:00.0 'Ethernet Controller X710 for 10GbE SFP+' if= drv=igb_uio unused=i40e
+     0000:18:02.0 'XL710/X710 Virtual Function' unused=
+
+3. Detach VF from the host, bind them to vfio-pci driver::
+
+     modprobe vfio
+     modprobe vfio-pci
+
+   Note: there are 2 ways to bind devices to vfio-pci:
+
+- Leverage usertools in dpdk package::
+
+     usertools/dpdk-devbind.py --bind=vfio-pci 0000:18:02.0
+
+- leverage Linux command::
+
+     using `lspci -nn|grep -i ethernet` got VF device id, for example "8086 154c",
+
+     echo "8086 154c" > /sys/bus/pci/drivers/vfio-pci/new_id
+     echo 0000:18:02.0 > /sys/bus/pci/devices/0000:18:02.0/driver/unbind
+     echo 0000:18:02.0 > /sys/bus/pci/drivers/vfio-pci/bind
+
+4. Passthrough VFs 18:02.0 to vm0 and start vm0::
+
+     /usr/bin/qemu-system-x86_64  -name vm0 -enable-kvm \
+     -cpu host -smp 4 -m 2048 -drive file=/home/image/sriov-1.img -vnc :1 \
+     -device vfio-pci,host=0000:18:02.0,id=pt_0
+
+Now the scenario has been set up, you will have 1 port in the vm0.
+
+5. Bind VF to dpdk driver igb_uio in VM::
+
+    usertools/dpdk-devbind.py --bind=igb_uio 0000:03:00.0
+
+Test case 1: reserve valid vf queue number
+==========================================
+
+1. Start PF testpmd with random queue-num-per-vf in [1, 2, 4, 8 ,16], for example, we use 4 as the reserved vf queue numbers::
+
+     ./testpmd -c f -n 4 -w 18:00.0,queue-num-per-vf=4 \
+     --file-prefix=test1 --socket-mem 1024,1024 -- -i
+  
+   Note testpmd can be started normally without any wrong or error.
+
+2. Start VF testpmd::
+
+     ./testpmd -c 0xf0 -n 4 -w 03:00.0 \
+     --file-prefix=test2 --socket-mem 1024,1024 -- -i
+
+3. VF request a queue number that is equal to reserved queue number, and we can not find VF reset while confiuring it::
+
+     testpmd> port stop all
+     testpmd> port config all txq 4
+     testpmd> port config all rxq 4
+     testpmd> port start all
+
+   Start forwarding, you can see the actual queue number is 4, and there is no VF reset operation::
+
+     testpmd> start
+     port 0: RX queue number: 4 Tx queue number: 4
+
+4. VF request a queue number that is greater than reserved queue number, and we find VF reset while confiuring it::
+
+     testpmd> port stop all
+     testpmd> port config all txq 5
+     testpmd> port config all rxq 5
+     testpmd> port start all
+ 
+   Start forwarding, you can see the actual queue number is 5, and find VF reseted::
+
+     testpmd> start
+     port 0: RX queue number: 5 Tx queue number: 5
+
+Note: Please find the expected behavior with different queue-num-per-vf in table[1].
+
+[1] VF request queue number with expected VF reset operation::
+
+    +------------------+---------------------+--------------------+
+    | queue-num-per-vf | configured vf queue | VF reset operation |
+    +==================+=====================+====================+
+    | 1                | 1                   | NO                 |
+    +------------------+---------------------+--------------------+
+    | 1                | 2                   | YES                |
+    +------------------+---------------------+--------------------+
+    | 2                | 2                   | NO                 |
+    +------------------+---------------------+--------------------+
+    | 2                | 3                   | YES                |
+    +------------------+---------------------+--------------------+
+    | 4                | 4                   | NO                 |
+    +------------------+---------------------+--------------------+
+    | 4                | 5                   | YES                |
+    +------------------+---------------------+--------------------+
+    | 8                | 8                   | NO                 |
+    +------------------+---------------------+--------------------+
+    | 8                | 9                   | YES                |
+    +------------------+---------------------+--------------------+
+    | 16               | 16                  | NO                 |
+    +------------------+---------------------+--------------------+
+
+Test case 2: reserve invalid VF queue number
+============================================
+
+1. Start PF testpmd with random queue-num-per-vf in [0, 3, 5-7 , 9-15, 17], for example, we use 0 as the reserved vf queue numbers::
+
+     ./testpmd -c f -n 4 -w 18:00.0,queue-num-per-vf=0 \
+     --file-prefix=test1 --socket-mem 1024,1024 -- -i
+
+2. Verify testpmd started with logs as below::
+
+     i40e_pf_parse_vf_queue_number_handler(): Wrong VF queue number = 0, it must be power of 2 and equal or less than 16 !, Now it is kept the value = 4
+
+Test case 3: set valid VF queue number in testpmd command-line options
+======================================================================
+
+1. Start PF testpmd::
+
+      ./testpmd -c f -n 4 -w 18:00.0 \
+      --file-prefix=test1 --socket-mem 1024,1024 -- -i
+
+2. Start VF testpmd with "--rxq=[rxq] --txq=[txq]", and random valid values from 1 to 16, take 3 for example::
+
+     ./testpmd -c 0xf0 -n 4 -w 18:02.0 --file-prefix=test2 \
+     --socket-mem 1024,1024 -- -i --rxq=3 --txq=3
+
+3. Configure vf forwarding prerequisits and start forwarding::
+
+     testpmd> set promisc all off
+     testpmd> set fwd mac
+
+4. Start forwarding, and verfiy the queue number informantion. both the RX queue number and the TX queue number must be same as your configuration. Here is 3::
+
+     testpmd> start
+
+     port 0: RX queue number: 3 Tx queue number: 3
+
+5. Send packets to VF from tester, and make sure they match the default RSS rules, IPV4_UNKNOW, and will be distributed to all the queues that you configured, Here is 3::
+
+     pkt1 = Ether(dst="$vf_mac", src="$tester_mac")/IP(src="10.0.0.1",dst="192.168.0.1")/("X"*48)
+     pkt2 = Ether(dst="$vf_mac", src="$tester_mac")/IP(src="10.0.0.1",dst="192.168.0.2")/("X"*48)
+     pkt3 = Ether(dst="$vf_mac", src="$tester_mac")/IP(src="10.0.0.1",dst="192.168.0.3")/("X"*48)
+
+6. Stop forwarding, and check the queues statistics, every RX/TX queue must has 1 packet go through, and total 3 packets in uni-direction as well as 6 packets in bi-direction::
+
+    testpmd> stop
+
+      ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 0/Queue= 0 -------
+      RX-packets: 1       TX-packets: 1       TX-dropped: 0
+      ------- Forward Stats for RX Port= 0/Queue= 1 -> TX Port= 0/Queue= 1 -------
+      RX-packets: 1              TX-packets: 1             TX-dropped: 0
+      ------- Forward Stats for RX Port= 0/Queue= 2 -> TX Port= 0/Queue= 2 -------
+      RX-packets: 1              TX-packets: 1             TX-dropped: 0
+      ---------------------- Forward statistics for port 0  ----------------------
+      RX-packets: 3      RX-dropped: 0     RX-total: 3
+      TX-packets: 3       TX-dropped: 0             TX-total: 3
+      ----------------------------------------------------------------------------
+
+7. Repeat step 2 to 6 with the mininum queue number, 1, and the maximum queue number, 16. 
+
+Test case 4: set invalid VF queue number in testpmd command-line options
+========================================================================
+
+1. Start PF testpmd::
+
+     ./testpmd -c f -n 4 -w 18:00.0 \
+     --file-prefix=test1 --socket-mem 1024,1024 -- -i
+
+2. Start VF testpmd with "--rxq=0 --txq=0" ::
+
+     ./testpmd -c 0xf0 -n 4 -w 18:02.0 --file-prefix=test2 \
+     --socket-mem 1024,1024 -- -i --rxq=0 --txq=0
+
+   Verify testpmd exited with error as below::
+
+    Either rx or tx queues should be non-zero
+
+3. Start VF testpmd with "--rxq=17 --txq=17" ::
+
+     ./testpmd -c 0xf0 -n 4 -w 18:02.0 --file-prefix=test2 \
+     --socket-mem 1024,1024 -- -i --rxq=17 --txq=17
+
+   Verify testpmd exited with error as below::
+
+     txq 17 invalid - must be >= 0 && <= 16
+
+Test case 5: set valid VF queue number with testpmd function command
+====================================================================
+
+1. Start PF testpmd::
+
+     ./testpmd -c f -n 4 -w 18:00.0 \
+     --file-prefix=test1 --socket-mem 1024,1024 -- -i
+
+2. Start VF testpmd without setting "rxq" and "txq"::
+
+     ./testpmd -c 0xf0 -n 4 -w 05:02.0 --file-prefix=test2 \
+     --socket-mem 1024,1024 -- -i
+
+3. Configure vf forwarding prerequisits and start forwarding::
+
+     testpmd> set promisc all off
+     testpmd> set fwd mac
+
+4. Set rx queue number and tx queue number with random value range from 1 to 16 with testpmd function command, take 3 for example::
+
+     testpmd> port stop all
+     testpmd> port config all rxq 3
+     testpmd> port config all txq 3
+     testpmd> port start all
+
+5. Repeat step 4-7 of test case 3.
+
+Test case 6: set invalid VF queue number with testpmd function command
+======================================================================
+
+1. Start PF testpmd::
+
+     ./testpmd -c f -n 4 -w 18:00.0 \
+     --file-prefix=test1 --socket-mem 1024,1024 -- -i
+
+2. Start VF testpmd without setting "rxq" and "txq"::
+
+     ./testpmd -c 0xf0 -n 4 -w 05:02.0 --file-prefix=test2 \
+     --socket-mem 1024,1024 -- -i
+
+
+3. Set rx queue number and tx queue number with 0 ::
+
+     testpmd> port stop all
+     testpmd> port config all rxq 0
+     testpmd> port config all txq 0
+     testpmd> port start all
+
+4. Set rx queue number and tx queue number with 17 ::
+
+     testpmd> port stop all
+     testpmd> port config all rxq 17
+     testpmd> port config all txq 17
+     testpmd> port start all
+
+Verify error information::
+
+     Fail: input rxq (17) can't be greater than max_rx_queues (16) of port 0
+
+
+Test case 7: Reserve VF queue number when VF bind to kernel driver
+==================================================================
+
+1. bind vf to kernel driver i40evf::
+
+     ./usertools/dpdk-devbind.py -b i40e 0000:18:02.0
+
+2. Reserve VF queue number ::
+
+     ./testpmd -c f -n 4 -w 18:00.0,queue-num-per-vf=2 \
+     --file-prefix=test1 --socket-mem 1024,1024 -- -i
+
+3. Check the VF0 rxq and txq number is 2::
+
+     ethtool -S enp5s2
+     NIC statistics:
+          rx_bytes: 0
+          rx_unicast: 0
+          rx_multicast: 0
+          rx_broadcast: 0
+          rx_discards: 0
+          rx_unknown_protocol: 0
+          tx_bytes: 0
+          tx_unicast: 0
+          tx_multicast: 0
+          tx_broadcast: 0
+          tx_discards: 0
+          tx_errors: 0
+          tx-0.packets: 0
+          tx-0.bytes: 0
+          tx-1.packets: 0
+          tx-1.bytes: 0
+          rx-0.packets: 0
+          rx-0.bytes: 0
+          rx-1.packets: 0
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1 4/5] test_plans: add supplementary runtime vf queue number test plan
  2019-01-29 17:06 [dts] [PATCH V1 0/5] rework test plan for runtime vf queue number Lijuan Tu
                   ` (2 preceding siblings ...)
  2019-01-29 17:06 ` [dts] [PATCH V1 3/5] test_plans: add the main test plan for runtime vf queue number Lijuan Tu
@ 2019-01-29 17:06 ` Lijuan Tu
  2019-01-29 17:06 ` [dts] [PATCH V1 5/5] test_plans: add test plan for runtime vf queue number( DPDK PF + DPDK VF) Lijuan Tu
  4 siblings, 0 replies; 6+ messages in thread
From: Lijuan Tu @ 2019-01-29 17:06 UTC (permalink / raw)
  To: dts, yuan.peng, zhirun.yan; +Cc: Lijuan Tu

In order to simplify script, seperate the test case of maxinum vf queue
number to this test plan.

Signed-off-by: Lijuan Tu <lijuan.tu@intel.com>
---
 .../runtime_vf_queue_number_maxinum_test_plan.rst  | 134 +++++++++++++++++++++
 1 file changed, 134 insertions(+)
 create mode 100644 test_plans/runtime_vf_queue_number_maxinum_test_plan.rst

diff --git a/test_plans/runtime_vf_queue_number_maxinum_test_plan.rst b/test_plans/runtime_vf_queue_number_maxinum_test_plan.rst
new file mode 100644
index 0000000..bbf8760
--- /dev/null
+++ b/test_plans/runtime_vf_queue_number_maxinum_test_plan.rst
@@ -0,0 +1,134 @@
+.. Copyright (c) <2019>, Intel Corporation
+         All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+
+   - Neither the name of Intel Corporation nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+   OF THE POSSIBILITY OF SUCH DAMAGE.
+
+==========================================
+VF Request Maximum Queue Number At Runtime
+==========================================
+
+This test plan is an additional tests for VF Request Queue Number At Runtime.
+In order to make testing excution efficiency, we put the test case of
+maximum queue number in this plan, because of different test scenarios.
+
+Feature Description
+===================
+
+see runtime_vf_queue_number_test_plan.rst
+
+Prerequisites
+=============
+
+1. Hardware:
+
+- Fortville(X710/XXV710/XL710)
+
+2. Software:
+
+- dpdk: http://dpdk.org/git/dpdk (version: 19.02+)
+- scapy: http://www.secdev.org/projects/scapy/
+
+3. Scenario:
+   DPDK PF + DPDK VF
+
+Test case 1: set VF max queue number with max VFs on one PF port
+================================================================
+
+1. Set up max VFs from one PF with DPDK driver
+   Create 32 vfs on four ports fortville NIC::
+
+    echo 32 > /sys/bus/pci/devices/0000\:05\:00.0/max_vfs
+
+   Create 64 vfs on two ports fortville NIC::
+
+    echo 64 > /sys/bus/pci/devices/0000\:05\:00.0/max_vfs
+
+   Bind the two of the VFs to DPDK driver::
+
+    ./usertools/dpdk-devbind.py -b vfio-pci 05:02.0 05:05.7
+
+2. Set VF max queue number to 16::
+
+    ./testpmd -c f -n 4 -w 05:00.0,queue-num-per-vf=16 \
+    --file-prefix=test1 --socket-mem 1024,1024 -- -i
+
+   PF port failed to started with "i40e_pf_parameter_init():
+   Failed to allocate 577 queues, which exceeds the hardware maximum 384"
+   If create 64 vfs, the maximum is 768.
+
+3. Set VF max queue number to 8::
+
+    ./testpmd -c f -n 4 -w 05:00.0,queue-num-per-vf=8 \
+    --file-prefix=test1 --socket-mem 1024,1024 -- -i
+
+4. Start the two VFs testpmd with "--rxq=8 --txq=8" and "--rxq=6 --txq=6"::
+
+    ./testpmd -c 0xf0 -n 4 -w 05:02.0 --file-prefix=test2 \
+    --socket-mem 1024,1024 -- -i --rxq=8 --txq=8
+
+    ./testpmd -c 0xf00 -n 4 -w 05:05.7 --file-prefix=test3 \
+    --socket-mem 1024,1024 -- -i --rxq=6 --txq=6
+
+   Check the Max possible RX queues and TX queues of the two VFs are both 8::
+
+    testpmd> show port info all
+    Max possible RX queues: 8
+    Max possible TX queues: 8
+
+   Start forwarding, you can see the actual queue number
+   VF0::
+
+    testpmd> start
+    RX queues=8 - RX desc=128 - RX free threshold=32
+    TX queues=8 - TX desc=512 - TX free threshold=32
+
+   VF1::
+
+    testpmd> start
+    RX queues=6 - RX desc=128 - RX free threshold=32
+    TX queues=6 - TX desc=512 - TX free threshold=32
+
+   Modify the queue number of VF1::
+
+    testpmd> stop
+    testpmd> port stop all
+    testpmd> port config all rxq 8
+    testpmd> port config all txq 7
+    testpmd> port start all
+
+   Start forwarding, you can see the VF1 actual queue number is 8 and 7::
+
+    testpmd> start
+    RX queues=8 - RX desc=128 - RX free threshold=32
+    TX queues=7 - TX desc=512 - TX free threshold=32
+
+5. Send 256 packets to VF0 and VF1, make sure packets can be distributed
+   to all the queues.
+
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [dts] [PATCH V1 5/5] test_plans: add test plan for runtime vf queue number( DPDK PF + DPDK VF)
  2019-01-29 17:06 [dts] [PATCH V1 0/5] rework test plan for runtime vf queue number Lijuan Tu
                   ` (3 preceding siblings ...)
  2019-01-29 17:06 ` [dts] [PATCH V1 4/5] test_plans: add supplementary runtime vf queue number test plan Lijuan Tu
@ 2019-01-29 17:06 ` Lijuan Tu
  4 siblings, 0 replies; 6+ messages in thread
From: Lijuan Tu @ 2019-01-29 17:06 UTC (permalink / raw)
  To: dts, yuan.peng, zhirun.yan; +Cc: Lijuan Tu

this test plan covers general cases in test scenario of DPDK PF + DPDK VF

Signed-off-by: Lijuan Tu <lijuan.tu@intel.com>
---
 .../runtime_vf_queue_number_kernel_test_plan.rst   | 232 +++++++++++++++++++++
 1 file changed, 232 insertions(+)
 create mode 100644 test_plans/runtime_vf_queue_number_kernel_test_plan.rst

diff --git a/test_plans/runtime_vf_queue_number_kernel_test_plan.rst b/test_plans/runtime_vf_queue_number_kernel_test_plan.rst
new file mode 100644
index 0000000..61f4e06
--- /dev/null
+++ b/test_plans/runtime_vf_queue_number_kernel_test_plan.rst
@@ -0,0 +1,232 @@
+.. Copyright (c) <2015-2017>, Intel Corporation
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+
+   - Neither the name of Intel Corporation nor the names of its
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+   OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+==============================================
+VF Request Queue Number From Kernel At Runtime
+==============================================
+
+Both kernel driver, I40E and DPDK PMD driver, igb_uio/vfio-pci support
+VF request queue number at runtime, that means the users could configure
+the VF queue number at runtime.
+
+This feature support 2 scenarios:
+
+#. DPDK VF + DPDK PF: see runtime_vf_queue_number_test_plan.rst
+#. DPDK VF + Kernel PF: see runtime_vf_queue_number_kernel_test_plan.rst(current file)
+
+Prerequisites
+=============
+
+1. Hardware:
+
+- Forville(X710/XL710/XXV710)
+
+2. Software:
+
+- DPDK: http://dpdk.org/git/dpdk (version: 19.02+)
+- Scapy: http://www.secdev.org/projects/scapy/
+
+3. Scenario:
+
+- Kernel PF + DPDK VF
+
+4. test topology:
+
+.. figure:: image/2vf1pf.png
+
+Set up scenario
+===============
+
+Assume create 2 vf from 1 pf.
+
+1. Make sure PF is binded to kernel driver, i40e::
+
+     usertools/dpdk-devbind.py --s
+     0000:87:00.0 'Ethernet Controller X710 for 10GbE SFP+' if=ens259f0 drv=i40e unused=
+
+2. Create 2 VF from PF::
+
+     echo 2 > /sys/bus/pci/devices/0000\:87\:00.0/sriov_numvfs
+
+     usertools/dpdk-devbind.py --s
+     0000:87:00.0 'Ethernet Controller X710 for 10GbE SFP+' if=ens259f0 drv=i40e unused=
+     0000:87:02.0 'XL710/X710 Virtual Function' unused=
+     0000:87:02.1 'XL710/X710 Virtual Function' unused=
+
+3. Detach VF from the host, bind them to DPDK drvier, here take vfio-pci for example::
+
+     modprobe vfio
+     modprobe vfio-pci
+
+Note: there are 2 ways to bind devices to vfio-pci:
+
+- Leverage usertools in dpdk package::
+
+     usertools/dpdk-devbind.py --bind=vfio-pci 0000:18:02.0
+     usertools/dpdk-devbind.py --bind=vfio-pci 0000:18:02.1
+
+- Leverage Linux command::
+
+     using `lspci -nn|grep -i ethernet` got VF device id, for example "8086 154c",
+
+     echo "8086 154c" > /sys/bus/pci/drivers/vfio-pci/new_id
+     echo 0000:18:02.0 > /sys/bus/pci/devices/0000:18:02.0/driver/unbind
+     echo 0000:18:02.0 > /sys/bus/pci/drivers/vfio-pci/bind
+
+     echo "8086 154c" > /sys/bus/pci/drivers/vfio-pci/new_id
+     echo 0000:18:02.1 > /sys/bus/pci/devices/0000:18:02.1/driver/unbind
+     echo 0000:18:02.1 > /sys/bus/pci/drivers/vfio-pci/bind
+
+4. Passthrough VFs 18:02.0 to vm0 and start vm0::
+
+     /usr/bin/qemu-system-x86_64  -name vm0 -enable-kvm \
+     -cpu host -smp 4 -m 2048 -drive file=/home/image/sriov-1.img -vnc :1 \
+     -device vfio-pci,host=0000:18:02.0,id=pt_0 \
+     -device vfio-pci,host=0000:18:02.1,id=pt_0 \
+
+Now the scenario has been set up, you will have 2 vfs passthoughed to VM.
+
+
+5. Login vm0 and them bind VF devices to igb_uio driver::
+
+    ./usertools/dpdk-devbind.py --bind=igb_uio 00:04.0
+    ./usertools/dpdk-devbind.py --bind=igb_uio 00:05.0
+
+Test Case 1: set valid VF queue number in testpmd command-line options
+======================================================================
+
+1. Start VF testpmd with "--rxq=[rxq] --txq=[txq]", and random valid values from 1 to 16, take 3 for example::
+
+     ./testpmd -c 0xf0 -n 4 -w 00:04.0 --file-prefix=test2 \
+     --socket-mem 1024,1024 -- -i --rxq=3 --txq=3
+
+2. Configure vf forwarding prerequisits and start forwarding::
+
+     testpmd> set promisc all off
+     testpmd> set fwd mac
+
+3. Start forwarding, and verfiy the queue number informantion. Both the RX queue number and the TX queue number must be same as your configuration. Here is 3::
+
+     testpmd> start
+
+     port 0: RX queue number: 3 Tx queue number: 3
+
+4. Send packets to VF from tester, and make sure they match the default RSS rules, IPV4_UNKNOW, and will be distributed to all the queues that you configured, Here is 3::
+
+     pkt1 = Ether(dst="$vf_mac", src="$tester_mac")/IP(src="10.0.0.1",dst="192.168.0.1")/("X"*48)
+     pkt2 = Ether(dst="$vf_mac", src="$tester_mac")/IP(src="10.0.0.1",dst="192.168.0.2")/("X"*48)
+     pkt3 = Ether(dst="$vf_mac", src="$tester_mac")/IP(src="10.0.0.1",dst="192.168.0.3")/("X"*48)
+
+5. Stop forwarding, and check the queues statistics, every RX/TX queue must has 1 packet go through, and total 3 packets in uni-direction as well as 6 packets in bi-direction::
+
+    testpmd> stop
+
+      ------- Forward Stats for RX Port= 0/Queue= 0 -> TX Port= 0/Queue= 0 -------
+      RX-packets: 1       TX-packets: 1       TX-dropped: 0
+      ------- Forward Stats for RX Port= 0/Queue= 1 -> TX Port= 0/Queue= 1 -------
+      RX-packets: 1              TX-packets: 1             TX-dropped: 0
+      ------- Forward Stats for RX Port= 0/Queue= 2 -> TX Port= 0/Queue= 2 -------
+      RX-packets: 1              TX-packets: 1             TX-dropped: 0
+      ---------------------- Forward statistics for port 0  ----------------------
+      RX-packets: 3      RX-dropped: 0     RX-total: 3
+      TX-packets: 3       TX-dropped: 0             TX-total: 3
+      ----------------------------------------------------------------------------
+
+6. Repeat step 2 to 6 with the mininum queue number, 1, and the maximum queue number, 16. 
+
+Test case 2: set invalid VF queue number in testpmd command-line options
+========================================================================
+
+1. Start VF testpmd with "--rxq=0 --txq=0" ::
+
+     ./testpmd -c 0xf0 -n 4 -w 00:04.0 --file-prefix=test2 \
+     --socket-mem 1024,1024 -- -i --rxq=0 --txq=0
+
+   Verify testpmd exited with error as below::
+
+    Either rx or tx queues should be non-zero
+
+2. Start VF testpmd with "--rxq=17 --txq=17" ::
+
+    ./testpmd -c 0xf0 -n 4 -w 00:04.0 --file-prefix=test2 \
+    --socket-mem 1024,1024 -- -i --rxq=17 --txq=17
+
+   Verify testpmd exited with error as below::
+
+    txq 17 invalid - must be >= 0 && <= 16
+
+Test case 3: set valid VF queue number with testpmd function command
+====================================================================
+
+1. Start VF testpmd without setting "rxq" and "txq"::
+
+    ./testpmd -c 0xf0 -n 4 -w 00:04.0 --socket-mem 1024,1024 -- -i
+
+2. Configure vf forwarding prerequisits and start forwarding::
+
+    testpmd> set promisc all off
+    testpmd> set fwd mac
+
+3. Set rx queue number and tx queue number with random value range from 1 to 16 with testpmd function command, take 3 for example::
+
+    testpmd> port stop all
+    testpmd> port config all rxq 3
+    testpmd> port config all txq 3
+    testpmd> port start all
+
+4. Repeat step 4-7 of test case 1.
+
+Test case 4: set invalid VF queue number with testpmd function command
+======================================================================
+
+1. Start VF testpmd without setting "rxq" and "txq"::
+
+     ./testpmd -c 0xf0 -n 4 -w 00:04.0 --socket-mem 1024,1024 -- -i
+
+2. Set rx queue number and tx queue number with 0 ::
+
+     testpmd> port stop all
+     testpmd> port config all rxq 0
+     testpmd> port config all txq 0
+     testpmd> port start all
+
+3. Set rx queue number and tx queue number with 17 ::
+
+     testpmd> port stop all
+     testpmd> port config all rxq 17
+     testpmd> port config all txq 17
+     testpmd> port start all
+
+   Verify error information::
+
+     Fail: input rxq (17) can't be greater than max_rx_queues (16) of port 0
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-01-29  8:43 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-29 17:06 [dts] [PATCH V1 0/5] rework test plan for runtime vf queue number Lijuan Tu
2019-01-29 17:06 ` [dts] [PATCH V1 1/5] test_plans: remove test plan for runtime " Lijuan Tu
2019-01-29 17:06 ` [dts] [PATCH V1 2/5] test_plans: add a picture to clarify test topology Lijuan Tu
2019-01-29 17:06 ` [dts] [PATCH V1 3/5] test_plans: add the main test plan for runtime vf queue number Lijuan Tu
2019-01-29 17:06 ` [dts] [PATCH V1 4/5] test_plans: add supplementary runtime vf queue number test plan Lijuan Tu
2019-01-29 17:06 ` [dts] [PATCH V1 5/5] test_plans: add test plan for runtime vf queue number( DPDK PF + DPDK VF) Lijuan Tu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).