Contents of /trunk/kernel-alx/patches-4.19/0172-4.19.73-all-fixes.patch
Parent Directory | Revision Log
Revision 3469 -
(show annotations)
(download)
Tue Oct 29 10:31:29 2019 UTC (4 years, 10 months ago) by niro
File size: 301222 byte(s)
Tue Oct 29 10:31:29 2019 UTC (4 years, 10 months ago) by niro
File size: 301222 byte(s)
-linux-4.19.73
1 | diff --git a/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt b/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt |
2 | new file mode 100644 |
3 | index 000000000000..a30d63db3c8f |
4 | --- /dev/null |
5 | +++ b/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt |
6 | @@ -0,0 +1,9 @@ |
7 | +Armadeus ST0700 Adapt. A Santek ST0700I5Y-RBSLW 7.0" WVGA (800x480) TFT with |
8 | +an adapter board. |
9 | + |
10 | +Required properties: |
11 | +- compatible: "armadeus,st0700-adapt" |
12 | +- power-supply: see panel-common.txt |
13 | + |
14 | +Optional properties: |
15 | +- backlight: see panel-common.txt |
16 | diff --git a/Documentation/devicetree/bindings/iio/adc/samsung,exynos-adc.txt b/Documentation/devicetree/bindings/iio/adc/samsung,exynos-adc.txt |
17 | index 6c49db7f8ad2..e1fe02f3e3e9 100644 |
18 | --- a/Documentation/devicetree/bindings/iio/adc/samsung,exynos-adc.txt |
19 | +++ b/Documentation/devicetree/bindings/iio/adc/samsung,exynos-adc.txt |
20 | @@ -11,11 +11,13 @@ New driver handles the following |
21 | |
22 | Required properties: |
23 | - compatible: Must be "samsung,exynos-adc-v1" |
24 | - for exynos4412/5250 and s5pv210 controllers. |
25 | + for Exynos5250 controllers. |
26 | Must be "samsung,exynos-adc-v2" for |
27 | future controllers. |
28 | Must be "samsung,exynos3250-adc" for |
29 | controllers compatible with ADC of Exynos3250. |
30 | + Must be "samsung,exynos4212-adc" for |
31 | + controllers compatible with ADC of Exynos4212 and Exynos4412. |
32 | Must be "samsung,exynos7-adc" for |
33 | the ADC in Exynos7 and compatibles |
34 | Must be "samsung,s3c2410-adc" for |
35 | @@ -28,6 +30,8 @@ Required properties: |
36 | the ADC in s3c2443 and compatibles |
37 | Must be "samsung,s3c6410-adc" for |
38 | the ADC in s3c6410 and compatibles |
39 | + Must be "samsung,s5pv210-adc" for |
40 | + the ADC in s5pv210 and compatibles |
41 | - reg: List of ADC register address range |
42 | - The base address and range of ADC register |
43 | - The base address and range of ADC_PHY register (every |
44 | diff --git a/Documentation/devicetree/bindings/mmc/mmc.txt b/Documentation/devicetree/bindings/mmc/mmc.txt |
45 | index f5a0923b34ca..c269dbe384fe 100644 |
46 | --- a/Documentation/devicetree/bindings/mmc/mmc.txt |
47 | +++ b/Documentation/devicetree/bindings/mmc/mmc.txt |
48 | @@ -62,6 +62,10 @@ Optional properties: |
49 | be referred to mmc-pwrseq-simple.txt. But now it's reused as a tunable delay |
50 | waiting for I/O signalling and card power supply to be stable, regardless of |
51 | whether pwrseq-simple is used. Default to 10ms if no available. |
52 | +- supports-cqe : The presence of this property indicates that the corresponding |
53 | + MMC host controller supports HW command queue feature. |
54 | +- disable-cqe-dcmd: This property indicates that the MMC controller's command |
55 | + queue engine (CQE) does not support direct commands (DCMDs). |
56 | |
57 | *NOTE* on CD and WP polarity. To use common for all SD/MMC host controllers line |
58 | polarity properties, we have to fix the meaning of the "normal" and "inverted" |
59 | diff --git a/Makefile b/Makefile |
60 | index ef80b1dfb753..9748fa3704bc 100644 |
61 | --- a/Makefile |
62 | +++ b/Makefile |
63 | @@ -1,7 +1,7 @@ |
64 | # SPDX-License-Identifier: GPL-2.0 |
65 | VERSION = 4 |
66 | PATCHLEVEL = 19 |
67 | -SUBLEVEL = 72 |
68 | +SUBLEVEL = 73 |
69 | EXTRAVERSION = |
70 | NAME = "People's Front" |
71 | |
72 | diff --git a/arch/arc/kernel/troubleshoot.c b/arch/arc/kernel/troubleshoot.c |
73 | index 5c6663321e87..215f515442e0 100644 |
74 | --- a/arch/arc/kernel/troubleshoot.c |
75 | +++ b/arch/arc/kernel/troubleshoot.c |
76 | @@ -179,6 +179,12 @@ void show_regs(struct pt_regs *regs) |
77 | struct task_struct *tsk = current; |
78 | struct callee_regs *cregs; |
79 | |
80 | + /* |
81 | + * generic code calls us with preemption disabled, but some calls |
82 | + * here could sleep, so re-enable to avoid lockdep splat |
83 | + */ |
84 | + preempt_enable(); |
85 | + |
86 | print_task_path_n_nm(tsk); |
87 | show_regs_print_info(KERN_INFO); |
88 | |
89 | @@ -221,6 +227,8 @@ void show_regs(struct pt_regs *regs) |
90 | cregs = (struct callee_regs *)current->thread.callee_reg; |
91 | if (cregs) |
92 | show_callee_regs(cregs); |
93 | + |
94 | + preempt_disable(); |
95 | } |
96 | |
97 | void show_kernel_fault_diag(const char *str, struct pt_regs *regs, |
98 | diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c |
99 | index db6913094be3..4e8143de32e7 100644 |
100 | --- a/arch/arc/mm/fault.c |
101 | +++ b/arch/arc/mm/fault.c |
102 | @@ -66,14 +66,12 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) |
103 | struct vm_area_struct *vma = NULL; |
104 | struct task_struct *tsk = current; |
105 | struct mm_struct *mm = tsk->mm; |
106 | - siginfo_t info; |
107 | + int si_code = SEGV_MAPERR; |
108 | int ret; |
109 | vm_fault_t fault; |
110 | int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */ |
111 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; |
112 | |
113 | - clear_siginfo(&info); |
114 | - |
115 | /* |
116 | * We fault-in kernel-space virtual memory on-demand. The |
117 | * 'reference' page table is init_mm.pgd. |
118 | @@ -83,16 +81,14 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) |
119 | * only copy the information from the master page table, |
120 | * nothing more. |
121 | */ |
122 | - if (address >= VMALLOC_START) { |
123 | + if (address >= VMALLOC_START && !user_mode(regs)) { |
124 | ret = handle_kernel_vaddr_fault(address); |
125 | if (unlikely(ret)) |
126 | - goto bad_area_nosemaphore; |
127 | + goto no_context; |
128 | else |
129 | return; |
130 | } |
131 | |
132 | - info.si_code = SEGV_MAPERR; |
133 | - |
134 | /* |
135 | * If we're in an interrupt or have no user |
136 | * context, we must not take the fault.. |
137 | @@ -119,7 +115,7 @@ retry: |
138 | * we can handle it.. |
139 | */ |
140 | good_area: |
141 | - info.si_code = SEGV_ACCERR; |
142 | + si_code = SEGV_ACCERR; |
143 | |
144 | /* Handle protection violation, execute on heap or stack */ |
145 | |
146 | @@ -143,12 +139,17 @@ good_area: |
147 | */ |
148 | fault = handle_mm_fault(vma, address, flags); |
149 | |
150 | - /* If Pagefault was interrupted by SIGKILL, exit page fault "early" */ |
151 | if (unlikely(fatal_signal_pending(current))) { |
152 | - if ((fault & VM_FAULT_ERROR) && !(fault & VM_FAULT_RETRY)) |
153 | - up_read(&mm->mmap_sem); |
154 | - if (user_mode(regs)) |
155 | + |
156 | + /* |
157 | + * if fault retry, mmap_sem already relinquished by core mm |
158 | + * so OK to return to user mode (with signal handled first) |
159 | + */ |
160 | + if (fault & VM_FAULT_RETRY) { |
161 | + if (!user_mode(regs)) |
162 | + goto no_context; |
163 | return; |
164 | + } |
165 | } |
166 | |
167 | perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); |
168 | @@ -195,15 +196,10 @@ good_area: |
169 | bad_area: |
170 | up_read(&mm->mmap_sem); |
171 | |
172 | -bad_area_nosemaphore: |
173 | /* User mode accesses just cause a SIGSEGV */ |
174 | if (user_mode(regs)) { |
175 | tsk->thread.fault_address = address; |
176 | - info.si_signo = SIGSEGV; |
177 | - info.si_errno = 0; |
178 | - /* info.si_code has been set above */ |
179 | - info.si_addr = (void __user *)address; |
180 | - force_sig_info(SIGSEGV, &info, tsk); |
181 | + force_sig_fault(SIGSEGV, si_code, (void __user *)address, tsk); |
182 | return; |
183 | } |
184 | |
185 | @@ -238,9 +234,5 @@ do_sigbus: |
186 | goto no_context; |
187 | |
188 | tsk->thread.fault_address = address; |
189 | - info.si_signo = SIGBUS; |
190 | - info.si_errno = 0; |
191 | - info.si_code = BUS_ADRERR; |
192 | - info.si_addr = (void __user *)address; |
193 | - force_sig_info(SIGBUS, &info, tsk); |
194 | + force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address, tsk); |
195 | } |
196 | diff --git a/arch/arm/boot/dts/gemini-dlink-dir-685.dts b/arch/arm/boot/dts/gemini-dlink-dir-685.dts |
197 | index 502a361d1fe9..15d6157b661d 100644 |
198 | --- a/arch/arm/boot/dts/gemini-dlink-dir-685.dts |
199 | +++ b/arch/arm/boot/dts/gemini-dlink-dir-685.dts |
200 | @@ -65,7 +65,7 @@ |
201 | gpio-miso = <&gpio1 8 GPIO_ACTIVE_HIGH>; |
202 | gpio-mosi = <&gpio1 7 GPIO_ACTIVE_HIGH>; |
203 | /* Collides with pflash CE1, not so cool */ |
204 | - cs-gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>; |
205 | + cs-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; |
206 | num-chipselects = <1>; |
207 | |
208 | panel: display@0 { |
209 | diff --git a/arch/arm/boot/dts/qcom-ipq4019.dtsi b/arch/arm/boot/dts/qcom-ipq4019.dtsi |
210 | index 78db67337ed4..54d056b01bb5 100644 |
211 | --- a/arch/arm/boot/dts/qcom-ipq4019.dtsi |
212 | +++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi |
213 | @@ -386,10 +386,10 @@ |
214 | #address-cells = <3>; |
215 | #size-cells = <2>; |
216 | |
217 | - ranges = <0x81000000 0 0x40200000 0x40200000 0 0x00100000 |
218 | - 0x82000000 0 0x48000000 0x48000000 0 0x10000000>; |
219 | + ranges = <0x81000000 0 0x40200000 0x40200000 0 0x00100000>, |
220 | + <0x82000000 0 0x40300000 0x40300000 0 0x00d00000>; |
221 | |
222 | - interrupts = <GIC_SPI 141 IRQ_TYPE_EDGE_RISING>; |
223 | + interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>; |
224 | interrupt-names = "msi"; |
225 | #interrupt-cells = <1>; |
226 | interrupt-map-mask = <0 0 0 0x7>; |
227 | diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c |
228 | index 3c42bf9fa061..708931b47090 100644 |
229 | --- a/arch/arm/mach-davinci/devices-da8xx.c |
230 | +++ b/arch/arm/mach-davinci/devices-da8xx.c |
231 | @@ -704,6 +704,46 @@ static struct resource da8xx_gpio_resources[] = { |
232 | }, |
233 | { /* interrupt */ |
234 | .start = IRQ_DA8XX_GPIO0, |
235 | + .end = IRQ_DA8XX_GPIO0, |
236 | + .flags = IORESOURCE_IRQ, |
237 | + }, |
238 | + { |
239 | + .start = IRQ_DA8XX_GPIO1, |
240 | + .end = IRQ_DA8XX_GPIO1, |
241 | + .flags = IORESOURCE_IRQ, |
242 | + }, |
243 | + { |
244 | + .start = IRQ_DA8XX_GPIO2, |
245 | + .end = IRQ_DA8XX_GPIO2, |
246 | + .flags = IORESOURCE_IRQ, |
247 | + }, |
248 | + { |
249 | + .start = IRQ_DA8XX_GPIO3, |
250 | + .end = IRQ_DA8XX_GPIO3, |
251 | + .flags = IORESOURCE_IRQ, |
252 | + }, |
253 | + { |
254 | + .start = IRQ_DA8XX_GPIO4, |
255 | + .end = IRQ_DA8XX_GPIO4, |
256 | + .flags = IORESOURCE_IRQ, |
257 | + }, |
258 | + { |
259 | + .start = IRQ_DA8XX_GPIO5, |
260 | + .end = IRQ_DA8XX_GPIO5, |
261 | + .flags = IORESOURCE_IRQ, |
262 | + }, |
263 | + { |
264 | + .start = IRQ_DA8XX_GPIO6, |
265 | + .end = IRQ_DA8XX_GPIO6, |
266 | + .flags = IORESOURCE_IRQ, |
267 | + }, |
268 | + { |
269 | + .start = IRQ_DA8XX_GPIO7, |
270 | + .end = IRQ_DA8XX_GPIO7, |
271 | + .flags = IORESOURCE_IRQ, |
272 | + }, |
273 | + { |
274 | + .start = IRQ_DA8XX_GPIO8, |
275 | .end = IRQ_DA8XX_GPIO8, |
276 | .flags = IORESOURCE_IRQ, |
277 | }, |
278 | diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c |
279 | index 9f7d38d12c88..2b0f5d97ab7c 100644 |
280 | --- a/arch/arm/mach-davinci/dm355.c |
281 | +++ b/arch/arm/mach-davinci/dm355.c |
282 | @@ -548,6 +548,36 @@ static struct resource dm355_gpio_resources[] = { |
283 | }, |
284 | { /* interrupt */ |
285 | .start = IRQ_DM355_GPIOBNK0, |
286 | + .end = IRQ_DM355_GPIOBNK0, |
287 | + .flags = IORESOURCE_IRQ, |
288 | + }, |
289 | + { |
290 | + .start = IRQ_DM355_GPIOBNK1, |
291 | + .end = IRQ_DM355_GPIOBNK1, |
292 | + .flags = IORESOURCE_IRQ, |
293 | + }, |
294 | + { |
295 | + .start = IRQ_DM355_GPIOBNK2, |
296 | + .end = IRQ_DM355_GPIOBNK2, |
297 | + .flags = IORESOURCE_IRQ, |
298 | + }, |
299 | + { |
300 | + .start = IRQ_DM355_GPIOBNK3, |
301 | + .end = IRQ_DM355_GPIOBNK3, |
302 | + .flags = IORESOURCE_IRQ, |
303 | + }, |
304 | + { |
305 | + .start = IRQ_DM355_GPIOBNK4, |
306 | + .end = IRQ_DM355_GPIOBNK4, |
307 | + .flags = IORESOURCE_IRQ, |
308 | + }, |
309 | + { |
310 | + .start = IRQ_DM355_GPIOBNK5, |
311 | + .end = IRQ_DM355_GPIOBNK5, |
312 | + .flags = IORESOURCE_IRQ, |
313 | + }, |
314 | + { |
315 | + .start = IRQ_DM355_GPIOBNK6, |
316 | .end = IRQ_DM355_GPIOBNK6, |
317 | .flags = IORESOURCE_IRQ, |
318 | }, |
319 | diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c |
320 | index abcf2a5ed89b..42665914166a 100644 |
321 | --- a/arch/arm/mach-davinci/dm365.c |
322 | +++ b/arch/arm/mach-davinci/dm365.c |
323 | @@ -267,6 +267,41 @@ static struct resource dm365_gpio_resources[] = { |
324 | }, |
325 | { /* interrupt */ |
326 | .start = IRQ_DM365_GPIO0, |
327 | + .end = IRQ_DM365_GPIO0, |
328 | + .flags = IORESOURCE_IRQ, |
329 | + }, |
330 | + { |
331 | + .start = IRQ_DM365_GPIO1, |
332 | + .end = IRQ_DM365_GPIO1, |
333 | + .flags = IORESOURCE_IRQ, |
334 | + }, |
335 | + { |
336 | + .start = IRQ_DM365_GPIO2, |
337 | + .end = IRQ_DM365_GPIO2, |
338 | + .flags = IORESOURCE_IRQ, |
339 | + }, |
340 | + { |
341 | + .start = IRQ_DM365_GPIO3, |
342 | + .end = IRQ_DM365_GPIO3, |
343 | + .flags = IORESOURCE_IRQ, |
344 | + }, |
345 | + { |
346 | + .start = IRQ_DM365_GPIO4, |
347 | + .end = IRQ_DM365_GPIO4, |
348 | + .flags = IORESOURCE_IRQ, |
349 | + }, |
350 | + { |
351 | + .start = IRQ_DM365_GPIO5, |
352 | + .end = IRQ_DM365_GPIO5, |
353 | + .flags = IORESOURCE_IRQ, |
354 | + }, |
355 | + { |
356 | + .start = IRQ_DM365_GPIO6, |
357 | + .end = IRQ_DM365_GPIO6, |
358 | + .flags = IORESOURCE_IRQ, |
359 | + }, |
360 | + { |
361 | + .start = IRQ_DM365_GPIO7, |
362 | .end = IRQ_DM365_GPIO7, |
363 | .flags = IORESOURCE_IRQ, |
364 | }, |
365 | diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c |
366 | index 0720da7809a6..de1ec6dc01e9 100644 |
367 | --- a/arch/arm/mach-davinci/dm644x.c |
368 | +++ b/arch/arm/mach-davinci/dm644x.c |
369 | @@ -492,6 +492,26 @@ static struct resource dm644_gpio_resources[] = { |
370 | }, |
371 | { /* interrupt */ |
372 | .start = IRQ_GPIOBNK0, |
373 | + .end = IRQ_GPIOBNK0, |
374 | + .flags = IORESOURCE_IRQ, |
375 | + }, |
376 | + { |
377 | + .start = IRQ_GPIOBNK1, |
378 | + .end = IRQ_GPIOBNK1, |
379 | + .flags = IORESOURCE_IRQ, |
380 | + }, |
381 | + { |
382 | + .start = IRQ_GPIOBNK2, |
383 | + .end = IRQ_GPIOBNK2, |
384 | + .flags = IORESOURCE_IRQ, |
385 | + }, |
386 | + { |
387 | + .start = IRQ_GPIOBNK3, |
388 | + .end = IRQ_GPIOBNK3, |
389 | + .flags = IORESOURCE_IRQ, |
390 | + }, |
391 | + { |
392 | + .start = IRQ_GPIOBNK4, |
393 | .end = IRQ_GPIOBNK4, |
394 | .flags = IORESOURCE_IRQ, |
395 | }, |
396 | diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c |
397 | index 6bd2ed069d0d..d9b93e2806d2 100644 |
398 | --- a/arch/arm/mach-davinci/dm646x.c |
399 | +++ b/arch/arm/mach-davinci/dm646x.c |
400 | @@ -442,6 +442,16 @@ static struct resource dm646x_gpio_resources[] = { |
401 | }, |
402 | { /* interrupt */ |
403 | .start = IRQ_DM646X_GPIOBNK0, |
404 | + .end = IRQ_DM646X_GPIOBNK0, |
405 | + .flags = IORESOURCE_IRQ, |
406 | + }, |
407 | + { |
408 | + .start = IRQ_DM646X_GPIOBNK1, |
409 | + .end = IRQ_DM646X_GPIOBNK1, |
410 | + .flags = IORESOURCE_IRQ, |
411 | + }, |
412 | + { |
413 | + .start = IRQ_DM646X_GPIOBNK2, |
414 | .end = IRQ_DM646X_GPIOBNK2, |
415 | .flags = IORESOURCE_IRQ, |
416 | }, |
417 | diff --git a/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi b/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi |
418 | index 5089aa64088f..9a1ea8a46405 100644 |
419 | --- a/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi |
420 | +++ b/arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi |
421 | @@ -140,6 +140,7 @@ |
422 | tx-fifo-depth = <16384>; |
423 | rx-fifo-depth = <16384>; |
424 | snps,multicast-filter-bins = <256>; |
425 | + altr,sysmgr-syscon = <&sysmgr 0x44 0>; |
426 | status = "disabled"; |
427 | }; |
428 | |
429 | @@ -156,6 +157,7 @@ |
430 | tx-fifo-depth = <16384>; |
431 | rx-fifo-depth = <16384>; |
432 | snps,multicast-filter-bins = <256>; |
433 | + altr,sysmgr-syscon = <&sysmgr 0x48 0>; |
434 | status = "disabled"; |
435 | }; |
436 | |
437 | @@ -172,6 +174,7 @@ |
438 | tx-fifo-depth = <16384>; |
439 | rx-fifo-depth = <16384>; |
440 | snps,multicast-filter-bins = <256>; |
441 | + altr,sysmgr-syscon = <&sysmgr 0x4c 0>; |
442 | status = "disabled"; |
443 | }; |
444 | |
445 | diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts |
446 | index c142169a58fc..e9147e35b739 100644 |
447 | --- a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts |
448 | +++ b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts |
449 | @@ -40,6 +40,7 @@ |
450 | pinctrl-0 = <&usb30_host_drv>; |
451 | regulator-name = "vcc_host_5v"; |
452 | regulator-always-on; |
453 | + regulator-boot-on; |
454 | vin-supply = <&vcc_sys>; |
455 | }; |
456 | |
457 | @@ -50,6 +51,7 @@ |
458 | pinctrl-0 = <&usb20_host_drv>; |
459 | regulator-name = "vcc_host1_5v"; |
460 | regulator-always-on; |
461 | + regulator-boot-on; |
462 | vin-supply = <&vcc_sys>; |
463 | }; |
464 | |
465 | diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h |
466 | index 83a9aa3cf689..dd18d8174504 100644 |
467 | --- a/arch/powerpc/include/asm/kvm_book3s.h |
468 | +++ b/arch/powerpc/include/asm/kvm_book3s.h |
469 | @@ -301,12 +301,12 @@ static inline ulong kvmppc_get_gpr(struct kvm_vcpu *vcpu, int num) |
470 | |
471 | static inline void kvmppc_set_cr(struct kvm_vcpu *vcpu, u32 val) |
472 | { |
473 | - vcpu->arch.cr = val; |
474 | + vcpu->arch.regs.ccr = val; |
475 | } |
476 | |
477 | static inline u32 kvmppc_get_cr(struct kvm_vcpu *vcpu) |
478 | { |
479 | - return vcpu->arch.cr; |
480 | + return vcpu->arch.regs.ccr; |
481 | } |
482 | |
483 | static inline void kvmppc_set_xer(struct kvm_vcpu *vcpu, ulong val) |
484 | diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h |
485 | index dc435a5af7d6..14fa07c73f44 100644 |
486 | --- a/arch/powerpc/include/asm/kvm_book3s_64.h |
487 | +++ b/arch/powerpc/include/asm/kvm_book3s_64.h |
488 | @@ -482,7 +482,7 @@ static inline u64 sanitize_msr(u64 msr) |
489 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
490 | static inline void copy_from_checkpoint(struct kvm_vcpu *vcpu) |
491 | { |
492 | - vcpu->arch.cr = vcpu->arch.cr_tm; |
493 | + vcpu->arch.regs.ccr = vcpu->arch.cr_tm; |
494 | vcpu->arch.regs.xer = vcpu->arch.xer_tm; |
495 | vcpu->arch.regs.link = vcpu->arch.lr_tm; |
496 | vcpu->arch.regs.ctr = vcpu->arch.ctr_tm; |
497 | @@ -499,7 +499,7 @@ static inline void copy_from_checkpoint(struct kvm_vcpu *vcpu) |
498 | |
499 | static inline void copy_to_checkpoint(struct kvm_vcpu *vcpu) |
500 | { |
501 | - vcpu->arch.cr_tm = vcpu->arch.cr; |
502 | + vcpu->arch.cr_tm = vcpu->arch.regs.ccr; |
503 | vcpu->arch.xer_tm = vcpu->arch.regs.xer; |
504 | vcpu->arch.lr_tm = vcpu->arch.regs.link; |
505 | vcpu->arch.ctr_tm = vcpu->arch.regs.ctr; |
506 | diff --git a/arch/powerpc/include/asm/kvm_booke.h b/arch/powerpc/include/asm/kvm_booke.h |
507 | index d513e3ed1c65..f0cef625f17c 100644 |
508 | --- a/arch/powerpc/include/asm/kvm_booke.h |
509 | +++ b/arch/powerpc/include/asm/kvm_booke.h |
510 | @@ -46,12 +46,12 @@ static inline ulong kvmppc_get_gpr(struct kvm_vcpu *vcpu, int num) |
511 | |
512 | static inline void kvmppc_set_cr(struct kvm_vcpu *vcpu, u32 val) |
513 | { |
514 | - vcpu->arch.cr = val; |
515 | + vcpu->arch.regs.ccr = val; |
516 | } |
517 | |
518 | static inline u32 kvmppc_get_cr(struct kvm_vcpu *vcpu) |
519 | { |
520 | - return vcpu->arch.cr; |
521 | + return vcpu->arch.regs.ccr; |
522 | } |
523 | |
524 | static inline void kvmppc_set_xer(struct kvm_vcpu *vcpu, ulong val) |
525 | diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h |
526 | index 2b6049e83970..2f95e38f0549 100644 |
527 | --- a/arch/powerpc/include/asm/kvm_host.h |
528 | +++ b/arch/powerpc/include/asm/kvm_host.h |
529 | @@ -538,8 +538,6 @@ struct kvm_vcpu_arch { |
530 | ulong tar; |
531 | #endif |
532 | |
533 | - u32 cr; |
534 | - |
535 | #ifdef CONFIG_PPC_BOOK3S |
536 | ulong hflags; |
537 | ulong guest_owned_ext; |
538 | diff --git a/arch/powerpc/include/asm/mmu_context.h b/arch/powerpc/include/asm/mmu_context.h |
539 | index b694d6af1150..ae953958c0f3 100644 |
540 | --- a/arch/powerpc/include/asm/mmu_context.h |
541 | +++ b/arch/powerpc/include/asm/mmu_context.h |
542 | @@ -217,12 +217,6 @@ static inline void enter_lazy_tlb(struct mm_struct *mm, |
543 | #endif |
544 | } |
545 | |
546 | -static inline int arch_dup_mmap(struct mm_struct *oldmm, |
547 | - struct mm_struct *mm) |
548 | -{ |
549 | - return 0; |
550 | -} |
551 | - |
552 | #ifndef CONFIG_PPC_BOOK3S_64 |
553 | static inline void arch_exit_mmap(struct mm_struct *mm) |
554 | { |
555 | @@ -247,6 +241,7 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm, |
556 | #ifdef CONFIG_PPC_MEM_KEYS |
557 | bool arch_vma_access_permitted(struct vm_area_struct *vma, bool write, |
558 | bool execute, bool foreign); |
559 | +void arch_dup_pkeys(struct mm_struct *oldmm, struct mm_struct *mm); |
560 | #else /* CONFIG_PPC_MEM_KEYS */ |
561 | static inline bool arch_vma_access_permitted(struct vm_area_struct *vma, |
562 | bool write, bool execute, bool foreign) |
563 | @@ -259,6 +254,7 @@ static inline bool arch_vma_access_permitted(struct vm_area_struct *vma, |
564 | #define thread_pkey_regs_save(thread) |
565 | #define thread_pkey_regs_restore(new_thread, old_thread) |
566 | #define thread_pkey_regs_init(thread) |
567 | +#define arch_dup_pkeys(oldmm, mm) |
568 | |
569 | static inline u64 pte_to_hpte_pkey_bits(u64 pteflags) |
570 | { |
571 | @@ -267,5 +263,12 @@ static inline u64 pte_to_hpte_pkey_bits(u64 pteflags) |
572 | |
573 | #endif /* CONFIG_PPC_MEM_KEYS */ |
574 | |
575 | +static inline int arch_dup_mmap(struct mm_struct *oldmm, |
576 | + struct mm_struct *mm) |
577 | +{ |
578 | + arch_dup_pkeys(oldmm, mm); |
579 | + return 0; |
580 | +} |
581 | + |
582 | #endif /* __KERNEL__ */ |
583 | #endif /* __ASM_POWERPC_MMU_CONTEXT_H */ |
584 | diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h |
585 | index e5b314ed054e..640a4d818772 100644 |
586 | --- a/arch/powerpc/include/asm/reg.h |
587 | +++ b/arch/powerpc/include/asm/reg.h |
588 | @@ -118,11 +118,16 @@ |
589 | #define MSR_TS_S __MASK(MSR_TS_S_LG) /* Transaction Suspended */ |
590 | #define MSR_TS_T __MASK(MSR_TS_T_LG) /* Transaction Transactional */ |
591 | #define MSR_TS_MASK (MSR_TS_T | MSR_TS_S) /* Transaction State bits */ |
592 | -#define MSR_TM_ACTIVE(x) (((x) & MSR_TS_MASK) != 0) /* Transaction active? */ |
593 | #define MSR_TM_RESV(x) (((x) & MSR_TS_MASK) == MSR_TS_MASK) /* Reserved */ |
594 | #define MSR_TM_TRANSACTIONAL(x) (((x) & MSR_TS_MASK) == MSR_TS_T) |
595 | #define MSR_TM_SUSPENDED(x) (((x) & MSR_TS_MASK) == MSR_TS_S) |
596 | |
597 | +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
598 | +#define MSR_TM_ACTIVE(x) (((x) & MSR_TS_MASK) != 0) /* Transaction active? */ |
599 | +#else |
600 | +#define MSR_TM_ACTIVE(x) 0 |
601 | +#endif |
602 | + |
603 | #if defined(CONFIG_PPC_BOOK3S_64) |
604 | #define MSR_64BIT MSR_SF |
605 | |
606 | diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c |
607 | index 89cf15566c4e..7c3738d890e8 100644 |
608 | --- a/arch/powerpc/kernel/asm-offsets.c |
609 | +++ b/arch/powerpc/kernel/asm-offsets.c |
610 | @@ -438,7 +438,7 @@ int main(void) |
611 | #ifdef CONFIG_PPC_BOOK3S |
612 | OFFSET(VCPU_TAR, kvm_vcpu, arch.tar); |
613 | #endif |
614 | - OFFSET(VCPU_CR, kvm_vcpu, arch.cr); |
615 | + OFFSET(VCPU_CR, kvm_vcpu, arch.regs.ccr); |
616 | OFFSET(VCPU_PC, kvm_vcpu, arch.regs.nip); |
617 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
618 | OFFSET(VCPU_MSR, kvm_vcpu, arch.shregs.msr); |
619 | @@ -695,7 +695,7 @@ int main(void) |
620 | #endif /* CONFIG_PPC_BOOK3S_64 */ |
621 | |
622 | #else /* CONFIG_PPC_BOOK3S */ |
623 | - OFFSET(VCPU_CR, kvm_vcpu, arch.cr); |
624 | + OFFSET(VCPU_CR, kvm_vcpu, arch.regs.ccr); |
625 | OFFSET(VCPU_XER, kvm_vcpu, arch.regs.xer); |
626 | OFFSET(VCPU_LR, kvm_vcpu, arch.regs.link); |
627 | OFFSET(VCPU_CTR, kvm_vcpu, arch.regs.ctr); |
628 | diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S |
629 | index 9168a247e24f..3fb564f3e887 100644 |
630 | --- a/arch/powerpc/kernel/head_64.S |
631 | +++ b/arch/powerpc/kernel/head_64.S |
632 | @@ -906,6 +906,7 @@ p_toc: .8byte __toc_start + 0x8000 - 0b |
633 | /* |
634 | * This is where the main kernel code starts. |
635 | */ |
636 | +__REF |
637 | start_here_multiplatform: |
638 | /* set up the TOC */ |
639 | bl relative_toc |
640 | @@ -981,6 +982,7 @@ start_here_multiplatform: |
641 | RFI |
642 | b . /* prevent speculative execution */ |
643 | |
644 | + .previous |
645 | /* This is where all platforms converge execution */ |
646 | |
647 | start_here_common: |
648 | diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c |
649 | index d29f2dca725b..909c9407e392 100644 |
650 | --- a/arch/powerpc/kernel/process.c |
651 | +++ b/arch/powerpc/kernel/process.c |
652 | @@ -102,27 +102,8 @@ static void check_if_tm_restore_required(struct task_struct *tsk) |
653 | } |
654 | } |
655 | |
656 | -static inline bool msr_tm_active(unsigned long msr) |
657 | -{ |
658 | - return MSR_TM_ACTIVE(msr); |
659 | -} |
660 | - |
661 | -static bool tm_active_with_fp(struct task_struct *tsk) |
662 | -{ |
663 | - return msr_tm_active(tsk->thread.regs->msr) && |
664 | - (tsk->thread.ckpt_regs.msr & MSR_FP); |
665 | -} |
666 | - |
667 | -static bool tm_active_with_altivec(struct task_struct *tsk) |
668 | -{ |
669 | - return msr_tm_active(tsk->thread.regs->msr) && |
670 | - (tsk->thread.ckpt_regs.msr & MSR_VEC); |
671 | -} |
672 | #else |
673 | -static inline bool msr_tm_active(unsigned long msr) { return false; } |
674 | static inline void check_if_tm_restore_required(struct task_struct *tsk) { } |
675 | -static inline bool tm_active_with_fp(struct task_struct *tsk) { return false; } |
676 | -static inline bool tm_active_with_altivec(struct task_struct *tsk) { return false; } |
677 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ |
678 | |
679 | bool strict_msr_control; |
680 | @@ -247,7 +228,8 @@ void enable_kernel_fp(void) |
681 | * giveup as this would save to the 'live' structure not the |
682 | * checkpointed structure. |
683 | */ |
684 | - if(!msr_tm_active(cpumsr) && msr_tm_active(current->thread.regs->msr)) |
685 | + if (!MSR_TM_ACTIVE(cpumsr) && |
686 | + MSR_TM_ACTIVE(current->thread.regs->msr)) |
687 | return; |
688 | __giveup_fpu(current); |
689 | } |
690 | @@ -256,7 +238,7 @@ EXPORT_SYMBOL(enable_kernel_fp); |
691 | |
692 | static int restore_fp(struct task_struct *tsk) |
693 | { |
694 | - if (tsk->thread.load_fp || tm_active_with_fp(tsk)) { |
695 | + if (tsk->thread.load_fp) { |
696 | load_fp_state(¤t->thread.fp_state); |
697 | current->thread.load_fp++; |
698 | return 1; |
699 | @@ -311,7 +293,8 @@ void enable_kernel_altivec(void) |
700 | * giveup as this would save to the 'live' structure not the |
701 | * checkpointed structure. |
702 | */ |
703 | - if(!msr_tm_active(cpumsr) && msr_tm_active(current->thread.regs->msr)) |
704 | + if (!MSR_TM_ACTIVE(cpumsr) && |
705 | + MSR_TM_ACTIVE(current->thread.regs->msr)) |
706 | return; |
707 | __giveup_altivec(current); |
708 | } |
709 | @@ -337,8 +320,7 @@ EXPORT_SYMBOL_GPL(flush_altivec_to_thread); |
710 | |
711 | static int restore_altivec(struct task_struct *tsk) |
712 | { |
713 | - if (cpu_has_feature(CPU_FTR_ALTIVEC) && |
714 | - (tsk->thread.load_vec || tm_active_with_altivec(tsk))) { |
715 | + if (cpu_has_feature(CPU_FTR_ALTIVEC) && (tsk->thread.load_vec)) { |
716 | load_vr_state(&tsk->thread.vr_state); |
717 | tsk->thread.used_vr = 1; |
718 | tsk->thread.load_vec++; |
719 | @@ -397,7 +379,8 @@ void enable_kernel_vsx(void) |
720 | * giveup as this would save to the 'live' structure not the |
721 | * checkpointed structure. |
722 | */ |
723 | - if(!msr_tm_active(cpumsr) && msr_tm_active(current->thread.regs->msr)) |
724 | + if (!MSR_TM_ACTIVE(cpumsr) && |
725 | + MSR_TM_ACTIVE(current->thread.regs->msr)) |
726 | return; |
727 | __giveup_vsx(current); |
728 | } |
729 | @@ -499,13 +482,14 @@ void giveup_all(struct task_struct *tsk) |
730 | if (!tsk->thread.regs) |
731 | return; |
732 | |
733 | + check_if_tm_restore_required(tsk); |
734 | + |
735 | usermsr = tsk->thread.regs->msr; |
736 | |
737 | if ((usermsr & msr_all_available) == 0) |
738 | return; |
739 | |
740 | msr_check_and_set(msr_all_available); |
741 | - check_if_tm_restore_required(tsk); |
742 | |
743 | WARN_ON((usermsr & MSR_VSX) && !((usermsr & MSR_FP) && (usermsr & MSR_VEC))); |
744 | |
745 | @@ -530,7 +514,7 @@ void restore_math(struct pt_regs *regs) |
746 | { |
747 | unsigned long msr; |
748 | |
749 | - if (!msr_tm_active(regs->msr) && |
750 | + if (!MSR_TM_ACTIVE(regs->msr) && |
751 | !current->thread.load_fp && !loadvec(current->thread)) |
752 | return; |
753 | |
754 | diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c |
755 | index 68e14afecac8..a488c105b923 100644 |
756 | --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c |
757 | +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c |
758 | @@ -744,12 +744,15 @@ void kvmppc_rmap_reset(struct kvm *kvm) |
759 | srcu_idx = srcu_read_lock(&kvm->srcu); |
760 | slots = kvm_memslots(kvm); |
761 | kvm_for_each_memslot(memslot, slots) { |
762 | + /* Mutual exclusion with kvm_unmap_hva_range etc. */ |
763 | + spin_lock(&kvm->mmu_lock); |
764 | /* |
765 | * This assumes it is acceptable to lose reference and |
766 | * change bits across a reset. |
767 | */ |
768 | memset(memslot->arch.rmap, 0, |
769 | memslot->npages * sizeof(*memslot->arch.rmap)); |
770 | + spin_unlock(&kvm->mmu_lock); |
771 | } |
772 | srcu_read_unlock(&kvm->srcu, srcu_idx); |
773 | } |
774 | diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c |
775 | index 36b11c5a0dbb..2654df220d05 100644 |
776 | --- a/arch/powerpc/kvm/book3s_emulate.c |
777 | +++ b/arch/powerpc/kvm/book3s_emulate.c |
778 | @@ -110,7 +110,7 @@ static inline void kvmppc_copyto_vcpu_tm(struct kvm_vcpu *vcpu) |
779 | vcpu->arch.ctr_tm = vcpu->arch.regs.ctr; |
780 | vcpu->arch.tar_tm = vcpu->arch.tar; |
781 | vcpu->arch.lr_tm = vcpu->arch.regs.link; |
782 | - vcpu->arch.cr_tm = vcpu->arch.cr; |
783 | + vcpu->arch.cr_tm = vcpu->arch.regs.ccr; |
784 | vcpu->arch.xer_tm = vcpu->arch.regs.xer; |
785 | vcpu->arch.vrsave_tm = vcpu->arch.vrsave; |
786 | } |
787 | @@ -129,7 +129,7 @@ static inline void kvmppc_copyfrom_vcpu_tm(struct kvm_vcpu *vcpu) |
788 | vcpu->arch.regs.ctr = vcpu->arch.ctr_tm; |
789 | vcpu->arch.tar = vcpu->arch.tar_tm; |
790 | vcpu->arch.regs.link = vcpu->arch.lr_tm; |
791 | - vcpu->arch.cr = vcpu->arch.cr_tm; |
792 | + vcpu->arch.regs.ccr = vcpu->arch.cr_tm; |
793 | vcpu->arch.regs.xer = vcpu->arch.xer_tm; |
794 | vcpu->arch.vrsave = vcpu->arch.vrsave_tm; |
795 | } |
796 | @@ -141,7 +141,7 @@ static void kvmppc_emulate_treclaim(struct kvm_vcpu *vcpu, int ra_val) |
797 | uint64_t texasr; |
798 | |
799 | /* CR0 = 0 | MSR[TS] | 0 */ |
800 | - vcpu->arch.cr = (vcpu->arch.cr & ~(CR0_MASK << CR0_SHIFT)) | |
801 | + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT)) | |
802 | (((guest_msr & MSR_TS_MASK) >> (MSR_TS_S_LG - 1)) |
803 | << CR0_SHIFT); |
804 | |
805 | @@ -220,7 +220,7 @@ void kvmppc_emulate_tabort(struct kvm_vcpu *vcpu, int ra_val) |
806 | tm_abort(ra_val); |
807 | |
808 | /* CR0 = 0 | MSR[TS] | 0 */ |
809 | - vcpu->arch.cr = (vcpu->arch.cr & ~(CR0_MASK << CR0_SHIFT)) | |
810 | + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT)) | |
811 | (((guest_msr & MSR_TS_MASK) >> (MSR_TS_S_LG - 1)) |
812 | << CR0_SHIFT); |
813 | |
814 | @@ -494,8 +494,8 @@ int kvmppc_core_emulate_op_pr(struct kvm_run *run, struct kvm_vcpu *vcpu, |
815 | |
816 | if (!(kvmppc_get_msr(vcpu) & MSR_PR)) { |
817 | preempt_disable(); |
818 | - vcpu->arch.cr = (CR0_TBEGIN_FAILURE | |
819 | - (vcpu->arch.cr & ~(CR0_MASK << CR0_SHIFT))); |
820 | + vcpu->arch.regs.ccr = (CR0_TBEGIN_FAILURE | |
821 | + (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT))); |
822 | |
823 | vcpu->arch.texasr = (TEXASR_FS | TEXASR_EXACT | |
824 | (((u64)(TM_CAUSE_EMULATE | TM_CAUSE_PERSISTENT)) |
825 | diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c |
826 | index 083dcedba11c..05b32cc12e41 100644 |
827 | --- a/arch/powerpc/kvm/book3s_hv.c |
828 | +++ b/arch/powerpc/kvm/book3s_hv.c |
829 | @@ -410,8 +410,8 @@ static void kvmppc_dump_regs(struct kvm_vcpu *vcpu) |
830 | vcpu->arch.shregs.sprg0, vcpu->arch.shregs.sprg1); |
831 | pr_err("sprg2 = %.16llx sprg3 = %.16llx\n", |
832 | vcpu->arch.shregs.sprg2, vcpu->arch.shregs.sprg3); |
833 | - pr_err("cr = %.8x xer = %.16lx dsisr = %.8x\n", |
834 | - vcpu->arch.cr, vcpu->arch.regs.xer, vcpu->arch.shregs.dsisr); |
835 | + pr_err("cr = %.8lx xer = %.16lx dsisr = %.8x\n", |
836 | + vcpu->arch.regs.ccr, vcpu->arch.regs.xer, vcpu->arch.shregs.dsisr); |
837 | pr_err("dar = %.16llx\n", vcpu->arch.shregs.dar); |
838 | pr_err("fault dar = %.16lx dsisr = %.8x\n", |
839 | vcpu->arch.fault_dar, vcpu->arch.fault_dsisr); |
840 | @@ -3813,12 +3813,15 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu) |
841 | /* Must be called with kvm->lock held and mmu_ready = 0 and no vcpus running */ |
842 | int kvmppc_switch_mmu_to_hpt(struct kvm *kvm) |
843 | { |
844 | + kvmppc_rmap_reset(kvm); |
845 | + kvm->arch.process_table = 0; |
846 | + /* Mutual exclusion with kvm_unmap_hva_range etc. */ |
847 | + spin_lock(&kvm->mmu_lock); |
848 | + kvm->arch.radix = 0; |
849 | + spin_unlock(&kvm->mmu_lock); |
850 | kvmppc_free_radix(kvm); |
851 | kvmppc_update_lpcr(kvm, LPCR_VPM1, |
852 | LPCR_VPM1 | LPCR_UPRT | LPCR_GTSE | LPCR_HR); |
853 | - kvmppc_rmap_reset(kvm); |
854 | - kvm->arch.radix = 0; |
855 | - kvm->arch.process_table = 0; |
856 | return 0; |
857 | } |
858 | |
859 | @@ -3831,10 +3834,14 @@ int kvmppc_switch_mmu_to_radix(struct kvm *kvm) |
860 | if (err) |
861 | return err; |
862 | |
863 | + kvmppc_rmap_reset(kvm); |
864 | + /* Mutual exclusion with kvm_unmap_hva_range etc. */ |
865 | + spin_lock(&kvm->mmu_lock); |
866 | + kvm->arch.radix = 1; |
867 | + spin_unlock(&kvm->mmu_lock); |
868 | kvmppc_free_hpt(&kvm->arch.hpt); |
869 | kvmppc_update_lpcr(kvm, LPCR_UPRT | LPCR_GTSE | LPCR_HR, |
870 | LPCR_VPM1 | LPCR_UPRT | LPCR_GTSE | LPCR_HR); |
871 | - kvm->arch.radix = 1; |
872 | return 0; |
873 | } |
874 | |
875 | diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
876 | index 1d14046124a0..68c7591f2b5f 100644 |
877 | --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
878 | +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
879 | @@ -56,6 +56,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300) |
880 | #define STACK_SLOT_DAWR (SFS-56) |
881 | #define STACK_SLOT_DAWRX (SFS-64) |
882 | #define STACK_SLOT_HFSCR (SFS-72) |
883 | +#define STACK_SLOT_AMR (SFS-80) |
884 | +#define STACK_SLOT_UAMOR (SFS-88) |
885 | |
886 | /* |
887 | * Call kvmppc_hv_entry in real mode. |
888 | @@ -760,11 +762,9 @@ BEGIN_FTR_SECTION |
889 | mfspr r5, SPRN_TIDR |
890 | mfspr r6, SPRN_PSSCR |
891 | mfspr r7, SPRN_PID |
892 | - mfspr r8, SPRN_IAMR |
893 | std r5, STACK_SLOT_TID(r1) |
894 | std r6, STACK_SLOT_PSSCR(r1) |
895 | std r7, STACK_SLOT_PID(r1) |
896 | - std r8, STACK_SLOT_IAMR(r1) |
897 | mfspr r5, SPRN_HFSCR |
898 | std r5, STACK_SLOT_HFSCR(r1) |
899 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) |
900 | @@ -772,11 +772,18 @@ BEGIN_FTR_SECTION |
901 | mfspr r5, SPRN_CIABR |
902 | mfspr r6, SPRN_DAWR |
903 | mfspr r7, SPRN_DAWRX |
904 | + mfspr r8, SPRN_IAMR |
905 | std r5, STACK_SLOT_CIABR(r1) |
906 | std r6, STACK_SLOT_DAWR(r1) |
907 | std r7, STACK_SLOT_DAWRX(r1) |
908 | + std r8, STACK_SLOT_IAMR(r1) |
909 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
910 | |
911 | + mfspr r5, SPRN_AMR |
912 | + std r5, STACK_SLOT_AMR(r1) |
913 | + mfspr r6, SPRN_UAMOR |
914 | + std r6, STACK_SLOT_UAMOR(r1) |
915 | + |
916 | BEGIN_FTR_SECTION |
917 | /* Set partition DABR */ |
918 | /* Do this before re-enabling PMU to avoid P7 DABR corruption bug */ |
919 | @@ -1202,7 +1209,7 @@ BEGIN_FTR_SECTION |
920 | END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) |
921 | |
922 | ld r5, VCPU_LR(r4) |
923 | - lwz r6, VCPU_CR(r4) |
924 | + ld r6, VCPU_CR(r4) |
925 | mtlr r5 |
926 | mtcr r6 |
927 | |
928 | @@ -1313,7 +1320,7 @@ kvmppc_interrupt_hv: |
929 | std r3, VCPU_GPR(R12)(r9) |
930 | /* CR is in the high half of r12 */ |
931 | srdi r4, r12, 32 |
932 | - stw r4, VCPU_CR(r9) |
933 | + std r4, VCPU_CR(r9) |
934 | BEGIN_FTR_SECTION |
935 | ld r3, HSTATE_CFAR(r13) |
936 | std r3, VCPU_CFAR(r9) |
937 | @@ -1713,22 +1720,25 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300) |
938 | mtspr SPRN_PSPB, r0 |
939 | mtspr SPRN_WORT, r0 |
940 | BEGIN_FTR_SECTION |
941 | - mtspr SPRN_IAMR, r0 |
942 | mtspr SPRN_TCSCR, r0 |
943 | /* Set MMCRS to 1<<31 to freeze and disable the SPMC counters */ |
944 | li r0, 1 |
945 | sldi r0, r0, 31 |
946 | mtspr SPRN_MMCRS, r0 |
947 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300) |
948 | -8: |
949 | |
950 | - /* Save and reset AMR and UAMOR before turning on the MMU */ |
951 | + /* Save and restore AMR, IAMR and UAMOR before turning on the MMU */ |
952 | + ld r8, STACK_SLOT_IAMR(r1) |
953 | + mtspr SPRN_IAMR, r8 |
954 | + |
955 | +8: /* Power7 jumps back in here */ |
956 | mfspr r5,SPRN_AMR |
957 | mfspr r6,SPRN_UAMOR |
958 | std r5,VCPU_AMR(r9) |
959 | std r6,VCPU_UAMOR(r9) |
960 | - li r6,0 |
961 | - mtspr SPRN_AMR,r6 |
962 | + ld r5,STACK_SLOT_AMR(r1) |
963 | + ld r6,STACK_SLOT_UAMOR(r1) |
964 | + mtspr SPRN_AMR, r5 |
965 | mtspr SPRN_UAMOR, r6 |
966 | |
967 | /* Switch DSCR back to host value */ |
968 | @@ -1897,11 +1907,9 @@ BEGIN_FTR_SECTION |
969 | ld r5, STACK_SLOT_TID(r1) |
970 | ld r6, STACK_SLOT_PSSCR(r1) |
971 | ld r7, STACK_SLOT_PID(r1) |
972 | - ld r8, STACK_SLOT_IAMR(r1) |
973 | mtspr SPRN_TIDR, r5 |
974 | mtspr SPRN_PSSCR, r6 |
975 | mtspr SPRN_PID, r7 |
976 | - mtspr SPRN_IAMR, r8 |
977 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) |
978 | |
979 | #ifdef CONFIG_PPC_RADIX_MMU |
980 | diff --git a/arch/powerpc/kvm/book3s_hv_tm.c b/arch/powerpc/kvm/book3s_hv_tm.c |
981 | index 008285058f9b..31cd0f327c8a 100644 |
982 | --- a/arch/powerpc/kvm/book3s_hv_tm.c |
983 | +++ b/arch/powerpc/kvm/book3s_hv_tm.c |
984 | @@ -130,8 +130,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) |
985 | return RESUME_GUEST; |
986 | } |
987 | /* Set CR0 to indicate previous transactional state */ |
988 | - vcpu->arch.cr = (vcpu->arch.cr & 0x0fffffff) | |
989 | - (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); |
990 | + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | |
991 | + (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 29); |
992 | /* L=1 => tresume, L=0 => tsuspend */ |
993 | if (instr & (1 << 21)) { |
994 | if (MSR_TM_SUSPENDED(msr)) |
995 | @@ -174,8 +174,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) |
996 | copy_from_checkpoint(vcpu); |
997 | |
998 | /* Set CR0 to indicate previous transactional state */ |
999 | - vcpu->arch.cr = (vcpu->arch.cr & 0x0fffffff) | |
1000 | - (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); |
1001 | + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | |
1002 | + (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 29); |
1003 | vcpu->arch.shregs.msr &= ~MSR_TS_MASK; |
1004 | return RESUME_GUEST; |
1005 | |
1006 | @@ -204,8 +204,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) |
1007 | copy_to_checkpoint(vcpu); |
1008 | |
1009 | /* Set CR0 to indicate previous transactional state */ |
1010 | - vcpu->arch.cr = (vcpu->arch.cr & 0x0fffffff) | |
1011 | - (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); |
1012 | + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | |
1013 | + (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 29); |
1014 | vcpu->arch.shregs.msr = msr | MSR_TS_S; |
1015 | return RESUME_GUEST; |
1016 | } |
1017 | diff --git a/arch/powerpc/kvm/book3s_hv_tm_builtin.c b/arch/powerpc/kvm/book3s_hv_tm_builtin.c |
1018 | index b2c7c6fca4f9..3cf5863bc06e 100644 |
1019 | --- a/arch/powerpc/kvm/book3s_hv_tm_builtin.c |
1020 | +++ b/arch/powerpc/kvm/book3s_hv_tm_builtin.c |
1021 | @@ -89,7 +89,8 @@ int kvmhv_p9_tm_emulation_early(struct kvm_vcpu *vcpu) |
1022 | if (instr & (1 << 21)) |
1023 | vcpu->arch.shregs.msr = (msr & ~MSR_TS_MASK) | MSR_TS_T; |
1024 | /* Set CR0 to 0b0010 */ |
1025 | - vcpu->arch.cr = (vcpu->arch.cr & 0x0fffffff) | 0x20000000; |
1026 | + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | |
1027 | + 0x20000000; |
1028 | return 1; |
1029 | } |
1030 | |
1031 | @@ -105,5 +106,5 @@ void kvmhv_emulate_tm_rollback(struct kvm_vcpu *vcpu) |
1032 | vcpu->arch.shregs.msr &= ~MSR_TS_MASK; /* go to N state */ |
1033 | vcpu->arch.regs.nip = vcpu->arch.tfhar; |
1034 | copy_from_checkpoint(vcpu); |
1035 | - vcpu->arch.cr = (vcpu->arch.cr & 0x0fffffff) | 0xa0000000; |
1036 | + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | 0xa0000000; |
1037 | } |
1038 | diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c |
1039 | index 614ebb4261f7..de9702219dee 100644 |
1040 | --- a/arch/powerpc/kvm/book3s_pr.c |
1041 | +++ b/arch/powerpc/kvm/book3s_pr.c |
1042 | @@ -167,7 +167,7 @@ void kvmppc_copy_to_svcpu(struct kvm_vcpu *vcpu) |
1043 | svcpu->gpr[11] = vcpu->arch.regs.gpr[11]; |
1044 | svcpu->gpr[12] = vcpu->arch.regs.gpr[12]; |
1045 | svcpu->gpr[13] = vcpu->arch.regs.gpr[13]; |
1046 | - svcpu->cr = vcpu->arch.cr; |
1047 | + svcpu->cr = vcpu->arch.regs.ccr; |
1048 | svcpu->xer = vcpu->arch.regs.xer; |
1049 | svcpu->ctr = vcpu->arch.regs.ctr; |
1050 | svcpu->lr = vcpu->arch.regs.link; |
1051 | @@ -249,7 +249,7 @@ void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu) |
1052 | vcpu->arch.regs.gpr[11] = svcpu->gpr[11]; |
1053 | vcpu->arch.regs.gpr[12] = svcpu->gpr[12]; |
1054 | vcpu->arch.regs.gpr[13] = svcpu->gpr[13]; |
1055 | - vcpu->arch.cr = svcpu->cr; |
1056 | + vcpu->arch.regs.ccr = svcpu->cr; |
1057 | vcpu->arch.regs.xer = svcpu->xer; |
1058 | vcpu->arch.regs.ctr = svcpu->ctr; |
1059 | vcpu->arch.regs.link = svcpu->lr; |
1060 | diff --git a/arch/powerpc/kvm/bookehv_interrupts.S b/arch/powerpc/kvm/bookehv_interrupts.S |
1061 | index 612b7f6a887f..4e5081e58409 100644 |
1062 | --- a/arch/powerpc/kvm/bookehv_interrupts.S |
1063 | +++ b/arch/powerpc/kvm/bookehv_interrupts.S |
1064 | @@ -186,7 +186,7 @@ END_BTB_FLUSH_SECTION |
1065 | */ |
1066 | PPC_LL r4, PACACURRENT(r13) |
1067 | PPC_LL r4, (THREAD + THREAD_KVM_VCPU)(r4) |
1068 | - stw r10, VCPU_CR(r4) |
1069 | + PPC_STL r10, VCPU_CR(r4) |
1070 | PPC_STL r11, VCPU_GPR(R4)(r4) |
1071 | PPC_STL r5, VCPU_GPR(R5)(r4) |
1072 | PPC_STL r6, VCPU_GPR(R6)(r4) |
1073 | @@ -296,7 +296,7 @@ _GLOBAL(kvmppc_handler_\intno\()_\srr1) |
1074 | PPC_STL r4, VCPU_GPR(R4)(r11) |
1075 | PPC_LL r4, THREAD_NORMSAVE(0)(r10) |
1076 | PPC_STL r5, VCPU_GPR(R5)(r11) |
1077 | - stw r13, VCPU_CR(r11) |
1078 | + PPC_STL r13, VCPU_CR(r11) |
1079 | mfspr r5, \srr0 |
1080 | PPC_STL r3, VCPU_GPR(R10)(r11) |
1081 | PPC_LL r3, THREAD_NORMSAVE(2)(r10) |
1082 | @@ -323,7 +323,7 @@ _GLOBAL(kvmppc_handler_\intno\()_\srr1) |
1083 | PPC_STL r4, VCPU_GPR(R4)(r11) |
1084 | PPC_LL r4, GPR9(r8) |
1085 | PPC_STL r5, VCPU_GPR(R5)(r11) |
1086 | - stw r9, VCPU_CR(r11) |
1087 | + PPC_STL r9, VCPU_CR(r11) |
1088 | mfspr r5, \srr0 |
1089 | PPC_STL r3, VCPU_GPR(R8)(r11) |
1090 | PPC_LL r3, GPR10(r8) |
1091 | @@ -647,7 +647,7 @@ lightweight_exit: |
1092 | PPC_LL r3, VCPU_LR(r4) |
1093 | PPC_LL r5, VCPU_XER(r4) |
1094 | PPC_LL r6, VCPU_CTR(r4) |
1095 | - lwz r7, VCPU_CR(r4) |
1096 | + PPC_LL r7, VCPU_CR(r4) |
1097 | PPC_LL r8, VCPU_PC(r4) |
1098 | PPC_LD(r9, VCPU_SHARED_MSR, r11) |
1099 | PPC_LL r0, VCPU_GPR(R0)(r4) |
1100 | diff --git a/arch/powerpc/kvm/emulate_loadstore.c b/arch/powerpc/kvm/emulate_loadstore.c |
1101 | index 75dce1ef3bc8..f91b1309a0a8 100644 |
1102 | --- a/arch/powerpc/kvm/emulate_loadstore.c |
1103 | +++ b/arch/powerpc/kvm/emulate_loadstore.c |
1104 | @@ -117,7 +117,6 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu) |
1105 | |
1106 | emulated = EMULATE_FAIL; |
1107 | vcpu->arch.regs.msr = vcpu->arch.shared->msr; |
1108 | - vcpu->arch.regs.ccr = vcpu->arch.cr; |
1109 | if (analyse_instr(&op, &vcpu->arch.regs, inst) == 0) { |
1110 | int type = op.type & INSTR_TYPE_MASK; |
1111 | int size = GETSIZE(op.type); |
1112 | diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c |
1113 | index f23a89d8e4ce..29fd8940867e 100644 |
1114 | --- a/arch/powerpc/mm/hash_utils_64.c |
1115 | +++ b/arch/powerpc/mm/hash_utils_64.c |
1116 | @@ -1859,11 +1859,20 @@ void hash__setup_initial_memory_limit(phys_addr_t first_memblock_base, |
1117 | * |
1118 | * For guests on platforms before POWER9, we clamp the it limit to 1G |
1119 | * to avoid some funky things such as RTAS bugs etc... |
1120 | + * |
1121 | + * On POWER9 we limit to 1TB in case the host erroneously told us that |
1122 | + * the RMA was >1TB. Effective address bits 0:23 are treated as zero |
1123 | + * (meaning the access is aliased to zero i.e. addr = addr % 1TB) |
1124 | + * for virtual real mode addressing and so it doesn't make sense to |
1125 | + * have an area larger than 1TB as it can't be addressed. |
1126 | */ |
1127 | if (!early_cpu_has_feature(CPU_FTR_HVMODE)) { |
1128 | ppc64_rma_size = first_memblock_size; |
1129 | if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) |
1130 | ppc64_rma_size = min_t(u64, ppc64_rma_size, 0x40000000); |
1131 | + else |
1132 | + ppc64_rma_size = min_t(u64, ppc64_rma_size, |
1133 | + 1UL << SID_SHIFT_1T); |
1134 | |
1135 | /* Finally limit subsequent allocations */ |
1136 | memblock_set_current_limit(ppc64_rma_size); |
1137 | diff --git a/arch/powerpc/mm/pkeys.c b/arch/powerpc/mm/pkeys.c |
1138 | index b271b283c785..25a8dd9cd71d 100644 |
1139 | --- a/arch/powerpc/mm/pkeys.c |
1140 | +++ b/arch/powerpc/mm/pkeys.c |
1141 | @@ -414,3 +414,13 @@ bool arch_vma_access_permitted(struct vm_area_struct *vma, bool write, |
1142 | |
1143 | return pkey_access_permitted(vma_pkey(vma), write, execute); |
1144 | } |
1145 | + |
1146 | +void arch_dup_pkeys(struct mm_struct *oldmm, struct mm_struct *mm) |
1147 | +{ |
1148 | + if (static_branch_likely(&pkey_disabled)) |
1149 | + return; |
1150 | + |
1151 | + /* Duplicate the oldmm pkey state in mm: */ |
1152 | + mm_pkey_allocation_map(mm) = mm_pkey_allocation_map(oldmm); |
1153 | + mm->context.execute_only_pkey = oldmm->context.execute_only_pkey; |
1154 | +} |
1155 | diff --git a/arch/riscv/kernel/ftrace.c b/arch/riscv/kernel/ftrace.c |
1156 | index c433f6d3dd64..a840b7d074f7 100644 |
1157 | --- a/arch/riscv/kernel/ftrace.c |
1158 | +++ b/arch/riscv/kernel/ftrace.c |
1159 | @@ -132,7 +132,6 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr, |
1160 | { |
1161 | unsigned long return_hooker = (unsigned long)&return_to_handler; |
1162 | unsigned long old; |
1163 | - int err; |
1164 | |
1165 | if (unlikely(atomic_read(¤t->tracing_graph_pause))) |
1166 | return; |
1167 | diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h |
1168 | index 3245b95ad2d9..0d3f5cf3ff3e 100644 |
1169 | --- a/arch/x86/include/asm/kvm_host.h |
1170 | +++ b/arch/x86/include/asm/kvm_host.h |
1171 | @@ -117,7 +117,7 @@ static inline gfn_t gfn_to_index(gfn_t gfn, gfn_t base_gfn, int level) |
1172 | } |
1173 | |
1174 | #define KVM_PERMILLE_MMU_PAGES 20 |
1175 | -#define KVM_MIN_ALLOC_MMU_PAGES 64 |
1176 | +#define KVM_MIN_ALLOC_MMU_PAGES 64UL |
1177 | #define KVM_MMU_HASH_SHIFT 12 |
1178 | #define KVM_NUM_MMU_PAGES (1 << KVM_MMU_HASH_SHIFT) |
1179 | #define KVM_MIN_FREE_MMU_PAGES 5 |
1180 | @@ -784,6 +784,9 @@ struct kvm_hv { |
1181 | u64 hv_reenlightenment_control; |
1182 | u64 hv_tsc_emulation_control; |
1183 | u64 hv_tsc_emulation_status; |
1184 | + |
1185 | + /* How many vCPUs have VP index != vCPU index */ |
1186 | + atomic_t num_mismatched_vp_indexes; |
1187 | }; |
1188 | |
1189 | enum kvm_irqchip_mode { |
1190 | @@ -793,9 +796,9 @@ enum kvm_irqchip_mode { |
1191 | }; |
1192 | |
1193 | struct kvm_arch { |
1194 | - unsigned int n_used_mmu_pages; |
1195 | - unsigned int n_requested_mmu_pages; |
1196 | - unsigned int n_max_mmu_pages; |
1197 | + unsigned long n_used_mmu_pages; |
1198 | + unsigned long n_requested_mmu_pages; |
1199 | + unsigned long n_max_mmu_pages; |
1200 | unsigned int indirect_shadow_pages; |
1201 | unsigned long mmu_valid_gen; |
1202 | struct hlist_head mmu_page_hash[KVM_NUM_MMU_PAGES]; |
1203 | @@ -1198,8 +1201,8 @@ void kvm_mmu_clear_dirty_pt_masked(struct kvm *kvm, |
1204 | gfn_t gfn_offset, unsigned long mask); |
1205 | void kvm_mmu_zap_all(struct kvm *kvm); |
1206 | void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen); |
1207 | -unsigned int kvm_mmu_calculate_mmu_pages(struct kvm *kvm); |
1208 | -void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages); |
1209 | +unsigned long kvm_mmu_calculate_mmu_pages(struct kvm *kvm); |
1210 | +void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned long kvm_nr_mmu_pages); |
1211 | |
1212 | int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3); |
1213 | bool pdptrs_changed(struct kvm_vcpu *vcpu); |
1214 | diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c |
1215 | index 50d309662d78..5790671857e5 100644 |
1216 | --- a/arch/x86/kernel/ftrace.c |
1217 | +++ b/arch/x86/kernel/ftrace.c |
1218 | @@ -53,7 +53,7 @@ int ftrace_arch_code_modify_post_process(void) |
1219 | union ftrace_code_union { |
1220 | char code[MCOUNT_INSN_SIZE]; |
1221 | struct { |
1222 | - unsigned char e8; |
1223 | + unsigned char op; |
1224 | int offset; |
1225 | } __attribute__((packed)); |
1226 | }; |
1227 | @@ -63,20 +63,23 @@ static int ftrace_calc_offset(long ip, long addr) |
1228 | return (int)(addr - ip); |
1229 | } |
1230 | |
1231 | -static unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) |
1232 | +static unsigned char * |
1233 | +ftrace_text_replace(unsigned char op, unsigned long ip, unsigned long addr) |
1234 | { |
1235 | static union ftrace_code_union calc; |
1236 | |
1237 | - calc.e8 = 0xe8; |
1238 | + calc.op = op; |
1239 | calc.offset = ftrace_calc_offset(ip + MCOUNT_INSN_SIZE, addr); |
1240 | |
1241 | - /* |
1242 | - * No locking needed, this must be called via kstop_machine |
1243 | - * which in essence is like running on a uniprocessor machine. |
1244 | - */ |
1245 | return calc.code; |
1246 | } |
1247 | |
1248 | +static unsigned char * |
1249 | +ftrace_call_replace(unsigned long ip, unsigned long addr) |
1250 | +{ |
1251 | + return ftrace_text_replace(0xe8, ip, addr); |
1252 | +} |
1253 | + |
1254 | static inline int |
1255 | within(unsigned long addr, unsigned long start, unsigned long end) |
1256 | { |
1257 | @@ -686,22 +689,6 @@ int __init ftrace_dyn_arch_init(void) |
1258 | return 0; |
1259 | } |
1260 | |
1261 | -#if defined(CONFIG_X86_64) || defined(CONFIG_FUNCTION_GRAPH_TRACER) |
1262 | -static unsigned char *ftrace_jmp_replace(unsigned long ip, unsigned long addr) |
1263 | -{ |
1264 | - static union ftrace_code_union calc; |
1265 | - |
1266 | - /* Jmp not a call (ignore the .e8) */ |
1267 | - calc.e8 = 0xe9; |
1268 | - calc.offset = ftrace_calc_offset(ip + MCOUNT_INSN_SIZE, addr); |
1269 | - |
1270 | - /* |
1271 | - * ftrace external locks synchronize the access to the static variable. |
1272 | - */ |
1273 | - return calc.code; |
1274 | -} |
1275 | -#endif |
1276 | - |
1277 | /* Currently only x86_64 supports dynamic trampolines */ |
1278 | #ifdef CONFIG_X86_64 |
1279 | |
1280 | @@ -923,8 +910,8 @@ static void *addr_from_call(void *ptr) |
1281 | return NULL; |
1282 | |
1283 | /* Make sure this is a call */ |
1284 | - if (WARN_ON_ONCE(calc.e8 != 0xe8)) { |
1285 | - pr_warn("Expected e8, got %x\n", calc.e8); |
1286 | + if (WARN_ON_ONCE(calc.op != 0xe8)) { |
1287 | + pr_warn("Expected e8, got %x\n", calc.op); |
1288 | return NULL; |
1289 | } |
1290 | |
1291 | @@ -995,6 +982,11 @@ void arch_ftrace_trampoline_free(struct ftrace_ops *ops) |
1292 | #ifdef CONFIG_DYNAMIC_FTRACE |
1293 | extern void ftrace_graph_call(void); |
1294 | |
1295 | +static unsigned char *ftrace_jmp_replace(unsigned long ip, unsigned long addr) |
1296 | +{ |
1297 | + return ftrace_text_replace(0xe9, ip, addr); |
1298 | +} |
1299 | + |
1300 | static int ftrace_mod_jmp(unsigned long ip, void *func) |
1301 | { |
1302 | unsigned char *new; |
1303 | diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c |
1304 | index 013fe3d21dbb..2ec202cb9dfd 100644 |
1305 | --- a/arch/x86/kernel/kvmclock.c |
1306 | +++ b/arch/x86/kernel/kvmclock.c |
1307 | @@ -117,12 +117,8 @@ static u64 kvm_sched_clock_read(void) |
1308 | |
1309 | static inline void kvm_sched_clock_init(bool stable) |
1310 | { |
1311 | - if (!stable) { |
1312 | - pv_time_ops.sched_clock = kvm_clock_read; |
1313 | + if (!stable) |
1314 | clear_sched_clock_stable(); |
1315 | - return; |
1316 | - } |
1317 | - |
1318 | kvm_sched_clock_offset = kvm_clock_read(); |
1319 | pv_time_ops.sched_clock = kvm_sched_clock_read; |
1320 | |
1321 | diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c |
1322 | index b4866badb235..90ecc108bc8a 100644 |
1323 | --- a/arch/x86/kernel/setup.c |
1324 | +++ b/arch/x86/kernel/setup.c |
1325 | @@ -1251,7 +1251,7 @@ void __init setup_arch(char **cmdline_p) |
1326 | x86_init.hyper.guest_late_init(); |
1327 | |
1328 | e820__reserve_resources(); |
1329 | - e820__register_nosave_regions(max_low_pfn); |
1330 | + e820__register_nosave_regions(max_pfn); |
1331 | |
1332 | x86_init.resources.reserve_resources(); |
1333 | |
1334 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c |
1335 | index 4a688ef9e448..429728b35bca 100644 |
1336 | --- a/arch/x86/kvm/emulate.c |
1337 | +++ b/arch/x86/kvm/emulate.c |
1338 | @@ -2331,12 +2331,16 @@ static int em_lseg(struct x86_emulate_ctxt *ctxt) |
1339 | |
1340 | static int emulator_has_longmode(struct x86_emulate_ctxt *ctxt) |
1341 | { |
1342 | +#ifdef CONFIG_X86_64 |
1343 | u32 eax, ebx, ecx, edx; |
1344 | |
1345 | eax = 0x80000001; |
1346 | ecx = 0; |
1347 | ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, false); |
1348 | return edx & bit(X86_FEATURE_LM); |
1349 | +#else |
1350 | + return false; |
1351 | +#endif |
1352 | } |
1353 | |
1354 | #define GET_SMSTATE(type, smbase, offset) \ |
1355 | @@ -2381,6 +2385,7 @@ static int rsm_load_seg_32(struct x86_emulate_ctxt *ctxt, u64 smbase, int n) |
1356 | return X86EMUL_CONTINUE; |
1357 | } |
1358 | |
1359 | +#ifdef CONFIG_X86_64 |
1360 | static int rsm_load_seg_64(struct x86_emulate_ctxt *ctxt, u64 smbase, int n) |
1361 | { |
1362 | struct desc_struct desc; |
1363 | @@ -2399,6 +2404,7 @@ static int rsm_load_seg_64(struct x86_emulate_ctxt *ctxt, u64 smbase, int n) |
1364 | ctxt->ops->set_segment(ctxt, selector, &desc, base3, n); |
1365 | return X86EMUL_CONTINUE; |
1366 | } |
1367 | +#endif |
1368 | |
1369 | static int rsm_enter_protected_mode(struct x86_emulate_ctxt *ctxt, |
1370 | u64 cr0, u64 cr3, u64 cr4) |
1371 | @@ -2499,6 +2505,7 @@ static int rsm_load_state_32(struct x86_emulate_ctxt *ctxt, u64 smbase) |
1372 | return rsm_enter_protected_mode(ctxt, cr0, cr3, cr4); |
1373 | } |
1374 | |
1375 | +#ifdef CONFIG_X86_64 |
1376 | static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt, u64 smbase) |
1377 | { |
1378 | struct desc_struct desc; |
1379 | @@ -2560,6 +2567,7 @@ static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt, u64 smbase) |
1380 | |
1381 | return X86EMUL_CONTINUE; |
1382 | } |
1383 | +#endif |
1384 | |
1385 | static int em_rsm(struct x86_emulate_ctxt *ctxt) |
1386 | { |
1387 | @@ -2616,9 +2624,11 @@ static int em_rsm(struct x86_emulate_ctxt *ctxt) |
1388 | if (ctxt->ops->pre_leave_smm(ctxt, smbase)) |
1389 | return X86EMUL_UNHANDLEABLE; |
1390 | |
1391 | +#ifdef CONFIG_X86_64 |
1392 | if (emulator_has_longmode(ctxt)) |
1393 | ret = rsm_load_state_64(ctxt, smbase + 0x8000); |
1394 | else |
1395 | +#endif |
1396 | ret = rsm_load_state_32(ctxt, smbase + 0x8000); |
1397 | |
1398 | if (ret != X86EMUL_CONTINUE) { |
1399 | diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c |
1400 | index 229d99605165..5842c5f587fe 100644 |
1401 | --- a/arch/x86/kvm/hyperv.c |
1402 | +++ b/arch/x86/kvm/hyperv.c |
1403 | @@ -132,8 +132,10 @@ static struct kvm_vcpu *get_vcpu_by_vpidx(struct kvm *kvm, u32 vpidx) |
1404 | struct kvm_vcpu *vcpu = NULL; |
1405 | int i; |
1406 | |
1407 | - if (vpidx < KVM_MAX_VCPUS) |
1408 | - vcpu = kvm_get_vcpu(kvm, vpidx); |
1409 | + if (vpidx >= KVM_MAX_VCPUS) |
1410 | + return NULL; |
1411 | + |
1412 | + vcpu = kvm_get_vcpu(kvm, vpidx); |
1413 | if (vcpu && vcpu_to_hv_vcpu(vcpu)->vp_index == vpidx) |
1414 | return vcpu; |
1415 | kvm_for_each_vcpu(i, vcpu, kvm) |
1416 | @@ -689,6 +691,24 @@ void kvm_hv_vcpu_uninit(struct kvm_vcpu *vcpu) |
1417 | stimer_cleanup(&hv_vcpu->stimer[i]); |
1418 | } |
1419 | |
1420 | +bool kvm_hv_assist_page_enabled(struct kvm_vcpu *vcpu) |
1421 | +{ |
1422 | + if (!(vcpu->arch.hyperv.hv_vapic & HV_X64_MSR_VP_ASSIST_PAGE_ENABLE)) |
1423 | + return false; |
1424 | + return vcpu->arch.pv_eoi.msr_val & KVM_MSR_ENABLED; |
1425 | +} |
1426 | +EXPORT_SYMBOL_GPL(kvm_hv_assist_page_enabled); |
1427 | + |
1428 | +bool kvm_hv_get_assist_page(struct kvm_vcpu *vcpu, |
1429 | + struct hv_vp_assist_page *assist_page) |
1430 | +{ |
1431 | + if (!kvm_hv_assist_page_enabled(vcpu)) |
1432 | + return false; |
1433 | + return !kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.pv_eoi.data, |
1434 | + assist_page, sizeof(*assist_page)); |
1435 | +} |
1436 | +EXPORT_SYMBOL_GPL(kvm_hv_get_assist_page); |
1437 | + |
1438 | static void stimer_prepare_msg(struct kvm_vcpu_hv_stimer *stimer) |
1439 | { |
1440 | struct hv_message *msg = &stimer->msg; |
1441 | @@ -1040,21 +1060,41 @@ static u64 current_task_runtime_100ns(void) |
1442 | |
1443 | static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host) |
1444 | { |
1445 | - struct kvm_vcpu_hv *hv = &vcpu->arch.hyperv; |
1446 | + struct kvm_vcpu_hv *hv_vcpu = &vcpu->arch.hyperv; |
1447 | |
1448 | switch (msr) { |
1449 | - case HV_X64_MSR_VP_INDEX: |
1450 | - if (!host) |
1451 | + case HV_X64_MSR_VP_INDEX: { |
1452 | + struct kvm_hv *hv = &vcpu->kvm->arch.hyperv; |
1453 | + int vcpu_idx = kvm_vcpu_get_idx(vcpu); |
1454 | + u32 new_vp_index = (u32)data; |
1455 | + |
1456 | + if (!host || new_vp_index >= KVM_MAX_VCPUS) |
1457 | return 1; |
1458 | - hv->vp_index = (u32)data; |
1459 | + |
1460 | + if (new_vp_index == hv_vcpu->vp_index) |
1461 | + return 0; |
1462 | + |
1463 | + /* |
1464 | + * The VP index is initialized to vcpu_index by |
1465 | + * kvm_hv_vcpu_postcreate so they initially match. Now the |
1466 | + * VP index is changing, adjust num_mismatched_vp_indexes if |
1467 | + * it now matches or no longer matches vcpu_idx. |
1468 | + */ |
1469 | + if (hv_vcpu->vp_index == vcpu_idx) |
1470 | + atomic_inc(&hv->num_mismatched_vp_indexes); |
1471 | + else if (new_vp_index == vcpu_idx) |
1472 | + atomic_dec(&hv->num_mismatched_vp_indexes); |
1473 | + |
1474 | + hv_vcpu->vp_index = new_vp_index; |
1475 | break; |
1476 | + } |
1477 | case HV_X64_MSR_VP_ASSIST_PAGE: { |
1478 | u64 gfn; |
1479 | unsigned long addr; |
1480 | |
1481 | if (!(data & HV_X64_MSR_VP_ASSIST_PAGE_ENABLE)) { |
1482 | - hv->hv_vapic = data; |
1483 | - if (kvm_lapic_enable_pv_eoi(vcpu, 0)) |
1484 | + hv_vcpu->hv_vapic = data; |
1485 | + if (kvm_lapic_enable_pv_eoi(vcpu, 0, 0)) |
1486 | return 1; |
1487 | break; |
1488 | } |
1489 | @@ -1064,10 +1104,11 @@ static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host) |
1490 | return 1; |
1491 | if (__clear_user((void __user *)addr, PAGE_SIZE)) |
1492 | return 1; |
1493 | - hv->hv_vapic = data; |
1494 | + hv_vcpu->hv_vapic = data; |
1495 | kvm_vcpu_mark_page_dirty(vcpu, gfn); |
1496 | if (kvm_lapic_enable_pv_eoi(vcpu, |
1497 | - gfn_to_gpa(gfn) | KVM_MSR_ENABLED)) |
1498 | + gfn_to_gpa(gfn) | KVM_MSR_ENABLED, |
1499 | + sizeof(struct hv_vp_assist_page))) |
1500 | return 1; |
1501 | break; |
1502 | } |
1503 | @@ -1080,7 +1121,7 @@ static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host) |
1504 | case HV_X64_MSR_VP_RUNTIME: |
1505 | if (!host) |
1506 | return 1; |
1507 | - hv->runtime_offset = data - current_task_runtime_100ns(); |
1508 | + hv_vcpu->runtime_offset = data - current_task_runtime_100ns(); |
1509 | break; |
1510 | case HV_X64_MSR_SCONTROL: |
1511 | case HV_X64_MSR_SVERSION: |
1512 | @@ -1172,11 +1213,11 @@ static int kvm_hv_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata, |
1513 | bool host) |
1514 | { |
1515 | u64 data = 0; |
1516 | - struct kvm_vcpu_hv *hv = &vcpu->arch.hyperv; |
1517 | + struct kvm_vcpu_hv *hv_vcpu = &vcpu->arch.hyperv; |
1518 | |
1519 | switch (msr) { |
1520 | case HV_X64_MSR_VP_INDEX: |
1521 | - data = hv->vp_index; |
1522 | + data = hv_vcpu->vp_index; |
1523 | break; |
1524 | case HV_X64_MSR_EOI: |
1525 | return kvm_hv_vapic_msr_read(vcpu, APIC_EOI, pdata); |
1526 | @@ -1185,10 +1226,10 @@ static int kvm_hv_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata, |
1527 | case HV_X64_MSR_TPR: |
1528 | return kvm_hv_vapic_msr_read(vcpu, APIC_TASKPRI, pdata); |
1529 | case HV_X64_MSR_VP_ASSIST_PAGE: |
1530 | - data = hv->hv_vapic; |
1531 | + data = hv_vcpu->hv_vapic; |
1532 | break; |
1533 | case HV_X64_MSR_VP_RUNTIME: |
1534 | - data = current_task_runtime_100ns() + hv->runtime_offset; |
1535 | + data = current_task_runtime_100ns() + hv_vcpu->runtime_offset; |
1536 | break; |
1537 | case HV_X64_MSR_SCONTROL: |
1538 | case HV_X64_MSR_SVERSION: |
1539 | diff --git a/arch/x86/kvm/hyperv.h b/arch/x86/kvm/hyperv.h |
1540 | index d6aa969e20f1..0e66c12ed2c3 100644 |
1541 | --- a/arch/x86/kvm/hyperv.h |
1542 | +++ b/arch/x86/kvm/hyperv.h |
1543 | @@ -62,6 +62,10 @@ void kvm_hv_vcpu_init(struct kvm_vcpu *vcpu); |
1544 | void kvm_hv_vcpu_postcreate(struct kvm_vcpu *vcpu); |
1545 | void kvm_hv_vcpu_uninit(struct kvm_vcpu *vcpu); |
1546 | |
1547 | +bool kvm_hv_assist_page_enabled(struct kvm_vcpu *vcpu); |
1548 | +bool kvm_hv_get_assist_page(struct kvm_vcpu *vcpu, |
1549 | + struct hv_vp_assist_page *assist_page); |
1550 | + |
1551 | static inline struct kvm_vcpu_hv_stimer *vcpu_to_stimer(struct kvm_vcpu *vcpu, |
1552 | int timer_index) |
1553 | { |
1554 | diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c |
1555 | index faa264822cee..007bc654f928 100644 |
1556 | --- a/arch/x86/kvm/irq.c |
1557 | +++ b/arch/x86/kvm/irq.c |
1558 | @@ -172,3 +172,10 @@ void __kvm_migrate_timers(struct kvm_vcpu *vcpu) |
1559 | __kvm_migrate_apic_timer(vcpu); |
1560 | __kvm_migrate_pit_timer(vcpu); |
1561 | } |
1562 | + |
1563 | +bool kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm_irqfd *args) |
1564 | +{ |
1565 | + bool resample = args->flags & KVM_IRQFD_FLAG_RESAMPLE; |
1566 | + |
1567 | + return resample ? irqchip_kernel(kvm) : irqchip_in_kernel(kvm); |
1568 | +} |
1569 | diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h |
1570 | index d5005cc26521..fd210cdd4983 100644 |
1571 | --- a/arch/x86/kvm/irq.h |
1572 | +++ b/arch/x86/kvm/irq.h |
1573 | @@ -114,6 +114,7 @@ static inline int irqchip_in_kernel(struct kvm *kvm) |
1574 | return mode != KVM_IRQCHIP_NONE; |
1575 | } |
1576 | |
1577 | +bool kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm_irqfd *args); |
1578 | void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu); |
1579 | void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu); |
1580 | void kvm_apic_nmi_wd_deliver(struct kvm_vcpu *vcpu); |
1581 | diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c |
1582 | index 5f5bc5976804..262e49301cae 100644 |
1583 | --- a/arch/x86/kvm/lapic.c |
1584 | +++ b/arch/x86/kvm/lapic.c |
1585 | @@ -2633,17 +2633,25 @@ int kvm_hv_vapic_msr_read(struct kvm_vcpu *vcpu, u32 reg, u64 *data) |
1586 | return 0; |
1587 | } |
1588 | |
1589 | -int kvm_lapic_enable_pv_eoi(struct kvm_vcpu *vcpu, u64 data) |
1590 | +int kvm_lapic_enable_pv_eoi(struct kvm_vcpu *vcpu, u64 data, unsigned long len) |
1591 | { |
1592 | u64 addr = data & ~KVM_MSR_ENABLED; |
1593 | + struct gfn_to_hva_cache *ghc = &vcpu->arch.pv_eoi.data; |
1594 | + unsigned long new_len; |
1595 | + |
1596 | if (!IS_ALIGNED(addr, 4)) |
1597 | return 1; |
1598 | |
1599 | vcpu->arch.pv_eoi.msr_val = data; |
1600 | if (!pv_eoi_enabled(vcpu)) |
1601 | return 0; |
1602 | - return kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.pv_eoi.data, |
1603 | - addr, sizeof(u8)); |
1604 | + |
1605 | + if (addr == ghc->gpa && len <= ghc->len) |
1606 | + new_len = ghc->len; |
1607 | + else |
1608 | + new_len = len; |
1609 | + |
1610 | + return kvm_gfn_to_hva_cache_init(vcpu->kvm, ghc, addr, new_len); |
1611 | } |
1612 | |
1613 | void kvm_apic_accept_events(struct kvm_vcpu *vcpu) |
1614 | diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h |
1615 | index ed0ed39abd36..ff6ef9c3d760 100644 |
1616 | --- a/arch/x86/kvm/lapic.h |
1617 | +++ b/arch/x86/kvm/lapic.h |
1618 | @@ -120,7 +120,7 @@ static inline bool kvm_hv_vapic_assist_page_enabled(struct kvm_vcpu *vcpu) |
1619 | return vcpu->arch.hyperv.hv_vapic & HV_X64_MSR_VP_ASSIST_PAGE_ENABLE; |
1620 | } |
1621 | |
1622 | -int kvm_lapic_enable_pv_eoi(struct kvm_vcpu *vcpu, u64 data); |
1623 | +int kvm_lapic_enable_pv_eoi(struct kvm_vcpu *vcpu, u64 data, unsigned long len); |
1624 | void kvm_lapic_init(void); |
1625 | void kvm_lapic_exit(void); |
1626 | |
1627 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c |
1628 | index cdc0c460950f..88940261fb53 100644 |
1629 | --- a/arch/x86/kvm/mmu.c |
1630 | +++ b/arch/x86/kvm/mmu.c |
1631 | @@ -1954,7 +1954,7 @@ static int is_empty_shadow_page(u64 *spt) |
1632 | * aggregate version in order to make the slab shrinker |
1633 | * faster |
1634 | */ |
1635 | -static inline void kvm_mod_used_mmu_pages(struct kvm *kvm, int nr) |
1636 | +static inline void kvm_mod_used_mmu_pages(struct kvm *kvm, unsigned long nr) |
1637 | { |
1638 | kvm->arch.n_used_mmu_pages += nr; |
1639 | percpu_counter_add(&kvm_total_used_mmu_pages, nr); |
1640 | @@ -2704,7 +2704,7 @@ static bool prepare_zap_oldest_mmu_page(struct kvm *kvm, |
1641 | * Changing the number of mmu pages allocated to the vm |
1642 | * Note: if goal_nr_mmu_pages is too small, you will get dead lock |
1643 | */ |
1644 | -void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int goal_nr_mmu_pages) |
1645 | +void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned long goal_nr_mmu_pages) |
1646 | { |
1647 | LIST_HEAD(invalid_list); |
1648 | |
1649 | @@ -5926,10 +5926,10 @@ out: |
1650 | /* |
1651 | * Caculate mmu pages needed for kvm. |
1652 | */ |
1653 | -unsigned int kvm_mmu_calculate_mmu_pages(struct kvm *kvm) |
1654 | +unsigned long kvm_mmu_calculate_mmu_pages(struct kvm *kvm) |
1655 | { |
1656 | - unsigned int nr_mmu_pages; |
1657 | - unsigned int nr_pages = 0; |
1658 | + unsigned long nr_mmu_pages; |
1659 | + unsigned long nr_pages = 0; |
1660 | struct kvm_memslots *slots; |
1661 | struct kvm_memory_slot *memslot; |
1662 | int i; |
1663 | @@ -5942,8 +5942,7 @@ unsigned int kvm_mmu_calculate_mmu_pages(struct kvm *kvm) |
1664 | } |
1665 | |
1666 | nr_mmu_pages = nr_pages * KVM_PERMILLE_MMU_PAGES / 1000; |
1667 | - nr_mmu_pages = max(nr_mmu_pages, |
1668 | - (unsigned int) KVM_MIN_ALLOC_MMU_PAGES); |
1669 | + nr_mmu_pages = max(nr_mmu_pages, KVM_MIN_ALLOC_MMU_PAGES); |
1670 | |
1671 | return nr_mmu_pages; |
1672 | } |
1673 | diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h |
1674 | index 1fab69c0b2f3..65892288bf51 100644 |
1675 | --- a/arch/x86/kvm/mmu.h |
1676 | +++ b/arch/x86/kvm/mmu.h |
1677 | @@ -69,7 +69,7 @@ bool kvm_can_do_async_pf(struct kvm_vcpu *vcpu); |
1678 | int kvm_handle_page_fault(struct kvm_vcpu *vcpu, u64 error_code, |
1679 | u64 fault_address, char *insn, int insn_len); |
1680 | |
1681 | -static inline unsigned int kvm_mmu_available_pages(struct kvm *kvm) |
1682 | +static inline unsigned long kvm_mmu_available_pages(struct kvm *kvm) |
1683 | { |
1684 | if (kvm->arch.n_max_mmu_pages > kvm->arch.n_used_mmu_pages) |
1685 | return kvm->arch.n_max_mmu_pages - |
1686 | diff --git a/arch/x86/kvm/mtrr.c b/arch/x86/kvm/mtrr.c |
1687 | index e9ea2d45ae66..9f72cc427158 100644 |
1688 | --- a/arch/x86/kvm/mtrr.c |
1689 | +++ b/arch/x86/kvm/mtrr.c |
1690 | @@ -48,11 +48,6 @@ static bool msr_mtrr_valid(unsigned msr) |
1691 | return false; |
1692 | } |
1693 | |
1694 | -static bool valid_pat_type(unsigned t) |
1695 | -{ |
1696 | - return t < 8 && (1 << t) & 0xf3; /* 0, 1, 4, 5, 6, 7 */ |
1697 | -} |
1698 | - |
1699 | static bool valid_mtrr_type(unsigned t) |
1700 | { |
1701 | return t < 8 && (1 << t) & 0x73; /* 0, 1, 4, 5, 6 */ |
1702 | @@ -67,10 +62,7 @@ bool kvm_mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data) |
1703 | return false; |
1704 | |
1705 | if (msr == MSR_IA32_CR_PAT) { |
1706 | - for (i = 0; i < 8; i++) |
1707 | - if (!valid_pat_type((data >> (i * 8)) & 0xff)) |
1708 | - return false; |
1709 | - return true; |
1710 | + return kvm_pat_valid(data); |
1711 | } else if (msr == MSR_MTRRdefType) { |
1712 | if (data & ~0xcff) |
1713 | return false; |
1714 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c |
1715 | index 0f33f00aa4df..ac2cc2ed7a85 100644 |
1716 | --- a/arch/x86/kvm/svm.c |
1717 | +++ b/arch/x86/kvm/svm.c |
1718 | @@ -5622,6 +5622,7 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) |
1719 | svm->vmcb->save.cr2 = vcpu->arch.cr2; |
1720 | |
1721 | clgi(); |
1722 | + kvm_load_guest_xcr0(vcpu); |
1723 | |
1724 | /* |
1725 | * If this vCPU has touched SPEC_CTRL, restore the guest's value if |
1726 | @@ -5769,6 +5770,7 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) |
1727 | if (unlikely(svm->vmcb->control.exit_code == SVM_EXIT_NMI)) |
1728 | kvm_before_interrupt(&svm->vcpu); |
1729 | |
1730 | + kvm_put_guest_xcr0(vcpu); |
1731 | stgi(); |
1732 | |
1733 | /* Any pending NMI will happen here */ |
1734 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
1735 | index 2e310ea62d60..2938b4bcc968 100644 |
1736 | --- a/arch/x86/kvm/vmx.c |
1737 | +++ b/arch/x86/kvm/vmx.c |
1738 | @@ -4135,7 +4135,10 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) |
1739 | return vmx_get_vmx_msr(&vmx->nested.msrs, msr_info->index, |
1740 | &msr_info->data); |
1741 | case MSR_IA32_XSS: |
1742 | - if (!vmx_xsaves_supported()) |
1743 | + if (!vmx_xsaves_supported() || |
1744 | + (!msr_info->host_initiated && |
1745 | + !(guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && |
1746 | + guest_cpuid_has(vcpu, X86_FEATURE_XSAVES)))) |
1747 | return 1; |
1748 | msr_info->data = vcpu->arch.ia32_xss; |
1749 | break; |
1750 | @@ -4265,9 +4268,10 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) |
1751 | MSR_TYPE_W); |
1752 | break; |
1753 | case MSR_IA32_CR_PAT: |
1754 | + if (!kvm_pat_valid(data)) |
1755 | + return 1; |
1756 | + |
1757 | if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) { |
1758 | - if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data)) |
1759 | - return 1; |
1760 | vmcs_write64(GUEST_IA32_PAT, data); |
1761 | vcpu->arch.pat = data; |
1762 | break; |
1763 | @@ -4301,7 +4305,10 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) |
1764 | return 1; |
1765 | return vmx_set_vmx_msr(vcpu, msr_index, data); |
1766 | case MSR_IA32_XSS: |
1767 | - if (!vmx_xsaves_supported()) |
1768 | + if (!vmx_xsaves_supported() || |
1769 | + (!msr_info->host_initiated && |
1770 | + !(guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && |
1771 | + guest_cpuid_has(vcpu, X86_FEATURE_XSAVES)))) |
1772 | return 1; |
1773 | /* |
1774 | * The only supported bit as of Skylake is bit 8, but |
1775 | @@ -10437,28 +10444,21 @@ static void vmx_apicv_post_state_restore(struct kvm_vcpu *vcpu) |
1776 | |
1777 | static void vmx_complete_atomic_exit(struct vcpu_vmx *vmx) |
1778 | { |
1779 | - u32 exit_intr_info = 0; |
1780 | - u16 basic_exit_reason = (u16)vmx->exit_reason; |
1781 | - |
1782 | - if (!(basic_exit_reason == EXIT_REASON_MCE_DURING_VMENTRY |
1783 | - || basic_exit_reason == EXIT_REASON_EXCEPTION_NMI)) |
1784 | + if (vmx->exit_reason != EXIT_REASON_EXCEPTION_NMI) |
1785 | return; |
1786 | |
1787 | - if (!(vmx->exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY)) |
1788 | - exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); |
1789 | - vmx->exit_intr_info = exit_intr_info; |
1790 | + vmx->exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); |
1791 | |
1792 | /* if exit due to PF check for async PF */ |
1793 | - if (is_page_fault(exit_intr_info)) |
1794 | + if (is_page_fault(vmx->exit_intr_info)) |
1795 | vmx->vcpu.arch.apf.host_apf_reason = kvm_read_and_reset_pf_reason(); |
1796 | |
1797 | /* Handle machine checks before interrupts are enabled */ |
1798 | - if (basic_exit_reason == EXIT_REASON_MCE_DURING_VMENTRY || |
1799 | - is_machine_check(exit_intr_info)) |
1800 | + if (is_machine_check(vmx->exit_intr_info)) |
1801 | kvm_machine_check(); |
1802 | |
1803 | /* We need to handle NMIs before interrupts are enabled */ |
1804 | - if (is_nmi(exit_intr_info)) { |
1805 | + if (is_nmi(vmx->exit_intr_info)) { |
1806 | kvm_before_interrupt(&vmx->vcpu); |
1807 | asm("int $2"); |
1808 | kvm_after_interrupt(&vmx->vcpu); |
1809 | @@ -10756,6 +10756,8 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) |
1810 | if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) |
1811 | vmx_set_interrupt_shadow(vcpu, 0); |
1812 | |
1813 | + kvm_load_guest_xcr0(vcpu); |
1814 | + |
1815 | if (static_cpu_has(X86_FEATURE_PKU) && |
1816 | kvm_read_cr4_bits(vcpu, X86_CR4_PKE) && |
1817 | vcpu->arch.pkru != vmx->host_pkru) |
1818 | @@ -10808,7 +10810,7 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) |
1819 | "mov %%" _ASM_AX", %%cr2 \n\t" |
1820 | "3: \n\t" |
1821 | /* Check if vmlaunch of vmresume is needed */ |
1822 | - "cmpl $0, %c[launched](%0) \n\t" |
1823 | + "cmpb $0, %c[launched](%0) \n\t" |
1824 | /* Load guest registers. Don't clobber flags. */ |
1825 | "mov %c[rax](%0), %%" _ASM_AX " \n\t" |
1826 | "mov %c[rbx](%0), %%" _ASM_BX " \n\t" |
1827 | @@ -10971,10 +10973,15 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) |
1828 | __write_pkru(vmx->host_pkru); |
1829 | } |
1830 | |
1831 | + kvm_put_guest_xcr0(vcpu); |
1832 | + |
1833 | vmx->nested.nested_run_pending = 0; |
1834 | vmx->idt_vectoring_info = 0; |
1835 | |
1836 | vmx->exit_reason = vmx->fail ? 0xdead : vmcs_read32(VM_EXIT_REASON); |
1837 | + if ((u16)vmx->exit_reason == EXIT_REASON_MCE_DURING_VMENTRY) |
1838 | + kvm_machine_check(); |
1839 | + |
1840 | if (vmx->fail || (vmx->exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY)) |
1841 | return; |
1842 | |
1843 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
1844 | index c27ce6059090..cbc39751f36b 100644 |
1845 | --- a/arch/x86/kvm/x86.c |
1846 | +++ b/arch/x86/kvm/x86.c |
1847 | @@ -713,7 +713,7 @@ void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw) |
1848 | } |
1849 | EXPORT_SYMBOL_GPL(kvm_lmsw); |
1850 | |
1851 | -static void kvm_load_guest_xcr0(struct kvm_vcpu *vcpu) |
1852 | +void kvm_load_guest_xcr0(struct kvm_vcpu *vcpu) |
1853 | { |
1854 | if (kvm_read_cr4_bits(vcpu, X86_CR4_OSXSAVE) && |
1855 | !vcpu->guest_xcr0_loaded) { |
1856 | @@ -723,8 +723,9 @@ static void kvm_load_guest_xcr0(struct kvm_vcpu *vcpu) |
1857 | vcpu->guest_xcr0_loaded = 1; |
1858 | } |
1859 | } |
1860 | +EXPORT_SYMBOL_GPL(kvm_load_guest_xcr0); |
1861 | |
1862 | -static void kvm_put_guest_xcr0(struct kvm_vcpu *vcpu) |
1863 | +void kvm_put_guest_xcr0(struct kvm_vcpu *vcpu) |
1864 | { |
1865 | if (vcpu->guest_xcr0_loaded) { |
1866 | if (vcpu->arch.xcr0 != host_xcr0) |
1867 | @@ -732,6 +733,7 @@ static void kvm_put_guest_xcr0(struct kvm_vcpu *vcpu) |
1868 | vcpu->guest_xcr0_loaded = 0; |
1869 | } |
1870 | } |
1871 | +EXPORT_SYMBOL_GPL(kvm_put_guest_xcr0); |
1872 | |
1873 | static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) |
1874 | { |
1875 | @@ -2494,7 +2496,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) |
1876 | |
1877 | break; |
1878 | case MSR_KVM_PV_EOI_EN: |
1879 | - if (kvm_lapic_enable_pv_eoi(vcpu, data)) |
1880 | + if (kvm_lapic_enable_pv_eoi(vcpu, data, sizeof(u8))) |
1881 | return 1; |
1882 | break; |
1883 | |
1884 | @@ -4116,7 +4118,7 @@ static int kvm_vm_ioctl_set_identity_map_addr(struct kvm *kvm, |
1885 | } |
1886 | |
1887 | static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm, |
1888 | - u32 kvm_nr_mmu_pages) |
1889 | + unsigned long kvm_nr_mmu_pages) |
1890 | { |
1891 | if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES) |
1892 | return -EINVAL; |
1893 | @@ -4130,7 +4132,7 @@ static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm, |
1894 | return 0; |
1895 | } |
1896 | |
1897 | -static int kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm) |
1898 | +static unsigned long kvm_vm_ioctl_get_nr_mmu_pages(struct kvm *kvm) |
1899 | { |
1900 | return kvm->arch.n_max_mmu_pages; |
1901 | } |
1902 | @@ -7225,9 +7227,9 @@ static void enter_smm_save_state_32(struct kvm_vcpu *vcpu, char *buf) |
1903 | put_smstate(u32, buf, 0x7ef8, vcpu->arch.smbase); |
1904 | } |
1905 | |
1906 | +#ifdef CONFIG_X86_64 |
1907 | static void enter_smm_save_state_64(struct kvm_vcpu *vcpu, char *buf) |
1908 | { |
1909 | -#ifdef CONFIG_X86_64 |
1910 | struct desc_ptr dt; |
1911 | struct kvm_segment seg; |
1912 | unsigned long val; |
1913 | @@ -7277,10 +7279,8 @@ static void enter_smm_save_state_64(struct kvm_vcpu *vcpu, char *buf) |
1914 | |
1915 | for (i = 0; i < 6; i++) |
1916 | enter_smm_save_seg_64(vcpu, buf, i); |
1917 | -#else |
1918 | - WARN_ON_ONCE(1); |
1919 | -#endif |
1920 | } |
1921 | +#endif |
1922 | |
1923 | static void enter_smm(struct kvm_vcpu *vcpu) |
1924 | { |
1925 | @@ -7291,9 +7291,11 @@ static void enter_smm(struct kvm_vcpu *vcpu) |
1926 | |
1927 | trace_kvm_enter_smm(vcpu->vcpu_id, vcpu->arch.smbase, true); |
1928 | memset(buf, 0, 512); |
1929 | +#ifdef CONFIG_X86_64 |
1930 | if (guest_cpuid_has(vcpu, X86_FEATURE_LM)) |
1931 | enter_smm_save_state_64(vcpu, buf); |
1932 | else |
1933 | +#endif |
1934 | enter_smm_save_state_32(vcpu, buf); |
1935 | |
1936 | /* |
1937 | @@ -7351,8 +7353,10 @@ static void enter_smm(struct kvm_vcpu *vcpu) |
1938 | kvm_set_segment(vcpu, &ds, VCPU_SREG_GS); |
1939 | kvm_set_segment(vcpu, &ds, VCPU_SREG_SS); |
1940 | |
1941 | +#ifdef CONFIG_X86_64 |
1942 | if (guest_cpuid_has(vcpu, X86_FEATURE_LM)) |
1943 | kvm_x86_ops->set_efer(vcpu, 0); |
1944 | +#endif |
1945 | |
1946 | kvm_update_cpuid(vcpu); |
1947 | kvm_mmu_reset_context(vcpu); |
1948 | @@ -7649,8 +7653,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) |
1949 | goto cancel_injection; |
1950 | } |
1951 | |
1952 | - kvm_load_guest_xcr0(vcpu); |
1953 | - |
1954 | if (req_immediate_exit) { |
1955 | kvm_make_request(KVM_REQ_EVENT, vcpu); |
1956 | kvm_x86_ops->request_immediate_exit(vcpu); |
1957 | @@ -7703,8 +7705,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) |
1958 | vcpu->mode = OUTSIDE_GUEST_MODE; |
1959 | smp_wmb(); |
1960 | |
1961 | - kvm_put_guest_xcr0(vcpu); |
1962 | - |
1963 | kvm_before_interrupt(vcpu); |
1964 | kvm_x86_ops->handle_external_intr(vcpu); |
1965 | kvm_after_interrupt(vcpu); |
1966 | diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h |
1967 | index 1826ed9dd1c8..3a91ea760f07 100644 |
1968 | --- a/arch/x86/kvm/x86.h |
1969 | +++ b/arch/x86/kvm/x86.h |
1970 | @@ -345,4 +345,16 @@ static inline void kvm_after_interrupt(struct kvm_vcpu *vcpu) |
1971 | __this_cpu_write(current_vcpu, NULL); |
1972 | } |
1973 | |
1974 | + |
1975 | +static inline bool kvm_pat_valid(u64 data) |
1976 | +{ |
1977 | + if (data & 0xF8F8F8F8F8F8F8F8ull) |
1978 | + return false; |
1979 | + /* 0, 1, 4, 5, 6, 7 are valid values. */ |
1980 | + return (data | ((data & 0x0202020202020202ull) << 1)) == data; |
1981 | +} |
1982 | + |
1983 | +void kvm_load_guest_xcr0(struct kvm_vcpu *vcpu); |
1984 | +void kvm_put_guest_xcr0(struct kvm_vcpu *vcpu); |
1985 | + |
1986 | #endif |
1987 | diff --git a/block/blk-core.c b/block/blk-core.c |
1988 | index 4a3e1f417880..af635f878f96 100644 |
1989 | --- a/block/blk-core.c |
1990 | +++ b/block/blk-core.c |
1991 | @@ -816,7 +816,8 @@ void blk_cleanup_queue(struct request_queue *q) |
1992 | blk_exit_queue(q); |
1993 | |
1994 | if (q->mq_ops) |
1995 | - blk_mq_free_queue(q); |
1996 | + blk_mq_exit_queue(q); |
1997 | + |
1998 | percpu_ref_exit(&q->q_usage_counter); |
1999 | |
2000 | spin_lock_irq(lock); |
2001 | diff --git a/block/blk-iolatency.c b/block/blk-iolatency.c |
2002 | index f4f7c73fb828..0529e94a20f7 100644 |
2003 | --- a/block/blk-iolatency.c |
2004 | +++ b/block/blk-iolatency.c |
2005 | @@ -560,15 +560,12 @@ static void blkcg_iolatency_done_bio(struct rq_qos *rqos, struct bio *bio) |
2006 | u64 now = ktime_to_ns(ktime_get()); |
2007 | bool issue_as_root = bio_issue_as_root_blkg(bio); |
2008 | bool enabled = false; |
2009 | + int inflight = 0; |
2010 | |
2011 | blkg = bio->bi_blkg; |
2012 | if (!blkg) |
2013 | return; |
2014 | |
2015 | - /* We didn't actually submit this bio, don't account it. */ |
2016 | - if (bio->bi_status == BLK_STS_AGAIN) |
2017 | - return; |
2018 | - |
2019 | iolat = blkg_to_lat(bio->bi_blkg); |
2020 | if (!iolat) |
2021 | return; |
2022 | @@ -585,41 +582,24 @@ static void blkcg_iolatency_done_bio(struct rq_qos *rqos, struct bio *bio) |
2023 | } |
2024 | rqw = &iolat->rq_wait; |
2025 | |
2026 | - atomic_dec(&rqw->inflight); |
2027 | - if (iolat->min_lat_nsec == 0) |
2028 | - goto next; |
2029 | - iolatency_record_time(iolat, &bio->bi_issue, now, |
2030 | - issue_as_root); |
2031 | - window_start = atomic64_read(&iolat->window_start); |
2032 | - if (now > window_start && |
2033 | - (now - window_start) >= iolat->cur_win_nsec) { |
2034 | - if (atomic64_cmpxchg(&iolat->window_start, |
2035 | - window_start, now) == window_start) |
2036 | - iolatency_check_latencies(iolat, now); |
2037 | + inflight = atomic_dec_return(&rqw->inflight); |
2038 | + WARN_ON_ONCE(inflight < 0); |
2039 | + /* |
2040 | + * If bi_status is BLK_STS_AGAIN, the bio wasn't actually |
2041 | + * submitted, so do not account for it. |
2042 | + */ |
2043 | + if (iolat->min_lat_nsec && bio->bi_status != BLK_STS_AGAIN) { |
2044 | + iolatency_record_time(iolat, &bio->bi_issue, now, |
2045 | + issue_as_root); |
2046 | + window_start = atomic64_read(&iolat->window_start); |
2047 | + if (now > window_start && |
2048 | + (now - window_start) >= iolat->cur_win_nsec) { |
2049 | + if (atomic64_cmpxchg(&iolat->window_start, |
2050 | + window_start, now) == window_start) |
2051 | + iolatency_check_latencies(iolat, now); |
2052 | + } |
2053 | } |
2054 | -next: |
2055 | - wake_up(&rqw->wait); |
2056 | - blkg = blkg->parent; |
2057 | - } |
2058 | -} |
2059 | - |
2060 | -static void blkcg_iolatency_cleanup(struct rq_qos *rqos, struct bio *bio) |
2061 | -{ |
2062 | - struct blkcg_gq *blkg; |
2063 | - |
2064 | - blkg = bio->bi_blkg; |
2065 | - while (blkg && blkg->parent) { |
2066 | - struct rq_wait *rqw; |
2067 | - struct iolatency_grp *iolat; |
2068 | - |
2069 | - iolat = blkg_to_lat(blkg); |
2070 | - if (!iolat) |
2071 | - goto next; |
2072 | - |
2073 | - rqw = &iolat->rq_wait; |
2074 | - atomic_dec(&rqw->inflight); |
2075 | wake_up(&rqw->wait); |
2076 | -next: |
2077 | blkg = blkg->parent; |
2078 | } |
2079 | } |
2080 | @@ -635,7 +615,6 @@ static void blkcg_iolatency_exit(struct rq_qos *rqos) |
2081 | |
2082 | static struct rq_qos_ops blkcg_iolatency_ops = { |
2083 | .throttle = blkcg_iolatency_throttle, |
2084 | - .cleanup = blkcg_iolatency_cleanup, |
2085 | .done_bio = blkcg_iolatency_done_bio, |
2086 | .exit = blkcg_iolatency_exit, |
2087 | }; |
2088 | diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c |
2089 | index aafb44224c89..0b7297a43ccd 100644 |
2090 | --- a/block/blk-mq-sysfs.c |
2091 | +++ b/block/blk-mq-sysfs.c |
2092 | @@ -10,6 +10,7 @@ |
2093 | #include <linux/smp.h> |
2094 | |
2095 | #include <linux/blk-mq.h> |
2096 | +#include "blk.h" |
2097 | #include "blk-mq.h" |
2098 | #include "blk-mq-tag.h" |
2099 | |
2100 | @@ -21,6 +22,11 @@ static void blk_mq_hw_sysfs_release(struct kobject *kobj) |
2101 | { |
2102 | struct blk_mq_hw_ctx *hctx = container_of(kobj, struct blk_mq_hw_ctx, |
2103 | kobj); |
2104 | + |
2105 | + if (hctx->flags & BLK_MQ_F_BLOCKING) |
2106 | + cleanup_srcu_struct(hctx->srcu); |
2107 | + blk_free_flush_queue(hctx->fq); |
2108 | + sbitmap_free(&hctx->ctx_map); |
2109 | free_cpumask_var(hctx->cpumask); |
2110 | kfree(hctx->ctxs); |
2111 | kfree(hctx); |
2112 | diff --git a/block/blk-mq.c b/block/blk-mq.c |
2113 | index 70d839b9c3b0..455fda99255a 100644 |
2114 | --- a/block/blk-mq.c |
2115 | +++ b/block/blk-mq.c |
2116 | @@ -2157,12 +2157,7 @@ static void blk_mq_exit_hctx(struct request_queue *q, |
2117 | if (set->ops->exit_hctx) |
2118 | set->ops->exit_hctx(hctx, hctx_idx); |
2119 | |
2120 | - if (hctx->flags & BLK_MQ_F_BLOCKING) |
2121 | - cleanup_srcu_struct(hctx->srcu); |
2122 | - |
2123 | blk_mq_remove_cpuhp(hctx); |
2124 | - blk_free_flush_queue(hctx->fq); |
2125 | - sbitmap_free(&hctx->ctx_map); |
2126 | } |
2127 | |
2128 | static void blk_mq_exit_hw_queues(struct request_queue *q, |
2129 | @@ -2662,7 +2657,8 @@ err_exit: |
2130 | } |
2131 | EXPORT_SYMBOL(blk_mq_init_allocated_queue); |
2132 | |
2133 | -void blk_mq_free_queue(struct request_queue *q) |
2134 | +/* tags can _not_ be used after returning from blk_mq_exit_queue */ |
2135 | +void blk_mq_exit_queue(struct request_queue *q) |
2136 | { |
2137 | struct blk_mq_tag_set *set = q->tag_set; |
2138 | |
2139 | diff --git a/block/blk-mq.h b/block/blk-mq.h |
2140 | index 9497b47e2526..5ad9251627f8 100644 |
2141 | --- a/block/blk-mq.h |
2142 | +++ b/block/blk-mq.h |
2143 | @@ -31,7 +31,7 @@ struct blk_mq_ctx { |
2144 | } ____cacheline_aligned_in_smp; |
2145 | |
2146 | void blk_mq_freeze_queue(struct request_queue *q); |
2147 | -void blk_mq_free_queue(struct request_queue *q); |
2148 | +void blk_mq_exit_queue(struct request_queue *q); |
2149 | int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr); |
2150 | void blk_mq_wake_waiters(struct request_queue *q); |
2151 | bool blk_mq_dispatch_rq_list(struct request_queue *, struct list_head *, bool); |
2152 | diff --git a/drivers/char/tpm/st33zp24/i2c.c b/drivers/char/tpm/st33zp24/i2c.c |
2153 | index be5d1abd3e8e..8390c5b54c3b 100644 |
2154 | --- a/drivers/char/tpm/st33zp24/i2c.c |
2155 | +++ b/drivers/char/tpm/st33zp24/i2c.c |
2156 | @@ -33,7 +33,7 @@ |
2157 | |
2158 | struct st33zp24_i2c_phy { |
2159 | struct i2c_client *client; |
2160 | - u8 buf[TPM_BUFSIZE + 1]; |
2161 | + u8 buf[ST33ZP24_BUFSIZE + 1]; |
2162 | int io_lpcpd; |
2163 | }; |
2164 | |
2165 | diff --git a/drivers/char/tpm/st33zp24/spi.c b/drivers/char/tpm/st33zp24/spi.c |
2166 | index d7909ab287a8..ff019a1e3c68 100644 |
2167 | --- a/drivers/char/tpm/st33zp24/spi.c |
2168 | +++ b/drivers/char/tpm/st33zp24/spi.c |
2169 | @@ -63,7 +63,7 @@ |
2170 | * some latency byte before the answer is available (max 15). |
2171 | * We have 2048 + 1024 + 15. |
2172 | */ |
2173 | -#define ST33ZP24_SPI_BUFFER_SIZE (TPM_BUFSIZE + (TPM_BUFSIZE / 2) +\ |
2174 | +#define ST33ZP24_SPI_BUFFER_SIZE (ST33ZP24_BUFSIZE + (ST33ZP24_BUFSIZE / 2) +\ |
2175 | MAX_SPI_LATENCY) |
2176 | |
2177 | |
2178 | diff --git a/drivers/char/tpm/st33zp24/st33zp24.h b/drivers/char/tpm/st33zp24/st33zp24.h |
2179 | index 6f4a4198af6a..20da0a84988d 100644 |
2180 | --- a/drivers/char/tpm/st33zp24/st33zp24.h |
2181 | +++ b/drivers/char/tpm/st33zp24/st33zp24.h |
2182 | @@ -18,8 +18,8 @@ |
2183 | #ifndef __LOCAL_ST33ZP24_H__ |
2184 | #define __LOCAL_ST33ZP24_H__ |
2185 | |
2186 | -#define TPM_WRITE_DIRECTION 0x80 |
2187 | -#define TPM_BUFSIZE 2048 |
2188 | +#define TPM_WRITE_DIRECTION 0x80 |
2189 | +#define ST33ZP24_BUFSIZE 2048 |
2190 | |
2191 | struct st33zp24_dev { |
2192 | struct tpm_chip *chip; |
2193 | diff --git a/drivers/char/tpm/tpm_i2c_infineon.c b/drivers/char/tpm/tpm_i2c_infineon.c |
2194 | index 977fd42daa1b..3b4e9672ff6c 100644 |
2195 | --- a/drivers/char/tpm/tpm_i2c_infineon.c |
2196 | +++ b/drivers/char/tpm/tpm_i2c_infineon.c |
2197 | @@ -26,8 +26,7 @@ |
2198 | #include <linux/wait.h> |
2199 | #include "tpm.h" |
2200 | |
2201 | -/* max. buffer size supported by our TPM */ |
2202 | -#define TPM_BUFSIZE 1260 |
2203 | +#define TPM_I2C_INFINEON_BUFSIZE 1260 |
2204 | |
2205 | /* max. number of iterations after I2C NAK */ |
2206 | #define MAX_COUNT 3 |
2207 | @@ -63,11 +62,13 @@ enum i2c_chip_type { |
2208 | UNKNOWN, |
2209 | }; |
2210 | |
2211 | -/* Structure to store I2C TPM specific stuff */ |
2212 | struct tpm_inf_dev { |
2213 | struct i2c_client *client; |
2214 | int locality; |
2215 | - u8 buf[TPM_BUFSIZE + sizeof(u8)]; /* max. buffer size + addr */ |
2216 | + /* In addition to the data itself, the buffer must fit the 7-bit I2C |
2217 | + * address and the direction bit. |
2218 | + */ |
2219 | + u8 buf[TPM_I2C_INFINEON_BUFSIZE + 1]; |
2220 | struct tpm_chip *chip; |
2221 | enum i2c_chip_type chip_type; |
2222 | unsigned int adapterlimit; |
2223 | @@ -219,7 +220,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len, |
2224 | .buf = tpm_dev.buf |
2225 | }; |
2226 | |
2227 | - if (len > TPM_BUFSIZE) |
2228 | + if (len > TPM_I2C_INFINEON_BUFSIZE) |
2229 | return -EINVAL; |
2230 | |
2231 | if (!tpm_dev.client->adapter->algo->master_xfer) |
2232 | @@ -527,8 +528,8 @@ static int tpm_tis_i2c_send(struct tpm_chip *chip, u8 *buf, size_t len) |
2233 | u8 retries = 0; |
2234 | u8 sts = TPM_STS_GO; |
2235 | |
2236 | - if (len > TPM_BUFSIZE) |
2237 | - return -E2BIG; /* command is too long for our tpm, sorry */ |
2238 | + if (len > TPM_I2C_INFINEON_BUFSIZE) |
2239 | + return -E2BIG; |
2240 | |
2241 | if (request_locality(chip, 0) < 0) |
2242 | return -EBUSY; |
2243 | diff --git a/drivers/char/tpm/tpm_i2c_nuvoton.c b/drivers/char/tpm/tpm_i2c_nuvoton.c |
2244 | index b8defdfdf2dc..280308009784 100644 |
2245 | --- a/drivers/char/tpm/tpm_i2c_nuvoton.c |
2246 | +++ b/drivers/char/tpm/tpm_i2c_nuvoton.c |
2247 | @@ -35,14 +35,12 @@ |
2248 | #include "tpm.h" |
2249 | |
2250 | /* I2C interface offsets */ |
2251 | -#define TPM_STS 0x00 |
2252 | -#define TPM_BURST_COUNT 0x01 |
2253 | -#define TPM_DATA_FIFO_W 0x20 |
2254 | -#define TPM_DATA_FIFO_R 0x40 |
2255 | -#define TPM_VID_DID_RID 0x60 |
2256 | -/* TPM command header size */ |
2257 | -#define TPM_HEADER_SIZE 10 |
2258 | -#define TPM_RETRY 5 |
2259 | +#define TPM_STS 0x00 |
2260 | +#define TPM_BURST_COUNT 0x01 |
2261 | +#define TPM_DATA_FIFO_W 0x20 |
2262 | +#define TPM_DATA_FIFO_R 0x40 |
2263 | +#define TPM_VID_DID_RID 0x60 |
2264 | +#define TPM_I2C_RETRIES 5 |
2265 | /* |
2266 | * I2C bus device maximum buffer size w/o counting I2C address or command |
2267 | * i.e. max size required for I2C write is 34 = addr, command, 32 bytes data |
2268 | @@ -292,7 +290,7 @@ static int i2c_nuvoton_recv(struct tpm_chip *chip, u8 *buf, size_t count) |
2269 | dev_err(dev, "%s() count < header size\n", __func__); |
2270 | return -EIO; |
2271 | } |
2272 | - for (retries = 0; retries < TPM_RETRY; retries++) { |
2273 | + for (retries = 0; retries < TPM_I2C_RETRIES; retries++) { |
2274 | if (retries > 0) { |
2275 | /* if this is not the first trial, set responseRetry */ |
2276 | i2c_nuvoton_write_status(client, |
2277 | diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c |
2278 | index 0934d3724495..4080d4e78e8e 100644 |
2279 | --- a/drivers/clk/clk-s2mps11.c |
2280 | +++ b/drivers/clk/clk-s2mps11.c |
2281 | @@ -255,7 +255,7 @@ MODULE_DEVICE_TABLE(platform, s2mps11_clk_id); |
2282 | * This requires of_device_id table. In the same time this will not change the |
2283 | * actual *device* matching so do not add .of_match_table. |
2284 | */ |
2285 | -static const struct of_device_id s2mps11_dt_match[] = { |
2286 | +static const struct of_device_id s2mps11_dt_match[] __used = { |
2287 | { |
2288 | .compatible = "samsung,s2mps11-clk", |
2289 | .data = (void *)S2MPS11X, |
2290 | diff --git a/drivers/clk/tegra/clk-audio-sync.c b/drivers/clk/tegra/clk-audio-sync.c |
2291 | index 92d04ce2dee6..53cdc0ec40f3 100644 |
2292 | --- a/drivers/clk/tegra/clk-audio-sync.c |
2293 | +++ b/drivers/clk/tegra/clk-audio-sync.c |
2294 | @@ -55,7 +55,7 @@ const struct clk_ops tegra_clk_sync_source_ops = { |
2295 | }; |
2296 | |
2297 | struct clk *tegra_clk_register_sync_source(const char *name, |
2298 | - unsigned long rate, unsigned long max_rate) |
2299 | + unsigned long max_rate) |
2300 | { |
2301 | struct tegra_clk_sync_source *sync; |
2302 | struct clk_init_data init; |
2303 | @@ -67,7 +67,6 @@ struct clk *tegra_clk_register_sync_source(const char *name, |
2304 | return ERR_PTR(-ENOMEM); |
2305 | } |
2306 | |
2307 | - sync->rate = rate; |
2308 | sync->max_rate = max_rate; |
2309 | |
2310 | init.ops = &tegra_clk_sync_source_ops; |
2311 | diff --git a/drivers/clk/tegra/clk-tegra-audio.c b/drivers/clk/tegra/clk-tegra-audio.c |
2312 | index b37cae7af26d..02dd6487d855 100644 |
2313 | --- a/drivers/clk/tegra/clk-tegra-audio.c |
2314 | +++ b/drivers/clk/tegra/clk-tegra-audio.c |
2315 | @@ -49,8 +49,6 @@ struct tegra_sync_source_initdata { |
2316 | #define SYNC(_name) \ |
2317 | {\ |
2318 | .name = #_name,\ |
2319 | - .rate = 24000000,\ |
2320 | - .max_rate = 24000000,\ |
2321 | .clk_id = tegra_clk_ ## _name,\ |
2322 | } |
2323 | |
2324 | @@ -176,7 +174,7 @@ static void __init tegra_audio_sync_clk_init(void __iomem *clk_base, |
2325 | void __init tegra_audio_clk_init(void __iomem *clk_base, |
2326 | void __iomem *pmc_base, struct tegra_clk *tegra_clks, |
2327 | struct tegra_audio_clk_info *audio_info, |
2328 | - unsigned int num_plls) |
2329 | + unsigned int num_plls, unsigned long sync_max_rate) |
2330 | { |
2331 | struct clk *clk; |
2332 | struct clk **dt_clk; |
2333 | @@ -221,8 +219,7 @@ void __init tegra_audio_clk_init(void __iomem *clk_base, |
2334 | if (!dt_clk) |
2335 | continue; |
2336 | |
2337 | - clk = tegra_clk_register_sync_source(data->name, |
2338 | - data->rate, data->max_rate); |
2339 | + clk = tegra_clk_register_sync_source(data->name, sync_max_rate); |
2340 | *dt_clk = clk; |
2341 | } |
2342 | |
2343 | diff --git a/drivers/clk/tegra/clk-tegra114.c b/drivers/clk/tegra/clk-tegra114.c |
2344 | index 1824f014202b..625d11091330 100644 |
2345 | --- a/drivers/clk/tegra/clk-tegra114.c |
2346 | +++ b/drivers/clk/tegra/clk-tegra114.c |
2347 | @@ -1190,6 +1190,13 @@ static struct tegra_clk_init_table init_table[] __initdata = { |
2348 | { TEGRA114_CLK_XUSB_FALCON_SRC, TEGRA114_CLK_PLL_P, 204000000, 0 }, |
2349 | { TEGRA114_CLK_XUSB_HOST_SRC, TEGRA114_CLK_PLL_P, 102000000, 0 }, |
2350 | { TEGRA114_CLK_VDE, TEGRA114_CLK_CLK_MAX, 600000000, 0 }, |
2351 | + { TEGRA114_CLK_SPDIF_IN_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 }, |
2352 | + { TEGRA114_CLK_I2S0_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 }, |
2353 | + { TEGRA114_CLK_I2S1_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 }, |
2354 | + { TEGRA114_CLK_I2S2_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 }, |
2355 | + { TEGRA114_CLK_I2S3_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 }, |
2356 | + { TEGRA114_CLK_I2S4_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 }, |
2357 | + { TEGRA114_CLK_VIMCLK_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 }, |
2358 | /* must be the last entry */ |
2359 | { TEGRA114_CLK_CLK_MAX, TEGRA114_CLK_CLK_MAX, 0, 0 }, |
2360 | }; |
2361 | @@ -1362,7 +1369,7 @@ static void __init tegra114_clock_init(struct device_node *np) |
2362 | tegra114_periph_clk_init(clk_base, pmc_base); |
2363 | tegra_audio_clk_init(clk_base, pmc_base, tegra114_clks, |
2364 | tegra114_audio_plls, |
2365 | - ARRAY_SIZE(tegra114_audio_plls)); |
2366 | + ARRAY_SIZE(tegra114_audio_plls), 24000000); |
2367 | tegra_pmc_clk_init(pmc_base, tegra114_clks); |
2368 | tegra_super_clk_gen4_init(clk_base, pmc_base, tegra114_clks, |
2369 | &pll_x_params); |
2370 | diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c |
2371 | index b6cf28ca2ed2..df0018f7bf7e 100644 |
2372 | --- a/drivers/clk/tegra/clk-tegra124.c |
2373 | +++ b/drivers/clk/tegra/clk-tegra124.c |
2374 | @@ -1291,6 +1291,13 @@ static struct tegra_clk_init_table common_init_table[] __initdata = { |
2375 | { TEGRA124_CLK_CSITE, TEGRA124_CLK_CLK_MAX, 0, 1 }, |
2376 | { TEGRA124_CLK_TSENSOR, TEGRA124_CLK_CLK_M, 400000, 0 }, |
2377 | { TEGRA124_CLK_VIC03, TEGRA124_CLK_PLL_C3, 0, 0 }, |
2378 | + { TEGRA124_CLK_SPDIF_IN_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 }, |
2379 | + { TEGRA124_CLK_I2S0_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 }, |
2380 | + { TEGRA124_CLK_I2S1_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 }, |
2381 | + { TEGRA124_CLK_I2S2_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 }, |
2382 | + { TEGRA124_CLK_I2S3_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 }, |
2383 | + { TEGRA124_CLK_I2S4_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 }, |
2384 | + { TEGRA124_CLK_VIMCLK_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 }, |
2385 | /* must be the last entry */ |
2386 | { TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0 }, |
2387 | }; |
2388 | @@ -1455,7 +1462,7 @@ static void __init tegra124_132_clock_init_pre(struct device_node *np) |
2389 | tegra124_periph_clk_init(clk_base, pmc_base); |
2390 | tegra_audio_clk_init(clk_base, pmc_base, tegra124_clks, |
2391 | tegra124_audio_plls, |
2392 | - ARRAY_SIZE(tegra124_audio_plls)); |
2393 | + ARRAY_SIZE(tegra124_audio_plls), 24576000); |
2394 | tegra_pmc_clk_init(pmc_base, tegra124_clks); |
2395 | |
2396 | /* For Tegra124 & Tegra132, PLLD is the only source for DSIA & DSIB */ |
2397 | diff --git a/drivers/clk/tegra/clk-tegra210.c b/drivers/clk/tegra/clk-tegra210.c |
2398 | index 4e1bc23c9865..080bfa24863e 100644 |
2399 | --- a/drivers/clk/tegra/clk-tegra210.c |
2400 | +++ b/drivers/clk/tegra/clk-tegra210.c |
2401 | @@ -3369,6 +3369,15 @@ static struct tegra_clk_init_table init_table[] __initdata = { |
2402 | { TEGRA210_CLK_SOC_THERM, TEGRA210_CLK_PLL_P, 51000000, 0 }, |
2403 | { TEGRA210_CLK_CCLK_G, TEGRA210_CLK_CLK_MAX, 0, 1 }, |
2404 | { TEGRA210_CLK_PLL_U_OUT2, TEGRA210_CLK_CLK_MAX, 60000000, 1 }, |
2405 | + { TEGRA210_CLK_SPDIF_IN_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, |
2406 | + { TEGRA210_CLK_I2S0_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, |
2407 | + { TEGRA210_CLK_I2S1_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, |
2408 | + { TEGRA210_CLK_I2S2_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, |
2409 | + { TEGRA210_CLK_I2S3_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, |
2410 | + { TEGRA210_CLK_I2S4_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, |
2411 | + { TEGRA210_CLK_VIMCLK_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, |
2412 | + { TEGRA210_CLK_HDA, TEGRA210_CLK_PLL_P, 51000000, 0 }, |
2413 | + { TEGRA210_CLK_HDA2CODEC_2X, TEGRA210_CLK_PLL_P, 48000000, 0 }, |
2414 | /* This MUST be the last entry. */ |
2415 | { TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 }, |
2416 | }; |
2417 | @@ -3562,7 +3571,7 @@ static void __init tegra210_clock_init(struct device_node *np) |
2418 | tegra210_periph_clk_init(clk_base, pmc_base); |
2419 | tegra_audio_clk_init(clk_base, pmc_base, tegra210_clks, |
2420 | tegra210_audio_plls, |
2421 | - ARRAY_SIZE(tegra210_audio_plls)); |
2422 | + ARRAY_SIZE(tegra210_audio_plls), 24576000); |
2423 | tegra_pmc_clk_init(pmc_base, tegra210_clks); |
2424 | |
2425 | /* For Tegra210, PLLD is the only source for DSIA & DSIB */ |
2426 | diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c |
2427 | index acfe661b2ae7..e0aaecd98fbf 100644 |
2428 | --- a/drivers/clk/tegra/clk-tegra30.c |
2429 | +++ b/drivers/clk/tegra/clk-tegra30.c |
2430 | @@ -1267,6 +1267,13 @@ static struct tegra_clk_init_table init_table[] __initdata = { |
2431 | { TEGRA30_CLK_GR3D2, TEGRA30_CLK_PLL_C, 300000000, 0 }, |
2432 | { TEGRA30_CLK_PLL_U, TEGRA30_CLK_CLK_MAX, 480000000, 0 }, |
2433 | { TEGRA30_CLK_VDE, TEGRA30_CLK_CLK_MAX, 600000000, 0 }, |
2434 | + { TEGRA30_CLK_SPDIF_IN_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 }, |
2435 | + { TEGRA30_CLK_I2S0_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 }, |
2436 | + { TEGRA30_CLK_I2S1_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 }, |
2437 | + { TEGRA30_CLK_I2S2_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 }, |
2438 | + { TEGRA30_CLK_I2S3_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 }, |
2439 | + { TEGRA30_CLK_I2S4_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 }, |
2440 | + { TEGRA30_CLK_VIMCLK_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 }, |
2441 | /* must be the last entry */ |
2442 | { TEGRA30_CLK_CLK_MAX, TEGRA30_CLK_CLK_MAX, 0, 0 }, |
2443 | }; |
2444 | @@ -1344,7 +1351,7 @@ static void __init tegra30_clock_init(struct device_node *np) |
2445 | tegra30_periph_clk_init(); |
2446 | tegra_audio_clk_init(clk_base, pmc_base, tegra30_clks, |
2447 | tegra30_audio_plls, |
2448 | - ARRAY_SIZE(tegra30_audio_plls)); |
2449 | + ARRAY_SIZE(tegra30_audio_plls), 24000000); |
2450 | tegra_pmc_clk_init(pmc_base, tegra30_clks); |
2451 | |
2452 | tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA30_CLK_CLK_MAX); |
2453 | diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h |
2454 | index d2c3a010f8e9..09bccbb9640c 100644 |
2455 | --- a/drivers/clk/tegra/clk.h |
2456 | +++ b/drivers/clk/tegra/clk.h |
2457 | @@ -41,7 +41,7 @@ extern const struct clk_ops tegra_clk_sync_source_ops; |
2458 | extern int *periph_clk_enb_refcnt; |
2459 | |
2460 | struct clk *tegra_clk_register_sync_source(const char *name, |
2461 | - unsigned long fixed_rate, unsigned long max_rate); |
2462 | + unsigned long max_rate); |
2463 | |
2464 | /** |
2465 | * struct tegra_clk_frac_div - fractional divider clock |
2466 | @@ -796,7 +796,7 @@ void tegra_register_devclks(struct tegra_devclk *dev_clks, int num); |
2467 | void tegra_audio_clk_init(void __iomem *clk_base, |
2468 | void __iomem *pmc_base, struct tegra_clk *tegra_clks, |
2469 | struct tegra_audio_clk_info *audio_info, |
2470 | - unsigned int num_plls); |
2471 | + unsigned int num_plls, unsigned long sync_max_rate); |
2472 | |
2473 | void tegra_periph_clk_init(void __iomem *clk_base, void __iomem *pmc_base, |
2474 | struct tegra_clk *tegra_clks, |
2475 | diff --git a/drivers/crypto/ccree/cc_driver.c b/drivers/crypto/ccree/cc_driver.c |
2476 | index 1ff229c2aeab..186a2536fb8b 100644 |
2477 | --- a/drivers/crypto/ccree/cc_driver.c |
2478 | +++ b/drivers/crypto/ccree/cc_driver.c |
2479 | @@ -364,7 +364,7 @@ static int init_cc_resources(struct platform_device *plat_dev) |
2480 | rc = cc_ivgen_init(new_drvdata); |
2481 | if (rc) { |
2482 | dev_err(dev, "cc_ivgen_init failed\n"); |
2483 | - goto post_power_mgr_err; |
2484 | + goto post_buf_mgr_err; |
2485 | } |
2486 | |
2487 | /* Allocate crypto algs */ |
2488 | @@ -387,6 +387,9 @@ static int init_cc_resources(struct platform_device *plat_dev) |
2489 | goto post_hash_err; |
2490 | } |
2491 | |
2492 | + /* All set, we can allow autosuspend */ |
2493 | + cc_pm_go(new_drvdata); |
2494 | + |
2495 | /* If we got here and FIPS mode is enabled |
2496 | * it means all FIPS test passed, so let TEE |
2497 | * know we're good. |
2498 | @@ -401,8 +404,6 @@ post_cipher_err: |
2499 | cc_cipher_free(new_drvdata); |
2500 | post_ivgen_err: |
2501 | cc_ivgen_fini(new_drvdata); |
2502 | -post_power_mgr_err: |
2503 | - cc_pm_fini(new_drvdata); |
2504 | post_buf_mgr_err: |
2505 | cc_buffer_mgr_fini(new_drvdata); |
2506 | post_req_mgr_err: |
2507 | diff --git a/drivers/crypto/ccree/cc_pm.c b/drivers/crypto/ccree/cc_pm.c |
2508 | index 79fc0a37ba6e..638082dff183 100644 |
2509 | --- a/drivers/crypto/ccree/cc_pm.c |
2510 | +++ b/drivers/crypto/ccree/cc_pm.c |
2511 | @@ -103,20 +103,19 @@ int cc_pm_put_suspend(struct device *dev) |
2512 | |
2513 | int cc_pm_init(struct cc_drvdata *drvdata) |
2514 | { |
2515 | - int rc = 0; |
2516 | struct device *dev = drvdata_to_dev(drvdata); |
2517 | |
2518 | /* must be before the enabling to avoid resdundent suspending */ |
2519 | pm_runtime_set_autosuspend_delay(dev, CC_SUSPEND_TIMEOUT); |
2520 | pm_runtime_use_autosuspend(dev); |
2521 | /* activate the PM module */ |
2522 | - rc = pm_runtime_set_active(dev); |
2523 | - if (rc) |
2524 | - return rc; |
2525 | - /* enable the PM module*/ |
2526 | - pm_runtime_enable(dev); |
2527 | + return pm_runtime_set_active(dev); |
2528 | +} |
2529 | |
2530 | - return rc; |
2531 | +/* enable the PM module*/ |
2532 | +void cc_pm_go(struct cc_drvdata *drvdata) |
2533 | +{ |
2534 | + pm_runtime_enable(drvdata_to_dev(drvdata)); |
2535 | } |
2536 | |
2537 | void cc_pm_fini(struct cc_drvdata *drvdata) |
2538 | diff --git a/drivers/crypto/ccree/cc_pm.h b/drivers/crypto/ccree/cc_pm.h |
2539 | index 020a5403c58b..907a6db4d6c0 100644 |
2540 | --- a/drivers/crypto/ccree/cc_pm.h |
2541 | +++ b/drivers/crypto/ccree/cc_pm.h |
2542 | @@ -16,6 +16,7 @@ |
2543 | extern const struct dev_pm_ops ccree_pm; |
2544 | |
2545 | int cc_pm_init(struct cc_drvdata *drvdata); |
2546 | +void cc_pm_go(struct cc_drvdata *drvdata); |
2547 | void cc_pm_fini(struct cc_drvdata *drvdata); |
2548 | int cc_pm_suspend(struct device *dev); |
2549 | int cc_pm_resume(struct device *dev); |
2550 | @@ -29,6 +30,8 @@ static inline int cc_pm_init(struct cc_drvdata *drvdata) |
2551 | return 0; |
2552 | } |
2553 | |
2554 | +static inline void cc_pm_go(struct cc_drvdata *drvdata) {} |
2555 | + |
2556 | static inline void cc_pm_fini(struct cc_drvdata *drvdata) {} |
2557 | |
2558 | static inline int cc_pm_suspend(struct device *dev) |
2559 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c |
2560 | index 5f3f54073818..17862b9ecccd 100644 |
2561 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c |
2562 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c |
2563 | @@ -1070,7 +1070,7 @@ void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, |
2564 | int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring) |
2565 | { |
2566 | struct amdgpu_device *adev = ring->adev; |
2567 | - uint32_t rptr = amdgpu_ring_get_rptr(ring); |
2568 | + uint32_t rptr; |
2569 | unsigned i; |
2570 | int r, timeout = adev->usec_timeout; |
2571 | |
2572 | @@ -1084,6 +1084,9 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring) |
2573 | ring->idx, r); |
2574 | return r; |
2575 | } |
2576 | + |
2577 | + rptr = amdgpu_ring_get_rptr(ring); |
2578 | + |
2579 | amdgpu_ring_write(ring, VCE_CMD_END); |
2580 | amdgpu_ring_commit(ring); |
2581 | |
2582 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c |
2583 | index 400fc74bbae2..205e683fb920 100644 |
2584 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c |
2585 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c |
2586 | @@ -431,7 +431,7 @@ error: |
2587 | int amdgpu_vcn_enc_ring_test_ring(struct amdgpu_ring *ring) |
2588 | { |
2589 | struct amdgpu_device *adev = ring->adev; |
2590 | - uint32_t rptr = amdgpu_ring_get_rptr(ring); |
2591 | + uint32_t rptr; |
2592 | unsigned i; |
2593 | int r; |
2594 | |
2595 | @@ -441,6 +441,9 @@ int amdgpu_vcn_enc_ring_test_ring(struct amdgpu_ring *ring) |
2596 | ring->idx, r); |
2597 | return r; |
2598 | } |
2599 | + |
2600 | + rptr = amdgpu_ring_get_rptr(ring); |
2601 | + |
2602 | amdgpu_ring_write(ring, VCN_ENC_CMD_END); |
2603 | amdgpu_ring_commit(ring); |
2604 | |
2605 | diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c |
2606 | index 46568497ef18..782411649816 100644 |
2607 | --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c |
2608 | +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c |
2609 | @@ -82,7 +82,8 @@ MODULE_FIRMWARE("amdgpu/raven_rlc.bin"); |
2610 | |
2611 | static const struct soc15_reg_golden golden_settings_gc_9_0[] = |
2612 | { |
2613 | - SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000420), |
2614 | + SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000400), |
2615 | + SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0x80000000, 0x80000000), |
2616 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000), |
2617 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024), |
2618 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001), |
2619 | diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c |
2620 | index d4070839ac80..80613a74df42 100644 |
2621 | --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c |
2622 | +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c |
2623 | @@ -170,7 +170,7 @@ static void uvd_v6_0_enc_ring_set_wptr(struct amdgpu_ring *ring) |
2624 | static int uvd_v6_0_enc_ring_test_ring(struct amdgpu_ring *ring) |
2625 | { |
2626 | struct amdgpu_device *adev = ring->adev; |
2627 | - uint32_t rptr = amdgpu_ring_get_rptr(ring); |
2628 | + uint32_t rptr; |
2629 | unsigned i; |
2630 | int r; |
2631 | |
2632 | @@ -180,6 +180,9 @@ static int uvd_v6_0_enc_ring_test_ring(struct amdgpu_ring *ring) |
2633 | ring->idx, r); |
2634 | return r; |
2635 | } |
2636 | + |
2637 | + rptr = amdgpu_ring_get_rptr(ring); |
2638 | + |
2639 | amdgpu_ring_write(ring, HEVC_ENC_CMD_END); |
2640 | amdgpu_ring_commit(ring); |
2641 | |
2642 | diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c |
2643 | index 057151b17b45..ce16b8329af0 100644 |
2644 | --- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c |
2645 | +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c |
2646 | @@ -175,7 +175,7 @@ static void uvd_v7_0_enc_ring_set_wptr(struct amdgpu_ring *ring) |
2647 | static int uvd_v7_0_enc_ring_test_ring(struct amdgpu_ring *ring) |
2648 | { |
2649 | struct amdgpu_device *adev = ring->adev; |
2650 | - uint32_t rptr = amdgpu_ring_get_rptr(ring); |
2651 | + uint32_t rptr; |
2652 | unsigned i; |
2653 | int r; |
2654 | |
2655 | @@ -188,6 +188,9 @@ static int uvd_v7_0_enc_ring_test_ring(struct amdgpu_ring *ring) |
2656 | ring->me, ring->idx, r); |
2657 | return r; |
2658 | } |
2659 | + |
2660 | + rptr = amdgpu_ring_get_rptr(ring); |
2661 | + |
2662 | amdgpu_ring_write(ring, HEVC_ENC_CMD_END); |
2663 | amdgpu_ring_commit(ring); |
2664 | |
2665 | diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c |
2666 | index 5aba50f63ac6..938d0053a820 100644 |
2667 | --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c |
2668 | +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c |
2669 | @@ -310,6 +310,7 @@ static const struct kfd_deviceid supported_devices[] = { |
2670 | { 0x67CF, &polaris10_device_info }, /* Polaris10 */ |
2671 | { 0x67D0, &polaris10_vf_device_info }, /* Polaris10 vf*/ |
2672 | { 0x67DF, &polaris10_device_info }, /* Polaris10 */ |
2673 | + { 0x6FDF, &polaris10_device_info }, /* Polaris10 */ |
2674 | { 0x67E0, &polaris11_device_info }, /* Polaris11 */ |
2675 | { 0x67E1, &polaris11_device_info }, /* Polaris11 */ |
2676 | { 0x67E3, &polaris11_device_info }, /* Polaris11 */ |
2677 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c |
2678 | index 59445c83f023..c85bea70d965 100644 |
2679 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c |
2680 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c |
2681 | @@ -377,9 +377,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, |
2682 | drm_connector_attach_encoder(&aconnector->base, |
2683 | &aconnector->mst_encoder->base); |
2684 | |
2685 | - /* |
2686 | - * TODO: understand why this one is needed |
2687 | - */ |
2688 | drm_object_attach_property( |
2689 | &connector->base, |
2690 | dev->mode_config.path_property, |
2691 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c |
2692 | index 2aab1b475945..cede78cdf28d 100644 |
2693 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c |
2694 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c |
2695 | @@ -669,20 +669,20 @@ int smu_set_watermarks_for_clocks_ranges(void *wt_table, |
2696 | for (i = 0; i < wm_with_clock_ranges->num_wm_dmif_sets; i++) { |
2697 | table->WatermarkRow[1][i].MinClock = |
2698 | cpu_to_le16((uint16_t) |
2699 | - (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_dcfclk_clk_in_khz) / |
2700 | - 1000); |
2701 | + (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_dcfclk_clk_in_khz / |
2702 | + 1000)); |
2703 | table->WatermarkRow[1][i].MaxClock = |
2704 | cpu_to_le16((uint16_t) |
2705 | - (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_dcfclk_clk_in_khz) / |
2706 | - 100); |
2707 | + (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_dcfclk_clk_in_khz / |
2708 | + 1000)); |
2709 | table->WatermarkRow[1][i].MinUclk = |
2710 | cpu_to_le16((uint16_t) |
2711 | - (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_mem_clk_in_khz) / |
2712 | - 1000); |
2713 | + (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_mem_clk_in_khz / |
2714 | + 1000)); |
2715 | table->WatermarkRow[1][i].MaxUclk = |
2716 | cpu_to_le16((uint16_t) |
2717 | - (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_mem_clk_in_khz) / |
2718 | - 1000); |
2719 | + (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_mem_clk_in_khz / |
2720 | + 1000)); |
2721 | table->WatermarkRow[1][i].WmSetting = (uint8_t) |
2722 | wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_set_id; |
2723 | } |
2724 | @@ -690,20 +690,20 @@ int smu_set_watermarks_for_clocks_ranges(void *wt_table, |
2725 | for (i = 0; i < wm_with_clock_ranges->num_wm_mcif_sets; i++) { |
2726 | table->WatermarkRow[0][i].MinClock = |
2727 | cpu_to_le16((uint16_t) |
2728 | - (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_socclk_clk_in_khz) / |
2729 | - 1000); |
2730 | + (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_socclk_clk_in_khz / |
2731 | + 1000)); |
2732 | table->WatermarkRow[0][i].MaxClock = |
2733 | cpu_to_le16((uint16_t) |
2734 | - (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_socclk_clk_in_khz) / |
2735 | - 1000); |
2736 | + (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_socclk_clk_in_khz / |
2737 | + 1000)); |
2738 | table->WatermarkRow[0][i].MinUclk = |
2739 | cpu_to_le16((uint16_t) |
2740 | - (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_mem_clk_in_khz) / |
2741 | - 1000); |
2742 | + (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_mem_clk_in_khz / |
2743 | + 1000)); |
2744 | table->WatermarkRow[0][i].MaxUclk = |
2745 | cpu_to_le16((uint16_t) |
2746 | - (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_mem_clk_in_khz) / |
2747 | - 1000); |
2748 | + (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_mem_clk_in_khz / |
2749 | + 1000)); |
2750 | table->WatermarkRow[0][i].WmSetting = (uint8_t) |
2751 | wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id; |
2752 | } |
2753 | diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c |
2754 | index 281cf9cbb44c..1a4b44923aec 100644 |
2755 | --- a/drivers/gpu/drm/drm_atomic.c |
2756 | +++ b/drivers/gpu/drm/drm_atomic.c |
2757 | @@ -1702,6 +1702,27 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state, |
2758 | struct drm_connector *connector = conn_state->connector; |
2759 | struct drm_crtc_state *crtc_state; |
2760 | |
2761 | + /* |
2762 | + * For compatibility with legacy users, we want to make sure that |
2763 | + * we allow DPMS On<->Off modesets on unregistered connectors, since |
2764 | + * legacy modesetting users will not be expecting these to fail. We do |
2765 | + * not however, want to allow legacy users to assign a connector |
2766 | + * that's been unregistered from sysfs to another CRTC, since doing |
2767 | + * this with a now non-existent connector could potentially leave us |
2768 | + * in an invalid state. |
2769 | + * |
2770 | + * Since the connector can be unregistered at any point during an |
2771 | + * atomic check or commit, this is racy. But that's OK: all we care |
2772 | + * about is ensuring that userspace can't use this connector for new |
2773 | + * configurations after it's been notified that the connector is no |
2774 | + * longer present. |
2775 | + */ |
2776 | + if (!READ_ONCE(connector->registered) && crtc) { |
2777 | + DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] is not registered\n", |
2778 | + connector->base.id, connector->name); |
2779 | + return -EINVAL; |
2780 | + } |
2781 | + |
2782 | if (conn_state->crtc == crtc) |
2783 | return 0; |
2784 | |
2785 | diff --git a/drivers/gpu/drm/drm_ioc32.c b/drivers/gpu/drm/drm_ioc32.c |
2786 | index 138680b37c70..f8672238d444 100644 |
2787 | --- a/drivers/gpu/drm/drm_ioc32.c |
2788 | +++ b/drivers/gpu/drm/drm_ioc32.c |
2789 | @@ -185,7 +185,7 @@ static int compat_drm_getmap(struct file *file, unsigned int cmd, |
2790 | m32.size = map.size; |
2791 | m32.type = map.type; |
2792 | m32.flags = map.flags; |
2793 | - m32.handle = ptr_to_compat(map.handle); |
2794 | + m32.handle = ptr_to_compat((void __user *)map.handle); |
2795 | m32.mtrr = map.mtrr; |
2796 | if (copy_to_user(argp, &m32, sizeof(m32))) |
2797 | return -EFAULT; |
2798 | @@ -216,7 +216,7 @@ static int compat_drm_addmap(struct file *file, unsigned int cmd, |
2799 | |
2800 | m32.offset = map.offset; |
2801 | m32.mtrr = map.mtrr; |
2802 | - m32.handle = ptr_to_compat(map.handle); |
2803 | + m32.handle = ptr_to_compat((void __user *)map.handle); |
2804 | if (map.handle != compat_ptr(m32.handle)) |
2805 | pr_err_ratelimited("compat_drm_addmap truncated handle %p for type %d offset %x\n", |
2806 | map.handle, m32.type, m32.offset); |
2807 | @@ -529,7 +529,7 @@ static int compat_drm_getsareactx(struct file *file, unsigned int cmd, |
2808 | if (err) |
2809 | return err; |
2810 | |
2811 | - req32.handle = ptr_to_compat(req.handle); |
2812 | + req32.handle = ptr_to_compat((void __user *)req.handle); |
2813 | if (copy_to_user(argp, &req32, sizeof(req32))) |
2814 | return -EFAULT; |
2815 | |
2816 | diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c |
2817 | index 28cdcf76b6f9..d1859bcc7ccb 100644 |
2818 | --- a/drivers/gpu/drm/drm_vblank.c |
2819 | +++ b/drivers/gpu/drm/drm_vblank.c |
2820 | @@ -105,13 +105,20 @@ static void store_vblank(struct drm_device *dev, unsigned int pipe, |
2821 | write_sequnlock(&vblank->seqlock); |
2822 | } |
2823 | |
2824 | +static u32 drm_max_vblank_count(struct drm_device *dev, unsigned int pipe) |
2825 | +{ |
2826 | + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; |
2827 | + |
2828 | + return vblank->max_vblank_count ?: dev->max_vblank_count; |
2829 | +} |
2830 | + |
2831 | /* |
2832 | * "No hw counter" fallback implementation of .get_vblank_counter() hook, |
2833 | * if there is no useable hardware frame counter available. |
2834 | */ |
2835 | static u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe) |
2836 | { |
2837 | - WARN_ON_ONCE(dev->max_vblank_count != 0); |
2838 | + WARN_ON_ONCE(drm_max_vblank_count(dev, pipe) != 0); |
2839 | return 0; |
2840 | } |
2841 | |
2842 | @@ -198,6 +205,7 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, |
2843 | ktime_t t_vblank; |
2844 | int count = DRM_TIMESTAMP_MAXRETRIES; |
2845 | int framedur_ns = vblank->framedur_ns; |
2846 | + u32 max_vblank_count = drm_max_vblank_count(dev, pipe); |
2847 | |
2848 | /* |
2849 | * Interrupts were disabled prior to this call, so deal with counter |
2850 | @@ -216,9 +224,9 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe, |
2851 | rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, in_vblank_irq); |
2852 | } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0); |
2853 | |
2854 | - if (dev->max_vblank_count != 0) { |
2855 | + if (max_vblank_count) { |
2856 | /* trust the hw counter when it's around */ |
2857 | - diff = (cur_vblank - vblank->last) & dev->max_vblank_count; |
2858 | + diff = (cur_vblank - vblank->last) & max_vblank_count; |
2859 | } else if (rc && framedur_ns) { |
2860 | u64 diff_ns = ktime_to_ns(ktime_sub(t_vblank, vblank->time)); |
2861 | |
2862 | @@ -1204,6 +1212,37 @@ void drm_crtc_vblank_reset(struct drm_crtc *crtc) |
2863 | } |
2864 | EXPORT_SYMBOL(drm_crtc_vblank_reset); |
2865 | |
2866 | +/** |
2867 | + * drm_crtc_set_max_vblank_count - configure the hw max vblank counter value |
2868 | + * @crtc: CRTC in question |
2869 | + * @max_vblank_count: max hardware vblank counter value |
2870 | + * |
2871 | + * Update the maximum hardware vblank counter value for @crtc |
2872 | + * at runtime. Useful for hardware where the operation of the |
2873 | + * hardware vblank counter depends on the currently active |
2874 | + * display configuration. |
2875 | + * |
2876 | + * For example, if the hardware vblank counter does not work |
2877 | + * when a specific connector is active the maximum can be set |
2878 | + * to zero. And when that specific connector isn't active the |
2879 | + * maximum can again be set to the appropriate non-zero value. |
2880 | + * |
2881 | + * If used, must be called before drm_vblank_on(). |
2882 | + */ |
2883 | +void drm_crtc_set_max_vblank_count(struct drm_crtc *crtc, |
2884 | + u32 max_vblank_count) |
2885 | +{ |
2886 | + struct drm_device *dev = crtc->dev; |
2887 | + unsigned int pipe = drm_crtc_index(crtc); |
2888 | + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; |
2889 | + |
2890 | + WARN_ON(dev->max_vblank_count); |
2891 | + WARN_ON(!READ_ONCE(vblank->inmodeset)); |
2892 | + |
2893 | + vblank->max_vblank_count = max_vblank_count; |
2894 | +} |
2895 | +EXPORT_SYMBOL(drm_crtc_set_max_vblank_count); |
2896 | + |
2897 | /** |
2898 | * drm_crtc_vblank_on - enable vblank events on a CRTC |
2899 | * @crtc: CRTC in question |
2900 | diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c |
2901 | index f9ce35da4123..e063e98d1e82 100644 |
2902 | --- a/drivers/gpu/drm/i915/i915_debugfs.c |
2903 | +++ b/drivers/gpu/drm/i915/i915_debugfs.c |
2904 | @@ -1788,6 +1788,8 @@ static int i915_emon_status(struct seq_file *m, void *unused) |
2905 | if (!IS_GEN5(dev_priv)) |
2906 | return -ENODEV; |
2907 | |
2908 | + intel_runtime_pm_get(dev_priv); |
2909 | + |
2910 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
2911 | if (ret) |
2912 | return ret; |
2913 | @@ -1802,6 +1804,8 @@ static int i915_emon_status(struct seq_file *m, void *unused) |
2914 | seq_printf(m, "GFX power: %ld\n", gfx); |
2915 | seq_printf(m, "Total power: %ld\n", chipset + gfx); |
2916 | |
2917 | + intel_runtime_pm_put(dev_priv); |
2918 | + |
2919 | return 0; |
2920 | } |
2921 | |
2922 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
2923 | index 03cda197fb6b..937287710042 100644 |
2924 | --- a/drivers/gpu/drm/i915/i915_gem.c |
2925 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
2926 | @@ -1874,20 +1874,28 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, |
2927 | * pages from. |
2928 | */ |
2929 | if (!obj->base.filp) { |
2930 | - i915_gem_object_put(obj); |
2931 | - return -ENXIO; |
2932 | + addr = -ENXIO; |
2933 | + goto err; |
2934 | + } |
2935 | + |
2936 | + if (range_overflows(args->offset, args->size, (u64)obj->base.size)) { |
2937 | + addr = -EINVAL; |
2938 | + goto err; |
2939 | } |
2940 | |
2941 | addr = vm_mmap(obj->base.filp, 0, args->size, |
2942 | PROT_READ | PROT_WRITE, MAP_SHARED, |
2943 | args->offset); |
2944 | + if (IS_ERR_VALUE(addr)) |
2945 | + goto err; |
2946 | + |
2947 | if (args->flags & I915_MMAP_WC) { |
2948 | struct mm_struct *mm = current->mm; |
2949 | struct vm_area_struct *vma; |
2950 | |
2951 | if (down_write_killable(&mm->mmap_sem)) { |
2952 | - i915_gem_object_put(obj); |
2953 | - return -EINTR; |
2954 | + addr = -EINTR; |
2955 | + goto err; |
2956 | } |
2957 | vma = find_vma(mm, addr); |
2958 | if (vma && __vma_matches(vma, obj->base.filp, addr, args->size)) |
2959 | @@ -1896,17 +1904,20 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, |
2960 | else |
2961 | addr = -ENOMEM; |
2962 | up_write(&mm->mmap_sem); |
2963 | + if (IS_ERR_VALUE(addr)) |
2964 | + goto err; |
2965 | |
2966 | /* This may race, but that's ok, it only gets set */ |
2967 | WRITE_ONCE(obj->frontbuffer_ggtt_origin, ORIGIN_CPU); |
2968 | } |
2969 | i915_gem_object_put(obj); |
2970 | - if (IS_ERR((void *)addr)) |
2971 | - return addr; |
2972 | |
2973 | args->addr_ptr = (uint64_t) addr; |
2974 | - |
2975 | return 0; |
2976 | + |
2977 | +err: |
2978 | + i915_gem_object_put(obj); |
2979 | + return addr; |
2980 | } |
2981 | |
2982 | static unsigned int tile_row_pages(struct drm_i915_gem_object *obj) |
2983 | @@ -5595,6 +5606,8 @@ err_uc_misc: |
2984 | i915_gem_cleanup_userptr(dev_priv); |
2985 | |
2986 | if (ret == -EIO) { |
2987 | + mutex_lock(&dev_priv->drm.struct_mutex); |
2988 | + |
2989 | /* |
2990 | * Allow engine initialisation to fail by marking the GPU as |
2991 | * wedged. But we only want to do this where the GPU is angry, |
2992 | @@ -5605,7 +5618,14 @@ err_uc_misc: |
2993 | "Failed to initialize GPU, declaring it wedged!\n"); |
2994 | i915_gem_set_wedged(dev_priv); |
2995 | } |
2996 | - ret = 0; |
2997 | + |
2998 | + /* Minimal basic recovery for KMS */ |
2999 | + ret = i915_ggtt_enable_hw(dev_priv); |
3000 | + i915_gem_restore_gtt_mappings(dev_priv); |
3001 | + i915_gem_restore_fences(dev_priv); |
3002 | + intel_init_clock_gating(dev_priv); |
3003 | + |
3004 | + mutex_unlock(&dev_priv->drm.struct_mutex); |
3005 | } |
3006 | |
3007 | i915_gem_drain_freed_objects(dev_priv); |
3008 | @@ -5615,6 +5635,7 @@ err_uc_misc: |
3009 | void i915_gem_fini(struct drm_i915_private *dev_priv) |
3010 | { |
3011 | i915_gem_suspend_late(dev_priv); |
3012 | + intel_disable_gt_powersave(dev_priv); |
3013 | |
3014 | /* Flush any outstanding unpin_work. */ |
3015 | i915_gem_drain_workqueue(dev_priv); |
3016 | @@ -5626,6 +5647,8 @@ void i915_gem_fini(struct drm_i915_private *dev_priv) |
3017 | i915_gem_contexts_fini(dev_priv); |
3018 | mutex_unlock(&dev_priv->drm.struct_mutex); |
3019 | |
3020 | + intel_cleanup_gt_powersave(dev_priv); |
3021 | + |
3022 | intel_uc_fini_misc(dev_priv); |
3023 | i915_gem_cleanup_userptr(dev_priv); |
3024 | |
3025 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h |
3026 | index 16f5d2d93801..4e070afb2738 100644 |
3027 | --- a/drivers/gpu/drm/i915/i915_reg.h |
3028 | +++ b/drivers/gpu/drm/i915/i915_reg.h |
3029 | @@ -6531,7 +6531,7 @@ enum { |
3030 | #define PLANE_CTL_YUV422_UYVY (1 << 16) |
3031 | #define PLANE_CTL_YUV422_YVYU (2 << 16) |
3032 | #define PLANE_CTL_YUV422_VYUY (3 << 16) |
3033 | -#define PLANE_CTL_DECOMPRESSION_ENABLE (1 << 15) |
3034 | +#define PLANE_CTL_RENDER_DECOMPRESSION_ENABLE (1 << 15) |
3035 | #define PLANE_CTL_TRICKLE_FEED_DISABLE (1 << 14) |
3036 | #define PLANE_CTL_PLANE_GAMMA_DISABLE (1 << 13) /* Pre-GLK */ |
3037 | #define PLANE_CTL_TILED_MASK (0x7 << 10) |
3038 | diff --git a/drivers/gpu/drm/i915/intel_cdclk.c b/drivers/gpu/drm/i915/intel_cdclk.c |
3039 | index 29075c763428..7b4906ede148 100644 |
3040 | --- a/drivers/gpu/drm/i915/intel_cdclk.c |
3041 | +++ b/drivers/gpu/drm/i915/intel_cdclk.c |
3042 | @@ -2208,6 +2208,17 @@ int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state) |
3043 | if (INTEL_GEN(dev_priv) >= 9) |
3044 | min_cdclk = max(2 * 96000, min_cdclk); |
3045 | |
3046 | + /* |
3047 | + * "For DP audio configuration, cdclk frequency shall be set to |
3048 | + * meet the following requirements: |
3049 | + * DP Link Frequency(MHz) | Cdclk frequency(MHz) |
3050 | + * 270 | 320 or higher |
3051 | + * 162 | 200 or higher" |
3052 | + */ |
3053 | + if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) && |
3054 | + intel_crtc_has_dp_encoder(crtc_state) && crtc_state->has_audio) |
3055 | + min_cdclk = max(crtc_state->port_clock, min_cdclk); |
3056 | + |
3057 | /* |
3058 | * On Valleyview some DSI panels lose (v|h)sync when the clock is lower |
3059 | * than 320000KHz. |
3060 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
3061 | index 3bd44d042a1d..6902fd2da19c 100644 |
3062 | --- a/drivers/gpu/drm/i915/intel_display.c |
3063 | +++ b/drivers/gpu/drm/i915/intel_display.c |
3064 | @@ -2712,6 +2712,17 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, |
3065 | if (size_aligned * 2 > dev_priv->stolen_usable_size) |
3066 | return false; |
3067 | |
3068 | + switch (fb->modifier) { |
3069 | + case DRM_FORMAT_MOD_LINEAR: |
3070 | + case I915_FORMAT_MOD_X_TILED: |
3071 | + case I915_FORMAT_MOD_Y_TILED: |
3072 | + break; |
3073 | + default: |
3074 | + DRM_DEBUG_DRIVER("Unsupported modifier for initial FB: 0x%llx\n", |
3075 | + fb->modifier); |
3076 | + return false; |
3077 | + } |
3078 | + |
3079 | mutex_lock(&dev->struct_mutex); |
3080 | obj = i915_gem_object_create_stolen_for_preallocated(dev_priv, |
3081 | base_aligned, |
3082 | @@ -2721,8 +2732,17 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, |
3083 | if (!obj) |
3084 | return false; |
3085 | |
3086 | - if (plane_config->tiling == I915_TILING_X) |
3087 | - obj->tiling_and_stride = fb->pitches[0] | I915_TILING_X; |
3088 | + switch (plane_config->tiling) { |
3089 | + case I915_TILING_NONE: |
3090 | + break; |
3091 | + case I915_TILING_X: |
3092 | + case I915_TILING_Y: |
3093 | + obj->tiling_and_stride = fb->pitches[0] | plane_config->tiling; |
3094 | + break; |
3095 | + default: |
3096 | + MISSING_CASE(plane_config->tiling); |
3097 | + return false; |
3098 | + } |
3099 | |
3100 | mode_cmd.pixel_format = fb->format->format; |
3101 | mode_cmd.width = fb->width; |
3102 | @@ -3561,11 +3581,11 @@ static u32 skl_plane_ctl_tiling(uint64_t fb_modifier) |
3103 | case I915_FORMAT_MOD_Y_TILED: |
3104 | return PLANE_CTL_TILED_Y; |
3105 | case I915_FORMAT_MOD_Y_TILED_CCS: |
3106 | - return PLANE_CTL_TILED_Y | PLANE_CTL_DECOMPRESSION_ENABLE; |
3107 | + return PLANE_CTL_TILED_Y | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE; |
3108 | case I915_FORMAT_MOD_Yf_TILED: |
3109 | return PLANE_CTL_TILED_YF; |
3110 | case I915_FORMAT_MOD_Yf_TILED_CCS: |
3111 | - return PLANE_CTL_TILED_YF | PLANE_CTL_DECOMPRESSION_ENABLE; |
3112 | + return PLANE_CTL_TILED_YF | PLANE_CTL_RENDER_DECOMPRESSION_ENABLE; |
3113 | default: |
3114 | MISSING_CASE(fb_modifier); |
3115 | } |
3116 | @@ -8812,13 +8832,14 @@ skylake_get_initial_plane_config(struct intel_crtc *crtc, |
3117 | fb->modifier = I915_FORMAT_MOD_X_TILED; |
3118 | break; |
3119 | case PLANE_CTL_TILED_Y: |
3120 | - if (val & PLANE_CTL_DECOMPRESSION_ENABLE) |
3121 | + plane_config->tiling = I915_TILING_Y; |
3122 | + if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE) |
3123 | fb->modifier = I915_FORMAT_MOD_Y_TILED_CCS; |
3124 | else |
3125 | fb->modifier = I915_FORMAT_MOD_Y_TILED; |
3126 | break; |
3127 | case PLANE_CTL_TILED_YF: |
3128 | - if (val & PLANE_CTL_DECOMPRESSION_ENABLE) |
3129 | + if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE) |
3130 | fb->modifier = I915_FORMAT_MOD_Yf_TILED_CCS; |
3131 | else |
3132 | fb->modifier = I915_FORMAT_MOD_Yf_TILED; |
3133 | @@ -15951,8 +15972,6 @@ void intel_modeset_cleanup(struct drm_device *dev) |
3134 | flush_work(&dev_priv->atomic_helper.free_work); |
3135 | WARN_ON(!llist_empty(&dev_priv->atomic_helper.free_list)); |
3136 | |
3137 | - intel_disable_gt_powersave(dev_priv); |
3138 | - |
3139 | /* |
3140 | * Interrupts and polling as the first thing to avoid creating havoc. |
3141 | * Too much stuff here (turning of connectors, ...) would |
3142 | @@ -15980,8 +15999,6 @@ void intel_modeset_cleanup(struct drm_device *dev) |
3143 | |
3144 | intel_cleanup_overlay(dev_priv); |
3145 | |
3146 | - intel_cleanup_gt_powersave(dev_priv); |
3147 | - |
3148 | intel_teardown_gmbus(dev_priv); |
3149 | |
3150 | destroy_workqueue(dev_priv->modeset_wq); |
3151 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c |
3152 | index f92079e19de8..20cd4c8acecc 100644 |
3153 | --- a/drivers/gpu/drm/i915/intel_dp.c |
3154 | +++ b/drivers/gpu/drm/i915/intel_dp.c |
3155 | @@ -4739,6 +4739,22 @@ intel_dp_long_pulse(struct intel_connector *connector, |
3156 | */ |
3157 | status = connector_status_disconnected; |
3158 | goto out; |
3159 | + } else { |
3160 | + /* |
3161 | + * If display is now connected check links status, |
3162 | + * there has been known issues of link loss triggering |
3163 | + * long pulse. |
3164 | + * |
3165 | + * Some sinks (eg. ASUS PB287Q) seem to perform some |
3166 | + * weird HPD ping pong during modesets. So we can apparently |
3167 | + * end up with HPD going low during a modeset, and then |
3168 | + * going back up soon after. And once that happens we must |
3169 | + * retrain the link to get a picture. That's in case no |
3170 | + * userspace component reacted to intermittent HPD dip. |
3171 | + */ |
3172 | + struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; |
3173 | + |
3174 | + intel_dp_retrain_link(encoder, ctx); |
3175 | } |
3176 | |
3177 | /* |
3178 | diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c |
3179 | index 1fec0c71b4d9..58ba14966d4f 100644 |
3180 | --- a/drivers/gpu/drm/i915/intel_dp_mst.c |
3181 | +++ b/drivers/gpu/drm/i915/intel_dp_mst.c |
3182 | @@ -408,8 +408,6 @@ static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *c |
3183 | struct intel_dp *intel_dp = intel_connector->mst_port; |
3184 | struct intel_crtc *crtc = to_intel_crtc(state->crtc); |
3185 | |
3186 | - if (!READ_ONCE(connector->registered)) |
3187 | - return NULL; |
3188 | return &intel_dp->mst_encoders[crtc->pipe]->base.base; |
3189 | } |
3190 | |
3191 | diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c |
3192 | index f889d41a281f..5e01bfb69d7a 100644 |
3193 | --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c |
3194 | +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c |
3195 | @@ -759,7 +759,8 @@ nv50_msto_enable(struct drm_encoder *encoder) |
3196 | |
3197 | slots = drm_dp_find_vcpi_slots(&mstm->mgr, mstc->pbn); |
3198 | r = drm_dp_mst_allocate_vcpi(&mstm->mgr, mstc->port, mstc->pbn, slots); |
3199 | - WARN_ON(!r); |
3200 | + if (!r) |
3201 | + DRM_DEBUG_KMS("Failed to allocate VCPI\n"); |
3202 | |
3203 | if (!mstm->links++) |
3204 | nv50_outp_acquire(mstm->outp); |
3205 | diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c |
3206 | index b1d41c4921dd..5fd94e206029 100644 |
3207 | --- a/drivers/gpu/drm/panel/panel-simple.c |
3208 | +++ b/drivers/gpu/drm/panel/panel-simple.c |
3209 | @@ -436,6 +436,32 @@ static const struct panel_desc ampire_am800480r3tmqwa1h = { |
3210 | .bus_format = MEDIA_BUS_FMT_RGB666_1X18, |
3211 | }; |
3212 | |
3213 | +static const struct display_timing santek_st0700i5y_rbslw_f_timing = { |
3214 | + .pixelclock = { 26400000, 33300000, 46800000 }, |
3215 | + .hactive = { 800, 800, 800 }, |
3216 | + .hfront_porch = { 16, 210, 354 }, |
3217 | + .hback_porch = { 45, 36, 6 }, |
3218 | + .hsync_len = { 1, 10, 40 }, |
3219 | + .vactive = { 480, 480, 480 }, |
3220 | + .vfront_porch = { 7, 22, 147 }, |
3221 | + .vback_porch = { 22, 13, 3 }, |
3222 | + .vsync_len = { 1, 10, 20 }, |
3223 | + .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW | |
3224 | + DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE |
3225 | +}; |
3226 | + |
3227 | +static const struct panel_desc armadeus_st0700_adapt = { |
3228 | + .timings = &santek_st0700i5y_rbslw_f_timing, |
3229 | + .num_timings = 1, |
3230 | + .bpc = 6, |
3231 | + .size = { |
3232 | + .width = 154, |
3233 | + .height = 86, |
3234 | + }, |
3235 | + .bus_format = MEDIA_BUS_FMT_RGB666_1X18, |
3236 | + .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_POSEDGE, |
3237 | +}; |
3238 | + |
3239 | static const struct drm_display_mode auo_b101aw03_mode = { |
3240 | .clock = 51450, |
3241 | .hdisplay = 1024, |
3242 | @@ -2330,6 +2356,9 @@ static const struct of_device_id platform_of_match[] = { |
3243 | }, { |
3244 | .compatible = "ampire,am800480r3tmqwa1h", |
3245 | .data = &ire_am800480r3tmqwa1h, |
3246 | + }, { |
3247 | + .compatible = "armadeus,st0700-adapt", |
3248 | + .data = &armadeus_st0700_adapt, |
3249 | }, { |
3250 | .compatible = "auo,b101aw03", |
3251 | .data = &auo_b101aw03, |
3252 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c |
3253 | index 59e9d05ab928..0af048d1a815 100644 |
3254 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c |
3255 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c |
3256 | @@ -353,7 +353,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg, |
3257 | !!(HIGH_WORD(ecx) & MESSAGE_STATUS_HB)); |
3258 | if ((HIGH_WORD(ebx) & MESSAGE_STATUS_SUCCESS) == 0) { |
3259 | kfree(reply); |
3260 | - |
3261 | + reply = NULL; |
3262 | if ((HIGH_WORD(ebx) & MESSAGE_STATUS_CPT) != 0) { |
3263 | /* A checkpoint occurred. Retry. */ |
3264 | continue; |
3265 | @@ -377,7 +377,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg, |
3266 | |
3267 | if ((HIGH_WORD(ecx) & MESSAGE_STATUS_SUCCESS) == 0) { |
3268 | kfree(reply); |
3269 | - |
3270 | + reply = NULL; |
3271 | if ((HIGH_WORD(ecx) & MESSAGE_STATUS_CPT) != 0) { |
3272 | /* A checkpoint occurred. Retry. */ |
3273 | continue; |
3274 | @@ -389,10 +389,8 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg, |
3275 | break; |
3276 | } |
3277 | |
3278 | - if (retries == RETRIES) { |
3279 | - kfree(reply); |
3280 | + if (!reply) |
3281 | return -EINVAL; |
3282 | - } |
3283 | |
3284 | *msg_len = reply_len; |
3285 | *msg = reply; |
3286 | diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c |
3287 | index 5eed1e7da15c..d6106e1a0d4a 100644 |
3288 | --- a/drivers/hv/hv_kvp.c |
3289 | +++ b/drivers/hv/hv_kvp.c |
3290 | @@ -353,7 +353,9 @@ static void process_ib_ipinfo(void *in_msg, void *out_msg, int op) |
3291 | |
3292 | out->body.kvp_ip_val.dhcp_enabled = in->kvp_ip_val.dhcp_enabled; |
3293 | |
3294 | - default: |
3295 | + /* fallthrough */ |
3296 | + |
3297 | + case KVP_OP_GET_IP_INFO: |
3298 | utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.adapter_id, |
3299 | MAX_ADAPTER_ID_SIZE, |
3300 | UTF16_LITTLE_ENDIAN, |
3301 | @@ -406,6 +408,10 @@ kvp_send_key(struct work_struct *dummy) |
3302 | process_ib_ipinfo(in_msg, message, KVP_OP_SET_IP_INFO); |
3303 | break; |
3304 | case KVP_OP_GET_IP_INFO: |
3305 | + /* |
3306 | + * We only need to pass on the info of operation, adapter_id |
3307 | + * and addr_family to the userland kvp daemon. |
3308 | + */ |
3309 | process_ib_ipinfo(in_msg, message, KVP_OP_GET_IP_INFO); |
3310 | break; |
3311 | case KVP_OP_SET: |
3312 | @@ -421,7 +427,7 @@ kvp_send_key(struct work_struct *dummy) |
3313 | UTF16_LITTLE_ENDIAN, |
3314 | message->body.kvp_set.data.value, |
3315 | HV_KVP_EXCHANGE_MAX_VALUE_SIZE - 1) + 1; |
3316 | - break; |
3317 | + break; |
3318 | |
3319 | case REG_U32: |
3320 | /* |
3321 | @@ -446,7 +452,10 @@ kvp_send_key(struct work_struct *dummy) |
3322 | break; |
3323 | |
3324 | } |
3325 | - case KVP_OP_GET: |
3326 | + |
3327 | + /* |
3328 | + * The key is always a string - utf16 encoding. |
3329 | + */ |
3330 | message->body.kvp_set.data.key_size = |
3331 | utf16s_to_utf8s( |
3332 | (wchar_t *)in_msg->body.kvp_set.data.key, |
3333 | @@ -454,7 +463,18 @@ kvp_send_key(struct work_struct *dummy) |
3334 | UTF16_LITTLE_ENDIAN, |
3335 | message->body.kvp_set.data.key, |
3336 | HV_KVP_EXCHANGE_MAX_KEY_SIZE - 1) + 1; |
3337 | - break; |
3338 | + |
3339 | + break; |
3340 | + |
3341 | + case KVP_OP_GET: |
3342 | + message->body.kvp_get.data.key_size = |
3343 | + utf16s_to_utf8s( |
3344 | + (wchar_t *)in_msg->body.kvp_get.data.key, |
3345 | + in_msg->body.kvp_get.data.key_size, |
3346 | + UTF16_LITTLE_ENDIAN, |
3347 | + message->body.kvp_get.data.key, |
3348 | + HV_KVP_EXCHANGE_MAX_KEY_SIZE - 1) + 1; |
3349 | + break; |
3350 | |
3351 | case KVP_OP_DELETE: |
3352 | message->body.kvp_delete.key_size = |
3353 | @@ -464,12 +484,12 @@ kvp_send_key(struct work_struct *dummy) |
3354 | UTF16_LITTLE_ENDIAN, |
3355 | message->body.kvp_delete.key, |
3356 | HV_KVP_EXCHANGE_MAX_KEY_SIZE - 1) + 1; |
3357 | - break; |
3358 | + break; |
3359 | |
3360 | case KVP_OP_ENUMERATE: |
3361 | message->body.kvp_enum_data.index = |
3362 | in_msg->body.kvp_enum_data.index; |
3363 | - break; |
3364 | + break; |
3365 | } |
3366 | |
3367 | kvp_transaction.state = HVUTIL_USERSPACE_REQ; |
3368 | diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c |
3369 | index 3f3e8b3bf5ff..d51bf536bdf7 100644 |
3370 | --- a/drivers/i2c/busses/i2c-at91.c |
3371 | +++ b/drivers/i2c/busses/i2c-at91.c |
3372 | @@ -270,9 +270,11 @@ static void at91_twi_write_next_byte(struct at91_twi_dev *dev) |
3373 | writeb_relaxed(*dev->buf, dev->base + AT91_TWI_THR); |
3374 | |
3375 | /* send stop when last byte has been written */ |
3376 | - if (--dev->buf_len == 0) |
3377 | + if (--dev->buf_len == 0) { |
3378 | if (!dev->use_alt_cmd) |
3379 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP); |
3380 | + at91_twi_write(dev, AT91_TWI_IDR, AT91_TWI_TXRDY); |
3381 | + } |
3382 | |
3383 | dev_dbg(dev->dev, "wrote 0x%x, to go %zu\n", *dev->buf, dev->buf_len); |
3384 | |
3385 | @@ -690,9 +692,8 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev) |
3386 | } else { |
3387 | at91_twi_write_next_byte(dev); |
3388 | at91_twi_write(dev, AT91_TWI_IER, |
3389 | - AT91_TWI_TXCOMP | |
3390 | - AT91_TWI_NACK | |
3391 | - AT91_TWI_TXRDY); |
3392 | + AT91_TWI_TXCOMP | AT91_TWI_NACK | |
3393 | + (dev->buf_len ? AT91_TWI_TXRDY : 0)); |
3394 | } |
3395 | } |
3396 | |
3397 | @@ -913,7 +914,7 @@ static struct at91_twi_pdata sama5d4_config = { |
3398 | |
3399 | static struct at91_twi_pdata sama5d2_config = { |
3400 | .clk_max_div = 7, |
3401 | - .clk_offset = 4, |
3402 | + .clk_offset = 3, |
3403 | .has_unre_flag = true, |
3404 | .has_alt_cmd = true, |
3405 | .has_hold_field = true, |
3406 | diff --git a/drivers/iio/adc/exynos_adc.c b/drivers/iio/adc/exynos_adc.c |
3407 | index 4be29ed44755..1ca2c4d39f87 100644 |
3408 | --- a/drivers/iio/adc/exynos_adc.c |
3409 | +++ b/drivers/iio/adc/exynos_adc.c |
3410 | @@ -115,6 +115,8 @@ |
3411 | #define MAX_ADC_V2_CHANNELS 10 |
3412 | #define MAX_ADC_V1_CHANNELS 8 |
3413 | #define MAX_EXYNOS3250_ADC_CHANNELS 2 |
3414 | +#define MAX_EXYNOS4212_ADC_CHANNELS 4 |
3415 | +#define MAX_S5PV210_ADC_CHANNELS 10 |
3416 | |
3417 | /* Bit definitions common for ADC_V1 and ADC_V2 */ |
3418 | #define ADC_CON_EN_START (1u << 0) |
3419 | @@ -270,6 +272,19 @@ static void exynos_adc_v1_start_conv(struct exynos_adc *info, |
3420 | writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs)); |
3421 | } |
3422 | |
3423 | +/* Exynos4212 and 4412 is like ADCv1 but with four channels only */ |
3424 | +static const struct exynos_adc_data exynos4212_adc_data = { |
3425 | + .num_channels = MAX_EXYNOS4212_ADC_CHANNELS, |
3426 | + .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ |
3427 | + .needs_adc_phy = true, |
3428 | + .phy_offset = EXYNOS_ADCV1_PHY_OFFSET, |
3429 | + |
3430 | + .init_hw = exynos_adc_v1_init_hw, |
3431 | + .exit_hw = exynos_adc_v1_exit_hw, |
3432 | + .clear_irq = exynos_adc_v1_clear_irq, |
3433 | + .start_conv = exynos_adc_v1_start_conv, |
3434 | +}; |
3435 | + |
3436 | static const struct exynos_adc_data exynos_adc_v1_data = { |
3437 | .num_channels = MAX_ADC_V1_CHANNELS, |
3438 | .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ |
3439 | @@ -282,6 +297,16 @@ static const struct exynos_adc_data exynos_adc_v1_data = { |
3440 | .start_conv = exynos_adc_v1_start_conv, |
3441 | }; |
3442 | |
3443 | +static const struct exynos_adc_data exynos_adc_s5pv210_data = { |
3444 | + .num_channels = MAX_S5PV210_ADC_CHANNELS, |
3445 | + .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ |
3446 | + |
3447 | + .init_hw = exynos_adc_v1_init_hw, |
3448 | + .exit_hw = exynos_adc_v1_exit_hw, |
3449 | + .clear_irq = exynos_adc_v1_clear_irq, |
3450 | + .start_conv = exynos_adc_v1_start_conv, |
3451 | +}; |
3452 | + |
3453 | static void exynos_adc_s3c2416_start_conv(struct exynos_adc *info, |
3454 | unsigned long addr) |
3455 | { |
3456 | @@ -478,6 +503,12 @@ static const struct of_device_id exynos_adc_match[] = { |
3457 | }, { |
3458 | .compatible = "samsung,s3c6410-adc", |
3459 | .data = &exynos_adc_s3c64xx_data, |
3460 | + }, { |
3461 | + .compatible = "samsung,s5pv210-adc", |
3462 | + .data = &exynos_adc_s5pv210_data, |
3463 | + }, { |
3464 | + .compatible = "samsung,exynos4212-adc", |
3465 | + .data = &exynos4212_adc_data, |
3466 | }, { |
3467 | .compatible = "samsung,exynos-adc-v1", |
3468 | .data = &exynos_adc_v1_data, |
3469 | diff --git a/drivers/iio/adc/rcar-gyroadc.c b/drivers/iio/adc/rcar-gyroadc.c |
3470 | index dcb50172186f..f3a966ab35dc 100644 |
3471 | --- a/drivers/iio/adc/rcar-gyroadc.c |
3472 | +++ b/drivers/iio/adc/rcar-gyroadc.c |
3473 | @@ -391,7 +391,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) |
3474 | dev_err(dev, |
3475 | "Only %i channels supported with %s, but reg = <%i>.\n", |
3476 | num_channels, child->name, reg); |
3477 | - return ret; |
3478 | + return -EINVAL; |
3479 | } |
3480 | } |
3481 | |
3482 | @@ -400,7 +400,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) |
3483 | dev_err(dev, |
3484 | "Channel %i uses different ADC mode than the rest.\n", |
3485 | reg); |
3486 | - return ret; |
3487 | + return -EINVAL; |
3488 | } |
3489 | |
3490 | /* Channel is valid, grab the regulator. */ |
3491 | diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c |
3492 | index 50152c1b1004..357de3b4fddd 100644 |
3493 | --- a/drivers/infiniband/core/uverbs_main.c |
3494 | +++ b/drivers/infiniband/core/uverbs_main.c |
3495 | @@ -265,6 +265,9 @@ void ib_uverbs_release_file(struct kref *ref) |
3496 | if (atomic_dec_and_test(&file->device->refcount)) |
3497 | ib_uverbs_comp_dev(file->device); |
3498 | |
3499 | + if (file->async_file) |
3500 | + kref_put(&file->async_file->ref, |
3501 | + ib_uverbs_release_async_event_file); |
3502 | kobject_put(&file->device->kobj); |
3503 | kfree(file); |
3504 | } |
3505 | @@ -915,10 +918,6 @@ static int ib_uverbs_close(struct inode *inode, struct file *filp) |
3506 | } |
3507 | mutex_unlock(&file->device->lists_mutex); |
3508 | |
3509 | - if (file->async_file) |
3510 | - kref_put(&file->async_file->ref, |
3511 | - ib_uverbs_release_async_event_file); |
3512 | - |
3513 | kref_put(&file->ref, ib_uverbs_release_file); |
3514 | |
3515 | return 0; |
3516 | diff --git a/drivers/infiniband/hw/hfi1/sdma.c b/drivers/infiniband/hw/hfi1/sdma.c |
3517 | index 88e326d6cc49..d648a4167832 100644 |
3518 | --- a/drivers/infiniband/hw/hfi1/sdma.c |
3519 | +++ b/drivers/infiniband/hw/hfi1/sdma.c |
3520 | @@ -410,10 +410,7 @@ static void sdma_flush(struct sdma_engine *sde) |
3521 | sdma_flush_descq(sde); |
3522 | spin_lock_irqsave(&sde->flushlist_lock, flags); |
3523 | /* copy flush list */ |
3524 | - list_for_each_entry_safe(txp, txp_next, &sde->flushlist, list) { |
3525 | - list_del_init(&txp->list); |
3526 | - list_add_tail(&txp->list, &flushlist); |
3527 | - } |
3528 | + list_splice_init(&sde->flushlist, &flushlist); |
3529 | spin_unlock_irqrestore(&sde->flushlist_lock, flags); |
3530 | /* flush from flush list */ |
3531 | list_for_each_entry_safe(txp, txp_next, &flushlist, list) |
3532 | @@ -2426,7 +2423,7 @@ unlock_noconn: |
3533 | wait->tx_count++; |
3534 | wait->count += tx->num_desc; |
3535 | } |
3536 | - schedule_work(&sde->flush_worker); |
3537 | + queue_work_on(sde->cpu, system_highpri_wq, &sde->flush_worker); |
3538 | ret = -ECOMM; |
3539 | goto unlock; |
3540 | nodesc: |
3541 | @@ -2526,7 +2523,7 @@ unlock_noconn: |
3542 | } |
3543 | } |
3544 | spin_unlock(&sde->flushlist_lock); |
3545 | - schedule_work(&sde->flush_worker); |
3546 | + queue_work_on(sde->cpu, system_highpri_wq, &sde->flush_worker); |
3547 | ret = -ECOMM; |
3548 | goto update_tail; |
3549 | nodesc: |
3550 | diff --git a/drivers/infiniband/hw/mlx5/odp.c b/drivers/infiniband/hw/mlx5/odp.c |
3551 | index 9e1cac8cb260..453e5c4ac19f 100644 |
3552 | --- a/drivers/infiniband/hw/mlx5/odp.c |
3553 | +++ b/drivers/infiniband/hw/mlx5/odp.c |
3554 | @@ -497,7 +497,7 @@ void mlx5_ib_free_implicit_mr(struct mlx5_ib_mr *imr) |
3555 | static int pagefault_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr, |
3556 | u64 io_virt, size_t bcnt, u32 *bytes_mapped) |
3557 | { |
3558 | - u64 access_mask = ODP_READ_ALLOWED_BIT; |
3559 | + u64 access_mask; |
3560 | int npages = 0, page_shift, np; |
3561 | u64 start_idx, page_mask; |
3562 | struct ib_umem_odp *odp; |
3563 | @@ -522,6 +522,7 @@ next_mr: |
3564 | page_shift = mr->umem->page_shift; |
3565 | page_mask = ~(BIT(page_shift) - 1); |
3566 | start_idx = (io_virt - (mr->mmkey.iova & page_mask)) >> page_shift; |
3567 | + access_mask = ODP_READ_ALLOWED_BIT; |
3568 | |
3569 | if (mr->umem->writable) |
3570 | access_mask |= ODP_WRITE_ALLOWED_BIT; |
3571 | diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c |
3572 | index 2c1114ee0c6d..bc6a44a16445 100644 |
3573 | --- a/drivers/infiniband/ulp/srp/ib_srp.c |
3574 | +++ b/drivers/infiniband/ulp/srp/ib_srp.c |
3575 | @@ -3401,13 +3401,17 @@ static const match_table_t srp_opt_tokens = { |
3576 | |
3577 | /** |
3578 | * srp_parse_in - parse an IP address and port number combination |
3579 | + * @net: [in] Network namespace. |
3580 | + * @sa: [out] Address family, IP address and port number. |
3581 | + * @addr_port_str: [in] IP address and port number. |
3582 | + * @has_port: [out] Whether or not @addr_port_str includes a port number. |
3583 | * |
3584 | * Parse the following address formats: |
3585 | * - IPv4: <ip_address>:<port>, e.g. 1.2.3.4:5. |
3586 | * - IPv6: \[<ipv6_address>\]:<port>, e.g. [1::2:3%4]:5. |
3587 | */ |
3588 | static int srp_parse_in(struct net *net, struct sockaddr_storage *sa, |
3589 | - const char *addr_port_str) |
3590 | + const char *addr_port_str, bool *has_port) |
3591 | { |
3592 | char *addr_end, *addr = kstrdup(addr_port_str, GFP_KERNEL); |
3593 | char *port_str; |
3594 | @@ -3416,9 +3420,12 @@ static int srp_parse_in(struct net *net, struct sockaddr_storage *sa, |
3595 | if (!addr) |
3596 | return -ENOMEM; |
3597 | port_str = strrchr(addr, ':'); |
3598 | - if (!port_str) |
3599 | - return -EINVAL; |
3600 | - *port_str++ = '\0'; |
3601 | + if (port_str && strchr(port_str, ']')) |
3602 | + port_str = NULL; |
3603 | + if (port_str) |
3604 | + *port_str++ = '\0'; |
3605 | + if (has_port) |
3606 | + *has_port = port_str != NULL; |
3607 | ret = inet_pton_with_scope(net, AF_INET, addr, port_str, sa); |
3608 | if (ret && addr[0]) { |
3609 | addr_end = addr + strlen(addr) - 1; |
3610 | @@ -3440,6 +3447,7 @@ static int srp_parse_options(struct net *net, const char *buf, |
3611 | char *p; |
3612 | substring_t args[MAX_OPT_ARGS]; |
3613 | unsigned long long ull; |
3614 | + bool has_port; |
3615 | int opt_mask = 0; |
3616 | int token; |
3617 | int ret = -EINVAL; |
3618 | @@ -3538,7 +3546,8 @@ static int srp_parse_options(struct net *net, const char *buf, |
3619 | ret = -ENOMEM; |
3620 | goto out; |
3621 | } |
3622 | - ret = srp_parse_in(net, &target->rdma_cm.src.ss, p); |
3623 | + ret = srp_parse_in(net, &target->rdma_cm.src.ss, p, |
3624 | + NULL); |
3625 | if (ret < 0) { |
3626 | pr_warn("bad source parameter '%s'\n", p); |
3627 | kfree(p); |
3628 | @@ -3554,7 +3563,10 @@ static int srp_parse_options(struct net *net, const char *buf, |
3629 | ret = -ENOMEM; |
3630 | goto out; |
3631 | } |
3632 | - ret = srp_parse_in(net, &target->rdma_cm.dst.ss, p); |
3633 | + ret = srp_parse_in(net, &target->rdma_cm.dst.ss, p, |
3634 | + &has_port); |
3635 | + if (!has_port) |
3636 | + ret = -EINVAL; |
3637 | if (ret < 0) { |
3638 | pr_warn("bad dest parameter '%s'\n", p); |
3639 | kfree(p); |
3640 | diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c |
3641 | index 60348d707b99..9a576ae837dc 100644 |
3642 | --- a/drivers/iommu/iova.c |
3643 | +++ b/drivers/iommu/iova.c |
3644 | @@ -148,8 +148,9 @@ __cached_rbnode_delete_update(struct iova_domain *iovad, struct iova *free) |
3645 | struct iova *cached_iova; |
3646 | |
3647 | cached_iova = rb_entry(iovad->cached32_node, struct iova, node); |
3648 | - if (free->pfn_hi < iovad->dma_32bit_pfn && |
3649 | - free->pfn_lo >= cached_iova->pfn_lo) |
3650 | + if (free == cached_iova || |
3651 | + (free->pfn_hi < iovad->dma_32bit_pfn && |
3652 | + free->pfn_lo >= cached_iova->pfn_lo)) |
3653 | iovad->cached32_node = rb_next(&free->node); |
3654 | |
3655 | cached_iova = rb_entry(iovad->cached_node, struct iova, node); |
3656 | diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c |
3657 | index 3f4211b5cd33..45f684689c35 100644 |
3658 | --- a/drivers/md/bcache/btree.c |
3659 | +++ b/drivers/md/bcache/btree.c |
3660 | @@ -35,7 +35,7 @@ |
3661 | #include <linux/rcupdate.h> |
3662 | #include <linux/sched/clock.h> |
3663 | #include <linux/rculist.h> |
3664 | - |
3665 | +#include <linux/delay.h> |
3666 | #include <trace/events/bcache.h> |
3667 | |
3668 | /* |
3669 | @@ -649,7 +649,25 @@ static int mca_reap(struct btree *b, unsigned int min_order, bool flush) |
3670 | up(&b->io_mutex); |
3671 | } |
3672 | |
3673 | +retry: |
3674 | + /* |
3675 | + * BTREE_NODE_dirty might be cleared in btree_flush_btree() by |
3676 | + * __bch_btree_node_write(). To avoid an extra flush, acquire |
3677 | + * b->write_lock before checking BTREE_NODE_dirty bit. |
3678 | + */ |
3679 | mutex_lock(&b->write_lock); |
3680 | + /* |
3681 | + * If this btree node is selected in btree_flush_write() by journal |
3682 | + * code, delay and retry until the node is flushed by journal code |
3683 | + * and BTREE_NODE_journal_flush bit cleared by btree_flush_write(). |
3684 | + */ |
3685 | + if (btree_node_journal_flush(b)) { |
3686 | + pr_debug("bnode %p is flushing by journal, retry", b); |
3687 | + mutex_unlock(&b->write_lock); |
3688 | + udelay(1); |
3689 | + goto retry; |
3690 | + } |
3691 | + |
3692 | if (btree_node_dirty(b)) |
3693 | __bch_btree_node_write(b, &cl); |
3694 | mutex_unlock(&b->write_lock); |
3695 | @@ -772,10 +790,15 @@ void bch_btree_cache_free(struct cache_set *c) |
3696 | while (!list_empty(&c->btree_cache)) { |
3697 | b = list_first_entry(&c->btree_cache, struct btree, list); |
3698 | |
3699 | - if (btree_node_dirty(b)) |
3700 | + /* |
3701 | + * This function is called by cache_set_free(), no I/O |
3702 | + * request on cache now, it is unnecessary to acquire |
3703 | + * b->write_lock before clearing BTREE_NODE_dirty anymore. |
3704 | + */ |
3705 | + if (btree_node_dirty(b)) { |
3706 | btree_complete_write(b, btree_current_write(b)); |
3707 | - clear_bit(BTREE_NODE_dirty, &b->flags); |
3708 | - |
3709 | + clear_bit(BTREE_NODE_dirty, &b->flags); |
3710 | + } |
3711 | mca_data_free(b); |
3712 | } |
3713 | |
3714 | @@ -1061,11 +1084,25 @@ static void btree_node_free(struct btree *b) |
3715 | |
3716 | BUG_ON(b == b->c->root); |
3717 | |
3718 | +retry: |
3719 | mutex_lock(&b->write_lock); |
3720 | + /* |
3721 | + * If the btree node is selected and flushing in btree_flush_write(), |
3722 | + * delay and retry until the BTREE_NODE_journal_flush bit cleared, |
3723 | + * then it is safe to free the btree node here. Otherwise this btree |
3724 | + * node will be in race condition. |
3725 | + */ |
3726 | + if (btree_node_journal_flush(b)) { |
3727 | + mutex_unlock(&b->write_lock); |
3728 | + pr_debug("bnode %p journal_flush set, retry", b); |
3729 | + udelay(1); |
3730 | + goto retry; |
3731 | + } |
3732 | |
3733 | - if (btree_node_dirty(b)) |
3734 | + if (btree_node_dirty(b)) { |
3735 | btree_complete_write(b, btree_current_write(b)); |
3736 | - clear_bit(BTREE_NODE_dirty, &b->flags); |
3737 | + clear_bit(BTREE_NODE_dirty, &b->flags); |
3738 | + } |
3739 | |
3740 | mutex_unlock(&b->write_lock); |
3741 | |
3742 | diff --git a/drivers/md/bcache/btree.h b/drivers/md/bcache/btree.h |
3743 | index a68d6c55783b..4d0cca145f69 100644 |
3744 | --- a/drivers/md/bcache/btree.h |
3745 | +++ b/drivers/md/bcache/btree.h |
3746 | @@ -158,11 +158,13 @@ enum btree_flags { |
3747 | BTREE_NODE_io_error, |
3748 | BTREE_NODE_dirty, |
3749 | BTREE_NODE_write_idx, |
3750 | + BTREE_NODE_journal_flush, |
3751 | }; |
3752 | |
3753 | BTREE_FLAG(io_error); |
3754 | BTREE_FLAG(dirty); |
3755 | BTREE_FLAG(write_idx); |
3756 | +BTREE_FLAG(journal_flush); |
3757 | |
3758 | static inline struct btree_write *btree_current_write(struct btree *b) |
3759 | { |
3760 | diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c |
3761 | index c809724e6571..886710043025 100644 |
3762 | --- a/drivers/md/bcache/extents.c |
3763 | +++ b/drivers/md/bcache/extents.c |
3764 | @@ -538,6 +538,7 @@ static bool bch_extent_bad(struct btree_keys *bk, const struct bkey *k) |
3765 | { |
3766 | struct btree *b = container_of(bk, struct btree, keys); |
3767 | unsigned int i, stale; |
3768 | + char buf[80]; |
3769 | |
3770 | if (!KEY_PTRS(k) || |
3771 | bch_extent_invalid(bk, k)) |
3772 | @@ -547,19 +548,19 @@ static bool bch_extent_bad(struct btree_keys *bk, const struct bkey *k) |
3773 | if (!ptr_available(b->c, k, i)) |
3774 | return true; |
3775 | |
3776 | - if (!expensive_debug_checks(b->c) && KEY_DIRTY(k)) |
3777 | - return false; |
3778 | - |
3779 | for (i = 0; i < KEY_PTRS(k); i++) { |
3780 | stale = ptr_stale(b->c, k, i); |
3781 | |
3782 | - btree_bug_on(stale > 96, b, |
3783 | + if (stale && KEY_DIRTY(k)) { |
3784 | + bch_extent_to_text(buf, sizeof(buf), k); |
3785 | + pr_info("stale dirty pointer, stale %u, key: %s", |
3786 | + stale, buf); |
3787 | + } |
3788 | + |
3789 | + btree_bug_on(stale > BUCKET_GC_GEN_MAX, b, |
3790 | "key too stale: %i, need_gc %u", |
3791 | stale, b->c->need_gc); |
3792 | |
3793 | - btree_bug_on(stale && KEY_DIRTY(k) && KEY_SIZE(k), |
3794 | - b, "stale dirty pointer"); |
3795 | - |
3796 | if (stale) |
3797 | return true; |
3798 | |
3799 | diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c |
3800 | index ec1e35a62934..7bb15cddca5e 100644 |
3801 | --- a/drivers/md/bcache/journal.c |
3802 | +++ b/drivers/md/bcache/journal.c |
3803 | @@ -404,6 +404,7 @@ static void btree_flush_write(struct cache_set *c) |
3804 | retry: |
3805 | best = NULL; |
3806 | |
3807 | + mutex_lock(&c->bucket_lock); |
3808 | for_each_cached_btree(b, c, i) |
3809 | if (btree_current_write(b)->journal) { |
3810 | if (!best) |
3811 | @@ -416,9 +417,14 @@ retry: |
3812 | } |
3813 | |
3814 | b = best; |
3815 | + if (b) |
3816 | + set_btree_node_journal_flush(b); |
3817 | + mutex_unlock(&c->bucket_lock); |
3818 | + |
3819 | if (b) { |
3820 | mutex_lock(&b->write_lock); |
3821 | if (!btree_current_write(b)->journal) { |
3822 | + clear_bit(BTREE_NODE_journal_flush, &b->flags); |
3823 | mutex_unlock(&b->write_lock); |
3824 | /* We raced */ |
3825 | atomic_long_inc(&c->retry_flush_write); |
3826 | @@ -426,6 +432,7 @@ retry: |
3827 | } |
3828 | |
3829 | __bch_btree_node_write(b, NULL); |
3830 | + clear_bit(BTREE_NODE_journal_flush, &b->flags); |
3831 | mutex_unlock(&b->write_lock); |
3832 | } |
3833 | } |
3834 | diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c |
3835 | index f3dcc7640319..34f5de13a93d 100644 |
3836 | --- a/drivers/md/dm-crypt.c |
3837 | +++ b/drivers/md/dm-crypt.c |
3838 | @@ -949,6 +949,7 @@ static int crypt_integrity_ctr(struct crypt_config *cc, struct dm_target *ti) |
3839 | { |
3840 | #ifdef CONFIG_BLK_DEV_INTEGRITY |
3841 | struct blk_integrity *bi = blk_get_integrity(cc->dev->bdev->bd_disk); |
3842 | + struct mapped_device *md = dm_table_get_md(ti->table); |
3843 | |
3844 | /* From now we require underlying device with our integrity profile */ |
3845 | if (!bi || strcasecmp(bi->profile->name, "DM-DIF-EXT-TAG")) { |
3846 | @@ -968,7 +969,7 @@ static int crypt_integrity_ctr(struct crypt_config *cc, struct dm_target *ti) |
3847 | |
3848 | if (crypt_integrity_aead(cc)) { |
3849 | cc->integrity_tag_size = cc->on_disk_tag_size - cc->integrity_iv_size; |
3850 | - DMINFO("Integrity AEAD, tag size %u, IV size %u.", |
3851 | + DMDEBUG("%s: Integrity AEAD, tag size %u, IV size %u.", dm_device_name(md), |
3852 | cc->integrity_tag_size, cc->integrity_iv_size); |
3853 | |
3854 | if (crypto_aead_setauthsize(any_tfm_aead(cc), cc->integrity_tag_size)) { |
3855 | @@ -976,7 +977,7 @@ static int crypt_integrity_ctr(struct crypt_config *cc, struct dm_target *ti) |
3856 | return -EINVAL; |
3857 | } |
3858 | } else if (cc->integrity_iv_size) |
3859 | - DMINFO("Additional per-sector space %u bytes for IV.", |
3860 | + DMDEBUG("%s: Additional per-sector space %u bytes for IV.", dm_device_name(md), |
3861 | cc->integrity_iv_size); |
3862 | |
3863 | if ((cc->integrity_tag_size + cc->integrity_iv_size) != bi->tag_size) { |
3864 | diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c |
3865 | index baa966e2778c..481e54ded9dc 100644 |
3866 | --- a/drivers/md/dm-mpath.c |
3867 | +++ b/drivers/md/dm-mpath.c |
3868 | @@ -554,8 +554,23 @@ static int multipath_clone_and_map(struct dm_target *ti, struct request *rq, |
3869 | return DM_MAPIO_REMAPPED; |
3870 | } |
3871 | |
3872 | -static void multipath_release_clone(struct request *clone) |
3873 | +static void multipath_release_clone(struct request *clone, |
3874 | + union map_info *map_context) |
3875 | { |
3876 | + if (unlikely(map_context)) { |
3877 | + /* |
3878 | + * non-NULL map_context means caller is still map |
3879 | + * method; must undo multipath_clone_and_map() |
3880 | + */ |
3881 | + struct dm_mpath_io *mpio = get_mpio(map_context); |
3882 | + struct pgpath *pgpath = mpio->pgpath; |
3883 | + |
3884 | + if (pgpath && pgpath->pg->ps.type->end_io) |
3885 | + pgpath->pg->ps.type->end_io(&pgpath->pg->ps, |
3886 | + &pgpath->path, |
3887 | + mpio->nr_bytes); |
3888 | + } |
3889 | + |
3890 | blk_put_request(clone); |
3891 | } |
3892 | |
3893 | diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c |
3894 | index 264b84e274aa..17c6a73c536c 100644 |
3895 | --- a/drivers/md/dm-rq.c |
3896 | +++ b/drivers/md/dm-rq.c |
3897 | @@ -219,7 +219,7 @@ static void dm_end_request(struct request *clone, blk_status_t error) |
3898 | struct request *rq = tio->orig; |
3899 | |
3900 | blk_rq_unprep_clone(clone); |
3901 | - tio->ti->type->release_clone_rq(clone); |
3902 | + tio->ti->type->release_clone_rq(clone, NULL); |
3903 | |
3904 | rq_end_stats(md, rq); |
3905 | if (!rq->q->mq_ops) |
3906 | @@ -270,7 +270,7 @@ static void dm_requeue_original_request(struct dm_rq_target_io *tio, bool delay_ |
3907 | rq_end_stats(md, rq); |
3908 | if (tio->clone) { |
3909 | blk_rq_unprep_clone(tio->clone); |
3910 | - tio->ti->type->release_clone_rq(tio->clone); |
3911 | + tio->ti->type->release_clone_rq(tio->clone, NULL); |
3912 | } |
3913 | |
3914 | if (!rq->q->mq_ops) |
3915 | @@ -495,7 +495,7 @@ check_again: |
3916 | case DM_MAPIO_REMAPPED: |
3917 | if (setup_clone(clone, rq, tio, GFP_ATOMIC)) { |
3918 | /* -ENOMEM */ |
3919 | - ti->type->release_clone_rq(clone); |
3920 | + ti->type->release_clone_rq(clone, &tio->info); |
3921 | return DM_MAPIO_REQUEUE; |
3922 | } |
3923 | |
3924 | @@ -505,7 +505,7 @@ check_again: |
3925 | ret = dm_dispatch_clone_request(clone, rq); |
3926 | if (ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE) { |
3927 | blk_rq_unprep_clone(clone); |
3928 | - tio->ti->type->release_clone_rq(clone); |
3929 | + tio->ti->type->release_clone_rq(clone, &tio->info); |
3930 | tio->clone = NULL; |
3931 | if (!rq->q->mq_ops) |
3932 | r = DM_MAPIO_DELAY_REQUEUE; |
3933 | diff --git a/drivers/md/dm-target.c b/drivers/md/dm-target.c |
3934 | index 314d17ca6466..64dd0b34fcf4 100644 |
3935 | --- a/drivers/md/dm-target.c |
3936 | +++ b/drivers/md/dm-target.c |
3937 | @@ -136,7 +136,8 @@ static int io_err_clone_and_map_rq(struct dm_target *ti, struct request *rq, |
3938 | return DM_MAPIO_KILL; |
3939 | } |
3940 | |
3941 | -static void io_err_release_clone_rq(struct request *clone) |
3942 | +static void io_err_release_clone_rq(struct request *clone, |
3943 | + union map_info *map_context) |
3944 | { |
3945 | } |
3946 | |
3947 | diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c |
3948 | index ed3caceaed07..6a26afcc1fd6 100644 |
3949 | --- a/drivers/md/dm-thin-metadata.c |
3950 | +++ b/drivers/md/dm-thin-metadata.c |
3951 | @@ -2001,16 +2001,19 @@ int dm_pool_register_metadata_threshold(struct dm_pool_metadata *pmd, |
3952 | |
3953 | int dm_pool_metadata_set_needs_check(struct dm_pool_metadata *pmd) |
3954 | { |
3955 | - int r; |
3956 | + int r = -EINVAL; |
3957 | struct dm_block *sblock; |
3958 | struct thin_disk_superblock *disk_super; |
3959 | |
3960 | down_write(&pmd->root_lock); |
3961 | + if (pmd->fail_io) |
3962 | + goto out; |
3963 | + |
3964 | pmd->flags |= THIN_METADATA_NEEDS_CHECK_FLAG; |
3965 | |
3966 | r = superblock_lock(pmd, &sblock); |
3967 | if (r) { |
3968 | - DMERR("couldn't read superblock"); |
3969 | + DMERR("couldn't lock superblock"); |
3970 | goto out; |
3971 | } |
3972 | |
3973 | diff --git a/drivers/media/cec/Makefile b/drivers/media/cec/Makefile |
3974 | index 29a2ab9e77c5..ad8677d8c896 100644 |
3975 | --- a/drivers/media/cec/Makefile |
3976 | +++ b/drivers/media/cec/Makefile |
3977 | @@ -1,5 +1,5 @@ |
3978 | # SPDX-License-Identifier: GPL-2.0 |
3979 | -cec-objs := cec-core.o cec-adap.o cec-api.o cec-edid.o |
3980 | +cec-objs := cec-core.o cec-adap.o cec-api.o |
3981 | |
3982 | ifeq ($(CONFIG_CEC_NOTIFIER),y) |
3983 | cec-objs += cec-notifier.o |
3984 | diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c |
3985 | index a7ea27d2aa8e..4a15d53f659e 100644 |
3986 | --- a/drivers/media/cec/cec-adap.c |
3987 | +++ b/drivers/media/cec/cec-adap.c |
3988 | @@ -62,6 +62,19 @@ static unsigned int cec_log_addr2dev(const struct cec_adapter *adap, u8 log_addr |
3989 | return adap->log_addrs.primary_device_type[i < 0 ? 0 : i]; |
3990 | } |
3991 | |
3992 | +u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size, |
3993 | + unsigned int *offset) |
3994 | +{ |
3995 | + unsigned int loc = cec_get_edid_spa_location(edid, size); |
3996 | + |
3997 | + if (offset) |
3998 | + *offset = loc; |
3999 | + if (loc == 0) |
4000 | + return CEC_PHYS_ADDR_INVALID; |
4001 | + return (edid[loc] << 8) | edid[loc + 1]; |
4002 | +} |
4003 | +EXPORT_SYMBOL_GPL(cec_get_edid_phys_addr); |
4004 | + |
4005 | /* |
4006 | * Queue a new event for this filehandle. If ts == 0, then set it |
4007 | * to the current time. |
4008 | diff --git a/drivers/media/cec/cec-edid.c b/drivers/media/cec/cec-edid.c |
4009 | deleted file mode 100644 |
4010 | index f587e8eaefd8..000000000000 |
4011 | --- a/drivers/media/cec/cec-edid.c |
4012 | +++ /dev/null |
4013 | @@ -1,95 +0,0 @@ |
4014 | -// SPDX-License-Identifier: GPL-2.0-only |
4015 | -/* |
4016 | - * cec-edid - HDMI Consumer Electronics Control EDID & CEC helper functions |
4017 | - * |
4018 | - * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved. |
4019 | - */ |
4020 | - |
4021 | -#include <linux/module.h> |
4022 | -#include <linux/kernel.h> |
4023 | -#include <linux/types.h> |
4024 | -#include <media/cec.h> |
4025 | - |
4026 | -u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size, |
4027 | - unsigned int *offset) |
4028 | -{ |
4029 | - unsigned int loc = cec_get_edid_spa_location(edid, size); |
4030 | - |
4031 | - if (offset) |
4032 | - *offset = loc; |
4033 | - if (loc == 0) |
4034 | - return CEC_PHYS_ADDR_INVALID; |
4035 | - return (edid[loc] << 8) | edid[loc + 1]; |
4036 | -} |
4037 | -EXPORT_SYMBOL_GPL(cec_get_edid_phys_addr); |
4038 | - |
4039 | -void cec_set_edid_phys_addr(u8 *edid, unsigned int size, u16 phys_addr) |
4040 | -{ |
4041 | - unsigned int loc = cec_get_edid_spa_location(edid, size); |
4042 | - u8 sum = 0; |
4043 | - unsigned int i; |
4044 | - |
4045 | - if (loc == 0) |
4046 | - return; |
4047 | - edid[loc] = phys_addr >> 8; |
4048 | - edid[loc + 1] = phys_addr & 0xff; |
4049 | - loc &= ~0x7f; |
4050 | - |
4051 | - /* update the checksum */ |
4052 | - for (i = loc; i < loc + 127; i++) |
4053 | - sum += edid[i]; |
4054 | - edid[i] = 256 - sum; |
4055 | -} |
4056 | -EXPORT_SYMBOL_GPL(cec_set_edid_phys_addr); |
4057 | - |
4058 | -u16 cec_phys_addr_for_input(u16 phys_addr, u8 input) |
4059 | -{ |
4060 | - /* Check if input is sane */ |
4061 | - if (WARN_ON(input == 0 || input > 0xf)) |
4062 | - return CEC_PHYS_ADDR_INVALID; |
4063 | - |
4064 | - if (phys_addr == 0) |
4065 | - return input << 12; |
4066 | - |
4067 | - if ((phys_addr & 0x0fff) == 0) |
4068 | - return phys_addr | (input << 8); |
4069 | - |
4070 | - if ((phys_addr & 0x00ff) == 0) |
4071 | - return phys_addr | (input << 4); |
4072 | - |
4073 | - if ((phys_addr & 0x000f) == 0) |
4074 | - return phys_addr | input; |
4075 | - |
4076 | - /* |
4077 | - * All nibbles are used so no valid physical addresses can be assigned |
4078 | - * to the input. |
4079 | - */ |
4080 | - return CEC_PHYS_ADDR_INVALID; |
4081 | -} |
4082 | -EXPORT_SYMBOL_GPL(cec_phys_addr_for_input); |
4083 | - |
4084 | -int cec_phys_addr_validate(u16 phys_addr, u16 *parent, u16 *port) |
4085 | -{ |
4086 | - int i; |
4087 | - |
4088 | - if (parent) |
4089 | - *parent = phys_addr; |
4090 | - if (port) |
4091 | - *port = 0; |
4092 | - if (phys_addr == CEC_PHYS_ADDR_INVALID) |
4093 | - return 0; |
4094 | - for (i = 0; i < 16; i += 4) |
4095 | - if (phys_addr & (0xf << i)) |
4096 | - break; |
4097 | - if (i == 16) |
4098 | - return 0; |
4099 | - if (parent) |
4100 | - *parent = phys_addr & (0xfff0 << i); |
4101 | - if (port) |
4102 | - *port = (phys_addr >> i) & 0xf; |
4103 | - for (i += 4; i < 16; i += 4) |
4104 | - if ((phys_addr & (0xf << i)) == 0) |
4105 | - return -EINVAL; |
4106 | - return 0; |
4107 | -} |
4108 | -EXPORT_SYMBOL_GPL(cec_phys_addr_validate); |
4109 | diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig |
4110 | index 63c9ac2c6a5f..8b1ae1d6680b 100644 |
4111 | --- a/drivers/media/i2c/Kconfig |
4112 | +++ b/drivers/media/i2c/Kconfig |
4113 | @@ -60,8 +60,9 @@ config VIDEO_TDA1997X |
4114 | tristate "NXP TDA1997x HDMI receiver" |
4115 | depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API |
4116 | depends on SND_SOC |
4117 | - select SND_PCM |
4118 | select HDMI |
4119 | + select SND_PCM |
4120 | + select V4L2_FWNODE |
4121 | ---help--- |
4122 | V4L2 subdevice driver for the NXP TDA1997x HDMI receivers. |
4123 | |
4124 | diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c |
4125 | index f01964c36ad5..a4b0a89c7e7e 100644 |
4126 | --- a/drivers/media/i2c/adv7604.c |
4127 | +++ b/drivers/media/i2c/adv7604.c |
4128 | @@ -2297,8 +2297,8 @@ static int adv76xx_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid) |
4129 | edid->blocks = 2; |
4130 | return -E2BIG; |
4131 | } |
4132 | - pa = cec_get_edid_phys_addr(edid->edid, edid->blocks * 128, &spa_loc); |
4133 | - err = cec_phys_addr_validate(pa, &pa, NULL); |
4134 | + pa = v4l2_get_edid_phys_addr(edid->edid, edid->blocks * 128, &spa_loc); |
4135 | + err = v4l2_phys_addr_validate(pa, &pa, NULL); |
4136 | if (err) |
4137 | return err; |
4138 | |
4139 | diff --git a/drivers/media/i2c/adv7842.c b/drivers/media/i2c/adv7842.c |
4140 | index bb43a75ed6d0..58662ba92d4f 100644 |
4141 | --- a/drivers/media/i2c/adv7842.c |
4142 | +++ b/drivers/media/i2c/adv7842.c |
4143 | @@ -791,8 +791,8 @@ static int edid_write_hdmi_segment(struct v4l2_subdev *sd, u8 port) |
4144 | return 0; |
4145 | } |
4146 | |
4147 | - pa = cec_get_edid_phys_addr(edid, 256, &spa_loc); |
4148 | - err = cec_phys_addr_validate(pa, &pa, NULL); |
4149 | + pa = v4l2_get_edid_phys_addr(edid, 256, &spa_loc); |
4150 | + err = v4l2_phys_addr_validate(pa, &pa, NULL); |
4151 | if (err) |
4152 | return err; |
4153 | |
4154 | diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c |
4155 | index 26070fb6ce4e..e4c0a27b636a 100644 |
4156 | --- a/drivers/media/i2c/tc358743.c |
4157 | +++ b/drivers/media/i2c/tc358743.c |
4158 | @@ -1789,7 +1789,7 @@ static int tc358743_s_edid(struct v4l2_subdev *sd, |
4159 | return -E2BIG; |
4160 | } |
4161 | pa = cec_get_edid_phys_addr(edid->edid, edid->blocks * 128, NULL); |
4162 | - err = cec_phys_addr_validate(pa, &pa, NULL); |
4163 | + err = v4l2_phys_addr_validate(pa, &pa, NULL); |
4164 | if (err) |
4165 | return err; |
4166 | |
4167 | diff --git a/drivers/media/platform/stm32/stm32-dcmi.c b/drivers/media/platform/stm32/stm32-dcmi.c |
4168 | index d38682265892..1d9c028e52cb 100644 |
4169 | --- a/drivers/media/platform/stm32/stm32-dcmi.c |
4170 | +++ b/drivers/media/platform/stm32/stm32-dcmi.c |
4171 | @@ -1681,7 +1681,7 @@ static int dcmi_probe(struct platform_device *pdev) |
4172 | if (irq <= 0) { |
4173 | if (irq != -EPROBE_DEFER) |
4174 | dev_err(&pdev->dev, "Could not get irq\n"); |
4175 | - return irq; |
4176 | + return irq ? irq : -ENXIO; |
4177 | } |
4178 | |
4179 | dcmi->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
4180 | diff --git a/drivers/media/platform/vim2m.c b/drivers/media/platform/vim2m.c |
4181 | index 462099a141e4..7b8cf661f238 100644 |
4182 | --- a/drivers/media/platform/vim2m.c |
4183 | +++ b/drivers/media/platform/vim2m.c |
4184 | @@ -3,7 +3,8 @@ |
4185 | * |
4186 | * This is a virtual device driver for testing mem-to-mem videobuf framework. |
4187 | * It simulates a device that uses memory buffers for both source and |
4188 | - * destination, processes the data and issues an "irq" (simulated by a timer). |
4189 | + * destination, processes the data and issues an "irq" (simulated by a delayed |
4190 | + * workqueue). |
4191 | * The device is capable of multi-instance, multi-buffer-per-transaction |
4192 | * operation (via the mem2mem framework). |
4193 | * |
4194 | @@ -19,7 +20,6 @@ |
4195 | #include <linux/module.h> |
4196 | #include <linux/delay.h> |
4197 | #include <linux/fs.h> |
4198 | -#include <linux/timer.h> |
4199 | #include <linux/sched.h> |
4200 | #include <linux/slab.h> |
4201 | |
4202 | @@ -148,7 +148,7 @@ struct vim2m_dev { |
4203 | struct mutex dev_mutex; |
4204 | spinlock_t irqlock; |
4205 | |
4206 | - struct timer_list timer; |
4207 | + struct delayed_work work_run; |
4208 | |
4209 | struct v4l2_m2m_dev *m2m_dev; |
4210 | }; |
4211 | @@ -336,12 +336,6 @@ static int device_process(struct vim2m_ctx *ctx, |
4212 | return 0; |
4213 | } |
4214 | |
4215 | -static void schedule_irq(struct vim2m_dev *dev, int msec_timeout) |
4216 | -{ |
4217 | - dprintk(dev, "Scheduling a simulated irq\n"); |
4218 | - mod_timer(&dev->timer, jiffies + msecs_to_jiffies(msec_timeout)); |
4219 | -} |
4220 | - |
4221 | /* |
4222 | * mem2mem callbacks |
4223 | */ |
4224 | @@ -387,13 +381,14 @@ static void device_run(void *priv) |
4225 | |
4226 | device_process(ctx, src_buf, dst_buf); |
4227 | |
4228 | - /* Run a timer, which simulates a hardware irq */ |
4229 | - schedule_irq(dev, ctx->transtime); |
4230 | + /* Run delayed work, which simulates a hardware irq */ |
4231 | + schedule_delayed_work(&dev->work_run, msecs_to_jiffies(ctx->transtime)); |
4232 | } |
4233 | |
4234 | -static void device_isr(struct timer_list *t) |
4235 | +static void device_work(struct work_struct *w) |
4236 | { |
4237 | - struct vim2m_dev *vim2m_dev = from_timer(vim2m_dev, t, timer); |
4238 | + struct vim2m_dev *vim2m_dev = |
4239 | + container_of(w, struct vim2m_dev, work_run.work); |
4240 | struct vim2m_ctx *curr_ctx; |
4241 | struct vb2_v4l2_buffer *src_vb, *dst_vb; |
4242 | unsigned long flags; |
4243 | @@ -802,9 +797,13 @@ static int vim2m_start_streaming(struct vb2_queue *q, unsigned count) |
4244 | static void vim2m_stop_streaming(struct vb2_queue *q) |
4245 | { |
4246 | struct vim2m_ctx *ctx = vb2_get_drv_priv(q); |
4247 | + struct vim2m_dev *dev = ctx->dev; |
4248 | struct vb2_v4l2_buffer *vbuf; |
4249 | unsigned long flags; |
4250 | |
4251 | + if (v4l2_m2m_get_curr_priv(dev->m2m_dev) == ctx) |
4252 | + cancel_delayed_work_sync(&dev->work_run); |
4253 | + |
4254 | for (;;) { |
4255 | if (V4L2_TYPE_IS_OUTPUT(q->type)) |
4256 | vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); |
4257 | @@ -1015,6 +1014,7 @@ static int vim2m_probe(struct platform_device *pdev) |
4258 | vfd = &dev->vfd; |
4259 | vfd->lock = &dev->dev_mutex; |
4260 | vfd->v4l2_dev = &dev->v4l2_dev; |
4261 | + INIT_DELAYED_WORK(&dev->work_run, device_work); |
4262 | |
4263 | ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0); |
4264 | if (ret) { |
4265 | @@ -1026,7 +1026,6 @@ static int vim2m_probe(struct platform_device *pdev) |
4266 | v4l2_info(&dev->v4l2_dev, |
4267 | "Device registered as /dev/video%d\n", vfd->num); |
4268 | |
4269 | - timer_setup(&dev->timer, device_isr, 0); |
4270 | platform_set_drvdata(pdev, dev); |
4271 | |
4272 | dev->m2m_dev = v4l2_m2m_init(&m2m_ops); |
4273 | @@ -1083,7 +1082,6 @@ static int vim2m_remove(struct platform_device *pdev) |
4274 | media_device_cleanup(&dev->mdev); |
4275 | #endif |
4276 | v4l2_m2m_release(dev->m2m_dev); |
4277 | - del_timer_sync(&dev->timer); |
4278 | video_unregister_device(&dev->vfd); |
4279 | v4l2_device_unregister(&dev->v4l2_dev); |
4280 | |
4281 | diff --git a/drivers/media/platform/vivid/vivid-vid-cap.c b/drivers/media/platform/vivid/vivid-vid-cap.c |
4282 | index 3b09ffceefd5..2e273f4dfc29 100644 |
4283 | --- a/drivers/media/platform/vivid/vivid-vid-cap.c |
4284 | +++ b/drivers/media/platform/vivid/vivid-vid-cap.c |
4285 | @@ -1724,7 +1724,7 @@ int vidioc_s_edid(struct file *file, void *_fh, |
4286 | return -E2BIG; |
4287 | } |
4288 | phys_addr = cec_get_edid_phys_addr(edid->edid, edid->blocks * 128, NULL); |
4289 | - ret = cec_phys_addr_validate(phys_addr, &phys_addr, NULL); |
4290 | + ret = v4l2_phys_addr_validate(phys_addr, &phys_addr, NULL); |
4291 | if (ret) |
4292 | return ret; |
4293 | |
4294 | @@ -1740,7 +1740,7 @@ set_phys_addr: |
4295 | |
4296 | for (i = 0; i < MAX_OUTPUTS && dev->cec_tx_adap[i]; i++) |
4297 | cec_s_phys_addr(dev->cec_tx_adap[i], |
4298 | - cec_phys_addr_for_input(phys_addr, i + 1), |
4299 | + v4l2_phys_addr_for_input(phys_addr, i + 1), |
4300 | false); |
4301 | return 0; |
4302 | } |
4303 | diff --git a/drivers/media/platform/vivid/vivid-vid-common.c b/drivers/media/platform/vivid/vivid-vid-common.c |
4304 | index 2079861d2270..e108e9befb77 100644 |
4305 | --- a/drivers/media/platform/vivid/vivid-vid-common.c |
4306 | +++ b/drivers/media/platform/vivid/vivid-vid-common.c |
4307 | @@ -863,7 +863,7 @@ int vidioc_g_edid(struct file *file, void *_fh, |
4308 | if (edid->blocks > dev->edid_blocks - edid->start_block) |
4309 | edid->blocks = dev->edid_blocks - edid->start_block; |
4310 | if (adap) |
4311 | - cec_set_edid_phys_addr(dev->edid, dev->edid_blocks * 128, adap->phys_addr); |
4312 | + v4l2_set_edid_phys_addr(dev->edid, dev->edid_blocks * 128, adap->phys_addr); |
4313 | memcpy(edid->edid, dev->edid + edid->start_block * 128, edid->blocks * 128); |
4314 | return 0; |
4315 | } |
4316 | diff --git a/drivers/media/v4l2-core/v4l2-dv-timings.c b/drivers/media/v4l2-core/v4l2-dv-timings.c |
4317 | index c7c600c1f63b..a24b40dfec97 100644 |
4318 | --- a/drivers/media/v4l2-core/v4l2-dv-timings.c |
4319 | +++ b/drivers/media/v4l2-core/v4l2-dv-timings.c |
4320 | @@ -15,6 +15,7 @@ |
4321 | #include <media/v4l2-dv-timings.h> |
4322 | #include <linux/math64.h> |
4323 | #include <linux/hdmi.h> |
4324 | +#include <media/cec.h> |
4325 | |
4326 | MODULE_AUTHOR("Hans Verkuil"); |
4327 | MODULE_DESCRIPTION("V4L2 DV Timings Helper Functions"); |
4328 | @@ -942,3 +943,153 @@ v4l2_hdmi_rx_colorimetry(const struct hdmi_avi_infoframe *avi, |
4329 | return c; |
4330 | } |
4331 | EXPORT_SYMBOL_GPL(v4l2_hdmi_rx_colorimetry); |
4332 | + |
4333 | +/** |
4334 | + * v4l2_get_edid_phys_addr() - find and return the physical address |
4335 | + * |
4336 | + * @edid: pointer to the EDID data |
4337 | + * @size: size in bytes of the EDID data |
4338 | + * @offset: If not %NULL then the location of the physical address |
4339 | + * bytes in the EDID will be returned here. This is set to 0 |
4340 | + * if there is no physical address found. |
4341 | + * |
4342 | + * Return: the physical address or CEC_PHYS_ADDR_INVALID if there is none. |
4343 | + */ |
4344 | +u16 v4l2_get_edid_phys_addr(const u8 *edid, unsigned int size, |
4345 | + unsigned int *offset) |
4346 | +{ |
4347 | + unsigned int loc = cec_get_edid_spa_location(edid, size); |
4348 | + |
4349 | + if (offset) |
4350 | + *offset = loc; |
4351 | + if (loc == 0) |
4352 | + return CEC_PHYS_ADDR_INVALID; |
4353 | + return (edid[loc] << 8) | edid[loc + 1]; |
4354 | +} |
4355 | +EXPORT_SYMBOL_GPL(v4l2_get_edid_phys_addr); |
4356 | + |
4357 | +/** |
4358 | + * v4l2_set_edid_phys_addr() - find and set the physical address |
4359 | + * |
4360 | + * @edid: pointer to the EDID data |
4361 | + * @size: size in bytes of the EDID data |
4362 | + * @phys_addr: the new physical address |
4363 | + * |
4364 | + * This function finds the location of the physical address in the EDID |
4365 | + * and fills in the given physical address and updates the checksum |
4366 | + * at the end of the EDID block. It does nothing if the EDID doesn't |
4367 | + * contain a physical address. |
4368 | + */ |
4369 | +void v4l2_set_edid_phys_addr(u8 *edid, unsigned int size, u16 phys_addr) |
4370 | +{ |
4371 | + unsigned int loc = cec_get_edid_spa_location(edid, size); |
4372 | + u8 sum = 0; |
4373 | + unsigned int i; |
4374 | + |
4375 | + if (loc == 0) |
4376 | + return; |
4377 | + edid[loc] = phys_addr >> 8; |
4378 | + edid[loc + 1] = phys_addr & 0xff; |
4379 | + loc &= ~0x7f; |
4380 | + |
4381 | + /* update the checksum */ |
4382 | + for (i = loc; i < loc + 127; i++) |
4383 | + sum += edid[i]; |
4384 | + edid[i] = 256 - sum; |
4385 | +} |
4386 | +EXPORT_SYMBOL_GPL(v4l2_set_edid_phys_addr); |
4387 | + |
4388 | +/** |
4389 | + * v4l2_phys_addr_for_input() - calculate the PA for an input |
4390 | + * |
4391 | + * @phys_addr: the physical address of the parent |
4392 | + * @input: the number of the input port, must be between 1 and 15 |
4393 | + * |
4394 | + * This function calculates a new physical address based on the input |
4395 | + * port number. For example: |
4396 | + * |
4397 | + * PA = 0.0.0.0 and input = 2 becomes 2.0.0.0 |
4398 | + * |
4399 | + * PA = 3.0.0.0 and input = 1 becomes 3.1.0.0 |
4400 | + * |
4401 | + * PA = 3.2.1.0 and input = 5 becomes 3.2.1.5 |
4402 | + * |
4403 | + * PA = 3.2.1.3 and input = 5 becomes f.f.f.f since it maxed out the depth. |
4404 | + * |
4405 | + * Return: the new physical address or CEC_PHYS_ADDR_INVALID. |
4406 | + */ |
4407 | +u16 v4l2_phys_addr_for_input(u16 phys_addr, u8 input) |
4408 | +{ |
4409 | + /* Check if input is sane */ |
4410 | + if (WARN_ON(input == 0 || input > 0xf)) |
4411 | + return CEC_PHYS_ADDR_INVALID; |
4412 | + |
4413 | + if (phys_addr == 0) |
4414 | + return input << 12; |
4415 | + |
4416 | + if ((phys_addr & 0x0fff) == 0) |
4417 | + return phys_addr | (input << 8); |
4418 | + |
4419 | + if ((phys_addr & 0x00ff) == 0) |
4420 | + return phys_addr | (input << 4); |
4421 | + |
4422 | + if ((phys_addr & 0x000f) == 0) |
4423 | + return phys_addr | input; |
4424 | + |
4425 | + /* |
4426 | + * All nibbles are used so no valid physical addresses can be assigned |
4427 | + * to the input. |
4428 | + */ |
4429 | + return CEC_PHYS_ADDR_INVALID; |
4430 | +} |
4431 | +EXPORT_SYMBOL_GPL(v4l2_phys_addr_for_input); |
4432 | + |
4433 | +/** |
4434 | + * v4l2_phys_addr_validate() - validate a physical address from an EDID |
4435 | + * |
4436 | + * @phys_addr: the physical address to validate |
4437 | + * @parent: if not %NULL, then this is filled with the parents PA. |
4438 | + * @port: if not %NULL, then this is filled with the input port. |
4439 | + * |
4440 | + * This validates a physical address as read from an EDID. If the |
4441 | + * PA is invalid (such as 1.0.1.0 since '0' is only allowed at the end), |
4442 | + * then it will return -EINVAL. |
4443 | + * |
4444 | + * The parent PA is passed into %parent and the input port is passed into |
4445 | + * %port. For example: |
4446 | + * |
4447 | + * PA = 0.0.0.0: has parent 0.0.0.0 and input port 0. |
4448 | + * |
4449 | + * PA = 1.0.0.0: has parent 0.0.0.0 and input port 1. |
4450 | + * |
4451 | + * PA = 3.2.0.0: has parent 3.0.0.0 and input port 2. |
4452 | + * |
4453 | + * PA = f.f.f.f: has parent f.f.f.f and input port 0. |
4454 | + * |
4455 | + * Return: 0 if the PA is valid, -EINVAL if not. |
4456 | + */ |
4457 | +int v4l2_phys_addr_validate(u16 phys_addr, u16 *parent, u16 *port) |
4458 | +{ |
4459 | + int i; |
4460 | + |
4461 | + if (parent) |
4462 | + *parent = phys_addr; |
4463 | + if (port) |
4464 | + *port = 0; |
4465 | + if (phys_addr == CEC_PHYS_ADDR_INVALID) |
4466 | + return 0; |
4467 | + for (i = 0; i < 16; i += 4) |
4468 | + if (phys_addr & (0xf << i)) |
4469 | + break; |
4470 | + if (i == 16) |
4471 | + return 0; |
4472 | + if (parent) |
4473 | + *parent = phys_addr & (0xfff0 << i); |
4474 | + if (port) |
4475 | + *port = (phys_addr >> i) & 0xf; |
4476 | + for (i += 4; i < 16; i += 4) |
4477 | + if ((phys_addr & (0xf << i)) == 0) |
4478 | + return -EINVAL; |
4479 | + return 0; |
4480 | +} |
4481 | +EXPORT_SYMBOL_GPL(v4l2_phys_addr_validate); |
4482 | diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig |
4483 | index 11841f4b7b2b..dd938a5d0409 100644 |
4484 | --- a/drivers/mfd/Kconfig |
4485 | +++ b/drivers/mfd/Kconfig |
4486 | @@ -509,10 +509,10 @@ config INTEL_SOC_PMIC |
4487 | bool "Support for Crystal Cove PMIC" |
4488 | depends on ACPI && HAS_IOMEM && I2C=y && GPIOLIB && COMMON_CLK |
4489 | depends on X86 || COMPILE_TEST |
4490 | + depends on I2C_DESIGNWARE_PLATFORM=y |
4491 | select MFD_CORE |
4492 | select REGMAP_I2C |
4493 | select REGMAP_IRQ |
4494 | - select I2C_DESIGNWARE_PLATFORM |
4495 | help |
4496 | Select this option to enable support for Crystal Cove PMIC |
4497 | on some Intel SoC systems. The PMIC provides ADC, GPIO, |
4498 | @@ -538,10 +538,10 @@ config INTEL_SOC_PMIC_CHTWC |
4499 | bool "Support for Intel Cherry Trail Whiskey Cove PMIC" |
4500 | depends on ACPI && HAS_IOMEM && I2C=y && COMMON_CLK |
4501 | depends on X86 || COMPILE_TEST |
4502 | + depends on I2C_DESIGNWARE_PLATFORM=y |
4503 | select MFD_CORE |
4504 | select REGMAP_I2C |
4505 | select REGMAP_IRQ |
4506 | - select I2C_DESIGNWARE_PLATFORM |
4507 | help |
4508 | Select this option to enable support for the Intel Cherry Trail |
4509 | Whiskey Cove PMIC found on some Intel Cherry Trail systems. |
4510 | @@ -1403,9 +1403,9 @@ config MFD_TPS65217 |
4511 | config MFD_TPS68470 |
4512 | bool "TI TPS68470 Power Management / LED chips" |
4513 | depends on ACPI && I2C=y |
4514 | + depends on I2C_DESIGNWARE_PLATFORM=y |
4515 | select MFD_CORE |
4516 | select REGMAP_I2C |
4517 | - select I2C_DESIGNWARE_PLATFORM |
4518 | help |
4519 | If you say yes here you get support for the TPS68470 series of |
4520 | Power Management / LED chips. |
4521 | diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c |
4522 | index 45baf5d9120e..61f0faddfd88 100644 |
4523 | --- a/drivers/mmc/host/renesas_sdhi_core.c |
4524 | +++ b/drivers/mmc/host/renesas_sdhi_core.c |
4525 | @@ -636,6 +636,13 @@ int renesas_sdhi_probe(struct platform_device *pdev, |
4526 | host->ops.card_busy = renesas_sdhi_card_busy; |
4527 | host->ops.start_signal_voltage_switch = |
4528 | renesas_sdhi_start_signal_voltage_switch; |
4529 | + |
4530 | + /* SDR and HS200/400 registers requires HW reset */ |
4531 | + if (of_data && of_data->scc_offset) { |
4532 | + priv->scc_ctl = host->ctl + of_data->scc_offset; |
4533 | + host->mmc->caps |= MMC_CAP_HW_RESET; |
4534 | + host->hw_reset = renesas_sdhi_hw_reset; |
4535 | + } |
4536 | } |
4537 | |
4538 | /* Orginally registers were 16 bit apart, could be 32 or 64 nowadays */ |
4539 | @@ -693,8 +700,6 @@ int renesas_sdhi_probe(struct platform_device *pdev, |
4540 | const struct renesas_sdhi_scc *taps = of_data->taps; |
4541 | bool hit = false; |
4542 | |
4543 | - host->mmc->caps |= MMC_CAP_HW_RESET; |
4544 | - |
4545 | for (i = 0; i < of_data->taps_num; i++) { |
4546 | if (taps[i].clk_rate == 0 || |
4547 | taps[i].clk_rate == host->mmc->f_max) { |
4548 | @@ -707,12 +712,10 @@ int renesas_sdhi_probe(struct platform_device *pdev, |
4549 | if (!hit) |
4550 | dev_warn(&host->pdev->dev, "Unknown clock rate for SDR104\n"); |
4551 | |
4552 | - priv->scc_ctl = host->ctl + of_data->scc_offset; |
4553 | host->init_tuning = renesas_sdhi_init_tuning; |
4554 | host->prepare_tuning = renesas_sdhi_prepare_tuning; |
4555 | host->select_tuning = renesas_sdhi_select_tuning; |
4556 | host->check_scc_error = renesas_sdhi_check_scc_error; |
4557 | - host->hw_reset = renesas_sdhi_hw_reset; |
4558 | host->prepare_hs400_tuning = |
4559 | renesas_sdhi_prepare_hs400_tuning; |
4560 | host->hs400_downgrade = renesas_sdhi_disable_scc; |
4561 | diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c |
4562 | index c4115bae5db1..71794391f48f 100644 |
4563 | --- a/drivers/mmc/host/sdhci-pci-core.c |
4564 | +++ b/drivers/mmc/host/sdhci-pci-core.c |
4565 | @@ -1577,6 +1577,8 @@ static const struct pci_device_id pci_ids[] = { |
4566 | SDHCI_PCI_DEVICE(INTEL, CNPH_SD, intel_byt_sd), |
4567 | SDHCI_PCI_DEVICE(INTEL, ICP_EMMC, intel_glk_emmc), |
4568 | SDHCI_PCI_DEVICE(INTEL, ICP_SD, intel_byt_sd), |
4569 | + SDHCI_PCI_DEVICE(INTEL, CML_EMMC, intel_glk_emmc), |
4570 | + SDHCI_PCI_DEVICE(INTEL, CML_SD, intel_byt_sd), |
4571 | SDHCI_PCI_DEVICE(O2, 8120, o2), |
4572 | SDHCI_PCI_DEVICE(O2, 8220, o2), |
4573 | SDHCI_PCI_DEVICE(O2, 8221, o2), |
4574 | diff --git a/drivers/mmc/host/sdhci-pci.h b/drivers/mmc/host/sdhci-pci.h |
4575 | index 2ef0bdca9197..6f04a62b2998 100644 |
4576 | --- a/drivers/mmc/host/sdhci-pci.h |
4577 | +++ b/drivers/mmc/host/sdhci-pci.h |
4578 | @@ -50,6 +50,8 @@ |
4579 | #define PCI_DEVICE_ID_INTEL_CNPH_SD 0xa375 |
4580 | #define PCI_DEVICE_ID_INTEL_ICP_EMMC 0x34c4 |
4581 | #define PCI_DEVICE_ID_INTEL_ICP_SD 0x34f8 |
4582 | +#define PCI_DEVICE_ID_INTEL_CML_EMMC 0x02c4 |
4583 | +#define PCI_DEVICE_ID_INTEL_CML_SD 0x02f5 |
4584 | |
4585 | #define PCI_DEVICE_ID_SYSKONNECT_8000 0x8000 |
4586 | #define PCI_DEVICE_ID_VIA_95D0 0x95d0 |
4587 | diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c |
4588 | index 91ca77c7571c..b4347806a59e 100644 |
4589 | --- a/drivers/net/wireless/intel/iwlwifi/cfg/22000.c |
4590 | +++ b/drivers/net/wireless/intel/iwlwifi/cfg/22000.c |
4591 | @@ -77,10 +77,13 @@ |
4592 | #define IWL_22000_HR_FW_PRE "iwlwifi-Qu-a0-hr-a0-" |
4593 | #define IWL_22000_HR_CDB_FW_PRE "iwlwifi-QuIcp-z0-hrcdb-a0-" |
4594 | #define IWL_22000_HR_A_F0_FW_PRE "iwlwifi-QuQnj-f0-hr-a0-" |
4595 | -#define IWL_22000_HR_B_FW_PRE "iwlwifi-Qu-b0-hr-b0-" |
4596 | +#define IWL_22000_HR_B_F0_FW_PRE "iwlwifi-Qu-b0-hr-b0-" |
4597 | +#define IWL_22000_QU_B_HR_B_FW_PRE "iwlwifi-Qu-b0-hr-b0-" |
4598 | +#define IWL_22000_HR_B_FW_PRE "iwlwifi-QuQnj-b0-hr-b0-" |
4599 | #define IWL_22000_JF_B0_FW_PRE "iwlwifi-QuQnj-a0-jf-b0-" |
4600 | #define IWL_22000_HR_A0_FW_PRE "iwlwifi-QuQnj-a0-hr-a0-" |
4601 | #define IWL_22000_SU_Z0_FW_PRE "iwlwifi-su-z0-" |
4602 | +#define IWL_QU_B_JF_B_FW_PRE "iwlwifi-Qu-b0-jf-b0-" |
4603 | |
4604 | #define IWL_22000_HR_MODULE_FIRMWARE(api) \ |
4605 | IWL_22000_HR_FW_PRE __stringify(api) ".ucode" |
4606 | @@ -88,7 +91,11 @@ |
4607 | IWL_22000_JF_FW_PRE __stringify(api) ".ucode" |
4608 | #define IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(api) \ |
4609 | IWL_22000_HR_A_F0_FW_PRE __stringify(api) ".ucode" |
4610 | -#define IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(api) \ |
4611 | +#define IWL_22000_HR_B_F0_QNJ_MODULE_FIRMWARE(api) \ |
4612 | + IWL_22000_HR_B_F0_FW_PRE __stringify(api) ".ucode" |
4613 | +#define IWL_22000_QU_B_HR_B_MODULE_FIRMWARE(api) \ |
4614 | + IWL_22000_QU_B_HR_B_FW_PRE __stringify(api) ".ucode" |
4615 | +#define IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(api) \ |
4616 | IWL_22000_HR_B_FW_PRE __stringify(api) ".ucode" |
4617 | #define IWL_22000_JF_B0_QNJ_MODULE_FIRMWARE(api) \ |
4618 | IWL_22000_JF_B0_FW_PRE __stringify(api) ".ucode" |
4619 | @@ -96,6 +103,8 @@ |
4620 | IWL_22000_HR_A0_FW_PRE __stringify(api) ".ucode" |
4621 | #define IWL_22000_SU_Z0_MODULE_FIRMWARE(api) \ |
4622 | IWL_22000_SU_Z0_FW_PRE __stringify(api) ".ucode" |
4623 | +#define IWL_QU_B_JF_B_MODULE_FIRMWARE(api) \ |
4624 | + IWL_QU_B_JF_B_FW_PRE __stringify(api) ".ucode" |
4625 | |
4626 | #define NVM_HW_SECTION_NUM_FAMILY_22000 10 |
4627 | |
4628 | @@ -190,7 +199,54 @@ const struct iwl_cfg iwl22000_2ac_cfg_jf = { |
4629 | |
4630 | const struct iwl_cfg iwl22000_2ax_cfg_hr = { |
4631 | .name = "Intel(R) Dual Band Wireless AX 22000", |
4632 | - .fw_name_pre = IWL_22000_HR_FW_PRE, |
4633 | + .fw_name_pre = IWL_22000_QU_B_HR_B_FW_PRE, |
4634 | + IWL_DEVICE_22500, |
4635 | + /* |
4636 | + * This device doesn't support receiving BlockAck with a large bitmap |
4637 | + * so we need to restrict the size of transmitted aggregation to the |
4638 | + * HT size; mac80211 would otherwise pick the HE max (256) by default. |
4639 | + */ |
4640 | + .max_tx_agg_size = IEEE80211_MAX_AMPDU_BUF_HT, |
4641 | +}; |
4642 | + |
4643 | +/* |
4644 | + * All JF radio modules are part of the 9000 series, but the MAC part |
4645 | + * looks more like 22000. That's why this device is here, but called |
4646 | + * 9560 nevertheless. |
4647 | + */ |
4648 | +const struct iwl_cfg iwl9461_2ac_cfg_qu_b0_jf_b0 = { |
4649 | + .name = "Intel(R) Wireless-AC 9461", |
4650 | + .fw_name_pre = IWL_QU_B_JF_B_FW_PRE, |
4651 | + IWL_DEVICE_22500, |
4652 | +}; |
4653 | + |
4654 | +const struct iwl_cfg iwl9462_2ac_cfg_qu_b0_jf_b0 = { |
4655 | + .name = "Intel(R) Wireless-AC 9462", |
4656 | + .fw_name_pre = IWL_QU_B_JF_B_FW_PRE, |
4657 | + IWL_DEVICE_22500, |
4658 | +}; |
4659 | + |
4660 | +const struct iwl_cfg iwl9560_2ac_cfg_qu_b0_jf_b0 = { |
4661 | + .name = "Intel(R) Wireless-AC 9560", |
4662 | + .fw_name_pre = IWL_QU_B_JF_B_FW_PRE, |
4663 | + IWL_DEVICE_22500, |
4664 | +}; |
4665 | + |
4666 | +const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0 = { |
4667 | + .name = "Killer (R) Wireless-AC 1550i Wireless Network Adapter (9560NGW)", |
4668 | + .fw_name_pre = IWL_QU_B_JF_B_FW_PRE, |
4669 | + IWL_DEVICE_22500, |
4670 | +}; |
4671 | + |
4672 | +const struct iwl_cfg killer1550s_2ac_cfg_qu_b0_jf_b0 = { |
4673 | + .name = "Killer (R) Wireless-AC 1550s Wireless Network Adapter (9560NGW)", |
4674 | + .fw_name_pre = IWL_QU_B_JF_B_FW_PRE, |
4675 | + IWL_DEVICE_22500, |
4676 | +}; |
4677 | + |
4678 | +const struct iwl_cfg iwl22000_2ax_cfg_jf = { |
4679 | + .name = "Intel(R) Dual Band Wireless AX 22000", |
4680 | + .fw_name_pre = IWL_QU_B_JF_B_FW_PRE, |
4681 | IWL_DEVICE_22500, |
4682 | /* |
4683 | * This device doesn't support receiving BlockAck with a large bitmap |
4684 | @@ -264,7 +320,10 @@ const struct iwl_cfg iwl22560_2ax_cfg_su_cdb = { |
4685 | MODULE_FIRMWARE(IWL_22000_HR_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
4686 | MODULE_FIRMWARE(IWL_22000_JF_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
4687 | MODULE_FIRMWARE(IWL_22000_HR_A_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
4688 | +MODULE_FIRMWARE(IWL_22000_HR_B_F0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
4689 | +MODULE_FIRMWARE(IWL_22000_QU_B_HR_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
4690 | MODULE_FIRMWARE(IWL_22000_HR_B_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
4691 | MODULE_FIRMWARE(IWL_22000_JF_B0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
4692 | MODULE_FIRMWARE(IWL_22000_HR_A0_QNJ_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
4693 | MODULE_FIRMWARE(IWL_22000_SU_Z0_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
4694 | +MODULE_FIRMWARE(IWL_QU_B_JF_B_MODULE_FIRMWARE(IWL_22000_UCODE_API_MAX)); |
4695 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-config.h b/drivers/net/wireless/intel/iwlwifi/iwl-config.h |
4696 | index 12fddcf15bab..2e9fd7a30398 100644 |
4697 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-config.h |
4698 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-config.h |
4699 | @@ -574,11 +574,18 @@ extern const struct iwl_cfg iwl22000_2ac_cfg_hr; |
4700 | extern const struct iwl_cfg iwl22000_2ac_cfg_hr_cdb; |
4701 | extern const struct iwl_cfg iwl22000_2ac_cfg_jf; |
4702 | extern const struct iwl_cfg iwl22000_2ax_cfg_hr; |
4703 | +extern const struct iwl_cfg iwl9461_2ac_cfg_qu_b0_jf_b0; |
4704 | +extern const struct iwl_cfg iwl9462_2ac_cfg_qu_b0_jf_b0; |
4705 | +extern const struct iwl_cfg iwl9560_2ac_cfg_qu_b0_jf_b0; |
4706 | +extern const struct iwl_cfg killer1550i_2ac_cfg_qu_b0_jf_b0; |
4707 | +extern const struct iwl_cfg killer1550s_2ac_cfg_qu_b0_jf_b0; |
4708 | +extern const struct iwl_cfg iwl22000_2ax_cfg_jf; |
4709 | extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0_f0; |
4710 | +extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0_f0; |
4711 | extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_b0; |
4712 | extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_jf_b0; |
4713 | extern const struct iwl_cfg iwl22000_2ax_cfg_qnj_hr_a0; |
4714 | extern const struct iwl_cfg iwl22560_2ax_cfg_su_cdb; |
4715 | -#endif /* CONFIG_IWLMVM */ |
4716 | +#endif /* CPTCFG_IWLMVM || CPTCFG_IWLFMAC */ |
4717 | |
4718 | #endif /* __IWL_CONFIG_H__ */ |
4719 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c |
4720 | index 5d65500a8aa7..0982bd99b1c3 100644 |
4721 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c |
4722 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c |
4723 | @@ -601,6 +601,7 @@ static const struct pci_device_id iwl_hw_card_ids[] = { |
4724 | {IWL_PCI_DEVICE(0x2526, 0x2030, iwl9560_2ac_cfg_soc)}, |
4725 | {IWL_PCI_DEVICE(0x2526, 0x2034, iwl9560_2ac_cfg_soc)}, |
4726 | {IWL_PCI_DEVICE(0x2526, 0x4010, iwl9260_2ac_cfg)}, |
4727 | + {IWL_PCI_DEVICE(0x2526, 0x4018, iwl9260_2ac_cfg)}, |
4728 | {IWL_PCI_DEVICE(0x2526, 0x4030, iwl9560_2ac_cfg)}, |
4729 | {IWL_PCI_DEVICE(0x2526, 0x4034, iwl9560_2ac_cfg_soc)}, |
4730 | {IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)}, |
4731 | @@ -696,34 +697,33 @@ static const struct pci_device_id iwl_hw_card_ids[] = { |
4732 | {IWL_PCI_DEVICE(0x31DC, 0x40A4, iwl9462_2ac_cfg_shared_clk)}, |
4733 | {IWL_PCI_DEVICE(0x31DC, 0x4234, iwl9560_2ac_cfg_shared_clk)}, |
4734 | {IWL_PCI_DEVICE(0x31DC, 0x42A4, iwl9462_2ac_cfg_shared_clk)}, |
4735 | - {IWL_PCI_DEVICE(0x34F0, 0x0030, iwl9560_2ac_cfg_soc)}, |
4736 | - {IWL_PCI_DEVICE(0x34F0, 0x0034, iwl9560_2ac_cfg_soc)}, |
4737 | - {IWL_PCI_DEVICE(0x34F0, 0x0038, iwl9560_2ac_cfg_soc)}, |
4738 | - {IWL_PCI_DEVICE(0x34F0, 0x003C, iwl9560_2ac_cfg_soc)}, |
4739 | - {IWL_PCI_DEVICE(0x34F0, 0x0060, iwl9461_2ac_cfg_soc)}, |
4740 | - {IWL_PCI_DEVICE(0x34F0, 0x0064, iwl9461_2ac_cfg_soc)}, |
4741 | - {IWL_PCI_DEVICE(0x34F0, 0x00A0, iwl9462_2ac_cfg_soc)}, |
4742 | - {IWL_PCI_DEVICE(0x34F0, 0x00A4, iwl9462_2ac_cfg_soc)}, |
4743 | - {IWL_PCI_DEVICE(0x34F0, 0x0230, iwl9560_2ac_cfg_soc)}, |
4744 | - {IWL_PCI_DEVICE(0x34F0, 0x0234, iwl9560_2ac_cfg_soc)}, |
4745 | - {IWL_PCI_DEVICE(0x34F0, 0x0238, iwl9560_2ac_cfg_soc)}, |
4746 | - {IWL_PCI_DEVICE(0x34F0, 0x023C, iwl9560_2ac_cfg_soc)}, |
4747 | - {IWL_PCI_DEVICE(0x34F0, 0x0260, iwl9461_2ac_cfg_soc)}, |
4748 | - {IWL_PCI_DEVICE(0x34F0, 0x0264, iwl9461_2ac_cfg_soc)}, |
4749 | - {IWL_PCI_DEVICE(0x34F0, 0x02A0, iwl9462_2ac_cfg_soc)}, |
4750 | - {IWL_PCI_DEVICE(0x34F0, 0x02A4, iwl9462_2ac_cfg_soc)}, |
4751 | - {IWL_PCI_DEVICE(0x34F0, 0x1010, iwl9260_2ac_cfg)}, |
4752 | - {IWL_PCI_DEVICE(0x34F0, 0x1030, iwl9560_2ac_cfg_soc)}, |
4753 | - {IWL_PCI_DEVICE(0x34F0, 0x1210, iwl9260_2ac_cfg)}, |
4754 | - {IWL_PCI_DEVICE(0x34F0, 0x1551, iwl9560_killer_s_2ac_cfg_soc)}, |
4755 | - {IWL_PCI_DEVICE(0x34F0, 0x1552, iwl9560_killer_2ac_cfg_soc)}, |
4756 | - {IWL_PCI_DEVICE(0x34F0, 0x2030, iwl9560_2ac_cfg_soc)}, |
4757 | - {IWL_PCI_DEVICE(0x34F0, 0x2034, iwl9560_2ac_cfg_soc)}, |
4758 | - {IWL_PCI_DEVICE(0x34F0, 0x4030, iwl9560_2ac_cfg_soc)}, |
4759 | - {IWL_PCI_DEVICE(0x34F0, 0x4034, iwl9560_2ac_cfg_soc)}, |
4760 | - {IWL_PCI_DEVICE(0x34F0, 0x40A4, iwl9462_2ac_cfg_soc)}, |
4761 | - {IWL_PCI_DEVICE(0x34F0, 0x4234, iwl9560_2ac_cfg_soc)}, |
4762 | - {IWL_PCI_DEVICE(0x34F0, 0x42A4, iwl9462_2ac_cfg_soc)}, |
4763 | + |
4764 | + {IWL_PCI_DEVICE(0x34F0, 0x0030, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4765 | + {IWL_PCI_DEVICE(0x34F0, 0x0034, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4766 | + {IWL_PCI_DEVICE(0x34F0, 0x0038, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4767 | + {IWL_PCI_DEVICE(0x34F0, 0x003C, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4768 | + {IWL_PCI_DEVICE(0x34F0, 0x0060, iwl9461_2ac_cfg_qu_b0_jf_b0)}, |
4769 | + {IWL_PCI_DEVICE(0x34F0, 0x0064, iwl9461_2ac_cfg_qu_b0_jf_b0)}, |
4770 | + {IWL_PCI_DEVICE(0x34F0, 0x00A0, iwl9462_2ac_cfg_qu_b0_jf_b0)}, |
4771 | + {IWL_PCI_DEVICE(0x34F0, 0x00A4, iwl9462_2ac_cfg_qu_b0_jf_b0)}, |
4772 | + {IWL_PCI_DEVICE(0x34F0, 0x0230, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4773 | + {IWL_PCI_DEVICE(0x34F0, 0x0234, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4774 | + {IWL_PCI_DEVICE(0x34F0, 0x0238, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4775 | + {IWL_PCI_DEVICE(0x34F0, 0x023C, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4776 | + {IWL_PCI_DEVICE(0x34F0, 0x0260, iwl9461_2ac_cfg_qu_b0_jf_b0)}, |
4777 | + {IWL_PCI_DEVICE(0x34F0, 0x0264, iwl9461_2ac_cfg_qu_b0_jf_b0)}, |
4778 | + {IWL_PCI_DEVICE(0x34F0, 0x02A0, iwl9462_2ac_cfg_qu_b0_jf_b0)}, |
4779 | + {IWL_PCI_DEVICE(0x34F0, 0x02A4, iwl9462_2ac_cfg_qu_b0_jf_b0)}, |
4780 | + {IWL_PCI_DEVICE(0x34F0, 0x1551, killer1550s_2ac_cfg_qu_b0_jf_b0)}, |
4781 | + {IWL_PCI_DEVICE(0x34F0, 0x1552, killer1550i_2ac_cfg_qu_b0_jf_b0)}, |
4782 | + {IWL_PCI_DEVICE(0x34F0, 0x2030, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4783 | + {IWL_PCI_DEVICE(0x34F0, 0x2034, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4784 | + {IWL_PCI_DEVICE(0x34F0, 0x4030, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4785 | + {IWL_PCI_DEVICE(0x34F0, 0x4034, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4786 | + {IWL_PCI_DEVICE(0x34F0, 0x40A4, iwl9462_2ac_cfg_qu_b0_jf_b0)}, |
4787 | + {IWL_PCI_DEVICE(0x34F0, 0x4234, iwl9560_2ac_cfg_qu_b0_jf_b0)}, |
4788 | + {IWL_PCI_DEVICE(0x34F0, 0x42A4, iwl9462_2ac_cfg_qu_b0_jf_b0)}, |
4789 | + |
4790 | {IWL_PCI_DEVICE(0x3DF0, 0x0030, iwl9560_2ac_cfg_soc)}, |
4791 | {IWL_PCI_DEVICE(0x3DF0, 0x0034, iwl9560_2ac_cfg_soc)}, |
4792 | {IWL_PCI_DEVICE(0x3DF0, 0x0038, iwl9560_2ac_cfg_soc)}, |
4793 | diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2_mac_common.c b/drivers/net/wireless/mediatek/mt76/mt76x2_mac_common.c |
4794 | index 6542644bc325..cec31f0c3017 100644 |
4795 | --- a/drivers/net/wireless/mediatek/mt76/mt76x2_mac_common.c |
4796 | +++ b/drivers/net/wireless/mediatek/mt76/mt76x2_mac_common.c |
4797 | @@ -402,7 +402,7 @@ void mt76x2_mac_write_txwi(struct mt76x2_dev *dev, struct mt76x2_txwi *txwi, |
4798 | ccmp_pn[6] = pn >> 32; |
4799 | ccmp_pn[7] = pn >> 40; |
4800 | txwi->iv = *((__le32 *)&ccmp_pn[0]); |
4801 | - txwi->eiv = *((__le32 *)&ccmp_pn[1]); |
4802 | + txwi->eiv = *((__le32 *)&ccmp_pn[4]); |
4803 | } |
4804 | |
4805 | spin_lock_bh(&dev->mt76.lock); |
4806 | diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c |
4807 | index 67dec8860bf3..565bddcfd130 100644 |
4808 | --- a/drivers/nvme/host/fc.c |
4809 | +++ b/drivers/nvme/host/fc.c |
4810 | @@ -206,7 +206,7 @@ static LIST_HEAD(nvme_fc_lport_list); |
4811 | static DEFINE_IDA(nvme_fc_local_port_cnt); |
4812 | static DEFINE_IDA(nvme_fc_ctrl_cnt); |
4813 | |
4814 | - |
4815 | +static struct workqueue_struct *nvme_fc_wq; |
4816 | |
4817 | /* |
4818 | * These items are short-term. They will eventually be moved into |
4819 | @@ -2053,7 +2053,7 @@ nvme_fc_error_recovery(struct nvme_fc_ctrl *ctrl, char *errmsg) |
4820 | */ |
4821 | if (ctrl->ctrl.state == NVME_CTRL_CONNECTING) { |
4822 | active = atomic_xchg(&ctrl->err_work_active, 1); |
4823 | - if (!active && !schedule_work(&ctrl->err_work)) { |
4824 | + if (!active && !queue_work(nvme_fc_wq, &ctrl->err_work)) { |
4825 | atomic_set(&ctrl->err_work_active, 0); |
4826 | WARN_ON(1); |
4827 | } |
4828 | @@ -3321,6 +3321,10 @@ static int __init nvme_fc_init_module(void) |
4829 | { |
4830 | int ret; |
4831 | |
4832 | + nvme_fc_wq = alloc_workqueue("nvme_fc_wq", WQ_MEM_RECLAIM, 0); |
4833 | + if (!nvme_fc_wq) |
4834 | + return -ENOMEM; |
4835 | + |
4836 | /* |
4837 | * NOTE: |
4838 | * It is expected that in the future the kernel will combine |
4839 | @@ -3338,7 +3342,8 @@ static int __init nvme_fc_init_module(void) |
4840 | fc_class = class_create(THIS_MODULE, "fc"); |
4841 | if (IS_ERR(fc_class)) { |
4842 | pr_err("couldn't register class fc\n"); |
4843 | - return PTR_ERR(fc_class); |
4844 | + ret = PTR_ERR(fc_class); |
4845 | + goto out_destroy_wq; |
4846 | } |
4847 | |
4848 | /* |
4849 | @@ -3362,6 +3367,9 @@ out_destroy_device: |
4850 | device_destroy(fc_class, MKDEV(0, 0)); |
4851 | out_destroy_class: |
4852 | class_destroy(fc_class); |
4853 | +out_destroy_wq: |
4854 | + destroy_workqueue(nvme_fc_wq); |
4855 | + |
4856 | return ret; |
4857 | } |
4858 | |
4859 | @@ -3378,6 +3386,7 @@ static void __exit nvme_fc_exit_module(void) |
4860 | |
4861 | device_destroy(fc_class, MKDEV(0, 0)); |
4862 | class_destroy(fc_class); |
4863 | + destroy_workqueue(nvme_fc_wq); |
4864 | } |
4865 | |
4866 | module_init(nvme_fc_init_module); |
4867 | diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c |
4868 | index acd50920c2ff..b57ee79f6d69 100644 |
4869 | --- a/drivers/pci/controller/dwc/pcie-designware-host.c |
4870 | +++ b/drivers/pci/controller/dwc/pcie-designware-host.c |
4871 | @@ -356,7 +356,7 @@ int dw_pcie_host_init(struct pcie_port *pp) |
4872 | dev_err(dev, "Missing *config* reg space\n"); |
4873 | } |
4874 | |
4875 | - bridge = pci_alloc_host_bridge(0); |
4876 | + bridge = devm_pci_alloc_host_bridge(dev, 0); |
4877 | if (!bridge) |
4878 | return -ENOMEM; |
4879 | |
4880 | @@ -367,7 +367,7 @@ int dw_pcie_host_init(struct pcie_port *pp) |
4881 | |
4882 | ret = devm_request_pci_bus_resources(dev, &bridge->windows); |
4883 | if (ret) |
4884 | - goto error; |
4885 | + return ret; |
4886 | |
4887 | /* Get the I/O and memory ranges from DT */ |
4888 | resource_list_for_each_entry_safe(win, tmp, &bridge->windows) { |
4889 | @@ -411,8 +411,7 @@ int dw_pcie_host_init(struct pcie_port *pp) |
4890 | resource_size(pp->cfg)); |
4891 | if (!pci->dbi_base) { |
4892 | dev_err(dev, "Error with ioremap\n"); |
4893 | - ret = -ENOMEM; |
4894 | - goto error; |
4895 | + return -ENOMEM; |
4896 | } |
4897 | } |
4898 | |
4899 | @@ -423,8 +422,7 @@ int dw_pcie_host_init(struct pcie_port *pp) |
4900 | pp->cfg0_base, pp->cfg0_size); |
4901 | if (!pp->va_cfg0_base) { |
4902 | dev_err(dev, "Error with ioremap in function\n"); |
4903 | - ret = -ENOMEM; |
4904 | - goto error; |
4905 | + return -ENOMEM; |
4906 | } |
4907 | } |
4908 | |
4909 | @@ -434,8 +432,7 @@ int dw_pcie_host_init(struct pcie_port *pp) |
4910 | pp->cfg1_size); |
4911 | if (!pp->va_cfg1_base) { |
4912 | dev_err(dev, "Error with ioremap\n"); |
4913 | - ret = -ENOMEM; |
4914 | - goto error; |
4915 | + return -ENOMEM; |
4916 | } |
4917 | } |
4918 | |
4919 | @@ -458,14 +455,14 @@ int dw_pcie_host_init(struct pcie_port *pp) |
4920 | pp->num_vectors == 0) { |
4921 | dev_err(dev, |
4922 | "Invalid number of vectors\n"); |
4923 | - goto error; |
4924 | + return -EINVAL; |
4925 | } |
4926 | } |
4927 | |
4928 | if (!pp->ops->msi_host_init) { |
4929 | ret = dw_pcie_allocate_domains(pp); |
4930 | if (ret) |
4931 | - goto error; |
4932 | + return ret; |
4933 | |
4934 | if (pp->msi_irq) |
4935 | irq_set_chained_handler_and_data(pp->msi_irq, |
4936 | @@ -474,7 +471,7 @@ int dw_pcie_host_init(struct pcie_port *pp) |
4937 | } else { |
4938 | ret = pp->ops->msi_host_init(pp); |
4939 | if (ret < 0) |
4940 | - goto error; |
4941 | + return ret; |
4942 | } |
4943 | } |
4944 | |
4945 | @@ -514,8 +511,6 @@ int dw_pcie_host_init(struct pcie_port *pp) |
4946 | err_free_msi: |
4947 | if (pci_msi_enabled() && !pp->ops->msi_host_init) |
4948 | dw_pcie_free_msi(pp); |
4949 | -error: |
4950 | - pci_free_host_bridge(bridge); |
4951 | return ret; |
4952 | } |
4953 | |
4954 | diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c |
4955 | index 87a8887fd4d3..e292801fff7f 100644 |
4956 | --- a/drivers/pci/controller/dwc/pcie-qcom.c |
4957 | +++ b/drivers/pci/controller/dwc/pcie-qcom.c |
4958 | @@ -1091,7 +1091,6 @@ static int qcom_pcie_host_init(struct pcie_port *pp) |
4959 | struct qcom_pcie *pcie = to_qcom_pcie(pci); |
4960 | int ret; |
4961 | |
4962 | - pm_runtime_get_sync(pci->dev); |
4963 | qcom_ep_reset_assert(pcie); |
4964 | |
4965 | ret = pcie->ops->init(pcie); |
4966 | @@ -1128,7 +1127,6 @@ err_disable_phy: |
4967 | phy_power_off(pcie->phy); |
4968 | err_deinit: |
4969 | pcie->ops->deinit(pcie); |
4970 | - pm_runtime_put(pci->dev); |
4971 | |
4972 | return ret; |
4973 | } |
4974 | @@ -1218,6 +1216,12 @@ static int qcom_pcie_probe(struct platform_device *pdev) |
4975 | return -ENOMEM; |
4976 | |
4977 | pm_runtime_enable(dev); |
4978 | + ret = pm_runtime_get_sync(dev); |
4979 | + if (ret < 0) { |
4980 | + pm_runtime_disable(dev); |
4981 | + return ret; |
4982 | + } |
4983 | + |
4984 | pci->dev = dev; |
4985 | pci->ops = &dw_pcie_ops; |
4986 | pp = &pci->pp; |
4987 | @@ -1226,45 +1230,57 @@ static int qcom_pcie_probe(struct platform_device *pdev) |
4988 | |
4989 | pcie->ops = of_device_get_match_data(dev); |
4990 | |
4991 | - pcie->reset = devm_gpiod_get_optional(dev, "perst", GPIOD_OUT_LOW); |
4992 | - if (IS_ERR(pcie->reset)) |
4993 | - return PTR_ERR(pcie->reset); |
4994 | + pcie->reset = devm_gpiod_get_optional(dev, "perst", GPIOD_OUT_HIGH); |
4995 | + if (IS_ERR(pcie->reset)) { |
4996 | + ret = PTR_ERR(pcie->reset); |
4997 | + goto err_pm_runtime_put; |
4998 | + } |
4999 | |
5000 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "parf"); |
5001 | pcie->parf = devm_ioremap_resource(dev, res); |
5002 | - if (IS_ERR(pcie->parf)) |
5003 | - return PTR_ERR(pcie->parf); |
5004 | + if (IS_ERR(pcie->parf)) { |
5005 | + ret = PTR_ERR(pcie->parf); |
5006 | + goto err_pm_runtime_put; |
5007 | + } |
5008 | |
5009 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi"); |
5010 | pci->dbi_base = devm_pci_remap_cfg_resource(dev, res); |
5011 | - if (IS_ERR(pci->dbi_base)) |
5012 | - return PTR_ERR(pci->dbi_base); |
5013 | + if (IS_ERR(pci->dbi_base)) { |
5014 | + ret = PTR_ERR(pci->dbi_base); |
5015 | + goto err_pm_runtime_put; |
5016 | + } |
5017 | |
5018 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "elbi"); |
5019 | pcie->elbi = devm_ioremap_resource(dev, res); |
5020 | - if (IS_ERR(pcie->elbi)) |
5021 | - return PTR_ERR(pcie->elbi); |
5022 | + if (IS_ERR(pcie->elbi)) { |
5023 | + ret = PTR_ERR(pcie->elbi); |
5024 | + goto err_pm_runtime_put; |
5025 | + } |
5026 | |
5027 | pcie->phy = devm_phy_optional_get(dev, "pciephy"); |
5028 | - if (IS_ERR(pcie->phy)) |
5029 | - return PTR_ERR(pcie->phy); |
5030 | + if (IS_ERR(pcie->phy)) { |
5031 | + ret = PTR_ERR(pcie->phy); |
5032 | + goto err_pm_runtime_put; |
5033 | + } |
5034 | |
5035 | ret = pcie->ops->get_resources(pcie); |
5036 | if (ret) |
5037 | - return ret; |
5038 | + goto err_pm_runtime_put; |
5039 | |
5040 | pp->ops = &qcom_pcie_dw_ops; |
5041 | |
5042 | if (IS_ENABLED(CONFIG_PCI_MSI)) { |
5043 | pp->msi_irq = platform_get_irq_byname(pdev, "msi"); |
5044 | - if (pp->msi_irq < 0) |
5045 | - return pp->msi_irq; |
5046 | + if (pp->msi_irq < 0) { |
5047 | + ret = pp->msi_irq; |
5048 | + goto err_pm_runtime_put; |
5049 | + } |
5050 | } |
5051 | |
5052 | ret = phy_init(pcie->phy); |
5053 | if (ret) { |
5054 | pm_runtime_disable(&pdev->dev); |
5055 | - return ret; |
5056 | + goto err_pm_runtime_put; |
5057 | } |
5058 | |
5059 | platform_set_drvdata(pdev, pcie); |
5060 | @@ -1273,10 +1289,16 @@ static int qcom_pcie_probe(struct platform_device *pdev) |
5061 | if (ret) { |
5062 | dev_err(dev, "cannot initialize host\n"); |
5063 | pm_runtime_disable(&pdev->dev); |
5064 | - return ret; |
5065 | + goto err_pm_runtime_put; |
5066 | } |
5067 | |
5068 | return 0; |
5069 | + |
5070 | +err_pm_runtime_put: |
5071 | + pm_runtime_put(dev); |
5072 | + pm_runtime_disable(dev); |
5073 | + |
5074 | + return ret; |
5075 | } |
5076 | |
5077 | static const struct of_device_id qcom_pcie_match[] = { |
5078 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
5079 | index 28c64f84bfe7..06be52912dcd 100644 |
5080 | --- a/drivers/pci/quirks.c |
5081 | +++ b/drivers/pci/quirks.c |
5082 | @@ -5082,59 +5082,95 @@ static void quirk_switchtec_ntb_dma_alias(struct pci_dev *pdev) |
5083 | pci_iounmap(pdev, mmio); |
5084 | pci_disable_device(pdev); |
5085 | } |
5086 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8531, |
5087 | - quirk_switchtec_ntb_dma_alias); |
5088 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8532, |
5089 | - quirk_switchtec_ntb_dma_alias); |
5090 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8533, |
5091 | - quirk_switchtec_ntb_dma_alias); |
5092 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8534, |
5093 | - quirk_switchtec_ntb_dma_alias); |
5094 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8535, |
5095 | - quirk_switchtec_ntb_dma_alias); |
5096 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8536, |
5097 | - quirk_switchtec_ntb_dma_alias); |
5098 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8543, |
5099 | - quirk_switchtec_ntb_dma_alias); |
5100 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8544, |
5101 | - quirk_switchtec_ntb_dma_alias); |
5102 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8545, |
5103 | - quirk_switchtec_ntb_dma_alias); |
5104 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8546, |
5105 | - quirk_switchtec_ntb_dma_alias); |
5106 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8551, |
5107 | - quirk_switchtec_ntb_dma_alias); |
5108 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8552, |
5109 | - quirk_switchtec_ntb_dma_alias); |
5110 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8553, |
5111 | - quirk_switchtec_ntb_dma_alias); |
5112 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8554, |
5113 | - quirk_switchtec_ntb_dma_alias); |
5114 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8555, |
5115 | - quirk_switchtec_ntb_dma_alias); |
5116 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8556, |
5117 | - quirk_switchtec_ntb_dma_alias); |
5118 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8561, |
5119 | - quirk_switchtec_ntb_dma_alias); |
5120 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8562, |
5121 | - quirk_switchtec_ntb_dma_alias); |
5122 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8563, |
5123 | - quirk_switchtec_ntb_dma_alias); |
5124 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8564, |
5125 | - quirk_switchtec_ntb_dma_alias); |
5126 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8565, |
5127 | - quirk_switchtec_ntb_dma_alias); |
5128 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8566, |
5129 | - quirk_switchtec_ntb_dma_alias); |
5130 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8571, |
5131 | - quirk_switchtec_ntb_dma_alias); |
5132 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8572, |
5133 | - quirk_switchtec_ntb_dma_alias); |
5134 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8573, |
5135 | - quirk_switchtec_ntb_dma_alias); |
5136 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8574, |
5137 | - quirk_switchtec_ntb_dma_alias); |
5138 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8575, |
5139 | - quirk_switchtec_ntb_dma_alias); |
5140 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, 0x8576, |
5141 | - quirk_switchtec_ntb_dma_alias); |
5142 | +#define SWITCHTEC_QUIRK(vid) \ |
5143 | + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MICROSEMI, vid, \ |
5144 | + quirk_switchtec_ntb_dma_alias) |
5145 | + |
5146 | +SWITCHTEC_QUIRK(0x8531); /* PFX 24xG3 */ |
5147 | +SWITCHTEC_QUIRK(0x8532); /* PFX 32xG3 */ |
5148 | +SWITCHTEC_QUIRK(0x8533); /* PFX 48xG3 */ |
5149 | +SWITCHTEC_QUIRK(0x8534); /* PFX 64xG3 */ |
5150 | +SWITCHTEC_QUIRK(0x8535); /* PFX 80xG3 */ |
5151 | +SWITCHTEC_QUIRK(0x8536); /* PFX 96xG3 */ |
5152 | +SWITCHTEC_QUIRK(0x8541); /* PSX 24xG3 */ |
5153 | +SWITCHTEC_QUIRK(0x8542); /* PSX 32xG3 */ |
5154 | +SWITCHTEC_QUIRK(0x8543); /* PSX 48xG3 */ |
5155 | +SWITCHTEC_QUIRK(0x8544); /* PSX 64xG3 */ |
5156 | +SWITCHTEC_QUIRK(0x8545); /* PSX 80xG3 */ |
5157 | +SWITCHTEC_QUIRK(0x8546); /* PSX 96xG3 */ |
5158 | +SWITCHTEC_QUIRK(0x8551); /* PAX 24XG3 */ |
5159 | +SWITCHTEC_QUIRK(0x8552); /* PAX 32XG3 */ |
5160 | +SWITCHTEC_QUIRK(0x8553); /* PAX 48XG3 */ |
5161 | +SWITCHTEC_QUIRK(0x8554); /* PAX 64XG3 */ |
5162 | +SWITCHTEC_QUIRK(0x8555); /* PAX 80XG3 */ |
5163 | +SWITCHTEC_QUIRK(0x8556); /* PAX 96XG3 */ |
5164 | +SWITCHTEC_QUIRK(0x8561); /* PFXL 24XG3 */ |
5165 | +SWITCHTEC_QUIRK(0x8562); /* PFXL 32XG3 */ |
5166 | +SWITCHTEC_QUIRK(0x8563); /* PFXL 48XG3 */ |
5167 | +SWITCHTEC_QUIRK(0x8564); /* PFXL 64XG3 */ |
5168 | +SWITCHTEC_QUIRK(0x8565); /* PFXL 80XG3 */ |
5169 | +SWITCHTEC_QUIRK(0x8566); /* PFXL 96XG3 */ |
5170 | +SWITCHTEC_QUIRK(0x8571); /* PFXI 24XG3 */ |
5171 | +SWITCHTEC_QUIRK(0x8572); /* PFXI 32XG3 */ |
5172 | +SWITCHTEC_QUIRK(0x8573); /* PFXI 48XG3 */ |
5173 | +SWITCHTEC_QUIRK(0x8574); /* PFXI 64XG3 */ |
5174 | +SWITCHTEC_QUIRK(0x8575); /* PFXI 80XG3 */ |
5175 | +SWITCHTEC_QUIRK(0x8576); /* PFXI 96XG3 */ |
5176 | + |
5177 | +/* |
5178 | + * On Lenovo Thinkpad P50 SKUs with a Nvidia Quadro M1000M, the BIOS does |
5179 | + * not always reset the secondary Nvidia GPU between reboots if the system |
5180 | + * is configured to use Hybrid Graphics mode. This results in the GPU |
5181 | + * being left in whatever state it was in during the *previous* boot, which |
5182 | + * causes spurious interrupts from the GPU, which in turn causes us to |
5183 | + * disable the wrong IRQ and end up breaking the touchpad. Unsurprisingly, |
5184 | + * this also completely breaks nouveau. |
5185 | + * |
5186 | + * Luckily, it seems a simple reset of the Nvidia GPU brings it back to a |
5187 | + * clean state and fixes all these issues. |
5188 | + * |
5189 | + * When the machine is configured in Dedicated display mode, the issue |
5190 | + * doesn't occur. Fortunately the GPU advertises NoReset+ when in this |
5191 | + * mode, so we can detect that and avoid resetting it. |
5192 | + */ |
5193 | +static void quirk_reset_lenovo_thinkpad_p50_nvgpu(struct pci_dev *pdev) |
5194 | +{ |
5195 | + void __iomem *map; |
5196 | + int ret; |
5197 | + |
5198 | + if (pdev->subsystem_vendor != PCI_VENDOR_ID_LENOVO || |
5199 | + pdev->subsystem_device != 0x222e || |
5200 | + !pdev->reset_fn) |
5201 | + return; |
5202 | + |
5203 | + if (pci_enable_device_mem(pdev)) |
5204 | + return; |
5205 | + |
5206 | + /* |
5207 | + * Based on nvkm_device_ctor() in |
5208 | + * drivers/gpu/drm/nouveau/nvkm/engine/device/base.c |
5209 | + */ |
5210 | + map = pci_iomap(pdev, 0, 0x23000); |
5211 | + if (!map) { |
5212 | + pci_err(pdev, "Can't map MMIO space\n"); |
5213 | + goto out_disable; |
5214 | + } |
5215 | + |
5216 | + /* |
5217 | + * Make sure the GPU looks like it's been POSTed before resetting |
5218 | + * it. |
5219 | + */ |
5220 | + if (ioread32(map + 0x2240c) & 0x2) { |
5221 | + pci_info(pdev, FW_BUG "GPU left initialized by EFI, resetting\n"); |
5222 | + ret = pci_reset_bus(pdev); |
5223 | + if (ret < 0) |
5224 | + pci_err(pdev, "Failed to reset GPU: %d\n", ret); |
5225 | + } |
5226 | + |
5227 | + iounmap(map); |
5228 | +out_disable: |
5229 | + pci_disable_device(pdev); |
5230 | +} |
5231 | +DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_NVIDIA, 0x13b1, |
5232 | + PCI_CLASS_DISPLAY_VGA, 8, |
5233 | + quirk_reset_lenovo_thinkpad_p50_nvgpu); |
5234 | diff --git a/drivers/remoteproc/qcom_q6v5.c b/drivers/remoteproc/qcom_q6v5.c |
5235 | index e9ab90c19304..602af839421d 100644 |
5236 | --- a/drivers/remoteproc/qcom_q6v5.c |
5237 | +++ b/drivers/remoteproc/qcom_q6v5.c |
5238 | @@ -188,6 +188,14 @@ int qcom_q6v5_init(struct qcom_q6v5 *q6v5, struct platform_device *pdev, |
5239 | init_completion(&q6v5->stop_done); |
5240 | |
5241 | q6v5->wdog_irq = platform_get_irq_byname(pdev, "wdog"); |
5242 | + if (q6v5->wdog_irq < 0) { |
5243 | + if (q6v5->wdog_irq != -EPROBE_DEFER) |
5244 | + dev_err(&pdev->dev, |
5245 | + "failed to retrieve wdog IRQ: %d\n", |
5246 | + q6v5->wdog_irq); |
5247 | + return q6v5->wdog_irq; |
5248 | + } |
5249 | + |
5250 | ret = devm_request_threaded_irq(&pdev->dev, q6v5->wdog_irq, |
5251 | NULL, q6v5_wdog_interrupt, |
5252 | IRQF_TRIGGER_RISING | IRQF_ONESHOT, |
5253 | @@ -198,8 +206,13 @@ int qcom_q6v5_init(struct qcom_q6v5 *q6v5, struct platform_device *pdev, |
5254 | } |
5255 | |
5256 | q6v5->fatal_irq = platform_get_irq_byname(pdev, "fatal"); |
5257 | - if (q6v5->fatal_irq == -EPROBE_DEFER) |
5258 | - return -EPROBE_DEFER; |
5259 | + if (q6v5->fatal_irq < 0) { |
5260 | + if (q6v5->fatal_irq != -EPROBE_DEFER) |
5261 | + dev_err(&pdev->dev, |
5262 | + "failed to retrieve fatal IRQ: %d\n", |
5263 | + q6v5->fatal_irq); |
5264 | + return q6v5->fatal_irq; |
5265 | + } |
5266 | |
5267 | ret = devm_request_threaded_irq(&pdev->dev, q6v5->fatal_irq, |
5268 | NULL, q6v5_fatal_interrupt, |
5269 | @@ -211,8 +224,13 @@ int qcom_q6v5_init(struct qcom_q6v5 *q6v5, struct platform_device *pdev, |
5270 | } |
5271 | |
5272 | q6v5->ready_irq = platform_get_irq_byname(pdev, "ready"); |
5273 | - if (q6v5->ready_irq == -EPROBE_DEFER) |
5274 | - return -EPROBE_DEFER; |
5275 | + if (q6v5->ready_irq < 0) { |
5276 | + if (q6v5->ready_irq != -EPROBE_DEFER) |
5277 | + dev_err(&pdev->dev, |
5278 | + "failed to retrieve ready IRQ: %d\n", |
5279 | + q6v5->ready_irq); |
5280 | + return q6v5->ready_irq; |
5281 | + } |
5282 | |
5283 | ret = devm_request_threaded_irq(&pdev->dev, q6v5->ready_irq, |
5284 | NULL, q6v5_ready_interrupt, |
5285 | @@ -224,8 +242,13 @@ int qcom_q6v5_init(struct qcom_q6v5 *q6v5, struct platform_device *pdev, |
5286 | } |
5287 | |
5288 | q6v5->handover_irq = platform_get_irq_byname(pdev, "handover"); |
5289 | - if (q6v5->handover_irq == -EPROBE_DEFER) |
5290 | - return -EPROBE_DEFER; |
5291 | + if (q6v5->handover_irq < 0) { |
5292 | + if (q6v5->handover_irq != -EPROBE_DEFER) |
5293 | + dev_err(&pdev->dev, |
5294 | + "failed to retrieve handover IRQ: %d\n", |
5295 | + q6v5->handover_irq); |
5296 | + return q6v5->handover_irq; |
5297 | + } |
5298 | |
5299 | ret = devm_request_threaded_irq(&pdev->dev, q6v5->handover_irq, |
5300 | NULL, q6v5_handover_interrupt, |
5301 | @@ -238,8 +261,13 @@ int qcom_q6v5_init(struct qcom_q6v5 *q6v5, struct platform_device *pdev, |
5302 | disable_irq(q6v5->handover_irq); |
5303 | |
5304 | q6v5->stop_irq = platform_get_irq_byname(pdev, "stop-ack"); |
5305 | - if (q6v5->stop_irq == -EPROBE_DEFER) |
5306 | - return -EPROBE_DEFER; |
5307 | + if (q6v5->stop_irq < 0) { |
5308 | + if (q6v5->stop_irq != -EPROBE_DEFER) |
5309 | + dev_err(&pdev->dev, |
5310 | + "failed to retrieve stop-ack IRQ: %d\n", |
5311 | + q6v5->stop_irq); |
5312 | + return q6v5->stop_irq; |
5313 | + } |
5314 | |
5315 | ret = devm_request_threaded_irq(&pdev->dev, q6v5->stop_irq, |
5316 | NULL, q6v5_stop_interrupt, |
5317 | diff --git a/drivers/remoteproc/qcom_q6v5_pil.c b/drivers/remoteproc/qcom_q6v5_pil.c |
5318 | index d7a4b9eca5d2..6a84b6372897 100644 |
5319 | --- a/drivers/remoteproc/qcom_q6v5_pil.c |
5320 | +++ b/drivers/remoteproc/qcom_q6v5_pil.c |
5321 | @@ -1132,6 +1132,9 @@ static int q6v5_probe(struct platform_device *pdev) |
5322 | if (!desc) |
5323 | return -EINVAL; |
5324 | |
5325 | + if (desc->need_mem_protection && !qcom_scm_is_available()) |
5326 | + return -EPROBE_DEFER; |
5327 | + |
5328 | rproc = rproc_alloc(&pdev->dev, pdev->name, &q6v5_ops, |
5329 | desc->hexagon_mba_image, sizeof(*qproc)); |
5330 | if (!rproc) { |
5331 | diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c |
5332 | index a57b969b8973..3be54651698a 100644 |
5333 | --- a/drivers/s390/crypto/ap_bus.c |
5334 | +++ b/drivers/s390/crypto/ap_bus.c |
5335 | @@ -777,6 +777,8 @@ static int ap_device_probe(struct device *dev) |
5336 | drvres = ap_drv->flags & AP_DRIVER_FLAG_DEFAULT; |
5337 | if (!!devres != !!drvres) |
5338 | return -ENODEV; |
5339 | + /* (re-)init queue's state machine */ |
5340 | + ap_queue_reinit_state(to_ap_queue(dev)); |
5341 | } |
5342 | |
5343 | /* Add queue/card to list of active queues/cards */ |
5344 | @@ -809,6 +811,8 @@ static int ap_device_remove(struct device *dev) |
5345 | struct ap_device *ap_dev = to_ap_dev(dev); |
5346 | struct ap_driver *ap_drv = ap_dev->drv; |
5347 | |
5348 | + if (is_queue_dev(dev)) |
5349 | + ap_queue_remove(to_ap_queue(dev)); |
5350 | if (ap_drv->remove) |
5351 | ap_drv->remove(ap_dev); |
5352 | |
5353 | @@ -1446,10 +1450,6 @@ static void ap_scan_bus(struct work_struct *unused) |
5354 | aq->ap_dev.device.parent = &ac->ap_dev.device; |
5355 | dev_set_name(&aq->ap_dev.device, |
5356 | "%02x.%04x", id, dom); |
5357 | - /* Start with a device reset */ |
5358 | - spin_lock_bh(&aq->lock); |
5359 | - ap_wait(ap_sm_event(aq, AP_EVENT_POLL)); |
5360 | - spin_unlock_bh(&aq->lock); |
5361 | /* Register device */ |
5362 | rc = device_register(&aq->ap_dev.device); |
5363 | if (rc) { |
5364 | diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h |
5365 | index 5246cd8c16a6..7e85d238767b 100644 |
5366 | --- a/drivers/s390/crypto/ap_bus.h |
5367 | +++ b/drivers/s390/crypto/ap_bus.h |
5368 | @@ -253,6 +253,7 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type); |
5369 | void ap_queue_remove(struct ap_queue *aq); |
5370 | void ap_queue_suspend(struct ap_device *ap_dev); |
5371 | void ap_queue_resume(struct ap_device *ap_dev); |
5372 | +void ap_queue_reinit_state(struct ap_queue *aq); |
5373 | |
5374 | struct ap_card *ap_card_create(int id, int queue_depth, int raw_device_type, |
5375 | int comp_device_type, unsigned int functions); |
5376 | diff --git a/drivers/s390/crypto/ap_queue.c b/drivers/s390/crypto/ap_queue.c |
5377 | index 66f7334bcb03..0aa4b3ccc948 100644 |
5378 | --- a/drivers/s390/crypto/ap_queue.c |
5379 | +++ b/drivers/s390/crypto/ap_queue.c |
5380 | @@ -718,5 +718,20 @@ void ap_queue_remove(struct ap_queue *aq) |
5381 | { |
5382 | ap_flush_queue(aq); |
5383 | del_timer_sync(&aq->timeout); |
5384 | + |
5385 | + /* reset with zero, also clears irq registration */ |
5386 | + spin_lock_bh(&aq->lock); |
5387 | + ap_zapq(aq->qid); |
5388 | + aq->state = AP_STATE_BORKED; |
5389 | + spin_unlock_bh(&aq->lock); |
5390 | } |
5391 | EXPORT_SYMBOL(ap_queue_remove); |
5392 | + |
5393 | +void ap_queue_reinit_state(struct ap_queue *aq) |
5394 | +{ |
5395 | + spin_lock_bh(&aq->lock); |
5396 | + aq->state = AP_STATE_RESET_START; |
5397 | + ap_wait(ap_sm_event(aq, AP_EVENT_POLL)); |
5398 | + spin_unlock_bh(&aq->lock); |
5399 | +} |
5400 | +EXPORT_SYMBOL(ap_queue_reinit_state); |
5401 | diff --git a/drivers/s390/crypto/zcrypt_cex2a.c b/drivers/s390/crypto/zcrypt_cex2a.c |
5402 | index f4ae5fa30ec9..ff17a00273f7 100644 |
5403 | --- a/drivers/s390/crypto/zcrypt_cex2a.c |
5404 | +++ b/drivers/s390/crypto/zcrypt_cex2a.c |
5405 | @@ -198,7 +198,6 @@ static void zcrypt_cex2a_queue_remove(struct ap_device *ap_dev) |
5406 | struct ap_queue *aq = to_ap_queue(&ap_dev->device); |
5407 | struct zcrypt_queue *zq = aq->private; |
5408 | |
5409 | - ap_queue_remove(aq); |
5410 | if (zq) |
5411 | zcrypt_queue_unregister(zq); |
5412 | } |
5413 | diff --git a/drivers/s390/crypto/zcrypt_cex4.c b/drivers/s390/crypto/zcrypt_cex4.c |
5414 | index 35d58dbbc4da..2a42e5962317 100644 |
5415 | --- a/drivers/s390/crypto/zcrypt_cex4.c |
5416 | +++ b/drivers/s390/crypto/zcrypt_cex4.c |
5417 | @@ -273,7 +273,6 @@ static void zcrypt_cex4_queue_remove(struct ap_device *ap_dev) |
5418 | struct ap_queue *aq = to_ap_queue(&ap_dev->device); |
5419 | struct zcrypt_queue *zq = aq->private; |
5420 | |
5421 | - ap_queue_remove(aq); |
5422 | if (zq) |
5423 | zcrypt_queue_unregister(zq); |
5424 | } |
5425 | diff --git a/drivers/s390/crypto/zcrypt_pcixcc.c b/drivers/s390/crypto/zcrypt_pcixcc.c |
5426 | index 94d9f7224aea..baa683c3f5d3 100644 |
5427 | --- a/drivers/s390/crypto/zcrypt_pcixcc.c |
5428 | +++ b/drivers/s390/crypto/zcrypt_pcixcc.c |
5429 | @@ -276,7 +276,6 @@ static void zcrypt_pcixcc_queue_remove(struct ap_device *ap_dev) |
5430 | struct ap_queue *aq = to_ap_queue(&ap_dev->device); |
5431 | struct zcrypt_queue *zq = aq->private; |
5432 | |
5433 | - ap_queue_remove(aq); |
5434 | if (zq) |
5435 | zcrypt_queue_unregister(zq); |
5436 | } |
5437 | diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c |
5438 | index 3c86e27f094d..aff073a5b52b 100644 |
5439 | --- a/drivers/s390/scsi/zfcp_fsf.c |
5440 | +++ b/drivers/s390/scsi/zfcp_fsf.c |
5441 | @@ -1594,6 +1594,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) |
5442 | { |
5443 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; |
5444 | struct zfcp_fsf_req *req; |
5445 | + unsigned long req_id = 0; |
5446 | int retval = -EIO; |
5447 | |
5448 | spin_lock_irq(&qdio->req_q_lock); |
5449 | @@ -1616,6 +1617,8 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) |
5450 | hton24(req->qtcb->bottom.support.d_id, wka_port->d_id); |
5451 | req->data = wka_port; |
5452 | |
5453 | + req_id = req->req_id; |
5454 | + |
5455 | zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); |
5456 | retval = zfcp_fsf_req_send(req); |
5457 | if (retval) |
5458 | @@ -1623,7 +1626,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) |
5459 | out: |
5460 | spin_unlock_irq(&qdio->req_q_lock); |
5461 | if (!retval) |
5462 | - zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id); |
5463 | + zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req_id); |
5464 | return retval; |
5465 | } |
5466 | |
5467 | @@ -1649,6 +1652,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) |
5468 | { |
5469 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; |
5470 | struct zfcp_fsf_req *req; |
5471 | + unsigned long req_id = 0; |
5472 | int retval = -EIO; |
5473 | |
5474 | spin_lock_irq(&qdio->req_q_lock); |
5475 | @@ -1671,6 +1675,8 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) |
5476 | req->data = wka_port; |
5477 | req->qtcb->header.port_handle = wka_port->handle; |
5478 | |
5479 | + req_id = req->req_id; |
5480 | + |
5481 | zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); |
5482 | retval = zfcp_fsf_req_send(req); |
5483 | if (retval) |
5484 | @@ -1678,7 +1684,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) |
5485 | out: |
5486 | spin_unlock_irq(&qdio->req_q_lock); |
5487 | if (!retval) |
5488 | - zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id); |
5489 | + zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req_id); |
5490 | return retval; |
5491 | } |
5492 | |
5493 | diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c |
5494 | index ec54538f7ae1..67efdf25657f 100644 |
5495 | --- a/drivers/s390/virtio/virtio_ccw.c |
5496 | +++ b/drivers/s390/virtio/virtio_ccw.c |
5497 | @@ -132,6 +132,7 @@ struct airq_info { |
5498 | struct airq_iv *aiv; |
5499 | }; |
5500 | static struct airq_info *airq_areas[MAX_AIRQ_AREAS]; |
5501 | +static DEFINE_MUTEX(airq_areas_lock); |
5502 | |
5503 | #define CCW_CMD_SET_VQ 0x13 |
5504 | #define CCW_CMD_VDEV_RESET 0x33 |
5505 | @@ -244,9 +245,11 @@ static unsigned long get_airq_indicator(struct virtqueue *vqs[], int nvqs, |
5506 | unsigned long bit, flags; |
5507 | |
5508 | for (i = 0; i < MAX_AIRQ_AREAS && !indicator_addr; i++) { |
5509 | + mutex_lock(&airq_areas_lock); |
5510 | if (!airq_areas[i]) |
5511 | airq_areas[i] = new_airq_info(); |
5512 | info = airq_areas[i]; |
5513 | + mutex_unlock(&airq_areas_lock); |
5514 | if (!info) |
5515 | return 0; |
5516 | write_lock_irqsave(&info->lock, flags); |
5517 | diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c |
5518 | index 806ceabcabc3..bc37666f998e 100644 |
5519 | --- a/drivers/scsi/megaraid/megaraid_sas_base.c |
5520 | +++ b/drivers/scsi/megaraid/megaraid_sas_base.c |
5521 | @@ -5218,7 +5218,7 @@ static int megasas_init_fw(struct megasas_instance *instance) |
5522 | { |
5523 | u32 max_sectors_1; |
5524 | u32 max_sectors_2, tmp_sectors, msix_enable; |
5525 | - u32 scratch_pad_2, scratch_pad_3, scratch_pad_4; |
5526 | + u32 scratch_pad_2, scratch_pad_3, scratch_pad_4, status_reg; |
5527 | resource_size_t base_addr; |
5528 | struct megasas_register_set __iomem *reg_set; |
5529 | struct megasas_ctrl_info *ctrl_info = NULL; |
5530 | @@ -5226,6 +5226,7 @@ static int megasas_init_fw(struct megasas_instance *instance) |
5531 | int i, j, loop, fw_msix_count = 0; |
5532 | struct IOV_111 *iovPtr; |
5533 | struct fusion_context *fusion; |
5534 | + bool do_adp_reset = true; |
5535 | |
5536 | fusion = instance->ctrl_context; |
5537 | |
5538 | @@ -5274,19 +5275,29 @@ static int megasas_init_fw(struct megasas_instance *instance) |
5539 | } |
5540 | |
5541 | if (megasas_transition_to_ready(instance, 0)) { |
5542 | - atomic_set(&instance->fw_reset_no_pci_access, 1); |
5543 | - instance->instancet->adp_reset |
5544 | - (instance, instance->reg_set); |
5545 | - atomic_set(&instance->fw_reset_no_pci_access, 0); |
5546 | - dev_info(&instance->pdev->dev, |
5547 | - "FW restarted successfully from %s!\n", |
5548 | - __func__); |
5549 | + if (instance->adapter_type >= INVADER_SERIES) { |
5550 | + status_reg = instance->instancet->read_fw_status_reg( |
5551 | + instance->reg_set); |
5552 | + do_adp_reset = status_reg & MFI_RESET_ADAPTER; |
5553 | + } |
5554 | |
5555 | - /*waitting for about 30 second before retry*/ |
5556 | - ssleep(30); |
5557 | + if (do_adp_reset) { |
5558 | + atomic_set(&instance->fw_reset_no_pci_access, 1); |
5559 | + instance->instancet->adp_reset |
5560 | + (instance, instance->reg_set); |
5561 | + atomic_set(&instance->fw_reset_no_pci_access, 0); |
5562 | + dev_info(&instance->pdev->dev, |
5563 | + "FW restarted successfully from %s!\n", |
5564 | + __func__); |
5565 | |
5566 | - if (megasas_transition_to_ready(instance, 0)) |
5567 | + /*waiting for about 30 second before retry*/ |
5568 | + ssleep(30); |
5569 | + |
5570 | + if (megasas_transition_to_ready(instance, 0)) |
5571 | + goto fail_ready_state; |
5572 | + } else { |
5573 | goto fail_ready_state; |
5574 | + } |
5575 | } |
5576 | |
5577 | megasas_init_ctrl_params(instance); |
5578 | @@ -5325,12 +5336,29 @@ static int megasas_init_fw(struct megasas_instance *instance) |
5579 | instance->msix_vectors = (scratch_pad_2 |
5580 | & MR_MAX_REPLY_QUEUES_OFFSET) + 1; |
5581 | fw_msix_count = instance->msix_vectors; |
5582 | - } else { /* Invader series supports more than 8 MSI-x vectors*/ |
5583 | + } else { |
5584 | instance->msix_vectors = ((scratch_pad_2 |
5585 | & MR_MAX_REPLY_QUEUES_EXT_OFFSET) |
5586 | >> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1; |
5587 | - if (instance->msix_vectors > 16) |
5588 | - instance->msix_combined = true; |
5589 | + |
5590 | + /* |
5591 | + * For Invader series, > 8 MSI-x vectors |
5592 | + * supported by FW/HW implies combined |
5593 | + * reply queue mode is enabled. |
5594 | + * For Ventura series, > 16 MSI-x vectors |
5595 | + * supported by FW/HW implies combined |
5596 | + * reply queue mode is enabled. |
5597 | + */ |
5598 | + switch (instance->adapter_type) { |
5599 | + case INVADER_SERIES: |
5600 | + if (instance->msix_vectors > 8) |
5601 | + instance->msix_combined = true; |
5602 | + break; |
5603 | + case VENTURA_SERIES: |
5604 | + if (instance->msix_vectors > 16) |
5605 | + instance->msix_combined = true; |
5606 | + break; |
5607 | + } |
5608 | |
5609 | if (rdpq_enable) |
5610 | instance->is_rdpq = (scratch_pad_2 & MR_RDPQ_MODE_OFFSET) ? |
5611 | @@ -6028,13 +6056,13 @@ static int megasas_io_attach(struct megasas_instance *instance) |
5612 | * @instance: Adapter soft state |
5613 | * Description: |
5614 | * |
5615 | - * For Ventura, driver/FW will operate in 64bit DMA addresses. |
5616 | + * For Ventura, driver/FW will operate in 63bit DMA addresses. |
5617 | * |
5618 | * For invader- |
5619 | * By default, driver/FW will operate in 32bit DMA addresses |
5620 | * for consistent DMA mapping but if 32 bit consistent |
5621 | - * DMA mask fails, driver will try with 64 bit consistent |
5622 | - * mask provided FW is true 64bit DMA capable |
5623 | + * DMA mask fails, driver will try with 63 bit consistent |
5624 | + * mask provided FW is true 63bit DMA capable |
5625 | * |
5626 | * For older controllers(Thunderbolt and MFI based adapters)- |
5627 | * driver/FW will operate in 32 bit consistent DMA addresses. |
5628 | @@ -6047,15 +6075,15 @@ megasas_set_dma_mask(struct megasas_instance *instance) |
5629 | u32 scratch_pad_2; |
5630 | |
5631 | pdev = instance->pdev; |
5632 | - consistent_mask = (instance->adapter_type == VENTURA_SERIES) ? |
5633 | - DMA_BIT_MASK(64) : DMA_BIT_MASK(32); |
5634 | + consistent_mask = (instance->adapter_type >= VENTURA_SERIES) ? |
5635 | + DMA_BIT_MASK(63) : DMA_BIT_MASK(32); |
5636 | |
5637 | if (IS_DMA64) { |
5638 | - if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) && |
5639 | + if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(63)) && |
5640 | dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) |
5641 | goto fail_set_dma_mask; |
5642 | |
5643 | - if ((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) && |
5644 | + if ((*pdev->dev.dma_mask == DMA_BIT_MASK(63)) && |
5645 | (dma_set_coherent_mask(&pdev->dev, consistent_mask) && |
5646 | dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))) { |
5647 | /* |
5648 | @@ -6068,7 +6096,7 @@ megasas_set_dma_mask(struct megasas_instance *instance) |
5649 | if (!(scratch_pad_2 & MR_CAN_HANDLE_64_BIT_DMA_OFFSET)) |
5650 | goto fail_set_dma_mask; |
5651 | else if (dma_set_mask_and_coherent(&pdev->dev, |
5652 | - DMA_BIT_MASK(64))) |
5653 | + DMA_BIT_MASK(63))) |
5654 | goto fail_set_dma_mask; |
5655 | } |
5656 | } else if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) |
5657 | @@ -6080,8 +6108,8 @@ megasas_set_dma_mask(struct megasas_instance *instance) |
5658 | instance->consistent_mask_64bit = true; |
5659 | |
5660 | dev_info(&pdev->dev, "%s bit DMA mask and %s bit consistent mask\n", |
5661 | - ((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) ? "64" : "32"), |
5662 | - (instance->consistent_mask_64bit ? "64" : "32")); |
5663 | + ((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) ? "63" : "32"), |
5664 | + (instance->consistent_mask_64bit ? "63" : "32")); |
5665 | |
5666 | return 0; |
5667 | |
5668 | diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c |
5669 | index 1f1a05a90d3d..fc08e46a93ca 100644 |
5670 | --- a/drivers/scsi/qla2xxx/qla_gs.c |
5671 | +++ b/drivers/scsi/qla2xxx/qla_gs.c |
5672 | @@ -3360,15 +3360,15 @@ int qla24xx_async_gpsc(scsi_qla_host_t *vha, fc_port_t *fcport) |
5673 | sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout; |
5674 | sp->done = qla24xx_async_gpsc_sp_done; |
5675 | |
5676 | - rval = qla2x00_start_sp(sp); |
5677 | - if (rval != QLA_SUCCESS) |
5678 | - goto done_free_sp; |
5679 | - |
5680 | ql_dbg(ql_dbg_disc, vha, 0x205e, |
5681 | "Async-%s %8phC hdl=%x loopid=%x portid=%02x%02x%02x.\n", |
5682 | sp->name, fcport->port_name, sp->handle, |
5683 | fcport->loop_id, fcport->d_id.b.domain, |
5684 | fcport->d_id.b.area, fcport->d_id.b.al_pa); |
5685 | + |
5686 | + rval = qla2x00_start_sp(sp); |
5687 | + if (rval != QLA_SUCCESS) |
5688 | + goto done_free_sp; |
5689 | return rval; |
5690 | |
5691 | done_free_sp: |
5692 | @@ -3729,13 +3729,14 @@ int qla24xx_async_gpnid(scsi_qla_host_t *vha, port_id_t *id) |
5693 | sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout; |
5694 | sp->done = qla2x00_async_gpnid_sp_done; |
5695 | |
5696 | + ql_dbg(ql_dbg_disc, vha, 0x2067, |
5697 | + "Async-%s hdl=%x ID %3phC.\n", sp->name, |
5698 | + sp->handle, ct_req->req.port_id.port_id); |
5699 | + |
5700 | rval = qla2x00_start_sp(sp); |
5701 | if (rval != QLA_SUCCESS) |
5702 | goto done_free_sp; |
5703 | |
5704 | - ql_dbg(ql_dbg_disc, vha, 0x2067, |
5705 | - "Async-%s hdl=%x ID %3phC.\n", sp->name, |
5706 | - sp->handle, ct_req->req.port_id.port_id); |
5707 | return rval; |
5708 | |
5709 | done_free_sp: |
5710 | diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c |
5711 | index ddce32fe0513..39a8f4a671aa 100644 |
5712 | --- a/drivers/scsi/qla2xxx/qla_init.c |
5713 | +++ b/drivers/scsi/qla2xxx/qla_init.c |
5714 | @@ -247,6 +247,12 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport, |
5715 | |
5716 | } |
5717 | |
5718 | + ql_dbg(ql_dbg_disc, vha, 0x2072, |
5719 | + "Async-login - %8phC hdl=%x, loopid=%x portid=%02x%02x%02x " |
5720 | + "retries=%d.\n", fcport->port_name, sp->handle, fcport->loop_id, |
5721 | + fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa, |
5722 | + fcport->login_retry); |
5723 | + |
5724 | rval = qla2x00_start_sp(sp); |
5725 | if (rval != QLA_SUCCESS) { |
5726 | fcport->flags |= FCF_LOGIN_NEEDED; |
5727 | @@ -254,11 +260,6 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport, |
5728 | goto done_free_sp; |
5729 | } |
5730 | |
5731 | - ql_dbg(ql_dbg_disc, vha, 0x2072, |
5732 | - "Async-login - %8phC hdl=%x, loopid=%x portid=%02x%02x%02x " |
5733 | - "retries=%d.\n", fcport->port_name, sp->handle, fcport->loop_id, |
5734 | - fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa, |
5735 | - fcport->login_retry); |
5736 | return rval; |
5737 | |
5738 | done_free_sp: |
5739 | @@ -303,15 +304,16 @@ qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport) |
5740 | qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2); |
5741 | |
5742 | sp->done = qla2x00_async_logout_sp_done; |
5743 | - rval = qla2x00_start_sp(sp); |
5744 | - if (rval != QLA_SUCCESS) |
5745 | - goto done_free_sp; |
5746 | |
5747 | ql_dbg(ql_dbg_disc, vha, 0x2070, |
5748 | "Async-logout - hdl=%x loop-id=%x portid=%02x%02x%02x %8phC.\n", |
5749 | sp->handle, fcport->loop_id, fcport->d_id.b.domain, |
5750 | fcport->d_id.b.area, fcport->d_id.b.al_pa, |
5751 | fcport->port_name); |
5752 | + |
5753 | + rval = qla2x00_start_sp(sp); |
5754 | + if (rval != QLA_SUCCESS) |
5755 | + goto done_free_sp; |
5756 | return rval; |
5757 | |
5758 | done_free_sp: |
5759 | @@ -489,13 +491,15 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport, |
5760 | sp->done = qla2x00_async_adisc_sp_done; |
5761 | if (data[1] & QLA_LOGIO_LOGIN_RETRIED) |
5762 | lio->u.logio.flags |= SRB_LOGIN_RETRIED; |
5763 | - rval = qla2x00_start_sp(sp); |
5764 | - if (rval != QLA_SUCCESS) |
5765 | - goto done_free_sp; |
5766 | |
5767 | ql_dbg(ql_dbg_disc, vha, 0x206f, |
5768 | "Async-adisc - hdl=%x loopid=%x portid=%06x %8phC.\n", |
5769 | sp->handle, fcport->loop_id, fcport->d_id.b24, fcport->port_name); |
5770 | + |
5771 | + rval = qla2x00_start_sp(sp); |
5772 | + if (rval != QLA_SUCCESS) |
5773 | + goto done_free_sp; |
5774 | + |
5775 | return rval; |
5776 | |
5777 | done_free_sp: |
5778 | @@ -1161,14 +1165,13 @@ int qla24xx_async_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, u8 opt) |
5779 | |
5780 | sp->done = qla24xx_async_gpdb_sp_done; |
5781 | |
5782 | - rval = qla2x00_start_sp(sp); |
5783 | - if (rval != QLA_SUCCESS) |
5784 | - goto done_free_sp; |
5785 | - |
5786 | ql_dbg(ql_dbg_disc, vha, 0x20dc, |
5787 | "Async-%s %8phC hndl %x opt %x\n", |
5788 | sp->name, fcport->port_name, sp->handle, opt); |
5789 | |
5790 | + rval = qla2x00_start_sp(sp); |
5791 | + if (rval != QLA_SUCCESS) |
5792 | + goto done_free_sp; |
5793 | return rval; |
5794 | |
5795 | done_free_sp: |
5796 | @@ -1698,15 +1701,14 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun, |
5797 | tm_iocb->u.tmf.data = tag; |
5798 | sp->done = qla2x00_tmf_sp_done; |
5799 | |
5800 | - rval = qla2x00_start_sp(sp); |
5801 | - if (rval != QLA_SUCCESS) |
5802 | - goto done_free_sp; |
5803 | - |
5804 | ql_dbg(ql_dbg_taskm, vha, 0x802f, |
5805 | "Async-tmf hdl=%x loop-id=%x portid=%02x%02x%02x.\n", |
5806 | sp->handle, fcport->loop_id, fcport->d_id.b.domain, |
5807 | fcport->d_id.b.area, fcport->d_id.b.al_pa); |
5808 | |
5809 | + rval = qla2x00_start_sp(sp); |
5810 | + if (rval != QLA_SUCCESS) |
5811 | + goto done_free_sp; |
5812 | wait_for_completion(&tm_iocb->u.tmf.comp); |
5813 | |
5814 | rval = tm_iocb->u.tmf.data; |
5815 | @@ -1790,14 +1792,14 @@ qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait) |
5816 | |
5817 | sp->done = qla24xx_abort_sp_done; |
5818 | |
5819 | - rval = qla2x00_start_sp(sp); |
5820 | - if (rval != QLA_SUCCESS) |
5821 | - goto done_free_sp; |
5822 | - |
5823 | ql_dbg(ql_dbg_async, vha, 0x507c, |
5824 | "Abort command issued - hdl=%x, target_id=%x\n", |
5825 | cmd_sp->handle, fcport->tgt_id); |
5826 | |
5827 | + rval = qla2x00_start_sp(sp); |
5828 | + if (rval != QLA_SUCCESS) |
5829 | + goto done_free_sp; |
5830 | + |
5831 | if (wait) { |
5832 | wait_for_completion(&abt_iocb->u.abt.comp); |
5833 | rval = abt_iocb->u.abt.comp_status == CS_COMPLETE ? |
5834 | diff --git a/drivers/spi/spi-gpio.c b/drivers/spi/spi-gpio.c |
5835 | index 088772ebef9b..77838d8fd9bb 100644 |
5836 | --- a/drivers/spi/spi-gpio.c |
5837 | +++ b/drivers/spi/spi-gpio.c |
5838 | @@ -410,7 +410,7 @@ static int spi_gpio_probe(struct platform_device *pdev) |
5839 | return status; |
5840 | |
5841 | master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32); |
5842 | - master->mode_bits = SPI_3WIRE | SPI_CPHA | SPI_CPOL; |
5843 | + master->mode_bits = SPI_3WIRE | SPI_CPHA | SPI_CPOL | SPI_CS_HIGH; |
5844 | master->flags = master_flags; |
5845 | master->bus_num = pdev->id; |
5846 | /* The master needs to think there is a chipselect even if not connected */ |
5847 | @@ -437,7 +437,6 @@ static int spi_gpio_probe(struct platform_device *pdev) |
5848 | spi_gpio->bitbang.txrx_word[SPI_MODE_3] = spi_gpio_spec_txrx_word_mode3; |
5849 | } |
5850 | spi_gpio->bitbang.setup_transfer = spi_bitbang_setup_transfer; |
5851 | - spi_gpio->bitbang.flags = SPI_CS_HIGH; |
5852 | |
5853 | status = spi_bitbang_start(&spi_gpio->bitbang); |
5854 | if (status) |
5855 | diff --git a/drivers/staging/wilc1000/linux_wlan.c b/drivers/staging/wilc1000/linux_wlan.c |
5856 | index 649caae2b603..25798119426b 100644 |
5857 | --- a/drivers/staging/wilc1000/linux_wlan.c |
5858 | +++ b/drivers/staging/wilc1000/linux_wlan.c |
5859 | @@ -649,17 +649,17 @@ static int wilc_wlan_initialize(struct net_device *dev, struct wilc_vif *vif) |
5860 | goto fail_locks; |
5861 | } |
5862 | |
5863 | - if (wl->gpio_irq && init_irq(dev)) { |
5864 | - ret = -EIO; |
5865 | - goto fail_locks; |
5866 | - } |
5867 | - |
5868 | ret = wlan_initialize_threads(dev); |
5869 | if (ret < 0) { |
5870 | ret = -EIO; |
5871 | goto fail_wilc_wlan; |
5872 | } |
5873 | |
5874 | + if (wl->gpio_irq && init_irq(dev)) { |
5875 | + ret = -EIO; |
5876 | + goto fail_threads; |
5877 | + } |
5878 | + |
5879 | if (!wl->dev_irq_num && |
5880 | wl->hif_func->enable_interrupt && |
5881 | wl->hif_func->enable_interrupt(wl)) { |
5882 | @@ -715,7 +715,7 @@ fail_irq_enable: |
5883 | fail_irq_init: |
5884 | if (wl->dev_irq_num) |
5885 | deinit_irq(dev); |
5886 | - |
5887 | +fail_threads: |
5888 | wlan_deinitialize_threads(dev); |
5889 | fail_wilc_wlan: |
5890 | wilc_wlan_cleanup(dev); |
5891 | diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c |
5892 | index ce1321a5cb7b..854b2bcca7c1 100644 |
5893 | --- a/drivers/target/target_core_iblock.c |
5894 | +++ b/drivers/target/target_core_iblock.c |
5895 | @@ -514,8 +514,8 @@ iblock_execute_write_same(struct se_cmd *cmd) |
5896 | } |
5897 | |
5898 | /* Always in 512 byte units for Linux/Block */ |
5899 | - block_lba += sg->length >> IBLOCK_LBA_SHIFT; |
5900 | - sectors -= 1; |
5901 | + block_lba += sg->length >> SECTOR_SHIFT; |
5902 | + sectors -= sg->length >> SECTOR_SHIFT; |
5903 | } |
5904 | |
5905 | iblock_submit_bios(&list); |
5906 | @@ -757,7 +757,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, |
5907 | } |
5908 | |
5909 | /* Always in 512 byte units for Linux/Block */ |
5910 | - block_lba += sg->length >> IBLOCK_LBA_SHIFT; |
5911 | + block_lba += sg->length >> SECTOR_SHIFT; |
5912 | sg_num--; |
5913 | } |
5914 | |
5915 | diff --git a/drivers/target/target_core_iblock.h b/drivers/target/target_core_iblock.h |
5916 | index 9cc3843404d4..cefc641145b3 100644 |
5917 | --- a/drivers/target/target_core_iblock.h |
5918 | +++ b/drivers/target/target_core_iblock.h |
5919 | @@ -9,7 +9,6 @@ |
5920 | #define IBLOCK_VERSION "4.0" |
5921 | |
5922 | #define IBLOCK_MAX_CDBS 16 |
5923 | -#define IBLOCK_LBA_SHIFT 9 |
5924 | |
5925 | struct iblock_req { |
5926 | refcount_t pending; |
5927 | diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c |
5928 | index fb20aa974ae1..819ae3b2bd7e 100644 |
5929 | --- a/drivers/usb/typec/tcpm.c |
5930 | +++ b/drivers/usb/typec/tcpm.c |
5931 | @@ -37,6 +37,7 @@ |
5932 | S(SRC_ATTACHED), \ |
5933 | S(SRC_STARTUP), \ |
5934 | S(SRC_SEND_CAPABILITIES), \ |
5935 | + S(SRC_SEND_CAPABILITIES_TIMEOUT), \ |
5936 | S(SRC_NEGOTIATE_CAPABILITIES), \ |
5937 | S(SRC_TRANSITION_SUPPLY), \ |
5938 | S(SRC_READY), \ |
5939 | @@ -2987,10 +2988,34 @@ static void run_state_machine(struct tcpm_port *port) |
5940 | /* port->hard_reset_count = 0; */ |
5941 | port->caps_count = 0; |
5942 | port->pd_capable = true; |
5943 | - tcpm_set_state_cond(port, hard_reset_state(port), |
5944 | + tcpm_set_state_cond(port, SRC_SEND_CAPABILITIES_TIMEOUT, |
5945 | PD_T_SEND_SOURCE_CAP); |
5946 | } |
5947 | break; |
5948 | + case SRC_SEND_CAPABILITIES_TIMEOUT: |
5949 | + /* |
5950 | + * Error recovery for a PD_DATA_SOURCE_CAP reply timeout. |
5951 | + * |
5952 | + * PD 2.0 sinks are supposed to accept src-capabilities with a |
5953 | + * 3.0 header and simply ignore any src PDOs which the sink does |
5954 | + * not understand such as PPS but some 2.0 sinks instead ignore |
5955 | + * the entire PD_DATA_SOURCE_CAP message, causing contract |
5956 | + * negotiation to fail. |
5957 | + * |
5958 | + * After PD_N_HARD_RESET_COUNT hard-reset attempts, we try |
5959 | + * sending src-capabilities with a lower PD revision to |
5960 | + * make these broken sinks work. |
5961 | + */ |
5962 | + if (port->hard_reset_count < PD_N_HARD_RESET_COUNT) { |
5963 | + tcpm_set_state(port, HARD_RESET_SEND, 0); |
5964 | + } else if (port->negotiated_rev > PD_REV20) { |
5965 | + port->negotiated_rev--; |
5966 | + port->hard_reset_count = 0; |
5967 | + tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0); |
5968 | + } else { |
5969 | + tcpm_set_state(port, hard_reset_state(port), 0); |
5970 | + } |
5971 | + break; |
5972 | case SRC_NEGOTIATE_CAPABILITIES: |
5973 | ret = tcpm_pd_check_request(port); |
5974 | if (ret < 0) { |
5975 | diff --git a/drivers/vhost/test.c b/drivers/vhost/test.c |
5976 | index 40589850eb33..a9be2d8e98df 100644 |
5977 | --- a/drivers/vhost/test.c |
5978 | +++ b/drivers/vhost/test.c |
5979 | @@ -23,6 +23,12 @@ |
5980 | * Using this limit prevents one virtqueue from starving others. */ |
5981 | #define VHOST_TEST_WEIGHT 0x80000 |
5982 | |
5983 | +/* Max number of packets transferred before requeueing the job. |
5984 | + * Using this limit prevents one virtqueue from starving others with |
5985 | + * pkts. |
5986 | + */ |
5987 | +#define VHOST_TEST_PKT_WEIGHT 256 |
5988 | + |
5989 | enum { |
5990 | VHOST_TEST_VQ = 0, |
5991 | VHOST_TEST_VQ_MAX = 1, |
5992 | @@ -81,10 +87,8 @@ static void handle_vq(struct vhost_test *n) |
5993 | } |
5994 | vhost_add_used_and_signal(&n->dev, vq, head, 0); |
5995 | total_len += len; |
5996 | - if (unlikely(total_len >= VHOST_TEST_WEIGHT)) { |
5997 | - vhost_poll_queue(&vq->poll); |
5998 | + if (unlikely(vhost_exceeds_weight(vq, 0, total_len))) |
5999 | break; |
6000 | - } |
6001 | } |
6002 | |
6003 | mutex_unlock(&vq->mutex); |
6004 | @@ -116,7 +120,8 @@ static int vhost_test_open(struct inode *inode, struct file *f) |
6005 | dev = &n->dev; |
6006 | vqs[VHOST_TEST_VQ] = &n->vqs[VHOST_TEST_VQ]; |
6007 | n->vqs[VHOST_TEST_VQ].handle_kick = handle_vq_kick; |
6008 | - vhost_dev_init(dev, vqs, VHOST_TEST_VQ_MAX); |
6009 | + vhost_dev_init(dev, vqs, VHOST_TEST_VQ_MAX, UIO_MAXIOV, |
6010 | + VHOST_TEST_PKT_WEIGHT, VHOST_TEST_WEIGHT); |
6011 | |
6012 | f->private_data = n; |
6013 | |
6014 | diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c |
6015 | index 0752f8dc47b1..98b6eb902df9 100644 |
6016 | --- a/drivers/vhost/vhost.c |
6017 | +++ b/drivers/vhost/vhost.c |
6018 | @@ -2073,7 +2073,7 @@ static int get_indirect(struct vhost_virtqueue *vq, |
6019 | /* If this is an input descriptor, increment that count. */ |
6020 | if (access == VHOST_ACCESS_WO) { |
6021 | *in_num += ret; |
6022 | - if (unlikely(log)) { |
6023 | + if (unlikely(log && ret)) { |
6024 | log[*log_num].addr = vhost64_to_cpu(vq, desc.addr); |
6025 | log[*log_num].len = vhost32_to_cpu(vq, desc.len); |
6026 | ++*log_num; |
6027 | @@ -2216,7 +2216,7 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq, |
6028 | /* If this is an input descriptor, |
6029 | * increment that count. */ |
6030 | *in_num += ret; |
6031 | - if (unlikely(log)) { |
6032 | + if (unlikely(log && ret)) { |
6033 | log[*log_num].addr = vhost64_to_cpu(vq, desc.addr); |
6034 | log[*log_num].len = vhost32_to_cpu(vq, desc.len); |
6035 | ++*log_num; |
6036 | diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c |
6037 | index 9bfa66592aa7..c71e534ca7ef 100644 |
6038 | --- a/fs/btrfs/compression.c |
6039 | +++ b/fs/btrfs/compression.c |
6040 | @@ -42,6 +42,22 @@ const char* btrfs_compress_type2str(enum btrfs_compression_type type) |
6041 | return NULL; |
6042 | } |
6043 | |
6044 | +bool btrfs_compress_is_valid_type(const char *str, size_t len) |
6045 | +{ |
6046 | + int i; |
6047 | + |
6048 | + for (i = 1; i < ARRAY_SIZE(btrfs_compress_types); i++) { |
6049 | + size_t comp_len = strlen(btrfs_compress_types[i]); |
6050 | + |
6051 | + if (len < comp_len) |
6052 | + continue; |
6053 | + |
6054 | + if (!strncmp(btrfs_compress_types[i], str, comp_len)) |
6055 | + return true; |
6056 | + } |
6057 | + return false; |
6058 | +} |
6059 | + |
6060 | static int btrfs_decompress_bio(struct compressed_bio *cb); |
6061 | |
6062 | static inline int compressed_bio_size(struct btrfs_fs_info *fs_info, |
6063 | diff --git a/fs/btrfs/compression.h b/fs/btrfs/compression.h |
6064 | index ddda9b80bf20..f97d90a1fa53 100644 |
6065 | --- a/fs/btrfs/compression.h |
6066 | +++ b/fs/btrfs/compression.h |
6067 | @@ -127,6 +127,7 @@ extern const struct btrfs_compress_op btrfs_lzo_compress; |
6068 | extern const struct btrfs_compress_op btrfs_zstd_compress; |
6069 | |
6070 | const char* btrfs_compress_type2str(enum btrfs_compression_type type); |
6071 | +bool btrfs_compress_is_valid_type(const char *str, size_t len); |
6072 | |
6073 | int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end); |
6074 | |
6075 | diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h |
6076 | index 82682da5a40d..4644f9b629a5 100644 |
6077 | --- a/fs/btrfs/ctree.h |
6078 | +++ b/fs/btrfs/ctree.h |
6079 | @@ -3200,6 +3200,9 @@ int btrfs_prealloc_file_range_trans(struct inode *inode, |
6080 | struct btrfs_trans_handle *trans, int mode, |
6081 | u64 start, u64 num_bytes, u64 min_size, |
6082 | loff_t actual_len, u64 *alloc_hint); |
6083 | +int btrfs_run_delalloc_range(void *private_data, struct page *locked_page, |
6084 | + u64 start, u64 end, int *page_started, unsigned long *nr_written, |
6085 | + struct writeback_control *wbc); |
6086 | extern const struct dentry_operations btrfs_dentry_operations; |
6087 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS |
6088 | void btrfs_test_inode_set_ops(struct inode *inode); |
6089 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c |
6090 | index 0cc800d22a08..88c939f7aad9 100644 |
6091 | --- a/fs/btrfs/extent-tree.c |
6092 | +++ b/fs/btrfs/extent-tree.c |
6093 | @@ -10478,22 +10478,6 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, |
6094 | } |
6095 | spin_unlock(&block_group->lock); |
6096 | |
6097 | - if (remove_em) { |
6098 | - struct extent_map_tree *em_tree; |
6099 | - |
6100 | - em_tree = &fs_info->mapping_tree.map_tree; |
6101 | - write_lock(&em_tree->lock); |
6102 | - /* |
6103 | - * The em might be in the pending_chunks list, so make sure the |
6104 | - * chunk mutex is locked, since remove_extent_mapping() will |
6105 | - * delete us from that list. |
6106 | - */ |
6107 | - remove_extent_mapping(em_tree, em); |
6108 | - write_unlock(&em_tree->lock); |
6109 | - /* once for the tree */ |
6110 | - free_extent_map(em); |
6111 | - } |
6112 | - |
6113 | mutex_unlock(&fs_info->chunk_mutex); |
6114 | |
6115 | ret = remove_block_group_free_space(trans, block_group); |
6116 | @@ -10510,6 +10494,24 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, |
6117 | goto out; |
6118 | |
6119 | ret = btrfs_del_item(trans, root, path); |
6120 | + if (ret) |
6121 | + goto out; |
6122 | + |
6123 | + if (remove_em) { |
6124 | + struct extent_map_tree *em_tree; |
6125 | + |
6126 | + em_tree = &fs_info->mapping_tree.map_tree; |
6127 | + write_lock(&em_tree->lock); |
6128 | + /* |
6129 | + * The em might be in the pending_chunks list, so make sure the |
6130 | + * chunk mutex is locked, since remove_extent_mapping() will |
6131 | + * delete us from that list. |
6132 | + */ |
6133 | + remove_extent_mapping(em_tree, em); |
6134 | + write_unlock(&em_tree->lock); |
6135 | + /* once for the tree */ |
6136 | + free_extent_map(em); |
6137 | + } |
6138 | out: |
6139 | btrfs_free_path(path); |
6140 | return ret; |
6141 | diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c |
6142 | index 90b0a6eff535..cb598eb4f3bd 100644 |
6143 | --- a/fs/btrfs/extent_io.c |
6144 | +++ b/fs/btrfs/extent_io.c |
6145 | @@ -3199,7 +3199,7 @@ static void update_nr_written(struct writeback_control *wbc, |
6146 | /* |
6147 | * helper for __extent_writepage, doing all of the delayed allocation setup. |
6148 | * |
6149 | - * This returns 1 if our fill_delalloc function did all the work required |
6150 | + * This returns 1 if btrfs_run_delalloc_range function did all the work required |
6151 | * to write the page (copy into inline extent). In this case the IO has |
6152 | * been started and the page is already unlocked. |
6153 | * |
6154 | @@ -3220,7 +3220,7 @@ static noinline_for_stack int writepage_delalloc(struct inode *inode, |
6155 | int ret; |
6156 | int page_started = 0; |
6157 | |
6158 | - if (epd->extent_locked || !tree->ops || !tree->ops->fill_delalloc) |
6159 | + if (epd->extent_locked) |
6160 | return 0; |
6161 | |
6162 | while (delalloc_end < page_end) { |
6163 | @@ -3233,18 +3233,16 @@ static noinline_for_stack int writepage_delalloc(struct inode *inode, |
6164 | delalloc_start = delalloc_end + 1; |
6165 | continue; |
6166 | } |
6167 | - ret = tree->ops->fill_delalloc(inode, page, |
6168 | - delalloc_start, |
6169 | - delalloc_end, |
6170 | - &page_started, |
6171 | - nr_written, wbc); |
6172 | + ret = btrfs_run_delalloc_range(inode, page, delalloc_start, |
6173 | + delalloc_end, &page_started, nr_written, wbc); |
6174 | /* File system has been set read-only */ |
6175 | if (ret) { |
6176 | SetPageError(page); |
6177 | - /* fill_delalloc should be return < 0 for error |
6178 | - * but just in case, we use > 0 here meaning the |
6179 | - * IO is started, so we don't want to return > 0 |
6180 | - * unless things are going well. |
6181 | + /* |
6182 | + * btrfs_run_delalloc_range should return < 0 for error |
6183 | + * but just in case, we use > 0 here meaning the IO is |
6184 | + * started, so we don't want to return > 0 unless |
6185 | + * things are going well. |
6186 | */ |
6187 | ret = ret < 0 ? ret : -EIO; |
6188 | goto done; |
6189 | diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h |
6190 | index b4d03e677e1d..ed27becd963c 100644 |
6191 | --- a/fs/btrfs/extent_io.h |
6192 | +++ b/fs/btrfs/extent_io.h |
6193 | @@ -106,11 +106,6 @@ struct extent_io_ops { |
6194 | /* |
6195 | * Optional hooks, called if the pointer is not NULL |
6196 | */ |
6197 | - int (*fill_delalloc)(void *private_data, struct page *locked_page, |
6198 | - u64 start, u64 end, int *page_started, |
6199 | - unsigned long *nr_written, |
6200 | - struct writeback_control *wbc); |
6201 | - |
6202 | int (*writepage_start_hook)(struct page *page, u64 start, u64 end); |
6203 | void (*writepage_end_io_hook)(struct page *page, u64 start, u64 end, |
6204 | struct extent_state *state, int uptodate); |
6205 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c |
6206 | index 355ff08e9d44..98c535ae038d 100644 |
6207 | --- a/fs/btrfs/inode.c |
6208 | +++ b/fs/btrfs/inode.c |
6209 | @@ -110,17 +110,17 @@ static void __endio_write_update_ordered(struct inode *inode, |
6210 | * extent_clear_unlock_delalloc() to clear both the bits EXTENT_DO_ACCOUNTING |
6211 | * and EXTENT_DELALLOC simultaneously, because that causes the reserved metadata |
6212 | * to be released, which we want to happen only when finishing the ordered |
6213 | - * extent (btrfs_finish_ordered_io()). Also note that the caller of the |
6214 | - * fill_delalloc() callback already does proper cleanup for the first page of |
6215 | - * the range, that is, it invokes the callback writepage_end_io_hook() for the |
6216 | - * range of the first page. |
6217 | + * extent (btrfs_finish_ordered_io()). |
6218 | */ |
6219 | static inline void btrfs_cleanup_ordered_extents(struct inode *inode, |
6220 | - const u64 offset, |
6221 | - const u64 bytes) |
6222 | + struct page *locked_page, |
6223 | + u64 offset, u64 bytes) |
6224 | { |
6225 | unsigned long index = offset >> PAGE_SHIFT; |
6226 | unsigned long end_index = (offset + bytes - 1) >> PAGE_SHIFT; |
6227 | + u64 page_start = page_offset(locked_page); |
6228 | + u64 page_end = page_start + PAGE_SIZE - 1; |
6229 | + |
6230 | struct page *page; |
6231 | |
6232 | while (index <= end_index) { |
6233 | @@ -131,8 +131,18 @@ static inline void btrfs_cleanup_ordered_extents(struct inode *inode, |
6234 | ClearPagePrivate2(page); |
6235 | put_page(page); |
6236 | } |
6237 | - return __endio_write_update_ordered(inode, offset + PAGE_SIZE, |
6238 | - bytes - PAGE_SIZE, false); |
6239 | + |
6240 | + /* |
6241 | + * In case this page belongs to the delalloc range being instantiated |
6242 | + * then skip it, since the first page of a range is going to be |
6243 | + * properly cleaned up by the caller of run_delalloc_range |
6244 | + */ |
6245 | + if (page_start >= offset && page_end <= (offset + bytes - 1)) { |
6246 | + offset += PAGE_SIZE; |
6247 | + bytes -= PAGE_SIZE; |
6248 | + } |
6249 | + |
6250 | + return __endio_write_update_ordered(inode, offset, bytes, false); |
6251 | } |
6252 | |
6253 | static int btrfs_dirty_inode(struct inode *inode); |
6254 | @@ -1599,12 +1609,12 @@ static inline int need_force_cow(struct inode *inode, u64 start, u64 end) |
6255 | } |
6256 | |
6257 | /* |
6258 | - * extent_io.c call back to do delayed allocation processing |
6259 | + * Function to process delayed allocation (create CoW) for ranges which are |
6260 | + * being touched for the first time. |
6261 | */ |
6262 | -static int run_delalloc_range(void *private_data, struct page *locked_page, |
6263 | - u64 start, u64 end, int *page_started, |
6264 | - unsigned long *nr_written, |
6265 | - struct writeback_control *wbc) |
6266 | +int btrfs_run_delalloc_range(void *private_data, struct page *locked_page, |
6267 | + u64 start, u64 end, int *page_started, unsigned long *nr_written, |
6268 | + struct writeback_control *wbc) |
6269 | { |
6270 | struct inode *inode = private_data; |
6271 | int ret; |
6272 | @@ -1629,7 +1639,8 @@ static int run_delalloc_range(void *private_data, struct page *locked_page, |
6273 | write_flags); |
6274 | } |
6275 | if (ret) |
6276 | - btrfs_cleanup_ordered_extents(inode, start, end - start + 1); |
6277 | + btrfs_cleanup_ordered_extents(inode, locked_page, start, |
6278 | + end - start + 1); |
6279 | return ret; |
6280 | } |
6281 | |
6282 | @@ -10598,7 +10609,6 @@ static const struct extent_io_ops btrfs_extent_io_ops = { |
6283 | .readpage_io_failed_hook = btrfs_readpage_io_failed_hook, |
6284 | |
6285 | /* optional callbacks */ |
6286 | - .fill_delalloc = run_delalloc_range, |
6287 | .writepage_end_io_hook = btrfs_writepage_end_io_hook, |
6288 | .writepage_start_hook = btrfs_writepage_start_hook, |
6289 | .set_bit_hook = btrfs_set_bit_hook, |
6290 | diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c |
6291 | index 61d22a56c0ba..6980a0e13f18 100644 |
6292 | --- a/fs/btrfs/props.c |
6293 | +++ b/fs/btrfs/props.c |
6294 | @@ -366,11 +366,7 @@ int btrfs_subvol_inherit_props(struct btrfs_trans_handle *trans, |
6295 | |
6296 | static int prop_compression_validate(const char *value, size_t len) |
6297 | { |
6298 | - if (!strncmp("lzo", value, 3)) |
6299 | - return 0; |
6300 | - else if (!strncmp("zlib", value, 4)) |
6301 | - return 0; |
6302 | - else if (!strncmp("zstd", value, 4)) |
6303 | + if (btrfs_compress_is_valid_type(value, len)) |
6304 | return 0; |
6305 | |
6306 | return -EINVAL; |
6307 | diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c |
6308 | index 3be1456b5116..916c39770467 100644 |
6309 | --- a/fs/btrfs/scrub.c |
6310 | +++ b/fs/btrfs/scrub.c |
6311 | @@ -322,6 +322,7 @@ static struct full_stripe_lock *insert_full_stripe_lock( |
6312 | struct rb_node *parent = NULL; |
6313 | struct full_stripe_lock *entry; |
6314 | struct full_stripe_lock *ret; |
6315 | + unsigned int nofs_flag; |
6316 | |
6317 | lockdep_assert_held(&locks_root->lock); |
6318 | |
6319 | @@ -339,8 +340,17 @@ static struct full_stripe_lock *insert_full_stripe_lock( |
6320 | } |
6321 | } |
6322 | |
6323 | - /* Insert new lock */ |
6324 | + /* |
6325 | + * Insert new lock. |
6326 | + * |
6327 | + * We must use GFP_NOFS because the scrub task might be waiting for a |
6328 | + * worker task executing this function and in turn a transaction commit |
6329 | + * might be waiting the scrub task to pause (which needs to wait for all |
6330 | + * the worker tasks to complete before pausing). |
6331 | + */ |
6332 | + nofs_flag = memalloc_nofs_save(); |
6333 | ret = kmalloc(sizeof(*ret), GFP_KERNEL); |
6334 | + memalloc_nofs_restore(nofs_flag); |
6335 | if (!ret) |
6336 | return ERR_PTR(-ENOMEM); |
6337 | ret->logical = fstripe_logical; |
6338 | @@ -568,12 +578,11 @@ static void scrub_put_ctx(struct scrub_ctx *sctx) |
6339 | scrub_free_ctx(sctx); |
6340 | } |
6341 | |
6342 | -static noinline_for_stack |
6343 | -struct scrub_ctx *scrub_setup_ctx(struct btrfs_device *dev, int is_dev_replace) |
6344 | +static noinline_for_stack struct scrub_ctx *scrub_setup_ctx( |
6345 | + struct btrfs_fs_info *fs_info, int is_dev_replace) |
6346 | { |
6347 | struct scrub_ctx *sctx; |
6348 | int i; |
6349 | - struct btrfs_fs_info *fs_info = dev->fs_info; |
6350 | |
6351 | sctx = kzalloc(sizeof(*sctx), GFP_KERNEL); |
6352 | if (!sctx) |
6353 | @@ -582,7 +591,8 @@ struct scrub_ctx *scrub_setup_ctx(struct btrfs_device *dev, int is_dev_replace) |
6354 | sctx->is_dev_replace = is_dev_replace; |
6355 | sctx->pages_per_rd_bio = SCRUB_PAGES_PER_RD_BIO; |
6356 | sctx->curr = -1; |
6357 | - sctx->fs_info = dev->fs_info; |
6358 | + sctx->fs_info = fs_info; |
6359 | + INIT_LIST_HEAD(&sctx->csum_list); |
6360 | for (i = 0; i < SCRUB_BIOS_PER_SCTX; ++i) { |
6361 | struct scrub_bio *sbio; |
6362 | |
6363 | @@ -607,7 +617,6 @@ struct scrub_ctx *scrub_setup_ctx(struct btrfs_device *dev, int is_dev_replace) |
6364 | atomic_set(&sctx->workers_pending, 0); |
6365 | atomic_set(&sctx->cancel_req, 0); |
6366 | sctx->csum_size = btrfs_super_csum_size(fs_info->super_copy); |
6367 | - INIT_LIST_HEAD(&sctx->csum_list); |
6368 | |
6369 | spin_lock_init(&sctx->list_lock); |
6370 | spin_lock_init(&sctx->stat_lock); |
6371 | @@ -1622,8 +1631,19 @@ static int scrub_add_page_to_wr_bio(struct scrub_ctx *sctx, |
6372 | mutex_lock(&sctx->wr_lock); |
6373 | again: |
6374 | if (!sctx->wr_curr_bio) { |
6375 | + unsigned int nofs_flag; |
6376 | + |
6377 | + /* |
6378 | + * We must use GFP_NOFS because the scrub task might be waiting |
6379 | + * for a worker task executing this function and in turn a |
6380 | + * transaction commit might be waiting the scrub task to pause |
6381 | + * (which needs to wait for all the worker tasks to complete |
6382 | + * before pausing). |
6383 | + */ |
6384 | + nofs_flag = memalloc_nofs_save(); |
6385 | sctx->wr_curr_bio = kzalloc(sizeof(*sctx->wr_curr_bio), |
6386 | GFP_KERNEL); |
6387 | + memalloc_nofs_restore(nofs_flag); |
6388 | if (!sctx->wr_curr_bio) { |
6389 | mutex_unlock(&sctx->wr_lock); |
6390 | return -ENOMEM; |
6391 | @@ -3022,8 +3042,7 @@ out: |
6392 | static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx, |
6393 | struct map_lookup *map, |
6394 | struct btrfs_device *scrub_dev, |
6395 | - int num, u64 base, u64 length, |
6396 | - int is_dev_replace) |
6397 | + int num, u64 base, u64 length) |
6398 | { |
6399 | struct btrfs_path *path, *ppath; |
6400 | struct btrfs_fs_info *fs_info = sctx->fs_info; |
6401 | @@ -3299,7 +3318,7 @@ again: |
6402 | extent_physical = extent_logical - logical + physical; |
6403 | extent_dev = scrub_dev; |
6404 | extent_mirror_num = mirror_num; |
6405 | - if (is_dev_replace) |
6406 | + if (sctx->is_dev_replace) |
6407 | scrub_remap_extent(fs_info, extent_logical, |
6408 | extent_len, &extent_physical, |
6409 | &extent_dev, |
6410 | @@ -3397,8 +3416,7 @@ static noinline_for_stack int scrub_chunk(struct scrub_ctx *sctx, |
6411 | struct btrfs_device *scrub_dev, |
6412 | u64 chunk_offset, u64 length, |
6413 | u64 dev_offset, |
6414 | - struct btrfs_block_group_cache *cache, |
6415 | - int is_dev_replace) |
6416 | + struct btrfs_block_group_cache *cache) |
6417 | { |
6418 | struct btrfs_fs_info *fs_info = sctx->fs_info; |
6419 | struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree; |
6420 | @@ -3435,8 +3453,7 @@ static noinline_for_stack int scrub_chunk(struct scrub_ctx *sctx, |
6421 | if (map->stripes[i].dev->bdev == scrub_dev->bdev && |
6422 | map->stripes[i].physical == dev_offset) { |
6423 | ret = scrub_stripe(sctx, map, scrub_dev, i, |
6424 | - chunk_offset, length, |
6425 | - is_dev_replace); |
6426 | + chunk_offset, length); |
6427 | if (ret) |
6428 | goto out; |
6429 | } |
6430 | @@ -3449,8 +3466,7 @@ out: |
6431 | |
6432 | static noinline_for_stack |
6433 | int scrub_enumerate_chunks(struct scrub_ctx *sctx, |
6434 | - struct btrfs_device *scrub_dev, u64 start, u64 end, |
6435 | - int is_dev_replace) |
6436 | + struct btrfs_device *scrub_dev, u64 start, u64 end) |
6437 | { |
6438 | struct btrfs_dev_extent *dev_extent = NULL; |
6439 | struct btrfs_path *path; |
6440 | @@ -3544,7 +3560,7 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx, |
6441 | */ |
6442 | scrub_pause_on(fs_info); |
6443 | ret = btrfs_inc_block_group_ro(cache); |
6444 | - if (!ret && is_dev_replace) { |
6445 | + if (!ret && sctx->is_dev_replace) { |
6446 | /* |
6447 | * If we are doing a device replace wait for any tasks |
6448 | * that started dellaloc right before we set the block |
6449 | @@ -3609,7 +3625,7 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx, |
6450 | dev_replace->item_needs_writeback = 1; |
6451 | btrfs_dev_replace_write_unlock(&fs_info->dev_replace); |
6452 | ret = scrub_chunk(sctx, scrub_dev, chunk_offset, length, |
6453 | - found_key.offset, cache, is_dev_replace); |
6454 | + found_key.offset, cache); |
6455 | |
6456 | /* |
6457 | * flush, submit all pending read and write bios, afterwards |
6458 | @@ -3670,7 +3686,7 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx, |
6459 | btrfs_put_block_group(cache); |
6460 | if (ret) |
6461 | break; |
6462 | - if (is_dev_replace && |
6463 | + if (sctx->is_dev_replace && |
6464 | atomic64_read(&dev_replace->num_write_errors) > 0) { |
6465 | ret = -EIO; |
6466 | break; |
6467 | @@ -3762,16 +3778,6 @@ fail_scrub_workers: |
6468 | return -ENOMEM; |
6469 | } |
6470 | |
6471 | -static noinline_for_stack void scrub_workers_put(struct btrfs_fs_info *fs_info) |
6472 | -{ |
6473 | - if (--fs_info->scrub_workers_refcnt == 0) { |
6474 | - btrfs_destroy_workqueue(fs_info->scrub_workers); |
6475 | - btrfs_destroy_workqueue(fs_info->scrub_wr_completion_workers); |
6476 | - btrfs_destroy_workqueue(fs_info->scrub_parity_workers); |
6477 | - } |
6478 | - WARN_ON(fs_info->scrub_workers_refcnt < 0); |
6479 | -} |
6480 | - |
6481 | int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, |
6482 | u64 end, struct btrfs_scrub_progress *progress, |
6483 | int readonly, int is_dev_replace) |
6484 | @@ -3779,6 +3785,10 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, |
6485 | struct scrub_ctx *sctx; |
6486 | int ret; |
6487 | struct btrfs_device *dev; |
6488 | + unsigned int nofs_flag; |
6489 | + struct btrfs_workqueue *scrub_workers = NULL; |
6490 | + struct btrfs_workqueue *scrub_wr_comp = NULL; |
6491 | + struct btrfs_workqueue *scrub_parity = NULL; |
6492 | |
6493 | if (btrfs_fs_closing(fs_info)) |
6494 | return -EINVAL; |
6495 | @@ -3820,13 +3830,18 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, |
6496 | return -EINVAL; |
6497 | } |
6498 | |
6499 | + /* Allocate outside of device_list_mutex */ |
6500 | + sctx = scrub_setup_ctx(fs_info, is_dev_replace); |
6501 | + if (IS_ERR(sctx)) |
6502 | + return PTR_ERR(sctx); |
6503 | |
6504 | mutex_lock(&fs_info->fs_devices->device_list_mutex); |
6505 | dev = btrfs_find_device(fs_info, devid, NULL, NULL); |
6506 | if (!dev || (test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state) && |
6507 | !is_dev_replace)) { |
6508 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); |
6509 | - return -ENODEV; |
6510 | + ret = -ENODEV; |
6511 | + goto out_free_ctx; |
6512 | } |
6513 | |
6514 | if (!is_dev_replace && !readonly && |
6515 | @@ -3834,7 +3849,8 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, |
6516 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); |
6517 | btrfs_err_in_rcu(fs_info, "scrub: device %s is not writable", |
6518 | rcu_str_deref(dev->name)); |
6519 | - return -EROFS; |
6520 | + ret = -EROFS; |
6521 | + goto out_free_ctx; |
6522 | } |
6523 | |
6524 | mutex_lock(&fs_info->scrub_lock); |
6525 | @@ -3842,7 +3858,8 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, |
6526 | test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &dev->dev_state)) { |
6527 | mutex_unlock(&fs_info->scrub_lock); |
6528 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); |
6529 | - return -EIO; |
6530 | + ret = -EIO; |
6531 | + goto out_free_ctx; |
6532 | } |
6533 | |
6534 | btrfs_dev_replace_read_lock(&fs_info->dev_replace); |
6535 | @@ -3852,7 +3869,8 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, |
6536 | btrfs_dev_replace_read_unlock(&fs_info->dev_replace); |
6537 | mutex_unlock(&fs_info->scrub_lock); |
6538 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); |
6539 | - return -EINPROGRESS; |
6540 | + ret = -EINPROGRESS; |
6541 | + goto out_free_ctx; |
6542 | } |
6543 | btrfs_dev_replace_read_unlock(&fs_info->dev_replace); |
6544 | |
6545 | @@ -3860,16 +3878,9 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, |
6546 | if (ret) { |
6547 | mutex_unlock(&fs_info->scrub_lock); |
6548 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); |
6549 | - return ret; |
6550 | + goto out_free_ctx; |
6551 | } |
6552 | |
6553 | - sctx = scrub_setup_ctx(dev, is_dev_replace); |
6554 | - if (IS_ERR(sctx)) { |
6555 | - mutex_unlock(&fs_info->scrub_lock); |
6556 | - mutex_unlock(&fs_info->fs_devices->device_list_mutex); |
6557 | - scrub_workers_put(fs_info); |
6558 | - return PTR_ERR(sctx); |
6559 | - } |
6560 | sctx->readonly = readonly; |
6561 | dev->scrub_ctx = sctx; |
6562 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); |
6563 | @@ -3882,6 +3893,16 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, |
6564 | atomic_inc(&fs_info->scrubs_running); |
6565 | mutex_unlock(&fs_info->scrub_lock); |
6566 | |
6567 | + /* |
6568 | + * In order to avoid deadlock with reclaim when there is a transaction |
6569 | + * trying to pause scrub, make sure we use GFP_NOFS for all the |
6570 | + * allocations done at btrfs_scrub_pages() and scrub_pages_for_parity() |
6571 | + * invoked by our callees. The pausing request is done when the |
6572 | + * transaction commit starts, and it blocks the transaction until scrub |
6573 | + * is paused (done at specific points at scrub_stripe() or right above |
6574 | + * before incrementing fs_info->scrubs_running). |
6575 | + */ |
6576 | + nofs_flag = memalloc_nofs_save(); |
6577 | if (!is_dev_replace) { |
6578 | /* |
6579 | * by holding device list mutex, we can |
6580 | @@ -3893,8 +3914,8 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, |
6581 | } |
6582 | |
6583 | if (!ret) |
6584 | - ret = scrub_enumerate_chunks(sctx, dev, start, end, |
6585 | - is_dev_replace); |
6586 | + ret = scrub_enumerate_chunks(sctx, dev, start, end); |
6587 | + memalloc_nofs_restore(nofs_flag); |
6588 | |
6589 | wait_event(sctx->list_wait, atomic_read(&sctx->bios_in_flight) == 0); |
6590 | atomic_dec(&fs_info->scrubs_running); |
6591 | @@ -3907,11 +3928,23 @@ int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start, |
6592 | |
6593 | mutex_lock(&fs_info->scrub_lock); |
6594 | dev->scrub_ctx = NULL; |
6595 | - scrub_workers_put(fs_info); |
6596 | + if (--fs_info->scrub_workers_refcnt == 0) { |
6597 | + scrub_workers = fs_info->scrub_workers; |
6598 | + scrub_wr_comp = fs_info->scrub_wr_completion_workers; |
6599 | + scrub_parity = fs_info->scrub_parity_workers; |
6600 | + } |
6601 | mutex_unlock(&fs_info->scrub_lock); |
6602 | |
6603 | + btrfs_destroy_workqueue(scrub_workers); |
6604 | + btrfs_destroy_workqueue(scrub_wr_comp); |
6605 | + btrfs_destroy_workqueue(scrub_parity); |
6606 | scrub_put_ctx(sctx); |
6607 | |
6608 | + return ret; |
6609 | + |
6610 | +out_free_ctx: |
6611 | + scrub_free_ctx(sctx); |
6612 | + |
6613 | return ret; |
6614 | } |
6615 | |
6616 | diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c |
6617 | index 6e008bd5c8cd..a8297e7489d9 100644 |
6618 | --- a/fs/btrfs/volumes.c |
6619 | +++ b/fs/btrfs/volumes.c |
6620 | @@ -7411,6 +7411,7 @@ static int verify_one_dev_extent(struct btrfs_fs_info *fs_info, |
6621 | struct extent_map_tree *em_tree = &fs_info->mapping_tree.map_tree; |
6622 | struct extent_map *em; |
6623 | struct map_lookup *map; |
6624 | + struct btrfs_device *dev; |
6625 | u64 stripe_len; |
6626 | bool found = false; |
6627 | int ret = 0; |
6628 | @@ -7460,6 +7461,34 @@ static int verify_one_dev_extent(struct btrfs_fs_info *fs_info, |
6629 | physical_offset, devid); |
6630 | ret = -EUCLEAN; |
6631 | } |
6632 | + |
6633 | + /* Make sure no dev extent is beyond device bondary */ |
6634 | + dev = btrfs_find_device(fs_info, devid, NULL, NULL); |
6635 | + if (!dev) { |
6636 | + btrfs_err(fs_info, "failed to find devid %llu", devid); |
6637 | + ret = -EUCLEAN; |
6638 | + goto out; |
6639 | + } |
6640 | + |
6641 | + /* It's possible this device is a dummy for seed device */ |
6642 | + if (dev->disk_total_bytes == 0) { |
6643 | + dev = find_device(fs_info->fs_devices->seed, devid, NULL); |
6644 | + if (!dev) { |
6645 | + btrfs_err(fs_info, "failed to find seed devid %llu", |
6646 | + devid); |
6647 | + ret = -EUCLEAN; |
6648 | + goto out; |
6649 | + } |
6650 | + } |
6651 | + |
6652 | + if (physical_offset + physical_len > dev->disk_total_bytes) { |
6653 | + btrfs_err(fs_info, |
6654 | +"dev extent devid %llu physical offset %llu len %llu is beyond device boundary %llu", |
6655 | + devid, physical_offset, physical_len, |
6656 | + dev->disk_total_bytes); |
6657 | + ret = -EUCLEAN; |
6658 | + goto out; |
6659 | + } |
6660 | out: |
6661 | free_extent_map(em); |
6662 | return ret; |
6663 | diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c |
6664 | index 11f19432a74c..665a86f83f4b 100644 |
6665 | --- a/fs/ceph/inode.c |
6666 | +++ b/fs/ceph/inode.c |
6667 | @@ -528,13 +528,16 @@ static void ceph_i_callback(struct rcu_head *head) |
6668 | kmem_cache_free(ceph_inode_cachep, ci); |
6669 | } |
6670 | |
6671 | -void ceph_destroy_inode(struct inode *inode) |
6672 | +void ceph_evict_inode(struct inode *inode) |
6673 | { |
6674 | struct ceph_inode_info *ci = ceph_inode(inode); |
6675 | struct ceph_inode_frag *frag; |
6676 | struct rb_node *n; |
6677 | |
6678 | - dout("destroy_inode %p ino %llx.%llx\n", inode, ceph_vinop(inode)); |
6679 | + dout("evict_inode %p ino %llx.%llx\n", inode, ceph_vinop(inode)); |
6680 | + |
6681 | + truncate_inode_pages_final(&inode->i_data); |
6682 | + clear_inode(inode); |
6683 | |
6684 | ceph_fscache_unregister_inode_cookie(ci); |
6685 | |
6686 | diff --git a/fs/ceph/super.c b/fs/ceph/super.c |
6687 | index c5cf46e43f2e..02528e11bf33 100644 |
6688 | --- a/fs/ceph/super.c |
6689 | +++ b/fs/ceph/super.c |
6690 | @@ -827,9 +827,9 @@ static int ceph_remount(struct super_block *sb, int *flags, char *data) |
6691 | |
6692 | static const struct super_operations ceph_super_ops = { |
6693 | .alloc_inode = ceph_alloc_inode, |
6694 | - .destroy_inode = ceph_destroy_inode, |
6695 | .write_inode = ceph_write_inode, |
6696 | .drop_inode = ceph_drop_inode, |
6697 | + .evict_inode = ceph_evict_inode, |
6698 | .sync_fs = ceph_sync_fs, |
6699 | .put_super = ceph_put_super, |
6700 | .remount_fs = ceph_remount, |
6701 | diff --git a/fs/ceph/super.h b/fs/ceph/super.h |
6702 | index 018019309790..6e968e48e5e4 100644 |
6703 | --- a/fs/ceph/super.h |
6704 | +++ b/fs/ceph/super.h |
6705 | @@ -854,7 +854,7 @@ static inline bool __ceph_have_pending_cap_snap(struct ceph_inode_info *ci) |
6706 | extern const struct inode_operations ceph_file_iops; |
6707 | |
6708 | extern struct inode *ceph_alloc_inode(struct super_block *sb); |
6709 | -extern void ceph_destroy_inode(struct inode *inode); |
6710 | +extern void ceph_evict_inode(struct inode *inode); |
6711 | extern int ceph_drop_inode(struct inode *inode); |
6712 | |
6713 | extern struct inode *ceph_get_inode(struct super_block *sb, |
6714 | diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h |
6715 | index 9731d0d891e7..aba2b48d4da1 100644 |
6716 | --- a/fs/cifs/cifs_fs_sb.h |
6717 | +++ b/fs/cifs/cifs_fs_sb.h |
6718 | @@ -72,5 +72,10 @@ struct cifs_sb_info { |
6719 | struct delayed_work prune_tlinks; |
6720 | struct rcu_head rcu; |
6721 | char *prepath; |
6722 | + /* |
6723 | + * Indicate whether serverino option was turned off later |
6724 | + * (cifs_autodisable_serverino) in order to match new mounts. |
6725 | + */ |
6726 | + bool mnt_cifs_serverino_autodisabled; |
6727 | }; |
6728 | #endif /* _CIFS_FS_SB_H */ |
6729 | diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c |
6730 | index fb32f3d6925e..64e3888f30e6 100644 |
6731 | --- a/fs/cifs/cifsfs.c |
6732 | +++ b/fs/cifs/cifsfs.c |
6733 | @@ -292,6 +292,7 @@ cifs_alloc_inode(struct super_block *sb) |
6734 | cifs_inode->uniqueid = 0; |
6735 | cifs_inode->createtime = 0; |
6736 | cifs_inode->epoch = 0; |
6737 | + spin_lock_init(&cifs_inode->open_file_lock); |
6738 | generate_random_uuid(cifs_inode->lease_key); |
6739 | |
6740 | /* |
6741 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h |
6742 | index 6f227cc781e5..57af9bac0045 100644 |
6743 | --- a/fs/cifs/cifsglob.h |
6744 | +++ b/fs/cifs/cifsglob.h |
6745 | @@ -1287,6 +1287,7 @@ struct cifsInodeInfo { |
6746 | struct rw_semaphore lock_sem; /* protect the fields above */ |
6747 | /* BB add in lists for dirty pages i.e. write caching info for oplock */ |
6748 | struct list_head openFileList; |
6749 | + spinlock_t open_file_lock; /* protects openFileList */ |
6750 | __u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */ |
6751 | unsigned int oplock; /* oplock/lease level we have */ |
6752 | unsigned int epoch; /* used to track lease state changes */ |
6753 | @@ -1563,6 +1564,25 @@ static inline void free_dfs_info_array(struct dfs_info3_param *param, |
6754 | kfree(param); |
6755 | } |
6756 | |
6757 | +static inline bool is_interrupt_error(int error) |
6758 | +{ |
6759 | + switch (error) { |
6760 | + case -EINTR: |
6761 | + case -ERESTARTSYS: |
6762 | + case -ERESTARTNOHAND: |
6763 | + case -ERESTARTNOINTR: |
6764 | + return true; |
6765 | + } |
6766 | + return false; |
6767 | +} |
6768 | + |
6769 | +static inline bool is_retryable_error(int error) |
6770 | +{ |
6771 | + if (is_interrupt_error(error) || error == -EAGAIN) |
6772 | + return true; |
6773 | + return false; |
6774 | +} |
6775 | + |
6776 | #define MID_FREE 0 |
6777 | #define MID_REQUEST_ALLOCATED 1 |
6778 | #define MID_REQUEST_SUBMITTED 2 |
6779 | @@ -1668,10 +1688,14 @@ require use of the stronger protocol */ |
6780 | * tcp_ses_lock protects: |
6781 | * list operations on tcp and SMB session lists |
6782 | * tcon->open_file_lock protects the list of open files hanging off the tcon |
6783 | + * inode->open_file_lock protects the openFileList hanging off the inode |
6784 | * cfile->file_info_lock protects counters and fields in cifs file struct |
6785 | * f_owner.lock protects certain per file struct operations |
6786 | * mapping->page_lock protects certain per page operations |
6787 | * |
6788 | + * Note that the cifs_tcon.open_file_lock should be taken before |
6789 | + * not after the cifsInodeInfo.open_file_lock |
6790 | + * |
6791 | * Semaphores |
6792 | * ---------- |
6793 | * sesSem operations on smb session |
6794 | diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c |
6795 | index 269471c8f42b..86a54b809c48 100644 |
6796 | --- a/fs/cifs/cifssmb.c |
6797 | +++ b/fs/cifs/cifssmb.c |
6798 | @@ -2033,16 +2033,17 @@ cifs_writev_requeue(struct cifs_writedata *wdata) |
6799 | |
6800 | wdata2->cfile = find_writable_file(CIFS_I(inode), false); |
6801 | if (!wdata2->cfile) { |
6802 | - cifs_dbg(VFS, "No writable handles for inode\n"); |
6803 | + cifs_dbg(VFS, "No writable handle to retry writepages\n"); |
6804 | rc = -EBADF; |
6805 | - break; |
6806 | + } else { |
6807 | + wdata2->pid = wdata2->cfile->pid; |
6808 | + rc = server->ops->async_writev(wdata2, |
6809 | + cifs_writedata_release); |
6810 | } |
6811 | - wdata2->pid = wdata2->cfile->pid; |
6812 | - rc = server->ops->async_writev(wdata2, cifs_writedata_release); |
6813 | |
6814 | for (j = 0; j < nr_pages; j++) { |
6815 | unlock_page(wdata2->pages[j]); |
6816 | - if (rc != 0 && rc != -EAGAIN) { |
6817 | + if (rc != 0 && !is_retryable_error(rc)) { |
6818 | SetPageError(wdata2->pages[j]); |
6819 | end_page_writeback(wdata2->pages[j]); |
6820 | put_page(wdata2->pages[j]); |
6821 | @@ -2051,8 +2052,9 @@ cifs_writev_requeue(struct cifs_writedata *wdata) |
6822 | |
6823 | if (rc) { |
6824 | kref_put(&wdata2->refcount, cifs_writedata_release); |
6825 | - if (rc == -EAGAIN) |
6826 | + if (is_retryable_error(rc)) |
6827 | continue; |
6828 | + i += nr_pages; |
6829 | break; |
6830 | } |
6831 | |
6832 | @@ -2060,7 +2062,15 @@ cifs_writev_requeue(struct cifs_writedata *wdata) |
6833 | i += nr_pages; |
6834 | } while (i < wdata->nr_pages); |
6835 | |
6836 | - mapping_set_error(inode->i_mapping, rc); |
6837 | + /* cleanup remaining pages from the original wdata */ |
6838 | + for (; i < wdata->nr_pages; i++) { |
6839 | + SetPageError(wdata->pages[i]); |
6840 | + end_page_writeback(wdata->pages[i]); |
6841 | + put_page(wdata->pages[i]); |
6842 | + } |
6843 | + |
6844 | + if (rc != 0 && !is_retryable_error(rc)) |
6845 | + mapping_set_error(inode->i_mapping, rc); |
6846 | kref_put(&wdata->refcount, cifs_writedata_release); |
6847 | } |
6848 | |
6849 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
6850 | index c53a2e86ed54..208430bb66fc 100644 |
6851 | --- a/fs/cifs/connect.c |
6852 | +++ b/fs/cifs/connect.c |
6853 | @@ -3247,12 +3247,16 @@ compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data) |
6854 | { |
6855 | struct cifs_sb_info *old = CIFS_SB(sb); |
6856 | struct cifs_sb_info *new = mnt_data->cifs_sb; |
6857 | + unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK; |
6858 | + unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK; |
6859 | |
6860 | if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK)) |
6861 | return 0; |
6862 | |
6863 | - if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) != |
6864 | - (new->mnt_cifs_flags & CIFS_MOUNT_MASK)) |
6865 | + if (old->mnt_cifs_serverino_autodisabled) |
6866 | + newflags &= ~CIFS_MOUNT_SERVER_INUM; |
6867 | + |
6868 | + if (oldflags != newflags) |
6869 | return 0; |
6870 | |
6871 | /* |
6872 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c |
6873 | index 23cee91ed442..8703b5f26f45 100644 |
6874 | --- a/fs/cifs/file.c |
6875 | +++ b/fs/cifs/file.c |
6876 | @@ -336,10 +336,12 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, |
6877 | list_add(&cfile->tlist, &tcon->openFileList); |
6878 | |
6879 | /* if readable file instance put first in list*/ |
6880 | + spin_lock(&cinode->open_file_lock); |
6881 | if (file->f_mode & FMODE_READ) |
6882 | list_add(&cfile->flist, &cinode->openFileList); |
6883 | else |
6884 | list_add_tail(&cfile->flist, &cinode->openFileList); |
6885 | + spin_unlock(&cinode->open_file_lock); |
6886 | spin_unlock(&tcon->open_file_lock); |
6887 | |
6888 | if (fid->purge_cache) |
6889 | @@ -411,7 +413,9 @@ void _cifsFileInfo_put(struct cifsFileInfo *cifs_file, bool wait_oplock_handler) |
6890 | cifs_add_pending_open_locked(&fid, cifs_file->tlink, &open); |
6891 | |
6892 | /* remove it from the lists */ |
6893 | + spin_lock(&cifsi->open_file_lock); |
6894 | list_del(&cifs_file->flist); |
6895 | + spin_unlock(&cifsi->open_file_lock); |
6896 | list_del(&cifs_file->tlist); |
6897 | |
6898 | if (list_empty(&cifsi->openFileList)) { |
6899 | @@ -749,7 +753,8 @@ reopen_success: |
6900 | |
6901 | if (can_flush) { |
6902 | rc = filemap_write_and_wait(inode->i_mapping); |
6903 | - mapping_set_error(inode->i_mapping, rc); |
6904 | + if (!is_interrupt_error(rc)) |
6905 | + mapping_set_error(inode->i_mapping, rc); |
6906 | |
6907 | if (tcon->unix_ext) |
6908 | rc = cifs_get_inode_info_unix(&inode, full_path, |
6909 | @@ -1928,10 +1933,10 @@ refind_writable: |
6910 | if (!rc) |
6911 | return inv_file; |
6912 | else { |
6913 | - spin_lock(&tcon->open_file_lock); |
6914 | + spin_lock(&cifs_inode->open_file_lock); |
6915 | list_move_tail(&inv_file->flist, |
6916 | &cifs_inode->openFileList); |
6917 | - spin_unlock(&tcon->open_file_lock); |
6918 | + spin_unlock(&cifs_inode->open_file_lock); |
6919 | cifsFileInfo_put(inv_file); |
6920 | ++refind; |
6921 | inv_file = NULL; |
6922 | @@ -2137,6 +2142,7 @@ static int cifs_writepages(struct address_space *mapping, |
6923 | pgoff_t end, index; |
6924 | struct cifs_writedata *wdata; |
6925 | int rc = 0; |
6926 | + int saved_rc = 0; |
6927 | |
6928 | /* |
6929 | * If wsize is smaller than the page cache size, default to writing |
6930 | @@ -2163,8 +2169,10 @@ retry: |
6931 | |
6932 | rc = server->ops->wait_mtu_credits(server, cifs_sb->wsize, |
6933 | &wsize, &credits); |
6934 | - if (rc) |
6935 | + if (rc != 0) { |
6936 | + done = true; |
6937 | break; |
6938 | + } |
6939 | |
6940 | tofind = min((wsize / PAGE_SIZE) - 1, end - index) + 1; |
6941 | |
6942 | @@ -2172,6 +2180,7 @@ retry: |
6943 | &found_pages); |
6944 | if (!wdata) { |
6945 | rc = -ENOMEM; |
6946 | + done = true; |
6947 | add_credits_and_wake_if(server, credits, 0); |
6948 | break; |
6949 | } |
6950 | @@ -2200,7 +2209,7 @@ retry: |
6951 | if (rc != 0) { |
6952 | add_credits_and_wake_if(server, wdata->credits, 0); |
6953 | for (i = 0; i < nr_pages; ++i) { |
6954 | - if (rc == -EAGAIN) |
6955 | + if (is_retryable_error(rc)) |
6956 | redirty_page_for_writepage(wbc, |
6957 | wdata->pages[i]); |
6958 | else |
6959 | @@ -2208,7 +2217,7 @@ retry: |
6960 | end_page_writeback(wdata->pages[i]); |
6961 | put_page(wdata->pages[i]); |
6962 | } |
6963 | - if (rc != -EAGAIN) |
6964 | + if (!is_retryable_error(rc)) |
6965 | mapping_set_error(mapping, rc); |
6966 | } |
6967 | kref_put(&wdata->refcount, cifs_writedata_release); |
6968 | @@ -2218,6 +2227,15 @@ retry: |
6969 | continue; |
6970 | } |
6971 | |
6972 | + /* Return immediately if we received a signal during writing */ |
6973 | + if (is_interrupt_error(rc)) { |
6974 | + done = true; |
6975 | + break; |
6976 | + } |
6977 | + |
6978 | + if (rc != 0 && saved_rc == 0) |
6979 | + saved_rc = rc; |
6980 | + |
6981 | wbc->nr_to_write -= nr_pages; |
6982 | if (wbc->nr_to_write <= 0) |
6983 | done = true; |
6984 | @@ -2235,6 +2253,9 @@ retry: |
6985 | goto retry; |
6986 | } |
6987 | |
6988 | + if (saved_rc != 0) |
6989 | + rc = saved_rc; |
6990 | + |
6991 | if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) |
6992 | mapping->writeback_index = index; |
6993 | |
6994 | @@ -2266,8 +2287,8 @@ cifs_writepage_locked(struct page *page, struct writeback_control *wbc) |
6995 | set_page_writeback(page); |
6996 | retry_write: |
6997 | rc = cifs_partialpagewrite(page, 0, PAGE_SIZE); |
6998 | - if (rc == -EAGAIN) { |
6999 | - if (wbc->sync_mode == WB_SYNC_ALL) |
7000 | + if (is_retryable_error(rc)) { |
7001 | + if (wbc->sync_mode == WB_SYNC_ALL && rc == -EAGAIN) |
7002 | goto retry_write; |
7003 | redirty_page_for_writepage(wbc, page); |
7004 | } else if (rc != 0) { |
7005 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c |
7006 | index 1fadd314ae7f..53f3d08898af 100644 |
7007 | --- a/fs/cifs/inode.c |
7008 | +++ b/fs/cifs/inode.c |
7009 | @@ -2261,6 +2261,11 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs) |
7010 | * the flush returns error? |
7011 | */ |
7012 | rc = filemap_write_and_wait(inode->i_mapping); |
7013 | + if (is_interrupt_error(rc)) { |
7014 | + rc = -ERESTARTSYS; |
7015 | + goto out; |
7016 | + } |
7017 | + |
7018 | mapping_set_error(inode->i_mapping, rc); |
7019 | rc = 0; |
7020 | |
7021 | @@ -2404,6 +2409,11 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) |
7022 | * the flush returns error? |
7023 | */ |
7024 | rc = filemap_write_and_wait(inode->i_mapping); |
7025 | + if (is_interrupt_error(rc)) { |
7026 | + rc = -ERESTARTSYS; |
7027 | + goto cifs_setattr_exit; |
7028 | + } |
7029 | + |
7030 | mapping_set_error(inode->i_mapping, rc); |
7031 | rc = 0; |
7032 | |
7033 | diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c |
7034 | index facc94e159a1..e45f8e321371 100644 |
7035 | --- a/fs/cifs/misc.c |
7036 | +++ b/fs/cifs/misc.c |
7037 | @@ -523,6 +523,7 @@ cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb) |
7038 | { |
7039 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { |
7040 | cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM; |
7041 | + cifs_sb->mnt_cifs_serverino_autodisabled = true; |
7042 | cifs_dbg(VFS, "Autodisabling the use of server inode numbers on %s. This server doesn't seem to support them properly. Hardlinks will not be recognized on this mount. Consider mounting with the \"noserverino\" option to silence this message.\n", |
7043 | cifs_sb_master_tcon(cifs_sb)->treeName); |
7044 | } |
7045 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c |
7046 | index 2bc47eb6215e..cbe633f1840a 100644 |
7047 | --- a/fs/cifs/smb2pdu.c |
7048 | +++ b/fs/cifs/smb2pdu.c |
7049 | @@ -712,6 +712,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses) |
7050 | } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { |
7051 | /* ops set to 3.0 by default for default so update */ |
7052 | ses->server->ops = &smb21_operations; |
7053 | + ses->server->vals = &smb21_values; |
7054 | } |
7055 | } else if (le16_to_cpu(rsp->DialectRevision) != |
7056 | ses->server->vals->protocol_id) { |
7057 | diff --git a/fs/cifs/smbdirect.c b/fs/cifs/smbdirect.c |
7058 | index 5fdb9a509a97..1959931e14c1 100644 |
7059 | --- a/fs/cifs/smbdirect.c |
7060 | +++ b/fs/cifs/smbdirect.c |
7061 | @@ -2090,7 +2090,8 @@ int smbd_recv(struct smbd_connection *info, struct msghdr *msg) |
7062 | * rqst: the data to write |
7063 | * return value: 0 if successfully write, otherwise error code |
7064 | */ |
7065 | -int smbd_send(struct TCP_Server_Info *server, struct smb_rqst *rqst) |
7066 | +int smbd_send(struct TCP_Server_Info *server, |
7067 | + int num_rqst, struct smb_rqst *rqst_array) |
7068 | { |
7069 | struct smbd_connection *info = server->smbd_conn; |
7070 | struct kvec vec; |
7071 | @@ -2102,6 +2103,8 @@ int smbd_send(struct TCP_Server_Info *server, struct smb_rqst *rqst) |
7072 | info->max_send_size - sizeof(struct smbd_data_transfer); |
7073 | struct kvec *iov; |
7074 | int rc; |
7075 | + struct smb_rqst *rqst; |
7076 | + int rqst_idx; |
7077 | |
7078 | info->smbd_send_pending++; |
7079 | if (info->transport_status != SMBD_CONNECTED) { |
7080 | @@ -2109,47 +2112,41 @@ int smbd_send(struct TCP_Server_Info *server, struct smb_rqst *rqst) |
7081 | goto done; |
7082 | } |
7083 | |
7084 | - /* |
7085 | - * Skip the RFC1002 length defined in MS-SMB2 section 2.1 |
7086 | - * It is used only for TCP transport in the iov[0] |
7087 | - * In future we may want to add a transport layer under protocol |
7088 | - * layer so this will only be issued to TCP transport |
7089 | - */ |
7090 | - |
7091 | - if (rqst->rq_iov[0].iov_len != 4) { |
7092 | - log_write(ERR, "expected the pdu length in 1st iov, but got %zu\n", rqst->rq_iov[0].iov_len); |
7093 | - return -EINVAL; |
7094 | - } |
7095 | - |
7096 | /* |
7097 | * Add in the page array if there is one. The caller needs to set |
7098 | * rq_tailsz to PAGE_SIZE when the buffer has multiple pages and |
7099 | * ends at page boundary |
7100 | */ |
7101 | - buflen = smb_rqst_len(server, rqst); |
7102 | + remaining_data_length = 0; |
7103 | + for (i = 0; i < num_rqst; i++) |
7104 | + remaining_data_length += smb_rqst_len(server, &rqst_array[i]); |
7105 | |
7106 | - if (buflen + sizeof(struct smbd_data_transfer) > |
7107 | + if (remaining_data_length + sizeof(struct smbd_data_transfer) > |
7108 | info->max_fragmented_send_size) { |
7109 | log_write(ERR, "payload size %d > max size %d\n", |
7110 | - buflen, info->max_fragmented_send_size); |
7111 | + remaining_data_length, info->max_fragmented_send_size); |
7112 | rc = -EINVAL; |
7113 | goto done; |
7114 | } |
7115 | |
7116 | - iov = &rqst->rq_iov[1]; |
7117 | + rqst_idx = 0; |
7118 | + |
7119 | +next_rqst: |
7120 | + rqst = &rqst_array[rqst_idx]; |
7121 | + iov = rqst->rq_iov; |
7122 | |
7123 | - cifs_dbg(FYI, "Sending smb (RDMA): smb_len=%u\n", buflen); |
7124 | - for (i = 0; i < rqst->rq_nvec-1; i++) |
7125 | + cifs_dbg(FYI, "Sending smb (RDMA): idx=%d smb_len=%lu\n", |
7126 | + rqst_idx, smb_rqst_len(server, rqst)); |
7127 | + for (i = 0; i < rqst->rq_nvec; i++) |
7128 | dump_smb(iov[i].iov_base, iov[i].iov_len); |
7129 | |
7130 | - remaining_data_length = buflen; |
7131 | |
7132 | - log_write(INFO, "rqst->rq_nvec=%d rqst->rq_npages=%d rq_pagesz=%d " |
7133 | - "rq_tailsz=%d buflen=%d\n", |
7134 | - rqst->rq_nvec, rqst->rq_npages, rqst->rq_pagesz, |
7135 | - rqst->rq_tailsz, buflen); |
7136 | + log_write(INFO, "rqst_idx=%d nvec=%d rqst->rq_npages=%d rq_pagesz=%d " |
7137 | + "rq_tailsz=%d buflen=%lu\n", |
7138 | + rqst_idx, rqst->rq_nvec, rqst->rq_npages, rqst->rq_pagesz, |
7139 | + rqst->rq_tailsz, smb_rqst_len(server, rqst)); |
7140 | |
7141 | - start = i = iov[0].iov_len ? 0 : 1; |
7142 | + start = i = 0; |
7143 | buflen = 0; |
7144 | while (true) { |
7145 | buflen += iov[i].iov_len; |
7146 | @@ -2197,14 +2194,14 @@ int smbd_send(struct TCP_Server_Info *server, struct smb_rqst *rqst) |
7147 | goto done; |
7148 | } |
7149 | i++; |
7150 | - if (i == rqst->rq_nvec-1) |
7151 | + if (i == rqst->rq_nvec) |
7152 | break; |
7153 | } |
7154 | start = i; |
7155 | buflen = 0; |
7156 | } else { |
7157 | i++; |
7158 | - if (i == rqst->rq_nvec-1) { |
7159 | + if (i == rqst->rq_nvec) { |
7160 | /* send out all remaining vecs */ |
7161 | remaining_data_length -= buflen; |
7162 | log_write(INFO, |
7163 | @@ -2248,6 +2245,10 @@ int smbd_send(struct TCP_Server_Info *server, struct smb_rqst *rqst) |
7164 | } |
7165 | } |
7166 | |
7167 | + rqst_idx++; |
7168 | + if (rqst_idx < num_rqst) |
7169 | + goto next_rqst; |
7170 | + |
7171 | done: |
7172 | /* |
7173 | * As an optimization, we don't wait for individual I/O to finish |
7174 | diff --git a/fs/cifs/smbdirect.h b/fs/cifs/smbdirect.h |
7175 | index a11096254f29..b5c240ff2191 100644 |
7176 | --- a/fs/cifs/smbdirect.h |
7177 | +++ b/fs/cifs/smbdirect.h |
7178 | @@ -292,7 +292,8 @@ void smbd_destroy(struct smbd_connection *info); |
7179 | |
7180 | /* Interface for carrying upper layer I/O through send/recv */ |
7181 | int smbd_recv(struct smbd_connection *info, struct msghdr *msg); |
7182 | -int smbd_send(struct TCP_Server_Info *server, struct smb_rqst *rqst); |
7183 | +int smbd_send(struct TCP_Server_Info *server, |
7184 | + int num_rqst, struct smb_rqst *rqst); |
7185 | |
7186 | enum mr_state { |
7187 | MR_READY, |
7188 | @@ -332,7 +333,7 @@ static inline void *smbd_get_connection( |
7189 | static inline int smbd_reconnect(struct TCP_Server_Info *server) {return -1; } |
7190 | static inline void smbd_destroy(struct smbd_connection *info) {} |
7191 | static inline int smbd_recv(struct smbd_connection *info, struct msghdr *msg) {return -1; } |
7192 | -static inline int smbd_send(struct TCP_Server_Info *server, struct smb_rqst *rqst) {return -1; } |
7193 | +static inline int smbd_send(struct TCP_Server_Info *server, int num_rqst, struct smb_rqst *rqst) {return -1; } |
7194 | #endif |
7195 | |
7196 | #endif |
7197 | diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c |
7198 | index f2938bd95c40..fe77f41bff9f 100644 |
7199 | --- a/fs/cifs/transport.c |
7200 | +++ b/fs/cifs/transport.c |
7201 | @@ -287,7 +287,7 @@ __smb_send_rqst(struct TCP_Server_Info *server, int num_rqst, |
7202 | __be32 rfc1002_marker; |
7203 | |
7204 | if (cifs_rdma_enabled(server) && server->smbd_conn) { |
7205 | - rc = smbd_send(server, rqst); |
7206 | + rc = smbd_send(server, num_rqst, rqst); |
7207 | goto smbd_done; |
7208 | } |
7209 | if (ssocket == NULL) |
7210 | diff --git a/fs/ext4/block_validity.c b/fs/ext4/block_validity.c |
7211 | index 913061c0de1b..e8e27cdc2f67 100644 |
7212 | --- a/fs/ext4/block_validity.c |
7213 | +++ b/fs/ext4/block_validity.c |
7214 | @@ -137,6 +137,49 @@ static void debug_print_tree(struct ext4_sb_info *sbi) |
7215 | printk(KERN_CONT "\n"); |
7216 | } |
7217 | |
7218 | +static int ext4_protect_reserved_inode(struct super_block *sb, u32 ino) |
7219 | +{ |
7220 | + struct inode *inode; |
7221 | + struct ext4_sb_info *sbi = EXT4_SB(sb); |
7222 | + struct ext4_map_blocks map; |
7223 | + u32 i = 0, num; |
7224 | + int err = 0, n; |
7225 | + |
7226 | + if ((ino < EXT4_ROOT_INO) || |
7227 | + (ino > le32_to_cpu(sbi->s_es->s_inodes_count))) |
7228 | + return -EINVAL; |
7229 | + inode = ext4_iget(sb, ino, EXT4_IGET_SPECIAL); |
7230 | + if (IS_ERR(inode)) |
7231 | + return PTR_ERR(inode); |
7232 | + num = (inode->i_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits; |
7233 | + while (i < num) { |
7234 | + map.m_lblk = i; |
7235 | + map.m_len = num - i; |
7236 | + n = ext4_map_blocks(NULL, inode, &map, 0); |
7237 | + if (n < 0) { |
7238 | + err = n; |
7239 | + break; |
7240 | + } |
7241 | + if (n == 0) { |
7242 | + i++; |
7243 | + } else { |
7244 | + if (!ext4_data_block_valid(sbi, map.m_pblk, n)) { |
7245 | + ext4_error(sb, "blocks %llu-%llu from inode %u " |
7246 | + "overlap system zone", map.m_pblk, |
7247 | + map.m_pblk + map.m_len - 1, ino); |
7248 | + err = -EFSCORRUPTED; |
7249 | + break; |
7250 | + } |
7251 | + err = add_system_zone(sbi, map.m_pblk, n); |
7252 | + if (err < 0) |
7253 | + break; |
7254 | + i += n; |
7255 | + } |
7256 | + } |
7257 | + iput(inode); |
7258 | + return err; |
7259 | +} |
7260 | + |
7261 | int ext4_setup_system_zone(struct super_block *sb) |
7262 | { |
7263 | ext4_group_t ngroups = ext4_get_groups_count(sb); |
7264 | @@ -171,6 +214,12 @@ int ext4_setup_system_zone(struct super_block *sb) |
7265 | if (ret) |
7266 | return ret; |
7267 | } |
7268 | + if (ext4_has_feature_journal(sb) && sbi->s_es->s_journal_inum) { |
7269 | + ret = ext4_protect_reserved_inode(sb, |
7270 | + le32_to_cpu(sbi->s_es->s_journal_inum)); |
7271 | + if (ret) |
7272 | + return ret; |
7273 | + } |
7274 | |
7275 | if (test_opt(sb, DEBUG)) |
7276 | debug_print_tree(sbi); |
7277 | @@ -227,6 +276,11 @@ int ext4_check_blockref(const char *function, unsigned int line, |
7278 | __le32 *bref = p; |
7279 | unsigned int blk; |
7280 | |
7281 | + if (ext4_has_feature_journal(inode->i_sb) && |
7282 | + (inode->i_ino == |
7283 | + le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) |
7284 | + return 0; |
7285 | + |
7286 | while (bref < p+max) { |
7287 | blk = le32_to_cpu(*bref++); |
7288 | if (blk && |
7289 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c |
7290 | index 45aea792d22a..00bf0b67aae8 100644 |
7291 | --- a/fs/ext4/extents.c |
7292 | +++ b/fs/ext4/extents.c |
7293 | @@ -518,10 +518,14 @@ __read_extent_tree_block(const char *function, unsigned int line, |
7294 | } |
7295 | if (buffer_verified(bh) && !(flags & EXT4_EX_FORCE_CACHE)) |
7296 | return bh; |
7297 | - err = __ext4_ext_check(function, line, inode, |
7298 | - ext_block_hdr(bh), depth, pblk); |
7299 | - if (err) |
7300 | - goto errout; |
7301 | + if (!ext4_has_feature_journal(inode->i_sb) || |
7302 | + (inode->i_ino != |
7303 | + le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) { |
7304 | + err = __ext4_ext_check(function, line, inode, |
7305 | + ext_block_hdr(bh), depth, pblk); |
7306 | + if (err) |
7307 | + goto errout; |
7308 | + } |
7309 | set_buffer_verified(bh); |
7310 | /* |
7311 | * If this is a leaf block, cache all of its entries |
7312 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
7313 | index e65559bf7728..cff6277f7a9f 100644 |
7314 | --- a/fs/ext4/inode.c |
7315 | +++ b/fs/ext4/inode.c |
7316 | @@ -399,6 +399,10 @@ static int __check_block_validity(struct inode *inode, const char *func, |
7317 | unsigned int line, |
7318 | struct ext4_map_blocks *map) |
7319 | { |
7320 | + if (ext4_has_feature_journal(inode->i_sb) && |
7321 | + (inode->i_ino == |
7322 | + le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) |
7323 | + return 0; |
7324 | if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), map->m_pblk, |
7325 | map->m_len)) { |
7326 | ext4_error_inode(inode, func, line, map->m_pblk, |
7327 | diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c |
7328 | index 75fe92eaa681..1624618c2bc7 100644 |
7329 | --- a/fs/nfs/delegation.c |
7330 | +++ b/fs/nfs/delegation.c |
7331 | @@ -153,7 +153,7 @@ again: |
7332 | /* Block nfs4_proc_unlck */ |
7333 | mutex_lock(&sp->so_delegreturn_mutex); |
7334 | seq = raw_seqcount_begin(&sp->so_reclaim_seqcount); |
7335 | - err = nfs4_open_delegation_recall(ctx, state, stateid, type); |
7336 | + err = nfs4_open_delegation_recall(ctx, state, stateid); |
7337 | if (!err) |
7338 | err = nfs_delegation_claim_locks(ctx, state, stateid); |
7339 | if (!err && read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) |
7340 | diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h |
7341 | index bb1ef8c37af4..c95477823fa6 100644 |
7342 | --- a/fs/nfs/delegation.h |
7343 | +++ b/fs/nfs/delegation.h |
7344 | @@ -61,7 +61,7 @@ void nfs_reap_expired_delegations(struct nfs_client *clp); |
7345 | |
7346 | /* NFSv4 delegation-related procedures */ |
7347 | int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync); |
7348 | -int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid, fmode_t type); |
7349 | +int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid); |
7350 | int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state, const nfs4_stateid *stateid); |
7351 | bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags, nfs4_stateid *dst, struct rpc_cred **cred); |
7352 | bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode); |
7353 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
7354 | index 31ae3bd5d9d2..621e3cf90f4e 100644 |
7355 | --- a/fs/nfs/nfs4proc.c |
7356 | +++ b/fs/nfs/nfs4proc.c |
7357 | @@ -2113,12 +2113,10 @@ static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct |
7358 | case -NFS4ERR_BAD_HIGH_SLOT: |
7359 | case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: |
7360 | case -NFS4ERR_DEADSESSION: |
7361 | - set_bit(NFS_DELEGATED_STATE, &state->flags); |
7362 | nfs4_schedule_session_recovery(server->nfs_client->cl_session, err); |
7363 | return -EAGAIN; |
7364 | case -NFS4ERR_STALE_CLIENTID: |
7365 | case -NFS4ERR_STALE_STATEID: |
7366 | - set_bit(NFS_DELEGATED_STATE, &state->flags); |
7367 | /* Don't recall a delegation if it was lost */ |
7368 | nfs4_schedule_lease_recovery(server->nfs_client); |
7369 | return -EAGAIN; |
7370 | @@ -2139,7 +2137,6 @@ static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct |
7371 | return -EAGAIN; |
7372 | case -NFS4ERR_DELAY: |
7373 | case -NFS4ERR_GRACE: |
7374 | - set_bit(NFS_DELEGATED_STATE, &state->flags); |
7375 | ssleep(1); |
7376 | return -EAGAIN; |
7377 | case -ENOMEM: |
7378 | @@ -2155,8 +2152,7 @@ static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct |
7379 | } |
7380 | |
7381 | int nfs4_open_delegation_recall(struct nfs_open_context *ctx, |
7382 | - struct nfs4_state *state, const nfs4_stateid *stateid, |
7383 | - fmode_t type) |
7384 | + struct nfs4_state *state, const nfs4_stateid *stateid) |
7385 | { |
7386 | struct nfs_server *server = NFS_SERVER(state->inode); |
7387 | struct nfs4_opendata *opendata; |
7388 | @@ -2167,20 +2163,23 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, |
7389 | if (IS_ERR(opendata)) |
7390 | return PTR_ERR(opendata); |
7391 | nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid); |
7392 | - nfs_state_clear_delegation(state); |
7393 | - switch (type & (FMODE_READ|FMODE_WRITE)) { |
7394 | - case FMODE_READ|FMODE_WRITE: |
7395 | - case FMODE_WRITE: |
7396 | + if (!test_bit(NFS_O_RDWR_STATE, &state->flags)) { |
7397 | err = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE); |
7398 | if (err) |
7399 | - break; |
7400 | + goto out; |
7401 | + } |
7402 | + if (!test_bit(NFS_O_WRONLY_STATE, &state->flags)) { |
7403 | err = nfs4_open_recover_helper(opendata, FMODE_WRITE); |
7404 | if (err) |
7405 | - break; |
7406 | - /* Fall through */ |
7407 | - case FMODE_READ: |
7408 | + goto out; |
7409 | + } |
7410 | + if (!test_bit(NFS_O_RDONLY_STATE, &state->flags)) { |
7411 | err = nfs4_open_recover_helper(opendata, FMODE_READ); |
7412 | + if (err) |
7413 | + goto out; |
7414 | } |
7415 | + nfs_state_clear_delegation(state); |
7416 | +out: |
7417 | nfs4_opendata_put(opendata); |
7418 | return nfs4_handle_delegation_recall_error(server, state, stateid, NULL, err); |
7419 | } |
7420 | diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c |
7421 | index 8cf2218b46a7..6f90d91a8733 100644 |
7422 | --- a/fs/pstore/inode.c |
7423 | +++ b/fs/pstore/inode.c |
7424 | @@ -330,10 +330,6 @@ int pstore_mkfile(struct dentry *root, struct pstore_record *record) |
7425 | goto fail; |
7426 | inode->i_mode = S_IFREG | 0444; |
7427 | inode->i_fop = &pstore_file_operations; |
7428 | - private = kzalloc(sizeof(*private), GFP_KERNEL); |
7429 | - if (!private) |
7430 | - goto fail_alloc; |
7431 | - private->record = record; |
7432 | |
7433 | switch (record->type) { |
7434 | case PSTORE_TYPE_DMESG: |
7435 | @@ -383,12 +379,16 @@ int pstore_mkfile(struct dentry *root, struct pstore_record *record) |
7436 | break; |
7437 | } |
7438 | |
7439 | + private = kzalloc(sizeof(*private), GFP_KERNEL); |
7440 | + if (!private) |
7441 | + goto fail_inode; |
7442 | + |
7443 | dentry = d_alloc_name(root, name); |
7444 | if (!dentry) |
7445 | goto fail_private; |
7446 | |
7447 | + private->record = record; |
7448 | inode->i_size = private->total_size = size; |
7449 | - |
7450 | inode->i_private = private; |
7451 | |
7452 | if (record->time.tv_sec) |
7453 | @@ -404,7 +404,7 @@ int pstore_mkfile(struct dentry *root, struct pstore_record *record) |
7454 | |
7455 | fail_private: |
7456 | free_pstore_private(private); |
7457 | -fail_alloc: |
7458 | +fail_inode: |
7459 | iput(inode); |
7460 | |
7461 | fail: |
7462 | diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h |
7463 | index f9c6e0e3aec7..fa117e11458a 100644 |
7464 | --- a/include/drm/drm_device.h |
7465 | +++ b/include/drm/drm_device.h |
7466 | @@ -174,7 +174,13 @@ struct drm_device { |
7467 | * races and imprecision over longer time periods, hence exposing a |
7468 | * hardware vblank counter is always recommended. |
7469 | * |
7470 | - * If non-zeor, &drm_crtc_funcs.get_vblank_counter must be set. |
7471 | + * This is the statically configured device wide maximum. The driver |
7472 | + * can instead choose to use a runtime configurable per-crtc value |
7473 | + * &drm_vblank_crtc.max_vblank_count, in which case @max_vblank_count |
7474 | + * must be left at zero. See drm_crtc_set_max_vblank_count() on how |
7475 | + * to use the per-crtc value. |
7476 | + * |
7477 | + * If non-zero, &drm_crtc_funcs.get_vblank_counter must be set. |
7478 | */ |
7479 | u32 max_vblank_count; /**< size of vblank counter register */ |
7480 | |
7481 | diff --git a/include/drm/drm_vblank.h b/include/drm/drm_vblank.h |
7482 | index d25a9603ab57..e9c676381fd4 100644 |
7483 | --- a/include/drm/drm_vblank.h |
7484 | +++ b/include/drm/drm_vblank.h |
7485 | @@ -128,6 +128,26 @@ struct drm_vblank_crtc { |
7486 | * @last: Protected by &drm_device.vbl_lock, used for wraparound handling. |
7487 | */ |
7488 | u32 last; |
7489 | + /** |
7490 | + * @max_vblank_count: |
7491 | + * |
7492 | + * Maximum value of the vblank registers for this crtc. This value +1 |
7493 | + * will result in a wrap-around of the vblank register. It is used |
7494 | + * by the vblank core to handle wrap-arounds. |
7495 | + * |
7496 | + * If set to zero the vblank core will try to guess the elapsed vblanks |
7497 | + * between times when the vblank interrupt is disabled through |
7498 | + * high-precision timestamps. That approach is suffering from small |
7499 | + * races and imprecision over longer time periods, hence exposing a |
7500 | + * hardware vblank counter is always recommended. |
7501 | + * |
7502 | + * This is the runtime configurable per-crtc maximum set through |
7503 | + * drm_crtc_set_max_vblank_count(). If this is used the driver |
7504 | + * must leave the device wide &drm_device.max_vblank_count at zero. |
7505 | + * |
7506 | + * If non-zero, &drm_crtc_funcs.get_vblank_counter must be set. |
7507 | + */ |
7508 | + u32 max_vblank_count; |
7509 | /** |
7510 | * @inmodeset: Tracks whether the vblank is disabled due to a modeset. |
7511 | * For legacy driver bit 2 additionally tracks whether an additional |
7512 | @@ -206,4 +226,6 @@ bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, |
7513 | void drm_calc_timestamping_constants(struct drm_crtc *crtc, |
7514 | const struct drm_display_mode *mode); |
7515 | wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc); |
7516 | +void drm_crtc_set_max_vblank_count(struct drm_crtc *crtc, |
7517 | + u32 max_vblank_count); |
7518 | #endif |
7519 | diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h |
7520 | index bef2e36c01b4..91f9f95ad506 100644 |
7521 | --- a/include/linux/device-mapper.h |
7522 | +++ b/include/linux/device-mapper.h |
7523 | @@ -62,7 +62,8 @@ typedef int (*dm_clone_and_map_request_fn) (struct dm_target *ti, |
7524 | struct request *rq, |
7525 | union map_info *map_context, |
7526 | struct request **clone); |
7527 | -typedef void (*dm_release_clone_request_fn) (struct request *clone); |
7528 | +typedef void (*dm_release_clone_request_fn) (struct request *clone, |
7529 | + union map_info *map_context); |
7530 | |
7531 | /* |
7532 | * Returns: |
7533 | diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h |
7534 | index acc4279ad5e3..412098b24f58 100644 |
7535 | --- a/include/linux/gpio/consumer.h |
7536 | +++ b/include/linux/gpio/consumer.h |
7537 | @@ -222,7 +222,7 @@ static inline void gpiod_put(struct gpio_desc *desc) |
7538 | might_sleep(); |
7539 | |
7540 | /* GPIO can never have been requested */ |
7541 | - WARN_ON(1); |
7542 | + WARN_ON(desc); |
7543 | } |
7544 | |
7545 | static inline void gpiod_put_array(struct gpio_descs *descs) |
7546 | @@ -230,7 +230,7 @@ static inline void gpiod_put_array(struct gpio_descs *descs) |
7547 | might_sleep(); |
7548 | |
7549 | /* GPIO can never have been requested */ |
7550 | - WARN_ON(1); |
7551 | + WARN_ON(descs); |
7552 | } |
7553 | |
7554 | static inline struct gpio_desc *__must_check |
7555 | @@ -283,7 +283,7 @@ static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc) |
7556 | might_sleep(); |
7557 | |
7558 | /* GPIO can never have been requested */ |
7559 | - WARN_ON(1); |
7560 | + WARN_ON(desc); |
7561 | } |
7562 | |
7563 | static inline void devm_gpiod_put_array(struct device *dev, |
7564 | @@ -292,32 +292,32 @@ static inline void devm_gpiod_put_array(struct device *dev, |
7565 | might_sleep(); |
7566 | |
7567 | /* GPIO can never have been requested */ |
7568 | - WARN_ON(1); |
7569 | + WARN_ON(descs); |
7570 | } |
7571 | |
7572 | |
7573 | static inline int gpiod_get_direction(const struct gpio_desc *desc) |
7574 | { |
7575 | /* GPIO can never have been requested */ |
7576 | - WARN_ON(1); |
7577 | + WARN_ON(desc); |
7578 | return -ENOSYS; |
7579 | } |
7580 | static inline int gpiod_direction_input(struct gpio_desc *desc) |
7581 | { |
7582 | /* GPIO can never have been requested */ |
7583 | - WARN_ON(1); |
7584 | + WARN_ON(desc); |
7585 | return -ENOSYS; |
7586 | } |
7587 | static inline int gpiod_direction_output(struct gpio_desc *desc, int value) |
7588 | { |
7589 | /* GPIO can never have been requested */ |
7590 | - WARN_ON(1); |
7591 | + WARN_ON(desc); |
7592 | return -ENOSYS; |
7593 | } |
7594 | static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value) |
7595 | { |
7596 | /* GPIO can never have been requested */ |
7597 | - WARN_ON(1); |
7598 | + WARN_ON(desc); |
7599 | return -ENOSYS; |
7600 | } |
7601 | |
7602 | @@ -325,7 +325,7 @@ static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value) |
7603 | static inline int gpiod_get_value(const struct gpio_desc *desc) |
7604 | { |
7605 | /* GPIO can never have been requested */ |
7606 | - WARN_ON(1); |
7607 | + WARN_ON(desc); |
7608 | return 0; |
7609 | } |
7610 | static inline int gpiod_get_array_value(unsigned int array_size, |
7611 | @@ -333,25 +333,25 @@ static inline int gpiod_get_array_value(unsigned int array_size, |
7612 | int *value_array) |
7613 | { |
7614 | /* GPIO can never have been requested */ |
7615 | - WARN_ON(1); |
7616 | + WARN_ON(desc_array); |
7617 | return 0; |
7618 | } |
7619 | static inline void gpiod_set_value(struct gpio_desc *desc, int value) |
7620 | { |
7621 | /* GPIO can never have been requested */ |
7622 | - WARN_ON(1); |
7623 | + WARN_ON(desc); |
7624 | } |
7625 | static inline void gpiod_set_array_value(unsigned int array_size, |
7626 | struct gpio_desc **desc_array, |
7627 | int *value_array) |
7628 | { |
7629 | /* GPIO can never have been requested */ |
7630 | - WARN_ON(1); |
7631 | + WARN_ON(desc_array); |
7632 | } |
7633 | static inline int gpiod_get_raw_value(const struct gpio_desc *desc) |
7634 | { |
7635 | /* GPIO can never have been requested */ |
7636 | - WARN_ON(1); |
7637 | + WARN_ON(desc); |
7638 | return 0; |
7639 | } |
7640 | static inline int gpiod_get_raw_array_value(unsigned int array_size, |
7641 | @@ -359,27 +359,27 @@ static inline int gpiod_get_raw_array_value(unsigned int array_size, |
7642 | int *value_array) |
7643 | { |
7644 | /* GPIO can never have been requested */ |
7645 | - WARN_ON(1); |
7646 | + WARN_ON(desc_array); |
7647 | return 0; |
7648 | } |
7649 | static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value) |
7650 | { |
7651 | /* GPIO can never have been requested */ |
7652 | - WARN_ON(1); |
7653 | + WARN_ON(desc); |
7654 | } |
7655 | static inline int gpiod_set_raw_array_value(unsigned int array_size, |
7656 | struct gpio_desc **desc_array, |
7657 | int *value_array) |
7658 | { |
7659 | /* GPIO can never have been requested */ |
7660 | - WARN_ON(1); |
7661 | + WARN_ON(desc_array); |
7662 | return 0; |
7663 | } |
7664 | |
7665 | static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc) |
7666 | { |
7667 | /* GPIO can never have been requested */ |
7668 | - WARN_ON(1); |
7669 | + WARN_ON(desc); |
7670 | return 0; |
7671 | } |
7672 | static inline int gpiod_get_array_value_cansleep(unsigned int array_size, |
7673 | @@ -387,25 +387,25 @@ static inline int gpiod_get_array_value_cansleep(unsigned int array_size, |
7674 | int *value_array) |
7675 | { |
7676 | /* GPIO can never have been requested */ |
7677 | - WARN_ON(1); |
7678 | + WARN_ON(desc_array); |
7679 | return 0; |
7680 | } |
7681 | static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value) |
7682 | { |
7683 | /* GPIO can never have been requested */ |
7684 | - WARN_ON(1); |
7685 | + WARN_ON(desc); |
7686 | } |
7687 | static inline void gpiod_set_array_value_cansleep(unsigned int array_size, |
7688 | struct gpio_desc **desc_array, |
7689 | int *value_array) |
7690 | { |
7691 | /* GPIO can never have been requested */ |
7692 | - WARN_ON(1); |
7693 | + WARN_ON(desc_array); |
7694 | } |
7695 | static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc) |
7696 | { |
7697 | /* GPIO can never have been requested */ |
7698 | - WARN_ON(1); |
7699 | + WARN_ON(desc); |
7700 | return 0; |
7701 | } |
7702 | static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size, |
7703 | @@ -413,55 +413,55 @@ static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size, |
7704 | int *value_array) |
7705 | { |
7706 | /* GPIO can never have been requested */ |
7707 | - WARN_ON(1); |
7708 | + WARN_ON(desc_array); |
7709 | return 0; |
7710 | } |
7711 | static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, |
7712 | int value) |
7713 | { |
7714 | /* GPIO can never have been requested */ |
7715 | - WARN_ON(1); |
7716 | + WARN_ON(desc); |
7717 | } |
7718 | static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size, |
7719 | struct gpio_desc **desc_array, |
7720 | int *value_array) |
7721 | { |
7722 | /* GPIO can never have been requested */ |
7723 | - WARN_ON(1); |
7724 | + WARN_ON(desc_array); |
7725 | return 0; |
7726 | } |
7727 | |
7728 | static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce) |
7729 | { |
7730 | /* GPIO can never have been requested */ |
7731 | - WARN_ON(1); |
7732 | + WARN_ON(desc); |
7733 | return -ENOSYS; |
7734 | } |
7735 | |
7736 | static inline int gpiod_set_transitory(struct gpio_desc *desc, bool transitory) |
7737 | { |
7738 | /* GPIO can never have been requested */ |
7739 | - WARN_ON(1); |
7740 | + WARN_ON(desc); |
7741 | return -ENOSYS; |
7742 | } |
7743 | |
7744 | static inline int gpiod_is_active_low(const struct gpio_desc *desc) |
7745 | { |
7746 | /* GPIO can never have been requested */ |
7747 | - WARN_ON(1); |
7748 | + WARN_ON(desc); |
7749 | return 0; |
7750 | } |
7751 | static inline int gpiod_cansleep(const struct gpio_desc *desc) |
7752 | { |
7753 | /* GPIO can never have been requested */ |
7754 | - WARN_ON(1); |
7755 | + WARN_ON(desc); |
7756 | return 0; |
7757 | } |
7758 | |
7759 | static inline int gpiod_to_irq(const struct gpio_desc *desc) |
7760 | { |
7761 | /* GPIO can never have been requested */ |
7762 | - WARN_ON(1); |
7763 | + WARN_ON(desc); |
7764 | return -EINVAL; |
7765 | } |
7766 | |
7767 | @@ -469,7 +469,7 @@ static inline int gpiod_set_consumer_name(struct gpio_desc *desc, |
7768 | const char *name) |
7769 | { |
7770 | /* GPIO can never have been requested */ |
7771 | - WARN_ON(1); |
7772 | + WARN_ON(desc); |
7773 | return -EINVAL; |
7774 | } |
7775 | |
7776 | @@ -481,7 +481,7 @@ static inline struct gpio_desc *gpio_to_desc(unsigned gpio) |
7777 | static inline int desc_to_gpio(const struct gpio_desc *desc) |
7778 | { |
7779 | /* GPIO can never have been requested */ |
7780 | - WARN_ON(1); |
7781 | + WARN_ON(desc); |
7782 | return -EINVAL; |
7783 | } |
7784 | |
7785 | diff --git a/include/media/cec.h b/include/media/cec.h |
7786 | index dc4b412e8fa1..59bf280e9715 100644 |
7787 | --- a/include/media/cec.h |
7788 | +++ b/include/media/cec.h |
7789 | @@ -333,67 +333,6 @@ void cec_queue_pin_5v_event(struct cec_adapter *adap, bool is_high, ktime_t ts); |
7790 | u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size, |
7791 | unsigned int *offset); |
7792 | |
7793 | -/** |
7794 | - * cec_set_edid_phys_addr() - find and set the physical address |
7795 | - * |
7796 | - * @edid: pointer to the EDID data |
7797 | - * @size: size in bytes of the EDID data |
7798 | - * @phys_addr: the new physical address |
7799 | - * |
7800 | - * This function finds the location of the physical address in the EDID |
7801 | - * and fills in the given physical address and updates the checksum |
7802 | - * at the end of the EDID block. It does nothing if the EDID doesn't |
7803 | - * contain a physical address. |
7804 | - */ |
7805 | -void cec_set_edid_phys_addr(u8 *edid, unsigned int size, u16 phys_addr); |
7806 | - |
7807 | -/** |
7808 | - * cec_phys_addr_for_input() - calculate the PA for an input |
7809 | - * |
7810 | - * @phys_addr: the physical address of the parent |
7811 | - * @input: the number of the input port, must be between 1 and 15 |
7812 | - * |
7813 | - * This function calculates a new physical address based on the input |
7814 | - * port number. For example: |
7815 | - * |
7816 | - * PA = 0.0.0.0 and input = 2 becomes 2.0.0.0 |
7817 | - * |
7818 | - * PA = 3.0.0.0 and input = 1 becomes 3.1.0.0 |
7819 | - * |
7820 | - * PA = 3.2.1.0 and input = 5 becomes 3.2.1.5 |
7821 | - * |
7822 | - * PA = 3.2.1.3 and input = 5 becomes f.f.f.f since it maxed out the depth. |
7823 | - * |
7824 | - * Return: the new physical address or CEC_PHYS_ADDR_INVALID. |
7825 | - */ |
7826 | -u16 cec_phys_addr_for_input(u16 phys_addr, u8 input); |
7827 | - |
7828 | -/** |
7829 | - * cec_phys_addr_validate() - validate a physical address from an EDID |
7830 | - * |
7831 | - * @phys_addr: the physical address to validate |
7832 | - * @parent: if not %NULL, then this is filled with the parents PA. |
7833 | - * @port: if not %NULL, then this is filled with the input port. |
7834 | - * |
7835 | - * This validates a physical address as read from an EDID. If the |
7836 | - * PA is invalid (such as 1.0.1.0 since '0' is only allowed at the end), |
7837 | - * then it will return -EINVAL. |
7838 | - * |
7839 | - * The parent PA is passed into %parent and the input port is passed into |
7840 | - * %port. For example: |
7841 | - * |
7842 | - * PA = 0.0.0.0: has parent 0.0.0.0 and input port 0. |
7843 | - * |
7844 | - * PA = 1.0.0.0: has parent 0.0.0.0 and input port 1. |
7845 | - * |
7846 | - * PA = 3.2.0.0: has parent 3.0.0.0 and input port 2. |
7847 | - * |
7848 | - * PA = f.f.f.f: has parent f.f.f.f and input port 0. |
7849 | - * |
7850 | - * Return: 0 if the PA is valid, -EINVAL if not. |
7851 | - */ |
7852 | -int cec_phys_addr_validate(u16 phys_addr, u16 *parent, u16 *port); |
7853 | - |
7854 | #else |
7855 | |
7856 | static inline int cec_register_adapter(struct cec_adapter *adap, |
7857 | @@ -428,25 +367,6 @@ static inline u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size, |
7858 | return CEC_PHYS_ADDR_INVALID; |
7859 | } |
7860 | |
7861 | -static inline void cec_set_edid_phys_addr(u8 *edid, unsigned int size, |
7862 | - u16 phys_addr) |
7863 | -{ |
7864 | -} |
7865 | - |
7866 | -static inline u16 cec_phys_addr_for_input(u16 phys_addr, u8 input) |
7867 | -{ |
7868 | - return CEC_PHYS_ADDR_INVALID; |
7869 | -} |
7870 | - |
7871 | -static inline int cec_phys_addr_validate(u16 phys_addr, u16 *parent, u16 *port) |
7872 | -{ |
7873 | - if (parent) |
7874 | - *parent = phys_addr; |
7875 | - if (port) |
7876 | - *port = 0; |
7877 | - return 0; |
7878 | -} |
7879 | - |
7880 | #endif |
7881 | |
7882 | /** |
7883 | diff --git a/include/media/v4l2-dv-timings.h b/include/media/v4l2-dv-timings.h |
7884 | index 17cb27df1b81..4e7732d3908c 100644 |
7885 | --- a/include/media/v4l2-dv-timings.h |
7886 | +++ b/include/media/v4l2-dv-timings.h |
7887 | @@ -234,4 +234,10 @@ v4l2_hdmi_rx_colorimetry(const struct hdmi_avi_infoframe *avi, |
7888 | const struct hdmi_vendor_infoframe *hdmi, |
7889 | unsigned int height); |
7890 | |
7891 | +u16 v4l2_get_edid_phys_addr(const u8 *edid, unsigned int size, |
7892 | + unsigned int *offset); |
7893 | +void v4l2_set_edid_phys_addr(u8 *edid, unsigned int size, u16 phys_addr); |
7894 | +u16 v4l2_phys_addr_for_input(u16 phys_addr, u8 input); |
7895 | +int v4l2_phys_addr_validate(u16 phys_addr, u16 *parent, u16 *port); |
7896 | + |
7897 | #endif |
7898 | diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h |
7899 | index 67e0a990144a..468deae5d603 100644 |
7900 | --- a/include/net/cfg80211.h |
7901 | +++ b/include/net/cfg80211.h |
7902 | @@ -6562,6 +6562,21 @@ int cfg80211_external_auth_request(struct net_device *netdev, |
7903 | struct cfg80211_external_auth_params *params, |
7904 | gfp_t gfp); |
7905 | |
7906 | +/** |
7907 | + * cfg80211_iftype_allowed - check whether the interface can be allowed |
7908 | + * @wiphy: the wiphy |
7909 | + * @iftype: interface type |
7910 | + * @is_4addr: use_4addr flag, must be '0' when check_swif is '1' |
7911 | + * @check_swif: check iftype against software interfaces |
7912 | + * |
7913 | + * Check whether the interface is allowed to operate; additionally, this API |
7914 | + * can be used to check iftype against the software interfaces when |
7915 | + * check_swif is '1'. |
7916 | + */ |
7917 | +bool cfg80211_iftype_allowed(struct wiphy *wiphy, enum nl80211_iftype iftype, |
7918 | + bool is_4addr, u8 check_swif); |
7919 | + |
7920 | + |
7921 | /* Logging, debugging and troubleshooting/diagnostic helpers. */ |
7922 | |
7923 | /* wiphy_printk helpers, similar to dev_printk */ |
7924 | diff --git a/include/uapi/linux/keyctl.h b/include/uapi/linux/keyctl.h |
7925 | index 7b8c9e19bad1..0f3cb13db8e9 100644 |
7926 | --- a/include/uapi/linux/keyctl.h |
7927 | +++ b/include/uapi/linux/keyctl.h |
7928 | @@ -65,7 +65,12 @@ |
7929 | |
7930 | /* keyctl structures */ |
7931 | struct keyctl_dh_params { |
7932 | - __s32 private; |
7933 | + union { |
7934 | +#ifndef __cplusplus |
7935 | + __s32 private; |
7936 | +#endif |
7937 | + __s32 priv; |
7938 | + }; |
7939 | __s32 prime; |
7940 | __s32 base; |
7941 | }; |
7942 | diff --git a/kernel/module.c b/kernel/module.c |
7943 | index 3fda10c549a2..0d86fc73d63d 100644 |
7944 | --- a/kernel/module.c |
7945 | +++ b/kernel/module.c |
7946 | @@ -76,14 +76,9 @@ |
7947 | |
7948 | /* |
7949 | * Modules' sections will be aligned on page boundaries |
7950 | - * to ensure complete separation of code and data, but |
7951 | - * only when CONFIG_STRICT_MODULE_RWX=y |
7952 | + * to ensure complete separation of code and data |
7953 | */ |
7954 | -#ifdef CONFIG_STRICT_MODULE_RWX |
7955 | # define debug_align(X) ALIGN(X, PAGE_SIZE) |
7956 | -#else |
7957 | -# define debug_align(X) (X) |
7958 | -#endif |
7959 | |
7960 | /* If this is set, the section belongs in the init part of the module */ |
7961 | #define INIT_OFFSET_MASK (1UL << (BITS_PER_LONG-1)) |
7962 | @@ -1699,6 +1694,8 @@ static int add_usage_links(struct module *mod) |
7963 | return ret; |
7964 | } |
7965 | |
7966 | +static void module_remove_modinfo_attrs(struct module *mod, int end); |
7967 | + |
7968 | static int module_add_modinfo_attrs(struct module *mod) |
7969 | { |
7970 | struct module_attribute *attr; |
7971 | @@ -1713,24 +1710,34 @@ static int module_add_modinfo_attrs(struct module *mod) |
7972 | return -ENOMEM; |
7973 | |
7974 | temp_attr = mod->modinfo_attrs; |
7975 | - for (i = 0; (attr = modinfo_attrs[i]) && !error; i++) { |
7976 | + for (i = 0; (attr = modinfo_attrs[i]); i++) { |
7977 | if (!attr->test || attr->test(mod)) { |
7978 | memcpy(temp_attr, attr, sizeof(*temp_attr)); |
7979 | sysfs_attr_init(&temp_attr->attr); |
7980 | error = sysfs_create_file(&mod->mkobj.kobj, |
7981 | &temp_attr->attr); |
7982 | + if (error) |
7983 | + goto error_out; |
7984 | ++temp_attr; |
7985 | } |
7986 | } |
7987 | + |
7988 | + return 0; |
7989 | + |
7990 | +error_out: |
7991 | + if (i > 0) |
7992 | + module_remove_modinfo_attrs(mod, --i); |
7993 | return error; |
7994 | } |
7995 | |
7996 | -static void module_remove_modinfo_attrs(struct module *mod) |
7997 | +static void module_remove_modinfo_attrs(struct module *mod, int end) |
7998 | { |
7999 | struct module_attribute *attr; |
8000 | int i; |
8001 | |
8002 | for (i = 0; (attr = &mod->modinfo_attrs[i]); i++) { |
8003 | + if (end >= 0 && i > end) |
8004 | + break; |
8005 | /* pick a field to test for end of list */ |
8006 | if (!attr->attr.name) |
8007 | break; |
8008 | @@ -1818,7 +1825,7 @@ static int mod_sysfs_setup(struct module *mod, |
8009 | return 0; |
8010 | |
8011 | out_unreg_modinfo_attrs: |
8012 | - module_remove_modinfo_attrs(mod); |
8013 | + module_remove_modinfo_attrs(mod, -1); |
8014 | out_unreg_param: |
8015 | module_param_sysfs_remove(mod); |
8016 | out_unreg_holders: |
8017 | @@ -1854,7 +1861,7 @@ static void mod_sysfs_fini(struct module *mod) |
8018 | { |
8019 | } |
8020 | |
8021 | -static void module_remove_modinfo_attrs(struct module *mod) |
8022 | +static void module_remove_modinfo_attrs(struct module *mod, int end) |
8023 | { |
8024 | } |
8025 | |
8026 | @@ -1870,7 +1877,7 @@ static void init_param_lock(struct module *mod) |
8027 | static void mod_sysfs_teardown(struct module *mod) |
8028 | { |
8029 | del_usage_links(mod); |
8030 | - module_remove_modinfo_attrs(mod); |
8031 | + module_remove_modinfo_attrs(mod, -1); |
8032 | module_param_sysfs_remove(mod); |
8033 | kobject_put(mod->mkobj.drivers_dir); |
8034 | kobject_put(mod->holders_dir); |
8035 | diff --git a/kernel/resource.c b/kernel/resource.c |
8036 | index 30e1bc68503b..bce773cc5e41 100644 |
8037 | --- a/kernel/resource.c |
8038 | +++ b/kernel/resource.c |
8039 | @@ -318,24 +318,27 @@ int release_resource(struct resource *old) |
8040 | |
8041 | EXPORT_SYMBOL(release_resource); |
8042 | |
8043 | -/* |
8044 | - * Finds the lowest iomem resource existing within [res->start.res->end). |
8045 | - * The caller must specify res->start, res->end, res->flags, and optionally |
8046 | - * desc. If found, returns 0, res is overwritten, if not found, returns -1. |
8047 | - * This function walks the whole tree and not just first level children until |
8048 | - * and unless first_level_children_only is true. |
8049 | +/** |
8050 | + * Finds the lowest iomem resource that covers part of [start..end]. The |
8051 | + * caller must specify start, end, flags, and desc (which may be |
8052 | + * IORES_DESC_NONE). |
8053 | + * |
8054 | + * If a resource is found, returns 0 and *res is overwritten with the part |
8055 | + * of the resource that's within [start..end]; if none is found, returns |
8056 | + * -ENODEV. Returns -EINVAL for invalid parameters. |
8057 | + * |
8058 | + * This function walks the whole tree and not just first level children |
8059 | + * unless @first_level_children_only is true. |
8060 | */ |
8061 | -static int find_next_iomem_res(struct resource *res, unsigned long desc, |
8062 | - bool first_level_children_only) |
8063 | +static int find_next_iomem_res(resource_size_t start, resource_size_t end, |
8064 | + unsigned long flags, unsigned long desc, |
8065 | + bool first_level_children_only, |
8066 | + struct resource *res) |
8067 | { |
8068 | - resource_size_t start, end; |
8069 | struct resource *p; |
8070 | bool sibling_only = false; |
8071 | |
8072 | BUG_ON(!res); |
8073 | - |
8074 | - start = res->start; |
8075 | - end = res->end; |
8076 | BUG_ON(start >= end); |
8077 | |
8078 | if (first_level_children_only) |
8079 | @@ -344,7 +347,7 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc, |
8080 | read_lock(&resource_lock); |
8081 | |
8082 | for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) { |
8083 | - if ((p->flags & res->flags) != res->flags) |
8084 | + if ((p->flags & flags) != flags) |
8085 | continue; |
8086 | if ((desc != IORES_DESC_NONE) && (desc != p->desc)) |
8087 | continue; |
8088 | @@ -352,39 +355,38 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc, |
8089 | p = NULL; |
8090 | break; |
8091 | } |
8092 | - if ((p->end >= start) && (p->start < end)) |
8093 | + if ((p->end >= start) && (p->start <= end)) |
8094 | break; |
8095 | } |
8096 | |
8097 | + if (p) { |
8098 | + /* copy data */ |
8099 | + res->start = max(start, p->start); |
8100 | + res->end = min(end, p->end); |
8101 | + res->flags = p->flags; |
8102 | + res->desc = p->desc; |
8103 | + } |
8104 | + |
8105 | read_unlock(&resource_lock); |
8106 | - if (!p) |
8107 | - return -1; |
8108 | - /* copy data */ |
8109 | - if (res->start < p->start) |
8110 | - res->start = p->start; |
8111 | - if (res->end > p->end) |
8112 | - res->end = p->end; |
8113 | - res->flags = p->flags; |
8114 | - res->desc = p->desc; |
8115 | - return 0; |
8116 | + return p ? 0 : -ENODEV; |
8117 | } |
8118 | |
8119 | -static int __walk_iomem_res_desc(struct resource *res, unsigned long desc, |
8120 | - bool first_level_children_only, |
8121 | - void *arg, |
8122 | +static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end, |
8123 | + unsigned long flags, unsigned long desc, |
8124 | + bool first_level_children_only, void *arg, |
8125 | int (*func)(struct resource *, void *)) |
8126 | { |
8127 | - u64 orig_end = res->end; |
8128 | + struct resource res; |
8129 | int ret = -1; |
8130 | |
8131 | - while ((res->start < res->end) && |
8132 | - !find_next_iomem_res(res, desc, first_level_children_only)) { |
8133 | - ret = (*func)(res, arg); |
8134 | + while (start < end && |
8135 | + !find_next_iomem_res(start, end, flags, desc, |
8136 | + first_level_children_only, &res)) { |
8137 | + ret = (*func)(&res, arg); |
8138 | if (ret) |
8139 | break; |
8140 | |
8141 | - res->start = res->end + 1; |
8142 | - res->end = orig_end; |
8143 | + start = res.end + 1; |
8144 | } |
8145 | |
8146 | return ret; |
8147 | @@ -407,13 +409,7 @@ static int __walk_iomem_res_desc(struct resource *res, unsigned long desc, |
8148 | int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, |
8149 | u64 end, void *arg, int (*func)(struct resource *, void *)) |
8150 | { |
8151 | - struct resource res; |
8152 | - |
8153 | - res.start = start; |
8154 | - res.end = end; |
8155 | - res.flags = flags; |
8156 | - |
8157 | - return __walk_iomem_res_desc(&res, desc, false, arg, func); |
8158 | + return __walk_iomem_res_desc(start, end, flags, desc, false, arg, func); |
8159 | } |
8160 | EXPORT_SYMBOL_GPL(walk_iomem_res_desc); |
8161 | |
8162 | @@ -427,13 +423,9 @@ EXPORT_SYMBOL_GPL(walk_iomem_res_desc); |
8163 | int walk_system_ram_res(u64 start, u64 end, void *arg, |
8164 | int (*func)(struct resource *, void *)) |
8165 | { |
8166 | - struct resource res; |
8167 | + unsigned long flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; |
8168 | |
8169 | - res.start = start; |
8170 | - res.end = end; |
8171 | - res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; |
8172 | - |
8173 | - return __walk_iomem_res_desc(&res, IORES_DESC_NONE, true, |
8174 | + return __walk_iomem_res_desc(start, end, flags, IORES_DESC_NONE, true, |
8175 | arg, func); |
8176 | } |
8177 | |
8178 | @@ -444,13 +436,9 @@ int walk_system_ram_res(u64 start, u64 end, void *arg, |
8179 | int walk_mem_res(u64 start, u64 end, void *arg, |
8180 | int (*func)(struct resource *, void *)) |
8181 | { |
8182 | - struct resource res; |
8183 | + unsigned long flags = IORESOURCE_MEM | IORESOURCE_BUSY; |
8184 | |
8185 | - res.start = start; |
8186 | - res.end = end; |
8187 | - res.flags = IORESOURCE_MEM | IORESOURCE_BUSY; |
8188 | - |
8189 | - return __walk_iomem_res_desc(&res, IORES_DESC_NONE, true, |
8190 | + return __walk_iomem_res_desc(start, end, flags, IORES_DESC_NONE, true, |
8191 | arg, func); |
8192 | } |
8193 | |
8194 | @@ -464,25 +452,25 @@ int walk_mem_res(u64 start, u64 end, void *arg, |
8195 | int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, |
8196 | void *arg, int (*func)(unsigned long, unsigned long, void *)) |
8197 | { |
8198 | + resource_size_t start, end; |
8199 | + unsigned long flags; |
8200 | struct resource res; |
8201 | unsigned long pfn, end_pfn; |
8202 | - u64 orig_end; |
8203 | int ret = -1; |
8204 | |
8205 | - res.start = (u64) start_pfn << PAGE_SHIFT; |
8206 | - res.end = ((u64)(start_pfn + nr_pages) << PAGE_SHIFT) - 1; |
8207 | - res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; |
8208 | - orig_end = res.end; |
8209 | - while ((res.start < res.end) && |
8210 | - (find_next_iomem_res(&res, IORES_DESC_NONE, true) >= 0)) { |
8211 | + start = (u64) start_pfn << PAGE_SHIFT; |
8212 | + end = ((u64)(start_pfn + nr_pages) << PAGE_SHIFT) - 1; |
8213 | + flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; |
8214 | + while (start < end && |
8215 | + !find_next_iomem_res(start, end, flags, IORES_DESC_NONE, |
8216 | + true, &res)) { |
8217 | pfn = (res.start + PAGE_SIZE - 1) >> PAGE_SHIFT; |
8218 | end_pfn = (res.end + 1) >> PAGE_SHIFT; |
8219 | if (end_pfn > pfn) |
8220 | ret = (*func)(pfn, end_pfn - pfn, arg); |
8221 | if (ret) |
8222 | break; |
8223 | - res.start = res.end + 1; |
8224 | - res.end = orig_end; |
8225 | + start = res.end + 1; |
8226 | } |
8227 | return ret; |
8228 | } |
8229 | diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c |
8230 | index 75f322603d44..49ed38914669 100644 |
8231 | --- a/kernel/sched/fair.c |
8232 | +++ b/kernel/sched/fair.c |
8233 | @@ -4420,6 +4420,8 @@ static void __account_cfs_rq_runtime(struct cfs_rq *cfs_rq, u64 delta_exec) |
8234 | if (likely(cfs_rq->runtime_remaining > 0)) |
8235 | return; |
8236 | |
8237 | + if (cfs_rq->throttled) |
8238 | + return; |
8239 | /* |
8240 | * if we're unable to extend our runtime we resched so that the active |
8241 | * hierarchy can be throttled |
8242 | @@ -4615,6 +4617,9 @@ static u64 distribute_cfs_runtime(struct cfs_bandwidth *cfs_b, |
8243 | if (!cfs_rq_throttled(cfs_rq)) |
8244 | goto next; |
8245 | |
8246 | + /* By the above check, this should never be true */ |
8247 | + SCHED_WARN_ON(cfs_rq->runtime_remaining > 0); |
8248 | + |
8249 | runtime = -cfs_rq->runtime_remaining + 1; |
8250 | if (runtime > remaining) |
8251 | runtime = remaining; |
8252 | diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c |
8253 | index 443edcddac8a..c2708e1f0c69 100644 |
8254 | --- a/kernel/time/timekeeping.c |
8255 | +++ b/kernel/time/timekeeping.c |
8256 | @@ -823,7 +823,7 @@ ktime_t ktime_get_coarse_with_offset(enum tk_offsets offs) |
8257 | |
8258 | } while (read_seqcount_retry(&tk_core.seq, seq)); |
8259 | |
8260 | - return base + nsecs; |
8261 | + return ktime_add_ns(base, nsecs); |
8262 | } |
8263 | EXPORT_SYMBOL_GPL(ktime_get_coarse_with_offset); |
8264 | |
8265 | diff --git a/mm/migrate.c b/mm/migrate.c |
8266 | index b2ea7d1e6f24..0c48191a9036 100644 |
8267 | --- a/mm/migrate.c |
8268 | +++ b/mm/migrate.c |
8269 | @@ -2328,16 +2328,13 @@ next: |
8270 | */ |
8271 | static void migrate_vma_collect(struct migrate_vma *migrate) |
8272 | { |
8273 | - struct mm_walk mm_walk; |
8274 | - |
8275 | - mm_walk.pmd_entry = migrate_vma_collect_pmd; |
8276 | - mm_walk.pte_entry = NULL; |
8277 | - mm_walk.pte_hole = migrate_vma_collect_hole; |
8278 | - mm_walk.hugetlb_entry = NULL; |
8279 | - mm_walk.test_walk = NULL; |
8280 | - mm_walk.vma = migrate->vma; |
8281 | - mm_walk.mm = migrate->vma->vm_mm; |
8282 | - mm_walk.private = migrate; |
8283 | + struct mm_walk mm_walk = { |
8284 | + .pmd_entry = migrate_vma_collect_pmd, |
8285 | + .pte_hole = migrate_vma_collect_hole, |
8286 | + .vma = migrate->vma, |
8287 | + .mm = migrate->vma->vm_mm, |
8288 | + .private = migrate, |
8289 | + }; |
8290 | |
8291 | mmu_notifier_invalidate_range_start(mm_walk.mm, |
8292 | migrate->start, |
8293 | diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c |
8294 | index 0b7b36fa0d5c..36f244125d24 100644 |
8295 | --- a/net/batman-adv/bat_iv_ogm.c |
8296 | +++ b/net/batman-adv/bat_iv_ogm.c |
8297 | @@ -463,17 +463,23 @@ static u8 batadv_hop_penalty(u8 tq, const struct batadv_priv *bat_priv) |
8298 | * batadv_iv_ogm_aggr_packet() - checks if there is another OGM attached |
8299 | * @buff_pos: current position in the skb |
8300 | * @packet_len: total length of the skb |
8301 | - * @tvlv_len: tvlv length of the previously considered OGM |
8302 | + * @ogm_packet: potential OGM in buffer |
8303 | * |
8304 | * Return: true if there is enough space for another OGM, false otherwise. |
8305 | */ |
8306 | -static bool batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len, |
8307 | - __be16 tvlv_len) |
8308 | +static bool |
8309 | +batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len, |
8310 | + const struct batadv_ogm_packet *ogm_packet) |
8311 | { |
8312 | int next_buff_pos = 0; |
8313 | |
8314 | - next_buff_pos += buff_pos + BATADV_OGM_HLEN; |
8315 | - next_buff_pos += ntohs(tvlv_len); |
8316 | + /* check if there is enough space for the header */ |
8317 | + next_buff_pos += buff_pos + sizeof(*ogm_packet); |
8318 | + if (next_buff_pos > packet_len) |
8319 | + return false; |
8320 | + |
8321 | + /* check if there is enough space for the optional TVLV */ |
8322 | + next_buff_pos += ntohs(ogm_packet->tvlv_len); |
8323 | |
8324 | return (next_buff_pos <= packet_len) && |
8325 | (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES); |
8326 | @@ -501,7 +507,7 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet, |
8327 | |
8328 | /* adjust all flags and log packets */ |
8329 | while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len, |
8330 | - batadv_ogm_packet->tvlv_len)) { |
8331 | + batadv_ogm_packet)) { |
8332 | /* we might have aggregated direct link packets with an |
8333 | * ordinary base packet |
8334 | */ |
8335 | @@ -1852,7 +1858,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, |
8336 | |
8337 | /* unpack the aggregated packets and process them one by one */ |
8338 | while (batadv_iv_ogm_aggr_packet(ogm_offset, skb_headlen(skb), |
8339 | - ogm_packet->tvlv_len)) { |
8340 | + ogm_packet)) { |
8341 | batadv_iv_ogm_process(skb, ogm_offset, if_incoming); |
8342 | |
8343 | ogm_offset += BATADV_OGM_HLEN; |
8344 | diff --git a/net/batman-adv/netlink.c b/net/batman-adv/netlink.c |
8345 | index 0d9459b69bdb..c32820963b8e 100644 |
8346 | --- a/net/batman-adv/netlink.c |
8347 | +++ b/net/batman-adv/netlink.c |
8348 | @@ -118,7 +118,7 @@ batadv_netlink_get_ifindex(const struct nlmsghdr *nlh, int attrtype) |
8349 | { |
8350 | struct nlattr *attr = nlmsg_find_attr(nlh, GENL_HDRLEN, attrtype); |
8351 | |
8352 | - return attr ? nla_get_u32(attr) : 0; |
8353 | + return (attr && nla_len(attr) == sizeof(u32)) ? nla_get_u32(attr) : 0; |
8354 | } |
8355 | |
8356 | /** |
8357 | diff --git a/net/mac80211/util.c b/net/mac80211/util.c |
8358 | index c59638574cf8..f101a6460b44 100644 |
8359 | --- a/net/mac80211/util.c |
8360 | +++ b/net/mac80211/util.c |
8361 | @@ -3527,9 +3527,7 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata, |
8362 | } |
8363 | |
8364 | /* Always allow software iftypes */ |
8365 | - if (local->hw.wiphy->software_iftypes & BIT(iftype) || |
8366 | - (iftype == NL80211_IFTYPE_AP_VLAN && |
8367 | - local->hw.wiphy->flags & WIPHY_FLAG_4ADDR_AP)) { |
8368 | + if (cfg80211_iftype_allowed(local->hw.wiphy, iftype, 0, 1)) { |
8369 | if (radar_detect) |
8370 | return -EINVAL; |
8371 | return 0; |
8372 | @@ -3564,7 +3562,8 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata, |
8373 | |
8374 | if (sdata_iter == sdata || |
8375 | !ieee80211_sdata_running(sdata_iter) || |
8376 | - local->hw.wiphy->software_iftypes & BIT(wdev_iter->iftype)) |
8377 | + cfg80211_iftype_allowed(local->hw.wiphy, |
8378 | + wdev_iter->iftype, 0, 1)) |
8379 | continue; |
8380 | |
8381 | params.iftype_num[wdev_iter->iftype]++; |
8382 | diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c |
8383 | index 9c7da811d130..98f193fd5315 100644 |
8384 | --- a/net/vmw_vsock/hyperv_transport.c |
8385 | +++ b/net/vmw_vsock/hyperv_transport.c |
8386 | @@ -320,6 +320,11 @@ static void hvs_close_connection(struct vmbus_channel *chan) |
8387 | lock_sock(sk); |
8388 | hvs_do_close_lock_held(vsock_sk(sk), true); |
8389 | release_sock(sk); |
8390 | + |
8391 | + /* Release the refcnt for the channel that's opened in |
8392 | + * hvs_open_connection(). |
8393 | + */ |
8394 | + sock_put(sk); |
8395 | } |
8396 | |
8397 | static void hvs_open_connection(struct vmbus_channel *chan) |
8398 | @@ -388,6 +393,9 @@ static void hvs_open_connection(struct vmbus_channel *chan) |
8399 | } |
8400 | |
8401 | set_per_channel_state(chan, conn_from_host ? new : sk); |
8402 | + |
8403 | + /* This reference will be dropped by hvs_close_connection(). */ |
8404 | + sock_hold(conn_from_host ? new : sk); |
8405 | vmbus_set_chn_rescind_callback(chan, hvs_close_connection); |
8406 | |
8407 | /* Set the pending send size to max packet size to always get |
8408 | diff --git a/net/wireless/core.c b/net/wireless/core.c |
8409 | index 2a46ec3cb72c..68660781aa51 100644 |
8410 | --- a/net/wireless/core.c |
8411 | +++ b/net/wireless/core.c |
8412 | @@ -1335,10 +1335,8 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb, |
8413 | } |
8414 | break; |
8415 | case NETDEV_PRE_UP: |
8416 | - if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)) && |
8417 | - !(wdev->iftype == NL80211_IFTYPE_AP_VLAN && |
8418 | - rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP && |
8419 | - wdev->use_4addr)) |
8420 | + if (!cfg80211_iftype_allowed(wdev->wiphy, wdev->iftype, |
8421 | + wdev->use_4addr, 0)) |
8422 | return notifier_from_errno(-EOPNOTSUPP); |
8423 | |
8424 | if (rfkill_blocked(rdev->rfkill)) |
8425 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
8426 | index 8e2f03ab4cc9..2a85bff6a8f3 100644 |
8427 | --- a/net/wireless/nl80211.c |
8428 | +++ b/net/wireless/nl80211.c |
8429 | @@ -3210,9 +3210,7 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) |
8430 | return err; |
8431 | } |
8432 | |
8433 | - if (!(rdev->wiphy.interface_modes & (1 << type)) && |
8434 | - !(type == NL80211_IFTYPE_AP_VLAN && params.use_4addr && |
8435 | - rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP)) |
8436 | + if (!cfg80211_iftype_allowed(&rdev->wiphy, type, params.use_4addr, 0)) |
8437 | return -EOPNOTSUPP; |
8438 | |
8439 | err = nl80211_parse_mon_options(rdev, type, info, ¶ms); |
8440 | diff --git a/net/wireless/util.c b/net/wireless/util.c |
8441 | index d57e2f679a3e..c14e8f6e5e19 100644 |
8442 | --- a/net/wireless/util.c |
8443 | +++ b/net/wireless/util.c |
8444 | @@ -1670,7 +1670,7 @@ int cfg80211_iter_combinations(struct wiphy *wiphy, |
8445 | for (iftype = 0; iftype < NUM_NL80211_IFTYPES; iftype++) { |
8446 | num_interfaces += params->iftype_num[iftype]; |
8447 | if (params->iftype_num[iftype] > 0 && |
8448 | - !(wiphy->software_iftypes & BIT(iftype))) |
8449 | + !cfg80211_iftype_allowed(wiphy, iftype, 0, 1)) |
8450 | used_iftypes |= BIT(iftype); |
8451 | } |
8452 | |
8453 | @@ -1692,7 +1692,7 @@ int cfg80211_iter_combinations(struct wiphy *wiphy, |
8454 | return -ENOMEM; |
8455 | |
8456 | for (iftype = 0; iftype < NUM_NL80211_IFTYPES; iftype++) { |
8457 | - if (wiphy->software_iftypes & BIT(iftype)) |
8458 | + if (cfg80211_iftype_allowed(wiphy, iftype, 0, 1)) |
8459 | continue; |
8460 | for (j = 0; j < c->n_limits; j++) { |
8461 | all_iftypes |= limits[j].types; |
8462 | @@ -1895,3 +1895,26 @@ EXPORT_SYMBOL(rfc1042_header); |
8463 | const unsigned char bridge_tunnel_header[] __aligned(2) = |
8464 | { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; |
8465 | EXPORT_SYMBOL(bridge_tunnel_header); |
8466 | + |
8467 | +bool cfg80211_iftype_allowed(struct wiphy *wiphy, enum nl80211_iftype iftype, |
8468 | + bool is_4addr, u8 check_swif) |
8469 | + |
8470 | +{ |
8471 | + bool is_vlan = iftype == NL80211_IFTYPE_AP_VLAN; |
8472 | + |
8473 | + switch (check_swif) { |
8474 | + case 0: |
8475 | + if (is_vlan && is_4addr) |
8476 | + return wiphy->flags & WIPHY_FLAG_4ADDR_AP; |
8477 | + return wiphy->interface_modes & BIT(iftype); |
8478 | + case 1: |
8479 | + if (!(wiphy->software_iftypes & BIT(iftype)) && is_vlan) |
8480 | + return wiphy->flags & WIPHY_FLAG_4ADDR_AP; |
8481 | + return wiphy->software_iftypes & BIT(iftype); |
8482 | + default: |
8483 | + break; |
8484 | + } |
8485 | + |
8486 | + return false; |
8487 | +} |
8488 | +EXPORT_SYMBOL(cfg80211_iftype_allowed); |
8489 | diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh |
8490 | index c4a9ddb174bc..5aa75a0a1ced 100755 |
8491 | --- a/scripts/decode_stacktrace.sh |
8492 | +++ b/scripts/decode_stacktrace.sh |
8493 | @@ -78,7 +78,7 @@ parse_symbol() { |
8494 | fi |
8495 | |
8496 | # Strip out the base of the path |
8497 | - code=${code//^$basepath/""} |
8498 | + code=${code#$basepath/} |
8499 | |
8500 | # In the case of inlines, move everything to same line |
8501 | code=${code//$'\n'/' '} |
8502 | diff --git a/security/apparmor/policy_unpack.c b/security/apparmor/policy_unpack.c |
8503 | index 088ea2ac8570..612f737cee83 100644 |
8504 | --- a/security/apparmor/policy_unpack.c |
8505 | +++ b/security/apparmor/policy_unpack.c |
8506 | @@ -223,16 +223,21 @@ static void *kvmemdup(const void *src, size_t len) |
8507 | static size_t unpack_u16_chunk(struct aa_ext *e, char **chunk) |
8508 | { |
8509 | size_t size = 0; |
8510 | + void *pos = e->pos; |
8511 | |
8512 | if (!inbounds(e, sizeof(u16))) |
8513 | - return 0; |
8514 | + goto fail; |
8515 | size = le16_to_cpu(get_unaligned((__le16 *) e->pos)); |
8516 | e->pos += sizeof(__le16); |
8517 | if (!inbounds(e, size)) |
8518 | - return 0; |
8519 | + goto fail; |
8520 | *chunk = e->pos; |
8521 | e->pos += size; |
8522 | return size; |
8523 | + |
8524 | +fail: |
8525 | + e->pos = pos; |
8526 | + return 0; |
8527 | } |
8528 | |
8529 | /* unpack control byte */ |
8530 | @@ -294,49 +299,66 @@ fail: |
8531 | |
8532 | static bool unpack_u32(struct aa_ext *e, u32 *data, const char *name) |
8533 | { |
8534 | + void *pos = e->pos; |
8535 | + |
8536 | if (unpack_nameX(e, AA_U32, name)) { |
8537 | if (!inbounds(e, sizeof(u32))) |
8538 | - return 0; |
8539 | + goto fail; |
8540 | if (data) |
8541 | *data = le32_to_cpu(get_unaligned((__le32 *) e->pos)); |
8542 | e->pos += sizeof(u32); |
8543 | return 1; |
8544 | } |
8545 | + |
8546 | +fail: |
8547 | + e->pos = pos; |
8548 | return 0; |
8549 | } |
8550 | |
8551 | static bool unpack_u64(struct aa_ext *e, u64 *data, const char *name) |
8552 | { |
8553 | + void *pos = e->pos; |
8554 | + |
8555 | if (unpack_nameX(e, AA_U64, name)) { |
8556 | if (!inbounds(e, sizeof(u64))) |
8557 | - return 0; |
8558 | + goto fail; |
8559 | if (data) |
8560 | *data = le64_to_cpu(get_unaligned((__le64 *) e->pos)); |
8561 | e->pos += sizeof(u64); |
8562 | return 1; |
8563 | } |
8564 | + |
8565 | +fail: |
8566 | + e->pos = pos; |
8567 | return 0; |
8568 | } |
8569 | |
8570 | static size_t unpack_array(struct aa_ext *e, const char *name) |
8571 | { |
8572 | + void *pos = e->pos; |
8573 | + |
8574 | if (unpack_nameX(e, AA_ARRAY, name)) { |
8575 | int size; |
8576 | if (!inbounds(e, sizeof(u16))) |
8577 | - return 0; |
8578 | + goto fail; |
8579 | size = (int)le16_to_cpu(get_unaligned((__le16 *) e->pos)); |
8580 | e->pos += sizeof(u16); |
8581 | return size; |
8582 | } |
8583 | + |
8584 | +fail: |
8585 | + e->pos = pos; |
8586 | return 0; |
8587 | } |
8588 | |
8589 | static size_t unpack_blob(struct aa_ext *e, char **blob, const char *name) |
8590 | { |
8591 | + void *pos = e->pos; |
8592 | + |
8593 | if (unpack_nameX(e, AA_BLOB, name)) { |
8594 | u32 size; |
8595 | if (!inbounds(e, sizeof(u32))) |
8596 | - return 0; |
8597 | + goto fail; |
8598 | size = le32_to_cpu(get_unaligned((__le32 *) e->pos)); |
8599 | e->pos += sizeof(u32); |
8600 | if (inbounds(e, (size_t) size)) { |
8601 | @@ -345,6 +367,9 @@ static size_t unpack_blob(struct aa_ext *e, char **blob, const char *name) |
8602 | return size; |
8603 | } |
8604 | } |
8605 | + |
8606 | +fail: |
8607 | + e->pos = pos; |
8608 | return 0; |
8609 | } |
8610 | |
8611 | @@ -361,9 +386,10 @@ static int unpack_str(struct aa_ext *e, const char **string, const char *name) |
8612 | if (src_str[size - 1] != 0) |
8613 | goto fail; |
8614 | *string = src_str; |
8615 | + |
8616 | + return size; |
8617 | } |
8618 | } |
8619 | - return size; |
8620 | |
8621 | fail: |
8622 | e->pos = pos; |
8623 | diff --git a/sound/pci/hda/hda_auto_parser.c b/sound/pci/hda/hda_auto_parser.c |
8624 | index b9a6b66aeb0e..d8ba3a6d5042 100644 |
8625 | --- a/sound/pci/hda/hda_auto_parser.c |
8626 | +++ b/sound/pci/hda/hda_auto_parser.c |
8627 | @@ -828,6 +828,8 @@ static void apply_fixup(struct hda_codec *codec, int id, int action, int depth) |
8628 | while (id >= 0) { |
8629 | const struct hda_fixup *fix = codec->fixup_list + id; |
8630 | |
8631 | + if (++depth > 10) |
8632 | + break; |
8633 | if (fix->chained_before) |
8634 | apply_fixup(codec, fix->chain_id, action, depth + 1); |
8635 | |
8636 | @@ -867,8 +869,6 @@ static void apply_fixup(struct hda_codec *codec, int id, int action, int depth) |
8637 | } |
8638 | if (!fix->chained || fix->chained_before) |
8639 | break; |
8640 | - if (++depth > 10) |
8641 | - break; |
8642 | id = fix->chain_id; |
8643 | } |
8644 | } |
8645 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
8646 | index a6233775e779..82b0dc9f528f 100644 |
8647 | --- a/sound/pci/hda/hda_codec.c |
8648 | +++ b/sound/pci/hda/hda_codec.c |
8649 | @@ -2947,15 +2947,19 @@ static int hda_codec_runtime_resume(struct device *dev) |
8650 | #ifdef CONFIG_PM_SLEEP |
8651 | static int hda_codec_force_resume(struct device *dev) |
8652 | { |
8653 | + struct hda_codec *codec = dev_to_hda_codec(dev); |
8654 | + bool forced_resume = !codec->relaxed_resume; |
8655 | int ret; |
8656 | |
8657 | /* The get/put pair below enforces the runtime resume even if the |
8658 | * device hasn't been used at suspend time. This trick is needed to |
8659 | * update the jack state change during the sleep. |
8660 | */ |
8661 | - pm_runtime_get_noresume(dev); |
8662 | + if (forced_resume) |
8663 | + pm_runtime_get_noresume(dev); |
8664 | ret = pm_runtime_force_resume(dev); |
8665 | - pm_runtime_put(dev); |
8666 | + if (forced_resume) |
8667 | + pm_runtime_put(dev); |
8668 | return ret; |
8669 | } |
8670 | |
8671 | diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h |
8672 | index acacc1900265..2003403ce1c8 100644 |
8673 | --- a/sound/pci/hda/hda_codec.h |
8674 | +++ b/sound/pci/hda/hda_codec.h |
8675 | @@ -261,6 +261,8 @@ struct hda_codec { |
8676 | unsigned int auto_runtime_pm:1; /* enable automatic codec runtime pm */ |
8677 | unsigned int force_pin_prefix:1; /* Add location prefix */ |
8678 | unsigned int link_down_at_suspend:1; /* link down at runtime suspend */ |
8679 | + unsigned int relaxed_resume:1; /* don't resume forcibly for jack */ |
8680 | + |
8681 | #ifdef CONFIG_PM |
8682 | unsigned long power_on_acct; |
8683 | unsigned long power_off_acct; |
8684 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c |
8685 | index bb2bd33b00ec..2609161707a4 100644 |
8686 | --- a/sound/pci/hda/hda_generic.c |
8687 | +++ b/sound/pci/hda/hda_generic.c |
8688 | @@ -5991,7 +5991,8 @@ int snd_hda_gen_init(struct hda_codec *codec) |
8689 | if (spec->init_hook) |
8690 | spec->init_hook(codec); |
8691 | |
8692 | - snd_hda_apply_verbs(codec); |
8693 | + if (!spec->skip_verbs) |
8694 | + snd_hda_apply_verbs(codec); |
8695 | |
8696 | init_multi_out(codec); |
8697 | init_extra_out(codec); |
8698 | diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h |
8699 | index ce9c293717b9..8933c0f64cc4 100644 |
8700 | --- a/sound/pci/hda/hda_generic.h |
8701 | +++ b/sound/pci/hda/hda_generic.h |
8702 | @@ -247,6 +247,7 @@ struct hda_gen_spec { |
8703 | unsigned int indep_hp_enabled:1; /* independent HP enabled */ |
8704 | unsigned int have_aamix_ctl:1; |
8705 | unsigned int hp_mic_jack_modes:1; |
8706 | + unsigned int skip_verbs:1; /* don't apply verbs at snd_hda_gen_init() */ |
8707 | |
8708 | /* additional mute flags (only effective with auto_mute_via_amp=1) */ |
8709 | u64 mute_bits; |
8710 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
8711 | index 7a3e34b120b3..c3e3d80ff720 100644 |
8712 | --- a/sound/pci/hda/hda_intel.c |
8713 | +++ b/sound/pci/hda/hda_intel.c |
8714 | @@ -329,13 +329,11 @@ enum { |
8715 | |
8716 | #define AZX_DCAPS_INTEL_SKYLAKE \ |
8717 | (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME |\ |
8718 | + AZX_DCAPS_SYNC_WRITE |\ |
8719 | AZX_DCAPS_SEPARATE_STREAM_TAG | AZX_DCAPS_I915_COMPONENT |\ |
8720 | AZX_DCAPS_I915_POWERWELL) |
8721 | |
8722 | -#define AZX_DCAPS_INTEL_BROXTON \ |
8723 | - (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME |\ |
8724 | - AZX_DCAPS_SEPARATE_STREAM_TAG | AZX_DCAPS_I915_COMPONENT |\ |
8725 | - AZX_DCAPS_I915_POWERWELL) |
8726 | +#define AZX_DCAPS_INTEL_BROXTON AZX_DCAPS_INTEL_SKYLAKE |
8727 | |
8728 | /* quirks for ATI SB / AMD Hudson */ |
8729 | #define AZX_DCAPS_PRESET_ATI_SB \ |
8730 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
8731 | index 35931a18418f..e4fbfb5557ab 100644 |
8732 | --- a/sound/pci/hda/patch_hdmi.c |
8733 | +++ b/sound/pci/hda/patch_hdmi.c |
8734 | @@ -2293,8 +2293,10 @@ static void generic_hdmi_free(struct hda_codec *codec) |
8735 | struct hdmi_spec *spec = codec->spec; |
8736 | int pin_idx, pcm_idx; |
8737 | |
8738 | - if (codec_has_acomp(codec)) |
8739 | + if (codec_has_acomp(codec)) { |
8740 | snd_hdac_acomp_register_notifier(&codec->bus->core, NULL); |
8741 | + codec->relaxed_resume = 0; |
8742 | + } |
8743 | |
8744 | for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { |
8745 | struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); |
8746 | @@ -2550,6 +2552,8 @@ static void register_i915_notifier(struct hda_codec *codec) |
8747 | spec->drm_audio_ops.pin_eld_notify = intel_pin_eld_notify; |
8748 | snd_hdac_acomp_register_notifier(&codec->bus->core, |
8749 | &spec->drm_audio_ops); |
8750 | + /* no need for forcible resume for jack check thanks to notifier */ |
8751 | + codec->relaxed_resume = 1; |
8752 | } |
8753 | |
8754 | /* setup_stream ops override for HSW+ */ |
8755 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
8756 | index 9b5caf099bfb..7f74ebee8c2d 100644 |
8757 | --- a/sound/pci/hda/patch_realtek.c |
8758 | +++ b/sound/pci/hda/patch_realtek.c |
8759 | @@ -836,9 +836,11 @@ static int alc_init(struct hda_codec *codec) |
8760 | if (spec->init_hook) |
8761 | spec->init_hook(codec); |
8762 | |
8763 | + spec->gen.skip_verbs = 1; /* applied in below */ |
8764 | snd_hda_gen_init(codec); |
8765 | alc_fix_pll(codec); |
8766 | alc_auto_init_amp(codec, spec->init_amp); |
8767 | + snd_hda_apply_verbs(codec); /* apply verbs here after own init */ |
8768 | |
8769 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT); |
8770 | |
8771 | @@ -5673,6 +5675,7 @@ enum { |
8772 | ALC286_FIXUP_ACER_AIO_HEADSET_MIC, |
8773 | ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, |
8774 | ALC299_FIXUP_PREDATOR_SPK, |
8775 | + ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC, |
8776 | }; |
8777 | |
8778 | static const struct hda_fixup alc269_fixups[] = { |
8779 | @@ -6701,6 +6704,16 @@ static const struct hda_fixup alc269_fixups[] = { |
8780 | { } |
8781 | } |
8782 | }, |
8783 | + [ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC] = { |
8784 | + .type = HDA_FIXUP_PINS, |
8785 | + .v.pins = (const struct hda_pintbl[]) { |
8786 | + { 0x14, 0x411111f0 }, /* disable confusing internal speaker */ |
8787 | + { 0x19, 0x04a11150 }, /* use as headset mic, without its own jack detect */ |
8788 | + { } |
8789 | + }, |
8790 | + .chained = true, |
8791 | + .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC |
8792 | + }, |
8793 | }; |
8794 | |
8795 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
8796 | @@ -6843,6 +6856,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
8797 | SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE), |
8798 | SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), |
8799 | SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), |
8800 | + SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3), |
8801 | SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), |
8802 | SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), |
8803 | SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
8804 | @@ -6859,6 +6873,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
8805 | SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK), |
8806 | SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A), |
8807 | SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC), |
8808 | + SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC), |
8809 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), |
8810 | SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC), |
8811 | SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC), |
8812 | @@ -6936,6 +6951,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
8813 | SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), |
8814 | SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), |
8815 | SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), |
8816 | + SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), |
8817 | SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), |
8818 | SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), |
8819 | SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI), |
8820 | @@ -8798,6 +8814,7 @@ static int patch_alc680(struct hda_codec *codec) |
8821 | static const struct hda_device_id snd_hda_id_realtek[] = { |
8822 | HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269), |
8823 | HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269), |
8824 | + HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269), |
8825 | HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269), |
8826 | HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269), |
8827 | HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269), |
8828 | diff --git a/tools/testing/selftests/net/fib_rule_tests.sh b/tools/testing/selftests/net/fib_rule_tests.sh |
8829 | index 1ba069967fa2..ba2d9fab28d0 100755 |
8830 | --- a/tools/testing/selftests/net/fib_rule_tests.sh |
8831 | +++ b/tools/testing/selftests/net/fib_rule_tests.sh |
8832 | @@ -15,6 +15,7 @@ GW_IP6=2001:db8:1::2 |
8833 | SRC_IP6=2001:db8:1::3 |
8834 | |
8835 | DEV_ADDR=192.51.100.1 |
8836 | +DEV_ADDR6=2001:db8:1::1 |
8837 | DEV=dummy0 |
8838 | |
8839 | log_test() |
8840 | @@ -55,8 +56,8 @@ setup() |
8841 | |
8842 | $IP link add dummy0 type dummy |
8843 | $IP link set dev dummy0 up |
8844 | - $IP address add 192.51.100.1/24 dev dummy0 |
8845 | - $IP -6 address add 2001:db8:1::1/64 dev dummy0 |
8846 | + $IP address add $DEV_ADDR/24 dev dummy0 |
8847 | + $IP -6 address add $DEV_ADDR6/64 dev dummy0 |
8848 | |
8849 | set +e |
8850 | } |
8851 | diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c |
8852 | index b20b751286fc..757a17f5ebde 100644 |
8853 | --- a/virt/kvm/eventfd.c |
8854 | +++ b/virt/kvm/eventfd.c |
8855 | @@ -44,6 +44,12 @@ |
8856 | |
8857 | static struct workqueue_struct *irqfd_cleanup_wq; |
8858 | |
8859 | +bool __attribute__((weak)) |
8860 | +kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm_irqfd *args) |
8861 | +{ |
8862 | + return true; |
8863 | +} |
8864 | + |
8865 | static void |
8866 | irqfd_inject(struct work_struct *work) |
8867 | { |
8868 | @@ -297,6 +303,9 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args) |
8869 | if (!kvm_arch_intc_initialized(kvm)) |
8870 | return -EAGAIN; |
8871 | |
8872 | + if (!kvm_arch_irqfd_allowed(kvm, args)) |
8873 | + return -EINVAL; |
8874 | + |
8875 | irqfd = kzalloc(sizeof(*irqfd), GFP_KERNEL); |
8876 | if (!irqfd) |
8877 | return -ENOMEM; |