datapath: Compact sw_flow_key.
authorJarno Rajahalme <jrajahalme@nicira.com>
Tue, 18 Mar 2014 23:32:45 +0000 (16:32 -0700)
committerJarno Rajahalme <jrajahalme@nicira.com>
Mon, 24 Mar 2014 17:45:47 +0000 (10:45 -0700)
commit708fb4c50aa5547f9836a4d9e2112550c0d1094d
tree611bd26b2b85e1ce20ce31df051daee40c7aa8da
parent2ee9b978da459475efdbbcc557740152df85accf
datapath: Compact sw_flow_key.

Minimize padding in sw_flow_key and move 'tp' top the main struct.
These changes simplify code when accessing the transport port numbers
and the tcp flags, and makes the sw_flow_key 8 bytes smaller on 64-bit
systems (128->120 bytes).  These changes also make the keys for IPv4
packets to fit in one cache line.

There is a valid concern for safety of packing the struct
ovs_key_ipv4_tunnel, as it would be possible to take the address of
the tun_id member as a __be64 * which could result in unaligned access
in some systems. However:

- sw_flow_key itself is 64-bit aligned, so the tun_id within is always
  64-bit aligned.
- We never make arrays of ovs_key_ipv4_tunnel (which would force every
  second tun_key to be misaligned).
- We never take the address of the tun_id in to a __be64 *.
- Whereever we use struct ovs_key_ipv4_tunnel outside the sw_flow_key,
  it is in stack (on tunnel input functions), where compiler has full
  control of the alignment.

Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
datapath/datapath.c
datapath/flow.c
datapath/flow.h
datapath/flow_netlink.c