Annotation of /trunk/kernel-alx/patches-4.9/0235-4.9.136-all-fixes.patch
Parent Directory | Revision Log
Revision 3245 -
(hide annotations)
(download)
Mon Nov 12 12:10:50 2018 UTC (5 years, 10 months ago) by niro
File size: 182625 byte(s)
Mon Nov 12 12:10:50 2018 UTC (5 years, 10 months ago) by niro
File size: 182625 byte(s)
-linux-4.9.136
1 | niro | 3245 | diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt |
2 | index f9f67be8d3c3..c708a50b060e 100644 | ||
3 | --- a/Documentation/kernel-parameters.txt | ||
4 | +++ b/Documentation/kernel-parameters.txt | ||
5 | @@ -313,7 +313,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | ||
6 | This facility can be used to prevent such uncontrolled | ||
7 | GPE floodings. | ||
8 | Format: <int> | ||
9 | - Support masking of GPEs numbered from 0x00 to 0x7f. | ||
10 | |||
11 | acpi_no_auto_serialize [HW,ACPI] | ||
12 | Disable auto-serialization of AML methods | ||
13 | diff --git a/Makefile b/Makefile | ||
14 | index 3678e4d19ebc..79b8f3a44f74 100644 | ||
15 | --- a/Makefile | ||
16 | +++ b/Makefile | ||
17 | @@ -1,6 +1,6 @@ | ||
18 | VERSION = 4 | ||
19 | PATCHLEVEL = 9 | ||
20 | -SUBLEVEL = 135 | ||
21 | +SUBLEVEL = 136 | ||
22 | EXTRAVERSION = | ||
23 | NAME = Roaring Lionus | ||
24 | |||
25 | diff --git a/arch/arm/boot/compressed/efi-header.S b/arch/arm/boot/compressed/efi-header.S | ||
26 | index 9d5dc4fda3c1..3f7d1b74c5e0 100644 | ||
27 | --- a/arch/arm/boot/compressed/efi-header.S | ||
28 | +++ b/arch/arm/boot/compressed/efi-header.S | ||
29 | @@ -17,14 +17,12 @@ | ||
30 | @ there. | ||
31 | .inst 'M' | ('Z' << 8) | (0x1310 << 16) @ tstne r0, #0x4d000 | ||
32 | #else | ||
33 | - mov r0, r0 | ||
34 | + W(mov) r0, r0 | ||
35 | #endif | ||
36 | .endm | ||
37 | |||
38 | .macro __EFI_HEADER | ||
39 | #ifdef CONFIG_EFI_STUB | ||
40 | - b __efi_start | ||
41 | - | ||
42 | .set start_offset, __efi_start - start | ||
43 | .org start + 0x3c | ||
44 | @ | ||
45 | diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S | ||
46 | index fc6d541549a2..2d7f2bb0d66a 100644 | ||
47 | --- a/arch/arm/boot/compressed/head.S | ||
48 | +++ b/arch/arm/boot/compressed/head.S | ||
49 | @@ -130,19 +130,22 @@ start: | ||
50 | .rept 7 | ||
51 | __nop | ||
52 | .endr | ||
53 | - ARM( mov r0, r0 ) | ||
54 | - ARM( b 1f ) | ||
55 | - THUMB( badr r12, 1f ) | ||
56 | - THUMB( bx r12 ) | ||
57 | +#ifndef CONFIG_THUMB2_KERNEL | ||
58 | + mov r0, r0 | ||
59 | +#else | ||
60 | + AR_CLASS( sub pc, pc, #3 ) @ A/R: switch to Thumb2 mode | ||
61 | + M_CLASS( nop.w ) @ M: already in Thumb2 mode | ||
62 | + .thumb | ||
63 | +#endif | ||
64 | + W(b) 1f | ||
65 | |||
66 | .word _magic_sig @ Magic numbers to help the loader | ||
67 | .word _magic_start @ absolute load/run zImage address | ||
68 | .word _magic_end @ zImage end address | ||
69 | .word 0x04030201 @ endianness flag | ||
70 | |||
71 | - THUMB( .thumb ) | ||
72 | -1: __EFI_HEADER | ||
73 | - | ||
74 | + __EFI_HEADER | ||
75 | +1: | ||
76 | ARM_BE8( setend be ) @ go BE8 if compiled for BE8 | ||
77 | AR_CLASS( mrs r9, cpsr ) | ||
78 | #ifdef CONFIG_ARM_VIRT_EXT | ||
79 | diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi | ||
80 | index c51b88ee3cec..31563007772c 100644 | ||
81 | --- a/arch/arm/boot/dts/bcm283x.dtsi | ||
82 | +++ b/arch/arm/boot/dts/bcm283x.dtsi | ||
83 | @@ -3,6 +3,11 @@ | ||
84 | #include <dt-bindings/clock/bcm2835-aux.h> | ||
85 | #include <dt-bindings/gpio/gpio.h> | ||
86 | |||
87 | +/* firmware-provided startup stubs live here, where the secondary CPUs are | ||
88 | + * spinning. | ||
89 | + */ | ||
90 | +/memreserve/ 0x00000000 0x00001000; | ||
91 | + | ||
92 | /* This include file covers the common peripherals and configuration between | ||
93 | * bcm2835 and bcm2836 implementations, leaving the CPU configuration to | ||
94 | * bcm2835.dtsi and bcm2836.dtsi. | ||
95 | diff --git a/arch/arm/boot/dts/bcm63138.dtsi b/arch/arm/boot/dts/bcm63138.dtsi | ||
96 | index d0560e8cd6de..547369c69e96 100644 | ||
97 | --- a/arch/arm/boot/dts/bcm63138.dtsi | ||
98 | +++ b/arch/arm/boot/dts/bcm63138.dtsi | ||
99 | @@ -105,21 +105,23 @@ | ||
100 | global_timer: timer@1e200 { | ||
101 | compatible = "arm,cortex-a9-global-timer"; | ||
102 | reg = <0x1e200 0x20>; | ||
103 | - interrupts = <GIC_PPI 11 IRQ_TYPE_LEVEL_HIGH>; | ||
104 | + interrupts = <GIC_PPI 11 IRQ_TYPE_EDGE_RISING>; | ||
105 | clocks = <&axi_clk>; | ||
106 | }; | ||
107 | |||
108 | local_timer: local-timer@1e600 { | ||
109 | compatible = "arm,cortex-a9-twd-timer"; | ||
110 | reg = <0x1e600 0x20>; | ||
111 | - interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_HIGH>; | ||
112 | + interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | | ||
113 | + IRQ_TYPE_EDGE_RISING)>; | ||
114 | clocks = <&axi_clk>; | ||
115 | }; | ||
116 | |||
117 | twd_watchdog: watchdog@1e620 { | ||
118 | compatible = "arm,cortex-a9-twd-wdt"; | ||
119 | reg = <0x1e620 0x20>; | ||
120 | - interrupts = <GIC_PPI 14 IRQ_TYPE_LEVEL_HIGH>; | ||
121 | + interrupts = <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | | ||
122 | + IRQ_TYPE_LEVEL_HIGH)>; | ||
123 | }; | ||
124 | |||
125 | armpll: armpll { | ||
126 | @@ -157,7 +159,7 @@ | ||
127 | serial0: serial@600 { | ||
128 | compatible = "brcm,bcm6345-uart"; | ||
129 | reg = <0x600 0x1b>; | ||
130 | - interrupts = <GIC_SPI 32 0>; | ||
131 | + interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>; | ||
132 | clocks = <&periph_clk>; | ||
133 | clock-names = "periph"; | ||
134 | status = "disabled"; | ||
135 | @@ -166,7 +168,7 @@ | ||
136 | serial1: serial@620 { | ||
137 | compatible = "brcm,bcm6345-uart"; | ||
138 | reg = <0x620 0x1b>; | ||
139 | - interrupts = <GIC_SPI 33 0>; | ||
140 | + interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>; | ||
141 | clocks = <&periph_clk>; | ||
142 | clock-names = "periph"; | ||
143 | status = "disabled"; | ||
144 | @@ -179,7 +181,7 @@ | ||
145 | reg = <0x2000 0x600>, <0xf0 0x10>; | ||
146 | reg-names = "nand", "nand-int-base"; | ||
147 | status = "disabled"; | ||
148 | - interrupts = <GIC_SPI 38 0>; | ||
149 | + interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>; | ||
150 | interrupt-names = "nand"; | ||
151 | }; | ||
152 | |||
153 | diff --git a/arch/arm/boot/dts/imx53-qsb-common.dtsi b/arch/arm/boot/dts/imx53-qsb-common.dtsi | ||
154 | index c05e7cfd0cbc..c8a6a6868c46 100644 | ||
155 | --- a/arch/arm/boot/dts/imx53-qsb-common.dtsi | ||
156 | +++ b/arch/arm/boot/dts/imx53-qsb-common.dtsi | ||
157 | @@ -130,6 +130,17 @@ | ||
158 | }; | ||
159 | }; | ||
160 | |||
161 | +&cpu0 { | ||
162 | + /* CPU rated to 1GHz, not 1.2GHz as per the default settings */ | ||
163 | + operating-points = < | ||
164 | + /* kHz uV */ | ||
165 | + 166666 850000 | ||
166 | + 400000 900000 | ||
167 | + 800000 1050000 | ||
168 | + 1000000 1200000 | ||
169 | + >; | ||
170 | +}; | ||
171 | + | ||
172 | &esdhc1 { | ||
173 | pinctrl-names = "default"; | ||
174 | pinctrl-0 = <&pinctrl_esdhc1>; | ||
175 | diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c | ||
176 | index ff0eed23ddf1..66e5d8765601 100644 | ||
177 | --- a/arch/arm/mm/ioremap.c | ||
178 | +++ b/arch/arm/mm/ioremap.c | ||
179 | @@ -473,7 +473,7 @@ void pci_ioremap_set_mem_type(int mem_type) | ||
180 | |||
181 | int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr) | ||
182 | { | ||
183 | - BUG_ON(offset + SZ_64K > IO_SPACE_LIMIT); | ||
184 | + BUG_ON(offset + SZ_64K - 1 > IO_SPACE_LIMIT); | ||
185 | |||
186 | return ioremap_page_range(PCI_IO_VIRT_BASE + offset, | ||
187 | PCI_IO_VIRT_BASE + offset + SZ_64K, | ||
188 | diff --git a/arch/mips/include/uapi/asm/inst.h b/arch/mips/include/uapi/asm/inst.h | ||
189 | index 77429d1622b3..711d9b8465b8 100644 | ||
190 | --- a/arch/mips/include/uapi/asm/inst.h | ||
191 | +++ b/arch/mips/include/uapi/asm/inst.h | ||
192 | @@ -964,7 +964,7 @@ struct mm16_r3_format { /* Load from global pointer format */ | ||
193 | struct mm16_r5_format { /* Load/store from stack pointer format */ | ||
194 | __BITFIELD_FIELD(unsigned int opcode : 6, | ||
195 | __BITFIELD_FIELD(unsigned int rt : 5, | ||
196 | - __BITFIELD_FIELD(signed int simmediate : 5, | ||
197 | + __BITFIELD_FIELD(unsigned int imm : 5, | ||
198 | __BITFIELD_FIELD(unsigned int : 16, /* Ignored */ | ||
199 | ;)))) | ||
200 | }; | ||
201 | diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c | ||
202 | index ba315e523b33..1cc133e7026f 100644 | ||
203 | --- a/arch/mips/kernel/process.c | ||
204 | +++ b/arch/mips/kernel/process.c | ||
205 | @@ -212,7 +212,7 @@ static inline int is_ra_save_ins(union mips_instruction *ip, int *poff) | ||
206 | if (ip->mm16_r5_format.rt != 31) | ||
207 | return 0; | ||
208 | |||
209 | - *poff = ip->mm16_r5_format.simmediate; | ||
210 | + *poff = ip->mm16_r5_format.imm; | ||
211 | *poff = (*poff << 2) / sizeof(ulong); | ||
212 | return 1; | ||
213 | |||
214 | @@ -346,6 +346,7 @@ static int get_frame_info(struct mips_frame_info *info) | ||
215 | bool is_mmips = IS_ENABLED(CONFIG_CPU_MICROMIPS); | ||
216 | union mips_instruction insn, *ip, *ip_end; | ||
217 | const unsigned int max_insns = 128; | ||
218 | + unsigned int last_insn_size = 0; | ||
219 | unsigned int i; | ||
220 | |||
221 | info->pc_offset = -1; | ||
222 | @@ -357,15 +358,19 @@ static int get_frame_info(struct mips_frame_info *info) | ||
223 | |||
224 | ip_end = (void *)ip + info->func_size; | ||
225 | |||
226 | - for (i = 0; i < max_insns && ip < ip_end; i++, ip++) { | ||
227 | + for (i = 0; i < max_insns && ip < ip_end; i++) { | ||
228 | + ip = (void *)ip + last_insn_size; | ||
229 | if (is_mmips && mm_insn_16bit(ip->halfword[0])) { | ||
230 | insn.halfword[0] = 0; | ||
231 | insn.halfword[1] = ip->halfword[0]; | ||
232 | + last_insn_size = 2; | ||
233 | } else if (is_mmips) { | ||
234 | insn.halfword[0] = ip->halfword[1]; | ||
235 | insn.halfword[1] = ip->halfword[0]; | ||
236 | + last_insn_size = 4; | ||
237 | } else { | ||
238 | insn.word = ip->word; | ||
239 | + last_insn_size = 4; | ||
240 | } | ||
241 | |||
242 | if (is_jump_ins(&insn)) | ||
243 | @@ -387,8 +392,6 @@ static int get_frame_info(struct mips_frame_info *info) | ||
244 | tmp = (ip->halfword[0] >> 1); | ||
245 | info->frame_size = -(signed short)(tmp & 0xf); | ||
246 | } | ||
247 | - ip = (void *) &ip->halfword[1]; | ||
248 | - ip--; | ||
249 | } else | ||
250 | #endif | ||
251 | info->frame_size = - ip->i_format.simmediate; | ||
252 | diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig | ||
253 | index 8b4152f3a764..cef42d4be292 100644 | ||
254 | --- a/arch/sparc/Kconfig | ||
255 | +++ b/arch/sparc/Kconfig | ||
256 | @@ -290,9 +290,13 @@ config NUMA | ||
257 | depends on SPARC64 && SMP | ||
258 | |||
259 | config NODES_SHIFT | ||
260 | - int | ||
261 | - default "4" | ||
262 | + int "Maximum NUMA Nodes (as a power of 2)" | ||
263 | + range 4 5 if SPARC64 | ||
264 | + default "5" | ||
265 | depends on NEED_MULTIPLE_NODES | ||
266 | + help | ||
267 | + Specify the maximum number of NUMA Nodes available on the target | ||
268 | + system. Increases memory reserved to accommodate various tables. | ||
269 | |||
270 | # Some NUMA nodes have memory ranges that span | ||
271 | # other nodes. Even though a pfn is valid and | ||
272 | diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c | ||
273 | index b2722ed31053..349cb83f7b5f 100644 | ||
274 | --- a/arch/sparc/mm/tlb.c | ||
275 | +++ b/arch/sparc/mm/tlb.c | ||
276 | @@ -163,13 +163,10 @@ static void tlb_batch_pmd_scan(struct mm_struct *mm, unsigned long vaddr, | ||
277 | pte_unmap(pte); | ||
278 | } | ||
279 | |||
280 | -void set_pmd_at(struct mm_struct *mm, unsigned long addr, | ||
281 | - pmd_t *pmdp, pmd_t pmd) | ||
282 | -{ | ||
283 | - pmd_t orig = *pmdp; | ||
284 | - | ||
285 | - *pmdp = pmd; | ||
286 | |||
287 | +static void __set_pmd_acct(struct mm_struct *mm, unsigned long addr, | ||
288 | + pmd_t orig, pmd_t pmd) | ||
289 | +{ | ||
290 | if (mm == &init_mm) | ||
291 | return; | ||
292 | |||
293 | @@ -219,6 +216,15 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr, | ||
294 | } | ||
295 | } | ||
296 | |||
297 | +void set_pmd_at(struct mm_struct *mm, unsigned long addr, | ||
298 | + pmd_t *pmdp, pmd_t pmd) | ||
299 | +{ | ||
300 | + pmd_t orig = *pmdp; | ||
301 | + | ||
302 | + *pmdp = pmd; | ||
303 | + __set_pmd_acct(mm, addr, orig, pmd); | ||
304 | +} | ||
305 | + | ||
306 | static inline pmd_t pmdp_establish(struct vm_area_struct *vma, | ||
307 | unsigned long address, pmd_t *pmdp, pmd_t pmd) | ||
308 | { | ||
309 | @@ -227,6 +233,7 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma, | ||
310 | do { | ||
311 | old = *pmdp; | ||
312 | } while (cmpxchg64(&pmdp->pmd, old.pmd, pmd.pmd) != old.pmd); | ||
313 | + __set_pmd_acct(vma->vm_mm, address, old, pmd); | ||
314 | |||
315 | return old; | ||
316 | } | ||
317 | diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c | ||
318 | index 6bc36944a8c1..8c2a9fa0caf3 100644 | ||
319 | --- a/arch/x86/events/intel/uncore_snbep.c | ||
320 | +++ b/arch/x86/events/intel/uncore_snbep.c | ||
321 | @@ -3767,16 +3767,16 @@ static const struct pci_device_id skx_uncore_pci_ids[] = { | ||
322 | .driver_data = UNCORE_PCI_DEV_FULL_DATA(21, 5, SKX_PCI_UNCORE_M2PCIE, 3), | ||
323 | }, | ||
324 | { /* M3UPI0 Link 0 */ | ||
325 | - PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204C), | ||
326 | - .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 0, SKX_PCI_UNCORE_M3UPI, 0), | ||
327 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D), | ||
328 | + .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 1, SKX_PCI_UNCORE_M3UPI, 0), | ||
329 | }, | ||
330 | { /* M3UPI0 Link 1 */ | ||
331 | - PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D), | ||
332 | - .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 1, SKX_PCI_UNCORE_M3UPI, 1), | ||
333 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204E), | ||
334 | + .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 2, SKX_PCI_UNCORE_M3UPI, 1), | ||
335 | }, | ||
336 | { /* M3UPI1 Link 2 */ | ||
337 | - PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204C), | ||
338 | - .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 4, SKX_PCI_UNCORE_M3UPI, 2), | ||
339 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D), | ||
340 | + .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 5, SKX_PCI_UNCORE_M3UPI, 2), | ||
341 | }, | ||
342 | { /* end: all zeroes */ } | ||
343 | }; | ||
344 | diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h | ||
345 | index 25152843dd1f..8554f960e21b 100644 | ||
346 | --- a/arch/x86/include/asm/fixmap.h | ||
347 | +++ b/arch/x86/include/asm/fixmap.h | ||
348 | @@ -14,16 +14,6 @@ | ||
349 | #ifndef _ASM_X86_FIXMAP_H | ||
350 | #define _ASM_X86_FIXMAP_H | ||
351 | |||
352 | -/* | ||
353 | - * Exposed to assembly code for setting up initial page tables. Cannot be | ||
354 | - * calculated in assembly code (fixmap entries are an enum), but is sanity | ||
355 | - * checked in the actual fixmap C code to make sure that the fixmap is | ||
356 | - * covered fully. | ||
357 | - */ | ||
358 | -#define FIXMAP_PMD_NUM 2 | ||
359 | -/* fixmap starts downwards from the 507th entry in level2_fixmap_pgt */ | ||
360 | -#define FIXMAP_PMD_TOP 507 | ||
361 | - | ||
362 | #ifndef __ASSEMBLY__ | ||
363 | #include <linux/kernel.h> | ||
364 | #include <asm/acpi.h> | ||
365 | diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h | ||
366 | index 84f58de08c2b..2cb5d0f13641 100644 | ||
367 | --- a/arch/x86/include/asm/percpu.h | ||
368 | +++ b/arch/x86/include/asm/percpu.h | ||
369 | @@ -184,22 +184,22 @@ do { \ | ||
370 | typeof(var) pfo_ret__; \ | ||
371 | switch (sizeof(var)) { \ | ||
372 | case 1: \ | ||
373 | - asm(op "b "__percpu_arg(1)",%0" \ | ||
374 | + asm volatile(op "b "__percpu_arg(1)",%0"\ | ||
375 | : "=q" (pfo_ret__) \ | ||
376 | : "m" (var)); \ | ||
377 | break; \ | ||
378 | case 2: \ | ||
379 | - asm(op "w "__percpu_arg(1)",%0" \ | ||
380 | + asm volatile(op "w "__percpu_arg(1)",%0"\ | ||
381 | : "=r" (pfo_ret__) \ | ||
382 | : "m" (var)); \ | ||
383 | break; \ | ||
384 | case 4: \ | ||
385 | - asm(op "l "__percpu_arg(1)",%0" \ | ||
386 | + asm volatile(op "l "__percpu_arg(1)",%0"\ | ||
387 | : "=r" (pfo_ret__) \ | ||
388 | : "m" (var)); \ | ||
389 | break; \ | ||
390 | case 8: \ | ||
391 | - asm(op "q "__percpu_arg(1)",%0" \ | ||
392 | + asm volatile(op "q "__percpu_arg(1)",%0"\ | ||
393 | : "=r" (pfo_ret__) \ | ||
394 | : "m" (var)); \ | ||
395 | break; \ | ||
396 | diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h | ||
397 | index d5c4df98aac3..221a32ed1372 100644 | ||
398 | --- a/arch/x86/include/asm/pgtable_64.h | ||
399 | +++ b/arch/x86/include/asm/pgtable_64.h | ||
400 | @@ -13,14 +13,13 @@ | ||
401 | #include <asm/processor.h> | ||
402 | #include <linux/bitops.h> | ||
403 | #include <linux/threads.h> | ||
404 | -#include <asm/fixmap.h> | ||
405 | |||
406 | extern pud_t level3_kernel_pgt[512]; | ||
407 | extern pud_t level3_ident_pgt[512]; | ||
408 | extern pmd_t level2_kernel_pgt[512]; | ||
409 | extern pmd_t level2_fixmap_pgt[512]; | ||
410 | extern pmd_t level2_ident_pgt[512]; | ||
411 | -extern pte_t level1_fixmap_pgt[512 * FIXMAP_PMD_NUM]; | ||
412 | +extern pte_t level1_fixmap_pgt[512]; | ||
413 | extern pgd_t init_level4_pgt[]; | ||
414 | |||
415 | #define swapper_pg_dir init_level4_pgt | ||
416 | diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c | ||
417 | index 455d8ada9b9a..d39cfb2c6b63 100644 | ||
418 | --- a/arch/x86/kernel/cpu/cyrix.c | ||
419 | +++ b/arch/x86/kernel/cpu/cyrix.c | ||
420 | @@ -253,6 +253,7 @@ static void init_cyrix(struct cpuinfo_x86 *c) | ||
421 | break; | ||
422 | |||
423 | case 4: /* MediaGX/GXm or Geode GXM/GXLV/GX1 */ | ||
424 | + case 11: /* GX1 with inverted Device ID */ | ||
425 | #ifdef CONFIG_PCI | ||
426 | { | ||
427 | u32 vendor, device; | ||
428 | diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S | ||
429 | index b0d6697ab153..9d72cf547c88 100644 | ||
430 | --- a/arch/x86/kernel/head_64.S | ||
431 | +++ b/arch/x86/kernel/head_64.S | ||
432 | @@ -23,7 +23,6 @@ | ||
433 | #include "../entry/calling.h" | ||
434 | #include <asm/export.h> | ||
435 | #include <asm/nospec-branch.h> | ||
436 | -#include <asm/fixmap.h> | ||
437 | |||
438 | #ifdef CONFIG_PARAVIRT | ||
439 | #include <asm/asm-offsets.h> | ||
440 | @@ -494,20 +493,13 @@ NEXT_PAGE(level2_kernel_pgt) | ||
441 | KERNEL_IMAGE_SIZE/PMD_SIZE) | ||
442 | |||
443 | NEXT_PAGE(level2_fixmap_pgt) | ||
444 | - .fill (512 - 4 - FIXMAP_PMD_NUM),8,0 | ||
445 | - pgtno = 0 | ||
446 | - .rept (FIXMAP_PMD_NUM) | ||
447 | - .quad level1_fixmap_pgt + (pgtno << PAGE_SHIFT) - __START_KERNEL_map \ | ||
448 | - + _PAGE_TABLE; | ||
449 | - pgtno = pgtno + 1 | ||
450 | - .endr | ||
451 | - /* 6 MB reserved space + a 2MB hole */ | ||
452 | - .fill 4,8,0 | ||
453 | + .fill 506,8,0 | ||
454 | + .quad level1_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE | ||
455 | + /* 8MB reserved for vsyscalls + a 2MB hole = 4 + 1 entries */ | ||
456 | + .fill 5,8,0 | ||
457 | |||
458 | NEXT_PAGE(level1_fixmap_pgt) | ||
459 | - .rept (FIXMAP_PMD_NUM) | ||
460 | .fill 512,8,0 | ||
461 | - .endr | ||
462 | |||
463 | #undef PMDS | ||
464 | |||
465 | diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c | ||
466 | index 29d465627919..bf9552bebb3c 100644 | ||
467 | --- a/arch/x86/kernel/paravirt.c | ||
468 | +++ b/arch/x86/kernel/paravirt.c | ||
469 | @@ -90,7 +90,7 @@ unsigned paravirt_patch_call(void *insnbuf, | ||
470 | |||
471 | if (len < 5) { | ||
472 | #ifdef CONFIG_RETPOLINE | ||
473 | - WARN_ONCE("Failing to patch indirect CALL in %ps\n", (void *)addr); | ||
474 | + WARN_ONCE(1, "Failing to patch indirect CALL in %ps\n", (void *)addr); | ||
475 | #endif | ||
476 | return len; /* call too long for patch site */ | ||
477 | } | ||
478 | @@ -110,7 +110,7 @@ unsigned paravirt_patch_jmp(void *insnbuf, const void *target, | ||
479 | |||
480 | if (len < 5) { | ||
481 | #ifdef CONFIG_RETPOLINE | ||
482 | - WARN_ONCE("Failing to patch indirect JMP in %ps\n", (void *)addr); | ||
483 | + WARN_ONCE(1, "Failing to patch indirect JMP in %ps\n", (void *)addr); | ||
484 | #endif | ||
485 | return len; /* call too long for patch site */ | ||
486 | } | ||
487 | diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c | ||
488 | index f8a0518d2810..89d1190b9d94 100644 | ||
489 | --- a/arch/x86/kernel/time.c | ||
490 | +++ b/arch/x86/kernel/time.c | ||
491 | @@ -24,7 +24,7 @@ | ||
492 | #include <asm/time.h> | ||
493 | |||
494 | #ifdef CONFIG_X86_64 | ||
495 | -__visible volatile unsigned long jiffies __cacheline_aligned = INITIAL_JIFFIES; | ||
496 | +__visible volatile unsigned long jiffies __cacheline_aligned_in_smp = INITIAL_JIFFIES; | ||
497 | #endif | ||
498 | |||
499 | unsigned long profile_pc(struct pt_regs *regs) | ||
500 | diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c | ||
501 | index 8cbed30feb67..e30baa8ad94f 100644 | ||
502 | --- a/arch/x86/mm/pgtable.c | ||
503 | +++ b/arch/x86/mm/pgtable.c | ||
504 | @@ -536,15 +536,6 @@ void __native_set_fixmap(enum fixed_addresses idx, pte_t pte) | ||
505 | { | ||
506 | unsigned long address = __fix_to_virt(idx); | ||
507 | |||
508 | -#ifdef CONFIG_X86_64 | ||
509 | - /* | ||
510 | - * Ensure that the static initial page tables are covering the | ||
511 | - * fixmap completely. | ||
512 | - */ | ||
513 | - BUILD_BUG_ON(__end_of_permanent_fixed_addresses > | ||
514 | - (FIXMAP_PMD_NUM * PTRS_PER_PTE)); | ||
515 | -#endif | ||
516 | - | ||
517 | if (idx >= __end_of_fixed_addresses) { | ||
518 | BUG(); | ||
519 | return; | ||
520 | diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c | ||
521 | index ebceaba20ad1..c92f75f7ae33 100644 | ||
522 | --- a/arch/x86/xen/mmu.c | ||
523 | +++ b/arch/x86/xen/mmu.c | ||
524 | @@ -1936,7 +1936,7 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn) | ||
525 | * L3_k[511] -> level2_fixmap_pgt */ | ||
526 | convert_pfn_mfn(level3_kernel_pgt); | ||
527 | |||
528 | - /* L3_k[511][508-FIXMAP_PMD_NUM ... 507] -> level1_fixmap_pgt */ | ||
529 | + /* L3_k[511][506] -> level1_fixmap_pgt */ | ||
530 | convert_pfn_mfn(level2_fixmap_pgt); | ||
531 | } | ||
532 | /* We get [511][511] and have Xen's version of level2_kernel_pgt */ | ||
533 | @@ -1970,11 +1970,7 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn) | ||
534 | set_page_prot(level2_ident_pgt, PAGE_KERNEL_RO); | ||
535 | set_page_prot(level2_kernel_pgt, PAGE_KERNEL_RO); | ||
536 | set_page_prot(level2_fixmap_pgt, PAGE_KERNEL_RO); | ||
537 | - | ||
538 | - for (i = 0; i < FIXMAP_PMD_NUM; i++) { | ||
539 | - set_page_prot(level1_fixmap_pgt + i * PTRS_PER_PTE, | ||
540 | - PAGE_KERNEL_RO); | ||
541 | - } | ||
542 | + set_page_prot(level1_fixmap_pgt, PAGE_KERNEL_RO); | ||
543 | |||
544 | /* Pin down new L4 */ | ||
545 | pin_pagetable_pfn(MMUEXT_PIN_L4_TABLE, | ||
546 | diff --git a/crypto/shash.c b/crypto/shash.c | ||
547 | index d5bd2f05d036..4f047c7eeca7 100644 | ||
548 | --- a/crypto/shash.c | ||
549 | +++ b/crypto/shash.c | ||
550 | @@ -41,7 +41,7 @@ static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key, | ||
551 | int err; | ||
552 | |||
553 | absize = keylen + (alignmask & ~(crypto_tfm_ctx_alignment() - 1)); | ||
554 | - buffer = kmalloc(absize, GFP_KERNEL); | ||
555 | + buffer = kmalloc(absize, GFP_ATOMIC); | ||
556 | if (!buffer) | ||
557 | return -ENOMEM; | ||
558 | |||
559 | diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c | ||
560 | index cf05ae973381..a36d0739dbfe 100644 | ||
561 | --- a/drivers/acpi/sysfs.c | ||
562 | +++ b/drivers/acpi/sysfs.c | ||
563 | @@ -724,14 +724,8 @@ end: | ||
564 | * interface: | ||
565 | * echo unmask > /sys/firmware/acpi/interrupts/gpe00 | ||
566 | */ | ||
567 | - | ||
568 | -/* | ||
569 | - * Currently, the GPE flooding prevention only supports to mask the GPEs | ||
570 | - * numbered from 00 to 7f. | ||
571 | - */ | ||
572 | -#define ACPI_MASKABLE_GPE_MAX 0x80 | ||
573 | - | ||
574 | -static u64 __initdata acpi_masked_gpes; | ||
575 | +#define ACPI_MASKABLE_GPE_MAX 0xFF | ||
576 | +static DECLARE_BITMAP(acpi_masked_gpes_map, ACPI_MASKABLE_GPE_MAX) __initdata; | ||
577 | |||
578 | static int __init acpi_gpe_set_masked_gpes(char *val) | ||
579 | { | ||
580 | @@ -739,7 +733,7 @@ static int __init acpi_gpe_set_masked_gpes(char *val) | ||
581 | |||
582 | if (kstrtou8(val, 0, &gpe) || gpe > ACPI_MASKABLE_GPE_MAX) | ||
583 | return -EINVAL; | ||
584 | - acpi_masked_gpes |= ((u64)1<<gpe); | ||
585 | + set_bit(gpe, acpi_masked_gpes_map); | ||
586 | |||
587 | return 1; | ||
588 | } | ||
589 | @@ -751,15 +745,11 @@ void __init acpi_gpe_apply_masked_gpes(void) | ||
590 | acpi_status status; | ||
591 | u8 gpe; | ||
592 | |||
593 | - for (gpe = 0; | ||
594 | - gpe < min_t(u8, ACPI_MASKABLE_GPE_MAX, acpi_current_gpe_count); | ||
595 | - gpe++) { | ||
596 | - if (acpi_masked_gpes & ((u64)1<<gpe)) { | ||
597 | - status = acpi_get_gpe_device(gpe, &handle); | ||
598 | - if (ACPI_SUCCESS(status)) { | ||
599 | - pr_info("Masking GPE 0x%x.\n", gpe); | ||
600 | - (void)acpi_mask_gpe(handle, gpe, TRUE); | ||
601 | - } | ||
602 | + for_each_set_bit(gpe, acpi_masked_gpes_map, ACPI_MASKABLE_GPE_MAX) { | ||
603 | + status = acpi_get_gpe_device(gpe, &handle); | ||
604 | + if (ACPI_SUCCESS(status)) { | ||
605 | + pr_info("Masking GPE 0x%x.\n", gpe); | ||
606 | + (void)acpi_mask_gpe(handle, gpe, TRUE); | ||
607 | } | ||
608 | } | ||
609 | } | ||
610 | diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c | ||
611 | index faa91f8a17a5..5408a292078b 100644 | ||
612 | --- a/drivers/ata/ahci.c | ||
613 | +++ b/drivers/ata/ahci.c | ||
614 | @@ -624,8 +624,11 @@ static void ahci_pci_save_initial_config(struct pci_dev *pdev, | ||
615 | static int ahci_pci_reset_controller(struct ata_host *host) | ||
616 | { | ||
617 | struct pci_dev *pdev = to_pci_dev(host->dev); | ||
618 | + int rc; | ||
619 | |||
620 | - ahci_reset_controller(host); | ||
621 | + rc = ahci_reset_controller(host); | ||
622 | + if (rc) | ||
623 | + return rc; | ||
624 | |||
625 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) { | ||
626 | struct ahci_host_priv *hpriv = host->private_data; | ||
627 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
628 | index 73d636d35961..a166359ad5d4 100644 | ||
629 | --- a/drivers/ata/libata-core.c | ||
630 | +++ b/drivers/ata/libata-core.c | ||
631 | @@ -6781,7 +6781,7 @@ static int __init ata_parse_force_one(char **cur, | ||
632 | } | ||
633 | |||
634 | force_ent->port = simple_strtoul(id, &endp, 10); | ||
635 | - if (p == endp || *endp != '\0') { | ||
636 | + if (id == endp || *endp != '\0') { | ||
637 | *reason = "invalid port/link"; | ||
638 | return -EINVAL; | ||
639 | } | ||
640 | diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c | ||
641 | index f72d601e300a..e83a3d3421b9 100644 | ||
642 | --- a/drivers/ata/sata_rcar.c | ||
643 | +++ b/drivers/ata/sata_rcar.c | ||
644 | @@ -890,7 +890,10 @@ static int sata_rcar_probe(struct platform_device *pdev) | ||
645 | dev_err(&pdev->dev, "failed to get access to sata clock\n"); | ||
646 | return PTR_ERR(priv->clk); | ||
647 | } | ||
648 | - clk_prepare_enable(priv->clk); | ||
649 | + | ||
650 | + ret = clk_prepare_enable(priv->clk); | ||
651 | + if (ret) | ||
652 | + return ret; | ||
653 | |||
654 | host = ata_host_alloc(&pdev->dev, 1); | ||
655 | if (!host) { | ||
656 | @@ -970,8 +973,11 @@ static int sata_rcar_resume(struct device *dev) | ||
657 | struct ata_host *host = dev_get_drvdata(dev); | ||
658 | struct sata_rcar_priv *priv = host->private_data; | ||
659 | void __iomem *base = priv->base; | ||
660 | + int ret; | ||
661 | |||
662 | - clk_prepare_enable(priv->clk); | ||
663 | + ret = clk_prepare_enable(priv->clk); | ||
664 | + if (ret) | ||
665 | + return ret; | ||
666 | |||
667 | /* ack and mask */ | ||
668 | iowrite32(0, base + SATAINTSTAT_REG); | ||
669 | @@ -988,8 +994,11 @@ static int sata_rcar_restore(struct device *dev) | ||
670 | { | ||
671 | struct ata_host *host = dev_get_drvdata(dev); | ||
672 | struct sata_rcar_priv *priv = host->private_data; | ||
673 | + int ret; | ||
674 | |||
675 | - clk_prepare_enable(priv->clk); | ||
676 | + ret = clk_prepare_enable(priv->clk); | ||
677 | + if (ret) | ||
678 | + return ret; | ||
679 | |||
680 | sata_rcar_setup_port(host); | ||
681 | |||
682 | diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c | ||
683 | index 4d30da269060..42a53956aefe 100644 | ||
684 | --- a/drivers/block/nbd.c | ||
685 | +++ b/drivers/block/nbd.c | ||
686 | @@ -269,7 +269,7 @@ static inline int sock_send_bvec(struct nbd_device *nbd, struct bio_vec *bvec, | ||
687 | static int nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd) | ||
688 | { | ||
689 | struct request *req = blk_mq_rq_from_pdu(cmd); | ||
690 | - int result, flags; | ||
691 | + int result; | ||
692 | struct nbd_request request; | ||
693 | unsigned long size = blk_rq_bytes(req); | ||
694 | struct bio *bio; | ||
695 | @@ -309,7 +309,6 @@ static int nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd) | ||
696 | if (type != NBD_CMD_WRITE) | ||
697 | return 0; | ||
698 | |||
699 | - flags = 0; | ||
700 | bio = req->bio; | ||
701 | while (bio) { | ||
702 | struct bio *next = bio->bi_next; | ||
703 | @@ -318,9 +317,8 @@ static int nbd_send_cmd(struct nbd_device *nbd, struct nbd_cmd *cmd) | ||
704 | |||
705 | bio_for_each_segment(bvec, bio, iter) { | ||
706 | bool is_last = !next && bio_iter_last(bvec, iter); | ||
707 | + int flags = is_last ? 0 : MSG_MORE; | ||
708 | |||
709 | - if (is_last) | ||
710 | - flags = MSG_MORE; | ||
711 | dev_dbg(nbd_to_dev(nbd), "request %p: sending %d bytes data\n", | ||
712 | cmd, bvec.bv_len); | ||
713 | result = sock_send_bvec(nbd, &bvec, flags); | ||
714 | diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c | ||
715 | index cdc092a1d9ef..07fb667e258f 100644 | ||
716 | --- a/drivers/clk/samsung/clk-exynos5420.c | ||
717 | +++ b/drivers/clk/samsung/clk-exynos5420.c | ||
718 | @@ -987,7 +987,7 @@ static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = { | ||
719 | GATE(0, "aclk400_isp", "mout_user_aclk400_isp", | ||
720 | GATE_BUS_TOP, 16, 0, 0), | ||
721 | GATE(0, "aclk400_mscl", "mout_user_aclk400_mscl", | ||
722 | - GATE_BUS_TOP, 17, 0, 0), | ||
723 | + GATE_BUS_TOP, 17, CLK_IS_CRITICAL, 0), | ||
724 | GATE(0, "aclk200_disp1", "mout_user_aclk200_disp1", | ||
725 | GATE_BUS_TOP, 18, CLK_IS_CRITICAL, 0), | ||
726 | GATE(CLK_SCLK_MPHY_IXTAL24, "sclk_mphy_ixtal24", "mphy_refclk_ixtal24", | ||
727 | diff --git a/drivers/gpio/gpio-mxs.c b/drivers/gpio/gpio-mxs.c | ||
728 | index ee1724806f46..ab8dcfea0680 100644 | ||
729 | --- a/drivers/gpio/gpio-mxs.c | ||
730 | +++ b/drivers/gpio/gpio-mxs.c | ||
731 | @@ -32,8 +32,6 @@ | ||
732 | #include <linux/platform_device.h> | ||
733 | #include <linux/slab.h> | ||
734 | #include <linux/gpio/driver.h> | ||
735 | -/* FIXME: for gpio_get_value(), replace this by direct register read */ | ||
736 | -#include <linux/gpio.h> | ||
737 | #include <linux/module.h> | ||
738 | |||
739 | #define MXS_SET 0x4 | ||
740 | @@ -94,7 +92,7 @@ static int mxs_gpio_set_irq_type(struct irq_data *d, unsigned int type) | ||
741 | port->both_edges &= ~pin_mask; | ||
742 | switch (type) { | ||
743 | case IRQ_TYPE_EDGE_BOTH: | ||
744 | - val = gpio_get_value(port->gc.base + d->hwirq); | ||
745 | + val = port->gc.get(&port->gc, d->hwirq); | ||
746 | if (val) | ||
747 | edge = GPIO_INT_FALL_EDGE; | ||
748 | else | ||
749 | diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c | ||
750 | index e1ec498a6b6e..35f40255644d 100644 | ||
751 | --- a/drivers/gpu/drm/bochs/bochs_fbdev.c | ||
752 | +++ b/drivers/gpu/drm/bochs/bochs_fbdev.c | ||
753 | @@ -138,6 +138,7 @@ static int bochsfb_create(struct drm_fb_helper *helper, | ||
754 | info->fix.smem_start = 0; | ||
755 | info->fix.smem_len = size; | ||
756 | |||
757 | + bochs->fb.initialized = true; | ||
758 | return 0; | ||
759 | } | ||
760 | |||
761 | @@ -155,7 +156,6 @@ static int bochs_fbdev_destroy(struct bochs_device *bochs) | ||
762 | gfb->obj = NULL; | ||
763 | } | ||
764 | |||
765 | - drm_fb_helper_fini(&bochs->fb.helper); | ||
766 | drm_framebuffer_unregister_private(&gfb->base); | ||
767 | drm_framebuffer_cleanup(&gfb->base); | ||
768 | |||
769 | @@ -188,7 +188,6 @@ int bochs_fbdev_init(struct bochs_device *bochs) | ||
770 | if (ret) | ||
771 | goto fini; | ||
772 | |||
773 | - bochs->fb.initialized = true; | ||
774 | return 0; | ||
775 | |||
776 | fini: | ||
777 | @@ -198,9 +197,9 @@ fini: | ||
778 | |||
779 | void bochs_fbdev_fini(struct bochs_device *bochs) | ||
780 | { | ||
781 | - if (!bochs->fb.initialized) | ||
782 | - return; | ||
783 | + if (bochs->fb.initialized) | ||
784 | + bochs_fbdev_destroy(bochs); | ||
785 | |||
786 | - bochs_fbdev_destroy(bochs); | ||
787 | + drm_fb_helper_fini(&bochs->fb.helper); | ||
788 | bochs->fb.initialized = false; | ||
789 | } | ||
790 | diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c | ||
791 | index 37ba5f51378e..83d2f43b5a2f 100644 | ||
792 | --- a/drivers/gpu/drm/drm_edid.c | ||
793 | +++ b/drivers/gpu/drm/drm_edid.c | ||
794 | @@ -107,6 +107,9 @@ static const struct edid_quirk { | ||
795 | /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */ | ||
796 | { "AEO", 0, EDID_QUIRK_FORCE_6BPC }, | ||
797 | |||
798 | + /* BOE model on HP Pavilion 15-n233sl reports 8 bpc, but is a 6 bpc panel */ | ||
799 | + { "BOE", 0x78b, EDID_QUIRK_FORCE_6BPC }, | ||
800 | + | ||
801 | /* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */ | ||
802 | { "CPT", 0x17df, EDID_QUIRK_FORCE_6BPC }, | ||
803 | |||
804 | diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c | ||
805 | index 7145127513c4..795660e29b2c 100644 | ||
806 | --- a/drivers/gpu/drm/msm/msm_gem.c | ||
807 | +++ b/drivers/gpu/drm/msm/msm_gem.c | ||
808 | @@ -118,17 +118,19 @@ static void put_pages(struct drm_gem_object *obj) | ||
809 | struct msm_gem_object *msm_obj = to_msm_bo(obj); | ||
810 | |||
811 | if (msm_obj->pages) { | ||
812 | - /* For non-cached buffers, ensure the new pages are clean | ||
813 | - * because display controller, GPU, etc. are not coherent: | ||
814 | - */ | ||
815 | - if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED)) | ||
816 | - dma_unmap_sg(obj->dev->dev, msm_obj->sgt->sgl, | ||
817 | - msm_obj->sgt->nents, DMA_BIDIRECTIONAL); | ||
818 | + if (msm_obj->sgt) { | ||
819 | + /* For non-cached buffers, ensure the new | ||
820 | + * pages are clean because display controller, | ||
821 | + * GPU, etc. are not coherent: | ||
822 | + */ | ||
823 | + if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED)) | ||
824 | + dma_unmap_sg(obj->dev->dev, msm_obj->sgt->sgl, | ||
825 | + msm_obj->sgt->nents, | ||
826 | + DMA_BIDIRECTIONAL); | ||
827 | |||
828 | - if (msm_obj->sgt) | ||
829 | sg_free_table(msm_obj->sgt); | ||
830 | - | ||
831 | - kfree(msm_obj->sgt); | ||
832 | + kfree(msm_obj->sgt); | ||
833 | + } | ||
834 | |||
835 | if (use_pages(obj)) | ||
836 | drm_gem_put_pages(obj, msm_obj->pages, true, false); | ||
837 | diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c | ||
838 | index b9539f7c5e9a..99c813a4ec1f 100644 | ||
839 | --- a/drivers/gpu/ipu-v3/ipu-common.c | ||
840 | +++ b/drivers/gpu/ipu-v3/ipu-common.c | ||
841 | @@ -715,15 +715,16 @@ void ipu_set_ic_src_mux(struct ipu_soc *ipu, int csi_id, bool vdi) | ||
842 | spin_lock_irqsave(&ipu->lock, flags); | ||
843 | |||
844 | val = ipu_cm_read(ipu, IPU_CONF); | ||
845 | - if (vdi) { | ||
846 | + if (vdi) | ||
847 | val |= IPU_CONF_IC_INPUT; | ||
848 | - } else { | ||
849 | + else | ||
850 | val &= ~IPU_CONF_IC_INPUT; | ||
851 | - if (csi_id == 1) | ||
852 | - val |= IPU_CONF_CSI_SEL; | ||
853 | - else | ||
854 | - val &= ~IPU_CONF_CSI_SEL; | ||
855 | - } | ||
856 | + | ||
857 | + if (csi_id == 1) | ||
858 | + val |= IPU_CONF_CSI_SEL; | ||
859 | + else | ||
860 | + val &= ~IPU_CONF_CSI_SEL; | ||
861 | + | ||
862 | ipu_cm_write(ipu, val, IPU_CONF); | ||
863 | |||
864 | spin_unlock_irqrestore(&ipu->lock, flags); | ||
865 | diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c | ||
866 | index f283b714aa79..7ed09865cb4b 100644 | ||
867 | --- a/drivers/i2c/busses/i2c-bcm2835.c | ||
868 | +++ b/drivers/i2c/busses/i2c-bcm2835.c | ||
869 | @@ -128,7 +128,9 @@ static irqreturn_t bcm2835_i2c_isr(int this_irq, void *data) | ||
870 | } | ||
871 | |||
872 | if (val & BCM2835_I2C_S_DONE) { | ||
873 | - if (i2c_dev->curr_msg->flags & I2C_M_RD) { | ||
874 | + if (!i2c_dev->curr_msg) { | ||
875 | + dev_err(i2c_dev->dev, "Got unexpected interrupt (from firmware?)\n"); | ||
876 | + } else if (i2c_dev->curr_msg->flags & I2C_M_RD) { | ||
877 | bcm2835_drain_rxfifo(i2c_dev); | ||
878 | val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); | ||
879 | } | ||
880 | diff --git a/drivers/iio/adc/axp288_adc.c b/drivers/iio/adc/axp288_adc.c | ||
881 | index 64799ad7ebad..7fd24949c0c1 100644 | ||
882 | --- a/drivers/iio/adc/axp288_adc.c | ||
883 | +++ b/drivers/iio/adc/axp288_adc.c | ||
884 | @@ -28,6 +28,8 @@ | ||
885 | #include <linux/iio/driver.h> | ||
886 | |||
887 | #define AXP288_ADC_EN_MASK 0xF1 | ||
888 | +#define AXP288_ADC_TS_PIN_GPADC 0xF2 | ||
889 | +#define AXP288_ADC_TS_PIN_ON 0xF3 | ||
890 | |||
891 | enum axp288_adc_id { | ||
892 | AXP288_ADC_TS, | ||
893 | @@ -121,6 +123,16 @@ static int axp288_adc_read_channel(int *val, unsigned long address, | ||
894 | return IIO_VAL_INT; | ||
895 | } | ||
896 | |||
897 | +static int axp288_adc_set_ts(struct regmap *regmap, unsigned int mode, | ||
898 | + unsigned long address) | ||
899 | +{ | ||
900 | + /* channels other than GPADC do not need to switch TS pin */ | ||
901 | + if (address != AXP288_GP_ADC_H) | ||
902 | + return 0; | ||
903 | + | ||
904 | + return regmap_write(regmap, AXP288_ADC_TS_PIN_CTRL, mode); | ||
905 | +} | ||
906 | + | ||
907 | static int axp288_adc_read_raw(struct iio_dev *indio_dev, | ||
908 | struct iio_chan_spec const *chan, | ||
909 | int *val, int *val2, long mask) | ||
910 | @@ -131,7 +143,16 @@ static int axp288_adc_read_raw(struct iio_dev *indio_dev, | ||
911 | mutex_lock(&indio_dev->mlock); | ||
912 | switch (mask) { | ||
913 | case IIO_CHAN_INFO_RAW: | ||
914 | + if (axp288_adc_set_ts(info->regmap, AXP288_ADC_TS_PIN_GPADC, | ||
915 | + chan->address)) { | ||
916 | + dev_err(&indio_dev->dev, "GPADC mode\n"); | ||
917 | + ret = -EINVAL; | ||
918 | + break; | ||
919 | + } | ||
920 | ret = axp288_adc_read_channel(val, chan->address, info->regmap); | ||
921 | + if (axp288_adc_set_ts(info->regmap, AXP288_ADC_TS_PIN_ON, | ||
922 | + chan->address)) | ||
923 | + dev_err(&indio_dev->dev, "TS pin restore\n"); | ||
924 | break; | ||
925 | default: | ||
926 | ret = -EINVAL; | ||
927 | @@ -141,6 +162,15 @@ static int axp288_adc_read_raw(struct iio_dev *indio_dev, | ||
928 | return ret; | ||
929 | } | ||
930 | |||
931 | +static int axp288_adc_set_state(struct regmap *regmap) | ||
932 | +{ | ||
933 | + /* ADC should be always enabled for internal FG to function */ | ||
934 | + if (regmap_write(regmap, AXP288_ADC_TS_PIN_CTRL, AXP288_ADC_TS_PIN_ON)) | ||
935 | + return -EIO; | ||
936 | + | ||
937 | + return regmap_write(regmap, AXP20X_ADC_EN1, AXP288_ADC_EN_MASK); | ||
938 | +} | ||
939 | + | ||
940 | static const struct iio_info axp288_adc_iio_info = { | ||
941 | .read_raw = &axp288_adc_read_raw, | ||
942 | .driver_module = THIS_MODULE, | ||
943 | @@ -169,7 +199,7 @@ static int axp288_adc_probe(struct platform_device *pdev) | ||
944 | * Set ADC to enabled state at all time, including system suspend. | ||
945 | * otherwise internal fuel gauge functionality may be affected. | ||
946 | */ | ||
947 | - ret = regmap_write(info->regmap, AXP20X_ADC_EN1, AXP288_ADC_EN_MASK); | ||
948 | + ret = axp288_adc_set_state(axp20x->regmap); | ||
949 | if (ret) { | ||
950 | dev_err(&pdev->dev, "unable to enable ADC device\n"); | ||
951 | return ret; | ||
952 | diff --git a/drivers/iio/pressure/zpa2326.c b/drivers/iio/pressure/zpa2326.c | ||
953 | index 2a4a62ebfd8d..cc002b958f7e 100644 | ||
954 | --- a/drivers/iio/pressure/zpa2326.c | ||
955 | +++ b/drivers/iio/pressure/zpa2326.c | ||
956 | @@ -869,7 +869,6 @@ complete: | ||
957 | static int zpa2326_wait_oneshot_completion(const struct iio_dev *indio_dev, | ||
958 | struct zpa2326_private *private) | ||
959 | { | ||
960 | - int ret; | ||
961 | unsigned int val; | ||
962 | long timeout; | ||
963 | |||
964 | @@ -891,14 +890,11 @@ static int zpa2326_wait_oneshot_completion(const struct iio_dev *indio_dev, | ||
965 | /* Timed out. */ | ||
966 | zpa2326_warn(indio_dev, "no one shot interrupt occurred (%ld)", | ||
967 | timeout); | ||
968 | - ret = -ETIME; | ||
969 | - } else if (timeout < 0) { | ||
970 | - zpa2326_warn(indio_dev, | ||
971 | - "wait for one shot interrupt cancelled"); | ||
972 | - ret = -ERESTARTSYS; | ||
973 | + return -ETIME; | ||
974 | } | ||
975 | |||
976 | - return ret; | ||
977 | + zpa2326_warn(indio_dev, "wait for one shot interrupt cancelled"); | ||
978 | + return -ERESTARTSYS; | ||
979 | } | ||
980 | |||
981 | static int zpa2326_init_managed_irq(struct device *parent, | ||
982 | diff --git a/drivers/infiniband/core/ucm.c b/drivers/infiniband/core/ucm.c | ||
983 | index 7713ef089c3c..85be45e75710 100644 | ||
984 | --- a/drivers/infiniband/core/ucm.c | ||
985 | +++ b/drivers/infiniband/core/ucm.c | ||
986 | @@ -46,6 +46,8 @@ | ||
987 | #include <linux/mutex.h> | ||
988 | #include <linux/slab.h> | ||
989 | |||
990 | +#include <linux/nospec.h> | ||
991 | + | ||
992 | #include <asm/uaccess.h> | ||
993 | |||
994 | #include <rdma/ib.h> | ||
995 | @@ -1115,6 +1117,7 @@ static ssize_t ib_ucm_write(struct file *filp, const char __user *buf, | ||
996 | |||
997 | if (hdr.cmd >= ARRAY_SIZE(ucm_cmd_table)) | ||
998 | return -EINVAL; | ||
999 | + hdr.cmd = array_index_nospec(hdr.cmd, ARRAY_SIZE(ucm_cmd_table)); | ||
1000 | |||
1001 | if (hdr.in + sizeof(hdr) > len) | ||
1002 | return -EINVAL; | ||
1003 | diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c | ||
1004 | index fa9ef8ed5712..a4f4cd493265 100644 | ||
1005 | --- a/drivers/infiniband/core/ucma.c | ||
1006 | +++ b/drivers/infiniband/core/ucma.c | ||
1007 | @@ -44,6 +44,8 @@ | ||
1008 | #include <linux/module.h> | ||
1009 | #include <linux/nsproxy.h> | ||
1010 | |||
1011 | +#include <linux/nospec.h> | ||
1012 | + | ||
1013 | #include <rdma/rdma_user_cm.h> | ||
1014 | #include <rdma/ib_marshall.h> | ||
1015 | #include <rdma/rdma_cm.h> | ||
1016 | @@ -1637,6 +1639,7 @@ static ssize_t ucma_write(struct file *filp, const char __user *buf, | ||
1017 | |||
1018 | if (hdr.cmd >= ARRAY_SIZE(ucma_cmd_table)) | ||
1019 | return -EINVAL; | ||
1020 | + hdr.cmd = array_index_nospec(hdr.cmd, ARRAY_SIZE(ucma_cmd_table)); | ||
1021 | |||
1022 | if (hdr.in + sizeof(hdr) > len) | ||
1023 | return -EINVAL; | ||
1024 | diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c | ||
1025 | index 0e64b52af5b2..d28c4cf7c1ee 100644 | ||
1026 | --- a/drivers/infiniband/core/verbs.c | ||
1027 | +++ b/drivers/infiniband/core/verbs.c | ||
1028 | @@ -1510,6 +1510,44 @@ EXPORT_SYMBOL(ib_dealloc_fmr); | ||
1029 | |||
1030 | /* Multicast groups */ | ||
1031 | |||
1032 | +static bool is_valid_mcast_lid(struct ib_qp *qp, u16 lid) | ||
1033 | +{ | ||
1034 | + struct ib_qp_init_attr init_attr = {}; | ||
1035 | + struct ib_qp_attr attr = {}; | ||
1036 | + int num_eth_ports = 0; | ||
1037 | + int port; | ||
1038 | + | ||
1039 | + /* If QP state >= init, it is assigned to a port and we can check this | ||
1040 | + * port only. | ||
1041 | + */ | ||
1042 | + if (!ib_query_qp(qp, &attr, IB_QP_STATE | IB_QP_PORT, &init_attr)) { | ||
1043 | + if (attr.qp_state >= IB_QPS_INIT) { | ||
1044 | + if (qp->device->get_link_layer(qp->device, attr.port_num) != | ||
1045 | + IB_LINK_LAYER_INFINIBAND) | ||
1046 | + return true; | ||
1047 | + goto lid_check; | ||
1048 | + } | ||
1049 | + } | ||
1050 | + | ||
1051 | + /* Can't get a quick answer, iterate over all ports */ | ||
1052 | + for (port = 0; port < qp->device->phys_port_cnt; port++) | ||
1053 | + if (qp->device->get_link_layer(qp->device, port) != | ||
1054 | + IB_LINK_LAYER_INFINIBAND) | ||
1055 | + num_eth_ports++; | ||
1056 | + | ||
1057 | + /* If we have at lease one Ethernet port, RoCE annex declares that | ||
1058 | + * multicast LID should be ignored. We can't tell at this step if the | ||
1059 | + * QP belongs to an IB or Ethernet port. | ||
1060 | + */ | ||
1061 | + if (num_eth_ports) | ||
1062 | + return true; | ||
1063 | + | ||
1064 | + /* If all the ports are IB, we can check according to IB spec. */ | ||
1065 | +lid_check: | ||
1066 | + return !(lid < be16_to_cpu(IB_MULTICAST_LID_BASE) || | ||
1067 | + lid == be16_to_cpu(IB_LID_PERMISSIVE)); | ||
1068 | +} | ||
1069 | + | ||
1070 | int ib_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid) | ||
1071 | { | ||
1072 | int ret; | ||
1073 | @@ -1517,8 +1555,7 @@ int ib_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid) | ||
1074 | if (!qp->device->attach_mcast) | ||
1075 | return -ENOSYS; | ||
1076 | if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD || | ||
1077 | - lid < be16_to_cpu(IB_MULTICAST_LID_BASE) || | ||
1078 | - lid == be16_to_cpu(IB_LID_PERMISSIVE)) | ||
1079 | + !is_valid_mcast_lid(qp, lid)) | ||
1080 | return -EINVAL; | ||
1081 | |||
1082 | ret = qp->device->attach_mcast(qp, gid, lid); | ||
1083 | @@ -1535,8 +1572,7 @@ int ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid) | ||
1084 | if (!qp->device->detach_mcast) | ||
1085 | return -ENOSYS; | ||
1086 | if (gid->raw[0] != 0xff || qp->qp_type != IB_QPT_UD || | ||
1087 | - lid < be16_to_cpu(IB_MULTICAST_LID_BASE) || | ||
1088 | - lid == be16_to_cpu(IB_LID_PERMISSIVE)) | ||
1089 | + !is_valid_mcast_lid(qp, lid)) | ||
1090 | return -EINVAL; | ||
1091 | |||
1092 | ret = qp->device->detach_mcast(qp, gid, lid); | ||
1093 | diff --git a/drivers/infiniband/hw/mlx4/mr.c b/drivers/infiniband/hw/mlx4/mr.c | ||
1094 | index 0d4878efd643..ddd3182138ac 100644 | ||
1095 | --- a/drivers/infiniband/hw/mlx4/mr.c | ||
1096 | +++ b/drivers/infiniband/hw/mlx4/mr.c | ||
1097 | @@ -247,8 +247,11 @@ int mlx4_ib_rereg_user_mr(struct ib_mr *mr, int flags, | ||
1098 | } | ||
1099 | |||
1100 | if (flags & IB_MR_REREG_ACCESS) { | ||
1101 | - if (ib_access_writable(mr_access_flags) && !mmr->umem->writable) | ||
1102 | - return -EPERM; | ||
1103 | + if (ib_access_writable(mr_access_flags) && | ||
1104 | + !mmr->umem->writable) { | ||
1105 | + err = -EPERM; | ||
1106 | + goto release_mpt_entry; | ||
1107 | + } | ||
1108 | |||
1109 | err = mlx4_mr_hw_change_access(dev->dev, *pmpt_entry, | ||
1110 | convert_access(mr_access_flags)); | ||
1111 | diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c | ||
1112 | index abb47e780070..f8f7a2191b98 100644 | ||
1113 | --- a/drivers/infiniband/hw/mlx5/qp.c | ||
1114 | +++ b/drivers/infiniband/hw/mlx5/qp.c | ||
1115 | @@ -1523,6 +1523,7 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, | ||
1116 | u32 uidx = MLX5_IB_DEFAULT_UIDX; | ||
1117 | struct mlx5_ib_create_qp ucmd; | ||
1118 | struct mlx5_ib_qp_base *base; | ||
1119 | + int mlx5_st; | ||
1120 | void *qpc; | ||
1121 | u32 *in; | ||
1122 | int err; | ||
1123 | @@ -1538,6 +1539,10 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, | ||
1124 | spin_lock_init(&qp->sq.lock); | ||
1125 | spin_lock_init(&qp->rq.lock); | ||
1126 | |||
1127 | + mlx5_st = to_mlx5_st(init_attr->qp_type); | ||
1128 | + if (mlx5_st < 0) | ||
1129 | + return -EINVAL; | ||
1130 | + | ||
1131 | if (init_attr->rwq_ind_tbl) { | ||
1132 | if (!udata) | ||
1133 | return -ENOSYS; | ||
1134 | @@ -1665,7 +1670,7 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd, | ||
1135 | |||
1136 | qpc = MLX5_ADDR_OF(create_qp_in, in, qpc); | ||
1137 | |||
1138 | - MLX5_SET(qpc, qpc, st, to_mlx5_st(init_attr->qp_type)); | ||
1139 | + MLX5_SET(qpc, qpc, st, mlx5_st); | ||
1140 | MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED); | ||
1141 | |||
1142 | if (init_attr->qp_type != MLX5_IB_QPT_REG_UMR) | ||
1143 | diff --git a/drivers/infiniband/sw/rxe/rxe_pool.c b/drivers/infiniband/sw/rxe/rxe_pool.c | ||
1144 | index 1c4e5b2e6835..527ca662da69 100644 | ||
1145 | --- a/drivers/infiniband/sw/rxe/rxe_pool.c | ||
1146 | +++ b/drivers/infiniband/sw/rxe/rxe_pool.c | ||
1147 | @@ -402,23 +402,25 @@ void *rxe_alloc(struct rxe_pool *pool) | ||
1148 | |||
1149 | kref_get(&pool->rxe->ref_cnt); | ||
1150 | |||
1151 | - if (atomic_inc_return(&pool->num_elem) > pool->max_elem) { | ||
1152 | - atomic_dec(&pool->num_elem); | ||
1153 | - rxe_dev_put(pool->rxe); | ||
1154 | - rxe_pool_put(pool); | ||
1155 | - return NULL; | ||
1156 | - } | ||
1157 | + if (atomic_inc_return(&pool->num_elem) > pool->max_elem) | ||
1158 | + goto out_put_pool; | ||
1159 | |||
1160 | elem = kmem_cache_zalloc(pool_cache(pool), | ||
1161 | (pool->flags & RXE_POOL_ATOMIC) ? | ||
1162 | GFP_ATOMIC : GFP_KERNEL); | ||
1163 | if (!elem) | ||
1164 | - return NULL; | ||
1165 | + goto out_put_pool; | ||
1166 | |||
1167 | elem->pool = pool; | ||
1168 | kref_init(&elem->ref_cnt); | ||
1169 | |||
1170 | return elem; | ||
1171 | + | ||
1172 | +out_put_pool: | ||
1173 | + atomic_dec(&pool->num_elem); | ||
1174 | + rxe_dev_put(pool->rxe); | ||
1175 | + rxe_pool_put(pool); | ||
1176 | + return NULL; | ||
1177 | } | ||
1178 | |||
1179 | void rxe_elem_release(struct kref *kref) | ||
1180 | diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/rxe/rxe_verbs.c | ||
1181 | index ced416f5dffb..ef13082d6ca1 100644 | ||
1182 | --- a/drivers/infiniband/sw/rxe/rxe_verbs.c | ||
1183 | +++ b/drivers/infiniband/sw/rxe/rxe_verbs.c | ||
1184 | @@ -729,13 +729,8 @@ static int init_send_wqe(struct rxe_qp *qp, struct ib_send_wr *ibwr, | ||
1185 | |||
1186 | sge = ibwr->sg_list; | ||
1187 | for (i = 0; i < num_sge; i++, sge++) { | ||
1188 | - if (qp->is_user && copy_from_user(p, (__user void *) | ||
1189 | - (uintptr_t)sge->addr, sge->length)) | ||
1190 | - return -EFAULT; | ||
1191 | - | ||
1192 | - else if (!qp->is_user) | ||
1193 | - memcpy(p, (void *)(uintptr_t)sge->addr, | ||
1194 | - sge->length); | ||
1195 | + memcpy(p, (void *)(uintptr_t)sge->addr, | ||
1196 | + sge->length); | ||
1197 | |||
1198 | p += sge->length; | ||
1199 | } | ||
1200 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_fs.c b/drivers/infiniband/ulp/ipoib/ipoib_fs.c | ||
1201 | index 09396bd7b02d..63be3bcdc0e3 100644 | ||
1202 | --- a/drivers/infiniband/ulp/ipoib/ipoib_fs.c | ||
1203 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_fs.c | ||
1204 | @@ -281,8 +281,6 @@ void ipoib_delete_debug_files(struct net_device *dev) | ||
1205 | { | ||
1206 | struct ipoib_dev_priv *priv = netdev_priv(dev); | ||
1207 | |||
1208 | - WARN_ONCE(!priv->mcg_dentry, "null mcg debug file\n"); | ||
1209 | - WARN_ONCE(!priv->path_dentry, "null path debug file\n"); | ||
1210 | debugfs_remove(priv->mcg_dentry); | ||
1211 | debugfs_remove(priv->path_dentry); | ||
1212 | priv->mcg_dentry = priv->path_dentry = NULL; | ||
1213 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | ||
1214 | index 34122c96522b..ad3089c23e18 100644 | ||
1215 | --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c | ||
1216 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | ||
1217 | @@ -974,19 +974,6 @@ static inline int update_parent_pkey(struct ipoib_dev_priv *priv) | ||
1218 | */ | ||
1219 | priv->dev->broadcast[8] = priv->pkey >> 8; | ||
1220 | priv->dev->broadcast[9] = priv->pkey & 0xff; | ||
1221 | - | ||
1222 | - /* | ||
1223 | - * Update the broadcast address in the priv->broadcast object, | ||
1224 | - * in case it already exists, otherwise no one will do that. | ||
1225 | - */ | ||
1226 | - if (priv->broadcast) { | ||
1227 | - spin_lock_irq(&priv->lock); | ||
1228 | - memcpy(priv->broadcast->mcmember.mgid.raw, | ||
1229 | - priv->dev->broadcast + 4, | ||
1230 | - sizeof(union ib_gid)); | ||
1231 | - spin_unlock_irq(&priv->lock); | ||
1232 | - } | ||
1233 | - | ||
1234 | return 0; | ||
1235 | } | ||
1236 | |||
1237 | @@ -1190,13 +1177,10 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv, | ||
1238 | ipoib_ib_dev_down(dev); | ||
1239 | |||
1240 | if (level == IPOIB_FLUSH_HEAVY) { | ||
1241 | - rtnl_lock(); | ||
1242 | if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) | ||
1243 | ipoib_ib_dev_stop(dev); | ||
1244 | |||
1245 | - result = ipoib_ib_dev_open(dev); | ||
1246 | - rtnl_unlock(); | ||
1247 | - if (result) | ||
1248 | + if (ipoib_ib_dev_open(dev)) | ||
1249 | return; | ||
1250 | |||
1251 | if (netif_queue_stopped(dev)) | ||
1252 | @@ -1236,7 +1220,9 @@ void ipoib_ib_dev_flush_heavy(struct work_struct *work) | ||
1253 | struct ipoib_dev_priv *priv = | ||
1254 | container_of(work, struct ipoib_dev_priv, flush_heavy); | ||
1255 | |||
1256 | + rtnl_lock(); | ||
1257 | __ipoib_ib_dev_flush(priv, IPOIB_FLUSH_HEAVY, 0); | ||
1258 | + rtnl_unlock(); | ||
1259 | } | ||
1260 | |||
1261 | void ipoib_ib_dev_cleanup(struct net_device *dev) | ||
1262 | diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c | ||
1263 | index a716482774db..b3119589a444 100644 | ||
1264 | --- a/drivers/input/mouse/elan_i2c_core.c | ||
1265 | +++ b/drivers/input/mouse/elan_i2c_core.c | ||
1266 | @@ -1251,6 +1251,7 @@ static const struct acpi_device_id elan_acpi_id[] = { | ||
1267 | { "ELAN0611", 0 }, | ||
1268 | { "ELAN0612", 0 }, | ||
1269 | { "ELAN0618", 0 }, | ||
1270 | + { "ELAN061C", 0 }, | ||
1271 | { "ELAN061D", 0 }, | ||
1272 | { "ELAN0622", 0 }, | ||
1273 | { "ELAN1000", 0 }, | ||
1274 | diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c | ||
1275 | index 21dde5249085..c42523b7d5ed 100644 | ||
1276 | --- a/drivers/mtd/spi-nor/spi-nor.c | ||
1277 | +++ b/drivers/mtd/spi-nor/spi-nor.c | ||
1278 | @@ -858,6 +858,12 @@ static const struct flash_info spi_nor_ids[] = { | ||
1279 | |||
1280 | /* ISSI */ | ||
1281 | { "is25cd512", INFO(0x7f9d20, 0, 32 * 1024, 2, SECT_4K) }, | ||
1282 | + { "is25wp032", INFO(0x9d7016, 0, 64 * 1024, 64, | ||
1283 | + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, | ||
1284 | + { "is25wp064", INFO(0x9d7017, 0, 64 * 1024, 128, | ||
1285 | + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, | ||
1286 | + { "is25wp128", INFO(0x9d7018, 0, 64 * 1024, 256, | ||
1287 | + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, | ||
1288 | |||
1289 | /* Macronix */ | ||
1290 | { "mx25l512e", INFO(0xc22010, 0, 64 * 1024, 1, SECT_4K) }, | ||
1291 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c | ||
1292 | index b1ea29d8ad1a..389d1db69a32 100644 | ||
1293 | --- a/drivers/net/bonding/bond_main.c | ||
1294 | +++ b/drivers/net/bonding/bond_main.c | ||
1295 | @@ -2132,9 +2132,10 @@ static void bond_miimon_commit(struct bonding *bond) | ||
1296 | if (bond_update_speed_duplex(slave) && | ||
1297 | bond_needs_speed_duplex(bond)) { | ||
1298 | slave->link = BOND_LINK_DOWN; | ||
1299 | - netdev_warn(bond->dev, | ||
1300 | - "failed to get link speed/duplex for %s\n", | ||
1301 | - slave->dev->name); | ||
1302 | + if (net_ratelimit()) | ||
1303 | + netdev_warn(bond->dev, | ||
1304 | + "failed to get link speed/duplex for %s\n", | ||
1305 | + slave->dev->name); | ||
1306 | continue; | ||
1307 | } | ||
1308 | bond_set_slave_link_state(slave, BOND_LINK_UP, | ||
1309 | diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c | ||
1310 | index b8df0f5e8c25..3f320f470345 100644 | ||
1311 | --- a/drivers/net/bonding/bond_netlink.c | ||
1312 | +++ b/drivers/net/bonding/bond_netlink.c | ||
1313 | @@ -628,8 +628,7 @@ static int bond_fill_info(struct sk_buff *skb, | ||
1314 | goto nla_put_failure; | ||
1315 | |||
1316 | if (nla_put(skb, IFLA_BOND_AD_ACTOR_SYSTEM, | ||
1317 | - sizeof(bond->params.ad_actor_system), | ||
1318 | - &bond->params.ad_actor_system)) | ||
1319 | + ETH_ALEN, &bond->params.ad_actor_system)) | ||
1320 | goto nla_put_failure; | ||
1321 | } | ||
1322 | if (!bond_3ad_get_active_agg_info(bond, &info)) { | ||
1323 | diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c | ||
1324 | index 1d92e034febc..0c298878bf46 100644 | ||
1325 | --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c | ||
1326 | +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c | ||
1327 | @@ -1482,8 +1482,6 @@ static int ena_up_complete(struct ena_adapter *adapter) | ||
1328 | if (rc) | ||
1329 | return rc; | ||
1330 | |||
1331 | - ena_init_napi(adapter); | ||
1332 | - | ||
1333 | ena_change_mtu(adapter->netdev, adapter->netdev->mtu); | ||
1334 | |||
1335 | ena_refill_all_rx_bufs(adapter); | ||
1336 | @@ -1643,6 +1641,13 @@ static int ena_up(struct ena_adapter *adapter) | ||
1337 | |||
1338 | ena_setup_io_intr(adapter); | ||
1339 | |||
1340 | + /* napi poll functions should be initialized before running | ||
1341 | + * request_irq(), to handle a rare condition where there is a pending | ||
1342 | + * interrupt, causing the ISR to fire immediately while the poll | ||
1343 | + * function wasn't set yet, causing a null dereference | ||
1344 | + */ | ||
1345 | + ena_init_napi(adapter); | ||
1346 | + | ||
1347 | rc = ena_request_io_irq(adapter); | ||
1348 | if (rc) | ||
1349 | goto err_req_irq; | ||
1350 | diff --git a/drivers/net/ethernet/amd/declance.c b/drivers/net/ethernet/amd/declance.c | ||
1351 | index b799c7ac899b..9e80a76c3dfe 100644 | ||
1352 | --- a/drivers/net/ethernet/amd/declance.c | ||
1353 | +++ b/drivers/net/ethernet/amd/declance.c | ||
1354 | @@ -1030,6 +1030,7 @@ static int dec_lance_probe(struct device *bdev, const int type) | ||
1355 | int i, ret; | ||
1356 | unsigned long esar_base; | ||
1357 | unsigned char *esar; | ||
1358 | + const char *desc; | ||
1359 | |||
1360 | if (dec_lance_debug && version_printed++ == 0) | ||
1361 | printk(version); | ||
1362 | @@ -1215,19 +1216,20 @@ static int dec_lance_probe(struct device *bdev, const int type) | ||
1363 | */ | ||
1364 | switch (type) { | ||
1365 | case ASIC_LANCE: | ||
1366 | - printk("%s: IOASIC onboard LANCE", name); | ||
1367 | + desc = "IOASIC onboard LANCE"; | ||
1368 | break; | ||
1369 | case PMAD_LANCE: | ||
1370 | - printk("%s: PMAD-AA", name); | ||
1371 | + desc = "PMAD-AA"; | ||
1372 | break; | ||
1373 | case PMAX_LANCE: | ||
1374 | - printk("%s: PMAX onboard LANCE", name); | ||
1375 | + desc = "PMAX onboard LANCE"; | ||
1376 | break; | ||
1377 | } | ||
1378 | for (i = 0; i < 6; i++) | ||
1379 | dev->dev_addr[i] = esar[i * 4]; | ||
1380 | |||
1381 | - printk(", addr = %pM, irq = %d\n", dev->dev_addr, dev->irq); | ||
1382 | + printk("%s: %s, addr = %pM, irq = %d\n", | ||
1383 | + name, desc, dev->dev_addr, dev->irq); | ||
1384 | |||
1385 | dev->netdev_ops = &lance_netdev_ops; | ||
1386 | dev->watchdog_timeo = 5*HZ; | ||
1387 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1388 | index 208e9dacfd34..a036f7039d76 100644 | ||
1389 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1390 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1391 | @@ -5580,7 +5580,9 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init) | ||
1392 | } | ||
1393 | |||
1394 | if (link_re_init) { | ||
1395 | + mutex_lock(&bp->link_lock); | ||
1396 | rc = bnxt_update_phy_setting(bp); | ||
1397 | + mutex_unlock(&bp->link_lock); | ||
1398 | if (rc) | ||
1399 | netdev_warn(bp->dev, "failed to update phy settings\n"); | ||
1400 | } | ||
1401 | @@ -6230,30 +6232,28 @@ static void bnxt_sp_task(struct work_struct *work) | ||
1402 | if (test_and_clear_bit(BNXT_PERIODIC_STATS_SP_EVENT, &bp->sp_event)) | ||
1403 | bnxt_hwrm_port_qstats(bp); | ||
1404 | |||
1405 | - /* These functions below will clear BNXT_STATE_IN_SP_TASK. They | ||
1406 | - * must be the last functions to be called before exiting. | ||
1407 | - */ | ||
1408 | if (test_and_clear_bit(BNXT_LINK_CHNG_SP_EVENT, &bp->sp_event)) { | ||
1409 | - int rc = 0; | ||
1410 | + int rc; | ||
1411 | |||
1412 | + mutex_lock(&bp->link_lock); | ||
1413 | if (test_and_clear_bit(BNXT_LINK_SPEED_CHNG_SP_EVENT, | ||
1414 | &bp->sp_event)) | ||
1415 | bnxt_hwrm_phy_qcaps(bp); | ||
1416 | |||
1417 | - bnxt_rtnl_lock_sp(bp); | ||
1418 | - if (test_bit(BNXT_STATE_OPEN, &bp->state)) | ||
1419 | - rc = bnxt_update_link(bp, true); | ||
1420 | - bnxt_rtnl_unlock_sp(bp); | ||
1421 | + rc = bnxt_update_link(bp, true); | ||
1422 | + mutex_unlock(&bp->link_lock); | ||
1423 | if (rc) | ||
1424 | netdev_err(bp->dev, "SP task can't update link (rc: %x)\n", | ||
1425 | rc); | ||
1426 | } | ||
1427 | if (test_and_clear_bit(BNXT_HWRM_PORT_MODULE_SP_EVENT, &bp->sp_event)) { | ||
1428 | - bnxt_rtnl_lock_sp(bp); | ||
1429 | - if (test_bit(BNXT_STATE_OPEN, &bp->state)) | ||
1430 | - bnxt_get_port_module_status(bp); | ||
1431 | - bnxt_rtnl_unlock_sp(bp); | ||
1432 | + mutex_lock(&bp->link_lock); | ||
1433 | + bnxt_get_port_module_status(bp); | ||
1434 | + mutex_unlock(&bp->link_lock); | ||
1435 | } | ||
1436 | + /* These functions below will clear BNXT_STATE_IN_SP_TASK. They | ||
1437 | + * must be the last functions to be called before exiting. | ||
1438 | + */ | ||
1439 | if (test_and_clear_bit(BNXT_RESET_TASK_SP_EVENT, &bp->sp_event)) | ||
1440 | bnxt_reset(bp, false); | ||
1441 | |||
1442 | @@ -6788,6 +6788,7 @@ static int bnxt_probe_phy(struct bnxt *bp) | ||
1443 | rc); | ||
1444 | return rc; | ||
1445 | } | ||
1446 | + mutex_init(&bp->link_lock); | ||
1447 | |||
1448 | rc = bnxt_update_link(bp, false); | ||
1449 | if (rc) { | ||
1450 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h | ||
1451 | index 666bc0608ed7..017c10c53715 100644 | ||
1452 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h | ||
1453 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h | ||
1454 | @@ -1109,6 +1109,10 @@ struct bnxt { | ||
1455 | unsigned long *ntp_fltr_bmap; | ||
1456 | int ntp_fltr_count; | ||
1457 | |||
1458 | + /* To protect link related settings during link changes and | ||
1459 | + * ethtool settings changes. | ||
1460 | + */ | ||
1461 | + struct mutex link_lock; | ||
1462 | struct bnxt_link_info link_info; | ||
1463 | struct ethtool_eee eee; | ||
1464 | u32 lpi_tmr_lo; | ||
1465 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | ||
1466 | index cde4b96f3153..3a352f76e633 100644 | ||
1467 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | ||
1468 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | ||
1469 | @@ -793,6 +793,7 @@ static int bnxt_get_link_ksettings(struct net_device *dev, | ||
1470 | u32 ethtool_speed; | ||
1471 | |||
1472 | ethtool_link_ksettings_zero_link_mode(lk_ksettings, supported); | ||
1473 | + mutex_lock(&bp->link_lock); | ||
1474 | bnxt_fw_to_ethtool_support_spds(link_info, lk_ksettings); | ||
1475 | |||
1476 | ethtool_link_ksettings_zero_link_mode(lk_ksettings, advertising); | ||
1477 | @@ -840,6 +841,7 @@ static int bnxt_get_link_ksettings(struct net_device *dev, | ||
1478 | base->port = PORT_FIBRE; | ||
1479 | } | ||
1480 | base->phy_address = link_info->phy_addr; | ||
1481 | + mutex_unlock(&bp->link_lock); | ||
1482 | |||
1483 | return 0; | ||
1484 | } | ||
1485 | @@ -926,6 +928,7 @@ static int bnxt_set_link_ksettings(struct net_device *dev, | ||
1486 | if (!BNXT_SINGLE_PF(bp)) | ||
1487 | return -EOPNOTSUPP; | ||
1488 | |||
1489 | + mutex_lock(&bp->link_lock); | ||
1490 | if (base->autoneg == AUTONEG_ENABLE) { | ||
1491 | BNXT_ETHTOOL_TO_FW_SPDS(fw_advertising, lk_ksettings, | ||
1492 | advertising); | ||
1493 | @@ -970,6 +973,7 @@ static int bnxt_set_link_ksettings(struct net_device *dev, | ||
1494 | rc = bnxt_hwrm_set_link_setting(bp, set_pause, false); | ||
1495 | |||
1496 | set_setting_exit: | ||
1497 | + mutex_unlock(&bp->link_lock); | ||
1498 | return rc; | ||
1499 | } | ||
1500 | |||
1501 | diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c | ||
1502 | index 8f55c23e9821..a0d640243df2 100644 | ||
1503 | --- a/drivers/net/ethernet/cadence/macb.c | ||
1504 | +++ b/drivers/net/ethernet/cadence/macb.c | ||
1505 | @@ -1737,6 +1737,7 @@ static void macb_configure_dma(struct macb *bp) | ||
1506 | else | ||
1507 | dmacfg &= ~GEM_BIT(TXCOEN); | ||
1508 | |||
1509 | + dmacfg &= ~GEM_BIT(ADDR64); | ||
1510 | #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT | ||
1511 | dmacfg |= GEM_BIT(ADDR64); | ||
1512 | #endif | ||
1513 | diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | ||
1514 | index dc0efbd91c32..ddd1ec8f7bd0 100644 | ||
1515 | --- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | ||
1516 | +++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | ||
1517 | @@ -2150,6 +2150,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | ||
1518 | return -EPERM; | ||
1519 | if (copy_from_user(&t, useraddr, sizeof(t))) | ||
1520 | return -EFAULT; | ||
1521 | + if (t.cmd != CHELSIO_SET_QSET_PARAMS) | ||
1522 | + return -EINVAL; | ||
1523 | if (t.qset_idx >= SGE_QSETS) | ||
1524 | return -EINVAL; | ||
1525 | if (!in_range(t.intr_lat, 0, M_NEWTIMER) || | ||
1526 | @@ -2249,6 +2251,9 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | ||
1527 | if (copy_from_user(&t, useraddr, sizeof(t))) | ||
1528 | return -EFAULT; | ||
1529 | |||
1530 | + if (t.cmd != CHELSIO_GET_QSET_PARAMS) | ||
1531 | + return -EINVAL; | ||
1532 | + | ||
1533 | /* Display qsets for all ports when offload enabled */ | ||
1534 | if (test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map)) { | ||
1535 | q1 = 0; | ||
1536 | @@ -2294,6 +2299,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | ||
1537 | return -EBUSY; | ||
1538 | if (copy_from_user(&edata, useraddr, sizeof(edata))) | ||
1539 | return -EFAULT; | ||
1540 | + if (edata.cmd != CHELSIO_SET_QSET_NUM) | ||
1541 | + return -EINVAL; | ||
1542 | if (edata.val < 1 || | ||
1543 | (edata.val > 1 && !(adapter->flags & USING_MSIX))) | ||
1544 | return -EINVAL; | ||
1545 | @@ -2334,6 +2341,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | ||
1546 | return -EPERM; | ||
1547 | if (copy_from_user(&t, useraddr, sizeof(t))) | ||
1548 | return -EFAULT; | ||
1549 | + if (t.cmd != CHELSIO_LOAD_FW) | ||
1550 | + return -EINVAL; | ||
1551 | /* Check t.len sanity ? */ | ||
1552 | fw_data = memdup_user(useraddr + sizeof(t), t.len); | ||
1553 | if (IS_ERR(fw_data)) | ||
1554 | @@ -2357,6 +2366,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | ||
1555 | return -EBUSY; | ||
1556 | if (copy_from_user(&m, useraddr, sizeof(m))) | ||
1557 | return -EFAULT; | ||
1558 | + if (m.cmd != CHELSIO_SETMTUTAB) | ||
1559 | + return -EINVAL; | ||
1560 | if (m.nmtus != NMTUS) | ||
1561 | return -EINVAL; | ||
1562 | if (m.mtus[0] < 81) /* accommodate SACK */ | ||
1563 | @@ -2398,6 +2409,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | ||
1564 | return -EBUSY; | ||
1565 | if (copy_from_user(&m, useraddr, sizeof(m))) | ||
1566 | return -EFAULT; | ||
1567 | + if (m.cmd != CHELSIO_SET_PM) | ||
1568 | + return -EINVAL; | ||
1569 | if (!is_power_of_2(m.rx_pg_sz) || | ||
1570 | !is_power_of_2(m.tx_pg_sz)) | ||
1571 | return -EINVAL; /* not power of 2 */ | ||
1572 | @@ -2431,6 +2444,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | ||
1573 | return -EIO; /* need the memory controllers */ | ||
1574 | if (copy_from_user(&t, useraddr, sizeof(t))) | ||
1575 | return -EFAULT; | ||
1576 | + if (t.cmd != CHELSIO_GET_MEM) | ||
1577 | + return -EINVAL; | ||
1578 | if ((t.addr & 7) || (t.len & 7)) | ||
1579 | return -EINVAL; | ||
1580 | if (t.mem_id == MEM_CM) | ||
1581 | @@ -2483,6 +2498,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | ||
1582 | return -EAGAIN; | ||
1583 | if (copy_from_user(&t, useraddr, sizeof(t))) | ||
1584 | return -EFAULT; | ||
1585 | + if (t.cmd != CHELSIO_SET_TRACE_FILTER) | ||
1586 | + return -EINVAL; | ||
1587 | |||
1588 | tp = (const struct trace_params *)&t.sip; | ||
1589 | if (t.config_tx) | ||
1590 | diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c | ||
1591 | index f314be07ec58..07282eb76867 100644 | ||
1592 | --- a/drivers/net/ethernet/cisco/enic/enic_main.c | ||
1593 | +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | ||
1594 | @@ -1708,7 +1708,7 @@ static int enic_open(struct net_device *netdev) | ||
1595 | { | ||
1596 | struct enic *enic = netdev_priv(netdev); | ||
1597 | unsigned int i; | ||
1598 | - int err; | ||
1599 | + int err, ret; | ||
1600 | |||
1601 | err = enic_request_intr(enic); | ||
1602 | if (err) { | ||
1603 | @@ -1766,10 +1766,9 @@ static int enic_open(struct net_device *netdev) | ||
1604 | |||
1605 | err_out_free_rq: | ||
1606 | for (i = 0; i < enic->rq_count; i++) { | ||
1607 | - err = vnic_rq_disable(&enic->rq[i]); | ||
1608 | - if (err) | ||
1609 | - return err; | ||
1610 | - vnic_rq_clean(&enic->rq[i], enic_free_rq_buf); | ||
1611 | + ret = vnic_rq_disable(&enic->rq[i]); | ||
1612 | + if (!ret) | ||
1613 | + vnic_rq_clean(&enic->rq[i], enic_free_rq_buf); | ||
1614 | } | ||
1615 | enic_dev_notify_unset(enic); | ||
1616 | err_out_free_intr: | ||
1617 | diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c | ||
1618 | index fe00f71bc6b4..051ecc76a7ef 100644 | ||
1619 | --- a/drivers/net/ethernet/freescale/fec_main.c | ||
1620 | +++ b/drivers/net/ethernet/freescale/fec_main.c | ||
1621 | @@ -1152,7 +1152,7 @@ static void fec_enet_timeout_work(struct work_struct *work) | ||
1622 | napi_disable(&fep->napi); | ||
1623 | netif_tx_lock_bh(ndev); | ||
1624 | fec_restart(ndev); | ||
1625 | - netif_wake_queue(ndev); | ||
1626 | + netif_tx_wake_all_queues(ndev); | ||
1627 | netif_tx_unlock_bh(ndev); | ||
1628 | napi_enable(&fep->napi); | ||
1629 | } | ||
1630 | @@ -1267,7 +1267,7 @@ skb_done: | ||
1631 | |||
1632 | /* Since we have freed up a buffer, the ring is no longer full | ||
1633 | */ | ||
1634 | - if (netif_queue_stopped(ndev)) { | ||
1635 | + if (netif_tx_queue_stopped(nq)) { | ||
1636 | entries_free = fec_enet_get_free_txdesc_num(txq); | ||
1637 | if (entries_free >= txq->tx_wake_threshold) | ||
1638 | netif_tx_wake_queue(nq); | ||
1639 | @@ -1744,7 +1744,7 @@ static void fec_enet_adjust_link(struct net_device *ndev) | ||
1640 | napi_disable(&fep->napi); | ||
1641 | netif_tx_lock_bh(ndev); | ||
1642 | fec_restart(ndev); | ||
1643 | - netif_wake_queue(ndev); | ||
1644 | + netif_tx_wake_all_queues(ndev); | ||
1645 | netif_tx_unlock_bh(ndev); | ||
1646 | napi_enable(&fep->napi); | ||
1647 | } | ||
1648 | @@ -2247,7 +2247,7 @@ static int fec_enet_set_pauseparam(struct net_device *ndev, | ||
1649 | napi_disable(&fep->napi); | ||
1650 | netif_tx_lock_bh(ndev); | ||
1651 | fec_restart(ndev); | ||
1652 | - netif_wake_queue(ndev); | ||
1653 | + netif_tx_wake_all_queues(ndev); | ||
1654 | netif_tx_unlock_bh(ndev); | ||
1655 | napi_enable(&fep->napi); | ||
1656 | } | ||
1657 | diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c | ||
1658 | index 4b86260584a0..8b66551511f5 100644 | ||
1659 | --- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c | ||
1660 | +++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c | ||
1661 | @@ -613,9 +613,11 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
1662 | return NETDEV_TX_OK; | ||
1663 | } | ||
1664 | |||
1665 | -static void fs_timeout(struct net_device *dev) | ||
1666 | +static void fs_timeout_work(struct work_struct *work) | ||
1667 | { | ||
1668 | - struct fs_enet_private *fep = netdev_priv(dev); | ||
1669 | + struct fs_enet_private *fep = container_of(work, struct fs_enet_private, | ||
1670 | + timeout_work); | ||
1671 | + struct net_device *dev = fep->ndev; | ||
1672 | unsigned long flags; | ||
1673 | int wake = 0; | ||
1674 | |||
1675 | @@ -627,7 +629,6 @@ static void fs_timeout(struct net_device *dev) | ||
1676 | phy_stop(dev->phydev); | ||
1677 | (*fep->ops->stop)(dev); | ||
1678 | (*fep->ops->restart)(dev); | ||
1679 | - phy_start(dev->phydev); | ||
1680 | } | ||
1681 | |||
1682 | phy_start(dev->phydev); | ||
1683 | @@ -639,6 +640,13 @@ static void fs_timeout(struct net_device *dev) | ||
1684 | netif_wake_queue(dev); | ||
1685 | } | ||
1686 | |||
1687 | +static void fs_timeout(struct net_device *dev) | ||
1688 | +{ | ||
1689 | + struct fs_enet_private *fep = netdev_priv(dev); | ||
1690 | + | ||
1691 | + schedule_work(&fep->timeout_work); | ||
1692 | +} | ||
1693 | + | ||
1694 | /*----------------------------------------------------------------------------- | ||
1695 | * generic link-change handler - should be sufficient for most cases | ||
1696 | *-----------------------------------------------------------------------------*/ | ||
1697 | @@ -759,6 +767,7 @@ static int fs_enet_close(struct net_device *dev) | ||
1698 | netif_stop_queue(dev); | ||
1699 | netif_carrier_off(dev); | ||
1700 | napi_disable(&fep->napi); | ||
1701 | + cancel_work_sync(&fep->timeout_work); | ||
1702 | phy_stop(dev->phydev); | ||
1703 | |||
1704 | spin_lock_irqsave(&fep->lock, flags); | ||
1705 | @@ -1033,6 +1042,7 @@ static int fs_enet_probe(struct platform_device *ofdev) | ||
1706 | |||
1707 | ndev->netdev_ops = &fs_enet_netdev_ops; | ||
1708 | ndev->watchdog_timeo = 2 * HZ; | ||
1709 | + INIT_WORK(&fep->timeout_work, fs_timeout_work); | ||
1710 | netif_napi_add(ndev, &fep->napi, fs_enet_napi, fpi->napi_weight); | ||
1711 | |||
1712 | ndev->ethtool_ops = &fs_ethtool_ops; | ||
1713 | diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet.h b/drivers/net/ethernet/freescale/fs_enet/fs_enet.h | ||
1714 | index fee24c822fad..0e4e024449ec 100644 | ||
1715 | --- a/drivers/net/ethernet/freescale/fs_enet/fs_enet.h | ||
1716 | +++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet.h | ||
1717 | @@ -124,6 +124,7 @@ struct fs_enet_private { | ||
1718 | spinlock_t lock; /* during all ops except TX pckt processing */ | ||
1719 | spinlock_t tx_lock; /* during fs_start_xmit and fs_tx */ | ||
1720 | struct fs_platform_info *fpi; | ||
1721 | + struct work_struct timeout_work; | ||
1722 | const struct fs_ops *ops; | ||
1723 | int rx_ring, tx_ring; | ||
1724 | dma_addr_t ring_mem_addr; | ||
1725 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_nvm.c b/drivers/net/ethernet/intel/i40e/i40e_nvm.c | ||
1726 | index abe290bfc638..8408682efd86 100644 | ||
1727 | --- a/drivers/net/ethernet/intel/i40e/i40e_nvm.c | ||
1728 | +++ b/drivers/net/ethernet/intel/i40e/i40e_nvm.c | ||
1729 | @@ -266,7 +266,7 @@ static i40e_status i40e_read_nvm_aq(struct i40e_hw *hw, u8 module_pointer, | ||
1730 | * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF) | ||
1731 | * @data: word read from the Shadow RAM | ||
1732 | * | ||
1733 | - * Reads one 16 bit word from the Shadow RAM using the GLNVM_SRCTL register. | ||
1734 | + * Reads one 16 bit word from the Shadow RAM using the AdminQ | ||
1735 | **/ | ||
1736 | static i40e_status i40e_read_nvm_word_aq(struct i40e_hw *hw, u16 offset, | ||
1737 | u16 *data) | ||
1738 | @@ -280,27 +280,49 @@ static i40e_status i40e_read_nvm_word_aq(struct i40e_hw *hw, u16 offset, | ||
1739 | } | ||
1740 | |||
1741 | /** | ||
1742 | - * i40e_read_nvm_word - Reads Shadow RAM | ||
1743 | + * __i40e_read_nvm_word - Reads nvm word, assumes called does the locking | ||
1744 | * @hw: pointer to the HW structure | ||
1745 | * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF) | ||
1746 | * @data: word read from the Shadow RAM | ||
1747 | * | ||
1748 | - * Reads one 16 bit word from the Shadow RAM using the GLNVM_SRCTL register. | ||
1749 | + * Reads one 16 bit word from the Shadow RAM. | ||
1750 | + * | ||
1751 | + * Do not use this function except in cases where the nvm lock is already | ||
1752 | + * taken via i40e_acquire_nvm(). | ||
1753 | + **/ | ||
1754 | +static i40e_status __i40e_read_nvm_word(struct i40e_hw *hw, | ||
1755 | + u16 offset, u16 *data) | ||
1756 | +{ | ||
1757 | + i40e_status ret_code = 0; | ||
1758 | + | ||
1759 | + if (hw->flags & I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE) | ||
1760 | + ret_code = i40e_read_nvm_word_aq(hw, offset, data); | ||
1761 | + else | ||
1762 | + ret_code = i40e_read_nvm_word_srctl(hw, offset, data); | ||
1763 | + return ret_code; | ||
1764 | +} | ||
1765 | + | ||
1766 | +/** | ||
1767 | + * i40e_read_nvm_word - Reads nvm word and acquire lock if necessary | ||
1768 | + * @hw: pointer to the HW structure | ||
1769 | + * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF) | ||
1770 | + * @data: word read from the Shadow RAM | ||
1771 | + * | ||
1772 | + * Reads one 16 bit word from the Shadow RAM. | ||
1773 | **/ | ||
1774 | i40e_status i40e_read_nvm_word(struct i40e_hw *hw, u16 offset, | ||
1775 | u16 *data) | ||
1776 | { | ||
1777 | - enum i40e_status_code ret_code = 0; | ||
1778 | + i40e_status ret_code = 0; | ||
1779 | |||
1780 | ret_code = i40e_acquire_nvm(hw, I40E_RESOURCE_READ); | ||
1781 | - if (!ret_code) { | ||
1782 | - if (hw->flags & I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE) { | ||
1783 | - ret_code = i40e_read_nvm_word_aq(hw, offset, data); | ||
1784 | - } else { | ||
1785 | - ret_code = i40e_read_nvm_word_srctl(hw, offset, data); | ||
1786 | - } | ||
1787 | - i40e_release_nvm(hw); | ||
1788 | - } | ||
1789 | + if (ret_code) | ||
1790 | + return ret_code; | ||
1791 | + | ||
1792 | + ret_code = __i40e_read_nvm_word(hw, offset, data); | ||
1793 | + | ||
1794 | + i40e_release_nvm(hw); | ||
1795 | + | ||
1796 | return ret_code; | ||
1797 | } | ||
1798 | |||
1799 | @@ -393,31 +415,25 @@ read_nvm_buffer_aq_exit: | ||
1800 | } | ||
1801 | |||
1802 | /** | ||
1803 | - * i40e_read_nvm_buffer - Reads Shadow RAM buffer | ||
1804 | + * __i40e_read_nvm_buffer - Reads nvm buffer, caller must acquire lock | ||
1805 | * @hw: pointer to the HW structure | ||
1806 | * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF). | ||
1807 | * @words: (in) number of words to read; (out) number of words actually read | ||
1808 | * @data: words read from the Shadow RAM | ||
1809 | * | ||
1810 | * Reads 16 bit words (data buffer) from the SR using the i40e_read_nvm_srrd() | ||
1811 | - * method. The buffer read is preceded by the NVM ownership take | ||
1812 | - * and followed by the release. | ||
1813 | + * method. | ||
1814 | **/ | ||
1815 | -i40e_status i40e_read_nvm_buffer(struct i40e_hw *hw, u16 offset, | ||
1816 | - u16 *words, u16 *data) | ||
1817 | +static i40e_status __i40e_read_nvm_buffer(struct i40e_hw *hw, | ||
1818 | + u16 offset, u16 *words, | ||
1819 | + u16 *data) | ||
1820 | { | ||
1821 | - enum i40e_status_code ret_code = 0; | ||
1822 | + i40e_status ret_code = 0; | ||
1823 | |||
1824 | - if (hw->flags & I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE) { | ||
1825 | - ret_code = i40e_acquire_nvm(hw, I40E_RESOURCE_READ); | ||
1826 | - if (!ret_code) { | ||
1827 | - ret_code = i40e_read_nvm_buffer_aq(hw, offset, words, | ||
1828 | - data); | ||
1829 | - i40e_release_nvm(hw); | ||
1830 | - } | ||
1831 | - } else { | ||
1832 | + if (hw->flags & I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE) | ||
1833 | + ret_code = i40e_read_nvm_buffer_aq(hw, offset, words, data); | ||
1834 | + else | ||
1835 | ret_code = i40e_read_nvm_buffer_srctl(hw, offset, words, data); | ||
1836 | - } | ||
1837 | return ret_code; | ||
1838 | } | ||
1839 | |||
1840 | @@ -499,15 +515,15 @@ static i40e_status i40e_calc_nvm_checksum(struct i40e_hw *hw, | ||
1841 | data = (u16 *)vmem.va; | ||
1842 | |||
1843 | /* read pointer to VPD area */ | ||
1844 | - ret_code = i40e_read_nvm_word(hw, I40E_SR_VPD_PTR, &vpd_module); | ||
1845 | + ret_code = __i40e_read_nvm_word(hw, I40E_SR_VPD_PTR, &vpd_module); | ||
1846 | if (ret_code) { | ||
1847 | ret_code = I40E_ERR_NVM_CHECKSUM; | ||
1848 | goto i40e_calc_nvm_checksum_exit; | ||
1849 | } | ||
1850 | |||
1851 | /* read pointer to PCIe Alt Auto-load module */ | ||
1852 | - ret_code = i40e_read_nvm_word(hw, I40E_SR_PCIE_ALT_AUTO_LOAD_PTR, | ||
1853 | - &pcie_alt_module); | ||
1854 | + ret_code = __i40e_read_nvm_word(hw, I40E_SR_PCIE_ALT_AUTO_LOAD_PTR, | ||
1855 | + &pcie_alt_module); | ||
1856 | if (ret_code) { | ||
1857 | ret_code = I40E_ERR_NVM_CHECKSUM; | ||
1858 | goto i40e_calc_nvm_checksum_exit; | ||
1859 | @@ -521,7 +537,7 @@ static i40e_status i40e_calc_nvm_checksum(struct i40e_hw *hw, | ||
1860 | if ((i % I40E_SR_SECTOR_SIZE_IN_WORDS) == 0) { | ||
1861 | u16 words = I40E_SR_SECTOR_SIZE_IN_WORDS; | ||
1862 | |||
1863 | - ret_code = i40e_read_nvm_buffer(hw, i, &words, data); | ||
1864 | + ret_code = __i40e_read_nvm_buffer(hw, i, &words, data); | ||
1865 | if (ret_code) { | ||
1866 | ret_code = I40E_ERR_NVM_CHECKSUM; | ||
1867 | goto i40e_calc_nvm_checksum_exit; | ||
1868 | @@ -593,14 +609,19 @@ i40e_status i40e_validate_nvm_checksum(struct i40e_hw *hw, | ||
1869 | u16 checksum_sr = 0; | ||
1870 | u16 checksum_local = 0; | ||
1871 | |||
1872 | + /* We must acquire the NVM lock in order to correctly synchronize the | ||
1873 | + * NVM accesses across multiple PFs. Without doing so it is possible | ||
1874 | + * for one of the PFs to read invalid data potentially indicating that | ||
1875 | + * the checksum is invalid. | ||
1876 | + */ | ||
1877 | + ret_code = i40e_acquire_nvm(hw, I40E_RESOURCE_READ); | ||
1878 | + if (ret_code) | ||
1879 | + return ret_code; | ||
1880 | ret_code = i40e_calc_nvm_checksum(hw, &checksum_local); | ||
1881 | + __i40e_read_nvm_word(hw, I40E_SR_SW_CHECKSUM_WORD, &checksum_sr); | ||
1882 | + i40e_release_nvm(hw); | ||
1883 | if (ret_code) | ||
1884 | - goto i40e_validate_nvm_checksum_exit; | ||
1885 | - | ||
1886 | - /* Do not use i40e_read_nvm_word() because we do not want to take | ||
1887 | - * the synchronization semaphores twice here. | ||
1888 | - */ | ||
1889 | - i40e_read_nvm_word(hw, I40E_SR_SW_CHECKSUM_WORD, &checksum_sr); | ||
1890 | + return ret_code; | ||
1891 | |||
1892 | /* Verify read checksum from EEPROM is the same as | ||
1893 | * calculated checksum | ||
1894 | @@ -612,7 +633,6 @@ i40e_status i40e_validate_nvm_checksum(struct i40e_hw *hw, | ||
1895 | if (checksum) | ||
1896 | *checksum = checksum_local; | ||
1897 | |||
1898 | -i40e_validate_nvm_checksum_exit: | ||
1899 | return ret_code; | ||
1900 | } | ||
1901 | |||
1902 | @@ -986,6 +1006,7 @@ retry: | ||
1903 | break; | ||
1904 | |||
1905 | case I40E_NVMUPD_CSUM_CON: | ||
1906 | + /* Assumes the caller has acquired the nvm */ | ||
1907 | status = i40e_update_nvm_checksum(hw); | ||
1908 | if (status) { | ||
1909 | *perrno = hw->aq.asq_last_status ? | ||
1910 | @@ -1000,6 +1021,7 @@ retry: | ||
1911 | break; | ||
1912 | |||
1913 | case I40E_NVMUPD_CSUM_LCB: | ||
1914 | + /* Assumes the caller has acquired the nvm */ | ||
1915 | status = i40e_update_nvm_checksum(hw); | ||
1916 | if (status) { | ||
1917 | *perrno = hw->aq.asq_last_status ? | ||
1918 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_prototype.h b/drivers/net/ethernet/intel/i40e/i40e_prototype.h | ||
1919 | index 4660c5abc855..6b364118badd 100644 | ||
1920 | --- a/drivers/net/ethernet/intel/i40e/i40e_prototype.h | ||
1921 | +++ b/drivers/net/ethernet/intel/i40e/i40e_prototype.h | ||
1922 | @@ -311,8 +311,6 @@ i40e_status i40e_acquire_nvm(struct i40e_hw *hw, | ||
1923 | void i40e_release_nvm(struct i40e_hw *hw); | ||
1924 | i40e_status i40e_read_nvm_word(struct i40e_hw *hw, u16 offset, | ||
1925 | u16 *data); | ||
1926 | -i40e_status i40e_read_nvm_buffer(struct i40e_hw *hw, u16 offset, | ||
1927 | - u16 *words, u16 *data); | ||
1928 | i40e_status i40e_update_nvm_checksum(struct i40e_hw *hw); | ||
1929 | i40e_status i40e_validate_nvm_checksum(struct i40e_hw *hw, | ||
1930 | u16 *checksum); | ||
1931 | diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c | ||
1932 | index 4a50870e0fa7..a61447fd778e 100644 | ||
1933 | --- a/drivers/net/ethernet/intel/igb/e1000_82575.c | ||
1934 | +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c | ||
1935 | @@ -245,19 +245,7 @@ static s32 igb_init_phy_params_82575(struct e1000_hw *hw) | ||
1936 | hw->bus.func = (rd32(E1000_STATUS) & E1000_STATUS_FUNC_MASK) >> | ||
1937 | E1000_STATUS_FUNC_SHIFT; | ||
1938 | |||
1939 | - /* Make sure the PHY is in a good state. Several people have reported | ||
1940 | - * firmware leaving the PHY's page select register set to something | ||
1941 | - * other than the default of zero, which causes the PHY ID read to | ||
1942 | - * access something other than the intended register. | ||
1943 | - */ | ||
1944 | - ret_val = hw->phy.ops.reset(hw); | ||
1945 | - if (ret_val) { | ||
1946 | - hw_dbg("Error resetting the PHY.\n"); | ||
1947 | - goto out; | ||
1948 | - } | ||
1949 | - | ||
1950 | /* Set phy->phy_addr and phy->id. */ | ||
1951 | - igb_write_phy_reg_82580(hw, I347AT4_PAGE_SELECT, 0); | ||
1952 | ret_val = igb_get_phy_id_82575(hw); | ||
1953 | if (ret_val) | ||
1954 | return ret_val; | ||
1955 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c | ||
1956 | index 9680c8805178..1d5263c46eee 100644 | ||
1957 | --- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c | ||
1958 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c | ||
1959 | @@ -965,7 +965,7 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in, | ||
1960 | |||
1961 | err = wait_func(dev, ent); | ||
1962 | if (err == -ETIMEDOUT) | ||
1963 | - goto out_free; | ||
1964 | + goto out; | ||
1965 | |||
1966 | ds = ent->ts2 - ent->ts1; | ||
1967 | op = MLX5_GET(mbox_in, in->first.data, opcode); | ||
1968 | @@ -1428,6 +1428,7 @@ void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec, bool forced) | ||
1969 | mlx5_core_err(dev, "Command completion arrived after timeout (entry idx = %d).\n", | ||
1970 | ent->idx); | ||
1971 | free_ent(cmd, ent->idx); | ||
1972 | + free_cmd(ent); | ||
1973 | } | ||
1974 | continue; | ||
1975 | } | ||
1976 | @@ -1486,7 +1487,8 @@ void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec, bool forced) | ||
1977 | free_msg(dev, ent->in); | ||
1978 | |||
1979 | err = err ? err : ent->status; | ||
1980 | - free_cmd(ent); | ||
1981 | + if (!forced) | ||
1982 | + free_cmd(ent); | ||
1983 | callback(err, context); | ||
1984 | } else { | ||
1985 | complete(&ent->done); | ||
1986 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c | ||
1987 | index 23ccec4cb7f5..a1f3556307c7 100644 | ||
1988 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c | ||
1989 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx_am.c | ||
1990 | @@ -197,9 +197,15 @@ static int mlx5e_am_stats_compare(struct mlx5e_rx_am_stats *curr, | ||
1991 | return (curr->bpms > prev->bpms) ? MLX5E_AM_STATS_BETTER : | ||
1992 | MLX5E_AM_STATS_WORSE; | ||
1993 | |||
1994 | + if (!prev->ppms) | ||
1995 | + return curr->ppms ? MLX5E_AM_STATS_BETTER : | ||
1996 | + MLX5E_AM_STATS_SAME; | ||
1997 | + | ||
1998 | if (IS_SIGNIFICANT_DIFF(curr->ppms, prev->ppms)) | ||
1999 | return (curr->ppms > prev->ppms) ? MLX5E_AM_STATS_BETTER : | ||
2000 | MLX5E_AM_STATS_WORSE; | ||
2001 | + if (!prev->epms) | ||
2002 | + return MLX5E_AM_STATS_SAME; | ||
2003 | |||
2004 | if (IS_SIGNIFICANT_DIFF(curr->epms, prev->epms)) | ||
2005 | return (curr->epms < prev->epms) ? MLX5E_AM_STATS_BETTER : | ||
2006 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/health.c b/drivers/net/ethernet/mellanox/mlx5/core/health.c | ||
2007 | index 448e71e07668..264f51b3409d 100644 | ||
2008 | --- a/drivers/net/ethernet/mellanox/mlx5/core/health.c | ||
2009 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/health.c | ||
2010 | @@ -369,10 +369,11 @@ void mlx5_drain_health_wq(struct mlx5_core_dev *dev) | ||
2011 | void mlx5_drain_health_recovery(struct mlx5_core_dev *dev) | ||
2012 | { | ||
2013 | struct mlx5_core_health *health = &dev->priv.health; | ||
2014 | + unsigned long flags; | ||
2015 | |||
2016 | - spin_lock(&health->wq_lock); | ||
2017 | + spin_lock_irqsave(&health->wq_lock, flags); | ||
2018 | set_bit(MLX5_DROP_NEW_RECOVERY_WORK, &health->flags); | ||
2019 | - spin_unlock(&health->wq_lock); | ||
2020 | + spin_unlock_irqrestore(&health->wq_lock, flags); | ||
2021 | cancel_delayed_work_sync(&dev->priv.health.recover_work); | ||
2022 | } | ||
2023 | |||
2024 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
2025 | index 6698a3a07406..d676088512cf 100644 | ||
2026 | --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
2027 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
2028 | @@ -957,7 +957,7 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv, | ||
2029 | if (err) { | ||
2030 | dev_err(&dev->pdev->dev, "Firmware over %d MS in pre-initializing state, aborting\n", | ||
2031 | FW_PRE_INIT_TIMEOUT_MILI); | ||
2032 | - goto out; | ||
2033 | + goto out_err; | ||
2034 | } | ||
2035 | |||
2036 | err = mlx5_cmd_init(dev); | ||
2037 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_hw.c b/drivers/net/ethernet/qlogic/qed/qed_hw.c | ||
2038 | index 6e4fae9b1430..944749cfe092 100644 | ||
2039 | --- a/drivers/net/ethernet/qlogic/qed/qed_hw.c | ||
2040 | +++ b/drivers/net/ethernet/qlogic/qed/qed_hw.c | ||
2041 | @@ -34,6 +34,7 @@ struct qed_ptt { | ||
2042 | struct list_head list_entry; | ||
2043 | unsigned int idx; | ||
2044 | struct pxp_ptt_entry pxp; | ||
2045 | + u8 hwfn_id; | ||
2046 | }; | ||
2047 | |||
2048 | struct qed_ptt_pool { | ||
2049 | @@ -55,6 +56,7 @@ int qed_ptt_pool_alloc(struct qed_hwfn *p_hwfn) | ||
2050 | p_pool->ptts[i].idx = i; | ||
2051 | p_pool->ptts[i].pxp.offset = QED_BAR_INVALID_OFFSET; | ||
2052 | p_pool->ptts[i].pxp.pretend.control = 0; | ||
2053 | + p_pool->ptts[i].hwfn_id = p_hwfn->my_id; | ||
2054 | if (i >= RESERVED_PTT_MAX) | ||
2055 | list_add(&p_pool->ptts[i].list_entry, | ||
2056 | &p_pool->free_list); | ||
2057 | @@ -169,6 +171,11 @@ static u32 qed_set_ptt(struct qed_hwfn *p_hwfn, | ||
2058 | |||
2059 | offset = hw_addr - win_hw_addr; | ||
2060 | |||
2061 | + if (p_ptt->hwfn_id != p_hwfn->my_id) | ||
2062 | + DP_NOTICE(p_hwfn, | ||
2063 | + "ptt[%d] of hwfn[%02x] is used by hwfn[%02x]!\n", | ||
2064 | + p_ptt->idx, p_ptt->hwfn_id, p_hwfn->my_id); | ||
2065 | + | ||
2066 | /* Verify the address is within the window */ | ||
2067 | if (hw_addr < win_hw_addr || | ||
2068 | offset >= PXP_EXTERNAL_BAR_PF_WINDOW_SINGLE_SIZE) { | ||
2069 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_roce.c b/drivers/net/ethernet/qlogic/qed/qed_roce.c | ||
2070 | index d9dcb0d1714c..07783d13df71 100644 | ||
2071 | --- a/drivers/net/ethernet/qlogic/qed/qed_roce.c | ||
2072 | +++ b/drivers/net/ethernet/qlogic/qed/qed_roce.c | ||
2073 | @@ -1059,23 +1059,16 @@ static void qed_rdma_copy_gids(struct qed_rdma_qp *qp, __le32 *src_gid, | ||
2074 | |||
2075 | static enum roce_flavor qed_roce_mode_to_flavor(enum roce_mode roce_mode) | ||
2076 | { | ||
2077 | - enum roce_flavor flavor; | ||
2078 | - | ||
2079 | switch (roce_mode) { | ||
2080 | case ROCE_V1: | ||
2081 | - flavor = PLAIN_ROCE; | ||
2082 | - break; | ||
2083 | + return PLAIN_ROCE; | ||
2084 | case ROCE_V2_IPV4: | ||
2085 | - flavor = RROCE_IPV4; | ||
2086 | - break; | ||
2087 | + return RROCE_IPV4; | ||
2088 | case ROCE_V2_IPV6: | ||
2089 | - flavor = ROCE_V2_IPV6; | ||
2090 | - break; | ||
2091 | + return RROCE_IPV6; | ||
2092 | default: | ||
2093 | - flavor = MAX_ROCE_MODE; | ||
2094 | - break; | ||
2095 | + return MAX_ROCE_FLAVOR; | ||
2096 | } | ||
2097 | - return flavor; | ||
2098 | } | ||
2099 | |||
2100 | static int qed_roce_alloc_cid(struct qed_hwfn *p_hwfn, u16 *cid) | ||
2101 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_vf.c b/drivers/net/ethernet/qlogic/qed/qed_vf.c | ||
2102 | index faf8215872de..9cc02b94328a 100644 | ||
2103 | --- a/drivers/net/ethernet/qlogic/qed/qed_vf.c | ||
2104 | +++ b/drivers/net/ethernet/qlogic/qed/qed_vf.c | ||
2105 | @@ -295,7 +295,6 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn) | ||
2106 | } | ||
2107 | |||
2108 | if (!p_iov->b_pre_fp_hsi && | ||
2109 | - ETH_HSI_VER_MINOR && | ||
2110 | (resp->pfdev_info.minor_fp_hsi < ETH_HSI_VER_MINOR)) { | ||
2111 | DP_INFO(p_hwfn, | ||
2112 | "PF is using older fastpath HSI; %02x.%02x is configured\n", | ||
2113 | diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | ||
2114 | index 5ddadcd0c8db..f1242ab32ca6 100644 | ||
2115 | --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | ||
2116 | +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | ||
2117 | @@ -1825,22 +1825,44 @@ struct qlcnic_hardware_ops { | ||
2118 | u32 (*get_cap_size)(void *, int); | ||
2119 | void (*set_sys_info)(void *, int, u32); | ||
2120 | void (*store_cap_mask)(void *, u32); | ||
2121 | + bool (*encap_rx_offload) (struct qlcnic_adapter *adapter); | ||
2122 | + bool (*encap_tx_offload) (struct qlcnic_adapter *adapter); | ||
2123 | }; | ||
2124 | |||
2125 | extern struct qlcnic_nic_template qlcnic_vf_ops; | ||
2126 | |||
2127 | -static inline bool qlcnic_encap_tx_offload(struct qlcnic_adapter *adapter) | ||
2128 | +static inline bool qlcnic_83xx_encap_tx_offload(struct qlcnic_adapter *adapter) | ||
2129 | { | ||
2130 | return adapter->ahw->extra_capability[0] & | ||
2131 | QLCNIC_83XX_FW_CAPAB_ENCAP_TX_OFFLOAD; | ||
2132 | } | ||
2133 | |||
2134 | -static inline bool qlcnic_encap_rx_offload(struct qlcnic_adapter *adapter) | ||
2135 | +static inline bool qlcnic_83xx_encap_rx_offload(struct qlcnic_adapter *adapter) | ||
2136 | { | ||
2137 | return adapter->ahw->extra_capability[0] & | ||
2138 | QLCNIC_83XX_FW_CAPAB_ENCAP_RX_OFFLOAD; | ||
2139 | } | ||
2140 | |||
2141 | +static inline bool qlcnic_82xx_encap_tx_offload(struct qlcnic_adapter *adapter) | ||
2142 | +{ | ||
2143 | + return false; | ||
2144 | +} | ||
2145 | + | ||
2146 | +static inline bool qlcnic_82xx_encap_rx_offload(struct qlcnic_adapter *adapter) | ||
2147 | +{ | ||
2148 | + return false; | ||
2149 | +} | ||
2150 | + | ||
2151 | +static inline bool qlcnic_encap_rx_offload(struct qlcnic_adapter *adapter) | ||
2152 | +{ | ||
2153 | + return adapter->ahw->hw_ops->encap_rx_offload(adapter); | ||
2154 | +} | ||
2155 | + | ||
2156 | +static inline bool qlcnic_encap_tx_offload(struct qlcnic_adapter *adapter) | ||
2157 | +{ | ||
2158 | + return adapter->ahw->hw_ops->encap_tx_offload(adapter); | ||
2159 | +} | ||
2160 | + | ||
2161 | static inline int qlcnic_start_firmware(struct qlcnic_adapter *adapter) | ||
2162 | { | ||
2163 | return adapter->nic_ops->start_firmware(adapter); | ||
2164 | diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | ||
2165 | index 05d32e86bcf7..35c5ac41c0a1 100644 | ||
2166 | --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | ||
2167 | +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | ||
2168 | @@ -242,6 +242,8 @@ static struct qlcnic_hardware_ops qlcnic_83xx_hw_ops = { | ||
2169 | .get_cap_size = qlcnic_83xx_get_cap_size, | ||
2170 | .set_sys_info = qlcnic_83xx_set_sys_info, | ||
2171 | .store_cap_mask = qlcnic_83xx_store_cap_mask, | ||
2172 | + .encap_rx_offload = qlcnic_83xx_encap_rx_offload, | ||
2173 | + .encap_tx_offload = qlcnic_83xx_encap_tx_offload, | ||
2174 | }; | ||
2175 | |||
2176 | static struct qlcnic_nic_template qlcnic_83xx_ops = { | ||
2177 | diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | ||
2178 | index 3ae3968b0edf..ebf5ead16939 100644 | ||
2179 | --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | ||
2180 | +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | ||
2181 | @@ -632,6 +632,8 @@ static struct qlcnic_hardware_ops qlcnic_hw_ops = { | ||
2182 | .get_cap_size = qlcnic_82xx_get_cap_size, | ||
2183 | .set_sys_info = qlcnic_82xx_set_sys_info, | ||
2184 | .store_cap_mask = qlcnic_82xx_store_cap_mask, | ||
2185 | + .encap_rx_offload = qlcnic_82xx_encap_rx_offload, | ||
2186 | + .encap_tx_offload = qlcnic_82xx_encap_tx_offload, | ||
2187 | }; | ||
2188 | |||
2189 | static int qlcnic_check_multi_tx_capability(struct qlcnic_adapter *adapter) | ||
2190 | diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | ||
2191 | index 2f656f395f39..c58180f40844 100644 | ||
2192 | --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | ||
2193 | +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | ||
2194 | @@ -77,6 +77,8 @@ static struct qlcnic_hardware_ops qlcnic_sriov_vf_hw_ops = { | ||
2195 | .free_mac_list = qlcnic_sriov_vf_free_mac_list, | ||
2196 | .enable_sds_intr = qlcnic_83xx_enable_sds_intr, | ||
2197 | .disable_sds_intr = qlcnic_83xx_disable_sds_intr, | ||
2198 | + .encap_rx_offload = qlcnic_83xx_encap_rx_offload, | ||
2199 | + .encap_tx_offload = qlcnic_83xx_encap_tx_offload, | ||
2200 | }; | ||
2201 | |||
2202 | static struct qlcnic_nic_template qlcnic_sriov_vf_ops = { | ||
2203 | diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c | ||
2204 | index 20f5c0cabc89..24754d3fb0ac 100644 | ||
2205 | --- a/drivers/net/ethernet/realtek/r8169.c | ||
2206 | +++ b/drivers/net/ethernet/realtek/r8169.c | ||
2207 | @@ -7559,17 +7559,15 @@ static int rtl8169_poll(struct napi_struct *napi, int budget) | ||
2208 | struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi); | ||
2209 | struct net_device *dev = tp->dev; | ||
2210 | u16 enable_mask = RTL_EVENT_NAPI | tp->event_slow; | ||
2211 | - int work_done= 0; | ||
2212 | + int work_done; | ||
2213 | u16 status; | ||
2214 | |||
2215 | status = rtl_get_events(tp); | ||
2216 | rtl_ack_events(tp, status & ~tp->event_slow); | ||
2217 | |||
2218 | - if (status & RTL_EVENT_NAPI_RX) | ||
2219 | - work_done = rtl_rx(dev, tp, (u32) budget); | ||
2220 | + work_done = rtl_rx(dev, tp, (u32) budget); | ||
2221 | |||
2222 | - if (status & RTL_EVENT_NAPI_TX) | ||
2223 | - rtl_tx(dev, tp); | ||
2224 | + rtl_tx(dev, tp); | ||
2225 | |||
2226 | if (status & tp->event_slow) { | ||
2227 | enable_mask &= ~tp->event_slow; | ||
2228 | diff --git a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c | ||
2229 | index 489ef146201e..6a9c954492f2 100644 | ||
2230 | --- a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c | ||
2231 | +++ b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c | ||
2232 | @@ -37,6 +37,7 @@ | ||
2233 | #define TSE_PCS_CONTROL_AN_EN_MASK BIT(12) | ||
2234 | #define TSE_PCS_CONTROL_REG 0x00 | ||
2235 | #define TSE_PCS_CONTROL_RESTART_AN_MASK BIT(9) | ||
2236 | +#define TSE_PCS_CTRL_AUTONEG_SGMII 0x1140 | ||
2237 | #define TSE_PCS_IF_MODE_REG 0x28 | ||
2238 | #define TSE_PCS_LINK_TIMER_0_REG 0x24 | ||
2239 | #define TSE_PCS_LINK_TIMER_1_REG 0x26 | ||
2240 | @@ -65,6 +66,7 @@ | ||
2241 | #define TSE_PCS_SW_RESET_TIMEOUT 100 | ||
2242 | #define TSE_PCS_USE_SGMII_AN_MASK BIT(1) | ||
2243 | #define TSE_PCS_USE_SGMII_ENA BIT(0) | ||
2244 | +#define TSE_PCS_IF_USE_SGMII 0x03 | ||
2245 | |||
2246 | #define SGMII_ADAPTER_CTRL_REG 0x00 | ||
2247 | #define SGMII_ADAPTER_DISABLE 0x0001 | ||
2248 | @@ -101,7 +103,9 @@ int tse_pcs_init(void __iomem *base, struct tse_pcs *pcs) | ||
2249 | { | ||
2250 | int ret = 0; | ||
2251 | |||
2252 | - writew(TSE_PCS_USE_SGMII_ENA, base + TSE_PCS_IF_MODE_REG); | ||
2253 | + writew(TSE_PCS_IF_USE_SGMII, base + TSE_PCS_IF_MODE_REG); | ||
2254 | + | ||
2255 | + writew(TSE_PCS_CTRL_AUTONEG_SGMII, base + TSE_PCS_CONTROL_REG); | ||
2256 | |||
2257 | writew(TSE_PCS_SGMII_LINK_TIMER_0, base + TSE_PCS_LINK_TIMER_0_REG); | ||
2258 | writew(TSE_PCS_SGMII_LINK_TIMER_1, base + TSE_PCS_LINK_TIMER_1_REG); | ||
2259 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
2260 | index 0df71865fab1..65ed02bc3ea3 100644 | ||
2261 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
2262 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
2263 | @@ -2199,7 +2199,8 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) | ||
2264 | unsigned int nopaged_len = skb_headlen(skb); | ||
2265 | int i, csum_insertion = 0, is_jumbo = 0; | ||
2266 | int nfrags = skb_shinfo(skb)->nr_frags; | ||
2267 | - unsigned int entry, first_entry; | ||
2268 | + int entry; | ||
2269 | + unsigned int first_entry; | ||
2270 | struct dma_desc *desc, *first; | ||
2271 | unsigned int enh_desc; | ||
2272 | unsigned int des; | ||
2273 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | ||
2274 | index ec295851812b..2abeba41c0af 100644 | ||
2275 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | ||
2276 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | ||
2277 | @@ -216,7 +216,7 @@ static int stmmac_mdio_write_gmac4(struct mii_bus *bus, int phyaddr, int phyreg, | ||
2278 | */ | ||
2279 | int stmmac_mdio_reset(struct mii_bus *bus) | ||
2280 | { | ||
2281 | -#if defined(CONFIG_STMMAC_PLATFORM) | ||
2282 | +#if IS_ENABLED(CONFIG_STMMAC_PLATFORM) | ||
2283 | struct net_device *ndev = bus->priv; | ||
2284 | struct stmmac_priv *priv = netdev_priv(ndev); | ||
2285 | unsigned int mii_address = priv->hw->mii.addr; | ||
2286 | diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c | ||
2287 | index 365a48cfcbbf..653f0b185a68 100644 | ||
2288 | --- a/drivers/net/macsec.c | ||
2289 | +++ b/drivers/net/macsec.c | ||
2290 | @@ -744,6 +744,7 @@ static struct sk_buff *macsec_encrypt(struct sk_buff *skb, | ||
2291 | sg_init_table(sg, ret); | ||
2292 | ret = skb_to_sgvec(skb, sg, 0, skb->len); | ||
2293 | if (unlikely(ret < 0)) { | ||
2294 | + aead_request_free(req); | ||
2295 | macsec_txsa_put(tx_sa); | ||
2296 | kfree_skb(skb); | ||
2297 | return ERR_PTR(ret); | ||
2298 | @@ -956,6 +957,7 @@ static struct sk_buff *macsec_decrypt(struct sk_buff *skb, | ||
2299 | sg_init_table(sg, ret); | ||
2300 | ret = skb_to_sgvec(skb, sg, 0, skb->len); | ||
2301 | if (unlikely(ret < 0)) { | ||
2302 | + aead_request_free(req); | ||
2303 | kfree_skb(skb); | ||
2304 | return ERR_PTR(ret); | ||
2305 | } | ||
2306 | diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c | ||
2307 | index c60c147708c4..520352327104 100644 | ||
2308 | --- a/drivers/net/phy/marvell.c | ||
2309 | +++ b/drivers/net/phy/marvell.c | ||
2310 | @@ -1610,7 +1610,7 @@ static struct phy_driver marvell_drivers[] = { | ||
2311 | .flags = PHY_HAS_INTERRUPT, | ||
2312 | .probe = marvell_probe, | ||
2313 | .config_init = &m88e1145_config_init, | ||
2314 | - .config_aneg = &marvell_config_aneg, | ||
2315 | + .config_aneg = &m88e1101_config_aneg, | ||
2316 | .read_status = &genphy_read_status, | ||
2317 | .ack_interrupt = &marvell_ack_interrupt, | ||
2318 | .config_intr = &marvell_config_intr, | ||
2319 | diff --git a/drivers/net/usb/asix_common.c b/drivers/net/usb/asix_common.c | ||
2320 | index 125cff57c759..3dbb0646b024 100644 | ||
2321 | --- a/drivers/net/usb/asix_common.c | ||
2322 | +++ b/drivers/net/usb/asix_common.c | ||
2323 | @@ -575,6 +575,9 @@ int asix_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | ||
2324 | struct usbnet *dev = netdev_priv(net); | ||
2325 | u8 opt = 0; | ||
2326 | |||
2327 | + if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC)) | ||
2328 | + return -EINVAL; | ||
2329 | + | ||
2330 | if (wolinfo->wolopts & WAKE_PHY) | ||
2331 | opt |= AX_MONITOR_LINK; | ||
2332 | if (wolinfo->wolopts & WAKE_MAGIC) | ||
2333 | diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c | ||
2334 | index 8a6675d92b98..559af8e6ad90 100644 | ||
2335 | --- a/drivers/net/usb/ax88179_178a.c | ||
2336 | +++ b/drivers/net/usb/ax88179_178a.c | ||
2337 | @@ -566,6 +566,9 @@ ax88179_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | ||
2338 | struct usbnet *dev = netdev_priv(net); | ||
2339 | u8 opt = 0; | ||
2340 | |||
2341 | + if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC)) | ||
2342 | + return -EINVAL; | ||
2343 | + | ||
2344 | if (wolinfo->wolopts & WAKE_PHY) | ||
2345 | opt |= AX_MONITOR_MODE_RWLC; | ||
2346 | if (wolinfo->wolopts & WAKE_MAGIC) | ||
2347 | diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c | ||
2348 | index 3086cae62fdc..7b158674ceed 100644 | ||
2349 | --- a/drivers/net/usb/cdc_ncm.c | ||
2350 | +++ b/drivers/net/usb/cdc_ncm.c | ||
2351 | @@ -772,7 +772,7 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ | ||
2352 | int err; | ||
2353 | u8 iface_no; | ||
2354 | struct usb_cdc_parsed_header hdr; | ||
2355 | - u16 curr_ntb_format; | ||
2356 | + __le16 curr_ntb_format; | ||
2357 | |||
2358 | ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); | ||
2359 | if (!ctx) | ||
2360 | @@ -890,7 +890,7 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ | ||
2361 | goto error2; | ||
2362 | } | ||
2363 | |||
2364 | - if (curr_ntb_format == USB_CDC_NCM_NTB32_FORMAT) { | ||
2365 | + if (curr_ntb_format == cpu_to_le16(USB_CDC_NCM_NTB32_FORMAT)) { | ||
2366 | dev_info(&intf->dev, "resetting NTB format to 16-bit"); | ||
2367 | err = usbnet_write_cmd(dev, USB_CDC_SET_NTB_FORMAT, | ||
2368 | USB_TYPE_CLASS | USB_DIR_OUT | ||
2369 | diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c | ||
2370 | index c5e04d1ad73a..0cbcd3f77341 100644 | ||
2371 | --- a/drivers/net/usb/lan78xx.c | ||
2372 | +++ b/drivers/net/usb/lan78xx.c | ||
2373 | @@ -1311,19 +1311,10 @@ static int lan78xx_set_wol(struct net_device *netdev, | ||
2374 | if (ret < 0) | ||
2375 | return ret; | ||
2376 | |||
2377 | - pdata->wol = 0; | ||
2378 | - if (wol->wolopts & WAKE_UCAST) | ||
2379 | - pdata->wol |= WAKE_UCAST; | ||
2380 | - if (wol->wolopts & WAKE_MCAST) | ||
2381 | - pdata->wol |= WAKE_MCAST; | ||
2382 | - if (wol->wolopts & WAKE_BCAST) | ||
2383 | - pdata->wol |= WAKE_BCAST; | ||
2384 | - if (wol->wolopts & WAKE_MAGIC) | ||
2385 | - pdata->wol |= WAKE_MAGIC; | ||
2386 | - if (wol->wolopts & WAKE_PHY) | ||
2387 | - pdata->wol |= WAKE_PHY; | ||
2388 | - if (wol->wolopts & WAKE_ARP) | ||
2389 | - pdata->wol |= WAKE_ARP; | ||
2390 | + if (wol->wolopts & ~WAKE_ALL) | ||
2391 | + return -EINVAL; | ||
2392 | + | ||
2393 | + pdata->wol = wol->wolopts; | ||
2394 | |||
2395 | device_set_wakeup_enable(&dev->udev->dev, (bool)wol->wolopts); | ||
2396 | |||
2397 | diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c | ||
2398 | index 5988674818ed..02e29562d254 100644 | ||
2399 | --- a/drivers/net/usb/r8152.c | ||
2400 | +++ b/drivers/net/usb/r8152.c | ||
2401 | @@ -3776,6 +3776,9 @@ static int rtl8152_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | ||
2402 | if (!rtl_can_wakeup(tp)) | ||
2403 | return -EOPNOTSUPP; | ||
2404 | |||
2405 | + if (wol->wolopts & ~WAKE_ANY) | ||
2406 | + return -EINVAL; | ||
2407 | + | ||
2408 | ret = usb_autopm_get_interface(tp->intf); | ||
2409 | if (ret < 0) | ||
2410 | goto out_set_wol; | ||
2411 | diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c | ||
2412 | index 8d3f938c6a51..977d9c772554 100644 | ||
2413 | --- a/drivers/net/usb/smsc75xx.c | ||
2414 | +++ b/drivers/net/usb/smsc75xx.c | ||
2415 | @@ -731,6 +731,9 @@ static int smsc75xx_ethtool_set_wol(struct net_device *net, | ||
2416 | struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); | ||
2417 | int ret; | ||
2418 | |||
2419 | + if (wolinfo->wolopts & ~SUPPORTED_WAKE) | ||
2420 | + return -EINVAL; | ||
2421 | + | ||
2422 | pdata->wolopts = wolinfo->wolopts & SUPPORTED_WAKE; | ||
2423 | |||
2424 | ret = device_set_wakeup_enable(&dev->udev->dev, pdata->wolopts); | ||
2425 | diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c | ||
2426 | index 831aa33d078a..a167116ceeee 100644 | ||
2427 | --- a/drivers/net/usb/smsc95xx.c | ||
2428 | +++ b/drivers/net/usb/smsc95xx.c | ||
2429 | @@ -775,6 +775,9 @@ static int smsc95xx_ethtool_set_wol(struct net_device *net, | ||
2430 | struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); | ||
2431 | int ret; | ||
2432 | |||
2433 | + if (wolinfo->wolopts & ~SUPPORTED_WAKE) | ||
2434 | + return -EINVAL; | ||
2435 | + | ||
2436 | pdata->wolopts = wolinfo->wolopts & SUPPORTED_WAKE; | ||
2437 | |||
2438 | ret = device_set_wakeup_enable(&dev->udev->dev, pdata->wolopts); | ||
2439 | diff --git a/drivers/net/usb/sr9800.c b/drivers/net/usb/sr9800.c | ||
2440 | index a50df0d8fb9a..004c955c1fd1 100644 | ||
2441 | --- a/drivers/net/usb/sr9800.c | ||
2442 | +++ b/drivers/net/usb/sr9800.c | ||
2443 | @@ -421,6 +421,9 @@ sr_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | ||
2444 | struct usbnet *dev = netdev_priv(net); | ||
2445 | u8 opt = 0; | ||
2446 | |||
2447 | + if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC)) | ||
2448 | + return -EINVAL; | ||
2449 | + | ||
2450 | if (wolinfo->wolopts & WAKE_PHY) | ||
2451 | opt |= SR_MONITOR_LINK; | ||
2452 | if (wolinfo->wolopts & WAKE_MAGIC) | ||
2453 | diff --git a/drivers/net/wireless/ath/ath10k/ahb.c b/drivers/net/wireless/ath/ath10k/ahb.c | ||
2454 | index 45226dbee5ce..da770af83036 100644 | ||
2455 | --- a/drivers/net/wireless/ath/ath10k/ahb.c | ||
2456 | +++ b/drivers/net/wireless/ath/ath10k/ahb.c | ||
2457 | @@ -640,6 +640,7 @@ static int ath10k_ahb_hif_start(struct ath10k *ar) | ||
2458 | { | ||
2459 | ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot ahb hif start\n"); | ||
2460 | |||
2461 | + napi_enable(&ar->napi); | ||
2462 | ath10k_ce_enable_interrupts(ar); | ||
2463 | ath10k_pci_enable_legacy_irq(ar); | ||
2464 | |||
2465 | @@ -692,7 +693,6 @@ static int ath10k_ahb_hif_power_up(struct ath10k *ar) | ||
2466 | ath10k_err(ar, "could not wake up target CPU: %d\n", ret); | ||
2467 | goto err_ce_deinit; | ||
2468 | } | ||
2469 | - napi_enable(&ar->napi); | ||
2470 | |||
2471 | return 0; | ||
2472 | |||
2473 | diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c | ||
2474 | index 65ad7a130ca1..1e41d6c6de36 100644 | ||
2475 | --- a/drivers/net/wireless/ath/ath10k/core.c | ||
2476 | +++ b/drivers/net/wireless/ath/ath10k/core.c | ||
2477 | @@ -698,7 +698,8 @@ static int ath10k_core_get_board_id_from_otp(struct ath10k *ar) | ||
2478 | |||
2479 | if ((result & ATH10K_BMI_BOARD_ID_STATUS_MASK) != 0 || | ||
2480 | (board_id == 0)) { | ||
2481 | - ath10k_warn(ar, "board id is not exist in otp, ignore it\n"); | ||
2482 | + ath10k_dbg(ar, ATH10K_DBG_BOOT, | ||
2483 | + "board id does not exist in otp, ignore it\n"); | ||
2484 | return -EOPNOTSUPP; | ||
2485 | } | ||
2486 | |||
2487 | diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c | ||
2488 | index 4bb36dc73433..cbb3e902e347 100644 | ||
2489 | --- a/drivers/net/wireless/mac80211_hwsim.c | ||
2490 | +++ b/drivers/net/wireless/mac80211_hwsim.c | ||
2491 | @@ -2665,8 +2665,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info, | ||
2492 | list_add_tail(&data->list, &hwsim_radios); | ||
2493 | spin_unlock_bh(&hwsim_radio_lock); | ||
2494 | |||
2495 | - if (idx > 0) | ||
2496 | - hwsim_mcast_new_radio(idx, info, param); | ||
2497 | + hwsim_mcast_new_radio(idx, info, param); | ||
2498 | |||
2499 | return idx; | ||
2500 | |||
2501 | diff --git a/drivers/net/wireless/marvell/libertas/if_sdio.c b/drivers/net/wireless/marvell/libertas/if_sdio.c | ||
2502 | index a0ae8d8763bb..06a57c708992 100644 | ||
2503 | --- a/drivers/net/wireless/marvell/libertas/if_sdio.c | ||
2504 | +++ b/drivers/net/wireless/marvell/libertas/if_sdio.c | ||
2505 | @@ -1368,6 +1368,10 @@ static int if_sdio_suspend(struct device *dev) | ||
2506 | if (priv->wol_criteria == EHS_REMOVE_WAKEUP) { | ||
2507 | dev_info(dev, "Suspend without wake params -- powering down card\n"); | ||
2508 | if (priv->fw_ready) { | ||
2509 | + ret = lbs_suspend(priv); | ||
2510 | + if (ret) | ||
2511 | + return ret; | ||
2512 | + | ||
2513 | priv->power_up_on_resume = true; | ||
2514 | if_sdio_power_off(card); | ||
2515 | } | ||
2516 | diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c | ||
2517 | index 3c1adb38412b..aceae791baf3 100644 | ||
2518 | --- a/drivers/net/xen-netfront.c | ||
2519 | +++ b/drivers/net/xen-netfront.c | ||
2520 | @@ -1848,7 +1848,7 @@ static int talk_to_netback(struct xenbus_device *dev, | ||
2521 | err = xen_net_read_mac(dev, info->netdev->dev_addr); | ||
2522 | if (err) { | ||
2523 | xenbus_dev_fatal(dev, err, "parsing %s/mac", dev->nodename); | ||
2524 | - goto out; | ||
2525 | + goto out_unlocked; | ||
2526 | } | ||
2527 | |||
2528 | rtnl_lock(); | ||
2529 | @@ -1963,6 +1963,7 @@ abort_transaction_no_dev_fatal: | ||
2530 | xennet_destroy_queues(info); | ||
2531 | out: | ||
2532 | rtnl_unlock(); | ||
2533 | +out_unlocked: | ||
2534 | device_unregister(&dev->dev); | ||
2535 | return err; | ||
2536 | } | ||
2537 | @@ -1994,10 +1995,6 @@ static int xennet_connect(struct net_device *dev) | ||
2538 | /* talk_to_netback() sets the correct number of queues */ | ||
2539 | num_queues = dev->real_num_tx_queues; | ||
2540 | |||
2541 | - rtnl_lock(); | ||
2542 | - netdev_update_features(dev); | ||
2543 | - rtnl_unlock(); | ||
2544 | - | ||
2545 | if (dev->reg_state == NETREG_UNINITIALIZED) { | ||
2546 | err = register_netdev(dev); | ||
2547 | if (err) { | ||
2548 | @@ -2007,6 +2004,10 @@ static int xennet_connect(struct net_device *dev) | ||
2549 | } | ||
2550 | } | ||
2551 | |||
2552 | + rtnl_lock(); | ||
2553 | + netdev_update_features(dev); | ||
2554 | + rtnl_unlock(); | ||
2555 | + | ||
2556 | /* | ||
2557 | * All public and private state should now be sane. Get | ||
2558 | * ready to start sending and receiving packets and give the driver | ||
2559 | diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c | ||
2560 | index fadf151ce830..1ac4cec5f4f7 100644 | ||
2561 | --- a/drivers/nvme/host/pci.c | ||
2562 | +++ b/drivers/nvme/host/pci.c | ||
2563 | @@ -1393,11 +1393,9 @@ static inline void nvme_release_cmb(struct nvme_dev *dev) | ||
2564 | if (dev->cmb) { | ||
2565 | iounmap(dev->cmb); | ||
2566 | dev->cmb = NULL; | ||
2567 | - if (dev->cmbsz) { | ||
2568 | - sysfs_remove_file_from_group(&dev->ctrl.device->kobj, | ||
2569 | - &dev_attr_cmb.attr, NULL); | ||
2570 | - dev->cmbsz = 0; | ||
2571 | - } | ||
2572 | + sysfs_remove_file_from_group(&dev->ctrl.device->kobj, | ||
2573 | + &dev_attr_cmb.attr, NULL); | ||
2574 | + dev->cmbsz = 0; | ||
2575 | } | ||
2576 | } | ||
2577 | |||
2578 | @@ -1632,16 +1630,14 @@ static int nvme_pci_enable(struct nvme_dev *dev) | ||
2579 | |||
2580 | /* | ||
2581 | * CMBs can currently only exist on >=1.2 PCIe devices. We only | ||
2582 | - * populate sysfs if a CMB is implemented. Note that we add the | ||
2583 | - * CMB attribute to the nvme_ctrl kobj which removes the need to remove | ||
2584 | - * it on exit. Since nvme_dev_attrs_group has no name we can pass | ||
2585 | - * NULL as final argument to sysfs_add_file_to_group. | ||
2586 | + * populate sysfs if a CMB is implemented. Since nvme_dev_attrs_group | ||
2587 | + * has no name we can pass NULL as final argument to | ||
2588 | + * sysfs_add_file_to_group. | ||
2589 | */ | ||
2590 | |||
2591 | if (readl(dev->bar + NVME_REG_VS) >= NVME_VS(1, 2, 0)) { | ||
2592 | dev->cmb = nvme_map_cmb(dev); | ||
2593 | - | ||
2594 | - if (dev->cmbsz) { | ||
2595 | + if (dev->cmb) { | ||
2596 | if (sysfs_add_file_to_group(&dev->ctrl.device->kobj, | ||
2597 | &dev_attr_cmb.attr, NULL)) | ||
2598 | dev_warn(dev->dev, | ||
2599 | diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c | ||
2600 | index 2caed285fd7b..cdb7752dcbb7 100644 | ||
2601 | --- a/drivers/nvme/target/admin-cmd.c | ||
2602 | +++ b/drivers/nvme/target/admin-cmd.c | ||
2603 | @@ -192,6 +192,7 @@ static void nvmet_execute_identify_ctrl(struct nvmet_req *req) | ||
2604 | id->vid = 0; | ||
2605 | id->ssvid = 0; | ||
2606 | |||
2607 | + memset(id->sn, ' ', sizeof(id->sn)); | ||
2608 | bin2hex(id->sn, &ctrl->subsys->serial, | ||
2609 | min(sizeof(ctrl->subsys->serial), sizeof(id->sn) / 2)); | ||
2610 | copy_and_pad(id->mn, sizeof(id->mn), model, sizeof(model) - 1); | ||
2611 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c | ||
2612 | index c7a695c2303a..2250f0d33481 100644 | ||
2613 | --- a/drivers/pci/quirks.c | ||
2614 | +++ b/drivers/pci/quirks.c | ||
2615 | @@ -1634,8 +1634,8 @@ static void quirk_pcie_mch(struct pci_dev *pdev) | ||
2616 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7520_MCH, quirk_pcie_mch); | ||
2617 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7320_MCH, quirk_pcie_mch); | ||
2618 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7525_MCH, quirk_pcie_mch); | ||
2619 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0x1610, quirk_pcie_mch); | ||
2620 | |||
2621 | +DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_HUAWEI, 0x1610, PCI_CLASS_BRIDGE_PCI, 8, quirk_pcie_mch); | ||
2622 | |||
2623 | /* | ||
2624 | * It's possible for the MSI to get corrupted if shpc and acpi | ||
2625 | diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c | ||
2626 | index c29b9b611ab2..1515c9480f89 100644 | ||
2627 | --- a/drivers/platform/x86/acer-wmi.c | ||
2628 | +++ b/drivers/platform/x86/acer-wmi.c | ||
2629 | @@ -1856,7 +1856,7 @@ static acpi_status __init acer_wmi_get_handle_cb(acpi_handle ah, u32 level, | ||
2630 | if (!strcmp(ctx, "SENR")) { | ||
2631 | if (acpi_bus_get_device(ah, &dev)) | ||
2632 | return AE_OK; | ||
2633 | - if (!strcmp(ACER_WMID_ACCEL_HID, acpi_device_hid(dev))) | ||
2634 | + if (strcmp(ACER_WMID_ACCEL_HID, acpi_device_hid(dev))) | ||
2635 | return AE_OK; | ||
2636 | } else | ||
2637 | return AE_OK; | ||
2638 | @@ -1877,8 +1877,7 @@ static int __init acer_wmi_get_handle(const char *name, const char *prop, | ||
2639 | handle = NULL; | ||
2640 | status = acpi_get_devices(prop, acer_wmi_get_handle_cb, | ||
2641 | (void *)name, &handle); | ||
2642 | - | ||
2643 | - if (ACPI_SUCCESS(status)) { | ||
2644 | + if (ACPI_SUCCESS(status) && handle) { | ||
2645 | *ah = handle; | ||
2646 | return 0; | ||
2647 | } else { | ||
2648 | @@ -2247,8 +2246,8 @@ static int __init acer_wmi_init(void) | ||
2649 | if (err) | ||
2650 | return err; | ||
2651 | err = acer_wmi_accel_setup(); | ||
2652 | - if (err) | ||
2653 | - return err; | ||
2654 | + if (err && err != -ENODEV) | ||
2655 | + pr_warn("Cannot enable accelerometer\n"); | ||
2656 | } | ||
2657 | |||
2658 | err = platform_driver_register(&acer_platform_driver); | ||
2659 | diff --git a/drivers/ptp/ptp_chardev.c b/drivers/ptp/ptp_chardev.c | ||
2660 | index 51364621f77c..a421d6c551b6 100644 | ||
2661 | --- a/drivers/ptp/ptp_chardev.c | ||
2662 | +++ b/drivers/ptp/ptp_chardev.c | ||
2663 | @@ -24,6 +24,8 @@ | ||
2664 | #include <linux/slab.h> | ||
2665 | #include <linux/timekeeping.h> | ||
2666 | |||
2667 | +#include <linux/nospec.h> | ||
2668 | + | ||
2669 | #include "ptp_private.h" | ||
2670 | |||
2671 | static int ptp_disable_pinfunc(struct ptp_clock_info *ops, | ||
2672 | @@ -248,6 +250,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg) | ||
2673 | err = -EINVAL; | ||
2674 | break; | ||
2675 | } | ||
2676 | + pin_index = array_index_nospec(pin_index, ops->n_pins); | ||
2677 | if (mutex_lock_interruptible(&ptp->pincfg_mux)) | ||
2678 | return -ERESTARTSYS; | ||
2679 | pd = ops->pin_config[pin_index]; | ||
2680 | @@ -266,6 +269,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg) | ||
2681 | err = -EINVAL; | ||
2682 | break; | ||
2683 | } | ||
2684 | + pin_index = array_index_nospec(pin_index, ops->n_pins); | ||
2685 | if (mutex_lock_interruptible(&ptp->pincfg_mux)) | ||
2686 | return -ERESTARTSYS; | ||
2687 | err = ptp_set_pinfunc(ptp, pin_index, pd.func, pd.chan); | ||
2688 | diff --git a/drivers/reset/hisilicon/hi6220_reset.c b/drivers/reset/hisilicon/hi6220_reset.c | ||
2689 | index 35ce53edabf9..d5e5229308f2 100644 | ||
2690 | --- a/drivers/reset/hisilicon/hi6220_reset.c | ||
2691 | +++ b/drivers/reset/hisilicon/hi6220_reset.c | ||
2692 | @@ -155,3 +155,5 @@ static int __init hi6220_reset_init(void) | ||
2693 | } | ||
2694 | |||
2695 | postcore_initcall(hi6220_reset_init); | ||
2696 | + | ||
2697 | +MODULE_LICENSE("GPL v2"); | ||
2698 | diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c | ||
2699 | index 7b178d765726..c0592fda409e 100644 | ||
2700 | --- a/drivers/scsi/aacraid/src.c | ||
2701 | +++ b/drivers/scsi/aacraid/src.c | ||
2702 | @@ -445,7 +445,7 @@ err_out: | ||
2703 | return -1; | ||
2704 | |||
2705 | err_blink: | ||
2706 | - return (status > 16) & 0xFF; | ||
2707 | + return (status >> 16) & 0xFF; | ||
2708 | } | ||
2709 | |||
2710 | /** | ||
2711 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c | ||
2712 | index 5f66b6da65f2..b6d9e3104b89 100644 | ||
2713 | --- a/drivers/scsi/qla2xxx/qla_init.c | ||
2714 | +++ b/drivers/scsi/qla2xxx/qla_init.c | ||
2715 | @@ -368,8 +368,8 @@ qla24xx_abort_sp_done(void *data, void *ptr, int res) | ||
2716 | srb_t *sp = (srb_t *)ptr; | ||
2717 | struct srb_iocb *abt = &sp->u.iocb_cmd; | ||
2718 | |||
2719 | - del_timer(&sp->u.iocb_cmd.timer); | ||
2720 | - complete(&abt->u.abt.comp); | ||
2721 | + if (del_timer(&sp->u.iocb_cmd.timer)) | ||
2722 | + complete(&abt->u.abt.comp); | ||
2723 | } | ||
2724 | |||
2725 | static int | ||
2726 | diff --git a/drivers/soc/fsl/qbman/qman.c b/drivers/soc/fsl/qbman/qman.c | ||
2727 | index 2caacd9d2526..2cc82ed6433a 100644 | ||
2728 | --- a/drivers/soc/fsl/qbman/qman.c | ||
2729 | +++ b/drivers/soc/fsl/qbman/qman.c | ||
2730 | @@ -2713,6 +2713,9 @@ static int qman_alloc_range(struct gen_pool *p, u32 *result, u32 cnt) | ||
2731 | { | ||
2732 | unsigned long addr; | ||
2733 | |||
2734 | + if (!p) | ||
2735 | + return -ENODEV; | ||
2736 | + | ||
2737 | addr = gen_pool_alloc(p, cnt); | ||
2738 | if (!addr) | ||
2739 | return -ENOMEM; | ||
2740 | diff --git a/drivers/soc/fsl/qe/ucc.c b/drivers/soc/fsl/qe/ucc.c | ||
2741 | index c646d8713861..681f7d4b7724 100644 | ||
2742 | --- a/drivers/soc/fsl/qe/ucc.c | ||
2743 | +++ b/drivers/soc/fsl/qe/ucc.c | ||
2744 | @@ -626,7 +626,7 @@ static u32 ucc_get_tdm_sync_shift(enum comm_dir mode, u32 tdm_num) | ||
2745 | { | ||
2746 | u32 shift; | ||
2747 | |||
2748 | - shift = (mode == COMM_DIR_RX) ? RX_SYNC_SHIFT_BASE : RX_SYNC_SHIFT_BASE; | ||
2749 | + shift = (mode == COMM_DIR_RX) ? RX_SYNC_SHIFT_BASE : TX_SYNC_SHIFT_BASE; | ||
2750 | shift -= tdm_num * 2; | ||
2751 | |||
2752 | return shift; | ||
2753 | diff --git a/drivers/staging/wilc1000/linux_wlan.c b/drivers/staging/wilc1000/linux_wlan.c | ||
2754 | index 07d6e4824a9d..2e5e3b368532 100644 | ||
2755 | --- a/drivers/staging/wilc1000/linux_wlan.c | ||
2756 | +++ b/drivers/staging/wilc1000/linux_wlan.c | ||
2757 | @@ -1260,11 +1260,12 @@ int wilc_netdev_init(struct wilc **wilc, struct device *dev, int io_type, | ||
2758 | else | ||
2759 | strcpy(ndev->name, "p2p%d"); | ||
2760 | |||
2761 | - vif->idx = wl->vif_num; | ||
2762 | vif->wilc = *wilc; | ||
2763 | vif->ndev = ndev; | ||
2764 | wl->vif[i] = vif; | ||
2765 | wl->vif_num = i; | ||
2766 | + vif->idx = wl->vif_num; | ||
2767 | + | ||
2768 | ndev->netdev_ops = &wilc_netdev_ops; | ||
2769 | |||
2770 | { | ||
2771 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
2772 | index 25ae9b9895a9..dbe44e890c99 100644 | ||
2773 | --- a/drivers/usb/class/cdc-acm.c | ||
2774 | +++ b/drivers/usb/class/cdc-acm.c | ||
2775 | @@ -333,17 +333,17 @@ static void acm_ctrl_irq(struct urb *urb) | ||
2776 | |||
2777 | if (difference & ACM_CTRL_DSR) | ||
2778 | acm->iocount.dsr++; | ||
2779 | - if (difference & ACM_CTRL_BRK) | ||
2780 | - acm->iocount.brk++; | ||
2781 | - if (difference & ACM_CTRL_RI) | ||
2782 | - acm->iocount.rng++; | ||
2783 | if (difference & ACM_CTRL_DCD) | ||
2784 | acm->iocount.dcd++; | ||
2785 | - if (difference & ACM_CTRL_FRAMING) | ||
2786 | + if (newctrl & ACM_CTRL_BRK) | ||
2787 | + acm->iocount.brk++; | ||
2788 | + if (newctrl & ACM_CTRL_RI) | ||
2789 | + acm->iocount.rng++; | ||
2790 | + if (newctrl & ACM_CTRL_FRAMING) | ||
2791 | acm->iocount.frame++; | ||
2792 | - if (difference & ACM_CTRL_PARITY) | ||
2793 | + if (newctrl & ACM_CTRL_PARITY) | ||
2794 | acm->iocount.parity++; | ||
2795 | - if (difference & ACM_CTRL_OVERRUN) | ||
2796 | + if (newctrl & ACM_CTRL_OVERRUN) | ||
2797 | acm->iocount.overrun++; | ||
2798 | spin_unlock(&acm->read_lock); | ||
2799 | |||
2800 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c | ||
2801 | index 988240e3cb58..52fc2084b310 100644 | ||
2802 | --- a/drivers/usb/core/devio.c | ||
2803 | +++ b/drivers/usb/core/devio.c | ||
2804 | @@ -1490,8 +1490,6 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb | ||
2805 | u = 0; | ||
2806 | switch (uurb->type) { | ||
2807 | case USBDEVFS_URB_TYPE_CONTROL: | ||
2808 | - if (is_in) | ||
2809 | - allow_short = true; | ||
2810 | if (!usb_endpoint_xfer_control(&ep->desc)) | ||
2811 | return -EINVAL; | ||
2812 | /* min 8 byte setup packet */ | ||
2813 | @@ -1521,6 +1519,8 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb | ||
2814 | is_in = 0; | ||
2815 | uurb->endpoint &= ~USB_DIR_IN; | ||
2816 | } | ||
2817 | + if (is_in) | ||
2818 | + allow_short = true; | ||
2819 | snoop(&ps->dev->dev, "control urb: bRequestType=%02x " | ||
2820 | "bRequest=%02x wValue=%04x " | ||
2821 | "wIndex=%04x wLength=%04x\n", | ||
2822 | diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c | ||
2823 | index f221cb479e14..8e69150776f5 100644 | ||
2824 | --- a/drivers/usb/dwc3/dwc3-omap.c | ||
2825 | +++ b/drivers/usb/dwc3/dwc3-omap.c | ||
2826 | @@ -512,15 +512,6 @@ static int dwc3_omap_probe(struct platform_device *pdev) | ||
2827 | |||
2828 | /* check the DMA Status */ | ||
2829 | reg = dwc3_omap_readl(omap->base, USBOTGSS_SYSCONFIG); | ||
2830 | - irq_set_status_flags(omap->irq, IRQ_NOAUTOEN); | ||
2831 | - ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt, | ||
2832 | - dwc3_omap_interrupt_thread, IRQF_SHARED, | ||
2833 | - "dwc3-omap", omap); | ||
2834 | - if (ret) { | ||
2835 | - dev_err(dev, "failed to request IRQ #%d --> %d\n", | ||
2836 | - omap->irq, ret); | ||
2837 | - goto err1; | ||
2838 | - } | ||
2839 | |||
2840 | ret = dwc3_omap_extcon_register(omap); | ||
2841 | if (ret < 0) | ||
2842 | @@ -532,8 +523,15 @@ static int dwc3_omap_probe(struct platform_device *pdev) | ||
2843 | goto err2; | ||
2844 | } | ||
2845 | |||
2846 | + ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt, | ||
2847 | + dwc3_omap_interrupt_thread, IRQF_SHARED, | ||
2848 | + "dwc3-omap", omap); | ||
2849 | + if (ret) { | ||
2850 | + dev_err(dev, "failed to request IRQ #%d --> %d\n", | ||
2851 | + omap->irq, ret); | ||
2852 | + goto err1; | ||
2853 | + } | ||
2854 | dwc3_omap_enable_irqs(omap); | ||
2855 | - enable_irq(omap->irq); | ||
2856 | return 0; | ||
2857 | |||
2858 | err2: | ||
2859 | diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c | ||
2860 | index d2fc237cd87a..fac9424940d4 100644 | ||
2861 | --- a/drivers/usb/gadget/function/f_mass_storage.c | ||
2862 | +++ b/drivers/usb/gadget/function/f_mass_storage.c | ||
2863 | @@ -220,6 +220,8 @@ | ||
2864 | #include <linux/usb/gadget.h> | ||
2865 | #include <linux/usb/composite.h> | ||
2866 | |||
2867 | +#include <linux/nospec.h> | ||
2868 | + | ||
2869 | #include "configfs.h" | ||
2870 | |||
2871 | |||
2872 | @@ -3260,6 +3262,7 @@ static struct config_group *fsg_lun_make(struct config_group *group, | ||
2873 | fsg_opts = to_fsg_opts(&group->cg_item); | ||
2874 | if (num >= FSG_MAX_LUNS) | ||
2875 | return ERR_PTR(-ERANGE); | ||
2876 | + num = array_index_nospec(num, FSG_MAX_LUNS); | ||
2877 | |||
2878 | mutex_lock(&fsg_opts->lock); | ||
2879 | if (fsg_opts->refcnt || fsg_opts->common->luns[num]) { | ||
2880 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c | ||
2881 | index 45a03eff4db1..0f09ab5399f4 100644 | ||
2882 | --- a/drivers/usb/host/xhci-hub.c | ||
2883 | +++ b/drivers/usb/host/xhci-hub.c | ||
2884 | @@ -366,7 +366,7 @@ int xhci_find_slot_id_by_port(struct usb_hcd *hcd, struct xhci_hcd *xhci, | ||
2885 | |||
2886 | slot_id = 0; | ||
2887 | for (i = 0; i < MAX_HC_SLOTS; i++) { | ||
2888 | - if (!xhci->devs[i]) | ||
2889 | + if (!xhci->devs[i] || !xhci->devs[i]->udev) | ||
2890 | continue; | ||
2891 | speed = xhci->devs[i]->udev->speed; | ||
2892 | if (((speed >= USB_SPEED_SUPER) == (hcd->speed >= HCD_USB3)) | ||
2893 | diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c | ||
2894 | index 93fba9033b00..5984fb134cf4 100644 | ||
2895 | --- a/drivers/usb/renesas_usbhs/mod_gadget.c | ||
2896 | +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | ||
2897 | @@ -639,14 +639,11 @@ static int usbhsg_ep_disable(struct usb_ep *ep) | ||
2898 | struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep); | ||
2899 | struct usbhs_pipe *pipe; | ||
2900 | unsigned long flags; | ||
2901 | - int ret = 0; | ||
2902 | |||
2903 | spin_lock_irqsave(&uep->lock, flags); | ||
2904 | pipe = usbhsg_uep_to_pipe(uep); | ||
2905 | - if (!pipe) { | ||
2906 | - ret = -EINVAL; | ||
2907 | + if (!pipe) | ||
2908 | goto out; | ||
2909 | - } | ||
2910 | |||
2911 | usbhsg_pipe_disable(uep); | ||
2912 | usbhs_pipe_free(pipe); | ||
2913 | @@ -1085,7 +1082,6 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv) | ||
2914 | ret = -ENOMEM; | ||
2915 | goto usbhs_mod_gadget_probe_err_gpriv; | ||
2916 | } | ||
2917 | - spin_lock_init(&uep->lock); | ||
2918 | |||
2919 | gpriv->transceiver = usb_get_phy(USB_PHY_TYPE_UNDEFINED); | ||
2920 | dev_info(dev, "%stransceiver found\n", | ||
2921 | @@ -1135,6 +1131,7 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv) | ||
2922 | uep->ep.name = uep->ep_name; | ||
2923 | uep->ep.ops = &usbhsg_ep_ops; | ||
2924 | INIT_LIST_HEAD(&uep->ep.ep_list); | ||
2925 | + spin_lock_init(&uep->lock); | ||
2926 | |||
2927 | /* init DCP */ | ||
2928 | if (usbhsg_is_dcp(uep)) { | ||
2929 | diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c | ||
2930 | index c569b6454a9d..4c5625cb540c 100644 | ||
2931 | --- a/drivers/vhost/vhost.c | ||
2932 | +++ b/drivers/vhost/vhost.c | ||
2933 | @@ -28,6 +28,7 @@ | ||
2934 | #include <linux/module.h> | ||
2935 | #include <linux/sort.h> | ||
2936 | #include <linux/interval_tree_generic.h> | ||
2937 | +#include <linux/nospec.h> | ||
2938 | |||
2939 | #include "vhost.h" | ||
2940 | |||
2941 | @@ -1289,6 +1290,7 @@ long vhost_vring_ioctl(struct vhost_dev *d, int ioctl, void __user *argp) | ||
2942 | if (idx >= d->nvqs) | ||
2943 | return -ENOBUFS; | ||
2944 | |||
2945 | + idx = array_index_nospec(idx, d->nvqs); | ||
2946 | vq = d->vqs[idx]; | ||
2947 | |||
2948 | mutex_lock(&vq->mutex); | ||
2949 | diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c | ||
2950 | index 6f2e729a308f..f4b6d063a4b7 100644 | ||
2951 | --- a/drivers/video/fbdev/efifb.c | ||
2952 | +++ b/drivers/video/fbdev/efifb.c | ||
2953 | @@ -375,7 +375,7 @@ static void efifb_fixup_resources(struct pci_dev *dev) | ||
2954 | if (!base) | ||
2955 | return; | ||
2956 | |||
2957 | - for (i = 0; i < PCI_STD_RESOURCE_END; i++) { | ||
2958 | + for (i = 0; i <= PCI_STD_RESOURCE_END; i++) { | ||
2959 | struct resource *res = &dev->resource[i]; | ||
2960 | |||
2961 | if (!(res->flags & IORESOURCE_MEM)) | ||
2962 | diff --git a/drivers/video/fbdev/pxa168fb.c b/drivers/video/fbdev/pxa168fb.c | ||
2963 | index def3a501acd6..d059d04c63ac 100644 | ||
2964 | --- a/drivers/video/fbdev/pxa168fb.c | ||
2965 | +++ b/drivers/video/fbdev/pxa168fb.c | ||
2966 | @@ -712,7 +712,7 @@ static int pxa168fb_probe(struct platform_device *pdev) | ||
2967 | /* | ||
2968 | * enable controller clock | ||
2969 | */ | ||
2970 | - clk_enable(fbi->clk); | ||
2971 | + clk_prepare_enable(fbi->clk); | ||
2972 | |||
2973 | pxa168fb_set_par(info); | ||
2974 | |||
2975 | @@ -767,7 +767,7 @@ static int pxa168fb_probe(struct platform_device *pdev) | ||
2976 | failed_free_cmap: | ||
2977 | fb_dealloc_cmap(&info->cmap); | ||
2978 | failed_free_clk: | ||
2979 | - clk_disable(fbi->clk); | ||
2980 | + clk_disable_unprepare(fbi->clk); | ||
2981 | failed_free_fbmem: | ||
2982 | dma_free_coherent(fbi->dev, info->fix.smem_len, | ||
2983 | info->screen_base, fbi->fb_start_dma); | ||
2984 | @@ -807,7 +807,7 @@ static int pxa168fb_remove(struct platform_device *pdev) | ||
2985 | dma_free_wc(fbi->dev, PAGE_ALIGN(info->fix.smem_len), | ||
2986 | info->screen_base, info->fix.smem_start); | ||
2987 | |||
2988 | - clk_disable(fbi->clk); | ||
2989 | + clk_disable_unprepare(fbi->clk); | ||
2990 | |||
2991 | framebuffer_release(info); | ||
2992 | |||
2993 | diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c | ||
2994 | index 2b96ca68dc10..5feaef9bcbda 100644 | ||
2995 | --- a/fs/btrfs/extent_io.c | ||
2996 | +++ b/fs/btrfs/extent_io.c | ||
2997 | @@ -4377,6 +4377,123 @@ static struct extent_map *get_extent_skip_holes(struct inode *inode, | ||
2998 | return NULL; | ||
2999 | } | ||
3000 | |||
3001 | +/* | ||
3002 | + * To cache previous fiemap extent | ||
3003 | + * | ||
3004 | + * Will be used for merging fiemap extent | ||
3005 | + */ | ||
3006 | +struct fiemap_cache { | ||
3007 | + u64 offset; | ||
3008 | + u64 phys; | ||
3009 | + u64 len; | ||
3010 | + u32 flags; | ||
3011 | + bool cached; | ||
3012 | +}; | ||
3013 | + | ||
3014 | +/* | ||
3015 | + * Helper to submit fiemap extent. | ||
3016 | + * | ||
3017 | + * Will try to merge current fiemap extent specified by @offset, @phys, | ||
3018 | + * @len and @flags with cached one. | ||
3019 | + * And only when we fails to merge, cached one will be submitted as | ||
3020 | + * fiemap extent. | ||
3021 | + * | ||
3022 | + * Return value is the same as fiemap_fill_next_extent(). | ||
3023 | + */ | ||
3024 | +static int emit_fiemap_extent(struct fiemap_extent_info *fieinfo, | ||
3025 | + struct fiemap_cache *cache, | ||
3026 | + u64 offset, u64 phys, u64 len, u32 flags) | ||
3027 | +{ | ||
3028 | + int ret = 0; | ||
3029 | + | ||
3030 | + if (!cache->cached) | ||
3031 | + goto assign; | ||
3032 | + | ||
3033 | + /* | ||
3034 | + * Sanity check, extent_fiemap() should have ensured that new | ||
3035 | + * fiemap extent won't overlap with cahced one. | ||
3036 | + * Not recoverable. | ||
3037 | + * | ||
3038 | + * NOTE: Physical address can overlap, due to compression | ||
3039 | + */ | ||
3040 | + if (cache->offset + cache->len > offset) { | ||
3041 | + WARN_ON(1); | ||
3042 | + return -EINVAL; | ||
3043 | + } | ||
3044 | + | ||
3045 | + /* | ||
3046 | + * Only merges fiemap extents if | ||
3047 | + * 1) Their logical addresses are continuous | ||
3048 | + * | ||
3049 | + * 2) Their physical addresses are continuous | ||
3050 | + * So truly compressed (physical size smaller than logical size) | ||
3051 | + * extents won't get merged with each other | ||
3052 | + * | ||
3053 | + * 3) Share same flags except FIEMAP_EXTENT_LAST | ||
3054 | + * So regular extent won't get merged with prealloc extent | ||
3055 | + */ | ||
3056 | + if (cache->offset + cache->len == offset && | ||
3057 | + cache->phys + cache->len == phys && | ||
3058 | + (cache->flags & ~FIEMAP_EXTENT_LAST) == | ||
3059 | + (flags & ~FIEMAP_EXTENT_LAST)) { | ||
3060 | + cache->len += len; | ||
3061 | + cache->flags |= flags; | ||
3062 | + goto try_submit_last; | ||
3063 | + } | ||
3064 | + | ||
3065 | + /* Not mergeable, need to submit cached one */ | ||
3066 | + ret = fiemap_fill_next_extent(fieinfo, cache->offset, cache->phys, | ||
3067 | + cache->len, cache->flags); | ||
3068 | + cache->cached = false; | ||
3069 | + if (ret) | ||
3070 | + return ret; | ||
3071 | +assign: | ||
3072 | + cache->cached = true; | ||
3073 | + cache->offset = offset; | ||
3074 | + cache->phys = phys; | ||
3075 | + cache->len = len; | ||
3076 | + cache->flags = flags; | ||
3077 | +try_submit_last: | ||
3078 | + if (cache->flags & FIEMAP_EXTENT_LAST) { | ||
3079 | + ret = fiemap_fill_next_extent(fieinfo, cache->offset, | ||
3080 | + cache->phys, cache->len, cache->flags); | ||
3081 | + cache->cached = false; | ||
3082 | + } | ||
3083 | + return ret; | ||
3084 | +} | ||
3085 | + | ||
3086 | +/* | ||
3087 | + * Sanity check for fiemap cache | ||
3088 | + * | ||
3089 | + * All fiemap cache should be submitted by emit_fiemap_extent() | ||
3090 | + * Iteration should be terminated either by last fiemap extent or | ||
3091 | + * fieinfo->fi_extents_max. | ||
3092 | + * So no cached fiemap should exist. | ||
3093 | + */ | ||
3094 | +static int check_fiemap_cache(struct btrfs_fs_info *fs_info, | ||
3095 | + struct fiemap_extent_info *fieinfo, | ||
3096 | + struct fiemap_cache *cache) | ||
3097 | +{ | ||
3098 | + int ret; | ||
3099 | + | ||
3100 | + if (!cache->cached) | ||
3101 | + return 0; | ||
3102 | + | ||
3103 | + /* Small and recoverbale problem, only to info developer */ | ||
3104 | +#ifdef CONFIG_BTRFS_DEBUG | ||
3105 | + WARN_ON(1); | ||
3106 | +#endif | ||
3107 | + btrfs_warn(fs_info, | ||
3108 | + "unhandled fiemap cache detected: offset=%llu phys=%llu len=%llu flags=0x%x", | ||
3109 | + cache->offset, cache->phys, cache->len, cache->flags); | ||
3110 | + ret = fiemap_fill_next_extent(fieinfo, cache->offset, cache->phys, | ||
3111 | + cache->len, cache->flags); | ||
3112 | + cache->cached = false; | ||
3113 | + if (ret > 0) | ||
3114 | + ret = 0; | ||
3115 | + return ret; | ||
3116 | +} | ||
3117 | + | ||
3118 | int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | ||
3119 | __u64 start, __u64 len, get_extent_t *get_extent) | ||
3120 | { | ||
3121 | @@ -4394,6 +4511,7 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | ||
3122 | struct extent_state *cached_state = NULL; | ||
3123 | struct btrfs_path *path; | ||
3124 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
3125 | + struct fiemap_cache cache = { 0 }; | ||
3126 | int end = 0; | ||
3127 | u64 em_start = 0; | ||
3128 | u64 em_len = 0; | ||
3129 | @@ -4573,8 +4691,8 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | ||
3130 | flags |= FIEMAP_EXTENT_LAST; | ||
3131 | end = 1; | ||
3132 | } | ||
3133 | - ret = fiemap_fill_next_extent(fieinfo, em_start, disko, | ||
3134 | - em_len, flags); | ||
3135 | + ret = emit_fiemap_extent(fieinfo, &cache, em_start, disko, | ||
3136 | + em_len, flags); | ||
3137 | if (ret) { | ||
3138 | if (ret == 1) | ||
3139 | ret = 0; | ||
3140 | @@ -4582,6 +4700,8 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | ||
3141 | } | ||
3142 | } | ||
3143 | out_free: | ||
3144 | + if (!ret) | ||
3145 | + ret = check_fiemap_cache(root->fs_info, fieinfo, &cache); | ||
3146 | free_extent_map(em); | ||
3147 | out: | ||
3148 | btrfs_free_path(path); | ||
3149 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c | ||
3150 | index bd036557c6bc..5ebdb58079e1 100644 | ||
3151 | --- a/fs/btrfs/inode.c | ||
3152 | +++ b/fs/btrfs/inode.c | ||
3153 | @@ -2966,7 +2966,7 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent) | ||
3154 | |||
3155 | ret = test_range_bit(io_tree, ordered_extent->file_offset, | ||
3156 | ordered_extent->file_offset + ordered_extent->len - 1, | ||
3157 | - EXTENT_DEFRAG, 1, cached_state); | ||
3158 | + EXTENT_DEFRAG, 0, cached_state); | ||
3159 | if (ret) { | ||
3160 | u64 last_snapshot = btrfs_root_last_snapshot(&root->root_item); | ||
3161 | if (0 && last_snapshot >= BTRFS_I(inode)->generation) | ||
3162 | diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c | ||
3163 | index c8d2eec6596b..79dc3ee1de58 100644 | ||
3164 | --- a/fs/btrfs/send.c | ||
3165 | +++ b/fs/btrfs/send.c | ||
3166 | @@ -5165,15 +5165,12 @@ static int is_extent_unchanged(struct send_ctx *sctx, | ||
3167 | goto out; | ||
3168 | } | ||
3169 | |||
3170 | - right_disknr = btrfs_file_extent_disk_bytenr(eb, ei); | ||
3171 | if (right_type == BTRFS_FILE_EXTENT_INLINE) { | ||
3172 | right_len = btrfs_file_extent_inline_len(eb, slot, ei); | ||
3173 | right_len = PAGE_ALIGN(right_len); | ||
3174 | } else { | ||
3175 | right_len = btrfs_file_extent_num_bytes(eb, ei); | ||
3176 | } | ||
3177 | - right_offset = btrfs_file_extent_offset(eb, ei); | ||
3178 | - right_gen = btrfs_file_extent_generation(eb, ei); | ||
3179 | |||
3180 | /* | ||
3181 | * Are we at extent 8? If yes, we know the extent is changed. | ||
3182 | @@ -5198,6 +5195,10 @@ static int is_extent_unchanged(struct send_ctx *sctx, | ||
3183 | goto out; | ||
3184 | } | ||
3185 | |||
3186 | + right_disknr = btrfs_file_extent_disk_bytenr(eb, ei); | ||
3187 | + right_offset = btrfs_file_extent_offset(eb, ei); | ||
3188 | + right_gen = btrfs_file_extent_generation(eb, ei); | ||
3189 | + | ||
3190 | left_offset_fixed = left_offset; | ||
3191 | if (key.offset < ekey->offset) { | ||
3192 | /* Fix the right offset for 2a and 7. */ | ||
3193 | diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c | ||
3194 | index 2026885702a2..3fb95e3d20d6 100644 | ||
3195 | --- a/fs/cachefiles/namei.c | ||
3196 | +++ b/fs/cachefiles/namei.c | ||
3197 | @@ -340,7 +340,7 @@ try_again: | ||
3198 | trap = lock_rename(cache->graveyard, dir); | ||
3199 | |||
3200 | /* do some checks before getting the grave dentry */ | ||
3201 | - if (rep->d_parent != dir) { | ||
3202 | + if (rep->d_parent != dir || IS_DEADDIR(d_inode(rep))) { | ||
3203 | /* the entry was probably culled when we dropped the parent dir | ||
3204 | * lock */ | ||
3205 | unlock_rename(cache->graveyard, dir); | ||
3206 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c | ||
3207 | index a012f70bba5c..77a18fe10805 100644 | ||
3208 | --- a/fs/cifs/inode.c | ||
3209 | +++ b/fs/cifs/inode.c | ||
3210 | @@ -704,7 +704,7 @@ cgfi_exit: | ||
3211 | /* Simple function to return a 64 bit hash of string. Rarely called */ | ||
3212 | static __u64 simple_hashstr(const char *str) | ||
3213 | { | ||
3214 | - const __u64 hash_mult = 1125899906842597L; /* a big enough prime */ | ||
3215 | + const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */ | ||
3216 | __u64 hash = 0; | ||
3217 | |||
3218 | while (*str) | ||
3219 | diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c | ||
3220 | index 8add4e8bab99..af719d93507e 100644 | ||
3221 | --- a/fs/f2fs/dir.c | ||
3222 | +++ b/fs/f2fs/dir.c | ||
3223 | @@ -212,13 +212,9 @@ static struct f2fs_dir_entry *find_in_level(struct inode *dir, | ||
3224 | f2fs_put_page(dentry_page, 0); | ||
3225 | } | ||
3226 | |||
3227 | - /* This is to increase the speed of f2fs_create */ | ||
3228 | - if (!de && room) { | ||
3229 | - F2FS_I(dir)->task = current; | ||
3230 | - if (F2FS_I(dir)->chash != namehash) { | ||
3231 | - F2FS_I(dir)->chash = namehash; | ||
3232 | - F2FS_I(dir)->clevel = level; | ||
3233 | - } | ||
3234 | + if (!de && room && F2FS_I(dir)->chash != namehash) { | ||
3235 | + F2FS_I(dir)->chash = namehash; | ||
3236 | + F2FS_I(dir)->clevel = level; | ||
3237 | } | ||
3238 | |||
3239 | return de; | ||
3240 | @@ -259,6 +255,9 @@ struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir, | ||
3241 | break; | ||
3242 | } | ||
3243 | out: | ||
3244 | + /* This is to increase the speed of f2fs_create */ | ||
3245 | + if (!de) | ||
3246 | + F2FS_I(dir)->task = current; | ||
3247 | return de; | ||
3248 | } | ||
3249 | |||
3250 | diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c | ||
3251 | index 3b7644e43796..a9cad9b60790 100644 | ||
3252 | --- a/fs/fat/fatent.c | ||
3253 | +++ b/fs/fat/fatent.c | ||
3254 | @@ -681,6 +681,7 @@ int fat_count_free_clusters(struct super_block *sb) | ||
3255 | if (ops->ent_get(&fatent) == FAT_ENT_FREE) | ||
3256 | free++; | ||
3257 | } while (fat_ent_next(sbi, &fatent)); | ||
3258 | + cond_resched(); | ||
3259 | } | ||
3260 | sbi->free_clusters = free; | ||
3261 | sbi->free_clus_valid = 1; | ||
3262 | diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c | ||
3263 | index 785fcc29d85d..5729d55da67d 100644 | ||
3264 | --- a/fs/ocfs2/dlmglue.c | ||
3265 | +++ b/fs/ocfs2/dlmglue.c | ||
3266 | @@ -2599,6 +2599,10 @@ void ocfs2_inode_unlock_tracker(struct inode *inode, | ||
3267 | struct ocfs2_lock_res *lockres; | ||
3268 | |||
3269 | lockres = &OCFS2_I(inode)->ip_inode_lockres; | ||
3270 | + /* had_lock means that the currect process already takes the cluster | ||
3271 | + * lock previously. If had_lock is 1, we have nothing to do here, and | ||
3272 | + * it will get unlocked where we got the lock. | ||
3273 | + */ | ||
3274 | if (!had_lock) { | ||
3275 | ocfs2_remove_holder(lockres, oh); | ||
3276 | ocfs2_inode_unlock(inode, ex); | ||
3277 | diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c | ||
3278 | index 03f6ff249edb..01932763b4d1 100644 | ||
3279 | --- a/fs/ocfs2/xattr.c | ||
3280 | +++ b/fs/ocfs2/xattr.c | ||
3281 | @@ -1330,20 +1330,21 @@ static int ocfs2_xattr_get(struct inode *inode, | ||
3282 | void *buffer, | ||
3283 | size_t buffer_size) | ||
3284 | { | ||
3285 | - int ret; | ||
3286 | + int ret, had_lock; | ||
3287 | struct buffer_head *di_bh = NULL; | ||
3288 | + struct ocfs2_lock_holder oh; | ||
3289 | |||
3290 | - ret = ocfs2_inode_lock(inode, &di_bh, 0); | ||
3291 | - if (ret < 0) { | ||
3292 | - mlog_errno(ret); | ||
3293 | - return ret; | ||
3294 | + had_lock = ocfs2_inode_lock_tracker(inode, &di_bh, 0, &oh); | ||
3295 | + if (had_lock < 0) { | ||
3296 | + mlog_errno(had_lock); | ||
3297 | + return had_lock; | ||
3298 | } | ||
3299 | down_read(&OCFS2_I(inode)->ip_xattr_sem); | ||
3300 | ret = ocfs2_xattr_get_nolock(inode, di_bh, name_index, | ||
3301 | name, buffer, buffer_size); | ||
3302 | up_read(&OCFS2_I(inode)->ip_xattr_sem); | ||
3303 | |||
3304 | - ocfs2_inode_unlock(inode, 0); | ||
3305 | + ocfs2_inode_unlock_tracker(inode, 0, &oh, had_lock); | ||
3306 | |||
3307 | brelse(di_bh); | ||
3308 | |||
3309 | @@ -3539,11 +3540,12 @@ int ocfs2_xattr_set(struct inode *inode, | ||
3310 | { | ||
3311 | struct buffer_head *di_bh = NULL; | ||
3312 | struct ocfs2_dinode *di; | ||
3313 | - int ret, credits, ref_meta = 0, ref_credits = 0; | ||
3314 | + int ret, credits, had_lock, ref_meta = 0, ref_credits = 0; | ||
3315 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
3316 | struct inode *tl_inode = osb->osb_tl_inode; | ||
3317 | struct ocfs2_xattr_set_ctxt ctxt = { NULL, NULL, NULL, }; | ||
3318 | struct ocfs2_refcount_tree *ref_tree = NULL; | ||
3319 | + struct ocfs2_lock_holder oh; | ||
3320 | |||
3321 | struct ocfs2_xattr_info xi = { | ||
3322 | .xi_name_index = name_index, | ||
3323 | @@ -3574,8 +3576,9 @@ int ocfs2_xattr_set(struct inode *inode, | ||
3324 | return -ENOMEM; | ||
3325 | } | ||
3326 | |||
3327 | - ret = ocfs2_inode_lock(inode, &di_bh, 1); | ||
3328 | - if (ret < 0) { | ||
3329 | + had_lock = ocfs2_inode_lock_tracker(inode, &di_bh, 1, &oh); | ||
3330 | + if (had_lock < 0) { | ||
3331 | + ret = had_lock; | ||
3332 | mlog_errno(ret); | ||
3333 | goto cleanup_nolock; | ||
3334 | } | ||
3335 | @@ -3672,7 +3675,7 @@ cleanup: | ||
3336 | if (ret) | ||
3337 | mlog_errno(ret); | ||
3338 | } | ||
3339 | - ocfs2_inode_unlock(inode, 1); | ||
3340 | + ocfs2_inode_unlock_tracker(inode, 1, &oh, had_lock); | ||
3341 | cleanup_nolock: | ||
3342 | brelse(di_bh); | ||
3343 | brelse(xbs.xattr_bh); | ||
3344 | diff --git a/fs/orangefs/xattr.c b/fs/orangefs/xattr.c | ||
3345 | index 237c9c04dc3b..a34b25be39c5 100644 | ||
3346 | --- a/fs/orangefs/xattr.c | ||
3347 | +++ b/fs/orangefs/xattr.c | ||
3348 | @@ -76,7 +76,7 @@ ssize_t orangefs_inode_getxattr(struct inode *inode, const char *name, | ||
3349 | if (S_ISLNK(inode->i_mode)) | ||
3350 | return -EOPNOTSUPP; | ||
3351 | |||
3352 | - if (strlen(name) > ORANGEFS_MAX_XATTR_NAMELEN) | ||
3353 | + if (strlen(name) >= ORANGEFS_MAX_XATTR_NAMELEN) | ||
3354 | return -EINVAL; | ||
3355 | |||
3356 | fsuid = from_kuid(&init_user_ns, current_fsuid()); | ||
3357 | @@ -169,7 +169,7 @@ static int orangefs_inode_removexattr(struct inode *inode, const char *name, | ||
3358 | struct orangefs_kernel_op_s *new_op = NULL; | ||
3359 | int ret = -ENOMEM; | ||
3360 | |||
3361 | - if (strlen(name) > ORANGEFS_MAX_XATTR_NAMELEN) | ||
3362 | + if (strlen(name) >= ORANGEFS_MAX_XATTR_NAMELEN) | ||
3363 | return -EINVAL; | ||
3364 | |||
3365 | down_write(&orangefs_inode->xattr_sem); | ||
3366 | @@ -233,7 +233,7 @@ int orangefs_inode_setxattr(struct inode *inode, const char *name, | ||
3367 | |||
3368 | if (size > ORANGEFS_MAX_XATTR_VALUELEN) | ||
3369 | return -EINVAL; | ||
3370 | - if (strlen(name) > ORANGEFS_MAX_XATTR_NAMELEN) | ||
3371 | + if (strlen(name) >= ORANGEFS_MAX_XATTR_NAMELEN) | ||
3372 | return -EINVAL; | ||
3373 | |||
3374 | internal_flag = convert_to_internal_xattr_flags(flags); | ||
3375 | diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c | ||
3376 | index a2760a2869f4..0f22c036699a 100644 | ||
3377 | --- a/fs/ufs/inode.c | ||
3378 | +++ b/fs/ufs/inode.c | ||
3379 | @@ -846,6 +846,7 @@ void ufs_evict_inode(struct inode * inode) | ||
3380 | inode->i_size = 0; | ||
3381 | if (inode->i_blocks) | ||
3382 | ufs_truncate_blocks(inode); | ||
3383 | + ufs_update_inode(inode, inode_needs_sync(inode)); | ||
3384 | } | ||
3385 | |||
3386 | invalidate_inode_buffers(inode); | ||
3387 | diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c | ||
3388 | index b456cca1bfb2..c0ecdec8e0a9 100644 | ||
3389 | --- a/fs/xfs/libxfs/xfs_trans_resv.c | ||
3390 | +++ b/fs/xfs/libxfs/xfs_trans_resv.c | ||
3391 | @@ -232,8 +232,6 @@ xfs_calc_write_reservation( | ||
3392 | * the super block to reflect the freed blocks: sector size | ||
3393 | * worst case split in allocation btrees per extent assuming 4 extents: | ||
3394 | * 4 exts * 2 trees * (2 * max depth - 1) * block size | ||
3395 | - * the inode btree: max depth * blocksize | ||
3396 | - * the allocation btrees: 2 trees * (max depth - 1) * block size | ||
3397 | */ | ||
3398 | STATIC uint | ||
3399 | xfs_calc_itruncate_reservation( | ||
3400 | @@ -245,12 +243,7 @@ xfs_calc_itruncate_reservation( | ||
3401 | XFS_FSB_TO_B(mp, 1))), | ||
3402 | (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + | ||
3403 | xfs_calc_buf_res(xfs_allocfree_log_count(mp, 4), | ||
3404 | - XFS_FSB_TO_B(mp, 1)) + | ||
3405 | - xfs_calc_buf_res(5, 0) + | ||
3406 | - xfs_calc_buf_res(xfs_allocfree_log_count(mp, 1), | ||
3407 | - XFS_FSB_TO_B(mp, 1)) + | ||
3408 | - xfs_calc_buf_res(2 + mp->m_ialloc_blks + | ||
3409 | - mp->m_in_maxlevels, 0))); | ||
3410 | + XFS_FSB_TO_B(mp, 1)))); | ||
3411 | } | ||
3412 | |||
3413 | /* | ||
3414 | diff --git a/include/linux/elevator.h b/include/linux/elevator.h | ||
3415 | index e7f358d2e5fc..eaa58c0f894b 100644 | ||
3416 | --- a/include/linux/elevator.h | ||
3417 | +++ b/include/linux/elevator.h | ||
3418 | @@ -102,7 +102,7 @@ struct elevator_type | ||
3419 | struct module *elevator_owner; | ||
3420 | |||
3421 | /* managed by elevator core */ | ||
3422 | - char icq_cache_name[ELV_NAME_MAX + 5]; /* elvname + "_io_cq" */ | ||
3423 | + char icq_cache_name[ELV_NAME_MAX + 6]; /* elvname + "_io_cq" */ | ||
3424 | struct list_head list; | ||
3425 | }; | ||
3426 | |||
3427 | diff --git a/include/linux/iio/buffer-dma.h b/include/linux/iio/buffer-dma.h | ||
3428 | index 767467d886de..67c75372b691 100644 | ||
3429 | --- a/include/linux/iio/buffer-dma.h | ||
3430 | +++ b/include/linux/iio/buffer-dma.h | ||
3431 | @@ -141,7 +141,7 @@ int iio_dma_buffer_read(struct iio_buffer *buffer, size_t n, | ||
3432 | char __user *user_buffer); | ||
3433 | size_t iio_dma_buffer_data_available(struct iio_buffer *buffer); | ||
3434 | int iio_dma_buffer_set_bytes_per_datum(struct iio_buffer *buffer, size_t bpd); | ||
3435 | -int iio_dma_buffer_set_length(struct iio_buffer *buffer, int length); | ||
3436 | +int iio_dma_buffer_set_length(struct iio_buffer *buffer, unsigned int length); | ||
3437 | int iio_dma_buffer_request_update(struct iio_buffer *buffer); | ||
3438 | |||
3439 | int iio_dma_buffer_init(struct iio_dma_buffer_queue *queue, | ||
3440 | diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h | ||
3441 | index 62d44c176071..e4b8678183f5 100644 | ||
3442 | --- a/include/linux/posix-timers.h | ||
3443 | +++ b/include/linux/posix-timers.h | ||
3444 | @@ -65,8 +65,8 @@ struct k_itimer { | ||
3445 | spinlock_t it_lock; | ||
3446 | clockid_t it_clock; /* which timer type */ | ||
3447 | timer_t it_id; /* timer id */ | ||
3448 | - int it_overrun; /* overrun on pending signal */ | ||
3449 | - int it_overrun_last; /* overrun on last delivered signal */ | ||
3450 | + s64 it_overrun; /* overrun on pending signal */ | ||
3451 | + s64 it_overrun_last; /* overrun on last delivered signal */ | ||
3452 | int it_requeue_pending; /* waiting to requeue this timer */ | ||
3453 | #define REQUEUE_PENDING 1 | ||
3454 | int it_sigev_notify; /* notify word of sigevent struct */ | ||
3455 | diff --git a/init/main.c b/init/main.c | ||
3456 | index 4313772d634a..3c7f71d8e704 100644 | ||
3457 | --- a/init/main.c | ||
3458 | +++ b/init/main.c | ||
3459 | @@ -915,7 +915,7 @@ static int try_to_run_init_process(const char *init_filename) | ||
3460 | |||
3461 | static noinline void __init kernel_init_freeable(void); | ||
3462 | |||
3463 | -#if defined(CONFIG_DEBUG_RODATA) || defined(CONFIG_SET_MODULE_RONX) | ||
3464 | +#if defined(CONFIG_DEBUG_RODATA) || defined(CONFIG_DEBUG_SET_MODULE_RONX) | ||
3465 | bool rodata_enabled __ro_after_init = true; | ||
3466 | static int __init set_debug_rodata(char *str) | ||
3467 | { | ||
3468 | diff --git a/kernel/events/core.c b/kernel/events/core.c | ||
3469 | index 95bd00d9f2c3..1af0bbf20984 100644 | ||
3470 | --- a/kernel/events/core.c | ||
3471 | +++ b/kernel/events/core.c | ||
3472 | @@ -4331,7 +4331,9 @@ EXPORT_SYMBOL_GPL(perf_event_read_value); | ||
3473 | static int __perf_read_group_add(struct perf_event *leader, | ||
3474 | u64 read_format, u64 *values) | ||
3475 | { | ||
3476 | + struct perf_event_context *ctx = leader->ctx; | ||
3477 | struct perf_event *sub; | ||
3478 | + unsigned long flags; | ||
3479 | int n = 1; /* skip @nr */ | ||
3480 | int ret; | ||
3481 | |||
3482 | @@ -4361,12 +4363,15 @@ static int __perf_read_group_add(struct perf_event *leader, | ||
3483 | if (read_format & PERF_FORMAT_ID) | ||
3484 | values[n++] = primary_event_id(leader); | ||
3485 | |||
3486 | + raw_spin_lock_irqsave(&ctx->lock, flags); | ||
3487 | + | ||
3488 | list_for_each_entry(sub, &leader->sibling_list, group_entry) { | ||
3489 | values[n++] += perf_event_count(sub); | ||
3490 | if (read_format & PERF_FORMAT_ID) | ||
3491 | values[n++] = primary_event_id(sub); | ||
3492 | } | ||
3493 | |||
3494 | + raw_spin_unlock_irqrestore(&ctx->lock, flags); | ||
3495 | return 0; | ||
3496 | } | ||
3497 | |||
3498 | @@ -7737,6 +7742,8 @@ void perf_tp_event(u16 event_type, u64 count, void *record, int entry_size, | ||
3499 | goto unlock; | ||
3500 | |||
3501 | list_for_each_entry_rcu(event, &ctx->event_list, event_entry) { | ||
3502 | + if (event->cpu != smp_processor_id()) | ||
3503 | + continue; | ||
3504 | if (event->attr.type != PERF_TYPE_TRACEPOINT) | ||
3505 | continue; | ||
3506 | if (event->attr.config != entry->type) | ||
3507 | diff --git a/kernel/futex.c b/kernel/futex.c | ||
3508 | index c3ea6f2a6997..053d7be08be5 100644 | ||
3509 | --- a/kernel/futex.c | ||
3510 | +++ b/kernel/futex.c | ||
3511 | @@ -1467,8 +1467,16 @@ static int futex_atomic_op_inuser(unsigned int encoded_op, u32 __user *uaddr) | ||
3512 | int oldval, ret; | ||
3513 | |||
3514 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) { | ||
3515 | - if (oparg < 0 || oparg > 31) | ||
3516 | - return -EINVAL; | ||
3517 | + if (oparg < 0 || oparg > 31) { | ||
3518 | + char comm[sizeof(current->comm)]; | ||
3519 | + /* | ||
3520 | + * kill this print and return -EINVAL when userspace | ||
3521 | + * is sane again | ||
3522 | + */ | ||
3523 | + pr_info_ratelimited("futex_wake_op: %s tries to shift op by %d; fix this program\n", | ||
3524 | + get_task_comm(comm, current), oparg); | ||
3525 | + oparg &= 31; | ||
3526 | + } | ||
3527 | oparg = 1 << oparg; | ||
3528 | } | ||
3529 | |||
3530 | diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c | ||
3531 | index f81adb476c03..5ad109ccec35 100644 | ||
3532 | --- a/kernel/sched/fair.c | ||
3533 | +++ b/kernel/sched/fair.c | ||
3534 | @@ -3976,9 +3976,13 @@ static void throttle_cfs_rq(struct cfs_rq *cfs_rq) | ||
3535 | |||
3536 | /* | ||
3537 | * Add to the _head_ of the list, so that an already-started | ||
3538 | - * distribute_cfs_runtime will not see us | ||
3539 | + * distribute_cfs_runtime will not see us. If disribute_cfs_runtime is | ||
3540 | + * not running add to the tail so that later runqueues don't get starved. | ||
3541 | */ | ||
3542 | - list_add_rcu(&cfs_rq->throttled_list, &cfs_b->throttled_cfs_rq); | ||
3543 | + if (cfs_b->distribute_running) | ||
3544 | + list_add_rcu(&cfs_rq->throttled_list, &cfs_b->throttled_cfs_rq); | ||
3545 | + else | ||
3546 | + list_add_tail_rcu(&cfs_rq->throttled_list, &cfs_b->throttled_cfs_rq); | ||
3547 | |||
3548 | /* | ||
3549 | * If we're the first throttled task, make sure the bandwidth | ||
3550 | @@ -4121,14 +4125,16 @@ static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun) | ||
3551 | * in us over-using our runtime if it is all used during this loop, but | ||
3552 | * only by limited amounts in that extreme case. | ||
3553 | */ | ||
3554 | - while (throttled && cfs_b->runtime > 0) { | ||
3555 | + while (throttled && cfs_b->runtime > 0 && !cfs_b->distribute_running) { | ||
3556 | runtime = cfs_b->runtime; | ||
3557 | + cfs_b->distribute_running = 1; | ||
3558 | raw_spin_unlock(&cfs_b->lock); | ||
3559 | /* we can't nest cfs_b->lock while distributing bandwidth */ | ||
3560 | runtime = distribute_cfs_runtime(cfs_b, runtime, | ||
3561 | runtime_expires); | ||
3562 | raw_spin_lock(&cfs_b->lock); | ||
3563 | |||
3564 | + cfs_b->distribute_running = 0; | ||
3565 | throttled = !list_empty(&cfs_b->throttled_cfs_rq); | ||
3566 | |||
3567 | cfs_b->runtime -= min(runtime, cfs_b->runtime); | ||
3568 | @@ -4239,6 +4245,11 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b) | ||
3569 | |||
3570 | /* confirm we're still not at a refresh boundary */ | ||
3571 | raw_spin_lock(&cfs_b->lock); | ||
3572 | + if (cfs_b->distribute_running) { | ||
3573 | + raw_spin_unlock(&cfs_b->lock); | ||
3574 | + return; | ||
3575 | + } | ||
3576 | + | ||
3577 | if (runtime_refresh_within(cfs_b, min_bandwidth_expiration)) { | ||
3578 | raw_spin_unlock(&cfs_b->lock); | ||
3579 | return; | ||
3580 | @@ -4248,6 +4259,9 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b) | ||
3581 | runtime = cfs_b->runtime; | ||
3582 | |||
3583 | expires = cfs_b->runtime_expires; | ||
3584 | + if (runtime) | ||
3585 | + cfs_b->distribute_running = 1; | ||
3586 | + | ||
3587 | raw_spin_unlock(&cfs_b->lock); | ||
3588 | |||
3589 | if (!runtime) | ||
3590 | @@ -4258,6 +4272,7 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b) | ||
3591 | raw_spin_lock(&cfs_b->lock); | ||
3592 | if (expires == cfs_b->runtime_expires) | ||
3593 | cfs_b->runtime -= min(runtime, cfs_b->runtime); | ||
3594 | + cfs_b->distribute_running = 0; | ||
3595 | raw_spin_unlock(&cfs_b->lock); | ||
3596 | } | ||
3597 | |||
3598 | @@ -4366,6 +4381,7 @@ void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) | ||
3599 | cfs_b->period_timer.function = sched_cfs_period_timer; | ||
3600 | hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | ||
3601 | cfs_b->slack_timer.function = sched_cfs_slack_timer; | ||
3602 | + cfs_b->distribute_running = 0; | ||
3603 | } | ||
3604 | |||
3605 | static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq) | ||
3606 | diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h | ||
3607 | index 923cc35e8490..ec6e838e991a 100644 | ||
3608 | --- a/kernel/sched/sched.h | ||
3609 | +++ b/kernel/sched/sched.h | ||
3610 | @@ -255,6 +255,8 @@ struct cfs_bandwidth { | ||
3611 | /* statistics */ | ||
3612 | int nr_periods, nr_throttled; | ||
3613 | u64 throttled_time; | ||
3614 | + | ||
3615 | + bool distribute_running; | ||
3616 | #endif | ||
3617 | }; | ||
3618 | |||
3619 | diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c | ||
3620 | index 39008d78927a..21a27bb73587 100644 | ||
3621 | --- a/kernel/time/posix-cpu-timers.c | ||
3622 | +++ b/kernel/time/posix-cpu-timers.c | ||
3623 | @@ -103,7 +103,7 @@ static void bump_cpu_timer(struct k_itimer *timer, | ||
3624 | continue; | ||
3625 | |||
3626 | timer->it.cpu.expires += incr; | ||
3627 | - timer->it_overrun += 1 << i; | ||
3628 | + timer->it_overrun += 1LL << i; | ||
3629 | delta -= incr; | ||
3630 | } | ||
3631 | } | ||
3632 | diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c | ||
3633 | index fc7c37ad90a0..0e6ed2e7d066 100644 | ||
3634 | --- a/kernel/time/posix-timers.c | ||
3635 | +++ b/kernel/time/posix-timers.c | ||
3636 | @@ -355,6 +355,17 @@ static __init int init_posix_timers(void) | ||
3637 | |||
3638 | __initcall(init_posix_timers); | ||
3639 | |||
3640 | +/* | ||
3641 | + * The siginfo si_overrun field and the return value of timer_getoverrun(2) | ||
3642 | + * are of type int. Clamp the overrun value to INT_MAX | ||
3643 | + */ | ||
3644 | +static inline int timer_overrun_to_int(struct k_itimer *timr, int baseval) | ||
3645 | +{ | ||
3646 | + s64 sum = timr->it_overrun_last + (s64)baseval; | ||
3647 | + | ||
3648 | + return sum > (s64)INT_MAX ? INT_MAX : (int)sum; | ||
3649 | +} | ||
3650 | + | ||
3651 | static void schedule_next_timer(struct k_itimer *timr) | ||
3652 | { | ||
3653 | struct hrtimer *timer = &timr->it.real.timer; | ||
3654 | @@ -362,12 +373,11 @@ static void schedule_next_timer(struct k_itimer *timr) | ||
3655 | if (timr->it.real.interval.tv64 == 0) | ||
3656 | return; | ||
3657 | |||
3658 | - timr->it_overrun += (unsigned int) hrtimer_forward(timer, | ||
3659 | - timer->base->get_time(), | ||
3660 | - timr->it.real.interval); | ||
3661 | + timr->it_overrun += hrtimer_forward(timer, timer->base->get_time(), | ||
3662 | + timr->it.real.interval); | ||
3663 | |||
3664 | timr->it_overrun_last = timr->it_overrun; | ||
3665 | - timr->it_overrun = -1; | ||
3666 | + timr->it_overrun = -1LL; | ||
3667 | ++timr->it_requeue_pending; | ||
3668 | hrtimer_restart(timer); | ||
3669 | } | ||
3670 | @@ -396,7 +406,7 @@ void do_schedule_next_timer(struct siginfo *info) | ||
3671 | else | ||
3672 | schedule_next_timer(timr); | ||
3673 | |||
3674 | - info->si_overrun += timr->it_overrun_last; | ||
3675 | + info->si_overrun = timer_overrun_to_int(timr, info->si_overrun); | ||
3676 | } | ||
3677 | |||
3678 | if (timr) | ||
3679 | @@ -491,8 +501,7 @@ static enum hrtimer_restart posix_timer_fn(struct hrtimer *timer) | ||
3680 | now = ktime_add(now, kj); | ||
3681 | } | ||
3682 | #endif | ||
3683 | - timr->it_overrun += (unsigned int) | ||
3684 | - hrtimer_forward(timer, now, | ||
3685 | + timr->it_overrun += hrtimer_forward(timer, now, | ||
3686 | timr->it.real.interval); | ||
3687 | ret = HRTIMER_RESTART; | ||
3688 | ++timr->it_requeue_pending; | ||
3689 | @@ -633,7 +642,7 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock, | ||
3690 | it_id_set = IT_ID_SET; | ||
3691 | new_timer->it_id = (timer_t) new_timer_id; | ||
3692 | new_timer->it_clock = which_clock; | ||
3693 | - new_timer->it_overrun = -1; | ||
3694 | + new_timer->it_overrun = -1LL; | ||
3695 | |||
3696 | if (timer_event_spec) { | ||
3697 | if (copy_from_user(&event, timer_event_spec, sizeof (event))) { | ||
3698 | @@ -762,7 +771,7 @@ common_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting) | ||
3699 | */ | ||
3700 | if (iv.tv64 && (timr->it_requeue_pending & REQUEUE_PENDING || | ||
3701 | timr->it_sigev_notify == SIGEV_NONE)) | ||
3702 | - timr->it_overrun += (unsigned int) hrtimer_forward(timer, now, iv); | ||
3703 | + timr->it_overrun += hrtimer_forward(timer, now, iv); | ||
3704 | |||
3705 | remaining = __hrtimer_expires_remaining_adjusted(timer, now); | ||
3706 | /* Return 0 only, when the timer is expired and not pending */ | ||
3707 | @@ -824,7 +833,7 @@ SYSCALL_DEFINE1(timer_getoverrun, timer_t, timer_id) | ||
3708 | if (!timr) | ||
3709 | return -EINVAL; | ||
3710 | |||
3711 | - overrun = timr->it_overrun_last; | ||
3712 | + overrun = timer_overrun_to_int(timr, 0); | ||
3713 | unlock_timer(timr, flags); | ||
3714 | |||
3715 | return overrun; | ||
3716 | diff --git a/lib/test_bpf.c b/lib/test_bpf.c | ||
3717 | index 1586dfdea809..960d4d627361 100644 | ||
3718 | --- a/lib/test_bpf.c | ||
3719 | +++ b/lib/test_bpf.c | ||
3720 | @@ -4874,7 +4874,7 @@ static struct bpf_test tests[] = { | ||
3721 | { | ||
3722 | "BPF_MAXINSNS: Jump, gap, jump, ...", | ||
3723 | { }, | ||
3724 | -#ifdef CONFIG_BPF_JIT_ALWAYS_ON | ||
3725 | +#if defined(CONFIG_BPF_JIT_ALWAYS_ON) && defined(CONFIG_X86) | ||
3726 | CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, | ||
3727 | #else | ||
3728 | CLASSIC | FLAG_NO_DATA, | ||
3729 | diff --git a/mm/frame_vector.c b/mm/frame_vector.c | ||
3730 | index 375a103d7a56..d73eed0443f6 100644 | ||
3731 | --- a/mm/frame_vector.c | ||
3732 | +++ b/mm/frame_vector.c | ||
3733 | @@ -61,8 +61,10 @@ int get_vaddr_frames(unsigned long start, unsigned int nr_frames, | ||
3734 | * get_user_pages_longterm() and disallow it for filesystem-dax | ||
3735 | * mappings. | ||
3736 | */ | ||
3737 | - if (vma_is_fsdax(vma)) | ||
3738 | - return -EOPNOTSUPP; | ||
3739 | + if (vma_is_fsdax(vma)) { | ||
3740 | + ret = -EOPNOTSUPP; | ||
3741 | + goto out; | ||
3742 | + } | ||
3743 | |||
3744 | if (!(vma->vm_flags & (VM_IO | VM_PFNMAP))) { | ||
3745 | vec->got_ref = true; | ||
3746 | diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c | ||
3747 | index c9f715b2917f..0f962cc3f1bf 100644 | ||
3748 | --- a/mm/memory_hotplug.c | ||
3749 | +++ b/mm/memory_hotplug.c | ||
3750 | @@ -1508,7 +1508,7 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, | ||
3751 | while ((i < MAX_ORDER_NR_PAGES) && | ||
3752 | !pfn_valid_within(pfn + i)) | ||
3753 | i++; | ||
3754 | - if (i == MAX_ORDER_NR_PAGES) | ||
3755 | + if (i == MAX_ORDER_NR_PAGES || pfn + i >= end_pfn) | ||
3756 | continue; | ||
3757 | page = pfn_to_page(pfn + i); | ||
3758 | if (zone && page_zone(page) != zone) | ||
3759 | @@ -1522,7 +1522,7 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, | ||
3760 | |||
3761 | if (zone) { | ||
3762 | *valid_start = start; | ||
3763 | - *valid_end = end; | ||
3764 | + *valid_end = min(end, end_pfn); | ||
3765 | return 1; | ||
3766 | } else { | ||
3767 | return 0; | ||
3768 | diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c | ||
3769 | index 1fba2a03f8ae..ba24f613c0fc 100644 | ||
3770 | --- a/net/bluetooth/mgmt.c | ||
3771 | +++ b/net/bluetooth/mgmt.c | ||
3772 | @@ -2298,9 +2298,8 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data, | ||
3773 | /* LE address type */ | ||
3774 | addr_type = le_addr_type(cp->addr.type); | ||
3775 | |||
3776 | - hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type); | ||
3777 | - | ||
3778 | - err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type); | ||
3779 | + /* Abort any ongoing SMP pairing. Removes ltk and irk if they exist. */ | ||
3780 | + err = smp_cancel_and_remove_pairing(hdev, &cp->addr.bdaddr, addr_type); | ||
3781 | if (err < 0) { | ||
3782 | err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, | ||
3783 | MGMT_STATUS_NOT_PAIRED, &rp, | ||
3784 | @@ -2314,8 +2313,6 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data, | ||
3785 | goto done; | ||
3786 | } | ||
3787 | |||
3788 | - /* Abort any ongoing SMP pairing */ | ||
3789 | - smp_cancel_pairing(conn); | ||
3790 | |||
3791 | /* Defer clearing up the connection parameters until closing to | ||
3792 | * give a chance of keeping them if a repairing happens. | ||
3793 | diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c | ||
3794 | index ead4d1baeaa6..1abfbcd8090a 100644 | ||
3795 | --- a/net/bluetooth/smp.c | ||
3796 | +++ b/net/bluetooth/smp.c | ||
3797 | @@ -2353,30 +2353,51 @@ unlock: | ||
3798 | return ret; | ||
3799 | } | ||
3800 | |||
3801 | -void smp_cancel_pairing(struct hci_conn *hcon) | ||
3802 | +int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr, | ||
3803 | + u8 addr_type) | ||
3804 | { | ||
3805 | - struct l2cap_conn *conn = hcon->l2cap_data; | ||
3806 | + struct hci_conn *hcon; | ||
3807 | + struct l2cap_conn *conn; | ||
3808 | struct l2cap_chan *chan; | ||
3809 | struct smp_chan *smp; | ||
3810 | + int err; | ||
3811 | + | ||
3812 | + err = hci_remove_ltk(hdev, bdaddr, addr_type); | ||
3813 | + hci_remove_irk(hdev, bdaddr, addr_type); | ||
3814 | + | ||
3815 | + hcon = hci_conn_hash_lookup_le(hdev, bdaddr, addr_type); | ||
3816 | + if (!hcon) | ||
3817 | + goto done; | ||
3818 | |||
3819 | + conn = hcon->l2cap_data; | ||
3820 | if (!conn) | ||
3821 | - return; | ||
3822 | + goto done; | ||
3823 | |||
3824 | chan = conn->smp; | ||
3825 | if (!chan) | ||
3826 | - return; | ||
3827 | + goto done; | ||
3828 | |||
3829 | l2cap_chan_lock(chan); | ||
3830 | |||
3831 | smp = chan->data; | ||
3832 | if (smp) { | ||
3833 | + /* Set keys to NULL to make sure smp_failure() does not try to | ||
3834 | + * remove and free already invalidated rcu list entries. */ | ||
3835 | + smp->ltk = NULL; | ||
3836 | + smp->slave_ltk = NULL; | ||
3837 | + smp->remote_irk = NULL; | ||
3838 | + | ||
3839 | if (test_bit(SMP_FLAG_COMPLETE, &smp->flags)) | ||
3840 | smp_failure(conn, 0); | ||
3841 | else | ||
3842 | smp_failure(conn, SMP_UNSPECIFIED); | ||
3843 | + err = 0; | ||
3844 | } | ||
3845 | |||
3846 | l2cap_chan_unlock(chan); | ||
3847 | + | ||
3848 | +done: | ||
3849 | + return err; | ||
3850 | } | ||
3851 | |||
3852 | static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb) | ||
3853 | diff --git a/net/bluetooth/smp.h b/net/bluetooth/smp.h | ||
3854 | index ffcc70b6b199..993cbd7bcfe7 100644 | ||
3855 | --- a/net/bluetooth/smp.h | ||
3856 | +++ b/net/bluetooth/smp.h | ||
3857 | @@ -180,7 +180,8 @@ enum smp_key_pref { | ||
3858 | }; | ||
3859 | |||
3860 | /* SMP Commands */ | ||
3861 | -void smp_cancel_pairing(struct hci_conn *hcon); | ||
3862 | +int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr, | ||
3863 | + u8 addr_type); | ||
3864 | bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level, | ||
3865 | enum smp_key_pref key_pref); | ||
3866 | int smp_conn_security(struct hci_conn *hcon, __u8 sec_level); | ||
3867 | diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c | ||
3868 | index 2136e45f5277..4bd57507b9a4 100644 | ||
3869 | --- a/net/bridge/br_multicast.c | ||
3870 | +++ b/net/bridge/br_multicast.c | ||
3871 | @@ -1287,7 +1287,14 @@ static void br_multicast_query_received(struct net_bridge *br, | ||
3872 | return; | ||
3873 | |||
3874 | br_multicast_update_query_timer(br, query, max_delay); | ||
3875 | - br_multicast_mark_router(br, port); | ||
3876 | + | ||
3877 | + /* Based on RFC4541, section 2.1.1 IGMP Forwarding Rules, | ||
3878 | + * the arrival port for IGMP Queries where the source address | ||
3879 | + * is 0.0.0.0 should not be added to router port list. | ||
3880 | + */ | ||
3881 | + if ((saddr->proto == htons(ETH_P_IP) && saddr->u.ip4) || | ||
3882 | + saddr->proto == htons(ETH_P_IPV6)) | ||
3883 | + br_multicast_mark_router(br, port); | ||
3884 | } | ||
3885 | |||
3886 | static int br_ip4_multicast_query(struct net_bridge *br, | ||
3887 | diff --git a/net/core/datagram.c b/net/core/datagram.c | ||
3888 | index 4fa4011feec1..146502f310ce 100644 | ||
3889 | --- a/net/core/datagram.c | ||
3890 | +++ b/net/core/datagram.c | ||
3891 | @@ -754,8 +754,9 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, | ||
3892 | return -EINVAL; | ||
3893 | } | ||
3894 | |||
3895 | - if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE)) | ||
3896 | - netdev_rx_csum_fault(skb->dev); | ||
3897 | + if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) && | ||
3898 | + !skb->csum_complete_sw) | ||
3899 | + netdev_rx_csum_fault(NULL); | ||
3900 | } | ||
3901 | return 0; | ||
3902 | fault: | ||
3903 | diff --git a/net/core/ethtool.c b/net/core/ethtool.c | ||
3904 | index 7913771ec474..a8a9938aeceb 100644 | ||
3905 | --- a/net/core/ethtool.c | ||
3906 | +++ b/net/core/ethtool.c | ||
3907 | @@ -2397,13 +2397,17 @@ roll_back: | ||
3908 | return ret; | ||
3909 | } | ||
3910 | |||
3911 | -static int ethtool_set_per_queue(struct net_device *dev, void __user *useraddr) | ||
3912 | +static int ethtool_set_per_queue(struct net_device *dev, | ||
3913 | + void __user *useraddr, u32 sub_cmd) | ||
3914 | { | ||
3915 | struct ethtool_per_queue_op per_queue_opt; | ||
3916 | |||
3917 | if (copy_from_user(&per_queue_opt, useraddr, sizeof(per_queue_opt))) | ||
3918 | return -EFAULT; | ||
3919 | |||
3920 | + if (per_queue_opt.sub_command != sub_cmd) | ||
3921 | + return -EINVAL; | ||
3922 | + | ||
3923 | switch (per_queue_opt.sub_command) { | ||
3924 | case ETHTOOL_GCOALESCE: | ||
3925 | return ethtool_get_per_queue_coalesce(dev, useraddr, &per_queue_opt); | ||
3926 | @@ -2669,7 +2673,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) | ||
3927 | rc = ethtool_get_phy_stats(dev, useraddr); | ||
3928 | break; | ||
3929 | case ETHTOOL_PERQUEUE: | ||
3930 | - rc = ethtool_set_per_queue(dev, useraddr); | ||
3931 | + rc = ethtool_set_per_queue(dev, useraddr, sub_cmd); | ||
3932 | break; | ||
3933 | case ETHTOOL_GLINKSETTINGS: | ||
3934 | rc = ethtool_get_link_ksettings(dev, useraddr); | ||
3935 | diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c | ||
3936 | index 189082dc288d..928a0b84469d 100644 | ||
3937 | --- a/net/core/rtnetlink.c | ||
3938 | +++ b/net/core/rtnetlink.c | ||
3939 | @@ -2987,6 +2987,11 @@ static int rtnl_fdb_add(struct sk_buff *skb, struct nlmsghdr *nlh) | ||
3940 | return -EINVAL; | ||
3941 | } | ||
3942 | |||
3943 | + if (dev->type != ARPHRD_ETHER) { | ||
3944 | + pr_info("PF_BRIDGE: FDB add only supported for Ethernet devices"); | ||
3945 | + return -EINVAL; | ||
3946 | + } | ||
3947 | + | ||
3948 | addr = nla_data(tb[NDA_LLADDR]); | ||
3949 | |||
3950 | err = fdb_vid_parse(tb[NDA_VLAN], &vid); | ||
3951 | @@ -3090,6 +3095,11 @@ static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh) | ||
3952 | return -EINVAL; | ||
3953 | } | ||
3954 | |||
3955 | + if (dev->type != ARPHRD_ETHER) { | ||
3956 | + pr_info("PF_BRIDGE: FDB delete only supported for Ethernet devices"); | ||
3957 | + return -EINVAL; | ||
3958 | + } | ||
3959 | + | ||
3960 | addr = nla_data(tb[NDA_LLADDR]); | ||
3961 | |||
3962 | err = fdb_vid_parse(tb[NDA_VLAN], &vid); | ||
3963 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c | ||
3964 | index 038ec74fa131..68ecb7d71c2b 100644 | ||
3965 | --- a/net/core/skbuff.c | ||
3966 | +++ b/net/core/skbuff.c | ||
3967 | @@ -1585,8 +1585,9 @@ int pskb_trim_rcsum_slow(struct sk_buff *skb, unsigned int len) | ||
3968 | if (skb->ip_summed == CHECKSUM_COMPLETE) { | ||
3969 | int delta = skb->len - len; | ||
3970 | |||
3971 | - skb->csum = csum_sub(skb->csum, | ||
3972 | - skb_checksum(skb, len, delta, 0)); | ||
3973 | + skb->csum = csum_block_sub(skb->csum, | ||
3974 | + skb_checksum(skb, len, delta, 0), | ||
3975 | + len); | ||
3976 | } | ||
3977 | return __pskb_trim(skb, len); | ||
3978 | } | ||
3979 | diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c | ||
3980 | index cc8c6ac84d08..80e48f40c3a8 100644 | ||
3981 | --- a/net/ipv4/ip_fragment.c | ||
3982 | +++ b/net/ipv4/ip_fragment.c | ||
3983 | @@ -718,10 +718,14 @@ struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user) | ||
3984 | if (ip_is_fragment(&iph)) { | ||
3985 | skb = skb_share_check(skb, GFP_ATOMIC); | ||
3986 | if (skb) { | ||
3987 | - if (!pskb_may_pull(skb, netoff + iph.ihl * 4)) | ||
3988 | - return skb; | ||
3989 | - if (pskb_trim_rcsum(skb, netoff + len)) | ||
3990 | - return skb; | ||
3991 | + if (!pskb_may_pull(skb, netoff + iph.ihl * 4)) { | ||
3992 | + kfree_skb(skb); | ||
3993 | + return NULL; | ||
3994 | + } | ||
3995 | + if (pskb_trim_rcsum(skb, netoff + len)) { | ||
3996 | + kfree_skb(skb); | ||
3997 | + return NULL; | ||
3998 | + } | ||
3999 | memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); | ||
4000 | if (ip_defrag(net, skb, user)) | ||
4001 | return NULL; | ||
4002 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c | ||
4003 | index b9b2a9828d98..5d4b5e0f6b5e 100644 | ||
4004 | --- a/net/ipv4/udp.c | ||
4005 | +++ b/net/ipv4/udp.c | ||
4006 | @@ -1726,8 +1726,24 @@ static inline int udp4_csum_init(struct sk_buff *skb, struct udphdr *uh, | ||
4007 | /* Note, we are only interested in != 0 or == 0, thus the | ||
4008 | * force to int. | ||
4009 | */ | ||
4010 | - return (__force int)skb_checksum_init_zero_check(skb, proto, uh->check, | ||
4011 | - inet_compute_pseudo); | ||
4012 | + err = (__force int)skb_checksum_init_zero_check(skb, proto, uh->check, | ||
4013 | + inet_compute_pseudo); | ||
4014 | + if (err) | ||
4015 | + return err; | ||
4016 | + | ||
4017 | + if (skb->ip_summed == CHECKSUM_COMPLETE && !skb->csum_valid) { | ||
4018 | + /* If SW calculated the value, we know it's bad */ | ||
4019 | + if (skb->csum_complete_sw) | ||
4020 | + return 1; | ||
4021 | + | ||
4022 | + /* HW says the value is bad. Let's validate that. | ||
4023 | + * skb->csum is no longer the full packet checksum, | ||
4024 | + * so don't treat it as such. | ||
4025 | + */ | ||
4026 | + skb_checksum_complete_unset(skb); | ||
4027 | + } | ||
4028 | + | ||
4029 | + return 0; | ||
4030 | } | ||
4031 | |||
4032 | /* wrapper for udp_queue_rcv_skb tacking care of csum conversion and | ||
4033 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c | ||
4034 | index bc532206077f..8f79f0414bc3 100644 | ||
4035 | --- a/net/ipv6/addrconf.c | ||
4036 | +++ b/net/ipv6/addrconf.c | ||
4037 | @@ -4721,8 +4721,8 @@ static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb, | ||
4038 | |||
4039 | /* unicast address incl. temp addr */ | ||
4040 | list_for_each_entry(ifa, &idev->addr_list, if_list) { | ||
4041 | - if (++ip_idx < s_ip_idx) | ||
4042 | - continue; | ||
4043 | + if (ip_idx < s_ip_idx) | ||
4044 | + goto next; | ||
4045 | err = inet6_fill_ifaddr(skb, ifa, | ||
4046 | NETLINK_CB(cb->skb).portid, | ||
4047 | cb->nlh->nlmsg_seq, | ||
4048 | @@ -4731,6 +4731,8 @@ static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb, | ||
4049 | if (err < 0) | ||
4050 | break; | ||
4051 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | ||
4052 | +next: | ||
4053 | + ip_idx++; | ||
4054 | } | ||
4055 | break; | ||
4056 | } | ||
4057 | diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c | ||
4058 | index 421379014995..f7b425615c12 100644 | ||
4059 | --- a/net/ipv6/af_inet6.c | ||
4060 | +++ b/net/ipv6/af_inet6.c | ||
4061 | @@ -1045,11 +1045,11 @@ netfilter_fail: | ||
4062 | igmp_fail: | ||
4063 | ndisc_cleanup(); | ||
4064 | ndisc_fail: | ||
4065 | - ip6_mr_cleanup(); | ||
4066 | + icmpv6_cleanup(); | ||
4067 | icmp_fail: | ||
4068 | - unregister_pernet_subsys(&inet6_net_ops); | ||
4069 | + ip6_mr_cleanup(); | ||
4070 | ipmr_fail: | ||
4071 | - icmpv6_cleanup(); | ||
4072 | + unregister_pernet_subsys(&inet6_net_ops); | ||
4073 | register_pernet_fail: | ||
4074 | sock_unregister(PF_INET6); | ||
4075 | rtnl_unregister_all(PF_INET6); | ||
4076 | diff --git a/net/ipv6/ip6_checksum.c b/net/ipv6/ip6_checksum.c | ||
4077 | index 1dc023ca98fd..9d9a16e219d6 100644 | ||
4078 | --- a/net/ipv6/ip6_checksum.c | ||
4079 | +++ b/net/ipv6/ip6_checksum.c | ||
4080 | @@ -87,8 +87,24 @@ int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto) | ||
4081 | * Note, we are only interested in != 0 or == 0, thus the | ||
4082 | * force to int. | ||
4083 | */ | ||
4084 | - return (__force int)skb_checksum_init_zero_check(skb, proto, uh->check, | ||
4085 | - ip6_compute_pseudo); | ||
4086 | + err = (__force int)skb_checksum_init_zero_check(skb, proto, uh->check, | ||
4087 | + ip6_compute_pseudo); | ||
4088 | + if (err) | ||
4089 | + return err; | ||
4090 | + | ||
4091 | + if (skb->ip_summed == CHECKSUM_COMPLETE && !skb->csum_valid) { | ||
4092 | + /* If SW calculated the value, we know it's bad */ | ||
4093 | + if (skb->csum_complete_sw) | ||
4094 | + return 1; | ||
4095 | + | ||
4096 | + /* HW says the value is bad. Let's validate that. | ||
4097 | + * skb->csum is no longer the full packet checksum, | ||
4098 | + * so don't treat is as such. | ||
4099 | + */ | ||
4100 | + skb_checksum_complete_unset(skb); | ||
4101 | + } | ||
4102 | + | ||
4103 | + return 0; | ||
4104 | } | ||
4105 | EXPORT_SYMBOL(udp6_csum_init); | ||
4106 | |||
4107 | diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c | ||
4108 | index fd081a14064e..9c5afa5153ce 100644 | ||
4109 | --- a/net/ipv6/ip6_tunnel.c | ||
4110 | +++ b/net/ipv6/ip6_tunnel.c | ||
4111 | @@ -1185,11 +1185,6 @@ route_lookup: | ||
4112 | } | ||
4113 | skb_dst_set(skb, dst); | ||
4114 | |||
4115 | - if (encap_limit >= 0) { | ||
4116 | - init_tel_txopt(&opt, encap_limit); | ||
4117 | - ipv6_push_nfrag_opts(skb, &opt.ops, &proto, NULL); | ||
4118 | - } | ||
4119 | - | ||
4120 | /* Calculate max headroom for all the headers and adjust | ||
4121 | * needed_headroom if necessary. | ||
4122 | */ | ||
4123 | @@ -1202,6 +1197,11 @@ route_lookup: | ||
4124 | if (err) | ||
4125 | return err; | ||
4126 | |||
4127 | + if (encap_limit >= 0) { | ||
4128 | + init_tel_txopt(&opt, encap_limit); | ||
4129 | + ipv6_push_nfrag_opts(skb, &opt.ops, &proto, NULL); | ||
4130 | + } | ||
4131 | + | ||
4132 | skb_push(skb, sizeof(struct ipv6hdr)); | ||
4133 | skb_reset_network_header(skb); | ||
4134 | ipv6h = ipv6_hdr(skb); | ||
4135 | @@ -1258,7 +1258,7 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) | ||
4136 | fl6.flowi6_proto = IPPROTO_IPIP; | ||
4137 | fl6.daddr = key->u.ipv6.dst; | ||
4138 | fl6.flowlabel = key->label; | ||
4139 | - dsfield = ip6_tclass(key->label); | ||
4140 | + dsfield = key->tos; | ||
4141 | } else { | ||
4142 | if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) | ||
4143 | encap_limit = t->parms.encap_limit; | ||
4144 | @@ -1329,7 +1329,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) | ||
4145 | fl6.flowi6_proto = IPPROTO_IPV6; | ||
4146 | fl6.daddr = key->u.ipv6.dst; | ||
4147 | fl6.flowlabel = key->label; | ||
4148 | - dsfield = ip6_tclass(key->label); | ||
4149 | + dsfield = key->tos; | ||
4150 | } else { | ||
4151 | offset = ip6_tnl_parse_tlv_enc_lim(skb, skb_network_header(skb)); | ||
4152 | /* ip6_tnl_parse_tlv_enc_lim() might have reallocated skb->head */ | ||
4153 | diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c | ||
4154 | index 6c54c76847bf..40262abb15db 100644 | ||
4155 | --- a/net/ipv6/mcast.c | ||
4156 | +++ b/net/ipv6/mcast.c | ||
4157 | @@ -2413,17 +2413,17 @@ static int ip6_mc_leave_src(struct sock *sk, struct ipv6_mc_socklist *iml, | ||
4158 | { | ||
4159 | int err; | ||
4160 | |||
4161 | - /* callers have the socket lock and rtnl lock | ||
4162 | - * so no other readers or writers of iml or its sflist | ||
4163 | - */ | ||
4164 | + write_lock_bh(&iml->sflock); | ||
4165 | if (!iml->sflist) { | ||
4166 | /* any-source empty exclude case */ | ||
4167 | - return ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0); | ||
4168 | + err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0); | ||
4169 | + } else { | ||
4170 | + err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, | ||
4171 | + iml->sflist->sl_count, iml->sflist->sl_addr, 0); | ||
4172 | + sock_kfree_s(sk, iml->sflist, IP6_SFLSIZE(iml->sflist->sl_max)); | ||
4173 | + iml->sflist = NULL; | ||
4174 | } | ||
4175 | - err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, | ||
4176 | - iml->sflist->sl_count, iml->sflist->sl_addr, 0); | ||
4177 | - sock_kfree_s(sk, iml->sflist, IP6_SFLSIZE(iml->sflist->sl_max)); | ||
4178 | - iml->sflist = NULL; | ||
4179 | + write_unlock_bh(&iml->sflock); | ||
4180 | return err; | ||
4181 | } | ||
4182 | |||
4183 | diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c | ||
4184 | index 21f3bf2125f4..505d048ffff5 100644 | ||
4185 | --- a/net/ipv6/ndisc.c | ||
4186 | +++ b/net/ipv6/ndisc.c | ||
4187 | @@ -1692,10 +1692,9 @@ int ndisc_rcv(struct sk_buff *skb) | ||
4188 | return 0; | ||
4189 | } | ||
4190 | |||
4191 | - memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); | ||
4192 | - | ||
4193 | switch (msg->icmph.icmp6_type) { | ||
4194 | case NDISC_NEIGHBOUR_SOLICITATION: | ||
4195 | + memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); | ||
4196 | ndisc_recv_ns(skb); | ||
4197 | break; | ||
4198 | |||
4199 | diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
4200 | index b9147558a8f2..e46185377981 100644 | ||
4201 | --- a/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
4202 | +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
4203 | @@ -597,8 +597,6 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user) | ||
4204 | fq->q.meat == fq->q.len && | ||
4205 | nf_ct_frag6_reasm(fq, skb, dev)) | ||
4206 | ret = 0; | ||
4207 | - else | ||
4208 | - skb_dst_drop(skb); | ||
4209 | |||
4210 | out_unlock: | ||
4211 | spin_unlock_bh(&fq->q.lock); | ||
4212 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c | ||
4213 | index 70fa31e37360..4cc12eeca7ab 100644 | ||
4214 | --- a/net/ipv6/route.c | ||
4215 | +++ b/net/ipv6/route.c | ||
4216 | @@ -2289,6 +2289,7 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu | ||
4217 | if (on_link) | ||
4218 | nrt->rt6i_flags &= ~RTF_GATEWAY; | ||
4219 | |||
4220 | + nrt->rt6i_protocol = RTPROT_REDIRECT; | ||
4221 | nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key; | ||
4222 | |||
4223 | if (ip6_ins_rt(nrt)) | ||
4224 | @@ -2393,6 +2394,7 @@ static struct rt6_info *rt6_add_route_info(struct net *net, | ||
4225 | .fc_dst_len = prefixlen, | ||
4226 | .fc_flags = RTF_GATEWAY | RTF_ADDRCONF | RTF_ROUTEINFO | | ||
4227 | RTF_UP | RTF_PREF(pref), | ||
4228 | + .fc_protocol = RTPROT_RA, | ||
4229 | .fc_nlinfo.portid = 0, | ||
4230 | .fc_nlinfo.nlh = NULL, | ||
4231 | .fc_nlinfo.nl_net = net, | ||
4232 | @@ -2445,6 +2447,7 @@ struct rt6_info *rt6_add_dflt_router(const struct in6_addr *gwaddr, | ||
4233 | .fc_ifindex = dev->ifindex, | ||
4234 | .fc_flags = RTF_GATEWAY | RTF_ADDRCONF | RTF_DEFAULT | | ||
4235 | RTF_UP | RTF_EXPIRES | RTF_PREF(pref), | ||
4236 | + .fc_protocol = RTPROT_RA, | ||
4237 | .fc_nlinfo.portid = 0, | ||
4238 | .fc_nlinfo.nlh = NULL, | ||
4239 | .fc_nlinfo.nl_net = dev_net(dev), | ||
4240 | @@ -3241,14 +3244,6 @@ static int rt6_fill_node(struct net *net, | ||
4241 | } | ||
4242 | rtm->rtm_scope = RT_SCOPE_UNIVERSE; | ||
4243 | rtm->rtm_protocol = rt->rt6i_protocol; | ||
4244 | - if (rt->rt6i_flags & RTF_DYNAMIC) | ||
4245 | - rtm->rtm_protocol = RTPROT_REDIRECT; | ||
4246 | - else if (rt->rt6i_flags & RTF_ADDRCONF) { | ||
4247 | - if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ROUTEINFO)) | ||
4248 | - rtm->rtm_protocol = RTPROT_RA; | ||
4249 | - else | ||
4250 | - rtm->rtm_protocol = RTPROT_KERNEL; | ||
4251 | - } | ||
4252 | |||
4253 | if (rt->rt6i_flags & RTF_CACHE) | ||
4254 | rtm->rtm_flags |= RTM_F_CLONED; | ||
4255 | diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c | ||
4256 | index 4d09ce6fa90e..64862c5084ee 100644 | ||
4257 | --- a/net/ipv6/xfrm6_output.c | ||
4258 | +++ b/net/ipv6/xfrm6_output.c | ||
4259 | @@ -165,9 +165,11 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb) | ||
4260 | |||
4261 | if (toobig && xfrm6_local_dontfrag(skb)) { | ||
4262 | xfrm6_local_rxpmtu(skb, mtu); | ||
4263 | + kfree_skb(skb); | ||
4264 | return -EMSGSIZE; | ||
4265 | } else if (!skb->ignore_df && toobig && skb->sk) { | ||
4266 | xfrm_local_error(skb, mtu); | ||
4267 | + kfree_skb(skb); | ||
4268 | return -EMSGSIZE; | ||
4269 | } | ||
4270 | |||
4271 | diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c | ||
4272 | index a5333f6cb65a..b96dbe38ecad 100644 | ||
4273 | --- a/net/l2tp/l2tp_core.c | ||
4274 | +++ b/net/l2tp/l2tp_core.c | ||
4275 | @@ -845,10 +845,8 @@ void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb, | ||
4276 | } | ||
4277 | } | ||
4278 | |||
4279 | - /* Session data offset is handled differently for L2TPv2 and | ||
4280 | - * L2TPv3. For L2TPv2, there is an optional 16-bit value in | ||
4281 | - * the header. For L2TPv3, the offset is negotiated using AVPs | ||
4282 | - * in the session setup control protocol. | ||
4283 | + /* Session data offset is defined only for L2TPv2 and is | ||
4284 | + * indicated by an optional 16-bit value in the header. | ||
4285 | */ | ||
4286 | if (tunnel->version == L2TP_HDR_VER_2) { | ||
4287 | /* If offset bit set, skip it. */ | ||
4288 | @@ -856,8 +854,7 @@ void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb, | ||
4289 | offset = ntohs(*(__be16 *)ptr); | ||
4290 | ptr += 2 + offset; | ||
4291 | } | ||
4292 | - } else | ||
4293 | - ptr += session->offset; | ||
4294 | + } | ||
4295 | |||
4296 | offset = ptr - optr; | ||
4297 | if (!pskb_may_pull(skb, offset)) | ||
4298 | @@ -1141,8 +1138,6 @@ static int l2tp_build_l2tpv3_header(struct l2tp_session *session, void *buf) | ||
4299 | } | ||
4300 | bufp += session->l2specific_len; | ||
4301 | } | ||
4302 | - if (session->offset) | ||
4303 | - bufp += session->offset; | ||
4304 | |||
4305 | return bufp - optr; | ||
4306 | } | ||
4307 | @@ -1827,7 +1822,7 @@ void l2tp_session_set_header_len(struct l2tp_session *session, int version) | ||
4308 | if (session->send_seq) | ||
4309 | session->hdr_len += 4; | ||
4310 | } else { | ||
4311 | - session->hdr_len = 4 + session->cookie_len + session->l2specific_len + session->offset; | ||
4312 | + session->hdr_len = 4 + session->cookie_len + session->l2specific_len; | ||
4313 | if (session->tunnel->encap == L2TP_ENCAPTYPE_UDP) | ||
4314 | session->hdr_len += 4; | ||
4315 | } | ||
4316 | @@ -1878,7 +1873,6 @@ struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunn | ||
4317 | session->recv_seq = cfg->recv_seq; | ||
4318 | session->lns_mode = cfg->lns_mode; | ||
4319 | session->reorder_timeout = cfg->reorder_timeout; | ||
4320 | - session->offset = cfg->offset; | ||
4321 | session->l2specific_type = cfg->l2specific_type; | ||
4322 | session->l2specific_len = cfg->l2specific_len; | ||
4323 | session->cookie_len = cfg->cookie_len; | ||
4324 | diff --git a/net/l2tp/l2tp_core.h b/net/l2tp/l2tp_core.h | ||
4325 | index 42419f1c24cf..86356a23a0a7 100644 | ||
4326 | --- a/net/l2tp/l2tp_core.h | ||
4327 | +++ b/net/l2tp/l2tp_core.h | ||
4328 | @@ -68,7 +68,6 @@ struct l2tp_session_cfg { | ||
4329 | int debug; /* bitmask of debug message | ||
4330 | * categories */ | ||
4331 | u16 vlan_id; /* VLAN pseudowire only */ | ||
4332 | - u16 offset; /* offset to payload */ | ||
4333 | u16 l2specific_len; /* Layer 2 specific length */ | ||
4334 | u16 l2specific_type; /* Layer 2 specific type */ | ||
4335 | u8 cookie[8]; /* optional cookie */ | ||
4336 | @@ -94,8 +93,6 @@ struct l2tp_session { | ||
4337 | int cookie_len; | ||
4338 | u8 peer_cookie[8]; | ||
4339 | int peer_cookie_len; | ||
4340 | - u16 offset; /* offset from end of L2TP header | ||
4341 | - to beginning of data */ | ||
4342 | u16 l2specific_len; | ||
4343 | u16 l2specific_type; | ||
4344 | u16 hdr_len; | ||
4345 | diff --git a/net/l2tp/l2tp_debugfs.c b/net/l2tp/l2tp_debugfs.c | ||
4346 | index d100aed3d06f..2d2a73280ec2 100644 | ||
4347 | --- a/net/l2tp/l2tp_debugfs.c | ||
4348 | +++ b/net/l2tp/l2tp_debugfs.c | ||
4349 | @@ -181,8 +181,8 @@ static void l2tp_dfs_seq_session_show(struct seq_file *m, void *v) | ||
4350 | session->lns_mode ? "LNS" : "LAC", | ||
4351 | session->debug, | ||
4352 | jiffies_to_msecs(session->reorder_timeout)); | ||
4353 | - seq_printf(m, " offset %hu l2specific %hu/%hu\n", | ||
4354 | - session->offset, session->l2specific_type, session->l2specific_len); | ||
4355 | + seq_printf(m, " offset 0 l2specific %hu/%hu\n", | ||
4356 | + session->l2specific_type, session->l2specific_len); | ||
4357 | if (session->cookie_len) { | ||
4358 | seq_printf(m, " cookie %02x%02x%02x%02x", | ||
4359 | session->cookie[0], session->cookie[1], | ||
4360 | diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c | ||
4361 | index ee03bc866d1b..d6fccfdca201 100644 | ||
4362 | --- a/net/l2tp/l2tp_netlink.c | ||
4363 | +++ b/net/l2tp/l2tp_netlink.c | ||
4364 | @@ -536,9 +536,6 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf | ||
4365 | } | ||
4366 | |||
4367 | if (tunnel->version > 2) { | ||
4368 | - if (info->attrs[L2TP_ATTR_OFFSET]) | ||
4369 | - cfg.offset = nla_get_u16(info->attrs[L2TP_ATTR_OFFSET]); | ||
4370 | - | ||
4371 | if (info->attrs[L2TP_ATTR_DATA_SEQ]) | ||
4372 | cfg.data_seq = nla_get_u8(info->attrs[L2TP_ATTR_DATA_SEQ]); | ||
4373 | |||
4374 | diff --git a/net/llc/llc_conn.c b/net/llc/llc_conn.c | ||
4375 | index 79c346fd859b..b9290a183a2f 100644 | ||
4376 | --- a/net/llc/llc_conn.c | ||
4377 | +++ b/net/llc/llc_conn.c | ||
4378 | @@ -734,6 +734,7 @@ void llc_sap_add_socket(struct llc_sap *sap, struct sock *sk) | ||
4379 | llc_sk(sk)->sap = sap; | ||
4380 | |||
4381 | spin_lock_bh(&sap->sk_lock); | ||
4382 | + sock_set_flag(sk, SOCK_RCU_FREE); | ||
4383 | sap->sk_count++; | ||
4384 | sk_nulls_add_node_rcu(sk, laddr_hb); | ||
4385 | hlist_add_head(&llc->dev_hash_node, dev_hb); | ||
4386 | diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c | ||
4387 | index 45319cc01121..80c45567ee3a 100644 | ||
4388 | --- a/net/mac80211/agg-tx.c | ||
4389 | +++ b/net/mac80211/agg-tx.c | ||
4390 | @@ -7,7 +7,7 @@ | ||
4391 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> | ||
4392 | * Copyright 2007, Michael Wu <flamingice@sourmilk.net> | ||
4393 | * Copyright 2007-2010, Intel Corporation | ||
4394 | - * Copyright(c) 2015 Intel Deutschland GmbH | ||
4395 | + * Copyright(c) 2015-2017 Intel Deutschland GmbH | ||
4396 | * | ||
4397 | * This program is free software; you can redistribute it and/or modify | ||
4398 | * it under the terms of the GNU General Public License version 2 as | ||
4399 | @@ -741,46 +741,43 @@ static void ieee80211_agg_tx_operational(struct ieee80211_local *local, | ||
4400 | ieee80211_agg_start_txq(sta, tid, true); | ||
4401 | } | ||
4402 | |||
4403 | -void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid) | ||
4404 | +void ieee80211_start_tx_ba_cb(struct sta_info *sta, int tid, | ||
4405 | + struct tid_ampdu_tx *tid_tx) | ||
4406 | { | ||
4407 | - struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | ||
4408 | + struct ieee80211_sub_if_data *sdata = sta->sdata; | ||
4409 | struct ieee80211_local *local = sdata->local; | ||
4410 | - struct sta_info *sta; | ||
4411 | - struct tid_ampdu_tx *tid_tx; | ||
4412 | |||
4413 | - trace_api_start_tx_ba_cb(sdata, ra, tid); | ||
4414 | + if (WARN_ON(test_and_set_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state))) | ||
4415 | + return; | ||
4416 | + | ||
4417 | + if (test_bit(HT_AGG_STATE_RESPONSE_RECEIVED, &tid_tx->state)) | ||
4418 | + ieee80211_agg_tx_operational(local, sta, tid); | ||
4419 | +} | ||
4420 | + | ||
4421 | +static struct tid_ampdu_tx * | ||
4422 | +ieee80211_lookup_tid_tx(struct ieee80211_sub_if_data *sdata, | ||
4423 | + const u8 *ra, u16 tid, struct sta_info **sta) | ||
4424 | +{ | ||
4425 | + struct tid_ampdu_tx *tid_tx; | ||
4426 | |||
4427 | if (tid >= IEEE80211_NUM_TIDS) { | ||
4428 | ht_dbg(sdata, "Bad TID value: tid = %d (>= %d)\n", | ||
4429 | tid, IEEE80211_NUM_TIDS); | ||
4430 | - return; | ||
4431 | + return NULL; | ||
4432 | } | ||
4433 | |||
4434 | - mutex_lock(&local->sta_mtx); | ||
4435 | - sta = sta_info_get_bss(sdata, ra); | ||
4436 | - if (!sta) { | ||
4437 | - mutex_unlock(&local->sta_mtx); | ||
4438 | + *sta = sta_info_get_bss(sdata, ra); | ||
4439 | + if (!*sta) { | ||
4440 | ht_dbg(sdata, "Could not find station: %pM\n", ra); | ||
4441 | - return; | ||
4442 | + return NULL; | ||
4443 | } | ||
4444 | |||
4445 | - mutex_lock(&sta->ampdu_mlme.mtx); | ||
4446 | - tid_tx = rcu_dereference_protected_tid_tx(sta, tid); | ||
4447 | + tid_tx = rcu_dereference((*sta)->ampdu_mlme.tid_tx[tid]); | ||
4448 | |||
4449 | - if (WARN_ON(!tid_tx)) { | ||
4450 | + if (WARN_ON(!tid_tx)) | ||
4451 | ht_dbg(sdata, "addBA was not requested!\n"); | ||
4452 | - goto unlock; | ||
4453 | - } | ||
4454 | |||
4455 | - if (WARN_ON(test_and_set_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state))) | ||
4456 | - goto unlock; | ||
4457 | - | ||
4458 | - if (test_bit(HT_AGG_STATE_RESPONSE_RECEIVED, &tid_tx->state)) | ||
4459 | - ieee80211_agg_tx_operational(local, sta, tid); | ||
4460 | - | ||
4461 | - unlock: | ||
4462 | - mutex_unlock(&sta->ampdu_mlme.mtx); | ||
4463 | - mutex_unlock(&local->sta_mtx); | ||
4464 | + return tid_tx; | ||
4465 | } | ||
4466 | |||
4467 | void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, | ||
4468 | @@ -788,19 +785,20 @@ void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, | ||
4469 | { | ||
4470 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | ||
4471 | struct ieee80211_local *local = sdata->local; | ||
4472 | - struct ieee80211_ra_tid *ra_tid; | ||
4473 | - struct sk_buff *skb = dev_alloc_skb(0); | ||
4474 | + struct sta_info *sta; | ||
4475 | + struct tid_ampdu_tx *tid_tx; | ||
4476 | |||
4477 | - if (unlikely(!skb)) | ||
4478 | - return; | ||
4479 | + trace_api_start_tx_ba_cb(sdata, ra, tid); | ||
4480 | |||
4481 | - ra_tid = (struct ieee80211_ra_tid *) &skb->cb; | ||
4482 | - memcpy(&ra_tid->ra, ra, ETH_ALEN); | ||
4483 | - ra_tid->tid = tid; | ||
4484 | + rcu_read_lock(); | ||
4485 | + tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); | ||
4486 | + if (!tid_tx) | ||
4487 | + goto out; | ||
4488 | |||
4489 | - skb->pkt_type = IEEE80211_SDATA_QUEUE_AGG_START; | ||
4490 | - skb_queue_tail(&sdata->skb_queue, skb); | ||
4491 | - ieee80211_queue_work(&local->hw, &sdata->work); | ||
4492 | + set_bit(HT_AGG_STATE_START_CB, &tid_tx->state); | ||
4493 | + ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); | ||
4494 | + out: | ||
4495 | + rcu_read_unlock(); | ||
4496 | } | ||
4497 | EXPORT_SYMBOL(ieee80211_start_tx_ba_cb_irqsafe); | ||
4498 | |||
4499 | @@ -860,37 +858,18 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid) | ||
4500 | } | ||
4501 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_session); | ||
4502 | |||
4503 | -void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid) | ||
4504 | +void ieee80211_stop_tx_ba_cb(struct sta_info *sta, int tid, | ||
4505 | + struct tid_ampdu_tx *tid_tx) | ||
4506 | { | ||
4507 | - struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | ||
4508 | - struct ieee80211_local *local = sdata->local; | ||
4509 | - struct sta_info *sta; | ||
4510 | - struct tid_ampdu_tx *tid_tx; | ||
4511 | + struct ieee80211_sub_if_data *sdata = sta->sdata; | ||
4512 | bool send_delba = false; | ||
4513 | |||
4514 | - trace_api_stop_tx_ba_cb(sdata, ra, tid); | ||
4515 | - | ||
4516 | - if (tid >= IEEE80211_NUM_TIDS) { | ||
4517 | - ht_dbg(sdata, "Bad TID value: tid = %d (>= %d)\n", | ||
4518 | - tid, IEEE80211_NUM_TIDS); | ||
4519 | - return; | ||
4520 | - } | ||
4521 | - | ||
4522 | - ht_dbg(sdata, "Stopping Tx BA session for %pM tid %d\n", ra, tid); | ||
4523 | - | ||
4524 | - mutex_lock(&local->sta_mtx); | ||
4525 | - | ||
4526 | - sta = sta_info_get_bss(sdata, ra); | ||
4527 | - if (!sta) { | ||
4528 | - ht_dbg(sdata, "Could not find station: %pM\n", ra); | ||
4529 | - goto unlock; | ||
4530 | - } | ||
4531 | + ht_dbg(sdata, "Stopping Tx BA session for %pM tid %d\n", | ||
4532 | + sta->sta.addr, tid); | ||
4533 | |||
4534 | - mutex_lock(&sta->ampdu_mlme.mtx); | ||
4535 | spin_lock_bh(&sta->lock); | ||
4536 | - tid_tx = rcu_dereference_protected_tid_tx(sta, tid); | ||
4537 | |||
4538 | - if (!tid_tx || !test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) { | ||
4539 | + if (!test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) { | ||
4540 | ht_dbg(sdata, | ||
4541 | "unexpected callback to A-MPDU stop for %pM tid %d\n", | ||
4542 | sta->sta.addr, tid); | ||
4543 | @@ -906,12 +885,8 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid) | ||
4544 | spin_unlock_bh(&sta->lock); | ||
4545 | |||
4546 | if (send_delba) | ||
4547 | - ieee80211_send_delba(sdata, ra, tid, | ||
4548 | + ieee80211_send_delba(sdata, sta->sta.addr, tid, | ||
4549 | WLAN_BACK_INITIATOR, WLAN_REASON_QSTA_NOT_USE); | ||
4550 | - | ||
4551 | - mutex_unlock(&sta->ampdu_mlme.mtx); | ||
4552 | - unlock: | ||
4553 | - mutex_unlock(&local->sta_mtx); | ||
4554 | } | ||
4555 | |||
4556 | void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, | ||
4557 | @@ -919,19 +894,20 @@ void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, | ||
4558 | { | ||
4559 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | ||
4560 | struct ieee80211_local *local = sdata->local; | ||
4561 | - struct ieee80211_ra_tid *ra_tid; | ||
4562 | - struct sk_buff *skb = dev_alloc_skb(0); | ||
4563 | + struct sta_info *sta; | ||
4564 | + struct tid_ampdu_tx *tid_tx; | ||
4565 | |||
4566 | - if (unlikely(!skb)) | ||
4567 | - return; | ||
4568 | + trace_api_stop_tx_ba_cb(sdata, ra, tid); | ||
4569 | |||
4570 | - ra_tid = (struct ieee80211_ra_tid *) &skb->cb; | ||
4571 | - memcpy(&ra_tid->ra, ra, ETH_ALEN); | ||
4572 | - ra_tid->tid = tid; | ||
4573 | + rcu_read_lock(); | ||
4574 | + tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); | ||
4575 | + if (!tid_tx) | ||
4576 | + goto out; | ||
4577 | |||
4578 | - skb->pkt_type = IEEE80211_SDATA_QUEUE_AGG_STOP; | ||
4579 | - skb_queue_tail(&sdata->skb_queue, skb); | ||
4580 | - ieee80211_queue_work(&local->hw, &sdata->work); | ||
4581 | + set_bit(HT_AGG_STATE_STOP_CB, &tid_tx->state); | ||
4582 | + ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); | ||
4583 | + out: | ||
4584 | + rcu_read_unlock(); | ||
4585 | } | ||
4586 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_cb_irqsafe); | ||
4587 | |||
4588 | diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c | ||
4589 | index f4a528773563..6ca5442b1e03 100644 | ||
4590 | --- a/net/mac80211/ht.c | ||
4591 | +++ b/net/mac80211/ht.c | ||
4592 | @@ -7,6 +7,7 @@ | ||
4593 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> | ||
4594 | * Copyright 2007, Michael Wu <flamingice@sourmilk.net> | ||
4595 | * Copyright 2007-2010, Intel Corporation | ||
4596 | + * Copyright 2017 Intel Deutschland GmbH | ||
4597 | * | ||
4598 | * This program is free software; you can redistribute it and/or modify | ||
4599 | * it under the terms of the GNU General Public License version 2 as | ||
4600 | @@ -289,8 +290,6 @@ void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta, | ||
4601 | { | ||
4602 | int i; | ||
4603 | |||
4604 | - cancel_work_sync(&sta->ampdu_mlme.work); | ||
4605 | - | ||
4606 | for (i = 0; i < IEEE80211_NUM_TIDS; i++) { | ||
4607 | __ieee80211_stop_tx_ba_session(sta, i, reason); | ||
4608 | __ieee80211_stop_rx_ba_session(sta, i, WLAN_BACK_RECIPIENT, | ||
4609 | @@ -298,6 +297,9 @@ void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta, | ||
4610 | reason != AGG_STOP_DESTROY_STA && | ||
4611 | reason != AGG_STOP_PEER_REQUEST); | ||
4612 | } | ||
4613 | + | ||
4614 | + /* stopping might queue the work again - so cancel only afterwards */ | ||
4615 | + cancel_work_sync(&sta->ampdu_mlme.work); | ||
4616 | } | ||
4617 | |||
4618 | void ieee80211_ba_session_work(struct work_struct *work) | ||
4619 | @@ -352,10 +354,16 @@ void ieee80211_ba_session_work(struct work_struct *work) | ||
4620 | spin_unlock_bh(&sta->lock); | ||
4621 | |||
4622 | tid_tx = rcu_dereference_protected_tid_tx(sta, tid); | ||
4623 | - if (tid_tx && test_and_clear_bit(HT_AGG_STATE_WANT_STOP, | ||
4624 | - &tid_tx->state)) | ||
4625 | + if (!tid_tx) | ||
4626 | + continue; | ||
4627 | + | ||
4628 | + if (test_and_clear_bit(HT_AGG_STATE_START_CB, &tid_tx->state)) | ||
4629 | + ieee80211_start_tx_ba_cb(sta, tid, tid_tx); | ||
4630 | + if (test_and_clear_bit(HT_AGG_STATE_WANT_STOP, &tid_tx->state)) | ||
4631 | ___ieee80211_stop_tx_ba_session(sta, tid, | ||
4632 | AGG_STOP_LOCAL_REQUEST); | ||
4633 | + if (test_and_clear_bit(HT_AGG_STATE_STOP_CB, &tid_tx->state)) | ||
4634 | + ieee80211_stop_tx_ba_cb(sta, tid, tid_tx); | ||
4635 | } | ||
4636 | mutex_unlock(&sta->ampdu_mlme.mtx); | ||
4637 | } | ||
4638 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h | ||
4639 | index 7fd544d970d9..8a690ebd7374 100644 | ||
4640 | --- a/net/mac80211/ieee80211_i.h | ||
4641 | +++ b/net/mac80211/ieee80211_i.h | ||
4642 | @@ -1026,8 +1026,6 @@ struct ieee80211_rx_agg { | ||
4643 | |||
4644 | enum sdata_queue_type { | ||
4645 | IEEE80211_SDATA_QUEUE_TYPE_FRAME = 0, | ||
4646 | - IEEE80211_SDATA_QUEUE_AGG_START = 1, | ||
4647 | - IEEE80211_SDATA_QUEUE_AGG_STOP = 2, | ||
4648 | IEEE80211_SDATA_QUEUE_RX_AGG_START = 3, | ||
4649 | IEEE80211_SDATA_QUEUE_RX_AGG_STOP = 4, | ||
4650 | }; | ||
4651 | @@ -1416,12 +1414,6 @@ ieee80211_get_sband(struct ieee80211_sub_if_data *sdata) | ||
4652 | return local->hw.wiphy->bands[band]; | ||
4653 | } | ||
4654 | |||
4655 | -/* this struct represents 802.11n's RA/TID combination */ | ||
4656 | -struct ieee80211_ra_tid { | ||
4657 | - u8 ra[ETH_ALEN]; | ||
4658 | - u16 tid; | ||
4659 | -}; | ||
4660 | - | ||
4661 | /* this struct holds the value parsing from channel switch IE */ | ||
4662 | struct ieee80211_csa_ie { | ||
4663 | struct cfg80211_chan_def chandef; | ||
4664 | @@ -1765,8 +1757,10 @@ int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
4665 | enum ieee80211_agg_stop_reason reason); | ||
4666 | int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
4667 | enum ieee80211_agg_stop_reason reason); | ||
4668 | -void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid); | ||
4669 | -void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid); | ||
4670 | +void ieee80211_start_tx_ba_cb(struct sta_info *sta, int tid, | ||
4671 | + struct tid_ampdu_tx *tid_tx); | ||
4672 | +void ieee80211_stop_tx_ba_cb(struct sta_info *sta, int tid, | ||
4673 | + struct tid_ampdu_tx *tid_tx); | ||
4674 | void ieee80211_ba_session_work(struct work_struct *work); | ||
4675 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid); | ||
4676 | void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid); | ||
4677 | diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c | ||
4678 | index fa7d757fef95..760ba8ec2944 100644 | ||
4679 | --- a/net/mac80211/iface.c | ||
4680 | +++ b/net/mac80211/iface.c | ||
4681 | @@ -1248,7 +1248,6 @@ static void ieee80211_iface_work(struct work_struct *work) | ||
4682 | struct ieee80211_local *local = sdata->local; | ||
4683 | struct sk_buff *skb; | ||
4684 | struct sta_info *sta; | ||
4685 | - struct ieee80211_ra_tid *ra_tid; | ||
4686 | struct ieee80211_rx_agg *rx_agg; | ||
4687 | |||
4688 | if (!ieee80211_sdata_running(sdata)) | ||
4689 | @@ -1264,15 +1263,7 @@ static void ieee80211_iface_work(struct work_struct *work) | ||
4690 | while ((skb = skb_dequeue(&sdata->skb_queue))) { | ||
4691 | struct ieee80211_mgmt *mgmt = (void *)skb->data; | ||
4692 | |||
4693 | - if (skb->pkt_type == IEEE80211_SDATA_QUEUE_AGG_START) { | ||
4694 | - ra_tid = (void *)&skb->cb; | ||
4695 | - ieee80211_start_tx_ba_cb(&sdata->vif, ra_tid->ra, | ||
4696 | - ra_tid->tid); | ||
4697 | - } else if (skb->pkt_type == IEEE80211_SDATA_QUEUE_AGG_STOP) { | ||
4698 | - ra_tid = (void *)&skb->cb; | ||
4699 | - ieee80211_stop_tx_ba_cb(&sdata->vif, ra_tid->ra, | ||
4700 | - ra_tid->tid); | ||
4701 | - } else if (skb->pkt_type == IEEE80211_SDATA_QUEUE_RX_AGG_START) { | ||
4702 | + if (skb->pkt_type == IEEE80211_SDATA_QUEUE_RX_AGG_START) { | ||
4703 | rx_agg = (void *)&skb->cb; | ||
4704 | mutex_lock(&local->sta_mtx); | ||
4705 | sta = sta_info_get_bss(sdata, rx_agg->addr); | ||
4706 | diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h | ||
4707 | index 15599c70a38f..cc808ac783e5 100644 | ||
4708 | --- a/net/mac80211/sta_info.h | ||
4709 | +++ b/net/mac80211/sta_info.h | ||
4710 | @@ -115,6 +115,8 @@ enum ieee80211_sta_info_flags { | ||
4711 | #define HT_AGG_STATE_STOPPING 3 | ||
4712 | #define HT_AGG_STATE_WANT_START 4 | ||
4713 | #define HT_AGG_STATE_WANT_STOP 5 | ||
4714 | +#define HT_AGG_STATE_START_CB 6 | ||
4715 | +#define HT_AGG_STATE_STOP_CB 7 | ||
4716 | |||
4717 | enum ieee80211_agg_stop_reason { | ||
4718 | AGG_STOP_DECLINED, | ||
4719 | diff --git a/net/mac80211/status.c b/net/mac80211/status.c | ||
4720 | index 72fe9bc7a1f9..7892bac21eac 100644 | ||
4721 | --- a/net/mac80211/status.c | ||
4722 | +++ b/net/mac80211/status.c | ||
4723 | @@ -472,11 +472,6 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local, | ||
4724 | if (!skb) | ||
4725 | return; | ||
4726 | |||
4727 | - if (dropped) { | ||
4728 | - dev_kfree_skb_any(skb); | ||
4729 | - return; | ||
4730 | - } | ||
4731 | - | ||
4732 | if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) { | ||
4733 | u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie; | ||
4734 | struct ieee80211_sub_if_data *sdata; | ||
4735 | @@ -497,6 +492,8 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local, | ||
4736 | } | ||
4737 | rcu_read_unlock(); | ||
4738 | |||
4739 | + dev_kfree_skb_any(skb); | ||
4740 | + } else if (dropped) { | ||
4741 | dev_kfree_skb_any(skb); | ||
4742 | } else { | ||
4743 | /* consumes skb */ | ||
4744 | diff --git a/net/mac80211/tdls.c b/net/mac80211/tdls.c | ||
4745 | index f20dcf1b1830..c64ae68ae4f8 100644 | ||
4746 | --- a/net/mac80211/tdls.c | ||
4747 | +++ b/net/mac80211/tdls.c | ||
4748 | @@ -16,6 +16,7 @@ | ||
4749 | #include "ieee80211_i.h" | ||
4750 | #include "driver-ops.h" | ||
4751 | #include "rate.h" | ||
4752 | +#include "wme.h" | ||
4753 | |||
4754 | /* give usermode some time for retries in setting up the TDLS session */ | ||
4755 | #define TDLS_PEER_SETUP_TIMEOUT (15 * HZ) | ||
4756 | @@ -1019,14 +1020,13 @@ ieee80211_tdls_prep_mgmt_packet(struct wiphy *wiphy, struct net_device *dev, | ||
4757 | switch (action_code) { | ||
4758 | case WLAN_TDLS_SETUP_REQUEST: | ||
4759 | case WLAN_TDLS_SETUP_RESPONSE: | ||
4760 | - skb_set_queue_mapping(skb, IEEE80211_AC_BK); | ||
4761 | - skb->priority = 2; | ||
4762 | + skb->priority = 256 + 2; | ||
4763 | break; | ||
4764 | default: | ||
4765 | - skb_set_queue_mapping(skb, IEEE80211_AC_VI); | ||
4766 | - skb->priority = 5; | ||
4767 | + skb->priority = 256 + 5; | ||
4768 | break; | ||
4769 | } | ||
4770 | + skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb)); | ||
4771 | |||
4772 | /* | ||
4773 | * Set the WLAN_TDLS_TEARDOWN flag to indicate a teardown in progress. | ||
4774 | diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c | ||
4775 | index 84582998f65f..58fba4e569e6 100644 | ||
4776 | --- a/net/mac80211/tx.c | ||
4777 | +++ b/net/mac80211/tx.c | ||
4778 | @@ -1833,7 +1833,7 @@ static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata, | ||
4779 | sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; | ||
4780 | |||
4781 | if (invoke_tx_handlers_early(&tx)) | ||
4782 | - return false; | ||
4783 | + return true; | ||
4784 | |||
4785 | if (ieee80211_queue_skb(local, sdata, tx.sta, tx.skb)) | ||
4786 | return true; | ||
4787 | diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c | ||
4788 | index 169156cfd4c8..96e61eab19bc 100644 | ||
4789 | --- a/net/rds/ib_cm.c | ||
4790 | +++ b/net/rds/ib_cm.c | ||
4791 | @@ -505,7 +505,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn) | ||
4792 | rdsdebug("conn %p pd %p cq %p %p\n", conn, ic->i_pd, | ||
4793 | ic->i_send_cq, ic->i_recv_cq); | ||
4794 | |||
4795 | - return ret; | ||
4796 | + goto out; | ||
4797 | |||
4798 | sends_out: | ||
4799 | vfree(ic->i_sends); | ||
4800 | @@ -530,6 +530,7 @@ send_cq_out: | ||
4801 | ic->i_send_cq = NULL; | ||
4802 | rds_ibdev_out: | ||
4803 | rds_ib_remove_conn(rds_ibdev, conn); | ||
4804 | +out: | ||
4805 | rds_ib_dev_put(rds_ibdev); | ||
4806 | |||
4807 | return ret; | ||
4808 | diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c | ||
4809 | index f3ac85a285a2..a4380e182e6c 100644 | ||
4810 | --- a/net/rxrpc/input.c | ||
4811 | +++ b/net/rxrpc/input.c | ||
4812 | @@ -216,10 +216,11 @@ static void rxrpc_send_ping(struct rxrpc_call *call, struct sk_buff *skb, | ||
4813 | /* | ||
4814 | * Apply a hard ACK by advancing the Tx window. | ||
4815 | */ | ||
4816 | -static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, | ||
4817 | +static bool rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, | ||
4818 | struct rxrpc_ack_summary *summary) | ||
4819 | { | ||
4820 | struct sk_buff *skb, *list = NULL; | ||
4821 | + bool rot_last = false; | ||
4822 | int ix; | ||
4823 | u8 annotation; | ||
4824 | |||
4825 | @@ -243,15 +244,17 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, | ||
4826 | skb->next = list; | ||
4827 | list = skb; | ||
4828 | |||
4829 | - if (annotation & RXRPC_TX_ANNO_LAST) | ||
4830 | + if (annotation & RXRPC_TX_ANNO_LAST) { | ||
4831 | set_bit(RXRPC_CALL_TX_LAST, &call->flags); | ||
4832 | + rot_last = true; | ||
4833 | + } | ||
4834 | if ((annotation & RXRPC_TX_ANNO_MASK) != RXRPC_TX_ANNO_ACK) | ||
4835 | summary->nr_rot_new_acks++; | ||
4836 | } | ||
4837 | |||
4838 | spin_unlock(&call->lock); | ||
4839 | |||
4840 | - trace_rxrpc_transmit(call, (test_bit(RXRPC_CALL_TX_LAST, &call->flags) ? | ||
4841 | + trace_rxrpc_transmit(call, (rot_last ? | ||
4842 | rxrpc_transmit_rotate_last : | ||
4843 | rxrpc_transmit_rotate)); | ||
4844 | wake_up(&call->waitq); | ||
4845 | @@ -262,6 +265,8 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, | ||
4846 | skb->next = NULL; | ||
4847 | rxrpc_free_skb(skb, rxrpc_skb_tx_freed); | ||
4848 | } | ||
4849 | + | ||
4850 | + return rot_last; | ||
4851 | } | ||
4852 | |||
4853 | /* | ||
4854 | @@ -332,11 +337,11 @@ static bool rxrpc_receiving_reply(struct rxrpc_call *call) | ||
4855 | ktime_get_real()); | ||
4856 | } | ||
4857 | |||
4858 | - if (!test_bit(RXRPC_CALL_TX_LAST, &call->flags)) | ||
4859 | - rxrpc_rotate_tx_window(call, top, &summary); | ||
4860 | if (!test_bit(RXRPC_CALL_TX_LAST, &call->flags)) { | ||
4861 | - rxrpc_proto_abort("TXL", call, top); | ||
4862 | - return false; | ||
4863 | + if (!rxrpc_rotate_tx_window(call, top, &summary)) { | ||
4864 | + rxrpc_proto_abort("TXL", call, top); | ||
4865 | + return false; | ||
4866 | + } | ||
4867 | } | ||
4868 | if (!rxrpc_end_tx_phase(call, true, "ETD")) | ||
4869 | return false; | ||
4870 | @@ -803,6 +808,16 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, | ||
4871 | rxrpc_propose_ack_respond_to_ack); | ||
4872 | } | ||
4873 | |||
4874 | + /* Discard any out-of-order or duplicate ACKs. */ | ||
4875 | + if (before_eq(sp->hdr.serial, call->acks_latest)) { | ||
4876 | + _debug("discard ACK %d <= %d", | ||
4877 | + sp->hdr.serial, call->acks_latest); | ||
4878 | + return; | ||
4879 | + } | ||
4880 | + call->acks_latest_ts = skb->tstamp; | ||
4881 | + call->acks_latest = sp->hdr.serial; | ||
4882 | + | ||
4883 | + /* Parse rwind and mtu sizes if provided. */ | ||
4884 | ioffset = offset + nr_acks + 3; | ||
4885 | if (skb->len >= ioffset + sizeof(buf.info)) { | ||
4886 | if (skb_copy_bits(skb, ioffset, &buf.info, sizeof(buf.info)) < 0) | ||
4887 | @@ -824,23 +839,18 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, | ||
4888 | return; | ||
4889 | } | ||
4890 | |||
4891 | - /* Discard any out-of-order or duplicate ACKs. */ | ||
4892 | - if (before_eq(sp->hdr.serial, call->acks_latest)) { | ||
4893 | - _debug("discard ACK %d <= %d", | ||
4894 | - sp->hdr.serial, call->acks_latest); | ||
4895 | - return; | ||
4896 | - } | ||
4897 | - call->acks_latest_ts = skb->tstamp; | ||
4898 | - call->acks_latest = sp->hdr.serial; | ||
4899 | - | ||
4900 | if (before(hard_ack, call->tx_hard_ack) || | ||
4901 | after(hard_ack, call->tx_top)) | ||
4902 | return rxrpc_proto_abort("AKW", call, 0); | ||
4903 | if (nr_acks > call->tx_top - hard_ack) | ||
4904 | return rxrpc_proto_abort("AKN", call, 0); | ||
4905 | |||
4906 | - if (after(hard_ack, call->tx_hard_ack)) | ||
4907 | - rxrpc_rotate_tx_window(call, hard_ack, &summary); | ||
4908 | + if (after(hard_ack, call->tx_hard_ack)) { | ||
4909 | + if (rxrpc_rotate_tx_window(call, hard_ack, &summary)) { | ||
4910 | + rxrpc_end_tx_phase(call, false, "ETA"); | ||
4911 | + return; | ||
4912 | + } | ||
4913 | + } | ||
4914 | |||
4915 | if (nr_acks > 0) { | ||
4916 | if (skb_copy_bits(skb, offset, buf.acks, nr_acks) < 0) | ||
4917 | @@ -849,11 +859,6 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, | ||
4918 | &summary); | ||
4919 | } | ||
4920 | |||
4921 | - if (test_bit(RXRPC_CALL_TX_LAST, &call->flags)) { | ||
4922 | - rxrpc_end_tx_phase(call, false, "ETA"); | ||
4923 | - return; | ||
4924 | - } | ||
4925 | - | ||
4926 | if (call->rxtx_annotations[call->tx_top & RXRPC_RXTX_BUFF_MASK] & | ||
4927 | RXRPC_TX_ANNO_LAST && | ||
4928 | summary.nr_acks == call->tx_top - hard_ack && | ||
4929 | @@ -875,8 +880,7 @@ static void rxrpc_input_ackall(struct rxrpc_call *call, struct sk_buff *skb) | ||
4930 | |||
4931 | _proto("Rx ACKALL %%%u", sp->hdr.serial); | ||
4932 | |||
4933 | - rxrpc_rotate_tx_window(call, call->tx_top, &summary); | ||
4934 | - if (test_bit(RXRPC_CALL_TX_LAST, &call->flags)) | ||
4935 | + if (rxrpc_rotate_tx_window(call, call->tx_top, &summary)) | ||
4936 | rxrpc_end_tx_phase(call, false, "ETL"); | ||
4937 | } | ||
4938 | |||
4939 | diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c | ||
4940 | index 44941e25f3ad..729c0e4eca21 100644 | ||
4941 | --- a/net/sched/sch_gred.c | ||
4942 | +++ b/net/sched/sch_gred.c | ||
4943 | @@ -411,7 +411,7 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt) | ||
4944 | if (tb[TCA_GRED_PARMS] == NULL && tb[TCA_GRED_STAB] == NULL) { | ||
4945 | if (tb[TCA_GRED_LIMIT] != NULL) | ||
4946 | sch->limit = nla_get_u32(tb[TCA_GRED_LIMIT]); | ||
4947 | - return gred_change_table_def(sch, opt); | ||
4948 | + return gred_change_table_def(sch, tb[TCA_GRED_DPS]); | ||
4949 | } | ||
4950 | |||
4951 | if (tb[TCA_GRED_PARMS] == NULL || | ||
4952 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c | ||
4953 | index 64d2d9ea2f8c..9827ba4b9f74 100644 | ||
4954 | --- a/net/sctp/socket.c | ||
4955 | +++ b/net/sctp/socket.c | ||
4956 | @@ -185,13 +185,13 @@ static void sctp_for_each_tx_datachunk(struct sctp_association *asoc, | ||
4957 | list_for_each_entry(chunk, &t->transmitted, transmitted_list) | ||
4958 | cb(chunk); | ||
4959 | |||
4960 | - list_for_each_entry(chunk, &q->retransmit, list) | ||
4961 | + list_for_each_entry(chunk, &q->retransmit, transmitted_list) | ||
4962 | cb(chunk); | ||
4963 | |||
4964 | - list_for_each_entry(chunk, &q->sacked, list) | ||
4965 | + list_for_each_entry(chunk, &q->sacked, transmitted_list) | ||
4966 | cb(chunk); | ||
4967 | |||
4968 | - list_for_each_entry(chunk, &q->abandoned, list) | ||
4969 | + list_for_each_entry(chunk, &q->abandoned, transmitted_list) | ||
4970 | cb(chunk); | ||
4971 | |||
4972 | list_for_each_entry(chunk, &q->out_chunk_list, list) | ||
4973 | @@ -248,11 +248,10 @@ struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id) | ||
4974 | |||
4975 | spin_lock_bh(&sctp_assocs_id_lock); | ||
4976 | asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id); | ||
4977 | + if (asoc && (asoc->base.sk != sk || asoc->base.dead)) | ||
4978 | + asoc = NULL; | ||
4979 | spin_unlock_bh(&sctp_assocs_id_lock); | ||
4980 | |||
4981 | - if (!asoc || (asoc->base.sk != sk) || asoc->base.dead) | ||
4982 | - return NULL; | ||
4983 | - | ||
4984 | return asoc; | ||
4985 | } | ||
4986 | |||
4987 | diff --git a/net/socket.c b/net/socket.c | ||
4988 | index 35fa349ba274..d9e2989c10c4 100644 | ||
4989 | --- a/net/socket.c | ||
4990 | +++ b/net/socket.c | ||
4991 | @@ -2774,9 +2774,14 @@ static int ethtool_ioctl(struct net *net, struct compat_ifreq __user *ifr32) | ||
4992 | copy_in_user(&rxnfc->fs.ring_cookie, | ||
4993 | &compat_rxnfc->fs.ring_cookie, | ||
4994 | (void __user *)(&rxnfc->fs.location + 1) - | ||
4995 | - (void __user *)&rxnfc->fs.ring_cookie) || | ||
4996 | - copy_in_user(&rxnfc->rule_cnt, &compat_rxnfc->rule_cnt, | ||
4997 | - sizeof(rxnfc->rule_cnt))) | ||
4998 | + (void __user *)&rxnfc->fs.ring_cookie)) | ||
4999 | + return -EFAULT; | ||
5000 | + if (ethcmd == ETHTOOL_GRXCLSRLALL) { | ||
5001 | + if (put_user(rule_cnt, &rxnfc->rule_cnt)) | ||
5002 | + return -EFAULT; | ||
5003 | + } else if (copy_in_user(&rxnfc->rule_cnt, | ||
5004 | + &compat_rxnfc->rule_cnt, | ||
5005 | + sizeof(rxnfc->rule_cnt))) | ||
5006 | return -EFAULT; | ||
5007 | } | ||
5008 | |||
5009 | diff --git a/net/tipc/socket.c b/net/tipc/socket.c | ||
5010 | index 25bc5c30d7fb..9d3f047305ce 100644 | ||
5011 | --- a/net/tipc/socket.c | ||
5012 | +++ b/net/tipc/socket.c | ||
5013 | @@ -2277,8 +2277,8 @@ void tipc_sk_reinit(struct net *net) | ||
5014 | |||
5015 | do { | ||
5016 | tsk = ERR_PTR(rhashtable_walk_start(&iter)); | ||
5017 | - if (tsk) | ||
5018 | - continue; | ||
5019 | + if (IS_ERR(tsk)) | ||
5020 | + goto walk_stop; | ||
5021 | |||
5022 | while ((tsk = rhashtable_walk_next(&iter)) && !IS_ERR(tsk)) { | ||
5023 | spin_lock_bh(&tsk->sk.sk_lock.slock); | ||
5024 | @@ -2287,7 +2287,7 @@ void tipc_sk_reinit(struct net *net) | ||
5025 | msg_set_orignode(msg, tn->own_addr); | ||
5026 | spin_unlock_bh(&tsk->sk.sk_lock.slock); | ||
5027 | } | ||
5028 | - | ||
5029 | +walk_stop: | ||
5030 | rhashtable_walk_stop(&iter); | ||
5031 | } while (tsk == ERR_PTR(-EAGAIN)); | ||
5032 | } | ||
5033 | diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c | ||
5034 | index 271cd66e4b3b..c2646446e157 100644 | ||
5035 | --- a/net/tipc/subscr.c | ||
5036 | +++ b/net/tipc/subscr.c | ||
5037 | @@ -256,7 +256,9 @@ static void tipc_subscrp_delete(struct tipc_subscription *sub) | ||
5038 | static void tipc_subscrp_cancel(struct tipc_subscr *s, | ||
5039 | struct tipc_subscriber *subscriber) | ||
5040 | { | ||
5041 | + tipc_subscrb_get(subscriber); | ||
5042 | tipc_subscrb_subscrp_delete(subscriber, s); | ||
5043 | + tipc_subscrb_put(subscriber); | ||
5044 | } | ||
5045 | |||
5046 | static struct tipc_subscription *tipc_subscrp_create(struct net *net, | ||
5047 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c | ||
5048 | index 0e91ec49d3da..549d0a4083b3 100644 | ||
5049 | --- a/net/wireless/nl80211.c | ||
5050 | +++ b/net/wireless/nl80211.c | ||
5051 | @@ -3422,6 +3422,7 @@ static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband, | ||
5052 | return false; | ||
5053 | |||
5054 | /* check availability */ | ||
5055 | + ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN); | ||
5056 | if (sband->ht_cap.mcs.rx_mask[ridx] & rbit) | ||
5057 | mcs[ridx] |= rbit; | ||
5058 | else | ||
5059 | diff --git a/net/wireless/reg.c b/net/wireless/reg.c | ||
5060 | index 5dbac3749738..36d1d25082e3 100644 | ||
5061 | --- a/net/wireless/reg.c | ||
5062 | +++ b/net/wireless/reg.c | ||
5063 | @@ -2298,6 +2298,7 @@ static int regulatory_hint_core(const char *alpha2) | ||
5064 | request->alpha2[0] = alpha2[0]; | ||
5065 | request->alpha2[1] = alpha2[1]; | ||
5066 | request->initiator = NL80211_REGDOM_SET_BY_CORE; | ||
5067 | + request->wiphy_idx = WIPHY_IDX_INVALID; | ||
5068 | |||
5069 | queue_regulatory_request(request); | ||
5070 | |||
5071 | diff --git a/net/wireless/scan.c b/net/wireless/scan.c | ||
5072 | index 35ad69fd0838..435f904c1be5 100644 | ||
5073 | --- a/net/wireless/scan.c | ||
5074 | +++ b/net/wireless/scan.c | ||
5075 | @@ -978,13 +978,23 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev, | ||
5076 | return NULL; | ||
5077 | } | ||
5078 | |||
5079 | +/* | ||
5080 | + * Update RX channel information based on the available frame payload | ||
5081 | + * information. This is mainly for the 2.4 GHz band where frames can be received | ||
5082 | + * from neighboring channels and the Beacon frames use the DSSS Parameter Set | ||
5083 | + * element to indicate the current (transmitting) channel, but this might also | ||
5084 | + * be needed on other bands if RX frequency does not match with the actual | ||
5085 | + * operating channel of a BSS. | ||
5086 | + */ | ||
5087 | static struct ieee80211_channel * | ||
5088 | cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen, | ||
5089 | - struct ieee80211_channel *channel) | ||
5090 | + struct ieee80211_channel *channel, | ||
5091 | + enum nl80211_bss_scan_width scan_width) | ||
5092 | { | ||
5093 | const u8 *tmp; | ||
5094 | u32 freq; | ||
5095 | int channel_number = -1; | ||
5096 | + struct ieee80211_channel *alt_channel; | ||
5097 | |||
5098 | tmp = cfg80211_find_ie(WLAN_EID_DS_PARAMS, ie, ielen); | ||
5099 | if (tmp && tmp[1] == 1) { | ||
5100 | @@ -998,16 +1008,45 @@ cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen, | ||
5101 | } | ||
5102 | } | ||
5103 | |||
5104 | - if (channel_number < 0) | ||
5105 | + if (channel_number < 0) { | ||
5106 | + /* No channel information in frame payload */ | ||
5107 | return channel; | ||
5108 | + } | ||
5109 | |||
5110 | freq = ieee80211_channel_to_frequency(channel_number, channel->band); | ||
5111 | - channel = ieee80211_get_channel(wiphy, freq); | ||
5112 | - if (!channel) | ||
5113 | - return NULL; | ||
5114 | - if (channel->flags & IEEE80211_CHAN_DISABLED) | ||
5115 | + alt_channel = ieee80211_get_channel(wiphy, freq); | ||
5116 | + if (!alt_channel) { | ||
5117 | + if (channel->band == NL80211_BAND_2GHZ) { | ||
5118 | + /* | ||
5119 | + * Better not allow unexpected channels when that could | ||
5120 | + * be going beyond the 1-11 range (e.g., discovering | ||
5121 | + * BSS on channel 12 when radio is configured for | ||
5122 | + * channel 11. | ||
5123 | + */ | ||
5124 | + return NULL; | ||
5125 | + } | ||
5126 | + | ||
5127 | + /* No match for the payload channel number - ignore it */ | ||
5128 | + return channel; | ||
5129 | + } | ||
5130 | + | ||
5131 | + if (scan_width == NL80211_BSS_CHAN_WIDTH_10 || | ||
5132 | + scan_width == NL80211_BSS_CHAN_WIDTH_5) { | ||
5133 | + /* | ||
5134 | + * Ignore channel number in 5 and 10 MHz channels where there | ||
5135 | + * may not be an n:1 or 1:n mapping between frequencies and | ||
5136 | + * channel numbers. | ||
5137 | + */ | ||
5138 | + return channel; | ||
5139 | + } | ||
5140 | + | ||
5141 | + /* | ||
5142 | + * Use the channel determined through the payload channel number | ||
5143 | + * instead of the RX channel reported by the driver. | ||
5144 | + */ | ||
5145 | + if (alt_channel->flags & IEEE80211_CHAN_DISABLED) | ||
5146 | return NULL; | ||
5147 | - return channel; | ||
5148 | + return alt_channel; | ||
5149 | } | ||
5150 | |||
5151 | /* Returned bss is reference counted and must be cleaned up appropriately. */ | ||
5152 | @@ -1032,7 +1071,8 @@ cfg80211_inform_bss_data(struct wiphy *wiphy, | ||
5153 | (data->signal < 0 || data->signal > 100))) | ||
5154 | return NULL; | ||
5155 | |||
5156 | - channel = cfg80211_get_bss_channel(wiphy, ie, ielen, data->chan); | ||
5157 | + channel = cfg80211_get_bss_channel(wiphy, ie, ielen, data->chan, | ||
5158 | + data->scan_width); | ||
5159 | if (!channel) | ||
5160 | return NULL; | ||
5161 | |||
5162 | @@ -1130,7 +1170,7 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy, | ||
5163 | return NULL; | ||
5164 | |||
5165 | channel = cfg80211_get_bss_channel(wiphy, mgmt->u.beacon.variable, | ||
5166 | - ielen, data->chan); | ||
5167 | + ielen, data->chan, data->scan_width); | ||
5168 | if (!channel) | ||
5169 | return NULL; | ||
5170 | |||
5171 | diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c | ||
5172 | index 6e768093d7c8..026770884d46 100644 | ||
5173 | --- a/net/xfrm/xfrm_user.c | ||
5174 | +++ b/net/xfrm/xfrm_user.c | ||
5175 | @@ -151,10 +151,16 @@ static int verify_newsa_info(struct xfrm_usersa_info *p, | ||
5176 | err = -EINVAL; | ||
5177 | switch (p->family) { | ||
5178 | case AF_INET: | ||
5179 | + if (p->sel.prefixlen_d > 32 || p->sel.prefixlen_s > 32) | ||
5180 | + goto out; | ||
5181 | + | ||
5182 | break; | ||
5183 | |||
5184 | case AF_INET6: | ||
5185 | #if IS_ENABLED(CONFIG_IPV6) | ||
5186 | + if (p->sel.prefixlen_d > 128 || p->sel.prefixlen_s > 128) | ||
5187 | + goto out; | ||
5188 | + | ||
5189 | break; | ||
5190 | #else | ||
5191 | err = -EAFNOSUPPORT; | ||
5192 | @@ -1316,10 +1322,16 @@ static int verify_newpolicy_info(struct xfrm_userpolicy_info *p) | ||
5193 | |||
5194 | switch (p->sel.family) { | ||
5195 | case AF_INET: | ||
5196 | + if (p->sel.prefixlen_d > 32 || p->sel.prefixlen_s > 32) | ||
5197 | + return -EINVAL; | ||
5198 | + | ||
5199 | break; | ||
5200 | |||
5201 | case AF_INET6: | ||
5202 | #if IS_ENABLED(CONFIG_IPV6) | ||
5203 | + if (p->sel.prefixlen_d > 128 || p->sel.prefixlen_s > 128) | ||
5204 | + return -EINVAL; | ||
5205 | + | ||
5206 | break; | ||
5207 | #else | ||
5208 | return -EAFNOSUPPORT; | ||
5209 | @@ -1400,6 +1412,9 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family) | ||
5210 | (ut[i].family != prev_family)) | ||
5211 | return -EINVAL; | ||
5212 | |||
5213 | + if (ut[i].mode >= XFRM_MODE_MAX) | ||
5214 | + return -EINVAL; | ||
5215 | + | ||
5216 | prev_family = ut[i].family; | ||
5217 | |||
5218 | switch (ut[i].family) { | ||
5219 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
5220 | index ca2945711dbe..cc48800f95e0 100644 | ||
5221 | --- a/sound/pci/hda/patch_realtek.c | ||
5222 | +++ b/sound/pci/hda/patch_realtek.c | ||
5223 | @@ -3499,7 +3499,7 @@ static void alc280_fixup_hp_gpio4(struct hda_codec *codec, | ||
5224 | } | ||
5225 | } | ||
5226 | |||
5227 | -#if IS_REACHABLE(INPUT) | ||
5228 | +#if IS_REACHABLE(CONFIG_INPUT) | ||
5229 | static void gpio2_mic_hotkey_event(struct hda_codec *codec, | ||
5230 | struct hda_jack_callback *event) | ||
5231 | { | ||
5232 | @@ -6392,8 +6392,11 @@ static int patch_alc269(struct hda_codec *codec) | ||
5233 | break; | ||
5234 | case 0x10ec0225: | ||
5235 | case 0x10ec0295: | ||
5236 | + spec->codec_variant = ALC269_TYPE_ALC225; | ||
5237 | + break; | ||
5238 | case 0x10ec0299: | ||
5239 | spec->codec_variant = ALC269_TYPE_ALC225; | ||
5240 | + spec->gen.mixer_nid = 0; /* no loopback on ALC299 */ | ||
5241 | break; | ||
5242 | case 0x10ec0234: | ||
5243 | case 0x10ec0274: | ||
5244 | diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c | ||
5245 | index bef8a4546c12..b0c154d5924b 100644 | ||
5246 | --- a/sound/soc/intel/skylake/skl-topology.c | ||
5247 | +++ b/sound/soc/intel/skylake/skl-topology.c | ||
5248 | @@ -2325,7 +2325,7 @@ static int skl_tplg_get_manifest_tkn(struct device *dev, | ||
5249 | |||
5250 | if (ret < 0) | ||
5251 | return ret; | ||
5252 | - tkn_count += ret; | ||
5253 | + tkn_count = ret; | ||
5254 | |||
5255 | tuple_size += tkn_count * | ||
5256 | sizeof(struct snd_soc_tplg_vendor_string_elem); | ||
5257 | diff --git a/tools/perf/Makefile b/tools/perf/Makefile | ||
5258 | index 32a64e619028..cd86fd7b35c4 100644 | ||
5259 | --- a/tools/perf/Makefile | ||
5260 | +++ b/tools/perf/Makefile | ||
5261 | @@ -83,10 +83,10 @@ endif # has_clean | ||
5262 | endif # MAKECMDGOALS | ||
5263 | |||
5264 | # | ||
5265 | -# The clean target is not really parallel, don't print the jobs info: | ||
5266 | +# Explicitly disable parallelism for the clean target. | ||
5267 | # | ||
5268 | clean: | ||
5269 | - $(make) | ||
5270 | + $(make) -j1 | ||
5271 | |||
5272 | # | ||
5273 | # The build-test target is not really parallel, don't print the jobs info, | ||
5274 | diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c | ||
5275 | index ade7213943ad..03239956987f 100644 | ||
5276 | --- a/tools/perf/tests/builtin-test.c | ||
5277 | +++ b/tools/perf/tests/builtin-test.c | ||
5278 | @@ -335,7 +335,7 @@ static int test_and_print(struct test *t, bool force_skip, int subtest) | ||
5279 | if (!t->subtest.get_nr) | ||
5280 | pr_debug("%s:", t->desc); | ||
5281 | else | ||
5282 | - pr_debug("%s subtest %d:", t->desc, subtest); | ||
5283 | + pr_debug("%s subtest %d:", t->desc, subtest + 1); | ||
5284 | |||
5285 | switch (err) { | ||
5286 | case TEST_OK: | ||
5287 | @@ -413,7 +413,7 @@ static int __cmd_test(int argc, const char *argv[], struct intlist *skiplist) | ||
5288 | for (subi = 0; subi < subn; subi++) { | ||
5289 | pr_info("%2d.%1d: %-*s:", i, subi + 1, subw, | ||
5290 | t->subtest.get_desc(subi)); | ||
5291 | - err = test_and_print(t, skip, subi + 1); | ||
5292 | + err = test_and_print(t, skip, subi); | ||
5293 | if (err != TEST_OK && t->subtest.skip_if_fail) | ||
5294 | skip = true; | ||
5295 | } | ||
5296 | diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c | ||
5297 | index 01a5ba2788c6..b0d005d295a9 100644 | ||
5298 | --- a/tools/perf/tests/task-exit.c | ||
5299 | +++ b/tools/perf/tests/task-exit.c | ||
5300 | @@ -82,7 +82,7 @@ int test__task_exit(int subtest __maybe_unused) | ||
5301 | |||
5302 | evsel = perf_evlist__first(evlist); | ||
5303 | evsel->attr.task = 1; | ||
5304 | - evsel->attr.sample_freq = 0; | ||
5305 | + evsel->attr.sample_freq = 1; | ||
5306 | evsel->attr.inherit = 0; | ||
5307 | evsel->attr.watermark = 0; | ||
5308 | evsel->attr.wakeup_events = 1; | ||
5309 | diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c | ||
5310 | index a38227eb5450..3336cbc6ec48 100644 | ||
5311 | --- a/tools/perf/util/annotate.c | ||
5312 | +++ b/tools/perf/util/annotate.c | ||
5313 | @@ -495,9 +495,19 @@ static struct ins *ins__find(const char *name) | ||
5314 | int symbol__alloc_hist(struct symbol *sym) | ||
5315 | { | ||
5316 | struct annotation *notes = symbol__annotation(sym); | ||
5317 | - const size_t size = symbol__size(sym); | ||
5318 | + size_t size = symbol__size(sym); | ||
5319 | size_t sizeof_sym_hist; | ||
5320 | |||
5321 | + /* | ||
5322 | + * Add buffer of one element for zero length symbol. | ||
5323 | + * When sample is taken from first instruction of | ||
5324 | + * zero length symbol, perf still resolves it and | ||
5325 | + * shows symbol name in perf report and allows to | ||
5326 | + * annotate it. | ||
5327 | + */ | ||
5328 | + if (size == 0) | ||
5329 | + size = 1; | ||
5330 | + | ||
5331 | /* Check for overflow when calculating sizeof_sym_hist */ | ||
5332 | if (size > (SIZE_MAX - sizeof(struct sym_hist)) / sizeof(u64)) | ||
5333 | return -1; | ||
5334 | diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c | ||
5335 | index 3be8c489884e..f7128c2a6386 100644 | ||
5336 | --- a/tools/perf/util/evsel.c | ||
5337 | +++ b/tools/perf/util/evsel.c | ||
5338 | @@ -263,8 +263,20 @@ struct perf_evsel *perf_evsel__new_cycles(void) | ||
5339 | struct perf_evsel *evsel; | ||
5340 | |||
5341 | event_attr_init(&attr); | ||
5342 | + /* | ||
5343 | + * Unnamed union member, not supported as struct member named | ||
5344 | + * initializer in older compilers such as gcc 4.4.7 | ||
5345 | + * | ||
5346 | + * Just for probing the precise_ip: | ||
5347 | + */ | ||
5348 | + attr.sample_period = 1; | ||
5349 | |||
5350 | perf_event_attr__set_max_precise_ip(&attr); | ||
5351 | + /* | ||
5352 | + * Now let the usual logic to set up the perf_event_attr defaults | ||
5353 | + * to kick in when we return and before perf_evsel__open() is called. | ||
5354 | + */ | ||
5355 | + attr.sample_period = 0; | ||
5356 | |||
5357 | evsel = perf_evsel__new(&attr); | ||
5358 | if (evsel == NULL) | ||
5359 | diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c | ||
5360 | index c93daccec755..a7452fd3b6ee 100644 | ||
5361 | --- a/tools/perf/util/probe-event.c | ||
5362 | +++ b/tools/perf/util/probe-event.c | ||
5363 | @@ -615,7 +615,7 @@ static int post_process_probe_trace_point(struct probe_trace_point *tp, | ||
5364 | struct map *map, unsigned long offs) | ||
5365 | { | ||
5366 | struct symbol *sym; | ||
5367 | - u64 addr = tp->address + tp->offset - offs; | ||
5368 | + u64 addr = tp->address - offs; | ||
5369 | |||
5370 | sym = map__find_symbol(map, addr); | ||
5371 | if (!sym) | ||
5372 | diff --git a/tools/virtio/ringtest/ptr_ring.c b/tools/virtio/ringtest/ptr_ring.c | ||
5373 | index 635b07b4fdd3..b4a2e6af515f 100644 | ||
5374 | --- a/tools/virtio/ringtest/ptr_ring.c | ||
5375 | +++ b/tools/virtio/ringtest/ptr_ring.c | ||
5376 | @@ -15,24 +15,41 @@ | ||
5377 | #define unlikely(x) (__builtin_expect(!!(x), 0)) | ||
5378 | #define likely(x) (__builtin_expect(!!(x), 1)) | ||
5379 | #define ALIGN(x, a) (((x) + (a) - 1) / (a) * (a)) | ||
5380 | +#define SIZE_MAX (~(size_t)0) | ||
5381 | + | ||
5382 | typedef pthread_spinlock_t spinlock_t; | ||
5383 | |||
5384 | typedef int gfp_t; | ||
5385 | -static void *kmalloc(unsigned size, gfp_t gfp) | ||
5386 | -{ | ||
5387 | - return memalign(64, size); | ||
5388 | -} | ||
5389 | +#define __GFP_ZERO 0x1 | ||
5390 | |||
5391 | -static void *kzalloc(unsigned size, gfp_t gfp) | ||
5392 | +static void *kmalloc(unsigned size, gfp_t gfp) | ||
5393 | { | ||
5394 | void *p = memalign(64, size); | ||
5395 | if (!p) | ||
5396 | return p; | ||
5397 | - memset(p, 0, size); | ||
5398 | |||
5399 | + if (gfp & __GFP_ZERO) | ||
5400 | + memset(p, 0, size); | ||
5401 | return p; | ||
5402 | } | ||
5403 | |||
5404 | +static inline void *kzalloc(unsigned size, gfp_t flags) | ||
5405 | +{ | ||
5406 | + return kmalloc(size, flags | __GFP_ZERO); | ||
5407 | +} | ||
5408 | + | ||
5409 | +static inline void *kmalloc_array(size_t n, size_t size, gfp_t flags) | ||
5410 | +{ | ||
5411 | + if (size != 0 && n > SIZE_MAX / size) | ||
5412 | + return NULL; | ||
5413 | + return kmalloc(n * size, flags); | ||
5414 | +} | ||
5415 | + | ||
5416 | +static inline void *kcalloc(size_t n, size_t size, gfp_t flags) | ||
5417 | +{ | ||
5418 | + return kmalloc_array(n, size, flags | __GFP_ZERO); | ||
5419 | +} | ||
5420 | + | ||
5421 | static void kfree(void *p) | ||
5422 | { | ||
5423 | if (p) |