* [dts] [DTS][PATCH 1/4] virt: dpdk vhost plus virtio iperf config @ 2015-12-23 10:04 Jingguo Fu 2015-12-23 10:04 ` [dts] [DTS][PATCH 2/4] virt: add copy file from virt guest Jingguo Fu ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Jingguo Fu @ 2015-12-23 10:04 UTC (permalink / raw) To: dts; +Cc: Jingguo Fu Signed-off-by: Jingguo Fu <jingguox.fu@intel.com> --- conf/virtio_iperf.cfg | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 conf/virtio_iperf.cfg diff --git a/conf/virtio_iperf.cfg b/conf/virtio_iperf.cfg new file mode 100644 index 0000000..e005185 --- /dev/null +++ b/conf/virtio_iperf.cfg @@ -0,0 +1,32 @@ +# vm configuration for vhost sample case +[vm0] +cpu = + model=host,number=2,cpupin=14 15; +mem = + size=2048,hugepage=yes; +disk = + file=/home/img/vm0.img; +login = + user=root,password=tester; +vnc = + displayNum=4; +daemon = + enable=yes; +qemu = + path=/usr/local/qemu-2.4.0/x86_64-softmmu/qemu-system-x86_64; +# +[vm1] +cpu = + model=host,number=2,cpupin=16 17; +mem = + size=2048,hugepage=yes; +disk = + file=/home/img/vm1.img; +login = + user=root,password=tester; +vnc = + displayNum=5; +daemon = + enable=yes; +qemu = + path=/usr/local/qemu-2.4.0/x86_64-softmmu/qemu-system-x86_64; -- 2.1.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [dts] [DTS][PATCH 2/4] virt: add copy file from virt guest 2015-12-23 10:04 [dts] [DTS][PATCH 1/4] virt: dpdk vhost plus virtio iperf config Jingguo Fu @ 2015-12-23 10:04 ` Jingguo Fu 2015-12-23 10:04 ` [dts] [DTS][PATCH 3/4] virt: qemu kvm init for two vms scenario Jingguo Fu 2015-12-23 10:04 ` [dts] [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases Jingguo Fu 2 siblings, 0 replies; 7+ messages in thread From: Jingguo Fu @ 2015-12-23 10:04 UTC (permalink / raw) To: dts; +Cc: Jingguo Fu Signed-off-by: Jingguo Fu <jingguox.fu@intel.com> --- framework/ssh_pexpect.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/ssh_pexpect.py b/framework/ssh_pexpect.py index 046692f..96c4409 100644 --- a/framework/ssh_pexpect.py +++ b/framework/ssh_pexpect.py @@ -141,6 +141,9 @@ class SSHPexpect(object): Copies a file from a remote place into local. """ command = 'scp {0}@{1}:{2} {3}'.format(self.username, self.host, src, dst) + if ':' in self.host: + command = 'scp -P {0} -o NoHostAuthenticationForLocalhost=yes {1}@{2}:{3} {4}'.format( + str(self.port), self.username, self.ip, src, dst) if password == '': self._spawn_scp(command, self.password) else: -- 2.1.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [dts] [DTS][PATCH 3/4] virt: qemu kvm init for two vms scenario 2015-12-23 10:04 [dts] [DTS][PATCH 1/4] virt: dpdk vhost plus virtio iperf config Jingguo Fu 2015-12-23 10:04 ` [dts] [DTS][PATCH 2/4] virt: add copy file from virt guest Jingguo Fu @ 2015-12-23 10:04 ` Jingguo Fu 2015-12-23 10:04 ` [dts] [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases Jingguo Fu 2 siblings, 0 replies; 7+ messages in thread From: Jingguo Fu @ 2015-12-23 10:04 UTC (permalink / raw) To: dts; +Cc: Jingguo Fu Signed-off-by: Jingguo Fu <jingguox.fu@intel.com> --- framework/qemu_kvm.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/framework/qemu_kvm.py b/framework/qemu_kvm.py index fd4be20..70730e2 100644 --- a/framework/qemu_kvm.py +++ b/framework/qemu_kvm.py @@ -602,8 +602,7 @@ class QEMUKvm(VirtBase): """ separator = ',' # chardev parameter - if 'opt_path' in options.keys() and \ - options['opt_path']: + if 'opt_path' in options.keys() and options['opt_path']: dev_boot_line = '-chardev socket' char_id = 'char%d' % self.char_idx dev_boot_line += separator + 'id=%s' % char_id + separator + 'path=%s' % options['opt_path'] @@ -629,9 +628,12 @@ class QEMUKvm(VirtBase): """ separator = ',' dev_boot_line = '-netdev tap' - cuse_id = 'vhost%d' % self.cuse_id + if 'opt_tap' in options.keys(): + cuse_id = options['opt_tap'] + else: + cuse_id = 'vhost%d' % self.cuse_id + self.cuse_id += 1 dev_boot_line += separator + 'id=%s' % cuse_id + separator + 'ifname=tap_%s' % cuse_id + separator + "vhost=on" + separator + "script=no" - self.cuse_id += 1 self.__add_boot_line(dev_boot_line) # device parameter opts = {'opt_netdev': '%s' % cuse_id, -- 2.1.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [dts] [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases 2015-12-23 10:04 [dts] [DTS][PATCH 1/4] virt: dpdk vhost plus virtio iperf config Jingguo Fu 2015-12-23 10:04 ` [dts] [DTS][PATCH 2/4] virt: add copy file from virt guest Jingguo Fu 2015-12-23 10:04 ` [dts] [DTS][PATCH 3/4] virt: qemu kvm init for two vms scenario Jingguo Fu @ 2015-12-23 10:04 ` Jingguo Fu 2016-01-07 2:59 ` Xu, Qian Q 2 siblings, 1 reply; 7+ messages in thread From: Jingguo Fu @ 2015-12-23 10:04 UTC (permalink / raw) To: dts; +Cc: Jingguo Fu Signed-off-by: Jingguo Fu <jingguox.fu@intel.com> --- tests/TestSuite_virtio_iperf.py | 300 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 tests/TestSuite_virtio_iperf.py diff --git a/tests/TestSuite_virtio_iperf.py b/tests/TestSuite_virtio_iperf.py new file mode 100644 index 0000000..2b7991a --- /dev/null +++ b/tests/TestSuite_virtio_iperf.py @@ -0,0 +1,300 @@ +# 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 +# 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 +Test DPDK vhost + virtio scenarios +""" +import re +import dts +import time + +from test_case import TestCase +from qemu_kvm import QEMUKvm + +class TestVirtioIperf(TestCase): + def set_up_all(self): + self.vhost_legacy_virtio_cmdline="csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off" + self.vhost_cuse_virtio_cmdline="csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off" + self.vhost_user_virtio_cmdline="" + self.virtio_mac = ["52:54:00:00:00:01", "52:54:00:00:00:02"] + self.virtio_ip = ["1.1.1.2", "1.1.1.3"] + self.vm = [] + self.vm_dut = [] + + self.dut_ports = self.dut.get_ports(self.nic) + self.verify(len(self.dut_ports) >= 1, 'Insufficient ports for test') + + self.phy_function = self.dut_ports[0] + netdev = self.dut.ports_info[self.phy_function]['port'] + self.socket = netdev.get_nic_socket() + self.cores = self.dut.get_core_list("1S/3C/1T", socket=self.socket) + self.coremask = dts.create_mask(self.cores) + + def set_up(self): + pass + + def dut_execut_cmd(self, cmdline, ex='#', timout=30): + return self.dut.send_expect(cmdline, ex, timout) + + def build_vhost_lib(self, vhost='user'): + self.dut_execut_cmd('git clean -x -d -f') + self.dut_execut_cmd('git checkout *') + if vhost == 'cuse': + self.dut_execut_cmd( + "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE" + + "_VHOST_USER=n/' ./config/common_linuxapp") + else: + self.dut_execut_cmd( + "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE" + + "_VHOST_USER=y/' ./config/common_linuxapp") + self.dut.build_install_dpdk(self.target) + self.dut_execut_cmd("cd ./lib/librte_vhost") + out = self.dut_execut_cmd("make") + self.verify('Error' not in out, 'bulid err: build lib vhost failed') + self.dut_execut_cmd("cd ./eventfd_link") + out = self.dut_execut_cmd("make") + self.verify('Error' not in out, 'bulid err: build eventfd_link failed') + self.dut_execut_cmd("cd ~/dpdk") + + def build_vhost_app(self): + self.dut_execut_cmd( + "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/' " + + "./examples/vhost/main.c") + out = self.dut_execut_cmd("make -C ./examples/vhost") + self.verify("Error" not in out, "compilation error") + self.verify("No such file" not in out, "Not found file error") + + def launch_vhost_switch(self, coremask, channel, jumbo, scenario): + self.vhost_switch = "./examples/vhost/build/vhost-switch" + self.vhost_switch_cmd = self.vhost_switch + \ + " -c %s -n %d --socket-mem 2048,2048 -- -p 0x1" + \ + " --mergeable %d --zero-copy 0 --vm2vm %d > ./vhost.out &" + self.dut_execut_cmd(self.vhost_switch_cmd % (coremask, channel, jumbo, scenario)) + time.sleep(20) + self.dut.session.copy_file_from('/root/dpdk/vhost.out') + time.sleep(5) + fp = open('./vhost.out') + fmsg = fp.read() + fp.close() + if 'Error' or 'error' in fmsg: + print 'launch vhost sample failed' + return False + else: + return True + + def iperf_result_verify(self, vm_client): + ''' + vm_client.session.copy_file_from("/root/dpdk/iperf_client.log") + self.tester.send_expect('scp -P') + ''' + vm_client.session.copy_file_from("/root/dpdk/iperf_client.log") + fp = open("./iperf_client.log") + fmsg = fp.read() + iperfdata = re.compile('[\d+]*.[\d+] [M|G]bits/sec').findall(fmsg) + dts.results_table_add_header(['Data', 'Unit']) + for data in iperfdata: + dts.results_table_add_row([data.split()[0], data.split()[1]]) + dts.results_table_print() + import os + os.popen("rm -rf ./iperf_client.log") + + def test_perf_vhost_legacy_virtio_iperf(self): + pass + + def test_perf_vhost_cuse_virtio_iperf(self): + """ + vhost cuse as back end, legacy virtio dirver as front end + """ + self.build_vhost_lib(vhost='cuse') + self.build_vhost_app() + self.dut_execut_cmd('rm -rf /dev/vhost-net') + self.dut_execut_cmd('rmmod igb_uio -f') + self.dut_execut_cmd('rmmod eventfd_link') + self.dut_execut_cmd('modprobe uio') + self.dut_execut_cmd('modprobe fuse') + self.dut_execut_cmd('modprobe cuse') + self.dut_execut_cmd('insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko') + self.dut_execut_cmd('insmod ./lib/librte_vhost/eventfd_link/eventfd_link.ko') + self.dut.bind_interfaces_linux(dts.drivername) + self.launch_vhost_switch(self.coremask, 4, 0, 1) + + self.vm1 = QEMUKvm(self.dut, 'vm0', 'virtio_iperf') + vm1_params = {} + vm1_params['driver'] = 'vhost-cuse' + vm1_params['opt_tap'] = 'vhost0' + vm1_params['opt_mac'] = self.virtio_mac[0] + vm1_params['opt_settings'] = self.vhost_cuse_virtio_cmdline + self.vm1.set_vm_device(**vm1_params) + try: + self.vm1_dut = self.vm1.start(auto_portmap=False) + time.sleep(10) + if self.vm1_dut is None: + raise Exception('VM1 start failed') + except Exception as e0: + print dts.RED('VM1 already exist, powerdown it first') + self.vm1_dut.restore_interfaces() + + self.vm2 = QEMUKvm(self.dut, 'vm1', 'virtio_iperf') + vm2_params = {} + vm2_params['driver'] = 'vhost-cuse' + vm2_params['opt_tap'] = 'vhost1' + vm2_params['opt_mac'] = self.virtio_mac[1] + vm2_params['opt_settings'] = self.vhost_cuse_virtio_cmdline + self.vm2.set_vm_device(**vm2_params) + try: + self.vm2_dut = self.vm2.start(auto_portmap=False) + time.sleep(10) + if self.vm2_dut is None: + raise Exception('VM2 start failed') + except Exception as e1: + print dts.RED('VM2 already exist, powerdown it first') + self.vm2_dut.restore_interfaces() + + #self.start_iperf_server() + vm1_vport = self.vm1_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm1_vport + intfs = re.compile('eth\d').findall(vm1_vport) + for intf in intfs: + outmac = self.vm1_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[0] in outmac: + self.vm1_intf = intf + self.vm1_dut.send_expect('ifconfig %s %s' % (self.vm1_intf, self.virtio_ip[0]), '#', 10) + self.vm1_dut.send_expect('ifconfig %s up' % self.vm1_intf, '#', 10) + self.vm1_dut.send_expect('arp -s %s %s' % (self.virtio_ip[1], self.virtio_mac[1]), '#', 10) + self.vm1_dut.send_expect('iperf -s -p 12345 -i 1 -M > iperf_server.log &', '', 10) + + #self.start_iperf_client() + vm2_vport = self.vm2_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm2_vport + intfs = re.compile('eth\d').findall(vm2_vport) + for intf in intfs: + outmac = self.vm2_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[1] in outmac: + self.vm2_intf = intf + self.vm2_dut.send_expect('ifconfig %s %s' % (self.vm2_intf, self.virtio_ip[1]), '#', 10) + self.vm2_dut.send_expect('ifconfig %s up' % self.vm2_intf, '#', 10) + self.vm2_dut.send_expect('arp -s %s %s' % (self.virtio_ip[0], self.virtio_mac[0]), '#', 10) + self.vm2_dut.send_expect('iperf -c %s -p 12345 -i 1 -t 20 > iperf_client.log &' % self.virtio_ip[0], '', 10) + time.sleep(30) + self.vm1_dut.send_expect("killall -s INT iperf", '', 10) + self.iperf_result_verify(self.vm2_dut) + + def test_perf_vhost_user_virtio_iperf(self): + """ + vhost user as back end, legacy virtio dirver as front end + """ + self.build_vhost_lib(vhost='user') + self.build_vhost_app() + #self.dut_execut_cmd('rm -rf /dev/vhost-net') + self.dut_execut_cmd('rmmod igb_uio -f') + self.dut_execut_cmd('rmmod eventfd_link') + self.dut_execut_cmd('modprobe uio') + #self.dut_execut_cmd('modprobe fuse') + #self.dut_execut_cmd('modprobe cuse') + self.dut_execut_cmd('insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko') + self.dut_execut_cmd('insmod ./lib/librte_vhost/eventfd_link/eventfd_link.ko') + self.dut.bind_interfaces_linux(dts.drivername) + self.launch_vhost_switch(self.coremask, 4, 0, 1) + + self.vm1 = QEMUKvm(self.dut, 'vm0', 'virtio_iperf') + vm1_params = {} + vm1_params['driver'] = 'vhost-user' + vm1_params['opt_path'] = './vhost-net' + vm1_params['opt_mac'] = self.virtio_mac[0] + self.vm1.set_vm_device(**vm1_params) + try: + self.vm1_dut = self.vm1.start(auto_portmap=False) + if self.vm1_dut is None: + raise Exception('VM1 start failed') + except Exception as e0: + print dts.RED('VM1 already exist, powerdown it first') + self.vm1_dut.restore_interfaces() + + self.vm2 = QEMUKvm(self.dut, 'vm1', 'virtio_iperf') + vm2_params = {} + vm2_params['driver'] = 'vhost-user' + vm2_params['opt_path'] = './vhost-net' + vm2_params['opt_mac'] = self.virtio_mac[1] + self.vm2.set_vm_device(**vm2_params) + try: + self.vm2_dut = self.vm2.start(auto_portmap=False) + if self.vm2_dut is None: + raise Exception('VM2 start failed') + except Exception as e1: + print dts.RED('VM2 already exist, powerdown it first') + + self.vm2_dut.restore_interfaces() + + #self.start_iperf_server() + vm1_vport = self.vm1_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm1_vport + intfs = re.compile('eth\d').findall(vm1_vport) + for intf in intfs: + outmac = self.vm1_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[0] in outmac: + self.vm1_intf = intf + self.vm1_dut.send_expect('ifconfig %s %s' % (self.vm1_intf, self.virtio_ip[0]), '#', 10) + self.vm1_dut.send_expect('ifconfig %s up' % self.vm1_intf, '#', 10) + self.vm1_dut.send_expect('arp -s %s %s' % (self.virtio_ip[1], self.virtio_mac[1]), '#', 10) + self.vm1_dut.send_expect('iperf -s -p 12345 -i 1 -M > iperf_server.log &', '', 10) + + #self.start_iperf_client() + vm2_vport = self.vm2_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm2_vport + intfs = re.compile('eth\d').findall(vm2_vport) + for intf in intfs: + outmac = self.vm2_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[1] in outmac: + self.vm2_intf = intf + self.vm2_dut.send_expect('ifconfig %s %s' % (self.vm2_intf, self.virtio_ip[1]), '#', 10) + self.vm2_dut.send_expect('ifconfig %s up' % self.vm2_intf, '#', 10) + self.vm2_dut.send_expect('arp -s %s %s' % (self.virtio_ip[0], self.virtio_mac[0]), '#', 10) + self.vm2_dut.send_expect('iperf -c %s -p 12345 -i 1 -t 20 > iperf_client.log &' % self.virtio_ip[0], '', 10) + time.sleep(30) + + self.vm1_dut.session.send_expect('killall -s INT iperf', '#', 10) + self.iperf_result_verify(self.vm2_dut) + + def tear_down(self): + if self.vm2: + self.vm2.stop() + self.vm2 = None + if self.vm1: + self.vm1.stop() + self.vm1 = None + self.dut.send_expect("killall -s INT vhost-switch", "#") + + def tear_down_all(self): + pass -- 2.1.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dts] [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases 2015-12-23 10:04 ` [dts] [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases Jingguo Fu @ 2016-01-07 2:59 ` Xu, Qian Q 2016-01-14 2:45 ` Fu, JingguoX 0 siblings, 1 reply; 7+ messages in thread From: Xu, Qian Q @ 2016-01-07 2:59 UTC (permalink / raw) To: Fu, JingguoX, dts See my comments below, thx. Thanks Qian -----Original Message----- From: Fu, JingguoX Sent: Wednesday, December 23, 2015 6:04 PM To: dts@dpdk.org Cc: Liu, Yong; Xu, Qian Q; Pei, Yulong; Fu, JingguoX Subject: [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases [QIAN] need add some description for the patch content. Signed-off-by: Jingguo Fu <jingguox.fu@intel.com> --- tests/TestSuite_virtio_iperf.py | 300 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 tests/TestSuite_virtio_iperf.py diff --git a/tests/TestSuite_virtio_iperf.py b/tests/TestSuite_virtio_iperf.py new file mode 100644 index 0000000..2b7991a --- /dev/null +++ b/tests/TestSuite_virtio_iperf.py @@ -0,0 +1,300 @@ +# 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 # +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 +Test DPDK vhost + virtio scenarios +""" +import re +import dts +import time + +from test_case import TestCase +from qemu_kvm import QEMUKvm + +class TestVirtioIperf(TestCase): + def set_up_all(self): + self.vhost_legacy_virtio_cmdline="csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off" + self.vhost_cuse_virtio_cmdline="csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off" + self.vhost_user_virtio_cmdline="" + self.virtio_mac = ["52:54:00:00:00:01", "52:54:00:00:00:02"] + self.virtio_ip = ["1.1.1.2", "1.1.1.3"] + self.vm = [] + self.vm_dut = [] + + self.dut_ports = self.dut.get_ports(self.nic) + self.verify(len(self.dut_ports) >= 1, 'Insufficient ports for + test') + + self.phy_function = self.dut_ports[0] + netdev = self.dut.ports_info[self.phy_function]['port'] + self.socket = netdev.get_nic_socket() + self.cores = self.dut.get_core_list("1S/3C/1T", socket=self.socket) + self.coremask = dts.create_mask(self.cores) + + def set_up(self): + pass + + def dut_execut_cmd(self, cmdline, ex='#', timout=30): + return self.dut.send_expect(cmdline, ex, timout) + + def build_vhost_lib(self, vhost='user'): + self.dut_execut_cmd('git clean -x -d -f') + self.dut_execut_cmd('git checkout *') + if vhost == 'cuse': + self.dut_execut_cmd( + "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE" + + "_VHOST_USER=n/' ./config/common_linuxapp") + else: + self.dut_execut_cmd( + "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE" + + "_VHOST_USER=y/' ./config/common_linuxapp") + self.dut.build_install_dpdk(self.target) + self.dut_execut_cmd("cd ./lib/librte_vhost") + out = self.dut_execut_cmd("make") + self.verify('Error' not in out, 'bulid err: build lib vhost failed') + self.dut_execut_cmd("cd ./eventfd_link") + out = self.dut_execut_cmd("make") + self.verify('Error' not in out, 'bulid err: build eventfd_link failed') + self.dut_execut_cmd("cd ~/dpdk") + + def build_vhost_app(self): + self.dut_execut_cmd( + "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/' " + + "./examples/vhost/main.c") [QIAN] if change to 128, then it works for Niantic but not FVL, so how about FVL support? + out = self.dut_execut_cmd("make -C ./examples/vhost") + self.verify("Error" not in out, "compilation error") + self.verify("No such file" not in out, "Not found file error") + + def launch_vhost_switch(self, coremask, channel, jumbo, scenario): + self.vhost_switch = "./examples/vhost/build/vhost-switch" + self.vhost_switch_cmd = self.vhost_switch + \ + " -c %s -n %d --socket-mem 2048,2048 -- -p 0x1" + \ + " --mergeable %d --zero-copy 0 --vm2vm %d > ./vhost.out &" + self.dut_execut_cmd(self.vhost_switch_cmd % (coremask, channel, jumbo, scenario)) + time.sleep(20) + self.dut.session.copy_file_from('/root/dpdk/vhost.out') + time.sleep(5) + fp = open('./vhost.out') + fmsg = fp.read() + fp.close() + if 'Error' or 'error' in fmsg: + print 'launch vhost sample failed' + return False + else: + return True + + def iperf_result_verify(self, vm_client): + ''' + vm_client.session.copy_file_from("/root/dpdk/iperf_client.log") + self.tester.send_expect('scp -P') + ''' + vm_client.session.copy_file_from("/root/dpdk/iperf_client.log") + fp = open("./iperf_client.log") + fmsg = fp.read() + iperfdata = re.compile('[\d+]*.[\d+] [M|G]bits/sec').findall(fmsg) + dts.results_table_add_header(['Data', 'Unit']) + for data in iperfdata: + dts.results_table_add_row([data.split()[0], data.split()[1]]) + dts.results_table_print() + import os + os.popen("rm -rf ./iperf_client.log") + + def test_perf_vhost_legacy_virtio_iperf(self): + pass + + def test_perf_vhost_cuse_virtio_iperf(self): + """ + vhost cuse as back end, legacy virtio dirver as front end + """ + self.build_vhost_lib(vhost='cuse') + self.build_vhost_app() + self.dut_execut_cmd('rm -rf /dev/vhost-net') + self.dut_execut_cmd('rmmod igb_uio -f') + self.dut_execut_cmd('rmmod eventfd_link') + self.dut_execut_cmd('modprobe uio') + self.dut_execut_cmd('modprobe fuse') + self.dut_execut_cmd('modprobe cuse') + self.dut_execut_cmd('insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko') + self.dut_execut_cmd('insmod ./lib/librte_vhost/eventfd_link/eventfd_link.ko') + self.dut.bind_interfaces_linux(dts.drivername) + self.launch_vhost_switch(self.coremask, 4, 0, 1) + + self.vm1 = QEMUKvm(self.dut, 'vm0', 'virtio_iperf') + vm1_params = {} + vm1_params['driver'] = 'vhost-cuse' + vm1_params['opt_tap'] = 'vhost0' + vm1_params['opt_mac'] = self.virtio_mac[0] + vm1_params['opt_settings'] = self.vhost_cuse_virtio_cmdline + self.vm1.set_vm_device(**vm1_params) + try: + self.vm1_dut = self.vm1.start(auto_portmap=False) + time.sleep(10) + if self.vm1_dut is None: + raise Exception('VM1 start failed') + except Exception as e0: + print dts.RED('VM1 already exist, powerdown it first') + self.vm1_dut.restore_interfaces() + + self.vm2 = QEMUKvm(self.dut, 'vm1', 'virtio_iperf') + vm2_params = {} + vm2_params['driver'] = 'vhost-cuse' + vm2_params['opt_tap'] = 'vhost1' + vm2_params['opt_mac'] = self.virtio_mac[1] + vm2_params['opt_settings'] = self.vhost_cuse_virtio_cmdline + self.vm2.set_vm_device(**vm2_params) + try: + self.vm2_dut = self.vm2.start(auto_portmap=False) + time.sleep(10) + if self.vm2_dut is None: + raise Exception('VM2 start failed') + except Exception as e1: + print dts.RED('VM2 already exist, powerdown it first') + self.vm2_dut.restore_interfaces() + + #self.start_iperf_server() + vm1_vport = self.vm1_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm1_vport + intfs = re.compile('eth\d').findall(vm1_vport) + for intf in intfs: + outmac = self.vm1_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[0] in outmac: + self.vm1_intf = intf + self.vm1_dut.send_expect('ifconfig %s %s' % (self.vm1_intf, self.virtio_ip[0]), '#', 10) + self.vm1_dut.send_expect('ifconfig %s up' % self.vm1_intf, '#', 10) + self.vm1_dut.send_expect('arp -s %s %s' % (self.virtio_ip[1], self.virtio_mac[1]), '#', 10) + self.vm1_dut.send_expect('iperf -s -p 12345 -i 1 -M > + iperf_server.log &', '', 10) [QIAN] the command can be changed to "iperf -s -p 12345 -I 1", remove -M + + #self.start_iperf_client() + vm2_vport = self.vm2_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm2_vport + intfs = re.compile('eth\d').findall(vm2_vport) + for intf in intfs: + outmac = self.vm2_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[1] in outmac: + self.vm2_intf = intf + self.vm2_dut.send_expect('ifconfig %s %s' % (self.vm2_intf, self.virtio_ip[1]), '#', 10) + self.vm2_dut.send_expect('ifconfig %s up' % self.vm2_intf, '#', 10) + self.vm2_dut.send_expect('arp -s %s %s' % (self.virtio_ip[0], self.virtio_mac[0]), '#', 10) + self.vm2_dut.send_expect('iperf -c %s -p 12345 -i 1 -t 20 > iperf_client.log &' % self.virtio_ip[0], '', 10) [QIAN] the time can be a little longer, such as 60s, -t 60 + time.sleep(30) + self.vm1_dut.send_expect("killall -s INT iperf", '', 10) + self.iperf_result_verify(self.vm2_dut) + + def test_perf_vhost_user_virtio_iperf(self): + """ + vhost user as back end, legacy virtio dirver as front end + """ + self.build_vhost_lib(vhost='user') + self.build_vhost_app() + #self.dut_execut_cmd('rm -rf /dev/vhost-net') + self.dut_execut_cmd('rmmod igb_uio -f') + self.dut_execut_cmd('rmmod eventfd_link') + self.dut_execut_cmd('modprobe uio') + #self.dut_execut_cmd('modprobe fuse') + #self.dut_execut_cmd('modprobe cuse') + self.dut_execut_cmd('insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko') + self.dut_execut_cmd('insmod ./lib/librte_vhost/eventfd_link/eventfd_link.ko') + self.dut.bind_interfaces_linux(dts.drivername) + self.launch_vhost_switch(self.coremask, 4, 0, 1) + + self.vm1 = QEMUKvm(self.dut, 'vm0', 'virtio_iperf') + vm1_params = {} + vm1_params['driver'] = 'vhost-user' + vm1_params['opt_path'] = './vhost-net' + vm1_params['opt_mac'] = self.virtio_mac[0] + self.vm1.set_vm_device(**vm1_params) + try: + self.vm1_dut = self.vm1.start(auto_portmap=False) + if self.vm1_dut is None: + raise Exception('VM1 start failed') + except Exception as e0: + print dts.RED('VM1 already exist, powerdown it first') + self.vm1_dut.restore_interfaces() + + self.vm2 = QEMUKvm(self.dut, 'vm1', 'virtio_iperf') + vm2_params = {} + vm2_params['driver'] = 'vhost-user' + vm2_params['opt_path'] = './vhost-net' + vm2_params['opt_mac'] = self.virtio_mac[1] + self.vm2.set_vm_device(**vm2_params) + try: + self.vm2_dut = self.vm2.start(auto_portmap=False) + if self.vm2_dut is None: + raise Exception('VM2 start failed') + except Exception as e1: + print dts.RED('VM2 already exist, powerdown it first') + + self.vm2_dut.restore_interfaces() + + #self.start_iperf_server() + vm1_vport = self.vm1_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm1_vport + intfs = re.compile('eth\d').findall(vm1_vport) + for intf in intfs: + outmac = self.vm1_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[0] in outmac: + self.vm1_intf = intf + self.vm1_dut.send_expect('ifconfig %s %s' % (self.vm1_intf, self.virtio_ip[0]), '#', 10) + self.vm1_dut.send_expect('ifconfig %s up' % self.vm1_intf, '#', 10) + self.vm1_dut.send_expect('arp -s %s %s' % (self.virtio_ip[1], self.virtio_mac[1]), '#', 10) + self.vm1_dut.send_expect('iperf -s -p 12345 -i 1 -M > + iperf_server.log &', '', 10) + [QIAN] Same as above, remove "-M" + #self.start_iperf_client() + vm2_vport = self.vm2_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm2_vport + intfs = re.compile('eth\d').findall(vm2_vport) + for intf in intfs: + outmac = self.vm2_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[1] in outmac: + self.vm2_intf = intf + self.vm2_dut.send_expect('ifconfig %s %s' % (self.vm2_intf, self.virtio_ip[1]), '#', 10) + self.vm2_dut.send_expect('ifconfig %s up' % self.vm2_intf, '#', 10) + self.vm2_dut.send_expect('arp -s %s %s' % (self.virtio_ip[0], self.virtio_mac[0]), '#', 10) + self.vm2_dut.send_expect('iperf -c %s -p 12345 -i 1 -t 20 > iperf_client.log &' % self.virtio_ip[0], '', 10) + time.sleep(30) + [QIAN] Same as above, change the time to 60s + self.vm1_dut.session.send_expect('killall -s INT iperf', '#', 10) + self.iperf_result_verify(self.vm2_dut) + + def tear_down(self): + if self.vm2: + self.vm2.stop() + self.vm2 = None + if self.vm1: + self.vm1.stop() + self.vm1 = None + self.dut.send_expect("killall -s INT vhost-switch", "#") + + def tear_down_all(self): + pass -- 2.1.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dts] [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases 2016-01-07 2:59 ` Xu, Qian Q @ 2016-01-14 2:45 ` Fu, JingguoX 2016-01-14 2:49 ` Xu, Qian Q 0 siblings, 1 reply; 7+ messages in thread From: Fu, JingguoX @ 2016-01-14 2:45 UTC (permalink / raw) To: Xu, Qian Q, dts I have update the cases and send out v2 patch, Thanks Jingguo Fu -----Original Message----- From: Xu, Qian Q Sent: Thursday, January 07, 2016 11:00 AM To: Fu, JingguoX; dts@dpdk.org Cc: Liu, Yong; Pei, Yulong Subject: RE: [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases See my comments below, thx. Thanks Qian -----Original Message----- From: Fu, JingguoX Sent: Wednesday, December 23, 2015 6:04 PM To: dts@dpdk.org Cc: Liu, Yong; Xu, Qian Q; Pei, Yulong; Fu, JingguoX Subject: [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases [QIAN] need add some description for the patch content. Signed-off-by: Jingguo Fu <jingguox.fu@intel.com> --- tests/TestSuite_virtio_iperf.py | 300 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 tests/TestSuite_virtio_iperf.py diff --git a/tests/TestSuite_virtio_iperf.py b/tests/TestSuite_virtio_iperf.py new file mode 100644 index 0000000..2b7991a --- /dev/null +++ b/tests/TestSuite_virtio_iperf.py @@ -0,0 +1,300 @@ +# 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 # +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 +Test DPDK vhost + virtio scenarios +""" +import re +import dts +import time + +from test_case import TestCase +from qemu_kvm import QEMUKvm + +class TestVirtioIperf(TestCase): + def set_up_all(self): + self.vhost_legacy_virtio_cmdline="csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off" + self.vhost_cuse_virtio_cmdline="csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off" + self.vhost_user_virtio_cmdline="" + self.virtio_mac = ["52:54:00:00:00:01", "52:54:00:00:00:02"] + self.virtio_ip = ["1.1.1.2", "1.1.1.3"] + self.vm = [] + self.vm_dut = [] + + self.dut_ports = self.dut.get_ports(self.nic) + self.verify(len(self.dut_ports) >= 1, 'Insufficient ports for + test') + + self.phy_function = self.dut_ports[0] + netdev = self.dut.ports_info[self.phy_function]['port'] + self.socket = netdev.get_nic_socket() + self.cores = self.dut.get_core_list("1S/3C/1T", socket=self.socket) + self.coremask = dts.create_mask(self.cores) + + def set_up(self): + pass + + def dut_execut_cmd(self, cmdline, ex='#', timout=30): + return self.dut.send_expect(cmdline, ex, timout) + + def build_vhost_lib(self, vhost='user'): + self.dut_execut_cmd('git clean -x -d -f') + self.dut_execut_cmd('git checkout *') + if vhost == 'cuse': + self.dut_execut_cmd( + "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE" + + "_VHOST_USER=n/' ./config/common_linuxapp") + else: + self.dut_execut_cmd( + "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE" + + "_VHOST_USER=y/' ./config/common_linuxapp") + self.dut.build_install_dpdk(self.target) + self.dut_execut_cmd("cd ./lib/librte_vhost") + out = self.dut_execut_cmd("make") + self.verify('Error' not in out, 'bulid err: build lib vhost failed') + self.dut_execut_cmd("cd ./eventfd_link") + out = self.dut_execut_cmd("make") + self.verify('Error' not in out, 'bulid err: build eventfd_link failed') + self.dut_execut_cmd("cd ~/dpdk") + + def build_vhost_app(self): + self.dut_execut_cmd( + "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/' " + + "./examples/vhost/main.c") [QIAN] if change to 128, then it works for Niantic but not FVL, so how about FVL support? + out = self.dut_execut_cmd("make -C ./examples/vhost") + self.verify("Error" not in out, "compilation error") + self.verify("No such file" not in out, "Not found file error") + + def launch_vhost_switch(self, coremask, channel, jumbo, scenario): + self.vhost_switch = "./examples/vhost/build/vhost-switch" + self.vhost_switch_cmd = self.vhost_switch + \ + " -c %s -n %d --socket-mem 2048,2048 -- -p 0x1" + \ + " --mergeable %d --zero-copy 0 --vm2vm %d > ./vhost.out &" + self.dut_execut_cmd(self.vhost_switch_cmd % (coremask, channel, jumbo, scenario)) + time.sleep(20) + self.dut.session.copy_file_from('/root/dpdk/vhost.out') + time.sleep(5) + fp = open('./vhost.out') + fmsg = fp.read() + fp.close() + if 'Error' or 'error' in fmsg: + print 'launch vhost sample failed' + return False + else: + return True + + def iperf_result_verify(self, vm_client): + ''' + vm_client.session.copy_file_from("/root/dpdk/iperf_client.log") + self.tester.send_expect('scp -P') + ''' + vm_client.session.copy_file_from("/root/dpdk/iperf_client.log") + fp = open("./iperf_client.log") + fmsg = fp.read() + iperfdata = re.compile('[\d+]*.[\d+] [M|G]bits/sec').findall(fmsg) + dts.results_table_add_header(['Data', 'Unit']) + for data in iperfdata: + dts.results_table_add_row([data.split()[0], data.split()[1]]) + dts.results_table_print() + import os + os.popen("rm -rf ./iperf_client.log") + + def test_perf_vhost_legacy_virtio_iperf(self): + pass + + def test_perf_vhost_cuse_virtio_iperf(self): + """ + vhost cuse as back end, legacy virtio dirver as front end + """ + self.build_vhost_lib(vhost='cuse') + self.build_vhost_app() + self.dut_execut_cmd('rm -rf /dev/vhost-net') + self.dut_execut_cmd('rmmod igb_uio -f') + self.dut_execut_cmd('rmmod eventfd_link') + self.dut_execut_cmd('modprobe uio') + self.dut_execut_cmd('modprobe fuse') + self.dut_execut_cmd('modprobe cuse') + self.dut_execut_cmd('insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko') + self.dut_execut_cmd('insmod ./lib/librte_vhost/eventfd_link/eventfd_link.ko') + self.dut.bind_interfaces_linux(dts.drivername) + self.launch_vhost_switch(self.coremask, 4, 0, 1) + + self.vm1 = QEMUKvm(self.dut, 'vm0', 'virtio_iperf') + vm1_params = {} + vm1_params['driver'] = 'vhost-cuse' + vm1_params['opt_tap'] = 'vhost0' + vm1_params['opt_mac'] = self.virtio_mac[0] + vm1_params['opt_settings'] = self.vhost_cuse_virtio_cmdline + self.vm1.set_vm_device(**vm1_params) + try: + self.vm1_dut = self.vm1.start(auto_portmap=False) + time.sleep(10) + if self.vm1_dut is None: + raise Exception('VM1 start failed') + except Exception as e0: + print dts.RED('VM1 already exist, powerdown it first') + self.vm1_dut.restore_interfaces() + + self.vm2 = QEMUKvm(self.dut, 'vm1', 'virtio_iperf') + vm2_params = {} + vm2_params['driver'] = 'vhost-cuse' + vm2_params['opt_tap'] = 'vhost1' + vm2_params['opt_mac'] = self.virtio_mac[1] + vm2_params['opt_settings'] = self.vhost_cuse_virtio_cmdline + self.vm2.set_vm_device(**vm2_params) + try: + self.vm2_dut = self.vm2.start(auto_portmap=False) + time.sleep(10) + if self.vm2_dut is None: + raise Exception('VM2 start failed') + except Exception as e1: + print dts.RED('VM2 already exist, powerdown it first') + self.vm2_dut.restore_interfaces() + + #self.start_iperf_server() + vm1_vport = self.vm1_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm1_vport + intfs = re.compile('eth\d').findall(vm1_vport) + for intf in intfs: + outmac = self.vm1_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[0] in outmac: + self.vm1_intf = intf + self.vm1_dut.send_expect('ifconfig %s %s' % (self.vm1_intf, self.virtio_ip[0]), '#', 10) + self.vm1_dut.send_expect('ifconfig %s up' % self.vm1_intf, '#', 10) + self.vm1_dut.send_expect('arp -s %s %s' % (self.virtio_ip[1], self.virtio_mac[1]), '#', 10) + self.vm1_dut.send_expect('iperf -s -p 12345 -i 1 -M > + iperf_server.log &', '', 10) [QIAN] the command can be changed to "iperf -s -p 12345 -I 1", remove -M + + #self.start_iperf_client() + vm2_vport = self.vm2_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm2_vport + intfs = re.compile('eth\d').findall(vm2_vport) + for intf in intfs: + outmac = self.vm2_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[1] in outmac: + self.vm2_intf = intf + self.vm2_dut.send_expect('ifconfig %s %s' % (self.vm2_intf, self.virtio_ip[1]), '#', 10) + self.vm2_dut.send_expect('ifconfig %s up' % self.vm2_intf, '#', 10) + self.vm2_dut.send_expect('arp -s %s %s' % (self.virtio_ip[0], self.virtio_mac[0]), '#', 10) + self.vm2_dut.send_expect('iperf -c %s -p 12345 -i 1 -t 20 > + iperf_client.log &' % self.virtio_ip[0], '', 10) [QIAN] the time can be a little longer, such as 60s, -t 60 + time.sleep(30) + self.vm1_dut.send_expect("killall -s INT iperf", '', 10) + self.iperf_result_verify(self.vm2_dut) + + def test_perf_vhost_user_virtio_iperf(self): + """ + vhost user as back end, legacy virtio dirver as front end + """ + self.build_vhost_lib(vhost='user') + self.build_vhost_app() + #self.dut_execut_cmd('rm -rf /dev/vhost-net') + self.dut_execut_cmd('rmmod igb_uio -f') + self.dut_execut_cmd('rmmod eventfd_link') + self.dut_execut_cmd('modprobe uio') + #self.dut_execut_cmd('modprobe fuse') + #self.dut_execut_cmd('modprobe cuse') + self.dut_execut_cmd('insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko') + self.dut_execut_cmd('insmod ./lib/librte_vhost/eventfd_link/eventfd_link.ko') + self.dut.bind_interfaces_linux(dts.drivername) + self.launch_vhost_switch(self.coremask, 4, 0, 1) + + self.vm1 = QEMUKvm(self.dut, 'vm0', 'virtio_iperf') + vm1_params = {} + vm1_params['driver'] = 'vhost-user' + vm1_params['opt_path'] = './vhost-net' + vm1_params['opt_mac'] = self.virtio_mac[0] + self.vm1.set_vm_device(**vm1_params) + try: + self.vm1_dut = self.vm1.start(auto_portmap=False) + if self.vm1_dut is None: + raise Exception('VM1 start failed') + except Exception as e0: + print dts.RED('VM1 already exist, powerdown it first') + self.vm1_dut.restore_interfaces() + + self.vm2 = QEMUKvm(self.dut, 'vm1', 'virtio_iperf') + vm2_params = {} + vm2_params['driver'] = 'vhost-user' + vm2_params['opt_path'] = './vhost-net' + vm2_params['opt_mac'] = self.virtio_mac[1] + self.vm2.set_vm_device(**vm2_params) + try: + self.vm2_dut = self.vm2.start(auto_portmap=False) + if self.vm2_dut is None: + raise Exception('VM2 start failed') + except Exception as e1: + print dts.RED('VM2 already exist, powerdown it first') + + self.vm2_dut.restore_interfaces() + + #self.start_iperf_server() + vm1_vport = self.vm1_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm1_vport + intfs = re.compile('eth\d').findall(vm1_vport) + for intf in intfs: + outmac = self.vm1_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[0] in outmac: + self.vm1_intf = intf + self.vm1_dut.send_expect('ifconfig %s %s' % (self.vm1_intf, self.virtio_ip[0]), '#', 10) + self.vm1_dut.send_expect('ifconfig %s up' % self.vm1_intf, '#', 10) + self.vm1_dut.send_expect('arp -s %s %s' % (self.virtio_ip[1], self.virtio_mac[1]), '#', 10) + self.vm1_dut.send_expect('iperf -s -p 12345 -i 1 -M > + iperf_server.log &', '', 10) + [QIAN] Same as above, remove "-M" + #self.start_iperf_client() + vm2_vport = self.vm2_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm2_vport + intfs = re.compile('eth\d').findall(vm2_vport) + for intf in intfs: + outmac = self.vm2_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[1] in outmac: + self.vm2_intf = intf + self.vm2_dut.send_expect('ifconfig %s %s' % (self.vm2_intf, self.virtio_ip[1]), '#', 10) + self.vm2_dut.send_expect('ifconfig %s up' % self.vm2_intf, '#', 10) + self.vm2_dut.send_expect('arp -s %s %s' % (self.virtio_ip[0], self.virtio_mac[0]), '#', 10) + self.vm2_dut.send_expect('iperf -c %s -p 12345 -i 1 -t 20 > iperf_client.log &' % self.virtio_ip[0], '', 10) + time.sleep(30) + [QIAN] Same as above, change the time to 60s + self.vm1_dut.session.send_expect('killall -s INT iperf', '#', 10) + self.iperf_result_verify(self.vm2_dut) + + def tear_down(self): + if self.vm2: + self.vm2.stop() + self.vm2 = None + if self.vm1: + self.vm1.stop() + self.vm1 = None + self.dut.send_expect("killall -s INT vhost-switch", "#") + + def tear_down_all(self): + pass -- 2.1.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [dts] [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases 2016-01-14 2:45 ` Fu, JingguoX @ 2016-01-14 2:49 ` Xu, Qian Q 0 siblings, 0 replies; 7+ messages in thread From: Xu, Qian Q @ 2016-01-14 2:49 UTC (permalink / raw) To: Fu, JingguoX, dts I saw it, the main.c file for non-nantic cards are using 512 queues, then I guess the system may lack memory, for FVL 10G card, may be 192 or 316, depends on cards, we may need dynamically change the queue size. It's OK to put it as your V2 version. Btw, pls add more comments when you send patch in future, THX. Thanks Qian -----Original Message----- From: Fu, JingguoX Sent: Thursday, January 14, 2016 10:46 AM To: Xu, Qian Q; dts@dpdk.org Cc: Liu, Yong; Pei, Yulong Subject: RE: [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases I have update the cases and send out v2 patch, Thanks Jingguo Fu -----Original Message----- From: Xu, Qian Q Sent: Thursday, January 07, 2016 11:00 AM To: Fu, JingguoX; dts@dpdk.org Cc: Liu, Yong; Pei, Yulong Subject: RE: [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases See my comments below, thx. Thanks Qian -----Original Message----- From: Fu, JingguoX Sent: Wednesday, December 23, 2015 6:04 PM To: dts@dpdk.org Cc: Liu, Yong; Xu, Qian Q; Pei, Yulong; Fu, JingguoX Subject: [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases [QIAN] need add some description for the patch content. Signed-off-by: Jingguo Fu <jingguox.fu@intel.com> --- tests/TestSuite_virtio_iperf.py | 300 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 tests/TestSuite_virtio_iperf.py diff --git a/tests/TestSuite_virtio_iperf.py b/tests/TestSuite_virtio_iperf.py new file mode 100644 index 0000000..2b7991a --- /dev/null +++ b/tests/TestSuite_virtio_iperf.py @@ -0,0 +1,300 @@ +# 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 # +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 +Test DPDK vhost + virtio scenarios +""" +import re +import dts +import time + +from test_case import TestCase +from qemu_kvm import QEMUKvm + +class TestVirtioIperf(TestCase): + def set_up_all(self): + self.vhost_legacy_virtio_cmdline="csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off" + self.vhost_cuse_virtio_cmdline="csum=off,gso=off,guest_csum=off,guest_tso4=off,guest_tso6=off,guest_ecn=off" + self.vhost_user_virtio_cmdline="" + self.virtio_mac = ["52:54:00:00:00:01", "52:54:00:00:00:02"] + self.virtio_ip = ["1.1.1.2", "1.1.1.3"] + self.vm = [] + self.vm_dut = [] + + self.dut_ports = self.dut.get_ports(self.nic) + self.verify(len(self.dut_ports) >= 1, 'Insufficient ports for + test') + + self.phy_function = self.dut_ports[0] + netdev = self.dut.ports_info[self.phy_function]['port'] + self.socket = netdev.get_nic_socket() + self.cores = self.dut.get_core_list("1S/3C/1T", socket=self.socket) + self.coremask = dts.create_mask(self.cores) + + def set_up(self): + pass + + def dut_execut_cmd(self, cmdline, ex='#', timout=30): + return self.dut.send_expect(cmdline, ex, timout) + + def build_vhost_lib(self, vhost='user'): + self.dut_execut_cmd('git clean -x -d -f') + self.dut_execut_cmd('git checkout *') + if vhost == 'cuse': + self.dut_execut_cmd( + "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE" + + "_VHOST_USER=n/' ./config/common_linuxapp") + else: + self.dut_execut_cmd( + "sed -i -e 's/CONFIG_RTE_LIBRTE_VHOST_USER=.*$/CONFIG_RTE_LIBRTE" + + "_VHOST_USER=y/' ./config/common_linuxapp") + self.dut.build_install_dpdk(self.target) + self.dut_execut_cmd("cd ./lib/librte_vhost") + out = self.dut_execut_cmd("make") + self.verify('Error' not in out, 'bulid err: build lib vhost failed') + self.dut_execut_cmd("cd ./eventfd_link") + out = self.dut_execut_cmd("make") + self.verify('Error' not in out, 'bulid err: build eventfd_link failed') + self.dut_execut_cmd("cd ~/dpdk") + + def build_vhost_app(self): + self.dut_execut_cmd( + "sed -i -e 's/define MAX_QUEUES 512/define MAX_QUEUES 128/' " + + "./examples/vhost/main.c") [QIAN] if change to 128, then it works for Niantic but not FVL, so how about FVL support? + out = self.dut_execut_cmd("make -C ./examples/vhost") + self.verify("Error" not in out, "compilation error") + self.verify("No such file" not in out, "Not found file error") + + def launch_vhost_switch(self, coremask, channel, jumbo, scenario): + self.vhost_switch = "./examples/vhost/build/vhost-switch" + self.vhost_switch_cmd = self.vhost_switch + \ + " -c %s -n %d --socket-mem 2048,2048 -- -p 0x1" + \ + " --mergeable %d --zero-copy 0 --vm2vm %d > ./vhost.out &" + self.dut_execut_cmd(self.vhost_switch_cmd % (coremask, channel, jumbo, scenario)) + time.sleep(20) + self.dut.session.copy_file_from('/root/dpdk/vhost.out') + time.sleep(5) + fp = open('./vhost.out') + fmsg = fp.read() + fp.close() + if 'Error' or 'error' in fmsg: + print 'launch vhost sample failed' + return False + else: + return True + + def iperf_result_verify(self, vm_client): + ''' + vm_client.session.copy_file_from("/root/dpdk/iperf_client.log") + self.tester.send_expect('scp -P') + ''' + vm_client.session.copy_file_from("/root/dpdk/iperf_client.log") + fp = open("./iperf_client.log") + fmsg = fp.read() + iperfdata = re.compile('[\d+]*.[\d+] [M|G]bits/sec').findall(fmsg) + dts.results_table_add_header(['Data', 'Unit']) + for data in iperfdata: + dts.results_table_add_row([data.split()[0], data.split()[1]]) + dts.results_table_print() + import os + os.popen("rm -rf ./iperf_client.log") + + def test_perf_vhost_legacy_virtio_iperf(self): + pass + + def test_perf_vhost_cuse_virtio_iperf(self): + """ + vhost cuse as back end, legacy virtio dirver as front end + """ + self.build_vhost_lib(vhost='cuse') + self.build_vhost_app() + self.dut_execut_cmd('rm -rf /dev/vhost-net') + self.dut_execut_cmd('rmmod igb_uio -f') + self.dut_execut_cmd('rmmod eventfd_link') + self.dut_execut_cmd('modprobe uio') + self.dut_execut_cmd('modprobe fuse') + self.dut_execut_cmd('modprobe cuse') + self.dut_execut_cmd('insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko') + self.dut_execut_cmd('insmod ./lib/librte_vhost/eventfd_link/eventfd_link.ko') + self.dut.bind_interfaces_linux(dts.drivername) + self.launch_vhost_switch(self.coremask, 4, 0, 1) + + self.vm1 = QEMUKvm(self.dut, 'vm0', 'virtio_iperf') + vm1_params = {} + vm1_params['driver'] = 'vhost-cuse' + vm1_params['opt_tap'] = 'vhost0' + vm1_params['opt_mac'] = self.virtio_mac[0] + vm1_params['opt_settings'] = self.vhost_cuse_virtio_cmdline + self.vm1.set_vm_device(**vm1_params) + try: + self.vm1_dut = self.vm1.start(auto_portmap=False) + time.sleep(10) + if self.vm1_dut is None: + raise Exception('VM1 start failed') + except Exception as e0: + print dts.RED('VM1 already exist, powerdown it first') + self.vm1_dut.restore_interfaces() + + self.vm2 = QEMUKvm(self.dut, 'vm1', 'virtio_iperf') + vm2_params = {} + vm2_params['driver'] = 'vhost-cuse' + vm2_params['opt_tap'] = 'vhost1' + vm2_params['opt_mac'] = self.virtio_mac[1] + vm2_params['opt_settings'] = self.vhost_cuse_virtio_cmdline + self.vm2.set_vm_device(**vm2_params) + try: + self.vm2_dut = self.vm2.start(auto_portmap=False) + time.sleep(10) + if self.vm2_dut is None: + raise Exception('VM2 start failed') + except Exception as e1: + print dts.RED('VM2 already exist, powerdown it first') + self.vm2_dut.restore_interfaces() + + #self.start_iperf_server() + vm1_vport = self.vm1_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm1_vport + intfs = re.compile('eth\d').findall(vm1_vport) + for intf in intfs: + outmac = self.vm1_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[0] in outmac: + self.vm1_intf = intf + self.vm1_dut.send_expect('ifconfig %s %s' % (self.vm1_intf, self.virtio_ip[0]), '#', 10) + self.vm1_dut.send_expect('ifconfig %s up' % self.vm1_intf, '#', 10) + self.vm1_dut.send_expect('arp -s %s %s' % (self.virtio_ip[1], self.virtio_mac[1]), '#', 10) + self.vm1_dut.send_expect('iperf -s -p 12345 -i 1 -M > + iperf_server.log &', '', 10) [QIAN] the command can be changed to "iperf -s -p 12345 -I 1", remove -M + + #self.start_iperf_client() + vm2_vport = self.vm2_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm2_vport + intfs = re.compile('eth\d').findall(vm2_vport) + for intf in intfs: + outmac = self.vm2_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[1] in outmac: + self.vm2_intf = intf + self.vm2_dut.send_expect('ifconfig %s %s' % (self.vm2_intf, self.virtio_ip[1]), '#', 10) + self.vm2_dut.send_expect('ifconfig %s up' % self.vm2_intf, '#', 10) + self.vm2_dut.send_expect('arp -s %s %s' % (self.virtio_ip[0], self.virtio_mac[0]), '#', 10) + self.vm2_dut.send_expect('iperf -c %s -p 12345 -i 1 -t 20 > + iperf_client.log &' % self.virtio_ip[0], '', 10) [QIAN] the time can be a little longer, such as 60s, -t 60 + time.sleep(30) + self.vm1_dut.send_expect("killall -s INT iperf", '', 10) + self.iperf_result_verify(self.vm2_dut) + + def test_perf_vhost_user_virtio_iperf(self): + """ + vhost user as back end, legacy virtio dirver as front end + """ + self.build_vhost_lib(vhost='user') + self.build_vhost_app() + #self.dut_execut_cmd('rm -rf /dev/vhost-net') + self.dut_execut_cmd('rmmod igb_uio -f') + self.dut_execut_cmd('rmmod eventfd_link') + self.dut_execut_cmd('modprobe uio') + #self.dut_execut_cmd('modprobe fuse') + #self.dut_execut_cmd('modprobe cuse') + self.dut_execut_cmd('insmod ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko') + self.dut_execut_cmd('insmod ./lib/librte_vhost/eventfd_link/eventfd_link.ko') + self.dut.bind_interfaces_linux(dts.drivername) + self.launch_vhost_switch(self.coremask, 4, 0, 1) + + self.vm1 = QEMUKvm(self.dut, 'vm0', 'virtio_iperf') + vm1_params = {} + vm1_params['driver'] = 'vhost-user' + vm1_params['opt_path'] = './vhost-net' + vm1_params['opt_mac'] = self.virtio_mac[0] + self.vm1.set_vm_device(**vm1_params) + try: + self.vm1_dut = self.vm1.start(auto_portmap=False) + if self.vm1_dut is None: + raise Exception('VM1 start failed') + except Exception as e0: + print dts.RED('VM1 already exist, powerdown it first') + self.vm1_dut.restore_interfaces() + + self.vm2 = QEMUKvm(self.dut, 'vm1', 'virtio_iperf') + vm2_params = {} + vm2_params['driver'] = 'vhost-user' + vm2_params['opt_path'] = './vhost-net' + vm2_params['opt_mac'] = self.virtio_mac[1] + self.vm2.set_vm_device(**vm2_params) + try: + self.vm2_dut = self.vm2.start(auto_portmap=False) + if self.vm2_dut is None: + raise Exception('VM2 start failed') + except Exception as e1: + print dts.RED('VM2 already exist, powerdown it first') + + self.vm2_dut.restore_interfaces() + + #self.start_iperf_server() + vm1_vport = self.vm1_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm1_vport + intfs = re.compile('eth\d').findall(vm1_vport) + for intf in intfs: + outmac = self.vm1_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[0] in outmac: + self.vm1_intf = intf + self.vm1_dut.send_expect('ifconfig %s %s' % (self.vm1_intf, self.virtio_ip[0]), '#', 10) + self.vm1_dut.send_expect('ifconfig %s up' % self.vm1_intf, '#', 10) + self.vm1_dut.send_expect('arp -s %s %s' % (self.virtio_ip[1], self.virtio_mac[1]), '#', 10) + self.vm1_dut.send_expect('iperf -s -p 12345 -i 1 -M > + iperf_server.log &', '', 10) + [QIAN] Same as above, remove "-M" + #self.start_iperf_client() + vm2_vport = self.vm2_dut.send_expect('ifconfig -a', '#', 30) + print 'vm net port:' + print vm2_vport + intfs = re.compile('eth\d').findall(vm2_vport) + for intf in intfs: + outmac = self.vm2_dut.send_expect('ifconfig %s' % intf, '#', 30) + if self.virtio_mac[1] in outmac: + self.vm2_intf = intf + self.vm2_dut.send_expect('ifconfig %s %s' % (self.vm2_intf, self.virtio_ip[1]), '#', 10) + self.vm2_dut.send_expect('ifconfig %s up' % self.vm2_intf, '#', 10) + self.vm2_dut.send_expect('arp -s %s %s' % (self.virtio_ip[0], self.virtio_mac[0]), '#', 10) + self.vm2_dut.send_expect('iperf -c %s -p 12345 -i 1 -t 20 > iperf_client.log &' % self.virtio_ip[0], '', 10) + time.sleep(30) + [QIAN] Same as above, change the time to 60s + self.vm1_dut.session.send_expect('killall -s INT iperf', '#', 10) + self.iperf_result_verify(self.vm2_dut) + + def tear_down(self): + if self.vm2: + self.vm2.stop() + self.vm2 = None + if self.vm1: + self.vm1.stop() + self.vm1 = None + self.dut.send_expect("killall -s INT vhost-switch", "#") + + def tear_down_all(self): + pass -- 2.1.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2016-01-14 2:49 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-12-23 10:04 [dts] [DTS][PATCH 1/4] virt: dpdk vhost plus virtio iperf config Jingguo Fu 2015-12-23 10:04 ` [dts] [DTS][PATCH 2/4] virt: add copy file from virt guest Jingguo Fu 2015-12-23 10:04 ` [dts] [DTS][PATCH 3/4] virt: qemu kvm init for two vms scenario Jingguo Fu 2015-12-23 10:04 ` [dts] [DTS][PATCH 4/4] virt: add dpdk vhost virtio iperf test cases Jingguo Fu 2016-01-07 2:59 ` Xu, Qian Q 2016-01-14 2:45 ` Fu, JingguoX 2016-01-14 2:49 ` Xu, Qian Q
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).