From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 393B6941E for ; Wed, 6 Jan 2016 02:53:24 +0100 (CET) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga101.fm.intel.com with ESMTP; 05 Jan 2016 17:53:23 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,527,1444719600"; d="scan'208";a="24273147" Received: from stv-crb-56.sh.intel.com (HELO [10.239.128.116]) ([10.239.128.116]) by fmsmga004.fm.intel.com with ESMTP; 05 Jan 2016 17:53:22 -0800 Message-ID: <568C7312.8000105@intel.com> Date: Wed, 06 Jan 2016 09:51:14 +0800 From: "Liu, Yong" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Yulong Pei , dts@dpdk.org References: <1451361809-1494-1-git-send-email-yulong.pei@intel.com> In-Reply-To: <1451361809-1494-1-git-send-email-yulong.pei@intel.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [dts] [PATCH] add vf reset test case X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Jan 2016 01:53:25 -0000 Hi Yulong, Could you add some basic information in commit log, that will help us to known what's in the patch. And for email subject, better follow our format " module name : what happened". On 12/29/2015 12:03 PM, Yulong Pei wrote: > Signed-off-by: Yulong Pei > --- > conf/vf_packet_rxtx.cfg | 19 ++++ > test_plans/vf_packet_rxtx_test_plan.rst | 72 ++++++++++++++ > tests/TestSuite_vf_packet_rxtx.py | 160 +++++++++++++++++++++++++++++++- > 3 files changed, 248 insertions(+), 3 deletions(-) > > diff --git a/conf/vf_packet_rxtx.cfg b/conf/vf_packet_rxtx.cfg > index 986d289..20db90c 100644 > --- a/conf/vf_packet_rxtx.cfg > +++ b/conf/vf_packet_rxtx.cfg > @@ -103,3 +103,22 @@ vnc = > displayNum=1; > daemon = > enable=yes; > + > +[vm1] > +cpu = > + model=host,number=4,cpupin=9 10 11 12; > +disk = > + file=/home/image/sriov-fc20-2.img; > +login = > + user=root,password=tester; > +net = > + type=nic,opt_vlan=1; > + type=user,opt_vlan=1; > +monitor = > + port=; > +qga = > + enable=yes; > +vnc = > + displayNum=2; > +daemon = > + enable=yes; > diff --git a/test_plans/vf_packet_rxtx_test_plan.rst b/test_plans/vf_packet_rxtx_test_plan.rst > index f9ea736..6a70e20 100644 > --- a/test_plans/vf_packet_rxtx_test_plan.rst > +++ b/test_plans/vf_packet_rxtx_test_plan.rst > @@ -98,3 +98,75 @@ testpmd> start > > 6. get mac address of one VF and use it as dest mac, using scapy to send 2000 random packets from tester, > verify the packets can be received by one VF and can be forward to another VF correctly. > + > +Test Case 2: VF reset test > +============================================== > + > +1. got the pci device id of DUT, for example, > + > +./dpdk_nic_bind.py --st > + > +0000:81:00.0 'Ethernet Controller X710 for 10GbE SFP+' if=ens259f0 drv=i40e unused= > +0000:81:00.1 'Ethernet Controller X710 for 10GbE SFP+' if=ens259f1 drv=i40e unused= > + > +2. create 3 VFs from 1 PF, > + > +echo 3 > /sys/bus/pci/devices/0000\:81\:00.0/sriov_numvfs > +./dpdk_nic_bind.py --st > + > +0000:81:00.0 'Ethernet Controller X710 for 10GbE SFP+' if=ens259f0 drv=i40e unused=igb_uio > +0000:81:00.1 'Ethernet Controller X710 for 10GbE SFP+' if=ens259f1 drv=i40e unused=igb_uio > +0000:81:02.0 'XL710/X710 Virtual Function' unused= > +0000:81:02.1 'XL710/X710 Virtual Function' unused= > +0000:81:02.2 'XL710/X710 Virtual Function' unused= > + > +3. detach VFs from the host, bind them to pci-stub driver, > + > +virsh nodedev-detach pci_0000_81_02_0; > +virsh nodedev-detach pci_0000_81_02_1; > +virsh nodedev-detach pci_0000_81_02_2; > + > +./dpdk_nic_bind.py --st > + > +0000:81:02.0 'XL710/X710 Virtual Function' if= drv=pci-stub unused=igb_uio > +0000:81:02.1 'XL710/X710 Virtual Function' if= drv=pci-stub unused=igb_uio > +0000:81:02.2 'XL710/X710 Virtual Function' if= drv=pci-stub unused=igb_uio > + > +4. passthrough VFs 81:02.0 & 81:02.1 to vm0, passthrough VF 81:02.2 to vm1, start vm0 & vm1 > + > +/usr/bin/qemu-system-x86_64 -name vm0 -enable-kvm \ > +-cpu host -smp 4 -m 2048 -drive file=/home/image/sriov-fc20-1.img -vnc :1 \ > +-device pci-assign,host=81:02.0,id=pt_0 \ > +-device pci-assign,host=81:02.1,id=pt_1 > + > +/usr/bin/qemu-system-x86_64 -name vm1 -enable-kvm \ > +-cpu host -smp 4 -m 2048 -drive file=/home/image/sriov-fc20-1.img -vnc :1 \ > +-device pci-assign,host=81:02.2,id=pt_0 \ > + > +5. login vm0, got VFs pci device id in vm0, assume they are 00:06.0 & 00:07.0, bind them to igb_uio driver, > +and then start testpmd, set it in mac forward mode, > + > +./tools/dpdk_nic_bind.py --bind=igb_uio 00:06.0 00:07.0 > +./x86_64-native-linuxapp-gcc/app/testpmd -c 0x0f -n 4 -w 00:06.0 -w 00:07.0 -- -i --portmask=0x3 --txqflags=0 > + > +testpmd> set fwd mac > +testpmd> start > + > +on tester, use scapy, sending packets to vf0 in vm0 in infinite loop. > + > +6. login vm1, got VF pci device id in vm1, assume it is 00:06.0, bind them to igb_uio driver, start testpmd, > + > +./tools/dpdk_nic_bind.py --bind=igb_uio 00:06.0 > +./x86_64-native-linuxapp-gcc/app/testpmd -c 0x0f -n 4 -w 00:06.0 -- -i --portmask=0x1 --txqflags=0 > + > +in testpmd, run vf port stop/start 1000 times to trigger vf reset 1000 times, > + > +testpmd> port stop all > +testpmd> port start all > + > +7. on tester, kill scapy to stop sending packets to vf0 in vm0, then check the following stats of > +vf0 and vf1 in vm0 to make sure it is correct, > + > +vf0_stats, RX-packets != 0, RX-errors == 0 > +vf1_stats, TX-packets != 0, TX-errors == 0 > +vf0-RX-packets == vf1-TX-packets > diff --git a/tests/TestSuite_vf_packet_rxtx.py b/tests/TestSuite_vf_packet_rxtx.py > index 19bc331..9c150b2 100644 > --- a/tests/TestSuite_vf_packet_rxtx.py > +++ b/tests/TestSuite_vf_packet_rxtx.py > @@ -18,10 +18,12 @@ class TestVfPacketRxtx(TestCase): > self.dut_ports = self.dut.get_ports(self.nic) > self.verify(len(self.dut_ports) > 1, "Insufficient ports") > self.vm0 = None > + self.vm1 = None > > def set_up(self): > > self.setup_2pf_2vf_1vm_env_flag = 0 > + self.setup_3vf_2vm_env_flag = 0 > > def setup_2pf_2vf_1vm_env(self, driver='default'): > > @@ -98,16 +100,14 @@ class TestVfPacketRxtx(TestCase): > > self.setup_2pf_2vf_1vm_env_flag = 0 > > -######1. test case for kernel pf and dpdk vf 2pf_2vf_1vm scenario > +######1. test case for kernel pf and dpdk vf 2pf_2vf_1vm scenario packet rx tx. > > def test_kernel_2pf_2vf_1vm(self): > > self.setup_2pf_2vf_1vm_env(driver='') > > self.vm0_dut_ports = self.vm_dut_0.get_ports('any') > - > port_id_0 = 0 > - > self.vm0_testpmd = PmdOutput(self.vm_dut_0) > self.vm0_testpmd.start_testpmd(VM_CORES_MASK) > self.vm0_testpmd.execute_cmd('show port info all') > @@ -130,16 +130,170 @@ class TestVfPacketRxtx(TestCase): > result = self.tester.check_random_pkts(tgen_ports, allow_miss=False, params=pkt_param) > self.verify(result != False, "VF0 failed to forward packets to VF1") > > + def setup_3vf_2vm_env(self, driver='default'): > + > + self.used_dut_port = self.dut_ports[0] > + self.dut.generate_sriov_vfs_by_port(self.used_dut_port, 3, driver=driver) > + self.sriov_vfs_port = self.dut.ports_info[self.used_dut_port]['vfs_port'] > + > + try: > + > + for port in self.sriov_vfs_port: > + print port.pci > + port.bind_driver('pci-stub') > + > + time.sleep(1) > + vf0_prop = {'opt_host': self.sriov_vfs_port[0].pci} > + vf1_prop = {'opt_host': self.sriov_vfs_port[1].pci} > + vf2_prop = {'opt_host': self.sriov_vfs_port[2].pci} > + > + for port_id in self.dut_ports: > + if port_id == self.used_dut_port: > + continue > + port = self.dut.ports_info[port_id]['port'] > + port.bind_driver() > + > + if driver == 'igb_uio': > + self.host_testpmd = PmdOutput(self.dut) > + eal_param = '-b %(vf0)s -b %(vf1)s -b %(vf2)s' % {'vf0': self.sriov_vfs_port[0].pci, > + 'vf1': self.sriov_vfs_port[1].pci, > + 'vf2': self.sriov_vfs_port[2].pci} > + self.host_testpmd.start_testpmd("1S/2C/2T", eal_param=eal_param) > + > + # set up VM0 ENV > + self.vm0 = QEMUKvm(self.dut, 'vm0', 'vf_packet_rxtx') > + self.vm0.set_vm_device(driver='pci-assign', **vf0_prop) > + self.vm0.set_vm_device(driver='pci-assign', **vf1_prop) > + self.vm_dut_0 = self.vm0.start() > + if self.vm_dut_0 is None: > + raise Exception("Set up VM0 ENV failed!") > + # set up VM1 ENV > + self.vm1 = QEMUKvm(self.dut, 'vm1', 'vf_packet_rxtx') > + self.vm1.set_vm_device(driver='pci-assign', **vf2_prop) > + self.vm_dut_1 = self.vm1.start() > + if self.vm_dut_1 is None: > + raise Exception("Set up VM1 ENV failed!") > + > + self.setup_3vf_2vm_env_flag = 1 > + except Exception as e: > + self.destroy_3vf_2vm_env() > + raise Exception(e) > + > + def destroy_3vf_2vm_env(self): > + if getattr(self, 'vm0', None): > + self.vm0_testpmd.execute_cmd('stop') > + self.vm0_testpmd.execute_cmd('quit', '# ') > + self.vm0_testpmd = None > + self.vm0_dut_ports = None > + self.vm_dut_0 = None > + self.vm0.stop() > + self.vm0 = None > + > + if getattr(self, 'vm1', None): > + self.vm1_testpmd.execute_cmd('stop') > + self.vm1_testpmd.execute_cmd('quit', '# ') > + self.vm1_testpmd = None > + self.vm1_dut_ports = None > + self.vm_dut_1 = None > + self.vm1.stop() > + self.vm1 = None > + > + if getattr(self, 'host_testpmd', None): > + self.host_testpmd.execute_cmd('quit', '# ') > + self.host_testpmd = None > + > + if getattr(self, 'used_dut_port', None): > + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port) > + port = self.dut.ports_info[self.used_dut_port]['port'] > + port.bind_driver() > + self.used_dut_port = None > + > + for port_id in self.dut_ports: > + port = self.dut.ports_info[port_id]['port'] > + port.bind_driver() > + > + self.setup_3vf_2vm_env_flag = 0 > + > + def test_vf_reset(self): > + > + self.setup_3vf_2vm_env(driver='') > + > + self.vm0_dut_ports = self.vm_dut_0.get_ports('any') > + self.vm1_dut_ports = self.vm_dut_1.get_ports('any') > + > + port_id_0 = 0 > + port_id_1 = 1 > + > + self.vm0_testpmd = PmdOutput(self.vm_dut_0) > + self.vm0_testpmd.start_testpmd(VM_CORES_MASK) > + self.vm0_testpmd.execute_cmd('show port info all') > + pmd0_vf0_mac = self.vm0_testpmd.get_port_mac(port_id_0) > + self.vm0_testpmd.execute_cmd('set fwd mac') > + self.vm0_testpmd.execute_cmd('start') > + > + time.sleep(2) > + > + self.vm1_testpmd = PmdOutput(self.vm_dut_1) > + self.vm1_testpmd.start_testpmd(VM_CORES_MASK) > + self.vm1_testpmd.execute_cmd('show port info all') > + > + tx_port = self.tester.get_local_port(self.dut_ports[0]) > + rx_port = tx_port > + > + dst_mac = pmd0_vf0_mac > + src_mac = self.tester.get_mac(tx_port) > + > + itf = self.tester.get_interface(tx_port) > + > + self.tester.send_expect("echo '#!/usr/bin/python' > send_pkt_loop.py", "# ") > + self.tester.send_expect("echo 'from scapy.all import *' >> send_pkt_loop.py", "# ") > + cmd = 'sendp([Ether(dst="%s", src="%s")/IP(len=46)], iface="%s", loop=1)' % (dst_mac, src_mac, itf) > + self.tester.send_expect("echo '%s' >> send_pkt_loop.py" % cmd, "# ") > + self.tester.send_expect("chmod +x send_pkt_loop.py", "# ") > + self.tester.send_expect("cat send_pkt_loop.py", "# ") > + self.tester.send_expect("./send_pkt_loop.py &", "# ") > + Could we use subprocess to do those task? It will helpful for multiple instance running in the same time. > + #vf port stop/start can trigger reset action > + for num in range(10): > + self.vm1_testpmd.execute_cmd('port stop all') > + time.sleep(0.1) > + self.vm1_testpmd.execute_cmd('port start all') > + time.sleep(0.1) > + > + self.tester.send_expect("killall send_pkt_loop.py", "# ") > + > + pmd0_vf0_stats = self.vm0_testpmd.get_pmd_stats(port_id_0) > + pmd0_vf1_stats = self.vm0_testpmd.get_pmd_stats(port_id_1) > + > + vf0_rx_cnt = pmd0_vf0_stats['RX-packets'] > + self.verify(vf0_rx_cnt != 0, "no packet was received by vm0_VF0") > + > + vf0_rx_err = pmd0_vf0_stats['RX-errors'] > + self.verify(vf0_rx_err == 0, "vm0_VF0 rx-errors") > + > + vf1_tx_cnt = pmd0_vf1_stats['TX-packets'] > + self.verify(vf1_tx_cnt != 0, "no packet was transmitted by vm0_VF1") > + > + vf1_tx_err = pmd0_vf1_stats['TX-errors'] > + self.verify(vf1_tx_err == 0, "vm0_VF0 tx-errors") > + > + self.verify(vf0_rx_cnt == vf1_tx_cnt, "vm0_VF0 failed to forward packets to vm0_VF1 when reset vm1_VF0 frequently") > + > def tear_down(self): > > if self.setup_2pf_2vf_1vm_env_flag == 1: > self.destroy_2pf_2vf_1vm_env() > + if self.setup_3vf_2vm_env_flag == 1: > + self.destroy_3vf_2vm_env() > > def tear_down_all(self): > > if getattr(self, 'vm0', None): > self.vm0.stop() > > + if getattr(self, 'vm1', None): > + self.vm1.stop() > + > for port_id in self.dut_ports: > self.dut.destroy_sriov_vfs_by_port(port_id) >