From 0722ee5c59b43f6336153c71f2db2d9d619d140c Mon Sep 17 00:00:00 2001 From: Jarno Rajahalme Date: Wed, 15 Oct 2014 10:56:32 -0700 Subject: [PATCH] Revert "lib/classifier: Minimize critical section." This reverts commit d2064437e2bf91859a0a50fba30dcabba668a811, which fails clang thread satefy analysis. A more complete patch will be introduced later. Signed-off-by: Jarno Rajahalme --- lib/classifier.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/classifier.c b/lib/classifier.c index 4a2fd170d..f30ba9579 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -114,7 +114,8 @@ cls_match_alloc(struct cls_rule *rule) } static struct cls_subtable *find_subtable(const struct classifier *cls, - const struct minimask *); + const struct minimask *) + OVS_REQUIRES(cls->mutex); static struct cls_subtable *insert_subtable(struct classifier *cls, const struct minimask *) OVS_REQUIRES(cls->mutex); @@ -1089,26 +1090,28 @@ classifier_find_rule_exactly(const struct classifier *cls, struct cls_match *head, *rule; struct cls_subtable *subtable; + ovs_mutex_lock(&cls->mutex); subtable = find_subtable(cls, &target->match.mask); - if (!subtable || target->priority > subtable->max_priority) { - return NULL; + if (!subtable) { + goto out; + } + + /* Skip if there is no hope. */ + if (target->priority > subtable->max_priority) { + goto out; } head = find_equal(subtable, &target->match.flow, miniflow_hash_in_minimask(&target->match.flow, &target->match.mask, 0)); - - - /* Use RCU list instead of locking when one is available. */ - ovs_mutex_lock(&cls->mutex); FOR_EACH_RULE_IN_LIST (rule, head) { if (target->priority >= rule->priority) { ovs_mutex_unlock(&cls->mutex); return target->priority == rule->priority ? rule->cls_rule : NULL; } } +out: ovs_mutex_unlock(&cls->mutex); - return NULL; } @@ -1336,6 +1339,7 @@ cls_cursor_advance(struct cls_cursor *cursor) static struct cls_subtable * find_subtable(const struct classifier *cls, const struct minimask *mask) + OVS_REQUIRES(cls->mutex) { struct cls_subtable *subtable;