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