Looks good, thanks.

Ethan

On Fri, Jul 20, 2012 at 4:25 PM, Ben Pfaff <b...@nicira.com> wrote:
> When cls_cursor_init() is given a NULL target, it can skip an expensive
> step comparing the rule against the target for every table and every rule
> in the classifier.  collect_rule_loose() and other callers could take
> advantage of this optimization, except that they actually pass in a rule
> that matches everything instead of a NULL rule (e.g. for "ovs-ofctl
> dump-flows <bridge>" without specifying a matching rule).
>
> This optimizes that case.
>
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
>  lib/classifier.c |    9 ++++++++-
>  lib/classifier.h |    2 ++
>  2 files changed, 10 insertions(+), 1 deletions(-)
>
> diff --git a/lib/classifier.c b/lib/classifier.c
> index a482666..50c36dc 100644
> --- a/lib/classifier.c
> +++ b/lib/classifier.c
> @@ -107,6 +107,13 @@ cls_rule_format(const struct cls_rule *rule, struct ds 
> *s)
>  {
>      match_format(&rule->match, s, rule->priority);
>  }
> +
> +/* Returns true if 'rule' matches every packet, false otherwise. */
> +bool
> +cls_rule_is_catchall(const struct cls_rule *rule)
> +{
> +    return flow_wildcards_is_catchall(&rule->match.wc);
> +}
>
>  /* Initializes 'cls' as a classifier that initially contains no 
> classification
>   * rules. */
> @@ -375,7 +382,7 @@ cls_cursor_init(struct cls_cursor *cursor, const struct 
> classifier *cls,
>                  const struct cls_rule *target)
>  {
>      cursor->cls = cls;
> -    cursor->target = target;
> +    cursor->target = target && !cls_rule_is_catchall(target) ? target : NULL;
>  }
>
>  /* Returns the first matching cls_rule in 'cursor''s iteration, or a null
> diff --git a/lib/classifier.h b/lib/classifier.h
> index 74f9211..34e4bdb 100644
> --- a/lib/classifier.h
> +++ b/lib/classifier.h
> @@ -78,6 +78,8 @@ uint32_t cls_rule_hash(const struct cls_rule *, uint32_t 
> basis);
>
>  void cls_rule_format(const struct cls_rule *, struct ds *);
>
> +bool cls_rule_is_catchall(const struct cls_rule *);
> +
>  bool cls_rule_is_loose_match(const struct cls_rule *rule,
>                               const struct match *criteria);
>
> --
> 1.7.2.5
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to