[ovs-dev] [classifier-opt 27/28] classifier: Optimize iteration with a catch-all target rule.
Ben Pfaff
blp at nicira.com
Fri Jul 20 23:25:24 UTC 2012
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 <blp at 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
More information about the dev
mailing list