DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 0/3] Core capabilities query
@ 2019-05-30 16:15 Hajkowski
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 1/3] power: add new packet type for capabilities Hajkowski
                   ` (3 more replies)
  0 siblings, 4 replies; 15+ messages in thread
From: Hajkowski @ 2019-05-30 16:15 UTC (permalink / raw)
  To: david.hunt; +Cc: dev, Marcin Hajkowski

From: Marcin Hajkowski <marcinx.hajkowski@intel.com>

Extend guest channel and sample apps to query CPU capabilities.

Please note that these changes depends on
(http://patchwork.dpdk.org/cover/52335/) and
(http://patchwork.dpdk.org/cover/52213/) which should be applied first.


Marcin Hajkowski (3):
  power: add new packet type for capabilities
  examples/power_manager: send cpu capabilities on vm request
  examples/power_guest: send request for specified core capabilities

 examples/vm_power_manager/channel_monitor.c   |  67 ++++++++++
 .../guest_cli/vm_power_cli_guest.c            | 119 +++++++++++++++++-
 lib/librte_power/channel_commands.h           |  14 +++
 3 files changed, 198 insertions(+), 2 deletions(-)

-- 
2.17.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [dpdk-dev] [PATCH 1/3] power: add new packet type for capabilities
  2019-05-30 16:15 [dpdk-dev] [PATCH 0/3] Core capabilities query Hajkowski
@ 2019-05-30 16:15 ` Hajkowski
  2019-09-30 10:55   ` Daly, Lee
  2019-09-30 13:00   ` [dpdk-dev] [PATCH v2 0/3] Core capabilities query David Hunt
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 2/3] examples/power_manager: send cpu capabilities on vm request Hajkowski
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 15+ messages in thread
From: Hajkowski @ 2019-05-30 16:15 UTC (permalink / raw)
  To: david.hunt; +Cc: dev, Marcin Hajkowski

From: Marcin Hajkowski <marcinx.hajkowski@intel.com>

Add new packet type and commands for capabilities query.

Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
---
 lib/librte_power/channel_commands.h | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/lib/librte_power/channel_commands.h b/lib/librte_power/channel_commands.h
