From: Ben Pfaff Date: Wed, 29 Sep 2010 20:04:03 +0000 (-0700) Subject: ofproto: Iterate through exact-match rules first during expiration. X-Git-Tag: v1.0.3~3 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=eabc4fc41952e9d4b979ba137d15d9b7ab791959 ofproto: Iterate through exact-match rules first during expiration. A wildcarded flow is idle only if all of its subrules have expired because they were idle, so unless we expire exact-match rules first it is possible that a wildcarded flow fails to expire as soon as it should. (The current implementation of classifier_for_each() iterates through exact-match rules before wildcarded rules, but nothing in the interface guarantees that.) --- diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 2da4a0020..750c50b04 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -4221,9 +4221,13 @@ ofproto_expire(struct ofproto *ofproto) /* Update 'used' for each flow in the datapath. */ ofproto_update_used(ofproto); - /* Expire idle flows. */ + /* Expire idle flows. + * + * A wildcarded flow is idle only when all of its subrules have expired due + * to becoming idle, so iterate through the exact-match flows first. */ cbdata.ofproto = ofproto; - classifier_for_each(&ofproto->cls, CLS_INC_ALL, rule_expire, &cbdata); + classifier_for_each(&ofproto->cls, CLS_INC_EXACT, rule_expire, &cbdata); + classifier_for_each(&ofproto->cls, CLS_INC_WILD, rule_expire, &cbdata); /* Let the hook know that we're at a stable point: all outstanding data * in existing flows has been accounted to the account_cb. Thus, the