const struct cls_rule *pos = &tcls->rules[i]->cls_rule;
if (cls_rule_equal(pos, &rule->cls_rule)) {
/* Exact match. */
- free_rule(tcls->rules[i]);
+ ovsrcu_postpone(free_rule, tcls->rules[i]);
tcls->rules[i] = clone_rule(rule);
return tcls->rules[i];
} else if (pos->priority < rule->cls_rule.priority) {
struct test_rule *rule;
CLS_FOR_EACH_SAFE (rule, cls_rule, cls) {
- classifier_remove(cls, &rule->cls_rule);
- free_rule(rule);
+ if (classifier_remove(cls, &rule->cls_rule)) {
+ ovsrcu_postpone(free_rule, rule);
+ }
}
classifier_destroy(cls);
}
assert(tcls_is_empty(&tcls));
compare_classifiers(&cls, &tcls);
- free_rule(rule);
+ ovsrcu_postpone(free_rule, rule);
classifier_destroy(&cls);
tcls_destroy(&tcls);
}
assert(test_rule_from_cls_rule(
classifier_replace(&cls, &rule2->cls_rule)) == rule1);
- free_rule(rule1);
+ ovsrcu_postpone(free_rule, rule1);
compare_classifiers(&cls, &tcls);
check_tables(&cls, 1, 1, 0);
+ classifier_remove(&cls, &rule2->cls_rule);
tcls_destroy(&tcls);
destroy_classifier(&cls);
}
for (i = 0; i < N_RULES; i++) {
- if (rules[i]->cls_rule.cls_match) {
- classifier_remove(&cls, &rules[i]->cls_rule);
+ if (classifier_remove(&cls, &rules[i]->cls_rule)) {
+ ovsrcu_postpone(free_rule, rules[i]);
}
- free_rule(rules[i]);
}
classifier_destroy(&cls);
tcls_destroy(&tcls);
tcls_remove(&tcls, tcls_rules[i]);
classifier_remove(&cls, &rules[i]->cls_rule);
compare_classifiers(&cls, &tcls);
- free_rule(rules[i]);
+ ovsrcu_postpone(free_rule, rules[i]);
check_tables(&cls, i < N_RULES - 1, N_RULES - (i + 1), 0);
}
CLS_FOR_EACH_TARGET_SAFE (rule, cls_rule, &cls,
&target->cls_rule) {
- classifier_remove(&cls, &rule->cls_rule);
- free_rule(rule);
+ if (classifier_remove(&cls, &rule->cls_rule)) {
+ ovsrcu_postpone(free_rule, rule);
+ }
}
tcls_delete_matches(&tcls, &target->cls_rule);