get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 125524,
    "url": "http://patches.dpdk.org/api/patches/125524/?format=api",
    "web_url": "http://patches.dpdk.org/project/dts/patch/20230327075700.3205050-1-weix.ling@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": "<20230327075700.3205050-1-weix.ling@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20230327075700.3205050-1-weix.ling@intel.com",
    "date": "2023-03-27T07:57:00",
    "name": "[V1] tests/*_dsa: modify all dsa related testsuites by virtio_common optimize",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "07bd86300a4d9d7e75437d59c9b42919485963e3",
    "submitter": {
        "id": 1828,
        "url": "http://patches.dpdk.org/api/people/1828/?format=api",
        "name": "Ling, WeiX",
        "email": "weix.ling@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dts/patch/20230327075700.3205050-1-weix.ling@intel.com/mbox/",
    "series": [
        {
            "id": 27547,
            "url": "http://patches.dpdk.org/api/series/27547/?format=api",
            "web_url": "http://patches.dpdk.org/project/dts/list/?series=27547",
            "date": "2023-03-27T07:57:00",
            "name": "[V1] tests/*_dsa: modify all dsa related testsuites by virtio_common optimize",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/27547/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/125524/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/125524/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 C8A8E4284E;\n\tMon, 27 Mar 2023 09:59:57 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id BD31340ED8;\n\tMon, 27 Mar 2023 09:59:57 +0200 (CEST)",
            "from mga06.intel.com (mga06b.intel.com [134.134.136.31])\n by mails.dpdk.org (Postfix) with ESMTP id ADED140ED5\n for <dts@dpdk.org>; Mon, 27 Mar 2023 09:59:55 +0200 (CEST)",
            "from orsmga001.jf.intel.com ([10.7.209.18])\n by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 27 Mar 2023 00:59:54 -0700",
            "from unknown (HELO localhost.localdomain) ([10.239.252.222])\n by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 27 Mar 2023 00:59:51 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1679903995; x=1711439995;\n h=from:to:cc:subject:date:message-id:mime-version:\n content-transfer-encoding;\n bh=oAbXpTt7Ij/ck0KyORBcN5nZlt9enr5l1oZeRDD7E/I=;\n b=K3azEWbEKceuml2NOdB3oCSpq9lz5vkGmfN/tGiTPo+8EgALUhTHLNEn\n Xgv8eMM3UaJicCHCK/841Myln8fv6B9jPZhZkeudCMAze467qmrqaNwMG\n /dDIw9sUSmNMBc9TalJjoQDbO5eOwxOX91HSsbx8lZ3IB54hEiKNQ1+vW\n e5YvMQi2Pv+HpYqv5dLGA7uABCHbQJhkbblwZ0ohKqmbapSh3KWsUHLej\n xq4AljUVrNsM5t7/7jXDGuqwPAY4F2/HVwItpqDAp71Yq7CuQFUNRe1L3\n SaHC4k4y9DT+7lR+bHzTSYsj8RJIjOEHTgmbrmx5dd0kx9zueA4hAdBYY w==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6600,9927,10661\"; a=\"402800395\"",
            "E=Sophos;i=\"5.98,294,1673942400\"; d=\"scan'208\";a=\"402800395\"",
            "E=McAfee;i=\"6600,9927,10661\"; a=\"715987081\"",
            "E=Sophos;i=\"5.98,294,1673942400\"; d=\"scan'208\";a=\"715987081\""
        ],
        "X-ExtLoop1": "1",
        "From": "Wei Ling <weix.ling@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Wei Ling <weix.ling@intel.com>",
        "Subject": "[dts][PATCH V1] tests/*_dsa: modify all dsa related testsuites by\n virtio_common optimize",
        "Date": "Mon, 27 Mar 2023 15:57:00 +0800",
        "Message-Id": "<20230327075700.3205050-1-weix.ling@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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"
    },
    "content": "As tests/virtio_common.py optimize to adapt more scenes, such as\nwe can assign the DSA device index to test in testcase, so modify\nall dsa related testsuites.\n\nSigned-off-by: Wei Ling <weix.ling@intel.com>\n---\n ...TestSuite_loopback_vhost_async_perf_dsa.py |  144 +-\n ...te_loopback_virtio_user_server_mode_dsa.py | 1305 +++++++------\n ...vhost_async_multi_paths_performance_dsa.py |  144 +-\n ...ite_pvp_vhost_async_virtio_pmd_perf_dsa.py |  450 ++---\n tests/TestSuite_vhost_dsa.py                  |  796 ++++----\n tests/TestSuite_vm2vm_virtio_net_perf_dsa.py  | 1614 +++++++++--------\n tests/TestSuite_vm2vm_virtio_pmd_dsa.py       |  259 ++-\n tests/TestSuite_vm2vm_virtio_user_dsa.py      |  619 ++++---\n tests/virtio_common.py                        |  187 +-\n 9 files changed, 3026 insertions(+), 2492 deletions(-)",
    "diff": "diff --git a/tests/TestSuite_loopback_vhost_async_perf_dsa.py b/tests/TestSuite_loopback_vhost_async_perf_dsa.py\nindex 85883ea3..679971ae 100644\n--- a/tests/TestSuite_loopback_vhost_async_perf_dsa.py\n+++ b/tests/TestSuite_loopback_vhost_async_perf_dsa.py\n@@ -45,8 +45,6 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n         self.dut.send_expect(\"rm -rf %s/vhost-net*\" % self.base_dir, \"#\")\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n         # Prepare the result table\n         self.table_header = [\n             \"Frame Size\",\n@@ -249,8 +247,8 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 1: loopback vhost async test with split ring inorder mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -280,8 +278,8 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 2: loopback vhost async test with split ring inorder non-mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -311,8 +309,8 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 3: loopback vhost async test with split ring mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -342,8 +340,8 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 4: loopback vhost async test with split ring non-mergeable path path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -373,8 +371,8 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 5: loopback vhost async test with split ring vectorized path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -404,8 +402,8 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 6: loopback vhost async test with packed ring inorder mergeable path path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -435,8 +433,8 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 7: loopback vhost async test with packed ring inorder non-mergeable path path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -466,8 +464,8 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 8: loopback vhost async test with packed ring mergeable path path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -497,8 +495,8 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 9: loopback vhost async test with packed ring non-mergeable path path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -528,8 +526,8 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 10: loopback vhost async test with packed ring vectorized path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -559,20 +557,20 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 11: loopback vhost async test with split ring inorder mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         virtio_eal_param = \"--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,in_order=1,mrg_rxbuf=1\"\n@@ -599,20 +597,20 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 12: loopback vhost async test with split ring inorder non-mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         virtio_eal_param = \"--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,in_order=1,mrg_rxbuf=0\"\n@@ -639,20 +637,20 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 13: loopback vhost async test with split ring mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         virtio_eal_param = \"--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,in_order=0,mrg_rxbuf=1\"\n@@ -679,20 +677,20 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 14: loopback vhost async test with split ring non-mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         virtio_eal_param = \"--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,in_order=0,mrg_rxbuf=0\"\n@@ -719,20 +717,20 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 15: loopback vhost async test with split ring vectorized path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         virtio_eal_param = \"--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,in_order=0,mrg_rxbuf=0,vectorized=1\"\n@@ -759,20 +757,20 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 16: loopback vhost async test with packed ring inorder mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         virtio_eal_param = \"--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,packed_vq=1,in_order=1,mrg_rxbuf=1\"\n@@ -799,20 +797,20 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 17: loopback vhost async test with packed ring inorder non-mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         virtio_eal_param = \"--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,packed_vq=1,in_order=1,mrg_rxbuf=0\"\n@@ -839,20 +837,20 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 18: loopback vhost async test with packed ring mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         virtio_eal_param = \"--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,packed_vq=1,in_order=0,mrg_rxbuf=1\"\n@@ -879,20 +877,20 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 19: loopback vhost async test with packed ring non-mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         virtio_eal_param = \"--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,packed_vq=1,in_order=0,mrg_rxbuf=0\"\n@@ -919,20 +917,20 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         Test Case 20: loopback vhost async test with packed ring vectorized path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         virtio_eal_param = \"--vdev=net_virtio_user0,mac=00:01:02:03:04:05,path=./vhost-net,packed_vq=1,in_order=0,mrg_rxbuf=0,vectorized=1\"\n@@ -965,8 +963,6 @@ class TestLoopbackVhostAsyncPerfDsa(TestCase):\n         \"\"\"\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n         self.dut.send_expect(\"rm -rf %s/vhost-net*\" % self.base_dir, \"#\")\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     def tear_down_all(self):\n         \"\"\"\ndiff --git a/tests/TestSuite_loopback_virtio_user_server_mode_dsa.py b/tests/TestSuite_loopback_virtio_user_server_mode_dsa.py\nindex facd84e1..854cee2d 100644\n--- a/tests/TestSuite_loopback_virtio_user_server_mode_dsa.py\n+++ b/tests/TestSuite_loopback_virtio_user_server_mode_dsa.py\n@@ -50,9 +50,6 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"Cycle\",\n         ]\n         self.result_table_create(self.table_header)\n-        self.use_dsa_list = []\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     @property\n     def check_2M_env(self):\n@@ -190,25 +187,22 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         Test Case 1: Loopback split ring server mode large chain packets stress test with dsa dpdk driver\n         \"\"\"\n         if not self.check_2M_env:\n-            self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-                dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n-            )\n-            dmas = \"txq0@%s-q0;\" \"rxq0@%s-q0\" % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+            dsas = self.DC.bind_dsa_to_dpdk_driver(\n+                dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n             )\n+            dmas = \"txq0@%s-q0;rxq0@%s-q0\" % (dsas[0], dsas[0])\n             vhost_eal_param = (\n                 \"--vdev 'net_vhost0,iface=vhost-net0,queues=1,dmas=[%s],client=1'\"\n                 % dmas\n             )\n             vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024 --mbuf-size=65535\"\n-            port_options = {self.use_dsa_list[0]: \"max_queues=1\"}\n+            port_options = {dsas[0]: \"max_queues=1\"}\n             self.start_vhost_testpmd(\n                 cores=self.vhost_core_list,\n                 eal_param=vhost_eal_param,\n                 param=vhost_param,\n                 no_pci=False,\n-                ports=self.use_dsa_list,\n+                ports=dsas,\n                 port_options=port_options,\n                 iova_mode=\"va\",\n             )\n@@ -230,25 +224,22 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         Test Case 2: Loopback packed ring server mode large chain packets stress test with dsa dpdk driver\n         \"\"\"\n         if not self.check_2M_env:\n-            self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-                dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n-            )\n-            dmas = \"txq0@%s-q0;\" \"rxq0@%s-q0\" % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+            dsas = self.DC.bind_dsa_to_dpdk_driver(\n+                dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n             )\n+            dmas = \"txq0@%s-q0;rxq0@%s-q0\" % (dsas[0], dsas[0])\n             vhost_eal_param = (\n                 \"--vdev 'net_vhost0,iface=vhost-net0,queues=1,dmas=[%s],client=1'\"\n                 % dmas\n             )\n             vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024 --mbuf-size=65535\"\n-            port_options = {self.use_dsa_list[0]: \"max_queues=1\"}\n+            port_options = {dsas[0]: \"max_queues=1\"}\n             self.start_vhost_testpmd(\n                 cores=self.vhost_core_list,\n                 eal_param=vhost_eal_param,\n                 param=vhost_param,\n                 no_pci=False,\n-                ports=self.use_dsa_list,\n+                ports=dsas,\n                 port_options=port_options,\n                 iova_mode=\"va\",\n             )\n@@ -269,8 +260,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 3: Loopback split ring inorder mergeable path multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -286,31 +277,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -333,8 +324,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 4: Loopback split ring mergeable path multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -350,31 +341,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -397,8 +388,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 5: Loopback split ring non-mergeable path multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -414,31 +405,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -463,8 +454,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 6: Loopback split ring inorder non-mergeable path multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -480,31 +471,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -527,8 +518,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 7: Loopback split ring vectorized path multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -544,31 +535,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -591,8 +582,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 8: Loopback packed ring inorder mergeable path multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -608,31 +599,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -655,8 +646,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 9: Loopback packed ring mergeable path multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -672,31 +663,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -719,8 +710,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 10: Loopback packed ring non-mergeable path multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -736,31 +727,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -783,8 +774,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 11: Loopback packed ring inorder non-mergeable path multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -800,31 +791,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -847,8 +838,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 12: Loopback packed ring vectorized path multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -864,31 +855,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -911,8 +902,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 13: Loopback packed ring vectorized path and ring size is not power of 2 multi-queues payload check with server mode and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -928,31 +919,31 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -976,8 +967,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         Test Case 14: Loopback split ring server mode large chain packets stress test with dsa kernel driver\n         \"\"\"\n         if not self.check_2M_env:\n-            self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-            dmas = \"txq0@wq0.0;rxq0@wq0.0\"\n+            wqs = self.DC.create_wq(wq_num=1, dsa_idxs=[0])\n+            dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[0])\n             vhost_eal_param = (\n                 \"--vdev 'net_vhost0,iface=vhost-net0,queues=1,dmas=[%s],client=1'\"\n                 % dmas\n@@ -1008,8 +999,8 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         Test Case 15: Loopback packed ring server mode large chain packets stress test with dsa kernel driver\n         \"\"\"\n         if not self.check_2M_env:\n-            self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-            dmas = \"txq0@wq0.0;rxq0@wq0.0\"\n+            wqs = self.DC.create_wq(wq_num=1, dsa_idxs=[0])\n+            dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[0])\n             vhost_eal_param = (\n                 \"--vdev 'net_vhost0,iface=vhost-net0,queues=1,dmas=[%s],client=1'\"\n                 % dmas\n@@ -1039,21 +1030,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 16: Loopback split ring inorder mergeable path multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1080,18 +1084,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1115,21 +1133,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 17: Loopback split ring mergeable path multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1157,18 +1188,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1192,21 +1237,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 18: Loopback split ring non-mergeable path multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1236,18 +1294,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1271,21 +1343,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 19: Loopback split ring inorder non-mergeable path multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1313,18 +1398,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1348,21 +1447,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 20: Loopback split ring vectorized path multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1390,18 +1502,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1425,21 +1551,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 21: Loopback packed ring inorder mergeable path multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1467,18 +1606,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1502,21 +1655,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 22: Loopback packed ring mergeable path multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1544,18 +1710,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1579,21 +1759,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 23: Loopback packed ring non-mergeable path multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1621,18 +1814,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1656,21 +1863,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 24: Loopback packed ring inorder non-mergeable path multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1698,18 +1918,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1733,21 +1967,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 25: Loopback packed ring vectorized path multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1775,18 +2022,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1810,21 +2071,34 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 26: Loopback packed ring vectorized path and ring size is not power of 2 multi-queues payload check with server mode and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1852,18 +2126,32 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1887,45 +2175,52 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         Test Case 27: PV split and packed ring server mode test txonly mode with dsa dpdk and kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2,\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2,\n             driver_name=\"vfio-pci\",\n-            dsa_index_list=[2, 3],\n+            dsa_idxs=[2, 3],\n             socket=self.ports_socket,\n         )\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n             \"txq4@%s-q0;\"\n             \"txq5@%s-q0;\"\n             \"rxq2@%s-q1;\"\n             \"rxq3@%s-q1;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                wqs[8],\n+                wqs[8],\n+                wqs[8],\n+                wqs[8],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --rxq=8 --txq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -1967,8 +2262,6 @@ class TestLoopbackVirtioUserServerModeDsa(TestCase):\n         \"\"\"\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n         self.dut.kill_all()\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     def tear_down_all(self):\n         \"\"\"\ndiff --git a/tests/TestSuite_pvp_vhost_async_multi_paths_performance_dsa.py b/tests/TestSuite_pvp_vhost_async_multi_paths_performance_dsa.py\nindex 7b5077cb..13ab3d85 100644\n--- a/tests/TestSuite_pvp_vhost_async_multi_paths_performance_dsa.py\n+++ b/tests/TestSuite_pvp_vhost_async_multi_paths_performance_dsa.py\n@@ -51,8 +51,6 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n         self.dut.send_expect(\"rm -rf %s/vhost-net*\" % self.base_dir, \"#\")\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n         # Prepare the result table\n         self.table_header = [\"Frame\"]\n         self.table_header.append(\"Mode/RXD-TXD\")\n@@ -273,8 +271,8 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 1: pvp vhost async test with split ring inorder mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -301,8 +299,8 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 2: pvp vhost async test with split ring inorder non-mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -329,8 +327,8 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 3: pvp vhost async test with split ring mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -357,8 +355,8 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 4: pvp vhost async test with split ring non-mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -385,8 +383,8 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 5: pvp vhost async test with split ring vectorized path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -413,8 +411,8 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 6: pvp vhost async test with packed ring inorder mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -441,8 +439,8 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 7: pvp vhost async test with packed ring inorder non-mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -469,8 +467,8 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 8: pvp vhost async test with packed ring mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -497,8 +495,8 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 9: pvp vhost async test with packed ring non-mergeable path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -525,8 +523,8 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 10: pvp vhost async test with packed ring vectorized path using IDXD kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n@@ -553,17 +551,17 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 11: pvp vhost async test with split ring inorder mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n@@ -588,17 +586,17 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 12: pvp vhost async test with split ring inorder non-mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n@@ -623,17 +621,17 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 13: pvp vhost async test with split ring mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n@@ -658,17 +656,17 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 14: pvp vhost async test with split ring non-mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n@@ -693,17 +691,17 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 15: pvp vhost async test with split ring vectorized_rx path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n@@ -728,17 +726,17 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 16: pvp vhost async test with packed ring inorder mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n@@ -763,17 +761,17 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 17: pvp vhost async test with packed ring inorder non-mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n@@ -798,17 +796,17 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 18: pvp vhost async test with packed ring mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n@@ -833,17 +831,17 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 19: pvp vhost async test with packed ring non-mergeable path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n@@ -868,17 +866,17 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         Test Case 20: pvp vhost async test with split ring vectorized path using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;\" \"rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net,queues=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=1 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_user_testpmd(\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n@@ -909,8 +907,6 @@ class TestPVPVhostAsyncMultiPathsPerformanceDsa(TestCase):\n         \"\"\"\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n         self.dut.send_expect(\"rm -rf %s/vhost-net*\" % self.base_dir, \"#\")\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     def tear_down_all(self):\n         \"\"\"\ndiff --git a/tests/TestSuite_pvp_vhost_async_virtio_pmd_perf_dsa.py b/tests/TestSuite_pvp_vhost_async_virtio_pmd_perf_dsa.py\nindex 9a0b04ce..2d2471ef 100644\n--- a/tests/TestSuite_pvp_vhost_async_virtio_pmd_perf_dsa.py\n+++ b/tests/TestSuite_pvp_vhost_async_virtio_pmd_perf_dsa.py\n@@ -22,6 +22,7 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Run at the start of each test suite.\n         \"\"\"\n+        self.frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518, 2048, 4096]\n         self.vhost_user = self.dut.new_session(suite=\"vhost-user\")\n         self.vhost_user_pmd = PmdOutput(self.dut, self.vhost_user)\n         self.dut_ports = self.dut.get_ports()\n@@ -51,8 +52,6 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n         self.dut.send_expect(\"killall -s INT qemu-system-x86_64\", \"#\")\n         self.dut.send_expect(\"rm -rf %s/vhost-net*\" % self.base_dir, \"#\")\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n         # Prepare the result table\n         self.table_header = [\"Frame\"]\n         self.table_header.append(\"Mode/RXD-TXD\")\n@@ -104,7 +103,7 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"mq=on,vectors=%s,\" % (2 + self.queues * 2) if self.queues > 1 else \"\"\n         )\n         vm_params[\"opt_settings\"] = (\n-            \"disable-modern=false,mrg_rxbuf=on,%srx_queue_size=1024,tx_queue_size=1024,csum=off,guest_csum=off,gso= off,host_tso4=off,guest_tso4=off,guest_ecn=off%s\"\n+            \"disable-modern=false,mrg_rxbuf=on,%srx_queue_size=1024,tx_queue_size=1024,csum=off,guest_csum=off,gso=off,host_tso4=off,guest_tso4=off,guest_ecn=off%s\"\n             % (mq_param, packed_param)\n         )\n         self.vm.set_vm_device(**vm_params)\n@@ -134,11 +133,7 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Send packet with packet generator and verify\n         \"\"\"\n-        if \"4c_4q\" or \"4c_8q\" not in self.running_case:\n-            frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518]\n-        else:\n-            frame_sizes = [64, 128, 256, 512, 1024, 1280, 1518, 2048, 4096]\n-        for frame_size in frame_sizes:\n+        for frame_size in self.frame_sizes:\n             payload_size = frame_size - self.headers_size\n             tgen_input = []\n             self.throughput[frame_size] = dict()\n@@ -308,10 +303,7 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"--socket-mem 8192 --vdev 'net_vhost0,iface=vhost-net,queues=%d,dmas=[%s]'\"\n             % (self.queues, self.dmas)\n         )\n-        if \"4c_4q\" or \"4c_8q\" not in self.running_case:\n-            max_len_param = \"\"\n-        else:\n-            max_len_param = \"--max-pkt-len=5200 --tx-offloads=0x00008000\"\n+        max_len_param = \"--max-pkt-len=5200 --tx-offloads=0x00008000\"\n         vhost_param = (\n             \"--nb-cores=%d --txq=%d --rxq=%d --txd=2048 --rxd=2048 %s --forward-mode=mac -a\"\n             % (self.nb_cores, self.queues, self.queues, max_len_param)\n@@ -348,9 +340,9 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 1: pvp split ring vhost async test with 1core 1queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n         self.queues = 1\n-        self.dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        self.dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         self.nb_cores = 1\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n         self.perf_test(\n@@ -361,9 +353,9 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 2: pvp split ring vhost async test with 1core 2queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=4, dsa_idxs=[0])\n         self.queues = 2\n-        self.dmas = \"txq0@wq0.0;rxq0@wq0.1;txq1@wq0.2;rxq1@wq0.3\"\n+        self.dmas = \"txq0@%s;rxq0@%s;txq1@%s;rxq1@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3])\n         self.nb_cores = 1\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n         self.perf_test(\n@@ -374,9 +366,9 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 3: pvp split ring vhost async test with 2core 2queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=4, dsa_idxs=[0])\n         self.queues = 2\n-        self.dmas = \"txq0@wq0.0;rxq0@wq0.1;txq1@wq0.2;rxq1@wq0.3\"\n+        self.dmas = \"txq0@%s;rxq0@%s;txq1@%s;rxq1@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3])\n         self.nb_cores = 2\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n         self.perf_test(\n@@ -387,17 +379,17 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 4: pvp split ring vhost async test with 2core 4queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0])\n         self.queues = 4\n         self.dmas = (\n-            \"txq0@wq0.0;\"\n-            \"rxq0@wq0.1;\"\n-            \"txq1@wq0.2;\"\n-            \"rxq1@wq0.3;\"\n-            \"txq2@wq0.4;\"\n-            \"rxq2@wq0.5;\"\n-            \"txq3@wq0.6;\"\n-            \"rxq3@wq0.7\"\n+            \"txq0@%s;\"\n+            \"rxq0@%s;\"\n+            \"txq1@%s;\"\n+            \"rxq1@%s;\"\n+            \"txq2@%s;\"\n+            \"rxq2@%s;\"\n+            \"txq3@%s;\"\n+            \"rxq3@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3], wqs[4], wqs[5], wqs[6], wqs[7])\n         )\n         self.nb_cores = 2\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n@@ -409,17 +401,17 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 5: pvp split ring vhost async test with 4core 4queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0])\n         self.queues = 4\n         self.dmas = (\n-            \"txq0@wq0.0;\"\n-            \"rxq0@wq0.1;\"\n-            \"txq1@wq0.2;\"\n-            \"rxq1@wq0.3;\"\n-            \"txq2@wq0.4;\"\n-            \"rxq2@wq0.5;\"\n-            \"txq3@wq0.6;\"\n-            \"rxq3@wq0.7\"\n+            \"txq0@%s;\"\n+            \"rxq0@%s;\"\n+            \"txq1@%s;\"\n+            \"rxq1@%s;\"\n+            \"txq2@%s;\"\n+            \"rxq2@%s;\"\n+            \"txq3@%s;\"\n+            \"rxq3@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3], wqs[4], wqs[5], wqs[6], wqs[7])\n         )\n         self.nb_cores = 4\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n@@ -431,25 +423,43 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 6: pvp split ring vhost async test with 4core 8queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0])\n         self.queues = 8\n         self.dmas = (\n-            \"txq0@wq0.0;\"\n-            \"rxq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"rxq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"rxq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"rxq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"rxq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq5@wq0.5;\"\n-            \"txq6@wq0.6;\"\n-            \"rxq6@wq0.6;\"\n-            \"txq7@wq0.7;\"\n-            \"rxq7@wq0.7\"\n+            \"txq0@%s;\"\n+            \"rxq0@%s;\"\n+            \"txq1@%s;\"\n+            \"rxq1@%s;\"\n+            \"txq2@%s;\"\n+            \"rxq2@%s;\"\n+            \"txq3@%s;\"\n+            \"rxq3@%s;\"\n+            \"txq4@%s;\"\n+            \"rxq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq5@%s;\"\n+            \"txq6@%s;\"\n+            \"rxq6@%s;\"\n+            \"txq7@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[2],\n+                wqs[2],\n+                wqs[3],\n+                wqs[3],\n+                wqs[4],\n+                wqs[4],\n+                wqs[5],\n+                wqs[5],\n+                wqs[6],\n+                wqs[6],\n+                wqs[7],\n+                wqs[7],\n+            )\n         )\n         self.nb_cores = 4\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n@@ -461,9 +471,9 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 7: pvp packed ring vhost async test with 1core 1queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n         self.queues = 1\n-        self.dmas = \"txq0@wq0.0;rxq0@wq0.1\"\n+        self.dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[1])\n         self.nb_cores = 1\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n         self.perf_test(\n@@ -474,9 +484,9 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 8: pvp packed ring vhost async test with 1core 2queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=4, dsa_idxs=[0])\n         self.queues = 2\n-        self.dmas = \"txq0@wq0.0;rxq0@wq0.1;txq1@wq0.2;rxq1@wq0.3\"\n+        self.dmas = \"txq0@%s;rxq0@%s;txq1@%s;rxq1@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3])\n         self.nb_cores = 1\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n         self.perf_test(\n@@ -487,9 +497,9 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 9: pvp packed ring vhost async test with 2core 2queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=4, dsa_idxs=[0])\n         self.queues = 2\n-        self.dmas = \"txq0@wq0.0;rxq0@wq0.1;txq1@wq0.2;rxq1@wq0.3\"\n+        self.dmas = \"txq0@%s;rxq0@%s;txq1@%s;rxq1@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3])\n         self.nb_cores = 2\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n         self.perf_test(\n@@ -500,17 +510,17 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 10: pvp packed ring vhost async test with 2core 4queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0])\n         self.queues = 4\n         self.dmas = (\n-            \"txq0@wq0.0;\"\n-            \"rxq0@wq0.1;\"\n-            \"txq1@wq0.2;\"\n-            \"rxq1@wq0.3;\"\n-            \"txq2@wq0.4;\"\n-            \"rxq2@wq0.5;\"\n-            \"txq3@wq0.6;\"\n-            \"rxq3@wq0.7\"\n+            \"txq0@%s;\"\n+            \"rxq0@%s;\"\n+            \"txq1@%s;\"\n+            \"rxq1@%s;\"\n+            \"txq2@%s;\"\n+            \"rxq2@%s;\"\n+            \"txq3@%s;\"\n+            \"rxq3@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3], wqs[4], wqs[5], wqs[6], wqs[7])\n         )\n         self.nb_cores = 2\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n@@ -522,17 +532,17 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 11: pvp packed ring vhost async test with 4core 4queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0])\n         self.queues = 4\n         self.dmas = (\n-            \"txq0@wq0.0;\"\n-            \"rxq0@wq0.1;\"\n-            \"txq1@wq0.2;\"\n-            \"rxq1@wq0.3;\"\n-            \"txq2@wq0.4;\"\n-            \"rxq2@wq0.5;\"\n-            \"txq3@wq0.6;\"\n-            \"rxq3@wq0.7\"\n+            \"txq0@%s;\"\n+            \"rxq0@%s;\"\n+            \"txq1@%s;\"\n+            \"rxq1@%s;\"\n+            \"txq2@%s;\"\n+            \"rxq2@%s;\"\n+            \"txq3@%s;\"\n+            \"rxq3@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3], wqs[4], wqs[5], wqs[6], wqs[7])\n         )\n         self.nb_cores = 4\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n@@ -544,25 +554,43 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 12: pvp packed ring vhost async test with 4core 8queue using idxd kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0])\n         self.queues = 8\n         self.dmas = (\n-            \"txq0@wq0.0;\"\n-            \"rxq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"rxq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"rxq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"rxq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"rxq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq5@wq0.5;\"\n-            \"txq6@wq0.6;\"\n-            \"rxq6@wq0.6;\"\n-            \"txq7@wq0.7;\"\n-            \"rxq7@wq0.7\"\n+            \"txq0@%s;\"\n+            \"rxq0@%s;\"\n+            \"txq1@%s;\"\n+            \"rxq1@%s;\"\n+            \"txq2@%s;\"\n+            \"rxq2@%s;\"\n+            \"txq3@%s;\"\n+            \"rxq3@%s;\"\n+            \"txq4@%s;\"\n+            \"rxq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq5@%s;\"\n+            \"txq6@%s;\"\n+            \"rxq6@%s;\"\n+            \"txq7@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[2],\n+                wqs[2],\n+                wqs[3],\n+                wqs[3],\n+                wqs[4],\n+                wqs[4],\n+                wqs[5],\n+                wqs[5],\n+                wqs[6],\n+                wqs[6],\n+                wqs[7],\n+                wqs[7],\n+            )\n         )\n         self.nb_cores = 4\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n@@ -574,18 +602,18 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 13: pvp split ring vhost async test with 1core 1queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 1\n         self.dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         self.nb_cores = 1\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -597,8 +625,8 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 14: pvp split ring vhost async test with 1core 2queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 2\n         self.dmas = (\n@@ -607,16 +635,16 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"txq1@%s-q2;\"\n             \"rxq1@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         self.nb_cores = 1\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -628,8 +656,8 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 15: pvp split ring vhost async test with 2core 2queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 2\n         self.dmas = (\n@@ -638,16 +666,16 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"txq1@%s-q2;\"\n             \"rxq1@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         self.nb_cores = 2\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -659,8 +687,8 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 16: pvp split ring vhost async test with 2core 4queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 4\n         self.dmas = (\n@@ -673,20 +701,20 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"txq3@%s-q6;\"\n             \"rxq3@%s-q7\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         self.nb_cores = 2\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -698,8 +726,8 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 17: pvp split ring vhost async test with 4core 4queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 4\n         self.dmas = (\n@@ -712,20 +740,20 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"txq3@%s-q6;\"\n             \"rxq3@%s-q7\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         self.nb_cores = 4\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -737,8 +765,8 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 18: pvp split ring vhost async test with 4core 8queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 8\n         self.dmas = (\n@@ -751,20 +779,20 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"txq3@%s-q6;\"\n             \"rxq3@%s-q7\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         self.nb_cores = 4\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -776,18 +804,18 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 19: pvp packed ring vhost async test with 1core 1queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 1\n         self.dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         self.nb_cores = 1\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -799,8 +827,8 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 20: pvp packed ring vhost async test with 1core 2queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 2\n         self.dmas = (\n@@ -809,16 +837,16 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"txq1@%s-q2;\"\n             \"rxq1@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         self.nb_cores = 1\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -830,8 +858,8 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 21: pvp packed ring vhost async test with 2core 2queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 2\n         self.dmas = (\n@@ -840,16 +868,16 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"txq1@%s-q2;\"\n             \"rxq1@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         self.nb_cores = 2\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -861,8 +889,8 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 22: pvp packed ring vhost async test with 2core 4queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 4\n         self.dmas = (\n@@ -875,20 +903,20 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"txq3@%s-q6;\"\n             \"rxq3@%s-q7\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         self.nb_cores = 2\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -900,8 +928,8 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 23: pvp packed ring vhost async test with 4core 4queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 4\n         self.dmas = (\n@@ -914,20 +942,20 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"txq3@%s-q6;\"\n             \"rxq3@%s-q7\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         self.nb_cores = 4\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -939,8 +967,8 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         \"\"\"\n         Test Case 24: pvp packed ring vhost async test with 4core 8queue using vfio-pci driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         self.queues = 8\n         self.dmas = (\n@@ -953,20 +981,20 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n             \"txq3@%s-q6;\"\n             \"rxq3@%s-q7\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         self.nb_cores = 4\n         ports = [self.dut.ports_info[self.dut_ports[0]][\"pci\"]]\n-        ports.append(self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        ports.append(dsas[0])\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         self.perf_test(\n             case_info=self.running_case,\n             ports=ports,\n@@ -985,8 +1013,6 @@ class TestPVPVhostAsyncVirtioPmdPerfDsa(TestCase):\n         Run after each test case.\n         \"\"\"\n         self.stop_vm_and_quit_testpmd()\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     def tear_down_all(self):\n         \"\"\"\ndiff --git a/tests/TestSuite_vhost_dsa.py b/tests/TestSuite_vhost_dsa.py\nindex 1477eb6c..ef3fdf46 100644\n--- a/tests/TestSuite_vhost_dsa.py\n+++ b/tests/TestSuite_vhost_dsa.py\n@@ -76,8 +76,6 @@ class TestVhostDsa(TestCase):\n         self.dut.send_expect(\"killall -I %s\" % self.testpmd_name, \"#\", 20)\n         self.dut.send_expect(\"rm -rf %s/vhost-net*\" % self.base_dir, \"#\")\n         self.mode_list = []\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     def get_vhost_port_num(self):\n         out = self.vhost_user.send_expect(\"show port summary all\", \"testpmd> \", 60)\n@@ -166,8 +164,8 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 1: PVP split ring vhost async operation test with each tx/rx queue using one DSA dpdk driver channel\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -175,10 +173,10 @@ class TestVhostDsa(TestCase):\n             \"rxq0@%s-q2;\"\n             \"rxq1@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n@@ -187,9 +185,9 @@ class TestVhostDsa(TestCase):\n         vhost_param = \"--nb-cores=1 --txq=2 --rxq=2 --txd=1024 --rxd=1024\"\n \n         ports = [self.dut.ports_info[0][\"pci\"]]\n-        for i in self.use_dsa_list:\n+        for i in dsas:\n             ports.append(i)\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             param=vhost_param,\n@@ -233,10 +231,10 @@ class TestVhostDsa(TestCase):\n                 \"rxq0@%s-q0;\"\n                 \"rxq1@%s-q1\"\n                 % (\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[1],\n-                    self.use_dsa_list[1],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[1],\n+                    dsas[1],\n                 )\n             )\n             vhost_param = \"--nb-cores=2 --txq=2 --rxq=2 --txd=1024 --rxd=1024\"\n@@ -244,8 +242,8 @@ class TestVhostDsa(TestCase):\n                 \"--vdev 'net_vhost0,iface=vhost-net0,queues=2,dmas=[%s]'\" % dmas\n             )\n             port_options = {\n-                self.use_dsa_list[0]: \"max_queues=2\",\n-                self.use_dsa_list[1]: \"max_queues=2\",\n+                dsas[0]: \"max_queues=2\",\n+                dsas[1]: \"max_queues=2\",\n             }\n             self.start_vhost_testpmd(\n                 cores=self.vhost_core_list,\n@@ -293,8 +291,8 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 2: PVP split ring vhost async operations test with one DSA dpdk driver channel being shared among multiple tx/rx queues\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -314,22 +312,22 @@ class TestVhostDsa(TestCase):\n             \"rxq6@%s-q1;\"\n             \"rxq7@%s-q1\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n@@ -337,9 +335,9 @@ class TestVhostDsa(TestCase):\n         )\n         vhost_param = \"--nb-cores=4 --txq=8 --rxq=8 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[0][\"pci\"]]\n-        for i in self.use_dsa_list:\n+        for i in dsas:\n             ports.append(i)\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             param=vhost_param,\n@@ -395,29 +393,29 @@ class TestVhostDsa(TestCase):\n                 \"rxq6@%s-q6;\"\n                 \"rxq7@%s-q7\"\n                 % (\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n                 )\n             )\n             vhost_eal_param = (\n                 \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,dmas=[%s]'\" % dmas\n             )\n             vhost_param = \"--nb-cores=6 --txq=8 --rxq=8 --txd=1024 --rxd=1024\"\n-            port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+            port_options = {dsas[0]: \"max_queues=8\"}\n             self.start_vhost_testpmd(\n                 cores=self.vhost_core_list,\n                 param=vhost_param,\n@@ -470,29 +468,29 @@ class TestVhostDsa(TestCase):\n                 \"rxq6@%s-q0;\"\n                 \"rxq7@%s-q0\"\n                 % (\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n                 )\n             )\n             vhost_eal_param = (\n                 \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,dmas=[%s]'\" % dmas\n             )\n             vhost_param = \"--nb-cores=6 --txq=8 --rxq=8 --txd=1024 --rxd=1024\"\n-            port_options = {self.use_dsa_list[0]: \"max_queues=1\"}\n+            port_options = {dsas[0]: \"max_queues=1\"}\n             self.start_vhost_testpmd(\n                 cores=self.vhost_core_list,\n                 param=vhost_param,\n@@ -539,8 +537,8 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 3: PVP split ring dynamic queues vhost async operation with dsa dpdk driver channels\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -548,10 +546,10 @@ class TestVhostDsa(TestCase):\n             \"txq2@%s-q2;\"\n             \"txq3@%s-q2\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n@@ -559,9 +557,9 @@ class TestVhostDsa(TestCase):\n         )\n         vhost_param = \"--nb-cores=4 --txq=4 --rxq=4 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[0][\"pci\"]]\n-        for i in self.use_dsa_list:\n+        for i in dsas:\n             ports.append(i)\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             param=vhost_param,\n@@ -610,17 +608,17 @@ class TestVhostDsa(TestCase):\n             \"rxq2@%s-q1;\"\n             \"rxq3@%s-q0\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --txq=4 --rxq=4 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             param=vhost_param,\n@@ -649,18 +647,18 @@ class TestVhostDsa(TestCase):\n             \"rxq6@%s-q2;\"\n             \"rxq7@%s-q2\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n             )\n         )\n         vhost_eal_param = (\n@@ -668,8 +666,8 @@ class TestVhostDsa(TestCase):\n         )\n         vhost_param = \"--nb-cores=4 --txq=8 --rxq=8 --txd=1024 --rxd=1024\"\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=4\",\n-            self.use_dsa_list[1]: \"max_queues=4\",\n+            dsas[0]: \"max_queues=4\",\n+            dsas[1]: \"max_queues=4\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -711,19 +709,19 @@ class TestVhostDsa(TestCase):\n             \"rxq2@%s-q1;\"\n             \"rxq3@%s-q1\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=5 --txq=8 --rxq=8 --txd=1024 --rxd=1024\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             param=vhost_param,\n@@ -751,8 +749,8 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 4: PVP packed ring vhost async operation test with each tx/rx queue using one DSA dpdk driver channel\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -760,10 +758,10 @@ class TestVhostDsa(TestCase):\n             \"rxq0@%s-q2;\"\n             \"rxq1@%s-q2\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n@@ -771,9 +769,9 @@ class TestVhostDsa(TestCase):\n         )\n         vhost_param = \"--nb-cores=1 --txq=2 --rxq=2 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[0][\"pci\"]]\n-        for i in self.use_dsa_list:\n+        for i in dsas:\n             ports.append(i)\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             param=vhost_param,\n@@ -818,10 +816,10 @@ class TestVhostDsa(TestCase):\n                 \"rxq0@%s-q0;\"\n                 \"rxq1@%s-q1\"\n                 % (\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[1],\n-                    self.use_dsa_list[1],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[1],\n+                    dsas[1],\n                 )\n             )\n             vhost_eal_param = (\n@@ -875,8 +873,8 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 5: PVP packed ring vhost async operation test with one DSA dpdk driver channel being shared among multiple tx/rx queues\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -896,22 +894,22 @@ class TestVhostDsa(TestCase):\n             \"rxq6@%s-q1;\"\n             \"rxq7@%s-q1\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n@@ -919,9 +917,9 @@ class TestVhostDsa(TestCase):\n         )\n         vhost_param = \"--nb-cores=4 --txq=8 --rxq=8 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[0][\"pci\"]]\n-        for i in self.use_dsa_list:\n+        for i in dsas:\n             ports.append(i)\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             param=vhost_param,\n@@ -978,22 +976,22 @@ class TestVhostDsa(TestCase):\n                 \"rxq6@%s-q0;\"\n                 \"rxq7@%s-q0\"\n                 % (\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n-                    self.use_dsa_list[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n+                    dsas[0],\n                 )\n             )\n             vhost_eal_param = (\n@@ -1047,17 +1045,17 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 6: PVP packed ring dynamic queues vhost async operation with dsa dpdk driver channels\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n             \"txq1@%s-q0;\"\n             \"txq2@%s-q1\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n@@ -1065,11 +1063,11 @@ class TestVhostDsa(TestCase):\n         )\n         vhost_param = \"--nb-cores=4 --txq=4 --rxq=4 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[0][\"pci\"]]\n-        for i in self.use_dsa_list:\n+        for i in dsas:\n             ports.append(i)\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=4\",\n-            self.use_dsa_list[1]: \"max_queues=4\",\n+            dsas[0]: \"max_queues=4\",\n+            dsas[1]: \"max_queues=4\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -1118,9 +1116,9 @@ class TestVhostDsa(TestCase):\n             \"rxq1@%s-q1;\"\n             \"rxq2@%s-q1\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         vhost_eal_param = (\n@@ -1155,18 +1153,18 @@ class TestVhostDsa(TestCase):\n             \"rxq6@%s-q2;\"\n             \"rxq7@%s-q2\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n             )\n         )\n         vhost_eal_param = (\n@@ -1244,8 +1242,8 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 7: PVP split ring vhost async operation test with each tx/rx queue using one DSA kernel driver channel\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=0)\n-        dmas = \"txq0@wq0.0;\" \"txq1@wq0.1;\" \"rxq0@wq0.2;\" \"rxq1@wq0.3\"\n+        wqs = self.DC.create_wq(wq_num=4, dsa_idxs=[0])\n+        dmas = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=2,dmas=[%s]'\" % dmas\n         )\n@@ -1300,24 +1298,42 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 8: PVP split ring all path multi-queues vhost async operation test with one DSA kernel driver channel being shared among multiple tx/rx queues\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=4, dsa_idxs=[0])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"txq6@wq0.1;\"\n-            \"txq7@wq0.1;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.0;\"\n-            \"rxq2@wq0.0;\"\n-            \"rxq3@wq0.0;\"\n-            \"rxq4@wq0.1;\"\n-            \"rxq5@wq0.1;\"\n-            \"rxq6@wq0.1;\"\n-            \"rxq7@wq0.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"txq6@%s;\"\n+            \"txq7@%s;\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,dmas=[%s]'\" % dmas\n@@ -1362,22 +1378,40 @@ class TestVhostDsa(TestCase):\n         if not self.check_2M_env:\n             self.vhost_user_pmd.quit()\n             dmas = (\n-                \"txq0@wq0.0;\"\n-                \"txq1@wq0.0;\"\n-                \"txq2@wq0.1;\"\n-                \"txq3@wq0.1;\"\n-                \"txq4@wq0.2;\"\n-                \"txq5@wq0.2;\"\n-                \"txq6@wq0.3;\"\n-                \"txq7@wq0.3;\"\n-                \"rxq0@wq0.0;\"\n-                \"rxq1@wq0.0;\"\n-                \"rxq2@wq0.1;\"\n-                \"rxq3@wq0.1;\"\n-                \"rxq4@wq0.2;\"\n-                \"rxq5@wq0.2;\"\n-                \"rxq6@wq0.3;\"\n-                \"rxq7@wq0.3\"\n+                \"txq0@%s;\"\n+                \"txq1@%s;\"\n+                \"txq2@%s;\"\n+                \"txq3@%s;\"\n+                \"txq4@%s;\"\n+                \"txq5@%s;\"\n+                \"txq6@%s;\"\n+                \"txq7@%s;\"\n+                \"rxq0@%s;\"\n+                \"rxq1@%s;\"\n+                \"rxq2@%s;\"\n+                \"rxq3@%s;\"\n+                \"rxq4@%s;\"\n+                \"rxq5@%s;\"\n+                \"rxq6@%s;\"\n+                \"rxq7@%s\"\n+                % (\n+                    wqs[0],\n+                    wqs[0],\n+                    wqs[1],\n+                    wqs[1],\n+                    wqs[2],\n+                    wqs[2],\n+                    wqs[3],\n+                    wqs[3],\n+                    wqs[0],\n+                    wqs[0],\n+                    wqs[1],\n+                    wqs[1],\n+                    wqs[2],\n+                    wqs[2],\n+                    wqs[3],\n+                    wqs[3],\n+                )\n             )\n             vhost_eal_param = (\n                 \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,dmas=[%s]'\" % dmas\n@@ -1406,9 +1440,8 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 9: PVP split ring dynamic queues vhost async operation with dsa kernel driver channels\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n-        dmas = \"txq0@wq0.0;\" \"txq1@wq0.1;\" \"txq2@wq0.2;\" \"txq3@wq0.2\"\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n+        dmas = \"txq0@%s;txq1@%s;txq2@%s;txq3@%s\" % (wqs[0], wqs[1], wqs[2], wqs[2])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n@@ -1456,7 +1489,7 @@ class TestVhostDsa(TestCase):\n         self.check_each_queue_of_port_packets(queues=1)\n \n         self.vhost_user_pmd.quit()\n-        dmas = \"rxq0@wq0.0;\" \"rxq1@wq0.1;\" \"rxq2@wq0.1;\" \"rxq3@wq0.0\"\n+        dmas = \"rxq0@%s;rxq1@%s;rxq2@%s;rxq3@%s\" % (wqs[0], wqs[1], wqs[1], wqs[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n@@ -1476,18 +1509,32 @@ class TestVhostDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.2;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.1;\"\n-            \"rxq4@wq1.2;\"\n-            \"rxq5@wq1.2;\"\n-            \"rxq6@wq1.2;\"\n-            \"rxq7@wq1.2\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[8],\n+                wqs[9],\n+                wqs[10],\n+                wqs[10],\n+                wqs[10],\n+                wqs[10],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1508,18 +1555,32 @@ class TestVhostDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1571,9 +1632,8 @@ class TestVhostDsa(TestCase):\n         Test Case 10: PVP packed ring all path multi-queues vhost async operation test with each tx/rx queue using one DSA kernel driver channel\n \n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=1)\n-        dmas = \"txq0@wq0.0;\" \"txq1@wq0.1;\" \"rxq0@wq1.0;\" \"rxq1@wq1.1\"\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0, 1])\n+        dmas = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=2,dmas=[%s]'\" % dmas\n         )\n@@ -1629,24 +1689,42 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 11: PVP packed ring all path multi-queues vhost async operation test with one DSA kernel driver channel being shared among multiple tx/rx queues\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"txq6@wq0.1;\"\n-            \"txq7@wq0.1;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.0;\"\n-            \"rxq2@wq0.0;\"\n-            \"rxq3@wq0.0;\"\n-            \"rxq4@wq0.1;\"\n-            \"rxq5@wq0.1;\"\n-            \"rxq6@wq0.1;\"\n-            \"rxq7@wq0.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"txq6@%s;\"\n+            \"txq7@%s;\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,dmas=[%s]'\" % dmas\n@@ -1691,24 +1769,6 @@ class TestVhostDsa(TestCase):\n \n         if not self.check_2M_env:\n             self.vhost_user_pmd.quit()\n-            dmas = (\n-                \"txq0@wq0.0;\"\n-                \"txq1@wq0.0;\"\n-                \"txq2@wq0.0;\"\n-                \"txq3@wq0.0;\"\n-                \"txq4@wq0.1;\"\n-                \"txq5@wq0.1;\"\n-                \"txq6@wq0.1;\"\n-                \"txq7@wq0.1;\"\n-                \"rxq0@wq0.0;\"\n-                \"rxq1@wq0.0;\"\n-                \"rxq2@wq0.0;\"\n-                \"rxq3@wq0.0;\"\n-                \"rxq4@wq0.1;\"\n-                \"rxq5@wq0.1;\"\n-                \"rxq6@wq0.1;\"\n-                \"rxq7@wq0.1\"\n-            )\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,dmas=[%s]'\" % dmas\n         )\n@@ -1736,9 +1796,8 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 12: PVP packed ring dynamic queues vhost async operation with dsa kernel driver channels\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n-        dmas = \"txq0@wq0.0;\" \"txq1@wq0.1;\" \"txq2@wq0.2;\" \"txq3@wq0.2\"\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n+        dmas = \"txq0@%s;txq1@%s;txq2@%s;txq3@%s\" % (wqs[0], wqs[1], wqs[2], wqs[2])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n@@ -1786,7 +1845,7 @@ class TestVhostDsa(TestCase):\n         self.check_each_queue_of_port_packets(queues=1)\n \n         self.vhost_user_pmd.quit()\n-        dmas = \"rxq0@wq0.0;\" \"rxq1@wq0.1;\" \"rxq2@wq0.1;\" \"rxq3@wq0.0\"\n+        dmas = \"rxq0@%s;rxq1@%s;rxq2@%s;rxq3@%s\" % (wqs[0], wqs[1], wqs[1], wqs[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n@@ -1806,18 +1865,32 @@ class TestVhostDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.2;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.1;\"\n-            \"rxq4@wq1.2;\"\n-            \"rxq5@wq1.2;\"\n-            \"rxq6@wq1.2;\"\n-            \"rxq7@wq1.2\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[8],\n+                wqs[9],\n+                wqs[10],\n+                wqs[10],\n+                wqs[10],\n+                wqs[10],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1838,18 +1911,32 @@ class TestVhostDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n@@ -1894,15 +1981,14 @@ class TestVhostDsa(TestCase):\n         \"\"\"\n         Test Case 13: PVP split and packed ring dynamic queues vhost async operation with dsa dpdk and kernel driver channels\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2,\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2,\n             driver_name=\"vfio-pci\",\n-            dsa_index_list=[2, 3],\n+            dsa_idxs=[2, 3],\n             socket=self.ports_socket,\n         )\n-        dmas = \"txq0@wq0.0;\" \"txq1@wq0.0\"\n+        dmas = \"txq0@%s;txq1@%s\" % (wqs[0], wqs[0])\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n@@ -1944,14 +2030,14 @@ class TestVhostDsa(TestCase):\n             \"rxq2@%s-q1;\"\n             \"rxq3@%s-q2\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n             )\n         )\n         vhost_eal_param = (\n@@ -1959,11 +2045,11 @@ class TestVhostDsa(TestCase):\n         )\n         vhost_param = \"--nb-cores=4 --txq=8 --rxq=8 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[0][\"pci\"]]\n-        for i in self.use_dsa_list:\n+        for i in dsas:\n             ports.append(i)\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=2\",\n-            self.use_dsa_list[1]: \"max_queues=4\",\n+            dsas[0]: \"max_queues=2\",\n+            dsas[1]: \"max_queues=4\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -1980,13 +2066,13 @@ class TestVhostDsa(TestCase):\n \n         self.vhost_user_pmd.quit()\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"txq6@wq0.6;\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"txq6@%s;\"\n             \"rxq2@%s-q0;\"\n             \"rxq3@%s-q1;\"\n             \"rxq4@%s-q0;\"\n@@ -1994,12 +2080,19 @@ class TestVhostDsa(TestCase):\n             \"rxq6@%s-q2;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[6],\n+                dsas[0],\n+                dsas[0],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n             )\n         )\n         vhost_eal_param = (\n@@ -2007,11 +2100,11 @@ class TestVhostDsa(TestCase):\n         )\n         vhost_param = \"--nb-cores=4 --txq=8 --rxq=8 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[0][\"pci\"]]\n-        for i in self.use_dsa_list:\n+        for i in dsas:\n             ports.append(i)\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=2\",\n-            self.use_dsa_list[1]: \"max_queues=4\",\n+            dsas[0]: \"max_queues=2\",\n+            dsas[1]: \"max_queues=4\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -2045,39 +2138,16 @@ class TestVhostDsa(TestCase):\n                 self.check_each_queue_of_port_packets(queues=8)\n \n         self.vhost_user_pmd.quit()\n-        dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"txq6@wq0.6;\"\n-            \"rxq2@%s-q0;\"\n-            \"rxq3@%s-q1;\"\n-            \"rxq4@%s-q0;\"\n-            \"rxq5@%s-q1;\"\n-            \"rxq6@%s-q2;\"\n-            \"rxq7@%s-q3\"\n-            % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-            )\n-        )\n         vhost_eal_param = (\n             \"--vdev 'net_vhost0,iface=vhost-net0,queues=8,client=1,dmas=[%s]'\" % dmas\n         )\n         vhost_param = \"--nb-cores=4 --txq=8 --rxq=8 --txd=1024 --rxd=1024\"\n         ports = [self.dut.ports_info[0][\"pci\"]]\n-        for i in self.use_dsa_list:\n+        for i in dsas:\n             ports.append(i)\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=2\",\n-            self.use_dsa_list[1]: \"max_queues=4\",\n+            dsas[0]: \"max_queues=2\",\n+            dsas[1]: \"max_queues=4\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\ndiff --git a/tests/TestSuite_vm2vm_virtio_net_perf_dsa.py b/tests/TestSuite_vm2vm_virtio_net_perf_dsa.py\nindex b06e5ca6..408713f8 100644\n--- a/tests/TestSuite_vm2vm_virtio_net_perf_dsa.py\n+++ b/tests/TestSuite_vm2vm_virtio_net_perf_dsa.py\n@@ -2,16 +2,14 @@\n # Copyright(c) 2022 Intel Corporation\n #\n \n-import random\n import re\n-import string\n-import time\n \n import framework.utils as utils\n from framework.pmd_output import PmdOutput\n from framework.test_case import TestCase\n from framework.virt_common import VM\n \n+from .virtio_common import basic_common as BC\n from .virtio_common import dsa_common as DC\n \n \n@@ -22,28 +20,22 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         self.cores_list = self.dut.get_core_list(config=\"all\", socket=self.ports_socket)\n         self.vhost_core_list = self.cores_list[0:9]\n         self.vm_num = 2\n-        self.virtio_ip1 = \"1.1.1.1\"\n-        self.virtio_ip2 = \"1.1.1.2\"\n-        self.virtio_mac1 = \"52:54:00:00:00:01\"\n-        self.virtio_mac2 = \"52:54:00:00:00:02\"\n         self.base_dir = self.dut.base_dir.replace(\"~\", \"/root\")\n-        self.random_string = string.ascii_letters + string.digits\n         socket_num = len(set([int(core[\"socket\"]) for core in self.dut.cores]))\n         self.socket_mem = \",\".join([\"2048\"] * socket_num)\n         self.vhost_user = self.dut.new_session(suite=\"vhost\")\n         self.vhost_user_pmd = PmdOutput(self.dut, self.vhost_user)\n         self.app_testpmd_path = self.dut.apps_name[\"test-pmd\"]\n         self.testpmd_name = self.app_testpmd_path.split(\"/\")[-1]\n+        self.BC = BC(self)\n         self.DC = DC(self)\n \n     def set_up(self):\n         self.dut.send_expect(\"rm -rf %s/vhost-net*\" % self.base_dir, \"#\")\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n+        self.dut.send_expect(\"killall -s INT qemu-system-x86_64\", \"#\")\n         self.vm_dut = []\n         self.vm = []\n-        self.use_dsa_list = []\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     def start_vhost_testpmd(\n         self,\n@@ -115,86 +107,6 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             self.vm_dut.append(vm_dut)\n             self.vm.append(vm_info)\n \n-    def config_vm_ip(self):\n-        \"\"\"\n-        set virtio device IP and run arp protocal\n-        \"\"\"\n-        vm1_intf = self.vm_dut[0].ports_info[0][\"intf\"]\n-        vm2_intf = self.vm_dut[1].ports_info[0][\"intf\"]\n-        self.vm_dut[0].send_expect(\n-            \"ifconfig %s %s\" % (vm1_intf, self.virtio_ip1), \"#\", 10\n-        )\n-        self.vm_dut[1].send_expect(\n-            \"ifconfig %s %s\" % (vm2_intf, self.virtio_ip2), \"#\", 10\n-        )\n-        self.vm_dut[0].send_expect(\n-            \"arp -s %s %s\" % (self.virtio_ip2, self.virtio_mac2), \"#\", 10\n-        )\n-        self.vm_dut[1].send_expect(\n-            \"arp -s %s %s\" % (self.virtio_ip1, self.virtio_mac1), \"#\", 10\n-        )\n-\n-    def config_vm_combined(self, combined=1):\n-        \"\"\"\n-        set virtio device combined\n-        \"\"\"\n-        vm1_intf = self.vm_dut[0].ports_info[0][\"intf\"]\n-        vm2_intf = self.vm_dut[1].ports_info[0][\"intf\"]\n-        self.vm_dut[0].send_expect(\n-            \"ethtool -L %s combined %d\" % (vm1_intf, combined), \"#\", 10\n-        )\n-        self.vm_dut[1].send_expect(\n-            \"ethtool -L %s combined %d\" % (vm2_intf, combined), \"#\", 10\n-        )\n-\n-    def check_ping_between_vms(self):\n-        ping_out = self.vm_dut[0].send_expect(\n-            \"ping {} -c 4\".format(self.virtio_ip2), \"#\", 20\n-        )\n-        self.logger.info(ping_out)\n-\n-    def start_iperf(self):\n-        \"\"\"\n-        run perf command between to vms\n-        \"\"\"\n-        self.vhost_user_pmd.execute_cmd(\"clear port xstats all\")\n-\n-        server = \"iperf -s -i 1\"\n-        client = \"iperf -c {} -i 1 -t 60\".format(self.virtio_ip1)\n-        self.vm_dut[0].send_expect(\"{} > iperf_server.log &\".format(server), \"\", 10)\n-        self.vm_dut[1].send_expect(\"{} > iperf_client.log &\".format(client), \"\", 10)\n-        time.sleep(60)\n-\n-    def get_perf_result(self):\n-        \"\"\"\n-        get the iperf test result\n-        \"\"\"\n-        self.table_header = [\"Mode\", \"[M|G]bits/sec\"]\n-        self.result_table_create(self.table_header)\n-        self.vm_dut[0].send_expect(\"pkill iperf\", \"# \")\n-        self.vm_dut[1].session.copy_file_from(\"%s/iperf_client.log\" % self.dut.base_dir)\n-        fp = open(\"./iperf_client.log\")\n-        fmsg = fp.read()\n-        fp.close()\n-        # remove the server report info from msg\n-        index = fmsg.find(\"Server Report\")\n-        if index != -1:\n-            fmsg = fmsg[:index]\n-        iperfdata = re.compile(\"\\S*\\s*[M|G]bits/sec\").findall(fmsg)\n-        # the last data of iperf is the ave data from 0-30 sec\n-        self.verify(len(iperfdata) != 0, \"The iperf data between to vms is 0\")\n-        self.logger.info(\"The iperf data between vms is %s\" % iperfdata[-1])\n-\n-        # put the result to table\n-        results_row = [\"vm2vm\", iperfdata[-1]]\n-        self.result_table_add(results_row)\n-\n-        # print iperf resut\n-        self.result_table_print()\n-        # rm the iperf log file in vm\n-        self.vm_dut[0].send_expect(\"rm iperf_server.log\", \"#\", 10)\n-        self.vm_dut[1].send_expect(\"rm iperf_client.log\", \"#\", 10)\n-\n     def verify_xstats_info_on_vhost(self):\n         \"\"\"\n         check both 2VMs can receive and send big packets to each other\n@@ -213,40 +125,15 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             int(tx_info.group(1)) > 0, \"Port 0 not forward packet greater than 1519\"\n         )\n \n-    def check_scp_file_valid_between_vms(self, file_size=1024):\n-        \"\"\"\n-        scp file form VM1 to VM2, check the data is valid\n-        \"\"\"\n-        # default file_size=1024K\n-        data = \"\"\n-        for char in range(file_size * 1024):\n-            data += random.choice(self.random_string)\n-        self.vm_dut[0].send_expect('echo \"%s\" > /tmp/payload' % data, \"# \")\n-        # scp this file to vm1\n-        out = self.vm_dut[1].send_command(\n-            \"scp root@%s:/tmp/payload /root\" % self.virtio_ip1, timeout=10\n-        )\n-        if \"Are you sure you want to continue connecting\" in out:\n-            self.vm_dut[1].send_command(\"yes\", timeout=10)\n-        self.vm_dut[1].send_command(self.vm[0].password, timeout=10)\n-        # get the file info in vm1, and check it valid\n-        md5_send = self.vm_dut[0].send_expect(\"md5sum /tmp/payload\", \"# \")\n-        md5_revd = self.vm_dut[1].send_expect(\"md5sum /root/payload\", \"# \")\n-        md5_send = md5_send[: md5_send.find(\" \")]\n-        md5_revd = md5_revd[: md5_revd.find(\" \")]\n-        self.verify(\n-            md5_send == md5_revd, \"the received file is different with send file\"\n-        )\n-\n     def test_split_tso_with_dpdk_driver(self):\n         \"\"\"\n         Test Case 1: VM2VM vhost-user/virtio-net split ring test TSO with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;rxq0@%s-q0\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        dmas = \"txq0@%s-q0;rxq0@%s-q0\" % (dsas[0], dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=1,tso=1,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,queues=1,tso=1,dmas=[%s]'\"\n@@ -257,23 +144,23 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=off,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on\"\n         self.start_vms(server_mode=False, vm_queue=1)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n         self.verify_xstats_info_on_vhost()\n \n     def test_split_mergeable_8_queues_large_packet_paylocad_with_dpdk_driver(self):\n         \"\"\"\n         Test Case 2: VM2VM vhost-user/virtio-net split ring mergeable path 8 queues test with large packet payload with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -293,25 +180,25 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,tso=1,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,client=1,queues=8,tso=1,dmas=[%s]'\"\n@@ -322,17 +209,17 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             port_options=port_options,\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=on,mq=on,vectors=40,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on\"\n         self.start_vms(server_mode=True, vm_queue=8)\n-        self.config_vm_combined(combined=8)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=8)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         dmas1 = (\n@@ -349,18 +236,18 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"rxq6@%s-q5;\"\n             \"rxq7@%s-q5\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         dmas2 = (\n@@ -377,18 +264,18 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"rxq6@%s-q5;\"\n             \"rxq7@%s-q5\"\n             % (\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n             )\n         )\n         vhost_eal_param = (\n@@ -397,20 +284,20 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=8\",\n-            self.use_dsa_list[1]: \"max_queues=8\",\n+            dsas[0]: \"max_queues=8\",\n+            dsas[1]: \"max_queues=8\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         if not self.check_2M_env:\n             self.vhost_user_pmd.quit()\n@@ -418,14 +305,14 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n                 cores=self.vhost_core_list,\n                 eal_param=vhost_eal_param,\n                 param=vhost_param,\n-                ports=self.use_dsa_list,\n+                ports=dsas,\n                 port_options=port_options,\n                 iova_mode=\"pa\",\n             )\n-            self.check_ping_between_vms()\n-            self.check_scp_file_valid_between_vms()\n-            self.start_iperf()\n-            self.get_perf_result()\n+            self.BC.check_ping_between_2_vms()\n+            self.BC.check_scp_file_between_2_vms()\n+            self.BC.run_iperf_test_between_2_vms()\n+            self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         vhost_eal_param = (\n@@ -439,11 +326,11 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             param=vhost_param,\n             no_pci=True,\n         )\n-        self.config_vm_combined(combined=4)\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=4)\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         vhost_eal_param = (\n@@ -457,18 +344,18 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             param=vhost_param,\n             no_pci=True,\n         )\n-        self.config_vm_combined(combined=1)\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=1)\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n     def test_split_non_mergeable_8_queues_large_packet_paylocad_with_dpdk_driver(self):\n         \"\"\"\n         Test Case 3: VM2VM vhost-user/virtio-net split ring non-mergeable path 8 queues test with large packet payload with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -488,25 +375,25 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n-        port_options = {self.use_dsa_list[0]: \"max_queues=8\"}\n+        port_options = {dsas[0]: \"max_queues=8\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,tso=1,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,client=1,queues=8,tso=1,dmas=[%s]'\"\n@@ -517,17 +404,17 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             port_options=port_options,\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=off,mq=on,vectors=40,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on\"\n         self.start_vms(server_mode=True, vm_queue=8)\n-        self.config_vm_combined(combined=8)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=8)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         vhost_eal_param = (\n@@ -541,11 +428,12 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             param=vhost_param,\n             no_pci=True,\n         )\n-        self.config_vm_combined(combined=4)\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=4)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         vhost_eal_param = (\n@@ -559,21 +447,22 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             param=vhost_param,\n             no_pci=True,\n         )\n-        self.config_vm_combined(combined=1)\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=1)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n     def test_packed_tso_with_dpdk_driver(self):\n         \"\"\"\n         Test Case 4: VM2VM vhost-user/virtio-net packed ring test TSO with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        dmas = \"txq0@%s-q0;rxq0@%s-q1\" % (dsas[0], dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=1,tso=1,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,queues=1,tso=1,dmas=[%s]'\"\n@@ -584,23 +473,24 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             port_options=port_options,\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=on,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,packed=on\"\n         self.start_vms(server_mode=False, vm_queue=1)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n         self.verify_xstats_info_on_vhost()\n \n     def test_packed_mergeable_8_queues_large_packet_paylocad_with_dpdk_driver(self):\n         \"\"\"\n         Test Case 5: VM2VM vhost-user/virtio-net packed ring mergeable path 8 queues test with large packet payload with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -620,25 +510,25 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"rxq6@%s-q3;\"\n             \"rxq7@%s-q3\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,tso=1,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,queues=8,tso=1,dmas=[%s]'\"\n@@ -649,30 +539,30 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             port_options=port_options,\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=on,mq=on,vectors=40,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on,packed=on\"\n         self.start_vms(server_mode=False, vm_queue=8)\n-        self.config_vm_combined(combined=8)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=8)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         for _ in range(5):\n-            self.check_ping_between_vms()\n-            self.check_scp_file_valid_between_vms()\n-            self.start_iperf()\n-            self.get_perf_result()\n+            self.BC.check_ping_between_2_vms()\n+            self.BC.check_scp_file_between_2_vms()\n+            self.BC.run_iperf_test_between_2_vms()\n+            self.BC.check_iperf_result_between_2_vms()\n \n     def test_packed_non_mergeable_8_queues_large_packet_paylocad_with_dpdk_driver(self):\n         \"\"\"\n         Test Case 6: VM2VM vhost-user/virtio-net packed ring non-mergeable path 8 queues test with large packet payload with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas1 = (\n             \"txq0@%s-q0;\"\n@@ -688,18 +578,18 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"rxq6@%s-q7;\"\n             \"rxq7@%s-q7\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         dmas2 = (\n@@ -716,23 +606,23 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"rxq6@%s-q7;\"\n             \"rxq7@%s-q7\"\n             % (\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n             )\n         )\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=8\",\n-            self.use_dsa_list[1]: \"max_queues=8\",\n+            dsas[0]: \"max_queues=8\",\n+            dsas[1]: \"max_queues=8\",\n         }\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,tso=1,dmas=[%s]' \"\n@@ -744,34 +634,34 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=off,mq=on,vectors=40,csum=on,guest_csum=on,host_tso4=off,guest_tso4=off,guest_ecn=on,guest_ufo=on,host_ufo=on,packed=on\"\n         self.start_vms(server_mode=False, vm_queue=8)\n-        self.config_vm_combined(combined=8)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=8)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         for _ in range(5):\n-            self.check_ping_between_vms()\n-            self.check_scp_file_valid_between_vms()\n-            self.start_iperf()\n-            self.get_perf_result()\n+            self.BC.check_ping_between_2_vms()\n+            self.BC.check_scp_file_between_2_vms()\n+            self.BC.run_iperf_test_between_2_vms()\n+            self.BC.check_iperf_result_between_2_vms()\n \n     def test_packed_dma_ring_size_with_tcp_and_dpdk_driver(self):\n         \"\"\"\n         Test Case 7: VM2VM vhost-user/virtio-net packed ring test dma-ring-size with tcp traffic and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n-        dmas1 = \"txq0@%s-q0;rxq0@%s-q0\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n-        dmas2 = \"txq0@%s-q1;rxq0@%s-q1\" % (self.use_dsa_list[0], self.use_dsa_list[0])\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        dmas1 = \"txq0@%s-q0;rxq0@%s-q0\" % (dsas[0], dsas[0])\n+        dmas2 = \"txq0@%s-q1;rxq0@%s-q1\" % (dsas[0], dsas[0])\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=1,tso=1,dmas=[%s],dma-ring-size=64' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,queues=1,tso=1,dmas=[%s],dma-ring-size=64'\"\n@@ -782,23 +672,24 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             port_options=port_options,\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=on,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,packed=on\"\n         self.start_vms(server_mode=False, vm_queue=1)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n         self.verify_xstats_info_on_vhost()\n \n     def test_packed_mergeable_8_queues_with_legacy_mode_and_dpdk_driver(self):\n         \"\"\"\n         Test Case 8: VM2VM vhost-user/virtio-net packed ring mergeable path 8 queues test with legacy mode with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -818,25 +709,25 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"rxq6@%s-q1;\"\n             \"rxq7@%s-q1\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,tso=1,legacy-ol-flags=1,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,queues=8,tso=1,legacy-ol-flags=1,dmas=[%s]'\"\n@@ -847,30 +738,30 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             port_options=port_options,\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=on,mq=on,vectors=40,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on,packed=on\"\n         self.start_vms(server_mode=False, vm_queue=8)\n-        self.config_vm_combined(combined=8)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=8)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         for _ in range(5):\n-            self.check_ping_between_vms()\n-            self.check_scp_file_valid_between_vms()\n-            self.start_iperf()\n-            self.get_perf_result()\n+            self.BC.check_ping_between_2_vms()\n+            self.BC.check_scp_file_between_2_vms()\n+            self.BC.run_iperf_test_between_2_vms()\n+            self.BC.check_iperf_result_between_2_vms()\n \n     def test_split_tso_with_kernel_driver(self):\n         \"\"\"\n         Test Case 9: VM2VM vhost-user/virtio-net split ring test TSO with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.0\"\n+        wqs = self.DC.create_wq(wq_num=1, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[0])\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=1,tso=1,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,queues=1,tso=1,dmas=[%s]'\"\n@@ -885,53 +776,87 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=off,mq=on,vectors=40,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on\"\n         self.start_vms(server_mode=False, vm_queue=1)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n         self.verify_xstats_info_on_vhost()\n \n     def test_split_mergeable_8_queues_large_packet_paylocad_with_kernel_driver(self):\n         \"\"\"\n         Test Case 10: VM2VM vhost-user/virtio-net split ring mergeable path 8 queues test with large packet payload with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas1 = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"txq6@wq0.6;\"\n-            \"txq7@wq0.7;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.1;\"\n-            \"rxq2@wq0.2;\"\n-            \"rxq3@wq0.3;\"\n-            \"rxq4@wq0.4;\"\n-            \"rxq5@wq0.5;\"\n-            \"rxq6@wq0.6;\"\n-            \"rxq7@wq0.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"txq6@%s;\"\n+            \"txq7@%s;\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+        ) % (\n+            wqs[0],\n+            wqs[1],\n+            wqs[2],\n+            wqs[3],\n+            wqs[4],\n+            wqs[5],\n+            wqs[6],\n+            wqs[7],\n+            wqs[0],\n+            wqs[1],\n+            wqs[2],\n+            wqs[3],\n+            wqs[4],\n+            wqs[5],\n+            wqs[6],\n+            wqs[7],\n         )\n         dmas2 = (\n-            \"txq0@wq1.0;\"\n-            \"txq1@wq1.1;\"\n-            \"txq2@wq1.2;\"\n-            \"txq3@wq1.3;\"\n-            \"txq4@wq1.4;\"\n-            \"txq5@wq1.5;\"\n-            \"txq6@wq1.6;\"\n-            \"txq7@wq1.7;\"\n-            \"rxq0@wq1.0;\"\n-            \"rxq1@wq1.1;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"txq6@%s;\"\n+            \"txq7@%s;\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+        ) % (\n+            wqs[8],\n+            wqs[9],\n+            wqs[10],\n+            wqs[11],\n+            wqs[12],\n+            wqs[13],\n+            wqs[14],\n+            wqs[15],\n+            wqs[8],\n+            wqs[9],\n+            wqs[10],\n+            wqs[11],\n+            wqs[12],\n+            wqs[13],\n+            wqs[14],\n+            wqs[15],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,tso=1,dmas=[%s]' \"\n@@ -947,41 +872,69 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=on,mq=on,vectors=40,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on\"\n         self.start_vms(server_mode=True, vm_queue=8)\n-        self.config_vm_combined(combined=8)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=8)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         dmas1 = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq0.1;\"\n-            \"rxq3@wq0.1;\"\n-            \"rxq4@wq0.2;\"\n-            \"rxq5@wq0.2;\"\n-            \"rxq6@wq0.2;\"\n-            \"rxq7@wq0.2\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+                wqs[2],\n+                wqs[2],\n+                wqs[2],\n+                wqs[2],\n+            )\n         )\n         dmas2 = (\n-            \"txq0@wq0.3;\"\n-            \"txq1@wq0.3;\"\n-            \"txq2@wq0.3;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.4;\"\n-            \"rxq2@wq0.4;\"\n-            \"rxq3@wq0.4;\"\n-            \"rxq4@wq0.5;\"\n-            \"rxq5@wq0.5;\"\n-            \"rxq6@wq0.5;\"\n-            \"rxq7@wq0.5\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[3],\n+                wqs[3],\n+                wqs[3],\n+                wqs[3],\n+                wqs[4],\n+                wqs[4],\n+                wqs[4],\n+                wqs[4],\n+                wqs[5],\n+                wqs[5],\n+                wqs[5],\n+                wqs[5],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,tso=1,dmas=[%s]' \"\n@@ -1011,11 +964,12 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             param=vhost_param,\n             no_pci=True,\n         )\n-        self.config_vm_combined(combined=4)\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=4)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         vhost_eal_param = (\n@@ -1029,11 +983,12 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             param=vhost_param,\n             no_pci=True,\n         )\n-        self.config_vm_combined(combined=1)\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=1)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n     def test_split_non_mergeable_8_queues_large_packet_paylocad_with_kernel_driver(\n         self,\n@@ -1041,35 +996,62 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         \"\"\"\n         Test Case 11: VM2VM vhost-user/virtio-net split ring non-mergeable path 8 queues test with large packet payload with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas1 = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq0.1;\"\n-            \"rxq3@wq0.1;\"\n-            \"rxq4@wq0.2;\"\n-            \"rxq5@wq0.2;\"\n-            \"rxq6@wq0.2;\"\n-            \"rxq7@wq0.2\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+                wqs[1],\n+                wqs[2],\n+                wqs[2],\n+                wqs[2],\n+                wqs[2],\n+            )\n         )\n         dmas2 = (\n-            \"txq0@wq1.0;\"\n-            \"txq1@wq1.0;\"\n-            \"txq2@wq1.0;\"\n-            \"txq3@wq1.0;\"\n-            \"txq4@wq1.1;\"\n-            \"txq5@wq1.1;\"\n-            \"rxq2@wq1.1;\"\n-            \"rxq3@wq1.1;\"\n-            \"rxq4@wq1.2;\"\n-            \"rxq5@wq1.2;\"\n-            \"rxq6@wq1.2;\"\n-            \"rxq7@wq1.2\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[3],\n+                wqs[3],\n+                wqs[3],\n+                wqs[3],\n+                wqs[4],\n+                wqs[4],\n+                wqs[4],\n+                wqs[4],\n+                wqs[5],\n+                wqs[5],\n+                wqs[5],\n+                wqs[5],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,tso=1,dmas=[%s]' \"\n@@ -1085,12 +1067,12 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=off,mq=on,vectors=40,csum=on,guest_csum=on,host_tso4=off,guest_tso4=off,guest_ecn=on,guest_ufo=on,host_ufo=on\"\n         self.start_vms(server_mode=True, vm_queue=8)\n-        self.config_vm_combined(combined=8)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=8)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         vhost_eal_param = (\n@@ -1104,11 +1086,10 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             param=vhost_param,\n             no_pci=True,\n         )\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n-\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n         self.vhost_user_pmd.quit()\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=4,tso=1' \"\n@@ -1121,18 +1102,19 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             param=vhost_param,\n             no_pci=True,\n         )\n-        self.config_vm_combined(combined=1)\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=1)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n     def test_packed_tso_with_kernel_driver(self):\n         \"\"\"\n         Test Case 12: VM2VM vhost-user/virtio-net packed ring test TSO with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        dmas = \"txq0@wq0.0;rxq0@wq0.0\"\n+        wqs = self.DC.create_wq(wq_num=1, dsa_idxs=[0])\n+        dmas = \"txq0@%s;rxq0@%s\" % (wqs[0], wqs[0])\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=1,tso=1,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,queues=1,tso=1,dmas=[%s]'\"\n@@ -1147,45 +1129,73 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=on,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,packed=on\"\n         self.start_vms(server_mode=False, vm_queue=1)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n         self.verify_xstats_info_on_vhost()\n \n     def test_packed_mergeable_8_queues_large_packet_paylocad_with_kernel_driver(self):\n         \"\"\"\n         Test Case 13: VM2VM vhost-user/virtio-net packed ring mergeable path 8 queues test with large packet payload with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas1 = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"txq4@wq0.4;\"\n-            \"txq5@wq0.5;\"\n-            \"rxq2@wq0.2;\"\n-            \"rxq3@wq0.3;\"\n-            \"rxq4@wq0.4;\"\n-            \"rxq5@wq0.5;\"\n-            \"rxq6@wq0.6;\"\n-            \"rxq7@wq0.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[6],\n+                wqs[7],\n+            )\n         )\n         dmas2 = (\n-            \"txq0@wq1.0;\"\n-            \"txq1@wq1.1;\"\n-            \"txq2@wq1.2;\"\n-            \"txq3@wq1.3;\"\n-            \"txq4@wq1.4;\"\n-            \"txq5@wq1.5;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.3;\"\n-            \"rxq4@wq1.4;\"\n-            \"rxq5@wq1.5;\"\n-            \"rxq6@wq1.6;\"\n-            \"rxq7@wq1.7\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[8],\n+                wqs[9],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,tso=1,dmas=[%s]' \"\n@@ -1201,18 +1211,18 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         )\n         self.vm_args = \"mrg_rxbuf=on,mq=on,vectors=40,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on,packed=on\"\n         self.start_vms(server_mode=False, vm_queue=8)\n-        self.config_vm_combined(combined=8)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=8)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         for _ in range(5):\n-            self.check_ping_between_vms()\n-            self.check_scp_file_valid_between_vms()\n-            self.start_iperf()\n-            self.get_perf_result()\n+            self.BC.check_ping_between_2_vms()\n+            self.BC.check_scp_file_between_2_vms()\n+            self.BC.run_iperf_test_between_2_vms()\n+            self.BC.check_iperf_result_between_2_vms()\n \n     def test_packed_non_mergeable_8_queues_large_packet_paylocad_with_kernel_driver(\n         self,\n@@ -1220,43 +1230,78 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         \"\"\"\n         Test Case 14: VM2VM vhost-user/virtio-net packed ring non-mergeable path 8 queues test with large packet payload with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=4, dsa_idxs=[0, 1])\n         dmas1 = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.1;\"\n-            \"txq3@wq0.1;\"\n-            \"txq4@wq0.2;\"\n-            \"txq5@wq0.2;\"\n-            \"txq6@wq0.3;\"\n-            \"txq7@wq0.3;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.0;\"\n-            \"rxq2@wq0.1;\"\n-            \"rxq3@wq0.1;\"\n-            \"rxq4@wq0.2;\"\n-            \"rxq5@wq0.2;\"\n-            \"rxq6@wq0.3;\"\n-            \"rxq7@wq0.3\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"txq6@%s;\"\n+            \"txq7@%s;\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[2],\n+                wqs[2],\n+                wqs[3],\n+                wqs[3],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[2],\n+                wqs[2],\n+                wqs[3],\n+                wqs[3],\n+            )\n         )\n         dmas2 = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.1;\"\n-            \"txq3@wq0.1;\"\n-            \"txq4@wq0.2;\"\n-            \"txq5@wq0.2;\"\n-            \"txq6@wq0.3;\"\n-            \"txq7@wq0.3;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.0;\"\n-            \"rxq2@wq0.1;\"\n-            \"rxq3@wq0.1;\"\n-            \"rxq4@wq0.2;\"\n-            \"rxq5@wq0.2;\"\n-            \"rxq6@wq0.3;\"\n-            \"rxq7@wq0.3\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"txq6@%s;\"\n+            \"txq7@%s;\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[2],\n+                wqs[2],\n+                wqs[3],\n+                wqs[3],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[2],\n+                wqs[2],\n+                wqs[3],\n+                wqs[3],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=8,tso=1,dmas=[%s]' \"\n@@ -1272,27 +1317,26 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         )\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=off,mq=on,vectors=40,csum=on,guest_csum=on,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on,packed=on\"\n         self.start_vms(server_mode=False, vm_queue=8)\n-        self.config_vm_combined(combined=8)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=8)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         for _ in range(5):\n-            self.check_ping_between_vms()\n-            self.check_scp_file_valid_between_vms()\n-            self.start_iperf()\n-            self.get_perf_result()\n+            self.BC.check_ping_between_2_vms()\n+            self.BC.check_scp_file_between_2_vms()\n+            self.BC.run_iperf_test_between_2_vms()\n+            self.BC.check_iperf_result_between_2_vms()\n \n     def test_split_non_mergeable_16_queues_with_rx_tx_csum_in_sw(self):\n         \"\"\"\n         Test Case 15: VM2VM vhost-user/virtio-net split ring non-mergeable 16 queues test with Rx/Tx csum in SW\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2,\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2,\n             driver_name=\"vfio-pci\",\n             dsa_index_list=[2, 3],\n             socket=self.ports_socket,\n@@ -1314,39 +1358,55 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"txq13@%s-q0;\"\n             \"txq14@%s-q0;\"\n             \"txq15@%s-q0;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.0;\"\n-            \"rxq2@wq0.0;\"\n-            \"rxq3@wq0.0;\"\n-            \"rxq4@wq0.0;\"\n-            \"rxq5@wq0.0;\"\n-            \"rxq6@wq0.0;\"\n-            \"rxq7@wq0.0;\"\n-            \"rxq8@wq0.0;\"\n-            \"rxq9@wq0.0;\"\n-            \"rxq10@wq0.0;\"\n-            \"rxq11@wq0.0;\"\n-            \"rxq12@wq0.0;\"\n-            \"rxq13@wq0.0;\"\n-            \"rxq14@wq0.0;\"\n-            \"rxq15@wq0.0\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s;\"\n+            \"rxq8@%s;\"\n+            \"rxq9@%s;\"\n+            \"rxq10@%s;\"\n+            \"rxq11@%s;\"\n+            \"rxq12@%s;\"\n+            \"rxq13@%s;\"\n+            \"rxq14@%s;\"\n+            \"rxq15@%s\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n             )\n         )\n         dmas2 = (\n@@ -1366,39 +1426,55 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"txq13@%s-q5;\"\n             \"txq14@%s-q6;\"\n             \"txq15@%s-q7;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.1;\"\n-            \"rxq2@wq0.2;\"\n-            \"rxq3@wq0.3;\"\n-            \"rxq4@wq0.4;\"\n-            \"rxq5@wq0.5;\"\n-            \"rxq6@wq0.6;\"\n-            \"rxq7@wq0.7;\"\n-            \"rxq8@wq1.0;\"\n-            \"rxq9@wq1.1;\"\n-            \"rxq10@wq1.2;\"\n-            \"rxq11@wq1.3;\"\n-            \"rxq12@wq1.4;\"\n-            \"rxq13@wq1.5;\"\n-            \"rxq14@wq1.6;\"\n-            \"rxq15@wq1.7\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s;\"\n+            \"rxq8@%s;\"\n+            \"rxq9@%s;\"\n+            \"rxq10@%s;\"\n+            \"rxq11@%s;\"\n+            \"rxq12@%s;\"\n+            \"rxq13@%s;\"\n+            \"rxq14@%s;\"\n+            \"rxq15@%s\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[6],\n+                wqs[7],\n+                wqs[8],\n+                wqs[9],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n             )\n         )\n         vhost_eal_param = (\n@@ -1411,7 +1487,7 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n         )\n         self.vhost_user_pmd.execute_cmd(\"stop\")\n         self.vhost_user_pmd.execute_cmd(\"set fwd csum\")\n@@ -1425,12 +1501,12 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         self.vhost_user_pmd.execute_cmd(\"start\")\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=off,mq=on,vectors=40,csum=on,guest_csum=off,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on\"\n         self.start_vms(server_mode=True, vm_queue=16)\n-        self.config_vm_combined(combined=16)\n-        self.config_vm_ip()\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=16)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         dmas1 = (\n@@ -1447,29 +1523,39 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"rxq6@%s-q6;\"\n             \"rxq7@%s-q6\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n             )\n         )\n         dmas2 = (\n-            \"txq12@wq1.0;\"\n-            \"txq13@wq1.0;\"\n-            \"txq14@wq1.0;\"\n-            \"txq15@wq1.0;\"\n-            \"rxq12@wq1.1;\"\n-            \"rxq13@wq1.1;\"\n-            \"rxq14@wq1.1;\"\n-            \"rxq15@wq1.1\"\n+            \"txq12@%s;\"\n+            \"txq13@%s;\"\n+            \"txq14@%s;\"\n+            \"txq15@%s;\"\n+            \"rxq12@%s;\"\n+            \"rxq13@%s;\"\n+            \"rxq14@%s;\"\n+            \"rxq15@%s\"\n+            % (\n+                wqs[8],\n+                wqs[8],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=16,tso=1,dmas=[%s]' \"\n@@ -1481,12 +1567,12 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n         )\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         vhost_eal_param = (\n@@ -1500,10 +1586,10 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             param=vhost_param,\n             no_pci=True,\n         )\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         self.vhost_user_pmd.quit()\n         vhost_eal_param = (\n@@ -1517,20 +1603,19 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             param=vhost_param,\n             no_pci=True,\n         )\n-        self.config_vm_combined(combined=1)\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=1)\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n     def test_packed_mergeable_16_queues_with_rx_tx_csum_in_sw(self):\n         \"\"\"\n         Test Case 16: VM2VM vhost-user/virtio-net packed ring mergeable 16 queues test with Rx/Tx csum in SW\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2,\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2,\n             driver_name=\"vfio-pci\",\n             dsa_index_list=[2, 3],\n             socket=self.ports_socket,\n@@ -1552,39 +1637,55 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"txq13@%s-q0;\"\n             \"txq14@%s-q0;\"\n             \"txq15@%s-q0;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.0;\"\n-            \"rxq2@wq0.0;\"\n-            \"rxq3@wq0.0;\"\n-            \"rxq4@wq0.0;\"\n-            \"rxq5@wq0.0;\"\n-            \"rxq6@wq0.0;\"\n-            \"rxq7@wq0.0;\"\n-            \"rxq8@wq0.0;\"\n-            \"rxq9@wq0.0;\"\n-            \"rxq10@wq0.0;\"\n-            \"rxq11@wq0.0;\"\n-            \"rxq12@wq0.0;\"\n-            \"rxq13@wq0.0;\"\n-            \"rxq14@wq0.0;\"\n-            \"rxq15@wq0.0\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s;\"\n+            \"rxq8@%s;\"\n+            \"rxq9@%s;\"\n+            \"rxq10@%s;\"\n+            \"rxq11@%s;\"\n+            \"rxq12@%s;\"\n+            \"rxq13@%s;\"\n+            \"rxq14@%s;\"\n+            \"rxq15@%s\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n             )\n         )\n         dmas2 = (\n@@ -1604,39 +1705,55 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             \"txq13@%s-q5;\"\n             \"txq14@%s-q6;\"\n             \"txq15@%s-q7;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.1;\"\n-            \"rxq2@wq0.2;\"\n-            \"rxq3@wq0.3;\"\n-            \"rxq4@wq0.4;\"\n-            \"rxq5@wq0.5;\"\n-            \"rxq6@wq0.6;\"\n-            \"rxq7@wq0.7;\"\n-            \"rxq8@wq1.0;\"\n-            \"rxq9@wq1.1;\"\n-            \"rxq10@wq1.2;\"\n-            \"rxq11@wq1.3;\"\n-            \"rxq12@wq1.4;\"\n-            \"rxq13@wq1.5;\"\n-            \"rxq14@wq1.6;\"\n-            \"rxq15@wq1.7\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s;\"\n+            \"rxq8@%s;\"\n+            \"rxq9@%s;\"\n+            \"rxq10@%s;\"\n+            \"rxq11@%s;\"\n+            \"rxq12@%s;\"\n+            \"rxq13@%s;\"\n+            \"rxq14@%s;\"\n+            \"rxq15@%s\"\n             % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n-                self.use_dsa_list[1],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[0],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                dsas[1],\n+                wqs[0],\n+                wqs[1],\n+                wqs[2],\n+                wqs[3],\n+                wqs[4],\n+                wqs[5],\n+                wqs[6],\n+                wqs[7],\n+                wqs[8],\n+                wqs[9],\n+                wqs[10],\n+                wqs[11],\n+                wqs[12],\n+                wqs[13],\n+                wqs[14],\n+                wqs[15],\n             )\n         )\n         vhost_eal_param = (\n@@ -1649,7 +1766,7 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n         )\n         self.vhost_user_pmd.execute_cmd(\"stop\")\n         self.vhost_user_pmd.execute_cmd(\"set fwd csum\")\n@@ -1663,18 +1780,18 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         self.vhost_user_pmd.execute_cmd(\"start\")\n         self.vm_args = \"disable-modern=false,mrg_rxbuf=on,mq=on,vectors=40,csum=on,guest_csum=off,host_tso4=on,guest_tso4=on,guest_ecn=on,guest_ufo=on,host_ufo=on,packed=on\"\n         self.start_vms(server_mode=False, vm_queue=16)\n-        self.config_vm_ip()\n-        self.config_vm_combined(combined=16)\n-        self.check_ping_between_vms()\n-        self.check_scp_file_valid_between_vms()\n-        self.start_iperf()\n-        self.get_perf_result()\n+        self.BC.config_2_vms_combined(combined=16)\n+        self.BC.config_2_vms_ip()\n+        self.BC.check_ping_between_2_vms()\n+        self.BC.check_scp_file_between_2_vms()\n+        self.BC.run_iperf_test_between_2_vms()\n+        self.BC.check_iperf_result_between_2_vms()\n \n         for _ in range(5):\n-            self.check_ping_between_vms()\n-            self.check_scp_file_valid_between_vms()\n-            self.start_iperf()\n-            self.get_perf_result()\n+            self.BC.check_ping_between_2_vms()\n+            self.BC.check_scp_file_between_2_vms()\n+            self.BC.run_iperf_test_between_2_vms()\n+            self.BC.check_iperf_result_between_2_vms()\n \n     def stop_all_apps(self):\n         for i in range(len(self.vm)):\n@@ -1685,8 +1802,7 @@ class TestVM2VMVirtioNetPerfDsa(TestCase):\n         self.stop_all_apps()\n         self.dut.kill_all()\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n+        self.dut.send_expect(\"killall -s INT qemu-system-x86_64\", \"#\")\n \n     def tear_down_all(self):\n         self.dut.close_session(self.vhost_user)\ndiff --git a/tests/TestSuite_vm2vm_virtio_pmd_dsa.py b/tests/TestSuite_vm2vm_virtio_pmd_dsa.py\nindex c4353661..6ae9f165 100644\n--- a/tests/TestSuite_vm2vm_virtio_pmd_dsa.py\n+++ b/tests/TestSuite_vm2vm_virtio_pmd_dsa.py\n@@ -42,9 +42,6 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         self.vm_num = 2\n         self.vm_dut = []\n         self.vm = []\n-        self.use_dsa_list = []\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     @property\n     def check_2M_env(self):\n@@ -99,7 +96,6 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         packed=False,\n         server_mode=True,\n         restart_vm1=False,\n-        vm_config=\"vhost_sample\",\n     ):\n         \"\"\"\n         start two VM, each VM has one virtio device\n@@ -111,7 +107,7 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         for i in range(self.vm_num):\n             if restart_vm1:\n                 i = i + 1\n-            vm_info = VM(self.dut, \"vm%d\" % i, vm_config)\n+            vm_info = VM(self.dut, \"vm%d\" % i, \"vhost_sample\")\n             vm_params[\"driver\"] = \"vhost-user\"\n             if not server_mode:\n                 vm_params[\"opt_path\"] = self.base_dir + \"/vhost-net%d\" % i\n@@ -210,6 +206,7 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         dut_pmd.execute_cmd(\"start\")\n \n     def get_and_verify_func_name_of_perf_top(self, func_name_list):\n+        time.sleep(10)\n         self.dut.send_expect(\"rm -fr perf_top.log\", \"# \", 120)\n         self.dut.send_expect(\"perf top > perf_top.log\", \"\", 120)\n         time.sleep(30)\n@@ -229,8 +226,8 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         Test Case 1: VM2VM virtio-pmd split ring mergeable path dynamic queue size with dsa dpdk driver and server mode\n         \"\"\"\n         self.check_path = [\"virtio_dev_rx_async\", \"virtio_dev_tx_async\"]\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -241,18 +238,9 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n             \"rxq1@%s-q1;\"\n             \"rxq2@%s-q2;\"\n             \"rxq3@%s-q3\"\n-            % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-            )\n+            % (dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0])\n         )\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,client=1,queues=8,dmas=[%s]'\"\n@@ -263,7 +251,7 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         self.start_vms(vm_queue=8, mergeable=True, packed=False, server_mode=True)\n@@ -293,8 +281,8 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         Test Case 2: VM2VM virtio-pmd split ring non-mergeable path dynamic queue size with dsa dpdk driver and server mode\n         \"\"\"\n         self.check_path = [\"virtio_dev_rx_async\", \"virtio_dev_tx_async\"]\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -305,18 +293,9 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n             \"rxq1@%s-q2;\"\n             \"rxq2@%s-q3;\"\n             \"rxq3@%s-q3\"\n-            % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-            )\n+            % (dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0])\n         )\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,client=1,queues=8,dmas=[%s]'\"\n@@ -327,7 +306,7 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         self.start_vms(vm_queue=8, mergeable=False, packed=False, server_mode=True)\n@@ -359,8 +338,8 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         Test Case 3: VM2VM virtio-pmd packed ring mergeable path dynamic queue size with dsa dpdk driver and server mode\n         \"\"\"\n         self.check_path = [\"virtio_dev_rx_async\", \"virtio_dev_tx_async\"]\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -371,18 +350,9 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n             \"rxq1@%s-q1;\"\n             \"rxq2@%s-q2;\"\n             \"rxq3@%s-q3\"\n-            % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-            )\n+            % (dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0])\n         )\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,client=1,queues=8,dmas=[%s]'\"\n@@ -393,7 +363,7 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         self.start_vms(vm_queue=8, mergeable=True, packed=True, server_mode=True)\n@@ -442,8 +412,8 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         Test Case 4: VM2VM virtio-pmd packed ring non-mergeable path dynamic queue size with dsa dpdk driver and server mode\n         \"\"\"\n         self.check_path = [\"virtio_dev_rx_async\", \"virtio_dev_tx_async\"]\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1, driver_name=\"vfio-pci\", socket=self.ports_socket\n         )\n         dmas = (\n             \"txq0@%s-q0;\"\n@@ -454,18 +424,9 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n             \"rxq1@%s-q1;\"\n             \"rxq2@%s-q2;\"\n             \"rxq3@%s-q3\"\n-            % (\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-                self.use_dsa_list[0],\n-            )\n+            % (dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0], dsas[0])\n         )\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,dmas=[%s]' \"\n             \"--vdev 'eth_vhost1,iface=vhost-net1,client=1,queues=8,dmas=[%s]'\"\n@@ -476,7 +437,7 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n         )\n         self.start_vms(vm_queue=8, mergeable=False, packed=True, server_mode=True)\n@@ -508,28 +469,27 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         Test Case 5: VM2VM virtio-pmd split ring mergeable path dynamic queue size with dsa kernel driver and server mode\n         \"\"\"\n         self.check_path = [\"virtio_dev_rx_async\", \"virtio_dev_tx_async\"]\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas1 = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"rxq0@wq0.1;\"\n-            \"rxq1@wq0.1;\"\n-            \"rxq2@wq0.1;\"\n-            \"rxq3@wq0.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s\" % (wqs[0], wqs[0], wqs[0], wqs[0], wqs[1], wqs[1], wqs[1], wqs[1])\n         )\n \n         dmas2 = (\n-            \"txq0@wq0.1;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.1;\"\n-            \"txq3@wq0.1;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.0;\"\n-            \"rxq2@wq0.0;\"\n-            \"rxq3@wq0.0\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s\" % (wqs[1], wqs[1], wqs[1], wqs[1], wqs[0], wqs[0], wqs[0], wqs[0])\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,dmas=[%s]' \"\n@@ -572,21 +532,34 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         Test Case 6: VM2VM virtio-pmd split ring non-mergeable path dynamic queue size with dsa kernel driver and server mode\n         \"\"\"\n         self.check_path = [\"virtio_dev_rx_async\", \"virtio_dev_tx_async\"]\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,dmas=[%s]' \"\n@@ -629,17 +602,16 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         Test Case 7: VM2VM virtio-pmd packed ring mergeable path dynamic queue size with dsa kernel driver and server mode\n         \"\"\"\n         self.check_path = [\"virtio_dev_rx_async\", \"virtio_dev_tx_async\"]\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.1;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.3;\"\n-            \"rxq0@wq0.0;\"\n-            \"rxq1@wq0.1;\"\n-            \"rxq2@wq0.2;\"\n-            \"rxq3@wq0.3\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"rxq0@%s;\"\n+            \"rxq1@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s\" % (wqs[0], wqs[1], wqs[2], wqs[3], wqs[0], wqs[1], wqs[2], wqs[3])\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,dmas=[%s]' \"\n@@ -699,36 +671,63 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         Test Case 8: VM2VM virtio-pmd packed ring non-mergeable path dynamic queue size with dsa kernel driver and server mode\n         \"\"\"\n         self.check_path = [\"virtio_dev_rx_async\", \"virtio_dev_tx_async\"]\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=8, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=8, dsa_idxs=[0, 1])\n         dmas1 = (\n-            \"txq0@wq0.0;\"\n-            \"txq1@wq0.0;\"\n-            \"txq2@wq0.0;\"\n-            \"txq3@wq0.0;\"\n-            \"txq4@wq0.1;\"\n-            \"txq5@wq0.1;\"\n-            \"rxq2@wq1.0;\"\n-            \"rxq3@wq1.0;\"\n-            \"rxq4@wq1.1;\"\n-            \"rxq5@wq1.1;\"\n-            \"rxq6@wq1.1;\"\n-            \"rxq7@wq1.1\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[0],\n+                wqs[1],\n+                wqs[1],\n+                wqs[8],\n+                wqs[8],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+                wqs[9],\n+            )\n         )\n \n         dmas2 = (\n-            \"txq0@wq0.2;\"\n-            \"txq1@wq0.2;\"\n-            \"txq2@wq0.2;\"\n-            \"txq3@wq0.2;\"\n-            \"txq4@wq0.3;\"\n-            \"txq5@wq0.3;\"\n-            \"rxq2@wq1.2;\"\n-            \"rxq3@wq1.2;\"\n-            \"rxq4@wq1.3;\"\n-            \"rxq5@wq1.3;\"\n-            \"rxq6@wq1.3;\"\n-            \"rxq7@wq1.3\"\n+            \"txq0@%s;\"\n+            \"txq1@%s;\"\n+            \"txq2@%s;\"\n+            \"txq3@%s;\"\n+            \"txq4@%s;\"\n+            \"txq5@%s;\"\n+            \"rxq2@%s;\"\n+            \"rxq3@%s;\"\n+            \"rxq4@%s;\"\n+            \"rxq5@%s;\"\n+            \"rxq6@%s;\"\n+            \"rxq7@%s\"\n+            % (\n+                wqs[2],\n+                wqs[2],\n+                wqs[2],\n+                wqs[2],\n+                wqs[3],\n+                wqs[3],\n+                wqs[10],\n+                wqs[10],\n+                wqs[11],\n+                wqs[11],\n+                wqs[11],\n+                wqs[11],\n+            )\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,client=1,queues=8,dmas=[%s]' \"\n@@ -773,8 +772,6 @@ class TestVM2VMVirtioPmdDsa(TestCase):\n         self.stop_all_apps()\n         self.dut.kill_all()\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     def tear_down_all(self):\n         self.dut.close_session(self.vhost_user)\ndiff --git a/tests/TestSuite_vm2vm_virtio_user_dsa.py b/tests/TestSuite_vm2vm_virtio_user_dsa.py\nindex 7e359f3b..bd841e02 100644\n--- a/tests/TestSuite_vm2vm_virtio_user_dsa.py\n+++ b/tests/TestSuite_vm2vm_virtio_user_dsa.py\n@@ -46,10 +46,6 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.dut.send_expect(\"rm -rf %s\" % self.dump_vhost_pcap, \"#\")\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n         self.dut.send_expect(\"killall -s INT %s\" % self.pdump_name, \"#\")\n-        self.use_dsa_list = []\n-\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     @property\n     def check_2M_env(self):\n@@ -279,16 +275,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 1: VM2VM vhost-user/virtio-user split ring non-mergeable path and multi-queues payload check with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -296,14 +292,14 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             iova_mode=\"va\",\n         )\n         virtio1_eal_param = \"--vdev=net_virtio_user1,mac=00:01:02:03:04:05,path=./vhost-net1,queues=2,server=1,mrg_rxbuf=0,in_order=0,queue_size=4096\"\n@@ -329,16 +325,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.vhost_user_pmd.execute_cmd(\"quit\", \"#\", 60)\n         self.clear_virtio_user1_stats()\n         dmas1 = \"txq0@%s-q1;txq1@%s-q1;rxq0@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q1;txq1@%s-q1;rxq1@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -346,8 +342,8 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=4\",\n-            self.use_dsa_list[1]: \"max_queues=4\",\n+            dsas[0]: \"max_queues=4\",\n+            dsas[1]: \"max_queues=4\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -355,7 +351,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n         self.start_pdump_to_capture_pkt()\n@@ -370,16 +366,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 2: VM2VM split ring inorder non-mergeable path and multi-queues payload check with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q2;rxq1@%s-q3\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -387,14 +383,14 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=4\"}\n+        port_options = {dsas[0]: \"max_queues=4\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             iova_mode=\"va\",\n         )\n         virtio1_eal_param = \"--vdev=net_virtio_user1,mac=00:01:02:03:04:05,path=./vhost-net1,queues=2,server=1,mrg_rxbuf=0,in_order=1,queue_size=4096\"\n@@ -420,16 +416,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.vhost_user_pmd.execute_cmd(\"quit\", \"#\", 60)\n         self.clear_virtio_user1_stats()\n         dmas1 = \"txq0@%s-q1;txq1@%s-q1;rxq0@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q1;txq1@%s-q1;rxq1@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -437,8 +433,8 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=2\",\n-            self.use_dsa_list[1]: \"max_queues=2\",\n+            dsas[0]: \"max_queues=2\",\n+            dsas[1]: \"max_queues=2\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -446,7 +442,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n         self.start_pdump_to_capture_pkt()\n@@ -461,16 +457,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 3: VM2VM split ring inorder mergeable path and multi-queues test non-indirect descriptor and payload check with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -479,14 +475,14 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         )\n \n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=256 --rxd=256 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             iova_mode=\"va\",\n         )\n \n@@ -514,16 +510,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.virtio_user1_pmd.execute_cmd(\"quit\", \"#\", 60)\n         self.vhost_user_pmd.execute_cmd(\"quit\", \"#\", 60)\n         dmas1 = \"txq0@%s-q0;txq1@%s-q1;rxq0@%s-q2;rxq1@%s-q3\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;txq1@%s-q1;rxq1@%s-q2;rxq1@%s-q3\" % (\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -531,8 +527,8 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=4\",\n-            self.use_dsa_list[1]: \"max_queues=4\",\n+            dsas[0]: \"max_queues=4\",\n+            dsas[1]: \"max_queues=4\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -540,7 +536,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n         self.start_virtio_testpmd_with_vhost_net1(\n@@ -565,16 +561,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 4: VM2VM split ring mergeable path and multi-queues test indirect descriptor and payload check with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -582,14 +578,14 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=256 --rxd=256 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=1\"}\n+        port_options = {dsas[0]: \"max_queues=1\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             iova_mode=\"va\",\n         )\n         virtio1_eal_param = \"--vdev=net_virtio_user1,mac=00:01:02:03:04:05,path=./vhost-net1,queues=2,server=1,mrg_rxbuf=1,in_order=0,queue_size=256\"\n@@ -616,16 +612,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.virtio_user1_pmd.execute_cmd(\"quit\", \"#\", 60)\n         self.vhost_user_pmd.execute_cmd(\"quit\", \"#\", 60)\n         dmas1 = \"txq0@%s-q0;txq1@%s-q1;rxq0@%s-q2;rxq1@%s-q3\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;txq1@%s-q1;rxq1@%s-q2;rxq1@%s-q3\" % (\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -633,8 +629,8 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=4\",\n-            self.use_dsa_list[1]: \"max_queues=4\",\n+            dsas[0]: \"max_queues=4\",\n+            dsas[1]: \"max_queues=4\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -642,7 +638,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n         self.start_virtio_testpmd_with_vhost_net1(\n@@ -667,18 +663,18 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 5: VM2VM split ring vectorized path and multi-queues payload check with vhost async operation and dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;rxq0@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q1;rxq0@%s-q1;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -692,7 +688,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n \n@@ -722,16 +718,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.vhost_user_pmd.execute_cmd(\"quit\", \"#\", 60)\n         self.clear_virtio_user1_stats()\n         dmas1 = \"txq0@%s-q3;txq1@%s-q3;rxq0@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n+            dsas[0],\n+            dsas[0],\n+            dsas[1],\n+            dsas[1],\n         )\n         dmas2 = \"txq0@%s-q1;txq1@%s-q1;rxq1@%s-q3;rxq1@%s-q3\" % (\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[1],\n+            dsas[1],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -739,8 +735,8 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=4\",\n-            self.use_dsa_list[1]: \"max_queues=4\",\n+            dsas[0]: \"max_queues=4\",\n+            dsas[1]: \"max_queues=4\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -748,7 +744,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n         self.start_pdump_to_capture_pkt()\n@@ -763,16 +759,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 6: VM2VM packed ring non-mergeable path and multi-queues payload check with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n+            dsas[1],\n+            dsas[1],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -786,7 +782,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n \n@@ -816,16 +812,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.vhost_user_pmd.execute_cmd(\"quit\", \"#\", 60)\n         self.clear_virtio_user1_stats()\n         dmas1 = \"txq0@%s-q0;txq1@%s-q1;rxq0@%s-q0;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;txq1@%s-q1;rxq1@%s-q0;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -833,8 +829,8 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=4\",\n-            self.use_dsa_list[1]: \"max_queues=4\",\n+            dsas[0]: \"max_queues=4\",\n+            dsas[1]: \"max_queues=4\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -842,7 +838,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             iova_mode=\"va\",\n         )\n         self.start_pdump_to_capture_pkt()\n@@ -857,16 +853,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 7: VM2VM packed ring inorder non-mergeable path and multi-queues payload check with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;rxq1@%s-q1\" % (\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n+            dsas[1],\n+            dsas[1],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -876,8 +872,8 @@ class TestVM2VMVirtioUserDsa(TestCase):\n \n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=2\",\n-            self.use_dsa_list[1]: \"max_queues=2\",\n+            dsas[0]: \"max_queues=2\",\n+            dsas[1]: \"max_queues=2\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n@@ -885,7 +881,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n \n@@ -915,16 +911,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.vhost_user_pmd.execute_cmd(\"quit\", \"#\", 60)\n         self.clear_virtio_user1_stats()\n         dmas1 = \"txq0@%s-q5;txq1@%s-q6;rxq0@%s-q5;rxq1@%s-q6\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q5;txq1@%s-q6;rxq1@%s-q5;rxq1@%s-q6\" % (\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -936,7 +932,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n         self.start_pdump_to_capture_pkt()\n@@ -951,16 +947,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 8: VM2VM packed ring mergeable path and multi-queues payload check with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -969,14 +965,14 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         )\n \n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=1\"}\n+        port_options = {dsas[0]: \"max_queues=1\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n             port_options=port_options,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             iova_mode=\"va\",\n         )\n \n@@ -1006,16 +1002,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.vhost_user_pmd.execute_cmd(\"quit\", \"#\", 60)\n         self.clear_virtio_user1_stats()\n         dmas1 = \"txq0@%s-q0;txq1@%s-q1;rxq0@%s-q2;rxq1@%s-q3\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q4;txq1@%s-q5;rxq1@%s-q6;rxq1@%s-q7\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -1027,7 +1023,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             iova_mode=\"va\",\n         )\n         self.start_pdump_to_capture_pkt()\n@@ -1042,18 +1038,18 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 9: VM2VM packed ring inorder mergeable path and multi-queues payload check with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;rxq0@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;txq1@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -1067,7 +1063,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n \n@@ -1097,16 +1093,16 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.vhost_user_pmd.execute_cmd(\"quit\", \"#\", 60)\n         self.clear_virtio_user1_stats()\n         dmas1 = \"txq0@%s-q0;txq1@%s-q1;rxq0@%s-q0;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;txq1@%s-q1;rxq1@%s-q0;rxq1@%s-q1\" % (\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n+            dsas[1],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -1118,7 +1114,7 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             iova_mode=\"va\",\n         )\n         self.start_pdump_to_capture_pkt()\n@@ -1133,20 +1129,20 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 10: VM2VM packed ring vectorized-tx path and multi-queues test indirect descriptor and payload check with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;txq1@%s-q0;rxq0@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q1;txq1@%s-q1;rxq0@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -1155,13 +1151,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         )\n \n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=256 --rxd=256 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -1193,14 +1189,14 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.virtio_user1_pmd.execute_cmd(\"quit\", \"#\", 60)\n         self.vhost_user_pmd.execute_cmd(\"quit\", \"#\", 60)\n         dmas1 = \"txq0@%s-q0;txq1@%s-q1;rxq0@%s-q2;rxq1@%s-q3\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;txq1@%s-q1\" % (\n-            self.use_dsa_list[1],\n-            self.use_dsa_list[1],\n+            dsas[1],\n+            dsas[1],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -1208,15 +1204,15 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         port_options = {\n-            self.use_dsa_list[0]: \"max_queues=4\",\n-            self.use_dsa_list[1]: \"max_queues=2\",\n+            dsas[0]: \"max_queues=4\",\n+            dsas[1]: \"max_queues=2\",\n         }\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -1242,20 +1238,20 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 11: VM2VM packed ring vectorized path and payload check test with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;txq1@%s-q0;rxq0@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q1;txq1@%s-q1;rxq0@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -1264,13 +1260,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         )\n \n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -1304,20 +1300,20 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 12: VM2VM packed ring vectorized path payload check test with ring size is not power of 2 with dsa dpdk driver\n         \"\"\"\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=2, driver_name=\"vfio-pci\", socket=self.port_socket\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=2, driver_name=\"vfio-pci\", socket=self.port_socket\n         )\n         dmas1 = \"txq0@%s-q0;txq1@%s-q0;rxq0@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         dmas2 = \"txq0@%s-q0;txq1@%s-q0;rxq0@%s-q1;rxq1@%s-q1\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -1326,13 +1322,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         )\n \n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=2\"}\n+        port_options = {dsas[0]: \"max_queues=2\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list[0:1],\n+            ports=dsas[0:1],\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -1366,10 +1362,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 13: VM2VM split ring non-mergeable path and multi-queues payload check with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas1 = \"txq0@%s;rxq1@%s\" % (wqs[0], wqs[0])\n+        dmas2 = \"txq0@%s;rxq1@%s\" % (wqs[1], wqs[1])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;rxq1@wq0.0]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq0.1;rxq1@wq0.1]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1409,10 +1408,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 14: VM2VM split ring inorder non-mergeable path and multi-queues payload check with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=4, dsa_idxs=[0])\n+        dmas1 = \"txq0@%s;rxq1@%s\" % (wqs[0], wqs[1])\n+        dmas2 = \"txq0@%s;rxq1@%s\" % (wqs[2], wqs[3])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;rxq1@wq0.1]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq0.2;rxq1@wq0.3]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1452,10 +1454,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 15: VM2VM split ring inorder mergeable path and multi-queues test non-indirect descriptor and payload check with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=4, dsa_idxs=[0])\n+        dmas1 = \"txq0@%s;rxq1@%s\" % (wqs[0], wqs[1])\n+        dmas2 = \"txq0@%s;rxq1@%s\" % (wqs[2], wqs[3])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;rxq1@wq0.1]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq0.2;rxq1@wq0.3]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=256 --rxd=256 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1495,10 +1500,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 16: VM2VM split ring mergeable path and multi-queues test indirect descriptor and payload check with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas1 = \"txq0@%s;txq1@%s;rxq0@%s;rxq0@%s\" % (wqs[0], wqs[0], wqs[0], wqs[0])\n+        dmas2 = \"txq0@%s;txq1@%s;rxq0@%s;rxq0@%s\" % (wqs[1], wqs[1], wqs[1], wqs[1])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;txq1@wq0.0;rxq0@wq0.0;rxq0@wq0.0]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq0.1;txq1@wq0.1;rxq0@wq0.1;rxq0@wq0.1]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=256 --rxd=256 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1538,10 +1546,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 17: VM2VM split ring vectorized path and multi-queues payload check with vhost async operation and dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=4, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=4, dsa_idxs=[0])\n+        dmas1 = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[0], wqs[0], wqs[0], wqs[0])\n+        dmas2 = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[0], wqs[0], wqs[0], wqs[0])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;txq1@wq0.0;rxq0@wq0.0;rxq1@wq0.0]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq0.0;txq1@wq0.0;rxq0@wq0.0;rxq1@wq0.0]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1581,10 +1592,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 18: VM2VM packed ring non-mergeable path and multi-queues payload check with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas1 = \"txq0@%s;rxq1@%s\" % (wqs[0], wqs[0])\n+        dmas2 = \"txq0@%s;rxq1@%s\" % (wqs[1], wqs[1])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;rxq1@wq0.0]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq0.1;rxq1@wq0.1]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1624,11 +1638,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 19: VM2VM packed ring inorder non-mergeable path and multi-queues payload check with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0, 1])\n+        dmas1 = \"txq0@%s;rxq1@%s\" % (wqs[0], wqs[1])\n+        dmas2 = \"txq0@%s;rxq1@%s\" % (wqs[2], wqs[3])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;rxq1@wq0.1]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq1.0;rxq1@wq1.1]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1668,10 +1684,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 20: VM2VM packed ring mergeable path and multi-queues payload check with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dmas1 = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[0], wqs[0], wqs[1], wqs[1])\n+        dmas2 = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[1], wqs[1], wqs[0], wqs[0])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;txq1@wq0.0;rxq0@wq0.1;rxq1@wq0.1]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq0.1;txq1@wq0.1;rxq0@wq0.0;rxq1@wq0.0]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1711,11 +1730,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 21: VM2VM packed ring inorder mergeable path and multi-queues payload check with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=1, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=1, dsa_idxs=[0, 1])\n+        dmas1 = \"txq0@%s;rxq0@%s;rxq1@%s\" % (wqs[0], wqs[0], wqs[0])\n+        dmas2 = \"txq0@%s;txq1@%s;rxq1@%s\" % (wqs[1], wqs[1], wqs[1])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;rxq0@wq0.0;rxq1@wq0.0]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq1.0;txq1@wq1.0;rxq1@wq1.0]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1755,11 +1776,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 22: VM2VM packed ring vectorized-tx path and multi-queues test indirect descriptor and payload check with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0, 1])\n+        dmas1 = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[0], wqs[0], wqs[1], wqs[1])\n+        dmas2 = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[2], wqs[2], wqs[3], wqs[3])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;txq1@wq0.0;rxq0@wq0.1;rxq1@wq0.1]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq1.0;txq1@wq1.0;rxq0@wq1.1;rxq1@wq1.1]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1799,11 +1822,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 23: VM2VM packed ring vectorized path and multi-queues test indirect descriptor and payload check with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0, 1])\n+        dmas1 = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[0], wqs[0], wqs[1], wqs[1])\n+        dmas2 = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[2], wqs[2], wqs[3], wqs[3])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;txq1@wq0.0;rxq0@wq0.1;rxq1@wq0.1]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq1.0;txq1@wq1.0;rxq0@wq1.1;rxq1@wq1.1]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1843,11 +1868,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 24: VM2VM packed ring vectorized path payload check test with ring size is not power of 2 with dsa kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=1)\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0, 1])\n+        dmas1 = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[0], wqs[0], wqs[1], wqs[1])\n+        dmas2 = \"txq0@%s;txq1@%s;rxq0@%s;rxq1@%s\" % (wqs[2], wqs[2], wqs[3], wqs[3])\n         vhost_eal_param = (\n-            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[txq0@wq0.0;txq1@wq0.0;rxq0@wq0.1;rxq1@wq0.1]' \"\n-            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[txq0@wq1.0;txq1@wq1.0;rxq0@wq1.1;rxq1@wq1.1]'\"\n+            \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n+            \"--vdev 'eth_vhost1,iface=vhost-net1,queues=2,client=1,dmas=[%s]'\"\n+            % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n         self.start_vhost_testpmd(\n@@ -1887,18 +1914,18 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 25: VM2VM split ring mergeable path and multi-queues test indirect descriptor with dsa dpdk and kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1,\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1,\n             driver_name=\"vfio-pci\",\n-            dsa_index_list=[1],\n+            dsa_idxs=[1],\n             socket=self.port_socket,\n         )\n-        dmas1 = \"txq0@wq0.0;rxq0@wq0.0;rxq1@wq0.0\"\n+        dmas1 = \"txq0@%s;rxq0@%s;rxq1@%s\" % (wqs[0], wqs[0], wqs[0])\n         dmas2 = \"txq0@%s-q0;txq1@%s-q0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+            dsas[0],\n+            dsas[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -1906,13 +1933,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=256 --rxd=256 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=1\"}\n+        port_options = {dsas[0]: \"max_queues=1\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -1946,20 +1973,24 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 26: VM2VM packed ring inorder mergeable path and multi-queues payload check with dsa dpdk and kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1,\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1,\n             driver_name=\"vfio-pci\",\n-            dsa_index_list=[1],\n+            dsa_idxs=[1],\n             socket=self.port_socket,\n         )\n-        dmas1 = \"txq0@%s-q0;txq1@wq0.0;rxq0@%s-q0;rxq1@wq0.0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+        dmas1 = \"txq0@%s-q0;txq1@%s;rxq0@%s-q0;rxq1@%s\" % (\n+            dsas[0],\n+            wqs[0],\n+            dsas[0],\n+            wqs[0],\n         )\n-        dmas2 = \"txq0@wq0.0;txq1@%s-q0;rxq0@wq0.0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+        dmas2 = \"txq0@%s;txq1@%s-q0;rxq0@%s;rxq1@%s-q0\" % (\n+            wqs[0],\n+            dsas[0],\n+            wqs[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -1967,13 +1998,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=1\"}\n+        port_options = {dsas[0]: \"max_queues=1\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -2007,20 +2038,24 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         \"\"\"\n         Test Case 27: VM2VM packed ring vectorized-tx path test batch processing with dsa dpdk and kernel driver\n         \"\"\"\n-        self.DC.create_work_queue(work_queue_number=2, dsa_index=0)\n-        self.use_dsa_list = self.DC.bind_dsa_to_dpdk(\n-            dsa_number=1,\n+        wqs = self.DC.create_wq(wq_num=2, dsa_idxs=[0])\n+        dsas = self.DC.bind_dsa_to_dpdk_driver(\n+            dsa_num=1,\n             driver_name=\"vfio-pci\",\n-            dsa_index_list=[1],\n+            dsa_idxs=[1],\n             socket=self.port_socket,\n         )\n-        dmas1 = \"txq0@%s-q0;txq1@wq0.0;rxq0@%s-q0;rxq1@wq0.0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+        dmas1 = \"txq0@%s-q0;txq1@%s;rxq0@%s-q0;rxq1@%s\" % (\n+            dsas[0],\n+            wqs[0],\n+            dsas[0],\n+            wqs[0],\n         )\n-        dmas2 = \"txq0@wq0.0;txq1@%s-q0;rxq0@wq0.0;rxq1@%s-q0\" % (\n-            self.use_dsa_list[0],\n-            self.use_dsa_list[0],\n+        dmas2 = \"txq0@%s;txq1@%s-q0;rxq0@%s;rxq1@%s-q0\" % (\n+            wqs[0],\n+            dsas[0],\n+            wqs[0],\n+            dsas[0],\n         )\n         vhost_eal_param = (\n             \"--vdev 'eth_vhost0,iface=vhost-net0,queues=2,client=1,dmas=[%s]' \"\n@@ -2028,13 +2063,13 @@ class TestVM2VMVirtioUserDsa(TestCase):\n             % (dmas1, dmas2)\n         )\n         vhost_param = \"--nb-cores=1 --rxq=2 --txq=2 --txd=4096 --rxd=4096 --no-flush-rx\"\n-        port_options = {self.use_dsa_list[0]: \"max_queues=1\"}\n+        port_options = {dsas[0]: \"max_queues=1\"}\n         self.start_vhost_testpmd(\n             cores=self.vhost_core_list,\n             eal_param=vhost_eal_param,\n             param=vhost_param,\n             no_pci=False,\n-            ports=self.use_dsa_list,\n+            ports=dsas,\n             port_options=port_options,\n             iova_mode=\"va\",\n         )\n@@ -2072,8 +2107,6 @@ class TestVM2VMVirtioUserDsa(TestCase):\n         self.quit_all_testpmd()\n         self.dut.send_expect(\"killall -s INT %s\" % self.testpmd_name, \"#\")\n         self.dut.send_expect(\"killall -s INT %s\" % self.pdump_name, \"#\")\n-        self.DC.reset_all_work_queue()\n-        self.DC.bind_all_dsa_to_kernel()\n \n     def tear_down_all(self):\n         pass\ndiff --git a/tests/virtio_common.py b/tests/virtio_common.py\nindex 9ad75448..9754f49e 100644\n--- a/tests/virtio_common.py\n+++ b/tests/virtio_common.py\n@@ -237,90 +237,123 @@ class dsa_common(object):\n     def __init__(self, test_case):\n         self.test_case = test_case\n \n-    def get_all_work_queue_index(self):\n+    def get_all_dsa_pcis(self):\n+        \"\"\"\n+        Get all the DSA device PCI of DUT.\n+        :return: [0000:6a:01.0, 0000:6f:01.0, 0000:74:01.0, 0000:79:01.0]\n+        \"\"\"\n+        dsa_pcis = []\n+        out = self.test_case.dut.send_expect(\n+            \"./usertools/dpdk-devbind.py --status-dev dma\", \"#\"\n+        )\n+        info = out.split(\"\\n\")\n+        for item in info:\n+            pci = re.search(\"\\s*(0000:\\S*:\\d*.\\d*)\", item)\n+            if pci is not None:\n+                dsa_pcis.append(pci.group(1))\n+        dsa_pcis.sort()\n+        return dsa_pcis\n+\n+    def bind_dsa_to_kernel_driver(self, dsa_idx):\n+        \"\"\"\n+        Get the DSA device current driver\n+        \"\"\"\n+        dsa_pcis = self.get_all_dsa_pcis()\n+        pci = dsa_pcis[dsa_idx]\n+        addr_array = pci.split(\":\")\n+        domain_id, bus_id, devfun_id = addr_array[0], addr_array[1], addr_array[2]\n+        out = self.test_case.dut.send_expect(\n+            \"cat /sys/bus/pci/devices/%s\\:%s\\:%s/uevent\"\n+            % (domain_id, bus_id, devfun_id),\n+            \"# \",\n+            alt_session=True,\n+        )\n+        rexp = r\"DRIVER=(.+?)\\r\"\n+        pattern = re.compile(rexp)\n+        match = pattern.search(out)\n+        if not match:\n+            driver = None\n+        else:\n+            driver = match.group(1)\n+        if driver != \"idxd\":\n+            self.test_case.dut.send_expect(\n+                \"./usertools/dpdk-devbind.py --force --bind=idxd %s\" % pci, \"# \", 60\n+            )\n+\n+    def get_all_dsa_idxs(self):\n         \"\"\"\n         Get all DSA device work queue index.\n         Example: `wq0.0 wq0.1 wq1.0 wq1.1`, return [0, 1]\n         \"\"\"\n-        dsa_index_list = []\n+        dsa_idxs = []\n         if os.path.exists(\"/dev/dsa\"):\n             out = self.test_case.dut.send_expect(\"ls /dev/dsa\", \"# \")\n             info = out.split()\n             for item in info:\n-                index = int(re.search(\"(\\d+)\", item).group(0))\n-                dsa_index_list.append(index)\n-        return list(set(dsa_index_list))\n-\n-    def reset_all_work_queue(self):\n-        \"\"\"\n-        Reset all DSA device work queue which have created work queue.\n-        After reset all DSA device work queues, the `/dev/dsa/` path will not exist.\n-        \"\"\"\n-        dsa_index_list = self.get_all_work_queue_index()\n-        if len(dsa_index_list) > 0:\n-            for dsa_index in dsa_index_list:\n-                self.test_case.dut.send_expect(\n-                    \"./drivers/dma/idxd/dpdk_idxd_cfg.py --reset %s\" % dsa_index, \"# \"\n-                )\n+                idx = int(re.search(\"(\\d+)\", item).group(0))\n+                dsa_idxs.append(idx)\n+        return list(set(dsa_idxs))\n \n-    def check_dsa_has_work_queue(self, dsa_index):\n+    def check_wq_exist(self, dsa_idx):\n         \"\"\"\n         Check DSA device has work queue or not, if has work queue, return True, or return False\n         \"\"\"\n-        if dsa_index in self.get_all_work_queue_index():\n+        if dsa_idx in self.get_all_dsa_idxs():\n             return True\n         else:\n             return False\n \n-    def create_work_queue(self, work_queue_number, dsa_index):\n+    def reset_wq(self, dsa_idx):\n         \"\"\"\n-        Create work queue by work_queue_number and dsa_index.\n-        :param work_queue_number: number of work queue to be create.\n-        :param dsa_index: index of DSA device which to create work queue.\n-        Example: work_queue_number=4, dsa_index=0, will create 4 work queue under this first DSA device\n-        root@dpdk:~# ls /dev/dsa/\n-        wq0.0  wq0.1  wq0.2  wq0.3\n+        Reset DSA device work queue which have created work queue.\n         \"\"\"\n-        if self.check_dsa_has_work_queue(dsa_index=dsa_index):\n+        if self.check_wq_exist(dsa_idx):\n             self.test_case.dut.send_expect(\n-                \"./drivers/dma/idxd/dpdk_idxd_cfg.py --reset %s\" % dsa_index, \"# \"\n+                \"./drivers/dma/idxd/dpdk_idxd_cfg.py --reset %s\" % dsa_idx, \"# \"\n             )\n-        self.test_case.dut.send_expect(\n-            \"./drivers/dma/idxd/dpdk_idxd_cfg.py -q %d %d\"\n-            % (work_queue_number, dsa_index),\n-            \"# \",\n-        )\n \n-    def get_all_dsa_pci(self):\n+    def create_wq(self, wq_num, dsa_idxs):\n         \"\"\"\n-        Get all the DSA device PCI of DUT.\n-        :return: [0000:6a:01.0, 0000:6f:01.0, 0000:74:01.0, 0000:79:01.0]\n+        Create work queue by work_queue_number and dsa_idx.\n+        :param wq_num: number of work queue to be create.\n+        :param dsa_idxs: index of DSA device which to create work queue.\n+        Example: wq_num=4, dsa_idx=[0, 1], will create 4 work queue:\n+        root@dpdk:~# ls /dev/dsa/\n+        wq0.0  wq0.1  wq1.0  wq1.1\n         \"\"\"\n-        dsa_pci = []\n-        out = self.test_case.dut.send_expect(\n-            \"./usertools/dpdk-devbind.py --status-dev dma\", \"#\"\n-        )\n-        info = out.split(\"\\n\")\n-        for item in info:\n-            pci = re.search(\"\\s*(0000:\\S*:\\d*.\\d*)\", item)\n-            if pci is not None:\n-                dsa_pci.append(pci.group(1))\n-        return dsa_pci\n+        for dsa_idx in dsa_idxs:\n+            if self.check_wq_exist(dsa_idx):\n+                self.reset_wq(dsa_idx)\n+            self.bind_dsa_to_kernel_driver(dsa_idx)\n+            self.test_case.dut.send_expect(\n+                \"./drivers/dma/idxd/dpdk_idxd_cfg.py -q %d %d\" % (wq_num, dsa_idx),\n+                \"# \",\n+            )\n+        wqs = []\n+        if os.path.exists(\"/dev/dsa\"):\n+            out = self.test_case.dut.send_expect(\"ls /dev/dsa\", \"# \")\n+            info = out.split()\n+            for item in info:\n+                idx = int(re.search(\"(\\d+)\", item).group(0))\n+                if idx in dsa_idxs:\n+                    wqs.append(item)\n+        return wqs\n \n-    def bind_dsa_to_dpdk(\n-        self, dsa_number, driver_name=\"vfio-pci\", dsa_index_list=\"all\", socket=-1\n+    def bind_dsa_to_dpdk_driver(\n+        self, dsa_num, driver_name=\"vfio-pci\", dsa_idxs=\"all\", socket=-1\n     ):\n         \"\"\"\n         Bind DSA device to driver\n-        :param dsa_number: number of DSA device to be bind.\n+        :param dsa_num: number of DSA device to be bind.\n         :param driver_name: driver name, like `vfio-pci`.\n-        :param dsa_index_list: the index list of DSA device, like [2,3]\n+        :param dsa_idxs: the index list of DSA device, like [2,3]\n         :param socket: socket id: like 0 or 1, if socket=-1, use all the DSA deveice no matter on which socket.\n         :return: bind_dsa_list, like [0000:6a:01.0, 0000:6f:01.0]\n         \"\"\"\n-        dsa_list = []\n-        dsa_pci = self.get_all_dsa_pci()\n-        for pci in dsa_pci:\n+        dsas = []\n+        bind_dsas = []\n+        dsa_pcis = self.get_all_dsa_pcis()\n+        for pci in dsa_pcis:\n             addr_array = pci.split(\":\")\n             domain_id, bus_id, devfun_id = addr_array[0], addr_array[1], addr_array[2]\n             cur_socket = self.test_case.dut.send_expect(\n@@ -331,47 +364,21 @@ class dsa_common(object):\n             )\n             if socket != -1:\n                 if int(cur_socket) == socket:\n-                    dsa_list.append(pci)\n+                    dsas.append(pci)\n             else:\n-                dsa_list.append(pci)\n-        if dsa_index_list == \"all\":\n-            bind_dsa_list = dsa_list[0:dsa_number]\n+                dsas.append(pci)\n+        if dsa_idxs == \"all\":\n+            bind_dsas = dsas[0:dsa_num]\n         else:\n-            tmp_dsa_list = []\n-            for i in dsa_index_list:\n-                tmp_dsa_list.append(dsa_list[i])\n-            bind_dsa_list = tmp_dsa_list[0:dsa_number]\n-        bind_dsa_string = \" \".join(bind_dsa_list)\n+            tmp_dsas = []\n+            for i in dsa_idxs:\n+                tmp_dsas.append(dsas[i])\n+                bind_dsas = tmp_dsas[0:dsa_num]\n+        bind_dsas_str = \" \".join(bind_dsas)\n         self.test_case.dut.send_expect(\n             \"./usertools/dpdk-devbind.py --force --bind=%s %s\"\n-            % (driver_name, bind_dsa_string),\n+            % (driver_name, bind_dsas_str),\n             \"# \",\n             60,\n         )\n-        return bind_dsa_list\n-\n-    def bind_all_dsa_to_kernel(self):\n-        \"\"\"\n-        Check the DSA device is bind to kernel driver or not, if not bind to kernel driver, then bind to kernel driver.\n-        \"\"\"\n-        dsa_pci = self.get_all_dsa_pci()\n-        for pci in dsa_pci:\n-            addr_array = pci.split(\":\")\n-            domain_id, bus_id, devfun_id = addr_array[0], addr_array[1], addr_array[2]\n-            out = self.test_case.dut.send_expect(\n-                \"cat /sys/bus/pci/devices/%s\\:%s\\:%s/uevent\"\n-                % (domain_id, bus_id, devfun_id),\n-                \"# \",\n-                alt_session=True,\n-            )\n-            rexp = r\"DRIVER=(.+?)\\r\"\n-            pattern = re.compile(rexp)\n-            match = pattern.search(out)\n-            if not match:\n-                driver = None\n-            else:\n-                driver = match.group(1)\n-            if driver != \"idxd\":\n-                self.test_case.dut.send_expect(\n-                    \"./usertools/dpdk-devbind.py --force --bind=idxd %s\" % pci, \"# \", 60\n-                )\n+        return bind_dsas\n",
    "prefixes": [
        "V1"
    ]
}