Contents of /trunk/kernel-alx-legacy/patches-4.9/0393-4.9.294-all-fixes.patch
Parent Directory | Revision Log
Revision 3695 -
(show annotations)
(download)
Mon Oct 24 14:08:09 2022 UTC (23 months ago) by niro
File size: 53022 byte(s)
Mon Oct 24 14:08:09 2022 UTC (23 months ago) by niro
File size: 53022 byte(s)
-linux-4.9.294
1 | diff --git a/Makefile b/Makefile |
2 | index a07a010095bc9..6f3b4e1e9a144 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 293 |
9 | +SUBLEVEL = 294 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/arch/arm/mm/copypage-fa.c b/arch/arm/mm/copypage-fa.c |
14 | index d130a5ece5d55..bf24690ec83af 100644 |
15 | --- a/arch/arm/mm/copypage-fa.c |
16 | +++ b/arch/arm/mm/copypage-fa.c |
17 | @@ -17,26 +17,25 @@ |
18 | /* |
19 | * Faraday optimised copy_user_page |
20 | */ |
21 | -static void __naked |
22 | -fa_copy_user_page(void *kto, const void *kfrom) |
23 | +static void fa_copy_user_page(void *kto, const void *kfrom) |
24 | { |
25 | - asm("\ |
26 | - stmfd sp!, {r4, lr} @ 2\n\ |
27 | - mov r2, %0 @ 1\n\ |
28 | -1: ldmia r1!, {r3, r4, ip, lr} @ 4\n\ |
29 | - stmia r0, {r3, r4, ip, lr} @ 4\n\ |
30 | - mcr p15, 0, r0, c7, c14, 1 @ 1 clean and invalidate D line\n\ |
31 | - add r0, r0, #16 @ 1\n\ |
32 | - ldmia r1!, {r3, r4, ip, lr} @ 4\n\ |
33 | - stmia r0, {r3, r4, ip, lr} @ 4\n\ |
34 | - mcr p15, 0, r0, c7, c14, 1 @ 1 clean and invalidate D line\n\ |
35 | - add r0, r0, #16 @ 1\n\ |
36 | - subs r2, r2, #1 @ 1\n\ |
37 | + int tmp; |
38 | + |
39 | + asm volatile ("\ |
40 | +1: ldmia %1!, {r3, r4, ip, lr} @ 4\n\ |
41 | + stmia %0, {r3, r4, ip, lr} @ 4\n\ |
42 | + mcr p15, 0, %0, c7, c14, 1 @ 1 clean and invalidate D line\n\ |
43 | + add %0, %0, #16 @ 1\n\ |
44 | + ldmia %1!, {r3, r4, ip, lr} @ 4\n\ |
45 | + stmia %0, {r3, r4, ip, lr} @ 4\n\ |
46 | + mcr p15, 0, %0, c7, c14, 1 @ 1 clean and invalidate D line\n\ |
47 | + add %0, %0, #16 @ 1\n\ |
48 | + subs %2, %2, #1 @ 1\n\ |
49 | bne 1b @ 1\n\ |
50 | - mcr p15, 0, r2, c7, c10, 4 @ 1 drain WB\n\ |
51 | - ldmfd sp!, {r4, pc} @ 3" |
52 | - : |
53 | - : "I" (PAGE_SIZE / 32)); |
54 | + mcr p15, 0, %2, c7, c10, 4 @ 1 drain WB" |
55 | + : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp) |
56 | + : "2" (PAGE_SIZE / 32) |
57 | + : "r3", "r4", "ip", "lr"); |
58 | } |
59 | |
60 | void fa_copy_user_highpage(struct page *to, struct page *from, |
61 | diff --git a/arch/arm/mm/copypage-feroceon.c b/arch/arm/mm/copypage-feroceon.c |
62 | index 49ee0c1a72097..cc819732d9b82 100644 |
63 | --- a/arch/arm/mm/copypage-feroceon.c |
64 | +++ b/arch/arm/mm/copypage-feroceon.c |
65 | @@ -13,58 +13,56 @@ |
66 | #include <linux/init.h> |
67 | #include <linux/highmem.h> |
68 | |
69 | -static void __naked |
70 | -feroceon_copy_user_page(void *kto, const void *kfrom) |
71 | +static void feroceon_copy_user_page(void *kto, const void *kfrom) |
72 | { |
73 | - asm("\ |
74 | - stmfd sp!, {r4-r9, lr} \n\ |
75 | - mov ip, %2 \n\ |
76 | -1: mov lr, r1 \n\ |
77 | - ldmia r1!, {r2 - r9} \n\ |
78 | - pld [lr, #32] \n\ |
79 | - pld [lr, #64] \n\ |
80 | - pld [lr, #96] \n\ |
81 | - pld [lr, #128] \n\ |
82 | - pld [lr, #160] \n\ |
83 | - pld [lr, #192] \n\ |
84 | - pld [lr, #224] \n\ |
85 | - stmia r0, {r2 - r9} \n\ |
86 | - ldmia r1!, {r2 - r9} \n\ |
87 | - mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\ |
88 | - add r0, r0, #32 \n\ |
89 | - stmia r0, {r2 - r9} \n\ |
90 | - ldmia r1!, {r2 - r9} \n\ |
91 | - mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\ |
92 | - add r0, r0, #32 \n\ |
93 | - stmia r0, {r2 - r9} \n\ |
94 | - ldmia r1!, {r2 - r9} \n\ |
95 | - mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\ |
96 | - add r0, r0, #32 \n\ |
97 | - stmia r0, {r2 - r9} \n\ |
98 | - ldmia r1!, {r2 - r9} \n\ |
99 | - mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\ |
100 | - add r0, r0, #32 \n\ |
101 | - stmia r0, {r2 - r9} \n\ |
102 | - ldmia r1!, {r2 - r9} \n\ |
103 | - mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\ |
104 | - add r0, r0, #32 \n\ |
105 | - stmia r0, {r2 - r9} \n\ |
106 | - ldmia r1!, {r2 - r9} \n\ |
107 | - mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\ |
108 | - add r0, r0, #32 \n\ |
109 | - stmia r0, {r2 - r9} \n\ |
110 | - ldmia r1!, {r2 - r9} \n\ |
111 | - mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\ |
112 | - add r0, r0, #32 \n\ |
113 | - stmia r0, {r2 - r9} \n\ |
114 | - subs ip, ip, #(32 * 8) \n\ |
115 | - mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\ |
116 | - add r0, r0, #32 \n\ |
117 | + int tmp; |
118 | + |
119 | + asm volatile ("\ |
120 | +1: ldmia %1!, {r2 - r7, ip, lr} \n\ |
121 | + pld [%1, #0] \n\ |
122 | + pld [%1, #32] \n\ |
123 | + pld [%1, #64] \n\ |
124 | + pld [%1, #96] \n\ |
125 | + pld [%1, #128] \n\ |
126 | + pld [%1, #160] \n\ |
127 | + pld [%1, #192] \n\ |
128 | + stmia %0, {r2 - r7, ip, lr} \n\ |
129 | + ldmia %1!, {r2 - r7, ip, lr} \n\ |
130 | + mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\ |
131 | + add %0, %0, #32 \n\ |
132 | + stmia %0, {r2 - r7, ip, lr} \n\ |
133 | + ldmia %1!, {r2 - r7, ip, lr} \n\ |
134 | + mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\ |
135 | + add %0, %0, #32 \n\ |
136 | + stmia %0, {r2 - r7, ip, lr} \n\ |
137 | + ldmia %1!, {r2 - r7, ip, lr} \n\ |
138 | + mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\ |
139 | + add %0, %0, #32 \n\ |
140 | + stmia %0, {r2 - r7, ip, lr} \n\ |
141 | + ldmia %1!, {r2 - r7, ip, lr} \n\ |
142 | + mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\ |
143 | + add %0, %0, #32 \n\ |
144 | + stmia %0, {r2 - r7, ip, lr} \n\ |
145 | + ldmia %1!, {r2 - r7, ip, lr} \n\ |
146 | + mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\ |
147 | + add %0, %0, #32 \n\ |
148 | + stmia %0, {r2 - r7, ip, lr} \n\ |
149 | + ldmia %1!, {r2 - r7, ip, lr} \n\ |
150 | + mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\ |
151 | + add %0, %0, #32 \n\ |
152 | + stmia %0, {r2 - r7, ip, lr} \n\ |
153 | + ldmia %1!, {r2 - r7, ip, lr} \n\ |
154 | + mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\ |
155 | + add %0, %0, #32 \n\ |
156 | + stmia %0, {r2 - r7, ip, lr} \n\ |
157 | + subs %2, %2, #(32 * 8) \n\ |
158 | + mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\ |
159 | + add %0, %0, #32 \n\ |
160 | bne 1b \n\ |
161 | - mcr p15, 0, ip, c7, c10, 4 @ drain WB\n\ |
162 | - ldmfd sp!, {r4-r9, pc}" |
163 | - : |
164 | - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE)); |
165 | + mcr p15, 0, %2, c7, c10, 4 @ drain WB" |
166 | + : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp) |
167 | + : "2" (PAGE_SIZE) |
168 | + : "r2", "r3", "r4", "r5", "r6", "r7", "ip", "lr"); |
169 | } |
170 | |
171 | void feroceon_copy_user_highpage(struct page *to, struct page *from, |
172 | diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c |
173 | index 1267e64133b92..db624170854a0 100644 |
174 | --- a/arch/arm/mm/copypage-v4mc.c |
175 | +++ b/arch/arm/mm/copypage-v4mc.c |
176 | @@ -40,12 +40,11 @@ static DEFINE_RAW_SPINLOCK(minicache_lock); |
177 | * instruction. If your processor does not supply this, you have to write your |
178 | * own copy_user_highpage that does the right thing. |
179 | */ |
180 | -static void __naked |
181 | -mc_copy_user_page(void *from, void *to) |
182 | +static void mc_copy_user_page(void *from, void *to) |
183 | { |
184 | - asm volatile( |
185 | - "stmfd sp!, {r4, lr} @ 2\n\ |
186 | - mov r4, %2 @ 1\n\ |
187 | + int tmp; |
188 | + |
189 | + asm volatile ("\ |
190 | ldmia %0!, {r2, r3, ip, lr} @ 4\n\ |
191 | 1: mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\ |
192 | stmia %1!, {r2, r3, ip, lr} @ 4\n\ |
193 | @@ -55,13 +54,13 @@ mc_copy_user_page(void *from, void *to) |
194 | mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\ |
195 | stmia %1!, {r2, r3, ip, lr} @ 4\n\ |
196 | ldmia %0!, {r2, r3, ip, lr} @ 4\n\ |
197 | - subs r4, r4, #1 @ 1\n\ |
198 | + subs %2, %2, #1 @ 1\n\ |
199 | stmia %1!, {r2, r3, ip, lr} @ 4\n\ |
200 | ldmneia %0!, {r2, r3, ip, lr} @ 4\n\ |
201 | - bne 1b @ 1\n\ |
202 | - ldmfd sp!, {r4, pc} @ 3" |
203 | - : |
204 | - : "r" (from), "r" (to), "I" (PAGE_SIZE / 64)); |
205 | + bne 1b @ " |
206 | + : "+&r" (from), "+&r" (to), "=&r" (tmp) |
207 | + : "2" (PAGE_SIZE / 64) |
208 | + : "r2", "r3", "ip", "lr"); |
209 | } |
210 | |
211 | void v4_mc_copy_user_highpage(struct page *to, struct page *from, |
212 | diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c |
213 | index 067d0fdd630c1..cd3e165afeede 100644 |
214 | --- a/arch/arm/mm/copypage-v4wb.c |
215 | +++ b/arch/arm/mm/copypage-v4wb.c |
216 | @@ -22,29 +22,28 @@ |
217 | * instruction. If your processor does not supply this, you have to write your |
218 | * own copy_user_highpage that does the right thing. |
219 | */ |
220 | -static void __naked |
221 | -v4wb_copy_user_page(void *kto, const void *kfrom) |
222 | +static void v4wb_copy_user_page(void *kto, const void *kfrom) |
223 | { |
224 | - asm("\ |
225 | - stmfd sp!, {r4, lr} @ 2\n\ |
226 | - mov r2, %2 @ 1\n\ |
227 | - ldmia r1!, {r3, r4, ip, lr} @ 4\n\ |
228 | -1: mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line\n\ |
229 | - stmia r0!, {r3, r4, ip, lr} @ 4\n\ |
230 | - ldmia r1!, {r3, r4, ip, lr} @ 4+1\n\ |
231 | - stmia r0!, {r3, r4, ip, lr} @ 4\n\ |
232 | - ldmia r1!, {r3, r4, ip, lr} @ 4\n\ |
233 | - mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line\n\ |
234 | - stmia r0!, {r3, r4, ip, lr} @ 4\n\ |
235 | - ldmia r1!, {r3, r4, ip, lr} @ 4\n\ |
236 | - subs r2, r2, #1 @ 1\n\ |
237 | - stmia r0!, {r3, r4, ip, lr} @ 4\n\ |
238 | - ldmneia r1!, {r3, r4, ip, lr} @ 4\n\ |
239 | + int tmp; |
240 | + |
241 | + asm volatile ("\ |
242 | + ldmia %1!, {r3, r4, ip, lr} @ 4\n\ |
243 | +1: mcr p15, 0, %0, c7, c6, 1 @ 1 invalidate D line\n\ |
244 | + stmia %0!, {r3, r4, ip, lr} @ 4\n\ |
245 | + ldmia %1!, {r3, r4, ip, lr} @ 4+1\n\ |
246 | + stmia %0!, {r3, r4, ip, lr} @ 4\n\ |
247 | + ldmia %1!, {r3, r4, ip, lr} @ 4\n\ |
248 | + mcr p15, 0, %0, c7, c6, 1 @ 1 invalidate D line\n\ |
249 | + stmia %0!, {r3, r4, ip, lr} @ 4\n\ |
250 | + ldmia %1!, {r3, r4, ip, lr} @ 4\n\ |
251 | + subs %2, %2, #1 @ 1\n\ |
252 | + stmia %0!, {r3, r4, ip, lr} @ 4\n\ |
253 | + ldmneia %1!, {r3, r4, ip, lr} @ 4\n\ |
254 | bne 1b @ 1\n\ |
255 | - mcr p15, 0, r1, c7, c10, 4 @ 1 drain WB\n\ |
256 | - ldmfd sp!, {r4, pc} @ 3" |
257 | - : |
258 | - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64)); |
259 | + mcr p15, 0, %1, c7, c10, 4 @ 1 drain WB" |
260 | + : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp) |
261 | + : "2" (PAGE_SIZE / 64) |
262 | + : "r3", "r4", "ip", "lr"); |
263 | } |
264 | |
265 | void v4wb_copy_user_highpage(struct page *to, struct page *from, |
266 | diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c |
267 | index b85c5da2e510e..8614572e1296b 100644 |
268 | --- a/arch/arm/mm/copypage-v4wt.c |
269 | +++ b/arch/arm/mm/copypage-v4wt.c |
270 | @@ -20,27 +20,26 @@ |
271 | * dirty data in the cache. However, we do have to ensure that |
272 | * subsequent reads are up to date. |
273 | */ |
274 | -static void __naked |
275 | -v4wt_copy_user_page(void *kto, const void *kfrom) |
276 | +static void v4wt_copy_user_page(void *kto, const void *kfrom) |
277 | { |
278 | - asm("\ |
279 | - stmfd sp!, {r4, lr} @ 2\n\ |
280 | - mov r2, %2 @ 1\n\ |
281 | - ldmia r1!, {r3, r4, ip, lr} @ 4\n\ |
282 | -1: stmia r0!, {r3, r4, ip, lr} @ 4\n\ |
283 | - ldmia r1!, {r3, r4, ip, lr} @ 4+1\n\ |
284 | - stmia r0!, {r3, r4, ip, lr} @ 4\n\ |
285 | - ldmia r1!, {r3, r4, ip, lr} @ 4\n\ |
286 | - stmia r0!, {r3, r4, ip, lr} @ 4\n\ |
287 | - ldmia r1!, {r3, r4, ip, lr} @ 4\n\ |
288 | - subs r2, r2, #1 @ 1\n\ |
289 | - stmia r0!, {r3, r4, ip, lr} @ 4\n\ |
290 | - ldmneia r1!, {r3, r4, ip, lr} @ 4\n\ |
291 | + int tmp; |
292 | + |
293 | + asm volatile ("\ |
294 | + ldmia %1!, {r3, r4, ip, lr} @ 4\n\ |
295 | +1: stmia %0!, {r3, r4, ip, lr} @ 4\n\ |
296 | + ldmia %1!, {r3, r4, ip, lr} @ 4+1\n\ |
297 | + stmia %0!, {r3, r4, ip, lr} @ 4\n\ |
298 | + ldmia %1!, {r3, r4, ip, lr} @ 4\n\ |
299 | + stmia %0!, {r3, r4, ip, lr} @ 4\n\ |
300 | + ldmia %1!, {r3, r4, ip, lr} @ 4\n\ |
301 | + subs %2, %2, #1 @ 1\n\ |
302 | + stmia %0!, {r3, r4, ip, lr} @ 4\n\ |
303 | + ldmneia %1!, {r3, r4, ip, lr} @ 4\n\ |
304 | bne 1b @ 1\n\ |
305 | - mcr p15, 0, r2, c7, c7, 0 @ flush ID cache\n\ |
306 | - ldmfd sp!, {r4, pc} @ 3" |
307 | - : |
308 | - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64)); |
309 | + mcr p15, 0, %2, c7, c7, 0 @ flush ID cache" |
310 | + : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp) |
311 | + : "2" (PAGE_SIZE / 64) |
312 | + : "r3", "r4", "ip", "lr"); |
313 | } |
314 | |
315 | void v4wt_copy_user_highpage(struct page *to, struct page *from, |
316 | diff --git a/arch/arm/mm/copypage-xsc3.c b/arch/arm/mm/copypage-xsc3.c |
317 | index 03a2042aced5f..55cbc3a89d858 100644 |
318 | --- a/arch/arm/mm/copypage-xsc3.c |
319 | +++ b/arch/arm/mm/copypage-xsc3.c |
320 | @@ -21,53 +21,46 @@ |
321 | |
322 | /* |
323 | * XSC3 optimised copy_user_highpage |
324 | - * r0 = destination |
325 | - * r1 = source |
326 | * |
327 | * The source page may have some clean entries in the cache already, but we |
328 | * can safely ignore them - break_cow() will flush them out of the cache |
329 | * if we eventually end up using our copied page. |
330 | * |
331 | */ |
332 | -static void __naked |
333 | -xsc3_mc_copy_user_page(void *kto, const void *kfrom) |
334 | +static void xsc3_mc_copy_user_page(void *kto, const void *kfrom) |
335 | { |
336 | - asm("\ |
337 | - stmfd sp!, {r4, r5, lr} \n\ |
338 | - mov lr, %2 \n\ |
339 | - \n\ |
340 | - pld [r1, #0] \n\ |
341 | - pld [r1, #32] \n\ |
342 | -1: pld [r1, #64] \n\ |
343 | - pld [r1, #96] \n\ |
344 | + int tmp; |
345 | + |
346 | + asm volatile ("\ |
347 | + pld [%1, #0] \n\ |
348 | + pld [%1, #32] \n\ |
349 | +1: pld [%1, #64] \n\ |
350 | + pld [%1, #96] \n\ |
351 | \n\ |
352 | -2: ldrd r2, [r1], #8 \n\ |
353 | - mov ip, r0 \n\ |
354 | - ldrd r4, [r1], #8 \n\ |
355 | - mcr p15, 0, ip, c7, c6, 1 @ invalidate\n\ |
356 | - strd r2, [r0], #8 \n\ |
357 | - ldrd r2, [r1], #8 \n\ |
358 | - strd r4, [r0], #8 \n\ |
359 | - ldrd r4, [r1], #8 \n\ |
360 | - strd r2, [r0], #8 \n\ |
361 | - strd r4, [r0], #8 \n\ |
362 | - ldrd r2, [r1], #8 \n\ |
363 | - mov ip, r0 \n\ |
364 | - ldrd r4, [r1], #8 \n\ |
365 | - mcr p15, 0, ip, c7, c6, 1 @ invalidate\n\ |
366 | - strd r2, [r0], #8 \n\ |
367 | - ldrd r2, [r1], #8 \n\ |
368 | - subs lr, lr, #1 \n\ |
369 | - strd r4, [r0], #8 \n\ |
370 | - ldrd r4, [r1], #8 \n\ |
371 | - strd r2, [r0], #8 \n\ |
372 | - strd r4, [r0], #8 \n\ |
373 | +2: ldrd r2, [%1], #8 \n\ |
374 | + ldrd r4, [%1], #8 \n\ |
375 | + mcr p15, 0, %0, c7, c6, 1 @ invalidate\n\ |
376 | + strd r2, [%0], #8 \n\ |
377 | + ldrd r2, [%1], #8 \n\ |
378 | + strd r4, [%0], #8 \n\ |
379 | + ldrd r4, [%1], #8 \n\ |
380 | + strd r2, [%0], #8 \n\ |
381 | + strd r4, [%0], #8 \n\ |
382 | + ldrd r2, [%1], #8 \n\ |
383 | + ldrd r4, [%1], #8 \n\ |
384 | + mcr p15, 0, %0, c7, c6, 1 @ invalidate\n\ |
385 | + strd r2, [%0], #8 \n\ |
386 | + ldrd r2, [%1], #8 \n\ |
387 | + subs %2, %2, #1 \n\ |
388 | + strd r4, [%0], #8 \n\ |
389 | + ldrd r4, [%1], #8 \n\ |
390 | + strd r2, [%0], #8 \n\ |
391 | + strd r4, [%0], #8 \n\ |
392 | bgt 1b \n\ |
393 | - beq 2b \n\ |
394 | - \n\ |
395 | - ldmfd sp!, {r4, r5, pc}" |
396 | - : |
397 | - : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64 - 1)); |
398 | + beq 2b " |
399 | + : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp) |
400 | + : "2" (PAGE_SIZE / 64 - 1) |
401 | + : "r2", "r3", "r4", "r5"); |
402 | } |
403 | |
404 | void xsc3_mc_copy_user_highpage(struct page *to, struct page *from, |
405 | @@ -85,8 +78,6 @@ void xsc3_mc_copy_user_highpage(struct page *to, struct page *from, |
406 | |
407 | /* |
408 | * XScale optimised clear_user_page |
409 | - * r0 = destination |
410 | - * r1 = virtual user address of ultimate destination page |
411 | */ |
412 | void xsc3_mc_clear_user_highpage(struct page *page, unsigned long vaddr) |
413 | { |
414 | diff --git a/arch/arm/mm/copypage-xscale.c b/arch/arm/mm/copypage-xscale.c |
415 | index 0fb85025344d9..c775d4b7adb08 100644 |
416 | --- a/arch/arm/mm/copypage-xscale.c |
417 | +++ b/arch/arm/mm/copypage-xscale.c |
418 | @@ -36,52 +36,51 @@ static DEFINE_RAW_SPINLOCK(minicache_lock); |
419 | * Dcache aliasing issue. The writes will be forwarded to the write buffer, |
420 | * and merged as appropriate. |
421 | */ |
422 | -static void __naked |
423 | -mc_copy_user_page(void *from, void *to) |
424 | +static void mc_copy_user_page(void *from, void *to) |
425 | { |
426 | + int tmp; |
427 | + |
428 | /* |
429 | * Strangely enough, best performance is achieved |
430 | * when prefetching destination as well. (NP) |
431 | */ |
432 | - asm volatile( |
433 | - "stmfd sp!, {r4, r5, lr} \n\ |
434 | - mov lr, %2 \n\ |
435 | - pld [r0, #0] \n\ |
436 | - pld [r0, #32] \n\ |
437 | - pld [r1, #0] \n\ |
438 | - pld [r1, #32] \n\ |
439 | -1: pld [r0, #64] \n\ |
440 | - pld [r0, #96] \n\ |
441 | - pld [r1, #64] \n\ |
442 | - pld [r1, #96] \n\ |
443 | -2: ldrd r2, [r0], #8 \n\ |
444 | - ldrd r4, [r0], #8 \n\ |
445 | - mov ip, r1 \n\ |
446 | - strd r2, [r1], #8 \n\ |
447 | - ldrd r2, [r0], #8 \n\ |
448 | - strd r4, [r1], #8 \n\ |
449 | - ldrd r4, [r0], #8 \n\ |
450 | - strd r2, [r1], #8 \n\ |
451 | - strd r4, [r1], #8 \n\ |
452 | + asm volatile ("\ |
453 | + pld [%0, #0] \n\ |
454 | + pld [%0, #32] \n\ |
455 | + pld [%1, #0] \n\ |
456 | + pld [%1, #32] \n\ |
457 | +1: pld [%0, #64] \n\ |
458 | + pld [%0, #96] \n\ |
459 | + pld [%1, #64] \n\ |
460 | + pld [%1, #96] \n\ |
461 | +2: ldrd r2, [%0], #8 \n\ |
462 | + ldrd r4, [%0], #8 \n\ |
463 | + mov ip, %1 \n\ |
464 | + strd r2, [%1], #8 \n\ |
465 | + ldrd r2, [%0], #8 \n\ |
466 | + strd r4, [%1], #8 \n\ |
467 | + ldrd r4, [%0], #8 \n\ |
468 | + strd r2, [%1], #8 \n\ |
469 | + strd r4, [%1], #8 \n\ |
470 | mcr p15, 0, ip, c7, c10, 1 @ clean D line\n\ |
471 | - ldrd r2, [r0], #8 \n\ |
472 | + ldrd r2, [%0], #8 \n\ |
473 | mcr p15, 0, ip, c7, c6, 1 @ invalidate D line\n\ |
474 | - ldrd r4, [r0], #8 \n\ |
475 | - mov ip, r1 \n\ |
476 | - strd r2, [r1], #8 \n\ |
477 | - ldrd r2, [r0], #8 \n\ |
478 | - strd r4, [r1], #8 \n\ |
479 | - ldrd r4, [r0], #8 \n\ |
480 | - strd r2, [r1], #8 \n\ |
481 | - strd r4, [r1], #8 \n\ |
482 | + ldrd r4, [%0], #8 \n\ |
483 | + mov ip, %1 \n\ |
484 | + strd r2, [%1], #8 \n\ |
485 | + ldrd r2, [%0], #8 \n\ |
486 | + strd r4, [%1], #8 \n\ |
487 | + ldrd r4, [%0], #8 \n\ |
488 | + strd r2, [%1], #8 \n\ |
489 | + strd r4, [%1], #8 \n\ |
490 | mcr p15, 0, ip, c7, c10, 1 @ clean D line\n\ |
491 | - subs lr, lr, #1 \n\ |
492 | + subs %2, %2, #1 \n\ |
493 | mcr p15, 0, ip, c7, c6, 1 @ invalidate D line\n\ |
494 | bgt 1b \n\ |
495 | - beq 2b \n\ |
496 | - ldmfd sp!, {r4, r5, pc} " |
497 | - : |
498 | - : "r" (from), "r" (to), "I" (PAGE_SIZE / 64 - 1)); |
499 | + beq 2b " |
500 | + : "+&r" (from), "+&r" (to), "=&r" (tmp) |
501 | + : "2" (PAGE_SIZE / 64 - 1) |
502 | + : "r2", "r3", "r4", "r5", "ip"); |
503 | } |
504 | |
505 | void xscale_mc_copy_user_highpage(struct page *to, struct page *from, |
506 | diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c |
507 | index df58e7d793f52..d420597b0d2b4 100644 |
508 | --- a/drivers/block/xen-blkfront.c |
509 | +++ b/drivers/block/xen-blkfront.c |
510 | @@ -1555,9 +1555,12 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) |
511 | struct blkfront_ring_info *rinfo = (struct blkfront_ring_info *)dev_id; |
512 | struct blkfront_info *info = rinfo->dev_info; |
513 | int error; |
514 | + unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS; |
515 | |
516 | - if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) |
517 | + if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) { |
518 | + xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS); |
519 | return IRQ_HANDLED; |
520 | + } |
521 | |
522 | spin_lock_irqsave(&rinfo->ring_lock, flags); |
523 | again: |
524 | @@ -1573,6 +1576,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) |
525 | unsigned long id; |
526 | unsigned int op; |
527 | |
528 | + eoiflag = 0; |
529 | + |
530 | RING_COPY_RESPONSE(&rinfo->ring, i, &bret); |
531 | id = bret.id; |
532 | |
533 | @@ -1684,6 +1689,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) |
534 | |
535 | spin_unlock_irqrestore(&rinfo->ring_lock, flags); |
536 | |
537 | + xen_irq_lateeoi(irq, eoiflag); |
538 | + |
539 | return IRQ_HANDLED; |
540 | |
541 | err: |
542 | @@ -1691,6 +1698,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) |
543 | |
544 | spin_unlock_irqrestore(&rinfo->ring_lock, flags); |
545 | |
546 | + /* No EOI in order to avoid further interrupts. */ |
547 | + |
548 | pr_alert("%s disabled for further use\n", info->gd->disk_name); |
549 | return IRQ_HANDLED; |
550 | } |
551 | @@ -1730,8 +1739,8 @@ static int setup_blkring(struct xenbus_device *dev, |
552 | if (err) |
553 | goto fail; |
554 | |
555 | - err = bind_evtchn_to_irqhandler(rinfo->evtchn, blkif_interrupt, 0, |
556 | - "blkif", rinfo); |
557 | + err = bind_evtchn_to_irqhandler_lateeoi(rinfo->evtchn, blkif_interrupt, |
558 | + 0, "blkif", rinfo); |
559 | if (err <= 0) { |
560 | xenbus_dev_fatal(dev, err, |
561 | "bind_evtchn_to_irqhandler failed"); |
562 | diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c |
563 | index 15f2e7025b78e..1d5510cb6db4e 100644 |
564 | --- a/drivers/char/agp/parisc-agp.c |
565 | +++ b/drivers/char/agp/parisc-agp.c |
566 | @@ -285,7 +285,7 @@ agp_ioc_init(void __iomem *ioc_regs) |
567 | return 0; |
568 | } |
569 | |
570 | -static int |
571 | +static int __init |
572 | lba_find_capability(int cap) |
573 | { |
574 | struct _parisc_agp_info *info = &parisc_agp_info; |
575 | @@ -370,7 +370,7 @@ fail: |
576 | return error; |
577 | } |
578 | |
579 | -static int |
580 | +static int __init |
581 | find_quicksilver(struct device *dev, void *data) |
582 | { |
583 | struct parisc_device **lba = data; |
584 | @@ -382,7 +382,7 @@ find_quicksilver(struct device *dev, void *data) |
585 | return 0; |
586 | } |
587 | |
588 | -static int |
589 | +static int __init |
590 | parisc_agp_init(void) |
591 | { |
592 | extern struct sba_device *sba_list; |
593 | diff --git a/drivers/firmware/scpi_pm_domain.c b/drivers/firmware/scpi_pm_domain.c |
594 | index f395dec271131..a6e62a793fbe6 100644 |
595 | --- a/drivers/firmware/scpi_pm_domain.c |
596 | +++ b/drivers/firmware/scpi_pm_domain.c |
597 | @@ -27,7 +27,6 @@ struct scpi_pm_domain { |
598 | struct generic_pm_domain genpd; |
599 | struct scpi_ops *ops; |
600 | u32 domain; |
601 | - char name[30]; |
602 | }; |
603 | |
604 | /* |
605 | @@ -121,8 +120,13 @@ static int scpi_pm_domain_probe(struct platform_device *pdev) |
606 | |
607 | scpi_pd->domain = i; |
608 | scpi_pd->ops = scpi_ops; |
609 | - sprintf(scpi_pd->name, "%s.%d", np->name, i); |
610 | - scpi_pd->genpd.name = scpi_pd->name; |
611 | + scpi_pd->genpd.name = devm_kasprintf(dev, GFP_KERNEL, |
612 | + "%s.%d", np->name, i); |
613 | + if (!scpi_pd->genpd.name) { |
614 | + dev_err(dev, "Failed to allocate genpd name:%s.%d\n", |
615 | + np->name, i); |
616 | + continue; |
617 | + } |
618 | scpi_pd->genpd.power_off = scpi_pd_power_off; |
619 | scpi_pd->genpd.power_on = scpi_pd_power_on; |
620 | |
621 | diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c |
622 | index 34704b0451b49..d19ad92eede95 100644 |
623 | --- a/drivers/hwmon/dell-smm-hwmon.c |
624 | +++ b/drivers/hwmon/dell-smm-hwmon.c |
625 | @@ -578,15 +578,18 @@ static const struct file_operations i8k_fops = { |
626 | .unlocked_ioctl = i8k_ioctl, |
627 | }; |
628 | |
629 | +static struct proc_dir_entry *entry; |
630 | + |
631 | static void __init i8k_init_procfs(void) |
632 | { |
633 | /* Register the proc entry */ |
634 | - proc_create("i8k", 0, NULL, &i8k_fops); |
635 | + entry = proc_create("i8k", 0, NULL, &i8k_fops); |
636 | } |
637 | |
638 | static void __exit i8k_exit_procfs(void) |
639 | { |
640 | - remove_proc_entry("i8k", NULL); |
641 | + if (entry) |
642 | + remove_proc_entry("i8k", NULL); |
643 | } |
644 | |
645 | #else |
646 | diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c |
647 | index df220666d6274..b4f8cd7dc8b74 100644 |
648 | --- a/drivers/i2c/busses/i2c-rk3x.c |
649 | +++ b/drivers/i2c/busses/i2c-rk3x.c |
650 | @@ -424,8 +424,8 @@ static void rk3x_i2c_handle_read(struct rk3x_i2c *i2c, unsigned int ipd) |
651 | if (!(ipd & REG_INT_MBRF)) |
652 | return; |
653 | |
654 | - /* ack interrupt */ |
655 | - i2c_writel(i2c, REG_INT_MBRF, REG_IPD); |
656 | + /* ack interrupt (read also produces a spurious START flag, clear it too) */ |
657 | + i2c_writel(i2c, REG_INT_MBRF | REG_INT_START, REG_IPD); |
658 | |
659 | /* Can only handle a maximum of 32 bytes at a time */ |
660 | if (len > 32) |
661 | diff --git a/drivers/input/touchscreen/of_touchscreen.c b/drivers/input/touchscreen/of_touchscreen.c |
662 | index 8d7f9c8f2771c..db499ef6ccff4 100644 |
663 | --- a/drivers/input/touchscreen/of_touchscreen.c |
664 | +++ b/drivers/input/touchscreen/of_touchscreen.c |
665 | @@ -79,8 +79,8 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch, |
666 | data_present = touchscreen_get_prop_u32(dev, "touchscreen-size-x", |
667 | input_abs_get_max(input, |
668 | axis) + 1, |
669 | - &maximum) | |
670 | - touchscreen_get_prop_u32(dev, "touchscreen-fuzz-x", |
671 | + &maximum); |
672 | + data_present |= touchscreen_get_prop_u32(dev, "touchscreen-fuzz-x", |
673 | input_abs_get_fuzz(input, axis), |
674 | &fuzz); |
675 | if (data_present) |
676 | @@ -90,8 +90,8 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch, |
677 | data_present = touchscreen_get_prop_u32(dev, "touchscreen-size-y", |
678 | input_abs_get_max(input, |
679 | axis) + 1, |
680 | - &maximum) | |
681 | - touchscreen_get_prop_u32(dev, "touchscreen-fuzz-y", |
682 | + &maximum); |
683 | + data_present |= touchscreen_get_prop_u32(dev, "touchscreen-fuzz-y", |
684 | input_abs_get_fuzz(input, axis), |
685 | &fuzz); |
686 | if (data_present) |
687 | @@ -101,11 +101,11 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch, |
688 | data_present = touchscreen_get_prop_u32(dev, |
689 | "touchscreen-max-pressure", |
690 | input_abs_get_max(input, axis), |
691 | - &maximum) | |
692 | - touchscreen_get_prop_u32(dev, |
693 | - "touchscreen-fuzz-pressure", |
694 | - input_abs_get_fuzz(input, axis), |
695 | - &fuzz); |
696 | + &maximum); |
697 | + data_present |= touchscreen_get_prop_u32(dev, |
698 | + "touchscreen-fuzz-pressure", |
699 | + input_abs_get_fuzz(input, axis), |
700 | + &fuzz); |
701 | if (data_present) |
702 | touchscreen_set_params(input, axis, maximum, fuzz); |
703 | |
704 | diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c |
705 | index 9e4d1212f4c16..63f2baed3c8a6 100644 |
706 | --- a/drivers/md/persistent-data/dm-btree-remove.c |
707 | +++ b/drivers/md/persistent-data/dm-btree-remove.c |
708 | @@ -423,9 +423,9 @@ static int rebalance_children(struct shadow_spine *s, |
709 | |
710 | memcpy(n, dm_block_data(child), |
711 | dm_bm_block_size(dm_tm_get_bm(info->tm))); |
712 | - dm_tm_unlock(info->tm, child); |
713 | |
714 | dm_tm_dec(info->tm, dm_block_location(child)); |
715 | + dm_tm_unlock(info->tm, child); |
716 | return 0; |
717 | } |
718 | |
719 | diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c |
720 | index 5d67dbdd943dc..98392a069f2b2 100644 |
721 | --- a/drivers/net/ethernet/broadcom/bcmsysport.c |
722 | +++ b/drivers/net/ethernet/broadcom/bcmsysport.c |
723 | @@ -90,9 +90,13 @@ static inline void tdma_port_write_desc_addr(struct bcm_sysport_priv *priv, |
724 | struct dma_desc *desc, |
725 | unsigned int port) |
726 | { |
727 | + unsigned long desc_flags; |
728 | + |
729 | /* Ports are latched, so write upper address first */ |
730 | + spin_lock_irqsave(&priv->desc_lock, desc_flags); |
731 | tdma_writel(priv, desc->addr_status_len, TDMA_WRITE_PORT_HI(port)); |
732 | tdma_writel(priv, desc->addr_lo, TDMA_WRITE_PORT_LO(port)); |
733 | + spin_unlock_irqrestore(&priv->desc_lock, desc_flags); |
734 | } |
735 | |
736 | /* Ethtool operations */ |
737 | @@ -1587,6 +1591,7 @@ static int bcm_sysport_open(struct net_device *dev) |
738 | } |
739 | |
740 | /* Initialize both hardware and software ring */ |
741 | + spin_lock_init(&priv->desc_lock); |
742 | for (i = 0; i < dev->num_tx_queues; i++) { |
743 | ret = bcm_sysport_init_tx_ring(priv, i); |
744 | if (ret) { |
745 | diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h |
746 | index 0d3444f1d78a0..1cf5af2b11e1f 100644 |
747 | --- a/drivers/net/ethernet/broadcom/bcmsysport.h |
748 | +++ b/drivers/net/ethernet/broadcom/bcmsysport.h |
749 | @@ -660,6 +660,7 @@ struct bcm_sysport_priv { |
750 | int wol_irq; |
751 | |
752 | /* Transmit rings */ |
753 | + spinlock_t desc_lock; |
754 | struct bcm_sysport_tx_ring tx_rings[TDMA_NUM_RINGS]; |
755 | |
756 | /* Receive queue */ |
757 | diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c |
758 | index 5428e39fa4e5c..7587a8f98619a 100644 |
759 | --- a/drivers/net/ethernet/intel/igbvf/netdev.c |
760 | +++ b/drivers/net/ethernet/intel/igbvf/netdev.c |
761 | @@ -2846,6 +2846,7 @@ static int igbvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
762 | return 0; |
763 | |
764 | err_hw_init: |
765 | + netif_napi_del(&adapter->rx_ring->napi); |
766 | kfree(adapter->tx_ring); |
767 | kfree(adapter->rx_ring); |
768 | err_sw_init: |
769 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
770 | index 8466f3874a285..5029db8835d7d 100644 |
771 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
772 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c |
773 | @@ -2597,6 +2597,9 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw) |
774 | /* flush pending Tx transactions */ |
775 | ixgbe_clear_tx_pending(hw); |
776 | |
777 | + /* set MDIO speed before talking to the PHY in case it's the 1st time */ |
778 | + ixgbe_set_mdio_speed(hw); |
779 | + |
780 | /* PHY ops must be identified and initialized prior to reset */ |
781 | |
782 | /* Identify PHY and related function pointers */ |
783 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
784 | index 410a36c982419..1569300844f0c 100644 |
785 | --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
786 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
787 | @@ -620,7 +620,7 @@ void __init mlx4_en_init_ptys2ethtool_map(void) |
788 | MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_1000BASE_T, SPEED_1000, |
789 | ETHTOOL_LINK_MODE_1000baseT_Full_BIT); |
790 | MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_1000BASE_CX_SGMII, SPEED_1000, |
791 | - ETHTOOL_LINK_MODE_1000baseKX_Full_BIT); |
792 | + ETHTOOL_LINK_MODE_1000baseX_Full_BIT); |
793 | MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_1000BASE_KX, SPEED_1000, |
794 | ETHTOOL_LINK_MODE_1000baseKX_Full_BIT); |
795 | MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_10GBASE_T, SPEED_10000, |
796 | @@ -632,9 +632,9 @@ void __init mlx4_en_init_ptys2ethtool_map(void) |
797 | MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_10GBASE_KR, SPEED_10000, |
798 | ETHTOOL_LINK_MODE_10000baseKR_Full_BIT); |
799 | MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_10GBASE_CR, SPEED_10000, |
800 | - ETHTOOL_LINK_MODE_10000baseKR_Full_BIT); |
801 | + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT); |
802 | MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_10GBASE_SR, SPEED_10000, |
803 | - ETHTOOL_LINK_MODE_10000baseKR_Full_BIT); |
804 | + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT); |
805 | MLX4_BUILD_PTYS2ETHTOOL_CONFIG(MLX4_20GBASE_KR2, SPEED_20000, |
806 | ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT, |
807 | ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT); |
808 | diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c |
809 | index bce898ad6e96f..7752cc09a1da5 100644 |
810 | --- a/drivers/net/usb/lan78xx.c |
811 | +++ b/drivers/net/usb/lan78xx.c |
812 | @@ -865,11 +865,9 @@ static int lan78xx_read_otp(struct lan78xx_net *dev, u32 offset, |
813 | ret = lan78xx_read_raw_otp(dev, 0, 1, &sig); |
814 | |
815 | if (ret == 0) { |
816 | - if (sig == OTP_INDICATOR_1) |
817 | - offset = offset; |
818 | - else if (sig == OTP_INDICATOR_2) |
819 | + if (sig == OTP_INDICATOR_2) |
820 | offset += 0x100; |
821 | - else |
822 | + else if (sig != OTP_INDICATOR_1) |
823 | ret = -EINVAL; |
824 | if (!ret) |
825 | ret = lan78xx_read_raw_otp(dev, offset, length, data); |
826 | diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c |
827 | index 53477280f39c2..7c848852aa094 100644 |
828 | --- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c |
829 | +++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c |
830 | @@ -321,9 +321,9 @@ static int mwifiex_dnld_sleep_confirm_cmd(struct mwifiex_adapter *adapter) |
831 | |
832 | adapter->seq_num++; |
833 | sleep_cfm_buf->seq_num = |
834 | - cpu_to_le16((HostCmd_SET_SEQ_NO_BSS_INFO |
835 | + cpu_to_le16(HostCmd_SET_SEQ_NO_BSS_INFO |
836 | (adapter->seq_num, priv->bss_num, |
837 | - priv->bss_type))); |
838 | + priv->bss_type)); |
839 | |
840 | mwifiex_dbg(adapter, CMD, |
841 | "cmd: DNLD_CMD: %#x, act %#x, len %d, seqno %#x\n", |
842 | diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h b/drivers/net/wireless/marvell/mwifiex/fw.h |
843 | index 341f6ed5b3556..fccce1b4afcd1 100644 |
844 | --- a/drivers/net/wireless/marvell/mwifiex/fw.h |
845 | +++ b/drivers/net/wireless/marvell/mwifiex/fw.h |
846 | @@ -482,10 +482,10 @@ enum mwifiex_channel_flags { |
847 | |
848 | #define RF_ANTENNA_AUTO 0xFFFF |
849 | |
850 | -#define HostCmd_SET_SEQ_NO_BSS_INFO(seq, num, type) { \ |
851 | - (((seq) & 0x00ff) | \ |
852 | - (((num) & 0x000f) << 8)) | \ |
853 | - (((type) & 0x000f) << 12); } |
854 | +#define HostCmd_SET_SEQ_NO_BSS_INFO(seq, num, type) \ |
855 | + ((((seq) & 0x00ff) | \ |
856 | + (((num) & 0x000f) << 8)) | \ |
857 | + (((type) & 0x000f) << 12)) |
858 | |
859 | #define HostCmd_GET_SEQ_NO(seq) \ |
860 | ((seq) & HostCmd_SEQ_NUM_MASK) |
861 | diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h |
862 | index 347c796afd4ed..bfa3c6aaebe6b 100644 |
863 | --- a/drivers/net/xen-netback/common.h |
864 | +++ b/drivers/net/xen-netback/common.h |
865 | @@ -203,6 +203,7 @@ struct xenvif_queue { /* Per-queue data for xenvif */ |
866 | unsigned int rx_queue_max; |
867 | unsigned int rx_queue_len; |
868 | unsigned long last_rx_time; |
869 | + unsigned int rx_slots_needed; |
870 | bool stalled; |
871 | |
872 | struct xenvif_copy_state rx_copy; |
873 | diff --git a/drivers/net/xen-netback/rx.c b/drivers/net/xen-netback/rx.c |
874 | index ddfb1cfa2dd94..29c7645f57805 100644 |
875 | --- a/drivers/net/xen-netback/rx.c |
876 | +++ b/drivers/net/xen-netback/rx.c |
877 | @@ -33,28 +33,36 @@ |
878 | #include <xen/xen.h> |
879 | #include <xen/events.h> |
880 | |
881 | -static bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue) |
882 | +/* |
883 | + * Update the needed ring page slots for the first SKB queued. |
884 | + * Note that any call sequence outside the RX thread calling this function |
885 | + * needs to wake up the RX thread via a call of xenvif_kick_thread() |
886 | + * afterwards in order to avoid a race with putting the thread to sleep. |
887 | + */ |
888 | +static void xenvif_update_needed_slots(struct xenvif_queue *queue, |
889 | + const struct sk_buff *skb) |
890 | { |
891 | - RING_IDX prod, cons; |
892 | - struct sk_buff *skb; |
893 | - int needed; |
894 | - unsigned long flags; |
895 | - |
896 | - spin_lock_irqsave(&queue->rx_queue.lock, flags); |
897 | + unsigned int needed = 0; |
898 | |
899 | - skb = skb_peek(&queue->rx_queue); |
900 | - if (!skb) { |
901 | - spin_unlock_irqrestore(&queue->rx_queue.lock, flags); |
902 | - return false; |
903 | + if (skb) { |
904 | + needed = DIV_ROUND_UP(skb->len, XEN_PAGE_SIZE); |
905 | + if (skb_is_gso(skb)) |
906 | + needed++; |
907 | + if (skb->sw_hash) |
908 | + needed++; |
909 | } |
910 | |
911 | - needed = DIV_ROUND_UP(skb->len, XEN_PAGE_SIZE); |
912 | - if (skb_is_gso(skb)) |
913 | - needed++; |
914 | - if (skb->sw_hash) |
915 | - needed++; |
916 | + WRITE_ONCE(queue->rx_slots_needed, needed); |
917 | +} |
918 | |
919 | - spin_unlock_irqrestore(&queue->rx_queue.lock, flags); |
920 | +static bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue) |
921 | +{ |
922 | + RING_IDX prod, cons; |
923 | + unsigned int needed; |
924 | + |
925 | + needed = READ_ONCE(queue->rx_slots_needed); |
926 | + if (!needed) |
927 | + return false; |
928 | |
929 | do { |
930 | prod = queue->rx.sring->req_prod; |
931 | @@ -80,13 +88,19 @@ void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb) |
932 | |
933 | spin_lock_irqsave(&queue->rx_queue.lock, flags); |
934 | |
935 | - __skb_queue_tail(&queue->rx_queue, skb); |
936 | - |
937 | - queue->rx_queue_len += skb->len; |
938 | - if (queue->rx_queue_len > queue->rx_queue_max) { |
939 | + if (queue->rx_queue_len >= queue->rx_queue_max) { |
940 | struct net_device *dev = queue->vif->dev; |
941 | |
942 | netif_tx_stop_queue(netdev_get_tx_queue(dev, queue->id)); |
943 | + kfree_skb(skb); |
944 | + queue->vif->dev->stats.rx_dropped++; |
945 | + } else { |
946 | + if (skb_queue_empty(&queue->rx_queue)) |
947 | + xenvif_update_needed_slots(queue, skb); |
948 | + |
949 | + __skb_queue_tail(&queue->rx_queue, skb); |
950 | + |
951 | + queue->rx_queue_len += skb->len; |
952 | } |
953 | |
954 | spin_unlock_irqrestore(&queue->rx_queue.lock, flags); |
955 | @@ -100,6 +114,8 @@ static struct sk_buff *xenvif_rx_dequeue(struct xenvif_queue *queue) |
956 | |
957 | skb = __skb_dequeue(&queue->rx_queue); |
958 | if (skb) { |
959 | + xenvif_update_needed_slots(queue, skb_peek(&queue->rx_queue)); |
960 | + |
961 | queue->rx_queue_len -= skb->len; |
962 | if (queue->rx_queue_len < queue->rx_queue_max) { |
963 | struct netdev_queue *txq; |
964 | @@ -134,6 +150,7 @@ static void xenvif_rx_queue_drop_expired(struct xenvif_queue *queue) |
965 | break; |
966 | xenvif_rx_dequeue(queue); |
967 | kfree_skb(skb); |
968 | + queue->vif->dev->stats.rx_dropped++; |
969 | } |
970 | } |
971 | |
972 | @@ -474,27 +491,31 @@ void xenvif_rx_action(struct xenvif_queue *queue) |
973 | xenvif_rx_copy_flush(queue); |
974 | } |
975 | |
976 | -static bool xenvif_rx_queue_stalled(struct xenvif_queue *queue) |
977 | +static RING_IDX xenvif_rx_queue_slots(const struct xenvif_queue *queue) |
978 | { |
979 | RING_IDX prod, cons; |
980 | |
981 | prod = queue->rx.sring->req_prod; |
982 | cons = queue->rx.req_cons; |
983 | |
984 | + return prod - cons; |
985 | +} |
986 | + |
987 | +static bool xenvif_rx_queue_stalled(const struct xenvif_queue *queue) |
988 | +{ |
989 | + unsigned int needed = READ_ONCE(queue->rx_slots_needed); |
990 | + |
991 | return !queue->stalled && |
992 | - prod - cons < 1 && |
993 | + xenvif_rx_queue_slots(queue) < needed && |
994 | time_after(jiffies, |
995 | queue->last_rx_time + queue->vif->stall_timeout); |
996 | } |
997 | |
998 | static bool xenvif_rx_queue_ready(struct xenvif_queue *queue) |
999 | { |
1000 | - RING_IDX prod, cons; |
1001 | - |
1002 | - prod = queue->rx.sring->req_prod; |
1003 | - cons = queue->rx.req_cons; |
1004 | + unsigned int needed = READ_ONCE(queue->rx_slots_needed); |
1005 | |
1006 | - return queue->stalled && prod - cons >= 1; |
1007 | + return queue->stalled && xenvif_rx_queue_slots(queue) >= needed; |
1008 | } |
1009 | |
1010 | bool xenvif_have_rx_work(struct xenvif_queue *queue, bool test_kthread) |
1011 | diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c |
1012 | index 0d2df76902384..65a50bc5661d2 100644 |
1013 | --- a/drivers/net/xen-netfront.c |
1014 | +++ b/drivers/net/xen-netfront.c |
1015 | @@ -141,6 +141,9 @@ struct netfront_queue { |
1016 | struct sk_buff *rx_skbs[NET_RX_RING_SIZE]; |
1017 | grant_ref_t gref_rx_head; |
1018 | grant_ref_t grant_rx_ref[NET_RX_RING_SIZE]; |
1019 | + |
1020 | + unsigned int rx_rsp_unconsumed; |
1021 | + spinlock_t rx_cons_lock; |
1022 | }; |
1023 | |
1024 | struct netfront_info { |
1025 | @@ -365,12 +368,13 @@ static int xennet_open(struct net_device *dev) |
1026 | return 0; |
1027 | } |
1028 | |
1029 | -static void xennet_tx_buf_gc(struct netfront_queue *queue) |
1030 | +static bool xennet_tx_buf_gc(struct netfront_queue *queue) |
1031 | { |
1032 | RING_IDX cons, prod; |
1033 | unsigned short id; |
1034 | struct sk_buff *skb; |
1035 | bool more_to_do; |
1036 | + bool work_done = false; |
1037 | const struct device *dev = &queue->info->netdev->dev; |
1038 | |
1039 | BUG_ON(!netif_carrier_ok(queue->info->netdev)); |
1040 | @@ -387,6 +391,8 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue) |
1041 | for (cons = queue->tx.rsp_cons; cons != prod; cons++) { |
1042 | struct xen_netif_tx_response txrsp; |
1043 | |
1044 | + work_done = true; |
1045 | + |
1046 | RING_COPY_RESPONSE(&queue->tx, cons, &txrsp); |
1047 | if (txrsp.status == XEN_NETIF_RSP_NULL) |
1048 | continue; |
1049 | @@ -430,11 +436,13 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue) |
1050 | |
1051 | xennet_maybe_wake_tx(queue); |
1052 | |
1053 | - return; |
1054 | + return work_done; |
1055 | |
1056 | err: |
1057 | queue->info->broken = true; |
1058 | dev_alert(dev, "Disabled for further use\n"); |
1059 | + |
1060 | + return work_done; |
1061 | } |
1062 | |
1063 | struct xennet_gnttab_make_txreq { |
1064 | @@ -754,6 +762,16 @@ static int xennet_close(struct net_device *dev) |
1065 | return 0; |
1066 | } |
1067 | |
1068 | +static void xennet_set_rx_rsp_cons(struct netfront_queue *queue, RING_IDX val) |
1069 | +{ |
1070 | + unsigned long flags; |
1071 | + |
1072 | + spin_lock_irqsave(&queue->rx_cons_lock, flags); |
1073 | + queue->rx.rsp_cons = val; |
1074 | + queue->rx_rsp_unconsumed = RING_HAS_UNCONSUMED_RESPONSES(&queue->rx); |
1075 | + spin_unlock_irqrestore(&queue->rx_cons_lock, flags); |
1076 | +} |
1077 | + |
1078 | static void xennet_move_rx_slot(struct netfront_queue *queue, struct sk_buff *skb, |
1079 | grant_ref_t ref) |
1080 | { |
1081 | @@ -805,7 +823,7 @@ static int xennet_get_extras(struct netfront_queue *queue, |
1082 | xennet_move_rx_slot(queue, skb, ref); |
1083 | } while (extra.flags & XEN_NETIF_EXTRA_FLAG_MORE); |
1084 | |
1085 | - queue->rx.rsp_cons = cons; |
1086 | + xennet_set_rx_rsp_cons(queue, cons); |
1087 | return err; |
1088 | } |
1089 | |
1090 | @@ -885,7 +903,7 @@ next: |
1091 | } |
1092 | |
1093 | if (unlikely(err)) |
1094 | - queue->rx.rsp_cons = cons + slots; |
1095 | + xennet_set_rx_rsp_cons(queue, cons + slots); |
1096 | |
1097 | return err; |
1098 | } |
1099 | @@ -939,7 +957,8 @@ static int xennet_fill_frags(struct netfront_queue *queue, |
1100 | __pskb_pull_tail(skb, pull_to - skb_headlen(skb)); |
1101 | } |
1102 | if (unlikely(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS)) { |
1103 | - queue->rx.rsp_cons = ++cons + skb_queue_len(list); |
1104 | + xennet_set_rx_rsp_cons(queue, |
1105 | + ++cons + skb_queue_len(list)); |
1106 | kfree_skb(nskb); |
1107 | return -ENOENT; |
1108 | } |
1109 | @@ -952,7 +971,7 @@ static int xennet_fill_frags(struct netfront_queue *queue, |
1110 | kfree_skb(nskb); |
1111 | } |
1112 | |
1113 | - queue->rx.rsp_cons = cons; |
1114 | + xennet_set_rx_rsp_cons(queue, cons); |
1115 | |
1116 | return 0; |
1117 | } |
1118 | @@ -1073,7 +1092,9 @@ err: |
1119 | |
1120 | if (unlikely(xennet_set_skb_gso(skb, gso))) { |
1121 | __skb_queue_head(&tmpq, skb); |
1122 | - queue->rx.rsp_cons += skb_queue_len(&tmpq); |
1123 | + xennet_set_rx_rsp_cons(queue, |
1124 | + queue->rx.rsp_cons + |
1125 | + skb_queue_len(&tmpq)); |
1126 | goto err; |
1127 | } |
1128 | } |
1129 | @@ -1097,7 +1118,8 @@ err: |
1130 | |
1131 | __skb_queue_tail(&rxq, skb); |
1132 | |
1133 | - i = ++queue->rx.rsp_cons; |
1134 | + i = queue->rx.rsp_cons + 1; |
1135 | + xennet_set_rx_rsp_cons(queue, i); |
1136 | work_done++; |
1137 | } |
1138 | |
1139 | @@ -1281,40 +1303,79 @@ static int xennet_set_features(struct net_device *dev, |
1140 | return 0; |
1141 | } |
1142 | |
1143 | -static irqreturn_t xennet_tx_interrupt(int irq, void *dev_id) |
1144 | +static bool xennet_handle_tx(struct netfront_queue *queue, unsigned int *eoi) |
1145 | { |
1146 | - struct netfront_queue *queue = dev_id; |
1147 | unsigned long flags; |
1148 | |
1149 | - if (queue->info->broken) |
1150 | - return IRQ_HANDLED; |
1151 | + if (unlikely(queue->info->broken)) |
1152 | + return false; |
1153 | |
1154 | spin_lock_irqsave(&queue->tx_lock, flags); |
1155 | - xennet_tx_buf_gc(queue); |
1156 | + if (xennet_tx_buf_gc(queue)) |
1157 | + *eoi = 0; |
1158 | spin_unlock_irqrestore(&queue->tx_lock, flags); |
1159 | |
1160 | + return true; |
1161 | +} |
1162 | + |
1163 | +static irqreturn_t xennet_tx_interrupt(int irq, void *dev_id) |
1164 | +{ |
1165 | + unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS; |
1166 | + |
1167 | + if (likely(xennet_handle_tx(dev_id, &eoiflag))) |
1168 | + xen_irq_lateeoi(irq, eoiflag); |
1169 | + |
1170 | return IRQ_HANDLED; |
1171 | } |
1172 | |
1173 | -static irqreturn_t xennet_rx_interrupt(int irq, void *dev_id) |
1174 | +static bool xennet_handle_rx(struct netfront_queue *queue, unsigned int *eoi) |
1175 | { |
1176 | - struct netfront_queue *queue = dev_id; |
1177 | - struct net_device *dev = queue->info->netdev; |
1178 | + unsigned int work_queued; |
1179 | + unsigned long flags; |
1180 | |
1181 | - if (queue->info->broken) |
1182 | - return IRQ_HANDLED; |
1183 | + if (unlikely(queue->info->broken)) |
1184 | + return false; |
1185 | + |
1186 | + spin_lock_irqsave(&queue->rx_cons_lock, flags); |
1187 | + work_queued = RING_HAS_UNCONSUMED_RESPONSES(&queue->rx); |
1188 | + if (work_queued > queue->rx_rsp_unconsumed) { |
1189 | + queue->rx_rsp_unconsumed = work_queued; |
1190 | + *eoi = 0; |
1191 | + } else if (unlikely(work_queued < queue->rx_rsp_unconsumed)) { |
1192 | + const struct device *dev = &queue->info->netdev->dev; |
1193 | + |
1194 | + spin_unlock_irqrestore(&queue->rx_cons_lock, flags); |
1195 | + dev_alert(dev, "RX producer index going backwards\n"); |
1196 | + dev_alert(dev, "Disabled for further use\n"); |
1197 | + queue->info->broken = true; |
1198 | + return false; |
1199 | + } |
1200 | + spin_unlock_irqrestore(&queue->rx_cons_lock, flags); |
1201 | |
1202 | - if (likely(netif_carrier_ok(dev) && |
1203 | - RING_HAS_UNCONSUMED_RESPONSES(&queue->rx))) |
1204 | + if (likely(netif_carrier_ok(queue->info->netdev) && work_queued)) |
1205 | napi_schedule(&queue->napi); |
1206 | |
1207 | + return true; |
1208 | +} |
1209 | + |
1210 | +static irqreturn_t xennet_rx_interrupt(int irq, void *dev_id) |
1211 | +{ |
1212 | + unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS; |
1213 | + |
1214 | + if (likely(xennet_handle_rx(dev_id, &eoiflag))) |
1215 | + xen_irq_lateeoi(irq, eoiflag); |
1216 | + |
1217 | return IRQ_HANDLED; |
1218 | } |
1219 | |
1220 | static irqreturn_t xennet_interrupt(int irq, void *dev_id) |
1221 | { |
1222 | - xennet_tx_interrupt(irq, dev_id); |
1223 | - xennet_rx_interrupt(irq, dev_id); |
1224 | + unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS; |
1225 | + |
1226 | + if (xennet_handle_tx(dev_id, &eoiflag) && |
1227 | + xennet_handle_rx(dev_id, &eoiflag)) |
1228 | + xen_irq_lateeoi(irq, eoiflag); |
1229 | + |
1230 | return IRQ_HANDLED; |
1231 | } |
1232 | |
1233 | @@ -1546,9 +1607,10 @@ static int setup_netfront_single(struct netfront_queue *queue) |
1234 | if (err < 0) |
1235 | goto fail; |
1236 | |
1237 | - err = bind_evtchn_to_irqhandler(queue->tx_evtchn, |
1238 | - xennet_interrupt, |
1239 | - 0, queue->info->netdev->name, queue); |
1240 | + err = bind_evtchn_to_irqhandler_lateeoi(queue->tx_evtchn, |
1241 | + xennet_interrupt, 0, |
1242 | + queue->info->netdev->name, |
1243 | + queue); |
1244 | if (err < 0) |
1245 | goto bind_fail; |
1246 | queue->rx_evtchn = queue->tx_evtchn; |
1247 | @@ -1576,18 +1638,18 @@ static int setup_netfront_split(struct netfront_queue *queue) |
1248 | |
1249 | snprintf(queue->tx_irq_name, sizeof(queue->tx_irq_name), |
1250 | "%s-tx", queue->name); |
1251 | - err = bind_evtchn_to_irqhandler(queue->tx_evtchn, |
1252 | - xennet_tx_interrupt, |
1253 | - 0, queue->tx_irq_name, queue); |
1254 | + err = bind_evtchn_to_irqhandler_lateeoi(queue->tx_evtchn, |
1255 | + xennet_tx_interrupt, 0, |
1256 | + queue->tx_irq_name, queue); |
1257 | if (err < 0) |
1258 | goto bind_tx_fail; |
1259 | queue->tx_irq = err; |
1260 | |
1261 | snprintf(queue->rx_irq_name, sizeof(queue->rx_irq_name), |
1262 | "%s-rx", queue->name); |
1263 | - err = bind_evtchn_to_irqhandler(queue->rx_evtchn, |
1264 | - xennet_rx_interrupt, |
1265 | - 0, queue->rx_irq_name, queue); |
1266 | + err = bind_evtchn_to_irqhandler_lateeoi(queue->rx_evtchn, |
1267 | + xennet_rx_interrupt, 0, |
1268 | + queue->rx_irq_name, queue); |
1269 | if (err < 0) |
1270 | goto bind_rx_fail; |
1271 | queue->rx_irq = err; |
1272 | @@ -1689,6 +1751,7 @@ static int xennet_init_queue(struct netfront_queue *queue) |
1273 | |
1274 | spin_lock_init(&queue->tx_lock); |
1275 | spin_lock_init(&queue->rx_lock); |
1276 | + spin_lock_init(&queue->rx_cons_lock); |
1277 | |
1278 | setup_timer(&queue->rx_refill_timer, rx_refill_timeout, |
1279 | (unsigned long)queue); |
1280 | diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c |
1281 | index be2f1402c84c2..161de28dc1626 100644 |
1282 | --- a/drivers/pci/msi.c |
1283 | +++ b/drivers/pci/msi.c |
1284 | @@ -871,7 +871,7 @@ out_free: |
1285 | free_msi_irqs(dev); |
1286 | |
1287 | out_disable: |
1288 | - pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0); |
1289 | + pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL | PCI_MSIX_FLAGS_ENABLE, 0); |
1290 | |
1291 | return ret; |
1292 | } |
1293 | diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c |
1294 | index 99bfb003be3fc..4358eb158c48c 100644 |
1295 | --- a/drivers/scsi/scsi_debug.c |
1296 | +++ b/drivers/scsi/scsi_debug.c |
1297 | @@ -2175,11 +2175,11 @@ static int resp_mode_select(struct scsi_cmnd *scp, |
1298 | __func__, param_len, res); |
1299 | md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2); |
1300 | bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6); |
1301 | - if (md_len > 2) { |
1302 | + off = bd_len + (mselect6 ? 4 : 8); |
1303 | + if (md_len > 2 || off >= res) { |
1304 | mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1); |
1305 | return check_condition_result; |
1306 | } |
1307 | - off = bd_len + (mselect6 ? 4 : 8); |
1308 | mpage = arr[off] & 0x3f; |
1309 | ps = !!(arr[off] & 0x80); |
1310 | if (ps) { |
1311 | diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c |
1312 | index c4f5e5bbb8dce..9397e8ba26469 100644 |
1313 | --- a/drivers/soc/tegra/fuse/fuse-tegra.c |
1314 | +++ b/drivers/soc/tegra/fuse/fuse-tegra.c |
1315 | @@ -176,7 +176,7 @@ static struct platform_driver tegra_fuse_driver = { |
1316 | }; |
1317 | module_platform_driver(tegra_fuse_driver); |
1318 | |
1319 | -bool __init tegra_fuse_read_spare(unsigned int spare) |
1320 | +u32 __init tegra_fuse_read_spare(unsigned int spare) |
1321 | { |
1322 | unsigned int offset = fuse->soc->info->spare + spare * 4; |
1323 | |
1324 | diff --git a/drivers/soc/tegra/fuse/fuse.h b/drivers/soc/tegra/fuse/fuse.h |
1325 | index 10c2076d5089a..f368bd5373088 100644 |
1326 | --- a/drivers/soc/tegra/fuse/fuse.h |
1327 | +++ b/drivers/soc/tegra/fuse/fuse.h |
1328 | @@ -62,7 +62,7 @@ struct tegra_fuse { |
1329 | void tegra_init_revision(void); |
1330 | void tegra_init_apbmisc(void); |
1331 | |
1332 | -bool __init tegra_fuse_read_spare(unsigned int spare); |
1333 | +u32 __init tegra_fuse_read_spare(unsigned int spare); |
1334 | u32 __init tegra_fuse_read_early(unsigned int offset); |
1335 | |
1336 | #ifdef CONFIG_ARCH_TEGRA_2x_SOC |
1337 | diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c |
1338 | index 858c7b4b197cb..2af089b2a343d 100644 |
1339 | --- a/drivers/tty/hvc/hvc_xen.c |
1340 | +++ b/drivers/tty/hvc/hvc_xen.c |
1341 | @@ -50,6 +50,8 @@ struct xencons_info { |
1342 | struct xenbus_device *xbdev; |
1343 | struct xencons_interface *intf; |
1344 | unsigned int evtchn; |
1345 | + XENCONS_RING_IDX out_cons; |
1346 | + unsigned int out_cons_same; |
1347 | struct hvc_struct *hvc; |
1348 | int irq; |
1349 | int vtermno; |
1350 | @@ -151,6 +153,8 @@ static int domU_read_console(uint32_t vtermno, char *buf, int len) |
1351 | XENCONS_RING_IDX cons, prod; |
1352 | int recv = 0; |
1353 | struct xencons_info *xencons = vtermno_to_xencons(vtermno); |
1354 | + unsigned int eoiflag = 0; |
1355 | + |
1356 | if (xencons == NULL) |
1357 | return -EINVAL; |
1358 | intf = xencons->intf; |
1359 | @@ -170,7 +174,27 @@ static int domU_read_console(uint32_t vtermno, char *buf, int len) |
1360 | mb(); /* read ring before consuming */ |
1361 | intf->in_cons = cons; |
1362 | |
1363 | - notify_daemon(xencons); |
1364 | + /* |
1365 | + * When to mark interrupt having been spurious: |
1366 | + * - there was no new data to be read, and |
1367 | + * - the backend did not consume some output bytes, and |
1368 | + * - the previous round with no read data didn't see consumed bytes |
1369 | + * (we might have a race with an interrupt being in flight while |
1370 | + * updating xencons->out_cons, so account for that by allowing one |
1371 | + * round without any visible reason) |
1372 | + */ |
1373 | + if (intf->out_cons != xencons->out_cons) { |
1374 | + xencons->out_cons = intf->out_cons; |
1375 | + xencons->out_cons_same = 0; |
1376 | + } |
1377 | + if (recv) { |
1378 | + notify_daemon(xencons); |
1379 | + } else if (xencons->out_cons_same++ > 1) { |
1380 | + eoiflag = XEN_EOI_FLAG_SPURIOUS; |
1381 | + } |
1382 | + |
1383 | + xen_irq_lateeoi(xencons->irq, eoiflag); |
1384 | + |
1385 | return recv; |
1386 | } |
1387 | |
1388 | @@ -399,7 +423,7 @@ static int xencons_connect_backend(struct xenbus_device *dev, |
1389 | if (ret) |
1390 | return ret; |
1391 | info->evtchn = evtchn; |
1392 | - irq = bind_evtchn_to_irq(evtchn); |
1393 | + irq = bind_interdomain_evtchn_to_irq_lateeoi(dev->otherend_id, evtchn); |
1394 | if (irq < 0) |
1395 | return irq; |
1396 | info->irq = irq; |
1397 | @@ -563,7 +587,7 @@ static int __init xen_hvc_init(void) |
1398 | return r; |
1399 | |
1400 | info = vtermno_to_xencons(HVC_COOKIE); |
1401 | - info->irq = bind_evtchn_to_irq(info->evtchn); |
1402 | + info->irq = bind_evtchn_to_irq_lateeoi(info->evtchn); |
1403 | } |
1404 | if (info->irq < 0) |
1405 | info->irq = 0; /* NO_IRQ */ |
1406 | diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c |
1407 | index 3d14a316830a6..a7c44a3cb2d25 100644 |
1408 | --- a/drivers/usb/gadget/composite.c |
1409 | +++ b/drivers/usb/gadget/composite.c |
1410 | @@ -1632,14 +1632,14 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) |
1411 | u8 endp; |
1412 | |
1413 | if (w_length > USB_COMP_EP0_BUFSIZ) { |
1414 | - if (ctrl->bRequestType == USB_DIR_OUT) { |
1415 | - goto done; |
1416 | - } else { |
1417 | + if (ctrl->bRequestType & USB_DIR_IN) { |
1418 | /* Cast away the const, we are going to overwrite on purpose. */ |
1419 | __le16 *temp = (__le16 *)&ctrl->wLength; |
1420 | |
1421 | *temp = cpu_to_le16(USB_COMP_EP0_BUFSIZ); |
1422 | w_length = USB_COMP_EP0_BUFSIZ; |
1423 | + } else { |
1424 | + goto done; |
1425 | } |
1426 | } |
1427 | |
1428 | diff --git a/drivers/usb/gadget/legacy/dbgp.c b/drivers/usb/gadget/legacy/dbgp.c |
1429 | index f1c5a22704b28..e8818ad973e4b 100644 |
1430 | --- a/drivers/usb/gadget/legacy/dbgp.c |
1431 | +++ b/drivers/usb/gadget/legacy/dbgp.c |
1432 | @@ -345,14 +345,14 @@ static int dbgp_setup(struct usb_gadget *gadget, |
1433 | u16 len = 0; |
1434 | |
1435 | if (length > DBGP_REQ_LEN) { |
1436 | - if (ctrl->bRequestType == USB_DIR_OUT) { |
1437 | - return err; |
1438 | - } else { |
1439 | + if (ctrl->bRequestType & USB_DIR_IN) { |
1440 | /* Cast away the const, we are going to overwrite on purpose. */ |
1441 | __le16 *temp = (__le16 *)&ctrl->wLength; |
1442 | |
1443 | *temp = cpu_to_le16(DBGP_REQ_LEN); |
1444 | length = DBGP_REQ_LEN; |
1445 | + } else { |
1446 | + return err; |
1447 | } |
1448 | } |
1449 | |
1450 | diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c |
1451 | index d39bd1a1ab8fc..19eb954a7afa3 100644 |
1452 | --- a/drivers/usb/gadget/legacy/inode.c |
1453 | +++ b/drivers/usb/gadget/legacy/inode.c |
1454 | @@ -1339,14 +1339,14 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) |
1455 | u16 w_length = le16_to_cpu(ctrl->wLength); |
1456 | |
1457 | if (w_length > RBUF_SIZE) { |
1458 | - if (ctrl->bRequestType == USB_DIR_OUT) { |
1459 | - return value; |
1460 | - } else { |
1461 | + if (ctrl->bRequestType & USB_DIR_IN) { |
1462 | /* Cast away the const, we are going to overwrite on purpose. */ |
1463 | __le16 *temp = (__le16 *)&ctrl->wLength; |
1464 | |
1465 | *temp = cpu_to_le16(RBUF_SIZE); |
1466 | w_length = RBUF_SIZE; |
1467 | + } else { |
1468 | + return value; |
1469 | } |
1470 | } |
1471 | |
1472 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
1473 | index 502931f658a8e..9479abb9eaaaf 100644 |
1474 | --- a/drivers/usb/serial/option.c |
1475 | +++ b/drivers/usb/serial/option.c |
1476 | @@ -1195,6 +1195,14 @@ static const struct usb_device_id option_ids[] = { |
1477 | .driver_info = NCTRL(2) | RSVD(3) }, |
1478 | { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1063, 0xff), /* Telit LN920 (ECM) */ |
1479 | .driver_info = NCTRL(0) | RSVD(1) }, |
1480 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1070, 0xff), /* Telit FN990 (rmnet) */ |
1481 | + .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, |
1482 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1071, 0xff), /* Telit FN990 (MBIM) */ |
1483 | + .driver_info = NCTRL(0) | RSVD(1) }, |
1484 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1072, 0xff), /* Telit FN990 (RNDIS) */ |
1485 | + .driver_info = NCTRL(2) | RSVD(3) }, |
1486 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1073, 0xff), /* Telit FN990 (ECM) */ |
1487 | + .driver_info = NCTRL(0) | RSVD(1) }, |
1488 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), |
1489 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, |
1490 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), |
1491 | diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c |
1492 | index 9af23f4365586..b41cc537eb311 100644 |
1493 | --- a/fs/fuse/dir.c |
1494 | +++ b/fs/fuse/dir.c |
1495 | @@ -973,7 +973,7 @@ int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid, |
1496 | if (!parent) |
1497 | return -ENOENT; |
1498 | |
1499 | - inode_lock(parent); |
1500 | + inode_lock_nested(parent, I_MUTEX_PARENT); |
1501 | if (!S_ISDIR(parent->i_mode)) |
1502 | goto unlock; |
1503 | |
1504 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
1505 | index 5c9231d5e14a0..524d98e3bcf5b 100644 |
1506 | --- a/fs/nfsd/nfs4state.c |
1507 | +++ b/fs/nfsd/nfs4state.c |
1508 | @@ -955,6 +955,11 @@ hash_delegation_locked(struct nfs4_delegation *dp, struct nfs4_file *fp) |
1509 | return 0; |
1510 | } |
1511 | |
1512 | +static bool delegation_hashed(struct nfs4_delegation *dp) |
1513 | +{ |
1514 | + return !(list_empty(&dp->dl_perfile)); |
1515 | +} |
1516 | + |
1517 | static bool |
1518 | unhash_delegation_locked(struct nfs4_delegation *dp) |
1519 | { |
1520 | @@ -962,7 +967,7 @@ unhash_delegation_locked(struct nfs4_delegation *dp) |
1521 | |
1522 | lockdep_assert_held(&state_lock); |
1523 | |
1524 | - if (list_empty(&dp->dl_perfile)) |
1525 | + if (!delegation_hashed(dp)) |
1526 | return false; |
1527 | |
1528 | dp->dl_stid.sc_type = NFS4_CLOSED_DELEG_STID; |
1529 | @@ -3882,7 +3887,7 @@ static void nfsd4_cb_recall_prepare(struct nfsd4_callback *cb) |
1530 | * queued for a lease break. Don't queue it again. |
1531 | */ |
1532 | spin_lock(&state_lock); |
1533 | - if (dp->dl_time == 0) { |
1534 | + if (delegation_hashed(dp) && dp->dl_time == 0) { |
1535 | dp->dl_time = get_seconds(); |
1536 | list_add_tail(&dp->dl_recall_lru, &nn->del_recall_lru); |
1537 | } |
1538 | diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c |
1539 | index e21b4d8b72405..bcba817f7af20 100644 |
1540 | --- a/kernel/time/timekeeping.c |
1541 | +++ b/kernel/time/timekeeping.c |
1542 | @@ -1198,8 +1198,7 @@ int do_settimeofday64(const struct timespec64 *ts) |
1543 | timekeeping_forward_now(tk); |
1544 | |
1545 | xt = tk_xtime(tk); |
1546 | - ts_delta.tv_sec = ts->tv_sec - xt.tv_sec; |
1547 | - ts_delta.tv_nsec = ts->tv_nsec - xt.tv_nsec; |
1548 | + ts_delta = timespec64_sub(*ts, xt); |
1549 | |
1550 | if (timespec64_compare(&tk->wall_to_monotonic, &ts_delta) > 0) { |
1551 | ret = -EINVAL; |
1552 | diff --git a/kernel/trace/tracing_map.c b/kernel/trace/tracing_map.c |
1553 | index 379db35838b64..572c0854d631c 100644 |
1554 | --- a/kernel/trace/tracing_map.c |
1555 | +++ b/kernel/trace/tracing_map.c |
1556 | @@ -24,6 +24,7 @@ |
1557 | #include <linux/jhash.h> |
1558 | #include <linux/slab.h> |
1559 | #include <linux/sort.h> |
1560 | +#include <linux/kmemleak.h> |
1561 | |
1562 | #include "tracing_map.h" |
1563 | #include "trace.h" |
1564 | @@ -227,6 +228,7 @@ void tracing_map_array_free(struct tracing_map_array *a) |
1565 | for (i = 0; i < a->n_pages; i++) { |
1566 | if (!a->pages[i]) |
1567 | break; |
1568 | + kmemleak_free(a->pages[i]); |
1569 | free_page((unsigned long)a->pages[i]); |
1570 | } |
1571 | |
1572 | @@ -262,6 +264,7 @@ struct tracing_map_array *tracing_map_array_alloc(unsigned int n_elts, |
1573 | a->pages[i] = (void *)get_zeroed_page(GFP_KERNEL); |
1574 | if (!a->pages[i]) |
1575 | goto free; |
1576 | + kmemleak_alloc(a->pages[i], PAGE_SIZE, 1, GFP_KERNEL); |
1577 | } |
1578 | out: |
1579 | return a; |
1580 | diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c |
1581 | index 80c45567ee3ad..030d85790584d 100644 |
1582 | --- a/net/mac80211/agg-tx.c |
1583 | +++ b/net/mac80211/agg-tx.c |
1584 | @@ -109,7 +109,7 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata, |
1585 | mgmt->u.action.u.addba_req.start_seq_num = |
1586 | cpu_to_le16(start_seq_num << 4); |
1587 | |
1588 | - ieee80211_tx_skb(sdata, skb); |
1589 | + ieee80211_tx_skb_tid(sdata, skb, tid); |
1590 | } |
1591 | |
1592 | void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn) |
1593 | diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c |
1594 | index 1b70de5898c42..13d69cbd14c20 100644 |
1595 | --- a/net/netlink/af_netlink.c |
1596 | +++ b/net/netlink/af_netlink.c |
1597 | @@ -1804,6 +1804,11 @@ static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) |
1598 | if (msg->msg_flags&MSG_OOB) |
1599 | return -EOPNOTSUPP; |
1600 | |
1601 | + if (len == 0) { |
1602 | + pr_warn_once("Zero length message leads to an empty skb\n"); |
1603 | + return -ENODATA; |
1604 | + } |
1605 | + |
1606 | err = scm_send(sock, msg, &scm, true); |
1607 | if (err < 0) |
1608 | return err; |
1609 | diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c |
1610 | index 27ad73861a33f..6e771022d43e1 100644 |
1611 | --- a/net/nfc/netlink.c |
1612 | +++ b/net/nfc/netlink.c |
1613 | @@ -669,8 +669,10 @@ static int nfc_genl_dump_devices_done(struct netlink_callback *cb) |
1614 | { |
1615 | struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0]; |
1616 | |
1617 | - nfc_device_iter_exit(iter); |
1618 | - kfree(iter); |
1619 | + if (iter) { |
1620 | + nfc_device_iter_exit(iter); |
1621 | + kfree(iter); |
1622 | + } |
1623 | |
1624 | return 0; |
1625 | } |
1626 | diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl |
1627 | index 113c7a0718108..21da2831e05b4 100755 |
1628 | --- a/scripts/recordmcount.pl |
1629 | +++ b/scripts/recordmcount.pl |
1630 | @@ -250,7 +250,7 @@ if ($arch eq "x86_64") { |
1631 | |
1632 | } elsif ($arch eq "s390" && $bits == 64) { |
1633 | if ($cc =~ /-DCC_USING_HOTPATCH/) { |
1634 | - $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*c0 04 00 00 00 00\\s*brcl\\s*0,[0-9a-f]+ <([^\+]*)>\$"; |
1635 | + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*c0 04 00 00 00 00\\s*(bcrl\\s*0,|jgnop\\s*)[0-9a-f]+ <([^\+]*)>\$"; |
1636 | $mcount_adjust = 0; |
1637 | } else { |
1638 | $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_390_(PC|PLT)32DBL\\s+_mcount\\+0x2\$"; |