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:
parent
b4b2f84a59
commit
9dc843eb27
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user