index ce587283c..b1f5584a8 100644
--- a/lib/librte_power/channel_commands.h
+++ b/lib/librte_power/channel_commands.h
@@ -34,6 +34,8 @@ extern "C" {
 /* CPU Power Queries */
 #define CPU_POWER_QUERY_FREQ_LIST  7
 #define CPU_POWER_QUERY_FREQ       8
+#define CPU_POWER_QUERY_CAPS_LIST  9
+#define CPU_POWER_QUERY_CAPS       10
 
 /* --- Outgoing messages --- */
 
@@ -43,6 +45,7 @@ extern "C" {
 
 /* CPU Power Query Responses */
 #define CPU_POWER_FREQ_LIST     3
+#define CPU_POWER_CAPS_LIST     4
 
 #define HOURS 24
 
@@ -106,6 +109,17 @@ struct channel_packet_freq_list {
 	uint8_t num_vcpu;
 };
 
+struct channel_packet_caps_list {
+	uint64_t resource_id; /**< core_num, device */
+	uint32_t unit;        /**< scale down/up/min/max */
+	uint32_t command;     /**< Power, IO, etc */
+	char vm_name[VM_MAX_NAME_SZ];
+
+	uint64_t turbo[MAX_VCPU_PER_VM];
+	uint64_t priority[MAX_VCPU_PER_VM];
+	uint8_t num_vcpu;
+};
+
 
 #ifdef __cplusplus
 }
-- 
2.17.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [dpdk-dev] [PATCH 2/3] examples/power_manager: send cpu capabilities on vm request
  2019-05-30 16:15 [dpdk-dev] [PATCH 0/3] Core capabilities query Hajkowski
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 1/3] power: add new packet type for capabilities Hajkowski
@ 2019-05-30 16:15 ` Hajkowski
  2019-09-30 10:56   ` Daly, Lee
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 3/3] examples/power_guest: send request for specified core capabilities Hajkowski
  2019-07-04 19:58 ` [dpdk-dev] [PATCH 0/3] Core capabilities query Thomas Monjalon
  3 siblings, 1 reply; 15+ messages in thread
From: Hajkowski @ 2019-05-30 16:15 UTC (permalink / raw)
  To: david.hunt; +Cc: dev, Marcin Hajkowski

From: Marcin Hajkowski <marcinx.hajkowski@intel.com>

Send capabilities for requested cores.

Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
---
 examples/vm_power_manager/channel_monitor.c | 67 +++++++++++++++++++++
 1 file changed, 67 insertions(+)

diff --git a/examples/vm_power_manager/channel_monitor.c b/examples/vm_power_manager/channel_monitor.c
index bfd9cc38d..731b3b480 100644
--- a/examples/vm_power_manager/channel_monitor.c
+++ b/examples/vm_power_manager/channel_monitor.c
@@ -29,6 +29,7 @@
 #include <rte_cycles.h>
 #include <rte_ethdev.h>
 #include <rte_pmd_i40e.h>
+#include <rte_power.h>
 
 #include <libvirt/libvirt.h>
 #include "channel_monitor.h"
@@ -704,6 +705,60 @@ send_freq(struct channel_packet *pkt,
 			chan_info);
 }
 
+static int
+send_capabilities(struct channel_packet *pkt,
+		struct channel_info *chan_info,
+		bool list_requested)
+{
+	unsigned int vcore_id = pkt->resource_id;
+	struct channel_packet_caps_list channel_pkt_caps_list;
+	struct vm_info info;
+	struct rte_power_core_capabilities caps;
+	int ret;
+
+	if (get_info_vm(pkt->vm_name, &info) != 0)
+		return -1;
+
+	if (!list_requested && vcore_id >= MAX_VCPU_PER_VM)
+		return -1;
+
+	if (!info.allow_query)
+		return -1;
+
+	channel_pkt_caps_list.command = CPU_POWER_CAPS_LIST;
+	channel_pkt_caps_list.num_vcpu = info.num_vcpus;
+
+	if (list_requested) {
+		unsigned int i;
+		for (i = 0; i < info.num_vcpus; i++) {
+			ret = rte_power_get_capabilities(info.pcpu_map[i],
+					&caps);
+			if (ret == 0) {
+				channel_pkt_caps_list.turbo[i] =
+						caps.turbo;
+				channel_pkt_caps_list.priority[i] =
+						caps.priority;
+			} else
+				return -1;
+
+		}
+	} else {
+		ret = rte_power_get_capabilities(info.pcpu_map[vcore_id],
+				&caps);
+		if (ret == 0) {
+			channel_pkt_caps_list.turbo[vcore_id] =
+					caps.turbo;
+			channel_pkt_caps_list.priority[vcore_id] =
+					caps.priority;
+		} else
+			return -1;
+	}
+
+	return write_binary_packet(&channel_pkt_caps_list,
+			sizeof(channel_pkt_caps_list),
+			chan_info);
+}
+
 static int
 send_ack_for_received_cmd(struct channel_packet *pkt,
 		struct channel_info *chan_info,
@@ -812,6 +867,18 @@ process_request(struct channel_packet *pkt, struct channel_info *chan_info)
 			RTE_LOG(ERR, CHANNEL_MONITOR, "Error during frequency sending.\n");
 	}
 
+	if (pkt->command == CPU_POWER_QUERY_CAPS_LIST ||
+		pkt->command == CPU_POWER_QUERY_CAPS) {
+
+		RTE_LOG(INFO, CHANNEL_MONITOR,
+			"Capabilities for %s requested.\n", pkt->vm_name);
+		int ret = send_capabilities(pkt,
+				chan_info,
+				pkt->command == CPU_POWER_QUERY_CAPS_LIST);
+		if (ret < 0)
+			RTE_LOG(ERR, CHANNEL_MONITOR, "Error during sending capabilities.\n");
+	}
+
 	/*
 	 * Return is not checked as channel status may have been set to DISABLED
 	 * from management thread
-- 
2.17.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [dpdk-dev] [PATCH 3/3] examples/power_guest: send request for specified core capabilities
  2019-05-30 16:15 [dpdk-dev] [PATCH 0/3] Core capabilities query Hajkowski
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 1/3] power: add new packet type for capabilities Hajkowski
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 2/3] examples/power_manager: send cpu capabilities on vm request Hajkowski
@ 2019-05-30 16:15 ` Hajkowski
  2019-09-30 10:54   ` Daly, Lee
  2019-09-30 12:54   ` Daly, Lee
  2019-07-04 19:58 ` [dpdk-dev] [PATCH 0/3] Core capabilities query Thomas Monjalon
  3 siblings, 2 replies; 15+ messages in thread
From: Hajkowski @ 2019-05-30 16:15 UTC (permalink / raw)
  To: david.hunt; +Cc: dev, Marcin Hajkowski

From: Marcin Hajkowski <marcinx.hajkowski@intel.com>

Send request to power manager for core id provided
by user to get related capabilities.

Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
---
 .../guest_cli/vm_power_cli_guest.c            | 119 +++++++++++++++++-
 1 file changed, 117 insertions(+), 2 deletions(-)

diff --git a/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c b/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
index 848230248..de85c1406 100644
--- a/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
+++ b/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
@@ -132,7 +132,7 @@ struct cmd_freq_list_result {
 };
 
 static int
-query_freq_list(struct channel_packet *pkt, unsigned int lcore_id)
+query_data(struct channel_packet *pkt, unsigned int lcore_id)
 {
 	int ret;
 	ret = rte_power_guest_channel_send_msg(pkt, lcore_id);
@@ -206,7 +206,7 @@ cmd_query_freq_list_parsed(void *parsed_result,
 		pkt.resource_id = lcore_id;
 	}
 
-	ret = query_freq_list(&pkt, lcore_id);
+	ret = query_data(&pkt, lcore_id);
 	if (ret < 0) {
 		cmdline_printf(cl, "Error during sending frequency list query.\n");
 		return;
@@ -248,6 +248,120 @@ cmdline_parse_inst_t cmd_query_freq_list = {
 	},
 };
 
+struct cmd_query_caps_result {
+	cmdline_fixed_string_t query_caps;
+	cmdline_fixed_string_t cpu_num;
+};
+
+static int
+receive_capabilities(struct channel_packet_caps_list *pkt_caps_list,
+		unsigned int lcore_id)
+{
+	int ret;
+
+	ret = rte_power_guest_channel_receive_msg(pkt_caps_list,
+		sizeof(struct channel_packet_caps_list),
+		lcore_id);
+	if (ret < 0) {
+		RTE_LOG(ERR, GUEST_CLI, "Error receiving message.\n");
+		return -1;
+	}
+	if (pkt_caps_list->command != CPU_POWER_CAPS_LIST) {
+		RTE_LOG(ERR, GUEST_CLI, "Unexpected message received.\n");
+		return -1;
+	}
+	return 0;
+}
+
+static void
+cmd_query_caps_list_parsed(void *parsed_result,
+		__rte_unused struct cmdline *cl,
+		__rte_unused void *data)
+{
+	struct cmd_query_caps_result *res = parsed_result;
+	unsigned int lcore_id;
+	struct channel_packet_caps_list pkt_caps_list;
+	struct channel_packet pkt;
+	bool query_list = false;
+	int ret;
+	char *ep;
+
+	memset(&pkt, 0, sizeof(struct channel_packet));
+	memset(&pkt_caps_list, 0, sizeof(struct channel_packet_caps_list));
+
+	if (!strcmp(res->cpu_num, "all")) {
+
+		/* Get first enabled lcore. */
+		lcore_id = rte_get_next_lcore(-1,
+				0,
+				0);
+		if (lcore_id == RTE_MAX_LCORE) {
+			cmdline_printf(cl, "Enabled core not found.\n");
+			return;
+		}
+
+		pkt.command = CPU_POWER_QUERY_CAPS_LIST;
+		strcpy(pkt.vm_name, policy.vm_name);
+		query_list = true;
+	} else {
+		errno = 0;
+		lcore_id = (unsigned int)strtol(res->cpu_num, &ep, 10);
+		if (errno != 0 || lcore_id >= MAX_VCPU_PER_VM ||
+			ep == res->cpu_num) {
+			cmdline_printf(cl, "Invalid parameter provided.\n");
+			return;
+		}
+		pkt.command = CPU_POWER_QUERY_CAPS;
+		strcpy(pkt.vm_name, policy.vm_name);
+		pkt.resource_id = lcore_id;
+	}
+
+	ret = query_data(&pkt, lcore_id);
+	if (ret < 0) {
+		cmdline_printf(cl, "Error during sending capabilities query.\n");
+		return;
+	}
+
+	ret = receive_capabilities(&pkt_caps_list, lcore_id);
+	if (ret < 0) {
+		cmdline_printf(cl, "Error during capabilities reception.\n");
+		return;
+	}
+	if (query_list) {
+		unsigned int i;
+		for (i = 0; i < pkt_caps_list.num_vcpu; ++i)
+			cmdline_printf(cl, "Capabilities of [%d] vcore are:"
+					" turbo possibility: %ld, is priority core: %ld.\n",
+					i,
+					pkt_caps_list.turbo[i],
+					pkt_caps_list.priority[i]);
+	} else {
+		cmdline_printf(cl, "Capabilities of [%d] vcore are:"
+				" turbo possibility: %ld, is priority core: %ld.\n",
+				lcore_id,
+				pkt_caps_list.turbo[lcore_id],
+				pkt_caps_list.priority[lcore_id]);
+	}
+}
+
+cmdline_parse_token_string_t cmd_query_caps_token =
+	TOKEN_STRING_INITIALIZER(struct cmd_query_caps_result, query_caps, "query_cpu_caps");
+cmdline_parse_token_string_t cmd_query_caps_cpu_num_token =
+	TOKEN_STRING_INITIALIZER(struct cmd_query_caps_result, cpu_num, NULL);
+
+cmdline_parse_inst_t cmd_query_caps_list = {
+	.f = cmd_query_caps_list_parsed,  /* function to call */
+	.data = NULL,      /* 2nd arg of func */
+	.help_str = "query_cpu_caps <core_num>|all, request"
+				" information regarding virtual core capabilities."
+				" The keyword 'all' will query list of all vcores for the VM",
+	.tokens = {        /* token list, NULL terminated */
+		(void *)&cmd_query_caps_token,
+		(void *)&cmd_query_caps_cpu_num_token,
+		NULL,
+	},
+};
+
 static int
 check_response_cmd(unsigned int lcore_id, int *result)
 {
@@ -407,6 +521,7 @@ cmdline_parse_ctx_t main_ctx[] = {
 		(cmdline_parse_inst_t *)&cmd_send_policy_set,
 		(cmdline_parse_inst_t *)&cmd_set_cpu_freq_set,
 		(cmdline_parse_inst_t *)&cmd_query_freq_list,
+		(cmdline_parse_inst_t *)&cmd_query_caps_list,
 		NULL,
 };
 
-- 
2.17.2


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH 0/3] Core capabilities query
  2019-05-30 16:15 [dpdk-dev] [PATCH 0/3] Core capabilities query Hajkowski
                   ` (2 preceding siblings ...)
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 3/3] examples/power_guest: send request for specified core capabilities Hajkowski
@ 2019-07-04 19:58 ` Thomas Monjalon
  3 siblings, 0 replies; 15+ messages in thread
From: Thomas Monjalon @ 2019-07-04 19:58 UTC (permalink / raw)
  To: Hajkowski, david.hunt; +Cc: dev

30/05/2019 18:15, Hajkowski:
> Please note that these changes depends on
> (http://patchwork.dpdk.org/cover/52335/) and
> (http://patchwork.dpdk.org/cover/52213/) which should be applied first.
> 
> Marcin Hajkowski (3):
>   power: add new packet type for capabilities
>   examples/power_manager: send cpu capabilities on vm request
>   examples/power_guest: send request for specified core capabilities

As other series for lib power, there was no review.



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH 3/3] examples/power_guest: send request for specified core capabilities
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 3/3] examples/power_guest: send request for specified core capabilities Hajkowski
@ 2019-09-30 10:54   ` Daly, Lee
  2019-09-30 12:54   ` Daly, Lee
  1 sibling, 0 replies; 15+ messages in thread
From: Daly, Lee @ 2019-09-30 10:54 UTC (permalink / raw)
  To: Hajkowski, Hunt, David; +Cc: dev, Hajkowski, MarcinX

Hi dave, 
See comments below. 
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Hajkowski
> Sent: Thursday, May 30, 2019 5:15 PM
> To: Hunt, David <david.hunt@intel.com>
> Cc: dev@dpdk.org; Hajkowski, MarcinX <marcinx.hajkowski@intel.com>
> Subject: [dpdk-dev] [PATCH 3/3] examples/power_guest: send request for
> specified core capabilities
> 
> From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
> 
> Send request to power manager for core id provided by user to get related
> capabilities.
> 
> Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
> ---
>  .../guest_cli/vm_power_cli_guest.c            | 119 +++++++++++++++++-
>  1 file changed, 117 insertions(+), 2 deletions(-)
> 
> diff --git a/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
> b/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
> index 848230248..de85c1406 100644
> --- a/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
> +++ b/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
));
> +
> +	if (!strcmp(res->cpu_num, "all")) {
> +
> +		/* Get first enabled lcore. */
> +		lcore_id = rte_get_next_lcore(-1,
> +				0,
> +				0);
> +		if (lcore_id == RTE_MAX_LCORE) {
> +			cmdline_printf(cl, "Enabled core not found.\n");
> +			return;
> +		}
> +
> +		pkt.command = CPU_POWER_QUERY_CAPS_LIST;
> +		strcpy(pkt.vm_name, policy.vm_name);
2 uses of strcpy in this patch, could this be changed to strlcpy().
/Lee.


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH 1/3] power: add new packet type for capabilities
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 1/3] power: add new packet type for capabilities Hajkowski
@ 2019-09-30 10:55   ` Daly, Lee
  2019-09-30 13:00   ` [dpdk-dev] [PATCH v2 0/3] Core capabilities query David Hunt
  1 sibling, 0 replies; 15+ messages in thread
From: Daly, Lee @ 2019-09-30 10:55 UTC (permalink / raw)
  To: Hajkowski, Hunt, David; +Cc: dev, Hajkowski, MarcinX



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Hajkowski
> Sent: Thursday, May 30, 2019 5:15 PM
> To: Hunt, David <david.hunt@intel.com>
> Cc: dev@dpdk.org; Hajkowski, MarcinX <marcinx.hajkowski@intel.com>
> Subject: [dpdk-dev] [PATCH 1/3] power: add new packet type for capabilities
> 
> From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
> 
> Add new packet type and commands for capabilities query.
> 
> Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
> ---
>  lib/librte_power/channel_commands.h | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/lib/librte_power/channel_commands.h
> b/lib/librte_power/channel_commands.h
> index ce587283c..b1f5584a8 100644
> --- a/lib/librte_power/channel_commands.h
> +++ b/lib/librte_power/channel_commands.h
> @@ -34,6 +34,8 @@ extern "C" {
>  /* CPU Power Queries */
>  #define CPU_POWER_QUERY_FREQ_LIST  7
>  #define CPU_POWER_QUERY_FREQ       8
> +#define CPU_POWER_QUERY_CAPS_LIST  9
> +#define CPU_POWER_QUERY_CAPS       10
> 
>  /* --- Outgoing messages --- */
> 
> @@ -43,6 +45,7 @@ extern "C" {
> 
>  /* CPU Power Query Responses */
>  #define CPU_POWER_FREQ_LIST     3
> +#define CPU_POWER_CAPS_LIST     4
> 
>  #define HOURS 24
> 
> @@ -106,6 +109,17 @@ struct channel_packet_freq_list {
>  	uint8_t num_vcpu;
>  };
> 
> +struct channel_packet_caps_list {
> +	uint64_t resource_id; /**< core_num, device */
> +	uint32_t unit;        /**< scale down/up/min/max */
> +	uint32_t command;     /**< Power, IO, etc */
> +	char vm_name[VM_MAX_NAME_SZ];
> +
> +	uint64_t turbo[MAX_VCPU_PER_VM];
> +	uint64_t priority[MAX_VCPU_PER_VM];
> +	uint8_t num_vcpu;
> +};
> +
> 
>  #ifdef __cplusplus
>  }
> --
> 2.17.2
Acked-by: Lee Daly <lee.daly@intel.com>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH 2/3] examples/power_manager: send cpu capabilities on vm request
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 2/3] examples/power_manager: send cpu capabilities on vm request Hajkowski
@ 2019-09-30 10:56   ` Daly, Lee
  0 siblings, 0 replies; 15+ messages in thread
