1 |
commit: 4196ed330cd049bfd7781bc2f3e71b646e13a0bd |
2 |
Author: Alice Ferrazzi <alicef <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sun Nov 4 16:21:49 2018 +0000 |
4 |
Commit: Alice Ferrazzi <alicef <AT> gentoo <DOT> org> |
5 |
CommitDate: Sun Nov 4 16:21:49 2018 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=4196ed33 |
7 |
|
8 |
linux kernel 4.19.1 |
9 |
|
10 |
0000_README | 4 + |
11 |
1000_linux_4.19.1.patch | 966 ++++++++++++++++++++++++++++++++++++++++++++++++ |
12 |
2 files changed, 970 insertions(+) |
13 |
|
14 |
diff --git a/0000_README b/0000_README |
15 |
index 917d838..828fbcd 100644 |
16 |
--- a/0000_README |
17 |
+++ b/0000_README |
18 |
@@ -43,6 +43,10 @@ EXPERIMENTAL |
19 |
Individual Patch Descriptions: |
20 |
-------------------------------------------------------------------------- |
21 |
|
22 |
+Patch: 1000_linux-4.19.1.patch |
23 |
+From: http://www.kernel.org |
24 |
+Desc: Linux 4.19.1 |
25 |
+ |
26 |
Patch: 1500_XATTR_USER_PREFIX.patch |
27 |
From: https://bugs.gentoo.org/show_bug.cgi?id=470644 |
28 |
Desc: Support for namespace user.pax.* on tmpfs. |
29 |
|
30 |
diff --git a/1000_linux_4.19.1.patch b/1000_linux_4.19.1.patch |
31 |
new file mode 100644 |
32 |
index 0000000..2274982 |
33 |
--- /dev/null |
34 |
+++ b/1000_linux_4.19.1.patch |
35 |
@@ -0,0 +1,966 @@ |
36 |
+diff --git a/Makefile b/Makefile |
37 |
+index 69fa5c0310d8..abcd8ca4966f 100644 |
38 |
+--- a/Makefile |
39 |
++++ b/Makefile |
40 |
+@@ -1,7 +1,7 @@ |
41 |
+ # SPDX-License-Identifier: GPL-2.0 |
42 |
+ VERSION = 4 |
43 |
+ PATCHLEVEL = 19 |
44 |
+-SUBLEVEL = 0 |
45 |
++SUBLEVEL = 1 |
46 |
+ EXTRAVERSION = |
47 |
+ NAME = "People's Front" |
48 |
+ |
49 |
+diff --git a/arch/sparc/include/asm/switch_to_64.h b/arch/sparc/include/asm/switch_to_64.h |
50 |
+index 4ff29b1406a9..b1d4e2e3210f 100644 |
51 |
+--- a/arch/sparc/include/asm/switch_to_64.h |
52 |
++++ b/arch/sparc/include/asm/switch_to_64.h |
53 |
+@@ -67,6 +67,7 @@ do { save_and_clear_fpu(); \ |
54 |
+ } while(0) |
55 |
+ |
56 |
+ void synchronize_user_stack(void); |
57 |
+-void fault_in_user_windows(void); |
58 |
++struct pt_regs; |
59 |
++void fault_in_user_windows(struct pt_regs *); |
60 |
+ |
61 |
+ #endif /* __SPARC64_SWITCH_TO_64_H */ |
62 |
+diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c |
63 |
+index 6c086086ca8f..59eaf6227af1 100644 |
64 |
+--- a/arch/sparc/kernel/process_64.c |
65 |
++++ b/arch/sparc/kernel/process_64.c |
66 |
+@@ -36,6 +36,7 @@ |
67 |
+ #include <linux/sysrq.h> |
68 |
+ #include <linux/nmi.h> |
69 |
+ #include <linux/context_tracking.h> |
70 |
++#include <linux/signal.h> |
71 |
+ |
72 |
+ #include <linux/uaccess.h> |
73 |
+ #include <asm/page.h> |
74 |
+@@ -521,7 +522,12 @@ static void stack_unaligned(unsigned long sp) |
75 |
+ force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *) sp, 0, current); |
76 |
+ } |
77 |
+ |
78 |
+-void fault_in_user_windows(void) |
79 |
++static const char uwfault32[] = KERN_INFO \ |
80 |
++ "%s[%d]: bad register window fault: SP %08lx (orig_sp %08lx) TPC %08lx O7 %08lx\n"; |
81 |
++static const char uwfault64[] = KERN_INFO \ |
82 |
++ "%s[%d]: bad register window fault: SP %016lx (orig_sp %016lx) TPC %08lx O7 %016lx\n"; |
83 |
++ |
84 |
++void fault_in_user_windows(struct pt_regs *regs) |
85 |
+ { |
86 |
+ struct thread_info *t = current_thread_info(); |
87 |
+ unsigned long window; |
88 |
+@@ -534,9 +540,9 @@ void fault_in_user_windows(void) |
89 |
+ do { |
90 |
+ struct reg_window *rwin = &t->reg_window[window]; |
91 |
+ int winsize = sizeof(struct reg_window); |
92 |
+- unsigned long sp; |
93 |
++ unsigned long sp, orig_sp; |
94 |
+ |
95 |
+- sp = t->rwbuf_stkptrs[window]; |
96 |
++ orig_sp = sp = t->rwbuf_stkptrs[window]; |
97 |
+ |
98 |
+ if (test_thread_64bit_stack(sp)) |
99 |
+ sp += STACK_BIAS; |
100 |
+@@ -547,8 +553,16 @@ void fault_in_user_windows(void) |
101 |
+ stack_unaligned(sp); |
102 |
+ |
103 |
+ if (unlikely(copy_to_user((char __user *)sp, |
104 |
+- rwin, winsize))) |
105 |
++ rwin, winsize))) { |
106 |
++ if (show_unhandled_signals) |
107 |
++ printk_ratelimited(is_compat_task() ? |
108 |
++ uwfault32 : uwfault64, |
109 |
++ current->comm, current->pid, |
110 |
++ sp, orig_sp, |
111 |
++ regs->tpc, |
112 |
++ regs->u_regs[UREG_I7]); |
113 |
+ goto barf; |
114 |
++ } |
115 |
+ } while (window--); |
116 |
+ } |
117 |
+ set_thread_wsaved(0); |
118 |
+@@ -556,8 +570,7 @@ void fault_in_user_windows(void) |
119 |
+ |
120 |
+ barf: |
121 |
+ set_thread_wsaved(window + 1); |
122 |
+- user_exit(); |
123 |
+- do_exit(SIGILL); |
124 |
++ force_sig(SIGSEGV, current); |
125 |
+ } |
126 |
+ |
127 |
+ asmlinkage long sparc_do_fork(unsigned long clone_flags, |
128 |
+diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S |
129 |
+index 4073e2b87dd0..29aa34f11720 100644 |
130 |
+--- a/arch/sparc/kernel/rtrap_64.S |
131 |
++++ b/arch/sparc/kernel/rtrap_64.S |
132 |
+@@ -39,6 +39,7 @@ __handle_preemption: |
133 |
+ wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate |
134 |
+ |
135 |
+ __handle_user_windows: |
136 |
++ add %sp, PTREGS_OFF, %o0 |
137 |
+ call fault_in_user_windows |
138 |
+ 661: wrpr %g0, RTRAP_PSTATE, %pstate |
139 |
+ /* If userspace is using ADI, it could potentially pass |
140 |
+diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c |
141 |
+index 44d379db3f64..4c5b3fcbed94 100644 |
142 |
+--- a/arch/sparc/kernel/signal32.c |
143 |
++++ b/arch/sparc/kernel/signal32.c |
144 |
+@@ -371,7 +371,11 @@ static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs, |
145 |
+ get_sigframe(ksig, regs, sigframe_size); |
146 |
+ |
147 |
+ if (invalid_frame_pointer(sf, sigframe_size)) { |
148 |
+- do_exit(SIGILL); |
149 |
++ if (show_unhandled_signals) |
150 |
++ pr_info("%s[%d] bad frame in setup_frame32: %08lx TPC %08lx O7 %08lx\n", |
151 |
++ current->comm, current->pid, (unsigned long)sf, |
152 |
++ regs->tpc, regs->u_regs[UREG_I7]); |
153 |
++ force_sigsegv(ksig->sig, current); |
154 |
+ return -EINVAL; |
155 |
+ } |
156 |
+ |
157 |
+@@ -501,7 +505,11 @@ static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs, |
158 |
+ get_sigframe(ksig, regs, sigframe_size); |
159 |
+ |
160 |
+ if (invalid_frame_pointer(sf, sigframe_size)) { |
161 |
+- do_exit(SIGILL); |
162 |
++ if (show_unhandled_signals) |
163 |
++ pr_info("%s[%d] bad frame in setup_rt_frame32: %08lx TPC %08lx O7 %08lx\n", |
164 |
++ current->comm, current->pid, (unsigned long)sf, |
165 |
++ regs->tpc, regs->u_regs[UREG_I7]); |
166 |
++ force_sigsegv(ksig->sig, current); |
167 |
+ return -EINVAL; |
168 |
+ } |
169 |
+ |
170 |
+diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c |
171 |
+index 48366e5eb5b2..e9de1803a22e 100644 |
172 |
+--- a/arch/sparc/kernel/signal_64.c |
173 |
++++ b/arch/sparc/kernel/signal_64.c |
174 |
+@@ -370,7 +370,11 @@ setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs) |
175 |
+ get_sigframe(ksig, regs, sf_size); |
176 |
+ |
177 |
+ if (invalid_frame_pointer (sf)) { |
178 |
+- do_exit(SIGILL); /* won't return, actually */ |
179 |
++ if (show_unhandled_signals) |
180 |
++ pr_info("%s[%d] bad frame in setup_rt_frame: %016lx TPC %016lx O7 %016lx\n", |
181 |
++ current->comm, current->pid, (unsigned long)sf, |
182 |
++ regs->tpc, regs->u_regs[UREG_I7]); |
183 |
++ force_sigsegv(ksig->sig, current); |
184 |
+ return -EINVAL; |
185 |
+ } |
186 |
+ |
187 |
+diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S |
188 |
+index bb68c805b891..ff9389a1c9f3 100644 |
189 |
+--- a/arch/sparc/kernel/systbls_64.S |
190 |
++++ b/arch/sparc/kernel/systbls_64.S |
191 |
+@@ -47,9 +47,9 @@ sys_call_table32: |
192 |
+ .word sys_recvfrom, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate |
193 |
+ /*130*/ .word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_sendto, sys_shutdown |
194 |
+ .word sys_socketpair, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 |
195 |
+-/*140*/ .word sys_sendfile64, sys_nis_syscall, compat_sys_futex, sys_gettid, compat_sys_getrlimit |
196 |
++/*140*/ .word sys_sendfile64, sys_getpeername, compat_sys_futex, sys_gettid, compat_sys_getrlimit |
197 |
+ .word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write |
198 |
+-/*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 |
199 |
++/*150*/ .word sys_getsockname, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 |
200 |
+ .word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount |
201 |
+ /*160*/ .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall |
202 |
+ .word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys_setxattr |
203 |
+diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c |
204 |
+index f396048a0d68..39822f611c01 100644 |
205 |
+--- a/arch/sparc/mm/init_64.c |
206 |
++++ b/arch/sparc/mm/init_64.c |
207 |
+@@ -1383,6 +1383,7 @@ int __node_distance(int from, int to) |
208 |
+ } |
209 |
+ return numa_latency[from][to]; |
210 |
+ } |
211 |
++EXPORT_SYMBOL(__node_distance); |
212 |
+ |
213 |
+ static int __init find_best_numa_node_for_mlgroup(struct mdesc_mlgroup *grp) |
214 |
+ { |
215 |
+diff --git a/crypto/af_alg.c b/crypto/af_alg.c |
216 |
+index b053179e0bc5..17eb09d222ff 100644 |
217 |
+--- a/crypto/af_alg.c |
218 |
++++ b/crypto/af_alg.c |
219 |
+@@ -1071,7 +1071,7 @@ __poll_t af_alg_poll(struct file *file, struct socket *sock, |
220 |
+ struct af_alg_ctx *ctx = ask->private; |
221 |
+ __poll_t mask; |
222 |
+ |
223 |
+- sock_poll_wait(file, wait); |
224 |
++ sock_poll_wait(file, sock, wait); |
225 |
+ mask = 0; |
226 |
+ |
227 |
+ if (!ctx->more || ctx->used) |
228 |
+diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c |
229 |
+index 9697977b80f0..6b9ad8673218 100644 |
230 |
+--- a/drivers/net/bonding/bond_netlink.c |
231 |
++++ b/drivers/net/bonding/bond_netlink.c |
232 |
+@@ -638,8 +638,7 @@ static int bond_fill_info(struct sk_buff *skb, |
233 |
+ goto nla_put_failure; |
234 |
+ |
235 |
+ if (nla_put(skb, IFLA_BOND_AD_ACTOR_SYSTEM, |
236 |
+- sizeof(bond->params.ad_actor_system), |
237 |
+- &bond->params.ad_actor_system)) |
238 |
++ ETH_ALEN, &bond->params.ad_actor_system)) |
239 |
+ goto nla_put_failure; |
240 |
+ } |
241 |
+ if (!bond_3ad_get_active_agg_info(bond, &info)) { |
242 |
+diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h |
243 |
+index 58bcee8f0a58..ce041c90adb0 100644 |
244 |
+--- a/drivers/net/ethernet/emulex/benet/be.h |
245 |
++++ b/drivers/net/ethernet/emulex/benet/be.h |
246 |
+@@ -185,6 +185,7 @@ static inline void queue_tail_inc(struct be_queue_info *q) |
247 |
+ |
248 |
+ struct be_eq_obj { |
249 |
+ struct be_queue_info q; |
250 |
++ char desc[32]; |
251 |
+ |
252 |
+ struct be_adapter *adapter; |
253 |
+ struct napi_struct napi; |
254 |
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c |
255 |
+index 534787291b44..bff74752cef1 100644 |
256 |
+--- a/drivers/net/ethernet/emulex/benet/be_main.c |
257 |
++++ b/drivers/net/ethernet/emulex/benet/be_main.c |
258 |
+@@ -3488,11 +3488,9 @@ static int be_msix_register(struct be_adapter *adapter) |
259 |
+ int status, i, vec; |
260 |
+ |
261 |
+ for_all_evt_queues(adapter, eqo, i) { |
262 |
+- char irq_name[IFNAMSIZ+4]; |
263 |
+- |
264 |
+- snprintf(irq_name, sizeof(irq_name), "%s-q%d", netdev->name, i); |
265 |
++ sprintf(eqo->desc, "%s-q%d", netdev->name, i); |
266 |
+ vec = be_msix_vec_get(adapter, eqo); |
267 |
+- status = request_irq(vec, be_msix, 0, irq_name, eqo); |
268 |
++ status = request_irq(vec, be_msix, 0, eqo->desc, eqo); |
269 |
+ if (status) |
270 |
+ goto err_msix; |
271 |
+ |
272 |
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c |
273 |
+index 00172dee5339..a144146b769c 100644 |
274 |
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c |
275 |
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c |
276 |
+@@ -696,43 +696,15 @@ static inline bool is_last_ethertype_ip(struct sk_buff *skb, int *network_depth) |
277 |
+ return (ethertype == htons(ETH_P_IP) || ethertype == htons(ETH_P_IPV6)); |
278 |
+ } |
279 |
+ |
280 |
+-static __be32 mlx5e_get_fcs(struct sk_buff *skb) |
281 |
++static u32 mlx5e_get_fcs(const struct sk_buff *skb) |
282 |
+ { |
283 |
+- int last_frag_sz, bytes_in_prev, nr_frags; |
284 |
+- u8 *fcs_p1, *fcs_p2; |
285 |
+- skb_frag_t *last_frag; |
286 |
+- __be32 fcs_bytes; |
287 |
++ const void *fcs_bytes; |
288 |
++ u32 _fcs_bytes; |
289 |
+ |
290 |
+- if (!skb_is_nonlinear(skb)) |
291 |
+- return *(__be32 *)(skb->data + skb->len - ETH_FCS_LEN); |
292 |
++ fcs_bytes = skb_header_pointer(skb, skb->len - ETH_FCS_LEN, |
293 |
++ ETH_FCS_LEN, &_fcs_bytes); |
294 |
+ |
295 |
+- nr_frags = skb_shinfo(skb)->nr_frags; |
296 |
+- last_frag = &skb_shinfo(skb)->frags[nr_frags - 1]; |
297 |
+- last_frag_sz = skb_frag_size(last_frag); |
298 |
+- |
299 |
+- /* If all FCS data is in last frag */ |
300 |
+- if (last_frag_sz >= ETH_FCS_LEN) |
301 |
+- return *(__be32 *)(skb_frag_address(last_frag) + |
302 |
+- last_frag_sz - ETH_FCS_LEN); |
303 |
+- |
304 |
+- fcs_p2 = (u8 *)skb_frag_address(last_frag); |
305 |
+- bytes_in_prev = ETH_FCS_LEN - last_frag_sz; |
306 |
+- |
307 |
+- /* Find where the other part of the FCS is - Linear or another frag */ |
308 |
+- if (nr_frags == 1) { |
309 |
+- fcs_p1 = skb_tail_pointer(skb); |
310 |
+- } else { |
311 |
+- skb_frag_t *prev_frag = &skb_shinfo(skb)->frags[nr_frags - 2]; |
312 |
+- |
313 |
+- fcs_p1 = skb_frag_address(prev_frag) + |
314 |
+- skb_frag_size(prev_frag); |
315 |
+- } |
316 |
+- fcs_p1 -= bytes_in_prev; |
317 |
+- |
318 |
+- memcpy(&fcs_bytes, fcs_p1, bytes_in_prev); |
319 |
+- memcpy(((u8 *)&fcs_bytes) + bytes_in_prev, fcs_p2, last_frag_sz); |
320 |
+- |
321 |
+- return fcs_bytes; |
322 |
++ return __get_unaligned_cpu32(fcs_bytes); |
323 |
+ } |
324 |
+ |
325 |
+ static inline void mlx5e_handle_csum(struct net_device *netdev, |
326 |
+@@ -765,8 +737,9 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, |
327 |
+ network_depth - ETH_HLEN, |
328 |
+ skb->csum); |
329 |
+ if (unlikely(netdev->features & NETIF_F_RXFCS)) |
330 |
+- skb->csum = csum_add(skb->csum, |
331 |
+- (__force __wsum)mlx5e_get_fcs(skb)); |
332 |
++ skb->csum = csum_block_add(skb->csum, |
333 |
++ (__force __wsum)mlx5e_get_fcs(skb), |
334 |
++ skb->len - ETH_FCS_LEN); |
335 |
+ stats->csum_complete++; |
336 |
+ return; |
337 |
+ } |
338 |
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c |
339 |
+index 937d0ace699a..30f751e69698 100644 |
340 |
+--- a/drivers/net/ethernet/mellanox/mlxsw/core.c |
341 |
++++ b/drivers/net/ethernet/mellanox/mlxsw/core.c |
342 |
+@@ -943,8 +943,8 @@ static int mlxsw_devlink_core_bus_device_reload(struct devlink *devlink, |
343 |
+ mlxsw_core->bus, |
344 |
+ mlxsw_core->bus_priv, true, |
345 |
+ devlink); |
346 |
+- if (err) |
347 |
+- mlxsw_core->reload_fail = true; |
348 |
++ mlxsw_core->reload_fail = !!err; |
349 |
++ |
350 |
+ return err; |
351 |
+ } |
352 |
+ |
353 |
+@@ -1083,8 +1083,15 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core, |
354 |
+ { |
355 |
+ struct devlink *devlink = priv_to_devlink(mlxsw_core); |
356 |
+ |
357 |
+- if (mlxsw_core->reload_fail) |
358 |
+- goto reload_fail; |
359 |
++ if (mlxsw_core->reload_fail) { |
360 |
++ if (!reload) |
361 |
++ /* Only the parts that were not de-initialized in the |
362 |
++ * failed reload attempt need to be de-initialized. |
363 |
++ */ |
364 |
++ goto reload_fail_deinit; |
365 |
++ else |
366 |
++ return; |
367 |
++ } |
368 |
+ |
369 |
+ if (mlxsw_core->driver->fini) |
370 |
+ mlxsw_core->driver->fini(mlxsw_core); |
371 |
+@@ -1098,9 +1105,12 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core, |
372 |
+ if (!reload) |
373 |
+ devlink_resources_unregister(devlink, NULL); |
374 |
+ mlxsw_core->bus->fini(mlxsw_core->bus_priv); |
375 |
+- if (reload) |
376 |
+- return; |
377 |
+-reload_fail: |
378 |
++ |
379 |
++ return; |
380 |
++ |
381 |
++reload_fail_deinit: |
382 |
++ devlink_unregister(devlink); |
383 |
++ devlink_resources_unregister(devlink, NULL); |
384 |
+ devlink_free(devlink); |
385 |
+ } |
386 |
+ EXPORT_SYMBOL(mlxsw_core_bus_device_unregister); |
387 |
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c |
388 |
+index db715da7bab7..7715f1ed2bcb 100644 |
389 |
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c |
390 |
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c |
391 |
+@@ -2317,8 +2317,6 @@ static void mlxsw_sp_switchdev_event_work(struct work_struct *work) |
392 |
+ break; |
393 |
+ case SWITCHDEV_FDB_DEL_TO_DEVICE: |
394 |
+ fdb_info = &switchdev_work->fdb_info; |
395 |
+- if (!fdb_info->added_by_user) |
396 |
+- break; |
397 |
+ mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, false); |
398 |
+ break; |
399 |
+ case SWITCHDEV_FDB_ADD_TO_BRIDGE: /* fall through */ |
400 |
+diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c |
401 |
+index 2c350099b83c..4930e0375c1d 100644 |
402 |
+--- a/drivers/net/ethernet/realtek/r8169.c |
403 |
++++ b/drivers/net/ethernet/realtek/r8169.c |
404 |
+@@ -4175,10 +4175,15 @@ static void rtl_wol_suspend_quirk(struct rtl8169_private *tp) |
405 |
+ |
406 |
+ static bool rtl_wol_pll_power_down(struct rtl8169_private *tp) |
407 |
+ { |
408 |
+- if (!netif_running(tp->dev) || !__rtl8169_get_wol(tp)) |
409 |
++ struct phy_device *phydev; |
410 |
++ |
411 |
++ if (!__rtl8169_get_wol(tp)) |
412 |
+ return false; |
413 |
+ |
414 |
+- phy_speed_down(tp->dev->phydev, false); |
415 |
++ /* phydev may not be attached to netdevice */ |
416 |
++ phydev = mdiobus_get_phy(tp->mii_bus, 0); |
417 |
++ |
418 |
++ phy_speed_down(phydev, false); |
419 |
+ rtl_wol_suspend_quirk(tp); |
420 |
+ |
421 |
+ return true; |
422 |
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c |
423 |
+index b72ef171477e..bdd351597b55 100644 |
424 |
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c |
425 |
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c |
426 |
+@@ -243,7 +243,7 @@ static int stmmac_mdio_write(struct mii_bus *bus, int phyaddr, int phyreg, |
427 |
+ */ |
428 |
+ int stmmac_mdio_reset(struct mii_bus *bus) |
429 |
+ { |
430 |
+-#if defined(CONFIG_STMMAC_PLATFORM) |
431 |
++#if IS_ENABLED(CONFIG_STMMAC_PLATFORM) |
432 |
+ struct net_device *ndev = bus->priv; |
433 |
+ struct stmmac_priv *priv = netdev_priv(ndev); |
434 |
+ unsigned int mii_address = priv->hw->mii.addr; |
435 |
+diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c |
436 |
+index b13c6b4b2c66..eb95daa3e5a5 100644 |
437 |
+--- a/drivers/vhost/vhost.c |
438 |
++++ b/drivers/vhost/vhost.c |
439 |
+@@ -30,6 +30,7 @@ |
440 |
+ #include <linux/sched/mm.h> |
441 |
+ #include <linux/sched/signal.h> |
442 |
+ #include <linux/interval_tree_generic.h> |
443 |
++#include <linux/nospec.h> |
444 |
+ |
445 |
+ #include "vhost.h" |
446 |
+ |
447 |
+@@ -1397,6 +1398,7 @@ long vhost_vring_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *arg |
448 |
+ if (idx >= d->nvqs) |
449 |
+ return -ENOBUFS; |
450 |
+ |
451 |
++ idx = array_index_nospec(idx, d->nvqs); |
452 |
+ vq = d->vqs[idx]; |
453 |
+ |
454 |
+ mutex_lock(&vq->mutex); |
455 |
+diff --git a/include/net/sock.h b/include/net/sock.h |
456 |
+index 433f45fc2d68..c64a1cff9eb3 100644 |
457 |
+--- a/include/net/sock.h |
458 |
++++ b/include/net/sock.h |
459 |
+@@ -2057,14 +2057,20 @@ static inline bool skwq_has_sleeper(struct socket_wq *wq) |
460 |
+ /** |
461 |
+ * sock_poll_wait - place memory barrier behind the poll_wait call. |
462 |
+ * @filp: file |
463 |
++ * @sock: socket to wait on |
464 |
+ * @p: poll_table |
465 |
+ * |
466 |
+ * See the comments in the wq_has_sleeper function. |
467 |
++ * |
468 |
++ * Do not derive sock from filp->private_data here. An SMC socket establishes |
469 |
++ * an internal TCP socket that is used in the fallback case. All socket |
470 |
++ * operations on the SMC socket are then forwarded to the TCP socket. In case of |
471 |
++ * poll, the filp->private_data pointer references the SMC socket because the |
472 |
++ * TCP socket has no file assigned. |
473 |
+ */ |
474 |
+-static inline void sock_poll_wait(struct file *filp, poll_table *p) |
475 |
++static inline void sock_poll_wait(struct file *filp, struct socket *sock, |
476 |
++ poll_table *p) |
477 |
+ { |
478 |
+- struct socket *sock = filp->private_data; |
479 |
+- |
480 |
+ if (!poll_does_not_wait(p)) { |
481 |
+ poll_wait(filp, &sock->wq->wait, p); |
482 |
+ /* We need to be sure we are in sync with the |
483 |
+diff --git a/net/atm/common.c b/net/atm/common.c |
484 |
+index 9f8cb0d2e71e..a38c174fc766 100644 |
485 |
+--- a/net/atm/common.c |
486 |
++++ b/net/atm/common.c |
487 |
+@@ -653,7 +653,7 @@ __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait) |
488 |
+ struct atm_vcc *vcc; |
489 |
+ __poll_t mask; |
490 |
+ |
491 |
+- sock_poll_wait(file, wait); |
492 |
++ sock_poll_wait(file, sock, wait); |
493 |
+ mask = 0; |
494 |
+ |
495 |
+ vcc = ATM_SD(sock); |
496 |
+diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c |
497 |
+index 20ed7adcf1cc..6dec8e9b3451 100644 |
498 |
+--- a/net/bridge/br_multicast.c |
499 |
++++ b/net/bridge/br_multicast.c |
500 |
+@@ -1420,7 +1420,14 @@ static void br_multicast_query_received(struct net_bridge *br, |
501 |
+ return; |
502 |
+ |
503 |
+ br_multicast_update_query_timer(br, query, max_delay); |
504 |
+- br_multicast_mark_router(br, port); |
505 |
++ |
506 |
++ /* Based on RFC4541, section 2.1.1 IGMP Forwarding Rules, |
507 |
++ * the arrival port for IGMP Queries where the source address |
508 |
++ * is 0.0.0.0 should not be added to router port list. |
509 |
++ */ |
510 |
++ if ((saddr->proto == htons(ETH_P_IP) && saddr->u.ip4) || |
511 |
++ saddr->proto == htons(ETH_P_IPV6)) |
512 |
++ br_multicast_mark_router(br, port); |
513 |
+ } |
514 |
+ |
515 |
+ static void br_ip4_multicast_query(struct net_bridge *br, |
516 |
+diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c |
517 |
+index d18965f3291f..416717c57cd1 100644 |
518 |
+--- a/net/caif/caif_socket.c |
519 |
++++ b/net/caif/caif_socket.c |
520 |
+@@ -941,7 +941,7 @@ static __poll_t caif_poll(struct file *file, |
521 |
+ __poll_t mask; |
522 |
+ struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); |
523 |
+ |
524 |
+- sock_poll_wait(file, wait); |
525 |
++ sock_poll_wait(file, sock, wait); |
526 |
+ mask = 0; |
527 |
+ |
528 |
+ /* exceptional events? */ |
529 |
+diff --git a/net/core/datagram.c b/net/core/datagram.c |
530 |
+index 9aac0d63d53e..57f3a6fcfc1e 100644 |
531 |
+--- a/net/core/datagram.c |
532 |
++++ b/net/core/datagram.c |
533 |
+@@ -808,8 +808,9 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, |
534 |
+ return -EINVAL; |
535 |
+ } |
536 |
+ |
537 |
+- if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE)) |
538 |
+- netdev_rx_csum_fault(skb->dev); |
539 |
++ if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) && |
540 |
++ !skb->csum_complete_sw) |
541 |
++ netdev_rx_csum_fault(NULL); |
542 |
+ } |
543 |
+ return 0; |
544 |
+ fault: |
545 |
+@@ -837,7 +838,7 @@ __poll_t datagram_poll(struct file *file, struct socket *sock, |
546 |
+ struct sock *sk = sock->sk; |
547 |
+ __poll_t mask; |
548 |
+ |
549 |
+- sock_poll_wait(file, wait); |
550 |
++ sock_poll_wait(file, sock, wait); |
551 |
+ mask = 0; |
552 |
+ |
553 |
+ /* exceptional events? */ |
554 |
+diff --git a/net/core/dev.c b/net/core/dev.c |
555 |
+index 93243479085f..e16ba3625400 100644 |
556 |
+--- a/net/core/dev.c |
557 |
++++ b/net/core/dev.c |
558 |
+@@ -5431,6 +5431,7 @@ static void gro_flush_oldest(struct list_head *head) |
559 |
+ * SKB to the chain. |
560 |
+ */ |
561 |
+ list_del(&oldest->list); |
562 |
++ oldest->next = NULL; |
563 |
+ napi_gro_complete(oldest); |
564 |
+ } |
565 |
+ |
566 |
+diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c |
567 |
+index 37c7936124e6..6e5d61a20a70 100644 |
568 |
+--- a/net/core/rtnetlink.c |
569 |
++++ b/net/core/rtnetlink.c |
570 |
+@@ -3530,6 +3530,11 @@ static int rtnl_fdb_add(struct sk_buff *skb, struct nlmsghdr *nlh, |
571 |
+ return -EINVAL; |
572 |
+ } |
573 |
+ |
574 |
++ if (dev->type != ARPHRD_ETHER) { |
575 |
++ NL_SET_ERR_MSG(extack, "FDB delete only supported for Ethernet devices"); |
576 |
++ return -EINVAL; |
577 |
++ } |
578 |
++ |
579 |
+ addr = nla_data(tb[NDA_LLADDR]); |
580 |
+ |
581 |
+ err = fdb_vid_parse(tb[NDA_VLAN], &vid, extack); |
582 |
+@@ -3634,6 +3639,11 @@ static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh, |
583 |
+ return -EINVAL; |
584 |
+ } |
585 |
+ |
586 |
++ if (dev->type != ARPHRD_ETHER) { |
587 |
++ NL_SET_ERR_MSG(extack, "FDB add only supported for Ethernet devices"); |
588 |
++ return -EINVAL; |
589 |
++ } |
590 |
++ |
591 |
+ addr = nla_data(tb[NDA_LLADDR]); |
592 |
+ |
593 |
+ err = fdb_vid_parse(tb[NDA_VLAN], &vid, extack); |
594 |
+diff --git a/net/dccp/proto.c b/net/dccp/proto.c |
595 |
+index 875858c8b059..43733accf58e 100644 |
596 |
+--- a/net/dccp/proto.c |
597 |
++++ b/net/dccp/proto.c |
598 |
+@@ -325,7 +325,7 @@ __poll_t dccp_poll(struct file *file, struct socket *sock, |
599 |
+ __poll_t mask; |
600 |
+ struct sock *sk = sock->sk; |
601 |
+ |
602 |
+- sock_poll_wait(file, wait); |
603 |
++ sock_poll_wait(file, sock, wait); |
604 |
+ if (sk->sk_state == DCCP_LISTEN) |
605 |
+ return inet_csk_listen_poll(sk); |
606 |
+ |
607 |
+diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c |
608 |
+index e7227128df2c..cb8fa5d7afe1 100644 |
609 |
+--- a/net/ipv4/ip_fragment.c |
610 |
++++ b/net/ipv4/ip_fragment.c |
611 |
+@@ -720,10 +720,14 @@ struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user) |
612 |
+ if (ip_is_fragment(&iph)) { |
613 |
+ skb = skb_share_check(skb, GFP_ATOMIC); |
614 |
+ if (skb) { |
615 |
+- if (!pskb_may_pull(skb, netoff + iph.ihl * 4)) |
616 |
+- return skb; |
617 |
+- if (pskb_trim_rcsum(skb, netoff + len)) |
618 |
+- return skb; |
619 |
++ if (!pskb_may_pull(skb, netoff + iph.ihl * 4)) { |
620 |
++ kfree_skb(skb); |
621 |
++ return NULL; |
622 |
++ } |
623 |
++ if (pskb_trim_rcsum(skb, netoff + len)) { |
624 |
++ kfree_skb(skb); |
625 |
++ return NULL; |
626 |
++ } |
627 |
+ memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); |
628 |
+ if (ip_defrag(net, skb, user)) |
629 |
+ return NULL; |
630 |
+diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
631 |
+index 10c6246396cc..bbd07736fb0f 100644 |
632 |
+--- a/net/ipv4/tcp.c |
633 |
++++ b/net/ipv4/tcp.c |
634 |
+@@ -507,7 +507,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait) |
635 |
+ const struct tcp_sock *tp = tcp_sk(sk); |
636 |
+ int state; |
637 |
+ |
638 |
+- sock_poll_wait(file, wait); |
639 |
++ sock_poll_wait(file, sock, wait); |
640 |
+ |
641 |
+ state = inet_sk_state_load(sk); |
642 |
+ if (state == TCP_LISTEN) |
643 |
+diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c |
644 |
+index c32a4c16b7ff..f8183fdce5b2 100644 |
645 |
+--- a/net/ipv4/udp.c |
646 |
++++ b/net/ipv4/udp.c |
647 |
+@@ -2120,8 +2120,24 @@ static inline int udp4_csum_init(struct sk_buff *skb, struct udphdr *uh, |
648 |
+ /* Note, we are only interested in != 0 or == 0, thus the |
649 |
+ * force to int. |
650 |
+ */ |
651 |
+- return (__force int)skb_checksum_init_zero_check(skb, proto, uh->check, |
652 |
+- inet_compute_pseudo); |
653 |
++ err = (__force int)skb_checksum_init_zero_check(skb, proto, uh->check, |
654 |
++ inet_compute_pseudo); |
655 |
++ if (err) |
656 |
++ return err; |
657 |
++ |
658 |
++ if (skb->ip_summed == CHECKSUM_COMPLETE && !skb->csum_valid) { |
659 |
++ /* If SW calculated the value, we know it's bad */ |
660 |
++ if (skb->csum_complete_sw) |
661 |
++ return 1; |
662 |
++ |
663 |
++ /* HW says the value is bad. Let's validate that. |
664 |
++ * skb->csum is no longer the full packet checksum, |
665 |
++ * so don't treat it as such. |
666 |
++ */ |
667 |
++ skb_checksum_complete_unset(skb); |
668 |
++ } |
669 |
++ |
670 |
++ return 0; |
671 |
+ } |
672 |
+ |
673 |
+ /* wrapper for udp_queue_rcv_skb tacking care of csum conversion and |
674 |
+diff --git a/net/ipv6/ip6_checksum.c b/net/ipv6/ip6_checksum.c |
675 |
+index 547515e8450a..377717045f8f 100644 |
676 |
+--- a/net/ipv6/ip6_checksum.c |
677 |
++++ b/net/ipv6/ip6_checksum.c |
678 |
+@@ -88,8 +88,24 @@ int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto) |
679 |
+ * Note, we are only interested in != 0 or == 0, thus the |
680 |
+ * force to int. |
681 |
+ */ |
682 |
+- return (__force int)skb_checksum_init_zero_check(skb, proto, uh->check, |
683 |
+- ip6_compute_pseudo); |
684 |
++ err = (__force int)skb_checksum_init_zero_check(skb, proto, uh->check, |
685 |
++ ip6_compute_pseudo); |
686 |
++ if (err) |
687 |
++ return err; |
688 |
++ |
689 |
++ if (skb->ip_summed == CHECKSUM_COMPLETE && !skb->csum_valid) { |
690 |
++ /* If SW calculated the value, we know it's bad */ |
691 |
++ if (skb->csum_complete_sw) |
692 |
++ return 1; |
693 |
++ |
694 |
++ /* HW says the value is bad. Let's validate that. |
695 |
++ * skb->csum is no longer the full packet checksum, |
696 |
++ * so don't treat is as such. |
697 |
++ */ |
698 |
++ skb_checksum_complete_unset(skb); |
699 |
++ } |
700 |
++ |
701 |
++ return 0; |
702 |
+ } |
703 |
+ EXPORT_SYMBOL(udp6_csum_init); |
704 |
+ |
705 |
+diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c |
706 |
+index 0ec273997d1d..673a4a932f2a 100644 |
707 |
+--- a/net/ipv6/ndisc.c |
708 |
++++ b/net/ipv6/ndisc.c |
709 |
+@@ -1732,10 +1732,9 @@ int ndisc_rcv(struct sk_buff *skb) |
710 |
+ return 0; |
711 |
+ } |
712 |
+ |
713 |
+- memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); |
714 |
+- |
715 |
+ switch (msg->icmph.icmp6_type) { |
716 |
+ case NDISC_NEIGHBOUR_SOLICITATION: |
717 |
++ memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); |
718 |
+ ndisc_recv_ns(skb); |
719 |
+ break; |
720 |
+ |
721 |
+diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
722 |
+index abcb5ae77319..1cf00d857fc1 100644 |
723 |
+--- a/net/ipv6/route.c |
724 |
++++ b/net/ipv6/route.c |
725 |
+@@ -2799,6 +2799,8 @@ static int ip6_route_check_nh_onlink(struct net *net, |
726 |
+ grt = ip6_nh_lookup_table(net, cfg, gw_addr, tbid, 0); |
727 |
+ if (grt) { |
728 |
+ if (!grt->dst.error && |
729 |
++ /* ignore match if it is the default route */ |
730 |
++ grt->from && !ipv6_addr_any(&grt->from->fib6_dst.addr) && |
731 |
+ (grt->rt6i_flags & flags || dev != grt->dst.dev)) { |
732 |
+ NL_SET_ERR_MSG(extack, |
733 |
+ "Nexthop has invalid gateway or device mismatch"); |
734 |
+diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c |
735 |
+index e2f16a0173a9..f024914da1b2 100644 |
736 |
+--- a/net/iucv/af_iucv.c |
737 |
++++ b/net/iucv/af_iucv.c |
738 |
+@@ -1505,7 +1505,7 @@ __poll_t iucv_sock_poll(struct file *file, struct socket *sock, |
739 |
+ struct sock *sk = sock->sk; |
740 |
+ __poll_t mask = 0; |
741 |
+ |
742 |
+- sock_poll_wait(file, wait); |
743 |
++ sock_poll_wait(file, sock, wait); |
744 |
+ |
745 |
+ if (sk->sk_state == IUCV_LISTEN) |
746 |
+ return iucv_accept_poll(sk); |
747 |
+diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c |
748 |
+index dd4adf8b1167..ae296273ce3d 100644 |
749 |
+--- a/net/nfc/llcp_sock.c |
750 |
++++ b/net/nfc/llcp_sock.c |
751 |
+@@ -556,7 +556,7 @@ static __poll_t llcp_sock_poll(struct file *file, struct socket *sock, |
752 |
+ |
753 |
+ pr_debug("%p\n", sk); |
754 |
+ |
755 |
+- sock_poll_wait(file, wait); |
756 |
++ sock_poll_wait(file, sock, wait); |
757 |
+ |
758 |
+ if (sk->sk_state == LLCP_LISTEN) |
759 |
+ return llcp_accept_poll(sk); |
760 |
+diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c |
761 |
+index a70097ecf33c..865ecef68196 100644 |
762 |
+--- a/net/openvswitch/flow_netlink.c |
763 |
++++ b/net/openvswitch/flow_netlink.c |
764 |
+@@ -3030,7 +3030,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, |
765 |
+ * is already present */ |
766 |
+ if (mac_proto != MAC_PROTO_NONE) |
767 |
+ return -EINVAL; |
768 |
+- mac_proto = MAC_PROTO_NONE; |
769 |
++ mac_proto = MAC_PROTO_ETHERNET; |
770 |
+ break; |
771 |
+ |
772 |
+ case OVS_ACTION_ATTR_POP_ETH: |
773 |
+@@ -3038,7 +3038,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr, |
774 |
+ return -EINVAL; |
775 |
+ if (vlan_tci & htons(VLAN_TAG_PRESENT)) |
776 |
+ return -EINVAL; |
777 |
+- mac_proto = MAC_PROTO_ETHERNET; |
778 |
++ mac_proto = MAC_PROTO_NONE; |
779 |
+ break; |
780 |
+ |
781 |
+ case OVS_ACTION_ATTR_PUSH_NSH: |
782 |
+diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c |
783 |
+index ac44d8afffb1..3c39b8805d01 100644 |
784 |
+--- a/net/rxrpc/af_rxrpc.c |
785 |
++++ b/net/rxrpc/af_rxrpc.c |
786 |
+@@ -741,7 +741,7 @@ static __poll_t rxrpc_poll(struct file *file, struct socket *sock, |
787 |
+ struct rxrpc_sock *rx = rxrpc_sk(sk); |
788 |
+ __poll_t mask; |
789 |
+ |
790 |
+- sock_poll_wait(file, wait); |
791 |
++ sock_poll_wait(file, sock, wait); |
792 |
+ mask = 0; |
793 |
+ |
794 |
+ /* the socket is readable if there are any messages waiting on the Rx |
795 |
+diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c |
796 |
+index cbe4831f46f4..4a042abf844c 100644 |
797 |
+--- a/net/sched/sch_gred.c |
798 |
++++ b/net/sched/sch_gred.c |
799 |
+@@ -413,7 +413,7 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt, |
800 |
+ if (tb[TCA_GRED_PARMS] == NULL && tb[TCA_GRED_STAB] == NULL) { |
801 |
+ if (tb[TCA_GRED_LIMIT] != NULL) |
802 |
+ sch->limit = nla_get_u32(tb[TCA_GRED_LIMIT]); |
803 |
+- return gred_change_table_def(sch, opt); |
804 |
++ return gred_change_table_def(sch, tb[TCA_GRED_DPS]); |
805 |
+ } |
806 |
+ |
807 |
+ if (tb[TCA_GRED_PARMS] == NULL || |
808 |
+diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
809 |
+index c1c1bda334a4..c1693e28aed4 100644 |
810 |
+--- a/net/sctp/socket.c |
811 |
++++ b/net/sctp/socket.c |
812 |
+@@ -7101,14 +7101,15 @@ static int sctp_getsockopt_pr_assocstatus(struct sock *sk, int len, |
813 |
+ } |
814 |
+ |
815 |
+ policy = params.sprstat_policy; |
816 |
+- if (!policy || (policy & ~(SCTP_PR_SCTP_MASK | SCTP_PR_SCTP_ALL))) |
817 |
++ if (!policy || (policy & ~(SCTP_PR_SCTP_MASK | SCTP_PR_SCTP_ALL)) || |
818 |
++ ((policy & SCTP_PR_SCTP_ALL) && (policy & SCTP_PR_SCTP_MASK))) |
819 |
+ goto out; |
820 |
+ |
821 |
+ asoc = sctp_id2assoc(sk, params.sprstat_assoc_id); |
822 |
+ if (!asoc) |
823 |
+ goto out; |
824 |
+ |
825 |
+- if (policy & SCTP_PR_SCTP_ALL) { |
826 |
++ if (policy == SCTP_PR_SCTP_ALL) { |
827 |
+ params.sprstat_abandoned_unsent = 0; |
828 |
+ params.sprstat_abandoned_sent = 0; |
829 |
+ for (policy = 0; policy <= SCTP_PR_INDEX(MAX); policy++) { |
830 |
+@@ -7160,7 +7161,8 @@ static int sctp_getsockopt_pr_streamstatus(struct sock *sk, int len, |
831 |
+ } |
832 |
+ |
833 |
+ policy = params.sprstat_policy; |
834 |
+- if (!policy || (policy & ~(SCTP_PR_SCTP_MASK | SCTP_PR_SCTP_ALL))) |
835 |
++ if (!policy || (policy & ~(SCTP_PR_SCTP_MASK | SCTP_PR_SCTP_ALL)) || |
836 |
++ ((policy & SCTP_PR_SCTP_ALL) && (policy & SCTP_PR_SCTP_MASK))) |
837 |
+ goto out; |
838 |
+ |
839 |
+ asoc = sctp_id2assoc(sk, params.sprstat_assoc_id); |
840 |
+diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c |
841 |
+index 015231789ed2..80e2119f1c70 100644 |
842 |
+--- a/net/smc/af_smc.c |
843 |
++++ b/net/smc/af_smc.c |
844 |
+@@ -1543,7 +1543,7 @@ static __poll_t smc_poll(struct file *file, struct socket *sock, |
845 |
+ mask |= EPOLLERR; |
846 |
+ } else { |
847 |
+ if (sk->sk_state != SMC_CLOSED) |
848 |
+- sock_poll_wait(file, wait); |
849 |
++ sock_poll_wait(file, sock, wait); |
850 |
+ if (sk->sk_err) |
851 |
+ mask |= EPOLLERR; |
852 |
+ if ((sk->sk_shutdown == SHUTDOWN_MASK) || |
853 |
+diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c |
854 |
+index e871368500e3..18daebcef181 100644 |
855 |
+--- a/net/smc/smc_core.c |
856 |
++++ b/net/smc/smc_core.c |
857 |
+@@ -122,22 +122,17 @@ static void __smc_lgr_unregister_conn(struct smc_connection *conn) |
858 |
+ sock_put(&smc->sk); /* sock_hold in smc_lgr_register_conn() */ |
859 |
+ } |
860 |
+ |
861 |
+-/* Unregister connection and trigger lgr freeing if applicable |
862 |
++/* Unregister connection from lgr |
863 |
+ */ |
864 |
+ static void smc_lgr_unregister_conn(struct smc_connection *conn) |
865 |
+ { |
866 |
+ struct smc_link_group *lgr = conn->lgr; |
867 |
+- int reduced = 0; |
868 |
+ |
869 |
+ write_lock_bh(&lgr->conns_lock); |
870 |
+ if (conn->alert_token_local) { |
871 |
+- reduced = 1; |
872 |
+ __smc_lgr_unregister_conn(conn); |
873 |
+ } |
874 |
+ write_unlock_bh(&lgr->conns_lock); |
875 |
+- if (!reduced || lgr->conns_num) |
876 |
+- return; |
877 |
+- smc_lgr_schedule_free_work(lgr); |
878 |
+ } |
879 |
+ |
880 |
+ /* Send delete link, either as client to request the initiation |
881 |
+@@ -291,7 +286,8 @@ out: |
882 |
+ return rc; |
883 |
+ } |
884 |
+ |
885 |
+-static void smc_buf_unuse(struct smc_connection *conn) |
886 |
++static void smc_buf_unuse(struct smc_connection *conn, |
887 |
++ struct smc_link_group *lgr) |
888 |
+ { |
889 |
+ if (conn->sndbuf_desc) |
890 |
+ conn->sndbuf_desc->used = 0; |
891 |
+@@ -301,8 +297,6 @@ static void smc_buf_unuse(struct smc_connection *conn) |
892 |
+ conn->rmb_desc->used = 0; |
893 |
+ } else { |
894 |
+ /* buf registration failed, reuse not possible */ |
895 |
+- struct smc_link_group *lgr = conn->lgr; |
896 |
+- |
897 |
+ write_lock_bh(&lgr->rmbs_lock); |
898 |
+ list_del(&conn->rmb_desc->list); |
899 |
+ write_unlock_bh(&lgr->rmbs_lock); |
900 |
+@@ -315,16 +309,21 @@ static void smc_buf_unuse(struct smc_connection *conn) |
901 |
+ /* remove a finished connection from its link group */ |
902 |
+ void smc_conn_free(struct smc_connection *conn) |
903 |
+ { |
904 |
+- if (!conn->lgr) |
905 |
++ struct smc_link_group *lgr = conn->lgr; |
906 |
++ |
907 |
++ if (!lgr) |
908 |
+ return; |
909 |
+- if (conn->lgr->is_smcd) { |
910 |
++ if (lgr->is_smcd) { |
911 |
+ smc_ism_unset_conn(conn); |
912 |
+ tasklet_kill(&conn->rx_tsklet); |
913 |
+ } else { |
914 |
+ smc_cdc_tx_dismiss_slots(conn); |
915 |
+ } |
916 |
+- smc_lgr_unregister_conn(conn); |
917 |
+- smc_buf_unuse(conn); |
918 |
++ smc_lgr_unregister_conn(conn); /* unsets conn->lgr */ |
919 |
++ smc_buf_unuse(conn, lgr); /* allow buffer reuse */ |
920 |
++ |
921 |
++ if (!lgr->conns_num) |
922 |
++ smc_lgr_schedule_free_work(lgr); |
923 |
+ } |
924 |
+ |
925 |
+ static void smc_link_clear(struct smc_link *lnk) |
926 |
+diff --git a/net/tipc/socket.c b/net/tipc/socket.c |
927 |
+index 49810fdff4c5..0bf8ad486c5e 100644 |
928 |
+--- a/net/tipc/socket.c |
929 |
++++ b/net/tipc/socket.c |
930 |
+@@ -715,7 +715,7 @@ static __poll_t tipc_poll(struct file *file, struct socket *sock, |
931 |
+ struct tipc_sock *tsk = tipc_sk(sk); |
932 |
+ __poll_t revents = 0; |
933 |
+ |
934 |
+- sock_poll_wait(file, wait); |
935 |
++ sock_poll_wait(file, sock, wait); |
936 |
+ |
937 |
+ if (sk->sk_shutdown & RCV_SHUTDOWN) |
938 |
+ revents |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM; |
939 |
+diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c |
940 |
+index d1edfa3cad61..c754f3a90a2e 100644 |
941 |
+--- a/net/unix/af_unix.c |
942 |
++++ b/net/unix/af_unix.c |
943 |
+@@ -2640,7 +2640,7 @@ static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wa |
944 |
+ struct sock *sk = sock->sk; |
945 |
+ __poll_t mask; |
946 |
+ |
947 |
+- sock_poll_wait(file, wait); |
948 |
++ sock_poll_wait(file, sock, wait); |
949 |
+ mask = 0; |
950 |
+ |
951 |
+ /* exceptional events? */ |
952 |
+@@ -2677,7 +2677,7 @@ static __poll_t unix_dgram_poll(struct file *file, struct socket *sock, |
953 |
+ unsigned int writable; |
954 |
+ __poll_t mask; |
955 |
+ |
956 |
+- sock_poll_wait(file, wait); |
957 |
++ sock_poll_wait(file, sock, wait); |
958 |
+ mask = 0; |
959 |
+ |
960 |
+ /* exceptional events? */ |
961 |
+diff --git a/tools/testing/selftests/net/fib-onlink-tests.sh b/tools/testing/selftests/net/fib-onlink-tests.sh |
962 |
+index 3991ad1a368d..864f865eee55 100755 |
963 |
+--- a/tools/testing/selftests/net/fib-onlink-tests.sh |
964 |
++++ b/tools/testing/selftests/net/fib-onlink-tests.sh |
965 |
+@@ -167,8 +167,8 @@ setup() |
966 |
+ # add vrf table |
967 |
+ ip li add ${VRF} type vrf table ${VRF_TABLE} |
968 |
+ ip li set ${VRF} up |
969 |
+- ip ro add table ${VRF_TABLE} unreachable default |
970 |
+- ip -6 ro add table ${VRF_TABLE} unreachable default |
971 |
++ ip ro add table ${VRF_TABLE} unreachable default metric 8192 |
972 |
++ ip -6 ro add table ${VRF_TABLE} unreachable default metric 8192 |
973 |
+ |
974 |
+ # create test interfaces |
975 |
+ ip li add ${NETIFS[p1]} type veth peer name ${NETIFS[p2]} |
976 |
+@@ -185,20 +185,20 @@ setup() |
977 |
+ for n in 1 3 5 7; do |
978 |
+ ip li set ${NETIFS[p${n}]} up |
979 |
+ ip addr add ${V4ADDRS[p${n}]}/24 dev ${NETIFS[p${n}]} |
980 |
+- ip addr add ${V6ADDRS[p${n}]}/64 dev ${NETIFS[p${n}]} |
981 |
++ ip addr add ${V6ADDRS[p${n}]}/64 dev ${NETIFS[p${n}]} nodad |
982 |
+ done |
983 |
+ |
984 |
+ # move peer interfaces to namespace and add addresses |
985 |
+ for n in 2 4 6 8; do |
986 |
+ ip li set ${NETIFS[p${n}]} netns ${PEER_NS} up |
987 |
+ ip -netns ${PEER_NS} addr add ${V4ADDRS[p${n}]}/24 dev ${NETIFS[p${n}]} |
988 |
+- ip -netns ${PEER_NS} addr add ${V6ADDRS[p${n}]}/64 dev ${NETIFS[p${n}]} |
989 |
++ ip -netns ${PEER_NS} addr add ${V6ADDRS[p${n}]}/64 dev ${NETIFS[p${n}]} nodad |
990 |
+ done |
991 |
+ |
992 |
+- set +e |
993 |
++ ip -6 ro add default via ${V6ADDRS[p3]/::[0-9]/::64} |
994 |
++ ip -6 ro add table ${VRF_TABLE} default via ${V6ADDRS[p7]/::[0-9]/::64} |
995 |
+ |
996 |
+- # let DAD complete - assume default of 1 probe |
997 |
+- sleep 1 |
998 |
++ set +e |
999 |
+ } |
1000 |
+ |
1001 |
+ cleanup() |