Skip to content

Commit

Permalink
classifier: Optimize iteration with a catch-all target rule.
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
blp committed Sep 4, 2012
1 parent 48d28ac commit 3ca1de0
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
9 changes: 8 additions & 1 deletion lib/classifier.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,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. */
Expand Down Expand Up @@ -399,7 +406,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
Expand Down
2 changes: 2 additions & 0 deletions lib/classifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit 3ca1de0

Please sign in to comment.