Annotation of /trunk/kernel-alx-legacy/patches-4.9/0393-4.9.294-all-fixes.patch
Parent Directory | Revision Log
Revision 3695 -
(hide annotations)
(download)
Mon Oct 24 14:08:09 2022 UTC (19 months ago) by niro
File size: 53022 byte(s)
Mon Oct 24 14:08:09 2022 UTC (19 months ago) by niro
File size: 53022 byte(s)
-linux-4.9.294
1 | niro | 3695 | 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\$"; |