classifier: Clean up destroy_subtable.
authorJarno Rajahalme <jrajahalme@nicira.com>
Mon, 3 Nov 2014 19:23:11 +0000 (11:23 -0800)
committerJarno Rajahalme <jrajahalme@nicira.com>
Thu, 6 Nov 2014 23:03:48 +0000 (15:03 -0800)
Add asserts to make sure the containers within are already empty.

Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
lib/classifier.c

index 64d0786..82aaf3e 100644 (file)
@@ -1080,6 +1080,7 @@ insert_subtable(struct classifier *cls, const struct minimask *mask)
     return subtable;
 }
 
+/* RCU readers may still access the subtable before it is actually freed. */
 static void
 destroy_subtable(struct classifier *cls, struct cls_subtable *subtable)
     OVS_REQUIRES(cls->mutex)
@@ -1087,13 +1088,16 @@ destroy_subtable(struct classifier *cls, struct cls_subtable *subtable)
     int i;
 
     pvector_remove(&cls->subtables, subtable);
-    trie_destroy(&subtable->ports_trie);
+    cmap_remove(&cls->subtables_map, &subtable->cmap_node,
+                minimask_hash(&subtable->mask, 0));
+
+    ovs_assert(ovsrcu_get_protected(struct trie_node *, &subtable->ports_trie)
+               == NULL);
+    ovs_assert(cmap_is_empty(&subtable->rules));
 
     for (i = 0; i < subtable->n_indices; i++) {
         cmap_destroy(&subtable->indices[i]);
     }
-    cmap_remove(&cls->subtables_map, &subtable->cmap_node,
-                minimask_hash(&subtable->mask, 0));
     cmap_destroy(&subtable->rules);
     ovsrcu_postpone(free, subtable);
 }