Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/106555/?format=api
http://patches.dpdk.org/api/patches/106555/?format=api", "web_url": "http://patches.dpdk.org/project/dts/patch/20220126074748.2828-1-junx.dong@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": "<20220126074748.2828-1-junx.dong@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dts/20220126074748.2828-1-junx.dong@intel.com", "date": "2022-01-26T07:47:48", "name": "[V3] framework/*: Modified create_eal_parameters API to support flexibility", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "7d1774de15737474a59cb4bee50b1930b2fd2fcc", "submitter": { "id": 2237, "url": "http://patches.dpdk.org/api/people/2237/?format=api", "name": "Jun Dong", "email": "junx.dong@intel.com" }, "delegate": null, "mbox": "http://patches.dpdk.org/project/dts/patch/20220126074748.2828-1-junx.dong@intel.com/mbox/", "series": [ { "id": 21374, "url": "http://patches.dpdk.org/api/series/21374/?format=api", "web_url": "http://patches.dpdk.org/project/dts/list/?series=21374", "date": "2022-01-26T07:47:48", "name": "[V3] framework/*: Modified create_eal_parameters API to support flexibility", "version": 3, "mbox": "http://patches.dpdk.org/series/21374/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/106555/comments/", "check": "success", "checks": "http://patches.dpdk.org/api/patches/106555/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 DCCDAA04A7;\n\tWed, 26 Jan 2022 08:47:57 +0100 (CET)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id AE61C42702;\n\tWed, 26 Jan 2022 08:47:57 +0100 (CET)", "from mga02.intel.com (mga02.intel.com [134.134.136.20])\n by mails.dpdk.org (Postfix) with ESMTP id 021914069D\n for <dts@dpdk.org>; Wed, 26 Jan 2022 08:47:55 +0100 (CET)", "from fmsmga003.fm.intel.com ([10.253.24.29])\n by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 25 Jan 2022 23:47:54 -0800", "from shwdenpg197.ccr.corp.intel.com ([10.253.109.35])\n by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 25 Jan 2022 23:47:53 -0800" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1643183276; x=1674719276;\n h=from:to:cc:subject:date:message-id:mime-version:\n content-transfer-encoding;\n bh=/fBow6yuu4FZtUDpzlop5rnZh6KZVHZf22MXucQKStQ=;\n b=YLB6rs425eFOlpsewneBntkl7HCLvzZ7YFRIg/2rAmsVA3kQejOOAjVL\n ICGdpwm5ZGybdLRrTJX+o1S+0lSPu2MIU3/lItM1VxZZquS+pGZSi61Sf\n t9uQJKIGJkcFVEr5Xskj1OJZ/JR+MAdpcacZ3KBxr5CILs29hjmqj2HOG\n VZx9ooEJPInCpMM0g0c5MfiOEJvPBXrZyG3YH6K1bWuFD71YZ2yTKn88V\n RfOoTEP+FJZQiYRfVFZtKoUg1X7lOHiP8wB+BArhA9nYzMYclni06u1cy\n johx7VhSWnZDpyZbrhKeEUUGbR7dZl3np3erbgB2Hk1T/6dzY3geSMak7 g==;", "X-IronPort-AV": [ "E=McAfee;i=\"6200,9189,10238\"; a=\"233874449\"", "E=Sophos;i=\"5.88,317,1635231600\"; d=\"scan'208\";a=\"233874449\"", "E=Sophos;i=\"5.88,317,1635231600\"; d=\"scan'208\";a=\"617889251\"" ], "From": "Jun Dong <junx.dong@intel.com>", "To": "dts@dpdk.org", "Cc": "lijuan.tu@intel.com,\n\tqingx.sun@intel.com,\n\tjunx.dong@intel.com", "Subject": "[dts][V3] framework/*: Modified create_eal_parameters API to support\n flexibility", "Date": "Wed, 26 Jan 2022 15:47:48 +0800", "Message-Id": "<20220126074748.2828-1-junx.dong@intel.com>", "X-Mailer": "git-send-email 2.33.1.windows.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": "From: DongJunX <junx.dong@intel.com>\n\n- Refactoring API for easy maintenance.\n- Format the output format of the continuous cores list.\n- Append user defined eal parameters.\n\nSigned-off-by: Jun Dong <junx.dong@intel.com>\n---\n framework/dut.py | 339 ++++++++++++++++++++++++----------------\n framework/pmd_output.py | 6 +-\n 2 files changed, 208 insertions(+), 137 deletions(-)", "diff": "diff --git a/framework/dut.py b/framework/dut.py\nindex dc3fc874..90c43b19 100644\n--- a/framework/dut.py\n+++ b/framework/dut.py\n@@ -117,137 +117,209 @@ class Dut(Crb):\n \n def create_eal_parameters(self, fixed_prefix=False, socket=-1, **config):\n \"\"\"\n- generate eal parameters character string\n- :param config:\n- :return: eal_str eg:'-c 0xf -a 0000:88:00.0 -a 0000:88:00.1 --file-prefix=dpdk_1112_20190809143420',\n- if dpdk version < 20.11-rc4, eal_str eg: '-c 0xf -w 0000:88:00.0 --file-prefix=dpdk_1112_20190809143420',\n- \"\"\"\n- default_cores = '1S/2C/1T'\n- blank = ' '\n- os_type = self.get_os_type()\n- if config:\n- # deal with cores\n- if 'cores' in config:\n- if type(config['cores']) == list:\n- core_list = config['cores']\n- elif isinstance(config['cores'], str):\n- if config['cores'] == '' or config['cores'].lower() == 'default':\n- core_list = self.get_core_list(default_cores)\n- else:\n- core_list = self.get_core_list(config['cores'], socket=socket)\n- else:\n- core_list = self.get_core_list(default_cores)\n-\n- # deal with ports\n- w_pci_list = []\n- if 'ports' in config and len(config['ports']) != 0:\n- allow_option = '-a' if self.dpdk_version > '20.11.0-rc3' or self.dpdk_version == '20.11.0' else '-w'\n- for port in config['ports']:\n- if type(port) == int:\n- if 'port_options' in config and port in list(config['port_options'].keys()):\n- port_option = config['port_options'][port]\n- w_pci_list.append('%s %s,%s' % (allow_option, self.ports_info[port]['pci'], port_option))\n+ generate eal parameters character string;\n+ :param fixed_prefix: use fixed file-prefix or not, when it is true,\n+ the file-prefix will not be added a timestamp\n+ :param socket: the physical CPU socket index, -1 means no care cpu socket;\n+ :param config: kwargs user defined eal parameters, eg:\n+ sub param cores: set the core info, eg:\n+ cores=[0,1,2,3],\n+ cores='default',\n+ cores='1S/4C/1T',\n+ cores='all';\n+ sub param ports: set PCI allow list, eg:\n+ ports=['0000:1a:00.0', '0000:1a:00.1'],\n+ ports=[0, 1];\n+ sub param port_options: set options of port, eg:\n+ port_options={'0000:1a:00.0': \"proto_xtr=vlan\"},\n+ port_options={0: \"cap=dcf\"};\n+ sub param prefix: set file prefix string, eg:\n+ prefix='vf';\n+ sub param no_pci: switch of disable PCI bus eg:\n+ no_pci=True;\n+ sub param b_ports: skip probing a PCI device to prevent EAL from using it, eg:\n+ b_ports=['0000:1a:00.0'],\n+ b_ports=[0];\n+ sub param vdevs: virtual device list, eg:\n+ vdevs=['net_ring0', 'net_ring1'];\n+ sub param other_eal_param: user defined DPDK eal parameters, eg:\n+ other_eal_param='--single-file-segments';\n+ :return: eal param string, eg:\n+ '-c 0xf -a 0000:88:00.0 --file-prefix=dpdk_1112_20190809143420';\n+ if DPDK version < 20.11-rc4, eal_str eg:\n+ '-c 0xf -w 0000:88:00.0 --file-prefix=dpdk_1112_20190809143420';\n+ \"\"\"\n+\n+ class _EalParameter(object):\n+ def __init__(self, _dut, _fixed_prefix, _socket, _config=None):\n+ self.BLANK = ' '\n+ self.config = _config if _config is not None else dict()\n+ self.os_type = _dut.get_os_type()\n+ self.fixed_prefix = _fixed_prefix\n+ self.socket = _socket\n+ self.dut = _dut\n+\n+ def _make_cores_param(self):\n+ is_use_default_cores = 'cores' not in self.config \\\n+ or self.config['cores'] == '' \\\n+ or isinstance(self.config['cores'], str) \\\n+ and self.config['cores'].lower() == 'default'\n+ if is_use_default_cores:\n+ default_cores = '1S/2C/1T'\n+ core_list = self.dut.get_core_list(default_cores)\n+ else:\n+ core_list = self._get_cores_from_config()\n+\n+ def _get_consecutive_cores_range(_cores: list):\n+ _formated_core_list = []\n+ _tmp_cores_list = list(sorted(map(int, _cores)))\n+ _segment = _tmp_cores_list[:1]\n+ for _core_num in _tmp_cores_list[1:]:\n+ if _core_num - _segment[-1] == 1:\n+ _segment.append(_core_num)\n else:\n- w_pci_list.append('%s %s' % (allow_option, self.ports_info[port]['pci']))\n- else:\n- if 'port_options' in config and port in list(config['port_options'].keys()):\n- port_option = config['port_options'][port]\n- w_pci_list.append('%s %s,%s' % (allow_option, port, port_option))\n+ _formated_core_list.append(\n+ f'{_segment[0]}-{_segment[-1]}' if len(_segment) > 1 else f'{_segment[0]}')\n+ _index = _tmp_cores_list.index(_core_num)\n+ _formated_core_list.extend(_get_consecutive_cores_range(_tmp_cores_list[_index:]))\n+ _segment.clear()\n+ break\n+ if len(_segment) > 0:\n+ _formated_core_list.append(\n+ f'{_segment[0]}-{_segment[-1]}' if len(_segment) > 1 else f'{_segment[0]}')\n+ return _formated_core_list\n+\n+ return f'-l {\", \".join(_get_consecutive_cores_range(core_list))}'\n+\n+ def _make_memory_channels(self):\n+ param_template = '-n {}'\n+ return param_template.format(self.dut.get_memory_channels())\n+\n+ def _make_ports_param(self):\n+ if 'ports' in self.config and len(self.config['ports']) != 0:\n+ return self._get_ports_and_wraped_port_with_port_options()\n+ else:\n+ return self._make_default_ports_param()\n+\n+ def _make_default_ports_param(self):\n+ pci_list = []\n+ allow_option = self._make_allow_option()\n+ if len(self.dut.ports_info) != 0:\n+ for port_info in self.dut.ports_info:\n+ pci_list.append('%s %s' % (allow_option, port_info['pci']))\n+ self.dut.logger.info(pci_list)\n+ return ' '.join(pci_list)\n+\n+ def _make_b_ports_param(self):\n+ b_pci_list = []\n+ if 'b_ports' in self.config and len(self.config['b_ports']) != 0:\n+ for port in self.config['b_ports']:\n+ if type(port) == int:\n+ b_pci_list.append('-b %s' % self.dut.ports_info[port]['pci'])\n else:\n- w_pci_list.append('%s %s' % (allow_option, port))\n- w_pci_str = ' '.join(w_pci_list)\n-\n- # deal with block ports\n- b_pci_list = []\n- if 'b_ports' in config and len(config['b_ports']) != 0:\n- for port in config['b_ports']:\n- if type(port) == int:\n- b_pci_list.append('-b %s' % self.ports_info[port]['pci'])\n- else:\n- b_pci_list = ['-b %s' % pci for pci in config['b_ports']]\n- b_ports_str = ' '.join(b_pci_list)\n+ b_pci_list = ['-b %s' % pci for pci in self.config['b_ports']]\n+ return ' '.join(b_pci_list)\n \n- # deal with no-pci\n- if 'no_pci' in config:\n- if config['no_pci'] == True:\n- no_pci = '--no-pci'\n+ def _make_no_pci_param(self):\n+ if 'no_pci' in self.config and self.config['no_pci'] is True:\n+ return '--no-pci'\n else:\n- no_pci = ''\n- else:\n- no_pci = ''\n+ return ''\n \n- # deal with file prefix\n- if 'prefix' in config and config['prefix'] != '':\n- if fixed_prefix == True:\n- file_prefix = config['prefix']\n+ def _make_prefix_param(self):\n+ is_prefix_param_available = 'prefix' in self.config and self.config['prefix'] != ''\n+ if is_prefix_param_available:\n+ if self.fixed_prefix is True:\n+ fixed_file_prefix = self.config['prefix']\n+ else:\n+ fixed_file_prefix = self.config['prefix'] + '_' + self.dut.prefix_subfix\n else:\n- file_prefix = config['prefix'] + '_' + self.prefix_subfix\n- else:\n- file_prefix = 'dpdk' + '_' + self.prefix_subfix\n- if file_prefix not in self.prefix_list:\n- self.prefix_list.append(file_prefix)\n+ fixed_file_prefix = 'dpdk' + '_' + self.dut.prefix_subfix\n+ fixed_file_prefix = self._do_os_handle_with_prefix_param(fixed_file_prefix)\n+ fixed_file_prefix = '--file-prefix=' + fixed_file_prefix\n+ return fixed_file_prefix\n+\n+ def _make_vdevs_param(self):\n+ if 'vdevs' in self.config and len(self.config['vdevs']) != 0:\n+ _vdevs = ['--vdev ' + vdev for vdev in self.config['vdevs']]\n+ return ' '.join(_vdevs)\n+ else:\n+ return ''\n+\n+ def _make_share_library_path_param(self):\n+ use_shared_lib = settings.load_global_setting(settings.HOST_SHARED_LIB_SETTING)\n+ shared_lib_path = settings.load_global_setting(settings.HOST_SHARED_LIB_PATH)\n+ if use_shared_lib == 'true' and shared_lib_path and 'Virt' not in str(self.dut):\n+ return ' -d {} '.format(shared_lib_path)\n+ return ''\n+\n+ def _make_default_force_max_simd_bitwidth_param(self):\n+ rx_mode = settings.load_global_setting(settings.DPDK_RXMODE_SETTING)\n+ build_type = settings.load_global_setting(settings.HOST_BUILD_TYPE_SETTING)\n+ param_template = ' --force-max-simd-bitwidth=%s '\n+ bitwith_dict = {'novector': '64', 'sse': '128', 'avx2': '256', 'avx512': '512', 'nolimit': '0'}\n+ if build_type == 'meson' and rx_mode in bitwith_dict and \\\n+ 'force-max-simd-bitwidth' not in self.config.get('other_eal_param', ''):\n+ return param_template % bitwith_dict.get(rx_mode)\n+ else:\n+ return ''\n+\n+ def _get_cores_from_config(self):\n+ if type(self.config['cores']) == list:\n+ return self.config['cores']\n+ elif isinstance(self.config['cores'], str):\n+ return self.dut.get_core_list(self.config['cores'], socket=self.socket)\n+\n+ def _get_ports_and_wraped_port_with_port_options(self):\n+ w_pci_list = []\n+ for port in self.config['ports']:\n+ w_pci_list.append(self._add_port_options_to(port))\n+ return ' '.join(w_pci_list)\n+\n+ def _add_port_options_to(self, port):\n+ allow_option = self._make_allow_option()\n+ port_mac_addr = self.dut.ports_info[port]['pci'] if type(port) == int else port\n+ port_param = '%s %s' % (allow_option, port_mac_addr)\n+ port_option = self._get_port_options_from_config(port)\n+ if port_option:\n+ port_param = f'{port_param},{port_option}'\n+ return port_param\n+\n+ def _get_port_options_from_config(self, port):\n+ if 'port_options' in self.config and port in list(self.config['port_options'].keys()):\n+ return self.config['port_options'][port]\n+ else:\n+ return ''\n \n- # deal with vdev\n- if 'vdevs' in config and len(config['vdevs']) != 0:\n- vdev = '--vdev ' + ' --vdev '.join(config['vdevs'])\n- else:\n- vdev = ''\n-\n- if os_type == 'freebsd':\n- eal_str = '-l ' + ','.join(map(str, core_list)) \\\n- + blank + '-n %d' % self.get_memory_channels() \\\n- + blank + w_pci_str \\\n- + blank + b_ports_str \\\n- + blank + no_pci \\\n- + blank + vdev\n- self.prefix_list = []\n- else:\n- eal_str = '-l ' + ','.join(map(str, core_list)) \\\n- + blank + '-n %d' % self.get_memory_channels() \\\n- + blank + w_pci_str \\\n- + blank + b_ports_str \\\n- + blank + '--file-prefix=' + file_prefix \\\n- + blank + no_pci \\\n- + blank + vdev\n- else:\n- allow_option = '-a' if self.dpdk_version > '20.11.0-rc3' or self.dpdk_version == '20.11.0' else '-w'\n- # get pci from ports_info\n- pci_list = []\n- if len(self.ports_info) != 0:\n- for port_info in self.ports_info:\n- pci_list.append('%s %s' % (allow_option, port_info['pci']))\n- self.logger.info(pci_list)\n- pci_str = ' '.join(pci_list)\n- # default cores '1S/2C/1T'\n- core_list = self.get_core_list(default_cores)\n- file_prefix = 'dpdk' + '_' + self.prefix_subfix\n- self.prefix_list.append(file_prefix)\n- if os_type == 'freebsd':\n- eal_str = '-l ' + ','.join(map(str, core_list)) \\\n- + blank + '-n %d' % self.get_memory_channels() \\\n- + blank + pci_str\n- self.prefix_list = []\n- else:\n- eal_str = '-l ' + ','.join(map(str, core_list)) \\\n- + blank + '-n %d' % self.get_memory_channels() \\\n- + blank + pci_str \\\n- + blank + '--file-prefix=' + file_prefix\n- use_shared_lib = settings.load_global_setting(settings.HOST_SHARED_LIB_SETTING)\n- shared_lib_path = settings.load_global_setting(settings.HOST_SHARED_LIB_PATH)\n- if use_shared_lib == 'true' and shared_lib_path and 'Virt' not in str(self):\n- eal_str = eal_str + ' -d {} '.format(shared_lib_path)\n- rx_mode = settings.load_global_setting(settings.DPDK_RXMODE_SETTING)\n- build_type = settings.load_global_setting(settings.HOST_BUILD_TYPE_SETTING)\n- if build_type == 'meson' and ('other_eal_param' not in config or\n- 'force-max-simd-bitwidth' not in config['other_eal_param']):\n- if rx_mode == 'novector':\n- eal_str = eal_str + ' --force-max-simd-bitwidth=64 '\n- elif rx_mode == 'sse':\n- eal_str = eal_str + ' --force-max-simd-bitwidth=128 '\n- elif rx_mode == 'avx2':\n- eal_str = eal_str + ' --force-max-simd-bitwidth=256 '\n- elif rx_mode == 'avx512':\n- eal_str = eal_str + ' --force-max-simd-bitwidth=512 '\n+ def _make_allow_option(self):\n+ is_new_dpdk_version = self.dut.dpdk_version > '20.11.0-rc3' or self.dut.dpdk_version == '20.11.0'\n+ return '-a' if is_new_dpdk_version else '-w'\n+\n+ def _do_os_handle_with_prefix_param(self, file_prefix):\n+ if self.dut.get_os_type() == 'freebsd':\n+ self.dut.prefix_list = []\n+ file_prefix = ''\n+ else:\n+ self.dut.prefix_list.append(file_prefix)\n+ return file_prefix\n+\n+ def make_eal_param(self):\n+ _eal_str = self.BLANK.join([self._make_cores_param(),\n+ self._make_memory_channels(),\n+ self._make_ports_param(),\n+ self._make_b_ports_param(),\n+ self._make_prefix_param(),\n+ self._make_no_pci_param(),\n+ self._make_vdevs_param(),\n+ self._make_share_library_path_param(),\n+ self._make_default_force_max_simd_bitwidth_param(),\n+ # append user defined eal parameters\n+ self.config.get('other_eal_param', '')\n+ ])\n+ return _eal_str\n+\n+ eal_parameter_creator = _EalParameter(self, fixed_prefix, socket, config)\n+ eal_str = eal_parameter_creator.make_eal_param()\n \n return eal_str\n \n@@ -556,7 +628,6 @@ class Dut(Crb):\n total_numa_nodes = len(numa_nodes)\n self.logger.info(numa_nodes)\n \n-\n force_socket = False\n \n if int(hugepages_size) < (1024 * 1024):\n@@ -578,7 +649,7 @@ class Dut(Crb):\n arch_huge_pages = hugepages if hugepages > 0 else 2048\n \n if total_huge_pages != arch_huge_pages:\n- if total_numa_nodes == -1 :\n+ if total_numa_nodes == -1:\n self.set_huge_pages(arch_huge_pages)\n else:\n # before all hugepage average distribution by all socket,\n@@ -749,7 +820,7 @@ class Dut(Crb):\n for portid in range(len(self.ports_info)):\n if self.ports_info[portid]['source'] == 'cfg':\n if (socket is None or\n- self.ports_info[portid]['numa'] == -1 or\n+ self.ports_info[portid]['numa'] == -1 or\n socket == self.ports_info[portid]['numa']):\n ports.append(portid)\n return ports\n@@ -760,7 +831,7 @@ class Dut(Crb):\n if port_info['type'] == NICS[nic_type]:\n # match numa or none numa awareness\n if (socket is None or\n- port_info['numa'] == -1 or\n+ port_info['numa'] == -1 or\n socket == port_info['numa']):\n # port has link,\n if self.tester.get_local_port(portid) != -1:\n@@ -913,7 +984,7 @@ class Dut(Crb):\n ipv6 = \"Not connected\"\n \n out = self.send_expect(\"ip -family inet address show dev %s | awk '/inet/ { print $2 }'\"\n- % intf, \"# \")\n+ % intf, \"# \")\n ipv4 = out.split('/')[0]\n \n port_info['ipv6'] = ipv6\n@@ -992,7 +1063,7 @@ class Dut(Crb):\n port_info['port'] = port\n \n self.logger.info(\"DUT cached: [%s %s] %s\" % (port_info['pci'],\n- port_info['type'], port_info['intf']))\n+ port_info['type'], port_info['intf']))\n \n def scan_ports_uncached(self):\n \"\"\"\n@@ -1056,7 +1127,7 @@ class Dut(Crb):\n self.ports_info = []\n \n skipped = RED('Skipped: Unknown/not selected')\n- \n+\n for (pci_bus, pci_id) in self.pci_devices_info:\n \n if not settings.accepted_nic(pci_id):\n@@ -1068,7 +1139,7 @@ class Dut(Crb):\n bus_id = addr_array[1]\n devfun_id = addr_array[2]\n port = GetNicObj(self, domain_id, bus_id, devfun_id)\n- port.pci_id= pci_id\n+ port.pci_id = pci_id\n port.name = settings.get_nic_name(pci_id)\n port.default_driver = settings.get_nic_driver(pci_id)\n intf = port.get_interface_name()\n@@ -1095,7 +1166,7 @@ class Dut(Crb):\n \n # store the port info to port mapping\n self.ports_info.append({'port': port, 'pci': pci_str, 'type': pci_id, 'intf':\n- intf, 'mac': macaddr, 'ipv6': ipv6, 'numa': -1})\n+ intf, 'mac': macaddr, 'ipv6': ipv6, 'numa': -1})\n \n def setup_virtenv(self, virttype):\n \"\"\"\n@@ -1145,7 +1216,7 @@ class Dut(Crb):\n vflist = []\n port_driver = port.get_nic_driver()\n if 'sriov_vfs_pci' in self.ports_info[port_id] and \\\n- self.ports_info[port_id]['sriov_vfs_pci']:\n+ self.ports_info[port_id]['sriov_vfs_pci']:\n vflist = self.ports_info[port_id]['sriov_vfs_pci']\n else:\n if not port.get_sriov_vfs_pci():\ndiff --git a/framework/pmd_output.py b/framework/pmd_output.py\nindex 113e85f6..da2b0de3 100644\n--- a/framework/pmd_output.py\n+++ b/framework/pmd_output.py\n@@ -139,17 +139,17 @@ class PmdOutput():\n config['cores'] = cores\n if ' -w ' not in eal_param and ' -a ' not in eal_param and ' -b ' not in eal_param \\\n and 'ports' not in config and 'b_ports' not in config and ' --no-pci ' not in eal_param \\\n- and ( 'no_pci' not in config or ('no_pci' in config and config['no_pci'] != True)):\n+ and ('no_pci' not in config or ('no_pci' in config and config['no_pci'] != True)):\n config['ports'] = [self.dut.ports_info[i]['pci'] for i in range(len(self.dut.ports_info))]\n part_eal_param = self.dut.create_eal_parameters(fixed_prefix=fixed_prefix, socket=socket, **config)\n- all_eal_param = part_eal_param + ' ' + eal_param\n+ all_eal_param = part_eal_param\n \n app_name = self.dut.apps_name['test-pmd']\n command = app_name + \" %s -- -i %s\" % (all_eal_param, param)\n command = command.replace(' ', ' ')\n if self.session != self.dut:\n self.session.send_expect(\"cd %s\" % self.dut.base_dir, \"# \")\n- timeout = config.get('timeout',120)\n+ timeout = config.get('timeout', 120)\n out = self.session.send_expect(command, expected, timeout)\n self.command = command\n # wait 10s to ensure links getting up before test start.\n", "prefixes": [ "V3" ] }{ "id": 106555, "url": "