From: Daly, Lee @ 2019-09-30 10:56 UTC (permalink / raw)
  To: Hajkowski, Hunt, David; +Cc: dev, Hajkowski, MarcinX



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Hajkowski
> Sent: Thursday, May 30, 2019 5:15 PM
> To: Hunt, David <david.hunt@intel.com>
> Cc: dev@dpdk.org; Hajkowski, MarcinX <marcinx.hajkowski@intel.com>
> Subject: [dpdk-dev] [PATCH 2/3] examples/power_manager: send cpu
> capabilities on vm request
> 
> From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
> 
> Send capabilities for requested cores.
> 
> Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
> ---
>  examples/vm_power_manager/channel_monitor.c | 67
> +++++++++++++++++++++
>  1 file changed, 67 insertions(+)
> 
> diff --git a/examples/vm_power_manager/channel_monitor.c
> b/examples/vm_power_manager/channel_monitor.c
> index bfd9cc38d..731b3b480 100644
> --- a/examples/vm_power_manager/channel_monitor.c
> +++ b/examples/vm_power_manager/channel_monitor.c

Acked-by: Lee Daly <lee.daly@intel.com>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH 3/3] examples/power_guest: send request for specified core capabilities
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 3/3] examples/power_guest: send request for specified core capabilities Hajkowski
  2019-09-30 10:54   ` Daly, Lee
@ 2019-09-30 12:54   ` Daly, Lee
  1 sibling, 0 replies; 15+ messages in thread
