Contents of /trunk/kernel-alx/patches-4.4/0142-4.4.43-all-fixes.patch
Parent Directory | Revision Log
Revision 2878 -
(show annotations)
(download)
Mon Mar 27 13:49:18 2017 UTC (7 years, 6 months ago) by niro
File size: 21636 byte(s)
Mon Mar 27 13:49:18 2017 UTC (7 years, 6 months 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 */ |