Gentoo Archives: gentoo-commits

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