On 14-Sep-18 2:54 PM, David Hunt wrote:
Add JSON string handling to vm_power_manager for JSON strings received
through the fifo. The format of the JSON strings are detailed in the
next patch, the vm_power_manager user guide documentation updates.
This patch introduces a new dependency on Jansson, a C library for
encoding, decoding and manipulating JSON data. To compile the sample app
you now need to have installed libjansson4 and libjansson-dev (these may
be named slightly differently depending on your Operating System)
Signed-off-by: David Hunt <david.h...@intel.com>
---
<snip>
void channel_monitor_exit(void)
{
run_loop = 0;
@@ -124,18 +259,11 @@ get_pcpu_to_control(struct policy *pol)
ci = get_core_info();
- 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.
*/
-
-
-
-
Now you're removing those newlines you added in previous commit :)
if (pol->pkt.core_type == CORE_TYPE_VIRTUAL) {
/*
* If the cores in the policy are virtual, we need to map them
@@ -295,8 +423,6 @@ apply_traffic_profile(struct policy *pol)
diff = get_pkt_diff(pol);
- RTE_LOG(INFO, CHANNEL_MONITOR, "Applying traffic profile\n");
-
Here and in a few other places: these log message removals look to be
unrelated to this commit. Also, in my experience, more logging is better
than less logging, especially when something goes wrong - maybe instead
of removing them, just switch the level to debug?
if (diff >= (pol->pkt.traffic_policy.max_max_packet_thresh)) {
for (count = 0; count < pol->pkt.num_vcpu; count++) {
if (pol->core_share[count].status != 1)
@@ -340,9 +466,6 @@ apply_time_profile(struct policy *pol)
if (pol->core_share[count].status != 1) {
power_manager_scale_core_max(
pol->core_share[count].pcpu);
- RTE_LOG(INFO, CHANNEL_MONITOR,
<snip>
+ int idx = 0;
+ int indent = 0;
+ do {
+ n_bytes = read(chan_info->fd, &json_data[idx], 1);
+ if (n_bytes == 0)
+ break;
+ if (json_data[idx] == '{')
+ indent++;
+ if (json_data[idx] == '}')
+ indent--;
What happens if someone sends a string with a "{" or "}" inside?
+ if ((indent > 0) || (idx >> 0))
idx > 0?
+ idx++;
+ if (indent == 0)
+ json_data[idx] = 0;
+ if (idx >= MAX_JSON_STRING_LEN)
+ break;
This looks like a potential overflow to me, because you increment idx,
check if it's >= max, but still write into that location if indent == 0
on previous line.
+ } while (indent > 0);
+
+ if (indent > 0)
+ /*
+ * We've broken out of the read loop without getting
+ * a closing brace, so throw away the datai
I think "data" is plural already, no need to invent a new word :)
+ */
+ json_data[idx] = 0;
idx could potentially be overflown already due to code above?
+
+ if (strlen(json_data) == 0)
+ continue;
+
+ printf("got [%s]\n", json_data);
+
<snip>
void
run_channel_monitor(void)
{
@@ -570,11 +785,16 @@ run_channel_monitor(void)
if (!run_loop)
break;
for (i = 0; i < n_events; i++) {
+ if (!global_events_list[i].data.ptr) {
+ fflush(stdout);
+ continue;
+ }
This change looks unrelated to this commit.
struct channel_info *chan_info = (struct channel_info *)
global_events_list[i].data.ptr;
if ((global_events_list[i].events & EPOLLERR) ||
--
Thanks,
Anatoly