Contents of /trunk/kernel-alx/patches-4.19/0130-4.19.31-all-fixes.patch
Parent Directory | Revision Log
Revision 3409 -
(show annotations)
(download)
Fri Aug 2 11:47:41 2019 UTC (5 years, 1 month ago) by niro
File size: 392684 byte(s)
Fri Aug 2 11:47:41 2019 UTC (5 years, 1 month ago) by niro
File size: 392684 byte(s)
-linux-4.19.31
1 | diff --git a/Documentation/arm64/silicon-errata.txt b/Documentation/arm64/silicon-errata.txt |
2 | index 3b2f2dd82225..3c6fc2e08d04 100644 |
3 | --- a/Documentation/arm64/silicon-errata.txt |
4 | +++ b/Documentation/arm64/silicon-errata.txt |
5 | @@ -44,6 +44,8 @@ stable kernels. |
6 | |
7 | | Implementor | Component | Erratum ID | Kconfig | |
8 | +----------------+-----------------+-----------------+-----------------------------+ |
9 | +| Allwinner | A64/R18 | UNKNOWN1 | SUN50I_ERRATUM_UNKNOWN1 | |
10 | +| | | | | |
11 | | ARM | Cortex-A53 | #826319 | ARM64_ERRATUM_826319 | |
12 | | ARM | Cortex-A53 | #827319 | ARM64_ERRATUM_827319 | |
13 | | ARM | Cortex-A53 | #824069 | ARM64_ERRATUM_824069 | |
14 | diff --git a/Documentation/process/stable-kernel-rules.rst b/Documentation/process/stable-kernel-rules.rst |
15 | index 0de6f6145cc6..7ba8cd567f84 100644 |
16 | --- a/Documentation/process/stable-kernel-rules.rst |
17 | +++ b/Documentation/process/stable-kernel-rules.rst |
18 | @@ -38,6 +38,9 @@ Procedure for submitting patches to the -stable tree |
19 | - If the patch covers files in net/ or drivers/net please follow netdev stable |
20 | submission guidelines as described in |
21 | :ref:`Documentation/networking/netdev-FAQ.rst <netdev-FAQ>` |
22 | + after first checking the stable networking queue at |
23 | + https://patchwork.ozlabs.org/bundle/davem/stable/?series=&submitter=&state=*&q=&archive= |
24 | + to ensure the requested patch is not already queued up. |
25 | - Security patches should not be handled (solely) by the -stable review |
26 | process but should follow the procedures in |
27 | :ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>`. |
28 | diff --git a/Makefile b/Makefile |
29 | index 72e27c379eaf..3b1c6cff6700 100644 |
30 | --- a/Makefile |
31 | +++ b/Makefile |
32 | @@ -1,7 +1,7 @@ |
33 | # SPDX-License-Identifier: GPL-2.0 |
34 | VERSION = 4 |
35 | PATCHLEVEL = 19 |
36 | -SUBLEVEL = 30 |
37 | +SUBLEVEL = 31 |
38 | EXTRAVERSION = |
39 | NAME = "People's Front" |
40 | |
41 | diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig |
42 | index ac69f307dcfe..74953e76a57d 100644 |
43 | --- a/arch/arc/Kconfig |
44 | +++ b/arch/arc/Kconfig |
45 | @@ -420,6 +420,14 @@ config ARC_HAS_ACCL_REGS |
46 | (also referred to as r58:r59). These can also be used by gcc as GPR so |
47 | kernel needs to save/restore per process |
48 | |
49 | +config ARC_IRQ_NO_AUTOSAVE |
50 | + bool "Disable hardware autosave regfile on interrupts" |
51 | + default n |
52 | + help |
53 | + On HS cores, taken interrupt auto saves the regfile on stack. |
54 | + This is programmable and can be optionally disabled in which case |
55 | + software INTERRUPT_PROLOGUE/EPILGUE do the needed work |
56 | + |
57 | endif # ISA_ARCV2 |
58 | |
59 | endmenu # "ARC CPU Configuration" |
60 | diff --git a/arch/arc/include/asm/arcregs.h b/arch/arc/include/asm/arcregs.h |
61 | index 49bfbd879caa..bdbdaef902eb 100644 |
62 | --- a/arch/arc/include/asm/arcregs.h |
63 | +++ b/arch/arc/include/asm/arcregs.h |
64 | @@ -151,6 +151,14 @@ struct bcr_isa_arcv2 { |
65 | #endif |
66 | }; |
67 | |
68 | +struct bcr_uarch_build_arcv2 { |
69 | +#ifdef CONFIG_CPU_BIG_ENDIAN |
70 | + unsigned int pad:8, prod:8, maj:8, min:8; |
71 | +#else |
72 | + unsigned int min:8, maj:8, prod:8, pad:8; |
73 | +#endif |
74 | +}; |
75 | + |
76 | struct bcr_mpy { |
77 | #ifdef CONFIG_CPU_BIG_ENDIAN |
78 | unsigned int pad:8, x1616:8, dsp:4, cycles:2, type:2, ver:8; |
79 | diff --git a/arch/arc/include/asm/entry-arcv2.h b/arch/arc/include/asm/entry-arcv2.h |
80 | index 309f4e6721b3..225e7df2d8ed 100644 |
81 | --- a/arch/arc/include/asm/entry-arcv2.h |
82 | +++ b/arch/arc/include/asm/entry-arcv2.h |
83 | @@ -17,6 +17,33 @@ |
84 | ; |
85 | ; Now manually save: r12, sp, fp, gp, r25 |
86 | |
87 | +#ifdef CONFIG_ARC_IRQ_NO_AUTOSAVE |
88 | +.ifnc \called_from, exception |
89 | + st.as r9, [sp, -10] ; save r9 in it's final stack slot |
90 | + sub sp, sp, 12 ; skip JLI, LDI, EI |
91 | + |
92 | + PUSH lp_count |
93 | + PUSHAX lp_start |
94 | + PUSHAX lp_end |
95 | + PUSH blink |
96 | + |
97 | + PUSH r11 |
98 | + PUSH r10 |
99 | + |
100 | + sub sp, sp, 4 ; skip r9 |
101 | + |
102 | + PUSH r8 |
103 | + PUSH r7 |
104 | + PUSH r6 |
105 | + PUSH r5 |
106 | + PUSH r4 |
107 | + PUSH r3 |
108 | + PUSH r2 |
109 | + PUSH r1 |
110 | + PUSH r0 |
111 | +.endif |
112 | +#endif |
113 | + |
114 | #ifdef CONFIG_ARC_HAS_ACCL_REGS |
115 | PUSH r59 |
116 | PUSH r58 |
117 | @@ -86,6 +113,33 @@ |
118 | POP r59 |
119 | #endif |
120 | |
121 | +#ifdef CONFIG_ARC_IRQ_NO_AUTOSAVE |
122 | +.ifnc \called_from, exception |
123 | + POP r0 |
124 | + POP r1 |
125 | + POP r2 |
126 | + POP r3 |
127 | + POP r4 |
128 | + POP r5 |
129 | + POP r6 |
130 | + POP r7 |
131 | + POP r8 |
132 | + POP r9 |
133 | + POP r10 |
134 | + POP r11 |
135 | + |
136 | + POP blink |
137 | + POPAX lp_end |
138 | + POPAX lp_start |
139 | + |
140 | + POP r9 |
141 | + mov lp_count, r9 |
142 | + |
143 | + add sp, sp, 12 ; skip JLI, LDI, EI |
144 | + ld.as r9, [sp, -10] ; reload r9 which got clobbered |
145 | +.endif |
146 | +#endif |
147 | + |
148 | .endm |
149 | |
150 | /*------------------------------------------------------------------------*/ |
151 | diff --git a/arch/arc/include/asm/uaccess.h b/arch/arc/include/asm/uaccess.h |
152 | index c9173c02081c..eabc3efa6c6d 100644 |
153 | --- a/arch/arc/include/asm/uaccess.h |
154 | +++ b/arch/arc/include/asm/uaccess.h |
155 | @@ -207,7 +207,7 @@ raw_copy_from_user(void *to, const void __user *from, unsigned long n) |
156 | */ |
157 | "=&r" (tmp), "+r" (to), "+r" (from) |
158 | : |
159 | - : "lp_count", "lp_start", "lp_end", "memory"); |
160 | + : "lp_count", "memory"); |
161 | |
162 | return n; |
163 | } |
164 | @@ -433,7 +433,7 @@ raw_copy_to_user(void __user *to, const void *from, unsigned long n) |
165 | */ |
166 | "=&r" (tmp), "+r" (to), "+r" (from) |
167 | : |
168 | - : "lp_count", "lp_start", "lp_end", "memory"); |
169 | + : "lp_count", "memory"); |
170 | |
171 | return n; |
172 | } |
173 | @@ -653,7 +653,7 @@ static inline unsigned long __arc_clear_user(void __user *to, unsigned long n) |
174 | " .previous \n" |
175 | : "+r"(d_char), "+r"(res) |
176 | : "i"(0) |
177 | - : "lp_count", "lp_start", "lp_end", "memory"); |
178 | + : "lp_count", "memory"); |
179 | |
180 | return res; |
181 | } |
182 | @@ -686,7 +686,7 @@ __arc_strncpy_from_user(char *dst, const char __user *src, long count) |
183 | " .previous \n" |
184 | : "+r"(res), "+r"(dst), "+r"(src), "=r"(val) |
185 | : "g"(-EFAULT), "r"(count) |
186 | - : "lp_count", "lp_start", "lp_end", "memory"); |
187 | + : "lp_count", "memory"); |
188 | |
189 | return res; |
190 | } |
191 | diff --git a/arch/arc/kernel/entry-arcv2.S b/arch/arc/kernel/entry-arcv2.S |
192 | index cc558a25b8fa..562089d62d9d 100644 |
193 | --- a/arch/arc/kernel/entry-arcv2.S |
194 | +++ b/arch/arc/kernel/entry-arcv2.S |
195 | @@ -209,7 +209,9 @@ restore_regs: |
196 | ;####### Return from Intr ####### |
197 | |
198 | debug_marker_l1: |
199 | - bbit1.nt r0, STATUS_DE_BIT, .Lintr_ret_to_delay_slot |
200 | + ; bbit1.nt r0, STATUS_DE_BIT, .Lintr_ret_to_delay_slot |
201 | + btst r0, STATUS_DE_BIT ; Z flag set if bit clear |
202 | + bnz .Lintr_ret_to_delay_slot ; branch if STATUS_DE_BIT set |
203 | |
204 | .Lisr_ret_fast_path: |
205 | ; Handle special case #1: (Entry via Exception, Return via IRQ) |
206 | diff --git a/arch/arc/kernel/intc-arcv2.c b/arch/arc/kernel/intc-arcv2.c |
207 | index 067ea362fb3e..cf18b3e5a934 100644 |
208 | --- a/arch/arc/kernel/intc-arcv2.c |
209 | +++ b/arch/arc/kernel/intc-arcv2.c |
210 | @@ -49,11 +49,13 @@ void arc_init_IRQ(void) |
211 | |
212 | *(unsigned int *)&ictrl = 0; |
213 | |
214 | +#ifndef CONFIG_ARC_IRQ_NO_AUTOSAVE |
215 | ictrl.save_nr_gpr_pairs = 6; /* r0 to r11 (r12 saved manually) */ |
216 | ictrl.save_blink = 1; |
217 | ictrl.save_lp_regs = 1; /* LP_COUNT, LP_START, LP_END */ |
218 | ictrl.save_u_to_u = 0; /* user ctxt saved on kernel stack */ |
219 | ictrl.save_idx_regs = 1; /* JLI, LDI, EI */ |
220 | +#endif |
221 | |
222 | WRITE_AUX(AUX_IRQ_CTRL, ictrl); |
223 | |
224 | diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c |
225 | index 62a30e58441c..3320ca2fe20f 100644 |
226 | --- a/arch/arc/kernel/setup.c |
227 | +++ b/arch/arc/kernel/setup.c |
228 | @@ -196,13 +196,29 @@ static void read_arc_build_cfg_regs(void) |
229 | cpu->bpu.num_pred = 2048 << bpu.pte; |
230 | |
231 | if (cpu->core.family >= 0x54) { |
232 | - unsigned int exec_ctrl; |
233 | |
234 | - READ_BCR(AUX_EXEC_CTRL, exec_ctrl); |
235 | - cpu->extn.dual_enb = !(exec_ctrl & 1); |
236 | + struct bcr_uarch_build_arcv2 uarch; |
237 | |
238 | - /* dual issue always present for this core */ |
239 | - cpu->extn.dual = 1; |
240 | + /* |
241 | + * The first 0x54 core (uarch maj:min 0:1 or 0:2) was |
242 | + * dual issue only (HS4x). But next uarch rev (1:0) |
243 | + * allows it be configured for single issue (HS3x) |
244 | + * Ensure we fiddle with dual issue only on HS4x |
245 | + */ |
246 | + READ_BCR(ARC_REG_MICRO_ARCH_BCR, uarch); |
247 | + |
248 | + if (uarch.prod == 4) { |
249 | + unsigned int exec_ctrl; |
250 | + |
251 | + /* dual issue hardware always present */ |
252 | + cpu->extn.dual = 1; |
253 | + |
254 | + READ_BCR(AUX_EXEC_CTRL, exec_ctrl); |
255 | + |
256 | + /* dual issue hardware enabled ? */ |
257 | + cpu->extn.dual_enb = !(exec_ctrl & 1); |
258 | + |
259 | + } |
260 | } |
261 | } |
262 | |
263 | diff --git a/arch/arc/lib/memcpy-archs.S b/arch/arc/lib/memcpy-archs.S |
264 | index d61044dd8b58..ea14b0bf3116 100644 |
265 | --- a/arch/arc/lib/memcpy-archs.S |
266 | +++ b/arch/arc/lib/memcpy-archs.S |
267 | @@ -25,15 +25,11 @@ |
268 | #endif |
269 | |
270 | #ifdef CONFIG_ARC_HAS_LL64 |
271 | -# define PREFETCH_READ(RX) prefetch [RX, 56] |
272 | -# define PREFETCH_WRITE(RX) prefetchw [RX, 64] |
273 | # define LOADX(DST,RX) ldd.ab DST, [RX, 8] |
274 | # define STOREX(SRC,RX) std.ab SRC, [RX, 8] |
275 | # define ZOLSHFT 5 |
276 | # define ZOLAND 0x1F |
277 | #else |
278 | -# define PREFETCH_READ(RX) prefetch [RX, 28] |
279 | -# define PREFETCH_WRITE(RX) prefetchw [RX, 32] |
280 | # define LOADX(DST,RX) ld.ab DST, [RX, 4] |
281 | # define STOREX(SRC,RX) st.ab SRC, [RX, 4] |
282 | # define ZOLSHFT 4 |
283 | @@ -41,8 +37,6 @@ |
284 | #endif |
285 | |
286 | ENTRY_CFI(memcpy) |
287 | - prefetch [r1] ; Prefetch the read location |
288 | - prefetchw [r0] ; Prefetch the write location |
289 | mov.f 0, r2 |
290 | ;;; if size is zero |
291 | jz.d [blink] |
292 | @@ -72,8 +66,6 @@ ENTRY_CFI(memcpy) |
293 | lpnz @.Lcopy32_64bytes |
294 | ;; LOOP START |
295 | LOADX (r6, r1) |
296 | - PREFETCH_READ (r1) |
297 | - PREFETCH_WRITE (r3) |
298 | LOADX (r8, r1) |
299 | LOADX (r10, r1) |
300 | LOADX (r4, r1) |
301 | @@ -117,9 +109,7 @@ ENTRY_CFI(memcpy) |
302 | lpnz @.Lcopy8bytes_1 |
303 | ;; LOOP START |
304 | ld.ab r6, [r1, 4] |
305 | - prefetch [r1, 28] ;Prefetch the next read location |
306 | ld.ab r8, [r1,4] |
307 | - prefetchw [r3, 32] ;Prefetch the next write location |
308 | |
309 | SHIFT_1 (r7, r6, 24) |
310 | or r7, r7, r5 |
311 | @@ -162,9 +152,7 @@ ENTRY_CFI(memcpy) |
312 | lpnz @.Lcopy8bytes_2 |
313 | ;; LOOP START |
314 | ld.ab r6, [r1, 4] |
315 | - prefetch [r1, 28] ;Prefetch the next read location |
316 | ld.ab r8, [r1,4] |
317 | - prefetchw [r3, 32] ;Prefetch the next write location |
318 | |
319 | SHIFT_1 (r7, r6, 16) |
320 | or r7, r7, r5 |
321 | @@ -204,9 +192,7 @@ ENTRY_CFI(memcpy) |
322 | lpnz @.Lcopy8bytes_3 |
323 | ;; LOOP START |
324 | ld.ab r6, [r1, 4] |
325 | - prefetch [r1, 28] ;Prefetch the next read location |
326 | ld.ab r8, [r1,4] |
327 | - prefetchw [r3, 32] ;Prefetch the next write location |
328 | |
329 | SHIFT_1 (r7, r6, 8) |
330 | or r7, r7, r5 |
331 | diff --git a/arch/arc/plat-hsdk/Kconfig b/arch/arc/plat-hsdk/Kconfig |
332 | index 9356753c2ed8..c285a83cbf08 100644 |
333 | --- a/arch/arc/plat-hsdk/Kconfig |
334 | +++ b/arch/arc/plat-hsdk/Kconfig |
335 | @@ -9,6 +9,7 @@ menuconfig ARC_SOC_HSDK |
336 | bool "ARC HS Development Kit SOC" |
337 | depends on ISA_ARCV2 |
338 | select ARC_HAS_ACCL_REGS |
339 | + select ARC_IRQ_NO_AUTOSAVE |
340 | select CLK_HSDK |
341 | select RESET_HSDK |
342 | select MIGHT_HAVE_PCI |
343 | diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig |
344 | index e8cd55a5b04c..cd4c74daf71e 100644 |
345 | --- a/arch/arm/Kconfig |
346 | +++ b/arch/arm/Kconfig |
347 | @@ -1444,6 +1444,7 @@ config NR_CPUS |
348 | config HOTPLUG_CPU |
349 | bool "Support for hot-pluggable CPUs" |
350 | depends on SMP |
351 | + select GENERIC_IRQ_MIGRATION |
352 | help |
353 | Say Y here to experiment with turning CPUs off and on. CPUs |
354 | can be controlled through /sys/devices/system/cpu. |
355 | diff --git a/arch/arm/boot/dts/armada-xp-db.dts b/arch/arm/boot/dts/armada-xp-db.dts |
356 | index f3ac7483afed..5d04dc68cf57 100644 |
357 | --- a/arch/arm/boot/dts/armada-xp-db.dts |
358 | +++ b/arch/arm/boot/dts/armada-xp-db.dts |
359 | @@ -144,30 +144,32 @@ |
360 | status = "okay"; |
361 | }; |
362 | |
363 | - nand@d0000 { |
364 | + nand-controller@d0000 { |
365 | status = "okay"; |
366 | - label = "pxa3xx_nand-0"; |
367 | - num-cs = <1>; |
368 | - marvell,nand-keep-config; |
369 | - nand-on-flash-bbt; |
370 | - |
371 | - partitions { |
372 | - compatible = "fixed-partitions"; |
373 | - #address-cells = <1>; |
374 | - #size-cells = <1>; |
375 | - |
376 | - partition@0 { |
377 | - label = "U-Boot"; |
378 | - reg = <0 0x800000>; |
379 | - }; |
380 | - partition@800000 { |
381 | - label = "Linux"; |
382 | - reg = <0x800000 0x800000>; |
383 | - }; |
384 | - partition@1000000 { |
385 | - label = "Filesystem"; |
386 | - reg = <0x1000000 0x3f000000>; |
387 | |
388 | + nand@0 { |
389 | + reg = <0>; |
390 | + label = "pxa3xx_nand-0"; |
391 | + nand-rb = <0>; |
392 | + nand-on-flash-bbt; |
393 | + |
394 | + partitions { |
395 | + compatible = "fixed-partitions"; |
396 | + #address-cells = <1>; |
397 | + #size-cells = <1>; |
398 | + |
399 | + partition@0 { |
400 | + label = "U-Boot"; |
401 | + reg = <0 0x800000>; |
402 | + }; |
403 | + partition@800000 { |
404 | + label = "Linux"; |
405 | + reg = <0x800000 0x800000>; |
406 | + }; |
407 | + partition@1000000 { |
408 | + label = "Filesystem"; |
409 | + reg = <0x1000000 0x3f000000>; |
410 | + }; |
411 | }; |
412 | }; |
413 | }; |
414 | diff --git a/arch/arm/boot/dts/armada-xp-gp.dts b/arch/arm/boot/dts/armada-xp-gp.dts |
415 | index 1139e9469a83..b4cca507cf13 100644 |
416 | --- a/arch/arm/boot/dts/armada-xp-gp.dts |
417 | +++ b/arch/arm/boot/dts/armada-xp-gp.dts |
418 | @@ -160,12 +160,15 @@ |
419 | status = "okay"; |
420 | }; |
421 | |
422 | - nand@d0000 { |
423 | + nand-controller@d0000 { |
424 | status = "okay"; |
425 | - label = "pxa3xx_nand-0"; |
426 | - num-cs = <1>; |
427 | - marvell,nand-keep-config; |
428 | - nand-on-flash-bbt; |
429 | + |
430 | + nand@0 { |
431 | + reg = <0>; |
432 | + label = "pxa3xx_nand-0"; |
433 | + nand-rb = <0>; |
434 | + nand-on-flash-bbt; |
435 | + }; |
436 | }; |
437 | }; |
438 | |
439 | diff --git a/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts b/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts |
440 | index bbbb38888bb8..87dcb502f72d 100644 |
441 | --- a/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts |
442 | +++ b/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts |
443 | @@ -81,49 +81,52 @@ |
444 | |
445 | }; |
446 | |
447 | - nand@d0000 { |
448 | + nand-controller@d0000 { |
449 | status = "okay"; |
450 | - label = "pxa3xx_nand-0"; |
451 | - num-cs = <1>; |
452 | - marvell,nand-keep-config; |
453 | - nand-on-flash-bbt; |
454 | - |
455 | - partitions { |
456 | - compatible = "fixed-partitions"; |
457 | - #address-cells = <1>; |
458 | - #size-cells = <1>; |
459 | - |
460 | - partition@0 { |
461 | - label = "u-boot"; |
462 | - reg = <0x00000000 0x000e0000>; |
463 | - read-only; |
464 | - }; |
465 | - |
466 | - partition@e0000 { |
467 | - label = "u-boot-env"; |
468 | - reg = <0x000e0000 0x00020000>; |
469 | - read-only; |
470 | - }; |
471 | - |
472 | - partition@100000 { |
473 | - label = "u-boot-env2"; |
474 | - reg = <0x00100000 0x00020000>; |
475 | - read-only; |
476 | - }; |
477 | - |
478 | - partition@120000 { |
479 | - label = "zImage"; |
480 | - reg = <0x00120000 0x00400000>; |
481 | - }; |
482 | - |
483 | - partition@520000 { |
484 | - label = "initrd"; |
485 | - reg = <0x00520000 0x00400000>; |
486 | - }; |
487 | |
488 | - partition@e00000 { |
489 | - label = "boot"; |
490 | - reg = <0x00e00000 0x3f200000>; |
491 | + nand@0 { |
492 | + reg = <0>; |
493 | + label = "pxa3xx_nand-0"; |
494 | + nand-rb = <0>; |
495 | + nand-on-flash-bbt; |
496 | + |
497 | + partitions { |
498 | + compatible = "fixed-partitions"; |
499 | + #address-cells = <1>; |
500 | + #size-cells = <1>; |
501 | + |
502 | + partition@0 { |
503 | + label = "u-boot"; |
504 | + reg = <0x00000000 0x000e0000>; |
505 | + read-only; |
506 | + }; |
507 | + |
508 | + partition@e0000 { |
509 | + label = "u-boot-env"; |
510 | + reg = <0x000e0000 0x00020000>; |
511 | + read-only; |
512 | + }; |
513 | + |
514 | + partition@100000 { |
515 | + label = "u-boot-env2"; |
516 | + reg = <0x00100000 0x00020000>; |
517 | + read-only; |
518 | + }; |
519 | + |
520 | + partition@120000 { |
521 | + label = "zImage"; |
522 | + reg = <0x00120000 0x00400000>; |
523 | + }; |
524 | + |
525 | + partition@520000 { |
526 | + label = "initrd"; |
527 | + reg = <0x00520000 0x00400000>; |
528 | + }; |
529 | + |
530 | + partition@e00000 { |
531 | + label = "boot"; |
532 | + reg = <0x00e00000 0x3f200000>; |
533 | + }; |
534 | }; |
535 | }; |
536 | }; |
537 | diff --git a/arch/arm/boot/dts/omap4-droid4-xt894.dts b/arch/arm/boot/dts/omap4-droid4-xt894.dts |
538 | index 04758a2a87f0..67d77eee9433 100644 |
539 | --- a/arch/arm/boot/dts/omap4-droid4-xt894.dts |
540 | +++ b/arch/arm/boot/dts/omap4-droid4-xt894.dts |
541 | @@ -644,6 +644,17 @@ |
542 | }; |
543 | }; |
544 | |
545 | +/* Configure pwm clock source for timers 8 & 9 */ |
546 | +&timer8 { |
547 | + assigned-clocks = <&abe_clkctrl OMAP4_TIMER8_CLKCTRL 24>; |
548 | + assigned-clock-parents = <&sys_clkin_ck>; |
549 | +}; |
550 | + |
551 | +&timer9 { |
552 | + assigned-clocks = <&l4_per_clkctrl OMAP4_TIMER9_CLKCTRL 24>; |
553 | + assigned-clock-parents = <&sys_clkin_ck>; |
554 | +}; |
555 | + |
556 | /* |
557 | * As uart1 is wired to mdm6600 with rts and cts, we can use the cts pin for |
558 | * uart1 wakeirq. |
559 | diff --git a/arch/arm/boot/dts/tegra124-nyan.dtsi b/arch/arm/boot/dts/tegra124-nyan.dtsi |
560 | index d5f11d6d987e..bc85b6a166c7 100644 |
561 | --- a/arch/arm/boot/dts/tegra124-nyan.dtsi |
562 | +++ b/arch/arm/boot/dts/tegra124-nyan.dtsi |
563 | @@ -13,10 +13,25 @@ |
564 | stdout-path = "serial0:115200n8"; |
565 | }; |
566 | |
567 | - memory@80000000 { |
568 | + /* |
569 | + * Note that recent version of the device tree compiler (starting with |
570 | + * version 1.4.2) warn about this node containing a reg property, but |
571 | + * missing a unit-address. However, the bootloader on these Chromebook |
572 | + * devices relies on the full name of this node to be exactly /memory. |
573 | + * Adding the unit-address causes the bootloader to create a /memory |
574 | + * node and write the memory bank configuration to that node, which in |
575 | + * turn leads the kernel to believe that the device has 2 GiB of |
576 | + * memory instead of the amount detected by the bootloader. |
577 | + * |
578 | + * The name of this node is effectively ABI and must not be changed. |
579 | + */ |
580 | + memory { |
581 | + device_type = "memory"; |
582 | reg = <0x0 0x80000000 0x0 0x80000000>; |
583 | }; |
584 | |
585 | + /delete-node/ memory@80000000; |
586 | + |
587 | host1x@50000000 { |
588 | hdmi@54280000 { |
589 | status = "okay"; |
590 | diff --git a/arch/arm/crypto/crct10dif-ce-core.S b/arch/arm/crypto/crct10dif-ce-core.S |
591 | index ce45ba0c0687..16019b5961e7 100644 |
592 | --- a/arch/arm/crypto/crct10dif-ce-core.S |
593 | +++ b/arch/arm/crypto/crct10dif-ce-core.S |
594 | @@ -124,10 +124,10 @@ ENTRY(crc_t10dif_pmull) |
595 | vext.8 q10, qzr, q0, #4 |
596 | |
597 | // receive the initial 64B data, xor the initial crc value |
598 | - vld1.64 {q0-q1}, [arg2, :128]! |
599 | - vld1.64 {q2-q3}, [arg2, :128]! |
600 | - vld1.64 {q4-q5}, [arg2, :128]! |
601 | - vld1.64 {q6-q7}, [arg2, :128]! |
602 | + vld1.64 {q0-q1}, [arg2]! |
603 | + vld1.64 {q2-q3}, [arg2]! |
604 | + vld1.64 {q4-q5}, [arg2]! |
605 | + vld1.64 {q6-q7}, [arg2]! |
606 | CPU_LE( vrev64.8 q0, q0 ) |
607 | CPU_LE( vrev64.8 q1, q1 ) |
608 | CPU_LE( vrev64.8 q2, q2 ) |
609 | @@ -167,7 +167,7 @@ CPU_LE( vrev64.8 q7, q7 ) |
610 | _fold_64_B_loop: |
611 | |
612 | .macro fold64, reg1, reg2 |
613 | - vld1.64 {q11-q12}, [arg2, :128]! |
614 | + vld1.64 {q11-q12}, [arg2]! |
615 | |
616 | vmull.p64 q8, \reg1\()h, d21 |
617 | vmull.p64 \reg1, \reg1\()l, d20 |
618 | @@ -238,7 +238,7 @@ _16B_reduction_loop: |
619 | vmull.p64 q7, d15, d21 |
620 | veor.8 q7, q7, q8 |
621 | |
622 | - vld1.64 {q0}, [arg2, :128]! |
623 | + vld1.64 {q0}, [arg2]! |
624 | CPU_LE( vrev64.8 q0, q0 ) |
625 | vswp d0, d1 |
626 | veor.8 q7, q7, q0 |
627 | @@ -335,7 +335,7 @@ _less_than_128: |
628 | vmov.i8 q0, #0 |
629 | vmov s3, arg1_low32 // get the initial crc value |
630 | |
631 | - vld1.64 {q7}, [arg2, :128]! |
632 | + vld1.64 {q7}, [arg2]! |
633 | CPU_LE( vrev64.8 q7, q7 ) |
634 | vswp d14, d15 |
635 | veor.8 q7, q7, q0 |
636 | diff --git a/arch/arm/crypto/crct10dif-ce-glue.c b/arch/arm/crypto/crct10dif-ce-glue.c |
637 | index d428355cf38d..14c19c70a841 100644 |
638 | --- a/arch/arm/crypto/crct10dif-ce-glue.c |
639 | +++ b/arch/arm/crypto/crct10dif-ce-glue.c |
640 | @@ -35,26 +35,15 @@ static int crct10dif_update(struct shash_desc *desc, const u8 *data, |
641 | unsigned int length) |
642 | { |
643 | u16 *crc = shash_desc_ctx(desc); |
644 | - unsigned int l; |
645 | |
646 | - if (!may_use_simd()) { |
647 | - *crc = crc_t10dif_generic(*crc, data, length); |
648 | + if (length >= CRC_T10DIF_PMULL_CHUNK_SIZE && may_use_simd()) { |
649 | + kernel_neon_begin(); |
650 | + *crc = crc_t10dif_pmull(*crc, data, length); |
651 | + kernel_neon_end(); |
652 | } else { |
653 | - if (unlikely((u32)data % CRC_T10DIF_PMULL_CHUNK_SIZE)) { |
654 | - l = min_t(u32, length, CRC_T10DIF_PMULL_CHUNK_SIZE - |
655 | - ((u32)data % CRC_T10DIF_PMULL_CHUNK_SIZE)); |
656 | - |
657 | - *crc = crc_t10dif_generic(*crc, data, l); |
658 | - |
659 | - length -= l; |
660 | - data += l; |
661 | - } |
662 | - if (length > 0) { |
663 | - kernel_neon_begin(); |
664 | - *crc = crc_t10dif_pmull(*crc, data, length); |
665 | - kernel_neon_end(); |
666 | - } |
667 | + *crc = crc_t10dif_generic(*crc, data, length); |
668 | } |
669 | + |
670 | return 0; |
671 | } |
672 | |
673 | diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h |
674 | index c883fcbe93b6..46d41140df27 100644 |
675 | --- a/arch/arm/include/asm/irq.h |
676 | +++ b/arch/arm/include/asm/irq.h |
677 | @@ -25,7 +25,6 @@ |
678 | #ifndef __ASSEMBLY__ |
679 | struct irqaction; |
680 | struct pt_regs; |
681 | -extern void migrate_irqs(void); |
682 | |
683 | extern void asm_do_IRQ(unsigned int, struct pt_regs *); |
684 | void handle_IRQ(unsigned int, struct pt_regs *); |
685 | diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h |
686 | index 3ad482d2f1eb..d0d0227fc70d 100644 |
687 | --- a/arch/arm/include/asm/kvm_host.h |
688 | +++ b/arch/arm/include/asm/kvm_host.h |
689 | @@ -48,6 +48,7 @@ |
690 | #define KVM_REQ_SLEEP \ |
691 | KVM_ARCH_REQ_FLAGS(0, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) |
692 | #define KVM_REQ_IRQ_PENDING KVM_ARCH_REQ(1) |
693 | +#define KVM_REQ_VCPU_RESET KVM_ARCH_REQ(2) |
694 | |
695 | DECLARE_STATIC_KEY_FALSE(userspace_irqchip_in_use); |
696 | |
697 | @@ -147,6 +148,13 @@ struct kvm_cpu_context { |
698 | |
699 | typedef struct kvm_cpu_context kvm_cpu_context_t; |
700 | |
701 | +struct vcpu_reset_state { |
702 | + unsigned long pc; |
703 | + unsigned long r0; |
704 | + bool be; |
705 | + bool reset; |
706 | +}; |
707 | + |
708 | struct kvm_vcpu_arch { |
709 | struct kvm_cpu_context ctxt; |
710 | |
711 | @@ -186,6 +194,8 @@ struct kvm_vcpu_arch { |
712 | /* Cache some mmu pages needed inside spinlock regions */ |
713 | struct kvm_mmu_memory_cache mmu_page_cache; |
714 | |
715 | + struct vcpu_reset_state reset_state; |
716 | + |
717 | /* Detect first run of a vcpu */ |
718 | bool has_run_once; |
719 | }; |
720 | diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c |
721 | index 9908dacf9229..844861368cd5 100644 |
722 | --- a/arch/arm/kernel/irq.c |
723 | +++ b/arch/arm/kernel/irq.c |
724 | @@ -31,7 +31,6 @@ |
725 | #include <linux/smp.h> |
726 | #include <linux/init.h> |
727 | #include <linux/seq_file.h> |
728 | -#include <linux/ratelimit.h> |
729 | #include <linux/errno.h> |
730 | #include <linux/list.h> |
731 | #include <linux/kallsyms.h> |
732 | @@ -109,64 +108,3 @@ int __init arch_probe_nr_irqs(void) |
733 | return nr_irqs; |
734 | } |
735 | #endif |
736 | - |
737 | -#ifdef CONFIG_HOTPLUG_CPU |
738 | -static bool migrate_one_irq(struct irq_desc *desc) |
739 | -{ |
740 | - struct irq_data *d = irq_desc_get_irq_data(desc); |
741 | - const struct cpumask *affinity = irq_data_get_affinity_mask(d); |
742 | - struct irq_chip *c; |
743 | - bool ret = false; |
744 | - |
745 | - /* |
746 | - * If this is a per-CPU interrupt, or the affinity does not |
747 | - * include this CPU, then we have nothing to do. |
748 | - */ |
749 | - if (irqd_is_per_cpu(d) || !cpumask_test_cpu(smp_processor_id(), affinity)) |
750 | - return false; |
751 | - |
752 | - if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { |
753 | - affinity = cpu_online_mask; |
754 | - ret = true; |
755 | - } |
756 | - |
757 | - c = irq_data_get_irq_chip(d); |
758 | - if (!c->irq_set_affinity) |
759 | - pr_debug("IRQ%u: unable to set affinity\n", d->irq); |
760 | - else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret) |
761 | - cpumask_copy(irq_data_get_affinity_mask(d), affinity); |
762 | - |
763 | - return ret; |
764 | -} |
765 | - |
766 | -/* |
767 | - * The current CPU has been marked offline. Migrate IRQs off this CPU. |
768 | - * If the affinity settings do not allow other CPUs, force them onto any |
769 | - * available CPU. |
770 | - * |
771 | - * Note: we must iterate over all IRQs, whether they have an attached |
772 | - * action structure or not, as we need to get chained interrupts too. |
773 | - */ |
774 | -void migrate_irqs(void) |
775 | -{ |
776 | - unsigned int i; |
777 | - struct irq_desc *desc; |
778 | - unsigned long flags; |
779 | - |
780 | - local_irq_save(flags); |
781 | - |
782 | - for_each_irq_desc(i, desc) { |
783 | - bool affinity_broken; |
784 | - |
785 | - raw_spin_lock(&desc->lock); |
786 | - affinity_broken = migrate_one_irq(desc); |
787 | - raw_spin_unlock(&desc->lock); |
788 | - |
789 | - if (affinity_broken) |
790 | - pr_warn_ratelimited("IRQ%u no longer affine to CPU%u\n", |
791 | - i, smp_processor_id()); |
792 | - } |
793 | - |
794 | - local_irq_restore(flags); |
795 | -} |
796 | -#endif /* CONFIG_HOTPLUG_CPU */ |
797 | diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c |
798 | index 3bf82232b1be..1d6f5ea522f4 100644 |
799 | --- a/arch/arm/kernel/smp.c |
800 | +++ b/arch/arm/kernel/smp.c |
801 | @@ -254,7 +254,7 @@ int __cpu_disable(void) |
802 | /* |
803 | * OK - migrate IRQs away from this CPU |
804 | */ |
805 | - migrate_irqs(); |
806 | + irq_migrate_all_off_this_cpu(); |
807 | |
808 | /* |
809 | * Flush user cache and TLB mappings, and then remove this CPU |
810 | diff --git a/arch/arm/kvm/coproc.c b/arch/arm/kvm/coproc.c |
811 | index cb094e55dc5f..fd6cde23bb5d 100644 |
812 | --- a/arch/arm/kvm/coproc.c |
813 | +++ b/arch/arm/kvm/coproc.c |
814 | @@ -1450,6 +1450,6 @@ void kvm_reset_coprocs(struct kvm_vcpu *vcpu) |
815 | reset_coproc_regs(vcpu, table, num); |
816 | |
817 | for (num = 1; num < NR_CP15_REGS; num++) |
818 | - if (vcpu_cp15(vcpu, num) == 0x42424242) |
819 | - panic("Didn't reset vcpu_cp15(vcpu, %zi)", num); |
820 | + WARN(vcpu_cp15(vcpu, num) == 0x42424242, |
821 | + "Didn't reset vcpu_cp15(vcpu, %zi)", num); |
822 | } |
823 | diff --git a/arch/arm/kvm/reset.c b/arch/arm/kvm/reset.c |
824 | index 5ed0c3ee33d6..e53327912adc 100644 |
825 | --- a/arch/arm/kvm/reset.c |
826 | +++ b/arch/arm/kvm/reset.c |
827 | @@ -26,6 +26,7 @@ |
828 | #include <asm/cputype.h> |
829 | #include <asm/kvm_arm.h> |
830 | #include <asm/kvm_coproc.h> |
831 | +#include <asm/kvm_emulate.h> |
832 | |
833 | #include <kvm/arm_arch_timer.h> |
834 | |
835 | @@ -69,6 +70,29 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu) |
836 | /* Reset CP15 registers */ |
837 | kvm_reset_coprocs(vcpu); |
838 | |
839 | + /* |
840 | + * Additional reset state handling that PSCI may have imposed on us. |
841 | + * Must be done after all the sys_reg reset. |
842 | + */ |
843 | + if (READ_ONCE(vcpu->arch.reset_state.reset)) { |
844 | + unsigned long target_pc = vcpu->arch.reset_state.pc; |
845 | + |
846 | + /* Gracefully handle Thumb2 entry point */ |
847 | + if (target_pc & 1) { |
848 | + target_pc &= ~1UL; |
849 | + vcpu_set_thumb(vcpu); |
850 | + } |
851 | + |
852 | + /* Propagate caller endianness */ |
853 | + if (vcpu->arch.reset_state.be) |
854 | + kvm_vcpu_set_be(vcpu); |
855 | + |
856 | + *vcpu_pc(vcpu) = target_pc; |
857 | + vcpu_set_reg(vcpu, 0, vcpu->arch.reset_state.r0); |
858 | + |
859 | + vcpu->arch.reset_state.reset = false; |
860 | + } |
861 | + |
862 | /* Reset arch_timer context */ |
863 | return kvm_timer_vcpu_reset(vcpu); |
864 | } |
865 | diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c |
866 | index a8b291f00109..dae514c8276a 100644 |
867 | --- a/arch/arm/mach-omap2/cpuidle44xx.c |
868 | +++ b/arch/arm/mach-omap2/cpuidle44xx.c |
869 | @@ -152,6 +152,10 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev, |
870 | mpuss_can_lose_context = (cx->mpu_state == PWRDM_POWER_RET) && |
871 | (cx->mpu_logic_state == PWRDM_POWER_OFF); |
872 | |
873 | + /* Enter broadcast mode for periodic timers */ |
874 | + tick_broadcast_enable(); |
875 | + |
876 | + /* Enter broadcast mode for one-shot timers */ |
877 | tick_broadcast_enter(); |
878 | |
879 | /* |
880 | @@ -218,15 +222,6 @@ fail: |
881 | return index; |
882 | } |
883 | |
884 | -/* |
885 | - * For each cpu, setup the broadcast timer because local timers |
886 | - * stops for the states above C1. |
887 | - */ |
888 | -static void omap_setup_broadcast_timer(void *arg) |
889 | -{ |
890 | - tick_broadcast_enable(); |
891 | -} |
892 | - |
893 | static struct cpuidle_driver omap4_idle_driver = { |
894 | .name = "omap4_idle", |
895 | .owner = THIS_MODULE, |
896 | @@ -319,8 +314,5 @@ int __init omap4_idle_init(void) |
897 | if (!cpu_clkdm[0] || !cpu_clkdm[1]) |
898 | return -ENODEV; |
899 | |
900 | - /* Configure the broadcast timer on each cpu */ |
901 | - on_each_cpu(omap_setup_broadcast_timer, NULL, 1); |
902 | - |
903 | return cpuidle_register(idle_driver, cpu_online_mask); |
904 | } |
905 | diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c |
906 | index 9500b6e27380..5d73f2c0b117 100644 |
907 | --- a/arch/arm/mach-omap2/display.c |
908 | +++ b/arch/arm/mach-omap2/display.c |
909 | @@ -83,6 +83,7 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes) |
910 | u32 enable_mask, enable_shift; |
911 | u32 pipd_mask, pipd_shift; |
912 | u32 reg; |
913 | + int ret; |
914 | |
915 | if (dsi_id == 0) { |
916 | enable_mask = OMAP4_DSI1_LANEENABLE_MASK; |
917 | @@ -98,7 +99,11 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes) |
918 | return -ENODEV; |
919 | } |
920 | |
921 | - regmap_read(omap4_dsi_mux_syscon, OMAP4_DSIPHY_SYSCON_OFFSET, ®); |
922 | + ret = regmap_read(omap4_dsi_mux_syscon, |
923 | + OMAP4_DSIPHY_SYSCON_OFFSET, |
924 | + ®); |
925 | + if (ret) |
926 | + return ret; |
927 | |
928 | reg &= ~enable_mask; |
929 | reg &= ~pipd_mask; |
930 | diff --git a/arch/arm/mach-s3c24xx/mach-osiris-dvs.c b/arch/arm/mach-s3c24xx/mach-osiris-dvs.c |
931 | index 058ce73137e8..5d819b6ea428 100644 |
932 | --- a/arch/arm/mach-s3c24xx/mach-osiris-dvs.c |
933 | +++ b/arch/arm/mach-s3c24xx/mach-osiris-dvs.c |
934 | @@ -65,16 +65,16 @@ static int osiris_dvs_notify(struct notifier_block *nb, |
935 | |
936 | switch (val) { |
937 | case CPUFREQ_PRECHANGE: |
938 | - if (old_dvs & !new_dvs || |
939 | - cur_dvs & !new_dvs) { |
940 | + if ((old_dvs && !new_dvs) || |
941 | + (cur_dvs && !new_dvs)) { |
942 | pr_debug("%s: exiting dvs\n", __func__); |
943 | cur_dvs = false; |
944 | gpio_set_value(OSIRIS_GPIO_DVS, 1); |
945 | } |
946 | break; |
947 | case CPUFREQ_POSTCHANGE: |
948 | - if (!old_dvs & new_dvs || |
949 | - !cur_dvs & new_dvs) { |
950 | + if ((!old_dvs && new_dvs) || |
951 | + (!cur_dvs && new_dvs)) { |
952 | pr_debug("entering dvs\n"); |
953 | cur_dvs = true; |
954 | gpio_set_value(OSIRIS_GPIO_DVS, 0); |
955 | diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c |
956 | index 1cb9c0f9b5d6..8211cf45ece1 100644 |
957 | --- a/arch/arm/mm/dma-mapping.c |
958 | +++ b/arch/arm/mm/dma-mapping.c |
959 | @@ -2400,4 +2400,6 @@ void arch_teardown_dma_ops(struct device *dev) |
960 | return; |
961 | |
962 | arm_teardown_iommu_dma_ops(dev); |
963 | + /* Let arch_setup_dma_ops() start again from scratch upon re-probe */ |
964 | + set_dma_ops(dev, NULL); |
965 | } |
966 | diff --git a/arch/arm64/boot/dts/rockchip/rk3399-gru-bob.dts b/arch/arm64/boot/dts/rockchip/rk3399-gru-bob.dts |
967 | index 1ee0dc0d9f10..d1cf404b8708 100644 |
968 | --- a/arch/arm64/boot/dts/rockchip/rk3399-gru-bob.dts |
969 | +++ b/arch/arm64/boot/dts/rockchip/rk3399-gru-bob.dts |
970 | @@ -22,7 +22,7 @@ |
971 | backlight = <&backlight>; |
972 | power-supply = <&pp3300_disp>; |
973 | |
974 | - ports { |
975 | + port { |
976 | panel_in_edp: endpoint { |
977 | remote-endpoint = <&edp_out_panel>; |
978 | }; |
979 | diff --git a/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts b/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts |
980 | index 2cc7c47d6a85..65637a5a4b21 100644 |
981 | --- a/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts |
982 | +++ b/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts |
983 | @@ -43,7 +43,7 @@ |
984 | backlight = <&backlight>; |
985 | power-supply = <&pp3300_disp>; |
986 | |
987 | - ports { |
988 | + port { |
989 | panel_in_edp: endpoint { |
990 | remote-endpoint = <&edp_out_panel>; |
991 | }; |
992 | diff --git a/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts b/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts |
993 | index fef2c0608999..b14d83919f14 100644 |
994 | --- a/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts |
995 | +++ b/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts |
996 | @@ -50,7 +50,7 @@ |
997 | pinctrl-0 = <&lcd_panel_reset>; |
998 | power-supply = <&vcc3v3_s0>; |
999 | |
1000 | - ports { |
1001 | + port { |
1002 | panel_in_edp: endpoint { |
1003 | remote-endpoint = <&edp_out_panel>; |
1004 | }; |
1005 | diff --git a/arch/arm64/crypto/aes-ce-ccm-core.S b/arch/arm64/crypto/aes-ce-ccm-core.S |
1006 | index e3a375c4cb83..1b151442dac1 100644 |
1007 | --- a/arch/arm64/crypto/aes-ce-ccm-core.S |
1008 | +++ b/arch/arm64/crypto/aes-ce-ccm-core.S |
1009 | @@ -74,12 +74,13 @@ ENTRY(ce_aes_ccm_auth_data) |
1010 | beq 10f |
1011 | ext v0.16b, v0.16b, v0.16b, #1 /* rotate out the mac bytes */ |
1012 | b 7b |
1013 | -8: mov w7, w8 |
1014 | +8: cbz w8, 91f |
1015 | + mov w7, w8 |
1016 | add w8, w8, #16 |
1017 | 9: ext v1.16b, v1.16b, v1.16b, #1 |
1018 | adds w7, w7, #1 |
1019 | bne 9b |
1020 | - eor v0.16b, v0.16b, v1.16b |
1021 | +91: eor v0.16b, v0.16b, v1.16b |
1022 | st1 {v0.16b}, [x0] |
1023 | 10: str w8, [x3] |
1024 | ret |
1025 | diff --git a/arch/arm64/crypto/aes-ce-ccm-glue.c b/arch/arm64/crypto/aes-ce-ccm-glue.c |
1026 | index 68b11aa690e4..986191e8c058 100644 |
1027 | --- a/arch/arm64/crypto/aes-ce-ccm-glue.c |
1028 | +++ b/arch/arm64/crypto/aes-ce-ccm-glue.c |
1029 | @@ -125,7 +125,7 @@ static void ccm_update_mac(struct crypto_aes_ctx *key, u8 mac[], u8 const in[], |
1030 | abytes -= added; |
1031 | } |
1032 | |
1033 | - while (abytes > AES_BLOCK_SIZE) { |
1034 | + while (abytes >= AES_BLOCK_SIZE) { |
1035 | __aes_arm64_encrypt(key->key_enc, mac, mac, |
1036 | num_rounds(key)); |
1037 | crypto_xor(mac, in, AES_BLOCK_SIZE); |
1038 | @@ -139,8 +139,6 @@ static void ccm_update_mac(struct crypto_aes_ctx *key, u8 mac[], u8 const in[], |
1039 | num_rounds(key)); |
1040 | crypto_xor(mac, in, abytes); |
1041 | *macp = abytes; |
1042 | - } else { |
1043 | - *macp = 0; |
1044 | } |
1045 | } |
1046 | } |
1047 | diff --git a/arch/arm64/crypto/aes-neonbs-core.S b/arch/arm64/crypto/aes-neonbs-core.S |
1048 | index e613a87f8b53..8432c8d0dea6 100644 |
1049 | --- a/arch/arm64/crypto/aes-neonbs-core.S |
1050 | +++ b/arch/arm64/crypto/aes-neonbs-core.S |
1051 | @@ -971,18 +971,22 @@ CPU_LE( rev x8, x8 ) |
1052 | |
1053 | 8: next_ctr v0 |
1054 | st1 {v0.16b}, [x24] |
1055 | - cbz x23, 0f |
1056 | + cbz x23, .Lctr_done |
1057 | |
1058 | cond_yield_neon 98b |
1059 | b 99b |
1060 | |
1061 | -0: frame_pop |
1062 | +.Lctr_done: |
1063 | + frame_pop |
1064 | ret |
1065 | |
1066 | /* |
1067 | * If we are handling the tail of the input (x6 != NULL), return the |
1068 | * final keystream block back to the caller. |
1069 | */ |
1070 | +0: cbz x25, 8b |
1071 | + st1 {v0.16b}, [x25] |
1072 | + b 8b |
1073 | 1: cbz x25, 8b |
1074 | st1 {v1.16b}, [x25] |
1075 | b 8b |
1076 | diff --git a/arch/arm64/crypto/crct10dif-ce-glue.c b/arch/arm64/crypto/crct10dif-ce-glue.c |
1077 | index 96f0cae4a022..617bcfc1b080 100644 |
1078 | --- a/arch/arm64/crypto/crct10dif-ce-glue.c |
1079 | +++ b/arch/arm64/crypto/crct10dif-ce-glue.c |
1080 | @@ -36,26 +36,13 @@ static int crct10dif_update(struct shash_desc *desc, const u8 *data, |
1081 | unsigned int length) |
1082 | { |
1083 | u16 *crc = shash_desc_ctx(desc); |
1084 | - unsigned int l; |
1085 | |
1086 | - if (unlikely((u64)data % CRC_T10DIF_PMULL_CHUNK_SIZE)) { |
1087 | - l = min_t(u32, length, CRC_T10DIF_PMULL_CHUNK_SIZE - |
1088 | - ((u64)data % CRC_T10DIF_PMULL_CHUNK_SIZE)); |
1089 | - |
1090 | - *crc = crc_t10dif_generic(*crc, data, l); |
1091 | - |
1092 | - length -= l; |
1093 | - data += l; |
1094 | - } |
1095 | - |
1096 | - if (length > 0) { |
1097 | - if (may_use_simd()) { |
1098 | - kernel_neon_begin(); |
1099 | - *crc = crc_t10dif_pmull(*crc, data, length); |
1100 | - kernel_neon_end(); |
1101 | - } else { |
1102 | - *crc = crc_t10dif_generic(*crc, data, length); |
1103 | - } |
1104 | + if (length >= CRC_T10DIF_PMULL_CHUNK_SIZE && may_use_simd()) { |
1105 | + kernel_neon_begin(); |
1106 | + *crc = crc_t10dif_pmull(*crc, data, length); |
1107 | + kernel_neon_end(); |
1108 | + } else { |
1109 | + *crc = crc_t10dif_generic(*crc, data, length); |
1110 | } |
1111 | |
1112 | return 0; |
1113 | diff --git a/arch/arm64/include/asm/hardirq.h b/arch/arm64/include/asm/hardirq.h |
1114 | index 1473fc2f7ab7..89691c86640a 100644 |
1115 | --- a/arch/arm64/include/asm/hardirq.h |
1116 | +++ b/arch/arm64/include/asm/hardirq.h |
1117 | @@ -17,8 +17,12 @@ |
1118 | #define __ASM_HARDIRQ_H |
1119 | |
1120 | #include <linux/cache.h> |
1121 | +#include <linux/percpu.h> |
1122 | #include <linux/threads.h> |
1123 | +#include <asm/barrier.h> |
1124 | #include <asm/irq.h> |
1125 | +#include <asm/kvm_arm.h> |
1126 | +#include <asm/sysreg.h> |
1127 | |
1128 | #define NR_IPI 7 |
1129 | |
1130 | @@ -37,6 +41,33 @@ u64 smp_irq_stat_cpu(unsigned int cpu); |
1131 | |
1132 | #define __ARCH_IRQ_EXIT_IRQS_DISABLED 1 |
1133 | |
1134 | +struct nmi_ctx { |
1135 | + u64 hcr; |
1136 | +}; |
1137 | + |
1138 | +DECLARE_PER_CPU(struct nmi_ctx, nmi_contexts); |
1139 | + |
1140 | +#define arch_nmi_enter() \ |
1141 | + do { \ |
1142 | + if (is_kernel_in_hyp_mode()) { \ |
1143 | + struct nmi_ctx *nmi_ctx = this_cpu_ptr(&nmi_contexts); \ |
1144 | + nmi_ctx->hcr = read_sysreg(hcr_el2); \ |
1145 | + if (!(nmi_ctx->hcr & HCR_TGE)) { \ |
1146 | + write_sysreg(nmi_ctx->hcr | HCR_TGE, hcr_el2); \ |
1147 | + isb(); \ |
1148 | + } \ |
1149 | + } \ |
1150 | + } while (0) |
1151 | + |
1152 | +#define arch_nmi_exit() \ |
1153 | + do { \ |
1154 | + if (is_kernel_in_hyp_mode()) { \ |
1155 | + struct nmi_ctx *nmi_ctx = this_cpu_ptr(&nmi_contexts); \ |
1156 | + if (!(nmi_ctx->hcr & HCR_TGE)) \ |
1157 | + write_sysreg(nmi_ctx->hcr, hcr_el2); \ |
1158 | + } \ |
1159 | + } while (0) |
1160 | + |
1161 | static inline void ack_bad_irq(unsigned int irq) |
1162 | { |
1163 | extern unsigned long irq_err_count; |
1164 | diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h |
1165 | index 3d6d7336f871..6abe4002945f 100644 |
1166 | --- a/arch/arm64/include/asm/kvm_host.h |
1167 | +++ b/arch/arm64/include/asm/kvm_host.h |
1168 | @@ -48,6 +48,7 @@ |
1169 | #define KVM_REQ_SLEEP \ |
1170 | KVM_ARCH_REQ_FLAGS(0, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) |
1171 | #define KVM_REQ_IRQ_PENDING KVM_ARCH_REQ(1) |
1172 | +#define KVM_REQ_VCPU_RESET KVM_ARCH_REQ(2) |
1173 | |
1174 | DECLARE_STATIC_KEY_FALSE(userspace_irqchip_in_use); |
1175 | |
1176 | @@ -206,6 +207,13 @@ struct kvm_cpu_context { |
1177 | |
1178 | typedef struct kvm_cpu_context kvm_cpu_context_t; |
1179 | |
1180 | +struct vcpu_reset_state { |
1181 | + unsigned long pc; |
1182 | + unsigned long r0; |
1183 | + bool be; |
1184 | + bool reset; |
1185 | +}; |
1186 | + |
1187 | struct kvm_vcpu_arch { |
1188 | struct kvm_cpu_context ctxt; |
1189 | |
1190 | @@ -295,6 +303,9 @@ struct kvm_vcpu_arch { |
1191 | /* Virtual SError ESR to restore when HCR_EL2.VSE is set */ |
1192 | u64 vsesr_el2; |
1193 | |
1194 | + /* Additional reset state */ |
1195 | + struct vcpu_reset_state reset_state; |
1196 | + |
1197 | /* True when deferrable sysregs are loaded on the physical CPU, |
1198 | * see kvm_vcpu_load_sysregs and kvm_vcpu_put_sysregs. */ |
1199 | bool sysregs_loaded_on_cpu; |
1200 | diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S |
1201 | index 651a06b1980f..77ca59598c8b 100644 |
1202 | --- a/arch/arm64/kernel/head.S |
1203 | +++ b/arch/arm64/kernel/head.S |
1204 | @@ -522,8 +522,7 @@ set_hcr: |
1205 | /* GICv3 system register access */ |
1206 | mrs x0, id_aa64pfr0_el1 |
1207 | ubfx x0, x0, #24, #4 |
1208 | - cmp x0, #1 |
1209 | - b.ne 3f |
1210 | + cbz x0, 3f |
1211 | |
1212 | mrs_s x0, SYS_ICC_SRE_EL2 |
1213 | orr x0, x0, #ICC_SRE_EL2_SRE // Set ICC_SRE_EL2.SRE==1 |
1214 | diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c |
1215 | index 780a12f59a8f..92fa81798fb9 100644 |
1216 | --- a/arch/arm64/kernel/irq.c |
1217 | +++ b/arch/arm64/kernel/irq.c |
1218 | @@ -33,6 +33,9 @@ |
1219 | |
1220 | unsigned long irq_err_count; |
1221 | |
1222 | +/* Only access this in an NMI enter/exit */ |
1223 | +DEFINE_PER_CPU(struct nmi_ctx, nmi_contexts); |
1224 | + |
1225 | DEFINE_PER_CPU(unsigned long *, irq_stack_ptr); |
1226 | |
1227 | int arch_show_interrupts(struct seq_file *p, int prec) |
1228 | diff --git a/arch/arm64/kernel/kgdb.c b/arch/arm64/kernel/kgdb.c |
1229 | index a20de58061a8..35f184a8fd85 100644 |
1230 | --- a/arch/arm64/kernel/kgdb.c |
1231 | +++ b/arch/arm64/kernel/kgdb.c |
1232 | @@ -244,27 +244,33 @@ int kgdb_arch_handle_exception(int exception_vector, int signo, |
1233 | |
1234 | static int kgdb_brk_fn(struct pt_regs *regs, unsigned int esr) |
1235 | { |
1236 | + if (user_mode(regs)) |
1237 | + return DBG_HOOK_ERROR; |
1238 | + |
1239 | kgdb_handle_exception(1, SIGTRAP, 0, regs); |
1240 | - return 0; |
1241 | + return DBG_HOOK_HANDLED; |
1242 | } |
1243 | NOKPROBE_SYMBOL(kgdb_brk_fn) |
1244 | |
1245 | static int kgdb_compiled_brk_fn(struct pt_regs *regs, unsigned int esr) |
1246 | { |
1247 | + if (user_mode(regs)) |
1248 | + return DBG_HOOK_ERROR; |
1249 | + |
1250 | compiled_break = 1; |
1251 | kgdb_handle_exception(1, SIGTRAP, 0, regs); |
1252 | |
1253 | - return 0; |
1254 | + return DBG_HOOK_HANDLED; |
1255 | } |
1256 | NOKPROBE_SYMBOL(kgdb_compiled_brk_fn); |
1257 | |
1258 | static int kgdb_step_brk_fn(struct pt_regs *regs, unsigned int esr) |
1259 | { |
1260 | - if (!kgdb_single_step) |
1261 | + if (user_mode(regs) || !kgdb_single_step) |
1262 | return DBG_HOOK_ERROR; |
1263 | |
1264 | kgdb_handle_exception(1, SIGTRAP, 0, regs); |
1265 | - return 0; |
1266 | + return DBG_HOOK_HANDLED; |
1267 | } |
1268 | NOKPROBE_SYMBOL(kgdb_step_brk_fn); |
1269 | |
1270 | diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c |
1271 | index 30bb13797034..2d63df112b89 100644 |
1272 | --- a/arch/arm64/kernel/probes/kprobes.c |
1273 | +++ b/arch/arm64/kernel/probes/kprobes.c |
1274 | @@ -450,6 +450,9 @@ kprobe_single_step_handler(struct pt_regs *regs, unsigned int esr) |
1275 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
1276 | int retval; |
1277 | |
1278 | + if (user_mode(regs)) |
1279 | + return DBG_HOOK_ERROR; |
1280 | + |
1281 | /* return error if this is not our step */ |
1282 | retval = kprobe_ss_hit(kcb, instruction_pointer(regs)); |
1283 | |
1284 | @@ -466,6 +469,9 @@ kprobe_single_step_handler(struct pt_regs *regs, unsigned int esr) |
1285 | int __kprobes |
1286 | kprobe_breakpoint_handler(struct pt_regs *regs, unsigned int esr) |
1287 | { |
1288 | + if (user_mode(regs)) |
1289 | + return DBG_HOOK_ERROR; |
1290 | + |
1291 | kprobe_handler(regs); |
1292 | return DBG_HOOK_HANDLED; |
1293 | } |
1294 | diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c |
1295 | index a1c32c1f2267..6290a4e81d57 100644 |
1296 | --- a/arch/arm64/kvm/hyp/switch.c |
1297 | +++ b/arch/arm64/kvm/hyp/switch.c |
1298 | @@ -23,6 +23,7 @@ |
1299 | #include <kvm/arm_psci.h> |
1300 | |
1301 | #include <asm/cpufeature.h> |
1302 | +#include <asm/kprobes.h> |
1303 | #include <asm/kvm_asm.h> |
1304 | #include <asm/kvm_emulate.h> |
1305 | #include <asm/kvm_host.h> |
1306 | @@ -107,6 +108,7 @@ static void activate_traps_vhe(struct kvm_vcpu *vcpu) |
1307 | |
1308 | write_sysreg(kvm_get_hyp_vector(), vbar_el1); |
1309 | } |
1310 | +NOKPROBE_SYMBOL(activate_traps_vhe); |
1311 | |
1312 | static void __hyp_text __activate_traps_nvhe(struct kvm_vcpu *vcpu) |
1313 | { |
1314 | @@ -146,6 +148,7 @@ static void deactivate_traps_vhe(void) |
1315 | write_sysreg(CPACR_EL1_DEFAULT, cpacr_el1); |
1316 | write_sysreg(vectors, vbar_el1); |
1317 | } |
1318 | +NOKPROBE_SYMBOL(deactivate_traps_vhe); |
1319 | |
1320 | static void __hyp_text __deactivate_traps_nvhe(void) |
1321 | { |
1322 | @@ -529,6 +532,7 @@ int kvm_vcpu_run_vhe(struct kvm_vcpu *vcpu) |
1323 | |
1324 | return exit_code; |
1325 | } |
1326 | +NOKPROBE_SYMBOL(kvm_vcpu_run_vhe); |
1327 | |
1328 | /* Switch to the guest for legacy non-VHE systems */ |
1329 | int __hyp_text __kvm_vcpu_run_nvhe(struct kvm_vcpu *vcpu) |
1330 | @@ -636,6 +640,7 @@ static void __hyp_call_panic_vhe(u64 spsr, u64 elr, u64 par, |
1331 | read_sysreg_el2(esr), read_sysreg_el2(far), |
1332 | read_sysreg(hpfar_el2), par, vcpu); |
1333 | } |
1334 | +NOKPROBE_SYMBOL(__hyp_call_panic_vhe); |
1335 | |
1336 | void __hyp_text __noreturn hyp_panic(struct kvm_cpu_context *host_ctxt) |
1337 | { |
1338 | diff --git a/arch/arm64/kvm/hyp/sysreg-sr.c b/arch/arm64/kvm/hyp/sysreg-sr.c |
1339 | index 9ce223944983..963d669ae3a2 100644 |
1340 | --- a/arch/arm64/kvm/hyp/sysreg-sr.c |
1341 | +++ b/arch/arm64/kvm/hyp/sysreg-sr.c |
1342 | @@ -18,6 +18,7 @@ |
1343 | #include <linux/compiler.h> |
1344 | #include <linux/kvm_host.h> |
1345 | |
1346 | +#include <asm/kprobes.h> |
1347 | #include <asm/kvm_asm.h> |
1348 | #include <asm/kvm_emulate.h> |
1349 | #include <asm/kvm_hyp.h> |
1350 | @@ -98,12 +99,14 @@ void sysreg_save_host_state_vhe(struct kvm_cpu_context *ctxt) |
1351 | { |
1352 | __sysreg_save_common_state(ctxt); |
1353 | } |
1354 | +NOKPROBE_SYMBOL(sysreg_save_host_state_vhe); |
1355 | |
1356 | void sysreg_save_guest_state_vhe(struct kvm_cpu_context *ctxt) |
1357 | { |
1358 | __sysreg_save_common_state(ctxt); |
1359 | __sysreg_save_el2_return_state(ctxt); |
1360 | } |
1361 | +NOKPROBE_SYMBOL(sysreg_save_guest_state_vhe); |
1362 | |
1363 | static void __hyp_text __sysreg_restore_common_state(struct kvm_cpu_context *ctxt) |
1364 | { |
1365 | @@ -171,12 +174,14 @@ void sysreg_restore_host_state_vhe(struct kvm_cpu_context *ctxt) |
1366 | { |
1367 | __sysreg_restore_common_state(ctxt); |
1368 | } |
1369 | +NOKPROBE_SYMBOL(sysreg_restore_host_state_vhe); |
1370 | |
1371 | void sysreg_restore_guest_state_vhe(struct kvm_cpu_context *ctxt) |
1372 | { |
1373 | __sysreg_restore_common_state(ctxt); |
1374 | __sysreg_restore_el2_return_state(ctxt); |
1375 | } |
1376 | +NOKPROBE_SYMBOL(sysreg_restore_guest_state_vhe); |
1377 | |
1378 | void __hyp_text __sysreg32_save_state(struct kvm_vcpu *vcpu) |
1379 | { |
1380 | diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c |
1381 | index e37c78bbe1ca..18b9a522a2b3 100644 |
1382 | --- a/arch/arm64/kvm/reset.c |
1383 | +++ b/arch/arm64/kvm/reset.c |
1384 | @@ -31,6 +31,7 @@ |
1385 | #include <asm/kvm_arm.h> |
1386 | #include <asm/kvm_asm.h> |
1387 | #include <asm/kvm_coproc.h> |
1388 | +#include <asm/kvm_emulate.h> |
1389 | #include <asm/kvm_mmu.h> |
1390 | |
1391 | /* |
1392 | @@ -99,16 +100,33 @@ int kvm_arch_dev_ioctl_check_extension(struct kvm *kvm, long ext) |
1393 | * This function finds the right table above and sets the registers on |
1394 | * the virtual CPU struct to their architecturally defined reset |
1395 | * values. |
1396 | + * |
1397 | + * Note: This function can be called from two paths: The KVM_ARM_VCPU_INIT |
1398 | + * ioctl or as part of handling a request issued by another VCPU in the PSCI |
1399 | + * handling code. In the first case, the VCPU will not be loaded, and in the |
1400 | + * second case the VCPU will be loaded. Because this function operates purely |
1401 | + * on the memory-backed valus of system registers, we want to do a full put if |
1402 | + * we were loaded (handling a request) and load the values back at the end of |
1403 | + * the function. Otherwise we leave the state alone. In both cases, we |
1404 | + * disable preemption around the vcpu reset as we would otherwise race with |
1405 | + * preempt notifiers which also call put/load. |
1406 | */ |
1407 | int kvm_reset_vcpu(struct kvm_vcpu *vcpu) |
1408 | { |
1409 | const struct kvm_regs *cpu_reset; |
1410 | + int ret = -EINVAL; |
1411 | + bool loaded; |
1412 | + |
1413 | + preempt_disable(); |
1414 | + loaded = (vcpu->cpu != -1); |
1415 | + if (loaded) |
1416 | + kvm_arch_vcpu_put(vcpu); |
1417 | |
1418 | switch (vcpu->arch.target) { |
1419 | default: |
1420 | if (test_bit(KVM_ARM_VCPU_EL1_32BIT, vcpu->arch.features)) { |
1421 | if (!cpu_has_32bit_el1()) |
1422 | - return -EINVAL; |
1423 | + goto out; |
1424 | cpu_reset = &default_regs_reset32; |
1425 | } else { |
1426 | cpu_reset = &default_regs_reset; |
1427 | @@ -123,6 +141,29 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu) |
1428 | /* Reset system registers */ |
1429 | kvm_reset_sys_regs(vcpu); |
1430 | |
1431 | + /* |
1432 | + * Additional reset state handling that PSCI may have imposed on us. |
1433 | + * Must be done after all the sys_reg reset. |
1434 | + */ |
1435 | + if (vcpu->arch.reset_state.reset) { |
1436 | + unsigned long target_pc = vcpu->arch.reset_state.pc; |
1437 | + |
1438 | + /* Gracefully handle Thumb2 entry point */ |
1439 | + if (vcpu_mode_is_32bit(vcpu) && (target_pc & 1)) { |
1440 | + target_pc &= ~1UL; |
1441 | + vcpu_set_thumb(vcpu); |
1442 | + } |
1443 | + |
1444 | + /* Propagate caller endianness */ |
1445 | + if (vcpu->arch.reset_state.be) |
1446 | + kvm_vcpu_set_be(vcpu); |
1447 | + |
1448 | + *vcpu_pc(vcpu) = target_pc; |
1449 | + vcpu_set_reg(vcpu, 0, vcpu->arch.reset_state.r0); |
1450 | + |
1451 | + vcpu->arch.reset_state.reset = false; |
1452 | + } |
1453 | + |
1454 | /* Reset PMU */ |
1455 | kvm_pmu_vcpu_reset(vcpu); |
1456 | |
1457 | @@ -131,5 +172,10 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu) |
1458 | vcpu->arch.workaround_flags |= VCPU_WORKAROUND_2_FLAG; |
1459 | |
1460 | /* Reset timer */ |
1461 | - return kvm_timer_vcpu_reset(vcpu); |
1462 | + ret = kvm_timer_vcpu_reset(vcpu); |
1463 | +out: |
1464 | + if (loaded) |
1465 | + kvm_arch_vcpu_load(vcpu, smp_processor_id()); |
1466 | + preempt_enable(); |
1467 | + return ret; |
1468 | } |
1469 | diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c |
1470 | index 22fbbdbece3c..d112af75680b 100644 |
1471 | --- a/arch/arm64/kvm/sys_regs.c |
1472 | +++ b/arch/arm64/kvm/sys_regs.c |
1473 | @@ -1456,7 +1456,7 @@ static const struct sys_reg_desc sys_reg_descs[] = { |
1474 | |
1475 | { SYS_DESC(SYS_DACR32_EL2), NULL, reset_unknown, DACR32_EL2 }, |
1476 | { SYS_DESC(SYS_IFSR32_EL2), NULL, reset_unknown, IFSR32_EL2 }, |
1477 | - { SYS_DESC(SYS_FPEXC32_EL2), NULL, reset_val, FPEXC32_EL2, 0x70 }, |
1478 | + { SYS_DESC(SYS_FPEXC32_EL2), NULL, reset_val, FPEXC32_EL2, 0x700 }, |
1479 | }; |
1480 | |
1481 | static bool trap_dbgidr(struct kvm_vcpu *vcpu, |
1482 | @@ -2586,7 +2586,9 @@ void kvm_reset_sys_regs(struct kvm_vcpu *vcpu) |
1483 | table = get_target_table(vcpu->arch.target, true, &num); |
1484 | reset_sys_reg_descs(vcpu, table, num); |
1485 | |
1486 | - for (num = 1; num < NR_SYS_REGS; num++) |
1487 | - if (__vcpu_sys_reg(vcpu, num) == 0x4242424242424242) |
1488 | - panic("Didn't reset __vcpu_sys_reg(%zi)", num); |
1489 | + for (num = 1; num < NR_SYS_REGS; num++) { |
1490 | + if (WARN(__vcpu_sys_reg(vcpu, num) == 0x4242424242424242, |
1491 | + "Didn't reset __vcpu_sys_reg(%zi)\n", num)) |
1492 | + break; |
1493 | + } |
1494 | } |
1495 | diff --git a/arch/m68k/Makefile b/arch/m68k/Makefile |
1496 | index 997c9f20ea0f..4474e51ee53e 100644 |
1497 | --- a/arch/m68k/Makefile |
1498 | +++ b/arch/m68k/Makefile |
1499 | @@ -58,7 +58,10 @@ cpuflags-$(CONFIG_M5206e) := $(call cc-option,-mcpu=5206e,-m5200) |
1500 | cpuflags-$(CONFIG_M5206) := $(call cc-option,-mcpu=5206,-m5200) |
1501 | |
1502 | KBUILD_AFLAGS += $(cpuflags-y) |
1503 | -KBUILD_CFLAGS += $(cpuflags-y) -pipe |
1504 | +KBUILD_CFLAGS += $(cpuflags-y) |
1505 | + |
1506 | +KBUILD_CFLAGS += -pipe -ffreestanding |
1507 | + |
1508 | ifdef CONFIG_MMU |
1509 | # without -fno-strength-reduce the 53c7xx.c driver fails ;-( |
1510 | KBUILD_CFLAGS += -fno-strength-reduce -ffixed-a2 |
1511 | diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h |
1512 | index 2c1c53d12179..f567ace7a9e9 100644 |
1513 | --- a/arch/mips/include/asm/kvm_host.h |
1514 | +++ b/arch/mips/include/asm/kvm_host.h |
1515 | @@ -1131,7 +1131,7 @@ static inline void kvm_arch_hardware_unsetup(void) {} |
1516 | static inline void kvm_arch_sync_events(struct kvm *kvm) {} |
1517 | static inline void kvm_arch_free_memslot(struct kvm *kvm, |
1518 | struct kvm_memory_slot *free, struct kvm_memory_slot *dont) {} |
1519 | -static inline void kvm_arch_memslots_updated(struct kvm *kvm, struct kvm_memslots *slots) {} |
1520 | +static inline void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) {} |
1521 | static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} |
1522 | static inline void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) {} |
1523 | static inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) {} |
1524 | diff --git a/arch/powerpc/include/asm/book3s/64/hugetlb.h b/arch/powerpc/include/asm/book3s/64/hugetlb.h |
1525 | index 50888388a359..02544939ef0b 100644 |
1526 | --- a/arch/powerpc/include/asm/book3s/64/hugetlb.h |
1527 | +++ b/arch/powerpc/include/asm/book3s/64/hugetlb.h |
1528 | @@ -35,6 +35,14 @@ static inline int hstate_get_psize(struct hstate *hstate) |
1529 | #ifdef CONFIG_ARCH_HAS_GIGANTIC_PAGE |
1530 | static inline bool gigantic_page_supported(void) |
1531 | { |
1532 | + /* |
1533 | + * We used gigantic page reservation with hypervisor assist in some case. |
1534 | + * We cannot use runtime allocation of gigantic pages in those platforms |
1535 | + * This is hash translation mode LPARs. |
1536 | + */ |
1537 | + if (firmware_has_feature(FW_FEATURE_LPAR) && !radix_enabled()) |
1538 | + return false; |
1539 | + |
1540 | return true; |
1541 | } |
1542 | #endif |
1543 | diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h |
1544 | index 906bcbdfd2a1..bccc5051249e 100644 |
1545 | --- a/arch/powerpc/include/asm/kvm_host.h |
1546 | +++ b/arch/powerpc/include/asm/kvm_host.h |
1547 | @@ -822,7 +822,7 @@ struct kvm_vcpu_arch { |
1548 | static inline void kvm_arch_hardware_disable(void) {} |
1549 | static inline void kvm_arch_hardware_unsetup(void) {} |
1550 | static inline void kvm_arch_sync_events(struct kvm *kvm) {} |
1551 | -static inline void kvm_arch_memslots_updated(struct kvm *kvm, struct kvm_memslots *slots) {} |
1552 | +static inline void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) {} |
1553 | static inline void kvm_arch_flush_shadow_all(struct kvm *kvm) {} |
1554 | static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} |
1555 | static inline void kvm_arch_exit(void) {} |
1556 | diff --git a/arch/powerpc/include/asm/powernv.h b/arch/powerpc/include/asm/powernv.h |
1557 | index 2f3ff7a27881..d85fcfea32ca 100644 |
1558 | --- a/arch/powerpc/include/asm/powernv.h |
1559 | +++ b/arch/powerpc/include/asm/powernv.h |
1560 | @@ -23,6 +23,8 @@ extern int pnv_npu2_handle_fault(struct npu_context *context, uintptr_t *ea, |
1561 | unsigned long *flags, unsigned long *status, |
1562 | int count); |
1563 | |
1564 | +void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val); |
1565 | + |
1566 | void pnv_tm_init(void); |
1567 | #else |
1568 | static inline void powernv_set_nmmu_ptcr(unsigned long ptcr) { } |
1569 | diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S |
1570 | index e58c3f467db5..26b3f853cbf6 100644 |
1571 | --- a/arch/powerpc/kernel/entry_32.S |
1572 | +++ b/arch/powerpc/kernel/entry_32.S |
1573 | @@ -745,6 +745,9 @@ fast_exception_return: |
1574 | mtcr r10 |
1575 | lwz r10,_LINK(r11) |
1576 | mtlr r10 |
1577 | + /* Clear the exception_marker on the stack to avoid confusing stacktrace */ |
1578 | + li r10, 0 |
1579 | + stw r10, 8(r11) |
1580 | REST_GPR(10, r11) |
1581 | #if defined(CONFIG_PPC_8xx) && defined(CONFIG_PERF_EVENTS) |
1582 | mtspr SPRN_NRI, r0 |
1583 | @@ -982,6 +985,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX) |
1584 | mtcrf 0xFF,r10 |
1585 | mtlr r11 |
1586 | |
1587 | + /* Clear the exception_marker on the stack to avoid confusing stacktrace */ |
1588 | + li r10, 0 |
1589 | + stw r10, 8(r1) |
1590 | /* |
1591 | * Once we put values in SRR0 and SRR1, we are in a state |
1592 | * where exceptions are not recoverable, since taking an |
1593 | @@ -1021,6 +1027,9 @@ exc_exit_restart_end: |
1594 | mtlr r11 |
1595 | lwz r10,_CCR(r1) |
1596 | mtcrf 0xff,r10 |
1597 | + /* Clear the exception_marker on the stack to avoid confusing stacktrace */ |
1598 | + li r10, 0 |
1599 | + stw r10, 8(r1) |
1600 | REST_2GPRS(9, r1) |
1601 | .globl exc_exit_restart |
1602 | exc_exit_restart: |
1603 | diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c |
1604 | index bb6ac471a784..d29f2dca725b 100644 |
1605 | --- a/arch/powerpc/kernel/process.c |
1606 | +++ b/arch/powerpc/kernel/process.c |
1607 | @@ -180,7 +180,7 @@ static void __giveup_fpu(struct task_struct *tsk) |
1608 | |
1609 | save_fpu(tsk); |
1610 | msr = tsk->thread.regs->msr; |
1611 | - msr &= ~MSR_FP; |
1612 | + msr &= ~(MSR_FP|MSR_FE0|MSR_FE1); |
1613 | #ifdef CONFIG_VSX |
1614 | if (cpu_has_feature(CPU_FTR_VSX)) |
1615 | msr &= ~MSR_VSX; |
1616 | diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c |
1617 | index 9667666eb18e..e08b32ccf1d9 100644 |
1618 | --- a/arch/powerpc/kernel/ptrace.c |
1619 | +++ b/arch/powerpc/kernel/ptrace.c |
1620 | @@ -561,6 +561,7 @@ static int vr_get(struct task_struct *target, const struct user_regset *regset, |
1621 | /* |
1622 | * Copy out only the low-order word of vrsave. |
1623 | */ |
1624 | + int start, end; |
1625 | union { |
1626 | elf_vrreg_t reg; |
1627 | u32 word; |
1628 | @@ -569,8 +570,10 @@ static int vr_get(struct task_struct *target, const struct user_regset *regset, |
1629 | |
1630 | vrsave.word = target->thread.vrsave; |
1631 | |
1632 | + start = 33 * sizeof(vector128); |
1633 | + end = start + sizeof(vrsave); |
1634 | ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, &vrsave, |
1635 | - 33 * sizeof(vector128), -1); |
1636 | + start, end); |
1637 | } |
1638 | |
1639 | return ret; |
1640 | @@ -608,6 +611,7 @@ static int vr_set(struct task_struct *target, const struct user_regset *regset, |
1641 | /* |
1642 | * We use only the first word of vrsave. |
1643 | */ |
1644 | + int start, end; |
1645 | union { |
1646 | elf_vrreg_t reg; |
1647 | u32 word; |
1648 | @@ -616,8 +620,10 @@ static int vr_set(struct task_struct *target, const struct user_regset *regset, |
1649 | |
1650 | vrsave.word = target->thread.vrsave; |
1651 | |
1652 | + start = 33 * sizeof(vector128); |
1653 | + end = start + sizeof(vrsave); |
1654 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &vrsave, |
1655 | - 33 * sizeof(vector128), -1); |
1656 | + start, end); |
1657 | if (!ret) |
1658 | target->thread.vrsave = vrsave.word; |
1659 | } |
1660 | diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c |
1661 | index 8689a02b7df8..02fe6d020174 100644 |
1662 | --- a/arch/powerpc/kernel/traps.c |
1663 | +++ b/arch/powerpc/kernel/traps.c |
1664 | @@ -767,15 +767,15 @@ void machine_check_exception(struct pt_regs *regs) |
1665 | if (check_io_access(regs)) |
1666 | goto bail; |
1667 | |
1668 | - /* Must die if the interrupt is not recoverable */ |
1669 | - if (!(regs->msr & MSR_RI)) |
1670 | - nmi_panic(regs, "Unrecoverable Machine check"); |
1671 | - |
1672 | if (!nested) |
1673 | nmi_exit(); |
1674 | |
1675 | die("Machine check", regs, SIGBUS); |
1676 | |
1677 | + /* Must die if the interrupt is not recoverable */ |
1678 | + if (!(regs->msr & MSR_RI)) |
1679 | + nmi_panic(regs, "Unrecoverable Machine check"); |
1680 | + |
1681 | return; |
1682 | |
1683 | bail: |
1684 | @@ -1545,8 +1545,8 @@ bail: |
1685 | |
1686 | void StackOverflow(struct pt_regs *regs) |
1687 | { |
1688 | - printk(KERN_CRIT "Kernel stack overflow in process %p, r1=%lx\n", |
1689 | - current, regs->gpr[1]); |
1690 | + pr_crit("Kernel stack overflow in process %s[%d], r1=%lx\n", |
1691 | + current->comm, task_pid_nr(current), regs->gpr[1]); |
1692 | debugger(regs); |
1693 | show_regs(regs); |
1694 | panic("kernel stack overflow"); |
1695 | diff --git a/arch/powerpc/platforms/83xx/suspend-asm.S b/arch/powerpc/platforms/83xx/suspend-asm.S |
1696 | index 3d1ecd211776..8137f77abad5 100644 |
1697 | --- a/arch/powerpc/platforms/83xx/suspend-asm.S |
1698 | +++ b/arch/powerpc/platforms/83xx/suspend-asm.S |
1699 | @@ -26,13 +26,13 @@ |
1700 | #define SS_MSR 0x74 |
1701 | #define SS_SDR1 0x78 |
1702 | #define SS_LR 0x7c |
1703 | -#define SS_SPRG 0x80 /* 4 SPRGs */ |
1704 | -#define SS_DBAT 0x90 /* 8 DBATs */ |
1705 | -#define SS_IBAT 0xd0 /* 8 IBATs */ |
1706 | -#define SS_TB 0x110 |
1707 | -#define SS_CR 0x118 |
1708 | -#define SS_GPREG 0x11c /* r12-r31 */ |
1709 | -#define STATE_SAVE_SIZE 0x16c |
1710 | +#define SS_SPRG 0x80 /* 8 SPRGs */ |
1711 | +#define SS_DBAT 0xa0 /* 8 DBATs */ |
1712 | +#define SS_IBAT 0xe0 /* 8 IBATs */ |
1713 | +#define SS_TB 0x120 |
1714 | +#define SS_CR 0x128 |
1715 | +#define SS_GPREG 0x12c /* r12-r31 */ |
1716 | +#define STATE_SAVE_SIZE 0x17c |
1717 | |
1718 | .section .data |
1719 | .align 5 |
1720 | @@ -103,6 +103,16 @@ _GLOBAL(mpc83xx_enter_deep_sleep) |
1721 | stw r7, SS_SPRG+12(r3) |
1722 | stw r8, SS_SDR1(r3) |
1723 | |
1724 | + mfspr r4, SPRN_SPRG4 |
1725 | + mfspr r5, SPRN_SPRG5 |
1726 | + mfspr r6, SPRN_SPRG6 |
1727 | + mfspr r7, SPRN_SPRG7 |
1728 | + |
1729 | + stw r4, SS_SPRG+16(r3) |
1730 | + stw r5, SS_SPRG+20(r3) |
1731 | + stw r6, SS_SPRG+24(r3) |
1732 | + stw r7, SS_SPRG+28(r3) |
1733 | + |
1734 | mfspr r4, SPRN_DBAT0U |
1735 | mfspr r5, SPRN_DBAT0L |
1736 | mfspr r6, SPRN_DBAT1U |
1737 | @@ -493,6 +503,16 @@ mpc83xx_deep_resume: |
1738 | mtspr SPRN_IBAT7U, r6 |
1739 | mtspr SPRN_IBAT7L, r7 |
1740 | |
1741 | + lwz r4, SS_SPRG+16(r3) |
1742 | + lwz r5, SS_SPRG+20(r3) |
1743 | + lwz r6, SS_SPRG+24(r3) |
1744 | + lwz r7, SS_SPRG+28(r3) |
1745 | + |
1746 | + mtspr SPRN_SPRG4, r4 |
1747 | + mtspr SPRN_SPRG5, r5 |
1748 | + mtspr SPRN_SPRG6, r6 |
1749 | + mtspr SPRN_SPRG7, r7 |
1750 | + |
1751 | lwz r4, SS_SPRG+0(r3) |
1752 | lwz r5, SS_SPRG+4(r3) |
1753 | lwz r6, SS_SPRG+8(r3) |
1754 | diff --git a/arch/powerpc/platforms/embedded6xx/wii.c b/arch/powerpc/platforms/embedded6xx/wii.c |
1755 | index 403523c061ba..343bffd20fca 100644 |
1756 | --- a/arch/powerpc/platforms/embedded6xx/wii.c |
1757 | +++ b/arch/powerpc/platforms/embedded6xx/wii.c |
1758 | @@ -83,6 +83,10 @@ unsigned long __init wii_mmu_mapin_mem2(unsigned long top) |
1759 | /* MEM2 64MB@0x10000000 */ |
1760 | delta = wii_hole_start + wii_hole_size; |
1761 | size = top - delta; |
1762 | + |
1763 | + if (__map_without_bats) |
1764 | + return delta; |
1765 | + |
1766 | for (bl = 128<<10; bl < max_size; bl <<= 1) { |
1767 | if (bl * 2 > size) |
1768 | break; |
1769 | diff --git a/arch/powerpc/platforms/powernv/idle.c b/arch/powerpc/platforms/powernv/idle.c |
1770 | index 35f699ebb662..e52f9b06dd9c 100644 |
1771 | --- a/arch/powerpc/platforms/powernv/idle.c |
1772 | +++ b/arch/powerpc/platforms/powernv/idle.c |
1773 | @@ -458,7 +458,8 @@ EXPORT_SYMBOL_GPL(pnv_power9_force_smt4_release); |
1774 | #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ |
1775 | |
1776 | #ifdef CONFIG_HOTPLUG_CPU |
1777 | -static void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val) |
1778 | + |
1779 | +void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val) |
1780 | { |
1781 | u64 pir = get_hard_smp_processor_id(cpu); |
1782 | |
1783 | @@ -481,20 +482,6 @@ unsigned long pnv_cpu_offline(unsigned int cpu) |
1784 | { |
1785 | unsigned long srr1; |
1786 | u32 idle_states = pnv_get_supported_cpuidle_states(); |
1787 | - u64 lpcr_val; |
1788 | - |
1789 | - /* |
1790 | - * We don't want to take decrementer interrupts while we are |
1791 | - * offline, so clear LPCR:PECE1. We keep PECE2 (and |
1792 | - * LPCR_PECE_HVEE on P9) enabled as to let IPIs in. |
1793 | - * |
1794 | - * If the CPU gets woken up by a special wakeup, ensure that |
1795 | - * the SLW engine sets LPCR with decrementer bit cleared, else |
1796 | - * the CPU will come back to the kernel due to a spurious |
1797 | - * wakeup. |
1798 | - */ |
1799 | - lpcr_val = mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1; |
1800 | - pnv_program_cpu_hotplug_lpcr(cpu, lpcr_val); |
1801 | |
1802 | __ppc64_runlatch_off(); |
1803 | |
1804 | @@ -526,16 +513,6 @@ unsigned long pnv_cpu_offline(unsigned int cpu) |
1805 | |
1806 | __ppc64_runlatch_on(); |
1807 | |
1808 | - /* |
1809 | - * Re-enable decrementer interrupts in LPCR. |
1810 | - * |
1811 | - * Further, we want stop states to be woken up by decrementer |
1812 | - * for non-hotplug cases. So program the LPCR via stop api as |
1813 | - * well. |
1814 | - */ |
1815 | - lpcr_val = mfspr(SPRN_LPCR) | (u64)LPCR_PECE1; |
1816 | - pnv_program_cpu_hotplug_lpcr(cpu, lpcr_val); |
1817 | - |
1818 | return srr1; |
1819 | } |
1820 | #endif |
1821 | diff --git a/arch/powerpc/platforms/powernv/opal-msglog.c b/arch/powerpc/platforms/powernv/opal-msglog.c |
1822 | index acd3206dfae3..06628c71cef6 100644 |
1823 | --- a/arch/powerpc/platforms/powernv/opal-msglog.c |
1824 | +++ b/arch/powerpc/platforms/powernv/opal-msglog.c |
1825 | @@ -98,7 +98,7 @@ static ssize_t opal_msglog_read(struct file *file, struct kobject *kobj, |
1826 | } |
1827 | |
1828 | static struct bin_attribute opal_msglog_attr = { |
1829 | - .attr = {.name = "msglog", .mode = 0444}, |
1830 | + .attr = {.name = "msglog", .mode = 0400}, |
1831 | .read = opal_msglog_read |
1832 | }; |
1833 | |
1834 | diff --git a/arch/powerpc/platforms/powernv/smp.c b/arch/powerpc/platforms/powernv/smp.c |
1835 | index 0d354e19ef92..db09c7022635 100644 |
1836 | --- a/arch/powerpc/platforms/powernv/smp.c |
1837 | +++ b/arch/powerpc/platforms/powernv/smp.c |
1838 | @@ -39,6 +39,7 @@ |
1839 | #include <asm/cpuidle.h> |
1840 | #include <asm/kexec.h> |
1841 | #include <asm/reg.h> |
1842 | +#include <asm/powernv.h> |
1843 | |
1844 | #include "powernv.h" |
1845 | |
1846 | @@ -153,6 +154,7 @@ static void pnv_smp_cpu_kill_self(void) |
1847 | { |
1848 | unsigned int cpu; |
1849 | unsigned long srr1, wmask; |
1850 | + u64 lpcr_val; |
1851 | |
1852 | /* Standard hot unplug procedure */ |
1853 | /* |
1854 | @@ -174,6 +176,19 @@ static void pnv_smp_cpu_kill_self(void) |
1855 | if (cpu_has_feature(CPU_FTR_ARCH_207S)) |
1856 | wmask = SRR1_WAKEMASK_P8; |
1857 | |
1858 | + /* |
1859 | + * We don't want to take decrementer interrupts while we are |
1860 | + * offline, so clear LPCR:PECE1. We keep PECE2 (and |
1861 | + * LPCR_PECE_HVEE on P9) enabled so as to let IPIs in. |
1862 | + * |
1863 | + * If the CPU gets woken up by a special wakeup, ensure that |
1864 | + * the SLW engine sets LPCR with decrementer bit cleared, else |
1865 | + * the CPU will come back to the kernel due to a spurious |
1866 | + * wakeup. |
1867 | + */ |
1868 | + lpcr_val = mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1; |
1869 | + pnv_program_cpu_hotplug_lpcr(cpu, lpcr_val); |
1870 | + |
1871 | while (!generic_check_cpu_restart(cpu)) { |
1872 | /* |
1873 | * Clear IPI flag, since we don't handle IPIs while |
1874 | @@ -246,6 +261,16 @@ static void pnv_smp_cpu_kill_self(void) |
1875 | |
1876 | } |
1877 | |
1878 | + /* |
1879 | + * Re-enable decrementer interrupts in LPCR. |
1880 | + * |
1881 | + * Further, we want stop states to be woken up by decrementer |
1882 | + * for non-hotplug cases. So program the LPCR via stop api as |
1883 | + * well. |
1884 | + */ |
1885 | + lpcr_val = mfspr(SPRN_LPCR) | (u64)LPCR_PECE1; |
1886 | + pnv_program_cpu_hotplug_lpcr(cpu, lpcr_val); |
1887 | + |
1888 | DBG("CPU%d coming online...\n", cpu); |
1889 | } |
1890 | |
1891 | diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h |
1892 | index 29c940bf8506..dad110e9f41b 100644 |
1893 | --- a/arch/s390/include/asm/kvm_host.h |
1894 | +++ b/arch/s390/include/asm/kvm_host.h |
1895 | @@ -865,7 +865,7 @@ static inline void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) {} |
1896 | static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} |
1897 | static inline void kvm_arch_free_memslot(struct kvm *kvm, |
1898 | struct kvm_memory_slot *free, struct kvm_memory_slot *dont) {} |
1899 | -static inline void kvm_arch_memslots_updated(struct kvm *kvm, struct kvm_memslots *slots) {} |
1900 | +static inline void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) {} |
1901 | static inline void kvm_arch_flush_shadow_all(struct kvm *kvm) {} |
1902 | static inline void kvm_arch_flush_shadow_memslot(struct kvm *kvm, |
1903 | struct kvm_memory_slot *slot) {} |
1904 | diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c |
1905 | index a0097f8bada8..5f85e0dfa66d 100644 |
1906 | --- a/arch/s390/kernel/setup.c |
1907 | +++ b/arch/s390/kernel/setup.c |
1908 | @@ -303,7 +303,7 @@ early_param("vmalloc", parse_vmalloc); |
1909 | |
1910 | void *restart_stack __section(.data); |
1911 | |
1912 | -static void __init setup_lowcore(void) |
1913 | +static void __init setup_lowcore_dat_off(void) |
1914 | { |
1915 | struct lowcore *lc; |
1916 | |
1917 | @@ -314,19 +314,16 @@ static void __init setup_lowcore(void) |
1918 | lc = memblock_virt_alloc_low(sizeof(*lc), sizeof(*lc)); |
1919 | lc->restart_psw.mask = PSW_KERNEL_BITS; |
1920 | lc->restart_psw.addr = (unsigned long) restart_int_handler; |
1921 | - lc->external_new_psw.mask = PSW_KERNEL_BITS | |
1922 | - PSW_MASK_DAT | PSW_MASK_MCHECK; |
1923 | + lc->external_new_psw.mask = PSW_KERNEL_BITS | PSW_MASK_MCHECK; |
1924 | lc->external_new_psw.addr = (unsigned long) ext_int_handler; |
1925 | lc->svc_new_psw.mask = PSW_KERNEL_BITS | |
1926 | - PSW_MASK_DAT | PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK; |
1927 | + PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK; |
1928 | lc->svc_new_psw.addr = (unsigned long) system_call; |
1929 | - lc->program_new_psw.mask = PSW_KERNEL_BITS | |
1930 | - PSW_MASK_DAT | PSW_MASK_MCHECK; |
1931 | + lc->program_new_psw.mask = PSW_KERNEL_BITS | PSW_MASK_MCHECK; |
1932 | lc->program_new_psw.addr = (unsigned long) pgm_check_handler; |
1933 | lc->mcck_new_psw.mask = PSW_KERNEL_BITS; |
1934 | lc->mcck_new_psw.addr = (unsigned long) mcck_int_handler; |
1935 | - lc->io_new_psw.mask = PSW_KERNEL_BITS | |
1936 | - PSW_MASK_DAT | PSW_MASK_MCHECK; |
1937 | + lc->io_new_psw.mask = PSW_KERNEL_BITS | PSW_MASK_MCHECK; |
1938 | lc->io_new_psw.addr = (unsigned long) io_int_handler; |
1939 | lc->clock_comparator = clock_comparator_max; |
1940 | lc->kernel_stack = ((unsigned long) &init_thread_union) |
1941 | @@ -388,6 +385,16 @@ static void __init setup_lowcore(void) |
1942 | lowcore_ptr[0] = lc; |
1943 | } |
1944 | |
1945 | +static void __init setup_lowcore_dat_on(void) |
1946 | +{ |
1947 | + __ctl_clear_bit(0, 28); |
1948 | + S390_lowcore.external_new_psw.mask |= PSW_MASK_DAT; |
1949 | + S390_lowcore.svc_new_psw.mask |= PSW_MASK_DAT; |
1950 | + S390_lowcore.program_new_psw.mask |= PSW_MASK_DAT; |
1951 | + S390_lowcore.io_new_psw.mask |= PSW_MASK_DAT; |
1952 | + __ctl_set_bit(0, 28); |
1953 | +} |
1954 | + |
1955 | static struct resource code_resource = { |
1956 | .name = "Kernel code", |
1957 | .flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM, |
1958 | @@ -946,7 +953,7 @@ void __init setup_arch(char **cmdline_p) |
1959 | #endif |
1960 | |
1961 | setup_resources(); |
1962 | - setup_lowcore(); |
1963 | + setup_lowcore_dat_off(); |
1964 | smp_fill_possible_mask(); |
1965 | cpu_detect_mhz_feature(); |
1966 | cpu_init(); |
1967 | @@ -959,6 +966,12 @@ void __init setup_arch(char **cmdline_p) |
1968 | */ |
1969 | paging_init(); |
1970 | |
1971 | + /* |
1972 | + * After paging_init created the kernel page table, the new PSWs |
1973 | + * in lowcore can now run with DAT enabled. |
1974 | + */ |
1975 | + setup_lowcore_dat_on(); |
1976 | + |
1977 | /* Setup default console */ |
1978 | conmode_default(); |
1979 | set_preferred_console(); |
1980 | diff --git a/arch/x86/crypto/aegis128-aesni-glue.c b/arch/x86/crypto/aegis128-aesni-glue.c |
1981 | index 2a356b948720..3ea71b871813 100644 |
1982 | --- a/arch/x86/crypto/aegis128-aesni-glue.c |
1983 | +++ b/arch/x86/crypto/aegis128-aesni-glue.c |
1984 | @@ -119,31 +119,20 @@ static void crypto_aegis128_aesni_process_ad( |
1985 | } |
1986 | |
1987 | static void crypto_aegis128_aesni_process_crypt( |
1988 | - struct aegis_state *state, struct aead_request *req, |
1989 | + struct aegis_state *state, struct skcipher_walk *walk, |
1990 | const struct aegis_crypt_ops *ops) |
1991 | { |
1992 | - struct skcipher_walk walk; |
1993 | - u8 *src, *dst; |
1994 | - unsigned int chunksize, base; |
1995 | - |
1996 | - ops->skcipher_walk_init(&walk, req, false); |
1997 | - |
1998 | - while (walk.nbytes) { |
1999 | - src = walk.src.virt.addr; |
2000 | - dst = walk.dst.virt.addr; |
2001 | - chunksize = walk.nbytes; |
2002 | - |
2003 | - ops->crypt_blocks(state, chunksize, src, dst); |
2004 | - |
2005 | - base = chunksize & ~(AEGIS128_BLOCK_SIZE - 1); |
2006 | - src += base; |
2007 | - dst += base; |
2008 | - chunksize &= AEGIS128_BLOCK_SIZE - 1; |
2009 | - |
2010 | - if (chunksize > 0) |
2011 | - ops->crypt_tail(state, chunksize, src, dst); |
2012 | + while (walk->nbytes >= AEGIS128_BLOCK_SIZE) { |
2013 | + ops->crypt_blocks(state, |
2014 | + round_down(walk->nbytes, AEGIS128_BLOCK_SIZE), |
2015 | + walk->src.virt.addr, walk->dst.virt.addr); |
2016 | + skcipher_walk_done(walk, walk->nbytes % AEGIS128_BLOCK_SIZE); |
2017 | + } |
2018 | |
2019 | - skcipher_walk_done(&walk, 0); |
2020 | + if (walk->nbytes) { |
2021 | + ops->crypt_tail(state, walk->nbytes, walk->src.virt.addr, |
2022 | + walk->dst.virt.addr); |
2023 | + skcipher_walk_done(walk, 0); |
2024 | } |
2025 | } |
2026 | |
2027 | @@ -186,13 +175,16 @@ static void crypto_aegis128_aesni_crypt(struct aead_request *req, |
2028 | { |
2029 | struct crypto_aead *tfm = crypto_aead_reqtfm(req); |
2030 | struct aegis_ctx *ctx = crypto_aegis128_aesni_ctx(tfm); |
2031 | + struct skcipher_walk walk; |
2032 | struct aegis_state state; |
2033 | |
2034 | + ops->skcipher_walk_init(&walk, req, true); |
2035 | + |
2036 | kernel_fpu_begin(); |
2037 | |
2038 | crypto_aegis128_aesni_init(&state, ctx->key.bytes, req->iv); |
2039 | crypto_aegis128_aesni_process_ad(&state, req->src, req->assoclen); |
2040 | - crypto_aegis128_aesni_process_crypt(&state, req, ops); |
2041 | + crypto_aegis128_aesni_process_crypt(&state, &walk, ops); |
2042 | crypto_aegis128_aesni_final(&state, tag_xor, req->assoclen, cryptlen); |
2043 | |
2044 | kernel_fpu_end(); |
2045 | diff --git a/arch/x86/crypto/aegis128l-aesni-glue.c b/arch/x86/crypto/aegis128l-aesni-glue.c |
2046 | index dbe8bb980da1..1b1b39c66c5e 100644 |
2047 | --- a/arch/x86/crypto/aegis128l-aesni-glue.c |
2048 | +++ b/arch/x86/crypto/aegis128l-aesni-glue.c |
2049 | @@ -119,31 +119,20 @@ static void crypto_aegis128l_aesni_process_ad( |
2050 | } |
2051 | |
2052 | static void crypto_aegis128l_aesni_process_crypt( |
2053 | - struct aegis_state *state, struct aead_request *req, |
2054 | + struct aegis_state *state, struct skcipher_walk *walk, |
2055 | const struct aegis_crypt_ops *ops) |
2056 | { |
2057 | - struct skcipher_walk walk; |
2058 | - u8 *src, *dst; |
2059 | - unsigned int chunksize, base; |
2060 | - |
2061 | - ops->skcipher_walk_init(&walk, req, false); |
2062 | - |
2063 | - while (walk.nbytes) { |
2064 | - src = walk.src.virt.addr; |
2065 | - dst = walk.dst.virt.addr; |
2066 | - chunksize = walk.nbytes; |
2067 | - |
2068 | - ops->crypt_blocks(state, chunksize, src, dst); |
2069 | - |
2070 | - base = chunksize & ~(AEGIS128L_BLOCK_SIZE - 1); |
2071 | - src += base; |
2072 | - dst += base; |
2073 | - chunksize &= AEGIS128L_BLOCK_SIZE - 1; |
2074 | - |
2075 | - if (chunksize > 0) |
2076 | - ops->crypt_tail(state, chunksize, src, dst); |
2077 | + while (walk->nbytes >= AEGIS128L_BLOCK_SIZE) { |
2078 | + ops->crypt_blocks(state, round_down(walk->nbytes, |
2079 | + AEGIS128L_BLOCK_SIZE), |
2080 | + walk->src.virt.addr, walk->dst.virt.addr); |
2081 | + skcipher_walk_done(walk, walk->nbytes % AEGIS128L_BLOCK_SIZE); |
2082 | + } |
2083 | |
2084 | - skcipher_walk_done(&walk, 0); |
2085 | + if (walk->nbytes) { |
2086 | + ops->crypt_tail(state, walk->nbytes, walk->src.virt.addr, |
2087 | + walk->dst.virt.addr); |
2088 | + skcipher_walk_done(walk, 0); |
2089 | } |
2090 | } |
2091 | |
2092 | @@ -186,13 +175,16 @@ static void crypto_aegis128l_aesni_crypt(struct aead_request *req, |
2093 | { |
2094 | struct crypto_aead *tfm = crypto_aead_reqtfm(req); |
2095 | struct aegis_ctx *ctx = crypto_aegis128l_aesni_ctx(tfm); |
2096 | + struct skcipher_walk walk; |
2097 | struct aegis_state state; |
2098 | |
2099 | + ops->skcipher_walk_init(&walk, req, true); |
2100 | + |
2101 | kernel_fpu_begin(); |
2102 | |
2103 | crypto_aegis128l_aesni_init(&state, ctx->key.bytes, req->iv); |
2104 | crypto_aegis128l_aesni_process_ad(&state, req->src, req->assoclen); |
2105 | - crypto_aegis128l_aesni_process_crypt(&state, req, ops); |
2106 | + crypto_aegis128l_aesni_process_crypt(&state, &walk, ops); |
2107 | crypto_aegis128l_aesni_final(&state, tag_xor, req->assoclen, cryptlen); |
2108 | |
2109 | kernel_fpu_end(); |
2110 | diff --git a/arch/x86/crypto/aegis256-aesni-glue.c b/arch/x86/crypto/aegis256-aesni-glue.c |
2111 | index 8bebda2de92f..6227ca3220a0 100644 |
2112 | --- a/arch/x86/crypto/aegis256-aesni-glue.c |
2113 | +++ b/arch/x86/crypto/aegis256-aesni-glue.c |
2114 | @@ -119,31 +119,20 @@ static void crypto_aegis256_aesni_process_ad( |
2115 | } |
2116 | |
2117 | static void crypto_aegis256_aesni_process_crypt( |
2118 | - struct aegis_state *state, struct aead_request *req, |
2119 | + struct aegis_state *state, struct skcipher_walk *walk, |
2120 | const struct aegis_crypt_ops *ops) |
2121 | { |
2122 | - struct skcipher_walk walk; |
2123 | - u8 *src, *dst; |
2124 | - unsigned int chunksize, base; |
2125 | - |
2126 | - ops->skcipher_walk_init(&walk, req, false); |
2127 | - |
2128 | - while (walk.nbytes) { |
2129 | - src = walk.src.virt.addr; |
2130 | - dst = walk.dst.virt.addr; |
2131 | - chunksize = walk.nbytes; |
2132 | - |
2133 | - ops->crypt_blocks(state, chunksize, src, dst); |
2134 | - |
2135 | - base = chunksize & ~(AEGIS256_BLOCK_SIZE - 1); |
2136 | - src += base; |
2137 | - dst += base; |
2138 | - chunksize &= AEGIS256_BLOCK_SIZE - 1; |
2139 | - |
2140 | - if (chunksize > 0) |
2141 | - ops->crypt_tail(state, chunksize, src, dst); |
2142 | + while (walk->nbytes >= AEGIS256_BLOCK_SIZE) { |
2143 | + ops->crypt_blocks(state, |
2144 | + round_down(walk->nbytes, AEGIS256_BLOCK_SIZE), |
2145 | + walk->src.virt.addr, walk->dst.virt.addr); |
2146 | + skcipher_walk_done(walk, walk->nbytes % AEGIS256_BLOCK_SIZE); |
2147 | + } |
2148 | |
2149 | - skcipher_walk_done(&walk, 0); |
2150 | + if (walk->nbytes) { |
2151 | + ops->crypt_tail(state, walk->nbytes, walk->src.virt.addr, |
2152 | + walk->dst.virt.addr); |
2153 | + skcipher_walk_done(walk, 0); |
2154 | } |
2155 | } |
2156 | |
2157 | @@ -186,13 +175,16 @@ static void crypto_aegis256_aesni_crypt(struct aead_request *req, |
2158 | { |
2159 | struct crypto_aead *tfm = crypto_aead_reqtfm(req); |
2160 | struct aegis_ctx *ctx = crypto_aegis256_aesni_ctx(tfm); |
2161 | + struct skcipher_walk walk; |
2162 | struct aegis_state state; |
2163 | |
2164 | + ops->skcipher_walk_init(&walk, req, true); |
2165 | + |
2166 | kernel_fpu_begin(); |
2167 | |
2168 | crypto_aegis256_aesni_init(&state, ctx->key, req->iv); |
2169 | crypto_aegis256_aesni_process_ad(&state, req->src, req->assoclen); |
2170 | - crypto_aegis256_aesni_process_crypt(&state, req, ops); |
2171 | + crypto_aegis256_aesni_process_crypt(&state, &walk, ops); |
2172 | crypto_aegis256_aesni_final(&state, tag_xor, req->assoclen, cryptlen); |
2173 | |
2174 | kernel_fpu_end(); |
2175 | diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c |
2176 | index e4b78f962874..917f25e4d0a8 100644 |
2177 | --- a/arch/x86/crypto/aesni-intel_glue.c |
2178 | +++ b/arch/x86/crypto/aesni-intel_glue.c |
2179 | @@ -830,11 +830,14 @@ static int gcmaes_crypt_by_sg(bool enc, struct aead_request *req, |
2180 | scatterwalk_map_and_copy(assoc, req->src, 0, assoclen, 0); |
2181 | } |
2182 | |
2183 | - src_sg = scatterwalk_ffwd(src_start, req->src, req->assoclen); |
2184 | - scatterwalk_start(&src_sg_walk, src_sg); |
2185 | - if (req->src != req->dst) { |
2186 | - dst_sg = scatterwalk_ffwd(dst_start, req->dst, req->assoclen); |
2187 | - scatterwalk_start(&dst_sg_walk, dst_sg); |
2188 | + if (left) { |
2189 | + src_sg = scatterwalk_ffwd(src_start, req->src, req->assoclen); |
2190 | + scatterwalk_start(&src_sg_walk, src_sg); |
2191 | + if (req->src != req->dst) { |
2192 | + dst_sg = scatterwalk_ffwd(dst_start, req->dst, |
2193 | + req->assoclen); |
2194 | + scatterwalk_start(&dst_sg_walk, dst_sg); |
2195 | + } |
2196 | } |
2197 | |
2198 | kernel_fpu_begin(); |
2199 | diff --git a/arch/x86/crypto/morus1280_glue.c b/arch/x86/crypto/morus1280_glue.c |
2200 | index 0dccdda1eb3a..7e600f8bcdad 100644 |
2201 | --- a/arch/x86/crypto/morus1280_glue.c |
2202 | +++ b/arch/x86/crypto/morus1280_glue.c |
2203 | @@ -85,31 +85,20 @@ static void crypto_morus1280_glue_process_ad( |
2204 | |
2205 | static void crypto_morus1280_glue_process_crypt(struct morus1280_state *state, |
2206 | struct morus1280_ops ops, |
2207 | - struct aead_request *req) |
2208 | + struct skcipher_walk *walk) |
2209 | { |
2210 | - struct skcipher_walk walk; |
2211 | - u8 *cursor_src, *cursor_dst; |
2212 | - unsigned int chunksize, base; |
2213 | - |
2214 | - ops.skcipher_walk_init(&walk, req, false); |
2215 | - |
2216 | - while (walk.nbytes) { |
2217 | - cursor_src = walk.src.virt.addr; |
2218 | - cursor_dst = walk.dst.virt.addr; |
2219 | - chunksize = walk.nbytes; |
2220 | - |
2221 | - ops.crypt_blocks(state, cursor_src, cursor_dst, chunksize); |
2222 | - |
2223 | - base = chunksize & ~(MORUS1280_BLOCK_SIZE - 1); |
2224 | - cursor_src += base; |
2225 | - cursor_dst += base; |
2226 | - chunksize &= MORUS1280_BLOCK_SIZE - 1; |
2227 | - |
2228 | - if (chunksize > 0) |
2229 | - ops.crypt_tail(state, cursor_src, cursor_dst, |
2230 | - chunksize); |
2231 | + while (walk->nbytes >= MORUS1280_BLOCK_SIZE) { |
2232 | + ops.crypt_blocks(state, walk->src.virt.addr, |
2233 | + walk->dst.virt.addr, |
2234 | + round_down(walk->nbytes, |
2235 | + MORUS1280_BLOCK_SIZE)); |
2236 | + skcipher_walk_done(walk, walk->nbytes % MORUS1280_BLOCK_SIZE); |
2237 | + } |
2238 | |
2239 | - skcipher_walk_done(&walk, 0); |
2240 | + if (walk->nbytes) { |
2241 | + ops.crypt_tail(state, walk->src.virt.addr, walk->dst.virt.addr, |
2242 | + walk->nbytes); |
2243 | + skcipher_walk_done(walk, 0); |
2244 | } |
2245 | } |
2246 | |
2247 | @@ -147,12 +136,15 @@ static void crypto_morus1280_glue_crypt(struct aead_request *req, |
2248 | struct crypto_aead *tfm = crypto_aead_reqtfm(req); |
2249 | struct morus1280_ctx *ctx = crypto_aead_ctx(tfm); |
2250 | struct morus1280_state state; |
2251 | + struct skcipher_walk walk; |
2252 | + |
2253 | + ops.skcipher_walk_init(&walk, req, true); |
2254 | |
2255 | kernel_fpu_begin(); |
2256 | |
2257 | ctx->ops->init(&state, &ctx->key, req->iv); |
2258 | crypto_morus1280_glue_process_ad(&state, ctx->ops, req->src, req->assoclen); |
2259 | - crypto_morus1280_glue_process_crypt(&state, ops, req); |
2260 | + crypto_morus1280_glue_process_crypt(&state, ops, &walk); |
2261 | ctx->ops->final(&state, tag_xor, req->assoclen, cryptlen); |
2262 | |
2263 | kernel_fpu_end(); |
2264 | diff --git a/arch/x86/crypto/morus640_glue.c b/arch/x86/crypto/morus640_glue.c |
2265 | index 7b58fe4d9bd1..cb3a81732016 100644 |
2266 | --- a/arch/x86/crypto/morus640_glue.c |
2267 | +++ b/arch/x86/crypto/morus640_glue.c |
2268 | @@ -85,31 +85,19 @@ static void crypto_morus640_glue_process_ad( |
2269 | |
2270 | static void crypto_morus640_glue_process_crypt(struct morus640_state *state, |
2271 | struct morus640_ops ops, |
2272 | - struct aead_request *req) |
2273 | + struct skcipher_walk *walk) |
2274 | { |
2275 | - struct skcipher_walk walk; |
2276 | - u8 *cursor_src, *cursor_dst; |
2277 | - unsigned int chunksize, base; |
2278 | - |
2279 | - ops.skcipher_walk_init(&walk, req, false); |
2280 | - |
2281 | - while (walk.nbytes) { |
2282 | - cursor_src = walk.src.virt.addr; |
2283 | - cursor_dst = walk.dst.virt.addr; |
2284 | - chunksize = walk.nbytes; |
2285 | - |
2286 | - ops.crypt_blocks(state, cursor_src, cursor_dst, chunksize); |
2287 | - |
2288 | - base = chunksize & ~(MORUS640_BLOCK_SIZE - 1); |
2289 | - cursor_src += base; |
2290 | - cursor_dst += base; |
2291 | - chunksize &= MORUS640_BLOCK_SIZE - 1; |
2292 | - |
2293 | - if (chunksize > 0) |
2294 | - ops.crypt_tail(state, cursor_src, cursor_dst, |
2295 | - chunksize); |
2296 | + while (walk->nbytes >= MORUS640_BLOCK_SIZE) { |
2297 | + ops.crypt_blocks(state, walk->src.virt.addr, |
2298 | + walk->dst.virt.addr, |
2299 | + round_down(walk->nbytes, MORUS640_BLOCK_SIZE)); |
2300 | + skcipher_walk_done(walk, walk->nbytes % MORUS640_BLOCK_SIZE); |
2301 | + } |
2302 | |
2303 | - skcipher_walk_done(&walk, 0); |
2304 | + if (walk->nbytes) { |
2305 | + ops.crypt_tail(state, walk->src.virt.addr, walk->dst.virt.addr, |
2306 | + walk->nbytes); |
2307 | + skcipher_walk_done(walk, 0); |
2308 | } |
2309 | } |
2310 | |
2311 | @@ -143,12 +131,15 @@ static void crypto_morus640_glue_crypt(struct aead_request *req, |
2312 | struct crypto_aead *tfm = crypto_aead_reqtfm(req); |
2313 | struct morus640_ctx *ctx = crypto_aead_ctx(tfm); |
2314 | struct morus640_state state; |
2315 | + struct skcipher_walk walk; |
2316 | + |
2317 | + ops.skcipher_walk_init(&walk, req, true); |
2318 | |
2319 | kernel_fpu_begin(); |
2320 | |
2321 | ctx->ops->init(&state, &ctx->key, req->iv); |
2322 | crypto_morus640_glue_process_ad(&state, ctx->ops, req->src, req->assoclen); |
2323 | - crypto_morus640_glue_process_crypt(&state, ops, req); |
2324 | + crypto_morus640_glue_process_crypt(&state, ops, &walk); |
2325 | ctx->ops->final(&state, tag_xor, req->assoclen, cryptlen); |
2326 | |
2327 | kernel_fpu_end(); |
2328 | diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c |
2329 | index 27a461414b30..2690135bf83f 100644 |
2330 | --- a/arch/x86/events/intel/uncore.c |
2331 | +++ b/arch/x86/events/intel/uncore.c |
2332 | @@ -740,6 +740,7 @@ static int uncore_pmu_event_init(struct perf_event *event) |
2333 | /* fixed counters have event field hardcoded to zero */ |
2334 | hwc->config = 0ULL; |
2335 | } else if (is_freerunning_event(event)) { |
2336 | + hwc->config = event->attr.config; |
2337 | if (!check_valid_freerunning_event(box, event)) |
2338 | return -EINVAL; |
2339 | event->hw.idx = UNCORE_PMC_IDX_FREERUNNING; |
2340 | diff --git a/arch/x86/events/intel/uncore.h b/arch/x86/events/intel/uncore.h |
2341 | index e17ab885b1e9..cc6dd4f78158 100644 |
2342 | --- a/arch/x86/events/intel/uncore.h |
2343 | +++ b/arch/x86/events/intel/uncore.h |
2344 | @@ -285,8 +285,8 @@ static inline |
2345 | unsigned int uncore_freerunning_counter(struct intel_uncore_box *box, |
2346 | struct perf_event *event) |
2347 | { |
2348 | - unsigned int type = uncore_freerunning_type(event->attr.config); |
2349 | - unsigned int idx = uncore_freerunning_idx(event->attr.config); |
2350 | + unsigned int type = uncore_freerunning_type(event->hw.config); |
2351 | + unsigned int idx = uncore_freerunning_idx(event->hw.config); |
2352 | struct intel_uncore_pmu *pmu = box->pmu; |
2353 | |
2354 | return pmu->type->freerunning[type].counter_base + |
2355 | @@ -360,7 +360,7 @@ static inline |
2356 | unsigned int uncore_freerunning_bits(struct intel_uncore_box *box, |
2357 | struct perf_event *event) |
2358 | { |
2359 | - unsigned int type = uncore_freerunning_type(event->attr.config); |
2360 | + unsigned int type = uncore_freerunning_type(event->hw.config); |
2361 | |
2362 | return box->pmu->type->freerunning[type].bits; |
2363 | } |
2364 | @@ -368,7 +368,7 @@ unsigned int uncore_freerunning_bits(struct intel_uncore_box *box, |
2365 | static inline int uncore_num_freerunning(struct intel_uncore_box *box, |
2366 | struct perf_event *event) |
2367 | { |
2368 | - unsigned int type = uncore_freerunning_type(event->attr.config); |
2369 | + unsigned int type = uncore_freerunning_type(event->hw.config); |
2370 | |
2371 | return box->pmu->type->freerunning[type].num_counters; |
2372 | } |
2373 | @@ -382,8 +382,8 @@ static inline int uncore_num_freerunning_types(struct intel_uncore_box *box, |
2374 | static inline bool check_valid_freerunning_event(struct intel_uncore_box *box, |
2375 | struct perf_event *event) |
2376 | { |
2377 | - unsigned int type = uncore_freerunning_type(event->attr.config); |
2378 | - unsigned int idx = uncore_freerunning_idx(event->attr.config); |
2379 | + unsigned int type = uncore_freerunning_type(event->hw.config); |
2380 | + unsigned int idx = uncore_freerunning_idx(event->hw.config); |
2381 | |
2382 | return (type < uncore_num_freerunning_types(box, event)) && |
2383 | (idx < uncore_num_freerunning(box, event)); |
2384 | diff --git a/arch/x86/events/intel/uncore_snb.c b/arch/x86/events/intel/uncore_snb.c |
2385 | index bfa25814fe5f..2d328386f83a 100644 |
2386 | --- a/arch/x86/events/intel/uncore_snb.c |
2387 | +++ b/arch/x86/events/intel/uncore_snb.c |
2388 | @@ -444,9 +444,11 @@ static int snb_uncore_imc_event_init(struct perf_event *event) |
2389 | |
2390 | /* must be done before validate_group */ |
2391 | event->hw.event_base = base; |
2392 | - event->hw.config = cfg; |
2393 | event->hw.idx = idx; |
2394 | |
2395 | + /* Convert to standard encoding format for freerunning counters */ |
2396 | + event->hw.config = ((cfg - 1) << 8) | 0x10ff; |
2397 | + |
2398 | /* no group validation needed, we have free running counters */ |
2399 | |
2400 | return 0; |
2401 | diff --git a/arch/x86/include/asm/intel-family.h b/arch/x86/include/asm/intel-family.h |
2402 | index 7ed08a7c3398..0ad25cc895ae 100644 |
2403 | --- a/arch/x86/include/asm/intel-family.h |
2404 | +++ b/arch/x86/include/asm/intel-family.h |
2405 | @@ -55,6 +55,8 @@ |
2406 | |
2407 | #define INTEL_FAM6_CANNONLAKE_MOBILE 0x66 |
2408 | |
2409 | +#define INTEL_FAM6_ICELAKE_MOBILE 0x7E |
2410 | + |
2411 | /* "Small Core" Processors (Atom) */ |
2412 | |
2413 | #define INTEL_FAM6_ATOM_PINEVIEW 0x1C |
2414 | diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h |
2415 | index 728dc661ebb6..46f0b621bd37 100644 |
2416 | --- a/arch/x86/include/asm/kvm_host.h |
2417 | +++ b/arch/x86/include/asm/kvm_host.h |
2418 | @@ -1194,7 +1194,7 @@ void kvm_mmu_clear_dirty_pt_masked(struct kvm *kvm, |
2419 | struct kvm_memory_slot *slot, |
2420 | gfn_t gfn_offset, unsigned long mask); |
2421 | void kvm_mmu_zap_all(struct kvm *kvm); |
2422 | -void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, struct kvm_memslots *slots); |
2423 | +void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen); |
2424 | unsigned int kvm_mmu_calculate_mmu_pages(struct kvm *kvm); |
2425 | void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages); |
2426 | |
2427 | diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c |
2428 | index 6adf6e6c2933..544bd41a514c 100644 |
2429 | --- a/arch/x86/kernel/kprobes/opt.c |
2430 | +++ b/arch/x86/kernel/kprobes/opt.c |
2431 | @@ -141,6 +141,11 @@ asm ( |
2432 | |
2433 | void optprobe_template_func(void); |
2434 | STACK_FRAME_NON_STANDARD(optprobe_template_func); |
2435 | +NOKPROBE_SYMBOL(optprobe_template_func); |
2436 | +NOKPROBE_SYMBOL(optprobe_template_entry); |
2437 | +NOKPROBE_SYMBOL(optprobe_template_val); |
2438 | +NOKPROBE_SYMBOL(optprobe_template_call); |
2439 | +NOKPROBE_SYMBOL(optprobe_template_end); |
2440 | |
2441 | #define TMPL_MOVE_IDX \ |
2442 | ((long)optprobe_template_val - (long)optprobe_template_entry) |
2443 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c |
2444 | index 1b82bc7c3cca..779ed52047d1 100644 |
2445 | --- a/arch/x86/kvm/mmu.c |
2446 | +++ b/arch/x86/kvm/mmu.c |
2447 | @@ -5774,13 +5774,30 @@ static bool kvm_has_zapped_obsolete_pages(struct kvm *kvm) |
2448 | return unlikely(!list_empty_careful(&kvm->arch.zapped_obsolete_pages)); |
2449 | } |
2450 | |
2451 | -void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, struct kvm_memslots *slots) |
2452 | +void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen) |
2453 | { |
2454 | + gen &= MMIO_GEN_MASK; |
2455 | + |
2456 | + /* |
2457 | + * Shift to eliminate the "update in-progress" flag, which isn't |
2458 | + * included in the spte's generation number. |
2459 | + */ |
2460 | + gen >>= 1; |
2461 | + |
2462 | + /* |
2463 | + * Generation numbers are incremented in multiples of the number of |
2464 | + * address spaces in order to provide unique generations across all |
2465 | + * address spaces. Strip what is effectively the address space |
2466 | + * modifier prior to checking for a wrap of the MMIO generation so |
2467 | + * that a wrap in any address space is detected. |
2468 | + */ |
2469 | + gen &= ~((u64)KVM_ADDRESS_SPACE_NUM - 1); |
2470 | + |
2471 | /* |
2472 | - * The very rare case: if the generation-number is round, |
2473 | + * The very rare case: if the MMIO generation number has wrapped, |
2474 | * zap all shadow pages. |
2475 | */ |
2476 | - if (unlikely((slots->generation & MMIO_GEN_MASK) == 0)) { |
2477 | + if (unlikely(gen == 0)) { |
2478 | kvm_debug_ratelimited("kvm: zapping shadow pages for mmio generation wraparound\n"); |
2479 | kvm_mmu_invalidate_zap_all_pages(kvm); |
2480 | } |
2481 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
2482 | index f6da5c37d2e8..4029d3783e18 100644 |
2483 | --- a/arch/x86/kvm/vmx.c |
2484 | +++ b/arch/x86/kvm/vmx.c |
2485 | @@ -8184,25 +8184,50 @@ static int get_vmx_mem_address(struct kvm_vcpu *vcpu, |
2486 | /* Addr = segment_base + offset */ |
2487 | /* offset = base + [index * scale] + displacement */ |
2488 | off = exit_qualification; /* holds the displacement */ |
2489 | + if (addr_size == 1) |
2490 | + off = (gva_t)sign_extend64(off, 31); |
2491 | + else if (addr_size == 0) |
2492 | + off = (gva_t)sign_extend64(off, 15); |
2493 | if (base_is_valid) |
2494 | off += kvm_register_read(vcpu, base_reg); |
2495 | if (index_is_valid) |
2496 | off += kvm_register_read(vcpu, index_reg)<<scaling; |
2497 | vmx_get_segment(vcpu, &s, seg_reg); |
2498 | - *ret = s.base + off; |
2499 | |
2500 | + /* |
2501 | + * The effective address, i.e. @off, of a memory operand is truncated |
2502 | + * based on the address size of the instruction. Note that this is |
2503 | + * the *effective address*, i.e. the address prior to accounting for |
2504 | + * the segment's base. |
2505 | + */ |
2506 | if (addr_size == 1) /* 32 bit */ |
2507 | - *ret &= 0xffffffff; |
2508 | + off &= 0xffffffff; |
2509 | + else if (addr_size == 0) /* 16 bit */ |
2510 | + off &= 0xffff; |
2511 | |
2512 | /* Checks for #GP/#SS exceptions. */ |
2513 | exn = false; |
2514 | if (is_long_mode(vcpu)) { |
2515 | + /* |
2516 | + * The virtual/linear address is never truncated in 64-bit |
2517 | + * mode, e.g. a 32-bit address size can yield a 64-bit virtual |
2518 | + * address when using FS/GS with a non-zero base. |
2519 | + */ |
2520 | + *ret = s.base + off; |
2521 | + |
2522 | /* Long mode: #GP(0)/#SS(0) if the memory address is in a |
2523 | * non-canonical form. This is the only check on the memory |
2524 | * destination for long mode! |
2525 | */ |
2526 | exn = is_noncanonical_address(*ret, vcpu); |
2527 | } else if (is_protmode(vcpu)) { |
2528 | + /* |
2529 | + * When not in long mode, the virtual/linear address is |
2530 | + * unconditionally truncated to 32 bits regardless of the |
2531 | + * address size. |
2532 | + */ |
2533 | + *ret = (s.base + off) & 0xffffffff; |
2534 | + |
2535 | /* Protected mode: apply checks for segment validity in the |
2536 | * following order: |
2537 | * - segment type check (#GP(0) may be thrown) |
2538 | @@ -8226,10 +8251,16 @@ static int get_vmx_mem_address(struct kvm_vcpu *vcpu, |
2539 | /* Protected mode: #GP(0)/#SS(0) if the segment is unusable. |
2540 | */ |
2541 | exn = (s.unusable != 0); |
2542 | - /* Protected mode: #GP(0)/#SS(0) if the memory |
2543 | - * operand is outside the segment limit. |
2544 | + |
2545 | + /* |
2546 | + * Protected mode: #GP(0)/#SS(0) if the memory operand is |
2547 | + * outside the segment limit. All CPUs that support VMX ignore |
2548 | + * limit checks for flat segments, i.e. segments with base==0, |
2549 | + * limit==0xffffffff and of type expand-up data or code. |
2550 | */ |
2551 | - exn = exn || (off + sizeof(u64) > s.limit); |
2552 | + if (!(s.base == 0 && s.limit == 0xffffffff && |
2553 | + ((s.type & 8) || !(s.type & 4)))) |
2554 | + exn = exn || (off + sizeof(u64) > s.limit); |
2555 | } |
2556 | if (exn) { |
2557 | kvm_queue_exception_e(vcpu, |
2558 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
2559 | index 3a7cf7c6b28a..6181ec19bed2 100644 |
2560 | --- a/arch/x86/kvm/x86.c |
2561 | +++ b/arch/x86/kvm/x86.c |
2562 | @@ -9108,13 +9108,13 @@ out_free: |
2563 | return -ENOMEM; |
2564 | } |
2565 | |
2566 | -void kvm_arch_memslots_updated(struct kvm *kvm, struct kvm_memslots *slots) |
2567 | +void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) |
2568 | { |
2569 | /* |
2570 | * memslots->generation has been incremented. |
2571 | * mmio generation may have reached its maximum value. |
2572 | */ |
2573 | - kvm_mmu_invalidate_mmio_sptes(kvm, slots); |
2574 | + kvm_mmu_invalidate_mmio_sptes(kvm, gen); |
2575 | } |
2576 | |
2577 | int kvm_arch_prepare_memory_region(struct kvm *kvm, |
2578 | diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h |
2579 | index 67b9568613f3..1826ed9dd1c8 100644 |
2580 | --- a/arch/x86/kvm/x86.h |
2581 | +++ b/arch/x86/kvm/x86.h |
2582 | @@ -181,6 +181,11 @@ static inline bool emul_is_noncanonical_address(u64 la, |
2583 | static inline void vcpu_cache_mmio_info(struct kvm_vcpu *vcpu, |
2584 | gva_t gva, gfn_t gfn, unsigned access) |
2585 | { |
2586 | + u64 gen = kvm_memslots(vcpu->kvm)->generation; |
2587 | + |
2588 | + if (unlikely(gen & 1)) |
2589 | + return; |
2590 | + |
2591 | /* |
2592 | * If this is a shadow nested page table, the "GVA" is |
2593 | * actually a nGPA. |
2594 | @@ -188,7 +193,7 @@ static inline void vcpu_cache_mmio_info(struct kvm_vcpu *vcpu, |
2595 | vcpu->arch.mmio_gva = mmu_is_nested(vcpu) ? 0 : gva & PAGE_MASK; |
2596 | vcpu->arch.access = access; |
2597 | vcpu->arch.mmio_gfn = gfn; |
2598 | - vcpu->arch.mmio_gen = kvm_memslots(vcpu->kvm)->generation; |
2599 | + vcpu->arch.mmio_gen = gen; |
2600 | } |
2601 | |
2602 | static inline bool vcpu_match_mmio_gen(struct kvm_vcpu *vcpu) |
2603 | diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c |
2604 | index c8f011e07a15..73aa0b89a74a 100644 |
2605 | --- a/arch/x86/xen/mmu_pv.c |
2606 | +++ b/arch/x86/xen/mmu_pv.c |
2607 | @@ -2106,10 +2106,10 @@ void __init xen_relocate_p2m(void) |
2608 | pt = early_memremap(pt_phys, PAGE_SIZE); |
2609 | clear_page(pt); |
2610 | for (idx_pte = 0; |
2611 | - idx_pte < min(n_pte, PTRS_PER_PTE); |
2612 | - idx_pte++) { |
2613 | - set_pte(pt + idx_pte, |
2614 | - pfn_pte(p2m_pfn, PAGE_KERNEL)); |
2615 | + idx_pte < min(n_pte, PTRS_PER_PTE); |
2616 | + idx_pte++) { |
2617 | + pt[idx_pte] = pfn_pte(p2m_pfn, |
2618 | + PAGE_KERNEL); |
2619 | p2m_pfn++; |
2620 | } |
2621 | n_pte -= PTRS_PER_PTE; |
2622 | @@ -2117,8 +2117,7 @@ void __init xen_relocate_p2m(void) |
2623 | make_lowmem_page_readonly(__va(pt_phys)); |
2624 | pin_pagetable_pfn(MMUEXT_PIN_L1_TABLE, |
2625 | PFN_DOWN(pt_phys)); |
2626 | - set_pmd(pmd + idx_pt, |
2627 | - __pmd(_PAGE_TABLE | pt_phys)); |
2628 | + pmd[idx_pt] = __pmd(_PAGE_TABLE | pt_phys); |
2629 | pt_phys += PAGE_SIZE; |
2630 | } |
2631 | n_pt -= PTRS_PER_PMD; |
2632 | @@ -2126,7 +2125,7 @@ void __init xen_relocate_p2m(void) |
2633 | make_lowmem_page_readonly(__va(pmd_phys)); |
2634 | pin_pagetable_pfn(MMUEXT_PIN_L2_TABLE, |
2635 | PFN_DOWN(pmd_phys)); |
2636 | - set_pud(pud + idx_pmd, __pud(_PAGE_TABLE | pmd_phys)); |
2637 | + pud[idx_pmd] = __pud(_PAGE_TABLE | pmd_phys); |
2638 | pmd_phys += PAGE_SIZE; |
2639 | } |
2640 | n_pmd -= PTRS_PER_PUD; |
2641 | diff --git a/block/blk-mq.c b/block/blk-mq.c |
2642 | index 23a53b67cf0d..7d53f2314d7c 100644 |
2643 | --- a/block/blk-mq.c |
2644 | +++ b/block/blk-mq.c |
2645 | @@ -701,12 +701,20 @@ static void blk_mq_requeue_work(struct work_struct *work) |
2646 | spin_unlock_irq(&q->requeue_lock); |
2647 | |
2648 | list_for_each_entry_safe(rq, next, &rq_list, queuelist) { |
2649 | - if (!(rq->rq_flags & RQF_SOFTBARRIER)) |
2650 | + if (!(rq->rq_flags & (RQF_SOFTBARRIER | RQF_DONTPREP))) |
2651 | continue; |
2652 | |
2653 | rq->rq_flags &= ~RQF_SOFTBARRIER; |
2654 | list_del_init(&rq->queuelist); |
2655 | - blk_mq_sched_insert_request(rq, true, false, false); |
2656 | + /* |
2657 | + * If RQF_DONTPREP, rq has contained some driver specific |
2658 | + * data, so insert it to hctx dispatch list to avoid any |
2659 | + * merge. |
2660 | + */ |
2661 | + if (rq->rq_flags & RQF_DONTPREP) |
2662 | + blk_mq_request_bypass_insert(rq, false); |
2663 | + else |
2664 | + blk_mq_sched_insert_request(rq, true, false, false); |
2665 | } |
2666 | |
2667 | while (!list_empty(&rq_list)) { |
2668 | diff --git a/crypto/aead.c b/crypto/aead.c |
2669 | index 60b3bbe973e7..9688ada13981 100644 |
2670 | --- a/crypto/aead.c |
2671 | +++ b/crypto/aead.c |
2672 | @@ -61,8 +61,10 @@ int crypto_aead_setkey(struct crypto_aead *tfm, |
2673 | else |
2674 | err = crypto_aead_alg(tfm)->setkey(tfm, key, keylen); |
2675 | |
2676 | - if (err) |
2677 | + if (unlikely(err)) { |
2678 | + crypto_aead_set_flags(tfm, CRYPTO_TFM_NEED_KEY); |
2679 | return err; |
2680 | + } |
2681 | |
2682 | crypto_aead_clear_flags(tfm, CRYPTO_TFM_NEED_KEY); |
2683 | return 0; |
2684 | diff --git a/crypto/aegis128.c b/crypto/aegis128.c |
2685 | index c22f4414856d..789716f92e4c 100644 |
2686 | --- a/crypto/aegis128.c |
2687 | +++ b/crypto/aegis128.c |
2688 | @@ -290,19 +290,19 @@ static void crypto_aegis128_process_crypt(struct aegis_state *state, |
2689 | const struct aegis128_ops *ops) |
2690 | { |
2691 | struct skcipher_walk walk; |
2692 | - u8 *src, *dst; |
2693 | - unsigned int chunksize; |
2694 | |
2695 | ops->skcipher_walk_init(&walk, req, false); |
2696 | |
2697 | while (walk.nbytes) { |
2698 | - src = walk.src.virt.addr; |
2699 | - dst = walk.dst.virt.addr; |
2700 | - chunksize = walk.nbytes; |
2701 | + unsigned int nbytes = walk.nbytes; |
2702 | |
2703 | - ops->crypt_chunk(state, dst, src, chunksize); |
2704 | + if (nbytes < walk.total) |
2705 | + nbytes = round_down(nbytes, walk.stride); |
2706 | |
2707 | - skcipher_walk_done(&walk, 0); |
2708 | + ops->crypt_chunk(state, walk.dst.virt.addr, walk.src.virt.addr, |
2709 | + nbytes); |
2710 | + |
2711 | + skcipher_walk_done(&walk, walk.nbytes - nbytes); |
2712 | } |
2713 | } |
2714 | |
2715 | diff --git a/crypto/aegis128l.c b/crypto/aegis128l.c |
2716 | index b6fb21ebdc3e..73811448cb6b 100644 |
2717 | --- a/crypto/aegis128l.c |
2718 | +++ b/crypto/aegis128l.c |
2719 | @@ -353,19 +353,19 @@ static void crypto_aegis128l_process_crypt(struct aegis_state *state, |
2720 | const struct aegis128l_ops *ops) |
2721 | { |
2722 | struct skcipher_walk walk; |
2723 | - u8 *src, *dst; |
2724 | - unsigned int chunksize; |
2725 | |
2726 | ops->skcipher_walk_init(&walk, req, false); |
2727 | |
2728 | while (walk.nbytes) { |
2729 | - src = walk.src.virt.addr; |
2730 | - dst = walk.dst.virt.addr; |
2731 | - chunksize = walk.nbytes; |
2732 | + unsigned int nbytes = walk.nbytes; |
2733 | |
2734 | - ops->crypt_chunk(state, dst, src, chunksize); |
2735 | + if (nbytes < walk.total) |
2736 | + nbytes = round_down(nbytes, walk.stride); |
2737 | |
2738 | - skcipher_walk_done(&walk, 0); |
2739 | + ops->crypt_chunk(state, walk.dst.virt.addr, walk.src.virt.addr, |
2740 | + nbytes); |
2741 | + |
2742 | + skcipher_walk_done(&walk, walk.nbytes - nbytes); |
2743 | } |
2744 | } |
2745 | |
2746 | diff --git a/crypto/aegis256.c b/crypto/aegis256.c |
2747 | index 11f0f8ec9c7c..8a71e9c06193 100644 |
2748 | --- a/crypto/aegis256.c |
2749 | +++ b/crypto/aegis256.c |
2750 | @@ -303,19 +303,19 @@ static void crypto_aegis256_process_crypt(struct aegis_state *state, |
2751 | const struct aegis256_ops *ops) |
2752 | { |
2753 | struct skcipher_walk walk; |
2754 | - u8 *src, *dst; |
2755 | - unsigned int chunksize; |
2756 | |
2757 | ops->skcipher_walk_init(&walk, req, false); |
2758 | |
2759 | while (walk.nbytes) { |
2760 | - src = walk.src.virt.addr; |
2761 | - dst = walk.dst.virt.addr; |
2762 | - chunksize = walk.nbytes; |
2763 | + unsigned int nbytes = walk.nbytes; |
2764 | |
2765 | - ops->crypt_chunk(state, dst, src, chunksize); |
2766 | + if (nbytes < walk.total) |
2767 | + nbytes = round_down(nbytes, walk.stride); |
2768 | |
2769 | - skcipher_walk_done(&walk, 0); |
2770 | + ops->crypt_chunk(state, walk.dst.virt.addr, walk.src.virt.addr, |
2771 | + nbytes); |
2772 | + |
2773 | + skcipher_walk_done(&walk, walk.nbytes - nbytes); |
2774 | } |
2775 | } |
2776 | |
2777 | diff --git a/crypto/ahash.c b/crypto/ahash.c |
2778 | index a64c143165b1..158e716f21a1 100644 |
2779 | --- a/crypto/ahash.c |
2780 | +++ b/crypto/ahash.c |
2781 | @@ -86,17 +86,17 @@ static int hash_walk_new_entry(struct crypto_hash_walk *walk) |
2782 | int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err) |
2783 | { |
2784 | unsigned int alignmask = walk->alignmask; |
2785 | - unsigned int nbytes = walk->entrylen; |
2786 | |
2787 | walk->data -= walk->offset; |
2788 | |
2789 | - if (nbytes && walk->offset & alignmask && !err) { |
2790 | - walk->offset = ALIGN(walk->offset, alignmask + 1); |
2791 | - nbytes = min(nbytes, |
2792 | - ((unsigned int)(PAGE_SIZE)) - walk->offset); |
2793 | - walk->entrylen -= nbytes; |
2794 | + if (walk->entrylen && (walk->offset & alignmask) && !err) { |
2795 | + unsigned int nbytes; |
2796 | |
2797 | + walk->offset = ALIGN(walk->offset, alignmask + 1); |
2798 | + nbytes = min(walk->entrylen, |
2799 | + (unsigned int)(PAGE_SIZE - walk->offset)); |
2800 | if (nbytes) { |
2801 | + walk->entrylen -= nbytes; |
2802 | walk->data += walk->offset; |
2803 | return nbytes; |
2804 | } |
2805 | @@ -116,7 +116,7 @@ int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err) |
2806 | if (err) |
2807 | return err; |
2808 | |
2809 | - if (nbytes) { |
2810 | + if (walk->entrylen) { |
2811 | walk->offset = 0; |
2812 | walk->pg++; |
2813 | return hash_walk_next(walk); |
2814 | @@ -190,6 +190,21 @@ static int ahash_setkey_unaligned(struct crypto_ahash *tfm, const u8 *key, |
2815 | return ret; |
2816 | } |
2817 | |
2818 | +static int ahash_nosetkey(struct crypto_ahash *tfm, const u8 *key, |
2819 | + unsigned int keylen) |
2820 | +{ |
2821 | + return -ENOSYS; |
2822 | +} |
2823 | + |
2824 | +static void ahash_set_needkey(struct crypto_ahash *tfm) |
2825 | +{ |
2826 | + const struct hash_alg_common *alg = crypto_hash_alg_common(tfm); |
2827 | + |
2828 | + if (tfm->setkey != ahash_nosetkey && |
2829 | + !(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY)) |
2830 | + crypto_ahash_set_flags(tfm, CRYPTO_TFM_NEED_KEY); |
2831 | +} |
2832 | + |
2833 | int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key, |
2834 | unsigned int keylen) |
2835 | { |
2836 | @@ -201,20 +216,16 @@ int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key, |
2837 | else |
2838 | err = tfm->setkey(tfm, key, keylen); |
2839 | |
2840 | - if (err) |
2841 | + if (unlikely(err)) { |
2842 | + ahash_set_needkey(tfm); |
2843 | return err; |
2844 | + } |
2845 | |
2846 | crypto_ahash_clear_flags(tfm, CRYPTO_TFM_NEED_KEY); |
2847 | return 0; |
2848 | } |
2849 | EXPORT_SYMBOL_GPL(crypto_ahash_setkey); |
2850 | |
2851 | -static int ahash_nosetkey(struct crypto_ahash *tfm, const u8 *key, |
2852 | - unsigned int keylen) |
2853 | -{ |
2854 | - return -ENOSYS; |
2855 | -} |
2856 | - |
2857 | static inline unsigned int ahash_align_buffer_size(unsigned len, |
2858 | unsigned long mask) |
2859 | { |
2860 | @@ -467,8 +478,7 @@ static int crypto_ahash_init_tfm(struct crypto_tfm *tfm) |
2861 | |
2862 | if (alg->setkey) { |
2863 | hash->setkey = alg->setkey; |
2864 | - if (!(alg->halg.base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY)) |
2865 | - crypto_ahash_set_flags(hash, CRYPTO_TFM_NEED_KEY); |
2866 | + ahash_set_needkey(hash); |
2867 | } |
2868 | |
2869 | return 0; |
2870 | diff --git a/crypto/cfb.c b/crypto/cfb.c |
2871 | index e81e45673498..4abfe32ff845 100644 |
2872 | --- a/crypto/cfb.c |
2873 | +++ b/crypto/cfb.c |
2874 | @@ -77,12 +77,14 @@ static int crypto_cfb_encrypt_segment(struct skcipher_walk *walk, |
2875 | do { |
2876 | crypto_cfb_encrypt_one(tfm, iv, dst); |
2877 | crypto_xor(dst, src, bsize); |
2878 | - memcpy(iv, dst, bsize); |
2879 | + iv = dst; |
2880 | |
2881 | src += bsize; |
2882 | dst += bsize; |
2883 | } while ((nbytes -= bsize) >= bsize); |
2884 | |
2885 | + memcpy(walk->iv, iv, bsize); |
2886 | + |
2887 | return nbytes; |
2888 | } |
2889 | |
2890 | @@ -162,7 +164,7 @@ static int crypto_cfb_decrypt_inplace(struct skcipher_walk *walk, |
2891 | const unsigned int bsize = crypto_cfb_bsize(tfm); |
2892 | unsigned int nbytes = walk->nbytes; |
2893 | u8 *src = walk->src.virt.addr; |
2894 | - u8 *iv = walk->iv; |
2895 | + u8 * const iv = walk->iv; |
2896 | u8 tmp[MAX_CIPHER_BLOCKSIZE]; |
2897 | |
2898 | do { |
2899 | @@ -172,8 +174,6 @@ static int crypto_cfb_decrypt_inplace(struct skcipher_walk *walk, |
2900 | src += bsize; |
2901 | } while ((nbytes -= bsize) >= bsize); |
2902 | |
2903 | - memcpy(walk->iv, iv, bsize); |
2904 | - |
2905 | return nbytes; |
2906 | } |
2907 | |
2908 | @@ -298,6 +298,12 @@ static int crypto_cfb_create(struct crypto_template *tmpl, struct rtattr **tb) |
2909 | inst->alg.base.cra_blocksize = 1; |
2910 | inst->alg.base.cra_alignmask = alg->cra_alignmask; |
2911 | |
2912 | + /* |
2913 | + * To simplify the implementation, configure the skcipher walk to only |
2914 | + * give a partial block at the very end, never earlier. |
2915 | + */ |
2916 | + inst->alg.chunksize = alg->cra_blocksize; |
2917 | + |
2918 | inst->alg.ivsize = alg->cra_blocksize; |
2919 | inst->alg.min_keysize = alg->cra_cipher.cia_min_keysize; |
2920 | inst->alg.max_keysize = alg->cra_cipher.cia_max_keysize; |
2921 | diff --git a/crypto/morus1280.c b/crypto/morus1280.c |
2922 | index 3889c188f266..b83576b4eb55 100644 |
2923 | --- a/crypto/morus1280.c |
2924 | +++ b/crypto/morus1280.c |
2925 | @@ -366,18 +366,19 @@ static void crypto_morus1280_process_crypt(struct morus1280_state *state, |
2926 | const struct morus1280_ops *ops) |
2927 | { |
2928 | struct skcipher_walk walk; |
2929 | - u8 *dst; |
2930 | - const u8 *src; |
2931 | |
2932 | ops->skcipher_walk_init(&walk, req, false); |
2933 | |
2934 | while (walk.nbytes) { |
2935 | - src = walk.src.virt.addr; |
2936 | - dst = walk.dst.virt.addr; |
2937 | + unsigned int nbytes = walk.nbytes; |
2938 | |
2939 | - ops->crypt_chunk(state, dst, src, walk.nbytes); |
2940 | + if (nbytes < walk.total) |
2941 | + nbytes = round_down(nbytes, walk.stride); |
2942 | |
2943 | - skcipher_walk_done(&walk, 0); |
2944 | + ops->crypt_chunk(state, walk.dst.virt.addr, walk.src.virt.addr, |
2945 | + nbytes); |
2946 | + |
2947 | + skcipher_walk_done(&walk, walk.nbytes - nbytes); |
2948 | } |
2949 | } |
2950 | |
2951 | diff --git a/crypto/morus640.c b/crypto/morus640.c |
2952 | index da06ec2f6a80..b6a477444f6d 100644 |
2953 | --- a/crypto/morus640.c |
2954 | +++ b/crypto/morus640.c |
2955 | @@ -365,18 +365,19 @@ static void crypto_morus640_process_crypt(struct morus640_state *state, |
2956 | const struct morus640_ops *ops) |
2957 | { |
2958 | struct skcipher_walk walk; |
2959 | - u8 *dst; |
2960 | - const u8 *src; |
2961 | |
2962 | ops->skcipher_walk_init(&walk, req, false); |
2963 | |
2964 | while (walk.nbytes) { |
2965 | - src = walk.src.virt.addr; |
2966 | - dst = walk.dst.virt.addr; |
2967 | + unsigned int nbytes = walk.nbytes; |
2968 | |
2969 | - ops->crypt_chunk(state, dst, src, walk.nbytes); |
2970 | + if (nbytes < walk.total) |
2971 | + nbytes = round_down(nbytes, walk.stride); |
2972 | |
2973 | - skcipher_walk_done(&walk, 0); |
2974 | + ops->crypt_chunk(state, walk.dst.virt.addr, walk.src.virt.addr, |
2975 | + nbytes); |
2976 | + |
2977 | + skcipher_walk_done(&walk, walk.nbytes - nbytes); |
2978 | } |
2979 | } |
2980 | |
2981 | diff --git a/crypto/pcbc.c b/crypto/pcbc.c |
2982 | index 8aa10144407c..1b182dfedc94 100644 |
2983 | --- a/crypto/pcbc.c |
2984 | +++ b/crypto/pcbc.c |
2985 | @@ -51,7 +51,7 @@ static int crypto_pcbc_encrypt_segment(struct skcipher_request *req, |
2986 | unsigned int nbytes = walk->nbytes; |
2987 | u8 *src = walk->src.virt.addr; |
2988 | u8 *dst = walk->dst.virt.addr; |
2989 | - u8 *iv = walk->iv; |
2990 | + u8 * const iv = walk->iv; |
2991 | |
2992 | do { |
2993 | crypto_xor(iv, src, bsize); |
2994 | @@ -72,7 +72,7 @@ static int crypto_pcbc_encrypt_inplace(struct skcipher_request *req, |
2995 | int bsize = crypto_cipher_blocksize(tfm); |
2996 | unsigned int nbytes = walk->nbytes; |
2997 | u8 *src = walk->src.virt.addr; |
2998 | - u8 *iv = walk->iv; |
2999 | + u8 * const iv = walk->iv; |
3000 | u8 tmpbuf[MAX_CIPHER_BLOCKSIZE]; |
3001 | |
3002 | do { |
3003 | @@ -84,8 +84,6 @@ static int crypto_pcbc_encrypt_inplace(struct skcipher_request *req, |
3004 | src += bsize; |
3005 | } while ((nbytes -= bsize) >= bsize); |
3006 | |
3007 | - memcpy(walk->iv, iv, bsize); |
3008 | - |
3009 | return nbytes; |
3010 | } |
3011 | |
3012 | @@ -121,7 +119,7 @@ static int crypto_pcbc_decrypt_segment(struct skcipher_request *req, |
3013 | unsigned int nbytes = walk->nbytes; |
3014 | u8 *src = walk->src.virt.addr; |
3015 | u8 *dst = walk->dst.virt.addr; |
3016 | - u8 *iv = walk->iv; |
3017 | + u8 * const iv = walk->iv; |
3018 | |
3019 | do { |
3020 | crypto_cipher_decrypt_one(tfm, dst, src); |
3021 | @@ -132,8 +130,6 @@ static int crypto_pcbc_decrypt_segment(struct skcipher_request *req, |
3022 | dst += bsize; |
3023 | } while ((nbytes -= bsize) >= bsize); |
3024 | |
3025 | - memcpy(walk->iv, iv, bsize); |
3026 | - |
3027 | return nbytes; |
3028 | } |
3029 | |
3030 | @@ -144,7 +140,7 @@ static int crypto_pcbc_decrypt_inplace(struct skcipher_request *req, |
3031 | int bsize = crypto_cipher_blocksize(tfm); |
3032 | unsigned int nbytes = walk->nbytes; |
3033 | u8 *src = walk->src.virt.addr; |
3034 | - u8 *iv = walk->iv; |
3035 | + u8 * const iv = walk->iv; |
3036 | u8 tmpbuf[MAX_CIPHER_BLOCKSIZE] __aligned(__alignof__(u32)); |
3037 | |
3038 | do { |
3039 | @@ -156,8 +152,6 @@ static int crypto_pcbc_decrypt_inplace(struct skcipher_request *req, |
3040 | src += bsize; |
3041 | } while ((nbytes -= bsize) >= bsize); |
3042 | |
3043 | - memcpy(walk->iv, iv, bsize); |
3044 | - |
3045 | return nbytes; |
3046 | } |
3047 | |
3048 | diff --git a/crypto/shash.c b/crypto/shash.c |
3049 | index 5d732c6bb4b2..a04145e5306a 100644 |
3050 | --- a/crypto/shash.c |
3051 | +++ b/crypto/shash.c |
3052 | @@ -53,6 +53,13 @@ static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key, |
3053 | return err; |
3054 | } |
3055 | |
3056 | +static void shash_set_needkey(struct crypto_shash *tfm, struct shash_alg *alg) |
3057 | +{ |
3058 | + if (crypto_shash_alg_has_setkey(alg) && |
3059 | + !(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY)) |
3060 | + crypto_shash_set_flags(tfm, CRYPTO_TFM_NEED_KEY); |
3061 | +} |
3062 | + |
3063 | int crypto_shash_setkey(struct crypto_shash *tfm, const u8 *key, |
3064 | unsigned int keylen) |
3065 | { |
3066 | @@ -65,8 +72,10 @@ int crypto_shash_setkey(struct crypto_shash *tfm, const u8 *key, |
3067 | else |
3068 | err = shash->setkey(tfm, key, keylen); |
3069 | |
3070 | - if (err) |
3071 | + if (unlikely(err)) { |
3072 | + shash_set_needkey(tfm, shash); |
3073 | return err; |
3074 | + } |
3075 | |
3076 | crypto_shash_clear_flags(tfm, CRYPTO_TFM_NEED_KEY); |
3077 | return 0; |
3078 | @@ -368,7 +377,8 @@ int crypto_init_shash_ops_async(struct crypto_tfm *tfm) |
3079 | crt->final = shash_async_final; |
3080 | crt->finup = shash_async_finup; |
3081 | crt->digest = shash_async_digest; |
3082 | - crt->setkey = shash_async_setkey; |
3083 | + if (crypto_shash_alg_has_setkey(alg)) |
3084 | + crt->setkey = shash_async_setkey; |
3085 | |
3086 | crypto_ahash_set_flags(crt, crypto_shash_get_flags(shash) & |
3087 | CRYPTO_TFM_NEED_KEY); |
3088 | @@ -390,9 +400,7 @@ static int crypto_shash_init_tfm(struct crypto_tfm *tfm) |
3089 | |
3090 | hash->descsize = alg->descsize; |
3091 | |
3092 | - if (crypto_shash_alg_has_setkey(alg) && |
3093 | - !(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY)) |
3094 | - crypto_shash_set_flags(hash, CRYPTO_TFM_NEED_KEY); |
3095 | + shash_set_needkey(hash, alg); |
3096 | |
3097 | return 0; |
3098 | } |
3099 | diff --git a/crypto/skcipher.c b/crypto/skcipher.c |
3100 | index 0bd8c6caa498..46bb300d418f 100644 |
3101 | --- a/crypto/skcipher.c |
3102 | +++ b/crypto/skcipher.c |
3103 | @@ -584,6 +584,12 @@ static unsigned int crypto_skcipher_extsize(struct crypto_alg *alg) |
3104 | return crypto_alg_extsize(alg); |
3105 | } |
3106 | |
3107 | +static void skcipher_set_needkey(struct crypto_skcipher *tfm) |
3108 | +{ |
3109 | + if (tfm->keysize) |
3110 | + crypto_skcipher_set_flags(tfm, CRYPTO_TFM_NEED_KEY); |
3111 | +} |
3112 | + |
3113 | static int skcipher_setkey_blkcipher(struct crypto_skcipher *tfm, |
3114 | const u8 *key, unsigned int keylen) |
3115 | { |
3116 | @@ -597,8 +603,10 @@ static int skcipher_setkey_blkcipher(struct crypto_skcipher *tfm, |
3117 | err = crypto_blkcipher_setkey(blkcipher, key, keylen); |
3118 | crypto_skcipher_set_flags(tfm, crypto_blkcipher_get_flags(blkcipher) & |
3119 | CRYPTO_TFM_RES_MASK); |
3120 | - if (err) |
3121 | + if (unlikely(err)) { |
3122 | + skcipher_set_needkey(tfm); |
3123 | return err; |
3124 | + } |
3125 | |
3126 | crypto_skcipher_clear_flags(tfm, CRYPTO_TFM_NEED_KEY); |
3127 | return 0; |
3128 | @@ -676,8 +684,7 @@ static int crypto_init_skcipher_ops_blkcipher(struct crypto_tfm *tfm) |
3129 | skcipher->ivsize = crypto_blkcipher_ivsize(blkcipher); |
3130 | skcipher->keysize = calg->cra_blkcipher.max_keysize; |
3131 | |
3132 | - if (skcipher->keysize) |
3133 | - crypto_skcipher_set_flags(skcipher, CRYPTO_TFM_NEED_KEY); |
3134 | + skcipher_set_needkey(skcipher); |
3135 | |
3136 | return 0; |
3137 | } |
3138 | @@ -697,8 +704,10 @@ static int skcipher_setkey_ablkcipher(struct crypto_skcipher *tfm, |
3139 | crypto_skcipher_set_flags(tfm, |
3140 | crypto_ablkcipher_get_flags(ablkcipher) & |
3141 | CRYPTO_TFM_RES_MASK); |
3142 | - if (err) |
3143 | + if (unlikely(err)) { |
3144 | + skcipher_set_needkey(tfm); |
3145 | return err; |
3146 | + } |
3147 | |
3148 | crypto_skcipher_clear_flags(tfm, CRYPTO_TFM_NEED_KEY); |
3149 | return 0; |
3150 | @@ -775,8 +784,7 @@ static int crypto_init_skcipher_ops_ablkcipher(struct crypto_tfm *tfm) |
3151 | sizeof(struct ablkcipher_request); |
3152 | skcipher->keysize = calg->cra_ablkcipher.max_keysize; |
3153 | |
3154 | - if (skcipher->keysize) |
3155 | - crypto_skcipher_set_flags(skcipher, CRYPTO_TFM_NEED_KEY); |
3156 | + skcipher_set_needkey(skcipher); |
3157 | |
3158 | return 0; |
3159 | } |
3160 | @@ -819,8 +827,10 @@ static int skcipher_setkey(struct crypto_skcipher *tfm, const u8 *key, |
3161 | else |
3162 | err = cipher->setkey(tfm, key, keylen); |
3163 | |
3164 | - if (err) |
3165 | + if (unlikely(err)) { |
3166 | + skcipher_set_needkey(tfm); |
3167 | return err; |
3168 | + } |
3169 | |
3170 | crypto_skcipher_clear_flags(tfm, CRYPTO_TFM_NEED_KEY); |
3171 | return 0; |
3172 | @@ -852,8 +862,7 @@ static int crypto_skcipher_init_tfm(struct crypto_tfm *tfm) |
3173 | skcipher->ivsize = alg->ivsize; |
3174 | skcipher->keysize = alg->max_keysize; |
3175 | |
3176 | - if (skcipher->keysize) |
3177 | - crypto_skcipher_set_flags(skcipher, CRYPTO_TFM_NEED_KEY); |
3178 | + skcipher_set_needkey(skcipher); |
3179 | |
3180 | if (alg->exit) |
3181 | skcipher->base.exit = crypto_skcipher_exit_tfm; |
3182 | diff --git a/crypto/testmgr.c b/crypto/testmgr.c |
3183 | index 54d882ffe438..3664c26f4838 100644 |
3184 | --- a/crypto/testmgr.c |
3185 | +++ b/crypto/testmgr.c |
3186 | @@ -1894,14 +1894,21 @@ static int alg_test_crc32c(const struct alg_test_desc *desc, |
3187 | |
3188 | err = alg_test_hash(desc, driver, type, mask); |
3189 | if (err) |
3190 | - goto out; |
3191 | + return err; |
3192 | |
3193 | tfm = crypto_alloc_shash(driver, type, mask); |
3194 | if (IS_ERR(tfm)) { |
3195 | + if (PTR_ERR(tfm) == -ENOENT) { |
3196 | + /* |
3197 | + * This crc32c implementation is only available through |
3198 | + * ahash API, not the shash API, so the remaining part |
3199 | + * of the test is not applicable to it. |
3200 | + */ |
3201 | + return 0; |
3202 | + } |
3203 | printk(KERN_ERR "alg: crc32c: Failed to load transform for %s: " |
3204 | "%ld\n", driver, PTR_ERR(tfm)); |
3205 | - err = PTR_ERR(tfm); |
3206 | - goto out; |
3207 | + return PTR_ERR(tfm); |
3208 | } |
3209 | |
3210 | do { |
3211 | @@ -1928,7 +1935,6 @@ static int alg_test_crc32c(const struct alg_test_desc *desc, |
3212 | |
3213 | crypto_free_shash(tfm); |
3214 | |
3215 | -out: |
3216 | return err; |
3217 | } |
3218 | |
3219 | diff --git a/crypto/testmgr.h b/crypto/testmgr.h |
3220 | index 11e6f17fe724..862ee1d04263 100644 |
3221 | --- a/crypto/testmgr.h |
3222 | +++ b/crypto/testmgr.h |
3223 | @@ -11416,6 +11416,31 @@ static const struct cipher_testvec aes_cfb_tv_template[] = { |
3224 | "\x75\xa3\x85\x74\x1a\xb9\xce\xf8" |
3225 | "\x20\x31\x62\x3d\x55\xb1\xe4\x71", |
3226 | .len = 64, |
3227 | + .also_non_np = 1, |
3228 | + .np = 2, |
3229 | + .tap = { 31, 33 }, |
3230 | + }, { /* > 16 bytes, not a multiple of 16 bytes */ |
3231 | + .key = "\x2b\x7e\x15\x16\x28\xae\xd2\xa6" |
3232 | + "\xab\xf7\x15\x88\x09\xcf\x4f\x3c", |
3233 | + .klen = 16, |
3234 | + .iv = "\x00\x01\x02\x03\x04\x05\x06\x07" |
3235 | + "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f", |
3236 | + .ptext = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96" |
3237 | + "\xe9\x3d\x7e\x11\x73\x93\x17\x2a" |
3238 | + "\xae", |
3239 | + .ctext = "\x3b\x3f\xd9\x2e\xb7\x2d\xad\x20" |
3240 | + "\x33\x34\x49\xf8\xe8\x3c\xfb\x4a" |
3241 | + "\xc8", |
3242 | + .len = 17, |
3243 | + }, { /* < 16 bytes */ |
3244 | + .key = "\x2b\x7e\x15\x16\x28\xae\xd2\xa6" |
3245 | + "\xab\xf7\x15\x88\x09\xcf\x4f\x3c", |
3246 | + .klen = 16, |
3247 | + .iv = "\x00\x01\x02\x03\x04\x05\x06\x07" |
3248 | + "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f", |
3249 | + .ptext = "\x6b\xc1\xbe\xe2\x2e\x40\x9f", |
3250 | + .ctext = "\x3b\x3f\xd9\x2e\xb7\x2d\xad", |
3251 | + .len = 7, |
3252 | }, |
3253 | }; |
3254 | |
3255 | diff --git a/drivers/acpi/device_sysfs.c b/drivers/acpi/device_sysfs.c |
3256 | index 545e91420cde..8940054d6250 100644 |
3257 | --- a/drivers/acpi/device_sysfs.c |
3258 | +++ b/drivers/acpi/device_sysfs.c |
3259 | @@ -202,11 +202,15 @@ static int create_of_modalias(struct acpi_device *acpi_dev, char *modalias, |
3260 | { |
3261 | struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER }; |
3262 | const union acpi_object *of_compatible, *obj; |
3263 | + acpi_status status; |
3264 | int len, count; |
3265 | int i, nval; |
3266 | char *c; |
3267 | |
3268 | - acpi_get_name(acpi_dev->handle, ACPI_SINGLE_NAME, &buf); |
3269 | + status = acpi_get_name(acpi_dev->handle, ACPI_SINGLE_NAME, &buf); |
3270 | + if (ACPI_FAILURE(status)) |
3271 | + return -ENODEV; |
3272 | + |
3273 | /* DT strings are all in lower case */ |
3274 | for (c = buf.pointer; *c != '\0'; c++) |
3275 | *c = tolower(*c); |
3276 | diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c |
3277 | index f530d3541242..df2175b1169a 100644 |
3278 | --- a/drivers/acpi/nfit/core.c |
3279 | +++ b/drivers/acpi/nfit/core.c |
3280 | @@ -397,7 +397,7 @@ static int cmd_to_func(struct nfit_mem *nfit_mem, unsigned int cmd, |
3281 | if (call_pkg) { |
3282 | int i; |
3283 | |
3284 | - if (nfit_mem->family != call_pkg->nd_family) |
3285 | + if (nfit_mem && nfit_mem->family != call_pkg->nd_family) |
3286 | return -ENOTTY; |
3287 | |
3288 | for (i = 0; i < ARRAY_SIZE(call_pkg->nd_reserved2); i++) |
3289 | @@ -406,6 +406,10 @@ static int cmd_to_func(struct nfit_mem *nfit_mem, unsigned int cmd, |
3290 | return call_pkg->nd_command; |
3291 | } |
3292 | |
3293 | + /* In the !call_pkg case, bus commands == bus functions */ |
3294 | + if (!nfit_mem) |
3295 | + return cmd; |
3296 | + |
3297 | /* Linux ND commands == NVDIMM_FAMILY_INTEL function numbers */ |
3298 | if (nfit_mem->family == NVDIMM_FAMILY_INTEL) |
3299 | return cmd; |
3300 | @@ -436,17 +440,18 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm, |
3301 | if (cmd_rc) |
3302 | *cmd_rc = -EINVAL; |
3303 | |
3304 | + if (cmd == ND_CMD_CALL) |
3305 | + call_pkg = buf; |
3306 | + func = cmd_to_func(nfit_mem, cmd, call_pkg); |
3307 | + if (func < 0) |
3308 | + return func; |
3309 | + |
3310 | if (nvdimm) { |
3311 | struct acpi_device *adev = nfit_mem->adev; |
3312 | |
3313 | if (!adev) |
3314 | return -ENOTTY; |
3315 | |
3316 | - if (cmd == ND_CMD_CALL) |
3317 | - call_pkg = buf; |
3318 | - func = cmd_to_func(nfit_mem, cmd, call_pkg); |
3319 | - if (func < 0) |
3320 | - return func; |
3321 | dimm_name = nvdimm_name(nvdimm); |
3322 | cmd_name = nvdimm_cmd_name(cmd); |
3323 | cmd_mask = nvdimm_cmd_mask(nvdimm); |
3324 | @@ -457,12 +462,9 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm, |
3325 | } else { |
3326 | struct acpi_device *adev = to_acpi_dev(acpi_desc); |
3327 | |
3328 | - func = cmd; |
3329 | cmd_name = nvdimm_bus_cmd_name(cmd); |
3330 | cmd_mask = nd_desc->cmd_mask; |
3331 | - dsm_mask = cmd_mask; |
3332 | - if (cmd == ND_CMD_CALL) |
3333 | - dsm_mask = nd_desc->bus_dsm_mask; |
3334 | + dsm_mask = nd_desc->bus_dsm_mask; |
3335 | desc = nd_cmd_bus_desc(cmd); |
3336 | guid = to_nfit_uuid(NFIT_DEV_BUS); |
3337 | handle = adev->handle; |
3338 | @@ -533,6 +535,13 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm, |
3339 | return -EINVAL; |
3340 | } |
3341 | |
3342 | + if (out_obj->type != ACPI_TYPE_BUFFER) { |
3343 | + dev_dbg(dev, "%s unexpected output object type cmd: %s type: %d\n", |
3344 | + dimm_name, cmd_name, out_obj->type); |
3345 | + rc = -EINVAL; |
3346 | + goto out; |
3347 | + } |
3348 | + |
3349 | if (call_pkg) { |
3350 | call_pkg->nd_fw_size = out_obj->buffer.length; |
3351 | memcpy(call_pkg->nd_payload + call_pkg->nd_size_in, |
3352 | @@ -551,13 +560,6 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm, |
3353 | return 0; |
3354 | } |
3355 | |
3356 | - if (out_obj->package.type != ACPI_TYPE_BUFFER) { |
3357 | - dev_dbg(dev, "%s unexpected output object type cmd: %s type: %d\n", |
3358 | - dimm_name, cmd_name, out_obj->type); |
3359 | - rc = -EINVAL; |
3360 | - goto out; |
3361 | - } |
3362 | - |
3363 | dev_dbg(dev, "%s cmd: %s output length: %d\n", dimm_name, |
3364 | cmd_name, out_obj->buffer.length); |
3365 | print_hex_dump_debug(cmd_name, DUMP_PREFIX_OFFSET, 4, 4, |
3366 | @@ -2890,14 +2892,16 @@ static int ars_register(struct acpi_nfit_desc *acpi_desc, |
3367 | { |
3368 | int rc; |
3369 | |
3370 | - if (no_init_ars || test_bit(ARS_FAILED, &nfit_spa->ars_state)) |
3371 | + if (test_bit(ARS_FAILED, &nfit_spa->ars_state)) |
3372 | return acpi_nfit_register_region(acpi_desc, nfit_spa); |
3373 | |
3374 | set_bit(ARS_REQ_SHORT, &nfit_spa->ars_state); |
3375 | - set_bit(ARS_REQ_LONG, &nfit_spa->ars_state); |
3376 | + if (!no_init_ars) |
3377 | + set_bit(ARS_REQ_LONG, &nfit_spa->ars_state); |
3378 | |
3379 | switch (acpi_nfit_query_poison(acpi_desc)) { |
3380 | case 0: |
3381 | + case -ENOSPC: |
3382 | case -EAGAIN: |
3383 | rc = ars_start(acpi_desc, nfit_spa, ARS_REQ_SHORT); |
3384 | /* shouldn't happen, try again later */ |
3385 | @@ -2922,7 +2926,6 @@ static int ars_register(struct acpi_nfit_desc *acpi_desc, |
3386 | break; |
3387 | case -EBUSY: |
3388 | case -ENOMEM: |
3389 | - case -ENOSPC: |
3390 | /* |
3391 | * BIOS was using ARS, wait for it to complete (or |
3392 | * resources to become available) and then perform our |
3393 | diff --git a/drivers/auxdisplay/ht16k33.c b/drivers/auxdisplay/ht16k33.c |
3394 | index a43276c76fc6..21393ec3b9a4 100644 |
3395 | --- a/drivers/auxdisplay/ht16k33.c |
3396 | +++ b/drivers/auxdisplay/ht16k33.c |
3397 | @@ -509,7 +509,7 @@ static int ht16k33_remove(struct i2c_client *client) |
3398 | struct ht16k33_priv *priv = i2c_get_clientdata(client); |
3399 | struct ht16k33_fbdev *fbdev = &priv->fbdev; |
3400 | |
3401 | - cancel_delayed_work(&fbdev->work); |
3402 | + cancel_delayed_work_sync(&fbdev->work); |
3403 | unregister_framebuffer(fbdev->info); |
3404 | framebuffer_release(fbdev->info); |
3405 | free_page((unsigned long) fbdev->buffer); |
3406 | diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c |
3407 | index 5fa1898755a3..7c84f64c74f7 100644 |
3408 | --- a/drivers/base/power/wakeup.c |
3409 | +++ b/drivers/base/power/wakeup.c |
3410 | @@ -118,7 +118,6 @@ void wakeup_source_drop(struct wakeup_source *ws) |
3411 | if (!ws) |
3412 | return; |
3413 | |
3414 | - del_timer_sync(&ws->timer); |
3415 | __pm_relax(ws); |
3416 | } |
3417 | EXPORT_SYMBOL_GPL(wakeup_source_drop); |
3418 | @@ -205,6 +204,13 @@ void wakeup_source_remove(struct wakeup_source *ws) |
3419 | list_del_rcu(&ws->entry); |
3420 | raw_spin_unlock_irqrestore(&events_lock, flags); |
3421 | synchronize_srcu(&wakeup_srcu); |
3422 | + |
3423 | + del_timer_sync(&ws->timer); |
3424 | + /* |
3425 | + * Clear timer.function to make wakeup_source_not_registered() treat |
3426 | + * this wakeup source as not registered. |
3427 | + */ |
3428 | + ws->timer.function = NULL; |
3429 | } |
3430 | EXPORT_SYMBOL_GPL(wakeup_source_remove); |
3431 | |
3432 | diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c |
3433 | index fdabd0b74492..a8de56f1936d 100644 |
3434 | --- a/drivers/block/floppy.c |
3435 | +++ b/drivers/block/floppy.c |
3436 | @@ -4084,7 +4084,7 @@ static unsigned int floppy_check_events(struct gendisk *disk, |
3437 | |
3438 | if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) { |
3439 | if (lock_fdc(drive)) |
3440 | - return -EINTR; |
3441 | + return 0; |
3442 | poll_drive(false, 0); |
3443 | process_fd_request(); |
3444 | } |
3445 | diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c |
3446 | index 5faa917df1b6..82d831b103f9 100644 |
3447 | --- a/drivers/char/ipmi/ipmi_si_intf.c |
3448 | +++ b/drivers/char/ipmi/ipmi_si_intf.c |
3449 | @@ -2085,6 +2085,11 @@ static int try_smi_init(struct smi_info *new_smi) |
3450 | WARN_ON(new_smi->io.dev->init_name != NULL); |
3451 | |
3452 | out_err: |
3453 | + if (rv && new_smi->io.io_cleanup) { |
3454 | + new_smi->io.io_cleanup(&new_smi->io); |
3455 | + new_smi->io.io_cleanup = NULL; |
3456 | + } |
3457 | + |
3458 | kfree(init_name); |
3459 | return rv; |
3460 | } |
3461 | diff --git a/drivers/char/ipmi/ipmi_si_mem_io.c b/drivers/char/ipmi/ipmi_si_mem_io.c |
3462 | index 1b869d530884..638f4ab88f44 100644 |
3463 | --- a/drivers/char/ipmi/ipmi_si_mem_io.c |
3464 | +++ b/drivers/char/ipmi/ipmi_si_mem_io.c |
3465 | @@ -81,8 +81,6 @@ int ipmi_si_mem_setup(struct si_sm_io *io) |
3466 | if (!addr) |
3467 | return -ENODEV; |
3468 | |
3469 | - io->io_cleanup = mem_cleanup; |
3470 | - |
3471 | /* |
3472 | * Figure out the actual readb/readw/readl/etc routine to use based |
3473 | * upon the register size. |
3474 | @@ -141,5 +139,8 @@ int ipmi_si_mem_setup(struct si_sm_io *io) |
3475 | mem_region_cleanup(io, io->io_size); |
3476 | return -EIO; |
3477 | } |
3478 | + |
3479 | + io->io_cleanup = mem_cleanup; |
3480 | + |
3481 | return 0; |
3482 | } |
3483 | diff --git a/drivers/char/ipmi/ipmi_si_port_io.c b/drivers/char/ipmi/ipmi_si_port_io.c |
3484 | index ef6dffcea9fa..03924c32b6e9 100644 |
3485 | --- a/drivers/char/ipmi/ipmi_si_port_io.c |
3486 | +++ b/drivers/char/ipmi/ipmi_si_port_io.c |
3487 | @@ -68,8 +68,6 @@ int ipmi_si_port_setup(struct si_sm_io *io) |
3488 | if (!addr) |
3489 | return -ENODEV; |
3490 | |
3491 | - io->io_cleanup = port_cleanup; |
3492 | - |
3493 | /* |
3494 | * Figure out the actual inb/inw/inl/etc routine to use based |
3495 | * upon the register size. |
3496 | @@ -109,5 +107,8 @@ int ipmi_si_port_setup(struct si_sm_io *io) |
3497 | return -EIO; |
3498 | } |
3499 | } |
3500 | + |
3501 | + io->io_cleanup = port_cleanup; |
3502 | + |
3503 | return 0; |
3504 | } |
3505 | diff --git a/drivers/char/tpm/st33zp24/st33zp24.c b/drivers/char/tpm/st33zp24/st33zp24.c |
3506 | index abd675bec88c..694fc58888c1 100644 |
3507 | --- a/drivers/char/tpm/st33zp24/st33zp24.c |
3508 | +++ b/drivers/char/tpm/st33zp24/st33zp24.c |
3509 | @@ -436,7 +436,7 @@ static int st33zp24_send(struct tpm_chip *chip, unsigned char *buf, |
3510 | goto out_err; |
3511 | } |
3512 | |
3513 | - return len; |
3514 | + return 0; |
3515 | out_err: |
3516 | st33zp24_cancel(chip); |
3517 | release_locality(chip); |
3518 | diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c |
3519 | index 1010cb79dcc6..43c3f9b87614 100644 |
3520 | --- a/drivers/char/tpm/tpm-interface.c |
3521 | +++ b/drivers/char/tpm/tpm-interface.c |
3522 | @@ -495,10 +495,19 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip, |
3523 | if (rc < 0) { |
3524 | if (rc != -EPIPE) |
3525 | dev_err(&chip->dev, |
3526 | - "%s: tpm_send: error %d\n", __func__, rc); |
3527 | + "%s: send(): error %d\n", __func__, rc); |
3528 | goto out; |
3529 | } |
3530 | |
3531 | + /* A sanity check. send() should just return zero on success e.g. |
3532 | + * not the command length. |
3533 | + */ |
3534 | + if (rc > 0) { |
3535 | + dev_warn(&chip->dev, |
3536 | + "%s: send(): invalid value %d\n", __func__, rc); |
3537 | + rc = 0; |
3538 | + } |
3539 | + |
3540 | if (chip->flags & TPM_CHIP_FLAG_IRQ) |
3541 | goto out_recv; |
3542 | |
3543 | diff --git a/drivers/char/tpm/tpm_atmel.c b/drivers/char/tpm/tpm_atmel.c |
3544 | index 66a14526aaf4..a290b30a0c35 100644 |
3545 | --- a/drivers/char/tpm/tpm_atmel.c |
3546 | +++ b/drivers/char/tpm/tpm_atmel.c |
3547 | @@ -105,7 +105,7 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count) |
3548 | iowrite8(buf[i], priv->iobase); |
3549 | } |
3550 | |
3551 | - return count; |
3552 | + return 0; |
3553 | } |
3554 | |
3555 | static void tpm_atml_cancel(struct tpm_chip *chip) |
3556 | diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c |
3557 | index 36952ef98f90..763fc7e6c005 100644 |
3558 | --- a/drivers/char/tpm/tpm_crb.c |
3559 | +++ b/drivers/char/tpm/tpm_crb.c |
3560 | @@ -287,19 +287,29 @@ static int crb_recv(struct tpm_chip *chip, u8 *buf, size_t count) |
3561 | struct crb_priv *priv = dev_get_drvdata(&chip->dev); |
3562 | unsigned int expected; |
3563 | |
3564 | - /* sanity check */ |
3565 | - if (count < 6) |
3566 | + /* A sanity check that the upper layer wants to get at least the header |
3567 | + * as that is the minimum size for any TPM response. |
3568 | + */ |
3569 | + if (count < TPM_HEADER_SIZE) |
3570 | return -EIO; |
3571 | |
3572 | + /* If this bit is set, according to the spec, the TPM is in |
3573 | + * unrecoverable condition. |
3574 | + */ |
3575 | if (ioread32(&priv->regs_t->ctrl_sts) & CRB_CTRL_STS_ERROR) |
3576 | return -EIO; |
3577 | |
3578 | - memcpy_fromio(buf, priv->rsp, 6); |
3579 | - expected = be32_to_cpup((__be32 *) &buf[2]); |
3580 | - if (expected > count || expected < 6) |
3581 | + /* Read the first 8 bytes in order to get the length of the response. |
3582 | + * We read exactly a quad word in order to make sure that the remaining |
3583 | + * reads will be aligned. |
3584 | + */ |
3585 | + memcpy_fromio(buf, priv->rsp, 8); |
3586 | + |
3587 | + expected = be32_to_cpup((__be32 *)&buf[2]); |
3588 | + if (expected > count || expected < TPM_HEADER_SIZE) |
3589 | return -EIO; |
3590 | |
3591 | - memcpy_fromio(&buf[6], &priv->rsp[6], expected - 6); |
3592 | + memcpy_fromio(&buf[8], &priv->rsp[8], expected - 8); |
3593 | |
3594 | return expected; |
3595 | } |
3596 | diff --git a/drivers/char/tpm/tpm_i2c_atmel.c b/drivers/char/tpm/tpm_i2c_atmel.c |
3597 | index 95ce2e9ccdc6..32a8e27c5382 100644 |
3598 | --- a/drivers/char/tpm/tpm_i2c_atmel.c |
3599 | +++ b/drivers/char/tpm/tpm_i2c_atmel.c |
3600 | @@ -65,7 +65,11 @@ static int i2c_atmel_send(struct tpm_chip *chip, u8 *buf, size_t len) |
3601 | dev_dbg(&chip->dev, |
3602 | "%s(buf=%*ph len=%0zx) -> sts=%d\n", __func__, |
3603 | (int)min_t(size_t, 64, len), buf, len, status); |
3604 | - return status; |
3605 | + |
3606 | + if (status < 0) |
3607 | + return status; |
3608 | + |
3609 | + return 0; |
3610 | } |
3611 | |
3612 | static int i2c_atmel_recv(struct tpm_chip *chip, u8 *buf, size_t count) |
3613 | diff --git a/drivers/char/tpm/tpm_i2c_infineon.c b/drivers/char/tpm/tpm_i2c_infineon.c |
3614 | index 9086edc9066b..977fd42daa1b 100644 |
3615 | --- a/drivers/char/tpm/tpm_i2c_infineon.c |
3616 | +++ b/drivers/char/tpm/tpm_i2c_infineon.c |
3617 | @@ -587,7 +587,7 @@ static int tpm_tis_i2c_send(struct tpm_chip *chip, u8 *buf, size_t len) |
3618 | /* go and do it */ |
3619 | iic_tpm_write(TPM_STS(tpm_dev.locality), &sts, 1); |
3620 | |
3621 | - return len; |
3622 | + return 0; |
3623 | out_err: |
3624 | tpm_tis_i2c_ready(chip); |
3625 | /* The TPM needs some time to clean up here, |
3626 | diff --git a/drivers/char/tpm/tpm_i2c_nuvoton.c b/drivers/char/tpm/tpm_i2c_nuvoton.c |
3627 | index f74f451baf6a..b8defdfdf2dc 100644 |
3628 | --- a/drivers/char/tpm/tpm_i2c_nuvoton.c |
3629 | +++ b/drivers/char/tpm/tpm_i2c_nuvoton.c |
3630 | @@ -469,7 +469,7 @@ static int i2c_nuvoton_send(struct tpm_chip *chip, u8 *buf, size_t len) |
3631 | } |
3632 | |
3633 | dev_dbg(dev, "%s() -> %zd\n", __func__, len); |
3634 | - return len; |
3635 | + return 0; |
3636 | } |
3637 | |
3638 | static bool i2c_nuvoton_req_canceled(struct tpm_chip *chip, u8 status) |
3639 | diff --git a/drivers/char/tpm/tpm_ibmvtpm.c b/drivers/char/tpm/tpm_ibmvtpm.c |
3640 | index 25f6e2665385..77e47dc5aacc 100644 |
3641 | --- a/drivers/char/tpm/tpm_ibmvtpm.c |
3642 | +++ b/drivers/char/tpm/tpm_ibmvtpm.c |
3643 | @@ -141,14 +141,14 @@ static int tpm_ibmvtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count) |
3644 | } |
3645 | |
3646 | /** |
3647 | - * tpm_ibmvtpm_send - Send tpm request |
3648 | - * |
3649 | + * tpm_ibmvtpm_send() - Send a TPM command |
3650 | * @chip: tpm chip struct |
3651 | * @buf: buffer contains data to send |
3652 | * @count: size of buffer |
3653 | * |
3654 | * Return: |
3655 | - * Number of bytes sent or < 0 on error. |
3656 | + * 0 on success, |
3657 | + * -errno on error |
3658 | */ |
3659 | static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count) |
3660 | { |
3661 | @@ -194,7 +194,7 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count) |
3662 | rc = 0; |
3663 | ibmvtpm->tpm_processing_cmd = false; |
3664 | } else |
3665 | - rc = count; |
3666 | + rc = 0; |
3667 | |
3668 | spin_unlock(&ibmvtpm->rtce_lock); |
3669 | return rc; |
3670 | diff --git a/drivers/char/tpm/tpm_infineon.c b/drivers/char/tpm/tpm_infineon.c |
3671 | index d8f10047fbba..97f6d4fe0aee 100644 |
3672 | --- a/drivers/char/tpm/tpm_infineon.c |
3673 | +++ b/drivers/char/tpm/tpm_infineon.c |
3674 | @@ -354,7 +354,7 @@ static int tpm_inf_send(struct tpm_chip *chip, u8 * buf, size_t count) |
3675 | for (i = 0; i < count; i++) { |
3676 | wait_and_send(chip, buf[i]); |
3677 | } |
3678 | - return count; |
3679 | + return 0; |
3680 | } |
3681 | |
3682 | static void tpm_inf_cancel(struct tpm_chip *chip) |
3683 | diff --git a/drivers/char/tpm/tpm_nsc.c b/drivers/char/tpm/tpm_nsc.c |
3684 | index 5d6cce74cd3f..9bee3c5eb4bf 100644 |
3685 | --- a/drivers/char/tpm/tpm_nsc.c |
3686 | +++ b/drivers/char/tpm/tpm_nsc.c |
3687 | @@ -226,7 +226,7 @@ static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count) |
3688 | } |
3689 | outb(NSC_COMMAND_EOC, priv->base + NSC_COMMAND); |
3690 | |
3691 | - return count; |
3692 | + return 0; |
3693 | } |
3694 | |
3695 | static void tpm_nsc_cancel(struct tpm_chip *chip) |
3696 | diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c |
3697 | index d2345d9fd7b5..0eaea3a7b8f4 100644 |
3698 | --- a/drivers/char/tpm/tpm_tis_core.c |
3699 | +++ b/drivers/char/tpm/tpm_tis_core.c |
3700 | @@ -485,7 +485,7 @@ static int tpm_tis_send_main(struct tpm_chip *chip, const u8 *buf, size_t len) |
3701 | goto out_err; |
3702 | } |
3703 | } |
3704 | - return len; |
3705 | + return 0; |
3706 | out_err: |
3707 | tpm_tis_ready(chip); |
3708 | return rc; |
3709 | diff --git a/drivers/char/tpm/tpm_vtpm_proxy.c b/drivers/char/tpm/tpm_vtpm_proxy.c |
3710 | index 87a0ce47f201..ecbb63f8d231 100644 |
3711 | --- a/drivers/char/tpm/tpm_vtpm_proxy.c |
3712 | +++ b/drivers/char/tpm/tpm_vtpm_proxy.c |
3713 | @@ -335,7 +335,6 @@ static int vtpm_proxy_is_driver_command(struct tpm_chip *chip, |
3714 | static int vtpm_proxy_tpm_op_send(struct tpm_chip *chip, u8 *buf, size_t count) |
3715 | { |
3716 | struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev); |
3717 | - int rc = 0; |
3718 | |
3719 | if (count > sizeof(proxy_dev->buffer)) { |
3720 | dev_err(&chip->dev, |
3721 | @@ -366,7 +365,7 @@ static int vtpm_proxy_tpm_op_send(struct tpm_chip *chip, u8 *buf, size_t count) |
3722 | |
3723 | wake_up_interruptible(&proxy_dev->wq); |
3724 | |
3725 | - return rc; |
3726 | + return 0; |
3727 | } |
3728 | |
3729 | static void vtpm_proxy_tpm_op_cancel(struct tpm_chip *chip) |
3730 | diff --git a/drivers/char/tpm/xen-tpmfront.c b/drivers/char/tpm/xen-tpmfront.c |
3731 | index b150f87f38f5..5a327eb7f63a 100644 |
3732 | --- a/drivers/char/tpm/xen-tpmfront.c |
3733 | +++ b/drivers/char/tpm/xen-tpmfront.c |
3734 | @@ -173,7 +173,7 @@ static int vtpm_send(struct tpm_chip *chip, u8 *buf, size_t count) |
3735 | return -ETIME; |
3736 | } |
3737 | |
3738 | - return count; |
3739 | + return 0; |
3740 | } |
3741 | |
3742 | static int vtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count) |
3743 | diff --git a/drivers/clk/clk-twl6040.c b/drivers/clk/clk-twl6040.c |
3744 | index 25dfe050ae9f..4bd1b32a4f93 100644 |
3745 | --- a/drivers/clk/clk-twl6040.c |
3746 | +++ b/drivers/clk/clk-twl6040.c |
3747 | @@ -41,6 +41,43 @@ static int twl6040_pdmclk_is_prepared(struct clk_hw *hw) |
3748 | return pdmclk->enabled; |
3749 | } |
3750 | |
3751 | +static int twl6040_pdmclk_reset_one_clock(struct twl6040_pdmclk *pdmclk, |
3752 | + unsigned int reg) |
3753 | +{ |
3754 | + const u8 reset_mask = TWL6040_HPLLRST; /* Same for HPPLL and LPPLL */ |
3755 | + int ret; |
3756 | + |
3757 | + ret = twl6040_set_bits(pdmclk->twl6040, reg, reset_mask); |
3758 | + if (ret < 0) |
3759 | + return ret; |
3760 | + |
3761 | + ret = twl6040_clear_bits(pdmclk->twl6040, reg, reset_mask); |
3762 | + if (ret < 0) |
3763 | + return ret; |
3764 | + |
3765 | + return 0; |
3766 | +} |
3767 | + |
3768 | +/* |
3769 | + * TWL6040A2 Phoenix Audio IC erratum #6: "PDM Clock Generation Issue At |
3770 | + * Cold Temperature". This affects cold boot and deeper idle states it |
3771 | + * seems. The workaround consists of resetting HPPLL and LPPLL. |
3772 | + */ |
3773 | +static int twl6040_pdmclk_quirk_reset_clocks(struct twl6040_pdmclk *pdmclk) |
3774 | +{ |
3775 | + int ret; |
3776 | + |
3777 | + ret = twl6040_pdmclk_reset_one_clock(pdmclk, TWL6040_REG_HPPLLCTL); |
3778 | + if (ret) |
3779 | + return ret; |
3780 | + |
3781 | + ret = twl6040_pdmclk_reset_one_clock(pdmclk, TWL6040_REG_LPPLLCTL); |
3782 | + if (ret) |
3783 | + return ret; |
3784 | + |
3785 | + return 0; |
3786 | +} |
3787 | + |
3788 | static int twl6040_pdmclk_prepare(struct clk_hw *hw) |
3789 | { |
3790 | struct twl6040_pdmclk *pdmclk = container_of(hw, struct twl6040_pdmclk, |
3791 | @@ -48,8 +85,20 @@ static int twl6040_pdmclk_prepare(struct clk_hw *hw) |
3792 | int ret; |
3793 | |
3794 | ret = twl6040_power(pdmclk->twl6040, 1); |
3795 | - if (!ret) |
3796 | - pdmclk->enabled = 1; |
3797 | + if (ret) |
3798 | + return ret; |
3799 | + |
3800 | + ret = twl6040_pdmclk_quirk_reset_clocks(pdmclk); |
3801 | + if (ret) |
3802 | + goto out_err; |
3803 | + |
3804 | + pdmclk->enabled = 1; |
3805 | + |
3806 | + return 0; |
3807 | + |
3808 | +out_err: |
3809 | + dev_err(pdmclk->dev, "%s: error %i\n", __func__, ret); |
3810 | + twl6040_power(pdmclk->twl6040, 0); |
3811 | |
3812 | return ret; |
3813 | } |
3814 | diff --git a/drivers/clk/ingenic/cgu.c b/drivers/clk/ingenic/cgu.c |
3815 | index 5ef7d9ba2195..b40160eb3372 100644 |
3816 | --- a/drivers/clk/ingenic/cgu.c |
3817 | +++ b/drivers/clk/ingenic/cgu.c |
3818 | @@ -426,16 +426,16 @@ ingenic_clk_round_rate(struct clk_hw *hw, unsigned long req_rate, |
3819 | struct ingenic_clk *ingenic_clk = to_ingenic_clk(hw); |
3820 | struct ingenic_cgu *cgu = ingenic_clk->cgu; |
3821 | const struct ingenic_cgu_clk_info *clk_info; |
3822 | - long rate = *parent_rate; |
3823 | + unsigned int div = 1; |
3824 | |
3825 | clk_info = &cgu->clock_info[ingenic_clk->idx]; |
3826 | |
3827 | if (clk_info->type & CGU_CLK_DIV) |
3828 | - rate /= ingenic_clk_calc_div(clk_info, *parent_rate, req_rate); |
3829 | + div = ingenic_clk_calc_div(clk_info, *parent_rate, req_rate); |
3830 | else if (clk_info->type & CGU_CLK_FIXDIV) |
3831 | - rate /= clk_info->fixdiv.div; |
3832 | + div = clk_info->fixdiv.div; |
3833 | |
3834 | - return rate; |
3835 | + return DIV_ROUND_UP(*parent_rate, div); |
3836 | } |
3837 | |
3838 | static int |
3839 | @@ -455,7 +455,7 @@ ingenic_clk_set_rate(struct clk_hw *hw, unsigned long req_rate, |
3840 | |
3841 | if (clk_info->type & CGU_CLK_DIV) { |
3842 | div = ingenic_clk_calc_div(clk_info, parent_rate, req_rate); |
3843 | - rate = parent_rate / div; |
3844 | + rate = DIV_ROUND_UP(parent_rate, div); |
3845 | |
3846 | if (rate != req_rate) |
3847 | return -EINVAL; |
3848 | diff --git a/drivers/clk/ingenic/cgu.h b/drivers/clk/ingenic/cgu.h |
3849 | index 502bcbb61b04..e12716d8ce3c 100644 |
3850 | --- a/drivers/clk/ingenic/cgu.h |
3851 | +++ b/drivers/clk/ingenic/cgu.h |
3852 | @@ -80,7 +80,7 @@ struct ingenic_cgu_mux_info { |
3853 | * @reg: offset of the divider control register within the CGU |
3854 | * @shift: number of bits to left shift the divide value by (ie. the index of |
3855 | * the lowest bit of the divide value within its control register) |
3856 | - * @div: number of bits to divide the divider value by (i.e. if the |
3857 | + * @div: number to divide the divider value by (i.e. if the |
3858 | * effective divider value is the value written to the register |
3859 | * multiplied by some constant) |
3860 | * @bits: the size of the divide value in bits |
3861 | diff --git a/drivers/clk/samsung/clk-exynos5-subcmu.c b/drivers/clk/samsung/clk-exynos5-subcmu.c |
3862 | index 93306283d764..8ae44b5db4c2 100644 |
3863 | --- a/drivers/clk/samsung/clk-exynos5-subcmu.c |
3864 | +++ b/drivers/clk/samsung/clk-exynos5-subcmu.c |
3865 | @@ -136,15 +136,20 @@ static int __init exynos5_clk_register_subcmu(struct device *parent, |
3866 | { |
3867 | struct of_phandle_args genpdspec = { .np = pd_node }; |
3868 | struct platform_device *pdev; |
3869 | + int ret; |
3870 | + |
3871 | + pdev = platform_device_alloc("exynos5-subcmu", PLATFORM_DEVID_AUTO); |
3872 | + if (!pdev) |
3873 | + return -ENOMEM; |
3874 | |
3875 | - pdev = platform_device_alloc(info->pd_name, -1); |
3876 | pdev->dev.parent = parent; |
3877 | - pdev->driver_override = "exynos5-subcmu"; |
3878 | platform_set_drvdata(pdev, (void *)info); |
3879 | of_genpd_add_device(&genpdspec, &pdev->dev); |
3880 | - platform_device_add(pdev); |
3881 | + ret = platform_device_add(pdev); |
3882 | + if (ret) |
3883 | + platform_device_put(pdev); |
3884 | |
3885 | - return 0; |
3886 | + return ret; |
3887 | } |
3888 | |
3889 | static int __init exynos5_clk_probe(struct platform_device *pdev) |
3890 | diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c |
3891 | index 3b97f60540ad..609970c0b666 100644 |
3892 | --- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c |
3893 | +++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c |
3894 | @@ -264,9 +264,9 @@ static SUNXI_CCU_GATE(ahb1_mmc1_clk, "ahb1-mmc1", "ahb1", |
3895 | static SUNXI_CCU_GATE(ahb1_mmc2_clk, "ahb1-mmc2", "ahb1", |
3896 | 0x060, BIT(10), 0); |
3897 | static SUNXI_CCU_GATE(ahb1_mmc3_clk, "ahb1-mmc3", "ahb1", |
3898 | - 0x060, BIT(12), 0); |
3899 | + 0x060, BIT(11), 0); |
3900 | static SUNXI_CCU_GATE(ahb1_nand1_clk, "ahb1-nand1", "ahb1", |
3901 | - 0x060, BIT(13), 0); |
3902 | + 0x060, BIT(12), 0); |
3903 | static SUNXI_CCU_GATE(ahb1_nand0_clk, "ahb1-nand0", "ahb1", |
3904 | 0x060, BIT(13), 0); |
3905 | static SUNXI_CCU_GATE(ahb1_sdram_clk, "ahb1-sdram", "ahb1", |
3906 | diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c |
3907 | index 621b1cd996db..ac12f261f8ca 100644 |
3908 | --- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c |
3909 | +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c |
3910 | @@ -542,7 +542,7 @@ static struct ccu_reset_map sun8i_v3s_ccu_resets[] = { |
3911 | [RST_BUS_OHCI0] = { 0x2c0, BIT(29) }, |
3912 | |
3913 | [RST_BUS_VE] = { 0x2c4, BIT(0) }, |
3914 | - [RST_BUS_TCON0] = { 0x2c4, BIT(3) }, |
3915 | + [RST_BUS_TCON0] = { 0x2c4, BIT(4) }, |
3916 | [RST_BUS_CSI] = { 0x2c4, BIT(8) }, |
3917 | [RST_BUS_DE] = { 0x2c4, BIT(12) }, |
3918 | [RST_BUS_DBG] = { 0x2c4, BIT(31) }, |
3919 | diff --git a/drivers/clk/uniphier/clk-uniphier-cpugear.c b/drivers/clk/uniphier/clk-uniphier-cpugear.c |
3920 | index ec11f55594ad..5d2d42b7e182 100644 |
3921 | --- a/drivers/clk/uniphier/clk-uniphier-cpugear.c |
3922 | +++ b/drivers/clk/uniphier/clk-uniphier-cpugear.c |
3923 | @@ -47,7 +47,7 @@ static int uniphier_clk_cpugear_set_parent(struct clk_hw *hw, u8 index) |
3924 | return ret; |
3925 | |
3926 | ret = regmap_write_bits(gear->regmap, |
3927 | - gear->regbase + UNIPHIER_CLK_CPUGEAR_SET, |
3928 | + gear->regbase + UNIPHIER_CLK_CPUGEAR_UPD, |
3929 | UNIPHIER_CLK_CPUGEAR_UPD_BIT, |
3930 | UNIPHIER_CLK_CPUGEAR_UPD_BIT); |
3931 | if (ret) |
3932 | diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig |
3933 | index 316d48d7be72..c1ddafa4c299 100644 |
3934 | --- a/drivers/clocksource/Kconfig |
3935 | +++ b/drivers/clocksource/Kconfig |
3936 | @@ -365,6 +365,16 @@ config ARM64_ERRATUM_858921 |
3937 | The workaround will be dynamically enabled when an affected |
3938 | core is detected. |
3939 | |
3940 | +config SUN50I_ERRATUM_UNKNOWN1 |
3941 | + bool "Workaround for Allwinner A64 erratum UNKNOWN1" |
3942 | + default y |
3943 | + depends on ARM_ARCH_TIMER && ARM64 && ARCH_SUNXI |
3944 | + select ARM_ARCH_TIMER_OOL_WORKAROUND |
3945 | + help |
3946 | + This option enables a workaround for instability in the timer on |
3947 | + the Allwinner A64 SoC. The workaround will only be active if the |
3948 | + allwinner,erratum-unknown1 property is found in the timer node. |
3949 | + |
3950 | config ARM_GLOBAL_TIMER |
3951 | bool "Support for the ARM global timer" if COMPILE_TEST |
3952 | select TIMER_OF if OF |
3953 | diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c |
3954 | index d8c7f5750cdb..0445ad7e559e 100644 |
3955 | --- a/drivers/clocksource/arm_arch_timer.c |
3956 | +++ b/drivers/clocksource/arm_arch_timer.c |
3957 | @@ -319,6 +319,48 @@ static u64 notrace arm64_858921_read_cntvct_el0(void) |
3958 | } |
3959 | #endif |
3960 | |
3961 | +#ifdef CONFIG_SUN50I_ERRATUM_UNKNOWN1 |
3962 | +/* |
3963 | + * The low bits of the counter registers are indeterminate while bit 10 or |
3964 | + * greater is rolling over. Since the counter value can jump both backward |
3965 | + * (7ff -> 000 -> 800) and forward (7ff -> fff -> 800), ignore register values |
3966 | + * with all ones or all zeros in the low bits. Bound the loop by the maximum |
3967 | + * number of CPU cycles in 3 consecutive 24 MHz counter periods. |
3968 | + */ |
3969 | +#define __sun50i_a64_read_reg(reg) ({ \ |
3970 | + u64 _val; \ |
3971 | + int _retries = 150; \ |
3972 | + \ |
3973 | + do { \ |
3974 | + _val = read_sysreg(reg); \ |
3975 | + _retries--; \ |
3976 | + } while (((_val + 1) & GENMASK(9, 0)) <= 1 && _retries); \ |
3977 | + \ |
3978 | + WARN_ON_ONCE(!_retries); \ |
3979 | + _val; \ |
3980 | +}) |
3981 | + |
3982 | +static u64 notrace sun50i_a64_read_cntpct_el0(void) |
3983 | +{ |
3984 | + return __sun50i_a64_read_reg(cntpct_el0); |
3985 | +} |
3986 | + |
3987 | +static u64 notrace sun50i_a64_read_cntvct_el0(void) |
3988 | +{ |
3989 | + return __sun50i_a64_read_reg(cntvct_el0); |
3990 | +} |
3991 | + |
3992 | +static u32 notrace sun50i_a64_read_cntp_tval_el0(void) |
3993 | +{ |
3994 | + return read_sysreg(cntp_cval_el0) - sun50i_a64_read_cntpct_el0(); |
3995 | +} |
3996 | + |
3997 | +static u32 notrace sun50i_a64_read_cntv_tval_el0(void) |
3998 | +{ |
3999 | + return read_sysreg(cntv_cval_el0) - sun50i_a64_read_cntvct_el0(); |
4000 | +} |
4001 | +#endif |
4002 | + |
4003 | #ifdef CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND |
4004 | DEFINE_PER_CPU(const struct arch_timer_erratum_workaround *, timer_unstable_counter_workaround); |
4005 | EXPORT_SYMBOL_GPL(timer_unstable_counter_workaround); |
4006 | @@ -408,6 +450,19 @@ static const struct arch_timer_erratum_workaround ool_workarounds[] = { |
4007 | .read_cntvct_el0 = arm64_858921_read_cntvct_el0, |
4008 | }, |
4009 | #endif |
4010 | +#ifdef CONFIG_SUN50I_ERRATUM_UNKNOWN1 |
4011 | + { |
4012 | + .match_type = ate_match_dt, |
4013 | + .id = "allwinner,erratum-unknown1", |
4014 | + .desc = "Allwinner erratum UNKNOWN1", |
4015 | + .read_cntp_tval_el0 = sun50i_a64_read_cntp_tval_el0, |
4016 | + .read_cntv_tval_el0 = sun50i_a64_read_cntv_tval_el0, |
4017 | + .read_cntpct_el0 = sun50i_a64_read_cntpct_el0, |
4018 | + .read_cntvct_el0 = sun50i_a64_read_cntvct_el0, |
4019 | + .set_next_event_phys = erratum_set_next_event_tval_phys, |
4020 | + .set_next_event_virt = erratum_set_next_event_tval_virt, |
4021 | + }, |
4022 | +#endif |
4023 | }; |
4024 | |
4025 | typedef bool (*ate_match_fn_t)(const struct arch_timer_erratum_workaround *, |
4026 | diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c |
4027 | index 7a244b681876..d55c30f6981d 100644 |
4028 | --- a/drivers/clocksource/exynos_mct.c |
4029 | +++ b/drivers/clocksource/exynos_mct.c |
4030 | @@ -388,6 +388,13 @@ static void exynos4_mct_tick_start(unsigned long cycles, |
4031 | exynos4_mct_write(tmp, mevt->base + MCT_L_TCON_OFFSET); |
4032 | } |
4033 | |
4034 | +static void exynos4_mct_tick_clear(struct mct_clock_event_device *mevt) |
4035 | +{ |
4036 | + /* Clear the MCT tick interrupt */ |
4037 | + if (readl_relaxed(reg_base + mevt->base + MCT_L_INT_CSTAT_OFFSET) & 1) |
4038 | + exynos4_mct_write(0x1, mevt->base + MCT_L_INT_CSTAT_OFFSET); |
4039 | +} |
4040 | + |
4041 | static int exynos4_tick_set_next_event(unsigned long cycles, |
4042 | struct clock_event_device *evt) |
4043 | { |
4044 | @@ -404,6 +411,7 @@ static int set_state_shutdown(struct clock_event_device *evt) |
4045 | |
4046 | mevt = container_of(evt, struct mct_clock_event_device, evt); |
4047 | exynos4_mct_tick_stop(mevt); |
4048 | + exynos4_mct_tick_clear(mevt); |
4049 | return 0; |
4050 | } |
4051 | |
4052 | @@ -420,8 +428,11 @@ static int set_state_periodic(struct clock_event_device *evt) |
4053 | return 0; |
4054 | } |
4055 | |
4056 | -static void exynos4_mct_tick_clear(struct mct_clock_event_device *mevt) |
4057 | +static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id) |
4058 | { |
4059 | + struct mct_clock_event_device *mevt = dev_id; |
4060 | + struct clock_event_device *evt = &mevt->evt; |
4061 | + |
4062 | /* |
4063 | * This is for supporting oneshot mode. |
4064 | * Mct would generate interrupt periodically |
4065 | @@ -430,16 +441,6 @@ static void exynos4_mct_tick_clear(struct mct_clock_event_device *mevt) |
4066 | if (!clockevent_state_periodic(&mevt->evt)) |
4067 | exynos4_mct_tick_stop(mevt); |
4068 | |
4069 | - /* Clear the MCT tick interrupt */ |
4070 | - if (readl_relaxed(reg_base + mevt->base + MCT_L_INT_CSTAT_OFFSET) & 1) |
4071 | - exynos4_mct_write(0x1, mevt->base + MCT_L_INT_CSTAT_OFFSET); |
4072 | -} |
4073 | - |
4074 | -static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id) |
4075 | -{ |
4076 | - struct mct_clock_event_device *mevt = dev_id; |
4077 | - struct clock_event_device *evt = &mevt->evt; |
4078 | - |
4079 | exynos4_mct_tick_clear(mevt); |
4080 | |
4081 | evt->event_handler(evt); |
4082 | diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-ti-dm.c |
4083 | index 4cce6b224b87..3ecf84706640 100644 |
4084 | --- a/drivers/clocksource/timer-ti-dm.c |
4085 | +++ b/drivers/clocksource/timer-ti-dm.c |
4086 | @@ -154,6 +154,10 @@ static int omap_dm_timer_of_set_source(struct omap_dm_timer *timer) |
4087 | if (IS_ERR(parent)) |
4088 | return -ENODEV; |
4089 | |
4090 | + /* Bail out if both clocks point to fck */ |
4091 | + if (clk_is_match(parent, timer->fclk)) |
4092 | + return 0; |
4093 | + |
4094 | ret = clk_set_parent(timer->fclk, parent); |
4095 | if (ret < 0) |
4096 | pr_err("%s: failed to set parent\n", __func__); |
4097 | diff --git a/drivers/cpufreq/pxa2xx-cpufreq.c b/drivers/cpufreq/pxa2xx-cpufreq.c |
4098 | index 46254e583982..74e0e0c20c46 100644 |
4099 | --- a/drivers/cpufreq/pxa2xx-cpufreq.c |
4100 | +++ b/drivers/cpufreq/pxa2xx-cpufreq.c |
4101 | @@ -143,7 +143,7 @@ static int pxa_cpufreq_change_voltage(const struct pxa_freqs *pxa_freq) |
4102 | return ret; |
4103 | } |
4104 | |
4105 | -static void __init pxa_cpufreq_init_voltages(void) |
4106 | +static void pxa_cpufreq_init_voltages(void) |
4107 | { |
4108 | vcc_core = regulator_get(NULL, "vcc_core"); |
4109 | if (IS_ERR(vcc_core)) { |
4110 | @@ -159,7 +159,7 @@ static int pxa_cpufreq_change_voltage(const struct pxa_freqs *pxa_freq) |
4111 | return 0; |
4112 | } |
4113 | |
4114 | -static void __init pxa_cpufreq_init_voltages(void) { } |
4115 | +static void pxa_cpufreq_init_voltages(void) { } |
4116 | #endif |
4117 | |
4118 | static void find_freq_tables(struct cpufreq_frequency_table **freq_table, |
4119 | diff --git a/drivers/cpufreq/qcom-cpufreq-kryo.c b/drivers/cpufreq/qcom-cpufreq-kryo.c |
4120 | index 2a3675c24032..a472b814058f 100644 |
4121 | --- a/drivers/cpufreq/qcom-cpufreq-kryo.c |
4122 | +++ b/drivers/cpufreq/qcom-cpufreq-kryo.c |
4123 | @@ -75,7 +75,7 @@ static enum _msm8996_version qcom_cpufreq_kryo_get_msm_id(void) |
4124 | |
4125 | static int qcom_cpufreq_kryo_probe(struct platform_device *pdev) |
4126 | { |
4127 | - struct opp_table *opp_tables[NR_CPUS] = {0}; |
4128 | + struct opp_table **opp_tables; |
4129 | enum _msm8996_version msm8996_version; |
4130 | struct nvmem_cell *speedbin_nvmem; |
4131 | struct device_node *np; |
4132 | @@ -133,6 +133,10 @@ static int qcom_cpufreq_kryo_probe(struct platform_device *pdev) |
4133 | } |
4134 | kfree(speedbin); |
4135 | |
4136 | + opp_tables = kcalloc(num_possible_cpus(), sizeof(*opp_tables), GFP_KERNEL); |
4137 | + if (!opp_tables) |
4138 | + return -ENOMEM; |
4139 | + |
4140 | for_each_possible_cpu(cpu) { |
4141 | cpu_dev = get_cpu_device(cpu); |
4142 | if (NULL == cpu_dev) { |
4143 | @@ -151,8 +155,10 @@ static int qcom_cpufreq_kryo_probe(struct platform_device *pdev) |
4144 | |
4145 | cpufreq_dt_pdev = platform_device_register_simple("cpufreq-dt", -1, |
4146 | NULL, 0); |
4147 | - if (!IS_ERR(cpufreq_dt_pdev)) |
4148 | + if (!IS_ERR(cpufreq_dt_pdev)) { |
4149 | + platform_set_drvdata(pdev, opp_tables); |
4150 | return 0; |
4151 | + } |
4152 | |
4153 | ret = PTR_ERR(cpufreq_dt_pdev); |
4154 | dev_err(cpu_dev, "Failed to register platform device\n"); |
4155 | @@ -163,13 +169,23 @@ free_opp: |
4156 | break; |
4157 | dev_pm_opp_put_supported_hw(opp_tables[cpu]); |
4158 | } |
4159 | + kfree(opp_tables); |
4160 | |
4161 | return ret; |
4162 | } |
4163 | |
4164 | static int qcom_cpufreq_kryo_remove(struct platform_device *pdev) |
4165 | { |
4166 | + struct opp_table **opp_tables = platform_get_drvdata(pdev); |
4167 | + unsigned int cpu; |
4168 | + |
4169 | platform_device_unregister(cpufreq_dt_pdev); |
4170 | + |
4171 | + for_each_possible_cpu(cpu) |
4172 | + dev_pm_opp_put_supported_hw(opp_tables[cpu]); |
4173 | + |
4174 | + kfree(opp_tables); |
4175 | + |
4176 | return 0; |
4177 | } |
4178 | |
4179 | diff --git a/drivers/cpufreq/tegra124-cpufreq.c b/drivers/cpufreq/tegra124-cpufreq.c |
4180 | index 43530254201a..4bb154f6c54c 100644 |
4181 | --- a/drivers/cpufreq/tegra124-cpufreq.c |
4182 | +++ b/drivers/cpufreq/tegra124-cpufreq.c |
4183 | @@ -134,6 +134,8 @@ static int tegra124_cpufreq_probe(struct platform_device *pdev) |
4184 | |
4185 | platform_set_drvdata(pdev, priv); |
4186 | |
4187 | + of_node_put(np); |
4188 | + |
4189 | return 0; |
4190 | |
4191 | out_switch_to_pllx: |
4192 | diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c |
4193 | index ec40f991e6c6..9bc54c3c2cb9 100644 |
4194 | --- a/drivers/crypto/caam/caamalg.c |
4195 | +++ b/drivers/crypto/caam/caamalg.c |
4196 | @@ -1005,6 +1005,7 @@ static void init_aead_job(struct aead_request *req, |
4197 | if (unlikely(req->src != req->dst)) { |
4198 | if (edesc->dst_nents == 1) { |
4199 | dst_dma = sg_dma_address(req->dst); |
4200 | + out_options = 0; |
4201 | } else { |
4202 | dst_dma = edesc->sec4_sg_dma + |
4203 | sec4_sg_index * |
4204 | diff --git a/drivers/crypto/caam/caamhash.c b/drivers/crypto/caam/caamhash.c |
4205 | index f84ca2ff61de..f5fd00065650 100644 |
4206 | --- a/drivers/crypto/caam/caamhash.c |
4207 | +++ b/drivers/crypto/caam/caamhash.c |
4208 | @@ -118,6 +118,7 @@ struct caam_hash_ctx { |
4209 | struct caam_hash_state { |
4210 | dma_addr_t buf_dma; |
4211 | dma_addr_t ctx_dma; |
4212 | + int ctx_dma_len; |
4213 | u8 buf_0[CAAM_MAX_HASH_BLOCK_SIZE] ____cacheline_aligned; |
4214 | int buflen_0; |
4215 | u8 buf_1[CAAM_MAX_HASH_BLOCK_SIZE] ____cacheline_aligned; |
4216 | @@ -170,6 +171,7 @@ static inline int map_seq_out_ptr_ctx(u32 *desc, struct device *jrdev, |
4217 | struct caam_hash_state *state, |
4218 | int ctx_len) |
4219 | { |
4220 | + state->ctx_dma_len = ctx_len; |
4221 | state->ctx_dma = dma_map_single(jrdev, state->caam_ctx, |
4222 | ctx_len, DMA_FROM_DEVICE); |
4223 | if (dma_mapping_error(jrdev, state->ctx_dma)) { |
4224 | @@ -183,18 +185,6 @@ static inline int map_seq_out_ptr_ctx(u32 *desc, struct device *jrdev, |
4225 | return 0; |
4226 | } |
4227 | |
4228 | -/* Map req->result, and append seq_out_ptr command that points to it */ |
4229 | -static inline dma_addr_t map_seq_out_ptr_result(u32 *desc, struct device *jrdev, |
4230 | - u8 *result, int digestsize) |
4231 | -{ |
4232 | - dma_addr_t dst_dma; |
4233 | - |
4234 | - dst_dma = dma_map_single(jrdev, result, digestsize, DMA_FROM_DEVICE); |
4235 | - append_seq_out_ptr(desc, dst_dma, digestsize, 0); |
4236 | - |
4237 | - return dst_dma; |
4238 | -} |
4239 | - |
4240 | /* Map current buffer in state (if length > 0) and put it in link table */ |
4241 | static inline int buf_map_to_sec4_sg(struct device *jrdev, |
4242 | struct sec4_sg_entry *sec4_sg, |
4243 | @@ -223,6 +213,7 @@ static inline int ctx_map_to_sec4_sg(struct device *jrdev, |
4244 | struct caam_hash_state *state, int ctx_len, |
4245 | struct sec4_sg_entry *sec4_sg, u32 flag) |
4246 | { |
4247 | + state->ctx_dma_len = ctx_len; |
4248 | state->ctx_dma = dma_map_single(jrdev, state->caam_ctx, ctx_len, flag); |
4249 | if (dma_mapping_error(jrdev, state->ctx_dma)) { |
4250 | dev_err(jrdev, "unable to map ctx\n"); |
4251 | @@ -485,7 +476,6 @@ static int ahash_setkey(struct crypto_ahash *ahash, |
4252 | |
4253 | /* |
4254 | * ahash_edesc - s/w-extended ahash descriptor |
4255 | - * @dst_dma: physical mapped address of req->result |
4256 | * @sec4_sg_dma: physical mapped address of h/w link table |
4257 | * @src_nents: number of segments in input scatterlist |
4258 | * @sec4_sg_bytes: length of dma mapped sec4_sg space |
4259 | @@ -493,7 +483,6 @@ static int ahash_setkey(struct crypto_ahash *ahash, |
4260 | * @sec4_sg: h/w link table |
4261 | */ |
4262 | struct ahash_edesc { |
4263 | - dma_addr_t dst_dma; |
4264 | dma_addr_t sec4_sg_dma; |
4265 | int src_nents; |
4266 | int sec4_sg_bytes; |
4267 | @@ -509,8 +498,6 @@ static inline void ahash_unmap(struct device *dev, |
4268 | |
4269 | if (edesc->src_nents) |
4270 | dma_unmap_sg(dev, req->src, edesc->src_nents, DMA_TO_DEVICE); |
4271 | - if (edesc->dst_dma) |
4272 | - dma_unmap_single(dev, edesc->dst_dma, dst_len, DMA_FROM_DEVICE); |
4273 | |
4274 | if (edesc->sec4_sg_bytes) |
4275 | dma_unmap_single(dev, edesc->sec4_sg_dma, |
4276 | @@ -527,12 +514,10 @@ static inline void ahash_unmap_ctx(struct device *dev, |
4277 | struct ahash_edesc *edesc, |
4278 | struct ahash_request *req, int dst_len, u32 flag) |
4279 | { |
4280 | - struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); |
4281 | - struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); |
4282 | struct caam_hash_state *state = ahash_request_ctx(req); |
4283 | |
4284 | if (state->ctx_dma) { |
4285 | - dma_unmap_single(dev, state->ctx_dma, ctx->ctx_len, flag); |
4286 | + dma_unmap_single(dev, state->ctx_dma, state->ctx_dma_len, flag); |
4287 | state->ctx_dma = 0; |
4288 | } |
4289 | ahash_unmap(dev, edesc, req, dst_len); |
4290 | @@ -545,9 +530,9 @@ static void ahash_done(struct device *jrdev, u32 *desc, u32 err, |
4291 | struct ahash_edesc *edesc; |
4292 | struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); |
4293 | int digestsize = crypto_ahash_digestsize(ahash); |
4294 | + struct caam_hash_state *state = ahash_request_ctx(req); |
4295 | #ifdef DEBUG |
4296 | struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); |
4297 | - struct caam_hash_state *state = ahash_request_ctx(req); |
4298 | |
4299 | dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err); |
4300 | #endif |
4301 | @@ -556,17 +541,14 @@ static void ahash_done(struct device *jrdev, u32 *desc, u32 err, |
4302 | if (err) |
4303 | caam_jr_strstatus(jrdev, err); |
4304 | |
4305 | - ahash_unmap(jrdev, edesc, req, digestsize); |
4306 | + ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_FROM_DEVICE); |
4307 | + memcpy(req->result, state->caam_ctx, digestsize); |
4308 | kfree(edesc); |
4309 | |
4310 | #ifdef DEBUG |
4311 | print_hex_dump(KERN_ERR, "ctx@"__stringify(__LINE__)": ", |
4312 | DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx, |
4313 | ctx->ctx_len, 1); |
4314 | - if (req->result) |
4315 | - print_hex_dump(KERN_ERR, "result@"__stringify(__LINE__)": ", |
4316 | - DUMP_PREFIX_ADDRESS, 16, 4, req->result, |
4317 | - digestsize, 1); |
4318 | #endif |
4319 | |
4320 | req->base.complete(&req->base, err); |
4321 | @@ -614,9 +596,9 @@ static void ahash_done_ctx_src(struct device *jrdev, u32 *desc, u32 err, |
4322 | struct ahash_edesc *edesc; |
4323 | struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); |
4324 | int digestsize = crypto_ahash_digestsize(ahash); |
4325 | + struct caam_hash_state *state = ahash_request_ctx(req); |
4326 | #ifdef DEBUG |
4327 | struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); |
4328 | - struct caam_hash_state *state = ahash_request_ctx(req); |
4329 | |
4330 | dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err); |
4331 | #endif |
4332 | @@ -625,17 +607,14 @@ static void ahash_done_ctx_src(struct device *jrdev, u32 *desc, u32 err, |
4333 | if (err) |
4334 | caam_jr_strstatus(jrdev, err); |
4335 | |
4336 | - ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_TO_DEVICE); |
4337 | + ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_BIDIRECTIONAL); |
4338 | + memcpy(req->result, state->caam_ctx, digestsize); |
4339 | kfree(edesc); |
4340 | |
4341 | #ifdef DEBUG |
4342 | print_hex_dump(KERN_ERR, "ctx@"__stringify(__LINE__)": ", |
4343 | DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx, |
4344 | ctx->ctx_len, 1); |
4345 | - if (req->result) |
4346 | - print_hex_dump(KERN_ERR, "result@"__stringify(__LINE__)": ", |
4347 | - DUMP_PREFIX_ADDRESS, 16, 4, req->result, |
4348 | - digestsize, 1); |
4349 | #endif |
4350 | |
4351 | req->base.complete(&req->base, err); |
4352 | @@ -896,7 +875,7 @@ static int ahash_final_ctx(struct ahash_request *req) |
4353 | edesc->sec4_sg_bytes = sec4_sg_bytes; |
4354 | |
4355 | ret = ctx_map_to_sec4_sg(jrdev, state, ctx->ctx_len, |
4356 | - edesc->sec4_sg, DMA_TO_DEVICE); |
4357 | + edesc->sec4_sg, DMA_BIDIRECTIONAL); |
4358 | if (ret) |
4359 | goto unmap_ctx; |
4360 | |
4361 | @@ -916,14 +895,7 @@ static int ahash_final_ctx(struct ahash_request *req) |
4362 | |
4363 | append_seq_in_ptr(desc, edesc->sec4_sg_dma, ctx->ctx_len + buflen, |
4364 | LDST_SGF); |
4365 | - |
4366 | - edesc->dst_dma = map_seq_out_ptr_result(desc, jrdev, req->result, |
4367 | - digestsize); |
4368 | - if (dma_mapping_error(jrdev, edesc->dst_dma)) { |
4369 | - dev_err(jrdev, "unable to map dst\n"); |
4370 | - ret = -ENOMEM; |
4371 | - goto unmap_ctx; |
4372 | - } |
4373 | + append_seq_out_ptr(desc, state->ctx_dma, digestsize, 0); |
4374 | |
4375 | #ifdef DEBUG |
4376 | print_hex_dump(KERN_ERR, "jobdesc@"__stringify(__LINE__)": ", |
4377 | @@ -936,7 +908,7 @@ static int ahash_final_ctx(struct ahash_request *req) |
4378 | |
4379 | return -EINPROGRESS; |
4380 | unmap_ctx: |
4381 | - ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_FROM_DEVICE); |
4382 | + ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_BIDIRECTIONAL); |
4383 | kfree(edesc); |
4384 | return ret; |
4385 | } |
4386 | @@ -990,7 +962,7 @@ static int ahash_finup_ctx(struct ahash_request *req) |
4387 | edesc->src_nents = src_nents; |
4388 | |
4389 | ret = ctx_map_to_sec4_sg(jrdev, state, ctx->ctx_len, |
4390 | - edesc->sec4_sg, DMA_TO_DEVICE); |
4391 | + edesc->sec4_sg, DMA_BIDIRECTIONAL); |
4392 | if (ret) |
4393 | goto unmap_ctx; |
4394 | |
4395 | @@ -1004,13 +976,7 @@ static int ahash_finup_ctx(struct ahash_request *req) |
4396 | if (ret) |
4397 | goto unmap_ctx; |
4398 | |
4399 | - edesc->dst_dma = map_seq_out_ptr_result(desc, jrdev, req->result, |
4400 | - digestsize); |
4401 | - if (dma_mapping_error(jrdev, edesc->dst_dma)) { |
4402 | - dev_err(jrdev, "unable to map dst\n"); |
4403 | - ret = -ENOMEM; |
4404 | - goto unmap_ctx; |
4405 | - } |
4406 | + append_seq_out_ptr(desc, state->ctx_dma, digestsize, 0); |
4407 | |
4408 | #ifdef DEBUG |
4409 | print_hex_dump(KERN_ERR, "jobdesc@"__stringify(__LINE__)": ", |
4410 | @@ -1023,7 +989,7 @@ static int ahash_finup_ctx(struct ahash_request *req) |
4411 | |
4412 | return -EINPROGRESS; |
4413 | unmap_ctx: |
4414 | - ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_FROM_DEVICE); |
4415 | + ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_BIDIRECTIONAL); |
4416 | kfree(edesc); |
4417 | return ret; |
4418 | } |
4419 | @@ -1082,10 +1048,8 @@ static int ahash_digest(struct ahash_request *req) |
4420 | |
4421 | desc = edesc->hw_desc; |
4422 | |
4423 | - edesc->dst_dma = map_seq_out_ptr_result(desc, jrdev, req->result, |
4424 | - digestsize); |
4425 | - if (dma_mapping_error(jrdev, edesc->dst_dma)) { |
4426 | - dev_err(jrdev, "unable to map dst\n"); |
4427 | + ret = map_seq_out_ptr_ctx(desc, jrdev, state, digestsize); |
4428 | + if (ret) { |
4429 | ahash_unmap(jrdev, edesc, req, digestsize); |
4430 | kfree(edesc); |
4431 | return -ENOMEM; |
4432 | @@ -1100,7 +1064,7 @@ static int ahash_digest(struct ahash_request *req) |
4433 | if (!ret) { |
4434 | ret = -EINPROGRESS; |
4435 | } else { |
4436 | - ahash_unmap(jrdev, edesc, req, digestsize); |
4437 | + ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_FROM_DEVICE); |
4438 | kfree(edesc); |
4439 | } |
4440 | |
4441 | @@ -1142,12 +1106,9 @@ static int ahash_final_no_ctx(struct ahash_request *req) |
4442 | append_seq_in_ptr(desc, state->buf_dma, buflen, 0); |
4443 | } |
4444 | |
4445 | - edesc->dst_dma = map_seq_out_ptr_result(desc, jrdev, req->result, |
4446 | - digestsize); |
4447 | - if (dma_mapping_error(jrdev, edesc->dst_dma)) { |
4448 | - dev_err(jrdev, "unable to map dst\n"); |
4449 | + ret = map_seq_out_ptr_ctx(desc, jrdev, state, digestsize); |
4450 | + if (ret) |
4451 | goto unmap; |
4452 | - } |
4453 | |
4454 | #ifdef DEBUG |
4455 | print_hex_dump(KERN_ERR, "jobdesc@"__stringify(__LINE__)": ", |
4456 | @@ -1158,7 +1119,7 @@ static int ahash_final_no_ctx(struct ahash_request *req) |
4457 | if (!ret) { |
4458 | ret = -EINPROGRESS; |
4459 | } else { |
4460 | - ahash_unmap(jrdev, edesc, req, digestsize); |
4461 | + ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_FROM_DEVICE); |
4462 | kfree(edesc); |
4463 | } |
4464 | |
4465 | @@ -1357,12 +1318,9 @@ static int ahash_finup_no_ctx(struct ahash_request *req) |
4466 | goto unmap; |
4467 | } |
4468 | |
4469 | - edesc->dst_dma = map_seq_out_ptr_result(desc, jrdev, req->result, |
4470 | - digestsize); |
4471 | - if (dma_mapping_error(jrdev, edesc->dst_dma)) { |
4472 | - dev_err(jrdev, "unable to map dst\n"); |
4473 | + ret = map_seq_out_ptr_ctx(desc, jrdev, state, digestsize); |
4474 | + if (ret) |
4475 | goto unmap; |
4476 | - } |
4477 | |
4478 | #ifdef DEBUG |
4479 | print_hex_dump(KERN_ERR, "jobdesc@"__stringify(__LINE__)": ", |
4480 | @@ -1373,7 +1331,7 @@ static int ahash_finup_no_ctx(struct ahash_request *req) |
4481 | if (!ret) { |
4482 | ret = -EINPROGRESS; |
4483 | } else { |
4484 | - ahash_unmap(jrdev, edesc, req, digestsize); |
4485 | + ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_FROM_DEVICE); |
4486 | kfree(edesc); |
4487 | } |
4488 | |
4489 | @@ -1505,6 +1463,7 @@ static int ahash_init(struct ahash_request *req) |
4490 | state->final = ahash_final_no_ctx; |
4491 | |
4492 | state->ctx_dma = 0; |
4493 | + state->ctx_dma_len = 0; |
4494 | state->current_buf = 0; |
4495 | state->buf_dma = 0; |
4496 | state->buflen_0 = 0; |
4497 | diff --git a/drivers/crypto/ccree/cc_buffer_mgr.c b/drivers/crypto/ccree/cc_buffer_mgr.c |
4498 | index dd948e1df9e5..3bcb6bce666e 100644 |
4499 | --- a/drivers/crypto/ccree/cc_buffer_mgr.c |
4500 | +++ b/drivers/crypto/ccree/cc_buffer_mgr.c |
4501 | @@ -614,10 +614,10 @@ void cc_unmap_aead_request(struct device *dev, struct aead_request *req) |
4502 | hw_iv_size, DMA_BIDIRECTIONAL); |
4503 | } |
4504 | |
4505 | - /*In case a pool was set, a table was |
4506 | - *allocated and should be released |
4507 | - */ |
4508 | - if (areq_ctx->mlli_params.curr_pool) { |
4509 | + /* Release pool */ |
4510 | + if ((areq_ctx->assoc_buff_type == CC_DMA_BUF_MLLI || |
4511 | + areq_ctx->data_buff_type == CC_DMA_BUF_MLLI) && |
4512 | + (areq_ctx->mlli_params.mlli_virt_addr)) { |
4513 | dev_dbg(dev, "free MLLI buffer: dma=%pad virt=%pK\n", |
4514 | &areq_ctx->mlli_params.mlli_dma_addr, |
4515 | areq_ctx->mlli_params.mlli_virt_addr); |
4516 | diff --git a/drivers/crypto/ccree/cc_cipher.c b/drivers/crypto/ccree/cc_cipher.c |
4517 | index 7623b29911af..54a39164aab8 100644 |
4518 | --- a/drivers/crypto/ccree/cc_cipher.c |
4519 | +++ b/drivers/crypto/ccree/cc_cipher.c |
4520 | @@ -79,6 +79,7 @@ static int validate_keys_sizes(struct cc_cipher_ctx *ctx_p, u32 size) |
4521 | default: |
4522 | break; |
4523 | } |
4524 | + break; |
4525 | case S_DIN_to_DES: |
4526 | if (size == DES3_EDE_KEY_SIZE || size == DES_KEY_SIZE) |
4527 | return 0; |
4528 | @@ -634,6 +635,8 @@ static void cc_cipher_complete(struct device *dev, void *cc_req, int err) |
4529 | unsigned int ivsize = crypto_skcipher_ivsize(sk_tfm); |
4530 | unsigned int len; |
4531 | |
4532 | + cc_unmap_cipher_request(dev, req_ctx, ivsize, src, dst); |
4533 | + |
4534 | switch (ctx_p->cipher_mode) { |
4535 | case DRV_CIPHER_CBC: |
4536 | /* |
4537 | @@ -663,7 +666,6 @@ static void cc_cipher_complete(struct device *dev, void *cc_req, int err) |
4538 | break; |
4539 | } |
4540 | |
4541 | - cc_unmap_cipher_request(dev, req_ctx, ivsize, src, dst); |
4542 | kzfree(req_ctx->iv); |
4543 | |
4544 | skcipher_request_complete(req, err); |
4545 | @@ -781,7 +783,8 @@ static int cc_cipher_decrypt(struct skcipher_request *req) |
4546 | |
4547 | memset(req_ctx, 0, sizeof(*req_ctx)); |
4548 | |
4549 | - if (ctx_p->cipher_mode == DRV_CIPHER_CBC) { |
4550 | + if ((ctx_p->cipher_mode == DRV_CIPHER_CBC) && |
4551 | + (req->cryptlen >= ivsize)) { |
4552 | |
4553 | /* Allocate and save the last IV sized bytes of the source, |
4554 | * which will be lost in case of in-place decryption. |
4555 | diff --git a/drivers/crypto/rockchip/rk3288_crypto.c b/drivers/crypto/rockchip/rk3288_crypto.c |
4556 | index c9d622abd90c..0ce4a65b95f5 100644 |
4557 | --- a/drivers/crypto/rockchip/rk3288_crypto.c |
4558 | +++ b/drivers/crypto/rockchip/rk3288_crypto.c |
4559 | @@ -119,7 +119,7 @@ static int rk_load_data(struct rk_crypto_info *dev, |
4560 | count = (dev->left_bytes > PAGE_SIZE) ? |
4561 | PAGE_SIZE : dev->left_bytes; |
4562 | |
4563 | - if (!sg_pcopy_to_buffer(dev->first, dev->nents, |
4564 | + if (!sg_pcopy_to_buffer(dev->first, dev->src_nents, |
4565 | dev->addr_vir, count, |
4566 | dev->total - dev->left_bytes)) { |
4567 | dev_err(dev->dev, "[%s:%d] pcopy err\n", |
4568 | diff --git a/drivers/crypto/rockchip/rk3288_crypto.h b/drivers/crypto/rockchip/rk3288_crypto.h |
4569 | index d5fb4013fb42..54ee5b3ed9db 100644 |
4570 | --- a/drivers/crypto/rockchip/rk3288_crypto.h |
4571 | +++ b/drivers/crypto/rockchip/rk3288_crypto.h |
4572 | @@ -207,7 +207,8 @@ struct rk_crypto_info { |
4573 | void *addr_vir; |
4574 | int aligned; |
4575 | int align_size; |
4576 | - size_t nents; |
4577 | + size_t src_nents; |
4578 | + size_t dst_nents; |
4579 | unsigned int total; |
4580 | unsigned int count; |
4581 | dma_addr_t addr_in; |
4582 | @@ -244,6 +245,7 @@ struct rk_cipher_ctx { |
4583 | struct rk_crypto_info *dev; |
4584 | unsigned int keylen; |
4585 | u32 mode; |
4586 | + u8 iv[AES_BLOCK_SIZE]; |
4587 | }; |
4588 | |
4589 | enum alg_type { |
4590 | diff --git a/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c b/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c |
4591 | index 639c15c5364b..23305f22072f 100644 |
4592 | --- a/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c |
4593 | +++ b/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c |
4594 | @@ -242,6 +242,17 @@ static void crypto_dma_start(struct rk_crypto_info *dev) |
4595 | static int rk_set_data_start(struct rk_crypto_info *dev) |
4596 | { |
4597 | int err; |
4598 | + struct ablkcipher_request *req = |
4599 | + ablkcipher_request_cast(dev->async_req); |
4600 | + struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); |
4601 | + struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm); |
4602 | + u32 ivsize = crypto_ablkcipher_ivsize(tfm); |
4603 | + u8 *src_last_blk = page_address(sg_page(dev->sg_src)) + |
4604 | + dev->sg_src->offset + dev->sg_src->length - ivsize; |
4605 | + |
4606 | + /* store the iv that need to be updated in chain mode */ |
4607 | + if (ctx->mode & RK_CRYPTO_DEC) |
4608 | + memcpy(ctx->iv, src_last_blk, ivsize); |
4609 | |
4610 | err = dev->load_data(dev, dev->sg_src, dev->sg_dst); |
4611 | if (!err) |
4612 | @@ -260,8 +271,9 @@ static int rk_ablk_start(struct rk_crypto_info *dev) |
4613 | dev->total = req->nbytes; |
4614 | dev->sg_src = req->src; |
4615 | dev->first = req->src; |
4616 | - dev->nents = sg_nents(req->src); |
4617 | + dev->src_nents = sg_nents(req->src); |
4618 | dev->sg_dst = req->dst; |
4619 | + dev->dst_nents = sg_nents(req->dst); |
4620 | dev->aligned = 1; |
4621 | |
4622 | spin_lock_irqsave(&dev->lock, flags); |
4623 | @@ -285,6 +297,28 @@ static void rk_iv_copyback(struct rk_crypto_info *dev) |
4624 | memcpy_fromio(req->info, dev->reg + RK_CRYPTO_AES_IV_0, ivsize); |
4625 | } |
4626 | |
4627 | +static void rk_update_iv(struct rk_crypto_info *dev) |
4628 | +{ |
4629 | + struct ablkcipher_request *req = |
4630 | + ablkcipher_request_cast(dev->async_req); |
4631 | + struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); |
4632 | + struct rk_cipher_ctx *ctx = crypto_ablkcipher_ctx(tfm); |
4633 | + u32 ivsize = crypto_ablkcipher_ivsize(tfm); |
4634 | + u8 *new_iv = NULL; |
4635 | + |
4636 | + if (ctx->mode & RK_CRYPTO_DEC) { |
4637 | + new_iv = ctx->iv; |
4638 | + } else { |
4639 | + new_iv = page_address(sg_page(dev->sg_dst)) + |
4640 | + dev->sg_dst->offset + dev->sg_dst->length - ivsize; |
4641 | + } |
4642 | + |
4643 | + if (ivsize == DES_BLOCK_SIZE) |
4644 | + memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, new_iv, ivsize); |
4645 | + else if (ivsize == AES_BLOCK_SIZE) |
4646 | + memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, new_iv, ivsize); |
4647 | +} |
4648 | + |
4649 | /* return: |
4650 | * true some err was occurred |
4651 | * fault no err, continue |
4652 | @@ -297,7 +331,7 @@ static int rk_ablk_rx(struct rk_crypto_info *dev) |
4653 | |
4654 | dev->unload_data(dev); |
4655 | if (!dev->aligned) { |
4656 | - if (!sg_pcopy_from_buffer(req->dst, dev->nents, |
4657 | + if (!sg_pcopy_from_buffer(req->dst, dev->dst_nents, |
4658 | dev->addr_vir, dev->count, |
4659 | dev->total - dev->left_bytes - |
4660 | dev->count)) { |
4661 | @@ -306,6 +340,7 @@ static int rk_ablk_rx(struct rk_crypto_info *dev) |
4662 | } |
4663 | } |
4664 | if (dev->left_bytes) { |
4665 | + rk_update_iv(dev); |
4666 | if (dev->aligned) { |
4667 | if (sg_is_last(dev->sg_src)) { |
4668 | dev_err(dev->dev, "[%s:%d] Lack of data\n", |
4669 | diff --git a/drivers/crypto/rockchip/rk3288_crypto_ahash.c b/drivers/crypto/rockchip/rk3288_crypto_ahash.c |
4670 | index 821a506b9e17..c336ae75e361 100644 |
4671 | --- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c |
4672 | +++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c |
4673 | @@ -206,7 +206,7 @@ static int rk_ahash_start(struct rk_crypto_info *dev) |
4674 | dev->sg_dst = NULL; |
4675 | dev->sg_src = req->src; |
4676 | dev->first = req->src; |
4677 | - dev->nents = sg_nents(req->src); |
4678 | + dev->src_nents = sg_nents(req->src); |
4679 | rctx = ahash_request_ctx(req); |
4680 | rctx->mode = 0; |
4681 | |
4682 | diff --git a/drivers/dma/sh/usb-dmac.c b/drivers/dma/sh/usb-dmac.c |
4683 | index 1bb1a8e09025..6c94ed750049 100644 |
4684 | --- a/drivers/dma/sh/usb-dmac.c |
4685 | +++ b/drivers/dma/sh/usb-dmac.c |
4686 | @@ -697,6 +697,8 @@ static int usb_dmac_runtime_resume(struct device *dev) |
4687 | #endif /* CONFIG_PM */ |
4688 | |
4689 | static const struct dev_pm_ops usb_dmac_pm = { |
4690 | + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, |
4691 | + pm_runtime_force_resume) |
4692 | SET_RUNTIME_PM_OPS(usb_dmac_runtime_suspend, usb_dmac_runtime_resume, |
4693 | NULL) |
4694 | }; |
4695 | diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c |
4696 | index 023a32cfac42..e0657fc72d31 100644 |
4697 | --- a/drivers/gpio/gpio-pca953x.c |
4698 | +++ b/drivers/gpio/gpio-pca953x.c |
4699 | @@ -543,7 +543,8 @@ static int pca953x_irq_set_type(struct irq_data *d, unsigned int type) |
4700 | |
4701 | static void pca953x_irq_shutdown(struct irq_data *d) |
4702 | { |
4703 | - struct pca953x_chip *chip = irq_data_get_irq_chip_data(d); |
4704 | + struct gpio_chip *gc = irq_data_get_irq_chip_data(d); |
4705 | + struct pca953x_chip *chip = gpiochip_get_data(gc); |
4706 | u8 mask = 1 << (d->hwirq % BANK_SZ); |
4707 | |
4708 | chip->irq_trig_raise[d->hwirq / BANK_SZ] &= ~mask; |
4709 | diff --git a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c |
4710 | index bd039322f697..6342f6499351 100644 |
4711 | --- a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c |
4712 | +++ b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c |
4713 | @@ -1347,12 +1347,12 @@ void dcn_bw_update_from_pplib(struct dc *dc) |
4714 | struct dm_pp_clock_levels_with_voltage fclks = {0}, dcfclks = {0}; |
4715 | bool res; |
4716 | |
4717 | - kernel_fpu_begin(); |
4718 | - |
4719 | /* TODO: This is not the proper way to obtain fabric_and_dram_bandwidth, should be min(fclk, memclk) */ |
4720 | res = dm_pp_get_clock_levels_by_type_with_voltage( |
4721 | ctx, DM_PP_CLOCK_TYPE_FCLK, &fclks); |
4722 | |
4723 | + kernel_fpu_begin(); |
4724 | + |
4725 | if (res) |
4726 | res = verify_clock_values(&fclks); |
4727 | |
4728 | @@ -1371,9 +1371,13 @@ void dcn_bw_update_from_pplib(struct dc *dc) |
4729 | } else |
4730 | BREAK_TO_DEBUGGER(); |
4731 | |
4732 | + kernel_fpu_end(); |
4733 | + |
4734 | res = dm_pp_get_clock_levels_by_type_with_voltage( |
4735 | ctx, DM_PP_CLOCK_TYPE_DCFCLK, &dcfclks); |
4736 | |
4737 | + kernel_fpu_begin(); |
4738 | + |
4739 | if (res) |
4740 | res = verify_clock_values(&dcfclks); |
4741 | |
4742 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c |
4743 | index 052e60dfaf9f..b52ccab428a9 100644 |
4744 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c |
4745 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c |
4746 | @@ -3487,14 +3487,14 @@ static int smu7_get_gpu_power(struct pp_hwmgr *hwmgr, u32 *query) |
4747 | |
4748 | smum_send_msg_to_smc(hwmgr, PPSMC_MSG_PmStatusLogStart); |
4749 | cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, |
4750 | - ixSMU_PM_STATUS_94, 0); |
4751 | + ixSMU_PM_STATUS_95, 0); |
4752 | |
4753 | for (i = 0; i < 10; i++) { |
4754 | - mdelay(1); |
4755 | + mdelay(500); |
4756 | smum_send_msg_to_smc(hwmgr, PPSMC_MSG_PmStatusLogSample); |
4757 | tmp = cgs_read_ind_register(hwmgr->device, |
4758 | CGS_IND_REG__SMC, |
4759 | - ixSMU_PM_STATUS_94); |
4760 | + ixSMU_PM_STATUS_95); |
4761 | if (tmp != 0) |
4762 | break; |
4763 | } |
4764 | diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c |
4765 | index 1bda809a7289..e65596617239 100644 |
4766 | --- a/drivers/gpu/drm/drm_fb_helper.c |
4767 | +++ b/drivers/gpu/drm/drm_fb_helper.c |
4768 | @@ -3156,9 +3156,7 @@ static void drm_fbdev_client_unregister(struct drm_client_dev *client) |
4769 | |
4770 | static int drm_fbdev_client_restore(struct drm_client_dev *client) |
4771 | { |
4772 | - struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); |
4773 | - |
4774 | - drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); |
4775 | + drm_fb_helper_lastclose(client->dev); |
4776 | |
4777 | return 0; |
4778 | } |
4779 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
4780 | index 280c851714e6..03cda197fb6b 100644 |
4781 | --- a/drivers/gpu/drm/i915/i915_gem.c |
4782 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
4783 | @@ -1828,7 +1828,8 @@ __vma_matches(struct vm_area_struct *vma, struct file *filp, |
4784 | if (vma->vm_file != filp) |
4785 | return false; |
4786 | |
4787 | - return vma->vm_start == addr && (vma->vm_end - vma->vm_start) == size; |
4788 | + return vma->vm_start == addr && |
4789 | + (vma->vm_end - vma->vm_start) == PAGE_ALIGN(size); |
4790 | } |
4791 | |
4792 | /** |
4793 | diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c |
4794 | index 3bd0f8a18e74..42daa5c9ff8e 100644 |
4795 | --- a/drivers/gpu/drm/imx/imx-ldb.c |
4796 | +++ b/drivers/gpu/drm/imx/imx-ldb.c |
4797 | @@ -651,8 +651,10 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data) |
4798 | int bus_format; |
4799 | |
4800 | ret = of_property_read_u32(child, "reg", &i); |
4801 | - if (ret || i < 0 || i > 1) |
4802 | - return -EINVAL; |
4803 | + if (ret || i < 0 || i > 1) { |
4804 | + ret = -EINVAL; |
4805 | + goto free_child; |
4806 | + } |
4807 | |
4808 | if (!of_device_is_available(child)) |
4809 | continue; |
4810 | @@ -665,7 +667,6 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data) |
4811 | channel = &imx_ldb->channel[i]; |
4812 | channel->ldb = imx_ldb; |
4813 | channel->chno = i; |
4814 | - channel->child = child; |
4815 | |
4816 | /* |
4817 | * The output port is port@4 with an external 4-port mux or |
4818 | @@ -675,13 +676,13 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data) |
4819 | imx_ldb->lvds_mux ? 4 : 2, 0, |
4820 | &channel->panel, &channel->bridge); |
4821 | if (ret && ret != -ENODEV) |
4822 | - return ret; |
4823 | + goto free_child; |
4824 | |
4825 | /* panel ddc only if there is no bridge */ |
4826 | if (!channel->bridge) { |
4827 | ret = imx_ldb_panel_ddc(dev, channel, child); |
4828 | if (ret) |
4829 | - return ret; |
4830 | + goto free_child; |
4831 | } |
4832 | |
4833 | bus_format = of_get_bus_format(dev, child); |
4834 | @@ -697,18 +698,26 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data) |
4835 | if (bus_format < 0) { |
4836 | dev_err(dev, "could not determine data mapping: %d\n", |
4837 | bus_format); |
4838 | - return bus_format; |
4839 | + ret = bus_format; |
4840 | + goto free_child; |
4841 | } |
4842 | channel->bus_format = bus_format; |
4843 | + channel->child = child; |
4844 | |
4845 | ret = imx_ldb_register(drm, channel); |
4846 | - if (ret) |
4847 | - return ret; |
4848 | + if (ret) { |
4849 | + channel->child = NULL; |
4850 | + goto free_child; |
4851 | + } |
4852 | } |
4853 | |
4854 | dev_set_drvdata(dev, imx_ldb); |
4855 | |
4856 | return 0; |
4857 | + |
4858 | +free_child: |
4859 | + of_node_put(child); |
4860 | + return ret; |
4861 | } |
4862 | |
4863 | static void imx_ldb_unbind(struct device *dev, struct device *master, |
4864 | diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c |
4865 | index 203f247d4854..a323a0db2fc1 100644 |
4866 | --- a/drivers/gpu/drm/imx/ipuv3-plane.c |
4867 | +++ b/drivers/gpu/drm/imx/ipuv3-plane.c |
4868 | @@ -375,9 +375,9 @@ static int ipu_plane_atomic_check(struct drm_plane *plane, |
4869 | if (ret) |
4870 | return ret; |
4871 | |
4872 | - /* CRTC should be enabled */ |
4873 | + /* nothing to check when disabling or disabled */ |
4874 | if (!crtc_state->enable) |
4875 | - return -EINVAL; |
4876 | + return 0; |
4877 | |
4878 | switch (plane->type) { |
4879 | case DRM_PLANE_TYPE_PRIMARY: |
4880 | diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c |
4881 | index 54324330b91f..2f0a5bd50174 100644 |
4882 | --- a/drivers/gpu/drm/radeon/evergreen_cs.c |
4883 | +++ b/drivers/gpu/drm/radeon/evergreen_cs.c |
4884 | @@ -1299,6 +1299,7 @@ static int evergreen_cs_handle_reg(struct radeon_cs_parser *p, u32 reg, u32 idx) |
4885 | return -EINVAL; |
4886 | } |
4887 | ib[idx] += (u32)((reloc->gpu_offset >> 8) & 0xffffffff); |
4888 | + break; |
4889 | case CB_TARGET_MASK: |
4890 | track->cb_target_mask = radeon_get_ib_value(p, idx); |
4891 | track->cb_dirty = true; |
4892 | diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c |
4893 | index 474b00e19697..0a7d4395d427 100644 |
4894 | --- a/drivers/gpu/ipu-v3/ipu-common.c |
4895 | +++ b/drivers/gpu/ipu-v3/ipu-common.c |
4896 | @@ -898,8 +898,8 @@ static struct ipu_devtype ipu_type_imx51 = { |
4897 | .cpmem_ofs = 0x1f000000, |
4898 | .srm_ofs = 0x1f040000, |
4899 | .tpm_ofs = 0x1f060000, |
4900 | - .csi0_ofs = 0x1f030000, |
4901 | - .csi1_ofs = 0x1f038000, |
4902 | + .csi0_ofs = 0x1e030000, |
4903 | + .csi1_ofs = 0x1e038000, |
4904 | .ic_ofs = 0x1e020000, |
4905 | .disp0_ofs = 0x1e040000, |
4906 | .disp1_ofs = 0x1e048000, |
4907 | @@ -914,8 +914,8 @@ static struct ipu_devtype ipu_type_imx53 = { |
4908 | .cpmem_ofs = 0x07000000, |
4909 | .srm_ofs = 0x07040000, |
4910 | .tpm_ofs = 0x07060000, |
4911 | - .csi0_ofs = 0x07030000, |
4912 | - .csi1_ofs = 0x07038000, |
4913 | + .csi0_ofs = 0x06030000, |
4914 | + .csi1_ofs = 0x06038000, |
4915 | .ic_ofs = 0x06020000, |
4916 | .disp0_ofs = 0x06040000, |
4917 | .disp1_ofs = 0x06048000, |
4918 | diff --git a/drivers/hwtracing/intel_th/gth.c b/drivers/hwtracing/intel_th/gth.c |
4919 | index 8426b7970c14..cc287cf6eb29 100644 |
4920 | --- a/drivers/hwtracing/intel_th/gth.c |
4921 | +++ b/drivers/hwtracing/intel_th/gth.c |
4922 | @@ -607,6 +607,7 @@ static void intel_th_gth_unassign(struct intel_th_device *thdev, |
4923 | { |
4924 | struct gth_device *gth = dev_get_drvdata(&thdev->dev); |
4925 | int port = othdev->output.port; |
4926 | + int master; |
4927 | |
4928 | if (thdev->host_mode) |
4929 | return; |
4930 | @@ -615,6 +616,9 @@ static void intel_th_gth_unassign(struct intel_th_device *thdev, |
4931 | othdev->output.port = -1; |
4932 | othdev->output.active = false; |
4933 | gth->output[port].output = NULL; |
4934 | + for (master = 0; master < TH_CONFIGURABLE_MASTERS; master++) |
4935 | + if (gth->master[master] == port) |
4936 | + gth->master[master] = -1; |
4937 | spin_unlock(>h->gth_lock); |
4938 | } |
4939 | |
4940 | diff --git a/drivers/hwtracing/stm/core.c b/drivers/hwtracing/stm/core.c |
4941 | index 10bcb5d73f90..9d55e104400c 100644 |
4942 | --- a/drivers/hwtracing/stm/core.c |
4943 | +++ b/drivers/hwtracing/stm/core.c |
4944 | @@ -244,6 +244,9 @@ static int find_free_channels(unsigned long *bitmap, unsigned int start, |
4945 | ; |
4946 | if (i == width) |
4947 | return pos; |
4948 | + |
4949 | + /* step over [pos..pos+i) to continue search */ |
4950 | + pos += i; |
4951 | } |
4952 | |
4953 | return -1; |
4954 | @@ -550,7 +553,7 @@ static int stm_char_policy_set_ioctl(struct stm_file *stmf, void __user *arg) |
4955 | { |
4956 | struct stm_device *stm = stmf->stm; |
4957 | struct stp_policy_id *id; |
4958 | - int ret = -EINVAL; |
4959 | + int ret = -EINVAL, wlimit = 1; |
4960 | u32 size; |
4961 | |
4962 | if (stmf->output.nr_chans) |
4963 | @@ -578,8 +581,10 @@ static int stm_char_policy_set_ioctl(struct stm_file *stmf, void __user *arg) |
4964 | if (id->__reserved_0 || id->__reserved_1) |
4965 | goto err_free; |
4966 | |
4967 | - if (id->width < 1 || |
4968 | - id->width > PAGE_SIZE / stm->data->sw_mmiosz) |
4969 | + if (stm->data->sw_mmiosz) |
4970 | + wlimit = PAGE_SIZE / stm->data->sw_mmiosz; |
4971 | + |
4972 | + if (id->width < 1 || id->width > wlimit) |
4973 | goto err_free; |
4974 | |
4975 | ret = stm_file_assign(stmf, id->id, id->width); |
4976 | diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c |
4977 | index 44deae78913e..4d19254f78c8 100644 |
4978 | --- a/drivers/i2c/busses/i2c-bcm2835.c |
4979 | +++ b/drivers/i2c/busses/i2c-bcm2835.c |
4980 | @@ -191,6 +191,15 @@ static void bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev *i2c_dev) |
4981 | bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c); |
4982 | } |
4983 | |
4984 | +static void bcm2835_i2c_finish_transfer(struct bcm2835_i2c_dev *i2c_dev) |
4985 | +{ |
4986 | + i2c_dev->curr_msg = NULL; |
4987 | + i2c_dev->num_msgs = 0; |
4988 | + |
4989 | + i2c_dev->msg_buf = NULL; |
4990 | + i2c_dev->msg_buf_remaining = 0; |
4991 | +} |
4992 | + |
4993 | /* |
4994 | * Note about I2C_C_CLEAR on error: |
4995 | * The I2C_C_CLEAR on errors will take some time to resolve -- if you were in |
4996 | @@ -291,6 +300,9 @@ static int bcm2835_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], |
4997 | |
4998 | time_left = wait_for_completion_timeout(&i2c_dev->completion, |
4999 | adap->timeout); |
5000 | + |
5001 | + bcm2835_i2c_finish_transfer(i2c_dev); |
5002 | + |
5003 | if (!time_left) { |
5004 | bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, |
5005 | BCM2835_I2C_C_CLEAR); |
5006 | diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c |
5007 | index b13605718291..d917cefc5a19 100644 |
5008 | --- a/drivers/i2c/busses/i2c-cadence.c |
5009 | +++ b/drivers/i2c/busses/i2c-cadence.c |
5010 | @@ -382,8 +382,10 @@ static void cdns_i2c_mrecv(struct cdns_i2c *id) |
5011 | * Check for the message size against FIFO depth and set the |
5012 | * 'hold bus' bit if it is greater than FIFO depth. |
5013 | */ |
5014 | - if (id->recv_count > CDNS_I2C_FIFO_DEPTH) |
5015 | + if ((id->recv_count > CDNS_I2C_FIFO_DEPTH) || id->bus_hold_flag) |
5016 | ctrl_reg |= CDNS_I2C_CR_HOLD; |
5017 | + else |
5018 | + ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD; |
5019 | |
5020 | cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); |
5021 | |
5022 | @@ -440,8 +442,11 @@ static void cdns_i2c_msend(struct cdns_i2c *id) |
5023 | * Check for the message size against FIFO depth and set the |
5024 | * 'hold bus' bit if it is greater than FIFO depth. |
5025 | */ |
5026 | - if (id->send_count > CDNS_I2C_FIFO_DEPTH) |
5027 | + if ((id->send_count > CDNS_I2C_FIFO_DEPTH) || id->bus_hold_flag) |
5028 | ctrl_reg |= CDNS_I2C_CR_HOLD; |
5029 | + else |
5030 | + ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD; |
5031 | + |
5032 | cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); |
5033 | |
5034 | /* Clear the interrupts in interrupt status register. */ |
5035 | diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c |
5036 | index 60c8561fbe65..ef13b6ce9d8d 100644 |
5037 | --- a/drivers/i2c/busses/i2c-tegra.c |
5038 | +++ b/drivers/i2c/busses/i2c-tegra.c |
5039 | @@ -832,7 +832,7 @@ static const struct i2c_algorithm tegra_i2c_algo = { |
5040 | /* payload size is only 12 bit */ |
5041 | static const struct i2c_adapter_quirks tegra_i2c_quirks = { |
5042 | .max_read_len = 4096, |
5043 | - .max_write_len = 4096, |
5044 | + .max_write_len = 4096 - 12, |
5045 | }; |
5046 | |
5047 | static const struct tegra_i2c_hw_feature tegra20_i2c_hw = { |
5048 | diff --git a/drivers/iio/adc/exynos_adc.c b/drivers/iio/adc/exynos_adc.c |
5049 | index f10443f92e4c..4be29ed44755 100644 |
5050 | --- a/drivers/iio/adc/exynos_adc.c |
5051 | +++ b/drivers/iio/adc/exynos_adc.c |
5052 | @@ -915,7 +915,7 @@ static int exynos_adc_remove(struct platform_device *pdev) |
5053 | struct iio_dev *indio_dev = platform_get_drvdata(pdev); |
5054 | struct exynos_adc *info = iio_priv(indio_dev); |
5055 | |
5056 | - if (IS_REACHABLE(CONFIG_INPUT)) { |
5057 | + if (IS_REACHABLE(CONFIG_INPUT) && info->input) { |
5058 | free_irq(info->tsirq, info); |
5059 | input_unregister_device(info->input); |
5060 | } |
5061 | diff --git a/drivers/infiniband/hw/hfi1/hfi.h b/drivers/infiniband/hw/hfi1/hfi.h |
5062 | index cfd252386356..2ea42c04cfd2 100644 |
5063 | --- a/drivers/infiniband/hw/hfi1/hfi.h |
5064 | +++ b/drivers/infiniband/hw/hfi1/hfi.h |
5065 | @@ -1425,7 +1425,7 @@ void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd, |
5066 | struct hfi1_devdata *dd, u8 hw_pidx, u8 port); |
5067 | void hfi1_free_ctxtdata(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd); |
5068 | int hfi1_rcd_put(struct hfi1_ctxtdata *rcd); |
5069 | -void hfi1_rcd_get(struct hfi1_ctxtdata *rcd); |
5070 | +int hfi1_rcd_get(struct hfi1_ctxtdata *rcd); |
5071 | struct hfi1_ctxtdata *hfi1_rcd_get_by_index_safe(struct hfi1_devdata *dd, |
5072 | u16 ctxt); |
5073 | struct hfi1_ctxtdata *hfi1_rcd_get_by_index(struct hfi1_devdata *dd, u16 ctxt); |
5074 | diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c |
5075 | index 758d273c32cf..da786eb18558 100644 |
5076 | --- a/drivers/infiniband/hw/hfi1/init.c |
5077 | +++ b/drivers/infiniband/hw/hfi1/init.c |
5078 | @@ -213,12 +213,12 @@ static void hfi1_rcd_free(struct kref *kref) |
5079 | struct hfi1_ctxtdata *rcd = |
5080 | container_of(kref, struct hfi1_ctxtdata, kref); |
5081 | |
5082 | - hfi1_free_ctxtdata(rcd->dd, rcd); |
5083 | - |
5084 | spin_lock_irqsave(&rcd->dd->uctxt_lock, flags); |
5085 | rcd->dd->rcd[rcd->ctxt] = NULL; |
5086 | spin_unlock_irqrestore(&rcd->dd->uctxt_lock, flags); |
5087 | |
5088 | + hfi1_free_ctxtdata(rcd->dd, rcd); |
5089 | + |
5090 | kfree(rcd); |
5091 | } |
5092 | |
5093 | @@ -241,10 +241,13 @@ int hfi1_rcd_put(struct hfi1_ctxtdata *rcd) |
5094 | * @rcd: pointer to an initialized rcd data structure |
5095 | * |
5096 | * Use this to get a reference after the init. |
5097 | + * |
5098 | + * Return : reflect kref_get_unless_zero(), which returns non-zero on |
5099 | + * increment, otherwise 0. |
5100 | */ |
5101 | -void hfi1_rcd_get(struct hfi1_ctxtdata *rcd) |
5102 | +int hfi1_rcd_get(struct hfi1_ctxtdata *rcd) |
5103 | { |
5104 | - kref_get(&rcd->kref); |
5105 | + return kref_get_unless_zero(&rcd->kref); |
5106 | } |
5107 | |
5108 | /** |
5109 | @@ -324,7 +327,8 @@ struct hfi1_ctxtdata *hfi1_rcd_get_by_index(struct hfi1_devdata *dd, u16 ctxt) |
5110 | spin_lock_irqsave(&dd->uctxt_lock, flags); |
5111 | if (dd->rcd[ctxt]) { |
5112 | rcd = dd->rcd[ctxt]; |
5113 | - hfi1_rcd_get(rcd); |
5114 | + if (!hfi1_rcd_get(rcd)) |
5115 | + rcd = NULL; |
5116 | } |
5117 | spin_unlock_irqrestore(&dd->uctxt_lock, flags); |
5118 | |
5119 | diff --git a/drivers/input/keyboard/cap11xx.c b/drivers/input/keyboard/cap11xx.c |
5120 | index 312916f99597..73686c2460ce 100644 |
5121 | --- a/drivers/input/keyboard/cap11xx.c |
5122 | +++ b/drivers/input/keyboard/cap11xx.c |
5123 | @@ -75,9 +75,7 @@ |
5124 | struct cap11xx_led { |
5125 | struct cap11xx_priv *priv; |
5126 | struct led_classdev cdev; |
5127 | - struct work_struct work; |
5128 | u32 reg; |
5129 | - enum led_brightness new_brightness; |
5130 | }; |
5131 | #endif |
5132 | |
5133 | @@ -233,30 +231,21 @@ static void cap11xx_input_close(struct input_dev *idev) |
5134 | } |
5135 | |
5136 | #ifdef CONFIG_LEDS_CLASS |
5137 | -static void cap11xx_led_work(struct work_struct *work) |
5138 | +static int cap11xx_led_set(struct led_classdev *cdev, |
5139 | + enum led_brightness value) |
5140 | { |
5141 | - struct cap11xx_led *led = container_of(work, struct cap11xx_led, work); |
5142 | + struct cap11xx_led *led = container_of(cdev, struct cap11xx_led, cdev); |
5143 | struct cap11xx_priv *priv = led->priv; |
5144 | - int value = led->new_brightness; |
5145 | |
5146 | /* |
5147 | - * All LEDs share the same duty cycle as this is a HW limitation. |
5148 | - * Brightness levels per LED are either 0 (OFF) and 1 (ON). |
5149 | + * All LEDs share the same duty cycle as this is a HW |
5150 | + * limitation. Brightness levels per LED are either |
5151 | + * 0 (OFF) and 1 (ON). |
5152 | */ |
5153 | - regmap_update_bits(priv->regmap, CAP11XX_REG_LED_OUTPUT_CONTROL, |
5154 | - BIT(led->reg), value ? BIT(led->reg) : 0); |
5155 | -} |
5156 | - |
5157 | -static void cap11xx_led_set(struct led_classdev *cdev, |
5158 | - enum led_brightness value) |
5159 | -{ |
5160 | - struct cap11xx_led *led = container_of(cdev, struct cap11xx_led, cdev); |
5161 | - |
5162 | - if (led->new_brightness == value) |
5163 | - return; |
5164 | - |
5165 | - led->new_brightness = value; |
5166 | - schedule_work(&led->work); |
5167 | + return regmap_update_bits(priv->regmap, |
5168 | + CAP11XX_REG_LED_OUTPUT_CONTROL, |
5169 | + BIT(led->reg), |
5170 | + value ? BIT(led->reg) : 0); |
5171 | } |
5172 | |
5173 | static int cap11xx_init_leds(struct device *dev, |
5174 | @@ -299,7 +288,7 @@ static int cap11xx_init_leds(struct device *dev, |
5175 | led->cdev.default_trigger = |
5176 | of_get_property(child, "linux,default-trigger", NULL); |
5177 | led->cdev.flags = 0; |
5178 | - led->cdev.brightness_set = cap11xx_led_set; |
5179 | + led->cdev.brightness_set_blocking = cap11xx_led_set; |
5180 | led->cdev.max_brightness = 1; |
5181 | led->cdev.brightness = LED_OFF; |
5182 | |
5183 | @@ -312,8 +301,6 @@ static int cap11xx_init_leds(struct device *dev, |
5184 | led->reg = reg; |
5185 | led->priv = priv; |
5186 | |
5187 | - INIT_WORK(&led->work, cap11xx_led_work); |
5188 | - |
5189 | error = devm_led_classdev_register(dev, &led->cdev); |
5190 | if (error) { |
5191 | of_node_put(child); |
5192 | diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c |
5193 | index 403452ef00e6..3d1cb7bf5e35 100644 |
5194 | --- a/drivers/input/keyboard/matrix_keypad.c |
5195 | +++ b/drivers/input/keyboard/matrix_keypad.c |
5196 | @@ -222,7 +222,7 @@ static void matrix_keypad_stop(struct input_dev *dev) |
5197 | keypad->stopped = true; |
5198 | spin_unlock_irq(&keypad->lock); |
5199 | |
5200 | - flush_work(&keypad->work.work); |
5201 | + flush_delayed_work(&keypad->work); |
5202 | /* |
5203 | * matrix_keypad_scan() will leave IRQs enabled; |
5204 | * we should disable them now. |
5205 | diff --git a/drivers/input/keyboard/st-keyscan.c b/drivers/input/keyboard/st-keyscan.c |
5206 | index babcfb165e4f..3b85631fde91 100644 |
5207 | --- a/drivers/input/keyboard/st-keyscan.c |
5208 | +++ b/drivers/input/keyboard/st-keyscan.c |
5209 | @@ -153,6 +153,8 @@ static int keyscan_probe(struct platform_device *pdev) |
5210 | |
5211 | input_dev->id.bustype = BUS_HOST; |
5212 | |
5213 | + keypad_data->input_dev = input_dev; |
5214 | + |
5215 | error = keypad_matrix_key_parse_dt(keypad_data); |
5216 | if (error) |
5217 | return error; |
5218 | @@ -168,8 +170,6 @@ static int keyscan_probe(struct platform_device *pdev) |
5219 | |
5220 | input_set_drvdata(input_dev, keypad_data); |
5221 | |
5222 | - keypad_data->input_dev = input_dev; |
5223 | - |
5224 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
5225 | keypad_data->base = devm_ioremap_resource(&pdev->dev, res); |
5226 | if (IS_ERR(keypad_data->base)) |
5227 | diff --git a/drivers/input/misc/pwm-vibra.c b/drivers/input/misc/pwm-vibra.c |
5228 | index 55da191ae550..dbb6d9e1b947 100644 |
5229 | --- a/drivers/input/misc/pwm-vibra.c |
5230 | +++ b/drivers/input/misc/pwm-vibra.c |
5231 | @@ -34,6 +34,7 @@ struct pwm_vibrator { |
5232 | struct work_struct play_work; |
5233 | u16 level; |
5234 | u32 direction_duty_cycle; |
5235 | + bool vcc_on; |
5236 | }; |
5237 | |
5238 | static int pwm_vibrator_start(struct pwm_vibrator *vibrator) |
5239 | @@ -42,10 +43,13 @@ static int pwm_vibrator_start(struct pwm_vibrator *vibrator) |
5240 | struct pwm_state state; |
5241 | int err; |
5242 | |
5243 | - err = regulator_enable(vibrator->vcc); |
5244 | - if (err) { |
5245 | - dev_err(pdev, "failed to enable regulator: %d", err); |
5246 | - return err; |
5247 | + if (!vibrator->vcc_on) { |
5248 | + err = regulator_enable(vibrator->vcc); |
5249 | + if (err) { |
5250 | + dev_err(pdev, "failed to enable regulator: %d", err); |
5251 | + return err; |
5252 | + } |
5253 | + vibrator->vcc_on = true; |
5254 | } |
5255 | |
5256 | pwm_get_state(vibrator->pwm, &state); |
5257 | @@ -76,11 +80,14 @@ static int pwm_vibrator_start(struct pwm_vibrator *vibrator) |
5258 | |
5259 | static void pwm_vibrator_stop(struct pwm_vibrator *vibrator) |
5260 | { |
5261 | - regulator_disable(vibrator->vcc); |
5262 | - |
5263 | if (vibrator->pwm_dir) |
5264 | pwm_disable(vibrator->pwm_dir); |
5265 | pwm_disable(vibrator->pwm); |
5266 | + |
5267 | + if (vibrator->vcc_on) { |
5268 | + regulator_disable(vibrator->vcc); |
5269 | + vibrator->vcc_on = false; |
5270 | + } |
5271 | } |
5272 | |
5273 | static void pwm_vibrator_play_work(struct work_struct *work) |
5274 | diff --git a/drivers/input/serio/ps2-gpio.c b/drivers/input/serio/ps2-gpio.c |
5275 | index c62cceb97bb1..5e8d8384aa2a 100644 |
5276 | --- a/drivers/input/serio/ps2-gpio.c |
5277 | +++ b/drivers/input/serio/ps2-gpio.c |
5278 | @@ -76,6 +76,7 @@ static void ps2_gpio_close(struct serio *serio) |
5279 | { |
5280 | struct ps2_gpio_data *drvdata = serio->port_data; |
5281 | |
5282 | + flush_delayed_work(&drvdata->tx_work); |
5283 | disable_irq(drvdata->irq); |
5284 | } |
5285 | |
5286 | diff --git a/drivers/irqchip/irq-brcmstb-l2.c b/drivers/irqchip/irq-brcmstb-l2.c |
5287 | index 0e65f609352e..83364fedbf0a 100644 |
5288 | --- a/drivers/irqchip/irq-brcmstb-l2.c |
5289 | +++ b/drivers/irqchip/irq-brcmstb-l2.c |
5290 | @@ -129,8 +129,9 @@ static void brcmstb_l2_intc_suspend(struct irq_data *d) |
5291 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); |
5292 | struct irq_chip_type *ct = irq_data_get_chip_type(d); |
5293 | struct brcmstb_l2_intc_data *b = gc->private; |
5294 | + unsigned long flags; |
5295 | |
5296 | - irq_gc_lock(gc); |
5297 | + irq_gc_lock_irqsave(gc, flags); |
5298 | /* Save the current mask */ |
5299 | b->saved_mask = irq_reg_readl(gc, ct->regs.mask); |
5300 | |
5301 | @@ -139,7 +140,7 @@ static void brcmstb_l2_intc_suspend(struct irq_data *d) |
5302 | irq_reg_writel(gc, ~gc->wake_active, ct->regs.disable); |
5303 | irq_reg_writel(gc, gc->wake_active, ct->regs.enable); |
5304 | } |
5305 | - irq_gc_unlock(gc); |
5306 | + irq_gc_unlock_irqrestore(gc, flags); |
5307 | } |
5308 | |
5309 | static void brcmstb_l2_intc_resume(struct irq_data *d) |
5310 | @@ -147,8 +148,9 @@ static void brcmstb_l2_intc_resume(struct irq_data *d) |
5311 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); |
5312 | struct irq_chip_type *ct = irq_data_get_chip_type(d); |
5313 | struct brcmstb_l2_intc_data *b = gc->private; |
5314 | + unsigned long flags; |
5315 | |
5316 | - irq_gc_lock(gc); |
5317 | + irq_gc_lock_irqsave(gc, flags); |
5318 | if (ct->chip.irq_ack) { |
5319 | /* Clear unmasked non-wakeup interrupts */ |
5320 | irq_reg_writel(gc, ~b->saved_mask & ~gc->wake_active, |
5321 | @@ -158,7 +160,7 @@ static void brcmstb_l2_intc_resume(struct irq_data *d) |
5322 | /* Restore the saved mask */ |
5323 | irq_reg_writel(gc, b->saved_mask, ct->regs.disable); |
5324 | irq_reg_writel(gc, ~b->saved_mask, ct->regs.enable); |
5325 | - irq_gc_unlock(gc); |
5326 | + irq_gc_unlock_irqrestore(gc, flags); |
5327 | } |
5328 | |
5329 | static int __init brcmstb_l2_intc_of_init(struct device_node *np, |
5330 | diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c |
5331 | index 15579cba1a88..78970cdf2ef6 100644 |
5332 | --- a/drivers/irqchip/irq-gic-v3-its.c |
5333 | +++ b/drivers/irqchip/irq-gic-v3-its.c |
5334 | @@ -1893,6 +1893,8 @@ static int its_alloc_tables(struct its_node *its) |
5335 | indirect = its_parse_indirect_baser(its, baser, |
5336 | psz, &order, |
5337 | its->device_ids); |
5338 | + break; |
5339 | + |
5340 | case GITS_BASER_TYPE_VCPU: |
5341 | indirect = its_parse_indirect_baser(its, baser, |
5342 | psz, &order, |
5343 | diff --git a/drivers/mailbox/bcm-flexrm-mailbox.c b/drivers/mailbox/bcm-flexrm-mailbox.c |
5344 | index 8ab077ff58f4..96bcabfebc23 100644 |
5345 | --- a/drivers/mailbox/bcm-flexrm-mailbox.c |
5346 | +++ b/drivers/mailbox/bcm-flexrm-mailbox.c |
5347 | @@ -1396,9 +1396,9 @@ static void flexrm_shutdown(struct mbox_chan *chan) |
5348 | |
5349 | /* Clear ring flush state */ |
5350 | timeout = 1000; /* timeout of 1s */ |
5351 | - writel_relaxed(0x0, ring + RING_CONTROL); |
5352 | + writel_relaxed(0x0, ring->regs + RING_CONTROL); |
5353 | do { |
5354 | - if (!(readl_relaxed(ring + RING_FLUSH_DONE) & |
5355 | + if (!(readl_relaxed(ring->regs + RING_FLUSH_DONE) & |
5356 | FLUSH_DONE_MASK)) |
5357 | break; |
5358 | mdelay(1); |
5359 | diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c |
5360 | index 22944aa7d8e5..4ca3e3d3f9c7 100644 |
5361 | --- a/drivers/md/bcache/request.c |
5362 | +++ b/drivers/md/bcache/request.c |
5363 | @@ -392,10 +392,11 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) |
5364 | |
5365 | /* |
5366 | * Flag for bypass if the IO is for read-ahead or background, |
5367 | - * unless the read-ahead request is for metadata (eg, for gfs2). |
5368 | + * unless the read-ahead request is for metadata |
5369 | + * (eg, for gfs2 or xfs). |
5370 | */ |
5371 | if (bio->bi_opf & (REQ_RAHEAD|REQ_BACKGROUND) && |
5372 | - !(bio->bi_opf & REQ_META)) |
5373 | + !(bio->bi_opf & (REQ_META|REQ_PRIO))) |
5374 | goto skip; |
5375 | |
5376 | if (bio->bi_iter.bi_sector & (c->sb.block_size - 1) || |
5377 | @@ -877,7 +878,7 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s, |
5378 | } |
5379 | |
5380 | if (!(bio->bi_opf & REQ_RAHEAD) && |
5381 | - !(bio->bi_opf & REQ_META) && |
5382 | + !(bio->bi_opf & (REQ_META|REQ_PRIO)) && |
5383 | s->iop.c->gc_stats.in_use < CUTOFF_CACHE_READA) |
5384 | reada = min_t(sector_t, dc->readahead >> 9, |
5385 | get_capacity(bio->bi_disk) - bio_end_sector(bio)); |
5386 | diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h |
5387 | index d2b9fdbc8994..e75dc33339f6 100644 |
5388 | --- a/drivers/md/bcache/writeback.h |
5389 | +++ b/drivers/md/bcache/writeback.h |
5390 | @@ -63,6 +63,9 @@ static inline bool should_writeback(struct cached_dev *dc, struct bio *bio, |
5391 | in_use > CUTOFF_WRITEBACK_SYNC) |
5392 | return false; |
5393 | |
5394 | + if (bio_op(bio) == REQ_OP_DISCARD) |
5395 | + return false; |
5396 | + |
5397 | if (dc->partial_stripes_expensive && |
5398 | bcache_dev_stripe_dirty(dc, bio->bi_iter.bi_sector, |
5399 | bio_sectors(bio))) |
5400 | diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c |
5401 | index e1fa6baf4e8e..96d5fb3f6199 100644 |
5402 | --- a/drivers/md/dm-integrity.c |
5403 | +++ b/drivers/md/dm-integrity.c |
5404 | @@ -1357,8 +1357,8 @@ again: |
5405 | checksums_ptr - checksums, !dio->write ? TAG_CMP : TAG_WRITE); |
5406 | if (unlikely(r)) { |
5407 | if (r > 0) { |
5408 | - DMERR("Checksum failed at sector 0x%llx", |
5409 | - (unsigned long long)(sector - ((r + ic->tag_size - 1) / ic->tag_size))); |
5410 | + DMERR_LIMIT("Checksum failed at sector 0x%llx", |
5411 | + (unsigned long long)(sector - ((r + ic->tag_size - 1) / ic->tag_size))); |
5412 | r = -EILSEQ; |
5413 | atomic64_inc(&ic->number_of_mismatches); |
5414 | } |
5415 | @@ -1550,8 +1550,8 @@ retry_kmap: |
5416 | |
5417 | integrity_sector_checksum(ic, logical_sector, mem + bv.bv_offset, checksums_onstack); |
5418 | if (unlikely(memcmp(checksums_onstack, journal_entry_tag(ic, je), ic->tag_size))) { |
5419 | - DMERR("Checksum failed when reading from journal, at sector 0x%llx", |
5420 | - (unsigned long long)logical_sector); |
5421 | + DMERR_LIMIT("Checksum failed when reading from journal, at sector 0x%llx", |
5422 | + (unsigned long long)logical_sector); |
5423 | } |
5424 | } |
5425 | #endif |
5426 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c |
5427 | index 9df1334608b7..25e97de36717 100644 |
5428 | --- a/drivers/md/raid10.c |
5429 | +++ b/drivers/md/raid10.c |
5430 | @@ -3959,6 +3959,8 @@ static int raid10_run(struct mddev *mddev) |
5431 | set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); |
5432 | mddev->sync_thread = md_register_thread(md_do_sync, mddev, |
5433 | "reshape"); |
5434 | + if (!mddev->sync_thread) |
5435 | + goto out_free_conf; |
5436 | } |
5437 | |
5438 | return 0; |
5439 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
5440 | index 45a3551d3afd..ae38895c44b2 100644 |
5441 | --- a/drivers/md/raid5.c |
5442 | +++ b/drivers/md/raid5.c |
5443 | @@ -7390,6 +7390,8 @@ static int raid5_run(struct mddev *mddev) |
5444 | set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); |
5445 | mddev->sync_thread = md_register_thread(md_do_sync, mddev, |
5446 | "reshape"); |
5447 | + if (!mddev->sync_thread) |
5448 | + goto abort; |
5449 | } |
5450 | |
5451 | /* Ok, everything is just fine now */ |
5452 | diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c |
5453 | index 886a2d8d5c6c..9d4a81bb0e59 100644 |
5454 | --- a/drivers/media/common/videobuf2/videobuf2-v4l2.c |
5455 | +++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c |
5456 | @@ -145,7 +145,6 @@ static void vb2_warn_zero_bytesused(struct vb2_buffer *vb) |
5457 | return; |
5458 | |
5459 | check_once = true; |
5460 | - WARN_ON(1); |
5461 | |
5462 | pr_warn("use of bytesused == 0 is deprecated and will be removed in the future,\n"); |
5463 | if (vb->vb2_queue->allow_zero_bytesused) |
5464 | diff --git a/drivers/media/dvb-frontends/lgdt330x.c b/drivers/media/dvb-frontends/lgdt330x.c |
5465 | index 10d584ce538d..9ee1c1360ab8 100644 |
5466 | --- a/drivers/media/dvb-frontends/lgdt330x.c |
5467 | +++ b/drivers/media/dvb-frontends/lgdt330x.c |
5468 | @@ -783,7 +783,7 @@ static int lgdt3303_read_status(struct dvb_frontend *fe, |
5469 | |
5470 | if ((buf[0] & 0x02) == 0x00) |
5471 | *status |= FE_HAS_SYNC; |
5472 | - if ((buf[0] & 0xfd) == 0x01) |
5473 | + if ((buf[0] & 0x01) == 0x01) |
5474 | *status |= FE_HAS_VITERBI | FE_HAS_LOCK; |
5475 | break; |
5476 | default: |
5477 | diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c |
5478 | index 8e7a2a59cd32..d5c0ffc55d46 100644 |
5479 | --- a/drivers/media/i2c/ov5640.c |
5480 | +++ b/drivers/media/i2c/ov5640.c |
5481 | @@ -1759,7 +1759,7 @@ static void ov5640_reset(struct ov5640_dev *sensor) |
5482 | usleep_range(1000, 2000); |
5483 | |
5484 | gpiod_set_value_cansleep(sensor->reset_gpio, 0); |
5485 | - usleep_range(5000, 10000); |
5486 | + usleep_range(20000, 25000); |
5487 | } |
5488 | |
5489 | static int ov5640_set_power_on(struct ov5640_dev *sensor) |
5490 | diff --git a/drivers/media/platform/vimc/Makefile b/drivers/media/platform/vimc/Makefile |
5491 | index 4b2e3de7856e..c4fc8e7d365a 100644 |
5492 | --- a/drivers/media/platform/vimc/Makefile |
5493 | +++ b/drivers/media/platform/vimc/Makefile |
5494 | @@ -5,6 +5,7 @@ vimc_common-objs := vimc-common.o |
5495 | vimc_debayer-objs := vimc-debayer.o |
5496 | vimc_scaler-objs := vimc-scaler.o |
5497 | vimc_sensor-objs := vimc-sensor.o |
5498 | +vimc_streamer-objs := vimc-streamer.o |
5499 | |
5500 | obj-$(CONFIG_VIDEO_VIMC) += vimc.o vimc_capture.o vimc_common.o vimc-debayer.o \ |
5501 | - vimc_scaler.o vimc_sensor.o |
5502 | + vimc_scaler.o vimc_sensor.o vimc_streamer.o |
5503 | diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c |
5504 | index ec68feaac378..65d657daf66f 100644 |
5505 | --- a/drivers/media/platform/vimc/vimc-capture.c |
5506 | +++ b/drivers/media/platform/vimc/vimc-capture.c |
5507 | @@ -24,6 +24,7 @@ |
5508 | #include <media/videobuf2-vmalloc.h> |
5509 | |
5510 | #include "vimc-common.h" |
5511 | +#include "vimc-streamer.h" |
5512 | |
5513 | #define VIMC_CAP_DRV_NAME "vimc-capture" |
5514 | |
5515 | @@ -44,7 +45,7 @@ struct vimc_cap_device { |
5516 | spinlock_t qlock; |
5517 | struct mutex lock; |
5518 | u32 sequence; |
5519 | - struct media_pipeline pipe; |
5520 | + struct vimc_stream stream; |
5521 | }; |
5522 | |
5523 | static const struct v4l2_pix_format fmt_default = { |
5524 | @@ -248,14 +249,13 @@ static int vimc_cap_start_streaming(struct vb2_queue *vq, unsigned int count) |
5525 | vcap->sequence = 0; |
5526 | |
5527 | /* Start the media pipeline */ |
5528 | - ret = media_pipeline_start(entity, &vcap->pipe); |
5529 | + ret = media_pipeline_start(entity, &vcap->stream.pipe); |
5530 | if (ret) { |
5531 | vimc_cap_return_all_buffers(vcap, VB2_BUF_STATE_QUEUED); |
5532 | return ret; |
5533 | } |
5534 | |
5535 | - /* Enable streaming from the pipe */ |
5536 | - ret = vimc_pipeline_s_stream(&vcap->vdev.entity, 1); |
5537 | + ret = vimc_streamer_s_stream(&vcap->stream, &vcap->ved, 1); |
5538 | if (ret) { |
5539 | media_pipeline_stop(entity); |
5540 | vimc_cap_return_all_buffers(vcap, VB2_BUF_STATE_QUEUED); |
5541 | @@ -273,8 +273,7 @@ static void vimc_cap_stop_streaming(struct vb2_queue *vq) |
5542 | { |
5543 | struct vimc_cap_device *vcap = vb2_get_drv_priv(vq); |
5544 | |
5545 | - /* Disable streaming from the pipe */ |
5546 | - vimc_pipeline_s_stream(&vcap->vdev.entity, 0); |
5547 | + vimc_streamer_s_stream(&vcap->stream, &vcap->ved, 0); |
5548 | |
5549 | /* Stop the media pipeline */ |
5550 | media_pipeline_stop(&vcap->vdev.entity); |
5551 | @@ -355,8 +354,8 @@ static void vimc_cap_comp_unbind(struct device *comp, struct device *master, |
5552 | kfree(vcap); |
5553 | } |
5554 | |
5555 | -static void vimc_cap_process_frame(struct vimc_ent_device *ved, |
5556 | - struct media_pad *sink, const void *frame) |
5557 | +static void *vimc_cap_process_frame(struct vimc_ent_device *ved, |
5558 | + const void *frame) |
5559 | { |
5560 | struct vimc_cap_device *vcap = container_of(ved, struct vimc_cap_device, |
5561 | ved); |
5562 | @@ -370,7 +369,7 @@ static void vimc_cap_process_frame(struct vimc_ent_device *ved, |
5563 | typeof(*vimc_buf), list); |
5564 | if (!vimc_buf) { |
5565 | spin_unlock(&vcap->qlock); |
5566 | - return; |
5567 | + return ERR_PTR(-EAGAIN); |
5568 | } |
5569 | |
5570 | /* Remove this entry from the list */ |
5571 | @@ -391,6 +390,7 @@ static void vimc_cap_process_frame(struct vimc_ent_device *ved, |
5572 | vb2_set_plane_payload(&vimc_buf->vb2.vb2_buf, 0, |
5573 | vcap->format.sizeimage); |
5574 | vb2_buffer_done(&vimc_buf->vb2.vb2_buf, VB2_BUF_STATE_DONE); |
5575 | + return NULL; |
5576 | } |
5577 | |
5578 | static int vimc_cap_comp_bind(struct device *comp, struct device *master, |
5579 | diff --git a/drivers/media/platform/vimc/vimc-common.c b/drivers/media/platform/vimc/vimc-common.c |
5580 | index 617415c224fe..204aa6f554e4 100644 |
5581 | --- a/drivers/media/platform/vimc/vimc-common.c |
5582 | +++ b/drivers/media/platform/vimc/vimc-common.c |
5583 | @@ -207,41 +207,6 @@ const struct vimc_pix_map *vimc_pix_map_by_pixelformat(u32 pixelformat) |
5584 | } |
5585 | EXPORT_SYMBOL_GPL(vimc_pix_map_by_pixelformat); |
5586 | |
5587 | -int vimc_propagate_frame(struct media_pad *src, const void *frame) |
5588 | -{ |
5589 | - struct media_link *link; |
5590 | - |
5591 | - if (!(src->flags & MEDIA_PAD_FL_SOURCE)) |
5592 | - return -EINVAL; |
5593 | - |
5594 | - /* Send this frame to all sink pads that are direct linked */ |
5595 | - list_for_each_entry(link, &src->entity->links, list) { |
5596 | - if (link->source == src && |
5597 | - (link->flags & MEDIA_LNK_FL_ENABLED)) { |
5598 | - struct vimc_ent_device *ved = NULL; |
5599 | - struct media_entity *entity = link->sink->entity; |
5600 | - |
5601 | - if (is_media_entity_v4l2_subdev(entity)) { |
5602 | - struct v4l2_subdev *sd = |
5603 | - container_of(entity, struct v4l2_subdev, |
5604 | - entity); |
5605 | - ved = v4l2_get_subdevdata(sd); |
5606 | - } else if (is_media_entity_v4l2_video_device(entity)) { |
5607 | - struct video_device *vdev = |
5608 | - container_of(entity, |
5609 | - struct video_device, |
5610 | - entity); |
5611 | - ved = video_get_drvdata(vdev); |
5612 | - } |
5613 | - if (ved && ved->process_frame) |
5614 | - ved->process_frame(ved, link->sink, frame); |
5615 | - } |
5616 | - } |
5617 | - |
5618 | - return 0; |
5619 | -} |
5620 | -EXPORT_SYMBOL_GPL(vimc_propagate_frame); |
5621 | - |
5622 | /* Helper function to allocate and initialize pads */ |
5623 | struct media_pad *vimc_pads_init(u16 num_pads, const unsigned long *pads_flag) |
5624 | { |
5625 | diff --git a/drivers/media/platform/vimc/vimc-common.h b/drivers/media/platform/vimc/vimc-common.h |
5626 | index 2e9981b18166..6ed969d9efbb 100644 |
5627 | --- a/drivers/media/platform/vimc/vimc-common.h |
5628 | +++ b/drivers/media/platform/vimc/vimc-common.h |
5629 | @@ -113,23 +113,12 @@ struct vimc_pix_map { |
5630 | struct vimc_ent_device { |
5631 | struct media_entity *ent; |
5632 | struct media_pad *pads; |
5633 | - void (*process_frame)(struct vimc_ent_device *ved, |
5634 | - struct media_pad *sink, const void *frame); |
5635 | + void * (*process_frame)(struct vimc_ent_device *ved, |
5636 | + const void *frame); |
5637 | void (*vdev_get_format)(struct vimc_ent_device *ved, |
5638 | struct v4l2_pix_format *fmt); |
5639 | }; |
5640 | |
5641 | -/** |
5642 | - * vimc_propagate_frame - propagate a frame through the topology |
5643 | - * |
5644 | - * @src: the source pad where the frame is being originated |
5645 | - * @frame: the frame to be propagated |
5646 | - * |
5647 | - * This function will call the process_frame callback from the vimc_ent_device |
5648 | - * struct of the nodes directly connected to the @src pad |
5649 | - */ |
5650 | -int vimc_propagate_frame(struct media_pad *src, const void *frame); |
5651 | - |
5652 | /** |
5653 | * vimc_pads_init - initialize pads |
5654 | * |
5655 | diff --git a/drivers/media/platform/vimc/vimc-debayer.c b/drivers/media/platform/vimc/vimc-debayer.c |
5656 | index 77887f66f323..7d77c63b99d2 100644 |
5657 | --- a/drivers/media/platform/vimc/vimc-debayer.c |
5658 | +++ b/drivers/media/platform/vimc/vimc-debayer.c |
5659 | @@ -321,7 +321,6 @@ static void vimc_deb_set_rgb_mbus_fmt_rgb888_1x24(struct vimc_deb_device *vdeb, |
5660 | static int vimc_deb_s_stream(struct v4l2_subdev *sd, int enable) |
5661 | { |
5662 | struct vimc_deb_device *vdeb = v4l2_get_subdevdata(sd); |
5663 | - int ret; |
5664 | |
5665 | if (enable) { |
5666 | const struct vimc_pix_map *vpix; |
5667 | @@ -351,22 +350,10 @@ static int vimc_deb_s_stream(struct v4l2_subdev *sd, int enable) |
5668 | if (!vdeb->src_frame) |
5669 | return -ENOMEM; |
5670 | |
5671 | - /* Turn the stream on in the subdevices directly connected */ |
5672 | - ret = vimc_pipeline_s_stream(&vdeb->sd.entity, 1); |
5673 | - if (ret) { |
5674 | - vfree(vdeb->src_frame); |
5675 | - vdeb->src_frame = NULL; |
5676 | - return ret; |
5677 | - } |
5678 | } else { |
5679 | if (!vdeb->src_frame) |
5680 | return 0; |
5681 | |
5682 | - /* Disable streaming from the pipe */ |
5683 | - ret = vimc_pipeline_s_stream(&vdeb->sd.entity, 0); |
5684 | - if (ret) |
5685 | - return ret; |
5686 | - |
5687 | vfree(vdeb->src_frame); |
5688 | vdeb->src_frame = NULL; |
5689 | } |
5690 | @@ -480,9 +467,8 @@ static void vimc_deb_calc_rgb_sink(struct vimc_deb_device *vdeb, |
5691 | } |
5692 | } |
5693 | |
5694 | -static void vimc_deb_process_frame(struct vimc_ent_device *ved, |
5695 | - struct media_pad *sink, |
5696 | - const void *sink_frame) |
5697 | +static void *vimc_deb_process_frame(struct vimc_ent_device *ved, |
5698 | + const void *sink_frame) |
5699 | { |
5700 | struct vimc_deb_device *vdeb = container_of(ved, struct vimc_deb_device, |
5701 | ved); |
5702 | @@ -491,7 +477,7 @@ static void vimc_deb_process_frame(struct vimc_ent_device *ved, |
5703 | |
5704 | /* If the stream in this node is not active, just return */ |
5705 | if (!vdeb->src_frame) |
5706 | - return; |
5707 | + return ERR_PTR(-EINVAL); |
5708 | |
5709 | for (i = 0; i < vdeb->sink_fmt.height; i++) |
5710 | for (j = 0; j < vdeb->sink_fmt.width; j++) { |
5711 | @@ -499,12 +485,8 @@ static void vimc_deb_process_frame(struct vimc_ent_device *ved, |
5712 | vdeb->set_rgb_src(vdeb, i, j, rgb); |
5713 | } |
5714 | |
5715 | - /* Propagate the frame through all source pads */ |
5716 | - for (i = 1; i < vdeb->sd.entity.num_pads; i++) { |
5717 | - struct media_pad *pad = &vdeb->sd.entity.pads[i]; |
5718 | + return vdeb->src_frame; |
5719 | |
5720 | - vimc_propagate_frame(pad, vdeb->src_frame); |
5721 | - } |
5722 | } |
5723 | |
5724 | static void vimc_deb_comp_unbind(struct device *comp, struct device *master, |
5725 | diff --git a/drivers/media/platform/vimc/vimc-scaler.c b/drivers/media/platform/vimc/vimc-scaler.c |
5726 | index b0952ee86296..39b2a73dfcc1 100644 |
5727 | --- a/drivers/media/platform/vimc/vimc-scaler.c |
5728 | +++ b/drivers/media/platform/vimc/vimc-scaler.c |
5729 | @@ -217,7 +217,6 @@ static const struct v4l2_subdev_pad_ops vimc_sca_pad_ops = { |
5730 | static int vimc_sca_s_stream(struct v4l2_subdev *sd, int enable) |
5731 | { |
5732 | struct vimc_sca_device *vsca = v4l2_get_subdevdata(sd); |
5733 | - int ret; |
5734 | |
5735 | if (enable) { |
5736 | const struct vimc_pix_map *vpix; |
5737 | @@ -245,22 +244,10 @@ static int vimc_sca_s_stream(struct v4l2_subdev *sd, int enable) |
5738 | if (!vsca->src_frame) |
5739 | return -ENOMEM; |
5740 | |
5741 | - /* Turn the stream on in the subdevices directly connected */ |
5742 | - ret = vimc_pipeline_s_stream(&vsca->sd.entity, 1); |
5743 | - if (ret) { |
5744 | - vfree(vsca->src_frame); |
5745 | - vsca->src_frame = NULL; |
5746 | - return ret; |
5747 | - } |
5748 | } else { |
5749 | if (!vsca->src_frame) |
5750 | return 0; |
5751 | |
5752 | - /* Disable streaming from the pipe */ |
5753 | - ret = vimc_pipeline_s_stream(&vsca->sd.entity, 0); |
5754 | - if (ret) |
5755 | - return ret; |
5756 | - |
5757 | vfree(vsca->src_frame); |
5758 | vsca->src_frame = NULL; |
5759 | } |
5760 | @@ -346,26 +333,19 @@ static void vimc_sca_fill_src_frame(const struct vimc_sca_device *const vsca, |
5761 | vimc_sca_scale_pix(vsca, i, j, sink_frame); |
5762 | } |
5763 | |
5764 | -static void vimc_sca_process_frame(struct vimc_ent_device *ved, |
5765 | - struct media_pad *sink, |
5766 | - const void *sink_frame) |
5767 | +static void *vimc_sca_process_frame(struct vimc_ent_device *ved, |
5768 | + const void *sink_frame) |
5769 | { |
5770 | struct vimc_sca_device *vsca = container_of(ved, struct vimc_sca_device, |
5771 | ved); |
5772 | - unsigned int i; |
5773 | |
5774 | /* If the stream in this node is not active, just return */ |
5775 | if (!vsca->src_frame) |
5776 | - return; |
5777 | + return ERR_PTR(-EINVAL); |
5778 | |
5779 | vimc_sca_fill_src_frame(vsca, sink_frame); |
5780 | |
5781 | - /* Propagate the frame through all source pads */ |
5782 | - for (i = 1; i < vsca->sd.entity.num_pads; i++) { |
5783 | - struct media_pad *pad = &vsca->sd.entity.pads[i]; |
5784 | - |
5785 | - vimc_propagate_frame(pad, vsca->src_frame); |
5786 | - } |
5787 | + return vsca->src_frame; |
5788 | }; |
5789 | |
5790 | static void vimc_sca_comp_unbind(struct device *comp, struct device *master, |
5791 | diff --git a/drivers/media/platform/vimc/vimc-sensor.c b/drivers/media/platform/vimc/vimc-sensor.c |
5792 | index b2b89315e7ba..9e0d70e9f119 100644 |
5793 | --- a/drivers/media/platform/vimc/vimc-sensor.c |
5794 | +++ b/drivers/media/platform/vimc/vimc-sensor.c |
5795 | @@ -16,8 +16,6 @@ |
5796 | */ |
5797 | |
5798 | #include <linux/component.h> |
5799 | -#include <linux/freezer.h> |
5800 | -#include <linux/kthread.h> |
5801 | #include <linux/module.h> |
5802 | #include <linux/mod_devicetable.h> |
5803 | #include <linux/platform_device.h> |
5804 | @@ -201,38 +199,27 @@ static const struct v4l2_subdev_pad_ops vimc_sen_pad_ops = { |
5805 | .set_fmt = vimc_sen_set_fmt, |
5806 | }; |
5807 | |
5808 | -static int vimc_sen_tpg_thread(void *data) |
5809 | +static void *vimc_sen_process_frame(struct vimc_ent_device *ved, |
5810 | + const void *sink_frame) |
5811 | { |
5812 | - struct vimc_sen_device *vsen = data; |
5813 | - unsigned int i; |
5814 | - |
5815 | - set_freezable(); |
5816 | - set_current_state(TASK_UNINTERRUPTIBLE); |
5817 | - |
5818 | - for (;;) { |
5819 | - try_to_freeze(); |
5820 | - if (kthread_should_stop()) |
5821 | - break; |
5822 | - |
5823 | - tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame); |
5824 | + struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device, |
5825 | + ved); |
5826 | + const struct vimc_pix_map *vpix; |
5827 | + unsigned int frame_size; |
5828 | |
5829 | - /* Send the frame to all source pads */ |
5830 | - for (i = 0; i < vsen->sd.entity.num_pads; i++) |
5831 | - vimc_propagate_frame(&vsen->sd.entity.pads[i], |
5832 | - vsen->frame); |
5833 | + /* Calculate the frame size */ |
5834 | + vpix = vimc_pix_map_by_code(vsen->mbus_format.code); |
5835 | + frame_size = vsen->mbus_format.width * vpix->bpp * |
5836 | + vsen->mbus_format.height; |
5837 | |
5838 | - /* 60 frames per second */ |
5839 | - schedule_timeout(HZ/60); |
5840 | - } |
5841 | - |
5842 | - return 0; |
5843 | + tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame); |
5844 | + return vsen->frame; |
5845 | } |
5846 | |
5847 | static int vimc_sen_s_stream(struct v4l2_subdev *sd, int enable) |
5848 | { |
5849 | struct vimc_sen_device *vsen = |
5850 | container_of(sd, struct vimc_sen_device, sd); |
5851 | - int ret; |
5852 | |
5853 | if (enable) { |
5854 | const struct vimc_pix_map *vpix; |
5855 | @@ -258,26 +245,8 @@ static int vimc_sen_s_stream(struct v4l2_subdev *sd, int enable) |
5856 | /* configure the test pattern generator */ |
5857 | vimc_sen_tpg_s_format(vsen); |
5858 | |
5859 | - /* Initialize the image generator thread */ |
5860 | - vsen->kthread_sen = kthread_run(vimc_sen_tpg_thread, vsen, |
5861 | - "%s-sen", vsen->sd.v4l2_dev->name); |
5862 | - if (IS_ERR(vsen->kthread_sen)) { |
5863 | - dev_err(vsen->dev, "%s: kernel_thread() failed\n", |
5864 | - vsen->sd.name); |
5865 | - vfree(vsen->frame); |
5866 | - vsen->frame = NULL; |
5867 | - return PTR_ERR(vsen->kthread_sen); |
5868 | - } |
5869 | } else { |
5870 | - if (!vsen->kthread_sen) |
5871 | - return 0; |
5872 | - |
5873 | - /* Stop image generator */ |
5874 | - ret = kthread_stop(vsen->kthread_sen); |
5875 | - if (ret) |
5876 | - return ret; |
5877 | |
5878 | - vsen->kthread_sen = NULL; |
5879 | vfree(vsen->frame); |
5880 | vsen->frame = NULL; |
5881 | return 0; |
5882 | @@ -393,6 +362,7 @@ static int vimc_sen_comp_bind(struct device *comp, struct device *master, |
5883 | if (ret) |
5884 | goto err_free_hdl; |
5885 | |
5886 | + vsen->ved.process_frame = vimc_sen_process_frame; |
5887 | dev_set_drvdata(comp, &vsen->ved); |
5888 | vsen->dev = comp; |
5889 | |
5890 | diff --git a/drivers/media/platform/vimc/vimc-streamer.c b/drivers/media/platform/vimc/vimc-streamer.c |
5891 | new file mode 100644 |
5892 | index 000000000000..fcc897fb247b |
5893 | --- /dev/null |
5894 | +++ b/drivers/media/platform/vimc/vimc-streamer.c |
5895 | @@ -0,0 +1,188 @@ |
5896 | +// SPDX-License-Identifier: GPL-2.0+ |
5897 | +/* |
5898 | + * vimc-streamer.c Virtual Media Controller Driver |
5899 | + * |
5900 | + * Copyright (C) 2018 Lucas A. M. Magalhães <lucmaga@gmail.com> |
5901 | + * |
5902 | + */ |
5903 | + |
5904 | +#include <linux/init.h> |
5905 | +#include <linux/module.h> |
5906 | +#include <linux/freezer.h> |
5907 | +#include <linux/kthread.h> |
5908 | + |
5909 | +#include "vimc-streamer.h" |
5910 | + |
5911 | +/** |
5912 | + * vimc_get_source_entity - get the entity connected with the first sink pad |
5913 | + * |
5914 | + * @ent: reference media_entity |
5915 | + * |
5916 | + * Helper function that returns the media entity containing the source pad |
5917 | + * linked with the first sink pad from the given media entity pad list. |
5918 | + */ |
5919 | +static struct media_entity *vimc_get_source_entity(struct media_entity *ent) |
5920 | +{ |
5921 | + struct media_pad *pad; |
5922 | + int i; |
5923 | + |
5924 | + for (i = 0; i < ent->num_pads; i++) { |
5925 | + if (ent->pads[i].flags & MEDIA_PAD_FL_SOURCE) |
5926 | + continue; |
5927 | + pad = media_entity_remote_pad(&ent->pads[i]); |
5928 | + return pad ? pad->entity : NULL; |
5929 | + } |
5930 | + return NULL; |
5931 | +} |
5932 | + |
5933 | +/* |
5934 | + * vimc_streamer_pipeline_terminate - Disable stream in all ved in stream |
5935 | + * |
5936 | + * @stream: the pointer to the stream structure with the pipeline to be |
5937 | + * disabled. |
5938 | + * |
5939 | + * Calls s_stream to disable the stream in each entity of the pipeline |
5940 | + * |
5941 | + */ |
5942 | +static void vimc_streamer_pipeline_terminate(struct vimc_stream *stream) |
5943 | +{ |
5944 | + struct media_entity *entity; |
5945 | + struct v4l2_subdev *sd; |
5946 | + |
5947 | + while (stream->pipe_size) { |
5948 | + stream->pipe_size--; |
5949 | + entity = stream->ved_pipeline[stream->pipe_size]->ent; |
5950 | + entity = vimc_get_source_entity(entity); |
5951 | + stream->ved_pipeline[stream->pipe_size] = NULL; |
5952 | + |
5953 | + if (!is_media_entity_v4l2_subdev(entity)) |
5954 | + continue; |
5955 | + |
5956 | + sd = media_entity_to_v4l2_subdev(entity); |
5957 | + v4l2_subdev_call(sd, video, s_stream, 0); |
5958 | + } |
5959 | +} |
5960 | + |
5961 | +/* |
5962 | + * vimc_streamer_pipeline_init - initializes the stream structure |
5963 | + * |
5964 | + * @stream: the pointer to the stream structure to be initialized |
5965 | + * @ved: the pointer to the vimc entity initializing the stream |
5966 | + * |
5967 | + * Initializes the stream structure. Walks through the entity graph to |
5968 | + * construct the pipeline used later on the streamer thread. |
5969 | + * Calls s_stream to enable stream in all entities of the pipeline. |
5970 | + */ |
5971 | +static int vimc_streamer_pipeline_init(struct vimc_stream *stream, |
5972 | + struct vimc_ent_device *ved) |
5973 | +{ |
5974 | + struct media_entity *entity; |
5975 | + struct video_device *vdev; |
5976 | + struct v4l2_subdev *sd; |
5977 | + int ret = 0; |
5978 | + |
5979 | + stream->pipe_size = 0; |
5980 | + while (stream->pipe_size < VIMC_STREAMER_PIPELINE_MAX_SIZE) { |
5981 | + if (!ved) { |
5982 | + vimc_streamer_pipeline_terminate(stream); |
5983 | + return -EINVAL; |
5984 | + } |
5985 | + stream->ved_pipeline[stream->pipe_size++] = ved; |
5986 | + |
5987 | + entity = vimc_get_source_entity(ved->ent); |
5988 | + /* Check if the end of the pipeline was reached*/ |
5989 | + if (!entity) |
5990 | + return 0; |
5991 | + |
5992 | + if (is_media_entity_v4l2_subdev(entity)) { |
5993 | + sd = media_entity_to_v4l2_subdev(entity); |
5994 | + ret = v4l2_subdev_call(sd, video, s_stream, 1); |
5995 | + if (ret && ret != -ENOIOCTLCMD) { |
5996 | + vimc_streamer_pipeline_terminate(stream); |
5997 | + return ret; |
5998 | + } |
5999 | + ved = v4l2_get_subdevdata(sd); |
6000 | + } else { |
6001 | + vdev = container_of(entity, |
6002 | + struct video_device, |
6003 | + entity); |
6004 | + ved = video_get_drvdata(vdev); |
6005 | + } |
6006 | + } |
6007 | + |
6008 | + vimc_streamer_pipeline_terminate(stream); |
6009 | + return -EINVAL; |
6010 | +} |
6011 | + |
6012 | +static int vimc_streamer_thread(void *data) |
6013 | +{ |
6014 | + struct vimc_stream *stream = data; |
6015 | + int i; |
6016 | + |
6017 | + set_freezable(); |
6018 | + set_current_state(TASK_UNINTERRUPTIBLE); |
6019 | + |
6020 | + for (;;) { |
6021 | + try_to_freeze(); |
6022 | + if (kthread_should_stop()) |
6023 | + break; |
6024 | + |
6025 | + for (i = stream->pipe_size - 1; i >= 0; i--) { |
6026 | + stream->frame = stream->ved_pipeline[i]->process_frame( |
6027 | + stream->ved_pipeline[i], |
6028 | + stream->frame); |
6029 | + if (!stream->frame) |
6030 | + break; |
6031 | + if (IS_ERR(stream->frame)) |
6032 | + break; |
6033 | + } |
6034 | + //wait for 60hz |
6035 | + schedule_timeout(HZ / 60); |
6036 | + } |
6037 | + |
6038 | + return 0; |
6039 | +} |
6040 | + |
6041 | +int vimc_streamer_s_stream(struct vimc_stream *stream, |
6042 | + struct vimc_ent_device *ved, |
6043 | + int enable) |
6044 | +{ |
6045 | + int ret; |
6046 | + |
6047 | + if (!stream || !ved) |
6048 | + return -EINVAL; |
6049 | + |
6050 | + if (enable) { |
6051 | + if (stream->kthread) |
6052 | + return 0; |
6053 | + |
6054 | + ret = vimc_streamer_pipeline_init(stream, ved); |
6055 | + if (ret) |
6056 | + return ret; |
6057 | + |
6058 | + stream->kthread = kthread_run(vimc_streamer_thread, stream, |
6059 | + "vimc-streamer thread"); |
6060 | + |
6061 | + if (IS_ERR(stream->kthread)) |
6062 | + return PTR_ERR(stream->kthread); |
6063 | + |
6064 | + } else { |
6065 | + if (!stream->kthread) |
6066 | + return 0; |
6067 | + |
6068 | + ret = kthread_stop(stream->kthread); |
6069 | + if (ret) |
6070 | + return ret; |
6071 | + |
6072 | + stream->kthread = NULL; |
6073 | + |
6074 | + vimc_streamer_pipeline_terminate(stream); |
6075 | + } |
6076 | + |
6077 | + return 0; |
6078 | +} |
6079 | +EXPORT_SYMBOL_GPL(vimc_streamer_s_stream); |
6080 | + |
6081 | +MODULE_DESCRIPTION("Virtual Media Controller Driver (VIMC) Streamer"); |
6082 | +MODULE_AUTHOR("Lucas A. M. Magalhães <lucmaga@gmail.com>"); |
6083 | +MODULE_LICENSE("GPL"); |
6084 | diff --git a/drivers/media/platform/vimc/vimc-streamer.h b/drivers/media/platform/vimc/vimc-streamer.h |
6085 | new file mode 100644 |
6086 | index 000000000000..752af2e2d5a2 |
6087 | --- /dev/null |
6088 | +++ b/drivers/media/platform/vimc/vimc-streamer.h |
6089 | @@ -0,0 +1,38 @@ |
6090 | +/* SPDX-License-Identifier: GPL-2.0+ */ |
6091 | +/* |
6092 | + * vimc-streamer.h Virtual Media Controller Driver |
6093 | + * |
6094 | + * Copyright (C) 2018 Lucas A. M. Magalhães <lucmaga@gmail.com> |
6095 | + * |
6096 | + */ |
6097 | + |
6098 | +#ifndef _VIMC_STREAMER_H_ |
6099 | +#define _VIMC_STREAMER_H_ |
6100 | + |
6101 | +#include <media/media-device.h> |
6102 | + |
6103 | +#include "vimc-common.h" |
6104 | + |
6105 | +#define VIMC_STREAMER_PIPELINE_MAX_SIZE 16 |
6106 | + |
6107 | +struct vimc_stream { |
6108 | + struct media_pipeline pipe; |
6109 | + struct vimc_ent_device *ved_pipeline[VIMC_STREAMER_PIPELINE_MAX_SIZE]; |
6110 | + unsigned int pipe_size; |
6111 | + u8 *frame; |
6112 | + struct task_struct *kthread; |
6113 | +}; |
6114 | + |
6115 | +/** |
6116 | + * vimc_streamer_s_streamer - start/stop the stream |
6117 | + * |
6118 | + * @stream: the pointer to the stream to start or stop |
6119 | + * @ved: The last entity of the streamer pipeline |
6120 | + * @enable: any non-zero number start the stream, zero stop |
6121 | + * |
6122 | + */ |
6123 | +int vimc_streamer_s_stream(struct vimc_stream *stream, |
6124 | + struct vimc_ent_device *ved, |
6125 | + int enable); |
6126 | + |
6127 | +#endif //_VIMC_STREAMER_H_ |
6128 | diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c |
6129 | index 86a99f461fd8..ffffb66d51a0 100644 |
6130 | --- a/drivers/media/usb/uvc/uvc_video.c |
6131 | +++ b/drivers/media/usb/uvc/uvc_video.c |
6132 | @@ -676,6 +676,14 @@ void uvc_video_clock_update(struct uvc_streaming *stream, |
6133 | if (!uvc_hw_timestamps_param) |
6134 | return; |
6135 | |
6136 | + /* |
6137 | + * We will get called from __vb2_queue_cancel() if there are buffers |
6138 | + * done but not dequeued by the user, but the sample array has already |
6139 | + * been released at that time. Just bail out in that case. |
6140 | + */ |
6141 | + if (!clock->samples) |
6142 | + return; |
6143 | + |
6144 | spin_lock_irqsave(&clock->lock, flags); |
6145 | |
6146 | if (clock->count < clock->size) |
6147 | diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c |
6148 | index a530972c5a7e..e0173bf4b0dc 100644 |
6149 | --- a/drivers/mfd/sm501.c |
6150 | +++ b/drivers/mfd/sm501.c |
6151 | @@ -1145,6 +1145,9 @@ static int sm501_register_gpio_i2c_instance(struct sm501_devdata *sm, |
6152 | lookup = devm_kzalloc(&pdev->dev, |
6153 | sizeof(*lookup) + 3 * sizeof(struct gpiod_lookup), |
6154 | GFP_KERNEL); |
6155 | + if (!lookup) |
6156 | + return -ENOMEM; |
6157 | + |
6158 | lookup->dev_id = "i2c-gpio"; |
6159 | if (iic->pin_sda < 32) |
6160 | lookup->table[0].chip_label = "SM501-LOW"; |
6161 | diff --git a/drivers/misc/cxl/guest.c b/drivers/misc/cxl/guest.c |
6162 | index 3bc0c15d4d85..b83a373e3a8d 100644 |
6163 | --- a/drivers/misc/cxl/guest.c |
6164 | +++ b/drivers/misc/cxl/guest.c |
6165 | @@ -267,6 +267,7 @@ static int guest_reset(struct cxl *adapter) |
6166 | int i, rc; |
6167 | |
6168 | pr_devel("Adapter reset request\n"); |
6169 | + spin_lock(&adapter->afu_list_lock); |
6170 | for (i = 0; i < adapter->slices; i++) { |
6171 | if ((afu = adapter->afu[i])) { |
6172 | pci_error_handlers(afu, CXL_ERROR_DETECTED_EVENT, |
6173 | @@ -283,6 +284,7 @@ static int guest_reset(struct cxl *adapter) |
6174 | pci_error_handlers(afu, CXL_RESUME_EVENT, 0); |
6175 | } |
6176 | } |
6177 | + spin_unlock(&adapter->afu_list_lock); |
6178 | return rc; |
6179 | } |
6180 | |
6181 | diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c |
6182 | index b66d832d3233..787a69a2a726 100644 |
6183 | --- a/drivers/misc/cxl/pci.c |
6184 | +++ b/drivers/misc/cxl/pci.c |
6185 | @@ -1807,7 +1807,7 @@ static pci_ers_result_t cxl_vphb_error_detected(struct cxl_afu *afu, |
6186 | /* There should only be one entry, but go through the list |
6187 | * anyway |
6188 | */ |
6189 | - if (afu->phb == NULL) |
6190 | + if (afu == NULL || afu->phb == NULL) |
6191 | return result; |
6192 | |
6193 | list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { |
6194 | @@ -1834,7 +1834,8 @@ static pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev, |
6195 | { |
6196 | struct cxl *adapter = pci_get_drvdata(pdev); |
6197 | struct cxl_afu *afu; |
6198 | - pci_ers_result_t result = PCI_ERS_RESULT_NEED_RESET, afu_result; |
6199 | + pci_ers_result_t result = PCI_ERS_RESULT_NEED_RESET; |
6200 | + pci_ers_result_t afu_result = PCI_ERS_RESULT_NEED_RESET; |
6201 | int i; |
6202 | |
6203 | /* At this point, we could still have an interrupt pending. |
6204 | @@ -1845,6 +1846,7 @@ static pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev, |
6205 | |
6206 | /* If we're permanently dead, give up. */ |
6207 | if (state == pci_channel_io_perm_failure) { |
6208 | + spin_lock(&adapter->afu_list_lock); |
6209 | for (i = 0; i < adapter->slices; i++) { |
6210 | afu = adapter->afu[i]; |
6211 | /* |
6212 | @@ -1853,6 +1855,7 @@ static pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev, |
6213 | */ |
6214 | cxl_vphb_error_detected(afu, state); |
6215 | } |
6216 | + spin_unlock(&adapter->afu_list_lock); |
6217 | return PCI_ERS_RESULT_DISCONNECT; |
6218 | } |
6219 | |
6220 | @@ -1934,11 +1937,17 @@ static pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev, |
6221 | * * In slot_reset, free the old resources and allocate new ones. |
6222 | * * In resume, clear the flag to allow things to start. |
6223 | */ |
6224 | + |
6225 | + /* Make sure no one else changes the afu list */ |
6226 | + spin_lock(&adapter->afu_list_lock); |
6227 | + |
6228 | for (i = 0; i < adapter->slices; i++) { |
6229 | afu = adapter->afu[i]; |
6230 | |
6231 | - afu_result = cxl_vphb_error_detected(afu, state); |
6232 | + if (afu == NULL) |
6233 | + continue; |
6234 | |
6235 | + afu_result = cxl_vphb_error_detected(afu, state); |
6236 | cxl_context_detach_all(afu); |
6237 | cxl_ops->afu_deactivate_mode(afu, afu->current_mode); |
6238 | pci_deconfigure_afu(afu); |
6239 | @@ -1950,6 +1959,7 @@ static pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev, |
6240 | (result == PCI_ERS_RESULT_NEED_RESET)) |
6241 | result = PCI_ERS_RESULT_NONE; |
6242 | } |
6243 | + spin_unlock(&adapter->afu_list_lock); |
6244 | |
6245 | /* should take the context lock here */ |
6246 | if (cxl_adapter_context_lock(adapter) != 0) |
6247 | @@ -1982,14 +1992,18 @@ static pci_ers_result_t cxl_pci_slot_reset(struct pci_dev *pdev) |
6248 | */ |
6249 | cxl_adapter_context_unlock(adapter); |
6250 | |
6251 | + spin_lock(&adapter->afu_list_lock); |
6252 | for (i = 0; i < adapter->slices; i++) { |
6253 | afu = adapter->afu[i]; |
6254 | |
6255 | + if (afu == NULL) |
6256 | + continue; |
6257 | + |
6258 | if (pci_configure_afu(afu, adapter, pdev)) |
6259 | - goto err; |
6260 | + goto err_unlock; |
6261 | |
6262 | if (cxl_afu_select_best_mode(afu)) |
6263 | - goto err; |
6264 | + goto err_unlock; |
6265 | |
6266 | if (afu->phb == NULL) |
6267 | continue; |
6268 | @@ -2001,16 +2015,16 @@ static pci_ers_result_t cxl_pci_slot_reset(struct pci_dev *pdev) |
6269 | ctx = cxl_get_context(afu_dev); |
6270 | |
6271 | if (ctx && cxl_release_context(ctx)) |
6272 | - goto err; |
6273 | + goto err_unlock; |
6274 | |
6275 | ctx = cxl_dev_context_init(afu_dev); |
6276 | if (IS_ERR(ctx)) |
6277 | - goto err; |
6278 | + goto err_unlock; |
6279 | |
6280 | afu_dev->dev.archdata.cxl_ctx = ctx; |
6281 | |
6282 | if (cxl_ops->afu_check_and_enable(afu)) |
6283 | - goto err; |
6284 | + goto err_unlock; |
6285 | |
6286 | afu_dev->error_state = pci_channel_io_normal; |
6287 | |
6288 | @@ -2031,8 +2045,13 @@ static pci_ers_result_t cxl_pci_slot_reset(struct pci_dev *pdev) |
6289 | result = PCI_ERS_RESULT_DISCONNECT; |
6290 | } |
6291 | } |
6292 | + |
6293 | + spin_unlock(&adapter->afu_list_lock); |
6294 | return result; |
6295 | |
6296 | +err_unlock: |
6297 | + spin_unlock(&adapter->afu_list_lock); |
6298 | + |
6299 | err: |
6300 | /* All the bits that happen in both error_detected and cxl_remove |
6301 | * should be idempotent, so we don't need to worry about leaving a mix |
6302 | @@ -2053,10 +2072,11 @@ static void cxl_pci_resume(struct pci_dev *pdev) |
6303 | * This is not the place to be checking if everything came back up |
6304 | * properly, because there's no return value: do that in slot_reset. |
6305 | */ |
6306 | + spin_lock(&adapter->afu_list_lock); |
6307 | for (i = 0; i < adapter->slices; i++) { |
6308 | afu = adapter->afu[i]; |
6309 | |
6310 | - if (afu->phb == NULL) |
6311 | + if (afu == NULL || afu->phb == NULL) |
6312 | continue; |
6313 | |
6314 | list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) { |
6315 | @@ -2065,6 +2085,7 @@ static void cxl_pci_resume(struct pci_dev *pdev) |
6316 | afu_dev->driver->err_handler->resume(afu_dev); |
6317 | } |
6318 | } |
6319 | + spin_unlock(&adapter->afu_list_lock); |
6320 | } |
6321 | |
6322 | static const struct pci_error_handlers cxl_err_handler = { |
6323 | diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c |
6324 | index fc3872fe7b25..c383322ec2ba 100644 |
6325 | --- a/drivers/misc/mei/bus.c |
6326 | +++ b/drivers/misc/mei/bus.c |
6327 | @@ -541,17 +541,9 @@ int mei_cldev_enable(struct mei_cl_device *cldev) |
6328 | goto out; |
6329 | } |
6330 | |
6331 | - if (!mei_cl_bus_module_get(cldev)) { |
6332 | - dev_err(&cldev->dev, "get hw module failed"); |
6333 | - ret = -ENODEV; |
6334 | - goto out; |
6335 | - } |
6336 | - |
6337 | ret = mei_cl_connect(cl, cldev->me_cl, NULL); |
6338 | - if (ret < 0) { |
6339 | + if (ret < 0) |
6340 | dev_err(&cldev->dev, "cannot connect\n"); |
6341 | - mei_cl_bus_module_put(cldev); |
6342 | - } |
6343 | |
6344 | out: |
6345 | mutex_unlock(&bus->device_lock); |
6346 | @@ -614,7 +606,6 @@ int mei_cldev_disable(struct mei_cl_device *cldev) |
6347 | if (err < 0) |
6348 | dev_err(bus->dev, "Could not disconnect from the ME client\n"); |
6349 | |
6350 | - mei_cl_bus_module_put(cldev); |
6351 | out: |
6352 | /* Flush queues and remove any pending read */ |
6353 | mei_cl_flush_queues(cl, NULL); |
6354 | @@ -725,9 +716,16 @@ static int mei_cl_device_probe(struct device *dev) |
6355 | if (!id) |
6356 | return -ENODEV; |
6357 | |
6358 | + if (!mei_cl_bus_module_get(cldev)) { |
6359 | + dev_err(&cldev->dev, "get hw module failed"); |
6360 | + return -ENODEV; |
6361 | + } |
6362 | + |
6363 | ret = cldrv->probe(cldev, id); |
6364 | - if (ret) |
6365 | + if (ret) { |
6366 | + mei_cl_bus_module_put(cldev); |
6367 | return ret; |
6368 | + } |
6369 | |
6370 | __module_get(THIS_MODULE); |
6371 | return 0; |
6372 | @@ -755,6 +753,7 @@ static int mei_cl_device_remove(struct device *dev) |
6373 | |
6374 | mei_cldev_unregister_callbacks(cldev); |
6375 | |
6376 | + mei_cl_bus_module_put(cldev); |
6377 | module_put(THIS_MODULE); |
6378 | dev->driver = NULL; |
6379 | return ret; |
6380 | diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c |
6381 | index e56f3e72d57a..d39cc2909474 100644 |
6382 | --- a/drivers/misc/mei/hbm.c |
6383 | +++ b/drivers/misc/mei/hbm.c |
6384 | @@ -986,29 +986,36 @@ static void mei_hbm_config_features(struct mei_device *dev) |
6385 | dev->version.minor_version >= HBM_MINOR_VERSION_PGI) |
6386 | dev->hbm_f_pg_supported = 1; |
6387 | |
6388 | + dev->hbm_f_dc_supported = 0; |
6389 | if (dev->version.major_version >= HBM_MAJOR_VERSION_DC) |
6390 | dev->hbm_f_dc_supported = 1; |
6391 | |
6392 | + dev->hbm_f_ie_supported = 0; |
6393 | if (dev->version.major_version >= HBM_MAJOR_VERSION_IE) |
6394 | dev->hbm_f_ie_supported = 1; |
6395 | |
6396 | /* disconnect on connect timeout instead of link reset */ |
6397 | + dev->hbm_f_dot_supported = 0; |
6398 | if (dev->version.major_version >= HBM_MAJOR_VERSION_DOT) |
6399 | dev->hbm_f_dot_supported = 1; |
6400 | |
6401 | /* Notification Event Support */ |
6402 | + dev->hbm_f_ev_supported = 0; |
6403 | if (dev->version.major_version >= HBM_MAJOR_VERSION_EV) |
6404 | dev->hbm_f_ev_supported = 1; |
6405 | |
6406 | /* Fixed Address Client Support */ |
6407 | + dev->hbm_f_fa_supported = 0; |
6408 | if (dev->version.major_version >= HBM_MAJOR_VERSION_FA) |
6409 | dev->hbm_f_fa_supported = 1; |
6410 | |
6411 | /* OS ver message Support */ |
6412 | + dev->hbm_f_os_supported = 0; |
6413 | if (dev->version.major_version >= HBM_MAJOR_VERSION_OS) |
6414 | dev->hbm_f_os_supported = 1; |
6415 | |
6416 | /* DMA Ring Support */ |
6417 | + dev->hbm_f_dr_supported = 0; |
6418 | if (dev->version.major_version > HBM_MAJOR_VERSION_DR || |
6419 | (dev->version.major_version == HBM_MAJOR_VERSION_DR && |
6420 | dev->version.minor_version >= HBM_MINOR_VERSION_DR)) |
6421 | diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c |
6422 | index d4f9bfbaf023..6600b3466dfb 100644 |
6423 | --- a/drivers/mmc/core/core.c |
6424 | +++ b/drivers/mmc/core/core.c |
6425 | @@ -2378,9 +2378,9 @@ unsigned int mmc_calc_max_discard(struct mmc_card *card) |
6426 | return card->pref_erase; |
6427 | |
6428 | max_discard = mmc_do_calc_max_discard(card, MMC_ERASE_ARG); |
6429 | - if (max_discard && mmc_can_trim(card)) { |
6430 | + if (mmc_can_trim(card)) { |
6431 | max_trim = mmc_do_calc_max_discard(card, MMC_TRIM_ARG); |
6432 | - if (max_trim < max_discard) |
6433 | + if (max_trim < max_discard || max_discard == 0) |
6434 | max_discard = max_trim; |
6435 | } else if (max_discard < card->erase_size) { |
6436 | max_discard = 0; |
6437 | diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c |
6438 | index 753973dc1655..8dae12b841b3 100644 |
6439 | --- a/drivers/mmc/host/sdhci-esdhc-imx.c |
6440 | +++ b/drivers/mmc/host/sdhci-esdhc-imx.c |
6441 | @@ -981,6 +981,7 @@ static void esdhc_set_uhs_signaling(struct sdhci_host *host, unsigned timing) |
6442 | case MMC_TIMING_UHS_SDR25: |
6443 | case MMC_TIMING_UHS_SDR50: |
6444 | case MMC_TIMING_UHS_SDR104: |
6445 | + case MMC_TIMING_MMC_HS: |
6446 | case MMC_TIMING_MMC_HS200: |
6447 | writel(m, host->ioaddr + ESDHC_MIX_CTRL); |
6448 | break; |
6449 | diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c |
6450 | index ae219b8a7754..2646faffd36e 100644 |
6451 | --- a/drivers/net/can/flexcan.c |
6452 | +++ b/drivers/net/can/flexcan.c |
6453 | @@ -140,7 +140,7 @@ |
6454 | #define FLEXCAN_TX_MB 63 |
6455 | #define FLEXCAN_RX_MB_OFF_TIMESTAMP_FIRST (FLEXCAN_TX_MB_RESERVED_OFF_TIMESTAMP + 1) |
6456 | #define FLEXCAN_RX_MB_OFF_TIMESTAMP_LAST (FLEXCAN_TX_MB - 1) |
6457 | -#define FLEXCAN_IFLAG_MB(x) BIT(x & 0x1f) |
6458 | +#define FLEXCAN_IFLAG_MB(x) BIT((x) & 0x1f) |
6459 | #define FLEXCAN_IFLAG_RX_FIFO_OVERFLOW BIT(7) |
6460 | #define FLEXCAN_IFLAG_RX_FIFO_WARN BIT(6) |
6461 | #define FLEXCAN_IFLAG_RX_FIFO_AVAILABLE BIT(5) |
6462 | diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c |
6463 | index fc8b48adf38b..2fa2caf7a746 100644 |
6464 | --- a/drivers/net/dsa/bcm_sf2.c |
6465 | +++ b/drivers/net/dsa/bcm_sf2.c |
6466 | @@ -692,7 +692,7 @@ static int bcm_sf2_sw_suspend(struct dsa_switch *ds) |
6467 | * port, the other ones have already been disabled during |
6468 | * bcm_sf2_sw_setup |
6469 | */ |
6470 | - for (port = 0; port < DSA_MAX_PORTS; port++) { |
6471 | + for (port = 0; port < ds->num_ports; port++) { |
6472 | if (dsa_is_user_port(ds, port) || dsa_is_cpu_port(ds, port)) |
6473 | bcm_sf2_port_disable(ds, port, NULL); |
6474 | } |
6475 | @@ -724,10 +724,11 @@ static void bcm_sf2_sw_get_wol(struct dsa_switch *ds, int port, |
6476 | { |
6477 | struct net_device *p = ds->ports[port].cpu_dp->master; |
6478 | struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); |
6479 | - struct ethtool_wolinfo pwol; |
6480 | + struct ethtool_wolinfo pwol = { }; |
6481 | |
6482 | /* Get the parent device WoL settings */ |
6483 | - p->ethtool_ops->get_wol(p, &pwol); |
6484 | + if (p->ethtool_ops->get_wol) |
6485 | + p->ethtool_ops->get_wol(p, &pwol); |
6486 | |
6487 | /* Advertise the parent device supported settings */ |
6488 | wol->supported = pwol.supported; |
6489 | @@ -748,9 +749,10 @@ static int bcm_sf2_sw_set_wol(struct dsa_switch *ds, int port, |
6490 | struct net_device *p = ds->ports[port].cpu_dp->master; |
6491 | struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); |
6492 | s8 cpu_port = ds->ports[port].cpu_dp->index; |
6493 | - struct ethtool_wolinfo pwol; |
6494 | + struct ethtool_wolinfo pwol = { }; |
6495 | |
6496 | - p->ethtool_ops->get_wol(p, &pwol); |
6497 | + if (p->ethtool_ops->get_wol) |
6498 | + p->ethtool_ops->get_wol(p, &pwol); |
6499 | if (wol->wolopts & ~pwol.supported) |
6500 | return -EINVAL; |
6501 | |
6502 | diff --git a/drivers/net/ethernet/atheros/atlx/atl2.c b/drivers/net/ethernet/atheros/atlx/atl2.c |
6503 | index bb41becb6609..31ff1e0d1baa 100644 |
6504 | --- a/drivers/net/ethernet/atheros/atlx/atl2.c |
6505 | +++ b/drivers/net/ethernet/atheros/atlx/atl2.c |
6506 | @@ -1335,13 +1335,11 @@ static int atl2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
6507 | { |
6508 | struct net_device *netdev; |
6509 | struct atl2_adapter *adapter; |
6510 | - static int cards_found; |
6511 | + static int cards_found = 0; |
6512 | unsigned long mmio_start; |
6513 | int mmio_len; |
6514 | int err; |
6515 | |
6516 | - cards_found = 0; |
6517 | - |
6518 | err = pci_enable_device(pdev); |
6519 | if (err) |
6520 | return err; |
6521 | diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c |
6522 | index fc16b2b0d0e9..0bdbc72605e1 100644 |
6523 | --- a/drivers/net/ethernet/broadcom/bcmsysport.c |
6524 | +++ b/drivers/net/ethernet/broadcom/bcmsysport.c |
6525 | @@ -134,6 +134,10 @@ static int bcm_sysport_set_rx_csum(struct net_device *dev, |
6526 | |
6527 | priv->rx_chk_en = !!(wanted & NETIF_F_RXCSUM); |
6528 | reg = rxchk_readl(priv, RXCHK_CONTROL); |
6529 | + /* Clear L2 header checks, which would prevent BPDUs |
6530 | + * from being received. |
6531 | + */ |
6532 | + reg &= ~RXCHK_L2_HDR_DIS; |
6533 | if (priv->rx_chk_en) |
6534 | reg |= RXCHK_EN; |
6535 | else |
6536 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
6537 | index 1fdaf86bbe8f..0bd93bb7d1a2 100644 |
6538 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
6539 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
6540 | @@ -3542,7 +3542,7 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len, |
6541 | if (len) |
6542 | break; |
6543 | /* on first few passes, just barely sleep */ |
6544 | - if (i < DFLT_HWRM_CMD_TIMEOUT) |
6545 | + if (i < HWRM_SHORT_TIMEOUT_COUNTER) |
6546 | usleep_range(HWRM_SHORT_MIN_TIMEOUT, |
6547 | HWRM_SHORT_MAX_TIMEOUT); |
6548 | else |
6549 | @@ -3565,7 +3565,7 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len, |
6550 | dma_rmb(); |
6551 | if (*valid) |
6552 | break; |
6553 | - udelay(1); |
6554 | + usleep_range(1, 5); |
6555 | } |
6556 | |
6557 | if (j >= HWRM_VALID_BIT_DELAY_USEC) { |
6558 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h |
6559 | index bde384630a75..cf2d4a6583d5 100644 |
6560 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h |
6561 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h |
6562 | @@ -548,7 +548,7 @@ struct rx_tpa_end_cmp_ext { |
6563 | (HWRM_SHORT_TIMEOUT_COUNTER * HWRM_SHORT_MIN_TIMEOUT + \ |
6564 | ((n) - HWRM_SHORT_TIMEOUT_COUNTER) * HWRM_MIN_TIMEOUT)) |
6565 | |
6566 | -#define HWRM_VALID_BIT_DELAY_USEC 20 |
6567 | +#define HWRM_VALID_BIT_DELAY_USEC 150 |
6568 | |
6569 | #define BNXT_RX_EVENT 1 |
6570 | #define BNXT_AGG_EVENT 2 |
6571 | diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c b/drivers/net/ethernet/cavium/thunder/nic_main.c |
6572 | index 6c8dcb65ff03..90497a27df18 100644 |
6573 | --- a/drivers/net/ethernet/cavium/thunder/nic_main.c |
6574 | +++ b/drivers/net/ethernet/cavium/thunder/nic_main.c |
6575 | @@ -1039,7 +1039,7 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf) |
6576 | case NIC_MBOX_MSG_CFG_DONE: |
6577 | /* Last message of VF config msg sequence */ |
6578 | nic_enable_vf(nic, vf, true); |
6579 | - goto unlock; |
6580 | + break; |
6581 | case NIC_MBOX_MSG_SHUTDOWN: |
6582 | /* First msg in VF teardown sequence */ |
6583 | if (vf >= nic->num_vf_en) |
6584 | diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c |
6585 | index 88f8a8fa93cd..9800738448ec 100644 |
6586 | --- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c |
6587 | +++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c |
6588 | @@ -172,6 +172,17 @@ static int nicvf_check_pf_ready(struct nicvf *nic) |
6589 | return 1; |
6590 | } |
6591 | |
6592 | +static void nicvf_send_cfg_done(struct nicvf *nic) |
6593 | +{ |
6594 | + union nic_mbx mbx = {}; |
6595 | + |
6596 | + mbx.msg.msg = NIC_MBOX_MSG_CFG_DONE; |
6597 | + if (nicvf_send_msg_to_pf(nic, &mbx)) { |
6598 | + netdev_err(nic->netdev, |
6599 | + "PF didn't respond to CFG DONE msg\n"); |
6600 | + } |
6601 | +} |
6602 | + |
6603 | static void nicvf_read_bgx_stats(struct nicvf *nic, struct bgx_stats_msg *bgx) |
6604 | { |
6605 | if (bgx->rx) |
6606 | @@ -1416,7 +1427,6 @@ int nicvf_open(struct net_device *netdev) |
6607 | struct nicvf *nic = netdev_priv(netdev); |
6608 | struct queue_set *qs = nic->qs; |
6609 | struct nicvf_cq_poll *cq_poll = NULL; |
6610 | - union nic_mbx mbx = {}; |
6611 | |
6612 | netif_carrier_off(netdev); |
6613 | |
6614 | @@ -1512,8 +1522,7 @@ int nicvf_open(struct net_device *netdev) |
6615 | nicvf_enable_intr(nic, NICVF_INTR_RBDR, qidx); |
6616 | |
6617 | /* Send VF config done msg to PF */ |
6618 | - mbx.msg.msg = NIC_MBOX_MSG_CFG_DONE; |
6619 | - nicvf_write_to_mbx(nic, &mbx); |
6620 | + nicvf_send_cfg_done(nic); |
6621 | |
6622 | return 0; |
6623 | cleanup: |
6624 | @@ -1941,7 +1950,8 @@ static void __nicvf_set_rx_mode_task(u8 mode, struct xcast_addr_list *mc_addrs, |
6625 | |
6626 | /* flush DMAC filters and reset RX mode */ |
6627 | mbx.xcast.msg = NIC_MBOX_MSG_RESET_XCAST; |
6628 | - nicvf_send_msg_to_pf(nic, &mbx); |
6629 | + if (nicvf_send_msg_to_pf(nic, &mbx) < 0) |
6630 | + goto free_mc; |
6631 | |
6632 | if (mode & BGX_XCAST_MCAST_FILTER) { |
6633 | /* once enabling filtering, we need to signal to PF to add |
6634 | @@ -1949,7 +1959,8 @@ static void __nicvf_set_rx_mode_task(u8 mode, struct xcast_addr_list *mc_addrs, |
6635 | */ |
6636 | mbx.xcast.msg = NIC_MBOX_MSG_ADD_MCAST; |
6637 | mbx.xcast.data.mac = 0; |
6638 | - nicvf_send_msg_to_pf(nic, &mbx); |
6639 | + if (nicvf_send_msg_to_pf(nic, &mbx) < 0) |
6640 | + goto free_mc; |
6641 | } |
6642 | |
6643 | /* check if we have any specific MACs to be added to PF DMAC filter */ |
6644 | @@ -1958,9 +1969,9 @@ static void __nicvf_set_rx_mode_task(u8 mode, struct xcast_addr_list *mc_addrs, |
6645 | for (idx = 0; idx < mc_addrs->count; idx++) { |
6646 | mbx.xcast.msg = NIC_MBOX_MSG_ADD_MCAST; |
6647 | mbx.xcast.data.mac = mc_addrs->mc[idx]; |
6648 | - nicvf_send_msg_to_pf(nic, &mbx); |
6649 | + if (nicvf_send_msg_to_pf(nic, &mbx) < 0) |
6650 | + goto free_mc; |
6651 | } |
6652 | - kfree(mc_addrs); |
6653 | } |
6654 | |
6655 | /* and finally set rx mode for PF accordingly */ |
6656 | @@ -1968,6 +1979,8 @@ static void __nicvf_set_rx_mode_task(u8 mode, struct xcast_addr_list *mc_addrs, |
6657 | mbx.xcast.data.mode = mode; |
6658 | |
6659 | nicvf_send_msg_to_pf(nic, &mbx); |
6660 | +free_mc: |
6661 | + kfree(mc_addrs); |
6662 | } |
6663 | |
6664 | static void nicvf_set_rx_mode_task(struct work_struct *work_arg) |
6665 | diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
6666 | index 3b9e74be5fbd..b8155f5e71b4 100644 |
6667 | --- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
6668 | +++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c |
6669 | @@ -3081,6 +3081,7 @@ int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool dereset) |
6670 | dsaf_dev = dev_get_drvdata(&pdev->dev); |
6671 | if (!dsaf_dev) { |
6672 | dev_err(&pdev->dev, "dsaf_dev is NULL\n"); |
6673 | + put_device(&pdev->dev); |
6674 | return -ENODEV; |
6675 | } |
6676 | |
6677 | @@ -3088,6 +3089,7 @@ int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool dereset) |
6678 | if (AE_IS_VER1(dsaf_dev->dsaf_ver)) { |
6679 | dev_err(dsaf_dev->dev, "%s v1 chip doesn't support RoCE!\n", |
6680 | dsaf_dev->ae_dev.name); |
6681 | + put_device(&pdev->dev); |
6682 | return -ENODEV; |
6683 | } |
6684 | |
6685 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
6686 | index 6cdd58d9d461..410d5d3aa393 100644 |
6687 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
6688 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |
6689 | @@ -3924,8 +3924,11 @@ static void ixgbe_setup_mrqc(struct ixgbe_adapter *adapter) |
6690 | else |
6691 | mrqc = IXGBE_MRQC_VMDQRSS64EN; |
6692 | |
6693 | - /* Enable L3/L4 for Tx Switched packets */ |
6694 | - mrqc |= IXGBE_MRQC_L3L4TXSWEN; |
6695 | + /* Enable L3/L4 for Tx Switched packets only for X550, |
6696 | + * older devices do not support this feature |
6697 | + */ |
6698 | + if (hw->mac.type >= ixgbe_mac_X550) |
6699 | + mrqc |= IXGBE_MRQC_L3L4TXSWEN; |
6700 | } else { |
6701 | if (tcs > 4) |
6702 | mrqc = IXGBE_MRQC_RTRSS8TCEN; |
6703 | diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c |
6704 | index 62f204f32316..59007d6cd36d 100644 |
6705 | --- a/drivers/net/ethernet/marvell/mv643xx_eth.c |
6706 | +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c |
6707 | @@ -2886,7 +2886,7 @@ static int mv643xx_eth_shared_probe(struct platform_device *pdev) |
6708 | |
6709 | ret = mv643xx_eth_shared_of_probe(pdev); |
6710 | if (ret) |
6711 | - return ret; |
6712 | + goto err_put_clk; |
6713 | pd = dev_get_platdata(&pdev->dev); |
6714 | |
6715 | msp->tx_csum_limit = (pd != NULL && pd->tx_csum_limit) ? |
6716 | @@ -2894,6 +2894,11 @@ static int mv643xx_eth_shared_probe(struct platform_device *pdev) |
6717 | infer_hw_params(msp); |
6718 | |
6719 | return 0; |
6720 | + |
6721 | +err_put_clk: |
6722 | + if (!IS_ERR(msp->clk)) |
6723 | + clk_disable_unprepare(msp->clk); |
6724 | + return ret; |
6725 | } |
6726 | |
6727 | static int mv643xx_eth_shared_remove(struct platform_device *pdev) |
6728 | diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c |
6729 | index a78a39244b79..2ba0d89aaf3c 100644 |
6730 | --- a/drivers/net/ethernet/marvell/mvneta.c |
6731 | +++ b/drivers/net/ethernet/marvell/mvneta.c |
6732 | @@ -2147,7 +2147,7 @@ err_drop_frame: |
6733 | if (unlikely(!skb)) |
6734 | goto err_drop_frame_ret_pool; |
6735 | |
6736 | - dma_sync_single_range_for_cpu(dev->dev.parent, |
6737 | + dma_sync_single_range_for_cpu(&pp->bm_priv->pdev->dev, |
6738 | rx_desc->buf_phys_addr, |
6739 | MVNETA_MH_SIZE + NET_SKB_PAD, |
6740 | rx_bytes, |
6741 | diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c |
6742 | index eff57f7d056a..4e18d95e548f 100644 |
6743 | --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c |
6744 | +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c |
6745 | @@ -1288,15 +1288,10 @@ wrp_alu64_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, |
6746 | |
6747 | static int |
6748 | wrp_alu32_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, |
6749 | - enum alu_op alu_op, bool skip) |
6750 | + enum alu_op alu_op) |
6751 | { |
6752 | const struct bpf_insn *insn = &meta->insn; |
6753 | |
6754 | - if (skip) { |
6755 | - meta->skip = true; |
6756 | - return 0; |
6757 | - } |
6758 | - |
6759 | wrp_alu_imm(nfp_prog, insn->dst_reg * 2, alu_op, insn->imm); |
6760 | wrp_immed(nfp_prog, reg_both(insn->dst_reg * 2 + 1), 0); |
6761 | |
6762 | @@ -2306,7 +2301,7 @@ static int xor_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6763 | |
6764 | static int xor_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6765 | { |
6766 | - return wrp_alu32_imm(nfp_prog, meta, ALU_OP_XOR, !~meta->insn.imm); |
6767 | + return wrp_alu32_imm(nfp_prog, meta, ALU_OP_XOR); |
6768 | } |
6769 | |
6770 | static int and_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6771 | @@ -2316,7 +2311,7 @@ static int and_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6772 | |
6773 | static int and_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6774 | { |
6775 | - return wrp_alu32_imm(nfp_prog, meta, ALU_OP_AND, !~meta->insn.imm); |
6776 | + return wrp_alu32_imm(nfp_prog, meta, ALU_OP_AND); |
6777 | } |
6778 | |
6779 | static int or_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6780 | @@ -2326,7 +2321,7 @@ static int or_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6781 | |
6782 | static int or_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6783 | { |
6784 | - return wrp_alu32_imm(nfp_prog, meta, ALU_OP_OR, !meta->insn.imm); |
6785 | + return wrp_alu32_imm(nfp_prog, meta, ALU_OP_OR); |
6786 | } |
6787 | |
6788 | static int add_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6789 | @@ -2336,7 +2331,7 @@ static int add_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6790 | |
6791 | static int add_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6792 | { |
6793 | - return wrp_alu32_imm(nfp_prog, meta, ALU_OP_ADD, !meta->insn.imm); |
6794 | + return wrp_alu32_imm(nfp_prog, meta, ALU_OP_ADD); |
6795 | } |
6796 | |
6797 | static int sub_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6798 | @@ -2346,7 +2341,7 @@ static int sub_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6799 | |
6800 | static int sub_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6801 | { |
6802 | - return wrp_alu32_imm(nfp_prog, meta, ALU_OP_SUB, !meta->insn.imm); |
6803 | + return wrp_alu32_imm(nfp_prog, meta, ALU_OP_SUB); |
6804 | } |
6805 | |
6806 | static int mul_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) |
6807 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c |
6808 | index e860bdf0f752..b7471e48db7b 100644 |
6809 | --- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c |
6810 | +++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c |
6811 | @@ -1689,6 +1689,15 @@ qed_iwarp_parse_rx_pkt(struct qed_hwfn *p_hwfn, |
6812 | |
6813 | eth_hlen = ETH_HLEN + (vlan_valid ? sizeof(u32) : 0); |
6814 | |
6815 | + if (!ether_addr_equal(ethh->h_dest, |
6816 | + p_hwfn->p_rdma_info->iwarp.mac_addr)) { |
6817 | + DP_VERBOSE(p_hwfn, |
6818 | + QED_MSG_RDMA, |
6819 | + "Got unexpected mac %pM instead of %pM\n", |
6820 | + ethh->h_dest, p_hwfn->p_rdma_info->iwarp.mac_addr); |
6821 | + return -EINVAL; |
6822 | + } |
6823 | + |
6824 | ether_addr_copy(remote_mac_addr, ethh->h_source); |
6825 | ether_addr_copy(local_mac_addr, ethh->h_dest); |
6826 | |
6827 | @@ -2606,7 +2615,7 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn, |
6828 | struct qed_iwarp_info *iwarp_info; |
6829 | struct qed_ll2_acquire_data data; |
6830 | struct qed_ll2_cbs cbs; |
6831 | - u32 mpa_buff_size; |
6832 | + u32 buff_size; |
6833 | u16 n_ooo_bufs; |
6834 | int rc = 0; |
6835 | int i; |
6836 | @@ -2633,7 +2642,7 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn, |
6837 | |
6838 | memset(&data, 0, sizeof(data)); |
6839 | data.input.conn_type = QED_LL2_TYPE_IWARP; |
6840 | - data.input.mtu = QED_IWARP_MAX_SYN_PKT_SIZE; |
6841 | + data.input.mtu = params->max_mtu; |
6842 | data.input.rx_num_desc = QED_IWARP_LL2_SYN_RX_SIZE; |
6843 | data.input.tx_num_desc = QED_IWARP_LL2_SYN_TX_SIZE; |
6844 | data.input.tx_max_bds_per_packet = 1; /* will never be fragmented */ |
6845 | @@ -2655,9 +2664,10 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn, |
6846 | goto err; |
6847 | } |
6848 | |
6849 | + buff_size = QED_IWARP_MAX_BUF_SIZE(params->max_mtu); |
6850 | rc = qed_iwarp_ll2_alloc_buffers(p_hwfn, |
6851 | QED_IWARP_LL2_SYN_RX_SIZE, |
6852 | - QED_IWARP_MAX_SYN_PKT_SIZE, |
6853 | + buff_size, |
6854 | iwarp_info->ll2_syn_handle); |
6855 | if (rc) |
6856 | goto err; |
6857 | @@ -2711,10 +2721,9 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn, |
6858 | if (rc) |
6859 | goto err; |
6860 | |
6861 | - mpa_buff_size = QED_IWARP_MAX_BUF_SIZE(params->max_mtu); |
6862 | rc = qed_iwarp_ll2_alloc_buffers(p_hwfn, |
6863 | data.input.rx_num_desc, |
6864 | - mpa_buff_size, |
6865 | + buff_size, |
6866 | iwarp_info->ll2_mpa_handle); |
6867 | if (rc) |
6868 | goto err; |
6869 | @@ -2727,7 +2736,7 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn, |
6870 | |
6871 | iwarp_info->max_num_partial_fpdus = (u16)p_hwfn->p_rdma_info->num_qps; |
6872 | |
6873 | - iwarp_info->mpa_intermediate_buf = kzalloc(mpa_buff_size, GFP_KERNEL); |
6874 | + iwarp_info->mpa_intermediate_buf = kzalloc(buff_size, GFP_KERNEL); |
6875 | if (!iwarp_info->mpa_intermediate_buf) |
6876 | goto err; |
6877 | |
6878 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.h b/drivers/net/ethernet/qlogic/qed/qed_iwarp.h |
6879 | index b8f612d00241..7ac959038324 100644 |
6880 | --- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.h |
6881 | +++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.h |
6882 | @@ -46,7 +46,6 @@ enum qed_iwarp_qp_state qed_roce2iwarp_state(enum qed_roce_qp_state state); |
6883 | |
6884 | #define QED_IWARP_LL2_SYN_TX_SIZE (128) |
6885 | #define QED_IWARP_LL2_SYN_RX_SIZE (256) |
6886 | -#define QED_IWARP_MAX_SYN_PKT_SIZE (128) |
6887 | |
6888 | #define QED_IWARP_LL2_OOO_DEF_TX_SIZE (256) |
6889 | #define QED_IWARP_MAX_OOO (16) |
6890 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
6891 | index 6e381354f658..74bebbdb4b15 100644 |
6892 | --- a/drivers/net/usb/qmi_wwan.c |
6893 | +++ b/drivers/net/usb/qmi_wwan.c |
6894 | @@ -1208,8 +1208,8 @@ static const struct usb_device_id products[] = { |
6895 | {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ |
6896 | {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ |
6897 | {QMI_FIXED_INTF(0x1199, 0x68a2, 19)}, /* Sierra Wireless MC7710 in QMI mode */ |
6898 | - {QMI_FIXED_INTF(0x1199, 0x68c0, 8)}, /* Sierra Wireless MC7304/MC7354 */ |
6899 | - {QMI_FIXED_INTF(0x1199, 0x68c0, 10)}, /* Sierra Wireless MC7304/MC7354 */ |
6900 | + {QMI_QUIRK_SET_DTR(0x1199, 0x68c0, 8)}, /* Sierra Wireless MC7304/MC7354, WP76xx */ |
6901 | + {QMI_QUIRK_SET_DTR(0x1199, 0x68c0, 10)},/* Sierra Wireless MC7304/MC7354 */ |
6902 | {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ |
6903 | {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ |
6904 | {QMI_FIXED_INTF(0x1199, 0x9041, 8)}, /* Sierra Wireless MC7305/MC7355 */ |
6905 | diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c |
6906 | index 4ca6592f5b3a..7cd428c0af43 100644 |
6907 | --- a/drivers/net/wireless/mac80211_hwsim.c |
6908 | +++ b/drivers/net/wireless/mac80211_hwsim.c |
6909 | @@ -3454,7 +3454,7 @@ static int hwsim_get_radio_nl(struct sk_buff *msg, struct genl_info *info) |
6910 | goto out_err; |
6911 | } |
6912 | |
6913 | - genlmsg_reply(skb, info); |
6914 | + res = genlmsg_reply(skb, info); |
6915 | break; |
6916 | } |
6917 | |
6918 | diff --git a/drivers/net/wireless/marvell/libertas_tf/if_usb.c b/drivers/net/wireless/marvell/libertas_tf/if_usb.c |
6919 | index 789337ea676a..6ede6168bd85 100644 |
6920 | --- a/drivers/net/wireless/marvell/libertas_tf/if_usb.c |
6921 | +++ b/drivers/net/wireless/marvell/libertas_tf/if_usb.c |
6922 | @@ -433,8 +433,6 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp, |
6923 | skb_tail_pointer(skb), |
6924 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp); |
6925 | |
6926 | - cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET; |
6927 | - |
6928 | lbtf_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n", |
6929 | cardp->rx_urb); |
6930 | ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC); |
6931 | diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c |
6932 | index 1d28cd656536..1eeb7be6aa34 100644 |
6933 | --- a/drivers/nvdimm/label.c |
6934 | +++ b/drivers/nvdimm/label.c |
6935 | @@ -625,7 +625,7 @@ static const guid_t *to_abstraction_guid(enum nvdimm_claim_class claim_class, |
6936 | |
6937 | static int __pmem_label_update(struct nd_region *nd_region, |
6938 | struct nd_mapping *nd_mapping, struct nd_namespace_pmem *nspm, |
6939 | - int pos) |
6940 | + int pos, unsigned long flags) |
6941 | { |
6942 | struct nd_namespace_common *ndns = &nspm->nsio.common; |
6943 | struct nd_interleave_set *nd_set = nd_region->nd_set; |
6944 | @@ -666,7 +666,7 @@ static int __pmem_label_update(struct nd_region *nd_region, |
6945 | memcpy(nd_label->uuid, nspm->uuid, NSLABEL_UUID_LEN); |
6946 | if (nspm->alt_name) |
6947 | memcpy(nd_label->name, nspm->alt_name, NSLABEL_NAME_LEN); |
6948 | - nd_label->flags = __cpu_to_le32(NSLABEL_FLAG_UPDATING); |
6949 | + nd_label->flags = __cpu_to_le32(flags); |
6950 | nd_label->nlabel = __cpu_to_le16(nd_region->ndr_mappings); |
6951 | nd_label->position = __cpu_to_le16(pos); |
6952 | nd_label->isetcookie = __cpu_to_le64(cookie); |
6953 | @@ -1120,13 +1120,13 @@ static int del_labels(struct nd_mapping *nd_mapping, u8 *uuid) |
6954 | int nd_pmem_namespace_label_update(struct nd_region *nd_region, |
6955 | struct nd_namespace_pmem *nspm, resource_size_t size) |
6956 | { |
6957 | - int i; |
6958 | + int i, rc; |
6959 | |
6960 | for (i = 0; i < nd_region->ndr_mappings; i++) { |
6961 | struct nd_mapping *nd_mapping = &nd_region->mapping[i]; |
6962 | struct nvdimm_drvdata *ndd = to_ndd(nd_mapping); |
6963 | struct resource *res; |
6964 | - int rc, count = 0; |
6965 | + int count = 0; |
6966 | |
6967 | if (size == 0) { |
6968 | rc = del_labels(nd_mapping, nspm->uuid); |
6969 | @@ -1144,7 +1144,20 @@ int nd_pmem_namespace_label_update(struct nd_region *nd_region, |
6970 | if (rc < 0) |
6971 | return rc; |
6972 | |
6973 | - rc = __pmem_label_update(nd_region, nd_mapping, nspm, i); |
6974 | + rc = __pmem_label_update(nd_region, nd_mapping, nspm, i, |
6975 | + NSLABEL_FLAG_UPDATING); |
6976 | + if (rc) |
6977 | + return rc; |
6978 | + } |
6979 | + |
6980 | + if (size == 0) |
6981 | + return 0; |
6982 | + |
6983 | + /* Clear the UPDATING flag per UEFI 2.7 expectations */ |
6984 | + for (i = 0; i < nd_region->ndr_mappings; i++) { |
6985 | + struct nd_mapping *nd_mapping = &nd_region->mapping[i]; |
6986 | + |
6987 | + rc = __pmem_label_update(nd_region, nd_mapping, nspm, i, 0); |
6988 | if (rc) |
6989 | return rc; |
6990 | } |
6991 | diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c |
6992 | index 4a4266250c28..54d79837f7c6 100644 |
6993 | --- a/drivers/nvdimm/namespace_devs.c |
6994 | +++ b/drivers/nvdimm/namespace_devs.c |
6995 | @@ -138,6 +138,7 @@ bool nd_is_uuid_unique(struct device *dev, u8 *uuid) |
6996 | bool pmem_should_map_pages(struct device *dev) |
6997 | { |
6998 | struct nd_region *nd_region = to_nd_region(dev->parent); |
6999 | + struct nd_namespace_common *ndns = to_ndns(dev); |
7000 | struct nd_namespace_io *nsio; |
7001 | |
7002 | if (!IS_ENABLED(CONFIG_ZONE_DEVICE)) |
7003 | @@ -149,6 +150,9 @@ bool pmem_should_map_pages(struct device *dev) |
7004 | if (is_nd_pfn(dev) || is_nd_btt(dev)) |
7005 | return false; |
7006 | |
7007 | + if (ndns->force_raw) |
7008 | + return false; |
7009 | + |
7010 | nsio = to_nd_namespace_io(dev); |
7011 | if (region_intersects(nsio->res.start, resource_size(&nsio->res), |
7012 | IORESOURCE_SYSTEM_RAM, |
7013 | diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c |
7014 | index 7fe84bfe0878..3ee995a3bfc9 100644 |
7015 | --- a/drivers/nvdimm/pfn_devs.c |
7016 | +++ b/drivers/nvdimm/pfn_devs.c |
7017 | @@ -534,7 +534,7 @@ static unsigned long init_altmap_base(resource_size_t base) |
7018 | |
7019 | static unsigned long init_altmap_reserve(resource_size_t base) |
7020 | { |
7021 | - unsigned long reserve = PHYS_PFN(SZ_8K); |
7022 | + unsigned long reserve = PFN_UP(SZ_8K); |
7023 | unsigned long base_pfn = PHYS_PFN(base); |
7024 | |
7025 | reserve += base_pfn - PFN_SECTION_ALIGN_DOWN(base_pfn); |
7026 | @@ -619,7 +619,7 @@ static void trim_pfn_device(struct nd_pfn *nd_pfn, u32 *start_pad, u32 *end_trun |
7027 | if (region_intersects(start, size, IORESOURCE_SYSTEM_RAM, |
7028 | IORES_DESC_NONE) == REGION_MIXED |
7029 | || !IS_ALIGNED(end, nd_pfn->align) |
7030 | - || nd_region_conflict(nd_region, start, size + adjust)) |
7031 | + || nd_region_conflict(nd_region, start, size)) |
7032 | *end_trunc = end - phys_pmem_align_down(nd_pfn, end); |
7033 | } |
7034 | |
7035 | diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c |
7036 | index 380916bff9e0..dee5b9e35ffd 100644 |
7037 | --- a/drivers/parport/parport_pc.c |
7038 | +++ b/drivers/parport/parport_pc.c |
7039 | @@ -1377,7 +1377,7 @@ static struct superio_struct *find_superio(struct parport *p) |
7040 | { |
7041 | int i; |
7042 | for (i = 0; i < NR_SUPERIOS; i++) |
7043 | - if (superios[i].io != p->base) |
7044 | + if (superios[i].io == p->base) |
7045 | return &superios[i]; |
7046 | return NULL; |
7047 | } |
7048 | diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c |
7049 | index 0fa9e8fdce66..b56e22262a77 100644 |
7050 | --- a/drivers/pci/controller/dwc/pcie-designware-host.c |
7051 | +++ b/drivers/pci/controller/dwc/pcie-designware-host.c |
7052 | @@ -439,7 +439,7 @@ int dw_pcie_host_init(struct pcie_port *pp) |
7053 | if (ret) |
7054 | pci->num_viewport = 2; |
7055 | |
7056 | - if (IS_ENABLED(CONFIG_PCI_MSI)) { |
7057 | + if (IS_ENABLED(CONFIG_PCI_MSI) && pci_msi_enabled()) { |
7058 | /* |
7059 | * If a specific SoC driver needs to change the |
7060 | * default number of vectors, it needs to implement |
7061 | diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c |
7062 | index f03279fc87cd..1908dd2978d3 100644 |
7063 | --- a/drivers/pci/pcie/dpc.c |
7064 | +++ b/drivers/pci/pcie/dpc.c |
7065 | @@ -153,6 +153,28 @@ static void dpc_process_rp_pio_error(struct dpc_dev *dpc) |
7066 | pci_write_config_dword(pdev, cap + PCI_EXP_DPC_RP_PIO_STATUS, status); |
7067 | } |
7068 | |
7069 | +static int dpc_get_aer_uncorrect_severity(struct pci_dev *dev, |
7070 | + struct aer_err_info *info) |
7071 | +{ |
7072 | + int pos = dev->aer_cap; |
7073 | + u32 status, mask, sev; |
7074 | + |
7075 | + pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, &status); |
7076 | + pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, &mask); |
7077 | + status &= ~mask; |
7078 | + if (!status) |
7079 | + return 0; |
7080 | + |
7081 | + pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, &sev); |
7082 | + status &= sev; |
7083 | + if (status) |
7084 | + info->severity = AER_FATAL; |
7085 | + else |
7086 | + info->severity = AER_NONFATAL; |
7087 | + |
7088 | + return 1; |
7089 | +} |
7090 | + |
7091 | static irqreturn_t dpc_handler(int irq, void *context) |
7092 | { |
7093 | struct aer_err_info info; |
7094 | @@ -180,9 +202,12 @@ static irqreturn_t dpc_handler(int irq, void *context) |
7095 | /* show RP PIO error detail information */ |
7096 | if (dpc->rp_extensions && reason == 3 && ext_reason == 0) |
7097 | dpc_process_rp_pio_error(dpc); |
7098 | - else if (reason == 0 && aer_get_device_error_info(pdev, &info)) { |
7099 | + else if (reason == 0 && |
7100 | + dpc_get_aer_uncorrect_severity(pdev, &info) && |
7101 | + aer_get_device_error_info(pdev, &info)) { |
7102 | aer_print_error(pdev, &info); |
7103 | pci_cleanup_aer_uncorrect_error_status(pdev); |
7104 | + pci_aer_clear_fatal_status(pdev); |
7105 | } |
7106 | |
7107 | /* We configure DPC so it only triggers on ERR_FATAL */ |
7108 | diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c |
7109 | index 201f9e5ff55c..4a4c16bfc0d3 100644 |
7110 | --- a/drivers/pci/probe.c |
7111 | +++ b/drivers/pci/probe.c |
7112 | @@ -2038,11 +2038,8 @@ static void pci_configure_ltr(struct pci_dev *dev) |
7113 | { |
7114 | #ifdef CONFIG_PCIEASPM |
7115 | struct pci_host_bridge *host = pci_find_host_bridge(dev->bus); |
7116 | - u32 cap; |
7117 | struct pci_dev *bridge; |
7118 | - |
7119 | - if (!host->native_ltr) |
7120 | - return; |
7121 | + u32 cap, ctl; |
7122 | |
7123 | if (!pci_is_pcie(dev)) |
7124 | return; |
7125 | @@ -2051,22 +2048,35 @@ static void pci_configure_ltr(struct pci_dev *dev) |
7126 | if (!(cap & PCI_EXP_DEVCAP2_LTR)) |
7127 | return; |
7128 | |
7129 | - /* |
7130 | - * Software must not enable LTR in an Endpoint unless the Root |
7131 | - * Complex and all intermediate Switches indicate support for LTR. |
7132 | - * PCIe r3.1, sec 6.18. |
7133 | - */ |
7134 | - if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) |
7135 | - dev->ltr_path = 1; |
7136 | - else { |
7137 | + pcie_capability_read_dword(dev, PCI_EXP_DEVCTL2, &ctl); |
7138 | + if (ctl & PCI_EXP_DEVCTL2_LTR_EN) { |
7139 | + if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) { |
7140 | + dev->ltr_path = 1; |
7141 | + return; |
7142 | + } |
7143 | + |
7144 | bridge = pci_upstream_bridge(dev); |
7145 | if (bridge && bridge->ltr_path) |
7146 | dev->ltr_path = 1; |
7147 | + |
7148 | + return; |
7149 | } |
7150 | |
7151 | - if (dev->ltr_path) |
7152 | + if (!host->native_ltr) |
7153 | + return; |
7154 | + |
7155 | + /* |
7156 | + * Software must not enable LTR in an Endpoint unless the Root |
7157 | + * Complex and all intermediate Switches indicate support for LTR. |
7158 | + * PCIe r4.0, sec 6.18. |
7159 | + */ |
7160 | + if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT || |
7161 | + ((bridge = pci_upstream_bridge(dev)) && |
7162 | + bridge->ltr_path)) { |
7163 | pcie_capability_set_word(dev, PCI_EXP_DEVCTL2, |
7164 | PCI_EXP_DEVCTL2_LTR_EN); |
7165 | + dev->ltr_path = 1; |
7166 | + } |
7167 | #endif |
7168 | } |
7169 | |
7170 | diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c |
7171 | index 91cffc051055..ead4beb5f55f 100644 |
7172 | --- a/drivers/pinctrl/meson/pinctrl-meson8b.c |
7173 | +++ b/drivers/pinctrl/meson/pinctrl-meson8b.c |
7174 | @@ -665,7 +665,7 @@ static const char * const sd_a_groups[] = { |
7175 | |
7176 | static const char * const sdxc_a_groups[] = { |
7177 | "sdxc_d0_0_a", "sdxc_d13_0_a", "sdxc_d47_a", "sdxc_clk_a", |
7178 | - "sdxc_cmd_a", "sdxc_d0_1_a", "sdxc_d0_13_1_a" |
7179 | + "sdxc_cmd_a", "sdxc_d0_1_a", "sdxc_d13_1_a" |
7180 | }; |
7181 | |
7182 | static const char * const pcm_a_groups[] = { |
7183 | diff --git a/drivers/power/supply/cpcap-charger.c b/drivers/power/supply/cpcap-charger.c |
7184 | index e4905bef2663..37be541e057d 100644 |
7185 | --- a/drivers/power/supply/cpcap-charger.c |
7186 | +++ b/drivers/power/supply/cpcap-charger.c |
7187 | @@ -458,6 +458,7 @@ static void cpcap_usb_detect(struct work_struct *work) |
7188 | goto out_err; |
7189 | } |
7190 | |
7191 | + power_supply_changed(ddata->usb); |
7192 | return; |
7193 | |
7194 | out_err: |
7195 | diff --git a/drivers/regulator/max77620-regulator.c b/drivers/regulator/max77620-regulator.c |
7196 | index b94e3a721721..cd93cf53e23c 100644 |
7197 | --- a/drivers/regulator/max77620-regulator.c |
7198 | +++ b/drivers/regulator/max77620-regulator.c |
7199 | @@ -1,7 +1,7 @@ |
7200 | /* |
7201 | * Maxim MAX77620 Regulator driver |
7202 | * |
7203 | - * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. |
7204 | + * Copyright (c) 2016-2018, NVIDIA CORPORATION. All rights reserved. |
7205 | * |
7206 | * Author: Mallikarjun Kasoju <mkasoju@nvidia.com> |
7207 | * Laxman Dewangan <ldewangan@nvidia.com> |
7208 | @@ -803,6 +803,14 @@ static int max77620_regulator_probe(struct platform_device *pdev) |
7209 | rdesc = &rinfo[id].desc; |
7210 | pmic->rinfo[id] = &max77620_regs_info[id]; |
7211 | pmic->enable_power_mode[id] = MAX77620_POWER_MODE_NORMAL; |
7212 | + pmic->reg_pdata[id].active_fps_src = -1; |
7213 | + pmic->reg_pdata[id].active_fps_pd_slot = -1; |
7214 | + pmic->reg_pdata[id].active_fps_pu_slot = -1; |
7215 | + pmic->reg_pdata[id].suspend_fps_src = -1; |
7216 | + pmic->reg_pdata[id].suspend_fps_pd_slot = -1; |
7217 | + pmic->reg_pdata[id].suspend_fps_pu_slot = -1; |
7218 | + pmic->reg_pdata[id].power_ok = -1; |
7219 | + pmic->reg_pdata[id].ramp_rate_setting = -1; |
7220 | |
7221 | ret = max77620_read_slew_rate(pmic, id); |
7222 | if (ret < 0) |
7223 | diff --git a/drivers/regulator/s2mpa01.c b/drivers/regulator/s2mpa01.c |
7224 | index 095d25f3d2ea..58a1fe583a6c 100644 |
7225 | --- a/drivers/regulator/s2mpa01.c |
7226 | +++ b/drivers/regulator/s2mpa01.c |
7227 | @@ -298,13 +298,13 @@ static const struct regulator_desc regulators[] = { |
7228 | regulator_desc_ldo(2, STEP_50_MV), |
7229 | regulator_desc_ldo(3, STEP_50_MV), |
7230 | regulator_desc_ldo(4, STEP_50_MV), |
7231 | - regulator_desc_ldo(5, STEP_50_MV), |
7232 | + regulator_desc_ldo(5, STEP_25_MV), |
7233 | regulator_desc_ldo(6, STEP_25_MV), |
7234 | regulator_desc_ldo(7, STEP_50_MV), |
7235 | regulator_desc_ldo(8, STEP_50_MV), |
7236 | regulator_desc_ldo(9, STEP_50_MV), |
7237 | regulator_desc_ldo(10, STEP_50_MV), |
7238 | - regulator_desc_ldo(11, STEP_25_MV), |
7239 | + regulator_desc_ldo(11, STEP_50_MV), |
7240 | regulator_desc_ldo(12, STEP_50_MV), |
7241 | regulator_desc_ldo(13, STEP_50_MV), |
7242 | regulator_desc_ldo(14, STEP_50_MV), |
7243 | @@ -315,11 +315,11 @@ static const struct regulator_desc regulators[] = { |
7244 | regulator_desc_ldo(19, STEP_50_MV), |
7245 | regulator_desc_ldo(20, STEP_50_MV), |
7246 | regulator_desc_ldo(21, STEP_50_MV), |
7247 | - regulator_desc_ldo(22, STEP_25_MV), |
7248 | - regulator_desc_ldo(23, STEP_25_MV), |
7249 | + regulator_desc_ldo(22, STEP_50_MV), |
7250 | + regulator_desc_ldo(23, STEP_50_MV), |
7251 | regulator_desc_ldo(24, STEP_50_MV), |
7252 | regulator_desc_ldo(25, STEP_50_MV), |
7253 | - regulator_desc_ldo(26, STEP_50_MV), |
7254 | + regulator_desc_ldo(26, STEP_25_MV), |
7255 | regulator_desc_buck1_4(1), |
7256 | regulator_desc_buck1_4(2), |
7257 | regulator_desc_buck1_4(3), |
7258 | diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c |
7259 | index 5bb6f4ca48db..c584bd1ffa9c 100644 |
7260 | --- a/drivers/regulator/s2mps11.c |
7261 | +++ b/drivers/regulator/s2mps11.c |
7262 | @@ -363,7 +363,7 @@ static const struct regulator_desc s2mps11_regulators[] = { |
7263 | regulator_desc_s2mps11_ldo(32, STEP_50_MV), |
7264 | regulator_desc_s2mps11_ldo(33, STEP_50_MV), |
7265 | regulator_desc_s2mps11_ldo(34, STEP_50_MV), |
7266 | - regulator_desc_s2mps11_ldo(35, STEP_50_MV), |
7267 | + regulator_desc_s2mps11_ldo(35, STEP_25_MV), |
7268 | regulator_desc_s2mps11_ldo(36, STEP_50_MV), |
7269 | regulator_desc_s2mps11_ldo(37, STEP_50_MV), |
7270 | regulator_desc_s2mps11_ldo(38, STEP_50_MV), |
7271 | @@ -373,8 +373,8 @@ static const struct regulator_desc s2mps11_regulators[] = { |
7272 | regulator_desc_s2mps11_buck1_4(4), |
7273 | regulator_desc_s2mps11_buck5, |
7274 | regulator_desc_s2mps11_buck67810(6, MIN_600_MV, STEP_6_25_MV), |
7275 | - regulator_desc_s2mps11_buck67810(7, MIN_600_MV, STEP_6_25_MV), |
7276 | - regulator_desc_s2mps11_buck67810(8, MIN_600_MV, STEP_6_25_MV), |
7277 | + regulator_desc_s2mps11_buck67810(7, MIN_600_MV, STEP_12_5_MV), |
7278 | + regulator_desc_s2mps11_buck67810(8, MIN_600_MV, STEP_12_5_MV), |
7279 | regulator_desc_s2mps11_buck9, |
7280 | regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV), |
7281 | }; |
7282 | diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c |
7283 | index 4e7b55a14b1a..6e294b4d3635 100644 |
7284 | --- a/drivers/s390/block/dasd_eckd.c |
7285 | +++ b/drivers/s390/block/dasd_eckd.c |
7286 | @@ -4469,6 +4469,14 @@ static int dasd_symm_io(struct dasd_device *device, void __user *argp) |
7287 | usrparm.psf_data &= 0x7fffffffULL; |
7288 | usrparm.rssd_result &= 0x7fffffffULL; |
7289 | } |
7290 | + /* at least 2 bytes are accessed and should be allocated */ |
7291 | + if (usrparm.psf_data_len < 2) { |
7292 | + DBF_DEV_EVENT(DBF_WARNING, device, |
7293 | + "Symmetrix ioctl invalid data length %d", |
7294 | + usrparm.psf_data_len); |
7295 | + rc = -EINVAL; |
7296 | + goto out; |
7297 | + } |
7298 | /* alloc I/O data area */ |
7299 | psf_data = kzalloc(usrparm.psf_data_len, GFP_KERNEL | GFP_DMA); |
7300 | rssd_result = kzalloc(usrparm.rssd_result_len, GFP_KERNEL | GFP_DMA); |
7301 | diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c |
7302 | index b67dc4974f23..ec54538f7ae1 100644 |
7303 | --- a/drivers/s390/virtio/virtio_ccw.c |
7304 | +++ b/drivers/s390/virtio/virtio_ccw.c |
7305 | @@ -272,6 +272,8 @@ static void virtio_ccw_drop_indicators(struct virtio_ccw_device *vcdev) |
7306 | { |
7307 | struct virtio_ccw_vq_info *info; |
7308 | |
7309 | + if (!vcdev->airq_info) |
7310 | + return; |
7311 | list_for_each_entry(info, &vcdev->virtqueues, node) |
7312 | drop_airq_indicator(info->vq, vcdev->airq_info); |
7313 | } |
7314 | @@ -413,7 +415,7 @@ static int virtio_ccw_read_vq_conf(struct virtio_ccw_device *vcdev, |
7315 | ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_READ_VQ_CONF); |
7316 | if (ret) |
7317 | return ret; |
7318 | - return vcdev->config_block->num; |
7319 | + return vcdev->config_block->num ?: -ENOENT; |
7320 | } |
7321 | |
7322 | static void virtio_ccw_del_vq(struct virtqueue *vq, struct ccw1 *ccw) |
7323 | diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c |
7324 | index 04443577d48b..1046947064a0 100644 |
7325 | --- a/drivers/scsi/aacraid/linit.c |
7326 | +++ b/drivers/scsi/aacraid/linit.c |
7327 | @@ -413,13 +413,16 @@ static int aac_slave_configure(struct scsi_device *sdev) |
7328 | if (chn < AAC_MAX_BUSES && tid < AAC_MAX_TARGETS && aac->sa_firmware) { |
7329 | devtype = aac->hba_map[chn][tid].devtype; |
7330 | |
7331 | - if (devtype == AAC_DEVTYPE_NATIVE_RAW) |
7332 | + if (devtype == AAC_DEVTYPE_NATIVE_RAW) { |
7333 | depth = aac->hba_map[chn][tid].qd_limit; |
7334 | - else if (devtype == AAC_DEVTYPE_ARC_RAW) |
7335 | + set_timeout = 1; |
7336 | + goto common_config; |
7337 | + } |
7338 | + if (devtype == AAC_DEVTYPE_ARC_RAW) { |
7339 | set_qd_dev_type = true; |
7340 | - |
7341 | - set_timeout = 1; |
7342 | - goto common_config; |
7343 | + set_timeout = 1; |
7344 | + goto common_config; |
7345 | + } |
7346 | } |
7347 | |
7348 | if (aac->jbod && (sdev->type == TYPE_DISK)) |
7349 | diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c |
7350 | index f78d2e5c1471..4ad61cfa69c0 100644 |
7351 | --- a/drivers/scsi/libiscsi.c |
7352 | +++ b/drivers/scsi/libiscsi.c |
7353 | @@ -1449,7 +1449,13 @@ static int iscsi_xmit_task(struct iscsi_conn *conn) |
7354 | if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) |
7355 | return -ENODATA; |
7356 | |
7357 | + spin_lock_bh(&conn->session->back_lock); |
7358 | + if (conn->task == NULL) { |
7359 | + spin_unlock_bh(&conn->session->back_lock); |
7360 | + return -ENODATA; |
7361 | + } |
7362 | __iscsi_get_task(task); |
7363 | + spin_unlock_bh(&conn->session->back_lock); |
7364 | spin_unlock_bh(&conn->session->frwd_lock); |
7365 | rc = conn->session->tt->xmit_task(task); |
7366 | spin_lock_bh(&conn->session->frwd_lock); |
7367 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c |
7368 | index 5352c9bbcaf7..f84f9bf15027 100644 |
7369 | --- a/drivers/scsi/qla2xxx/qla_init.c |
7370 | +++ b/drivers/scsi/qla2xxx/qla_init.c |
7371 | @@ -643,11 +643,14 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha, |
7372 | break; |
7373 | case DSC_LS_PORT_UNAVAIL: |
7374 | default: |
7375 | - if (fcport->loop_id != FC_NO_LOOP_ID) |
7376 | - qla2x00_clear_loop_id(fcport); |
7377 | - |
7378 | - fcport->loop_id = loop_id; |
7379 | - fcport->fw_login_state = DSC_LS_PORT_UNAVAIL; |
7380 | + if (fcport->loop_id == FC_NO_LOOP_ID) { |
7381 | + qla2x00_find_new_loop_id(vha, fcport); |
7382 | + fcport->fw_login_state = |
7383 | + DSC_LS_PORT_UNAVAIL; |
7384 | + } |
7385 | + ql_dbg(ql_dbg_disc, vha, 0x20e5, |
7386 | + "%s %d %8phC\n", __func__, __LINE__, |
7387 | + fcport->port_name); |
7388 | qla24xx_fcport_handle_login(vha, fcport); |
7389 | break; |
7390 | } |
7391 | @@ -1719,13 +1722,13 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun, |
7392 | |
7393 | /* Issue Marker IOCB */ |
7394 | qla2x00_marker(vha, vha->hw->req_q_map[0], |
7395 | - vha->hw->rsp_q_map[0], sp->fcport->loop_id, lun, |
7396 | + vha->hw->rsp_q_map[0], fcport->loop_id, lun, |
7397 | flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID); |
7398 | } |
7399 | |
7400 | done_free_sp: |
7401 | sp->free(sp); |
7402 | - sp->fcport->flags &= ~FCF_ASYNC_SENT; |
7403 | + fcport->flags &= ~FCF_ASYNC_SENT; |
7404 | done: |
7405 | return rval; |
7406 | } |
7407 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
7408 | index 58b78702c6c9..a3a5162fa60e 100644 |
7409 | --- a/drivers/scsi/sd.c |
7410 | +++ b/drivers/scsi/sd.c |
7411 | @@ -3066,6 +3066,55 @@ static void sd_read_security(struct scsi_disk *sdkp, unsigned char *buffer) |
7412 | sdkp->security = 1; |
7413 | } |
7414 | |
7415 | +/* |
7416 | + * Determine the device's preferred I/O size for reads and writes |
7417 | + * unless the reported value is unreasonably small, large, not a |
7418 | + * multiple of the physical block size, or simply garbage. |
7419 | + */ |
7420 | +static bool sd_validate_opt_xfer_size(struct scsi_disk *sdkp, |
7421 | + unsigned int dev_max) |
7422 | +{ |
7423 | + struct scsi_device *sdp = sdkp->device; |
7424 | + unsigned int opt_xfer_bytes = |
7425 | + logical_to_bytes(sdp, sdkp->opt_xfer_blocks); |
7426 | + |
7427 | + if (sdkp->opt_xfer_blocks > dev_max) { |
7428 | + sd_first_printk(KERN_WARNING, sdkp, |
7429 | + "Optimal transfer size %u logical blocks " \ |
7430 | + "> dev_max (%u logical blocks)\n", |
7431 | + sdkp->opt_xfer_blocks, dev_max); |
7432 | + return false; |
7433 | + } |
7434 | + |
7435 | + if (sdkp->opt_xfer_blocks > SD_DEF_XFER_BLOCKS) { |
7436 | + sd_first_printk(KERN_WARNING, sdkp, |
7437 | + "Optimal transfer size %u logical blocks " \ |
7438 | + "> sd driver limit (%u logical blocks)\n", |
7439 | + sdkp->opt_xfer_blocks, SD_DEF_XFER_BLOCKS); |
7440 | + return false; |
7441 | + } |
7442 | + |
7443 | + if (opt_xfer_bytes < PAGE_SIZE) { |
7444 | + sd_first_printk(KERN_WARNING, sdkp, |
7445 | + "Optimal transfer size %u bytes < " \ |
7446 | + "PAGE_SIZE (%u bytes)\n", |
7447 | + opt_xfer_bytes, (unsigned int)PAGE_SIZE); |
7448 | + return false; |
7449 | + } |
7450 | + |
7451 | + if (opt_xfer_bytes & (sdkp->physical_block_size - 1)) { |
7452 | + sd_first_printk(KERN_WARNING, sdkp, |
7453 | + "Optimal transfer size %u bytes not a " \ |
7454 | + "multiple of physical block size (%u bytes)\n", |
7455 | + opt_xfer_bytes, sdkp->physical_block_size); |
7456 | + return false; |
7457 | + } |
7458 | + |
7459 | + sd_first_printk(KERN_INFO, sdkp, "Optimal transfer size %u bytes\n", |
7460 | + opt_xfer_bytes); |
7461 | + return true; |
7462 | +} |
7463 | + |
7464 | /** |
7465 | * sd_revalidate_disk - called the first time a new disk is seen, |
7466 | * performs disk spin up, read_capacity, etc. |
7467 | @@ -3144,15 +3193,7 @@ static int sd_revalidate_disk(struct gendisk *disk) |
7468 | dev_max = min_not_zero(dev_max, sdkp->max_xfer_blocks); |
7469 | q->limits.max_dev_sectors = logical_to_sectors(sdp, dev_max); |
7470 | |
7471 | - /* |
7472 | - * Determine the device's preferred I/O size for reads and writes |
7473 | - * unless the reported value is unreasonably small, large, or |
7474 | - * garbage. |
7475 | - */ |
7476 | - if (sdkp->opt_xfer_blocks && |
7477 | - sdkp->opt_xfer_blocks <= dev_max && |
7478 | - sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS && |
7479 | - logical_to_bytes(sdp, sdkp->opt_xfer_blocks) >= PAGE_SIZE) { |
7480 | + if (sd_validate_opt_xfer_size(sdkp, dev_max)) { |
7481 | q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks); |
7482 | rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks); |
7483 | } else |
7484 | diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c |
7485 | index 1c72db94270e..3d331a864b2f 100644 |
7486 | --- a/drivers/scsi/virtio_scsi.c |
7487 | +++ b/drivers/scsi/virtio_scsi.c |
7488 | @@ -621,7 +621,6 @@ static int virtscsi_device_reset(struct scsi_cmnd *sc) |
7489 | return FAILED; |
7490 | |
7491 | memset(cmd, 0, sizeof(*cmd)); |
7492 | - cmd->sc = sc; |
7493 | cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){ |
7494 | .type = VIRTIO_SCSI_T_TMF, |
7495 | .subtype = cpu_to_virtio32(vscsi->vdev, |
7496 | @@ -680,7 +679,6 @@ static int virtscsi_abort(struct scsi_cmnd *sc) |
7497 | return FAILED; |
7498 | |
7499 | memset(cmd, 0, sizeof(*cmd)); |
7500 | - cmd->sc = sc; |
7501 | cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){ |
7502 | .type = VIRTIO_SCSI_T_TMF, |
7503 | .subtype = VIRTIO_SCSI_T_TMF_ABORT_TASK, |
7504 | diff --git a/drivers/soc/qcom/rpmh.c b/drivers/soc/qcom/rpmh.c |
7505 | index c7beb6841289..ab8f731a3426 100644 |
7506 | --- a/drivers/soc/qcom/rpmh.c |
7507 | +++ b/drivers/soc/qcom/rpmh.c |
7508 | @@ -80,6 +80,7 @@ void rpmh_tx_done(const struct tcs_request *msg, int r) |
7509 | struct rpmh_request *rpm_msg = container_of(msg, struct rpmh_request, |
7510 | msg); |
7511 | struct completion *compl = rpm_msg->completion; |
7512 | + bool free = rpm_msg->needs_free; |
7513 | |
7514 | rpm_msg->err = r; |
7515 | |
7516 | @@ -94,7 +95,7 @@ void rpmh_tx_done(const struct tcs_request *msg, int r) |
7517 | complete(compl); |
7518 | |
7519 | exit: |
7520 | - if (rpm_msg->needs_free) |
7521 | + if (free) |
7522 | kfree(rpm_msg); |
7523 | } |
7524 | |
7525 | @@ -348,11 +349,12 @@ int rpmh_write_batch(const struct device *dev, enum rpmh_state state, |
7526 | { |
7527 | struct batch_cache_req *req; |
7528 | struct rpmh_request *rpm_msgs; |
7529 | - DECLARE_COMPLETION_ONSTACK(compl); |
7530 | + struct completion *compls; |
7531 | struct rpmh_ctrlr *ctrlr = get_rpmh_ctrlr(dev); |
7532 | unsigned long time_left; |
7533 | int count = 0; |
7534 | - int ret, i, j; |
7535 | + int ret, i; |
7536 | + void *ptr; |
7537 | |
7538 | if (!cmd || !n) |
7539 | return -EINVAL; |
7540 | @@ -362,10 +364,15 @@ int rpmh_write_batch(const struct device *dev, enum rpmh_state state, |
7541 | if (!count) |
7542 | return -EINVAL; |
7543 | |
7544 | - req = kzalloc(sizeof(*req) + count * sizeof(req->rpm_msgs[0]), |
7545 | + ptr = kzalloc(sizeof(*req) + |
7546 | + count * (sizeof(req->rpm_msgs[0]) + sizeof(*compls)), |
7547 | GFP_ATOMIC); |
7548 | - if (!req) |
7549 | + if (!ptr) |
7550 | return -ENOMEM; |
7551 | + |
7552 | + req = ptr; |
7553 | + compls = ptr + sizeof(*req) + count * sizeof(*rpm_msgs); |
7554 | + |
7555 | req->count = count; |
7556 | rpm_msgs = req->rpm_msgs; |
7557 | |
7558 | @@ -380,25 +387,26 @@ int rpmh_write_batch(const struct device *dev, enum rpmh_state state, |
7559 | } |
7560 | |
7561 | for (i = 0; i < count; i++) { |
7562 | - rpm_msgs[i].completion = &compl; |
7563 | + struct completion *compl = &compls[i]; |
7564 | + |
7565 | + init_completion(compl); |
7566 | + rpm_msgs[i].completion = compl; |
7567 | ret = rpmh_rsc_send_data(ctrlr_to_drv(ctrlr), &rpm_msgs[i].msg); |
7568 | if (ret) { |
7569 | pr_err("Error(%d) sending RPMH message addr=%#x\n", |
7570 | ret, rpm_msgs[i].msg.cmds[0].addr); |
7571 | - for (j = i; j < count; j++) |
7572 | - rpmh_tx_done(&rpm_msgs[j].msg, ret); |
7573 | break; |
7574 | } |
7575 | } |
7576 | |
7577 | time_left = RPMH_TIMEOUT_MS; |
7578 | - for (i = 0; i < count; i++) { |
7579 | - time_left = wait_for_completion_timeout(&compl, time_left); |
7580 | + while (i--) { |
7581 | + time_left = wait_for_completion_timeout(&compls[i], time_left); |
7582 | if (!time_left) { |
7583 | /* |
7584 | * Better hope they never finish because they'll signal |
7585 | - * the completion on our stack and that's bad once |
7586 | - * we've returned from the function. |
7587 | + * the completion that we're going to free once |
7588 | + * we've returned from this function. |
7589 | */ |
7590 | WARN_ON(1); |
7591 | ret = -ETIMEDOUT; |
7592 | @@ -407,7 +415,7 @@ int rpmh_write_batch(const struct device *dev, enum rpmh_state state, |
7593 | } |
7594 | |
7595 | exit: |
7596 | - kfree(req); |
7597 | + kfree(ptr); |
7598 | |
7599 | return ret; |
7600 | } |
7601 | diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c |
7602 | index 14f4ea59caff..b624f6fb04ce 100644 |
7603 | --- a/drivers/spi/spi-pxa2xx.c |
7604 | +++ b/drivers/spi/spi-pxa2xx.c |
7605 | @@ -1612,6 +1612,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev) |
7606 | platform_info->enable_dma = false; |
7607 | } else { |
7608 | master->can_dma = pxa2xx_spi_can_dma; |
7609 | + master->max_dma_len = MAX_DMA_LEN; |
7610 | } |
7611 | } |
7612 | |
7613 | diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c |
7614 | index 5f19016bbf10..b9fb6493cd6b 100644 |
7615 | --- a/drivers/spi/spi-ti-qspi.c |
7616 | +++ b/drivers/spi/spi-ti-qspi.c |
7617 | @@ -490,8 +490,8 @@ static void ti_qspi_enable_memory_map(struct spi_device *spi) |
7618 | ti_qspi_write(qspi, MM_SWITCH, QSPI_SPI_SWITCH_REG); |
7619 | if (qspi->ctrl_base) { |
7620 | regmap_update_bits(qspi->ctrl_base, qspi->ctrl_reg, |
7621 | - MEM_CS_EN(spi->chip_select), |
7622 | - MEM_CS_MASK); |
7623 | + MEM_CS_MASK, |
7624 | + MEM_CS_EN(spi->chip_select)); |
7625 | } |
7626 | qspi->mmap_enabled = true; |
7627 | } |
7628 | @@ -503,7 +503,7 @@ static void ti_qspi_disable_memory_map(struct spi_device *spi) |
7629 | ti_qspi_write(qspi, 0, QSPI_SPI_SWITCH_REG); |
7630 | if (qspi->ctrl_base) |
7631 | regmap_update_bits(qspi->ctrl_base, qspi->ctrl_reg, |
7632 | - 0, MEM_CS_MASK); |
7633 | + MEM_CS_MASK, 0); |
7634 | qspi->mmap_enabled = false; |
7635 | } |
7636 | |
7637 | diff --git a/drivers/staging/media/imx/imx-ic-prpencvf.c b/drivers/staging/media/imx/imx-ic-prpencvf.c |
7638 | index 28f41caba05d..fb442499f806 100644 |
7639 | --- a/drivers/staging/media/imx/imx-ic-prpencvf.c |
7640 | +++ b/drivers/staging/media/imx/imx-ic-prpencvf.c |
7641 | @@ -680,12 +680,23 @@ static int prp_start(struct prp_priv *priv) |
7642 | goto out_free_nfb4eof_irq; |
7643 | } |
7644 | |
7645 | + /* start upstream */ |
7646 | + ret = v4l2_subdev_call(priv->src_sd, video, s_stream, 1); |
7647 | + ret = (ret && ret != -ENOIOCTLCMD) ? ret : 0; |
7648 | + if (ret) { |
7649 | + v4l2_err(&ic_priv->sd, |
7650 | + "upstream stream on failed: %d\n", ret); |
7651 | + goto out_free_eof_irq; |
7652 | + } |
7653 | + |
7654 | /* start the EOF timeout timer */ |
7655 | mod_timer(&priv->eof_timeout_timer, |
7656 | jiffies + msecs_to_jiffies(IMX_MEDIA_EOF_TIMEOUT)); |
7657 | |
7658 | return 0; |
7659 | |
7660 | +out_free_eof_irq: |
7661 | + devm_free_irq(ic_priv->dev, priv->eof_irq, priv); |
7662 | out_free_nfb4eof_irq: |
7663 | devm_free_irq(ic_priv->dev, priv->nfb4eof_irq, priv); |
7664 | out_unsetup: |
7665 | @@ -717,6 +728,12 @@ static void prp_stop(struct prp_priv *priv) |
7666 | if (ret == 0) |
7667 | v4l2_warn(&ic_priv->sd, "wait last EOF timeout\n"); |
7668 | |
7669 | + /* stop upstream */ |
7670 | + ret = v4l2_subdev_call(priv->src_sd, video, s_stream, 0); |
7671 | + if (ret && ret != -ENOIOCTLCMD) |
7672 | + v4l2_warn(&ic_priv->sd, |
7673 | + "upstream stream off failed: %d\n", ret); |
7674 | + |
7675 | devm_free_irq(ic_priv->dev, priv->eof_irq, priv); |
7676 | devm_free_irq(ic_priv->dev, priv->nfb4eof_irq, priv); |
7677 | |
7678 | @@ -1148,15 +1165,6 @@ static int prp_s_stream(struct v4l2_subdev *sd, int enable) |
7679 | if (ret) |
7680 | goto out; |
7681 | |
7682 | - /* start/stop upstream */ |
7683 | - ret = v4l2_subdev_call(priv->src_sd, video, s_stream, enable); |
7684 | - ret = (ret && ret != -ENOIOCTLCMD) ? ret : 0; |
7685 | - if (ret) { |
7686 | - if (enable) |
7687 | - prp_stop(priv); |
7688 | - goto out; |
7689 | - } |
7690 | - |
7691 | update_count: |
7692 | priv->stream_count += enable ? 1 : -1; |
7693 | if (priv->stream_count < 0) |
7694 | diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c |
7695 | index cd2c291e1e94..e22f1239a318 100644 |
7696 | --- a/drivers/staging/media/imx/imx-media-csi.c |
7697 | +++ b/drivers/staging/media/imx/imx-media-csi.c |
7698 | @@ -626,7 +626,7 @@ out_put_ipu: |
7699 | return ret; |
7700 | } |
7701 | |
7702 | -static void csi_idmac_stop(struct csi_priv *priv) |
7703 | +static void csi_idmac_wait_last_eof(struct csi_priv *priv) |
7704 | { |
7705 | unsigned long flags; |
7706 | int ret; |
7707 | @@ -643,7 +643,10 @@ static void csi_idmac_stop(struct csi_priv *priv) |
7708 | &priv->last_eof_comp, msecs_to_jiffies(IMX_MEDIA_EOF_TIMEOUT)); |
7709 | if (ret == 0) |
7710 | v4l2_warn(&priv->sd, "wait last EOF timeout\n"); |
7711 | +} |
7712 | |
7713 | +static void csi_idmac_stop(struct csi_priv *priv) |
7714 | +{ |
7715 | devm_free_irq(priv->dev, priv->eof_irq, priv); |
7716 | devm_free_irq(priv->dev, priv->nfb4eof_irq, priv); |
7717 | |
7718 | @@ -719,10 +722,16 @@ static int csi_start(struct csi_priv *priv) |
7719 | |
7720 | output_fi = &priv->frame_interval[priv->active_output_pad]; |
7721 | |
7722 | + /* start upstream */ |
7723 | + ret = v4l2_subdev_call(priv->src_sd, video, s_stream, 1); |
7724 | + ret = (ret && ret != -ENOIOCTLCMD) ? ret : 0; |
7725 | + if (ret) |
7726 | + return ret; |
7727 | + |
7728 | if (priv->dest == IPU_CSI_DEST_IDMAC) { |
7729 | ret = csi_idmac_start(priv); |
7730 | if (ret) |
7731 | - return ret; |
7732 | + goto stop_upstream; |
7733 | } |
7734 | |
7735 | ret = csi_setup(priv); |
7736 | @@ -750,11 +759,26 @@ fim_off: |
7737 | idmac_stop: |
7738 | if (priv->dest == IPU_CSI_DEST_IDMAC) |
7739 | csi_idmac_stop(priv); |
7740 | +stop_upstream: |
7741 | + v4l2_subdev_call(priv->src_sd, video, s_stream, 0); |
7742 | return ret; |
7743 | } |
7744 | |
7745 | static void csi_stop(struct csi_priv *priv) |
7746 | { |
7747 | + if (priv->dest == IPU_CSI_DEST_IDMAC) |
7748 | + csi_idmac_wait_last_eof(priv); |
7749 | + |
7750 | + /* |
7751 | + * Disable the CSI asap, after syncing with the last EOF. |
7752 | + * Doing so after the IDMA channel is disabled has shown to |
7753 | + * create hard system-wide hangs. |
7754 | + */ |
7755 | + ipu_csi_disable(priv->csi); |
7756 | + |
7757 | + /* stop upstream */ |
7758 | + v4l2_subdev_call(priv->src_sd, video, s_stream, 0); |
7759 | + |
7760 | if (priv->dest == IPU_CSI_DEST_IDMAC) { |
7761 | csi_idmac_stop(priv); |
7762 | |
7763 | @@ -762,8 +786,6 @@ static void csi_stop(struct csi_priv *priv) |
7764 | if (priv->fim) |
7765 | imx_media_fim_set_stream(priv->fim, NULL, false); |
7766 | } |
7767 | - |
7768 | - ipu_csi_disable(priv->csi); |
7769 | } |
7770 | |
7771 | static const struct csi_skip_desc csi_skip[12] = { |
7772 | @@ -924,23 +946,13 @@ static int csi_s_stream(struct v4l2_subdev *sd, int enable) |
7773 | goto update_count; |
7774 | |
7775 | if (enable) { |
7776 | - /* upstream must be started first, before starting CSI */ |
7777 | - ret = v4l2_subdev_call(priv->src_sd, video, s_stream, 1); |
7778 | - ret = (ret && ret != -ENOIOCTLCMD) ? ret : 0; |
7779 | - if (ret) |
7780 | - goto out; |
7781 | - |
7782 | dev_dbg(priv->dev, "stream ON\n"); |
7783 | ret = csi_start(priv); |
7784 | - if (ret) { |
7785 | - v4l2_subdev_call(priv->src_sd, video, s_stream, 0); |
7786 | + if (ret) |
7787 | goto out; |
7788 | - } |
7789 | } else { |
7790 | dev_dbg(priv->dev, "stream OFF\n"); |
7791 | - /* CSI must be stopped first, then stop upstream */ |
7792 | csi_stop(priv); |
7793 | - v4l2_subdev_call(priv->src_sd, video, s_stream, 0); |
7794 | } |
7795 | |
7796 | update_count: |
7797 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
7798 | index cc756a123fd8..03e9cb156df9 100644 |
7799 | --- a/drivers/target/iscsi/iscsi_target.c |
7800 | +++ b/drivers/target/iscsi/iscsi_target.c |
7801 | @@ -4045,9 +4045,9 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) |
7802 | struct se_cmd *se_cmd = &cmd->se_cmd; |
7803 | |
7804 | if (se_cmd->se_tfo != NULL) { |
7805 | - spin_lock(&se_cmd->t_state_lock); |
7806 | + spin_lock_irq(&se_cmd->t_state_lock); |
7807 | se_cmd->transport_state |= CMD_T_FABRIC_STOP; |
7808 | - spin_unlock(&se_cmd->t_state_lock); |
7809 | + spin_unlock_irq(&se_cmd->t_state_lock); |
7810 | } |
7811 | } |
7812 | spin_unlock_bh(&conn->cmd_lock); |
7813 | diff --git a/drivers/tty/serial/8250/8250_of.c b/drivers/tty/serial/8250/8250_of.c |
7814 | index 877fd7f8a8ed..98125de2f0a6 100644 |
7815 | --- a/drivers/tty/serial/8250/8250_of.c |
7816 | +++ b/drivers/tty/serial/8250/8250_of.c |
7817 | @@ -130,6 +130,10 @@ static int of_platform_serial_setup(struct platform_device *ofdev, |
7818 | port->flags |= UPF_IOREMAP; |
7819 | } |
7820 | |
7821 | + /* Compatibility with the deprecated pxa driver and 8250_pxa drivers. */ |
7822 | + if (of_device_is_compatible(np, "mrvl,mmp-uart")) |
7823 | + port->regshift = 2; |
7824 | + |
7825 | /* Check for registers offset within the devices address range */ |
7826 | if (of_property_read_u32(np, "reg-shift", &prop) == 0) |
7827 | port->regshift = prop; |
7828 | diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c |
7829 | index 48bd694a5fa1..bbe5cba21522 100644 |
7830 | --- a/drivers/tty/serial/8250/8250_pci.c |
7831 | +++ b/drivers/tty/serial/8250/8250_pci.c |
7832 | @@ -2027,6 +2027,111 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { |
7833 | .setup = pci_default_setup, |
7834 | .exit = pci_plx9050_exit, |
7835 | }, |
7836 | + { |
7837 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7838 | + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB, |
7839 | + .subvendor = PCI_ANY_ID, |
7840 | + .subdevice = PCI_ANY_ID, |
7841 | + .setup = pci_pericom_setup, |
7842 | + }, |
7843 | + { |
7844 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7845 | + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S, |
7846 | + .subvendor = PCI_ANY_ID, |
7847 | + .subdevice = PCI_ANY_ID, |
7848 | + .setup = pci_pericom_setup, |
7849 | + }, |
7850 | + { |
7851 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7852 | + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB, |
7853 | + .subvendor = PCI_ANY_ID, |
7854 | + .subdevice = PCI_ANY_ID, |
7855 | + .setup = pci_pericom_setup, |
7856 | + }, |
7857 | + { |
7858 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7859 | + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4, |
7860 | + .subvendor = PCI_ANY_ID, |
7861 | + .subdevice = PCI_ANY_ID, |
7862 | + .setup = pci_pericom_setup, |
7863 | + }, |
7864 | + { |
7865 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7866 | + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB, |
7867 | + .subvendor = PCI_ANY_ID, |
7868 | + .subdevice = PCI_ANY_ID, |
7869 | + .setup = pci_pericom_setup, |
7870 | + }, |
7871 | + { |
7872 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7873 | + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM, |
7874 | + .subvendor = PCI_ANY_ID, |
7875 | + .subdevice = PCI_ANY_ID, |
7876 | + .setup = pci_pericom_setup, |
7877 | + }, |
7878 | + { |
7879 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7880 | + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4, |
7881 | + .subvendor = PCI_ANY_ID, |
7882 | + .subdevice = PCI_ANY_ID, |
7883 | + .setup = pci_pericom_setup, |
7884 | + }, |
7885 | + { |
7886 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7887 | + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4, |
7888 | + .subvendor = PCI_ANY_ID, |
7889 | + .subdevice = PCI_ANY_ID, |
7890 | + .setup = pci_pericom_setup, |
7891 | + }, |
7892 | + { |
7893 | + .vendor = PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S, |
7894 | + .device = PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4, |
7895 | + .subvendor = PCI_ANY_ID, |
7896 | + .subdevice = PCI_ANY_ID, |
7897 | + .setup = pci_pericom_setup, |
7898 | + }, |
7899 | + { |
7900 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7901 | + .device = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4, |
7902 | + .subvendor = PCI_ANY_ID, |
7903 | + .subdevice = PCI_ANY_ID, |
7904 | + .setup = pci_pericom_setup, |
7905 | + }, |
7906 | + { |
7907 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7908 | + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4, |
7909 | + .subvendor = PCI_ANY_ID, |
7910 | + .subdevice = PCI_ANY_ID, |
7911 | + .setup = pci_pericom_setup, |
7912 | + }, |
7913 | + { |
7914 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7915 | + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4, |
7916 | + .subvendor = PCI_ANY_ID, |
7917 | + .subdevice = PCI_ANY_ID, |
7918 | + .setup = pci_pericom_setup, |
7919 | + }, |
7920 | + { |
7921 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7922 | + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4, |
7923 | + .subvendor = PCI_ANY_ID, |
7924 | + .subdevice = PCI_ANY_ID, |
7925 | + .setup = pci_pericom_setup, |
7926 | + }, |
7927 | + { |
7928 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7929 | + .device = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM, |
7930 | + .subvendor = PCI_ANY_ID, |
7931 | + .subdevice = PCI_ANY_ID, |
7932 | + .setup = pci_pericom_setup, |
7933 | + }, |
7934 | + { |
7935 | + .vendor = PCI_VENDOR_ID_ACCESIO, |
7936 | + .device = PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM, |
7937 | + .subvendor = PCI_ANY_ID, |
7938 | + .subdevice = PCI_ANY_ID, |
7939 | + .setup = pci_pericom_setup, |
7940 | + }, |
7941 | /* |
7942 | * SBS Technologies, Inc., PMC-OCTALPRO 232 |
7943 | */ |
7944 | @@ -4575,10 +4680,10 @@ static const struct pci_device_id serial_pci_tbl[] = { |
7945 | */ |
7946 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB, |
7947 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7948 | - pbn_pericom_PI7C9X7954 }, |
7949 | + pbn_pericom_PI7C9X7952 }, |
7950 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S, |
7951 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7952 | - pbn_pericom_PI7C9X7954 }, |
7953 | + pbn_pericom_PI7C9X7952 }, |
7954 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB, |
7955 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7956 | pbn_pericom_PI7C9X7954 }, |
7957 | @@ -4587,10 +4692,10 @@ static const struct pci_device_id serial_pci_tbl[] = { |
7958 | pbn_pericom_PI7C9X7954 }, |
7959 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB, |
7960 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7961 | - pbn_pericom_PI7C9X7954 }, |
7962 | + pbn_pericom_PI7C9X7952 }, |
7963 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2, |
7964 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7965 | - pbn_pericom_PI7C9X7954 }, |
7966 | + pbn_pericom_PI7C9X7952 }, |
7967 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB, |
7968 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7969 | pbn_pericom_PI7C9X7954 }, |
7970 | @@ -4599,10 +4704,10 @@ static const struct pci_device_id serial_pci_tbl[] = { |
7971 | pbn_pericom_PI7C9X7954 }, |
7972 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB, |
7973 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7974 | - pbn_pericom_PI7C9X7954 }, |
7975 | + pbn_pericom_PI7C9X7952 }, |
7976 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM, |
7977 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7978 | - pbn_pericom_PI7C9X7954 }, |
7979 | + pbn_pericom_PI7C9X7952 }, |
7980 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB, |
7981 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7982 | pbn_pericom_PI7C9X7954 }, |
7983 | @@ -4611,13 +4716,13 @@ static const struct pci_device_id serial_pci_tbl[] = { |
7984 | pbn_pericom_PI7C9X7954 }, |
7985 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1, |
7986 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7987 | - pbn_pericom_PI7C9X7954 }, |
7988 | + pbn_pericom_PI7C9X7951 }, |
7989 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2, |
7990 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7991 | - pbn_pericom_PI7C9X7954 }, |
7992 | + pbn_pericom_PI7C9X7952 }, |
7993 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2, |
7994 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7995 | - pbn_pericom_PI7C9X7954 }, |
7996 | + pbn_pericom_PI7C9X7952 }, |
7997 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4, |
7998 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
7999 | pbn_pericom_PI7C9X7954 }, |
8000 | @@ -4626,16 +4731,16 @@ static const struct pci_device_id serial_pci_tbl[] = { |
8001 | pbn_pericom_PI7C9X7954 }, |
8002 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S, |
8003 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8004 | - pbn_pericom_PI7C9X7954 }, |
8005 | + pbn_pericom_PI7C9X7952 }, |
8006 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S, |
8007 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8008 | pbn_pericom_PI7C9X7954 }, |
8009 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2, |
8010 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8011 | - pbn_pericom_PI7C9X7954 }, |
8012 | + pbn_pericom_PI7C9X7952 }, |
8013 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2, |
8014 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8015 | - pbn_pericom_PI7C9X7954 }, |
8016 | + pbn_pericom_PI7C9X7952 }, |
8017 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4, |
8018 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8019 | pbn_pericom_PI7C9X7954 }, |
8020 | @@ -4644,13 +4749,13 @@ static const struct pci_device_id serial_pci_tbl[] = { |
8021 | pbn_pericom_PI7C9X7954 }, |
8022 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM, |
8023 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8024 | - pbn_pericom_PI7C9X7954 }, |
8025 | + pbn_pericom_PI7C9X7952 }, |
8026 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4, |
8027 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8028 | - pbn_pericom_PI7C9X7958 }, |
8029 | + pbn_pericom_PI7C9X7954 }, |
8030 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4, |
8031 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8032 | - pbn_pericom_PI7C9X7958 }, |
8033 | + pbn_pericom_PI7C9X7954 }, |
8034 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8, |
8035 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8036 | pbn_pericom_PI7C9X7958 }, |
8037 | @@ -4659,19 +4764,19 @@ static const struct pci_device_id serial_pci_tbl[] = { |
8038 | pbn_pericom_PI7C9X7958 }, |
8039 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4, |
8040 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8041 | - pbn_pericom_PI7C9X7958 }, |
8042 | + pbn_pericom_PI7C9X7954 }, |
8043 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8, |
8044 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8045 | pbn_pericom_PI7C9X7958 }, |
8046 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM, |
8047 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8048 | - pbn_pericom_PI7C9X7958 }, |
8049 | + pbn_pericom_PI7C9X7954 }, |
8050 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM, |
8051 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8052 | pbn_pericom_PI7C9X7958 }, |
8053 | { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM, |
8054 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
8055 | - pbn_pericom_PI7C9X7958 }, |
8056 | + pbn_pericom_PI7C9X7954 }, |
8057 | /* |
8058 | * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke) |
8059 | */ |
8060 | diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c |
8061 | index 87d8dd90d605..0e3627289047 100644 |
8062 | --- a/drivers/tty/serial/xilinx_uartps.c |
8063 | +++ b/drivers/tty/serial/xilinx_uartps.c |
8064 | @@ -362,7 +362,13 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id) |
8065 | cdns_uart_handle_tx(dev_id); |
8066 | isrstatus &= ~CDNS_UART_IXR_TXEMPTY; |
8067 | } |
8068 | - if (isrstatus & CDNS_UART_IXR_RXMASK) |
8069 | + |
8070 | + /* |
8071 | + * Skip RX processing if RX is disabled as RXEMPTY will never be set |
8072 | + * as read bytes will not be removed from the FIFO. |
8073 | + */ |
8074 | + if (isrstatus & CDNS_UART_IXR_RXMASK && |
8075 | + !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS)) |
8076 | cdns_uart_handle_rx(dev_id, isrstatus); |
8077 | |
8078 | spin_unlock(&port->lock); |
8079 | diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c |
8080 | index da335899527b..b9a9a07f1ee9 100644 |
8081 | --- a/drivers/tty/vt/vt.c |
8082 | +++ b/drivers/tty/vt/vt.c |
8083 | @@ -935,8 +935,11 @@ static void flush_scrollback(struct vc_data *vc) |
8084 | { |
8085 | WARN_CONSOLE_UNLOCKED(); |
8086 | |
8087 | + set_origin(vc); |
8088 | if (vc->vc_sw->con_flush_scrollback) |
8089 | vc->vc_sw->con_flush_scrollback(vc); |
8090 | + else |
8091 | + vc->vc_sw->con_switch(vc); |
8092 | } |
8093 | |
8094 | /* |
8095 | @@ -1506,8 +1509,10 @@ static void csi_J(struct vc_data *vc, int vpar) |
8096 | count = ((vc->vc_pos - vc->vc_origin) >> 1) + 1; |
8097 | start = (unsigned short *)vc->vc_origin; |
8098 | break; |
8099 | + case 3: /* include scrollback */ |
8100 | + flush_scrollback(vc); |
8101 | + /* fallthrough */ |
8102 | case 2: /* erase whole display */ |
8103 | - case 3: /* (and scrollback buffer later) */ |
8104 | vc_uniscr_clear_lines(vc, 0, vc->vc_rows); |
8105 | count = vc->vc_cols * vc->vc_rows; |
8106 | start = (unsigned short *)vc->vc_origin; |
8107 | @@ -1516,13 +1521,7 @@ static void csi_J(struct vc_data *vc, int vpar) |
8108 | return; |
8109 | } |
8110 | scr_memsetw(start, vc->vc_video_erase_char, 2 * count); |
8111 | - if (vpar == 3) { |
8112 | - set_origin(vc); |
8113 | - flush_scrollback(vc); |
8114 | - if (con_is_visible(vc)) |
8115 | - update_screen(vc); |
8116 | - } else if (con_should_update(vc)) |
8117 | - do_update_region(vc, (unsigned long) start, count); |
8118 | + update_region(vc, (unsigned long) start, count); |
8119 | vc->vc_need_wrap = 0; |
8120 | } |
8121 | |
8122 | diff --git a/drivers/usb/chipidea/ci_hdrc_tegra.c b/drivers/usb/chipidea/ci_hdrc_tegra.c |
8123 | index 772851bee99b..12025358bb3c 100644 |
8124 | --- a/drivers/usb/chipidea/ci_hdrc_tegra.c |
8125 | +++ b/drivers/usb/chipidea/ci_hdrc_tegra.c |
8126 | @@ -130,6 +130,7 @@ static int tegra_udc_remove(struct platform_device *pdev) |
8127 | { |
8128 | struct tegra_udc *udc = platform_get_drvdata(pdev); |
8129 | |
8130 | + ci_hdrc_remove_device(udc->dev); |
8131 | usb_phy_set_suspend(udc->phy, 1); |
8132 | clk_disable_unprepare(udc->clk); |
8133 | |
8134 | diff --git a/drivers/usb/typec/tps6598x.c b/drivers/usb/typec/tps6598x.c |
8135 | index c84c8c189e90..eb8046f87a54 100644 |
8136 | --- a/drivers/usb/typec/tps6598x.c |
8137 | +++ b/drivers/usb/typec/tps6598x.c |
8138 | @@ -110,6 +110,20 @@ tps6598x_block_read(struct tps6598x *tps, u8 reg, void *val, size_t len) |
8139 | return 0; |
8140 | } |
8141 | |
8142 | +static int tps6598x_block_write(struct tps6598x *tps, u8 reg, |
8143 | + void *val, size_t len) |
8144 | +{ |
8145 | + u8 data[TPS_MAX_LEN + 1]; |
8146 | + |
8147 | + if (!tps->i2c_protocol) |
8148 | + return regmap_raw_write(tps->regmap, reg, val, len); |
8149 | + |
8150 | + data[0] = len; |
8151 | + memcpy(&data[1], val, len); |
8152 | + |
8153 | + return regmap_raw_write(tps->regmap, reg, data, sizeof(data)); |
8154 | +} |
8155 | + |
8156 | static inline int tps6598x_read16(struct tps6598x *tps, u8 reg, u16 *val) |
8157 | { |
8158 | return tps6598x_block_read(tps, reg, val, sizeof(u16)); |
8159 | @@ -127,23 +141,23 @@ static inline int tps6598x_read64(struct tps6598x *tps, u8 reg, u64 *val) |
8160 | |
8161 | static inline int tps6598x_write16(struct tps6598x *tps, u8 reg, u16 val) |
8162 | { |
8163 | - return regmap_raw_write(tps->regmap, reg, &val, sizeof(u16)); |
8164 | + return tps6598x_block_write(tps, reg, &val, sizeof(u16)); |
8165 | } |
8166 | |
8167 | static inline int tps6598x_write32(struct tps6598x *tps, u8 reg, u32 val) |
8168 | { |
8169 | - return regmap_raw_write(tps->regmap, reg, &val, sizeof(u32)); |
8170 | + return tps6598x_block_write(tps, reg, &val, sizeof(u32)); |
8171 | } |
8172 | |
8173 | static inline int tps6598x_write64(struct tps6598x *tps, u8 reg, u64 val) |
8174 | { |
8175 | - return regmap_raw_write(tps->regmap, reg, &val, sizeof(u64)); |
8176 | + return tps6598x_block_write(tps, reg, &val, sizeof(u64)); |
8177 | } |
8178 | |
8179 | static inline int |
8180 | tps6598x_write_4cc(struct tps6598x *tps, u8 reg, const char *val) |
8181 | { |
8182 | - return regmap_raw_write(tps->regmap, reg, &val, sizeof(u32)); |
8183 | + return tps6598x_block_write(tps, reg, &val, sizeof(u32)); |
8184 | } |
8185 | |
8186 | static int tps6598x_read_partner_identity(struct tps6598x *tps) |
8187 | @@ -229,8 +243,8 @@ static int tps6598x_exec_cmd(struct tps6598x *tps, const char *cmd, |
8188 | return -EBUSY; |
8189 | |
8190 | if (in_len) { |
8191 | - ret = regmap_raw_write(tps->regmap, TPS_REG_DATA1, |
8192 | - in_data, in_len); |
8193 | + ret = tps6598x_block_write(tps, TPS_REG_DATA1, |
8194 | + in_data, in_len); |
8195 | if (ret) |
8196 | return ret; |
8197 | } |
8198 | diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h |
8199 | index 5a0db6dec8d1..aaee1e6584e6 100644 |
8200 | --- a/fs/9p/v9fs_vfs.h |
8201 | +++ b/fs/9p/v9fs_vfs.h |
8202 | @@ -40,6 +40,9 @@ |
8203 | */ |
8204 | #define P9_LOCK_TIMEOUT (30*HZ) |
8205 | |
8206 | +/* flags for v9fs_stat2inode() & v9fs_stat2inode_dotl() */ |
8207 | +#define V9FS_STAT2INODE_KEEP_ISIZE 1 |
8208 | + |
8209 | extern struct file_system_type v9fs_fs_type; |
8210 | extern const struct address_space_operations v9fs_addr_operations; |
8211 | extern const struct file_operations v9fs_file_operations; |
8212 | @@ -61,8 +64,10 @@ int v9fs_init_inode(struct v9fs_session_info *v9ses, |
8213 | struct inode *inode, umode_t mode, dev_t); |
8214 | void v9fs_evict_inode(struct inode *inode); |
8215 | ino_t v9fs_qid2ino(struct p9_qid *qid); |
8216 | -void v9fs_stat2inode(struct p9_wstat *, struct inode *, struct super_block *); |
8217 | -void v9fs_stat2inode_dotl(struct p9_stat_dotl *, struct inode *); |
8218 | +void v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode, |
8219 | + struct super_block *sb, unsigned int flags); |
8220 | +void v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode, |
8221 | + unsigned int flags); |
8222 | int v9fs_dir_release(struct inode *inode, struct file *filp); |
8223 | int v9fs_file_open(struct inode *inode, struct file *file); |
8224 | void v9fs_inode2stat(struct inode *inode, struct p9_wstat *stat); |
8225 | @@ -83,4 +88,18 @@ static inline void v9fs_invalidate_inode_attr(struct inode *inode) |
8226 | } |
8227 | |
8228 | int v9fs_open_to_dotl_flags(int flags); |
8229 | + |
8230 | +static inline void v9fs_i_size_write(struct inode *inode, loff_t i_size) |
8231 | +{ |
8232 | + /* |
8233 | + * 32-bit need the lock, concurrent updates could break the |
8234 | + * sequences and make i_size_read() loop forever. |
8235 | + * 64-bit updates are atomic and can skip the locking. |
8236 | + */ |
8237 | + if (sizeof(i_size) > sizeof(long)) |
8238 | + spin_lock(&inode->i_lock); |
8239 | + i_size_write(inode, i_size); |
8240 | + if (sizeof(i_size) > sizeof(long)) |
8241 | + spin_unlock(&inode->i_lock); |
8242 | +} |
8243 | #endif |
8244 | diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c |
8245 | index ab3d5f5dbb00..c87e6d6ec069 100644 |
8246 | --- a/fs/9p/vfs_file.c |
8247 | +++ b/fs/9p/vfs_file.c |
8248 | @@ -442,7 +442,11 @@ v9fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) |
8249 | i_size = i_size_read(inode); |
8250 | if (iocb->ki_pos > i_size) { |
8251 | inode_add_bytes(inode, iocb->ki_pos - i_size); |
8252 | - i_size_write(inode, iocb->ki_pos); |
8253 | + /* |
8254 | + * Need to serialize against i_size_write() in |
8255 | + * v9fs_stat2inode() |
8256 | + */ |
8257 | + v9fs_i_size_write(inode, iocb->ki_pos); |
8258 | } |
8259 | return retval; |
8260 | } |
8261 | diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c |
8262 | index 85ff859d3af5..72b779bc0942 100644 |
8263 | --- a/fs/9p/vfs_inode.c |
8264 | +++ b/fs/9p/vfs_inode.c |
8265 | @@ -538,7 +538,7 @@ static struct inode *v9fs_qid_iget(struct super_block *sb, |
8266 | if (retval) |
8267 | goto error; |
8268 | |
8269 | - v9fs_stat2inode(st, inode, sb); |
8270 | + v9fs_stat2inode(st, inode, sb, 0); |
8271 | v9fs_cache_inode_get_cookie(inode); |
8272 | unlock_new_inode(inode); |
8273 | return inode; |
8274 | @@ -1092,7 +1092,7 @@ v9fs_vfs_getattr(const struct path *path, struct kstat *stat, |
8275 | if (IS_ERR(st)) |
8276 | return PTR_ERR(st); |
8277 | |
8278 | - v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb); |
8279 | + v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb, 0); |
8280 | generic_fillattr(d_inode(dentry), stat); |
8281 | |
8282 | p9stat_free(st); |
8283 | @@ -1170,12 +1170,13 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr) |
8284 | * @stat: Plan 9 metadata (mistat) structure |
8285 | * @inode: inode to populate |
8286 | * @sb: superblock of filesystem |
8287 | + * @flags: control flags (e.g. V9FS_STAT2INODE_KEEP_ISIZE) |
8288 | * |
8289 | */ |
8290 | |
8291 | void |
8292 | v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode, |
8293 | - struct super_block *sb) |
8294 | + struct super_block *sb, unsigned int flags) |
8295 | { |
8296 | umode_t mode; |
8297 | char ext[32]; |
8298 | @@ -1216,10 +1217,11 @@ v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode, |
8299 | mode = p9mode2perm(v9ses, stat); |
8300 | mode |= inode->i_mode & ~S_IALLUGO; |
8301 | inode->i_mode = mode; |
8302 | - i_size_write(inode, stat->length); |
8303 | |
8304 | + if (!(flags & V9FS_STAT2INODE_KEEP_ISIZE)) |
8305 | + v9fs_i_size_write(inode, stat->length); |
8306 | /* not real number of blocks, but 512 byte ones ... */ |
8307 | - inode->i_blocks = (i_size_read(inode) + 512 - 1) >> 9; |
8308 | + inode->i_blocks = (stat->length + 512 - 1) >> 9; |
8309 | v9inode->cache_validity &= ~V9FS_INO_INVALID_ATTR; |
8310 | } |
8311 | |
8312 | @@ -1416,9 +1418,9 @@ int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode) |
8313 | { |
8314 | int umode; |
8315 | dev_t rdev; |
8316 | - loff_t i_size; |
8317 | struct p9_wstat *st; |
8318 | struct v9fs_session_info *v9ses; |
8319 | + unsigned int flags; |
8320 | |
8321 | v9ses = v9fs_inode2v9ses(inode); |
8322 | st = p9_client_stat(fid); |
8323 | @@ -1431,16 +1433,13 @@ int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode) |
8324 | if ((inode->i_mode & S_IFMT) != (umode & S_IFMT)) |
8325 | goto out; |
8326 | |
8327 | - spin_lock(&inode->i_lock); |
8328 | /* |
8329 | * We don't want to refresh inode->i_size, |
8330 | * because we may have cached data |
8331 | */ |
8332 | - i_size = inode->i_size; |
8333 | - v9fs_stat2inode(st, inode, inode->i_sb); |
8334 | - if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) |
8335 | - inode->i_size = i_size; |
8336 | - spin_unlock(&inode->i_lock); |
8337 | + flags = (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) ? |
8338 | + V9FS_STAT2INODE_KEEP_ISIZE : 0; |
8339 | + v9fs_stat2inode(st, inode, inode->i_sb, flags); |
8340 | out: |
8341 | p9stat_free(st); |
8342 | kfree(st); |
8343 | diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c |
8344 | index 4823e1c46999..a950a927a626 100644 |
8345 | --- a/fs/9p/vfs_inode_dotl.c |
8346 | +++ b/fs/9p/vfs_inode_dotl.c |
8347 | @@ -143,7 +143,7 @@ static struct inode *v9fs_qid_iget_dotl(struct super_block *sb, |
8348 | if (retval) |
8349 | goto error; |
8350 | |
8351 | - v9fs_stat2inode_dotl(st, inode); |
8352 | + v9fs_stat2inode_dotl(st, inode, 0); |
8353 | v9fs_cache_inode_get_cookie(inode); |
8354 | retval = v9fs_get_acl(inode, fid); |
8355 | if (retval) |
8356 | @@ -496,7 +496,7 @@ v9fs_vfs_getattr_dotl(const struct path *path, struct kstat *stat, |
8357 | if (IS_ERR(st)) |
8358 | return PTR_ERR(st); |
8359 | |
8360 | - v9fs_stat2inode_dotl(st, d_inode(dentry)); |
8361 | + v9fs_stat2inode_dotl(st, d_inode(dentry), 0); |
8362 | generic_fillattr(d_inode(dentry), stat); |
8363 | /* Change block size to what the server returned */ |
8364 | stat->blksize = st->st_blksize; |
8365 | @@ -607,11 +607,13 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr) |
8366 | * v9fs_stat2inode_dotl - populate an inode structure with stat info |
8367 | * @stat: stat structure |
8368 | * @inode: inode to populate |
8369 | + * @flags: ctrl flags (e.g. V9FS_STAT2INODE_KEEP_ISIZE) |
8370 | * |
8371 | */ |
8372 | |
8373 | void |
8374 | -v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode) |
8375 | +v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode, |
8376 | + unsigned int flags) |
8377 | { |
8378 | umode_t mode; |
8379 | struct v9fs_inode *v9inode = V9FS_I(inode); |
8380 | @@ -631,7 +633,8 @@ v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode) |
8381 | mode |= inode->i_mode & ~S_IALLUGO; |
8382 | inode->i_mode = mode; |
8383 | |
8384 | - i_size_write(inode, stat->st_size); |
8385 | + if (!(flags & V9FS_STAT2INODE_KEEP_ISIZE)) |
8386 | + v9fs_i_size_write(inode, stat->st_size); |
8387 | inode->i_blocks = stat->st_blocks; |
8388 | } else { |
8389 | if (stat->st_result_mask & P9_STATS_ATIME) { |
8390 | @@ -661,8 +664,9 @@ v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode) |
8391 | } |
8392 | if (stat->st_result_mask & P9_STATS_RDEV) |
8393 | inode->i_rdev = new_decode_dev(stat->st_rdev); |
8394 | - if (stat->st_result_mask & P9_STATS_SIZE) |
8395 | - i_size_write(inode, stat->st_size); |
8396 | + if (!(flags & V9FS_STAT2INODE_KEEP_ISIZE) && |
8397 | + stat->st_result_mask & P9_STATS_SIZE) |
8398 | + v9fs_i_size_write(inode, stat->st_size); |
8399 | if (stat->st_result_mask & P9_STATS_BLOCKS) |
8400 | inode->i_blocks = stat->st_blocks; |
8401 | } |
8402 | @@ -928,9 +932,9 @@ v9fs_vfs_get_link_dotl(struct dentry *dentry, |
8403 | |
8404 | int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode) |
8405 | { |
8406 | - loff_t i_size; |
8407 | struct p9_stat_dotl *st; |
8408 | struct v9fs_session_info *v9ses; |
8409 | + unsigned int flags; |
8410 | |
8411 | v9ses = v9fs_inode2v9ses(inode); |
8412 | st = p9_client_getattr_dotl(fid, P9_STATS_ALL); |
8413 | @@ -942,16 +946,13 @@ int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode) |
8414 | if ((inode->i_mode & S_IFMT) != (st->st_mode & S_IFMT)) |
8415 | goto out; |
8416 | |
8417 | - spin_lock(&inode->i_lock); |
8418 | /* |
8419 | * We don't want to refresh inode->i_size, |
8420 | * because we may have cached data |
8421 | */ |
8422 | - i_size = inode->i_size; |
8423 | - v9fs_stat2inode_dotl(st, inode); |
8424 | - if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) |
8425 | - inode->i_size = i_size; |
8426 | - spin_unlock(&inode->i_lock); |
8427 | + flags = (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) ? |
8428 | + V9FS_STAT2INODE_KEEP_ISIZE : 0; |
8429 | + v9fs_stat2inode_dotl(st, inode, flags); |
8430 | out: |
8431 | kfree(st); |
8432 | return 0; |
8433 | diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c |
8434 | index 48ce50484e80..eeab9953af89 100644 |
8435 | --- a/fs/9p/vfs_super.c |
8436 | +++ b/fs/9p/vfs_super.c |
8437 | @@ -172,7 +172,7 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags, |
8438 | goto release_sb; |
8439 | } |
8440 | d_inode(root)->i_ino = v9fs_qid2ino(&st->qid); |
8441 | - v9fs_stat2inode_dotl(st, d_inode(root)); |
8442 | + v9fs_stat2inode_dotl(st, d_inode(root), 0); |
8443 | kfree(st); |
8444 | } else { |
8445 | struct p9_wstat *st = NULL; |
8446 | @@ -183,7 +183,7 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags, |
8447 | } |
8448 | |
8449 | d_inode(root)->i_ino = v9fs_qid2ino(&st->qid); |
8450 | - v9fs_stat2inode(st, d_inode(root), sb); |
8451 | + v9fs_stat2inode(st, d_inode(root), sb, 0); |
8452 | |
8453 | p9stat_free(st); |
8454 | kfree(st); |
8455 | diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c |
8456 | index 3b66c957ea6f..5810463dc6d2 100644 |
8457 | --- a/fs/btrfs/acl.c |
8458 | +++ b/fs/btrfs/acl.c |
8459 | @@ -9,6 +9,7 @@ |
8460 | #include <linux/posix_acl_xattr.h> |
8461 | #include <linux/posix_acl.h> |
8462 | #include <linux/sched.h> |
8463 | +#include <linux/sched/mm.h> |
8464 | #include <linux/slab.h> |
8465 | |
8466 | #include "ctree.h" |
8467 | @@ -72,8 +73,16 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans, |
8468 | } |
8469 | |
8470 | if (acl) { |
8471 | + unsigned int nofs_flag; |
8472 | + |
8473 | size = posix_acl_xattr_size(acl->a_count); |
8474 | + /* |
8475 | + * We're holding a transaction handle, so use a NOFS memory |
8476 | + * allocation context to avoid deadlock if reclaim happens. |
8477 | + */ |
8478 | + nofs_flag = memalloc_nofs_save(); |
8479 | value = kmalloc(size, GFP_KERNEL); |
8480 | + memalloc_nofs_restore(nofs_flag); |
8481 | if (!value) { |
8482 | ret = -ENOMEM; |
8483 | goto out; |
8484 | diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c |
8485 | index d96d1390068a..b4f61a3d560a 100644 |
8486 | --- a/fs/btrfs/disk-io.c |
8487 | +++ b/fs/btrfs/disk-io.c |
8488 | @@ -17,6 +17,7 @@ |
8489 | #include <linux/semaphore.h> |
8490 | #include <linux/error-injection.h> |
8491 | #include <linux/crc32c.h> |
8492 | +#include <linux/sched/mm.h> |
8493 | #include <asm/unaligned.h> |
8494 | #include "ctree.h" |
8495 | #include "disk-io.h" |
8496 | @@ -1236,10 +1237,17 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, |
8497 | struct btrfs_root *tree_root = fs_info->tree_root; |
8498 | struct btrfs_root *root; |
8499 | struct btrfs_key key; |
8500 | + unsigned int nofs_flag; |
8501 | int ret = 0; |
8502 | uuid_le uuid = NULL_UUID_LE; |
8503 | |
8504 | + /* |
8505 | + * We're holding a transaction handle, so use a NOFS memory allocation |
8506 | + * context to avoid deadlock if reclaim happens. |
8507 | + */ |
8508 | + nofs_flag = memalloc_nofs_save(); |
8509 | root = btrfs_alloc_root(fs_info, GFP_KERNEL); |
8510 | + memalloc_nofs_restore(nofs_flag); |
8511 | if (!root) |
8512 | return ERR_PTR(-ENOMEM); |
8513 | |
8514 | diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c |
8515 | index 79f82f2ec4d5..90b0a6eff535 100644 |
8516 | --- a/fs/btrfs/extent_io.c |
8517 | +++ b/fs/btrfs/extent_io.c |
8518 | @@ -3002,11 +3002,11 @@ static int __do_readpage(struct extent_io_tree *tree, |
8519 | */ |
8520 | if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags) && |
8521 | prev_em_start && *prev_em_start != (u64)-1 && |
8522 | - *prev_em_start != em->orig_start) |
8523 | + *prev_em_start != em->start) |
8524 | force_bio_submit = true; |
8525 | |
8526 | if (prev_em_start) |
8527 | - *prev_em_start = em->orig_start; |
8528 | + *prev_em_start = em->start; |
8529 | |
8530 | free_extent_map(em); |
8531 | em = NULL; |
8532 | diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c |
8533 | index 285f64f2de5f..c13f62182513 100644 |
8534 | --- a/fs/btrfs/volumes.c |
8535 | +++ b/fs/btrfs/volumes.c |
8536 | @@ -6425,10 +6425,10 @@ static int btrfs_check_chunk_valid(struct btrfs_fs_info *fs_info, |
8537 | } |
8538 | |
8539 | if ((type & BTRFS_BLOCK_GROUP_RAID10 && sub_stripes != 2) || |
8540 | - (type & BTRFS_BLOCK_GROUP_RAID1 && num_stripes < 1) || |
8541 | + (type & BTRFS_BLOCK_GROUP_RAID1 && num_stripes != 2) || |
8542 | (type & BTRFS_BLOCK_GROUP_RAID5 && num_stripes < 2) || |
8543 | (type & BTRFS_BLOCK_GROUP_RAID6 && num_stripes < 3) || |
8544 | - (type & BTRFS_BLOCK_GROUP_DUP && num_stripes > 2) || |
8545 | + (type & BTRFS_BLOCK_GROUP_DUP && num_stripes != 2) || |
8546 | ((type & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0 && |
8547 | num_stripes != 1)) { |
8548 | btrfs_err(fs_info, |
8549 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h |
8550 | index 9dcaed031843..80f33582059e 100644 |
8551 | --- a/fs/cifs/cifsglob.h |
8552 | +++ b/fs/cifs/cifsglob.h |
8553 | @@ -235,6 +235,8 @@ struct smb_version_operations { |
8554 | int * (*get_credits_field)(struct TCP_Server_Info *, const int); |
8555 | unsigned int (*get_credits)(struct mid_q_entry *); |
8556 | __u64 (*get_next_mid)(struct TCP_Server_Info *); |
8557 | + void (*revert_current_mid)(struct TCP_Server_Info *server, |
8558 | + const unsigned int val); |
8559 | /* data offset from read response message */ |
8560 | unsigned int (*read_data_offset)(char *); |
8561 | /* |
8562 | @@ -756,6 +758,22 @@ get_next_mid(struct TCP_Server_Info *server) |
8563 | return cpu_to_le16(mid); |
8564 | } |
8565 | |
8566 | +static inline void |
8567 | +revert_current_mid(struct TCP_Server_Info *server, const unsigned int val) |
8568 | +{ |
8569 | + if (server->ops->revert_current_mid) |
8570 | + server->ops->revert_current_mid(server, val); |
8571 | +} |
8572 | + |
8573 | +static inline void |
8574 | +revert_current_mid_from_hdr(struct TCP_Server_Info *server, |
8575 | + const struct smb2_sync_hdr *shdr) |
8576 | +{ |
8577 | + unsigned int num = le16_to_cpu(shdr->CreditCharge); |
8578 | + |
8579 | + return revert_current_mid(server, num > 0 ? num : 1); |
8580 | +} |
8581 | + |
8582 | static inline __u16 |
8583 | get_mid(const struct smb_hdr *smb) |
8584 | { |
8585 | @@ -1391,6 +1409,7 @@ struct mid_q_entry { |
8586 | struct kref refcount; |
8587 | struct TCP_Server_Info *server; /* server corresponding to this mid */ |
8588 | __u64 mid; /* multiplex id */ |
8589 | + __u16 credits; /* number of credits consumed by this mid */ |
8590 | __u32 pid; /* process id */ |
8591 | __u32 sequence_number; /* for CIFS signing */ |
8592 | unsigned long when_alloc; /* when mid was created */ |
8593 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c |
8594 | index 23db881daab5..08761a6a039d 100644 |
8595 | --- a/fs/cifs/file.c |
8596 | +++ b/fs/cifs/file.c |
8597 | @@ -2871,14 +2871,16 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from) |
8598 | * these pages but not on the region from pos to ppos+len-1. |
8599 | */ |
8600 | written = cifs_user_writev(iocb, from); |
8601 | - if (written > 0 && CIFS_CACHE_READ(cinode)) { |
8602 | + if (CIFS_CACHE_READ(cinode)) { |
8603 | /* |
8604 | - * Windows 7 server can delay breaking level2 oplock if a write |
8605 | - * request comes - break it on the client to prevent reading |
8606 | - * an old data. |
8607 | + * We have read level caching and we have just sent a write |
8608 | + * request to the server thus making data in the cache stale. |
8609 | + * Zap the cache and set oplock/lease level to NONE to avoid |
8610 | + * reading stale data from the cache. All subsequent read |
8611 | + * operations will read new data from the server. |
8612 | */ |
8613 | cifs_zap_mapping(inode); |
8614 | - cifs_dbg(FYI, "Set no oplock for inode=%p after a write operation\n", |
8615 | + cifs_dbg(FYI, "Set Oplock/Lease to NONE for inode=%p after write\n", |
8616 | inode); |
8617 | cinode->oplock = 0; |
8618 | } |
8619 | diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c |
8620 | index 7b8b58fb4d3f..58700d2ba8cd 100644 |
8621 | --- a/fs/cifs/smb2misc.c |
8622 | +++ b/fs/cifs/smb2misc.c |
8623 | @@ -517,7 +517,6 @@ smb2_tcon_has_lease(struct cifs_tcon *tcon, struct smb2_lease_break *rsp, |
8624 | __u8 lease_state; |
8625 | struct list_head *tmp; |
8626 | struct cifsFileInfo *cfile; |
8627 | - struct TCP_Server_Info *server = tcon->ses->server; |
8628 | struct cifs_pending_open *open; |
8629 | struct cifsInodeInfo *cinode; |
8630 | int ack_req = le32_to_cpu(rsp->Flags & |
8631 | @@ -537,13 +536,25 @@ smb2_tcon_has_lease(struct cifs_tcon *tcon, struct smb2_lease_break *rsp, |
8632 | cifs_dbg(FYI, "lease key match, lease break 0x%x\n", |
8633 | le32_to_cpu(rsp->NewLeaseState)); |
8634 | |
8635 | - server->ops->set_oplock_level(cinode, lease_state, 0, NULL); |
8636 | - |
8637 | if (ack_req) |
8638 | cfile->oplock_break_cancelled = false; |
8639 | else |
8640 | cfile->oplock_break_cancelled = true; |
8641 | |
8642 | + set_bit(CIFS_INODE_PENDING_OPLOCK_BREAK, &cinode->flags); |
8643 | + |
8644 | + /* |
8645 | + * Set or clear flags depending on the lease state being READ. |
8646 | + * HANDLE caching flag should be added when the client starts |
8647 | + * to defer closing remote file handles with HANDLE leases. |
8648 | + */ |
8649 | + if (lease_state & SMB2_LEASE_READ_CACHING_HE) |
8650 | + set_bit(CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2, |
8651 | + &cinode->flags); |
8652 | + else |
8653 | + clear_bit(CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2, |
8654 | + &cinode->flags); |
8655 | + |
8656 | queue_work(cifsoplockd_wq, &cfile->oplock_break); |
8657 | kfree(lw); |
8658 | return true; |
8659 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c |
8660 | index 237d7281ada3..d4d7d61a6fe2 100644 |
8661 | --- a/fs/cifs/smb2ops.c |
8662 | +++ b/fs/cifs/smb2ops.c |
8663 | @@ -204,6 +204,15 @@ smb2_get_next_mid(struct TCP_Server_Info *server) |
8664 | return mid; |
8665 | } |
8666 | |
8667 | +static void |
8668 | +smb2_revert_current_mid(struct TCP_Server_Info *server, const unsigned int val) |
8669 | +{ |
8670 | + spin_lock(&GlobalMid_Lock); |
8671 | + if (server->CurrentMid >= val) |
8672 | + server->CurrentMid -= val; |
8673 | + spin_unlock(&GlobalMid_Lock); |
8674 | +} |
8675 | + |
8676 | static struct mid_q_entry * |
8677 | smb2_find_mid(struct TCP_Server_Info *server, char *buf) |
8678 | { |
8679 | @@ -2300,6 +2309,15 @@ smb2_downgrade_oplock(struct TCP_Server_Info *server, |
8680 | server->ops->set_oplock_level(cinode, 0, 0, NULL); |
8681 | } |
8682 | |
8683 | +static void |
8684 | +smb21_downgrade_oplock(struct TCP_Server_Info *server, |
8685 | + struct cifsInodeInfo *cinode, bool set_level2) |
8686 | +{ |
8687 | + server->ops->set_oplock_level(cinode, |
8688 | + set_level2 ? SMB2_LEASE_READ_CACHING_HE : |
8689 | + 0, 0, NULL); |
8690 | +} |
8691 | + |
8692 | static void |
8693 | smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock, |
8694 | unsigned int epoch, bool *purge_cache) |
8695 | @@ -3247,6 +3265,7 @@ struct smb_version_operations smb20_operations = { |
8696 | .get_credits = smb2_get_credits, |
8697 | .wait_mtu_credits = cifs_wait_mtu_credits, |
8698 | .get_next_mid = smb2_get_next_mid, |
8699 | + .revert_current_mid = smb2_revert_current_mid, |
8700 | .read_data_offset = smb2_read_data_offset, |
8701 | .read_data_length = smb2_read_data_length, |
8702 | .map_error = map_smb2_to_linux_error, |
8703 | @@ -3341,6 +3360,7 @@ struct smb_version_operations smb21_operations = { |
8704 | .get_credits = smb2_get_credits, |
8705 | .wait_mtu_credits = smb2_wait_mtu_credits, |
8706 | .get_next_mid = smb2_get_next_mid, |
8707 | + .revert_current_mid = smb2_revert_current_mid, |
8708 | .read_data_offset = smb2_read_data_offset, |
8709 | .read_data_length = smb2_read_data_length, |
8710 | .map_error = map_smb2_to_linux_error, |
8711 | @@ -3351,7 +3371,7 @@ struct smb_version_operations smb21_operations = { |
8712 | .print_stats = smb2_print_stats, |
8713 | .is_oplock_break = smb2_is_valid_oplock_break, |
8714 | .handle_cancelled_mid = smb2_handle_cancelled_mid, |
8715 | - .downgrade_oplock = smb2_downgrade_oplock, |
8716 | + .downgrade_oplock = smb21_downgrade_oplock, |
8717 | .need_neg = smb2_need_neg, |
8718 | .negotiate = smb2_negotiate, |
8719 | .negotiate_wsize = smb2_negotiate_wsize, |
8720 | @@ -3436,6 +3456,7 @@ struct smb_version_operations smb30_operations = { |
8721 | .get_credits = smb2_get_credits, |
8722 | .wait_mtu_credits = smb2_wait_mtu_credits, |
8723 | .get_next_mid = smb2_get_next_mid, |
8724 | + .revert_current_mid = smb2_revert_current_mid, |
8725 | .read_data_offset = smb2_read_data_offset, |
8726 | .read_data_length = smb2_read_data_length, |
8727 | .map_error = map_smb2_to_linux_error, |
8728 | @@ -3447,7 +3468,7 @@ struct smb_version_operations smb30_operations = { |
8729 | .dump_share_caps = smb2_dump_share_caps, |
8730 | .is_oplock_break = smb2_is_valid_oplock_break, |
8731 | .handle_cancelled_mid = smb2_handle_cancelled_mid, |
8732 | - .downgrade_oplock = smb2_downgrade_oplock, |
8733 | + .downgrade_oplock = smb21_downgrade_oplock, |
8734 | .need_neg = smb2_need_neg, |
8735 | .negotiate = smb2_negotiate, |
8736 | .negotiate_wsize = smb2_negotiate_wsize, |
8737 | @@ -3540,6 +3561,7 @@ struct smb_version_operations smb311_operations = { |
8738 | .get_credits = smb2_get_credits, |
8739 | .wait_mtu_credits = smb2_wait_mtu_credits, |
8740 | .get_next_mid = smb2_get_next_mid, |
8741 | + .revert_current_mid = smb2_revert_current_mid, |
8742 | .read_data_offset = smb2_read_data_offset, |
8743 | .read_data_length = smb2_read_data_length, |
8744 | .map_error = map_smb2_to_linux_error, |
8745 | @@ -3551,7 +3573,7 @@ struct smb_version_operations smb311_operations = { |
8746 | .dump_share_caps = smb2_dump_share_caps, |
8747 | .is_oplock_break = smb2_is_valid_oplock_break, |
8748 | .handle_cancelled_mid = smb2_handle_cancelled_mid, |
8749 | - .downgrade_oplock = smb2_downgrade_oplock, |
8750 | + .downgrade_oplock = smb21_downgrade_oplock, |
8751 | .need_neg = smb2_need_neg, |
8752 | .negotiate = smb2_negotiate, |
8753 | .negotiate_wsize = smb2_negotiate_wsize, |
8754 | diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c |
8755 | index 7b351c65ee46..63264db78b89 100644 |
8756 | --- a/fs/cifs/smb2transport.c |
8757 | +++ b/fs/cifs/smb2transport.c |
8758 | @@ -576,6 +576,7 @@ smb2_mid_entry_alloc(const struct smb2_sync_hdr *shdr, |
8759 | struct TCP_Server_Info *server) |
8760 | { |
8761 | struct mid_q_entry *temp; |
8762 | + unsigned int credits = le16_to_cpu(shdr->CreditCharge); |
8763 | |
8764 | if (server == NULL) { |
8765 | cifs_dbg(VFS, "Null TCP session in smb2_mid_entry_alloc\n"); |
8766 | @@ -586,6 +587,7 @@ smb2_mid_entry_alloc(const struct smb2_sync_hdr *shdr, |
8767 | memset(temp, 0, sizeof(struct mid_q_entry)); |
8768 | kref_init(&temp->refcount); |
8769 | temp->mid = le64_to_cpu(shdr->MessageId); |
8770 | + temp->credits = credits > 0 ? credits : 1; |
8771 | temp->pid = current->pid; |
8772 | temp->command = shdr->Command; /* Always LE */ |
8773 | temp->when_alloc = jiffies; |
8774 | @@ -674,13 +676,18 @@ smb2_setup_request(struct cifs_ses *ses, struct smb_rqst *rqst) |
8775 | smb2_seq_num_into_buf(ses->server, shdr); |
8776 | |
8777 | rc = smb2_get_mid_entry(ses, shdr, &mid); |
8778 | - if (rc) |
8779 | + if (rc) { |
8780 | + revert_current_mid_from_hdr(ses->server, shdr); |
8781 | return ERR_PTR(rc); |
8782 | + } |
8783 | + |
8784 | rc = smb2_sign_rqst(rqst, ses->server); |
8785 | if (rc) { |
8786 | + revert_current_mid_from_hdr(ses->server, shdr); |
8787 | cifs_delete_mid(mid); |
8788 | return ERR_PTR(rc); |
8789 | } |
8790 | + |
8791 | return mid; |
8792 | } |
8793 | |
8794 | @@ -695,11 +702,14 @@ smb2_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst) |
8795 | smb2_seq_num_into_buf(server, shdr); |
8796 | |
8797 | mid = smb2_mid_entry_alloc(shdr, server); |
8798 | - if (mid == NULL) |
8799 | + if (mid == NULL) { |
8800 | + revert_current_mid_from_hdr(server, shdr); |
8801 | return ERR_PTR(-ENOMEM); |
8802 | + } |
8803 | |
8804 | rc = smb2_sign_rqst(rqst, server); |
8805 | if (rc) { |
8806 | + revert_current_mid_from_hdr(server, shdr); |
8807 | DeleteMidQEntry(mid); |
8808 | return ERR_PTR(rc); |
8809 | } |
8810 | diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c |
8811 | index 66348b3d28e6..f2938bd95c40 100644 |
8812 | --- a/fs/cifs/transport.c |
8813 | +++ b/fs/cifs/transport.c |
8814 | @@ -638,6 +638,7 @@ cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst, |
8815 | cifs_in_send_dec(server); |
8816 | |
8817 | if (rc < 0) { |
8818 | + revert_current_mid(server, mid->credits); |
8819 | server->sequence_number -= 2; |
8820 | cifs_delete_mid(mid); |
8821 | } |
8822 | @@ -842,6 +843,7 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, |
8823 | for (i = 0; i < num_rqst; i++) { |
8824 | midQ[i] = ses->server->ops->setup_request(ses, &rqst[i]); |
8825 | if (IS_ERR(midQ[i])) { |
8826 | + revert_current_mid(ses->server, i); |
8827 | for (j = 0; j < i; j++) |
8828 | cifs_delete_mid(midQ[j]); |
8829 | mutex_unlock(&ses->server->srv_mutex); |
8830 | @@ -867,8 +869,10 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, |
8831 | for (i = 0; i < num_rqst; i++) |
8832 | cifs_save_when_sent(midQ[i]); |
8833 | |
8834 | - if (rc < 0) |
8835 | + if (rc < 0) { |
8836 | + revert_current_mid(ses->server, num_rqst); |
8837 | ses->server->sequence_number -= 2; |
8838 | + } |
8839 | |
8840 | mutex_unlock(&ses->server->srv_mutex); |
8841 | |
8842 | diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c |
8843 | index c53814539070..553a3f3300ae 100644 |
8844 | --- a/fs/devpts/inode.c |
8845 | +++ b/fs/devpts/inode.c |
8846 | @@ -455,6 +455,7 @@ devpts_fill_super(struct super_block *s, void *data, int silent) |
8847 | s->s_blocksize_bits = 10; |
8848 | s->s_magic = DEVPTS_SUPER_MAGIC; |
8849 | s->s_op = &devpts_sops; |
8850 | + s->s_d_op = &simple_dentry_operations; |
8851 | s->s_time_gran = 1; |
8852 | |
8853 | error = -ENOMEM; |
8854 | diff --git a/fs/ext2/super.c b/fs/ext2/super.c |
8855 | index 0c38e31ec938..364e647d87c0 100644 |
8856 | --- a/fs/ext2/super.c |
8857 | +++ b/fs/ext2/super.c |
8858 | @@ -761,7 +761,8 @@ static loff_t ext2_max_size(int bits) |
8859 | { |
8860 | loff_t res = EXT2_NDIR_BLOCKS; |
8861 | int meta_blocks; |
8862 | - loff_t upper_limit; |
8863 | + unsigned int upper_limit; |
8864 | + unsigned int ppb = 1 << (bits-2); |
8865 | |
8866 | /* This is calculated to be the largest file size for a |
8867 | * dense, file such that the total number of |
8868 | @@ -775,24 +776,34 @@ static loff_t ext2_max_size(int bits) |
8869 | /* total blocks in file system block size */ |
8870 | upper_limit >>= (bits - 9); |
8871 | |
8872 | + /* Compute how many blocks we can address by block tree */ |
8873 | + res += 1LL << (bits-2); |
8874 | + res += 1LL << (2*(bits-2)); |
8875 | + res += 1LL << (3*(bits-2)); |
8876 | + /* Does block tree limit file size? */ |
8877 | + if (res < upper_limit) |
8878 | + goto check_lfs; |
8879 | |
8880 | + res = upper_limit; |
8881 | + /* How many metadata blocks are needed for addressing upper_limit? */ |
8882 | + upper_limit -= EXT2_NDIR_BLOCKS; |
8883 | /* indirect blocks */ |
8884 | meta_blocks = 1; |
8885 | + upper_limit -= ppb; |
8886 | /* double indirect blocks */ |
8887 | - meta_blocks += 1 + (1LL << (bits-2)); |
8888 | - /* tripple indirect blocks */ |
8889 | - meta_blocks += 1 + (1LL << (bits-2)) + (1LL << (2*(bits-2))); |
8890 | - |
8891 | - upper_limit -= meta_blocks; |
8892 | - upper_limit <<= bits; |
8893 | - |
8894 | - res += 1LL << (bits-2); |
8895 | - res += 1LL << (2*(bits-2)); |
8896 | - res += 1LL << (3*(bits-2)); |
8897 | + if (upper_limit < ppb * ppb) { |
8898 | + meta_blocks += 1 + DIV_ROUND_UP(upper_limit, ppb); |
8899 | + res -= meta_blocks; |
8900 | + goto check_lfs; |
8901 | + } |
8902 | + meta_blocks += 1 + ppb; |
8903 | + upper_limit -= ppb * ppb; |
8904 | + /* tripple indirect blocks for the rest */ |
8905 | + meta_blocks += 1 + DIV_ROUND_UP(upper_limit, ppb) + |
8906 | + DIV_ROUND_UP(upper_limit, ppb*ppb); |
8907 | + res -= meta_blocks; |
8908 | +check_lfs: |
8909 | res <<= bits; |
8910 | - if (res > upper_limit) |
8911 | - res = upper_limit; |
8912 | - |
8913 | if (res > MAX_LFS_FILESIZE) |
8914 | res = MAX_LFS_FILESIZE; |
8915 | |
8916 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h |
8917 | index 032cf9b92665..2ddf7833350d 100644 |
8918 | --- a/fs/ext4/ext4.h |
8919 | +++ b/fs/ext4/ext4.h |
8920 | @@ -435,6 +435,9 @@ struct flex_groups { |
8921 | /* Flags that are appropriate for non-directories/regular files. */ |
8922 | #define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL) |
8923 | |
8924 | +/* The only flags that should be swapped */ |
8925 | +#define EXT4_FL_SHOULD_SWAP (EXT4_HUGE_FILE_FL | EXT4_EXTENTS_FL) |
8926 | + |
8927 | /* Mask out flags that are inappropriate for the given type of inode. */ |
8928 | static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags) |
8929 | { |
8930 | diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c |
8931 | index d37dafa1d133..2e76fb55d94a 100644 |
8932 | --- a/fs/ext4/ioctl.c |
8933 | +++ b/fs/ext4/ioctl.c |
8934 | @@ -63,18 +63,20 @@ static void swap_inode_data(struct inode *inode1, struct inode *inode2) |
8935 | loff_t isize; |
8936 | struct ext4_inode_info *ei1; |
8937 | struct ext4_inode_info *ei2; |
8938 | + unsigned long tmp; |
8939 | |
8940 | ei1 = EXT4_I(inode1); |
8941 | ei2 = EXT4_I(inode2); |
8942 | |
8943 | swap(inode1->i_version, inode2->i_version); |
8944 | - swap(inode1->i_blocks, inode2->i_blocks); |
8945 | - swap(inode1->i_bytes, inode2->i_bytes); |
8946 | swap(inode1->i_atime, inode2->i_atime); |
8947 | swap(inode1->i_mtime, inode2->i_mtime); |
8948 | |
8949 | memswap(ei1->i_data, ei2->i_data, sizeof(ei1->i_data)); |
8950 | - swap(ei1->i_flags, ei2->i_flags); |
8951 | + tmp = ei1->i_flags & EXT4_FL_SHOULD_SWAP; |
8952 | + ei1->i_flags = (ei2->i_flags & EXT4_FL_SHOULD_SWAP) | |
8953 | + (ei1->i_flags & ~EXT4_FL_SHOULD_SWAP); |
8954 | + ei2->i_flags = tmp | (ei2->i_flags & ~EXT4_FL_SHOULD_SWAP); |
8955 | swap(ei1->i_disksize, ei2->i_disksize); |
8956 | ext4_es_remove_extent(inode1, 0, EXT_MAX_BLOCKS); |
8957 | ext4_es_remove_extent(inode2, 0, EXT_MAX_BLOCKS); |
8958 | @@ -115,28 +117,41 @@ static long swap_inode_boot_loader(struct super_block *sb, |
8959 | int err; |
8960 | struct inode *inode_bl; |
8961 | struct ext4_inode_info *ei_bl; |
8962 | - |
8963 | - if (inode->i_nlink != 1 || !S_ISREG(inode->i_mode) || |
8964 | - IS_SWAPFILE(inode) || IS_ENCRYPTED(inode) || |
8965 | - ext4_has_inline_data(inode)) |
8966 | - return -EINVAL; |
8967 | - |
8968 | - if (IS_RDONLY(inode) || IS_APPEND(inode) || IS_IMMUTABLE(inode) || |
8969 | - !inode_owner_or_capable(inode) || !capable(CAP_SYS_ADMIN)) |
8970 | - return -EPERM; |
8971 | + qsize_t size, size_bl, diff; |
8972 | + blkcnt_t blocks; |
8973 | + unsigned short bytes; |
8974 | |
8975 | inode_bl = ext4_iget(sb, EXT4_BOOT_LOADER_INO, EXT4_IGET_SPECIAL); |
8976 | if (IS_ERR(inode_bl)) |
8977 | return PTR_ERR(inode_bl); |
8978 | ei_bl = EXT4_I(inode_bl); |
8979 | |
8980 | - filemap_flush(inode->i_mapping); |
8981 | - filemap_flush(inode_bl->i_mapping); |
8982 | - |
8983 | /* Protect orig inodes against a truncate and make sure, |
8984 | * that only 1 swap_inode_boot_loader is running. */ |
8985 | lock_two_nondirectories(inode, inode_bl); |
8986 | |
8987 | + if (inode->i_nlink != 1 || !S_ISREG(inode->i_mode) || |
8988 | + IS_SWAPFILE(inode) || IS_ENCRYPTED(inode) || |
8989 | + ext4_has_inline_data(inode)) { |
8990 | + err = -EINVAL; |
8991 | + goto journal_err_out; |
8992 | + } |
8993 | + |
8994 | + if (IS_RDONLY(inode) || IS_APPEND(inode) || IS_IMMUTABLE(inode) || |
8995 | + !inode_owner_or_capable(inode) || !capable(CAP_SYS_ADMIN)) { |
8996 | + err = -EPERM; |
8997 | + goto journal_err_out; |
8998 | + } |
8999 | + |
9000 | + down_write(&EXT4_I(inode)->i_mmap_sem); |
9001 | + err = filemap_write_and_wait(inode->i_mapping); |
9002 | + if (err) |
9003 | + goto err_out; |
9004 | + |
9005 | + err = filemap_write_and_wait(inode_bl->i_mapping); |
9006 | + if (err) |
9007 | + goto err_out; |
9008 | + |
9009 | /* Wait for all existing dio workers */ |
9010 | inode_dio_wait(inode); |
9011 | inode_dio_wait(inode_bl); |
9012 | @@ -147,7 +162,7 @@ static long swap_inode_boot_loader(struct super_block *sb, |
9013 | handle = ext4_journal_start(inode_bl, EXT4_HT_MOVE_EXTENTS, 2); |
9014 | if (IS_ERR(handle)) { |
9015 | err = -EINVAL; |
9016 | - goto journal_err_out; |
9017 | + goto err_out; |
9018 | } |
9019 | |
9020 | /* Protect extent tree against block allocations via delalloc */ |
9021 | @@ -170,6 +185,13 @@ static long swap_inode_boot_loader(struct super_block *sb, |
9022 | memset(ei_bl->i_data, 0, sizeof(ei_bl->i_data)); |
9023 | } |
9024 | |
9025 | + err = dquot_initialize(inode); |
9026 | + if (err) |
9027 | + goto err_out1; |
9028 | + |
9029 | + size = (qsize_t)(inode->i_blocks) * (1 << 9) + inode->i_bytes; |
9030 | + size_bl = (qsize_t)(inode_bl->i_blocks) * (1 << 9) + inode_bl->i_bytes; |
9031 | + diff = size - size_bl; |
9032 | swap_inode_data(inode, inode_bl); |
9033 | |
9034 | inode->i_ctime = inode_bl->i_ctime = current_time(inode); |
9035 | @@ -183,27 +205,51 @@ static long swap_inode_boot_loader(struct super_block *sb, |
9036 | |
9037 | err = ext4_mark_inode_dirty(handle, inode); |
9038 | if (err < 0) { |
9039 | + /* No need to update quota information. */ |
9040 | ext4_warning(inode->i_sb, |
9041 | "couldn't mark inode #%lu dirty (err %d)", |
9042 | inode->i_ino, err); |
9043 | /* Revert all changes: */ |
9044 | swap_inode_data(inode, inode_bl); |
9045 | ext4_mark_inode_dirty(handle, inode); |
9046 | - } else { |
9047 | - err = ext4_mark_inode_dirty(handle, inode_bl); |
9048 | - if (err < 0) { |
9049 | - ext4_warning(inode_bl->i_sb, |
9050 | - "couldn't mark inode #%lu dirty (err %d)", |
9051 | - inode_bl->i_ino, err); |
9052 | - /* Revert all changes: */ |
9053 | - swap_inode_data(inode, inode_bl); |
9054 | - ext4_mark_inode_dirty(handle, inode); |
9055 | - ext4_mark_inode_dirty(handle, inode_bl); |
9056 | - } |
9057 | + goto err_out1; |
9058 | + } |
9059 | + |
9060 | + blocks = inode_bl->i_blocks; |
9061 | + bytes = inode_bl->i_bytes; |
9062 | + inode_bl->i_blocks = inode->i_blocks; |
9063 | + inode_bl->i_bytes = inode->i_bytes; |
9064 | + err = ext4_mark_inode_dirty(handle, inode_bl); |
9065 | + if (err < 0) { |
9066 | + /* No need to update quota information. */ |
9067 | + ext4_warning(inode_bl->i_sb, |
9068 | + "couldn't mark inode #%lu dirty (err %d)", |
9069 | + inode_bl->i_ino, err); |
9070 | + goto revert; |
9071 | + } |
9072 | + |
9073 | + /* Bootloader inode should not be counted into quota information. */ |
9074 | + if (diff > 0) |
9075 | + dquot_free_space(inode, diff); |
9076 | + else |
9077 | + err = dquot_alloc_space(inode, -1 * diff); |
9078 | + |
9079 | + if (err < 0) { |
9080 | +revert: |
9081 | + /* Revert all changes: */ |
9082 | + inode_bl->i_blocks = blocks; |
9083 | + inode_bl->i_bytes = bytes; |
9084 | + swap_inode_data(inode, inode_bl); |
9085 | + ext4_mark_inode_dirty(handle, inode); |
9086 | + ext4_mark_inode_dirty(handle, inode_bl); |
9087 | } |
9088 | + |
9089 | +err_out1: |
9090 | ext4_journal_stop(handle); |
9091 | ext4_double_up_write_data_sem(inode, inode_bl); |
9092 | |
9093 | +err_out: |
9094 | + up_write(&EXT4_I(inode)->i_mmap_sem); |
9095 | journal_err_out: |
9096 | unlock_two_nondirectories(inode, inode_bl); |
9097 | iput(inode_bl); |
9098 | diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c |
9099 | index 48421de803b7..3d9b18505c0c 100644 |
9100 | --- a/fs/ext4/resize.c |
9101 | +++ b/fs/ext4/resize.c |
9102 | @@ -1960,7 +1960,8 @@ retry: |
9103 | le16_to_cpu(es->s_reserved_gdt_blocks); |
9104 | n_group = n_desc_blocks * EXT4_DESC_PER_BLOCK(sb); |
9105 | n_blocks_count = (ext4_fsblk_t)n_group * |
9106 | - EXT4_BLOCKS_PER_GROUP(sb); |
9107 | + EXT4_BLOCKS_PER_GROUP(sb) + |
9108 | + le32_to_cpu(es->s_first_data_block); |
9109 | n_group--; /* set to last group number */ |
9110 | } |
9111 | |
9112 | diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c |
9113 | index c0b66a7a795b..914e725c82c4 100644 |
9114 | --- a/fs/jbd2/transaction.c |
9115 | +++ b/fs/jbd2/transaction.c |
9116 | @@ -1219,11 +1219,12 @@ int jbd2_journal_get_undo_access(handle_t *handle, struct buffer_head *bh) |
9117 | struct journal_head *jh; |
9118 | char *committed_data = NULL; |
9119 | |
9120 | - JBUFFER_TRACE(jh, "entry"); |
9121 | if (jbd2_write_access_granted(handle, bh, true)) |
9122 | return 0; |
9123 | |
9124 | jh = jbd2_journal_add_journal_head(bh); |
9125 | + JBUFFER_TRACE(jh, "entry"); |
9126 | + |
9127 | /* |
9128 | * Do this first --- it can drop the journal lock, so we want to |
9129 | * make sure that obtaining the committed_data is done |
9130 | @@ -1334,15 +1335,17 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) |
9131 | |
9132 | if (is_handle_aborted(handle)) |
9133 | return -EROFS; |
9134 | - if (!buffer_jbd(bh)) { |
9135 | - ret = -EUCLEAN; |
9136 | - goto out; |
9137 | - } |
9138 | + if (!buffer_jbd(bh)) |
9139 | + return -EUCLEAN; |
9140 | + |
9141 | /* |
9142 | * We don't grab jh reference here since the buffer must be part |
9143 | * of the running transaction. |
9144 | */ |
9145 | jh = bh2jh(bh); |
9146 | + jbd_debug(5, "journal_head %p\n", jh); |
9147 | + JBUFFER_TRACE(jh, "entry"); |
9148 | + |
9149 | /* |
9150 | * This and the following assertions are unreliable since we may see jh |
9151 | * in inconsistent state unless we grab bh_state lock. But this is |
9152 | @@ -1376,9 +1379,6 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) |
9153 | } |
9154 | |
9155 | journal = transaction->t_journal; |
9156 | - jbd_debug(5, "journal_head %p\n", jh); |
9157 | - JBUFFER_TRACE(jh, "entry"); |
9158 | - |
9159 | jbd_lock_bh_state(bh); |
9160 | |
9161 | if (jh->b_modified == 0) { |
9162 | @@ -1576,14 +1576,21 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh) |
9163 | /* However, if the buffer is still owned by a prior |
9164 | * (committing) transaction, we can't drop it yet... */ |
9165 | JBUFFER_TRACE(jh, "belongs to older transaction"); |
9166 | - /* ... but we CAN drop it from the new transaction if we |
9167 | - * have also modified it since the original commit. */ |
9168 | + /* ... but we CAN drop it from the new transaction through |
9169 | + * marking the buffer as freed and set j_next_transaction to |
9170 | + * the new transaction, so that not only the commit code |
9171 | + * knows it should clear dirty bits when it is done with the |
9172 | + * buffer, but also the buffer can be checkpointed only |
9173 | + * after the new transaction commits. */ |
9174 | |
9175 | - if (jh->b_next_transaction) { |
9176 | - J_ASSERT(jh->b_next_transaction == transaction); |
9177 | + set_buffer_freed(bh); |
9178 | + |
9179 | + if (!jh->b_next_transaction) { |
9180 | spin_lock(&journal->j_list_lock); |
9181 | - jh->b_next_transaction = NULL; |
9182 | + jh->b_next_transaction = transaction; |
9183 | spin_unlock(&journal->j_list_lock); |
9184 | + } else { |
9185 | + J_ASSERT(jh->b_next_transaction == transaction); |
9186 | |
9187 | /* |
9188 | * only drop a reference if this transaction modified |
9189 | diff --git a/fs/kernfs/mount.c b/fs/kernfs/mount.c |
9190 | index ff2716f9322e..0b22c39dad47 100644 |
9191 | --- a/fs/kernfs/mount.c |
9192 | +++ b/fs/kernfs/mount.c |
9193 | @@ -196,8 +196,10 @@ struct dentry *kernfs_node_dentry(struct kernfs_node *kn, |
9194 | return dentry; |
9195 | |
9196 | knparent = find_next_ancestor(kn, NULL); |
9197 | - if (WARN_ON(!knparent)) |
9198 | + if (WARN_ON(!knparent)) { |
9199 | + dput(dentry); |
9200 | return ERR_PTR(-EINVAL); |
9201 | + } |
9202 | |
9203 | do { |
9204 | struct dentry *dtmp; |
9205 | @@ -206,8 +208,10 @@ struct dentry *kernfs_node_dentry(struct kernfs_node *kn, |
9206 | if (kn == knparent) |
9207 | return dentry; |
9208 | kntmp = find_next_ancestor(kn, knparent); |
9209 | - if (WARN_ON(!kntmp)) |
9210 | + if (WARN_ON(!kntmp)) { |
9211 | + dput(dentry); |
9212 | return ERR_PTR(-EINVAL); |
9213 | + } |
9214 | dtmp = lookup_one_len_unlocked(kntmp->name, dentry, |
9215 | strlen(kntmp->name)); |
9216 | dput(dentry); |
9217 | diff --git a/fs/nfs/nfs4idmap.c b/fs/nfs/nfs4idmap.c |
9218 | index 3f23b6840547..bf34ddaa2ad7 100644 |
9219 | --- a/fs/nfs/nfs4idmap.c |
9220 | +++ b/fs/nfs/nfs4idmap.c |
9221 | @@ -44,6 +44,7 @@ |
9222 | #include <linux/keyctl.h> |
9223 | #include <linux/key-type.h> |
9224 | #include <keys/user-type.h> |
9225 | +#include <keys/request_key_auth-type.h> |
9226 | #include <linux/module.h> |
9227 | |
9228 | #include "internal.h" |
9229 | @@ -59,7 +60,7 @@ static struct key_type key_type_id_resolver_legacy; |
9230 | struct idmap_legacy_upcalldata { |
9231 | struct rpc_pipe_msg pipe_msg; |
9232 | struct idmap_msg idmap_msg; |
9233 | - struct key_construction *key_cons; |
9234 | + struct key *authkey; |
9235 | struct idmap *idmap; |
9236 | }; |
9237 | |
9238 | @@ -384,7 +385,7 @@ static const match_table_t nfs_idmap_tokens = { |
9239 | { Opt_find_err, NULL } |
9240 | }; |
9241 | |
9242 | -static int nfs_idmap_legacy_upcall(struct key_construction *, const char *, void *); |
9243 | +static int nfs_idmap_legacy_upcall(struct key *, void *); |
9244 | static ssize_t idmap_pipe_downcall(struct file *, const char __user *, |
9245 | size_t); |
9246 | static void idmap_release_pipe(struct inode *); |
9247 | @@ -549,11 +550,12 @@ nfs_idmap_prepare_pipe_upcall(struct idmap *idmap, |
9248 | static void |
9249 | nfs_idmap_complete_pipe_upcall_locked(struct idmap *idmap, int ret) |
9250 | { |
9251 | - struct key_construction *cons = idmap->idmap_upcall_data->key_cons; |
9252 | + struct key *authkey = idmap->idmap_upcall_data->authkey; |
9253 | |
9254 | kfree(idmap->idmap_upcall_data); |
9255 | idmap->idmap_upcall_data = NULL; |
9256 | - complete_request_key(cons, ret); |
9257 | + complete_request_key(authkey, ret); |
9258 | + key_put(authkey); |
9259 | } |
9260 | |
9261 | static void |
9262 | @@ -563,15 +565,14 @@ nfs_idmap_abort_pipe_upcall(struct idmap *idmap, int ret) |
9263 | nfs_idmap_complete_pipe_upcall_locked(idmap, ret); |
9264 | } |
9265 | |
9266 | -static int nfs_idmap_legacy_upcall(struct key_construction *cons, |
9267 | - const char *op, |
9268 | - void *aux) |
9269 | +static int nfs_idmap_legacy_upcall(struct key *authkey, void *aux) |
9270 | { |
9271 | struct idmap_legacy_upcalldata *data; |
9272 | + struct request_key_auth *rka = get_request_key_auth(authkey); |
9273 | struct rpc_pipe_msg *msg; |
9274 | struct idmap_msg *im; |
9275 | struct idmap *idmap = (struct idmap *)aux; |
9276 | - struct key *key = cons->key; |
9277 | + struct key *key = rka->target_key; |
9278 | int ret = -ENOKEY; |
9279 | |
9280 | if (!aux) |
9281 | @@ -586,7 +587,7 @@ static int nfs_idmap_legacy_upcall(struct key_construction *cons, |
9282 | msg = &data->pipe_msg; |
9283 | im = &data->idmap_msg; |
9284 | data->idmap = idmap; |
9285 | - data->key_cons = cons; |
9286 | + data->authkey = key_get(authkey); |
9287 | |
9288 | ret = nfs_idmap_prepare_message(key->description, idmap, im, msg); |
9289 | if (ret < 0) |
9290 | @@ -604,7 +605,7 @@ static int nfs_idmap_legacy_upcall(struct key_construction *cons, |
9291 | out2: |
9292 | kfree(data); |
9293 | out1: |
9294 | - complete_request_key(cons, ret); |
9295 | + complete_request_key(authkey, ret); |
9296 | return ret; |
9297 | } |
9298 | |
9299 | @@ -651,9 +652,10 @@ out: |
9300 | static ssize_t |
9301 | idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) |
9302 | { |
9303 | + struct request_key_auth *rka; |
9304 | struct rpc_inode *rpci = RPC_I(file_inode(filp)); |
9305 | struct idmap *idmap = (struct idmap *)rpci->private; |
9306 | - struct key_construction *cons; |
9307 | + struct key *authkey; |
9308 | struct idmap_msg im; |
9309 | size_t namelen_in; |
9310 | int ret = -ENOKEY; |
9311 | @@ -665,7 +667,8 @@ idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) |
9312 | if (idmap->idmap_upcall_data == NULL) |
9313 | goto out_noupcall; |
9314 | |
9315 | - cons = idmap->idmap_upcall_data->key_cons; |
9316 | + authkey = idmap->idmap_upcall_data->authkey; |
9317 | + rka = get_request_key_auth(authkey); |
9318 | |
9319 | if (mlen != sizeof(im)) { |
9320 | ret = -ENOSPC; |
9321 | @@ -690,9 +693,9 @@ idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) |
9322 | |
9323 | ret = nfs_idmap_read_and_verify_message(&im, |
9324 | &idmap->idmap_upcall_data->idmap_msg, |
9325 | - cons->key, cons->authkey); |
9326 | + rka->target_key, authkey); |
9327 | if (ret >= 0) { |
9328 | - key_set_timeout(cons->key, nfs_idmap_cache_timeout); |
9329 | + key_set_timeout(rka->target_key, nfs_idmap_cache_timeout); |
9330 | ret = mlen; |
9331 | } |
9332 | |
9333 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
9334 | index 8220a168282e..e7abcf7629b3 100644 |
9335 | --- a/fs/nfs/nfs4proc.c |
9336 | +++ b/fs/nfs/nfs4proc.c |
9337 | @@ -947,6 +947,13 @@ nfs4_sequence_process_interrupted(struct nfs_client *client, |
9338 | |
9339 | #endif /* !CONFIG_NFS_V4_1 */ |
9340 | |
9341 | +static void nfs41_sequence_res_init(struct nfs4_sequence_res *res) |
9342 | +{ |
9343 | + res->sr_timestamp = jiffies; |
9344 | + res->sr_status_flags = 0; |
9345 | + res->sr_status = 1; |
9346 | +} |
9347 | + |
9348 | static |
9349 | void nfs4_sequence_attach_slot(struct nfs4_sequence_args *args, |
9350 | struct nfs4_sequence_res *res, |
9351 | @@ -958,10 +965,6 @@ void nfs4_sequence_attach_slot(struct nfs4_sequence_args *args, |
9352 | args->sa_slot = slot; |
9353 | |
9354 | res->sr_slot = slot; |
9355 | - res->sr_timestamp = jiffies; |
9356 | - res->sr_status_flags = 0; |
9357 | - res->sr_status = 1; |
9358 | - |
9359 | } |
9360 | |
9361 | int nfs4_setup_sequence(struct nfs_client *client, |
9362 | @@ -1007,6 +1010,7 @@ int nfs4_setup_sequence(struct nfs_client *client, |
9363 | |
9364 | trace_nfs4_setup_sequence(session, args); |
9365 | out_start: |
9366 | + nfs41_sequence_res_init(res); |
9367 | rpc_call_start(task); |
9368 | return 0; |
9369 | |
9370 | diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c |
9371 | index 3dbd15b47c27..0ec6bce3dd69 100644 |
9372 | --- a/fs/nfs/pagelist.c |
9373 | +++ b/fs/nfs/pagelist.c |
9374 | @@ -989,6 +989,17 @@ static void nfs_pageio_doio(struct nfs_pageio_descriptor *desc) |
9375 | } |
9376 | } |
9377 | |
9378 | +static void |
9379 | +nfs_pageio_cleanup_request(struct nfs_pageio_descriptor *desc, |
9380 | + struct nfs_page *req) |
9381 | +{ |
9382 | + LIST_HEAD(head); |
9383 | + |
9384 | + nfs_list_remove_request(req); |
9385 | + nfs_list_add_request(req, &head); |
9386 | + desc->pg_completion_ops->error_cleanup(&head); |
9387 | +} |
9388 | + |
9389 | /** |
9390 | * nfs_pageio_add_request - Attempt to coalesce a request into a page list. |
9391 | * @desc: destination io descriptor |
9392 | @@ -1026,10 +1037,8 @@ static int __nfs_pageio_add_request(struct nfs_pageio_descriptor *desc, |
9393 | nfs_page_group_unlock(req); |
9394 | desc->pg_moreio = 1; |
9395 | nfs_pageio_doio(desc); |
9396 | - if (desc->pg_error < 0) |
9397 | - return 0; |
9398 | - if (mirror->pg_recoalesce) |
9399 | - return 0; |
9400 | + if (desc->pg_error < 0 || mirror->pg_recoalesce) |
9401 | + goto out_cleanup_subreq; |
9402 | /* retry add_request for this subreq */ |
9403 | nfs_page_group_lock(req); |
9404 | continue; |
9405 | @@ -1062,6 +1071,10 @@ err_ptr: |
9406 | desc->pg_error = PTR_ERR(subreq); |
9407 | nfs_page_group_unlock(req); |
9408 | return 0; |
9409 | +out_cleanup_subreq: |
9410 | + if (req != subreq) |
9411 | + nfs_pageio_cleanup_request(desc, subreq); |
9412 | + return 0; |
9413 | } |
9414 | |
9415 | static int nfs_do_recoalesce(struct nfs_pageio_descriptor *desc) |
9416 | @@ -1080,7 +1093,6 @@ static int nfs_do_recoalesce(struct nfs_pageio_descriptor *desc) |
9417 | struct nfs_page *req; |
9418 | |
9419 | req = list_first_entry(&head, struct nfs_page, wb_list); |
9420 | - nfs_list_remove_request(req); |
9421 | if (__nfs_pageio_add_request(desc, req)) |
9422 | continue; |
9423 | if (desc->pg_error < 0) { |
9424 | @@ -1169,11 +1181,14 @@ int nfs_pageio_add_request(struct nfs_pageio_descriptor *desc, |
9425 | if (nfs_pgio_has_mirroring(desc)) |
9426 | desc->pg_mirror_idx = midx; |
9427 | if (!nfs_pageio_add_request_mirror(desc, dupreq)) |
9428 | - goto out_failed; |
9429 | + goto out_cleanup_subreq; |
9430 | } |
9431 | |
9432 | return 1; |
9433 | |
9434 | +out_cleanup_subreq: |
9435 | + if (req != dupreq) |
9436 | + nfs_pageio_cleanup_request(desc, dupreq); |
9437 | out_failed: |
9438 | /* remember fatal errors */ |
9439 | if (nfs_error_is_fatal(desc->pg_error)) |
9440 | @@ -1199,7 +1214,7 @@ static void nfs_pageio_complete_mirror(struct nfs_pageio_descriptor *desc, |
9441 | desc->pg_mirror_idx = mirror_idx; |
9442 | for (;;) { |
9443 | nfs_pageio_doio(desc); |
9444 | - if (!mirror->pg_recoalesce) |
9445 | + if (desc->pg_error < 0 || !mirror->pg_recoalesce) |
9446 | break; |
9447 | if (!nfs_do_recoalesce(desc)) |
9448 | break; |
9449 | diff --git a/fs/nfs/write.c b/fs/nfs/write.c |
9450 | index d790faff8e47..51d0b7913c04 100644 |
9451 | --- a/fs/nfs/write.c |
9452 | +++ b/fs/nfs/write.c |
9453 | @@ -238,9 +238,9 @@ out: |
9454 | } |
9455 | |
9456 | /* A writeback failed: mark the page as bad, and invalidate the page cache */ |
9457 | -static void nfs_set_pageerror(struct page *page) |
9458 | +static void nfs_set_pageerror(struct address_space *mapping) |
9459 | { |
9460 | - nfs_zap_mapping(page_file_mapping(page)->host, page_file_mapping(page)); |
9461 | + nfs_zap_mapping(mapping->host, mapping); |
9462 | } |
9463 | |
9464 | /* |
9465 | @@ -994,7 +994,7 @@ static void nfs_write_completion(struct nfs_pgio_header *hdr) |
9466 | nfs_list_remove_request(req); |
9467 | if (test_bit(NFS_IOHDR_ERROR, &hdr->flags) && |
9468 | (hdr->good_bytes < bytes)) { |
9469 | - nfs_set_pageerror(req->wb_page); |
9470 | + nfs_set_pageerror(page_file_mapping(req->wb_page)); |
9471 | nfs_context_set_write_error(req->wb_context, hdr->error); |
9472 | goto remove_req; |
9473 | } |
9474 | @@ -1330,7 +1330,8 @@ int nfs_updatepage(struct file *file, struct page *page, |
9475 | unsigned int offset, unsigned int count) |
9476 | { |
9477 | struct nfs_open_context *ctx = nfs_file_open_context(file); |
9478 | - struct inode *inode = page_file_mapping(page)->host; |
9479 | + struct address_space *mapping = page_file_mapping(page); |
9480 | + struct inode *inode = mapping->host; |
9481 | int status = 0; |
9482 | |
9483 | nfs_inc_stats(inode, NFSIOS_VFSUPDATEPAGE); |
9484 | @@ -1348,7 +1349,7 @@ int nfs_updatepage(struct file *file, struct page *page, |
9485 | |
9486 | status = nfs_writepage_setup(ctx, page, offset, count); |
9487 | if (status < 0) |
9488 | - nfs_set_pageerror(page); |
9489 | + nfs_set_pageerror(mapping); |
9490 | else |
9491 | __set_page_dirty_nobuffers(page); |
9492 | out: |
9493 | diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c |
9494 | index 9eb8086ea841..c9cf46e0c040 100644 |
9495 | --- a/fs/nfsd/nfs3proc.c |
9496 | +++ b/fs/nfsd/nfs3proc.c |
9497 | @@ -463,8 +463,19 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp) |
9498 | &resp->common, nfs3svc_encode_entry); |
9499 | memcpy(resp->verf, argp->verf, 8); |
9500 | resp->count = resp->buffer - argp->buffer; |
9501 | - if (resp->offset) |
9502 | - xdr_encode_hyper(resp->offset, argp->cookie); |
9503 | + if (resp->offset) { |
9504 | + loff_t offset = argp->cookie; |
9505 | + |
9506 | + if (unlikely(resp->offset1)) { |
9507 | + /* we ended up with offset on a page boundary */ |
9508 | + *resp->offset = htonl(offset >> 32); |
9509 | + *resp->offset1 = htonl(offset & 0xffffffff); |
9510 | + resp->offset1 = NULL; |
9511 | + } else { |
9512 | + xdr_encode_hyper(resp->offset, offset); |
9513 | + } |
9514 | + resp->offset = NULL; |
9515 | + } |
9516 | |
9517 | RETURN_STATUS(nfserr); |
9518 | } |
9519 | @@ -533,6 +544,7 @@ nfsd3_proc_readdirplus(struct svc_rqst *rqstp) |
9520 | } else { |
9521 | xdr_encode_hyper(resp->offset, offset); |
9522 | } |
9523 | + resp->offset = NULL; |
9524 | } |
9525 | |
9526 | RETURN_STATUS(nfserr); |
9527 | diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c |
9528 | index 9b973f4f7d01..83919116d5cb 100644 |
9529 | --- a/fs/nfsd/nfs3xdr.c |
9530 | +++ b/fs/nfsd/nfs3xdr.c |
9531 | @@ -921,6 +921,7 @@ encode_entry(struct readdir_cd *ccd, const char *name, int namlen, |
9532 | } else { |
9533 | xdr_encode_hyper(cd->offset, offset64); |
9534 | } |
9535 | + cd->offset = NULL; |
9536 | } |
9537 | |
9538 | /* |
9539 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
9540 | index 9c6d1d57b598..bec75600e692 100644 |
9541 | --- a/fs/nfsd/nfs4state.c |
9542 | +++ b/fs/nfsd/nfs4state.c |
9543 | @@ -1514,16 +1514,16 @@ static u32 nfsd4_get_drc_mem(struct nfsd4_channel_attrs *ca) |
9544 | { |
9545 | u32 slotsize = slot_bytes(ca); |
9546 | u32 num = ca->maxreqs; |
9547 | - int avail; |
9548 | + unsigned long avail, total_avail; |
9549 | |
9550 | spin_lock(&nfsd_drc_lock); |
9551 | - avail = min((unsigned long)NFSD_MAX_MEM_PER_SESSION, |
9552 | - nfsd_drc_max_mem - nfsd_drc_mem_used); |
9553 | + total_avail = nfsd_drc_max_mem - nfsd_drc_mem_used; |
9554 | + avail = min((unsigned long)NFSD_MAX_MEM_PER_SESSION, total_avail); |
9555 | /* |
9556 | * Never use more than a third of the remaining memory, |
9557 | * unless it's the only way to give this client a slot: |
9558 | */ |
9559 | - avail = clamp_t(int, avail, slotsize, avail/3); |
9560 | + avail = clamp_t(int, avail, slotsize, total_avail/3); |
9561 | num = min_t(int, num, avail / slotsize); |
9562 | nfsd_drc_mem_used += num * slotsize; |
9563 | spin_unlock(&nfsd_drc_lock); |
9564 | diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c |
9565 | index 39b835d7c445..cb69660d0779 100644 |
9566 | --- a/fs/nfsd/nfsctl.c |
9567 | +++ b/fs/nfsd/nfsctl.c |
9568 | @@ -1126,7 +1126,7 @@ static ssize_t write_v4_end_grace(struct file *file, char *buf, size_t size) |
9569 | case 'Y': |
9570 | case 'y': |
9571 | case '1': |
9572 | - if (nn->nfsd_serv) |
9573 | + if (!nn->nfsd_serv) |
9574 | return -EBUSY; |
9575 | nfsd4_end_grace(nn); |
9576 | break; |
9577 | diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c |
9578 | index 1cc797a08a5b..75eeee08d848 100644 |
9579 | --- a/fs/overlayfs/copy_up.c |
9580 | +++ b/fs/overlayfs/copy_up.c |
9581 | @@ -501,6 +501,24 @@ static int ovl_copy_up_inode(struct ovl_copy_up_ctx *c, struct dentry *temp) |
9582 | { |
9583 | int err; |
9584 | |
9585 | + /* |
9586 | + * Copy up data first and then xattrs. Writing data after |
9587 | + * xattrs will remove security.capability xattr automatically. |
9588 | + */ |
9589 | + if (S_ISREG(c->stat.mode) && !c->metacopy) { |
9590 | + struct path upperpath, datapath; |
9591 | + |
9592 | + ovl_path_upper(c->dentry, &upperpath); |
9593 | + if (WARN_ON(upperpath.dentry != NULL)) |
9594 | + return -EIO; |
9595 | + upperpath.dentry = temp; |
9596 | + |
9597 | + ovl_path_lowerdata(c->dentry, &datapath); |
9598 | + err = ovl_copy_up_data(&datapath, &upperpath, c->stat.size); |
9599 | + if (err) |
9600 | + return err; |
9601 | + } |
9602 | + |
9603 | err = ovl_copy_xattr(c->lowerpath.dentry, temp); |
9604 | if (err) |
9605 | return err; |
9606 | @@ -518,19 +536,6 @@ static int ovl_copy_up_inode(struct ovl_copy_up_ctx *c, struct dentry *temp) |
9607 | return err; |
9608 | } |
9609 | |
9610 | - if (S_ISREG(c->stat.mode) && !c->metacopy) { |
9611 | - struct path upperpath, datapath; |
9612 | - |
9613 | - ovl_path_upper(c->dentry, &upperpath); |
9614 | - BUG_ON(upperpath.dentry != NULL); |
9615 | - upperpath.dentry = temp; |
9616 | - |
9617 | - ovl_path_lowerdata(c->dentry, &datapath); |
9618 | - err = ovl_copy_up_data(&datapath, &upperpath, c->stat.size); |
9619 | - if (err) |
9620 | - return err; |
9621 | - } |
9622 | - |
9623 | if (c->metacopy) { |
9624 | err = ovl_check_setxattr(c->dentry, temp, OVL_XATTR_METACOPY, |
9625 | NULL, 0, -EOPNOTSUPP); |
9626 | @@ -706,6 +711,8 @@ static int ovl_copy_up_meta_inode_data(struct ovl_copy_up_ctx *c) |
9627 | { |
9628 | struct path upperpath, datapath; |
9629 | int err; |
9630 | + char *capability = NULL; |
9631 | + ssize_t uninitialized_var(cap_size); |
9632 | |
9633 | ovl_path_upper(c->dentry, &upperpath); |
9634 | if (WARN_ON(upperpath.dentry == NULL)) |
9635 | @@ -715,15 +722,37 @@ static int ovl_copy_up_meta_inode_data(struct ovl_copy_up_ctx *c) |
9636 | if (WARN_ON(datapath.dentry == NULL)) |
9637 | return -EIO; |
9638 | |
9639 | + if (c->stat.size) { |
9640 | + err = cap_size = ovl_getxattr(upperpath.dentry, XATTR_NAME_CAPS, |
9641 | + &capability, 0); |
9642 | + if (err < 0 && err != -ENODATA) |
9643 | + goto out; |
9644 | + } |
9645 | + |
9646 | err = ovl_copy_up_data(&datapath, &upperpath, c->stat.size); |
9647 | if (err) |
9648 | - return err; |
9649 | + goto out_free; |
9650 | + |
9651 | + /* |
9652 | + * Writing to upper file will clear security.capability xattr. We |
9653 | + * don't want that to happen for normal copy-up operation. |
9654 | + */ |
9655 | + if (capability) { |
9656 | + err = ovl_do_setxattr(upperpath.dentry, XATTR_NAME_CAPS, |
9657 | + capability, cap_size, 0); |
9658 | + if (err) |
9659 | + goto out_free; |
9660 | + } |
9661 | + |
9662 | |
9663 | err = vfs_removexattr(upperpath.dentry, OVL_XATTR_METACOPY); |
9664 | if (err) |
9665 | - return err; |
9666 | + goto out_free; |
9667 | |
9668 | ovl_set_upperdata(d_inode(c->dentry)); |
9669 | +out_free: |
9670 | + kfree(capability); |
9671 | +out: |
9672 | return err; |
9673 | } |
9674 | |
9675 | diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h |
9676 | index a3c0d9584312..d9c16ceebfe7 100644 |
9677 | --- a/fs/overlayfs/overlayfs.h |
9678 | +++ b/fs/overlayfs/overlayfs.h |
9679 | @@ -277,6 +277,8 @@ int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir); |
9680 | int ovl_check_metacopy_xattr(struct dentry *dentry); |
9681 | bool ovl_is_metacopy_dentry(struct dentry *dentry); |
9682 | char *ovl_get_redirect_xattr(struct dentry *dentry, int padding); |
9683 | +ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value, |
9684 | + size_t padding); |
9685 | |
9686 | static inline bool ovl_is_impuredir(struct dentry *dentry) |
9687 | { |
9688 | diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c |
9689 | index ace4fe4c39a9..c9a2e3c6d537 100644 |
9690 | --- a/fs/overlayfs/util.c |
9691 | +++ b/fs/overlayfs/util.c |
9692 | @@ -867,28 +867,49 @@ bool ovl_is_metacopy_dentry(struct dentry *dentry) |
9693 | return (oe->numlower > 1); |
9694 | } |
9695 | |
9696 | -char *ovl_get_redirect_xattr(struct dentry *dentry, int padding) |
9697 | +ssize_t ovl_getxattr(struct dentry *dentry, char *name, char **value, |
9698 | + size_t padding) |
9699 | { |
9700 | - int res; |
9701 | - char *s, *next, *buf = NULL; |
9702 | + ssize_t res; |
9703 | + char *buf = NULL; |
9704 | |
9705 | - res = vfs_getxattr(dentry, OVL_XATTR_REDIRECT, NULL, 0); |
9706 | + res = vfs_getxattr(dentry, name, NULL, 0); |
9707 | if (res < 0) { |
9708 | if (res == -ENODATA || res == -EOPNOTSUPP) |
9709 | - return NULL; |
9710 | + return -ENODATA; |
9711 | goto fail; |
9712 | } |
9713 | |
9714 | - buf = kzalloc(res + padding + 1, GFP_KERNEL); |
9715 | - if (!buf) |
9716 | - return ERR_PTR(-ENOMEM); |
9717 | + if (res != 0) { |
9718 | + buf = kzalloc(res + padding, GFP_KERNEL); |
9719 | + if (!buf) |
9720 | + return -ENOMEM; |
9721 | |
9722 | - if (res == 0) |
9723 | - goto invalid; |
9724 | + res = vfs_getxattr(dentry, name, buf, res); |
9725 | + if (res < 0) |
9726 | + goto fail; |
9727 | + } |
9728 | + *value = buf; |
9729 | + |
9730 | + return res; |
9731 | + |
9732 | +fail: |
9733 | + pr_warn_ratelimited("overlayfs: failed to get xattr %s: err=%zi)\n", |
9734 | + name, res); |
9735 | + kfree(buf); |
9736 | + return res; |
9737 | +} |
9738 | |
9739 | - res = vfs_getxattr(dentry, OVL_XATTR_REDIRECT, buf, res); |
9740 | +char *ovl_get_redirect_xattr(struct dentry *dentry, int padding) |
9741 | +{ |
9742 | + int res; |
9743 | + char *s, *next, *buf = NULL; |
9744 | + |
9745 | + res = ovl_getxattr(dentry, OVL_XATTR_REDIRECT, &buf, padding + 1); |
9746 | + if (res == -ENODATA) |
9747 | + return NULL; |
9748 | if (res < 0) |
9749 | - goto fail; |
9750 | + return ERR_PTR(res); |
9751 | if (res == 0) |
9752 | goto invalid; |
9753 | |
9754 | @@ -904,15 +925,9 @@ char *ovl_get_redirect_xattr(struct dentry *dentry, int padding) |
9755 | } |
9756 | |
9757 | return buf; |
9758 | - |
9759 | -err_free: |
9760 | - kfree(buf); |
9761 | - return ERR_PTR(res); |
9762 | -fail: |
9763 | - pr_warn_ratelimited("overlayfs: failed to get redirect (%i)\n", res); |
9764 | - goto err_free; |
9765 | invalid: |
9766 | pr_warn_ratelimited("overlayfs: invalid redirect (%s)\n", buf); |
9767 | res = -EINVAL; |
9768 | - goto err_free; |
9769 | + kfree(buf); |
9770 | + return ERR_PTR(res); |
9771 | } |
9772 | diff --git a/fs/pipe.c b/fs/pipe.c |
9773 | index bdc5d3c0977d..c51750ed4011 100644 |
9774 | --- a/fs/pipe.c |
9775 | +++ b/fs/pipe.c |
9776 | @@ -234,6 +234,14 @@ static const struct pipe_buf_operations anon_pipe_buf_ops = { |
9777 | .get = generic_pipe_buf_get, |
9778 | }; |
9779 | |
9780 | +static const struct pipe_buf_operations anon_pipe_buf_nomerge_ops = { |
9781 | + .can_merge = 0, |
9782 | + .confirm = generic_pipe_buf_confirm, |
9783 | + .release = anon_pipe_buf_release, |
9784 | + .steal = anon_pipe_buf_steal, |
9785 | + .get = generic_pipe_buf_get, |
9786 | +}; |
9787 | + |
9788 | static const struct pipe_buf_operations packet_pipe_buf_ops = { |
9789 | .can_merge = 0, |
9790 | .confirm = generic_pipe_buf_confirm, |
9791 | @@ -242,6 +250,12 @@ static const struct pipe_buf_operations packet_pipe_buf_ops = { |
9792 | .get = generic_pipe_buf_get, |
9793 | }; |
9794 | |
9795 | +void pipe_buf_mark_unmergeable(struct pipe_buffer *buf) |
9796 | +{ |
9797 | + if (buf->ops == &anon_pipe_buf_ops) |
9798 | + buf->ops = &anon_pipe_buf_nomerge_ops; |
9799 | +} |
9800 | + |
9801 | static ssize_t |
9802 | pipe_read(struct kiocb *iocb, struct iov_iter *to) |
9803 | { |
9804 | diff --git a/fs/splice.c b/fs/splice.c |
9805 | index b3daa971f597..29e92b506394 100644 |
9806 | --- a/fs/splice.c |
9807 | +++ b/fs/splice.c |
9808 | @@ -1593,6 +1593,8 @@ retry: |
9809 | */ |
9810 | obuf->flags &= ~PIPE_BUF_FLAG_GIFT; |
9811 | |
9812 | + pipe_buf_mark_unmergeable(obuf); |
9813 | + |
9814 | obuf->len = len; |
9815 | opipe->nrbufs++; |
9816 | ibuf->offset += obuf->len; |
9817 | @@ -1667,6 +1669,8 @@ static int link_pipe(struct pipe_inode_info *ipipe, |
9818 | */ |
9819 | obuf->flags &= ~PIPE_BUF_FLAG_GIFT; |
9820 | |
9821 | + pipe_buf_mark_unmergeable(obuf); |
9822 | + |
9823 | if (obuf->len > len) |
9824 | obuf->len = len; |
9825 | |
9826 | diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h |
9827 | index d7701d466b60..dd38c97933f1 100644 |
9828 | --- a/include/asm-generic/vmlinux.lds.h |
9829 | +++ b/include/asm-generic/vmlinux.lds.h |
9830 | @@ -727,7 +727,7 @@ |
9831 | KEEP(*(.orc_unwind_ip)) \ |
9832 | __stop_orc_unwind_ip = .; \ |
9833 | } \ |
9834 | - . = ALIGN(6); \ |
9835 | + . = ALIGN(2); \ |
9836 | .orc_unwind : AT(ADDR(.orc_unwind) - LOAD_OFFSET) { \ |
9837 | __start_orc_unwind = .; \ |
9838 | KEEP(*(.orc_unwind)) \ |
9839 | diff --git a/include/keys/request_key_auth-type.h b/include/keys/request_key_auth-type.h |
9840 | new file mode 100644 |
9841 | index 000000000000..a726dd3f1dc6 |
9842 | --- /dev/null |
9843 | +++ b/include/keys/request_key_auth-type.h |
9844 | @@ -0,0 +1,36 @@ |
9845 | +/* request_key authorisation token key type |
9846 | + * |
9847 | + * Copyright (C) 2005 Red Hat, Inc. All Rights Reserved. |
9848 | + * Written by David Howells (dhowells@redhat.com) |
9849 | + * |
9850 | + * This program is free software; you can redistribute it and/or |
9851 | + * modify it under the terms of the GNU General Public Licence |
9852 | + * as published by the Free Software Foundation; either version |
9853 | + * 2 of the Licence, or (at your option) any later version. |
9854 | + */ |
9855 | + |
9856 | +#ifndef _KEYS_REQUEST_KEY_AUTH_TYPE_H |
9857 | +#define _KEYS_REQUEST_KEY_AUTH_TYPE_H |
9858 | + |
9859 | +#include <linux/key.h> |
9860 | + |
9861 | +/* |
9862 | + * Authorisation record for request_key(). |
9863 | + */ |
9864 | +struct request_key_auth { |
9865 | + struct key *target_key; |
9866 | + struct key *dest_keyring; |
9867 | + const struct cred *cred; |
9868 | + void *callout_info; |
9869 | + size_t callout_len; |
9870 | + pid_t pid; |
9871 | + char op[8]; |
9872 | +} __randomize_layout; |
9873 | + |
9874 | +static inline struct request_key_auth *get_request_key_auth(const struct key *key) |
9875 | +{ |
9876 | + return key->payload.data[0]; |
9877 | +} |
9878 | + |
9879 | + |
9880 | +#endif /* _KEYS_REQUEST_KEY_AUTH_TYPE_H */ |
9881 | diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h |
9882 | index 4f31f96bbfab..90ac450745f1 100644 |
9883 | --- a/include/kvm/arm_vgic.h |
9884 | +++ b/include/kvm/arm_vgic.h |
9885 | @@ -256,7 +256,7 @@ struct vgic_dist { |
9886 | u64 propbaser; |
9887 | |
9888 | /* Protects the lpi_list and the count value below. */ |
9889 | - spinlock_t lpi_list_lock; |
9890 | + raw_spinlock_t lpi_list_lock; |
9891 | struct list_head lpi_list_head; |
9892 | int lpi_list_count; |
9893 | |
9894 | diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h |
9895 | index 6fb0808e87c8..bef2e36c01b4 100644 |
9896 | --- a/include/linux/device-mapper.h |
9897 | +++ b/include/linux/device-mapper.h |
9898 | @@ -601,7 +601,7 @@ do { \ |
9899 | */ |
9900 | #define dm_target_offset(ti, sector) ((sector) - (ti)->begin) |
9901 | |
9902 | -static inline sector_t to_sector(unsigned long n) |
9903 | +static inline sector_t to_sector(unsigned long long n) |
9904 | { |
9905 | return (n >> SECTOR_SHIFT); |
9906 | } |
9907 | diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h |
9908 | index 0fbbcdf0c178..da0af631ded5 100644 |
9909 | --- a/include/linux/hardirq.h |
9910 | +++ b/include/linux/hardirq.h |
9911 | @@ -60,8 +60,14 @@ extern void irq_enter(void); |
9912 | */ |
9913 | extern void irq_exit(void); |
9914 | |
9915 | +#ifndef arch_nmi_enter |
9916 | +#define arch_nmi_enter() do { } while (0) |
9917 | +#define arch_nmi_exit() do { } while (0) |
9918 | +#endif |
9919 | + |
9920 | #define nmi_enter() \ |
9921 | do { \ |
9922 | + arch_nmi_enter(); \ |
9923 | printk_nmi_enter(); \ |
9924 | lockdep_off(); \ |
9925 | ftrace_nmi_enter(); \ |
9926 | @@ -80,6 +86,7 @@ extern void irq_exit(void); |
9927 | ftrace_nmi_exit(); \ |
9928 | lockdep_on(); \ |
9929 | printk_nmi_exit(); \ |
9930 | + arch_nmi_exit(); \ |
9931 | } while (0) |
9932 | |
9933 | #endif /* LINUX_HARDIRQ_H */ |
9934 | diff --git a/include/linux/key-type.h b/include/linux/key-type.h |
9935 | index 05d8fb5a06c4..d3c5ae8ad498 100644 |
9936 | --- a/include/linux/key-type.h |
9937 | +++ b/include/linux/key-type.h |
9938 | @@ -17,15 +17,6 @@ |
9939 | |
9940 | #ifdef CONFIG_KEYS |
9941 | |
9942 | -/* |
9943 | - * key under-construction record |
9944 | - * - passed to the request_key actor if supplied |
9945 | - */ |
9946 | -struct key_construction { |
9947 | - struct key *key; /* key being constructed */ |
9948 | - struct key *authkey;/* authorisation for key being constructed */ |
9949 | -}; |
9950 | - |
9951 | /* |
9952 | * Pre-parsed payload, used by key add, update and instantiate. |
9953 | * |
9954 | @@ -47,8 +38,7 @@ struct key_preparsed_payload { |
9955 | time64_t expiry; /* Expiry time of key */ |
9956 | } __randomize_layout; |
9957 | |
9958 | -typedef int (*request_key_actor_t)(struct key_construction *key, |
9959 | - const char *op, void *aux); |
9960 | +typedef int (*request_key_actor_t)(struct key *auth_key, void *aux); |
9961 | |
9962 | /* |
9963 | * Preparsed matching criterion. |
9964 | @@ -170,20 +160,20 @@ extern int key_instantiate_and_link(struct key *key, |
9965 | const void *data, |
9966 | size_t datalen, |
9967 | struct key *keyring, |
9968 | - struct key *instkey); |
9969 | + struct key *authkey); |
9970 | extern int key_reject_and_link(struct key *key, |
9971 | unsigned timeout, |
9972 | unsigned error, |
9973 | struct key *keyring, |
9974 | - struct key *instkey); |
9975 | -extern void complete_request_key(struct key_construction *cons, int error); |
9976 | + struct key *authkey); |
9977 | +extern void complete_request_key(struct key *authkey, int error); |
9978 | |
9979 | static inline int key_negate_and_link(struct key *key, |
9980 | unsigned timeout, |
9981 | struct key *keyring, |
9982 | - struct key *instkey) |
9983 | + struct key *authkey) |
9984 | { |
9985 | - return key_reject_and_link(key, timeout, ENOKEY, keyring, instkey); |
9986 | + return key_reject_and_link(key, timeout, ENOKEY, keyring, authkey); |
9987 | } |
9988 | |
9989 | extern int generic_key_instantiate(struct key *key, struct key_preparsed_payload *prep); |
9990 | diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h |
9991 | index a03d5e264e5e..23c242a7ac52 100644 |
9992 | --- a/include/linux/kvm_host.h |
9993 | +++ b/include/linux/kvm_host.h |
9994 | @@ -633,7 +633,7 @@ void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free, |
9995 | struct kvm_memory_slot *dont); |
9996 | int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot, |
9997 | unsigned long npages); |
9998 | -void kvm_arch_memslots_updated(struct kvm *kvm, struct kvm_memslots *slots); |
9999 | +void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen); |
10000 | int kvm_arch_prepare_memory_region(struct kvm *kvm, |
10001 | struct kvm_memory_slot *memslot, |
10002 | const struct kvm_userspace_memory_region *mem, |
10003 | diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h |
10004 | index 5a3bb3b7c9ad..3ecd7ea212ae 100644 |
10005 | --- a/include/linux/pipe_fs_i.h |
10006 | +++ b/include/linux/pipe_fs_i.h |
10007 | @@ -182,6 +182,7 @@ void generic_pipe_buf_get(struct pipe_inode_info *, struct pipe_buffer *); |
10008 | int generic_pipe_buf_confirm(struct pipe_inode_info *, struct pipe_buffer *); |
10009 | int generic_pipe_buf_steal(struct pipe_inode_info *, struct pipe_buffer *); |
10010 | void generic_pipe_buf_release(struct pipe_inode_info *, struct pipe_buffer *); |
10011 | +void pipe_buf_mark_unmergeable(struct pipe_buffer *buf); |
10012 | |
10013 | extern const struct pipe_buf_operations nosteal_pipe_buf_ops; |
10014 | |
10015 | diff --git a/include/linux/property.h b/include/linux/property.h |
10016 | index ac8a1ebc4c1b..1a12364050d8 100644 |
10017 | --- a/include/linux/property.h |
10018 | +++ b/include/linux/property.h |
10019 | @@ -258,7 +258,7 @@ struct property_entry { |
10020 | #define PROPERTY_ENTRY_STRING(_name_, _val_) \ |
10021 | (struct property_entry) { \ |
10022 | .name = _name_, \ |
10023 | - .length = sizeof(_val_), \ |
10024 | + .length = sizeof(const char *), \ |
10025 | .type = DEV_PROP_STRING, \ |
10026 | { .value = { .str = _val_ } }, \ |
10027 | } |
10028 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h |
10029 | index a404d475acee..820903ceac4f 100644 |
10030 | --- a/include/linux/skbuff.h |
10031 | +++ b/include/linux/skbuff.h |
10032 | @@ -4086,6 +4086,12 @@ static inline bool skb_is_gso_sctp(const struct sk_buff *skb) |
10033 | return skb_shinfo(skb)->gso_type & SKB_GSO_SCTP; |
10034 | } |
10035 | |
10036 | +/* Note: Should be called only if skb_is_gso(skb) is true */ |
10037 | +static inline bool skb_is_gso_tcp(const struct sk_buff *skb) |
10038 | +{ |
10039 | + return skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6); |
10040 | +} |
10041 | + |
10042 | static inline void skb_gso_reset(struct sk_buff *skb) |
10043 | { |
10044 | skb_shinfo(skb)->gso_size = 0; |
10045 | diff --git a/include/net/phonet/pep.h b/include/net/phonet/pep.h |
10046 | index b669fe6dbc3b..98f31c7ea23d 100644 |
10047 | --- a/include/net/phonet/pep.h |
10048 | +++ b/include/net/phonet/pep.h |
10049 | @@ -63,10 +63,11 @@ struct pnpipehdr { |
10050 | u8 state_after_reset; /* reset request */ |
10051 | u8 error_code; /* any response */ |
10052 | u8 pep_type; /* status indication */ |
10053 | - u8 data[1]; |
10054 | + u8 data0; /* anything else */ |
10055 | }; |
10056 | + u8 data[]; |
10057 | }; |
10058 | -#define other_pep_type data[1] |
10059 | +#define other_pep_type data[0] |
10060 | |
10061 | static inline struct pnpipehdr *pnp_hdr(struct sk_buff *skb) |
10062 | { |
10063 | diff --git a/init/main.c b/init/main.c |
10064 | index 18f8f0140fa0..e083fac08aed 100644 |
10065 | --- a/init/main.c |
10066 | +++ b/init/main.c |
10067 | @@ -689,7 +689,6 @@ asmlinkage __visible void __init start_kernel(void) |
10068 | initrd_start = 0; |
10069 | } |
10070 | #endif |
10071 | - page_ext_init(); |
10072 | kmemleak_init(); |
10073 | debug_objects_mem_init(); |
10074 | setup_per_cpu_pageset(); |
10075 | @@ -1140,6 +1139,8 @@ static noinline void __init kernel_init_freeable(void) |
10076 | sched_init_smp(); |
10077 | |
10078 | page_alloc_init_late(); |
10079 | + /* Initialize page ext after all struct pages are initialized. */ |
10080 | + page_ext_init(); |
10081 | |
10082 | do_basic_setup(); |
10083 | |
10084 | diff --git a/kernel/bpf/lpm_trie.c b/kernel/bpf/lpm_trie.c |
10085 | index 9058317ba9de..4f3138e6ecb2 100644 |
10086 | --- a/kernel/bpf/lpm_trie.c |
10087 | +++ b/kernel/bpf/lpm_trie.c |
10088 | @@ -432,6 +432,7 @@ static int trie_delete_elem(struct bpf_map *map, void *_key) |
10089 | } |
10090 | |
10091 | if (!node || node->prefixlen != key->prefixlen || |
10092 | + node->prefixlen != matchlen || |
10093 | (node->flags & LPM_TREE_NODE_FLAG_IM)) { |
10094 | ret = -ENOENT; |
10095 | goto out; |
10096 | diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c |
10097 | index 6a32933cae4f..7cb7a7f98a37 100644 |
10098 | --- a/kernel/bpf/stackmap.c |
10099 | +++ b/kernel/bpf/stackmap.c |
10100 | @@ -44,7 +44,7 @@ static void do_up_read(struct irq_work *entry) |
10101 | struct stack_map_irq_work *work; |
10102 | |
10103 | work = container_of(entry, struct stack_map_irq_work, irq_work); |
10104 | - up_read(work->sem); |
10105 | + up_read_non_owner(work->sem); |
10106 | work->sem = NULL; |
10107 | } |
10108 | |
10109 | @@ -338,6 +338,12 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs, |
10110 | } else { |
10111 | work->sem = ¤t->mm->mmap_sem; |
10112 | irq_work_queue(&work->irq_work); |
10113 | + /* |
10114 | + * The irq_work will release the mmap_sem with |
10115 | + * up_read_non_owner(). The rwsem_release() is called |
10116 | + * here to release the lock from lockdep's perspective. |
10117 | + */ |
10118 | + rwsem_release(¤t->mm->mmap_sem.dep_map, 1, _RET_IP_); |
10119 | } |
10120 | } |
10121 | |
10122 | diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c |
10123 | index e578c3999970..e710ac7fbbbf 100644 |
10124 | --- a/kernel/cgroup/cgroup.c |
10125 | +++ b/kernel/cgroup/cgroup.c |
10126 | @@ -1998,7 +1998,7 @@ struct dentry *cgroup_do_mount(struct file_system_type *fs_type, int flags, |
10127 | struct cgroup_namespace *ns) |
10128 | { |
10129 | struct dentry *dentry; |
10130 | - bool new_sb; |
10131 | + bool new_sb = false; |
10132 | |
10133 | dentry = kernfs_mount(fs_type, flags, root->kf_root, magic, &new_sb); |
10134 | |
10135 | @@ -2008,6 +2008,7 @@ struct dentry *cgroup_do_mount(struct file_system_type *fs_type, int flags, |
10136 | */ |
10137 | if (!IS_ERR(dentry) && ns != &init_cgroup_ns) { |
10138 | struct dentry *nsdentry; |
10139 | + struct super_block *sb = dentry->d_sb; |
10140 | struct cgroup *cgrp; |
10141 | |
10142 | mutex_lock(&cgroup_mutex); |
10143 | @@ -2018,12 +2019,14 @@ struct dentry *cgroup_do_mount(struct file_system_type *fs_type, int flags, |
10144 | spin_unlock_irq(&css_set_lock); |
10145 | mutex_unlock(&cgroup_mutex); |
10146 | |
10147 | - nsdentry = kernfs_node_dentry(cgrp->kn, dentry->d_sb); |
10148 | + nsdentry = kernfs_node_dentry(cgrp->kn, sb); |
10149 | dput(dentry); |
10150 | + if (IS_ERR(nsdentry)) |
10151 | + deactivate_locked_super(sb); |
10152 | dentry = nsdentry; |
10153 | } |
10154 | |
10155 | - if (IS_ERR(dentry) || !new_sb) |
10156 | + if (!new_sb) |
10157 | cgroup_put(&root->cgrp); |
10158 | |
10159 | return dentry; |
10160 | diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c |
10161 | index 15301ed19da6..f7e89c989df7 100644 |
10162 | --- a/kernel/rcu/tree.c |
10163 | +++ b/kernel/rcu/tree.c |
10164 | @@ -1689,15 +1689,23 @@ static bool rcu_future_gp_cleanup(struct rcu_state *rsp, struct rcu_node *rnp) |
10165 | } |
10166 | |
10167 | /* |
10168 | - * Awaken the grace-period kthread for the specified flavor of RCU. |
10169 | - * Don't do a self-awaken, and don't bother awakening when there is |
10170 | - * nothing for the grace-period kthread to do (as in several CPUs |
10171 | - * raced to awaken, and we lost), and finally don't try to awaken |
10172 | - * a kthread that has not yet been created. |
10173 | + * Awaken the grace-period kthread. Don't do a self-awaken (unless in |
10174 | + * an interrupt or softirq handler), and don't bother awakening when there |
10175 | + * is nothing for the grace-period kthread to do (as in several CPUs raced |
10176 | + * to awaken, and we lost), and finally don't try to awaken a kthread that |
10177 | + * has not yet been created. If all those checks are passed, track some |
10178 | + * debug information and awaken. |
10179 | + * |
10180 | + * So why do the self-wakeup when in an interrupt or softirq handler |
10181 | + * in the grace-period kthread's context? Because the kthread might have |
10182 | + * been interrupted just as it was going to sleep, and just after the final |
10183 | + * pre-sleep check of the awaken condition. In this case, a wakeup really |
10184 | + * is required, and is therefore supplied. |
10185 | */ |
10186 | static void rcu_gp_kthread_wake(struct rcu_state *rsp) |
10187 | { |
10188 | - if (current == rsp->gp_kthread || |
10189 | + if ((current == rsp->gp_kthread && |
10190 | + !in_interrupt() && !in_serving_softirq()) || |
10191 | !READ_ONCE(rsp->gp_flags) || |
10192 | !rsp->gp_kthread) |
10193 | return; |
10194 | diff --git a/kernel/sysctl.c b/kernel/sysctl.c |
10195 | index 32dea29d05a0..3b86acd5de4e 100644 |
10196 | --- a/kernel/sysctl.c |
10197 | +++ b/kernel/sysctl.c |
10198 | @@ -2552,7 +2552,16 @@ static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp, |
10199 | { |
10200 | struct do_proc_dointvec_minmax_conv_param *param = data; |
10201 | if (write) { |
10202 | - int val = *negp ? -*lvalp : *lvalp; |
10203 | + int val; |
10204 | + if (*negp) { |
10205 | + if (*lvalp > (unsigned long) INT_MAX + 1) |
10206 | + return -EINVAL; |
10207 | + val = -*lvalp; |
10208 | + } else { |
10209 | + if (*lvalp > (unsigned long) INT_MAX) |
10210 | + return -EINVAL; |
10211 | + val = *lvalp; |
10212 | + } |
10213 | if ((param->min && *param->min > val) || |
10214 | (param->max && *param->max < val)) |
10215 | return -EINVAL; |
10216 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
10217 | index 17bd0c0dfa98..1f96b292df31 100644 |
10218 | --- a/kernel/trace/trace.c |
10219 | +++ b/kernel/trace/trace.c |
10220 | @@ -5606,7 +5606,6 @@ out: |
10221 | return ret; |
10222 | |
10223 | fail: |
10224 | - kfree(iter->trace); |
10225 | kfree(iter); |
10226 | __trace_array_put(tr); |
10227 | mutex_unlock(&trace_types_lock); |
10228 | diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c |
10229 | index 69a3fe926e8c..e6945b55c688 100644 |
10230 | --- a/kernel/trace/trace_event_perf.c |
10231 | +++ b/kernel/trace/trace_event_perf.c |
10232 | @@ -298,15 +298,13 @@ int perf_uprobe_init(struct perf_event *p_event, bool is_retprobe) |
10233 | |
10234 | if (!p_event->attr.uprobe_path) |
10235 | return -EINVAL; |
10236 | - path = kzalloc(PATH_MAX, GFP_KERNEL); |
10237 | - if (!path) |
10238 | - return -ENOMEM; |
10239 | - ret = strncpy_from_user( |
10240 | - path, u64_to_user_ptr(p_event->attr.uprobe_path), PATH_MAX); |
10241 | - if (ret == PATH_MAX) |
10242 | - return -E2BIG; |
10243 | - if (ret < 0) |
10244 | - goto out; |
10245 | + |
10246 | + path = strndup_user(u64_to_user_ptr(p_event->attr.uprobe_path), |
10247 | + PATH_MAX); |
10248 | + if (IS_ERR(path)) { |
10249 | + ret = PTR_ERR(path); |
10250 | + return (ret == -EINVAL) ? -E2BIG : ret; |
10251 | + } |
10252 | if (path[0] == '\0') { |
10253 | ret = -EINVAL; |
10254 | goto out; |
10255 | diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c |
10256 | index eb908ef2ecec..11853e90b649 100644 |
10257 | --- a/kernel/trace/trace_events_hist.c |
10258 | +++ b/kernel/trace/trace_events_hist.c |
10259 | @@ -4621,9 +4621,10 @@ static inline void add_to_key(char *compound_key, void *key, |
10260 | /* ensure NULL-termination */ |
10261 | if (size > key_field->size - 1) |
10262 | size = key_field->size - 1; |
10263 | - } |
10264 | |
10265 | - memcpy(compound_key + key_field->offset, key, size); |
10266 | + strncpy(compound_key + key_field->offset, (char *)key, size); |
10267 | + } else |
10268 | + memcpy(compound_key + key_field->offset, key, size); |
10269 | } |
10270 | |
10271 | static void |
10272 | diff --git a/lib/assoc_array.c b/lib/assoc_array.c |
10273 | index c6659cb37033..59875eb278ea 100644 |
10274 | --- a/lib/assoc_array.c |
10275 | +++ b/lib/assoc_array.c |
10276 | @@ -768,9 +768,11 @@ all_leaves_cluster_together: |
10277 | new_s0->index_key[i] = |
10278 | ops->get_key_chunk(index_key, i * ASSOC_ARRAY_KEY_CHUNK_SIZE); |
10279 | |
10280 | - blank = ULONG_MAX << (level & ASSOC_ARRAY_KEY_CHUNK_MASK); |
10281 | - pr_devel("blank off [%zu] %d: %lx\n", keylen - 1, level, blank); |
10282 | - new_s0->index_key[keylen - 1] &= ~blank; |
10283 | + if (level & ASSOC_ARRAY_KEY_CHUNK_MASK) { |
10284 | + blank = ULONG_MAX << (level & ASSOC_ARRAY_KEY_CHUNK_MASK); |
10285 | + pr_devel("blank off [%zu] %d: %lx\n", keylen - 1, level, blank); |
10286 | + new_s0->index_key[keylen - 1] &= ~blank; |
10287 | + } |
10288 | |
10289 | /* This now reduces to a node splitting exercise for which we'll need |
10290 | * to regenerate the disparity table. |
10291 | diff --git a/mm/gup.c b/mm/gup.c |
10292 | index 1abc8b4afff6..0a5374e6e82d 100644 |
10293 | --- a/mm/gup.c |
10294 | +++ b/mm/gup.c |
10295 | @@ -1649,7 +1649,8 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end, |
10296 | if (!pmd_present(pmd)) |
10297 | return 0; |
10298 | |
10299 | - if (unlikely(pmd_trans_huge(pmd) || pmd_huge(pmd))) { |
10300 | + if (unlikely(pmd_trans_huge(pmd) || pmd_huge(pmd) || |
10301 | + pmd_devmap(pmd))) { |
10302 | /* |
10303 | * NUMA hinting faults need to be handled in the GUP |
10304 | * slowpath for accounting purposes and so that they |
10305 | diff --git a/mm/memory-failure.c b/mm/memory-failure.c |
10306 | index d9b8a2490633..6edc6db5ec1b 100644 |
10307 | --- a/mm/memory-failure.c |
10308 | +++ b/mm/memory-failure.c |
10309 | @@ -1823,19 +1823,17 @@ static int soft_offline_in_use_page(struct page *page, int flags) |
10310 | struct page *hpage = compound_head(page); |
10311 | |
10312 | if (!PageHuge(page) && PageTransHuge(hpage)) { |
10313 | - lock_page(hpage); |
10314 | - if (!PageAnon(hpage) || unlikely(split_huge_page(hpage))) { |
10315 | - unlock_page(hpage); |
10316 | - if (!PageAnon(hpage)) |
10317 | + lock_page(page); |
10318 | + if (!PageAnon(page) || unlikely(split_huge_page(page))) { |
10319 | + unlock_page(page); |
10320 | + if (!PageAnon(page)) |
10321 | pr_info("soft offline: %#lx: non anonymous thp\n", page_to_pfn(page)); |
10322 | else |
10323 | pr_info("soft offline: %#lx: thp split failed\n", page_to_pfn(page)); |
10324 | - put_hwpoison_page(hpage); |
10325 | + put_hwpoison_page(page); |
10326 | return -EBUSY; |
10327 | } |
10328 | - unlock_page(hpage); |
10329 | - get_hwpoison_page(page); |
10330 | - put_hwpoison_page(hpage); |
10331 | + unlock_page(page); |
10332 | } |
10333 | |
10334 | /* |
10335 | diff --git a/mm/memory.c b/mm/memory.c |
10336 | index 281172540a9c..5b3f71bcd1ae 100644 |
10337 | --- a/mm/memory.c |
10338 | +++ b/mm/memory.c |
10339 | @@ -3762,10 +3762,13 @@ static vm_fault_t do_shared_fault(struct vm_fault *vmf) |
10340 | * but allow concurrent faults). |
10341 | * The mmap_sem may have been released depending on flags and our |
10342 | * return value. See filemap_fault() and __lock_page_or_retry(). |
10343 | + * If mmap_sem is released, vma may become invalid (for example |
10344 | + * by other thread calling munmap()). |
10345 | */ |
10346 | static vm_fault_t do_fault(struct vm_fault *vmf) |
10347 | { |
10348 | struct vm_area_struct *vma = vmf->vma; |
10349 | + struct mm_struct *vm_mm = vma->vm_mm; |
10350 | vm_fault_t ret; |
10351 | |
10352 | /* |
10353 | @@ -3806,7 +3809,7 @@ static vm_fault_t do_fault(struct vm_fault *vmf) |
10354 | |
10355 | /* preallocated pagetable is unused: free it */ |
10356 | if (vmf->prealloc_pte) { |
10357 | - pte_free(vma->vm_mm, vmf->prealloc_pte); |
10358 | + pte_free(vm_mm, vmf->prealloc_pte); |
10359 | vmf->prealloc_pte = NULL; |
10360 | } |
10361 | return ret; |
10362 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
10363 | index a9de1dbb9a6c..ef99971c13dd 100644 |
10364 | --- a/mm/page_alloc.c |
10365 | +++ b/mm/page_alloc.c |
10366 | @@ -4532,11 +4532,11 @@ refill: |
10367 | /* Even if we own the page, we do not use atomic_set(). |
10368 | * This would break get_page_unless_zero() users. |
10369 | */ |
10370 | - page_ref_add(page, size - 1); |
10371 | + page_ref_add(page, size); |
10372 | |
10373 | /* reset page count bias and offset to start of new frag */ |
10374 | nc->pfmemalloc = page_is_pfmemalloc(page); |
10375 | - nc->pagecnt_bias = size; |
10376 | + nc->pagecnt_bias = size + 1; |
10377 | nc->offset = size; |
10378 | } |
10379 | |
10380 | @@ -4552,10 +4552,10 @@ refill: |
10381 | size = nc->size; |
10382 | #endif |
10383 | /* OK, page count is 0, we can safely set it */ |
10384 | - set_page_count(page, size); |
10385 | + set_page_count(page, size + 1); |
10386 | |
10387 | /* reset page count bias and offset to start of new frag */ |
10388 | - nc->pagecnt_bias = size; |
10389 | + nc->pagecnt_bias = size + 1; |
10390 | offset = size - fragsz; |
10391 | } |
10392 | |
10393 | diff --git a/mm/page_ext.c b/mm/page_ext.c |
10394 | index a9826da84ccb..4961f13b6ec1 100644 |
10395 | --- a/mm/page_ext.c |
10396 | +++ b/mm/page_ext.c |
10397 | @@ -398,10 +398,8 @@ void __init page_ext_init(void) |
10398 | * We know some arch can have a nodes layout such as |
10399 | * -------------pfn--------------> |
10400 | * N0 | N1 | N2 | N0 | N1 | N2|.... |
10401 | - * |
10402 | - * Take into account DEFERRED_STRUCT_PAGE_INIT. |
10403 | */ |
10404 | - if (early_pfn_to_nid(pfn) != nid) |
10405 | + if (pfn_to_nid(pfn) != nid) |
10406 | continue; |
10407 | if (init_section_page_ext(pfn, nid)) |
10408 | goto oom; |
10409 | diff --git a/mm/shmem.c b/mm/shmem.c |
10410 | index b6cf0e8e685b..3c8742655756 100644 |
10411 | --- a/mm/shmem.c |
10412 | +++ b/mm/shmem.c |
10413 | @@ -2895,16 +2895,20 @@ static int shmem_create(struct inode *dir, struct dentry *dentry, umode_t mode, |
10414 | static int shmem_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) |
10415 | { |
10416 | struct inode *inode = d_inode(old_dentry); |
10417 | - int ret; |
10418 | + int ret = 0; |
10419 | |
10420 | /* |
10421 | * No ordinary (disk based) filesystem counts links as inodes; |
10422 | * but each new link needs a new dentry, pinning lowmem, and |
10423 | * tmpfs dentries cannot be pruned until they are unlinked. |
10424 | + * But if an O_TMPFILE file is linked into the tmpfs, the |
10425 | + * first link must skip that, to get the accounting right. |
10426 | */ |
10427 | - ret = shmem_reserve_inode(inode->i_sb); |
10428 | - if (ret) |
10429 | - goto out; |
10430 | + if (inode->i_nlink) { |
10431 | + ret = shmem_reserve_inode(inode->i_sb); |
10432 | + if (ret) |
10433 | + goto out; |
10434 | + } |
10435 | |
10436 | dir->i_size += BOGO_DIRENT_SIZE; |
10437 | inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode); |
10438 | diff --git a/mm/swap.c b/mm/swap.c |
10439 | index 26fc9b5f1b6c..a3fc028e338e 100644 |
10440 | --- a/mm/swap.c |
10441 | +++ b/mm/swap.c |
10442 | @@ -321,11 +321,6 @@ static inline void activate_page_drain(int cpu) |
10443 | { |
10444 | } |
10445 | |
10446 | -static bool need_activate_page_drain(int cpu) |
10447 | -{ |
10448 | - return false; |
10449 | -} |
10450 | - |
10451 | void activate_page(struct page *page) |
10452 | { |
10453 | struct zone *zone = page_zone(page); |
10454 | @@ -654,13 +649,15 @@ void lru_add_drain(void) |
10455 | put_cpu(); |
10456 | } |
10457 | |
10458 | +#ifdef CONFIG_SMP |
10459 | + |
10460 | +static DEFINE_PER_CPU(struct work_struct, lru_add_drain_work); |
10461 | + |
10462 | static void lru_add_drain_per_cpu(struct work_struct *dummy) |
10463 | { |
10464 | lru_add_drain(); |
10465 | } |
10466 | |
10467 | -static DEFINE_PER_CPU(struct work_struct, lru_add_drain_work); |
10468 | - |
10469 | /* |
10470 | * Doesn't need any cpu hotplug locking because we do rely on per-cpu |
10471 | * kworkers being shut down before our page_alloc_cpu_dead callback is |
10472 | @@ -703,6 +700,12 @@ void lru_add_drain_all(void) |
10473 | |
10474 | mutex_unlock(&lock); |
10475 | } |
10476 | +#else |
10477 | +void lru_add_drain_all(void) |
10478 | +{ |
10479 | + lru_add_drain(); |
10480 | +} |
10481 | +#endif |
10482 | |
10483 | /** |
10484 | * release_pages - batched put_page() |
10485 | diff --git a/mm/vmalloc.c b/mm/vmalloc.c |
10486 | index a728fc492557..91a789a46b12 100644 |
10487 | --- a/mm/vmalloc.c |
10488 | +++ b/mm/vmalloc.c |
10489 | @@ -2244,7 +2244,7 @@ int remap_vmalloc_range_partial(struct vm_area_struct *vma, unsigned long uaddr, |
10490 | if (!(area->flags & VM_USERMAP)) |
10491 | return -EINVAL; |
10492 | |
10493 | - if (kaddr + size > area->addr + area->size) |
10494 | + if (kaddr + size > area->addr + get_vm_area_size(area)) |
10495 | return -EINVAL; |
10496 | |
10497 | do { |
10498 | diff --git a/net/9p/client.c b/net/9p/client.c |
10499 | index 75b7bf7c7f07..23ec6187dc07 100644 |
10500 | --- a/net/9p/client.c |
10501 | +++ b/net/9p/client.c |
10502 | @@ -1073,7 +1073,7 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) |
10503 | p9_debug(P9_DEBUG_ERROR, |
10504 | "Please specify a msize of at least 4k\n"); |
10505 | err = -EINVAL; |
10506 | - goto free_client; |
10507 | + goto close_trans; |
10508 | } |
10509 | |
10510 | err = p9_client_version(clnt); |
10511 | diff --git a/net/core/filter.c b/net/core/filter.c |
10512 | index bed9061102f4..eb81e9db4093 100644 |
10513 | --- a/net/core/filter.c |
10514 | +++ b/net/core/filter.c |
10515 | @@ -2614,8 +2614,7 @@ static int bpf_skb_proto_4_to_6(struct sk_buff *skb) |
10516 | u32 off = skb_mac_header_len(skb); |
10517 | int ret; |
10518 | |
10519 | - /* SCTP uses GSO_BY_FRAGS, thus cannot adjust it. */ |
10520 | - if (skb_is_gso(skb) && unlikely(skb_is_gso_sctp(skb))) |
10521 | + if (skb_is_gso(skb) && !skb_is_gso_tcp(skb)) |
10522 | return -ENOTSUPP; |
10523 | |
10524 | ret = skb_cow(skb, len_diff); |
10525 | @@ -2656,8 +2655,7 @@ static int bpf_skb_proto_6_to_4(struct sk_buff *skb) |
10526 | u32 off = skb_mac_header_len(skb); |
10527 | int ret; |
10528 | |
10529 | - /* SCTP uses GSO_BY_FRAGS, thus cannot adjust it. */ |
10530 | - if (skb_is_gso(skb) && unlikely(skb_is_gso_sctp(skb))) |
10531 | + if (skb_is_gso(skb) && !skb_is_gso_tcp(skb)) |
10532 | return -ENOTSUPP; |
10533 | |
10534 | ret = skb_unclone(skb, GFP_ATOMIC); |
10535 | @@ -2782,8 +2780,7 @@ static int bpf_skb_net_grow(struct sk_buff *skb, u32 len_diff) |
10536 | u32 off = skb_mac_header_len(skb) + bpf_skb_net_base_len(skb); |
10537 | int ret; |
10538 | |
10539 | - /* SCTP uses GSO_BY_FRAGS, thus cannot adjust it. */ |
10540 | - if (skb_is_gso(skb) && unlikely(skb_is_gso_sctp(skb))) |
10541 | + if (skb_is_gso(skb) && !skb_is_gso_tcp(skb)) |
10542 | return -ENOTSUPP; |
10543 | |
10544 | ret = skb_cow(skb, len_diff); |
10545 | @@ -2812,8 +2809,7 @@ static int bpf_skb_net_shrink(struct sk_buff *skb, u32 len_diff) |
10546 | u32 off = skb_mac_header_len(skb) + bpf_skb_net_base_len(skb); |
10547 | int ret; |
10548 | |
10549 | - /* SCTP uses GSO_BY_FRAGS, thus cannot adjust it. */ |
10550 | - if (skb_is_gso(skb) && unlikely(skb_is_gso_sctp(skb))) |
10551 | + if (skb_is_gso(skb) && !skb_is_gso_tcp(skb)) |
10552 | return -ENOTSUPP; |
10553 | |
10554 | ret = skb_unclone(skb, GFP_ATOMIC); |
10555 | diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c |
10556 | index 97689012b357..12a43a5369a5 100644 |
10557 | --- a/net/ipv4/esp4.c |
10558 | +++ b/net/ipv4/esp4.c |
10559 | @@ -325,7 +325,7 @@ int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info * |
10560 | skb->len += tailen; |
10561 | skb->data_len += tailen; |
10562 | skb->truesize += tailen; |
10563 | - if (sk) |
10564 | + if (sk && sk_fullsock(sk)) |
10565 | refcount_add(tailen, &sk->sk_wmem_alloc); |
10566 | |
10567 | goto out; |
10568 | diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c |
10569 | index 3cd237b42f44..2fa196325988 100644 |
10570 | --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c |
10571 | +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c |
10572 | @@ -846,9 +846,9 @@ static int clusterip_net_init(struct net *net) |
10573 | |
10574 | static void clusterip_net_exit(struct net *net) |
10575 | { |
10576 | +#ifdef CONFIG_PROC_FS |
10577 | struct clusterip_net *cn = clusterip_pernet(net); |
10578 | |
10579 | -#ifdef CONFIG_PROC_FS |
10580 | mutex_lock(&cn->mutex); |
10581 | proc_remove(cn->procdir); |
10582 | cn->procdir = NULL; |
10583 | diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c |
10584 | index 88a7579c23bd..a7d996148eed 100644 |
10585 | --- a/net/ipv6/esp6.c |
10586 | +++ b/net/ipv6/esp6.c |
10587 | @@ -293,7 +293,7 @@ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info |
10588 | skb->len += tailen; |
10589 | skb->data_len += tailen; |
10590 | skb->truesize += tailen; |
10591 | - if (sk) |
10592 | + if (sk && sk_fullsock(sk)) |
10593 | refcount_add(tailen, &sk->sk_wmem_alloc); |
10594 | |
10595 | goto out; |
10596 | diff --git a/net/key/af_key.c b/net/key/af_key.c |
10597 | index 9d61266526e7..7da629d59717 100644 |
10598 | --- a/net/key/af_key.c |
10599 | +++ b/net/key/af_key.c |
10600 | @@ -196,30 +196,22 @@ static int pfkey_release(struct socket *sock) |
10601 | return 0; |
10602 | } |
10603 | |
10604 | -static int pfkey_broadcast_one(struct sk_buff *skb, struct sk_buff **skb2, |
10605 | - gfp_t allocation, struct sock *sk) |
10606 | +static int pfkey_broadcast_one(struct sk_buff *skb, gfp_t allocation, |
10607 | + struct sock *sk) |
10608 | { |
10609 | int err = -ENOBUFS; |
10610 | |
10611 | - sock_hold(sk); |
10612 | - if (*skb2 == NULL) { |
10613 | - if (refcount_read(&skb->users) != 1) { |
10614 | - *skb2 = skb_clone(skb, allocation); |
10615 | - } else { |
10616 | - *skb2 = skb; |
10617 | - refcount_inc(&skb->users); |
10618 | - } |
10619 | - } |
10620 | - if (*skb2 != NULL) { |
10621 | - if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf) { |
10622 | - skb_set_owner_r(*skb2, sk); |
10623 | - skb_queue_tail(&sk->sk_receive_queue, *skb2); |
10624 | - sk->sk_data_ready(sk); |
10625 | - *skb2 = NULL; |
10626 | - err = 0; |
10627 | - } |
10628 | + if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf) |
10629 | + return err; |
10630 | + |
10631 | + skb = skb_clone(skb, allocation); |
10632 | + |
10633 | + if (skb) { |
10634 | + skb_set_owner_r(skb, sk); |
10635 | + skb_queue_tail(&sk->sk_receive_queue, skb); |
10636 | + sk->sk_data_ready(sk); |
10637 | + err = 0; |
10638 | } |
10639 | - sock_put(sk); |
10640 | return err; |
10641 | } |
10642 | |
10643 | @@ -234,7 +226,6 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, |
10644 | { |
10645 | struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); |
10646 | struct sock *sk; |
10647 | - struct sk_buff *skb2 = NULL; |
10648 | int err = -ESRCH; |
10649 | |
10650 | /* XXX Do we need something like netlink_overrun? I think |
10651 | @@ -253,7 +244,7 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, |
10652 | * socket. |
10653 | */ |
10654 | if (pfk->promisc) |
10655 | - pfkey_broadcast_one(skb, &skb2, GFP_ATOMIC, sk); |
10656 | + pfkey_broadcast_one(skb, GFP_ATOMIC, sk); |
10657 | |
10658 | /* the exact target will be processed later */ |
10659 | if (sk == one_sk) |
10660 | @@ -268,7 +259,7 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, |
10661 | continue; |
10662 | } |
10663 | |
10664 | - err2 = pfkey_broadcast_one(skb, &skb2, GFP_ATOMIC, sk); |
10665 | + err2 = pfkey_broadcast_one(skb, GFP_ATOMIC, sk); |
10666 | |
10667 | /* Error is cleared after successful sending to at least one |
10668 | * registered KM */ |
10669 | @@ -278,9 +269,8 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, |
10670 | rcu_read_unlock(); |
10671 | |
10672 | if (one_sk != NULL) |
10673 | - err = pfkey_broadcast_one(skb, &skb2, allocation, one_sk); |
10674 | + err = pfkey_broadcast_one(skb, allocation, one_sk); |
10675 | |
10676 | - kfree_skb(skb2); |
10677 | kfree_skb(skb); |
10678 | return err; |
10679 | } |
10680 | diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c |
10681 | index 69e831bc317b..54821fb1a960 100644 |
10682 | --- a/net/mac80211/agg-tx.c |
10683 | +++ b/net/mac80211/agg-tx.c |
10684 | @@ -8,7 +8,7 @@ |
10685 | * Copyright 2007, Michael Wu <flamingice@sourmilk.net> |
10686 | * Copyright 2007-2010, Intel Corporation |
10687 | * Copyright(c) 2015-2017 Intel Deutschland GmbH |
10688 | - * Copyright (C) 2018 Intel Corporation |
10689 | + * Copyright (C) 2018 - 2019 Intel Corporation |
10690 | * |
10691 | * This program is free software; you can redistribute it and/or modify |
10692 | * it under the terms of the GNU General Public License version 2 as |
10693 | @@ -366,6 +366,8 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, |
10694 | |
10695 | set_bit(HT_AGG_STATE_STOPPING, &tid_tx->state); |
10696 | |
10697 | + ieee80211_agg_stop_txq(sta, tid); |
10698 | + |
10699 | spin_unlock_bh(&sta->lock); |
10700 | |
10701 | ht_dbg(sta->sdata, "Tx BA session stop requested for %pM tid %u\n", |
10702 | diff --git a/net/mac80211/util.c b/net/mac80211/util.c |
10703 | index 716cd6442d86..3deaa01ebee4 100644 |
10704 | --- a/net/mac80211/util.c |
10705 | +++ b/net/mac80211/util.c |
10706 | @@ -5,7 +5,7 @@ |
10707 | * Copyright 2007 Johannes Berg <johannes@sipsolutions.net> |
10708 | * Copyright 2013-2014 Intel Mobile Communications GmbH |
10709 | * Copyright (C) 2015-2017 Intel Deutschland GmbH |
10710 | - * Copyright (C) 2018 Intel Corporation |
10711 | + * Copyright (C) 2018-2019 Intel Corporation |
10712 | * |
10713 | * This program is free software; you can redistribute it and/or modify |
10714 | * it under the terms of the GNU General Public License version 2 as |
10715 | @@ -2020,6 +2020,10 @@ int ieee80211_reconfig(struct ieee80211_local *local) |
10716 | case NL80211_IFTYPE_AP_VLAN: |
10717 | case NL80211_IFTYPE_MONITOR: |
10718 | break; |
10719 | + case NL80211_IFTYPE_ADHOC: |
10720 | + if (sdata->vif.bss_conf.ibss_joined) |
10721 | + WARN_ON(drv_join_ibss(local, sdata)); |
10722 | + /* fall through */ |
10723 | default: |
10724 | ieee80211_reconfig_stations(sdata); |
10725 | /* fall through */ |
10726 | diff --git a/net/netfilter/ipvs/Kconfig b/net/netfilter/ipvs/Kconfig |
10727 | index cad48d07c818..8401cefd9f65 100644 |
10728 | --- a/net/netfilter/ipvs/Kconfig |
10729 | +++ b/net/netfilter/ipvs/Kconfig |
10730 | @@ -29,6 +29,7 @@ config IP_VS_IPV6 |
10731 | bool "IPv6 support for IPVS" |
10732 | depends on IPV6 = y || IP_VS = IPV6 |
10733 | select IP6_NF_IPTABLES |
10734 | + select NF_DEFRAG_IPV6 |
10735 | ---help--- |
10736 | Add IPv6 support to IPVS. |
10737 | |
10738 | diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c |
10739 | index 7ca926a03b81..3f963ea22277 100644 |
10740 | --- a/net/netfilter/ipvs/ip_vs_core.c |
10741 | +++ b/net/netfilter/ipvs/ip_vs_core.c |
10742 | @@ -1536,14 +1536,12 @@ ip_vs_try_to_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb, |
10743 | /* sorry, all this trouble for a no-hit :) */ |
10744 | IP_VS_DBG_PKT(12, af, pp, skb, iph->off, |
10745 | "ip_vs_in: packet continues traversal as normal"); |
10746 | - if (iph->fragoffs) { |
10747 | - /* Fragment that couldn't be mapped to a conn entry |
10748 | - * is missing module nf_defrag_ipv6 |
10749 | - */ |
10750 | - IP_VS_DBG_RL("Unhandled frag, load nf_defrag_ipv6\n"); |
10751 | + |
10752 | + /* Fragment couldn't be mapped to a conn entry */ |
10753 | + if (iph->fragoffs) |
10754 | IP_VS_DBG_PKT(7, af, pp, skb, iph->off, |
10755 | "unhandled fragment"); |
10756 | - } |
10757 | + |
10758 | *verdict = NF_ACCEPT; |
10759 | return 0; |
10760 | } |
10761 | diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c |
10762 | index 55a77314340a..8fd8d06454d6 100644 |
10763 | --- a/net/netfilter/ipvs/ip_vs_ctl.c |
10764 | +++ b/net/netfilter/ipvs/ip_vs_ctl.c |
10765 | @@ -43,6 +43,7 @@ |
10766 | #ifdef CONFIG_IP_VS_IPV6 |
10767 | #include <net/ipv6.h> |
10768 | #include <net/ip6_route.h> |
10769 | +#include <net/netfilter/ipv6/nf_defrag_ipv6.h> |
10770 | #endif |
10771 | #include <net/route.h> |
10772 | #include <net/sock.h> |
10773 | @@ -895,6 +896,7 @@ ip_vs_new_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest, |
10774 | { |
10775 | struct ip_vs_dest *dest; |
10776 | unsigned int atype, i; |
10777 | + int ret = 0; |
10778 | |
10779 | EnterFunction(2); |
10780 | |
10781 | @@ -905,6 +907,10 @@ ip_vs_new_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest, |
10782 | atype & IPV6_ADDR_LINKLOCAL) && |
10783 | !__ip_vs_addr_is_local_v6(svc->ipvs->net, &udest->addr.in6)) |
10784 | return -EINVAL; |
10785 | + |
10786 | + ret = nf_defrag_ipv6_enable(svc->ipvs->net); |
10787 | + if (ret) |
10788 | + return ret; |
10789 | } else |
10790 | #endif |
10791 | { |
10792 | @@ -1228,6 +1234,10 @@ ip_vs_add_service(struct netns_ipvs *ipvs, struct ip_vs_service_user_kern *u, |
10793 | ret = -EINVAL; |
10794 | goto out_err; |
10795 | } |
10796 | + |
10797 | + ret = nf_defrag_ipv6_enable(ipvs->net); |
10798 | + if (ret) |
10799 | + goto out_err; |
10800 | } |
10801 | #endif |
10802 | |
10803 | diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c |
10804 | index aecadd471e1d..13e1ac333fa4 100644 |
10805 | --- a/net/netfilter/x_tables.c |
10806 | +++ b/net/netfilter/x_tables.c |
10807 | @@ -1899,7 +1899,7 @@ static int __init xt_init(void) |
10808 | seqcount_init(&per_cpu(xt_recseq, i)); |
10809 | } |
10810 | |
10811 | - xt = kmalloc_array(NFPROTO_NUMPROTO, sizeof(struct xt_af), GFP_KERNEL); |
10812 | + xt = kcalloc(NFPROTO_NUMPROTO, sizeof(struct xt_af), GFP_KERNEL); |
10813 | if (!xt) |
10814 | return -ENOMEM; |
10815 | |
10816 | diff --git a/net/phonet/pep.c b/net/phonet/pep.c |
10817 | index 9fc76b19cd3c..db3473540303 100644 |
10818 | --- a/net/phonet/pep.c |
10819 | +++ b/net/phonet/pep.c |
10820 | @@ -132,7 +132,7 @@ static int pep_indicate(struct sock *sk, u8 id, u8 code, |
10821 | ph->utid = 0; |
10822 | ph->message_id = id; |
10823 | ph->pipe_handle = pn->pipe_handle; |
10824 | - ph->data[0] = code; |
10825 | + ph->error_code = code; |
10826 | return pn_skb_send(sk, skb, NULL); |
10827 | } |
10828 | |
10829 | @@ -153,7 +153,7 @@ static int pipe_handler_request(struct sock *sk, u8 id, u8 code, |
10830 | ph->utid = id; /* whatever */ |
10831 | ph->message_id = id; |
10832 | ph->pipe_handle = pn->pipe_handle; |
10833 | - ph->data[0] = code; |
10834 | + ph->error_code = code; |
10835 | return pn_skb_send(sk, skb, NULL); |
10836 | } |
10837 | |
10838 | @@ -208,7 +208,7 @@ static int pep_ctrlreq_error(struct sock *sk, struct sk_buff *oskb, u8 code, |
10839 | struct pnpipehdr *ph; |
10840 | struct sockaddr_pn dst; |
10841 | u8 data[4] = { |
10842 | - oph->data[0], /* PEP type */ |
10843 | + oph->pep_type, /* PEP type */ |
10844 | code, /* error code, at an unusual offset */ |
10845 | PAD, PAD, |
10846 | }; |
10847 | @@ -221,7 +221,7 @@ static int pep_ctrlreq_error(struct sock *sk, struct sk_buff *oskb, u8 code, |
10848 | ph->utid = oph->utid; |
10849 | ph->message_id = PNS_PEP_CTRL_RESP; |
10850 | ph->pipe_handle = oph->pipe_handle; |
10851 | - ph->data[0] = oph->data[1]; /* CTRL id */ |
10852 | + ph->data0 = oph->data[0]; /* CTRL id */ |
10853 | |
10854 | pn_skb_get_src_sockaddr(oskb, &dst); |
10855 | return pn_skb_send(sk, skb, &dst); |
10856 | @@ -272,17 +272,17 @@ static int pipe_rcv_status(struct sock *sk, struct sk_buff *skb) |
10857 | return -EINVAL; |
10858 | |
10859 | hdr = pnp_hdr(skb); |
10860 | - if (hdr->data[0] != PN_PEP_TYPE_COMMON) { |
10861 | + if (hdr->pep_type != PN_PEP_TYPE_COMMON) { |
10862 | net_dbg_ratelimited("Phonet unknown PEP type: %u\n", |
10863 | - (unsigned int)hdr->data[0]); |
10864 | + (unsigned int)hdr->pep_type); |
10865 | return -EOPNOTSUPP; |
10866 | } |
10867 | |
10868 | - switch (hdr->data[1]) { |
10869 | + switch (hdr->data[0]) { |
10870 | case PN_PEP_IND_FLOW_CONTROL: |
10871 | switch (pn->tx_fc) { |
10872 | case PN_LEGACY_FLOW_CONTROL: |
10873 | - switch (hdr->data[4]) { |
10874 | + switch (hdr->data[3]) { |
10875 | case PEP_IND_BUSY: |
10876 | atomic_set(&pn->tx_credits, 0); |
10877 | break; |
10878 | @@ -292,7 +292,7 @@ static int pipe_rcv_status(struct sock *sk, struct sk_buff *skb) |
10879 | } |
10880 | break; |
10881 | case PN_ONE_CREDIT_FLOW_CONTROL: |
10882 | - if (hdr->data[4] == PEP_IND_READY) |
10883 | + if (hdr->data[3] == PEP_IND_READY) |
10884 | atomic_set(&pn->tx_credits, wake = 1); |
10885 | break; |
10886 | } |
10887 | @@ -301,12 +301,12 @@ static int pipe_rcv_status(struct sock *sk, struct sk_buff *skb) |
10888 | case PN_PEP_IND_ID_MCFC_GRANT_CREDITS: |
10889 | if (pn->tx_fc != PN_MULTI_CREDIT_FLOW_CONTROL) |
10890 | break; |
10891 | - atomic_add(wake = hdr->data[4], &pn->tx_credits); |
10892 | + atomic_add(wake = hdr->data[3], &pn->tx_credits); |
10893 | break; |
10894 | |
10895 | default: |
10896 | net_dbg_ratelimited("Phonet unknown PEP indication: %u\n", |
10897 | - (unsigned int)hdr->data[1]); |
10898 | + (unsigned int)hdr->data[0]); |
10899 | return -EOPNOTSUPP; |
10900 | } |
10901 | if (wake) |
10902 | @@ -318,7 +318,7 @@ static int pipe_rcv_created(struct sock *sk, struct sk_buff *skb) |
10903 | { |
10904 | struct pep_sock *pn = pep_sk(sk); |
10905 | struct pnpipehdr *hdr = pnp_hdr(skb); |
10906 | - u8 n_sb = hdr->data[0]; |
10907 | + u8 n_sb = hdr->data0; |
10908 | |
10909 | pn->rx_fc = pn->tx_fc = PN_LEGACY_FLOW_CONTROL; |
10910 | __skb_pull(skb, sizeof(*hdr)); |
10911 | @@ -506,7 +506,7 @@ static int pep_connresp_rcv(struct sock *sk, struct sk_buff *skb) |
10912 | return -ECONNREFUSED; |
10913 | |
10914 | /* Parse sub-blocks */ |
10915 | - n_sb = hdr->data[4]; |
10916 | + n_sb = hdr->data[3]; |
10917 | while (n_sb > 0) { |
10918 | u8 type, buf[6], len = sizeof(buf); |
10919 | const u8 *data = pep_get_sb(skb, &type, &len, buf); |
10920 | @@ -739,7 +739,7 @@ static int pipe_do_remove(struct sock *sk) |
10921 | ph->utid = 0; |
10922 | ph->message_id = PNS_PIPE_REMOVE_REQ; |
10923 | ph->pipe_handle = pn->pipe_handle; |
10924 | - ph->data[0] = PAD; |
10925 | + ph->data0 = PAD; |
10926 | return pn_skb_send(sk, skb, NULL); |
10927 | } |
10928 | |
10929 | @@ -817,7 +817,7 @@ static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp, |
10930 | peer_type = hdr->other_pep_type << 8; |
10931 | |
10932 | /* Parse sub-blocks (options) */ |
10933 | - n_sb = hdr->data[4]; |
10934 | + n_sb = hdr->data[3]; |
10935 | while (n_sb > 0) { |
10936 | u8 type, buf[1], len = sizeof(buf); |
10937 | const u8 *data = pep_get_sb(skb, &type, &len, buf); |
10938 | @@ -1109,7 +1109,7 @@ static int pipe_skb_send(struct sock *sk, struct sk_buff *skb) |
10939 | ph->utid = 0; |
10940 | if (pn->aligned) { |
10941 | ph->message_id = PNS_PIPE_ALIGNED_DATA; |
10942 | - ph->data[0] = 0; /* padding */ |
10943 | + ph->data0 = 0; /* padding */ |
10944 | } else |
10945 | ph->message_id = PNS_PIPE_DATA; |
10946 | ph->pipe_handle = pn->pipe_handle; |
10947 | diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c |
10948 | index 97a8282955a8..8566531c2f10 100644 |
10949 | --- a/net/sunrpc/svcsock.c |
10950 | +++ b/net/sunrpc/svcsock.c |
10951 | @@ -381,12 +381,16 @@ static int svc_partial_recvfrom(struct svc_rqst *rqstp, |
10952 | /* |
10953 | * Set socket snd and rcv buffer lengths |
10954 | */ |
10955 | -static void svc_sock_setbufsize(struct socket *sock, unsigned int snd, |
10956 | - unsigned int rcv) |
10957 | +static void svc_sock_setbufsize(struct svc_sock *svsk, unsigned int nreqs) |
10958 | { |
10959 | + unsigned int max_mesg = svsk->sk_xprt.xpt_server->sv_max_mesg; |
10960 | + struct socket *sock = svsk->sk_sock; |
10961 | + |
10962 | + nreqs = min(nreqs, INT_MAX / 2 / max_mesg); |
10963 | + |
10964 | lock_sock(sock->sk); |
10965 | - sock->sk->sk_sndbuf = snd * 2; |
10966 | - sock->sk->sk_rcvbuf = rcv * 2; |
10967 | + sock->sk->sk_sndbuf = nreqs * max_mesg * 2; |
10968 | + sock->sk->sk_rcvbuf = nreqs * max_mesg * 2; |
10969 | sock->sk->sk_write_space(sock->sk); |
10970 | release_sock(sock->sk); |
10971 | } |
10972 | @@ -548,9 +552,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) |
10973 | * provides an upper bound on the number of threads |
10974 | * which will access the socket. |
10975 | */ |
10976 | - svc_sock_setbufsize(svsk->sk_sock, |
10977 | - (serv->sv_nrthreads+3) * serv->sv_max_mesg, |
10978 | - (serv->sv_nrthreads+3) * serv->sv_max_mesg); |
10979 | + svc_sock_setbufsize(svsk, serv->sv_nrthreads + 3); |
10980 | |
10981 | clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); |
10982 | skb = NULL; |
10983 | @@ -718,9 +720,7 @@ static void svc_udp_init(struct svc_sock *svsk, struct svc_serv *serv) |
10984 | * receive and respond to one request. |
10985 | * svc_udp_recvfrom will re-adjust if necessary |
10986 | */ |
10987 | - svc_sock_setbufsize(svsk->sk_sock, |
10988 | - 3 * svsk->sk_xprt.xpt_server->sv_max_mesg, |
10989 | - 3 * svsk->sk_xprt.xpt_server->sv_max_mesg); |
10990 | + svc_sock_setbufsize(svsk, 3); |
10991 | |
10992 | /* data might have come in before data_ready set up */ |
10993 | set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); |
10994 | diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c |
10995 | index 3d6bf790cf1f..5ddbf227e7c6 100644 |
10996 | --- a/net/sunrpc/xprtrdma/verbs.c |
10997 | +++ b/net/sunrpc/xprtrdma/verbs.c |
10998 | @@ -546,7 +546,8 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia, |
10999 | |
11000 | sendcq = ib_alloc_cq(ia->ri_device, NULL, |
11001 | ep->rep_attr.cap.max_send_wr + 1, |
11002 | - 1, IB_POLL_WORKQUEUE); |
11003 | + ia->ri_device->num_comp_vectors > 1 ? 1 : 0, |
11004 | + IB_POLL_WORKQUEUE); |
11005 | if (IS_ERR(sendcq)) { |
11006 | rc = PTR_ERR(sendcq); |
11007 | dprintk("RPC: %s: failed to create send CQ: %i\n", |
11008 | diff --git a/net/xfrm/xfrm_interface.c b/net/xfrm/xfrm_interface.c |
11009 | index 6f05e831a73e..82723ef44db3 100644 |
11010 | --- a/net/xfrm/xfrm_interface.c |
11011 | +++ b/net/xfrm/xfrm_interface.c |
11012 | @@ -76,10 +76,10 @@ static struct xfrm_if *xfrmi_decode_session(struct sk_buff *skb) |
11013 | int ifindex; |
11014 | struct xfrm_if *xi; |
11015 | |
11016 | - if (!skb->dev) |
11017 | + if (!secpath_exists(skb) || !skb->dev) |
11018 | return NULL; |
11019 | |
11020 | - xfrmn = net_generic(dev_net(skb->dev), xfrmi_net_id); |
11021 | + xfrmn = net_generic(xs_net(xfrm_input_state(skb)), xfrmi_net_id); |
11022 | ifindex = skb->dev->ifindex; |
11023 | |
11024 | for_each_xfrmi_rcu(xfrmn->xfrmi[0], xi) { |
11025 | diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c |
11026 | index 6ea8036fcdbe..bf5d59270f79 100644 |
11027 | --- a/net/xfrm/xfrm_policy.c |
11028 | +++ b/net/xfrm/xfrm_policy.c |
11029 | @@ -2340,8 +2340,10 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, |
11030 | |
11031 | if (ifcb) { |
11032 | xi = ifcb->decode_session(skb); |
11033 | - if (xi) |
11034 | + if (xi) { |
11035 | if_id = xi->p.if_id; |
11036 | + net = xi->net; |
11037 | + } |
11038 | } |
11039 | rcu_read_unlock(); |
11040 | |
11041 | diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c |
11042 | index a9186a98a37d..0c9c54b57515 100644 |
11043 | --- a/scripts/kallsyms.c |
11044 | +++ b/scripts/kallsyms.c |
11045 | @@ -120,8 +120,8 @@ static int read_symbol(FILE *in, struct sym_entry *s) |
11046 | fprintf(stderr, "Read error or end of file.\n"); |
11047 | return -1; |
11048 | } |
11049 | - if (strlen(sym) > KSYM_NAME_LEN) { |
11050 | - fprintf(stderr, "Symbol %s too long for kallsyms (%zu vs %d).\n" |
11051 | + if (strlen(sym) >= KSYM_NAME_LEN) { |
11052 | + fprintf(stderr, "Symbol %s too long for kallsyms (%zu >= %d).\n" |
11053 | "Please increase KSYM_NAME_LEN both in kernel and kallsyms.c\n", |
11054 | sym, strlen(sym), KSYM_NAME_LEN); |
11055 | return -1; |
11056 | diff --git a/security/keys/internal.h b/security/keys/internal.h |
11057 | index 9f8208dc0e55..a02742621c8d 100644 |
11058 | --- a/security/keys/internal.h |
11059 | +++ b/security/keys/internal.h |
11060 | @@ -188,20 +188,9 @@ static inline int key_permission(const key_ref_t key_ref, unsigned perm) |
11061 | return key_task_permission(key_ref, current_cred(), perm); |
11062 | } |
11063 | |
11064 | -/* |
11065 | - * Authorisation record for request_key(). |
11066 | - */ |
11067 | -struct request_key_auth { |
11068 | - struct key *target_key; |
11069 | - struct key *dest_keyring; |
11070 | - const struct cred *cred; |
11071 | - void *callout_info; |
11072 | - size_t callout_len; |
11073 | - pid_t pid; |
11074 | -} __randomize_layout; |
11075 | - |
11076 | extern struct key_type key_type_request_key_auth; |
11077 | extern struct key *request_key_auth_new(struct key *target, |
11078 | + const char *op, |
11079 | const void *callout_info, |
11080 | size_t callout_len, |
11081 | struct key *dest_keyring); |
11082 | diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c |
11083 | index 1ffe60bb2845..ca31af186abd 100644 |
11084 | --- a/security/keys/keyctl.c |
11085 | +++ b/security/keys/keyctl.c |
11086 | @@ -26,6 +26,7 @@ |
11087 | #include <linux/security.h> |
11088 | #include <linux/uio.h> |
11089 | #include <linux/uaccess.h> |
11090 | +#include <keys/request_key_auth-type.h> |
11091 | #include "internal.h" |
11092 | |
11093 | #define KEY_MAX_DESC_SIZE 4096 |
11094 | diff --git a/security/keys/process_keys.c b/security/keys/process_keys.c |
11095 | index d5b25e535d3a..d776d2114651 100644 |
11096 | --- a/security/keys/process_keys.c |
11097 | +++ b/security/keys/process_keys.c |
11098 | @@ -20,6 +20,7 @@ |
11099 | #include <linux/security.h> |
11100 | #include <linux/user_namespace.h> |
11101 | #include <linux/uaccess.h> |
11102 | +#include <keys/request_key_auth-type.h> |
11103 | #include "internal.h" |
11104 | |
11105 | /* Session keyring create vs join semaphore */ |
11106 | diff --git a/security/keys/request_key.c b/security/keys/request_key.c |
11107 | index 738553698649..1a547cec8385 100644 |
11108 | --- a/security/keys/request_key.c |
11109 | +++ b/security/keys/request_key.c |
11110 | @@ -18,31 +18,30 @@ |
11111 | #include <linux/keyctl.h> |
11112 | #include <linux/slab.h> |
11113 | #include "internal.h" |
11114 | +#include <keys/request_key_auth-type.h> |
11115 | |
11116 | #define key_negative_timeout 60 /* default timeout on a negative key's existence */ |
11117 | |
11118 | /** |
11119 | * complete_request_key - Complete the construction of a key. |
11120 | - * @cons: The key construction record. |
11121 | + * @auth_key: The authorisation key. |
11122 | * @error: The success or failute of the construction. |
11123 | * |
11124 | * Complete the attempt to construct a key. The key will be negated |
11125 | * if an error is indicated. The authorisation key will be revoked |
11126 | * unconditionally. |
11127 | */ |
11128 | -void complete_request_key(struct key_construction *cons, int error) |
11129 | +void complete_request_key(struct key *authkey, int error) |
11130 | { |
11131 | - kenter("{%d,%d},%d", cons->key->serial, cons->authkey->serial, error); |
11132 | + struct request_key_auth *rka = get_request_key_auth(authkey); |
11133 | + struct key *key = rka->target_key; |
11134 | + |
11135 | + kenter("%d{%d},%d", authkey->serial, key->serial, error); |
11136 | |
11137 | if (error < 0) |
11138 | - key_negate_and_link(cons->key, key_negative_timeout, NULL, |
11139 | - cons->authkey); |
11140 | + key_negate_and_link(key, key_negative_timeout, NULL, authkey); |
11141 | else |
11142 | - key_revoke(cons->authkey); |
11143 | - |
11144 | - key_put(cons->key); |
11145 | - key_put(cons->authkey); |
11146 | - kfree(cons); |
11147 | + key_revoke(authkey); |
11148 | } |
11149 | EXPORT_SYMBOL(complete_request_key); |
11150 | |
11151 | @@ -91,21 +90,19 @@ static int call_usermodehelper_keys(const char *path, char **argv, char **envp, |
11152 | * Request userspace finish the construction of a key |
11153 | * - execute "/sbin/request-key <op> <key> <uid> <gid> <keyring> <keyring> <keyring>" |
11154 | */ |
11155 | -static int call_sbin_request_key(struct key_construction *cons, |
11156 | - const char *op, |
11157 | - void *aux) |
11158 | +static int call_sbin_request_key(struct key *authkey, void *aux) |
11159 | { |
11160 | static char const request_key[] = "/sbin/request-key"; |
11161 | + struct request_key_auth *rka = get_request_key_auth(authkey); |
11162 | const struct cred *cred = current_cred(); |
11163 | key_serial_t prkey, sskey; |
11164 | - struct key *key = cons->key, *authkey = cons->authkey, *keyring, |
11165 | - *session; |
11166 | + struct key *key = rka->target_key, *keyring, *session; |
11167 | char *argv[9], *envp[3], uid_str[12], gid_str[12]; |
11168 | char key_str[12], keyring_str[3][12]; |
11169 | char desc[20]; |
11170 | int ret, i; |
11171 | |
11172 | - kenter("{%d},{%d},%s", key->serial, authkey->serial, op); |
11173 | + kenter("{%d},{%d},%s", key->serial, authkey->serial, rka->op); |
11174 | |
11175 | ret = install_user_keyrings(); |
11176 | if (ret < 0) |
11177 | @@ -163,7 +160,7 @@ static int call_sbin_request_key(struct key_construction *cons, |
11178 | /* set up the argument list */ |
11179 | i = 0; |
11180 | argv[i++] = (char *)request_key; |
11181 | - argv[i++] = (char *) op; |
11182 | + argv[i++] = (char *)rka->op; |
11183 | argv[i++] = key_str; |
11184 | argv[i++] = uid_str; |
11185 | argv[i++] = gid_str; |
11186 | @@ -191,7 +188,7 @@ error_link: |
11187 | key_put(keyring); |
11188 | |
11189 | error_alloc: |
11190 | - complete_request_key(cons, ret); |
11191 | + complete_request_key(authkey, ret); |
11192 | kleave(" = %d", ret); |
11193 | return ret; |
11194 | } |
11195 | @@ -205,42 +202,31 @@ static int construct_key(struct key *key, const void *callout_info, |
11196 | size_t callout_len, void *aux, |
11197 | struct key *dest_keyring) |
11198 | { |
11199 | - struct key_construction *cons; |
11200 | request_key_actor_t actor; |
11201 | struct key *authkey; |
11202 | int ret; |
11203 | |
11204 | kenter("%d,%p,%zu,%p", key->serial, callout_info, callout_len, aux); |
11205 | |
11206 | - cons = kmalloc(sizeof(*cons), GFP_KERNEL); |
11207 | - if (!cons) |
11208 | - return -ENOMEM; |
11209 | - |
11210 | /* allocate an authorisation key */ |
11211 | - authkey = request_key_auth_new(key, callout_info, callout_len, |
11212 | + authkey = request_key_auth_new(key, "create", callout_info, callout_len, |
11213 | dest_keyring); |
11214 | - if (IS_ERR(authkey)) { |
11215 | - kfree(cons); |
11216 | - ret = PTR_ERR(authkey); |
11217 | - authkey = NULL; |
11218 | - } else { |
11219 | - cons->authkey = key_get(authkey); |
11220 | - cons->key = key_get(key); |
11221 | + if (IS_ERR(authkey)) |
11222 | + return PTR_ERR(authkey); |
11223 | |
11224 | - /* make the call */ |
11225 | - actor = call_sbin_request_key; |
11226 | - if (key->type->request_key) |
11227 | - actor = key->type->request_key; |
11228 | + /* Make the call */ |
11229 | + actor = call_sbin_request_key; |
11230 | + if (key->type->request_key) |
11231 | + actor = key->type->request_key; |
11232 | |
11233 | - ret = actor(cons, "create", aux); |
11234 | + ret = actor(authkey, aux); |
11235 | |
11236 | - /* check that the actor called complete_request_key() prior to |
11237 | - * returning an error */ |
11238 | - WARN_ON(ret < 0 && |
11239 | - !test_bit(KEY_FLAG_REVOKED, &authkey->flags)); |
11240 | - key_put(authkey); |
11241 | - } |
11242 | + /* check that the actor called complete_request_key() prior to |
11243 | + * returning an error */ |
11244 | + WARN_ON(ret < 0 && |
11245 | + !test_bit(KEY_FLAG_REVOKED, &authkey->flags)); |
11246 | |
11247 | + key_put(authkey); |
11248 | kleave(" = %d", ret); |
11249 | return ret; |
11250 | } |
11251 | @@ -275,7 +261,7 @@ static int construct_get_dest_keyring(struct key **_dest_keyring) |
11252 | if (cred->request_key_auth) { |
11253 | authkey = cred->request_key_auth; |
11254 | down_read(&authkey->sem); |
11255 | - rka = authkey->payload.data[0]; |
11256 | + rka = get_request_key_auth(authkey); |
11257 | if (!test_bit(KEY_FLAG_REVOKED, |
11258 | &authkey->flags)) |
11259 | dest_keyring = |
11260 | diff --git a/security/keys/request_key_auth.c b/security/keys/request_key_auth.c |
11261 | index 6797843154f0..5e515791ccd1 100644 |
11262 | --- a/security/keys/request_key_auth.c |
11263 | +++ b/security/keys/request_key_auth.c |
11264 | @@ -18,7 +18,7 @@ |
11265 | #include <linux/slab.h> |
11266 | #include <linux/uaccess.h> |
11267 | #include "internal.h" |
11268 | -#include <keys/user-type.h> |
11269 | +#include <keys/request_key_auth-type.h> |
11270 | |
11271 | static int request_key_auth_preparse(struct key_preparsed_payload *); |
11272 | static void request_key_auth_free_preparse(struct key_preparsed_payload *); |
11273 | @@ -69,7 +69,7 @@ static int request_key_auth_instantiate(struct key *key, |
11274 | static void request_key_auth_describe(const struct key *key, |
11275 | struct seq_file *m) |
11276 | { |
11277 | - struct request_key_auth *rka = key->payload.data[0]; |
11278 | + struct request_key_auth *rka = get_request_key_auth(key); |
11279 | |
11280 | seq_puts(m, "key:"); |
11281 | seq_puts(m, key->description); |
11282 | @@ -84,7 +84,7 @@ static void request_key_auth_describe(const struct key *key, |
11283 | static long request_key_auth_read(const struct key *key, |
11284 | char __user *buffer, size_t buflen) |
11285 | { |
11286 | - struct request_key_auth *rka = key->payload.data[0]; |
11287 | + struct request_key_auth *rka = get_request_key_auth(key); |
11288 | size_t datalen; |
11289 | long ret; |
11290 | |
11291 | @@ -110,7 +110,7 @@ static long request_key_auth_read(const struct key *key, |
11292 | */ |
11293 | static void request_key_auth_revoke(struct key *key) |
11294 | { |
11295 | - struct request_key_auth *rka = key->payload.data[0]; |
11296 | + struct request_key_auth *rka = get_request_key_auth(key); |
11297 | |
11298 | kenter("{%d}", key->serial); |
11299 | |
11300 | @@ -137,7 +137,7 @@ static void free_request_key_auth(struct request_key_auth *rka) |
11301 | */ |
11302 | static void request_key_auth_destroy(struct key *key) |
11303 | { |
11304 | - struct request_key_auth *rka = key->payload.data[0]; |
11305 | + struct request_key_auth *rka = get_request_key_auth(key); |
11306 | |
11307 | kenter("{%d}", key->serial); |
11308 | |
11309 | @@ -148,8 +148,9 @@ static void request_key_auth_destroy(struct key *key) |
11310 | * Create an authorisation token for /sbin/request-key or whoever to gain |
11311 | * access to the caller's security data. |
11312 | */ |
11313 | -struct key *request_key_auth_new(struct key *target, const void *callout_info, |
11314 | - size_t callout_len, struct key *dest_keyring) |
11315 | +struct key *request_key_auth_new(struct key *target, const char *op, |
11316 | + const void *callout_info, size_t callout_len, |
11317 | + struct key *dest_keyring) |
11318 | { |
11319 | struct request_key_auth *rka, *irka; |
11320 | const struct cred *cred = current->cred; |
11321 | @@ -167,6 +168,7 @@ struct key *request_key_auth_new(struct key *target, const void *callout_info, |
11322 | if (!rka->callout_info) |
11323 | goto error_free_rka; |
11324 | rka->callout_len = callout_len; |
11325 | + strlcpy(rka->op, op, sizeof(rka->op)); |
11326 | |
11327 | /* see if the calling process is already servicing the key request of |
11328 | * another process */ |
11329 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c |
11330 | index 3c3878f0d2fa..6ea3d3aa1a1e 100644 |
11331 | --- a/security/selinux/hooks.c |
11332 | +++ b/security/selinux/hooks.c |
11333 | @@ -1034,8 +1034,11 @@ static int selinux_sb_clone_mnt_opts(const struct super_block *oldsb, |
11334 | BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED)); |
11335 | |
11336 | /* if fs is reusing a sb, make sure that the contexts match */ |
11337 | - if (newsbsec->flags & SE_SBINITIALIZED) |
11338 | + if (newsbsec->flags & SE_SBINITIALIZED) { |
11339 | + if ((kern_flags & SECURITY_LSM_NATIVE_LABELS) && !set_context) |
11340 | + *set_kern_flags |= SECURITY_LSM_NATIVE_LABELS; |
11341 | return selinux_cmp_sb_context(oldsb, newsb); |
11342 | + } |
11343 | |
11344 | mutex_lock(&newsbsec->lock); |
11345 | |
11346 | @@ -5334,6 +5337,9 @@ static int selinux_sctp_bind_connect(struct sock *sk, int optname, |
11347 | return -EINVAL; |
11348 | } |
11349 | |
11350 | + if (walk_size + len > addrlen) |
11351 | + return -EINVAL; |
11352 | + |
11353 | err = -EINVAL; |
11354 | switch (optname) { |
11355 | /* Bind checks */ |
11356 | diff --git a/sound/soc/codecs/pcm186x.c b/sound/soc/codecs/pcm186x.c |
11357 | index 690c26e7389e..3be0e1478d7d 100644 |
11358 | --- a/sound/soc/codecs/pcm186x.c |
11359 | +++ b/sound/soc/codecs/pcm186x.c |
11360 | @@ -42,7 +42,7 @@ struct pcm186x_priv { |
11361 | bool is_master_mode; |
11362 | }; |
11363 | |
11364 | -static const DECLARE_TLV_DB_SCALE(pcm186x_pga_tlv, -1200, 4000, 50); |
11365 | +static const DECLARE_TLV_DB_SCALE(pcm186x_pga_tlv, -1200, 50, 0); |
11366 | |
11367 | static const struct snd_kcontrol_new pcm1863_snd_controls[] = { |
11368 | SOC_DOUBLE_R_S_TLV("ADC Capture Volume", PCM186X_PGA_VAL_CH1_L, |
11369 | @@ -158,7 +158,7 @@ static const struct snd_soc_dapm_widget pcm1863_dapm_widgets[] = { |
11370 | * Put the codec into SLEEP mode when not in use, allowing the |
11371 | * Energysense mechanism to operate. |
11372 | */ |
11373 | - SND_SOC_DAPM_ADC("ADC", "HiFi Capture", PCM186X_POWER_CTRL, 1, 0), |
11374 | + SND_SOC_DAPM_ADC("ADC", "HiFi Capture", PCM186X_POWER_CTRL, 1, 1), |
11375 | }; |
11376 | |
11377 | static const struct snd_soc_dapm_widget pcm1865_dapm_widgets[] = { |
11378 | @@ -184,8 +184,8 @@ static const struct snd_soc_dapm_widget pcm1865_dapm_widgets[] = { |
11379 | * Put the codec into SLEEP mode when not in use, allowing the |
11380 | * Energysense mechanism to operate. |
11381 | */ |
11382 | - SND_SOC_DAPM_ADC("ADC1", "HiFi Capture 1", PCM186X_POWER_CTRL, 1, 0), |
11383 | - SND_SOC_DAPM_ADC("ADC2", "HiFi Capture 2", PCM186X_POWER_CTRL, 1, 0), |
11384 | + SND_SOC_DAPM_ADC("ADC1", "HiFi Capture 1", PCM186X_POWER_CTRL, 1, 1), |
11385 | + SND_SOC_DAPM_ADC("ADC2", "HiFi Capture 2", PCM186X_POWER_CTRL, 1, 1), |
11386 | }; |
11387 | |
11388 | static const struct snd_soc_dapm_route pcm1863_dapm_routes[] = { |
11389 | diff --git a/sound/soc/codecs/rt5682.c b/sound/soc/codecs/rt5682.c |
11390 | index afe7d5b19313..79ebcc239786 100644 |
11391 | --- a/sound/soc/codecs/rt5682.c |
11392 | +++ b/sound/soc/codecs/rt5682.c |
11393 | @@ -1757,7 +1757,9 @@ static const struct snd_soc_dapm_route rt5682_dapm_routes[] = { |
11394 | {"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc}, |
11395 | {"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc}, |
11396 | {"ADC STO1 ASRC", NULL, "AD ASRC"}, |
11397 | + {"ADC STO1 ASRC", NULL, "DA ASRC"}, |
11398 | {"ADC STO1 ASRC", NULL, "CLKDET"}, |
11399 | + {"DAC STO1 ASRC", NULL, "AD ASRC"}, |
11400 | {"DAC STO1 ASRC", NULL, "DA ASRC"}, |
11401 | {"DAC STO1 ASRC", NULL, "CLKDET"}, |
11402 | |
11403 | diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c |
11404 | index c1d1d06783e5..4daefa5b150a 100644 |
11405 | --- a/sound/soc/fsl/fsl_esai.c |
11406 | +++ b/sound/soc/fsl/fsl_esai.c |
11407 | @@ -398,7 +398,8 @@ static int fsl_esai_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) |
11408 | break; |
11409 | case SND_SOC_DAIFMT_RIGHT_J: |
11410 | /* Data on rising edge of bclk, frame high, right aligned */ |
11411 | - xccr |= ESAI_xCCR_xCKP | ESAI_xCCR_xHCKP | ESAI_xCR_xWA; |
11412 | + xccr |= ESAI_xCCR_xCKP | ESAI_xCCR_xHCKP; |
11413 | + xcr |= ESAI_xCR_xWA; |
11414 | break; |
11415 | case SND_SOC_DAIFMT_DSP_A: |
11416 | /* Data on rising edge of bclk, frame high, 1clk before data */ |
11417 | @@ -455,12 +456,12 @@ static int fsl_esai_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) |
11418 | return -EINVAL; |
11419 | } |
11420 | |
11421 | - mask = ESAI_xCR_xFSL | ESAI_xCR_xFSR; |
11422 | + mask = ESAI_xCR_xFSL | ESAI_xCR_xFSR | ESAI_xCR_xWA; |
11423 | regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR, mask, xcr); |
11424 | regmap_update_bits(esai_priv->regmap, REG_ESAI_RCR, mask, xcr); |
11425 | |
11426 | mask = ESAI_xCCR_xCKP | ESAI_xCCR_xHCKP | ESAI_xCCR_xFSP | |
11427 | - ESAI_xCCR_xFSD | ESAI_xCCR_xCKD | ESAI_xCR_xWA; |
11428 | + ESAI_xCCR_xFSD | ESAI_xCCR_xCKD; |
11429 | regmap_update_bits(esai_priv->regmap, REG_ESAI_TCCR, mask, xccr); |
11430 | regmap_update_bits(esai_priv->regmap, REG_ESAI_RCCR, mask, xccr); |
11431 | |
11432 | diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c |
11433 | index d6c62aa13041..ce00fe2f6aae 100644 |
11434 | --- a/sound/soc/samsung/i2s.c |
11435 | +++ b/sound/soc/samsung/i2s.c |
11436 | @@ -700,6 +700,7 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, |
11437 | { |
11438 | struct i2s_dai *i2s = to_info(dai); |
11439 | u32 mod, mask = 0, val = 0; |
11440 | + struct clk *rclksrc; |
11441 | unsigned long flags; |
11442 | |
11443 | WARN_ON(!pm_runtime_active(dai->dev)); |
11444 | @@ -782,6 +783,10 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, |
11445 | |
11446 | i2s->frmclk = params_rate(params); |
11447 | |
11448 | + rclksrc = i2s->clk_table[CLK_I2S_RCLK_SRC]; |
11449 | + if (rclksrc && !IS_ERR(rclksrc)) |
11450 | + i2s->rclk_srcrate = clk_get_rate(rclksrc); |
11451 | + |
11452 | return 0; |
11453 | } |
11454 | |
11455 | @@ -886,11 +891,6 @@ static int config_setup(struct i2s_dai *i2s) |
11456 | return 0; |
11457 | |
11458 | if (!(i2s->quirks & QUIRK_NO_MUXPSR)) { |
11459 | - struct clk *rclksrc = i2s->clk_table[CLK_I2S_RCLK_SRC]; |
11460 | - |
11461 | - if (rclksrc && !IS_ERR(rclksrc)) |
11462 | - i2s->rclk_srcrate = clk_get_rate(rclksrc); |
11463 | - |
11464 | psr = i2s->rclk_srcrate / i2s->frmclk / rfs; |
11465 | writel(((psr - 1) << 8) | PSR_PSREN, i2s->addr + I2SPSR); |
11466 | dev_dbg(&i2s->pdev->dev, |
11467 | diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c |
11468 | index a566dae3ec8a..9410e0a9b14b 100644 |
11469 | --- a/sound/soc/sh/rcar/ssi.c |
11470 | +++ b/sound/soc/sh/rcar/ssi.c |
11471 | @@ -283,7 +283,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod, |
11472 | if (rsnd_ssi_is_multi_slave(mod, io)) |
11473 | return 0; |
11474 | |
11475 | - if (ssi->usrcnt > 1) { |
11476 | + if (ssi->usrcnt > 0) { |
11477 | if (ssi->rate != rate) { |
11478 | dev_err(dev, "SSI parent/child should use same rate\n"); |
11479 | return -EINVAL; |
11480 | diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c |
11481 | index 653706945222..9b78fb3daa7b 100644 |
11482 | --- a/sound/soc/soc-dapm.c |
11483 | +++ b/sound/soc/soc-dapm.c |
11484 | @@ -71,12 +71,16 @@ static int dapm_up_seq[] = { |
11485 | [snd_soc_dapm_clock_supply] = 1, |
11486 | [snd_soc_dapm_supply] = 2, |
11487 | [snd_soc_dapm_micbias] = 3, |
11488 | + [snd_soc_dapm_vmid] = 3, |
11489 | [snd_soc_dapm_dai_link] = 2, |
11490 | [snd_soc_dapm_dai_in] = 4, |
11491 | [snd_soc_dapm_dai_out] = 4, |
11492 | [snd_soc_dapm_aif_in] = 4, |
11493 | [snd_soc_dapm_aif_out] = 4, |
11494 | [snd_soc_dapm_mic] = 5, |
11495 | + [snd_soc_dapm_siggen] = 5, |
11496 | + [snd_soc_dapm_input] = 5, |
11497 | + [snd_soc_dapm_output] = 5, |
11498 | [snd_soc_dapm_mux] = 6, |
11499 | [snd_soc_dapm_demux] = 6, |
11500 | [snd_soc_dapm_dac] = 7, |
11501 | @@ -84,11 +88,19 @@ static int dapm_up_seq[] = { |
11502 | [snd_soc_dapm_mixer] = 8, |
11503 | [snd_soc_dapm_mixer_named_ctl] = 8, |
11504 | [snd_soc_dapm_pga] = 9, |
11505 | + [snd_soc_dapm_buffer] = 9, |
11506 | + [snd_soc_dapm_scheduler] = 9, |
11507 | + [snd_soc_dapm_effect] = 9, |
11508 | + [snd_soc_dapm_src] = 9, |
11509 | + [snd_soc_dapm_asrc] = 9, |
11510 | + [snd_soc_dapm_encoder] = 9, |
11511 | + [snd_soc_dapm_decoder] = 9, |
11512 | [snd_soc_dapm_adc] = 10, |
11513 | [snd_soc_dapm_out_drv] = 11, |
11514 | [snd_soc_dapm_hp] = 11, |
11515 | [snd_soc_dapm_spk] = 11, |
11516 | [snd_soc_dapm_line] = 11, |
11517 | + [snd_soc_dapm_sink] = 11, |
11518 | [snd_soc_dapm_kcontrol] = 12, |
11519 | [snd_soc_dapm_post] = 13, |
11520 | }; |
11521 | @@ -101,13 +113,25 @@ static int dapm_down_seq[] = { |
11522 | [snd_soc_dapm_spk] = 3, |
11523 | [snd_soc_dapm_line] = 3, |
11524 | [snd_soc_dapm_out_drv] = 3, |
11525 | + [snd_soc_dapm_sink] = 3, |
11526 | [snd_soc_dapm_pga] = 4, |
11527 | + [snd_soc_dapm_buffer] = 4, |
11528 | + [snd_soc_dapm_scheduler] = 4, |
11529 | + [snd_soc_dapm_effect] = 4, |
11530 | + [snd_soc_dapm_src] = 4, |
11531 | + [snd_soc_dapm_asrc] = 4, |
11532 | + [snd_soc_dapm_encoder] = 4, |
11533 | + [snd_soc_dapm_decoder] = 4, |
11534 | [snd_soc_dapm_switch] = 5, |
11535 | [snd_soc_dapm_mixer_named_ctl] = 5, |
11536 | [snd_soc_dapm_mixer] = 5, |
11537 | [snd_soc_dapm_dac] = 6, |
11538 | [snd_soc_dapm_mic] = 7, |
11539 | + [snd_soc_dapm_siggen] = 7, |
11540 | + [snd_soc_dapm_input] = 7, |
11541 | + [snd_soc_dapm_output] = 7, |
11542 | [snd_soc_dapm_micbias] = 8, |
11543 | + [snd_soc_dapm_vmid] = 8, |
11544 | [snd_soc_dapm_mux] = 9, |
11545 | [snd_soc_dapm_demux] = 9, |
11546 | [snd_soc_dapm_aif_in] = 10, |
11547 | diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c |
11548 | index 66e77e020745..88a7e860b175 100644 |
11549 | --- a/sound/soc/soc-topology.c |
11550 | +++ b/sound/soc/soc-topology.c |
11551 | @@ -2493,6 +2493,7 @@ int snd_soc_tplg_component_load(struct snd_soc_component *comp, |
11552 | struct snd_soc_tplg_ops *ops, const struct firmware *fw, u32 id) |
11553 | { |
11554 | struct soc_tplg tplg; |
11555 | + int ret; |
11556 | |
11557 | /* setup parsing context */ |
11558 | memset(&tplg, 0, sizeof(tplg)); |
11559 | @@ -2506,7 +2507,12 @@ int snd_soc_tplg_component_load(struct snd_soc_component *comp, |
11560 | tplg.bytes_ext_ops = ops->bytes_ext_ops; |
11561 | tplg.bytes_ext_ops_count = ops->bytes_ext_ops_count; |
11562 | |
11563 | - return soc_tplg_load(&tplg); |
11564 | + ret = soc_tplg_load(&tplg); |
11565 | + /* free the created components if fail to load topology */ |
11566 | + if (ret) |
11567 | + snd_soc_tplg_component_remove(comp, SND_SOC_TPLG_INDEX_ALL); |
11568 | + |
11569 | + return ret; |
11570 | } |
11571 | EXPORT_SYMBOL_GPL(snd_soc_tplg_component_load); |
11572 | |
11573 | diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c |
11574 | index db1511359c5e..40c93d8158b5 100644 |
11575 | --- a/tools/perf/util/auxtrace.c |
11576 | +++ b/tools/perf/util/auxtrace.c |
11577 | @@ -1273,9 +1273,9 @@ static int __auxtrace_mmap__read(struct auxtrace_mmap *mm, |
11578 | } |
11579 | |
11580 | /* padding must be written by fn() e.g. record__process_auxtrace() */ |
11581 | - padding = size & 7; |
11582 | + padding = size & (PERF_AUXTRACE_RECORD_ALIGNMENT - 1); |
11583 | if (padding) |
11584 | - padding = 8 - padding; |
11585 | + padding = PERF_AUXTRACE_RECORD_ALIGNMENT - padding; |
11586 | |
11587 | memset(&ev, 0, sizeof(ev)); |
11588 | ev.auxtrace.header.type = PERF_RECORD_AUXTRACE; |
11589 | diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h |
11590 | index 71fc3bd74299..136c5f95f9bf 100644 |
11591 | --- a/tools/perf/util/auxtrace.h |
11592 | +++ b/tools/perf/util/auxtrace.h |
11593 | @@ -38,6 +38,9 @@ struct record_opts; |
11594 | struct auxtrace_info_event; |
11595 | struct events_stats; |
11596 | |
11597 | +/* Auxtrace records must have the same alignment as perf event records */ |
11598 | +#define PERF_AUXTRACE_RECORD_ALIGNMENT 8 |
11599 | + |
11600 | enum auxtrace_type { |
11601 | PERF_AUXTRACE_UNKNOWN, |
11602 | PERF_AUXTRACE_INTEL_PT, |
11603 | diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
11604 | index d404bed7003a..f3db68abbd9a 100644 |
11605 | --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
11606 | +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
11607 | @@ -26,6 +26,7 @@ |
11608 | |
11609 | #include "../cache.h" |
11610 | #include "../util.h" |
11611 | +#include "../auxtrace.h" |
11612 | |
11613 | #include "intel-pt-insn-decoder.h" |
11614 | #include "intel-pt-pkt-decoder.h" |
11615 | @@ -1389,7 +1390,6 @@ static int intel_pt_overflow(struct intel_pt_decoder *decoder) |
11616 | { |
11617 | intel_pt_log("ERROR: Buffer overflow\n"); |
11618 | intel_pt_clear_tx_flags(decoder); |
11619 | - decoder->cbr = 0; |
11620 | decoder->timestamp_insn_cnt = 0; |
11621 | decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC; |
11622 | decoder->overflow = true; |
11623 | @@ -2559,6 +2559,34 @@ static int intel_pt_tsc_cmp(uint64_t tsc1, uint64_t tsc2) |
11624 | } |
11625 | } |
11626 | |
11627 | +#define MAX_PADDING (PERF_AUXTRACE_RECORD_ALIGNMENT - 1) |
11628 | + |
11629 | +/** |
11630 | + * adj_for_padding - adjust overlap to account for padding. |
11631 | + * @buf_b: second buffer |
11632 | + * @buf_a: first buffer |
11633 | + * @len_a: size of first buffer |
11634 | + * |
11635 | + * @buf_a might have up to 7 bytes of padding appended. Adjust the overlap |
11636 | + * accordingly. |
11637 | + * |
11638 | + * Return: A pointer into @buf_b from where non-overlapped data starts |
11639 | + */ |
11640 | +static unsigned char *adj_for_padding(unsigned char *buf_b, |
11641 | + unsigned char *buf_a, size_t len_a) |
11642 | +{ |
11643 | + unsigned char *p = buf_b - MAX_PADDING; |
11644 | + unsigned char *q = buf_a + len_a - MAX_PADDING; |
11645 | + int i; |
11646 | + |
11647 | + for (i = MAX_PADDING; i; i--, p++, q++) { |
11648 | + if (*p != *q) |
11649 | + break; |
11650 | + } |
11651 | + |
11652 | + return p; |
11653 | +} |
11654 | + |
11655 | /** |
11656 | * intel_pt_find_overlap_tsc - determine start of non-overlapped trace data |
11657 | * using TSC. |
11658 | @@ -2609,8 +2637,11 @@ static unsigned char *intel_pt_find_overlap_tsc(unsigned char *buf_a, |
11659 | |
11660 | /* Same TSC, so buffers are consecutive */ |
11661 | if (!cmp && rem_b >= rem_a) { |
11662 | + unsigned char *start; |
11663 | + |
11664 | *consecutive = true; |
11665 | - return buf_b + len_b - (rem_b - rem_a); |
11666 | + start = buf_b + len_b - (rem_b - rem_a); |
11667 | + return adj_for_padding(start, buf_a, len_a); |
11668 | } |
11669 | if (cmp < 0) |
11670 | return buf_b; /* tsc_a < tsc_b => no overlap */ |
11671 | @@ -2673,7 +2704,7 @@ unsigned char *intel_pt_find_overlap(unsigned char *buf_a, size_t len_a, |
11672 | found = memmem(buf_a, len_a, buf_b, len_a); |
11673 | if (found) { |
11674 | *consecutive = true; |
11675 | - return buf_b + len_a; |
11676 | + return adj_for_padding(buf_b + len_a, buf_a, len_a); |
11677 | } |
11678 | |
11679 | /* Try again at next PSB in buffer 'a' */ |
11680 | diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c |
11681 | index 4f48bc11a29c..ff2c41ea94c8 100644 |
11682 | --- a/tools/perf/util/intel-pt.c |
11683 | +++ b/tools/perf/util/intel-pt.c |
11684 | @@ -2507,6 +2507,8 @@ int intel_pt_process_auxtrace_info(union perf_event *event, |
11685 | } |
11686 | |
11687 | pt->timeless_decoding = intel_pt_timeless_decoding(pt); |
11688 | + if (pt->timeless_decoding && !pt->tc.time_mult) |
11689 | + pt->tc.time_mult = 1; |
11690 | pt->have_tsc = intel_pt_have_tsc(pt); |
11691 | pt->sampling_mode = false; |
11692 | pt->est_tsc = !pt->timeless_decoding; |
11693 | diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c |
11694 | index d188b7588152..0715f972a275 100644 |
11695 | --- a/tools/perf/util/symbol.c |
11696 | +++ b/tools/perf/util/symbol.c |
11697 | @@ -709,6 +709,8 @@ static int map_groups__split_kallsyms_for_kcore(struct map_groups *kmaps, struct |
11698 | } |
11699 | |
11700 | pos->start -= curr_map->start - curr_map->pgoff; |
11701 | + if (pos->end > curr_map->end) |
11702 | + pos->end = curr_map->end; |
11703 | if (pos->end) |
11704 | pos->end -= curr_map->start - curr_map->pgoff; |
11705 | symbols__insert(&curr_map->dso->symbols, pos); |
11706 | diff --git a/tools/testing/selftests/bpf/test_lpm_map.c b/tools/testing/selftests/bpf/test_lpm_map.c |
11707 | index 147e34cfceb7..02d7c871862a 100644 |
11708 | --- a/tools/testing/selftests/bpf/test_lpm_map.c |
11709 | +++ b/tools/testing/selftests/bpf/test_lpm_map.c |
11710 | @@ -474,6 +474,16 @@ static void test_lpm_delete(void) |
11711 | assert(bpf_map_lookup_elem(map_fd, key, &value) == -1 && |
11712 | errno == ENOENT); |
11713 | |
11714 | + key->prefixlen = 30; // unused prefix so far |
11715 | + inet_pton(AF_INET, "192.255.0.0", key->data); |
11716 | + assert(bpf_map_delete_elem(map_fd, key) == -1 && |
11717 | + errno == ENOENT); |
11718 | + |
11719 | + key->prefixlen = 16; // same prefix as the root node |
11720 | + inet_pton(AF_INET, "192.255.0.0", key->data); |
11721 | + assert(bpf_map_delete_elem(map_fd, key) == -1 && |
11722 | + errno == ENOENT); |
11723 | + |
11724 | /* assert initial lookup */ |
11725 | key->prefixlen = 32; |
11726 | inet_pton(AF_INET, "192.168.0.1", key->data); |
11727 | diff --git a/tools/testing/selftests/net/fib_tests.sh b/tools/testing/selftests/net/fib_tests.sh |
11728 | index 0f45633bd634..a4ccde0e473b 100755 |
11729 | --- a/tools/testing/selftests/net/fib_tests.sh |
11730 | +++ b/tools/testing/selftests/net/fib_tests.sh |
11731 | @@ -385,6 +385,7 @@ fib_carrier_unicast_test() |
11732 | |
11733 | set -e |
11734 | $IP link set dev dummy0 carrier off |
11735 | + sleep 1 |
11736 | set +e |
11737 | |
11738 | echo " Carrier down" |
11739 | diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c |
11740 | index 91495045ad5a..1415e36fed3d 100644 |
11741 | --- a/virt/kvm/arm/arm.c |
11742 | +++ b/virt/kvm/arm/arm.c |
11743 | @@ -624,6 +624,13 @@ static void vcpu_req_sleep(struct kvm_vcpu *vcpu) |
11744 | /* Awaken to handle a signal, request we sleep again later. */ |
11745 | kvm_make_request(KVM_REQ_SLEEP, vcpu); |
11746 | } |
11747 | + |
11748 | + /* |
11749 | + * Make sure we will observe a potential reset request if we've |
11750 | + * observed a change to the power state. Pairs with the smp_wmb() in |
11751 | + * kvm_psci_vcpu_on(). |
11752 | + */ |
11753 | + smp_rmb(); |
11754 | } |
11755 | |
11756 | static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu) |
11757 | @@ -637,6 +644,9 @@ static void check_vcpu_requests(struct kvm_vcpu *vcpu) |
11758 | if (kvm_check_request(KVM_REQ_SLEEP, vcpu)) |
11759 | vcpu_req_sleep(vcpu); |
11760 | |
11761 | + if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu)) |
11762 | + kvm_reset_vcpu(vcpu); |
11763 | + |
11764 | /* |
11765 | * Clear IRQ_PENDING requests that were made to guarantee |
11766 | * that a VCPU sees new virtual interrupts. |
11767 | diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c |
11768 | index 2f405b0be25c..1344557a7085 100644 |
11769 | --- a/virt/kvm/arm/mmu.c |
11770 | +++ b/virt/kvm/arm/mmu.c |
11771 | @@ -2154,7 +2154,7 @@ int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot, |
11772 | return 0; |
11773 | } |
11774 | |
11775 | -void kvm_arch_memslots_updated(struct kvm *kvm, struct kvm_memslots *slots) |
11776 | +void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) |
11777 | { |
11778 | } |
11779 | |
11780 | diff --git a/virt/kvm/arm/psci.c b/virt/kvm/arm/psci.c |
11781 | index 9b73d3ad918a..34d08ee63747 100644 |
11782 | --- a/virt/kvm/arm/psci.c |
11783 | +++ b/virt/kvm/arm/psci.c |
11784 | @@ -104,12 +104,10 @@ static void kvm_psci_vcpu_off(struct kvm_vcpu *vcpu) |
11785 | |
11786 | static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu) |
11787 | { |
11788 | + struct vcpu_reset_state *reset_state; |
11789 | struct kvm *kvm = source_vcpu->kvm; |
11790 | struct kvm_vcpu *vcpu = NULL; |
11791 | - struct swait_queue_head *wq; |
11792 | unsigned long cpu_id; |
11793 | - unsigned long context_id; |
11794 | - phys_addr_t target_pc; |
11795 | |
11796 | cpu_id = smccc_get_arg1(source_vcpu) & MPIDR_HWID_BITMASK; |
11797 | if (vcpu_mode_is_32bit(source_vcpu)) |
11798 | @@ -130,32 +128,30 @@ static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu) |
11799 | return PSCI_RET_INVALID_PARAMS; |
11800 | } |
11801 | |
11802 | - target_pc = smccc_get_arg2(source_vcpu); |
11803 | - context_id = smccc_get_arg3(source_vcpu); |
11804 | + reset_state = &vcpu->arch.reset_state; |
11805 | |
11806 | - kvm_reset_vcpu(vcpu); |
11807 | - |
11808 | - /* Gracefully handle Thumb2 entry point */ |
11809 | - if (vcpu_mode_is_32bit(vcpu) && (target_pc & 1)) { |
11810 | - target_pc &= ~((phys_addr_t) 1); |
11811 | - vcpu_set_thumb(vcpu); |
11812 | - } |
11813 | + reset_state->pc = smccc_get_arg2(source_vcpu); |
11814 | |
11815 | /* Propagate caller endianness */ |
11816 | - if (kvm_vcpu_is_be(source_vcpu)) |
11817 | - kvm_vcpu_set_be(vcpu); |
11818 | + reset_state->be = kvm_vcpu_is_be(source_vcpu); |
11819 | |
11820 | - *vcpu_pc(vcpu) = target_pc; |
11821 | /* |
11822 | * NOTE: We always update r0 (or x0) because for PSCI v0.1 |
11823 | * the general puspose registers are undefined upon CPU_ON. |
11824 | */ |
11825 | - smccc_set_retval(vcpu, context_id, 0, 0, 0); |
11826 | - vcpu->arch.power_off = false; |
11827 | - smp_mb(); /* Make sure the above is visible */ |
11828 | + reset_state->r0 = smccc_get_arg3(source_vcpu); |
11829 | + |
11830 | + WRITE_ONCE(reset_state->reset, true); |
11831 | + kvm_make_request(KVM_REQ_VCPU_RESET, vcpu); |
11832 | |
11833 | - wq = kvm_arch_vcpu_wq(vcpu); |
11834 | - swake_up_one(wq); |
11835 | + /* |
11836 | + * Make sure the reset request is observed if the change to |
11837 | + * power_state is observed. |
11838 | + */ |
11839 | + smp_wmb(); |
11840 | + |
11841 | + vcpu->arch.power_off = false; |
11842 | + kvm_vcpu_wake_up(vcpu); |
11843 | |
11844 | return PSCI_RET_SUCCESS; |
11845 | } |
11846 | diff --git a/virt/kvm/arm/vgic/vgic-init.c b/virt/kvm/arm/vgic/vgic-init.c |
11847 | index c0c0b88af1d5..8196e4f8731f 100644 |
11848 | --- a/virt/kvm/arm/vgic/vgic-init.c |
11849 | +++ b/virt/kvm/arm/vgic/vgic-init.c |
11850 | @@ -64,7 +64,7 @@ void kvm_vgic_early_init(struct kvm *kvm) |
11851 | struct vgic_dist *dist = &kvm->arch.vgic; |
11852 | |
11853 | INIT_LIST_HEAD(&dist->lpi_list_head); |
11854 | - spin_lock_init(&dist->lpi_list_lock); |
11855 | + raw_spin_lock_init(&dist->lpi_list_lock); |
11856 | } |
11857 | |
11858 | /* CREATION */ |
11859 | @@ -231,13 +231,6 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) |
11860 | irq->config = VGIC_CONFIG_LEVEL; |
11861 | } |
11862 | |
11863 | - /* |
11864 | - * GICv3 can only be created via the KVM_DEVICE_CREATE API and |
11865 | - * so we always know the emulation type at this point as it's |
11866 | - * either explicitly configured as GICv3, or explicitly |
11867 | - * configured as GICv2, or not configured yet which also |
11868 | - * implies GICv2. |
11869 | - */ |
11870 | if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) |
11871 | irq->group = 1; |
11872 | else |
11873 | @@ -281,7 +274,7 @@ int vgic_init(struct kvm *kvm) |
11874 | { |
11875 | struct vgic_dist *dist = &kvm->arch.vgic; |
11876 | struct kvm_vcpu *vcpu; |
11877 | - int ret = 0, i; |
11878 | + int ret = 0, i, idx; |
11879 | |
11880 | if (vgic_initialized(kvm)) |
11881 | return 0; |
11882 | @@ -298,6 +291,19 @@ int vgic_init(struct kvm *kvm) |
11883 | if (ret) |
11884 | goto out; |
11885 | |
11886 | + /* Initialize groups on CPUs created before the VGIC type was known */ |
11887 | + kvm_for_each_vcpu(idx, vcpu, kvm) { |
11888 | + struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; |
11889 | + |
11890 | + for (i = 0; i < VGIC_NR_PRIVATE_IRQS; i++) { |
11891 | + struct vgic_irq *irq = &vgic_cpu->private_irqs[i]; |
11892 | + if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) |
11893 | + irq->group = 1; |
11894 | + else |
11895 | + irq->group = 0; |
11896 | + } |
11897 | + } |
11898 | + |
11899 | if (vgic_has_its(kvm)) { |
11900 | ret = vgic_v4_init(kvm); |
11901 | if (ret) |
11902 | diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c |
11903 | index 12502251727e..f376c82afb61 100644 |
11904 | --- a/virt/kvm/arm/vgic/vgic-its.c |
11905 | +++ b/virt/kvm/arm/vgic/vgic-its.c |
11906 | @@ -73,7 +73,7 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid, |
11907 | irq->target_vcpu = vcpu; |
11908 | irq->group = 1; |
11909 | |
11910 | - spin_lock_irqsave(&dist->lpi_list_lock, flags); |
11911 | + raw_spin_lock_irqsave(&dist->lpi_list_lock, flags); |
11912 | |
11913 | /* |
11914 | * There could be a race with another vgic_add_lpi(), so we need to |
11915 | @@ -101,7 +101,7 @@ static struct vgic_irq *vgic_add_lpi(struct kvm *kvm, u32 intid, |
11916 | dist->lpi_list_count++; |
11917 | |
11918 | out_unlock: |
11919 | - spin_unlock_irqrestore(&dist->lpi_list_lock, flags); |
11920 | + raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags); |
11921 | |
11922 | /* |
11923 | * We "cache" the configuration table entries in our struct vgic_irq's. |
11924 | @@ -339,7 +339,7 @@ int vgic_copy_lpi_list(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 **intid_ptr) |
11925 | if (!intids) |
11926 | return -ENOMEM; |
11927 | |
11928 | - spin_lock_irqsave(&dist->lpi_list_lock, flags); |
11929 | + raw_spin_lock_irqsave(&dist->lpi_list_lock, flags); |
11930 | list_for_each_entry(irq, &dist->lpi_list_head, lpi_list) { |
11931 | if (i == irq_count) |
11932 | break; |
11933 | @@ -348,7 +348,7 @@ int vgic_copy_lpi_list(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 **intid_ptr) |
11934 | continue; |
11935 | intids[i++] = irq->intid; |
11936 | } |
11937 | - spin_unlock_irqrestore(&dist->lpi_list_lock, flags); |
11938 | + raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags); |
11939 | |
11940 | *intid_ptr = intids; |
11941 | return i; |
11942 | diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c |
11943 | index f884a54b2601..c5165e3b80cb 100644 |
11944 | --- a/virt/kvm/arm/vgic/vgic.c |
11945 | +++ b/virt/kvm/arm/vgic/vgic.c |
11946 | @@ -72,7 +72,7 @@ static struct vgic_irq *vgic_get_lpi(struct kvm *kvm, u32 intid) |
11947 | struct vgic_irq *irq = NULL; |
11948 | unsigned long flags; |
11949 | |
11950 | - spin_lock_irqsave(&dist->lpi_list_lock, flags); |
11951 | + raw_spin_lock_irqsave(&dist->lpi_list_lock, flags); |
11952 | |
11953 | list_for_each_entry(irq, &dist->lpi_list_head, lpi_list) { |
11954 | if (irq->intid != intid) |
11955 | @@ -88,7 +88,7 @@ static struct vgic_irq *vgic_get_lpi(struct kvm *kvm, u32 intid) |
11956 | irq = NULL; |
11957 | |
11958 | out_unlock: |
11959 | - spin_unlock_irqrestore(&dist->lpi_list_lock, flags); |
11960 | + raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags); |
11961 | |
11962 | return irq; |
11963 | } |
11964 | @@ -138,15 +138,15 @@ void vgic_put_irq(struct kvm *kvm, struct vgic_irq *irq) |
11965 | if (irq->intid < VGIC_MIN_LPI) |
11966 | return; |
11967 | |
11968 | - spin_lock_irqsave(&dist->lpi_list_lock, flags); |
11969 | + raw_spin_lock_irqsave(&dist->lpi_list_lock, flags); |
11970 | if (!kref_put(&irq->refcount, vgic_irq_release)) { |
11971 | - spin_unlock_irqrestore(&dist->lpi_list_lock, flags); |
11972 | + raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags); |
11973 | return; |
11974 | }; |
11975 | |
11976 | list_del(&irq->lpi_list); |
11977 | dist->lpi_list_count--; |
11978 | - spin_unlock_irqrestore(&dist->lpi_list_lock, flags); |
11979 | + raw_spin_unlock_irqrestore(&dist->lpi_list_lock, flags); |
11980 | |
11981 | kfree(irq); |
11982 | } |
11983 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
11984 | index 0ffb02ff5234..c436d95fd7aa 100644 |
11985 | --- a/virt/kvm/kvm_main.c |
11986 | +++ b/virt/kvm/kvm_main.c |
11987 | @@ -873,6 +873,7 @@ static struct kvm_memslots *install_new_memslots(struct kvm *kvm, |
11988 | int as_id, struct kvm_memslots *slots) |
11989 | { |
11990 | struct kvm_memslots *old_memslots = __kvm_memslots(kvm, as_id); |
11991 | + u64 gen; |
11992 | |
11993 | /* |
11994 | * Set the low bit in the generation, which disables SPTE caching |
11995 | @@ -895,9 +896,11 @@ static struct kvm_memslots *install_new_memslots(struct kvm *kvm, |
11996 | * space 0 will use generations 0, 4, 8, ... while * address space 1 will |
11997 | * use generations 2, 6, 10, 14, ... |
11998 | */ |
11999 | - slots->generation += KVM_ADDRESS_SPACE_NUM * 2 - 1; |
12000 | + gen = slots->generation + KVM_ADDRESS_SPACE_NUM * 2 - 1; |
12001 | |
12002 | - kvm_arch_memslots_updated(kvm, slots); |
12003 | + kvm_arch_memslots_updated(kvm, gen); |
12004 | + |
12005 | + slots->generation = gen; |
12006 | |
12007 | return old_memslots; |
12008 | } |