From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id 7F0CCA05D3 for ; Fri, 29 Mar 2019 09:09:05 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 75C072C28; Fri, 29 Mar 2019 09:09:05 +0100 (CET) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id ADBD62BD3 for ; Fri, 29 Mar 2019 09:09:03 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Mar 2019 01:09:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,283,1549958400"; d="scan'208";a="126887001" Received: from fmsmsx104.amr.corp.intel.com ([10.18.124.202]) by orsmga007.jf.intel.com with ESMTP; 29 Mar 2019 01:09:02 -0700 Received: from fmsmsx155.amr.corp.intel.com (10.18.116.71) by fmsmsx104.amr.corp.intel.com (10.18.124.202) with Microsoft SMTP Server (TLS) id 14.3.408.0; Fri, 29 Mar 2019 01:09:02 -0700 Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by FMSMSX155.amr.corp.intel.com (10.18.116.71) with Microsoft SMTP Server (TLS) id 14.3.408.0; Fri, 29 Mar 2019 01:09:01 -0700 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.158]) by SHSMSX152.ccr.corp.intel.com ([169.254.6.80]) with mapi id 14.03.0415.000; Fri, 29 Mar 2019 16:08:59 +0800 From: "Wu, ChangqingX" To: "Xiao, QimaiX" , "dts@dpdk.org" CC: "Xiao, QimaiX" Thread-Topic: [dts] [PATCH V1] add TestSuite_runtime_vf_queue_number_kernel to dts Thread-Index: AQHU5fkah24IjwtZu0i378YcHinCmKYiQV0w Date: Fri, 29 Mar 2019 08:08:59 +0000 Message-ID: <7F81DD3887C58F49A6B2EFEC3C28E22E0B6BBAB8@SHSMSX101.ccr.corp.intel.com> References: <1553841317-92269-1-git-send-email-qimaix.xiao@intel.com> In-Reply-To: <1553841317-92269-1-git-send-email-qimaix.xiao@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dts] [PATCH V1] add TestSuite_runtime_vf_queue_number_kernel to dts 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: , Errors-To: dts-bounces@dpdk.org Sender: "dts" Tested-by: Wu, ChangqingX -----Original Message----- From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of xiao,qimai Sent: Friday, March 29, 2019 2:35 PM To: dts@dpdk.org Cc: Xiao, QimaiX Subject: [dts] [PATCH V1] add TestSuite_runtime_vf_queue_number_kernel to d= ts add TestSuite_runtime_vf_queue_number_kernel to dts Signed-off-by: xiao,qimai --- ...estSuite_runtime_vf_queue_number_kernel.py | 321 ++++++++++++++++++ 1 file changed, 321 insertions(+) create mode 100644 tests/TestSuite_runtime_vf_queue_number_kernel.py diff --git a/tests/TestSuite_runtime_vf_queue_number_kernel.py b/tests/Test= Suite_runtime_vf_queue_number_kernel.py new file mode 100644 index 0000000..12e5959 --- /dev/null +++ b/tests/TestSuite_runtime_vf_queue_number_kernel.py @@ -0,0 +1,321 @@ +# BSD LICENSE +# +# Copyright(c) 2010-2014 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without #=20 +modification, are permitted provided that the following conditions #=20 +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 #=20 +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT #=20 +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR #=20 +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT #=20 +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, #=20 +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT #=20 +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, #=20 +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY #=20 +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT #=20 +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE #=20 +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +""" +DPDK Test suite. +runtime_vf_queue_number_kernel test script. +""" + +import random +import re +import string +import time + +import utils +from crb import Crb +from net_device import NetDevice +from pmd_output import PmdOutput +from settings import HEADER_SIZE +from test_case import TestCase +from utils import RED, GREEN +from virt_common import VM + +VM_CORES_MASK =3D 'all' + + +class TestRuntimeVfQueueNumberKernel(TestCase): + supported_vf_driver =3D ['pci-stub', 'vfio-pci'] + + def set_up_all(self): + self.verify(self.nic in ["fortville_eagle", "fortville_spirit", "f= ortville_25g"], + "Only supported by Fortville") + self.dut_ports =3D self.dut.get_ports(self.nic) + self.verify(len(self.dut_ports) > 1, "Insufficient ports") + self.vm0 =3D None + + # set vf assign method and vf driver + self.vf_driver =3D self.get_suite_cfg()['vf_driver'] + if self.vf_driver is None: + self.vf_driver =3D 'pci-stub' + self.verify(self.vf_driver in self.supported_vf_driver, "Unspporte= d vf driver") + if self.vf_driver =3D=3D 'pci-stub': + self.vf_assign_method =3D 'pci-assign' + else: + self.vf_assign_method =3D 'vfio-pci' + self.dut.send_expect('modprobe vfio-pci', '#') + + self.setup_2pf_2vf_1vm_env_flag =3D 0 + self.setup_2pf_2vf_1vm_env(driver=3D'') + self.vm0_dut_ports =3D self.vm_dut_0.get_ports('any') + self.portMask =3D utils.create_mask([self.vm0_dut_ports[0]]) + self.vm_dut_0.vm_pci0 =3D self.vm_dut_0.ports_info[0]['pci'] + + def set_up(self): + pass + + def setup_2pf_2vf_1vm_env(self, driver=3D'default'): + + self.used_dut_port_0 =3D self.dut_ports[0] + self.dut.generate_sriov_vfs_by_port(self.used_dut_port_0, 1, drive= r=3Ddriver) + self.sriov_vfs_port_0 =3D self.dut.ports_info[self.used_dut_port_0= ]['vfs_port'] + self.used_dut_port_1 =3D self.dut_ports[1] + self.dut.generate_sriov_vfs_by_port(self.used_dut_port_1, 1, drive= r=3Ddriver) + self.sriov_vfs_port_1 =3D=20 + self.dut.ports_info[self.used_dut_port_1]['vfs_port'] + + try: + + for port in self.sriov_vfs_port_0: + port.bind_driver(self.vf_driver) + + for port in self.sriov_vfs_port_1: + port.bind_driver(self.vf_driver) + + time.sleep(1) + vf0_prop =3D {'opt_host': self.sriov_vfs_port_0[0].pci} + vf1_prop =3D {'opt_host': self.sriov_vfs_port_1[0].pci} + + if driver =3D=3D 'igb_uio': + # start testpmd without the two VFs on the host + self.host_testpmd =3D PmdOutput(self.dut) + eal_param =3D '-b %(vf0)s -b %(vf1)s' % {'vf0': self.sriov= _vfs_port_0[0].pci, + 'vf1': self.sriov_v= fs_port_1[0].pci} + self.host_testpmd.start_testpmd("1S/2C/2T",=20 + eal_param=3Deal_param) + + # set up VM0 ENV + self.vm0 =3D VM(self.dut, 'vm0', 'runtime_vf_queue_number_kern= el') + self.vm0.set_vm_device(driver=3Dself.vf_assign_method, **vf0_p= rop) + self.vm0.set_vm_device(driver=3Dself.vf_assign_method, **vf1_p= rop) + self.vm_dut_0 =3D self.vm0.start() + if self.vm_dut_0 is None: + raise Exception("Set up VM0 ENV failed!") + + self.setup_2pf_2vf_1vm_env_flag =3D 1 + except Exception as e: + self.destroy_2pf_2vf_1vm_env() + raise Exception(e) + + def destroy_2pf_2vf_1vm_env(self): + if getattr(self, 'vm0', None): + # destroy testpmd in vm0 + self.vm0_testpmd =3D None + self.vm0_dut_ports =3D None + # destroy vm0 + self.vm0.stop() + self.dut.virt_exit() + self.vm0 =3D None + + if getattr(self, 'host_testpmd', None): + self.host_testpmd.execute_cmd('quit', '# ') + self.host_testpmd =3D None + + if getattr(self, 'used_dut_port_0', None) !=3D None: + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port_0) + port =3D self.dut.ports_info[self.used_dut_port_0]['port'] + port.bind_driver() + self.used_dut_port_0 =3D None + + if getattr(self, 'used_dut_port_1', None) !=3D None: + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port_1) + port =3D self.dut.ports_info[self.used_dut_port_1]['port'] + port.bind_driver() + self.used_dut_port_1 =3D None + + for port_id in self.dut_ports: + port =3D self.dut.ports_info[port_id]['port'] + port.bind_driver() + + self.setup_2pf_2vf_1vm_env_flag =3D 0 + + def send_packet2different_queue(self, dts, src, iface, count): + self.tester.scapy_foreground() + for i in range(count): + pkt =3D 'sendp([Ether(dst=3D"%s", src=3D"%s")/IP(src=3D"10.0.0= .1",dst=3D"192.168.13.%d")/("test"*10)],iface=3D"%s")' % ( + dts, src, (i % 254) + 1, iface) + self.tester.scapy_append(pkt) + self.tester.scapy_execute() + + def test_set_valid_vf_queue_num(self): + """ + set valid VF queue number in testpmd command-line options + """ + random_queue =3D random.randint(2, 15) + queue_nums =3D [1, random_queue, 16] + for i in queue_nums: + self.vm0_testpmd =3D PmdOutput(self.vm_dut_0) + eal_param =3D '-w %(vf0)s' % {'vf0': self.vm_dut_0.vm_pci0} + tx_port =3D self.tester.get_local_port(self.dut_ports[0]) + tester_mac =3D self.tester.get_mac(tx_port) + iface =3D self.tester.get_interface(tx_port) + count =3D i * 20 + times =3D 3 + while times > 0: + out =3D self.vm0_testpmd.start_testpmd("all", "--rss-ip --= txq=3D%s --rxq=3D%s" % (i, i), eal_param=3Deal_param) + print(out) + if 'Failed' in out or 'failed' in out: + self.vm0_testpmd.execute_cmd("port stop all") + time.sleep(5) + self.vm0_testpmd.execute_cmd('quit', '# ') + times -=3D 1 + time.sleep(3) + else: + times =3D 0 + self.vm0_testpmd.execute_cmd('set verbose 1') + self.vm0_testpmd.execute_cmd('set promisc all off') + time.sleep(1) + self.vm0_testpmd.execute_cmd('set fwd mac') + self.vm0_testpmd.execute_cmd("clear port stats all") + out =3D self.vm0_testpmd.execute_cmd('start') + vf0_mac =3D self.vm0_testpmd.get_port_mac(0) + self.verify("port 0: RX queue number: %s Tx queue number: %s" = % (i, i) in out, "queue number maybe error") + self.send_packet2different_queue(vf0_mac, tester_mac, iface, c= ount) + out =3D self.vm0_testpmd.get_output() + out2 =3D self.vm0_testpmd.execute_cmd('stop') + print(out2) + misc =3D out.count("dst=3DFF:FF:FF:FF:FF:FF") + print("get %d misc packages " % misc) + if i =3D=3D 1: + self.verify('port 0/queue 0: received 1 packets' in out, "= queue %s can not receive pkt" % (i - 1)) + else: + for j in range(i): + j =3D ' ' + str(j) if j < 10 else str(j) + self.verify('Queue=3D%s' % j in out2, "queue %s can no= t receive pkt" % j) + self.verify('RX-total: %d' % (count + misc) in out2 and 'TX-to= tal: %d' % (count + misc) in out2, + "rx or tx incorrect number pkts") + self.vm0_testpmd.execute_cmd("clear port stats all") + self.vm0_testpmd.execute_cmd("port stop all") + time.sleep(5) + self.vm0_testpmd.execute_cmd('quit', '# ') + time.sleep(3) + self.vm0_testpmd.quit() + + def test_set_invalid_vf_queue_num_command_line(self): + invalid_queue_num =3D [0, 17] + for i in invalid_queue_num: + self.vm0_testpmd =3D PmdOutput(self.vm_dut_0) + self.vm_dut_0.session_secondary =3D self.vm_dut_0.new_session(= ) + out =3D self.vm_dut_0.session_secondary.send_expect( + './x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 1 -w %= s -- -i --txq=3D%s --rxq=3D%s' % ( + self.vm_dut_0.vm_pci0, i, i), '# ', 40) + if i =3D=3D 0: + self.verify('Either rx or tx queues should be non-zero' in= out, "queue number can't be zero") + else: + self.verify('txq 17 invalid - must be >=3D 0 && <=3D 16' i= n=20 + out, "queue number is too big") + + def test_set_valid_vf_queue_num_with_function(self): + random_queue =3D random.randint(2, 15) + queue_nums =3D [1, random_queue, 16] + self.vm0_testpmd =3D PmdOutput(self.vm_dut_0) + eal_param =3D '-w %(vf0)s' % {'vf0': self.vm_dut_0.vm_pci0} + tx_port =3D self.tester.get_local_port(self.dut_ports[0]) + tester_mac =3D self.tester.get_mac(tx_port) + iface =3D self.tester.get_interface(tx_port) + for i in queue_nums: + times =3D 3 + count =3D i * 20 + while times > 0: + self.vm0_testpmd =3D PmdOutput(self.vm_dut_0) + out =3D self.vm0_testpmd.start_testpmd("all", eal_param=3D= eal_param) + print(out) + self.vm0_testpmd.execute_cmd("port stop all") + self.vm0_testpmd.execute_cmd('set fwd mac') + self.vm0_testpmd.execute_cmd("set verbose 1") + self.vm0_testpmd.execute_cmd('set promisc all off') + time.sleep(1) + self.vm0_testpmd.execute_cmd("port config all rxq %s" % i) + self.vm0_testpmd.execute_cmd("port config all txq %s" % i) + out =3D self.vm0_testpmd.execute_cmd("port start all") + print(out) + if 'Failed' in out or 'fail to' in out: + self.vm0_testpmd.execute_cmd("port stop all") + time.sleep(5) + self.vm0_testpmd.execute_cmd('quit', '# ') + times -=3D 1 + time.sleep(3) + self.vm0_testpmd.quit() + else: + times =3D 0 + self.vm0_testpmd.execute_cmd("clear port stats all") + out =3D self.vm0_testpmd.execute_cmd("start") + print(out) + vf0_mac =3D self.vm0_testpmd.get_port_mac(0) + self.verify("port 0: RX queue number: %s Tx queue number: %s" = % (i, i) in out, + "queue number %s maybe error" % i) + self.send_packet2different_queue(vf0_mac, tester_mac, iface, c= ount) + out =3D self.vm0_testpmd.get_output() + out2 =3D self.vm0_testpmd.execute_cmd('stop') + print(out2) + misc =3D out.count("dst=3DFF:FF:FF:FF:FF:FF") + print("get %d misc packages " % misc) + if i =3D=3D 1: + self.verify('port 0/queue 0: received 1 packets' in out, "= queue %s can not receive pkt" % i) + else: + for j in range(i): + j =3D ' ' + str(j) if j < 10 else str(j) + self.verify('Queue=3D%s' % j in out2, "queue %s can no= t receive pkt" % j) + self.verify('RX-total: %d' % (count + misc) in out2 and 'TX-to= tal: %d' % (count + misc) in out2, + "rx or tx incorrect number pkts: %d" % (count + m= isc)) + self.vm0_testpmd.execute_cmd("clear port stats all") + self.vm0_testpmd.execute_cmd("port stop all") + time.sleep(5) + self.vm0_testpmd.execute_cmd('quit', '# ') + time.sleep(3) + self.vm0_testpmd.quit() + + def test_set_invalid_vf_queue_num_with_testpmd_command(self): + invalid_queue_num =3D [0, 17] + self.vm0_testpmd =3D PmdOutput(self.vm_dut_0) + eal_param =3D '-w %(vf0)s' % {'vf0': self.vm_dut_0.vm_pci0} + self.vm0_testpmd.start_testpmd("all", eal_param=3Deal_param) + self.vm0_testpmd.execute_cmd('set promisc all off') + self.vm0_testpmd.execute_cmd('set fwd mac') + self.vm0_testpmd.execute_cmd("port stop all") + for i in invalid_queue_num: + if i =3D=3D 0: + self.vm0_testpmd.execute_cmd("port config all rxq %s" % i) + out =3D self.vm0_testpmd.execute_cmd("port config all txq = %s" % i) + self.verify('Either rx or tx queues should be non zero' in= out, "queue number can't be zero") + else: + out =3D self.vm0_testpmd.execute_cmd("port config all rxq = %s" % i) + self.verify("input rxq (17) can't be greater than max_rx_q= ueues (16) of port 0" in out, + "queue number is too big") + self.vm0_testpmd.execute_cmd("clear port stats all") + time.sleep(1) + self.vm0_testpmd.execute_cmd('quit', '# ') + + def tear_down(self): + self.vm0_testpmd.execute_cmd('quit', '# ') + pass + + def tear_down_all(self): + print + "tear_down_all" + if self.setup_2pf_2vf_1vm_env_flag =3D=3D 1: + self.destroy_2pf_2vf_1vm_env() -- 2.17.2