Looks good. --Justin
On Jul 6, 2012, at 2:49 PM, Ben Pfaff wrote: > A given rule may only have one pending operation at a time, so when an > operation is pending we must not allow a flow expiration to be started on > that rule. > > This doesn't fix a user-visible bug in ofproto-dpif because ofproto-dpif > always completes operations immediately, that is, no operations will be > pending when expiration runs. (Technically there is a bug if the user > runs "ovs-appctl ofproto/clog", but that feature is for debugging only and > there is no reason for a user to ever run it.) > > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > ofproto/ofproto-dpif.c | 5 +++++ > ofproto/ofproto-provider.h | 3 +++ > ofproto/ofproto.c | 3 +++ > 3 files changed, 11 insertions(+), 0 deletions(-) > > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > index 2451d44..5265d7b 100644 > --- a/ofproto/ofproto-dpif.c > +++ b/ofproto/ofproto-dpif.c > @@ -3562,6 +3562,11 @@ rule_expire(struct rule_dpif *rule) > long long int now; > uint8_t reason; > > + if (rule->up.pending) { > + /* We'll have to expire it later. */ > + return; > + } > + > /* Has 'rule' expired? */ > now = time_msec(); > if (rule->up.hard_timeout > diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h > index afd17a6..f22c9f6 100644 > --- a/ofproto/ofproto-provider.h > +++ b/ofproto/ofproto-provider.h > @@ -388,6 +388,9 @@ struct ofproto_class { > * - Call ofproto_rule_expire() for each OpenFlow flow that has reached > * its hard_timeout or idle_timeout, to expire the flow. > * > + * (But rules that are part of a pending operation, e.g. rules for > + * which ->pending is true, may not expire.) > + * > * Returns 0 if successful, otherwise a positive errno value. */ > int (*run)(struct ofproto *ofproto); > > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c > index 1fed0a7..e1b2fb2 100644 > --- a/ofproto/ofproto.c > +++ b/ofproto/ofproto.c > @@ -3128,6 +3128,9 @@ ofproto_rule_update_used(struct rule *rule, long long > int used) > * OFPRR_HARD_TIMEOUT or OFPRR_IDLE_TIMEOUT), and then removes 'rule' from its > * ofproto. > * > + * 'rule' must not have a pending operation (that is, 'rule->pending' must be > + * NULL). > + * > * ofproto implementation ->run() functions should use this function to expire > * OpenFlow flows. */ > void > -- > 1.7.2.5 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev