Commit 43ea4daa authored by Tristan Gingold's avatar Tristan Gingold

libwrtd: fix read of stats when reconfiguration (in case of move)

parent 78080c4c
......@@ -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);
WRTD_RETURN_IF_ERROR(status);
/* Count number of rules. */
/* Count number of rules (whether set or not set). */
assert(wrtd->nbr_rules == 0);
for (cpu = 0; cpu < wrtd->nbr_cpus; cpu++)
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)
status = wrtd_alloc_rules(wrtd, &wrtd->rules, caller_func);
WRTD_RETURN_IF_ERROR(status);
/* Read rules from cpus. */
/* Read all rules from cpus. */
for (i = 0; i < wrtd->nbr_rules; i++) {
unsigned cpu = wrtd->rules[i].cpu;
unsigned int addr;
......
......@@ -48,7 +48,7 @@ struct wrtd_lib_alarm {
struct wrtd_lib_rule {
/* MT CPU on which the rule is placed. */
unsigned int cpu;
/* Rule index on the local MT cpu. */
/* Rule index on the local MT cpu (physical index). */
unsigned int local_idx;
unsigned char modified;
/* Rule (the config part). */
......
......@@ -16,6 +16,8 @@ struct rule_map {
/* Rule. */
struct wrtd_lib_rule *rule;
struct wrtd_rule_stats stats;
/* Rule index before reconfiguration. */
int old_idx;
/* It's assigned cpu and index; -1 means unassigned. */
int cpu;
int global_idx;
......@@ -36,7 +38,8 @@ struct device_map {
/* The global configuration. */
struct conf_map {
/* The rules. */
/* The rules.
NBR_RULES is the number of valid rules. */
unsigned nbr_rules;
struct rule_map *rules;
......@@ -94,6 +97,7 @@ static enum wrtd_status wrtd_reconfigure_alloc_map(struct wrtd_dev *wrtd,
continue;
memset(&map->rules[n].stats, 0, sizeof(struct wrtd_rule_stats));
map->rules[n].rule = &wrtd->rules[i];
map->rules[n].old_idx = i;
map->rules[n].cpu = -1;
map->rules[n].global_idx = -1;
n++;
......@@ -421,7 +425,8 @@ static enum wrtd_status wrtd_reconfigure_write(struct wrtd_dev *wrtd,
/* Read stats. */
for (i = 0; i < map->nbr_rules; i++) {
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__);
WRTD_RETURN_IF_ERROR(status);
}
......@@ -435,12 +440,17 @@ static enum wrtd_status wrtd_reconfigure_write(struct wrtd_dev *wrtd,
for (i = 0; i < wrtd->nbr_rules; i++) {
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;
}
if (!old_rules[i].modified &&
(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;
}
/* Write the new rule. */
status = wrtd_write_rule_conf(wrtd, i, caller_func);
WRTD_RETURN_IF_ERROR(status);
......
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