From: Daly, Lee @ 2019-09-30 12:54 UTC (permalink / raw)
  To: Hajkowski, Hunt, David; +Cc: dev, 'Hajkowski, MarcinX'



> -----Original Message-----
> From: Daly, Lee
> Sent: Monday, September 30, 2019 11:55 AM
> To: 'Hajkowski' <marcinx.hajkowski@intel.com>; Hunt, David
> <david.hunt@intel.com>
> Cc: dev@dpdk.org; Hajkowski, MarcinX <marcinx.hajkowski@intel.com>
> Subject: RE: [dpdk-dev] [PATCH 3/3] examples/power_guest: send request
> for specified core capabilities
> 
> Hi dave,
> See comments below.
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Hajkowski
> > Sent: Thursday, May 30, 2019 5:15 PM
> > To: Hunt, David <david.hunt@intel.com>
> > Cc: dev@dpdk.org; Hajkowski, MarcinX <marcinx.hajkowski@intel.com>
> > Subject: [dpdk-dev] [PATCH 3/3] examples/power_guest: send request for
> > specified core capabilities
> >
> > From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
> >
> > Send request to power manager for core id provided by user to get
> > related capabilities.
> >
> > Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
> > ---
> >  .../guest_cli/vm_power_cli_guest.c            | 119 +++++++++++++++++-
> >  1 file changed, 117 insertions(+), 2 deletions(-)
> >
> > diff --git
> a/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
> > b/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
> > index 848230248..de85c1406 100644
> > --- a/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
> > +++ b/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
> ));
> > +
> > +	if (!strcmp(res->cpu_num, "all")) {
> > +
> > +		/* Get first enabled lcore. */
> > +		lcore_id = rte_get_next_lcore(-1,
> > +				0,
> > +				0);
> > +		if (lcore_id == RTE_MAX_LCORE) {
> > +			cmdline_printf(cl, "Enabled core not found.\n");
> > +			return;
> > +		}
> > +
> > +		pkt.command = CPU_POWER_QUERY_CAPS_LIST;
> > +		strcpy(pkt.vm_name, policy.vm_name);
> 2 uses of strcpy in this patch, could this be changed to strlcpy().
> /Lee.
Feel free to add my ack after that small change.
Acked-by: Lee Daly <lee.daly@intel.com>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [dpdk-dev] [PATCH v2 0/3] Core capabilities query
  2019-05-30 16:15 ` [dpdk-dev] [PATCH 1/3] power: add new packet type for capabilities Hajkowski
  2019-09-30 10:55   ` Daly, Lee
@ 2019-09-30 13:00   ` David Hunt
  2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 1/3] power: add new packet type for capabilities David Hunt
                       ` (3 more replies)
  1 sibling, 4 replies; 15+ messages in thread
From: David Hunt @ 2019-09-30 13:00 UTC (permalink / raw)
  To: david.hunt; +Cc: dev

Extend guest channel and sample apps to query CPU capabilities. Useful
when a guest wants to see if there is a high frequency/priority
core available for heavier workloads, i.e. Intel SST-BF.

The guest_cli implements an example of this via the query_cpu_caps cmd.

Please note that these changes depend on
(http://patches.dpdk.org/project/dpdk/list/?series=6568) and
(http://patches.dpdk.org/project/dpdk/list/?series=6585) which
should be applied first.



^ permalink raw reply	[flat|nested] 15+ messages in thread

* [dpdk-dev] [PATCH v2 1/3] power: add new packet type for capabilities
  2019-09-30 13:00   ` [dpdk-dev] [PATCH v2 0/3] Core capabilities query David Hunt
@ 2019-09-30 13:00     ` David Hunt
  2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 2/3] examples/power_manager: send cpu capabilities on vm request David Hunt
                       ` (2 subsequent siblings)
  3 siblings, 0 replies; 15+ messages in thread
From: David Hunt @ 2019-09-30 13:00 UTC (permalink / raw)
  To: david.hunt; +Cc: dev, Marcin Hajkowski

From: Marcin Hajkowski <marcinx.hajkowski@intel.com>

Add new packet type and commands for capabilities query.

Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Tested-by: David Hunt <david.hunt@intel.com>
Acked-by: Lee Daly <lee.daly@intel.com>
---
 lib/librte_power/channel_commands.h | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/lib/librte_power/channel_commands.h b/lib/librte_power/channel_commands.h
index e461d9c0d..adc8e5ca2 100644
--- a/lib/librte_power/channel_commands.h
+++ b/lib/librte_power/channel_commands.h
@@ -31,6 +31,8 @@ extern "C" {
 /* CPU Power Queries */
 #define CPU_POWER_QUERY_FREQ_LIST  7
 #define CPU_POWER_QUERY_FREQ       8
+#define CPU_POWER_QUERY_CAPS_LIST  9
+#define CPU_POWER_QUERY_CAPS       10
 
 /* --- Outgoing messages --- */
 
@@ -40,6 +42,7 @@ extern "C" {
 
 /* CPU Power Query Responses */
 #define CPU_POWER_FREQ_LIST     3
+#define CPU_POWER_CAPS_LIST     4
 
 #define HOURS 24
 
@@ -103,6 +106,17 @@ struct channel_packet_freq_list {
 	uint8_t num_vcpu;
 };
 
+struct channel_packet_caps_list {
+	uint64_t resource_id; /**< core_num, device */
+	uint32_t unit;        /**< scale down/up/min/max */
+	uint32_t command;     /**< Power, IO, etc */
+	char vm_name[VM_MAX_NAME_SZ];
+
+	uint64_t turbo[MAX_VCPU_PER_VM];
+	uint64_t priority[MAX_VCPU_PER_VM];
+	uint8_t num_vcpu;
+};
+
 
 #ifdef __cplusplus
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [dpdk-dev] [PATCH v2 2/3] examples/power_manager: send cpu capabilities on vm request
  2019-09-30 13:00   ` [dpdk-dev] [PATCH v2 0/3] Core capabilities query David Hunt
  2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 1/3] power: add new packet type for capabilities David Hunt
@ 2019-09-30 13:00     ` David Hunt
  2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 3/3] examples/power_guest: send request for specified core capabilities David Hunt
  2019-10-27 20:16     ` [dpdk-dev] [PATCH v2 0/3] Core capabilities query Thomas Monjalon
  3 siblings, 0 replies; 15+ messages in thread
From: David Hunt @ 2019-09-30 13:00 UTC (permalink / raw)
  To: david.hunt; +Cc: dev, Marcin Hajkowski

From: Marcin Hajkowski <marcinx.hajkowski@intel.com>

Send capabilities for requested cores.

Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Tested-by: David Hunt <david.hunt@intel.com>
Acked-by: Lee Daly <lee.daly@intel.com>
---
 examples/vm_power_manager/channel_monitor.c | 67 +++++++++++++++++++++
 1 file changed, 67 insertions(+)

diff --git a/examples/vm_power_manager/channel_monitor.c b/examples/vm_power_manager/channel_monitor.c
index 0ae62835f..11b6db1c0 100644
--- a/examples/vm_power_manager/channel_monitor.c
+++ b/examples/vm_power_manager/channel_monitor.c
@@ -29,6 +29,7 @@
 #include <rte_cycles.h>
 #include <rte_ethdev.h>
 #include <rte_pmd_i40e.h>
+#include <rte_power.h>
 
 #include <libvirt/libvirt.h>
 #include "channel_monitor.h"
@@ -737,6 +738,60 @@ send_freq(struct channel_packet *pkt,
 			chan_info);
 }
 
