From: "Hunt, David" <david.hunt@intel.com>
To: Tadhg Kearney <tadhg.kearney@intel.com>, <dev@dpdk.org>
Cc: <anatoly.burakov@intel.com>, <reshma.pattan@intel.com>
Subject: Re: [PATCH v4 2/3] l3fwd-power: add option to call uncore API
Date: Fri, 23 Sep 2022 14:13:31 +0100 [thread overview]
Message-ID: <5cf9a7b3-2060-cb88-95da-0fe9cf1b3b74@intel.com> (raw)
In-Reply-To: <20220920094822.1403168-3-tadhg.kearney@intel.com>
On 20/09/2022 10:48, Tadhg Kearney wrote:
> Add option for setting uncore frequency min/max/index, through uncore API.
> This will be set for each package and die on the SKU. On exit, uncore min
> and max frequency will be reverted back to previous frequencies.
>
> Signed-off-by: Tadhg Kearney <tadhg.kearney@intel.com>
> ---
> .../sample_app_ug/l3_forward_power_man.rst | 29 +++++
> examples/l3fwd-power/main.c | 122 +++++++++++++++++-
> 2 files changed, 148 insertions(+), 3 deletions(-)
>
> diff --git a/doc/guides/sample_app_ug/l3_forward_power_man.rst b/doc/guides/sample_app_ug/l3_forward_power_man.rst
> index 8f6d906200..08ac8ef369 100644
> --- a/doc/guides/sample_app_ug/l3_forward_power_man.rst
> +++ b/doc/guides/sample_app_ug/l3_forward_power_man.rst
> @@ -97,6 +97,12 @@ where,
> * -P: Sets all ports to promiscuous mode so that packets are accepted regardless of the packet's Ethernet MAC destination address.
> Without this option, only packets with the Ethernet MAC destination address set to the Ethernet address of the port are accepted.
>
> +* -u: optional, sets uncore min/max frequency to minimum value.
> +
> +* -U: optional, sets uncore min/max frequency to maximum value.
> +
> +* -i (frequency index): optional, sets uncore frequency to frequency index value, by setting min and max values to be the same.
> +
> * --config (port,queue,lcore)[,(port,queue,lcore)]: determines which queues from which ports are mapped to which cores.
>
> * --max-pkt-len: optional, maximum packet length in decimal (64-9600)
> @@ -364,3 +370,26 @@ in the DPDK Programmer's Guide for more details on PMD power management.
> .. code-block:: console
>
> ./<build_dir>/examples/dpdk-l3fwd-power -l 1-3 -- -p 0x0f --config="(0,0,2),(0,1,3)" --pmd-mgmt=scale
> +
> +Setting Uncore Values
> +---------------------
> +
> +Uncore frequency can be adjusted through manipulating related sysfs entries to adjust the minimum and maximum uncore values.
> +This will be set for each package and die on the SKU. The driver for enabling this is available from kernel version 5.6 and above.
> +Three options are available for setting uncore frequency:
> +
> +``-u``
> + This will set uncore minimum and maximum frequencies to minimum possible value.
> +
> +``-U``
> + This will set uncore minimum and maximum frequencies to maximum possible value.
> +
> +``-i``
> + This will allow you to set the specific uncore frequency index that you want, by setting
> + the uncore frequency to a frequency pointed by index. Frequency index's are set 100MHz apart from
> + maximum to minimum.
> + Frequency index values are in descending order, ie, index 0 is maximum frequency index.
> +
> +.. code-block:: console
> +
> + ./<build_dir>/examples/dpdk-l3fwd-power -l 1-3 -- -p 0x0f --config="(0,0,2),(0,1,3)" -i 1
> diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
> index 887c6eae3f..d1a32594c0 100644
> --- a/examples/l3fwd-power/main.c
> +++ b/examples/l3fwd-power/main.c
> @@ -47,6 +47,7 @@
> #include <rte_metrics.h>
> #include <rte_telemetry.h>
> #include <rte_power_pmd_mgmt.h>
> +#include <rte_power_uncore.h>
>
> #include "perf_core.h"
> #include "main.h"
> @@ -179,6 +180,12 @@ enum busy_rate {
> FULL = 100
> };
>
> +enum uncore_choice {
> + UNCORE_MIN = 0,
> + UNCORE_MAX = 1,
> + UNCORE_IDX = 2
> +};
> +
> /* reference poll count to measure core busyness */
> #define DEFAULT_COUNT 10000
> /*
> @@ -1616,6 +1623,9 @@ print_usage(const char *prgname)
> " [--max-pkt-len PKTLEN]\n"
> " -p PORTMASK: hexadecimal bitmask of ports to configure\n"
> " -P: enable promiscuous mode\n"
> + " -u: set min/max frequency for uncore to minimum value\n"
> + " -U: set min/max frequency for uncore to maximum value\n"
> + " -i (frequency index): set min/max frequency for uncore to specified frequency index\n"
> " --config (port,queue,lcore): rx queues configuration\n"
> " --high-perf-cores CORELIST: list of high performance cores\n"
> " --perf-config: similar as config, cores specified as indices"
> @@ -1672,6 +1682,74 @@ static int parse_max_pkt_len(const char *pktlen)
> return len;
> }
>
> +static int
> +parse_uncore_options(enum uncore_choice choice, const char *argument)
> +{
> + unsigned int die, pkg, max_pkg, max_die;
> + int ret = 0;
> + max_pkg = rte_power_uncore_get_num_pkgs();
> + if (max_pkg == 0)
> + return -1;
> +
> + for (pkg = 0; pkg < max_pkg; pkg++) {
> + max_die = rte_power_uncore_get_num_dies(pkg);
> + if (max_die == 0)
> + return -1;
> + for (die = 0; die < max_die; die++) {
> + ret = rte_power_uncore_init(pkg, die);
> + if (ret == -1) {
> + RTE_LOG(INFO, L3FWD_POWER, "Unable to initialize uncore for pkg %02u die %02u\n"
> + , pkg, die);
> + return ret;
> + }
> + if (choice == UNCORE_MIN) {
> + ret = rte_power_uncore_freq_min(pkg, die);
> + if (ret == -1) {
> + RTE_LOG(INFO, L3FWD_POWER,
> + "Unable to set the uncore min/max to minimum uncore frequency value for pkg %02u die %02u\n"
> + , pkg, die);
> + return ret;
> + }
> + } else if (choice == UNCORE_MAX) {
> + ret = rte_power_uncore_freq_max(pkg, die);
> + if (ret == -1) {
> + RTE_LOG(INFO, L3FWD_POWER,
> + "Unable to set uncore min/max to maximum uncore frequency value for pkg %02u die %02u\n"
> + , pkg, die);
> + return ret;
> + }
> + } else if (choice == UNCORE_IDX) {
> + char *ptr = NULL;
> + int frequency_index = strtol(argument, &ptr, 10);
> + if (argument == ptr) {
> + RTE_LOG(INFO, L3FWD_POWER, "Index given is not a valid number.");
> + return -1;
> + }
> + int freq_array_len = rte_power_uncore_get_num_freqs(pkg, die);
> + if (frequency_index > freq_array_len - 1) {
> + RTE_LOG(INFO, L3FWD_POWER,
> + "Frequency index given out of range, please choose a value from 0 to %d.\n",
> + freq_array_len);
> + return -1;
> + }
> + ret = rte_power_set_uncore_freq(pkg, die, frequency_index);
> + if (ret == -1) {
> + RTE_LOG(INFO, L3FWD_POWER,
> + "Unable to set min/max uncore index value for pkg %02u die %02u\n",
> + pkg, die);
> + return ret;
> + }
> + } else {
> + RTE_LOG(INFO, L3FWD_POWER, "Uncore choice provided invalid\n");
> + return -1;
> + }
> + }
> + }
> +
> + RTE_LOG(INFO, L3FWD_POWER, "Successfully set max/min/index uncore frequency.\n");
> + return ret;
> +}
> +
> static int
> parse_portmask(const char *portmask)
> {
> @@ -1838,7 +1916,7 @@ parse_ep_config(const char *q_arg)
> static int
> parse_args(int argc, char **argv)
> {
> - int opt, ret;
> + int opt, ret, enabled_uncore = 0;
> char **argvopt;
> int option_index;
> uint32_t limit;
> @@ -1864,7 +1942,7 @@ parse_args(int argc, char **argv)
>
> argvopt = argv;
>
> - while ((opt = getopt_long(argc, argvopt, "p:l:m:h:P",
> + while ((opt = getopt_long(argc, argvopt, "p:l:m:h:P:uUi:",
> lgopts, &option_index)) != EOF) {
>
> switch (opt) {
> @@ -1893,6 +1971,27 @@ parse_args(int argc, char **argv)
> limit = parse_max_pkt_len(optarg);
> freq_tlb[HGH] = limit;
> break;
> + case 'u':
> + enabled_uncore = parse_uncore_options(UNCORE_MIN, NULL);
> + if (enabled_uncore < 0) {
> + print_usage(prgname);
> + return -1;
> + }
> + break;
> + case 'U':
> + enabled_uncore = parse_uncore_options(UNCORE_MAX, NULL);
> + if (enabled_uncore < 0) {
> + print_usage(prgname);
> + return -1;
> + }
> + break;
> + case 'i':
> + enabled_uncore = parse_uncore_options(UNCORE_IDX, optarg);
> + if (enabled_uncore < 0) {
> + print_usage(prgname);
> + return -1;
> + }
> + break;
> /* long options */
> case 0:
> if (!strncmp(lgopts[option_index].name, "config", 6)) {
> @@ -2364,7 +2463,7 @@ init_power_library(void)
> static int
> deinit_power_library(void)
> {
> - unsigned int lcore_id;
> + unsigned int lcore_id, max_pkg, max_die, die, pkg;
> int ret = 0;
>
> RTE_LCORE_FOREACH(lcore_id) {
> @@ -2377,6 +2476,23 @@ deinit_power_library(void)
> return ret;
> }
> }
> +
> + max_pkg = rte_power_uncore_get_num_pkgs();
> + if (max_pkg == 0)
> + return -1;
> + for (pkg = 0; pkg < max_pkg; pkg++) {
> + max_die = rte_power_uncore_get_num_dies(pkg);
> + if (max_die == 0)
> + return -1;
> + for (die = 0; die < max_die; die++) {
> + ret = rte_power_uncore_exit(pkg, die);
> + if (ret < 0) {
> + RTE_LOG(ERR, L3FWD_POWER, "Failed to exit uncore deninit successfully for pkg %02u die %02u\n"
> + , pkg, die);
> + return -1;
> + }
> + }
> + }
> return ret;
> }
>
Thanks Tadhg. I've also tested this and it sets the uncore frequencies
as expected with the -U, -u and -i options.
Reviewed-by: David Hunt <david.hunt@intel.com>
next prev parent reply other threads:[~2022-09-23 13:13 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-20 9:48 [PATCH v4 0/3] add uncore api to be called through l3fwd-power Tadhg Kearney
2022-09-20 9:48 ` [PATCH v4 1/3] power: add uncore frequency control API to the power library Tadhg Kearney
2022-09-23 13:15 ` Hunt, David
2022-09-20 9:48 ` [PATCH v4 2/3] l3fwd-power: add option to call uncore API Tadhg Kearney
2022-09-23 13:13 ` Hunt, David [this message]
2022-09-20 9:48 ` [PATCH v4 3/3] test/power: add unit tests for " Tadhg Kearney
2022-09-23 13:15 ` Hunt, David
2022-09-27 10:09 ` [PATCH v5 0/3] add uncore api to be called through l3fwd-power Tadhg Kearney
2022-09-27 10:09 ` [PATCH v5 1/3] power: add uncore frequency control API to the power library Tadhg Kearney
2022-09-27 10:09 ` [PATCH v5 2/3] l3fwd-power: add option to call uncore API Tadhg Kearney
2022-09-27 10:09 ` [PATCH v5 3/3] test/power: add unit tests for " Tadhg Kearney
2022-09-28 9:06 ` [PATCH v6 0/3] add uncore api to be called through l3fwd-power Tadhg Kearney
2022-09-28 9:06 ` [PATCH v6 1/3] power: add uncore frequency control API to the power library Tadhg Kearney
2022-09-28 9:06 ` [PATCH v6 2/3] l3fwd-power: add option to call uncore API Tadhg Kearney
2022-09-28 12:18 ` Hunt, David
2022-09-28 9:06 ` [PATCH v6 3/3] test/power: add unit tests for " Tadhg Kearney
2022-09-28 13:30 ` [PATCH v7 0/3] add uncore api to be called through l3fwd-power Tadhg Kearney
2022-09-28 13:30 ` [PATCH v7 1/3] power: add uncore frequency control API to the power library Tadhg Kearney
2022-10-04 17:09 ` Thomas Monjalon
2022-10-05 10:50 ` Kearney, Tadhg
2022-10-05 12:11 ` Thomas Monjalon
2022-09-28 13:30 ` [PATCH v7 2/3] l3fwd-power: add option to call uncore API Tadhg Kearney
2022-09-28 13:30 ` [PATCH v7 3/3] test/power: add unit tests for " Tadhg Kearney
2022-09-29 13:27 ` [PATCH v7 0/3] add uncore api to be called through l3fwd-power Hunt, David
2022-10-05 16:20 ` [PATCH v8 0/3] add Intel " Tadhg Kearney
2022-10-05 16:20 ` [PATCH v8 1/3] power: add Intel uncore frequency control API to power library Tadhg Kearney
2022-10-05 16:20 ` [PATCH v8 2/3] l3fwd-power: add option to call uncore API Tadhg Kearney
2022-10-05 16:20 ` [PATCH v8 3/3] test/power: add unit tests for " Tadhg Kearney
2022-10-06 9:38 ` [PATCH v9 0/3] add Intel uncore api to be called through l3fwd-power Tadhg Kearney
2022-10-06 9:38 ` [PATCH v9 1/3] power: add Intel uncore frequency control API to power library Tadhg Kearney
2022-10-06 17:32 ` Stephen Hemminger
2022-10-07 10:30 ` Hunt, David
2022-10-10 12:46 ` Thomas Monjalon
2022-10-06 9:38 ` [PATCH v9 2/3] l3fwd-power: add option to call uncore API Tadhg Kearney
2022-10-06 9:38 ` [PATCH v9 3/3] test/power: add unit tests for " Tadhg Kearney
2022-10-10 12:52 ` [PATCH v9 0/3] add Intel uncore api to be called through l3fwd-power Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5cf9a7b3-2060-cb88-95da-0fe9cf1b3b74@intel.com \
--to=david.hunt@intel.com \
--cc=anatoly.burakov@intel.com \
--cc=dev@dpdk.org \
--cc=reshma.pattan@intel.com \
--cc=tadhg.kearney@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).