From: xizhan4x <xix.zhang@intel.com>
To: dts@dpdk.org
Cc: xizhan4x <xix.zhang@intel.com>
Subject: [dts] [PATCH V1] tests/TestSuite_vm2vm_virtio_user:add new virtio case
Date: Thu, 17 Sep 2020 14:35:03 +0800 [thread overview]
Message-ID: <1600324503-821-1-git-send-email-xix.zhang@intel.com> (raw)
add new virtio case & support meson build
Signed-off-by: xizhan4x <xix.zhang@intel.com>
---
tests/TestSuite_vm2vm_virtio_user.py | 266 ++++++++++++++++++++++++++++++++---
1 file changed, 248 insertions(+), 18 deletions(-)
diff --git a/tests/TestSuite_vm2vm_virtio_user.py b/tests/TestSuite_vm2vm_virtio_user.py
index 16b90c0..d2dfb97 100644
--- a/tests/TestSuite_vm2vm_virtio_user.py
+++ b/tests/TestSuite_vm2vm_virtio_user.py
@@ -57,15 +57,21 @@ class TestVM2VMVirtioUser(TestCase):
self.socket_mem = ','.join(['1024']*socket_num)
self.get_core_list()
self.rebuild_flag = False
- self.config_value = 'CONFIG_RTE_LIBRTE_PMD_PCAP'
+ self.config_value = 'RTE_LIBRTE_PMD_PCAP'
self.enable_pcap_lib_in_dpdk(self.dut)
self.app_testpmd_path = self.dut.apps_name['test-pmd']
self.app_pdump = self.dut.apps_name['pdump']
+ self.dut_ports = self.dut.get_ports()
+ self.cbdma_dev_infos = []
+ self.ports_socket = self.dut.get_numa_id(self.dut_ports[0])
+ self.queue_num=1
+ self.device_str=''
def set_up(self):
"""
run before each test case.
"""
+ self.nopci = True
self.dut.send_expect("rm -rf ./vhost-net*", "#")
self.dut.send_expect("rm -rf %s" % self.dump_virtio_pcap, "#")
self.dut.send_expect("rm -rf %s" % self.dump_vhost_pcap, "#")
@@ -93,16 +99,11 @@ class TestVM2VMVirtioUser(TestCase):
"""
enable pcap lib in dpdk code and recompile
"""
- out = self.dut.send_command('cat config/common_base', timeout=3)
- pcap = re.search('%s=(\S*)' % self.config_value, out)
- self.verify(pcap is not None, 'The config:%s can not find in common_base' % self.config_value)
- default_value = pcap.group(1)
- if str.lower(default_value) != 'y':
- client_dut.send_expect("sed -i 's/%s=n$/%s=y/' config/common_base" % (
+ client_dut.send_expect("sed -i 's/%s=n$/%s=y/' config/common_base" % (
self.config_value, self.config_value), '# ')
- client_dut.set_build_options({'RTE_LIBRTE_PMD_PCAP': 'y'})
- client_dut.build_install_dpdk(self.target)
- self.rebuild_flag = True
+ client_dut.set_build_options({'RTE_LIBRTE_PMD_PCAP': 'y'})
+ client_dut.build_install_dpdk(self.target)
+ self.rebuild_flag = True
def disable_pcap_lib_in_dpdk(self, client_dut):
"""
@@ -114,18 +115,22 @@ class TestVM2VMVirtioUser(TestCase):
client_dut.set_build_options({'RTE_LIBRTE_PMD_PCAP': 'n'})
client_dut.build_install_dpdk(self.target)
- def launch_vhost_testpmd(self, vdev_num, fixed_prefix=False, fwd_mode='io'):
+ def launch_vhost_testpmd(self, vdev_num, fixed_prefix=False, fwd_mode='io',vdevs=None):
eal_params = self.dut.create_eal_parameters(cores=self.core_list_vhost,
- no_pci=True, prefix=self.vhost_prefix, fixed_prefix=fixed_prefix)
+ no_pci=self.nopci, prefix=self.vhost_prefix, fixed_prefix=fixed_prefix)
vdev_params = ''
- for i in range(vdev_num):
- vdev_params += "--vdev 'net_vhost%d,iface=./vhost-net%d,queues=1' " % (i, i)
+ if vdevs:
+ vdev_params = vdevs
+ params = " %s -- -i --nb-cores=1 --rxq=2 --txq=2 --txd=256 --rxd=256 --no-flush-rx"
+ else:
+ for i in range(vdev_num):
+ vdev_params += "--vdev 'net_vhost%d,iface=./vhost-net%d,queues=1' " % (i, i)
+ params = " %s -- -i --nb-cores=1 --no-flush-rx"
- self.command_line = self.app_testpmd_path + ' %s ' + \
- '--socket-mem %s %s -- -i --nb-cores=1 --no-flush-rx'
+ self.command_line = self.app_testpmd_path + ' %s ' + params
self.command_line = self.command_line % (
- eal_params, self.socket_mem, vdev_params)
+ eal_params, vdev_params)
self.pmd_vhost.execute_cmd(self.command_line, timeout=30)
self.pmd_vhost.execute_cmd('set fwd %s' % fwd_mode)
@@ -142,7 +147,8 @@ class TestVM2VMVirtioUser(TestCase):
no_pci=True, prefix=self.virtio_prefix, fixed_prefix=True)
if self.check_2M_env:
eal_params += " --single-file-segments "
- vdev_params = '--vdev=net_virtio_user1,mac=00:01:02:03:04:05,path=./vhost-net1,queues=1,%s,queue_size=%d ' % (path_mode, ringsize)
+ vdev_params = '--vdev=net_virtio_user1,mac=00:01:02:03:04:05,path=./vhost-net1,queues=%d,%s,queue_size=%d ' \
+ % (self.queue_num, path_mode, ringsize)
command_line = self.app_testpmd_path + " %s " + \
"--socket-mem %s %s -- -i --nb-cores=1 --txd=%d --rxd=%d %s"
command_line = command_line % (eal_params, self.socket_mem,
@@ -173,6 +179,60 @@ class TestVM2VMVirtioUser(TestCase):
self.pmd_virtio0.execute_cmd('set burst 32')
self.pmd_virtio0.execute_cmd('start tx_first 7')
+ def start_virtio_testpmd_with_vhost_net0_cbdma(self, path_mode, extern_params, ringsize):
+ """
+ launch the testpmd as virtio with vhost_net0
+ and start to send 251 small packets with diff burst
+ """
+ eal_params = self.dut.create_eal_parameters(cores=self.core_list_virtio0,
+ no_pci=True, prefix='virtio0')
+ if self.check_2M_env:
+ eal_params += " --single-file-segments "
+ vdev_params = '--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net0,queues=%d,%s,queue_size=%d ' % \
+ (self.queue_num, path_mode, ringsize)
+ command_line = self.app_testpmd_path + eal_params + \
+ ' %s -- -i --nb-cores=1 --txd=%d --rxd=%d %s'
+ command_line = command_line % (vdev_params, ringsize, ringsize, extern_params)
+
+ self.pmd_virtio0.execute_cmd(command_line, timeout=30)
+
+ def check_packet_payload_valid_with_cbdma(self, filename, small_pkts_num, large_8k_pkts_num, large_2k_pkts_num):
+ """
+ check the payload is valid
+ """
+ # stop pdump
+ total_pkts_num = small_pkts_num
+ actual_8k_pkt_num = 0
+ actual_2k_pkt_num = 0
+ time.sleep(20)
+ self.pdump_session.send_expect('^c', '# ', 60)
+ # quit testpmd
+ self.quit_all_testpmd()
+ time.sleep(2)
+ self.dut.session.copy_file_from(src="%s" % filename, dst="%s" % filename)
+ pkt = Packet()
+ pkts = pkt.read_pcapfile(filename)
+ self.verify(pkts is not None and len(pkts) == total_pkts_num,
+ "The virtio/vhost do not capture all the packets"
+ "expect pkt num is: %d, actual pkt num is: %d" % (total_pkts_num, len(pkts)))
+ for i in range(len(pkts)):
+ if len(pkts[i]) == 8000:
+ actual_8k_pkt_num += 1
+ elif len(pkts[i]) == 2000:
+ actual_2k_pkt_num += 1
+ self.verify(large_8k_pkts_num == actual_8k_pkt_num, f"8K packet quantity error,expected value:{large_8k_pkts_num}"
+ f", actual value : {actual_8k_pkt_num}")
+ self.verify(large_2k_pkts_num == actual_2k_pkt_num, f"2K packet quantity error,expected value:{large_2k_pkts_num}"
+ f", actual value : {actual_2k_pkt_num}")
+
+ def get_dump_file_of_virtio_user_cbdma(self, path_mode, extern_param, ringsize, vdevs=None):
+ dump_port = 'device_id=net_virtio_user1'
+ self.launch_vhost_testpmd(vdev_num=2, vdevs=vdevs)
+ self.start_virtio_testpmd_with_vhost_net1(path_mode, extern_param, ringsize)
+ self.launch_pdump_to_capture_pkt(dump_port, self.virtio_prefix, self.dump_virtio_pcap)
+ # the virtio0 will send 251 small pkts
+ self.start_virtio_testpmd_with_vhost_net0_cbdma(path_mode, extern_param, ringsize)
+
def resend_32_large_pkt_from_virtio0(self):
self.pmd_virtio0.execute_cmd('stop')
self.pmd_virtio0.execute_cmd('set burst 32')
@@ -605,10 +665,16 @@ class TestVM2VMVirtioUser(TestCase):
if getattr(self, 'pdump_session', None):
self.dut.close_session(self.pdump_session)
+ def bind_cbdma_device_to_kernel(self):
+ if self.device_str is not None:
+ self.dut.send_expect('modprobe ioatdma', '# ')
+ self.dut.send_expect('./usertools/dpdk-devbind.py -u %s' % self.device_str, '# ', 30)
+ self.dut.send_expect('./usertools/dpdk-devbind.py --force --bind=ioatdma %s' % self.device_str, '# ', 60)
def tear_down(self):
#
# Run after each test case.
#
+ self.bind_nic_driver(self.dut_ports, self.drivername)
self.dut.kill_all()
time.sleep(2)
@@ -616,5 +682,169 @@ class TestVM2VMVirtioUser(TestCase):
"""
Run after each test suite.
"""
+ self.bind_cbdma_device_to_kernel()
self.disable_pcap_lib_in_dpdk(self.dut)
self.close_all_session()
+
+ def bind_nic_driver(self, ports, driver=""):
+ if driver == "igb_uio":
+ for port in ports:
+ netdev = self.dut.ports_info[port]['port']
+ driver = netdev.get_nic_driver()
+ if driver != 'igb_uio':
+ netdev.bind_driver(driver='igb_uio')
+ else:
+ for port in ports:
+ netdev = self.dut.ports_info[port]['port']
+ driver_now = netdev.get_nic_driver()
+ if driver == "":
+ driver = netdev.default_driver
+ if driver != driver_now:
+ netdev.bind_driver(driver=driver)
+
+ def test_vm2vm_virtio_user_split_virtqueue_inorder_mergeable_path_with_cbdma(self):
+ """
+
+ :return:
+ """
+ self.cbdma_nic_dev_num = 4
+ self.bind_nic_driver(self.dut_ports)
+ self.get_cbdma_ports_info_and_bind_to_dpdk()
+ small_pkts_num = 64
+ large_8k_pkts_num = 64
+ large_2k_pkts_num = 0
+ self.queue_num=2
+ self.nopci=False
+ path_mode = 'packed_vq=0,mrg_rxbuf=1,in_order=1,server=1'
+ ringsize = 256
+ extern_params = '--rxq=2 --txq=2'
+ # get dump pcap file of virtio
+ # the virtio0 will send 283 pkts, but the virtio only will received 252 pkts
+ self.logger.info('check pcap file info about virtio')
+ vdevs = f"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@{self.cbdma_dev_infos[0]};txq1@{self.cbdma_dev_infos[1]}],dmathr=512' " \
+ f"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@{self.cbdma_dev_infos[2]};txq1@{self.cbdma_dev_infos[3]}],dmathr=512'"
+
+ self.get_dump_file_of_virtio_user_cbdma(path_mode, extern_params, ringsize, vdevs)
+ self.send_8k_pkt()
+ self.check_packet_payload_valid_with_cbdma(self.dump_virtio_pcap, small_pkts_num, large_8k_pkts_num,
+ large_2k_pkts_num)
+ # get dump pcap file of vhost
+ self.logger.info('check pcap file info about vhost')
+ small_pkts_num = 256
+ large_8k_pkts_num = 54
+ large_2k_pkts_num = 202
+ self.get_dump_file_of_virtio_user_cbdma(path_mode, extern_params, ringsize, vdevs)
+ self.send_multiple_pkt()
+ self.check_packet_payload_valid_with_cbdma(self.dump_virtio_pcap, small_pkts_num, large_8k_pkts_num, large_2k_pkts_num)
+
+ self.logger.info('diff the pcap file of vhost and virtio')
+
+ def test_vm2vm_virtio_user_split_virtqueue_mergeable_path_with_cbdma(self):
+ """
+
+ :return:
+ """
+ self.cbdma_nic_dev_num = 4
+ self.bind_nic_driver(self.dut_ports)
+ self.get_cbdma_ports_info_and_bind_to_dpdk()
+ small_pkts_num = 448
+ large_8k_pkts_num = 54
+ large_2k_pkts_num = 394
+ self.queue_num=2
+ self.nopci=False
+ path_mode = 'packed_vq=0,mrg_rxbuf=1,in_order=0,server=1'
+ ringsize = 256
+ extern_params = '--rxq=2 --txq=2'
+ # get dump pcap file of virtio
+ # the virtio0 will send 283 pkts, but the virtio only will received 252 pkts
+ self.logger.info('check pcap file info about virtio')
+ vdevs = f"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@{self.cbdma_dev_infos[0]};txq1@{self.cbdma_dev_infos[1]}],dmathr=512' " \
+ f"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@{self.cbdma_dev_infos[2]};txq1@{self.cbdma_dev_infos[3]}],dmathr=512'"
+
+ self.get_dump_file_of_virtio_user_cbdma(path_mode, extern_params, ringsize, vdevs)
+ self.send_multiple_pkt_with_8k54_2k394()
+ self.check_packet_payload_valid_with_cbdma(self.dump_virtio_pcap, small_pkts_num, large_8k_pkts_num, large_2k_pkts_num)
+ # get dump pcap file of vhost
+ self.logger.info('check pcap file info about vhost')
+ small_pkts_num = 448
+ large_8k_pkts_num = 448
+ large_2k_pkts_num = 0
+ self.get_dump_file_of_virtio_user_cbdma(path_mode, extern_params, ringsize, vdevs)
+ self.send_multiple_pkt_with_8k448()
+ self.check_packet_payload_valid_with_cbdma(self.dump_virtio_pcap, small_pkts_num, large_8k_pkts_num, large_2k_pkts_num)
+
+ self.logger.info('diff the pcap file of vhost and virtio')
+
+ def send_multiple_pkt_with_8k54_2k394(self):
+ self.pmd_virtio0.execute_cmd('set burst 1')
+ self.pmd_virtio0.execute_cmd('set txpkts 2000,2000,2000,2000')
+ self.pmd_virtio0.execute_cmd('start tx_first 27')
+ self.pmd_virtio0.execute_cmd('stop')
+ self.pmd_virtio0.execute_cmd('set burst 32')
+ self.pmd_virtio0.execute_cmd('set txpkts 2000')
+ self.pmd_virtio0.execute_cmd('start tx_first 7')
+ self.pmd_vhost.execute_cmd('start')
+
+ def send_multiple_pkt_with_8k448(self):
+ self.pmd_virtio0.execute_cmd('set burst 1')
+ self.pmd_virtio0.execute_cmd('set txpkts 2000,2000,2000,2000')
+ self.pmd_virtio0.execute_cmd('start tx_first 27')
+ self.pmd_virtio0.execute_cmd('stop')
+ self.pmd_virtio0.execute_cmd('set burst 32')
+ self.pmd_virtio0.execute_cmd('set txpkts 2000,2000,2000,2000')
+ self.pmd_virtio0.execute_cmd('start tx_first 7')
+ self.pmd_vhost.execute_cmd('start')
+
+ def send_8k_pkt(self):
+ self.pmd_virtio0.execute_cmd('set burst 1')
+ self.pmd_virtio0.execute_cmd('set txpkts 2000,2000,2000,2000')
+ self.pmd_virtio0.execute_cmd('start tx_first 27')
+ self.pmd_virtio0.execute_cmd('stop')
+ self.pmd_virtio0.execute_cmd('set burst 32')
+ self.pmd_virtio0.execute_cmd('start tx_first 7')
+ self.pmd_virtio0.execute_cmd('stop')
+ self.pmd_virtio0.execute_cmd('set txpkts 2000')
+ self.pmd_virtio0.execute_cmd('start tx_first 1')
+ self.pmd_vhost.execute_cmd('start')
+
+ def send_multiple_pkt(self):
+ self.pmd_virtio0.execute_cmd('set burst 1')
+ self.pmd_virtio0.execute_cmd('set txpkts 2000,2000,2000,2000')
+ self.pmd_virtio0.execute_cmd('start tx_first 27')
+ self.pmd_virtio0.execute_cmd('stop')
+ self.pmd_virtio0.execute_cmd('set burst 32')
+ self.pmd_virtio0.execute_cmd('set txpkts 2000')
+ self.pmd_virtio0.execute_cmd('start tx_first 7')
+ self.pmd_virtio0.execute_cmd('stop')
+ self.pmd_virtio0.execute_cmd('set txpkts 2000')
+ self.pmd_virtio0.execute_cmd('start tx_first 1')
+ self.pmd_vhost.execute_cmd('start')
+
+
+
+ def get_cbdma_ports_info_and_bind_to_dpdk(self):
+ """
+ get all cbdma ports
+ """
+
+ str_info = 'Misc (rawdev) devices using kernel driver'
+ out = self.dut.send_expect('./usertools/dpdk-devbind.py --status-dev misc',
+ '# ', 30)
+ device_info = out.split('\n')
+ for device in device_info:
+ pci_info = re.search('\s*(0000:\d*:\d*.\d*)', device)
+ if pci_info is not None:
+ dev_info = pci_info.group(1)
+ # the numa id of ioat dev, only add the device which
+ # on same socket with nic dev
+ bus = int(dev_info[5:7], base=16)
+ if bus >= 128:
+ cur_socket = 1
+ else:
+ cur_socket = 0
+ if self.ports_socket == cur_socket:
+ self.cbdma_dev_infos.append(pci_info.group(1))
+ self.verify(len(self.cbdma_dev_infos) >= 8, 'There no enough cbdma device to run this suite')
+ self.device_str = ' '.join(self.cbdma_dev_infos[0:self.cbdma_nic_dev_num])
+ self.dut.send_expect('./usertools/dpdk-devbind.py --force --bind=igb_uio %s' %
+ self.device_str, '# ', 60)
--
1.8.3.1
next reply other threads:[~2020-09-17 6:33 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-17 6:35 xizhan4x [this message]
2020-09-17 6:34 ` Zhang, XiX
2020-09-22 5:40 ` Wang, Yinan
2020-09-23 7:40 ` Tu, Lijuan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1600324503-821-1-git-send-email-xix.zhang@intel.com \
--to=xix.zhang@intel.com \
--cc=dts@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).