dpif-netdev: reduce netdev_flow_key size
authorDaniele Di Proietto <ddiproietto@vmware.com>
Sat, 20 Sep 2014 07:30:02 +0000 (07:30 +0000)
committerJarno Rajahalme <jrajahalme@nicira.com>
Tue, 7 Oct 2014 18:23:37 +0000 (11:23 -0700)
Signed-off-by: Daniele Di Proietto <ddiproietto@vmware.com>
Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
lib/dpif-netdev.c
lib/flow.h

index bd1fb9d..a1db620 100644 (file)
@@ -90,16 +90,9 @@ static struct vlog_rate_limit upcall_rl = VLOG_RATE_LIMIT_INIT(600, 600);
 
 /* Stores a miniflow with inline values */
 
-/* There are fields in the flow structure that we never use. Therefore we can
- * save a few words of memory */
-#define NETDEV_KEY_BUF_SIZE_U32 (FLOW_U32S                 \
-                                 - MINI_N_INLINE           \
-                                 - FLOW_U32_SIZE(regs)     \
-                                 - FLOW_U32_SIZE(metadata) \
-                                )
 struct netdev_flow_key {
     struct miniflow flow;
-    uint32_t buf[NETDEV_KEY_BUF_SIZE_U32];
+    uint32_t buf[FLOW_MAX_PACKET_U32S - MINI_N_INLINE];
 };
 
 /* Exact match cache for frequently used flows
index b9c9f1b..7da4e42 100644 (file)
@@ -138,6 +138,19 @@ BUILD_ASSERT_DECL(sizeof(struct flow) % 4 == 0);
 
 #define FLOW_U32S (sizeof(struct flow) / 4)
 
+/* Some flow fields are mutually exclusive or only appear within the flow
+ * pipeline.  IPv6 headers are bigger than IPv4 and MPLS, and IPv6 ND packets
+ * are bigger than TCP,UDP and IGMP packets. */
+#define FLOW_MAX_PACKET_U32S (FLOW_U32S                                   \
+    /* Unused in datapath */  - FLOW_U32_SIZE(regs)                       \
+                              - FLOW_U32_SIZE(metadata)                   \
+    /* L2.5/3 */              - FLOW_U32_SIZE(nw_src)                     \
+                              - FLOW_U32_SIZE(nw_dst)                     \
+                              - FLOW_U32_SIZE(mpls_lse)                   \
+    /* L4 */                  - FLOW_U32_SIZE(tcp_flags) /* incl. pad. */ \
+                              - FLOW_U32_SIZE(igmp_group_ip4)             \
+                             )
+
 /* Remember to update FLOW_WC_SEQ when changing 'struct flow'. */
 BUILD_ASSERT_DECL(offsetof(struct flow, dp_hash) + sizeof(uint32_t)
                   == sizeof(struct flow_tnl) + 176