+static int
+send_capabilities(struct channel_packet *pkt,
+		struct channel_info *chan_info,
+		bool list_requested)
+{
+	unsigned int vcore_id = pkt->resource_id;
+	struct channel_packet_caps_list channel_pkt_caps_list;
+	struct vm_info info;
+	struct rte_power_core_capabilities caps;
+	int ret;
+
+	if (get_info_vm(pkt->vm_name, &info) != 0)
+		return -1;
+
+	if (!list_requested && vcore_id >= MAX_VCPU_PER_VM)
+		return -1;
+
+	if (!info.allow_query)
+		return -1;
+
+	channel_pkt_caps_list.command = CPU_POWER_CAPS_LIST;
+	channel_pkt_caps_list.num_vcpu = info.num_vcpus;
+
+	if (list_requested) {
+		unsigned int i;
+		for (i = 0; i < info.num_vcpus; i++) {
+			ret = rte_power_get_capabilities(info.pcpu_map[i],
+					&caps);
+			if (ret == 0) {
+				channel_pkt_caps_list.turbo[i] =
+						caps.turbo;
+				channel_pkt_caps_list.priority[i] =
+						caps.priority;
+			} else
+				return -1;
+
+		}
+	} else {
+		ret = rte_power_get_capabilities(info.pcpu_map[vcore_id],
+				&caps);
+		if (ret == 0) {
+			channel_pkt_caps_list.turbo[vcore_id] =
+					caps.turbo;
+			channel_pkt_caps_list.priority[vcore_id] =
+					caps.priority;
+		} else
+			return -1;
+	}
+
+	return write_binary_packet(&channel_pkt_caps_list,
+			sizeof(channel_pkt_caps_list),
+			chan_info);
+}
+
 static int
 send_ack_for_received_cmd(struct channel_packet *pkt,
 		struct channel_info *chan_info,
@@ -845,6 +900,18 @@ process_request(struct channel_packet *pkt, struct channel_info *chan_info)
 			RTE_LOG(ERR, CHANNEL_MONITOR, "Error during frequency sending.\n");
 	}
 
