Since the meter code was introduced, the oftable_remove_rule() function
(recently renamed oftable_remove_rule__()) has had two blocks of code to
remove a rule from its meter's list of rules that reference that meter.
This commit reduces that to one.
Also modifies oftable_remove_rule__() to maintain the invariant that
'rule' is in a meter's list if and only if
!list_is_empty(&rule->meter_list_node). I don't believe that that fixes
a real bug, but it seems like a good idea.
(This seemed like a serious bug at first, but in fact list_remove() is
idempotent: calling it two times in a row has the same effect as calling
it once.)
Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
OVS_REQ_WRLOCK(cls->rwlock) OVS_RELEASES(rule->evict)
{
classifier_remove(cls, &rule->cr);
OVS_REQ_WRLOCK(cls->rwlock) OVS_RELEASES(rule->evict)
{
classifier_remove(cls, &rule->cr);
- if (rule->meter_id) {
- list_remove(&rule->meter_list_node);
- }
cookies_remove(ofproto, rule);
eviction_group_remove_rule(rule);
ovs_mutex_lock(&ofproto->expirable_mutex);
cookies_remove(ofproto, rule);
eviction_group_remove_rule(rule);
ovs_mutex_lock(&ofproto->expirable_mutex);
ovs_mutex_unlock(&ofproto->expirable_mutex);
if (!list_is_empty(&rule->meter_list_node)) {
list_remove(&rule->meter_list_node);
ovs_mutex_unlock(&ofproto->expirable_mutex);
if (!list_is_empty(&rule->meter_list_node)) {
list_remove(&rule->meter_list_node);
+ list_init(&rule->meter_list_node);
}
ovs_rwlock_unlock(&rule->evict);
}
}
ovs_rwlock_unlock(&rule->evict);
}