On Mon, Jan 05, 2015 at 01:49:18PM -0800, Jarno Rajahalme wrote:
> 
> On Dec 30, 2014, at 5:16 PM, Ben Pfaff <b...@nicira.com> wrote:
> 
> > 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?
> 
> Reading my comments again, this seems the right thing to do. The comment
> block above is not very clear to me, however. How about:
> 
>            /* 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.  
> The
>             * conjunctive match set is used in the lookup process to figure 
> which
>             * (if any) collection of conjunctive sets the packet matches with.
>             * However, a rule with conjunction actions is never to be 
> returned as
>             * a classifier lookup result.  To make sure a rule with 
> conjunction action
>             * is not returned as a lookup result, we update them in a 
> carefully
>             * chosen order:
>             *
>             * - If we're adding a conjunctive match set where there wasn't one
>             *   before, we have to make the conjunctive match set available to
>             *   lookups before the rule?s actions are changed, as otherwise 
> rule
>             *   with a conjunction action could be returned as a lookup 
> result.
>             *
>             * - To clear some nonempty conjunctive set, we set the rule's
>             *   actions first, so that a lookup can?t return a rule with 
> conjunction
>             *   actions.
>             *
>             *  - Otherwise, order doesn't matter for changing one nonempty
>             *    conjunctive match set to some other nonempty set, since the
>             *    rule?s actions are not seen by the classifier, and hence 
> don?t
>             *    matter either before or after the change. */

That's better.  I made that change.  Thank you!
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to