+	if (pkt->command == CPU_POWER_QUERY_CAPS_LIST ||
+		pkt->command == CPU_POWER_QUERY_CAPS) {
+
+		RTE_LOG(INFO, CHANNEL_MONITOR,
+			"Capabilities for %s requested.\n", pkt->vm_name);
+		int ret = send_capabilities(pkt,
+				chan_info,
+				pkt->command == CPU_POWER_QUERY_CAPS_LIST);
+		if (ret < 0)
+			RTE_LOG(ERR, CHANNEL_MONITOR, "Error during sending capabilities.\n");
+	}
+
 	/*
 	 * Return is not checked as channel status may have been set to DISABLED
 	 * from management thread
-- 
2.17.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [dpdk-dev] [PATCH v2 3/3] examples/power_guest: send request for specified core capabilities
  2019-09-30 13:00   ` [dpdk-dev] [PATCH v2 0/3] Core capabilities query David Hunt
  2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 1/3] power: add new packet type for capabilities David Hunt
  2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 2/3] examples/power_manager: send cpu capabilities on vm request David Hunt
@ 2019-09-30 13:00     ` David Hunt
  2019-09-30 13:04       ` Hunt, David
  2019-10-27 20:16     ` [dpdk-dev] [PATCH v2 0/3] Core capabilities query Thomas Monjalon
  3 siblings, 1 reply; 15+ messages in thread
From: David Hunt @ 2019-09-30 13:00 UTC (permalink / raw)
  To: david.hunt; +Cc: dev, Marcin Hajkowski

From: Marcin Hajkowski <marcinx.hajkowski@intel.com>

Send request to power manager for core id provided
by user to get related capabilities.

Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Tested-by: David Hunt <david.hunt@intel.com>
Acked-by: Lee Daly <lee.daly@intel.com>
---
 .../guest_cli/vm_power_cli_guest.c            | 119 +++++++++++++++++-
 1 file changed, 117 insertions(+), 2 deletions(-)

diff --git a/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c b/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
index 0bdb2d0d0..096ecdc04 100644
--- a/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
+++ b/examples/vm_power_manager/guest_cli/vm_power_cli_guest.c
@@ -132,7 +132,7 @@ struct cmd_freq_list_result {
 };
 
 static int
-query_freq_list(struct channel_packet *pkt, unsigned int lcore_id)
+query_data(struct channel_packet *pkt, unsigned int lcore_id)
 {
 	int ret;
 	ret = rte_power_guest_channel_send_msg(pkt, lcore_id);
@@ -206,7 +206,7 @@ cmd_query_freq_list_parsed(void *parsed_result,
 		pkt.resource_id = lcore_id;
 	}
 
-	ret = query_freq_list(&pkt, lcore_id);
+	ret = query_data(&pkt, lcore_id);
 	if (ret < 0) {
 		cmdline_printf(cl, "Error during sending frequency list query.\n");
 		return;
@@ -248,6 +248,120 @@ cmdline_parse_inst_t cmd_query_freq_list = {
 	},
 };
 
+struct cmd_query_caps_result {
+	cmdline_fixed_string_t query_caps;
+	cmdline_fixed_string_t cpu_num;
+};
+
+static int
+receive_capabilities(struct channel_packet_caps_list *pkt_caps_list,
+		unsigned int lcore_id)
+{
+	int ret;
+
+	ret = rte_power_guest_channel_receive_msg(pkt_caps_list,
+		sizeof(struct channel_packet_caps_list),
+		lcore_id);
+	if (ret < 0) {
+		RTE_LOG(ERR, GUEST_CLI, "Error receiving message.\n");
+		return -1;
+	}
+	if (pkt_caps_list->command != CPU_POWER_CAPS_LIST) {
+		RTE_LOG(ERR, GUEST_CLI, "Unexpected message received.\n");
+		return -1;
+	}
+	return 0;
+}
+
+static void
+cmd_query_caps_list_parsed(void *parsed_result,
+		__rte_unused struct cmdline *cl,
+		__rte_unused void *data)
+{
+	struct cmd_query_caps_result *res = parsed_result;
+	unsigned int lcore_id;
+	struct channel_packet_caps_list pkt_caps_list;
+	struct channel_packet pkt;
+	bool query_list = false;
+	int ret;
+	char *ep;
+
+	memset(&pkt, 0, sizeof(struct channel_packet));
+	memset(&pkt_caps_list, 0, sizeof(struct channel_packet_caps_list));
+
+	if (!strcmp(res->cpu_num, "all")) {
+
+		/* Get first enabled lcore. */
+		lcore_id = rte_get_next_lcore(-1,
+				0,
+				0);
+		if (lcore_id == RTE_MAX_LCORE) {
+			cmdline_printf(cl, "Enabled core not found.\n");
+			return;
+		}
+
+		pkt.command = CPU_POWER_QUERY_CAPS_LIST;
+		strlcpy(pkt.vm_name, policy.vm_name, sizeof(pkt.vm_name));
+		query_list = true;
+	} else {
+		errno = 0;
+		lcore_id = (unsigned int)strtol(res->cpu_num, &ep, 10);
+		if (errno != 0 || lcore_id >= MAX_VCPU_PER_VM ||
+			ep == res->cpu_num) {
+			cmdline_printf(cl, "Invalid parameter provided.\n");
+			return;
+		}
+		pkt.command = CPU_POWER_QUERY_CAPS;
+		strlcpy(pkt.vm_name, policy.vm_name, sizeof(pkt.vm_name));
+		pkt.resource_id = lcore_id;
+	}
+
+	ret = query_data(&pkt, lcore_id);
+	if (ret < 0) {
+		cmdline_printf(cl, "Error during sending capabilities query.\n");
+		return;
+	}
+
+	ret = receive_capabilities(&pkt_caps_list, lcore_id);
+	if (ret < 0) {
+		cmdline_printf(cl, "Error during capabilities reception.\n");
+		return;
+	}
+	if (query_list) {
+		unsigned int i;
+		for (i = 0; i < pkt_caps_list.num_vcpu; ++i)
+			cmdline_printf(cl, "Capabilities of [%d] vcore are:"
+					" turbo possibility: %ld, is priority core: %ld.\n",
+					i,
+					pkt_caps_list.turbo[i],
+					pkt_caps_list.priority[i]);
+	} else {
+		cmdline_printf(cl, "Capabilities of [%d] vcore are:"
+				" turbo possibility: %ld, is priority core: %ld.\n",
+				lcore_id,
+				pkt_caps_list.turbo[lcore_id],
+				pkt_caps_list.priority[lcore_id]);
+	}
+}
+
+cmdline_parse_token_string_t cmd_query_caps_token =
+	TOKEN_STRING_INITIALIZER(struct cmd_query_caps_result, query_caps, "query_cpu_caps");
+cmdline_parse_token_string_t cmd_query_caps_cpu_num_token =
+	TOKEN_STRING_INITIALIZER(struct cmd_query_caps_result, cpu_num, NULL);
+
+cmdline_parse_inst_t cmd_query_caps_list = {
+	.f = cmd_query_caps_list_parsed,  /* function to call */
+	.data = NULL,      /* 2nd arg of func */
+	.help_str = "query_cpu_caps <core_num>|all, request"
+				" information regarding virtual core capabilities."
+				" The keyword 'all' will query list of all vcores for the VM",
+	.tokens = {        /* token list, NULL terminated */
+		(void *)&cmd_query_caps_token,
+		(void *)&cmd_query_caps_cpu_num_token,
+		NULL,
+	},
+};
+
 static int
 check_response_cmd(unsigned int lcore_id, int *result)
 {
@@ -408,6 +522,7 @@ cmdline_parse_ctx_t main_ctx[] = {
 		(cmdline_parse_inst_t *)&cmd_send_policy_set,
 		(cmdline_parse_inst_t *)&cmd_set_cpu_freq_set,
 		(cmdline_parse_inst_t *)&cmd_query_freq_list,
+		(cmdline_parse_inst_t *)&cmd_query_caps_list,
 		NULL,
 };
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH v2 3/3] examples/power_guest: send request for specified core capabilities
  2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 3/3] examples/power_guest: send request for specified core capabilities David Hunt
