[ovs-dev] [PATCH] ofproto: Avoid removing rules from meter lists twice.

Ben Pfaff blp at nicira.com
Thu Aug 29 23:23:18 UTC 2013


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 at nicira.com>
CC: Jarno Rajahalme <jrajahalme at nicira.com>
---
 ofproto/ofproto.c |    4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index 1173936..0b054e7 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);
 }
-- 
1.7.10.4




More information about the dev mailing list