get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/96182/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 96182,
    "url": "http://patches.dpdk.org/api/patches/96182/?format=api",
    "web_url": "http://patches.dpdk.org/project/dts/patch/20210722021510.80937-1-dechunx.xie@intel.com/",
    "project": {
        "id": 3,
        "url": "http://patches.dpdk.org/api/projects/3/?format=api",
        "name": "DTS",
        "link_name": "dts",
        "list_id": "dts.dpdk.org",
        "list_email": "dts@dpdk.org",
        "web_url": "",
        "scm_url": "git://dpdk.org/tools/dts",
        "webscm_url": "http://git.dpdk.org/tools/dts/",
        "list_archive_url": "https://inbox.dpdk.org/dts",
        "list_archive_url_format": "https://inbox.dpdk.org/dts/{}",
        "commit_url_format": ""
    },
    "msgid": "<20210722021510.80937-1-dechunx.xie@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20210722021510.80937-1-dechunx.xie@intel.com",
    "date": "2021-07-22T02:15:10",
    "name": "[V1] tests/vm2vm_virtio_pmd: add testcase sync with testplan",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "85b55ec680f1aea428d67425e8ff5407805acf8a",
    "submitter": {
        "id": 2290,
        "url": "http://patches.dpdk.org/api/people/2290/?format=api",
        "name": "Xie Dechun",
        "email": "dechunx.xie@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dts/patch/20210722021510.80937-1-dechunx.xie@intel.com/mbox/",
    "series": [
        {
            "id": 17944,
            "url": "http://patches.dpdk.org/api/series/17944/?format=api",
            "web_url": "http://patches.dpdk.org/project/dts/list/?series=17944",
            "date": "2021-07-22T02:15:10",
            "name": "[V1] tests/vm2vm_virtio_pmd: add testcase sync with testplan",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/17944/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/96182/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/96182/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dts-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 8A37DA0C45;\n\tThu, 22 Jul 2021 04:21:17 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 5A4F24014E;\n\tThu, 22 Jul 2021 04:21:17 +0200 (CEST)",
            "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n by mails.dpdk.org (Postfix) with ESMTP id 39CE44014D\n for <dts@dpdk.org>; Thu, 22 Jul 2021 04:21:16 +0200 (CEST)",
            "from fmsmga002.fm.intel.com ([10.253.24.26])\n by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 21 Jul 2021 19:21:14 -0700",
            "from unknown (HELO localhost.localdomain) ([10.240.183.217])\n by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 21 Jul 2021 19:21:13 -0700"
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10052\"; a=\"275370982\"",
            "E=Sophos;i=\"5.84,259,1620716400\"; d=\"scan'208\";a=\"275370982\"",
            "E=Sophos;i=\"5.84,259,1620716400\"; d=\"scan'208\";a=\"512010460\""
        ],
        "From": "Xie Dechun <dechunx.xie@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "xiedechun <dechunx.xie@intel.com>",
        "Date": "Thu, 22 Jul 2021 10:15:10 +0800",
        "Message-Id": "<20210722021510.80937-1-dechunx.xie@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "Subject": "[dts] [PATCH V1] tests/vm2vm_virtio_pmd: add testcase sync with\n testplan",
        "X-BeenThere": "dts@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "test suite reviews and discussions <dts.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dts/>",
        "List-Post": "<mailto:dts@dpdk.org>",
        "List-Help": "<mailto:dts-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dts-bounces@dpdk.org",
        "Sender": "\"dts\" <dts-bounces@dpdk.org>"
    },
    "content": "From: xiedechun <dechunx.xie@intel.com>\n\nAdd 3 new dequeue testcase 9-11 sync with testplan.\n\nSigned-off-by: xiedechun <dechunx.xie@intel.com>\n---\n tests/TestSuite_vm2vm_virtio_pmd.py | 327 +++++++++++++++++++++++++++-\n 1 file changed, 315 insertions(+), 12 deletions(-)",
    "diff": "diff --git a/tests/TestSuite_vm2vm_virtio_pmd.py b/tests/TestSuite_vm2vm_virtio_pmd.py\nindex 67e23666..0cc992a0 100644\n--- a/tests/TestSuite_vm2vm_virtio_pmd.py\n+++ b/tests/TestSuite_vm2vm_virtio_pmd.py\n@@ -44,7 +44,7 @@ import utils\n from virt_common import VM\n from test_case import TestCase\n from packet import Packet\n-\n+from pmd_output import PmdOutput\n \n class TestVM2VMVirtioPMD(TestCase):\n     def set_up_all(self):\n@@ -61,6 +61,9 @@ class TestVM2VMVirtioPMD(TestCase):\n         self.app_testpmd_path = self.dut.apps_name['test-pmd']\n         self.app_pdump = self.dut.apps_name['pdump']\n         self.testpmd_name = self.app_testpmd_path.split(\"/\")[-1]\n+        self.pmd_vhost = PmdOutput(self.dut, self.vhost_user)\n+        self.cbdma_dev_infos = []\n+        self.vm_config = 'vhost_sample'\n \n     def set_up(self):\n         \"\"\"\n@@ -140,7 +143,7 @@ class TestVM2VMVirtioPMD(TestCase):\n         self.virtio_user0.send_expect('set burst 1', 'testpmd> ', 30)\n         self.virtio_user0.send_expect('start tx_first 10', 'testpmd> ', 30)\n \n-    def start_vm_testpmd(self, vm_client, path_mode, extern_param=\"\", virtio_net_pci=\"\"):\n+    def start_vm_testpmd(self, vm_client, path_mode, extern_param=\"\", virtio_net_pci=\"\", queues=\"\"):\n         \"\"\"\n         launch the testpmd in vm\n         \"\"\"\n@@ -151,16 +154,20 @@ class TestVM2VMVirtioPMD(TestCase):\n         if path_mode == \"mergeable\":\n             command = self.app_testpmd_path + \" -c 0x3 -n 4 \" + \\\n                         \"--file-prefix=virtio -- -i --tx-offloads=0x00 \" + \\\n-                        \"--enable-hw-vlan-strip --txd=1024 --rxd=1024 %s\"\n+                        \"--enable-hw-vlan-strip \" + \"--txq={0} --rxq={0} \".format(queues) if queues else \"\"\n+\n+            command = command + \"--txd=1024 --rxd=1024 %s\"\n             vm_client.send_expect(command % extern_param, \"testpmd> \", 20)\n         elif path_mode == \"normal\":\n             command = self.app_testpmd_path + \" -c 0x3 -n 4 \" + \\\n                         \"--file-prefix=virtio -- -i --tx-offloads=0x00 \" + \\\n-                        \"--enable-hw-vlan-strip --txd=1024 --rxd=1024 %s\"\n+                        \"--enable-hw-vlan-strip \" + \"--txq={0} --rxq={0} \".format(queues) if queues else \"\"\n+            command = command + \"--txd=1024 --rxd=1024 %s\"\n             vm_client.send_expect(command % extern_param, \"testpmd> \", 20)\n         elif path_mode == \"vector_rx\":\n             command = self.app_testpmd_path + \" -c 0x3 -n 4 \" + \\\n-                        \"--file-prefix=virtio %s -- -i --txd=1024 --rxd=1024 %s\"\n+                        \"--file-prefix=virtio %s -- -i\" + \"--txq={0} --rxq={0} \".format(queues) if queues else \"\"\n+            command = command + \"--txd=1024 --rxd=1024 %s\"\n             vm_client.send_expect(command % (w_pci_str, extern_param), \"testpmd> \", 20)\n \n     def launch_pdump_to_capture_pkt(self, client_dut, dump_port):\n@@ -179,7 +186,7 @@ class TestVM2VMVirtioPMD(TestCase):\n                     \"--pdump  '%s,queue=*,rx-dev=%s,mbuf-size=8000'\"\n             self.pdump_session.send_expect(command_line % (self.dut.prefix_subfix, dump_port, self.dump_pcap), 'Port')\n \n-    def start_vms(self, mode=0, mergeable=True):\n+    def start_vms(self, mode=0, mergeable=True, server_mode=False, opt_queue=None, vm_config=''):\n         \"\"\"\n         start two VM, each VM has one virtio device\n         \"\"\"\n@@ -195,14 +202,23 @@ class TestVM2VMVirtioPMD(TestCase):\n             setting_args += \",\" + \"mrg_rxbuf=on\"\n         else:\n             setting_args += \",\" + \"mrg_rxbuf=off\"\n-        setting_args += \",csum=on,gso=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on\"\n+        vm_params = {}\n+        if opt_queue > 1:\n+            setting_args += \",csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on\"\n+            vm_params['opt_queue'] = opt_queue\n+            setting_args = setting_args + \",mq=on,vectors=40\"\n+        else:\n+            setting_args += \",csum=on,gso=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on\"\n \n         for i in range(self.vm_num):\n             vm_dut = None\n-            vm_info = VM(self.dut, 'vm%d' % i, 'vhost_sample')\n-            vm_params = {}\n+            vm_info = VM(self.dut, 'vm%d' % i, vm_config)\n+\n             vm_params['driver'] = 'vhost-user'\n-            vm_params['opt_path'] = self.base_dir + '/vhost-net%d' % i\n+            if not server_mode:\n+                vm_params['opt_path'] = self.base_dir + '/vhost-net%d' % i\n+            else:\n+                vm_params['opt_path'] = self.base_dir + '/vhost-net%d' % i + ',server'\n             vm_params['opt_mac'] = \"52:54:00:00:00:0%d\" % (i+1)\n             vm_params['opt_settings'] = setting_args\n             vm_info.set_vm_device(**vm_params)\n@@ -419,14 +435,301 @@ class TestVM2VMVirtioPMD(TestCase):\n          # check the packet in vm0\n         self.check_packet_payload_valid(self.vm_dut[0])\n \n+    def test_vhost_vm2vm_virtio_split_ring_with_mergeable_path_cbdma_enabled(self):\n+        \"\"\"\n+        Test Case 9: VM2VM virtio-pmd split ring mergeable path 4 queues CBDMA enable with server mode stable test\n+        \"\"\"\n+        self.nb_cores = 4\n+        self.get_core_list(self.nb_cores + 1)\n+        self.get_cbdma_ports_info_and_bind_to_dpdk(cbdma_num=16, queue_num=4, allow_diff_socket=True)\n+        self.logger.info(\"Launch vhost-testpmd with CBDMA and used 4 queue\")\n+        self.prepare_test_env(cbdma=True, no_pci=False, client_mode=True, enable_queues=4, nb_cores=4,\n+                              server_mode=True, opt_queue=4, combined=True, rxq_txq=4)\n+        self.logger.info(\"Launch testpmd in VM1\")\n+        self.start_vm_testpmd(self.vm_dut[0], \"mergeable\", extern_param=\"--max-pkt-len=9600\", queues=\"4\")\n+        self.vm_dut[0].send_expect('set fwd mac', 'testpmd> ', 30)\n+        self.vm_dut[0].send_expect('start', 'testpmd> ', 30)\n+        self.logger.info(\"Launch testpmd in VM2, sent imix pkts from VM2\")\n+        self.start_vm_testpmd(self.vm_dut[1], \"mergeable\", extern_param=\"--max-pkt-len=9600\", queues=\"4\")\n+        self.vm_dut[1].send_expect('set txpkts 64,256,512,1024,2000,64,256,512,1024,2000', 'testpmd> ', 30)\n+        self.vm_dut[1].send_expect('start tx_first 1', 'testpmd> ', 30)\n+        self.logger.info(\"Check imix packets\")\n+        self.check_port_stats_result(self.vm_dut[0], queue_num=4)\n+        self.check_port_stats_result(self.vm_dut[1], queue_num=4)\n+        self.logger.info(\"Relaunch vhost side testpmd and Check imix packets 10 times\")\n+        for _ in range(10):\n+            self.pmd_vhost.execute_cmd('quit', '#')\n+            self.start_vhost_testpmd_cbdma(cbdma=True, no_pci=False, client_mode=True, enable_queues=4, nb_cores=4,\n+                                           rxq_txq=4)\n+            self.vm_dut[1].send_expect('stop', 'testpmd> ', 30)\n+            self.vm_dut[1].send_expect('start tx_first 32', 'testpmd> ', 30)\n+            self.check_port_stats_result(self.vm_dut[0], queue_num=4)\n+            self.check_port_stats_result(self.vm_dut[1], queue_num=4)\n+\n+    def test_vhost_vm2vm_split_ring_with_mergeable_path_and_server_mode_cbdma_enabled(self):\n+        \"\"\"\n+        Test Case 10: VM2VM virtio-pmd split ring mergeable path dynamic queue size CBDMA enable with server mode test\n+        \"\"\"\n+        self.nb_cores = 4\n+        self.get_core_list(self.nb_cores + 1)\n+        self.get_cbdma_ports_info_and_bind_to_dpdk(cbdma_num=16, queue_num=4, allow_diff_socket=True)\n+        self.logger.info(\"Launch vhost-testpmd with CBDMA and used 4 queue\")\n+        self.prepare_test_env(cbdma=True, no_pci=False, client_mode=True, enable_queues=4, nb_cores=4,\n+                              server_mode=True, opt_queue=4, combined=True, rxq_txq=4)\n+        self.logger.info(\"Launch testpmd in VM1\")\n+        self.start_vm_testpmd(self.vm_dut[0], \"mergeable\", extern_param=\"--max-pkt-len=9600\", queues=\"4\")\n+        self.vm_dut[0].send_expect('set fwd mac', 'testpmd> ', 30)\n+        self.vm_dut[0].send_expect('start', 'testpmd> ', 30)\n+        self.logger.info(\"Launch testpmd in VM2 and send imix pkts\")\n+        self.start_vm_testpmd(self.vm_dut[1], \"mergeable\", extern_param=\"--max-pkt-len=9600\", queues=\"4\")\n+        self.vm_dut[1].send_expect('set fwd mac', 'testpmd> ', 30)\n+        self.vm_dut[1].send_expect('set txpkts 64,256,512,1024,2000,64,256,512,1024,2000', 'testpmd> ', 30)\n+        self.vm_dut[1].send_expect('start tx_first 32', 'testpmd> ', 30)\n+        self.logger.info(\"Check imix packets\")\n+        self.check_port_stats_result(self.vm_dut[0], queue_num=4)\n+        self.check_port_stats_result(self.vm_dut[1], queue_num=4)\n+        self.logger.info(\"Relaunch vhost side testpmd and Check imix packets 10 times\")\n+        self.pmd_vhost.execute_cmd('quit', '#')\n+        self.start_vhost_testpmd_cbdma(cbdma=True, no_pci=False, client_mode=True, enable_queues=4, nb_cores=4,\n+                                       rxq_txq=4)\n+        self.vm_dut[1].send_expect('stop', 'testpmd> ', 30)\n+        self.vm_dut[1].send_expect('start tx_first 32', 'testpmd> ', 30)\n+        self.check_port_stats_result(self.vm_dut[0], queue_num=4)\n+        self.check_port_stats_result(self.vm_dut[1], queue_num=4)\n+\n+    def test_vhost_vm2vm_packed_ring_with_mergeable_path_and_8queues_cbdma_enabled(self):\n+        \"\"\"\n+        Test Case 11: VM2VM virtio-pmd packed ring mergeable path 8 queues CBDMA enable test\n+        \"\"\"\n+        self.nb_cores = 4\n+        self.get_core_list(self.nb_cores + 1)\n+        self.get_cbdma_ports_info_and_bind_to_dpdk(cbdma_num=16, queue_num=8, allow_diff_socket=True)\n+        self.prepare_test_env(cbdma=True, no_pci=False, client_mode=False, enable_queues=8, nb_cores=4,\n+                              server_mode=False, opt_queue=8, combined=True, rxq_txq=8, mode=2)\n+        self.logger.info(\"Launch testpmd in VM1\")\n+        self.start_vm_testpmd(self.vm_dut[0], \"mergeable\", extern_param=\"--max-pkt-len=9600\", queues=\"8\")\n+        self.logger.info(\"Launch testpmd in VM2 and send imix pkts\")\n+        self.start_vm_testpmd(self.vm_dut[1], \"mergeable\", extern_param=\"--max-pkt-len=9600\", queues=\"8\")\n+        self.vm_dut[0].send_expect('set fwd mac', 'testpmd> ', 30)\n+        self.vm_dut[0].send_expect('start', 'testpmd> ', 30)\n+        self.vm_dut[1].send_expect('set fwd mac', 'testpmd> ', 30)\n+        self.vm_dut[1].send_expect('set txpkts 64,256,512,1024,20000,64,256,512,1024,20000', 'testpmd> ', 30)\n+        self.vm_dut[1].send_expect('start tx_first 32', 'testpmd> ', 30)\n+        self.logger.info(\"Check imix packets\")\n+        self.check_port_stats_result(self.vm_dut[0])\n+        self.check_port_stats_result(self.vm_dut[1])\n+        self.logger.info(\"Quit VM2 and relaunch VM2 with split ring\")\n+        self.vm_dut[1].send_expect(\"quit\", \"#\", 20)\n+        self.vm[1].stop()\n+        time.sleep(5)\n+        try:\n+            self.vm_dut[1].send_expect(\"poweroff\", \"\", 20)\n+        except Exception as e:\n+            self.logger.info(e)\n+        time.sleep(10)\n+        self.start_one_vms(mode=1, server_mode=False, opt_queue=8, vm_config=self.vm_config)\n+        self.start_vm_testpmd(self.vm_dut[1], \"mergeable\", extern_param=\"--max-pkt-len=9600\", queues=\"8\")\n+        self.vm_dut[0].send_expect('start', 'testpmd> ', 30)\n+        self.vm_dut[1].send_expect('set fwd mac', 'testpmd> ', 30)\n+        self.vm_dut[1].send_expect('set txpkts 64,256,512,1024,20000,64,256,512,1024,20000', 'testpmd> ', 30)\n+        self.vm_dut[1].send_expect('start tx_first 32', 'testpmd> ', 30)\n+        self.check_port_stats_result(self.vm_dut[0], queue_num=8)\n+        self.check_port_stats_result(self.vm_dut[1], queue_num=8)\n+\n+    def start_one_vms(self, mode=0, mergeable=True, server_mode=False, opt_queue=None, vm_config='', vm_index=1):\n+        \"\"\"\n+        start two VM, each VM has one virtio device\n+        \"\"\"\n+        # for virtio 0.95, start vm with \"disable-modern=true\"\n+        # for virito 1.0, start vm with \"disable-modern=false\"\n+        if mode == 0:\n+            setting_args = \"disable-modern=true\"\n+        elif mode == 1:\n+            setting_args = \"disable-modern=false\"\n+        elif mode == 2:\n+            setting_args = \"disable-modern=false,packed=on\"\n+        if mergeable is True:\n+            setting_args += \",\" + \"mrg_rxbuf=on\"\n+        else:\n+            setting_args += \",\" + \"mrg_rxbuf=off\"\n+        vm_params = {}\n+        if opt_queue > 1:\n+            setting_args += \",csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on\"\n+            vm_params['opt_queue'] = opt_queue\n+            setting_args = setting_args + \",mq=on,vectors=40\"\n+        else:\n+            setting_args += \",csum=on,gso=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on\"\n+\n+        vm_dut = None\n+        vm_info = VM(self.dut, 'vm%d' % vm_index, vm_config)\n+        vm_params['driver'] = 'vhost-user'\n+        if not server_mode:\n+            vm_params['opt_path'] = self.base_dir + '/vhost-net%d' % vm_index\n+        else:\n+            vm_params['opt_path'] = self.base_dir + '/vhost-net%d' % vm_index + ',server'\n+        vm_params['opt_mac'] = \"52:54:00:00:00:0%d\" % (vm_index+1)\n+        vm_params['opt_settings'] = setting_args\n+        vm_info.set_vm_device(**vm_params)\n+        time.sleep(3)\n+        try:\n+            vm_dut = vm_info.start()\n+            if vm_dut is None:\n+                raise Exception(\"Set up VM ENV failed\")\n+        except Exception as e:\n+            print((utils.RED(\"Failure for %s\" % str(e))))\n+            raise e\n+        self.vm_dut[-1] = vm_dut\n+        self.vm[-1] = vm_info\n+\n+    def check_port_stats_result(self, vm_dut, queue_num=0):\n+        out = vm_dut.send_expect(\"show port stats all\", \"testpmd> \", 30)\n+        rx_packets = re.findall(r'RX-packets: (\\w+)', out)\n+        tx_packets = re.findall(r'TX-packets: (\\w+)', out)\n+        self.verify(int(rx_packets[0]) > 1,\n+                    \"RX packets no correctly\")\n+        self.verify(int(tx_packets[0]) > 1,\n+                    \"TX packets no correctly\")\n+        self.check_packets_of_each_queue(vm_dut, queue_num)\n+        # vm_dut.send_expect('stop', 'testpmd> ', 30)\n+\n+\n+    def check_packets_of_each_queue(self,vm_dut, queue_num):\n+        \"\"\"\n+        check each queue has receive packets\n+        \"\"\"\n+        out = vm_dut.send_expect(\"stop\", \"testpmd> \", 60)\n+        for queue_index in range(queue_num):\n+            queue = \"Queue= %d\" % queue_index\n+            index = out.find(queue)\n+            rx = re.search(\"RX-packets:\\s*(\\d*)\", out[index:])\n+            tx = re.search(\"TX-packets:\\s*(\\d*)\", out[index:])\n+            rx_packets = int(rx.group(1))\n+            tx_packets = int(tx.group(1))\n+            self.verify(rx_packets > 0 and tx_packets > 0,\n+                        \"The queue %d rx-packets or tx-packets is 0 about \" %\n+                        queue_index + \\\n+                        \"rx-packets:%d, tx-packets:%d\" %\n+                        (rx_packets, tx_packets))\n+        vm_dut.send_expect(\"clear port stats all\", \"testpmd> \", 30)\n+        vm_dut.send_expect(\"start\", \"testpmd> \", 30)\n+\n+    def prepare_test_env(self, cbdma=False, no_pci=True, client_mode=False, enable_queues=1, nb_cores=2,\n+                         server_mode=False, opt_queue=None, combined=False, rxq_txq=None, iova_mode=False, vm_config='vhost_sample', mode=1):\n+        \"\"\"\n+        start vhost testpmd and qemu, and config the vm env\n+        \"\"\"\n+        self.start_vhost_testpmd_cbdma(cbdma=cbdma, no_pci=no_pci, client_mode=client_mode, enable_queues=enable_queues,\n+                                 nb_cores=nb_cores, rxq_txq=rxq_txq, iova_mode=iova_mode)\n+        self.start_vms(server_mode=server_mode, opt_queue=opt_queue, mode=mode, vm_config=vm_config)\n+\n+    def start_vhost_testpmd_cbdma(self, cbdma=False, no_pci=True, client_mode=False, enable_queues=1, nb_cores=2, rxq_txq=None, iova_mode=False):\n+        \"\"\"\n+        launch the testpmd with different parameters\n+        \"\"\"\n+\n+        if cbdma is True:\n+            dmas_info_list = self.dmas_info.split(',')\n+            cbdma_arg_0_list = []\n+            cbdma_arg_1_list = []\n+            for item in dmas_info_list:\n+                if dmas_info_list.index(item) < int(len(dmas_info_list) / 2):\n+                    cbdma_arg_0_list.append(item)\n+                else:\n+                    cbdma_arg_1_list.append(item)\n+            cbdma_arg_0 = \",dmas=[{}],dmathr=512\".format(\";\".join(cbdma_arg_0_list))\n+            cbdma_arg_1 = \",dmas=[{}],dmathr=512\".format(\";\".join(cbdma_arg_1_list))\n+        else:\n+            cbdma_arg_0 = \"\"\n+            cbdma_arg_1 = \"\"\n+        testcmd = self.app_testpmd_path + \" \"\n+        if not client_mode:\n+            vdev1 = \"--vdev 'net_vhost0,iface=%s/vhost-net0,queues=%d%s' \" % (self.base_dir, enable_queues, cbdma_arg_0)\n+            vdev2 = \"--vdev 'net_vhost1,iface=%s/vhost-net1,queues=%d%s' \" % (self.base_dir, enable_queues, cbdma_arg_1)\n+        else:\n+            vdev1 = \"--vdev 'net_vhost0,iface=%s/vhost-net0,client=1,queues=%d%s' \" % (self.base_dir, enable_queues, cbdma_arg_0)\n+            vdev2 = \"--vdev 'net_vhost1,iface=%s/vhost-net1,client=1,queues=%d%s' \" % (self.base_dir, enable_queues, cbdma_arg_1)\n+        eal_params = self.dut.create_eal_parameters(cores=self.cores_list, prefix='vhost', no_pci=no_pci)\n+        if rxq_txq is None:\n+            params = \" -- -i --nb-cores=%d --txd=1024 --rxd=1024\" % nb_cores\n+        else:\n+            params = \" -- -i --nb-cores=%d --txd=1024 --rxd=1024 --rxq=%d --txq=%d\" % (nb_cores, rxq_txq, rxq_txq)\n+        if iova_mode:\n+            append_str = \"--iova-mode=va \"\n+        else:\n+            append_str = \"\"\n+        self.command_line = testcmd + append_str + eal_params + vdev1 + vdev2 + params\n+        self.pmd_vhost.execute_cmd(self.command_line, timeout=30)\n+        self.pmd_vhost.execute_cmd('vhost enable tx all', timeout=30)\n+        self.pmd_vhost.execute_cmd('start', timeout=30)\n+\n+    def get_cbdma_ports_info_and_bind_to_dpdk(self, cbdma_num=2, queue_num=4, allow_diff_socket=False):\n+        \"\"\"\n+        get all cbdma ports\n+        \"\"\"\n+        # check driver name in execution.cfg\n+        self.verify(self.drivername == 'igb_uio',\n+                    \"this case use igb_uio driver, need config drivername=igb_uio in execution.cfg\")\n+        str_info = 'Misc (rawdev) devices using kernel driver'\n+        out = self.dut.send_expect('./usertools/dpdk-devbind.py --status-dev misc', '# ', 30)\n+        device_info = out.split('\\n')\n+        for device in device_info:\n+            pci_info = re.search('\\s*(0000:\\S*:\\d*.\\d*)', device)\n+            if pci_info is not None:\n+                dev_info = pci_info.group(1)\n+                # the numa id of ioat dev, only add the device which on same socket with nic dev\n+                bus = int(dev_info[5:7], base=16)\n+                if bus >= 128:\n+                    cur_socket = 1\n+                else:\n+                    cur_socket = 0\n+                if allow_diff_socket:\n+                    self.cbdma_dev_infos.append(pci_info.group(1))\n+                else:\n+                    if self.ports_socket == cur_socket:\n+                        self.cbdma_dev_infos.append(pci_info.group(1))\n+        self.verify(len(self.cbdma_dev_infos) >= cbdma_num, 'There no enough cbdma device to run this suite')\n+        used_cbdma = self.cbdma_dev_infos[0:cbdma_num]\n+        dmas_info = ''\n+        for dmas in used_cbdma[0:int(cbdma_num/2)]:\n+            number = used_cbdma[0:int(cbdma_num/2)].index(dmas)\n+            if queue_num == 8:\n+                    dmas = 'txq{}@{},'.format(number%8, dmas)\n+            if queue_num == 4:\n+                if number < int(cbdma_num/4):\n+                    dmas = 'txq{}@{},'.format(number%4, dmas)\n+                else:\n+                    dmas = 'rxq{}@{},'.format(number%4, dmas)\n+            dmas_info += dmas\n+        for dmas in used_cbdma[int(cbdma_num/2):]:\n+            number = used_cbdma[int(cbdma_num/2):].index(dmas)\n+            if queue_num == 8:\n+                    dmas = 'txq{}@{},'.format(number%8, dmas)\n+            if queue_num == 4:\n+                if number < int(cbdma_num/4):\n+                    dmas = 'txq{}@{},'.format(number%4, dmas)\n+                else:\n+                    dmas = 'rxq{}@{},'.format(number%4, dmas)\n+\n+            dmas_info += dmas\n+        self.dmas_info = dmas_info[:-1]\n+        self.device_str = ' '.join(used_cbdma)\n+        self.dut.send_expect('./usertools/dpdk-devbind.py --force --bind=%s %s' % (self.drivername, self.device_str), '# ', 60)\n+\n+\n+\n+    def bind_cbdma_device_to_kernel(self):\n+        if self.device_str is not None:\n+            self.dut.send_expect('modprobe ioatdma', '# ')\n+            self.dut.send_expect('./usertools/dpdk-devbind.py -u %s' % self.device_str, '# ', 30)\n+            self.dut.send_expect('./usertools/dpdk-devbind.py --force --bind=ioatdma  %s' % self.device_str, '# ', 60)\n+\n     def tear_down(self):\n         #\n         # Run after each test case.\n         #\n         self.stop_all_apps()\n         self.dut.kill_all()\n-        self.dut.send_expect(\"killall -s INT qemu-system-x86_64\", \"#\")\n-        time.sleep(2)\n+        self.bind_cbdma_device_to_kernel()\n \n     def tear_down_all(self):\n         \"\"\"\n",
    "prefixes": [
        "V1"
    ]
}