@ 2019-09-30 13:04       ` Hunt, David
  0 siblings, 0 replies; 15+ messages in thread
From: Hunt, David @ 2019-09-30 13:04 UTC (permalink / raw)
  Cc: dev, Marcin Hajkowski


On 30/09/2019 14:00, David Hunt wrote:
> From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
>
> Send request to power manager for core id provided
> by user to get related capabilities.
>
> Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
> Tested-by: David Hunt <david.hunt@intel.com>
> Acked-by: Lee Daly <lee.daly@intel.com>
> ---
>   .../guest_cli/vm_power_cli_guest.c            | 119 +++++++++++++++++-
>   1 file changed, 117 insertions(+), 2 deletions(-)
>
--snip--

Some of the steps to test included blow:

In the Host, enable queries via the virtio-serial interface from the
guest to the host:

vmpower> set_query ubuntu3 enable

In an SST-BF enabled host, with 6 high priority cores per
socket, query the list of high prioroty cores with the
sst_bf.py python script
(https://github.com/intel/commspowermanagement):

root@silpixa00399952:~# sst_bf.py -l
1,6,7,8,9,16,21,26,27,28,29,30
0x7c2103c2

In the host, query the cores used by the VM:

vmpower> show_vm ubuntu3
...snip...
Virtual CPU(s): 8
   [0]: Physical CPU 28
   [1]: Physical CPU 29
   [2]: Physical CPU 30
   [3]: Physical CPU 31
   [4]: Physical CPU 32
   [5]: Physical CPU 33
   [6]: Physical CPU 34
   [7]: Physical CPU 35

So we now know that cores 28,29 and 30 should show up as high priority
in the VM. So, from the VM side, we use the new 'query_cpu_caps' command
to see the capabilities of each core:

vmpower(guest)> query_cpu_caps all
Capabilities of [0] vcore are: turbo possibility: 1, is priority core: 1.
Capabilities of [1] vcore are: turbo possibility: 1, is priority core: 1.
Capabilities of [2] vcore are: turbo possibility: 1, is priority core: 1.
Capabilities of [3] vcore are: turbo possibility: 1, is priority core: 0.
Capabilities of [4] vcore are: turbo possibility: 1, is priority core: 0.
Capabilities of [5] vcore are: turbo possibility: 1, is priority core: 0.
Capabilities of [6] vcore are: turbo possibility: 1, is priority core: 0.
Capabilities of [7] vcore are: turbo possibility: 1, is priority core: 0.

As expected, vcore 0,1,2 (pcore 28,29,30) are high priority cores.

Tested-by: David Hunt <david.hunt@intel.com>




^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [dpdk-dev] [PATCH v2 0/3] Core capabilities query
  2019-09-30 13:00   ` [dpdk-dev] [PATCH v2 0/3] Core capabilities query David Hunt
                       ` (2 preceding siblings ...)
  2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 3/3] examples/power_guest: send request for specified core capabilities David Hunt
@ 2019-10-27 20:16     ` Thomas Monjalon
  3 siblings, 0 replies; 15+ messages in thread
