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 ECD65A0096 for ; Wed, 8 May 2019 09:51:18 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E093D37AF; Wed, 8 May 2019 09:51:18 +0200 (CEST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id 306E32BD5 for ; Wed, 8 May 2019 09:51:17 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 May 2019 00:51:16 -0700 X-ExtLoop1: 1 Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga005.jf.intel.com with ESMTP; 08 May 2019 00:51:15 -0700 Received: from fmsmsx114.amr.corp.intel.com (10.18.116.8) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 8 May 2019 00:51:15 -0700 Received: from shsmsx106.ccr.corp.intel.com (10.239.4.159) by FMSMSX114.amr.corp.intel.com (10.18.116.8) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 8 May 2019 00:51:14 -0700 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.70]) by SHSMSX106.ccr.corp.intel.com ([169.254.10.213]) with mapi id 14.03.0415.000; Wed, 8 May 2019 15:51:13 +0800 From: "Li, WenjieX A" To: "Ma, LihongX" , "dts@dpdk.org" CC: "Wang, Yinan" , "Ma, LihongX" Thread-Topic: [dts] [PATCH V1] Add testsuite vhost event idx interrupt Thread-Index: AQHU/v+YZicdxDiR30OzLoJ+xX173KZg51NA Date: Wed, 8 May 2019 07:51:12 +0000 Message-ID: <8688172CD5C0B74590FAE19D9579F94B536E23D8@SHSMSX103.ccr.corp.intel.com> References: <1556566250-21226-1-git-send-email-lihongx.ma@intel.com> In-Reply-To: <1556566250-21226-1-git-send-email-lihongx.ma@intel.com> Accept-Language: zh-CN, 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 vhost event idx interrupt 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" For new script/test plan, please use "Copyright(c) 2019 Intel Corporation",= thank you! BR, Wenjie > -----Original Message----- > From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of lihong > Sent: Tuesday, April 30, 2019 3:31 AM > To: dts@dpdk.org > Cc: Wang, Yinan ; Ma, LihongX > > Subject: [dts] [PATCH V1] Add testsuite vhost event idx interrupt >=20 > Signed-off-by: lihong > --- > tests/TestSuite_vhost_event_idx_interrupt.py | 282 > +++++++++++++++++++++++++++ > 1 file changed, 282 insertions(+) > create mode 100644 tests/TestSuite_vhost_event_idx_interrupt.py >=20 > diff --git a/tests/TestSuite_vhost_event_idx_interrupt.py > b/tests/TestSuite_vhost_event_idx_interrupt.py > new file mode 100644 > index 0000000..32b5e05 > --- /dev/null > +++ b/tests/TestSuite_vhost_event_idx_interrupt.py > @@ -0,0 +1,282 @@ > +# BSD LICENSE > +# > +# Copyright(c) 2010-2019 Intel Corporation. All rights reserved. > +# 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. > + > +""" > +DPDK Test suite. > +Vhost event idx interrupt need test with l3fwd-power sample """ > + > +import utils > +import time > +from virt_common import VM > +from test_case import TestCase > + > + > +class TestVhostEventIdxInterrupt(TestCase): > + > + def set_up_all(self): > + """ > + Run at the start of each test suite. > + > + """ > + self.vm_num =3D 1 > + self.queues =3D 1 > + self.cores_num =3D len([n for n in self.dut.cores if int(n['sock= et']) =3D=3D 0]) > + self.prepare_l3fwd_power() > + > + def set_up(self): > + """ > + Run before each test case. > + """ > + # Clean the execution ENV > + self.verify_info =3D [] > + self.dut.send_expect("killall -s INT l3fwd-power", "#") > + self.dut.send_expect("killall -s INT qemu-system-x86_64", "#") > + self.dut.send_expect("rm -rf ./vhost-net*", "#") > + self.vhost =3D self.dut.new_session(suite=3D"vhost-l3fwd") > + self.vm_dut =3D [] > + self.vm =3D [] > + > + def get_core_mask(self): > + self.core_config =3D "1S/%dC/1T" % (self.vm_num*self.queues) > + self.verify(self.cores_num >=3D self.queues*self.vm_num, > + "There has not enought cores to test this case %s" % > + self.running_case) > + self.core_list_l3fwd =3D self.dut.get_core_list(self.core_config= ) > + self.core_mask_l3fwd =3D utils.create_mask(self.core_list_l3fwd) > + > + def prepare_l3fwd_power(self): > + self.dut.send_expect("cp ./examples/l3fwd-power/main.c .", "#") > + self.dut.send_expect( > + "sed -i '/DEV_RX_OFFLOAD_CHECKSUM/d' ./examples/l3fwd- > power/main.c", "#", 10) > + out =3D self.dut.send_expect("make -C examples/l3fwd-power", "#"= ) > + self.verify("Error" not in out, "compilation l3fwd-power > + error") > + > + def lanuch_l3fwd_power(self): > + """ > + launch l3fwd-power with a virtual vhost device > + """ > + res =3D True > + self.logger.info("Launch l3fwd_sample sample:") > + config_info =3D "" > + core_index =3D 0 > + # config the interrupt cores info > + for port in range(self.vm_num): > + for queue in range(self.queues): > + if config_info !=3D "": > + config_info +=3D ',' > + config_info +=3D '(%d,%d,%s)' % (port, queue, > self.core_list_l3fwd[core_index]) > + info =3D {'core': self.core_list_l3fwd[core_index], 'por= t': port, 'queue': > queue} > + self.verify_info.append(info) > + core_index =3D core_index + 1 > + # config the vdev info, if have 2 vms, it shoule have 2 vdev inf= o > + vdev_info =3D "" > + for i in range(self.vm_num): > + vdev_info +=3D "--vdev > + 'net_vhost%d,iface=3Dvhost-net%d,queues=3D%d,client=3D1' " % (i, i, > + self.queues) > + > + port_info =3D "0x1" if self.vm_num =3D=3D 1 else "0x3" > + > + command_client =3D "./examples/l3fwd-power/build/app/l3fwd-power= " + \ > + "-c %s -n %d --socket-mem 1024,1024 --legacy-me= m --no-pci " + > \ > + "--log-level=3D9 %s -- -p %s --parse-ptype 1 --= config '%s' " > + command_line_client =3D command_client % ( > + self.core_mask_l3fwd, self.dut.get_memory_channe= ls(), > + vdev_info, port_info, config_info) > + self.vhost.send_expect(command_line_client, "POWER", 40) > + time.sleep(10) > + out =3D self.vhost.get_session_before() > + if ("Error" in out and "Error opening" not in out): > + self.logger.error("Launch l3fwd-power sample error") > + res =3D False > + else: > + self.logger.info("Launch l3fwd-power sample finished") > + self.verify(res is True, "Lanuch l3fwd failed") > + > + def relanuch_l3fwd_power(self): > + """ > + relauch l3fwd-power sample for port up > + """ > + self.dut.send_expect("killall -s INT l3fwd-power", "#") > + self.lanuch_l3fwd_power() > + > + def set_vm_cpu_number(self, vm_config): > + # config the vcpu numbers when queue number greater than 1 > + if self.queues =3D=3D 1: > + return > + params_number =3D len(vm_config.params) > + for i in range(params_number): > + if vm_config.params[i].keys()[0] =3D=3D 'cpu': > + vm_config.params[i]['cpu'][0]['number'] =3D self.queues > + > + def start_vms(self, vm_num=3D1): > + """ > + start qemus > + """ > + for i in range(vm_num): > + vm_info =3D VM(self.dut, 'vm%d' % i, 'vhost_sample') > + vm_info.load_config() > + vm_params =3D {} > + vm_params['driver'] =3D 'vhost-user' > + vm_params['opt_path'] =3D './vhost-net%d' % i > + vm_params['opt_mac'] =3D "00:11:22:33:44:5%d" % i > + vm_params['opt_server'] =3D 'server' > + if self.queues > 1: > + vm_params['opt_queue'] =3D self.queues > + opt_args =3D "csum=3Don,mq=3Don,vectors=3D%d" % (2*self.= queues + 2) > + else: > + opt_args =3D "csum=3Don" > + vm_params['opt_settings'] =3D opt_args > + vm_info.set_vm_device(**vm_params) > + self.set_vm_cpu_number(vm_info) > + vm_dut =3D None > + try: > + vm_dut =3D vm_info.start(load_config=3DFalse) > + if vm_dut is None: > + raise Exception("Set up VM ENV failed") > + except Exception as e: > + self.logger.error("ERROR: Failure for %s" % str(e)) > + vm_dut.restore_interfaces() > + self.vm_dut.append(vm_dut) > + self.vm.append(vm_info) > + > + def config_virito_net_in_vm(self): > + """ > + set vitio-net with 2 quques enable > + """ > + for i in range(len(self.vm_dut)): > + vm_intf =3D self.vm_dut[i].ports_info[0]['intf'] > + self.vm_dut[i].send_expect("ethtool -L %s combined %d" % > + (vm_intf, self.queues), "#", 20) > + > + def check_vhost_core_status(self, vm_index, status): > + """ > + check the cpu status > + """ > + out =3D self.vhost.get_session_before() > + for i in range(self.queues): > + # because of the verify_info include all config(vm0 and vm1) > + # so current index shoule vm_index + queue_index > + verify_index =3D i + vm_index > + if status =3D=3D "waked up": > + info =3D "lcore %s is waked up from rx interrupt on port= %d queue %d" > + info =3D info % (self.verify_info[verify_index]["core"], > self.verify_info[verify_index]['port'], > + self.verify_info[verify_index]['queue']) > + elif status =3D=3D "sleeps": > + info =3D "lcore %s sleeps until interrupt triggers" % > self.verify_info[verify_index]["core"] > + self.logger.info(info) > + self.verify(info in out, "The CPU status not right for %s" > + % info) > + > + def send_and_verify(self): > + """ > + start to send packets and check the cpu status > + stop and restart to send packets and check the cpu status > + """ > + ping_ip =3D 3 > + for vm_index in range(self.vm_num): > + session_info =3D [] > + vm_intf =3D self.vm_dut[vm_index].ports_info[0]['intf'] > + self.vm_dut[vm_index].send_expect("ifconfig %s 1.1.1.%d" % (= vm_intf, > ping_ip), "#") > + ping_ip =3D ping_ip + 1 > + self.vm_dut[vm_index].send_expect("ifconfig %s up" % vm_intf= , "#") > + for queue in range(self.queues): > + session =3D self.vm_dut[vm_index].new_session(suite=3D"p= ing_info_%d" % > queue) > + session.send_expect("taskset -c %d ping 1.1.1.%d" % > + (queue, ping_ip), "PING", 30) > + session_info.append(session) > + ping_ip =3D ping_ip + 1 > + time.sleep(3) > + self.check_vhost_core_status(vm_index=3Dvm_index, status=3D"= waked up") > + # close all sessions of ping in vm > + for sess_index in range(len(session_info)): > + session_info[sess_index].send_expect("^c", "#") > + > + self.vm_dut[vm_index].close_session(session_info[sess_index]) > + > + def stop_all_apps(self): > + """ > + close all vms > + """ > + for i in range(len(self.vm)): > + self.vm[i].stop() > + self.vhost.send_expect("^c", "#", 10) > + > + def test_vhost_idx_interrupt(self): > + """ > + wake up vhost-user core with l3fwd-power sample > + """ > + self.vm_num =3D 1 > + self.queues =3D 1 > + self.get_core_mask() > + self.lanuch_l3fwd_power() > + self.start_vms(vm_num=3Dself.vm_num) > + self.relanuch_l3fwd_power() > + self.send_and_verify() > + self.stop_all_apps() > + > + def test_vhost_idx_interrupt_with_multi_queue(self): > + """ > + wake up vhost-user core with l3fwd-power sample when multi queue= s are > enabled > + """ > + self.vm_num =3D 1 > + self.queues =3D 16 > + self.get_core_mask() > + self.lanuch_l3fwd_power() > + self.start_vms(vm_num=3Dself.vm_num) > + self.relanuch_l3fwd_power() > + self.config_virito_net_in_vm() > + self.send_and_verify() > + self.stop_all_apps() > + > + def test_vhost_idx_interrupt_with_multi_vms(self): > + """ > + wake up vhost-user cores with l3fwd-power sample and multi VMs > + """ > + self.vm_num =3D 2 > + self.queues =3D 1 > + self.get_core_mask() > + self.lanuch_l3fwd_power() > + self.start_vms(vm_num=3Dself.vm_num) > + self.relanuch_l3fwd_power() > + self.send_and_verify() > + self.stop_all_apps() > + > + def tear_down(self): > + """ > + Run after each test case. > + """ > + self.dut.close_session(self.vhost) > + self.dut.send_expect("killall -s INT l3fwd-power", "#") > + self.dut.send_expect("killall -s INT qemu-system-x86_64", "#") > + > + def tear_down_all(self): > + """ > + Run after each test suite. > + """ > + self.dut.send_expect("mv ./main.c ./examples/l3fwd-power/", "#") > + self.dut.build_dpdk_apps('examples/l3fwd-power') > -- > 2.7.4