Contents of /trunk/kernel-alx/patches-4.14/0159-4.14.60-all-fixes.patch
Parent Directory | Revision Log
Revision 3238 -
(show annotations)
(download)
Fri Nov 9 12:14:58 2018 UTC (5 years, 10 months ago) by niro
File size: 249369 byte(s)
Fri Nov 9 12:14:58 2018 UTC (5 years, 10 months ago) by niro
File size: 249369 byte(s)
-added up to patches-4.14.79
1 | diff --git a/Documentation/devicetree/bindings/net/dsa/qca8k.txt b/Documentation/devicetree/bindings/net/dsa/qca8k.txt |
2 | index 9c67ee4890d7..bbcb255c3150 100644 |
3 | --- a/Documentation/devicetree/bindings/net/dsa/qca8k.txt |
4 | +++ b/Documentation/devicetree/bindings/net/dsa/qca8k.txt |
5 | @@ -2,7 +2,10 @@ |
6 | |
7 | Required properties: |
8 | |
9 | -- compatible: should be "qca,qca8337" |
10 | +- compatible: should be one of: |
11 | + "qca,qca8334" |
12 | + "qca,qca8337" |
13 | + |
14 | - #size-cells: must be 0 |
15 | - #address-cells: must be 1 |
16 | |
17 | @@ -14,6 +17,20 @@ port and PHY id, each subnode describing a port needs to have a valid phandle |
18 | referencing the internal PHY connected to it. The CPU port of this switch is |
19 | always port 0. |
20 | |
21 | +A CPU port node has the following optional node: |
22 | + |
23 | +- fixed-link : Fixed-link subnode describing a link to a non-MDIO |
24 | + managed entity. See |
25 | + Documentation/devicetree/bindings/net/fixed-link.txt |
26 | + for details. |
27 | + |
28 | +For QCA8K the 'fixed-link' sub-node supports only the following properties: |
29 | + |
30 | +- 'speed' (integer, mandatory), to indicate the link speed. Accepted |
31 | + values are 10, 100 and 1000 |
32 | +- 'full-duplex' (boolean, optional), to indicate that full duplex is |
33 | + used. When absent, half duplex is assumed. |
34 | + |
35 | Example: |
36 | |
37 | |
38 | @@ -53,6 +70,10 @@ Example: |
39 | label = "cpu"; |
40 | ethernet = <&gmac1>; |
41 | phy-mode = "rgmii"; |
42 | + fixed-link { |
43 | + speed = 1000; |
44 | + full-duplex; |
45 | + }; |
46 | }; |
47 | |
48 | port@1 { |
49 | diff --git a/Documentation/devicetree/bindings/net/meson-dwmac.txt b/Documentation/devicetree/bindings/net/meson-dwmac.txt |
50 | index 354dd9896bb5..910187ebf1ce 100644 |
51 | --- a/Documentation/devicetree/bindings/net/meson-dwmac.txt |
52 | +++ b/Documentation/devicetree/bindings/net/meson-dwmac.txt |
53 | @@ -10,6 +10,7 @@ Required properties on all platforms: |
54 | - "amlogic,meson6-dwmac" |
55 | - "amlogic,meson8b-dwmac" |
56 | - "amlogic,meson-gxbb-dwmac" |
57 | + - "amlogic,meson-axg-dwmac" |
58 | Additionally "snps,dwmac" and any applicable more |
59 | detailed version number described in net/stmmac.txt |
60 | should be used. |
61 | diff --git a/Documentation/devicetree/bindings/pinctrl/meson,pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/meson,pinctrl.txt |
62 | index 2392557ede27..df77d394edc0 100644 |
63 | --- a/Documentation/devicetree/bindings/pinctrl/meson,pinctrl.txt |
64 | +++ b/Documentation/devicetree/bindings/pinctrl/meson,pinctrl.txt |
65 | @@ -3,8 +3,10 @@ |
66 | Required properties for the root node: |
67 | - compatible: one of "amlogic,meson8-cbus-pinctrl" |
68 | "amlogic,meson8b-cbus-pinctrl" |
69 | + "amlogic,meson8m2-cbus-pinctrl" |
70 | "amlogic,meson8-aobus-pinctrl" |
71 | "amlogic,meson8b-aobus-pinctrl" |
72 | + "amlogic,meson8m2-aobus-pinctrl" |
73 | "amlogic,meson-gxbb-periphs-pinctrl" |
74 | "amlogic,meson-gxbb-aobus-pinctrl" |
75 | "amlogic,meson-gxl-periphs-pinctrl" |
76 | diff --git a/Documentation/vfio-mediated-device.txt b/Documentation/vfio-mediated-device.txt |
77 | index 1b3950346532..c3f69bcaf96e 100644 |
78 | --- a/Documentation/vfio-mediated-device.txt |
79 | +++ b/Documentation/vfio-mediated-device.txt |
80 | @@ -145,6 +145,11 @@ The functions in the mdev_parent_ops structure are as follows: |
81 | * create: allocate basic resources in a driver for a mediated device |
82 | * remove: free resources in a driver when a mediated device is destroyed |
83 | |
84 | +(Note that mdev-core provides no implicit serialization of create/remove |
85 | +callbacks per mdev parent device, per mdev type, or any other categorization. |
86 | +Vendor drivers are expected to be fully asynchronous in this respect or |
87 | +provide their own internal resource protection.) |
88 | + |
89 | The callbacks in the mdev_parent_ops structure are as follows: |
90 | |
91 | * open: open callback of mediated device |
92 | diff --git a/Makefile b/Makefile |
93 | index 81b0e99dce80..5b48ec630990 100644 |
94 | --- a/Makefile |
95 | +++ b/Makefile |
96 | @@ -1,7 +1,7 @@ |
97 | # SPDX-License-Identifier: GPL-2.0 |
98 | VERSION = 4 |
99 | PATCHLEVEL = 14 |
100 | -SUBLEVEL = 59 |
101 | +SUBLEVEL = 60 |
102 | EXTRAVERSION = |
103 | NAME = Petit Gorille |
104 | |
105 | diff --git a/arch/arm/boot/dts/emev2.dtsi b/arch/arm/boot/dts/emev2.dtsi |
106 | index 42ea246e71cb..fec1241b858f 100644 |
107 | --- a/arch/arm/boot/dts/emev2.dtsi |
108 | +++ b/arch/arm/boot/dts/emev2.dtsi |
109 | @@ -31,13 +31,13 @@ |
110 | #address-cells = <1>; |
111 | #size-cells = <0>; |
112 | |
113 | - cpu@0 { |
114 | + cpu0: cpu@0 { |
115 | device_type = "cpu"; |
116 | compatible = "arm,cortex-a9"; |
117 | reg = <0>; |
118 | clock-frequency = <533000000>; |
119 | }; |
120 | - cpu@1 { |
121 | + cpu1: cpu@1 { |
122 | device_type = "cpu"; |
123 | compatible = "arm,cortex-a9"; |
124 | reg = <1>; |
125 | @@ -57,6 +57,7 @@ |
126 | compatible = "arm,cortex-a9-pmu"; |
127 | interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>, |
128 | <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; |
129 | + interrupt-affinity = <&cpu0>, <&cpu1>; |
130 | }; |
131 | |
132 | clocks@e0110000 { |
133 | diff --git a/arch/arm/boot/dts/sh73a0.dtsi b/arch/arm/boot/dts/sh73a0.dtsi |
134 | index 4ea5c5a16c57..5fc24d4c2d5d 100644 |
135 | --- a/arch/arm/boot/dts/sh73a0.dtsi |
136 | +++ b/arch/arm/boot/dts/sh73a0.dtsi |
137 | @@ -22,7 +22,7 @@ |
138 | #address-cells = <1>; |
139 | #size-cells = <0>; |
140 | |
141 | - cpu@0 { |
142 | + cpu0: cpu@0 { |
143 | device_type = "cpu"; |
144 | compatible = "arm,cortex-a9"; |
145 | reg = <0>; |
146 | @@ -30,7 +30,7 @@ |
147 | power-domains = <&pd_a2sl>; |
148 | next-level-cache = <&L2>; |
149 | }; |
150 | - cpu@1 { |
151 | + cpu1: cpu@1 { |
152 | device_type = "cpu"; |
153 | compatible = "arm,cortex-a9"; |
154 | reg = <1>; |
155 | @@ -89,6 +89,7 @@ |
156 | compatible = "arm,cortex-a9-pmu"; |
157 | interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>, |
158 | <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>; |
159 | + interrupt-affinity = <&cpu0>, <&cpu1>; |
160 | }; |
161 | |
162 | cmt1: timer@e6138000 { |
163 | diff --git a/arch/arm/boot/dts/stih407-pinctrl.dtsi b/arch/arm/boot/dts/stih407-pinctrl.dtsi |
164 | index bd1a82e8fffe..fe501d32d059 100644 |
165 | --- a/arch/arm/boot/dts/stih407-pinctrl.dtsi |
166 | +++ b/arch/arm/boot/dts/stih407-pinctrl.dtsi |
167 | @@ -52,7 +52,7 @@ |
168 | st,syscfg = <&syscfg_sbc>; |
169 | reg = <0x0961f080 0x4>; |
170 | reg-names = "irqmux"; |
171 | - interrupts = <GIC_SPI 188 IRQ_TYPE_NONE>; |
172 | + interrupts = <GIC_SPI 188 IRQ_TYPE_LEVEL_HIGH>; |
173 | interrupt-names = "irqmux"; |
174 | ranges = <0 0x09610000 0x6000>; |
175 | |
176 | @@ -376,7 +376,7 @@ |
177 | st,syscfg = <&syscfg_front>; |
178 | reg = <0x0920f080 0x4>; |
179 | reg-names = "irqmux"; |
180 | - interrupts = <GIC_SPI 189 IRQ_TYPE_NONE>; |
181 | + interrupts = <GIC_SPI 189 IRQ_TYPE_LEVEL_HIGH>; |
182 | interrupt-names = "irqmux"; |
183 | ranges = <0 0x09200000 0x10000>; |
184 | |
185 | @@ -936,7 +936,7 @@ |
186 | st,syscfg = <&syscfg_front>; |
187 | reg = <0x0921f080 0x4>; |
188 | reg-names = "irqmux"; |
189 | - interrupts = <GIC_SPI 190 IRQ_TYPE_NONE>; |
190 | + interrupts = <GIC_SPI 190 IRQ_TYPE_LEVEL_HIGH>; |
191 | interrupt-names = "irqmux"; |
192 | ranges = <0 0x09210000 0x10000>; |
193 | |
194 | @@ -969,7 +969,7 @@ |
195 | st,syscfg = <&syscfg_rear>; |
196 | reg = <0x0922f080 0x4>; |
197 | reg-names = "irqmux"; |
198 | - interrupts = <GIC_SPI 191 IRQ_TYPE_NONE>; |
199 | + interrupts = <GIC_SPI 191 IRQ_TYPE_LEVEL_HIGH>; |
200 | interrupt-names = "irqmux"; |
201 | ranges = <0 0x09220000 0x6000>; |
202 | |
203 | @@ -1164,7 +1164,7 @@ |
204 | st,syscfg = <&syscfg_flash>; |
205 | reg = <0x0923f080 0x4>; |
206 | reg-names = "irqmux"; |
207 | - interrupts = <GIC_SPI 192 IRQ_TYPE_NONE>; |
208 | + interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>; |
209 | interrupt-names = "irqmux"; |
210 | ranges = <0 0x09230000 0x3000>; |
211 | |
212 | diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c |
213 | index 323a4df59a6c..ece2d1d43724 100644 |
214 | --- a/arch/arm/net/bpf_jit_32.c |
215 | +++ b/arch/arm/net/bpf_jit_32.c |
216 | @@ -718,7 +718,7 @@ static inline void emit_a32_arsh_r64(const u8 dst[], const u8 src[], bool dstk, |
217 | } |
218 | |
219 | /* dst = dst >> src */ |
220 | -static inline void emit_a32_lsr_r64(const u8 dst[], const u8 src[], bool dstk, |
221 | +static inline void emit_a32_rsh_r64(const u8 dst[], const u8 src[], bool dstk, |
222 | bool sstk, struct jit_ctx *ctx) { |
223 | const u8 *tmp = bpf2a32[TMP_REG_1]; |
224 | const u8 *tmp2 = bpf2a32[TMP_REG_2]; |
225 | @@ -734,7 +734,7 @@ static inline void emit_a32_lsr_r64(const u8 dst[], const u8 src[], bool dstk, |
226 | emit(ARM_LDR_I(rm, ARM_SP, STACK_VAR(dst_hi)), ctx); |
227 | } |
228 | |
229 | - /* Do LSH operation */ |
230 | + /* Do RSH operation */ |
231 | emit(ARM_RSB_I(ARM_IP, rt, 32), ctx); |
232 | emit(ARM_SUBS_I(tmp2[0], rt, 32), ctx); |
233 | emit(ARM_MOV_SR(ARM_LR, rd, SRTYPE_LSR, rt), ctx); |
234 | @@ -784,7 +784,7 @@ static inline void emit_a32_lsh_i64(const u8 dst[], bool dstk, |
235 | } |
236 | |
237 | /* dst = dst >> val */ |
238 | -static inline void emit_a32_lsr_i64(const u8 dst[], bool dstk, |
239 | +static inline void emit_a32_rsh_i64(const u8 dst[], bool dstk, |
240 | const u32 val, struct jit_ctx *ctx) { |
241 | const u8 *tmp = bpf2a32[TMP_REG_1]; |
242 | const u8 *tmp2 = bpf2a32[TMP_REG_2]; |
243 | @@ -1340,7 +1340,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) |
244 | case BPF_ALU64 | BPF_RSH | BPF_K: |
245 | if (unlikely(imm > 63)) |
246 | return -EINVAL; |
247 | - emit_a32_lsr_i64(dst, dstk, imm, ctx); |
248 | + emit_a32_rsh_i64(dst, dstk, imm, ctx); |
249 | break; |
250 | /* dst = dst << src */ |
251 | case BPF_ALU64 | BPF_LSH | BPF_X: |
252 | @@ -1348,7 +1348,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) |
253 | break; |
254 | /* dst = dst >> src */ |
255 | case BPF_ALU64 | BPF_RSH | BPF_X: |
256 | - emit_a32_lsr_r64(dst, src, dstk, sstk, ctx); |
257 | + emit_a32_rsh_r64(dst, src, dstk, sstk, ctx); |
258 | break; |
259 | /* dst = dst >> src (signed) */ |
260 | case BPF_ALU64 | BPF_ARSH | BPF_X: |
261 | diff --git a/arch/arm64/boot/dts/renesas/salvator-common.dtsi b/arch/arm64/boot/dts/renesas/salvator-common.dtsi |
262 | index 9eb11a8d9eda..26a978616071 100644 |
263 | --- a/arch/arm64/boot/dts/renesas/salvator-common.dtsi |
264 | +++ b/arch/arm64/boot/dts/renesas/salvator-common.dtsi |
265 | @@ -93,20 +93,12 @@ |
266 | regulator-always-on; |
267 | }; |
268 | |
269 | - rsnd_ak4613: sound { |
270 | - compatible = "simple-audio-card"; |
271 | + sound_card: sound { |
272 | + compatible = "audio-graph-card"; |
273 | |
274 | - simple-audio-card,format = "left_j"; |
275 | - simple-audio-card,bitclock-master = <&sndcpu>; |
276 | - simple-audio-card,frame-master = <&sndcpu>; |
277 | + label = "rcar-sound"; |
278 | |
279 | - sndcpu: simple-audio-card,cpu { |
280 | - sound-dai = <&rcar_sound>; |
281 | - }; |
282 | - |
283 | - sndcodec: simple-audio-card,codec { |
284 | - sound-dai = <&ak4613>; |
285 | - }; |
286 | + dais = <&rsnd_port0>; |
287 | }; |
288 | |
289 | vbus0_usb2: regulator-vbus0-usb2 { |
290 | @@ -320,6 +312,12 @@ |
291 | asahi-kasei,out4-single-end; |
292 | asahi-kasei,out5-single-end; |
293 | asahi-kasei,out6-single-end; |
294 | + |
295 | + port { |
296 | + ak4613_endpoint: endpoint { |
297 | + remote-endpoint = <&rsnd_endpoint0>; |
298 | + }; |
299 | + }; |
300 | }; |
301 | |
302 | cs2000: clk_multiplier@4f { |
303 | @@ -538,10 +536,18 @@ |
304 | <&audio_clk_c>, |
305 | <&cpg CPG_CORE CPG_AUDIO_CLK_I>; |
306 | |
307 | - rcar_sound,dai { |
308 | - dai0 { |
309 | - playback = <&ssi0 &src0 &dvc0>; |
310 | - capture = <&ssi1 &src1 &dvc1>; |
311 | + ports { |
312 | + rsnd_port0: port@0 { |
313 | + rsnd_endpoint0: endpoint { |
314 | + remote-endpoint = <&ak4613_endpoint>; |
315 | + |
316 | + dai-format = "left_j"; |
317 | + bitclock-master = <&rsnd_endpoint0>; |
318 | + frame-master = <&rsnd_endpoint0>; |
319 | + |
320 | + playback = <&ssi0 &src0 &dvc0>; |
321 | + capture = <&ssi1 &src1 &dvc1>; |
322 | + }; |
323 | }; |
324 | }; |
325 | }; |
326 | diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig |
327 | index 34480e9af2e7..b05796578e7a 100644 |
328 | --- a/arch/arm64/configs/defconfig |
329 | +++ b/arch/arm64/configs/defconfig |
330 | @@ -302,6 +302,8 @@ CONFIG_GPIO_XGENE_SB=y |
331 | CONFIG_GPIO_PCA953X=y |
332 | CONFIG_GPIO_PCA953X_IRQ=y |
333 | CONFIG_GPIO_MAX77620=y |
334 | +CONFIG_POWER_AVS=y |
335 | +CONFIG_ROCKCHIP_IODOMAIN=y |
336 | CONFIG_POWER_RESET_MSM=y |
337 | CONFIG_POWER_RESET_XGENE=y |
338 | CONFIG_POWER_RESET_SYSCON=y |
339 | diff --git a/arch/arm64/include/asm/cmpxchg.h b/arch/arm64/include/asm/cmpxchg.h |
340 | index ae852add053d..0f2e1ab5e166 100644 |
341 | --- a/arch/arm64/include/asm/cmpxchg.h |
342 | +++ b/arch/arm64/include/asm/cmpxchg.h |
343 | @@ -229,7 +229,9 @@ static inline void __cmpwait_case_##name(volatile void *ptr, \ |
344 | unsigned long tmp; \ |
345 | \ |
346 | asm volatile( \ |
347 | - " ldxr" #sz "\t%" #w "[tmp], %[v]\n" \ |
348 | + " sevl\n" \ |
349 | + " wfe\n" \ |
350 | + " ldxr" #sz "\t%" #w "[tmp], %[v]\n" \ |
351 | " eor %" #w "[tmp], %" #w "[tmp], %" #w "[val]\n" \ |
352 | " cbnz %" #w "[tmp], 1f\n" \ |
353 | " wfe\n" \ |
354 | diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c |
355 | index 00e7b900ca41..1190d90e01e6 100644 |
356 | --- a/arch/arm64/mm/init.c |
357 | +++ b/arch/arm64/mm/init.c |
358 | @@ -651,11 +651,13 @@ void __init mem_init(void) |
359 | BUILD_BUG_ON(TASK_SIZE_32 > TASK_SIZE_64); |
360 | #endif |
361 | |
362 | +#ifdef CONFIG_SPARSEMEM_VMEMMAP |
363 | /* |
364 | * Make sure we chose the upper bound of sizeof(struct page) |
365 | - * correctly. |
366 | + * correctly when sizing the VMEMMAP array. |
367 | */ |
368 | BUILD_BUG_ON(sizeof(struct page) > (1 << STRUCT_PAGE_MAX_SHIFT)); |
369 | +#endif |
370 | |
371 | if (PAGE_SIZE >= 16384 && get_num_physpages() <= 128) { |
372 | extern int sysctl_overcommit_memory; |
373 | diff --git a/arch/microblaze/boot/Makefile b/arch/microblaze/boot/Makefile |
374 | index 47f94cc383b6..7c2f52d4a0e4 100644 |
375 | --- a/arch/microblaze/boot/Makefile |
376 | +++ b/arch/microblaze/boot/Makefile |
377 | @@ -22,17 +22,19 @@ $(obj)/linux.bin.gz: $(obj)/linux.bin FORCE |
378 | quiet_cmd_cp = CP $< $@$2 |
379 | cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) |
380 | |
381 | -quiet_cmd_strip = STRIP $@ |
382 | +quiet_cmd_strip = STRIP $< $@$2 |
383 | cmd_strip = $(STRIP) -K microblaze_start -K _end -K __log_buf \ |
384 | - -K _fdt_start vmlinux -o $@ |
385 | + -K _fdt_start $< -o $@$2 |
386 | |
387 | UIMAGE_LOADADDR = $(CONFIG_KERNEL_BASE_ADDR) |
388 | +UIMAGE_IN = $@ |
389 | +UIMAGE_OUT = $@.ub |
390 | |
391 | $(obj)/simpleImage.%: vmlinux FORCE |
392 | $(call if_changed,cp,.unstrip) |
393 | $(call if_changed,objcopy) |
394 | $(call if_changed,uimage) |
395 | - $(call if_changed,strip) |
396 | - @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' |
397 | + $(call if_changed,strip,.strip) |
398 | + @echo 'Kernel: $(UIMAGE_OUT) is ready' ' (#'`cat .version`')' |
399 | |
400 | clean-files += simpleImage.*.unstrip linux.bin.ub dts/*.dtb |
401 | diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h |
402 | index c7c63959ba91..e582d2c88092 100644 |
403 | --- a/arch/powerpc/include/asm/barrier.h |
404 | +++ b/arch/powerpc/include/asm/barrier.h |
405 | @@ -76,6 +76,21 @@ do { \ |
406 | ___p1; \ |
407 | }) |
408 | |
409 | +#ifdef CONFIG_PPC_BOOK3S_64 |
410 | +/* |
411 | + * Prevent execution of subsequent instructions until preceding branches have |
412 | + * been fully resolved and are no longer executing speculatively. |
413 | + */ |
414 | +#define barrier_nospec_asm ori 31,31,0 |
415 | + |
416 | +// This also acts as a compiler barrier due to the memory clobber. |
417 | +#define barrier_nospec() asm (stringify_in_c(barrier_nospec_asm) ::: "memory") |
418 | + |
419 | +#else /* !CONFIG_PPC_BOOK3S_64 */ |
420 | +#define barrier_nospec_asm |
421 | +#define barrier_nospec() |
422 | +#endif |
423 | + |
424 | #include <asm-generic/barrier.h> |
425 | |
426 | #endif /* _ASM_POWERPC_BARRIER_H */ |
427 | diff --git a/arch/powerpc/include/asm/cache.h b/arch/powerpc/include/asm/cache.h |
428 | index c1d257aa4c2d..66298461b640 100644 |
429 | --- a/arch/powerpc/include/asm/cache.h |
430 | +++ b/arch/powerpc/include/asm/cache.h |
431 | @@ -9,11 +9,14 @@ |
432 | #if defined(CONFIG_PPC_8xx) || defined(CONFIG_403GCX) |
433 | #define L1_CACHE_SHIFT 4 |
434 | #define MAX_COPY_PREFETCH 1 |
435 | +#define IFETCH_ALIGN_SHIFT 2 |
436 | #elif defined(CONFIG_PPC_E500MC) |
437 | #define L1_CACHE_SHIFT 6 |
438 | #define MAX_COPY_PREFETCH 4 |
439 | +#define IFETCH_ALIGN_SHIFT 3 |
440 | #elif defined(CONFIG_PPC32) |
441 | #define MAX_COPY_PREFETCH 4 |
442 | +#define IFETCH_ALIGN_SHIFT 3 /* 603 fetches 2 insn at a time */ |
443 | #if defined(CONFIG_PPC_47x) |
444 | #define L1_CACHE_SHIFT 7 |
445 | #else |
446 | diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c |
447 | index ca2243df9cb2..470284f9e4f6 100644 |
448 | --- a/arch/powerpc/kernel/eeh_driver.c |
449 | +++ b/arch/powerpc/kernel/eeh_driver.c |
450 | @@ -450,9 +450,11 @@ static void *eeh_add_virt_device(void *data, void *userdata) |
451 | |
452 | driver = eeh_pcid_get(dev); |
453 | if (driver) { |
454 | - eeh_pcid_put(dev); |
455 | - if (driver->err_handler) |
456 | + if (driver->err_handler) { |
457 | + eeh_pcid_put(dev); |
458 | return NULL; |
459 | + } |
460 | + eeh_pcid_put(dev); |
461 | } |
462 | |
463 | #ifdef CONFIG_PPC_POWERNV |
464 | @@ -489,17 +491,19 @@ static void *eeh_rmv_device(void *data, void *userdata) |
465 | if (eeh_dev_removed(edev)) |
466 | return NULL; |
467 | |
468 | - driver = eeh_pcid_get(dev); |
469 | - if (driver) { |
470 | - eeh_pcid_put(dev); |
471 | - if (removed && |
472 | - eeh_pe_passed(edev->pe)) |
473 | - return NULL; |
474 | - if (removed && |
475 | - driver->err_handler && |
476 | - driver->err_handler->error_detected && |
477 | - driver->err_handler->slot_reset) |
478 | + if (removed) { |
479 | + if (eeh_pe_passed(edev->pe)) |
480 | return NULL; |
481 | + driver = eeh_pcid_get(dev); |
482 | + if (driver) { |
483 | + if (driver->err_handler && |
484 | + driver->err_handler->error_detected && |
485 | + driver->err_handler->slot_reset) { |
486 | + eeh_pcid_put(dev); |
487 | + return NULL; |
488 | + } |
489 | + eeh_pcid_put(dev); |
490 | + } |
491 | } |
492 | |
493 | /* Remove it from PCI subsystem */ |
494 | diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S |
495 | index 4fee00d414e8..2d0d89e2cb9a 100644 |
496 | --- a/arch/powerpc/kernel/head_8xx.S |
497 | +++ b/arch/powerpc/kernel/head_8xx.S |
498 | @@ -958,7 +958,7 @@ start_here: |
499 | tovirt(r6,r6) |
500 | lis r5, abatron_pteptrs@h |
501 | ori r5, r5, abatron_pteptrs@l |
502 | - stw r5, 0xf0(r0) /* Must match your Abatron config file */ |
503 | + stw r5, 0xf0(0) /* Must match your Abatron config file */ |
504 | tophys(r5,r5) |
505 | stw r6, 0(r5) |
506 | |
507 | diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c |
508 | index 1d817f4d97d9..2094f2b249fd 100644 |
509 | --- a/arch/powerpc/kernel/pci_32.c |
510 | +++ b/arch/powerpc/kernel/pci_32.c |
511 | @@ -11,6 +11,7 @@ |
512 | #include <linux/sched.h> |
513 | #include <linux/errno.h> |
514 | #include <linux/bootmem.h> |
515 | +#include <linux/syscalls.h> |
516 | #include <linux/irq.h> |
517 | #include <linux/list.h> |
518 | #include <linux/of.h> |
519 | diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c |
520 | index 02190e90c7ae..f8782c7ef50f 100644 |
521 | --- a/arch/powerpc/kernel/prom_init.c |
522 | +++ b/arch/powerpc/kernel/prom_init.c |
523 | @@ -334,6 +334,7 @@ static void __init prom_print_dec(unsigned long val) |
524 | call_prom("write", 3, 1, prom.stdout, buf+i, size); |
525 | } |
526 | |
527 | +__printf(1, 2) |
528 | static void __init prom_printf(const char *format, ...) |
529 | { |
530 | const char *p, *q, *s; |
531 | @@ -1148,7 +1149,7 @@ static void __init prom_send_capabilities(void) |
532 | */ |
533 | |
534 | cores = DIV_ROUND_UP(NR_CPUS, prom_count_smt_threads()); |
535 | - prom_printf("Max number of cores passed to firmware: %lu (NR_CPUS = %lu)\n", |
536 | + prom_printf("Max number of cores passed to firmware: %u (NR_CPUS = %d)\n", |
537 | cores, NR_CPUS); |
538 | |
539 | ibm_architecture_vec.vec5.max_cpus = cpu_to_be32(cores); |
540 | @@ -1230,7 +1231,7 @@ static unsigned long __init alloc_up(unsigned long size, unsigned long align) |
541 | |
542 | if (align) |
543 | base = _ALIGN_UP(base, align); |
544 | - prom_debug("alloc_up(%x, %x)\n", size, align); |
545 | + prom_debug("%s(%lx, %lx)\n", __func__, size, align); |
546 | if (ram_top == 0) |
547 | prom_panic("alloc_up() called with mem not initialized\n"); |
548 | |
549 | @@ -1241,7 +1242,7 @@ static unsigned long __init alloc_up(unsigned long size, unsigned long align) |
550 | |
551 | for(; (base + size) <= alloc_top; |
552 | base = _ALIGN_UP(base + 0x100000, align)) { |
553 | - prom_debug(" trying: 0x%x\n\r", base); |
554 | + prom_debug(" trying: 0x%lx\n\r", base); |
555 | addr = (unsigned long)prom_claim(base, size, 0); |
556 | if (addr != PROM_ERROR && addr != 0) |
557 | break; |
558 | @@ -1253,12 +1254,12 @@ static unsigned long __init alloc_up(unsigned long size, unsigned long align) |
559 | return 0; |
560 | alloc_bottom = addr + size; |
561 | |
562 | - prom_debug(" -> %x\n", addr); |
563 | - prom_debug(" alloc_bottom : %x\n", alloc_bottom); |
564 | - prom_debug(" alloc_top : %x\n", alloc_top); |
565 | - prom_debug(" alloc_top_hi : %x\n", alloc_top_high); |
566 | - prom_debug(" rmo_top : %x\n", rmo_top); |
567 | - prom_debug(" ram_top : %x\n", ram_top); |
568 | + prom_debug(" -> %lx\n", addr); |
569 | + prom_debug(" alloc_bottom : %lx\n", alloc_bottom); |
570 | + prom_debug(" alloc_top : %lx\n", alloc_top); |
571 | + prom_debug(" alloc_top_hi : %lx\n", alloc_top_high); |
572 | + prom_debug(" rmo_top : %lx\n", rmo_top); |
573 | + prom_debug(" ram_top : %lx\n", ram_top); |
574 | |
575 | return addr; |
576 | } |
577 | @@ -1273,7 +1274,7 @@ static unsigned long __init alloc_down(unsigned long size, unsigned long align, |
578 | { |
579 | unsigned long base, addr = 0; |
580 | |
581 | - prom_debug("alloc_down(%x, %x, %s)\n", size, align, |
582 | + prom_debug("%s(%lx, %lx, %s)\n", __func__, size, align, |
583 | highmem ? "(high)" : "(low)"); |
584 | if (ram_top == 0) |
585 | prom_panic("alloc_down() called with mem not initialized\n"); |
586 | @@ -1301,7 +1302,7 @@ static unsigned long __init alloc_down(unsigned long size, unsigned long align, |
587 | base = _ALIGN_DOWN(alloc_top - size, align); |
588 | for (; base > alloc_bottom; |
589 | base = _ALIGN_DOWN(base - 0x100000, align)) { |
590 | - prom_debug(" trying: 0x%x\n\r", base); |
591 | + prom_debug(" trying: 0x%lx\n\r", base); |
592 | addr = (unsigned long)prom_claim(base, size, 0); |
593 | if (addr != PROM_ERROR && addr != 0) |
594 | break; |
595 | @@ -1312,12 +1313,12 @@ static unsigned long __init alloc_down(unsigned long size, unsigned long align, |
596 | alloc_top = addr; |
597 | |
598 | bail: |
599 | - prom_debug(" -> %x\n", addr); |
600 | - prom_debug(" alloc_bottom : %x\n", alloc_bottom); |
601 | - prom_debug(" alloc_top : %x\n", alloc_top); |
602 | - prom_debug(" alloc_top_hi : %x\n", alloc_top_high); |
603 | - prom_debug(" rmo_top : %x\n", rmo_top); |
604 | - prom_debug(" ram_top : %x\n", ram_top); |
605 | + prom_debug(" -> %lx\n", addr); |
606 | + prom_debug(" alloc_bottom : %lx\n", alloc_bottom); |
607 | + prom_debug(" alloc_top : %lx\n", alloc_top); |
608 | + prom_debug(" alloc_top_hi : %lx\n", alloc_top_high); |
609 | + prom_debug(" rmo_top : %lx\n", rmo_top); |
610 | + prom_debug(" ram_top : %lx\n", ram_top); |
611 | |
612 | return addr; |
613 | } |
614 | @@ -1443,7 +1444,7 @@ static void __init prom_init_mem(void) |
615 | |
616 | if (size == 0) |
617 | continue; |
618 | - prom_debug(" %x %x\n", base, size); |
619 | + prom_debug(" %lx %lx\n", base, size); |
620 | if (base == 0 && (of_platform & PLATFORM_LPAR)) |
621 | rmo_top = size; |
622 | if ((base + size) > ram_top) |
623 | @@ -1463,12 +1464,12 @@ static void __init prom_init_mem(void) |
624 | |
625 | if (prom_memory_limit) { |
626 | if (prom_memory_limit <= alloc_bottom) { |
627 | - prom_printf("Ignoring mem=%x <= alloc_bottom.\n", |
628 | - prom_memory_limit); |
629 | + prom_printf("Ignoring mem=%lx <= alloc_bottom.\n", |
630 | + prom_memory_limit); |
631 | prom_memory_limit = 0; |
632 | } else if (prom_memory_limit >= ram_top) { |
633 | - prom_printf("Ignoring mem=%x >= ram_top.\n", |
634 | - prom_memory_limit); |
635 | + prom_printf("Ignoring mem=%lx >= ram_top.\n", |
636 | + prom_memory_limit); |
637 | prom_memory_limit = 0; |
638 | } else { |
639 | ram_top = prom_memory_limit; |
640 | @@ -1500,12 +1501,13 @@ static void __init prom_init_mem(void) |
641 | alloc_bottom = PAGE_ALIGN(prom_initrd_end); |
642 | |
643 | prom_printf("memory layout at init:\n"); |
644 | - prom_printf(" memory_limit : %x (16 MB aligned)\n", prom_memory_limit); |
645 | - prom_printf(" alloc_bottom : %x\n", alloc_bottom); |
646 | - prom_printf(" alloc_top : %x\n", alloc_top); |
647 | - prom_printf(" alloc_top_hi : %x\n", alloc_top_high); |
648 | - prom_printf(" rmo_top : %x\n", rmo_top); |
649 | - prom_printf(" ram_top : %x\n", ram_top); |
650 | + prom_printf(" memory_limit : %lx (16 MB aligned)\n", |
651 | + prom_memory_limit); |
652 | + prom_printf(" alloc_bottom : %lx\n", alloc_bottom); |
653 | + prom_printf(" alloc_top : %lx\n", alloc_top); |
654 | + prom_printf(" alloc_top_hi : %lx\n", alloc_top_high); |
655 | + prom_printf(" rmo_top : %lx\n", rmo_top); |
656 | + prom_printf(" ram_top : %lx\n", ram_top); |
657 | } |
658 | |
659 | static void __init prom_close_stdin(void) |
660 | @@ -1566,7 +1568,7 @@ static void __init prom_instantiate_opal(void) |
661 | return; |
662 | } |
663 | |
664 | - prom_printf("instantiating opal at 0x%x...", base); |
665 | + prom_printf("instantiating opal at 0x%llx...", base); |
666 | |
667 | if (call_prom_ret("call-method", 4, 3, rets, |
668 | ADDR("load-opal-runtime"), |
669 | @@ -1582,10 +1584,10 @@ static void __init prom_instantiate_opal(void) |
670 | |
671 | reserve_mem(base, size); |
672 | |
673 | - prom_debug("opal base = 0x%x\n", base); |
674 | - prom_debug("opal align = 0x%x\n", align); |
675 | - prom_debug("opal entry = 0x%x\n", entry); |
676 | - prom_debug("opal size = 0x%x\n", (long)size); |
677 | + prom_debug("opal base = 0x%llx\n", base); |
678 | + prom_debug("opal align = 0x%llx\n", align); |
679 | + prom_debug("opal entry = 0x%llx\n", entry); |
680 | + prom_debug("opal size = 0x%llx\n", size); |
681 | |
682 | prom_setprop(opal_node, "/ibm,opal", "opal-base-address", |
683 | &base, sizeof(base)); |
684 | @@ -1662,7 +1664,7 @@ static void __init prom_instantiate_rtas(void) |
685 | |
686 | prom_debug("rtas base = 0x%x\n", base); |
687 | prom_debug("rtas entry = 0x%x\n", entry); |
688 | - prom_debug("rtas size = 0x%x\n", (long)size); |
689 | + prom_debug("rtas size = 0x%x\n", size); |
690 | |
691 | prom_debug("prom_instantiate_rtas: end...\n"); |
692 | } |
693 | @@ -1720,7 +1722,7 @@ static void __init prom_instantiate_sml(void) |
694 | if (base == 0) |
695 | prom_panic("Could not allocate memory for sml\n"); |
696 | |
697 | - prom_printf("instantiating sml at 0x%x...", base); |
698 | + prom_printf("instantiating sml at 0x%llx...", base); |
699 | |
700 | memset((void *)base, 0, size); |
701 | |
702 | @@ -1739,8 +1741,8 @@ static void __init prom_instantiate_sml(void) |
703 | prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-size", |
704 | &size, sizeof(size)); |
705 | |
706 | - prom_debug("sml base = 0x%x\n", base); |
707 | - prom_debug("sml size = 0x%x\n", (long)size); |
708 | + prom_debug("sml base = 0x%llx\n", base); |
709 | + prom_debug("sml size = 0x%x\n", size); |
710 | |
711 | prom_debug("prom_instantiate_sml: end...\n"); |
712 | } |
713 | @@ -1841,7 +1843,7 @@ static void __init prom_initialize_tce_table(void) |
714 | |
715 | prom_debug("TCE table: %s\n", path); |
716 | prom_debug("\tnode = 0x%x\n", node); |
717 | - prom_debug("\tbase = 0x%x\n", base); |
718 | + prom_debug("\tbase = 0x%llx\n", base); |
719 | prom_debug("\tsize = 0x%x\n", minsize); |
720 | |
721 | /* Initialize the table to have a one-to-one mapping |
722 | @@ -1928,12 +1930,12 @@ static void __init prom_hold_cpus(void) |
723 | } |
724 | |
725 | prom_debug("prom_hold_cpus: start...\n"); |
726 | - prom_debug(" 1) spinloop = 0x%x\n", (unsigned long)spinloop); |
727 | - prom_debug(" 1) *spinloop = 0x%x\n", *spinloop); |
728 | - prom_debug(" 1) acknowledge = 0x%x\n", |
729 | + prom_debug(" 1) spinloop = 0x%lx\n", (unsigned long)spinloop); |
730 | + prom_debug(" 1) *spinloop = 0x%lx\n", *spinloop); |
731 | + prom_debug(" 1) acknowledge = 0x%lx\n", |
732 | (unsigned long)acknowledge); |
733 | - prom_debug(" 1) *acknowledge = 0x%x\n", *acknowledge); |
734 | - prom_debug(" 1) secondary_hold = 0x%x\n", secondary_hold); |
735 | + prom_debug(" 1) *acknowledge = 0x%lx\n", *acknowledge); |
736 | + prom_debug(" 1) secondary_hold = 0x%lx\n", secondary_hold); |
737 | |
738 | /* Set the common spinloop variable, so all of the secondary cpus |
739 | * will block when they are awakened from their OF spinloop. |
740 | @@ -1961,7 +1963,7 @@ static void __init prom_hold_cpus(void) |
741 | prom_getprop(node, "reg", ®, sizeof(reg)); |
742 | cpu_no = be32_to_cpu(reg); |
743 | |
744 | - prom_debug("cpu hw idx = %lu\n", cpu_no); |
745 | + prom_debug("cpu hw idx = %u\n", cpu_no); |
746 | |
747 | /* Init the acknowledge var which will be reset by |
748 | * the secondary cpu when it awakens from its OF |
749 | @@ -1971,7 +1973,7 @@ static void __init prom_hold_cpus(void) |
750 | |
751 | if (cpu_no != prom.cpu) { |
752 | /* Primary Thread of non-boot cpu or any thread */ |
753 | - prom_printf("starting cpu hw idx %lu... ", cpu_no); |
754 | + prom_printf("starting cpu hw idx %u... ", cpu_no); |
755 | call_prom("start-cpu", 3, 0, node, |
756 | secondary_hold, cpu_no); |
757 | |
758 | @@ -1982,11 +1984,11 @@ static void __init prom_hold_cpus(void) |
759 | if (*acknowledge == cpu_no) |
760 | prom_printf("done\n"); |
761 | else |
762 | - prom_printf("failed: %x\n", *acknowledge); |
763 | + prom_printf("failed: %lx\n", *acknowledge); |
764 | } |
765 | #ifdef CONFIG_SMP |
766 | else |
767 | - prom_printf("boot cpu hw idx %lu\n", cpu_no); |
768 | + prom_printf("boot cpu hw idx %u\n", cpu_no); |
769 | #endif /* CONFIG_SMP */ |
770 | } |
771 | |
772 | @@ -2264,7 +2266,7 @@ static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end, |
773 | while ((*mem_start + needed) > *mem_end) { |
774 | unsigned long room, chunk; |
775 | |
776 | - prom_debug("Chunk exhausted, claiming more at %x...\n", |
777 | + prom_debug("Chunk exhausted, claiming more at %lx...\n", |
778 | alloc_bottom); |
779 | room = alloc_top - alloc_bottom; |
780 | if (room > DEVTREE_CHUNK_SIZE) |
781 | @@ -2490,7 +2492,7 @@ static void __init flatten_device_tree(void) |
782 | room = alloc_top - alloc_bottom - 0x4000; |
783 | if (room > DEVTREE_CHUNK_SIZE) |
784 | room = DEVTREE_CHUNK_SIZE; |
785 | - prom_debug("starting device tree allocs at %x\n", alloc_bottom); |
786 | + prom_debug("starting device tree allocs at %lx\n", alloc_bottom); |
787 | |
788 | /* Now try to claim that */ |
789 | mem_start = (unsigned long)alloc_up(room, PAGE_SIZE); |
790 | @@ -2553,7 +2555,7 @@ static void __init flatten_device_tree(void) |
791 | int i; |
792 | prom_printf("reserved memory map:\n"); |
793 | for (i = 0; i < mem_reserve_cnt; i++) |
794 | - prom_printf(" %x - %x\n", |
795 | + prom_printf(" %llx - %llx\n", |
796 | be64_to_cpu(mem_reserve_map[i].base), |
797 | be64_to_cpu(mem_reserve_map[i].size)); |
798 | } |
799 | @@ -2563,9 +2565,9 @@ static void __init flatten_device_tree(void) |
800 | */ |
801 | mem_reserve_cnt = MEM_RESERVE_MAP_SIZE; |
802 | |
803 | - prom_printf("Device tree strings 0x%x -> 0x%x\n", |
804 | + prom_printf("Device tree strings 0x%lx -> 0x%lx\n", |
805 | dt_string_start, dt_string_end); |
806 | - prom_printf("Device tree struct 0x%x -> 0x%x\n", |
807 | + prom_printf("Device tree struct 0x%lx -> 0x%lx\n", |
808 | dt_struct_start, dt_struct_end); |
809 | } |
810 | |
811 | @@ -2997,7 +2999,7 @@ static void __init prom_find_boot_cpu(void) |
812 | prom_getprop(cpu_pkg, "reg", &rval, sizeof(rval)); |
813 | prom.cpu = be32_to_cpu(rval); |
814 | |
815 | - prom_debug("Booting CPU hw index = %lu\n", prom.cpu); |
816 | + prom_debug("Booting CPU hw index = %d\n", prom.cpu); |
817 | } |
818 | |
819 | static void __init prom_check_initrd(unsigned long r3, unsigned long r4) |
820 | @@ -3019,8 +3021,8 @@ static void __init prom_check_initrd(unsigned long r3, unsigned long r4) |
821 | reserve_mem(prom_initrd_start, |
822 | prom_initrd_end - prom_initrd_start); |
823 | |
824 | - prom_debug("initrd_start=0x%x\n", prom_initrd_start); |
825 | - prom_debug("initrd_end=0x%x\n", prom_initrd_end); |
826 | + prom_debug("initrd_start=0x%lx\n", prom_initrd_start); |
827 | + prom_debug("initrd_end=0x%lx\n", prom_initrd_end); |
828 | } |
829 | #endif /* CONFIG_BLK_DEV_INITRD */ |
830 | } |
831 | @@ -3273,7 +3275,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, |
832 | /* Don't print anything after quiesce under OPAL, it crashes OFW */ |
833 | if (of_platform != PLATFORM_OPAL) { |
834 | prom_printf("Booting Linux via __start() @ 0x%lx ...\n", kbase); |
835 | - prom_debug("->dt_header_start=0x%x\n", hdr); |
836 | + prom_debug("->dt_header_start=0x%lx\n", hdr); |
837 | } |
838 | |
839 | #ifdef CONFIG_PPC32 |
840 | diff --git a/arch/powerpc/lib/string.S b/arch/powerpc/lib/string.S |
841 | index a787776822d8..0378def28d41 100644 |
842 | --- a/arch/powerpc/lib/string.S |
843 | +++ b/arch/powerpc/lib/string.S |
844 | @@ -12,6 +12,7 @@ |
845 | #include <asm/errno.h> |
846 | #include <asm/ppc_asm.h> |
847 | #include <asm/export.h> |
848 | +#include <asm/cache.h> |
849 | |
850 | .text |
851 | |
852 | @@ -23,7 +24,7 @@ _GLOBAL(strncpy) |
853 | mtctr r5 |
854 | addi r6,r3,-1 |
855 | addi r4,r4,-1 |
856 | - .balign 16 |
857 | + .balign IFETCH_ALIGN_BYTES |
858 | 1: lbzu r0,1(r4) |
859 | cmpwi 0,r0,0 |
860 | stbu r0,1(r6) |
861 | @@ -43,7 +44,7 @@ _GLOBAL(strncmp) |
862 | mtctr r5 |
863 | addi r5,r3,-1 |
864 | addi r4,r4,-1 |
865 | - .balign 16 |
866 | + .balign IFETCH_ALIGN_BYTES |
867 | 1: lbzu r3,1(r5) |
868 | cmpwi 1,r3,0 |
869 | lbzu r0,1(r4) |
870 | @@ -77,7 +78,7 @@ _GLOBAL(memchr) |
871 | beq- 2f |
872 | mtctr r5 |
873 | addi r3,r3,-1 |
874 | - .balign 16 |
875 | + .balign IFETCH_ALIGN_BYTES |
876 | 1: lbzu r0,1(r3) |
877 | cmpw 0,r0,r4 |
878 | bdnzf 2,1b |
879 | diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c |
880 | index 13cfe413b40d..6d9bf014b3e7 100644 |
881 | --- a/arch/powerpc/mm/slb.c |
882 | +++ b/arch/powerpc/mm/slb.c |
883 | @@ -62,14 +62,14 @@ static inline void slb_shadow_update(unsigned long ea, int ssize, |
884 | * updating it. No write barriers are needed here, provided |
885 | * we only update the current CPU's SLB shadow buffer. |
886 | */ |
887 | - p->save_area[index].esid = 0; |
888 | - p->save_area[index].vsid = cpu_to_be64(mk_vsid_data(ea, ssize, flags)); |
889 | - p->save_area[index].esid = cpu_to_be64(mk_esid_data(ea, ssize, index)); |
890 | + WRITE_ONCE(p->save_area[index].esid, 0); |
891 | + WRITE_ONCE(p->save_area[index].vsid, cpu_to_be64(mk_vsid_data(ea, ssize, flags))); |
892 | + WRITE_ONCE(p->save_area[index].esid, cpu_to_be64(mk_esid_data(ea, ssize, index))); |
893 | } |
894 | |
895 | static inline void slb_shadow_clear(enum slb_index index) |
896 | { |
897 | - get_slb_shadow()->save_area[index].esid = 0; |
898 | + WRITE_ONCE(get_slb_shadow()->save_area[index].esid, 0); |
899 | } |
900 | |
901 | static inline void create_shadowed_slbe(unsigned long ea, int ssize, |
902 | diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c |
903 | index bd0786c23109..254634fb3fc7 100644 |
904 | --- a/arch/powerpc/net/bpf_jit_comp64.c |
905 | +++ b/arch/powerpc/net/bpf_jit_comp64.c |
906 | @@ -203,25 +203,37 @@ static void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx) |
907 | |
908 | static void bpf_jit_emit_func_call(u32 *image, struct codegen_context *ctx, u64 func) |
909 | { |
910 | + unsigned int i, ctx_idx = ctx->idx; |
911 | + |
912 | + /* Load function address into r12 */ |
913 | + PPC_LI64(12, func); |
914 | + |
915 | + /* For bpf-to-bpf function calls, the callee's address is unknown |
916 | + * until the last extra pass. As seen above, we use PPC_LI64() to |
917 | + * load the callee's address, but this may optimize the number of |
918 | + * instructions required based on the nature of the address. |
919 | + * |
920 | + * Since we don't want the number of instructions emitted to change, |
921 | + * we pad the optimized PPC_LI64() call with NOPs to guarantee that |
922 | + * we always have a five-instruction sequence, which is the maximum |
923 | + * that PPC_LI64() can emit. |
924 | + */ |
925 | + for (i = ctx->idx - ctx_idx; i < 5; i++) |
926 | + PPC_NOP(); |
927 | + |
928 | #ifdef PPC64_ELF_ABI_v1 |
929 | - /* func points to the function descriptor */ |
930 | - PPC_LI64(b2p[TMP_REG_2], func); |
931 | - /* Load actual entry point from function descriptor */ |
932 | - PPC_BPF_LL(b2p[TMP_REG_1], b2p[TMP_REG_2], 0); |
933 | - /* ... and move it to LR */ |
934 | - PPC_MTLR(b2p[TMP_REG_1]); |
935 | /* |
936 | * Load TOC from function descriptor at offset 8. |
937 | * We can clobber r2 since we get called through a |
938 | * function pointer (so caller will save/restore r2) |
939 | * and since we don't use a TOC ourself. |
940 | */ |
941 | - PPC_BPF_LL(2, b2p[TMP_REG_2], 8); |
942 | -#else |
943 | - /* We can clobber r12 */ |
944 | - PPC_FUNC_ADDR(12, func); |
945 | - PPC_MTLR(12); |
946 | + PPC_BPF_LL(2, 12, 8); |
947 | + /* Load actual entry point from function descriptor */ |
948 | + PPC_BPF_LL(12, 12, 0); |
949 | #endif |
950 | + |
951 | + PPC_MTLR(12); |
952 | PPC_BLRL(); |
953 | } |
954 | |
955 | diff --git a/arch/powerpc/platforms/chrp/time.c b/arch/powerpc/platforms/chrp/time.c |
956 | index 03d115aaa191..acde7bbe0716 100644 |
957 | --- a/arch/powerpc/platforms/chrp/time.c |
958 | +++ b/arch/powerpc/platforms/chrp/time.c |
959 | @@ -28,6 +28,8 @@ |
960 | #include <asm/sections.h> |
961 | #include <asm/time.h> |
962 | |
963 | +#include <platforms/chrp/chrp.h> |
964 | + |
965 | extern spinlock_t rtc_lock; |
966 | |
967 | #define NVRAM_AS0 0x74 |
968 | @@ -63,7 +65,7 @@ long __init chrp_time_init(void) |
969 | return 0; |
970 | } |
971 | |
972 | -int chrp_cmos_clock_read(int addr) |
973 | +static int chrp_cmos_clock_read(int addr) |
974 | { |
975 | if (nvram_as1 != 0) |
976 | outb(addr>>8, nvram_as1); |
977 | @@ -71,7 +73,7 @@ int chrp_cmos_clock_read(int addr) |
978 | return (inb(nvram_data)); |
979 | } |
980 | |
981 | -void chrp_cmos_clock_write(unsigned long val, int addr) |
982 | +static void chrp_cmos_clock_write(unsigned long val, int addr) |
983 | { |
984 | if (nvram_as1 != 0) |
985 | outb(addr>>8, nvram_as1); |
986 | diff --git a/arch/powerpc/platforms/embedded6xx/hlwd-pic.c b/arch/powerpc/platforms/embedded6xx/hlwd-pic.c |
987 | index 89c54de88b7a..bf4a125faec6 100644 |
988 | --- a/arch/powerpc/platforms/embedded6xx/hlwd-pic.c |
989 | +++ b/arch/powerpc/platforms/embedded6xx/hlwd-pic.c |
990 | @@ -35,6 +35,8 @@ |
991 | */ |
992 | #define HW_BROADWAY_ICR 0x00 |
993 | #define HW_BROADWAY_IMR 0x04 |
994 | +#define HW_STARLET_ICR 0x08 |
995 | +#define HW_STARLET_IMR 0x0c |
996 | |
997 | |
998 | /* |
999 | @@ -74,6 +76,9 @@ static void hlwd_pic_unmask(struct irq_data *d) |
1000 | void __iomem *io_base = irq_data_get_irq_chip_data(d); |
1001 | |
1002 | setbits32(io_base + HW_BROADWAY_IMR, 1 << irq); |
1003 | + |
1004 | + /* Make sure the ARM (aka. Starlet) doesn't handle this interrupt. */ |
1005 | + clrbits32(io_base + HW_STARLET_IMR, 1 << irq); |
1006 | } |
1007 | |
1008 | |
1009 | diff --git a/arch/powerpc/platforms/powermac/bootx_init.c b/arch/powerpc/platforms/powermac/bootx_init.c |
1010 | index c3c9bbb3573a..ba0964c17620 100644 |
1011 | --- a/arch/powerpc/platforms/powermac/bootx_init.c |
1012 | +++ b/arch/powerpc/platforms/powermac/bootx_init.c |
1013 | @@ -468,7 +468,7 @@ void __init bootx_init(unsigned long r3, unsigned long r4) |
1014 | boot_infos_t *bi = (boot_infos_t *) r4; |
1015 | unsigned long hdr; |
1016 | unsigned long space; |
1017 | - unsigned long ptr, x; |
1018 | + unsigned long ptr; |
1019 | char *model; |
1020 | unsigned long offset = reloc_offset(); |
1021 | |
1022 | @@ -562,6 +562,8 @@ void __init bootx_init(unsigned long r3, unsigned long r4) |
1023 | * MMU switched OFF, so this should not be useful anymore. |
1024 | */ |
1025 | if (bi->version < 4) { |
1026 | + unsigned long x __maybe_unused; |
1027 | + |
1028 | bootx_printf("Touching pages...\n"); |
1029 | |
1030 | /* |
1031 | diff --git a/arch/powerpc/platforms/powermac/setup.c b/arch/powerpc/platforms/powermac/setup.c |
1032 | index ab668cb72263..8b2eab1340f4 100644 |
1033 | --- a/arch/powerpc/platforms/powermac/setup.c |
1034 | +++ b/arch/powerpc/platforms/powermac/setup.c |
1035 | @@ -352,6 +352,7 @@ static int pmac_late_init(void) |
1036 | } |
1037 | machine_late_initcall(powermac, pmac_late_init); |
1038 | |
1039 | +void note_bootable_part(dev_t dev, int part, int goodness); |
1040 | /* |
1041 | * This is __ref because we check for "initializing" before |
1042 | * touching any of the __init sensitive things and "initializing" |
1043 | diff --git a/arch/s390/include/asm/cpu_mf.h b/arch/s390/include/asm/cpu_mf.h |
1044 | index 05480e4cc5ca..bc764a674594 100644 |
1045 | --- a/arch/s390/include/asm/cpu_mf.h |
1046 | +++ b/arch/s390/include/asm/cpu_mf.h |
1047 | @@ -116,7 +116,7 @@ struct hws_basic_entry { |
1048 | |
1049 | struct hws_diag_entry { |
1050 | unsigned int def:16; /* 0-15 Data Entry Format */ |
1051 | - unsigned int R:14; /* 16-19 and 20-30 reserved */ |
1052 | + unsigned int R:15; /* 16-19 and 20-30 reserved */ |
1053 | unsigned int I:1; /* 31 entry valid or invalid */ |
1054 | u8 data[]; /* Machine-dependent sample data */ |
1055 | } __packed; |
1056 | @@ -132,7 +132,9 @@ struct hws_trailer_entry { |
1057 | unsigned int f:1; /* 0 - Block Full Indicator */ |
1058 | unsigned int a:1; /* 1 - Alert request control */ |
1059 | unsigned int t:1; /* 2 - Timestamp format */ |
1060 | - unsigned long long:61; /* 3 - 63: Reserved */ |
1061 | + unsigned int :29; /* 3 - 31: Reserved */ |
1062 | + unsigned int bsdes:16; /* 32-47: size of basic SDE */ |
1063 | + unsigned int dsdes:16; /* 48-63: size of diagnostic SDE */ |
1064 | }; |
1065 | unsigned long long flags; /* 0 - 63: All indicators */ |
1066 | }; |
1067 | diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c |
1068 | index d45e06346f14..c56cb37b88e3 100644 |
1069 | --- a/arch/x86/events/intel/uncore.c |
1070 | +++ b/arch/x86/events/intel/uncore.c |
1071 | @@ -218,7 +218,7 @@ void uncore_perf_event_update(struct intel_uncore_box *box, struct perf_event *e |
1072 | u64 prev_count, new_count, delta; |
1073 | int shift; |
1074 | |
1075 | - if (event->hw.idx >= UNCORE_PMC_IDX_FIXED) |
1076 | + if (event->hw.idx == UNCORE_PMC_IDX_FIXED) |
1077 | shift = 64 - uncore_fixed_ctr_bits(box); |
1078 | else |
1079 | shift = 64 - uncore_perf_ctr_bits(box); |
1080 | diff --git a/arch/x86/events/intel/uncore_nhmex.c b/arch/x86/events/intel/uncore_nhmex.c |
1081 | index 93e7a8397cde..173e2674be6e 100644 |
1082 | --- a/arch/x86/events/intel/uncore_nhmex.c |
1083 | +++ b/arch/x86/events/intel/uncore_nhmex.c |
1084 | @@ -246,7 +246,7 @@ static void nhmex_uncore_msr_enable_event(struct intel_uncore_box *box, struct p |
1085 | { |
1086 | struct hw_perf_event *hwc = &event->hw; |
1087 | |
1088 | - if (hwc->idx >= UNCORE_PMC_IDX_FIXED) |
1089 | + if (hwc->idx == UNCORE_PMC_IDX_FIXED) |
1090 | wrmsrl(hwc->config_base, NHMEX_PMON_CTL_EN_BIT0); |
1091 | else if (box->pmu->type->event_mask & NHMEX_PMON_CTL_EN_BIT0) |
1092 | wrmsrl(hwc->config_base, hwc->config | NHMEX_PMON_CTL_EN_BIT22); |
1093 | diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c |
1094 | index c8e0cda0f272..4fc0e08a30b9 100644 |
1095 | --- a/arch/x86/kernel/cpu/microcode/core.c |
1096 | +++ b/arch/x86/kernel/cpu/microcode/core.c |
1097 | @@ -70,7 +70,7 @@ static DEFINE_MUTEX(microcode_mutex); |
1098 | /* |
1099 | * Serialize late loading so that CPUs get updated one-by-one. |
1100 | */ |
1101 | -static DEFINE_SPINLOCK(update_lock); |
1102 | +static DEFINE_RAW_SPINLOCK(update_lock); |
1103 | |
1104 | struct ucode_cpu_info ucode_cpu_info[NR_CPUS]; |
1105 | |
1106 | @@ -560,9 +560,9 @@ static int __reload_late(void *info) |
1107 | if (__wait_for_cpus(&late_cpus_in, NSEC_PER_SEC)) |
1108 | return -1; |
1109 | |
1110 | - spin_lock(&update_lock); |
1111 | + raw_spin_lock(&update_lock); |
1112 | apply_microcode_local(&err); |
1113 | - spin_unlock(&update_lock); |
1114 | + raw_spin_unlock(&update_lock); |
1115 | |
1116 | /* siblings return UCODE_OK because their engine got updated already */ |
1117 | if (err > UCODE_NFOUND) { |
1118 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c |
1119 | index 43bbece92632..2ef2f1fe875b 100644 |
1120 | --- a/arch/x86/kvm/mmu.c |
1121 | +++ b/arch/x86/kvm/mmu.c |
1122 | @@ -890,7 +890,7 @@ static int mmu_topup_memory_cache_page(struct kvm_mmu_memory_cache *cache, |
1123 | if (cache->nobjs >= min) |
1124 | return 0; |
1125 | while (cache->nobjs < ARRAY_SIZE(cache->objects)) { |
1126 | - page = (void *)__get_free_page(GFP_KERNEL); |
1127 | + page = (void *)__get_free_page(GFP_KERNEL_ACCOUNT); |
1128 | if (!page) |
1129 | return -ENOMEM; |
1130 | cache->objects[cache->nobjs++] = page; |
1131 | diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c |
1132 | index 56c9cd01fd1d..4a4b7d3c909a 100644 |
1133 | --- a/block/bfq-iosched.c |
1134 | +++ b/block/bfq-iosched.c |
1135 | @@ -1678,7 +1678,6 @@ static void bfq_requests_merged(struct request_queue *q, struct request *rq, |
1136 | |
1137 | if (!RB_EMPTY_NODE(&rq->rb_node)) |
1138 | goto end; |
1139 | - spin_lock_irq(&bfqq->bfqd->lock); |
1140 | |
1141 | /* |
1142 | * If next and rq belong to the same bfq_queue and next is older |
1143 | @@ -1702,7 +1701,6 @@ static void bfq_requests_merged(struct request_queue *q, struct request *rq, |
1144 | |
1145 | bfq_remove_request(q, next); |
1146 | |
1147 | - spin_unlock_irq(&bfqq->bfqd->lock); |
1148 | end: |
1149 | bfqg_stats_update_io_merged(bfqq_group(bfqq), next->cmd_flags); |
1150 | } |
1151 | diff --git a/block/bio.c b/block/bio.c |
1152 | index 90f19d7df66c..194d28cdc642 100644 |
1153 | --- a/block/bio.c |
1154 | +++ b/block/bio.c |
1155 | @@ -881,16 +881,16 @@ EXPORT_SYMBOL(bio_add_page); |
1156 | */ |
1157 | int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) |
1158 | { |
1159 | - unsigned short nr_pages = bio->bi_max_vecs - bio->bi_vcnt; |
1160 | + unsigned short nr_pages = bio->bi_max_vecs - bio->bi_vcnt, idx; |
1161 | struct bio_vec *bv = bio->bi_io_vec + bio->bi_vcnt; |
1162 | struct page **pages = (struct page **)bv; |
1163 | - size_t offset, diff; |
1164 | + size_t offset; |
1165 | ssize_t size; |
1166 | |
1167 | size = iov_iter_get_pages(iter, pages, LONG_MAX, nr_pages, &offset); |
1168 | if (unlikely(size <= 0)) |
1169 | return size ? size : -EFAULT; |
1170 | - nr_pages = (size + offset + PAGE_SIZE - 1) / PAGE_SIZE; |
1171 | + idx = nr_pages = (size + offset + PAGE_SIZE - 1) / PAGE_SIZE; |
1172 | |
1173 | /* |
1174 | * Deep magic below: We need to walk the pinned pages backwards |
1175 | @@ -903,17 +903,15 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) |
1176 | bio->bi_iter.bi_size += size; |
1177 | bio->bi_vcnt += nr_pages; |
1178 | |
1179 | - diff = (nr_pages * PAGE_SIZE - offset) - size; |
1180 | - while (nr_pages--) { |
1181 | - bv[nr_pages].bv_page = pages[nr_pages]; |
1182 | - bv[nr_pages].bv_len = PAGE_SIZE; |
1183 | - bv[nr_pages].bv_offset = 0; |
1184 | + while (idx--) { |
1185 | + bv[idx].bv_page = pages[idx]; |
1186 | + bv[idx].bv_len = PAGE_SIZE; |
1187 | + bv[idx].bv_offset = 0; |
1188 | } |
1189 | |
1190 | bv[0].bv_offset += offset; |
1191 | bv[0].bv_len -= offset; |
1192 | - if (diff) |
1193 | - bv[bio->bi_vcnt - 1].bv_len -= diff; |
1194 | + bv[nr_pages - 1].bv_len -= nr_pages * PAGE_SIZE - offset - size; |
1195 | |
1196 | iov_iter_advance(iter, size); |
1197 | return 0; |
1198 | @@ -1891,6 +1889,7 @@ struct bio *bio_split(struct bio *bio, int sectors, |
1199 | bio_integrity_trim(split); |
1200 | |
1201 | bio_advance(bio, split->bi_iter.bi_size); |
1202 | + bio->bi_iter.bi_done = 0; |
1203 | |
1204 | if (bio_flagged(bio, BIO_TRACE_COMPLETION)) |
1205 | bio_set_flag(split, BIO_TRACE_COMPLETION); |
1206 | diff --git a/crypto/authenc.c b/crypto/authenc.c |
1207 | index 875470b0e026..0db344d5a01a 100644 |
1208 | --- a/crypto/authenc.c |
1209 | +++ b/crypto/authenc.c |
1210 | @@ -108,6 +108,7 @@ static int crypto_authenc_setkey(struct crypto_aead *authenc, const u8 *key, |
1211 | CRYPTO_TFM_RES_MASK); |
1212 | |
1213 | out: |
1214 | + memzero_explicit(&keys, sizeof(keys)); |
1215 | return err; |
1216 | |
1217 | badkey: |
1218 | diff --git a/crypto/authencesn.c b/crypto/authencesn.c |
1219 | index 0cf5fefdb859..6de852ce4cf8 100644 |
1220 | --- a/crypto/authencesn.c |
1221 | +++ b/crypto/authencesn.c |
1222 | @@ -90,6 +90,7 @@ static int crypto_authenc_esn_setkey(struct crypto_aead *authenc_esn, const u8 * |
1223 | CRYPTO_TFM_RES_MASK); |
1224 | |
1225 | out: |
1226 | + memzero_explicit(&keys, sizeof(keys)); |
1227 | return err; |
1228 | |
1229 | badkey: |
1230 | diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c |
1231 | index 602ae58ee2d8..75c3cb377b98 100644 |
1232 | --- a/drivers/acpi/acpi_lpss.c |
1233 | +++ b/drivers/acpi/acpi_lpss.c |
1234 | @@ -69,6 +69,10 @@ ACPI_MODULE_NAME("acpi_lpss"); |
1235 | #define LPSS_SAVE_CTX BIT(4) |
1236 | #define LPSS_NO_D3_DELAY BIT(5) |
1237 | |
1238 | +/* Crystal Cove PMIC shares same ACPI ID between different platforms */ |
1239 | +#define BYT_CRC_HRV 2 |
1240 | +#define CHT_CRC_HRV 3 |
1241 | + |
1242 | struct lpss_private_data; |
1243 | |
1244 | struct lpss_device_desc { |
1245 | @@ -162,7 +166,7 @@ static void byt_pwm_setup(struct lpss_private_data *pdata) |
1246 | if (!adev->pnp.unique_id || strcmp(adev->pnp.unique_id, "1")) |
1247 | return; |
1248 | |
1249 | - if (!acpi_dev_present("INT33FD", NULL, -1)) |
1250 | + if (!acpi_dev_present("INT33FD", NULL, BYT_CRC_HRV)) |
1251 | pwm_add_table(byt_pwm_lookup, ARRAY_SIZE(byt_pwm_lookup)); |
1252 | } |
1253 | |
1254 | diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c |
1255 | index 6fc204a52493..eb857d6ea1fe 100644 |
1256 | --- a/drivers/acpi/pci_root.c |
1257 | +++ b/drivers/acpi/pci_root.c |
1258 | @@ -472,9 +472,11 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm) |
1259 | } |
1260 | |
1261 | control = OSC_PCI_EXPRESS_CAPABILITY_CONTROL |
1262 | - | OSC_PCI_EXPRESS_NATIVE_HP_CONTROL |
1263 | | OSC_PCI_EXPRESS_PME_CONTROL; |
1264 | |
1265 | + if (IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE)) |
1266 | + control |= OSC_PCI_EXPRESS_NATIVE_HP_CONTROL; |
1267 | + |
1268 | if (pci_aer_available()) { |
1269 | if (aer_acpi_firmware_first()) |
1270 | dev_info(&device->dev, |
1271 | diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c |
1272 | index 711dd91b5e2c..2651c81d1edf 100644 |
1273 | --- a/drivers/ata/libata-eh.c |
1274 | +++ b/drivers/ata/libata-eh.c |
1275 | @@ -2217,12 +2217,16 @@ static void ata_eh_link_autopsy(struct ata_link *link) |
1276 | if (qc->err_mask & ~AC_ERR_OTHER) |
1277 | qc->err_mask &= ~AC_ERR_OTHER; |
1278 | |
1279 | - /* SENSE_VALID trumps dev/unknown error and revalidation */ |
1280 | + /* |
1281 | + * SENSE_VALID trumps dev/unknown error and revalidation. Upper |
1282 | + * layers will determine whether the command is worth retrying |
1283 | + * based on the sense data and device class/type. Otherwise, |
1284 | + * determine directly if the command is worth retrying using its |
1285 | + * error mask and flags. |
1286 | + */ |
1287 | if (qc->flags & ATA_QCFLAG_SENSE_VALID) |
1288 | qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER); |
1289 | - |
1290 | - /* determine whether the command is worth retrying */ |
1291 | - if (ata_eh_worth_retry(qc)) |
1292 | + else if (ata_eh_worth_retry(qc)) |
1293 | qc->flags |= ATA_QCFLAG_RETRY; |
1294 | |
1295 | /* accumulate error info */ |
1296 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
1297 | index 86d7975afaeb..819521d5895e 100644 |
1298 | --- a/drivers/bluetooth/btusb.c |
1299 | +++ b/drivers/bluetooth/btusb.c |
1300 | @@ -279,6 +279,7 @@ static const struct usb_device_id blacklist_table[] = { |
1301 | { USB_DEVICE(0x04ca, 0x3011), .driver_info = BTUSB_QCA_ROME }, |
1302 | { USB_DEVICE(0x04ca, 0x3015), .driver_info = BTUSB_QCA_ROME }, |
1303 | { USB_DEVICE(0x04ca, 0x3016), .driver_info = BTUSB_QCA_ROME }, |
1304 | + { USB_DEVICE(0x04ca, 0x301a), .driver_info = BTUSB_QCA_ROME }, |
1305 | |
1306 | /* Broadcom BCM2035 */ |
1307 | { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 }, |
1308 | @@ -373,6 +374,9 @@ static const struct usb_device_id blacklist_table[] = { |
1309 | /* Additional Realtek 8723BU Bluetooth devices */ |
1310 | { USB_DEVICE(0x7392, 0xa611), .driver_info = BTUSB_REALTEK }, |
1311 | |
1312 | + /* Additional Realtek 8723DE Bluetooth devices */ |
1313 | + { USB_DEVICE(0x2ff8, 0xb011), .driver_info = BTUSB_REALTEK }, |
1314 | + |
1315 | /* Additional Realtek 8821AE Bluetooth devices */ |
1316 | { USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK }, |
1317 | { USB_DEVICE(0x13d3, 0x3414), .driver_info = BTUSB_REALTEK }, |
1318 | diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c |
1319 | index 6f4ebd5e54c8..a6173ddfb5a7 100644 |
1320 | --- a/drivers/bluetooth/hci_qca.c |
1321 | +++ b/drivers/bluetooth/hci_qca.c |
1322 | @@ -881,7 +881,7 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate) |
1323 | */ |
1324 | set_current_state(TASK_UNINTERRUPTIBLE); |
1325 | schedule_timeout(msecs_to_jiffies(BAUDRATE_SETTLE_TIMEOUT_MS)); |
1326 | - set_current_state(TASK_INTERRUPTIBLE); |
1327 | + set_current_state(TASK_RUNNING); |
1328 | |
1329 | return 0; |
1330 | } |
1331 | diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c |
1332 | index 72fd1750134d..942d076cbb0a 100644 |
1333 | --- a/drivers/bus/arm-ccn.c |
1334 | +++ b/drivers/bus/arm-ccn.c |
1335 | @@ -736,7 +736,7 @@ static int arm_ccn_pmu_event_init(struct perf_event *event) |
1336 | ccn = pmu_to_arm_ccn(event->pmu); |
1337 | |
1338 | if (hw->sample_period) { |
1339 | - dev_warn(ccn->dev, "Sampling not supported!\n"); |
1340 | + dev_dbg(ccn->dev, "Sampling not supported!\n"); |
1341 | return -EOPNOTSUPP; |
1342 | } |
1343 | |
1344 | @@ -744,12 +744,12 @@ static int arm_ccn_pmu_event_init(struct perf_event *event) |
1345 | event->attr.exclude_kernel || event->attr.exclude_hv || |
1346 | event->attr.exclude_idle || event->attr.exclude_host || |
1347 | event->attr.exclude_guest) { |
1348 | - dev_warn(ccn->dev, "Can't exclude execution levels!\n"); |
1349 | + dev_dbg(ccn->dev, "Can't exclude execution levels!\n"); |
1350 | return -EINVAL; |
1351 | } |
1352 | |
1353 | if (event->cpu < 0) { |
1354 | - dev_warn(ccn->dev, "Can't provide per-task data!\n"); |
1355 | + dev_dbg(ccn->dev, "Can't provide per-task data!\n"); |
1356 | return -EOPNOTSUPP; |
1357 | } |
1358 | /* |
1359 | @@ -771,13 +771,13 @@ static int arm_ccn_pmu_event_init(struct perf_event *event) |
1360 | switch (type) { |
1361 | case CCN_TYPE_MN: |
1362 | if (node_xp != ccn->mn_id) { |
1363 | - dev_warn(ccn->dev, "Invalid MN ID %d!\n", node_xp); |
1364 | + dev_dbg(ccn->dev, "Invalid MN ID %d!\n", node_xp); |
1365 | return -EINVAL; |
1366 | } |
1367 | break; |
1368 | case CCN_TYPE_XP: |
1369 | if (node_xp >= ccn->num_xps) { |
1370 | - dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp); |
1371 | + dev_dbg(ccn->dev, "Invalid XP ID %d!\n", node_xp); |
1372 | return -EINVAL; |
1373 | } |
1374 | break; |
1375 | @@ -785,11 +785,11 @@ static int arm_ccn_pmu_event_init(struct perf_event *event) |
1376 | break; |
1377 | default: |
1378 | if (node_xp >= ccn->num_nodes) { |
1379 | - dev_warn(ccn->dev, "Invalid node ID %d!\n", node_xp); |
1380 | + dev_dbg(ccn->dev, "Invalid node ID %d!\n", node_xp); |
1381 | return -EINVAL; |
1382 | } |
1383 | if (!arm_ccn_pmu_type_eq(type, ccn->node[node_xp].type)) { |
1384 | - dev_warn(ccn->dev, "Invalid type 0x%x for node %d!\n", |
1385 | + dev_dbg(ccn->dev, "Invalid type 0x%x for node %d!\n", |
1386 | type, node_xp); |
1387 | return -EINVAL; |
1388 | } |
1389 | @@ -808,19 +808,19 @@ static int arm_ccn_pmu_event_init(struct perf_event *event) |
1390 | if (event_id != e->event) |
1391 | continue; |
1392 | if (e->num_ports && port >= e->num_ports) { |
1393 | - dev_warn(ccn->dev, "Invalid port %d for node/XP %d!\n", |
1394 | + dev_dbg(ccn->dev, "Invalid port %d for node/XP %d!\n", |
1395 | port, node_xp); |
1396 | return -EINVAL; |
1397 | } |
1398 | if (e->num_vcs && vc >= e->num_vcs) { |
1399 | - dev_warn(ccn->dev, "Invalid vc %d for node/XP %d!\n", |
1400 | + dev_dbg(ccn->dev, "Invalid vc %d for node/XP %d!\n", |
1401 | vc, node_xp); |
1402 | return -EINVAL; |
1403 | } |
1404 | valid = 1; |
1405 | } |
1406 | if (!valid) { |
1407 | - dev_warn(ccn->dev, "Invalid event 0x%x for node/XP %d!\n", |
1408 | + dev_dbg(ccn->dev, "Invalid event 0x%x for node/XP %d!\n", |
1409 | event_id, node_xp); |
1410 | return -EINVAL; |
1411 | } |
1412 | diff --git a/drivers/char/random.c b/drivers/char/random.c |
1413 | index ddc493d976fd..ea4dbfa30657 100644 |
1414 | --- a/drivers/char/random.c |
1415 | +++ b/drivers/char/random.c |
1416 | @@ -1897,14 +1897,22 @@ static int |
1417 | write_pool(struct entropy_store *r, const char __user *buffer, size_t count) |
1418 | { |
1419 | size_t bytes; |
1420 | - __u32 buf[16]; |
1421 | + __u32 t, buf[16]; |
1422 | const char __user *p = buffer; |
1423 | |
1424 | while (count > 0) { |
1425 | + int b, i = 0; |
1426 | + |
1427 | bytes = min(count, sizeof(buf)); |
1428 | if (copy_from_user(&buf, p, bytes)) |
1429 | return -EFAULT; |
1430 | |
1431 | + for (b = bytes ; b > 0 ; b -= sizeof(__u32), i++) { |
1432 | + if (!arch_get_random_int(&t)) |
1433 | + break; |
1434 | + buf[i] ^= t; |
1435 | + } |
1436 | + |
1437 | count -= bytes; |
1438 | p += bytes; |
1439 | |
1440 | diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c |
1441 | index 346c4987b284..38983f56ad0d 100644 |
1442 | --- a/drivers/edac/altera_edac.c |
1443 | +++ b/drivers/edac/altera_edac.c |
1444 | @@ -1106,7 +1106,7 @@ static void *ocram_alloc_mem(size_t size, void **other) |
1445 | |
1446 | static void ocram_free_mem(void *p, size_t size, void *other) |
1447 | { |
1448 | - gen_pool_free((struct gen_pool *)other, (u32)p, size); |
1449 | + gen_pool_free((struct gen_pool *)other, (unsigned long)p, size); |
1450 | } |
1451 | |
1452 | static const struct edac_device_prv_data ocramecc_data = { |
1453 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |
1454 | index 1360a24d2ede..f08624f2f209 100644 |
1455 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |
1456 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |
1457 | @@ -683,8 +683,12 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain, |
1458 | return -EINVAL; |
1459 | |
1460 | /* A shared bo cannot be migrated to VRAM */ |
1461 | - if (bo->prime_shared_count && (domain == AMDGPU_GEM_DOMAIN_VRAM)) |
1462 | - return -EINVAL; |
1463 | + if (bo->prime_shared_count) { |
1464 | + if (domain & AMDGPU_GEM_DOMAIN_GTT) |
1465 | + domain = AMDGPU_GEM_DOMAIN_GTT; |
1466 | + else |
1467 | + return -EINVAL; |
1468 | + } |
1469 | |
1470 | if (bo->pin_count) { |
1471 | uint32_t mem_type = bo->tbo.mem.mem_type; |
1472 | diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c |
1473 | index 0d8a417e2cd6..bb5cc15fa0b9 100644 |
1474 | --- a/drivers/gpu/drm/drm_atomic.c |
1475 | +++ b/drivers/gpu/drm/drm_atomic.c |
1476 | @@ -1355,7 +1355,9 @@ drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state, |
1477 | { |
1478 | struct drm_plane *plane = plane_state->plane; |
1479 | struct drm_crtc_state *crtc_state; |
1480 | - |
1481 | + /* Nothing to do for same crtc*/ |
1482 | + if (plane_state->crtc == crtc) |
1483 | + return 0; |
1484 | if (plane_state->crtc) { |
1485 | crtc_state = drm_atomic_get_crtc_state(plane_state->state, |
1486 | plane_state->crtc); |
1487 | diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c |
1488 | index 0028591f3f95..1f08d597b87a 100644 |
1489 | --- a/drivers/gpu/drm/drm_atomic_helper.c |
1490 | +++ b/drivers/gpu/drm/drm_atomic_helper.c |
1491 | @@ -2683,31 +2683,9 @@ commit: |
1492 | return 0; |
1493 | } |
1494 | |
1495 | -/** |
1496 | - * drm_atomic_helper_disable_all - disable all currently active outputs |
1497 | - * @dev: DRM device |
1498 | - * @ctx: lock acquisition context |
1499 | - * |
1500 | - * Loops through all connectors, finding those that aren't turned off and then |
1501 | - * turns them off by setting their DPMS mode to OFF and deactivating the CRTC |
1502 | - * that they are connected to. |
1503 | - * |
1504 | - * This is used for example in suspend/resume to disable all currently active |
1505 | - * functions when suspending. If you just want to shut down everything at e.g. |
1506 | - * driver unload, look at drm_atomic_helper_shutdown(). |
1507 | - * |
1508 | - * Note that if callers haven't already acquired all modeset locks this might |
1509 | - * return -EDEADLK, which must be handled by calling drm_modeset_backoff(). |
1510 | - * |
1511 | - * Returns: |
1512 | - * 0 on success or a negative error code on failure. |
1513 | - * |
1514 | - * See also: |
1515 | - * drm_atomic_helper_suspend(), drm_atomic_helper_resume() and |
1516 | - * drm_atomic_helper_shutdown(). |
1517 | - */ |
1518 | -int drm_atomic_helper_disable_all(struct drm_device *dev, |
1519 | - struct drm_modeset_acquire_ctx *ctx) |
1520 | +static int __drm_atomic_helper_disable_all(struct drm_device *dev, |
1521 | + struct drm_modeset_acquire_ctx *ctx, |
1522 | + bool clean_old_fbs) |
1523 | { |
1524 | struct drm_atomic_state *state; |
1525 | struct drm_connector_state *conn_state; |
1526 | @@ -2759,8 +2737,11 @@ int drm_atomic_helper_disable_all(struct drm_device *dev, |
1527 | goto free; |
1528 | |
1529 | drm_atomic_set_fb_for_plane(plane_state, NULL); |
1530 | - plane_mask |= BIT(drm_plane_index(plane)); |
1531 | - plane->old_fb = plane->fb; |
1532 | + |
1533 | + if (clean_old_fbs) { |
1534 | + plane->old_fb = plane->fb; |
1535 | + plane_mask |= BIT(drm_plane_index(plane)); |
1536 | + } |
1537 | } |
1538 | |
1539 | ret = drm_atomic_commit(state); |
1540 | @@ -2771,6 +2752,34 @@ free: |
1541 | return ret; |
1542 | } |
1543 | |
1544 | +/** |
1545 | + * drm_atomic_helper_disable_all - disable all currently active outputs |
1546 | + * @dev: DRM device |
1547 | + * @ctx: lock acquisition context |
1548 | + * |
1549 | + * Loops through all connectors, finding those that aren't turned off and then |
1550 | + * turns them off by setting their DPMS mode to OFF and deactivating the CRTC |
1551 | + * that they are connected to. |
1552 | + * |
1553 | + * This is used for example in suspend/resume to disable all currently active |
1554 | + * functions when suspending. If you just want to shut down everything at e.g. |
1555 | + * driver unload, look at drm_atomic_helper_shutdown(). |
1556 | + * |
1557 | + * Note that if callers haven't already acquired all modeset locks this might |
1558 | + * return -EDEADLK, which must be handled by calling drm_modeset_backoff(). |
1559 | + * |
1560 | + * Returns: |
1561 | + * 0 on success or a negative error code on failure. |
1562 | + * |
1563 | + * See also: |
1564 | + * drm_atomic_helper_suspend(), drm_atomic_helper_resume() and |
1565 | + * drm_atomic_helper_shutdown(). |
1566 | + */ |
1567 | +int drm_atomic_helper_disable_all(struct drm_device *dev, |
1568 | + struct drm_modeset_acquire_ctx *ctx) |
1569 | +{ |
1570 | + return __drm_atomic_helper_disable_all(dev, ctx, false); |
1571 | +} |
1572 | EXPORT_SYMBOL(drm_atomic_helper_disable_all); |
1573 | |
1574 | /** |
1575 | @@ -2793,7 +2802,7 @@ void drm_atomic_helper_shutdown(struct drm_device *dev) |
1576 | while (1) { |
1577 | ret = drm_modeset_lock_all_ctx(dev, &ctx); |
1578 | if (!ret) |
1579 | - ret = drm_atomic_helper_disable_all(dev, &ctx); |
1580 | + ret = __drm_atomic_helper_disable_all(dev, &ctx, true); |
1581 | |
1582 | if (ret != -EDEADLK) |
1583 | break; |
1584 | @@ -2897,16 +2906,11 @@ int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state, |
1585 | struct drm_connector_state *new_conn_state; |
1586 | struct drm_crtc *crtc; |
1587 | struct drm_crtc_state *new_crtc_state; |
1588 | - unsigned plane_mask = 0; |
1589 | - struct drm_device *dev = state->dev; |
1590 | - int ret; |
1591 | |
1592 | state->acquire_ctx = ctx; |
1593 | |
1594 | - for_each_new_plane_in_state(state, plane, new_plane_state, i) { |
1595 | - plane_mask |= BIT(drm_plane_index(plane)); |
1596 | + for_each_new_plane_in_state(state, plane, new_plane_state, i) |
1597 | state->planes[i].old_state = plane->state; |
1598 | - } |
1599 | |
1600 | for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) |
1601 | state->crtcs[i].old_state = crtc->state; |
1602 | @@ -2914,11 +2918,7 @@ int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state, |
1603 | for_each_new_connector_in_state(state, connector, new_conn_state, i) |
1604 | state->connectors[i].old_state = connector->state; |
1605 | |
1606 | - ret = drm_atomic_commit(state); |
1607 | - if (plane_mask) |
1608 | - drm_atomic_clean_old_fb(dev, plane_mask, ret); |
1609 | - |
1610 | - return ret; |
1611 | + return drm_atomic_commit(state); |
1612 | } |
1613 | EXPORT_SYMBOL(drm_atomic_helper_commit_duplicated_state); |
1614 | |
1615 | diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c |
1616 | index 41b492f99955..c022ab6e84bd 100644 |
1617 | --- a/drivers/gpu/drm/drm_dp_mst_topology.c |
1618 | +++ b/drivers/gpu/drm/drm_dp_mst_topology.c |
1619 | @@ -2862,12 +2862,14 @@ static void drm_dp_mst_dump_mstb(struct seq_file *m, |
1620 | } |
1621 | } |
1622 | |
1623 | +#define DP_PAYLOAD_TABLE_SIZE 64 |
1624 | + |
1625 | static bool dump_dp_payload_table(struct drm_dp_mst_topology_mgr *mgr, |
1626 | char *buf) |
1627 | { |
1628 | int i; |
1629 | |
1630 | - for (i = 0; i < 64; i += 16) { |
1631 | + for (i = 0; i < DP_PAYLOAD_TABLE_SIZE; i += 16) { |
1632 | if (drm_dp_dpcd_read(mgr->aux, |
1633 | DP_PAYLOAD_TABLE_UPDATE_STATUS + i, |
1634 | &buf[i], 16) != 16) |
1635 | @@ -2936,7 +2938,7 @@ void drm_dp_mst_dump_topology(struct seq_file *m, |
1636 | |
1637 | mutex_lock(&mgr->lock); |
1638 | if (mgr->mst_primary) { |
1639 | - u8 buf[64]; |
1640 | + u8 buf[DP_PAYLOAD_TABLE_SIZE]; |
1641 | int ret; |
1642 | |
1643 | ret = drm_dp_dpcd_read(mgr->aux, DP_DPCD_REV, buf, DP_RECEIVER_CAP_SIZE); |
1644 | @@ -2954,8 +2956,7 @@ void drm_dp_mst_dump_topology(struct seq_file *m, |
1645 | seq_printf(m, " revision: hw: %x.%x sw: %x.%x\n", |
1646 | buf[0x9] >> 4, buf[0x9] & 0xf, buf[0xa], buf[0xb]); |
1647 | if (dump_dp_payload_table(mgr, buf)) |
1648 | - seq_printf(m, "payload table: %*ph\n", 63, buf); |
1649 | - |
1650 | + seq_printf(m, "payload table: %*ph\n", DP_PAYLOAD_TABLE_SIZE, buf); |
1651 | } |
1652 | |
1653 | mutex_unlock(&mgr->lock); |
1654 | diff --git a/drivers/gpu/drm/gma500/psb_intel_drv.h b/drivers/gpu/drm/gma500/psb_intel_drv.h |
1655 | index e8e4ea14b12b..e05e5399af2d 100644 |
1656 | --- a/drivers/gpu/drm/gma500/psb_intel_drv.h |
1657 | +++ b/drivers/gpu/drm/gma500/psb_intel_drv.h |
1658 | @@ -255,7 +255,7 @@ extern int intelfb_remove(struct drm_device *dev, |
1659 | extern bool psb_intel_lvds_mode_fixup(struct drm_encoder *encoder, |
1660 | const struct drm_display_mode *mode, |
1661 | struct drm_display_mode *adjusted_mode); |
1662 | -extern int psb_intel_lvds_mode_valid(struct drm_connector *connector, |
1663 | +extern enum drm_mode_status psb_intel_lvds_mode_valid(struct drm_connector *connector, |
1664 | struct drm_display_mode *mode); |
1665 | extern int psb_intel_lvds_set_property(struct drm_connector *connector, |
1666 | struct drm_property *property, |
1667 | diff --git a/drivers/gpu/drm/gma500/psb_intel_lvds.c b/drivers/gpu/drm/gma500/psb_intel_lvds.c |
1668 | index be3eefec5152..8baf6325c6e4 100644 |
1669 | --- a/drivers/gpu/drm/gma500/psb_intel_lvds.c |
1670 | +++ b/drivers/gpu/drm/gma500/psb_intel_lvds.c |
1671 | @@ -343,7 +343,7 @@ static void psb_intel_lvds_restore(struct drm_connector *connector) |
1672 | } |
1673 | } |
1674 | |
1675 | -int psb_intel_lvds_mode_valid(struct drm_connector *connector, |
1676 | +enum drm_mode_status psb_intel_lvds_mode_valid(struct drm_connector *connector, |
1677 | struct drm_display_mode *mode) |
1678 | { |
1679 | struct drm_psb_private *dev_priv = connector->dev->dev_private; |
1680 | diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c |
1681 | index a7e55c422501..0b632dc0cf7d 100644 |
1682 | --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c |
1683 | +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c |
1684 | @@ -155,10 +155,10 @@ gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl) |
1685 | (target << 28)); |
1686 | nvkm_wr32(device, 0x002274, (runl << 20) | nr); |
1687 | |
1688 | - if (wait_event_timeout(fifo->runlist[runl].wait, |
1689 | - !(nvkm_rd32(device, 0x002284 + (runl * 0x08)) |
1690 | - & 0x00100000), |
1691 | - msecs_to_jiffies(2000)) == 0) |
1692 | + if (nvkm_msec(device, 2000, |
1693 | + if (!(nvkm_rd32(device, 0x002284 + (runl * 0x08)) & 0x00100000)) |
1694 | + break; |
1695 | + ) < 0) |
1696 | nvkm_error(subdev, "runlist %d update timeout\n", runl); |
1697 | unlock: |
1698 | mutex_unlock(&subdev->mutex); |
1699 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c |
1700 | index 424cd1b66575..337d3a1c2a40 100644 |
1701 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c |
1702 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c |
1703 | @@ -853,7 +853,7 @@ static int radeon_lvds_get_modes(struct drm_connector *connector) |
1704 | return ret; |
1705 | } |
1706 | |
1707 | -static int radeon_lvds_mode_valid(struct drm_connector *connector, |
1708 | +static enum drm_mode_status radeon_lvds_mode_valid(struct drm_connector *connector, |
1709 | struct drm_display_mode *mode) |
1710 | { |
1711 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
1712 | @@ -1013,7 +1013,7 @@ static int radeon_vga_get_modes(struct drm_connector *connector) |
1713 | return ret; |
1714 | } |
1715 | |
1716 | -static int radeon_vga_mode_valid(struct drm_connector *connector, |
1717 | +static enum drm_mode_status radeon_vga_mode_valid(struct drm_connector *connector, |
1718 | struct drm_display_mode *mode) |
1719 | { |
1720 | struct drm_device *dev = connector->dev; |
1721 | @@ -1157,7 +1157,7 @@ static int radeon_tv_get_modes(struct drm_connector *connector) |
1722 | return 1; |
1723 | } |
1724 | |
1725 | -static int radeon_tv_mode_valid(struct drm_connector *connector, |
1726 | +static enum drm_mode_status radeon_tv_mode_valid(struct drm_connector *connector, |
1727 | struct drm_display_mode *mode) |
1728 | { |
1729 | if ((mode->hdisplay > 1024) || (mode->vdisplay > 768)) |
1730 | @@ -1499,7 +1499,7 @@ static void radeon_dvi_force(struct drm_connector *connector) |
1731 | radeon_connector->use_digital = true; |
1732 | } |
1733 | |
1734 | -static int radeon_dvi_mode_valid(struct drm_connector *connector, |
1735 | +static enum drm_mode_status radeon_dvi_mode_valid(struct drm_connector *connector, |
1736 | struct drm_display_mode *mode) |
1737 | { |
1738 | struct drm_device *dev = connector->dev; |
1739 | @@ -1801,7 +1801,7 @@ out: |
1740 | return ret; |
1741 | } |
1742 | |
1743 | -static int radeon_dp_mode_valid(struct drm_connector *connector, |
1744 | +static enum drm_mode_status radeon_dp_mode_valid(struct drm_connector *connector, |
1745 | struct drm_display_mode *mode) |
1746 | { |
1747 | struct drm_device *dev = connector->dev; |
1748 | diff --git a/drivers/hid/hid-plantronics.c b/drivers/hid/hid-plantronics.c |
1749 | index febb21ee190e..584b10d3fc3d 100644 |
1750 | --- a/drivers/hid/hid-plantronics.c |
1751 | +++ b/drivers/hid/hid-plantronics.c |
1752 | @@ -2,7 +2,7 @@ |
1753 | * Plantronics USB HID Driver |
1754 | * |
1755 | * Copyright (c) 2014 JD Cole <jd.cole@plantronics.com> |
1756 | - * Copyright (c) 2015 Terry Junge <terry.junge@plantronics.com> |
1757 | + * Copyright (c) 2015-2018 Terry Junge <terry.junge@plantronics.com> |
1758 | */ |
1759 | |
1760 | /* |
1761 | @@ -48,6 +48,10 @@ static int plantronics_input_mapping(struct hid_device *hdev, |
1762 | unsigned short mapped_key; |
1763 | unsigned long plt_type = (unsigned long)hid_get_drvdata(hdev); |
1764 | |
1765 | + /* special case for PTT products */ |
1766 | + if (field->application == HID_GD_JOYSTICK) |
1767 | + goto defaulted; |
1768 | + |
1769 | /* handle volume up/down mapping */ |
1770 | /* non-standard types or multi-HID interfaces - plt_type is PID */ |
1771 | if (!(plt_type & HID_USAGE_PAGE)) { |
1772 | diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c |
1773 | index d92827556389..136a34dc31b8 100644 |
1774 | --- a/drivers/hid/i2c-hid/i2c-hid.c |
1775 | +++ b/drivers/hid/i2c-hid/i2c-hid.c |
1776 | @@ -1036,6 +1036,14 @@ static int i2c_hid_probe(struct i2c_client *client, |
1777 | pm_runtime_enable(&client->dev); |
1778 | device_enable_async_suspend(&client->dev); |
1779 | |
1780 | + /* Make sure there is something at this address */ |
1781 | + ret = i2c_smbus_read_byte(client); |
1782 | + if (ret < 0) { |
1783 | + dev_dbg(&client->dev, "nothing at this address: %d\n", ret); |
1784 | + ret = -ENXIO; |
1785 | + goto err_pm; |
1786 | + } |
1787 | + |
1788 | ret = i2c_hid_fetch_hid_descriptor(ihid); |
1789 | if (ret < 0) |
1790 | goto err_pm; |
1791 | diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c |
1792 | index 56e46581b84b..6f2fe63e8f5a 100644 |
1793 | --- a/drivers/i2c/i2c-core-base.c |
1794 | +++ b/drivers/i2c/i2c-core-base.c |
1795 | @@ -808,8 +808,11 @@ EXPORT_SYMBOL_GPL(i2c_new_device); |
1796 | */ |
1797 | void i2c_unregister_device(struct i2c_client *client) |
1798 | { |
1799 | - if (client->dev.of_node) |
1800 | + if (client->dev.of_node) { |
1801 | of_node_clear_flag(client->dev.of_node, OF_POPULATED); |
1802 | + of_node_put(client->dev.of_node); |
1803 | + } |
1804 | + |
1805 | if (ACPI_COMPANION(&client->dev)) |
1806 | acpi_device_clear_enumerated(ACPI_COMPANION(&client->dev)); |
1807 | device_unregister(&client->dev); |
1808 | diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c |
1809 | index d8efdc191c27..55252079faf6 100644 |
1810 | --- a/drivers/infiniband/core/mad.c |
1811 | +++ b/drivers/infiniband/core/mad.c |
1812 | @@ -1558,7 +1558,8 @@ static int add_oui_reg_req(struct ib_mad_reg_req *mad_reg_req, |
1813 | mad_reg_req->oui, 3)) { |
1814 | method = &(*vendor_table)->vendor_class[ |
1815 | vclass]->method_table[i]; |
1816 | - BUG_ON(!*method); |
1817 | + if (!*method) |
1818 | + goto error3; |
1819 | goto check_in_use; |
1820 | } |
1821 | } |
1822 | @@ -1568,10 +1569,12 @@ static int add_oui_reg_req(struct ib_mad_reg_req *mad_reg_req, |
1823 | vclass]->oui[i])) { |
1824 | method = &(*vendor_table)->vendor_class[ |
1825 | vclass]->method_table[i]; |
1826 | - BUG_ON(*method); |
1827 | /* Allocate method table for this OUI */ |
1828 | - if ((ret = allocate_method_table(method))) |
1829 | - goto error3; |
1830 | + if (!*method) { |
1831 | + ret = allocate_method_table(method); |
1832 | + if (ret) |
1833 | + goto error3; |
1834 | + } |
1835 | memcpy((*vendor_table)->vendor_class[vclass]->oui[i], |
1836 | mad_reg_req->oui, 3); |
1837 | goto check_in_use; |
1838 | diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c |
1839 | index e47baf0950e3..a22b992cde38 100644 |
1840 | --- a/drivers/infiniband/core/ucma.c |
1841 | +++ b/drivers/infiniband/core/ucma.c |
1842 | @@ -218,7 +218,7 @@ static struct ucma_multicast* ucma_alloc_multicast(struct ucma_context *ctx) |
1843 | return NULL; |
1844 | |
1845 | mutex_lock(&mut); |
1846 | - mc->id = idr_alloc(&multicast_idr, mc, 0, 0, GFP_KERNEL); |
1847 | + mc->id = idr_alloc(&multicast_idr, NULL, 0, 0, GFP_KERNEL); |
1848 | mutex_unlock(&mut); |
1849 | if (mc->id < 0) |
1850 | goto error; |
1851 | @@ -1404,6 +1404,10 @@ static ssize_t ucma_process_join(struct ucma_file *file, |
1852 | goto err3; |
1853 | } |
1854 | |
1855 | + mutex_lock(&mut); |
1856 | + idr_replace(&multicast_idr, mc, mc->id); |
1857 | + mutex_unlock(&mut); |
1858 | + |
1859 | mutex_unlock(&file->mut); |
1860 | ucma_put_ctx(ctx); |
1861 | return 0; |
1862 | diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c |
1863 | index 186dce6bba8f..b8229d7b0ff5 100644 |
1864 | --- a/drivers/infiniband/core/uverbs_cmd.c |
1865 | +++ b/drivers/infiniband/core/uverbs_cmd.c |
1866 | @@ -3376,6 +3376,11 @@ int ib_uverbs_ex_create_flow(struct ib_uverbs_file *file, |
1867 | goto err_uobj; |
1868 | } |
1869 | |
1870 | + if (qp->qp_type != IB_QPT_UD && qp->qp_type != IB_QPT_RAW_PACKET) { |
1871 | + err = -EINVAL; |
1872 | + goto err_put; |
1873 | + } |
1874 | + |
1875 | flow_attr = kzalloc(sizeof(*flow_attr) + cmd.flow_attr.num_of_specs * |
1876 | sizeof(union ib_flow_spec), GFP_KERNEL); |
1877 | if (!flow_attr) { |
1878 | diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c |
1879 | index 9032f77cc38d..feb80dbb5948 100644 |
1880 | --- a/drivers/infiniband/core/verbs.c |
1881 | +++ b/drivers/infiniband/core/verbs.c |
1882 | @@ -2115,10 +2115,16 @@ static void __ib_drain_sq(struct ib_qp *qp) |
1883 | struct ib_cq *cq = qp->send_cq; |
1884 | struct ib_qp_attr attr = { .qp_state = IB_QPS_ERR }; |
1885 | struct ib_drain_cqe sdrain; |
1886 | - struct ib_send_wr swr = {}, *bad_swr; |
1887 | + struct ib_send_wr *bad_swr; |
1888 | + struct ib_rdma_wr swr = { |
1889 | + .wr = { |
1890 | + .next = NULL, |
1891 | + { .wr_cqe = &sdrain.cqe, }, |
1892 | + .opcode = IB_WR_RDMA_WRITE, |
1893 | + }, |
1894 | + }; |
1895 | int ret; |
1896 | |
1897 | - swr.wr_cqe = &sdrain.cqe; |
1898 | sdrain.cqe.done = ib_drain_qp_done; |
1899 | init_completion(&sdrain.done); |
1900 | |
1901 | @@ -2128,7 +2134,7 @@ static void __ib_drain_sq(struct ib_qp *qp) |
1902 | return; |
1903 | } |
1904 | |
1905 | - ret = ib_post_send(qp, &swr, &bad_swr); |
1906 | + ret = ib_post_send(qp, &swr.wr, &bad_swr); |
1907 | if (ret) { |
1908 | WARN_ONCE(ret, "failed to drain send queue: %d\n", ret); |
1909 | return; |
1910 | diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c |
1911 | index ee578fa713c2..97c2225829ea 100644 |
1912 | --- a/drivers/infiniband/ulp/srpt/ib_srpt.c |
1913 | +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c |
1914 | @@ -787,13 +787,17 @@ static int srpt_post_recv(struct srpt_device *sdev, |
1915 | */ |
1916 | static int srpt_zerolength_write(struct srpt_rdma_ch *ch) |
1917 | { |
1918 | - struct ib_send_wr wr, *bad_wr; |
1919 | + struct ib_send_wr *bad_wr; |
1920 | + struct ib_rdma_wr wr = { |
1921 | + .wr = { |
1922 | + .next = NULL, |
1923 | + { .wr_cqe = &ch->zw_cqe, }, |
1924 | + .opcode = IB_WR_RDMA_WRITE, |
1925 | + .send_flags = IB_SEND_SIGNALED, |
1926 | + } |
1927 | + }; |
1928 | |
1929 | - memset(&wr, 0, sizeof(wr)); |
1930 | - wr.opcode = IB_WR_RDMA_WRITE; |
1931 | - wr.wr_cqe = &ch->zw_cqe; |
1932 | - wr.send_flags = IB_SEND_SIGNALED; |
1933 | - return ib_post_send(ch->qp, &wr, &bad_wr); |
1934 | + return ib_post_send(ch->qp, &wr.wr, &bad_wr); |
1935 | } |
1936 | |
1937 | static void srpt_zerolength_write_done(struct ib_cq *cq, struct ib_wc *wc) |
1938 | diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c |
1939 | index 7b5fa501bbcf..696e540304fd 100644 |
1940 | --- a/drivers/input/mouse/elan_i2c_core.c |
1941 | +++ b/drivers/input/mouse/elan_i2c_core.c |
1942 | @@ -1262,6 +1262,8 @@ static const struct acpi_device_id elan_acpi_id[] = { |
1943 | { "ELAN0611", 0 }, |
1944 | { "ELAN0612", 0 }, |
1945 | { "ELAN0618", 0 }, |
1946 | + { "ELAN061D", 0 }, |
1947 | + { "ELAN0622", 0 }, |
1948 | { "ELAN1000", 0 }, |
1949 | { } |
1950 | }; |
1951 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
1952 | index b353d494ad40..136f6e7bf797 100644 |
1953 | --- a/drivers/input/serio/i8042-x86ia64io.h |
1954 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
1955 | @@ -527,6 +527,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { |
1956 | DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"), |
1957 | }, |
1958 | }, |
1959 | + { |
1960 | + /* Lenovo LaVie Z */ |
1961 | + .matches = { |
1962 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
1963 | + DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo LaVie Z"), |
1964 | + }, |
1965 | + }, |
1966 | { } |
1967 | }; |
1968 | |
1969 | diff --git a/drivers/irqchip/irq-ls-scfg-msi.c b/drivers/irqchip/irq-ls-scfg-msi.c |
1970 | index 119f4ef0d421..b7f943f96068 100644 |
1971 | --- a/drivers/irqchip/irq-ls-scfg-msi.c |
1972 | +++ b/drivers/irqchip/irq-ls-scfg-msi.c |
1973 | @@ -21,6 +21,7 @@ |
1974 | #include <linux/of_pci.h> |
1975 | #include <linux/of_platform.h> |
1976 | #include <linux/spinlock.h> |
1977 | +#include <linux/dma-iommu.h> |
1978 | |
1979 | #define MSI_IRQS_PER_MSIR 32 |
1980 | #define MSI_MSIR_OFFSET 4 |
1981 | @@ -94,6 +95,8 @@ static void ls_scfg_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) |
1982 | |
1983 | if (msi_affinity_flag) |
1984 | msg->data |= cpumask_first(data->common->affinity); |
1985 | + |
1986 | + iommu_dma_map_msi_msg(data->irq, msg); |
1987 | } |
1988 | |
1989 | static int ls_scfg_msi_set_affinity(struct irq_data *irq_data, |
1990 | diff --git a/drivers/lightnvm/pblk-rb.c b/drivers/lightnvm/pblk-rb.c |
1991 | index 9bc32578a766..c0dd17a82170 100644 |
1992 | --- a/drivers/lightnvm/pblk-rb.c |
1993 | +++ b/drivers/lightnvm/pblk-rb.c |
1994 | @@ -142,10 +142,9 @@ static void clean_wctx(struct pblk_w_ctx *w_ctx) |
1995 | { |
1996 | int flags; |
1997 | |
1998 | -try: |
1999 | flags = READ_ONCE(w_ctx->flags); |
2000 | - if (!(flags & PBLK_SUBMITTED_ENTRY)) |
2001 | - goto try; |
2002 | + WARN_ONCE(!(flags & PBLK_SUBMITTED_ENTRY), |
2003 | + "pblk: overwriting unsubmitted data\n"); |
2004 | |
2005 | /* Release flags on context. Protect from writes and reads */ |
2006 | smp_store_release(&w_ctx->flags, PBLK_WRITABLE_ENTRY); |
2007 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
2008 | index 11a67eac55b1..5599712d478e 100644 |
2009 | --- a/drivers/md/md.c |
2010 | +++ b/drivers/md/md.c |
2011 | @@ -6498,6 +6498,9 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev) |
2012 | char b[BDEVNAME_SIZE]; |
2013 | struct md_rdev *rdev; |
2014 | |
2015 | + if (!mddev->pers) |
2016 | + return -ENODEV; |
2017 | + |
2018 | rdev = find_rdev(mddev, dev); |
2019 | if (!rdev) |
2020 | return -ENXIO; |
2021 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c |
2022 | index 029ecba60727..78d830763704 100644 |
2023 | --- a/drivers/md/raid1.c |
2024 | +++ b/drivers/md/raid1.c |
2025 | @@ -2462,6 +2462,8 @@ static void handle_read_error(struct r1conf *conf, struct r1bio *r1_bio) |
2026 | fix_read_error(conf, r1_bio->read_disk, |
2027 | r1_bio->sector, r1_bio->sectors); |
2028 | unfreeze_array(conf); |
2029 | + } else if (mddev->ro == 0 && test_bit(FailFast, &rdev->flags)) { |
2030 | + md_error(mddev, rdev); |
2031 | } else { |
2032 | r1_bio->bios[r1_bio->read_disk] = IO_BLOCKED; |
2033 | } |
2034 | diff --git a/drivers/media/common/siano/smsendian.c b/drivers/media/common/siano/smsendian.c |
2035 | index bfe831c10b1c..b95a631f23f9 100644 |
2036 | --- a/drivers/media/common/siano/smsendian.c |
2037 | +++ b/drivers/media/common/siano/smsendian.c |
2038 | @@ -35,7 +35,7 @@ void smsendian_handle_tx_message(void *buffer) |
2039 | switch (msg->x_msg_header.msg_type) { |
2040 | case MSG_SMS_DATA_DOWNLOAD_REQ: |
2041 | { |
2042 | - msg->msg_data[0] = le32_to_cpu(msg->msg_data[0]); |
2043 | + msg->msg_data[0] = le32_to_cpu((__force __le32)(msg->msg_data[0])); |
2044 | break; |
2045 | } |
2046 | |
2047 | @@ -44,7 +44,7 @@ void smsendian_handle_tx_message(void *buffer) |
2048 | sizeof(struct sms_msg_hdr))/4; |
2049 | |
2050 | for (i = 0; i < msg_words; i++) |
2051 | - msg->msg_data[i] = le32_to_cpu(msg->msg_data[i]); |
2052 | + msg->msg_data[i] = le32_to_cpu((__force __le32)msg->msg_data[i]); |
2053 | |
2054 | break; |
2055 | } |
2056 | @@ -64,7 +64,7 @@ void smsendian_handle_rx_message(void *buffer) |
2057 | { |
2058 | struct sms_version_res *ver = |
2059 | (struct sms_version_res *) msg; |
2060 | - ver->chip_model = le16_to_cpu(ver->chip_model); |
2061 | + ver->chip_model = le16_to_cpu((__force __le16)ver->chip_model); |
2062 | break; |
2063 | } |
2064 | |
2065 | @@ -81,7 +81,7 @@ void smsendian_handle_rx_message(void *buffer) |
2066 | sizeof(struct sms_msg_hdr))/4; |
2067 | |
2068 | for (i = 0; i < msg_words; i++) |
2069 | - msg->msg_data[i] = le32_to_cpu(msg->msg_data[i]); |
2070 | + msg->msg_data[i] = le32_to_cpu((__force __le32)msg->msg_data[i]); |
2071 | |
2072 | break; |
2073 | } |
2074 | @@ -95,9 +95,9 @@ void smsendian_handle_message_header(void *msg) |
2075 | #ifdef __BIG_ENDIAN |
2076 | struct sms_msg_hdr *phdr = (struct sms_msg_hdr *)msg; |
2077 | |
2078 | - phdr->msg_type = le16_to_cpu(phdr->msg_type); |
2079 | - phdr->msg_length = le16_to_cpu(phdr->msg_length); |
2080 | - phdr->msg_flags = le16_to_cpu(phdr->msg_flags); |
2081 | + phdr->msg_type = le16_to_cpu((__force __le16)phdr->msg_type); |
2082 | + phdr->msg_length = le16_to_cpu((__force __le16)phdr->msg_length); |
2083 | + phdr->msg_flags = le16_to_cpu((__force __le16)phdr->msg_flags); |
2084 | #endif /* __BIG_ENDIAN */ |
2085 | } |
2086 | EXPORT_SYMBOL_GPL(smsendian_handle_message_header); |
2087 | diff --git a/drivers/media/i2c/smiapp/smiapp-core.c b/drivers/media/i2c/smiapp/smiapp-core.c |
2088 | index 700f433261d0..e4d7f2febf00 100644 |
2089 | --- a/drivers/media/i2c/smiapp/smiapp-core.c |
2090 | +++ b/drivers/media/i2c/smiapp/smiapp-core.c |
2091 | @@ -1001,7 +1001,7 @@ static int smiapp_read_nvm(struct smiapp_sensor *sensor, |
2092 | if (rval) |
2093 | goto out; |
2094 | |
2095 | - for (i = 0; i < 1000; i++) { |
2096 | + for (i = 1000; i > 0; i--) { |
2097 | rval = smiapp_read( |
2098 | sensor, |
2099 | SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, &s); |
2100 | @@ -1012,11 +1012,10 @@ static int smiapp_read_nvm(struct smiapp_sensor *sensor, |
2101 | if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY) |
2102 | break; |
2103 | |
2104 | - if (--i == 0) { |
2105 | - rval = -ETIMEDOUT; |
2106 | - goto out; |
2107 | - } |
2108 | - |
2109 | + } |
2110 | + if (!i) { |
2111 | + rval = -ETIMEDOUT; |
2112 | + goto out; |
2113 | } |
2114 | |
2115 | for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) { |
2116 | diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c |
2117 | index e79f72b8b858..62b2c5d9bdfb 100644 |
2118 | --- a/drivers/media/media-device.c |
2119 | +++ b/drivers/media/media-device.c |
2120 | @@ -54,9 +54,10 @@ static int media_device_close(struct file *filp) |
2121 | return 0; |
2122 | } |
2123 | |
2124 | -static int media_device_get_info(struct media_device *dev, |
2125 | - struct media_device_info *info) |
2126 | +static long media_device_get_info(struct media_device *dev, void *arg) |
2127 | { |
2128 | + struct media_device_info *info = arg; |
2129 | + |
2130 | memset(info, 0, sizeof(*info)); |
2131 | |
2132 | if (dev->driver_name[0]) |
2133 | @@ -93,9 +94,9 @@ static struct media_entity *find_entity(struct media_device *mdev, u32 id) |
2134 | return NULL; |
2135 | } |
2136 | |
2137 | -static long media_device_enum_entities(struct media_device *mdev, |
2138 | - struct media_entity_desc *entd) |
2139 | +static long media_device_enum_entities(struct media_device *mdev, void *arg) |
2140 | { |
2141 | + struct media_entity_desc *entd = arg; |
2142 | struct media_entity *ent; |
2143 | |
2144 | ent = find_entity(mdev, entd->id); |
2145 | @@ -146,9 +147,9 @@ static void media_device_kpad_to_upad(const struct media_pad *kpad, |
2146 | upad->flags = kpad->flags; |
2147 | } |
2148 | |
2149 | -static long media_device_enum_links(struct media_device *mdev, |
2150 | - struct media_links_enum *links) |
2151 | +static long media_device_enum_links(struct media_device *mdev, void *arg) |
2152 | { |
2153 | + struct media_links_enum *links = arg; |
2154 | struct media_entity *entity; |
2155 | |
2156 | entity = find_entity(mdev, links->entity); |
2157 | @@ -194,9 +195,9 @@ static long media_device_enum_links(struct media_device *mdev, |
2158 | return 0; |
2159 | } |
2160 | |
2161 | -static long media_device_setup_link(struct media_device *mdev, |
2162 | - struct media_link_desc *linkd) |
2163 | +static long media_device_setup_link(struct media_device *mdev, void *arg) |
2164 | { |
2165 | + struct media_link_desc *linkd = arg; |
2166 | struct media_link *link = NULL; |
2167 | struct media_entity *source; |
2168 | struct media_entity *sink; |
2169 | @@ -222,9 +223,9 @@ static long media_device_setup_link(struct media_device *mdev, |
2170 | return __media_entity_setup_link(link, linkd->flags); |
2171 | } |
2172 | |
2173 | -static long media_device_get_topology(struct media_device *mdev, |
2174 | - struct media_v2_topology *topo) |
2175 | +static long media_device_get_topology(struct media_device *mdev, void *arg) |
2176 | { |
2177 | + struct media_v2_topology *topo = arg; |
2178 | struct media_entity *entity; |
2179 | struct media_interface *intf; |
2180 | struct media_pad *pad; |
2181 | diff --git a/drivers/media/pci/saa7164/saa7164-fw.c b/drivers/media/pci/saa7164/saa7164-fw.c |
2182 | index ef4906406ebf..a50461861133 100644 |
2183 | --- a/drivers/media/pci/saa7164/saa7164-fw.c |
2184 | +++ b/drivers/media/pci/saa7164/saa7164-fw.c |
2185 | @@ -426,7 +426,8 @@ int saa7164_downloadfirmware(struct saa7164_dev *dev) |
2186 | __func__, fw->size); |
2187 | |
2188 | if (fw->size != fwlength) { |
2189 | - printk(KERN_ERR "xc5000: firmware incorrect size\n"); |
2190 | + printk(KERN_ERR "saa7164: firmware incorrect size %zu != %u\n", |
2191 | + fw->size, fwlength); |
2192 | ret = -ENOMEM; |
2193 | goto out; |
2194 | } |
2195 | diff --git a/drivers/media/pci/tw686x/tw686x-video.c b/drivers/media/pci/tw686x/tw686x-video.c |
2196 | index c3fafa97b2d0..0ea8dd44026c 100644 |
2197 | --- a/drivers/media/pci/tw686x/tw686x-video.c |
2198 | +++ b/drivers/media/pci/tw686x/tw686x-video.c |
2199 | @@ -1228,7 +1228,8 @@ int tw686x_video_init(struct tw686x_dev *dev) |
2200 | vc->vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; |
2201 | vc->vidq.min_buffers_needed = 2; |
2202 | vc->vidq.lock = &vc->vb_mutex; |
2203 | - vc->vidq.gfp_flags = GFP_DMA32; |
2204 | + vc->vidq.gfp_flags = dev->dma_mode != TW686X_DMA_MODE_MEMCPY ? |
2205 | + GFP_DMA32 : 0; |
2206 | vc->vidq.dev = &dev->pci_dev->dev; |
2207 | |
2208 | err = vb2_queue_init(&vc->vidq); |
2209 | diff --git a/drivers/media/platform/omap3isp/isp.c b/drivers/media/platform/omap3isp/isp.c |
2210 | index 1a428fe9f070..9f023bc6e1b7 100644 |
2211 | --- a/drivers/media/platform/omap3isp/isp.c |
2212 | +++ b/drivers/media/platform/omap3isp/isp.c |
2213 | @@ -1945,6 +1945,7 @@ error_csi2: |
2214 | |
2215 | static void isp_detach_iommu(struct isp_device *isp) |
2216 | { |
2217 | + arm_iommu_detach_device(isp->dev); |
2218 | arm_iommu_release_mapping(isp->mapping); |
2219 | isp->mapping = NULL; |
2220 | } |
2221 | @@ -1961,8 +1962,7 @@ static int isp_attach_iommu(struct isp_device *isp) |
2222 | mapping = arm_iommu_create_mapping(&platform_bus_type, SZ_1G, SZ_2G); |
2223 | if (IS_ERR(mapping)) { |
2224 | dev_err(isp->dev, "failed to create ARM IOMMU mapping\n"); |
2225 | - ret = PTR_ERR(mapping); |
2226 | - goto error; |
2227 | + return PTR_ERR(mapping); |
2228 | } |
2229 | |
2230 | isp->mapping = mapping; |
2231 | @@ -1977,7 +1977,8 @@ static int isp_attach_iommu(struct isp_device *isp) |
2232 | return 0; |
2233 | |
2234 | error: |
2235 | - isp_detach_iommu(isp); |
2236 | + arm_iommu_release_mapping(isp->mapping); |
2237 | + isp->mapping = NULL; |
2238 | return ret; |
2239 | } |
2240 | |
2241 | diff --git a/drivers/media/platform/rcar_jpu.c b/drivers/media/platform/rcar_jpu.c |
2242 | index 070bac36d766..2e2b8c409150 100644 |
2243 | --- a/drivers/media/platform/rcar_jpu.c |
2244 | +++ b/drivers/media/platform/rcar_jpu.c |
2245 | @@ -1280,7 +1280,7 @@ static int jpu_open(struct file *file) |
2246 | /* ...issue software reset */ |
2247 | ret = jpu_reset(jpu); |
2248 | if (ret) |
2249 | - goto device_prepare_rollback; |
2250 | + goto jpu_reset_rollback; |
2251 | } |
2252 | |
2253 | jpu->ref_count++; |
2254 | @@ -1288,6 +1288,8 @@ static int jpu_open(struct file *file) |
2255 | mutex_unlock(&jpu->mutex); |
2256 | return 0; |
2257 | |
2258 | +jpu_reset_rollback: |
2259 | + clk_disable_unprepare(jpu->clk); |
2260 | device_prepare_rollback: |
2261 | mutex_unlock(&jpu->mutex); |
2262 | v4l_prepare_rollback: |
2263 | diff --git a/drivers/media/radio/si470x/radio-si470x-i2c.c b/drivers/media/radio/si470x/radio-si470x-i2c.c |
2264 | index b3034f80163f..8ce6f9cff746 100644 |
2265 | --- a/drivers/media/radio/si470x/radio-si470x-i2c.c |
2266 | +++ b/drivers/media/radio/si470x/radio-si470x-i2c.c |
2267 | @@ -92,7 +92,7 @@ MODULE_PARM_DESC(max_rds_errors, "RDS maximum block errors: *1*"); |
2268 | */ |
2269 | int si470x_get_register(struct si470x_device *radio, int regnr) |
2270 | { |
2271 | - u16 buf[READ_REG_NUM]; |
2272 | + __be16 buf[READ_REG_NUM]; |
2273 | struct i2c_msg msgs[1] = { |
2274 | { |
2275 | .addr = radio->client->addr, |
2276 | @@ -117,7 +117,7 @@ int si470x_get_register(struct si470x_device *radio, int regnr) |
2277 | int si470x_set_register(struct si470x_device *radio, int regnr) |
2278 | { |
2279 | int i; |
2280 | - u16 buf[WRITE_REG_NUM]; |
2281 | + __be16 buf[WRITE_REG_NUM]; |
2282 | struct i2c_msg msgs[1] = { |
2283 | { |
2284 | .addr = radio->client->addr, |
2285 | @@ -147,7 +147,7 @@ int si470x_set_register(struct si470x_device *radio, int regnr) |
2286 | static int si470x_get_all_registers(struct si470x_device *radio) |
2287 | { |
2288 | int i; |
2289 | - u16 buf[READ_REG_NUM]; |
2290 | + __be16 buf[READ_REG_NUM]; |
2291 | struct i2c_msg msgs[1] = { |
2292 | { |
2293 | .addr = radio->client->addr, |
2294 | diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c |
2295 | index ffbb178c6918..2dbf632c10de 100644 |
2296 | --- a/drivers/media/v4l2-core/videobuf2-core.c |
2297 | +++ b/drivers/media/v4l2-core/videobuf2-core.c |
2298 | @@ -912,9 +912,12 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state) |
2299 | dprintk(4, "done processing on buffer %d, state: %d\n", |
2300 | vb->index, state); |
2301 | |
2302 | - /* sync buffers */ |
2303 | - for (plane = 0; plane < vb->num_planes; ++plane) |
2304 | - call_void_memop(vb, finish, vb->planes[plane].mem_priv); |
2305 | + if (state != VB2_BUF_STATE_QUEUED && |
2306 | + state != VB2_BUF_STATE_REQUEUEING) { |
2307 | + /* sync buffers */ |
2308 | + for (plane = 0; plane < vb->num_planes; ++plane) |
2309 | + call_void_memop(vb, finish, vb->planes[plane].mem_priv); |
2310 | + } |
2311 | |
2312 | spin_lock_irqsave(&q->done_lock, flags); |
2313 | if (state == VB2_BUF_STATE_QUEUED || |
2314 | diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c |
2315 | index a4803ac192bb..1d49a8dd4a37 100644 |
2316 | --- a/drivers/memory/tegra/mc.c |
2317 | +++ b/drivers/memory/tegra/mc.c |
2318 | @@ -20,14 +20,6 @@ |
2319 | #include "mc.h" |
2320 | |
2321 | #define MC_INTSTATUS 0x000 |
2322 | -#define MC_INT_DECERR_MTS (1 << 16) |
2323 | -#define MC_INT_SECERR_SEC (1 << 13) |
2324 | -#define MC_INT_DECERR_VPR (1 << 12) |
2325 | -#define MC_INT_INVALID_APB_ASID_UPDATE (1 << 11) |
2326 | -#define MC_INT_INVALID_SMMU_PAGE (1 << 10) |
2327 | -#define MC_INT_ARBITRATION_EMEM (1 << 9) |
2328 | -#define MC_INT_SECURITY_VIOLATION (1 << 8) |
2329 | -#define MC_INT_DECERR_EMEM (1 << 6) |
2330 | |
2331 | #define MC_INTMASK 0x004 |
2332 | |
2333 | @@ -248,12 +240,13 @@ static const char *const error_names[8] = { |
2334 | static irqreturn_t tegra_mc_irq(int irq, void *data) |
2335 | { |
2336 | struct tegra_mc *mc = data; |
2337 | - unsigned long status, mask; |
2338 | + unsigned long status; |
2339 | unsigned int bit; |
2340 | |
2341 | /* mask all interrupts to avoid flooding */ |
2342 | - status = mc_readl(mc, MC_INTSTATUS); |
2343 | - mask = mc_readl(mc, MC_INTMASK); |
2344 | + status = mc_readl(mc, MC_INTSTATUS) & mc->soc->intmask; |
2345 | + if (!status) |
2346 | + return IRQ_NONE; |
2347 | |
2348 | for_each_set_bit(bit, &status, 32) { |
2349 | const char *error = status_names[bit] ?: "unknown"; |
2350 | @@ -346,7 +339,6 @@ static int tegra_mc_probe(struct platform_device *pdev) |
2351 | const struct of_device_id *match; |
2352 | struct resource *res; |
2353 | struct tegra_mc *mc; |
2354 | - u32 value; |
2355 | int err; |
2356 | |
2357 | match = of_match_node(tegra_mc_of_match, pdev->dev.of_node); |
2358 | @@ -414,11 +406,7 @@ static int tegra_mc_probe(struct platform_device *pdev) |
2359 | |
2360 | WARN(!mc->soc->client_id_mask, "Missing client ID mask for this SoC\n"); |
2361 | |
2362 | - value = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR | |
2363 | - MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE | |
2364 | - MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM; |
2365 | - |
2366 | - mc_writel(mc, value, MC_INTMASK); |
2367 | + mc_writel(mc, mc->soc->intmask, MC_INTMASK); |
2368 | |
2369 | return 0; |
2370 | } |
2371 | diff --git a/drivers/memory/tegra/mc.h b/drivers/memory/tegra/mc.h |
2372 | index ddb16676c3af..24e020b4609b 100644 |
2373 | --- a/drivers/memory/tegra/mc.h |
2374 | +++ b/drivers/memory/tegra/mc.h |
2375 | @@ -14,6 +14,15 @@ |
2376 | |
2377 | #include <soc/tegra/mc.h> |
2378 | |
2379 | +#define MC_INT_DECERR_MTS (1 << 16) |
2380 | +#define MC_INT_SECERR_SEC (1 << 13) |
2381 | +#define MC_INT_DECERR_VPR (1 << 12) |
2382 | +#define MC_INT_INVALID_APB_ASID_UPDATE (1 << 11) |
2383 | +#define MC_INT_INVALID_SMMU_PAGE (1 << 10) |
2384 | +#define MC_INT_ARBITRATION_EMEM (1 << 9) |
2385 | +#define MC_INT_SECURITY_VIOLATION (1 << 8) |
2386 | +#define MC_INT_DECERR_EMEM (1 << 6) |
2387 | + |
2388 | static inline u32 mc_readl(struct tegra_mc *mc, unsigned long offset) |
2389 | { |
2390 | return readl(mc->regs + offset); |
2391 | diff --git a/drivers/memory/tegra/tegra114.c b/drivers/memory/tegra/tegra114.c |
2392 | index ba8fff3d66a6..6d2a5a849d92 100644 |
2393 | --- a/drivers/memory/tegra/tegra114.c |
2394 | +++ b/drivers/memory/tegra/tegra114.c |
2395 | @@ -930,4 +930,6 @@ const struct tegra_mc_soc tegra114_mc_soc = { |
2396 | .atom_size = 32, |
2397 | .client_id_mask = 0x7f, |
2398 | .smmu = &tegra114_smmu_soc, |
2399 | + .intmask = MC_INT_INVALID_SMMU_PAGE | MC_INT_SECURITY_VIOLATION | |
2400 | + MC_INT_DECERR_EMEM, |
2401 | }; |
2402 | diff --git a/drivers/memory/tegra/tegra124.c b/drivers/memory/tegra/tegra124.c |
2403 | index 5a58e440f4a7..9f68a56f2727 100644 |
2404 | --- a/drivers/memory/tegra/tegra124.c |
2405 | +++ b/drivers/memory/tegra/tegra124.c |
2406 | @@ -1020,6 +1020,9 @@ const struct tegra_mc_soc tegra124_mc_soc = { |
2407 | .smmu = &tegra124_smmu_soc, |
2408 | .emem_regs = tegra124_mc_emem_regs, |
2409 | .num_emem_regs = ARRAY_SIZE(tegra124_mc_emem_regs), |
2410 | + .intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR | |
2411 | + MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE | |
2412 | + MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM, |
2413 | }; |
2414 | #endif /* CONFIG_ARCH_TEGRA_124_SOC */ |
2415 | |
2416 | @@ -1042,5 +1045,8 @@ const struct tegra_mc_soc tegra132_mc_soc = { |
2417 | .atom_size = 32, |
2418 | .client_id_mask = 0x7f, |
2419 | .smmu = &tegra132_smmu_soc, |
2420 | + .intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR | |
2421 | + MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE | |
2422 | + MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM, |
2423 | }; |
2424 | #endif /* CONFIG_ARCH_TEGRA_132_SOC */ |
2425 | diff --git a/drivers/memory/tegra/tegra210.c b/drivers/memory/tegra/tegra210.c |
2426 | index 5e144abe4c18..47c78a6d8f00 100644 |
2427 | --- a/drivers/memory/tegra/tegra210.c |
2428 | +++ b/drivers/memory/tegra/tegra210.c |
2429 | @@ -1077,4 +1077,7 @@ const struct tegra_mc_soc tegra210_mc_soc = { |
2430 | .atom_size = 64, |
2431 | .client_id_mask = 0xff, |
2432 | .smmu = &tegra210_smmu_soc, |
2433 | + .intmask = MC_INT_DECERR_MTS | MC_INT_SECERR_SEC | MC_INT_DECERR_VPR | |
2434 | + MC_INT_INVALID_APB_ASID_UPDATE | MC_INT_INVALID_SMMU_PAGE | |
2435 | + MC_INT_SECURITY_VIOLATION | MC_INT_DECERR_EMEM, |
2436 | }; |
2437 | diff --git a/drivers/memory/tegra/tegra30.c b/drivers/memory/tegra/tegra30.c |
2438 | index b44737840e70..d0689428ea1a 100644 |
2439 | --- a/drivers/memory/tegra/tegra30.c |
2440 | +++ b/drivers/memory/tegra/tegra30.c |
2441 | @@ -952,4 +952,6 @@ const struct tegra_mc_soc tegra30_mc_soc = { |
2442 | .atom_size = 16, |
2443 | .client_id_mask = 0x7f, |
2444 | .smmu = &tegra30_smmu_soc, |
2445 | + .intmask = MC_INT_INVALID_SMMU_PAGE | MC_INT_SECURITY_VIOLATION | |
2446 | + MC_INT_DECERR_EMEM, |
2447 | }; |
2448 | diff --git a/drivers/mfd/cros_ec.c b/drivers/mfd/cros_ec.c |
2449 | index b0ca5a4c841e..c5528ae982f2 100644 |
2450 | --- a/drivers/mfd/cros_ec.c |
2451 | +++ b/drivers/mfd/cros_ec.c |
2452 | @@ -112,7 +112,11 @@ int cros_ec_register(struct cros_ec_device *ec_dev) |
2453 | |
2454 | mutex_init(&ec_dev->lock); |
2455 | |
2456 | - cros_ec_query_all(ec_dev); |
2457 | + err = cros_ec_query_all(ec_dev); |
2458 | + if (err) { |
2459 | + dev_err(dev, "Cannot identify the EC: error %d\n", err); |
2460 | + return err; |
2461 | + } |
2462 | |
2463 | if (ec_dev->irq) { |
2464 | err = request_threaded_irq(ec_dev->irq, NULL, ec_irq_thread, |
2465 | diff --git a/drivers/mmc/core/pwrseq_simple.c b/drivers/mmc/core/pwrseq_simple.c |
2466 | index 13ef162cf066..a8b9fee4d62a 100644 |
2467 | --- a/drivers/mmc/core/pwrseq_simple.c |
2468 | +++ b/drivers/mmc/core/pwrseq_simple.c |
2469 | @@ -40,14 +40,18 @@ static void mmc_pwrseq_simple_set_gpios_value(struct mmc_pwrseq_simple *pwrseq, |
2470 | struct gpio_descs *reset_gpios = pwrseq->reset_gpios; |
2471 | |
2472 | if (!IS_ERR(reset_gpios)) { |
2473 | - int i; |
2474 | - int values[reset_gpios->ndescs]; |
2475 | + int i, *values; |
2476 | + int nvalues = reset_gpios->ndescs; |
2477 | |
2478 | - for (i = 0; i < reset_gpios->ndescs; i++) |
2479 | + values = kmalloc_array(nvalues, sizeof(int), GFP_KERNEL); |
2480 | + if (!values) |
2481 | + return; |
2482 | + |
2483 | + for (i = 0; i < nvalues; i++) |
2484 | values[i] = value; |
2485 | |
2486 | - gpiod_set_array_value_cansleep( |
2487 | - reset_gpios->ndescs, reset_gpios->desc, values); |
2488 | + gpiod_set_array_value_cansleep(nvalues, reset_gpios->desc, values); |
2489 | + kfree(values); |
2490 | } |
2491 | } |
2492 | |
2493 | diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c |
2494 | index 6a2cbbba29aa..5252885e5cda 100644 |
2495 | --- a/drivers/mmc/host/dw_mmc.c |
2496 | +++ b/drivers/mmc/host/dw_mmc.c |
2497 | @@ -1255,6 +1255,8 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit) |
2498 | if (host->state == STATE_WAITING_CMD11_DONE) |
2499 | sdmmc_cmd_bits |= SDMMC_CMD_VOLT_SWITCH; |
2500 | |
2501 | + slot->mmc->actual_clock = 0; |
2502 | + |
2503 | if (!clock) { |
2504 | mci_writel(host, CLKENA, 0); |
2505 | mci_send_cmd(slot, sdmmc_cmd_bits, 0); |
2506 | @@ -1313,6 +1315,8 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit) |
2507 | |
2508 | /* keep the last clock value that was requested from core */ |
2509 | slot->__clk_old = clock; |
2510 | + slot->mmc->actual_clock = div ? ((host->bus_hz / div) >> 1) : |
2511 | + host->bus_hz; |
2512 | } |
2513 | |
2514 | host->current_speed = clock; |
2515 | diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c |
2516 | index 4005b427023c..16deba1a2385 100644 |
2517 | --- a/drivers/mtd/nand/fsl_ifc_nand.c |
2518 | +++ b/drivers/mtd/nand/fsl_ifc_nand.c |
2519 | @@ -342,9 +342,16 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command, |
2520 | |
2521 | case NAND_CMD_READID: |
2522 | case NAND_CMD_PARAM: { |
2523 | + /* |
2524 | + * For READID, read 8 bytes that are currently used. |
2525 | + * For PARAM, read all 3 copies of 256-bytes pages. |
2526 | + */ |
2527 | + int len = 8; |
2528 | int timing = IFC_FIR_OP_RB; |
2529 | - if (command == NAND_CMD_PARAM) |
2530 | + if (command == NAND_CMD_PARAM) { |
2531 | timing = IFC_FIR_OP_RBCD; |
2532 | + len = 256 * 3; |
2533 | + } |
2534 | |
2535 | ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) | |
2536 | (IFC_FIR_OP_UA << IFC_NAND_FIR0_OP1_SHIFT) | |
2537 | @@ -354,12 +361,8 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command, |
2538 | &ifc->ifc_nand.nand_fcr0); |
2539 | ifc_out32(column, &ifc->ifc_nand.row3); |
2540 | |
2541 | - /* |
2542 | - * although currently it's 8 bytes for READID, we always read |
2543 | - * the maximum 256 bytes(for PARAM) |
2544 | - */ |
2545 | - ifc_out32(256, &ifc->ifc_nand.nand_fbcr); |
2546 | - ifc_nand_ctrl->read_bytes = 256; |
2547 | + ifc_out32(len, &ifc->ifc_nand.nand_fbcr); |
2548 | + ifc_nand_ctrl->read_bytes = len; |
2549 | |
2550 | set_addr(mtd, 0, 0, 0); |
2551 | fsl_ifc_run_command(mtd); |
2552 | diff --git a/drivers/net/dsa/qca8k.c b/drivers/net/dsa/qca8k.c |
2553 | index 5ada7a41449c..9645c8f05c7f 100644 |
2554 | --- a/drivers/net/dsa/qca8k.c |
2555 | +++ b/drivers/net/dsa/qca8k.c |
2556 | @@ -473,7 +473,7 @@ qca8k_set_pad_ctrl(struct qca8k_priv *priv, int port, int mode) |
2557 | static void |
2558 | qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable) |
2559 | { |
2560 | - u32 mask = QCA8K_PORT_STATUS_TXMAC; |
2561 | + u32 mask = QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC; |
2562 | |
2563 | /* Port 0 and 6 have no internal PHY */ |
2564 | if ((port > 0) && (port < 6)) |
2565 | @@ -490,6 +490,7 @@ qca8k_setup(struct dsa_switch *ds) |
2566 | { |
2567 | struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; |
2568 | int ret, i, phy_mode = -1; |
2569 | + u32 mask; |
2570 | |
2571 | /* Make sure that port 0 is the cpu port */ |
2572 | if (!dsa_is_cpu_port(ds, 0)) { |
2573 | @@ -515,7 +516,10 @@ qca8k_setup(struct dsa_switch *ds) |
2574 | if (ret < 0) |
2575 | return ret; |
2576 | |
2577 | - /* Enable CPU Port */ |
2578 | + /* Enable CPU Port, force it to maximum bandwidth and full-duplex */ |
2579 | + mask = QCA8K_PORT_STATUS_SPEED_1000 | QCA8K_PORT_STATUS_TXFLOW | |
2580 | + QCA8K_PORT_STATUS_RXFLOW | QCA8K_PORT_STATUS_DUPLEX; |
2581 | + qca8k_write(priv, QCA8K_REG_PORT_STATUS(QCA8K_CPU_PORT), mask); |
2582 | qca8k_reg_set(priv, QCA8K_REG_GLOBAL_FW_CTRL0, |
2583 | QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN); |
2584 | qca8k_port_set_status(priv, QCA8K_CPU_PORT, 1); |
2585 | @@ -584,6 +588,47 @@ qca8k_setup(struct dsa_switch *ds) |
2586 | return 0; |
2587 | } |
2588 | |
2589 | +static void |
2590 | +qca8k_adjust_link(struct dsa_switch *ds, int port, struct phy_device *phy) |
2591 | +{ |
2592 | + struct qca8k_priv *priv = ds->priv; |
2593 | + u32 reg; |
2594 | + |
2595 | + /* Force fixed-link setting for CPU port, skip others. */ |
2596 | + if (!phy_is_pseudo_fixed_link(phy)) |
2597 | + return; |
2598 | + |
2599 | + /* Set port speed */ |
2600 | + switch (phy->speed) { |
2601 | + case 10: |
2602 | + reg = QCA8K_PORT_STATUS_SPEED_10; |
2603 | + break; |
2604 | + case 100: |
2605 | + reg = QCA8K_PORT_STATUS_SPEED_100; |
2606 | + break; |
2607 | + case 1000: |
2608 | + reg = QCA8K_PORT_STATUS_SPEED_1000; |
2609 | + break; |
2610 | + default: |
2611 | + dev_dbg(priv->dev, "port%d link speed %dMbps not supported.\n", |
2612 | + port, phy->speed); |
2613 | + return; |
2614 | + } |
2615 | + |
2616 | + /* Set duplex mode */ |
2617 | + if (phy->duplex == DUPLEX_FULL) |
2618 | + reg |= QCA8K_PORT_STATUS_DUPLEX; |
2619 | + |
2620 | + /* Force flow control */ |
2621 | + if (dsa_is_cpu_port(ds, port)) |
2622 | + reg |= QCA8K_PORT_STATUS_RXFLOW | QCA8K_PORT_STATUS_TXFLOW; |
2623 | + |
2624 | + /* Force link down before changing MAC options */ |
2625 | + qca8k_port_set_status(priv, port, 0); |
2626 | + qca8k_write(priv, QCA8K_REG_PORT_STATUS(port), reg); |
2627 | + qca8k_port_set_status(priv, port, 1); |
2628 | +} |
2629 | + |
2630 | static int |
2631 | qca8k_phy_read(struct dsa_switch *ds, int phy, int regnum) |
2632 | { |
2633 | @@ -832,6 +877,7 @@ qca8k_get_tag_protocol(struct dsa_switch *ds) |
2634 | static const struct dsa_switch_ops qca8k_switch_ops = { |
2635 | .get_tag_protocol = qca8k_get_tag_protocol, |
2636 | .setup = qca8k_setup, |
2637 | + .adjust_link = qca8k_adjust_link, |
2638 | .get_strings = qca8k_get_strings, |
2639 | .phy_read = qca8k_phy_read, |
2640 | .phy_write = qca8k_phy_write, |
2641 | @@ -863,6 +909,7 @@ qca8k_sw_probe(struct mdio_device *mdiodev) |
2642 | return -ENOMEM; |
2643 | |
2644 | priv->bus = mdiodev->bus; |
2645 | + priv->dev = &mdiodev->dev; |
2646 | |
2647 | /* read the switches ID register */ |
2648 | id = qca8k_read(priv, QCA8K_REG_MASK_CTRL); |
2649 | @@ -934,6 +981,7 @@ static SIMPLE_DEV_PM_OPS(qca8k_pm_ops, |
2650 | qca8k_suspend, qca8k_resume); |
2651 | |
2652 | static const struct of_device_id qca8k_of_match[] = { |
2653 | + { .compatible = "qca,qca8334" }, |
2654 | { .compatible = "qca,qca8337" }, |
2655 | { /* sentinel */ }, |
2656 | }; |
2657 | diff --git a/drivers/net/dsa/qca8k.h b/drivers/net/dsa/qca8k.h |
2658 | index 1cf8a920d4ff..613fe5c50236 100644 |
2659 | --- a/drivers/net/dsa/qca8k.h |
2660 | +++ b/drivers/net/dsa/qca8k.h |
2661 | @@ -51,8 +51,10 @@ |
2662 | #define QCA8K_GOL_MAC_ADDR0 0x60 |
2663 | #define QCA8K_GOL_MAC_ADDR1 0x64 |
2664 | #define QCA8K_REG_PORT_STATUS(_i) (0x07c + (_i) * 4) |
2665 | -#define QCA8K_PORT_STATUS_SPEED GENMASK(2, 0) |
2666 | -#define QCA8K_PORT_STATUS_SPEED_S 0 |
2667 | +#define QCA8K_PORT_STATUS_SPEED GENMASK(1, 0) |
2668 | +#define QCA8K_PORT_STATUS_SPEED_10 0 |
2669 | +#define QCA8K_PORT_STATUS_SPEED_100 0x1 |
2670 | +#define QCA8K_PORT_STATUS_SPEED_1000 0x2 |
2671 | #define QCA8K_PORT_STATUS_TXMAC BIT(2) |
2672 | #define QCA8K_PORT_STATUS_RXMAC BIT(3) |
2673 | #define QCA8K_PORT_STATUS_TXFLOW BIT(4) |
2674 | @@ -165,6 +167,7 @@ struct qca8k_priv { |
2675 | struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS]; |
2676 | struct dsa_switch *ds; |
2677 | struct mutex reg_mutex; |
2678 | + struct device *dev; |
2679 | }; |
2680 | |
2681 | struct qca8k_mib_desc { |
2682 | diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c b/drivers/net/ethernet/amazon/ena/ena_com.c |
2683 | index 52beba8c7a39..e3b7a71fcad9 100644 |
2684 | --- a/drivers/net/ethernet/amazon/ena/ena_com.c |
2685 | +++ b/drivers/net/ethernet/amazon/ena/ena_com.c |
2686 | @@ -331,6 +331,7 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev, |
2687 | |
2688 | memset(&io_sq->desc_addr, 0x0, sizeof(io_sq->desc_addr)); |
2689 | |
2690 | + io_sq->dma_addr_bits = ena_dev->dma_addr_bits; |
2691 | io_sq->desc_entry_size = |
2692 | (io_sq->direction == ENA_COM_IO_QUEUE_DIRECTION_TX) ? |
2693 | sizeof(struct ena_eth_io_tx_desc) : |
2694 | diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c |
2695 | index 1b45cd73a258..119777986ea4 100644 |
2696 | --- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c |
2697 | +++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c |
2698 | @@ -1128,14 +1128,14 @@ static void xgbe_phy_adjust_link(struct xgbe_prv_data *pdata) |
2699 | |
2700 | if (pdata->tx_pause != pdata->phy.tx_pause) { |
2701 | new_state = 1; |
2702 | - pdata->hw_if.config_tx_flow_control(pdata); |
2703 | pdata->tx_pause = pdata->phy.tx_pause; |
2704 | + pdata->hw_if.config_tx_flow_control(pdata); |
2705 | } |
2706 | |
2707 | if (pdata->rx_pause != pdata->phy.rx_pause) { |
2708 | new_state = 1; |
2709 | - pdata->hw_if.config_rx_flow_control(pdata); |
2710 | pdata->rx_pause = pdata->phy.rx_pause; |
2711 | + pdata->hw_if.config_rx_flow_control(pdata); |
2712 | } |
2713 | |
2714 | /* Speed support */ |
2715 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
2716 | index bfd2d0382f4c..94931318587c 100644 |
2717 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
2718 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
2719 | @@ -5927,6 +5927,9 @@ static int bnxt_update_link(struct bnxt *bp, bool chng_link_state) |
2720 | } |
2721 | mutex_unlock(&bp->hwrm_cmd_lock); |
2722 | |
2723 | + if (!BNXT_SINGLE_PF(bp)) |
2724 | + return 0; |
2725 | + |
2726 | diff = link_info->support_auto_speeds ^ link_info->advertising; |
2727 | if ((link_info->support_auto_speeds | diff) != |
2728 | link_info->support_auto_speeds) { |
2729 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
2730 | index ff7a70ffafc6..c133491ad9fa 100644 |
2731 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
2732 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
2733 | @@ -1272,8 +1272,11 @@ static int hclge_alloc_vport(struct hclge_dev *hdev) |
2734 | /* We need to alloc a vport for main NIC of PF */ |
2735 | num_vport = hdev->num_vmdq_vport + hdev->num_req_vfs + 1; |
2736 | |
2737 | - if (hdev->num_tqps < num_vport) |
2738 | - num_vport = hdev->num_tqps; |
2739 | + if (hdev->num_tqps < num_vport) { |
2740 | + dev_err(&hdev->pdev->dev, "tqps(%d) is less than vports(%d)", |
2741 | + hdev->num_tqps, num_vport); |
2742 | + return -EINVAL; |
2743 | + } |
2744 | |
2745 | /* Alloc the same number of TQPs for every vport */ |
2746 | tqp_per_vport = hdev->num_tqps / num_vport; |
2747 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c |
2748 | index d1e4dcec5db2..69726908e72c 100644 |
2749 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c |
2750 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c |
2751 | @@ -1598,6 +1598,7 @@ static void hns3_replace_buffer(struct hns3_enet_ring *ring, int i, |
2752 | hns3_unmap_buffer(ring, &ring->desc_cb[i]); |
2753 | ring->desc_cb[i] = *res_cb; |
2754 | ring->desc[i].addr = cpu_to_le64(ring->desc_cb[i].dma); |
2755 | + ring->desc[i].rx.bd_base_info = 0; |
2756 | } |
2757 | |
2758 | static void hns3_reuse_buffer(struct hns3_enet_ring *ring, int i) |
2759 | @@ -1605,6 +1606,7 @@ static void hns3_reuse_buffer(struct hns3_enet_ring *ring, int i) |
2760 | ring->desc_cb[i].reuse_flag = 0; |
2761 | ring->desc[i].addr = cpu_to_le64(ring->desc_cb[i].dma |
2762 | + ring->desc_cb[i].page_offset); |
2763 | + ring->desc[i].rx.bd_base_info = 0; |
2764 | } |
2765 | |
2766 | static void hns3_nic_reclaim_one_desc(struct hns3_enet_ring *ring, int *bytes, |
2767 | @@ -2881,6 +2883,8 @@ static int __init hns3_init_module(void) |
2768 | |
2769 | client.ops = &client_ops; |
2770 | |
2771 | + INIT_LIST_HEAD(&client.node); |
2772 | + |
2773 | ret = hnae3_register_client(&client); |
2774 | if (ret) |
2775 | return ret; |
2776 | diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c |
2777 | index 7a226537877b..6265ce8915b6 100644 |
2778 | --- a/drivers/net/ethernet/intel/e1000e/netdev.c |
2779 | +++ b/drivers/net/ethernet/intel/e1000e/netdev.c |
2780 | @@ -3558,15 +3558,12 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca) |
2781 | } |
2782 | break; |
2783 | case e1000_pch_spt: |
2784 | - if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) { |
2785 | - /* Stable 24MHz frequency */ |
2786 | - incperiod = INCPERIOD_24MHZ; |
2787 | - incvalue = INCVALUE_24MHZ; |
2788 | - shift = INCVALUE_SHIFT_24MHZ; |
2789 | - adapter->cc.shift = shift; |
2790 | - break; |
2791 | - } |
2792 | - return -EINVAL; |
2793 | + /* Stable 24MHz frequency */ |
2794 | + incperiod = INCPERIOD_24MHZ; |
2795 | + incvalue = INCVALUE_24MHZ; |
2796 | + shift = INCVALUE_SHIFT_24MHZ; |
2797 | + adapter->cc.shift = shift; |
2798 | + break; |
2799 | case e1000_pch_cnp: |
2800 | if (er32(TSYNCRXCTL) & E1000_TSYNCRXCTL_SYSCFI) { |
2801 | /* Stable 24MHz frequency */ |
2802 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_ptp.c b/drivers/net/ethernet/intel/i40e/i40e_ptp.c |
2803 | index d8456c381c99..ef242dbae116 100644 |
2804 | --- a/drivers/net/ethernet/intel/i40e/i40e_ptp.c |
2805 | +++ b/drivers/net/ethernet/intel/i40e/i40e_ptp.c |
2806 | @@ -337,6 +337,8 @@ void i40e_ptp_rx_hang(struct i40e_pf *pf) |
2807 | **/ |
2808 | void i40e_ptp_tx_hang(struct i40e_pf *pf) |
2809 | { |
2810 | + struct sk_buff *skb; |
2811 | + |
2812 | if (!(pf->flags & I40E_FLAG_PTP) || !pf->ptp_tx) |
2813 | return; |
2814 | |
2815 | @@ -349,9 +351,12 @@ void i40e_ptp_tx_hang(struct i40e_pf *pf) |
2816 | * within a second it is reasonable to assume that we never will. |
2817 | */ |
2818 | if (time_is_before_jiffies(pf->ptp_tx_start + HZ)) { |
2819 | - dev_kfree_skb_any(pf->ptp_tx_skb); |
2820 | + skb = pf->ptp_tx_skb; |
2821 | pf->ptp_tx_skb = NULL; |
2822 | clear_bit_unlock(__I40E_PTP_TX_IN_PROGRESS, pf->state); |
2823 | + |
2824 | + /* Free the skb after we clear the bitlock */ |
2825 | + dev_kfree_skb_any(skb); |
2826 | pf->tx_hwtstamp_timeouts++; |
2827 | } |
2828 | } |
2829 | diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c |
2830 | index 6ca580cdfd84..1c027f9d9af5 100644 |
2831 | --- a/drivers/net/ethernet/intel/igb/igb_main.c |
2832 | +++ b/drivers/net/ethernet/intel/igb/igb_main.c |
2833 | @@ -8376,12 +8376,17 @@ static void igb_rar_set_index(struct igb_adapter *adapter, u32 index) |
2834 | if (is_valid_ether_addr(addr)) |
2835 | rar_high |= E1000_RAH_AV; |
2836 | |
2837 | - if (hw->mac.type == e1000_82575) |
2838 | + switch (hw->mac.type) { |
2839 | + case e1000_82575: |
2840 | + case e1000_i210: |
2841 | rar_high |= E1000_RAH_POOL_1 * |
2842 | adapter->mac_table[index].queue; |
2843 | - else |
2844 | + break; |
2845 | + default: |
2846 | rar_high |= E1000_RAH_POOL_1 << |
2847 | adapter->mac_table[index].queue; |
2848 | + break; |
2849 | + } |
2850 | } |
2851 | |
2852 | wr32(E1000_RAL(index), rar_low); |
2853 | diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c |
2854 | index 90ecc4b06462..90be4385bf36 100644 |
2855 | --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c |
2856 | +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c |
2857 | @@ -3737,6 +3737,7 @@ static int ixgbevf_set_mac(struct net_device *netdev, void *p) |
2858 | return -EPERM; |
2859 | |
2860 | ether_addr_copy(hw->mac.addr, addr->sa_data); |
2861 | + ether_addr_copy(hw->mac.perm_addr, addr->sa_data); |
2862 | ether_addr_copy(netdev->dev_addr, addr->sa_data); |
2863 | |
2864 | return 0; |
2865 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c |
2866 | index 42a6afcaae03..7924f241e3ad 100644 |
2867 | --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c |
2868 | +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c |
2869 | @@ -912,8 +912,10 @@ mlxsw_sp_port_vlan_bridge_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan, |
2870 | int err; |
2871 | |
2872 | /* No need to continue if only VLAN flags were changed */ |
2873 | - if (mlxsw_sp_port_vlan->bridge_port) |
2874 | + if (mlxsw_sp_port_vlan->bridge_port) { |
2875 | + mlxsw_sp_port_vlan_put(mlxsw_sp_port_vlan); |
2876 | return 0; |
2877 | + } |
2878 | |
2879 | err = mlxsw_sp_port_vlan_fid_join(mlxsw_sp_port_vlan, bridge_port); |
2880 | if (err) |
2881 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
2882 | index 27f2e650e27b..1a9a382bf1c4 100644 |
2883 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
2884 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |
2885 | @@ -51,7 +51,7 @@ |
2886 | #include <linux/of_mdio.h> |
2887 | #include "dwmac1000.h" |
2888 | |
2889 | -#define STMMAC_ALIGN(x) L1_CACHE_ALIGN(x) |
2890 | +#define STMMAC_ALIGN(x) __ALIGN_KERNEL(x, SMP_CACHE_BYTES) |
2891 | #define TSO_MAX_BUFF_SIZE (SZ_16K - 1) |
2892 | |
2893 | /* Module parameters */ |
2894 | diff --git a/drivers/net/ethernet/ti/cpsw-phy-sel.c b/drivers/net/ethernet/ti/cpsw-phy-sel.c |
2895 | index 18013645e76c..0c1adad7415d 100644 |
2896 | --- a/drivers/net/ethernet/ti/cpsw-phy-sel.c |
2897 | +++ b/drivers/net/ethernet/ti/cpsw-phy-sel.c |
2898 | @@ -177,12 +177,18 @@ void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave) |
2899 | } |
2900 | |
2901 | dev = bus_find_device(&platform_bus_type, NULL, node, match); |
2902 | - of_node_put(node); |
2903 | + if (!dev) { |
2904 | + dev_err(dev, "unable to find platform device for %pOF\n", node); |
2905 | + goto out; |
2906 | + } |
2907 | + |
2908 | priv = dev_get_drvdata(dev); |
2909 | |
2910 | priv->cpsw_phy_sel(priv, phy_mode, slave); |
2911 | |
2912 | put_device(dev); |
2913 | +out: |
2914 | + of_node_put(node); |
2915 | } |
2916 | EXPORT_SYMBOL_GPL(cpsw_phy_sel); |
2917 | |
2918 | diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h |
2919 | index cb250cacf721..e33a6c672a0a 100644 |
2920 | --- a/drivers/net/hyperv/hyperv_net.h |
2921 | +++ b/drivers/net/hyperv/hyperv_net.h |
2922 | @@ -724,6 +724,8 @@ struct net_device_context { |
2923 | struct hv_device *device_ctx; |
2924 | /* netvsc_device */ |
2925 | struct netvsc_device __rcu *nvdev; |
2926 | + /* list of netvsc net_devices */ |
2927 | + struct list_head list; |
2928 | /* reconfigure work */ |
2929 | struct delayed_work dwork; |
2930 | /* last reconfig time */ |
2931 | diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c |
2932 | index aeabeb107fed..6a77ef38c549 100644 |
2933 | --- a/drivers/net/hyperv/netvsc_drv.c |
2934 | +++ b/drivers/net/hyperv/netvsc_drv.c |
2935 | @@ -66,6 +66,8 @@ static int debug = -1; |
2936 | module_param(debug, int, S_IRUGO); |
2937 | MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); |
2938 | |
2939 | +static LIST_HEAD(netvsc_dev_list); |
2940 | + |
2941 | static void netvsc_change_rx_flags(struct net_device *net, int change) |
2942 | { |
2943 | struct net_device_context *ndev_ctx = netdev_priv(net); |
2944 | @@ -1749,13 +1751,10 @@ out_unlock: |
2945 | |
2946 | static struct net_device *get_netvsc_bymac(const u8 *mac) |
2947 | { |
2948 | - struct net_device *dev; |
2949 | - |
2950 | - ASSERT_RTNL(); |
2951 | + struct net_device_context *ndev_ctx; |
2952 | |
2953 | - for_each_netdev(&init_net, dev) { |
2954 | - if (dev->netdev_ops != &device_ops) |
2955 | - continue; /* not a netvsc device */ |
2956 | + list_for_each_entry(ndev_ctx, &netvsc_dev_list, list) { |
2957 | + struct net_device *dev = hv_get_drvdata(ndev_ctx->device_ctx); |
2958 | |
2959 | if (ether_addr_equal(mac, dev->perm_addr)) |
2960 | return dev; |
2961 | @@ -1766,25 +1765,18 @@ static struct net_device *get_netvsc_bymac(const u8 *mac) |
2962 | |
2963 | static struct net_device *get_netvsc_byref(struct net_device *vf_netdev) |
2964 | { |
2965 | + struct net_device_context *net_device_ctx; |
2966 | struct net_device *dev; |
2967 | |
2968 | - ASSERT_RTNL(); |
2969 | - |
2970 | - for_each_netdev(&init_net, dev) { |
2971 | - struct net_device_context *net_device_ctx; |
2972 | + dev = netdev_master_upper_dev_get(vf_netdev); |
2973 | + if (!dev || dev->netdev_ops != &device_ops) |
2974 | + return NULL; /* not a netvsc device */ |
2975 | |
2976 | - if (dev->netdev_ops != &device_ops) |
2977 | - continue; /* not a netvsc device */ |
2978 | + net_device_ctx = netdev_priv(dev); |
2979 | + if (!rtnl_dereference(net_device_ctx->nvdev)) |
2980 | + return NULL; /* device is removed */ |
2981 | |
2982 | - net_device_ctx = netdev_priv(dev); |
2983 | - if (!rtnl_dereference(net_device_ctx->nvdev)) |
2984 | - continue; /* device is removed */ |
2985 | - |
2986 | - if (rtnl_dereference(net_device_ctx->vf_netdev) == vf_netdev) |
2987 | - return dev; /* a match */ |
2988 | - } |
2989 | - |
2990 | - return NULL; |
2991 | + return dev; |
2992 | } |
2993 | |
2994 | /* Called when VF is injecting data into network stack. |
2995 | @@ -2065,15 +2057,19 @@ static int netvsc_probe(struct hv_device *dev, |
2996 | else |
2997 | net->max_mtu = ETH_DATA_LEN; |
2998 | |
2999 | - ret = register_netdev(net); |
3000 | + rtnl_lock(); |
3001 | + ret = register_netdevice(net); |
3002 | if (ret != 0) { |
3003 | pr_err("Unable to register netdev.\n"); |
3004 | goto register_failed; |
3005 | } |
3006 | |
3007 | - return ret; |
3008 | + list_add(&net_device_ctx->list, &netvsc_dev_list); |
3009 | + rtnl_unlock(); |
3010 | + return 0; |
3011 | |
3012 | register_failed: |
3013 | + rtnl_unlock(); |
3014 | rndis_filter_device_remove(dev, nvdev); |
3015 | rndis_failed: |
3016 | free_percpu(net_device_ctx->vf_stats); |
3017 | @@ -2119,6 +2115,7 @@ static int netvsc_remove(struct hv_device *dev) |
3018 | rndis_filter_device_remove(dev, nvdev); |
3019 | |
3020 | unregister_netdevice(net); |
3021 | + list_del(&ndev_ctx->list); |
3022 | |
3023 | rtnl_unlock(); |
3024 | rcu_read_unlock(); |
3025 | diff --git a/drivers/net/phy/mdio-mux-bcm-iproc.c b/drivers/net/phy/mdio-mux-bcm-iproc.c |
3026 | index 0831b7142df7..0c5b68e7da51 100644 |
3027 | --- a/drivers/net/phy/mdio-mux-bcm-iproc.c |
3028 | +++ b/drivers/net/phy/mdio-mux-bcm-iproc.c |
3029 | @@ -218,7 +218,7 @@ out: |
3030 | |
3031 | static int mdio_mux_iproc_remove(struct platform_device *pdev) |
3032 | { |
3033 | - struct iproc_mdiomux_desc *md = dev_get_platdata(&pdev->dev); |
3034 | + struct iproc_mdiomux_desc *md = platform_get_drvdata(pdev); |
3035 | |
3036 | mdio_mux_uninit(md->mux_handle); |
3037 | mdiobus_unregister(md->mii_bus); |
3038 | diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c |
3039 | index 1b2fe74a44ea..e4a6ed88b9cf 100644 |
3040 | --- a/drivers/net/phy/phylink.c |
3041 | +++ b/drivers/net/phy/phylink.c |
3042 | @@ -561,6 +561,8 @@ void phylink_destroy(struct phylink *pl) |
3043 | { |
3044 | if (pl->sfp_bus) |
3045 | sfp_unregister_upstream(pl->sfp_bus); |
3046 | + if (!IS_ERR(pl->link_gpio)) |
3047 | + gpiod_put(pl->link_gpio); |
3048 | |
3049 | cancel_work_sync(&pl->resolve); |
3050 | kfree(pl); |
3051 | diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c |
3052 | index 0aa91ab9a0fb..9e3f632e22f1 100644 |
3053 | --- a/drivers/net/usb/lan78xx.c |
3054 | +++ b/drivers/net/usb/lan78xx.c |
3055 | @@ -1216,6 +1216,8 @@ static int lan78xx_link_reset(struct lan78xx_net *dev) |
3056 | mod_timer(&dev->stat_monitor, |
3057 | jiffies + STAT_UPDATE_TIMER); |
3058 | } |
3059 | + |
3060 | + tasklet_schedule(&dev->bh); |
3061 | } |
3062 | |
3063 | return ret; |
3064 | diff --git a/drivers/net/wireless/ath/regd.h b/drivers/net/wireless/ath/regd.h |
3065 | index 5d80be213fac..869f276cc1d8 100644 |
3066 | --- a/drivers/net/wireless/ath/regd.h |
3067 | +++ b/drivers/net/wireless/ath/regd.h |
3068 | @@ -68,12 +68,14 @@ enum CountryCode { |
3069 | CTRY_AUSTRALIA = 36, |
3070 | CTRY_AUSTRIA = 40, |
3071 | CTRY_AZERBAIJAN = 31, |
3072 | + CTRY_BAHAMAS = 44, |
3073 | CTRY_BAHRAIN = 48, |
3074 | CTRY_BANGLADESH = 50, |
3075 | CTRY_BARBADOS = 52, |
3076 | CTRY_BELARUS = 112, |
3077 | CTRY_BELGIUM = 56, |
3078 | CTRY_BELIZE = 84, |
3079 | + CTRY_BERMUDA = 60, |
3080 | CTRY_BOLIVIA = 68, |
3081 | CTRY_BOSNIA_HERZ = 70, |
3082 | CTRY_BRAZIL = 76, |
3083 | @@ -159,6 +161,7 @@ enum CountryCode { |
3084 | CTRY_ROMANIA = 642, |
3085 | CTRY_RUSSIA = 643, |
3086 | CTRY_SAUDI_ARABIA = 682, |
3087 | + CTRY_SERBIA = 688, |
3088 | CTRY_SERBIA_MONTENEGRO = 891, |
3089 | CTRY_SINGAPORE = 702, |
3090 | CTRY_SLOVAKIA = 703, |
3091 | @@ -170,11 +173,13 @@ enum CountryCode { |
3092 | CTRY_SWITZERLAND = 756, |
3093 | CTRY_SYRIA = 760, |
3094 | CTRY_TAIWAN = 158, |
3095 | + CTRY_TANZANIA = 834, |
3096 | CTRY_THAILAND = 764, |
3097 | CTRY_TRINIDAD_Y_TOBAGO = 780, |
3098 | CTRY_TUNISIA = 788, |
3099 | CTRY_TURKEY = 792, |
3100 | CTRY_UAE = 784, |
3101 | + CTRY_UGANDA = 800, |
3102 | CTRY_UKRAINE = 804, |
3103 | CTRY_UNITED_KINGDOM = 826, |
3104 | CTRY_UNITED_STATES = 840, |
3105 | diff --git a/drivers/net/wireless/ath/regd_common.h b/drivers/net/wireless/ath/regd_common.h |
3106 | index bdd2b4d61f2f..15bbd1e0d912 100644 |
3107 | --- a/drivers/net/wireless/ath/regd_common.h |
3108 | +++ b/drivers/net/wireless/ath/regd_common.h |
3109 | @@ -35,6 +35,7 @@ enum EnumRd { |
3110 | FRANCE_RES = 0x31, |
3111 | FCC3_FCCA = 0x3A, |
3112 | FCC3_WORLD = 0x3B, |
3113 | + FCC3_ETSIC = 0x3F, |
3114 | |
3115 | ETSI1_WORLD = 0x37, |
3116 | ETSI3_ETSIA = 0x32, |
3117 | @@ -44,6 +45,7 @@ enum EnumRd { |
3118 | ETSI4_ETSIC = 0x38, |
3119 | ETSI5_WORLD = 0x39, |
3120 | ETSI6_WORLD = 0x34, |
3121 | + ETSI8_WORLD = 0x3D, |
3122 | ETSI_RESERVED = 0x33, |
3123 | |
3124 | MKK1_MKKA = 0x40, |
3125 | @@ -59,6 +61,7 @@ enum EnumRd { |
3126 | MKK1_MKKA1 = 0x4A, |
3127 | MKK1_MKKA2 = 0x4B, |
3128 | MKK1_MKKC = 0x4C, |
3129 | + APL2_FCCA = 0x4D, |
3130 | |
3131 | APL3_FCCA = 0x50, |
3132 | APL1_WORLD = 0x52, |
3133 | @@ -67,6 +70,7 @@ enum EnumRd { |
3134 | APL1_ETSIC = 0x55, |
3135 | APL2_ETSIC = 0x56, |
3136 | APL5_WORLD = 0x58, |
3137 | + APL13_WORLD = 0x5A, |
3138 | APL6_WORLD = 0x5B, |
3139 | APL7_FCCA = 0x5C, |
3140 | APL8_WORLD = 0x5D, |
3141 | @@ -168,6 +172,7 @@ static struct reg_dmn_pair_mapping regDomainPairs[] = { |
3142 | {FCC2_ETSIC, CTL_FCC, CTL_ETSI}, |
3143 | {FCC3_FCCA, CTL_FCC, CTL_FCC}, |
3144 | {FCC3_WORLD, CTL_FCC, CTL_ETSI}, |
3145 | + {FCC3_ETSIC, CTL_FCC, CTL_ETSI}, |
3146 | {FCC4_FCCA, CTL_FCC, CTL_FCC}, |
3147 | {FCC5_FCCA, CTL_FCC, CTL_FCC}, |
3148 | {FCC6_FCCA, CTL_FCC, CTL_FCC}, |
3149 | @@ -179,6 +184,7 @@ static struct reg_dmn_pair_mapping regDomainPairs[] = { |
3150 | {ETSI4_WORLD, CTL_ETSI, CTL_ETSI}, |
3151 | {ETSI5_WORLD, CTL_ETSI, CTL_ETSI}, |
3152 | {ETSI6_WORLD, CTL_ETSI, CTL_ETSI}, |
3153 | + {ETSI8_WORLD, CTL_ETSI, CTL_ETSI}, |
3154 | |
3155 | /* XXX: For ETSI3_ETSIA, Was NO_CTL meant for the 2 GHz band ? */ |
3156 | {ETSI3_ETSIA, CTL_ETSI, CTL_ETSI}, |
3157 | @@ -188,9 +194,11 @@ static struct reg_dmn_pair_mapping regDomainPairs[] = { |
3158 | {FCC1_FCCA, CTL_FCC, CTL_FCC}, |
3159 | {APL1_WORLD, CTL_FCC, CTL_ETSI}, |
3160 | {APL2_WORLD, CTL_FCC, CTL_ETSI}, |
3161 | + {APL2_FCCA, CTL_FCC, CTL_FCC}, |
3162 | {APL3_WORLD, CTL_FCC, CTL_ETSI}, |
3163 | {APL4_WORLD, CTL_FCC, CTL_ETSI}, |
3164 | {APL5_WORLD, CTL_FCC, CTL_ETSI}, |
3165 | + {APL13_WORLD, CTL_ETSI, CTL_ETSI}, |
3166 | {APL6_WORLD, CTL_ETSI, CTL_ETSI}, |
3167 | {APL8_WORLD, CTL_ETSI, CTL_ETSI}, |
3168 | {APL9_WORLD, CTL_ETSI, CTL_ETSI}, |
3169 | @@ -298,6 +306,7 @@ static struct country_code_to_enum_rd allCountries[] = { |
3170 | {CTRY_AUSTRALIA2, FCC6_WORLD, "AU"}, |
3171 | {CTRY_AUSTRIA, ETSI1_WORLD, "AT"}, |
3172 | {CTRY_AZERBAIJAN, ETSI4_WORLD, "AZ"}, |
3173 | + {CTRY_BAHAMAS, FCC3_WORLD, "BS"}, |
3174 | {CTRY_BAHRAIN, APL6_WORLD, "BH"}, |
3175 | {CTRY_BANGLADESH, NULL1_WORLD, "BD"}, |
3176 | {CTRY_BARBADOS, FCC2_WORLD, "BB"}, |
3177 | @@ -305,6 +314,7 @@ static struct country_code_to_enum_rd allCountries[] = { |
3178 | {CTRY_BELGIUM, ETSI1_WORLD, "BE"}, |
3179 | {CTRY_BELGIUM2, ETSI4_WORLD, "BL"}, |
3180 | {CTRY_BELIZE, APL1_ETSIC, "BZ"}, |
3181 | + {CTRY_BERMUDA, FCC3_FCCA, "BM"}, |
3182 | {CTRY_BOLIVIA, APL1_ETSIC, "BO"}, |
3183 | {CTRY_BOSNIA_HERZ, ETSI1_WORLD, "BA"}, |
3184 | {CTRY_BRAZIL, FCC3_WORLD, "BR"}, |
3185 | @@ -444,6 +454,7 @@ static struct country_code_to_enum_rd allCountries[] = { |
3186 | {CTRY_ROMANIA, NULL1_WORLD, "RO"}, |
3187 | {CTRY_RUSSIA, NULL1_WORLD, "RU"}, |
3188 | {CTRY_SAUDI_ARABIA, NULL1_WORLD, "SA"}, |
3189 | + {CTRY_SERBIA, ETSI1_WORLD, "RS"}, |
3190 | {CTRY_SERBIA_MONTENEGRO, ETSI1_WORLD, "CS"}, |
3191 | {CTRY_SINGAPORE, APL6_WORLD, "SG"}, |
3192 | {CTRY_SLOVAKIA, ETSI1_WORLD, "SK"}, |
3193 | @@ -455,10 +466,12 @@ static struct country_code_to_enum_rd allCountries[] = { |
3194 | {CTRY_SWITZERLAND, ETSI1_WORLD, "CH"}, |
3195 | {CTRY_SYRIA, NULL1_WORLD, "SY"}, |
3196 | {CTRY_TAIWAN, APL3_FCCA, "TW"}, |
3197 | + {CTRY_TANZANIA, APL1_WORLD, "TZ"}, |
3198 | {CTRY_THAILAND, FCC3_WORLD, "TH"}, |
3199 | {CTRY_TRINIDAD_Y_TOBAGO, FCC3_WORLD, "TT"}, |
3200 | {CTRY_TUNISIA, ETSI3_WORLD, "TN"}, |
3201 | {CTRY_TURKEY, ETSI3_WORLD, "TR"}, |
3202 | + {CTRY_UGANDA, FCC3_WORLD, "UG"}, |
3203 | {CTRY_UKRAINE, NULL1_WORLD, "UA"}, |
3204 | {CTRY_UAE, NULL1_WORLD, "AE"}, |
3205 | {CTRY_UNITED_KINGDOM, ETSI1_WORLD, "GB"}, |
3206 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |
3207 | index cd587325e286..dd6e27513cc1 100644 |
3208 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |
3209 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |
3210 | @@ -1098,6 +1098,7 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = { |
3211 | BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43340), |
3212 | BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341), |
3213 | BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362), |
3214 | + BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43364), |
3215 | BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339), |
3216 | BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339), |
3217 | BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430), |
3218 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c |
3219 | index a06b6612b658..ca99c3cf41c2 100644 |
3220 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c |
3221 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c |
3222 | @@ -901,6 +901,8 @@ static int _iwl_pcie_rx_init(struct iwl_trans *trans) |
3223 | } |
3224 | def_rxq = trans_pcie->rxq; |
3225 | |
3226 | + cancel_work_sync(&rba->rx_alloc); |
3227 | + |
3228 | spin_lock(&rba->lock); |
3229 | atomic_set(&rba->req_pending, 0); |
3230 | atomic_set(&rba->req_ready, 0); |
3231 | diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c |
3232 | index f4f2b9b27e32..50890cab8807 100644 |
3233 | --- a/drivers/net/wireless/marvell/mwifiex/usb.c |
3234 | +++ b/drivers/net/wireless/marvell/mwifiex/usb.c |
3235 | @@ -644,6 +644,9 @@ static void mwifiex_usb_disconnect(struct usb_interface *intf) |
3236 | MWIFIEX_FUNC_SHUTDOWN); |
3237 | } |
3238 | |
3239 | + if (adapter->workqueue) |
3240 | + flush_workqueue(adapter->workqueue); |
3241 | + |
3242 | mwifiex_usb_free(card); |
3243 | |
3244 | mwifiex_dbg(adapter, FATAL, |
3245 | diff --git a/drivers/net/wireless/marvell/mwifiex/util.c b/drivers/net/wireless/marvell/mwifiex/util.c |
3246 | index 0cd68ffc2c74..51ccf10f4413 100644 |
3247 | --- a/drivers/net/wireless/marvell/mwifiex/util.c |
3248 | +++ b/drivers/net/wireless/marvell/mwifiex/util.c |
3249 | @@ -708,12 +708,14 @@ void mwifiex_hist_data_set(struct mwifiex_private *priv, u8 rx_rate, s8 snr, |
3250 | s8 nflr) |
3251 | { |
3252 | struct mwifiex_histogram_data *phist_data = priv->hist_data; |
3253 | + s8 nf = -nflr; |
3254 | + s8 rssi = snr - nflr; |
3255 | |
3256 | atomic_inc(&phist_data->num_samples); |
3257 | atomic_inc(&phist_data->rx_rate[rx_rate]); |
3258 | - atomic_inc(&phist_data->snr[snr]); |
3259 | - atomic_inc(&phist_data->noise_flr[128 + nflr]); |
3260 | - atomic_inc(&phist_data->sig_str[nflr - snr]); |
3261 | + atomic_inc(&phist_data->snr[snr + 128]); |
3262 | + atomic_inc(&phist_data->noise_flr[nf + 128]); |
3263 | + atomic_inc(&phist_data->sig_str[rssi + 128]); |
3264 | } |
3265 | |
3266 | /* function to reset histogram data during init/reset */ |
3267 | diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c |
3268 | index 070dfd68bb83..120b0ff545c1 100644 |
3269 | --- a/drivers/net/wireless/rsi/rsi_91x_hal.c |
3270 | +++ b/drivers/net/wireless/rsi/rsi_91x_hal.c |
3271 | @@ -557,28 +557,32 @@ static int bl_write_header(struct rsi_hw *adapter, u8 *flash_content, |
3272 | u32 content_size) |
3273 | { |
3274 | struct rsi_host_intf_ops *hif_ops = adapter->host_intf_ops; |
3275 | - struct bl_header bl_hdr; |
3276 | + struct bl_header *bl_hdr; |
3277 | u32 write_addr, write_len; |
3278 | int status; |
3279 | |
3280 | - bl_hdr.flags = 0; |
3281 | - bl_hdr.image_no = cpu_to_le32(adapter->priv->coex_mode); |
3282 | - bl_hdr.check_sum = cpu_to_le32( |
3283 | - *(u32 *)&flash_content[CHECK_SUM_OFFSET]); |
3284 | - bl_hdr.flash_start_address = cpu_to_le32( |
3285 | - *(u32 *)&flash_content[ADDR_OFFSET]); |
3286 | - bl_hdr.flash_len = cpu_to_le32(*(u32 *)&flash_content[LEN_OFFSET]); |
3287 | + bl_hdr = kzalloc(sizeof(*bl_hdr), GFP_KERNEL); |
3288 | + if (!bl_hdr) |
3289 | + return -ENOMEM; |
3290 | + |
3291 | + bl_hdr->flags = 0; |
3292 | + bl_hdr->image_no = cpu_to_le32(adapter->priv->coex_mode); |
3293 | + bl_hdr->check_sum = |
3294 | + cpu_to_le32(*(u32 *)&flash_content[CHECK_SUM_OFFSET]); |
3295 | + bl_hdr->flash_start_address = |
3296 | + cpu_to_le32(*(u32 *)&flash_content[ADDR_OFFSET]); |
3297 | + bl_hdr->flash_len = cpu_to_le32(*(u32 *)&flash_content[LEN_OFFSET]); |
3298 | write_len = sizeof(struct bl_header); |
3299 | |
3300 | if (adapter->rsi_host_intf == RSI_HOST_INTF_USB) { |
3301 | write_addr = PING_BUFFER_ADDRESS; |
3302 | status = hif_ops->write_reg_multiple(adapter, write_addr, |
3303 | - (u8 *)&bl_hdr, write_len); |
3304 | + (u8 *)bl_hdr, write_len); |
3305 | if (status < 0) { |
3306 | rsi_dbg(ERR_ZONE, |
3307 | "%s: Failed to load Version/CRC structure\n", |
3308 | __func__); |
3309 | - return status; |
3310 | + goto fail; |
3311 | } |
3312 | } else { |
3313 | write_addr = PING_BUFFER_ADDRESS >> 16; |
3314 | @@ -587,20 +591,23 @@ static int bl_write_header(struct rsi_hw *adapter, u8 *flash_content, |
3315 | rsi_dbg(ERR_ZONE, |
3316 | "%s: Unable to set ms word to common reg\n", |
3317 | __func__); |
3318 | - return status; |
3319 | + goto fail; |
3320 | } |
3321 | write_addr = RSI_SD_REQUEST_MASTER | |
3322 | (PING_BUFFER_ADDRESS & 0xFFFF); |
3323 | status = hif_ops->write_reg_multiple(adapter, write_addr, |
3324 | - (u8 *)&bl_hdr, write_len); |
3325 | + (u8 *)bl_hdr, write_len); |
3326 | if (status < 0) { |
3327 | rsi_dbg(ERR_ZONE, |
3328 | "%s: Failed to load Version/CRC structure\n", |
3329 | __func__); |
3330 | - return status; |
3331 | + goto fail; |
3332 | } |
3333 | } |
3334 | - return 0; |
3335 | + status = 0; |
3336 | +fail: |
3337 | + kfree(bl_hdr); |
3338 | + return status; |
3339 | } |
3340 | |
3341 | static u32 read_flash_capacity(struct rsi_hw *adapter) |
3342 | diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c b/drivers/net/wireless/rsi/rsi_91x_sdio.c |
3343 | index 370161ca2a1c..0362967874aa 100644 |
3344 | --- a/drivers/net/wireless/rsi/rsi_91x_sdio.c |
3345 | +++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c |
3346 | @@ -161,7 +161,6 @@ static void rsi_reset_card(struct sdio_func *pfunction) |
3347 | int err; |
3348 | struct mmc_card *card = pfunction->card; |
3349 | struct mmc_host *host = card->host; |
3350 | - s32 bit = (fls(host->ocr_avail) - 1); |
3351 | u8 cmd52_resp; |
3352 | u32 clock, resp, i; |
3353 | u16 rca; |
3354 | @@ -181,7 +180,6 @@ static void rsi_reset_card(struct sdio_func *pfunction) |
3355 | msleep(20); |
3356 | |
3357 | /* Initialize the SDIO card */ |
3358 | - host->ios.vdd = bit; |
3359 | host->ios.chip_select = MMC_CS_DONTCARE; |
3360 | host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; |
3361 | host->ios.power_mode = MMC_POWER_UP; |
3362 | @@ -970,17 +968,21 @@ static void ulp_read_write(struct rsi_hw *adapter, u16 addr, u32 data, |
3363 | /*This function resets and re-initializes the chip.*/ |
3364 | static void rsi_reset_chip(struct rsi_hw *adapter) |
3365 | { |
3366 | - __le32 data; |
3367 | + u8 *data; |
3368 | u8 sdio_interrupt_status = 0; |
3369 | u8 request = 1; |
3370 | int ret; |
3371 | |
3372 | + data = kzalloc(sizeof(u32), GFP_KERNEL); |
3373 | + if (!data) |
3374 | + return; |
3375 | + |
3376 | rsi_dbg(INFO_ZONE, "Writing disable to wakeup register\n"); |
3377 | ret = rsi_sdio_write_register(adapter, 0, SDIO_WAKEUP_REG, &request); |
3378 | if (ret < 0) { |
3379 | rsi_dbg(ERR_ZONE, |
3380 | "%s: Failed to write SDIO wakeup register\n", __func__); |
3381 | - return; |
3382 | + goto err; |
3383 | } |
3384 | msleep(20); |
3385 | ret = rsi_sdio_read_register(adapter, RSI_FN1_INT_REGISTER, |
3386 | @@ -988,7 +990,7 @@ static void rsi_reset_chip(struct rsi_hw *adapter) |
3387 | if (ret < 0) { |
3388 | rsi_dbg(ERR_ZONE, "%s: Failed to Read Intr Status Register\n", |
3389 | __func__); |
3390 | - return; |
3391 | + goto err; |
3392 | } |
3393 | rsi_dbg(INFO_ZONE, "%s: Intr Status Register value = %d\n", |
3394 | __func__, sdio_interrupt_status); |
3395 | @@ -998,17 +1000,17 @@ static void rsi_reset_chip(struct rsi_hw *adapter) |
3396 | rsi_dbg(ERR_ZONE, |
3397 | "%s: Unable to set ms word to common reg\n", |
3398 | __func__); |
3399 | - return; |
3400 | + goto err; |
3401 | } |
3402 | |
3403 | - data = TA_HOLD_THREAD_VALUE; |
3404 | + put_unaligned_le32(TA_HOLD_THREAD_VALUE, data); |
3405 | if (rsi_sdio_write_register_multiple(adapter, TA_HOLD_THREAD_REG | |
3406 | RSI_SD_REQUEST_MASTER, |
3407 | - (u8 *)&data, 4)) { |
3408 | + data, 4)) { |
3409 | rsi_dbg(ERR_ZONE, |
3410 | "%s: Unable to hold Thread-Arch processor threads\n", |
3411 | __func__); |
3412 | - return; |
3413 | + goto err; |
3414 | } |
3415 | |
3416 | /* This msleep will ensure Thread-Arch processor to go to hold |
3417 | @@ -1029,6 +1031,9 @@ static void rsi_reset_chip(struct rsi_hw *adapter) |
3418 | * read write operations to complete for chip reset. |
3419 | */ |
3420 | msleep(500); |
3421 | +err: |
3422 | + kfree(data); |
3423 | + return; |
3424 | } |
3425 | |
3426 | /** |
3427 | diff --git a/drivers/net/wireless/rsi/rsi_sdio.h b/drivers/net/wireless/rsi/rsi_sdio.h |
3428 | index 903392039200..6788fbbdd166 100644 |
3429 | --- a/drivers/net/wireless/rsi/rsi_sdio.h |
3430 | +++ b/drivers/net/wireless/rsi/rsi_sdio.h |
3431 | @@ -85,7 +85,7 @@ enum sdio_interrupt_type { |
3432 | #define TA_SOFT_RST_CLR 0 |
3433 | #define TA_SOFT_RST_SET BIT(0) |
3434 | #define TA_PC_ZERO 0 |
3435 | -#define TA_HOLD_THREAD_VALUE cpu_to_le32(0xF) |
3436 | +#define TA_HOLD_THREAD_VALUE 0xF |
3437 | #define TA_RELEASE_THREAD_VALUE cpu_to_le32(0xF) |
3438 | #define TA_BASE_ADDR 0x2200 |
3439 | #define MISC_CFG_BASE_ADDR 0x4105 |
3440 | diff --git a/drivers/net/wireless/ti/wlcore/sdio.c b/drivers/net/wireless/ti/wlcore/sdio.c |
3441 | index f8a1fea64e25..219d1a86b92e 100644 |
3442 | --- a/drivers/net/wireless/ti/wlcore/sdio.c |
3443 | +++ b/drivers/net/wireless/ti/wlcore/sdio.c |
3444 | @@ -406,6 +406,11 @@ static int wl1271_suspend(struct device *dev) |
3445 | mmc_pm_flag_t sdio_flags; |
3446 | int ret = 0; |
3447 | |
3448 | + if (!wl) { |
3449 | + dev_err(dev, "no wilink module was probed\n"); |
3450 | + goto out; |
3451 | + } |
3452 | + |
3453 | dev_dbg(dev, "wl1271 suspend. wow_enabled: %d\n", |
3454 | wl->wow_enabled); |
3455 | |
3456 | diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c |
3457 | index f07b9c9bb5ba..dfc076f9ee4b 100644 |
3458 | --- a/drivers/net/xen-netfront.c |
3459 | +++ b/drivers/net/xen-netfront.c |
3460 | @@ -87,6 +87,7 @@ struct netfront_cb { |
3461 | /* IRQ name is queue name with "-tx" or "-rx" appended */ |
3462 | #define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3) |
3463 | |
3464 | +static DECLARE_WAIT_QUEUE_HEAD(module_load_q); |
3465 | static DECLARE_WAIT_QUEUE_HEAD(module_unload_q); |
3466 | |
3467 | struct netfront_stats { |
3468 | @@ -239,7 +240,7 @@ static void rx_refill_timeout(unsigned long data) |
3469 | static int netfront_tx_slot_available(struct netfront_queue *queue) |
3470 | { |
3471 | return (queue->tx.req_prod_pvt - queue->tx.rsp_cons) < |
3472 | - (NET_TX_RING_SIZE - MAX_SKB_FRAGS - 2); |
3473 | + (NET_TX_RING_SIZE - XEN_NETIF_NR_SLOTS_MIN - 1); |
3474 | } |
3475 | |
3476 | static void xennet_maybe_wake_tx(struct netfront_queue *queue) |
3477 | @@ -790,7 +791,7 @@ static int xennet_get_responses(struct netfront_queue *queue, |
3478 | RING_IDX cons = queue->rx.rsp_cons; |
3479 | struct sk_buff *skb = xennet_get_rx_skb(queue, cons); |
3480 | grant_ref_t ref = xennet_get_rx_ref(queue, cons); |
3481 | - int max = MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD); |
3482 | + int max = XEN_NETIF_NR_SLOTS_MIN + (rx->status <= RX_COPY_THRESHOLD); |
3483 | int slots = 1; |
3484 | int err = 0; |
3485 | unsigned long ret; |
3486 | @@ -1330,6 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev) |
3487 | netif_carrier_off(netdev); |
3488 | |
3489 | xenbus_switch_state(dev, XenbusStateInitialising); |
3490 | + wait_event(module_load_q, |
3491 | + xenbus_read_driver_state(dev->otherend) != |
3492 | + XenbusStateClosed && |
3493 | + xenbus_read_driver_state(dev->otherend) != |
3494 | + XenbusStateUnknown); |
3495 | return netdev; |
3496 | |
3497 | exit: |
3498 | diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c |
3499 | index 4cac4755abef..f5643d107cc6 100644 |
3500 | --- a/drivers/nvme/host/pci.c |
3501 | +++ b/drivers/nvme/host/pci.c |
3502 | @@ -2519,6 +2519,9 @@ static pci_ers_result_t nvme_slot_reset(struct pci_dev *pdev) |
3503 | |
3504 | static void nvme_error_resume(struct pci_dev *pdev) |
3505 | { |
3506 | + struct nvme_dev *dev = pci_get_drvdata(pdev); |
3507 | + |
3508 | + flush_work(&dev->ctrl.reset_work); |
3509 | pci_cleanup_aer_uncorrect_error_status(pdev); |
3510 | } |
3511 | |
3512 | @@ -2562,6 +2565,8 @@ static const struct pci_device_id nvme_id_table[] = { |
3513 | .driver_data = NVME_QUIRK_LIGHTNVM, }, |
3514 | { PCI_DEVICE(0x1d1d, 0x2807), /* CNEX WL */ |
3515 | .driver_data = NVME_QUIRK_LIGHTNVM, }, |
3516 | + { PCI_DEVICE(0x1d1d, 0x2601), /* CNEX Granby */ |
3517 | + .driver_data = NVME_QUIRK_LIGHTNVM, }, |
3518 | { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_EXPRESS, 0xffffff) }, |
3519 | { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2001) }, |
3520 | { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2003) }, |
3521 | diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c |
3522 | index 93a082e0bdd4..48a831d58e7a 100644 |
3523 | --- a/drivers/nvme/host/rdma.c |
3524 | +++ b/drivers/nvme/host/rdma.c |
3525 | @@ -796,7 +796,7 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl, |
3526 | if (error) { |
3527 | dev_err(ctrl->ctrl.device, |
3528 | "prop_get NVME_REG_CAP failed\n"); |
3529 | - goto out_cleanup_queue; |
3530 | + goto out_stop_queue; |
3531 | } |
3532 | |
3533 | ctrl->ctrl.sqsize = |
3534 | @@ -804,23 +804,25 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl, |
3535 | |
3536 | error = nvme_enable_ctrl(&ctrl->ctrl, ctrl->ctrl.cap); |
3537 | if (error) |
3538 | - goto out_cleanup_queue; |
3539 | + goto out_stop_queue; |
3540 | |
3541 | ctrl->ctrl.max_hw_sectors = |
3542 | (ctrl->max_fr_pages - 1) << (ilog2(SZ_4K) - 9); |
3543 | |
3544 | error = nvme_init_identify(&ctrl->ctrl); |
3545 | if (error) |
3546 | - goto out_cleanup_queue; |
3547 | + goto out_stop_queue; |
3548 | |
3549 | error = nvme_rdma_alloc_qe(ctrl->queues[0].device->dev, |
3550 | &ctrl->async_event_sqe, sizeof(struct nvme_command), |
3551 | DMA_TO_DEVICE); |
3552 | if (error) |
3553 | - goto out_cleanup_queue; |
3554 | + goto out_stop_queue; |
3555 | |
3556 | return 0; |
3557 | |
3558 | +out_stop_queue: |
3559 | + nvme_rdma_stop_queue(&ctrl->queues[0]); |
3560 | out_cleanup_queue: |
3561 | if (new) |
3562 | blk_cleanup_queue(ctrl->ctrl.admin_q); |
3563 | diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c |
3564 | index d12e5de78e70..2afafd5d8915 100644 |
3565 | --- a/drivers/nvmem/core.c |
3566 | +++ b/drivers/nvmem/core.c |
3567 | @@ -1049,6 +1049,8 @@ static inline void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell, |
3568 | |
3569 | /* setup the first byte with lsb bits from nvmem */ |
3570 | rc = nvmem_reg_read(nvmem, cell->offset, &v, 1); |
3571 | + if (rc) |
3572 | + goto err; |
3573 | *b++ |= GENMASK(bit_offset - 1, 0) & v; |
3574 | |
3575 | /* setup rest of the byte if any */ |
3576 | @@ -1067,11 +1069,16 @@ static inline void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell, |
3577 | /* setup the last byte with msb bits from nvmem */ |
3578 | rc = nvmem_reg_read(nvmem, |
3579 | cell->offset + cell->bytes - 1, &v, 1); |
3580 | + if (rc) |
3581 | + goto err; |
3582 | *p |= GENMASK(7, (nbits + bit_offset) % BITS_PER_BYTE) & v; |
3583 | |
3584 | } |
3585 | |
3586 | return buf; |
3587 | +err: |
3588 | + kfree(buf); |
3589 | + return ERR_PTR(rc); |
3590 | } |
3591 | |
3592 | /** |
3593 | diff --git a/drivers/pci/host/pci-xgene.c b/drivers/pci/host/pci-xgene.c |
3594 | index 087645116ecb..c78fd9c2cf8c 100644 |
3595 | --- a/drivers/pci/host/pci-xgene.c |
3596 | +++ b/drivers/pci/host/pci-xgene.c |
3597 | @@ -686,7 +686,6 @@ static int xgene_pcie_probe_bridge(struct platform_device *pdev) |
3598 | |
3599 | bus = bridge->bus; |
3600 | |
3601 | - pci_scan_child_bus(bus); |
3602 | pci_assign_unassigned_bus_resources(bus); |
3603 | list_for_each_entry(child, &bus->children, node) |
3604 | pcie_bus_configure_settings(child); |
3605 | diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c |
3606 | index 05832b597e53..46c2ee2caf28 100644 |
3607 | --- a/drivers/pci/hotplug/pciehp_hpc.c |
3608 | +++ b/drivers/pci/hotplug/pciehp_hpc.c |
3609 | @@ -863,6 +863,13 @@ struct controller *pcie_init(struct pcie_device *dev) |
3610 | if (pdev->hotplug_user_indicators) |
3611 | slot_cap &= ~(PCI_EXP_SLTCAP_AIP | PCI_EXP_SLTCAP_PIP); |
3612 | |
3613 | + /* |
3614 | + * We assume no Thunderbolt controllers support Command Complete events, |
3615 | + * but some controllers falsely claim they do. |
3616 | + */ |
3617 | + if (pdev->is_thunderbolt) |
3618 | + slot_cap |= PCI_EXP_SLTCAP_NCCS; |
3619 | + |
3620 | ctrl->slot_cap = slot_cap; |
3621 | mutex_init(&ctrl->ctrl_lock); |
3622 | init_waitqueue_head(&ctrl->queue); |
3623 | diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c |
3624 | index 00fa4278c1f4..c3f0473d1afa 100644 |
3625 | --- a/drivers/pci/pci-sysfs.c |
3626 | +++ b/drivers/pci/pci-sysfs.c |
3627 | @@ -305,13 +305,16 @@ static ssize_t enable_store(struct device *dev, struct device_attribute *attr, |
3628 | if (!capable(CAP_SYS_ADMIN)) |
3629 | return -EPERM; |
3630 | |
3631 | - if (!val) { |
3632 | - if (pci_is_enabled(pdev)) |
3633 | - pci_disable_device(pdev); |
3634 | - else |
3635 | - result = -EIO; |
3636 | - } else |
3637 | + device_lock(dev); |
3638 | + if (dev->driver) |
3639 | + result = -EBUSY; |
3640 | + else if (val) |
3641 | result = pci_enable_device(pdev); |
3642 | + else if (pci_is_enabled(pdev)) |
3643 | + pci_disable_device(pdev); |
3644 | + else |
3645 | + result = -EIO; |
3646 | + device_unlock(dev); |
3647 | |
3648 | return result < 0 ? result : count; |
3649 | } |
3650 | diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c |
3651 | index f285cd74088e..4bccaf688aad 100644 |
3652 | --- a/drivers/pci/probe.c |
3653 | +++ b/drivers/pci/probe.c |
3654 | @@ -516,12 +516,14 @@ static void devm_pci_release_host_bridge_dev(struct device *dev) |
3655 | |
3656 | if (bridge->release_fn) |
3657 | bridge->release_fn(bridge); |
3658 | + |
3659 | + pci_free_resource_list(&bridge->windows); |
3660 | } |
3661 | |
3662 | static void pci_release_host_bridge_dev(struct device *dev) |
3663 | { |
3664 | devm_pci_release_host_bridge_dev(dev); |
3665 | - pci_free_host_bridge(to_pci_host_bridge(dev)); |
3666 | + kfree(to_pci_host_bridge(dev)); |
3667 | } |
3668 | |
3669 | struct pci_host_bridge *pci_alloc_host_bridge(size_t priv) |
3670 | diff --git a/drivers/pinctrl/pinctrl-at91-pio4.c b/drivers/pinctrl/pinctrl-at91-pio4.c |
3671 | index b1ca838dd80a..e61e2f8c91ce 100644 |
3672 | --- a/drivers/pinctrl/pinctrl-at91-pio4.c |
3673 | +++ b/drivers/pinctrl/pinctrl-at91-pio4.c |
3674 | @@ -576,8 +576,10 @@ static int atmel_pctl_dt_node_to_map(struct pinctrl_dev *pctldev, |
3675 | for_each_child_of_node(np_config, np) { |
3676 | ret = atmel_pctl_dt_subnode_to_map(pctldev, np, map, |
3677 | &reserved_maps, num_maps); |
3678 | - if (ret < 0) |
3679 | + if (ret < 0) { |
3680 | + of_node_put(np); |
3681 | break; |
3682 | + } |
3683 | } |
3684 | } |
3685 | |
3686 | diff --git a/drivers/regulator/cpcap-regulator.c b/drivers/regulator/cpcap-regulator.c |
3687 | index f541b80f1b54..bd910fe123d9 100644 |
3688 | --- a/drivers/regulator/cpcap-regulator.c |
3689 | +++ b/drivers/regulator/cpcap-regulator.c |
3690 | @@ -222,7 +222,7 @@ static unsigned int cpcap_map_mode(unsigned int mode) |
3691 | case CPCAP_BIT_AUDIO_LOW_PWR: |
3692 | return REGULATOR_MODE_STANDBY; |
3693 | default: |
3694 | - return -EINVAL; |
3695 | + return REGULATOR_MODE_INVALID; |
3696 | } |
3697 | } |
3698 | |
3699 | diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c |
3700 | index c9875355905d..a3bf7c993723 100644 |
3701 | --- a/drivers/regulator/of_regulator.c |
3702 | +++ b/drivers/regulator/of_regulator.c |
3703 | @@ -31,6 +31,7 @@ static void of_get_regulation_constraints(struct device_node *np, |
3704 | struct regulation_constraints *constraints = &(*init_data)->constraints; |
3705 | struct regulator_state *suspend_state; |
3706 | struct device_node *suspend_np; |
3707 | + unsigned int mode; |
3708 | int ret, i; |
3709 | u32 pval; |
3710 | |
3711 | @@ -124,11 +125,11 @@ static void of_get_regulation_constraints(struct device_node *np, |
3712 | |
3713 | if (!of_property_read_u32(np, "regulator-initial-mode", &pval)) { |
3714 | if (desc && desc->of_map_mode) { |
3715 | - ret = desc->of_map_mode(pval); |
3716 | - if (ret == -EINVAL) |
3717 | + mode = desc->of_map_mode(pval); |
3718 | + if (mode == REGULATOR_MODE_INVALID) |
3719 | pr_err("%s: invalid mode %u\n", np->name, pval); |
3720 | else |
3721 | - constraints->initial_mode = ret; |
3722 | + constraints->initial_mode = mode; |
3723 | } else { |
3724 | pr_warn("%s: mapping for mode %d not defined\n", |
3725 | np->name, pval); |
3726 | @@ -163,12 +164,12 @@ static void of_get_regulation_constraints(struct device_node *np, |
3727 | if (!of_property_read_u32(suspend_np, "regulator-mode", |
3728 | &pval)) { |
3729 | if (desc && desc->of_map_mode) { |
3730 | - ret = desc->of_map_mode(pval); |
3731 | - if (ret == -EINVAL) |
3732 | + mode = desc->of_map_mode(pval); |
3733 | + if (mode == REGULATOR_MODE_INVALID) |
3734 | pr_err("%s: invalid mode %u\n", |
3735 | np->name, pval); |
3736 | else |
3737 | - suspend_state->mode = ret; |
3738 | + suspend_state->mode = mode; |
3739 | } else { |
3740 | pr_warn("%s: mapping for mode %d not defined\n", |
3741 | np->name, pval); |
3742 | diff --git a/drivers/regulator/pfuze100-regulator.c b/drivers/regulator/pfuze100-regulator.c |
3743 | index 63922a2167e5..659e516455be 100644 |
3744 | --- a/drivers/regulator/pfuze100-regulator.c |
3745 | +++ b/drivers/regulator/pfuze100-regulator.c |
3746 | @@ -158,6 +158,7 @@ static const struct regulator_ops pfuze100_sw_regulator_ops = { |
3747 | static const struct regulator_ops pfuze100_swb_regulator_ops = { |
3748 | .enable = regulator_enable_regmap, |
3749 | .disable = regulator_disable_regmap, |
3750 | + .is_enabled = regulator_is_enabled_regmap, |
3751 | .list_voltage = regulator_list_voltage_table, |
3752 | .map_voltage = regulator_map_voltage_ascend, |
3753 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
3754 | diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c |
3755 | index a4456db5849d..884c7505ed91 100644 |
3756 | --- a/drivers/regulator/twl-regulator.c |
3757 | +++ b/drivers/regulator/twl-regulator.c |
3758 | @@ -274,7 +274,7 @@ static inline unsigned int twl4030reg_map_mode(unsigned int mode) |
3759 | case RES_STATE_SLEEP: |
3760 | return REGULATOR_MODE_STANDBY; |
3761 | default: |
3762 | - return -EINVAL; |
3763 | + return REGULATOR_MODE_INVALID; |
3764 | } |
3765 | } |
3766 | |
3767 | diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c |
3768 | index 9eb32ead63db..e4f951e968a4 100644 |
3769 | --- a/drivers/rtc/interface.c |
3770 | +++ b/drivers/rtc/interface.c |
3771 | @@ -359,6 +359,11 @@ int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) |
3772 | { |
3773 | int err; |
3774 | |
3775 | + if (!rtc->ops) |
3776 | + return -ENODEV; |
3777 | + else if (!rtc->ops->set_alarm) |
3778 | + return -EINVAL; |
3779 | + |
3780 | err = rtc_valid_tm(&alarm->time); |
3781 | if (err != 0) |
3782 | return err; |
3783 | diff --git a/drivers/rtc/rtc-tps6586x.c b/drivers/rtc/rtc-tps6586x.c |
3784 | index a3418a8a3796..97fdc99bfeef 100644 |
3785 | --- a/drivers/rtc/rtc-tps6586x.c |
3786 | +++ b/drivers/rtc/rtc-tps6586x.c |
3787 | @@ -276,14 +276,15 @@ static int tps6586x_rtc_probe(struct platform_device *pdev) |
3788 | device_init_wakeup(&pdev->dev, 1); |
3789 | |
3790 | platform_set_drvdata(pdev, rtc); |
3791 | - rtc->rtc = devm_rtc_device_register(&pdev->dev, dev_name(&pdev->dev), |
3792 | - &tps6586x_rtc_ops, THIS_MODULE); |
3793 | + rtc->rtc = devm_rtc_allocate_device(&pdev->dev); |
3794 | if (IS_ERR(rtc->rtc)) { |
3795 | ret = PTR_ERR(rtc->rtc); |
3796 | - dev_err(&pdev->dev, "RTC device register: ret %d\n", ret); |
3797 | + dev_err(&pdev->dev, "RTC allocate device: ret %d\n", ret); |
3798 | goto fail_rtc_register; |
3799 | } |
3800 | |
3801 | + rtc->rtc->ops = &tps6586x_rtc_ops; |
3802 | + |
3803 | ret = devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL, |
3804 | tps6586x_rtc_irq, |
3805 | IRQF_ONESHOT, |
3806 | @@ -294,6 +295,13 @@ static int tps6586x_rtc_probe(struct platform_device *pdev) |
3807 | goto fail_rtc_register; |
3808 | } |
3809 | disable_irq(rtc->irq); |
3810 | + |
3811 | + ret = rtc_register_device(rtc->rtc); |
3812 | + if (ret) { |
3813 | + dev_err(&pdev->dev, "RTC device register: ret %d\n", ret); |
3814 | + goto fail_rtc_register; |
3815 | + } |
3816 | + |
3817 | return 0; |
3818 | |
3819 | fail_rtc_register: |
3820 | diff --git a/drivers/rtc/rtc-tps65910.c b/drivers/rtc/rtc-tps65910.c |
3821 | index d0244d7979fc..a56b526db89a 100644 |
3822 | --- a/drivers/rtc/rtc-tps65910.c |
3823 | +++ b/drivers/rtc/rtc-tps65910.c |
3824 | @@ -380,6 +380,10 @@ static int tps65910_rtc_probe(struct platform_device *pdev) |
3825 | if (!tps_rtc) |
3826 | return -ENOMEM; |
3827 | |
3828 | + tps_rtc->rtc = devm_rtc_allocate_device(&pdev->dev); |
3829 | + if (IS_ERR(tps_rtc->rtc)) |
3830 | + return PTR_ERR(tps_rtc->rtc); |
3831 | + |
3832 | /* Clear pending interrupts */ |
3833 | ret = regmap_read(tps65910->regmap, TPS65910_RTC_STATUS, &rtc_reg); |
3834 | if (ret < 0) |
3835 | @@ -421,10 +425,10 @@ static int tps65910_rtc_probe(struct platform_device *pdev) |
3836 | tps_rtc->irq = irq; |
3837 | device_set_wakeup_capable(&pdev->dev, 1); |
3838 | |
3839 | - tps_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, |
3840 | - &tps65910_rtc_ops, THIS_MODULE); |
3841 | - if (IS_ERR(tps_rtc->rtc)) { |
3842 | - ret = PTR_ERR(tps_rtc->rtc); |
3843 | + tps_rtc->rtc->ops = &tps65910_rtc_ops; |
3844 | + |
3845 | + ret = rtc_register_device(tps_rtc->rtc); |
3846 | + if (ret) { |
3847 | dev_err(&pdev->dev, "RTC device register: err %d\n", ret); |
3848 | return ret; |
3849 | } |
3850 | diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c |
3851 | index 7ce22967fd16..7ed010714f29 100644 |
3852 | --- a/drivers/rtc/rtc-vr41xx.c |
3853 | +++ b/drivers/rtc/rtc-vr41xx.c |
3854 | @@ -292,13 +292,14 @@ static int rtc_probe(struct platform_device *pdev) |
3855 | goto err_rtc1_iounmap; |
3856 | } |
3857 | |
3858 | - rtc = devm_rtc_device_register(&pdev->dev, rtc_name, &vr41xx_rtc_ops, |
3859 | - THIS_MODULE); |
3860 | + rtc = devm_rtc_allocate_device(&pdev->dev); |
3861 | if (IS_ERR(rtc)) { |
3862 | retval = PTR_ERR(rtc); |
3863 | goto err_iounmap_all; |
3864 | } |
3865 | |
3866 | + rtc->ops = &vr41xx_rtc_ops; |
3867 | + |
3868 | rtc->max_user_freq = MAX_PERIODIC_RATE; |
3869 | |
3870 | spin_lock_irq(&rtc_lock); |
3871 | @@ -340,6 +341,10 @@ static int rtc_probe(struct platform_device *pdev) |
3872 | |
3873 | dev_info(&pdev->dev, "Real Time Clock of NEC VR4100 series\n"); |
3874 | |
3875 | + retval = rtc_register_device(rtc); |
3876 | + if (retval) |
3877 | + goto err_iounmap_all; |
3878 | + |
3879 | return 0; |
3880 | |
3881 | err_iounmap_all: |
3882 | diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c |
3883 | index b415ba42ca73..599447032e50 100644 |
3884 | --- a/drivers/s390/scsi/zfcp_dbf.c |
3885 | +++ b/drivers/s390/scsi/zfcp_dbf.c |
3886 | @@ -285,6 +285,8 @@ void zfcp_dbf_rec_trig(char *tag, struct zfcp_adapter *adapter, |
3887 | struct list_head *entry; |
3888 | unsigned long flags; |
3889 | |
3890 | + lockdep_assert_held(&adapter->erp_lock); |
3891 | + |
3892 | if (unlikely(!debug_level_enabled(dbf->rec, level))) |
3893 | return; |
3894 | |
3895 | diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c |
3896 | index 00e7968a1d70..a1388842e17e 100644 |
3897 | --- a/drivers/scsi/3w-9xxx.c |
3898 | +++ b/drivers/scsi/3w-9xxx.c |
3899 | @@ -886,6 +886,11 @@ static int twa_chrdev_open(struct inode *inode, struct file *file) |
3900 | unsigned int minor_number; |
3901 | int retval = TW_IOCTL_ERROR_OS_ENODEV; |
3902 | |
3903 | + if (!capable(CAP_SYS_ADMIN)) { |
3904 | + retval = -EACCES; |
3905 | + goto out; |
3906 | + } |
3907 | + |
3908 | minor_number = iminor(inode); |
3909 | if (minor_number >= twa_device_extension_count) |
3910 | goto out; |
3911 | diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c |
3912 | index 33261b690774..f6179e3d6953 100644 |
3913 | --- a/drivers/scsi/3w-xxxx.c |
3914 | +++ b/drivers/scsi/3w-xxxx.c |
3915 | @@ -1033,6 +1033,9 @@ static int tw_chrdev_open(struct inode *inode, struct file *file) |
3916 | |
3917 | dprintk(KERN_WARNING "3w-xxxx: tw_ioctl_open()\n"); |
3918 | |
3919 | + if (!capable(CAP_SYS_ADMIN)) |
3920 | + return -EACCES; |
3921 | + |
3922 | minor_number = iminor(inode); |
3923 | if (minor_number >= tw_device_extension_count) |
3924 | return -ENODEV; |
3925 | diff --git a/drivers/scsi/cxlflash/main.c b/drivers/scsi/cxlflash/main.c |
3926 | index 0b6467206f8e..737314cac8d8 100644 |
3927 | --- a/drivers/scsi/cxlflash/main.c |
3928 | +++ b/drivers/scsi/cxlflash/main.c |
3929 | @@ -946,9 +946,9 @@ static void cxlflash_remove(struct pci_dev *pdev) |
3930 | return; |
3931 | } |
3932 | |
3933 | - /* If a Task Management Function is active, wait for it to complete |
3934 | - * before continuing with remove. |
3935 | - */ |
3936 | + /* Yield to running recovery threads before continuing with remove */ |
3937 | + wait_event(cfg->reset_waitq, cfg->state != STATE_RESET && |
3938 | + cfg->state != STATE_PROBING); |
3939 | spin_lock_irqsave(&cfg->tmf_slock, lock_flags); |
3940 | if (cfg->tmf_active) |
3941 | wait_event_interruptible_lock_irq(cfg->tmf_waitq, |
3942 | @@ -1303,7 +1303,10 @@ static void afu_err_intr_init(struct afu *afu) |
3943 | for (i = 0; i < afu->num_hwqs; i++) { |
3944 | hwq = get_hwq(afu, i); |
3945 | |
3946 | - writeq_be(SISL_MSI_SYNC_ERROR, &hwq->host_map->ctx_ctrl); |
3947 | + reg = readq_be(&hwq->host_map->ctx_ctrl); |
3948 | + WARN_ON((reg & SISL_CTX_CTRL_LISN_MASK) != 0); |
3949 | + reg |= SISL_MSI_SYNC_ERROR; |
3950 | + writeq_be(reg, &hwq->host_map->ctx_ctrl); |
3951 | writeq_be(SISL_ISTATUS_MASK, &hwq->host_map->intr_mask); |
3952 | } |
3953 | } |
3954 | diff --git a/drivers/scsi/cxlflash/sislite.h b/drivers/scsi/cxlflash/sislite.h |
3955 | index 09daa86670fc..0892fb1f0a1e 100644 |
3956 | --- a/drivers/scsi/cxlflash/sislite.h |
3957 | +++ b/drivers/scsi/cxlflash/sislite.h |
3958 | @@ -284,6 +284,7 @@ struct sisl_host_map { |
3959 | __be64 cmd_room; |
3960 | __be64 ctx_ctrl; /* least significant byte or b56:63 is LISN# */ |
3961 | #define SISL_CTX_CTRL_UNMAP_SECTOR 0x8000000000000000ULL /* b0 */ |
3962 | +#define SISL_CTX_CTRL_LISN_MASK (0xFFULL) |
3963 | __be64 mbox_w; /* restricted use */ |
3964 | __be64 sq_start; /* Submission Queue (R/W): write sequence and */ |
3965 | __be64 sq_end; /* inclusion semantics are the same as RRQ */ |
3966 | diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c |
3967 | index 2e5fa9717be8..871962b2e2f6 100644 |
3968 | --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c |
3969 | +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c |
3970 | @@ -328,10 +328,11 @@ enum { |
3971 | #define DIR_TO_DEVICE 2 |
3972 | #define DIR_RESERVED 3 |
3973 | |
3974 | -#define CMD_IS_UNCONSTRAINT(cmd) \ |
3975 | - ((cmd == ATA_CMD_READ_LOG_EXT) || \ |
3976 | - (cmd == ATA_CMD_READ_LOG_DMA_EXT) || \ |
3977 | - (cmd == ATA_CMD_DEV_RESET)) |
3978 | +#define FIS_CMD_IS_UNCONSTRAINED(fis) \ |
3979 | + ((fis.command == ATA_CMD_READ_LOG_EXT) || \ |
3980 | + (fis.command == ATA_CMD_READ_LOG_DMA_EXT) || \ |
3981 | + ((fis.command == ATA_CMD_DEV_RESET) && \ |
3982 | + ((fis.control & ATA_SRST) != 0))) |
3983 | |
3984 | static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off) |
3985 | { |
3986 | @@ -1044,7 +1045,7 @@ static int prep_ata_v3_hw(struct hisi_hba *hisi_hba, |
3987 | << CMD_HDR_FRAME_TYPE_OFF; |
3988 | dw1 |= sas_dev->device_id << CMD_HDR_DEV_ID_OFF; |
3989 | |
3990 | - if (CMD_IS_UNCONSTRAINT(task->ata_task.fis.command)) |
3991 | + if (FIS_CMD_IS_UNCONSTRAINED(task->ata_task.fis)) |
3992 | dw1 |= 1 << CMD_HDR_UNCON_CMD_OFF; |
3993 | |
3994 | hdr->dw1 = cpu_to_le32(dw1); |
3995 | diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c |
3996 | index 7195cff51d4c..9b6f5d024dba 100644 |
3997 | --- a/drivers/scsi/megaraid.c |
3998 | +++ b/drivers/scsi/megaraid.c |
3999 | @@ -4199,6 +4199,9 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) |
4000 | int irq, i, j; |
4001 | int error = -ENODEV; |
4002 | |
4003 | + if (hba_count >= MAX_CONTROLLERS) |
4004 | + goto out; |
4005 | + |
4006 | if (pci_enable_device(pdev)) |
4007 | goto out; |
4008 | pci_set_master(pdev); |
4009 | diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c |
4010 | index d8f626567f59..06a2e3d9fc5b 100644 |
4011 | --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c |
4012 | +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c |
4013 | @@ -2677,6 +2677,9 @@ megasas_build_syspd_fusion(struct megasas_instance *instance, |
4014 | pRAID_Context->timeout_value = cpu_to_le16(os_timeout_value); |
4015 | pRAID_Context->virtual_disk_tgt_id = cpu_to_le16(device_id); |
4016 | } else { |
4017 | + if (os_timeout_value) |
4018 | + os_timeout_value++; |
4019 | + |
4020 | /* system pd Fast Path */ |
4021 | io_request->Function = MPI2_FUNCTION_SCSI_IO_REQUEST; |
4022 | timeout_limit = (scmd->device->type == TYPE_DISK) ? |
4023 | diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c |
4024 | index 7c0064500cc5..382edb79a0de 100644 |
4025 | --- a/drivers/scsi/qedf/qedf_main.c |
4026 | +++ b/drivers/scsi/qedf/qedf_main.c |
4027 | @@ -1649,6 +1649,15 @@ static int qedf_vport_destroy(struct fc_vport *vport) |
4028 | struct Scsi_Host *shost = vport_to_shost(vport); |
4029 | struct fc_lport *n_port = shost_priv(shost); |
4030 | struct fc_lport *vn_port = vport->dd_data; |
4031 | + struct qedf_ctx *qedf = lport_priv(vn_port); |
4032 | + |
4033 | + if (!qedf) { |
4034 | + QEDF_ERR(NULL, "qedf is NULL.\n"); |
4035 | + goto out; |
4036 | + } |
4037 | + |
4038 | + /* Set unloading bit on vport qedf_ctx to prevent more I/O */ |
4039 | + set_bit(QEDF_UNLOADING, &qedf->flags); |
4040 | |
4041 | mutex_lock(&n_port->lp_mutex); |
4042 | list_del(&vn_port->list); |
4043 | @@ -1675,6 +1684,7 @@ static int qedf_vport_destroy(struct fc_vport *vport) |
4044 | if (vn_port->host) |
4045 | scsi_host_put(vn_port->host); |
4046 | |
4047 | +out: |
4048 | return 0; |
4049 | } |
4050 | |
4051 | diff --git a/drivers/scsi/scsi_dh.c b/drivers/scsi/scsi_dh.c |
4052 | index a5e30e9449ef..375cede0c534 100644 |
4053 | --- a/drivers/scsi/scsi_dh.c |
4054 | +++ b/drivers/scsi/scsi_dh.c |
4055 | @@ -58,7 +58,10 @@ static const struct scsi_dh_blist scsi_dh_blist[] = { |
4056 | {"IBM", "3526", "rdac", }, |
4057 | {"IBM", "3542", "rdac", }, |
4058 | {"IBM", "3552", "rdac", }, |
4059 | - {"SGI", "TP9", "rdac", }, |
4060 | + {"SGI", "TP9300", "rdac", }, |
4061 | + {"SGI", "TP9400", "rdac", }, |
4062 | + {"SGI", "TP9500", "rdac", }, |
4063 | + {"SGI", "TP9700", "rdac", }, |
4064 | {"SGI", "IS", "rdac", }, |
4065 | {"STK", "OPENstorage", "rdac", }, |
4066 | {"STK", "FLEXLINE 380", "rdac", }, |
4067 | diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c |
4068 | index 3bb1f6cc297a..21c81c1feac5 100644 |
4069 | --- a/drivers/scsi/ufs/ufshcd.c |
4070 | +++ b/drivers/scsi/ufs/ufshcd.c |
4071 | @@ -4947,6 +4947,7 @@ static void ufshcd_exception_event_handler(struct work_struct *work) |
4072 | hba = container_of(work, struct ufs_hba, eeh_work); |
4073 | |
4074 | pm_runtime_get_sync(hba->dev); |
4075 | + scsi_block_requests(hba->host); |
4076 | err = ufshcd_get_ee_status(hba, &status); |
4077 | if (err) { |
4078 | dev_err(hba->dev, "%s: failed to get exception status %d\n", |
4079 | @@ -4960,6 +4961,7 @@ static void ufshcd_exception_event_handler(struct work_struct *work) |
4080 | ufshcd_bkops_exception_event_handler(hba); |
4081 | |
4082 | out: |
4083 | + scsi_unblock_requests(hba->host); |
4084 | pm_runtime_put_sync(hba->dev); |
4085 | return; |
4086 | } |
4087 | @@ -6761,9 +6763,16 @@ static int __ufshcd_setup_clocks(struct ufs_hba *hba, bool on, |
4088 | if (list_empty(head)) |
4089 | goto out; |
4090 | |
4091 | - ret = ufshcd_vops_setup_clocks(hba, on, PRE_CHANGE); |
4092 | - if (ret) |
4093 | - return ret; |
4094 | + /* |
4095 | + * vendor specific setup_clocks ops may depend on clocks managed by |
4096 | + * this standard driver hence call the vendor specific setup_clocks |
4097 | + * before disabling the clocks managed here. |
4098 | + */ |
4099 | + if (!on) { |
4100 | + ret = ufshcd_vops_setup_clocks(hba, on, PRE_CHANGE); |
4101 | + if (ret) |
4102 | + return ret; |
4103 | + } |
4104 | |
4105 | list_for_each_entry(clki, head, list) { |
4106 | if (!IS_ERR_OR_NULL(clki->clk)) { |
4107 | @@ -6787,9 +6796,16 @@ static int __ufshcd_setup_clocks(struct ufs_hba *hba, bool on, |
4108 | } |
4109 | } |
4110 | |
4111 | - ret = ufshcd_vops_setup_clocks(hba, on, POST_CHANGE); |
4112 | - if (ret) |
4113 | - return ret; |
4114 | + /* |
4115 | + * vendor specific setup_clocks ops may depend on clocks managed by |
4116 | + * this standard driver hence call the vendor specific setup_clocks |
4117 | + * after enabling the clocks managed here. |
4118 | + */ |
4119 | + if (on) { |
4120 | + ret = ufshcd_vops_setup_clocks(hba, on, POST_CHANGE); |
4121 | + if (ret) |
4122 | + return ret; |
4123 | + } |
4124 | |
4125 | out: |
4126 | if (ret) { |
4127 | diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c |
4128 | index afc7ecc3c187..f4e3bd40c72e 100644 |
4129 | --- a/drivers/soc/imx/gpcv2.c |
4130 | +++ b/drivers/soc/imx/gpcv2.c |
4131 | @@ -155,7 +155,7 @@ static int imx7_gpc_pu_pgc_sw_pdn_req(struct generic_pm_domain *genpd) |
4132 | return imx7_gpc_pu_pgc_sw_pxx_req(genpd, false); |
4133 | } |
4134 | |
4135 | -static struct imx7_pgc_domain imx7_pgc_domains[] = { |
4136 | +static const struct imx7_pgc_domain imx7_pgc_domains[] = { |
4137 | [IMX7_POWER_DOMAIN_MIPI_PHY] = { |
4138 | .genpd = { |
4139 | .name = "mipi-phy", |
4140 | @@ -321,11 +321,6 @@ static int imx_gpcv2_probe(struct platform_device *pdev) |
4141 | continue; |
4142 | } |
4143 | |
4144 | - domain = &imx7_pgc_domains[domain_index]; |
4145 | - domain->regmap = regmap; |
4146 | - domain->genpd.power_on = imx7_gpc_pu_pgc_sw_pup_req; |
4147 | - domain->genpd.power_off = imx7_gpc_pu_pgc_sw_pdn_req; |
4148 | - |
4149 | pd_pdev = platform_device_alloc("imx7-pgc-domain", |
4150 | domain_index); |
4151 | if (!pd_pdev) { |
4152 | @@ -334,7 +329,20 @@ static int imx_gpcv2_probe(struct platform_device *pdev) |
4153 | return -ENOMEM; |
4154 | } |
4155 | |
4156 | - pd_pdev->dev.platform_data = domain; |
4157 | + ret = platform_device_add_data(pd_pdev, |
4158 | + &imx7_pgc_domains[domain_index], |
4159 | + sizeof(imx7_pgc_domains[domain_index])); |
4160 | + if (ret) { |
4161 | + platform_device_put(pd_pdev); |
4162 | + of_node_put(np); |
4163 | + return ret; |
4164 | + } |
4165 | + |
4166 | + domain = pd_pdev->dev.platform_data; |
4167 | + domain->regmap = regmap; |
4168 | + domain->genpd.power_on = imx7_gpc_pu_pgc_sw_pup_req; |
4169 | + domain->genpd.power_off = imx7_gpc_pu_pgc_sw_pdn_req; |
4170 | + |
4171 | pd_pdev->dev.parent = dev; |
4172 | pd_pdev->dev.of_node = np; |
4173 | |
4174 | diff --git a/drivers/spi/spi-meson-spicc.c b/drivers/spi/spi-meson-spicc.c |
4175 | index 7f8429635502..a5b0df7e6131 100644 |
4176 | --- a/drivers/spi/spi-meson-spicc.c |
4177 | +++ b/drivers/spi/spi-meson-spicc.c |
4178 | @@ -574,10 +574,15 @@ static int meson_spicc_probe(struct platform_device *pdev) |
4179 | master->max_speed_hz = rate >> 2; |
4180 | |
4181 | ret = devm_spi_register_master(&pdev->dev, master); |
4182 | - if (!ret) |
4183 | - return 0; |
4184 | + if (ret) { |
4185 | + dev_err(&pdev->dev, "spi master registration failed\n"); |
4186 | + goto out_clk; |
4187 | + } |
4188 | |
4189 | - dev_err(&pdev->dev, "spi master registration failed\n"); |
4190 | + return 0; |
4191 | + |
4192 | +out_clk: |
4193 | + clk_disable_unprepare(spicc->core); |
4194 | |
4195 | out_master: |
4196 | spi_master_put(master); |
4197 | diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c |
4198 | index b392cca8fa4f..1a6ec226d6e4 100644 |
4199 | --- a/drivers/spi/spi-s3c64xx.c |
4200 | +++ b/drivers/spi/spi-s3c64xx.c |
4201 | @@ -1273,8 +1273,6 @@ static int s3c64xx_spi_resume(struct device *dev) |
4202 | if (ret < 0) |
4203 | return ret; |
4204 | |
4205 | - s3c64xx_spi_hwinit(sdd, sdd->port_id); |
4206 | - |
4207 | return spi_master_resume(master); |
4208 | } |
4209 | #endif /* CONFIG_PM_SLEEP */ |
4210 | @@ -1312,6 +1310,8 @@ static int s3c64xx_spi_runtime_resume(struct device *dev) |
4211 | if (ret != 0) |
4212 | goto err_disable_src_clk; |
4213 | |
4214 | + s3c64xx_spi_hwinit(sdd, sdd->port_id); |
4215 | + |
4216 | return 0; |
4217 | |
4218 | err_disable_src_clk: |
4219 | diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c |
4220 | index 52056535f54e..0fea18ab970e 100644 |
4221 | --- a/drivers/spi/spi-sh-msiof.c |
4222 | +++ b/drivers/spi/spi-sh-msiof.c |
4223 | @@ -555,14 +555,16 @@ static int sh_msiof_spi_setup(struct spi_device *spi) |
4224 | |
4225 | /* Configure native chip select mode/polarity early */ |
4226 | clr = MDR1_SYNCMD_MASK; |
4227 | - set = MDR1_TRMD | TMDR1_PCON | MDR1_SYNCMD_SPI; |
4228 | + set = MDR1_SYNCMD_SPI; |
4229 | if (spi->mode & SPI_CS_HIGH) |
4230 | clr |= BIT(MDR1_SYNCAC_SHIFT); |
4231 | else |
4232 | set |= BIT(MDR1_SYNCAC_SHIFT); |
4233 | pm_runtime_get_sync(&p->pdev->dev); |
4234 | tmp = sh_msiof_read(p, TMDR1) & ~clr; |
4235 | - sh_msiof_write(p, TMDR1, tmp | set); |
4236 | + sh_msiof_write(p, TMDR1, tmp | set | MDR1_TRMD | TMDR1_PCON); |
4237 | + tmp = sh_msiof_read(p, RMDR1) & ~clr; |
4238 | + sh_msiof_write(p, RMDR1, tmp | set); |
4239 | pm_runtime_put(&p->pdev->dev); |
4240 | p->native_cs_high = spi->mode & SPI_CS_HIGH; |
4241 | p->native_cs_inited = true; |
4242 | diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c |
4243 | index 84dfef4bd6ae..f85d30dc9187 100644 |
4244 | --- a/drivers/spi/spi.c |
4245 | +++ b/drivers/spi/spi.c |
4246 | @@ -1222,6 +1222,7 @@ static void __spi_pump_messages(struct spi_controller *ctlr, bool in_kthread) |
4247 | if (!was_busy && ctlr->auto_runtime_pm) { |
4248 | ret = pm_runtime_get_sync(ctlr->dev.parent); |
4249 | if (ret < 0) { |
4250 | + pm_runtime_put_noidle(ctlr->dev.parent); |
4251 | dev_err(&ctlr->dev, "Failed to power device: %d\n", |
4252 | ret); |
4253 | mutex_unlock(&ctlr->io_mutex); |
4254 | diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c |
4255 | index 284cdd44a2ee..8b92cf06d063 100644 |
4256 | --- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c |
4257 | +++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c |
4258 | @@ -1710,7 +1710,7 @@ int kiblnd_fmr_pool_map(struct kib_fmr_poolset *fps, struct kib_tx *tx, |
4259 | return 0; |
4260 | } |
4261 | spin_unlock(&fps->fps_lock); |
4262 | - rc = -EBUSY; |
4263 | + rc = -EAGAIN; |
4264 | } |
4265 | |
4266 | spin_lock(&fps->fps_lock); |
4267 | diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c |
4268 | index 29e10021b906..4b4a20149894 100644 |
4269 | --- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c |
4270 | +++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c |
4271 | @@ -47,7 +47,7 @@ static int kiblnd_init_rdma(struct kib_conn *conn, struct kib_tx *tx, int type, |
4272 | __u64 dstcookie); |
4273 | static void kiblnd_queue_tx_locked(struct kib_tx *tx, struct kib_conn *conn); |
4274 | static void kiblnd_queue_tx(struct kib_tx *tx, struct kib_conn *conn); |
4275 | -static void kiblnd_unmap_tx(struct lnet_ni *ni, struct kib_tx *tx); |
4276 | +static void kiblnd_unmap_tx(struct kib_tx *tx); |
4277 | static void kiblnd_check_sends_locked(struct kib_conn *conn); |
4278 | |
4279 | static void |
4280 | @@ -65,7 +65,7 @@ kiblnd_tx_done(struct lnet_ni *ni, struct kib_tx *tx) |
4281 | LASSERT(!tx->tx_waiting); /* mustn't be awaiting peer response */ |
4282 | LASSERT(tx->tx_pool); |
4283 | |
4284 | - kiblnd_unmap_tx(ni, tx); |
4285 | + kiblnd_unmap_tx(tx); |
4286 | |
4287 | /* tx may have up to 2 lnet msgs to finalise */ |
4288 | lntmsg[0] = tx->tx_lntmsg[0]; tx->tx_lntmsg[0] = NULL; |
4289 | @@ -590,13 +590,9 @@ kiblnd_fmr_map_tx(struct kib_net *net, struct kib_tx *tx, struct kib_rdma_desc * |
4290 | return 0; |
4291 | } |
4292 | |
4293 | -static void kiblnd_unmap_tx(struct lnet_ni *ni, struct kib_tx *tx) |
4294 | +static void kiblnd_unmap_tx(struct kib_tx *tx) |
4295 | { |
4296 | - struct kib_net *net = ni->ni_data; |
4297 | - |
4298 | - LASSERT(net); |
4299 | - |
4300 | - if (net->ibn_fmr_ps) |
4301 | + if (tx->fmr.fmr_pfmr || tx->fmr.fmr_frd) |
4302 | kiblnd_fmr_pool_unmap(&tx->fmr, tx->tx_status); |
4303 | |
4304 | if (tx->tx_nfrags) { |
4305 | @@ -1289,11 +1285,6 @@ kiblnd_connect_peer(struct kib_peer *peer) |
4306 | goto failed2; |
4307 | } |
4308 | |
4309 | - LASSERT(cmid->device); |
4310 | - CDEBUG(D_NET, "%s: connection bound to %s:%pI4h:%s\n", |
4311 | - libcfs_nid2str(peer->ibp_nid), dev->ibd_ifname, |
4312 | - &dev->ibd_ifip, cmid->device->name); |
4313 | - |
4314 | return; |
4315 | |
4316 | failed2: |
4317 | @@ -2995,8 +2986,19 @@ kiblnd_cm_callback(struct rdma_cm_id *cmid, struct rdma_cm_event *event) |
4318 | } else { |
4319 | rc = rdma_resolve_route( |
4320 | cmid, *kiblnd_tunables.kib_timeout * 1000); |
4321 | - if (!rc) |
4322 | + if (!rc) { |
4323 | + struct kib_net *net = peer->ibp_ni->ni_data; |
4324 | + struct kib_dev *dev = net->ibn_dev; |
4325 | + |
4326 | + CDEBUG(D_NET, "%s: connection bound to "\ |
4327 | + "%s:%pI4h:%s\n", |
4328 | + libcfs_nid2str(peer->ibp_nid), |
4329 | + dev->ibd_ifname, |
4330 | + &dev->ibd_ifip, cmid->device->name); |
4331 | + |
4332 | return 0; |
4333 | + } |
4334 | + |
4335 | /* Can't initiate route resolution */ |
4336 | CERROR("Can't resolve route for %s: %d\n", |
4337 | libcfs_nid2str(peer->ibp_nid), rc); |
4338 | diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c b/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c |
4339 | index b5d84f3f6071..11e01c48f51a 100644 |
4340 | --- a/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c |
4341 | +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c |
4342 | @@ -1571,8 +1571,10 @@ struct ldlm_lock *ldlm_lock_create(struct ldlm_namespace *ns, |
4343 | return ERR_CAST(res); |
4344 | |
4345 | lock = ldlm_lock_new(res); |
4346 | - if (!lock) |
4347 | + if (!lock) { |
4348 | + ldlm_resource_putref(res); |
4349 | return ERR_PTR(-ENOMEM); |
4350 | + } |
4351 | |
4352 | lock->l_req_mode = mode; |
4353 | lock->l_ast_data = data; |
4354 | @@ -1615,6 +1617,8 @@ out: |
4355 | return ERR_PTR(rc); |
4356 | } |
4357 | |
4358 | + |
4359 | + |
4360 | /** |
4361 | * Enqueue (request) a lock. |
4362 | * On the client this is called from ldlm_cli_enqueue_fini |
4363 | diff --git a/drivers/staging/lustre/lustre/llite/xattr.c b/drivers/staging/lustre/lustre/llite/xattr.c |
4364 | index 0be55623bac4..364d697b2690 100644 |
4365 | --- a/drivers/staging/lustre/lustre/llite/xattr.c |
4366 | +++ b/drivers/staging/lustre/lustre/llite/xattr.c |
4367 | @@ -93,7 +93,11 @@ ll_xattr_set_common(const struct xattr_handler *handler, |
4368 | __u64 valid; |
4369 | int rc; |
4370 | |
4371 | - if (flags == XATTR_REPLACE) { |
4372 | + /* When setxattr() is called with a size of 0 the value is |
4373 | + * unconditionally replaced by "". When removexattr() is |
4374 | + * called we get a NULL value and XATTR_REPLACE for flags. |
4375 | + */ |
4376 | + if (!value && flags == XATTR_REPLACE) { |
4377 | ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_REMOVEXATTR, 1); |
4378 | valid = OBD_MD_FLXATTRRM; |
4379 | } else { |
4380 | diff --git a/drivers/staging/media/atomisp/i2c/ov2680.c b/drivers/staging/media/atomisp/i2c/ov2680.c |
4381 | index 51b7d61df0f5..179576224319 100644 |
4382 | --- a/drivers/staging/media/atomisp/i2c/ov2680.c |
4383 | +++ b/drivers/staging/media/atomisp/i2c/ov2680.c |
4384 | @@ -396,12 +396,11 @@ static long __ov2680_set_exposure(struct v4l2_subdev *sd, int coarse_itg, |
4385 | { |
4386 | struct i2c_client *client = v4l2_get_subdevdata(sd); |
4387 | struct ov2680_device *dev = to_ov2680_sensor(sd); |
4388 | - u16 vts,hts; |
4389 | + u16 vts; |
4390 | int ret,exp_val; |
4391 | |
4392 | dev_dbg(&client->dev, "+++++++__ov2680_set_exposure coarse_itg %d, gain %d, digitgain %d++\n",coarse_itg, gain, digitgain); |
4393 | |
4394 | - hts = ov2680_res[dev->fmt_idx].pixels_per_line; |
4395 | vts = ov2680_res[dev->fmt_idx].lines_per_frame; |
4396 | |
4397 | /* group hold */ |
4398 | @@ -1190,7 +1189,8 @@ static int ov2680_detect(struct i2c_client *client) |
4399 | OV2680_SC_CMMN_SUB_ID, &high); |
4400 | revision = (u8) high & 0x0f; |
4401 | |
4402 | - dev_info(&client->dev, "sensor_revision id = 0x%x\n", id); |
4403 | + dev_info(&client->dev, "sensor_revision id = 0x%x, rev= %d\n", |
4404 | + id, revision); |
4405 | |
4406 | return 0; |
4407 | } |
4408 | diff --git a/drivers/staging/media/atomisp/pci/atomisp2/atomisp_compat_ioctl32.c b/drivers/staging/media/atomisp/pci/atomisp2/atomisp_compat_ioctl32.c |
4409 | index 0592ac1f2832..cfe6bb610014 100644 |
4410 | --- a/drivers/staging/media/atomisp/pci/atomisp2/atomisp_compat_ioctl32.c |
4411 | +++ b/drivers/staging/media/atomisp/pci/atomisp2/atomisp_compat_ioctl32.c |
4412 | @@ -81,7 +81,7 @@ static int get_v4l2_framebuffer32(struct v4l2_framebuffer *kp, |
4413 | get_user(kp->flags, &up->flags)) |
4414 | return -EFAULT; |
4415 | |
4416 | - kp->base = compat_ptr(tmp); |
4417 | + kp->base = (void __force *)compat_ptr(tmp); |
4418 | get_v4l2_pix_format((struct v4l2_pix_format *)&kp->fmt, &up->fmt); |
4419 | return 0; |
4420 | } |
4421 | @@ -232,10 +232,10 @@ static int get_atomisp_dvs_6axis_config32(struct atomisp_dvs_6axis_config *kp, |
4422 | get_user(ycoords_uv, &up->ycoords_uv)) |
4423 | return -EFAULT; |
4424 | |
4425 | - kp->xcoords_y = compat_ptr(xcoords_y); |
4426 | - kp->ycoords_y = compat_ptr(ycoords_y); |
4427 | - kp->xcoords_uv = compat_ptr(xcoords_uv); |
4428 | - kp->ycoords_uv = compat_ptr(ycoords_uv); |
4429 | + kp->xcoords_y = (void __force *)compat_ptr(xcoords_y); |
4430 | + kp->ycoords_y = (void __force *)compat_ptr(ycoords_y); |
4431 | + kp->xcoords_uv = (void __force *)compat_ptr(xcoords_uv); |
4432 | + kp->ycoords_uv = (void __force *)compat_ptr(ycoords_uv); |
4433 | return 0; |
4434 | } |
4435 | |
4436 | @@ -296,7 +296,7 @@ static int get_atomisp_metadata_stat32(struct atomisp_metadata *kp, |
4437 | return -EFAULT; |
4438 | |
4439 | kp->data = compat_ptr(data); |
4440 | - kp->effective_width = compat_ptr(effective_width); |
4441 | + kp->effective_width = (void __force *)compat_ptr(effective_width); |
4442 | return 0; |
4443 | } |
4444 | |
4445 | @@ -360,7 +360,7 @@ static int get_atomisp_metadata_by_type_stat32( |
4446 | return -EFAULT; |
4447 | |
4448 | kp->data = compat_ptr(data); |
4449 | - kp->effective_width = compat_ptr(effective_width); |
4450 | + kp->effective_width = (void __force *)compat_ptr(effective_width); |
4451 | return 0; |
4452 | } |
4453 | |
4454 | @@ -437,7 +437,7 @@ static int get_atomisp_overlay32(struct atomisp_overlay *kp, |
4455 | get_user(kp->overlay_start_x, &up->overlay_start_y)) |
4456 | return -EFAULT; |
4457 | |
4458 | - kp->frame = compat_ptr(frame); |
4459 | + kp->frame = (void __force *)compat_ptr(frame); |
4460 | return 0; |
4461 | } |
4462 | |
4463 | @@ -481,7 +481,7 @@ static int get_atomisp_calibration_group32( |
4464 | get_user(calb_grp_values, &up->calb_grp_values)) |
4465 | return -EFAULT; |
4466 | |
4467 | - kp->calb_grp_values = compat_ptr(calb_grp_values); |
4468 | + kp->calb_grp_values = (void __force *)compat_ptr(calb_grp_values); |
4469 | return 0; |
4470 | } |
4471 | |
4472 | @@ -703,8 +703,8 @@ static int get_atomisp_parameters32(struct atomisp_parameters *kp, |
4473 | return -EFAULT; |
4474 | |
4475 | while (n >= 0) { |
4476 | - compat_uptr_t *src = (compat_uptr_t *)up + n; |
4477 | - uintptr_t *dst = (uintptr_t *)kp + n; |
4478 | + compat_uptr_t __user *src = ((compat_uptr_t __user *)up) + n; |
4479 | + uintptr_t *dst = ((uintptr_t *)kp) + n; |
4480 | |
4481 | if (get_user((*dst), src)) |
4482 | return -EFAULT; |
4483 | @@ -751,12 +751,12 @@ static int get_atomisp_parameters32(struct atomisp_parameters *kp, |
4484 | #endif |
4485 | return -EFAULT; |
4486 | |
4487 | - kp->shading_table = user_ptr + offset; |
4488 | + kp->shading_table = (void __force *)user_ptr + offset; |
4489 | offset = sizeof(struct atomisp_shading_table); |
4490 | if (!kp->shading_table) |
4491 | return -EFAULT; |
4492 | |
4493 | - if (copy_to_user(kp->shading_table, |
4494 | + if (copy_to_user((void __user *)kp->shading_table, |
4495 | &karg.shading_table, |
4496 | sizeof(struct atomisp_shading_table))) |
4497 | return -EFAULT; |
4498 | @@ -777,13 +777,14 @@ static int get_atomisp_parameters32(struct atomisp_parameters *kp, |
4499 | #endif |
4500 | return -EFAULT; |
4501 | |
4502 | - kp->morph_table = user_ptr + offset; |
4503 | + kp->morph_table = (void __force *)user_ptr + offset; |
4504 | offset += sizeof(struct atomisp_morph_table); |
4505 | if (!kp->morph_table) |
4506 | return -EFAULT; |
4507 | |
4508 | - if (copy_to_user(kp->morph_table, &karg.morph_table, |
4509 | - sizeof(struct atomisp_morph_table))) |
4510 | + if (copy_to_user((void __user *)kp->morph_table, |
4511 | + &karg.morph_table, |
4512 | + sizeof(struct atomisp_morph_table))) |
4513 | return -EFAULT; |
4514 | } |
4515 | |
4516 | @@ -802,13 +803,14 @@ static int get_atomisp_parameters32(struct atomisp_parameters *kp, |
4517 | #endif |
4518 | return -EFAULT; |
4519 | |
4520 | - kp->dvs2_coefs = user_ptr + offset; |
4521 | + kp->dvs2_coefs = (void __force *)user_ptr + offset; |
4522 | offset += sizeof(struct atomisp_dis_coefficients); |
4523 | if (!kp->dvs2_coefs) |
4524 | return -EFAULT; |
4525 | |
4526 | - if (copy_to_user(kp->dvs2_coefs, &karg.dvs2_coefs, |
4527 | - sizeof(struct atomisp_dis_coefficients))) |
4528 | + if (copy_to_user((void __user *)kp->dvs2_coefs, |
4529 | + &karg.dvs2_coefs, |
4530 | + sizeof(struct atomisp_dis_coefficients))) |
4531 | return -EFAULT; |
4532 | } |
4533 | /* handle dvs 6axis configuration */ |
4534 | @@ -826,13 +828,14 @@ static int get_atomisp_parameters32(struct atomisp_parameters *kp, |
4535 | #endif |
4536 | return -EFAULT; |
4537 | |
4538 | - kp->dvs_6axis_config = user_ptr + offset; |
4539 | + kp->dvs_6axis_config = (void __force *)user_ptr + offset; |
4540 | offset += sizeof(struct atomisp_dvs_6axis_config); |
4541 | if (!kp->dvs_6axis_config) |
4542 | return -EFAULT; |
4543 | |
4544 | - if (copy_to_user(kp->dvs_6axis_config, &karg.dvs_6axis_config, |
4545 | - sizeof(struct atomisp_dvs_6axis_config))) |
4546 | + if (copy_to_user((void __user *)kp->dvs_6axis_config, |
4547 | + &karg.dvs_6axis_config, |
4548 | + sizeof(struct atomisp_dvs_6axis_config))) |
4549 | return -EFAULT; |
4550 | } |
4551 | } |
4552 | @@ -891,7 +894,7 @@ static int get_atomisp_sensor_ae_bracketing_lut( |
4553 | get_user(lut, &up->lut)) |
4554 | return -EFAULT; |
4555 | |
4556 | - kp->lut = compat_ptr(lut); |
4557 | + kp->lut = (void __force *)compat_ptr(lut); |
4558 | return 0; |
4559 | } |
4560 | |
4561 | diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c |
4562 | index 486be990d7fc..a457034818c3 100644 |
4563 | --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c |
4564 | +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c |
4565 | @@ -601,6 +601,7 @@ reserve_space(VCHIQ_STATE_T *state, size_t space, int is_blocking) |
4566 | } |
4567 | |
4568 | if (tx_pos == (state->slot_queue_available * VCHIQ_SLOT_SIZE)) { |
4569 | + up(&state->slot_available_event); |
4570 | pr_warn("%s: invalid tx_pos: %d\n", __func__, tx_pos); |
4571 | return NULL; |
4572 | } |
4573 | diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c |
4574 | index ac83f721db24..d60069b5dc98 100644 |
4575 | --- a/drivers/thermal/samsung/exynos_tmu.c |
4576 | +++ b/drivers/thermal/samsung/exynos_tmu.c |
4577 | @@ -598,6 +598,7 @@ static int exynos5433_tmu_initialize(struct platform_device *pdev) |
4578 | threshold_code = temp_to_code(data, temp); |
4579 | |
4580 | rising_threshold = readl(data->base + rising_reg_offset); |
4581 | + rising_threshold &= ~(0xff << j * 8); |
4582 | rising_threshold |= (threshold_code << j * 8); |
4583 | writel(rising_threshold, data->base + rising_reg_offset); |
4584 | |
4585 | diff --git a/drivers/tty/hvc/hvc_opal.c b/drivers/tty/hvc/hvc_opal.c |
4586 | index 16331a90c1e8..9da8474fe50a 100644 |
4587 | --- a/drivers/tty/hvc/hvc_opal.c |
4588 | +++ b/drivers/tty/hvc/hvc_opal.c |
4589 | @@ -332,7 +332,6 @@ static void udbg_init_opal_common(void) |
4590 | udbg_putc = udbg_opal_putc; |
4591 | udbg_getc = udbg_opal_getc; |
4592 | udbg_getc_poll = udbg_opal_getc_poll; |
4593 | - tb_ticks_per_usec = 0x200; /* Make udelay not suck */ |
4594 | } |
4595 | |
4596 | void __init hvc_opal_init_early(void) |
4597 | diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c |
4598 | index 64338442050e..899e8fe5e00f 100644 |
4599 | --- a/drivers/tty/pty.c |
4600 | +++ b/drivers/tty/pty.c |
4601 | @@ -110,16 +110,19 @@ static void pty_unthrottle(struct tty_struct *tty) |
4602 | static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c) |
4603 | { |
4604 | struct tty_struct *to = tty->link; |
4605 | + unsigned long flags; |
4606 | |
4607 | if (tty->stopped) |
4608 | return 0; |
4609 | |
4610 | if (c > 0) { |
4611 | + spin_lock_irqsave(&to->port->lock, flags); |
4612 | /* Stuff the data into the input queue of the other end */ |
4613 | c = tty_insert_flip_string(to->port, buf, c); |
4614 | /* And shovel */ |
4615 | if (c) |
4616 | tty_flip_buffer_push(to->port); |
4617 | + spin_unlock_irqrestore(&to->port->lock, flags); |
4618 | } |
4619 | return c; |
4620 | } |
4621 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
4622 | index a8bc48b26c23..a9db0887edca 100644 |
4623 | --- a/drivers/usb/core/hub.c |
4624 | +++ b/drivers/usb/core/hub.c |
4625 | @@ -3361,6 +3361,10 @@ static int wait_for_connected(struct usb_device *udev, |
4626 | while (delay_ms < 2000) { |
4627 | if (status || *portstatus & USB_PORT_STAT_CONNECTION) |
4628 | break; |
4629 | + if (!port_is_power_on(hub, *portstatus)) { |
4630 | + status = -ENODEV; |
4631 | + break; |
4632 | + } |
4633 | msleep(20); |
4634 | delay_ms += 20; |
4635 | status = hub_port_status(hub, *port1, portstatus, portchange); |
4636 | diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c |
4637 | index 4cfa72cb0a91..c12a1a6554ba 100644 |
4638 | --- a/drivers/usb/gadget/udc/renesas_usb3.c |
4639 | +++ b/drivers/usb/gadget/udc/renesas_usb3.c |
4640 | @@ -334,6 +334,7 @@ struct renesas_usb3 { |
4641 | struct usb_gadget_driver *driver; |
4642 | struct extcon_dev *extcon; |
4643 | struct work_struct extcon_work; |
4644 | + struct dentry *dentry; |
4645 | |
4646 | struct renesas_usb3_ep *usb3_ep; |
4647 | int num_usb3_eps; |
4648 | @@ -2397,8 +2398,12 @@ static void renesas_usb3_debugfs_init(struct renesas_usb3 *usb3, |
4649 | |
4650 | file = debugfs_create_file("b_device", 0644, root, usb3, |
4651 | &renesas_usb3_b_device_fops); |
4652 | - if (!file) |
4653 | + if (!file) { |
4654 | dev_info(dev, "%s: Can't create debugfs mode\n", __func__); |
4655 | + debugfs_remove_recursive(root); |
4656 | + } else { |
4657 | + usb3->dentry = root; |
4658 | + } |
4659 | } |
4660 | |
4661 | /*------- platform_driver ------------------------------------------------*/ |
4662 | @@ -2406,6 +2411,7 @@ static int renesas_usb3_remove(struct platform_device *pdev) |
4663 | { |
4664 | struct renesas_usb3 *usb3 = platform_get_drvdata(pdev); |
4665 | |
4666 | + debugfs_remove_recursive(usb3->dentry); |
4667 | device_remove_file(&pdev->dev, &dev_attr_role); |
4668 | |
4669 | usb_del_gadget_udc(&usb3->gadget); |
4670 | diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c |
4671 | index 126991046eb7..0212f0ee8aea 100644 |
4672 | --- a/drivers/vfio/mdev/mdev_core.c |
4673 | +++ b/drivers/vfio/mdev/mdev_core.c |
4674 | @@ -66,34 +66,6 @@ uuid_le mdev_uuid(struct mdev_device *mdev) |
4675 | } |
4676 | EXPORT_SYMBOL(mdev_uuid); |
4677 | |
4678 | -static int _find_mdev_device(struct device *dev, void *data) |
4679 | -{ |
4680 | - struct mdev_device *mdev; |
4681 | - |
4682 | - if (!dev_is_mdev(dev)) |
4683 | - return 0; |
4684 | - |
4685 | - mdev = to_mdev_device(dev); |
4686 | - |
4687 | - if (uuid_le_cmp(mdev->uuid, *(uuid_le *)data) == 0) |
4688 | - return 1; |
4689 | - |
4690 | - return 0; |
4691 | -} |
4692 | - |
4693 | -static bool mdev_device_exist(struct mdev_parent *parent, uuid_le uuid) |
4694 | -{ |
4695 | - struct device *dev; |
4696 | - |
4697 | - dev = device_find_child(parent->dev, &uuid, _find_mdev_device); |
4698 | - if (dev) { |
4699 | - put_device(dev); |
4700 | - return true; |
4701 | - } |
4702 | - |
4703 | - return false; |
4704 | -} |
4705 | - |
4706 | /* Should be called holding parent_list_lock */ |
4707 | static struct mdev_parent *__find_parent_device(struct device *dev) |
4708 | { |
4709 | @@ -221,7 +193,6 @@ int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops) |
4710 | } |
4711 | |
4712 | kref_init(&parent->ref); |
4713 | - mutex_init(&parent->lock); |
4714 | |
4715 | parent->dev = dev; |
4716 | parent->ops = ops; |
4717 | @@ -297,6 +268,10 @@ static void mdev_device_release(struct device *dev) |
4718 | { |
4719 | struct mdev_device *mdev = to_mdev_device(dev); |
4720 | |
4721 | + mutex_lock(&mdev_list_lock); |
4722 | + list_del(&mdev->next); |
4723 | + mutex_unlock(&mdev_list_lock); |
4724 | + |
4725 | dev_dbg(&mdev->dev, "MDEV: destroying\n"); |
4726 | kfree(mdev); |
4727 | } |
4728 | @@ -304,7 +279,7 @@ static void mdev_device_release(struct device *dev) |
4729 | int mdev_device_create(struct kobject *kobj, struct device *dev, uuid_le uuid) |
4730 | { |
4731 | int ret; |
4732 | - struct mdev_device *mdev; |
4733 | + struct mdev_device *mdev, *tmp; |
4734 | struct mdev_parent *parent; |
4735 | struct mdev_type *type = to_mdev_type(kobj); |
4736 | |
4737 | @@ -312,21 +287,28 @@ int mdev_device_create(struct kobject *kobj, struct device *dev, uuid_le uuid) |
4738 | if (!parent) |
4739 | return -EINVAL; |
4740 | |
4741 | - mutex_lock(&parent->lock); |
4742 | + mutex_lock(&mdev_list_lock); |
4743 | |
4744 | /* Check for duplicate */ |
4745 | - if (mdev_device_exist(parent, uuid)) { |
4746 | - ret = -EEXIST; |
4747 | - goto create_err; |
4748 | + list_for_each_entry(tmp, &mdev_list, next) { |
4749 | + if (!uuid_le_cmp(tmp->uuid, uuid)) { |
4750 | + mutex_unlock(&mdev_list_lock); |
4751 | + ret = -EEXIST; |
4752 | + goto mdev_fail; |
4753 | + } |
4754 | } |
4755 | |
4756 | mdev = kzalloc(sizeof(*mdev), GFP_KERNEL); |
4757 | if (!mdev) { |
4758 | + mutex_unlock(&mdev_list_lock); |
4759 | ret = -ENOMEM; |
4760 | - goto create_err; |
4761 | + goto mdev_fail; |
4762 | } |
4763 | |
4764 | memcpy(&mdev->uuid, &uuid, sizeof(uuid_le)); |
4765 | + list_add(&mdev->next, &mdev_list); |
4766 | + mutex_unlock(&mdev_list_lock); |
4767 | + |
4768 | mdev->parent = parent; |
4769 | kref_init(&mdev->ref); |
4770 | |
4771 | @@ -338,35 +320,28 @@ int mdev_device_create(struct kobject *kobj, struct device *dev, uuid_le uuid) |
4772 | ret = device_register(&mdev->dev); |
4773 | if (ret) { |
4774 | put_device(&mdev->dev); |
4775 | - goto create_err; |
4776 | + goto mdev_fail; |
4777 | } |
4778 | |
4779 | ret = mdev_device_create_ops(kobj, mdev); |
4780 | if (ret) |
4781 | - goto create_failed; |
4782 | + goto create_fail; |
4783 | |
4784 | ret = mdev_create_sysfs_files(&mdev->dev, type); |
4785 | if (ret) { |
4786 | mdev_device_remove_ops(mdev, true); |
4787 | - goto create_failed; |
4788 | + goto create_fail; |
4789 | } |
4790 | |
4791 | mdev->type_kobj = kobj; |
4792 | + mdev->active = true; |
4793 | dev_dbg(&mdev->dev, "MDEV: created\n"); |
4794 | |
4795 | - mutex_unlock(&parent->lock); |
4796 | - |
4797 | - mutex_lock(&mdev_list_lock); |
4798 | - list_add(&mdev->next, &mdev_list); |
4799 | - mutex_unlock(&mdev_list_lock); |
4800 | - |
4801 | - return ret; |
4802 | + return 0; |
4803 | |
4804 | -create_failed: |
4805 | +create_fail: |
4806 | device_unregister(&mdev->dev); |
4807 | - |
4808 | -create_err: |
4809 | - mutex_unlock(&parent->lock); |
4810 | +mdev_fail: |
4811 | mdev_put_parent(parent); |
4812 | return ret; |
4813 | } |
4814 | @@ -377,44 +352,39 @@ int mdev_device_remove(struct device *dev, bool force_remove) |
4815 | struct mdev_parent *parent; |
4816 | struct mdev_type *type; |
4817 | int ret; |
4818 | - bool found = false; |
4819 | |
4820 | mdev = to_mdev_device(dev); |
4821 | |
4822 | mutex_lock(&mdev_list_lock); |
4823 | list_for_each_entry(tmp, &mdev_list, next) { |
4824 | - if (tmp == mdev) { |
4825 | - found = true; |
4826 | + if (tmp == mdev) |
4827 | break; |
4828 | - } |
4829 | } |
4830 | |
4831 | - if (found) |
4832 | - list_del(&mdev->next); |
4833 | + if (tmp != mdev) { |
4834 | + mutex_unlock(&mdev_list_lock); |
4835 | + return -ENODEV; |
4836 | + } |
4837 | |
4838 | - mutex_unlock(&mdev_list_lock); |
4839 | + if (!mdev->active) { |
4840 | + mutex_unlock(&mdev_list_lock); |
4841 | + return -EAGAIN; |
4842 | + } |
4843 | |
4844 | - if (!found) |
4845 | - return -ENODEV; |
4846 | + mdev->active = false; |
4847 | + mutex_unlock(&mdev_list_lock); |
4848 | |
4849 | type = to_mdev_type(mdev->type_kobj); |
4850 | parent = mdev->parent; |
4851 | - mutex_lock(&parent->lock); |
4852 | |
4853 | ret = mdev_device_remove_ops(mdev, force_remove); |
4854 | if (ret) { |
4855 | - mutex_unlock(&parent->lock); |
4856 | - |
4857 | - mutex_lock(&mdev_list_lock); |
4858 | - list_add(&mdev->next, &mdev_list); |
4859 | - mutex_unlock(&mdev_list_lock); |
4860 | - |
4861 | + mdev->active = true; |
4862 | return ret; |
4863 | } |
4864 | |
4865 | mdev_remove_sysfs_files(dev, type); |
4866 | device_unregister(dev); |
4867 | - mutex_unlock(&parent->lock); |
4868 | mdev_put_parent(parent); |
4869 | |
4870 | return 0; |
4871 | diff --git a/drivers/vfio/mdev/mdev_private.h b/drivers/vfio/mdev/mdev_private.h |
4872 | index a9cefd70a705..b5819b7d7ef7 100644 |
4873 | --- a/drivers/vfio/mdev/mdev_private.h |
4874 | +++ b/drivers/vfio/mdev/mdev_private.h |
4875 | @@ -20,7 +20,6 @@ struct mdev_parent { |
4876 | struct device *dev; |
4877 | const struct mdev_parent_ops *ops; |
4878 | struct kref ref; |
4879 | - struct mutex lock; |
4880 | struct list_head next; |
4881 | struct kset *mdev_types_kset; |
4882 | struct list_head type_list; |
4883 | @@ -34,6 +33,7 @@ struct mdev_device { |
4884 | struct kref ref; |
4885 | struct list_head next; |
4886 | struct kobject *type_kobj; |
4887 | + bool active; |
4888 | }; |
4889 | |
4890 | #define to_mdev_device(dev) container_of(dev, struct mdev_device, dev) |
4891 | diff --git a/drivers/vfio/platform/vfio_platform_common.c b/drivers/vfio/platform/vfio_platform_common.c |
4892 | index 4c27f4be3c3d..aa9e792110e3 100644 |
4893 | --- a/drivers/vfio/platform/vfio_platform_common.c |
4894 | +++ b/drivers/vfio/platform/vfio_platform_common.c |
4895 | @@ -681,18 +681,23 @@ int vfio_platform_probe_common(struct vfio_platform_device *vdev, |
4896 | group = vfio_iommu_group_get(dev); |
4897 | if (!group) { |
4898 | pr_err("VFIO: No IOMMU group for device %s\n", vdev->name); |
4899 | - return -EINVAL; |
4900 | + ret = -EINVAL; |
4901 | + goto put_reset; |
4902 | } |
4903 | |
4904 | ret = vfio_add_group_dev(dev, &vfio_platform_ops, vdev); |
4905 | - if (ret) { |
4906 | - vfio_iommu_group_put(group, dev); |
4907 | - return ret; |
4908 | - } |
4909 | + if (ret) |
4910 | + goto put_iommu; |
4911 | |
4912 | mutex_init(&vdev->igate); |
4913 | |
4914 | return 0; |
4915 | + |
4916 | +put_iommu: |
4917 | + vfio_iommu_group_put(group, dev); |
4918 | +put_reset: |
4919 | + vfio_platform_put_reset(vdev); |
4920 | + return ret; |
4921 | } |
4922 | EXPORT_SYMBOL_GPL(vfio_platform_probe_common); |
4923 | |
4924 | diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c |
4925 | index d639378e36ac..50eeb74ddc0a 100644 |
4926 | --- a/drivers/vfio/vfio_iommu_type1.c |
4927 | +++ b/drivers/vfio/vfio_iommu_type1.c |
4928 | @@ -83,6 +83,7 @@ struct vfio_dma { |
4929 | size_t size; /* Map size (bytes) */ |
4930 | int prot; /* IOMMU_READ/WRITE */ |
4931 | bool iommu_mapped; |
4932 | + bool lock_cap; /* capable(CAP_IPC_LOCK) */ |
4933 | struct task_struct *task; |
4934 | struct rb_root pfn_list; /* Ex-user pinned pfn list */ |
4935 | }; |
4936 | @@ -246,29 +247,25 @@ static int vfio_iova_put_vfio_pfn(struct vfio_dma *dma, struct vfio_pfn *vpfn) |
4937 | return ret; |
4938 | } |
4939 | |
4940 | -static int vfio_lock_acct(struct task_struct *task, long npage, bool *lock_cap) |
4941 | +static int vfio_lock_acct(struct vfio_dma *dma, long npage, bool async) |
4942 | { |
4943 | struct mm_struct *mm; |
4944 | - bool is_current; |
4945 | int ret; |
4946 | |
4947 | if (!npage) |
4948 | return 0; |
4949 | |
4950 | - is_current = (task->mm == current->mm); |
4951 | - |
4952 | - mm = is_current ? task->mm : get_task_mm(task); |
4953 | + mm = async ? get_task_mm(dma->task) : dma->task->mm; |
4954 | if (!mm) |
4955 | return -ESRCH; /* process exited */ |
4956 | |
4957 | ret = down_write_killable(&mm->mmap_sem); |
4958 | if (!ret) { |
4959 | if (npage > 0) { |
4960 | - if (lock_cap ? !*lock_cap : |
4961 | - !has_capability(task, CAP_IPC_LOCK)) { |
4962 | + if (!dma->lock_cap) { |
4963 | unsigned long limit; |
4964 | |
4965 | - limit = task_rlimit(task, |
4966 | + limit = task_rlimit(dma->task, |
4967 | RLIMIT_MEMLOCK) >> PAGE_SHIFT; |
4968 | |
4969 | if (mm->locked_vm + npage > limit) |
4970 | @@ -282,7 +279,7 @@ static int vfio_lock_acct(struct task_struct *task, long npage, bool *lock_cap) |
4971 | up_write(&mm->mmap_sem); |
4972 | } |
4973 | |
4974 | - if (!is_current) |
4975 | + if (async) |
4976 | mmput(mm); |
4977 | |
4978 | return ret; |
4979 | @@ -391,7 +388,7 @@ static int vaddr_get_pfn(struct mm_struct *mm, unsigned long vaddr, |
4980 | */ |
4981 | static long vfio_pin_pages_remote(struct vfio_dma *dma, unsigned long vaddr, |
4982 | long npage, unsigned long *pfn_base, |
4983 | - bool lock_cap, unsigned long limit) |
4984 | + unsigned long limit) |
4985 | { |
4986 | unsigned long pfn = 0; |
4987 | long ret, pinned = 0, lock_acct = 0; |
4988 | @@ -414,7 +411,7 @@ static long vfio_pin_pages_remote(struct vfio_dma *dma, unsigned long vaddr, |
4989 | * pages are already counted against the user. |
4990 | */ |
4991 | if (!rsvd && !vfio_find_vpfn(dma, iova)) { |
4992 | - if (!lock_cap && current->mm->locked_vm + 1 > limit) { |
4993 | + if (!dma->lock_cap && current->mm->locked_vm + 1 > limit) { |
4994 | put_pfn(*pfn_base, dma->prot); |
4995 | pr_warn("%s: RLIMIT_MEMLOCK (%ld) exceeded\n", __func__, |
4996 | limit << PAGE_SHIFT); |
4997 | @@ -440,7 +437,7 @@ static long vfio_pin_pages_remote(struct vfio_dma *dma, unsigned long vaddr, |
4998 | } |
4999 | |
5000 | if (!rsvd && !vfio_find_vpfn(dma, iova)) { |
5001 | - if (!lock_cap && |
5002 | + if (!dma->lock_cap && |
5003 | current->mm->locked_vm + lock_acct + 1 > limit) { |
5004 | put_pfn(pfn, dma->prot); |
5005 | pr_warn("%s: RLIMIT_MEMLOCK (%ld) exceeded\n", |
5006 | @@ -453,7 +450,7 @@ static long vfio_pin_pages_remote(struct vfio_dma *dma, unsigned long vaddr, |
5007 | } |
5008 | |
5009 | out: |
5010 | - ret = vfio_lock_acct(current, lock_acct, &lock_cap); |
5011 | + ret = vfio_lock_acct(dma, lock_acct, false); |
5012 | |
5013 | unpin_out: |
5014 | if (ret) { |
5015 | @@ -484,7 +481,7 @@ static long vfio_unpin_pages_remote(struct vfio_dma *dma, dma_addr_t iova, |
5016 | } |
5017 | |
5018 | if (do_accounting) |
5019 | - vfio_lock_acct(dma->task, locked - unlocked, NULL); |
5020 | + vfio_lock_acct(dma, locked - unlocked, true); |
5021 | |
5022 | return unlocked; |
5023 | } |
5024 | @@ -501,7 +498,7 @@ static int vfio_pin_page_external(struct vfio_dma *dma, unsigned long vaddr, |
5025 | |
5026 | ret = vaddr_get_pfn(mm, vaddr, dma->prot, pfn_base); |
5027 | if (!ret && do_accounting && !is_invalid_reserved_pfn(*pfn_base)) { |
5028 | - ret = vfio_lock_acct(dma->task, 1, NULL); |
5029 | + ret = vfio_lock_acct(dma, 1, true); |
5030 | if (ret) { |
5031 | put_pfn(*pfn_base, dma->prot); |
5032 | if (ret == -ENOMEM) |
5033 | @@ -528,7 +525,7 @@ static int vfio_unpin_page_external(struct vfio_dma *dma, dma_addr_t iova, |
5034 | unlocked = vfio_iova_put_vfio_pfn(dma, vpfn); |
5035 | |
5036 | if (do_accounting) |
5037 | - vfio_lock_acct(dma->task, -unlocked, NULL); |
5038 | + vfio_lock_acct(dma, -unlocked, true); |
5039 | |
5040 | return unlocked; |
5041 | } |
5042 | @@ -723,7 +720,7 @@ static long vfio_unmap_unpin(struct vfio_iommu *iommu, struct vfio_dma *dma, |
5043 | |
5044 | dma->iommu_mapped = false; |
5045 | if (do_accounting) { |
5046 | - vfio_lock_acct(dma->task, -unlocked, NULL); |
5047 | + vfio_lock_acct(dma, -unlocked, true); |
5048 | return 0; |
5049 | } |
5050 | return unlocked; |
5051 | @@ -935,14 +932,12 @@ static int vfio_pin_map_dma(struct vfio_iommu *iommu, struct vfio_dma *dma, |
5052 | size_t size = map_size; |
5053 | long npage; |
5054 | unsigned long pfn, limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; |
5055 | - bool lock_cap = capable(CAP_IPC_LOCK); |
5056 | int ret = 0; |
5057 | |
5058 | while (size) { |
5059 | /* Pin a contiguous chunk of memory */ |
5060 | npage = vfio_pin_pages_remote(dma, vaddr + dma->size, |
5061 | - size >> PAGE_SHIFT, &pfn, |
5062 | - lock_cap, limit); |
5063 | + size >> PAGE_SHIFT, &pfn, limit); |
5064 | if (npage <= 0) { |
5065 | WARN_ON(!npage); |
5066 | ret = (int)npage; |
5067 | @@ -1017,8 +1012,36 @@ static int vfio_dma_do_map(struct vfio_iommu *iommu, |
5068 | dma->iova = iova; |
5069 | dma->vaddr = vaddr; |
5070 | dma->prot = prot; |
5071 | - get_task_struct(current); |
5072 | - dma->task = current; |
5073 | + |
5074 | + /* |
5075 | + * We need to be able to both add to a task's locked memory and test |
5076 | + * against the locked memory limit and we need to be able to do both |
5077 | + * outside of this call path as pinning can be asynchronous via the |
5078 | + * external interfaces for mdev devices. RLIMIT_MEMLOCK requires a |
5079 | + * task_struct and VM locked pages requires an mm_struct, however |
5080 | + * holding an indefinite mm reference is not recommended, therefore we |
5081 | + * only hold a reference to a task. We could hold a reference to |
5082 | + * current, however QEMU uses this call path through vCPU threads, |
5083 | + * which can be killed resulting in a NULL mm and failure in the unmap |
5084 | + * path when called via a different thread. Avoid this problem by |
5085 | + * using the group_leader as threads within the same group require |
5086 | + * both CLONE_THREAD and CLONE_VM and will therefore use the same |
5087 | + * mm_struct. |
5088 | + * |
5089 | + * Previously we also used the task for testing CAP_IPC_LOCK at the |
5090 | + * time of pinning and accounting, however has_capability() makes use |
5091 | + * of real_cred, a copy-on-write field, so we can't guarantee that it |
5092 | + * matches group_leader, or in fact that it might not change by the |
5093 | + * time it's evaluated. If a process were to call MAP_DMA with |
5094 | + * CAP_IPC_LOCK but later drop it, it doesn't make sense that they |
5095 | + * possibly see different results for an iommu_mapped vfio_dma vs |
5096 | + * externally mapped. Therefore track CAP_IPC_LOCK in vfio_dma at the |
5097 | + * time of calling MAP_DMA. |
5098 | + */ |
5099 | + get_task_struct(current->group_leader); |
5100 | + dma->task = current->group_leader; |
5101 | + dma->lock_cap = capable(CAP_IPC_LOCK); |
5102 | + |
5103 | dma->pfn_list = RB_ROOT; |
5104 | |
5105 | /* Insert zero-sized and grow as we map chunks of it */ |
5106 | @@ -1053,7 +1076,6 @@ static int vfio_iommu_replay(struct vfio_iommu *iommu, |
5107 | struct vfio_domain *d; |
5108 | struct rb_node *n; |
5109 | unsigned long limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; |
5110 | - bool lock_cap = capable(CAP_IPC_LOCK); |
5111 | int ret; |
5112 | |
5113 | /* Arbitrarily pick the first domain in the list for lookups */ |
5114 | @@ -1100,8 +1122,7 @@ static int vfio_iommu_replay(struct vfio_iommu *iommu, |
5115 | |
5116 | npage = vfio_pin_pages_remote(dma, vaddr, |
5117 | n >> PAGE_SHIFT, |
5118 | - &pfn, lock_cap, |
5119 | - limit); |
5120 | + &pfn, limit); |
5121 | if (npage <= 0) { |
5122 | WARN_ON(!npage); |
5123 | ret = (int)npage; |
5124 | @@ -1378,7 +1399,7 @@ static void vfio_iommu_unmap_unpin_reaccount(struct vfio_iommu *iommu) |
5125 | if (!is_invalid_reserved_pfn(vpfn->pfn)) |
5126 | locked++; |
5127 | } |
5128 | - vfio_lock_acct(dma->task, locked - unlocked, NULL); |
5129 | + vfio_lock_acct(dma, locked - unlocked, true); |
5130 | } |
5131 | } |
5132 | |
5133 | diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c |
5134 | index 1c2289ddd555..0fa7d2bd0e48 100644 |
5135 | --- a/drivers/video/backlight/pwm_bl.c |
5136 | +++ b/drivers/video/backlight/pwm_bl.c |
5137 | @@ -301,14 +301,14 @@ static int pwm_backlight_probe(struct platform_device *pdev) |
5138 | |
5139 | /* |
5140 | * If the GPIO is not known to be already configured as output, that |
5141 | - * is, if gpiod_get_direction returns either GPIOF_DIR_IN or -EINVAL, |
5142 | - * change the direction to output and set the GPIO as active. |
5143 | + * is, if gpiod_get_direction returns either 1 or -EINVAL, change the |
5144 | + * direction to output and set the GPIO as active. |
5145 | * Do not force the GPIO to active when it was already output as it |
5146 | * could cause backlight flickering or we would enable the backlight too |
5147 | * early. Leave the decision of the initial backlight state for later. |
5148 | */ |
5149 | if (pb->enable_gpio && |
5150 | - gpiod_get_direction(pb->enable_gpio) != GPIOF_DIR_OUT) |
5151 | + gpiod_get_direction(pb->enable_gpio) != 0) |
5152 | gpiod_direction_output(pb->enable_gpio, 1); |
5153 | |
5154 | pb->power_supply = devm_regulator_get(&pdev->dev, "power"); |
5155 | diff --git a/drivers/watchdog/da9063_wdt.c b/drivers/watchdog/da9063_wdt.c |
5156 | index 2a20fc163ed0..4c62ad74aec0 100644 |
5157 | --- a/drivers/watchdog/da9063_wdt.c |
5158 | +++ b/drivers/watchdog/da9063_wdt.c |
5159 | @@ -102,10 +102,23 @@ static int da9063_wdt_set_timeout(struct watchdog_device *wdd, |
5160 | { |
5161 | struct da9063 *da9063 = watchdog_get_drvdata(wdd); |
5162 | unsigned int selector; |
5163 | - int ret; |
5164 | + int ret = 0; |
5165 | |
5166 | selector = da9063_wdt_timeout_to_sel(timeout); |
5167 | - ret = _da9063_wdt_set_timeout(da9063, selector); |
5168 | + |
5169 | + /* |
5170 | + * There are two cases when a set_timeout() will be called: |
5171 | + * 1. The watchdog is off and someone wants to set the timeout for the |
5172 | + * further use. |
5173 | + * 2. The watchdog is already running and a new timeout value should be |
5174 | + * set. |
5175 | + * |
5176 | + * The watchdog can't store a timeout value not equal zero without |
5177 | + * enabling the watchdog, so the timeout must be buffered by the driver. |
5178 | + */ |
5179 | + if (watchdog_active(wdd)) |
5180 | + ret = _da9063_wdt_set_timeout(da9063, selector); |
5181 | + |
5182 | if (ret) |
5183 | dev_err(da9063->dev, "Failed to set watchdog timeout (err = %d)\n", |
5184 | ret); |
5185 | diff --git a/fs/block_dev.c b/fs/block_dev.c |
5186 | index 789f55e851ae..3323eec5c164 100644 |
5187 | --- a/fs/block_dev.c |
5188 | +++ b/fs/block_dev.c |
5189 | @@ -231,7 +231,7 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter, |
5190 | |
5191 | ret = bio_iov_iter_get_pages(&bio, iter); |
5192 | if (unlikely(ret)) |
5193 | - return ret; |
5194 | + goto out; |
5195 | ret = bio.bi_iter.bi_size; |
5196 | |
5197 | if (iov_iter_rw(iter) == READ) { |
5198 | @@ -260,12 +260,13 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter, |
5199 | put_page(bvec->bv_page); |
5200 | } |
5201 | |
5202 | - if (vecs != inline_vecs) |
5203 | - kfree(vecs); |
5204 | - |
5205 | if (unlikely(bio.bi_status)) |
5206 | ret = blk_status_to_errno(bio.bi_status); |
5207 | |
5208 | +out: |
5209 | + if (vecs != inline_vecs) |
5210 | + kfree(vecs); |
5211 | + |
5212 | bio_uninit(&bio); |
5213 | |
5214 | return ret; |
5215 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c |
5216 | index f5b90dc137ec..28a58f40f3a4 100644 |
5217 | --- a/fs/btrfs/inode.c |
5218 | +++ b/fs/btrfs/inode.c |
5219 | @@ -3162,6 +3162,9 @@ out: |
5220 | /* once for the tree */ |
5221 | btrfs_put_ordered_extent(ordered_extent); |
5222 | |
5223 | + /* Try to release some metadata so we don't get an OOM but don't wait */ |
5224 | + btrfs_btree_balance_dirty_nodelay(fs_info); |
5225 | + |
5226 | return ret; |
5227 | } |
5228 | |
5229 | @@ -4737,7 +4740,10 @@ delete: |
5230 | extent_num_bytes, 0, |
5231 | btrfs_header_owner(leaf), |
5232 | ino, extent_offset); |
5233 | - BUG_ON(ret); |
5234 | + if (ret) { |
5235 | + btrfs_abort_transaction(trans, ret); |
5236 | + break; |
5237 | + } |
5238 | if (btrfs_should_throttle_delayed_refs(trans, fs_info)) |
5239 | btrfs_async_run_delayed_refs(fs_info, |
5240 | trans->delayed_ref_updates * 2, |
5241 | @@ -5496,13 +5502,18 @@ void btrfs_evict_inode(struct inode *inode) |
5242 | trans->block_rsv = rsv; |
5243 | |
5244 | ret = btrfs_truncate_inode_items(trans, root, inode, 0, 0); |
5245 | - if (ret != -ENOSPC && ret != -EAGAIN) |
5246 | + if (ret) { |
5247 | + trans->block_rsv = &fs_info->trans_block_rsv; |
5248 | + btrfs_end_transaction(trans); |
5249 | + btrfs_btree_balance_dirty(fs_info); |
5250 | + if (ret != -ENOSPC && ret != -EAGAIN) { |
5251 | + btrfs_orphan_del(NULL, BTRFS_I(inode)); |
5252 | + btrfs_free_block_rsv(fs_info, rsv); |
5253 | + goto no_delete; |
5254 | + } |
5255 | + } else { |
5256 | break; |
5257 | - |
5258 | - trans->block_rsv = &fs_info->trans_block_rsv; |
5259 | - btrfs_end_transaction(trans); |
5260 | - trans = NULL; |
5261 | - btrfs_btree_balance_dirty(fs_info); |
5262 | + } |
5263 | } |
5264 | |
5265 | btrfs_free_block_rsv(fs_info, rsv); |
5266 | @@ -5511,12 +5522,8 @@ void btrfs_evict_inode(struct inode *inode) |
5267 | * Errors here aren't a big deal, it just means we leave orphan items |
5268 | * in the tree. They will be cleaned up on the next mount. |
5269 | */ |
5270 | - if (ret == 0) { |
5271 | - trans->block_rsv = root->orphan_block_rsv; |
5272 | - btrfs_orphan_del(trans, BTRFS_I(inode)); |
5273 | - } else { |
5274 | - btrfs_orphan_del(NULL, BTRFS_I(inode)); |
5275 | - } |
5276 | + trans->block_rsv = root->orphan_block_rsv; |
5277 | + btrfs_orphan_del(trans, BTRFS_I(inode)); |
5278 | |
5279 | trans->block_rsv = &fs_info->trans_block_rsv; |
5280 | if (!(root == fs_info->tree_root || |
5281 | diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c |
5282 | index e172d4843eae..473ad5985aa3 100644 |
5283 | --- a/fs/btrfs/qgroup.c |
5284 | +++ b/fs/btrfs/qgroup.c |
5285 | @@ -2499,6 +2499,21 @@ out: |
5286 | spin_unlock(&fs_info->qgroup_lock); |
5287 | } |
5288 | |
5289 | +/* |
5290 | + * Check if the leaf is the last leaf. Which means all node pointers |
5291 | + * are at their last position. |
5292 | + */ |
5293 | +static bool is_last_leaf(struct btrfs_path *path) |
5294 | +{ |
5295 | + int i; |
5296 | + |
5297 | + for (i = 1; i < BTRFS_MAX_LEVEL && path->nodes[i]; i++) { |
5298 | + if (path->slots[i] != btrfs_header_nritems(path->nodes[i]) - 1) |
5299 | + return false; |
5300 | + } |
5301 | + return true; |
5302 | +} |
5303 | + |
5304 | /* |
5305 | * returns < 0 on error, 0 when more leafs are to be scanned. |
5306 | * returns 1 when done. |
5307 | @@ -2512,6 +2527,7 @@ qgroup_rescan_leaf(struct btrfs_fs_info *fs_info, struct btrfs_path *path, |
5308 | struct ulist *roots = NULL; |
5309 | struct seq_list tree_mod_seq_elem = SEQ_LIST_INIT(tree_mod_seq_elem); |
5310 | u64 num_bytes; |
5311 | + bool done; |
5312 | int slot; |
5313 | int ret; |
5314 | |
5315 | @@ -2540,6 +2556,7 @@ qgroup_rescan_leaf(struct btrfs_fs_info *fs_info, struct btrfs_path *path, |
5316 | mutex_unlock(&fs_info->qgroup_rescan_lock); |
5317 | return ret; |
5318 | } |
5319 | + done = is_last_leaf(path); |
5320 | |
5321 | btrfs_item_key_to_cpu(path->nodes[0], &found, |
5322 | btrfs_header_nritems(path->nodes[0]) - 1); |
5323 | @@ -2586,6 +2603,8 @@ out: |
5324 | } |
5325 | btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem); |
5326 | |
5327 | + if (done && !ret) |
5328 | + ret = 1; |
5329 | return ret; |
5330 | } |
5331 | |
5332 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c |
5333 | index bf4e22df7c97..e1b4a59485df 100644 |
5334 | --- a/fs/btrfs/tree-log.c |
5335 | +++ b/fs/btrfs/tree-log.c |
5336 | @@ -3041,8 +3041,11 @@ out_wake_log_root: |
5337 | mutex_unlock(&log_root_tree->log_mutex); |
5338 | |
5339 | /* |
5340 | - * The barrier before waitqueue_active is implied by mutex_unlock |
5341 | + * The barrier before waitqueue_active is needed so all the updates |
5342 | + * above are seen by the woken threads. It might not be necessary, but |
5343 | + * proving that seems to be hard. |
5344 | */ |
5345 | + smp_mb(); |
5346 | if (waitqueue_active(&log_root_tree->log_commit_wait[index2])) |
5347 | wake_up(&log_root_tree->log_commit_wait[index2]); |
5348 | out: |
5349 | @@ -3053,8 +3056,11 @@ out: |
5350 | mutex_unlock(&root->log_mutex); |
5351 | |
5352 | /* |
5353 | - * The barrier before waitqueue_active is implied by mutex_unlock |
5354 | + * The barrier before waitqueue_active is needed so all the updates |
5355 | + * above are seen by the woken threads. It might not be necessary, but |
5356 | + * proving that seems to be hard. |
5357 | */ |
5358 | + smp_mb(); |
5359 | if (waitqueue_active(&root->log_commit_wait[index1])) |
5360 | wake_up(&root->log_commit_wait[index1]); |
5361 | return ret; |
5362 | diff --git a/fs/ceph/super.c b/fs/ceph/super.c |
5363 | index 48ffe720bf09..b79b1211a2b5 100644 |
5364 | --- a/fs/ceph/super.c |
5365 | +++ b/fs/ceph/super.c |
5366 | @@ -254,7 +254,7 @@ static int parse_fsopt_token(char *c, void *private) |
5367 | case Opt_rasize: |
5368 | if (intval < 0) |
5369 | return -EINVAL; |
5370 | - fsopt->rasize = ALIGN(intval + PAGE_SIZE - 1, PAGE_SIZE); |
5371 | + fsopt->rasize = ALIGN(intval, PAGE_SIZE); |
5372 | break; |
5373 | case Opt_caps_wanted_delay_min: |
5374 | if (intval < 1) |
5375 | diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c |
5376 | index d262a93d9b31..daf2683f0655 100644 |
5377 | --- a/fs/crypto/crypto.c |
5378 | +++ b/fs/crypto/crypto.c |
5379 | @@ -446,8 +446,17 @@ fail: |
5380 | */ |
5381 | static int __init fscrypt_init(void) |
5382 | { |
5383 | + /* |
5384 | + * Use an unbound workqueue to allow bios to be decrypted in parallel |
5385 | + * even when they happen to complete on the same CPU. This sacrifices |
5386 | + * locality, but it's worthwhile since decryption is CPU-intensive. |
5387 | + * |
5388 | + * Also use a high-priority workqueue to prioritize decryption work, |
5389 | + * which blocks reads from completing, over regular application tasks. |
5390 | + */ |
5391 | fscrypt_read_workqueue = alloc_workqueue("fscrypt_read_queue", |
5392 | - WQ_HIGHPRI, 0); |
5393 | + WQ_UNBOUND | WQ_HIGHPRI, |
5394 | + num_online_cpus()); |
5395 | if (!fscrypt_read_workqueue) |
5396 | goto fail; |
5397 | |
5398 | diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c |
5399 | index 9c9eafd6bd76..70266a3355dc 100644 |
5400 | --- a/fs/ext4/balloc.c |
5401 | +++ b/fs/ext4/balloc.c |
5402 | @@ -379,6 +379,8 @@ static int ext4_validate_block_bitmap(struct super_block *sb, |
5403 | return -EFSCORRUPTED; |
5404 | |
5405 | ext4_lock_group(sb, block_group); |
5406 | + if (buffer_verified(bh)) |
5407 | + goto verified; |
5408 | if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group, |
5409 | desc, bh))) { |
5410 | ext4_unlock_group(sb, block_group); |
5411 | @@ -401,6 +403,7 @@ static int ext4_validate_block_bitmap(struct super_block *sb, |
5412 | return -EFSCORRUPTED; |
5413 | } |
5414 | set_buffer_verified(bh); |
5415 | +verified: |
5416 | ext4_unlock_group(sb, block_group); |
5417 | return 0; |
5418 | } |
5419 | diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c |
5420 | index 95341bc2b3b7..2f46564d3fca 100644 |
5421 | --- a/fs/ext4/ialloc.c |
5422 | +++ b/fs/ext4/ialloc.c |
5423 | @@ -91,6 +91,8 @@ static int ext4_validate_inode_bitmap(struct super_block *sb, |
5424 | return -EFSCORRUPTED; |
5425 | |
5426 | ext4_lock_group(sb, block_group); |
5427 | + if (buffer_verified(bh)) |
5428 | + goto verified; |
5429 | blk = ext4_inode_bitmap(sb, desc); |
5430 | if (!ext4_inode_bitmap_csum_verify(sb, block_group, desc, bh, |
5431 | EXT4_INODES_PER_GROUP(sb) / 8)) { |
5432 | @@ -108,6 +110,7 @@ static int ext4_validate_inode_bitmap(struct super_block *sb, |
5433 | return -EFSBADCRC; |
5434 | } |
5435 | set_buffer_verified(bh); |
5436 | +verified: |
5437 | ext4_unlock_group(sb, block_group); |
5438 | return 0; |
5439 | } |
5440 | @@ -1394,7 +1397,10 @@ int ext4_init_inode_table(struct super_block *sb, ext4_group_t group, |
5441 | ext4_itable_unused_count(sb, gdp)), |
5442 | sbi->s_inodes_per_block); |
5443 | |
5444 | - if ((used_blks < 0) || (used_blks > sbi->s_itb_per_group)) { |
5445 | + if ((used_blks < 0) || (used_blks > sbi->s_itb_per_group) || |
5446 | + ((group == 0) && ((EXT4_INODES_PER_GROUP(sb) - |
5447 | + ext4_itable_unused_count(sb, gdp)) < |
5448 | + EXT4_FIRST_INO(sb)))) { |
5449 | ext4_error(sb, "Something is wrong with group %u: " |
5450 | "used itable blocks: %d; " |
5451 | "itable unused count: %u", |
5452 | diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c |
5453 | index 7d498f4a3f90..b549cfd2d7d3 100644 |
5454 | --- a/fs/ext4/inline.c |
5455 | +++ b/fs/ext4/inline.c |
5456 | @@ -688,6 +688,10 @@ int ext4_try_to_write_inline_data(struct address_space *mapping, |
5457 | goto convert; |
5458 | } |
5459 | |
5460 | + ret = ext4_journal_get_write_access(handle, iloc.bh); |
5461 | + if (ret) |
5462 | + goto out; |
5463 | + |
5464 | flags |= AOP_FLAG_NOFS; |
5465 | |
5466 | page = grab_cache_page_write_begin(mapping, 0, flags); |
5467 | @@ -716,7 +720,7 @@ int ext4_try_to_write_inline_data(struct address_space *mapping, |
5468 | out_up_read: |
5469 | up_read(&EXT4_I(inode)->xattr_sem); |
5470 | out: |
5471 | - if (handle) |
5472 | + if (handle && (ret != 1)) |
5473 | ext4_journal_stop(handle); |
5474 | brelse(iloc.bh); |
5475 | return ret; |
5476 | @@ -758,6 +762,7 @@ int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len, |
5477 | |
5478 | ext4_write_unlock_xattr(inode, &no_expand); |
5479 | brelse(iloc.bh); |
5480 | + mark_inode_dirty(inode); |
5481 | out: |
5482 | return copied; |
5483 | } |
5484 | @@ -904,7 +909,6 @@ retry_journal: |
5485 | goto out; |
5486 | } |
5487 | |
5488 | - |
5489 | page = grab_cache_page_write_begin(mapping, 0, flags); |
5490 | if (!page) { |
5491 | ret = -ENOMEM; |
5492 | @@ -922,6 +926,9 @@ retry_journal: |
5493 | if (ret < 0) |
5494 | goto out_release_page; |
5495 | } |
5496 | + ret = ext4_journal_get_write_access(handle, iloc.bh); |
5497 | + if (ret) |
5498 | + goto out_release_page; |
5499 | |
5500 | up_read(&EXT4_I(inode)->xattr_sem); |
5501 | *pagep = page; |
5502 | @@ -942,7 +949,6 @@ int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos, |
5503 | unsigned len, unsigned copied, |
5504 | struct page *page) |
5505 | { |
5506 | - int i_size_changed = 0; |
5507 | int ret; |
5508 | |
5509 | ret = ext4_write_inline_data_end(inode, pos, len, copied, page); |
5510 | @@ -960,10 +966,8 @@ int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos, |
5511 | * But it's important to update i_size while still holding page lock: |
5512 | * page writeout could otherwise come in and zero beyond i_size. |
5513 | */ |
5514 | - if (pos+copied > inode->i_size) { |
5515 | + if (pos+copied > inode->i_size) |
5516 | i_size_write(inode, pos+copied); |
5517 | - i_size_changed = 1; |
5518 | - } |
5519 | unlock_page(page); |
5520 | put_page(page); |
5521 | |
5522 | @@ -973,8 +977,7 @@ int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos, |
5523 | * ordering of page lock and transaction start for journaling |
5524 | * filesystems. |
5525 | */ |
5526 | - if (i_size_changed) |
5527 | - mark_inode_dirty(inode); |
5528 | + mark_inode_dirty(inode); |
5529 | |
5530 | return copied; |
5531 | } |
5532 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
5533 | index c2efe4d2ad87..f9baa59de0e2 100644 |
5534 | --- a/fs/ext4/inode.c |
5535 | +++ b/fs/ext4/inode.c |
5536 | @@ -1388,9 +1388,10 @@ static int ext4_write_end(struct file *file, |
5537 | loff_t old_size = inode->i_size; |
5538 | int ret = 0, ret2; |
5539 | int i_size_changed = 0; |
5540 | + int inline_data = ext4_has_inline_data(inode); |
5541 | |
5542 | trace_ext4_write_end(inode, pos, len, copied); |
5543 | - if (ext4_has_inline_data(inode)) { |
5544 | + if (inline_data) { |
5545 | ret = ext4_write_inline_data_end(inode, pos, len, |
5546 | copied, page); |
5547 | if (ret < 0) { |
5548 | @@ -1418,7 +1419,7 @@ static int ext4_write_end(struct file *file, |
5549 | * ordering of page lock and transaction start for journaling |
5550 | * filesystems. |
5551 | */ |
5552 | - if (i_size_changed) |
5553 | + if (i_size_changed || inline_data) |
5554 | ext4_mark_inode_dirty(handle, inode); |
5555 | |
5556 | if (pos + len > inode->i_size && ext4_can_truncate(inode)) |
5557 | @@ -1492,6 +1493,7 @@ static int ext4_journalled_write_end(struct file *file, |
5558 | int partial = 0; |
5559 | unsigned from, to; |
5560 | int size_changed = 0; |
5561 | + int inline_data = ext4_has_inline_data(inode); |
5562 | |
5563 | trace_ext4_journalled_write_end(inode, pos, len, copied); |
5564 | from = pos & (PAGE_SIZE - 1); |
5565 | @@ -1499,7 +1501,7 @@ static int ext4_journalled_write_end(struct file *file, |
5566 | |
5567 | BUG_ON(!ext4_handle_valid(handle)); |
5568 | |
5569 | - if (ext4_has_inline_data(inode)) { |
5570 | + if (inline_data) { |
5571 | ret = ext4_write_inline_data_end(inode, pos, len, |
5572 | copied, page); |
5573 | if (ret < 0) { |
5574 | @@ -1530,7 +1532,7 @@ static int ext4_journalled_write_end(struct file *file, |
5575 | if (old_size < pos) |
5576 | pagecache_isize_extended(inode, old_size, pos); |
5577 | |
5578 | - if (size_changed) { |
5579 | + if (size_changed || inline_data) { |
5580 | ret2 = ext4_mark_inode_dirty(handle, inode); |
5581 | if (!ret) |
5582 | ret = ret2; |
5583 | @@ -2027,11 +2029,7 @@ static int __ext4_journalled_writepage(struct page *page, |
5584 | } |
5585 | |
5586 | if (inline_data) { |
5587 | - BUFFER_TRACE(inode_bh, "get write access"); |
5588 | - ret = ext4_journal_get_write_access(handle, inode_bh); |
5589 | - |
5590 | - err = ext4_handle_dirty_metadata(handle, inode, inode_bh); |
5591 | - |
5592 | + ret = ext4_mark_inode_dirty(handle, inode); |
5593 | } else { |
5594 | ret = ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, |
5595 | do_journal_get_write_access); |
5596 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
5597 | index fc32a67a7a19..6b0c1ea95196 100644 |
5598 | --- a/fs/ext4/super.c |
5599 | +++ b/fs/ext4/super.c |
5600 | @@ -3103,14 +3103,8 @@ static ext4_group_t ext4_has_uninit_itable(struct super_block *sb) |
5601 | if (!gdp) |
5602 | continue; |
5603 | |
5604 | - if (gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_ZEROED)) |
5605 | - continue; |
5606 | - if (group != 0) |
5607 | + if (!(gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_ZEROED))) |
5608 | break; |
5609 | - ext4_error(sb, "Inode table for bg 0 marked as " |
5610 | - "needing zeroing"); |
5611 | - if (sb_rdonly(sb)) |
5612 | - return ngroups; |
5613 | } |
5614 | |
5615 | return group; |
5616 | diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c |
5617 | index 36b535207c88..85142e5df88b 100644 |
5618 | --- a/fs/f2fs/data.c |
5619 | +++ b/fs/f2fs/data.c |
5620 | @@ -1601,7 +1601,13 @@ out: |
5621 | |
5622 | redirty_out: |
5623 | redirty_page_for_writepage(wbc, page); |
5624 | - if (!err) |
5625 | + /* |
5626 | + * pageout() in MM traslates EAGAIN, so calls handle_write_error() |
5627 | + * -> mapping_set_error() -> set_bit(AS_EIO, ...). |
5628 | + * file_write_and_wait_range() will see EIO error, which is critical |
5629 | + * to return value of fsync() followed by atomic_write failure to user. |
5630 | + */ |
5631 | + if (!err || wbc->for_reclaim) |
5632 | return AOP_WRITEPAGE_ACTIVATE; |
5633 | unlock_page(page); |
5634 | return err; |
5635 | diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c |
5636 | index 72c6a9e9a9b4..87e654c53c31 100644 |
5637 | --- a/fs/f2fs/file.c |
5638 | +++ b/fs/f2fs/file.c |
5639 | @@ -1630,6 +1630,8 @@ static int f2fs_ioc_start_atomic_write(struct file *filp) |
5640 | |
5641 | inode_lock(inode); |
5642 | |
5643 | + down_write(&F2FS_I(inode)->dio_rwsem[WRITE]); |
5644 | + |
5645 | if (f2fs_is_atomic_file(inode)) |
5646 | goto out; |
5647 | |
5648 | @@ -1659,6 +1661,7 @@ inc_stat: |
5649 | stat_inc_atomic_write(inode); |
5650 | stat_update_max_atomic_write(inode); |
5651 | out: |
5652 | + up_write(&F2FS_I(inode)->dio_rwsem[WRITE]); |
5653 | inode_unlock(inode); |
5654 | mnt_drop_write_file(filp); |
5655 | return ret; |
5656 | @@ -1808,9 +1811,11 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg) |
5657 | if (get_user(in, (__u32 __user *)arg)) |
5658 | return -EFAULT; |
5659 | |
5660 | - ret = mnt_want_write_file(filp); |
5661 | - if (ret) |
5662 | - return ret; |
5663 | + if (in != F2FS_GOING_DOWN_FULLSYNC) { |
5664 | + ret = mnt_want_write_file(filp); |
5665 | + if (ret) |
5666 | + return ret; |
5667 | + } |
5668 | |
5669 | switch (in) { |
5670 | case F2FS_GOING_DOWN_FULLSYNC: |
5671 | @@ -1838,7 +1843,8 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg) |
5672 | } |
5673 | f2fs_update_time(sbi, REQ_TIME); |
5674 | out: |
5675 | - mnt_drop_write_file(filp); |
5676 | + if (in != F2FS_GOING_DOWN_FULLSYNC) |
5677 | + mnt_drop_write_file(filp); |
5678 | return ret; |
5679 | } |
5680 | |
5681 | @@ -2490,7 +2496,9 @@ static int f2fs_ioc_setproject(struct file *filp, __u32 projid) |
5682 | } |
5683 | f2fs_put_page(ipage, 1); |
5684 | |
5685 | - dquot_initialize(inode); |
5686 | + err = dquot_initialize(inode); |
5687 | + if (err) |
5688 | + goto out_unlock; |
5689 | |
5690 | transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid)); |
5691 | if (!IS_ERR(transfer_to[PRJQUOTA])) { |
5692 | diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c |
5693 | index e5673a9b2619..f2f897cd23c9 100644 |
5694 | --- a/fs/f2fs/gc.c |
5695 | +++ b/fs/f2fs/gc.c |
5696 | @@ -768,9 +768,14 @@ retry: |
5697 | set_cold_data(page); |
5698 | |
5699 | err = do_write_data_page(&fio); |
5700 | - if (err == -ENOMEM && is_dirty) { |
5701 | - congestion_wait(BLK_RW_ASYNC, HZ/50); |
5702 | - goto retry; |
5703 | + if (err) { |
5704 | + clear_cold_data(page); |
5705 | + if (err == -ENOMEM) { |
5706 | + congestion_wait(BLK_RW_ASYNC, HZ/50); |
5707 | + goto retry; |
5708 | + } |
5709 | + if (is_dirty) |
5710 | + set_page_dirty(page); |
5711 | } |
5712 | } |
5713 | out: |
5714 | diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c |
5715 | index 271516db8939..7c05bd4222b2 100644 |
5716 | --- a/fs/f2fs/segment.c |
5717 | +++ b/fs/f2fs/segment.c |
5718 | @@ -225,6 +225,8 @@ static int __revoke_inmem_pages(struct inode *inode, |
5719 | |
5720 | lock_page(page); |
5721 | |
5722 | + f2fs_wait_on_page_writeback(page, DATA, true); |
5723 | + |
5724 | if (recover) { |
5725 | struct dnode_of_data dn; |
5726 | struct node_info ni; |
5727 | @@ -435,6 +437,9 @@ void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need) |
5728 | |
5729 | void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi) |
5730 | { |
5731 | + if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) |
5732 | + return; |
5733 | + |
5734 | /* try to shrink extent cache when there is no enough memory */ |
5735 | if (!available_free_memory(sbi, EXTENT_CACHE)) |
5736 | f2fs_shrink_extent_tree(sbi, EXTENT_CACHE_SHRINK_NUMBER); |
5737 | diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c |
5738 | index 933c3d529e65..400c00058bad 100644 |
5739 | --- a/fs/f2fs/super.c |
5740 | +++ b/fs/f2fs/super.c |
5741 | @@ -2663,6 +2663,12 @@ static int __init init_f2fs_fs(void) |
5742 | { |
5743 | int err; |
5744 | |
5745 | + if (PAGE_SIZE != F2FS_BLKSIZE) { |
5746 | + printk("F2FS not supported on PAGE_SIZE(%lu) != %d\n", |
5747 | + PAGE_SIZE, F2FS_BLKSIZE); |
5748 | + return -EINVAL; |
5749 | + } |
5750 | + |
5751 | f2fs_build_trace_ios(); |
5752 | |
5753 | err = init_inodecache(); |
5754 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
5755 | index 928bbc397818..43fbf4495090 100644 |
5756 | --- a/fs/nfs/nfs4proc.c |
5757 | +++ b/fs/nfs/nfs4proc.c |
5758 | @@ -745,6 +745,13 @@ static int nfs41_sequence_process(struct rpc_task *task, |
5759 | slot->slot_nr, |
5760 | slot->seq_nr); |
5761 | goto out_retry; |
5762 | + case -NFS4ERR_RETRY_UNCACHED_REP: |
5763 | + case -NFS4ERR_SEQ_FALSE_RETRY: |
5764 | + /* |
5765 | + * The server thinks we tried to replay a request. |
5766 | + * Retry the call after bumping the sequence ID. |
5767 | + */ |
5768 | + goto retry_new_seq; |
5769 | case -NFS4ERR_BADSLOT: |
5770 | /* |
5771 | * The slot id we used was probably retired. Try again |
5772 | @@ -769,10 +776,6 @@ static int nfs41_sequence_process(struct rpc_task *task, |
5773 | goto retry_nowait; |
5774 | } |
5775 | goto session_recover; |
5776 | - case -NFS4ERR_SEQ_FALSE_RETRY: |
5777 | - if (interrupted) |
5778 | - goto retry_new_seq; |
5779 | - goto session_recover; |
5780 | default: |
5781 | /* Just update the slot sequence no. */ |
5782 | slot->seq_done = 1; |
5783 | @@ -2692,7 +2695,7 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, |
5784 | if (ret != 0) |
5785 | goto out; |
5786 | |
5787 | - state = nfs4_opendata_to_nfs4_state(opendata); |
5788 | + state = _nfs4_opendata_to_nfs4_state(opendata); |
5789 | ret = PTR_ERR(state); |
5790 | if (IS_ERR(state)) |
5791 | goto out; |
5792 | @@ -2728,6 +2731,7 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, |
5793 | nfs4_schedule_stateid_recovery(server, state); |
5794 | } |
5795 | out: |
5796 | + nfs4_sequence_free_slot(&opendata->o_res.seq_res); |
5797 | return ret; |
5798 | } |
5799 | |
5800 | diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c |
5801 | index 7b34534210ce..96867fb159bf 100644 |
5802 | --- a/fs/nfs/pnfs.c |
5803 | +++ b/fs/nfs/pnfs.c |
5804 | @@ -1126,7 +1126,7 @@ _pnfs_return_layout(struct inode *ino) |
5805 | LIST_HEAD(tmp_list); |
5806 | nfs4_stateid stateid; |
5807 | int status = 0; |
5808 | - bool send; |
5809 | + bool send, valid_layout; |
5810 | |
5811 | dprintk("NFS: %s for inode %lu\n", __func__, ino->i_ino); |
5812 | |
5813 | @@ -1147,6 +1147,7 @@ _pnfs_return_layout(struct inode *ino) |
5814 | goto out_put_layout_hdr; |
5815 | spin_lock(&ino->i_lock); |
5816 | } |
5817 | + valid_layout = pnfs_layout_is_valid(lo); |
5818 | pnfs_clear_layoutcommit(ino, &tmp_list); |
5819 | pnfs_mark_matching_lsegs_invalid(lo, &tmp_list, NULL, 0); |
5820 | |
5821 | @@ -1160,7 +1161,8 @@ _pnfs_return_layout(struct inode *ino) |
5822 | } |
5823 | |
5824 | /* Don't send a LAYOUTRETURN if list was initially empty */ |
5825 | - if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags)) { |
5826 | + if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags) || |
5827 | + !valid_layout) { |
5828 | spin_unlock(&ino->i_lock); |
5829 | dprintk("NFS: %s no layout segments to return\n", __func__); |
5830 | goto out_put_layout_hdr; |
5831 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
5832 | index f6588cc6816c..c1e923334012 100644 |
5833 | --- a/fs/nfsd/nfs4xdr.c |
5834 | +++ b/fs/nfsd/nfs4xdr.c |
5835 | @@ -1586,6 +1586,8 @@ nfsd4_decode_getdeviceinfo(struct nfsd4_compoundargs *argp, |
5836 | gdev->gd_maxcount = be32_to_cpup(p++); |
5837 | num = be32_to_cpup(p++); |
5838 | if (num) { |
5839 | + if (num > 1000) |
5840 | + goto xdr_error; |
5841 | READ_BUF(4 * num); |
5842 | gdev->gd_notify_types = be32_to_cpup(p++); |
5843 | for (i = 1; i < num; i++) { |
5844 | diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c |
5845 | index b8f8d666e8d4..ba20393d60ef 100644 |
5846 | --- a/fs/overlayfs/super.c |
5847 | +++ b/fs/overlayfs/super.c |
5848 | @@ -232,6 +232,7 @@ static void ovl_put_super(struct super_block *sb) |
5849 | kfree(ufs); |
5850 | } |
5851 | |
5852 | +/* Sync real dirty inodes in upper filesystem (if it exists) */ |
5853 | static int ovl_sync_fs(struct super_block *sb, int wait) |
5854 | { |
5855 | struct ovl_fs *ufs = sb->s_fs_info; |
5856 | @@ -240,14 +241,24 @@ static int ovl_sync_fs(struct super_block *sb, int wait) |
5857 | |
5858 | if (!ufs->upper_mnt) |
5859 | return 0; |
5860 | - upper_sb = ufs->upper_mnt->mnt_sb; |
5861 | - if (!upper_sb->s_op->sync_fs) |
5862 | + |
5863 | + /* |
5864 | + * If this is a sync(2) call or an emergency sync, all the super blocks |
5865 | + * will be iterated, including upper_sb, so no need to do anything. |
5866 | + * |
5867 | + * If this is a syncfs(2) call, then we do need to call |
5868 | + * sync_filesystem() on upper_sb, but enough if we do it when being |
5869 | + * called with wait == 1. |
5870 | + */ |
5871 | + if (!wait) |
5872 | return 0; |
5873 | |
5874 | - /* real inodes have already been synced by sync_filesystem(ovl_sb) */ |
5875 | + upper_sb = ufs->upper_mnt->mnt_sb; |
5876 | + |
5877 | down_read(&upper_sb->s_umount); |
5878 | - ret = upper_sb->s_op->sync_fs(upper_sb, wait); |
5879 | + ret = sync_filesystem(upper_sb); |
5880 | up_read(&upper_sb->s_umount); |
5881 | + |
5882 | return ret; |
5883 | } |
5884 | |
5885 | diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c |
5886 | index 6f337fff38c4..519522d39bde 100644 |
5887 | --- a/fs/proc/task_mmu.c |
5888 | +++ b/fs/proc/task_mmu.c |
5889 | @@ -1275,8 +1275,9 @@ static pagemap_entry_t pte_to_pagemap_entry(struct pagemapread *pm, |
5890 | if (pte_swp_soft_dirty(pte)) |
5891 | flags |= PM_SOFT_DIRTY; |
5892 | entry = pte_to_swp_entry(pte); |
5893 | - frame = swp_type(entry) | |
5894 | - (swp_offset(entry) << MAX_SWAPFILES_SHIFT); |
5895 | + if (pm->show_pfn) |
5896 | + frame = swp_type(entry) | |
5897 | + (swp_offset(entry) << MAX_SWAPFILES_SHIFT); |
5898 | flags |= PM_SWAP; |
5899 | if (is_migration_entry(entry)) |
5900 | page = migration_entry_to_page(entry); |
5901 | @@ -1327,11 +1328,14 @@ static int pagemap_pmd_range(pmd_t *pmdp, unsigned long addr, unsigned long end, |
5902 | #ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION |
5903 | else if (is_swap_pmd(pmd)) { |
5904 | swp_entry_t entry = pmd_to_swp_entry(pmd); |
5905 | - unsigned long offset = swp_offset(entry); |
5906 | + unsigned long offset; |
5907 | |
5908 | - offset += (addr & ~PMD_MASK) >> PAGE_SHIFT; |
5909 | - frame = swp_type(entry) | |
5910 | - (offset << MAX_SWAPFILES_SHIFT); |
5911 | + if (pm->show_pfn) { |
5912 | + offset = swp_offset(entry) + |
5913 | + ((addr & ~PMD_MASK) >> PAGE_SHIFT); |
5914 | + frame = swp_type(entry) | |
5915 | + (offset << MAX_SWAPFILES_SHIFT); |
5916 | + } |
5917 | flags |= PM_SWAP; |
5918 | if (pmd_swp_soft_dirty(pmd)) |
5919 | flags |= PM_SOFT_DIRTY; |
5920 | @@ -1349,10 +1353,12 @@ static int pagemap_pmd_range(pmd_t *pmdp, unsigned long addr, unsigned long end, |
5921 | err = add_to_pagemap(addr, &pme, pm); |
5922 | if (err) |
5923 | break; |
5924 | - if (pm->show_pfn && (flags & PM_PRESENT)) |
5925 | - frame++; |
5926 | - else if (flags & PM_SWAP) |
5927 | - frame += (1 << MAX_SWAPFILES_SHIFT); |
5928 | + if (pm->show_pfn) { |
5929 | + if (flags & PM_PRESENT) |
5930 | + frame++; |
5931 | + else if (flags & PM_SWAP) |
5932 | + frame += (1 << MAX_SWAPFILES_SHIFT); |
5933 | + } |
5934 | } |
5935 | spin_unlock(ptl); |
5936 | return err; |
5937 | diff --git a/fs/squashfs/cache.c b/fs/squashfs/cache.c |
5938 | index 23813c078cc9..0839efa720b3 100644 |
5939 | --- a/fs/squashfs/cache.c |
5940 | +++ b/fs/squashfs/cache.c |
5941 | @@ -350,6 +350,9 @@ int squashfs_read_metadata(struct super_block *sb, void *buffer, |
5942 | |
5943 | TRACE("Entered squashfs_read_metadata [%llx:%x]\n", *block, *offset); |
5944 | |
5945 | + if (unlikely(length < 0)) |
5946 | + return -EIO; |
5947 | + |
5948 | while (length) { |
5949 | entry = squashfs_cache_get(sb, msblk->block_cache, *block, 0); |
5950 | if (entry->error) { |
5951 | diff --git a/fs/squashfs/file.c b/fs/squashfs/file.c |
5952 | index 13d80947bf9e..fcff2e0487fe 100644 |
5953 | --- a/fs/squashfs/file.c |
5954 | +++ b/fs/squashfs/file.c |
5955 | @@ -194,7 +194,11 @@ static long long read_indexes(struct super_block *sb, int n, |
5956 | } |
5957 | |
5958 | for (i = 0; i < blocks; i++) { |
5959 | - int size = le32_to_cpu(blist[i]); |
5960 | + int size = squashfs_block_size(blist[i]); |
5961 | + if (size < 0) { |
5962 | + err = size; |
5963 | + goto failure; |
5964 | + } |
5965 | block += SQUASHFS_COMPRESSED_SIZE_BLOCK(size); |
5966 | } |
5967 | n -= blocks; |
5968 | @@ -367,7 +371,7 @@ static int read_blocklist(struct inode *inode, int index, u64 *block) |
5969 | sizeof(size)); |
5970 | if (res < 0) |
5971 | return res; |
5972 | - return le32_to_cpu(size); |
5973 | + return squashfs_block_size(size); |
5974 | } |
5975 | |
5976 | /* Copy data into page cache */ |
5977 | diff --git a/fs/squashfs/fragment.c b/fs/squashfs/fragment.c |
5978 | index 0ed6edbc5c71..86ad9a4b8c36 100644 |
5979 | --- a/fs/squashfs/fragment.c |
5980 | +++ b/fs/squashfs/fragment.c |
5981 | @@ -61,9 +61,7 @@ int squashfs_frag_lookup(struct super_block *sb, unsigned int fragment, |
5982 | return size; |
5983 | |
5984 | *fragment_block = le64_to_cpu(fragment_entry.start_block); |
5985 | - size = le32_to_cpu(fragment_entry.size); |
5986 | - |
5987 | - return size; |
5988 | + return squashfs_block_size(fragment_entry.size); |
5989 | } |
5990 | |
5991 | |
5992 | diff --git a/fs/squashfs/squashfs_fs.h b/fs/squashfs/squashfs_fs.h |
5993 | index 24d12fd14177..4e6853f084d0 100644 |
5994 | --- a/fs/squashfs/squashfs_fs.h |
5995 | +++ b/fs/squashfs/squashfs_fs.h |
5996 | @@ -129,6 +129,12 @@ |
5997 | |
5998 | #define SQUASHFS_COMPRESSED_BLOCK(B) (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK)) |
5999 | |
6000 | +static inline int squashfs_block_size(__le32 raw) |
6001 | +{ |
6002 | + u32 size = le32_to_cpu(raw); |
6003 | + return (size >> 25) ? -EIO : size; |
6004 | +} |
6005 | + |
6006 | /* |
6007 | * Inode number ops. Inodes consist of a compressed block number, and an |
6008 | * uncompressed offset within that block |
6009 | diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h |
6010 | index b17476a6909c..8fd7cb5297ab 100644 |
6011 | --- a/include/drm/drm_dp_helper.h |
6012 | +++ b/include/drm/drm_dp_helper.h |
6013 | @@ -453,6 +453,7 @@ |
6014 | # define DP_PSR_FRAME_CAPTURE (1 << 3) |
6015 | # define DP_PSR_SELECTIVE_UPDATE (1 << 4) |
6016 | # define DP_PSR_IRQ_HPD_WITH_CRC_ERRORS (1 << 5) |
6017 | +# define DP_PSR_ENABLE_PSR2 (1 << 6) /* eDP 1.4a */ |
6018 | |
6019 | #define DP_ADAPTER_CTRL 0x1a0 |
6020 | # define DP_ADAPTER_CTRL_FORCE_LOAD_SENSE (1 << 0) |
6021 | diff --git a/include/linux/delayacct.h b/include/linux/delayacct.h |
6022 | index 5e335b6203f4..31c865d1842e 100644 |
6023 | --- a/include/linux/delayacct.h |
6024 | +++ b/include/linux/delayacct.h |
6025 | @@ -29,7 +29,7 @@ |
6026 | |
6027 | #ifdef CONFIG_TASK_DELAY_ACCT |
6028 | struct task_delay_info { |
6029 | - spinlock_t lock; |
6030 | + raw_spinlock_t lock; |
6031 | unsigned int flags; /* Private per-task flags */ |
6032 | |
6033 | /* For each stat XXX, add following, aligned appropriately |
6034 | @@ -124,7 +124,7 @@ static inline void delayacct_blkio_start(void) |
6035 | |
6036 | static inline void delayacct_blkio_end(struct task_struct *p) |
6037 | { |
6038 | - if (current->delays) |
6039 | + if (p->delays) |
6040 | __delayacct_blkio_end(p); |
6041 | delayacct_clear_flag(DELAYACCT_PF_BLKIO); |
6042 | } |
6043 | diff --git a/include/linux/dma-iommu.h b/include/linux/dma-iommu.h |
6044 | index 92f20832fd28..e8ca5e654277 100644 |
6045 | --- a/include/linux/dma-iommu.h |
6046 | +++ b/include/linux/dma-iommu.h |
6047 | @@ -17,6 +17,7 @@ |
6048 | #define __DMA_IOMMU_H |
6049 | |
6050 | #ifdef __KERNEL__ |
6051 | +#include <linux/types.h> |
6052 | #include <asm/errno.h> |
6053 | |
6054 | #ifdef CONFIG_IOMMU_DMA |
6055 | diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h |
6056 | index cdd66a5fbd5e..0a7abe8a407f 100644 |
6057 | --- a/include/linux/mmc/sdio_ids.h |
6058 | +++ b/include/linux/mmc/sdio_ids.h |
6059 | @@ -35,6 +35,7 @@ |
6060 | #define SDIO_DEVICE_ID_BROADCOM_4335_4339 0x4335 |
6061 | #define SDIO_DEVICE_ID_BROADCOM_4339 0x4339 |
6062 | #define SDIO_DEVICE_ID_BROADCOM_43362 0xa962 |
6063 | +#define SDIO_DEVICE_ID_BROADCOM_43364 0xa9a4 |
6064 | #define SDIO_DEVICE_ID_BROADCOM_43430 0xa9a6 |
6065 | #define SDIO_DEVICE_ID_BROADCOM_4345 0x4345 |
6066 | #define SDIO_DEVICE_ID_BROADCOM_43455 0xa9bf |
6067 | diff --git a/include/linux/netfilter/ipset/ip_set_timeout.h b/include/linux/netfilter/ipset/ip_set_timeout.h |
6068 | index bfb3531fd88a..7ad8ddf9ca8a 100644 |
6069 | --- a/include/linux/netfilter/ipset/ip_set_timeout.h |
6070 | +++ b/include/linux/netfilter/ipset/ip_set_timeout.h |
6071 | @@ -65,8 +65,14 @@ ip_set_timeout_set(unsigned long *timeout, u32 value) |
6072 | static inline u32 |
6073 | ip_set_timeout_get(const unsigned long *timeout) |
6074 | { |
6075 | - return *timeout == IPSET_ELEM_PERMANENT ? 0 : |
6076 | - jiffies_to_msecs(*timeout - jiffies)/MSEC_PER_SEC; |
6077 | + u32 t; |
6078 | + |
6079 | + if (*timeout == IPSET_ELEM_PERMANENT) |
6080 | + return 0; |
6081 | + |
6082 | + t = jiffies_to_msecs(*timeout - jiffies)/MSEC_PER_SEC; |
6083 | + /* Zero value in userspace means no timeout */ |
6084 | + return t == 0 ? 1 : t; |
6085 | } |
6086 | |
6087 | #endif /* __KERNEL__ */ |
6088 | diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h |
6089 | index df176d7c2b87..25602afd4844 100644 |
6090 | --- a/include/linux/regulator/consumer.h |
6091 | +++ b/include/linux/regulator/consumer.h |
6092 | @@ -80,6 +80,7 @@ struct regmap; |
6093 | * These modes can be OR'ed together to make up a mask of valid register modes. |
6094 | */ |
6095 | |
6096 | +#define REGULATOR_MODE_INVALID 0x0 |
6097 | #define REGULATOR_MODE_FAST 0x1 |
6098 | #define REGULATOR_MODE_NORMAL 0x2 |
6099 | #define REGULATOR_MODE_IDLE 0x4 |
6100 | diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h |
6101 | index 74fc82d22310..868b60a79c0b 100644 |
6102 | --- a/include/linux/serial_core.h |
6103 | +++ b/include/linux/serial_core.h |
6104 | @@ -348,7 +348,8 @@ struct earlycon_device { |
6105 | }; |
6106 | |
6107 | struct earlycon_id { |
6108 | - char name[16]; |
6109 | + char name[15]; |
6110 | + char name_term; /* In case compiler didn't '\0' term name */ |
6111 | char compatible[128]; |
6112 | int (*setup)(struct earlycon_device *, const char *options); |
6113 | }; |
6114 | diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h |
6115 | index 34f053a150a9..cf2862bd134a 100644 |
6116 | --- a/include/linux/thread_info.h |
6117 | +++ b/include/linux/thread_info.h |
6118 | @@ -43,11 +43,7 @@ enum { |
6119 | #define THREAD_ALIGN THREAD_SIZE |
6120 | #endif |
6121 | |
6122 | -#if IS_ENABLED(CONFIG_DEBUG_STACK_USAGE) || IS_ENABLED(CONFIG_DEBUG_KMEMLEAK) |
6123 | -# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_ZERO) |
6124 | -#else |
6125 | -# define THREADINFO_GFP (GFP_KERNEL_ACCOUNT) |
6126 | -#endif |
6127 | +#define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_ZERO) |
6128 | |
6129 | /* |
6130 | * flag set/clear/test wrappers |
6131 | diff --git a/include/net/tcp.h b/include/net/tcp.h |
6132 | index 3173dd12b8cc..686e33ea76e7 100644 |
6133 | --- a/include/net/tcp.h |
6134 | +++ b/include/net/tcp.h |
6135 | @@ -372,7 +372,7 @@ ssize_t tcp_splice_read(struct socket *sk, loff_t *ppos, |
6136 | struct pipe_inode_info *pipe, size_t len, |
6137 | unsigned int flags); |
6138 | |
6139 | -void tcp_enter_quickack_mode(struct sock *sk); |
6140 | +void tcp_enter_quickack_mode(struct sock *sk, unsigned int max_quickacks); |
6141 | static inline void tcp_dec_quickack_mode(struct sock *sk, |
6142 | const unsigned int pkts) |
6143 | { |
6144 | diff --git a/include/soc/tegra/mc.h b/include/soc/tegra/mc.h |
6145 | index 44202ff897fd..f759e0918037 100644 |
6146 | --- a/include/soc/tegra/mc.h |
6147 | +++ b/include/soc/tegra/mc.h |
6148 | @@ -99,6 +99,8 @@ struct tegra_mc_soc { |
6149 | u8 client_id_mask; |
6150 | |
6151 | const struct tegra_smmu_soc *smmu; |
6152 | + |
6153 | + u32 intmask; |
6154 | }; |
6155 | |
6156 | struct tegra_mc { |
6157 | diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h |
6158 | index 69c37ecbff7e..f3c4b46e39d8 100644 |
6159 | --- a/include/uapi/sound/asoc.h |
6160 | +++ b/include/uapi/sound/asoc.h |
6161 | @@ -139,6 +139,11 @@ |
6162 | #define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS (1 << 1) |
6163 | #define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2) |
6164 | |
6165 | +/* DAI clock gating */ |
6166 | +#define SND_SOC_TPLG_DAI_CLK_GATE_UNDEFINED 0 |
6167 | +#define SND_SOC_TPLG_DAI_CLK_GATE_GATED 1 |
6168 | +#define SND_SOC_TPLG_DAI_CLK_GATE_CONT 2 |
6169 | + |
6170 | /* DAI physical PCM data formats. |
6171 | * Add new formats to the end of the list. |
6172 | */ |
6173 | @@ -160,6 +165,18 @@ |
6174 | #define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2) |
6175 | #define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP (1 << 3) |
6176 | |
6177 | +/* DAI topology BCLK parameter |
6178 | + * For the backwards capability, by default codec is bclk master |
6179 | + */ |
6180 | +#define SND_SOC_TPLG_BCLK_CM 0 /* codec is bclk master */ |
6181 | +#define SND_SOC_TPLG_BCLK_CS 1 /* codec is bclk slave */ |
6182 | + |
6183 | +/* DAI topology FSYNC parameter |
6184 | + * For the backwards capability, by default codec is fsync master |
6185 | + */ |
6186 | +#define SND_SOC_TPLG_FSYNC_CM 0 /* codec is fsync master */ |
6187 | +#define SND_SOC_TPLG_FSYNC_CS 1 /* codec is fsync slave */ |
6188 | + |
6189 | /* |
6190 | * Block Header. |
6191 | * This header precedes all object and object arrays below. |
6192 | @@ -312,11 +329,11 @@ struct snd_soc_tplg_hw_config { |
6193 | __le32 size; /* in bytes of this structure */ |
6194 | __le32 id; /* unique ID - - used to match */ |
6195 | __le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */ |
6196 | - __u8 clock_gated; /* 1 if clock can be gated to save power */ |
6197 | + __u8 clock_gated; /* SND_SOC_TPLG_DAI_CLK_GATE_ value */ |
6198 | __u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */ |
6199 | __u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */ |
6200 | - __u8 bclk_master; /* 1 for master of BCLK, 0 for slave */ |
6201 | - __u8 fsync_master; /* 1 for master of FSYNC, 0 for slave */ |
6202 | + __u8 bclk_master; /* SND_SOC_TPLG_BCLK_ value */ |
6203 | + __u8 fsync_master; /* SND_SOC_TPLG_FSYNC_ value */ |
6204 | __u8 mclk_direction; /* 0 for input, 1 for output */ |
6205 | __le16 reserved; /* for 32bit alignment */ |
6206 | __le32 mclk_rate; /* MCLK or SYSCLK freqency in Hz */ |
6207 | diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c |
6208 | index 0b0aa5854dac..8dd4063647c2 100644 |
6209 | --- a/kernel/auditfilter.c |
6210 | +++ b/kernel/auditfilter.c |
6211 | @@ -407,7 +407,7 @@ static int audit_field_valid(struct audit_entry *entry, struct audit_field *f) |
6212 | return -EINVAL; |
6213 | break; |
6214 | case AUDIT_EXE: |
6215 | - if (f->op != Audit_equal) |
6216 | + if (f->op != Audit_not_equal && f->op != Audit_equal) |
6217 | return -EINVAL; |
6218 | if (entry->rule.listnr != AUDIT_FILTER_EXIT) |
6219 | return -EINVAL; |
6220 | diff --git a/kernel/auditsc.c b/kernel/auditsc.c |
6221 | index ecc23e25c9eb..677053a2fb57 100644 |
6222 | --- a/kernel/auditsc.c |
6223 | +++ b/kernel/auditsc.c |
6224 | @@ -471,6 +471,8 @@ static int audit_filter_rules(struct task_struct *tsk, |
6225 | break; |
6226 | case AUDIT_EXE: |
6227 | result = audit_exe_compare(tsk, rule->exe); |
6228 | + if (f->op == Audit_not_equal) |
6229 | + result = !result; |
6230 | break; |
6231 | case AUDIT_UID: |
6232 | result = audit_uid_comparator(cred->uid, f->op, f->uid); |
6233 | diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c |
6234 | index 3ceb269c0ebd..450e2cd31ed6 100644 |
6235 | --- a/kernel/bpf/verifier.c |
6236 | +++ b/kernel/bpf/verifier.c |
6237 | @@ -4110,7 +4110,7 @@ static int replace_map_fd_with_map_ptr(struct bpf_verifier_env *env) |
6238 | /* hold the map. If the program is rejected by verifier, |
6239 | * the map will be released by release_maps() or it |
6240 | * will be used by the valid program until it's unloaded |
6241 | - * and all maps are released in free_bpf_prog_info() |
6242 | + * and all maps are released in free_used_maps() |
6243 | */ |
6244 | map = bpf_map_inc(map, false); |
6245 | if (IS_ERR(map)) { |
6246 | @@ -4623,7 +4623,7 @@ free_log_buf: |
6247 | vfree(log_buf); |
6248 | if (!env->prog->aux->used_maps) |
6249 | /* if we didn't copy map pointers into bpf_prog_info, release |
6250 | - * them now. Otherwise free_bpf_prog_info() will release them. |
6251 | + * them now. Otherwise free_used_maps() will release them. |
6252 | */ |
6253 | release_maps(env); |
6254 | *prog = env->prog; |
6255 | diff --git a/kernel/delayacct.c b/kernel/delayacct.c |
6256 | index e2764d767f18..ca8ac2824f0b 100644 |
6257 | --- a/kernel/delayacct.c |
6258 | +++ b/kernel/delayacct.c |
6259 | @@ -44,23 +44,24 @@ void __delayacct_tsk_init(struct task_struct *tsk) |
6260 | { |
6261 | tsk->delays = kmem_cache_zalloc(delayacct_cache, GFP_KERNEL); |
6262 | if (tsk->delays) |
6263 | - spin_lock_init(&tsk->delays->lock); |
6264 | + raw_spin_lock_init(&tsk->delays->lock); |
6265 | } |
6266 | |
6267 | /* |
6268 | * Finish delay accounting for a statistic using its timestamps (@start), |
6269 | * accumalator (@total) and @count |
6270 | */ |
6271 | -static void delayacct_end(spinlock_t *lock, u64 *start, u64 *total, u32 *count) |
6272 | +static void delayacct_end(raw_spinlock_t *lock, u64 *start, u64 *total, |
6273 | + u32 *count) |
6274 | { |
6275 | s64 ns = ktime_get_ns() - *start; |
6276 | unsigned long flags; |
6277 | |
6278 | if (ns > 0) { |
6279 | - spin_lock_irqsave(lock, flags); |
6280 | + raw_spin_lock_irqsave(lock, flags); |
6281 | *total += ns; |
6282 | (*count)++; |
6283 | - spin_unlock_irqrestore(lock, flags); |
6284 | + raw_spin_unlock_irqrestore(lock, flags); |
6285 | } |
6286 | } |
6287 | |
6288 | @@ -127,7 +128,7 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) |
6289 | |
6290 | /* zero XXX_total, non-zero XXX_count implies XXX stat overflowed */ |
6291 | |
6292 | - spin_lock_irqsave(&tsk->delays->lock, flags); |
6293 | + raw_spin_lock_irqsave(&tsk->delays->lock, flags); |
6294 | tmp = d->blkio_delay_total + tsk->delays->blkio_delay; |
6295 | d->blkio_delay_total = (tmp < d->blkio_delay_total) ? 0 : tmp; |
6296 | tmp = d->swapin_delay_total + tsk->delays->swapin_delay; |
6297 | @@ -137,7 +138,7 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) |
6298 | d->blkio_count += tsk->delays->blkio_count; |
6299 | d->swapin_count += tsk->delays->swapin_count; |
6300 | d->freepages_count += tsk->delays->freepages_count; |
6301 | - spin_unlock_irqrestore(&tsk->delays->lock, flags); |
6302 | + raw_spin_unlock_irqrestore(&tsk->delays->lock, flags); |
6303 | |
6304 | return 0; |
6305 | } |
6306 | @@ -147,10 +148,10 @@ __u64 __delayacct_blkio_ticks(struct task_struct *tsk) |
6307 | __u64 ret; |
6308 | unsigned long flags; |
6309 | |
6310 | - spin_lock_irqsave(&tsk->delays->lock, flags); |
6311 | + raw_spin_lock_irqsave(&tsk->delays->lock, flags); |
6312 | ret = nsec_to_clock_t(tsk->delays->blkio_delay + |
6313 | tsk->delays->swapin_delay); |
6314 | - spin_unlock_irqrestore(&tsk->delays->lock, flags); |
6315 | + raw_spin_unlock_irqrestore(&tsk->delays->lock, flags); |
6316 | return ret; |
6317 | } |
6318 | |
6319 | diff --git a/kernel/fork.c b/kernel/fork.c |
6320 | index 98c91bd341b4..91907a3701ce 100644 |
6321 | --- a/kernel/fork.c |
6322 | +++ b/kernel/fork.c |
6323 | @@ -215,10 +215,9 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node) |
6324 | if (!s) |
6325 | continue; |
6326 | |
6327 | -#ifdef CONFIG_DEBUG_KMEMLEAK |
6328 | /* Clear stale pointers from reused stack. */ |
6329 | memset(s->addr, 0, THREAD_SIZE); |
6330 | -#endif |
6331 | + |
6332 | tsk->stack_vm_area = s; |
6333 | return s->addr; |
6334 | } |
6335 | diff --git a/kernel/hung_task.c b/kernel/hung_task.c |
6336 | index 751593ed7c0b..32b479468e4d 100644 |
6337 | --- a/kernel/hung_task.c |
6338 | +++ b/kernel/hung_task.c |
6339 | @@ -44,6 +44,7 @@ int __read_mostly sysctl_hung_task_warnings = 10; |
6340 | |
6341 | static int __read_mostly did_panic; |
6342 | static bool hung_task_show_lock; |
6343 | +static bool hung_task_call_panic; |
6344 | |
6345 | static struct task_struct *watchdog_task; |
6346 | |
6347 | @@ -127,10 +128,8 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout) |
6348 | touch_nmi_watchdog(); |
6349 | |
6350 | if (sysctl_hung_task_panic) { |
6351 | - if (hung_task_show_lock) |
6352 | - debug_show_all_locks(); |
6353 | - trigger_all_cpu_backtrace(); |
6354 | - panic("hung_task: blocked tasks"); |
6355 | + hung_task_show_lock = true; |
6356 | + hung_task_call_panic = true; |
6357 | } |
6358 | } |
6359 | |
6360 | @@ -193,6 +192,10 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout) |
6361 | rcu_read_unlock(); |
6362 | if (hung_task_show_lock) |
6363 | debug_show_all_locks(); |
6364 | + if (hung_task_call_panic) { |
6365 | + trigger_all_cpu_backtrace(); |
6366 | + panic("hung_task: blocked tasks"); |
6367 | + } |
6368 | } |
6369 | |
6370 | static long hung_timeout_jiffies(unsigned long last_checked, |
6371 | diff --git a/kernel/kcov.c b/kernel/kcov.c |
6372 | index b11ef6e51f7e..f1e060b04ef6 100644 |
6373 | --- a/kernel/kcov.c |
6374 | +++ b/kernel/kcov.c |
6375 | @@ -108,7 +108,8 @@ static void kcov_put(struct kcov *kcov) |
6376 | |
6377 | void kcov_task_init(struct task_struct *t) |
6378 | { |
6379 | - t->kcov_mode = KCOV_MODE_DISABLED; |
6380 | + WRITE_ONCE(t->kcov_mode, KCOV_MODE_DISABLED); |
6381 | + barrier(); |
6382 | t->kcov_size = 0; |
6383 | t->kcov_area = NULL; |
6384 | t->kcov = NULL; |
6385 | diff --git a/kernel/kthread.c b/kernel/kthread.c |
6386 | index 1ef8f3a5b072..4e6d85b63201 100644 |
6387 | --- a/kernel/kthread.c |
6388 | +++ b/kernel/kthread.c |
6389 | @@ -311,8 +311,14 @@ struct task_struct *__kthread_create_on_node(int (*threadfn)(void *data), |
6390 | task = create->result; |
6391 | if (!IS_ERR(task)) { |
6392 | static const struct sched_param param = { .sched_priority = 0 }; |
6393 | + char name[TASK_COMM_LEN]; |
6394 | |
6395 | - vsnprintf(task->comm, sizeof(task->comm), namefmt, args); |
6396 | + /* |
6397 | + * task is already visible to other tasks, so updating |
6398 | + * COMM must be protected. |
6399 | + */ |
6400 | + vsnprintf(name, sizeof(name), namefmt, args); |
6401 | + set_task_comm(task, name); |
6402 | /* |
6403 | * root may have changed our (kthreadd's) priority or CPU mask. |
6404 | * The kernel thread should not inherit these properties. |
6405 | diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c |
6406 | index 0685c4499431..c0bc2c89697a 100644 |
6407 | --- a/kernel/power/suspend.c |
6408 | +++ b/kernel/power/suspend.c |
6409 | @@ -60,7 +60,7 @@ static const struct platform_s2idle_ops *s2idle_ops; |
6410 | static DECLARE_WAIT_QUEUE_HEAD(s2idle_wait_head); |
6411 | |
6412 | enum s2idle_states __read_mostly s2idle_state; |
6413 | -static DEFINE_SPINLOCK(s2idle_lock); |
6414 | +static DEFINE_RAW_SPINLOCK(s2idle_lock); |
6415 | |
6416 | void s2idle_set_ops(const struct platform_s2idle_ops *ops) |
6417 | { |
6418 | @@ -78,12 +78,12 @@ static void s2idle_enter(void) |
6419 | { |
6420 | trace_suspend_resume(TPS("machine_suspend"), PM_SUSPEND_TO_IDLE, true); |
6421 | |
6422 | - spin_lock_irq(&s2idle_lock); |
6423 | + raw_spin_lock_irq(&s2idle_lock); |
6424 | if (pm_wakeup_pending()) |
6425 | goto out; |
6426 | |
6427 | s2idle_state = S2IDLE_STATE_ENTER; |
6428 | - spin_unlock_irq(&s2idle_lock); |
6429 | + raw_spin_unlock_irq(&s2idle_lock); |
6430 | |
6431 | get_online_cpus(); |
6432 | cpuidle_resume(); |
6433 | @@ -97,11 +97,11 @@ static void s2idle_enter(void) |
6434 | cpuidle_pause(); |
6435 | put_online_cpus(); |
6436 | |
6437 | - spin_lock_irq(&s2idle_lock); |
6438 | + raw_spin_lock_irq(&s2idle_lock); |
6439 | |
6440 | out: |
6441 | s2idle_state = S2IDLE_STATE_NONE; |
6442 | - spin_unlock_irq(&s2idle_lock); |
6443 | + raw_spin_unlock_irq(&s2idle_lock); |
6444 | |
6445 | trace_suspend_resume(TPS("machine_suspend"), PM_SUSPEND_TO_IDLE, false); |
6446 | } |
6447 | @@ -156,12 +156,12 @@ void s2idle_wake(void) |
6448 | { |
6449 | unsigned long flags; |
6450 | |
6451 | - spin_lock_irqsave(&s2idle_lock, flags); |
6452 | + raw_spin_lock_irqsave(&s2idle_lock, flags); |
6453 | if (s2idle_state > S2IDLE_STATE_NONE) { |
6454 | s2idle_state = S2IDLE_STATE_WAKE; |
6455 | wake_up(&s2idle_wait_head); |
6456 | } |
6457 | - spin_unlock_irqrestore(&s2idle_lock, flags); |
6458 | + raw_spin_unlock_irqrestore(&s2idle_lock, flags); |
6459 | } |
6460 | EXPORT_SYMBOL_GPL(s2idle_wake); |
6461 | |
6462 | diff --git a/kernel/printk/printk_safe.c b/kernel/printk/printk_safe.c |
6463 | index d989cc238198..64825b2df3a5 100644 |
6464 | --- a/kernel/printk/printk_safe.c |
6465 | +++ b/kernel/printk/printk_safe.c |
6466 | @@ -284,7 +284,7 @@ void printk_safe_flush_on_panic(void) |
6467 | * Make sure that we could access the main ring buffer. |
6468 | * Do not risk a double release when more CPUs are up. |
6469 | */ |
6470 | - if (in_nmi() && raw_spin_is_locked(&logbuf_lock)) { |
6471 | + if (raw_spin_is_locked(&logbuf_lock)) { |
6472 | if (num_online_cpus() > 1) |
6473 | return; |
6474 | |
6475 | diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c |
6476 | index 2f6fa95de2d8..1ff523dae6e2 100644 |
6477 | --- a/kernel/stop_machine.c |
6478 | +++ b/kernel/stop_machine.c |
6479 | @@ -37,7 +37,7 @@ struct cpu_stop_done { |
6480 | struct cpu_stopper { |
6481 | struct task_struct *thread; |
6482 | |
6483 | - spinlock_t lock; |
6484 | + raw_spinlock_t lock; |
6485 | bool enabled; /* is this stopper enabled? */ |
6486 | struct list_head works; /* list of pending works */ |
6487 | |
6488 | @@ -81,13 +81,13 @@ static bool cpu_stop_queue_work(unsigned int cpu, struct cpu_stop_work *work) |
6489 | unsigned long flags; |
6490 | bool enabled; |
6491 | |
6492 | - spin_lock_irqsave(&stopper->lock, flags); |
6493 | + raw_spin_lock_irqsave(&stopper->lock, flags); |
6494 | enabled = stopper->enabled; |
6495 | if (enabled) |
6496 | __cpu_stop_queue_work(stopper, work, &wakeq); |
6497 | else if (work->done) |
6498 | cpu_stop_signal_done(work->done); |
6499 | - spin_unlock_irqrestore(&stopper->lock, flags); |
6500 | + raw_spin_unlock_irqrestore(&stopper->lock, flags); |
6501 | |
6502 | wake_up_q(&wakeq); |
6503 | |
6504 | @@ -237,8 +237,8 @@ static int cpu_stop_queue_two_works(int cpu1, struct cpu_stop_work *work1, |
6505 | DEFINE_WAKE_Q(wakeq); |
6506 | int err; |
6507 | retry: |
6508 | - spin_lock_irq(&stopper1->lock); |
6509 | - spin_lock_nested(&stopper2->lock, SINGLE_DEPTH_NESTING); |
6510 | + raw_spin_lock_irq(&stopper1->lock); |
6511 | + raw_spin_lock_nested(&stopper2->lock, SINGLE_DEPTH_NESTING); |
6512 | |
6513 | err = -ENOENT; |
6514 | if (!stopper1->enabled || !stopper2->enabled) |
6515 | @@ -261,8 +261,8 @@ retry: |
6516 | __cpu_stop_queue_work(stopper1, work1, &wakeq); |
6517 | __cpu_stop_queue_work(stopper2, work2, &wakeq); |
6518 | unlock: |
6519 | - spin_unlock(&stopper2->lock); |
6520 | - spin_unlock_irq(&stopper1->lock); |
6521 | + raw_spin_unlock(&stopper2->lock); |
6522 | + raw_spin_unlock_irq(&stopper1->lock); |
6523 | |
6524 | if (unlikely(err == -EDEADLK)) { |
6525 | while (stop_cpus_in_progress) |
6526 | @@ -461,9 +461,9 @@ static int cpu_stop_should_run(unsigned int cpu) |
6527 | unsigned long flags; |
6528 | int run; |
6529 | |
6530 | - spin_lock_irqsave(&stopper->lock, flags); |
6531 | + raw_spin_lock_irqsave(&stopper->lock, flags); |
6532 | run = !list_empty(&stopper->works); |
6533 | - spin_unlock_irqrestore(&stopper->lock, flags); |
6534 | + raw_spin_unlock_irqrestore(&stopper->lock, flags); |
6535 | return run; |
6536 | } |
6537 | |
6538 | @@ -474,13 +474,13 @@ static void cpu_stopper_thread(unsigned int cpu) |
6539 | |
6540 | repeat: |
6541 | work = NULL; |
6542 | - spin_lock_irq(&stopper->lock); |
6543 | + raw_spin_lock_irq(&stopper->lock); |
6544 | if (!list_empty(&stopper->works)) { |
6545 | work = list_first_entry(&stopper->works, |
6546 | struct cpu_stop_work, list); |
6547 | list_del_init(&work->list); |
6548 | } |
6549 | - spin_unlock_irq(&stopper->lock); |
6550 | + raw_spin_unlock_irq(&stopper->lock); |
6551 | |
6552 | if (work) { |
6553 | cpu_stop_fn_t fn = work->fn; |
6554 | @@ -554,7 +554,7 @@ static int __init cpu_stop_init(void) |
6555 | for_each_possible_cpu(cpu) { |
6556 | struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu); |
6557 | |
6558 | - spin_lock_init(&stopper->lock); |
6559 | + raw_spin_lock_init(&stopper->lock); |
6560 | INIT_LIST_HEAD(&stopper->works); |
6561 | } |
6562 | |
6563 | diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c |
6564 | index b413fab7d75b..43254c5e7e16 100644 |
6565 | --- a/kernel/trace/trace_events_trigger.c |
6566 | +++ b/kernel/trace/trace_events_trigger.c |
6567 | @@ -680,6 +680,8 @@ event_trigger_callback(struct event_command *cmd_ops, |
6568 | goto out_free; |
6569 | |
6570 | out_reg: |
6571 | + /* Up the trigger_data count to make sure reg doesn't free it on failure */ |
6572 | + event_trigger_init(trigger_ops, trigger_data); |
6573 | ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file); |
6574 | /* |
6575 | * The above returns on success the # of functions enabled, |
6576 | @@ -687,11 +689,13 @@ event_trigger_callback(struct event_command *cmd_ops, |
6577 | * Consider no functions a failure too. |
6578 | */ |
6579 | if (!ret) { |
6580 | + cmd_ops->unreg(glob, trigger_ops, trigger_data, file); |
6581 | ret = -ENOENT; |
6582 | - goto out_free; |
6583 | - } else if (ret < 0) |
6584 | - goto out_free; |
6585 | - ret = 0; |
6586 | + } else if (ret > 0) |
6587 | + ret = 0; |
6588 | + |
6589 | + /* Down the counter of trigger_data or free it if not used anymore */ |
6590 | + event_trigger_free(trigger_ops, trigger_data); |
6591 | out: |
6592 | return ret; |
6593 | |
6594 | @@ -1392,6 +1396,9 @@ int event_enable_trigger_func(struct event_command *cmd_ops, |
6595 | goto out; |
6596 | } |
6597 | |
6598 | + /* Up the trigger_data count to make sure nothing frees it on failure */ |
6599 | + event_trigger_init(trigger_ops, trigger_data); |
6600 | + |
6601 | if (trigger) { |
6602 | number = strsep(&trigger, ":"); |
6603 | |
6604 | @@ -1442,6 +1449,7 @@ int event_enable_trigger_func(struct event_command *cmd_ops, |
6605 | goto out_disable; |
6606 | /* Just return zero, not the number of enabled functions */ |
6607 | ret = 0; |
6608 | + event_trigger_free(trigger_ops, trigger_data); |
6609 | out: |
6610 | return ret; |
6611 | |
6612 | @@ -1452,7 +1460,7 @@ int event_enable_trigger_func(struct event_command *cmd_ops, |
6613 | out_free: |
6614 | if (cmd_ops->set_filter) |
6615 | cmd_ops->set_filter(NULL, trigger_data, NULL); |
6616 | - kfree(trigger_data); |
6617 | + event_trigger_free(trigger_ops, trigger_data); |
6618 | kfree(enable_data); |
6619 | goto out; |
6620 | } |
6621 | diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c |
6622 | index f8d3bd974bcc..ea20274a105a 100644 |
6623 | --- a/kernel/trace/trace_kprobe.c |
6624 | +++ b/kernel/trace/trace_kprobe.c |
6625 | @@ -376,11 +376,10 @@ static struct trace_kprobe *find_trace_kprobe(const char *event, |
6626 | static int |
6627 | enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file) |
6628 | { |
6629 | + struct event_file_link *link = NULL; |
6630 | int ret = 0; |
6631 | |
6632 | if (file) { |
6633 | - struct event_file_link *link; |
6634 | - |
6635 | link = kmalloc(sizeof(*link), GFP_KERNEL); |
6636 | if (!link) { |
6637 | ret = -ENOMEM; |
6638 | @@ -400,6 +399,18 @@ enable_trace_kprobe(struct trace_kprobe *tk, struct trace_event_file *file) |
6639 | else |
6640 | ret = enable_kprobe(&tk->rp.kp); |
6641 | } |
6642 | + |
6643 | + if (ret) { |
6644 | + if (file) { |
6645 | + /* Notice the if is true on not WARN() */ |
6646 | + if (!WARN_ON_ONCE(!link)) |
6647 | + list_del_rcu(&link->list); |
6648 | + kfree(link); |
6649 | + tk->tp.flags &= ~TP_FLAG_TRACE; |
6650 | + } else { |
6651 | + tk->tp.flags &= ~TP_FLAG_PROFILE; |
6652 | + } |
6653 | + } |
6654 | out: |
6655 | return ret; |
6656 | } |
6657 | diff --git a/mm/slub.c b/mm/slub.c |
6658 | index c38e71cea6d3..10e54c4acd19 100644 |
6659 | --- a/mm/slub.c |
6660 | +++ b/mm/slub.c |
6661 | @@ -708,7 +708,7 @@ void object_err(struct kmem_cache *s, struct page *page, |
6662 | print_trailer(s, page, object); |
6663 | } |
6664 | |
6665 | -static void slab_err(struct kmem_cache *s, struct page *page, |
6666 | +static __printf(3, 4) void slab_err(struct kmem_cache *s, struct page *page, |
6667 | const char *fmt, ...) |
6668 | { |
6669 | va_list args; |
6670 | diff --git a/mm/vmalloc.c b/mm/vmalloc.c |
6671 | index ebff729cc956..9ff21a12ea00 100644 |
6672 | --- a/mm/vmalloc.c |
6673 | +++ b/mm/vmalloc.c |
6674 | @@ -1519,7 +1519,7 @@ static void __vunmap(const void *addr, int deallocate_pages) |
6675 | addr)) |
6676 | return; |
6677 | |
6678 | - area = remove_vm_area(addr); |
6679 | + area = find_vmap_area((unsigned long)addr)->vm; |
6680 | if (unlikely(!area)) { |
6681 | WARN(1, KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n", |
6682 | addr); |
6683 | @@ -1529,6 +1529,7 @@ static void __vunmap(const void *addr, int deallocate_pages) |
6684 | debug_check_no_locks_freed(addr, get_vm_area_size(area)); |
6685 | debug_check_no_obj_freed(addr, get_vm_area_size(area)); |
6686 | |
6687 | + remove_vm_area(addr); |
6688 | if (deallocate_pages) { |
6689 | int i; |
6690 | |
6691 | diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c |
6692 | index 67eebcb113f3..5bbdd05d0cd3 100644 |
6693 | --- a/net/ipv4/fib_frontend.c |
6694 | +++ b/net/ipv4/fib_frontend.c |
6695 | @@ -282,19 +282,19 @@ __be32 fib_compute_spec_dst(struct sk_buff *skb) |
6696 | return ip_hdr(skb)->daddr; |
6697 | |
6698 | in_dev = __in_dev_get_rcu(dev); |
6699 | - BUG_ON(!in_dev); |
6700 | |
6701 | net = dev_net(dev); |
6702 | |
6703 | scope = RT_SCOPE_UNIVERSE; |
6704 | if (!ipv4_is_zeronet(ip_hdr(skb)->saddr)) { |
6705 | + bool vmark = in_dev && IN_DEV_SRC_VMARK(in_dev); |
6706 | struct flowi4 fl4 = { |
6707 | .flowi4_iif = LOOPBACK_IFINDEX, |
6708 | .flowi4_oif = l3mdev_master_ifindex_rcu(dev), |
6709 | .daddr = ip_hdr(skb)->saddr, |
6710 | .flowi4_tos = RT_TOS(ip_hdr(skb)->tos), |
6711 | .flowi4_scope = scope, |
6712 | - .flowi4_mark = IN_DEV_SRC_VMARK(in_dev) ? skb->mark : 0, |
6713 | + .flowi4_mark = vmark ? skb->mark : 0, |
6714 | }; |
6715 | if (!fib_lookup(net, &fl4, &res, 0)) |
6716 | return FIB_RES_PREFSRC(net, res); |
6717 | diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c |
6718 | index abdebca848c9..f0782c91514c 100644 |
6719 | --- a/net/ipv4/ipconfig.c |
6720 | +++ b/net/ipv4/ipconfig.c |
6721 | @@ -781,6 +781,11 @@ static void __init ic_bootp_init_ext(u8 *e) |
6722 | */ |
6723 | static inline void __init ic_bootp_init(void) |
6724 | { |
6725 | + /* Re-initialise all name servers to NONE, in case any were set via the |
6726 | + * "ip=" or "nfsaddrs=" kernel command line parameters: any IP addresses |
6727 | + * specified there will already have been decoded but are no longer |
6728 | + * needed |
6729 | + */ |
6730 | ic_nameservers_predef(); |
6731 | |
6732 | dev_add_pack(&bootp_packet_type); |
6733 | @@ -1402,6 +1407,13 @@ static int __init ip_auto_config(void) |
6734 | int err; |
6735 | unsigned int i; |
6736 | |
6737 | + /* Initialise all name servers to NONE (but only if the "ip=" or |
6738 | + * "nfsaddrs=" kernel command line parameters weren't decoded, otherwise |
6739 | + * we'll overwrite the IP addresses specified there) |
6740 | + */ |
6741 | + if (ic_set_manually == 0) |
6742 | + ic_nameservers_predef(); |
6743 | + |
6744 | #ifdef CONFIG_PROC_FS |
6745 | proc_create("pnp", S_IRUGO, init_net.proc_net, &pnp_seq_fops); |
6746 | #endif /* CONFIG_PROC_FS */ |
6747 | @@ -1622,6 +1634,7 @@ static int __init ip_auto_config_setup(char *addrs) |
6748 | return 1; |
6749 | } |
6750 | |
6751 | + /* Initialise all name servers to NONE */ |
6752 | ic_nameservers_predef(); |
6753 | |
6754 | /* Parse string for static IP assignment. */ |
6755 | diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c |
6756 | index 9a0b952dd09b..06f247ca9197 100644 |
6757 | --- a/net/ipv4/tcp_bbr.c |
6758 | +++ b/net/ipv4/tcp_bbr.c |
6759 | @@ -353,6 +353,10 @@ static u32 bbr_target_cwnd(struct sock *sk, u32 bw, int gain) |
6760 | /* Reduce delayed ACKs by rounding up cwnd to the next even number. */ |
6761 | cwnd = (cwnd + 1) & ~1U; |
6762 | |
6763 | + /* Ensure gain cycling gets inflight above BDP even for small BDPs. */ |
6764 | + if (bbr->mode == BBR_PROBE_BW && gain > BBR_UNIT) |
6765 | + cwnd += 2; |
6766 | + |
6767 | return cwnd; |
6768 | } |
6769 | |
6770 | diff --git a/net/ipv4/tcp_dctcp.c b/net/ipv4/tcp_dctcp.c |
6771 | index c78fb53988a1..1a9b88c8cf72 100644 |
6772 | --- a/net/ipv4/tcp_dctcp.c |
6773 | +++ b/net/ipv4/tcp_dctcp.c |
6774 | @@ -138,7 +138,7 @@ static void dctcp_ce_state_0_to_1(struct sock *sk) |
6775 | */ |
6776 | if (inet_csk(sk)->icsk_ack.pending & ICSK_ACK_TIMER) |
6777 | __tcp_send_ack(sk, ca->prior_rcv_nxt); |
6778 | - tcp_enter_quickack_mode(sk); |
6779 | + tcp_enter_quickack_mode(sk, 1); |
6780 | } |
6781 | |
6782 | ca->prior_rcv_nxt = tp->rcv_nxt; |
6783 | @@ -159,7 +159,7 @@ static void dctcp_ce_state_1_to_0(struct sock *sk) |
6784 | */ |
6785 | if (inet_csk(sk)->icsk_ack.pending & ICSK_ACK_TIMER) |
6786 | __tcp_send_ack(sk, ca->prior_rcv_nxt); |
6787 | - tcp_enter_quickack_mode(sk); |
6788 | + tcp_enter_quickack_mode(sk, 1); |
6789 | } |
6790 | |
6791 | ca->prior_rcv_nxt = tp->rcv_nxt; |
6792 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c |
6793 | index b86e7b8beb1d..bdabd748f4bc 100644 |
6794 | --- a/net/ipv4/tcp_input.c |
6795 | +++ b/net/ipv4/tcp_input.c |
6796 | @@ -198,21 +198,23 @@ static void tcp_measure_rcv_mss(struct sock *sk, const struct sk_buff *skb) |
6797 | } |
6798 | } |
6799 | |
6800 | -static void tcp_incr_quickack(struct sock *sk) |
6801 | +static void tcp_incr_quickack(struct sock *sk, unsigned int max_quickacks) |
6802 | { |
6803 | struct inet_connection_sock *icsk = inet_csk(sk); |
6804 | unsigned int quickacks = tcp_sk(sk)->rcv_wnd / (2 * icsk->icsk_ack.rcv_mss); |
6805 | |
6806 | if (quickacks == 0) |
6807 | quickacks = 2; |
6808 | + quickacks = min(quickacks, max_quickacks); |
6809 | if (quickacks > icsk->icsk_ack.quick) |
6810 | - icsk->icsk_ack.quick = min(quickacks, TCP_MAX_QUICKACKS); |
6811 | + icsk->icsk_ack.quick = quickacks; |
6812 | } |
6813 | |
6814 | -void tcp_enter_quickack_mode(struct sock *sk) |
6815 | +void tcp_enter_quickack_mode(struct sock *sk, unsigned int max_quickacks) |
6816 | { |
6817 | struct inet_connection_sock *icsk = inet_csk(sk); |
6818 | - tcp_incr_quickack(sk); |
6819 | + |
6820 | + tcp_incr_quickack(sk, max_quickacks); |
6821 | icsk->icsk_ack.pingpong = 0; |
6822 | icsk->icsk_ack.ato = TCP_ATO_MIN; |
6823 | } |
6824 | @@ -248,8 +250,10 @@ static void tcp_ecn_withdraw_cwr(struct tcp_sock *tp) |
6825 | tp->ecn_flags &= ~TCP_ECN_DEMAND_CWR; |
6826 | } |
6827 | |
6828 | -static void __tcp_ecn_check_ce(struct tcp_sock *tp, const struct sk_buff *skb) |
6829 | +static void __tcp_ecn_check_ce(struct sock *sk, const struct sk_buff *skb) |
6830 | { |
6831 | + struct tcp_sock *tp = tcp_sk(sk); |
6832 | + |
6833 | switch (TCP_SKB_CB(skb)->ip_dsfield & INET_ECN_MASK) { |
6834 | case INET_ECN_NOT_ECT: |
6835 | /* Funny extension: if ECT is not set on a segment, |
6836 | @@ -257,31 +261,31 @@ static void __tcp_ecn_check_ce(struct tcp_sock *tp, const struct sk_buff *skb) |
6837 | * it is probably a retransmit. |
6838 | */ |
6839 | if (tp->ecn_flags & TCP_ECN_SEEN) |
6840 | - tcp_enter_quickack_mode((struct sock *)tp); |
6841 | + tcp_enter_quickack_mode(sk, 2); |
6842 | break; |
6843 | case INET_ECN_CE: |
6844 | - if (tcp_ca_needs_ecn((struct sock *)tp)) |
6845 | - tcp_ca_event((struct sock *)tp, CA_EVENT_ECN_IS_CE); |
6846 | + if (tcp_ca_needs_ecn(sk)) |
6847 | + tcp_ca_event(sk, CA_EVENT_ECN_IS_CE); |
6848 | |
6849 | if (!(tp->ecn_flags & TCP_ECN_DEMAND_CWR)) { |
6850 | /* Better not delay acks, sender can have a very low cwnd */ |
6851 | - tcp_enter_quickack_mode((struct sock *)tp); |
6852 | + tcp_enter_quickack_mode(sk, 2); |
6853 | tp->ecn_flags |= TCP_ECN_DEMAND_CWR; |
6854 | } |
6855 | tp->ecn_flags |= TCP_ECN_SEEN; |
6856 | break; |
6857 | default: |
6858 | - if (tcp_ca_needs_ecn((struct sock *)tp)) |
6859 | - tcp_ca_event((struct sock *)tp, CA_EVENT_ECN_NO_CE); |
6860 | + if (tcp_ca_needs_ecn(sk)) |
6861 | + tcp_ca_event(sk, CA_EVENT_ECN_NO_CE); |
6862 | tp->ecn_flags |= TCP_ECN_SEEN; |
6863 | break; |
6864 | } |
6865 | } |
6866 | |
6867 | -static void tcp_ecn_check_ce(struct tcp_sock *tp, const struct sk_buff *skb) |
6868 | +static void tcp_ecn_check_ce(struct sock *sk, const struct sk_buff *skb) |
6869 | { |
6870 | - if (tp->ecn_flags & TCP_ECN_OK) |
6871 | - __tcp_ecn_check_ce(tp, skb); |
6872 | + if (tcp_sk(sk)->ecn_flags & TCP_ECN_OK) |
6873 | + __tcp_ecn_check_ce(sk, skb); |
6874 | } |
6875 | |
6876 | static void tcp_ecn_rcv_synack(struct tcp_sock *tp, const struct tcphdr *th) |
6877 | @@ -686,7 +690,7 @@ static void tcp_event_data_recv(struct sock *sk, struct sk_buff *skb) |
6878 | /* The _first_ data packet received, initialize |
6879 | * delayed ACK engine. |
6880 | */ |
6881 | - tcp_incr_quickack(sk); |
6882 | + tcp_incr_quickack(sk, TCP_MAX_QUICKACKS); |
6883 | icsk->icsk_ack.ato = TCP_ATO_MIN; |
6884 | } else { |
6885 | int m = now - icsk->icsk_ack.lrcvtime; |
6886 | @@ -702,13 +706,13 @@ static void tcp_event_data_recv(struct sock *sk, struct sk_buff *skb) |
6887 | /* Too long gap. Apparently sender failed to |
6888 | * restart window, so that we send ACKs quickly. |
6889 | */ |
6890 | - tcp_incr_quickack(sk); |
6891 | + tcp_incr_quickack(sk, TCP_MAX_QUICKACKS); |
6892 | sk_mem_reclaim(sk); |
6893 | } |
6894 | } |
6895 | icsk->icsk_ack.lrcvtime = now; |
6896 | |
6897 | - tcp_ecn_check_ce(tp, skb); |
6898 | + tcp_ecn_check_ce(sk, skb); |
6899 | |
6900 | if (skb->len >= 128) |
6901 | tcp_grow_window(sk, skb); |
6902 | @@ -4160,7 +4164,7 @@ static void tcp_send_dupack(struct sock *sk, const struct sk_buff *skb) |
6903 | if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && |
6904 | before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { |
6905 | NET_INC_STATS(sock_net(sk), LINUX_MIB_DELAYEDACKLOST); |
6906 | - tcp_enter_quickack_mode(sk); |
6907 | + tcp_enter_quickack_mode(sk, TCP_MAX_QUICKACKS); |
6908 | |
6909 | if (tcp_is_sack(tp) && sysctl_tcp_dsack) { |
6910 | u32 end_seq = TCP_SKB_CB(skb)->end_seq; |
6911 | @@ -4441,7 +4445,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) |
6912 | u32 seq, end_seq; |
6913 | bool fragstolen; |
6914 | |
6915 | - tcp_ecn_check_ce(tp, skb); |
6916 | + tcp_ecn_check_ce(sk, skb); |
6917 | |
6918 | if (unlikely(tcp_try_rmem_schedule(sk, skb, skb->truesize))) { |
6919 | NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPOFODROP); |
6920 | @@ -4710,7 +4714,7 @@ queue_and_out: |
6921 | tcp_dsack_set(sk, TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq); |
6922 | |
6923 | out_of_window: |
6924 | - tcp_enter_quickack_mode(sk); |
6925 | + tcp_enter_quickack_mode(sk, TCP_MAX_QUICKACKS); |
6926 | inet_csk_schedule_ack(sk); |
6927 | drop: |
6928 | tcp_drop(sk, skb); |
6929 | @@ -4721,8 +4725,6 @@ drop: |
6930 | if (!before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt + tcp_receive_window(tp))) |
6931 | goto out_of_window; |
6932 | |
6933 | - tcp_enter_quickack_mode(sk); |
6934 | - |
6935 | if (before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { |
6936 | /* Partial packet, seq < rcv_next < end_seq */ |
6937 | SOCK_DEBUG(sk, "partial packet: rcv_next %X seq %X - %X\n", |
6938 | @@ -5793,7 +5795,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, |
6939 | * to stand against the temptation 8) --ANK |
6940 | */ |
6941 | inet_csk_schedule_ack(sk); |
6942 | - tcp_enter_quickack_mode(sk); |
6943 | + tcp_enter_quickack_mode(sk, TCP_MAX_QUICKACKS); |
6944 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, |
6945 | TCP_DELACK_MAX, TCP_RTO_MAX); |
6946 | |
6947 | diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h |
6948 | index 51063d9ed0f7..dfd268166e42 100644 |
6949 | --- a/net/netfilter/ipset/ip_set_hash_gen.h |
6950 | +++ b/net/netfilter/ipset/ip_set_hash_gen.h |
6951 | @@ -1241,7 +1241,10 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set, |
6952 | pr_debug("Create set %s with family %s\n", |
6953 | set->name, set->family == NFPROTO_IPV4 ? "inet" : "inet6"); |
6954 | |
6955 | -#ifndef IP_SET_PROTO_UNDEF |
6956 | +#ifdef IP_SET_PROTO_UNDEF |
6957 | + if (set->family != NFPROTO_UNSPEC) |
6958 | + return -IPSET_ERR_INVALID_FAMILY; |
6959 | +#else |
6960 | if (!(set->family == NFPROTO_IPV4 || set->family == NFPROTO_IPV6)) |
6961 | return -IPSET_ERR_INVALID_FAMILY; |
6962 | #endif |
6963 | diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c |
6964 | index 85b549e84104..9a945024a0b6 100644 |
6965 | --- a/net/netfilter/nf_tables_api.c |
6966 | +++ b/net/netfilter/nf_tables_api.c |
6967 | @@ -2710,12 +2710,13 @@ static struct nft_set *nf_tables_set_lookup_byid(const struct net *net, |
6968 | u32 id = ntohl(nla_get_be32(nla)); |
6969 | |
6970 | list_for_each_entry(trans, &net->nft.commit_list, list) { |
6971 | - struct nft_set *set = nft_trans_set(trans); |
6972 | + if (trans->msg_type == NFT_MSG_NEWSET) { |
6973 | + struct nft_set *set = nft_trans_set(trans); |
6974 | |
6975 | - if (trans->msg_type == NFT_MSG_NEWSET && |
6976 | - id == nft_trans_set_id(trans) && |
6977 | - nft_active_genmask(set, genmask)) |
6978 | - return set; |
6979 | + if (id == nft_trans_set_id(trans) && |
6980 | + nft_active_genmask(set, genmask)) |
6981 | + return set; |
6982 | + } |
6983 | } |
6984 | return ERR_PTR(-ENOENT); |
6985 | } |
6986 | diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c |
6987 | index b3932846f6c4..b2fcbf012056 100644 |
6988 | --- a/net/netlink/af_netlink.c |
6989 | +++ b/net/netlink/af_netlink.c |
6990 | @@ -977,6 +977,11 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, |
6991 | return err; |
6992 | } |
6993 | |
6994 | + if (nlk->ngroups == 0) |
6995 | + groups = 0; |
6996 | + else |
6997 | + groups &= (1ULL << nlk->ngroups) - 1; |
6998 | + |
6999 | bound = nlk->bound; |
7000 | if (bound) { |
7001 | /* Ensure nlk->portid is up-to-date. */ |
7002 | diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c |
7003 | index 7e334fd31c15..f8553179bdd7 100644 |
7004 | --- a/security/integrity/ima/ima_main.c |
7005 | +++ b/security/integrity/ima/ima_main.c |
7006 | @@ -379,6 +379,7 @@ int ima_read_file(struct file *file, enum kernel_read_file_id read_id) |
7007 | |
7008 | static int read_idmap[READING_MAX_ID] = { |
7009 | [READING_FIRMWARE] = FIRMWARE_CHECK, |
7010 | + [READING_FIRMWARE_PREALLOC_BUFFER] = FIRMWARE_CHECK, |
7011 | [READING_MODULE] = MODULE_CHECK, |
7012 | [READING_KEXEC_IMAGE] = KEXEC_KERNEL_CHECK, |
7013 | [READING_KEXEC_INITRAMFS] = KEXEC_INITRAMFS_CHECK, |
7014 | diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c |
7015 | index 2683b9717215..56be1630bd3e 100644 |
7016 | --- a/sound/pci/emu10k1/emupcm.c |
7017 | +++ b/sound/pci/emu10k1/emupcm.c |
7018 | @@ -1850,7 +1850,9 @@ int snd_emu10k1_pcm_efx(struct snd_emu10k1 *emu, int device) |
7019 | if (!kctl) |
7020 | return -ENOMEM; |
7021 | kctl->id.device = device; |
7022 | - snd_ctl_add(emu->card, kctl); |
7023 | + err = snd_ctl_add(emu->card, kctl); |
7024 | + if (err < 0) |
7025 | + return err; |
7026 | |
7027 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(emu->pci), 64*1024, 64*1024); |
7028 | |
7029 | diff --git a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c |
7030 | index 4f1f69be1865..8c778fa33031 100644 |
7031 | --- a/sound/pci/emu10k1/memory.c |
7032 | +++ b/sound/pci/emu10k1/memory.c |
7033 | @@ -237,13 +237,13 @@ __found_pages: |
7034 | static int is_valid_page(struct snd_emu10k1 *emu, dma_addr_t addr) |
7035 | { |
7036 | if (addr & ~emu->dma_mask) { |
7037 | - dev_err(emu->card->dev, |
7038 | + dev_err_ratelimited(emu->card->dev, |
7039 | "max memory size is 0x%lx (addr = 0x%lx)!!\n", |
7040 | emu->dma_mask, (unsigned long)addr); |
7041 | return 0; |
7042 | } |
7043 | if (addr & (EMUPAGESIZE-1)) { |
7044 | - dev_err(emu->card->dev, "page is not aligned\n"); |
7045 | + dev_err_ratelimited(emu->card->dev, "page is not aligned\n"); |
7046 | return 0; |
7047 | } |
7048 | return 1; |
7049 | @@ -334,7 +334,7 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst |
7050 | else |
7051 | addr = snd_pcm_sgbuf_get_addr(substream, ofs); |
7052 | if (! is_valid_page(emu, addr)) { |
7053 | - dev_err(emu->card->dev, |
7054 | + dev_err_ratelimited(emu->card->dev, |
7055 | "emu: failure page = %d\n", idx); |
7056 | mutex_unlock(&hdr->block_mutex); |
7057 | return NULL; |
7058 | diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c |
7059 | index 73a67bc3586b..e3fb9c61017c 100644 |
7060 | --- a/sound/pci/fm801.c |
7061 | +++ b/sound/pci/fm801.c |
7062 | @@ -1068,11 +1068,19 @@ static int snd_fm801_mixer(struct fm801 *chip) |
7063 | if ((err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97_sec)) < 0) |
7064 | return err; |
7065 | } |
7066 | - for (i = 0; i < FM801_CONTROLS; i++) |
7067 | - snd_ctl_add(chip->card, snd_ctl_new1(&snd_fm801_controls[i], chip)); |
7068 | + for (i = 0; i < FM801_CONTROLS; i++) { |
7069 | + err = snd_ctl_add(chip->card, |
7070 | + snd_ctl_new1(&snd_fm801_controls[i], chip)); |
7071 | + if (err < 0) |
7072 | + return err; |
7073 | + } |
7074 | if (chip->multichannel) { |
7075 | - for (i = 0; i < FM801_CONTROLS_MULTI; i++) |
7076 | - snd_ctl_add(chip->card, snd_ctl_new1(&snd_fm801_controls_multi[i], chip)); |
7077 | + for (i = 0; i < FM801_CONTROLS_MULTI; i++) { |
7078 | + err = snd_ctl_add(chip->card, |
7079 | + snd_ctl_new1(&snd_fm801_controls_multi[i], chip)); |
7080 | + if (err < 0) |
7081 | + return err; |
7082 | + } |
7083 | } |
7084 | return 0; |
7085 | } |
7086 | diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c |
7087 | index 3e73d5c6ccfc..119f3b504765 100644 |
7088 | --- a/sound/pci/hda/patch_ca0132.c |
7089 | +++ b/sound/pci/hda/patch_ca0132.c |
7090 | @@ -38,6 +38,10 @@ |
7091 | /* Enable this to see controls for tuning purpose. */ |
7092 | /*#define ENABLE_TUNING_CONTROLS*/ |
7093 | |
7094 | +#ifdef ENABLE_TUNING_CONTROLS |
7095 | +#include <sound/tlv.h> |
7096 | +#endif |
7097 | + |
7098 | #define FLOAT_ZERO 0x00000000 |
7099 | #define FLOAT_ONE 0x3f800000 |
7100 | #define FLOAT_TWO 0x40000000 |
7101 | @@ -3067,8 +3071,8 @@ static int equalizer_ctl_put(struct snd_kcontrol *kcontrol, |
7102 | return 1; |
7103 | } |
7104 | |
7105 | -static const DECLARE_TLV_DB_SCALE(voice_focus_db_scale, 2000, 100, 0); |
7106 | -static const DECLARE_TLV_DB_SCALE(eq_db_scale, -2400, 100, 0); |
7107 | +static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(voice_focus_db_scale, 2000, 100, 0); |
7108 | +static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(eq_db_scale, -2400, 100, 0); |
7109 | |
7110 | static int add_tuning_control(struct hda_codec *codec, |
7111 | hda_nid_t pnid, hda_nid_t nid, |
7112 | diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c |
7113 | index 94b88b897c3b..3d0dab8282ad 100644 |
7114 | --- a/sound/soc/soc-pcm.c |
7115 | +++ b/sound/soc/soc-pcm.c |
7116 | @@ -1779,8 +1779,10 @@ int dpcm_be_dai_shutdown(struct snd_soc_pcm_runtime *fe, int stream) |
7117 | continue; |
7118 | |
7119 | if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) && |
7120 | - (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)) |
7121 | - continue; |
7122 | + (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN)) { |
7123 | + soc_pcm_hw_free(be_substream); |
7124 | + be->dpcm[stream].state = SND_SOC_DPCM_STATE_HW_FREE; |
7125 | + } |
7126 | |
7127 | dev_dbg(be->dev, "ASoC: close BE %s\n", |
7128 | be->dai_link->name); |
7129 | diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c |
7130 | index 30cdad2eab7f..c1619860a5de 100644 |
7131 | --- a/sound/soc/soc-topology.c |
7132 | +++ b/sound/soc/soc-topology.c |
7133 | @@ -1997,6 +1997,13 @@ static void set_link_hw_format(struct snd_soc_dai_link *link, |
7134 | |
7135 | link->dai_fmt = hw_config->fmt & SND_SOC_DAIFMT_FORMAT_MASK; |
7136 | |
7137 | + /* clock gating */ |
7138 | + if (hw_config->clock_gated == SND_SOC_TPLG_DAI_CLK_GATE_GATED) |
7139 | + link->dai_fmt |= SND_SOC_DAIFMT_GATED; |
7140 | + else if (hw_config->clock_gated == |
7141 | + SND_SOC_TPLG_DAI_CLK_GATE_CONT) |
7142 | + link->dai_fmt |= SND_SOC_DAIFMT_CONT; |
7143 | + |
7144 | /* clock signal polarity */ |
7145 | invert_bclk = hw_config->invert_bclk; |
7146 | invert_fsync = hw_config->invert_fsync; |
7147 | @@ -2010,13 +2017,15 @@ static void set_link_hw_format(struct snd_soc_dai_link *link, |
7148 | link->dai_fmt |= SND_SOC_DAIFMT_IB_IF; |
7149 | |
7150 | /* clock masters */ |
7151 | - bclk_master = hw_config->bclk_master; |
7152 | - fsync_master = hw_config->fsync_master; |
7153 | - if (!bclk_master && !fsync_master) |
7154 | + bclk_master = (hw_config->bclk_master == |
7155 | + SND_SOC_TPLG_BCLK_CM); |
7156 | + fsync_master = (hw_config->fsync_master == |
7157 | + SND_SOC_TPLG_FSYNC_CM); |
7158 | + if (bclk_master && fsync_master) |
7159 | link->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM; |
7160 | - else if (bclk_master && !fsync_master) |
7161 | - link->dai_fmt |= SND_SOC_DAIFMT_CBS_CFM; |
7162 | else if (!bclk_master && fsync_master) |
7163 | + link->dai_fmt |= SND_SOC_DAIFMT_CBS_CFM; |
7164 | + else if (bclk_master && !fsync_master) |
7165 | link->dai_fmt |= SND_SOC_DAIFMT_CBM_CFS; |
7166 | else |
7167 | link->dai_fmt |= SND_SOC_DAIFMT_CBS_CFS; |
7168 | diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c |
7169 | index 3cbfae6604f9..d8a46d46bcd2 100644 |
7170 | --- a/sound/usb/pcm.c |
7171 | +++ b/sound/usb/pcm.c |
7172 | @@ -1311,7 +1311,7 @@ static void retire_capture_urb(struct snd_usb_substream *subs, |
7173 | if (bytes % (runtime->sample_bits >> 3) != 0) { |
7174 | int oldbytes = bytes; |
7175 | bytes = frames * stride; |
7176 | - dev_warn(&subs->dev->dev, |
7177 | + dev_warn_ratelimited(&subs->dev->dev, |
7178 | "Corrected urb data len. %d->%d\n", |
7179 | oldbytes, bytes); |
7180 | } |
7181 | diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y |
7182 | index e81a20ea8d7d..988310cd3049 100644 |
7183 | --- a/tools/perf/util/parse-events.y |
7184 | +++ b/tools/perf/util/parse-events.y |
7185 | @@ -72,6 +72,7 @@ static void inc_group_count(struct list_head *list, |
7186 | %type <num> value_sym |
7187 | %type <head> event_config |
7188 | %type <head> opt_event_config |
7189 | +%type <head> opt_pmu_config |
7190 | %type <term> event_term |
7191 | %type <head> event_pmu |
7192 | %type <head> event_legacy_symbol |
7193 | @@ -223,7 +224,7 @@ event_def: event_pmu | |
7194 | event_bpf_file |
7195 | |
7196 | event_pmu: |
7197 | -PE_NAME opt_event_config |
7198 | +PE_NAME opt_pmu_config |
7199 | { |
7200 | struct list_head *list, *orig_terms, *terms; |
7201 | |
7202 | @@ -486,6 +487,17 @@ opt_event_config: |
7203 | $$ = NULL; |
7204 | } |
7205 | |
7206 | +opt_pmu_config: |
7207 | +'/' event_config '/' |
7208 | +{ |
7209 | + $$ = $2; |
7210 | +} |
7211 | +| |
7212 | +'/' '/' |
7213 | +{ |
7214 | + $$ = NULL; |
7215 | +} |
7216 | + |
7217 | start_terms: event_config |
7218 | { |
7219 | struct parse_events_state *parse_state = _parse_state; |
7220 | diff --git a/tools/testing/selftests/intel_pstate/run.sh b/tools/testing/selftests/intel_pstate/run.sh |
7221 | index c670359becc6..928978804342 100755 |
7222 | --- a/tools/testing/selftests/intel_pstate/run.sh |
7223 | +++ b/tools/testing/selftests/intel_pstate/run.sh |
7224 | @@ -30,9 +30,12 @@ |
7225 | |
7226 | EVALUATE_ONLY=0 |
7227 | |
7228 | +# Kselftest framework requirement - SKIP code is 4. |
7229 | +ksft_skip=4 |
7230 | + |
7231 | if ! uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ | grep -q x86; then |
7232 | echo "$0 # Skipped: Test can only run on x86 architectures." |
7233 | - exit 0 |
7234 | + exit $ksft_skip |
7235 | fi |
7236 | |
7237 | max_cpus=$(($(nproc)-1)) |
7238 | @@ -48,11 +51,12 @@ function run_test () { |
7239 | |
7240 | echo "sleeping for 5 seconds" |
7241 | sleep 5 |
7242 | - num_freqs=$(cat /proc/cpuinfo | grep MHz | sort -u | wc -l) |
7243 | - if [ $num_freqs -le 2 ]; then |
7244 | - cat /proc/cpuinfo | grep MHz | sort -u | tail -1 > /tmp/result.$1 |
7245 | + grep MHz /proc/cpuinfo | sort -u > /tmp/result.freqs |
7246 | + num_freqs=$(wc -l /tmp/result.freqs | awk ' { print $1 } ') |
7247 | + if [ $num_freqs -ge 2 ]; then |
7248 | + tail -n 1 /tmp/result.freqs > /tmp/result.$1 |
7249 | else |
7250 | - cat /proc/cpuinfo | grep MHz | sort -u > /tmp/result.$1 |
7251 | + cp /tmp/result.freqs /tmp/result.$1 |
7252 | fi |
7253 | ./msr 0 >> /tmp/result.$1 |
7254 | |
7255 | @@ -82,21 +86,20 @@ _max_freq=$(cpupower frequency-info -l | tail -1 | awk ' { print $2 } ') |
7256 | max_freq=$(($_max_freq / 1000)) |
7257 | |
7258 | |
7259 | -for freq in `seq $max_freq -100 $min_freq` |
7260 | +[ $EVALUATE_ONLY -eq 0 ] && for freq in `seq $max_freq -100 $min_freq` |
7261 | do |
7262 | echo "Setting maximum frequency to $freq" |
7263 | cpupower frequency-set -g powersave --max=${freq}MHz >& /dev/null |
7264 | - [ $EVALUATE_ONLY -eq 0 ] && run_test $freq |
7265 | + run_test $freq |
7266 | done |
7267 | |
7268 | -echo "==============================================================================" |
7269 | +[ $EVALUATE_ONLY -eq 0 ] && cpupower frequency-set -g powersave --max=${max_freq}MHz >& /dev/null |
7270 | |
7271 | +echo "==============================================================================" |
7272 | echo "The marketing frequency of the cpu is $mkt_freq MHz" |
7273 | echo "The maximum frequency of the cpu is $max_freq MHz" |
7274 | echo "The minimum frequency of the cpu is $min_freq MHz" |
7275 | |
7276 | -cpupower frequency-set -g powersave --max=${max_freq}MHz >& /dev/null |
7277 | - |
7278 | # make a pretty table |
7279 | echo "Target Actual Difference MSR(0x199) max_perf_pct" |
7280 | for freq in `seq $max_freq -100 $min_freq` |
7281 | @@ -104,10 +107,6 @@ do |
7282 | result_freq=$(cat /tmp/result.${freq} | grep "cpu MHz" | awk ' { print $4 } ' | awk -F "." ' { print $1 } ') |
7283 | msr=$(cat /tmp/result.${freq} | grep "msr" | awk ' { print $3 } ') |
7284 | max_perf_pct=$(cat /tmp/result.${freq} | grep "max_perf_pct" | awk ' { print $2 } ' ) |
7285 | - if [ $result_freq -eq $freq ]; then |
7286 | - echo " $freq $result_freq 0 $msr $(($max_perf_pct*3300))" |
7287 | - else |
7288 | - echo " $freq $result_freq $(($result_freq-$freq)) $msr $(($max_perf_pct*$max_freq))" |
7289 | - fi |
7290 | + echo " $freq $result_freq $(($result_freq-$freq)) $msr $(($max_perf_pct*$max_freq))" |
7291 | done |
7292 | exit 0 |
7293 | diff --git a/tools/testing/selftests/memfd/run_tests.sh b/tools/testing/selftests/memfd/run_tests.sh |
7294 | index daabb350697c..bf83db61013a 100755 |
7295 | --- a/tools/testing/selftests/memfd/run_tests.sh |
7296 | +++ b/tools/testing/selftests/memfd/run_tests.sh |
7297 | @@ -1,6 +1,9 @@ |
7298 | #!/bin/bash |
7299 | # please run as root |
7300 | |
7301 | +# Kselftest framework requirement - SKIP code is 4. |
7302 | +ksft_skip=4 |
7303 | + |
7304 | # |
7305 | # Normal tests requiring no special resources |
7306 | # |
7307 | @@ -29,12 +32,13 @@ if [ -n "$freepgs" ] && [ $freepgs -lt $hpages_test ]; then |
7308 | nr_hugepgs=`cat /proc/sys/vm/nr_hugepages` |
7309 | hpages_needed=`expr $hpages_test - $freepgs` |
7310 | |
7311 | + if [ $UID != 0 ]; then |
7312 | + echo "Please run memfd with hugetlbfs test as root" |
7313 | + exit $ksft_skip |
7314 | + fi |
7315 | + |
7316 | echo 3 > /proc/sys/vm/drop_caches |
7317 | echo $(( $hpages_needed + $nr_hugepgs )) > /proc/sys/vm/nr_hugepages |
7318 | - if [ $? -ne 0 ]; then |
7319 | - echo "Please run this test as root" |
7320 | - exit 1 |
7321 | - fi |
7322 | while read name size unit; do |
7323 | if [ "$name" = "HugePages_Free:" ]; then |
7324 | freepgs=$size |
7325 | @@ -53,7 +57,7 @@ if [ $freepgs -lt $hpages_test ]; then |
7326 | fi |
7327 | printf "Not enough huge pages available (%d < %d)\n" \ |
7328 | $freepgs $needpgs |
7329 | - exit 1 |
7330 | + exit $ksft_skip |
7331 | fi |
7332 | |
7333 | # |
7334 | diff --git a/tools/usb/usbip/libsrc/vhci_driver.c b/tools/usb/usbip/libsrc/vhci_driver.c |
7335 | index d1fc0f9f00fb..ed8c9d360c0f 100644 |
7336 | --- a/tools/usb/usbip/libsrc/vhci_driver.c |
7337 | +++ b/tools/usb/usbip/libsrc/vhci_driver.c |
7338 | @@ -135,11 +135,11 @@ static int refresh_imported_device_list(void) |
7339 | return 0; |
7340 | } |
7341 | |
7342 | -static int get_nports(void) |
7343 | +static int get_nports(struct udev_device *hc_device) |
7344 | { |
7345 | const char *attr_nports; |
7346 | |
7347 | - attr_nports = udev_device_get_sysattr_value(vhci_driver->hc_device, "nports"); |
7348 | + attr_nports = udev_device_get_sysattr_value(hc_device, "nports"); |
7349 | if (!attr_nports) { |
7350 | err("udev_device_get_sysattr_value nports failed"); |
7351 | return -1; |
7352 | @@ -242,35 +242,41 @@ static int read_record(int rhport, char *host, unsigned long host_len, |
7353 | |
7354 | int usbip_vhci_driver_open(void) |
7355 | { |
7356 | + int nports; |
7357 | + struct udev_device *hc_device; |
7358 | + |
7359 | udev_context = udev_new(); |
7360 | if (!udev_context) { |
7361 | err("udev_new failed"); |
7362 | return -1; |
7363 | } |
7364 | |
7365 | - vhci_driver = calloc(1, sizeof(struct usbip_vhci_driver)); |
7366 | - |
7367 | /* will be freed in usbip_driver_close() */ |
7368 | - vhci_driver->hc_device = |
7369 | + hc_device = |
7370 | udev_device_new_from_subsystem_sysname(udev_context, |
7371 | USBIP_VHCI_BUS_TYPE, |
7372 | USBIP_VHCI_DEVICE_NAME); |
7373 | - if (!vhci_driver->hc_device) { |
7374 | + if (!hc_device) { |
7375 | err("udev_device_new_from_subsystem_sysname failed"); |
7376 | goto err; |
7377 | } |
7378 | |
7379 | - vhci_driver->nports = get_nports(); |
7380 | - dbg("available ports: %d", vhci_driver->nports); |
7381 | - |
7382 | - if (vhci_driver->nports <= 0) { |
7383 | + nports = get_nports(hc_device); |
7384 | + if (nports <= 0) { |
7385 | err("no available ports"); |
7386 | goto err; |
7387 | - } else if (vhci_driver->nports > MAXNPORT) { |
7388 | - err("port number exceeds %d", MAXNPORT); |
7389 | + } |
7390 | + dbg("available ports: %d", nports); |
7391 | + |
7392 | + vhci_driver = calloc(1, sizeof(struct usbip_vhci_driver) + |
7393 | + nports * sizeof(struct usbip_imported_device)); |
7394 | + if (!vhci_driver) { |
7395 | + err("vhci_driver allocation failed"); |
7396 | goto err; |
7397 | } |
7398 | |
7399 | + vhci_driver->nports = nports; |
7400 | + vhci_driver->hc_device = hc_device; |
7401 | vhci_driver->ncontrollers = get_ncontrollers(); |
7402 | dbg("available controllers: %d", vhci_driver->ncontrollers); |
7403 | |
7404 | @@ -285,7 +291,7 @@ int usbip_vhci_driver_open(void) |
7405 | return 0; |
7406 | |
7407 | err: |
7408 | - udev_device_unref(vhci_driver->hc_device); |
7409 | + udev_device_unref(hc_device); |
7410 | |
7411 | if (vhci_driver) |
7412 | free(vhci_driver); |
7413 | diff --git a/tools/usb/usbip/libsrc/vhci_driver.h b/tools/usb/usbip/libsrc/vhci_driver.h |
7414 | index 418b404d5121..6c9aca216705 100644 |
7415 | --- a/tools/usb/usbip/libsrc/vhci_driver.h |
7416 | +++ b/tools/usb/usbip/libsrc/vhci_driver.h |
7417 | @@ -13,7 +13,6 @@ |
7418 | |
7419 | #define USBIP_VHCI_BUS_TYPE "platform" |
7420 | #define USBIP_VHCI_DEVICE_NAME "vhci_hcd.0" |
7421 | -#define MAXNPORT 128 |
7422 | |
7423 | enum hub_speed { |
7424 | HUB_SPEED_HIGH = 0, |
7425 | @@ -41,7 +40,7 @@ struct usbip_vhci_driver { |
7426 | |
7427 | int ncontrollers; |
7428 | int nports; |
7429 | - struct usbip_imported_device idev[MAXNPORT]; |
7430 | + struct usbip_imported_device idev[]; |
7431 | }; |
7432 | |
7433 | |
7434 | diff --git a/tools/usb/usbip/src/usbip_detach.c b/tools/usb/usbip/src/usbip_detach.c |
7435 | index 9db9d21bb2ec..6a8db858caa5 100644 |
7436 | --- a/tools/usb/usbip/src/usbip_detach.c |
7437 | +++ b/tools/usb/usbip/src/usbip_detach.c |
7438 | @@ -43,7 +43,7 @@ void usbip_detach_usage(void) |
7439 | |
7440 | static int detach_port(char *port) |
7441 | { |
7442 | - int ret; |
7443 | + int ret = 0; |
7444 | uint8_t portnum; |
7445 | char path[PATH_MAX+1]; |
7446 | |
7447 | @@ -73,9 +73,12 @@ static int detach_port(char *port) |
7448 | } |
7449 | |
7450 | ret = usbip_vhci_detach_device(portnum); |
7451 | - if (ret < 0) |
7452 | - return -1; |
7453 | + if (ret < 0) { |
7454 | + ret = -1; |
7455 | + goto call_driver_close; |
7456 | + } |
7457 | |
7458 | +call_driver_close: |
7459 | usbip_vhci_driver_close(); |
7460 | |
7461 | return ret; |