From: Daniele Di Proietto Date: Sat, 20 Sep 2014 07:30:02 +0000 (+0000) Subject: dpif-netdev: reduce netdev_flow_key size X-Git-Tag: v2.4.0~1249 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=154374a72b1065ca5de09fb8e8f9266eb9b5cc8b dpif-netdev: reduce netdev_flow_key size Signed-off-by: Daniele Di Proietto Signed-off-by: Jarno Rajahalme Acked-by: Jarno Rajahalme --- diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index bd1fb9dad..a1db620b3 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -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 diff --git a/lib/flow.h b/lib/flow.h index b9c9f1b72..7da4e4223 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -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