[ovs-dev] [ext-244 1/4] meta-flow: Simplify handling of a variable number of registers.

Ben Pfaff blp at nicira.com
Sat Jul 26 05:25:29 UTC 2014


At the time that Open vSwitch implemented registers, there was a high cost
to adding additional fields, so I wrote the code so that the number of
registers could be reduced at compile time.  Now, fields are cheaper
(though not free) and in the meantime I have never heard of anyone reducing
the number of registers.  Since I intend to add more code that would
require awkward "#if"s like this, I think that this is a good time to
simplify it by requiring FLOW_N_REGS to be fixed.  This commit does that.

Signed-off-by: Ben Pfaff <blp at nicira.com>
---
 lib/meta-flow.c | 21 +++------------------
 lib/meta-flow.h | 50 +++++++-------------------------------------------
 2 files changed, 10 insertions(+), 61 deletions(-)

diff --git a/lib/meta-flow.c b/lib/meta-flow.c
index 44fc2a9..e980a2a 100644
--- a/lib/meta-flow.c
+++ b/lib/meta-flow.c
@@ -223,32 +223,17 @@ const struct mf_field mf_fields[MFF_N_IDS] = {
         OFPUTIL_P_NXM_OXM_ANY,                  \
         -1,                                     \
     }
-#if FLOW_N_REGS > 0
+#if FLOW_N_REGS == 8
     REGISTER(0),
-#endif
-#if FLOW_N_REGS > 1
     REGISTER(1),
-#endif
-#if FLOW_N_REGS > 2
     REGISTER(2),
-#endif
-#if FLOW_N_REGS > 3
     REGISTER(3),
-#endif
-#if FLOW_N_REGS > 4
     REGISTER(4),
-#endif
-#if FLOW_N_REGS > 5
     REGISTER(5),
-#endif
-#if FLOW_N_REGS > 6
     REGISTER(6),
-#endif
-#if FLOW_N_REGS > 7
     REGISTER(7),
-#endif
-#if FLOW_N_REGS > 8
-#error
+#else
+#error "Need to update mf_fields[] to match FLOW_N_REGS"
 #endif
 
     /* ## -- ## */
diff --git a/lib/meta-flow.h b/lib/meta-flow.h
index 7a4b8dc..3208137 100644
--- a/lib/meta-flow.h
+++ b/lib/meta-flow.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, 2013 Nicira, Inc.
+ * Copyright (c) 2011, 2012, 2013, 2014 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -47,29 +47,17 @@ enum OVS_PACKED_ENUM mf_field_id {
     MFF_SKB_PRIORITY,           /* be32 */
     MFF_PKT_MARK,               /* be32 */
 
-#if FLOW_N_REGS > 0
+#if FLOW_N_REGS == 8
     MFF_REG0,                   /* be32 */
-#endif
-#if FLOW_N_REGS > 1
     MFF_REG1,                   /* be32 */
-#endif
-#if FLOW_N_REGS > 2
     MFF_REG2,                   /* be32 */
-#endif
-#if FLOW_N_REGS > 3
     MFF_REG3,                   /* be32 */
-#endif
-#if FLOW_N_REGS > 4
     MFF_REG4,                   /* be32 */
-#endif
-#if FLOW_N_REGS > 5
     MFF_REG5,                   /* be32 */
-#endif
-#if FLOW_N_REGS > 6
     MFF_REG6,                   /* be32 */
-#endif
-#if FLOW_N_REGS > 7
     MFF_REG7,                   /* be32 */
+#else
+#error "Need to update MFF_REG* to match FLOW_N_REGS"
 #endif
 
     /* L2. */
@@ -148,36 +136,12 @@ enum OVS_PACKED_ENUM mf_field_id {
 
 /* Use this macro as CASE_MFF_REGS: in a switch statement to choose all of the
  * MFF_REGx cases. */
-#if FLOW_N_REGS == 1
-# define CASE_MFF_REGS                                          \
-    case MFF_REG0
-#elif FLOW_N_REGS == 2
-# define CASE_MFF_REGS                                          \
-    case MFF_REG0: case MFF_REG1
-#elif FLOW_N_REGS == 3
-# define CASE_MFF_REGS                                          \
-    case MFF_REG0: case MFF_REG1: case MFF_REG2
-#elif FLOW_N_REGS == 4
-# define CASE_MFF_REGS                                          \
-    case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3
-#elif FLOW_N_REGS == 5
-# define CASE_MFF_REGS                                          \
-    case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3: \
-    case MFF_REG4
-#elif FLOW_N_REGS == 6
-# define CASE_MFF_REGS                                          \
-    case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3: \
-    case MFF_REG4: case MFF_REG5
-#elif FLOW_N_REGS == 7
-# define CASE_MFF_REGS                                          \
-    case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3: \
-    case MFF_REG4: case MFF_REG5: case MFF_REG6
-#elif FLOW_N_REGS == 8
-# define CASE_MFF_REGS                                          \
+#if FLOW_N_REGS == 8
+#define CASE_MFF_REGS                                           \
     case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3: \
     case MFF_REG4: case MFF_REG5: case MFF_REG6: case MFF_REG7
 #else
-# error
+#error "Need to update CASE_MFF_REGS to match FLOW_N_REGS"
 #endif
 
 /* Prerequisites for matching a field.
-- 
1.9.1




More information about the dev mailing list