Contents of /trunk/kernel-alx/patches-4.9/0185-4.9.86-all-fixes.patch
Parent Directory | Revision Log
Revision 3205 -
(show annotations)
(download)
Wed Aug 8 14:26:12 2018 UTC (6 years, 1 month ago) by niro
File size: 56585 byte(s)
Wed Aug 8 14:26:12 2018 UTC (6 years, 1 month ago) by niro
File size: 56585 byte(s)
-linux-4.9.86
1 | diff --git a/Makefile b/Makefile |
2 | index 77deaa395d69..e918d25e95bb 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 85 |
9 | +SUBLEVEL = 86 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/arch/arm/boot/dts/ls1021a-qds.dts b/arch/arm/boot/dts/ls1021a-qds.dts |
14 | index 940875316d0f..67b4de0e3439 100644 |
15 | --- a/arch/arm/boot/dts/ls1021a-qds.dts |
16 | +++ b/arch/arm/boot/dts/ls1021a-qds.dts |
17 | @@ -215,7 +215,7 @@ |
18 | reg = <0x2a>; |
19 | VDDA-supply = <®_3p3v>; |
20 | VDDIO-supply = <®_3p3v>; |
21 | - clocks = <&sys_mclk 1>; |
22 | + clocks = <&sys_mclk>; |
23 | }; |
24 | }; |
25 | }; |
26 | diff --git a/arch/arm/boot/dts/ls1021a-twr.dts b/arch/arm/boot/dts/ls1021a-twr.dts |
27 | index a8b148ad1dd2..44715c8ef756 100644 |
28 | --- a/arch/arm/boot/dts/ls1021a-twr.dts |
29 | +++ b/arch/arm/boot/dts/ls1021a-twr.dts |
30 | @@ -187,7 +187,7 @@ |
31 | reg = <0x0a>; |
32 | VDDA-supply = <®_3p3v>; |
33 | VDDIO-supply = <®_3p3v>; |
34 | - clocks = <&sys_mclk 1>; |
35 | + clocks = <&sys_mclk>; |
36 | }; |
37 | }; |
38 | |
39 | diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c |
40 | index 2a35c1963f6d..7f868d9bb5ed 100644 |
41 | --- a/arch/arm/kvm/mmu.c |
42 | +++ b/arch/arm/kvm/mmu.c |
43 | @@ -1284,7 +1284,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, |
44 | return -EFAULT; |
45 | } |
46 | |
47 | - if (vma_kernel_pagesize(vma) && !logging_active) { |
48 | + if (vma_kernel_pagesize(vma) == PMD_SIZE && !logging_active) { |
49 | hugetlb = true; |
50 | gfn = (fault_ipa & PMD_MASK) >> PAGE_SHIFT; |
51 | } else { |
52 | diff --git a/arch/arm/lib/csumpartialcopyuser.S b/arch/arm/lib/csumpartialcopyuser.S |
53 | index 1712f132b80d..b83fdc06286a 100644 |
54 | --- a/arch/arm/lib/csumpartialcopyuser.S |
55 | +++ b/arch/arm/lib/csumpartialcopyuser.S |
56 | @@ -85,7 +85,11 @@ |
57 | .pushsection .text.fixup,"ax" |
58 | .align 4 |
59 | 9001: mov r4, #-EFAULT |
60 | +#ifdef CONFIG_CPU_SW_DOMAIN_PAN |
61 | + ldr r5, [sp, #9*4] @ *err_ptr |
62 | +#else |
63 | ldr r5, [sp, #8*4] @ *err_ptr |
64 | +#endif |
65 | str r4, [r5] |
66 | ldmia sp, {r1, r2} @ retrieve dst, len |
67 | add r2, r2, r1 |
68 | diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile |
69 | index 0344e575f522..fba4ca56e46a 100644 |
70 | --- a/arch/mips/lib/Makefile |
71 | +++ b/arch/mips/lib/Makefile |
72 | @@ -15,4 +15,5 @@ obj-$(CONFIG_CPU_R3000) += r3k_dump_tlb.o |
73 | obj-$(CONFIG_CPU_TX39XX) += r3k_dump_tlb.o |
74 | |
75 | # libgcc-style stuff needed in the kernel |
76 | -obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o ucmpdi2.o |
77 | +obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o multi3.o \ |
78 | + ucmpdi2.o |
79 | diff --git a/arch/mips/lib/libgcc.h b/arch/mips/lib/libgcc.h |
80 | index 05909d58e2fe..56ea0df60a44 100644 |
81 | --- a/arch/mips/lib/libgcc.h |
82 | +++ b/arch/mips/lib/libgcc.h |
83 | @@ -9,10 +9,18 @@ typedef int word_type __attribute__ ((mode (__word__))); |
84 | struct DWstruct { |
85 | int high, low; |
86 | }; |
87 | + |
88 | +struct TWstruct { |
89 | + long long high, low; |
90 | +}; |
91 | #elif defined(__LITTLE_ENDIAN) |
92 | struct DWstruct { |
93 | int low, high; |
94 | }; |
95 | + |
96 | +struct TWstruct { |
97 | + long long low, high; |
98 | +}; |
99 | #else |
100 | #error I feel sick. |
101 | #endif |
102 | @@ -22,4 +30,13 @@ typedef union { |
103 | long long ll; |
104 | } DWunion; |
105 | |
106 | +#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6) |
107 | +typedef int ti_type __attribute__((mode(TI))); |
108 | + |
109 | +typedef union { |
110 | + struct TWstruct s; |
111 | + ti_type ti; |
112 | +} TWunion; |
113 | +#endif |
114 | + |
115 | #endif /* __ASM_LIBGCC_H */ |
116 | diff --git a/arch/mips/lib/multi3.c b/arch/mips/lib/multi3.c |
117 | new file mode 100644 |
118 | index 000000000000..111ad475aa0c |
119 | --- /dev/null |
120 | +++ b/arch/mips/lib/multi3.c |
121 | @@ -0,0 +1,54 @@ |
122 | +// SPDX-License-Identifier: GPL-2.0 |
123 | +#include <linux/export.h> |
124 | + |
125 | +#include "libgcc.h" |
126 | + |
127 | +/* |
128 | + * GCC 7 suboptimally generates __multi3 calls for mips64r6, so for that |
129 | + * specific case only we'll implement it here. |
130 | + * |
131 | + * See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82981 |
132 | + */ |
133 | +#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPSR6) && (__GNUC__ == 7) |
134 | + |
135 | +/* multiply 64-bit values, low 64-bits returned */ |
136 | +static inline long long notrace dmulu(long long a, long long b) |
137 | +{ |
138 | + long long res; |
139 | + |
140 | + asm ("dmulu %0,%1,%2" : "=r" (res) : "r" (a), "r" (b)); |
141 | + return res; |
142 | +} |
143 | + |
144 | +/* multiply 64-bit unsigned values, high 64-bits of 128-bit result returned */ |
145 | +static inline long long notrace dmuhu(long long a, long long b) |
146 | +{ |
147 | + long long res; |
148 | + |
149 | + asm ("dmuhu %0,%1,%2" : "=r" (res) : "r" (a), "r" (b)); |
150 | + return res; |
151 | +} |
152 | + |
153 | +/* multiply 128-bit values, low 128-bits returned */ |
154 | +ti_type notrace __multi3(ti_type a, ti_type b) |
155 | +{ |
156 | + TWunion res, aa, bb; |
157 | + |
158 | + aa.ti = a; |
159 | + bb.ti = b; |
160 | + |
161 | + /* |
162 | + * a * b = (a.lo * b.lo) |
163 | + * + 2^64 * (a.hi * b.lo + a.lo * b.hi) |
164 | + * [+ 2^128 * (a.hi * b.hi)] |
165 | + */ |
166 | + res.s.low = dmulu(aa.s.low, bb.s.low); |
167 | + res.s.high = dmuhu(aa.s.low, bb.s.low); |
168 | + res.s.high += dmulu(aa.s.high, bb.s.low); |
169 | + res.s.high += dmulu(aa.s.low, bb.s.high); |
170 | + |
171 | + return res.ti; |
172 | +} |
173 | +EXPORT_SYMBOL(__multi3); |
174 | + |
175 | +#endif /* 64BIT && CPU_MIPSR6 && GCC7 */ |
176 | diff --git a/arch/sh/boards/mach-se/770x/setup.c b/arch/sh/boards/mach-se/770x/setup.c |
177 | index 658326f44df8..5e0267624d8d 100644 |
178 | --- a/arch/sh/boards/mach-se/770x/setup.c |
179 | +++ b/arch/sh/boards/mach-se/770x/setup.c |
180 | @@ -8,6 +8,7 @@ |
181 | */ |
182 | #include <linux/init.h> |
183 | #include <linux/platform_device.h> |
184 | +#include <linux/sh_eth.h> |
185 | #include <mach-se/mach/se.h> |
186 | #include <mach-se/mach/mrshpc.h> |
187 | #include <asm/machvec.h> |
188 | @@ -114,6 +115,11 @@ static struct platform_device heartbeat_device = { |
189 | #if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\ |
190 | defined(CONFIG_CPU_SUBTYPE_SH7712) |
191 | /* SH771X Ethernet driver */ |
192 | +static struct sh_eth_plat_data sh_eth_plat = { |
193 | + .phy = PHY_ID, |
194 | + .phy_interface = PHY_INTERFACE_MODE_MII, |
195 | +}; |
196 | + |
197 | static struct resource sh_eth0_resources[] = { |
198 | [0] = { |
199 | .start = SH_ETH0_BASE, |
200 | @@ -131,7 +137,7 @@ static struct platform_device sh_eth0_device = { |
201 | .name = "sh771x-ether", |
202 | .id = 0, |
203 | .dev = { |
204 | - .platform_data = PHY_ID, |
205 | + .platform_data = &sh_eth_plat, |
206 | }, |
207 | .num_resources = ARRAY_SIZE(sh_eth0_resources), |
208 | .resource = sh_eth0_resources, |
209 | @@ -154,7 +160,7 @@ static struct platform_device sh_eth1_device = { |
210 | .name = "sh771x-ether", |
211 | .id = 1, |
212 | .dev = { |
213 | - .platform_data = PHY_ID, |
214 | + .platform_data = &sh_eth_plat, |
215 | }, |
216 | .num_resources = ARRAY_SIZE(sh_eth1_resources), |
217 | .resource = sh_eth1_resources, |
218 | diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h |
219 | index 7bb29a416b77..f35f246a26bf 100644 |
220 | --- a/arch/x86/include/asm/asm.h |
221 | +++ b/arch/x86/include/asm/asm.h |
222 | @@ -128,6 +128,7 @@ |
223 | #endif |
224 | |
225 | #ifndef __ASSEMBLY__ |
226 | +#ifndef __BPF__ |
227 | /* |
228 | * This output constraint should be used for any inline asm which has a "call" |
229 | * instruction. Otherwise the asm may be inserted before the frame pointer |
230 | @@ -137,5 +138,6 @@ |
231 | register unsigned long current_stack_pointer asm(_ASM_SP); |
232 | #define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer) |
233 | #endif |
234 | +#endif |
235 | |
236 | #endif /* _ASM_X86_ASM_H */ |
237 | diff --git a/drivers/dma/fsl-edma.c b/drivers/dma/fsl-edma.c |
238 | index 6775f2c74e25..c7568869284e 100644 |
239 | --- a/drivers/dma/fsl-edma.c |
240 | +++ b/drivers/dma/fsl-edma.c |
241 | @@ -863,11 +863,11 @@ static void fsl_edma_irq_exit( |
242 | } |
243 | } |
244 | |
245 | -static void fsl_disable_clocks(struct fsl_edma_engine *fsl_edma) |
246 | +static void fsl_disable_clocks(struct fsl_edma_engine *fsl_edma, int nr_clocks) |
247 | { |
248 | int i; |
249 | |
250 | - for (i = 0; i < DMAMUX_NR; i++) |
251 | + for (i = 0; i < nr_clocks; i++) |
252 | clk_disable_unprepare(fsl_edma->muxclk[i]); |
253 | } |
254 | |
255 | @@ -904,25 +904,25 @@ static int fsl_edma_probe(struct platform_device *pdev) |
256 | |
257 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1 + i); |
258 | fsl_edma->muxbase[i] = devm_ioremap_resource(&pdev->dev, res); |
259 | - if (IS_ERR(fsl_edma->muxbase[i])) |
260 | + if (IS_ERR(fsl_edma->muxbase[i])) { |
261 | + /* on error: disable all previously enabled clks */ |
262 | + fsl_disable_clocks(fsl_edma, i); |
263 | return PTR_ERR(fsl_edma->muxbase[i]); |
264 | + } |
265 | |
266 | sprintf(clkname, "dmamux%d", i); |
267 | fsl_edma->muxclk[i] = devm_clk_get(&pdev->dev, clkname); |
268 | if (IS_ERR(fsl_edma->muxclk[i])) { |
269 | dev_err(&pdev->dev, "Missing DMAMUX block clock.\n"); |
270 | + /* on error: disable all previously enabled clks */ |
271 | + fsl_disable_clocks(fsl_edma, i); |
272 | return PTR_ERR(fsl_edma->muxclk[i]); |
273 | } |
274 | |
275 | ret = clk_prepare_enable(fsl_edma->muxclk[i]); |
276 | - if (ret) { |
277 | - /* disable only clks which were enabled on error */ |
278 | - for (; i >= 0; i--) |
279 | - clk_disable_unprepare(fsl_edma->muxclk[i]); |
280 | - |
281 | - dev_err(&pdev->dev, "DMAMUX clk block failed.\n"); |
282 | - return ret; |
283 | - } |
284 | + if (ret) |
285 | + /* on error: disable all previously enabled clks */ |
286 | + fsl_disable_clocks(fsl_edma, i); |
287 | |
288 | } |
289 | |
290 | @@ -976,7 +976,7 @@ static int fsl_edma_probe(struct platform_device *pdev) |
291 | if (ret) { |
292 | dev_err(&pdev->dev, |
293 | "Can't register Freescale eDMA engine. (%d)\n", ret); |
294 | - fsl_disable_clocks(fsl_edma); |
295 | + fsl_disable_clocks(fsl_edma, DMAMUX_NR); |
296 | return ret; |
297 | } |
298 | |
299 | @@ -985,7 +985,7 @@ static int fsl_edma_probe(struct platform_device *pdev) |
300 | dev_err(&pdev->dev, |
301 | "Can't register Freescale eDMA of_dma. (%d)\n", ret); |
302 | dma_async_device_unregister(&fsl_edma->dma_dev); |
303 | - fsl_disable_clocks(fsl_edma); |
304 | + fsl_disable_clocks(fsl_edma, DMAMUX_NR); |
305 | return ret; |
306 | } |
307 | |
308 | @@ -1015,7 +1015,7 @@ static int fsl_edma_remove(struct platform_device *pdev) |
309 | fsl_edma_cleanup_vchan(&fsl_edma->dma_dev); |
310 | of_dma_controller_free(np); |
311 | dma_async_device_unregister(&fsl_edma->dma_dev); |
312 | - fsl_disable_clocks(fsl_edma); |
313 | + fsl_disable_clocks(fsl_edma, DMAMUX_NR); |
314 | |
315 | return 0; |
316 | } |
317 | diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c |
318 | index a4cb82495cee..245c946ea661 100644 |
319 | --- a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c |
320 | +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c |
321 | @@ -136,6 +136,13 @@ nvkm_pci_init(struct nvkm_subdev *subdev) |
322 | return ret; |
323 | |
324 | pci->irq = pdev->irq; |
325 | + |
326 | + /* Ensure MSI interrupts are armed, for the case where there are |
327 | + * already interrupts pending (for whatever reason) at load time. |
328 | + */ |
329 | + if (pci->msi) |
330 | + pci->func->msi_rearm(pci); |
331 | + |
332 | return ret; |
333 | } |
334 | |
335 | diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c |
336 | index ddd6badd0eee..c756b2b7f5dc 100644 |
337 | --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c |
338 | +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c |
339 | @@ -818,6 +818,8 @@ int ttm_page_alloc_init(struct ttm_mem_global *glob, unsigned max_pages) |
340 | pr_info("Initializing pool allocator\n"); |
341 | |
342 | _manager = kzalloc(sizeof(*_manager), GFP_KERNEL); |
343 | + if (!_manager) |
344 | + return -ENOMEM; |
345 | |
346 | ttm_page_pool_init_locked(&_manager->wc_pool, GFP_HIGHUSER, "wc"); |
347 | |
348 | diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c |
349 | index 809f4d4e93a0..340e037b3224 100644 |
350 | --- a/drivers/i2c/busses/i2c-designware-core.c |
351 | +++ b/drivers/i2c/busses/i2c-designware-core.c |
352 | @@ -507,7 +507,7 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev) |
353 | i2c_dw_disable_int(dev); |
354 | |
355 | /* Enable the adapter */ |
356 | - __i2c_dw_enable(dev, true); |
357 | + __i2c_dw_enable_and_wait(dev, true); |
358 | |
359 | /* Clear and enable interrupts */ |
360 | dw_readl(dev, DW_IC_CLR_INTR); |
361 | diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/mr.c |
362 | index 5d73989d9771..ae41623e0f13 100644 |
363 | --- a/drivers/infiniband/hw/mlx4/mr.c |
364 | +++ b/drivers/infiniband/hw/mlx4/mr.c |
365 | @@ -406,7 +406,6 @@ struct ib_mr *mlx4_ib_alloc_mr(struct ib_pd *pd, |
366 | goto err_free_mr; |
367 | |
368 | mr->max_pages = max_num_sg; |
369 | - |
370 | err = mlx4_mr_enable(dev->dev, &mr->mmr); |
371 | if (err) |
372 | goto err_free_pl; |
373 | @@ -417,6 +416,7 @@ struct ib_mr *mlx4_ib_alloc_mr(struct ib_pd *pd, |
374 | return &mr->ibmr; |
375 | |
376 | err_free_pl: |
377 | + mr->ibmr.device = pd->device; |
378 | mlx4_free_priv_pages(mr); |
379 | err_free_mr: |
380 | (void) mlx4_mr_free(dev->dev, &mr->mmr); |
381 | diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c |
382 | index 0a260a06876d..c7d5786d366b 100644 |
383 | --- a/drivers/infiniband/hw/mlx5/mr.c |
384 | +++ b/drivers/infiniband/hw/mlx5/mr.c |
385 | @@ -1648,6 +1648,7 @@ struct ib_mr *mlx5_ib_alloc_mr(struct ib_pd *pd, |
386 | MLX5_SET(mkc, mkc, access_mode, mr->access_mode); |
387 | MLX5_SET(mkc, mkc, umr_en, 1); |
388 | |
389 | + mr->ibmr.device = pd->device; |
390 | err = mlx5_core_create_mkey(dev->mdev, &mr->mmkey, in, inlen); |
391 | if (err) |
392 | goto err_destroy_psv; |
393 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c |
394 | index 183db0cd849e..e37e918cb935 100644 |
395 | --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c |
396 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c |
397 | @@ -919,8 +919,8 @@ static int path_rec_start(struct net_device *dev, |
398 | return 0; |
399 | } |
400 | |
401 | -static void neigh_add_path(struct sk_buff *skb, u8 *daddr, |
402 | - struct net_device *dev) |
403 | +static struct ipoib_neigh *neigh_add_path(struct sk_buff *skb, u8 *daddr, |
404 | + struct net_device *dev) |
405 | { |
406 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
407 | struct ipoib_path *path; |
408 | @@ -933,7 +933,15 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr, |
409 | spin_unlock_irqrestore(&priv->lock, flags); |
410 | ++dev->stats.tx_dropped; |
411 | dev_kfree_skb_any(skb); |
412 | - return; |
413 | + return NULL; |
414 | + } |
415 | + |
416 | + /* To avoid race condition, make sure that the |
417 | + * neigh will be added only once. |
418 | + */ |
419 | + if (unlikely(!list_empty(&neigh->list))) { |
420 | + spin_unlock_irqrestore(&priv->lock, flags); |
421 | + return neigh; |
422 | } |
423 | |
424 | path = __path_find(dev, daddr + 4); |
425 | @@ -971,7 +979,7 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr, |
426 | spin_unlock_irqrestore(&priv->lock, flags); |
427 | ipoib_send(dev, skb, path->ah, IPOIB_QPN(daddr)); |
428 | ipoib_neigh_put(neigh); |
429 | - return; |
430 | + return NULL; |
431 | } |
432 | } else { |
433 | neigh->ah = NULL; |
434 | @@ -988,7 +996,7 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr, |
435 | |
436 | spin_unlock_irqrestore(&priv->lock, flags); |
437 | ipoib_neigh_put(neigh); |
438 | - return; |
439 | + return NULL; |
440 | |
441 | err_path: |
442 | ipoib_neigh_free(neigh); |
443 | @@ -998,6 +1006,8 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr, |
444 | |
445 | spin_unlock_irqrestore(&priv->lock, flags); |
446 | ipoib_neigh_put(neigh); |
447 | + |
448 | + return NULL; |
449 | } |
450 | |
451 | static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev, |
452 | @@ -1103,8 +1113,9 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) |
453 | case htons(ETH_P_TIPC): |
454 | neigh = ipoib_neigh_get(dev, phdr->hwaddr); |
455 | if (unlikely(!neigh)) { |
456 | - neigh_add_path(skb, phdr->hwaddr, dev); |
457 | - return NETDEV_TX_OK; |
458 | + neigh = neigh_add_path(skb, phdr->hwaddr, dev); |
459 | + if (likely(!neigh)) |
460 | + return NETDEV_TX_OK; |
461 | } |
462 | break; |
463 | case htons(ETH_P_ARP): |
464 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c |
465 | index fddff403d5d2..6b6826f3e446 100644 |
466 | --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c |
467 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c |
468 | @@ -818,7 +818,10 @@ void ipoib_mcast_send(struct net_device *dev, u8 *daddr, struct sk_buff *skb) |
469 | spin_lock_irqsave(&priv->lock, flags); |
470 | if (!neigh) { |
471 | neigh = ipoib_neigh_alloc(daddr, dev); |
472 | - if (neigh) { |
473 | + /* Make sure that the neigh will be added only |
474 | + * once to mcast list. |
475 | + */ |
476 | + if (neigh && list_empty(&neigh->list)) { |
477 | kref_get(&mcast->ah->ref); |
478 | neigh->ah = mcast->ah; |
479 | list_add_tail(&neigh->list, &mcast->neigh_list); |
480 | diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c |
481 | index 3bce44893021..d70d4a5273b8 100644 |
482 | --- a/drivers/leds/led-core.c |
483 | +++ b/drivers/leds/led-core.c |
484 | @@ -186,7 +186,7 @@ void led_blink_set(struct led_classdev *led_cdev, |
485 | unsigned long *delay_on, |
486 | unsigned long *delay_off) |
487 | { |
488 | - del_timer_sync(&led_cdev->blink_timer); |
489 | + led_stop_software_blink(led_cdev); |
490 | |
491 | led_cdev->flags &= ~LED_BLINK_ONESHOT; |
492 | led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP; |
493 | diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c |
494 | index 1a4a790054e4..ef9a6b22c9fa 100644 |
495 | --- a/drivers/mtd/nand/brcmnand/brcmnand.c |
496 | +++ b/drivers/mtd/nand/brcmnand/brcmnand.c |
497 | @@ -1763,7 +1763,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip, |
498 | err = brcmstb_nand_verify_erased_page(mtd, chip, buf, |
499 | addr); |
500 | /* erased page bitflips corrected */ |
501 | - if (err > 0) |
502 | + if (err >= 0) |
503 | return err; |
504 | } |
505 | |
506 | diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c |
507 | index 6c062b8251d2..427039b77668 100644 |
508 | --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c |
509 | +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c |
510 | @@ -1059,9 +1059,6 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, |
511 | return ret; |
512 | } |
513 | |
514 | - /* handle the block mark swapping */ |
515 | - block_mark_swapping(this, payload_virt, auxiliary_virt); |
516 | - |
517 | /* Loop over status bytes, accumulating ECC status. */ |
518 | status = auxiliary_virt + nfc_geo->auxiliary_status_offset; |
519 | |
520 | @@ -1150,6 +1147,9 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, |
521 | max_bitflips = max_t(unsigned int, max_bitflips, *status); |
522 | } |
523 | |
524 | + /* handle the block mark swapping */ |
525 | + block_mark_swapping(this, buf, auxiliary_virt); |
526 | + |
527 | if (oob_required) { |
528 | /* |
529 | * It's time to deliver the OOB bytes. See gpmi_ecc_read_oob() |
530 | diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c |
531 | index 16f7cadda5c3..47f43bdecd51 100644 |
532 | --- a/drivers/net/can/flexcan.c |
533 | +++ b/drivers/net/can/flexcan.c |
534 | @@ -493,7 +493,7 @@ static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev) |
535 | data = be32_to_cpup((__be32 *)&cf->data[0]); |
536 | flexcan_write(data, ®s->mb[FLEXCAN_TX_BUF_ID].data[0]); |
537 | } |
538 | - if (cf->can_dlc > 3) { |
539 | + if (cf->can_dlc > 4) { |
540 | data = be32_to_cpup((__be32 *)&cf->data[4]); |
541 | flexcan_write(data, ®s->mb[FLEXCAN_TX_BUF_ID].data[1]); |
542 | } |
543 | diff --git a/drivers/net/ethernet/arc/emac_main.c b/drivers/net/ethernet/arc/emac_main.c |
544 | index be865b4dada2..aba4853e6b70 100644 |
545 | --- a/drivers/net/ethernet/arc/emac_main.c |
546 | +++ b/drivers/net/ethernet/arc/emac_main.c |
547 | @@ -210,39 +210,48 @@ static int arc_emac_rx(struct net_device *ndev, int budget) |
548 | continue; |
549 | } |
550 | |
551 | - pktlen = info & LEN_MASK; |
552 | - stats->rx_packets++; |
553 | - stats->rx_bytes += pktlen; |
554 | - skb = rx_buff->skb; |
555 | - skb_put(skb, pktlen); |
556 | - skb->dev = ndev; |
557 | - skb->protocol = eth_type_trans(skb, ndev); |
558 | - |
559 | - dma_unmap_single(&ndev->dev, dma_unmap_addr(rx_buff, addr), |
560 | - dma_unmap_len(rx_buff, len), DMA_FROM_DEVICE); |
561 | - |
562 | - /* Prepare the BD for next cycle */ |
563 | - rx_buff->skb = netdev_alloc_skb_ip_align(ndev, |
564 | - EMAC_BUFFER_SIZE); |
565 | - if (unlikely(!rx_buff->skb)) { |
566 | + /* Prepare the BD for next cycle. netif_receive_skb() |
567 | + * only if new skb was allocated and mapped to avoid holes |
568 | + * in the RX fifo. |
569 | + */ |
570 | + skb = netdev_alloc_skb_ip_align(ndev, EMAC_BUFFER_SIZE); |
571 | + if (unlikely(!skb)) { |
572 | + if (net_ratelimit()) |
573 | + netdev_err(ndev, "cannot allocate skb\n"); |
574 | + /* Return ownership to EMAC */ |
575 | + rxbd->info = cpu_to_le32(FOR_EMAC | EMAC_BUFFER_SIZE); |
576 | stats->rx_errors++; |
577 | - /* Because receive_skb is below, increment rx_dropped */ |
578 | stats->rx_dropped++; |
579 | continue; |
580 | } |
581 | |
582 | - /* receive_skb only if new skb was allocated to avoid holes */ |
583 | - netif_receive_skb(skb); |
584 | - |
585 | - addr = dma_map_single(&ndev->dev, (void *)rx_buff->skb->data, |
586 | + addr = dma_map_single(&ndev->dev, (void *)skb->data, |
587 | EMAC_BUFFER_SIZE, DMA_FROM_DEVICE); |
588 | if (dma_mapping_error(&ndev->dev, addr)) { |
589 | if (net_ratelimit()) |
590 | - netdev_err(ndev, "cannot dma map\n"); |
591 | - dev_kfree_skb(rx_buff->skb); |
592 | + netdev_err(ndev, "cannot map dma buffer\n"); |
593 | + dev_kfree_skb(skb); |
594 | + /* Return ownership to EMAC */ |
595 | + rxbd->info = cpu_to_le32(FOR_EMAC | EMAC_BUFFER_SIZE); |
596 | stats->rx_errors++; |
597 | + stats->rx_dropped++; |
598 | continue; |
599 | } |
600 | + |
601 | + /* unmap previosly mapped skb */ |
602 | + dma_unmap_single(&ndev->dev, dma_unmap_addr(rx_buff, addr), |
603 | + dma_unmap_len(rx_buff, len), DMA_FROM_DEVICE); |
604 | + |
605 | + pktlen = info & LEN_MASK; |
606 | + stats->rx_packets++; |
607 | + stats->rx_bytes += pktlen; |
608 | + skb_put(rx_buff->skb, pktlen); |
609 | + rx_buff->skb->dev = ndev; |
610 | + rx_buff->skb->protocol = eth_type_trans(rx_buff->skb, ndev); |
611 | + |
612 | + netif_receive_skb(rx_buff->skb); |
613 | + |
614 | + rx_buff->skb = skb; |
615 | dma_unmap_addr_set(rx_buff, addr, addr); |
616 | dma_unmap_len_set(rx_buff, len, EMAC_BUFFER_SIZE); |
617 | |
618 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c |
619 | index 0a5ee1d973ac..596f88b693ef 100644 |
620 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c |
621 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c |
622 | @@ -3034,7 +3034,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link) |
623 | |
624 | del_timer_sync(&bp->timer); |
625 | |
626 | - if (IS_PF(bp)) { |
627 | + if (IS_PF(bp) && !BP_NOMCP(bp)) { |
628 | /* Set ALWAYS_ALIVE bit in shmem */ |
629 | bp->fw_drv_pulse_wr_seq |= DRV_PULSE_ALWAYS_ALIVE; |
630 | bnx2x_drv_pulse(bp); |
631 | @@ -3120,7 +3120,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link) |
632 | bp->cnic_loaded = false; |
633 | |
634 | /* Clear driver version indication in shmem */ |
635 | - if (IS_PF(bp)) |
636 | + if (IS_PF(bp) && !BP_NOMCP(bp)) |
637 | bnx2x_update_mng_version(bp); |
638 | |
639 | /* Check if there are pending parity attentions. If there are - set |
640 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
641 | index 5d958b5bb8b1..554c4086b3c6 100644 |
642 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
643 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
644 | @@ -9578,6 +9578,15 @@ static int bnx2x_init_shmem(struct bnx2x *bp) |
645 | |
646 | do { |
647 | bp->common.shmem_base = REG_RD(bp, MISC_REG_SHARED_MEM_ADDR); |
648 | + |
649 | + /* If we read all 0xFFs, means we are in PCI error state and |
650 | + * should bail out to avoid crashes on adapter's FW reads. |
651 | + */ |
652 | + if (bp->common.shmem_base == 0xFFFFFFFF) { |
653 | + bp->flags |= NO_MCP_FLAG; |
654 | + return -ENODEV; |
655 | + } |
656 | + |
657 | if (bp->common.shmem_base) { |
658 | val = SHMEM_RD(bp, validity_map[BP_PORT(bp)]); |
659 | if (val & SHR_MEM_VALIDITY_MB) |
660 | @@ -14312,7 +14321,10 @@ static pci_ers_result_t bnx2x_io_slot_reset(struct pci_dev *pdev) |
661 | BNX2X_ERR("IO slot reset --> driver unload\n"); |
662 | |
663 | /* MCP should have been reset; Need to wait for validity */ |
664 | - bnx2x_init_shmem(bp); |
665 | + if (bnx2x_init_shmem(bp)) { |
666 | + rtnl_unlock(); |
667 | + return PCI_ERS_RESULT_DISCONNECT; |
668 | + } |
669 | |
670 | if (IS_PF(bp) && SHMEM2_HAS(bp, drv_capabilities_flag)) { |
671 | u32 v; |
672 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c |
673 | index 60e2af8678bd..393cce3bf2fc 100644 |
674 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c |
675 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c |
676 | @@ -68,7 +68,7 @@ static int bnxt_vf_ndo_prep(struct bnxt *bp, int vf_id) |
677 | netdev_err(bp->dev, "vf ndo called though sriov is disabled\n"); |
678 | return -EINVAL; |
679 | } |
680 | - if (vf_id >= bp->pf.max_vfs) { |
681 | + if (vf_id >= bp->pf.active_vfs) { |
682 | netdev_err(bp->dev, "Invalid VF id %d\n", vf_id); |
683 | return -EINVAL; |
684 | } |
685 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c |
686 | index bb22d325e965..795a133fb074 100644 |
687 | --- a/drivers/net/ethernet/broadcom/tg3.c |
688 | +++ b/drivers/net/ethernet/broadcom/tg3.c |
689 | @@ -10049,6 +10049,16 @@ static int tg3_reset_hw(struct tg3 *tp, bool reset_phy) |
690 | |
691 | tw32(GRC_MODE, tp->grc_mode | val); |
692 | |
693 | + /* On one of the AMD platform, MRRS is restricted to 4000 because of |
694 | + * south bridge limitation. As a workaround, Driver is setting MRRS |
695 | + * to 2048 instead of default 4096. |
696 | + */ |
697 | + if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL && |
698 | + tp->pdev->subsystem_device == TG3PCI_SUBDEVICE_ID_DELL_5762) { |
699 | + val = tr32(TG3PCI_DEV_STATUS_CTRL) & ~MAX_READ_REQ_MASK; |
700 | + tw32(TG3PCI_DEV_STATUS_CTRL, val | MAX_READ_REQ_SIZE_2048); |
701 | + } |
702 | + |
703 | /* Setup the timer prescalar register. Clock is always 66Mhz. */ |
704 | val = tr32(GRC_MISC_CFG); |
705 | val &= ~0xff; |
706 | @@ -14228,7 +14238,8 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu) |
707 | */ |
708 | if (tg3_asic_rev(tp) == ASIC_REV_57766 || |
709 | tg3_asic_rev(tp) == ASIC_REV_5717 || |
710 | - tg3_asic_rev(tp) == ASIC_REV_5719) |
711 | + tg3_asic_rev(tp) == ASIC_REV_5719 || |
712 | + tg3_asic_rev(tp) == ASIC_REV_5720) |
713 | reset_phy = true; |
714 | |
715 | err = tg3_restart_hw(tp, reset_phy); |
716 | diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h |
717 | index 3b5e98ecba00..6e51b793615c 100644 |
718 | --- a/drivers/net/ethernet/broadcom/tg3.h |
719 | +++ b/drivers/net/ethernet/broadcom/tg3.h |
720 | @@ -95,6 +95,7 @@ |
721 | #define TG3PCI_SUBDEVICE_ID_DELL_JAGUAR 0x0106 |
722 | #define TG3PCI_SUBDEVICE_ID_DELL_MERLOT 0x0109 |
723 | #define TG3PCI_SUBDEVICE_ID_DELL_SLIM_MERLOT 0x010a |
724 | +#define TG3PCI_SUBDEVICE_ID_DELL_5762 0x07f0 |
725 | #define TG3PCI_SUBVENDOR_ID_COMPAQ PCI_VENDOR_ID_COMPAQ |
726 | #define TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE 0x007c |
727 | #define TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE_2 0x009a |
728 | @@ -280,6 +281,9 @@ |
729 | #define TG3PCI_STD_RING_PROD_IDX 0x00000098 /* 64-bit */ |
730 | #define TG3PCI_RCV_RET_RING_CON_IDX 0x000000a0 /* 64-bit */ |
731 | /* 0xa8 --> 0xb8 unused */ |
732 | +#define TG3PCI_DEV_STATUS_CTRL 0x000000b4 |
733 | +#define MAX_READ_REQ_SIZE_2048 0x00004000 |
734 | +#define MAX_READ_REQ_MASK 0x00007000 |
735 | #define TG3PCI_DUAL_MAC_CTRL 0x000000b8 |
736 | #define DUAL_MAC_CTRL_CH_MASK 0x00000003 |
737 | #define DUAL_MAC_CTRL_ID 0x00000004 |
738 | diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c |
739 | index 57798814160d..ec4b6997f24a 100644 |
740 | --- a/drivers/net/ethernet/freescale/gianfar_ptp.c |
741 | +++ b/drivers/net/ethernet/freescale/gianfar_ptp.c |
742 | @@ -314,11 +314,10 @@ static int ptp_gianfar_adjtime(struct ptp_clock_info *ptp, s64 delta) |
743 | now = tmr_cnt_read(etsects); |
744 | now += delta; |
745 | tmr_cnt_write(etsects, now); |
746 | + set_fipers(etsects); |
747 | |
748 | spin_unlock_irqrestore(&etsects->lock, flags); |
749 | |
750 | - set_fipers(etsects); |
751 | - |
752 | return 0; |
753 | } |
754 | |
755 | diff --git a/drivers/net/ethernet/intel/e1000/e1000.h b/drivers/net/ethernet/intel/e1000/e1000.h |
756 | index d7bdea79e9fa..8fd2458060a0 100644 |
757 | --- a/drivers/net/ethernet/intel/e1000/e1000.h |
758 | +++ b/drivers/net/ethernet/intel/e1000/e1000.h |
759 | @@ -331,7 +331,8 @@ struct e1000_adapter { |
760 | enum e1000_state_t { |
761 | __E1000_TESTING, |
762 | __E1000_RESETTING, |
763 | - __E1000_DOWN |
764 | + __E1000_DOWN, |
765 | + __E1000_DISABLED |
766 | }; |
767 | |
768 | #undef pr_fmt |
769 | diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c |
770 | index f42129d09e2c..dd112aa5cebb 100644 |
771 | --- a/drivers/net/ethernet/intel/e1000/e1000_main.c |
772 | +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c |
773 | @@ -940,7 +940,7 @@ static int e1000_init_hw_struct(struct e1000_adapter *adapter, |
774 | static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
775 | { |
776 | struct net_device *netdev; |
777 | - struct e1000_adapter *adapter; |
778 | + struct e1000_adapter *adapter = NULL; |
779 | struct e1000_hw *hw; |
780 | |
781 | static int cards_found; |
782 | @@ -950,6 +950,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
783 | u16 tmp = 0; |
784 | u16 eeprom_apme_mask = E1000_EEPROM_APME; |
785 | int bars, need_ioport; |
786 | + bool disable_dev = false; |
787 | |
788 | /* do not allocate ioport bars when not needed */ |
789 | need_ioport = e1000_is_need_ioport(pdev); |
790 | @@ -1250,11 +1251,13 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
791 | iounmap(hw->ce4100_gbe_mdio_base_virt); |
792 | iounmap(hw->hw_addr); |
793 | err_ioremap: |
794 | + disable_dev = !test_and_set_bit(__E1000_DISABLED, &adapter->flags); |
795 | free_netdev(netdev); |
796 | err_alloc_etherdev: |
797 | pci_release_selected_regions(pdev, bars); |
798 | err_pci_reg: |
799 | - pci_disable_device(pdev); |
800 | + if (!adapter || disable_dev) |
801 | + pci_disable_device(pdev); |
802 | return err; |
803 | } |
804 | |
805 | @@ -1272,6 +1275,7 @@ static void e1000_remove(struct pci_dev *pdev) |
806 | struct net_device *netdev = pci_get_drvdata(pdev); |
807 | struct e1000_adapter *adapter = netdev_priv(netdev); |
808 | struct e1000_hw *hw = &adapter->hw; |
809 | + bool disable_dev; |
810 | |
811 | e1000_down_and_stop(adapter); |
812 | e1000_release_manageability(adapter); |
813 | @@ -1290,9 +1294,11 @@ static void e1000_remove(struct pci_dev *pdev) |
814 | iounmap(hw->flash_address); |
815 | pci_release_selected_regions(pdev, adapter->bars); |
816 | |
817 | + disable_dev = !test_and_set_bit(__E1000_DISABLED, &adapter->flags); |
818 | free_netdev(netdev); |
819 | |
820 | - pci_disable_device(pdev); |
821 | + if (disable_dev) |
822 | + pci_disable_device(pdev); |
823 | } |
824 | |
825 | /** |
826 | @@ -5166,7 +5172,8 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake) |
827 | if (netif_running(netdev)) |
828 | e1000_free_irq(adapter); |
829 | |
830 | - pci_disable_device(pdev); |
831 | + if (!test_and_set_bit(__E1000_DISABLED, &adapter->flags)) |
832 | + pci_disable_device(pdev); |
833 | |
834 | return 0; |
835 | } |
836 | @@ -5210,6 +5217,10 @@ static int e1000_resume(struct pci_dev *pdev) |
837 | pr_err("Cannot enable PCI device from suspend\n"); |
838 | return err; |
839 | } |
840 | + |
841 | + /* flush memory to make sure state is correct */ |
842 | + smp_mb__before_atomic(); |
843 | + clear_bit(__E1000_DISABLED, &adapter->flags); |
844 | pci_set_master(pdev); |
845 | |
846 | pci_enable_wake(pdev, PCI_D3hot, 0); |
847 | @@ -5284,7 +5295,9 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, |
848 | |
849 | if (netif_running(netdev)) |
850 | e1000_down(adapter); |
851 | - pci_disable_device(pdev); |
852 | + |
853 | + if (!test_and_set_bit(__E1000_DISABLED, &adapter->flags)) |
854 | + pci_disable_device(pdev); |
855 | |
856 | /* Request a slot slot reset. */ |
857 | return PCI_ERS_RESULT_NEED_RESET; |
858 | @@ -5312,6 +5325,10 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev) |
859 | pr_err("Cannot re-enable PCI device after reset.\n"); |
860 | return PCI_ERS_RESULT_DISCONNECT; |
861 | } |
862 | + |
863 | + /* flush memory to make sure state is correct */ |
864 | + smp_mb__before_atomic(); |
865 | + clear_bit(__E1000_DISABLED, &adapter->flags); |
866 | pci_set_master(pdev); |
867 | |
868 | pci_enable_wake(pdev, PCI_D3hot, 0); |
869 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c |
870 | index c5430394fac9..28b640fa2e35 100644 |
871 | --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c |
872 | +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c |
873 | @@ -2670,10 +2670,30 @@ bool __i40e_chk_linearize(struct sk_buff *skb) |
874 | /* Walk through fragments adding latest fragment, testing it, and |
875 | * then removing stale fragments from the sum. |
876 | */ |
877 | - stale = &skb_shinfo(skb)->frags[0]; |
878 | - for (;;) { |
879 | + for (stale = &skb_shinfo(skb)->frags[0];; stale++) { |
880 | + int stale_size = skb_frag_size(stale); |
881 | + |
882 | sum += skb_frag_size(frag++); |
883 | |
884 | + /* The stale fragment may present us with a smaller |
885 | + * descriptor than the actual fragment size. To account |
886 | + * for that we need to remove all the data on the front and |
887 | + * figure out what the remainder would be in the last |
888 | + * descriptor associated with the fragment. |
889 | + */ |
890 | + if (stale_size > I40E_MAX_DATA_PER_TXD) { |
891 | + int align_pad = -(stale->page_offset) & |
892 | + (I40E_MAX_READ_REQ_SIZE - 1); |
893 | + |
894 | + sum -= align_pad; |
895 | + stale_size -= align_pad; |
896 | + |
897 | + do { |
898 | + sum -= I40E_MAX_DATA_PER_TXD_ALIGNED; |
899 | + stale_size -= I40E_MAX_DATA_PER_TXD_ALIGNED; |
900 | + } while (stale_size > I40E_MAX_DATA_PER_TXD); |
901 | + } |
902 | + |
903 | /* if sum is negative we failed to make sufficient progress */ |
904 | if (sum < 0) |
905 | return true; |
906 | @@ -2681,7 +2701,7 @@ bool __i40e_chk_linearize(struct sk_buff *skb) |
907 | if (!nr_frags--) |
908 | break; |
909 | |
910 | - sum -= skb_frag_size(stale++); |
911 | + sum -= stale_size; |
912 | } |
913 | |
914 | return false; |
915 | diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c |
916 | index c03800d1000a..90ebc5ac16fd 100644 |
917 | --- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c |
918 | +++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c |
919 | @@ -1872,10 +1872,30 @@ bool __i40evf_chk_linearize(struct sk_buff *skb) |
920 | /* Walk through fragments adding latest fragment, testing it, and |
921 | * then removing stale fragments from the sum. |
922 | */ |
923 | - stale = &skb_shinfo(skb)->frags[0]; |
924 | - for (;;) { |
925 | + for (stale = &skb_shinfo(skb)->frags[0];; stale++) { |
926 | + int stale_size = skb_frag_size(stale); |
927 | + |
928 | sum += skb_frag_size(frag++); |
929 | |
930 | + /* The stale fragment may present us with a smaller |
931 | + * descriptor than the actual fragment size. To account |
932 | + * for that we need to remove all the data on the front and |
933 | + * figure out what the remainder would be in the last |
934 | + * descriptor associated with the fragment. |
935 | + */ |
936 | + if (stale_size > I40E_MAX_DATA_PER_TXD) { |
937 | + int align_pad = -(stale->page_offset) & |
938 | + (I40E_MAX_READ_REQ_SIZE - 1); |
939 | + |
940 | + sum -= align_pad; |
941 | + stale_size -= align_pad; |
942 | + |
943 | + do { |
944 | + sum -= I40E_MAX_DATA_PER_TXD_ALIGNED; |
945 | + stale_size -= I40E_MAX_DATA_PER_TXD_ALIGNED; |
946 | + } while (stale_size > I40E_MAX_DATA_PER_TXD); |
947 | + } |
948 | + |
949 | /* if sum is negative we failed to make sufficient progress */ |
950 | if (sum < 0) |
951 | return true; |
952 | @@ -1883,7 +1903,7 @@ bool __i40evf_chk_linearize(struct sk_buff *skb) |
953 | if (!nr_frags--) |
954 | break; |
955 | |
956 | - sum -= skb_frag_size(stale++); |
957 | + sum -= stale_size; |
958 | } |
959 | |
960 | return false; |
961 | diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
962 | index 4832223f1500..20de37a414fe 100644 |
963 | --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
964 | +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
965 | @@ -1842,11 +1842,12 @@ static int mtk_hw_init(struct mtk_eth *eth) |
966 | /* set GE2 TUNE */ |
967 | regmap_write(eth->pctl, GPIO_BIAS_CTRL, 0x0); |
968 | |
969 | - /* GE1, Force 1000M/FD, FC ON */ |
970 | - mtk_w32(eth, MAC_MCR_FIXED_LINK, MTK_MAC_MCR(0)); |
971 | - |
972 | - /* GE2, Force 1000M/FD, FC ON */ |
973 | - mtk_w32(eth, MAC_MCR_FIXED_LINK, MTK_MAC_MCR(1)); |
974 | + /* Set linkdown as the default for each GMAC. Its own MCR would be set |
975 | + * up with the more appropriate value when mtk_phy_link_adjust call is |
976 | + * being invoked. |
977 | + */ |
978 | + for (i = 0; i < MTK_MAC_COUNT; i++) |
979 | + mtk_w32(eth, 0, MTK_MAC_MCR(i)); |
980 | |
981 | /* Enable RX VLan Offloading */ |
982 | mtk_w32(eth, 1, MTK_CDMP_EG_CTRL); |
983 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c |
984 | index 10d6059b2f26..f4074e25fb71 100644 |
985 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c |
986 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c |
987 | @@ -38,6 +38,7 @@ static u32 stmmac_config_sub_second_increment(void __iomem *ioaddr, |
988 | { |
989 | u32 value = readl(ioaddr + PTP_TCR); |
990 | unsigned long data; |
991 | + u32 reg_value; |
992 | |
993 | /* For GMAC3.x, 4.x versions, convert the ptp_clock to nano second |
994 | * formula = (1/ptp_clock) * 1000000000 |
995 | @@ -54,10 +55,11 @@ static u32 stmmac_config_sub_second_increment(void __iomem *ioaddr, |
996 | |
997 | data &= PTP_SSIR_SSINC_MASK; |
998 | |
999 | + reg_value = data; |
1000 | if (gmac4) |
1001 | - data = data << GMAC4_PTP_SSIR_SSINC_SHIFT; |
1002 | + reg_value <<= GMAC4_PTP_SSIR_SSINC_SHIFT; |
1003 | |
1004 | - writel(data, ioaddr + PTP_SSIR); |
1005 | + writel(reg_value, ioaddr + PTP_SSIR); |
1006 | |
1007 | return data; |
1008 | } |
1009 | diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c |
1010 | index 6d55049cd3dc..e8ad4d060da7 100644 |
1011 | --- a/drivers/net/macvlan.c |
1012 | +++ b/drivers/net/macvlan.c |
1013 | @@ -1377,9 +1377,14 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev, |
1014 | return 0; |
1015 | |
1016 | unregister_netdev: |
1017 | + /* macvlan_uninit would free the macvlan port */ |
1018 | unregister_netdevice(dev); |
1019 | + return err; |
1020 | destroy_macvlan_port: |
1021 | - if (create) |
1022 | + /* the macvlan port may be freed by macvlan_uninit when fail to register. |
1023 | + * so we destroy the macvlan port only when it's valid. |
1024 | + */ |
1025 | + if (create && macvlan_port_get_rtnl(dev)) |
1026 | macvlan_port_destroy(port->dev); |
1027 | return err; |
1028 | } |
1029 | diff --git a/drivers/net/phy/mdio-sun4i.c b/drivers/net/phy/mdio-sun4i.c |
1030 | index 135296508a7e..6425ce04d3f9 100644 |
1031 | --- a/drivers/net/phy/mdio-sun4i.c |
1032 | +++ b/drivers/net/phy/mdio-sun4i.c |
1033 | @@ -118,8 +118,10 @@ static int sun4i_mdio_probe(struct platform_device *pdev) |
1034 | |
1035 | data->regulator = devm_regulator_get(&pdev->dev, "phy"); |
1036 | if (IS_ERR(data->regulator)) { |
1037 | - if (PTR_ERR(data->regulator) == -EPROBE_DEFER) |
1038 | - return -EPROBE_DEFER; |
1039 | + if (PTR_ERR(data->regulator) == -EPROBE_DEFER) { |
1040 | + ret = -EPROBE_DEFER; |
1041 | + goto err_out_free_mdiobus; |
1042 | + } |
1043 | |
1044 | dev_info(&pdev->dev, "no regulator found\n"); |
1045 | data->regulator = NULL; |
1046 | diff --git a/drivers/net/phy/mdio-xgene.c b/drivers/net/phy/mdio-xgene.c |
1047 | index 92af182951be..8eb077b677f6 100644 |
1048 | --- a/drivers/net/phy/mdio-xgene.c |
1049 | +++ b/drivers/net/phy/mdio-xgene.c |
1050 | @@ -197,8 +197,11 @@ static int xgene_mdio_reset(struct xgene_mdio_pdata *pdata) |
1051 | } |
1052 | |
1053 | ret = xgene_enet_ecc_init(pdata); |
1054 | - if (ret) |
1055 | + if (ret) { |
1056 | + if (pdata->dev->of_node) |
1057 | + clk_disable_unprepare(pdata->clk); |
1058 | return ret; |
1059 | + } |
1060 | xgene_gmac_reset(pdata); |
1061 | |
1062 | return 0; |
1063 | @@ -364,8 +367,10 @@ static int xgene_mdio_probe(struct platform_device *pdev) |
1064 | return ret; |
1065 | |
1066 | mdio_bus = mdiobus_alloc(); |
1067 | - if (!mdio_bus) |
1068 | - return -ENOMEM; |
1069 | + if (!mdio_bus) { |
1070 | + ret = -ENOMEM; |
1071 | + goto out_clk; |
1072 | + } |
1073 | |
1074 | mdio_bus->name = "APM X-Gene MDIO bus"; |
1075 | |
1076 | @@ -394,7 +399,7 @@ static int xgene_mdio_probe(struct platform_device *pdev) |
1077 | mdio_bus->phy_mask = ~0; |
1078 | ret = mdiobus_register(mdio_bus); |
1079 | if (ret) |
1080 | - goto out; |
1081 | + goto out_mdiobus; |
1082 | |
1083 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_HANDLE(dev), 1, |
1084 | acpi_register_phy, NULL, mdio_bus, NULL); |
1085 | @@ -402,16 +407,20 @@ static int xgene_mdio_probe(struct platform_device *pdev) |
1086 | } |
1087 | |
1088 | if (ret) |
1089 | - goto out; |
1090 | + goto out_mdiobus; |
1091 | |
1092 | pdata->mdio_bus = mdio_bus; |
1093 | xgene_mdio_status = true; |
1094 | |
1095 | return 0; |
1096 | |
1097 | -out: |
1098 | +out_mdiobus: |
1099 | mdiobus_free(mdio_bus); |
1100 | |
1101 | +out_clk: |
1102 | + if (dev->of_node) |
1103 | + clk_disable_unprepare(pdata->clk); |
1104 | + |
1105 | return ret; |
1106 | } |
1107 | |
1108 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
1109 | index e1e5e8438457..a30d6a6dbd95 100644 |
1110 | --- a/drivers/net/usb/qmi_wwan.c |
1111 | +++ b/drivers/net/usb/qmi_wwan.c |
1112 | @@ -805,6 +805,7 @@ static const struct usb_device_id products[] = { |
1113 | {QMI_FIXED_INTF(0x05c6, 0x9084, 4)}, |
1114 | {QMI_FIXED_INTF(0x05c6, 0x920d, 0)}, |
1115 | {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, |
1116 | + {QMI_QUIRK_SET_DTR(0x05c6, 0x9625, 4)}, /* YUGA CLM920-NC5 */ |
1117 | {QMI_FIXED_INTF(0x0846, 0x68a2, 8)}, |
1118 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ |
1119 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ |
1120 | @@ -914,6 +915,7 @@ static const struct usb_device_id products[] = { |
1121 | {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ |
1122 | {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ |
1123 | {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ |
1124 | + {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */ |
1125 | {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */ |
1126 | {QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */ |
1127 | {QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */ |
1128 | diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c |
1129 | index 4b462dc21c41..61e85eac706a 100644 |
1130 | --- a/drivers/net/wireless/mac80211_hwsim.c |
1131 | +++ b/drivers/net/wireless/mac80211_hwsim.c |
1132 | @@ -3154,7 +3154,7 @@ static int hwsim_get_radio_nl(struct sk_buff *msg, struct genl_info *info) |
1133 | if (!net_eq(wiphy_net(data->hw->wiphy), genl_info_net(info))) |
1134 | continue; |
1135 | |
1136 | - skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
1137 | + skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); |
1138 | if (!skb) { |
1139 | res = -ENOMEM; |
1140 | goto out_err; |
1141 | diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c |
1142 | index 1a9dadf7b3cc..b09c81e882b4 100644 |
1143 | --- a/drivers/net/xen-netfront.c |
1144 | +++ b/drivers/net/xen-netfront.c |
1145 | @@ -1345,6 +1345,7 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev) |
1146 | |
1147 | netif_carrier_off(netdev); |
1148 | |
1149 | + xenbus_switch_state(dev, XenbusStateInitialising); |
1150 | return netdev; |
1151 | |
1152 | exit: |
1153 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
1154 | index 719ee5fb2626..ad9d82eb2aed 100644 |
1155 | --- a/drivers/nvme/host/core.c |
1156 | +++ b/drivers/nvme/host/core.c |
1157 | @@ -1204,7 +1204,8 @@ static void nvme_set_queue_limits(struct nvme_ctrl *ctrl, |
1158 | blk_queue_max_hw_sectors(q, ctrl->max_hw_sectors); |
1159 | blk_queue_max_segments(q, min_t(u32, max_segments, USHRT_MAX)); |
1160 | } |
1161 | - if (ctrl->quirks & NVME_QUIRK_STRIPE_SIZE) |
1162 | + if ((ctrl->quirks & NVME_QUIRK_STRIPE_SIZE) && |
1163 | + is_power_of_2(ctrl->max_hw_sectors)) |
1164 | blk_queue_chunk_sectors(q, ctrl->max_hw_sectors); |
1165 | blk_queue_virt_boundary(q, ctrl->page_size - 1); |
1166 | if (ctrl->vwc & NVME_CTRL_VWC_PRESENT) |
1167 | diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c |
1168 | index 8305ab688d57..a20dc2940d2d 100644 |
1169 | --- a/drivers/s390/block/dasd_3990_erp.c |
1170 | +++ b/drivers/s390/block/dasd_3990_erp.c |
1171 | @@ -2755,6 +2755,16 @@ dasd_3990_erp_action(struct dasd_ccw_req * cqr) |
1172 | erp = dasd_3990_erp_handle_match_erp(cqr, erp); |
1173 | } |
1174 | |
1175 | + |
1176 | + /* |
1177 | + * For path verification work we need to stick with the path that was |
1178 | + * originally chosen so that the per path configuration data is |
1179 | + * assigned correctly. |
1180 | + */ |
1181 | + if (test_bit(DASD_CQR_VERIFY_PATH, &erp->flags) && cqr->lpm) { |
1182 | + erp->lpm = cqr->lpm; |
1183 | + } |
1184 | + |
1185 | if (device->features & DASD_FEATURE_ERPLOG) { |
1186 | /* print current erp_chain */ |
1187 | dev_err(&device->cdev->dev, |
1188 | diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c |
1189 | index 2bf96d33428a..0dd1984e381e 100644 |
1190 | --- a/drivers/scsi/storvsc_drv.c |
1191 | +++ b/drivers/scsi/storvsc_drv.c |
1192 | @@ -915,10 +915,11 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb, |
1193 | case TEST_UNIT_READY: |
1194 | break; |
1195 | default: |
1196 | - set_host_byte(scmnd, DID_TARGET_FAILURE); |
1197 | + set_host_byte(scmnd, DID_ERROR); |
1198 | } |
1199 | break; |
1200 | case SRB_STATUS_INVALID_LUN: |
1201 | + set_host_byte(scmnd, DID_NO_CONNECT); |
1202 | do_work = true; |
1203 | process_err_fn = storvsc_remove_lun; |
1204 | break; |
1205 | diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c |
1206 | index 8feac599e9ab..44be6b593b30 100644 |
1207 | --- a/drivers/spi/spi-atmel.c |
1208 | +++ b/drivers/spi/spi-atmel.c |
1209 | @@ -1669,12 +1669,12 @@ static int atmel_spi_remove(struct platform_device *pdev) |
1210 | pm_runtime_get_sync(&pdev->dev); |
1211 | |
1212 | /* reset the hardware and block queue progress */ |
1213 | - spin_lock_irq(&as->lock); |
1214 | if (as->use_dma) { |
1215 | atmel_spi_stop_dma(as); |
1216 | atmel_spi_release_dma(as); |
1217 | } |
1218 | |
1219 | + spin_lock_irq(&as->lock); |
1220 | spi_writel(as, CR, SPI_BIT(SWRST)); |
1221 | spi_writel(as, CR, SPI_BIT(SWRST)); /* AT91SAM9263 Rev B workaround */ |
1222 | spi_readl(as, SR); |
1223 | diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c |
1224 | index 79b8ab4c6663..910b5d40c6e9 100644 |
1225 | --- a/drivers/xen/gntdev.c |
1226 | +++ b/drivers/xen/gntdev.c |
1227 | @@ -378,10 +378,8 @@ static int unmap_grant_pages(struct grant_map *map, int offset, int pages) |
1228 | } |
1229 | range = 0; |
1230 | while (range < pages) { |
1231 | - if (map->unmap_ops[offset+range].handle == -1) { |
1232 | - range--; |
1233 | + if (map->unmap_ops[offset+range].handle == -1) |
1234 | break; |
1235 | - } |
1236 | range++; |
1237 | } |
1238 | err = __unmap_grant_pages(map, offset, range); |
1239 | @@ -1079,8 +1077,10 @@ static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma) |
1240 | out_unlock_put: |
1241 | mutex_unlock(&priv->lock); |
1242 | out_put_map: |
1243 | - if (use_ptemod) |
1244 | + if (use_ptemod) { |
1245 | map->vma = NULL; |
1246 | + unmap_grant_pages(map, 0, map->count); |
1247 | + } |
1248 | gntdev_put_map(priv, map); |
1249 | return err; |
1250 | } |
1251 | diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c |
1252 | index 7b32ce979fe1..63e519658d73 100644 |
1253 | --- a/fs/f2fs/extent_cache.c |
1254 | +++ b/fs/f2fs/extent_cache.c |
1255 | @@ -177,7 +177,7 @@ static void __drop_largest_extent(struct inode *inode, |
1256 | } |
1257 | |
1258 | /* return true, if inode page is changed */ |
1259 | -bool f2fs_init_extent_tree(struct inode *inode, struct f2fs_extent *i_ext) |
1260 | +static bool __f2fs_init_extent_tree(struct inode *inode, struct f2fs_extent *i_ext) |
1261 | { |
1262 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
1263 | struct extent_tree *et; |
1264 | @@ -215,6 +215,16 @@ bool f2fs_init_extent_tree(struct inode *inode, struct f2fs_extent *i_ext) |
1265 | return false; |
1266 | } |
1267 | |
1268 | +bool f2fs_init_extent_tree(struct inode *inode, struct f2fs_extent *i_ext) |
1269 | +{ |
1270 | + bool ret = __f2fs_init_extent_tree(inode, i_ext); |
1271 | + |
1272 | + if (!F2FS_I(inode)->extent_tree) |
1273 | + set_inode_flag(inode, FI_NO_EXTENT); |
1274 | + |
1275 | + return ret; |
1276 | +} |
1277 | + |
1278 | static bool f2fs_lookup_extent_tree(struct inode *inode, pgoff_t pgofs, |
1279 | struct extent_info *ei) |
1280 | { |
1281 | diff --git a/fs/super.c b/fs/super.c |
1282 | index 1058bf3e8724..7e9beab77259 100644 |
1283 | --- a/fs/super.c |
1284 | +++ b/fs/super.c |
1285 | @@ -519,7 +519,11 @@ struct super_block *sget_userns(struct file_system_type *type, |
1286 | hlist_add_head(&s->s_instances, &type->fs_supers); |
1287 | spin_unlock(&sb_lock); |
1288 | get_filesystem(type); |
1289 | - register_shrinker(&s->s_shrink); |
1290 | + err = register_shrinker(&s->s_shrink); |
1291 | + if (err) { |
1292 | + deactivate_locked_super(s); |
1293 | + s = ERR_PTR(err); |
1294 | + } |
1295 | return s; |
1296 | } |
1297 | |
1298 | diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c |
1299 | index 1fdd3face2d9..e3edaa547216 100644 |
1300 | --- a/fs/xfs/xfs_qm.c |
1301 | +++ b/fs/xfs/xfs_qm.c |
1302 | @@ -47,7 +47,7 @@ |
1303 | STATIC int xfs_qm_init_quotainos(xfs_mount_t *); |
1304 | STATIC int xfs_qm_init_quotainfo(xfs_mount_t *); |
1305 | |
1306 | - |
1307 | +STATIC void xfs_qm_destroy_quotainos(xfs_quotainfo_t *qi); |
1308 | STATIC void xfs_qm_dqfree_one(struct xfs_dquot *dqp); |
1309 | /* |
1310 | * We use the batch lookup interface to iterate over the dquots as it |
1311 | @@ -694,9 +694,17 @@ xfs_qm_init_quotainfo( |
1312 | qinf->qi_shrinker.scan_objects = xfs_qm_shrink_scan; |
1313 | qinf->qi_shrinker.seeks = DEFAULT_SEEKS; |
1314 | qinf->qi_shrinker.flags = SHRINKER_NUMA_AWARE; |
1315 | - register_shrinker(&qinf->qi_shrinker); |
1316 | + |
1317 | + error = register_shrinker(&qinf->qi_shrinker); |
1318 | + if (error) |
1319 | + goto out_free_inos; |
1320 | + |
1321 | return 0; |
1322 | |
1323 | +out_free_inos: |
1324 | + mutex_destroy(&qinf->qi_quotaofflock); |
1325 | + mutex_destroy(&qinf->qi_tree_lock); |
1326 | + xfs_qm_destroy_quotainos(qinf); |
1327 | out_free_lru: |
1328 | list_lru_destroy(&qinf->qi_lru); |
1329 | out_free_qinf: |
1330 | @@ -705,7 +713,6 @@ xfs_qm_init_quotainfo( |
1331 | return error; |
1332 | } |
1333 | |
1334 | - |
1335 | /* |
1336 | * Gets called when unmounting a filesystem or when all quotas get |
1337 | * turned off. |
1338 | @@ -722,19 +729,8 @@ xfs_qm_destroy_quotainfo( |
1339 | |
1340 | unregister_shrinker(&qi->qi_shrinker); |
1341 | list_lru_destroy(&qi->qi_lru); |
1342 | - |
1343 | - if (qi->qi_uquotaip) { |
1344 | - IRELE(qi->qi_uquotaip); |
1345 | - qi->qi_uquotaip = NULL; /* paranoia */ |
1346 | - } |
1347 | - if (qi->qi_gquotaip) { |
1348 | - IRELE(qi->qi_gquotaip); |
1349 | - qi->qi_gquotaip = NULL; |
1350 | - } |
1351 | - if (qi->qi_pquotaip) { |
1352 | - IRELE(qi->qi_pquotaip); |
1353 | - qi->qi_pquotaip = NULL; |
1354 | - } |
1355 | + xfs_qm_destroy_quotainos(qi); |
1356 | + mutex_destroy(&qi->qi_tree_lock); |
1357 | mutex_destroy(&qi->qi_quotaofflock); |
1358 | kmem_free(qi); |
1359 | mp->m_quotainfo = NULL; |
1360 | @@ -1619,6 +1615,24 @@ xfs_qm_init_quotainos( |
1361 | return error; |
1362 | } |
1363 | |
1364 | +STATIC void |
1365 | +xfs_qm_destroy_quotainos( |
1366 | + xfs_quotainfo_t *qi) |
1367 | +{ |
1368 | + if (qi->qi_uquotaip) { |
1369 | + IRELE(qi->qi_uquotaip); |
1370 | + qi->qi_uquotaip = NULL; /* paranoia */ |
1371 | + } |
1372 | + if (qi->qi_gquotaip) { |
1373 | + IRELE(qi->qi_gquotaip); |
1374 | + qi->qi_gquotaip = NULL; |
1375 | + } |
1376 | + if (qi->qi_pquotaip) { |
1377 | + IRELE(qi->qi_pquotaip); |
1378 | + qi->qi_pquotaip = NULL; |
1379 | + } |
1380 | +} |
1381 | + |
1382 | STATIC void |
1383 | xfs_qm_dqfree_one( |
1384 | struct xfs_dquot *dqp) |
1385 | diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h |
1386 | index 44b8a6bd5fe1..774cb2db1b89 100644 |
1387 | --- a/include/uapi/linux/libc-compat.h |
1388 | +++ b/include/uapi/linux/libc-compat.h |
1389 | @@ -167,46 +167,99 @@ |
1390 | |
1391 | /* If we did not see any headers from any supported C libraries, |
1392 | * or we are being included in the kernel, then define everything |
1393 | - * that we need. */ |
1394 | + * that we need. Check for previous __UAPI_* definitions to give |
1395 | + * unsupported C libraries a way to opt out of any kernel definition. */ |
1396 | #else /* !defined(__GLIBC__) */ |
1397 | |
1398 | /* Definitions for if.h */ |
1399 | +#ifndef __UAPI_DEF_IF_IFCONF |
1400 | #define __UAPI_DEF_IF_IFCONF 1 |
1401 | +#endif |
1402 | +#ifndef __UAPI_DEF_IF_IFMAP |
1403 | #define __UAPI_DEF_IF_IFMAP 1 |
1404 | +#endif |
1405 | +#ifndef __UAPI_DEF_IF_IFNAMSIZ |
1406 | #define __UAPI_DEF_IF_IFNAMSIZ 1 |
1407 | +#endif |
1408 | +#ifndef __UAPI_DEF_IF_IFREQ |
1409 | #define __UAPI_DEF_IF_IFREQ 1 |
1410 | +#endif |
1411 | /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ |
1412 | +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS |
1413 | #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 |
1414 | +#endif |
1415 | /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ |
1416 | +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO |
1417 | #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 |
1418 | +#endif |
1419 | |
1420 | /* Definitions for in.h */ |
1421 | +#ifndef __UAPI_DEF_IN_ADDR |
1422 | #define __UAPI_DEF_IN_ADDR 1 |
1423 | +#endif |
1424 | +#ifndef __UAPI_DEF_IN_IPPROTO |
1425 | #define __UAPI_DEF_IN_IPPROTO 1 |
1426 | +#endif |
1427 | +#ifndef __UAPI_DEF_IN_PKTINFO |
1428 | #define __UAPI_DEF_IN_PKTINFO 1 |
1429 | +#endif |
1430 | +#ifndef __UAPI_DEF_IP_MREQ |
1431 | #define __UAPI_DEF_IP_MREQ 1 |
1432 | +#endif |
1433 | +#ifndef __UAPI_DEF_SOCKADDR_IN |
1434 | #define __UAPI_DEF_SOCKADDR_IN 1 |
1435 | +#endif |
1436 | +#ifndef __UAPI_DEF_IN_CLASS |
1437 | #define __UAPI_DEF_IN_CLASS 1 |
1438 | +#endif |
1439 | |
1440 | /* Definitions for in6.h */ |
1441 | +#ifndef __UAPI_DEF_IN6_ADDR |
1442 | #define __UAPI_DEF_IN6_ADDR 1 |
1443 | +#endif |
1444 | +#ifndef __UAPI_DEF_IN6_ADDR_ALT |
1445 | #define __UAPI_DEF_IN6_ADDR_ALT 1 |
1446 | +#endif |
1447 | +#ifndef __UAPI_DEF_SOCKADDR_IN6 |
1448 | #define __UAPI_DEF_SOCKADDR_IN6 1 |
1449 | +#endif |
1450 | +#ifndef __UAPI_DEF_IPV6_MREQ |
1451 | #define __UAPI_DEF_IPV6_MREQ 1 |
1452 | +#endif |
1453 | +#ifndef __UAPI_DEF_IPPROTO_V6 |
1454 | #define __UAPI_DEF_IPPROTO_V6 1 |
1455 | +#endif |
1456 | +#ifndef __UAPI_DEF_IPV6_OPTIONS |
1457 | #define __UAPI_DEF_IPV6_OPTIONS 1 |
1458 | +#endif |
1459 | +#ifndef __UAPI_DEF_IN6_PKTINFO |
1460 | #define __UAPI_DEF_IN6_PKTINFO 1 |
1461 | +#endif |
1462 | +#ifndef __UAPI_DEF_IP6_MTUINFO |
1463 | #define __UAPI_DEF_IP6_MTUINFO 1 |
1464 | +#endif |
1465 | |
1466 | /* Definitions for ipx.h */ |
1467 | +#ifndef __UAPI_DEF_SOCKADDR_IPX |
1468 | #define __UAPI_DEF_SOCKADDR_IPX 1 |
1469 | +#endif |
1470 | +#ifndef __UAPI_DEF_IPX_ROUTE_DEFINITION |
1471 | #define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 |
1472 | +#endif |
1473 | +#ifndef __UAPI_DEF_IPX_INTERFACE_DEFINITION |
1474 | #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 |
1475 | +#endif |
1476 | +#ifndef __UAPI_DEF_IPX_CONFIG_DATA |
1477 | #define __UAPI_DEF_IPX_CONFIG_DATA 1 |
1478 | +#endif |
1479 | +#ifndef __UAPI_DEF_IPX_ROUTE_DEF |
1480 | #define __UAPI_DEF_IPX_ROUTE_DEF 1 |
1481 | +#endif |
1482 | |
1483 | /* Definitions for xattr.h */ |
1484 | +#ifndef __UAPI_DEF_XATTR |
1485 | #define __UAPI_DEF_XATTR 1 |
1486 | +#endif |
1487 | |
1488 | #endif /* __GLIBC__ */ |
1489 | |
1490 | diff --git a/kernel/irq/debug.h b/kernel/irq/debug.h |
1491 | index e75e29e4434a..3514d955af94 100644 |
1492 | --- a/kernel/irq/debug.h |
1493 | +++ b/kernel/irq/debug.h |
1494 | @@ -11,6 +11,11 @@ |
1495 | |
1496 | static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc) |
1497 | { |
1498 | + static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5); |
1499 | + |
1500 | + if (!__ratelimit(&ratelimit)) |
1501 | + return; |
1502 | + |
1503 | printk("irq %d, desc: %p, depth: %d, count: %d, unhandled: %d\n", |
1504 | irq, desc, desc->depth, desc->irq_count, desc->irqs_unhandled); |
1505 | printk("->handle_irq(): %p, ", desc->handle_irq); |
1506 | diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c |
1507 | index 54fd2fed36e9..c93729661be0 100644 |
1508 | --- a/kernel/time/hrtimer.c |
1509 | +++ b/kernel/time/hrtimer.c |
1510 | @@ -1134,7 +1134,12 @@ static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, |
1511 | |
1512 | cpu_base = raw_cpu_ptr(&hrtimer_bases); |
1513 | |
1514 | - if (clock_id == CLOCK_REALTIME && mode != HRTIMER_MODE_ABS) |
1515 | + /* |
1516 | + * POSIX magic: Relative CLOCK_REALTIME timers are not affected by |
1517 | + * clock modifications, so they needs to become CLOCK_MONOTONIC to |
1518 | + * ensure POSIX compliance. |
1519 | + */ |
1520 | + if (clock_id == CLOCK_REALTIME && mode & HRTIMER_MODE_REL) |
1521 | clock_id = CLOCK_MONOTONIC; |
1522 | |
1523 | base = hrtimer_clockid_to_base(clock_id); |
1524 | diff --git a/lib/mpi/longlong.h b/lib/mpi/longlong.h |
1525 | index 93336502af08..0f64fcee4ccd 100644 |
1526 | --- a/lib/mpi/longlong.h |
1527 | +++ b/lib/mpi/longlong.h |
1528 | @@ -671,7 +671,23 @@ do { \ |
1529 | ************** MIPS/64 ************** |
1530 | ***************************************/ |
1531 | #if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64 |
1532 | -#if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4) |
1533 | +#if defined(__mips_isa_rev) && __mips_isa_rev >= 6 |
1534 | +/* |
1535 | + * GCC ends up emitting a __multi3 intrinsic call for MIPS64r6 with the plain C |
1536 | + * code below, so we special case MIPS64r6 until the compiler can do better. |
1537 | + */ |
1538 | +#define umul_ppmm(w1, w0, u, v) \ |
1539 | +do { \ |
1540 | + __asm__ ("dmulu %0,%1,%2" \ |
1541 | + : "=d" ((UDItype)(w0)) \ |
1542 | + : "d" ((UDItype)(u)), \ |
1543 | + "d" ((UDItype)(v))); \ |
1544 | + __asm__ ("dmuhu %0,%1,%2" \ |
1545 | + : "=d" ((UDItype)(w1)) \ |
1546 | + : "d" ((UDItype)(u)), \ |
1547 | + "d" ((UDItype)(v))); \ |
1548 | +} while (0) |
1549 | +#elif (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4) |
1550 | #define umul_ppmm(w1, w0, u, v) \ |
1551 | do { \ |
1552 | typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \ |
1553 | diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c |
1554 | index 131e6aa954bc..a2fcf7bdb597 100644 |
1555 | --- a/net/ipv6/ip6_tunnel.c |
1556 | +++ b/net/ipv6/ip6_tunnel.c |
1557 | @@ -1127,8 +1127,13 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield, |
1558 | max_headroom += 8; |
1559 | mtu -= 8; |
1560 | } |
1561 | - if (mtu < IPV6_MIN_MTU) |
1562 | - mtu = IPV6_MIN_MTU; |
1563 | + if (skb->protocol == htons(ETH_P_IPV6)) { |
1564 | + if (mtu < IPV6_MIN_MTU) |
1565 | + mtu = IPV6_MIN_MTU; |
1566 | + } else if (mtu < 576) { |
1567 | + mtu = 576; |
1568 | + } |
1569 | + |
1570 | if (skb_dst(skb) && !t->parms.collect_md) |
1571 | skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu); |
1572 | if (skb->len - t->tun_hlen - eth_hlen > mtu && !skb_is_gso(skb)) { |
1573 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
1574 | index 6e8bacb0b458..a8f80bd20c55 100644 |
1575 | --- a/net/ipv6/route.c |
1576 | +++ b/net/ipv6/route.c |
1577 | @@ -1651,6 +1651,7 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, |
1578 | } |
1579 | |
1580 | rt->dst.flags |= DST_HOST; |
1581 | + rt->dst.input = ip6_input; |
1582 | rt->dst.output = ip6_output; |
1583 | atomic_set(&rt->dst.__refcnt, 1); |
1584 | rt->rt6i_gateway = fl6->daddr; |
1585 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c |
1586 | index 439e597fd374..404284a14d75 100644 |
1587 | --- a/net/mac80211/rx.c |
1588 | +++ b/net/mac80211/rx.c |
1589 | @@ -3611,6 +3611,8 @@ static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx) |
1590 | } |
1591 | return true; |
1592 | case NL80211_IFTYPE_MESH_POINT: |
1593 | + if (ether_addr_equal(sdata->vif.addr, hdr->addr2)) |
1594 | + return false; |
1595 | if (multicast) |
1596 | return true; |
1597 | return ether_addr_equal(sdata->vif.addr, hdr->addr1); |
1598 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
1599 | index fd5b9d573b38..8cdd6bbe2efa 100644 |
1600 | --- a/net/sctp/socket.c |
1601 | +++ b/net/sctp/socket.c |
1602 | @@ -4765,7 +4765,7 @@ static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optv |
1603 | len = sizeof(int); |
1604 | if (put_user(len, optlen)) |
1605 | return -EFAULT; |
1606 | - if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int))) |
1607 | + if (copy_to_user(optval, &sctp_sk(sk)->autoclose, len)) |
1608 | return -EFAULT; |
1609 | return 0; |
1610 | } |
1611 | @@ -5342,6 +5342,9 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len, |
1612 | err = -EFAULT; |
1613 | goto out; |
1614 | } |
1615 | + /* XXX: We should have accounted for sizeof(struct sctp_getaddrs) too, |
1616 | + * but we can't change it anymore. |
1617 | + */ |
1618 | if (put_user(bytes_copied, optlen)) |
1619 | err = -EFAULT; |
1620 | out: |
1621 | @@ -5778,7 +5781,7 @@ static int sctp_getsockopt_maxseg(struct sock *sk, int len, |
1622 | params.assoc_id = 0; |
1623 | } else if (len >= sizeof(struct sctp_assoc_value)) { |
1624 | len = sizeof(struct sctp_assoc_value); |
1625 | - if (copy_from_user(¶ms, optval, sizeof(params))) |
1626 | + if (copy_from_user(¶ms, optval, len)) |
1627 | return -EFAULT; |
1628 | } else |
1629 | return -EINVAL; |
1630 | @@ -5947,7 +5950,9 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len, |
1631 | |
1632 | if (len < sizeof(struct sctp_authkeyid)) |
1633 | return -EINVAL; |
1634 | - if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid))) |
1635 | + |
1636 | + len = sizeof(struct sctp_authkeyid); |
1637 | + if (copy_from_user(&val, optval, len)) |
1638 | return -EFAULT; |
1639 | |
1640 | asoc = sctp_id2assoc(sk, val.scact_assoc_id); |
1641 | @@ -5959,7 +5964,6 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len, |
1642 | else |
1643 | val.scact_keynumber = ep->active_key_id; |
1644 | |
1645 | - len = sizeof(struct sctp_authkeyid); |
1646 | if (put_user(len, optlen)) |
1647 | return -EFAULT; |
1648 | if (copy_to_user(optval, &val, len)) |
1649 | @@ -5985,7 +5989,7 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len, |
1650 | if (len < sizeof(struct sctp_authchunks)) |
1651 | return -EINVAL; |
1652 | |
1653 | - if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks))) |
1654 | + if (copy_from_user(&val, optval, sizeof(val))) |
1655 | return -EFAULT; |
1656 | |
1657 | to = p->gauth_chunks; |
1658 | @@ -6030,7 +6034,7 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len, |
1659 | if (len < sizeof(struct sctp_authchunks)) |
1660 | return -EINVAL; |
1661 | |
1662 | - if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks))) |
1663 | + if (copy_from_user(&val, optval, sizeof(val))) |
1664 | return -EFAULT; |
1665 | |
1666 | to = p->gauth_chunks; |
1667 | diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c |
1668 | index 52d74760fb68..ca68db207965 100644 |
1669 | --- a/net/tipc/bearer.c |
1670 | +++ b/net/tipc/bearer.c |
1671 | @@ -322,6 +322,7 @@ static int tipc_enable_bearer(struct net *net, const char *name, |
1672 | if (res) { |
1673 | pr_warn("Bearer <%s> rejected, enable failure (%d)\n", |
1674 | name, -res); |
1675 | + kfree(b); |
1676 | return -EINVAL; |
1677 | } |
1678 | |
1679 | @@ -345,8 +346,10 @@ static int tipc_enable_bearer(struct net *net, const char *name, |
1680 | if (skb) |
1681 | tipc_bearer_xmit_skb(net, bearer_id, skb, &b->bcast_addr); |
1682 | |
1683 | - if (tipc_mon_create(net, bearer_id)) |
1684 | + if (tipc_mon_create(net, bearer_id)) { |
1685 | + bearer_disable(net, b); |
1686 | return -ENOMEM; |
1687 | + } |
1688 | |
1689 | pr_info("Enabled bearer <%s>, discovery domain %s, priority %u\n", |
1690 | name, |
1691 | diff --git a/net/tipc/monitor.c b/net/tipc/monitor.c |
1692 | index 9e109bb1a207..0fcfb3916dcf 100644 |
1693 | --- a/net/tipc/monitor.c |
1694 | +++ b/net/tipc/monitor.c |
1695 | @@ -633,9 +633,13 @@ void tipc_mon_delete(struct net *net, int bearer_id) |
1696 | { |
1697 | struct tipc_net *tn = tipc_net(net); |
1698 | struct tipc_monitor *mon = tipc_monitor(net, bearer_id); |
1699 | - struct tipc_peer *self = get_self(net, bearer_id); |
1700 | + struct tipc_peer *self; |
1701 | struct tipc_peer *peer, *tmp; |
1702 | |
1703 | + if (!mon) |
1704 | + return; |
1705 | + |
1706 | + self = get_self(net, bearer_id); |
1707 | write_lock_bh(&mon->lock); |
1708 | tn->monitors[bearer_id] = NULL; |
1709 | list_for_each_entry_safe(peer, tmp, &self->list, list) { |
1710 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
1711 | index 91722e97cdd5..a89061d59c74 100644 |
1712 | --- a/net/wireless/nl80211.c |
1713 | +++ b/net/wireless/nl80211.c |
1714 | @@ -10777,7 +10777,8 @@ static int nl80211_nan_add_func(struct sk_buff *skb, |
1715 | break; |
1716 | case NL80211_NAN_FUNC_FOLLOW_UP: |
1717 | if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID] || |
1718 | - !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID]) { |
1719 | + !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID] || |
1720 | + !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST]) { |
1721 | err = -EINVAL; |
1722 | goto out; |
1723 | } |
1724 | diff --git a/sound/soc/codecs/nau8825.c b/sound/soc/codecs/nau8825.c |
1725 | index f9f2737c4ad2..a4871c4adcb0 100644 |
1726 | --- a/sound/soc/codecs/nau8825.c |
1727 | +++ b/sound/soc/codecs/nau8825.c |
1728 | @@ -882,6 +882,7 @@ static int nau8825_adc_event(struct snd_soc_dapm_widget *w, |
1729 | |
1730 | switch (event) { |
1731 | case SND_SOC_DAPM_POST_PMU: |
1732 | + msleep(125); |
1733 | regmap_update_bits(nau8825->regmap, NAU8825_REG_ENA_CTRL, |
1734 | NAU8825_ENABLE_ADC, NAU8825_ENABLE_ADC); |
1735 | break; |