Magellan Linux

Contents of /trunk/kernel-alx/patches-4.19/0100-4.19.1-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3379 - (show annotations) (download)
Fri Aug 2 11:44:54 2019 UTC (4 years, 8 months 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()