Annotation of /trunk/kernel-alx/patches-3.18/0110-3.18.11-all-fixes.patch
Parent Directory | Revision Log
Revision 2611 -
(hide annotations)
(download)
Mon Jul 13 08:28:35 2015 UTC (9 years, 2 months ago) by niro
File size: 118605 byte(s)
Mon Jul 13 08:28:35 2015 UTC (9 years, 2 months ago) by niro
File size: 118605 byte(s)
-linux-3.18.11
1 | niro | 2611 | diff --git a/Makefile b/Makefile |
2 | index d4ce2cb674c8..da8dc1350de3 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 3 | ||
7 | PATCHLEVEL = 18 | ||
8 | -SUBLEVEL = 10 | ||
9 | +SUBLEVEL = 11 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Diseased Newt | ||
12 | |||
13 | diff --git a/arch/arm/boot/dts/am33xx-clocks.dtsi b/arch/arm/boot/dts/am33xx-clocks.dtsi | ||
14 | index 712edce7d6fb..071b56aa0c7e 100644 | ||
15 | --- a/arch/arm/boot/dts/am33xx-clocks.dtsi | ||
16 | +++ b/arch/arm/boot/dts/am33xx-clocks.dtsi | ||
17 | @@ -99,7 +99,7 @@ | ||
18 | ehrpwm0_tbclk: ehrpwm0_tbclk@44e10664 { | ||
19 | #clock-cells = <0>; | ||
20 | compatible = "ti,gate-clock"; | ||
21 | - clocks = <&dpll_per_m2_ck>; | ||
22 | + clocks = <&l4ls_gclk>; | ||
23 | ti,bit-shift = <0>; | ||
24 | reg = <0x0664>; | ||
25 | }; | ||
26 | @@ -107,7 +107,7 @@ | ||
27 | ehrpwm1_tbclk: ehrpwm1_tbclk@44e10664 { | ||
28 | #clock-cells = <0>; | ||
29 | compatible = "ti,gate-clock"; | ||
30 | - clocks = <&dpll_per_m2_ck>; | ||
31 | + clocks = <&l4ls_gclk>; | ||
32 | ti,bit-shift = <1>; | ||
33 | reg = <0x0664>; | ||
34 | }; | ||
35 | @@ -115,7 +115,7 @@ | ||
36 | ehrpwm2_tbclk: ehrpwm2_tbclk@44e10664 { | ||
37 | #clock-cells = <0>; | ||
38 | compatible = "ti,gate-clock"; | ||
39 | - clocks = <&dpll_per_m2_ck>; | ||
40 | + clocks = <&l4ls_gclk>; | ||
41 | ti,bit-shift = <2>; | ||
42 | reg = <0x0664>; | ||
43 | }; | ||
44 | diff --git a/arch/arm/boot/dts/am43xx-clocks.dtsi b/arch/arm/boot/dts/am43xx-clocks.dtsi | ||
45 | index c7dc9dab93a4..cfb49686ab6a 100644 | ||
46 | --- a/arch/arm/boot/dts/am43xx-clocks.dtsi | ||
47 | +++ b/arch/arm/boot/dts/am43xx-clocks.dtsi | ||
48 | @@ -107,7 +107,7 @@ | ||
49 | ehrpwm0_tbclk: ehrpwm0_tbclk { | ||
50 | #clock-cells = <0>; | ||
51 | compatible = "ti,gate-clock"; | ||
52 | - clocks = <&dpll_per_m2_ck>; | ||
53 | + clocks = <&l4ls_gclk>; | ||
54 | ti,bit-shift = <0>; | ||
55 | reg = <0x0664>; | ||
56 | }; | ||
57 | @@ -115,7 +115,7 @@ | ||
58 | ehrpwm1_tbclk: ehrpwm1_tbclk { | ||
59 | #clock-cells = <0>; | ||
60 | compatible = "ti,gate-clock"; | ||
61 | - clocks = <&dpll_per_m2_ck>; | ||
62 | + clocks = <&l4ls_gclk>; | ||
63 | ti,bit-shift = <1>; | ||
64 | reg = <0x0664>; | ||
65 | }; | ||
66 | @@ -123,7 +123,7 @@ | ||
67 | ehrpwm2_tbclk: ehrpwm2_tbclk { | ||
68 | #clock-cells = <0>; | ||
69 | compatible = "ti,gate-clock"; | ||
70 | - clocks = <&dpll_per_m2_ck>; | ||
71 | + clocks = <&l4ls_gclk>; | ||
72 | ti,bit-shift = <2>; | ||
73 | reg = <0x0664>; | ||
74 | }; | ||
75 | @@ -131,7 +131,7 @@ | ||
76 | ehrpwm3_tbclk: ehrpwm3_tbclk { | ||
77 | #clock-cells = <0>; | ||
78 | compatible = "ti,gate-clock"; | ||
79 | - clocks = <&dpll_per_m2_ck>; | ||
80 | + clocks = <&l4ls_gclk>; | ||
81 | ti,bit-shift = <4>; | ||
82 | reg = <0x0664>; | ||
83 | }; | ||
84 | @@ -139,7 +139,7 @@ | ||
85 | ehrpwm4_tbclk: ehrpwm4_tbclk { | ||
86 | #clock-cells = <0>; | ||
87 | compatible = "ti,gate-clock"; | ||
88 | - clocks = <&dpll_per_m2_ck>; | ||
89 | + clocks = <&l4ls_gclk>; | ||
90 | ti,bit-shift = <5>; | ||
91 | reg = <0x0664>; | ||
92 | }; | ||
93 | @@ -147,7 +147,7 @@ | ||
94 | ehrpwm5_tbclk: ehrpwm5_tbclk { | ||
95 | #clock-cells = <0>; | ||
96 | compatible = "ti,gate-clock"; | ||
97 | - clocks = <&dpll_per_m2_ck>; | ||
98 | + clocks = <&l4ls_gclk>; | ||
99 | ti,bit-shift = <6>; | ||
100 | reg = <0x0664>; | ||
101 | }; | ||
102 | diff --git a/arch/arm/boot/dts/dra7xx-clocks.dtsi b/arch/arm/boot/dts/dra7xx-clocks.dtsi | ||
103 | index 2c05b3f017fa..64c0f75b5444 100644 | ||
104 | --- a/arch/arm/boot/dts/dra7xx-clocks.dtsi | ||
105 | +++ b/arch/arm/boot/dts/dra7xx-clocks.dtsi | ||
106 | @@ -243,10 +243,18 @@ | ||
107 | ti,invert-autoidle-bit; | ||
108 | }; | ||
109 | |||
110 | + dpll_core_byp_mux: dpll_core_byp_mux { | ||
111 | + #clock-cells = <0>; | ||
112 | + compatible = "ti,mux-clock"; | ||
113 | + clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
114 | + ti,bit-shift = <23>; | ||
115 | + reg = <0x012c>; | ||
116 | + }; | ||
117 | + | ||
118 | dpll_core_ck: dpll_core_ck { | ||
119 | #clock-cells = <0>; | ||
120 | compatible = "ti,omap4-dpll-core-clock"; | ||
121 | - clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
122 | + clocks = <&sys_clkin1>, <&dpll_core_byp_mux>; | ||
123 | reg = <0x0120>, <0x0124>, <0x012c>, <0x0128>; | ||
124 | }; | ||
125 | |||
126 | @@ -309,10 +317,18 @@ | ||
127 | clock-div = <1>; | ||
128 | }; | ||
129 | |||
130 | + dpll_dsp_byp_mux: dpll_dsp_byp_mux { | ||
131 | + #clock-cells = <0>; | ||
132 | + compatible = "ti,mux-clock"; | ||
133 | + clocks = <&sys_clkin1>, <&dsp_dpll_hs_clk_div>; | ||
134 | + ti,bit-shift = <23>; | ||
135 | + reg = <0x0240>; | ||
136 | + }; | ||
137 | + | ||
138 | dpll_dsp_ck: dpll_dsp_ck { | ||
139 | #clock-cells = <0>; | ||
140 | compatible = "ti,omap4-dpll-clock"; | ||
141 | - clocks = <&sys_clkin1>, <&dsp_dpll_hs_clk_div>; | ||
142 | + clocks = <&sys_clkin1>, <&dpll_dsp_byp_mux>; | ||
143 | reg = <0x0234>, <0x0238>, <0x0240>, <0x023c>; | ||
144 | }; | ||
145 | |||
146 | @@ -335,10 +351,18 @@ | ||
147 | clock-div = <1>; | ||
148 | }; | ||
149 | |||
150 | + dpll_iva_byp_mux: dpll_iva_byp_mux { | ||
151 | + #clock-cells = <0>; | ||
152 | + compatible = "ti,mux-clock"; | ||
153 | + clocks = <&sys_clkin1>, <&iva_dpll_hs_clk_div>; | ||
154 | + ti,bit-shift = <23>; | ||
155 | + reg = <0x01ac>; | ||
156 | + }; | ||
157 | + | ||
158 | dpll_iva_ck: dpll_iva_ck { | ||
159 | #clock-cells = <0>; | ||
160 | compatible = "ti,omap4-dpll-clock"; | ||
161 | - clocks = <&sys_clkin1>, <&iva_dpll_hs_clk_div>; | ||
162 | + clocks = <&sys_clkin1>, <&dpll_iva_byp_mux>; | ||
163 | reg = <0x01a0>, <0x01a4>, <0x01ac>, <0x01a8>; | ||
164 | }; | ||
165 | |||
166 | @@ -361,10 +385,18 @@ | ||
167 | clock-div = <1>; | ||
168 | }; | ||
169 | |||
170 | + dpll_gpu_byp_mux: dpll_gpu_byp_mux { | ||
171 | + #clock-cells = <0>; | ||
172 | + compatible = "ti,mux-clock"; | ||
173 | + clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
174 | + ti,bit-shift = <23>; | ||
175 | + reg = <0x02e4>; | ||
176 | + }; | ||
177 | + | ||
178 | dpll_gpu_ck: dpll_gpu_ck { | ||
179 | #clock-cells = <0>; | ||
180 | compatible = "ti,omap4-dpll-clock"; | ||
181 | - clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
182 | + clocks = <&sys_clkin1>, <&dpll_gpu_byp_mux>; | ||
183 | reg = <0x02d8>, <0x02dc>, <0x02e4>, <0x02e0>; | ||
184 | }; | ||
185 | |||
186 | @@ -398,10 +430,18 @@ | ||
187 | clock-div = <1>; | ||
188 | }; | ||
189 | |||
190 | + dpll_ddr_byp_mux: dpll_ddr_byp_mux { | ||
191 | + #clock-cells = <0>; | ||
192 | + compatible = "ti,mux-clock"; | ||
193 | + clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
194 | + ti,bit-shift = <23>; | ||
195 | + reg = <0x021c>; | ||
196 | + }; | ||
197 | + | ||
198 | dpll_ddr_ck: dpll_ddr_ck { | ||
199 | #clock-cells = <0>; | ||
200 | compatible = "ti,omap4-dpll-clock"; | ||
201 | - clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
202 | + clocks = <&sys_clkin1>, <&dpll_ddr_byp_mux>; | ||
203 | reg = <0x0210>, <0x0214>, <0x021c>, <0x0218>; | ||
204 | }; | ||
205 | |||
206 | @@ -416,10 +456,18 @@ | ||
207 | ti,invert-autoidle-bit; | ||
208 | }; | ||
209 | |||
210 | + dpll_gmac_byp_mux: dpll_gmac_byp_mux { | ||
211 | + #clock-cells = <0>; | ||
212 | + compatible = "ti,mux-clock"; | ||
213 | + clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
214 | + ti,bit-shift = <23>; | ||
215 | + reg = <0x02b4>; | ||
216 | + }; | ||
217 | + | ||
218 | dpll_gmac_ck: dpll_gmac_ck { | ||
219 | #clock-cells = <0>; | ||
220 | compatible = "ti,omap4-dpll-clock"; | ||
221 | - clocks = <&sys_clkin1>, <&dpll_abe_m3x2_ck>; | ||
222 | + clocks = <&sys_clkin1>, <&dpll_gmac_byp_mux>; | ||
223 | reg = <0x02a8>, <0x02ac>, <0x02b4>, <0x02b0>; | ||
224 | }; | ||
225 | |||
226 | @@ -482,10 +530,18 @@ | ||
227 | clock-div = <1>; | ||
228 | }; | ||
229 | |||
230 | + dpll_eve_byp_mux: dpll_eve_byp_mux { | ||
231 | + #clock-cells = <0>; | ||
232 | + compatible = "ti,mux-clock"; | ||
233 | + clocks = <&sys_clkin1>, <&eve_dpll_hs_clk_div>; | ||
234 | + ti,bit-shift = <23>; | ||
235 | + reg = <0x0290>; | ||
236 | + }; | ||
237 | + | ||
238 | dpll_eve_ck: dpll_eve_ck { | ||
239 | #clock-cells = <0>; | ||
240 | compatible = "ti,omap4-dpll-clock"; | ||
241 | - clocks = <&sys_clkin1>, <&eve_dpll_hs_clk_div>; | ||
242 | + clocks = <&sys_clkin1>, <&dpll_eve_byp_mux>; | ||
243 | reg = <0x0284>, <0x0288>, <0x0290>, <0x028c>; | ||
244 | }; | ||
245 | |||
246 | @@ -1249,10 +1305,18 @@ | ||
247 | clock-div = <1>; | ||
248 | }; | ||
249 | |||
250 | + dpll_per_byp_mux: dpll_per_byp_mux { | ||
251 | + #clock-cells = <0>; | ||
252 | + compatible = "ti,mux-clock"; | ||
253 | + clocks = <&sys_clkin1>, <&per_dpll_hs_clk_div>; | ||
254 | + ti,bit-shift = <23>; | ||
255 | + reg = <0x014c>; | ||
256 | + }; | ||
257 | + | ||
258 | dpll_per_ck: dpll_per_ck { | ||
259 | #clock-cells = <0>; | ||
260 | compatible = "ti,omap4-dpll-clock"; | ||
261 | - clocks = <&sys_clkin1>, <&per_dpll_hs_clk_div>; | ||
262 | + clocks = <&sys_clkin1>, <&dpll_per_byp_mux>; | ||
263 | reg = <0x0140>, <0x0144>, <0x014c>, <0x0148>; | ||
264 | }; | ||
265 | |||
266 | @@ -1275,10 +1339,18 @@ | ||
267 | clock-div = <1>; | ||
268 | }; | ||
269 | |||
270 | + dpll_usb_byp_mux: dpll_usb_byp_mux { | ||
271 | + #clock-cells = <0>; | ||
272 | + compatible = "ti,mux-clock"; | ||
273 | + clocks = <&sys_clkin1>, <&usb_dpll_hs_clk_div>; | ||
274 | + ti,bit-shift = <23>; | ||
275 | + reg = <0x018c>; | ||
276 | + }; | ||
277 | + | ||
278 | dpll_usb_ck: dpll_usb_ck { | ||
279 | #clock-cells = <0>; | ||
280 | compatible = "ti,omap4-dpll-j-type-clock"; | ||
281 | - clocks = <&sys_clkin1>, <&usb_dpll_hs_clk_div>; | ||
282 | + clocks = <&sys_clkin1>, <&dpll_usb_byp_mux>; | ||
283 | reg = <0x0180>, <0x0184>, <0x018c>, <0x0188>; | ||
284 | }; | ||
285 | |||
286 | diff --git a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi | ||
287 | index baf2f00d519a..b57e554dba4e 100644 | ||
288 | --- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi | ||
289 | +++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi | ||
290 | @@ -35,6 +35,7 @@ | ||
291 | regulator-max-microvolt = <5000000>; | ||
292 | gpio = <&gpio3 22 0>; | ||
293 | enable-active-high; | ||
294 | + vin-supply = <&swbst_reg>; | ||
295 | }; | ||
296 | |||
297 | reg_usb_h1_vbus: regulator@1 { | ||
298 | @@ -45,6 +46,7 @@ | ||
299 | regulator-max-microvolt = <5000000>; | ||
300 | gpio = <&gpio1 29 0>; | ||
301 | enable-active-high; | ||
302 | + vin-supply = <&swbst_reg>; | ||
303 | }; | ||
304 | |||
305 | reg_audio: regulator@2 { | ||
306 | diff --git a/arch/arm/crypto/aesbs-core.S_shipped b/arch/arm/crypto/aesbs-core.S_shipped | ||
307 | index 71e5fc7cfb18..1d1800f71c5b 100644 | ||
308 | --- a/arch/arm/crypto/aesbs-core.S_shipped | ||
309 | +++ b/arch/arm/crypto/aesbs-core.S_shipped | ||
310 | @@ -58,14 +58,18 @@ | ||
311 | # define VFP_ABI_FRAME 0 | ||
312 | # define BSAES_ASM_EXTENDED_KEY | ||
313 | # define XTS_CHAIN_TWEAK | ||
314 | -# define __ARM_ARCH__ 7 | ||
315 | +# define __ARM_ARCH__ __LINUX_ARM_ARCH__ | ||
316 | +# define __ARM_MAX_ARCH__ 7 | ||
317 | #endif | ||
318 | |||
319 | #ifdef __thumb__ | ||
320 | # define adrl adr | ||
321 | #endif | ||
322 | |||
323 | -#if __ARM_ARCH__>=7 | ||
324 | +#if __ARM_MAX_ARCH__>=7 | ||
325 | +.arch armv7-a | ||
326 | +.fpu neon | ||
327 | + | ||
328 | .text | ||
329 | .syntax unified @ ARMv7-capable assembler is expected to handle this | ||
330 | #ifdef __thumb2__ | ||
331 | @@ -74,8 +78,6 @@ | ||
332 | .code 32 | ||
333 | #endif | ||
334 | |||
335 | -.fpu neon | ||
336 | - | ||
337 | .type _bsaes_decrypt8,%function | ||
338 | .align 4 | ||
339 | _bsaes_decrypt8: | ||
340 | @@ -2095,9 +2097,11 @@ bsaes_xts_decrypt: | ||
341 | vld1.8 {q8}, [r0] @ initial tweak | ||
342 | adr r2, .Lxts_magic | ||
343 | |||
344 | +#ifndef XTS_CHAIN_TWEAK | ||
345 | tst r9, #0xf @ if not multiple of 16 | ||
346 | it ne @ Thumb2 thing, sanity check in ARM | ||
347 | subne r9, #0x10 @ subtract another 16 bytes | ||
348 | +#endif | ||
349 | subs r9, #0x80 | ||
350 | |||
351 | blo .Lxts_dec_short | ||
352 | diff --git a/arch/arm/crypto/bsaes-armv7.pl b/arch/arm/crypto/bsaes-armv7.pl | ||
353 | index be068db960ee..a4d3856e7d24 100644 | ||
354 | --- a/arch/arm/crypto/bsaes-armv7.pl | ||
355 | +++ b/arch/arm/crypto/bsaes-armv7.pl | ||
356 | @@ -701,14 +701,18 @@ $code.=<<___; | ||
357 | # define VFP_ABI_FRAME 0 | ||
358 | # define BSAES_ASM_EXTENDED_KEY | ||
359 | # define XTS_CHAIN_TWEAK | ||
360 | -# define __ARM_ARCH__ 7 | ||
361 | +# define __ARM_ARCH__ __LINUX_ARM_ARCH__ | ||
362 | +# define __ARM_MAX_ARCH__ 7 | ||
363 | #endif | ||
364 | |||
365 | #ifdef __thumb__ | ||
366 | # define adrl adr | ||
367 | #endif | ||
368 | |||
369 | -#if __ARM_ARCH__>=7 | ||
370 | +#if __ARM_MAX_ARCH__>=7 | ||
371 | +.arch armv7-a | ||
372 | +.fpu neon | ||
373 | + | ||
374 | .text | ||
375 | .syntax unified @ ARMv7-capable assembler is expected to handle this | ||
376 | #ifdef __thumb2__ | ||
377 | @@ -717,8 +721,6 @@ $code.=<<___; | ||
378 | .code 32 | ||
379 | #endif | ||
380 | |||
381 | -.fpu neon | ||
382 | - | ||
383 | .type _bsaes_decrypt8,%function | ||
384 | .align 4 | ||
385 | _bsaes_decrypt8: | ||
386 | @@ -2076,9 +2078,11 @@ bsaes_xts_decrypt: | ||
387 | vld1.8 {@XMM[8]}, [r0] @ initial tweak | ||
388 | adr $magic, .Lxts_magic | ||
389 | |||
390 | +#ifndef XTS_CHAIN_TWEAK | ||
391 | tst $len, #0xf @ if not multiple of 16 | ||
392 | it ne @ Thumb2 thing, sanity check in ARM | ||
393 | subne $len, #0x10 @ subtract another 16 bytes | ||
394 | +#endif | ||
395 | subs $len, #0x80 | ||
396 | |||
397 | blo .Lxts_dec_short | ||
398 | diff --git a/arch/arm/mach-at91/pm.h b/arch/arm/mach-at91/pm.h | ||
399 | index c5101dcb4fb0..1d4df3b70ebc 100644 | ||
400 | --- a/arch/arm/mach-at91/pm.h | ||
401 | +++ b/arch/arm/mach-at91/pm.h | ||
402 | @@ -45,7 +45,7 @@ static inline void at91rm9200_standby(void) | ||
403 | " mcr p15, 0, %0, c7, c0, 4\n\t" | ||
404 | " str %5, [%1, %2]" | ||
405 | : | ||
406 | - : "r" (0), "r" (AT91_BASE_SYS), "r" (AT91RM9200_SDRAMC_LPR), | ||
407 | + : "r" (0), "r" (at91_ramc_base[0]), "r" (AT91RM9200_SDRAMC_LPR), | ||
408 | "r" (1), "r" (AT91RM9200_SDRAMC_SRR), | ||
409 | "r" (lpr)); | ||
410 | } | ||
411 | diff --git a/arch/arm64/include/asm/tlb.h b/arch/arm64/include/asm/tlb.h | ||
412 | index a82c0c5c8b52..53d9c354219f 100644 | ||
413 | --- a/arch/arm64/include/asm/tlb.h | ||
414 | +++ b/arch/arm64/include/asm/tlb.h | ||
415 | @@ -19,10 +19,6 @@ | ||
416 | #ifndef __ASM_TLB_H | ||
417 | #define __ASM_TLB_H | ||
418 | |||
419 | -#define __tlb_remove_pmd_tlb_entry __tlb_remove_pmd_tlb_entry | ||
420 | - | ||
421 | -#include <asm-generic/tlb.h> | ||
422 | - | ||
423 | #include <linux/pagemap.h> | ||
424 | #include <linux/swap.h> | ||
425 | |||
426 | @@ -37,71 +33,23 @@ static inline void __tlb_remove_table(void *_table) | ||
427 | #define tlb_remove_entry(tlb, entry) tlb_remove_page(tlb, entry) | ||
428 | #endif /* CONFIG_HAVE_RCU_TABLE_FREE */ | ||
429 | |||
430 | -/* | ||
431 | - * There's three ways the TLB shootdown code is used: | ||
432 | - * 1. Unmapping a range of vmas. See zap_page_range(), unmap_region(). | ||
433 | - * tlb->fullmm = 0, and tlb_start_vma/tlb_end_vma will be called. | ||
434 | - * 2. Unmapping all vmas. See exit_mmap(). | ||
435 | - * tlb->fullmm = 1, and tlb_start_vma/tlb_end_vma will be called. | ||
436 | - * Page tables will be freed. | ||
437 | - * 3. Unmapping argument pages. See shift_arg_pages(). | ||
438 | - * tlb->fullmm = 0, but tlb_start_vma/tlb_end_vma will not be called. | ||
439 | - */ | ||
440 | +#include <asm-generic/tlb.h> | ||
441 | + | ||
442 | static inline void tlb_flush(struct mmu_gather *tlb) | ||
443 | { | ||
444 | if (tlb->fullmm) { | ||
445 | flush_tlb_mm(tlb->mm); | ||
446 | - } else if (tlb->end > 0) { | ||
447 | + } else { | ||
448 | struct vm_area_struct vma = { .vm_mm = tlb->mm, }; | ||
449 | flush_tlb_range(&vma, tlb->start, tlb->end); | ||
450 | - tlb->start = TASK_SIZE; | ||
451 | - tlb->end = 0; | ||
452 | - } | ||
453 | -} | ||
454 | - | ||
455 | -static inline void tlb_add_flush(struct mmu_gather *tlb, unsigned long addr) | ||
456 | -{ | ||
457 | - if (!tlb->fullmm) { | ||
458 | - tlb->start = min(tlb->start, addr); | ||
459 | - tlb->end = max(tlb->end, addr + PAGE_SIZE); | ||
460 | - } | ||
461 | -} | ||
462 | - | ||
463 | -/* | ||
464 | - * Memorize the range for the TLB flush. | ||
465 | - */ | ||
466 | -static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, | ||
467 | - unsigned long addr) | ||
468 | -{ | ||
469 | - tlb_add_flush(tlb, addr); | ||
470 | -} | ||
471 | - | ||
472 | -/* | ||
473 | - * In the case of tlb vma handling, we can optimise these away in the | ||
474 | - * case where we're doing a full MM flush. When we're doing a munmap, | ||
475 | - * the vmas are adjusted to only cover the region to be torn down. | ||
476 | - */ | ||
477 | -static inline void tlb_start_vma(struct mmu_gather *tlb, | ||
478 | - struct vm_area_struct *vma) | ||
479 | -{ | ||
480 | - if (!tlb->fullmm) { | ||
481 | - tlb->start = TASK_SIZE; | ||
482 | - tlb->end = 0; | ||
483 | } | ||
484 | } | ||
485 | |||
486 | -static inline void tlb_end_vma(struct mmu_gather *tlb, | ||
487 | - struct vm_area_struct *vma) | ||
488 | -{ | ||
489 | - if (!tlb->fullmm) | ||
490 | - tlb_flush(tlb); | ||
491 | -} | ||
492 | - | ||
493 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | ||
494 | unsigned long addr) | ||
495 | { | ||
496 | + __flush_tlb_pgtable(tlb->mm, addr); | ||
497 | pgtable_page_dtor(pte); | ||
498 | - tlb_add_flush(tlb, addr); | ||
499 | tlb_remove_entry(tlb, pte); | ||
500 | } | ||
501 | |||
502 | @@ -109,7 +57,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | ||
503 | static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, | ||
504 | unsigned long addr) | ||
505 | { | ||
506 | - tlb_add_flush(tlb, addr); | ||
507 | + __flush_tlb_pgtable(tlb->mm, addr); | ||
508 | tlb_remove_entry(tlb, virt_to_page(pmdp)); | ||
509 | } | ||
510 | #endif | ||
511 | @@ -118,15 +66,9 @@ static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, | ||
512 | static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pudp, | ||
513 | unsigned long addr) | ||
514 | { | ||
515 | - tlb_add_flush(tlb, addr); | ||
516 | + __flush_tlb_pgtable(tlb->mm, addr); | ||
517 | tlb_remove_entry(tlb, virt_to_page(pudp)); | ||
518 | } | ||
519 | #endif | ||
520 | |||
521 | -static inline void __tlb_remove_pmd_tlb_entry(struct mmu_gather *tlb, pmd_t *pmdp, | ||
522 | - unsigned long address) | ||
523 | -{ | ||
524 | - tlb_add_flush(tlb, address); | ||
525 | -} | ||
526 | - | ||
527 | #endif | ||
528 | diff --git a/arch/arm64/include/asm/tlbflush.h b/arch/arm64/include/asm/tlbflush.h | ||
529 | index 73f0ce570fb3..8b8d8cb46e01 100644 | ||
530 | --- a/arch/arm64/include/asm/tlbflush.h | ||
531 | +++ b/arch/arm64/include/asm/tlbflush.h | ||
532 | @@ -149,6 +149,19 @@ static inline void flush_tlb_kernel_range(unsigned long start, unsigned long end | ||
533 | } | ||
534 | |||
535 | /* | ||
536 | + * Used to invalidate the TLB (walk caches) corresponding to intermediate page | ||
537 | + * table levels (pgd/pud/pmd). | ||
538 | + */ | ||
539 | +static inline void __flush_tlb_pgtable(struct mm_struct *mm, | ||
540 | + unsigned long uaddr) | ||
541 | +{ | ||
542 | + unsigned long addr = uaddr >> 12 | ((unsigned long)ASID(mm) << 48); | ||
543 | + | ||
544 | + dsb(ishst); | ||
545 | + asm("tlbi vae1is, %0" : : "r" (addr)); | ||
546 | + dsb(ish); | ||
547 | +} | ||
548 | +/* | ||
549 | * On AArch64, the cache coherency is handled via the set_pte_at() function. | ||
550 | */ | ||
551 | static inline void update_mmu_cache(struct vm_area_struct *vma, | ||
552 | diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c | ||
553 | index d92094203913..df34a70caca1 100644 | ||
554 | --- a/arch/arm64/mm/dma-mapping.c | ||
555 | +++ b/arch/arm64/mm/dma-mapping.c | ||
556 | @@ -51,7 +51,7 @@ static int __init early_coherent_pool(char *p) | ||
557 | } | ||
558 | early_param("coherent_pool", early_coherent_pool); | ||
559 | |||
560 | -static void *__alloc_from_pool(size_t size, struct page **ret_page) | ||
561 | +static void *__alloc_from_pool(size_t size, struct page **ret_page, gfp_t flags) | ||
562 | { | ||
563 | unsigned long val; | ||
564 | void *ptr = NULL; | ||
565 | @@ -67,6 +67,8 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page) | ||
566 | |||
567 | *ret_page = phys_to_page(phys); | ||
568 | ptr = (void *)val; | ||
569 | + if (flags & __GFP_ZERO) | ||
570 | + memset(ptr, 0, size); | ||
571 | } | ||
572 | |||
573 | return ptr; | ||
574 | @@ -101,6 +103,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size, | ||
575 | flags |= GFP_DMA; | ||
576 | if (IS_ENABLED(CONFIG_DMA_CMA) && (flags & __GFP_WAIT)) { | ||
577 | struct page *page; | ||
578 | + void *addr; | ||
579 | |||
580 | size = PAGE_ALIGN(size); | ||
581 | page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT, | ||
582 | @@ -109,7 +112,10 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size, | ||
583 | return NULL; | ||
584 | |||
585 | *dma_handle = phys_to_dma(dev, page_to_phys(page)); | ||
586 | - return page_address(page); | ||
587 | + addr = page_address(page); | ||
588 | + if (flags & __GFP_ZERO) | ||
589 | + memset(addr, 0, size); | ||
590 | + return addr; | ||
591 | } else { | ||
592 | return swiotlb_alloc_coherent(dev, size, dma_handle, flags); | ||
593 | } | ||
594 | @@ -145,7 +151,7 @@ static void *__dma_alloc_noncoherent(struct device *dev, size_t size, | ||
595 | |||
596 | if (!(flags & __GFP_WAIT)) { | ||
597 | struct page *page = NULL; | ||
598 | - void *addr = __alloc_from_pool(size, &page); | ||
599 | + void *addr = __alloc_from_pool(size, &page, flags); | ||
600 | |||
601 | if (addr) | ||
602 | *dma_handle = phys_to_dma(dev, page_to_phys(page)); | ||
603 | diff --git a/arch/microblaze/include/asm/tlb.h b/arch/microblaze/include/asm/tlb.h | ||
604 | index 8aa97817cc8c..99b6ded54849 100644 | ||
605 | --- a/arch/microblaze/include/asm/tlb.h | ||
606 | +++ b/arch/microblaze/include/asm/tlb.h | ||
607 | @@ -14,7 +14,6 @@ | ||
608 | #define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) | ||
609 | |||
610 | #include <linux/pagemap.h> | ||
611 | -#include <asm-generic/tlb.h> | ||
612 | |||
613 | #ifdef CONFIG_MMU | ||
614 | #define tlb_start_vma(tlb, vma) do { } while (0) | ||
615 | @@ -22,4 +21,6 @@ | ||
616 | #define __tlb_remove_tlb_entry(tlb, pte, address) do { } while (0) | ||
617 | #endif | ||
618 | |||
619 | +#include <asm-generic/tlb.h> | ||
620 | + | ||
621 | #endif /* _ASM_MICROBLAZE_TLB_H */ | ||
622 | diff --git a/arch/powerpc/include/asm/pgalloc.h b/arch/powerpc/include/asm/pgalloc.h | ||
623 | index e9a9f60e596d..fc3ee06eab87 100644 | ||
624 | --- a/arch/powerpc/include/asm/pgalloc.h | ||
625 | +++ b/arch/powerpc/include/asm/pgalloc.h | ||
626 | @@ -3,7 +3,6 @@ | ||
627 | #ifdef __KERNEL__ | ||
628 | |||
629 | #include <linux/mm.h> | ||
630 | -#include <asm-generic/tlb.h> | ||
631 | |||
632 | #ifdef CONFIG_PPC_BOOK3E | ||
633 | extern void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address); | ||
634 | @@ -14,6 +13,8 @@ static inline void tlb_flush_pgtable(struct mmu_gather *tlb, | ||
635 | } | ||
636 | #endif /* !CONFIG_PPC_BOOK3E */ | ||
637 | |||
638 | +extern void tlb_remove_table(struct mmu_gather *tlb, void *table); | ||
639 | + | ||
640 | #ifdef CONFIG_PPC64 | ||
641 | #include <asm/pgalloc-64.h> | ||
642 | #else | ||
643 | diff --git a/arch/powerpc/include/asm/tlb.h b/arch/powerpc/include/asm/tlb.h | ||
644 | index e2b428b0f7ba..20733fa518ae 100644 | ||
645 | --- a/arch/powerpc/include/asm/tlb.h | ||
646 | +++ b/arch/powerpc/include/asm/tlb.h | ||
647 | @@ -27,6 +27,7 @@ | ||
648 | |||
649 | #define tlb_start_vma(tlb, vma) do { } while (0) | ||
650 | #define tlb_end_vma(tlb, vma) do { } while (0) | ||
651 | +#define __tlb_remove_tlb_entry __tlb_remove_tlb_entry | ||
652 | |||
653 | extern void tlb_flush(struct mmu_gather *tlb); | ||
654 | |||
655 | diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c | ||
656 | index 7e70ae968e5f..6a4a5fcb9730 100644 | ||
657 | --- a/arch/powerpc/mm/hugetlbpage.c | ||
658 | +++ b/arch/powerpc/mm/hugetlbpage.c | ||
659 | @@ -517,8 +517,6 @@ static void free_hugepd_range(struct mmu_gather *tlb, hugepd_t *hpdp, int pdshif | ||
660 | for (i = 0; i < num_hugepd; i++, hpdp++) | ||
661 | hpdp->pd = 0; | ||
662 | |||
663 | - tlb->need_flush = 1; | ||
664 | - | ||
665 | #ifdef CONFIG_PPC_FSL_BOOK3E | ||
666 | hugepd_free(tlb, hugepte); | ||
667 | #else | ||
668 | diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c | ||
669 | index ced09d8738b4..49e4d64ff74d 100644 | ||
670 | --- a/arch/s390/kvm/kvm-s390.c | ||
671 | +++ b/arch/s390/kvm/kvm-s390.c | ||
672 | @@ -152,7 +152,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | ||
673 | case KVM_CAP_ONE_REG: | ||
674 | case KVM_CAP_ENABLE_CAP: | ||
675 | case KVM_CAP_S390_CSS_SUPPORT: | ||
676 | - case KVM_CAP_IRQFD: | ||
677 | case KVM_CAP_IOEVENTFD: | ||
678 | case KVM_CAP_DEVICE_CTRL: | ||
679 | case KVM_CAP_ENABLE_CAP_VM: | ||
680 | diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c | ||
681 | index 46a5e4508752..af53c25da2e7 100644 | ||
682 | --- a/arch/sparc/kernel/perf_event.c | ||
683 | +++ b/arch/sparc/kernel/perf_event.c | ||
684 | @@ -960,6 +960,8 @@ out: | ||
685 | cpuc->pcr[0] |= cpuc->event[0]->hw.config_base; | ||
686 | } | ||
687 | |||
688 | +static void sparc_pmu_start(struct perf_event *event, int flags); | ||
689 | + | ||
690 | /* On this PMU each PIC has it's own PCR control register. */ | ||
691 | static void calculate_multiple_pcrs(struct cpu_hw_events *cpuc) | ||
692 | { | ||
693 | @@ -972,20 +974,13 @@ static void calculate_multiple_pcrs(struct cpu_hw_events *cpuc) | ||
694 | struct perf_event *cp = cpuc->event[i]; | ||
695 | struct hw_perf_event *hwc = &cp->hw; | ||
696 | int idx = hwc->idx; | ||
697 | - u64 enc; | ||
698 | |||
699 | if (cpuc->current_idx[i] != PIC_NO_INDEX) | ||
700 | continue; | ||
701 | |||
702 | - sparc_perf_event_set_period(cp, hwc, idx); | ||
703 | cpuc->current_idx[i] = idx; | ||
704 | |||
705 | - enc = perf_event_get_enc(cpuc->events[i]); | ||
706 | - cpuc->pcr[idx] &= ~mask_for_index(idx); | ||
707 | - if (hwc->state & PERF_HES_STOPPED) | ||
708 | - cpuc->pcr[idx] |= nop_for_index(idx); | ||
709 | - else | ||
710 | - cpuc->pcr[idx] |= event_encoding(enc, idx); | ||
711 | + sparc_pmu_start(cp, PERF_EF_RELOAD); | ||
712 | } | ||
713 | out: | ||
714 | for (i = 0; i < cpuc->n_events; i++) { | ||
715 | @@ -1101,7 +1096,6 @@ static void sparc_pmu_del(struct perf_event *event, int _flags) | ||
716 | int i; | ||
717 | |||
718 | local_irq_save(flags); | ||
719 | - perf_pmu_disable(event->pmu); | ||
720 | |||
721 | for (i = 0; i < cpuc->n_events; i++) { | ||
722 | if (event == cpuc->event[i]) { | ||
723 | @@ -1127,7 +1121,6 @@ static void sparc_pmu_del(struct perf_event *event, int _flags) | ||
724 | } | ||
725 | } | ||
726 | |||
727 | - perf_pmu_enable(event->pmu); | ||
728 | local_irq_restore(flags); | ||
729 | } | ||
730 | |||
731 | @@ -1361,7 +1354,6 @@ static int sparc_pmu_add(struct perf_event *event, int ef_flags) | ||
732 | unsigned long flags; | ||
733 | |||
734 | local_irq_save(flags); | ||
735 | - perf_pmu_disable(event->pmu); | ||
736 | |||
737 | n0 = cpuc->n_events; | ||
738 | if (n0 >= sparc_pmu->max_hw_events) | ||
739 | @@ -1394,7 +1386,6 @@ nocheck: | ||
740 | |||
741 | ret = 0; | ||
742 | out: | ||
743 | - perf_pmu_enable(event->pmu); | ||
744 | local_irq_restore(flags); | ||
745 | return ret; | ||
746 | } | ||
747 | diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c | ||
748 | index 0be7bf978cb1..46a59643bb1c 100644 | ||
749 | --- a/arch/sparc/kernel/process_64.c | ||
750 | +++ b/arch/sparc/kernel/process_64.c | ||
751 | @@ -287,6 +287,8 @@ void arch_trigger_all_cpu_backtrace(bool include_self) | ||
752 | printk(" TPC[%lx] O7[%lx] I7[%lx] RPC[%lx]\n", | ||
753 | gp->tpc, gp->o7, gp->i7, gp->rpc); | ||
754 | } | ||
755 | + | ||
756 | + touch_nmi_watchdog(); | ||
757 | } | ||
758 | |||
759 | memset(global_cpu_snapshot, 0, sizeof(global_cpu_snapshot)); | ||
760 | @@ -362,6 +364,8 @@ static void pmu_snapshot_all_cpus(void) | ||
761 | (cpu == this_cpu ? '*' : ' '), cpu, | ||
762 | pp->pcr[0], pp->pcr[1], pp->pcr[2], pp->pcr[3], | ||
763 | pp->pic[0], pp->pic[1], pp->pic[2], pp->pic[3]); | ||
764 | + | ||
765 | + touch_nmi_watchdog(); | ||
766 | } | ||
767 | |||
768 | memset(global_cpu_snapshot, 0, sizeof(global_cpu_snapshot)); | ||
769 | diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c | ||
770 | index c85403d0496c..30e7ddb27a3a 100644 | ||
771 | --- a/arch/sparc/kernel/sys_sparc_64.c | ||
772 | +++ b/arch/sparc/kernel/sys_sparc_64.c | ||
773 | @@ -333,7 +333,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second | ||
774 | long err; | ||
775 | |||
776 | /* No need for backward compatibility. We can start fresh... */ | ||
777 | - if (call <= SEMCTL) { | ||
778 | + if (call <= SEMTIMEDOP) { | ||
779 | switch (call) { | ||
780 | case SEMOP: | ||
781 | err = sys_semtimedop(first, ptr, | ||
782 | diff --git a/arch/sparc/lib/memmove.S b/arch/sparc/lib/memmove.S | ||
783 | index b7f6334e159f..857ad4f8905f 100644 | ||
784 | --- a/arch/sparc/lib/memmove.S | ||
785 | +++ b/arch/sparc/lib/memmove.S | ||
786 | @@ -8,9 +8,11 @@ | ||
787 | |||
788 | .text | ||
789 | ENTRY(memmove) /* o0=dst o1=src o2=len */ | ||
790 | - mov %o0, %g1 | ||
791 | + brz,pn %o2, 99f | ||
792 | + mov %o0, %g1 | ||
793 | + | ||
794 | cmp %o0, %o1 | ||
795 | - bleu,pt %xcc, memcpy | ||
796 | + bleu,pt %xcc, 2f | ||
797 | add %o1, %o2, %g7 | ||
798 | cmp %g7, %o0 | ||
799 | bleu,pt %xcc, memcpy | ||
800 | @@ -24,7 +26,34 @@ ENTRY(memmove) /* o0=dst o1=src o2=len */ | ||
801 | stb %g7, [%o0] | ||
802 | bne,pt %icc, 1b | ||
803 | sub %o0, 1, %o0 | ||
804 | - | ||
805 | +99: | ||
806 | retl | ||
807 | mov %g1, %o0 | ||
808 | + | ||
809 | + /* We can't just call memcpy for these memmove cases. On some | ||
810 | + * chips the memcpy uses cache initializing stores and when dst | ||
811 | + * and src are close enough, those can clobber the source data | ||
812 | + * before we've loaded it in. | ||
813 | + */ | ||
814 | +2: or %o0, %o1, %g7 | ||
815 | + or %o2, %g7, %g7 | ||
816 | + andcc %g7, 0x7, %g0 | ||
817 | + bne,pn %xcc, 4f | ||
818 | + nop | ||
819 | + | ||
820 | +3: ldx [%o1], %g7 | ||
821 | + add %o1, 8, %o1 | ||
822 | + subcc %o2, 8, %o2 | ||
823 | + add %o0, 8, %o0 | ||
824 | + bne,pt %icc, 3b | ||
825 | + stx %g7, [%o0 - 0x8] | ||
826 | + ba,a,pt %xcc, 99b | ||
827 | + | ||
828 | +4: ldub [%o1], %g7 | ||
829 | + add %o1, 1, %o1 | ||
830 | + subcc %o2, 1, %o2 | ||
831 | + add %o0, 1, %o0 | ||
832 | + bne,pt %icc, 4b | ||
833 | + stb %g7, [%o0 - 0x1] | ||
834 | + ba,a,pt %xcc, 99b | ||
835 | ENDPROC(memmove) | ||
836 | diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c | ||
837 | index be65f035d18a..5cbc96d801ff 100644 | ||
838 | --- a/arch/sparc/mm/srmmu.c | ||
839 | +++ b/arch/sparc/mm/srmmu.c | ||
840 | @@ -460,10 +460,12 @@ static void __init sparc_context_init(int numctx) | ||
841 | void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, | ||
842 | struct task_struct *tsk) | ||
843 | { | ||
844 | + unsigned long flags; | ||
845 | + | ||
846 | if (mm->context == NO_CONTEXT) { | ||
847 | - spin_lock(&srmmu_context_spinlock); | ||
848 | + spin_lock_irqsave(&srmmu_context_spinlock, flags); | ||
849 | alloc_context(old_mm, mm); | ||
850 | - spin_unlock(&srmmu_context_spinlock); | ||
851 | + spin_unlock_irqrestore(&srmmu_context_spinlock, flags); | ||
852 | srmmu_ctxd_set(&srmmu_context_table[mm->context], mm->pgd); | ||
853 | } | ||
854 | |||
855 | @@ -986,14 +988,15 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm) | ||
856 | |||
857 | void destroy_context(struct mm_struct *mm) | ||
858 | { | ||
859 | + unsigned long flags; | ||
860 | |||
861 | if (mm->context != NO_CONTEXT) { | ||
862 | flush_cache_mm(mm); | ||
863 | srmmu_ctxd_set(&srmmu_context_table[mm->context], srmmu_swapper_pg_dir); | ||
864 | flush_tlb_mm(mm); | ||
865 | - spin_lock(&srmmu_context_spinlock); | ||
866 | + spin_lock_irqsave(&srmmu_context_spinlock, flags); | ||
867 | free_context(mm->context); | ||
868 | - spin_unlock(&srmmu_context_spinlock); | ||
869 | + spin_unlock_irqrestore(&srmmu_context_spinlock, flags); | ||
870 | mm->context = NO_CONTEXT; | ||
871 | } | ||
872 | } | ||
873 | diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c | ||
874 | index 70fece226d17..5a93783a8a0d 100644 | ||
875 | --- a/arch/x86/crypto/aesni-intel_glue.c | ||
876 | +++ b/arch/x86/crypto/aesni-intel_glue.c | ||
877 | @@ -1137,7 +1137,7 @@ static int __driver_rfc4106_decrypt(struct aead_request *req) | ||
878 | src = kmalloc(req->cryptlen + req->assoclen, GFP_ATOMIC); | ||
879 | if (!src) | ||
880 | return -ENOMEM; | ||
881 | - assoc = (src + req->cryptlen + auth_tag_len); | ||
882 | + assoc = (src + req->cryptlen); | ||
883 | scatterwalk_map_and_copy(src, req->src, 0, req->cryptlen, 0); | ||
884 | scatterwalk_map_and_copy(assoc, req->assoc, 0, | ||
885 | req->assoclen, 0); | ||
886 | @@ -1162,7 +1162,7 @@ static int __driver_rfc4106_decrypt(struct aead_request *req) | ||
887 | scatterwalk_done(&src_sg_walk, 0, 0); | ||
888 | scatterwalk_done(&assoc_sg_walk, 0, 0); | ||
889 | } else { | ||
890 | - scatterwalk_map_and_copy(dst, req->dst, 0, req->cryptlen, 1); | ||
891 | + scatterwalk_map_and_copy(dst, req->dst, 0, tempCipherLen, 1); | ||
892 | kfree(src); | ||
893 | } | ||
894 | return retval; | ||
895 | diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h | ||
896 | index e97622f57722..f895358db0ab 100644 | ||
897 | --- a/arch/x86/include/asm/fpu-internal.h | ||
898 | +++ b/arch/x86/include/asm/fpu-internal.h | ||
899 | @@ -368,7 +368,7 @@ static inline void drop_fpu(struct task_struct *tsk) | ||
900 | preempt_disable(); | ||
901 | tsk->thread.fpu_counter = 0; | ||
902 | __drop_fpu(tsk); | ||
903 | - clear_used_math(); | ||
904 | + clear_stopped_child_used_math(tsk); | ||
905 | preempt_enable(); | ||
906 | } | ||
907 | |||
908 | diff --git a/arch/x86/kernel/apic/apic_numachip.c b/arch/x86/kernel/apic/apic_numachip.c | ||
909 | index 4128b5fcb559..2aaee79fb129 100644 | ||
910 | --- a/arch/x86/kernel/apic/apic_numachip.c | ||
911 | +++ b/arch/x86/kernel/apic/apic_numachip.c | ||
912 | @@ -40,7 +40,7 @@ static unsigned int get_apic_id(unsigned long x) | ||
913 | unsigned int id; | ||
914 | |||
915 | rdmsrl(MSR_FAM10H_NODE_ID, value); | ||
916 | - id = ((x >> 24) & 0xffU) | ((value << 2) & 0x3f00U); | ||
917 | + id = ((x >> 24) & 0xffU) | ((value << 2) & 0xff00U); | ||
918 | |||
919 | return id; | ||
920 | } | ||
921 | diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c | ||
922 | index 0de1fae2bdf0..8be1e1711203 100644 | ||
923 | --- a/arch/x86/kernel/xsave.c | ||
924 | +++ b/arch/x86/kernel/xsave.c | ||
925 | @@ -378,7 +378,7 @@ int __restore_xstate_sig(void __user *buf, void __user *buf_fx, int size) | ||
926 | * thread's fpu state, reconstruct fxstate from the fsave | ||
927 | * header. Sanitize the copied state etc. | ||
928 | */ | ||
929 | - struct xsave_struct *xsave = &tsk->thread.fpu.state->xsave; | ||
930 | + struct fpu *fpu = &tsk->thread.fpu; | ||
931 | struct user_i387_ia32_struct env; | ||
932 | int err = 0; | ||
933 | |||
934 | @@ -392,14 +392,15 @@ int __restore_xstate_sig(void __user *buf, void __user *buf_fx, int size) | ||
935 | */ | ||
936 | drop_fpu(tsk); | ||
937 | |||
938 | - if (__copy_from_user(xsave, buf_fx, state_size) || | ||
939 | + if (__copy_from_user(&fpu->state->xsave, buf_fx, state_size) || | ||
940 | __copy_from_user(&env, buf, sizeof(env))) { | ||
941 | + fpu_finit(fpu); | ||
942 | err = -1; | ||
943 | } else { | ||
944 | sanitize_restored_xstate(tsk, &env, xstate_bv, fx_only); | ||
945 | - set_used_math(); | ||
946 | } | ||
947 | |||
948 | + set_used_math(); | ||
949 | if (use_eager_fpu()) { | ||
950 | preempt_disable(); | ||
951 | math_state_restore(); | ||
952 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
953 | index 8b92cf4b165a..a38dd816015b 100644 | ||
954 | --- a/arch/x86/kvm/x86.c | ||
955 | +++ b/arch/x86/kvm/x86.c | ||
956 | @@ -2713,7 +2713,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | ||
957 | case KVM_CAP_USER_NMI: | ||
958 | case KVM_CAP_REINJECT_CONTROL: | ||
959 | case KVM_CAP_IRQ_INJECT_STATUS: | ||
960 | - case KVM_CAP_IRQFD: | ||
961 | case KVM_CAP_IOEVENTFD: | ||
962 | case KVM_CAP_IOEVENTFD_NO_LENGTH: | ||
963 | case KVM_CAP_PIT2: | ||
964 | diff --git a/arch/x86/vdso/vdso32/sigreturn.S b/arch/x86/vdso/vdso32/sigreturn.S | ||
965 | index 31776d0efc8c..d7ec4e251c0a 100644 | ||
966 | --- a/arch/x86/vdso/vdso32/sigreturn.S | ||
967 | +++ b/arch/x86/vdso/vdso32/sigreturn.S | ||
968 | @@ -17,6 +17,7 @@ | ||
969 | .text | ||
970 | .globl __kernel_sigreturn | ||
971 | .type __kernel_sigreturn,@function | ||
972 | + nop /* this guy is needed for .LSTARTFDEDLSI1 below (watch for HACK) */ | ||
973 | ALIGN | ||
974 | __kernel_sigreturn: | ||
975 | .LSTART_sigreturn: | ||
976 | diff --git a/drivers/char/tpm/tpm_i2c_stm_st33.c b/drivers/char/tpm/tpm_i2c_stm_st33.c | ||
977 | index 7d1c540fa26a..3f187a529e92 100644 | ||
978 | --- a/drivers/char/tpm/tpm_i2c_stm_st33.c | ||
979 | +++ b/drivers/char/tpm/tpm_i2c_stm_st33.c | ||
980 | @@ -397,7 +397,7 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout, | ||
981 | */ | ||
982 | static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count) | ||
983 | { | ||
984 | - int size = 0, burstcnt, len; | ||
985 | + int size = 0, burstcnt, len, ret; | ||
986 | struct i2c_client *client; | ||
987 | |||
988 | client = (struct i2c_client *)TPM_VPRIV(chip); | ||
989 | @@ -406,13 +406,15 @@ static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count) | ||
990 | wait_for_stat(chip, | ||
991 | TPM_STS_DATA_AVAIL | TPM_STS_VALID, | ||
992 | chip->vendor.timeout_c, | ||
993 | - &chip->vendor.read_queue) | ||
994 | - == 0) { | ||
995 | + &chip->vendor.read_queue) == 0) { | ||
996 | burstcnt = get_burstcount(chip); | ||
997 | if (burstcnt < 0) | ||
998 | return burstcnt; | ||
999 | len = min_t(int, burstcnt, count - size); | ||
1000 | - I2C_READ_DATA(client, TPM_DATA_FIFO, buf + size, len); | ||
1001 | + ret = I2C_READ_DATA(client, TPM_DATA_FIFO, buf + size, len); | ||
1002 | + if (ret < 0) | ||
1003 | + return ret; | ||
1004 | + | ||
1005 | size += len; | ||
1006 | } | ||
1007 | return size; | ||
1008 | diff --git a/drivers/char/tpm/tpm_ibmvtpm.c b/drivers/char/tpm/tpm_ibmvtpm.c | ||
1009 | index eff9d5870034..102463ba745d 100644 | ||
1010 | --- a/drivers/char/tpm/tpm_ibmvtpm.c | ||
1011 | +++ b/drivers/char/tpm/tpm_ibmvtpm.c | ||
1012 | @@ -124,7 +124,7 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count) | ||
1013 | { | ||
1014 | struct ibmvtpm_dev *ibmvtpm; | ||
1015 | struct ibmvtpm_crq crq; | ||
1016 | - u64 *word = (u64 *) &crq; | ||
1017 | + __be64 *word = (__be64 *)&crq; | ||
1018 | int rc; | ||
1019 | |||
1020 | ibmvtpm = (struct ibmvtpm_dev *)TPM_VPRIV(chip); | ||
1021 | @@ -145,11 +145,11 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count) | ||
1022 | memcpy((void *)ibmvtpm->rtce_buf, (void *)buf, count); | ||
1023 | crq.valid = (u8)IBMVTPM_VALID_CMD; | ||
1024 | crq.msg = (u8)VTPM_TPM_COMMAND; | ||
1025 | - crq.len = (u16)count; | ||
1026 | - crq.data = ibmvtpm->rtce_dma_handle; | ||
1027 | + crq.len = cpu_to_be16(count); | ||
1028 | + crq.data = cpu_to_be32(ibmvtpm->rtce_dma_handle); | ||
1029 | |||
1030 | - rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(word[0]), | ||
1031 | - cpu_to_be64(word[1])); | ||
1032 | + rc = ibmvtpm_send_crq(ibmvtpm->vdev, be64_to_cpu(word[0]), | ||
1033 | + be64_to_cpu(word[1])); | ||
1034 | if (rc != H_SUCCESS) { | ||
1035 | dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc); | ||
1036 | rc = 0; | ||
1037 | diff --git a/drivers/char/tpm/tpm_ibmvtpm.h b/drivers/char/tpm/tpm_ibmvtpm.h | ||
1038 | index bd82a791f995..b2c231b1beec 100644 | ||
1039 | --- a/drivers/char/tpm/tpm_ibmvtpm.h | ||
1040 | +++ b/drivers/char/tpm/tpm_ibmvtpm.h | ||
1041 | @@ -22,9 +22,9 @@ | ||
1042 | struct ibmvtpm_crq { | ||
1043 | u8 valid; | ||
1044 | u8 msg; | ||
1045 | - u16 len; | ||
1046 | - u32 data; | ||
1047 | - u64 reserved; | ||
1048 | + __be16 len; | ||
1049 | + __be32 data; | ||
1050 | + __be64 reserved; | ||
1051 | } __attribute__((packed, aligned(8))); | ||
1052 | |||
1053 | struct ibmvtpm_crq_queue { | ||
1054 | diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c | ||
1055 | index cf7a561fad7c..6e09c1dac2b7 100644 | ||
1056 | --- a/drivers/char/virtio_console.c | ||
1057 | +++ b/drivers/char/virtio_console.c | ||
1058 | @@ -142,6 +142,7 @@ struct ports_device { | ||
1059 | * notification | ||
1060 | */ | ||
1061 | struct work_struct control_work; | ||
1062 | + struct work_struct config_work; | ||
1063 | |||
1064 | struct list_head ports; | ||
1065 | |||
1066 | @@ -1832,10 +1833,21 @@ static void config_intr(struct virtio_device *vdev) | ||
1067 | |||
1068 | portdev = vdev->priv; | ||
1069 | |||
1070 | + if (!use_multiport(portdev)) | ||
1071 | + schedule_work(&portdev->config_work); | ||
1072 | +} | ||
1073 | + | ||
1074 | +static void config_work_handler(struct work_struct *work) | ||
1075 | +{ | ||
1076 | + struct ports_device *portdev; | ||
1077 | + | ||
1078 | + portdev = container_of(work, struct ports_device, control_work); | ||
1079 | if (!use_multiport(portdev)) { | ||
1080 | + struct virtio_device *vdev; | ||
1081 | struct port *port; | ||
1082 | u16 rows, cols; | ||
1083 | |||
1084 | + vdev = portdev->vdev; | ||
1085 | virtio_cread(vdev, struct virtio_console_config, cols, &cols); | ||
1086 | virtio_cread(vdev, struct virtio_console_config, rows, &rows); | ||
1087 | |||
1088 | @@ -2026,12 +2038,14 @@ static int virtcons_probe(struct virtio_device *vdev) | ||
1089 | |||
1090 | virtio_device_ready(portdev->vdev); | ||
1091 | |||
1092 | + INIT_WORK(&portdev->config_work, &config_work_handler); | ||
1093 | + INIT_WORK(&portdev->control_work, &control_work_handler); | ||
1094 | + | ||
1095 | if (multiport) { | ||
1096 | unsigned int nr_added_bufs; | ||
1097 | |||
1098 | spin_lock_init(&portdev->c_ivq_lock); | ||
1099 | spin_lock_init(&portdev->c_ovq_lock); | ||
1100 | - INIT_WORK(&portdev->control_work, &control_work_handler); | ||
1101 | |||
1102 | nr_added_bufs = fill_queue(portdev->c_ivq, | ||
1103 | &portdev->c_ivq_lock); | ||
1104 | @@ -2099,6 +2113,8 @@ static void virtcons_remove(struct virtio_device *vdev) | ||
1105 | /* Finish up work that's lined up */ | ||
1106 | if (use_multiport(portdev)) | ||
1107 | cancel_work_sync(&portdev->control_work); | ||
1108 | + else | ||
1109 | + cancel_work_sync(&portdev->config_work); | ||
1110 | |||
1111 | list_for_each_entry_safe(port, port2, &portdev->ports, list) | ||
1112 | unplug_port(port); | ||
1113 | @@ -2150,6 +2166,7 @@ static int virtcons_freeze(struct virtio_device *vdev) | ||
1114 | |||
1115 | virtqueue_disable_cb(portdev->c_ivq); | ||
1116 | cancel_work_sync(&portdev->control_work); | ||
1117 | + cancel_work_sync(&portdev->config_work); | ||
1118 | /* | ||
1119 | * Once more: if control_work_handler() was running, it would | ||
1120 | * enable the cb as the last step. | ||
1121 | diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c | ||
1122 | index e79c8d3700d8..da41ad42d3a6 100644 | ||
1123 | --- a/drivers/gpu/drm/drm_crtc.c | ||
1124 | +++ b/drivers/gpu/drm/drm_crtc.c | ||
1125 | @@ -42,9 +42,10 @@ | ||
1126 | #include "drm_crtc_internal.h" | ||
1127 | #include "drm_internal.h" | ||
1128 | |||
1129 | -static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev, | ||
1130 | - struct drm_mode_fb_cmd2 *r, | ||
1131 | - struct drm_file *file_priv); | ||
1132 | +static struct drm_framebuffer * | ||
1133 | +internal_framebuffer_create(struct drm_device *dev, | ||
1134 | + struct drm_mode_fb_cmd2 *r, | ||
1135 | + struct drm_file *file_priv); | ||
1136 | |||
1137 | /* Avoid boilerplate. I'm tired of typing. */ | ||
1138 | #define DRM_ENUM_NAME_FN(fnname, list) \ | ||
1139 | @@ -2739,13 +2740,11 @@ static int drm_mode_cursor_universal(struct drm_crtc *crtc, | ||
1140 | */ | ||
1141 | if (req->flags & DRM_MODE_CURSOR_BO) { | ||
1142 | if (req->handle) { | ||
1143 | - fb = add_framebuffer_internal(dev, &fbreq, file_priv); | ||
1144 | + fb = internal_framebuffer_create(dev, &fbreq, file_priv); | ||
1145 | if (IS_ERR(fb)) { | ||
1146 | DRM_DEBUG_KMS("failed to wrap cursor buffer in drm framebuffer\n"); | ||
1147 | return PTR_ERR(fb); | ||
1148 | } | ||
1149 | - | ||
1150 | - drm_framebuffer_reference(fb); | ||
1151 | } else { | ||
1152 | fb = NULL; | ||
1153 | } | ||
1154 | @@ -3114,9 +3113,10 @@ static int framebuffer_check(const struct drm_mode_fb_cmd2 *r) | ||
1155 | return 0; | ||
1156 | } | ||
1157 | |||
1158 | -static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev, | ||
1159 | - struct drm_mode_fb_cmd2 *r, | ||
1160 | - struct drm_file *file_priv) | ||
1161 | +static struct drm_framebuffer * | ||
1162 | +internal_framebuffer_create(struct drm_device *dev, | ||
1163 | + struct drm_mode_fb_cmd2 *r, | ||
1164 | + struct drm_file *file_priv) | ||
1165 | { | ||
1166 | struct drm_mode_config *config = &dev->mode_config; | ||
1167 | struct drm_framebuffer *fb; | ||
1168 | @@ -3148,12 +3148,6 @@ static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev, | ||
1169 | return fb; | ||
1170 | } | ||
1171 | |||
1172 | - mutex_lock(&file_priv->fbs_lock); | ||
1173 | - r->fb_id = fb->base.id; | ||
1174 | - list_add(&fb->filp_head, &file_priv->fbs); | ||
1175 | - DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id); | ||
1176 | - mutex_unlock(&file_priv->fbs_lock); | ||
1177 | - | ||
1178 | return fb; | ||
1179 | } | ||
1180 | |||
1181 | @@ -3175,15 +3169,24 @@ static struct drm_framebuffer *add_framebuffer_internal(struct drm_device *dev, | ||
1182 | int drm_mode_addfb2(struct drm_device *dev, | ||
1183 | void *data, struct drm_file *file_priv) | ||
1184 | { | ||
1185 | + struct drm_mode_fb_cmd2 *r = data; | ||
1186 | struct drm_framebuffer *fb; | ||
1187 | |||
1188 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1189 | return -EINVAL; | ||
1190 | |||
1191 | - fb = add_framebuffer_internal(dev, data, file_priv); | ||
1192 | + fb = internal_framebuffer_create(dev, r, file_priv); | ||
1193 | if (IS_ERR(fb)) | ||
1194 | return PTR_ERR(fb); | ||
1195 | |||
1196 | + /* Transfer ownership to the filp for reaping on close */ | ||
1197 | + | ||
1198 | + DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id); | ||
1199 | + mutex_lock(&file_priv->fbs_lock); | ||
1200 | + r->fb_id = fb->base.id; | ||
1201 | + list_add(&fb->filp_head, &file_priv->fbs); | ||
1202 | + mutex_unlock(&file_priv->fbs_lock); | ||
1203 | + | ||
1204 | return 0; | ||
1205 | } | ||
1206 | |||
1207 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1208 | index dce0d3918fa7..9f0e62529c46 100644 | ||
1209 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1210 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1211 | @@ -1405,6 +1405,9 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | ||
1212 | (x << 16) | y); | ||
1213 | viewport_w = crtc->mode.hdisplay; | ||
1214 | viewport_h = (crtc->mode.vdisplay + 1) & ~1; | ||
1215 | + if ((rdev->family >= CHIP_BONAIRE) && | ||
1216 | + (crtc->mode.flags & DRM_MODE_FLAG_INTERLACE)) | ||
1217 | + viewport_h *= 2; | ||
1218 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, | ||
1219 | (viewport_w << 16) | viewport_h); | ||
1220 | |||
1221 | diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c | ||
1222 | index 5f395be9b3e3..0c6fbc0198a5 100644 | ||
1223 | --- a/drivers/gpu/drm/radeon/cik.c | ||
1224 | +++ b/drivers/gpu/drm/radeon/cik.c | ||
1225 | @@ -7555,6 +7555,9 @@ int cik_irq_set(struct radeon_device *rdev) | ||
1226 | WREG32(DC_HPD5_INT_CONTROL, hpd5); | ||
1227 | WREG32(DC_HPD6_INT_CONTROL, hpd6); | ||
1228 | |||
1229 | + /* posting read */ | ||
1230 | + RREG32(SRBM_STATUS); | ||
1231 | + | ||
1232 | return 0; | ||
1233 | } | ||
1234 | |||
1235 | diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c | ||
1236 | index 85995b4e3338..c674f63d7f14 100644 | ||
1237 | --- a/drivers/gpu/drm/radeon/evergreen.c | ||
1238 | +++ b/drivers/gpu/drm/radeon/evergreen.c | ||
1239 | @@ -4589,6 +4589,9 @@ int evergreen_irq_set(struct radeon_device *rdev) | ||
1240 | WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, afmt5); | ||
1241 | WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, afmt6); | ||
1242 | |||
1243 | + /* posting read */ | ||
1244 | + RREG32(SRBM_STATUS); | ||
1245 | + | ||
1246 | return 0; | ||
1247 | } | ||
1248 | |||
1249 | diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c | ||
1250 | index cdf6e2149539..a959cc1e7c8e 100644 | ||
1251 | --- a/drivers/gpu/drm/radeon/r100.c | ||
1252 | +++ b/drivers/gpu/drm/radeon/r100.c | ||
1253 | @@ -728,6 +728,10 @@ int r100_irq_set(struct radeon_device *rdev) | ||
1254 | tmp |= RADEON_FP2_DETECT_MASK; | ||
1255 | } | ||
1256 | WREG32(RADEON_GEN_INT_CNTL, tmp); | ||
1257 | + | ||
1258 | + /* read back to post the write */ | ||
1259 | + RREG32(RADEON_GEN_INT_CNTL); | ||
1260 | + | ||
1261 | return 0; | ||
1262 | } | ||
1263 | |||
1264 | diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c | ||
1265 | index 56b02927cd3d..ee0868dec2f4 100644 | ||
1266 | --- a/drivers/gpu/drm/radeon/r600.c | ||
1267 | +++ b/drivers/gpu/drm/radeon/r600.c | ||
1268 | @@ -3787,6 +3787,9 @@ int r600_irq_set(struct radeon_device *rdev) | ||
1269 | WREG32(RV770_CG_THERMAL_INT, thermal_int); | ||
1270 | } | ||
1271 | |||
1272 | + /* posting read */ | ||
1273 | + RREG32(R_000E50_SRBM_STATUS); | ||
1274 | + | ||
1275 | return 0; | ||
1276 | } | ||
1277 | |||
1278 | diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c | ||
1279 | index 6f377de099f9..a5b7f6f98f5f 100644 | ||
1280 | --- a/drivers/gpu/drm/radeon/radeon_cs.c | ||
1281 | +++ b/drivers/gpu/drm/radeon/radeon_cs.c | ||
1282 | @@ -275,11 +275,13 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | ||
1283 | u32 ring = RADEON_CS_RING_GFX; | ||
1284 | s32 priority = 0; | ||
1285 | |||
1286 | + INIT_LIST_HEAD(&p->validated); | ||
1287 | + | ||
1288 | if (!cs->num_chunks) { | ||
1289 | return 0; | ||
1290 | } | ||
1291 | + | ||
1292 | /* get chunks */ | ||
1293 | - INIT_LIST_HEAD(&p->validated); | ||
1294 | p->idx = 0; | ||
1295 | p->ib.sa_bo = NULL; | ||
1296 | p->ib.semaphore = NULL; | ||
1297 | diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c | ||
1298 | index 995167025282..8569afaba688 100644 | ||
1299 | --- a/drivers/gpu/drm/radeon/radeon_fence.c | ||
1300 | +++ b/drivers/gpu/drm/radeon/radeon_fence.c | ||
1301 | @@ -1029,37 +1029,59 @@ static inline bool radeon_test_signaled(struct radeon_fence *fence) | ||
1302 | return test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags); | ||
1303 | } | ||
1304 | |||
1305 | +struct radeon_wait_cb { | ||
1306 | + struct fence_cb base; | ||
1307 | + struct task_struct *task; | ||
1308 | +}; | ||
1309 | + | ||
1310 | +static void | ||
1311 | +radeon_fence_wait_cb(struct fence *fence, struct fence_cb *cb) | ||
1312 | +{ | ||
1313 | + struct radeon_wait_cb *wait = | ||
1314 | + container_of(cb, struct radeon_wait_cb, base); | ||
1315 | + | ||
1316 | + wake_up_process(wait->task); | ||
1317 | +} | ||
1318 | + | ||
1319 | static signed long radeon_fence_default_wait(struct fence *f, bool intr, | ||
1320 | signed long t) | ||
1321 | { | ||
1322 | struct radeon_fence *fence = to_radeon_fence(f); | ||
1323 | struct radeon_device *rdev = fence->rdev; | ||
1324 | - bool signaled; | ||
1325 | + struct radeon_wait_cb cb; | ||
1326 | |||
1327 | - fence_enable_sw_signaling(&fence->base); | ||
1328 | + cb.task = current; | ||
1329 | |||
1330 | - /* | ||
1331 | - * This function has to return -EDEADLK, but cannot hold | ||
1332 | - * exclusive_lock during the wait because some callers | ||
1333 | - * may already hold it. This means checking needs_reset without | ||
1334 | - * lock, and not fiddling with any gpu internals. | ||
1335 | - * | ||
1336 | - * The callback installed with fence_enable_sw_signaling will | ||
1337 | - * run before our wait_event_*timeout call, so we will see | ||
1338 | - * both the signaled fence and the changes to needs_reset. | ||
1339 | - */ | ||
1340 | + if (fence_add_callback(f, &cb.base, radeon_fence_wait_cb)) | ||
1341 | + return t; | ||
1342 | + | ||
1343 | + while (t > 0) { | ||
1344 | + if (intr) | ||
1345 | + set_current_state(TASK_INTERRUPTIBLE); | ||
1346 | + else | ||
1347 | + set_current_state(TASK_UNINTERRUPTIBLE); | ||
1348 | + | ||
1349 | + /* | ||
1350 | + * radeon_test_signaled must be called after | ||
1351 | + * set_current_state to prevent a race with wake_up_process | ||
1352 | + */ | ||
1353 | + if (radeon_test_signaled(fence)) | ||
1354 | + break; | ||
1355 | + | ||
1356 | + if (rdev->needs_reset) { | ||
1357 | + t = -EDEADLK; | ||
1358 | + break; | ||
1359 | + } | ||
1360 | + | ||
1361 | + t = schedule_timeout(t); | ||
1362 | + | ||
1363 | + if (t > 0 && intr && signal_pending(current)) | ||
1364 | + t = -ERESTARTSYS; | ||
1365 | + } | ||
1366 | + | ||
1367 | + __set_current_state(TASK_RUNNING); | ||
1368 | + fence_remove_callback(f, &cb.base); | ||
1369 | |||
1370 | - if (intr) | ||
1371 | - t = wait_event_interruptible_timeout(rdev->fence_queue, | ||
1372 | - ((signaled = radeon_test_signaled(fence)) || | ||
1373 | - rdev->needs_reset), t); | ||
1374 | - else | ||
1375 | - t = wait_event_timeout(rdev->fence_queue, | ||
1376 | - ((signaled = radeon_test_signaled(fence)) || | ||
1377 | - rdev->needs_reset), t); | ||
1378 | - | ||
1379 | - if (t > 0 && !signaled) | ||
1380 | - return -EDEADLK; | ||
1381 | return t; | ||
1382 | } | ||
1383 | |||
1384 | diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c | ||
1385 | index 194f6245c379..2a7ba30165c7 100644 | ||
1386 | --- a/drivers/gpu/drm/radeon/radeon_object.c | ||
1387 | +++ b/drivers/gpu/drm/radeon/radeon_object.c | ||
1388 | @@ -151,19 +151,6 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain) | ||
1389 | else | ||
1390 | rbo->placements[i].lpfn = 0; | ||
1391 | } | ||
1392 | - | ||
1393 | - /* | ||
1394 | - * Use two-ended allocation depending on the buffer size to | ||
1395 | - * improve fragmentation quality. | ||
1396 | - * 512kb was measured as the most optimal number. | ||
1397 | - */ | ||
1398 | - if (!((rbo->flags & RADEON_GEM_CPU_ACCESS) && | ||
1399 | - (rbo->placements[i].flags & TTM_PL_FLAG_VRAM)) && | ||
1400 | - rbo->tbo.mem.size > 512 * 1024) { | ||
1401 | - for (i = 0; i < c; i++) { | ||
1402 | - rbo->placements[i].flags |= TTM_PL_FLAG_TOPDOWN; | ||
1403 | - } | ||
1404 | - } | ||
1405 | } | ||
1406 | |||
1407 | int radeon_bo_create(struct radeon_device *rdev, | ||
1408 | diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c | ||
1409 | index 74bce91aecc1..039660662ee8 100644 | ||
1410 | --- a/drivers/gpu/drm/radeon/rs600.c | ||
1411 | +++ b/drivers/gpu/drm/radeon/rs600.c | ||
1412 | @@ -693,6 +693,10 @@ int rs600_irq_set(struct radeon_device *rdev) | ||
1413 | WREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL, hpd2); | ||
1414 | if (ASIC_IS_DCE2(rdev)) | ||
1415 | WREG32(R_007408_HDMI0_AUDIO_PACKET_CONTROL, hdmi0); | ||
1416 | + | ||
1417 | + /* posting read */ | ||
1418 | + RREG32(R_000040_GEN_INT_CNTL); | ||
1419 | + | ||
1420 | return 0; | ||
1421 | } | ||
1422 | |||
1423 | diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c | ||
1424 | index 7d5083dc4acb..1c3d90c17cb3 100644 | ||
1425 | --- a/drivers/gpu/drm/radeon/si.c | ||
1426 | +++ b/drivers/gpu/drm/radeon/si.c | ||
1427 | @@ -6192,6 +6192,9 @@ int si_irq_set(struct radeon_device *rdev) | ||
1428 | |||
1429 | WREG32(CG_THERMAL_INT, thermal_int); | ||
1430 | |||
1431 | + /* posting read */ | ||
1432 | + RREG32(SRBM_STATUS); | ||
1433 | + | ||
1434 | return 0; | ||
1435 | } | ||
1436 | |||
1437 | @@ -7112,8 +7115,7 @@ int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk) | ||
1438 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK); | ||
1439 | |||
1440 | if (!vclk || !dclk) { | ||
1441 | - /* keep the Bypass mode, put PLL to sleep */ | ||
1442 | - WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); | ||
1443 | + /* keep the Bypass mode */ | ||
1444 | return 0; | ||
1445 | } | ||
1446 | |||
1447 | @@ -7129,8 +7131,7 @@ int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk) | ||
1448 | /* set VCO_MODE to 1 */ | ||
1449 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK); | ||
1450 | |||
1451 | - /* toggle UPLL_SLEEP to 1 then back to 0 */ | ||
1452 | - WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); | ||
1453 | + /* disable sleep mode */ | ||
1454 | WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK); | ||
1455 | |||
1456 | /* deassert UPLL_RESET */ | ||
1457 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
1458 | index 810dac80179c..0426b5bed8fc 100644 | ||
1459 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
1460 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | ||
1461 | @@ -725,32 +725,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | ||
1462 | goto out_err1; | ||
1463 | } | ||
1464 | |||
1465 | - ret = ttm_bo_init_mm(&dev_priv->bdev, TTM_PL_VRAM, | ||
1466 | - (dev_priv->vram_size >> PAGE_SHIFT)); | ||
1467 | - if (unlikely(ret != 0)) { | ||
1468 | - DRM_ERROR("Failed initializing memory manager for VRAM.\n"); | ||
1469 | - goto out_err2; | ||
1470 | - } | ||
1471 | - | ||
1472 | - dev_priv->has_gmr = true; | ||
1473 | - if (((dev_priv->capabilities & (SVGA_CAP_GMR | SVGA_CAP_GMR2)) == 0) || | ||
1474 | - refuse_dma || ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_GMR, | ||
1475 | - VMW_PL_GMR) != 0) { | ||
1476 | - DRM_INFO("No GMR memory available. " | ||
1477 | - "Graphics memory resources are very limited.\n"); | ||
1478 | - dev_priv->has_gmr = false; | ||
1479 | - } | ||
1480 | - | ||
1481 | - if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS) { | ||
1482 | - dev_priv->has_mob = true; | ||
1483 | - if (ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_MOB, | ||
1484 | - VMW_PL_MOB) != 0) { | ||
1485 | - DRM_INFO("No MOB memory available. " | ||
1486 | - "3D will be disabled.\n"); | ||
1487 | - dev_priv->has_mob = false; | ||
1488 | - } | ||
1489 | - } | ||
1490 | - | ||
1491 | dev_priv->mmio_mtrr = arch_phys_wc_add(dev_priv->mmio_start, | ||
1492 | dev_priv->mmio_size); | ||
1493 | |||
1494 | @@ -813,6 +787,33 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset) | ||
1495 | goto out_no_fman; | ||
1496 | } | ||
1497 | |||
1498 | + | ||
1499 | + ret = ttm_bo_init_mm(&dev_priv->bdev, TTM_PL_VRAM, | ||
1500 | + (dev_priv->vram_size >> PAGE_SHIFT)); | ||
1501 | + if (unlikely(ret != 0)) { | ||
1502 | + DRM_ERROR("Failed initializing memory manager for VRAM.\n"); | ||
1503 | + goto out_no_vram; | ||
1504 | + } | ||
1505 | + | ||
1506 | + dev_priv->has_gmr = true; | ||
1507 | + if (((dev_priv->capabilities & (SVGA_CAP_GMR | SVGA_CAP_GMR2)) == 0) || | ||
1508 | + refuse_dma || ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_GMR, | ||
1509 | + VMW_PL_GMR) != 0) { | ||
1510 | + DRM_INFO("No GMR memory available. " | ||
1511 | + "Graphics memory resources are very limited.\n"); | ||
1512 | + dev_priv->has_gmr = false; | ||
1513 | + } | ||
1514 | + | ||
1515 | + if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS) { | ||
1516 | + dev_priv->has_mob = true; | ||
1517 | + if (ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_MOB, | ||
1518 | + VMW_PL_MOB) != 0) { | ||
1519 | + DRM_INFO("No MOB memory available. " | ||
1520 | + "3D will be disabled.\n"); | ||
1521 | + dev_priv->has_mob = false; | ||
1522 | + } | ||
1523 | + } | ||
1524 | + | ||
1525 | vmw_kms_save_vga(dev_priv); | ||
1526 | |||
1527 | /* Start kms and overlay systems, needs fifo. */ | ||
1528 | @@ -838,6 +839,12 @@ out_no_fifo: | ||
1529 | vmw_kms_close(dev_priv); | ||
1530 | out_no_kms: | ||
1531 | vmw_kms_restore_vga(dev_priv); | ||
1532 | + if (dev_priv->has_mob) | ||
1533 | + (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB); | ||
1534 | + if (dev_priv->has_gmr) | ||
1535 | + (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR); | ||
1536 | + (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM); | ||
1537 | +out_no_vram: | ||
1538 | vmw_fence_manager_takedown(dev_priv->fman); | ||
1539 | out_no_fman: | ||
1540 | if (dev_priv->capabilities & SVGA_CAP_IRQMASK) | ||
1541 | @@ -853,12 +860,6 @@ out_err4: | ||
1542 | iounmap(dev_priv->mmio_virt); | ||
1543 | out_err3: | ||
1544 | arch_phys_wc_del(dev_priv->mmio_mtrr); | ||
1545 | - if (dev_priv->has_mob) | ||
1546 | - (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB); | ||
1547 | - if (dev_priv->has_gmr) | ||
1548 | - (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR); | ||
1549 | - (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM); | ||
1550 | -out_err2: | ||
1551 | (void)ttm_bo_device_release(&dev_priv->bdev); | ||
1552 | out_err1: | ||
1553 | vmw_ttm_global_release(dev_priv); | ||
1554 | @@ -888,6 +889,13 @@ static int vmw_driver_unload(struct drm_device *dev) | ||
1555 | } | ||
1556 | vmw_kms_close(dev_priv); | ||
1557 | vmw_overlay_close(dev_priv); | ||
1558 | + | ||
1559 | + if (dev_priv->has_mob) | ||
1560 | + (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB); | ||
1561 | + if (dev_priv->has_gmr) | ||
1562 | + (void)ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR); | ||
1563 | + (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM); | ||
1564 | + | ||
1565 | vmw_fence_manager_takedown(dev_priv->fman); | ||
1566 | if (dev_priv->capabilities & SVGA_CAP_IRQMASK) | ||
1567 | drm_irq_uninstall(dev_priv->dev); | ||
1568 | @@ -899,11 +907,6 @@ static int vmw_driver_unload(struct drm_device *dev) | ||
1569 | ttm_object_device_release(&dev_priv->tdev); | ||
1570 | iounmap(dev_priv->mmio_virt); | ||
1571 | arch_phys_wc_del(dev_priv->mmio_mtrr); | ||
1572 | - if (dev_priv->has_mob) | ||
1573 | - (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB); | ||
1574 | - if (dev_priv->has_gmr) | ||
1575 | - (void)ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR); | ||
1576 | - (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM); | ||
1577 | (void)ttm_bo_device_release(&dev_priv->bdev); | ||
1578 | vmw_ttm_global_release(dev_priv); | ||
1579 | |||
1580 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | ||
1581 | index 596cd6dafd33..50b52802f470 100644 | ||
1582 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | ||
1583 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | ||
1584 | @@ -2778,13 +2778,11 @@ int vmw_execbuf_ioctl(struct drm_device *dev, void *data, | ||
1585 | NULL, arg->command_size, arg->throttle_us, | ||
1586 | (void __user *)(unsigned long)arg->fence_rep, | ||
1587 | NULL); | ||
1588 | - | ||
1589 | + ttm_read_unlock(&dev_priv->reservation_sem); | ||
1590 | if (unlikely(ret != 0)) | ||
1591 | - goto out_unlock; | ||
1592 | + return ret; | ||
1593 | |||
1594 | vmw_kms_cursor_post_execbuf(dev_priv); | ||
1595 | |||
1596 | -out_unlock: | ||
1597 | - ttm_read_unlock(&dev_priv->reservation_sem); | ||
1598 | - return ret; | ||
1599 | + return 0; | ||
1600 | } | ||
1601 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | ||
1602 | index fddd53335237..173ec3377e4f 100644 | ||
1603 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | ||
1604 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | ||
1605 | @@ -2033,23 +2033,17 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, | ||
1606 | int i; | ||
1607 | struct drm_mode_config *mode_config = &dev->mode_config; | ||
1608 | |||
1609 | - ret = ttm_read_lock(&dev_priv->reservation_sem, true); | ||
1610 | - if (unlikely(ret != 0)) | ||
1611 | - return ret; | ||
1612 | - | ||
1613 | if (!arg->num_outputs) { | ||
1614 | struct drm_vmw_rect def_rect = {0, 0, 800, 600}; | ||
1615 | vmw_du_update_layout(dev_priv, 1, &def_rect); | ||
1616 | - goto out_unlock; | ||
1617 | + return 0; | ||
1618 | } | ||
1619 | |||
1620 | rects_size = arg->num_outputs * sizeof(struct drm_vmw_rect); | ||
1621 | rects = kcalloc(arg->num_outputs, sizeof(struct drm_vmw_rect), | ||
1622 | GFP_KERNEL); | ||
1623 | - if (unlikely(!rects)) { | ||
1624 | - ret = -ENOMEM; | ||
1625 | - goto out_unlock; | ||
1626 | - } | ||
1627 | + if (unlikely(!rects)) | ||
1628 | + return -ENOMEM; | ||
1629 | |||
1630 | user_rects = (void __user *)(unsigned long)arg->rects; | ||
1631 | ret = copy_from_user(rects, user_rects, rects_size); | ||
1632 | @@ -2074,7 +2068,5 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, | ||
1633 | |||
1634 | out_free: | ||
1635 | kfree(rects); | ||
1636 | -out_unlock: | ||
1637 | - ttm_read_unlock(&dev_priv->reservation_sem); | ||
1638 | return ret; | ||
1639 | } | ||
1640 | diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c | ||
1641 | index f43b4e11647a..17a1853c6c2f 100644 | ||
1642 | --- a/drivers/i2c/i2c-core.c | ||
1643 | +++ b/drivers/i2c/i2c-core.c | ||
1644 | @@ -665,9 +665,6 @@ static int i2c_device_remove(struct device *dev) | ||
1645 | status = driver->remove(client); | ||
1646 | } | ||
1647 | |||
1648 | - if (dev->of_node) | ||
1649 | - irq_dispose_mapping(client->irq); | ||
1650 | - | ||
1651 | dev_pm_domain_detach(&client->dev, true); | ||
1652 | return status; | ||
1653 | } | ||
1654 | diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c | ||
1655 | index 6a2e168c3ab0..41ac85af043e 100644 | ||
1656 | --- a/drivers/irqchip/irq-armada-370-xp.c | ||
1657 | +++ b/drivers/irqchip/irq-armada-370-xp.c | ||
1658 | @@ -67,6 +67,7 @@ | ||
1659 | static void __iomem *per_cpu_int_base; | ||
1660 | static void __iomem *main_int_base; | ||
1661 | static struct irq_domain *armada_370_xp_mpic_domain; | ||
1662 | +static int parent_irq; | ||
1663 | #ifdef CONFIG_PCI_MSI | ||
1664 | static struct irq_domain *armada_370_xp_msi_domain; | ||
1665 | static DECLARE_BITMAP(msi_used, PCI_MSI_DOORBELL_NR); | ||
1666 | @@ -354,6 +355,7 @@ static int armada_xp_mpic_secondary_init(struct notifier_block *nfb, | ||
1667 | { | ||
1668 | if (action == CPU_STARTING || action == CPU_STARTING_FROZEN) | ||
1669 | armada_xp_mpic_smp_cpu_init(); | ||
1670 | + | ||
1671 | return NOTIFY_OK; | ||
1672 | } | ||
1673 | |||
1674 | @@ -362,6 +364,20 @@ static struct notifier_block armada_370_xp_mpic_cpu_notifier = { | ||
1675 | .priority = 100, | ||
1676 | }; | ||
1677 | |||
1678 | +static int mpic_cascaded_secondary_init(struct notifier_block *nfb, | ||
1679 | + unsigned long action, void *hcpu) | ||
1680 | +{ | ||
1681 | + if (action == CPU_STARTING || action == CPU_STARTING_FROZEN) | ||
1682 | + enable_percpu_irq(parent_irq, IRQ_TYPE_NONE); | ||
1683 | + | ||
1684 | + return NOTIFY_OK; | ||
1685 | +} | ||
1686 | + | ||
1687 | +static struct notifier_block mpic_cascaded_cpu_notifier = { | ||
1688 | + .notifier_call = mpic_cascaded_secondary_init, | ||
1689 | + .priority = 100, | ||
1690 | +}; | ||
1691 | + | ||
1692 | #endif /* CONFIG_SMP */ | ||
1693 | |||
1694 | static struct irq_domain_ops armada_370_xp_mpic_irq_ops = { | ||
1695 | @@ -489,7 +505,7 @@ static int __init armada_370_xp_mpic_of_init(struct device_node *node, | ||
1696 | struct device_node *parent) | ||
1697 | { | ||
1698 | struct resource main_int_res, per_cpu_int_res; | ||
1699 | - int parent_irq, nr_irqs, i; | ||
1700 | + int nr_irqs, i; | ||
1701 | u32 control; | ||
1702 | |||
1703 | BUG_ON(of_address_to_resource(node, 0, &main_int_res)); | ||
1704 | @@ -537,6 +553,9 @@ static int __init armada_370_xp_mpic_of_init(struct device_node *node, | ||
1705 | register_cpu_notifier(&armada_370_xp_mpic_cpu_notifier); | ||
1706 | #endif | ||
1707 | } else { | ||
1708 | +#ifdef CONFIG_SMP | ||
1709 | + register_cpu_notifier(&mpic_cascaded_cpu_notifier); | ||
1710 | +#endif | ||
1711 | irq_set_chained_handler(parent_irq, | ||
1712 | armada_370_xp_mpic_handle_cascade_irq); | ||
1713 | } | ||
1714 | diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c | ||
1715 | index 96b0b1d27df1..bc677362bc73 100644 | ||
1716 | --- a/drivers/mtd/nand/pxa3xx_nand.c | ||
1717 | +++ b/drivers/mtd/nand/pxa3xx_nand.c | ||
1718 | @@ -480,6 +480,42 @@ static void disable_int(struct pxa3xx_nand_info *info, uint32_t int_mask) | ||
1719 | nand_writel(info, NDCR, ndcr | int_mask); | ||
1720 | } | ||
1721 | |||
1722 | +static void drain_fifo(struct pxa3xx_nand_info *info, void *data, int len) | ||
1723 | +{ | ||
1724 | + if (info->ecc_bch) { | ||
1725 | + int timeout; | ||
1726 | + | ||
1727 | + /* | ||
1728 | + * According to the datasheet, when reading from NDDB | ||
1729 | + * with BCH enabled, after each 32 bytes reads, we | ||
1730 | + * have to make sure that the NDSR.RDDREQ bit is set. | ||
1731 | + * | ||
1732 | + * Drain the FIFO 8 32 bits reads at a time, and skip | ||
1733 | + * the polling on the last read. | ||
1734 | + */ | ||
1735 | + while (len > 8) { | ||
1736 | + __raw_readsl(info->mmio_base + NDDB, data, 8); | ||
1737 | + | ||
1738 | + for (timeout = 0; | ||
1739 | + !(nand_readl(info, NDSR) & NDSR_RDDREQ); | ||
1740 | + timeout++) { | ||
1741 | + if (timeout >= 5) { | ||
1742 | + dev_err(&info->pdev->dev, | ||
1743 | + "Timeout on RDDREQ while draining the FIFO\n"); | ||
1744 | + return; | ||
1745 | + } | ||
1746 | + | ||
1747 | + mdelay(1); | ||
1748 | + } | ||
1749 | + | ||
1750 | + data += 32; | ||
1751 | + len -= 8; | ||
1752 | + } | ||
1753 | + } | ||
1754 | + | ||
1755 | + __raw_readsl(info->mmio_base + NDDB, data, len); | ||
1756 | +} | ||
1757 | + | ||
1758 | static void handle_data_pio(struct pxa3xx_nand_info *info) | ||
1759 | { | ||
1760 | unsigned int do_bytes = min(info->data_size, info->chunk_size); | ||
1761 | @@ -496,14 +532,14 @@ static void handle_data_pio(struct pxa3xx_nand_info *info) | ||
1762 | DIV_ROUND_UP(info->oob_size, 4)); | ||
1763 | break; | ||
1764 | case STATE_PIO_READING: | ||
1765 | - __raw_readsl(info->mmio_base + NDDB, | ||
1766 | - info->data_buff + info->data_buff_pos, | ||
1767 | - DIV_ROUND_UP(do_bytes, 4)); | ||
1768 | + drain_fifo(info, | ||
1769 | + info->data_buff + info->data_buff_pos, | ||
1770 | + DIV_ROUND_UP(do_bytes, 4)); | ||
1771 | |||
1772 | if (info->oob_size > 0) | ||
1773 | - __raw_readsl(info->mmio_base + NDDB, | ||
1774 | - info->oob_buff + info->oob_buff_pos, | ||
1775 | - DIV_ROUND_UP(info->oob_size, 4)); | ||
1776 | + drain_fifo(info, | ||
1777 | + info->oob_buff + info->oob_buff_pos, | ||
1778 | + DIV_ROUND_UP(info->oob_size, 4)); | ||
1779 | break; | ||
1780 | default: | ||
1781 | dev_err(&info->pdev->dev, "%s: invalid state %d\n", __func__, | ||
1782 | diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c | ||
1783 | index 4b008c9c738d..573b53b38af4 100644 | ||
1784 | --- a/drivers/net/can/dev.c | ||
1785 | +++ b/drivers/net/can/dev.c | ||
1786 | @@ -500,6 +500,10 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) | ||
1787 | skb->pkt_type = PACKET_BROADCAST; | ||
1788 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
1789 | |||
1790 | + skb_reset_mac_header(skb); | ||
1791 | + skb_reset_network_header(skb); | ||
1792 | + skb_reset_transport_header(skb); | ||
1793 | + | ||
1794 | can_skb_reserve(skb); | ||
1795 | can_skb_prv(skb)->ifindex = dev->ifindex; | ||
1796 | |||
1797 | @@ -524,6 +528,10 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, | ||
1798 | skb->pkt_type = PACKET_BROADCAST; | ||
1799 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
1800 | |||
1801 | + skb_reset_mac_header(skb); | ||
1802 | + skb_reset_network_header(skb); | ||
1803 | + skb_reset_transport_header(skb); | ||
1804 | + | ||
1805 | can_skb_reserve(skb); | ||
1806 | can_skb_prv(skb)->ifindex = dev->ifindex; | ||
1807 | |||
1808 | diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c | ||
1809 | index 8b255e777cc7..5d777956ae1f 100644 | ||
1810 | --- a/drivers/net/can/usb/kvaser_usb.c | ||
1811 | +++ b/drivers/net/can/usb/kvaser_usb.c | ||
1812 | @@ -12,6 +12,7 @@ | ||
1813 | * Copyright (C) 2012 Olivier Sobrie <olivier@sobrie.be> | ||
1814 | */ | ||
1815 | |||
1816 | +#include <linux/kernel.h> | ||
1817 | #include <linux/completion.h> | ||
1818 | #include <linux/module.h> | ||
1819 | #include <linux/netdevice.h> | ||
1820 | @@ -403,8 +404,15 @@ static int kvaser_usb_wait_msg(const struct kvaser_usb *dev, u8 id, | ||
1821 | while (pos <= actual_len - MSG_HEADER_LEN) { | ||
1822 | tmp = buf + pos; | ||
1823 | |||
1824 | - if (!tmp->len) | ||
1825 | - break; | ||
1826 | + /* Handle messages crossing the USB endpoint max packet | ||
1827 | + * size boundary. Check kvaser_usb_read_bulk_callback() | ||
1828 | + * for further details. | ||
1829 | + */ | ||
1830 | + if (tmp->len == 0) { | ||
1831 | + pos = round_up(pos, | ||
1832 | + dev->bulk_in->wMaxPacketSize); | ||
1833 | + continue; | ||
1834 | + } | ||
1835 | |||
1836 | if (pos + tmp->len > actual_len) { | ||
1837 | dev_err(dev->udev->dev.parent, | ||
1838 | @@ -983,8 +991,19 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb) | ||
1839 | while (pos <= urb->actual_length - MSG_HEADER_LEN) { | ||
1840 | msg = urb->transfer_buffer + pos; | ||
1841 | |||
1842 | - if (!msg->len) | ||
1843 | - break; | ||
1844 | + /* The Kvaser firmware can only read and write messages that | ||
1845 | + * does not cross the USB's endpoint wMaxPacketSize boundary. | ||
1846 | + * If a follow-up command crosses such boundary, firmware puts | ||
1847 | + * a placeholder zero-length command in its place then aligns | ||
1848 | + * the real command to the next max packet size. | ||
1849 | + * | ||
1850 | + * Handle such cases or we're going to miss a significant | ||
1851 | + * number of events in case of a heavy rx load on the bus. | ||
1852 | + */ | ||
1853 | + if (msg->len == 0) { | ||
1854 | + pos = round_up(pos, dev->bulk_in->wMaxPacketSize); | ||
1855 | + continue; | ||
1856 | + } | ||
1857 | |||
1858 | if (pos + msg->len > urb->actual_length) { | ||
1859 | dev_err(dev->udev->dev.parent, "Format error\n"); | ||
1860 | @@ -992,7 +1011,6 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb) | ||
1861 | } | ||
1862 | |||
1863 | kvaser_usb_handle_message(dev, msg); | ||
1864 | - | ||
1865 | pos += msg->len; | ||
1866 | } | ||
1867 | |||
1868 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | ||
1869 | index 74fbf9ea7bd8..710eb5793eb3 100644 | ||
1870 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | ||
1871 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | ||
1872 | @@ -12711,6 +12711,9 @@ static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev, | ||
1873 | pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS, | ||
1874 | PCICFG_VENDOR_ID_OFFSET); | ||
1875 | |||
1876 | + /* Set PCIe reset type to fundamental for EEH recovery */ | ||
1877 | + pdev->needs_freset = 1; | ||
1878 | + | ||
1879 | /* AER (Advanced Error reporting) configuration */ | ||
1880 | rc = pci_enable_pcie_error_reporting(pdev); | ||
1881 | if (!rc) | ||
1882 | diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c | ||
1883 | index 3dca494797bd..96ba23e90111 100644 | ||
1884 | --- a/drivers/net/ethernet/freescale/fec_main.c | ||
1885 | +++ b/drivers/net/ethernet/freescale/fec_main.c | ||
1886 | @@ -1464,8 +1464,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) | ||
1887 | |||
1888 | vlan_packet_rcvd = true; | ||
1889 | |||
1890 | - skb_copy_to_linear_data_offset(skb, VLAN_HLEN, | ||
1891 | - data, (2 * ETH_ALEN)); | ||
1892 | + memmove(skb->data + VLAN_HLEN, data, ETH_ALEN * 2); | ||
1893 | skb_pull(skb, VLAN_HLEN); | ||
1894 | } | ||
1895 | |||
1896 | diff --git a/drivers/net/usb/cx82310_eth.c b/drivers/net/usb/cx82310_eth.c | ||
1897 | index 3eed708a6182..fe48f4c51373 100644 | ||
1898 | --- a/drivers/net/usb/cx82310_eth.c | ||
1899 | +++ b/drivers/net/usb/cx82310_eth.c | ||
1900 | @@ -300,9 +300,18 @@ static const struct driver_info cx82310_info = { | ||
1901 | .tx_fixup = cx82310_tx_fixup, | ||
1902 | }; | ||
1903 | |||
1904 | +#define USB_DEVICE_CLASS(vend, prod, cl, sc, pr) \ | ||
1905 | + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ | ||
1906 | + USB_DEVICE_ID_MATCH_DEV_INFO, \ | ||
1907 | + .idVendor = (vend), \ | ||
1908 | + .idProduct = (prod), \ | ||
1909 | + .bDeviceClass = (cl), \ | ||
1910 | + .bDeviceSubClass = (sc), \ | ||
1911 | + .bDeviceProtocol = (pr) | ||
1912 | + | ||
1913 | static const struct usb_device_id products[] = { | ||
1914 | { | ||
1915 | - USB_DEVICE_AND_INTERFACE_INFO(0x0572, 0xcb01, 0xff, 0, 0), | ||
1916 | + USB_DEVICE_CLASS(0x0572, 0xcb01, 0xff, 0, 0), | ||
1917 | .driver_info = (unsigned long) &cx82310_info | ||
1918 | }, | ||
1919 | { }, | ||
1920 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c | ||
1921 | index b0bc8ead47de..484ecce78025 100644 | ||
1922 | --- a/drivers/net/virtio_net.c | ||
1923 | +++ b/drivers/net/virtio_net.c | ||
1924 | @@ -1452,8 +1452,10 @@ static void virtnet_free_queues(struct virtnet_info *vi) | ||
1925 | { | ||
1926 | int i; | ||
1927 | |||
1928 | - for (i = 0; i < vi->max_queue_pairs; i++) | ||
1929 | + for (i = 0; i < vi->max_queue_pairs; i++) { | ||
1930 | + napi_hash_del(&vi->rq[i].napi); | ||
1931 | netif_napi_del(&vi->rq[i].napi); | ||
1932 | + } | ||
1933 | |||
1934 | kfree(vi->rq); | ||
1935 | kfree(vi->sq); | ||
1936 | @@ -1939,11 +1941,8 @@ static int virtnet_freeze(struct virtio_device *vdev) | ||
1937 | cancel_delayed_work_sync(&vi->refill); | ||
1938 | |||
1939 | if (netif_running(vi->dev)) { | ||
1940 | - for (i = 0; i < vi->max_queue_pairs; i++) { | ||
1941 | + for (i = 0; i < vi->max_queue_pairs; i++) | ||
1942 | napi_disable(&vi->rq[i].napi); | ||
1943 | - napi_hash_del(&vi->rq[i].napi); | ||
1944 | - netif_napi_del(&vi->rq[i].napi); | ||
1945 | - } | ||
1946 | } | ||
1947 | |||
1948 | remove_vq_common(vi); | ||
1949 | diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c | ||
1950 | index 2c6643fdc0cf..eb1543841e39 100644 | ||
1951 | --- a/drivers/pci/pci-sysfs.c | ||
1952 | +++ b/drivers/pci/pci-sysfs.c | ||
1953 | @@ -515,7 +515,8 @@ static ssize_t driver_override_store(struct device *dev, | ||
1954 | struct pci_dev *pdev = to_pci_dev(dev); | ||
1955 | char *driver_override, *old = pdev->driver_override, *cp; | ||
1956 | |||
1957 | - if (count > PATH_MAX) | ||
1958 | + /* We need to keep extra room for a newline */ | ||
1959 | + if (count >= (PAGE_SIZE - 1)) | ||
1960 | return -EINVAL; | ||
1961 | |||
1962 | driver_override = kstrndup(buf, count, GFP_KERNEL); | ||
1963 | @@ -543,7 +544,7 @@ static ssize_t driver_override_show(struct device *dev, | ||
1964 | { | ||
1965 | struct pci_dev *pdev = to_pci_dev(dev); | ||
1966 | |||
1967 | - return sprintf(buf, "%s\n", pdev->driver_override); | ||
1968 | + return snprintf(buf, PAGE_SIZE, "%s\n", pdev->driver_override); | ||
1969 | } | ||
1970 | static DEVICE_ATTR_RW(driver_override); | ||
1971 | |||
1972 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c | ||
1973 | index fc6fb5422b6f..d92612c51657 100644 | ||
1974 | --- a/drivers/regulator/core.c | ||
1975 | +++ b/drivers/regulator/core.c | ||
1976 | @@ -1841,10 +1841,12 @@ static int _regulator_do_enable(struct regulator_dev *rdev) | ||
1977 | } | ||
1978 | |||
1979 | if (rdev->ena_pin) { | ||
1980 | - ret = regulator_ena_gpio_ctrl(rdev, true); | ||
1981 | - if (ret < 0) | ||
1982 | - return ret; | ||
1983 | - rdev->ena_gpio_state = 1; | ||
1984 | + if (!rdev->ena_gpio_state) { | ||
1985 | + ret = regulator_ena_gpio_ctrl(rdev, true); | ||
1986 | + if (ret < 0) | ||
1987 | + return ret; | ||
1988 | + rdev->ena_gpio_state = 1; | ||
1989 | + } | ||
1990 | } else if (rdev->desc->ops->enable) { | ||
1991 | ret = rdev->desc->ops->enable(rdev); | ||
1992 | if (ret < 0) | ||
1993 | @@ -1941,10 +1943,12 @@ static int _regulator_do_disable(struct regulator_dev *rdev) | ||
1994 | trace_regulator_disable(rdev_get_name(rdev)); | ||
1995 | |||
1996 | if (rdev->ena_pin) { | ||
1997 | - ret = regulator_ena_gpio_ctrl(rdev, false); | ||
1998 | - if (ret < 0) | ||
1999 | - return ret; | ||
2000 | - rdev->ena_gpio_state = 0; | ||
2001 | + if (rdev->ena_gpio_state) { | ||
2002 | + ret = regulator_ena_gpio_ctrl(rdev, false); | ||
2003 | + if (ret < 0) | ||
2004 | + return ret; | ||
2005 | + rdev->ena_gpio_state = 0; | ||
2006 | + } | ||
2007 | |||
2008 | } else if (rdev->desc->ops->disable) { | ||
2009 | ret = rdev->desc->ops->disable(rdev); | ||
2010 | @@ -3659,12 +3663,6 @@ regulator_register(const struct regulator_desc *regulator_desc, | ||
2011 | config->ena_gpio, ret); | ||
2012 | goto wash; | ||
2013 | } | ||
2014 | - | ||
2015 | - if (config->ena_gpio_flags & GPIOF_OUT_INIT_HIGH) | ||
2016 | - rdev->ena_gpio_state = 1; | ||
2017 | - | ||
2018 | - if (config->ena_gpio_invert) | ||
2019 | - rdev->ena_gpio_state = !rdev->ena_gpio_state; | ||
2020 | } | ||
2021 | |||
2022 | /* set regulator constraints */ | ||
2023 | @@ -3837,9 +3835,11 @@ int regulator_suspend_finish(void) | ||
2024 | list_for_each_entry(rdev, ®ulator_list, list) { | ||
2025 | mutex_lock(&rdev->mutex); | ||
2026 | if (rdev->use_count > 0 || rdev->constraints->always_on) { | ||
2027 | - error = _regulator_do_enable(rdev); | ||
2028 | - if (error) | ||
2029 | - ret = error; | ||
2030 | + if (!_regulator_is_enabled(rdev)) { | ||
2031 | + error = _regulator_do_enable(rdev); | ||
2032 | + if (error) | ||
2033 | + ret = error; | ||
2034 | + } | ||
2035 | } else { | ||
2036 | if (!have_full_constraints()) | ||
2037 | goto unlock; | ||
2038 | diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c | ||
2039 | index 196a5c8838c4..b019956ba5dd 100644 | ||
2040 | --- a/drivers/regulator/rk808-regulator.c | ||
2041 | +++ b/drivers/regulator/rk808-regulator.c | ||
2042 | @@ -184,6 +184,7 @@ static const struct regulator_desc rk808_reg[] = { | ||
2043 | .vsel_mask = RK808_LDO_VSEL_MASK, | ||
2044 | .enable_reg = RK808_LDO_EN_REG, | ||
2045 | .enable_mask = BIT(0), | ||
2046 | + .enable_time = 400, | ||
2047 | .owner = THIS_MODULE, | ||
2048 | }, { | ||
2049 | .name = "LDO_REG2", | ||
2050 | @@ -198,6 +199,7 @@ static const struct regulator_desc rk808_reg[] = { | ||
2051 | .vsel_mask = RK808_LDO_VSEL_MASK, | ||
2052 | .enable_reg = RK808_LDO_EN_REG, | ||
2053 | .enable_mask = BIT(1), | ||
2054 | + .enable_time = 400, | ||
2055 | .owner = THIS_MODULE, | ||
2056 | }, { | ||
2057 | .name = "LDO_REG3", | ||
2058 | @@ -212,6 +214,7 @@ static const struct regulator_desc rk808_reg[] = { | ||
2059 | .vsel_mask = RK808_BUCK4_VSEL_MASK, | ||
2060 | .enable_reg = RK808_LDO_EN_REG, | ||
2061 | .enable_mask = BIT(2), | ||
2062 | + .enable_time = 400, | ||
2063 | .owner = THIS_MODULE, | ||
2064 | }, { | ||
2065 | .name = "LDO_REG4", | ||
2066 | @@ -226,6 +229,7 @@ static const struct regulator_desc rk808_reg[] = { | ||
2067 | .vsel_mask = RK808_LDO_VSEL_MASK, | ||
2068 | .enable_reg = RK808_LDO_EN_REG, | ||
2069 | .enable_mask = BIT(3), | ||
2070 | + .enable_time = 400, | ||
2071 | .owner = THIS_MODULE, | ||
2072 | }, { | ||
2073 | .name = "LDO_REG5", | ||
2074 | @@ -240,6 +244,7 @@ static const struct regulator_desc rk808_reg[] = { | ||
2075 | .vsel_mask = RK808_LDO_VSEL_MASK, | ||
2076 | .enable_reg = RK808_LDO_EN_REG, | ||
2077 | .enable_mask = BIT(4), | ||
2078 | + .enable_time = 400, | ||
2079 | .owner = THIS_MODULE, | ||
2080 | }, { | ||
2081 | .name = "LDO_REG6", | ||
2082 | @@ -254,6 +259,7 @@ static const struct regulator_desc rk808_reg[] = { | ||
2083 | .vsel_mask = RK808_LDO_VSEL_MASK, | ||
2084 | .enable_reg = RK808_LDO_EN_REG, | ||
2085 | .enable_mask = BIT(5), | ||
2086 | + .enable_time = 400, | ||
2087 | .owner = THIS_MODULE, | ||
2088 | }, { | ||
2089 | .name = "LDO_REG7", | ||
2090 | @@ -268,6 +274,7 @@ static const struct regulator_desc rk808_reg[] = { | ||
2091 | .vsel_mask = RK808_LDO_VSEL_MASK, | ||
2092 | .enable_reg = RK808_LDO_EN_REG, | ||
2093 | .enable_mask = BIT(6), | ||
2094 | + .enable_time = 400, | ||
2095 | .owner = THIS_MODULE, | ||
2096 | }, { | ||
2097 | .name = "LDO_REG8", | ||
2098 | @@ -282,6 +289,7 @@ static const struct regulator_desc rk808_reg[] = { | ||
2099 | .vsel_mask = RK808_LDO_VSEL_MASK, | ||
2100 | .enable_reg = RK808_LDO_EN_REG, | ||
2101 | .enable_mask = BIT(7), | ||
2102 | + .enable_time = 400, | ||
2103 | .owner = THIS_MODULE, | ||
2104 | }, { | ||
2105 | .name = "SWITCH_REG1", | ||
2106 | diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c | ||
2107 | index 806072238c00..22a612b06742 100644 | ||
2108 | --- a/drivers/rtc/rtc-s3c.c | ||
2109 | +++ b/drivers/rtc/rtc-s3c.c | ||
2110 | @@ -849,6 +849,7 @@ static struct s3c_rtc_data const s3c2443_rtc_data = { | ||
2111 | |||
2112 | static struct s3c_rtc_data const s3c6410_rtc_data = { | ||
2113 | .max_user_freq = 32768, | ||
2114 | + .needs_src_clk = true, | ||
2115 | .irq_handler = s3c6410_rtc_irq, | ||
2116 | .set_freq = s3c6410_rtc_setfreq, | ||
2117 | .enable_tick = s3c6410_rtc_enable_tick, | ||
2118 | diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c | ||
2119 | index 62b58d38ce2e..60de66252fa2 100644 | ||
2120 | --- a/drivers/scsi/libsas/sas_discover.c | ||
2121 | +++ b/drivers/scsi/libsas/sas_discover.c | ||
2122 | @@ -500,6 +500,7 @@ static void sas_revalidate_domain(struct work_struct *work) | ||
2123 | struct sas_discovery_event *ev = to_sas_discovery_event(work); | ||
2124 | struct asd_sas_port *port = ev->port; | ||
2125 | struct sas_ha_struct *ha = port->ha; | ||
2126 | + struct domain_device *ddev = port->port_dev; | ||
2127 | |||
2128 | /* prevent revalidation from finding sata links in recovery */ | ||
2129 | mutex_lock(&ha->disco_mutex); | ||
2130 | @@ -514,8 +515,9 @@ static void sas_revalidate_domain(struct work_struct *work) | ||
2131 | SAS_DPRINTK("REVALIDATING DOMAIN on port %d, pid:%d\n", port->id, | ||
2132 | task_pid_nr(current)); | ||
2133 | |||
2134 | - if (port->port_dev) | ||
2135 | - res = sas_ex_revalidate_domain(port->port_dev); | ||
2136 | + if (ddev && (ddev->dev_type == SAS_FANOUT_EXPANDER_DEVICE || | ||
2137 | + ddev->dev_type == SAS_EDGE_EXPANDER_DEVICE)) | ||
2138 | + res = sas_ex_revalidate_domain(ddev); | ||
2139 | |||
2140 | SAS_DPRINTK("done REVALIDATING DOMAIN on port %d, pid:%d, res 0x%x\n", | ||
2141 | port->id, task_pid_nr(current), res); | ||
2142 | diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c | ||
2143 | index 113c83f44b5c..4bf337aa4fd5 100644 | ||
2144 | --- a/drivers/spi/spi-atmel.c | ||
2145 | +++ b/drivers/spi/spi-atmel.c | ||
2146 | @@ -775,17 +775,17 @@ static void atmel_spi_pdc_next_xfer(struct spi_master *master, | ||
2147 | (unsigned long long)xfer->rx_dma); | ||
2148 | } | ||
2149 | |||
2150 | - /* REVISIT: We're waiting for ENDRX before we start the next | ||
2151 | + /* REVISIT: We're waiting for RXBUFF before we start the next | ||
2152 | * transfer because we need to handle some difficult timing | ||
2153 | - * issues otherwise. If we wait for ENDTX in one transfer and | ||
2154 | - * then starts waiting for ENDRX in the next, it's difficult | ||
2155 | - * to tell the difference between the ENDRX interrupt we're | ||
2156 | - * actually waiting for and the ENDRX interrupt of the | ||
2157 | + * issues otherwise. If we wait for TXBUFE in one transfer and | ||
2158 | + * then starts waiting for RXBUFF in the next, it's difficult | ||
2159 | + * to tell the difference between the RXBUFF interrupt we're | ||
2160 | + * actually waiting for and the RXBUFF interrupt of the | ||
2161 | * previous transfer. | ||
2162 | * | ||
2163 | * It should be doable, though. Just not now... | ||
2164 | */ | ||
2165 | - spi_writel(as, IER, SPI_BIT(ENDRX) | SPI_BIT(OVRES)); | ||
2166 | + spi_writel(as, IER, SPI_BIT(RXBUFF) | SPI_BIT(OVRES)); | ||
2167 | spi_writel(as, PTCR, SPI_BIT(TXTEN) | SPI_BIT(RXTEN)); | ||
2168 | } | ||
2169 | |||
2170 | diff --git a/drivers/spi/spi-dw-mid.c b/drivers/spi/spi-dw-mid.c | ||
2171 | index efff55537d8a..1417f96546ce 100644 | ||
2172 | --- a/drivers/spi/spi-dw-mid.c | ||
2173 | +++ b/drivers/spi/spi-dw-mid.c | ||
2174 | @@ -151,6 +151,9 @@ static int mid_spi_dma_transfer(struct dw_spi *dws, int cs_change) | ||
2175 | 1, | ||
2176 | DMA_MEM_TO_DEV, | ||
2177 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | ||
2178 | + if (!txdesc) | ||
2179 | + return NULL; | ||
2180 | + | ||
2181 | txdesc->callback = dw_spi_dma_done; | ||
2182 | txdesc->callback_param = dws; | ||
2183 | |||
2184 | @@ -173,6 +176,9 @@ static int mid_spi_dma_transfer(struct dw_spi *dws, int cs_change) | ||
2185 | 1, | ||
2186 | DMA_DEV_TO_MEM, | ||
2187 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | ||
2188 | + if (!rxdesc) | ||
2189 | + return NULL; | ||
2190 | + | ||
2191 | rxdesc->callback = dw_spi_dma_done; | ||
2192 | rxdesc->callback_param = dws; | ||
2193 | |||
2194 | diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c | ||
2195 | index fc2dd8441608..11e18342bc4f 100644 | ||
2196 | --- a/drivers/spi/spi-pl022.c | ||
2197 | +++ b/drivers/spi/spi-pl022.c | ||
2198 | @@ -534,12 +534,12 @@ static void giveback(struct pl022 *pl022) | ||
2199 | pl022->cur_msg = NULL; | ||
2200 | pl022->cur_transfer = NULL; | ||
2201 | pl022->cur_chip = NULL; | ||
2202 | - spi_finalize_current_message(pl022->master); | ||
2203 | |||
2204 | /* disable the SPI/SSP operation */ | ||
2205 | writew((readw(SSP_CR1(pl022->virtbase)) & | ||
2206 | (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase)); | ||
2207 | |||
2208 | + spi_finalize_current_message(pl022->master); | ||
2209 | } | ||
2210 | |||
2211 | /** | ||
2212 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
2213 | index 73e58d22e325..6446490854cb 100644 | ||
2214 | --- a/drivers/target/iscsi/iscsi_target.c | ||
2215 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
2216 | @@ -4220,11 +4220,17 @@ int iscsit_close_connection( | ||
2217 | pr_debug("Closing iSCSI connection CID %hu on SID:" | ||
2218 | " %u\n", conn->cid, sess->sid); | ||
2219 | /* | ||
2220 | - * Always up conn_logout_comp just in case the RX Thread is sleeping | ||
2221 | - * and the logout response never got sent because the connection | ||
2222 | - * failed. | ||
2223 | + * Always up conn_logout_comp for the traditional TCP case just in case | ||
2224 | + * the RX Thread in iscsi_target_rx_opcode() is sleeping and the logout | ||
2225 | + * response never got sent because the connection failed. | ||
2226 | + * | ||
2227 | + * However for iser-target, isert_wait4logout() is using conn_logout_comp | ||
2228 | + * to signal logout response TX interrupt completion. Go ahead and skip | ||
2229 | + * this for iser since isert_rx_opcode() does not wait on logout failure, | ||
2230 | + * and to avoid iscsi_conn pointer dereference in iser-target code. | ||
2231 | */ | ||
2232 | - complete(&conn->conn_logout_comp); | ||
2233 | + if (conn->conn_transport->transport_type == ISCSI_TCP) | ||
2234 | + complete(&conn->conn_logout_comp); | ||
2235 | |||
2236 | iscsi_release_thread_set(conn); | ||
2237 | |||
2238 | diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c | ||
2239 | index 24fa5d1999af..9e0f5d3b3ebf 100644 | ||
2240 | --- a/drivers/target/target_core_device.c | ||
2241 | +++ b/drivers/target/target_core_device.c | ||
2242 | @@ -1598,8 +1598,6 @@ int target_configure_device(struct se_device *dev) | ||
2243 | ret = dev->transport->configure_device(dev); | ||
2244 | if (ret) | ||
2245 | goto out; | ||
2246 | - dev->dev_flags |= DF_CONFIGURED; | ||
2247 | - | ||
2248 | /* | ||
2249 | * XXX: there is not much point to have two different values here.. | ||
2250 | */ | ||
2251 | @@ -1661,6 +1659,8 @@ int target_configure_device(struct se_device *dev) | ||
2252 | list_add_tail(&dev->g_dev_node, &g_device_list); | ||
2253 | mutex_unlock(&g_device_mutex); | ||
2254 | |||
2255 | + dev->dev_flags |= DF_CONFIGURED; | ||
2256 | + | ||
2257 | return 0; | ||
2258 | |||
2259 | out_free_alua: | ||
2260 | diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c | ||
2261 | index 7c8291f0bbbc..9a54381e23c6 100644 | ||
2262 | --- a/drivers/target/target_core_pscsi.c | ||
2263 | +++ b/drivers/target/target_core_pscsi.c | ||
2264 | @@ -1120,7 +1120,7 @@ static u32 pscsi_get_device_type(struct se_device *dev) | ||
2265 | struct pscsi_dev_virt *pdv = PSCSI_DEV(dev); | ||
2266 | struct scsi_device *sd = pdv->pdv_sd; | ||
2267 | |||
2268 | - return sd->type; | ||
2269 | + return (sd) ? sd->type : TYPE_NO_LUN; | ||
2270 | } | ||
2271 | |||
2272 | static sector_t pscsi_get_blocks(struct se_device *dev) | ||
2273 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c | ||
2274 | index be877bf6f730..2e0998420254 100644 | ||
2275 | --- a/drivers/target/target_core_transport.c | ||
2276 | +++ b/drivers/target/target_core_transport.c | ||
2277 | @@ -2389,6 +2389,10 @@ int target_get_sess_cmd(struct se_session *se_sess, struct se_cmd *se_cmd, | ||
2278 | list_add_tail(&se_cmd->se_cmd_list, &se_sess->sess_cmd_list); | ||
2279 | out: | ||
2280 | spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); | ||
2281 | + | ||
2282 | + if (ret && ack_kref) | ||
2283 | + target_put_sess_cmd(se_sess, se_cmd); | ||
2284 | + | ||
2285 | return ret; | ||
2286 | } | ||
2287 | EXPORT_SYMBOL(target_get_sess_cmd); | ||
2288 | diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c | ||
2289 | index beea6ca73ee5..a69e31e3410f 100644 | ||
2290 | --- a/drivers/tty/serial/8250/8250_dw.c | ||
2291 | +++ b/drivers/tty/serial/8250/8250_dw.c | ||
2292 | @@ -111,7 +111,10 @@ static void dw8250_serial_out(struct uart_port *p, int offset, int value) | ||
2293 | dw8250_force_idle(p); | ||
2294 | writeb(value, p->membase + (UART_LCR << p->regshift)); | ||
2295 | } | ||
2296 | - dev_err(p->dev, "Couldn't set LCR to %d\n", value); | ||
2297 | + /* | ||
2298 | + * FIXME: this deadlocks if port->lock is already held | ||
2299 | + * dev_err(p->dev, "Couldn't set LCR to %d\n", value); | ||
2300 | + */ | ||
2301 | } | ||
2302 | } | ||
2303 | |||
2304 | @@ -148,7 +151,10 @@ static void dw8250_serial_out32(struct uart_port *p, int offset, int value) | ||
2305 | dw8250_force_idle(p); | ||
2306 | writel(value, p->membase + (UART_LCR << p->regshift)); | ||
2307 | } | ||
2308 | - dev_err(p->dev, "Couldn't set LCR to %d\n", value); | ||
2309 | + /* | ||
2310 | + * FIXME: this deadlocks if port->lock is already held | ||
2311 | + * dev_err(p->dev, "Couldn't set LCR to %d\n", value); | ||
2312 | + */ | ||
2313 | } | ||
2314 | } | ||
2315 | |||
2316 | diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c | ||
2317 | index beb9d71cd47a..439bd1a5d00c 100644 | ||
2318 | --- a/drivers/tty/serial/8250/8250_pci.c | ||
2319 | +++ b/drivers/tty/serial/8250/8250_pci.c | ||
2320 | @@ -69,7 +69,7 @@ static void moan_device(const char *str, struct pci_dev *dev) | ||
2321 | "Please send the output of lspci -vv, this\n" | ||
2322 | "message (0x%04x,0x%04x,0x%04x,0x%04x), the\n" | ||
2323 | "manufacturer and name of serial board or\n" | ||
2324 | - "modem board to rmk+serial@arm.linux.org.uk.\n", | ||
2325 | + "modem board to <linux-serial@vger.kernel.org>.\n", | ||
2326 | pci_name(dev), str, dev->vendor, dev->device, | ||
2327 | dev->subsystem_vendor, dev->subsystem_device); | ||
2328 | } | ||
2329 | diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c | ||
2330 | index 08048613eed6..db2becd31a51 100644 | ||
2331 | --- a/drivers/usb/gadget/legacy/inode.c | ||
2332 | +++ b/drivers/usb/gadget/legacy/inode.c | ||
2333 | @@ -565,7 +565,6 @@ static ssize_t ep_copy_to_user(struct kiocb_priv *priv) | ||
2334 | if (total == 0) | ||
2335 | break; | ||
2336 | } | ||
2337 | - | ||
2338 | return len; | ||
2339 | } | ||
2340 | |||
2341 | @@ -584,6 +583,7 @@ static void ep_user_copy_worker(struct work_struct *work) | ||
2342 | aio_complete(iocb, ret, ret); | ||
2343 | |||
2344 | kfree(priv->buf); | ||
2345 | + kfree(priv->iv); | ||
2346 | kfree(priv); | ||
2347 | } | ||
2348 | |||
2349 | @@ -604,6 +604,7 @@ static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req) | ||
2350 | */ | ||
2351 | if (priv->iv == NULL || unlikely(req->actual == 0)) { | ||
2352 | kfree(req->buf); | ||
2353 | + kfree(priv->iv); | ||
2354 | kfree(priv); | ||
2355 | iocb->private = NULL; | ||
2356 | /* aio_complete() reports bytes-transferred _and_ faults */ | ||
2357 | @@ -639,7 +640,7 @@ ep_aio_rwtail( | ||
2358 | struct usb_request *req; | ||
2359 | ssize_t value; | ||
2360 | |||
2361 | - priv = kmalloc(sizeof *priv, GFP_KERNEL); | ||
2362 | + priv = kzalloc(sizeof *priv, GFP_KERNEL); | ||
2363 | if (!priv) { | ||
2364 | value = -ENOMEM; | ||
2365 | fail: | ||
2366 | @@ -648,7 +649,14 @@ fail: | ||
2367 | } | ||
2368 | iocb->private = priv; | ||
2369 | priv->iocb = iocb; | ||
2370 | - priv->iv = iv; | ||
2371 | + if (iv) { | ||
2372 | + priv->iv = kmemdup(iv, nr_segs * sizeof(struct iovec), | ||
2373 | + GFP_KERNEL); | ||
2374 | + if (!priv->iv) { | ||
2375 | + kfree(priv); | ||
2376 | + goto fail; | ||
2377 | + } | ||
2378 | + } | ||
2379 | priv->nr_segs = nr_segs; | ||
2380 | INIT_WORK(&priv->work, ep_user_copy_worker); | ||
2381 | |||
2382 | @@ -688,6 +696,7 @@ fail: | ||
2383 | mutex_unlock(&epdata->lock); | ||
2384 | |||
2385 | if (unlikely(value)) { | ||
2386 | + kfree(priv->iv); | ||
2387 | kfree(priv); | ||
2388 | put_ep(epdata); | ||
2389 | } else | ||
2390 | diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c | ||
2391 | index b4bca2d4a7e5..70fba973a107 100644 | ||
2392 | --- a/drivers/xen/events/events_base.c | ||
2393 | +++ b/drivers/xen/events/events_base.c | ||
2394 | @@ -526,20 +526,26 @@ static unsigned int __startup_pirq(unsigned int irq) | ||
2395 | pirq_query_unmask(irq); | ||
2396 | |||
2397 | rc = set_evtchn_to_irq(evtchn, irq); | ||
2398 | - if (rc != 0) { | ||
2399 | - pr_err("irq%d: Failed to set port to irq mapping (%d)\n", | ||
2400 | - irq, rc); | ||
2401 | - xen_evtchn_close(evtchn); | ||
2402 | - return 0; | ||
2403 | - } | ||
2404 | + if (rc) | ||
2405 | + goto err; | ||
2406 | + | ||
2407 | bind_evtchn_to_cpu(evtchn, 0); | ||
2408 | info->evtchn = evtchn; | ||
2409 | |||
2410 | + rc = xen_evtchn_port_setup(info); | ||
2411 | + if (rc) | ||
2412 | + goto err; | ||
2413 | + | ||
2414 | out: | ||
2415 | unmask_evtchn(evtchn); | ||
2416 | eoi_pirq(irq_get_irq_data(irq)); | ||
2417 | |||
2418 | return 0; | ||
2419 | + | ||
2420 | +err: | ||
2421 | + pr_err("irq%d: Failed to set port to irq mapping (%d)\n", irq, rc); | ||
2422 | + xen_evtchn_close(evtchn); | ||
2423 | + return 0; | ||
2424 | } | ||
2425 | |||
2426 | static unsigned int startup_pirq(struct irq_data *data) | ||
2427 | diff --git a/drivers/xen/xen-pciback/conf_space.c b/drivers/xen/xen-pciback/conf_space.c | ||
2428 | index 46ae0f9f02ad..75fe3d466515 100644 | ||
2429 | --- a/drivers/xen/xen-pciback/conf_space.c | ||
2430 | +++ b/drivers/xen/xen-pciback/conf_space.c | ||
2431 | @@ -16,7 +16,7 @@ | ||
2432 | #include "conf_space.h" | ||
2433 | #include "conf_space_quirks.h" | ||
2434 | |||
2435 | -static bool permissive; | ||
2436 | +bool permissive; | ||
2437 | module_param(permissive, bool, 0644); | ||
2438 | |||
2439 | /* This is where xen_pcibk_read_config_byte, xen_pcibk_read_config_word, | ||
2440 | diff --git a/drivers/xen/xen-pciback/conf_space.h b/drivers/xen/xen-pciback/conf_space.h | ||
2441 | index e56c934ad137..2e1d73d1d5d0 100644 | ||
2442 | --- a/drivers/xen/xen-pciback/conf_space.h | ||
2443 | +++ b/drivers/xen/xen-pciback/conf_space.h | ||
2444 | @@ -64,6 +64,8 @@ struct config_field_entry { | ||
2445 | void *data; | ||
2446 | }; | ||
2447 | |||
2448 | +extern bool permissive; | ||
2449 | + | ||
2450 | #define OFFSET(cfg_entry) ((cfg_entry)->base_offset+(cfg_entry)->field->offset) | ||
2451 | |||
2452 | /* Add fields to a device - the add_fields macro expects to get a pointer to | ||
2453 | diff --git a/drivers/xen/xen-pciback/conf_space_header.c b/drivers/xen/xen-pciback/conf_space_header.c | ||
2454 | index c5ee82587e8c..2d7369391472 100644 | ||
2455 | --- a/drivers/xen/xen-pciback/conf_space_header.c | ||
2456 | +++ b/drivers/xen/xen-pciback/conf_space_header.c | ||
2457 | @@ -11,6 +11,10 @@ | ||
2458 | #include "pciback.h" | ||
2459 | #include "conf_space.h" | ||
2460 | |||
2461 | +struct pci_cmd_info { | ||
2462 | + u16 val; | ||
2463 | +}; | ||
2464 | + | ||
2465 | struct pci_bar_info { | ||
2466 | u32 val; | ||
2467 | u32 len_val; | ||
2468 | @@ -20,22 +24,36 @@ struct pci_bar_info { | ||
2469 | #define is_enable_cmd(value) ((value)&(PCI_COMMAND_MEMORY|PCI_COMMAND_IO)) | ||
2470 | #define is_master_cmd(value) ((value)&PCI_COMMAND_MASTER) | ||
2471 | |||
2472 | -static int command_read(struct pci_dev *dev, int offset, u16 *value, void *data) | ||
2473 | +/* Bits guests are allowed to control in permissive mode. */ | ||
2474 | +#define PCI_COMMAND_GUEST (PCI_COMMAND_MASTER|PCI_COMMAND_SPECIAL| \ | ||
2475 | + PCI_COMMAND_INVALIDATE|PCI_COMMAND_VGA_PALETTE| \ | ||
2476 | + PCI_COMMAND_WAIT|PCI_COMMAND_FAST_BACK) | ||
2477 | + | ||
2478 | +static void *command_init(struct pci_dev *dev, int offset) | ||
2479 | { | ||
2480 | - int i; | ||
2481 | - int ret; | ||
2482 | - | ||
2483 | - ret = xen_pcibk_read_config_word(dev, offset, value, data); | ||
2484 | - if (!pci_is_enabled(dev)) | ||
2485 | - return ret; | ||
2486 | - | ||
2487 | - for (i = 0; i < PCI_ROM_RESOURCE; i++) { | ||
2488 | - if (dev->resource[i].flags & IORESOURCE_IO) | ||
2489 | - *value |= PCI_COMMAND_IO; | ||
2490 | - if (dev->resource[i].flags & IORESOURCE_MEM) | ||
2491 | - *value |= PCI_COMMAND_MEMORY; | ||
2492 | + struct pci_cmd_info *cmd = kmalloc(sizeof(*cmd), GFP_KERNEL); | ||
2493 | + int err; | ||
2494 | + | ||
2495 | + if (!cmd) | ||
2496 | + return ERR_PTR(-ENOMEM); | ||
2497 | + | ||
2498 | + err = pci_read_config_word(dev, PCI_COMMAND, &cmd->val); | ||
2499 | + if (err) { | ||
2500 | + kfree(cmd); | ||
2501 | + return ERR_PTR(err); | ||
2502 | } | ||
2503 | |||
2504 | + return cmd; | ||
2505 | +} | ||
2506 | + | ||
2507 | +static int command_read(struct pci_dev *dev, int offset, u16 *value, void *data) | ||
2508 | +{ | ||
2509 | + int ret = pci_read_config_word(dev, offset, value); | ||
2510 | + const struct pci_cmd_info *cmd = data; | ||
2511 | + | ||
2512 | + *value &= PCI_COMMAND_GUEST; | ||
2513 | + *value |= cmd->val & ~PCI_COMMAND_GUEST; | ||
2514 | + | ||
2515 | return ret; | ||
2516 | } | ||
2517 | |||
2518 | @@ -43,6 +61,8 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data) | ||
2519 | { | ||
2520 | struct xen_pcibk_dev_data *dev_data; | ||
2521 | int err; | ||
2522 | + u16 val; | ||
2523 | + struct pci_cmd_info *cmd = data; | ||
2524 | |||
2525 | dev_data = pci_get_drvdata(dev); | ||
2526 | if (!pci_is_enabled(dev) && is_enable_cmd(value)) { | ||
2527 | @@ -83,6 +103,19 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data) | ||
2528 | } | ||
2529 | } | ||
2530 | |||
2531 | + cmd->val = value; | ||
2532 | + | ||
2533 | + if (!permissive && (!dev_data || !dev_data->permissive)) | ||
2534 | + return 0; | ||
2535 | + | ||
2536 | + /* Only allow the guest to control certain bits. */ | ||
2537 | + err = pci_read_config_word(dev, offset, &val); | ||
2538 | + if (err || val == value) | ||
2539 | + return err; | ||
2540 | + | ||
2541 | + value &= PCI_COMMAND_GUEST; | ||
2542 | + value |= val & ~PCI_COMMAND_GUEST; | ||
2543 | + | ||
2544 | return pci_write_config_word(dev, offset, value); | ||
2545 | } | ||
2546 | |||
2547 | @@ -282,6 +315,8 @@ static const struct config_field header_common[] = { | ||
2548 | { | ||
2549 | .offset = PCI_COMMAND, | ||
2550 | .size = 2, | ||
2551 | + .init = command_init, | ||
2552 | + .release = bar_release, | ||
2553 | .u.w.read = command_read, | ||
2554 | .u.w.write = command_write, | ||
2555 | }, | ||
2556 | diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c | ||
2557 | index ca887314aba9..f2bbb8513360 100644 | ||
2558 | --- a/fs/fuse/dev.c | ||
2559 | +++ b/fs/fuse/dev.c | ||
2560 | @@ -814,8 +814,8 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep) | ||
2561 | |||
2562 | newpage = buf->page; | ||
2563 | |||
2564 | - if (WARN_ON(!PageUptodate(newpage))) | ||
2565 | - return -EIO; | ||
2566 | + if (!PageUptodate(newpage)) | ||
2567 | + SetPageUptodate(newpage); | ||
2568 | |||
2569 | ClearPageMappedToDisk(newpage); | ||
2570 | |||
2571 | @@ -1721,6 +1721,9 @@ copy_finish: | ||
2572 | static int fuse_notify(struct fuse_conn *fc, enum fuse_notify_code code, | ||
2573 | unsigned int size, struct fuse_copy_state *cs) | ||
2574 | { | ||
2575 | + /* Don't try to move pages (yet) */ | ||
2576 | + cs->move_pages = 0; | ||
2577 | + | ||
2578 | switch (code) { | ||
2579 | case FUSE_NOTIFY_POLL: | ||
2580 | return fuse_notify_poll(fc, size, cs); | ||
2581 | diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c | ||
2582 | index 469086b9f99b..0c3f303baf32 100644 | ||
2583 | --- a/fs/nilfs2/segment.c | ||
2584 | +++ b/fs/nilfs2/segment.c | ||
2585 | @@ -1907,6 +1907,7 @@ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, | ||
2586 | struct the_nilfs *nilfs) | ||
2587 | { | ||
2588 | struct nilfs_inode_info *ii, *n; | ||
2589 | + int during_mount = !(sci->sc_super->s_flags & MS_ACTIVE); | ||
2590 | int defer_iput = false; | ||
2591 | |||
2592 | spin_lock(&nilfs->ns_inode_lock); | ||
2593 | @@ -1919,10 +1920,10 @@ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, | ||
2594 | brelse(ii->i_bh); | ||
2595 | ii->i_bh = NULL; | ||
2596 | list_del_init(&ii->i_dirty); | ||
2597 | - if (!ii->vfs_inode.i_nlink) { | ||
2598 | + if (!ii->vfs_inode.i_nlink || during_mount) { | ||
2599 | /* | ||
2600 | - * Defer calling iput() to avoid a deadlock | ||
2601 | - * over I_SYNC flag for inodes with i_nlink == 0 | ||
2602 | + * Defer calling iput() to avoid deadlocks if | ||
2603 | + * i_nlink == 0 or mount is not yet finished. | ||
2604 | */ | ||
2605 | list_add_tail(&ii->i_dirty, &sci->sc_iput_queue); | ||
2606 | defer_iput = true; | ||
2607 | diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c | ||
2608 | index e8972bcddfb4..69aa378e60d9 100644 | ||
2609 | --- a/fs/proc/task_mmu.c | ||
2610 | +++ b/fs/proc/task_mmu.c | ||
2611 | @@ -1291,6 +1291,9 @@ out: | ||
2612 | |||
2613 | static int pagemap_open(struct inode *inode, struct file *file) | ||
2614 | { | ||
2615 | + /* do not disclose physical addresses: attack vector */ | ||
2616 | + if (!capable(CAP_SYS_ADMIN)) | ||
2617 | + return -EPERM; | ||
2618 | pr_warn_once("Bits 55-60 of /proc/PID/pagemap entries are about " | ||
2619 | "to stop being page-shift some time soon. See the " | ||
2620 | "linux/Documentation/vm/pagemap.txt for details.\n"); | ||
2621 | diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h | ||
2622 | index 5672d7ea1fa0..08848050922e 100644 | ||
2623 | --- a/include/asm-generic/tlb.h | ||
2624 | +++ b/include/asm-generic/tlb.h | ||
2625 | @@ -96,10 +96,9 @@ struct mmu_gather { | ||
2626 | #endif | ||
2627 | unsigned long start; | ||
2628 | unsigned long end; | ||
2629 | - unsigned int need_flush : 1, /* Did free PTEs */ | ||
2630 | /* we are in the middle of an operation to clear | ||
2631 | * a full mm and can make some optimizations */ | ||
2632 | - fullmm : 1, | ||
2633 | + unsigned int fullmm : 1, | ||
2634 | /* we have performed an operation which | ||
2635 | * requires a complete flush of the tlb */ | ||
2636 | need_flush_all : 1; | ||
2637 | @@ -128,16 +127,54 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page) | ||
2638 | tlb_flush_mmu(tlb); | ||
2639 | } | ||
2640 | |||
2641 | +static inline void __tlb_adjust_range(struct mmu_gather *tlb, | ||
2642 | + unsigned long address) | ||
2643 | +{ | ||
2644 | + tlb->start = min(tlb->start, address); | ||
2645 | + tlb->end = max(tlb->end, address + PAGE_SIZE); | ||
2646 | +} | ||
2647 | + | ||
2648 | +static inline void __tlb_reset_range(struct mmu_gather *tlb) | ||
2649 | +{ | ||
2650 | + tlb->start = TASK_SIZE; | ||
2651 | + tlb->end = 0; | ||
2652 | +} | ||
2653 | + | ||
2654 | +/* | ||
2655 | + * In the case of tlb vma handling, we can optimise these away in the | ||
2656 | + * case where we're doing a full MM flush. When we're doing a munmap, | ||
2657 | + * the vmas are adjusted to only cover the region to be torn down. | ||
2658 | + */ | ||
2659 | +#ifndef tlb_start_vma | ||
2660 | +#define tlb_start_vma(tlb, vma) do { } while (0) | ||
2661 | +#endif | ||
2662 | + | ||
2663 | +#define __tlb_end_vma(tlb, vma) \ | ||
2664 | + do { \ | ||
2665 | + if (!tlb->fullmm && tlb->end) { \ | ||
2666 | + tlb_flush(tlb); \ | ||
2667 | + __tlb_reset_range(tlb); \ | ||
2668 | + } \ | ||
2669 | + } while (0) | ||
2670 | + | ||
2671 | +#ifndef tlb_end_vma | ||
2672 | +#define tlb_end_vma __tlb_end_vma | ||
2673 | +#endif | ||
2674 | + | ||
2675 | +#ifndef __tlb_remove_tlb_entry | ||
2676 | +#define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0) | ||
2677 | +#endif | ||
2678 | + | ||
2679 | /** | ||
2680 | * tlb_remove_tlb_entry - remember a pte unmapping for later tlb invalidation. | ||
2681 | * | ||
2682 | - * Record the fact that pte's were really umapped in ->need_flush, so we can | ||
2683 | - * later optimise away the tlb invalidate. This helps when userspace is | ||
2684 | - * unmapping already-unmapped pages, which happens quite a lot. | ||
2685 | + * Record the fact that pte's were really unmapped by updating the range, | ||
2686 | + * so we can later optimise away the tlb invalidate. This helps when | ||
2687 | + * userspace is unmapping already-unmapped pages, which happens quite a lot. | ||
2688 | */ | ||
2689 | #define tlb_remove_tlb_entry(tlb, ptep, address) \ | ||
2690 | do { \ | ||
2691 | - tlb->need_flush = 1; \ | ||
2692 | + __tlb_adjust_range(tlb, address); \ | ||
2693 | __tlb_remove_tlb_entry(tlb, ptep, address); \ | ||
2694 | } while (0) | ||
2695 | |||
2696 | @@ -151,27 +188,27 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page) | ||
2697 | |||
2698 | #define tlb_remove_pmd_tlb_entry(tlb, pmdp, address) \ | ||
2699 | do { \ | ||
2700 | - tlb->need_flush = 1; \ | ||
2701 | + __tlb_adjust_range(tlb, address); \ | ||
2702 | __tlb_remove_pmd_tlb_entry(tlb, pmdp, address); \ | ||
2703 | } while (0) | ||
2704 | |||
2705 | #define pte_free_tlb(tlb, ptep, address) \ | ||
2706 | do { \ | ||
2707 | - tlb->need_flush = 1; \ | ||
2708 | + __tlb_adjust_range(tlb, address); \ | ||
2709 | __pte_free_tlb(tlb, ptep, address); \ | ||
2710 | } while (0) | ||
2711 | |||
2712 | #ifndef __ARCH_HAS_4LEVEL_HACK | ||
2713 | #define pud_free_tlb(tlb, pudp, address) \ | ||
2714 | do { \ | ||
2715 | - tlb->need_flush = 1; \ | ||
2716 | + __tlb_adjust_range(tlb, address); \ | ||
2717 | __pud_free_tlb(tlb, pudp, address); \ | ||
2718 | } while (0) | ||
2719 | #endif | ||
2720 | |||
2721 | #define pmd_free_tlb(tlb, pmdp, address) \ | ||
2722 | do { \ | ||
2723 | - tlb->need_flush = 1; \ | ||
2724 | + __tlb_adjust_range(tlb, address); \ | ||
2725 | __pmd_free_tlb(tlb, pmdp, address); \ | ||
2726 | } while (0) | ||
2727 | |||
2728 | diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h | ||
2729 | index b996e6cde6bb..9eb54f41623e 100644 | ||
2730 | --- a/include/linux/workqueue.h | ||
2731 | +++ b/include/linux/workqueue.h | ||
2732 | @@ -70,7 +70,8 @@ enum { | ||
2733 | /* data contains off-queue information when !WORK_STRUCT_PWQ */ | ||
2734 | WORK_OFFQ_FLAG_BASE = WORK_STRUCT_COLOR_SHIFT, | ||
2735 | |||
2736 | - WORK_OFFQ_CANCELING = (1 << WORK_OFFQ_FLAG_BASE), | ||
2737 | + __WORK_OFFQ_CANCELING = WORK_OFFQ_FLAG_BASE, | ||
2738 | + WORK_OFFQ_CANCELING = (1 << __WORK_OFFQ_CANCELING), | ||
2739 | |||
2740 | /* | ||
2741 | * When a work item is off queue, its high bits point to the last | ||
2742 | diff --git a/kernel/cpuset.c b/kernel/cpuset.c | ||
2743 | index 1f107c74087b..672310e1597e 100644 | ||
2744 | --- a/kernel/cpuset.c | ||
2745 | +++ b/kernel/cpuset.c | ||
2746 | @@ -538,9 +538,6 @@ static void update_domain_attr_tree(struct sched_domain_attr *dattr, | ||
2747 | |||
2748 | rcu_read_lock(); | ||
2749 | cpuset_for_each_descendant_pre(cp, pos_css, root_cs) { | ||
2750 | - if (cp == root_cs) | ||
2751 | - continue; | ||
2752 | - | ||
2753 | /* skip the whole subtree if @cp doesn't have any CPU */ | ||
2754 | if (cpumask_empty(cp->cpus_allowed)) { | ||
2755 | pos_css = css_rightmost_descendant(pos_css); | ||
2756 | @@ -863,7 +860,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct cpumask *new_cpus) | ||
2757 | * If it becomes empty, inherit the effective mask of the | ||
2758 | * parent, which is guaranteed to have some CPUs. | ||
2759 | */ | ||
2760 | - if (cpumask_empty(new_cpus)) | ||
2761 | + if (cgroup_on_dfl(cp->css.cgroup) && cpumask_empty(new_cpus)) | ||
2762 | cpumask_copy(new_cpus, parent->effective_cpus); | ||
2763 | |||
2764 | /* Skip the whole subtree if the cpumask remains the same. */ | ||
2765 | @@ -1119,7 +1116,7 @@ static void update_nodemasks_hier(struct cpuset *cs, nodemask_t *new_mems) | ||
2766 | * If it becomes empty, inherit the effective mask of the | ||
2767 | * parent, which is guaranteed to have some MEMs. | ||
2768 | */ | ||
2769 | - if (nodes_empty(*new_mems)) | ||
2770 | + if (cgroup_on_dfl(cp->css.cgroup) && nodes_empty(*new_mems)) | ||
2771 | *new_mems = parent->effective_mems; | ||
2772 | |||
2773 | /* Skip the whole subtree if the nodemask remains the same. */ | ||
2774 | @@ -1991,7 +1988,9 @@ static int cpuset_css_online(struct cgroup_subsys_state *css) | ||
2775 | |||
2776 | mutex_lock(&callback_mutex); | ||
2777 | cs->mems_allowed = parent->mems_allowed; | ||
2778 | + cs->effective_mems = parent->mems_allowed; | ||
2779 | cpumask_copy(cs->cpus_allowed, parent->cpus_allowed); | ||
2780 | + cpumask_copy(cs->effective_cpus, parent->cpus_allowed); | ||
2781 | mutex_unlock(&callback_mutex); | ||
2782 | out_unlock: | ||
2783 | mutex_unlock(&cpuset_mutex); | ||
2784 | diff --git a/kernel/printk/console_cmdline.h b/kernel/printk/console_cmdline.h | ||
2785 | index cbd69d842341..2ca4a8b5fe57 100644 | ||
2786 | --- a/kernel/printk/console_cmdline.h | ||
2787 | +++ b/kernel/printk/console_cmdline.h | ||
2788 | @@ -3,7 +3,7 @@ | ||
2789 | |||
2790 | struct console_cmdline | ||
2791 | { | ||
2792 | - char name[8]; /* Name of the driver */ | ||
2793 | + char name[16]; /* Name of the driver */ | ||
2794 | int index; /* Minor dev. to use */ | ||
2795 | char *options; /* Options for the driver */ | ||
2796 | #ifdef CONFIG_A11Y_BRAILLE_CONSOLE | ||
2797 | diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c | ||
2798 | index ced2b84b1cb7..bf95fdad4d96 100644 | ||
2799 | --- a/kernel/printk/printk.c | ||
2800 | +++ b/kernel/printk/printk.c | ||
2801 | @@ -2440,6 +2440,7 @@ void register_console(struct console *newcon) | ||
2802 | for (i = 0, c = console_cmdline; | ||
2803 | i < MAX_CMDLINECONSOLES && c->name[0]; | ||
2804 | i++, c++) { | ||
2805 | + BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name)); | ||
2806 | if (strcmp(c->name, newcon->name) != 0) | ||
2807 | continue; | ||
2808 | if (newcon->index >= 0 && | ||
2809 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c | ||
2810 | index 124e2c702ead..d1eff3dd8a02 100644 | ||
2811 | --- a/kernel/trace/ftrace.c | ||
2812 | +++ b/kernel/trace/ftrace.c | ||
2813 | @@ -1053,6 +1053,12 @@ static __init void ftrace_profile_debugfs(struct dentry *d_tracer) | ||
2814 | |||
2815 | static struct pid * const ftrace_swapper_pid = &init_struct_pid; | ||
2816 | |||
2817 | +#ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
2818 | +static int ftrace_graph_active; | ||
2819 | +#else | ||
2820 | +# define ftrace_graph_active 0 | ||
2821 | +#endif | ||
2822 | + | ||
2823 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
2824 | |||
2825 | static struct ftrace_ops *removed_ops; | ||
2826 | @@ -1849,8 +1855,12 @@ static int ftrace_check_record(struct dyn_ftrace *rec, int enable, int update) | ||
2827 | if (!ftrace_rec_count(rec)) | ||
2828 | rec->flags = 0; | ||
2829 | else | ||
2830 | - /* Just disable the record (keep REGS state) */ | ||
2831 | - rec->flags &= ~FTRACE_FL_ENABLED; | ||
2832 | + /* | ||
2833 | + * Just disable the record, but keep the ops TRAMP | ||
2834 | + * and REGS states. The _EN flags must be disabled though. | ||
2835 | + */ | ||
2836 | + rec->flags &= ~(FTRACE_FL_ENABLED | FTRACE_FL_TRAMP_EN | | ||
2837 | + FTRACE_FL_REGS_EN); | ||
2838 | } | ||
2839 | |||
2840 | return FTRACE_UPDATE_MAKE_NOP; | ||
2841 | @@ -2482,24 +2492,36 @@ static int ftrace_shutdown(struct ftrace_ops *ops, int command) | ||
2842 | |||
2843 | static void ftrace_startup_sysctl(void) | ||
2844 | { | ||
2845 | + int command; | ||
2846 | + | ||
2847 | if (unlikely(ftrace_disabled)) | ||
2848 | return; | ||
2849 | |||
2850 | /* Force update next time */ | ||
2851 | saved_ftrace_func = NULL; | ||
2852 | /* ftrace_start_up is true if we want ftrace running */ | ||
2853 | - if (ftrace_start_up) | ||
2854 | - ftrace_run_update_code(FTRACE_UPDATE_CALLS); | ||
2855 | + if (ftrace_start_up) { | ||
2856 | + command = FTRACE_UPDATE_CALLS; | ||
2857 | + if (ftrace_graph_active) | ||
2858 | + command |= FTRACE_START_FUNC_RET; | ||
2859 | + ftrace_startup_enable(command); | ||
2860 | + } | ||
2861 | } | ||
2862 | |||
2863 | static void ftrace_shutdown_sysctl(void) | ||
2864 | { | ||
2865 | + int command; | ||
2866 | + | ||
2867 | if (unlikely(ftrace_disabled)) | ||
2868 | return; | ||
2869 | |||
2870 | /* ftrace_start_up is true if ftrace is running */ | ||
2871 | - if (ftrace_start_up) | ||
2872 | - ftrace_run_update_code(FTRACE_DISABLE_CALLS); | ||
2873 | + if (ftrace_start_up) { | ||
2874 | + command = FTRACE_DISABLE_CALLS; | ||
2875 | + if (ftrace_graph_active) | ||
2876 | + command |= FTRACE_STOP_FUNC_RET; | ||
2877 | + ftrace_run_update_code(command); | ||
2878 | + } | ||
2879 | } | ||
2880 | |||
2881 | static cycle_t ftrace_update_time; | ||
2882 | @@ -5303,12 +5325,12 @@ ftrace_enable_sysctl(struct ctl_table *table, int write, | ||
2883 | |||
2884 | if (ftrace_enabled) { | ||
2885 | |||
2886 | - ftrace_startup_sysctl(); | ||
2887 | - | ||
2888 | /* we are starting ftrace again */ | ||
2889 | if (ftrace_ops_list != &ftrace_list_end) | ||
2890 | update_ftrace_function(); | ||
2891 | |||
2892 | + ftrace_startup_sysctl(); | ||
2893 | + | ||
2894 | } else { | ||
2895 | /* stopping ftrace calls (just send to ftrace_stub) */ | ||
2896 | ftrace_trace_function = ftrace_stub; | ||
2897 | @@ -5334,8 +5356,6 @@ static struct ftrace_ops graph_ops = { | ||
2898 | ASSIGN_OPS_HASH(graph_ops, &global_ops.local_hash) | ||
2899 | }; | ||
2900 | |||
2901 | -static int ftrace_graph_active; | ||
2902 | - | ||
2903 | int ftrace_graph_entry_stub(struct ftrace_graph_ent *trace) | ||
2904 | { | ||
2905 | return 0; | ||
2906 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c | ||
2907 | index 66940a53d128..2273f534b01a 100644 | ||
2908 | --- a/kernel/workqueue.c | ||
2909 | +++ b/kernel/workqueue.c | ||
2910 | @@ -2710,19 +2710,57 @@ bool flush_work(struct work_struct *work) | ||
2911 | } | ||
2912 | EXPORT_SYMBOL_GPL(flush_work); | ||
2913 | |||
2914 | +struct cwt_wait { | ||
2915 | + wait_queue_t wait; | ||
2916 | + struct work_struct *work; | ||
2917 | +}; | ||
2918 | + | ||
2919 | +static int cwt_wakefn(wait_queue_t *wait, unsigned mode, int sync, void *key) | ||
2920 | +{ | ||
2921 | + struct cwt_wait *cwait = container_of(wait, struct cwt_wait, wait); | ||
2922 | + | ||
2923 | + if (cwait->work != key) | ||
2924 | + return 0; | ||
2925 | + return autoremove_wake_function(wait, mode, sync, key); | ||
2926 | +} | ||
2927 | + | ||
2928 | static bool __cancel_work_timer(struct work_struct *work, bool is_dwork) | ||
2929 | { | ||
2930 | + static DECLARE_WAIT_QUEUE_HEAD(cancel_waitq); | ||
2931 | unsigned long flags; | ||
2932 | int ret; | ||
2933 | |||
2934 | do { | ||
2935 | ret = try_to_grab_pending(work, is_dwork, &flags); | ||
2936 | /* | ||
2937 | - * If someone else is canceling, wait for the same event it | ||
2938 | - * would be waiting for before retrying. | ||
2939 | + * If someone else is already canceling, wait for it to | ||
2940 | + * finish. flush_work() doesn't work for PREEMPT_NONE | ||
2941 | + * because we may get scheduled between @work's completion | ||
2942 | + * and the other canceling task resuming and clearing | ||
2943 | + * CANCELING - flush_work() will return false immediately | ||
2944 | + * as @work is no longer busy, try_to_grab_pending() will | ||
2945 | + * return -ENOENT as @work is still being canceled and the | ||
2946 | + * other canceling task won't be able to clear CANCELING as | ||
2947 | + * we're hogging the CPU. | ||
2948 | + * | ||
2949 | + * Let's wait for completion using a waitqueue. As this | ||
2950 | + * may lead to the thundering herd problem, use a custom | ||
2951 | + * wake function which matches @work along with exclusive | ||
2952 | + * wait and wakeup. | ||
2953 | */ | ||
2954 | - if (unlikely(ret == -ENOENT)) | ||
2955 | - flush_work(work); | ||
2956 | + if (unlikely(ret == -ENOENT)) { | ||
2957 | + struct cwt_wait cwait; | ||
2958 | + | ||
2959 | + init_wait(&cwait.wait); | ||
2960 | + cwait.wait.func = cwt_wakefn; | ||
2961 | + cwait.work = work; | ||
2962 | + | ||
2963 | + prepare_to_wait_exclusive(&cancel_waitq, &cwait.wait, | ||
2964 | + TASK_UNINTERRUPTIBLE); | ||
2965 | + if (work_is_canceling(work)) | ||
2966 | + schedule(); | ||
2967 | + finish_wait(&cancel_waitq, &cwait.wait); | ||
2968 | + } | ||
2969 | } while (unlikely(ret < 0)); | ||
2970 | |||
2971 | /* tell other tasks trying to grab @work to back off */ | ||
2972 | @@ -2731,6 +2769,16 @@ static bool __cancel_work_timer(struct work_struct *work, bool is_dwork) | ||
2973 | |||
2974 | flush_work(work); | ||
2975 | clear_work_data(work); | ||
2976 | + | ||
2977 | + /* | ||
2978 | + * Paired with prepare_to_wait() above so that either | ||
2979 | + * waitqueue_active() is visible here or !work_is_canceling() is | ||
2980 | + * visible there. | ||
2981 | + */ | ||
2982 | + smp_mb(); | ||
2983 | + if (waitqueue_active(&cancel_waitq)) | ||
2984 | + __wake_up(&cancel_waitq, TASK_NORMAL, 1, work); | ||
2985 | + | ||
2986 | return ret; | ||
2987 | } | ||
2988 | |||
2989 | diff --git a/lib/lz4/lz4_decompress.c b/lib/lz4/lz4_decompress.c | ||
2990 | index 7a85967060a5..f0f5c5c3de12 100644 | ||
2991 | --- a/lib/lz4/lz4_decompress.c | ||
2992 | +++ b/lib/lz4/lz4_decompress.c | ||
2993 | @@ -139,6 +139,9 @@ static int lz4_uncompress(const char *source, char *dest, int osize) | ||
2994 | /* Error: request to write beyond destination buffer */ | ||
2995 | if (cpy > oend) | ||
2996 | goto _output_error; | ||
2997 | + if ((ref + COPYLENGTH) > oend || | ||
2998 | + (op + COPYLENGTH) > oend) | ||
2999 | + goto _output_error; | ||
3000 | LZ4_SECURECOPY(ref, op, (oend - COPYLENGTH)); | ||
3001 | while (op < cpy) | ||
3002 | *op++ = *ref++; | ||
3003 | diff --git a/mm/memory.c b/mm/memory.c | ||
3004 | index 4ffa7b571fb8..90fb265b32b6 100644 | ||
3005 | --- a/mm/memory.c | ||
3006 | +++ b/mm/memory.c | ||
3007 | @@ -220,9 +220,6 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long | ||
3008 | /* Is it from 0 to ~0? */ | ||
3009 | tlb->fullmm = !(start | (end+1)); | ||
3010 | tlb->need_flush_all = 0; | ||
3011 | - tlb->start = start; | ||
3012 | - tlb->end = end; | ||
3013 | - tlb->need_flush = 0; | ||
3014 | tlb->local.next = NULL; | ||
3015 | tlb->local.nr = 0; | ||
3016 | tlb->local.max = ARRAY_SIZE(tlb->__pages); | ||
3017 | @@ -232,15 +229,20 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long | ||
3018 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
3019 | tlb->batch = NULL; | ||
3020 | #endif | ||
3021 | + | ||
3022 | + __tlb_reset_range(tlb); | ||
3023 | } | ||
3024 | |||
3025 | static void tlb_flush_mmu_tlbonly(struct mmu_gather *tlb) | ||
3026 | { | ||
3027 | - tlb->need_flush = 0; | ||
3028 | + if (!tlb->end) | ||
3029 | + return; | ||
3030 | + | ||
3031 | tlb_flush(tlb); | ||
3032 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
3033 | tlb_table_flush(tlb); | ||
3034 | #endif | ||
3035 | + __tlb_reset_range(tlb); | ||
3036 | } | ||
3037 | |||
3038 | static void tlb_flush_mmu_free(struct mmu_gather *tlb) | ||
3039 | @@ -256,8 +258,6 @@ static void tlb_flush_mmu_free(struct mmu_gather *tlb) | ||
3040 | |||
3041 | void tlb_flush_mmu(struct mmu_gather *tlb) | ||
3042 | { | ||
3043 | - if (!tlb->need_flush) | ||
3044 | - return; | ||
3045 | tlb_flush_mmu_tlbonly(tlb); | ||
3046 | tlb_flush_mmu_free(tlb); | ||
3047 | } | ||
3048 | @@ -292,7 +292,7 @@ int __tlb_remove_page(struct mmu_gather *tlb, struct page *page) | ||
3049 | { | ||
3050 | struct mmu_gather_batch *batch; | ||
3051 | |||
3052 | - VM_BUG_ON(!tlb->need_flush); | ||
3053 | + VM_BUG_ON(!tlb->end); | ||
3054 | |||
3055 | batch = tlb->active; | ||
3056 | batch->pages[batch->nr++] = page; | ||
3057 | @@ -359,8 +359,6 @@ void tlb_remove_table(struct mmu_gather *tlb, void *table) | ||
3058 | { | ||
3059 | struct mmu_table_batch **batch = &tlb->batch; | ||
3060 | |||
3061 | - tlb->need_flush = 1; | ||
3062 | - | ||
3063 | /* | ||
3064 | * When there's less then two users of this mm there cannot be a | ||
3065 | * concurrent page-table walk. | ||
3066 | @@ -1186,20 +1184,8 @@ again: | ||
3067 | arch_leave_lazy_mmu_mode(); | ||
3068 | |||
3069 | /* Do the actual TLB flush before dropping ptl */ | ||
3070 | - if (force_flush) { | ||
3071 | - unsigned long old_end; | ||
3072 | - | ||
3073 | - /* | ||
3074 | - * Flush the TLB just for the previous segment, | ||
3075 | - * then update the range to be the remaining | ||
3076 | - * TLB range. | ||
3077 | - */ | ||
3078 | - old_end = tlb->end; | ||
3079 | - tlb->end = addr; | ||
3080 | + if (force_flush) | ||
3081 | tlb_flush_mmu_tlbonly(tlb); | ||
3082 | - tlb->start = addr; | ||
3083 | - tlb->end = old_end; | ||
3084 | - } | ||
3085 | pte_unmap_unlock(start_pte, ptl); | ||
3086 | |||
3087 | /* | ||
3088 | diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c | ||
3089 | index 43f750e88e19..765c78110fa8 100644 | ||
3090 | --- a/net/caif/caif_socket.c | ||
3091 | +++ b/net/caif/caif_socket.c | ||
3092 | @@ -281,7 +281,7 @@ static int caif_seqpkt_recvmsg(struct kiocb *iocb, struct socket *sock, | ||
3093 | int copylen; | ||
3094 | |||
3095 | ret = -EOPNOTSUPP; | ||
3096 | - if (m->msg_flags&MSG_OOB) | ||
3097 | + if (flags & MSG_OOB) | ||
3098 | goto read_error; | ||
3099 | |||
3100 | skb = skb_recv_datagram(sk, flags, 0 , &ret); | ||
3101 | diff --git a/net/can/af_can.c b/net/can/af_can.c | ||
3102 | index ce82337521f6..d6030d6949df 100644 | ||
3103 | --- a/net/can/af_can.c | ||
3104 | +++ b/net/can/af_can.c | ||
3105 | @@ -262,6 +262,9 @@ int can_send(struct sk_buff *skb, int loop) | ||
3106 | goto inval_skb; | ||
3107 | } | ||
3108 | |||
3109 | + skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
3110 | + | ||
3111 | + skb_reset_mac_header(skb); | ||
3112 | skb_reset_network_header(skb); | ||
3113 | skb_reset_transport_header(skb); | ||
3114 | |||
3115 | diff --git a/net/compat.c b/net/compat.c | ||
3116 | index c48930373e65..53e933eb78b8 100644 | ||
3117 | --- a/net/compat.c | ||
3118 | +++ b/net/compat.c | ||
3119 | @@ -71,6 +71,13 @@ int get_compat_msghdr(struct msghdr *kmsg, struct compat_msghdr __user *umsg) | ||
3120 | __get_user(kmsg->msg_controllen, &umsg->msg_controllen) || | ||
3121 | __get_user(kmsg->msg_flags, &umsg->msg_flags)) | ||
3122 | return -EFAULT; | ||
3123 | + | ||
3124 | + if (!tmp1) | ||
3125 | + kmsg->msg_namelen = 0; | ||
3126 | + | ||
3127 | + if (kmsg->msg_namelen < 0) | ||
3128 | + return -EINVAL; | ||
3129 | + | ||
3130 | if (kmsg->msg_namelen > sizeof(struct sockaddr_storage)) | ||
3131 | kmsg->msg_namelen = sizeof(struct sockaddr_storage); | ||
3132 | kmsg->msg_name = compat_ptr(tmp1); | ||
3133 | diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c | ||
3134 | index cf9cd13509a7..e731c96eac4b 100644 | ||
3135 | --- a/net/core/sysctl_net_core.c | ||
3136 | +++ b/net/core/sysctl_net_core.c | ||
3137 | @@ -25,6 +25,8 @@ | ||
3138 | static int zero = 0; | ||
3139 | static int one = 1; | ||
3140 | static int ushort_max = USHRT_MAX; | ||
3141 | +static int min_sndbuf = SOCK_MIN_SNDBUF; | ||
3142 | +static int min_rcvbuf = SOCK_MIN_RCVBUF; | ||
3143 | |||
3144 | #ifdef CONFIG_RPS | ||
3145 | static int rps_sock_flow_sysctl(struct ctl_table *table, int write, | ||
3146 | @@ -223,7 +225,7 @@ static struct ctl_table net_core_table[] = { | ||
3147 | .maxlen = sizeof(int), | ||
3148 | .mode = 0644, | ||
3149 | .proc_handler = proc_dointvec_minmax, | ||
3150 | - .extra1 = &one, | ||
3151 | + .extra1 = &min_sndbuf, | ||
3152 | }, | ||
3153 | { | ||
3154 | .procname = "rmem_max", | ||
3155 | @@ -231,7 +233,7 @@ static struct ctl_table net_core_table[] = { | ||
3156 | .maxlen = sizeof(int), | ||
3157 | .mode = 0644, | ||
3158 | .proc_handler = proc_dointvec_minmax, | ||
3159 | - .extra1 = &one, | ||
3160 | + .extra1 = &min_rcvbuf, | ||
3161 | }, | ||
3162 | { | ||
3163 | .procname = "wmem_default", | ||
3164 | @@ -239,7 +241,7 @@ static struct ctl_table net_core_table[] = { | ||
3165 | .maxlen = sizeof(int), | ||
3166 | .mode = 0644, | ||
3167 | .proc_handler = proc_dointvec_minmax, | ||
3168 | - .extra1 = &one, | ||
3169 | + .extra1 = &min_sndbuf, | ||
3170 | }, | ||
3171 | { | ||
3172 | .procname = "rmem_default", | ||
3173 | @@ -247,7 +249,7 @@ static struct ctl_table net_core_table[] = { | ||
3174 | .maxlen = sizeof(int), | ||
3175 | .mode = 0644, | ||
3176 | .proc_handler = proc_dointvec_minmax, | ||
3177 | - .extra1 = &one, | ||
3178 | + .extra1 = &min_rcvbuf, | ||
3179 | }, | ||
3180 | { | ||
3181 | .procname = "dev_weight", | ||
3182 | diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c | ||
3183 | index e34dccbc4d70..4eeba4e497a0 100644 | ||
3184 | --- a/net/ipv4/inet_diag.c | ||
3185 | +++ b/net/ipv4/inet_diag.c | ||
3186 | @@ -71,6 +71,20 @@ static inline void inet_diag_unlock_handler( | ||
3187 | mutex_unlock(&inet_diag_table_mutex); | ||
3188 | } | ||
3189 | |||
3190 | +static size_t inet_sk_attr_size(void) | ||
3191 | +{ | ||
3192 | + return nla_total_size(sizeof(struct tcp_info)) | ||
3193 | + + nla_total_size(1) /* INET_DIAG_SHUTDOWN */ | ||
3194 | + + nla_total_size(1) /* INET_DIAG_TOS */ | ||
3195 | + + nla_total_size(1) /* INET_DIAG_TCLASS */ | ||
3196 | + + nla_total_size(sizeof(struct inet_diag_meminfo)) | ||
3197 | + + nla_total_size(sizeof(struct inet_diag_msg)) | ||
3198 | + + nla_total_size(SK_MEMINFO_VARS * sizeof(u32)) | ||
3199 | + + nla_total_size(TCP_CA_NAME_MAX) | ||
3200 | + + nla_total_size(sizeof(struct tcpvegas_info)) | ||
3201 | + + 64; | ||
3202 | +} | ||
3203 | + | ||
3204 | int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, | ||
3205 | struct sk_buff *skb, struct inet_diag_req_v2 *req, | ||
3206 | struct user_namespace *user_ns, | ||
3207 | @@ -324,9 +338,7 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_s | ||
3208 | if (err) | ||
3209 | goto out; | ||
3210 | |||
3211 | - rep = nlmsg_new(sizeof(struct inet_diag_msg) + | ||
3212 | - sizeof(struct inet_diag_meminfo) + | ||
3213 | - sizeof(struct tcp_info) + 64, GFP_KERNEL); | ||
3214 | + rep = nlmsg_new(inet_sk_attr_size(), GFP_KERNEL); | ||
3215 | if (!rep) { | ||
3216 | err = -ENOMEM; | ||
3217 | goto out; | ||
3218 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
3219 | index c2df40ba553f..022ecbc9322d 100644 | ||
3220 | --- a/net/ipv4/tcp_output.c | ||
3221 | +++ b/net/ipv4/tcp_output.c | ||
3222 | @@ -2739,15 +2739,11 @@ void tcp_send_fin(struct sock *sk) | ||
3223 | } else { | ||
3224 | /* Socket is locked, keep trying until memory is available. */ | ||
3225 | for (;;) { | ||
3226 | - skb = alloc_skb_fclone(MAX_TCP_HEADER, | ||
3227 | - sk->sk_allocation); | ||
3228 | + skb = sk_stream_alloc_skb(sk, 0, sk->sk_allocation); | ||
3229 | if (skb) | ||
3230 | break; | ||
3231 | yield(); | ||
3232 | } | ||
3233 | - | ||
3234 | - /* Reserve space for headers and prepare control bits. */ | ||
3235 | - skb_reserve(skb, MAX_TCP_HEADER); | ||
3236 | /* FIN eats a sequence byte, write_seq advanced by tcp_queue_skb(). */ | ||
3237 | tcp_init_nondata_skb(skb, tp->write_seq, | ||
3238 | TCPHDR_ACK | TCPHDR_FIN); | ||
3239 | @@ -2998,9 +2994,9 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn) | ||
3240 | { | ||
3241 | struct tcp_sock *tp = tcp_sk(sk); | ||
3242 | struct tcp_fastopen_request *fo = tp->fastopen_req; | ||
3243 | - int syn_loss = 0, space, i, err = 0, iovlen = fo->data->msg_iovlen; | ||
3244 | - struct sk_buff *syn_data = NULL, *data; | ||
3245 | + int syn_loss = 0, space, err = 0; | ||
3246 | unsigned long last_syn_loss = 0; | ||
3247 | + struct sk_buff *syn_data; | ||
3248 | |||
3249 | tp->rx_opt.mss_clamp = tp->advmss; /* If MSS is not cached */ | ||
3250 | tcp_fastopen_cache_get(sk, &tp->rx_opt.mss_clamp, &fo->cookie, | ||
3251 | @@ -3031,48 +3027,40 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn) | ||
3252 | /* limit to order-0 allocations */ | ||
3253 | space = min_t(size_t, space, SKB_MAX_HEAD(MAX_TCP_HEADER)); | ||
3254 | |||
3255 | - syn_data = skb_copy_expand(syn, MAX_TCP_HEADER, space, | ||
3256 | - sk->sk_allocation); | ||
3257 | - if (syn_data == NULL) | ||
3258 | + syn_data = sk_stream_alloc_skb(sk, space, sk->sk_allocation); | ||
3259 | + if (!syn_data) | ||
3260 | + goto fallback; | ||
3261 | + syn_data->ip_summed = CHECKSUM_PARTIAL; | ||
3262 | + memcpy(syn_data->cb, syn->cb, sizeof(syn->cb)); | ||
3263 | + if (unlikely(memcpy_fromiovecend(skb_put(syn_data, space), | ||
3264 | + fo->data->msg_iov, 0, space))) { | ||
3265 | + kfree_skb(syn_data); | ||
3266 | goto fallback; | ||
3267 | + } | ||
3268 | |||
3269 | - for (i = 0; i < iovlen && syn_data->len < space; ++i) { | ||
3270 | - struct iovec *iov = &fo->data->msg_iov[i]; | ||
3271 | - unsigned char __user *from = iov->iov_base; | ||
3272 | - int len = iov->iov_len; | ||
3273 | + /* No more data pending in inet_wait_for_connect() */ | ||
3274 | + if (space == fo->size) | ||
3275 | + fo->data = NULL; | ||
3276 | + fo->copied = space; | ||
3277 | |||
3278 | - if (syn_data->len + len > space) | ||
3279 | - len = space - syn_data->len; | ||
3280 | - else if (i + 1 == iovlen) | ||
3281 | - /* No more data pending in inet_wait_for_connect() */ | ||
3282 | - fo->data = NULL; | ||
3283 | + tcp_connect_queue_skb(sk, syn_data); | ||
3284 | |||
3285 | - if (skb_add_data(syn_data, from, len)) | ||
3286 | - goto fallback; | ||
3287 | - } | ||
3288 | + err = tcp_transmit_skb(sk, syn_data, 1, sk->sk_allocation); | ||
3289 | |||
3290 | - /* Queue a data-only packet after the regular SYN for retransmission */ | ||
3291 | - data = pskb_copy(syn_data, sk->sk_allocation); | ||
3292 | - if (data == NULL) | ||
3293 | - goto fallback; | ||
3294 | - TCP_SKB_CB(data)->seq++; | ||
3295 | - TCP_SKB_CB(data)->tcp_flags &= ~TCPHDR_SYN; | ||
3296 | - TCP_SKB_CB(data)->tcp_flags = (TCPHDR_ACK|TCPHDR_PSH); | ||
3297 | - tcp_connect_queue_skb(sk, data); | ||
3298 | - fo->copied = data->len; | ||
3299 | - | ||
3300 | - /* syn_data is about to be sent, we need to take current time stamps | ||
3301 | - * for the packets that are in write queue : SYN packet and DATA | ||
3302 | - */ | ||
3303 | - skb_mstamp_get(&syn->skb_mstamp); | ||
3304 | - data->skb_mstamp = syn->skb_mstamp; | ||
3305 | + syn->skb_mstamp = syn_data->skb_mstamp; | ||
3306 | |||
3307 | - if (tcp_transmit_skb(sk, syn_data, 0, sk->sk_allocation) == 0) { | ||
3308 | + /* Now full SYN+DATA was cloned and sent (or not), | ||
3309 | + * remove the SYN from the original skb (syn_data) | ||
3310 | + * we keep in write queue in case of a retransmit, as we | ||
3311 | + * also have the SYN packet (with no data) in the same queue. | ||
3312 | + */ | ||
3313 | + TCP_SKB_CB(syn_data)->seq++; | ||
3314 | + TCP_SKB_CB(syn_data)->tcp_flags = TCPHDR_ACK | TCPHDR_PSH; | ||
3315 | + if (!err) { | ||
3316 | tp->syn_data = (fo->copied > 0); | ||
3317 | NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPORIGDATASENT); | ||
3318 | goto done; | ||
3319 | } | ||
3320 | - syn_data = NULL; | ||
3321 | |||
3322 | fallback: | ||
3323 | /* Send a regular SYN with Fast Open cookie request option */ | ||
3324 | @@ -3081,7 +3069,6 @@ fallback: | ||
3325 | err = tcp_transmit_skb(sk, syn, 1, sk->sk_allocation); | ||
3326 | if (err) | ||
3327 | tp->syn_fastopen = 0; | ||
3328 | - kfree_skb(syn_data); | ||
3329 | done: | ||
3330 | fo->cookie.len = -1; /* Exclude Fast Open option for SYN retries */ | ||
3331 | return err; | ||
3332 | @@ -3101,13 +3088,10 @@ int tcp_connect(struct sock *sk) | ||
3333 | return 0; | ||
3334 | } | ||
3335 | |||
3336 | - buff = alloc_skb_fclone(MAX_TCP_HEADER + 15, sk->sk_allocation); | ||
3337 | - if (unlikely(buff == NULL)) | ||
3338 | + buff = sk_stream_alloc_skb(sk, 0, sk->sk_allocation); | ||
3339 | + if (unlikely(!buff)) | ||
3340 | return -ENOBUFS; | ||
3341 | |||
3342 | - /* Reserve space for headers. */ | ||
3343 | - skb_reserve(buff, MAX_TCP_HEADER); | ||
3344 | - | ||
3345 | tcp_init_nondata_skb(buff, tp->write_seq++, TCPHDR_SYN); | ||
3346 | tp->retrans_stamp = tcp_time_stamp; | ||
3347 | tcp_connect_queue_skb(sk, buff); | ||
3348 | diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c | ||
3349 | index b4d5e1d97c1b..27ca79682efb 100644 | ||
3350 | --- a/net/ipv6/fib6_rules.c | ||
3351 | +++ b/net/ipv6/fib6_rules.c | ||
3352 | @@ -104,6 +104,7 @@ static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, | ||
3353 | goto again; | ||
3354 | flp6->saddr = saddr; | ||
3355 | } | ||
3356 | + err = rt->dst.error; | ||
3357 | goto out; | ||
3358 | } | ||
3359 | again: | ||
3360 | diff --git a/net/rds/iw_rdma.c b/net/rds/iw_rdma.c | ||
3361 | index a817705ce2d0..dba8d0864f18 100644 | ||
3362 | --- a/net/rds/iw_rdma.c | ||
3363 | +++ b/net/rds/iw_rdma.c | ||
3364 | @@ -88,7 +88,9 @@ static unsigned int rds_iw_unmap_fastreg_list(struct rds_iw_mr_pool *pool, | ||
3365 | int *unpinned); | ||
3366 | static void rds_iw_destroy_fastreg(struct rds_iw_mr_pool *pool, struct rds_iw_mr *ibmr); | ||
3367 | |||
3368 | -static int rds_iw_get_device(struct rds_sock *rs, struct rds_iw_device **rds_iwdev, struct rdma_cm_id **cm_id) | ||
3369 | +static int rds_iw_get_device(struct sockaddr_in *src, struct sockaddr_in *dst, | ||
3370 | + struct rds_iw_device **rds_iwdev, | ||
3371 | + struct rdma_cm_id **cm_id) | ||
3372 | { | ||
3373 | struct rds_iw_device *iwdev; | ||
3374 | struct rds_iw_cm_id *i_cm_id; | ||
3375 | @@ -112,15 +114,15 @@ static int rds_iw_get_device(struct rds_sock *rs, struct rds_iw_device **rds_iwd | ||
3376 | src_addr->sin_port, | ||
3377 | dst_addr->sin_addr.s_addr, | ||
3378 | dst_addr->sin_port, | ||
3379 | - rs->rs_bound_addr, | ||
3380 | - rs->rs_bound_port, | ||
3381 | - rs->rs_conn_addr, | ||
3382 | - rs->rs_conn_port); | ||
3383 | + src->sin_addr.s_addr, | ||
3384 | + src->sin_port, | ||
3385 | + dst->sin_addr.s_addr, | ||
3386 | + dst->sin_port); | ||
3387 | #ifdef WORKING_TUPLE_DETECTION | ||
3388 | - if (src_addr->sin_addr.s_addr == rs->rs_bound_addr && | ||
3389 | - src_addr->sin_port == rs->rs_bound_port && | ||
3390 | - dst_addr->sin_addr.s_addr == rs->rs_conn_addr && | ||
3391 | - dst_addr->sin_port == rs->rs_conn_port) { | ||
3392 | + if (src_addr->sin_addr.s_addr == src->sin_addr.s_addr && | ||
3393 | + src_addr->sin_port == src->sin_port && | ||
3394 | + dst_addr->sin_addr.s_addr == dst->sin_addr.s_addr && | ||
3395 | + dst_addr->sin_port == dst->sin_port) { | ||
3396 | #else | ||
3397 | /* FIXME - needs to compare the local and remote | ||
3398 | * ipaddr/port tuple, but the ipaddr is the only | ||
3399 | @@ -128,7 +130,7 @@ static int rds_iw_get_device(struct rds_sock *rs, struct rds_iw_device **rds_iwd | ||
3400 | * zero'ed. It doesn't appear to be properly populated | ||
3401 | * during connection setup... | ||
3402 | */ | ||
3403 | - if (src_addr->sin_addr.s_addr == rs->rs_bound_addr) { | ||
3404 | + if (src_addr->sin_addr.s_addr == src->sin_addr.s_addr) { | ||
3405 | #endif | ||
3406 | spin_unlock_irq(&iwdev->spinlock); | ||
3407 | *rds_iwdev = iwdev; | ||
3408 | @@ -180,19 +182,13 @@ int rds_iw_update_cm_id(struct rds_iw_device *rds_iwdev, struct rdma_cm_id *cm_i | ||
3409 | { | ||
3410 | struct sockaddr_in *src_addr, *dst_addr; | ||
3411 | struct rds_iw_device *rds_iwdev_old; | ||
3412 | - struct rds_sock rs; | ||
3413 | struct rdma_cm_id *pcm_id; | ||
3414 | int rc; | ||
3415 | |||
3416 | src_addr = (struct sockaddr_in *)&cm_id->route.addr.src_addr; | ||
3417 | dst_addr = (struct sockaddr_in *)&cm_id->route.addr.dst_addr; | ||
3418 | |||
3419 | - rs.rs_bound_addr = src_addr->sin_addr.s_addr; | ||
3420 | - rs.rs_bound_port = src_addr->sin_port; | ||
3421 | - rs.rs_conn_addr = dst_addr->sin_addr.s_addr; | ||
3422 | - rs.rs_conn_port = dst_addr->sin_port; | ||
3423 | - | ||
3424 | - rc = rds_iw_get_device(&rs, &rds_iwdev_old, &pcm_id); | ||
3425 | + rc = rds_iw_get_device(src_addr, dst_addr, &rds_iwdev_old, &pcm_id); | ||
3426 | if (rc) | ||
3427 | rds_iw_remove_cm_id(rds_iwdev, cm_id); | ||
3428 | |||
3429 | @@ -598,9 +594,17 @@ void *rds_iw_get_mr(struct scatterlist *sg, unsigned long nents, | ||
3430 | struct rds_iw_device *rds_iwdev; | ||
3431 | struct rds_iw_mr *ibmr = NULL; | ||
3432 | struct rdma_cm_id *cm_id; | ||
3433 | + struct sockaddr_in src = { | ||
3434 | + .sin_addr.s_addr = rs->rs_bound_addr, | ||
3435 | + .sin_port = rs->rs_bound_port, | ||
3436 | + }; | ||
3437 | + struct sockaddr_in dst = { | ||
3438 | + .sin_addr.s_addr = rs->rs_conn_addr, | ||
3439 | + .sin_port = rs->rs_conn_port, | ||
3440 | + }; | ||
3441 | int ret; | ||
3442 | |||
3443 | - ret = rds_iw_get_device(rs, &rds_iwdev, &cm_id); | ||
3444 | + ret = rds_iw_get_device(&src, &dst, &rds_iwdev, &cm_id); | ||
3445 | if (ret || !cm_id) { | ||
3446 | ret = -ENODEV; | ||
3447 | goto out; | ||
3448 | diff --git a/net/rxrpc/ar-recvmsg.c b/net/rxrpc/ar-recvmsg.c | ||
3449 | index e9aaa65c0778..0df95463c650 100644 | ||
3450 | --- a/net/rxrpc/ar-recvmsg.c | ||
3451 | +++ b/net/rxrpc/ar-recvmsg.c | ||
3452 | @@ -87,7 +87,7 @@ int rxrpc_recvmsg(struct kiocb *iocb, struct socket *sock, | ||
3453 | if (!skb) { | ||
3454 | /* nothing remains on the queue */ | ||
3455 | if (copied && | ||
3456 | - (msg->msg_flags & MSG_PEEK || timeo == 0)) | ||
3457 | + (flags & MSG_PEEK || timeo == 0)) | ||
3458 | goto out; | ||
3459 | |||
3460 | /* wait for a message to turn up */ | ||
3461 | diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c | ||
3462 | index 0472909bb014..b78d81f5ffda 100644 | ||
3463 | --- a/net/sched/cls_u32.c | ||
3464 | +++ b/net/sched/cls_u32.c | ||
3465 | @@ -78,8 +78,11 @@ struct tc_u_hnode { | ||
3466 | struct tc_u_common *tp_c; | ||
3467 | int refcnt; | ||
3468 | unsigned int divisor; | ||
3469 | - struct tc_u_knode __rcu *ht[1]; | ||
3470 | struct rcu_head rcu; | ||
3471 | + /* The 'ht' field MUST be the last field in structure to allow for | ||
3472 | + * more entries allocated at end of structure. | ||
3473 | + */ | ||
3474 | + struct tc_u_knode __rcu *ht[1]; | ||
3475 | }; | ||
3476 | |||
3477 | struct tc_u_common { | ||
3478 | diff --git a/sound/core/control.c b/sound/core/control.c | ||
3479 | index b9611344ff9e..82a638a01b24 100644 | ||
3480 | --- a/sound/core/control.c | ||
3481 | +++ b/sound/core/control.c | ||
3482 | @@ -1167,6 +1167,10 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file, | ||
3483 | |||
3484 | if (info->count < 1) | ||
3485 | return -EINVAL; | ||
3486 | + if (!*info->id.name) | ||
3487 | + return -EINVAL; | ||
3488 | + if (strnlen(info->id.name, sizeof(info->id.name)) >= sizeof(info->id.name)) | ||
3489 | + return -EINVAL; | ||
3490 | access = info->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE : | ||
3491 | (info->access & (SNDRV_CTL_ELEM_ACCESS_READWRITE| | ||
3492 | SNDRV_CTL_ELEM_ACCESS_INACTIVE| | ||
3493 | diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c | ||
3494 | index 84c94301bfaf..20aa52b14b84 100644 | ||
3495 | --- a/sound/pci/hda/hda_controller.c | ||
3496 | +++ b/sound/pci/hda/hda_controller.c | ||
3497 | @@ -1160,7 +1160,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus, | ||
3498 | } | ||
3499 | } | ||
3500 | |||
3501 | - if (!bus->no_response_fallback) | ||
3502 | + if (bus->no_response_fallback) | ||
3503 | return -1; | ||
3504 | |||
3505 | if (!chip->polling_mode && chip->poll_count < 2) { | ||
3506 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c | ||
3507 | index 64220c08bd98..6c6e35aba989 100644 | ||
3508 | --- a/sound/pci/hda/hda_generic.c | ||
3509 | +++ b/sound/pci/hda/hda_generic.c | ||
3510 | @@ -637,12 +637,45 @@ static int get_amp_val_to_activate(struct hda_codec *codec, hda_nid_t nid, | ||
3511 | return val; | ||
3512 | } | ||
3513 | |||
3514 | +/* is this a stereo widget or a stereo-to-mono mix? */ | ||
3515 | +static bool is_stereo_amps(struct hda_codec *codec, hda_nid_t nid, int dir) | ||
3516 | +{ | ||
3517 | + unsigned int wcaps = get_wcaps(codec, nid); | ||
3518 | + hda_nid_t conn; | ||
3519 | + | ||
3520 | + if (wcaps & AC_WCAP_STEREO) | ||
3521 | + return true; | ||
3522 | + if (dir != HDA_INPUT || get_wcaps_type(wcaps) != AC_WID_AUD_MIX) | ||
3523 | + return false; | ||
3524 | + if (snd_hda_get_num_conns(codec, nid) != 1) | ||
3525 | + return false; | ||
3526 | + if (snd_hda_get_connections(codec, nid, &conn, 1) < 0) | ||
3527 | + return false; | ||
3528 | + return !!(get_wcaps(codec, conn) & AC_WCAP_STEREO); | ||
3529 | +} | ||
3530 | + | ||
3531 | /* initialize the amp value (only at the first time) */ | ||
3532 | static void init_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx) | ||
3533 | { | ||
3534 | unsigned int caps = query_amp_caps(codec, nid, dir); | ||
3535 | int val = get_amp_val_to_activate(codec, nid, dir, caps, false); | ||
3536 | - snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val); | ||
3537 | + | ||
3538 | + if (is_stereo_amps(codec, nid, dir)) | ||
3539 | + snd_hda_codec_amp_init_stereo(codec, nid, dir, idx, 0xff, val); | ||
3540 | + else | ||
3541 | + snd_hda_codec_amp_init(codec, nid, 0, dir, idx, 0xff, val); | ||
3542 | +} | ||
3543 | + | ||
3544 | +/* update the amp, doing in stereo or mono depending on NID */ | ||
3545 | +static int update_amp(struct hda_codec *codec, hda_nid_t nid, int dir, int idx, | ||
3546 | + unsigned int mask, unsigned int val) | ||
3547 | +{ | ||
3548 | + if (is_stereo_amps(codec, nid, dir)) | ||
3549 | + return snd_hda_codec_amp_stereo(codec, nid, dir, idx, | ||
3550 | + mask, val); | ||
3551 | + else | ||
3552 | + return snd_hda_codec_amp_update(codec, nid, 0, dir, idx, | ||
3553 | + mask, val); | ||
3554 | } | ||
3555 | |||
3556 | /* calculate amp value mask we can modify; | ||
3557 | @@ -682,7 +715,7 @@ static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir, | ||
3558 | return; | ||
3559 | |||
3560 | val &= mask; | ||
3561 | - snd_hda_codec_amp_stereo(codec, nid, dir, idx, mask, val); | ||
3562 | + update_amp(codec, nid, dir, idx, mask, val); | ||
3563 | } | ||
3564 | |||
3565 | static void activate_amp_out(struct hda_codec *codec, struct nid_path *path, | ||
3566 | @@ -4331,13 +4364,11 @@ static void mute_all_mixer_nid(struct hda_codec *codec, hda_nid_t mix) | ||
3567 | has_amp = nid_has_mute(codec, mix, HDA_INPUT); | ||
3568 | for (i = 0; i < nums; i++) { | ||
3569 | if (has_amp) | ||
3570 | - snd_hda_codec_amp_stereo(codec, mix, | ||
3571 | - HDA_INPUT, i, | ||
3572 | - 0xff, HDA_AMP_MUTE); | ||
3573 | + update_amp(codec, mix, HDA_INPUT, i, | ||
3574 | + 0xff, HDA_AMP_MUTE); | ||
3575 | else if (nid_has_volume(codec, conn[i], HDA_OUTPUT)) | ||
3576 | - snd_hda_codec_amp_stereo(codec, conn[i], | ||
3577 | - HDA_OUTPUT, 0, | ||
3578 | - 0xff, HDA_AMP_MUTE); | ||
3579 | + update_amp(codec, conn[i], HDA_OUTPUT, 0, | ||
3580 | + 0xff, HDA_AMP_MUTE); | ||
3581 | } | ||
3582 | } | ||
3583 | |||
3584 | diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c | ||
3585 | index ce5a6da83419..05e19f78b4cb 100644 | ||
3586 | --- a/sound/pci/hda/hda_proc.c | ||
3587 | +++ b/sound/pci/hda/hda_proc.c | ||
3588 | @@ -134,13 +134,38 @@ static void print_amp_caps(struct snd_info_buffer *buffer, | ||
3589 | (caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT); | ||
3590 | } | ||
3591 | |||
3592 | +/* is this a stereo widget or a stereo-to-mono mix? */ | ||
3593 | +static bool is_stereo_amps(struct hda_codec *codec, hda_nid_t nid, | ||
3594 | + int dir, unsigned int wcaps, int indices) | ||
3595 | +{ | ||
3596 | + hda_nid_t conn; | ||
3597 | + | ||
3598 | + if (wcaps & AC_WCAP_STEREO) | ||
3599 | + return true; | ||
3600 | + /* check for a stereo-to-mono mix; it must be: | ||
3601 | + * only a single connection, only for input, and only a mixer widget | ||
3602 | + */ | ||
3603 | + if (indices != 1 || dir != HDA_INPUT || | ||
3604 | + get_wcaps_type(wcaps) != AC_WID_AUD_MIX) | ||
3605 | + return false; | ||
3606 | + | ||
3607 | + if (snd_hda_get_raw_connections(codec, nid, &conn, 1) < 0) | ||
3608 | + return false; | ||
3609 | + /* the connection source is a stereo? */ | ||
3610 | + wcaps = snd_hda_param_read(codec, conn, AC_PAR_AUDIO_WIDGET_CAP); | ||
3611 | + return !!(wcaps & AC_WCAP_STEREO); | ||
3612 | +} | ||
3613 | + | ||
3614 | static void print_amp_vals(struct snd_info_buffer *buffer, | ||
3615 | struct hda_codec *codec, hda_nid_t nid, | ||
3616 | - int dir, int stereo, int indices) | ||
3617 | + int dir, unsigned int wcaps, int indices) | ||
3618 | { | ||
3619 | unsigned int val; | ||
3620 | + bool stereo; | ||
3621 | int i; | ||
3622 | |||
3623 | + stereo = is_stereo_amps(codec, nid, dir, wcaps, indices); | ||
3624 | + | ||
3625 | dir = dir == HDA_OUTPUT ? AC_AMP_GET_OUTPUT : AC_AMP_GET_INPUT; | ||
3626 | for (i = 0; i < indices; i++) { | ||
3627 | snd_iprintf(buffer, " ["); | ||
3628 | @@ -757,12 +782,10 @@ static void print_codec_info(struct snd_info_entry *entry, | ||
3629 | (codec->single_adc_amp && | ||
3630 | wid_type == AC_WID_AUD_IN)) | ||
3631 | print_amp_vals(buffer, codec, nid, HDA_INPUT, | ||
3632 | - wid_caps & AC_WCAP_STEREO, | ||
3633 | - 1); | ||
3634 | + wid_caps, 1); | ||
3635 | else | ||
3636 | print_amp_vals(buffer, codec, nid, HDA_INPUT, | ||
3637 | - wid_caps & AC_WCAP_STEREO, | ||
3638 | - conn_len); | ||
3639 | + wid_caps, conn_len); | ||
3640 | } | ||
3641 | if (wid_caps & AC_WCAP_OUT_AMP) { | ||
3642 | snd_iprintf(buffer, " Amp-Out caps: "); | ||
3643 | @@ -771,11 +794,10 @@ static void print_codec_info(struct snd_info_entry *entry, | ||
3644 | if (wid_type == AC_WID_PIN && | ||
3645 | codec->pin_amp_workaround) | ||
3646 | print_amp_vals(buffer, codec, nid, HDA_OUTPUT, | ||
3647 | - wid_caps & AC_WCAP_STEREO, | ||
3648 | - conn_len); | ||
3649 | + wid_caps, conn_len); | ||
3650 | else | ||
3651 | print_amp_vals(buffer, codec, nid, HDA_OUTPUT, | ||
3652 | - wid_caps & AC_WCAP_STEREO, 1); | ||
3653 | + wid_caps, 1); | ||
3654 | } | ||
3655 | |||
3656 | switch (wid_type) { | ||
3657 | diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c | ||
3658 | index 1589c9bcce3e..dd2b3d92071f 100644 | ||
3659 | --- a/sound/pci/hda/patch_cirrus.c | ||
3660 | +++ b/sound/pci/hda/patch_cirrus.c | ||
3661 | @@ -393,6 +393,7 @@ static const struct snd_pci_quirk cs420x_fixup_tbl[] = { | ||
3662 | SND_PCI_QUIRK(0x106b, 0x1c00, "MacBookPro 8,1", CS420X_MBP81), | ||
3663 | SND_PCI_QUIRK(0x106b, 0x2000, "iMac 12,2", CS420X_IMAC27_122), | ||
3664 | SND_PCI_QUIRK(0x106b, 0x2800, "MacBookPro 10,1", CS420X_MBP101), | ||
3665 | + SND_PCI_QUIRK(0x106b, 0x5600, "MacBookAir 5,2", CS420X_MBP81), | ||
3666 | SND_PCI_QUIRK(0x106b, 0x5b00, "MacBookAir 4,2", CS420X_MBA42), | ||
3667 | SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS420X_APPLE), | ||
3668 | {} /* terminator */ | ||
3669 | @@ -584,6 +585,7 @@ static int patch_cs420x(struct hda_codec *codec) | ||
3670 | return -ENOMEM; | ||
3671 | |||
3672 | spec->gen.automute_hook = cs_automute; | ||
3673 | + codec->single_adc_amp = 1; | ||
3674 | |||
3675 | snd_hda_pick_fixup(codec, cs420x_models, cs420x_fixup_tbl, | ||
3676 | cs420x_fixups); | ||
3677 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c | ||
3678 | index e9ebc7bd752c..1b1e8c68edd6 100644 | ||
3679 | --- a/sound/pci/hda/patch_conexant.c | ||
3680 | +++ b/sound/pci/hda/patch_conexant.c | ||
3681 | @@ -223,6 +223,7 @@ enum { | ||
3682 | CXT_PINCFG_LENOVO_TP410, | ||
3683 | CXT_PINCFG_LEMOTE_A1004, | ||
3684 | CXT_PINCFG_LEMOTE_A1205, | ||
3685 | + CXT_PINCFG_COMPAQ_CQ60, | ||
3686 | CXT_FIXUP_STEREO_DMIC, | ||
3687 | CXT_FIXUP_INC_MIC_BOOST, | ||
3688 | CXT_FIXUP_HEADPHONE_MIC_PIN, | ||
3689 | @@ -660,6 +661,15 @@ static const struct hda_fixup cxt_fixups[] = { | ||
3690 | .type = HDA_FIXUP_PINS, | ||
3691 | .v.pins = cxt_pincfg_lemote, | ||
3692 | }, | ||
3693 | + [CXT_PINCFG_COMPAQ_CQ60] = { | ||
3694 | + .type = HDA_FIXUP_PINS, | ||
3695 | + .v.pins = (const struct hda_pintbl[]) { | ||
3696 | + /* 0x17 was falsely set up as a mic, it should 0x1d */ | ||
3697 | + { 0x17, 0x400001f0 }, | ||
3698 | + { 0x1d, 0x97a70120 }, | ||
3699 | + { } | ||
3700 | + } | ||
3701 | + }, | ||
3702 | [CXT_FIXUP_STEREO_DMIC] = { | ||
3703 | .type = HDA_FIXUP_FUNC, | ||
3704 | .v.func = cxt_fixup_stereo_dmic, | ||
3705 | @@ -769,6 +779,7 @@ static const struct hda_model_fixup cxt5047_fixup_models[] = { | ||
3706 | }; | ||
3707 | |||
3708 | static const struct snd_pci_quirk cxt5051_fixups[] = { | ||
3709 | + SND_PCI_QUIRK(0x103c, 0x360b, "Compaq CQ60", CXT_PINCFG_COMPAQ_CQ60), | ||
3710 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT_PINCFG_LENOVO_X200), | ||
3711 | {} | ||
3712 | }; | ||
3713 | diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h | ||
3714 | index 83bddbdb90e9..5293b5ac8b9d 100644 | ||
3715 | --- a/sound/usb/quirks-table.h | ||
3716 | +++ b/sound/usb/quirks-table.h | ||
3717 | @@ -1773,6 +1773,36 @@ YAMAHA_DEVICE(0x7010, "UB99"), | ||
3718 | } | ||
3719 | } | ||
3720 | }, | ||
3721 | +{ | ||
3722 | + USB_DEVICE(0x0582, 0x0159), | ||
3723 | + .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | ||
3724 | + /* .vendor_name = "Roland", */ | ||
3725 | + /* .product_name = "UA-22", */ | ||
3726 | + .ifnum = QUIRK_ANY_INTERFACE, | ||
3727 | + .type = QUIRK_COMPOSITE, | ||
3728 | + .data = (const struct snd_usb_audio_quirk[]) { | ||
3729 | + { | ||
3730 | + .ifnum = 0, | ||
3731 | + .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
3732 | + }, | ||
3733 | + { | ||
3734 | + .ifnum = 1, | ||
3735 | + .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
3736 | + }, | ||
3737 | + { | ||
3738 | + .ifnum = 2, | ||
3739 | + .type = QUIRK_MIDI_FIXED_ENDPOINT, | ||
3740 | + .data = & (const struct snd_usb_midi_endpoint_info) { | ||
3741 | + .out_cables = 0x0001, | ||
3742 | + .in_cables = 0x0001 | ||
3743 | + } | ||
3744 | + }, | ||
3745 | + { | ||
3746 | + .ifnum = -1 | ||
3747 | + } | ||
3748 | + } | ||
3749 | + } | ||
3750 | +}, | ||
3751 | /* this catches most recent vendor-specific Roland devices */ | ||
3752 | { | ||
3753 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | | ||
3754 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c | ||
3755 | index 3cee7b167052..cfbe0e7d1c45 100644 | ||
3756 | --- a/virt/kvm/kvm_main.c | ||
3757 | +++ b/virt/kvm/kvm_main.c | ||
3758 | @@ -2417,6 +2417,7 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) | ||
3759 | case KVM_CAP_SIGNAL_MSI: | ||
3760 | #endif | ||
3761 | #ifdef CONFIG_HAVE_KVM_IRQFD | ||
3762 | + case KVM_CAP_IRQFD: | ||
3763 | case KVM_CAP_IRQFD_RESAMPLE: | ||
3764 | #endif | ||
3765 | case KVM_CAP_CHECK_EXTENSION_VM: |