aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaolo Abeni <pabeni@redhat.com>2015-12-23 10:54:27 -0500
committerDavid S. Miller <davem@davemloft.net>2015-12-23 22:28:29 -0500
commit184fc8b5ee601cd83dbbdf3e6cfec5f5b8d3b41a (patch)
treeb76b1cc9e17e1c4178c7c578782be34e9c248b75
parentc1a9a291cee0890eb0f435243f3fb84fefb04348 (diff)
geneve: initialize needed_headroom
Currently the needed_headroom field for the geneve device is left to the default value. This patch set it to space required for basic geneve encapsulation, so that we can avoid the skb head re-allocation on xmit. This give a 6% speedup for unsegment traffic on geneve tunnel. v1 -> v2: - add ETH_HLEN for the lower device to the needed headroom Signed-off-by: Paolo Abeni <pabeni@redhat.com> Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Acked-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/geneve.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index c2b79f5d1c89..58efdec12f30 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -1155,7 +1155,7 @@ static int geneve_configure(struct net *net, struct net_device *dev,
1155 struct geneve_net *gn = net_generic(net, geneve_net_id); 1155 struct geneve_net *gn = net_generic(net, geneve_net_id);
1156 struct geneve_dev *t, *geneve = netdev_priv(dev); 1156 struct geneve_dev *t, *geneve = netdev_priv(dev);
1157 bool tun_collect_md, tun_on_same_port; 1157 bool tun_collect_md, tun_on_same_port;
1158 int err; 1158 int err, encap_len;
1159 1159
1160 if (!remote) 1160 if (!remote)
1161 return -EINVAL; 1161 return -EINVAL;
@@ -1187,6 +1187,14 @@ static int geneve_configure(struct net *net, struct net_device *dev,
1187 if (t) 1187 if (t)
1188 return -EBUSY; 1188 return -EBUSY;
1189 1189
1190 /* make enough headroom for basic scenario */
1191 encap_len = GENEVE_BASE_HLEN + ETH_HLEN;
1192 if (remote->sa.sa_family == AF_INET)
1193 encap_len += sizeof(struct iphdr);
1194 else
1195 encap_len += sizeof(struct ipv6hdr);
1196 dev->needed_headroom = encap_len + ETH_HLEN;
1197
1190 if (metadata) { 1198 if (metadata) {
1191 if (tun_on_same_port) 1199 if (tun_on_same_port)
1192 return -EPERM; 1200 return -EPERM;