* [dpdk-dev] [PATCH v2 0/4] bidirect guest channel
@ 2019-03-18 13:48 Hajkowski
2019-03-18 13:48 ` Hajkowski
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: Hajkowski @ 2019-03-18 13:48 UTC (permalink / raw)
To: david.hunt; +Cc: dev, Marcin Hajkowski
From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Extend guest channel API to allow bidirectional
communication. Modify power manager host and guest
side to communicate in both directions.
v2:
* send ack only if power operation return positive value
* log diffent error for unexpected incoming command and
error during ack/nak cmd sending
Marcin Hajkowski (4):
power: fix invalid socket indicator value
power: extend guest channel api for reading
power: process incoming confirmation cmds
power: send confirmation cmd to vm guest
examples/vm_power_manager/channel_monitor.c | 67 ++++++++++++++++--
examples/vm_power_manager/guest_cli/Makefile | 1 +
.../guest_cli/vm_power_cli_guest.c | 65 +++++++++++++----
lib/librte_power/channel_commands.h | 5 ++
lib/librte_power/guest_channel.c | 69 +++++++++++++++++--
lib/librte_power/guest_channel.h | 35 ++++++++++
lib/librte_power/rte_power_version.map | 1 +
7 files changed, 219 insertions(+), 24 deletions(-)
--
2.17.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v2 0/4] bidirect guest channel
2019-03-18 13:48 [dpdk-dev] [PATCH v2 0/4] bidirect guest channel Hajkowski
@ 2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 1/4] power: fix invalid socket indicator value Hajkowski
` (3 subsequent siblings)
4 siblings, 0 replies; 12+ messages in thread
From: Hajkowski @ 2019-03-18 13:48 UTC (permalink / raw)
To: david.hunt; +Cc: dev, Marcin Hajkowski
From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Extend guest channel API to allow bidirectional
communication. Modify power manager host and guest
side to communicate in both directions.
v2:
* send ack only if power operation return positive value
* log diffent error for unexpected incoming command and
error during ack/nak cmd sending
Marcin Hajkowski (4):
power: fix invalid socket indicator value
power: extend guest channel api for reading
power: process incoming confirmation cmds
power: send confirmation cmd to vm guest
examples/vm_power_manager/channel_monitor.c | 67 ++++++++++++++++--
examples/vm_power_manager/guest_cli/Makefile | 1 +
.../guest_cli/vm_power_cli_guest.c | 65 +++++++++++++----
lib/librte_power/channel_commands.h | 5 ++
lib/librte_power/guest_channel.c | 69 +++++++++++++++++--
lib/librte_power/guest_channel.h | 35 ++++++++++
lib/librte_power/rte_power_version.map | 1 +
7 files changed, 219 insertions(+), 24 deletions(-)
--
2.17.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v2 1/4] power: fix invalid socket indicator value
2019-03-18 13:48 [dpdk-dev] [PATCH v2 0/4] bidirect guest channel Hajkowski
2019-03-18 13:48 ` Hajkowski
@ 2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 2/4] power: extend guest channel api for reading Hajkowski
` (2 subsequent siblings)
4 siblings, 1 reply; 12+ messages in thread
From: Hajkowski @ 2019-03-18 13:48 UTC (permalink / raw)
To: david.hunt; +Cc: dev, Marcin Hajkowski, stable
From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Currently 0 is being used for not connected slot indication.
This is not consistent with linux doc which identifies 0 as valid
(connected) slot, thus modification was done to change it.
Fixes: cd0d5547 ("power: vm communication channels in guest")
Cc: stable@dpdk.org
Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
---
lib/librte_power/guest_channel.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/lib/librte_power/guest_channel.c b/lib/librte_power/guest_channel.c
index c17ea46b4..9cf7d2cb2 100644
--- a/lib/librte_power/guest_channel.c
+++ b/lib/librte_power/guest_channel.c
@@ -19,7 +19,7 @@
#define RTE_LOGTYPE_GUEST_CHANNEL RTE_LOGTYPE_USER1
-static int global_fds[RTE_MAX_LCORE];
+static int global_fds[RTE_MAX_LCORE] = { [0 ... RTE_MAX_LCORE-1] = -1 };
int
guest_channel_host_connect(const char *path, unsigned int lcore_id)
@@ -35,7 +35,7 @@ guest_channel_host_connect(const char *path, unsigned int lcore_id)
return -1;
}
/* check if path is already open */
- if (global_fds[lcore_id] != 0) {
+ if (global_fds[lcore_id] != -1) {
RTE_LOG(ERR, GUEST_CHANNEL, "Channel(%u) is already open with fd %d\n",
lcore_id, global_fds[lcore_id]);
return -1;
@@ -84,7 +84,7 @@ guest_channel_host_connect(const char *path, unsigned int lcore_id)
return 0;
error:
close(fd);
- global_fds[lcore_id] = 0;
+ global_fds[lcore_id] = -1;
return -1;
}
@@ -100,7 +100,7 @@ guest_channel_send_msg(struct channel_packet *pkt, unsigned int lcore_id)
return -1;
}
- if (global_fds[lcore_id] == 0) {
+ if (global_fds[lcore_id] < 0) {
RTE_LOG(ERR, GUEST_CHANNEL, "Channel is not connected\n");
return -1;
}
@@ -134,8 +134,8 @@ guest_channel_host_disconnect(unsigned int lcore_id)
lcore_id, RTE_MAX_LCORE-1);
return;
}
- if (global_fds[lcore_id] == 0)
+ if (global_fds[lcore_id] < 0)
return;
close(global_fds[lcore_id]);
- global_fds[lcore_id] = 0;
+ global_fds[lcore_id] = -1;
}
--
2.17.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v2 1/4] power: fix invalid socket indicator value
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 1/4] power: fix invalid socket indicator value Hajkowski
@ 2019-03-18 13:48 ` Hajkowski
0 siblings, 0 replies; 12+ messages in thread
From: Hajkowski @ 2019-03-18 13:48 UTC (permalink / raw)
To: david.hunt; +Cc: dev, Marcin Hajkowski, stable
From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Currently 0 is being used for not connected slot indication.
This is not consistent with linux doc which identifies 0 as valid
(connected) slot, thus modification was done to change it.
Fixes: cd0d5547 ("power: vm communication channels in guest")
Cc: stable@dpdk.org
Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
---
lib/librte_power/guest_channel.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/lib/librte_power/guest_channel.c b/lib/librte_power/guest_channel.c
index c17ea46b4..9cf7d2cb2 100644
--- a/lib/librte_power/guest_channel.c
+++ b/lib/librte_power/guest_channel.c
@@ -19,7 +19,7 @@
#define RTE_LOGTYPE_GUEST_CHANNEL RTE_LOGTYPE_USER1
-static int global_fds[RTE_MAX_LCORE];
+static int global_fds[RTE_MAX_LCORE] = { [0 ... RTE_MAX_LCORE-1] = -1 };
int
guest_channel_host_connect(const char *path, unsigned int lcore_id)
@@ -35,7 +35,7 @@ guest_channel_host_connect(const char *path, unsigned int lcore_id)
return -1;
}
/* check if path is already open */
- if (global_fds[lcore_id] != 0) {
+ if (global_fds[lcore_id] != -1) {
RTE_LOG(ERR, GUEST_CHANNEL, "Channel(%u) is already open with fd %d\n",
lcore_id, global_fds[lcore_id]);
return -1;
@@ -84,7 +84,7 @@ guest_channel_host_connect(const char *path, unsigned int lcore_id)
return 0;
error:
close(fd);
- global_fds[lcore_id] = 0;
+ global_fds[lcore_id] = -1;
return -1;
}
@@ -100,7 +100,7 @@ guest_channel_send_msg(struct channel_packet *pkt, unsigned int lcore_id)
return -1;
}
- if (global_fds[lcore_id] == 0) {
+ if (global_fds[lcore_id] < 0) {
RTE_LOG(ERR, GUEST_CHANNEL, "Channel is not connected\n");
return -1;
}
@@ -134,8 +134,8 @@ guest_channel_host_disconnect(unsigned int lcore_id)
lcore_id, RTE_MAX_LCORE-1);
return;
}
- if (global_fds[lcore_id] == 0)
+ if (global_fds[lcore_id] < 0)
return;
close(global_fds[lcore_id]);
- global_fds[lcore_id] = 0;
+ global_fds[lcore_id] = -1;
}
--
2.17.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v2 2/4] power: extend guest channel api for reading
2019-03-18 13:48 [dpdk-dev] [PATCH v2 0/4] bidirect guest channel Hajkowski
2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 1/4] power: fix invalid socket indicator value Hajkowski
@ 2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` Hajkowski
2019-03-19 15:00 ` Pattan, Reshma
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 3/4] power: process incoming confirmation cmds Hajkowski
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 4/4] power: send confirmation cmd to vm guest Hajkowski
4 siblings, 2 replies; 12+ messages in thread
From: Hajkowski @ 2019-03-18 13:48 UTC (permalink / raw)
To: david.hunt; +Cc: dev, Marcin Hajkowski
From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
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>
---
lib/librte_power/channel_commands.h | 5 +++
lib/librte_power/guest_channel.c | 57 ++++++++++++++++++++++++++
lib/librte_power/guest_channel.h | 35 ++++++++++++++++
lib/librte_power/rte_power_version.map | 1 +
4 files changed, 98 insertions(+)
diff --git a/lib/librte_power/channel_commands.h b/lib/librte_power/channel_commands.h
index e7b93a797..1aff604c4 100644
--- a/lib/librte_power/channel_commands.h
+++ b/lib/librte_power/channel_commands.h
@@ -28,6 +28,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_NAK 2
+
#define HOURS 24
#define MAX_VFS 10
diff --git a/lib/librte_power/guest_channel.c b/lib/librte_power/guest_channel.c
index 9cf7d2cb2..ae433caa5 100644
--- a/lib/librte_power/guest_channel.c
+++ b/lib/librte_power/guest_channel.c
@@ -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,59 @@ 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, buffer_len = sizeof(*pkt);
+ void *buffer = pkt;
+
+ 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;
+ }
+ buffer = (char *)buffer + ret;
+ buffer_len -= ret;
+ }
+
+ return 0;
+}
+
+int rte_power_guest_channel_receive_msg(struct channel_packet *pkt,
+ unsigned int lcore_id)
+{
+ int ret;
+
+ struct pollfd fds;
+ fds.fd = global_fds[lcore_id];
+ fds.events = POLLIN;
+
+ ret = poll(&fds, 1, TIMEOUT);
+ if (ret == 0) {
+ RTE_LOG(DEBUG, GUEST_CHANNEL, "Timeout occurs 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;
+ }
+
+ return power_guest_channel_read_msg(pkt, lcore_id);
+}
void
guest_channel_host_disconnect(unsigned int lcore_id)
diff --git a/lib/librte_power/guest_channel.h b/lib/librte_power/guest_channel.h
index 373d39898..7c385df39 100644
--- a/lib/librte_power/guest_channel.h
+++ b/lib/librte_power/guest_channel.h
@@ -68,6 +68,41 @@ 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.
+ */
+int __rte_experimental
+rte_power_guest_channel_receive_msg(struct channel_packet *pkt,
+ unsigned int lcore_id);
+
#ifdef __cplusplus
}
#endif
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
index 042917360..69f5ea3f4 100644
--- a/lib/librte_power/rte_power_version.map
+++ b/lib/librte_power/rte_power_version.map
@@ -44,4 +44,5 @@ EXPERIMENTAL {
rte_power_empty_poll_stat_update;
rte_power_poll_stat_fetch;
rte_power_poll_stat_update;
+ rte_power_guest_channel_receive_msg;
};
--
2.17.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v2 2/4] power: extend guest channel api for reading
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 2/4] power: extend guest channel api for reading Hajkowski
@ 2019-03-18 13:48 ` Hajkowski
2019-03-19 15:00 ` Pattan, Reshma
1 sibling, 0 replies; 12+ messages in thread
From: Hajkowski @ 2019-03-18 13:48 UTC (permalink / raw)
To: david.hunt; +Cc: dev, Marcin Hajkowski
From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
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>
---
lib/librte_power/channel_commands.h | 5 +++
lib/librte_power/guest_channel.c | 57 ++++++++++++++++++++++++++
lib/librte_power/guest_channel.h | 35 ++++++++++++++++
lib/librte_power/rte_power_version.map | 1 +
4 files changed, 98 insertions(+)
diff --git a/lib/librte_power/channel_commands.h b/lib/librte_power/channel_commands.h
index e7b93a797..1aff604c4 100644
--- a/lib/librte_power/channel_commands.h
+++ b/lib/librte_power/channel_commands.h
@@ -28,6 +28,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_NAK 2
+
#define HOURS 24
#define MAX_VFS 10
diff --git a/lib/librte_power/guest_channel.c b/lib/librte_power/guest_channel.c
index 9cf7d2cb2..ae433caa5 100644
--- a/lib/librte_power/guest_channel.c
+++ b/lib/librte_power/guest_channel.c
@@ -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,59 @@ 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, buffer_len = sizeof(*pkt);
+ void *buffer = pkt;
+
+ 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;
+ }
+ buffer = (char *)buffer + ret;
+ buffer_len -= ret;
+ }
+
+ return 0;
+}
+
+int rte_power_guest_channel_receive_msg(struct channel_packet *pkt,
+ unsigned int lcore_id)
+{
+ int ret;
+
+ struct pollfd fds;
+ fds.fd = global_fds[lcore_id];
+ fds.events = POLLIN;
+
+ ret = poll(&fds, 1, TIMEOUT);
+ if (ret == 0) {
+ RTE_LOG(DEBUG, GUEST_CHANNEL, "Timeout occurs 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;
+ }
+
+ return power_guest_channel_read_msg(pkt, lcore_id);
+}
void
guest_channel_host_disconnect(unsigned int lcore_id)
diff --git a/lib/librte_power/guest_channel.h b/lib/librte_power/guest_channel.h
index 373d39898..7c385df39 100644
--- a/lib/librte_power/guest_channel.h
+++ b/lib/librte_power/guest_channel.h
@@ -68,6 +68,41 @@ 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.
+ */
+int __rte_experimental
+rte_power_guest_channel_receive_msg(struct channel_packet *pkt,
+ unsigned int lcore_id);
+
#ifdef __cplusplus
}
#endif
diff --git a/lib/librte_power/rte_power_version.map b/lib/librte_power/rte_power_version.map
index 042917360..69f5ea3f4 100644
--- a/lib/librte_power/rte_power_version.map
+++ b/lib/librte_power/rte_power_version.map
@@ -44,4 +44,5 @@ EXPERIMENTAL {
rte_power_empty_poll_stat_update;
rte_power_poll_stat_fetch;
rte_power_poll_stat_update;
+ rte_power_guest_channel_receive_msg;
};
--
2.17.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v2 3/4] power: process incoming confirmation cmds
2019-03-18 13:48 [dpdk-dev] [PATCH v2 0/4] bidirect guest channel Hajkowski
` (2 preceding siblings ...)
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 2/4] power: extend guest channel api for reading Hajkowski
@ 2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 4/4] power: send confirmation cmd to vm guest Hajkowski
4 siblings, 1 reply; 12+ messages in thread
From: Hajkowski @ 2019-03-18 13:48 UTC (permalink / raw)
To: david.hunt; +Cc: dev, Marcin Hajkowski
From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Extend vm_power_guest to check incoming confirmations
of messages previously sent to host.
Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
---
examples/vm_power_manager/guest_cli/Makefile | 1 +
.../guest_cli/vm_power_cli_guest.c | 65 +++++++++++++++----
2 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/examples/vm_power_manager/guest_cli/Makefile b/examples/vm_power_manager/guest_cli/Makefile
index a5634eacf..51a5010ab 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..674d9d55f 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
@@ -132,6 +132,26 @@ 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;
+
+ if (pkt.command != CPU_POWER_CMD_ACK &&
+ pkt.command != CPU_POWER_CMD_NAK) {
+ RTE_LOG(DEBUG, POWER, "Not expected command has been received.\n");
+ return -1;
+ }
+
+ *result = (pkt.command == CPU_POWER_CMD_ACK);
+ return 0;
+}
+
static void
cmd_set_cpu_freq_parsed(void *parsed_result, struct cmdline *cl,
__attribute__((unused)) void *data)
@@ -139,20 +159,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(DEBUG, POWER, "No confirmation for sent msg received\n");
+ } else {
+ cmdline_printf(cl, "Ack for sent msg received with result: %s.\n",
+ result == 1 ? "SUCCESS" : "ERROR");
+ }
}
cmdline_parse_token_string_t cmd_set_cpu_freq =
@@ -185,16 +216,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(DEBUG, POWER, "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(DEBUG, POWER, "No confirmation for sent policy received\n");
+ } else {
+ cmdline_printf(cl, "Ack for sent policy received with result: %s.\n",
+ result == 1 ? "SUCCESS" : "ERROR");
+ }
+ return 1;
}
static void
@@ -206,7 +247,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",
--
2.17.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v2 3/4] power: process incoming confirmation cmds
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 3/4] power: process incoming confirmation cmds Hajkowski
@ 2019-03-18 13:48 ` Hajkowski
0 siblings, 0 replies; 12+ messages in thread
From: Hajkowski @ 2019-03-18 13:48 UTC (permalink / raw)
To: david.hunt; +Cc: dev, Marcin Hajkowski
From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Extend vm_power_guest to check incoming confirmations
of messages previously sent to host.
Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
---
examples/vm_power_manager/guest_cli/Makefile | 1 +
.../guest_cli/vm_power_cli_guest.c | 65 +++++++++++++++----
2 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/examples/vm_power_manager/guest_cli/Makefile b/examples/vm_power_manager/guest_cli/Makefile
index a5634eacf..51a5010ab 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..674d9d55f 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
@@ -132,6 +132,26 @@ 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;
+
+ if (pkt.command != CPU_POWER_CMD_ACK &&
+ pkt.command != CPU_POWER_CMD_NAK) {
+ RTE_LOG(DEBUG, POWER, "Not expected command has been received.\n");
+ return -1;
+ }
+
+ *result = (pkt.command == CPU_POWER_CMD_ACK);
+ return 0;
+}
+
static void
cmd_set_cpu_freq_parsed(void *parsed_result, struct cmdline *cl,
__attribute__((unused)) void *data)
@@ -139,20 +159,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(DEBUG, POWER, "No confirmation for sent msg received\n");
+ } else {
+ cmdline_printf(cl, "Ack for sent msg received with result: %s.\n",
+ result == 1 ? "SUCCESS" : "ERROR");
+ }
}
cmdline_parse_token_string_t cmd_set_cpu_freq =
@@ -185,16 +216,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(DEBUG, POWER, "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(DEBUG, POWER, "No confirmation for sent policy received\n");
+ } else {
+ cmdline_printf(cl, "Ack for sent policy received with result: %s.\n",
+ result == 1 ? "SUCCESS" : "ERROR");
+ }
+ return 1;
}
static void
@@ -206,7 +247,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",
--
2.17.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v2 4/4] power: send confirmation cmd to vm guest
2019-03-18 13:48 [dpdk-dev] [PATCH v2 0/4] bidirect guest channel Hajkowski
` (3 preceding siblings ...)
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 3/4] power: process incoming confirmation cmds Hajkowski
@ 2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` Hajkowski
4 siblings, 1 reply; 12+ messages in thread
From: Hajkowski @ 2019-03-18 13:48 UTC (permalink / raw)
To: david.hunt; +Cc: dev, Marcin Hajkowski
From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Use new guest channel API to send confirmation
message for received power command.
Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
---
examples/vm_power_manager/channel_monitor.c | 67 +++++++++++++++++++--
1 file changed, 61 insertions(+), 6 deletions(-)
diff --git a/examples/vm_power_manager/channel_monitor.c b/examples/vm_power_manager/channel_monitor.c
index 1a3a0fa76..dd44e068d 100644
--- a/examples/vm_power_manager/channel_monitor.c
+++ b/examples/vm_power_manager/channel_monitor.c
@@ -627,6 +627,39 @@ apply_policy(struct policy *pol)
apply_workload_profile(pol);
}
+static int
+write_binary_packet(struct channel_packet *pkt, struct channel_info *chan_info)
+{
+ int ret, buffer_len = sizeof(*pkt);
+ void *buffer = pkt;
+
+ if (chan_info->fd == 0) {
+ RTE_LOG(ERR, CHANNEL_MONITOR, "Channel is not connected\n");
+ return -1;
+ }
+
+ while (buffer_len > 0) {
+ ret = write(chan_info->fd, buffer, buffer_len);
+ if (ret == -1) {
+ if (errno == EINTR)
+ continue;
+ return -1;
+ }
+ buffer = (char *)buffer + ret;
+ buffer_len -= ret;
+ }
+ return 0;
+}
+
+static int
+send_ack_for_received_cmd(struct channel_packet *pkt,
+ struct channel_info *chan_info,
+ uint32_t command)
+{
+ pkt->command = command;
+ return write_binary_packet(pkt, chan_info);
+}
+
static int
process_request(struct channel_packet *pkt, struct channel_info *chan_info)
{
@@ -645,33 +678,55 @@ process_request(struct channel_packet *pkt, struct channel_info *chan_info)
else
core_num = pkt->resource_id;
+ bool valid_unit = true;
+ int scale_res;
+
switch (pkt->unit) {
case(CPU_POWER_SCALE_MIN):
- power_manager_scale_core_min(core_num);
+ scale_res = power_manager_scale_core_min(core_num);
break;
case(CPU_POWER_SCALE_MAX):
- power_manager_scale_core_max(core_num);
+ scale_res = power_manager_scale_core_max(core_num);
break;
case(CPU_POWER_SCALE_DOWN):
- power_manager_scale_core_down(core_num);
+ scale_res = power_manager_scale_core_down(core_num);
break;
case(CPU_POWER_SCALE_UP):
- power_manager_scale_core_up(core_num);
+ scale_res = power_manager_scale_core_up(core_num);
break;
case(CPU_POWER_ENABLE_TURBO):
- power_manager_enable_turbo_core(core_num);
+ scale_res = power_manager_enable_turbo_core(core_num);
break;
case(CPU_POWER_DISABLE_TURBO):
- power_manager_disable_turbo_core(core_num);
+ scale_res = power_manager_disable_turbo_core(core_num);
break;
default:
+ valid_unit = false;
break;
}
+
+ int ret = -1;
+ if (valid_unit) {
+ ret = send_ack_for_received_cmd(pkt,
+ chan_info,
+ scale_res > 0 ?
+ CPU_POWER_CMD_ACK
+ : CPU_POWER_CMD_NAK);
+ if (ret < 0)
+ RTE_LOG(DEBUG, CHANNEL_MONITOR, "Error during sending ack command.\n");
+ } else
+ RTE_LOG(DEBUG, CHANNEL_MONITOR, "Unexpected unit type.\n");
+
}
if (pkt->command == PKT_POLICY) {
RTE_LOG(INFO, CHANNEL_MONITOR, "Processing policy request %s\n",
pkt->vm_name);
+ int ret = send_ack_for_received_cmd(pkt,
+ chan_info,
+ CPU_POWER_CMD_ACK);
+ if (ret < 0)
+ RTE_LOG(DEBUG, CHANNEL_MONITOR, "Error during sending ack command.\n");
update_policy(pkt);
policy_is_set = 1;
}
--
2.17.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [dpdk-dev] [PATCH v2 4/4] power: send confirmation cmd to vm guest
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 4/4] power: send confirmation cmd to vm guest Hajkowski
@ 2019-03-18 13:48 ` Hajkowski
0 siblings, 0 replies; 12+ messages in thread
From: Hajkowski @ 2019-03-18 13:48 UTC (permalink / raw)
To: david.hunt; +Cc: dev, Marcin Hajkowski
From: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Use new guest channel API to send confirmation
message for received power command.
Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
---
examples/vm_power_manager/channel_monitor.c | 67 +++++++++++++++++++--
1 file changed, 61 insertions(+), 6 deletions(-)
diff --git a/examples/vm_power_manager/channel_monitor.c b/examples/vm_power_manager/channel_monitor.c
index 1a3a0fa76..dd44e068d 100644
--- a/examples/vm_power_manager/channel_monitor.c
+++ b/examples/vm_power_manager/channel_monitor.c
@@ -627,6 +627,39 @@ apply_policy(struct policy *pol)
apply_workload_profile(pol);
}
+static int
+write_binary_packet(struct channel_packet *pkt, struct channel_info *chan_info)
+{
+ int ret, buffer_len = sizeof(*pkt);
+ void *buffer = pkt;
+
+ if (chan_info->fd == 0) {
+ RTE_LOG(ERR, CHANNEL_MONITOR, "Channel is not connected\n");
+ return -1;
+ }
+
+ while (buffer_len > 0) {
+ ret = write(chan_info->fd, buffer, buffer_len);
+ if (ret == -1) {
+ if (errno == EINTR)
+ continue;
+ return -1;
+ }
+ buffer = (char *)buffer + ret;
+ buffer_len -= ret;
+ }
+ return 0;
+}
+
+static int
+send_ack_for_received_cmd(struct channel_packet *pkt,
+ struct channel_info *chan_info,
+ uint32_t command)
+{
+ pkt->command = command;
+ return write_binary_packet(pkt, chan_info);
+}
+
static int
process_request(struct channel_packet *pkt, struct channel_info *chan_info)
{
@@ -645,33 +678,55 @@ process_request(struct channel_packet *pkt, struct channel_info *chan_info)
else
core_num = pkt->resource_id;
+ bool valid_unit = true;
+ int scale_res;
+
switch (pkt->unit) {
case(CPU_POWER_SCALE_MIN):
- power_manager_scale_core_min(core_num);
+ scale_res = power_manager_scale_core_min(core_num);
break;
case(CPU_POWER_SCALE_MAX):
- power_manager_scale_core_max(core_num);
+ scale_res = power_manager_scale_core_max(core_num);
break;
case(CPU_POWER_SCALE_DOWN):
- power_manager_scale_core_down(core_num);
+ scale_res = power_manager_scale_core_down(core_num);
break;
case(CPU_POWER_SCALE_UP):
- power_manager_scale_core_up(core_num);
+ scale_res = power_manager_scale_core_up(core_num);
break;
case(CPU_POWER_ENABLE_TURBO):
- power_manager_enable_turbo_core(core_num);
+ scale_res = power_manager_enable_turbo_core(core_num);
break;
case(CPU_POWER_DISABLE_TURBO):
- power_manager_disable_turbo_core(core_num);
+ scale_res = power_manager_disable_turbo_core(core_num);
break;
default:
+ valid_unit = false;
break;
}
+
+ int ret = -1;
+ if (valid_unit) {
+ ret = send_ack_for_received_cmd(pkt,
+ chan_info,
+ scale_res > 0 ?
+ CPU_POWER_CMD_ACK
+ : CPU_POWER_CMD_NAK);
+ if (ret < 0)
+ RTE_LOG(DEBUG, CHANNEL_MONITOR, "Error during sending ack command.\n");
+ } else
+ RTE_LOG(DEBUG, CHANNEL_MONITOR, "Unexpected unit type.\n");
+
}
if (pkt->command == PKT_POLICY) {
RTE_LOG(INFO, CHANNEL_MONITOR, "Processing policy request %s\n",
pkt->vm_name);
+ int ret = send_ack_for_received_cmd(pkt,
+ chan_info,
+ CPU_POWER_CMD_ACK);
+ if (ret < 0)
+ RTE_LOG(DEBUG, CHANNEL_MONITOR, "Error during sending ack command.\n");
update_policy(pkt);
policy_is_set = 1;
}
--
2.17.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [dpdk-dev] [PATCH v2 2/4] power: extend guest channel api for reading
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 2/4] power: extend guest channel api for reading Hajkowski
2019-03-18 13:48 ` Hajkowski
@ 2019-03-19 15:00 ` Pattan, Reshma
2019-03-19 15:00 ` Pattan, Reshma
1 sibling, 1 reply; 12+ messages in thread
From: Pattan, Reshma @ 2019-03-19 15:00 UTC (permalink / raw)
To: Hajkowski, MarcinX, Hunt, David; +Cc: dev, Hajkowski, MarcinX
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Hajkowski
> ---
> diff --git a/lib/librte_power/channel_commands.h
> +#define CPU_POWER_CMD_NAK 2
Instead of NAK , NACK would be better I guess.
> + if (global_fds[lcore_id] == 0) {
Is this now < 0 ?
> + ret = read(global_fds[lcore_id],
> + buffer, buffer_len);
> + if (ret < 0) {
read() return value 0 also should be handled?
> +
> +int rte_power_guest_channel_receive_msg(struct channel_packet *pkt,
> + unsigned int lcore_id)
> +{
> + int ret;
> +
> + struct pollfd fds;
> + fds.fd = global_fds[lcore_id];
> + fds.events = POLLIN;
> +
> + ret = poll(&fds, 1, TIMEOUT);
> + if (ret == 0) {
> + RTE_LOG(DEBUG, GUEST_CHANNEL, "Timeout occurs 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;
> + }
> +
You can keep this function simple by moving all the code above code to power_guest_channel_read_msg(), like the way done in rte_power_guest_channel_send_msg() and guest_channel_send_msg().
Thanks,
Reshma
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [dpdk-dev] [PATCH v2 2/4] power: extend guest channel api for reading
2019-03-19 15:00 ` Pattan, Reshma
@ 2019-03-19 15:00 ` Pattan, Reshma
0 siblings, 0 replies; 12+ messages in thread
From: Pattan, Reshma @ 2019-03-19 15:00 UTC (permalink / raw)
To: Hajkowski, MarcinX, Hunt, David; +Cc: dev, Hajkowski, MarcinX
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Hajkowski
> ---
> diff --git a/lib/librte_power/channel_commands.h
> +#define CPU_POWER_CMD_NAK 2
Instead of NAK , NACK would be better I guess.
> + if (global_fds[lcore_id] == 0) {
Is this now < 0 ?
> + ret = read(global_fds[lcore_id],
> + buffer, buffer_len);
> + if (ret < 0) {
read() return value 0 also should be handled?
> +
> +int rte_power_guest_channel_receive_msg(struct channel_packet *pkt,
> + unsigned int lcore_id)
> +{
> + int ret;
> +
> + struct pollfd fds;
> + fds.fd = global_fds[lcore_id];
> + fds.events = POLLIN;
> +
> + ret = poll(&fds, 1, TIMEOUT);
> + if (ret == 0) {
> + RTE_LOG(DEBUG, GUEST_CHANNEL, "Timeout occurs 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;
> + }
> +
You can keep this function simple by moving all the code above code to power_guest_channel_read_msg(), like the way done in rte_power_guest_channel_send_msg() and guest_channel_send_msg().
Thanks,
Reshma
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2019-03-19 15:00 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-18 13:48 [dpdk-dev] [PATCH v2 0/4] bidirect guest channel Hajkowski
2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 1/4] power: fix invalid socket indicator value Hajkowski
2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 2/4] power: extend guest channel api for reading Hajkowski
2019-03-18 13:48 ` Hajkowski
2019-03-19 15:00 ` Pattan, Reshma
2019-03-19 15:00 ` Pattan, Reshma
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 3/4] power: process incoming confirmation cmds Hajkowski
2019-03-18 13:48 ` Hajkowski
2019-03-18 13:48 ` [dpdk-dev] [PATCH v2 4/4] power: send confirmation cmd to vm guest Hajkowski
2019-03-18 13:48 ` Hajkowski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).