Gentoo Archives: gentoo-commits

From: Mike Pagano <mpagano@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/linux-patches:4.4 commit in: /
Date: Wed, 22 Dec 2021 14:09:42
Message-Id: 1640182168.7d9a8056d89cb172bf638ec581f7429d45e52efe.mpagano@gentoo
1 commit: 7d9a8056d89cb172bf638ec581f7429d45e52efe
2 Author: Mike Pagano <mpagano <AT> gentoo <DOT> org>
3 AuthorDate: Wed Dec 22 14:09:28 2021 +0000
4 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org>
5 CommitDate: Wed Dec 22 14:09:28 2021 +0000
6 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=7d9a8056
7
8 Linux patch 4.4.296
9
10 Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>
11
12 0000_README | 14 +-
13 1295_linux-4.4.296.patch | 1358 ++++++++++++++++++++++++++++++++++++++++++++++
14 2 files changed, 1367 insertions(+), 5 deletions(-)
15
16 diff --git a/0000_README b/0000_README
17 index e68fc753..2168e76a 100644
18 --- a/0000_README
19 +++ b/0000_README
20 @@ -1203,23 +1203,27 @@ Patch: 1289_linux-4.4.290.patch
21 From: http://www.kernel.org
22 Desc: Linux 4.4.290
23
24 -Patch: 1290_linux-4.4.291.patc
25 +Patch: 1290_linux-4.4.291.patch
26 From: http://www.kernel.org
27 Desc: Linux 4.4.291
28
29 -Patch: 1291_linux-4.4.292.patc
30 +Patch: 1291_linux-4.4.292.patch
31 From: http://www.kernel.org
32 Desc: Linux 4.4.292
33
34 -Patch: 1292_linux-4.4.293.patc
35 +Patch: 1292_linux-4.4.293.patch
36 From: http://www.kernel.org
37 Desc: Linux 4.4.293
38
39 -Patch: 1293_linux-4.4.294.patc
40 +Patch: 1293_linux-4.4.294.patch
41 From: http://www.kernel.org
42 Desc: Linux 4.4.294
43
44 -Patch: 1294_linux-4.4.295.patc
45 +Patch: 1294_linux-4.4.295.patch
46 +From: http://www.kernel.org
47 +Desc: Linux 4.4.295
48 +
49 +Patch: 1295_linux-4.4.296.patch
50 From: http://www.kernel.org
51 Desc: Linux 4.4.295
52
53
54 diff --git a/1295_linux-4.4.296.patch b/1295_linux-4.4.296.patch
55 new file mode 100644
56 index 00000000..dea5ca91
57 --- /dev/null
58 +++ b/1295_linux-4.4.296.patch
59 @@ -0,0 +1,1358 @@
60 +diff --git a/Makefile b/Makefile
61 +index b2a9f72ab8000..37c12303478e3 100644
62 +--- a/Makefile
63 ++++ b/Makefile
64 +@@ -1,6 +1,6 @@
65 + VERSION = 4
66 + PATCHLEVEL = 4
67 +-SUBLEVEL = 295
68 ++SUBLEVEL = 296
69 + EXTRAVERSION =
70 + NAME = Blurry Fish Butt
71 +
72 +diff --git a/arch/arm/mm/copypage-fa.c b/arch/arm/mm/copypage-fa.c
73 +index d130a5ece5d55..bf24690ec83af 100644
74 +--- a/arch/arm/mm/copypage-fa.c
75 ++++ b/arch/arm/mm/copypage-fa.c
76 +@@ -17,26 +17,25 @@
77 + /*
78 + * Faraday optimised copy_user_page
79 + */
80 +-static void __naked
81 +-fa_copy_user_page(void *kto, const void *kfrom)
82 ++static void fa_copy_user_page(void *kto, const void *kfrom)
83 + {
84 +- asm("\
85 +- stmfd sp!, {r4, lr} @ 2\n\
86 +- mov r2, %0 @ 1\n\
87 +-1: ldmia r1!, {r3, r4, ip, lr} @ 4\n\
88 +- stmia r0, {r3, r4, ip, lr} @ 4\n\
89 +- mcr p15, 0, r0, c7, c14, 1 @ 1 clean and invalidate D line\n\
90 +- add r0, r0, #16 @ 1\n\
91 +- ldmia r1!, {r3, r4, ip, lr} @ 4\n\
92 +- stmia r0, {r3, r4, ip, lr} @ 4\n\
93 +- mcr p15, 0, r0, c7, c14, 1 @ 1 clean and invalidate D line\n\
94 +- add r0, r0, #16 @ 1\n\
95 +- subs r2, r2, #1 @ 1\n\
96 ++ int tmp;
97 ++
98 ++ asm volatile ("\
99 ++1: ldmia %1!, {r3, r4, ip, lr} @ 4\n\
100 ++ stmia %0, {r3, r4, ip, lr} @ 4\n\
101 ++ mcr p15, 0, %0, c7, c14, 1 @ 1 clean and invalidate D line\n\
102 ++ add %0, %0, #16 @ 1\n\
103 ++ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
104 ++ stmia %0, {r3, r4, ip, lr} @ 4\n\
105 ++ mcr p15, 0, %0, c7, c14, 1 @ 1 clean and invalidate D line\n\
106 ++ add %0, %0, #16 @ 1\n\
107 ++ subs %2, %2, #1 @ 1\n\
108 + bne 1b @ 1\n\
109 +- mcr p15, 0, r2, c7, c10, 4 @ 1 drain WB\n\
110 +- ldmfd sp!, {r4, pc} @ 3"
111 +- :
112 +- : "I" (PAGE_SIZE / 32));
113 ++ mcr p15, 0, %2, c7, c10, 4 @ 1 drain WB"
114 ++ : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
115 ++ : "2" (PAGE_SIZE / 32)
116 ++ : "r3", "r4", "ip", "lr");
117 + }
118 +
119 + void fa_copy_user_highpage(struct page *to, struct page *from,
120 +diff --git a/arch/arm/mm/copypage-feroceon.c b/arch/arm/mm/copypage-feroceon.c
121 +index 49ee0c1a72097..cc819732d9b82 100644
122 +--- a/arch/arm/mm/copypage-feroceon.c
123 ++++ b/arch/arm/mm/copypage-feroceon.c
124 +@@ -13,58 +13,56 @@
125 + #include <linux/init.h>
126 + #include <linux/highmem.h>
127 +
128 +-static void __naked
129 +-feroceon_copy_user_page(void *kto, const void *kfrom)
130 ++static void feroceon_copy_user_page(void *kto, const void *kfrom)
131 + {
132 +- asm("\
133 +- stmfd sp!, {r4-r9, lr} \n\
134 +- mov ip, %2 \n\
135 +-1: mov lr, r1 \n\
136 +- ldmia r1!, {r2 - r9} \n\
137 +- pld [lr, #32] \n\
138 +- pld [lr, #64] \n\
139 +- pld [lr, #96] \n\
140 +- pld [lr, #128] \n\
141 +- pld [lr, #160] \n\
142 +- pld [lr, #192] \n\
143 +- pld [lr, #224] \n\
144 +- stmia r0, {r2 - r9} \n\
145 +- ldmia r1!, {r2 - r9} \n\
146 +- mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\
147 +- add r0, r0, #32 \n\
148 +- stmia r0, {r2 - r9} \n\
149 +- ldmia r1!, {r2 - r9} \n\
150 +- mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\
151 +- add r0, r0, #32 \n\
152 +- stmia r0, {r2 - r9} \n\
153 +- ldmia r1!, {r2 - r9} \n\
154 +- mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\
155 +- add r0, r0, #32 \n\
156 +- stmia r0, {r2 - r9} \n\
157 +- ldmia r1!, {r2 - r9} \n\
158 +- mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\
159 +- add r0, r0, #32 \n\
160 +- stmia r0, {r2 - r9} \n\
161 +- ldmia r1!, {r2 - r9} \n\
162 +- mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\
163 +- add r0, r0, #32 \n\
164 +- stmia r0, {r2 - r9} \n\
165 +- ldmia r1!, {r2 - r9} \n\
166 +- mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\
167 +- add r0, r0, #32 \n\
168 +- stmia r0, {r2 - r9} \n\
169 +- ldmia r1!, {r2 - r9} \n\
170 +- mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\
171 +- add r0, r0, #32 \n\
172 +- stmia r0, {r2 - r9} \n\
173 +- subs ip, ip, #(32 * 8) \n\
174 +- mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line\n\
175 +- add r0, r0, #32 \n\
176 ++ int tmp;
177 ++
178 ++ asm volatile ("\
179 ++1: ldmia %1!, {r2 - r7, ip, lr} \n\
180 ++ pld [%1, #0] \n\
181 ++ pld [%1, #32] \n\
182 ++ pld [%1, #64] \n\
183 ++ pld [%1, #96] \n\
184 ++ pld [%1, #128] \n\
185 ++ pld [%1, #160] \n\
186 ++ pld [%1, #192] \n\
187 ++ stmia %0, {r2 - r7, ip, lr} \n\
188 ++ ldmia %1!, {r2 - r7, ip, lr} \n\
189 ++ mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\
190 ++ add %0, %0, #32 \n\
191 ++ stmia %0, {r2 - r7, ip, lr} \n\
192 ++ ldmia %1!, {r2 - r7, ip, lr} \n\
193 ++ mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\
194 ++ add %0, %0, #32 \n\
195 ++ stmia %0, {r2 - r7, ip, lr} \n\
196 ++ ldmia %1!, {r2 - r7, ip, lr} \n\
197 ++ mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\
198 ++ add %0, %0, #32 \n\
199 ++ stmia %0, {r2 - r7, ip, lr} \n\
200 ++ ldmia %1!, {r2 - r7, ip, lr} \n\
201 ++ mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\
202 ++ add %0, %0, #32 \n\
203 ++ stmia %0, {r2 - r7, ip, lr} \n\
204 ++ ldmia %1!, {r2 - r7, ip, lr} \n\
205 ++ mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\
206 ++ add %0, %0, #32 \n\
207 ++ stmia %0, {r2 - r7, ip, lr} \n\
208 ++ ldmia %1!, {r2 - r7, ip, lr} \n\
209 ++ mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\
210 ++ add %0, %0, #32 \n\
211 ++ stmia %0, {r2 - r7, ip, lr} \n\
212 ++ ldmia %1!, {r2 - r7, ip, lr} \n\
213 ++ mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\
214 ++ add %0, %0, #32 \n\
215 ++ stmia %0, {r2 - r7, ip, lr} \n\
216 ++ subs %2, %2, #(32 * 8) \n\
217 ++ mcr p15, 0, %0, c7, c14, 1 @ clean and invalidate D line\n\
218 ++ add %0, %0, #32 \n\
219 + bne 1b \n\
220 +- mcr p15, 0, ip, c7, c10, 4 @ drain WB\n\
221 +- ldmfd sp!, {r4-r9, pc}"
222 +- :
223 +- : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE));
224 ++ mcr p15, 0, %2, c7, c10, 4 @ drain WB"
225 ++ : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
226 ++ : "2" (PAGE_SIZE)
227 ++ : "r2", "r3", "r4", "r5", "r6", "r7", "ip", "lr");
228 + }
229 +
230 + void feroceon_copy_user_highpage(struct page *to, struct page *from,
231 +diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c
232 +index 1267e64133b92..db624170854a0 100644
233 +--- a/arch/arm/mm/copypage-v4mc.c
234 ++++ b/arch/arm/mm/copypage-v4mc.c
235 +@@ -40,12 +40,11 @@ static DEFINE_RAW_SPINLOCK(minicache_lock);
236 + * instruction. If your processor does not supply this, you have to write your
237 + * own copy_user_highpage that does the right thing.
238 + */
239 +-static void __naked
240 +-mc_copy_user_page(void *from, void *to)
241 ++static void mc_copy_user_page(void *from, void *to)
242 + {
243 +- asm volatile(
244 +- "stmfd sp!, {r4, lr} @ 2\n\
245 +- mov r4, %2 @ 1\n\
246 ++ int tmp;
247 ++
248 ++ asm volatile ("\
249 + ldmia %0!, {r2, r3, ip, lr} @ 4\n\
250 + 1: mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\
251 + stmia %1!, {r2, r3, ip, lr} @ 4\n\
252 +@@ -55,13 +54,13 @@ mc_copy_user_page(void *from, void *to)
253 + mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\
254 + stmia %1!, {r2, r3, ip, lr} @ 4\n\
255 + ldmia %0!, {r2, r3, ip, lr} @ 4\n\
256 +- subs r4, r4, #1 @ 1\n\
257 ++ subs %2, %2, #1 @ 1\n\
258 + stmia %1!, {r2, r3, ip, lr} @ 4\n\
259 + ldmneia %0!, {r2, r3, ip, lr} @ 4\n\
260 +- bne 1b @ 1\n\
261 +- ldmfd sp!, {r4, pc} @ 3"
262 +- :
263 +- : "r" (from), "r" (to), "I" (PAGE_SIZE / 64));
264 ++ bne 1b @ "
265 ++ : "+&r" (from), "+&r" (to), "=&r" (tmp)
266 ++ : "2" (PAGE_SIZE / 64)
267 ++ : "r2", "r3", "ip", "lr");
268 + }
269 +
270 + void v4_mc_copy_user_highpage(struct page *to, struct page *from,
271 +diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c
272 +index 067d0fdd630c1..cd3e165afeede 100644
273 +--- a/arch/arm/mm/copypage-v4wb.c
274 ++++ b/arch/arm/mm/copypage-v4wb.c
275 +@@ -22,29 +22,28 @@
276 + * instruction. If your processor does not supply this, you have to write your
277 + * own copy_user_highpage that does the right thing.
278 + */
279 +-static void __naked
280 +-v4wb_copy_user_page(void *kto, const void *kfrom)
281 ++static void v4wb_copy_user_page(void *kto, const void *kfrom)
282 + {
283 +- asm("\
284 +- stmfd sp!, {r4, lr} @ 2\n\
285 +- mov r2, %2 @ 1\n\
286 +- ldmia r1!, {r3, r4, ip, lr} @ 4\n\
287 +-1: mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line\n\
288 +- stmia r0!, {r3, r4, ip, lr} @ 4\n\
289 +- ldmia r1!, {r3, r4, ip, lr} @ 4+1\n\
290 +- stmia r0!, {r3, r4, ip, lr} @ 4\n\
291 +- ldmia r1!, {r3, r4, ip, lr} @ 4\n\
292 +- mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line\n\
293 +- stmia r0!, {r3, r4, ip, lr} @ 4\n\
294 +- ldmia r1!, {r3, r4, ip, lr} @ 4\n\
295 +- subs r2, r2, #1 @ 1\n\
296 +- stmia r0!, {r3, r4, ip, lr} @ 4\n\
297 +- ldmneia r1!, {r3, r4, ip, lr} @ 4\n\
298 ++ int tmp;
299 ++
300 ++ asm volatile ("\
301 ++ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
302 ++1: mcr p15, 0, %0, c7, c6, 1 @ 1 invalidate D line\n\
303 ++ stmia %0!, {r3, r4, ip, lr} @ 4\n\
304 ++ ldmia %1!, {r3, r4, ip, lr} @ 4+1\n\
305 ++ stmia %0!, {r3, r4, ip, lr} @ 4\n\
306 ++ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
307 ++ mcr p15, 0, %0, c7, c6, 1 @ 1 invalidate D line\n\
308 ++ stmia %0!, {r3, r4, ip, lr} @ 4\n\
309 ++ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
310 ++ subs %2, %2, #1 @ 1\n\
311 ++ stmia %0!, {r3, r4, ip, lr} @ 4\n\
312 ++ ldmneia %1!, {r3, r4, ip, lr} @ 4\n\
313 + bne 1b @ 1\n\
314 +- mcr p15, 0, r1, c7, c10, 4 @ 1 drain WB\n\
315 +- ldmfd sp!, {r4, pc} @ 3"
316 +- :
317 +- : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64));
318 ++ mcr p15, 0, %1, c7, c10, 4 @ 1 drain WB"
319 ++ : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
320 ++ : "2" (PAGE_SIZE / 64)
321 ++ : "r3", "r4", "ip", "lr");
322 + }
323 +
324 + void v4wb_copy_user_highpage(struct page *to, struct page *from,
325 +diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c
326 +index b85c5da2e510e..8614572e1296b 100644
327 +--- a/arch/arm/mm/copypage-v4wt.c
328 ++++ b/arch/arm/mm/copypage-v4wt.c
329 +@@ -20,27 +20,26 @@
330 + * dirty data in the cache. However, we do have to ensure that
331 + * subsequent reads are up to date.
332 + */
333 +-static void __naked
334 +-v4wt_copy_user_page(void *kto, const void *kfrom)
335 ++static void v4wt_copy_user_page(void *kto, const void *kfrom)
336 + {
337 +- asm("\
338 +- stmfd sp!, {r4, lr} @ 2\n\
339 +- mov r2, %2 @ 1\n\
340 +- ldmia r1!, {r3, r4, ip, lr} @ 4\n\
341 +-1: stmia r0!, {r3, r4, ip, lr} @ 4\n\
342 +- ldmia r1!, {r3, r4, ip, lr} @ 4+1\n\
343 +- stmia r0!, {r3, r4, ip, lr} @ 4\n\
344 +- ldmia r1!, {r3, r4, ip, lr} @ 4\n\
345 +- stmia r0!, {r3, r4, ip, lr} @ 4\n\
346 +- ldmia r1!, {r3, r4, ip, lr} @ 4\n\
347 +- subs r2, r2, #1 @ 1\n\
348 +- stmia r0!, {r3, r4, ip, lr} @ 4\n\
349 +- ldmneia r1!, {r3, r4, ip, lr} @ 4\n\
350 ++ int tmp;
351 ++
352 ++ asm volatile ("\
353 ++ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
354 ++1: stmia %0!, {r3, r4, ip, lr} @ 4\n\
355 ++ ldmia %1!, {r3, r4, ip, lr} @ 4+1\n\
356 ++ stmia %0!, {r3, r4, ip, lr} @ 4\n\
357 ++ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
358 ++ stmia %0!, {r3, r4, ip, lr} @ 4\n\
359 ++ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
360 ++ subs %2, %2, #1 @ 1\n\
361 ++ stmia %0!, {r3, r4, ip, lr} @ 4\n\
362 ++ ldmneia %1!, {r3, r4, ip, lr} @ 4\n\
363 + bne 1b @ 1\n\
364 +- mcr p15, 0, r2, c7, c7, 0 @ flush ID cache\n\
365 +- ldmfd sp!, {r4, pc} @ 3"
366 +- :
367 +- : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64));
368 ++ mcr p15, 0, %2, c7, c7, 0 @ flush ID cache"
369 ++ : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
370 ++ : "2" (PAGE_SIZE / 64)
371 ++ : "r3", "r4", "ip", "lr");
372 + }
373 +
374 + void v4wt_copy_user_highpage(struct page *to, struct page *from,
375 +diff --git a/arch/arm/mm/copypage-xsc3.c b/arch/arm/mm/copypage-xsc3.c
376 +index 03a2042aced5f..55cbc3a89d858 100644
377 +--- a/arch/arm/mm/copypage-xsc3.c
378 ++++ b/arch/arm/mm/copypage-xsc3.c
379 +@@ -21,53 +21,46 @@
380 +
381 + /*
382 + * XSC3 optimised copy_user_highpage
383 +- * r0 = destination
384 +- * r1 = source
385 + *
386 + * The source page may have some clean entries in the cache already, but we
387 + * can safely ignore them - break_cow() will flush them out of the cache
388 + * if we eventually end up using our copied page.
389 + *
390 + */
391 +-static void __naked
392 +-xsc3_mc_copy_user_page(void *kto, const void *kfrom)
393 ++static void xsc3_mc_copy_user_page(void *kto, const void *kfrom)
394 + {
395 +- asm("\
396 +- stmfd sp!, {r4, r5, lr} \n\
397 +- mov lr, %2 \n\
398 +- \n\
399 +- pld [r1, #0] \n\
400 +- pld [r1, #32] \n\
401 +-1: pld [r1, #64] \n\
402 +- pld [r1, #96] \n\
403 ++ int tmp;
404 ++
405 ++ asm volatile ("\
406 ++ pld [%1, #0] \n\
407 ++ pld [%1, #32] \n\
408 ++1: pld [%1, #64] \n\
409 ++ pld [%1, #96] \n\
410 + \n\
411 +-2: ldrd r2, [r1], #8 \n\
412 +- mov ip, r0 \n\
413 +- ldrd r4, [r1], #8 \n\
414 +- mcr p15, 0, ip, c7, c6, 1 @ invalidate\n\
415 +- strd r2, [r0], #8 \n\
416 +- ldrd r2, [r1], #8 \n\
417 +- strd r4, [r0], #8 \n\
418 +- ldrd r4, [r1], #8 \n\
419 +- strd r2, [r0], #8 \n\
420 +- strd r4, [r0], #8 \n\
421 +- ldrd r2, [r1], #8 \n\
422 +- mov ip, r0 \n\
423 +- ldrd r4, [r1], #8 \n\
424 +- mcr p15, 0, ip, c7, c6, 1 @ invalidate\n\
425 +- strd r2, [r0], #8 \n\
426 +- ldrd r2, [r1], #8 \n\
427 +- subs lr, lr, #1 \n\
428 +- strd r4, [r0], #8 \n\
429 +- ldrd r4, [r1], #8 \n\
430 +- strd r2, [r0], #8 \n\
431 +- strd r4, [r0], #8 \n\
432 ++2: ldrd r2, [%1], #8 \n\
433 ++ ldrd r4, [%1], #8 \n\
434 ++ mcr p15, 0, %0, c7, c6, 1 @ invalidate\n\
435 ++ strd r2, [%0], #8 \n\
436 ++ ldrd r2, [%1], #8 \n\
437 ++ strd r4, [%0], #8 \n\
438 ++ ldrd r4, [%1], #8 \n\
439 ++ strd r2, [%0], #8 \n\
440 ++ strd r4, [%0], #8 \n\
441 ++ ldrd r2, [%1], #8 \n\
442 ++ ldrd r4, [%1], #8 \n\
443 ++ mcr p15, 0, %0, c7, c6, 1 @ invalidate\n\
444 ++ strd r2, [%0], #8 \n\
445 ++ ldrd r2, [%1], #8 \n\
446 ++ subs %2, %2, #1 \n\
447 ++ strd r4, [%0], #8 \n\
448 ++ ldrd r4, [%1], #8 \n\
449 ++ strd r2, [%0], #8 \n\
450 ++ strd r4, [%0], #8 \n\
451 + bgt 1b \n\
452 +- beq 2b \n\
453 +- \n\
454 +- ldmfd sp!, {r4, r5, pc}"
455 +- :
456 +- : "r" (kto), "r" (kfrom), "I" (PAGE_SIZE / 64 - 1));
457 ++ beq 2b "
458 ++ : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
459 ++ : "2" (PAGE_SIZE / 64 - 1)
460 ++ : "r2", "r3", "r4", "r5");
461 + }
462 +
463 + void xsc3_mc_copy_user_highpage(struct page *to, struct page *from,
464 +@@ -85,8 +78,6 @@ void xsc3_mc_copy_user_highpage(struct page *to, struct page *from,
465 +
466 + /*
467 + * XScale optimised clear_user_page
468 +- * r0 = destination
469 +- * r1 = virtual user address of ultimate destination page
470 + */
471 + void xsc3_mc_clear_user_highpage(struct page *page, unsigned long vaddr)
472 + {
473 +diff --git a/arch/arm/mm/copypage-xscale.c b/arch/arm/mm/copypage-xscale.c
474 +index 0fb85025344d9..c775d4b7adb08 100644
475 +--- a/arch/arm/mm/copypage-xscale.c
476 ++++ b/arch/arm/mm/copypage-xscale.c
477 +@@ -36,52 +36,51 @@ static DEFINE_RAW_SPINLOCK(minicache_lock);
478 + * Dcache aliasing issue. The writes will be forwarded to the write buffer,
479 + * and merged as appropriate.
480 + */
481 +-static void __naked
482 +-mc_copy_user_page(void *from, void *to)
483 ++static void mc_copy_user_page(void *from, void *to)
484 + {
485 ++ int tmp;
486 ++
487 + /*
488 + * Strangely enough, best performance is achieved
489 + * when prefetching destination as well. (NP)
490 + */
491 +- asm volatile(
492 +- "stmfd sp!, {r4, r5, lr} \n\
493 +- mov lr, %2 \n\
494 +- pld [r0, #0] \n\
495 +- pld [r0, #32] \n\
496 +- pld [r1, #0] \n\
497 +- pld [r1, #32] \n\
498 +-1: pld [r0, #64] \n\
499 +- pld [r0, #96] \n\
500 +- pld [r1, #64] \n\
501 +- pld [r1, #96] \n\
502 +-2: ldrd r2, [r0], #8 \n\
503 +- ldrd r4, [r0], #8 \n\
504 +- mov ip, r1 \n\
505 +- strd r2, [r1], #8 \n\
506 +- ldrd r2, [r0], #8 \n\
507 +- strd r4, [r1], #8 \n\
508 +- ldrd r4, [r0], #8 \n\
509 +- strd r2, [r1], #8 \n\
510 +- strd r4, [r1], #8 \n\
511 ++ asm volatile ("\
512 ++ pld [%0, #0] \n\
513 ++ pld [%0, #32] \n\
514 ++ pld [%1, #0] \n\
515 ++ pld [%1, #32] \n\
516 ++1: pld [%0, #64] \n\
517 ++ pld [%0, #96] \n\
518 ++ pld [%1, #64] \n\
519 ++ pld [%1, #96] \n\
520 ++2: ldrd r2, [%0], #8 \n\
521 ++ ldrd r4, [%0], #8 \n\
522 ++ mov ip, %1 \n\
523 ++ strd r2, [%1], #8 \n\
524 ++ ldrd r2, [%0], #8 \n\
525 ++ strd r4, [%1], #8 \n\
526 ++ ldrd r4, [%0], #8 \n\
527 ++ strd r2, [%1], #8 \n\
528 ++ strd r4, [%1], #8 \n\
529 + mcr p15, 0, ip, c7, c10, 1 @ clean D line\n\
530 +- ldrd r2, [r0], #8 \n\
531 ++ ldrd r2, [%0], #8 \n\
532 + mcr p15, 0, ip, c7, c6, 1 @ invalidate D line\n\
533 +- ldrd r4, [r0], #8 \n\
534 +- mov ip, r1 \n\
535 +- strd r2, [r1], #8 \n\
536 +- ldrd r2, [r0], #8 \n\
537 +- strd r4, [r1], #8 \n\
538 +- ldrd r4, [r0], #8 \n\
539 +- strd r2, [r1], #8 \n\
540 +- strd r4, [r1], #8 \n\
541 ++ ldrd r4, [%0], #8 \n\
542 ++ mov ip, %1 \n\
543 ++ strd r2, [%1], #8 \n\
544 ++ ldrd r2, [%0], #8 \n\
545 ++ strd r4, [%1], #8 \n\
546 ++ ldrd r4, [%0], #8 \n\
547 ++ strd r2, [%1], #8 \n\
548 ++ strd r4, [%1], #8 \n\
549 + mcr p15, 0, ip, c7, c10, 1 @ clean D line\n\
550 +- subs lr, lr, #1 \n\
551 ++ subs %2, %2, #1 \n\
552 + mcr p15, 0, ip, c7, c6, 1 @ invalidate D line\n\
553 + bgt 1b \n\
554 +- beq 2b \n\
555 +- ldmfd sp!, {r4, r5, pc} "
556 +- :
557 +- : "r" (from), "r" (to), "I" (PAGE_SIZE / 64 - 1));
558 ++ beq 2b "
559 ++ : "+&r" (from), "+&r" (to), "=&r" (tmp)
560 ++ : "2" (PAGE_SIZE / 64 - 1)
561 ++ : "r2", "r3", "r4", "r5", "ip");
562 + }
563 +
564 + void xscale_mc_copy_user_highpage(struct page *to, struct page *from,
565 +diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
566 +index b27917dfdcc05..1e44b7880200d 100644
567 +--- a/drivers/block/xen-blkfront.c
568 ++++ b/drivers/block/xen-blkfront.c
569 +@@ -1319,11 +1319,13 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
570 + unsigned long flags;
571 + struct blkfront_info *info = (struct blkfront_info *)dev_id;
572 + int error;
573 ++ unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS;
574 +
575 + spin_lock_irqsave(&info->io_lock, flags);
576 +
577 + if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) {
578 + spin_unlock_irqrestore(&info->io_lock, flags);
579 ++ xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS);
580 + return IRQ_HANDLED;
581 + }
582 +
583 +@@ -1340,6 +1342,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
584 + unsigned long id;
585 + unsigned int op;
586 +
587 ++ eoiflag = 0;
588 ++
589 + RING_COPY_RESPONSE(&info->ring, i, &bret);
590 + id = bret.id;
591 +
592 +@@ -1444,6 +1448,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
593 +
594 + spin_unlock_irqrestore(&info->io_lock, flags);
595 +
596 ++ xen_irq_lateeoi(irq, eoiflag);
597 ++
598 + return IRQ_HANDLED;
599 +
600 + err:
601 +@@ -1451,6 +1457,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
602 +
603 + spin_unlock_irqrestore(&info->io_lock, flags);
604 +
605 ++ /* No EOI in order to avoid further interrupts. */
606 ++
607 + pr_alert("%s disabled for further use\n", info->gd->disk_name);
608 + return IRQ_HANDLED;
609 + }
610 +@@ -1489,8 +1497,8 @@ static int setup_blkring(struct xenbus_device *dev,
611 + if (err)
612 + goto fail;
613 +
614 +- err = bind_evtchn_to_irqhandler(info->evtchn, blkif_interrupt, 0,
615 +- "blkif", info);
616 ++ err = bind_evtchn_to_irqhandler_lateeoi(info->evtchn, blkif_interrupt,
617 ++ 0, "blkif", info);
618 + if (err <= 0) {
619 + xenbus_dev_fatal(dev, err,
620 + "bind_evtchn_to_irqhandler failed");
621 +diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c
622 +index 15f2e7025b78e..1d5510cb6db4e 100644
623 +--- a/drivers/char/agp/parisc-agp.c
624 ++++ b/drivers/char/agp/parisc-agp.c
625 +@@ -285,7 +285,7 @@ agp_ioc_init(void __iomem *ioc_regs)
626 + return 0;
627 + }
628 +
629 +-static int
630 ++static int __init
631 + lba_find_capability(int cap)
632 + {
633 + struct _parisc_agp_info *info = &parisc_agp_info;
634 +@@ -370,7 +370,7 @@ fail:
635 + return error;
636 + }
637 +
638 +-static int
639 ++static int __init
640 + find_quicksilver(struct device *dev, void *data)
641 + {
642 + struct parisc_device **lba = data;
643 +@@ -382,7 +382,7 @@ find_quicksilver(struct device *dev, void *data)
644 + return 0;
645 + }
646 +
647 +-static int
648 ++static int __init
649 + parisc_agp_init(void)
650 + {
651 + extern struct sba_device *sba_list;
652 +diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c
653 +index a9356a3dea926..da8465cf26cb8 100644
654 +--- a/drivers/hwmon/dell-smm-hwmon.c
655 ++++ b/drivers/hwmon/dell-smm-hwmon.c
656 +@@ -551,15 +551,18 @@ static const struct file_operations i8k_fops = {
657 + .unlocked_ioctl = i8k_ioctl,
658 + };
659 +
660 ++static struct proc_dir_entry *entry;
661 ++
662 + static void __init i8k_init_procfs(void)
663 + {
664 + /* Register the proc entry */
665 +- proc_create("i8k", 0, NULL, &i8k_fops);
666 ++ entry = proc_create("i8k", 0, NULL, &i8k_fops);
667 + }
668 +
669 + static void __exit i8k_exit_procfs(void)
670 + {
671 +- remove_proc_entry("i8k", NULL);
672 ++ if (entry)
673 ++ remove_proc_entry("i8k", NULL);
674 + }
675 +
676 + #else
677 +diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c
678 +index 9096d17beb5bb..587f1a5a10243 100644
679 +--- a/drivers/i2c/busses/i2c-rk3x.c
680 ++++ b/drivers/i2c/busses/i2c-rk3x.c
681 +@@ -325,8 +325,8 @@ static void rk3x_i2c_handle_read(struct rk3x_i2c *i2c, unsigned int ipd)
682 + if (!(ipd & REG_INT_MBRF))
683 + return;
684 +
685 +- /* ack interrupt */
686 +- i2c_writel(i2c, REG_INT_MBRF, REG_IPD);
687 ++ /* ack interrupt (read also produces a spurious START flag, clear it too) */
688 ++ i2c_writel(i2c, REG_INT_MBRF | REG_INT_START, REG_IPD);
689 +
690 + /* Can only handle a maximum of 32 bytes at a time */
691 + if (len > 32)
692 +diff --git a/drivers/input/touchscreen/of_touchscreen.c b/drivers/input/touchscreen/of_touchscreen.c
693 +index bb6f2fe146672..490f3055aec39 100644
694 +--- a/drivers/input/touchscreen/of_touchscreen.c
695 ++++ b/drivers/input/touchscreen/of_touchscreen.c
696 +@@ -75,8 +75,8 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch)
697 + data_present = touchscreen_get_prop_u32(dev, "touchscreen-size-x",
698 + input_abs_get_max(input,
699 + axis) + 1,
700 +- &maximum) |
701 +- touchscreen_get_prop_u32(dev, "touchscreen-fuzz-x",
702 ++ &maximum);
703 ++ data_present |= touchscreen_get_prop_u32(dev, "touchscreen-fuzz-x",
704 + input_abs_get_fuzz(input, axis),
705 + &fuzz);
706 + if (data_present)
707 +@@ -86,8 +86,8 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch)
708 + data_present = touchscreen_get_prop_u32(dev, "touchscreen-size-y",
709 + input_abs_get_max(input,
710 + axis) + 1,
711 +- &maximum) |
712 +- touchscreen_get_prop_u32(dev, "touchscreen-fuzz-y",
713 ++ &maximum);
714 ++ data_present |= touchscreen_get_prop_u32(dev, "touchscreen-fuzz-y",
715 + input_abs_get_fuzz(input, axis),
716 + &fuzz);
717 + if (data_present)
718 +@@ -97,11 +97,11 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch)
719 + data_present = touchscreen_get_prop_u32(dev,
720 + "touchscreen-max-pressure",
721 + input_abs_get_max(input, axis),
722 +- &maximum) |
723 +- touchscreen_get_prop_u32(dev,
724 +- "touchscreen-fuzz-pressure",
725 +- input_abs_get_fuzz(input, axis),
726 +- &fuzz);
727 ++ &maximum);
728 ++ data_present |= touchscreen_get_prop_u32(dev,
729 ++ "touchscreen-fuzz-pressure",
730 ++ input_abs_get_fuzz(input, axis),
731 ++ &fuzz);
732 + if (data_present)
733 + touchscreen_set_params(input, axis, maximum, fuzz);
734 + }
735 +diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c
736 +index 9e4d1212f4c16..63f2baed3c8a6 100644
737 +--- a/drivers/md/persistent-data/dm-btree-remove.c
738 ++++ b/drivers/md/persistent-data/dm-btree-remove.c
739 +@@ -423,9 +423,9 @@ static int rebalance_children(struct shadow_spine *s,
740 +
741 + memcpy(n, dm_block_data(child),
742 + dm_bm_block_size(dm_tm_get_bm(info->tm)));
743 +- dm_tm_unlock(info->tm, child);
744 +
745 + dm_tm_dec(info->tm, dm_block_location(child));
746 ++ dm_tm_unlock(info->tm, child);
747 + return 0;
748 + }
749 +
750 +diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
751 +index 94f06c35ad9c3..c76102754c226 100644
752 +--- a/drivers/net/ethernet/broadcom/bcmsysport.c
753 ++++ b/drivers/net/ethernet/broadcom/bcmsysport.c
754 +@@ -90,9 +90,13 @@ static inline void tdma_port_write_desc_addr(struct bcm_sysport_priv *priv,
755 + struct dma_desc *desc,
756 + unsigned int port)
757 + {
758 ++ unsigned long desc_flags;
759 ++
760 + /* Ports are latched, so write upper address first */
761 ++ spin_lock_irqsave(&priv->desc_lock, desc_flags);
762 + tdma_writel(priv, desc->addr_status_len, TDMA_WRITE_PORT_HI(port));
763 + tdma_writel(priv, desc->addr_lo, TDMA_WRITE_PORT_LO(port));
764 ++ spin_unlock_irqrestore(&priv->desc_lock, desc_flags);
765 + }
766 +
767 + /* Ethtool operations */
768 +@@ -1608,6 +1612,7 @@ static int bcm_sysport_open(struct net_device *dev)
769 + }
770 +
771 + /* Initialize both hardware and software ring */
772 ++ spin_lock_init(&priv->desc_lock);
773 + for (i = 0; i < dev->num_tx_queues; i++) {
774 + ret = bcm_sysport_init_tx_ring(priv, i);
775 + if (ret) {
776 +diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h
777 +index e668b1ce58280..bb484c7faf679 100644
778 +--- a/drivers/net/ethernet/broadcom/bcmsysport.h
779 ++++ b/drivers/net/ethernet/broadcom/bcmsysport.h
780 +@@ -660,6 +660,7 @@ struct bcm_sysport_priv {
781 + int wol_irq;
782 +
783 + /* Transmit rings */
784 ++ spinlock_t desc_lock;
785 + struct bcm_sysport_tx_ring tx_rings[TDMA_NUM_RINGS];
786 +
787 + /* Receive queue */
788 +diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c
789 +index 519b72c418884..ab080118201df 100644
790 +--- a/drivers/net/ethernet/intel/igbvf/netdev.c
791 ++++ b/drivers/net/ethernet/intel/igbvf/netdev.c
792 +@@ -2793,6 +2793,7 @@ static int igbvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
793 + return 0;
794 +
795 + err_hw_init:
796 ++ netif_napi_del(&adapter->rx_ring->napi);
797 + kfree(adapter->tx_ring);
798 + kfree(adapter->rx_ring);
799 + err_sw_init:
800 +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
801 +index 324e2e15092f3..ca3c7a4402a1b 100644
802 +--- a/drivers/net/usb/lan78xx.c
803 ++++ b/drivers/net/usb/lan78xx.c
804 +@@ -609,11 +609,9 @@ static int lan78xx_read_otp(struct lan78xx_net *dev, u32 offset,
805 + ret = lan78xx_read_raw_otp(dev, 0, 1, &sig);
806 +
807 + if (ret == 0) {
808 +- if (sig == OTP_INDICATOR_1)
809 +- offset = offset;
810 +- else if (sig == OTP_INDICATOR_2)
811 ++ if (sig == OTP_INDICATOR_2)
812 + offset += 0x100;
813 +- else
814 ++ else if (sig != OTP_INDICATOR_1)
815 + ret = -EINVAL;
816 + if (!ret)
817 + ret = lan78xx_read_raw_otp(dev, offset, length, data);
818 +diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
819 +index 15c73ebe5efca..044478c9adad6 100644
820 +--- a/drivers/net/xen-netback/netback.c
821 ++++ b/drivers/net/xen-netback/netback.c
822 +@@ -189,11 +189,15 @@ void xenvif_rx_queue_tail(struct xenvif_queue *queue, struct sk_buff *skb)
823 +
824 + spin_lock_irqsave(&queue->rx_queue.lock, flags);
825 +
826 +- __skb_queue_tail(&queue->rx_queue, skb);
827 +-
828 +- queue->rx_queue_len += skb->len;
829 +- if (queue->rx_queue_len > queue->rx_queue_max)
830 ++ if (queue->rx_queue_len >= queue->rx_queue_max) {
831 + netif_tx_stop_queue(netdev_get_tx_queue(queue->vif->dev, queue->id));
832 ++ kfree_skb(skb);
833 ++ queue->vif->dev->stats.rx_dropped++;
834 ++ } else {
835 ++ __skb_queue_tail(&queue->rx_queue, skb);
836 ++
837 ++ queue->rx_queue_len += skb->len;
838 ++ }
839 +
840 + spin_unlock_irqrestore(&queue->rx_queue.lock, flags);
841 + }
842 +@@ -243,6 +247,7 @@ static void xenvif_rx_queue_drop_expired(struct xenvif_queue *queue)
843 + break;
844 + xenvif_rx_dequeue(queue);
845 + kfree_skb(skb);
846 ++ queue->vif->dev->stats.rx_dropped++;
847 + }
848 + }
849 +
850 +diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
851 +index 46b9f379035f5..637d5e894012c 100644
852 +--- a/drivers/net/xen-netfront.c
853 ++++ b/drivers/net/xen-netfront.c
854 +@@ -141,6 +141,9 @@ struct netfront_queue {
855 + struct sk_buff *rx_skbs[NET_RX_RING_SIZE];
856 + grant_ref_t gref_rx_head;
857 + grant_ref_t grant_rx_ref[NET_RX_RING_SIZE];
858 ++
859 ++ unsigned int rx_rsp_unconsumed;
860 ++ spinlock_t rx_cons_lock;
861 + };
862 +
863 + struct netfront_info {
864 +@@ -365,11 +368,12 @@ static int xennet_open(struct net_device *dev)
865 + return 0;
866 + }
867 +
868 +-static void xennet_tx_buf_gc(struct netfront_queue *queue)
869 ++static bool xennet_tx_buf_gc(struct netfront_queue *queue)
870 + {
871 + RING_IDX cons, prod;
872 + unsigned short id;
873 + struct sk_buff *skb;
874 ++ bool work_done = false;
875 + const struct device *dev = &queue->info->netdev->dev;
876 +
877 + BUG_ON(!netif_carrier_ok(queue->info->netdev));
878 +@@ -386,6 +390,8 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue)
879 + for (cons = queue->tx.rsp_cons; cons != prod; cons++) {
880 + struct xen_netif_tx_response txrsp;
881 +
882 ++ work_done = true;
883 ++
884 + RING_COPY_RESPONSE(&queue->tx, cons, &txrsp);
885 + if (txrsp.status == XEN_NETIF_RSP_NULL)
886 + continue;
887 +@@ -439,11 +445,13 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue)
888 +
889 + xennet_maybe_wake_tx(queue);
890 +
891 +- return;
892 ++ return work_done;
893 +
894 + err:
895 + queue->info->broken = true;
896 + dev_alert(dev, "Disabled for further use\n");
897 ++
898 ++ return work_done;
899 + }
900 +
901 + struct xennet_gnttab_make_txreq {
902 +@@ -748,6 +756,16 @@ static int xennet_close(struct net_device *dev)
903 + return 0;
904 + }
905 +
906 ++static void xennet_set_rx_rsp_cons(struct netfront_queue *queue, RING_IDX val)
907 ++{
908 ++ unsigned long flags;
909 ++
910 ++ spin_lock_irqsave(&queue->rx_cons_lock, flags);
911 ++ queue->rx.rsp_cons = val;
912 ++ queue->rx_rsp_unconsumed = RING_HAS_UNCONSUMED_RESPONSES(&queue->rx);
913 ++ spin_unlock_irqrestore(&queue->rx_cons_lock, flags);
914 ++}
915 ++
916 + static void xennet_move_rx_slot(struct netfront_queue *queue, struct sk_buff *skb,
917 + grant_ref_t ref)
918 + {
919 +@@ -799,7 +817,7 @@ static int xennet_get_extras(struct netfront_queue *queue,
920 + xennet_move_rx_slot(queue, skb, ref);
921 + } while (extra.flags & XEN_NETIF_EXTRA_FLAG_MORE);
922 +
923 +- queue->rx.rsp_cons = cons;
924 ++ xennet_set_rx_rsp_cons(queue, cons);
925 + return err;
926 + }
927 +
928 +@@ -879,7 +897,7 @@ next:
929 + }
930 +
931 + if (unlikely(err))
932 +- queue->rx.rsp_cons = cons + slots;
933 ++ xennet_set_rx_rsp_cons(queue, cons + slots);
934 +
935 + return err;
936 + }
937 +@@ -933,7 +951,8 @@ static int xennet_fill_frags(struct netfront_queue *queue,
938 + __pskb_pull_tail(skb, pull_to - skb_headlen(skb));
939 + }
940 + if (unlikely(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS)) {
941 +- queue->rx.rsp_cons = ++cons + skb_queue_len(list);
942 ++ xennet_set_rx_rsp_cons(queue,
943 ++ ++cons + skb_queue_len(list));
944 + kfree_skb(nskb);
945 + return -ENOENT;
946 + }
947 +@@ -946,7 +965,7 @@ static int xennet_fill_frags(struct netfront_queue *queue,
948 + kfree_skb(nskb);
949 + }
950 +
951 +- queue->rx.rsp_cons = cons;
952 ++ xennet_set_rx_rsp_cons(queue, cons);
953 +
954 + return 0;
955 + }
956 +@@ -1067,7 +1086,9 @@ err:
957 +
958 + if (unlikely(xennet_set_skb_gso(skb, gso))) {
959 + __skb_queue_head(&tmpq, skb);
960 +- queue->rx.rsp_cons += skb_queue_len(&tmpq);
961 ++ xennet_set_rx_rsp_cons(queue,
962 ++ queue->rx.rsp_cons +
963 ++ skb_queue_len(&tmpq));
964 + goto err;
965 + }
966 + }
967 +@@ -1091,7 +1112,8 @@ err:
968 +
969 + __skb_queue_tail(&rxq, skb);
970 +
971 +- i = ++queue->rx.rsp_cons;
972 ++ i = queue->rx.rsp_cons + 1;
973 ++ xennet_set_rx_rsp_cons(queue, i);
974 + work_done++;
975 + }
976 +
977 +@@ -1275,40 +1297,79 @@ static int xennet_set_features(struct net_device *dev,
978 + return 0;
979 + }
980 +
981 +-static irqreturn_t xennet_tx_interrupt(int irq, void *dev_id)
982 ++static bool xennet_handle_tx(struct netfront_queue *queue, unsigned int *eoi)
983 + {
984 +- struct netfront_queue *queue = dev_id;
985 + unsigned long flags;
986 +
987 +- if (queue->info->broken)
988 +- return IRQ_HANDLED;
989 ++ if (unlikely(queue->info->broken))
990 ++ return false;
991 +
992 + spin_lock_irqsave(&queue->tx_lock, flags);
993 +- xennet_tx_buf_gc(queue);
994 ++ if (xennet_tx_buf_gc(queue))
995 ++ *eoi = 0;
996 + spin_unlock_irqrestore(&queue->tx_lock, flags);
997 +
998 ++ return true;
999 ++}
1000 ++
1001 ++static irqreturn_t xennet_tx_interrupt(int irq, void *dev_id)
1002 ++{
1003 ++ unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS;
1004 ++
1005 ++ if (likely(xennet_handle_tx(dev_id, &eoiflag)))
1006 ++ xen_irq_lateeoi(irq, eoiflag);
1007 ++
1008 + return IRQ_HANDLED;
1009 + }
1010 +
1011 +-static irqreturn_t xennet_rx_interrupt(int irq, void *dev_id)
1012 ++static bool xennet_handle_rx(struct netfront_queue *queue, unsigned int *eoi)
1013 + {
1014 +- struct netfront_queue *queue = dev_id;
1015 +- struct net_device *dev = queue->info->netdev;
1016 ++ unsigned int work_queued;
1017 ++ unsigned long flags;
1018 +
1019 +- if (queue->info->broken)
1020 +- return IRQ_HANDLED;
1021 ++ if (unlikely(queue->info->broken))
1022 ++ return false;
1023 ++
1024 ++ spin_lock_irqsave(&queue->rx_cons_lock, flags);
1025 ++ work_queued = RING_HAS_UNCONSUMED_RESPONSES(&queue->rx);
1026 ++ if (work_queued > queue->rx_rsp_unconsumed) {
1027 ++ queue->rx_rsp_unconsumed = work_queued;
1028 ++ *eoi = 0;
1029 ++ } else if (unlikely(work_queued < queue->rx_rsp_unconsumed)) {
1030 ++ const struct device *dev = &queue->info->netdev->dev;
1031 ++
1032 ++ spin_unlock_irqrestore(&queue->rx_cons_lock, flags);
1033 ++ dev_alert(dev, "RX producer index going backwards\n");
1034 ++ dev_alert(dev, "Disabled for further use\n");
1035 ++ queue->info->broken = true;
1036 ++ return false;
1037 ++ }
1038 ++ spin_unlock_irqrestore(&queue->rx_cons_lock, flags);
1039 +
1040 +- if (likely(netif_carrier_ok(dev) &&
1041 +- RING_HAS_UNCONSUMED_RESPONSES(&queue->rx)))
1042 ++ if (likely(netif_carrier_ok(queue->info->netdev) && work_queued))
1043 + napi_schedule(&queue->napi);
1044 +
1045 ++ return true;
1046 ++}
1047 ++
1048 ++static irqreturn_t xennet_rx_interrupt(int irq, void *dev_id)
1049 ++{
1050 ++ unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS;
1051 ++
1052 ++ if (likely(xennet_handle_rx(dev_id, &eoiflag)))
1053 ++ xen_irq_lateeoi(irq, eoiflag);
1054 ++
1055 + return IRQ_HANDLED;
1056 + }
1057 +
1058 + static irqreturn_t xennet_interrupt(int irq, void *dev_id)
1059 + {
1060 +- xennet_tx_interrupt(irq, dev_id);
1061 +- xennet_rx_interrupt(irq, dev_id);
1062 ++ unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS;
1063 ++
1064 ++ if (xennet_handle_tx(dev_id, &eoiflag) &&
1065 ++ xennet_handle_rx(dev_id, &eoiflag))
1066 ++ xen_irq_lateeoi(irq, eoiflag);
1067 ++
1068 + return IRQ_HANDLED;
1069 + }
1070 +
1071 +@@ -1540,9 +1601,10 @@ static int setup_netfront_single(struct netfront_queue *queue)
1072 + if (err < 0)
1073 + goto fail;
1074 +
1075 +- err = bind_evtchn_to_irqhandler(queue->tx_evtchn,
1076 +- xennet_interrupt,
1077 +- 0, queue->info->netdev->name, queue);
1078 ++ err = bind_evtchn_to_irqhandler_lateeoi(queue->tx_evtchn,
1079 ++ xennet_interrupt, 0,
1080 ++ queue->info->netdev->name,
1081 ++ queue);
1082 + if (err < 0)
1083 + goto bind_fail;
1084 + queue->rx_evtchn = queue->tx_evtchn;
1085 +@@ -1570,18 +1632,18 @@ static int setup_netfront_split(struct netfront_queue *queue)
1086 +
1087 + snprintf(queue->tx_irq_name, sizeof(queue->tx_irq_name),
1088 + "%s-tx", queue->name);
1089 +- err = bind_evtchn_to_irqhandler(queue->tx_evtchn,
1090 +- xennet_tx_interrupt,
1091 +- 0, queue->tx_irq_name, queue);
1092 ++ err = bind_evtchn_to_irqhandler_lateeoi(queue->tx_evtchn,
1093 ++ xennet_tx_interrupt, 0,
1094 ++ queue->tx_irq_name, queue);
1095 + if (err < 0)
1096 + goto bind_tx_fail;
1097 + queue->tx_irq = err;
1098 +
1099 + snprintf(queue->rx_irq_name, sizeof(queue->rx_irq_name),
1100 + "%s-rx", queue->name);
1101 +- err = bind_evtchn_to_irqhandler(queue->rx_evtchn,
1102 +- xennet_rx_interrupt,
1103 +- 0, queue->rx_irq_name, queue);
1104 ++ err = bind_evtchn_to_irqhandler_lateeoi(queue->rx_evtchn,
1105 ++ xennet_rx_interrupt, 0,
1106 ++ queue->rx_irq_name, queue);
1107 + if (err < 0)
1108 + goto bind_rx_fail;
1109 + queue->rx_irq = err;
1110 +@@ -1683,6 +1745,7 @@ static int xennet_init_queue(struct netfront_queue *queue)
1111 +
1112 + spin_lock_init(&queue->tx_lock);
1113 + spin_lock_init(&queue->rx_lock);
1114 ++ spin_lock_init(&queue->rx_cons_lock);
1115 +
1116 + setup_timer(&queue->rx_refill_timer, rx_refill_timeout,
1117 + (unsigned long)queue);
1118 +diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
1119 +index 534aa676bf551..92e78547b00a5 100644
1120 +--- a/drivers/pci/msi.c
1121 ++++ b/drivers/pci/msi.c
1122 +@@ -840,7 +840,7 @@ out_free:
1123 + free_msi_irqs(dev);
1124 +
1125 + out_disable:
1126 +- pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
1127 ++ pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL | PCI_MSIX_FLAGS_ENABLE, 0);
1128 +
1129 + return ret;
1130 + }
1131 +diff --git a/drivers/soc/tegra/fuse/fuse-tegra.c b/drivers/soc/tegra/fuse/fuse-tegra.c
1132 +index c4f5e5bbb8dce..9397e8ba26469 100644
1133 +--- a/drivers/soc/tegra/fuse/fuse-tegra.c
1134 ++++ b/drivers/soc/tegra/fuse/fuse-tegra.c
1135 +@@ -176,7 +176,7 @@ static struct platform_driver tegra_fuse_driver = {
1136 + };
1137 + module_platform_driver(tegra_fuse_driver);
1138 +
1139 +-bool __init tegra_fuse_read_spare(unsigned int spare)
1140 ++u32 __init tegra_fuse_read_spare(unsigned int spare)
1141 + {
1142 + unsigned int offset = fuse->soc->info->spare + spare * 4;
1143 +
1144 +diff --git a/drivers/soc/tegra/fuse/fuse.h b/drivers/soc/tegra/fuse/fuse.h
1145 +index 10c2076d5089a..f368bd5373088 100644
1146 +--- a/drivers/soc/tegra/fuse/fuse.h
1147 ++++ b/drivers/soc/tegra/fuse/fuse.h
1148 +@@ -62,7 +62,7 @@ struct tegra_fuse {
1149 + void tegra_init_revision(void);
1150 + void tegra_init_apbmisc(void);
1151 +
1152 +-bool __init tegra_fuse_read_spare(unsigned int spare);
1153 ++u32 __init tegra_fuse_read_spare(unsigned int spare);
1154 + u32 __init tegra_fuse_read_early(unsigned int offset);
1155 +
1156 + #ifdef CONFIG_ARCH_TEGRA_2x_SOC
1157 +diff --git a/drivers/tty/hvc/hvc_xen.c b/drivers/tty/hvc/hvc_xen.c
1158 +index e503ad91a25a5..4826a6db87b17 100644
1159 +--- a/drivers/tty/hvc/hvc_xen.c
1160 ++++ b/drivers/tty/hvc/hvc_xen.c
1161 +@@ -49,6 +49,8 @@ struct xencons_info {
1162 + struct xenbus_device *xbdev;
1163 + struct xencons_interface *intf;
1164 + unsigned int evtchn;
1165 ++ XENCONS_RING_IDX out_cons;
1166 ++ unsigned int out_cons_same;
1167 + struct hvc_struct *hvc;
1168 + int irq;
1169 + int vtermno;
1170 +@@ -150,6 +152,8 @@ static int domU_read_console(uint32_t vtermno, char *buf, int len)
1171 + XENCONS_RING_IDX cons, prod;
1172 + int recv = 0;
1173 + struct xencons_info *xencons = vtermno_to_xencons(vtermno);
1174 ++ unsigned int eoiflag = 0;
1175 ++
1176 + if (xencons == NULL)
1177 + return -EINVAL;
1178 + intf = xencons->intf;
1179 +@@ -169,7 +173,27 @@ static int domU_read_console(uint32_t vtermno, char *buf, int len)
1180 + mb(); /* read ring before consuming */
1181 + intf->in_cons = cons;
1182 +
1183 +- notify_daemon(xencons);
1184 ++ /*
1185 ++ * When to mark interrupt having been spurious:
1186 ++ * - there was no new data to be read, and
1187 ++ * - the backend did not consume some output bytes, and
1188 ++ * - the previous round with no read data didn't see consumed bytes
1189 ++ * (we might have a race with an interrupt being in flight while
1190 ++ * updating xencons->out_cons, so account for that by allowing one
1191 ++ * round without any visible reason)
1192 ++ */
1193 ++ if (intf->out_cons != xencons->out_cons) {
1194 ++ xencons->out_cons = intf->out_cons;
1195 ++ xencons->out_cons_same = 0;
1196 ++ }
1197 ++ if (recv) {
1198 ++ notify_daemon(xencons);
1199 ++ } else if (xencons->out_cons_same++ > 1) {
1200 ++ eoiflag = XEN_EOI_FLAG_SPURIOUS;
1201 ++ }
1202 ++
1203 ++ xen_irq_lateeoi(xencons->irq, eoiflag);
1204 ++
1205 + return recv;
1206 + }
1207 +
1208 +@@ -391,7 +415,7 @@ static int xencons_connect_backend(struct xenbus_device *dev,
1209 + if (ret)
1210 + return ret;
1211 + info->evtchn = evtchn;
1212 +- irq = bind_evtchn_to_irq(evtchn);
1213 ++ irq = bind_interdomain_evtchn_to_irq_lateeoi(dev->otherend_id, evtchn);
1214 + if (irq < 0)
1215 + return irq;
1216 + info->irq = irq;
1217 +@@ -555,7 +579,7 @@ static int __init xen_hvc_init(void)
1218 + return r;
1219 +
1220 + info = vtermno_to_xencons(HVC_COOKIE);
1221 +- info->irq = bind_evtchn_to_irq(info->evtchn);
1222 ++ info->irq = bind_evtchn_to_irq_lateeoi(info->evtchn);
1223 + }
1224 + if (info->irq < 0)
1225 + info->irq = 0; /* NO_IRQ */
1226 +diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
1227 +index 1f584d15a3ca4..580ba69f1e4a4 100644
1228 +--- a/drivers/usb/gadget/composite.c
1229 ++++ b/drivers/usb/gadget/composite.c
1230 +@@ -1485,14 +1485,14 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
1231 + u8 endp;
1232 +
1233 + if (w_length > USB_COMP_EP0_BUFSIZ) {
1234 +- if (ctrl->bRequestType == USB_DIR_OUT) {
1235 +- goto done;
1236 +- } else {
1237 ++ if (ctrl->bRequestType & USB_DIR_IN) {
1238 + /* Cast away the const, we are going to overwrite on purpose. */
1239 + __le16 *temp = (__le16 *)&ctrl->wLength;
1240 +
1241 + *temp = cpu_to_le16(USB_COMP_EP0_BUFSIZ);
1242 + w_length = USB_COMP_EP0_BUFSIZ;
1243 ++ } else {
1244 ++ goto done;
1245 + }
1246 + }
1247 +
1248 +diff --git a/drivers/usb/gadget/legacy/dbgp.c b/drivers/usb/gadget/legacy/dbgp.c
1249 +index f1c5a22704b28..e8818ad973e4b 100644
1250 +--- a/drivers/usb/gadget/legacy/dbgp.c
1251 ++++ b/drivers/usb/gadget/legacy/dbgp.c
1252 +@@ -345,14 +345,14 @@ static int dbgp_setup(struct usb_gadget *gadget,
1253 + u16 len = 0;
1254 +
1255 + if (length > DBGP_REQ_LEN) {
1256 +- if (ctrl->bRequestType == USB_DIR_OUT) {
1257 +- return err;
1258 +- } else {
1259 ++ if (ctrl->bRequestType & USB_DIR_IN) {
1260 + /* Cast away the const, we are going to overwrite on purpose. */
1261 + __le16 *temp = (__le16 *)&ctrl->wLength;
1262 +
1263 + *temp = cpu_to_le16(DBGP_REQ_LEN);
1264 + length = DBGP_REQ_LEN;
1265 ++ } else {
1266 ++ return err;
1267 + }
1268 + }
1269 +
1270 +diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c
1271 +index af0b34763326d..f2b4fdd1f49d5 100644
1272 +--- a/drivers/usb/gadget/legacy/inode.c
1273 ++++ b/drivers/usb/gadget/legacy/inode.c
1274 +@@ -1335,14 +1335,14 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
1275 + u16 w_length = le16_to_cpu(ctrl->wLength);
1276 +
1277 + if (w_length > RBUF_SIZE) {
1278 +- if (ctrl->bRequestType == USB_DIR_OUT) {
1279 +- return value;
1280 +- } else {
1281 ++ if (ctrl->bRequestType & USB_DIR_IN) {
1282 + /* Cast away the const, we are going to overwrite on purpose. */
1283 + __le16 *temp = (__le16 *)&ctrl->wLength;
1284 +
1285 + *temp = cpu_to_le16(RBUF_SIZE);
1286 + w_length = RBUF_SIZE;
1287 ++ } else {
1288 ++ return value;
1289 + }
1290 + }
1291 +
1292 +diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
1293 +index 502931f658a8e..9479abb9eaaaf 100644
1294 +--- a/drivers/usb/serial/option.c
1295 ++++ b/drivers/usb/serial/option.c
1296 +@@ -1195,6 +1195,14 @@ static const struct usb_device_id option_ids[] = {
1297 + .driver_info = NCTRL(2) | RSVD(3) },
1298 + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1063, 0xff), /* Telit LN920 (ECM) */
1299 + .driver_info = NCTRL(0) | RSVD(1) },
1300 ++ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1070, 0xff), /* Telit FN990 (rmnet) */
1301 ++ .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
1302 ++ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1071, 0xff), /* Telit FN990 (MBIM) */
1303 ++ .driver_info = NCTRL(0) | RSVD(1) },
1304 ++ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1072, 0xff), /* Telit FN990 (RNDIS) */
1305 ++ .driver_info = NCTRL(2) | RSVD(3) },
1306 ++ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1073, 0xff), /* Telit FN990 (ECM) */
1307 ++ .driver_info = NCTRL(0) | RSVD(1) },
1308 + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
1309 + .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
1310 + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
1311 +diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
1312 +index ea5cb1ba282fd..5ee62045150c0 100644
1313 +--- a/fs/nfsd/nfs4state.c
1314 ++++ b/fs/nfsd/nfs4state.c
1315 +@@ -844,6 +844,11 @@ hash_delegation_locked(struct nfs4_delegation *dp, struct nfs4_file *fp)
1316 + return 0;
1317 + }
1318 +
1319 ++static bool delegation_hashed(struct nfs4_delegation *dp)
1320 ++{
1321 ++ return !(list_empty(&dp->dl_perfile));
1322 ++}
1323 ++
1324 + static bool
1325 + unhash_delegation_locked(struct nfs4_delegation *dp)
1326 + {
1327 +@@ -851,7 +856,7 @@ unhash_delegation_locked(struct nfs4_delegation *dp)
1328 +
1329 + lockdep_assert_held(&state_lock);
1330 +
1331 +- if (list_empty(&dp->dl_perfile))
1332 ++ if (!delegation_hashed(dp))
1333 + return false;
1334 +
1335 + dp->dl_stid.sc_type = NFS4_CLOSED_DELEG_STID;
1336 +@@ -3656,7 +3661,7 @@ static void nfsd4_cb_recall_prepare(struct nfsd4_callback *cb)
1337 + * queued for a lease break. Don't queue it again.
1338 + */
1339 + spin_lock(&state_lock);
1340 +- if (dp->dl_time == 0) {
1341 ++ if (delegation_hashed(dp) && dp->dl_time == 0) {
1342 + dp->dl_time = get_seconds();
1343 + list_add_tail(&dp->dl_recall_lru, &nn->del_recall_lru);
1344 + }
1345 +diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
1346 +index d9837d25dfe06..19fbd6c6283ba 100644
1347 +--- a/kernel/time/timekeeping.c
1348 ++++ b/kernel/time/timekeeping.c
1349 +@@ -966,8 +966,7 @@ int do_settimeofday64(const struct timespec64 *ts)
1350 + timekeeping_forward_now(tk);
1351 +
1352 + xt = tk_xtime(tk);
1353 +- ts_delta.tv_sec = ts->tv_sec - xt.tv_sec;
1354 +- ts_delta.tv_nsec = ts->tv_nsec - xt.tv_nsec;
1355 ++ ts_delta = timespec64_sub(*ts, xt);
1356 +
1357 + if (timespec64_compare(&tk->wall_to_monotonic, &ts_delta) > 0) {
1358 + ret = -EINVAL;
1359 +diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
1360 +index 4932e9f243a2c..3d49ffe8a34d5 100644
1361 +--- a/net/mac80211/agg-tx.c
1362 ++++ b/net/mac80211/agg-tx.c
1363 +@@ -109,7 +109,7 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
1364 + mgmt->u.action.u.addba_req.start_seq_num =
1365 + cpu_to_le16(start_seq_num << 4);
1366 +
1367 +- ieee80211_tx_skb(sdata, skb);
1368 ++ ieee80211_tx_skb_tid(sdata, skb, tid);
1369 + }
1370 +
1371 + void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn)
1372 +diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
1373 +index 65cf129eaad33..2f23b7fef8ef7 100644
1374 +--- a/net/netlink/af_netlink.c
1375 ++++ b/net/netlink/af_netlink.c
1376 +@@ -1804,6 +1804,11 @@ static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
1377 + if (msg->msg_flags&MSG_OOB)
1378 + return -EOPNOTSUPP;
1379 +
1380 ++ if (len == 0) {
1381 ++ pr_warn_once("Zero length message leads to an empty skb\n");
1382 ++ return -ENODATA;
1383 ++ }
1384 ++
1385 + err = scm_send(sock, msg, &scm, true);
1386 + if (err < 0)
1387 + return err;
1388 +diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c
1389 +index 00a0f0476a543..4286b900a3066 100644
1390 +--- a/net/nfc/netlink.c
1391 ++++ b/net/nfc/netlink.c
1392 +@@ -632,8 +632,10 @@ static int nfc_genl_dump_devices_done(struct netlink_callback *cb)
1393 + {
1394 + struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0];
1395 +
1396 +- nfc_device_iter_exit(iter);
1397 +- kfree(iter);
1398 ++ if (iter) {
1399 ++ nfc_device_iter_exit(iter);
1400 ++ kfree(iter);
1401 ++ }
1402 +
1403 + return 0;
1404 + }
1405 +diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
1406 +index 5ca4ec2970197..b690b294fc36b 100755
1407 +--- a/scripts/recordmcount.pl
1408 ++++ b/scripts/recordmcount.pl
1409 +@@ -248,7 +248,7 @@ if ($arch eq "x86_64") {
1410 +
1411 + } elsif ($arch eq "s390" && $bits == 64) {
1412 + if ($cc =~ /-DCC_USING_HOTPATCH/) {
1413 +- $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*c0 04 00 00 00 00\\s*brcl\\s*0,[0-9a-f]+ <([^\+]*)>\$";
1414 ++ $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*c0 04 00 00 00 00\\s*(bcrl\\s*0,|jgnop\\s*)[0-9a-f]+ <([^\+]*)>\$";
1415 + $mcount_adjust = 0;
1416 + } else {
1417 + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_390_(PC|PLT)32DBL\\s+_mcount\\+0x2\$";