On Nov 19, 2013, at 2:49 PM, Ben Pfaff <b...@nicira.com> wrote:

> On Tue, Nov 19, 2013 at 11:20:37AM -0800, Jarno Rajahalme wrote:
>> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>
> 
> miniflow_get_map_in_range() is longer than I would ordinarily write as
> inline in a header file.  Do you have a special reason to do that?
> 

Just that contains code that was previously open coded in
minimatch_hash_range(), which is in match.c rather than flow.c.
However, it is used at flow set-up time rather than at lookup, so
inlining it doesn’t really matter. I moved mini flow_get_map_in_range()
to flow.c.

> I spent some time studying find_match_wc().  I think that the time for
> 'rl != rule' is equivalent to 'rule == NULL', because once we've
> narrowed the possibilities down to a single rule, that rule can't
> change as we look further (if it did, that would indicate a bug, I
> believe).  Once I figured that out, it seemed that the logic could be
> simplified slightly, at least from my point of view.
> 
> It also seemed like the relationship between find_match_wc() and
> find_match() could be simplified a bit.
> 
> So here's what I suggest folding in, I'm curious to see what you
> think.

You’re right on all counts, and your changes are elegant. Thanks for a
thorough review :-)

I’m folding this in and pushing the result with the following incremental on
top of yours,

  Jarno

diff --git a/lib/classifier.c b/lib/classifier.c
index f94cb96..33ade96 100644
--- a/lib/classifier.c
+++ b/lib/classifier.c
@@ -820,7 +820,7 @@ update_subtables_after_removal(struct classifier *cls,
     }
 }
 
-static struct cls_rule *
+static inline struct cls_rule *
 find_match(const struct cls_subtable *subtable, const struct flow *flow,
            uint32_t hash)
 {
diff --git a/lib/flow.c b/lib/flow.c
index 979eab5..c6683a5 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -686,6 +686,27 @@ flow_wildcards_fold_minimask(struct flow_wildcards *wc,
     flow_union_with_miniflow(&wc->masks, &mask->masks);
 }
 
+inline uint64_t
+miniflow_get_map_in_range(const struct miniflow *miniflow,
+                          uint8_t start, uint8_t end, const uint32_t **data)
+{
+    uint64_t map = miniflow->map;
+    uint32_t *p = miniflow->values;
+
+    if (start > 0) {
+        uint64_t msk = (UINT64_C(1) << start) - 1; /* 'start' LSBs set */
+        p += count_1bits(map & msk);  /* Skip to start. */
+        map &= ~msk;
+    }
+    if (end < FLOW_U32S) {
+        uint64_t msk = (UINT64_C(1) << end) - 1; /* 'end' LSBs set */
+        map &= msk;
+    }
+
+    *data = p;
+    return map;
+}
+
 /* Fold minimask 'mask''s wildcard mask into 'wc's wildcard mask
  * in range [start, end). */
 void
diff --git a/lib/flow.h b/lib/flow.h
index 3040f7b..5e78073 100644
--- a/lib/flow.h
+++ b/lib/flow.h
@@ -30,7 +30,6 @@
 struct dpif_flow_stats;
 struct ds;
 struct flow_wildcards;
-struct miniflow;
 struct minimask;
 struct ofpbuf;
 
@@ -388,6 +387,8 @@ bool miniflow_equal_flow_in_minimask(const struct miniflow 
*a,
 uint32_t miniflow_hash(const struct miniflow *, uint32_t basis);
 uint32_t miniflow_hash_in_minimask(const struct miniflow *,
                                    const struct minimask *, uint32_t basis);
+uint64_t miniflow_get_map_in_range(const struct miniflow *, uint8_t start,
+                                   uint8_t end, const uint32_t **data);
 
 /* Compressed flow wildcards. */
 
@@ -418,27 +419,6 @@ uint32_t minimask_hash(const struct minimask *, uint32_t 
basis);
 bool minimask_has_extra(const struct minimask *, const struct minimask *);
 bool minimask_is_catchall(const struct minimask *);
 
-static inline uint64_t
-miniflow_get_map_in_range(const struct miniflow *miniflow,
-                          uint8_t start, uint8_t end, const uint32_t **data)
-{
-    uint64_t map = miniflow->map;
-    uint32_t *p = miniflow->values;
-
-    if (start > 0) {
-        uint64_t msk = (UINT64_C(1) << start) - 1; /* 'start' LSBs set */
-        p += count_1bits(map & msk);  /* Skip to start. */
-        map &= ~msk;
-    }
-    if (end < FLOW_U32S) {
-        uint64_t msk = (UINT64_C(1) << end) - 1; /* 'end' LSBs set */
-        map &= msk;
-    }
-
-    *data = p;
-    return map;
-}
-
 /* Returns the value of the OpenFlow 1.1+ "metadata" field in 'flow'. */
 static inline ovs_be64
 miniflow_get_metadata(const struct miniflow *flow)


_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to