Contents of /trunk/kernel-alx/patches-4.19/0100-4.19.1-all-fixes.patch
Parent Directory | Revision Log
Revision 3379 -
(show annotations)
(download)
Fri Aug 2 11:44:54 2019 UTC (5 years, 1 month ago) by niro
File size: 33236 byte(s)
Fri Aug 2 11:44:54 2019 UTC (5 years, 1 month ago) by niro
File size: 33236 byte(s)
linux-4.19.1
1 | 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() |