aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/netdevice.h10
-rw-r--r--include/net/sock.h2
-rw-r--r--net/core/dev.c1
-rw-r--r--net/core/sock.c6
-rw-r--r--net/ipv4/tcp_output.c4
5 files changed, 19 insertions, 4 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index a2f003239c85..ced61f87660e 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -724,6 +724,10 @@ struct net_device
724 /* rtnetlink link ops */ 724 /* rtnetlink link ops */
725 const struct rtnl_link_ops *rtnl_link_ops; 725 const struct rtnl_link_ops *rtnl_link_ops;
726 726
727 /* for setting kernel sock attribute on TCP connection setup */
728#define GSO_MAX_SIZE 65536
729 unsigned int gso_max_size;
730
727 /* The TX queue control structures */ 731 /* The TX queue control structures */
728 unsigned int egress_subqueue_count; 732 unsigned int egress_subqueue_count;
729 struct net_device_subqueue egress_subqueue[1]; 733 struct net_device_subqueue egress_subqueue[1];
@@ -1475,6 +1479,12 @@ static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
1475 unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); 1479 unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
1476} 1480}
1477 1481
1482static inline void netif_set_gso_max_size(struct net_device *dev,
1483 unsigned int size)
1484{
1485 dev->gso_max_size = size;
1486}
1487
1478/* On bonding slaves other than the currently active slave, suppress 1488/* On bonding slaves other than the currently active slave, suppress
1479 * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and 1489 * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and
1480 * ARP on active-backup slaves with arp_validate enabled. 1490 * ARP on active-backup slaves with arp_validate enabled.
diff --git a/include/net/sock.h b/include/net/sock.h
index 39112e75411c..8358fff002eb 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -151,6 +151,7 @@ struct sock_common {
151 * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets 151 * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets
152 * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) 152 * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO)
153 * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) 153 * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)
154 * @sk_gso_max_size: Maximum GSO segment size to build
154 * @sk_lingertime: %SO_LINGER l_linger setting 155 * @sk_lingertime: %SO_LINGER l_linger setting
155 * @sk_backlog: always used with the per-socket spinlock held 156 * @sk_backlog: always used with the per-socket spinlock held
156 * @sk_callback_lock: used with the callbacks in the end of this struct 157 * @sk_callback_lock: used with the callbacks in the end of this struct
@@ -237,6 +238,7 @@ struct sock {
237 gfp_t sk_allocation; 238 gfp_t sk_allocation;
238 int sk_route_caps; 239 int sk_route_caps;
239 int sk_gso_type; 240 int sk_gso_type;
241 unsigned int sk_gso_max_size;
240 int sk_rcvlowat; 242 int sk_rcvlowat;
241 unsigned long sk_flags; 243 unsigned long sk_flags;
242 unsigned long sk_lingertime; 244 unsigned long sk_lingertime;
diff --git a/net/core/dev.c b/net/core/dev.c
index fcdf03cf3b3f..f973e38b81af 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4021,6 +4021,7 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name,
4021 } 4021 }
4022 4022
4023 dev->egress_subqueue_count = queue_count; 4023 dev->egress_subqueue_count = queue_count;
4024 dev->gso_max_size = GSO_MAX_SIZE;
4024 4025
4025 dev->get_stats = internal_stats; 4026 dev->get_stats = internal_stats;
4026 netpoll_netdev_init(dev); 4027 netpoll_netdev_init(dev);
diff --git a/net/core/sock.c b/net/core/sock.c
index bb5236aee643..b1a6ed4d33c1 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1095,10 +1095,12 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst)
1095 if (sk->sk_route_caps & NETIF_F_GSO) 1095 if (sk->sk_route_caps & NETIF_F_GSO)
1096 sk->sk_route_caps |= NETIF_F_GSO_SOFTWARE; 1096 sk->sk_route_caps |= NETIF_F_GSO_SOFTWARE;
1097 if (sk_can_gso(sk)) { 1097 if (sk_can_gso(sk)) {
1098 if (dst->header_len) 1098 if (dst->header_len) {
1099 sk->sk_route_caps &= ~NETIF_F_GSO_MASK; 1099 sk->sk_route_caps &= ~NETIF_F_GSO_MASK;
1100 else 1100 } else {
1101 sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; 1101 sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM;
1102 sk->sk_gso_max_size = dst->dev->gso_max_size;
1103 }
1102 } 1104 }
1103} 1105}
1104EXPORT_SYMBOL_GPL(sk_setup_caps); 1106EXPORT_SYMBOL_GPL(sk_setup_caps);
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index b4e11d834c9f..a627616314ba 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -998,7 +998,7 @@ unsigned int tcp_current_mss(struct sock *sk, int large_allowed)
998 xmit_size_goal = mss_now; 998 xmit_size_goal = mss_now;
999 999
1000 if (doing_tso) { 1000 if (doing_tso) {
1001 xmit_size_goal = (65535 - 1001 xmit_size_goal = ((sk->sk_gso_max_size - 1) -
1002 inet_csk(sk)->icsk_af_ops->net_header_len - 1002 inet_csk(sk)->icsk_af_ops->net_header_len -
1003 inet_csk(sk)->icsk_ext_hdr_len - 1003 inet_csk(sk)->icsk_ext_hdr_len -
1004 tp->tcp_header_len); 1004 tp->tcp_header_len);
@@ -1282,7 +1282,7 @@ static int tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb)
1282 limit = min(send_win, cong_win); 1282 limit = min(send_win, cong_win);
1283 1283
1284 /* If a full-sized TSO skb can be sent, do it. */ 1284 /* If a full-sized TSO skb can be sent, do it. */
1285 if (limit >= 65536) 1285 if (limit >= sk->sk_gso_max_size)
1286 goto send_now; 1286 goto send_now;
1287 1287
1288 if (sysctl_tcp_tso_win_divisor) { 1288 if (sysctl_tcp_tso_win_divisor) {