From: Ben Pfaff Date: Thu, 29 Aug 2013 23:49:51 +0000 (-0700) Subject: ofproto: Avoid removing rules from meter lists twice. X-Git-Tag: sliver-openvswitch-2.0.90-1~16^2~43 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=51b50dfd0bbbaba9cd62d42530a3538b47785b15;p=sliver-openvswitch.git ofproto: Avoid removing rules from meter lists twice. 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 Acked-by: Jarno Rajahalme --- diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 1173936e9..0b054e74d 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -5573,9 +5573,6 @@ oftable_remove_rule__(struct ofproto *ofproto, struct classifier *cls, 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); @@ -5585,6 +5582,7 @@ oftable_remove_rule__(struct ofproto *ofproto, struct classifier *cls, 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); }