From 04a8cb8ee95f82b22f18bb9de83b740b5b943a59 Mon Sep 17 00:00:00 2001 From: Marcin Hajkowski Date: Fri, 27 Sep 2019 13:15:58 +0100 Subject: [PATCH] power: extend guest channel for frequency query Extend incoming packet reading API with new packet type which carries CPU frequencies. Signed-off-by: Marcin Hajkowski Tested-by: David Hunt Acked-by: Lee Daly --- .../guest_cli/vm_power_cli_guest.c | 2 +- lib/librte_power/channel_commands.h | 21 +++++++++++++++ lib/librte_power/guest_channel.c | 27 +++++++++++-------- lib/librte_power/guest_channel.h | 22 +++++++++++---- 4 files changed, 55 insertions(+), 17 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 ebdfe0bad5..55779d99f8 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 @@ -151,7 +151,7 @@ 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); + ret = rte_power_guest_channel_receive_msg(&pkt, sizeof pkt, lcore_id); if (ret < 0) return -1; diff --git a/lib/librte_power/channel_commands.h b/lib/librte_power/channel_commands.h index d81216b420..e461d9c0d3 100644 --- a/lib/librte_power/channel_commands.h +++ b/lib/librte_power/channel_commands.h @@ -12,6 +12,8 @@ extern "C" { #include #include +/* --- Incoming messages --- */ + /* Valid Commands */ #define CPU_POWER 1 #define CPU_POWER_CONNECT 2 @@ -26,10 +28,19 @@ extern "C" { #define CPU_POWER_ENABLE_TURBO 5 #define CPU_POWER_DISABLE_TURBO 6 +/* CPU Power Queries */ +#define CPU_POWER_QUERY_FREQ_LIST 7 +#define CPU_POWER_QUERY_FREQ 8 + +/* --- Outgoing messages --- */ + /* Generic Power Command Response */ #define CPU_POWER_CMD_ACK 1 #define CPU_POWER_CMD_NACK 2 +/* CPU Power Query Responses */ +#define CPU_POWER_FREQ_LIST 3 + #define HOURS 24 #define MAX_VFS 10 @@ -82,6 +93,16 @@ struct channel_packet { struct t_boost_status t_boost_status; }; +struct channel_packet_freq_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]; + + uint32_t freq_list[MAX_VCPU_PER_VM]; + uint8_t num_vcpu; +}; + #ifdef __cplusplus } diff --git a/lib/librte_power/guest_channel.c b/lib/librte_power/guest_channel.c index 888423891e..439cd2f38a 100644 --- a/lib/librte_power/guest_channel.c +++ b/lib/librte_power/guest_channel.c @@ -129,13 +129,15 @@ int rte_power_guest_channel_send_msg(struct channel_packet *pkt, return guest_channel_send_msg(pkt, lcore_id); } -int power_guest_channel_read_msg(struct channel_packet *pkt, - unsigned int lcore_id) +int power_guest_channel_read_msg(void *pkt, + size_t pkt_len, + unsigned int lcore_id) { int ret; struct pollfd fds; - void *buffer = pkt; - int buffer_len = sizeof(*pkt); + + if (pkt_len == 0 || pkt == NULL) + return -1; fds.fd = global_fds[lcore_id]; fds.events = POLLIN; @@ -161,29 +163,32 @@ int power_guest_channel_read_msg(struct channel_packet *pkt, return -1; } - while (buffer_len > 0) { + while (pkt_len > 0) { ret = read(global_fds[lcore_id], - buffer, buffer_len); + pkt, pkt_len); + if (ret < 0) { if (errno == EINTR) continue; return -1; } + if (ret == 0) { RTE_LOG(ERR, GUEST_CHANNEL, "Expected more data, but connection has been closed.\n"); return -1; } - buffer = (char *)buffer + ret; - buffer_len -= ret; + pkt = (char *)pkt + ret; + pkt_len -= ret; } return 0; } -int rte_power_guest_channel_receive_msg(struct channel_packet *pkt, - unsigned int lcore_id) +int rte_power_guest_channel_receive_msg(void *pkt, + size_t pkt_len, + unsigned int lcore_id) { - return power_guest_channel_read_msg(pkt, lcore_id); + return power_guest_channel_read_msg(pkt, pkt_len, lcore_id); } void diff --git a/lib/librte_power/guest_channel.h b/lib/librte_power/guest_channel.h index 61e1422895..025961606c 100644 --- a/lib/librte_power/guest_channel.h +++ b/lib/librte_power/guest_channel.h @@ -17,6 +17,7 @@ extern "C" { * * @param path * The path to the serial device on the filesystem + * * @param lcore_id * lcore_id. * @@ -73,7 +74,11 @@ int rte_power_guest_channel_send_msg(struct channel_packet *pkt, * from the host endpoint. * * @param pkt - * Pointer to a populated struct channel_packet + * Pointer to channel_packet or + * channel_packet_freq_list struct. + * + * @param pkt_len + * Size of expected data packet. * * @param lcore_id * lcore_id. @@ -82,7 +87,8 @@ int rte_power_guest_channel_send_msg(struct channel_packet *pkt, * - 0 on success. * - Negative on error. */ -int power_guest_channel_read_msg(struct channel_packet *pkt, +int power_guest_channel_read_msg(void *pkt, + size_t pkt_len, unsigned int lcore_id); /** @@ -90,7 +96,11 @@ int power_guest_channel_read_msg(struct channel_packet *pkt, * from the host endpoint. * * @param pkt - * Pointer to a populated struct channel_packet + * Pointer to channel_packet or + * channel_packet_freq_list struct. + * + * @param pkt_len + * Size of expected data packet. * * @param lcore_id * lcore_id. @@ -101,8 +111,10 @@ int power_guest_channel_read_msg(struct channel_packet *pkt, */ __rte_experimental int -rte_power_guest_channel_receive_msg(struct channel_packet *pkt, - unsigned int lcore_id); +rte_power_guest_channel_receive_msg(void *pkt, + size_t pkt_len, + unsigned int lcore_id); + #ifdef __cplusplus } -- 2.20.1