On Thu, Oct 30, 2014 at 11:39:44AM -0700, Jarno Rajahalme wrote:
> 
> On Oct 29, 2014, at 11:46 PM, Ben Pfaff <b...@nicira.com> wrote:
> 
> > A "conjunctive match" allows higher-level matches in the flow table, such
> > as set membership matches, without causing a cross-product explosion for
> > multidimensional matches.  Please refer to the documentation that this
> > commit adds to ovs-ofctl(8) for a better explanation, including an example.

...

> > @@ -4379,6 +4419,7 @@ modify_flows__(struct ofproto *ofproto, struct 
> > ofputil_flow_mod *fm,
> >         if (change_actions) {
> >             ovsrcu_set(&rule->actions, rule_actions_create(fm->ofpacts,
> >                                                            
> > fm->ofpacts_len));
> > +            set_conjunction(rule);
> 
> Does the above need to be atomic for the lookup? If not, does it matter which 
> is visible first? As it is now, it seems possible that the lookup is 
> successful and the new actions are used when the lookup was done with the old 
> conjunctions.
> 
> If this is removing conjunctions, then old conjunctions could be used in the 
> lookup and the new actions ignored. This is fine, I think.
> 
> If this adds conjunctions, then a rule with conjunction action could be 
> returned as a hard match, if the lookup is done before the conjunctions have 
> been set, but the actions are set before the thread doing the lookup gets 
> them.
> 
> Setting the conjunctions first would result in the following:
> 
> Removing conjunctions: the rule is changed to a hard match, then the 
> hard_match could be returning the conjunction action.
> 
> Adding conjunctions: This should be OK, new conjunctions are used, while the 
> actions still point to the old actions. Since (incomplete) soft matches are 
> never returned as a lookup result, the old actions would not be used any more.
> 
> Maybe solve this by setting the conjunctions first, and then have the thread 
> doing the lookup repeat the lookup if the actions of the returned rule 
> contain the conjunction action? This should be pretty rare incidence, but 
> this could solve the race here.
> 
> Another possibility is to treat a modify which only changes actions, and 
> where the conjunction is changed, added, or removed, with a 
> classifier_replace, and give the conjunctions as a parameter to it?

I'm working on getting a v3 of this patch ready.  This issue has been
the major sticking point.  I think I've found a simple solution,
though.  Please allow me to run it by you before I post a full v3.

Basically, one ordering is broken in the "add conjunctions" case, and
the other ordering is broken in the "remove conjunctions" case.  So:
use one order if we're adding conjunctions and the other if we're
removing them.  Thus:

        if (change_actions) {
            /* We have to change the actions.  The rule's conjunctive match set
             * is a function of its actions, so we need to update that too.  We
             * update them in a carefully chosen order:
             *
             * - If we're adding a conjunctive match set where there wasn't one
             *   before, we set the conjunctive match set before the rule's
             *   actions.
             *
             * - To clear some nonempty conjunctive set, we set the rule's
             *   actions first.
             *
             * In either case, with the ordering reversed, a classifier lookup
             * could find the conjunctive match action, which should never
             * happen.
             *
             * Order doesn't matter for changing one nonempty conjunctive match
             * set to some other nonempty set, since the actions don't matter
             * either before or after the change. */
            bool conjunctive = is_conjunction(fm->ofpacts, fm->ofpacts_len);

            if (conjunctive) {
                set_conjunction(rule);
            }
            ovsrcu_set(&rule->actions, rule_actions_create(fm->ofpacts,
                                                           fm->ofpacts_len));
            if (!conjunctive) {
                set_conjunction(rule);
            }
        }

Thoughts?
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to