[ovs-dev] [PATCH v4 03/10] Inline mf_from_id().

Jarno Rajahalme jrajahalme at nicira.com
Thu Oct 24 20:19:27 UTC 2013


mf_from_id accesses a static table, so the compiler should be able to
completely optimize it away.

Also use OVS_PACKED_ENUM to waste less space.

Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>
---
 lib/meta-flow.c |   12 +++---------
 lib/meta-flow.h |   18 +++++++++++++-----
 2 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/lib/meta-flow.c b/lib/meta-flow.c
index 12811ef..1eeaef7 100644
--- a/lib/meta-flow.c
+++ b/lib/meta-flow.c
@@ -41,7 +41,9 @@ VLOG_DEFINE_THIS_MODULE(meta_flow);
     sizeof ((union mf_value *)0)->MEMBER,       \
     8 * sizeof ((union mf_value *)0)->MEMBER
 
-static const struct mf_field mf_fields[MFF_N_IDS] = {
+extern const struct mf_field mf_fields[MFF_N_IDS]; /* Silence a warning. */
+
+const struct mf_field mf_fields[MFF_N_IDS] = {
     /* ## -------- ## */
     /* ## metadata ## */
     /* ## -------- ## */
@@ -717,14 +719,6 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
 const struct mf_field *mf_from_nxm_header__(uint32_t header);
 static void nxm_init(void);
 
-/* Returns the field with the given 'id'. */
-const struct mf_field *
-mf_from_id(enum mf_field_id id)
-{
-    ovs_assert((unsigned int) id < MFF_N_IDS);
-    return &mf_fields[id];
-}
-
 /* Returns the field with the given 'name', or a null pointer if no field has
  * that name. */
 const struct mf_field *
diff --git a/lib/meta-flow.h b/lib/meta-flow.h
index d3185e4..ab7db86 100644
--- a/lib/meta-flow.h
+++ b/lib/meta-flow.h
@@ -24,13 +24,14 @@
 #include "ofp-errors.h"
 #include "ofp-util.h"
 #include "packets.h"
+#include "util.h"
 
 struct ds;
 struct match;
 
 /* The comment on each of these indicates the member in "union mf_value" used
  * to represent its value. */
-enum mf_field_id {
+enum OVS_PACKED_ENUM mf_field_id {
     /* Metadata. */
     MFF_TUN_ID,                 /* be64 */
     MFF_TUN_SRC,                /* be32 */
@@ -178,7 +179,7 @@ enum mf_field_id {
  * A field may only be matched if the correct lower-level protocols are also
  * matched.  For example, the TCP port may be matched only if the Ethernet type
  * matches ETH_TYPE_IP and the IP protocol matches IPPROTO_TCP. */
-enum mf_prereqs {
+enum OVS_PACKED_ENUM mf_prereqs {
     MFP_NONE,
 
     /* L2 requirements. */
@@ -207,13 +208,13 @@ enum mf_prereqs {
 /* Forms of partial-field masking allowed for a field.
  *
  * Every field may be masked as a whole. */
-enum mf_maskable {
+enum OVS_PACKED_ENUM mf_maskable {
     MFM_NONE,                   /* No sub-field masking. */
     MFM_FULLY,                  /* Every bit is individually maskable. */
 };
 
 /* How to format or parse a field's value. */
-enum mf_string {
+enum OVS_PACKED_ENUM mf_string {
     /* Integer formats.
      *
      * The particular MFS_* constant sets the output format.  On input, either
@@ -329,11 +330,18 @@ union mf_subvalue {
 BUILD_ASSERT_DECL(sizeof(union mf_value) == sizeof (union mf_subvalue));
 
 /* Finding mf_fields. */
-const struct mf_field *mf_from_id(enum mf_field_id);
 const struct mf_field *mf_from_name(const char *name);
 const struct mf_field *mf_from_nxm_header(uint32_t nxm_header);
 const struct mf_field *mf_from_nxm_name(const char *nxm_name);
 
+static inline const struct mf_field *
+mf_from_id(enum mf_field_id id)
+{
+    extern const struct mf_field mf_fields[MFF_N_IDS];
+    ovs_assert((unsigned int) id < MFF_N_IDS);
+    return &mf_fields[id];
+}
+
 /* Inspecting wildcarded bits. */
 bool mf_is_all_wild(const struct mf_field *, const struct flow_wildcards *);
 
-- 
1.7.10.4




More information about the dev mailing list