DPDK patches and discussions
 help / color / mirror / Atom feed
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 v6 2/3] l3fwd-power: add option to call uncore API
Date: Wed, 28 Sep 2022 13:18:37 +0100	[thread overview]
Message-ID: <c4efb90b-76d2-d860-8d9b-6520cab5fe76@intel.com> (raw)
In-Reply-To: <20220928090636.1580647-3-tadhg.kearney@intel.com>

Hi Tadhg,

On 28/09/2022 10:06, 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>
> Reviewed-by: David Hunt <david.hunt@intel.com>
> ---
>   .../sample_app_ug/l3_forward_power_man.rst    |  29 ++++
>   examples/l3fwd-power/main.c                   | 126 +++++++++++++++++-
>   2 files changed, 153 insertions(+), 2 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..0b6acc8e58 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"
> @@ -161,6 +162,9 @@ static struct rte_timer telemetry_timer;
>   /* stats index returned by metrics lib */
>   int telstats_index;
>   
> +/* flag to check if uncore option enabled */
> +int enabled_uncore = -1;
> +
>   struct telstats_name {
>   	char name[RTE_ETH_XSTATS_NAME_SIZE];
>   };
> @@ -179,6 +183,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 +1626,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 +1685,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)
>   {
> @@ -1864,7 +1945,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:",

There's been a spurious ':' added after the 'P' for promiscuous mode, 
thereby breaking it.


>   				lgopts, &option_index)) != EOF) {
>   
>   		switch (opt) {
> @@ -1893,6 +1974,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 +2466,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 +2479,26 @@ deinit_power_library(void)
>   			return ret;
>   		}
>   	}
> +
> +	/* if uncore option was set */
> +	if (enabled_uncore == 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_exit(pkg, die);
> +				if (ret < 0) {
> +					RTE_LOG(ERR, L3FWD_POWER, "Failed to exit uncore deinit successfully for pkg %02u die %02u\n"
> +						, pkg, die);
> +					return -1;
> +				}
> +			}
> +		}
> +	}
>   	return ret;
>   }
>   

  reply	other threads:[~2022-09-28 12:18 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
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 [this message]
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=c4efb90b-76d2-d860-8d9b-6520cab5fe76@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).