Commit 1dde5138 authored by Federico Vaga's avatar Federico Vaga

Merge remote-tracking branch 'origin/proposed_master' into proposed_master

parents 3f608e80 43ea4daa
...@@ -444,7 +444,7 @@ enum wrtd_status wrtd_fill_rules(struct wrtd_dev *wrtd, const char *caller_func) ...@@ -444,7 +444,7 @@ enum wrtd_status wrtd_fill_rules(struct wrtd_dev *wrtd, const char *caller_func)
status = wrtd_fill_roots(wrtd, caller_func); status = wrtd_fill_roots(wrtd, caller_func);
WRTD_RETURN_IF_ERROR(status); WRTD_RETURN_IF_ERROR(status);
/* Count number of rules. */ /* Count number of rules (whether set or not set). */
assert(wrtd->nbr_rules == 0); assert(wrtd->nbr_rules == 0);
for (cpu = 0; cpu < wrtd->nbr_cpus; cpu++) for (cpu = 0; cpu < wrtd->nbr_cpus; cpu++)
wrtd->nbr_rules += wrtd->roots[cpu].nbr_rules; wrtd->nbr_rules += wrtd->roots[cpu].nbr_rules;
...@@ -453,7 +453,7 @@ enum wrtd_status wrtd_fill_rules(struct wrtd_dev *wrtd, const char *caller_func) ...@@ -453,7 +453,7 @@ enum wrtd_status wrtd_fill_rules(struct wrtd_dev *wrtd, const char *caller_func)
status = wrtd_alloc_rules(wrtd, &wrtd->rules, caller_func); status = wrtd_alloc_rules(wrtd, &wrtd->rules, caller_func);
WRTD_RETURN_IF_ERROR(status); WRTD_RETURN_IF_ERROR(status);
/* Read rules from cpus. */ /* Read all rules from cpus. */
for (i = 0; i < wrtd->nbr_rules; i++) { for (i = 0; i < wrtd->nbr_rules; i++) {
unsigned cpu = wrtd->rules[i].cpu; unsigned cpu = wrtd->rules[i].cpu;
unsigned int addr; unsigned int addr;
......
...@@ -48,7 +48,7 @@ struct wrtd_lib_alarm { ...@@ -48,7 +48,7 @@ struct wrtd_lib_alarm {
struct wrtd_lib_rule { struct wrtd_lib_rule {
/* MT CPU on which the rule is placed. */ /* MT CPU on which the rule is placed. */
unsigned int cpu; unsigned int cpu;
/* Rule index on the local MT cpu. */ /* Rule index on the local MT cpu (physical index). */
unsigned int local_idx; unsigned int local_idx;
unsigned char modified; unsigned char modified;
/* Rule (the config part). */ /* Rule (the config part). */
......
...@@ -16,6 +16,8 @@ struct rule_map { ...@@ -16,6 +16,8 @@ struct rule_map {
/* Rule. */ /* Rule. */
struct wrtd_lib_rule *rule; struct wrtd_lib_rule *rule;
struct wrtd_rule_stats stats; struct wrtd_rule_stats stats;
/* Rule index before reconfiguration. */
int old_idx;
/* It's assigned cpu and index; -1 means unassigned. */ /* It's assigned cpu and index; -1 means unassigned. */
int cpu; int cpu;
int global_idx; int global_idx;
...@@ -36,7 +38,8 @@ struct device_map { ...@@ -36,7 +38,8 @@ struct device_map {
/* The global configuration. */ /* The global configuration. */
struct conf_map { struct conf_map {
/* The rules. */ /* The rules.
NBR_RULES is the number of valid rules. */
unsigned nbr_rules; unsigned nbr_rules;
struct rule_map *rules; struct rule_map *rules;
...@@ -92,10 +95,11 @@ static enum wrtd_status wrtd_reconfigure_alloc_map(struct wrtd_dev *wrtd, ...@@ -92,10 +95,11 @@ static enum wrtd_status wrtd_reconfigure_alloc_map(struct wrtd_dev *wrtd,
for (i = 0; i < wrtd->nbr_rules; i++) { for (i = 0; i < wrtd->nbr_rules; i++) {
if (wrtd_id_null(&wrtd->rules[i].conf.id)) if (wrtd_id_null(&wrtd->rules[i].conf.id))
continue; continue;
memset(&map->rules[n].stats, 0, sizeof(struct wrtd_rule_stats));
map->rules[n].rule = &wrtd->rules[i]; map->rules[n].rule = &wrtd->rules[i];
map->rules[n].old_idx = i;
map->rules[n].cpu = -1; map->rules[n].cpu = -1;
map->rules[n].global_idx = -1; map->rules[n].global_idx = -1;
memset(&map->rules[n], 0, sizeof(struct wrtd_rule_stats));
n++; n++;
} }
assert (n == map->nbr_rules); assert (n == map->nbr_rules);
...@@ -264,7 +268,8 @@ static enum wrtd_status wrtd_reconfigure_place(struct wrtd_dev *wrtd, ...@@ -264,7 +268,8 @@ static enum wrtd_status wrtd_reconfigure_place(struct wrtd_dev *wrtd,
rule->dest_ch = WRTD_DEST_CH_NET; rule->dest_ch = WRTD_DEST_CH_NET;
/* If source cpu can also send to /* If source cpu can also send to
network, set dest cpu affinity to that cpu */ network, set dest cpu affinity to that cpu */
if (cpu_affinity >=0) root = NULL;
if (cpu_affinity >= 0)
root = &wrtd->roots[cpu_affinity]; root = &wrtd->roots[cpu_affinity];
if ((root) && (root->capabilities & WRTD_CAP_NET_TX)) if ((root) && (root->capabilities & WRTD_CAP_NET_TX))
rule->dest_cpu = cpu_affinity; rule->dest_cpu = cpu_affinity;
...@@ -420,7 +425,8 @@ static enum wrtd_status wrtd_reconfigure_write(struct wrtd_dev *wrtd, ...@@ -420,7 +425,8 @@ static enum wrtd_status wrtd_reconfigure_write(struct wrtd_dev *wrtd,
/* Read stats. */ /* Read stats. */
for (i = 0; i < map->nbr_rules; i++) { for (i = 0; i < map->nbr_rules; i++) {
status = wrtd_read_rule_stat status = wrtd_read_rule_stat
(wrtd, i, 0, sizeof(struct wrtd_rule_stats), (wrtd, map->rules[i].old_idx,
0, sizeof(struct wrtd_rule_stats),
&map->rules[i].stats, __func__); &map->rules[i].stats, __func__);
WRTD_RETURN_IF_ERROR(status); WRTD_RETURN_IF_ERROR(status);
} }
...@@ -434,12 +440,17 @@ static enum wrtd_status wrtd_reconfigure_write(struct wrtd_dev *wrtd, ...@@ -434,12 +440,17 @@ static enum wrtd_status wrtd_reconfigure_write(struct wrtd_dev *wrtd,
for (i = 0; i < wrtd->nbr_rules; i++) { for (i = 0; i < wrtd->nbr_rules; i++) {
if (wrtd_id_null(&new_rules[i].conf.id) if (wrtd_id_null(&new_rules[i].conf.id)
&& wrtd_id_null(&old_rules[i].conf.id)) && wrtd_id_null(&old_rules[i].conf.id)) {
/* Slot was unused, and it still unused. */
continue; continue;
}
if (!old_rules[i].modified && if (!old_rules[i].modified &&
(wrtd_id_eq(&new_rules[i].conf.id, (wrtd_id_eq(&new_rules[i].conf.id,
&old_rules[i].conf.id))) &old_rules[i].conf.id))) {
/* Slot used by the same rule, and not modified. */
continue; continue;
}
/* Write the new rule. */
status = wrtd_write_rule_conf(wrtd, i, caller_func); status = wrtd_write_rule_conf(wrtd, i, caller_func);
WRTD_RETURN_IF_ERROR(status); WRTD_RETURN_IF_ERROR(status);
...@@ -486,7 +497,6 @@ enum wrtd_status wrtd_reconfigure(struct wrtd_dev *wrtd, const char *caller_func ...@@ -486,7 +497,6 @@ enum wrtd_status wrtd_reconfigure(struct wrtd_dev *wrtd, const char *caller_func
if (status == WRTD_SUCCESS) if (status == WRTD_SUCCESS)
status = wrtd_reconfigure_write(wrtd, &map, new_rules, caller_func); status = wrtd_reconfigure_write(wrtd, &map, new_rules, caller_func);
free(new_rules);
free(map.rules); free(map.rules);
free(map.devs); free(map.devs);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment