Magellan Linux

Annotation of /trunk/kernel-alx/patches-4.19/0151-4.19.52-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3430 - (hide annotations) (download)
Fri Aug 2 11:47:58 2019 UTC (4 years, 10 months ago) by niro
File size: 8956 byte(s)
-linux-4.19.52
1 niro 3430 diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
2     index 2c31208528d5..7eb9366422f5 100644
3     --- a/Documentation/networking/ip-sysctl.txt
4     +++ b/Documentation/networking/ip-sysctl.txt
5     @@ -250,6 +250,14 @@ tcp_base_mss - INTEGER
6     Path MTU discovery (MTU probing). If MTU probing is enabled,
7     this is the initial MSS used by the connection.
8    
9     +tcp_min_snd_mss - INTEGER
10     + TCP SYN and SYNACK messages usually advertise an ADVMSS option,
11     + as described in RFC 1122 and RFC 6691.
12     + If this ADVMSS option is smaller than tcp_min_snd_mss,
13     + it is silently capped to tcp_min_snd_mss.
14     +
15     + Default : 48 (at least 8 bytes of payload per segment)
16     +
17     tcp_congestion_control - STRING
18     Set the congestion control algorithm to be used for new
19     connections. The algorithm "reno" is always available, but
20     diff --git a/Makefile b/Makefile
21     index dd4be2f32b88..c82ee02ad9be 100644
22     --- a/Makefile
23     +++ b/Makefile
24     @@ -1,7 +1,7 @@
25     # SPDX-License-Identifier: GPL-2.0
26     VERSION = 4
27     PATCHLEVEL = 19
28     -SUBLEVEL = 51
29     +SUBLEVEL = 52
30     EXTRAVERSION =
31     NAME = "People's Front"
32    
33     diff --git a/include/linux/tcp.h b/include/linux/tcp.h
34     index d2c8f280e48f..4374196b98ea 100644
35     --- a/include/linux/tcp.h
36     +++ b/include/linux/tcp.h
37     @@ -485,4 +485,8 @@ static inline u16 tcp_mss_clamp(const struct tcp_sock *tp, u16 mss)
38    
39     return (user_mss && user_mss < mss) ? user_mss : mss;
40     }
41     +
42     +int tcp_skb_shift(struct sk_buff *to, struct sk_buff *from, int pcount,
43     + int shiftlen);
44     +
45     #endif /* _LINUX_TCP_H */
46     diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h
47     index 622db6bc2f02..366e2a60010e 100644
48     --- a/include/net/netns/ipv4.h
49     +++ b/include/net/netns/ipv4.h
50     @@ -114,6 +114,7 @@ struct netns_ipv4 {
51     #endif
52     int sysctl_tcp_mtu_probing;
53     int sysctl_tcp_base_mss;
54     + int sysctl_tcp_min_snd_mss;
55     int sysctl_tcp_probe_threshold;
56     u32 sysctl_tcp_probe_interval;
57    
58     diff --git a/include/net/tcp.h b/include/net/tcp.h
59     index 770917d0caa7..e75661f92daa 100644
60     --- a/include/net/tcp.h
61     +++ b/include/net/tcp.h
62     @@ -55,6 +55,8 @@ void tcp_time_wait(struct sock *sk, int state, int timeo);
63    
64     #define MAX_TCP_HEADER (128 + MAX_HEADER)
65     #define MAX_TCP_OPTION_SPACE 40
66     +#define TCP_MIN_SND_MSS 48
67     +#define TCP_MIN_GSO_SIZE (TCP_MIN_SND_MSS - MAX_TCP_OPTION_SPACE)
68    
69     /*
70     * Never offer a window over 32767 without using window scaling. Some
71     diff --git a/include/uapi/linux/snmp.h b/include/uapi/linux/snmp.h
72     index f80135e5feaa..abae27c3001c 100644
73     --- a/include/uapi/linux/snmp.h
74     +++ b/include/uapi/linux/snmp.h
75     @@ -282,6 +282,7 @@ enum
76     LINUX_MIB_TCPACKCOMPRESSED, /* TCPAckCompressed */
77     LINUX_MIB_TCPZEROWINDOWDROP, /* TCPZeroWindowDrop */
78     LINUX_MIB_TCPRCVQDROP, /* TCPRcvQDrop */
79     + LINUX_MIB_TCPWQUEUETOOBIG, /* TCPWqueueTooBig */
80     __LINUX_MIB_MAX
81     };
82    
83     diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c
84     index 70289682a670..eab5c02da8ae 100644
85     --- a/net/ipv4/proc.c
86     +++ b/net/ipv4/proc.c
87     @@ -290,6 +290,7 @@ static const struct snmp_mib snmp4_net_list[] = {
88     SNMP_MIB_ITEM("TCPAckCompressed", LINUX_MIB_TCPACKCOMPRESSED),
89     SNMP_MIB_ITEM("TCPZeroWindowDrop", LINUX_MIB_TCPZEROWINDOWDROP),
90     SNMP_MIB_ITEM("TCPRcvQDrop", LINUX_MIB_TCPRCVQDROP),
91     + SNMP_MIB_ITEM("TCPWqueueTooBig", LINUX_MIB_TCPWQUEUETOOBIG),
92     SNMP_MIB_SENTINEL
93     };
94    
95     diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
96     index ce64453d337d..ad132b6e8cfa 100644
97     --- a/net/ipv4/sysctl_net_ipv4.c
98     +++ b/net/ipv4/sysctl_net_ipv4.c
99     @@ -39,6 +39,8 @@ static int ip_local_port_range_min[] = { 1, 1 };
100     static int ip_local_port_range_max[] = { 65535, 65535 };
101     static int tcp_adv_win_scale_min = -31;
102     static int tcp_adv_win_scale_max = 31;
103     +static int tcp_min_snd_mss_min = TCP_MIN_SND_MSS;
104     +static int tcp_min_snd_mss_max = 65535;
105     static int ip_privileged_port_min;
106     static int ip_privileged_port_max = 65535;
107     static int ip_ttl_min = 1;
108     @@ -737,6 +739,15 @@ static struct ctl_table ipv4_net_table[] = {
109     .mode = 0644,
110     .proc_handler = proc_dointvec,
111     },
112     + {
113     + .procname = "tcp_min_snd_mss",
114     + .data = &init_net.ipv4.sysctl_tcp_min_snd_mss,
115     + .maxlen = sizeof(int),
116     + .mode = 0644,
117     + .proc_handler = proc_dointvec_minmax,
118     + .extra1 = &tcp_min_snd_mss_min,
119     + .extra2 = &tcp_min_snd_mss_max,
120     + },
121     {
122     .procname = "tcp_probe_threshold",
123     .data = &init_net.ipv4.sysctl_tcp_probe_threshold,
124     diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
125     index 30c6e94b06c4..364e6fdaa38f 100644
126     --- a/net/ipv4/tcp.c
127     +++ b/net/ipv4/tcp.c
128     @@ -3829,6 +3829,7 @@ void __init tcp_init(void)
129     unsigned long limit;
130     unsigned int i;
131    
132     + BUILD_BUG_ON(TCP_MIN_SND_MSS <= MAX_TCP_OPTION_SPACE);
133     BUILD_BUG_ON(sizeof(struct tcp_skb_cb) >
134     FIELD_SIZEOF(struct sk_buff, cb));
135    
136     diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
137     index cfdd70e32755..4a8869d39662 100644
138     --- a/net/ipv4/tcp_input.c
139     +++ b/net/ipv4/tcp_input.c
140     @@ -1315,7 +1315,7 @@ static bool tcp_shifted_skb(struct sock *sk, struct sk_buff *prev,
141     TCP_SKB_CB(skb)->seq += shifted;
142    
143     tcp_skb_pcount_add(prev, pcount);
144     - BUG_ON(tcp_skb_pcount(skb) < pcount);
145     + WARN_ON_ONCE(tcp_skb_pcount(skb) < pcount);
146     tcp_skb_pcount_add(skb, -pcount);
147    
148     /* When we're adding to gso_segs == 1, gso_size will be zero,
149     @@ -1381,6 +1381,21 @@ static int skb_can_shift(const struct sk_buff *skb)
150     return !skb_headlen(skb) && skb_is_nonlinear(skb);
151     }
152    
153     +int tcp_skb_shift(struct sk_buff *to, struct sk_buff *from,
154     + int pcount, int shiftlen)
155     +{
156     + /* TCP min gso_size is 8 bytes (TCP_MIN_GSO_SIZE)
157     + * Since TCP_SKB_CB(skb)->tcp_gso_segs is 16 bits, we need
158     + * to make sure not storing more than 65535 * 8 bytes per skb,
159     + * even if current MSS is bigger.
160     + */
161     + if (unlikely(to->len + shiftlen >= 65535 * TCP_MIN_GSO_SIZE))
162     + return 0;
163     + if (unlikely(tcp_skb_pcount(to) + pcount > 65535))
164     + return 0;
165     + return skb_shift(to, from, shiftlen);
166     +}
167     +
168     /* Try collapsing SACK blocks spanning across multiple skbs to a single
169     * skb.
170     */
171     @@ -1486,7 +1501,7 @@ static struct sk_buff *tcp_shift_skb_data(struct sock *sk, struct sk_buff *skb,
172     if (!after(TCP_SKB_CB(skb)->seq + len, tp->snd_una))
173     goto fallback;
174    
175     - if (!skb_shift(prev, skb, len))
176     + if (!tcp_skb_shift(prev, skb, pcount, len))
177     goto fallback;
178     if (!tcp_shifted_skb(sk, prev, skb, state, pcount, len, mss, dup_sack))
179     goto out;
180     @@ -1504,11 +1519,10 @@ static struct sk_buff *tcp_shift_skb_data(struct sock *sk, struct sk_buff *skb,
181     goto out;
182    
183     len = skb->len;
184     - if (skb_shift(prev, skb, len)) {
185     - pcount += tcp_skb_pcount(skb);
186     - tcp_shifted_skb(sk, prev, skb, state, tcp_skb_pcount(skb),
187     + pcount = tcp_skb_pcount(skb);
188     + if (tcp_skb_shift(prev, skb, pcount, len))
189     + tcp_shifted_skb(sk, prev, skb, state, pcount,
190     len, mss, 0);
191     - }
192    
193     out:
194     return prev;
195     diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
196     index 11101cf8693b..b76cf96d5cfe 100644
197     --- a/net/ipv4/tcp_ipv4.c
198     +++ b/net/ipv4/tcp_ipv4.c
199     @@ -2527,6 +2527,7 @@ static int __net_init tcp_sk_init(struct net *net)
200     net->ipv4.sysctl_tcp_ecn_fallback = 1;
201    
202     net->ipv4.sysctl_tcp_base_mss = TCP_BASE_MSS;
203     + net->ipv4.sysctl_tcp_min_snd_mss = TCP_MIN_SND_MSS;
204     net->ipv4.sysctl_tcp_probe_threshold = TCP_PROBE_THRESHOLD;
205     net->ipv4.sysctl_tcp_probe_interval = TCP_PROBE_INTERVAL;
206    
207     diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
208     index bd134e3a0473..147ed82b73d3 100644
209     --- a/net/ipv4/tcp_output.c
210     +++ b/net/ipv4/tcp_output.c
211     @@ -1299,6 +1299,11 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue,
212     if (nsize < 0)
213     nsize = 0;
214    
215     + if (unlikely((sk->sk_wmem_queued >> 1) > sk->sk_sndbuf)) {
216     + NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPWQUEUETOOBIG);
217     + return -ENOMEM;
218     + }
219     +
220     if (skb_unclone(skb, gfp))
221     return -ENOMEM;
222    
223     @@ -1457,8 +1462,7 @@ static inline int __tcp_mtu_to_mss(struct sock *sk, int pmtu)
224     mss_now -= icsk->icsk_ext_hdr_len;
225    
226     /* Then reserve room for full set of TCP options and 8 bytes of data */
227     - if (mss_now < 48)
228     - mss_now = 48;
229     + mss_now = max(mss_now, sock_net(sk)->ipv4.sysctl_tcp_min_snd_mss);
230     return mss_now;
231     }
232    
233     @@ -2727,7 +2731,7 @@ static bool tcp_collapse_retrans(struct sock *sk, struct sk_buff *skb)
234     if (next_skb_size <= skb_availroom(skb))
235     skb_copy_bits(next_skb, 0, skb_put(skb, next_skb_size),
236     next_skb_size);
237     - else if (!skb_shift(skb, next_skb, next_skb_size))
238     + else if (!tcp_skb_shift(skb, next_skb, 1, next_skb_size))
239     return false;
240     }
241     tcp_highest_sack_replace(sk, next_skb, skb);
242     diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
243     index b1b5a648def6..17335a370e64 100644
244     --- a/net/ipv4/tcp_timer.c
245     +++ b/net/ipv4/tcp_timer.c
246     @@ -166,6 +166,7 @@ static void tcp_mtu_probing(struct inet_connection_sock *icsk, struct sock *sk)
247     mss = tcp_mtu_to_mss(sk, icsk->icsk_mtup.search_low) >> 1;
248     mss = min(net->ipv4.sysctl_tcp_base_mss, mss);
249     mss = max(mss, 68 - tcp_sk(sk)->tcp_header_len);
250     + mss = max(mss, net->ipv4.sysctl_tcp_min_snd_mss);
251     icsk->icsk_mtup.search_low = tcp_mss_to_mtu(sk, mss);
252     }
253     tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);