[dpdk-dev] [PATCH v5 3/4] power: process incoming confirmation cmds

Hunt, David david.hunt at intel.com
Thu Sep 26 15:01:44 CEST 2019


On 05/04/2019 14:24, Hajkowski wrote:
> From: Marcin Hajkowski <marcinx.hajkowski at intel.com>
>
> Extend vm_power_guest to check incoming confirmations
> of messages previously sent to host.
>
> Signed-off-by: Marcin Hajkowski <marcinx.hajkowski at intel.com>
> ---
>   examples/vm_power_manager/guest_cli/Makefile  |  1 +
>   .../guest_cli/vm_power_cli_guest.c            | 73 +++++++++++++++----
>   2 files changed, 61 insertions(+), 13 deletions(-)
>
> diff --git a/examples/vm_power_manager/guest_cli/Makefile b/examples/vm_power_manager/guest_cli/Makefile
> index e35a68d0f..67cf08193 100644
> --- a/examples/vm_power_manager/guest_cli/Makefile
> +++ b/examples/vm_power_manager/guest_cli/Makefile
> @@ -18,6 +18,7 @@ SRCS-y := main.c vm_power_cli_guest.c parse.c
>   
>   CFLAGS += -O3 -I$(RTE_SDK)/lib/librte_power/
>   CFLAGS += $(WERROR_FLAGS)
> +CFLAGS += -DALLOW_EXPERIMENTAL_API
>   
>   # workaround for a gcc bug with noreturn attribute
>   # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603
> 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 2d9e7689a..49ed7b208 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
> @@ -27,7 +27,7 @@
>   #define CHANNEL_PATH "/dev/virtio-ports/virtio.serial.port.poweragent"
>   
>   
> -#define RTE_LOGTYPE_GUEST_CHANNEL RTE_LOGTYPE_USER1
> +#define RTE_LOGTYPE_GUEST_CLI RTE_LOGTYPE_USER1
>   
>   struct cmd_quit_result {
>   	cmdline_fixed_string_t quit;
> @@ -132,6 +132,32 @@ struct cmd_set_cpu_freq_result {
>   	cmdline_fixed_string_t cmd;
>   };
>   
> +static int
> +check_response_cmd(unsigned int lcore_id, int *result)
> +{
> +	struct channel_packet pkt;
> +	int ret;
> +
> +	ret = rte_power_guest_channel_receive_msg(&pkt, lcore_id);
> +	if (ret < 0)
> +		return -1;
> +
> +	switch (pkt.command) {
> +	case(CPU_POWER_CMD_ACK):
> +		*result = 1;
> +		break;
> +	case(CPU_POWER_CMD_NACK):
> +		*result = 0;
> +		break;
> +	default:
> +		RTE_LOG(ERR, GUEST_CLI,
> +				"Received invalid response from host, expecting ACK/NACK.\n");
> +		return -1;
> +	}
> +
> +	return 0;
> +}
> +
>   static void
>   cmd_set_cpu_freq_parsed(void *parsed_result, struct cmdline *cl,
>   		       __attribute__((unused)) void *data)
> @@ -139,20 +165,31 @@ cmd_set_cpu_freq_parsed(void *parsed_result, struct cmdline *cl,
>   	int ret = -1;
>   	struct cmd_set_cpu_freq_result *res = parsed_result;
>   
> -	if (!strcmp(res->cmd , "up"))
> +	if (!strcmp(res->cmd, "up"))
>   		ret = rte_power_freq_up(res->lcore_id);
> -	else if (!strcmp(res->cmd , "down"))
> +	else if (!strcmp(res->cmd, "down"))
>   		ret = rte_power_freq_down(res->lcore_id);
> -	else if (!strcmp(res->cmd , "min"))
> +	else if (!strcmp(res->cmd, "min"))
>   		ret = rte_power_freq_min(res->lcore_id);
> -	else if (!strcmp(res->cmd , "max"))
> +	else if (!strcmp(res->cmd, "max"))
>   		ret = rte_power_freq_max(res->lcore_id);
>   	else if (!strcmp(res->cmd, "enable_turbo"))
>   		ret = rte_power_freq_enable_turbo(res->lcore_id);
>   	else if (!strcmp(res->cmd, "disable_turbo"))
>   		ret = rte_power_freq_disable_turbo(res->lcore_id);
> -	if (ret != 1)
> +
> +	if (ret != 1) {
>   		cmdline_printf(cl, "Error sending message: %s\n", strerror(ret));
> +		return;
> +	}
> +	int result;
> +	ret = check_response_cmd(res->lcore_id, &result);
> +	if (ret < 0) {
> +		RTE_LOG(ERR, GUEST_CLI, "No confirmation for sent message received\n");
> +	} else {
> +		cmdline_printf(cl, "%s received for message sent to host.\n",
> +				result == 1 ? "ACK" : "NACK");
> +	}
>   }
>   
>   cmdline_parse_token_string_t cmd_set_cpu_freq =
> @@ -185,16 +222,26 @@ struct cmd_send_policy_result {
>   };
>   
>   static inline int
> -send_policy(struct channel_packet *pkt)
> +send_policy(struct channel_packet *pkt, struct cmdline *cl)
>   {
>   	int ret;
>   
>   	ret = rte_power_guest_channel_send_msg(pkt, 1);
> -	if (ret == 0)
> -		return 1;
> -	RTE_LOG(DEBUG, POWER, "Error sending message: %s\n",
> -			ret > 0 ? strerror(ret) : "channel not connected");
> -	return -1;
> +	if (ret < 0) {
> +		RTE_LOG(ERR, GUEST_CLI, "Error sending message: %s\n",
> +				ret > 0 ? strerror(ret) : "channel not connected");
> +		return -1;
> +	}
> +
> +	int result;
> +	ret = check_response_cmd(1, &result);
> +	if (ret < 0) {
> +		RTE_LOG(ERR, GUEST_CLI, "No confirmation for sent policy received\n");
> +	} else {
> +		cmdline_printf(cl, "%s for sent policy received.\n",
> +				result == 1 ? "ACK" : "NACK");
> +	}
> +	return 1;
>   }
>   
>   static void
> @@ -206,7 +253,7 @@ cmd_send_policy_parsed(void *parsed_result, struct cmdline *cl,
>   
>   	if (!strcmp(res->cmd, "now")) {
>   		printf("Sending Policy down now!\n");
> -		ret = send_policy(&policy);
> +		ret = send_policy(&policy, cl);
>   	}
>   	if (ret != 1)
>   		cmdline_printf(cl, "Error sending message: %s\n",



I tested this with the later patches in the set, and the acknowledges 
successfully get back to the guest from the host in the form of an Ack 
or Nack for various commands sent from the guest.

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






More information about the dev mailing list