> On May 29, 2015, at 5:23 PM, Ben Pfaff <[email protected]> wrote:
>
> On Mon, May 18, 2015 at 04:10:14PM -0700, Jarno Rajahalme wrote:
>> OpenFlow 1.4 bundles are easier to implement when it is possible to
>> mark a rule as 'to_be_removed' and then insert a new, identical rule
>> with the same priority.
>>
>> All but one out of the identical rules must be marked as
>> 'to_be_removed', and the one rule that is not 'to_be_removed' must
>> have been inserted last.
>>
>> Signed-off-by: Jarno Rajahalme <[email protected]>
>
> I find myself wondering whether there should be a function to set
> ->to_be_removed, since clients aren't otherwise supposed to mess around
> with a cls_rule once it's initialized.
>
Patch 17/19 removes most direct access to ‘to_be_removed’, will make it
completely “private” in v2 of patch 17/19.
> I hope that some tests for these new features are forthcoming. They are
> tricky.
>
Will do.
> Here's an idea for better comments. It should supplant the ones from
> the previous patch. I'm not entirely happy with them, because the
> rationale and the use cases are complicated.
>
I applied these. Thanks for the review!
Pushed to master,
Jarno
> diff --git a/lib/classifier.h b/lib/classifier.h
> index 50cc9f8..b9b753a 100644
> --- a/lib/classifier.h
> +++ b/lib/classifier.h
> @@ -126,9 +126,12 @@
> * cls_subtable", with the other almost-identical rules chained off a linked
> * list inside that highest-priority rule.
> *
> + * The following sub-sections describe various optimizations over this simple
> + * approach.
> + *
> *
> * Staged Lookup (Wildcard Optimization)
> - * =====================================
> + * -------------------------------------
> *
> * Subtable lookup is performed in ranges defined for struct flow, starting
> * from metadata (registers, in_port, etc.), then L2 header, L3, and finally
> @@ -141,7 +144,7 @@
> *
> *
> * Prefix Tracking (Wildcard Optimization)
> - * =======================================
> + * ---------------------------------------
> *
> * Classifier uses prefix trees ("tries") for tracking the used
> * address space, enabling skipping classifier tables containing
> @@ -171,7 +174,7 @@
> *
> *
> * Partitioning (Lookup Time and Wildcard Optimization)
> - * ====================================================
> + * ----------------------------------------------------
> *
> * Suppose that a given classifier is being used to handle multiple stages in
> a
> * pipeline using "resubmit", with metadata (that is, the OpenFlow 1.1+ field
> @@ -207,6 +210,41 @@
> * Each eliminated subtable lookup also reduces the amount of un-wildcarding.
> *
> *
> + * Tentative Modifications
> + * =======================
> + *
> + * When a new rule is added to a classifier, it can optionally be
> "invisible".
> + * That means that lookups won't find the rule, although iterations through
> + * the classifier will still see it.
> + *
> + * Similarly, deletions from a classifier can be "tentative", by setting
> + * 'to_be_removed' to true within the rule. A rule that is tentatively
> deleted
> + * will not appear in iterations, although it will still be found by lookups.
> + *
> + * Classifiers can hold duplicate rules (rules with the same match criteria
> and
> + * priority) when tentative modifications are involved: one (or more)
> identical
> + * tentatively deleted rules can coexist in a classifier with at most one
> + * identical invisible rule.
> + *
> + * The classifier supports tentative modifications for two reasons:
> + *
> + * 1. Performance: Adding (or deleting) a rule can, in pathological
> cases,
> + * have a cost proportional to the number of rules already in the
> + * classifier. When multiple rules are being added (or deleted) in
> one
> + * go, though, this cost can be paid just once, not once per addition
> + * (or deletion), as long as it is OK for any new rules to be
> invisible
> + * until the batch change is complete.
> + *
> + * 2. Staging additions and deletions: Invisibility allows a rule to be
> + * added tentatively, to possibly be modified or removed before it
> + * becomes visible. Tentatively deletion allows a rule to be
> scheduled
> + * for deletion before it is certain that the deletion is desirable.
> + *
> + * To use deferred publication, first call classifier_defer(). Then, modify
> + * the classifier via additions and deletions. Call cls_rule_make_visible()
> on
> + * each new rule at an appropriate time. Finally, call classifier_publish().
> + *
> + *
> * Thread-safety
> * =============
> *
>
> Acked-by: Ben Pfaff <[email protected]>
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev