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\$"; |