power: extend guest channel API for reading

Added new experimental API rte_power_guest_channel_receive_msg
which gives possibility to receive messages send to guest.

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 09:42:14 +01:00 committed by Thomas Monjalon
parent b4b2f84a59
commit 9dc843eb27
4 changed files with 102 additions and 0 deletions

View File

@ -25,6 +25,11 @@ extern "C" {
#define CPU_POWER_SCALE_MIN 4
#define CPU_POWER_ENABLE_TURBO 5
#define CPU_POWER_DISABLE_TURBO 6
/* Generic Power Command Response */
#define CPU_POWER_CMD_ACK 1
#define CPU_POWER_CMD_NACK 2
#define HOURS 24
#define MAX_VFS 10

View File

@ -10,6 +10,7 @@
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <poll.h>
#include <rte_log.h>
@ -19,6 +20,9 @@
#define RTE_LOGTYPE_GUEST_CHANNEL RTE_LOGTYPE_USER1
/* Timeout for incoming message in milliseconds. */
#define TIMEOUT 10
static int global_fds[RTE_MAX_LCORE] = { [0 ... RTE_MAX_LCORE-1] = -1 };
int
@ -125,6 +129,62 @@ 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 ret;
struct pollfd fds;
void *buffer = pkt;
int buffer_len = sizeof(*pkt);
fds.fd = global_fds[lcore_id];
fds.events = POLLIN;
ret = poll(&fds, 1, TIMEOUT);
if (ret == 0) {
RTE_LOG(DEBUG, GUEST_CHANNEL, "Timeout occurred during poll function.\n");
return -1;
} else if (ret < 0) {
RTE_LOG(ERR, GUEST_CHANNEL, "Error occurred during poll function: %s\n",
strerror(ret));
return -1;
}
if (lcore_id >= RTE_MAX_LCORE) {
RTE_LOG(ERR, GUEST_CHANNEL, "Channel(%u) is out of range 0...%d\n",
lcore_id, RTE_MAX_LCORE-1);
return -1;
}
if (global_fds[lcore_id] < 0) {
RTE_LOG(ERR, GUEST_CHANNEL, "Channel is not connected\n");
return -1;
}
while (buffer_len > 0) {
ret = read(global_fds[lcore_id],
buffer, buffer_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;
}
return 0;
}
int rte_power_guest_channel_receive_msg(struct channel_packet *pkt,
unsigned int lcore_id)
{
return power_guest_channel_read_msg(pkt, lcore_id);
}
void
guest_channel_host_disconnect(unsigned int lcore_id)

View File

@ -68,6 +68,42 @@ int guest_channel_send_msg(struct channel_packet *pkt, unsigned int lcore_id);
int rte_power_guest_channel_send_msg(struct channel_packet *pkt,
unsigned int lcore_id);
/**
* Read a message contained in pkt over the Virtio-Serial
* from the host endpoint.
*
* @param pkt
* Pointer to a populated struct channel_packet
*
* @param lcore_id
* lcore_id.
*
* @return
* - 0 on success.
* - Negative on error.
*/
int power_guest_channel_read_msg(struct channel_packet *pkt,
unsigned int lcore_id);
/**
* Receive a message contained in pkt over the Virtio-Serial
* from the host endpoint.
*
* @param pkt
* Pointer to a populated struct channel_packet
*
* @param lcore_id
* lcore_id.
*
* @return
* - 0 on success.
* - Negative on error.
*/
__rte_experimental
int
rte_power_guest_channel_receive_msg(struct channel_packet *pkt,
unsigned int lcore_id);
#ifdef __cplusplus
}
#endif

View File

@ -42,6 +42,7 @@ EXPERIMENTAL {
rte_power_empty_poll_stat_free;
rte_power_empty_poll_stat_init;
rte_power_empty_poll_stat_update;
rte_power_guest_channel_receive_msg;
rte_power_poll_stat_fetch;
rte_power_poll_stat_update;
};