Magellan Linux

Contents of /trunk/kernel-magellan/patches-4.13/0103-4.13.4-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2996 - (show annotations) (download)
Mon Oct 9 08:50:13 2017 UTC (6 years, 6 months ago) by niro
File size: 166001 byte(s)
-linux-4.13.4
1 diff --git a/Documentation/dev-tools/gdb-kernel-debugging.rst b/Documentation/dev-tools/gdb-kernel-debugging.rst
2 index 5e93c9bc6619..19df79286f00 100644
3 --- a/Documentation/dev-tools/gdb-kernel-debugging.rst
4 +++ b/Documentation/dev-tools/gdb-kernel-debugging.rst
5 @@ -31,11 +31,13 @@ Setup
6 CONFIG_DEBUG_INFO_REDUCED off. If your architecture supports
7 CONFIG_FRAME_POINTER, keep it enabled.
8
9 -- Install that kernel on the guest.
10 +- Install that kernel on the guest, turn off KASLR if necessary by adding
11 + "nokaslr" to the kernel command line.
12 Alternatively, QEMU allows to boot the kernel directly using -kernel,
13 -append, -initrd command line switches. This is generally only useful if
14 you do not depend on modules. See QEMU documentation for more details on
15 - this mode.
16 + this mode. In this case, you should build the kernel with
17 + CONFIG_RANDOMIZE_BASE disabled if the architecture supports KASLR.
18
19 - Enable the gdb stub of QEMU/KVM, either
20
21 diff --git a/Makefile b/Makefile
22 index 0f31ef4aea7b..159901979dec 100644
23 --- a/Makefile
24 +++ b/Makefile
25 @@ -1,6 +1,6 @@
26 VERSION = 4
27 PATCHLEVEL = 13
28 -SUBLEVEL = 3
29 +SUBLEVEL = 4
30 EXTRAVERSION =
31 NAME = Fearless Coyote
32
33 diff --git a/arch/arc/kernel/entry.S b/arch/arc/kernel/entry.S
34 index 1eea99beecc3..85d9ea4a0acc 100644
35 --- a/arch/arc/kernel/entry.S
36 +++ b/arch/arc/kernel/entry.S
37 @@ -92,6 +92,12 @@ ENTRY(EV_MachineCheck)
38 lr r0, [efa]
39 mov r1, sp
40
41 + ; hardware auto-disables MMU, re-enable it to allow kernel vaddr
42 + ; access for say stack unwinding of modules for crash dumps
43 + lr r3, [ARC_REG_PID]
44 + or r3, r3, MMU_ENABLE
45 + sr r3, [ARC_REG_PID]
46 +
47 lsr r3, r2, 8
48 bmsk r3, r3, 7
49 brne r3, ECR_C_MCHK_DUP_TLB, 1f
50 diff --git a/arch/arc/mm/tlb.c b/arch/arc/mm/tlb.c
51 index b181f3ee38aa..ac81502055f8 100644
52 --- a/arch/arc/mm/tlb.c
53 +++ b/arch/arc/mm/tlb.c
54 @@ -908,9 +908,6 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address,
55
56 local_irq_save(flags);
57
58 - /* re-enable the MMU */
59 - write_aux_reg(ARC_REG_PID, MMU_ENABLE | read_aux_reg(ARC_REG_PID));
60 -
61 /* loop thru all sets of TLB */
62 for (set = 0; set < mmu->sets; set++) {
63
64 diff --git a/arch/mips/math-emu/dp_fmax.c b/arch/mips/math-emu/dp_fmax.c
65 index fd71b8daaaf2..5bec64f2884e 100644
66 --- a/arch/mips/math-emu/dp_fmax.c
67 +++ b/arch/mips/math-emu/dp_fmax.c
68 @@ -47,14 +47,26 @@ union ieee754dp ieee754dp_fmax(union ieee754dp x, union ieee754dp y)
69 case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
70 return ieee754dp_nanxcpt(x);
71
72 - /* numbers are preferred to NaNs */
73 + /*
74 + * Quiet NaN handling
75 + */
76 +
77 + /*
78 + * The case of both inputs quiet NaNs
79 + */
80 + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
81 + return x;
82 +
83 + /*
84 + * The cases of exactly one input quiet NaN (numbers
85 + * are here preferred as returned values to NaNs)
86 + */
87 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
88 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
89 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
90 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
91 return x;
92
93 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
94 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
95 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
96 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
97 @@ -80,9 +92,7 @@ union ieee754dp ieee754dp_fmax(union ieee754dp x, union ieee754dp y)
98 return ys ? x : y;
99
100 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
101 - if (xs == ys)
102 - return x;
103 - return ieee754dp_zero(1);
104 + return ieee754dp_zero(xs & ys);
105
106 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
107 DPDNORMX;
108 @@ -106,16 +116,32 @@ union ieee754dp ieee754dp_fmax(union ieee754dp x, union ieee754dp y)
109 else if (xs < ys)
110 return x;
111
112 - /* Compare exponent */
113 - if (xe > ye)
114 - return x;
115 - else if (xe < ye)
116 - return y;
117 + /* Signs of inputs are equal, let's compare exponents */
118 + if (xs == 0) {
119 + /* Inputs are both positive */
120 + if (xe > ye)
121 + return x;
122 + else if (xe < ye)
123 + return y;
124 + } else {
125 + /* Inputs are both negative */
126 + if (xe > ye)
127 + return y;
128 + else if (xe < ye)
129 + return x;
130 + }
131
132 - /* Compare mantissa */
133 + /* Signs and exponents of inputs are equal, let's compare mantissas */
134 + if (xs == 0) {
135 + /* Inputs are both positive, with equal signs and exponents */
136 + if (xm <= ym)
137 + return y;
138 + return x;
139 + }
140 + /* Inputs are both negative, with equal signs and exponents */
141 if (xm <= ym)
142 - return y;
143 - return x;
144 + return x;
145 + return y;
146 }
147
148 union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
149 @@ -147,14 +173,26 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
150 case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
151 return ieee754dp_nanxcpt(x);
152
153 - /* numbers are preferred to NaNs */
154 + /*
155 + * Quiet NaN handling
156 + */
157 +
158 + /*
159 + * The case of both inputs quiet NaNs
160 + */
161 + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
162 + return x;
163 +
164 + /*
165 + * The cases of exactly one input quiet NaN (numbers
166 + * are here preferred as returned values to NaNs)
167 + */
168 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
169 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
170 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
171 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
172 return x;
173
174 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
175 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
176 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
177 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
178 @@ -164,6 +202,9 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
179 /*
180 * Infinity and zero handling
181 */
182 + case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
183 + return ieee754dp_inf(xs & ys);
184 +
185 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
186 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
187 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
188 @@ -171,7 +212,6 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
189 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
190 return x;
191
192 - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
193 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
194 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
195 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
196 @@ -180,9 +220,7 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
197 return y;
198
199 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
200 - if (xs == ys)
201 - return x;
202 - return ieee754dp_zero(1);
203 + return ieee754dp_zero(xs & ys);
204
205 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
206 DPDNORMX;
207 @@ -207,7 +245,11 @@ union ieee754dp ieee754dp_fmaxa(union ieee754dp x, union ieee754dp y)
208 return y;
209
210 /* Compare mantissa */
211 - if (xm <= ym)
212 + if (xm < ym)
213 return y;
214 - return x;
215 + else if (xm > ym)
216 + return x;
217 + else if (xs == 0)
218 + return x;
219 + return y;
220 }
221 diff --git a/arch/mips/math-emu/dp_fmin.c b/arch/mips/math-emu/dp_fmin.c
222 index c1072b0dfb95..a287b23818d8 100644
223 --- a/arch/mips/math-emu/dp_fmin.c
224 +++ b/arch/mips/math-emu/dp_fmin.c
225 @@ -47,14 +47,26 @@ union ieee754dp ieee754dp_fmin(union ieee754dp x, union ieee754dp y)
226 case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
227 return ieee754dp_nanxcpt(x);
228
229 - /* numbers are preferred to NaNs */
230 + /*
231 + * Quiet NaN handling
232 + */
233 +
234 + /*
235 + * The case of both inputs quiet NaNs
236 + */
237 + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
238 + return x;
239 +
240 + /*
241 + * The cases of exactly one input quiet NaN (numbers
242 + * are here preferred as returned values to NaNs)
243 + */
244 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
245 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
246 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
247 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
248 return x;
249
250 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
251 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
252 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
253 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
254 @@ -80,9 +92,7 @@ union ieee754dp ieee754dp_fmin(union ieee754dp x, union ieee754dp y)
255 return ys ? y : x;
256
257 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
258 - if (xs == ys)
259 - return x;
260 - return ieee754dp_zero(1);
261 + return ieee754dp_zero(xs | ys);
262
263 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
264 DPDNORMX;
265 @@ -106,16 +116,32 @@ union ieee754dp ieee754dp_fmin(union ieee754dp x, union ieee754dp y)
266 else if (xs < ys)
267 return y;
268
269 - /* Compare exponent */
270 - if (xe > ye)
271 - return y;
272 - else if (xe < ye)
273 - return x;
274 + /* Signs of inputs are the same, let's compare exponents */
275 + if (xs == 0) {
276 + /* Inputs are both positive */
277 + if (xe > ye)
278 + return y;
279 + else if (xe < ye)
280 + return x;
281 + } else {
282 + /* Inputs are both negative */
283 + if (xe > ye)
284 + return x;
285 + else if (xe < ye)
286 + return y;
287 + }
288
289 - /* Compare mantissa */
290 + /* Signs and exponents of inputs are equal, let's compare mantissas */
291 + if (xs == 0) {
292 + /* Inputs are both positive, with equal signs and exponents */
293 + if (xm <= ym)
294 + return x;
295 + return y;
296 + }
297 + /* Inputs are both negative, with equal signs and exponents */
298 if (xm <= ym)
299 - return x;
300 - return y;
301 + return y;
302 + return x;
303 }
304
305 union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
306 @@ -147,14 +173,26 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
307 case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
308 return ieee754dp_nanxcpt(x);
309
310 - /* numbers are preferred to NaNs */
311 + /*
312 + * Quiet NaN handling
313 + */
314 +
315 + /*
316 + * The case of both inputs quiet NaNs
317 + */
318 + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
319 + return x;
320 +
321 + /*
322 + * The cases of exactly one input quiet NaN (numbers
323 + * are here preferred as returned values to NaNs)
324 + */
325 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
326 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
327 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
328 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
329 return x;
330
331 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
332 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
333 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
334 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
335 @@ -164,25 +202,25 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
336 /*
337 * Infinity and zero handling
338 */
339 + case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
340 + return ieee754dp_inf(xs | ys);
341 +
342 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
343 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
344 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
345 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
346 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
347 - return x;
348 + return y;
349
350 - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
351 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
352 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
353 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
354 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
355 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_DNORM):
356 - return y;
357 + return x;
358
359 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
360 - if (xs == ys)
361 - return x;
362 - return ieee754dp_zero(1);
363 + return ieee754dp_zero(xs | ys);
364
365 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
366 DPDNORMX;
367 @@ -207,7 +245,11 @@ union ieee754dp ieee754dp_fmina(union ieee754dp x, union ieee754dp y)
368 return x;
369
370 /* Compare mantissa */
371 - if (xm <= ym)
372 + if (xm < ym)
373 + return x;
374 + else if (xm > ym)
375 + return y;
376 + else if (xs == 1)
377 return x;
378 return y;
379 }
380 diff --git a/arch/mips/math-emu/dp_maddf.c b/arch/mips/math-emu/dp_maddf.c
381 index caa62f20a888..e0d9be5fbf4c 100644
382 --- a/arch/mips/math-emu/dp_maddf.c
383 +++ b/arch/mips/math-emu/dp_maddf.c
384 @@ -14,22 +14,45 @@
385
386 #include "ieee754dp.h"
387
388 -enum maddf_flags {
389 - maddf_negate_product = 1 << 0,
390 -};
391 +
392 +/* 128 bits shift right logical with rounding. */
393 +void srl128(u64 *hptr, u64 *lptr, int count)
394 +{
395 + u64 low;
396 +
397 + if (count >= 128) {
398 + *lptr = *hptr != 0 || *lptr != 0;
399 + *hptr = 0;
400 + } else if (count >= 64) {
401 + if (count == 64) {
402 + *lptr = *hptr | (*lptr != 0);
403 + } else {
404 + low = *lptr;
405 + *lptr = *hptr >> (count - 64);
406 + *lptr |= (*hptr << (128 - count)) != 0 || low != 0;
407 + }
408 + *hptr = 0;
409 + } else {
410 + low = *lptr;
411 + *lptr = low >> count | *hptr << (64 - count);
412 + *lptr |= (low << (64 - count)) != 0;
413 + *hptr = *hptr >> count;
414 + }
415 +}
416
417 static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
418 union ieee754dp y, enum maddf_flags flags)
419 {
420 int re;
421 int rs;
422 - u64 rm;
423 unsigned lxm;
424 unsigned hxm;
425 unsigned lym;
426 unsigned hym;
427 u64 lrm;
428 u64 hrm;
429 + u64 lzm;
430 + u64 hzm;
431 u64 t;
432 u64 at;
433 int s;
434 @@ -48,52 +71,34 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
435
436 ieee754_clearcx();
437
438 - switch (zc) {
439 - case IEEE754_CLASS_SNAN:
440 - ieee754_setcx(IEEE754_INVALID_OPERATION);
441 + /*
442 + * Handle the cases when at least one of x, y or z is a NaN.
443 + * Order of precedence is sNaN, qNaN and z, x, y.
444 + */
445 + if (zc == IEEE754_CLASS_SNAN)
446 return ieee754dp_nanxcpt(z);
447 - case IEEE754_CLASS_DNORM:
448 - DPDNORMZ;
449 - /* QNAN and ZERO cases are handled separately below */
450 - }
451 -
452 - switch (CLPAIR(xc, yc)) {
453 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_SNAN):
454 - case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_SNAN):
455 - case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_SNAN):
456 - case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_SNAN):
457 - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_SNAN):
458 - return ieee754dp_nanxcpt(y);
459 -
460 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_SNAN):
461 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_QNAN):
462 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_ZERO):
463 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM):
464 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM):
465 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
466 + if (xc == IEEE754_CLASS_SNAN)
467 return ieee754dp_nanxcpt(x);
468 -
469 - case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
470 - case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
471 - case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
472 - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
473 + if (yc == IEEE754_CLASS_SNAN)
474 + return ieee754dp_nanxcpt(y);
475 + if (zc == IEEE754_CLASS_QNAN)
476 + return z;
477 + if (xc == IEEE754_CLASS_QNAN)
478 + return x;
479 + if (yc == IEEE754_CLASS_QNAN)
480 return y;
481
482 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
483 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
484 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
485 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
486 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_INF):
487 - return x;
488 + if (zc == IEEE754_CLASS_DNORM)
489 + DPDNORMZ;
490 + /* ZERO z cases are handled separately below */
491
492 + switch (CLPAIR(xc, yc)) {
493
494 /*
495 * Infinity handling
496 */
497 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
498 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
499 - if (zc == IEEE754_CLASS_QNAN)
500 - return z;
501 ieee754_setcx(IEEE754_INVALID_OPERATION);
502 return ieee754dp_indef();
503
504 @@ -102,9 +107,27 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
505 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
506 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
507 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
508 - if (zc == IEEE754_CLASS_QNAN)
509 - return z;
510 - return ieee754dp_inf(xs ^ ys);
511 + if ((zc == IEEE754_CLASS_INF) &&
512 + ((!(flags & MADDF_NEGATE_PRODUCT) && (zs != (xs ^ ys))) ||
513 + ((flags & MADDF_NEGATE_PRODUCT) && (zs == (xs ^ ys))))) {
514 + /*
515 + * Cases of addition of infinities with opposite signs
516 + * or subtraction of infinities with same signs.
517 + */
518 + ieee754_setcx(IEEE754_INVALID_OPERATION);
519 + return ieee754dp_indef();
520 + }
521 + /*
522 + * z is here either not an infinity, or an infinity having the
523 + * same sign as product (x*y) (in case of MADDF.D instruction)
524 + * or product -(x*y) (in MSUBF.D case). The result must be an
525 + * infinity, and its sign is determined only by the value of
526 + * (flags & MADDF_NEGATE_PRODUCT) and the signs of x and y.
527 + */
528 + if (flags & MADDF_NEGATE_PRODUCT)
529 + return ieee754dp_inf(1 ^ (xs ^ ys));
530 + else
531 + return ieee754dp_inf(xs ^ ys);
532
533 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
534 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
535 @@ -113,32 +136,42 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
536 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
537 if (zc == IEEE754_CLASS_INF)
538 return ieee754dp_inf(zs);
539 - /* Multiplication is 0 so just return z */
540 + if (zc == IEEE754_CLASS_ZERO) {
541 + /* Handle cases +0 + (-0) and similar ones. */
542 + if ((!(flags & MADDF_NEGATE_PRODUCT)
543 + && (zs == (xs ^ ys))) ||
544 + ((flags & MADDF_NEGATE_PRODUCT)
545 + && (zs != (xs ^ ys))))
546 + /*
547 + * Cases of addition of zeros of equal signs
548 + * or subtraction of zeroes of opposite signs.
549 + * The sign of the resulting zero is in any
550 + * such case determined only by the sign of z.
551 + */
552 + return z;
553 +
554 + return ieee754dp_zero(ieee754_csr.rm == FPU_CSR_RD);
555 + }
556 + /* x*y is here 0, and z is not 0, so just return z */
557 return z;
558
559 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
560 DPDNORMX;
561
562 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_DNORM):
563 - if (zc == IEEE754_CLASS_QNAN)
564 - return z;
565 - else if (zc == IEEE754_CLASS_INF)
566 + if (zc == IEEE754_CLASS_INF)
567 return ieee754dp_inf(zs);
568 DPDNORMY;
569 break;
570
571 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_NORM):
572 - if (zc == IEEE754_CLASS_QNAN)
573 - return z;
574 - else if (zc == IEEE754_CLASS_INF)
575 + if (zc == IEEE754_CLASS_INF)
576 return ieee754dp_inf(zs);
577 DPDNORMX;
578 break;
579
580 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_NORM):
581 - if (zc == IEEE754_CLASS_QNAN)
582 - return z;
583 - else if (zc == IEEE754_CLASS_INF)
584 + if (zc == IEEE754_CLASS_INF)
585 return ieee754dp_inf(zs);
586 /* fall through to real computations */
587 }
588 @@ -157,7 +190,7 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
589
590 re = xe + ye;
591 rs = xs ^ ys;
592 - if (flags & maddf_negate_product)
593 + if (flags & MADDF_NEGATE_PRODUCT)
594 rs ^= 1;
595
596 /* shunt to top of word */
597 @@ -165,7 +198,7 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
598 ym <<= 64 - (DP_FBITS + 1);
599
600 /*
601 - * Multiply 64 bits xm, ym to give high 64 bits rm with stickness.
602 + * Multiply 64 bits xm and ym to give 128 bits result in hrm:lrm.
603 */
604
605 /* 32 * 32 => 64 */
606 @@ -195,81 +228,110 @@ static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
607
608 hrm = hrm + (t >> 32);
609
610 - rm = hrm | (lrm != 0);
611 -
612 - /*
613 - * Sticky shift down to normal rounding precision.
614 - */
615 - if ((s64) rm < 0) {
616 - rm = (rm >> (64 - (DP_FBITS + 1 + 3))) |
617 - ((rm << (DP_FBITS + 1 + 3)) != 0);
618 + /* Put explicit bit at bit 126 if necessary */
619 + if ((int64_t)hrm < 0) {
620 + lrm = (hrm << 63) | (lrm >> 1);
621 + hrm = hrm >> 1;
622 re++;
623 - } else {
624 - rm = (rm >> (64 - (DP_FBITS + 1 + 3 + 1))) |
625 - ((rm << (DP_FBITS + 1 + 3 + 1)) != 0);
626 }
627 - assert(rm & (DP_HIDDEN_BIT << 3));
628
629 - if (zc == IEEE754_CLASS_ZERO)
630 - return ieee754dp_format(rs, re, rm);
631 + assert(hrm & (1 << 62));
632
633 - /* And now the addition */
634 - assert(zm & DP_HIDDEN_BIT);
635 + if (zc == IEEE754_CLASS_ZERO) {
636 + /*
637 + * Move explicit bit from bit 126 to bit 55 since the
638 + * ieee754dp_format code expects the mantissa to be
639 + * 56 bits wide (53 + 3 rounding bits).
640 + */
641 + srl128(&hrm, &lrm, (126 - 55));
642 + return ieee754dp_format(rs, re, lrm);
643 + }
644
645 - /*
646 - * Provide guard,round and stick bit space.
647 - */
648 - zm <<= 3;
649 + /* Move explicit bit from bit 52 to bit 126 */
650 + lzm = 0;
651 + hzm = zm << 10;
652 + assert(hzm & (1 << 62));
653
654 + /* Make the exponents the same */
655 if (ze > re) {
656 /*
657 * Have to shift y fraction right to align.
658 */
659 s = ze - re;
660 - rm = XDPSRS(rm, s);
661 + srl128(&hrm, &lrm, s);
662 re += s;
663 } else if (re > ze) {
664 /*
665 * Have to shift x fraction right to align.
666 */
667 s = re - ze;
668 - zm = XDPSRS(zm, s);
669 + srl128(&hzm, &lzm, s);
670 ze += s;
671 }
672 assert(ze == re);
673 assert(ze <= DP_EMAX);
674
675 + /* Do the addition */
676 if (zs == rs) {
677 /*
678 - * Generate 28 bit result of adding two 27 bit numbers
679 - * leaving result in xm, xs and xe.
680 + * Generate 128 bit result by adding two 127 bit numbers
681 + * leaving result in hzm:lzm, zs and ze.
682 */
683 - zm = zm + rm;
684 -
685 - if (zm >> (DP_FBITS + 1 + 3)) { /* carry out */
686 - zm = XDPSRS1(zm);
687 + hzm = hzm + hrm + (lzm > (lzm + lrm));
688 + lzm = lzm + lrm;
689 + if ((int64_t)hzm < 0) { /* carry out */
690 + srl128(&hzm, &lzm, 1);
691 ze++;
692 }
693 } else {
694 - if (zm >= rm) {
695 - zm = zm - rm;
696 + if (hzm > hrm || (hzm == hrm && lzm >= lrm)) {
697 + hzm = hzm - hrm - (lzm < lrm);
698 + lzm = lzm - lrm;
699 } else {
700 - zm = rm - zm;
701 + hzm = hrm - hzm - (lrm < lzm);
702 + lzm = lrm - lzm;
703 zs = rs;
704 }
705 - if (zm == 0)
706 + if (lzm == 0 && hzm == 0)
707 return ieee754dp_zero(ieee754_csr.rm == FPU_CSR_RD);
708
709 /*
710 - * Normalize to rounding precision.
711 + * Put explicit bit at bit 126 if necessary.
712 */
713 - while ((zm >> (DP_FBITS + 3)) == 0) {
714 - zm <<= 1;
715 - ze--;
716 + if (hzm == 0) {
717 + /* left shift by 63 or 64 bits */
718 + if ((int64_t)lzm < 0) {
719 + /* MSB of lzm is the explicit bit */
720 + hzm = lzm >> 1;
721 + lzm = lzm << 63;
722 + ze -= 63;
723 + } else {
724 + hzm = lzm;
725 + lzm = 0;
726 + ze -= 64;
727 + }
728 + }
729 +
730 + t = 0;
731 + while ((hzm >> (62 - t)) == 0)
732 + t++;
733 +
734 + assert(t <= 62);
735 + if (t) {
736 + hzm = hzm << t | lzm >> (64 - t);
737 + lzm = lzm << t;
738 + ze -= t;
739 }
740 }
741
742 - return ieee754dp_format(zs, ze, zm);
743 + /*
744 + * Move explicit bit from bit 126 to bit 55 since the
745 + * ieee754dp_format code expects the mantissa to be
746 + * 56 bits wide (53 + 3 rounding bits).
747 + */
748 + srl128(&hzm, &lzm, (126 - 55));
749 +
750 + return ieee754dp_format(zs, ze, lzm);
751 }
752
753 union ieee754dp ieee754dp_maddf(union ieee754dp z, union ieee754dp x,
754 @@ -281,5 +343,5 @@ union ieee754dp ieee754dp_maddf(union ieee754dp z, union ieee754dp x,
755 union ieee754dp ieee754dp_msubf(union ieee754dp z, union ieee754dp x,
756 union ieee754dp y)
757 {
758 - return _dp_maddf(z, x, y, maddf_negate_product);
759 + return _dp_maddf(z, x, y, MADDF_NEGATE_PRODUCT);
760 }
761 diff --git a/arch/mips/math-emu/ieee754int.h b/arch/mips/math-emu/ieee754int.h
762 index 8bc2f6963324..dd2071f430e0 100644
763 --- a/arch/mips/math-emu/ieee754int.h
764 +++ b/arch/mips/math-emu/ieee754int.h
765 @@ -26,6 +26,10 @@
766
767 #define CLPAIR(x, y) ((x)*6+(y))
768
769 +enum maddf_flags {
770 + MADDF_NEGATE_PRODUCT = 1 << 0,
771 +};
772 +
773 static inline void ieee754_clearcx(void)
774 {
775 ieee754_csr.cx = 0;
776 diff --git a/arch/mips/math-emu/ieee754sp.h b/arch/mips/math-emu/ieee754sp.h
777 index 8476067075fe..0f63e4202cff 100644
778 --- a/arch/mips/math-emu/ieee754sp.h
779 +++ b/arch/mips/math-emu/ieee754sp.h
780 @@ -45,6 +45,10 @@ static inline int ieee754sp_finite(union ieee754sp x)
781 return SPBEXP(x) != SP_EMAX + 1 + SP_EBIAS;
782 }
783
784 +/* 64 bit right shift with rounding */
785 +#define XSPSRS64(v, rs) \
786 + (((rs) >= 64) ? ((v) != 0) : ((v) >> (rs)) | ((v) << (64-(rs)) != 0))
787 +
788 /* 3bit extended single precision sticky right shift */
789 #define XSPSRS(v, rs) \
790 ((rs > (SP_FBITS+3))?1:((v) >> (rs)) | ((v) << (32-(rs)) != 0))
791 diff --git a/arch/mips/math-emu/sp_fmax.c b/arch/mips/math-emu/sp_fmax.c
792 index 4d000844e48e..74a5a00d2f22 100644
793 --- a/arch/mips/math-emu/sp_fmax.c
794 +++ b/arch/mips/math-emu/sp_fmax.c
795 @@ -47,14 +47,26 @@ union ieee754sp ieee754sp_fmax(union ieee754sp x, union ieee754sp y)
796 case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
797 return ieee754sp_nanxcpt(x);
798
799 - /* numbers are preferred to NaNs */
800 + /*
801 + * Quiet NaN handling
802 + */
803 +
804 + /*
805 + * The case of both inputs quiet NaNs
806 + */
807 + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
808 + return x;
809 +
810 + /*
811 + * The cases of exactly one input quiet NaN (numbers
812 + * are here preferred as returned values to NaNs)
813 + */
814 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
815 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
816 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
817 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
818 return x;
819
820 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
821 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
822 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
823 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
824 @@ -80,9 +92,7 @@ union ieee754sp ieee754sp_fmax(union ieee754sp x, union ieee754sp y)
825 return ys ? x : y;
826
827 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
828 - if (xs == ys)
829 - return x;
830 - return ieee754sp_zero(1);
831 + return ieee754sp_zero(xs & ys);
832
833 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
834 SPDNORMX;
835 @@ -106,16 +116,32 @@ union ieee754sp ieee754sp_fmax(union ieee754sp x, union ieee754sp y)
836 else if (xs < ys)
837 return x;
838
839 - /* Compare exponent */
840 - if (xe > ye)
841 - return x;
842 - else if (xe < ye)
843 - return y;
844 + /* Signs of inputs are equal, let's compare exponents */
845 + if (xs == 0) {
846 + /* Inputs are both positive */
847 + if (xe > ye)
848 + return x;
849 + else if (xe < ye)
850 + return y;
851 + } else {
852 + /* Inputs are both negative */
853 + if (xe > ye)
854 + return y;
855 + else if (xe < ye)
856 + return x;
857 + }
858
859 - /* Compare mantissa */
860 + /* Signs and exponents of inputs are equal, let's compare mantissas */
861 + if (xs == 0) {
862 + /* Inputs are both positive, with equal signs and exponents */
863 + if (xm <= ym)
864 + return y;
865 + return x;
866 + }
867 + /* Inputs are both negative, with equal signs and exponents */
868 if (xm <= ym)
869 - return y;
870 - return x;
871 + return x;
872 + return y;
873 }
874
875 union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
876 @@ -147,14 +173,26 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
877 case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
878 return ieee754sp_nanxcpt(x);
879
880 - /* numbers are preferred to NaNs */
881 + /*
882 + * Quiet NaN handling
883 + */
884 +
885 + /*
886 + * The case of both inputs quiet NaNs
887 + */
888 + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
889 + return x;
890 +
891 + /*
892 + * The cases of exactly one input quiet NaN (numbers
893 + * are here preferred as returned values to NaNs)
894 + */
895 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
896 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
897 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
898 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
899 return x;
900
901 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
902 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
903 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
904 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
905 @@ -164,6 +202,9 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
906 /*
907 * Infinity and zero handling
908 */
909 + case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
910 + return ieee754sp_inf(xs & ys);
911 +
912 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
913 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
914 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
915 @@ -171,7 +212,6 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
916 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
917 return x;
918
919 - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
920 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
921 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
922 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
923 @@ -180,9 +220,7 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
924 return y;
925
926 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
927 - if (xs == ys)
928 - return x;
929 - return ieee754sp_zero(1);
930 + return ieee754sp_zero(xs & ys);
931
932 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
933 SPDNORMX;
934 @@ -207,7 +245,11 @@ union ieee754sp ieee754sp_fmaxa(union ieee754sp x, union ieee754sp y)
935 return y;
936
937 /* Compare mantissa */
938 - if (xm <= ym)
939 + if (xm < ym)
940 return y;
941 - return x;
942 + else if (xm > ym)
943 + return x;
944 + else if (xs == 0)
945 + return x;
946 + return y;
947 }
948 diff --git a/arch/mips/math-emu/sp_fmin.c b/arch/mips/math-emu/sp_fmin.c
949 index 4eb1bb9e9dec..c51385f46b09 100644
950 --- a/arch/mips/math-emu/sp_fmin.c
951 +++ b/arch/mips/math-emu/sp_fmin.c
952 @@ -47,14 +47,26 @@ union ieee754sp ieee754sp_fmin(union ieee754sp x, union ieee754sp y)
953 case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
954 return ieee754sp_nanxcpt(x);
955
956 - /* numbers are preferred to NaNs */
957 + /*
958 + * Quiet NaN handling
959 + */
960 +
961 + /*
962 + * The case of both inputs quiet NaNs
963 + */
964 + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
965 + return x;
966 +
967 + /*
968 + * The cases of exactly one input quiet NaN (numbers
969 + * are here preferred as returned values to NaNs)
970 + */
971 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
972 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
973 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
974 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
975 return x;
976
977 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
978 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
979 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
980 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
981 @@ -80,9 +92,7 @@ union ieee754sp ieee754sp_fmin(union ieee754sp x, union ieee754sp y)
982 return ys ? y : x;
983
984 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
985 - if (xs == ys)
986 - return x;
987 - return ieee754sp_zero(1);
988 + return ieee754sp_zero(xs | ys);
989
990 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
991 SPDNORMX;
992 @@ -106,16 +116,32 @@ union ieee754sp ieee754sp_fmin(union ieee754sp x, union ieee754sp y)
993 else if (xs < ys)
994 return y;
995
996 - /* Compare exponent */
997 - if (xe > ye)
998 - return y;
999 - else if (xe < ye)
1000 - return x;
1001 + /* Signs of inputs are the same, let's compare exponents */
1002 + if (xs == 0) {
1003 + /* Inputs are both positive */
1004 + if (xe > ye)
1005 + return y;
1006 + else if (xe < ye)
1007 + return x;
1008 + } else {
1009 + /* Inputs are both negative */
1010 + if (xe > ye)
1011 + return x;
1012 + else if (xe < ye)
1013 + return y;
1014 + }
1015
1016 - /* Compare mantissa */
1017 + /* Signs and exponents of inputs are equal, let's compare mantissas */
1018 + if (xs == 0) {
1019 + /* Inputs are both positive, with equal signs and exponents */
1020 + if (xm <= ym)
1021 + return x;
1022 + return y;
1023 + }
1024 + /* Inputs are both negative, with equal signs and exponents */
1025 if (xm <= ym)
1026 - return x;
1027 - return y;
1028 + return y;
1029 + return x;
1030 }
1031
1032 union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
1033 @@ -147,14 +173,26 @@ union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
1034 case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
1035 return ieee754sp_nanxcpt(x);
1036
1037 - /* numbers are preferred to NaNs */
1038 + /*
1039 + * Quiet NaN handling
1040 + */
1041 +
1042 + /*
1043 + * The case of both inputs quiet NaNs
1044 + */
1045 + case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
1046 + return x;
1047 +
1048 + /*
1049 + * The cases of exactly one input quiet NaN (numbers
1050 + * are here preferred as returned values to NaNs)
1051 + */
1052 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
1053 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
1054 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
1055 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
1056 return x;
1057
1058 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
1059 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
1060 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
1061 case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
1062 @@ -164,25 +202,25 @@ union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
1063 /*
1064 * Infinity and zero handling
1065 */
1066 + case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
1067 + return ieee754sp_inf(xs | ys);
1068 +
1069 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
1070 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
1071 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
1072 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
1073 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
1074 - return x;
1075 + return y;
1076
1077 - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
1078 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
1079 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
1080 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
1081 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
1082 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_DNORM):
1083 - return y;
1084 + return x;
1085
1086 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
1087 - if (xs == ys)
1088 - return x;
1089 - return ieee754sp_zero(1);
1090 + return ieee754sp_zero(xs | ys);
1091
1092 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
1093 SPDNORMX;
1094 @@ -207,7 +245,11 @@ union ieee754sp ieee754sp_fmina(union ieee754sp x, union ieee754sp y)
1095 return x;
1096
1097 /* Compare mantissa */
1098 - if (xm <= ym)
1099 + if (xm < ym)
1100 + return x;
1101 + else if (xm > ym)
1102 + return y;
1103 + else if (xs == 1)
1104 return x;
1105 return y;
1106 }
1107 diff --git a/arch/mips/math-emu/sp_maddf.c b/arch/mips/math-emu/sp_maddf.c
1108 index c91d5e5d9b5f..7195fe785d81 100644
1109 --- a/arch/mips/math-emu/sp_maddf.c
1110 +++ b/arch/mips/math-emu/sp_maddf.c
1111 @@ -14,9 +14,6 @@
1112
1113 #include "ieee754sp.h"
1114
1115 -enum maddf_flags {
1116 - maddf_negate_product = 1 << 0,
1117 -};
1118
1119 static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
1120 union ieee754sp y, enum maddf_flags flags)
1121 @@ -24,14 +21,8 @@ static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
1122 int re;
1123 int rs;
1124 unsigned rm;
1125 - unsigned short lxm;
1126 - unsigned short hxm;
1127 - unsigned short lym;
1128 - unsigned short hym;
1129 - unsigned lrm;
1130 - unsigned hrm;
1131 - unsigned t;
1132 - unsigned at;
1133 + uint64_t rm64;
1134 + uint64_t zm64;
1135 int s;
1136
1137 COMPXSP;
1138 @@ -48,51 +39,35 @@ static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
1139
1140 ieee754_clearcx();
1141
1142 - switch (zc) {
1143 - case IEEE754_CLASS_SNAN:
1144 - ieee754_setcx(IEEE754_INVALID_OPERATION);
1145 + /*
1146 + * Handle the cases when at least one of x, y or z is a NaN.
1147 + * Order of precedence is sNaN, qNaN and z, x, y.
1148 + */
1149 + if (zc == IEEE754_CLASS_SNAN)
1150 return ieee754sp_nanxcpt(z);
1151 - case IEEE754_CLASS_DNORM:
1152 - SPDNORMZ;
1153 - /* QNAN and ZERO cases are handled separately below */
1154 - }
1155 -
1156 - switch (CLPAIR(xc, yc)) {
1157 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_SNAN):
1158 - case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_SNAN):
1159 - case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_SNAN):
1160 - case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_SNAN):
1161 - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_SNAN):
1162 + if (xc == IEEE754_CLASS_SNAN)
1163 + return ieee754sp_nanxcpt(x);
1164 + if (yc == IEEE754_CLASS_SNAN)
1165 return ieee754sp_nanxcpt(y);
1166 + if (zc == IEEE754_CLASS_QNAN)
1167 + return z;
1168 + if (xc == IEEE754_CLASS_QNAN)
1169 + return x;
1170 + if (yc == IEEE754_CLASS_QNAN)
1171 + return y;
1172
1173 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_SNAN):
1174 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_QNAN):
1175 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_ZERO):
1176 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_NORM):
1177 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_DNORM):
1178 - case CLPAIR(IEEE754_CLASS_SNAN, IEEE754_CLASS_INF):
1179 - return ieee754sp_nanxcpt(x);
1180 + if (zc == IEEE754_CLASS_DNORM)
1181 + SPDNORMZ;
1182 + /* ZERO z cases are handled separately below */
1183
1184 - case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_QNAN):
1185 - case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_QNAN):
1186 - case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_QNAN):
1187 - case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_QNAN):
1188 - return y;
1189 + switch (CLPAIR(xc, yc)) {
1190
1191 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_QNAN):
1192 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_ZERO):
1193 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_NORM):
1194 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_DNORM):
1195 - case CLPAIR(IEEE754_CLASS_QNAN, IEEE754_CLASS_INF):
1196 - return x;
1197
1198 /*
1199 * Infinity handling
1200 */
1201 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
1202 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
1203 - if (zc == IEEE754_CLASS_QNAN)
1204 - return z;
1205 ieee754_setcx(IEEE754_INVALID_OPERATION);
1206 return ieee754sp_indef();
1207
1208 @@ -101,9 +76,27 @@ static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
1209 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
1210 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
1211 case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
1212 - if (zc == IEEE754_CLASS_QNAN)
1213 - return z;
1214 - return ieee754sp_inf(xs ^ ys);
1215 + if ((zc == IEEE754_CLASS_INF) &&
1216 + ((!(flags & MADDF_NEGATE_PRODUCT) && (zs != (xs ^ ys))) ||
1217 + ((flags & MADDF_NEGATE_PRODUCT) && (zs == (xs ^ ys))))) {
1218 + /*
1219 + * Cases of addition of infinities with opposite signs
1220 + * or subtraction of infinities with same signs.
1221 + */
1222 + ieee754_setcx(IEEE754_INVALID_OPERATION);
1223 + return ieee754sp_indef();
1224 + }
1225 + /*
1226 + * z is here either not an infinity, or an infinity having the
1227 + * same sign as product (x*y) (in case of MADDF.D instruction)
1228 + * or product -(x*y) (in MSUBF.D case). The result must be an
1229 + * infinity, and its sign is determined only by the value of
1230 + * (flags & MADDF_NEGATE_PRODUCT) and the signs of x and y.
1231 + */
1232 + if (flags & MADDF_NEGATE_PRODUCT)
1233 + return ieee754sp_inf(1 ^ (xs ^ ys));
1234 + else
1235 + return ieee754sp_inf(xs ^ ys);
1236
1237 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
1238 case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
1239 @@ -112,32 +105,42 @@ static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
1240 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
1241 if (zc == IEEE754_CLASS_INF)
1242 return ieee754sp_inf(zs);
1243 - /* Multiplication is 0 so just return z */
1244 + if (zc == IEEE754_CLASS_ZERO) {
1245 + /* Handle cases +0 + (-0) and similar ones. */
1246 + if ((!(flags & MADDF_NEGATE_PRODUCT)
1247 + && (zs == (xs ^ ys))) ||
1248 + ((flags & MADDF_NEGATE_PRODUCT)
1249 + && (zs != (xs ^ ys))))
1250 + /*
1251 + * Cases of addition of zeros of equal signs
1252 + * or subtraction of zeroes of opposite signs.
1253 + * The sign of the resulting zero is in any
1254 + * such case determined only by the sign of z.
1255 + */
1256 + return z;
1257 +
1258 + return ieee754sp_zero(ieee754_csr.rm == FPU_CSR_RD);
1259 + }
1260 + /* x*y is here 0, and z is not 0, so just return z */
1261 return z;
1262
1263 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
1264 SPDNORMX;
1265
1266 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_DNORM):
1267 - if (zc == IEEE754_CLASS_QNAN)
1268 - return z;
1269 - else if (zc == IEEE754_CLASS_INF)
1270 + if (zc == IEEE754_CLASS_INF)
1271 return ieee754sp_inf(zs);
1272 SPDNORMY;
1273 break;
1274
1275 case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_NORM):
1276 - if (zc == IEEE754_CLASS_QNAN)
1277 - return z;
1278 - else if (zc == IEEE754_CLASS_INF)
1279 + if (zc == IEEE754_CLASS_INF)
1280 return ieee754sp_inf(zs);
1281 SPDNORMX;
1282 break;
1283
1284 case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_NORM):
1285 - if (zc == IEEE754_CLASS_QNAN)
1286 - return z;
1287 - else if (zc == IEEE754_CLASS_INF)
1288 + if (zc == IEEE754_CLASS_INF)
1289 return ieee754sp_inf(zs);
1290 /* fall through to real computations */
1291 }
1292 @@ -158,111 +161,93 @@ static union ieee754sp _sp_maddf(union ieee754sp z, union ieee754sp x,
1293
1294 re = xe + ye;
1295 rs = xs ^ ys;
1296 - if (flags & maddf_negate_product)
1297 + if (flags & MADDF_NEGATE_PRODUCT)
1298 rs ^= 1;
1299
1300 - /* shunt to top of word */
1301 - xm <<= 32 - (SP_FBITS + 1);
1302 - ym <<= 32 - (SP_FBITS + 1);
1303 -
1304 - /*
1305 - * Multiply 32 bits xm, ym to give high 32 bits rm with stickness.
1306 - */
1307 - lxm = xm & 0xffff;
1308 - hxm = xm >> 16;
1309 - lym = ym & 0xffff;
1310 - hym = ym >> 16;
1311 -
1312 - lrm = lxm * lym; /* 16 * 16 => 32 */
1313 - hrm = hxm * hym; /* 16 * 16 => 32 */
1314 -
1315 - t = lxm * hym; /* 16 * 16 => 32 */
1316 - at = lrm + (t << 16);
1317 - hrm += at < lrm;
1318 - lrm = at;
1319 - hrm = hrm + (t >> 16);
1320 + /* Multiple 24 bit xm and ym to give 48 bit results */
1321 + rm64 = (uint64_t)xm * ym;
1322
1323 - t = hxm * lym; /* 16 * 16 => 32 */
1324 - at = lrm + (t << 16);
1325 - hrm += at < lrm;
1326 - lrm = at;
1327 - hrm = hrm + (t >> 16);
1328 + /* Shunt to top of word */
1329 + rm64 = rm64 << 16;
1330
1331 - rm = hrm | (lrm != 0);
1332 -
1333 - /*
1334 - * Sticky shift down to normal rounding precision.
1335 - */
1336 - if ((int) rm < 0) {
1337 - rm = (rm >> (32 - (SP_FBITS + 1 + 3))) |
1338 - ((rm << (SP_FBITS + 1 + 3)) != 0);
1339 + /* Put explicit bit at bit 62 if necessary */
1340 + if ((int64_t) rm64 < 0) {
1341 + rm64 = rm64 >> 1;
1342 re++;
1343 - } else {
1344 - rm = (rm >> (32 - (SP_FBITS + 1 + 3 + 1))) |
1345 - ((rm << (SP_FBITS + 1 + 3 + 1)) != 0);
1346 }
1347 - assert(rm & (SP_HIDDEN_BIT << 3));
1348 -
1349 - if (zc == IEEE754_CLASS_ZERO)
1350 - return ieee754sp_format(rs, re, rm);
1351
1352 - /* And now the addition */
1353 + assert(rm64 & (1 << 62));
1354
1355 - assert(zm & SP_HIDDEN_BIT);
1356 + if (zc == IEEE754_CLASS_ZERO) {
1357 + /*
1358 + * Move explicit bit from bit 62 to bit 26 since the
1359 + * ieee754sp_format code expects the mantissa to be
1360 + * 27 bits wide (24 + 3 rounding bits).
1361 + */
1362 + rm = XSPSRS64(rm64, (62 - 26));
1363 + return ieee754sp_format(rs, re, rm);
1364 + }
1365
1366 - /*
1367 - * Provide guard,round and stick bit space.
1368 - */
1369 - zm <<= 3;
1370 + /* Move explicit bit from bit 23 to bit 62 */
1371 + zm64 = (uint64_t)zm << (62 - 23);
1372 + assert(zm64 & (1 << 62));
1373
1374 + /* Make the exponents the same */
1375 if (ze > re) {
1376 /*
1377 * Have to shift r fraction right to align.
1378 */
1379 s = ze - re;
1380 - rm = XSPSRS(rm, s);
1381 + rm64 = XSPSRS64(rm64, s);
1382 re += s;
1383 } else if (re > ze) {
1384 /*
1385 * Have to shift z fraction right to align.
1386 */
1387 s = re - ze;
1388 - zm = XSPSRS(zm, s);
1389 + zm64 = XSPSRS64(zm64, s);
1390 ze += s;
1391 }
1392 assert(ze == re);
1393 assert(ze <= SP_EMAX);
1394
1395 + /* Do the addition */
1396 if (zs == rs) {
1397 /*
1398 - * Generate 28 bit result of adding two 27 bit numbers
1399 - * leaving result in zm, zs and ze.
1400 + * Generate 64 bit result by adding two 63 bit numbers
1401 + * leaving result in zm64, zs and ze.
1402 */
1403 - zm = zm + rm;
1404 -
1405 - if (zm >> (SP_FBITS + 1 + 3)) { /* carry out */
1406 - zm = XSPSRS1(zm);
1407 + zm64 = zm64 + rm64;
1408 + if ((int64_t)zm64 < 0) { /* carry out */
1409 + zm64 = XSPSRS1(zm64);
1410 ze++;
1411 }
1412 } else {
1413 - if (zm >= rm) {
1414 - zm = zm - rm;
1415 + if (zm64 >= rm64) {
1416 + zm64 = zm64 - rm64;
1417 } else {
1418 - zm = rm - zm;
1419 + zm64 = rm64 - zm64;
1420 zs = rs;
1421 }
1422 - if (zm == 0)
1423 + if (zm64 == 0)
1424 return ieee754sp_zero(ieee754_csr.rm == FPU_CSR_RD);
1425
1426 /*
1427 - * Normalize in extended single precision
1428 + * Put explicit bit at bit 62 if necessary.
1429 */
1430 - while ((zm >> (SP_MBITS + 3)) == 0) {
1431 - zm <<= 1;
1432 + while ((zm64 >> 62) == 0) {
1433 + zm64 <<= 1;
1434 ze--;
1435 }
1436 -
1437 }
1438 +
1439 + /*
1440 + * Move explicit bit from bit 62 to bit 26 since the
1441 + * ieee754sp_format code expects the mantissa to be
1442 + * 27 bits wide (24 + 3 rounding bits).
1443 + */
1444 + zm = XSPSRS64(zm64, (62 - 26));
1445 +
1446 return ieee754sp_format(zs, ze, zm);
1447 }
1448
1449 @@ -275,5 +260,5 @@ union ieee754sp ieee754sp_maddf(union ieee754sp z, union ieee754sp x,
1450 union ieee754sp ieee754sp_msubf(union ieee754sp z, union ieee754sp x,
1451 union ieee754sp y)
1452 {
1453 - return _sp_maddf(z, x, y, maddf_negate_product);
1454 + return _sp_maddf(z, x, y, MADDF_NEGATE_PRODUCT);
1455 }
1456 diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c
1457 index ec7a8b099dd9..fd3c1fcc73eb 100644
1458 --- a/arch/powerpc/kernel/align.c
1459 +++ b/arch/powerpc/kernel/align.c
1460 @@ -235,6 +235,28 @@ static int emulate_dcbz(struct pt_regs *regs, unsigned char __user *addr)
1461
1462 #define SWIZ_PTR(p) ((unsigned char __user *)((p) ^ swiz))
1463
1464 +#define __get_user_or_set_dar(_regs, _dest, _addr) \
1465 + ({ \
1466 + int rc = 0; \
1467 + typeof(_addr) __addr = (_addr); \
1468 + if (__get_user_inatomic(_dest, __addr)) { \
1469 + _regs->dar = (unsigned long)__addr; \
1470 + rc = -EFAULT; \
1471 + } \
1472 + rc; \
1473 + })
1474 +
1475 +#define __put_user_or_set_dar(_regs, _src, _addr) \
1476 + ({ \
1477 + int rc = 0; \
1478 + typeof(_addr) __addr = (_addr); \
1479 + if (__put_user_inatomic(_src, __addr)) { \
1480 + _regs->dar = (unsigned long)__addr; \
1481 + rc = -EFAULT; \
1482 + } \
1483 + rc; \
1484 + })
1485 +
1486 static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr,
1487 unsigned int reg, unsigned int nb,
1488 unsigned int flags, unsigned int instr,
1489 @@ -263,9 +285,10 @@ static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr,
1490 } else {
1491 unsigned long pc = regs->nip ^ (swiz & 4);
1492
1493 - if (__get_user_inatomic(instr,
1494 - (unsigned int __user *)pc))
1495 + if (__get_user_or_set_dar(regs, instr,
1496 + (unsigned int __user *)pc))
1497 return -EFAULT;
1498 +
1499 if (swiz == 0 && (flags & SW))
1500 instr = cpu_to_le32(instr);
1501 nb = (instr >> 11) & 0x1f;
1502 @@ -309,31 +332,31 @@ static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr,
1503 ((nb0 + 3) / 4) * sizeof(unsigned long));
1504
1505 for (i = 0; i < nb; ++i, ++p)
1506 - if (__get_user_inatomic(REG_BYTE(rptr, i ^ bswiz),
1507 - SWIZ_PTR(p)))
1508 + if (__get_user_or_set_dar(regs, REG_BYTE(rptr, i ^ bswiz),
1509 + SWIZ_PTR(p)))
1510 return -EFAULT;
1511 if (nb0 > 0) {
1512 rptr = &regs->gpr[0];
1513 addr += nb;
1514 for (i = 0; i < nb0; ++i, ++p)
1515 - if (__get_user_inatomic(REG_BYTE(rptr,
1516 - i ^ bswiz),
1517 - SWIZ_PTR(p)))
1518 + if (__get_user_or_set_dar(regs,
1519 + REG_BYTE(rptr, i ^ bswiz),
1520 + SWIZ_PTR(p)))
1521 return -EFAULT;
1522 }
1523
1524 } else {
1525 for (i = 0; i < nb; ++i, ++p)
1526 - if (__put_user_inatomic(REG_BYTE(rptr, i ^ bswiz),
1527 - SWIZ_PTR(p)))
1528 + if (__put_user_or_set_dar(regs, REG_BYTE(rptr, i ^ bswiz),
1529 + SWIZ_PTR(p)))
1530 return -EFAULT;
1531 if (nb0 > 0) {
1532 rptr = &regs->gpr[0];
1533 addr += nb;
1534 for (i = 0; i < nb0; ++i, ++p)
1535 - if (__put_user_inatomic(REG_BYTE(rptr,
1536 - i ^ bswiz),
1537 - SWIZ_PTR(p)))
1538 + if (__put_user_or_set_dar(regs,
1539 + REG_BYTE(rptr, i ^ bswiz),
1540 + SWIZ_PTR(p)))
1541 return -EFAULT;
1542 }
1543 }
1544 @@ -345,29 +368,32 @@ static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr,
1545 * Only POWER6 has these instructions, and it does true little-endian,
1546 * so we don't need the address swizzling.
1547 */
1548 -static int emulate_fp_pair(unsigned char __user *addr, unsigned int reg,
1549 - unsigned int flags)
1550 +static int emulate_fp_pair(struct pt_regs *regs, unsigned char __user *addr,
1551 + unsigned int reg, unsigned int flags)
1552 {
1553 char *ptr0 = (char *) &current->thread.TS_FPR(reg);
1554 char *ptr1 = (char *) &current->thread.TS_FPR(reg+1);
1555 - int i, ret, sw = 0;
1556 + int i, sw = 0;
1557
1558 if (reg & 1)
1559 return 0; /* invalid form: FRS/FRT must be even */
1560 if (flags & SW)
1561 sw = 7;
1562 - ret = 0;
1563 +
1564 for (i = 0; i < 8; ++i) {
1565 if (!(flags & ST)) {
1566 - ret |= __get_user(ptr0[i^sw], addr + i);
1567 - ret |= __get_user(ptr1[i^sw], addr + i + 8);
1568 + if (__get_user_or_set_dar(regs, ptr0[i^sw], addr + i))
1569 + return -EFAULT;
1570 + if (__get_user_or_set_dar(regs, ptr1[i^sw], addr + i + 8))
1571 + return -EFAULT;
1572 } else {
1573 - ret |= __put_user(ptr0[i^sw], addr + i);
1574 - ret |= __put_user(ptr1[i^sw], addr + i + 8);
1575 + if (__put_user_or_set_dar(regs, ptr0[i^sw], addr + i))
1576 + return -EFAULT;
1577 + if (__put_user_or_set_dar(regs, ptr1[i^sw], addr + i + 8))
1578 + return -EFAULT;
1579 }
1580 }
1581 - if (ret)
1582 - return -EFAULT;
1583 +
1584 return 1; /* exception handled and fixed up */
1585 }
1586
1587 @@ -377,24 +403,27 @@ static int emulate_lq_stq(struct pt_regs *regs, unsigned char __user *addr,
1588 {
1589 char *ptr0 = (char *)&regs->gpr[reg];
1590 char *ptr1 = (char *)&regs->gpr[reg+1];
1591 - int i, ret, sw = 0;
1592 + int i, sw = 0;
1593
1594 if (reg & 1)
1595 return 0; /* invalid form: GPR must be even */
1596 if (flags & SW)
1597 sw = 7;
1598 - ret = 0;
1599 +
1600 for (i = 0; i < 8; ++i) {
1601 if (!(flags & ST)) {
1602 - ret |= __get_user(ptr0[i^sw], addr + i);
1603 - ret |= __get_user(ptr1[i^sw], addr + i + 8);
1604 + if (__get_user_or_set_dar(regs, ptr0[i^sw], addr + i))
1605 + return -EFAULT;
1606 + if (__get_user_or_set_dar(regs, ptr1[i^sw], addr + i + 8))
1607 + return -EFAULT;
1608 } else {
1609 - ret |= __put_user(ptr0[i^sw], addr + i);
1610 - ret |= __put_user(ptr1[i^sw], addr + i + 8);
1611 + if (__put_user_or_set_dar(regs, ptr0[i^sw], addr + i))
1612 + return -EFAULT;
1613 + if (__put_user_or_set_dar(regs, ptr1[i^sw], addr + i + 8))
1614 + return -EFAULT;
1615 }
1616 }
1617 - if (ret)
1618 - return -EFAULT;
1619 +
1620 return 1; /* exception handled and fixed up */
1621 }
1622 #endif /* CONFIG_PPC64 */
1623 @@ -687,9 +716,14 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg,
1624 for (j = 0; j < length; j += elsize) {
1625 for (i = 0; i < elsize; ++i) {
1626 if (flags & ST)
1627 - ret |= __put_user(ptr[i^sw], addr + i);
1628 + ret = __put_user_or_set_dar(regs, ptr[i^sw],
1629 + addr + i);
1630 else
1631 - ret |= __get_user(ptr[i^sw], addr + i);
1632 + ret = __get_user_or_set_dar(regs, ptr[i^sw],
1633 + addr + i);
1634 +
1635 + if (ret)
1636 + return ret;
1637 }
1638 ptr += elsize;
1639 #ifdef __LITTLE_ENDIAN__
1640 @@ -739,7 +773,7 @@ int fix_alignment(struct pt_regs *regs)
1641 unsigned int dsisr;
1642 unsigned char __user *addr;
1643 unsigned long p, swiz;
1644 - int ret, i;
1645 + int i;
1646 union data {
1647 u64 ll;
1648 double dd;
1649 @@ -936,7 +970,7 @@ int fix_alignment(struct pt_regs *regs)
1650 if (flags & F) {
1651 /* Special case for 16-byte FP loads and stores */
1652 PPC_WARN_ALIGNMENT(fp_pair, regs);
1653 - return emulate_fp_pair(addr, reg, flags);
1654 + return emulate_fp_pair(regs, addr, reg, flags);
1655 } else {
1656 #ifdef CONFIG_PPC64
1657 /* Special case for 16-byte loads and stores */
1658 @@ -966,15 +1000,12 @@ int fix_alignment(struct pt_regs *regs)
1659 }
1660
1661 data.ll = 0;
1662 - ret = 0;
1663 p = (unsigned long)addr;
1664
1665 for (i = 0; i < nb; i++)
1666 - ret |= __get_user_inatomic(data.v[start + i],
1667 - SWIZ_PTR(p++));
1668 -
1669 - if (unlikely(ret))
1670 - return -EFAULT;
1671 + if (__get_user_or_set_dar(regs, data.v[start + i],
1672 + SWIZ_PTR(p++)))
1673 + return -EFAULT;
1674
1675 } else if (flags & F) {
1676 data.ll = current->thread.TS_FPR(reg);
1677 @@ -1046,15 +1077,13 @@ int fix_alignment(struct pt_regs *regs)
1678 break;
1679 }
1680
1681 - ret = 0;
1682 p = (unsigned long)addr;
1683
1684 for (i = 0; i < nb; i++)
1685 - ret |= __put_user_inatomic(data.v[start + i],
1686 - SWIZ_PTR(p++));
1687 + if (__put_user_or_set_dar(regs, data.v[start + i],
1688 + SWIZ_PTR(p++)))
1689 + return -EFAULT;
1690
1691 - if (unlikely(ret))
1692 - return -EFAULT;
1693 } else if (flags & F)
1694 current->thread.TS_FPR(reg) = data.ll;
1695 else
1696 diff --git a/arch/powerpc/platforms/powernv/npu-dma.c b/arch/powerpc/platforms/powernv/npu-dma.c
1697 index 4c7b8591f737..2cb6cbea4b3b 100644
1698 --- a/arch/powerpc/platforms/powernv/npu-dma.c
1699 +++ b/arch/powerpc/platforms/powernv/npu-dma.c
1700 @@ -545,6 +545,12 @@ static void mmio_invalidate(struct npu_context *npu_context, int va,
1701 struct mmio_atsd_reg mmio_atsd_reg[NV_MAX_NPUS];
1702 unsigned long pid = npu_context->mm->context.id;
1703
1704 + /*
1705 + * Unfortunately the nest mmu does not support flushing specific
1706 + * addresses so we have to flush the whole mm.
1707 + */
1708 + flush_tlb_mm(npu_context->mm);
1709 +
1710 /*
1711 * Loop over all the NPUs this process is active on and launch
1712 * an invalidate.
1713 @@ -576,12 +582,6 @@ static void mmio_invalidate(struct npu_context *npu_context, int va,
1714 }
1715 }
1716
1717 - /*
1718 - * Unfortunately the nest mmu does not support flushing specific
1719 - * addresses so we have to flush the whole mm.
1720 - */
1721 - flush_tlb_mm(npu_context->mm);
1722 -
1723 mmio_invalidate_wait(mmio_atsd_reg, flush);
1724 if (flush)
1725 /* Wait for the flush to complete */
1726 diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c
1727 index ca9b2f4aaa22..bf2f43f7ac6a 100644
1728 --- a/arch/powerpc/platforms/pseries/hotplug-memory.c
1729 +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c
1730 @@ -817,6 +817,9 @@ static int dlpar_memory_add_by_count(u32 lmbs_to_add, struct property *prop)
1731 return -EINVAL;
1732
1733 for (i = 0; i < num_lmbs && lmbs_to_add != lmbs_added; i++) {
1734 + if (lmbs[i].flags & DRCONF_MEM_ASSIGNED)
1735 + continue;
1736 +
1737 rc = dlpar_acquire_drc(lmbs[i].drc_index);
1738 if (rc)
1739 continue;
1740 @@ -859,6 +862,7 @@ static int dlpar_memory_add_by_count(u32 lmbs_to_add, struct property *prop)
1741 lmbs[i].base_addr, lmbs[i].drc_index);
1742 lmbs[i].reserved = 0;
1743 }
1744 + rc = 0;
1745 }
1746
1747 return rc;
1748 diff --git a/arch/s390/include/asm/mmu.h b/arch/s390/include/asm/mmu.h
1749 index bd6f30304518..3525fe6e7e4c 100644
1750 --- a/arch/s390/include/asm/mmu.h
1751 +++ b/arch/s390/include/asm/mmu.h
1752 @@ -5,6 +5,7 @@
1753 #include <linux/errno.h>
1754
1755 typedef struct {
1756 + spinlock_t lock;
1757 cpumask_t cpu_attach_mask;
1758 atomic_t flush_count;
1759 unsigned int flush_mm;
1760 @@ -27,6 +28,7 @@ typedef struct {
1761 } mm_context_t;
1762
1763 #define INIT_MM_CONTEXT(name) \
1764 + .context.lock = __SPIN_LOCK_UNLOCKED(name.context.lock), \
1765 .context.pgtable_lock = \
1766 __SPIN_LOCK_UNLOCKED(name.context.pgtable_lock), \
1767 .context.pgtable_list = LIST_HEAD_INIT(name.context.pgtable_list), \
1768 diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h
1769 index 24bc41622a98..ebfb2f248ae9 100644
1770 --- a/arch/s390/include/asm/mmu_context.h
1771 +++ b/arch/s390/include/asm/mmu_context.h
1772 @@ -16,6 +16,7 @@
1773 static inline int init_new_context(struct task_struct *tsk,
1774 struct mm_struct *mm)
1775 {
1776 + spin_lock_init(&mm->context.lock);
1777 spin_lock_init(&mm->context.pgtable_lock);
1778 INIT_LIST_HEAD(&mm->context.pgtable_list);
1779 spin_lock_init(&mm->context.gmap_lock);
1780 @@ -102,7 +103,6 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
1781 if (prev == next)
1782 return;
1783 cpumask_set_cpu(cpu, &next->context.cpu_attach_mask);
1784 - cpumask_set_cpu(cpu, mm_cpumask(next));
1785 /* Clear old ASCE by loading the kernel ASCE. */
1786 __ctl_load(S390_lowcore.kernel_asce, 1, 1);
1787 __ctl_load(S390_lowcore.kernel_asce, 7, 7);
1788 @@ -120,9 +120,8 @@ static inline void finish_arch_post_lock_switch(void)
1789 preempt_disable();
1790 while (atomic_read(&mm->context.flush_count))
1791 cpu_relax();
1792 -
1793 - if (mm->context.flush_mm)
1794 - __tlb_flush_mm(mm);
1795 + cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm));
1796 + __tlb_flush_mm_lazy(mm);
1797 preempt_enable();
1798 }
1799 set_fs(current->thread.mm_segment);
1800 @@ -135,6 +134,7 @@ static inline void activate_mm(struct mm_struct *prev,
1801 struct mm_struct *next)
1802 {
1803 switch_mm(prev, next, current);
1804 + cpumask_set_cpu(smp_processor_id(), mm_cpumask(next));
1805 set_user_asce(next);
1806 }
1807
1808 diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h
1809 index 39846100682a..eed927aeb08f 100644
1810 --- a/arch/s390/include/asm/tlbflush.h
1811 +++ b/arch/s390/include/asm/tlbflush.h
1812 @@ -43,23 +43,6 @@ static inline void __tlb_flush_global(void)
1813 * Flush TLB entries for a specific mm on all CPUs (in case gmap is used
1814 * this implicates multiple ASCEs!).
1815 */
1816 -static inline void __tlb_flush_full(struct mm_struct *mm)
1817 -{
1818 - preempt_disable();
1819 - atomic_inc(&mm->context.flush_count);
1820 - if (cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) {
1821 - /* Local TLB flush */
1822 - __tlb_flush_local();
1823 - } else {
1824 - /* Global TLB flush */
1825 - __tlb_flush_global();
1826 - /* Reset TLB flush mask */
1827 - cpumask_copy(mm_cpumask(mm), &mm->context.cpu_attach_mask);
1828 - }
1829 - atomic_dec(&mm->context.flush_count);
1830 - preempt_enable();
1831 -}
1832 -
1833 static inline void __tlb_flush_mm(struct mm_struct *mm)
1834 {
1835 unsigned long gmap_asce;
1836 @@ -71,16 +54,18 @@ static inline void __tlb_flush_mm(struct mm_struct *mm)
1837 */
1838 preempt_disable();
1839 atomic_inc(&mm->context.flush_count);
1840 + /* Reset TLB flush mask */
1841 + cpumask_copy(mm_cpumask(mm), &mm->context.cpu_attach_mask);
1842 + barrier();
1843 gmap_asce = READ_ONCE(mm->context.gmap_asce);
1844 if (MACHINE_HAS_IDTE && gmap_asce != -1UL) {
1845 if (gmap_asce)
1846 __tlb_flush_idte(gmap_asce);
1847 __tlb_flush_idte(mm->context.asce);
1848 } else {
1849 - __tlb_flush_full(mm);
1850 + /* Global TLB flush */
1851 + __tlb_flush_global();
1852 }
1853 - /* Reset TLB flush mask */
1854 - cpumask_copy(mm_cpumask(mm), &mm->context.cpu_attach_mask);
1855 atomic_dec(&mm->context.flush_count);
1856 preempt_enable();
1857 }
1858 @@ -94,7 +79,6 @@ static inline void __tlb_flush_kernel(void)
1859 }
1860 #else
1861 #define __tlb_flush_global() __tlb_flush_local()
1862 -#define __tlb_flush_full(mm) __tlb_flush_local()
1863
1864 /*
1865 * Flush TLB entries for a specific ASCE on all CPUs.
1866 @@ -112,10 +96,12 @@ static inline void __tlb_flush_kernel(void)
1867
1868 static inline void __tlb_flush_mm_lazy(struct mm_struct * mm)
1869 {
1870 + spin_lock(&mm->context.lock);
1871 if (mm->context.flush_mm) {
1872 - __tlb_flush_mm(mm);
1873 mm->context.flush_mm = 0;
1874 + __tlb_flush_mm(mm);
1875 }
1876 + spin_unlock(&mm->context.lock);
1877 }
1878
1879 /*
1880 diff --git a/block/blk-core.c b/block/blk-core.c
1881 index dbecbf4a64e0..658f67309602 100644
1882 --- a/block/blk-core.c
1883 +++ b/block/blk-core.c
1884 @@ -280,7 +280,7 @@ EXPORT_SYMBOL(blk_start_queue_async);
1885 void blk_start_queue(struct request_queue *q)
1886 {
1887 lockdep_assert_held(q->queue_lock);
1888 - WARN_ON(!irqs_disabled());
1889 + WARN_ON(!in_interrupt() && !irqs_disabled());
1890 WARN_ON_ONCE(q->mq_ops);
1891
1892 queue_flag_clear(QUEUE_FLAG_STOPPED, q);
1893 @@ -2330,7 +2330,12 @@ blk_status_t blk_insert_cloned_request(struct request_queue *q, struct request *
1894 if (q->mq_ops) {
1895 if (blk_queue_io_stat(q))
1896 blk_account_io_start(rq, true);
1897 - blk_mq_sched_insert_request(rq, false, true, false, false);
1898 + /*
1899 + * Since we have a scheduler attached on the top device,
1900 + * bypass a potential scheduler on the bottom device for
1901 + * insert.
1902 + */
1903 + blk_mq_request_bypass_insert(rq);
1904 return BLK_STS_OK;
1905 }
1906
1907 diff --git a/block/blk-mq.c b/block/blk-mq.c
1908 index 4603b115e234..e0523eb8eee1 100644
1909 --- a/block/blk-mq.c
1910 +++ b/block/blk-mq.c
1911 @@ -1357,6 +1357,22 @@ void __blk_mq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
1912 blk_mq_hctx_mark_pending(hctx, ctx);
1913 }
1914
1915 +/*
1916 + * Should only be used carefully, when the caller knows we want to
1917 + * bypass a potential IO scheduler on the target device.
1918 + */
1919 +void blk_mq_request_bypass_insert(struct request *rq)
1920 +{
1921 + struct blk_mq_ctx *ctx = rq->mq_ctx;
1922 + struct blk_mq_hw_ctx *hctx = blk_mq_map_queue(rq->q, ctx->cpu);
1923 +
1924 + spin_lock(&hctx->lock);
1925 + list_add_tail(&rq->queuelist, &hctx->dispatch);
1926 + spin_unlock(&hctx->lock);
1927 +
1928 + blk_mq_run_hw_queue(hctx, false);
1929 +}
1930 +
1931 void blk_mq_insert_requests(struct blk_mq_hw_ctx *hctx, struct blk_mq_ctx *ctx,
1932 struct list_head *list)
1933
1934 diff --git a/block/blk-mq.h b/block/blk-mq.h
1935 index 60b01c0309bc..f64747914560 100644
1936 --- a/block/blk-mq.h
1937 +++ b/block/blk-mq.h
1938 @@ -54,6 +54,7 @@ int blk_mq_alloc_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
1939 */
1940 void __blk_mq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
1941 bool at_head);
1942 +void blk_mq_request_bypass_insert(struct request *rq);
1943 void blk_mq_insert_requests(struct blk_mq_hw_ctx *hctx, struct blk_mq_ctx *ctx,
1944 struct list_head *list);
1945
1946 diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c
1947 index 903605dbc1a5..76b875c69a95 100644
1948 --- a/crypto/algif_skcipher.c
1949 +++ b/crypto/algif_skcipher.c
1950 @@ -144,8 +144,10 @@ static int skcipher_alloc_sgl(struct sock *sk)
1951 sg_init_table(sgl->sg, MAX_SGL_ENTS + 1);
1952 sgl->cur = 0;
1953
1954 - if (sg)
1955 + if (sg) {
1956 sg_chain(sg, MAX_SGL_ENTS + 1, sgl->sg);
1957 + sg_unmark_end(sg + (MAX_SGL_ENTS - 1));
1958 + }
1959
1960 list_add_tail(&sgl->list, &ctx->tsgl);
1961 }
1962 diff --git a/crypto/scompress.c b/crypto/scompress.c
1963 index ae1d3cf209e4..0b40d991d65f 100644
1964 --- a/crypto/scompress.c
1965 +++ b/crypto/scompress.c
1966 @@ -211,9 +211,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
1967 scratch_dst, &req->dlen, *ctx);
1968 if (!ret) {
1969 if (!req->dst) {
1970 - req->dst = crypto_scomp_sg_alloc(req->dlen,
1971 - req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
1972 - GFP_KERNEL : GFP_ATOMIC);
1973 + req->dst = crypto_scomp_sg_alloc(req->dlen, GFP_ATOMIC);
1974 if (!req->dst)
1975 goto out;
1976 }
1977 diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c
1978 index d0368682bd43..153f20ce318b 100644
1979 --- a/drivers/block/skd_main.c
1980 +++ b/drivers/block/skd_main.c
1981 @@ -2160,6 +2160,9 @@ static void skd_send_fitmsg(struct skd_device *skdev,
1982 */
1983 qcmd |= FIT_QCMD_MSGSIZE_64;
1984
1985 + /* Make sure skd_msg_buf is written before the doorbell is triggered. */
1986 + smp_wmb();
1987 +
1988 SKD_WRITEQ(skdev, qcmd, FIT_Q_COMMAND);
1989 }
1990
1991 @@ -2202,6 +2205,9 @@ static void skd_send_special_fitmsg(struct skd_device *skdev,
1992 qcmd = skspcl->mb_dma_address;
1993 qcmd |= FIT_QCMD_QID_NORMAL + FIT_QCMD_MSGSIZE_128;
1994
1995 + /* Make sure skd_msg_buf is written before the doorbell is triggered. */
1996 + smp_wmb();
1997 +
1998 SKD_WRITEQ(skdev, qcmd, FIT_Q_COMMAND);
1999 }
2000
2001 @@ -4539,15 +4545,16 @@ static void skd_free_disk(struct skd_device *skdev)
2002 {
2003 struct gendisk *disk = skdev->disk;
2004
2005 - if (disk != NULL) {
2006 - struct request_queue *q = disk->queue;
2007 + if (disk && (disk->flags & GENHD_FL_UP))
2008 + del_gendisk(disk);
2009
2010 - if (disk->flags & GENHD_FL_UP)
2011 - del_gendisk(disk);
2012 - if (q)
2013 - blk_cleanup_queue(q);
2014 - put_disk(disk);
2015 + if (skdev->queue) {
2016 + blk_cleanup_queue(skdev->queue);
2017 + skdev->queue = NULL;
2018 + disk->queue = NULL;
2019 }
2020 +
2021 + put_disk(disk);
2022 skdev->disk = NULL;
2023 }
2024
2025 diff --git a/drivers/crypto/caam/caamalg_qi.c b/drivers/crypto/caam/caamalg_qi.c
2026 index 3425f2d9a2a1..fe0185ceac16 100644
2027 --- a/drivers/crypto/caam/caamalg_qi.c
2028 +++ b/drivers/crypto/caam/caamalg_qi.c
2029 @@ -776,9 +776,9 @@ static void ablkcipher_done(struct caam_drv_req *drv_req, u32 status)
2030 struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
2031 struct caam_ctx *caam_ctx = crypto_ablkcipher_ctx(ablkcipher);
2032 struct device *qidev = caam_ctx->qidev;
2033 -#ifdef DEBUG
2034 int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
2035
2036 +#ifdef DEBUG
2037 dev_err(qidev, "%s %d: status 0x%x\n", __func__, __LINE__, status);
2038 #endif
2039
2040 @@ -799,6 +799,13 @@ static void ablkcipher_done(struct caam_drv_req *drv_req, u32 status)
2041 ablkcipher_unmap(qidev, edesc, req);
2042 qi_cache_free(edesc);
2043
2044 + /*
2045 + * The crypto API expects us to set the IV (req->info) to the last
2046 + * ciphertext block. This is used e.g. by the CTS mode.
2047 + */
2048 + scatterwalk_map_and_copy(req->info, req->dst, req->nbytes - ivsize,
2049 + ivsize, 0);
2050 +
2051 ablkcipher_request_complete(req, status);
2052 }
2053
2054 @@ -1968,7 +1975,7 @@ static struct caam_aead_alg driver_aeads[] = {
2055 .cra_name = "echainiv(authenc(hmac(sha256),"
2056 "cbc(des)))",
2057 .cra_driver_name = "echainiv-authenc-"
2058 - "hmac-sha256-cbc-desi-"
2059 + "hmac-sha256-cbc-des-"
2060 "caam-qi",
2061 .cra_blocksize = DES_BLOCK_SIZE,
2062 },
2063 diff --git a/drivers/crypto/ccp/ccp-crypto-aes-xts.c b/drivers/crypto/ccp/ccp-crypto-aes-xts.c
2064 index 58a4244b4752..3f26a415ef44 100644
2065 --- a/drivers/crypto/ccp/ccp-crypto-aes-xts.c
2066 +++ b/drivers/crypto/ccp/ccp-crypto-aes-xts.c
2067 @@ -1,8 +1,9 @@
2068 /*
2069 * AMD Cryptographic Coprocessor (CCP) AES XTS crypto API support
2070 *
2071 - * Copyright (C) 2013 Advanced Micro Devices, Inc.
2072 + * Copyright (C) 2013,2017 Advanced Micro Devices, Inc.
2073 *
2074 + * Author: Gary R Hook <gary.hook@amd.com>
2075 * Author: Tom Lendacky <thomas.lendacky@amd.com>
2076 *
2077 * This program is free software; you can redistribute it and/or modify
2078 @@ -164,6 +165,7 @@ static int ccp_aes_xts_crypt(struct ablkcipher_request *req,
2079 memset(&rctx->cmd, 0, sizeof(rctx->cmd));
2080 INIT_LIST_HEAD(&rctx->cmd.entry);
2081 rctx->cmd.engine = CCP_ENGINE_XTS_AES_128;
2082 + rctx->cmd.u.xts.type = CCP_AES_TYPE_128;
2083 rctx->cmd.u.xts.action = (encrypt) ? CCP_AES_ACTION_ENCRYPT
2084 : CCP_AES_ACTION_DECRYPT;
2085 rctx->cmd.u.xts.unit_size = unit_size;
2086 diff --git a/drivers/crypto/ccp/ccp-dev-v5.c b/drivers/crypto/ccp/ccp-dev-v5.c
2087 index b10d2d2075cb..9bc134a4ebf0 100644
2088 --- a/drivers/crypto/ccp/ccp-dev-v5.c
2089 +++ b/drivers/crypto/ccp/ccp-dev-v5.c
2090 @@ -145,6 +145,7 @@ union ccp_function {
2091 #define CCP_AES_MODE(p) ((p)->aes.mode)
2092 #define CCP_AES_TYPE(p) ((p)->aes.type)
2093 #define CCP_XTS_SIZE(p) ((p)->aes_xts.size)
2094 +#define CCP_XTS_TYPE(p) ((p)->aes_xts.type)
2095 #define CCP_XTS_ENCRYPT(p) ((p)->aes_xts.encrypt)
2096 #define CCP_DES3_SIZE(p) ((p)->des3.size)
2097 #define CCP_DES3_ENCRYPT(p) ((p)->des3.encrypt)
2098 @@ -344,6 +345,7 @@ static int ccp5_perform_xts_aes(struct ccp_op *op)
2099 CCP5_CMD_PROT(&desc) = 0;
2100
2101 function.raw = 0;
2102 + CCP_XTS_TYPE(&function) = op->u.xts.type;
2103 CCP_XTS_ENCRYPT(&function) = op->u.xts.action;
2104 CCP_XTS_SIZE(&function) = op->u.xts.unit_size;
2105 CCP5_CMD_FUNCTION(&desc) = function.raw;
2106 diff --git a/drivers/crypto/ccp/ccp-dev.h b/drivers/crypto/ccp/ccp-dev.h
2107 index a70154ac7405..7b8370e9c42e 100644
2108 --- a/drivers/crypto/ccp/ccp-dev.h
2109 +++ b/drivers/crypto/ccp/ccp-dev.h
2110 @@ -192,6 +192,7 @@
2111 #define CCP_AES_CTX_SB_COUNT 1
2112
2113 #define CCP_XTS_AES_KEY_SB_COUNT 1
2114 +#define CCP5_XTS_AES_KEY_SB_COUNT 2
2115 #define CCP_XTS_AES_CTX_SB_COUNT 1
2116
2117 #define CCP_DES3_KEY_SB_COUNT 1
2118 @@ -497,6 +498,7 @@ struct ccp_aes_op {
2119 };
2120
2121 struct ccp_xts_aes_op {
2122 + enum ccp_aes_type type;
2123 enum ccp_aes_action action;
2124 enum ccp_xts_aes_unit_size unit_size;
2125 };
2126 diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c
2127 index c0dfdacbdff5..f3542aede519 100644
2128 --- a/drivers/crypto/ccp/ccp-ops.c
2129 +++ b/drivers/crypto/ccp/ccp-ops.c
2130 @@ -1038,6 +1038,8 @@ static int ccp_run_xts_aes_cmd(struct ccp_cmd_queue *cmd_q,
2131 struct ccp_op op;
2132 unsigned int unit_size, dm_offset;
2133 bool in_place = false;
2134 + unsigned int sb_count;
2135 + enum ccp_aes_type aestype;
2136 int ret;
2137
2138 switch (xts->unit_size) {
2139 @@ -1061,7 +1063,9 @@ static int ccp_run_xts_aes_cmd(struct ccp_cmd_queue *cmd_q,
2140 return -EINVAL;
2141 }
2142
2143 - if (xts->key_len != AES_KEYSIZE_128)
2144 + if (xts->key_len == AES_KEYSIZE_128)
2145 + aestype = CCP_AES_TYPE_128;
2146 + else
2147 return -EINVAL;
2148
2149 if (!xts->final && (xts->src_len & (AES_BLOCK_SIZE - 1)))
2150 @@ -1083,23 +1087,44 @@ static int ccp_run_xts_aes_cmd(struct ccp_cmd_queue *cmd_q,
2151 op.sb_key = cmd_q->sb_key;
2152 op.sb_ctx = cmd_q->sb_ctx;
2153 op.init = 1;
2154 + op.u.xts.type = aestype;
2155 op.u.xts.action = xts->action;
2156 op.u.xts.unit_size = xts->unit_size;
2157
2158 - /* All supported key sizes fit in a single (32-byte) SB entry
2159 - * and must be in little endian format. Use the 256-bit byte
2160 - * swap passthru option to convert from big endian to little
2161 - * endian.
2162 + /* A version 3 device only supports 128-bit keys, which fits into a
2163 + * single SB entry. A version 5 device uses a 512-bit vector, so two
2164 + * SB entries.
2165 */
2166 + if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0))
2167 + sb_count = CCP_XTS_AES_KEY_SB_COUNT;
2168 + else
2169 + sb_count = CCP5_XTS_AES_KEY_SB_COUNT;
2170 ret = ccp_init_dm_workarea(&key, cmd_q,
2171 - CCP_XTS_AES_KEY_SB_COUNT * CCP_SB_BYTES,
2172 + sb_count * CCP_SB_BYTES,
2173 DMA_TO_DEVICE);
2174 if (ret)
2175 return ret;
2176
2177 - dm_offset = CCP_SB_BYTES - AES_KEYSIZE_128;
2178 - ccp_set_dm_area(&key, dm_offset, xts->key, 0, xts->key_len);
2179 - ccp_set_dm_area(&key, 0, xts->key, dm_offset, xts->key_len);
2180 + if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0)) {
2181 + /* All supported key sizes must be in little endian format.
2182 + * Use the 256-bit byte swap passthru option to convert from
2183 + * big endian to little endian.
2184 + */
2185 + dm_offset = CCP_SB_BYTES - AES_KEYSIZE_128;
2186 + ccp_set_dm_area(&key, dm_offset, xts->key, 0, xts->key_len);
2187 + ccp_set_dm_area(&key, 0, xts->key, xts->key_len, xts->key_len);
2188 + } else {
2189 + /* Version 5 CCPs use a 512-bit space for the key: each portion
2190 + * occupies 256 bits, or one entire slot, and is zero-padded.
2191 + */
2192 + unsigned int pad;
2193 +
2194 + dm_offset = CCP_SB_BYTES;
2195 + pad = dm_offset - xts->key_len;
2196 + ccp_set_dm_area(&key, pad, xts->key, 0, xts->key_len);
2197 + ccp_set_dm_area(&key, dm_offset + pad, xts->key, xts->key_len,
2198 + xts->key_len);
2199 + }
2200 ret = ccp_copy_to_sb(cmd_q, &key, op.jobid, op.sb_key,
2201 CCP_PASSTHRU_BYTESWAP_256BIT);
2202 if (ret) {
2203 diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
2204 index dea04871b50d..a1c4ee818614 100644
2205 --- a/drivers/devfreq/devfreq.c
2206 +++ b/drivers/devfreq/devfreq.c
2207 @@ -564,7 +564,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
2208 err = device_register(&devfreq->dev);
2209 if (err) {
2210 mutex_unlock(&devfreq->lock);
2211 - goto err_out;
2212 + goto err_dev;
2213 }
2214
2215 devfreq->trans_table = devm_kzalloc(&devfreq->dev,
2216 @@ -610,6 +610,9 @@ struct devfreq *devfreq_add_device(struct device *dev,
2217 mutex_unlock(&devfreq_list_lock);
2218
2219 device_unregister(&devfreq->dev);
2220 +err_dev:
2221 + if (devfreq)
2222 + kfree(devfreq);
2223 err_out:
2224 return ERR_PTR(err);
2225 }
2226 diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
2227 index 4083be61b328..6417febe18b9 100644
2228 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
2229 +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
2230 @@ -95,9 +95,8 @@ int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
2231 int i;
2232 struct amdgpu_device *adev = psp->adev;
2233
2234 - val = RREG32(reg_index);
2235 -
2236 for (i = 0; i < adev->usec_timeout; i++) {
2237 + val = RREG32(reg_index);
2238 if (check_changed) {
2239 if (val != reg_val)
2240 return 0;
2241 diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
2242 index c98d77d0c8f8..6f80ad8f588b 100644
2243 --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
2244 +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
2245 @@ -237,11 +237,9 @@ int psp_v3_1_bootloader_load_sos(struct psp_context *psp)
2246
2247 /* there might be handshake issue with hardware which needs delay */
2248 mdelay(20);
2249 -#if 0
2250 ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_81),
2251 RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81),
2252 0, true);
2253 -#endif
2254
2255 return ret;
2256 }
2257 diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c
2258 index 4a11d4da4c92..ff30b34c8984 100644
2259 --- a/drivers/infiniband/hw/hfi1/init.c
2260 +++ b/drivers/infiniband/hw/hfi1/init.c
2261 @@ -483,7 +483,6 @@ void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd,
2262
2263 ppd->pkeys[default_pkey_idx] = DEFAULT_P_KEY;
2264 ppd->part_enforce |= HFI1_PART_ENFORCE_IN;
2265 - ppd->part_enforce |= HFI1_PART_ENFORCE_OUT;
2266
2267 if (loopback) {
2268 hfi1_early_err(&pdev->dev,
2269 diff --git a/drivers/infiniband/hw/hfi1/rc.c b/drivers/infiniband/hw/hfi1/rc.c
2270 index 1080778a1f7c..0c73fb0c2c1b 100644
2271 --- a/drivers/infiniband/hw/hfi1/rc.c
2272 +++ b/drivers/infiniband/hw/hfi1/rc.c
2273 @@ -425,7 +425,7 @@ int hfi1_make_rc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
2274 case IB_WR_RDMA_WRITE:
2275 if (newreq && !(qp->s_flags & RVT_S_UNLIMITED_CREDIT))
2276 qp->s_lsn++;
2277 - /* FALLTHROUGH */
2278 + goto no_flow_control;
2279 case IB_WR_RDMA_WRITE_WITH_IMM:
2280 /* If no credit, return. */
2281 if (!(qp->s_flags & RVT_S_UNLIMITED_CREDIT) &&
2282 @@ -433,6 +433,7 @@ int hfi1_make_rc_req(struct rvt_qp *qp, struct hfi1_pkt_state *ps)
2283 qp->s_flags |= RVT_S_WAIT_SSN_CREDIT;
2284 goto bail;
2285 }
2286 +no_flow_control:
2287 put_ib_reth_vaddr(
2288 wqe->rdma_wr.remote_addr,
2289 &ohdr->u.rc.reth);
2290 diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
2291 index 2c40a2e989d2..a0eb2f96179a 100644
2292 --- a/drivers/infiniband/hw/mlx5/mr.c
2293 +++ b/drivers/infiniband/hw/mlx5/mr.c
2294 @@ -48,6 +48,7 @@ enum {
2295 #define MLX5_UMR_ALIGN 2048
2296
2297 static int clean_mr(struct mlx5_ib_mr *mr);
2298 +static int max_umr_order(struct mlx5_ib_dev *dev);
2299 static int use_umr(struct mlx5_ib_dev *dev, int order);
2300 static int unreg_umr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
2301
2302 @@ -491,16 +492,18 @@ static struct mlx5_ib_mr *alloc_cached_mr(struct mlx5_ib_dev *dev, int order)
2303 struct mlx5_mr_cache *cache = &dev->cache;
2304 struct mlx5_ib_mr *mr = NULL;
2305 struct mlx5_cache_ent *ent;
2306 + int last_umr_cache_entry;
2307 int c;
2308 int i;
2309
2310 c = order2idx(dev, order);
2311 - if (c < 0 || c > MAX_UMR_CACHE_ENTRY) {
2312 + last_umr_cache_entry = order2idx(dev, max_umr_order(dev));
2313 + if (c < 0 || c > last_umr_cache_entry) {
2314 mlx5_ib_warn(dev, "order %d, cache index %d\n", order, c);
2315 return NULL;
2316 }
2317
2318 - for (i = c; i < MAX_UMR_CACHE_ENTRY; i++) {
2319 + for (i = c; i <= last_umr_cache_entry; i++) {
2320 ent = &cache->ent[i];
2321
2322 mlx5_ib_dbg(dev, "order %d, cache index %d\n", ent->order, i);
2323 @@ -816,11 +819,16 @@ static int get_octo_len(u64 addr, u64 len, int page_size)
2324 return (npages + 1) / 2;
2325 }
2326
2327 -static int use_umr(struct mlx5_ib_dev *dev, int order)
2328 +static int max_umr_order(struct mlx5_ib_dev *dev)
2329 {
2330 if (MLX5_CAP_GEN(dev->mdev, umr_extended_translation_offset))
2331 - return order <= MAX_UMR_CACHE_ENTRY + 2;
2332 - return order <= MLX5_MAX_UMR_SHIFT;
2333 + return MAX_UMR_CACHE_ENTRY + 2;
2334 + return MLX5_MAX_UMR_SHIFT;
2335 +}
2336 +
2337 +static int use_umr(struct mlx5_ib_dev *dev, int order)
2338 +{
2339 + return order <= max_umr_order(dev);
2340 }
2341
2342 static int mr_umem_get(struct ib_pd *pd, u64 start, u64 length,
2343 diff --git a/drivers/infiniband/hw/qib/qib_rc.c b/drivers/infiniband/hw/qib/qib_rc.c
2344 index 4ddbcac5eabe..e9a91736b12d 100644
2345 --- a/drivers/infiniband/hw/qib/qib_rc.c
2346 +++ b/drivers/infiniband/hw/qib/qib_rc.c
2347 @@ -348,7 +348,7 @@ int qib_make_rc_req(struct rvt_qp *qp, unsigned long *flags)
2348 case IB_WR_RDMA_WRITE:
2349 if (newreq && !(qp->s_flags & RVT_S_UNLIMITED_CREDIT))
2350 qp->s_lsn++;
2351 - /* FALLTHROUGH */
2352 + goto no_flow_control;
2353 case IB_WR_RDMA_WRITE_WITH_IMM:
2354 /* If no credit, return. */
2355 if (!(qp->s_flags & RVT_S_UNLIMITED_CREDIT) &&
2356 @@ -356,7 +356,7 @@ int qib_make_rc_req(struct rvt_qp *qp, unsigned long *flags)
2357 qp->s_flags |= RVT_S_WAIT_SSN_CREDIT;
2358 goto bail;
2359 }
2360 -
2361 +no_flow_control:
2362 ohdr->u.rc.reth.vaddr =
2363 cpu_to_be64(wqe->rdma_wr.remote_addr);
2364 ohdr->u.rc.reth.rkey =
2365 diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
2366 index ca0e19ae7a90..f6d0c8f51613 100644
2367 --- a/drivers/input/joystick/xpad.c
2368 +++ b/drivers/input/joystick/xpad.c
2369 @@ -1764,10 +1764,12 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
2370 struct usb_endpoint_descriptor *ep =
2371 &intf->cur_altsetting->endpoint[i].desc;
2372
2373 - if (usb_endpoint_dir_in(ep))
2374 - ep_irq_in = ep;
2375 - else
2376 - ep_irq_out = ep;
2377 + if (usb_endpoint_xfer_int(ep)) {
2378 + if (usb_endpoint_dir_in(ep))
2379 + ep_irq_in = ep;
2380 + else
2381 + ep_irq_out = ep;
2382 + }
2383 }
2384
2385 if (!ep_irq_in || !ep_irq_out) {
2386 diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
2387 index f932a83b4990..9125ad017eda 100644
2388 --- a/drivers/input/serio/i8042-x86ia64io.h
2389 +++ b/drivers/input/serio/i8042-x86ia64io.h
2390 @@ -839,6 +839,13 @@ static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = {
2391 DMI_MATCH(DMI_PRODUCT_NAME, "P34"),
2392 },
2393 },
2394 + {
2395 + /* Gigabyte P57 - Elantech touchpad */
2396 + .matches = {
2397 + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
2398 + DMI_MATCH(DMI_PRODUCT_NAME, "P57"),
2399 + },
2400 + },
2401 {
2402 /* Schenker XMG C504 - Elantech touchpad */
2403 .matches = {
2404 diff --git a/drivers/mailbox/bcm-flexrm-mailbox.c b/drivers/mailbox/bcm-flexrm-mailbox.c
2405 index da67882caa7b..0e298ed42ae0 100644
2406 --- a/drivers/mailbox/bcm-flexrm-mailbox.c
2407 +++ b/drivers/mailbox/bcm-flexrm-mailbox.c
2408 @@ -95,7 +95,7 @@
2409
2410 /* Register RING_CMPL_START_ADDR fields */
2411 #define CMPL_START_ADDR_VALUE(pa) \
2412 - ((u32)((((u64)(pa)) >> RING_CMPL_ALIGN_ORDER) & 0x03ffffff))
2413 + ((u32)((((u64)(pa)) >> RING_CMPL_ALIGN_ORDER) & 0x07ffffff))
2414
2415 /* Register RING_CONTROL fields */
2416 #define CONTROL_MASK_DISABLE_CONTROL 12
2417 diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h
2418 index dee542fff68e..2ed9bd231d84 100644
2419 --- a/drivers/md/bcache/bcache.h
2420 +++ b/drivers/md/bcache/bcache.h
2421 @@ -333,6 +333,7 @@ struct cached_dev {
2422 /* Limit number of writeback bios in flight */
2423 struct semaphore in_flight;
2424 struct task_struct *writeback_thread;
2425 + struct workqueue_struct *writeback_write_wq;
2426
2427 struct keybuf writeback_keys;
2428
2429 diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c
2430 index 019b3df9f1c6..4b413db99276 100644
2431 --- a/drivers/md/bcache/request.c
2432 +++ b/drivers/md/bcache/request.c
2433 @@ -196,12 +196,12 @@ static void bch_data_insert_start(struct closure *cl)
2434 struct data_insert_op *op = container_of(cl, struct data_insert_op, cl);
2435 struct bio *bio = op->bio, *n;
2436
2437 - if (atomic_sub_return(bio_sectors(bio), &op->c->sectors_to_gc) < 0)
2438 - wake_up_gc(op->c);
2439 -
2440 if (op->bypass)
2441 return bch_data_invalidate(cl);
2442
2443 + if (atomic_sub_return(bio_sectors(bio), &op->c->sectors_to_gc) < 0)
2444 + wake_up_gc(op->c);
2445 +
2446 /*
2447 * Journal writes are marked REQ_PREFLUSH; if the original write was a
2448 * flush, it'll wait on the journal write.
2449 @@ -400,12 +400,6 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio)
2450 if (!congested && !dc->sequential_cutoff)
2451 goto rescale;
2452
2453 - if (!congested &&
2454 - mode == CACHE_MODE_WRITEBACK &&
2455 - op_is_write(bio->bi_opf) &&
2456 - op_is_sync(bio->bi_opf))
2457 - goto rescale;
2458 -
2459 spin_lock(&dc->io_lock);
2460
2461 hlist_for_each_entry(i, iohash(dc, bio->bi_iter.bi_sector), hash)
2462 diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
2463 index 8352fad765f6..046fc5bddf54 100644
2464 --- a/drivers/md/bcache/super.c
2465 +++ b/drivers/md/bcache/super.c
2466 @@ -1026,7 +1026,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c)
2467 }
2468
2469 if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) {
2470 - bch_sectors_dirty_init(dc);
2471 + bch_sectors_dirty_init(&dc->disk);
2472 atomic_set(&dc->has_dirty, 1);
2473 atomic_inc(&dc->count);
2474 bch_writeback_queue(dc);
2475 @@ -1059,6 +1059,8 @@ static void cached_dev_free(struct closure *cl)
2476 cancel_delayed_work_sync(&dc->writeback_rate_update);
2477 if (!IS_ERR_OR_NULL(dc->writeback_thread))
2478 kthread_stop(dc->writeback_thread);
2479 + if (dc->writeback_write_wq)
2480 + destroy_workqueue(dc->writeback_write_wq);
2481
2482 mutex_lock(&bch_register_lock);
2483
2484 @@ -1228,6 +1230,7 @@ static int flash_dev_run(struct cache_set *c, struct uuid_entry *u)
2485 goto err;
2486
2487 bcache_device_attach(d, c, u - c->uuids);
2488 + bch_sectors_dirty_init(d);
2489 bch_flash_dev_request_init(d);
2490 add_disk(d->disk);
2491
2492 @@ -1964,6 +1967,8 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
2493 else
2494 err = "device busy";
2495 mutex_unlock(&bch_register_lock);
2496 + if (!IS_ERR(bdev))
2497 + bdput(bdev);
2498 if (attr == &ksysfs_register_quiet)
2499 goto out;
2500 }
2501 diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c
2502 index f90f13616980..ab2f8ce1e3bc 100644
2503 --- a/drivers/md/bcache/sysfs.c
2504 +++ b/drivers/md/bcache/sysfs.c
2505 @@ -192,7 +192,7 @@ STORE(__cached_dev)
2506 {
2507 struct cached_dev *dc = container_of(kobj, struct cached_dev,
2508 disk.kobj);
2509 - unsigned v = size;
2510 + ssize_t v = size;
2511 struct cache_set *c;
2512 struct kobj_uevent_env *env;
2513
2514 @@ -227,7 +227,7 @@ STORE(__cached_dev)
2515 bch_cached_dev_run(dc);
2516
2517 if (attr == &sysfs_cache_mode) {
2518 - ssize_t v = bch_read_string_list(buf, bch_cache_modes + 1);
2519 + v = bch_read_string_list(buf, bch_cache_modes + 1);
2520
2521 if (v < 0)
2522 return v;
2523 diff --git a/drivers/md/bcache/util.c b/drivers/md/bcache/util.c
2524 index 8c3a938f4bf0..176d3c2ef5f5 100644
2525 --- a/drivers/md/bcache/util.c
2526 +++ b/drivers/md/bcache/util.c
2527 @@ -74,24 +74,44 @@ STRTO_H(strtouint, unsigned int)
2528 STRTO_H(strtoll, long long)
2529 STRTO_H(strtoull, unsigned long long)
2530
2531 +/**
2532 + * bch_hprint() - formats @v to human readable string for sysfs.
2533 + *
2534 + * @v - signed 64 bit integer
2535 + * @buf - the (at least 8 byte) buffer to format the result into.
2536 + *
2537 + * Returns the number of bytes used by format.
2538 + */
2539 ssize_t bch_hprint(char *buf, int64_t v)
2540 {
2541 static const char units[] = "?kMGTPEZY";
2542 - char dec[4] = "";
2543 - int u, t = 0;
2544 -
2545 - for (u = 0; v >= 1024 || v <= -1024; u++) {
2546 - t = v & ~(~0 << 10);
2547 - v >>= 10;
2548 - }
2549 -
2550 - if (!u)
2551 - return sprintf(buf, "%llu", v);
2552 -
2553 - if (v < 100 && v > -100)
2554 - snprintf(dec, sizeof(dec), ".%i", t / 100);
2555 -
2556 - return sprintf(buf, "%lli%s%c", v, dec, units[u]);
2557 + int u = 0, t;
2558 +
2559 + uint64_t q;
2560 +
2561 + if (v < 0)
2562 + q = -v;
2563 + else
2564 + q = v;
2565 +
2566 + /* For as long as the number is more than 3 digits, but at least
2567 + * once, shift right / divide by 1024. Keep the remainder for
2568 + * a digit after the decimal point.
2569 + */
2570 + do {
2571 + u++;
2572 +
2573 + t = q & ~(~0 << 10);
2574 + q >>= 10;
2575 + } while (q >= 1000);
2576 +
2577 + if (v < 0)
2578 + /* '-', up to 3 digits, '.', 1 digit, 1 character, null;
2579 + * yields 8 bytes.
2580 + */
2581 + return sprintf(buf, "-%llu.%i%c", q, t * 10 / 1024, units[u]);
2582 + else
2583 + return sprintf(buf, "%llu.%i%c", q, t * 10 / 1024, units[u]);
2584 }
2585
2586 ssize_t bch_snprint_string_list(char *buf, size_t size, const char * const list[],
2587 diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c
2588 index 42c66e76f05e..a635d6ac7fde 100644
2589 --- a/drivers/md/bcache/writeback.c
2590 +++ b/drivers/md/bcache/writeback.c
2591 @@ -21,7 +21,8 @@
2592 static void __update_writeback_rate(struct cached_dev *dc)
2593 {
2594 struct cache_set *c = dc->disk.c;
2595 - uint64_t cache_sectors = c->nbuckets * c->sb.bucket_size;
2596 + uint64_t cache_sectors = c->nbuckets * c->sb.bucket_size -
2597 + bcache_flash_devs_sectors_dirty(c);
2598 uint64_t cache_dirty_target =
2599 div_u64(cache_sectors * dc->writeback_percent, 100);
2600
2601 @@ -186,7 +187,7 @@ static void write_dirty(struct closure *cl)
2602
2603 closure_bio_submit(&io->bio, cl);
2604
2605 - continue_at(cl, write_dirty_finish, system_wq);
2606 + continue_at(cl, write_dirty_finish, io->dc->writeback_write_wq);
2607 }
2608
2609 static void read_dirty_endio(struct bio *bio)
2610 @@ -206,7 +207,7 @@ static void read_dirty_submit(struct closure *cl)
2611
2612 closure_bio_submit(&io->bio, cl);
2613
2614 - continue_at(cl, write_dirty, system_wq);
2615 + continue_at(cl, write_dirty, io->dc->writeback_write_wq);
2616 }
2617
2618 static void read_dirty(struct cached_dev *dc)
2619 @@ -482,17 +483,17 @@ static int sectors_dirty_init_fn(struct btree_op *_op, struct btree *b,
2620 return MAP_CONTINUE;
2621 }
2622
2623 -void bch_sectors_dirty_init(struct cached_dev *dc)
2624 +void bch_sectors_dirty_init(struct bcache_device *d)
2625 {
2626 struct sectors_dirty_init op;
2627
2628 bch_btree_op_init(&op.op, -1);
2629 - op.inode = dc->disk.id;
2630 + op.inode = d->id;
2631
2632 - bch_btree_map_keys(&op.op, dc->disk.c, &KEY(op.inode, 0, 0),
2633 + bch_btree_map_keys(&op.op, d->c, &KEY(op.inode, 0, 0),
2634 sectors_dirty_init_fn, 0);
2635
2636 - dc->disk.sectors_dirty_last = bcache_dev_sectors_dirty(&dc->disk);
2637 + d->sectors_dirty_last = bcache_dev_sectors_dirty(d);
2638 }
2639
2640 void bch_cached_dev_writeback_init(struct cached_dev *dc)
2641 @@ -516,6 +517,11 @@ void bch_cached_dev_writeback_init(struct cached_dev *dc)
2642
2643 int bch_cached_dev_writeback_start(struct cached_dev *dc)
2644 {
2645 + dc->writeback_write_wq = alloc_workqueue("bcache_writeback_wq",
2646 + WQ_MEM_RECLAIM, 0);
2647 + if (!dc->writeback_write_wq)
2648 + return -ENOMEM;
2649 +
2650 dc->writeback_thread = kthread_create(bch_writeback_thread, dc,
2651 "bcache_writeback");
2652 if (IS_ERR(dc->writeback_thread))
2653 diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h
2654 index 629bd1a502fd..e35421d20d2e 100644
2655 --- a/drivers/md/bcache/writeback.h
2656 +++ b/drivers/md/bcache/writeback.h
2657 @@ -14,6 +14,25 @@ static inline uint64_t bcache_dev_sectors_dirty(struct bcache_device *d)
2658 return ret;
2659 }
2660
2661 +static inline uint64_t bcache_flash_devs_sectors_dirty(struct cache_set *c)
2662 +{
2663 + uint64_t i, ret = 0;
2664 +
2665 + mutex_lock(&bch_register_lock);
2666 +
2667 + for (i = 0; i < c->nr_uuids; i++) {
2668 + struct bcache_device *d = c->devices[i];
2669 +
2670 + if (!d || !UUID_FLASH_ONLY(&c->uuids[i]))
2671 + continue;
2672 + ret += bcache_dev_sectors_dirty(d);
2673 + }
2674 +
2675 + mutex_unlock(&bch_register_lock);
2676 +
2677 + return ret;
2678 +}
2679 +
2680 static inline unsigned offset_to_stripe(struct bcache_device *d,
2681 uint64_t offset)
2682 {
2683 @@ -84,7 +103,7 @@ static inline void bch_writeback_add(struct cached_dev *dc)
2684
2685 void bcache_dev_sectors_dirty_add(struct cache_set *, unsigned, uint64_t, int);
2686
2687 -void bch_sectors_dirty_init(struct cached_dev *dc);
2688 +void bch_sectors_dirty_init(struct bcache_device *);
2689 void bch_cached_dev_writeback_init(struct cached_dev *);
2690 int bch_cached_dev_writeback_start(struct cached_dev *);
2691
2692 diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
2693 index 40f3cd7eab0f..d2121637b4ab 100644
2694 --- a/drivers/md/bitmap.c
2695 +++ b/drivers/md/bitmap.c
2696 @@ -625,7 +625,7 @@ static int bitmap_read_sb(struct bitmap *bitmap)
2697 err = read_sb_page(bitmap->mddev,
2698 offset,
2699 sb_page,
2700 - 0, sizeof(bitmap_super_t));
2701 + 0, PAGE_SIZE);
2702 }
2703 if (err)
2704 return err;
2705 @@ -2058,6 +2058,11 @@ int bitmap_resize(struct bitmap *bitmap, sector_t blocks,
2706 long pages;
2707 struct bitmap_page *new_bp;
2708
2709 + if (bitmap->storage.file && !init) {
2710 + pr_info("md: cannot resize file-based bitmap\n");
2711 + return -EINVAL;
2712 + }
2713 +
2714 if (chunksize == 0) {
2715 /* If there is enough space, leave the chunk size unchanged,
2716 * else increase by factor of two until there is enough space.
2717 @@ -2118,7 +2123,7 @@ int bitmap_resize(struct bitmap *bitmap, sector_t blocks,
2718 if (store.sb_page && bitmap->storage.sb_page)
2719 memcpy(page_address(store.sb_page),
2720 page_address(bitmap->storage.sb_page),
2721 - sizeof(bitmap_super_t));
2722 + PAGE_SIZE);
2723 bitmap_file_unmap(&bitmap->storage);
2724 bitmap->storage = store;
2725
2726 diff --git a/drivers/media/i2c/adv7180.c b/drivers/media/i2c/adv7180.c
2727 index 78de7ddf5081..3df28f2f9b38 100644
2728 --- a/drivers/media/i2c/adv7180.c
2729 +++ b/drivers/media/i2c/adv7180.c
2730 @@ -1402,6 +1402,8 @@ static int adv7180_remove(struct i2c_client *client)
2731
2732 static const struct i2c_device_id adv7180_id[] = {
2733 { "adv7180", (kernel_ulong_t)&adv7180_info },
2734 + { "adv7180cp", (kernel_ulong_t)&adv7180_info },
2735 + { "adv7180st", (kernel_ulong_t)&adv7180_info },
2736 { "adv7182", (kernel_ulong_t)&adv7182_info },
2737 { "adv7280", (kernel_ulong_t)&adv7280_info },
2738 { "adv7280-m", (kernel_ulong_t)&adv7280_m_info },
2739 diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
2740 index 5f4434c0a8f1..2d6187904552 100644
2741 --- a/drivers/media/platform/qcom/venus/helpers.c
2742 +++ b/drivers/media/platform/qcom/venus/helpers.c
2743 @@ -243,7 +243,7 @@ static void return_buf_error(struct venus_inst *inst,
2744 if (vbuf->vb2_buf.type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
2745 v4l2_m2m_src_buf_remove_by_buf(m2m_ctx, vbuf);
2746 else
2747 - v4l2_m2m_src_buf_remove_by_buf(m2m_ctx, vbuf);
2748 + v4l2_m2m_dst_buf_remove_by_buf(m2m_ctx, vbuf);
2749
2750 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
2751 }
2752 diff --git a/drivers/media/rc/lirc_dev.c b/drivers/media/rc/lirc_dev.c
2753 index db1e7b70c998..9080e39ea391 100644
2754 --- a/drivers/media/rc/lirc_dev.c
2755 +++ b/drivers/media/rc/lirc_dev.c
2756 @@ -59,6 +59,8 @@ static void lirc_release(struct device *ld)
2757 {
2758 struct irctl *ir = container_of(ld, struct irctl, dev);
2759
2760 + put_device(ir->dev.parent);
2761 +
2762 if (ir->buf_internal) {
2763 lirc_buffer_free(ir->buf);
2764 kfree(ir->buf);
2765 @@ -218,6 +220,8 @@ int lirc_register_driver(struct lirc_driver *d)
2766
2767 mutex_unlock(&lirc_dev_lock);
2768
2769 + get_device(ir->dev.parent);
2770 +
2771 dev_info(ir->d.dev, "lirc_dev: driver %s registered at minor = %d\n",
2772 ir->d.name, ir->d.minor);
2773
2774 diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
2775 index c2ee6e39fd0c..20397aba6849 100644
2776 --- a/drivers/media/usb/uvc/uvc_ctrl.c
2777 +++ b/drivers/media/usb/uvc/uvc_ctrl.c
2778 @@ -2002,6 +2002,13 @@ int uvc_ctrl_add_mapping(struct uvc_video_chain *chain,
2779 goto done;
2780 }
2781
2782 + /* Validate the user-provided bit-size and offset */
2783 + if (mapping->size > 32 ||
2784 + mapping->offset + mapping->size > ctrl->info.size * 8) {
2785 + ret = -EINVAL;
2786 + goto done;
2787 + }
2788 +
2789 list_for_each_entry(map, &ctrl->info.mappings, list) {
2790 if (mapping->id == map->id) {
2791 uvc_trace(UVC_TRACE_CONTROL, "Can't add mapping '%s', "
2792 diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
2793 index 6f52970f8b54..0c14e995667c 100644
2794 --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
2795 +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
2796 @@ -796,7 +796,8 @@ static int put_v4l2_event32(struct v4l2_event *kp, struct v4l2_event32 __user *u
2797 copy_to_user(&up->u, &kp->u, sizeof(kp->u)) ||
2798 put_user(kp->pending, &up->pending) ||
2799 put_user(kp->sequence, &up->sequence) ||
2800 - compat_put_timespec(&kp->timestamp, &up->timestamp) ||
2801 + put_user(kp->timestamp.tv_sec, &up->timestamp.tv_sec) ||
2802 + put_user(kp->timestamp.tv_nsec, &up->timestamp.tv_nsec) ||
2803 put_user(kp->id, &up->id) ||
2804 copy_to_user(up->reserved, kp->reserved, 8 * sizeof(__u32)))
2805 return -EFAULT;
2806 diff --git a/drivers/misc/cxl/api.c b/drivers/misc/cxl/api.c
2807 index 1a138c83f877..a0c44d16bf30 100644
2808 --- a/drivers/misc/cxl/api.c
2809 +++ b/drivers/misc/cxl/api.c
2810 @@ -336,6 +336,10 @@ int cxl_start_context(struct cxl_context *ctx, u64 wed,
2811 mmput(ctx->mm);
2812 }
2813
2814 + /*
2815 + * Increment driver use count. Enables global TLBIs for hash
2816 + * and callbacks to handle the segment table
2817 + */
2818 cxl_ctx_get();
2819
2820 if ((rc = cxl_ops->attach_process(ctx, kernel, wed, 0))) {
2821 diff --git a/drivers/misc/cxl/file.c b/drivers/misc/cxl/file.c
2822 index 0761271d68c5..4bfad9f6dc9f 100644
2823 --- a/drivers/misc/cxl/file.c
2824 +++ b/drivers/misc/cxl/file.c
2825 @@ -95,7 +95,6 @@ static int __afu_open(struct inode *inode, struct file *file, bool master)
2826
2827 pr_devel("afu_open pe: %i\n", ctx->pe);
2828 file->private_data = ctx;
2829 - cxl_ctx_get();
2830
2831 /* indicate success */
2832 rc = 0;
2833 @@ -225,6 +224,12 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
2834 if (ctx->mm)
2835 mmput(ctx->mm);
2836
2837 + /*
2838 + * Increment driver use count. Enables global TLBIs for hash
2839 + * and callbacks to handle the segment table
2840 + */
2841 + cxl_ctx_get();
2842 +
2843 trace_cxl_attach(ctx, work.work_element_descriptor, work.num_interrupts, amr);
2844
2845 if ((rc = cxl_ops->attach_process(ctx, false, work.work_element_descriptor,
2846 @@ -233,6 +238,7 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
2847 cxl_adapter_context_put(ctx->afu->adapter);
2848 put_pid(ctx->pid);
2849 ctx->pid = NULL;
2850 + cxl_ctx_put();
2851 cxl_context_mm_count_put(ctx);
2852 goto out;
2853 }
2854 diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
2855 index 517a315e259b..35bd50bcbbd5 100644
2856 --- a/drivers/net/wireless/ath/wcn36xx/main.c
2857 +++ b/drivers/net/wireless/ath/wcn36xx/main.c
2858 @@ -372,6 +372,8 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed)
2859
2860 wcn36xx_dbg(WCN36XX_DBG_MAC, "mac config changed 0x%08x\n", changed);
2861
2862 + mutex_lock(&wcn->conf_mutex);
2863 +
2864 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
2865 int ch = WCN36XX_HW_CHANNEL(wcn);
2866 wcn36xx_dbg(WCN36XX_DBG_MAC, "wcn36xx_config channel switch=%d\n",
2867 @@ -382,6 +384,8 @@ static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed)
2868 }
2869 }
2870
2871 + mutex_unlock(&wcn->conf_mutex);
2872 +
2873 return 0;
2874 }
2875
2876 @@ -396,6 +400,8 @@ static void wcn36xx_configure_filter(struct ieee80211_hw *hw,
2877
2878 wcn36xx_dbg(WCN36XX_DBG_MAC, "mac configure filter\n");
2879
2880 + mutex_lock(&wcn->conf_mutex);
2881 +
2882 *total &= FIF_ALLMULTI;
2883
2884 fp = (void *)(unsigned long)multicast;
2885 @@ -408,6 +414,8 @@ static void wcn36xx_configure_filter(struct ieee80211_hw *hw,
2886 else if (NL80211_IFTYPE_STATION == vif->type && tmp->sta_assoc)
2887 wcn36xx_smd_set_mc_list(wcn, vif, fp);
2888 }
2889 +
2890 + mutex_unlock(&wcn->conf_mutex);
2891 kfree(fp);
2892 }
2893
2894 @@ -471,6 +479,8 @@ static int wcn36xx_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2895 key_conf->key,
2896 key_conf->keylen);
2897
2898 + mutex_lock(&wcn->conf_mutex);
2899 +
2900 switch (key_conf->cipher) {
2901 case WLAN_CIPHER_SUITE_WEP40:
2902 vif_priv->encrypt_type = WCN36XX_HAL_ED_WEP40;
2903 @@ -565,6 +575,8 @@ static int wcn36xx_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2904 }
2905
2906 out:
2907 + mutex_unlock(&wcn->conf_mutex);
2908 +
2909 return ret;
2910 }
2911
2912 @@ -725,6 +737,8 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
2913 wcn36xx_dbg(WCN36XX_DBG_MAC, "mac bss info changed vif %p changed 0x%08x\n",
2914 vif, changed);
2915
2916 + mutex_lock(&wcn->conf_mutex);
2917 +
2918 if (changed & BSS_CHANGED_BEACON_INFO) {
2919 wcn36xx_dbg(WCN36XX_DBG_MAC,
2920 "mac bss changed dtim period %d\n",
2921 @@ -787,7 +801,13 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
2922 bss_conf->aid);
2923
2924 vif_priv->sta_assoc = true;
2925 - rcu_read_lock();
2926 +
2927 + /*
2928 + * Holding conf_mutex ensures mutal exclusion with
2929 + * wcn36xx_sta_remove() and as such ensures that sta
2930 + * won't be freed while we're operating on it. As such
2931 + * we do not need to hold the rcu_read_lock().
2932 + */
2933 sta = ieee80211_find_sta(vif, bss_conf->bssid);
2934 if (!sta) {
2935 wcn36xx_err("sta %pM is not found\n",
2936 @@ -811,7 +831,6 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
2937 * place where AID is available.
2938 */
2939 wcn36xx_smd_config_sta(wcn, vif, sta);
2940 - rcu_read_unlock();
2941 } else {
2942 wcn36xx_dbg(WCN36XX_DBG_MAC,
2943 "disassociated bss %pM vif %pM AID=%d\n",
2944 @@ -873,6 +892,9 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
2945 }
2946 }
2947 out:
2948 +
2949 + mutex_unlock(&wcn->conf_mutex);
2950 +
2951 return;
2952 }
2953
2954 @@ -882,7 +904,10 @@ static int wcn36xx_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
2955 struct wcn36xx *wcn = hw->priv;
2956 wcn36xx_dbg(WCN36XX_DBG_MAC, "mac set RTS threshold %d\n", value);
2957
2958 + mutex_lock(&wcn->conf_mutex);
2959 wcn36xx_smd_update_cfg(wcn, WCN36XX_HAL_CFG_RTS_THRESHOLD, value);
2960 + mutex_unlock(&wcn->conf_mutex);
2961 +
2962 return 0;
2963 }
2964
2965 @@ -893,8 +918,12 @@ static void wcn36xx_remove_interface(struct ieee80211_hw *hw,
2966 struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif);
2967 wcn36xx_dbg(WCN36XX_DBG_MAC, "mac remove interface vif %p\n", vif);
2968
2969 + mutex_lock(&wcn->conf_mutex);
2970 +
2971 list_del(&vif_priv->list);
2972 wcn36xx_smd_delete_sta_self(wcn, vif->addr);
2973 +
2974 + mutex_unlock(&wcn->conf_mutex);
2975 }
2976
2977 static int wcn36xx_add_interface(struct ieee80211_hw *hw,
2978 @@ -915,9 +944,13 @@ static int wcn36xx_add_interface(struct ieee80211_hw *hw,
2979 return -EOPNOTSUPP;
2980 }
2981
2982 + mutex_lock(&wcn->conf_mutex);
2983 +
2984 list_add(&vif_priv->list, &wcn->vif_list);
2985 wcn36xx_smd_add_sta_self(wcn, vif);
2986
2987 + mutex_unlock(&wcn->conf_mutex);
2988 +
2989 return 0;
2990 }
2991
2992 @@ -930,6 +963,8 @@ static int wcn36xx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2993 wcn36xx_dbg(WCN36XX_DBG_MAC, "mac sta add vif %p sta %pM\n",
2994 vif, sta->addr);
2995
2996 + mutex_lock(&wcn->conf_mutex);
2997 +
2998 spin_lock_init(&sta_priv->ampdu_lock);
2999 sta_priv->vif = vif_priv;
3000 /*
3001 @@ -941,6 +976,9 @@ static int wcn36xx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
3002 sta_priv->aid = sta->aid;
3003 wcn36xx_smd_config_sta(wcn, vif, sta);
3004 }
3005 +
3006 + mutex_unlock(&wcn->conf_mutex);
3007 +
3008 return 0;
3009 }
3010
3011 @@ -954,8 +992,13 @@ static int wcn36xx_sta_remove(struct ieee80211_hw *hw,
3012 wcn36xx_dbg(WCN36XX_DBG_MAC, "mac sta remove vif %p sta %pM index %d\n",
3013 vif, sta->addr, sta_priv->sta_index);
3014
3015 + mutex_lock(&wcn->conf_mutex);
3016 +
3017 wcn36xx_smd_delete_sta(wcn, sta_priv->sta_index);
3018 sta_priv->vif = NULL;
3019 +
3020 + mutex_unlock(&wcn->conf_mutex);
3021 +
3022 return 0;
3023 }
3024
3025 @@ -999,6 +1042,8 @@ static int wcn36xx_ampdu_action(struct ieee80211_hw *hw,
3026 wcn36xx_dbg(WCN36XX_DBG_MAC, "mac ampdu action action %d tid %d\n",
3027 action, tid);
3028
3029 + mutex_lock(&wcn->conf_mutex);
3030 +
3031 switch (action) {
3032 case IEEE80211_AMPDU_RX_START:
3033 sta_priv->tid = tid;
3034 @@ -1038,6 +1083,8 @@ static int wcn36xx_ampdu_action(struct ieee80211_hw *hw,
3035 wcn36xx_err("Unknown AMPDU action\n");
3036 }
3037
3038 + mutex_unlock(&wcn->conf_mutex);
3039 +
3040 return 0;
3041 }
3042
3043 @@ -1216,6 +1263,7 @@ static int wcn36xx_probe(struct platform_device *pdev)
3044 wcn = hw->priv;
3045 wcn->hw = hw;
3046 wcn->dev = &pdev->dev;
3047 + mutex_init(&wcn->conf_mutex);
3048 mutex_init(&wcn->hal_mutex);
3049 mutex_init(&wcn->scan_lock);
3050
3051 diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
3052 index b52b4da9a967..6aefba4c0cda 100644
3053 --- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
3054 +++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
3055 @@ -202,6 +202,9 @@ struct wcn36xx {
3056 struct qcom_smem_state *tx_rings_empty_state;
3057 unsigned tx_rings_empty_state_bit;
3058
3059 + /* prevents concurrent FW reconfiguration */
3060 + struct mutex conf_mutex;
3061 +
3062 /*
3063 * smd_buf must be protected with smd_mutex to garantee
3064 * that all messages are sent one after another
3065 diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
3066 index 3ee6767392b6..d25bad052d78 100644
3067 --- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
3068 +++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
3069 @@ -79,6 +79,7 @@
3070 /* NVM offsets (in words) definitions */
3071 enum wkp_nvm_offsets {
3072 /* NVM HW-Section offset (in words) definitions */
3073 + SUBSYSTEM_ID = 0x0A,
3074 HW_ADDR = 0x15,
3075
3076 /* NVM SW-Section offset (in words) definitions */
3077 @@ -254,13 +255,12 @@ static u32 iwl_get_channel_flags(u8 ch_num, int ch_idx, bool is_5ghz,
3078 static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
3079 struct iwl_nvm_data *data,
3080 const __le16 * const nvm_ch_flags,
3081 - bool lar_supported)
3082 + bool lar_supported, bool no_wide_in_5ghz)
3083 {
3084 int ch_idx;
3085 int n_channels = 0;
3086 struct ieee80211_channel *channel;
3087 u16 ch_flags;
3088 - bool is_5ghz;
3089 int num_of_ch, num_2ghz_channels;
3090 const u8 *nvm_chan;
3091
3092 @@ -275,12 +275,20 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
3093 }
3094
3095 for (ch_idx = 0; ch_idx < num_of_ch; ch_idx++) {
3096 + bool is_5ghz = (ch_idx >= num_2ghz_channels);
3097 +
3098 ch_flags = __le16_to_cpup(nvm_ch_flags + ch_idx);
3099
3100 - if (ch_idx >= num_2ghz_channels &&
3101 - !data->sku_cap_band_52GHz_enable)
3102 + if (is_5ghz && !data->sku_cap_band_52GHz_enable)
3103 continue;
3104
3105 + /* workaround to disable wide channels in 5GHz */
3106 + if (no_wide_in_5ghz && is_5ghz) {
3107 + ch_flags &= ~(NVM_CHANNEL_40MHZ |
3108 + NVM_CHANNEL_80MHZ |
3109 + NVM_CHANNEL_160MHZ);
3110 + }
3111 +
3112 if (ch_flags & NVM_CHANNEL_160MHZ)
3113 data->vht160_supported = true;
3114
3115 @@ -303,8 +311,8 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
3116 n_channels++;
3117
3118 channel->hw_value = nvm_chan[ch_idx];
3119 - channel->band = (ch_idx < num_2ghz_channels) ?
3120 - NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
3121 + channel->band = is_5ghz ?
3122 + NL80211_BAND_5GHZ : NL80211_BAND_2GHZ;
3123 channel->center_freq =
3124 ieee80211_channel_to_frequency(
3125 channel->hw_value, channel->band);
3126 @@ -316,7 +324,6 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
3127 * is not used in mvm, and is used for backwards compatibility
3128 */
3129 channel->max_power = IWL_DEFAULT_MAX_TX_POWER;
3130 - is_5ghz = channel->band == NL80211_BAND_5GHZ;
3131
3132 /* don't put limitations in case we're using LAR */
3133 if (!lar_supported)
3134 @@ -432,14 +439,15 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
3135
3136 void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
3137 struct iwl_nvm_data *data, const __le16 *nvm_ch_flags,
3138 - u8 tx_chains, u8 rx_chains, bool lar_supported)
3139 + u8 tx_chains, u8 rx_chains, bool lar_supported,
3140 + bool no_wide_in_5ghz)
3141 {
3142 int n_channels;
3143 int n_used = 0;
3144 struct ieee80211_supported_band *sband;
3145
3146 n_channels = iwl_init_channel_map(dev, cfg, data, nvm_ch_flags,
3147 - lar_supported);
3148 + lar_supported, no_wide_in_5ghz);
3149 sband = &data->bands[NL80211_BAND_2GHZ];
3150 sband->band = NL80211_BAND_2GHZ;
3151 sband->bitrates = &iwl_cfg80211_rates[RATES_24_OFFS];
3152 @@ -645,6 +653,39 @@ static int iwl_set_hw_address(struct iwl_trans *trans,
3153 return 0;
3154 }
3155
3156 +static bool
3157 +iwl_nvm_no_wide_in_5ghz(struct device *dev, const struct iwl_cfg *cfg,
3158 + const __le16 *nvm_hw)
3159 +{
3160 + /*
3161 + * Workaround a bug in Indonesia SKUs where the regulatory in
3162 + * some 7000-family OTPs erroneously allow wide channels in
3163 + * 5GHz. To check for Indonesia, we take the SKU value from
3164 + * bits 1-4 in the subsystem ID and check if it is either 5 or
3165 + * 9. In those cases, we need to force-disable wide channels
3166 + * in 5GHz otherwise the FW will throw a sysassert when we try
3167 + * to use them.
3168 + */
3169 + if (cfg->device_family == IWL_DEVICE_FAMILY_7000) {
3170 + /*
3171 + * Unlike the other sections in the NVM, the hw
3172 + * section uses big-endian.
3173 + */
3174 + u16 subsystem_id = be16_to_cpup((const __be16 *)nvm_hw
3175 + + SUBSYSTEM_ID);
3176 + u8 sku = (subsystem_id & 0x1e) >> 1;
3177 +
3178 + if (sku == 5 || sku == 9) {
3179 + IWL_DEBUG_EEPROM(dev,
3180 + "disabling wide channels in 5GHz (0x%0x %d)\n",
3181 + subsystem_id, sku);
3182 + return true;
3183 + }
3184 + }
3185 +
3186 + return false;
3187 +}
3188 +
3189 struct iwl_nvm_data *
3190 iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
3191 const __le16 *nvm_hw, const __le16 *nvm_sw,
3192 @@ -655,6 +696,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
3193 struct device *dev = trans->dev;
3194 struct iwl_nvm_data *data;
3195 bool lar_enabled;
3196 + bool no_wide_in_5ghz = iwl_nvm_no_wide_in_5ghz(dev, cfg, nvm_hw);
3197 u32 sku, radio_cfg;
3198 u16 lar_config;
3199 const __le16 *ch_section;
3200 @@ -725,7 +767,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
3201 }
3202
3203 iwl_init_sbands(dev, cfg, data, ch_section, tx_chains, rx_chains,
3204 - lar_fw_supported && lar_enabled);
3205 + lar_fw_supported && lar_enabled, no_wide_in_5ghz);
3206 data->calib_version = 255;
3207
3208 return data;
3209 diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
3210 index 3fd6506a02ab..50d9b3eaa4f8 100644
3211 --- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
3212 +++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
3213 @@ -93,7 +93,8 @@ void iwl_set_hw_address_from_csr(struct iwl_trans *trans,
3214 */
3215 void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
3216 struct iwl_nvm_data *data, const __le16 *nvm_ch_flags,
3217 - u8 tx_chains, u8 rx_chains, bool lar_supported);
3218 + u8 tx_chains, u8 rx_chains, bool lar_supported,
3219 + bool no_wide_in_5ghz);
3220
3221 /**
3222 * iwl_parse_mcc_info - parse MCC (mobile country code) info coming from FW
3223 diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
3224 index dac7e542a190..4de565cec747 100644
3225 --- a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
3226 +++ b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
3227 @@ -628,7 +628,8 @@ int iwl_mvm_nvm_get_from_fw(struct iwl_mvm *mvm)
3228 rsp->regulatory.channel_profile,
3229 mvm->nvm_data->valid_tx_ant & mvm->fw->valid_tx_ant,
3230 mvm->nvm_data->valid_rx_ant & mvm->fw->valid_rx_ant,
3231 - rsp->regulatory.lar_enabled && lar_fw_supported);
3232 + rsp->regulatory.lar_enabled && lar_fw_supported,
3233 + false);
3234
3235 iwl_free_resp(&hcmd);
3236 return 0;
3237 diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c
3238 index 026830a138ae..e5d5ce9e3010 100644
3239 --- a/drivers/pci/hotplug/pciehp_hpc.c
3240 +++ b/drivers/pci/hotplug/pciehp_hpc.c
3241 @@ -586,6 +586,14 @@ static irqreturn_t pciehp_isr(int irq, void *dev_id)
3242 events = status & (PCI_EXP_SLTSTA_ABP | PCI_EXP_SLTSTA_PFD |
3243 PCI_EXP_SLTSTA_PDC | PCI_EXP_SLTSTA_CC |
3244 PCI_EXP_SLTSTA_DLLSC);
3245 +
3246 + /*
3247 + * If we've already reported a power fault, don't report it again
3248 + * until we've done something to handle it.
3249 + */
3250 + if (ctrl->power_fault_detected)
3251 + events &= ~PCI_EXP_SLTSTA_PFD;
3252 +
3253 if (!events)
3254 return IRQ_NONE;
3255
3256 diff --git a/drivers/pci/hotplug/shpchp_hpc.c b/drivers/pci/hotplug/shpchp_hpc.c
3257 index de0ea474fb73..e5824c7b7b6b 100644
3258 --- a/drivers/pci/hotplug/shpchp_hpc.c
3259 +++ b/drivers/pci/hotplug/shpchp_hpc.c
3260 @@ -1062,6 +1062,8 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
3261 if (rc) {
3262 ctrl_info(ctrl, "Can't get msi for the hotplug controller\n");
3263 ctrl_info(ctrl, "Use INTx for the hotplug controller\n");
3264 + } else {
3265 + pci_set_master(pdev);
3266 }
3267
3268 rc = request_irq(ctrl->pci_dev->irq, shpc_isr, IRQF_SHARED,
3269 diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
3270 index e6779d4352a2..7c30fd986560 100644
3271 --- a/drivers/pinctrl/pinctrl-amd.c
3272 +++ b/drivers/pinctrl/pinctrl-amd.c
3273 @@ -36,6 +36,7 @@
3274 #include <linux/pinctrl/pinconf.h>
3275 #include <linux/pinctrl/pinconf-generic.h>
3276
3277 +#include "core.h"
3278 #include "pinctrl-utils.h"
3279 #include "pinctrl-amd.h"
3280
3281 @@ -725,6 +726,69 @@ static const struct pinconf_ops amd_pinconf_ops = {
3282 .pin_config_group_set = amd_pinconf_group_set,
3283 };
3284
3285 +#ifdef CONFIG_PM_SLEEP
3286 +static bool amd_gpio_should_save(struct amd_gpio *gpio_dev, unsigned int pin)
3287 +{
3288 + const struct pin_desc *pd = pin_desc_get(gpio_dev->pctrl, pin);
3289 +
3290 + if (!pd)
3291 + return false;
3292 +
3293 + /*
3294 + * Only restore the pin if it is actually in use by the kernel (or
3295 + * by userspace).
3296 + */
3297 + if (pd->mux_owner || pd->gpio_owner ||
3298 + gpiochip_line_is_irq(&gpio_dev->gc, pin))
3299 + return true;
3300 +
3301 + return false;
3302 +}
3303 +
3304 +int amd_gpio_suspend(struct device *dev)
3305 +{
3306 + struct platform_device *pdev = to_platform_device(dev);
3307 + struct amd_gpio *gpio_dev = platform_get_drvdata(pdev);
3308 + struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
3309 + int i;
3310 +
3311 + for (i = 0; i < desc->npins; i++) {
3312 + int pin = desc->pins[i].number;
3313 +
3314 + if (!amd_gpio_should_save(gpio_dev, pin))
3315 + continue;
3316 +
3317 + gpio_dev->saved_regs[i] = readl(gpio_dev->base + pin*4);
3318 + }
3319 +
3320 + return 0;
3321 +}
3322 +
3323 +int amd_gpio_resume(struct device *dev)
3324 +{
3325 + struct platform_device *pdev = to_platform_device(dev);
3326 + struct amd_gpio *gpio_dev = platform_get_drvdata(pdev);
3327 + struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
3328 + int i;
3329 +
3330 + for (i = 0; i < desc->npins; i++) {
3331 + int pin = desc->pins[i].number;
3332 +
3333 + if (!amd_gpio_should_save(gpio_dev, pin))
3334 + continue;
3335 +
3336 + writel(gpio_dev->saved_regs[i], gpio_dev->base + pin*4);
3337 + }
3338 +
3339 + return 0;
3340 +}
3341 +
3342 +static const struct dev_pm_ops amd_gpio_pm_ops = {
3343 + SET_LATE_SYSTEM_SLEEP_PM_OPS(amd_gpio_suspend,
3344 + amd_gpio_resume)
3345 +};
3346 +#endif
3347 +
3348 static struct pinctrl_desc amd_pinctrl_desc = {
3349 .pins = kerncz_pins,
3350 .npins = ARRAY_SIZE(kerncz_pins),
3351 @@ -764,6 +828,14 @@ static int amd_gpio_probe(struct platform_device *pdev)
3352 return -EINVAL;
3353 }
3354
3355 +#ifdef CONFIG_PM_SLEEP
3356 + gpio_dev->saved_regs = devm_kcalloc(&pdev->dev, amd_pinctrl_desc.npins,
3357 + sizeof(*gpio_dev->saved_regs),
3358 + GFP_KERNEL);
3359 + if (!gpio_dev->saved_regs)
3360 + return -ENOMEM;
3361 +#endif
3362 +
3363 gpio_dev->pdev = pdev;
3364 gpio_dev->gc.direction_input = amd_gpio_direction_input;
3365 gpio_dev->gc.direction_output = amd_gpio_direction_output;
3366 @@ -853,6 +925,9 @@ static struct platform_driver amd_gpio_driver = {
3367 .driver = {
3368 .name = "amd_gpio",
3369 .acpi_match_table = ACPI_PTR(amd_gpio_acpi_match),
3370 +#ifdef CONFIG_PM_SLEEP
3371 + .pm = &amd_gpio_pm_ops,
3372 +#endif
3373 },
3374 .probe = amd_gpio_probe,
3375 .remove = amd_gpio_remove,
3376 diff --git a/drivers/pinctrl/pinctrl-amd.h b/drivers/pinctrl/pinctrl-amd.h
3377 index 5b1cb965c767..8fa453a59da5 100644
3378 --- a/drivers/pinctrl/pinctrl-amd.h
3379 +++ b/drivers/pinctrl/pinctrl-amd.h
3380 @@ -97,6 +97,7 @@ struct amd_gpio {
3381 unsigned int hwbank_num;
3382 struct resource *res;
3383 struct platform_device *pdev;
3384 + u32 *saved_regs;
3385 };
3386
3387 /* KERNCZ configuration*/
3388 diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c
3389 index 731530a9ce38..9ab8faf528a6 100644
3390 --- a/drivers/pinctrl/samsung/pinctrl-exynos.c
3391 +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c
3392 @@ -174,10 +174,10 @@ static int exynos_irq_request_resources(struct irq_data *irqd)
3393
3394 spin_lock_irqsave(&bank->slock, flags);
3395
3396 - con = readl(bank->eint_base + reg_con);
3397 + con = readl(bank->pctl_base + reg_con);
3398 con &= ~(mask << shift);
3399 con |= EXYNOS_EINT_FUNC << shift;
3400 - writel(con, bank->eint_base + reg_con);
3401 + writel(con, bank->pctl_base + reg_con);
3402
3403 spin_unlock_irqrestore(&bank->slock, flags);
3404
3405 @@ -202,10 +202,10 @@ static void exynos_irq_release_resources(struct irq_data *irqd)
3406
3407 spin_lock_irqsave(&bank->slock, flags);
3408
3409 - con = readl(bank->eint_base + reg_con);
3410 + con = readl(bank->pctl_base + reg_con);
3411 con &= ~(mask << shift);
3412 con |= FUNC_INPUT << shift;
3413 - writel(con, bank->eint_base + reg_con);
3414 + writel(con, bank->pctl_base + reg_con);
3415
3416 spin_unlock_irqrestore(&bank->slock, flags);
3417
3418 diff --git a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c
3419 index 49774851e84a..edf27264b603 100644
3420 --- a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c
3421 +++ b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c
3422 @@ -151,7 +151,7 @@ static void s3c24xx_eint_set_function(struct samsung_pinctrl_drv_data *d,
3423 u32 val;
3424
3425 /* Make sure that pin is configured as interrupt */
3426 - reg = bank->pctl_base + bank->pctl_offset;
3427 + reg = d->virt_base + bank->pctl_offset;
3428 shift = pin * bank_type->fld_width[PINCFG_TYPE_FUNC];
3429 mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1;
3430
3431 @@ -184,7 +184,7 @@ static int s3c24xx_eint_type(struct irq_data *data, unsigned int type)
3432 s3c24xx_eint_set_handler(data, type);
3433
3434 /* Set up interrupt trigger */
3435 - reg = bank->eint_base + EINT_REG(index);
3436 + reg = d->virt_base + EINT_REG(index);
3437 shift = EINT_OFFS(index);
3438
3439 val = readl(reg);
3440 @@ -259,29 +259,32 @@ static void s3c2410_demux_eint0_3(struct irq_desc *desc)
3441 static void s3c2412_eint0_3_ack(struct irq_data *data)
3442 {
3443 struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
3444 + struct samsung_pinctrl_drv_data *d = bank->drvdata;
3445
3446 unsigned long bitval = 1UL << data->hwirq;
3447 - writel(bitval, bank->eint_base + EINTPEND_REG);
3448 + writel(bitval, d->virt_base + EINTPEND_REG);
3449 }
3450
3451 static void s3c2412_eint0_3_mask(struct irq_data *data)
3452 {
3453 struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
3454 + struct samsung_pinctrl_drv_data *d = bank->drvdata;
3455 unsigned long mask;
3456
3457 - mask = readl(bank->eint_base + EINTMASK_REG);
3458 + mask = readl(d->virt_base + EINTMASK_REG);
3459 mask |= (1UL << data->hwirq);
3460 - writel(mask, bank->eint_base + EINTMASK_REG);
3461 + writel(mask, d->virt_base + EINTMASK_REG);
3462 }
3463
3464 static void s3c2412_eint0_3_unmask(struct irq_data *data)
3465 {
3466 struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
3467 + struct samsung_pinctrl_drv_data *d = bank->drvdata;
3468 unsigned long mask;
3469
3470 - mask = readl(bank->eint_base + EINTMASK_REG);
3471 + mask = readl(d->virt_base + EINTMASK_REG);
3472 mask &= ~(1UL << data->hwirq);
3473 - writel(mask, bank->eint_base + EINTMASK_REG);
3474 + writel(mask, d->virt_base + EINTMASK_REG);
3475 }
3476
3477 static struct irq_chip s3c2412_eint0_3_chip = {
3478 @@ -316,31 +319,34 @@ static void s3c2412_demux_eint0_3(struct irq_desc *desc)
3479 static void s3c24xx_eint_ack(struct irq_data *data)
3480 {
3481 struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
3482 + struct samsung_pinctrl_drv_data *d = bank->drvdata;
3483 unsigned char index = bank->eint_offset + data->hwirq;
3484
3485 - writel(1UL << index, bank->eint_base + EINTPEND_REG);
3486 + writel(1UL << index, d->virt_base + EINTPEND_REG);
3487 }
3488
3489 static void s3c24xx_eint_mask(struct irq_data *data)
3490 {
3491 struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
3492 + struct samsung_pinctrl_drv_data *d = bank->drvdata;
3493 unsigned char index = bank->eint_offset + data->hwirq;
3494 unsigned long mask;
3495
3496 - mask = readl(bank->eint_base + EINTMASK_REG);
3497 + mask = readl(d->virt_base + EINTMASK_REG);
3498 mask |= (1UL << index);
3499 - writel(mask, bank->eint_base + EINTMASK_REG);
3500 + writel(mask, d->virt_base + EINTMASK_REG);
3501 }
3502
3503 static void s3c24xx_eint_unmask(struct irq_data *data)
3504 {
3505 struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(data);
3506 + struct samsung_pinctrl_drv_data *d = bank->drvdata;
3507 unsigned char index = bank->eint_offset + data->hwirq;
3508 unsigned long mask;
3509
3510 - mask = readl(bank->eint_base + EINTMASK_REG);
3511 + mask = readl(d->virt_base + EINTMASK_REG);
3512 mask &= ~(1UL << index);
3513 - writel(mask, bank->eint_base + EINTMASK_REG);
3514 + writel(mask, d->virt_base + EINTMASK_REG);
3515 }
3516
3517 static struct irq_chip s3c24xx_eint_chip = {
3518 @@ -356,14 +362,13 @@ static inline void s3c24xx_demux_eint(struct irq_desc *desc,
3519 {
3520 struct s3c24xx_eint_data *data = irq_desc_get_handler_data(desc);
3521 struct irq_chip *chip = irq_desc_get_chip(desc);
3522 - struct irq_data *irqd = irq_desc_get_irq_data(desc);
3523 - struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
3524 + struct samsung_pinctrl_drv_data *d = data->drvdata;
3525 unsigned int pend, mask;
3526
3527 chained_irq_enter(chip, desc);
3528
3529 - pend = readl(bank->eint_base + EINTPEND_REG);
3530 - mask = readl(bank->eint_base + EINTMASK_REG);
3531 + pend = readl(d->virt_base + EINTPEND_REG);
3532 + mask = readl(d->virt_base + EINTMASK_REG);
3533
3534 pend &= ~mask;
3535 pend &= range;
3536 diff --git a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c
3537 index 4a88d7446e87..e63663b32907 100644
3538 --- a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c
3539 +++ b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c
3540 @@ -280,7 +280,7 @@ static void s3c64xx_irq_set_function(struct samsung_pinctrl_drv_data *d,
3541 u32 val;
3542
3543 /* Make sure that pin is configured as interrupt */
3544 - reg = bank->pctl_base + bank->pctl_offset;
3545 + reg = d->virt_base + bank->pctl_offset;
3546 shift = pin;
3547 if (bank_type->fld_width[PINCFG_TYPE_FUNC] * shift >= 32) {
3548 /* 4-bit bank type with 2 con regs */
3549 @@ -308,8 +308,9 @@ static void s3c64xx_irq_set_function(struct samsung_pinctrl_drv_data *d,
3550 static inline void s3c64xx_gpio_irq_set_mask(struct irq_data *irqd, bool mask)
3551 {
3552 struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
3553 + struct samsung_pinctrl_drv_data *d = bank->drvdata;
3554 unsigned char index = EINT_OFFS(bank->eint_offset) + irqd->hwirq;
3555 - void __iomem *reg = bank->eint_base + EINTMASK_REG(bank->eint_offset);
3556 + void __iomem *reg = d->virt_base + EINTMASK_REG(bank->eint_offset);
3557 u32 val;
3558
3559 val = readl(reg);
3560 @@ -333,8 +334,9 @@ static void s3c64xx_gpio_irq_mask(struct irq_data *irqd)
3561 static void s3c64xx_gpio_irq_ack(struct irq_data *irqd)
3562 {
3563 struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
3564 + struct samsung_pinctrl_drv_data *d = bank->drvdata;
3565 unsigned char index = EINT_OFFS(bank->eint_offset) + irqd->hwirq;
3566 - void __iomem *reg = bank->eint_base + EINTPEND_REG(bank->eint_offset);
3567 + void __iomem *reg = d->virt_base + EINTPEND_REG(bank->eint_offset);
3568
3569 writel(1 << index, reg);
3570 }
3571 @@ -357,7 +359,7 @@ static int s3c64xx_gpio_irq_set_type(struct irq_data *irqd, unsigned int type)
3572 s3c64xx_irq_set_handler(irqd, type);
3573
3574 /* Set up interrupt trigger */
3575 - reg = bank->eint_base + EINTCON_REG(bank->eint_offset);
3576 + reg = d->virt_base + EINTCON_REG(bank->eint_offset);
3577 shift = EINT_OFFS(bank->eint_offset) + irqd->hwirq;
3578 shift = 4 * (shift / 4); /* 4 EINTs per trigger selector */
3579
3580 @@ -409,8 +411,7 @@ static void s3c64xx_eint_gpio_irq(struct irq_desc *desc)
3581 {
3582 struct irq_chip *chip = irq_desc_get_chip(desc);
3583 struct s3c64xx_eint_gpio_data *data = irq_desc_get_handler_data(desc);
3584 - struct irq_data *irqd = irq_desc_get_irq_data(desc);
3585 - struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
3586 + struct samsung_pinctrl_drv_data *drvdata = data->drvdata;
3587
3588 chained_irq_enter(chip, desc);
3589
3590 @@ -420,7 +421,7 @@ static void s3c64xx_eint_gpio_irq(struct irq_desc *desc)
3591 unsigned int pin;
3592 unsigned int virq;
3593
3594 - svc = readl(bank->eint_base + SERVICE_REG);
3595 + svc = readl(drvdata->virt_base + SERVICE_REG);
3596 group = SVC_GROUP(svc);
3597 pin = svc & SVC_NUM_MASK;
3598
3599 @@ -515,15 +516,15 @@ static inline void s3c64xx_eint0_irq_set_mask(struct irq_data *irqd, bool mask)
3600 {
3601 struct s3c64xx_eint0_domain_data *ddata =
3602 irq_data_get_irq_chip_data(irqd);
3603 - struct samsung_pin_bank *bank = ddata->bank;
3604 + struct samsung_pinctrl_drv_data *d = ddata->bank->drvdata;
3605 u32 val;
3606
3607 - val = readl(bank->eint_base + EINT0MASK_REG);
3608 + val = readl(d->virt_base + EINT0MASK_REG);
3609 if (mask)
3610 val |= 1 << ddata->eints[irqd->hwirq];
3611 else
3612 val &= ~(1 << ddata->eints[irqd->hwirq]);
3613 - writel(val, bank->eint_base + EINT0MASK_REG);
3614 + writel(val, d->virt_base + EINT0MASK_REG);
3615 }
3616
3617 static void s3c64xx_eint0_irq_unmask(struct irq_data *irqd)
3618 @@ -540,10 +541,10 @@ static void s3c64xx_eint0_irq_ack(struct irq_data *irqd)
3619 {
3620 struct s3c64xx_eint0_domain_data *ddata =
3621 irq_data_get_irq_chip_data(irqd);
3622 - struct samsung_pin_bank *bank = ddata->bank;
3623 + struct samsung_pinctrl_drv_data *d = ddata->bank->drvdata;
3624
3625 writel(1 << ddata->eints[irqd->hwirq],
3626 - bank->eint_base + EINT0PEND_REG);
3627 + d->virt_base + EINT0PEND_REG);
3628 }
3629
3630 static int s3c64xx_eint0_irq_set_type(struct irq_data *irqd, unsigned int type)
3631 @@ -551,7 +552,7 @@ static int s3c64xx_eint0_irq_set_type(struct irq_data *irqd, unsigned int type)
3632 struct s3c64xx_eint0_domain_data *ddata =
3633 irq_data_get_irq_chip_data(irqd);
3634 struct samsung_pin_bank *bank = ddata->bank;
3635 - struct samsung_pinctrl_drv_data *d = ddata->bank->drvdata;
3636 + struct samsung_pinctrl_drv_data *d = bank->drvdata;
3637 void __iomem *reg;
3638 int trigger;
3639 u8 shift;
3640 @@ -566,7 +567,7 @@ static int s3c64xx_eint0_irq_set_type(struct irq_data *irqd, unsigned int type)
3641 s3c64xx_irq_set_handler(irqd, type);
3642
3643 /* Set up interrupt trigger */
3644 - reg = bank->eint_base + EINT0CON0_REG;
3645 + reg = d->virt_base + EINT0CON0_REG;
3646 shift = ddata->eints[irqd->hwirq];
3647 if (shift >= EINT_MAX_PER_REG) {
3648 reg += 4;
3649 @@ -598,19 +599,14 @@ static struct irq_chip s3c64xx_eint0_irq_chip = {
3650 static inline void s3c64xx_irq_demux_eint(struct irq_desc *desc, u32 range)
3651 {
3652 struct irq_chip *chip = irq_desc_get_chip(desc);
3653 - struct irq_data *irqd = irq_desc_get_irq_data(desc);
3654 - struct s3c64xx_eint0_domain_data *ddata =
3655 - irq_data_get_irq_chip_data(irqd);
3656 - struct samsung_pin_bank *bank = ddata->bank;
3657 -
3658 struct s3c64xx_eint0_data *data = irq_desc_get_handler_data(desc);
3659 -
3660 + struct samsung_pinctrl_drv_data *drvdata = data->drvdata;
3661 unsigned int pend, mask;
3662
3663 chained_irq_enter(chip, desc);
3664
3665 - pend = readl(bank->eint_base + EINT0PEND_REG);
3666 - mask = readl(bank->eint_base + EINT0MASK_REG);
3667 + pend = readl(drvdata->virt_base + EINT0PEND_REG);
3668 + mask = readl(drvdata->virt_base + EINT0MASK_REG);
3669
3670 pend = pend & range & ~mask;
3671 pend &= range;
3672 diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
3673 index f542642eed8d..61bbd54e35ba 100644
3674 --- a/drivers/pinctrl/samsung/pinctrl-samsung.c
3675 +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
3676 @@ -1013,6 +1013,12 @@ samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d,
3677 bank->eint_base = virt_base[0];
3678 bank->pctl_base = virt_base[bdata->pctl_res_idx];
3679 }
3680 + /*
3681 + * Legacy platforms should provide only one resource with IO memory.
3682 + * Store it as virt_base because legacy driver needs to access it
3683 + * through samsung_pinctrl_drv_data.
3684 + */
3685 + d->virt_base = virt_base[0];
3686
3687 for_each_child_of_node(node, np) {
3688 if (!of_find_property(np, "gpio-controller", NULL))
3689 diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.h b/drivers/pinctrl/samsung/pinctrl-samsung.h
3690 index 515a61035e54..61c4cab0ad24 100644
3691 --- a/drivers/pinctrl/samsung/pinctrl-samsung.h
3692 +++ b/drivers/pinctrl/samsung/pinctrl-samsung.h
3693 @@ -247,6 +247,10 @@ struct samsung_pin_ctrl {
3694 /**
3695 * struct samsung_pinctrl_drv_data: wrapper for holding driver data together.
3696 * @node: global list node
3697 + * @virt_base: register base address of the controller; this will be equal
3698 + * to each bank samsung_pin_bank->pctl_base and used on legacy
3699 + * platforms (like S3C24XX or S3C64XX) which has to access the base
3700 + * through samsung_pinctrl_drv_data, not samsung_pin_bank).
3701 * @dev: device instance representing the controller.
3702 * @irq: interrpt number used by the controller to notify gpio interrupts.
3703 * @ctrl: pin controller instance managed by the driver.
3704 @@ -262,6 +266,7 @@ struct samsung_pin_ctrl {
3705 */
3706 struct samsung_pinctrl_drv_data {
3707 struct list_head node;
3708 + void __iomem *virt_base;
3709 struct device *dev;
3710 int irq;
3711
3712 diff --git a/drivers/regulator/cpcap-regulator.c b/drivers/regulator/cpcap-regulator.c
3713 index cc98aceed1c1..ce1cab320f6f 100644
3714 --- a/drivers/regulator/cpcap-regulator.c
3715 +++ b/drivers/regulator/cpcap-regulator.c
3716 @@ -77,6 +77,8 @@
3717 #define CPCAP_BIT_VAUDIO_MODE0 BIT(1)
3718 #define CPCAP_BIT_V_AUDIO_EN BIT(0)
3719
3720 +#define CPCAP_BIT_AUDIO_NORMAL_MODE 0x00
3721 +
3722 /*
3723 * Off mode configuration bit. Used currently only by SW5 on omap4. There's
3724 * the following comment in Motorola Linux kernel tree for it:
3725 @@ -217,7 +219,7 @@ static unsigned int cpcap_regulator_get_mode(struct regulator_dev *rdev)
3726
3727 regmap_read(rdev->regmap, rdev->desc->enable_reg, &value);
3728
3729 - if (!(value & CPCAP_BIT_AUDIO_LOW_PWR))
3730 + if (value & CPCAP_BIT_AUDIO_LOW_PWR)
3731 return REGULATOR_MODE_STANDBY;
3732
3733 return REGULATOR_MODE_NORMAL;
3734 @@ -230,10 +232,10 @@ static int cpcap_regulator_set_mode(struct regulator_dev *rdev,
3735
3736 switch (mode) {
3737 case REGULATOR_MODE_NORMAL:
3738 - value = CPCAP_BIT_AUDIO_LOW_PWR;
3739 + value = CPCAP_BIT_AUDIO_NORMAL_MODE;
3740 break;
3741 case REGULATOR_MODE_STANDBY:
3742 - value = 0;
3743 + value = CPCAP_BIT_AUDIO_LOW_PWR;
3744 break;
3745 default:
3746 return -EINVAL;
3747 diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c
3748 index d5bf36ec8a75..34367d172961 100644
3749 --- a/drivers/s390/scsi/zfcp_dbf.c
3750 +++ b/drivers/s390/scsi/zfcp_dbf.c
3751 @@ -3,7 +3,7 @@
3752 *
3753 * Debug traces for zfcp.
3754 *
3755 - * Copyright IBM Corp. 2002, 2016
3756 + * Copyright IBM Corp. 2002, 2017
3757 */
3758
3759 #define KMSG_COMPONENT "zfcp"
3760 @@ -447,6 +447,7 @@ static u16 zfcp_dbf_san_res_cap_len_if_gpn_ft(char *tag,
3761 struct fc_ct_hdr *reqh = sg_virt(ct_els->req);
3762 struct fc_ns_gid_ft *reqn = (struct fc_ns_gid_ft *)(reqh + 1);
3763 struct scatterlist *resp_entry = ct_els->resp;
3764 + struct fc_ct_hdr *resph;
3765 struct fc_gpn_ft_resp *acc;
3766 int max_entries, x, last = 0;
3767
3768 @@ -473,6 +474,13 @@ static u16 zfcp_dbf_san_res_cap_len_if_gpn_ft(char *tag,
3769 return len; /* not GPN_FT response so do not cap */
3770
3771 acc = sg_virt(resp_entry);
3772 +
3773 + /* cap all but accept CT responses to at least the CT header */
3774 + resph = (struct fc_ct_hdr *)acc;
3775 + if ((ct_els->status) ||
3776 + (resph->ct_cmd != cpu_to_be16(FC_FS_ACC)))
3777 + return max(FC_CT_HDR_LEN, ZFCP_DBF_SAN_MAX_PAYLOAD);
3778 +
3779 max_entries = (reqh->ct_mr_size * 4 / sizeof(struct fc_gpn_ft_resp))
3780 + 1 /* zfcp_fc_scan_ports: bytes correct, entries off-by-one
3781 * to account for header as 1st pseudo "entry" */;
3782 @@ -555,8 +563,8 @@ void zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *sc,
3783 rec->scsi_retries = sc->retries;
3784 rec->scsi_allowed = sc->allowed;
3785 rec->scsi_id = sc->device->id;
3786 - /* struct zfcp_dbf_scsi needs to be updated to handle 64bit LUNs */
3787 rec->scsi_lun = (u32)sc->device->lun;
3788 + rec->scsi_lun_64_hi = (u32)(sc->device->lun >> 32);
3789 rec->host_scribble = (unsigned long)sc->host_scribble;
3790
3791 memcpy(rec->scsi_opcode, sc->cmnd,
3792 @@ -564,19 +572,32 @@ void zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *sc,
3793
3794 if (fsf) {
3795 rec->fsf_req_id = fsf->req_id;
3796 + rec->pl_len = FCP_RESP_WITH_EXT;
3797 fcp_rsp = (struct fcp_resp_with_ext *)
3798 &(fsf->qtcb->bottom.io.fcp_rsp);
3799 + /* mandatory parts of FCP_RSP IU in this SCSI record */
3800 memcpy(&rec->fcp_rsp, fcp_rsp, FCP_RESP_WITH_EXT);
3801 if (fcp_rsp->resp.fr_flags & FCP_RSP_LEN_VAL) {
3802 fcp_rsp_info = (struct fcp_resp_rsp_info *) &fcp_rsp[1];
3803 rec->fcp_rsp_info = fcp_rsp_info->rsp_code;
3804 + rec->pl_len += be32_to_cpu(fcp_rsp->ext.fr_rsp_len);
3805 }
3806 if (fcp_rsp->resp.fr_flags & FCP_SNS_LEN_VAL) {
3807 - rec->pl_len = min((u16)SCSI_SENSE_BUFFERSIZE,
3808 - (u16)ZFCP_DBF_PAY_MAX_REC);
3809 - zfcp_dbf_pl_write(dbf, sc->sense_buffer, rec->pl_len,
3810 - "fcp_sns", fsf->req_id);
3811 + rec->pl_len += be32_to_cpu(fcp_rsp->ext.fr_sns_len);
3812 }
3813 + /* complete FCP_RSP IU in associated PAYload record
3814 + * but only if there are optional parts
3815 + */
3816 + if (fcp_rsp->resp.fr_flags != 0)
3817 + zfcp_dbf_pl_write(
3818 + dbf, fcp_rsp,
3819 + /* at least one full PAY record
3820 + * but not beyond hardware response field
3821 + */
3822 + min_t(u16, max_t(u16, rec->pl_len,
3823 + ZFCP_DBF_PAY_MAX_REC),
3824 + FSF_FCP_RSP_SIZE),
3825 + "fcp_riu", fsf->req_id);
3826 }
3827
3828 debug_event(dbf->scsi, level, rec, sizeof(*rec));
3829 diff --git a/drivers/s390/scsi/zfcp_dbf.h b/drivers/s390/scsi/zfcp_dbf.h
3830 index db186d44cfaf..b60667c145fd 100644
3831 --- a/drivers/s390/scsi/zfcp_dbf.h
3832 +++ b/drivers/s390/scsi/zfcp_dbf.h
3833 @@ -2,7 +2,7 @@
3834 * zfcp device driver
3835 * debug feature declarations
3836 *
3837 - * Copyright IBM Corp. 2008, 2016
3838 + * Copyright IBM Corp. 2008, 2017
3839 */
3840
3841 #ifndef ZFCP_DBF_H
3842 @@ -204,7 +204,7 @@ enum zfcp_dbf_scsi_id {
3843 * @id: unique number of recovery record type
3844 * @tag: identifier string specifying the location of initiation
3845 * @scsi_id: scsi device id
3846 - * @scsi_lun: scsi device logical unit number
3847 + * @scsi_lun: scsi device logical unit number, low part of 64 bit, old 32 bit
3848 * @scsi_result: scsi result
3849 * @scsi_retries: current retry number of scsi request
3850 * @scsi_allowed: allowed retries
3851 @@ -214,6 +214,7 @@ enum zfcp_dbf_scsi_id {
3852 * @host_scribble: LLD specific data attached to SCSI request
3853 * @pl_len: length of paload stored as zfcp_dbf_pay
3854 * @fsf_rsp: response for fsf request
3855 + * @scsi_lun_64_hi: scsi device logical unit number, high part of 64 bit
3856 */
3857 struct zfcp_dbf_scsi {
3858 u8 id;
3859 @@ -230,6 +231,7 @@ struct zfcp_dbf_scsi {
3860 u64 host_scribble;
3861 u16 pl_len;
3862 struct fcp_resp_with_ext fcp_rsp;
3863 + u32 scsi_lun_64_hi;
3864 } __packed;
3865
3866 /**
3867 @@ -323,7 +325,11 @@ void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req)
3868 {
3869 struct fsf_qtcb *qtcb = req->qtcb;
3870
3871 - if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
3872 + if (unlikely(req->status & (ZFCP_STATUS_FSFREQ_DISMISSED |
3873 + ZFCP_STATUS_FSFREQ_ERROR))) {
3874 + zfcp_dbf_hba_fsf_resp("fs_rerr", 3, req);
3875 +
3876 + } else if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
3877 (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) {
3878 zfcp_dbf_hba_fsf_resp("fs_perr", 1, req);
3879
3880 @@ -401,7 +407,8 @@ void zfcp_dbf_scsi_abort(char *tag, struct scsi_cmnd *scmd,
3881 * @flag: indicates type of reset (Target Reset, Logical Unit Reset)
3882 */
3883 static inline
3884 -void zfcp_dbf_scsi_devreset(char *tag, struct scsi_cmnd *scmnd, u8 flag)
3885 +void zfcp_dbf_scsi_devreset(char *tag, struct scsi_cmnd *scmnd, u8 flag,
3886 + struct zfcp_fsf_req *fsf_req)
3887 {
3888 char tmp_tag[ZFCP_DBF_TAG_LEN];
3889
3890 @@ -411,7 +418,7 @@ void zfcp_dbf_scsi_devreset(char *tag, struct scsi_cmnd *scmnd, u8 flag)
3891 memcpy(tmp_tag, "lr_", 3);
3892
3893 memcpy(&tmp_tag[3], tag, 4);
3894 - _zfcp_dbf_scsi(tmp_tag, 1, scmnd, NULL);
3895 + _zfcp_dbf_scsi(tmp_tag, 1, scmnd, fsf_req);
3896 }
3897
3898 /**
3899 diff --git a/drivers/s390/scsi/zfcp_fc.h b/drivers/s390/scsi/zfcp_fc.h
3900 index df2b541c8287..a2275825186f 100644
3901 --- a/drivers/s390/scsi/zfcp_fc.h
3902 +++ b/drivers/s390/scsi/zfcp_fc.h
3903 @@ -4,7 +4,7 @@
3904 * Fibre Channel related definitions and inline functions for the zfcp
3905 * device driver
3906 *
3907 - * Copyright IBM Corp. 2009
3908 + * Copyright IBM Corp. 2009, 2017
3909 */
3910
3911 #ifndef ZFCP_FC_H
3912 @@ -279,6 +279,10 @@ void zfcp_fc_eval_fcp_rsp(struct fcp_resp_with_ext *fcp_rsp,
3913 !(rsp_flags & FCP_SNS_LEN_VAL) &&
3914 fcp_rsp->resp.fr_status == SAM_STAT_GOOD)
3915 set_host_byte(scsi, DID_ERROR);
3916 + } else if (unlikely(rsp_flags & FCP_RESID_OVER)) {
3917 + /* FCP_DL was not sufficient for SCSI data length */
3918 + if (fcp_rsp->resp.fr_status == SAM_STAT_GOOD)
3919 + set_host_byte(scsi, DID_ERROR);
3920 }
3921 }
3922
3923 diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c
3924 index 27ff38f839fc..1964391db904 100644
3925 --- a/drivers/s390/scsi/zfcp_fsf.c
3926 +++ b/drivers/s390/scsi/zfcp_fsf.c
3927 @@ -928,8 +928,8 @@ static void zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *req)
3928
3929 switch (header->fsf_status) {
3930 case FSF_GOOD:
3931 - zfcp_dbf_san_res("fsscth2", req);
3932 ct->status = 0;
3933 + zfcp_dbf_san_res("fsscth2", req);
3934 break;
3935 case FSF_SERVICE_CLASS_NOT_SUPPORTED:
3936 zfcp_fsf_class_not_supp(req);
3937 @@ -1109,8 +1109,8 @@ static void zfcp_fsf_send_els_handler(struct zfcp_fsf_req *req)
3938
3939 switch (header->fsf_status) {
3940 case FSF_GOOD:
3941 - zfcp_dbf_san_res("fsselh1", req);
3942 send_els->status = 0;
3943 + zfcp_dbf_san_res("fsselh1", req);
3944 break;
3945 case FSF_SERVICE_CLASS_NOT_SUPPORTED:
3946 zfcp_fsf_class_not_supp(req);
3947 @@ -2258,7 +2258,8 @@ int zfcp_fsf_fcp_cmnd(struct scsi_cmnd *scsi_cmnd)
3948 fcp_cmnd = (struct fcp_cmnd *) &req->qtcb->bottom.io.fcp_cmnd;
3949 zfcp_fc_scsi_to_fcp(fcp_cmnd, scsi_cmnd, 0);
3950
3951 - if (scsi_prot_sg_count(scsi_cmnd)) {
3952 + if ((scsi_get_prot_op(scsi_cmnd) != SCSI_PROT_NORMAL) &&
3953 + scsi_prot_sg_count(scsi_cmnd)) {
3954 zfcp_qdio_set_data_div(qdio, &req->qdio_req,
3955 scsi_prot_sg_count(scsi_cmnd));
3956 retval = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req,
3957 diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c
3958 index 0678cf714c0e..a1eeeaaa0fca 100644
3959 --- a/drivers/s390/scsi/zfcp_scsi.c
3960 +++ b/drivers/s390/scsi/zfcp_scsi.c
3961 @@ -3,7 +3,7 @@
3962 *
3963 * Interface to Linux SCSI midlayer.
3964 *
3965 - * Copyright IBM Corp. 2002, 2016
3966 + * Copyright IBM Corp. 2002, 2017
3967 */
3968
3969 #define KMSG_COMPONENT "zfcp"
3970 @@ -273,25 +273,29 @@ static int zfcp_task_mgmt_function(struct scsi_cmnd *scpnt, u8 tm_flags)
3971
3972 zfcp_erp_wait(adapter);
3973 ret = fc_block_scsi_eh(scpnt);
3974 - if (ret)
3975 + if (ret) {
3976 + zfcp_dbf_scsi_devreset("fiof", scpnt, tm_flags, NULL);
3977 return ret;
3978 + }
3979
3980 if (!(atomic_read(&adapter->status) &
3981 ZFCP_STATUS_COMMON_RUNNING)) {
3982 - zfcp_dbf_scsi_devreset("nres", scpnt, tm_flags);
3983 + zfcp_dbf_scsi_devreset("nres", scpnt, tm_flags, NULL);
3984 return SUCCESS;
3985 }
3986 }
3987 - if (!fsf_req)
3988 + if (!fsf_req) {
3989 + zfcp_dbf_scsi_devreset("reqf", scpnt, tm_flags, NULL);
3990 return FAILED;
3991 + }
3992
3993 wait_for_completion(&fsf_req->completion);
3994
3995 if (fsf_req->status & ZFCP_STATUS_FSFREQ_TMFUNCFAILED) {
3996 - zfcp_dbf_scsi_devreset("fail", scpnt, tm_flags);
3997 + zfcp_dbf_scsi_devreset("fail", scpnt, tm_flags, fsf_req);
3998 retval = FAILED;
3999 } else {
4000 - zfcp_dbf_scsi_devreset("okay", scpnt, tm_flags);
4001 + zfcp_dbf_scsi_devreset("okay", scpnt, tm_flags, fsf_req);
4002 zfcp_scsi_forget_cmnds(zfcp_sdev, tm_flags);
4003 }
4004
4005 diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
4006 index a1a2c71e1626..b051d97af468 100644
4007 --- a/drivers/scsi/aacraid/aachba.c
4008 +++ b/drivers/scsi/aacraid/aachba.c
4009 @@ -594,6 +594,7 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
4010
4011 aac_fib_init(cmd_fibcontext);
4012 dinfo = (struct aac_get_name *) fib_data(cmd_fibcontext);
4013 + scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4014
4015 dinfo->command = cpu_to_le32(VM_ContainerConfig);
4016 dinfo->type = cpu_to_le32(CT_READ_NAME);
4017 @@ -611,10 +612,8 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
4018 /*
4019 * Check that the command queued to the controller
4020 */
4021 - if (status == -EINPROGRESS) {
4022 - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4023 + if (status == -EINPROGRESS)
4024 return 0;
4025 - }
4026
4027 printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status);
4028 aac_fib_complete(cmd_fibcontext);
4029 @@ -725,6 +724,7 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
4030
4031 dinfo->count = cpu_to_le32(scmd_id(scsicmd));
4032 dinfo->type = cpu_to_le32(FT_FILESYS);
4033 + scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4034
4035 status = aac_fib_send(ContainerCommand,
4036 fibptr,
4037 @@ -736,9 +736,7 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
4038 /*
4039 * Check that the command queued to the controller
4040 */
4041 - if (status == -EINPROGRESS)
4042 - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4043 - else if (status < 0) {
4044 + if (status < 0 && status != -EINPROGRESS) {
4045 /* Inherit results from VM_NameServe, if any */
4046 dresp->status = cpu_to_le32(ST_OK);
4047 _aac_probe_container2(context, fibptr);
4048 @@ -766,6 +764,7 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
4049 dinfo->count = cpu_to_le32(scmd_id(scsicmd));
4050 dinfo->type = cpu_to_le32(FT_FILESYS);
4051 scsicmd->SCp.ptr = (char *)callback;
4052 + scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4053
4054 status = aac_fib_send(ContainerCommand,
4055 fibptr,
4056 @@ -777,10 +776,9 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
4057 /*
4058 * Check that the command queued to the controller
4059 */
4060 - if (status == -EINPROGRESS) {
4061 - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4062 + if (status == -EINPROGRESS)
4063 return 0;
4064 - }
4065 +
4066 if (status < 0) {
4067 scsicmd->SCp.ptr = NULL;
4068 aac_fib_complete(fibptr);
4069 @@ -1126,6 +1124,7 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
4070 dinfo->command = cpu_to_le32(VM_ContainerConfig);
4071 dinfo->type = cpu_to_le32(CT_CID_TO_32BITS_UID);
4072 dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
4073 + scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4074
4075 status = aac_fib_send(ContainerCommand,
4076 cmd_fibcontext,
4077 @@ -1138,10 +1137,8 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
4078 /*
4079 * Check that the command queued to the controller
4080 */
4081 - if (status == -EINPROGRESS) {
4082 - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4083 + if (status == -EINPROGRESS)
4084 return 0;
4085 - }
4086
4087 printk(KERN_WARNING "aac_get_container_serial: aac_fib_send failed with status: %d.\n", status);
4088 aac_fib_complete(cmd_fibcontext);
4089 @@ -2335,16 +2332,14 @@ static int aac_read(struct scsi_cmnd * scsicmd)
4090 * Alocate and initialize a Fib
4091 */
4092 cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
4093 -
4094 + scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4095 status = aac_adapter_read(cmd_fibcontext, scsicmd, lba, count);
4096
4097 /*
4098 * Check that the command queued to the controller
4099 */
4100 - if (status == -EINPROGRESS) {
4101 - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4102 + if (status == -EINPROGRESS)
4103 return 0;
4104 - }
4105
4106 printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status);
4107 /*
4108 @@ -2429,16 +2424,14 @@ static int aac_write(struct scsi_cmnd * scsicmd)
4109 * Allocate and initialize a Fib then setup a BlockWrite command
4110 */
4111 cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
4112 -
4113 + scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4114 status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua);
4115
4116 /*
4117 * Check that the command queued to the controller
4118 */
4119 - if (status == -EINPROGRESS) {
4120 - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4121 + if (status == -EINPROGRESS)
4122 return 0;
4123 - }
4124
4125 printk(KERN_WARNING "aac_write: aac_fib_send failed with status: %d\n", status);
4126 /*
4127 @@ -2588,6 +2581,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
4128 synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd));
4129 synchronizecmd->count =
4130 cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data));
4131 + scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4132
4133 /*
4134 * Now send the Fib to the adapter
4135 @@ -2603,10 +2597,8 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
4136 /*
4137 * Check that the command queued to the controller
4138 */
4139 - if (status == -EINPROGRESS) {
4140 - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4141 + if (status == -EINPROGRESS)
4142 return 0;
4143 - }
4144
4145 printk(KERN_WARNING
4146 "aac_synchronize: aac_fib_send failed with status: %d.\n", status);
4147 @@ -2666,6 +2658,7 @@ static int aac_start_stop(struct scsi_cmnd *scsicmd)
4148 pmcmd->cid = cpu_to_le32(sdev_id(sdev));
4149 pmcmd->parm = (scsicmd->cmnd[1] & 1) ?
4150 cpu_to_le32(CT_PM_UNIT_IMMEDIATE) : 0;
4151 + scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4152
4153 /*
4154 * Now send the Fib to the adapter
4155 @@ -2681,10 +2674,8 @@ static int aac_start_stop(struct scsi_cmnd *scsicmd)
4156 /*
4157 * Check that the command queued to the controller
4158 */
4159 - if (status == -EINPROGRESS) {
4160 - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4161 + if (status == -EINPROGRESS)
4162 return 0;
4163 - }
4164
4165 aac_fib_complete(cmd_fibcontext);
4166 aac_fib_free(cmd_fibcontext);
4167 @@ -3692,16 +3683,14 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
4168 * Allocate and initialize a Fib then setup a BlockWrite command
4169 */
4170 cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
4171 -
4172 + scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4173 status = aac_adapter_scsi(cmd_fibcontext, scsicmd);
4174
4175 /*
4176 * Check that the command queued to the controller
4177 */
4178 - if (status == -EINPROGRESS) {
4179 - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4180 + if (status == -EINPROGRESS)
4181 return 0;
4182 - }
4183
4184 printk(KERN_WARNING "aac_srb: aac_fib_send failed with status: %d\n", status);
4185 aac_fib_complete(cmd_fibcontext);
4186 @@ -3739,15 +3728,14 @@ static int aac_send_hba_fib(struct scsi_cmnd *scsicmd)
4187 if (!cmd_fibcontext)
4188 return -1;
4189
4190 + scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4191 status = aac_adapter_hba(cmd_fibcontext, scsicmd);
4192
4193 /*
4194 * Check that the command queued to the controller
4195 */
4196 - if (status == -EINPROGRESS) {
4197 - scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
4198 + if (status == -EINPROGRESS)
4199 return 0;
4200 - }
4201
4202 pr_warn("aac_hba_cmd_req: aac_fib_send failed with status: %d\n",
4203 status);
4204 diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
4205 index 71c4746341ea..3ee4ea79f81a 100644
4206 --- a/drivers/scsi/megaraid/megaraid_sas_base.c
4207 +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
4208 @@ -1995,9 +1995,12 @@ static void megasas_complete_outstanding_ioctls(struct megasas_instance *instanc
4209 if (cmd_fusion->sync_cmd_idx != (u32)ULONG_MAX) {
4210 cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx];
4211 if (cmd_mfi->sync_cmd &&
4212 - cmd_mfi->frame->hdr.cmd != MFI_CMD_ABORT)
4213 + (cmd_mfi->frame->hdr.cmd != MFI_CMD_ABORT)) {
4214 + cmd_mfi->frame->hdr.cmd_status =
4215 + MFI_STAT_WRONG_STATE;
4216 megasas_complete_cmd(instance,
4217 cmd_mfi, DID_OK);
4218 + }
4219 }
4220 }
4221 } else {
4222 @@ -5478,7 +5481,8 @@ static int megasas_init_fw(struct megasas_instance *instance)
4223 instance->throttlequeuedepth =
4224 MEGASAS_THROTTLE_QUEUE_DEPTH;
4225
4226 - if (resetwaittime > MEGASAS_RESET_WAIT_TIME)
4227 + if ((resetwaittime < 1) ||
4228 + (resetwaittime > MEGASAS_RESET_WAIT_TIME))
4229 resetwaittime = MEGASAS_RESET_WAIT_TIME;
4230
4231 if ((scmd_timeout < 10) || (scmd_timeout > MEGASAS_DEFAULT_CMD_TIMEOUT))
4232 @@ -5649,6 +5653,14 @@ megasas_register_aen(struct megasas_instance *instance, u32 seq_num,
4233 prev_aen.word =
4234 le32_to_cpu(instance->aen_cmd->frame->dcmd.mbox.w[1]);
4235
4236 + if ((curr_aen.members.class < MFI_EVT_CLASS_DEBUG) ||
4237 + (curr_aen.members.class > MFI_EVT_CLASS_DEAD)) {
4238 + dev_info(&instance->pdev->dev,
4239 + "%s %d out of range class %d send by application\n",
4240 + __func__, __LINE__, curr_aen.members.class);
4241 + return 0;
4242 + }
4243 +
4244 /*
4245 * A class whose enum value is smaller is inclusive of all
4246 * higher values. If a PROGRESS (= -1) was previously
4247 diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c
4248 index 985510628f56..8152962f152d 100644
4249 --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
4250 +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
4251 @@ -3287,7 +3287,7 @@ build_mpt_mfi_pass_thru(struct megasas_instance *instance,
4252 mpi25_ieee_chain->Flags = IEEE_SGE_FLAGS_CHAIN_ELEMENT |
4253 MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR;
4254
4255 - mpi25_ieee_chain->Length = cpu_to_le32(instance->max_chain_frame_sz);
4256 + mpi25_ieee_chain->Length = cpu_to_le32(instance->mfi_frame_size);
4257 }
4258
4259 /**
4260 diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
4261 index 2c3783684815..85e7bae4a7ef 100644
4262 --- a/drivers/scsi/qedi/qedi_main.c
4263 +++ b/drivers/scsi/qedi/qedi_main.c
4264 @@ -1575,7 +1575,7 @@ struct qedi_cmd *qedi_get_cmd_from_tid(struct qedi_ctx *qedi, u32 tid)
4265 {
4266 struct qedi_cmd *cmd = NULL;
4267
4268 - if (tid > MAX_ISCSI_TASK_ENTRIES)
4269 + if (tid >= MAX_ISCSI_TASK_ENTRIES)
4270 return NULL;
4271
4272 cmd = qedi->itt_map[tid].p_cmd;
4273 diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
4274 index 08a1feb3a195..8c6ff1682fb1 100644
4275 --- a/drivers/scsi/qla2xxx/qla_attr.c
4276 +++ b/drivers/scsi/qla2xxx/qla_attr.c
4277 @@ -318,6 +318,8 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
4278 return -EINVAL;
4279 if (start > ha->optrom_size)
4280 return -EINVAL;
4281 + if (size > ha->optrom_size - start)
4282 + size = ha->optrom_size - start;
4283
4284 mutex_lock(&ha->optrom_mutex);
4285 switch (val) {
4286 @@ -343,8 +345,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
4287 }
4288
4289 ha->optrom_region_start = start;
4290 - ha->optrom_region_size = start + size > ha->optrom_size ?
4291 - ha->optrom_size - start : size;
4292 + ha->optrom_region_size = start + size;
4293
4294 ha->optrom_state = QLA_SREADING;
4295 ha->optrom_buffer = vmalloc(ha->optrom_region_size);
4296 @@ -417,8 +418,7 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
4297 }
4298
4299 ha->optrom_region_start = start;
4300 - ha->optrom_region_size = start + size > ha->optrom_size ?
4301 - ha->optrom_size - start : size;
4302 + ha->optrom_region_size = start + size;
4303
4304 ha->optrom_state = QLA_SWRITING;
4305 ha->optrom_buffer = vmalloc(ha->optrom_region_size);
4306 diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
4307 index b323a7c71eda..0ec250993e93 100644
4308 --- a/drivers/scsi/qla2xxx/qla_gs.c
4309 +++ b/drivers/scsi/qla2xxx/qla_gs.c
4310 @@ -3080,7 +3080,7 @@ int qla24xx_async_gpsc(scsi_qla_host_t *vha, fc_port_t *fcport)
4311 GPSC_RSP_SIZE);
4312
4313 /* GPSC req */
4314 - memcpy(ct_req->req.gpsc.port_name, fcport->port_name,
4315 + memcpy(ct_req->req.gpsc.port_name, fcport->fabric_port_name,
4316 WWN_SIZE);
4317
4318 sp->u.iocb_cmd.u.ctarg.req = fcport->ct_desc.ct_sns;
4319 diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
4320 index 072ad1aa5505..8f83571afc7b 100644
4321 --- a/drivers/scsi/qla2xxx/qla_init.c
4322 +++ b/drivers/scsi/qla2xxx/qla_init.c
4323 @@ -7804,6 +7804,7 @@ struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, int qos,
4324 ha->queue_pair_map[qpair_id] = qpair;
4325 qpair->id = qpair_id;
4326 qpair->vp_idx = vp_idx;
4327 + qpair->fw_started = ha->flags.fw_started;
4328 INIT_LIST_HEAD(&qpair->hints_list);
4329 qpair->chip_reset = ha->base_qpair->chip_reset;
4330 qpair->enable_class_2 = ha->base_qpair->enable_class_2;
4331 diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
4332 index 7b3b702ef622..ec2c398f5663 100644
4333 --- a/drivers/scsi/qla2xxx/qla_isr.c
4334 +++ b/drivers/scsi/qla2xxx/qla_isr.c
4335 @@ -3429,7 +3429,7 @@ qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp)
4336 }
4337
4338 /* Enable MSI-X vector for response queue update for queue 0 */
4339 - if (IS_QLA25XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
4340 + if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
4341 if (ha->msixbase && ha->mqiobase &&
4342 (ha->max_rsp_queues > 1 || ha->max_req_queues > 1 ||
4343 ql2xmqsupport))
4344 diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
4345 index 7c6d1a404011..1f1a81c6eaa9 100644
4346 --- a/drivers/scsi/qla2xxx/qla_mbx.c
4347 +++ b/drivers/scsi/qla2xxx/qla_mbx.c
4348 @@ -54,6 +54,7 @@ static struct rom_cmd {
4349 { MBC_GET_MEM_OFFLOAD_CNTRL_STAT },
4350 { MBC_GET_RETRY_COUNT },
4351 { MBC_TRACE_CONTROL },
4352 + { MBC_INITIALIZE_MULTIQ },
4353 };
4354
4355 static int is_rom_cmd(uint16_t cmd)
4356 @@ -3689,7 +3690,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
4357 if (qla_ini_mode_enabled(vha) &&
4358 ha->flags.fawwpn_enabled &&
4359 (rptid_entry->u.f1.flags &
4360 - VP_FLAGS_NAME_VALID)) {
4361 + BIT_6)) {
4362 memcpy(vha->port_name,
4363 rptid_entry->u.f1.port_name,
4364 WWN_SIZE);
4365 diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c
4366 index f0605cd196fb..3089094b48fa 100644
4367 --- a/drivers/scsi/qla2xxx/qla_mid.c
4368 +++ b/drivers/scsi/qla2xxx/qla_mid.c
4369 @@ -74,7 +74,7 @@ qla24xx_deallocate_vp_id(scsi_qla_host_t *vha)
4370 * ensures no active vp_list traversal while the vport is removed
4371 * from the queue)
4372 */
4373 - wait_event_timeout(vha->vref_waitq, atomic_read(&vha->vref_count),
4374 + wait_event_timeout(vha->vref_waitq, !atomic_read(&vha->vref_count),
4375 10*HZ);
4376
4377 spin_lock_irqsave(&ha->vport_slock, flags);
4378 diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
4379 index e101cd3043b9..4e2a64773060 100644
4380 --- a/drivers/scsi/qla2xxx/qla_target.c
4381 +++ b/drivers/scsi/qla2xxx/qla_target.c
4382 @@ -6796,7 +6796,7 @@ qlt_probe_one_stage1(struct scsi_qla_host *base_vha, struct qla_hw_data *ha)
4383 if (!QLA_TGT_MODE_ENABLED())
4384 return;
4385
4386 - if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
4387 + if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
4388 ISP_ATIO_Q_IN(base_vha) = &ha->mqiobase->isp25mq.atio_q_in;
4389 ISP_ATIO_Q_OUT(base_vha) = &ha->mqiobase->isp25mq.atio_q_out;
4390 } else {
4391 diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
4392 index aad6ebb51735..1a9de8419997 100644
4393 --- a/drivers/scsi/sg.c
4394 +++ b/drivers/scsi/sg.c
4395 @@ -828,6 +828,39 @@ static int max_sectors_bytes(struct request_queue *q)
4396 return max_sectors << 9;
4397 }
4398
4399 +static void
4400 +sg_fill_request_table(Sg_fd *sfp, sg_req_info_t *rinfo)
4401 +{
4402 + Sg_request *srp;
4403 + int val;
4404 + unsigned int ms;
4405 +
4406 + val = 0;
4407 + list_for_each_entry(srp, &sfp->rq_list, entry) {
4408 + if (val > SG_MAX_QUEUE)
4409 + break;
4410 + rinfo[val].req_state = srp->done + 1;
4411 + rinfo[val].problem =
4412 + srp->header.masked_status &
4413 + srp->header.host_status &
4414 + srp->header.driver_status;
4415 + if (srp->done)
4416 + rinfo[val].duration =
4417 + srp->header.duration;
4418 + else {
4419 + ms = jiffies_to_msecs(jiffies);
4420 + rinfo[val].duration =
4421 + (ms > srp->header.duration) ?
4422 + (ms - srp->header.duration) : 0;
4423 + }
4424 + rinfo[val].orphan = srp->orphan;
4425 + rinfo[val].sg_io_owned = srp->sg_io_owned;
4426 + rinfo[val].pack_id = srp->header.pack_id;
4427 + rinfo[val].usr_ptr = srp->header.usr_ptr;
4428 + val++;
4429 + }
4430 +}
4431 +
4432 static long
4433 sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
4434 {
4435 @@ -1012,38 +1045,13 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
4436 return -EFAULT;
4437 else {
4438 sg_req_info_t *rinfo;
4439 - unsigned int ms;
4440
4441 - rinfo = kmalloc(SZ_SG_REQ_INFO * SG_MAX_QUEUE,
4442 - GFP_KERNEL);
4443 + rinfo = kzalloc(SZ_SG_REQ_INFO * SG_MAX_QUEUE,
4444 + GFP_KERNEL);
4445 if (!rinfo)
4446 return -ENOMEM;
4447 read_lock_irqsave(&sfp->rq_list_lock, iflags);
4448 - val = 0;
4449 - list_for_each_entry(srp, &sfp->rq_list, entry) {
4450 - if (val >= SG_MAX_QUEUE)
4451 - break;
4452 - memset(&rinfo[val], 0, SZ_SG_REQ_INFO);
4453 - rinfo[val].req_state = srp->done + 1;
4454 - rinfo[val].problem =
4455 - srp->header.masked_status &
4456 - srp->header.host_status &
4457 - srp->header.driver_status;
4458 - if (srp->done)
4459 - rinfo[val].duration =
4460 - srp->header.duration;
4461 - else {
4462 - ms = jiffies_to_msecs(jiffies);
4463 - rinfo[val].duration =
4464 - (ms > srp->header.duration) ?
4465 - (ms - srp->header.duration) : 0;
4466 - }
4467 - rinfo[val].orphan = srp->orphan;
4468 - rinfo[val].sg_io_owned = srp->sg_io_owned;
4469 - rinfo[val].pack_id = srp->header.pack_id;
4470 - rinfo[val].usr_ptr = srp->header.usr_ptr;
4471 - val++;
4472 - }
4473 + sg_fill_request_table(sfp, rinfo);
4474 read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
4475 result = __copy_to_user(p, rinfo,
4476 SZ_SG_REQ_INFO * SG_MAX_QUEUE);
4477 diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
4478 index 3cc8d67783a1..5e7200f05873 100644
4479 --- a/drivers/scsi/storvsc_drv.c
4480 +++ b/drivers/scsi/storvsc_drv.c
4481 @@ -1640,6 +1640,8 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd)
4482 put_cpu();
4483
4484 if (ret == -EAGAIN) {
4485 + if (payload_sz > sizeof(cmd_request->mpb))
4486 + kfree(payload);
4487 /* no more space */
4488 return SCSI_MLQUEUE_DEVICE_BUSY;
4489 }
4490 diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
4491 index 4e7a4e9dcf4d..f8eba1c5412f 100644
4492 --- a/drivers/tty/tty_buffer.c
4493 +++ b/drivers/tty/tty_buffer.c
4494 @@ -361,6 +361,32 @@ int tty_insert_flip_string_flags(struct tty_port *port,
4495 }
4496 EXPORT_SYMBOL(tty_insert_flip_string_flags);
4497
4498 +/**
4499 + * __tty_insert_flip_char - Add one character to the tty buffer
4500 + * @port: tty port
4501 + * @ch: character
4502 + * @flag: flag byte
4503 + *
4504 + * Queue a single byte to the tty buffering, with an optional flag.
4505 + * This is the slow path of tty_insert_flip_char.
4506 + */
4507 +int __tty_insert_flip_char(struct tty_port *port, unsigned char ch, char flag)
4508 +{
4509 + struct tty_buffer *tb;
4510 + int flags = (flag == TTY_NORMAL) ? TTYB_NORMAL : 0;
4511 +
4512 + if (!__tty_buffer_request_room(port, 1, flags))
4513 + return 0;
4514 +
4515 + tb = port->buf.tail;
4516 + if (~tb->flags & TTYB_NORMAL)
4517 + *flag_buf_ptr(tb, tb->used) = flag;
4518 + *char_buf_ptr(tb, tb->used++) = ch;
4519 +
4520 + return 1;
4521 +}
4522 +EXPORT_SYMBOL(__tty_insert_flip_char);
4523 +
4524 /**
4525 * tty_schedule_flip - push characters to ldisc
4526 * @port: tty port to push from
4527 diff --git a/fs/ext4/file.c b/fs/ext4/file.c
4528 index 0d7cf0cc9b87..86ea1d92839a 100644
4529 --- a/fs/ext4/file.c
4530 +++ b/fs/ext4/file.c
4531 @@ -595,7 +595,7 @@ static loff_t ext4_seek_data(struct file *file, loff_t offset, loff_t maxsize)
4532 inode_lock(inode);
4533
4534 isize = i_size_read(inode);
4535 - if (offset >= isize) {
4536 + if (offset < 0 || offset >= isize) {
4537 inode_unlock(inode);
4538 return -ENXIO;
4539 }
4540 @@ -658,7 +658,7 @@ static loff_t ext4_seek_hole(struct file *file, loff_t offset, loff_t maxsize)
4541 inode_lock(inode);
4542
4543 isize = i_size_read(inode);
4544 - if (offset >= isize) {
4545 + if (offset < 0 || offset >= isize) {
4546 inode_unlock(inode);
4547 return -ENXIO;
4548 }
4549 diff --git a/fs/ext4/super.c b/fs/ext4/super.c
4550 index d61a70e2193a..c9e7be58756b 100644
4551 --- a/fs/ext4/super.c
4552 +++ b/fs/ext4/super.c
4553 @@ -2404,6 +2404,7 @@ static void ext4_orphan_cleanup(struct super_block *sb,
4554 unsigned int s_flags = sb->s_flags;
4555 int ret, nr_orphans = 0, nr_truncates = 0;
4556 #ifdef CONFIG_QUOTA
4557 + int quota_update = 0;
4558 int i;
4559 #endif
4560 if (!es->s_last_orphan) {
4561 @@ -2442,14 +2443,32 @@ static void ext4_orphan_cleanup(struct super_block *sb,
4562 #ifdef CONFIG_QUOTA
4563 /* Needed for iput() to work correctly and not trash data */
4564 sb->s_flags |= MS_ACTIVE;
4565 - /* Turn on quotas so that they are updated correctly */
4566 +
4567 + /*
4568 + * Turn on quotas which were not enabled for read-only mounts if
4569 + * filesystem has quota feature, so that they are updated correctly.
4570 + */
4571 + if (ext4_has_feature_quota(sb) && (s_flags & MS_RDONLY)) {
4572 + int ret = ext4_enable_quotas(sb);
4573 +
4574 + if (!ret)
4575 + quota_update = 1;
4576 + else
4577 + ext4_msg(sb, KERN_ERR,
4578 + "Cannot turn on quotas: error %d", ret);
4579 + }
4580 +
4581 + /* Turn on journaled quotas used for old sytle */
4582 for (i = 0; i < EXT4_MAXQUOTAS; i++) {
4583 if (EXT4_SB(sb)->s_qf_names[i]) {
4584 int ret = ext4_quota_on_mount(sb, i);
4585 - if (ret < 0)
4586 +
4587 + if (!ret)
4588 + quota_update = 1;
4589 + else
4590 ext4_msg(sb, KERN_ERR,
4591 "Cannot turn on journaled "
4592 - "quota: error %d", ret);
4593 + "quota: type %d: error %d", i, ret);
4594 }
4595 }
4596 #endif
4597 @@ -2510,10 +2529,12 @@ static void ext4_orphan_cleanup(struct super_block *sb,
4598 ext4_msg(sb, KERN_INFO, "%d truncate%s cleaned up",
4599 PLURAL(nr_truncates));
4600 #ifdef CONFIG_QUOTA
4601 - /* Turn quotas off */
4602 - for (i = 0; i < EXT4_MAXQUOTAS; i++) {
4603 - if (sb_dqopt(sb)->files[i])
4604 - dquot_quota_off(sb, i);
4605 + /* Turn off quotas if they were enabled for orphan cleanup */
4606 + if (quota_update) {
4607 + for (i = 0; i < EXT4_MAXQUOTAS; i++) {
4608 + if (sb_dqopt(sb)->files[i])
4609 + dquot_quota_off(sb, i);
4610 + }
4611 }
4612 #endif
4613 sb->s_flags = s_flags; /* Restore MS_RDONLY status */
4614 @@ -5512,6 +5533,9 @@ static int ext4_enable_quotas(struct super_block *sb)
4615 DQUOT_USAGE_ENABLED |
4616 (quota_mopt[type] ? DQUOT_LIMITS_ENABLED : 0));
4617 if (err) {
4618 + for (type--; type >= 0; type--)
4619 + dquot_quota_off(sb, type);
4620 +
4621 ext4_warning(sb,
4622 "Failed to enable quota tracking "
4623 "(type=%d, err=%d). Please run "
4624 diff --git a/fs/orangefs/acl.c b/fs/orangefs/acl.c
4625 index 7a3754488312..9409aac232f7 100644
4626 --- a/fs/orangefs/acl.c
4627 +++ b/fs/orangefs/acl.c
4628 @@ -61,9 +61,9 @@ struct posix_acl *orangefs_get_acl(struct inode *inode, int type)
4629 return acl;
4630 }
4631
4632 -int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
4633 +static int __orangefs_set_acl(struct inode *inode, struct posix_acl *acl,
4634 + int type)
4635 {
4636 - struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
4637 int error = 0;
4638 void *value = NULL;
4639 size_t size = 0;
4640 @@ -72,22 +72,6 @@ int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
4641 switch (type) {
4642 case ACL_TYPE_ACCESS:
4643 name = XATTR_NAME_POSIX_ACL_ACCESS;
4644 - if (acl) {
4645 - umode_t mode;
4646 -
4647 - error = posix_acl_update_mode(inode, &mode, &acl);
4648 - if (error) {
4649 - gossip_err("%s: posix_acl_update_mode err: %d\n",
4650 - __func__,
4651 - error);
4652 - return error;
4653 - }
4654 -
4655 - if (inode->i_mode != mode)
4656 - SetModeFlag(orangefs_inode);
4657 - inode->i_mode = mode;
4658 - mark_inode_dirty_sync(inode);
4659 - }
4660 break;
4661 case ACL_TYPE_DEFAULT:
4662 name = XATTR_NAME_POSIX_ACL_DEFAULT;
4663 @@ -132,6 +116,29 @@ int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
4664 return error;
4665 }
4666
4667 +int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
4668 +{
4669 + int error;
4670 +
4671 + if (type == ACL_TYPE_ACCESS && acl) {
4672 + umode_t mode;
4673 +
4674 + error = posix_acl_update_mode(inode, &mode, &acl);
4675 + if (error) {
4676 + gossip_err("%s: posix_acl_update_mode err: %d\n",
4677 + __func__,
4678 + error);
4679 + return error;
4680 + }
4681 +
4682 + if (inode->i_mode != mode)
4683 + SetModeFlag(ORANGEFS_I(inode));
4684 + inode->i_mode = mode;
4685 + mark_inode_dirty_sync(inode);
4686 + }
4687 + return __orangefs_set_acl(inode, acl, type);
4688 +}
4689 +
4690 int orangefs_init_acl(struct inode *inode, struct inode *dir)
4691 {
4692 struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
4693 @@ -146,13 +153,14 @@ int orangefs_init_acl(struct inode *inode, struct inode *dir)
4694 return error;
4695
4696 if (default_acl) {
4697 - error = orangefs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
4698 + error = __orangefs_set_acl(inode, default_acl,
4699 + ACL_TYPE_DEFAULT);
4700 posix_acl_release(default_acl);
4701 }
4702
4703 if (acl) {
4704 if (!error)
4705 - error = orangefs_set_acl(inode, acl, ACL_TYPE_ACCESS);
4706 + error = __orangefs_set_acl(inode, acl, ACL_TYPE_ACCESS);
4707 posix_acl_release(acl);
4708 }
4709
4710 diff --git a/include/linux/ccp.h b/include/linux/ccp.h
4711 index 3285c944194a..ab693c3afd0d 100644
4712 --- a/include/linux/ccp.h
4713 +++ b/include/linux/ccp.h
4714 @@ -1,7 +1,7 @@
4715 /*
4716 * AMD Cryptographic Coprocessor (CCP) driver
4717 *
4718 - * Copyright (C) 2013,2016 Advanced Micro Devices, Inc.
4719 + * Copyright (C) 2013,2017 Advanced Micro Devices, Inc.
4720 *
4721 * Author: Tom Lendacky <thomas.lendacky@amd.com>
4722 * Author: Gary R Hook <gary.hook@amd.com>
4723 @@ -231,6 +231,7 @@ enum ccp_xts_aes_unit_size {
4724 * AES operation the new IV overwrites the old IV.
4725 */
4726 struct ccp_xts_aes_engine {
4727 + enum ccp_aes_type type;
4728 enum ccp_aes_action action;
4729 enum ccp_xts_aes_unit_size unit_size;
4730
4731 diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h
4732 index 898cfe2eeb42..bc46e729fdde 100644
4733 --- a/include/linux/cpuset.h
4734 +++ b/include/linux/cpuset.h
4735 @@ -57,7 +57,9 @@ static inline void cpuset_dec(void)
4736
4737 extern int cpuset_init(void);
4738 extern void cpuset_init_smp(void);
4739 +extern void cpuset_force_rebuild(void);
4740 extern void cpuset_update_active_cpus(void);
4741 +extern void cpuset_wait_for_hotplug(void);
4742 extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask);
4743 extern void cpuset_cpus_allowed_fallback(struct task_struct *p);
4744 extern nodemask_t cpuset_mems_allowed(struct task_struct *p);
4745 @@ -170,11 +172,15 @@ static inline bool cpusets_enabled(void) { return false; }
4746 static inline int cpuset_init(void) { return 0; }
4747 static inline void cpuset_init_smp(void) {}
4748
4749 +static inline void cpuset_force_rebuild(void) { }
4750 +
4751 static inline void cpuset_update_active_cpus(void)
4752 {
4753 partition_sched_domains(1, NULL, NULL);
4754 }
4755
4756 +static inline void cpuset_wait_for_hotplug(void) { }
4757 +
4758 static inline void cpuset_cpus_allowed(struct task_struct *p,
4759 struct cpumask *mask)
4760 {
4761 diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
4762 index 6383115e9d2c..2e028854bac7 100644
4763 --- a/include/linux/ftrace.h
4764 +++ b/include/linux/ftrace.h
4765 @@ -307,7 +307,7 @@ DECLARE_PER_CPU(int, disable_stack_tracer);
4766 static inline void stack_tracer_disable(void)
4767 {
4768 /* Preemption or interupts must be disabled */
4769 - if (IS_ENABLED(CONFIG_PREEMPT_DEBUG))
4770 + if (IS_ENABLED(CONFIG_DEBUG_PREEMPT))
4771 WARN_ON_ONCE(!preempt_count() || !irqs_disabled());
4772 this_cpu_inc(disable_stack_tracer);
4773 }
4774 @@ -320,7 +320,7 @@ static inline void stack_tracer_disable(void)
4775 */
4776 static inline void stack_tracer_enable(void)
4777 {
4778 - if (IS_ENABLED(CONFIG_PREEMPT_DEBUG))
4779 + if (IS_ENABLED(CONFIG_DEBUG_PREEMPT))
4780 WARN_ON_ONCE(!preempt_count() || !irqs_disabled());
4781 this_cpu_dec(disable_stack_tracer);
4782 }
4783 diff --git a/include/linux/tty_flip.h b/include/linux/tty_flip.h
4784 index c28dd523f96e..d43837f2ce3a 100644
4785 --- a/include/linux/tty_flip.h
4786 +++ b/include/linux/tty_flip.h
4787 @@ -12,6 +12,7 @@ extern int tty_prepare_flip_string(struct tty_port *port,
4788 unsigned char **chars, size_t size);
4789 extern void tty_flip_buffer_push(struct tty_port *port);
4790 void tty_schedule_flip(struct tty_port *port);
4791 +int __tty_insert_flip_char(struct tty_port *port, unsigned char ch, char flag);
4792
4793 static inline int tty_insert_flip_char(struct tty_port *port,
4794 unsigned char ch, char flag)
4795 @@ -26,7 +27,7 @@ static inline int tty_insert_flip_char(struct tty_port *port,
4796 *char_buf_ptr(tb, tb->used++) = ch;
4797 return 1;
4798 }
4799 - return tty_insert_flip_string_flags(port, &ch, &flag, 1);
4800 + return __tty_insert_flip_char(port, ch, flag);
4801 }
4802
4803 static inline int tty_insert_flip_string(struct tty_port *port,
4804 diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h
4805 index acdd6f915a8d..20ef8e6ec2db 100644
4806 --- a/include/linux/uaccess.h
4807 +++ b/include/linux/uaccess.h
4808 @@ -156,7 +156,7 @@ copy_to_user(void __user *to, const void *from, unsigned long n)
4809 }
4810 #ifdef CONFIG_COMPAT
4811 static __always_inline unsigned long __must_check
4812 -copy_in_user(void __user *to, const void *from, unsigned long n)
4813 +copy_in_user(void __user *to, const void __user *from, unsigned long n)
4814 {
4815 might_fault();
4816 if (access_ok(VERIFY_WRITE, to, n) && access_ok(VERIFY_READ, from, n))
4817 diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
4818 index 87a1213dd326..e8cb34193433 100644
4819 --- a/kernel/cgroup/cpuset.c
4820 +++ b/kernel/cgroup/cpuset.c
4821 @@ -2260,6 +2260,13 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs)
4822 mutex_unlock(&cpuset_mutex);
4823 }
4824
4825 +static bool force_rebuild;
4826 +
4827 +void cpuset_force_rebuild(void)
4828 +{
4829 + force_rebuild = true;
4830 +}
4831 +
4832 /**
4833 * cpuset_hotplug_workfn - handle CPU/memory hotunplug for a cpuset
4834 *
4835 @@ -2334,8 +2341,10 @@ static void cpuset_hotplug_workfn(struct work_struct *work)
4836 }
4837
4838 /* rebuild sched domains if cpus_allowed has changed */
4839 - if (cpus_updated)
4840 + if (cpus_updated || force_rebuild) {
4841 + force_rebuild = false;
4842 rebuild_sched_domains();
4843 + }
4844 }
4845
4846 void cpuset_update_active_cpus(void)
4847 @@ -2354,6 +2363,11 @@ void cpuset_update_active_cpus(void)
4848 schedule_work(&cpuset_hotplug_work);
4849 }
4850
4851 +void cpuset_wait_for_hotplug(void)
4852 +{
4853 + flush_work(&cpuset_hotplug_work);
4854 +}
4855 +
4856 /*
4857 * Keep top_cpuset.mems_allowed tracking node_states[N_MEMORY].
4858 * Call this routine anytime after node_states[N_MEMORY] changes.
4859 diff --git a/kernel/cpu.c b/kernel/cpu.c
4860 index eee033134262..a88c29ab09be 100644
4861 --- a/kernel/cpu.c
4862 +++ b/kernel/cpu.c
4863 @@ -1252,7 +1252,17 @@ static int cpuhp_store_callbacks(enum cpuhp_state state, const char *name,
4864 struct cpuhp_step *sp;
4865 int ret = 0;
4866
4867 - if (state == CPUHP_AP_ONLINE_DYN || state == CPUHP_BP_PREPARE_DYN) {
4868 + /*
4869 + * If name is NULL, then the state gets removed.
4870 + *
4871 + * CPUHP_AP_ONLINE_DYN and CPUHP_BP_PREPARE_DYN are handed out on
4872 + * the first allocation from these dynamic ranges, so the removal
4873 + * would trigger a new allocation and clear the wrong (already
4874 + * empty) state, leaving the callbacks of the to be cleared state
4875 + * dangling, which causes wreckage on the next hotplug operation.
4876 + */
4877 + if (name && (state == CPUHP_AP_ONLINE_DYN ||
4878 + state == CPUHP_BP_PREPARE_DYN)) {
4879 ret = cpuhp_reserve_state(state);
4880 if (ret < 0)
4881 return ret;
4882 diff --git a/kernel/power/process.c b/kernel/power/process.c
4883 index 78672d324a6e..50f25cb370c6 100644
4884 --- a/kernel/power/process.c
4885 +++ b/kernel/power/process.c
4886 @@ -20,8 +20,9 @@
4887 #include <linux/workqueue.h>
4888 #include <linux/kmod.h>
4889 #include <trace/events/power.h>
4890 +#include <linux/cpuset.h>
4891
4892 -/*
4893 +/*
4894 * Timeout for stopping processes
4895 */
4896 unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC;
4897 @@ -202,6 +203,8 @@ void thaw_processes(void)
4898 __usermodehelper_set_disable_depth(UMH_FREEZING);
4899 thaw_workqueues();
4900
4901 + cpuset_wait_for_hotplug();
4902 +
4903 read_lock(&tasklist_lock);
4904 for_each_process_thread(g, p) {
4905 /* No other threads should have PF_SUSPEND_TASK set */
4906 diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
4907 index d0ca524bf042..258a9abee0b0 100644
4908 --- a/kernel/rcu/srcutree.c
4909 +++ b/kernel/rcu/srcutree.c
4910 @@ -896,6 +896,15 @@ static void __synchronize_srcu(struct srcu_struct *sp, bool do_norm)
4911 __call_srcu(sp, &rcu.head, wakeme_after_rcu, do_norm);
4912 wait_for_completion(&rcu.completion);
4913 destroy_rcu_head_on_stack(&rcu.head);
4914 +
4915 + /*
4916 + * Make sure that later code is ordered after the SRCU grace
4917 + * period. This pairs with the raw_spin_lock_irq_rcu_node()
4918 + * in srcu_invoke_callbacks(). Unlike Tree RCU, this is needed
4919 + * because the current CPU might have been totally uninvolved with
4920 + * (and thus unordered against) that grace period.
4921 + */
4922 + smp_mb();
4923 }
4924
4925 /**
4926 diff --git a/kernel/sched/core.c b/kernel/sched/core.c
4927 index 0869b20fba81..99326c370c9c 100644
4928 --- a/kernel/sched/core.c
4929 +++ b/kernel/sched/core.c
4930 @@ -5538,16 +5538,15 @@ static void cpuset_cpu_active(void)
4931 * operation in the resume sequence, just build a single sched
4932 * domain, ignoring cpusets.
4933 */
4934 - num_cpus_frozen--;
4935 - if (likely(num_cpus_frozen)) {
4936 - partition_sched_domains(1, NULL, NULL);
4937 + partition_sched_domains(1, NULL, NULL);
4938 + if (--num_cpus_frozen)
4939 return;
4940 - }
4941 /*
4942 * This is the last CPU online operation. So fall through and
4943 * restore the original sched domains by considering the
4944 * cpuset configurations.
4945 */
4946 + cpuset_force_rebuild();
4947 }
4948 cpuset_update_active_cpus();
4949 }
4950 diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
4951 index 96cea88fa00f..725819569fa7 100644
4952 --- a/kernel/trace/ftrace.c
4953 +++ b/kernel/trace/ftrace.c
4954 @@ -2828,13 +2828,14 @@ static int ftrace_shutdown(struct ftrace_ops *ops, int command)
4955
4956 if (!command || !ftrace_enabled) {
4957 /*
4958 - * If these are per_cpu ops, they still need their
4959 - * per_cpu field freed. Since, function tracing is
4960 + * If these are dynamic or per_cpu ops, they still
4961 + * need their data freed. Since, function tracing is
4962 * not currently active, we can just free them
4963 * without synchronizing all CPUs.
4964 */
4965 - if (ops->flags & FTRACE_OPS_FL_PER_CPU)
4966 - per_cpu_ops_free(ops);
4967 + if (ops->flags & (FTRACE_OPS_FL_DYNAMIC | FTRACE_OPS_FL_PER_CPU))
4968 + goto free_ops;
4969 +
4970 return 0;
4971 }
4972
4973 @@ -2900,6 +2901,7 @@ static int ftrace_shutdown(struct ftrace_ops *ops, int command)
4974 if (IS_ENABLED(CONFIG_PREEMPT))
4975 synchronize_rcu_tasks();
4976
4977 + free_ops:
4978 arch_ftrace_trampoline_free(ops);
4979
4980 if (ops->flags & FTRACE_OPS_FL_PER_CPU)
4981 diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
4982 index 44004d8aa3b3..5efb4b63174e 100644
4983 --- a/kernel/trace/trace.c
4984 +++ b/kernel/trace/trace.c
4985 @@ -2799,11 +2799,17 @@ static char *get_trace_buf(void)
4986 if (!buffer || buffer->nesting >= 4)
4987 return NULL;
4988
4989 - return &buffer->buffer[buffer->nesting++][0];
4990 + buffer->nesting++;
4991 +
4992 + /* Interrupts must see nesting incremented before we use the buffer */
4993 + barrier();
4994 + return &buffer->buffer[buffer->nesting][0];
4995 }
4996
4997 static void put_trace_buf(void)
4998 {
4999 + /* Don't let the decrement of nesting leak before this */
5000 + barrier();
5001 this_cpu_dec(trace_percpu_buffer->nesting);
5002 }
5003
5004 @@ -6220,7 +6226,7 @@ static int tracing_set_clock(struct trace_array *tr, const char *clockstr)
5005 tracing_reset_online_cpus(&tr->trace_buffer);
5006
5007 #ifdef CONFIG_TRACER_MAX_TRACE
5008 - if (tr->flags & TRACE_ARRAY_FL_GLOBAL && tr->max_buffer.buffer)
5009 + if (tr->max_buffer.buffer)
5010 ring_buffer_set_clock(tr->max_buffer.buffer, trace_clocks[i].func);
5011 tracing_reset_online_cpus(&tr->max_buffer);
5012 #endif
5013 diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
5014 index 36132f9280e6..51a6e09a7410 100644
5015 --- a/kernel/trace/trace_events.c
5016 +++ b/kernel/trace/trace_events.c
5017 @@ -406,7 +406,7 @@ static int __ftrace_event_enable_disable(struct trace_event_file *file,
5018
5019 if (file->flags & EVENT_FILE_FL_RECORDED_TGID) {
5020 tracing_stop_tgid_record();
5021 - clear_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags);
5022 + clear_bit(EVENT_FILE_FL_RECORDED_TGID_BIT, &file->flags);
5023 }
5024
5025 call->class->reg(call, TRACE_REG_UNREGISTER, file);
5026 diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c
5027 index cb917cebae29..b17ec642793b 100644
5028 --- a/kernel/trace/trace_selftest.c
5029 +++ b/kernel/trace/trace_selftest.c
5030 @@ -273,7 +273,7 @@ static int trace_selftest_ops(struct trace_array *tr, int cnt)
5031 goto out_free;
5032 if (cnt > 1) {
5033 if (trace_selftest_test_global_cnt == 0)
5034 - goto out;
5035 + goto out_free;
5036 }
5037 if (trace_selftest_test_dyn_cnt == 0)
5038 goto out_free;
5039 diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
5040 index 9979f46c81dc..51390febd5e3 100644
5041 --- a/net/netfilter/nf_conntrack_core.c
5042 +++ b/net/netfilter/nf_conntrack_core.c
5043 @@ -96,19 +96,26 @@ static struct conntrack_gc_work conntrack_gc_work;
5044
5045 void nf_conntrack_lock(spinlock_t *lock) __acquires(lock)
5046 {
5047 + /* 1) Acquire the lock */
5048 spin_lock(lock);
5049 - while (unlikely(nf_conntrack_locks_all)) {
5050 - spin_unlock(lock);
5051
5052 - /*
5053 - * Order the 'nf_conntrack_locks_all' load vs. the
5054 - * spin_unlock_wait() loads below, to ensure
5055 - * that 'nf_conntrack_locks_all_lock' is indeed held:
5056 - */
5057 - smp_rmb(); /* spin_lock(&nf_conntrack_locks_all_lock) */
5058 - spin_unlock_wait(&nf_conntrack_locks_all_lock);
5059 - spin_lock(lock);
5060 - }
5061 + /* 2) read nf_conntrack_locks_all, with ACQUIRE semantics
5062 + * It pairs with the smp_store_release() in nf_conntrack_all_unlock()
5063 + */
5064 + if (likely(smp_load_acquire(&nf_conntrack_locks_all) == false))
5065 + return;
5066 +
5067 + /* fast path failed, unlock */
5068 + spin_unlock(lock);
5069 +
5070 + /* Slow path 1) get global lock */
5071 + spin_lock(&nf_conntrack_locks_all_lock);
5072 +
5073 + /* Slow path 2) get the lock we want */
5074 + spin_lock(lock);
5075 +
5076 + /* Slow path 3) release the global lock */
5077 + spin_unlock(&nf_conntrack_locks_all_lock);
5078 }
5079 EXPORT_SYMBOL_GPL(nf_conntrack_lock);
5080
5081 @@ -149,28 +156,27 @@ static void nf_conntrack_all_lock(void)
5082 int i;
5083
5084 spin_lock(&nf_conntrack_locks_all_lock);
5085 - nf_conntrack_locks_all = true;
5086
5087 - /*
5088 - * Order the above store of 'nf_conntrack_locks_all' against
5089 - * the spin_unlock_wait() loads below, such that if
5090 - * nf_conntrack_lock() observes 'nf_conntrack_locks_all'
5091 - * we must observe nf_conntrack_locks[] held:
5092 - */
5093 - smp_mb(); /* spin_lock(&nf_conntrack_locks_all_lock) */
5094 + nf_conntrack_locks_all = true;
5095
5096 for (i = 0; i < CONNTRACK_LOCKS; i++) {
5097 - spin_unlock_wait(&nf_conntrack_locks[i]);
5098 + spin_lock(&nf_conntrack_locks[i]);
5099 +
5100 + /* This spin_unlock provides the "release" to ensure that
5101 + * nf_conntrack_locks_all==true is visible to everyone that
5102 + * acquired spin_lock(&nf_conntrack_locks[]).
5103 + */
5104 + spin_unlock(&nf_conntrack_locks[i]);
5105 }
5106 }
5107
5108 static void nf_conntrack_all_unlock(void)
5109 {
5110 - /*
5111 - * All prior stores must be complete before we clear
5112 + /* All prior stores must be complete before we clear
5113 * 'nf_conntrack_locks_all'. Otherwise nf_conntrack_lock()
5114 * might observe the false value but not the entire
5115 - * critical section:
5116 + * critical section.
5117 + * It pairs with the smp_load_acquire() in nf_conntrack_lock()
5118 */
5119 smp_store_release(&nf_conntrack_locks_all, false);
5120 spin_unlock(&nf_conntrack_locks_all_lock);
5121 diff --git a/sound/core/seq_device.c b/sound/core/seq_device.c
5122 index c4acf17e9f5e..e40a2cba5002 100644
5123 --- a/sound/core/seq_device.c
5124 +++ b/sound/core/seq_device.c
5125 @@ -148,8 +148,10 @@ void snd_seq_device_load_drivers(void)
5126 flush_work(&autoload_work);
5127 }
5128 EXPORT_SYMBOL(snd_seq_device_load_drivers);
5129 +#define cancel_autoload_drivers() cancel_work_sync(&autoload_work)
5130 #else
5131 #define queue_autoload_drivers() /* NOP */
5132 +#define cancel_autoload_drivers() /* NOP */
5133 #endif
5134
5135 /*
5136 @@ -159,6 +161,7 @@ static int snd_seq_device_dev_free(struct snd_device *device)
5137 {
5138 struct snd_seq_device *dev = device->device_data;
5139
5140 + cancel_autoload_drivers();
5141 put_device(&dev->dev);
5142 return 0;
5143 }