Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/124853/?format=api
http://patches.dpdk.org/api/patches/124853/?format=api", "web_url": "http://patches.dpdk.org/project/dts/patch/20230308113104.10562-1-tadhg.kearney@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": "<20230308113104.10562-1-tadhg.kearney@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dts/20230308113104.10562-1-tadhg.kearney@intel.com", "date": "2023-03-08T11:31:04", "name": "[V1] tests/power_empty_poll: remove power_empty_poll test", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "e4b680d7e969d36b83fcc6bca9fa1a1d7111810d", "submitter": { "id": 2533, "url": "http://patches.dpdk.org/api/people/2533/?format=api", "name": "Tadhg Kearney", "email": "tadhg.kearney@intel.com" }, "delegate": null, "mbox": "http://patches.dpdk.org/project/dts/patch/20230308113104.10562-1-tadhg.kearney@intel.com/mbox/", "series": [ { "id": 27283, "url": "http://patches.dpdk.org/api/series/27283/?format=api", "web_url": "http://patches.dpdk.org/project/dts/list/?series=27283", "date": "2023-03-08T11:31:04", "name": "[V1] tests/power_empty_poll: remove power_empty_poll test", "version": 1, "mbox": "http://patches.dpdk.org/series/27283/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/124853/comments/", "check": "warning", "checks": "http://patches.dpdk.org/api/patches/124853/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 D92E441E1F;\n\tWed, 8 Mar 2023 12:31:20 +0100 (CET)", "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id B2D6D40FAE;\n\tWed, 8 Mar 2023 12:31:20 +0100 (CET)", "from mga01.intel.com (mga01.intel.com [192.55.52.88])\n by mails.dpdk.org (Postfix) with ESMTP id 22ABB40ED6\n for <dts@dpdk.org>; Wed, 8 Mar 2023 12:31:18 +0100 (CET)", "from orsmga003.jf.intel.com ([10.7.209.27])\n by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 08 Mar 2023 03:31:17 -0800", "from silpixa00401183.ir.intel.com ([10.55.128.41])\n by orsmga003.jf.intel.com with ESMTP; 08 Mar 2023 03:31:15 -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=1678275079; x=1709811079;\n h=from:to:cc:subject:date:message-id:mime-version:\n content-transfer-encoding;\n bh=zgupdfo67RAlgKVvIMCUWQsP5CxwtnMQXgv761mi8+U=;\n b=SMgnbL8Jc7+B3+yZGe3lAid2G8FeCdIIYa2ItxP3mU3FtF9yepQcbGEz\n KN+GQIPJt1XBoBCzspqjWcYLgzL5fcEvCOOaDfnk2t7L3QCNOXgkgQaU9\n ZFKO/PK/rTixH8qJQa0rKA3AXkgKtyaxvdOdlaLjk569Z40DiKjrK3tyK\n VoQqyEON31IREyKMK3UvklX+rrzgBKaT7eg++Q0KJSTBebPJSgExL0vUn\n +K+O+aoNViTkst6DLRpUp0r8fKsZZVN+S/8LDtNWwMqozdew11iIwTFA0\n BNEi2ibAlRngzNnzpE6W4jLuvcFOZHqF+JoyzGOXcD3Vv2twhshiKQJQJ g==;", "X-IronPort-AV": [ "E=McAfee;i=\"6500,9779,10642\"; a=\"363765824\"", "E=Sophos;i=\"5.98,243,1673942400\"; d=\"scan'208\";a=\"363765824\"", "E=McAfee;i=\"6500,9779,10642\"; a=\"626884915\"", "E=Sophos;i=\"5.98,243,1673942400\"; d=\"scan'208\";a=\"626884915\"" ], "X-ExtLoop1": "1", "From": "Tadhg Kearney <tadhg.kearney@intel.com>", "To": "dts@dpdk.org", "Cc": "reshma.pattan@intel.com,\n\tTadhg Kearney <tadhg.kearney@intel.com>", "Subject": "[dts][PATCH V1] tests/power_empty_poll: remove power_empty_poll test", "Date": "Wed, 8 Mar 2023 11:31:04 +0000", "Message-Id": "<20230308113104.10562-1-tadhg.kearney@intel.com>", "X-Mailer": "git-send-email 2.34.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": "The experimental empty poll API has been removed from the power\nmanagement library in DPDK 22.03. Removing test that tested it's\nfunctionality.\n\nSigned-off-by: Tadhg Kearney <tadhg.kearney@intel.com>\n---\n tests/TestSuite_power_empty_poll.py | 437 ----------------------------\n 1 file changed, 437 deletions(-)\n delete mode 100644 tests/TestSuite_power_empty_poll.py", "diff": "diff --git a/tests/TestSuite_power_empty_poll.py b/tests/TestSuite_power_empty_poll.py\ndeleted file mode 100644\nindex 6db9d054..00000000\n--- a/tests/TestSuite_power_empty_poll.py\n+++ /dev/null\n@@ -1,437 +0,0 @@\n-# SPDX-License-Identifier: BSD-3-Clause\n-# Copyright(c) 2010-2020 Intel Corporation\n-#\n-\n-\"\"\"\n-DPDK Test suite.\n-power empty poll test suite.\n-\"\"\"\n-import os\n-import time\n-import traceback\n-from copy import deepcopy\n-from pprint import pformat\n-\n-from framework.exception import VerifyFailure\n-from framework.packet import Packet\n-from framework.pktgen import TRANSMIT_CONT\n-from framework.settings import HEADER_SIZE, PKTGEN_TREX\n-from framework.test_case import TestCase\n-from framework.utils import create_mask as dts_create_mask\n-\n-\n-class TestPowerEmptyPoll(TestCase):\n- TRAIN = \"train\"\n- NOTRAIN = \"no-train\"\n- MED = \"med_threshold\"\n- HIGH = \"high_threshold\"\n-\n- @property\n- def target_dir(self):\n- # get absolute directory of target source code\n- target_dir = (\n- \"/root\" + self.dut.base_dir[1:]\n- if self.dut.base_dir.startswith(\"~\")\n- else self.dut.base_dir\n- )\n- return target_dir\n-\n- @property\n- def is_use_trex(self):\n- return (\n- hasattr(self.tester, \"is_pktgen\")\n- and self.tester.is_pktgen\n- and self.tester.pktgen.pktgen_type == PKTGEN_TREX\n- )\n-\n- def d_con(self, cmd):\n- _cmd = [cmd, \"# \", 10] if isinstance(cmd, str) else cmd\n- return self.dut.send_expect(*_cmd)\n-\n- def d_a_con(self, cmd):\n- _cmd = [cmd, \"# \", 10] if isinstance(cmd, str) else cmd\n- return self.dut.alt_session.send_expect(*_cmd)\n-\n- def prepare_binary(self, name):\n- example_dir = \"examples/\" + name\n- out = self.dut.build_dpdk_apps(\"./\" + example_dir)\n- return os.path.join(self.target_dir, self.dut.apps_name[os.path.basename(name)])\n-\n- def get_cores_mask(self, cores_list):\n- return dts_create_mask(cores_list)\n-\n- def add_stream_to_pktgen(self, txport, rxport, send_pkts, option):\n- stream_ids = []\n- cnt = 0\n- for pkt in send_pkts:\n- _option = deepcopy(option)\n- _option[\"pcap\"] = pkt\n- stream_id = self.tester.pktgen.add_stream(txport, rxport, pkt)\n- self.tester.pktgen.config_stream(stream_id, _option)\n- stream_ids.append(stream_id)\n- # rxport -> txport\n- stream_id = self.tester.pktgen.add_stream(rxport, txport, pkt)\n- self.tester.pktgen.config_stream(stream_id, _option)\n- stream_ids.append(stream_id)\n- cnt += 1\n- return stream_ids\n-\n- def run_traffic(self, option):\n- txport = self.tester.get_local_port(self.dut_ports[0])\n- rxport = self.tester.get_local_port(self.dut_ports[1])\n- stm_type = option.get(\"stm_types\")\n- rate_percent = option.get(\"rate\", float(100))\n- duration = option.get(\"duration\", 10)\n- send_pkts = self.set_stream(stm_type)\n- # clear streams before add new streams\n- self.tester.pktgen.clear_streams()\n- # set stream into pktgen\n- s_option = {\n- \"stream_config\": {\n- \"txmode\": {},\n- \"transmit_mode\": TRANSMIT_CONT,\n- \"rate\": rate_percent,\n- }\n- }\n- stream_ids = self.add_stream_to_pktgen(txport, rxport, send_pkts, s_option)\n- # run traffic options\n- traffic_opt = option.get(\"traffic_opt\")\n- # run pktgen(ixia/trex) traffic\n- result = self.tester.pktgen.measure(stream_ids, traffic_opt)\n-\n- return result\n-\n- def get_pkt_len(self, pkt_type, frame_size):\n- headers_size = sum([HEADER_SIZE[x] for x in [\"eth\", \"ip\", pkt_type]])\n- pktlen = frame_size - headers_size\n- return pktlen\n-\n- def set_stream(self, stm_names=None):\n- # set streams for traffic\n- pkt_configs = {\n- \"UDP_1\": {\n- \"type\": \"UDP\",\n- \"pkt_layers\": {\n- \"ipv4\": {\"dst\": \"1.1.1.1\"},\n- \"raw\": {\n- \"payload\": [\"58\"]\n- * self.get_pkt_len(\"udp\", frame_size=self.frame_size)\n- },\n- },\n- },\n- }\n- # create packet instance for send\n- streams = []\n- for stm_name in stm_names:\n- if stm_name not in list(pkt_configs.keys()):\n- continue\n- values = pkt_configs[stm_name]\n- pkt_type = values.get(\"type\")\n- pkt_layers = values.get(\"pkt_layers\")\n- pkt = Packet(pkt_type=pkt_type)\n- for layer in list(pkt_layers.keys()):\n- pkt.config_layer(layer, pkt_layers[layer])\n- streams.append(pkt.pktgen.pkt)\n-\n- return streams\n-\n- @property\n- def empty_poll_options(self):\n- table = {\n- \"train\": \"1,0,0\",\n- \"no-train\": \"0,350000,500000\",\n- }\n- return table\n-\n- def init_l3fwd_power(self):\n- self.l3fwd_power = self.prepare_binary(\"l3fwd-power\")\n-\n- def start_l3fwd_power(self, core):\n- train_mode = self.empty_poll_options.get(self.train_mode)\n- option = (\n- \"-v \"\n- \"-c {core_mask} \"\n- \"-n {mem_channel} \"\n- \"-- \"\n- \"-p 0x3 \"\n- \"-P \"\n- '--config=\"(0,0,{core}),(1,0,{core})\" '\n- \"-l 10 -m 6 -h 1 \"\n- '--empty-poll=\"{empty-poll}\" '\n- ).format(\n- **{\n- \"core\": core[-1],\n- \"core_mask\": self.get_cores_mask(core),\n- \"mem_channel\": self.dut.get_memory_channels(),\n- \"empty-poll\": train_mode,\n- }\n- )\n- prompts = {\n- self.NOTRAIN: \"POWER: Bring up the Timer\",\n- self.TRAIN: \"POWER: Training is Complete\",\n- }\n- prompt = prompts.get(self.train_mode)\n- cmd = [\" \".join([self.l3fwd_power, option]), prompt, 120]\n- self.d_con(cmd)\n- self.is_l3fwd_on = True\n-\n- def close_l3fwd_power(self):\n- if not self.is_l3fwd_on:\n- return\n- cmd = \"^C\"\n- self.d_con(cmd)\n-\n- def is_hyper_threading(self):\n- cpu_index = list(self.cpu_info.keys())[-1]\n- core_num = self.cpu_info[cpu_index].get(\"core\")\n- return (cpu_index + 1) / 2 == (core_num + 1)\n-\n- def is_support_pbf(self):\n- # check if cpu support bpf feature\n- cpu_attr = r\"/sys/devices/system/cpu/cpu0/cpufreq/base_frequency\"\n- cmd = \"ls {0}\".format(cpu_attr)\n- self.d_a_con(cmd)\n- cmd = \"echo $?\"\n- output = self.d_a_con(cmd)\n- ret = True if output == \"0\" else False\n- return ret\n-\n- def query_cpu_freq(self):\n- cmd = (\n- \"cat /sys/devices/system/cpu/cpu{0}/cpufreq/scaling_min_freq;\"\n- \"cat /sys/devices/system/cpu/cpu{0}/cpufreq/scaling_max_freq;\"\n- ).format(self.check_core[1])\n- output = self.d_a_con(cmd)\n- if not output:\n- self.scaling_min_freq, self.scaling_max_freq = 0, 0\n- else:\n- values = [int(item) for item in output.splitlines()]\n- self.scaling_min_freq, self.scaling_max_freq = values\n-\n- def get_sys_power_driver(self):\n- drv_file = \"/sys/devices/system/cpu/cpu0/cpufreq/scaling_driver\"\n- output = self.d_a_con(\"cat \" + drv_file)\n- if not output:\n- msg = \"unknown power driver\"\n- self.verify(False, msg)\n- drv_name = output.splitlines()[0].strip()\n- return drv_name\n-\n- def get_all_cpu_attrs(self):\n- \"\"\"get all cpus' base_frequency value\"\"\"\n- key_values = [\"base_frequency\", \"cpuinfo_max_freq\", \"cpuinfo_min_freq\"]\n- freq = \"/sys/devices/system/cpu/cpu{0}/cpufreq/{1}\".format\n- # use dut alt session to get dut platform cpu base frequency attribute\n- cpu_topos = self.dut.get_all_cores()\n- cpu_info = {}\n- for cpu_topo in cpu_topos:\n- cpu_id = int(cpu_topo[\"thread\"])\n- cpu_info[cpu_id] = {}\n- cpu_info[cpu_id][\"socket\"] = cpu_topo[\"socket\"]\n- cpu_info[cpu_id][\"core\"] = cpu_topo[\"core\"]\n-\n- for key_value in key_values:\n- cmds = []\n- for cpu_id in sorted(cpu_info.keys()):\n- cmds.append(\"cat {0}\".format(freq(cpu_id, key_value)))\n- output = self.d_a_con(\";\".join(cmds))\n- freqs = (\n- [int(item) for item in output.splitlines()]\n- if key_value != \"scaling_available_frequencies\"\n- else [item for item in output.splitlines()]\n- )\n- for index, cpu_id in enumerate(sorted(cpu_info.keys())):\n- if key_value == \"scaling_available_frequencies\":\n- cpu_info[cpu_id][key_value] = [\n- int(item) for item in sorted(freqs[index].split())\n- ]\n- else:\n- cpu_info[cpu_id][key_value] = freqs[index]\n-\n- # get high priority core and normal core\n- base_freqs_info = {}\n- for core_index, value in list(cpu_info.items()):\n- base_frequency = value.get(\"base_frequency\")\n- base_freqs_info.setdefault(base_frequency, []).append(core_index)\n- base_freqs = list(base_freqs_info.keys())\n- # cpu should have high priority core and normal core\n- # high priority core frequency is higher than normal core frequency\n- if len(base_freqs) <= 1 or not all(\n- [len(value) for value in list(base_freqs_info.values())]\n- ):\n- msg = \"current cpu has no high priority core\"\n- raise VerifyFailure(msg)\n- self.logger.debug(pformat(base_freqs_info))\n-\n- return cpu_info, base_freqs_info\n-\n- def get_normal_cores_index(self, number):\n- normal_freq = min(self.base_freqs_info.keys())\n- cores_index = (\n- self.base_freqs_info[normal_freq][1:number]\n- if self.base_freqs_info[normal_freq][0] == 0\n- else self.base_freqs_info[normal_freq][:number]\n- )\n- return cores_index\n-\n- def get_no_turbo_max(self, core):\n- cmd = \"rdmsr -p {} 0x0CE -f 15:8 -d\".format(core)\n- output = self.d_a_con(cmd)\n- freq = output.strip() + \"00000\"\n- return int(freq)\n-\n- def check_core_freq_in_traffic(self, core_index, mode):\n- \"\"\"\n- check the cores frequency when running traffic\n- highest frequency[no_turbo_max]: cur_min=cur_max=no_turbo_max\n- \"\"\"\n- freq = self.get_no_turbo_max(core_index)\n- expected_freq = freq if mode == self.HIGH else (freq - 500000)\n- msg = \"max freq is failed to get.\"\n- self.verify(self.scaling_max_freq, msg)\n- msg = \"max freq is not the same as highest frequency <{0}>\"\n- self.verify(expected_freq == self.scaling_max_freq, msg.format(expected_freq))\n- msg = \"min freq is failed to get.\"\n- self.verify(self.scaling_min_freq, msg)\n- msg = \"min freq is not the same as highest frequency <{0}>\"\n- self.verify(expected_freq == self.scaling_min_freq, msg.format(expected_freq))\n- msg = \"core <{0}>: max freq/min_freq/expected freq<{1}> are the same\"\n- self.logger.info(msg.format(core_index, expected_freq))\n-\n- def check_no_train(self):\n- output = self.dut.get_session_output(timeout=2)\n- msg = \"training steps should not be executed\"\n- self.verify(\"POWER: Training is Complete\" not in output, msg)\n-\n- @property\n- def train_mode_check_item(self):\n- # Injected Rate:\n- # 10G -> 0.1G -> 10G -> 0.1G -> 10G -> 0.1G\n- check_item = [\n- [100, self.HIGH],\n- [1, self.MED],\n- [100, self.HIGH],\n- [1, self.MED],\n- [100, self.HIGH],\n- [1, self.MED],\n- ]\n- return check_item\n-\n- def verify_train_mode(self):\n- except_content = None\n- # begin run vm power policy testing\n- try:\n- self.start_l3fwd_power(self.check_core)\n- if self.train_mode == self.NOTRAIN:\n- self.check_no_train()\n- else:\n- time.sleep(10) # wait some time for stable training\n- msg = \"{0} begin test mode <{1}> with traffic rate percent {2}%\"\n- for rate, mode in self.train_mode_check_item:\n- self.logger.info(msg.format(self.train_mode, mode, rate))\n- duration = 20 if self.is_use_trex else 10\n- info = {\n- \"traffic_opt\": {\n- \"method\": \"throughput\",\n- \"interval\": duration - 2,\n- \"duration\": duration,\n- \"callback\": self.query_cpu_freq,\n- },\n- \"stm_types\": [\"UDP_1\"],\n- \"rate\": rate,\n- }\n- # run traffic\n- self.run_traffic(info)\n- time.sleep(15 if self.is_use_trex else 2)\n- # check test result\n- self.check_core_freq_in_traffic(self.check_core[1], mode)\n- except Exception as e:\n- self.logger.error(traceback.format_exc())\n- except_content = e\n- finally:\n- self.close_l3fwd_power()\n-\n- # check verify result\n- if except_content:\n- raise VerifyFailure(except_content)\n- else:\n- msg = \"test <{0}> successful !!!\".format(self.train_mode)\n- self.logger.info(msg)\n-\n- def verify_power_driver(self):\n- expected_drv = \"intel_pstate\"\n- power_drv = self.get_sys_power_driver()\n- msg = \"{0} should work with {1} driver on DUT\".format(\n- self.suite_name, expected_drv\n- )\n- self.verify(power_drv == expected_drv, msg)\n-\n- def verify_hyper_threading(self):\n- msg = \"{} should work under hyper threading close status\"\n- self.verify(not self.is_hyper_threading(), msg.format(self.suite_name))\n-\n- def verify_pbf_supported(self):\n- if self.is_support_pbf():\n- return\n- msg = \"dut cpu doesn't support priority base frequency feature\"\n- raise VerifyFailure(msg)\n-\n- def preset_test_environment(self):\n- self.is_l3fwd_on = None\n- self.cpu_info, self.base_freqs_info = self.get_all_cpu_attrs()\n- test_content = self.get_suite_cfg()\n- self.frame_size = test_content.get(\"frame_size\") or 1024\n- self.check_core = self.get_normal_cores_index(2)\n- self.verify_hyper_threading()\n- # modprobe msr module to let the application can get the CPU HW info\n- self.d_a_con(\"modprobe msr\")\n- # init binary\n- self.init_l3fwd_power()\n-\n- #\n- # Test cases.\n- #\n-\n- def set_up_all(self):\n- \"\"\"\n- Run at the start of each test suite.\n- \"\"\"\n- self.verify_power_driver()\n- # check if cpu support bpf feature\n- self.verify_pbf_supported()\n- self.dut_ports = self.dut.get_ports(self.nic)\n- self.verify(len(self.dut_ports) >= 2, \"Not enough ports\")\n- # prepare testing environment\n- self.preset_test_environment()\n-\n- def tear_down_all(self):\n- \"\"\"\n- Run after each test suite.\n- \"\"\"\n- pass\n-\n- def set_up(self):\n- \"\"\"\n- Run before each test case.\n- \"\"\"\n- pass\n-\n- def tear_down(self):\n- \"\"\"\n- Run after each test case.\n- \"\"\"\n- self.dut.kill_all()\n-\n- def test_perf_basic_train_mode(self):\n- \"\"\"\n- Set Branch-Ratio Rate by User\n- \"\"\"\n- self.train_mode = self.TRAIN\n- self.verify_train_mode()\n-\n- def test_perf_no_training_mode(self):\n- \"\"\"\n- Set Branch-Ratio Rate by User\n- \"\"\"\n- self.train_mode = self.NOTRAIN\n- self.verify_train_mode()\n", "prefixes": [ "V1" ] }{ "id": 124853, "url": "