diff options
author | Pravin B Shelar <pshelar@nicira.com> | 2012-11-05 13:44:00 -0800 |
---|---|---|
committer | Pravin B Shelar <pshelar@nicira.com> | 2012-11-05 13:44:00 -0800 |
commit | 05a9d485c061495d0ba83bff7e26d6eb077688aa (patch) | |
tree | 9b3ddaf80d2542b225b7ca565c4cd1bd0477ddf5 /datapath/vport-gre.c | |
parent | 51f4701be1545a3faa288dfe3993221a6a2fd81c (diff) |
datapath: Remove tunnel header caching.
Tunnel caching was added to reduce CPU utilization on TX path
by caching packet header, So performance gain is directly proportional
to number of skbs transferred. But with help of offloads skb are getting
larger. So there are less number of skbs. Therefore header caching does
not shows similar gains we seen in past. And now kernel 3.6 has removed
dst caching from networking which makes header caching even more tricky.
So this commit removes header caching from OVS tunnelling.
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Acked-by: Jesse Gross <jesse@nicira.com>
Diffstat (limited to 'datapath/vport-gre.c')
-rw-r--r-- | datapath/vport-gre.c | 60 |
1 files changed, 12 insertions, 48 deletions
diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c index e810173f..d378ccb0 100644 --- a/datapath/vport-gre.c +++ b/datapath/vport-gre.c @@ -115,46 +115,7 @@ static __be32 be64_get_high32(__be64 x) #endif } -static void gre_build_header(const struct vport *vport, - const struct tnl_mutable_config *mutable, - const struct ovs_key_ipv4_tunnel *tun_key, - void *header) -{ - struct gre_base_hdr *greh = header; - __be32 *options = (__be32 *)(greh + 1); - u32 flags; - u32 tunnel_type; - __be64 out_key; - - get_gre_param(mutable, tun_key, &flags, &tunnel_type, &out_key); - - greh->protocol = htons(ETH_P_TEB); - greh->flags = 0; - - if (flags & TNL_F_CSUM) { - greh->flags |= GRE_CSUM; - *options = 0; - options++; - } - - if (flags & TNL_F_OUT_KEY_ACTION) { - greh->flags |= GRE_KEY; - if (tunnel_type & TNL_T_PROTO_GRE64) - greh->flags |= GRE_SEQ; - - } else if (out_key || - tunnel_type & TNL_T_PROTO_GRE64) { - greh->flags |= GRE_KEY; - *options = be64_get_low32(out_key); - if (tunnel_type & TNL_T_PROTO_GRE64) { - options++; - *options = be64_get_high32(out_key); - greh->flags |= GRE_SEQ; - } - } -} - -static struct sk_buff *gre_update_header(const struct vport *vport, +static struct sk_buff *gre_build_header(const struct vport *vport, const struct tnl_mutable_config *mutable, struct dst_entry *dst, struct sk_buff *skb, @@ -166,29 +127,34 @@ static struct sk_buff *gre_update_header(const struct vport *vport, const struct ovs_key_ipv4_tunnel *tun_key = OVS_CB(skb)->tun_key; __be32 *options = (__be32 *)(skb_network_header(skb) + tunnel_hlen - GRE_HEADER_SECTION); + struct gre_base_hdr *greh = (struct gre_base_hdr *) skb_transport_header(skb); get_gre_param(mutable, tun_key, &flags, &tunnel_type, &out_key); + greh->protocol = htons(ETH_P_TEB); + greh->flags = 0; + /* Work backwards over the options so the checksum is last. */ - if (flags & TNL_F_OUT_KEY_ACTION) { + if (out_key || flags & TNL_F_OUT_KEY_ACTION || tunnel_type & TNL_T_PROTO_GRE64) { + greh->flags |= GRE_KEY; if (tunnel_type & TNL_T_PROTO_GRE64) { /* Set higher 32 bits to seq. */ *options = be64_get_high32(out_key); options--; + greh->flags |= GRE_SEQ; } *options = be64_get_low32(out_key); options--; - } else if (out_key || tunnel_type & TNL_T_PROTO_GRE64) { - options--; - if (tunnel_type & TNL_T_PROTO_GRE64) - options--; } - if (flags & TNL_F_CSUM) + if (flags & TNL_F_CSUM) { + greh->flags |= GRE_CSUM; + *options = 0; *(__sum16 *)options = csum_fold(skb_checksum(skb, skb_transport_offset(skb), skb->len - skb_transport_offset(skb), 0)); + } /* * Allow our local IP stack to fragment the outer packet even if the * DF bit is set as a last resort. We also need to force selection of @@ -480,7 +446,6 @@ static const struct tnl_ops gre_tnl_ops = { .ipproto = IPPROTO_GRE, .hdr_len = gre_hdr_len, .build_header = gre_build_header, - .update_header = gre_update_header, }; static struct vport *gre_create(const struct vport_parms *parms) @@ -498,7 +463,6 @@ static const struct tnl_ops gre64_tnl_ops = { .ipproto = IPPROTO_GRE, .hdr_len = gre_hdr_len, .build_header = gre_build_header, - .update_header = gre_update_header, }; static struct vport *gre_create64(const struct vport_parms *parms) |