Magellan Linux

Contents of /trunk/kernel-alx/patches-4.4/0142-4.4.43-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2878 - (show annotations) (download)
Mon Mar 27 13:49:18 2017 UTC (7 years, 1 month ago) by niro
File size: 21636 byte(s)
linux-4.4.43
1 diff --git a/Makefile b/Makefile
2 index b8a90f9a463d..04a2186a4276 100644
3 --- a/Makefile
4 +++ b/Makefile
5 @@ -1,6 +1,6 @@
6 VERSION = 4
7 PATCHLEVEL = 4
8 -SUBLEVEL = 42
9 +SUBLEVEL = 43
10 EXTRAVERSION =
11 NAME = Blurry Fish Butt
12
13 diff --git a/arch/arm/mach-omap2/omap-mpuss-lowpower.c b/arch/arm/mach-omap2/omap-mpuss-lowpower.c
14 index 65024af169d3..d3c14da7d216 100644
15 --- a/arch/arm/mach-omap2/omap-mpuss-lowpower.c
16 +++ b/arch/arm/mach-omap2/omap-mpuss-lowpower.c
17 @@ -243,10 +243,9 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)
18 save_state = 1;
19 break;
20 case PWRDM_POWER_RET:
21 - if (IS_PM44XX_ERRATUM(PM_OMAP4_CPU_OSWR_DISABLE)) {
22 + if (IS_PM44XX_ERRATUM(PM_OMAP4_CPU_OSWR_DISABLE))
23 save_state = 0;
24 - break;
25 - }
26 + break;
27 default:
28 /*
29 * CPUx CSWR is invalid hardware state. Also CPUx OSWR
30 diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c
31 index 6f39d03cc27e..0a43143e9ceb 100644
32 --- a/arch/arm/mach-zynq/common.c
33 +++ b/arch/arm/mach-zynq/common.c
34 @@ -59,7 +59,7 @@ void __iomem *zynq_scu_base;
35 static void __init zynq_memory_init(void)
36 {
37 if (!__pa(PAGE_OFFSET))
38 - memblock_reserve(__pa(PAGE_OFFSET), __pa(swapper_pg_dir));
39 + memblock_reserve(__pa(PAGE_OFFSET), 0x80000);
40 }
41
42 static struct platform_device zynq_cpuidle_device = {
43 diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
44 index ed3ab509faca..df4efa304b2c 100644
45 --- a/arch/powerpc/kernel/misc_32.S
46 +++ b/arch/powerpc/kernel/misc_32.S
47 @@ -313,7 +313,7 @@ _GLOBAL(flush_instruction_cache)
48 lis r3, KERNELBASE@h
49 iccci 0,r3
50 #endif
51 -#elif CONFIG_FSL_BOOKE
52 +#elif defined(CONFIG_FSL_BOOKE)
53 BEGIN_FTR_SECTION
54 mfspr r3,SPRN_L1CSR0
55 ori r3,r3,L1CSR0_CFI|L1CSR0_CLFC
56 diff --git a/drivers/hid/hid-cypress.c b/drivers/hid/hid-cypress.c
57 index 1b764d1745f3..1689568b597d 100644
58 --- a/drivers/hid/hid-cypress.c
59 +++ b/drivers/hid/hid-cypress.c
60 @@ -39,6 +39,9 @@ static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc,
61 if (!(quirks & CP_RDESC_SWAPPED_MIN_MAX))
62 return rdesc;
63
64 + if (*rsize < 4)
65 + return rdesc;
66 +
67 for (i = 0; i < *rsize - 4; i++)
68 if (rdesc[i] == 0x29 && rdesc[i + 2] == 0x19) {
69 rdesc[i] = 0x19;
70 diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c
71 index 2a506fe0c8a4..74bf1a17ae7c 100644
72 --- a/drivers/isdn/gigaset/ser-gigaset.c
73 +++ b/drivers/isdn/gigaset/ser-gigaset.c
74 @@ -762,8 +762,10 @@ static int __init ser_gigaset_init(void)
75 driver = gigaset_initdriver(GIGASET_MINOR, GIGASET_MINORS,
76 GIGASET_MODULENAME, GIGASET_DEVNAME,
77 &ops, THIS_MODULE);
78 - if (!driver)
79 + if (!driver) {
80 + rc = -ENOMEM;
81 goto error;
82 + }
83
84 rc = tty_register_ldisc(N_GIGASET_M101, &gigaset_ldisc);
85 if (rc != 0) {
86 diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
87 index 6cf6d93d8831..ba115ec7aa92 100644
88 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
89 +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
90 @@ -432,6 +432,13 @@ static int handle_hca_cap(struct mlx5_core_dev *dev)
91 MLX5_SET(cmd_hca_cap, set_hca_cap, pkey_table_size,
92 to_fw_pkey_sz(128));
93
94 + /* Check log_max_qp from HCA caps to set in current profile */
95 + if (MLX5_CAP_GEN_MAX(dev, log_max_qp) < profile[prof_sel].log_max_qp) {
96 + mlx5_core_warn(dev, "log_max_qp value in current profile is %d, changing it to HCA capability limit (%d)\n",
97 + profile[prof_sel].log_max_qp,
98 + MLX5_CAP_GEN_MAX(dev, log_max_qp));
99 + profile[prof_sel].log_max_qp = MLX5_CAP_GEN_MAX(dev, log_max_qp);
100 + }
101 if (prof->mask & MLX5_PROF_MASK_QP_SIZE)
102 MLX5_SET(cmd_hca_cap, set_hca_cap, log_max_qp,
103 prof->log_max_qp);
104 @@ -505,7 +512,6 @@ static int mlx5_irq_set_affinity_hint(struct mlx5_core_dev *mdev, int i)
105 struct mlx5_priv *priv = &mdev->priv;
106 struct msix_entry *msix = priv->msix_arr;
107 int irq = msix[i + MLX5_EQ_VEC_COMP_BASE].vector;
108 - int numa_node = priv->numa_node;
109 int err;
110
111 if (!zalloc_cpumask_var(&priv->irq_info[i].mask, GFP_KERNEL)) {
112 @@ -513,7 +519,7 @@ static int mlx5_irq_set_affinity_hint(struct mlx5_core_dev *mdev, int i)
113 return -ENOMEM;
114 }
115
116 - cpumask_set_cpu(cpumask_local_spread(i, numa_node),
117 + cpumask_set_cpu(cpumask_local_spread(i, priv->numa_node),
118 priv->irq_info[i].mask);
119
120 err = irq_set_affinity_hint(irq, priv->irq_info[i].mask);
121 diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
122 index a5b869eb4678..4b100ef4af9f 100644
123 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
124 +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
125 @@ -2939,12 +2939,6 @@ int stmmac_dvr_probe(struct device *device,
126 spin_lock_init(&priv->lock);
127 spin_lock_init(&priv->tx_lock);
128
129 - ret = register_netdev(ndev);
130 - if (ret) {
131 - pr_err("%s: ERROR %i registering the device\n", __func__, ret);
132 - goto error_netdev_register;
133 - }
134 -
135 /* If a specific clk_csr value is passed from the platform
136 * this means that the CSR Clock Range selection cannot be
137 * changed at run-time and it is fixed. Viceversa the driver'll try to
138 @@ -2969,11 +2963,21 @@ int stmmac_dvr_probe(struct device *device,
139 }
140 }
141
142 - return 0;
143 + ret = register_netdev(ndev);
144 + if (ret) {
145 + netdev_err(priv->dev, "%s: ERROR %i registering the device\n",
146 + __func__, ret);
147 + goto error_netdev_register;
148 + }
149 +
150 + return ret;
151
152 -error_mdio_register:
153 - unregister_netdev(ndev);
154 error_netdev_register:
155 + if (priv->pcs != STMMAC_PCS_RGMII &&
156 + priv->pcs != STMMAC_PCS_TBI &&
157 + priv->pcs != STMMAC_PCS_RTBI)
158 + stmmac_mdio_unregister(ndev);
159 +error_mdio_register:
160 netif_napi_del(&priv->napi);
161 error_hw_init:
162 clk_disable_unprepare(priv->pclk);
163 diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
164 index 409b48e1e589..7a601d8c615e 100644
165 --- a/drivers/net/hyperv/netvsc_drv.c
166 +++ b/drivers/net/hyperv/netvsc_drv.c
167 @@ -40,6 +40,8 @@
168
169 #include "hyperv_net.h"
170
171 +/* Restrict GSO size to account for NVGRE */
172 +#define NETVSC_GSO_MAX_SIZE 62768
173
174 #define RING_SIZE_MIN 64
175 static int ring_size = 128;
176 @@ -852,6 +854,7 @@ static int netvsc_set_channels(struct net_device *net,
177 }
178 goto recover;
179 }
180 + netif_set_gso_max_size(net, NETVSC_GSO_MAX_SIZE);
181
182 out:
183 netvsc_open(net);
184 diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
185 index 2fb637ad594a..32b7ec976dcc 100644
186 --- a/drivers/net/usb/r8152.c
187 +++ b/drivers/net/usb/r8152.c
188 @@ -3446,39 +3446,87 @@ static bool delay_autosuspend(struct r8152 *tp)
189 return false;
190 }
191
192 -static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message)
193 +static int rtl8152_rumtime_suspend(struct r8152 *tp)
194 {
195 - struct r8152 *tp = usb_get_intfdata(intf);
196 struct net_device *netdev = tp->netdev;
197 int ret = 0;
198
199 - mutex_lock(&tp->control);
200 + if (netif_running(netdev) && test_bit(WORK_ENABLE, &tp->flags)) {
201 + u32 rcr = 0;
202
203 - if (PMSG_IS_AUTO(message)) {
204 - if (netif_running(netdev) && delay_autosuspend(tp)) {
205 + if (delay_autosuspend(tp)) {
206 ret = -EBUSY;
207 goto out1;
208 }
209
210 - set_bit(SELECTIVE_SUSPEND, &tp->flags);
211 - } else {
212 - netif_device_detach(netdev);
213 + if (netif_carrier_ok(netdev)) {
214 + u32 ocp_data;
215 +
216 + rcr = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
217 + ocp_data = rcr & ~RCR_ACPT_ALL;
218 + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
219 + rxdy_gated_en(tp, true);
220 + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA,
221 + PLA_OOB_CTRL);
222 + if (!(ocp_data & RXFIFO_EMPTY)) {
223 + rxdy_gated_en(tp, false);
224 + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, rcr);
225 + ret = -EBUSY;
226 + goto out1;
227 + }
228 + }
229 +
230 + clear_bit(WORK_ENABLE, &tp->flags);
231 + usb_kill_urb(tp->intr_urb);
232 +
233 + rtl_runtime_suspend_enable(tp, true);
234 +
235 + if (netif_carrier_ok(netdev)) {
236 + napi_disable(&tp->napi);
237 + rtl_stop_rx(tp);
238 + rxdy_gated_en(tp, false);
239 + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, rcr);
240 + napi_enable(&tp->napi);
241 + }
242 }
243
244 + set_bit(SELECTIVE_SUSPEND, &tp->flags);
245 +
246 +out1:
247 + return ret;
248 +}
249 +
250 +static int rtl8152_system_suspend(struct r8152 *tp)
251 +{
252 + struct net_device *netdev = tp->netdev;
253 + int ret = 0;
254 +
255 + netif_device_detach(netdev);
256 +
257 if (netif_running(netdev) && test_bit(WORK_ENABLE, &tp->flags)) {
258 clear_bit(WORK_ENABLE, &tp->flags);
259 usb_kill_urb(tp->intr_urb);
260 napi_disable(&tp->napi);
261 - if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) {
262 - rtl_stop_rx(tp);
263 - rtl_runtime_suspend_enable(tp, true);
264 - } else {
265 - cancel_delayed_work_sync(&tp->schedule);
266 - tp->rtl_ops.down(tp);
267 - }
268 + cancel_delayed_work_sync(&tp->schedule);
269 + tp->rtl_ops.down(tp);
270 napi_enable(&tp->napi);
271 }
272 -out1:
273 +
274 + return ret;
275 +}
276 +
277 +static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message)
278 +{
279 + struct r8152 *tp = usb_get_intfdata(intf);
280 + int ret;
281 +
282 + mutex_lock(&tp->control);
283 +
284 + if (PMSG_IS_AUTO(message))
285 + ret = rtl8152_rumtime_suspend(tp);
286 + else
287 + ret = rtl8152_system_suspend(tp);
288 +
289 mutex_unlock(&tp->control);
290
291 return ret;
292 diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
293 index 903bda437839..d6b619667f1a 100644
294 --- a/drivers/net/vrf.c
295 +++ b/drivers/net/vrf.c
296 @@ -301,7 +301,9 @@ static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb,
297 .flowi4_tos = RT_TOS(ip4h->tos),
298 .flowi4_flags = FLOWI_FLAG_ANYSRC | FLOWI_FLAG_L3MDEV_SRC |
299 FLOWI_FLAG_SKIP_NH_OIF,
300 + .flowi4_proto = ip4h->protocol,
301 .daddr = ip4h->daddr,
302 + .saddr = ip4h->saddr,
303 };
304
305 if (vrf_send_v4_prep(skb, &fl4, vrf_dev))
306 @@ -410,6 +412,8 @@ static int vrf_finish_output6(struct net *net, struct sock *sk,
307 struct in6_addr *nexthop;
308 int ret;
309
310 + nf_reset(skb);
311 +
312 skb->protocol = htons(ETH_P_IPV6);
313 skb->dev = dev;
314
315 @@ -521,6 +525,8 @@ static int vrf_finish_output(struct net *net, struct sock *sk, struct sk_buff *s
316 u32 nexthop;
317 int ret = -EINVAL;
318
319 + nf_reset(skb);
320 +
321 /* Be paranoid, rather than too clever. */
322 if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops)) {
323 struct sk_buff *skb2;
324 @@ -919,6 +925,8 @@ static int vrf_newlink(struct net *src_net, struct net_device *dev,
325 return -EINVAL;
326
327 vrf->tb_id = nla_get_u32(data[IFLA_VRF_TABLE]);
328 + if (vrf->tb_id == RT_TABLE_UNSPEC)
329 + return -EINVAL;
330
331 dev->priv_flags |= IFF_L3MDEV_MASTER;
332
333 diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c
334 index a87cfd4ba17b..61a86d391599 100644
335 --- a/drivers/spi/spi-orion.c
336 +++ b/drivers/spi/spi-orion.c
337 @@ -127,37 +127,62 @@ static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed)
338 tclk_hz = clk_get_rate(orion_spi->clk);
339
340 if (devdata->typ == ARMADA_SPI) {
341 - unsigned int clk, spr, sppr, sppr2, err;
342 - unsigned int best_spr, best_sppr, best_err;
343 -
344 - best_err = speed;
345 - best_spr = 0;
346 - best_sppr = 0;
347 -
348 - /* Iterate over the valid range looking for best fit */
349 - for (sppr = 0; sppr < 8; sppr++) {
350 - sppr2 = 0x1 << sppr;
351 -
352 - spr = tclk_hz / sppr2;
353 - spr = DIV_ROUND_UP(spr, speed);
354 - if ((spr == 0) || (spr > 15))
355 - continue;
356 -
357 - clk = tclk_hz / (spr * sppr2);
358 - err = speed - clk;
359 -
360 - if (err < best_err) {
361 - best_spr = spr;
362 - best_sppr = sppr;
363 - best_err = err;
364 - }
365 - }
366 + /*
367 + * Given the core_clk (tclk_hz) and the target rate (speed) we
368 + * determine the best values for SPR (in [0 .. 15]) and SPPR (in
369 + * [0..7]) such that
370 + *
371 + * core_clk / (SPR * 2 ** SPPR)
372 + *
373 + * is as big as possible but not bigger than speed.
374 + */
375
376 - if ((best_sppr == 0) && (best_spr == 0))
377 - return -EINVAL;
378 + /* best integer divider: */
379 + unsigned divider = DIV_ROUND_UP(tclk_hz, speed);
380 + unsigned spr, sppr;
381 +
382 + if (divider < 16) {
383 + /* This is the easy case, divider is less than 16 */
384 + spr = divider;
385 + sppr = 0;
386 +
387 + } else {
388 + unsigned two_pow_sppr;
389 + /*
390 + * Find the highest bit set in divider. This and the
391 + * three next bits define SPR (apart from rounding).
392 + * SPPR is then the number of zero bits that must be
393 + * appended:
394 + */
395 + sppr = fls(divider) - 4;
396 +
397 + /*
398 + * As SPR only has 4 bits, we have to round divider up
399 + * to the next multiple of 2 ** sppr.
400 + */
401 + two_pow_sppr = 1 << sppr;
402 + divider = (divider + two_pow_sppr - 1) & -two_pow_sppr;
403 +
404 + /*
405 + * recalculate sppr as rounding up divider might have
406 + * increased it enough to change the position of the
407 + * highest set bit. In this case the bit that now
408 + * doesn't make it into SPR is 0, so there is no need to
409 + * round again.
410 + */
411 + sppr = fls(divider) - 4;
412 + spr = divider >> sppr;
413 +
414 + /*
415 + * Now do range checking. SPR is constructed to have a
416 + * width of 4 bits, so this is fine for sure. So we
417 + * still need to check for sppr to fit into 3 bits:
418 + */
419 + if (sppr > 7)
420 + return -EINVAL;
421 + }
422
423 - prescale = ((best_sppr & 0x6) << 5) |
424 - ((best_sppr & 0x1) << 4) | best_spr;
425 + prescale = ((sppr & 0x6) << 5) | ((sppr & 0x1) << 4) | spr;
426 } else {
427 /*
428 * the supported rates are: 4,6,8...30
429 diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
430 index 9d6025703f73..93a6a2c66d15 100644
431 --- a/include/linux/netdevice.h
432 +++ b/include/linux/netdevice.h
433 @@ -2325,14 +2325,19 @@ static inline int skb_gro_header_hard(struct sk_buff *skb, unsigned int hlen)
434 return NAPI_GRO_CB(skb)->frag0_len < hlen;
435 }
436
437 +static inline void skb_gro_frag0_invalidate(struct sk_buff *skb)
438 +{
439 + NAPI_GRO_CB(skb)->frag0 = NULL;
440 + NAPI_GRO_CB(skb)->frag0_len = 0;
441 +}
442 +
443 static inline void *skb_gro_header_slow(struct sk_buff *skb, unsigned int hlen,
444 unsigned int offset)
445 {
446 if (!pskb_may_pull(skb, hlen))
447 return NULL;
448
449 - NAPI_GRO_CB(skb)->frag0 = NULL;
450 - NAPI_GRO_CB(skb)->frag0_len = 0;
451 + skb_gro_frag0_invalidate(skb);
452 return skb->data + offset;
453 }
454
455 diff --git a/mm/page_alloc.c b/mm/page_alloc.c
456 index 2bcdfbf8c36d..6a117213feb8 100644
457 --- a/mm/page_alloc.c
458 +++ b/mm/page_alloc.c
459 @@ -5696,15 +5696,18 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn)
460 sizeof(arch_zone_lowest_possible_pfn));
461 memset(arch_zone_highest_possible_pfn, 0,
462 sizeof(arch_zone_highest_possible_pfn));
463 - arch_zone_lowest_possible_pfn[0] = find_min_pfn_with_active_regions();
464 - arch_zone_highest_possible_pfn[0] = max_zone_pfn[0];
465 - for (i = 1; i < MAX_NR_ZONES; i++) {
466 +
467 + start_pfn = find_min_pfn_with_active_regions();
468 +
469 + for (i = 0; i < MAX_NR_ZONES; i++) {
470 if (i == ZONE_MOVABLE)
471 continue;
472 - arch_zone_lowest_possible_pfn[i] =
473 - arch_zone_highest_possible_pfn[i-1];
474 - arch_zone_highest_possible_pfn[i] =
475 - max(max_zone_pfn[i], arch_zone_lowest_possible_pfn[i]);
476 +
477 + end_pfn = max(max_zone_pfn[i], start_pfn);
478 + arch_zone_lowest_possible_pfn[i] = start_pfn;
479 + arch_zone_highest_possible_pfn[i] = end_pfn;
480 +
481 + start_pfn = end_pfn;
482 }
483 arch_zone_lowest_possible_pfn[ZONE_MOVABLE] = 0;
484 arch_zone_highest_possible_pfn[ZONE_MOVABLE] = 0;
485 diff --git a/net/core/dev.c b/net/core/dev.c
486 index 9ca749c81b6c..6f203c7fb166 100644
487 --- a/net/core/dev.c
488 +++ b/net/core/dev.c
489 @@ -4187,7 +4187,9 @@ static void skb_gro_reset_offset(struct sk_buff *skb)
490 pinfo->nr_frags &&
491 !PageHighMem(skb_frag_page(frag0))) {
492 NAPI_GRO_CB(skb)->frag0 = skb_frag_address(frag0);
493 - NAPI_GRO_CB(skb)->frag0_len = skb_frag_size(frag0);
494 + NAPI_GRO_CB(skb)->frag0_len = min_t(unsigned int,
495 + skb_frag_size(frag0),
496 + skb->end - skb->tail);
497 }
498 }
499
500 diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
501 index 252e155c837b..a2270188b864 100644
502 --- a/net/core/drop_monitor.c
503 +++ b/net/core/drop_monitor.c
504 @@ -80,6 +80,7 @@ static struct sk_buff *reset_per_cpu_data(struct per_cpu_dm_data *data)
505 struct nlattr *nla;
506 struct sk_buff *skb;
507 unsigned long flags;
508 + void *msg_header;
509
510 al = sizeof(struct net_dm_alert_msg);
511 al += dm_hit_limit * sizeof(struct net_dm_drop_point);
512 @@ -87,21 +88,41 @@ static struct sk_buff *reset_per_cpu_data(struct per_cpu_dm_data *data)
513
514 skb = genlmsg_new(al, GFP_KERNEL);
515
516 - if (skb) {
517 - genlmsg_put(skb, 0, 0, &net_drop_monitor_family,
518 - 0, NET_DM_CMD_ALERT);
519 - nla = nla_reserve(skb, NLA_UNSPEC,
520 - sizeof(struct net_dm_alert_msg));
521 - msg = nla_data(nla);
522 - memset(msg, 0, al);
523 - } else {
524 - mod_timer(&data->send_timer, jiffies + HZ / 10);
525 + if (!skb)
526 + goto err;
527 +
528 + msg_header = genlmsg_put(skb, 0, 0, &net_drop_monitor_family,
529 + 0, NET_DM_CMD_ALERT);
530 + if (!msg_header) {
531 + nlmsg_free(skb);
532 + skb = NULL;
533 + goto err;
534 + }
535 + nla = nla_reserve(skb, NLA_UNSPEC,
536 + sizeof(struct net_dm_alert_msg));
537 + if (!nla) {
538 + nlmsg_free(skb);
539 + skb = NULL;
540 + goto err;
541 }
542 + msg = nla_data(nla);
543 + memset(msg, 0, al);
544 + goto out;
545
546 +err:
547 + mod_timer(&data->send_timer, jiffies + HZ / 10);
548 +out:
549 spin_lock_irqsave(&data->lock, flags);
550 swap(data->skb, skb);
551 spin_unlock_irqrestore(&data->lock, flags);
552
553 + if (skb) {
554 + struct nlmsghdr *nlh = (struct nlmsghdr *)skb->data;
555 + struct genlmsghdr *gnlh = (struct genlmsghdr *)nlmsg_data(nlh);
556 +
557 + genlmsg_end(skb, genlmsg_data(gnlh));
558 + }
559 +
560 return skb;
561 }
562
563 diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
564 index 63566ec54794..4e60dae86df5 100644
565 --- a/net/ipv4/fib_frontend.c
566 +++ b/net/ipv4/fib_frontend.c
567 @@ -85,7 +85,7 @@ struct fib_table *fib_new_table(struct net *net, u32 id)
568 if (tb)
569 return tb;
570
571 - if (id == RT_TABLE_LOCAL)
572 + if (id == RT_TABLE_LOCAL && !net->ipv4.fib_has_custom_rules)
573 alias = fib_new_table(net, RT_TABLE_MAIN);
574
575 tb = fib_trie_table(id, alias);
576 diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
577 index ffe95d954007..840b450aab46 100644
578 --- a/net/ipv4/fib_semantics.c
579 +++ b/net/ipv4/fib_semantics.c
580 @@ -1588,8 +1588,13 @@ void fib_select_multipath(struct fib_result *res, int hash)
581 void fib_select_path(struct net *net, struct fib_result *res,
582 struct flowi4 *fl4, int mp_hash)
583 {
584 + bool oif_check;
585 +
586 + oif_check = (fl4->flowi4_oif == 0 ||
587 + fl4->flowi4_flags & FLOWI_FLAG_SKIP_NH_OIF);
588 +
589 #ifdef CONFIG_IP_ROUTE_MULTIPATH
590 - if (res->fi->fib_nhs > 1 && fl4->flowi4_oif == 0) {
591 + if (res->fi->fib_nhs > 1 && oif_check) {
592 if (mp_hash < 0)
593 mp_hash = get_hash_from_flowi4(fl4) >> 1;
594
595 @@ -1599,7 +1604,7 @@ void fib_select_path(struct net *net, struct fib_result *res,
596 #endif
597 if (!res->prefixlen &&
598 res->table->tb_num_default > 1 &&
599 - res->type == RTN_UNICAST && !fl4->flowi4_oif)
600 + res->type == RTN_UNICAST && oif_check)
601 fib_select_default(fl4, res);
602
603 if (!fl4->saddr)
604 diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
605 index b3086cf27027..17adfdaf5795 100644
606 --- a/net/ipv4/igmp.c
607 +++ b/net/ipv4/igmp.c
608 @@ -225,9 +225,14 @@ static void igmp_start_timer(struct ip_mc_list *im, int max_delay)
609 static void igmp_gq_start_timer(struct in_device *in_dev)
610 {
611 int tv = prandom_u32() % in_dev->mr_maxdelay;
612 + unsigned long exp = jiffies + tv + 2;
613 +
614 + if (in_dev->mr_gq_running &&
615 + time_after_eq(exp, (in_dev->mr_gq_timer).expires))
616 + return;
617
618 in_dev->mr_gq_running = 1;
619 - if (!mod_timer(&in_dev->mr_gq_timer, jiffies+tv+2))
620 + if (!mod_timer(&in_dev->mr_gq_timer, exp))
621 in_dev_hold(in_dev);
622 }
623
624 diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c
625 index efe6268b8bc3..225f5f7f26ba 100644
626 --- a/net/ipv6/ip6_offload.c
627 +++ b/net/ipv6/ip6_offload.c
628 @@ -196,6 +196,7 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,
629 ops = rcu_dereference(inet6_offloads[proto]);
630 if (!ops || !ops->callbacks.gro_receive) {
631 __pskb_pull(skb, skb_gro_offset(skb));
632 + skb_gro_frag0_invalidate(skb);
633 proto = ipv6_gso_pull_exthdrs(skb, proto);
634 skb_gro_pull(skb, -skb_transport_offset(skb));
635 skb_reset_transport_header(skb);
636 diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
637 index 99140986e887..8bca90d6d915 100644
638 --- a/net/ipv6/raw.c
639 +++ b/net/ipv6/raw.c
640 @@ -589,7 +589,11 @@ static int rawv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
641 }
642
643 offset += skb_transport_offset(skb);
644 - BUG_ON(skb_copy_bits(skb, offset, &csum, 2));
645 + err = skb_copy_bits(skb, offset, &csum, 2);
646 + if (err < 0) {
647 + ip6_flush_pending_frames(sk);
648 + goto out;
649 + }
650
651 /* in case cksum was not initialized */
652 if (unlikely(csum))
653 diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
654 index ecc1904e454f..20b2f867c5a1 100644
655 --- a/net/sched/cls_api.c
656 +++ b/net/sched/cls_api.c
657 @@ -137,13 +137,15 @@ static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n)
658 unsigned long cl;
659 unsigned long fh;
660 int err;
661 - int tp_created = 0;
662 + int tp_created;
663
664 if ((n->nlmsg_type != RTM_GETTFILTER) &&
665 !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN))
666 return -EPERM;
667
668 replay:
669 + tp_created = 0;
670 +
671 err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, NULL);
672 if (err < 0)
673 return err;
674 diff --git a/sound/firewire/tascam/tascam-stream.c b/sound/firewire/tascam/tascam-stream.c
675 index 0e6dd5c61f53..e4c306398b35 100644
676 --- a/sound/firewire/tascam/tascam-stream.c
677 +++ b/sound/firewire/tascam/tascam-stream.c
678 @@ -343,7 +343,7 @@ int snd_tscm_stream_init_duplex(struct snd_tscm *tscm)
679 if (err < 0)
680 amdtp_stream_destroy(&tscm->rx_stream);
681
682 - return 0;
683 + return err;
684 }
685
686 /* At bus reset, streaming is stopped and some registers are clear. */
687 diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
688 index 3039e907f1f8..29f38e2b4ca9 100644
689 --- a/sound/usb/quirks.c
690 +++ b/sound/usb/quirks.c
691 @@ -1136,6 +1136,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)
692 case USB_ID(0x045E, 0x076F): /* MS Lifecam HD-6000 */
693 case USB_ID(0x045E, 0x0772): /* MS Lifecam Studio */
694 case USB_ID(0x045E, 0x0779): /* MS Lifecam HD-3000 */
695 + case USB_ID(0x047F, 0x02F7): /* Plantronics BT-600 */
696 case USB_ID(0x047F, 0x0415): /* Plantronics BT-300 */
697 case USB_ID(0x047F, 0xAA05): /* Plantronics DA45 */
698 case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */