From: David Hunt <david.hunt@intel.com>
To: dev@dpdk.org
Cc: john.mcnamara@intel.com, stephen@networkplumber.org,
lei.a.yao@intel.com, anatoly.burakov@intel.com,
David Hunt <david.hunt@intel.com>
Subject: [PATCH v4 05/11] examples/power: add host channel to power manager
Date: Wed, 26 Sep 2018 14:40:31 +0100 [thread overview]
Message-ID: <20180926134037.43606-6-david.hunt@intel.com> (raw)
In-Reply-To: <20180926134037.43606-1-david.hunt@intel.com>
This patch adds a fifo channel to the vm_power_manager app through which
we can send commands and polices. Intended for sending JSON strings.
The fifo is at /tmp/powermonitor/fifo
Signed-off-by: David Hunt <david.hunt@intel.com>
---
examples/vm_power_manager/channel_manager.c | 109 +++++++++++++++
examples/vm_power_manager/channel_manager.h | 17 +++
examples/vm_power_manager/channel_monitor.c | 142 +++++++++++++++-----
examples/vm_power_manager/main.c | 2 +
4 files changed, 236 insertions(+), 34 deletions(-)
diff --git a/examples/vm_power_manager/channel_manager.c b/examples/vm_power_manager/channel_manager.c
index 2e471d0c1..4fac099df 100644
--- a/examples/vm_power_manager/channel_manager.c
+++ b/examples/vm_power_manager/channel_manager.c
@@ -13,6 +13,7 @@
#include <sys/queue.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/select.h>
@@ -284,6 +285,38 @@ open_non_blocking_channel(struct channel_info *info)
return 0;
}
+static int
+open_host_channel(struct channel_info *info)
+{
+ int flags;
+
+ info->fd = open(info->channel_path, O_RDWR | O_RSYNC);
+ if (info->fd == -1) {
+ RTE_LOG(ERR, CHANNEL_MANAGER, "Error(%s) opening fifo for '%s'\n",
+ strerror(errno),
+ info->channel_path);
+ return -1;
+ }
+
+ /* Get current flags */
+ flags = fcntl(info->fd, F_GETFL, 0);
+ if (flags < 0) {
+ RTE_LOG(WARNING, CHANNEL_MANAGER, "Error(%s) fcntl get flags socket for"
+ "'%s'\n", strerror(errno), info->channel_path);
+ return 1;
+ }
+ /* Set to Non Blocking */
+ flags |= O_NONBLOCK;
+ if (fcntl(info->fd, F_SETFL, flags) < 0) {
+ RTE_LOG(WARNING, CHANNEL_MANAGER,
+ "Error(%s) setting non-blocking "
+ "socket for '%s'\n",
+ strerror(errno), info->channel_path);
+ return -1;
+ }
+ return 0;
+}
+
static int
setup_channel_info(struct virtual_machine_info **vm_info_dptr,
struct channel_info **chan_info_dptr, unsigned channel_num)
@@ -294,6 +327,7 @@ setup_channel_info(struct virtual_machine_info **vm_info_dptr,
chan_info->channel_num = channel_num;
chan_info->priv_info = (void *)vm_info;
chan_info->status = CHANNEL_MGR_CHANNEL_DISCONNECTED;
+ chan_info->type = CHANNEL_TYPE_BINARY;
if (open_non_blocking_channel(chan_info) < 0) {
RTE_LOG(ERR, CHANNEL_MANAGER, "Could not open channel: "
"'%s' for VM '%s'\n",
@@ -316,6 +350,42 @@ setup_channel_info(struct virtual_machine_info **vm_info_dptr,
return 0;
}
+static void
+fifo_path(char *dst, unsigned int len)
+{
+ snprintf(dst, len, "%sfifo", CHANNEL_MGR_SOCKET_PATH);
+}
+
+static int
+setup_host_channel_info(struct channel_info **chan_info_dptr,
+ unsigned int channel_num)
+{
+ struct channel_info *chan_info = *chan_info_dptr;
+
+ chan_info->channel_num = channel_num;
+ chan_info->priv_info = (void *)NULL;
+ chan_info->status = CHANNEL_MGR_CHANNEL_DISCONNECTED;
+ chan_info->type = CHANNEL_TYPE_JSON;
+
+ fifo_path(chan_info->channel_path, sizeof(chan_info->channel_path));
+
+ if (open_host_channel(chan_info) < 0) {
+ RTE_LOG(ERR, CHANNEL_MANAGER, "Could not open host channel: "
+ "'%s'\n",
+ chan_info->channel_path);
+ return -1;
+ }
+ if (add_channel_to_monitor(&chan_info) < 0) {
+ RTE_LOG(ERR, CHANNEL_MANAGER, "Could add channel: "
+ "'%s' to epoll ctl\n",
+ chan_info->channel_path);
+ return -1;
+
+ }
+ chan_info->status = CHANNEL_MGR_CHANNEL_CONNECTED;
+ return 0;
+}
+
int
add_all_channels(const char *vm_name)
{
@@ -470,6 +540,45 @@ add_channels(const char *vm_name, unsigned *channel_list,
return num_channels_enabled;
}
+int
+add_host_channel(void)
+{
+ struct channel_info *chan_info;
+ char socket_path[PATH_MAX];
+ int num_channels_enabled = 0;
+ int ret;
+
+ fifo_path(socket_path, sizeof(socket_path));
+
+ ret = mkfifo(socket_path, 0660);
+ if ((errno != EEXIST) && (ret < 0)) {
+ RTE_LOG(ERR, CHANNEL_MANAGER, "Cannot create fifo '%s' error: "
+ "%s\n", socket_path, strerror(errno));
+ return 0;
+ }
+
+ if (access(socket_path, F_OK) < 0) {
+ RTE_LOG(ERR, CHANNEL_MANAGER, "Channel path '%s' error: "
+ "%s\n", socket_path, strerror(errno));
+ return 0;
+ }
+ chan_info = rte_malloc(NULL, sizeof(*chan_info), 0);
+ if (chan_info == NULL) {
+ RTE_LOG(ERR, CHANNEL_MANAGER, "Error allocating memory for "
+ "channel '%s'\n", socket_path);
+ return 0;
+ }
+ snprintf(chan_info->channel_path,
+ sizeof(chan_info->channel_path), "%s", socket_path);
+ if (setup_host_channel_info(&chan_info, 0) < 0) {
+ rte_free(chan_info);
+ return 0;
+ }
+ num_channels_enabled++;
+
+ return num_channels_enabled;
+}
+
int
remove_channel(struct channel_info **chan_info_dptr)
{
diff --git a/examples/vm_power_manager/channel_manager.h b/examples/vm_power_manager/channel_manager.h
index 872ec6140..e32235b07 100644
--- a/examples/vm_power_manager/channel_manager.h
+++ b/examples/vm_power_manager/channel_manager.h
@@ -54,6 +54,13 @@ enum channel_status { CHANNEL_MGR_CHANNEL_DISCONNECTED = 0,
CHANNEL_MGR_CHANNEL_DISABLED,
CHANNEL_MGR_CHANNEL_PROCESSING};
+/* Communication Channel Type */
+enum channel_type {
+ CHANNEL_TYPE_BINARY = 0,
+ CHANNEL_TYPE_INI,
+ CHANNEL_TYPE_JSON
+};
+
/* VM libvirt(qemu/KVM) connection status */
enum vm_status { CHANNEL_MGR_VM_INACTIVE = 0, CHANNEL_MGR_VM_ACTIVE};
@@ -66,6 +73,7 @@ struct channel_info {
volatile uint32_t status; /**< Connection status(enum channel_status) */
int fd; /**< AF_UNIX socket fd */
unsigned channel_num; /**< CHANNEL_MGR_SOCKET_PATH/<vm_name>.channel_num */
+ enum channel_type type; /**< Binary, ini, json, etc. */
void *priv_info; /**< Pointer to private info, do not modify */
};
@@ -226,6 +234,15 @@ int add_all_channels(const char *vm_name);
int add_channels(const char *vm_name, unsigned *channel_list,
unsigned num_channels);
+/**
+ * Set up a fifo by which host applications can send command an policies
+ * through a fifo to the vm_power_manager
+ *
+ * @return
+ * - 0 for success
+ */
+int add_host_channel(void);
+
/**
* Remove a channel definition from the channel manager. This must only be
* called from the channel monitor thread.
diff --git a/examples/vm_power_manager/channel_monitor.c b/examples/vm_power_manager/channel_monitor.c
index f180d74e6..c3c3d7bb1 100644
--- a/examples/vm_power_manager/channel_monitor.c
+++ b/examples/vm_power_manager/channel_monitor.c
@@ -85,6 +85,33 @@ core_share_status(int pNo)
}
}
+
+static int
+pcpu_monitor(struct policy *pol, struct core_info *ci, int pcpu, int count)
+{
+ int ret = 0;
+
+ if (pol->pkt.policy_to_use == BRANCH_RATIO) {
+ ci->cd[pcpu].oob_enabled = 1;
+ ret = add_core_to_monitor(pcpu);
+ if (ret == 0)
+ RTE_LOG(INFO, CHANNEL_MONITOR,
+ "Monitoring pcpu %d OOB for %s\n",
+ pcpu, pol->pkt.vm_name);
+ else
+ RTE_LOG(ERR, CHANNEL_MONITOR,
+ "Error monitoring pcpu %d OOB for %s\n",
+ pcpu, pol->pkt.vm_name);
+
+ } else {
+ pol->core_share[count].pcpu = pcpu;
+ RTE_LOG(INFO, CHANNEL_MONITOR,
+ "Monitoring pcpu %d for %s\n",
+ pcpu, pol->pkt.vm_name);
+ }
+ return ret;
+}
+
static void
get_pcpu_to_control(struct policy *pol)
{
@@ -94,34 +121,42 @@ get_pcpu_to_control(struct policy *pol)
int pcpu, count;
uint64_t mask_u64b;
struct core_info *ci;
- int ret;
ci = get_core_info();
- RTE_LOG(INFO, CHANNEL_MONITOR, "Looking for pcpu for %s\n",
- pol->pkt.vm_name);
- get_info_vm(pol->pkt.vm_name, &info);
-
- for (count = 0; count < pol->pkt.num_vcpu; count++) {
- mask_u64b = info.pcpu_mask[pol->pkt.vcpu_to_control[count]];
- for (pcpu = 0; mask_u64b; mask_u64b &= ~(1ULL << pcpu++)) {
- if ((mask_u64b >> pcpu) & 1) {
- if (pol->pkt.policy_to_use == BRANCH_RATIO) {
- ci->cd[pcpu].oob_enabled = 1;
- ret = add_core_to_monitor(pcpu);
- if (ret == 0)
- printf("Monitoring pcpu %d via Branch Ratio\n",
- pcpu);
- else
- printf("Failed to start OOB Monitoring pcpu %d\n",
- pcpu);
-
- } else {
- pol->core_share[count].pcpu = pcpu;
- printf("Monitoring pcpu %d\n", pcpu);
- }
+ RTE_LOG(INFO, CHANNEL_MONITOR,
+ "Looking for pcpu for %s\n", pol->pkt.vm_name);
+
+ /*
+ * So now that we're handling virtual and physical cores, we need to
+ * differenciate between them when adding them to the branch monitor.
+ * Virtual cores need to be converted to physical cores.
+ */
+ if (pol->pkt.core_type == CORE_TYPE_VIRTUAL) {
+ /*
+ * If the cores in the policy are virtual, we need to map them
+ * to physical core. We look up the vm info and use that for
+ * the mapping.
+ */
+ get_info_vm(pol->pkt.vm_name, &info);
+ for (count = 0; count < pol->pkt.num_vcpu; count++) {
+ mask_u64b =
+ info.pcpu_mask[pol->pkt.vcpu_to_control[count]];
+ for (pcpu = 0; mask_u64b;
+ mask_u64b &= ~(1ULL << pcpu++)) {
+ if ((mask_u64b >> pcpu) & 1)
+ pcpu_monitor(pol, ci, pcpu, count);
}
}
+ } else {
+ /*
+ * If the cores in the policy are physical, we just use
+ * those core id's directly.
+ */
+ for (count = 0; count < pol->pkt.num_vcpu; count++) {
+ pcpu = pol->pkt.vcpu_to_control[count];
+ pcpu_monitor(pol, ci, pcpu, count);
+ }
}
}
@@ -160,8 +195,13 @@ update_policy(struct channel_packet *pkt)
unsigned int updated = 0;
int i;
+
+ RTE_LOG(INFO, CHANNEL_MONITOR,
+ "Applying policy for %s\n", pkt->vm_name);
+
for (i = 0; i < MAX_VMS; i++) {
if (strcmp(policies[i].pkt.vm_name, pkt->vm_name) == 0) {
+ /* Copy the contents of *pkt into the policy.pkt */
policies[i].pkt = *pkt;
get_pcpu_to_control(&policies[i]);
if (get_pfid(&policies[i]) == -1) {
@@ -189,6 +229,24 @@ update_policy(struct channel_packet *pkt)
return 0;
}
+static int
+remove_policy(struct channel_packet *pkt __rte_unused)
+{
+ int i;
+
+ /*
+ * Disabling the policy is simply a case of setting
+ * enabled to 0
+ */
+ for (i = 0; i < MAX_VMS; i++) {
+ if (strcmp(policies[i].pkt.vm_name, pkt->vm_name) == 0) {
+ policies[i].enabled = 0;
+ return 0;
+ }
+ }
+ return -1;
+}
+
static uint64_t
get_pkt_diff(struct policy *pol)
{
@@ -346,7 +404,6 @@ apply_policy(struct policy *pol)
apply_workload_profile(pol);
}
-
static int
process_request(struct channel_packet *pkt, struct channel_info *chan_info)
{
@@ -355,6 +412,8 @@ process_request(struct channel_packet *pkt, struct channel_info *chan_info)
if (chan_info == NULL)
return -1;
+ RTE_LOG(INFO, CHANNEL_MONITOR, "Processing Request %s\n", pkt->vm_name);
+
if (rte_atomic32_cmpset(&(chan_info->status), CHANNEL_MGR_CHANNEL_CONNECTED,
CHANNEL_MGR_CHANNEL_PROCESSING) == 0)
return -1;
@@ -362,10 +421,12 @@ process_request(struct channel_packet *pkt, struct channel_info *chan_info)
if (pkt->command == CPU_POWER) {
core_mask = get_pcpus_mask(chan_info, pkt->resource_id);
if (core_mask == 0) {
- RTE_LOG(ERR, CHANNEL_MONITOR, "Error get physical CPU mask for "
- "channel '%s' using vCPU(%u)\n", chan_info->channel_path,
- (unsigned)pkt->unit);
- return -1;
+ /*
+ * Core mask will be 0 in the case where
+ * hypervisor is not available so we're working in
+ * the host, so use the core as the mask.
+ */
+ core_mask = 1ULL << pkt->resource_id;
}
if (__builtin_popcountll(core_mask) == 1) {
@@ -421,12 +482,20 @@ process_request(struct channel_packet *pkt, struct channel_info *chan_info)
}
if (pkt->command == PKT_POLICY) {
- RTE_LOG(INFO, CHANNEL_MONITOR, "\nProcessing Policy request from Guest\n");
+ RTE_LOG(INFO, CHANNEL_MONITOR,
+ "\nProcessing Policy request\n");
update_policy(pkt);
policy_is_set = 1;
}
- /* Return is not checked as channel status may have been set to DISABLED
+ if (pkt->command == PKT_POLICY_REMOVE) {
+ RTE_LOG(INFO, CHANNEL_MONITOR,
+ "Removing policy %s\n", pkt->vm_name);
+ remove_policy(pkt);
+ }
+
+ /*
+ * Return is not checked as channel status may have been set to DISABLED
* from management thread
*/
rte_atomic32_cmpset(&(chan_info->status), CHANNEL_MGR_CHANNEL_PROCESSING,
@@ -448,13 +517,16 @@ add_channel_to_monitor(struct channel_info **chan_info)
"to epoll\n", info->channel_path);
return -1;
}
+ RTE_LOG(ERR, CHANNEL_MONITOR, "Added channel '%s' "
+ "to monitor\n", info->channel_path);
return 0;
}
int
remove_channel_from_monitor(struct channel_info *chan_info)
{
- if (epoll_ctl(global_event_fd, EPOLL_CTL_DEL, chan_info->fd, NULL) < 0) {
+ if (epoll_ctl(global_event_fd, EPOLL_CTL_DEL,
+ chan_info->fd, NULL) < 0) {
RTE_LOG(ERR, CHANNEL_MONITOR, "Unable to remove channel '%s' "
"from epoll\n", chan_info->channel_path);
return -1;
@@ -467,11 +539,13 @@ channel_monitor_init(void)
{
global_event_fd = epoll_create1(0);
if (global_event_fd == 0) {
- RTE_LOG(ERR, CHANNEL_MONITOR, "Error creating epoll context with "
- "error %s\n", strerror(errno));
+ RTE_LOG(ERR, CHANNEL_MONITOR,
+ "Error creating epoll context with error %s\n",
+ strerror(errno));
return -1;
}
- global_events_list = rte_malloc("epoll_events", sizeof(*global_events_list)
+ global_events_list = rte_malloc("epoll_events",
+ sizeof(*global_events_list)
* MAX_EVENTS, RTE_CACHE_LINE_SIZE);
if (global_events_list == NULL) {
RTE_LOG(ERR, CHANNEL_MONITOR, "Unable to rte_malloc for "
diff --git a/examples/vm_power_manager/main.c b/examples/vm_power_manager/main.c
index 58c5fa45c..893bf4cdd 100644
--- a/examples/vm_power_manager/main.c
+++ b/examples/vm_power_manager/main.c
@@ -421,6 +421,8 @@ main(int argc, char **argv)
return -1;
}
+ add_host_channel();
+
printf("Running core monitor on lcore id %d\n", lcore_id);
rte_eal_remote_launch(run_core_monitor, NULL, lcore_id);
--
2.17.1
next prev parent reply other threads:[~2018-09-26 13:41 UTC|newest]
Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-30 10:54 [PATCH v1 0/7] add json power policy interface for containers David Hunt
2018-08-30 10:54 ` [PATCH v1 1/7] examples/power: add checks around hypervisor David Hunt
2018-08-30 16:59 ` Stephen Hemminger
2018-09-12 10:53 ` Hunt, David
2018-08-30 10:54 ` [PATCH v1 2/7] lib/power: add changes for host commands/policies David Hunt
2018-08-30 16:59 ` Stephen Hemminger
2018-09-12 10:51 ` Hunt, David
2018-08-30 10:54 ` [PATCH v1 3/7] examples/power: add necessary changes to guest app David Hunt
2018-08-30 10:54 ` [PATCH v1 4/7] examples/power: add host channel to power manager David Hunt
2018-09-04 7:31 ` Yao, Lei A
2018-09-12 12:07 ` Hunt, David
2018-08-30 10:54 ` [PATCH v1 5/7] examples/power: add json string handling David Hunt
2018-08-30 17:00 ` Stephen Hemminger
2018-08-31 13:55 ` Hunt, David
2018-09-12 10:54 ` Hunt, David
2018-08-30 10:54 ` [PATCH v1 6/7] doc/vm_power_manager: add JSON interface API info David Hunt
2018-09-04 5:17 ` Yao, Lei A
2018-09-12 11:31 ` Hunt, David
2018-08-30 10:54 ` [PATCH v1 7/7] examples/power: add json example files David Hunt
2018-09-12 14:49 ` [PATCH v2 0/7] add json power policy interface for containers David Hunt
2018-09-12 14:49 ` [PATCH v2 1/7] examples/power: add checks around hypervisor David Hunt
2018-09-12 14:49 ` [PATCH v2 2/7] lib/power: add changes for host commands/policies David Hunt
2018-09-12 14:49 ` [PATCH v2 3/7] examples/power: add necessary changes to guest app David Hunt
2018-09-12 14:49 ` [PATCH v2 4/7] examples/power: add host channel to power manager David Hunt
2018-09-12 14:49 ` [PATCH v2 5/7] examples/power: add json string handling David Hunt
2018-09-12 14:49 ` [PATCH v2 6/7] doc/vm_power_manager: add JSON interface API info David Hunt
2018-09-12 14:49 ` [PATCH v2 7/7] examples/power: add json example files David Hunt
2018-09-14 13:53 ` [PATCH v3 0/8] add json power policy interface for containers David Hunt
2018-09-14 13:53 ` [PATCH v3 1/8] examples/power: add checks around hypervisor David Hunt
2018-09-25 9:20 ` Burakov, Anatoly
2018-09-25 13:47 ` Hunt, David
2018-09-14 13:54 ` [PATCH v3 2/8] lib/power: add changes for host commands/policies David Hunt
2018-09-25 9:21 ` Burakov, Anatoly
2018-09-25 13:47 ` Hunt, David
2018-09-14 13:54 ` [PATCH v3 3/8] examples/power: add necessary changes to guest app David Hunt
2018-09-25 9:23 ` Burakov, Anatoly
2018-09-14 13:54 ` [PATCH v3 4/8] examples/power: add host channel to power manager David Hunt
2018-09-25 9:48 ` Burakov, Anatoly
2018-09-25 13:55 ` Hunt, David
2018-09-14 13:54 ` [PATCH v3 5/8] examples/power: add json string handling David Hunt
2018-09-25 11:27 ` Burakov, Anatoly
2018-09-25 14:00 ` Hunt, David
2018-09-25 14:15 ` Burakov, Anatoly
2018-09-25 15:15 ` Hunt, David
2018-09-25 15:31 ` Burakov, Anatoly
2018-09-14 13:54 ` [PATCH v3 6/8] examples/power: add meson/ninja build support David Hunt
2018-09-14 14:01 ` Bruce Richardson
2018-09-14 13:54 ` [PATCH v3 7/8] doc/vm_power_manager: add JSON interface API info David Hunt
2018-09-14 13:54 ` [PATCH v3 8/8] examples/power: add json example files David Hunt
2018-09-26 13:40 ` [PATCH v4 0/11] add json power policy interface for containers David Hunt
2018-09-26 13:40 ` [PATCH v4 01/11] examples/power: add checks around hypervisor David Hunt
2018-09-26 13:54 ` Burakov, Anatoly
2018-09-26 13:40 ` [PATCH v4 02/11] examples/power: allow for number of vms to be zero David Hunt
2018-09-26 13:54 ` Burakov, Anatoly
2018-09-26 13:40 ` [PATCH v4 03/11] lib/power: add changes for host commands/policies David Hunt
2018-09-26 13:54 ` Burakov, Anatoly
2018-09-26 13:40 ` [PATCH v4 04/11] examples/power: add necessary changes to guest app David Hunt
2018-09-26 13:40 ` David Hunt [this message]
2018-09-26 14:22 ` [PATCH v4 05/11] examples/power: add host channel to power manager Burakov, Anatoly
2018-09-26 13:40 ` [PATCH v4 06/11] examples/power: increase allowed number of clients David Hunt
2018-09-26 14:23 ` Burakov, Anatoly
2018-09-26 13:40 ` [PATCH v4 07/11] examples/power: add json string handling David Hunt
2018-09-26 14:24 ` Burakov, Anatoly
2018-09-26 13:40 ` [PATCH v4 08/11] examples/power: clean up verbose messages David Hunt
2018-09-26 14:25 ` Burakov, Anatoly
2018-09-26 13:40 ` [PATCH v4 09/11] examples/power: add meson/ninja build support David Hunt
2018-09-26 13:40 ` [PATCH v4 10/11] doc/vm_power_manager: add JSON interface API info David Hunt
2018-09-26 14:32 ` Kovacevic, Marko
2018-09-26 13:40 ` [PATCH v4 11/11] examples/power: add json example files David Hunt
2018-09-26 15:58 ` Kovacevic, Marko
2018-09-26 16:14 ` Hunt, David
2018-09-26 16:37 ` [PATCH v5 0/10] add json power policy interface for containers David Hunt
2018-09-26 16:37 ` [PATCH v5 01/10] examples/power: add checks around hypervisor David Hunt
2018-09-26 16:37 ` [PATCH v5 02/10] examples/power: allow for number of vms to be zero David Hunt
2018-09-26 16:37 ` [PATCH v5 03/10] lib/power: add changes for host commands/policies David Hunt
2018-09-26 16:37 ` [PATCH v5 04/10] examples/power: add necessary changes to guest app David Hunt
2018-09-26 16:37 ` [PATCH v5 05/10] examples/power: add host channel to power manager David Hunt
2018-09-26 16:37 ` [PATCH v5 06/10] examples/power: increase allowed number of clients David Hunt
2018-09-26 16:37 ` [PATCH v5 07/10] examples/power: add json string handling David Hunt
2018-09-30 1:54 ` Yao, Lei A
2018-10-01 11:03 ` Hunt, David
2018-09-26 16:37 ` [PATCH v5 08/10] examples/power: clean up verbose messages David Hunt
2018-09-26 16:37 ` [PATCH v5 09/10] examples/power: add meson/ninja build support David Hunt
2018-09-26 16:37 ` [PATCH v5 10/10] doc/vm_power_manager: add JSON interface API info David Hunt
2018-09-29 2:42 ` Yao, Lei A
2018-10-01 11:02 ` Hunt, David
2018-10-02 8:43 ` [PATCH v6 0/10] add json power policy interface for containers David Hunt
2018-10-02 8:43 ` [PATCH v6 01/10] examples/power: add checks around hypervisor David Hunt
2018-10-02 8:43 ` [PATCH v6 02/10] examples/power: allow for number of vms to be zero David Hunt
2018-10-02 8:43 ` [PATCH v6 03/10] lib/power: add changes for host commands/policies David Hunt
2018-10-02 8:43 ` [PATCH v6 04/10] examples/power: add necessary changes to guest app David Hunt
2018-10-02 8:43 ` [PATCH v6 05/10] examples/power: add host channel to power manager David Hunt
2018-10-02 8:43 ` [PATCH v6 06/10] examples/power: increase allowed number of clients David Hunt
2018-10-02 8:43 ` [PATCH v6 07/10] examples/power: add json string handling David Hunt
2018-10-02 8:43 ` [PATCH v6 08/10] examples/power: clean up verbose messages David Hunt
2018-10-02 8:43 ` [PATCH v6 09/10] examples/power: add meson/ninja build support David Hunt
2018-10-02 8:43 ` [PATCH v6 10/10] doc/vm_power_manager: add JSON interface API info David Hunt
2018-10-17 13:05 ` [PATCH v7 0/10] add json power policy interface for containers David Hunt
2018-10-17 13:05 ` [PATCH v7 01/10] examples/power: add checks around hypervisor David Hunt
2018-10-17 13:05 ` [PATCH v7 02/10] examples/power: allow for number of vms to be zero David Hunt
2018-10-17 13:05 ` [PATCH v7 03/10] lib/power: add changes for host commands/policies David Hunt
2018-10-17 13:05 ` [PATCH v7 04/10] examples/power: add necessary changes to guest app David Hunt
2018-10-17 13:05 ` [PATCH v7 05/10] examples/power: add host channel to power manager David Hunt
2018-10-17 13:05 ` [PATCH v7 06/10] examples/power: increase allowed number of clients David Hunt
2018-10-17 13:05 ` [PATCH v7 07/10] examples/power: add json string handling David Hunt
2018-10-17 13:05 ` [PATCH v7 08/10] examples/power: clean up verbose messages David Hunt
2018-10-17 13:05 ` [PATCH v7 09/10] examples/power: add meson/ninja build support David Hunt
2018-10-17 13:05 ` [PATCH v7 10/10] doc/vm_power_manager: add JSON interface API info David Hunt
2018-10-26 0:05 ` Thomas Monjalon
2018-10-26 8:45 ` [PATCH v7 0/10] add json power policy interface for containers Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180926134037.43606-6-david.hunt@intel.com \
--to=david.hunt@intel.com \
--cc=anatoly.burakov@intel.com \
--cc=dev@dpdk.org \
--cc=john.mcnamara@intel.com \
--cc=lei.a.yao@intel.com \
--cc=stephen@networkplumber.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.