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 <marcinx.hajkowski@intel.com>
Tested-by: David Hunt <david.hunt@intel.com>
Acked-by: Lee Daly <lee.daly@intel.com>
This commit is contained in:
Marcin Hajkowski 2019-09-27 13:15:58 +01:00 committed by Thomas Monjalon
parent e4d028a0fb
commit 04a8cb8ee9
4 changed files with 55 additions and 17 deletions

View File

@ -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;

View File

@ -12,6 +12,8 @@ extern "C" {
#include <stdint.h>
#include <stdbool.h>
/* --- 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
}

View File

@ -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

View File

@ -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
}