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-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=da89bf9eb715a779752462f523ab567ea3916fa9;p=openvswitch 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 859f416f..cc90f91c 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -4258,9 +4258,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