From: Thomas Monjalon @ 2019-10-27 20:16 UTC (permalink / raw)
  To: David Hunt; +Cc: dev

30/09/2019 15:00, David Hunt:
> Extend guest channel and sample apps to query CPU capabilities. Useful
> when a guest wants to see if there is a high frequency/priority
> core available for heavier workloads, i.e. Intel SST-BF.
> 
> The guest_cli implements an example of this via the query_cpu_caps cmd.

Applied, thanks



^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2019-10-27 20:16 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-30 16:15 [dpdk-dev] [PATCH 0/3] Core capabilities query Hajkowski
2019-05-30 16:15 ` [dpdk-dev] [PATCH 1/3] power: add new packet type for capabilities Hajkowski
2019-09-30 10:55   ` Daly, Lee
2019-09-30 13:00   ` [dpdk-dev] [PATCH v2 0/3] Core capabilities query David Hunt
2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 1/3] power: add new packet type for capabilities David Hunt
2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 2/3] examples/power_manager: send cpu capabilities on vm request David Hunt
2019-09-30 13:00     ` [dpdk-dev] [PATCH v2 3/3] examples/power_guest: send request for specified core capabilities David Hunt
2019-09-30 13:04       ` Hunt, David
2019-10-27 20:16     ` [dpdk-dev] [PATCH v2 0/3] Core capabilities query Thomas Monjalon
2019-05-30 16:15 ` [dpdk-dev] [PATCH 2/3] examples/power_manager: send cpu capabilities on vm request Hajkowski
2019-09-30 10:56   ` Daly, Lee
2019-05-30 16:15 ` [dpdk-dev] [PATCH 3/3] examples/power_guest: send request for specified core capabilities Hajkowski
2019-09-30 10:54   ` Daly, Lee
2019-09-30 12:54   ` Daly, Lee
2019-07-04 19:58 ` [dpdk-dev] [PATCH 0/3] Core capabilities query Thomas Monjalon

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).