Annotation of /trunk/kernel-alx/patches-4.4/0106-4.4.7-all-fixes.patch
Parent Directory | Revision Log
Revision 2798 -
(hide annotations)
(download)
Mon May 30 12:45:54 2016 UTC (8 years, 3 months ago) by niro
File size: 278845 byte(s)
Mon May 30 12:45:54 2016 UTC (8 years, 3 months ago) by niro
File size: 278845 byte(s)
-linux-4.4.7
1 | niro | 2798 | diff --git a/MAINTAINERS b/MAINTAINERS |
2 | index d826f1b9eb02..4c3e1d2ac31b 100644 | ||
3 | --- a/MAINTAINERS | ||
4 | +++ b/MAINTAINERS | ||
5 | @@ -230,13 +230,13 @@ F: kernel/sys_ni.c | ||
6 | |||
7 | ABIT UGURU 1,2 HARDWARE MONITOR DRIVER | ||
8 | M: Hans de Goede <hdegoede@redhat.com> | ||
9 | -L: lm-sensors@lm-sensors.org | ||
10 | +L: linux-hwmon@vger.kernel.org | ||
11 | S: Maintained | ||
12 | F: drivers/hwmon/abituguru.c | ||
13 | |||
14 | ABIT UGURU 3 HARDWARE MONITOR DRIVER | ||
15 | M: Alistair John Strachan <alistair@devzero.co.uk> | ||
16 | -L: lm-sensors@lm-sensors.org | ||
17 | +L: linux-hwmon@vger.kernel.org | ||
18 | S: Maintained | ||
19 | F: drivers/hwmon/abituguru3.c | ||
20 | |||
21 | @@ -373,14 +373,14 @@ S: Maintained | ||
22 | |||
23 | ADM1025 HARDWARE MONITOR DRIVER | ||
24 | M: Jean Delvare <jdelvare@suse.com> | ||
25 | -L: lm-sensors@lm-sensors.org | ||
26 | +L: linux-hwmon@vger.kernel.org | ||
27 | S: Maintained | ||
28 | F: Documentation/hwmon/adm1025 | ||
29 | F: drivers/hwmon/adm1025.c | ||
30 | |||
31 | ADM1029 HARDWARE MONITOR DRIVER | ||
32 | M: Corentin Labbe <clabbe.montjoie@gmail.com> | ||
33 | -L: lm-sensors@lm-sensors.org | ||
34 | +L: linux-hwmon@vger.kernel.org | ||
35 | S: Maintained | ||
36 | F: drivers/hwmon/adm1029.c | ||
37 | |||
38 | @@ -425,7 +425,7 @@ F: drivers/video/backlight/adp8860_bl.c | ||
39 | |||
40 | ADS1015 HARDWARE MONITOR DRIVER | ||
41 | M: Dirk Eibach <eibach@gdsys.de> | ||
42 | -L: lm-sensors@lm-sensors.org | ||
43 | +L: linux-hwmon@vger.kernel.org | ||
44 | S: Maintained | ||
45 | F: Documentation/hwmon/ads1015 | ||
46 | F: drivers/hwmon/ads1015.c | ||
47 | @@ -438,7 +438,7 @@ F: drivers/macintosh/therm_adt746x.c | ||
48 | |||
49 | ADT7475 HARDWARE MONITOR DRIVER | ||
50 | M: Jean Delvare <jdelvare@suse.com> | ||
51 | -L: lm-sensors@lm-sensors.org | ||
52 | +L: linux-hwmon@vger.kernel.org | ||
53 | S: Maintained | ||
54 | F: Documentation/hwmon/adt7475 | ||
55 | F: drivers/hwmon/adt7475.c | ||
56 | @@ -615,7 +615,7 @@ F: include/linux/ccp.h | ||
57 | |||
58 | AMD FAM15H PROCESSOR POWER MONITORING DRIVER | ||
59 | M: Andreas Herrmann <herrmann.der.user@googlemail.com> | ||
60 | -L: lm-sensors@lm-sensors.org | ||
61 | +L: linux-hwmon@vger.kernel.org | ||
62 | S: Maintained | ||
63 | F: Documentation/hwmon/fam15h_power | ||
64 | F: drivers/hwmon/fam15h_power.c | ||
65 | @@ -779,7 +779,7 @@ F: drivers/input/mouse/bcm5974.c | ||
66 | |||
67 | APPLE SMC DRIVER | ||
68 | M: Henrik Rydberg <rydberg@bitmath.org> | ||
69 | -L: lm-sensors@lm-sensors.org | ||
70 | +L: linux-hwmon@vger.kernel.org | ||
71 | S: Odd fixes | ||
72 | F: drivers/hwmon/applesmc.c | ||
73 | |||
74 | @@ -1777,7 +1777,7 @@ F: include/media/as3645a.h | ||
75 | |||
76 | ASC7621 HARDWARE MONITOR DRIVER | ||
77 | M: George Joseph <george.joseph@fairview5.com> | ||
78 | -L: lm-sensors@lm-sensors.org | ||
79 | +L: linux-hwmon@vger.kernel.org | ||
80 | S: Maintained | ||
81 | F: Documentation/hwmon/asc7621 | ||
82 | F: drivers/hwmon/asc7621.c | ||
83 | @@ -1864,7 +1864,7 @@ F: drivers/net/wireless/ath/carl9170/ | ||
84 | |||
85 | ATK0110 HWMON DRIVER | ||
86 | M: Luca Tettamanti <kronos.it@gmail.com> | ||
87 | -L: lm-sensors@lm-sensors.org | ||
88 | +L: linux-hwmon@vger.kernel.org | ||
89 | S: Maintained | ||
90 | F: drivers/hwmon/asus_atk0110.c | ||
91 | |||
92 | @@ -2984,7 +2984,7 @@ F: mm/swap_cgroup.c | ||
93 | |||
94 | CORETEMP HARDWARE MONITORING DRIVER | ||
95 | M: Fenghua Yu <fenghua.yu@intel.com> | ||
96 | -L: lm-sensors@lm-sensors.org | ||
97 | +L: linux-hwmon@vger.kernel.org | ||
98 | S: Maintained | ||
99 | F: Documentation/hwmon/coretemp | ||
100 | F: drivers/hwmon/coretemp.c | ||
101 | @@ -3549,7 +3549,7 @@ T: git git://git.infradead.org/users/vkoul/slave-dma.git | ||
102 | |||
103 | DME1737 HARDWARE MONITOR DRIVER | ||
104 | M: Juerg Haefliger <juergh@gmail.com> | ||
105 | -L: lm-sensors@lm-sensors.org | ||
106 | +L: linux-hwmon@vger.kernel.org | ||
107 | S: Maintained | ||
108 | F: Documentation/hwmon/dme1737 | ||
109 | F: drivers/hwmon/dme1737.c | ||
110 | @@ -4262,7 +4262,7 @@ F: include/video/exynos_mipi* | ||
111 | |||
112 | F71805F HARDWARE MONITORING DRIVER | ||
113 | M: Jean Delvare <jdelvare@suse.com> | ||
114 | -L: lm-sensors@lm-sensors.org | ||
115 | +L: linux-hwmon@vger.kernel.org | ||
116 | S: Maintained | ||
117 | F: Documentation/hwmon/f71805f | ||
118 | F: drivers/hwmon/f71805f.c | ||
119 | @@ -4341,7 +4341,7 @@ F: fs/* | ||
120 | |||
121 | FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER | ||
122 | M: Riku Voipio <riku.voipio@iki.fi> | ||
123 | -L: lm-sensors@lm-sensors.org | ||
124 | +L: linux-hwmon@vger.kernel.org | ||
125 | S: Maintained | ||
126 | F: drivers/hwmon/f75375s.c | ||
127 | F: include/linux/f75375s.h | ||
128 | @@ -4883,8 +4883,8 @@ F: drivers/media/usb/hackrf/ | ||
129 | HARDWARE MONITORING | ||
130 | M: Jean Delvare <jdelvare@suse.com> | ||
131 | M: Guenter Roeck <linux@roeck-us.net> | ||
132 | -L: lm-sensors@lm-sensors.org | ||
133 | -W: http://www.lm-sensors.org/ | ||
134 | +L: linux-hwmon@vger.kernel.org | ||
135 | +W: http://hwmon.wiki.kernel.org/ | ||
136 | T: quilt http://jdelvare.nerim.net/devel/linux/jdelvare-hwmon/ | ||
137 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git | ||
138 | S: Maintained | ||
139 | @@ -5393,7 +5393,7 @@ F: drivers/usb/atm/ueagle-atm.c | ||
140 | |||
141 | INA209 HARDWARE MONITOR DRIVER | ||
142 | M: Guenter Roeck <linux@roeck-us.net> | ||
143 | -L: lm-sensors@lm-sensors.org | ||
144 | +L: linux-hwmon@vger.kernel.org | ||
145 | S: Maintained | ||
146 | F: Documentation/hwmon/ina209 | ||
147 | F: Documentation/devicetree/bindings/i2c/ina209.txt | ||
148 | @@ -5401,7 +5401,7 @@ F: drivers/hwmon/ina209.c | ||
149 | |||
150 | INA2XX HARDWARE MONITOR DRIVER | ||
151 | M: Guenter Roeck <linux@roeck-us.net> | ||
152 | -L: lm-sensors@lm-sensors.org | ||
153 | +L: linux-hwmon@vger.kernel.org | ||
154 | S: Maintained | ||
155 | F: Documentation/hwmon/ina2xx | ||
156 | F: drivers/hwmon/ina2xx.c | ||
157 | @@ -5884,7 +5884,7 @@ F: drivers/isdn/hardware/eicon/ | ||
158 | |||
159 | IT87 HARDWARE MONITORING DRIVER | ||
160 | M: Jean Delvare <jdelvare@suse.com> | ||
161 | -L: lm-sensors@lm-sensors.org | ||
162 | +L: linux-hwmon@vger.kernel.org | ||
163 | S: Maintained | ||
164 | F: Documentation/hwmon/it87 | ||
165 | F: drivers/hwmon/it87.c | ||
166 | @@ -5920,7 +5920,7 @@ F: drivers/media/dvb-frontends/ix2505v* | ||
167 | |||
168 | JC42.4 TEMPERATURE SENSOR DRIVER | ||
169 | M: Guenter Roeck <linux@roeck-us.net> | ||
170 | -L: lm-sensors@lm-sensors.org | ||
171 | +L: linux-hwmon@vger.kernel.org | ||
172 | S: Maintained | ||
173 | F: drivers/hwmon/jc42.c | ||
174 | F: Documentation/hwmon/jc42 | ||
175 | @@ -5970,14 +5970,14 @@ F: drivers/tty/serial/jsm/ | ||
176 | |||
177 | K10TEMP HARDWARE MONITORING DRIVER | ||
178 | M: Clemens Ladisch <clemens@ladisch.de> | ||
179 | -L: lm-sensors@lm-sensors.org | ||
180 | +L: linux-hwmon@vger.kernel.org | ||
181 | S: Maintained | ||
182 | F: Documentation/hwmon/k10temp | ||
183 | F: drivers/hwmon/k10temp.c | ||
184 | |||
185 | K8TEMP HARDWARE MONITORING DRIVER | ||
186 | M: Rudolf Marek <r.marek@assembler.cz> | ||
187 | -L: lm-sensors@lm-sensors.org | ||
188 | +L: linux-hwmon@vger.kernel.org | ||
189 | S: Maintained | ||
190 | F: Documentation/hwmon/k8temp | ||
191 | F: drivers/hwmon/k8temp.c | ||
192 | @@ -6485,27 +6485,27 @@ F: net/llc/ | ||
193 | |||
194 | LM73 HARDWARE MONITOR DRIVER | ||
195 | M: Guillaume Ligneul <guillaume.ligneul@gmail.com> | ||
196 | -L: lm-sensors@lm-sensors.org | ||
197 | +L: linux-hwmon@vger.kernel.org | ||
198 | S: Maintained | ||
199 | F: drivers/hwmon/lm73.c | ||
200 | |||
201 | LM78 HARDWARE MONITOR DRIVER | ||
202 | M: Jean Delvare <jdelvare@suse.com> | ||
203 | -L: lm-sensors@lm-sensors.org | ||
204 | +L: linux-hwmon@vger.kernel.org | ||
205 | S: Maintained | ||
206 | F: Documentation/hwmon/lm78 | ||
207 | F: drivers/hwmon/lm78.c | ||
208 | |||
209 | LM83 HARDWARE MONITOR DRIVER | ||
210 | M: Jean Delvare <jdelvare@suse.com> | ||
211 | -L: lm-sensors@lm-sensors.org | ||
212 | +L: linux-hwmon@vger.kernel.org | ||
213 | S: Maintained | ||
214 | F: Documentation/hwmon/lm83 | ||
215 | F: drivers/hwmon/lm83.c | ||
216 | |||
217 | LM90 HARDWARE MONITOR DRIVER | ||
218 | M: Jean Delvare <jdelvare@suse.com> | ||
219 | -L: lm-sensors@lm-sensors.org | ||
220 | +L: linux-hwmon@vger.kernel.org | ||
221 | S: Maintained | ||
222 | F: Documentation/hwmon/lm90 | ||
223 | F: Documentation/devicetree/bindings/hwmon/lm90.txt | ||
224 | @@ -6513,7 +6513,7 @@ F: drivers/hwmon/lm90.c | ||
225 | |||
226 | LM95234 HARDWARE MONITOR DRIVER | ||
227 | M: Guenter Roeck <linux@roeck-us.net> | ||
228 | -L: lm-sensors@lm-sensors.org | ||
229 | +L: linux-hwmon@vger.kernel.org | ||
230 | S: Maintained | ||
231 | F: Documentation/hwmon/lm95234 | ||
232 | F: drivers/hwmon/lm95234.c | ||
233 | @@ -6580,7 +6580,7 @@ F: drivers/scsi/sym53c8xx_2/ | ||
234 | |||
235 | LTC4261 HARDWARE MONITOR DRIVER | ||
236 | M: Guenter Roeck <linux@roeck-us.net> | ||
237 | -L: lm-sensors@lm-sensors.org | ||
238 | +L: linux-hwmon@vger.kernel.org | ||
239 | S: Maintained | ||
240 | F: Documentation/hwmon/ltc4261 | ||
241 | F: drivers/hwmon/ltc4261.c | ||
242 | @@ -6749,28 +6749,28 @@ F: include/uapi/linux/matroxfb.h | ||
243 | |||
244 | MAX16065 HARDWARE MONITOR DRIVER | ||
245 | M: Guenter Roeck <linux@roeck-us.net> | ||
246 | -L: lm-sensors@lm-sensors.org | ||
247 | +L: linux-hwmon@vger.kernel.org | ||
248 | S: Maintained | ||
249 | F: Documentation/hwmon/max16065 | ||
250 | F: drivers/hwmon/max16065.c | ||
251 | |||
252 | MAX20751 HARDWARE MONITOR DRIVER | ||
253 | M: Guenter Roeck <linux@roeck-us.net> | ||
254 | -L: lm-sensors@lm-sensors.org | ||
255 | +L: linux-hwmon@vger.kernel.org | ||
256 | S: Maintained | ||
257 | F: Documentation/hwmon/max20751 | ||
258 | F: drivers/hwmon/max20751.c | ||
259 | |||
260 | MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER | ||
261 | M: "Hans J. Koch" <hjk@hansjkoch.de> | ||
262 | -L: lm-sensors@lm-sensors.org | ||
263 | +L: linux-hwmon@vger.kernel.org | ||
264 | S: Maintained | ||
265 | F: Documentation/hwmon/max6650 | ||
266 | F: drivers/hwmon/max6650.c | ||
267 | |||
268 | MAX6697 HARDWARE MONITOR DRIVER | ||
269 | M: Guenter Roeck <linux@roeck-us.net> | ||
270 | -L: lm-sensors@lm-sensors.org | ||
271 | +L: linux-hwmon@vger.kernel.org | ||
272 | S: Maintained | ||
273 | F: Documentation/hwmon/max6697 | ||
274 | F: Documentation/devicetree/bindings/i2c/max6697.txt | ||
275 | @@ -7303,7 +7303,7 @@ F: drivers/scsi/NCR_D700.* | ||
276 | |||
277 | NCT6775 HARDWARE MONITOR DRIVER | ||
278 | M: Guenter Roeck <linux@roeck-us.net> | ||
279 | -L: lm-sensors@lm-sensors.org | ||
280 | +L: linux-hwmon@vger.kernel.org | ||
281 | S: Maintained | ||
282 | F: Documentation/hwmon/nct6775 | ||
283 | F: drivers/hwmon/nct6775.c | ||
284 | @@ -8064,7 +8064,7 @@ F: drivers/video/logo/logo_parisc* | ||
285 | |||
286 | PC87360 HARDWARE MONITORING DRIVER | ||
287 | M: Jim Cromie <jim.cromie@gmail.com> | ||
288 | -L: lm-sensors@lm-sensors.org | ||
289 | +L: linux-hwmon@vger.kernel.org | ||
290 | S: Maintained | ||
291 | F: Documentation/hwmon/pc87360 | ||
292 | F: drivers/hwmon/pc87360.c | ||
293 | @@ -8076,7 +8076,7 @@ F: drivers/char/pc8736x_gpio.c | ||
294 | |||
295 | PC87427 HARDWARE MONITORING DRIVER | ||
296 | M: Jean Delvare <jdelvare@suse.com> | ||
297 | -L: lm-sensors@lm-sensors.org | ||
298 | +L: linux-hwmon@vger.kernel.org | ||
299 | S: Maintained | ||
300 | F: Documentation/hwmon/pc87427 | ||
301 | F: drivers/hwmon/pc87427.c | ||
302 | @@ -8415,8 +8415,8 @@ F: drivers/rtc/rtc-puv3.c | ||
303 | |||
304 | PMBUS HARDWARE MONITORING DRIVERS | ||
305 | M: Guenter Roeck <linux@roeck-us.net> | ||
306 | -L: lm-sensors@lm-sensors.org | ||
307 | -W: http://www.lm-sensors.org/ | ||
308 | +L: linux-hwmon@vger.kernel.org | ||
309 | +W: http://hwmon.wiki.kernel.org/ | ||
310 | W: http://www.roeck-us.net/linux/drivers/ | ||
311 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git | ||
312 | S: Maintained | ||
313 | @@ -8610,7 +8610,7 @@ F: drivers/media/usb/pwc/* | ||
314 | |||
315 | PWM FAN DRIVER | ||
316 | M: Kamil Debski <k.debski@samsung.com> | ||
317 | -L: lm-sensors@lm-sensors.org | ||
318 | +L: linux-hwmon@vger.kernel.org | ||
319 | S: Supported | ||
320 | F: Documentation/devicetree/bindings/hwmon/pwm-fan.txt | ||
321 | F: Documentation/hwmon/pwm-fan | ||
322 | @@ -9882,28 +9882,28 @@ F: Documentation/devicetree/bindings/media/i2c/nokia,smia.txt | ||
323 | |||
324 | SMM665 HARDWARE MONITOR DRIVER | ||
325 | M: Guenter Roeck <linux@roeck-us.net> | ||
326 | -L: lm-sensors@lm-sensors.org | ||
327 | +L: linux-hwmon@vger.kernel.org | ||
328 | S: Maintained | ||
329 | F: Documentation/hwmon/smm665 | ||
330 | F: drivers/hwmon/smm665.c | ||
331 | |||
332 | SMSC EMC2103 HARDWARE MONITOR DRIVER | ||
333 | M: Steve Glendinning <steve.glendinning@shawell.net> | ||
334 | -L: lm-sensors@lm-sensors.org | ||
335 | +L: linux-hwmon@vger.kernel.org | ||
336 | S: Maintained | ||
337 | F: Documentation/hwmon/emc2103 | ||
338 | F: drivers/hwmon/emc2103.c | ||
339 | |||
340 | SMSC SCH5627 HARDWARE MONITOR DRIVER | ||
341 | M: Hans de Goede <hdegoede@redhat.com> | ||
342 | -L: lm-sensors@lm-sensors.org | ||
343 | +L: linux-hwmon@vger.kernel.org | ||
344 | S: Supported | ||
345 | F: Documentation/hwmon/sch5627 | ||
346 | F: drivers/hwmon/sch5627.c | ||
347 | |||
348 | SMSC47B397 HARDWARE MONITOR DRIVER | ||
349 | M: Jean Delvare <jdelvare@suse.com> | ||
350 | -L: lm-sensors@lm-sensors.org | ||
351 | +L: linux-hwmon@vger.kernel.org | ||
352 | S: Maintained | ||
353 | F: Documentation/hwmon/smsc47b397 | ||
354 | F: drivers/hwmon/smsc47b397.c | ||
355 | @@ -10830,7 +10830,7 @@ F: include/linux/mmc/sh_mobile_sdhi.h | ||
356 | |||
357 | TMP401 HARDWARE MONITOR DRIVER | ||
358 | M: Guenter Roeck <linux@roeck-us.net> | ||
359 | -L: lm-sensors@lm-sensors.org | ||
360 | +L: linux-hwmon@vger.kernel.org | ||
361 | S: Maintained | ||
362 | F: Documentation/hwmon/tmp401 | ||
363 | F: drivers/hwmon/tmp401.c | ||
364 | @@ -11564,14 +11564,14 @@ F: Documentation/networking/vrf.txt | ||
365 | |||
366 | VT1211 HARDWARE MONITOR DRIVER | ||
367 | M: Juerg Haefliger <juergh@gmail.com> | ||
368 | -L: lm-sensors@lm-sensors.org | ||
369 | +L: linux-hwmon@vger.kernel.org | ||
370 | S: Maintained | ||
371 | F: Documentation/hwmon/vt1211 | ||
372 | F: drivers/hwmon/vt1211.c | ||
373 | |||
374 | VT8231 HARDWARE MONITOR DRIVER | ||
375 | M: Roger Lucas <vt8231@hiddenengine.co.uk> | ||
376 | -L: lm-sensors@lm-sensors.org | ||
377 | +L: linux-hwmon@vger.kernel.org | ||
378 | S: Maintained | ||
379 | F: drivers/hwmon/vt8231.c | ||
380 | |||
381 | @@ -11590,21 +11590,21 @@ F: drivers/w1/ | ||
382 | |||
383 | W83791D HARDWARE MONITORING DRIVER | ||
384 | M: Marc Hulsman <m.hulsman@tudelft.nl> | ||
385 | -L: lm-sensors@lm-sensors.org | ||
386 | +L: linux-hwmon@vger.kernel.org | ||
387 | S: Maintained | ||
388 | F: Documentation/hwmon/w83791d | ||
389 | F: drivers/hwmon/w83791d.c | ||
390 | |||
391 | W83793 HARDWARE MONITORING DRIVER | ||
392 | M: Rudolf Marek <r.marek@assembler.cz> | ||
393 | -L: lm-sensors@lm-sensors.org | ||
394 | +L: linux-hwmon@vger.kernel.org | ||
395 | S: Maintained | ||
396 | F: Documentation/hwmon/w83793 | ||
397 | F: drivers/hwmon/w83793.c | ||
398 | |||
399 | W83795 HARDWARE MONITORING DRIVER | ||
400 | M: Jean Delvare <jdelvare@suse.com> | ||
401 | -L: lm-sensors@lm-sensors.org | ||
402 | +L: linux-hwmon@vger.kernel.org | ||
403 | S: Maintained | ||
404 | F: drivers/hwmon/w83795.c | ||
405 | |||
406 | diff --git a/Makefile b/Makefile | ||
407 | index 87d12b44ab66..5a493e785aca 100644 | ||
408 | --- a/Makefile | ||
409 | +++ b/Makefile | ||
410 | @@ -1,6 +1,6 @@ | ||
411 | VERSION = 4 | ||
412 | PATCHLEVEL = 4 | ||
413 | -SUBLEVEL = 6 | ||
414 | +SUBLEVEL = 7 | ||
415 | EXTRAVERSION = | ||
416 | NAME = Blurry Fish Butt | ||
417 | |||
418 | diff --git a/arch/arc/include/asm/bitops.h b/arch/arc/include/asm/bitops.h | ||
419 | index 57c1f33844d4..0352fb8d21b9 100644 | ||
420 | --- a/arch/arc/include/asm/bitops.h | ||
421 | +++ b/arch/arc/include/asm/bitops.h | ||
422 | @@ -35,21 +35,6 @@ static inline void op##_bit(unsigned long nr, volatile unsigned long *m)\ | ||
423 | \ | ||
424 | m += nr >> 5; \ | ||
425 | \ | ||
426 | - /* \ | ||
427 | - * ARC ISA micro-optimization: \ | ||
428 | - * \ | ||
429 | - * Instructions dealing with bitpos only consider lower 5 bits \ | ||
430 | - * e.g (x << 33) is handled like (x << 1) by ASL instruction \ | ||
431 | - * (mem pointer still needs adjustment to point to next word) \ | ||
432 | - * \ | ||
433 | - * Hence the masking to clamp @nr arg can be elided in general. \ | ||
434 | - * \ | ||
435 | - * However if @nr is a constant (above assumed in a register), \ | ||
436 | - * and greater than 31, gcc can optimize away (x << 33) to 0, \ | ||
437 | - * as overflow, given the 32-bit ISA. Thus masking needs to be \ | ||
438 | - * done for const @nr, but no code is generated due to gcc \ | ||
439 | - * const prop. \ | ||
440 | - */ \ | ||
441 | nr &= 0x1f; \ | ||
442 | \ | ||
443 | __asm__ __volatile__( \ | ||
444 | diff --git a/arch/arc/include/asm/io.h b/arch/arc/include/asm/io.h | ||
445 | index 694ece8a0243..27b17adea50d 100644 | ||
446 | --- a/arch/arc/include/asm/io.h | ||
447 | +++ b/arch/arc/include/asm/io.h | ||
448 | @@ -129,15 +129,23 @@ static inline void __raw_writel(u32 w, volatile void __iomem *addr) | ||
449 | #define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); }) | ||
450 | |||
451 | /* | ||
452 | - * Relaxed API for drivers which can handle any ordering themselves | ||
453 | + * Relaxed API for drivers which can handle barrier ordering themselves | ||
454 | + * | ||
455 | + * Also these are defined to perform little endian accesses. | ||
456 | + * To provide the typical device register semantics of fixed endian, | ||
457 | + * swap the byte order for Big Endian | ||
458 | + * | ||
459 | + * http://lkml.kernel.org/r/201603100845.30602.arnd@arndb.de | ||
460 | */ | ||
461 | #define readb_relaxed(c) __raw_readb(c) | ||
462 | -#define readw_relaxed(c) __raw_readw(c) | ||
463 | -#define readl_relaxed(c) __raw_readl(c) | ||
464 | +#define readw_relaxed(c) ({ u16 __r = le16_to_cpu((__force __le16) \ | ||
465 | + __raw_readw(c)); __r; }) | ||
466 | +#define readl_relaxed(c) ({ u32 __r = le32_to_cpu((__force __le32) \ | ||
467 | + __raw_readl(c)); __r; }) | ||
468 | |||
469 | #define writeb_relaxed(v,c) __raw_writeb(v,c) | ||
470 | -#define writew_relaxed(v,c) __raw_writew(v,c) | ||
471 | -#define writel_relaxed(v,c) __raw_writel(v,c) | ||
472 | +#define writew_relaxed(v,c) __raw_writew((__force u16) cpu_to_le16(v),c) | ||
473 | +#define writel_relaxed(v,c) __raw_writel((__force u32) cpu_to_le32(v),c) | ||
474 | |||
475 | #include <asm-generic/io.h> | ||
476 | |||
477 | diff --git a/arch/arm/boot/dts/at91-sama5d3_xplained.dts b/arch/arm/boot/dts/at91-sama5d3_xplained.dts | ||
478 | index ff888d21c786..f3e2b96c06a3 100644 | ||
479 | --- a/arch/arm/boot/dts/at91-sama5d3_xplained.dts | ||
480 | +++ b/arch/arm/boot/dts/at91-sama5d3_xplained.dts | ||
481 | @@ -303,6 +303,7 @@ | ||
482 | regulator-name = "mmc0-card-supply"; | ||
483 | regulator-min-microvolt = <3300000>; | ||
484 | regulator-max-microvolt = <3300000>; | ||
485 | + regulator-always-on; | ||
486 | }; | ||
487 | |||
488 | gpio_keys { | ||
489 | diff --git a/arch/arm/boot/dts/at91-sama5d4_xplained.dts b/arch/arm/boot/dts/at91-sama5d4_xplained.dts | ||
490 | index 569026e8f96c..da84e65b56ef 100644 | ||
491 | --- a/arch/arm/boot/dts/at91-sama5d4_xplained.dts | ||
492 | +++ b/arch/arm/boot/dts/at91-sama5d4_xplained.dts | ||
493 | @@ -268,5 +268,6 @@ | ||
494 | regulator-min-microvolt = <3300000>; | ||
495 | regulator-max-microvolt = <3300000>; | ||
496 | vin-supply = <&vcc_3v3_reg>; | ||
497 | + regulator-always-on; | ||
498 | }; | ||
499 | }; | ||
500 | diff --git a/arch/arm/mach-s3c64xx/dev-audio.c b/arch/arm/mach-s3c64xx/dev-audio.c | ||
501 | index ff780a8d8366..9a42736ef4ac 100644 | ||
502 | --- a/arch/arm/mach-s3c64xx/dev-audio.c | ||
503 | +++ b/arch/arm/mach-s3c64xx/dev-audio.c | ||
504 | @@ -54,12 +54,12 @@ static int s3c64xx_i2s_cfg_gpio(struct platform_device *pdev) | ||
505 | |||
506 | static struct resource s3c64xx_iis0_resource[] = { | ||
507 | [0] = DEFINE_RES_MEM(S3C64XX_PA_IIS0, SZ_256), | ||
508 | - [1] = DEFINE_RES_DMA(DMACH_I2S0_OUT), | ||
509 | - [2] = DEFINE_RES_DMA(DMACH_I2S0_IN), | ||
510 | }; | ||
511 | |||
512 | -static struct s3c_audio_pdata i2sv3_pdata = { | ||
513 | +static struct s3c_audio_pdata i2s0_pdata = { | ||
514 | .cfg_gpio = s3c64xx_i2s_cfg_gpio, | ||
515 | + .dma_playback = DMACH_I2S0_OUT, | ||
516 | + .dma_capture = DMACH_I2S0_IN, | ||
517 | }; | ||
518 | |||
519 | struct platform_device s3c64xx_device_iis0 = { | ||
520 | @@ -68,15 +68,19 @@ struct platform_device s3c64xx_device_iis0 = { | ||
521 | .num_resources = ARRAY_SIZE(s3c64xx_iis0_resource), | ||
522 | .resource = s3c64xx_iis0_resource, | ||
523 | .dev = { | ||
524 | - .platform_data = &i2sv3_pdata, | ||
525 | + .platform_data = &i2s0_pdata, | ||
526 | }, | ||
527 | }; | ||
528 | EXPORT_SYMBOL(s3c64xx_device_iis0); | ||
529 | |||
530 | static struct resource s3c64xx_iis1_resource[] = { | ||
531 | [0] = DEFINE_RES_MEM(S3C64XX_PA_IIS1, SZ_256), | ||
532 | - [1] = DEFINE_RES_DMA(DMACH_I2S1_OUT), | ||
533 | - [2] = DEFINE_RES_DMA(DMACH_I2S1_IN), | ||
534 | +}; | ||
535 | + | ||
536 | +static struct s3c_audio_pdata i2s1_pdata = { | ||
537 | + .cfg_gpio = s3c64xx_i2s_cfg_gpio, | ||
538 | + .dma_playback = DMACH_I2S1_OUT, | ||
539 | + .dma_capture = DMACH_I2S1_IN, | ||
540 | }; | ||
541 | |||
542 | struct platform_device s3c64xx_device_iis1 = { | ||
543 | @@ -85,19 +89,19 @@ struct platform_device s3c64xx_device_iis1 = { | ||
544 | .num_resources = ARRAY_SIZE(s3c64xx_iis1_resource), | ||
545 | .resource = s3c64xx_iis1_resource, | ||
546 | .dev = { | ||
547 | - .platform_data = &i2sv3_pdata, | ||
548 | + .platform_data = &i2s1_pdata, | ||
549 | }, | ||
550 | }; | ||
551 | EXPORT_SYMBOL(s3c64xx_device_iis1); | ||
552 | |||
553 | static struct resource s3c64xx_iisv4_resource[] = { | ||
554 | [0] = DEFINE_RES_MEM(S3C64XX_PA_IISV4, SZ_256), | ||
555 | - [1] = DEFINE_RES_DMA(DMACH_HSI_I2SV40_TX), | ||
556 | - [2] = DEFINE_RES_DMA(DMACH_HSI_I2SV40_RX), | ||
557 | }; | ||
558 | |||
559 | static struct s3c_audio_pdata i2sv4_pdata = { | ||
560 | .cfg_gpio = s3c64xx_i2s_cfg_gpio, | ||
561 | + .dma_playback = DMACH_HSI_I2SV40_TX, | ||
562 | + .dma_capture = DMACH_HSI_I2SV40_RX, | ||
563 | .type = { | ||
564 | .i2s = { | ||
565 | .quirks = QUIRK_PRI_6CHAN, | ||
566 | @@ -142,12 +146,12 @@ static int s3c64xx_pcm_cfg_gpio(struct platform_device *pdev) | ||
567 | |||
568 | static struct resource s3c64xx_pcm0_resource[] = { | ||
569 | [0] = DEFINE_RES_MEM(S3C64XX_PA_PCM0, SZ_256), | ||
570 | - [1] = DEFINE_RES_DMA(DMACH_PCM0_TX), | ||
571 | - [2] = DEFINE_RES_DMA(DMACH_PCM0_RX), | ||
572 | }; | ||
573 | |||
574 | static struct s3c_audio_pdata s3c_pcm0_pdata = { | ||
575 | .cfg_gpio = s3c64xx_pcm_cfg_gpio, | ||
576 | + .dma_capture = DMACH_PCM0_RX, | ||
577 | + .dma_playback = DMACH_PCM0_TX, | ||
578 | }; | ||
579 | |||
580 | struct platform_device s3c64xx_device_pcm0 = { | ||
581 | @@ -163,12 +167,12 @@ EXPORT_SYMBOL(s3c64xx_device_pcm0); | ||
582 | |||
583 | static struct resource s3c64xx_pcm1_resource[] = { | ||
584 | [0] = DEFINE_RES_MEM(S3C64XX_PA_PCM1, SZ_256), | ||
585 | - [1] = DEFINE_RES_DMA(DMACH_PCM1_TX), | ||
586 | - [2] = DEFINE_RES_DMA(DMACH_PCM1_RX), | ||
587 | }; | ||
588 | |||
589 | static struct s3c_audio_pdata s3c_pcm1_pdata = { | ||
590 | .cfg_gpio = s3c64xx_pcm_cfg_gpio, | ||
591 | + .dma_playback = DMACH_PCM1_TX, | ||
592 | + .dma_capture = DMACH_PCM1_RX, | ||
593 | }; | ||
594 | |||
595 | struct platform_device s3c64xx_device_pcm1 = { | ||
596 | @@ -196,13 +200,14 @@ static int s3c64xx_ac97_cfg_gpe(struct platform_device *pdev) | ||
597 | |||
598 | static struct resource s3c64xx_ac97_resource[] = { | ||
599 | [0] = DEFINE_RES_MEM(S3C64XX_PA_AC97, SZ_256), | ||
600 | - [1] = DEFINE_RES_DMA(DMACH_AC97_PCMOUT), | ||
601 | - [2] = DEFINE_RES_DMA(DMACH_AC97_PCMIN), | ||
602 | - [3] = DEFINE_RES_DMA(DMACH_AC97_MICIN), | ||
603 | - [4] = DEFINE_RES_IRQ(IRQ_AC97), | ||
604 | + [1] = DEFINE_RES_IRQ(IRQ_AC97), | ||
605 | }; | ||
606 | |||
607 | -static struct s3c_audio_pdata s3c_ac97_pdata; | ||
608 | +static struct s3c_audio_pdata s3c_ac97_pdata = { | ||
609 | + .dma_playback = DMACH_AC97_PCMOUT, | ||
610 | + .dma_capture = DMACH_AC97_PCMIN, | ||
611 | + .dma_capture_mic = DMACH_AC97_MICIN, | ||
612 | +}; | ||
613 | |||
614 | static u64 s3c64xx_ac97_dmamask = DMA_BIT_MASK(32); | ||
615 | |||
616 | diff --git a/arch/arm/mach-s3c64xx/include/mach/dma.h b/arch/arm/mach-s3c64xx/include/mach/dma.h | ||
617 | index 096e14073bd9..9c739eafe95c 100644 | ||
618 | --- a/arch/arm/mach-s3c64xx/include/mach/dma.h | ||
619 | +++ b/arch/arm/mach-s3c64xx/include/mach/dma.h | ||
620 | @@ -14,38 +14,38 @@ | ||
621 | #define S3C64XX_DMA_CHAN(name) ((unsigned long)(name)) | ||
622 | |||
623 | /* DMA0/SDMA0 */ | ||
624 | -#define DMACH_UART0 S3C64XX_DMA_CHAN("uart0_tx") | ||
625 | -#define DMACH_UART0_SRC2 S3C64XX_DMA_CHAN("uart0_rx") | ||
626 | -#define DMACH_UART1 S3C64XX_DMA_CHAN("uart1_tx") | ||
627 | -#define DMACH_UART1_SRC2 S3C64XX_DMA_CHAN("uart1_rx") | ||
628 | -#define DMACH_UART2 S3C64XX_DMA_CHAN("uart2_tx") | ||
629 | -#define DMACH_UART2_SRC2 S3C64XX_DMA_CHAN("uart2_rx") | ||
630 | -#define DMACH_UART3 S3C64XX_DMA_CHAN("uart3_tx") | ||
631 | -#define DMACH_UART3_SRC2 S3C64XX_DMA_CHAN("uart3_rx") | ||
632 | -#define DMACH_PCM0_TX S3C64XX_DMA_CHAN("pcm0_tx") | ||
633 | -#define DMACH_PCM0_RX S3C64XX_DMA_CHAN("pcm0_rx") | ||
634 | -#define DMACH_I2S0_OUT S3C64XX_DMA_CHAN("i2s0_tx") | ||
635 | -#define DMACH_I2S0_IN S3C64XX_DMA_CHAN("i2s0_rx") | ||
636 | +#define DMACH_UART0 "uart0_tx" | ||
637 | +#define DMACH_UART0_SRC2 "uart0_rx" | ||
638 | +#define DMACH_UART1 "uart1_tx" | ||
639 | +#define DMACH_UART1_SRC2 "uart1_rx" | ||
640 | +#define DMACH_UART2 "uart2_tx" | ||
641 | +#define DMACH_UART2_SRC2 "uart2_rx" | ||
642 | +#define DMACH_UART3 "uart3_tx" | ||
643 | +#define DMACH_UART3_SRC2 "uart3_rx" | ||
644 | +#define DMACH_PCM0_TX "pcm0_tx" | ||
645 | +#define DMACH_PCM0_RX "pcm0_rx" | ||
646 | +#define DMACH_I2S0_OUT "i2s0_tx" | ||
647 | +#define DMACH_I2S0_IN "i2s0_rx" | ||
648 | #define DMACH_SPI0_TX S3C64XX_DMA_CHAN("spi0_tx") | ||
649 | #define DMACH_SPI0_RX S3C64XX_DMA_CHAN("spi0_rx") | ||
650 | -#define DMACH_HSI_I2SV40_TX S3C64XX_DMA_CHAN("i2s2_tx") | ||
651 | -#define DMACH_HSI_I2SV40_RX S3C64XX_DMA_CHAN("i2s2_rx") | ||
652 | +#define DMACH_HSI_I2SV40_TX "i2s2_tx" | ||
653 | +#define DMACH_HSI_I2SV40_RX "i2s2_rx" | ||
654 | |||
655 | /* DMA1/SDMA1 */ | ||
656 | -#define DMACH_PCM1_TX S3C64XX_DMA_CHAN("pcm1_tx") | ||
657 | -#define DMACH_PCM1_RX S3C64XX_DMA_CHAN("pcm1_rx") | ||
658 | -#define DMACH_I2S1_OUT S3C64XX_DMA_CHAN("i2s1_tx") | ||
659 | -#define DMACH_I2S1_IN S3C64XX_DMA_CHAN("i2s1_rx") | ||
660 | +#define DMACH_PCM1_TX "pcm1_tx" | ||
661 | +#define DMACH_PCM1_RX "pcm1_rx" | ||
662 | +#define DMACH_I2S1_OUT "i2s1_tx" | ||
663 | +#define DMACH_I2S1_IN "i2s1_rx" | ||
664 | #define DMACH_SPI1_TX S3C64XX_DMA_CHAN("spi1_tx") | ||
665 | #define DMACH_SPI1_RX S3C64XX_DMA_CHAN("spi1_rx") | ||
666 | -#define DMACH_AC97_PCMOUT S3C64XX_DMA_CHAN("ac97_out") | ||
667 | -#define DMACH_AC97_PCMIN S3C64XX_DMA_CHAN("ac97_in") | ||
668 | -#define DMACH_AC97_MICIN S3C64XX_DMA_CHAN("ac97_mic") | ||
669 | -#define DMACH_PWM S3C64XX_DMA_CHAN("pwm") | ||
670 | -#define DMACH_IRDA S3C64XX_DMA_CHAN("irda") | ||
671 | -#define DMACH_EXTERNAL S3C64XX_DMA_CHAN("external") | ||
672 | -#define DMACH_SECURITY_RX S3C64XX_DMA_CHAN("sec_rx") | ||
673 | -#define DMACH_SECURITY_TX S3C64XX_DMA_CHAN("sec_tx") | ||
674 | +#define DMACH_AC97_PCMOUT "ac97_out" | ||
675 | +#define DMACH_AC97_PCMIN "ac97_in" | ||
676 | +#define DMACH_AC97_MICIN "ac97_mic" | ||
677 | +#define DMACH_PWM "pwm" | ||
678 | +#define DMACH_IRDA "irda" | ||
679 | +#define DMACH_EXTERNAL "external" | ||
680 | +#define DMACH_SECURITY_RX "sec_rx" | ||
681 | +#define DMACH_SECURITY_TX "sec_tx" | ||
682 | |||
683 | enum dma_ch { | ||
684 | DMACH_MAX = 32 | ||
685 | diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c | ||
686 | index 82074625de5c..e212f9d804bd 100644 | ||
687 | --- a/arch/arm/plat-samsung/devs.c | ||
688 | +++ b/arch/arm/plat-samsung/devs.c | ||
689 | @@ -65,6 +65,7 @@ | ||
690 | #include <linux/platform_data/usb-ohci-s3c2410.h> | ||
691 | #include <plat/usb-phy.h> | ||
692 | #include <plat/regs-spi.h> | ||
693 | +#include <linux/platform_data/asoc-s3c.h> | ||
694 | #include <linux/platform_data/spi-s3c64xx.h> | ||
695 | |||
696 | static u64 samsung_device_dma_mask = DMA_BIT_MASK(32); | ||
697 | @@ -74,9 +75,12 @@ static u64 samsung_device_dma_mask = DMA_BIT_MASK(32); | ||
698 | static struct resource s3c_ac97_resource[] = { | ||
699 | [0] = DEFINE_RES_MEM(S3C2440_PA_AC97, S3C2440_SZ_AC97), | ||
700 | [1] = DEFINE_RES_IRQ(IRQ_S3C244X_AC97), | ||
701 | - [2] = DEFINE_RES_DMA_NAMED(DMACH_PCM_OUT, "PCM out"), | ||
702 | - [3] = DEFINE_RES_DMA_NAMED(DMACH_PCM_IN, "PCM in"), | ||
703 | - [4] = DEFINE_RES_DMA_NAMED(DMACH_MIC_IN, "Mic in"), | ||
704 | +}; | ||
705 | + | ||
706 | +static struct s3c_audio_pdata s3c_ac97_pdata = { | ||
707 | + .dma_playback = (void *)DMACH_PCM_OUT, | ||
708 | + .dma_capture = (void *)DMACH_PCM_IN, | ||
709 | + .dma_capture_mic = (void *)DMACH_MIC_IN, | ||
710 | }; | ||
711 | |||
712 | struct platform_device s3c_device_ac97 = { | ||
713 | @@ -87,6 +91,7 @@ struct platform_device s3c_device_ac97 = { | ||
714 | .dev = { | ||
715 | .dma_mask = &samsung_device_dma_mask, | ||
716 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
717 | + .platform_data = &s3c_ac97_pdata, | ||
718 | } | ||
719 | }; | ||
720 | #endif /* CONFIG_CPU_S3C2440 */ | ||
721 | diff --git a/arch/ia64/include/asm/io.h b/arch/ia64/include/asm/io.h | ||
722 | index 9041bbe2b7b4..8fdb9c7eeb66 100644 | ||
723 | --- a/arch/ia64/include/asm/io.h | ||
724 | +++ b/arch/ia64/include/asm/io.h | ||
725 | @@ -436,6 +436,7 @@ static inline void __iomem * ioremap_cache (unsigned long phys_addr, unsigned lo | ||
726 | return ioremap(phys_addr, size); | ||
727 | } | ||
728 | #define ioremap_cache ioremap_cache | ||
729 | +#define ioremap_uc ioremap_nocache | ||
730 | |||
731 | |||
732 | /* | ||
733 | diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h | ||
734 | index c873e682b67f..2b2ced9dc00a 100644 | ||
735 | --- a/arch/s390/include/asm/pci.h | ||
736 | +++ b/arch/s390/include/asm/pci.h | ||
737 | @@ -45,7 +45,7 @@ struct zpci_fmb { | ||
738 | u64 rpcit_ops; | ||
739 | u64 dma_rbytes; | ||
740 | u64 dma_wbytes; | ||
741 | -} __packed __aligned(16); | ||
742 | +} __packed __aligned(64); | ||
743 | |||
744 | enum zpci_state { | ||
745 | ZPCI_FN_STATE_RESERVED, | ||
746 | diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S | ||
747 | index 857b6526d298..424e6809ad07 100644 | ||
748 | --- a/arch/s390/kernel/entry.S | ||
749 | +++ b/arch/s390/kernel/entry.S | ||
750 | @@ -1197,114 +1197,12 @@ cleanup_critical: | ||
751 | .quad .Lpsw_idle_lpsw | ||
752 | |||
753 | .Lcleanup_save_fpu_regs: | ||
754 | - TSTMSK __LC_CPU_FLAGS,_CIF_FPU | ||
755 | - bor %r14 | ||
756 | - clg %r9,BASED(.Lcleanup_save_fpu_regs_done) | ||
757 | - jhe 5f | ||
758 | - clg %r9,BASED(.Lcleanup_save_fpu_regs_fp) | ||
759 | - jhe 4f | ||
760 | - clg %r9,BASED(.Lcleanup_save_fpu_regs_vx_high) | ||
761 | - jhe 3f | ||
762 | - clg %r9,BASED(.Lcleanup_save_fpu_regs_vx_low) | ||
763 | - jhe 2f | ||
764 | - clg %r9,BASED(.Lcleanup_save_fpu_fpc_end) | ||
765 | - jhe 1f | ||
766 | - lg %r2,__LC_CURRENT | ||
767 | - aghi %r2,__TASK_thread | ||
768 | -0: # Store floating-point controls | ||
769 | - stfpc __THREAD_FPU_fpc(%r2) | ||
770 | -1: # Load register save area and check if VX is active | ||
771 | - lg %r3,__THREAD_FPU_regs(%r2) | ||
772 | - TSTMSK __LC_MACHINE_FLAGS,MACHINE_FLAG_VX | ||
773 | - jz 4f # no VX -> store FP regs | ||
774 | -2: # Store vector registers (V0-V15) | ||
775 | - VSTM %v0,%v15,0,%r3 # vstm 0,15,0(3) | ||
776 | -3: # Store vector registers (V16-V31) | ||
777 | - VSTM %v16,%v31,256,%r3 # vstm 16,31,256(3) | ||
778 | - j 5f # -> done, set CIF_FPU flag | ||
779 | -4: # Store floating-point registers | ||
780 | - std 0,0(%r3) | ||
781 | - std 1,8(%r3) | ||
782 | - std 2,16(%r3) | ||
783 | - std 3,24(%r3) | ||
784 | - std 4,32(%r3) | ||
785 | - std 5,40(%r3) | ||
786 | - std 6,48(%r3) | ||
787 | - std 7,56(%r3) | ||
788 | - std 8,64(%r3) | ||
789 | - std 9,72(%r3) | ||
790 | - std 10,80(%r3) | ||
791 | - std 11,88(%r3) | ||
792 | - std 12,96(%r3) | ||
793 | - std 13,104(%r3) | ||
794 | - std 14,112(%r3) | ||
795 | - std 15,120(%r3) | ||
796 | -5: # Set CIF_FPU flag | ||
797 | - oi __LC_CPU_FLAGS+7,_CIF_FPU | ||
798 | - lg %r9,48(%r11) # return from save_fpu_regs | ||
799 | + larl %r9,save_fpu_regs | ||
800 | br %r14 | ||
801 | -.Lcleanup_save_fpu_fpc_end: | ||
802 | - .quad .Lsave_fpu_regs_fpc_end | ||
803 | -.Lcleanup_save_fpu_regs_vx_low: | ||
804 | - .quad .Lsave_fpu_regs_vx_low | ||
805 | -.Lcleanup_save_fpu_regs_vx_high: | ||
806 | - .quad .Lsave_fpu_regs_vx_high | ||
807 | -.Lcleanup_save_fpu_regs_fp: | ||
808 | - .quad .Lsave_fpu_regs_fp | ||
809 | -.Lcleanup_save_fpu_regs_done: | ||
810 | - .quad .Lsave_fpu_regs_done | ||
811 | |||
812 | .Lcleanup_load_fpu_regs: | ||
813 | - TSTMSK __LC_CPU_FLAGS,_CIF_FPU | ||
814 | - bnor %r14 | ||
815 | - clg %r9,BASED(.Lcleanup_load_fpu_regs_done) | ||
816 | - jhe 1f | ||
817 | - clg %r9,BASED(.Lcleanup_load_fpu_regs_fp) | ||
818 | - jhe 2f | ||
819 | - clg %r9,BASED(.Lcleanup_load_fpu_regs_vx_high) | ||
820 | - jhe 3f | ||
821 | - clg %r9,BASED(.Lcleanup_load_fpu_regs_vx) | ||
822 | - jhe 4f | ||
823 | - lg %r4,__LC_CURRENT | ||
824 | - aghi %r4,__TASK_thread | ||
825 | - lfpc __THREAD_FPU_fpc(%r4) | ||
826 | - TSTMSK __LC_MACHINE_FLAGS,MACHINE_FLAG_VX | ||
827 | - lg %r4,__THREAD_FPU_regs(%r4) # %r4 <- reg save area | ||
828 | - jz 2f # -> no VX, load FP regs | ||
829 | -4: # Load V0 ..V15 registers | ||
830 | - VLM %v0,%v15,0,%r4 | ||
831 | -3: # Load V16..V31 registers | ||
832 | - VLM %v16,%v31,256,%r4 | ||
833 | - j 1f | ||
834 | -2: # Load floating-point registers | ||
835 | - ld 0,0(%r4) | ||
836 | - ld 1,8(%r4) | ||
837 | - ld 2,16(%r4) | ||
838 | - ld 3,24(%r4) | ||
839 | - ld 4,32(%r4) | ||
840 | - ld 5,40(%r4) | ||
841 | - ld 6,48(%r4) | ||
842 | - ld 7,56(%r4) | ||
843 | - ld 8,64(%r4) | ||
844 | - ld 9,72(%r4) | ||
845 | - ld 10,80(%r4) | ||
846 | - ld 11,88(%r4) | ||
847 | - ld 12,96(%r4) | ||
848 | - ld 13,104(%r4) | ||
849 | - ld 14,112(%r4) | ||
850 | - ld 15,120(%r4) | ||
851 | -1: # Clear CIF_FPU bit | ||
852 | - ni __LC_CPU_FLAGS+7,255-_CIF_FPU | ||
853 | - lg %r9,48(%r11) # return from load_fpu_regs | ||
854 | + larl %r9,load_fpu_regs | ||
855 | br %r14 | ||
856 | -.Lcleanup_load_fpu_regs_vx: | ||
857 | - .quad .Lload_fpu_regs_vx | ||
858 | -.Lcleanup_load_fpu_regs_vx_high: | ||
859 | - .quad .Lload_fpu_regs_vx_high | ||
860 | -.Lcleanup_load_fpu_regs_fp: | ||
861 | - .quad .Lload_fpu_regs_fp | ||
862 | -.Lcleanup_load_fpu_regs_done: | ||
863 | - .quad .Lload_fpu_regs_done | ||
864 | |||
865 | /* | ||
866 | * Integer constants | ||
867 | diff --git a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S | ||
868 | index 58b719fa8067..1ad2407c7f75 100644 | ||
869 | --- a/arch/s390/kernel/head64.S | ||
870 | +++ b/arch/s390/kernel/head64.S | ||
871 | @@ -16,7 +16,7 @@ | ||
872 | |||
873 | __HEAD | ||
874 | ENTRY(startup_continue) | ||
875 | - tm __LC_STFL_FAC_LIST+6,0x80 # LPP available ? | ||
876 | + tm __LC_STFL_FAC_LIST+5,0x80 # LPP available ? | ||
877 | jz 0f | ||
878 | xc __LC_LPP+1(7,0),__LC_LPP+1 # clear lpp and current_pid | ||
879 | mvi __LC_LPP,0x80 # and set LPP_MAGIC | ||
880 | diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c | ||
881 | index c837bcacf218..1f581eb61bc2 100644 | ||
882 | --- a/arch/s390/kernel/setup.c | ||
883 | +++ b/arch/s390/kernel/setup.c | ||
884 | @@ -329,6 +329,7 @@ static void __init setup_lowcore(void) | ||
885 | + PAGE_SIZE - STACK_FRAME_OVERHEAD - sizeof(struct pt_regs); | ||
886 | lc->current_task = (unsigned long) init_thread_union.thread_info.task; | ||
887 | lc->thread_info = (unsigned long) &init_thread_union; | ||
888 | + lc->lpp = LPP_MAGIC; | ||
889 | lc->machine_flags = S390_lowcore.machine_flags; | ||
890 | lc->stfl_fac_list = S390_lowcore.stfl_fac_list; | ||
891 | memcpy(lc->stfle_fac_list, S390_lowcore.stfle_fac_list, | ||
892 | diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c | ||
893 | index 7ef12a3ace3a..19442395f413 100644 | ||
894 | --- a/arch/s390/pci/pci.c | ||
895 | +++ b/arch/s390/pci/pci.c | ||
896 | @@ -871,8 +871,11 @@ static inline int barsize(u8 size) | ||
897 | |||
898 | static int zpci_mem_init(void) | ||
899 | { | ||
900 | + BUILD_BUG_ON(!is_power_of_2(__alignof__(struct zpci_fmb)) || | ||
901 | + __alignof__(struct zpci_fmb) < sizeof(struct zpci_fmb)); | ||
902 | + | ||
903 | zdev_fmb_cache = kmem_cache_create("PCI_FMB_cache", sizeof(struct zpci_fmb), | ||
904 | - 16, 0, NULL); | ||
905 | + __alignof__(struct zpci_fmb), 0, NULL); | ||
906 | if (!zdev_fmb_cache) | ||
907 | goto error_zdev; | ||
908 | |||
909 | diff --git a/arch/sh/mm/kmap.c b/arch/sh/mm/kmap.c | ||
910 | index ec29e14ec5a8..bf25d7c79a2d 100644 | ||
911 | --- a/arch/sh/mm/kmap.c | ||
912 | +++ b/arch/sh/mm/kmap.c | ||
913 | @@ -36,6 +36,7 @@ void *kmap_coherent(struct page *page, unsigned long addr) | ||
914 | |||
915 | BUG_ON(!test_bit(PG_dcache_clean, &page->flags)); | ||
916 | |||
917 | + preempt_disable(); | ||
918 | pagefault_disable(); | ||
919 | |||
920 | idx = FIX_CMAP_END - | ||
921 | @@ -64,4 +65,5 @@ void kunmap_coherent(void *kvaddr) | ||
922 | } | ||
923 | |||
924 | pagefault_enable(); | ||
925 | + preempt_enable(); | ||
926 | } | ||
927 | diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c | ||
928 | index 29880c9b324e..e22e57298522 100644 | ||
929 | --- a/arch/um/drivers/mconsole_kern.c | ||
930 | +++ b/arch/um/drivers/mconsole_kern.c | ||
931 | @@ -133,7 +133,7 @@ void mconsole_proc(struct mc_request *req) | ||
932 | ptr += strlen("proc"); | ||
933 | ptr = skip_spaces(ptr); | ||
934 | |||
935 | - file = file_open_root(mnt->mnt_root, mnt, ptr, O_RDONLY); | ||
936 | + file = file_open_root(mnt->mnt_root, mnt, ptr, O_RDONLY, 0); | ||
937 | if (IS_ERR(file)) { | ||
938 | mconsole_reply(req, "Failed to open file", 1, 0); | ||
939 | printk(KERN_ERR "open /proc/%s: %ld\n", ptr, PTR_ERR(file)); | ||
940 | diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig | ||
941 | index db3622f22b61..436639a31624 100644 | ||
942 | --- a/arch/x86/Kconfig | ||
943 | +++ b/arch/x86/Kconfig | ||
944 | @@ -1126,22 +1126,23 @@ config MICROCODE | ||
945 | bool "CPU microcode loading support" | ||
946 | default y | ||
947 | depends on CPU_SUP_AMD || CPU_SUP_INTEL | ||
948 | - depends on BLK_DEV_INITRD | ||
949 | select FW_LOADER | ||
950 | ---help--- | ||
951 | - | ||
952 | If you say Y here, you will be able to update the microcode on | ||
953 | - certain Intel and AMD processors. The Intel support is for the | ||
954 | - IA32 family, e.g. Pentium Pro, Pentium II, Pentium III, Pentium 4, | ||
955 | - Xeon etc. The AMD support is for families 0x10 and later. You will | ||
956 | - obviously need the actual microcode binary data itself which is not | ||
957 | - shipped with the Linux kernel. | ||
958 | - | ||
959 | - This option selects the general module only, you need to select | ||
960 | - at least one vendor specific module as well. | ||
961 | - | ||
962 | - To compile this driver as a module, choose M here: the module | ||
963 | - will be called microcode. | ||
964 | + Intel and AMD processors. The Intel support is for the IA32 family, | ||
965 | + e.g. Pentium Pro, Pentium II, Pentium III, Pentium 4, Xeon etc. The | ||
966 | + AMD support is for families 0x10 and later. You will obviously need | ||
967 | + the actual microcode binary data itself which is not shipped with | ||
968 | + the Linux kernel. | ||
969 | + | ||
970 | + The preferred method to load microcode from a detached initrd is described | ||
971 | + in Documentation/x86/early-microcode.txt. For that you need to enable | ||
972 | + CONFIG_BLK_DEV_INITRD in order for the loader to be able to scan the | ||
973 | + initrd for microcode blobs. | ||
974 | + | ||
975 | + In addition, you can build-in the microcode into the kernel. For that you | ||
976 | + need to enable FIRMWARE_IN_KERNEL and add the vendor-supplied microcode | ||
977 | + to the CONFIG_EXTRA_FIRMWARE config option. | ||
978 | |||
979 | config MICROCODE_INTEL | ||
980 | bool "Intel microcode loading support" | ||
981 | diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c | ||
982 | index 03663740c866..1a4477cedc49 100644 | ||
983 | --- a/arch/x86/entry/common.c | ||
984 | +++ b/arch/x86/entry/common.c | ||
985 | @@ -268,6 +268,7 @@ static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags) | ||
986 | /* Called with IRQs disabled. */ | ||
987 | __visible inline void prepare_exit_to_usermode(struct pt_regs *regs) | ||
988 | { | ||
989 | + struct thread_info *ti = pt_regs_to_thread_info(regs); | ||
990 | u32 cached_flags; | ||
991 | |||
992 | if (IS_ENABLED(CONFIG_PROVE_LOCKING) && WARN_ON(!irqs_disabled())) | ||
993 | @@ -275,12 +276,22 @@ __visible inline void prepare_exit_to_usermode(struct pt_regs *regs) | ||
994 | |||
995 | lockdep_sys_exit(); | ||
996 | |||
997 | - cached_flags = | ||
998 | - READ_ONCE(pt_regs_to_thread_info(regs)->flags); | ||
999 | + cached_flags = READ_ONCE(ti->flags); | ||
1000 | |||
1001 | if (unlikely(cached_flags & EXIT_TO_USERMODE_LOOP_FLAGS)) | ||
1002 | exit_to_usermode_loop(regs, cached_flags); | ||
1003 | |||
1004 | +#ifdef CONFIG_COMPAT | ||
1005 | + /* | ||
1006 | + * Compat syscalls set TS_COMPAT. Make sure we clear it before | ||
1007 | + * returning to user mode. We need to clear it *after* signal | ||
1008 | + * handling, because syscall restart has a fixup for compat | ||
1009 | + * syscalls. The fixup is exercised by the ptrace_syscall_32 | ||
1010 | + * selftest. | ||
1011 | + */ | ||
1012 | + ti->status &= ~TS_COMPAT; | ||
1013 | +#endif | ||
1014 | + | ||
1015 | user_enter(); | ||
1016 | } | ||
1017 | |||
1018 | @@ -332,14 +343,6 @@ __visible inline void syscall_return_slowpath(struct pt_regs *regs) | ||
1019 | if (unlikely(cached_flags & SYSCALL_EXIT_WORK_FLAGS)) | ||
1020 | syscall_slow_exit_work(regs, cached_flags); | ||
1021 | |||
1022 | -#ifdef CONFIG_COMPAT | ||
1023 | - /* | ||
1024 | - * Compat syscalls set TS_COMPAT. Make sure we clear it before | ||
1025 | - * returning to user mode. | ||
1026 | - */ | ||
1027 | - ti->status &= ~TS_COMPAT; | ||
1028 | -#endif | ||
1029 | - | ||
1030 | local_irq_disable(); | ||
1031 | prepare_exit_to_usermode(regs); | ||
1032 | } | ||
1033 | diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h | ||
1034 | index a30316bf801a..163769d82475 100644 | ||
1035 | --- a/arch/x86/include/asm/apic.h | ||
1036 | +++ b/arch/x86/include/asm/apic.h | ||
1037 | @@ -638,8 +638,8 @@ static inline void entering_irq(void) | ||
1038 | |||
1039 | static inline void entering_ack_irq(void) | ||
1040 | { | ||
1041 | - ack_APIC_irq(); | ||
1042 | entering_irq(); | ||
1043 | + ack_APIC_irq(); | ||
1044 | } | ||
1045 | |||
1046 | static inline void ipi_entering_ack_irq(void) | ||
1047 | diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h | ||
1048 | index 1e3408e88604..59caa55fb9b5 100644 | ||
1049 | --- a/arch/x86/include/asm/hw_irq.h | ||
1050 | +++ b/arch/x86/include/asm/hw_irq.h | ||
1051 | @@ -136,6 +136,7 @@ struct irq_alloc_info { | ||
1052 | struct irq_cfg { | ||
1053 | unsigned int dest_apicid; | ||
1054 | u8 vector; | ||
1055 | + u8 old_vector; | ||
1056 | }; | ||
1057 | |||
1058 | extern struct irq_cfg *irq_cfg(unsigned int irq); | ||
1059 | diff --git a/arch/x86/include/asm/microcode.h b/arch/x86/include/asm/microcode.h | ||
1060 | index 34e62b1dcfce..712b24ed3a64 100644 | ||
1061 | --- a/arch/x86/include/asm/microcode.h | ||
1062 | +++ b/arch/x86/include/asm/microcode.h | ||
1063 | @@ -2,6 +2,7 @@ | ||
1064 | #define _ASM_X86_MICROCODE_H | ||
1065 | |||
1066 | #include <linux/earlycpio.h> | ||
1067 | +#include <linux/initrd.h> | ||
1068 | |||
1069 | #define native_rdmsr(msr, val1, val2) \ | ||
1070 | do { \ | ||
1071 | @@ -168,4 +169,29 @@ static inline void reload_early_microcode(void) { } | ||
1072 | static inline bool | ||
1073 | get_builtin_firmware(struct cpio_data *cd, const char *name) { return false; } | ||
1074 | #endif | ||
1075 | + | ||
1076 | +static inline unsigned long get_initrd_start(void) | ||
1077 | +{ | ||
1078 | +#ifdef CONFIG_BLK_DEV_INITRD | ||
1079 | + return initrd_start; | ||
1080 | +#else | ||
1081 | + return 0; | ||
1082 | +#endif | ||
1083 | +} | ||
1084 | + | ||
1085 | +static inline unsigned long get_initrd_start_addr(void) | ||
1086 | +{ | ||
1087 | +#ifdef CONFIG_BLK_DEV_INITRD | ||
1088 | +#ifdef CONFIG_X86_32 | ||
1089 | + unsigned long *initrd_start_p = (unsigned long *)__pa_nodebug(&initrd_start); | ||
1090 | + | ||
1091 | + return (unsigned long)__pa_nodebug(*initrd_start_p); | ||
1092 | +#else | ||
1093 | + return get_initrd_start(); | ||
1094 | +#endif | ||
1095 | +#else /* CONFIG_BLK_DEV_INITRD */ | ||
1096 | + return 0; | ||
1097 | +#endif | ||
1098 | +} | ||
1099 | + | ||
1100 | #endif /* _ASM_X86_MICROCODE_H */ | ||
1101 | diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h | ||
1102 | index 7bcb861a04e5..5a2ed3ed2f26 100644 | ||
1103 | --- a/arch/x86/include/asm/perf_event.h | ||
1104 | +++ b/arch/x86/include/asm/perf_event.h | ||
1105 | @@ -165,6 +165,7 @@ struct x86_pmu_capability { | ||
1106 | #define GLOBAL_STATUS_ASIF BIT_ULL(60) | ||
1107 | #define GLOBAL_STATUS_COUNTERS_FROZEN BIT_ULL(59) | ||
1108 | #define GLOBAL_STATUS_LBRS_FROZEN BIT_ULL(58) | ||
1109 | +#define GLOBAL_STATUS_TRACE_TOPAPMI BIT_ULL(55) | ||
1110 | |||
1111 | /* | ||
1112 | * IBS cpuid feature detection | ||
1113 | diff --git a/arch/x86/include/asm/xen/hypervisor.h b/arch/x86/include/asm/xen/hypervisor.h | ||
1114 | index 8b2d4bea9962..39171b3646bb 100644 | ||
1115 | --- a/arch/x86/include/asm/xen/hypervisor.h | ||
1116 | +++ b/arch/x86/include/asm/xen/hypervisor.h | ||
1117 | @@ -62,4 +62,6 @@ void xen_arch_register_cpu(int num); | ||
1118 | void xen_arch_unregister_cpu(int num); | ||
1119 | #endif | ||
1120 | |||
1121 | +extern void xen_set_iopl_mask(unsigned mask); | ||
1122 | + | ||
1123 | #endif /* _ASM_X86_XEN_HYPERVISOR_H */ | ||
1124 | diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c | ||
1125 | index a35f6b5473f4..7af2505f20c2 100644 | ||
1126 | --- a/arch/x86/kernel/apic/vector.c | ||
1127 | +++ b/arch/x86/kernel/apic/vector.c | ||
1128 | @@ -211,6 +211,7 @@ update: | ||
1129 | */ | ||
1130 | cpumask_and(d->old_domain, d->old_domain, cpu_online_mask); | ||
1131 | d->move_in_progress = !cpumask_empty(d->old_domain); | ||
1132 | + d->cfg.old_vector = d->move_in_progress ? d->cfg.vector : 0; | ||
1133 | d->cfg.vector = vector; | ||
1134 | cpumask_copy(d->domain, vector_cpumask); | ||
1135 | success: | ||
1136 | @@ -653,46 +654,97 @@ void irq_complete_move(struct irq_cfg *cfg) | ||
1137 | } | ||
1138 | |||
1139 | /* | ||
1140 | - * Called with @desc->lock held and interrupts disabled. | ||
1141 | + * Called from fixup_irqs() with @desc->lock held and interrupts disabled. | ||
1142 | */ | ||
1143 | void irq_force_complete_move(struct irq_desc *desc) | ||
1144 | { | ||
1145 | struct irq_data *irqdata = irq_desc_get_irq_data(desc); | ||
1146 | struct apic_chip_data *data = apic_chip_data(irqdata); | ||
1147 | struct irq_cfg *cfg = data ? &data->cfg : NULL; | ||
1148 | + unsigned int cpu; | ||
1149 | |||
1150 | if (!cfg) | ||
1151 | return; | ||
1152 | |||
1153 | - __irq_complete_move(cfg, cfg->vector); | ||
1154 | - | ||
1155 | /* | ||
1156 | * This is tricky. If the cleanup of @data->old_domain has not been | ||
1157 | * done yet, then the following setaffinity call will fail with | ||
1158 | * -EBUSY. This can leave the interrupt in a stale state. | ||
1159 | * | ||
1160 | - * The cleanup cannot make progress because we hold @desc->lock. So in | ||
1161 | - * case @data->old_domain is not yet cleaned up, we need to drop the | ||
1162 | - * lock and acquire it again. @desc cannot go away, because the | ||
1163 | - * hotplug code holds the sparse irq lock. | ||
1164 | + * All CPUs are stuck in stop machine with interrupts disabled so | ||
1165 | + * calling __irq_complete_move() would be completely pointless. | ||
1166 | */ | ||
1167 | raw_spin_lock(&vector_lock); | ||
1168 | - /* Clean out all offline cpus (including ourself) first. */ | ||
1169 | + /* | ||
1170 | + * Clean out all offline cpus (including the outgoing one) from the | ||
1171 | + * old_domain mask. | ||
1172 | + */ | ||
1173 | cpumask_and(data->old_domain, data->old_domain, cpu_online_mask); | ||
1174 | - while (!cpumask_empty(data->old_domain)) { | ||
1175 | + | ||
1176 | + /* | ||
1177 | + * If move_in_progress is cleared and the old_domain mask is empty, | ||
1178 | + * then there is nothing to cleanup. fixup_irqs() will take care of | ||
1179 | + * the stale vectors on the outgoing cpu. | ||
1180 | + */ | ||
1181 | + if (!data->move_in_progress && cpumask_empty(data->old_domain)) { | ||
1182 | raw_spin_unlock(&vector_lock); | ||
1183 | - raw_spin_unlock(&desc->lock); | ||
1184 | - cpu_relax(); | ||
1185 | - raw_spin_lock(&desc->lock); | ||
1186 | + return; | ||
1187 | + } | ||
1188 | + | ||
1189 | + /* | ||
1190 | + * 1) The interrupt is in move_in_progress state. That means that we | ||
1191 | + * have not seen an interrupt since the io_apic was reprogrammed to | ||
1192 | + * the new vector. | ||
1193 | + * | ||
1194 | + * 2) The interrupt has fired on the new vector, but the cleanup IPIs | ||
1195 | + * have not been processed yet. | ||
1196 | + */ | ||
1197 | + if (data->move_in_progress) { | ||
1198 | /* | ||
1199 | - * Reevaluate apic_chip_data. It might have been cleared after | ||
1200 | - * we dropped @desc->lock. | ||
1201 | + * In theory there is a race: | ||
1202 | + * | ||
1203 | + * set_ioapic(new_vector) <-- Interrupt is raised before update | ||
1204 | + * is effective, i.e. it's raised on | ||
1205 | + * the old vector. | ||
1206 | + * | ||
1207 | + * So if the target cpu cannot handle that interrupt before | ||
1208 | + * the old vector is cleaned up, we get a spurious interrupt | ||
1209 | + * and in the worst case the ioapic irq line becomes stale. | ||
1210 | + * | ||
1211 | + * But in case of cpu hotplug this should be a non issue | ||
1212 | + * because if the affinity update happens right before all | ||
1213 | + * cpus rendevouz in stop machine, there is no way that the | ||
1214 | + * interrupt can be blocked on the target cpu because all cpus | ||
1215 | + * loops first with interrupts enabled in stop machine, so the | ||
1216 | + * old vector is not yet cleaned up when the interrupt fires. | ||
1217 | + * | ||
1218 | + * So the only way to run into this issue is if the delivery | ||
1219 | + * of the interrupt on the apic/system bus would be delayed | ||
1220 | + * beyond the point where the target cpu disables interrupts | ||
1221 | + * in stop machine. I doubt that it can happen, but at least | ||
1222 | + * there is a theroretical chance. Virtualization might be | ||
1223 | + * able to expose this, but AFAICT the IOAPIC emulation is not | ||
1224 | + * as stupid as the real hardware. | ||
1225 | + * | ||
1226 | + * Anyway, there is nothing we can do about that at this point | ||
1227 | + * w/o refactoring the whole fixup_irq() business completely. | ||
1228 | + * We print at least the irq number and the old vector number, | ||
1229 | + * so we have the necessary information when a problem in that | ||
1230 | + * area arises. | ||
1231 | */ | ||
1232 | - data = apic_chip_data(irqdata); | ||
1233 | - if (!data) | ||
1234 | - return; | ||
1235 | - raw_spin_lock(&vector_lock); | ||
1236 | + pr_warn("IRQ fixup: irq %d move in progress, old vector %d\n", | ||
1237 | + irqdata->irq, cfg->old_vector); | ||
1238 | } | ||
1239 | + /* | ||
1240 | + * If old_domain is not empty, then other cpus still have the irq | ||
1241 | + * descriptor set in their vector array. Clean it up. | ||
1242 | + */ | ||
1243 | + for_each_cpu(cpu, data->old_domain) | ||
1244 | + per_cpu(vector_irq, cpu)[cfg->old_vector] = VECTOR_UNUSED; | ||
1245 | + | ||
1246 | + /* Cleanup the left overs of the (half finished) move */ | ||
1247 | + cpumask_clear(data->old_domain); | ||
1248 | + data->move_in_progress = 0; | ||
1249 | raw_spin_unlock(&vector_lock); | ||
1250 | } | ||
1251 | #endif | ||
1252 | diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c | ||
1253 | index ce47402eb2f9..ac8975a65280 100644 | ||
1254 | --- a/arch/x86/kernel/cpu/microcode/intel.c | ||
1255 | +++ b/arch/x86/kernel/cpu/microcode/intel.c | ||
1256 | @@ -555,10 +555,14 @@ scan_microcode(struct mc_saved_data *mc_saved_data, unsigned long *initrd, | ||
1257 | cd.data = NULL; | ||
1258 | cd.size = 0; | ||
1259 | |||
1260 | - cd = find_cpio_data(p, (void *)start, size, &offset); | ||
1261 | - if (!cd.data) { | ||
1262 | + /* try built-in microcode if no initrd */ | ||
1263 | + if (!size) { | ||
1264 | if (!load_builtin_intel_microcode(&cd)) | ||
1265 | return UCODE_ERROR; | ||
1266 | + } else { | ||
1267 | + cd = find_cpio_data(p, (void *)start, size, &offset); | ||
1268 | + if (!cd.data) | ||
1269 | + return UCODE_ERROR; | ||
1270 | } | ||
1271 | |||
1272 | return get_matching_model_microcode(0, start, cd.data, cd.size, | ||
1273 | @@ -694,7 +698,7 @@ int __init save_microcode_in_initrd_intel(void) | ||
1274 | if (count == 0) | ||
1275 | return ret; | ||
1276 | |||
1277 | - copy_initrd_ptrs(mc_saved, mc_saved_in_initrd, initrd_start, count); | ||
1278 | + copy_initrd_ptrs(mc_saved, mc_saved_in_initrd, get_initrd_start(), count); | ||
1279 | ret = save_microcode(&mc_saved_data, mc_saved, count); | ||
1280 | if (ret) | ||
1281 | pr_err("Cannot save microcode patches from initrd.\n"); | ||
1282 | @@ -732,16 +736,20 @@ void __init load_ucode_intel_bsp(void) | ||
1283 | struct boot_params *p; | ||
1284 | |||
1285 | p = (struct boot_params *)__pa_nodebug(&boot_params); | ||
1286 | - start = p->hdr.ramdisk_image; | ||
1287 | size = p->hdr.ramdisk_size; | ||
1288 | |||
1289 | - _load_ucode_intel_bsp( | ||
1290 | - (struct mc_saved_data *)__pa_nodebug(&mc_saved_data), | ||
1291 | - (unsigned long *)__pa_nodebug(&mc_saved_in_initrd), | ||
1292 | - start, size); | ||
1293 | + /* | ||
1294 | + * Set start only if we have an initrd image. We cannot use initrd_start | ||
1295 | + * because it is not set that early yet. | ||
1296 | + */ | ||
1297 | + start = (size ? p->hdr.ramdisk_image : 0); | ||
1298 | + | ||
1299 | + _load_ucode_intel_bsp((struct mc_saved_data *)__pa_nodebug(&mc_saved_data), | ||
1300 | + (unsigned long *)__pa_nodebug(&mc_saved_in_initrd), | ||
1301 | + start, size); | ||
1302 | #else | ||
1303 | - start = boot_params.hdr.ramdisk_image + PAGE_OFFSET; | ||
1304 | size = boot_params.hdr.ramdisk_size; | ||
1305 | + start = (size ? boot_params.hdr.ramdisk_image + PAGE_OFFSET : 0); | ||
1306 | |||
1307 | _load_ucode_intel_bsp(&mc_saved_data, mc_saved_in_initrd, start, size); | ||
1308 | #endif | ||
1309 | @@ -752,20 +760,14 @@ void load_ucode_intel_ap(void) | ||
1310 | struct mc_saved_data *mc_saved_data_p; | ||
1311 | struct ucode_cpu_info uci; | ||
1312 | unsigned long *mc_saved_in_initrd_p; | ||
1313 | - unsigned long initrd_start_addr; | ||
1314 | enum ucode_state ret; | ||
1315 | #ifdef CONFIG_X86_32 | ||
1316 | - unsigned long *initrd_start_p; | ||
1317 | |||
1318 | - mc_saved_in_initrd_p = | ||
1319 | - (unsigned long *)__pa_nodebug(mc_saved_in_initrd); | ||
1320 | + mc_saved_in_initrd_p = (unsigned long *)__pa_nodebug(mc_saved_in_initrd); | ||
1321 | mc_saved_data_p = (struct mc_saved_data *)__pa_nodebug(&mc_saved_data); | ||
1322 | - initrd_start_p = (unsigned long *)__pa_nodebug(&initrd_start); | ||
1323 | - initrd_start_addr = (unsigned long)__pa_nodebug(*initrd_start_p); | ||
1324 | #else | ||
1325 | - mc_saved_data_p = &mc_saved_data; | ||
1326 | mc_saved_in_initrd_p = mc_saved_in_initrd; | ||
1327 | - initrd_start_addr = initrd_start; | ||
1328 | + mc_saved_data_p = &mc_saved_data; | ||
1329 | #endif | ||
1330 | |||
1331 | /* | ||
1332 | @@ -777,7 +779,7 @@ void load_ucode_intel_ap(void) | ||
1333 | |||
1334 | collect_cpu_info_early(&uci); | ||
1335 | ret = load_microcode(mc_saved_data_p, mc_saved_in_initrd_p, | ||
1336 | - initrd_start_addr, &uci); | ||
1337 | + get_initrd_start_addr(), &uci); | ||
1338 | |||
1339 | if (ret != UCODE_OK) | ||
1340 | return; | ||
1341 | diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c | ||
1342 | index 2bf79d7c97df..a3aeb2cc361e 100644 | ||
1343 | --- a/arch/x86/kernel/cpu/perf_event.c | ||
1344 | +++ b/arch/x86/kernel/cpu/perf_event.c | ||
1345 | @@ -593,6 +593,19 @@ void x86_pmu_disable_all(void) | ||
1346 | } | ||
1347 | } | ||
1348 | |||
1349 | +/* | ||
1350 | + * There may be PMI landing after enabled=0. The PMI hitting could be before or | ||
1351 | + * after disable_all. | ||
1352 | + * | ||
1353 | + * If PMI hits before disable_all, the PMU will be disabled in the NMI handler. | ||
1354 | + * It will not be re-enabled in the NMI handler again, because enabled=0. After | ||
1355 | + * handling the NMI, disable_all will be called, which will not change the | ||
1356 | + * state either. If PMI hits after disable_all, the PMU is already disabled | ||
1357 | + * before entering NMI handler. The NMI handler will not change the state | ||
1358 | + * either. | ||
1359 | + * | ||
1360 | + * So either situation is harmless. | ||
1361 | + */ | ||
1362 | static void x86_pmu_disable(struct pmu *pmu) | ||
1363 | { | ||
1364 | struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events); | ||
1365 | diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h | ||
1366 | index d0e35ebb2adb..ee70445fbb1f 100644 | ||
1367 | --- a/arch/x86/kernel/cpu/perf_event.h | ||
1368 | +++ b/arch/x86/kernel/cpu/perf_event.h | ||
1369 | @@ -591,6 +591,7 @@ struct x86_pmu { | ||
1370 | pebs_active :1, | ||
1371 | pebs_broken :1; | ||
1372 | int pebs_record_size; | ||
1373 | + int pebs_buffer_size; | ||
1374 | void (*drain_pebs)(struct pt_regs *regs); | ||
1375 | struct event_constraint *pebs_constraints; | ||
1376 | void (*pebs_aliases)(struct perf_event *event); | ||
1377 | @@ -907,6 +908,8 @@ void intel_pmu_lbr_init_hsw(void); | ||
1378 | |||
1379 | void intel_pmu_lbr_init_skl(void); | ||
1380 | |||
1381 | +void intel_pmu_pebs_data_source_nhm(void); | ||
1382 | + | ||
1383 | int intel_pmu_setup_lbr_filter(struct perf_event *event); | ||
1384 | |||
1385 | void intel_pt_interrupt(void); | ||
1386 | diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c | ||
1387 | index e2a430021e46..078de2e86b7a 100644 | ||
1388 | --- a/arch/x86/kernel/cpu/perf_event_intel.c | ||
1389 | +++ b/arch/x86/kernel/cpu/perf_event_intel.c | ||
1390 | @@ -1458,7 +1458,15 @@ static __initconst const u64 slm_hw_cache_event_ids | ||
1391 | }; | ||
1392 | |||
1393 | /* | ||
1394 | - * Use from PMIs where the LBRs are already disabled. | ||
1395 | + * Used from PMIs where the LBRs are already disabled. | ||
1396 | + * | ||
1397 | + * This function could be called consecutively. It is required to remain in | ||
1398 | + * disabled state if called consecutively. | ||
1399 | + * | ||
1400 | + * During consecutive calls, the same disable value will be written to related | ||
1401 | + * registers, so the PMU state remains unchanged. hw.state in | ||
1402 | + * intel_bts_disable_local will remain PERF_HES_STOPPED too in consecutive | ||
1403 | + * calls. | ||
1404 | */ | ||
1405 | static void __intel_pmu_disable_all(void) | ||
1406 | { | ||
1407 | @@ -1840,6 +1848,16 @@ again: | ||
1408 | if (__test_and_clear_bit(62, (unsigned long *)&status)) { | ||
1409 | handled++; | ||
1410 | x86_pmu.drain_pebs(regs); | ||
1411 | + /* | ||
1412 | + * There are cases where, even though, the PEBS ovfl bit is set | ||
1413 | + * in GLOBAL_OVF_STATUS, the PEBS events may also have their | ||
1414 | + * overflow bits set for their counters. We must clear them | ||
1415 | + * here because they have been processed as exact samples in | ||
1416 | + * the drain_pebs() routine. They must not be processed again | ||
1417 | + * in the for_each_bit_set() loop for regular samples below. | ||
1418 | + */ | ||
1419 | + status &= ~cpuc->pebs_enabled; | ||
1420 | + status &= x86_pmu.intel_ctrl | GLOBAL_STATUS_TRACE_TOPAPMI; | ||
1421 | } | ||
1422 | |||
1423 | /* | ||
1424 | @@ -1885,7 +1903,10 @@ again: | ||
1425 | goto again; | ||
1426 | |||
1427 | done: | ||
1428 | - __intel_pmu_enable_all(0, true); | ||
1429 | + /* Only restore PMU state when it's active. See x86_pmu_disable(). */ | ||
1430 | + if (cpuc->enabled) | ||
1431 | + __intel_pmu_enable_all(0, true); | ||
1432 | + | ||
1433 | /* | ||
1434 | * Only unmask the NMI after the overflow counters | ||
1435 | * have been reset. This avoids spurious NMIs on | ||
1436 | @@ -3315,6 +3336,7 @@ __init int intel_pmu_init(void) | ||
1437 | intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = | ||
1438 | X86_CONFIG(.event=0xb1, .umask=0x3f, .inv=1, .cmask=1); | ||
1439 | |||
1440 | + intel_pmu_pebs_data_source_nhm(); | ||
1441 | x86_add_quirk(intel_nehalem_quirk); | ||
1442 | |||
1443 | pr_cont("Nehalem events, "); | ||
1444 | @@ -3377,6 +3399,7 @@ __init int intel_pmu_init(void) | ||
1445 | intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = | ||
1446 | X86_CONFIG(.event=0xb1, .umask=0x3f, .inv=1, .cmask=1); | ||
1447 | |||
1448 | + intel_pmu_pebs_data_source_nhm(); | ||
1449 | pr_cont("Westmere events, "); | ||
1450 | break; | ||
1451 | |||
1452 | diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c | ||
1453 | index 5db1c7755548..7abb2b88572e 100644 | ||
1454 | --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c | ||
1455 | +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | ||
1456 | @@ -51,7 +51,8 @@ union intel_x86_pebs_dse { | ||
1457 | #define OP_LH (P(OP, LOAD) | P(LVL, HIT)) | ||
1458 | #define SNOOP_NONE_MISS (P(SNOOP, NONE) | P(SNOOP, MISS)) | ||
1459 | |||
1460 | -static const u64 pebs_data_source[] = { | ||
1461 | +/* Version for Sandy Bridge and later */ | ||
1462 | +static u64 pebs_data_source[] = { | ||
1463 | P(OP, LOAD) | P(LVL, MISS) | P(LVL, L3) | P(SNOOP, NA),/* 0x00:ukn L3 */ | ||
1464 | OP_LH | P(LVL, L1) | P(SNOOP, NONE), /* 0x01: L1 local */ | ||
1465 | OP_LH | P(LVL, LFB) | P(SNOOP, NONE), /* 0x02: LFB hit */ | ||
1466 | @@ -70,6 +71,14 @@ static const u64 pebs_data_source[] = { | ||
1467 | OP_LH | P(LVL, UNC) | P(SNOOP, NONE), /* 0x0f: uncached */ | ||
1468 | }; | ||
1469 | |||
1470 | +/* Patch up minor differences in the bits */ | ||
1471 | +void __init intel_pmu_pebs_data_source_nhm(void) | ||
1472 | +{ | ||
1473 | + pebs_data_source[0x05] = OP_LH | P(LVL, L3) | P(SNOOP, HIT); | ||
1474 | + pebs_data_source[0x06] = OP_LH | P(LVL, L3) | P(SNOOP, HITM); | ||
1475 | + pebs_data_source[0x07] = OP_LH | P(LVL, L3) | P(SNOOP, HITM); | ||
1476 | +} | ||
1477 | + | ||
1478 | static u64 precise_store_data(u64 status) | ||
1479 | { | ||
1480 | union intel_x86_pebs_dse dse; | ||
1481 | @@ -269,7 +278,7 @@ static int alloc_pebs_buffer(int cpu) | ||
1482 | if (!x86_pmu.pebs) | ||
1483 | return 0; | ||
1484 | |||
1485 | - buffer = kzalloc_node(PEBS_BUFFER_SIZE, GFP_KERNEL, node); | ||
1486 | + buffer = kzalloc_node(x86_pmu.pebs_buffer_size, GFP_KERNEL, node); | ||
1487 | if (unlikely(!buffer)) | ||
1488 | return -ENOMEM; | ||
1489 | |||
1490 | @@ -286,7 +295,7 @@ static int alloc_pebs_buffer(int cpu) | ||
1491 | per_cpu(insn_buffer, cpu) = ibuffer; | ||
1492 | } | ||
1493 | |||
1494 | - max = PEBS_BUFFER_SIZE / x86_pmu.pebs_record_size; | ||
1495 | + max = x86_pmu.pebs_buffer_size / x86_pmu.pebs_record_size; | ||
1496 | |||
1497 | ds->pebs_buffer_base = (u64)(unsigned long)buffer; | ||
1498 | ds->pebs_index = ds->pebs_buffer_base; | ||
1499 | @@ -1296,6 +1305,7 @@ void __init intel_ds_init(void) | ||
1500 | |||
1501 | x86_pmu.bts = boot_cpu_has(X86_FEATURE_BTS); | ||
1502 | x86_pmu.pebs = boot_cpu_has(X86_FEATURE_PEBS); | ||
1503 | + x86_pmu.pebs_buffer_size = PEBS_BUFFER_SIZE; | ||
1504 | if (x86_pmu.pebs) { | ||
1505 | char pebs_type = x86_pmu.intel_cap.pebs_trap ? '+' : '-'; | ||
1506 | int format = x86_pmu.intel_cap.pebs_format; | ||
1507 | @@ -1304,6 +1314,14 @@ void __init intel_ds_init(void) | ||
1508 | case 0: | ||
1509 | printk(KERN_CONT "PEBS fmt0%c, ", pebs_type); | ||
1510 | x86_pmu.pebs_record_size = sizeof(struct pebs_record_core); | ||
1511 | + /* | ||
1512 | + * Using >PAGE_SIZE buffers makes the WRMSR to | ||
1513 | + * PERF_GLOBAL_CTRL in intel_pmu_enable_all() | ||
1514 | + * mysteriously hang on Core2. | ||
1515 | + * | ||
1516 | + * As a workaround, we don't do this. | ||
1517 | + */ | ||
1518 | + x86_pmu.pebs_buffer_size = PAGE_SIZE; | ||
1519 | x86_pmu.drain_pebs = intel_pmu_drain_pebs_core; | ||
1520 | break; | ||
1521 | |||
1522 | diff --git a/arch/x86/kernel/cpu/perf_event_knc.c b/arch/x86/kernel/cpu/perf_event_knc.c | ||
1523 | index 5b0c232d1ee6..b931095e86d4 100644 | ||
1524 | --- a/arch/x86/kernel/cpu/perf_event_knc.c | ||
1525 | +++ b/arch/x86/kernel/cpu/perf_event_knc.c | ||
1526 | @@ -263,7 +263,9 @@ again: | ||
1527 | goto again; | ||
1528 | |||
1529 | done: | ||
1530 | - knc_pmu_enable_all(0); | ||
1531 | + /* Only restore PMU state when it's active. See x86_pmu_disable(). */ | ||
1532 | + if (cpuc->enabled) | ||
1533 | + knc_pmu_enable_all(0); | ||
1534 | |||
1535 | return handled; | ||
1536 | } | ||
1537 | diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c | ||
1538 | index 37dae792dbbe..589b3193f102 100644 | ||
1539 | --- a/arch/x86/kernel/ioport.c | ||
1540 | +++ b/arch/x86/kernel/ioport.c | ||
1541 | @@ -96,9 +96,14 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on) | ||
1542 | SYSCALL_DEFINE1(iopl, unsigned int, level) | ||
1543 | { | ||
1544 | struct pt_regs *regs = current_pt_regs(); | ||
1545 | - unsigned int old = (regs->flags >> 12) & 3; | ||
1546 | struct thread_struct *t = ¤t->thread; | ||
1547 | |||
1548 | + /* | ||
1549 | + * Careful: the IOPL bits in regs->flags are undefined under Xen PV | ||
1550 | + * and changing them has no effect. | ||
1551 | + */ | ||
1552 | + unsigned int old = t->iopl >> X86_EFLAGS_IOPL_BIT; | ||
1553 | + | ||
1554 | if (level > 3) | ||
1555 | return -EINVAL; | ||
1556 | /* Trying to gain more privileges? */ | ||
1557 | @@ -106,8 +111,9 @@ SYSCALL_DEFINE1(iopl, unsigned int, level) | ||
1558 | if (!capable(CAP_SYS_RAWIO)) | ||
1559 | return -EPERM; | ||
1560 | } | ||
1561 | - regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12); | ||
1562 | - t->iopl = level << 12; | ||
1563 | + regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | | ||
1564 | + (level << X86_EFLAGS_IOPL_BIT); | ||
1565 | + t->iopl = level << X86_EFLAGS_IOPL_BIT; | ||
1566 | set_iopl_mask(t->iopl); | ||
1567 | |||
1568 | return 0; | ||
1569 | diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c | ||
1570 | index e835d263a33b..4cbb60fbff3e 100644 | ||
1571 | --- a/arch/x86/kernel/process_64.c | ||
1572 | +++ b/arch/x86/kernel/process_64.c | ||
1573 | @@ -48,6 +48,7 @@ | ||
1574 | #include <asm/syscalls.h> | ||
1575 | #include <asm/debugreg.h> | ||
1576 | #include <asm/switch_to.h> | ||
1577 | +#include <asm/xen/hypervisor.h> | ||
1578 | |||
1579 | asmlinkage extern void ret_from_fork(void); | ||
1580 | |||
1581 | @@ -411,6 +412,17 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | ||
1582 | task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV)) | ||
1583 | __switch_to_xtra(prev_p, next_p, tss); | ||
1584 | |||
1585 | +#ifdef CONFIG_XEN | ||
1586 | + /* | ||
1587 | + * On Xen PV, IOPL bits in pt_regs->flags have no effect, and | ||
1588 | + * current_pt_regs()->flags may not match the current task's | ||
1589 | + * intended IOPL. We need to switch it manually. | ||
1590 | + */ | ||
1591 | + if (unlikely(static_cpu_has(X86_FEATURE_XENPV) && | ||
1592 | + prev->iopl != next->iopl)) | ||
1593 | + xen_set_iopl_mask(next->iopl); | ||
1594 | +#endif | ||
1595 | + | ||
1596 | if (static_cpu_has_bug(X86_BUG_SYSRET_SS_ATTRS)) { | ||
1597 | /* | ||
1598 | * AMD CPUs have a misfeature: SYSRET sets the SS selector but | ||
1599 | diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c | ||
1600 | index b0ea42b78ccd..ab5318727579 100644 | ||
1601 | --- a/arch/x86/kvm/i8254.c | ||
1602 | +++ b/arch/x86/kvm/i8254.c | ||
1603 | @@ -245,7 +245,7 @@ static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian) | ||
1604 | * PIC is being reset. Handle it gracefully here | ||
1605 | */ | ||
1606 | atomic_inc(&ps->pending); | ||
1607 | - else if (value > 0) | ||
1608 | + else if (value > 0 && ps->reinject) | ||
1609 | /* in this case, we had multiple outstanding pit interrupts | ||
1610 | * that we needed to inject. Reinject | ||
1611 | */ | ||
1612 | @@ -288,7 +288,9 @@ static void pit_do_work(struct kthread_work *work) | ||
1613 | * last one has been acked. | ||
1614 | */ | ||
1615 | spin_lock(&ps->inject_lock); | ||
1616 | - if (ps->irq_ack) { | ||
1617 | + if (!ps->reinject) | ||
1618 | + inject = 1; | ||
1619 | + else if (ps->irq_ack) { | ||
1620 | ps->irq_ack = 0; | ||
1621 | inject = 1; | ||
1622 | } | ||
1623 | @@ -317,10 +319,10 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer *data) | ||
1624 | struct kvm_kpit_state *ps = container_of(data, struct kvm_kpit_state, timer); | ||
1625 | struct kvm_pit *pt = ps->kvm->arch.vpit; | ||
1626 | |||
1627 | - if (ps->reinject || !atomic_read(&ps->pending)) { | ||
1628 | + if (ps->reinject) | ||
1629 | atomic_inc(&ps->pending); | ||
1630 | - queue_kthread_work(&pt->worker, &pt->expired); | ||
1631 | - } | ||
1632 | + | ||
1633 | + queue_kthread_work(&pt->worker, &pt->expired); | ||
1634 | |||
1635 | if (ps->is_periodic) { | ||
1636 | hrtimer_add_expires_ns(&ps->timer, ps->period); | ||
1637 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
1638 | index 0958fa2b7cb7..f34ab71dfd57 100644 | ||
1639 | --- a/arch/x86/kvm/vmx.c | ||
1640 | +++ b/arch/x86/kvm/vmx.c | ||
1641 | @@ -2637,8 +2637,15 @@ static void nested_vmx_setup_ctls_msrs(struct vcpu_vmx *vmx) | ||
1642 | } else | ||
1643 | vmx->nested.nested_vmx_ept_caps = 0; | ||
1644 | |||
1645 | + /* | ||
1646 | + * Old versions of KVM use the single-context version without | ||
1647 | + * checking for support, so declare that it is supported even | ||
1648 | + * though it is treated as global context. The alternative is | ||
1649 | + * not failing the single-context invvpid, and it is worse. | ||
1650 | + */ | ||
1651 | if (enable_vpid) | ||
1652 | vmx->nested.nested_vmx_vpid_caps = VMX_VPID_INVVPID_BIT | | ||
1653 | + VMX_VPID_EXTENT_SINGLE_CONTEXT_BIT | | ||
1654 | VMX_VPID_EXTENT_GLOBAL_CONTEXT_BIT; | ||
1655 | else | ||
1656 | vmx->nested.nested_vmx_vpid_caps = 0; | ||
1657 | @@ -7340,6 +7347,7 @@ static int handle_invept(struct kvm_vcpu *vcpu) | ||
1658 | if (!(types & (1UL << type))) { | ||
1659 | nested_vmx_failValid(vcpu, | ||
1660 | VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID); | ||
1661 | + skip_emulated_instruction(vcpu); | ||
1662 | return 1; | ||
1663 | } | ||
1664 | |||
1665 | @@ -7398,6 +7406,7 @@ static int handle_invvpid(struct kvm_vcpu *vcpu) | ||
1666 | if (!(types & (1UL << type))) { | ||
1667 | nested_vmx_failValid(vcpu, | ||
1668 | VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID); | ||
1669 | + skip_emulated_instruction(vcpu); | ||
1670 | return 1; | ||
1671 | } | ||
1672 | |||
1673 | @@ -7414,12 +7423,17 @@ static int handle_invvpid(struct kvm_vcpu *vcpu) | ||
1674 | } | ||
1675 | |||
1676 | switch (type) { | ||
1677 | + case VMX_VPID_EXTENT_SINGLE_CONTEXT: | ||
1678 | + /* | ||
1679 | + * Old versions of KVM use the single-context version so we | ||
1680 | + * have to support it; just treat it the same as all-context. | ||
1681 | + */ | ||
1682 | case VMX_VPID_EXTENT_ALL_CONTEXT: | ||
1683 | __vmx_flush_tlb(vcpu, to_vmx(vcpu)->nested.vpid02); | ||
1684 | nested_vmx_succeed(vcpu); | ||
1685 | break; | ||
1686 | default: | ||
1687 | - /* Trap single context invalidation invvpid calls */ | ||
1688 | + /* Trap individual address invalidation invvpid calls */ | ||
1689 | BUG_ON(1); | ||
1690 | break; | ||
1691 | } | ||
1692 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
1693 | index d2945024ed33..8bfc5fc6a39b 100644 | ||
1694 | --- a/arch/x86/kvm/x86.c | ||
1695 | +++ b/arch/x86/kvm/x86.c | ||
1696 | @@ -2736,6 +2736,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | ||
1697 | } | ||
1698 | |||
1699 | kvm_make_request(KVM_REQ_STEAL_UPDATE, vcpu); | ||
1700 | + vcpu->arch.switch_db_regs |= KVM_DEBUGREG_RELOAD; | ||
1701 | } | ||
1702 | |||
1703 | void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) | ||
1704 | diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c | ||
1705 | index 8f4cc3dfac32..5fb6adaaa796 100644 | ||
1706 | --- a/arch/x86/mm/tlb.c | ||
1707 | +++ b/arch/x86/mm/tlb.c | ||
1708 | @@ -106,8 +106,6 @@ static void flush_tlb_func(void *info) | ||
1709 | |||
1710 | if (f->flush_mm != this_cpu_read(cpu_tlbstate.active_mm)) | ||
1711 | return; | ||
1712 | - if (!f->flush_end) | ||
1713 | - f->flush_end = f->flush_start + PAGE_SIZE; | ||
1714 | |||
1715 | count_vm_tlb_event(NR_TLB_REMOTE_FLUSH_RECEIVED); | ||
1716 | if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK) { | ||
1717 | @@ -135,12 +133,20 @@ void native_flush_tlb_others(const struct cpumask *cpumask, | ||
1718 | unsigned long end) | ||
1719 | { | ||
1720 | struct flush_tlb_info info; | ||
1721 | + | ||
1722 | + if (end == 0) | ||
1723 | + end = start + PAGE_SIZE; | ||
1724 | info.flush_mm = mm; | ||
1725 | info.flush_start = start; | ||
1726 | info.flush_end = end; | ||
1727 | |||
1728 | count_vm_tlb_event(NR_TLB_REMOTE_FLUSH); | ||
1729 | - trace_tlb_flush(TLB_REMOTE_SEND_IPI, end - start); | ||
1730 | + if (end == TLB_FLUSH_ALL) | ||
1731 | + trace_tlb_flush(TLB_REMOTE_SEND_IPI, TLB_FLUSH_ALL); | ||
1732 | + else | ||
1733 | + trace_tlb_flush(TLB_REMOTE_SEND_IPI, | ||
1734 | + (end - start) >> PAGE_SHIFT); | ||
1735 | + | ||
1736 | if (is_uv_system()) { | ||
1737 | unsigned int cpu; | ||
1738 | |||
1739 | diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c | ||
1740 | index e58565556703..0ae7e9fa348d 100644 | ||
1741 | --- a/arch/x86/pci/fixup.c | ||
1742 | +++ b/arch/x86/pci/fixup.c | ||
1743 | @@ -540,3 +540,10 @@ static void twinhead_reserve_killing_zone(struct pci_dev *dev) | ||
1744 | } | ||
1745 | } | ||
1746 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x27B9, twinhead_reserve_killing_zone); | ||
1747 | + | ||
1748 | +static void pci_bdwep_bar(struct pci_dev *dev) | ||
1749 | +{ | ||
1750 | + dev->non_compliant_bars = 1; | ||
1751 | +} | ||
1752 | +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fa0, pci_bdwep_bar); | ||
1753 | +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fc0, pci_bdwep_bar); | ||
1754 | diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c | ||
1755 | index b7de78bdc09c..beab8c706ac9 100644 | ||
1756 | --- a/arch/x86/xen/enlighten.c | ||
1757 | +++ b/arch/x86/xen/enlighten.c | ||
1758 | @@ -961,7 +961,7 @@ static void xen_load_sp0(struct tss_struct *tss, | ||
1759 | tss->x86_tss.sp0 = thread->sp0; | ||
1760 | } | ||
1761 | |||
1762 | -static void xen_set_iopl_mask(unsigned mask) | ||
1763 | +void xen_set_iopl_mask(unsigned mask) | ||
1764 | { | ||
1765 | struct physdev_set_iopl set_iopl; | ||
1766 | |||
1767 | diff --git a/arch/xtensa/kernel/head.S b/arch/xtensa/kernel/head.S | ||
1768 | index 9ed55649ac8e..05e1df943856 100644 | ||
1769 | --- a/arch/xtensa/kernel/head.S | ||
1770 | +++ b/arch/xtensa/kernel/head.S | ||
1771 | @@ -128,7 +128,7 @@ ENTRY(_startup) | ||
1772 | wsr a0, icountlevel | ||
1773 | |||
1774 | .set _index, 0 | ||
1775 | - .rept XCHAL_NUM_DBREAK - 1 | ||
1776 | + .rept XCHAL_NUM_DBREAK | ||
1777 | wsr a0, SREG_DBREAKC + _index | ||
1778 | .set _index, _index + 1 | ||
1779 | .endr | ||
1780 | diff --git a/arch/xtensa/mm/cache.c b/arch/xtensa/mm/cache.c | ||
1781 | index d75aa1476da7..1a804a2f9a5b 100644 | ||
1782 | --- a/arch/xtensa/mm/cache.c | ||
1783 | +++ b/arch/xtensa/mm/cache.c | ||
1784 | @@ -97,11 +97,11 @@ void clear_user_highpage(struct page *page, unsigned long vaddr) | ||
1785 | unsigned long paddr; | ||
1786 | void *kvaddr = coherent_kvaddr(page, TLBTEMP_BASE_1, vaddr, &paddr); | ||
1787 | |||
1788 | - pagefault_disable(); | ||
1789 | + preempt_disable(); | ||
1790 | kmap_invalidate_coherent(page, vaddr); | ||
1791 | set_bit(PG_arch_1, &page->flags); | ||
1792 | clear_page_alias(kvaddr, paddr); | ||
1793 | - pagefault_enable(); | ||
1794 | + preempt_enable(); | ||
1795 | } | ||
1796 | |||
1797 | void copy_user_highpage(struct page *dst, struct page *src, | ||
1798 | @@ -113,11 +113,11 @@ void copy_user_highpage(struct page *dst, struct page *src, | ||
1799 | void *src_vaddr = coherent_kvaddr(src, TLBTEMP_BASE_2, vaddr, | ||
1800 | &src_paddr); | ||
1801 | |||
1802 | - pagefault_disable(); | ||
1803 | + preempt_disable(); | ||
1804 | kmap_invalidate_coherent(dst, vaddr); | ||
1805 | set_bit(PG_arch_1, &dst->flags); | ||
1806 | copy_page_alias(dst_vaddr, src_vaddr, dst_paddr, src_paddr); | ||
1807 | - pagefault_enable(); | ||
1808 | + preempt_enable(); | ||
1809 | } | ||
1810 | |||
1811 | #endif /* DCACHE_WAY_SIZE > PAGE_SIZE */ | ||
1812 | diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c | ||
1813 | index 70cb408bc20d..92d785fefb6d 100644 | ||
1814 | --- a/arch/xtensa/platforms/iss/console.c | ||
1815 | +++ b/arch/xtensa/platforms/iss/console.c | ||
1816 | @@ -100,21 +100,23 @@ static void rs_poll(unsigned long priv) | ||
1817 | { | ||
1818 | struct tty_port *port = (struct tty_port *)priv; | ||
1819 | int i = 0; | ||
1820 | + int rd = 1; | ||
1821 | unsigned char c; | ||
1822 | |||
1823 | spin_lock(&timer_lock); | ||
1824 | |||
1825 | while (simc_poll(0)) { | ||
1826 | - simc_read(0, &c, 1); | ||
1827 | + rd = simc_read(0, &c, 1); | ||
1828 | + if (rd <= 0) | ||
1829 | + break; | ||
1830 | tty_insert_flip_char(port, c, TTY_NORMAL); | ||
1831 | i++; | ||
1832 | } | ||
1833 | |||
1834 | if (i) | ||
1835 | tty_flip_buffer_push(port); | ||
1836 | - | ||
1837 | - | ||
1838 | - mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); | ||
1839 | + if (rd) | ||
1840 | + mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); | ||
1841 | spin_unlock(&timer_lock); | ||
1842 | } | ||
1843 | |||
1844 | diff --git a/block/blk-core.c b/block/blk-core.c | ||
1845 | index 33e2f62d5062..f8e64cac981a 100644 | ||
1846 | --- a/block/blk-core.c | ||
1847 | +++ b/block/blk-core.c | ||
1848 | @@ -2189,7 +2189,7 @@ int blk_insert_cloned_request(struct request_queue *q, struct request *rq) | ||
1849 | if (q->mq_ops) { | ||
1850 | if (blk_queue_io_stat(q)) | ||
1851 | blk_account_io_start(rq, true); | ||
1852 | - blk_mq_insert_request(rq, false, true, true); | ||
1853 | + blk_mq_insert_request(rq, false, true, false); | ||
1854 | return 0; | ||
1855 | } | ||
1856 | |||
1857 | diff --git a/crypto/asymmetric_keys/x509_cert_parser.c b/crypto/asymmetric_keys/x509_cert_parser.c | ||
1858 | index 021d39c0ba75..13c4e5a5fe8c 100644 | ||
1859 | --- a/crypto/asymmetric_keys/x509_cert_parser.c | ||
1860 | +++ b/crypto/asymmetric_keys/x509_cert_parser.c | ||
1861 | @@ -494,7 +494,7 @@ int x509_decode_time(time64_t *_t, size_t hdrlen, | ||
1862 | unsigned char tag, | ||
1863 | const unsigned char *value, size_t vlen) | ||
1864 | { | ||
1865 | - static const unsigned char month_lengths[] = { 31, 29, 31, 30, 31, 30, | ||
1866 | + static const unsigned char month_lengths[] = { 31, 28, 31, 30, 31, 30, | ||
1867 | 31, 31, 30, 31, 30, 31 }; | ||
1868 | const unsigned char *p = value; | ||
1869 | unsigned year, mon, day, hour, min, sec, mon_len; | ||
1870 | @@ -540,9 +540,9 @@ int x509_decode_time(time64_t *_t, size_t hdrlen, | ||
1871 | if (year % 4 == 0) { | ||
1872 | mon_len = 29; | ||
1873 | if (year % 100 == 0) { | ||
1874 | - year /= 100; | ||
1875 | - if (year % 4 != 0) | ||
1876 | - mon_len = 28; | ||
1877 | + mon_len = 28; | ||
1878 | + if (year % 400 == 0) | ||
1879 | + mon_len = 29; | ||
1880 | } | ||
1881 | } | ||
1882 | } | ||
1883 | diff --git a/crypto/keywrap.c b/crypto/keywrap.c | ||
1884 | index b1d106ce55f3..72014f963ba7 100644 | ||
1885 | --- a/crypto/keywrap.c | ||
1886 | +++ b/crypto/keywrap.c | ||
1887 | @@ -212,7 +212,7 @@ static int crypto_kw_decrypt(struct blkcipher_desc *desc, | ||
1888 | SEMIBSIZE)) | ||
1889 | ret = -EBADMSG; | ||
1890 | |||
1891 | - memzero_explicit(&block, sizeof(struct crypto_kw_block)); | ||
1892 | + memzero_explicit(block, sizeof(struct crypto_kw_block)); | ||
1893 | |||
1894 | return ret; | ||
1895 | } | ||
1896 | @@ -297,7 +297,7 @@ static int crypto_kw_encrypt(struct blkcipher_desc *desc, | ||
1897 | /* establish the IV for the caller to pick up */ | ||
1898 | memcpy(desc->info, block->A, SEMIBSIZE); | ||
1899 | |||
1900 | - memzero_explicit(&block, sizeof(struct crypto_kw_block)); | ||
1901 | + memzero_explicit(block, sizeof(struct crypto_kw_block)); | ||
1902 | |||
1903 | return 0; | ||
1904 | } | ||
1905 | diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c | ||
1906 | index cdc5c2599beb..627f8fbb5e9a 100644 | ||
1907 | --- a/drivers/acpi/resource.c | ||
1908 | +++ b/drivers/acpi/resource.c | ||
1909 | @@ -26,8 +26,20 @@ | ||
1910 | |||
1911 | #ifdef CONFIG_X86 | ||
1912 | #define valid_IRQ(i) (((i) != 0) && ((i) != 2)) | ||
1913 | +static inline bool acpi_iospace_resource_valid(struct resource *res) | ||
1914 | +{ | ||
1915 | + /* On X86 IO space is limited to the [0 - 64K] IO port range */ | ||
1916 | + return res->end < 0x10003; | ||
1917 | +} | ||
1918 | #else | ||
1919 | #define valid_IRQ(i) (true) | ||
1920 | +/* | ||
1921 | + * ACPI IO descriptors on arches other than X86 contain MMIO CPU physical | ||
1922 | + * addresses mapping IO space in CPU physical address space, IO space | ||
1923 | + * resources can be placed anywhere in the 64-bit physical address space. | ||
1924 | + */ | ||
1925 | +static inline bool | ||
1926 | +acpi_iospace_resource_valid(struct resource *res) { return true; } | ||
1927 | #endif | ||
1928 | |||
1929 | static bool acpi_dev_resource_len_valid(u64 start, u64 end, u64 len, bool io) | ||
1930 | @@ -126,7 +138,7 @@ static void acpi_dev_ioresource_flags(struct resource *res, u64 len, | ||
1931 | if (!acpi_dev_resource_len_valid(res->start, res->end, len, true)) | ||
1932 | res->flags |= IORESOURCE_DISABLED | IORESOURCE_UNSET; | ||
1933 | |||
1934 | - if (res->end >= 0x10003) | ||
1935 | + if (!acpi_iospace_resource_valid(res)) | ||
1936 | res->flags |= IORESOURCE_DISABLED | IORESOURCE_UNSET; | ||
1937 | |||
1938 | if (io_decode == ACPI_DECODE_16) | ||
1939 | diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c | ||
1940 | index 0d94621dc856..e3322adaaae0 100644 | ||
1941 | --- a/drivers/acpi/sleep.c | ||
1942 | +++ b/drivers/acpi/sleep.c | ||
1943 | @@ -714,6 +714,7 @@ static int acpi_hibernation_enter(void) | ||
1944 | |||
1945 | static void acpi_hibernation_leave(void) | ||
1946 | { | ||
1947 | + pm_set_resume_via_firmware(); | ||
1948 | /* | ||
1949 | * If ACPI is not enabled by the BIOS and the boot kernel, we need to | ||
1950 | * enable it here. | ||
1951 | diff --git a/drivers/block/brd.c b/drivers/block/brd.c | ||
1952 | index a5880f4ab40e..1914c63ca8b1 100644 | ||
1953 | --- a/drivers/block/brd.c | ||
1954 | +++ b/drivers/block/brd.c | ||
1955 | @@ -338,7 +338,7 @@ static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio) | ||
1956 | |||
1957 | if (unlikely(bio->bi_rw & REQ_DISCARD)) { | ||
1958 | if (sector & ((PAGE_SIZE >> SECTOR_SHIFT) - 1) || | ||
1959 | - bio->bi_iter.bi_size & PAGE_MASK) | ||
1960 | + bio->bi_iter.bi_size & ~PAGE_MASK) | ||
1961 | goto io_error; | ||
1962 | discard_from_brd(brd, sector, bio->bi_iter.bi_size); | ||
1963 | goto out; | ||
1964 | diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c | ||
1965 | index 3457ac8c03e2..55d3d1da72de 100644 | ||
1966 | --- a/drivers/block/mtip32xx/mtip32xx.c | ||
1967 | +++ b/drivers/block/mtip32xx/mtip32xx.c | ||
1968 | @@ -173,7 +173,13 @@ static struct mtip_cmd *mtip_get_int_command(struct driver_data *dd) | ||
1969 | { | ||
1970 | struct request *rq; | ||
1971 | |||
1972 | + if (mtip_check_surprise_removal(dd->pdev)) | ||
1973 | + return NULL; | ||
1974 | + | ||
1975 | rq = blk_mq_alloc_request(dd->queue, 0, __GFP_RECLAIM, true); | ||
1976 | + if (IS_ERR(rq)) | ||
1977 | + return NULL; | ||
1978 | + | ||
1979 | return blk_mq_rq_to_pdu(rq); | ||
1980 | } | ||
1981 | |||
1982 | @@ -233,15 +239,9 @@ static void mtip_async_complete(struct mtip_port *port, | ||
1983 | "Command tag %d failed due to TFE\n", tag); | ||
1984 | } | ||
1985 | |||
1986 | - /* Unmap the DMA scatter list entries */ | ||
1987 | - dma_unmap_sg(&dd->pdev->dev, cmd->sg, cmd->scatter_ents, cmd->direction); | ||
1988 | - | ||
1989 | rq = mtip_rq_from_tag(dd, tag); | ||
1990 | |||
1991 | - if (unlikely(cmd->unaligned)) | ||
1992 | - up(&port->cmd_slot_unal); | ||
1993 | - | ||
1994 | - blk_mq_end_request(rq, status ? -EIO : 0); | ||
1995 | + blk_mq_complete_request(rq, status); | ||
1996 | } | ||
1997 | |||
1998 | /* | ||
1999 | @@ -581,6 +581,8 @@ static void mtip_completion(struct mtip_port *port, | ||
2000 | dev_warn(&port->dd->pdev->dev, | ||
2001 | "Internal command %d completed with TFE\n", tag); | ||
2002 | |||
2003 | + command->comp_func = NULL; | ||
2004 | + command->comp_data = NULL; | ||
2005 | complete(waiting); | ||
2006 | } | ||
2007 | |||
2008 | @@ -618,8 +620,6 @@ static void mtip_handle_tfe(struct driver_data *dd) | ||
2009 | |||
2010 | port = dd->port; | ||
2011 | |||
2012 | - set_bit(MTIP_PF_EH_ACTIVE_BIT, &port->flags); | ||
2013 | - | ||
2014 | if (test_bit(MTIP_PF_IC_ACTIVE_BIT, &port->flags)) { | ||
2015 | cmd = mtip_cmd_from_tag(dd, MTIP_TAG_INTERNAL); | ||
2016 | dbg_printk(MTIP_DRV_NAME " TFE for the internal command\n"); | ||
2017 | @@ -628,7 +628,7 @@ static void mtip_handle_tfe(struct driver_data *dd) | ||
2018 | cmd->comp_func(port, MTIP_TAG_INTERNAL, | ||
2019 | cmd, PORT_IRQ_TF_ERR); | ||
2020 | } | ||
2021 | - goto handle_tfe_exit; | ||
2022 | + return; | ||
2023 | } | ||
2024 | |||
2025 | /* clear the tag accumulator */ | ||
2026 | @@ -701,7 +701,7 @@ static void mtip_handle_tfe(struct driver_data *dd) | ||
2027 | fail_reason = "thermal shutdown"; | ||
2028 | } | ||
2029 | if (buf[288] == 0xBF) { | ||
2030 | - set_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag); | ||
2031 | + set_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag); | ||
2032 | dev_info(&dd->pdev->dev, | ||
2033 | "Drive indicates rebuild has failed. Secure erase required.\n"); | ||
2034 | fail_all_ncq_cmds = 1; | ||
2035 | @@ -771,11 +771,6 @@ static void mtip_handle_tfe(struct driver_data *dd) | ||
2036 | } | ||
2037 | } | ||
2038 | print_tags(dd, "reissued (TFE)", tagaccum, cmd_cnt); | ||
2039 | - | ||
2040 | -handle_tfe_exit: | ||
2041 | - /* clear eh_active */ | ||
2042 | - clear_bit(MTIP_PF_EH_ACTIVE_BIT, &port->flags); | ||
2043 | - wake_up_interruptible(&port->svc_wait); | ||
2044 | } | ||
2045 | |||
2046 | /* | ||
2047 | @@ -1007,6 +1002,7 @@ static bool mtip_pause_ncq(struct mtip_port *port, | ||
2048 | (fis->features == 0x27 || fis->features == 0x72 || | ||
2049 | fis->features == 0x62 || fis->features == 0x26))) { | ||
2050 | clear_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag); | ||
2051 | + clear_bit(MTIP_DDF_REBUILD_FAILED_BIT, &port->dd->dd_flag); | ||
2052 | /* Com reset after secure erase or lowlevel format */ | ||
2053 | mtip_restart_port(port); | ||
2054 | clear_bit(MTIP_PF_SE_ACTIVE_BIT, &port->flags); | ||
2055 | @@ -1021,12 +1017,14 @@ static bool mtip_pause_ncq(struct mtip_port *port, | ||
2056 | * | ||
2057 | * @port Pointer to port data structure | ||
2058 | * @timeout Max duration to wait (ms) | ||
2059 | + * @atomic gfp_t flag to indicate blockable context or not | ||
2060 | * | ||
2061 | * return value | ||
2062 | * 0 Success | ||
2063 | * -EBUSY Commands still active | ||
2064 | */ | ||
2065 | -static int mtip_quiesce_io(struct mtip_port *port, unsigned long timeout) | ||
2066 | +static int mtip_quiesce_io(struct mtip_port *port, unsigned long timeout, | ||
2067 | + gfp_t atomic) | ||
2068 | { | ||
2069 | unsigned long to; | ||
2070 | unsigned int n; | ||
2071 | @@ -1037,16 +1035,21 @@ static int mtip_quiesce_io(struct mtip_port *port, unsigned long timeout) | ||
2072 | to = jiffies + msecs_to_jiffies(timeout); | ||
2073 | do { | ||
2074 | if (test_bit(MTIP_PF_SVC_THD_ACTIVE_BIT, &port->flags) && | ||
2075 | - test_bit(MTIP_PF_ISSUE_CMDS_BIT, &port->flags)) { | ||
2076 | + test_bit(MTIP_PF_ISSUE_CMDS_BIT, &port->flags) && | ||
2077 | + atomic == GFP_KERNEL) { | ||
2078 | msleep(20); | ||
2079 | continue; /* svc thd is actively issuing commands */ | ||
2080 | } | ||
2081 | |||
2082 | - msleep(100); | ||
2083 | + if (atomic == GFP_KERNEL) | ||
2084 | + msleep(100); | ||
2085 | + else { | ||
2086 | + cpu_relax(); | ||
2087 | + udelay(100); | ||
2088 | + } | ||
2089 | + | ||
2090 | if (mtip_check_surprise_removal(port->dd->pdev)) | ||
2091 | goto err_fault; | ||
2092 | - if (test_bit(MTIP_DDF_REMOVE_PENDING_BIT, &port->dd->dd_flag)) | ||
2093 | - goto err_fault; | ||
2094 | |||
2095 | /* | ||
2096 | * Ignore s_active bit 0 of array element 0. | ||
2097 | @@ -1099,6 +1102,7 @@ static int mtip_exec_internal_command(struct mtip_port *port, | ||
2098 | struct mtip_cmd *int_cmd; | ||
2099 | struct driver_data *dd = port->dd; | ||
2100 | int rv = 0; | ||
2101 | + unsigned long start; | ||
2102 | |||
2103 | /* Make sure the buffer is 8 byte aligned. This is asic specific. */ | ||
2104 | if (buffer & 0x00000007) { | ||
2105 | @@ -1107,6 +1111,10 @@ static int mtip_exec_internal_command(struct mtip_port *port, | ||
2106 | } | ||
2107 | |||
2108 | int_cmd = mtip_get_int_command(dd); | ||
2109 | + if (!int_cmd) { | ||
2110 | + dbg_printk(MTIP_DRV_NAME "Unable to allocate tag for PIO cmd\n"); | ||
2111 | + return -EFAULT; | ||
2112 | + } | ||
2113 | |||
2114 | set_bit(MTIP_PF_IC_ACTIVE_BIT, &port->flags); | ||
2115 | |||
2116 | @@ -1119,7 +1127,7 @@ static int mtip_exec_internal_command(struct mtip_port *port, | ||
2117 | if (fis->command != ATA_CMD_STANDBYNOW1) { | ||
2118 | /* wait for io to complete if non atomic */ | ||
2119 | if (mtip_quiesce_io(port, | ||
2120 | - MTIP_QUIESCE_IO_TIMEOUT_MS) < 0) { | ||
2121 | + MTIP_QUIESCE_IO_TIMEOUT_MS, atomic) < 0) { | ||
2122 | dev_warn(&dd->pdev->dev, | ||
2123 | "Failed to quiesce IO\n"); | ||
2124 | mtip_put_int_command(dd, int_cmd); | ||
2125 | @@ -1162,6 +1170,8 @@ static int mtip_exec_internal_command(struct mtip_port *port, | ||
2126 | /* Populate the command header */ | ||
2127 | int_cmd->command_header->byte_count = 0; | ||
2128 | |||
2129 | + start = jiffies; | ||
2130 | + | ||
2131 | /* Issue the command to the hardware */ | ||
2132 | mtip_issue_non_ncq_command(port, MTIP_TAG_INTERNAL); | ||
2133 | |||
2134 | @@ -1170,10 +1180,12 @@ static int mtip_exec_internal_command(struct mtip_port *port, | ||
2135 | if ((rv = wait_for_completion_interruptible_timeout( | ||
2136 | &wait, | ||
2137 | msecs_to_jiffies(timeout))) <= 0) { | ||
2138 | + | ||
2139 | if (rv == -ERESTARTSYS) { /* interrupted */ | ||
2140 | dev_err(&dd->pdev->dev, | ||
2141 | - "Internal command [%02X] was interrupted after %lu ms\n", | ||
2142 | - fis->command, timeout); | ||
2143 | + "Internal command [%02X] was interrupted after %u ms\n", | ||
2144 | + fis->command, | ||
2145 | + jiffies_to_msecs(jiffies - start)); | ||
2146 | rv = -EINTR; | ||
2147 | goto exec_ic_exit; | ||
2148 | } else if (rv == 0) /* timeout */ | ||
2149 | @@ -2897,6 +2909,42 @@ static int mtip_ftl_rebuild_poll(struct driver_data *dd) | ||
2150 | return -EFAULT; | ||
2151 | } | ||
2152 | |||
2153 | +static void mtip_softirq_done_fn(struct request *rq) | ||
2154 | +{ | ||
2155 | + struct mtip_cmd *cmd = blk_mq_rq_to_pdu(rq); | ||
2156 | + struct driver_data *dd = rq->q->queuedata; | ||
2157 | + | ||
2158 | + /* Unmap the DMA scatter list entries */ | ||
2159 | + dma_unmap_sg(&dd->pdev->dev, cmd->sg, cmd->scatter_ents, | ||
2160 | + cmd->direction); | ||
2161 | + | ||
2162 | + if (unlikely(cmd->unaligned)) | ||
2163 | + up(&dd->port->cmd_slot_unal); | ||
2164 | + | ||
2165 | + blk_mq_end_request(rq, rq->errors); | ||
2166 | +} | ||
2167 | + | ||
2168 | +static void mtip_abort_cmd(struct request *req, void *data, | ||
2169 | + bool reserved) | ||
2170 | +{ | ||
2171 | + struct driver_data *dd = data; | ||
2172 | + | ||
2173 | + dbg_printk(MTIP_DRV_NAME " Aborting request, tag = %d\n", req->tag); | ||
2174 | + | ||
2175 | + clear_bit(req->tag, dd->port->cmds_to_issue); | ||
2176 | + req->errors = -EIO; | ||
2177 | + mtip_softirq_done_fn(req); | ||
2178 | +} | ||
2179 | + | ||
2180 | +static void mtip_queue_cmd(struct request *req, void *data, | ||
2181 | + bool reserved) | ||
2182 | +{ | ||
2183 | + struct driver_data *dd = data; | ||
2184 | + | ||
2185 | + set_bit(req->tag, dd->port->cmds_to_issue); | ||
2186 | + blk_abort_request(req); | ||
2187 | +} | ||
2188 | + | ||
2189 | /* | ||
2190 | * service thread to issue queued commands | ||
2191 | * | ||
2192 | @@ -2909,7 +2957,7 @@ static int mtip_ftl_rebuild_poll(struct driver_data *dd) | ||
2193 | static int mtip_service_thread(void *data) | ||
2194 | { | ||
2195 | struct driver_data *dd = (struct driver_data *)data; | ||
2196 | - unsigned long slot, slot_start, slot_wrap; | ||
2197 | + unsigned long slot, slot_start, slot_wrap, to; | ||
2198 | unsigned int num_cmd_slots = dd->slot_groups * 32; | ||
2199 | struct mtip_port *port = dd->port; | ||
2200 | |||
2201 | @@ -2924,9 +2972,7 @@ static int mtip_service_thread(void *data) | ||
2202 | * is in progress nor error handling is active | ||
2203 | */ | ||
2204 | wait_event_interruptible(port->svc_wait, (port->flags) && | ||
2205 | - !(port->flags & MTIP_PF_PAUSE_IO)); | ||
2206 | - | ||
2207 | - set_bit(MTIP_PF_SVC_THD_ACTIVE_BIT, &port->flags); | ||
2208 | + (port->flags & MTIP_PF_SVC_THD_WORK)); | ||
2209 | |||
2210 | if (kthread_should_stop() || | ||
2211 | test_bit(MTIP_PF_SVC_THD_STOP_BIT, &port->flags)) | ||
2212 | @@ -2936,6 +2982,8 @@ static int mtip_service_thread(void *data) | ||
2213 | &dd->dd_flag))) | ||
2214 | goto st_out; | ||
2215 | |||
2216 | + set_bit(MTIP_PF_SVC_THD_ACTIVE_BIT, &port->flags); | ||
2217 | + | ||
2218 | restart_eh: | ||
2219 | /* Demux bits: start with error handling */ | ||
2220 | if (test_bit(MTIP_PF_EH_ACTIVE_BIT, &port->flags)) { | ||
2221 | @@ -2946,6 +2994,32 @@ restart_eh: | ||
2222 | if (test_bit(MTIP_PF_EH_ACTIVE_BIT, &port->flags)) | ||
2223 | goto restart_eh; | ||
2224 | |||
2225 | + if (test_bit(MTIP_PF_TO_ACTIVE_BIT, &port->flags)) { | ||
2226 | + to = jiffies + msecs_to_jiffies(5000); | ||
2227 | + | ||
2228 | + do { | ||
2229 | + mdelay(100); | ||
2230 | + } while (atomic_read(&dd->irq_workers_active) != 0 && | ||
2231 | + time_before(jiffies, to)); | ||
2232 | + | ||
2233 | + if (atomic_read(&dd->irq_workers_active) != 0) | ||
2234 | + dev_warn(&dd->pdev->dev, | ||
2235 | + "Completion workers still active!"); | ||
2236 | + | ||
2237 | + spin_lock(dd->queue->queue_lock); | ||
2238 | + blk_mq_all_tag_busy_iter(*dd->tags.tags, | ||
2239 | + mtip_queue_cmd, dd); | ||
2240 | + spin_unlock(dd->queue->queue_lock); | ||
2241 | + | ||
2242 | + set_bit(MTIP_PF_ISSUE_CMDS_BIT, &dd->port->flags); | ||
2243 | + | ||
2244 | + if (mtip_device_reset(dd)) | ||
2245 | + blk_mq_all_tag_busy_iter(*dd->tags.tags, | ||
2246 | + mtip_abort_cmd, dd); | ||
2247 | + | ||
2248 | + clear_bit(MTIP_PF_TO_ACTIVE_BIT, &dd->port->flags); | ||
2249 | + } | ||
2250 | + | ||
2251 | if (test_bit(MTIP_PF_ISSUE_CMDS_BIT, &port->flags)) { | ||
2252 | slot = 1; | ||
2253 | /* used to restrict the loop to one iteration */ | ||
2254 | @@ -2978,10 +3052,8 @@ restart_eh: | ||
2255 | } | ||
2256 | |||
2257 | if (test_bit(MTIP_PF_REBUILD_BIT, &port->flags)) { | ||
2258 | - if (mtip_ftl_rebuild_poll(dd) < 0) | ||
2259 | - set_bit(MTIP_DDF_REBUILD_FAILED_BIT, | ||
2260 | - &dd->dd_flag); | ||
2261 | - clear_bit(MTIP_PF_REBUILD_BIT, &port->flags); | ||
2262 | + if (mtip_ftl_rebuild_poll(dd) == 0) | ||
2263 | + clear_bit(MTIP_PF_REBUILD_BIT, &port->flags); | ||
2264 | } | ||
2265 | } | ||
2266 | |||
2267 | @@ -3096,7 +3168,7 @@ static int mtip_hw_get_identify(struct driver_data *dd) | ||
2268 | if (buf[288] == 0xBF) { | ||
2269 | dev_info(&dd->pdev->dev, | ||
2270 | "Drive indicates rebuild has failed.\n"); | ||
2271 | - /* TODO */ | ||
2272 | + set_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag); | ||
2273 | } | ||
2274 | } | ||
2275 | |||
2276 | @@ -3270,20 +3342,25 @@ out1: | ||
2277 | return rv; | ||
2278 | } | ||
2279 | |||
2280 | -static void mtip_standby_drive(struct driver_data *dd) | ||
2281 | +static int mtip_standby_drive(struct driver_data *dd) | ||
2282 | { | ||
2283 | - if (dd->sr) | ||
2284 | - return; | ||
2285 | + int rv = 0; | ||
2286 | |||
2287 | + if (dd->sr || !dd->port) | ||
2288 | + return -ENODEV; | ||
2289 | /* | ||
2290 | * Send standby immediate (E0h) to the drive so that it | ||
2291 | * saves its state. | ||
2292 | */ | ||
2293 | if (!test_bit(MTIP_PF_REBUILD_BIT, &dd->port->flags) && | ||
2294 | - !test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag)) | ||
2295 | - if (mtip_standby_immediate(dd->port)) | ||
2296 | + !test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag) && | ||
2297 | + !test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag)) { | ||
2298 | + rv = mtip_standby_immediate(dd->port); | ||
2299 | + if (rv) | ||
2300 | dev_warn(&dd->pdev->dev, | ||
2301 | "STANDBY IMMEDIATE failed\n"); | ||
2302 | + } | ||
2303 | + return rv; | ||
2304 | } | ||
2305 | |||
2306 | /* | ||
2307 | @@ -3296,10 +3373,6 @@ static void mtip_standby_drive(struct driver_data *dd) | ||
2308 | */ | ||
2309 | static int mtip_hw_exit(struct driver_data *dd) | ||
2310 | { | ||
2311 | - /* | ||
2312 | - * Send standby immediate (E0h) to the drive so that it | ||
2313 | - * saves its state. | ||
2314 | - */ | ||
2315 | if (!dd->sr) { | ||
2316 | /* de-initialize the port. */ | ||
2317 | mtip_deinit_port(dd->port); | ||
2318 | @@ -3341,8 +3414,7 @@ static int mtip_hw_shutdown(struct driver_data *dd) | ||
2319 | * Send standby immediate (E0h) to the drive so that it | ||
2320 | * saves its state. | ||
2321 | */ | ||
2322 | - if (!dd->sr && dd->port) | ||
2323 | - mtip_standby_immediate(dd->port); | ||
2324 | + mtip_standby_drive(dd); | ||
2325 | |||
2326 | return 0; | ||
2327 | } | ||
2328 | @@ -3365,7 +3437,7 @@ static int mtip_hw_suspend(struct driver_data *dd) | ||
2329 | * Send standby immediate (E0h) to the drive | ||
2330 | * so that it saves its state. | ||
2331 | */ | ||
2332 | - if (mtip_standby_immediate(dd->port) != 0) { | ||
2333 | + if (mtip_standby_drive(dd) != 0) { | ||
2334 | dev_err(&dd->pdev->dev, | ||
2335 | "Failed standby-immediate command\n"); | ||
2336 | return -EFAULT; | ||
2337 | @@ -3603,6 +3675,28 @@ static int mtip_block_getgeo(struct block_device *dev, | ||
2338 | return 0; | ||
2339 | } | ||
2340 | |||
2341 | +static int mtip_block_open(struct block_device *dev, fmode_t mode) | ||
2342 | +{ | ||
2343 | + struct driver_data *dd; | ||
2344 | + | ||
2345 | + if (dev && dev->bd_disk) { | ||
2346 | + dd = (struct driver_data *) dev->bd_disk->private_data; | ||
2347 | + | ||
2348 | + if (dd) { | ||
2349 | + if (test_bit(MTIP_DDF_REMOVAL_BIT, | ||
2350 | + &dd->dd_flag)) { | ||
2351 | + return -ENODEV; | ||
2352 | + } | ||
2353 | + return 0; | ||
2354 | + } | ||
2355 | + } | ||
2356 | + return -ENODEV; | ||
2357 | +} | ||
2358 | + | ||
2359 | +void mtip_block_release(struct gendisk *disk, fmode_t mode) | ||
2360 | +{ | ||
2361 | +} | ||
2362 | + | ||
2363 | /* | ||
2364 | * Block device operation function. | ||
2365 | * | ||
2366 | @@ -3610,6 +3704,8 @@ static int mtip_block_getgeo(struct block_device *dev, | ||
2367 | * layer. | ||
2368 | */ | ||
2369 | static const struct block_device_operations mtip_block_ops = { | ||
2370 | + .open = mtip_block_open, | ||
2371 | + .release = mtip_block_release, | ||
2372 | .ioctl = mtip_block_ioctl, | ||
2373 | #ifdef CONFIG_COMPAT | ||
2374 | .compat_ioctl = mtip_block_compat_ioctl, | ||
2375 | @@ -3671,10 +3767,9 @@ static int mtip_submit_request(struct blk_mq_hw_ctx *hctx, struct request *rq) | ||
2376 | rq_data_dir(rq))) { | ||
2377 | return -ENODATA; | ||
2378 | } | ||
2379 | - if (unlikely(test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag))) | ||
2380 | + if (unlikely(test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag) || | ||
2381 | + test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag))) | ||
2382 | return -ENODATA; | ||
2383 | - if (test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag)) | ||
2384 | - return -ENXIO; | ||
2385 | } | ||
2386 | |||
2387 | if (rq->cmd_flags & REQ_DISCARD) { | ||
2388 | @@ -3786,11 +3881,33 @@ static int mtip_init_cmd(void *data, struct request *rq, unsigned int hctx_idx, | ||
2389 | return 0; | ||
2390 | } | ||
2391 | |||
2392 | +static enum blk_eh_timer_return mtip_cmd_timeout(struct request *req, | ||
2393 | + bool reserved) | ||
2394 | +{ | ||
2395 | + struct driver_data *dd = req->q->queuedata; | ||
2396 | + int ret = BLK_EH_RESET_TIMER; | ||
2397 | + | ||
2398 | + if (reserved) | ||
2399 | + goto exit_handler; | ||
2400 | + | ||
2401 | + if (test_bit(req->tag, dd->port->cmds_to_issue)) | ||
2402 | + goto exit_handler; | ||
2403 | + | ||
2404 | + if (test_and_set_bit(MTIP_PF_TO_ACTIVE_BIT, &dd->port->flags)) | ||
2405 | + goto exit_handler; | ||
2406 | + | ||
2407 | + wake_up_interruptible(&dd->port->svc_wait); | ||
2408 | +exit_handler: | ||
2409 | + return ret; | ||
2410 | +} | ||
2411 | + | ||
2412 | static struct blk_mq_ops mtip_mq_ops = { | ||
2413 | .queue_rq = mtip_queue_rq, | ||
2414 | .map_queue = blk_mq_map_queue, | ||
2415 | .init_request = mtip_init_cmd, | ||
2416 | .exit_request = mtip_free_cmd, | ||
2417 | + .complete = mtip_softirq_done_fn, | ||
2418 | + .timeout = mtip_cmd_timeout, | ||
2419 | }; | ||
2420 | |||
2421 | /* | ||
2422 | @@ -3857,7 +3974,6 @@ static int mtip_block_initialize(struct driver_data *dd) | ||
2423 | |||
2424 | mtip_hw_debugfs_init(dd); | ||
2425 | |||
2426 | -skip_create_disk: | ||
2427 | memset(&dd->tags, 0, sizeof(dd->tags)); | ||
2428 | dd->tags.ops = &mtip_mq_ops; | ||
2429 | dd->tags.nr_hw_queues = 1; | ||
2430 | @@ -3867,12 +3983,13 @@ skip_create_disk: | ||
2431 | dd->tags.numa_node = dd->numa_node; | ||
2432 | dd->tags.flags = BLK_MQ_F_SHOULD_MERGE; | ||
2433 | dd->tags.driver_data = dd; | ||
2434 | + dd->tags.timeout = MTIP_NCQ_CMD_TIMEOUT_MS; | ||
2435 | |||
2436 | rv = blk_mq_alloc_tag_set(&dd->tags); | ||
2437 | if (rv) { | ||
2438 | dev_err(&dd->pdev->dev, | ||
2439 | "Unable to allocate request queue\n"); | ||
2440 | - goto block_queue_alloc_init_error; | ||
2441 | + goto block_queue_alloc_tag_error; | ||
2442 | } | ||
2443 | |||
2444 | /* Allocate the request queue. */ | ||
2445 | @@ -3887,6 +4004,7 @@ skip_create_disk: | ||
2446 | dd->disk->queue = dd->queue; | ||
2447 | dd->queue->queuedata = dd; | ||
2448 | |||
2449 | +skip_create_disk: | ||
2450 | /* Initialize the protocol layer. */ | ||
2451 | wait_for_rebuild = mtip_hw_get_identify(dd); | ||
2452 | if (wait_for_rebuild < 0) { | ||
2453 | @@ -3983,8 +4101,9 @@ kthread_run_error: | ||
2454 | read_capacity_error: | ||
2455 | init_hw_cmds_error: | ||
2456 | blk_cleanup_queue(dd->queue); | ||
2457 | - blk_mq_free_tag_set(&dd->tags); | ||
2458 | block_queue_alloc_init_error: | ||
2459 | + blk_mq_free_tag_set(&dd->tags); | ||
2460 | +block_queue_alloc_tag_error: | ||
2461 | mtip_hw_debugfs_exit(dd); | ||
2462 | disk_index_error: | ||
2463 | spin_lock(&rssd_index_lock); | ||
2464 | @@ -4001,6 +4120,22 @@ protocol_init_error: | ||
2465 | return rv; | ||
2466 | } | ||
2467 | |||
2468 | +static void mtip_no_dev_cleanup(struct request *rq, void *data, bool reserv) | ||
2469 | +{ | ||
2470 | + struct driver_data *dd = (struct driver_data *)data; | ||
2471 | + struct mtip_cmd *cmd; | ||
2472 | + | ||
2473 | + if (likely(!reserv)) | ||
2474 | + blk_mq_complete_request(rq, -ENODEV); | ||
2475 | + else if (test_bit(MTIP_PF_IC_ACTIVE_BIT, &dd->port->flags)) { | ||
2476 | + | ||
2477 | + cmd = mtip_cmd_from_tag(dd, MTIP_TAG_INTERNAL); | ||
2478 | + if (cmd->comp_func) | ||
2479 | + cmd->comp_func(dd->port, MTIP_TAG_INTERNAL, | ||
2480 | + cmd, -ENODEV); | ||
2481 | + } | ||
2482 | +} | ||
2483 | + | ||
2484 | /* | ||
2485 | * Block layer deinitialization function. | ||
2486 | * | ||
2487 | @@ -4032,12 +4167,23 @@ static int mtip_block_remove(struct driver_data *dd) | ||
2488 | } | ||
2489 | } | ||
2490 | |||
2491 | - if (!dd->sr) | ||
2492 | - mtip_standby_drive(dd); | ||
2493 | + if (!dd->sr) { | ||
2494 | + /* | ||
2495 | + * Explicitly wait here for IOs to quiesce, | ||
2496 | + * as mtip_standby_drive usually won't wait for IOs. | ||
2497 | + */ | ||
2498 | + if (!mtip_quiesce_io(dd->port, MTIP_QUIESCE_IO_TIMEOUT_MS, | ||
2499 | + GFP_KERNEL)) | ||
2500 | + mtip_standby_drive(dd); | ||
2501 | + } | ||
2502 | else | ||
2503 | dev_info(&dd->pdev->dev, "device %s surprise removal\n", | ||
2504 | dd->disk->disk_name); | ||
2505 | |||
2506 | + blk_mq_freeze_queue_start(dd->queue); | ||
2507 | + blk_mq_stop_hw_queues(dd->queue); | ||
2508 | + blk_mq_all_tag_busy_iter(dd->tags.tags[0], mtip_no_dev_cleanup, dd); | ||
2509 | + | ||
2510 | /* | ||
2511 | * Delete our gendisk structure. This also removes the device | ||
2512 | * from /dev | ||
2513 | @@ -4047,7 +4193,8 @@ static int mtip_block_remove(struct driver_data *dd) | ||
2514 | dd->bdev = NULL; | ||
2515 | } | ||
2516 | if (dd->disk) { | ||
2517 | - del_gendisk(dd->disk); | ||
2518 | + if (test_bit(MTIP_DDF_INIT_DONE_BIT, &dd->dd_flag)) | ||
2519 | + del_gendisk(dd->disk); | ||
2520 | if (dd->disk->queue) { | ||
2521 | blk_cleanup_queue(dd->queue); | ||
2522 | blk_mq_free_tag_set(&dd->tags); | ||
2523 | @@ -4088,7 +4235,8 @@ static int mtip_block_shutdown(struct driver_data *dd) | ||
2524 | dev_info(&dd->pdev->dev, | ||
2525 | "Shutting down %s ...\n", dd->disk->disk_name); | ||
2526 | |||
2527 | - del_gendisk(dd->disk); | ||
2528 | + if (test_bit(MTIP_DDF_INIT_DONE_BIT, &dd->dd_flag)) | ||
2529 | + del_gendisk(dd->disk); | ||
2530 | if (dd->disk->queue) { | ||
2531 | blk_cleanup_queue(dd->queue); | ||
2532 | blk_mq_free_tag_set(&dd->tags); | ||
2533 | @@ -4433,7 +4581,7 @@ static void mtip_pci_remove(struct pci_dev *pdev) | ||
2534 | struct driver_data *dd = pci_get_drvdata(pdev); | ||
2535 | unsigned long flags, to; | ||
2536 | |||
2537 | - set_bit(MTIP_DDF_REMOVE_PENDING_BIT, &dd->dd_flag); | ||
2538 | + set_bit(MTIP_DDF_REMOVAL_BIT, &dd->dd_flag); | ||
2539 | |||
2540 | spin_lock_irqsave(&dev_lock, flags); | ||
2541 | list_del_init(&dd->online_list); | ||
2542 | @@ -4450,12 +4598,17 @@ static void mtip_pci_remove(struct pci_dev *pdev) | ||
2543 | } while (atomic_read(&dd->irq_workers_active) != 0 && | ||
2544 | time_before(jiffies, to)); | ||
2545 | |||
2546 | + if (!dd->sr) | ||
2547 | + fsync_bdev(dd->bdev); | ||
2548 | + | ||
2549 | if (atomic_read(&dd->irq_workers_active) != 0) { | ||
2550 | dev_warn(&dd->pdev->dev, | ||
2551 | "Completion workers still active!\n"); | ||
2552 | } | ||
2553 | |||
2554 | - blk_mq_stop_hw_queues(dd->queue); | ||
2555 | + blk_set_queue_dying(dd->queue); | ||
2556 | + set_bit(MTIP_DDF_REMOVE_PENDING_BIT, &dd->dd_flag); | ||
2557 | + | ||
2558 | /* Clean up the block layer. */ | ||
2559 | mtip_block_remove(dd); | ||
2560 | |||
2561 | diff --git a/drivers/block/mtip32xx/mtip32xx.h b/drivers/block/mtip32xx/mtip32xx.h | ||
2562 | index 3274784008eb..7617888f7944 100644 | ||
2563 | --- a/drivers/block/mtip32xx/mtip32xx.h | ||
2564 | +++ b/drivers/block/mtip32xx/mtip32xx.h | ||
2565 | @@ -134,16 +134,24 @@ enum { | ||
2566 | MTIP_PF_EH_ACTIVE_BIT = 1, /* error handling */ | ||
2567 | MTIP_PF_SE_ACTIVE_BIT = 2, /* secure erase */ | ||
2568 | MTIP_PF_DM_ACTIVE_BIT = 3, /* download microcde */ | ||
2569 | + MTIP_PF_TO_ACTIVE_BIT = 9, /* timeout handling */ | ||
2570 | MTIP_PF_PAUSE_IO = ((1 << MTIP_PF_IC_ACTIVE_BIT) | | ||
2571 | (1 << MTIP_PF_EH_ACTIVE_BIT) | | ||
2572 | (1 << MTIP_PF_SE_ACTIVE_BIT) | | ||
2573 | - (1 << MTIP_PF_DM_ACTIVE_BIT)), | ||
2574 | + (1 << MTIP_PF_DM_ACTIVE_BIT) | | ||
2575 | + (1 << MTIP_PF_TO_ACTIVE_BIT)), | ||
2576 | |||
2577 | MTIP_PF_SVC_THD_ACTIVE_BIT = 4, | ||
2578 | MTIP_PF_ISSUE_CMDS_BIT = 5, | ||
2579 | MTIP_PF_REBUILD_BIT = 6, | ||
2580 | MTIP_PF_SVC_THD_STOP_BIT = 8, | ||
2581 | |||
2582 | + MTIP_PF_SVC_THD_WORK = ((1 << MTIP_PF_EH_ACTIVE_BIT) | | ||
2583 | + (1 << MTIP_PF_ISSUE_CMDS_BIT) | | ||
2584 | + (1 << MTIP_PF_REBUILD_BIT) | | ||
2585 | + (1 << MTIP_PF_SVC_THD_STOP_BIT) | | ||
2586 | + (1 << MTIP_PF_TO_ACTIVE_BIT)), | ||
2587 | + | ||
2588 | /* below are bit numbers in 'dd_flag' defined in driver_data */ | ||
2589 | MTIP_DDF_SEC_LOCK_BIT = 0, | ||
2590 | MTIP_DDF_REMOVE_PENDING_BIT = 1, | ||
2591 | @@ -153,6 +161,7 @@ enum { | ||
2592 | MTIP_DDF_RESUME_BIT = 6, | ||
2593 | MTIP_DDF_INIT_DONE_BIT = 7, | ||
2594 | MTIP_DDF_REBUILD_FAILED_BIT = 8, | ||
2595 | + MTIP_DDF_REMOVAL_BIT = 9, | ||
2596 | |||
2597 | MTIP_DDF_STOP_IO = ((1 << MTIP_DDF_REMOVE_PENDING_BIT) | | ||
2598 | (1 << MTIP_DDF_SEC_LOCK_BIT) | | ||
2599 | diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c | ||
2600 | index fa893c3ec408..0beaa52df66b 100644 | ||
2601 | --- a/drivers/bluetooth/ath3k.c | ||
2602 | +++ b/drivers/bluetooth/ath3k.c | ||
2603 | @@ -82,6 +82,7 @@ static const struct usb_device_id ath3k_table[] = { | ||
2604 | { USB_DEVICE(0x0489, 0xe05f) }, | ||
2605 | { USB_DEVICE(0x0489, 0xe076) }, | ||
2606 | { USB_DEVICE(0x0489, 0xe078) }, | ||
2607 | + { USB_DEVICE(0x0489, 0xe095) }, | ||
2608 | { USB_DEVICE(0x04c5, 0x1330) }, | ||
2609 | { USB_DEVICE(0x04CA, 0x3004) }, | ||
2610 | { USB_DEVICE(0x04CA, 0x3005) }, | ||
2611 | @@ -92,6 +93,7 @@ static const struct usb_device_id ath3k_table[] = { | ||
2612 | { USB_DEVICE(0x04CA, 0x300d) }, | ||
2613 | { USB_DEVICE(0x04CA, 0x300f) }, | ||
2614 | { USB_DEVICE(0x04CA, 0x3010) }, | ||
2615 | + { USB_DEVICE(0x04CA, 0x3014) }, | ||
2616 | { USB_DEVICE(0x0930, 0x0219) }, | ||
2617 | { USB_DEVICE(0x0930, 0x021c) }, | ||
2618 | { USB_DEVICE(0x0930, 0x0220) }, | ||
2619 | @@ -113,10 +115,12 @@ static const struct usb_device_id ath3k_table[] = { | ||
2620 | { USB_DEVICE(0x13d3, 0x3362) }, | ||
2621 | { USB_DEVICE(0x13d3, 0x3375) }, | ||
2622 | { USB_DEVICE(0x13d3, 0x3393) }, | ||
2623 | + { USB_DEVICE(0x13d3, 0x3395) }, | ||
2624 | { USB_DEVICE(0x13d3, 0x3402) }, | ||
2625 | { USB_DEVICE(0x13d3, 0x3408) }, | ||
2626 | { USB_DEVICE(0x13d3, 0x3423) }, | ||
2627 | { USB_DEVICE(0x13d3, 0x3432) }, | ||
2628 | + { USB_DEVICE(0x13d3, 0x3472) }, | ||
2629 | { USB_DEVICE(0x13d3, 0x3474) }, | ||
2630 | |||
2631 | /* Atheros AR5BBU12 with sflash firmware */ | ||
2632 | @@ -144,6 +148,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { | ||
2633 | { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, | ||
2634 | { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, | ||
2635 | { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, | ||
2636 | + { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 }, | ||
2637 | { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, | ||
2638 | { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, | ||
2639 | { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 }, | ||
2640 | @@ -154,6 +159,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { | ||
2641 | { USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 }, | ||
2642 | { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 }, | ||
2643 | { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 }, | ||
2644 | + { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 }, | ||
2645 | { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 }, | ||
2646 | { USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 }, | ||
2647 | { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 }, | ||
2648 | @@ -175,10 +181,12 @@ static const struct usb_device_id ath3k_blist_tbl[] = { | ||
2649 | { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, | ||
2650 | { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, | ||
2651 | { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 }, | ||
2652 | + { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 }, | ||
2653 | { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 }, | ||
2654 | { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, | ||
2655 | { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, | ||
2656 | { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, | ||
2657 | + { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 }, | ||
2658 | { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, | ||
2659 | |||
2660 | /* Atheros AR5BBU22 with sflash firmware */ | ||
2661 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c | ||
2662 | index 968897108c76..79107597a594 100644 | ||
2663 | --- a/drivers/bluetooth/btusb.c | ||
2664 | +++ b/drivers/bluetooth/btusb.c | ||
2665 | @@ -196,6 +196,7 @@ static const struct usb_device_id blacklist_table[] = { | ||
2666 | { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, | ||
2667 | { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, | ||
2668 | { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, | ||
2669 | + { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 }, | ||
2670 | { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, | ||
2671 | { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, | ||
2672 | { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 }, | ||
2673 | @@ -206,6 +207,7 @@ static const struct usb_device_id blacklist_table[] = { | ||
2674 | { USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 }, | ||
2675 | { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 }, | ||
2676 | { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 }, | ||
2677 | + { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 }, | ||
2678 | { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 }, | ||
2679 | { USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 }, | ||
2680 | { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 }, | ||
2681 | @@ -227,10 +229,12 @@ static const struct usb_device_id blacklist_table[] = { | ||
2682 | { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, | ||
2683 | { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, | ||
2684 | { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 }, | ||
2685 | + { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 }, | ||
2686 | { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 }, | ||
2687 | { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, | ||
2688 | { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, | ||
2689 | { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, | ||
2690 | + { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 }, | ||
2691 | { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, | ||
2692 | |||
2693 | /* Atheros AR5BBU12 with sflash firmware */ | ||
2694 | diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c | ||
2695 | index 45cc39aabeee..252142524ff2 100644 | ||
2696 | --- a/drivers/char/tpm/tpm-chip.c | ||
2697 | +++ b/drivers/char/tpm/tpm-chip.c | ||
2698 | @@ -136,11 +136,13 @@ struct tpm_chip *tpmm_chip_alloc(struct device *dev, | ||
2699 | chip->cdev.owner = chip->pdev->driver->owner; | ||
2700 | chip->cdev.kobj.parent = &chip->dev.kobj; | ||
2701 | |||
2702 | + devm_add_action(dev, (void (*)(void *)) put_device, &chip->dev); | ||
2703 | + | ||
2704 | return chip; | ||
2705 | } | ||
2706 | EXPORT_SYMBOL_GPL(tpmm_chip_alloc); | ||
2707 | |||
2708 | -static int tpm_dev_add_device(struct tpm_chip *chip) | ||
2709 | +static int tpm_add_char_device(struct tpm_chip *chip) | ||
2710 | { | ||
2711 | int rc; | ||
2712 | |||
2713 | @@ -151,7 +153,6 @@ static int tpm_dev_add_device(struct tpm_chip *chip) | ||
2714 | chip->devname, MAJOR(chip->dev.devt), | ||
2715 | MINOR(chip->dev.devt), rc); | ||
2716 | |||
2717 | - device_unregister(&chip->dev); | ||
2718 | return rc; | ||
2719 | } | ||
2720 | |||
2721 | @@ -162,16 +163,17 @@ static int tpm_dev_add_device(struct tpm_chip *chip) | ||
2722 | chip->devname, MAJOR(chip->dev.devt), | ||
2723 | MINOR(chip->dev.devt), rc); | ||
2724 | |||
2725 | + cdev_del(&chip->cdev); | ||
2726 | return rc; | ||
2727 | } | ||
2728 | |||
2729 | return rc; | ||
2730 | } | ||
2731 | |||
2732 | -static void tpm_dev_del_device(struct tpm_chip *chip) | ||
2733 | +static void tpm_del_char_device(struct tpm_chip *chip) | ||
2734 | { | ||
2735 | cdev_del(&chip->cdev); | ||
2736 | - device_unregister(&chip->dev); | ||
2737 | + device_del(&chip->dev); | ||
2738 | } | ||
2739 | |||
2740 | static int tpm1_chip_register(struct tpm_chip *chip) | ||
2741 | @@ -222,7 +224,7 @@ int tpm_chip_register(struct tpm_chip *chip) | ||
2742 | |||
2743 | tpm_add_ppi(chip); | ||
2744 | |||
2745 | - rc = tpm_dev_add_device(chip); | ||
2746 | + rc = tpm_add_char_device(chip); | ||
2747 | if (rc) | ||
2748 | goto out_err; | ||
2749 | |||
2750 | @@ -274,6 +276,6 @@ void tpm_chip_unregister(struct tpm_chip *chip) | ||
2751 | sysfs_remove_link(&chip->pdev->kobj, "ppi"); | ||
2752 | |||
2753 | tpm1_chip_unregister(chip); | ||
2754 | - tpm_dev_del_device(chip); | ||
2755 | + tpm_del_char_device(chip); | ||
2756 | } | ||
2757 | EXPORT_SYMBOL_GPL(tpm_chip_unregister); | ||
2758 | diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c | ||
2759 | index 4bb9727c1047..61e64293b765 100644 | ||
2760 | --- a/drivers/char/tpm/tpm_crb.c | ||
2761 | +++ b/drivers/char/tpm/tpm_crb.c | ||
2762 | @@ -310,11 +310,11 @@ static int crb_acpi_remove(struct acpi_device *device) | ||
2763 | struct device *dev = &device->dev; | ||
2764 | struct tpm_chip *chip = dev_get_drvdata(dev); | ||
2765 | |||
2766 | - tpm_chip_unregister(chip); | ||
2767 | - | ||
2768 | if (chip->flags & TPM_CHIP_FLAG_TPM2) | ||
2769 | tpm2_shutdown(chip, TPM2_SU_CLEAR); | ||
2770 | |||
2771 | + tpm_chip_unregister(chip); | ||
2772 | + | ||
2773 | return 0; | ||
2774 | } | ||
2775 | |||
2776 | diff --git a/drivers/char/tpm/tpm_eventlog.c b/drivers/char/tpm/tpm_eventlog.c | ||
2777 | index bd72fb04225e..4e6940acf639 100644 | ||
2778 | --- a/drivers/char/tpm/tpm_eventlog.c | ||
2779 | +++ b/drivers/char/tpm/tpm_eventlog.c | ||
2780 | @@ -232,7 +232,7 @@ static int tpm_binary_bios_measurements_show(struct seq_file *m, void *v) | ||
2781 | { | ||
2782 | struct tcpa_event *event = v; | ||
2783 | struct tcpa_event temp_event; | ||
2784 | - char *tempPtr; | ||
2785 | + char *temp_ptr; | ||
2786 | int i; | ||
2787 | |||
2788 | memcpy(&temp_event, event, sizeof(struct tcpa_event)); | ||
2789 | @@ -242,10 +242,16 @@ static int tpm_binary_bios_measurements_show(struct seq_file *m, void *v) | ||
2790 | temp_event.event_type = do_endian_conversion(event->event_type); | ||
2791 | temp_event.event_size = do_endian_conversion(event->event_size); | ||
2792 | |||
2793 | - tempPtr = (char *)&temp_event; | ||
2794 | + temp_ptr = (char *) &temp_event; | ||
2795 | |||
2796 | - for (i = 0; i < sizeof(struct tcpa_event) + temp_event.event_size; i++) | ||
2797 | - seq_putc(m, tempPtr[i]); | ||
2798 | + for (i = 0; i < (sizeof(struct tcpa_event) - 1) ; i++) | ||
2799 | + seq_putc(m, temp_ptr[i]); | ||
2800 | + | ||
2801 | + temp_ptr = (char *) v; | ||
2802 | + | ||
2803 | + for (i = (sizeof(struct tcpa_event) - 1); | ||
2804 | + i < (sizeof(struct tcpa_event) + temp_event.event_size); i++) | ||
2805 | + seq_putc(m, temp_ptr[i]); | ||
2806 | |||
2807 | return 0; | ||
2808 | |||
2809 | diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c | ||
2810 | index 39bf5820297e..4f9830c1b121 100644 | ||
2811 | --- a/drivers/clk/bcm/clk-bcm2835.c | ||
2812 | +++ b/drivers/clk/bcm/clk-bcm2835.c | ||
2813 | @@ -1097,13 +1097,15 @@ static int bcm2835_pll_divider_set_rate(struct clk_hw *hw, | ||
2814 | struct bcm2835_pll_divider *divider = bcm2835_pll_divider_from_hw(hw); | ||
2815 | struct bcm2835_cprman *cprman = divider->cprman; | ||
2816 | const struct bcm2835_pll_divider_data *data = divider->data; | ||
2817 | - u32 cm; | ||
2818 | - int ret; | ||
2819 | + u32 cm, div, max_div = 1 << A2W_PLL_DIV_BITS; | ||
2820 | |||
2821 | - ret = clk_divider_ops.set_rate(hw, rate, parent_rate); | ||
2822 | - if (ret) | ||
2823 | - return ret; | ||
2824 | + div = DIV_ROUND_UP_ULL(parent_rate, rate); | ||
2825 | + | ||
2826 | + div = min(div, max_div); | ||
2827 | + if (div == max_div) | ||
2828 | + div = 0; | ||
2829 | |||
2830 | + cprman_write(cprman, data->a2w_reg, div); | ||
2831 | cm = cprman_read(cprman, data->cm_reg); | ||
2832 | cprman_write(cprman, data->cm_reg, cm | data->load_mask); | ||
2833 | cprman_write(cprman, data->cm_reg, cm & ~data->load_mask); | ||
2834 | diff --git a/drivers/clk/rockchip/clk-rk3188.c b/drivers/clk/rockchip/clk-rk3188.c | ||
2835 | index abb47608713b..fe728f8dcbe4 100644 | ||
2836 | --- a/drivers/clk/rockchip/clk-rk3188.c | ||
2837 | +++ b/drivers/clk/rockchip/clk-rk3188.c | ||
2838 | @@ -718,6 +718,7 @@ static const char *const rk3188_critical_clocks[] __initconst = { | ||
2839 | "hclk_peri", | ||
2840 | "pclk_cpu", | ||
2841 | "pclk_peri", | ||
2842 | + "hclk_cpubus" | ||
2843 | }; | ||
2844 | |||
2845 | static void __init rk3188_common_clk_init(struct device_node *np) | ||
2846 | diff --git a/drivers/clk/rockchip/clk-rk3368.c b/drivers/clk/rockchip/clk-rk3368.c | ||
2847 | index 7e6b783e6eee..1b148694b633 100644 | ||
2848 | --- a/drivers/clk/rockchip/clk-rk3368.c | ||
2849 | +++ b/drivers/clk/rockchip/clk-rk3368.c | ||
2850 | @@ -165,7 +165,7 @@ static const struct rockchip_cpuclk_reg_data rk3368_cpuclkb_data = { | ||
2851 | .core_reg = RK3368_CLKSEL_CON(0), | ||
2852 | .div_core_shift = 0, | ||
2853 | .div_core_mask = 0x1f, | ||
2854 | - .mux_core_shift = 15, | ||
2855 | + .mux_core_shift = 7, | ||
2856 | }; | ||
2857 | |||
2858 | static const struct rockchip_cpuclk_reg_data rk3368_cpuclkl_data = { | ||
2859 | @@ -218,29 +218,29 @@ static const struct rockchip_cpuclk_reg_data rk3368_cpuclkl_data = { | ||
2860 | } | ||
2861 | |||
2862 | static struct rockchip_cpuclk_rate_table rk3368_cpuclkb_rates[] __initdata = { | ||
2863 | - RK3368_CPUCLKB_RATE(1512000000, 2, 6, 6), | ||
2864 | - RK3368_CPUCLKB_RATE(1488000000, 2, 5, 5), | ||
2865 | - RK3368_CPUCLKB_RATE(1416000000, 2, 5, 5), | ||
2866 | - RK3368_CPUCLKB_RATE(1200000000, 2, 4, 4), | ||
2867 | - RK3368_CPUCLKB_RATE(1008000000, 2, 4, 4), | ||
2868 | - RK3368_CPUCLKB_RATE( 816000000, 2, 3, 3), | ||
2869 | - RK3368_CPUCLKB_RATE( 696000000, 2, 3, 3), | ||
2870 | - RK3368_CPUCLKB_RATE( 600000000, 2, 2, 2), | ||
2871 | - RK3368_CPUCLKB_RATE( 408000000, 2, 2, 2), | ||
2872 | - RK3368_CPUCLKB_RATE( 312000000, 2, 2, 2), | ||
2873 | + RK3368_CPUCLKB_RATE(1512000000, 1, 5, 5), | ||
2874 | + RK3368_CPUCLKB_RATE(1488000000, 1, 4, 4), | ||
2875 | + RK3368_CPUCLKB_RATE(1416000000, 1, 4, 4), | ||
2876 | + RK3368_CPUCLKB_RATE(1200000000, 1, 3, 3), | ||
2877 | + RK3368_CPUCLKB_RATE(1008000000, 1, 3, 3), | ||
2878 | + RK3368_CPUCLKB_RATE( 816000000, 1, 2, 2), | ||
2879 | + RK3368_CPUCLKB_RATE( 696000000, 1, 2, 2), | ||
2880 | + RK3368_CPUCLKB_RATE( 600000000, 1, 1, 1), | ||
2881 | + RK3368_CPUCLKB_RATE( 408000000, 1, 1, 1), | ||
2882 | + RK3368_CPUCLKB_RATE( 312000000, 1, 1, 1), | ||
2883 | }; | ||
2884 | |||
2885 | static struct rockchip_cpuclk_rate_table rk3368_cpuclkl_rates[] __initdata = { | ||
2886 | - RK3368_CPUCLKL_RATE(1512000000, 2, 7, 7), | ||
2887 | - RK3368_CPUCLKL_RATE(1488000000, 2, 6, 6), | ||
2888 | - RK3368_CPUCLKL_RATE(1416000000, 2, 6, 6), | ||
2889 | - RK3368_CPUCLKL_RATE(1200000000, 2, 5, 5), | ||
2890 | - RK3368_CPUCLKL_RATE(1008000000, 2, 5, 5), | ||
2891 | - RK3368_CPUCLKL_RATE( 816000000, 2, 4, 4), | ||
2892 | - RK3368_CPUCLKL_RATE( 696000000, 2, 3, 3), | ||
2893 | - RK3368_CPUCLKL_RATE( 600000000, 2, 3, 3), | ||
2894 | - RK3368_CPUCLKL_RATE( 408000000, 2, 2, 2), | ||
2895 | - RK3368_CPUCLKL_RATE( 312000000, 2, 2, 2), | ||
2896 | + RK3368_CPUCLKL_RATE(1512000000, 1, 6, 6), | ||
2897 | + RK3368_CPUCLKL_RATE(1488000000, 1, 5, 5), | ||
2898 | + RK3368_CPUCLKL_RATE(1416000000, 1, 5, 5), | ||
2899 | + RK3368_CPUCLKL_RATE(1200000000, 1, 4, 4), | ||
2900 | + RK3368_CPUCLKL_RATE(1008000000, 1, 4, 4), | ||
2901 | + RK3368_CPUCLKL_RATE( 816000000, 1, 3, 3), | ||
2902 | + RK3368_CPUCLKL_RATE( 696000000, 1, 2, 2), | ||
2903 | + RK3368_CPUCLKL_RATE( 600000000, 1, 2, 2), | ||
2904 | + RK3368_CPUCLKL_RATE( 408000000, 1, 1, 1), | ||
2905 | + RK3368_CPUCLKL_RATE( 312000000, 1, 1, 1), | ||
2906 | }; | ||
2907 | |||
2908 | static struct rockchip_clk_branch rk3368_clk_branches[] __initdata = { | ||
2909 | @@ -384,10 +384,10 @@ static struct rockchip_clk_branch rk3368_clk_branches[] __initdata = { | ||
2910 | * Clock-Architecture Diagram 3 | ||
2911 | */ | ||
2912 | |||
2913 | - COMPOSITE(0, "aclk_vepu", mux_pll_src_cpll_gpll_usb_p, 0, | ||
2914 | + COMPOSITE(0, "aclk_vepu", mux_pll_src_cpll_gpll_npll_usb_p, 0, | ||
2915 | RK3368_CLKSEL_CON(15), 6, 2, MFLAGS, 0, 5, DFLAGS, | ||
2916 | RK3368_CLKGATE_CON(4), 6, GFLAGS), | ||
2917 | - COMPOSITE(0, "aclk_vdpu", mux_pll_src_cpll_gpll_usb_p, 0, | ||
2918 | + COMPOSITE(0, "aclk_vdpu", mux_pll_src_cpll_gpll_npll_usb_p, 0, | ||
2919 | RK3368_CLKSEL_CON(15), 14, 2, MFLAGS, 8, 5, DFLAGS, | ||
2920 | RK3368_CLKGATE_CON(4), 7, GFLAGS), | ||
2921 | |||
2922 | @@ -442,7 +442,7 @@ static struct rockchip_clk_branch rk3368_clk_branches[] __initdata = { | ||
2923 | GATE(SCLK_HDMI_HDCP, "sclk_hdmi_hdcp", "xin24m", 0, | ||
2924 | RK3368_CLKGATE_CON(4), 13, GFLAGS), | ||
2925 | GATE(SCLK_HDMI_CEC, "sclk_hdmi_cec", "xin32k", 0, | ||
2926 | - RK3368_CLKGATE_CON(5), 12, GFLAGS), | ||
2927 | + RK3368_CLKGATE_CON(4), 12, GFLAGS), | ||
2928 | |||
2929 | COMPOSITE_NODIV(0, "vip_src", mux_pll_src_cpll_gpll_p, 0, | ||
2930 | RK3368_CLKSEL_CON(21), 15, 1, MFLAGS, | ||
2931 | diff --git a/drivers/crypto/atmel-aes.c b/drivers/crypto/atmel-aes.c | ||
2932 | index fb16d812c8f5..1dffb13e5c2f 100644 | ||
2933 | --- a/drivers/crypto/atmel-aes.c | ||
2934 | +++ b/drivers/crypto/atmel-aes.c | ||
2935 | @@ -1396,9 +1396,9 @@ static int atmel_aes_probe(struct platform_device *pdev) | ||
2936 | } | ||
2937 | |||
2938 | aes_dd->io_base = devm_ioremap_resource(&pdev->dev, aes_res); | ||
2939 | - if (!aes_dd->io_base) { | ||
2940 | + if (IS_ERR(aes_dd->io_base)) { | ||
2941 | dev_err(dev, "can't ioremap\n"); | ||
2942 | - err = -ENOMEM; | ||
2943 | + err = PTR_ERR(aes_dd->io_base); | ||
2944 | goto res_err; | ||
2945 | } | ||
2946 | |||
2947 | diff --git a/drivers/crypto/atmel-sha.c b/drivers/crypto/atmel-sha.c | ||
2948 | index 3178f84d2757..0dadb6332f0e 100644 | ||
2949 | --- a/drivers/crypto/atmel-sha.c | ||
2950 | +++ b/drivers/crypto/atmel-sha.c | ||
2951 | @@ -1405,9 +1405,9 @@ static int atmel_sha_probe(struct platform_device *pdev) | ||
2952 | } | ||
2953 | |||
2954 | sha_dd->io_base = devm_ioremap_resource(&pdev->dev, sha_res); | ||
2955 | - if (!sha_dd->io_base) { | ||
2956 | + if (IS_ERR(sha_dd->io_base)) { | ||
2957 | dev_err(dev, "can't ioremap\n"); | ||
2958 | - err = -ENOMEM; | ||
2959 | + err = PTR_ERR(sha_dd->io_base); | ||
2960 | goto res_err; | ||
2961 | } | ||
2962 | |||
2963 | diff --git a/drivers/crypto/atmel-tdes.c b/drivers/crypto/atmel-tdes.c | ||
2964 | index 2c7a628d0375..bf467d7be35c 100644 | ||
2965 | --- a/drivers/crypto/atmel-tdes.c | ||
2966 | +++ b/drivers/crypto/atmel-tdes.c | ||
2967 | @@ -1417,9 +1417,9 @@ static int atmel_tdes_probe(struct platform_device *pdev) | ||
2968 | } | ||
2969 | |||
2970 | tdes_dd->io_base = devm_ioremap_resource(&pdev->dev, tdes_res); | ||
2971 | - if (!tdes_dd->io_base) { | ||
2972 | + if (IS_ERR(tdes_dd->io_base)) { | ||
2973 | dev_err(dev, "can't ioremap\n"); | ||
2974 | - err = -ENOMEM; | ||
2975 | + err = PTR_ERR(tdes_dd->io_base); | ||
2976 | goto res_err; | ||
2977 | } | ||
2978 | |||
2979 | diff --git a/drivers/crypto/ccp/ccp-crypto-aes-cmac.c b/drivers/crypto/ccp/ccp-crypto-aes-cmac.c | ||
2980 | index d89f20c04266..3d9acc53d247 100644 | ||
2981 | --- a/drivers/crypto/ccp/ccp-crypto-aes-cmac.c | ||
2982 | +++ b/drivers/crypto/ccp/ccp-crypto-aes-cmac.c | ||
2983 | @@ -220,6 +220,39 @@ static int ccp_aes_cmac_digest(struct ahash_request *req) | ||
2984 | return ccp_aes_cmac_finup(req); | ||
2985 | } | ||
2986 | |||
2987 | +static int ccp_aes_cmac_export(struct ahash_request *req, void *out) | ||
2988 | +{ | ||
2989 | + struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req); | ||
2990 | + struct ccp_aes_cmac_exp_ctx state; | ||
2991 | + | ||
2992 | + state.null_msg = rctx->null_msg; | ||
2993 | + memcpy(state.iv, rctx->iv, sizeof(state.iv)); | ||
2994 | + state.buf_count = rctx->buf_count; | ||
2995 | + memcpy(state.buf, rctx->buf, sizeof(state.buf)); | ||
2996 | + | ||
2997 | + /* 'out' may not be aligned so memcpy from local variable */ | ||
2998 | + memcpy(out, &state, sizeof(state)); | ||
2999 | + | ||
3000 | + return 0; | ||
3001 | +} | ||
3002 | + | ||
3003 | +static int ccp_aes_cmac_import(struct ahash_request *req, const void *in) | ||
3004 | +{ | ||
3005 | + struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req); | ||
3006 | + struct ccp_aes_cmac_exp_ctx state; | ||
3007 | + | ||
3008 | + /* 'in' may not be aligned so memcpy to local variable */ | ||
3009 | + memcpy(&state, in, sizeof(state)); | ||
3010 | + | ||
3011 | + memset(rctx, 0, sizeof(*rctx)); | ||
3012 | + rctx->null_msg = state.null_msg; | ||
3013 | + memcpy(rctx->iv, state.iv, sizeof(rctx->iv)); | ||
3014 | + rctx->buf_count = state.buf_count; | ||
3015 | + memcpy(rctx->buf, state.buf, sizeof(rctx->buf)); | ||
3016 | + | ||
3017 | + return 0; | ||
3018 | +} | ||
3019 | + | ||
3020 | static int ccp_aes_cmac_setkey(struct crypto_ahash *tfm, const u8 *key, | ||
3021 | unsigned int key_len) | ||
3022 | { | ||
3023 | @@ -352,10 +385,13 @@ int ccp_register_aes_cmac_algs(struct list_head *head) | ||
3024 | alg->final = ccp_aes_cmac_final; | ||
3025 | alg->finup = ccp_aes_cmac_finup; | ||
3026 | alg->digest = ccp_aes_cmac_digest; | ||
3027 | + alg->export = ccp_aes_cmac_export; | ||
3028 | + alg->import = ccp_aes_cmac_import; | ||
3029 | alg->setkey = ccp_aes_cmac_setkey; | ||
3030 | |||
3031 | halg = &alg->halg; | ||
3032 | halg->digestsize = AES_BLOCK_SIZE; | ||
3033 | + halg->statesize = sizeof(struct ccp_aes_cmac_exp_ctx); | ||
3034 | |||
3035 | base = &halg->base; | ||
3036 | snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "cmac(aes)"); | ||
3037 | diff --git a/drivers/crypto/ccp/ccp-crypto-sha.c b/drivers/crypto/ccp/ccp-crypto-sha.c | ||
3038 | index d14b3f28e010..8ef06fad8b14 100644 | ||
3039 | --- a/drivers/crypto/ccp/ccp-crypto-sha.c | ||
3040 | +++ b/drivers/crypto/ccp/ccp-crypto-sha.c | ||
3041 | @@ -207,6 +207,43 @@ static int ccp_sha_digest(struct ahash_request *req) | ||
3042 | return ccp_sha_finup(req); | ||
3043 | } | ||
3044 | |||
3045 | +static int ccp_sha_export(struct ahash_request *req, void *out) | ||
3046 | +{ | ||
3047 | + struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req); | ||
3048 | + struct ccp_sha_exp_ctx state; | ||
3049 | + | ||
3050 | + state.type = rctx->type; | ||
3051 | + state.msg_bits = rctx->msg_bits; | ||
3052 | + state.first = rctx->first; | ||
3053 | + memcpy(state.ctx, rctx->ctx, sizeof(state.ctx)); | ||
3054 | + state.buf_count = rctx->buf_count; | ||
3055 | + memcpy(state.buf, rctx->buf, sizeof(state.buf)); | ||
3056 | + | ||
3057 | + /* 'out' may not be aligned so memcpy from local variable */ | ||
3058 | + memcpy(out, &state, sizeof(state)); | ||
3059 | + | ||
3060 | + return 0; | ||
3061 | +} | ||
3062 | + | ||
3063 | +static int ccp_sha_import(struct ahash_request *req, const void *in) | ||
3064 | +{ | ||
3065 | + struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req); | ||
3066 | + struct ccp_sha_exp_ctx state; | ||
3067 | + | ||
3068 | + /* 'in' may not be aligned so memcpy to local variable */ | ||
3069 | + memcpy(&state, in, sizeof(state)); | ||
3070 | + | ||
3071 | + memset(rctx, 0, sizeof(*rctx)); | ||
3072 | + rctx->type = state.type; | ||
3073 | + rctx->msg_bits = state.msg_bits; | ||
3074 | + rctx->first = state.first; | ||
3075 | + memcpy(rctx->ctx, state.ctx, sizeof(rctx->ctx)); | ||
3076 | + rctx->buf_count = state.buf_count; | ||
3077 | + memcpy(rctx->buf, state.buf, sizeof(rctx->buf)); | ||
3078 | + | ||
3079 | + return 0; | ||
3080 | +} | ||
3081 | + | ||
3082 | static int ccp_sha_setkey(struct crypto_ahash *tfm, const u8 *key, | ||
3083 | unsigned int key_len) | ||
3084 | { | ||
3085 | @@ -403,9 +440,12 @@ static int ccp_register_sha_alg(struct list_head *head, | ||
3086 | alg->final = ccp_sha_final; | ||
3087 | alg->finup = ccp_sha_finup; | ||
3088 | alg->digest = ccp_sha_digest; | ||
3089 | + alg->export = ccp_sha_export; | ||
3090 | + alg->import = ccp_sha_import; | ||
3091 | |||
3092 | halg = &alg->halg; | ||
3093 | halg->digestsize = def->digest_size; | ||
3094 | + halg->statesize = sizeof(struct ccp_sha_exp_ctx); | ||
3095 | |||
3096 | base = &halg->base; | ||
3097 | snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", def->name); | ||
3098 | diff --git a/drivers/crypto/ccp/ccp-crypto.h b/drivers/crypto/ccp/ccp-crypto.h | ||
3099 | index 76a96f0f44c6..a326ec20bfa8 100644 | ||
3100 | --- a/drivers/crypto/ccp/ccp-crypto.h | ||
3101 | +++ b/drivers/crypto/ccp/ccp-crypto.h | ||
3102 | @@ -129,6 +129,15 @@ struct ccp_aes_cmac_req_ctx { | ||
3103 | struct ccp_cmd cmd; | ||
3104 | }; | ||
3105 | |||
3106 | +struct ccp_aes_cmac_exp_ctx { | ||
3107 | + unsigned int null_msg; | ||
3108 | + | ||
3109 | + u8 iv[AES_BLOCK_SIZE]; | ||
3110 | + | ||
3111 | + unsigned int buf_count; | ||
3112 | + u8 buf[AES_BLOCK_SIZE]; | ||
3113 | +}; | ||
3114 | + | ||
3115 | /***** SHA related defines *****/ | ||
3116 | #define MAX_SHA_CONTEXT_SIZE SHA256_DIGEST_SIZE | ||
3117 | #define MAX_SHA_BLOCK_SIZE SHA256_BLOCK_SIZE | ||
3118 | @@ -171,6 +180,19 @@ struct ccp_sha_req_ctx { | ||
3119 | struct ccp_cmd cmd; | ||
3120 | }; | ||
3121 | |||
3122 | +struct ccp_sha_exp_ctx { | ||
3123 | + enum ccp_sha_type type; | ||
3124 | + | ||
3125 | + u64 msg_bits; | ||
3126 | + | ||
3127 | + unsigned int first; | ||
3128 | + | ||
3129 | + u8 ctx[MAX_SHA_CONTEXT_SIZE]; | ||
3130 | + | ||
3131 | + unsigned int buf_count; | ||
3132 | + u8 buf[MAX_SHA_BLOCK_SIZE]; | ||
3133 | +}; | ||
3134 | + | ||
3135 | /***** Common Context Structure *****/ | ||
3136 | struct ccp_ctx { | ||
3137 | int (*complete)(struct crypto_async_request *req, int ret); | ||
3138 | diff --git a/drivers/crypto/marvell/cesa.c b/drivers/crypto/marvell/cesa.c | ||
3139 | index c0656e7f37b5..80239ae69527 100644 | ||
3140 | --- a/drivers/crypto/marvell/cesa.c | ||
3141 | +++ b/drivers/crypto/marvell/cesa.c | ||
3142 | @@ -420,7 +420,7 @@ static int mv_cesa_probe(struct platform_device *pdev) | ||
3143 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs"); | ||
3144 | cesa->regs = devm_ioremap_resource(dev, res); | ||
3145 | if (IS_ERR(cesa->regs)) | ||
3146 | - return -ENOMEM; | ||
3147 | + return PTR_ERR(cesa->regs); | ||
3148 | |||
3149 | ret = mv_cesa_dev_dma_init(cesa); | ||
3150 | if (ret) | ||
3151 | diff --git a/drivers/crypto/ux500/cryp/cryp_core.c b/drivers/crypto/ux500/cryp/cryp_core.c | ||
3152 | index 4c243c1ffc7f..790f7cadc1ed 100644 | ||
3153 | --- a/drivers/crypto/ux500/cryp/cryp_core.c | ||
3154 | +++ b/drivers/crypto/ux500/cryp/cryp_core.c | ||
3155 | @@ -1440,9 +1440,9 @@ static int ux500_cryp_probe(struct platform_device *pdev) | ||
3156 | |||
3157 | device_data->phybase = res->start; | ||
3158 | device_data->base = devm_ioremap_resource(dev, res); | ||
3159 | - if (!device_data->base) { | ||
3160 | + if (IS_ERR(device_data->base)) { | ||
3161 | dev_err(dev, "[%s]: ioremap failed!", __func__); | ||
3162 | - ret = -ENOMEM; | ||
3163 | + ret = PTR_ERR(device_data->base); | ||
3164 | goto out; | ||
3165 | } | ||
3166 | |||
3167 | diff --git a/drivers/crypto/ux500/hash/hash_core.c b/drivers/crypto/ux500/hash/hash_core.c | ||
3168 | index f47d112041b2..66b1c3313e2e 100644 | ||
3169 | --- a/drivers/crypto/ux500/hash/hash_core.c | ||
3170 | +++ b/drivers/crypto/ux500/hash/hash_core.c | ||
3171 | @@ -1675,9 +1675,9 @@ static int ux500_hash_probe(struct platform_device *pdev) | ||
3172 | |||
3173 | device_data->phybase = res->start; | ||
3174 | device_data->base = devm_ioremap_resource(dev, res); | ||
3175 | - if (!device_data->base) { | ||
3176 | + if (IS_ERR(device_data->base)) { | ||
3177 | dev_err(dev, "%s: ioremap() failed!\n", __func__); | ||
3178 | - ret = -ENOMEM; | ||
3179 | + ret = PTR_ERR(device_data->base); | ||
3180 | goto out; | ||
3181 | } | ||
3182 | spin_lock_init(&device_data->ctx_lock); | ||
3183 | diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c | ||
3184 | index 9eee13ef83a5..d87a47547ba5 100644 | ||
3185 | --- a/drivers/edac/amd64_edac.c | ||
3186 | +++ b/drivers/edac/amd64_edac.c | ||
3187 | @@ -1452,7 +1452,7 @@ static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range, | ||
3188 | u64 chan_off; | ||
3189 | u64 dram_base = get_dram_base(pvt, range); | ||
3190 | u64 hole_off = f10_dhar_offset(pvt); | ||
3191 | - u64 dct_sel_base_off = (pvt->dct_sel_hi & 0xFFFFFC00) << 16; | ||
3192 | + u64 dct_sel_base_off = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16; | ||
3193 | |||
3194 | if (hi_rng) { | ||
3195 | /* | ||
3196 | diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c | ||
3197 | index 429309c62699..cbee3179ec08 100644 | ||
3198 | --- a/drivers/edac/sb_edac.c | ||
3199 | +++ b/drivers/edac/sb_edac.c | ||
3200 | @@ -1117,8 +1117,8 @@ static void get_memory_layout(const struct mem_ctl_info *mci) | ||
3201 | edac_dbg(0, "TAD#%d: up to %u.%03u GB (0x%016Lx), socket interleave %d, memory interleave %d, TGT: %d, %d, %d, %d, reg=0x%08x\n", | ||
3202 | n_tads, gb, (mb*1000)/1024, | ||
3203 | ((u64)tmp_mb) << 20L, | ||
3204 | - (u32)TAD_SOCK(reg), | ||
3205 | - (u32)TAD_CH(reg), | ||
3206 | + (u32)(1 << TAD_SOCK(reg)), | ||
3207 | + (u32)TAD_CH(reg) + 1, | ||
3208 | (u32)TAD_TGT0(reg), | ||
3209 | (u32)TAD_TGT1(reg), | ||
3210 | (u32)TAD_TGT2(reg), | ||
3211 | @@ -1396,7 +1396,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci, | ||
3212 | } | ||
3213 | |||
3214 | ch_way = TAD_CH(reg) + 1; | ||
3215 | - sck_way = TAD_SOCK(reg) + 1; | ||
3216 | + sck_way = 1 << TAD_SOCK(reg); | ||
3217 | |||
3218 | if (ch_way == 3) | ||
3219 | idx = addr >> 6; | ||
3220 | @@ -1453,7 +1453,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci, | ||
3221 | n_tads, | ||
3222 | addr, | ||
3223 | limit, | ||
3224 | - (u32)TAD_SOCK(reg), | ||
3225 | + sck_way, | ||
3226 | ch_way, | ||
3227 | offset, | ||
3228 | idx, | ||
3229 | @@ -1468,18 +1468,12 @@ static int get_memory_error_data(struct mem_ctl_info *mci, | ||
3230 | offset, addr); | ||
3231 | return -EINVAL; | ||
3232 | } | ||
3233 | - addr -= offset; | ||
3234 | - /* Store the low bits [0:6] of the addr */ | ||
3235 | - ch_addr = addr & 0x7f; | ||
3236 | - /* Remove socket wayness and remove 6 bits */ | ||
3237 | - addr >>= 6; | ||
3238 | - addr = div_u64(addr, sck_xch); | ||
3239 | -#if 0 | ||
3240 | - /* Divide by channel way */ | ||
3241 | - addr = addr / ch_way; | ||
3242 | -#endif | ||
3243 | - /* Recover the last 6 bits */ | ||
3244 | - ch_addr |= addr << 6; | ||
3245 | + | ||
3246 | + ch_addr = addr - offset; | ||
3247 | + ch_addr >>= (6 + shiftup); | ||
3248 | + ch_addr /= ch_way * sck_way; | ||
3249 | + ch_addr <<= (6 + shiftup); | ||
3250 | + ch_addr |= addr & ((1 << (6 + shiftup)) - 1); | ||
3251 | |||
3252 | /* | ||
3253 | * Step 3) Decode rank | ||
3254 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c | ||
3255 | index 5a8fbadbd27b..8ac49812a716 100644 | ||
3256 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c | ||
3257 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c | ||
3258 | @@ -63,6 +63,10 @@ bool amdgpu_has_atpx(void) { | ||
3259 | return amdgpu_atpx_priv.atpx_detected; | ||
3260 | } | ||
3261 | |||
3262 | +bool amdgpu_has_atpx_dgpu_power_cntl(void) { | ||
3263 | + return amdgpu_atpx_priv.atpx.functions.power_cntl; | ||
3264 | +} | ||
3265 | + | ||
3266 | /** | ||
3267 | * amdgpu_atpx_call - call an ATPX method | ||
3268 | * | ||
3269 | @@ -142,10 +146,6 @@ static void amdgpu_atpx_parse_functions(struct amdgpu_atpx_functions *f, u32 mas | ||
3270 | */ | ||
3271 | static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx) | ||
3272 | { | ||
3273 | - /* make sure required functions are enabled */ | ||
3274 | - /* dGPU power control is required */ | ||
3275 | - atpx->functions.power_cntl = true; | ||
3276 | - | ||
3277 | if (atpx->functions.px_params) { | ||
3278 | union acpi_object *info; | ||
3279 | struct atpx_px_params output; | ||
3280 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | ||
3281 | index c961fe093e12..9d88023df836 100644 | ||
3282 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | ||
3283 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | ||
3284 | @@ -61,6 +61,12 @@ static const char *amdgpu_asic_name[] = { | ||
3285 | "LAST", | ||
3286 | }; | ||
3287 | |||
3288 | +#if defined(CONFIG_VGA_SWITCHEROO) | ||
3289 | +bool amdgpu_has_atpx_dgpu_power_cntl(void); | ||
3290 | +#else | ||
3291 | +static inline bool amdgpu_has_atpx_dgpu_power_cntl(void) { return false; } | ||
3292 | +#endif | ||
3293 | + | ||
3294 | bool amdgpu_device_is_px(struct drm_device *dev) | ||
3295 | { | ||
3296 | struct amdgpu_device *adev = dev->dev_private; | ||
3297 | @@ -1469,7 +1475,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, | ||
3298 | |||
3299 | if (amdgpu_runtime_pm == 1) | ||
3300 | runtime = true; | ||
3301 | - if (amdgpu_device_is_px(ddev)) | ||
3302 | + if (amdgpu_device_is_px(ddev) && amdgpu_has_atpx_dgpu_power_cntl()) | ||
3303 | runtime = true; | ||
3304 | vga_switcheroo_register_client(adev->pdev, &amdgpu_switcheroo_ops, runtime); | ||
3305 | if (runtime) | ||
3306 | diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | ||
3307 | index 2cf50180cc51..b1c7a9b3631b 100644 | ||
3308 | --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | ||
3309 | +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | ||
3310 | @@ -32,8 +32,8 @@ | ||
3311 | #include "oss/oss_2_4_d.h" | ||
3312 | #include "oss/oss_2_4_sh_mask.h" | ||
3313 | |||
3314 | -#include "gmc/gmc_8_1_d.h" | ||
3315 | -#include "gmc/gmc_8_1_sh_mask.h" | ||
3316 | +#include "gmc/gmc_7_1_d.h" | ||
3317 | +#include "gmc/gmc_7_1_sh_mask.h" | ||
3318 | |||
3319 | #include "gca/gfx_8_0_d.h" | ||
3320 | #include "gca/gfx_8_0_enum.h" | ||
3321 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
3322 | index bb292143997e..adf74f4366bb 100644 | ||
3323 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c | ||
3324 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
3325 | @@ -892,8 +892,6 @@ atombios_dig_encoder_setup2(struct drm_encoder *encoder, int action, int panel_m | ||
3326 | else | ||
3327 | args.v1.ucLaneNum = 4; | ||
3328 | |||
3329 | - if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000)) | ||
3330 | - args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; | ||
3331 | switch (radeon_encoder->encoder_id) { | ||
3332 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: | ||
3333 | args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1; | ||
3334 | @@ -910,6 +908,10 @@ atombios_dig_encoder_setup2(struct drm_encoder *encoder, int action, int panel_m | ||
3335 | args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKB; | ||
3336 | else | ||
3337 | args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKA; | ||
3338 | + | ||
3339 | + if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000)) | ||
3340 | + args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; | ||
3341 | + | ||
3342 | break; | ||
3343 | case 2: | ||
3344 | case 3: | ||
3345 | diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | ||
3346 | index c4b4f298a283..9bc408c9f9f6 100644 | ||
3347 | --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c | ||
3348 | +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | ||
3349 | @@ -62,6 +62,10 @@ bool radeon_has_atpx(void) { | ||
3350 | return radeon_atpx_priv.atpx_detected; | ||
3351 | } | ||
3352 | |||
3353 | +bool radeon_has_atpx_dgpu_power_cntl(void) { | ||
3354 | + return radeon_atpx_priv.atpx.functions.power_cntl; | ||
3355 | +} | ||
3356 | + | ||
3357 | /** | ||
3358 | * radeon_atpx_call - call an ATPX method | ||
3359 | * | ||
3360 | @@ -141,10 +145,6 @@ static void radeon_atpx_parse_functions(struct radeon_atpx_functions *f, u32 mas | ||
3361 | */ | ||
3362 | static int radeon_atpx_validate(struct radeon_atpx *atpx) | ||
3363 | { | ||
3364 | - /* make sure required functions are enabled */ | ||
3365 | - /* dGPU power control is required */ | ||
3366 | - atpx->functions.power_cntl = true; | ||
3367 | - | ||
3368 | if (atpx->functions.px_params) { | ||
3369 | union acpi_object *info; | ||
3370 | struct atpx_px_params output; | ||
3371 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c | ||
3372 | index c566993a2ec3..f78f111e68de 100644 | ||
3373 | --- a/drivers/gpu/drm/radeon/radeon_device.c | ||
3374 | +++ b/drivers/gpu/drm/radeon/radeon_device.c | ||
3375 | @@ -103,6 +103,12 @@ static const char radeon_family_name[][16] = { | ||
3376 | "LAST", | ||
3377 | }; | ||
3378 | |||
3379 | +#if defined(CONFIG_VGA_SWITCHEROO) | ||
3380 | +bool radeon_has_atpx_dgpu_power_cntl(void); | ||
3381 | +#else | ||
3382 | +static inline bool radeon_has_atpx_dgpu_power_cntl(void) { return false; } | ||
3383 | +#endif | ||
3384 | + | ||
3385 | #define RADEON_PX_QUIRK_DISABLE_PX (1 << 0) | ||
3386 | #define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1) | ||
3387 | |||
3388 | @@ -1433,7 +1439,7 @@ int radeon_device_init(struct radeon_device *rdev, | ||
3389 | * ignore it */ | ||
3390 | vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); | ||
3391 | |||
3392 | - if (rdev->flags & RADEON_IS_PX) | ||
3393 | + if ((rdev->flags & RADEON_IS_PX) && radeon_has_atpx_dgpu_power_cntl()) | ||
3394 | runtime = true; | ||
3395 | vga_switcheroo_register_client(rdev->pdev, &radeon_switcheroo_ops, runtime); | ||
3396 | if (runtime) | ||
3397 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c | ||
3398 | index c6f7a694f67a..ec791e169f8f 100644 | ||
3399 | --- a/drivers/hid/hid-core.c | ||
3400 | +++ b/drivers/hid/hid-core.c | ||
3401 | @@ -1897,6 +1897,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | ||
3402 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD) }, | ||
3403 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) }, | ||
3404 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) }, | ||
3405 | + { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DUAL_ACTION) }, | ||
3406 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) }, | ||
3407 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD) }, | ||
3408 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) }, | ||
3409 | @@ -2615,9 +2616,10 @@ int hid_add_device(struct hid_device *hdev) | ||
3410 | /* | ||
3411 | * Scan generic devices for group information | ||
3412 | */ | ||
3413 | - if (hid_ignore_special_drivers || | ||
3414 | - (!hdev->group && | ||
3415 | - !hid_match_id(hdev, hid_have_special_driver))) { | ||
3416 | + if (hid_ignore_special_drivers) { | ||
3417 | + hdev->group = HID_GROUP_GENERIC; | ||
3418 | + } else if (!hdev->group && | ||
3419 | + !hid_match_id(hdev, hid_have_special_driver)) { | ||
3420 | ret = hid_scan_report(hdev); | ||
3421 | if (ret) | ||
3422 | hid_warn(hdev, "bad device descriptor (%d)\n", ret); | ||
3423 | diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c | ||
3424 | index 2b8ff18d3713..c5ec4f915594 100644 | ||
3425 | --- a/drivers/hid/hid-multitouch.c | ||
3426 | +++ b/drivers/hid/hid-multitouch.c | ||
3427 | @@ -396,6 +396,11 @@ static void mt_feature_mapping(struct hid_device *hdev, | ||
3428 | td->is_buttonpad = true; | ||
3429 | |||
3430 | break; | ||
3431 | + case 0xff0000c5: | ||
3432 | + /* Retrieve the Win8 blob once to enable some devices */ | ||
3433 | + if (usage->usage_index == 0) | ||
3434 | + mt_get_feature(hdev, field->report); | ||
3435 | + break; | ||
3436 | } | ||
3437 | } | ||
3438 | |||
3439 | diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c | ||
3440 | index 10bd8e6e4c9c..0b80633bae91 100644 | ||
3441 | --- a/drivers/hid/i2c-hid/i2c-hid.c | ||
3442 | +++ b/drivers/hid/i2c-hid/i2c-hid.c | ||
3443 | @@ -282,17 +282,21 @@ static int i2c_hid_set_or_send_report(struct i2c_client *client, u8 reportType, | ||
3444 | u16 dataRegister = le16_to_cpu(ihid->hdesc.wDataRegister); | ||
3445 | u16 outputRegister = le16_to_cpu(ihid->hdesc.wOutputRegister); | ||
3446 | u16 maxOutputLength = le16_to_cpu(ihid->hdesc.wMaxOutputLength); | ||
3447 | + u16 size; | ||
3448 | + int args_len; | ||
3449 | + int index = 0; | ||
3450 | + | ||
3451 | + i2c_hid_dbg(ihid, "%s\n", __func__); | ||
3452 | + | ||
3453 | + if (data_len > ihid->bufsize) | ||
3454 | + return -EINVAL; | ||
3455 | |||
3456 | - /* hid_hw_* already checked that data_len < HID_MAX_BUFFER_SIZE */ | ||
3457 | - u16 size = 2 /* size */ + | ||
3458 | + size = 2 /* size */ + | ||
3459 | (reportID ? 1 : 0) /* reportID */ + | ||
3460 | data_len /* buf */; | ||
3461 | - int args_len = (reportID >= 0x0F ? 1 : 0) /* optional third byte */ + | ||
3462 | + args_len = (reportID >= 0x0F ? 1 : 0) /* optional third byte */ + | ||
3463 | 2 /* dataRegister */ + | ||
3464 | size /* args */; | ||
3465 | - int index = 0; | ||
3466 | - | ||
3467 | - i2c_hid_dbg(ihid, "%s\n", __func__); | ||
3468 | |||
3469 | if (!use_data && maxOutputLength == 0) | ||
3470 | return -ENOSYS; | ||
3471 | diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c | ||
3472 | index cd4510a63375..146eed70bdf4 100644 | ||
3473 | --- a/drivers/idle/intel_idle.c | ||
3474 | +++ b/drivers/idle/intel_idle.c | ||
3475 | @@ -65,7 +65,7 @@ | ||
3476 | #include <asm/mwait.h> | ||
3477 | #include <asm/msr.h> | ||
3478 | |||
3479 | -#define INTEL_IDLE_VERSION "0.4" | ||
3480 | +#define INTEL_IDLE_VERSION "0.4.1" | ||
3481 | #define PREFIX "intel_idle: " | ||
3482 | |||
3483 | static struct cpuidle_driver intel_idle_driver = { | ||
3484 | @@ -994,36 +994,92 @@ static void intel_idle_cpuidle_devices_uninit(void) | ||
3485 | } | ||
3486 | |||
3487 | /* | ||
3488 | - * intel_idle_state_table_update() | ||
3489 | - * | ||
3490 | - * Update the default state_table for this CPU-id | ||
3491 | + * ivt_idle_state_table_update(void) | ||
3492 | * | ||
3493 | - * Currently used to access tuned IVT multi-socket targets | ||
3494 | + * Tune IVT multi-socket targets | ||
3495 | * Assumption: num_sockets == (max_package_num + 1) | ||
3496 | */ | ||
3497 | -void intel_idle_state_table_update(void) | ||
3498 | +static void ivt_idle_state_table_update(void) | ||
3499 | { | ||
3500 | /* IVT uses a different table for 1-2, 3-4, and > 4 sockets */ | ||
3501 | - if (boot_cpu_data.x86_model == 0x3e) { /* IVT */ | ||
3502 | - int cpu, package_num, num_sockets = 1; | ||
3503 | - | ||
3504 | - for_each_online_cpu(cpu) { | ||
3505 | - package_num = topology_physical_package_id(cpu); | ||
3506 | - if (package_num + 1 > num_sockets) { | ||
3507 | - num_sockets = package_num + 1; | ||
3508 | - | ||
3509 | - if (num_sockets > 4) { | ||
3510 | - cpuidle_state_table = ivt_cstates_8s; | ||
3511 | - return; | ||
3512 | - } | ||
3513 | + int cpu, package_num, num_sockets = 1; | ||
3514 | + | ||
3515 | + for_each_online_cpu(cpu) { | ||
3516 | + package_num = topology_physical_package_id(cpu); | ||
3517 | + if (package_num + 1 > num_sockets) { | ||
3518 | + num_sockets = package_num + 1; | ||
3519 | + | ||
3520 | + if (num_sockets > 4) { | ||
3521 | + cpuidle_state_table = ivt_cstates_8s; | ||
3522 | + return; | ||
3523 | } | ||
3524 | } | ||
3525 | + } | ||
3526 | + | ||
3527 | + if (num_sockets > 2) | ||
3528 | + cpuidle_state_table = ivt_cstates_4s; | ||
3529 | + | ||
3530 | + /* else, 1 and 2 socket systems use default ivt_cstates */ | ||
3531 | +} | ||
3532 | +/* | ||
3533 | + * sklh_idle_state_table_update(void) | ||
3534 | + * | ||
3535 | + * On SKL-H (model 0x5e) disable C8 and C9 if: | ||
3536 | + * C10 is enabled and SGX disabled | ||
3537 | + */ | ||
3538 | +static void sklh_idle_state_table_update(void) | ||
3539 | +{ | ||
3540 | + unsigned long long msr; | ||
3541 | + unsigned int eax, ebx, ecx, edx; | ||
3542 | + | ||
3543 | + | ||
3544 | + /* if PC10 disabled via cmdline intel_idle.max_cstate=7 or shallower */ | ||
3545 | + if (max_cstate <= 7) | ||
3546 | + return; | ||
3547 | + | ||
3548 | + /* if PC10 not present in CPUID.MWAIT.EDX */ | ||
3549 | + if ((mwait_substates & (0xF << 28)) == 0) | ||
3550 | + return; | ||
3551 | + | ||
3552 | + rdmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr); | ||
3553 | + | ||
3554 | + /* PC10 is not enabled in PKG C-state limit */ | ||
3555 | + if ((msr & 0xF) != 8) | ||
3556 | + return; | ||
3557 | + | ||
3558 | + ecx = 0; | ||
3559 | + cpuid(7, &eax, &ebx, &ecx, &edx); | ||
3560 | + | ||
3561 | + /* if SGX is present */ | ||
3562 | + if (ebx & (1 << 2)) { | ||
3563 | |||
3564 | - if (num_sockets > 2) | ||
3565 | - cpuidle_state_table = ivt_cstates_4s; | ||
3566 | - /* else, 1 and 2 socket systems use default ivt_cstates */ | ||
3567 | + rdmsrl(MSR_IA32_FEATURE_CONTROL, msr); | ||
3568 | + | ||
3569 | + /* if SGX is enabled */ | ||
3570 | + if (msr & (1 << 18)) | ||
3571 | + return; | ||
3572 | + } | ||
3573 | + | ||
3574 | + skl_cstates[5].disabled = 1; /* C8-SKL */ | ||
3575 | + skl_cstates[6].disabled = 1; /* C9-SKL */ | ||
3576 | +} | ||
3577 | +/* | ||
3578 | + * intel_idle_state_table_update() | ||
3579 | + * | ||
3580 | + * Update the default state_table for this CPU-id | ||
3581 | + */ | ||
3582 | + | ||
3583 | +static void intel_idle_state_table_update(void) | ||
3584 | +{ | ||
3585 | + switch (boot_cpu_data.x86_model) { | ||
3586 | + | ||
3587 | + case 0x3e: /* IVT */ | ||
3588 | + ivt_idle_state_table_update(); | ||
3589 | + break; | ||
3590 | + case 0x5e: /* SKL-H */ | ||
3591 | + sklh_idle_state_table_update(); | ||
3592 | + break; | ||
3593 | } | ||
3594 | - return; | ||
3595 | } | ||
3596 | |||
3597 | /* | ||
3598 | @@ -1063,6 +1119,14 @@ static int __init intel_idle_cpuidle_driver_init(void) | ||
3599 | if (num_substates == 0) | ||
3600 | continue; | ||
3601 | |||
3602 | + /* if state marked as disabled, skip it */ | ||
3603 | + if (cpuidle_state_table[cstate].disabled != 0) { | ||
3604 | + pr_debug(PREFIX "state %s is disabled", | ||
3605 | + cpuidle_state_table[cstate].name); | ||
3606 | + continue; | ||
3607 | + } | ||
3608 | + | ||
3609 | + | ||
3610 | if (((mwait_cstate + 1) > 2) && | ||
3611 | !boot_cpu_has(X86_FEATURE_NONSTOP_TSC)) | ||
3612 | mark_tsc_unstable("TSC halts in idle" | ||
3613 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | ||
3614 | index f357ca67a41c..87799de90a1d 100644 | ||
3615 | --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | ||
3616 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | ||
3617 | @@ -456,7 +456,10 @@ out_locked: | ||
3618 | return status; | ||
3619 | } | ||
3620 | |||
3621 | -static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast) | ||
3622 | +/* | ||
3623 | + * Caller must hold 'priv->lock' | ||
3624 | + */ | ||
3625 | +static int ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast) | ||
3626 | { | ||
3627 | struct ipoib_dev_priv *priv = netdev_priv(dev); | ||
3628 | struct ib_sa_multicast *multicast; | ||
3629 | @@ -466,6 +469,10 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast) | ||
3630 | ib_sa_comp_mask comp_mask; | ||
3631 | int ret = 0; | ||
3632 | |||
3633 | + if (!priv->broadcast || | ||
3634 | + !test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)) | ||
3635 | + return -EINVAL; | ||
3636 | + | ||
3637 | ipoib_dbg_mcast(priv, "joining MGID %pI6\n", mcast->mcmember.mgid.raw); | ||
3638 | |||
3639 | rec.mgid = mcast->mcmember.mgid; | ||
3640 | @@ -525,20 +532,23 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast) | ||
3641 | rec.join_state = 4; | ||
3642 | #endif | ||
3643 | } | ||
3644 | + spin_unlock_irq(&priv->lock); | ||
3645 | |||
3646 | multicast = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, priv->port, | ||
3647 | &rec, comp_mask, GFP_KERNEL, | ||
3648 | ipoib_mcast_join_complete, mcast); | ||
3649 | + spin_lock_irq(&priv->lock); | ||
3650 | if (IS_ERR(multicast)) { | ||
3651 | ret = PTR_ERR(multicast); | ||
3652 | ipoib_warn(priv, "ib_sa_join_multicast failed, status %d\n", ret); | ||
3653 | - spin_lock_irq(&priv->lock); | ||
3654 | /* Requeue this join task with a backoff delay */ | ||
3655 | __ipoib_mcast_schedule_join_thread(priv, mcast, 1); | ||
3656 | clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | ||
3657 | spin_unlock_irq(&priv->lock); | ||
3658 | complete(&mcast->done); | ||
3659 | + spin_lock_irq(&priv->lock); | ||
3660 | } | ||
3661 | + return 0; | ||
3662 | } | ||
3663 | |||
3664 | void ipoib_mcast_join_task(struct work_struct *work) | ||
3665 | @@ -620,9 +630,10 @@ void ipoib_mcast_join_task(struct work_struct *work) | ||
3666 | /* Found the next unjoined group */ | ||
3667 | init_completion(&mcast->done); | ||
3668 | set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | ||
3669 | - spin_unlock_irq(&priv->lock); | ||
3670 | - ipoib_mcast_join(dev, mcast); | ||
3671 | - spin_lock_irq(&priv->lock); | ||
3672 | + if (ipoib_mcast_join(dev, mcast)) { | ||
3673 | + spin_unlock_irq(&priv->lock); | ||
3674 | + return; | ||
3675 | + } | ||
3676 | } else if (!delay_until || | ||
3677 | time_before(mcast->delay_until, delay_until)) | ||
3678 | delay_until = mcast->delay_until; | ||
3679 | @@ -641,10 +652,9 @@ out: | ||
3680 | if (mcast) { | ||
3681 | init_completion(&mcast->done); | ||
3682 | set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | ||
3683 | + ipoib_mcast_join(dev, mcast); | ||
3684 | } | ||
3685 | spin_unlock_irq(&priv->lock); | ||
3686 | - if (mcast) | ||
3687 | - ipoib_mcast_join(dev, mcast); | ||
3688 | } | ||
3689 | |||
3690 | int ipoib_mcast_start_thread(struct net_device *dev) | ||
3691 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c | ||
3692 | index 8a51c3b5d657..b0edb66a291b 100644 | ||
3693 | --- a/drivers/infiniband/ulp/isert/ib_isert.c | ||
3694 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c | ||
3695 | @@ -66,6 +66,7 @@ isert_rdma_accept(struct isert_conn *isert_conn); | ||
3696 | struct rdma_cm_id *isert_setup_id(struct isert_np *isert_np); | ||
3697 | |||
3698 | static void isert_release_work(struct work_struct *work); | ||
3699 | +static void isert_wait4flush(struct isert_conn *isert_conn); | ||
3700 | |||
3701 | static inline bool | ||
3702 | isert_prot_cmd(struct isert_conn *conn, struct se_cmd *cmd) | ||
3703 | @@ -815,12 +816,31 @@ isert_put_conn(struct isert_conn *isert_conn) | ||
3704 | kref_put(&isert_conn->kref, isert_release_kref); | ||
3705 | } | ||
3706 | |||
3707 | +static void | ||
3708 | +isert_handle_unbound_conn(struct isert_conn *isert_conn) | ||
3709 | +{ | ||
3710 | + struct isert_np *isert_np = isert_conn->cm_id->context; | ||
3711 | + | ||
3712 | + mutex_lock(&isert_np->mutex); | ||
3713 | + if (!list_empty(&isert_conn->node)) { | ||
3714 | + /* | ||
3715 | + * This means iscsi doesn't know this connection | ||
3716 | + * so schedule a cleanup ourselves | ||
3717 | + */ | ||
3718 | + list_del_init(&isert_conn->node); | ||
3719 | + isert_put_conn(isert_conn); | ||
3720 | + complete(&isert_conn->wait); | ||
3721 | + queue_work(isert_release_wq, &isert_conn->release_work); | ||
3722 | + } | ||
3723 | + mutex_unlock(&isert_np->mutex); | ||
3724 | +} | ||
3725 | + | ||
3726 | /** | ||
3727 | * isert_conn_terminate() - Initiate connection termination | ||
3728 | * @isert_conn: isert connection struct | ||
3729 | * | ||
3730 | * Notes: | ||
3731 | - * In case the connection state is FULL_FEATURE, move state | ||
3732 | + * In case the connection state is BOUND, move state | ||
3733 | * to TEMINATING and start teardown sequence (rdma_disconnect). | ||
3734 | * In case the connection state is UP, complete flush as well. | ||
3735 | * | ||
3736 | @@ -832,23 +852,19 @@ isert_conn_terminate(struct isert_conn *isert_conn) | ||
3737 | { | ||
3738 | int err; | ||
3739 | |||
3740 | - switch (isert_conn->state) { | ||
3741 | - case ISER_CONN_TERMINATING: | ||
3742 | - break; | ||
3743 | - case ISER_CONN_UP: | ||
3744 | - case ISER_CONN_FULL_FEATURE: /* FALLTHRU */ | ||
3745 | - isert_info("Terminating conn %p state %d\n", | ||
3746 | - isert_conn, isert_conn->state); | ||
3747 | - isert_conn->state = ISER_CONN_TERMINATING; | ||
3748 | - err = rdma_disconnect(isert_conn->cm_id); | ||
3749 | - if (err) | ||
3750 | - isert_warn("Failed rdma_disconnect isert_conn %p\n", | ||
3751 | - isert_conn); | ||
3752 | - break; | ||
3753 | - default: | ||
3754 | - isert_warn("conn %p teminating in state %d\n", | ||
3755 | - isert_conn, isert_conn->state); | ||
3756 | - } | ||
3757 | + if (isert_conn->state >= ISER_CONN_TERMINATING) | ||
3758 | + return; | ||
3759 | + | ||
3760 | + isert_info("Terminating conn %p state %d\n", | ||
3761 | + isert_conn, isert_conn->state); | ||
3762 | + isert_conn->state = ISER_CONN_TERMINATING; | ||
3763 | + err = rdma_disconnect(isert_conn->cm_id); | ||
3764 | + if (err) | ||
3765 | + isert_warn("Failed rdma_disconnect isert_conn %p\n", | ||
3766 | + isert_conn); | ||
3767 | + | ||
3768 | + isert_info("conn %p completing wait\n", isert_conn); | ||
3769 | + complete(&isert_conn->wait); | ||
3770 | } | ||
3771 | |||
3772 | static int | ||
3773 | @@ -882,35 +898,27 @@ static int | ||
3774 | isert_disconnected_handler(struct rdma_cm_id *cma_id, | ||
3775 | enum rdma_cm_event_type event) | ||
3776 | { | ||
3777 | - struct isert_np *isert_np = cma_id->context; | ||
3778 | - struct isert_conn *isert_conn; | ||
3779 | - bool terminating = false; | ||
3780 | - | ||
3781 | - if (isert_np->cm_id == cma_id) | ||
3782 | - return isert_np_cma_handler(cma_id->context, event); | ||
3783 | - | ||
3784 | - isert_conn = cma_id->qp->qp_context; | ||
3785 | + struct isert_conn *isert_conn = cma_id->qp->qp_context; | ||
3786 | |||
3787 | mutex_lock(&isert_conn->mutex); | ||
3788 | - terminating = (isert_conn->state == ISER_CONN_TERMINATING); | ||
3789 | - isert_conn_terminate(isert_conn); | ||
3790 | - mutex_unlock(&isert_conn->mutex); | ||
3791 | - | ||
3792 | - isert_info("conn %p completing wait\n", isert_conn); | ||
3793 | - complete(&isert_conn->wait); | ||
3794 | - | ||
3795 | - if (terminating) | ||
3796 | - goto out; | ||
3797 | - | ||
3798 | - mutex_lock(&isert_np->mutex); | ||
3799 | - if (!list_empty(&isert_conn->node)) { | ||
3800 | - list_del_init(&isert_conn->node); | ||
3801 | - isert_put_conn(isert_conn); | ||
3802 | - queue_work(isert_release_wq, &isert_conn->release_work); | ||
3803 | + switch (isert_conn->state) { | ||
3804 | + case ISER_CONN_TERMINATING: | ||
3805 | + break; | ||
3806 | + case ISER_CONN_UP: | ||
3807 | + isert_conn_terminate(isert_conn); | ||
3808 | + isert_wait4flush(isert_conn); | ||
3809 | + isert_handle_unbound_conn(isert_conn); | ||
3810 | + break; | ||
3811 | + case ISER_CONN_BOUND: | ||
3812 | + case ISER_CONN_FULL_FEATURE: /* FALLTHRU */ | ||
3813 | + iscsit_cause_connection_reinstatement(isert_conn->conn, 0); | ||
3814 | + break; | ||
3815 | + default: | ||
3816 | + isert_warn("conn %p teminating in state %d\n", | ||
3817 | + isert_conn, isert_conn->state); | ||
3818 | } | ||
3819 | - mutex_unlock(&isert_np->mutex); | ||
3820 | + mutex_unlock(&isert_conn->mutex); | ||
3821 | |||
3822 | -out: | ||
3823 | return 0; | ||
3824 | } | ||
3825 | |||
3826 | @@ -929,12 +937,16 @@ isert_connect_error(struct rdma_cm_id *cma_id) | ||
3827 | static int | ||
3828 | isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | ||
3829 | { | ||
3830 | + struct isert_np *isert_np = cma_id->context; | ||
3831 | int ret = 0; | ||
3832 | |||
3833 | isert_info("%s (%d): status %d id %p np %p\n", | ||
3834 | rdma_event_msg(event->event), event->event, | ||
3835 | event->status, cma_id, cma_id->context); | ||
3836 | |||
3837 | + if (isert_np->cm_id == cma_id) | ||
3838 | + return isert_np_cma_handler(cma_id->context, event->event); | ||
3839 | + | ||
3840 | switch (event->event) { | ||
3841 | case RDMA_CM_EVENT_CONNECT_REQUEST: | ||
3842 | ret = isert_connect_request(cma_id, event); | ||
3843 | @@ -980,13 +992,10 @@ isert_post_recvm(struct isert_conn *isert_conn, u32 count) | ||
3844 | rx_wr--; | ||
3845 | rx_wr->next = NULL; /* mark end of work requests list */ | ||
3846 | |||
3847 | - isert_conn->post_recv_buf_count += count; | ||
3848 | ret = ib_post_recv(isert_conn->qp, isert_conn->rx_wr, | ||
3849 | &rx_wr_failed); | ||
3850 | - if (ret) { | ||
3851 | + if (ret) | ||
3852 | isert_err("ib_post_recv() failed with ret: %d\n", ret); | ||
3853 | - isert_conn->post_recv_buf_count -= count; | ||
3854 | - } | ||
3855 | |||
3856 | return ret; | ||
3857 | } | ||
3858 | @@ -1002,12 +1011,9 @@ isert_post_recv(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc) | ||
3859 | rx_wr.num_sge = 1; | ||
3860 | rx_wr.next = NULL; | ||
3861 | |||
3862 | - isert_conn->post_recv_buf_count++; | ||
3863 | ret = ib_post_recv(isert_conn->qp, &rx_wr, &rx_wr_failed); | ||
3864 | - if (ret) { | ||
3865 | + if (ret) | ||
3866 | isert_err("ib_post_recv() failed with ret: %d\n", ret); | ||
3867 | - isert_conn->post_recv_buf_count--; | ||
3868 | - } | ||
3869 | |||
3870 | return ret; | ||
3871 | } | ||
3872 | @@ -1120,12 +1126,9 @@ isert_rdma_post_recvl(struct isert_conn *isert_conn) | ||
3873 | rx_wr.sg_list = &sge; | ||
3874 | rx_wr.num_sge = 1; | ||
3875 | |||
3876 | - isert_conn->post_recv_buf_count++; | ||
3877 | ret = ib_post_recv(isert_conn->qp, &rx_wr, &rx_wr_fail); | ||
3878 | - if (ret) { | ||
3879 | + if (ret) | ||
3880 | isert_err("ib_post_recv() failed: %d\n", ret); | ||
3881 | - isert_conn->post_recv_buf_count--; | ||
3882 | - } | ||
3883 | |||
3884 | return ret; | ||
3885 | } | ||
3886 | @@ -1620,7 +1623,6 @@ isert_rcv_completion(struct iser_rx_desc *desc, | ||
3887 | ib_dma_sync_single_for_device(ib_dev, rx_dma, rx_buflen, | ||
3888 | DMA_FROM_DEVICE); | ||
3889 | |||
3890 | - isert_conn->post_recv_buf_count--; | ||
3891 | } | ||
3892 | |||
3893 | static int | ||
3894 | @@ -2035,7 +2037,8 @@ is_isert_tx_desc(struct isert_conn *isert_conn, void *wr_id) | ||
3895 | void *start = isert_conn->rx_descs; | ||
3896 | int len = ISERT_QP_MAX_RECV_DTOS * sizeof(*isert_conn->rx_descs); | ||
3897 | |||
3898 | - if (wr_id >= start && wr_id < start + len) | ||
3899 | + if ((wr_id >= start && wr_id < start + len) || | ||
3900 | + (wr_id == isert_conn->login_req_buf)) | ||
3901 | return false; | ||
3902 | |||
3903 | return true; | ||
3904 | @@ -2059,10 +2062,6 @@ isert_cq_comp_err(struct isert_conn *isert_conn, struct ib_wc *wc) | ||
3905 | isert_unmap_tx_desc(desc, ib_dev); | ||
3906 | else | ||
3907 | isert_completion_put(desc, isert_cmd, ib_dev, true); | ||
3908 | - } else { | ||
3909 | - isert_conn->post_recv_buf_count--; | ||
3910 | - if (!isert_conn->post_recv_buf_count) | ||
3911 | - iscsit_cause_connection_reinstatement(isert_conn->conn, 0); | ||
3912 | } | ||
3913 | } | ||
3914 | |||
3915 | @@ -3193,6 +3192,7 @@ accept_wait: | ||
3916 | |||
3917 | conn->context = isert_conn; | ||
3918 | isert_conn->conn = conn; | ||
3919 | + isert_conn->state = ISER_CONN_BOUND; | ||
3920 | |||
3921 | isert_set_conn_info(np, conn, isert_conn); | ||
3922 | |||
3923 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h | ||
3924 | index 3d7fbc47c343..1874d21daee0 100644 | ||
3925 | --- a/drivers/infiniband/ulp/isert/ib_isert.h | ||
3926 | +++ b/drivers/infiniband/ulp/isert/ib_isert.h | ||
3927 | @@ -50,6 +50,7 @@ enum iser_ib_op_code { | ||
3928 | enum iser_conn_state { | ||
3929 | ISER_CONN_INIT, | ||
3930 | ISER_CONN_UP, | ||
3931 | + ISER_CONN_BOUND, | ||
3932 | ISER_CONN_FULL_FEATURE, | ||
3933 | ISER_CONN_TERMINATING, | ||
3934 | ISER_CONN_DOWN, | ||
3935 | @@ -144,7 +145,6 @@ struct isert_device; | ||
3936 | |||
3937 | struct isert_conn { | ||
3938 | enum iser_conn_state state; | ||
3939 | - int post_recv_buf_count; | ||
3940 | u32 responder_resources; | ||
3941 | u32 initiator_depth; | ||
3942 | bool pi_support; | ||
3943 | diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c | ||
3944 | index 2e2fe818ca9f..eaabf3125846 100644 | ||
3945 | --- a/drivers/infiniband/ulp/srpt/ib_srpt.c | ||
3946 | +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c | ||
3947 | @@ -1737,47 +1737,6 @@ send_sense: | ||
3948 | return -1; | ||
3949 | } | ||
3950 | |||
3951 | -/** | ||
3952 | - * srpt_rx_mgmt_fn_tag() - Process a task management function by tag. | ||
3953 | - * @ch: RDMA channel of the task management request. | ||
3954 | - * @fn: Task management function to perform. | ||
3955 | - * @req_tag: Tag of the SRP task management request. | ||
3956 | - * @mgmt_ioctx: I/O context of the task management request. | ||
3957 | - * | ||
3958 | - * Returns zero if the target core will process the task management | ||
3959 | - * request asynchronously. | ||
3960 | - * | ||
3961 | - * Note: It is assumed that the initiator serializes tag-based task management | ||
3962 | - * requests. | ||
3963 | - */ | ||
3964 | -static int srpt_rx_mgmt_fn_tag(struct srpt_send_ioctx *ioctx, u64 tag) | ||
3965 | -{ | ||
3966 | - struct srpt_device *sdev; | ||
3967 | - struct srpt_rdma_ch *ch; | ||
3968 | - struct srpt_send_ioctx *target; | ||
3969 | - int ret, i; | ||
3970 | - | ||
3971 | - ret = -EINVAL; | ||
3972 | - ch = ioctx->ch; | ||
3973 | - BUG_ON(!ch); | ||
3974 | - BUG_ON(!ch->sport); | ||
3975 | - sdev = ch->sport->sdev; | ||
3976 | - BUG_ON(!sdev); | ||
3977 | - spin_lock_irq(&sdev->spinlock); | ||
3978 | - for (i = 0; i < ch->rq_size; ++i) { | ||
3979 | - target = ch->ioctx_ring[i]; | ||
3980 | - if (target->cmd.se_lun == ioctx->cmd.se_lun && | ||
3981 | - target->cmd.tag == tag && | ||
3982 | - srpt_get_cmd_state(target) != SRPT_STATE_DONE) { | ||
3983 | - ret = 0; | ||
3984 | - /* now let the target core abort &target->cmd; */ | ||
3985 | - break; | ||
3986 | - } | ||
3987 | - } | ||
3988 | - spin_unlock_irq(&sdev->spinlock); | ||
3989 | - return ret; | ||
3990 | -} | ||
3991 | - | ||
3992 | static int srp_tmr_to_tcm(int fn) | ||
3993 | { | ||
3994 | switch (fn) { | ||
3995 | @@ -1812,7 +1771,6 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch, | ||
3996 | struct se_cmd *cmd; | ||
3997 | struct se_session *sess = ch->sess; | ||
3998 | uint64_t unpacked_lun; | ||
3999 | - uint32_t tag = 0; | ||
4000 | int tcm_tmr; | ||
4001 | int rc; | ||
4002 | |||
4003 | @@ -1828,25 +1786,10 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch, | ||
4004 | srpt_set_cmd_state(send_ioctx, SRPT_STATE_MGMT); | ||
4005 | send_ioctx->cmd.tag = srp_tsk->tag; | ||
4006 | tcm_tmr = srp_tmr_to_tcm(srp_tsk->tsk_mgmt_func); | ||
4007 | - if (tcm_tmr < 0) { | ||
4008 | - send_ioctx->cmd.se_tmr_req->response = | ||
4009 | - TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED; | ||
4010 | - goto fail; | ||
4011 | - } | ||
4012 | unpacked_lun = srpt_unpack_lun((uint8_t *)&srp_tsk->lun, | ||
4013 | sizeof(srp_tsk->lun)); | ||
4014 | - | ||
4015 | - if (srp_tsk->tsk_mgmt_func == SRP_TSK_ABORT_TASK) { | ||
4016 | - rc = srpt_rx_mgmt_fn_tag(send_ioctx, srp_tsk->task_tag); | ||
4017 | - if (rc < 0) { | ||
4018 | - send_ioctx->cmd.se_tmr_req->response = | ||
4019 | - TMR_TASK_DOES_NOT_EXIST; | ||
4020 | - goto fail; | ||
4021 | - } | ||
4022 | - tag = srp_tsk->task_tag; | ||
4023 | - } | ||
4024 | rc = target_submit_tmr(&send_ioctx->cmd, sess, NULL, unpacked_lun, | ||
4025 | - srp_tsk, tcm_tmr, GFP_KERNEL, tag, | ||
4026 | + srp_tsk, tcm_tmr, GFP_KERNEL, srp_tsk->task_tag, | ||
4027 | TARGET_SCF_ACK_KREF); | ||
4028 | if (rc != 0) { | ||
4029 | send_ioctx->cmd.se_tmr_req->response = TMR_FUNCTION_REJECTED; | ||
4030 | diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c | ||
4031 | index cfd58e87da26..1c5914cae853 100644 | ||
4032 | --- a/drivers/input/misc/ati_remote2.c | ||
4033 | +++ b/drivers/input/misc/ati_remote2.c | ||
4034 | @@ -817,26 +817,49 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d | ||
4035 | |||
4036 | ar2->udev = udev; | ||
4037 | |||
4038 | + /* Sanity check, first interface must have an endpoint */ | ||
4039 | + if (alt->desc.bNumEndpoints < 1 || !alt->endpoint) { | ||
4040 | + dev_err(&interface->dev, | ||
4041 | + "%s(): interface 0 must have an endpoint\n", __func__); | ||
4042 | + r = -ENODEV; | ||
4043 | + goto fail1; | ||
4044 | + } | ||
4045 | ar2->intf[0] = interface; | ||
4046 | ar2->ep[0] = &alt->endpoint[0].desc; | ||
4047 | |||
4048 | + /* Sanity check, the device must have two interfaces */ | ||
4049 | ar2->intf[1] = usb_ifnum_to_if(udev, 1); | ||
4050 | + if ((udev->actconfig->desc.bNumInterfaces < 2) || !ar2->intf[1]) { | ||
4051 | + dev_err(&interface->dev, "%s(): need 2 interfaces, found %d\n", | ||
4052 | + __func__, udev->actconfig->desc.bNumInterfaces); | ||
4053 | + r = -ENODEV; | ||
4054 | + goto fail1; | ||
4055 | + } | ||
4056 | + | ||
4057 | r = usb_driver_claim_interface(&ati_remote2_driver, ar2->intf[1], ar2); | ||
4058 | if (r) | ||
4059 | goto fail1; | ||
4060 | + | ||
4061 | + /* Sanity check, second interface must have an endpoint */ | ||
4062 | alt = ar2->intf[1]->cur_altsetting; | ||
4063 | + if (alt->desc.bNumEndpoints < 1 || !alt->endpoint) { | ||
4064 | + dev_err(&interface->dev, | ||
4065 | + "%s(): interface 1 must have an endpoint\n", __func__); | ||
4066 | + r = -ENODEV; | ||
4067 | + goto fail2; | ||
4068 | + } | ||
4069 | ar2->ep[1] = &alt->endpoint[0].desc; | ||
4070 | |||
4071 | r = ati_remote2_urb_init(ar2); | ||
4072 | if (r) | ||
4073 | - goto fail2; | ||
4074 | + goto fail3; | ||
4075 | |||
4076 | ar2->channel_mask = channel_mask; | ||
4077 | ar2->mode_mask = mode_mask; | ||
4078 | |||
4079 | r = ati_remote2_setup(ar2, ar2->channel_mask); | ||
4080 | if (r) | ||
4081 | - goto fail2; | ||
4082 | + goto fail3; | ||
4083 | |||
4084 | usb_make_path(udev, ar2->phys, sizeof(ar2->phys)); | ||
4085 | strlcat(ar2->phys, "/input0", sizeof(ar2->phys)); | ||
4086 | @@ -845,11 +868,11 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d | ||
4087 | |||
4088 | r = sysfs_create_group(&udev->dev.kobj, &ati_remote2_attr_group); | ||
4089 | if (r) | ||
4090 | - goto fail2; | ||
4091 | + goto fail3; | ||
4092 | |||
4093 | r = ati_remote2_input_init(ar2); | ||
4094 | if (r) | ||
4095 | - goto fail3; | ||
4096 | + goto fail4; | ||
4097 | |||
4098 | usb_set_intfdata(interface, ar2); | ||
4099 | |||
4100 | @@ -857,10 +880,11 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d | ||
4101 | |||
4102 | return 0; | ||
4103 | |||
4104 | - fail3: | ||
4105 | + fail4: | ||
4106 | sysfs_remove_group(&udev->dev.kobj, &ati_remote2_attr_group); | ||
4107 | - fail2: | ||
4108 | + fail3: | ||
4109 | ati_remote2_urb_cleanup(ar2); | ||
4110 | + fail2: | ||
4111 | usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]); | ||
4112 | fail1: | ||
4113 | kfree(ar2); | ||
4114 | diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c | ||
4115 | index ac1fa5f44580..9c0ea36913b4 100644 | ||
4116 | --- a/drivers/input/misc/ims-pcu.c | ||
4117 | +++ b/drivers/input/misc/ims-pcu.c | ||
4118 | @@ -1663,6 +1663,8 @@ static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pc | ||
4119 | |||
4120 | pcu->ctrl_intf = usb_ifnum_to_if(pcu->udev, | ||
4121 | union_desc->bMasterInterface0); | ||
4122 | + if (!pcu->ctrl_intf) | ||
4123 | + return -EINVAL; | ||
4124 | |||
4125 | alt = pcu->ctrl_intf->cur_altsetting; | ||
4126 | pcu->ep_ctrl = &alt->endpoint[0].desc; | ||
4127 | @@ -1670,6 +1672,8 @@ static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pc | ||
4128 | |||
4129 | pcu->data_intf = usb_ifnum_to_if(pcu->udev, | ||
4130 | union_desc->bSlaveInterface0); | ||
4131 | + if (!pcu->data_intf) | ||
4132 | + return -EINVAL; | ||
4133 | |||
4134 | alt = pcu->data_intf->cur_altsetting; | ||
4135 | if (alt->desc.bNumEndpoints != 2) { | ||
4136 | diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c | ||
4137 | index 63b539d3daba..84909a12ff36 100644 | ||
4138 | --- a/drivers/input/misc/powermate.c | ||
4139 | +++ b/drivers/input/misc/powermate.c | ||
4140 | @@ -307,6 +307,9 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i | ||
4141 | int error = -ENOMEM; | ||
4142 | |||
4143 | interface = intf->cur_altsetting; | ||
4144 | + if (interface->desc.bNumEndpoints < 1) | ||
4145 | + return -EINVAL; | ||
4146 | + | ||
4147 | endpoint = &interface->endpoint[0].desc; | ||
4148 | if (!usb_endpoint_is_int_in(endpoint)) | ||
4149 | return -EIO; | ||
4150 | diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c | ||
4151 | index 6025eb430c0a..a41d8328c064 100644 | ||
4152 | --- a/drivers/input/mouse/synaptics.c | ||
4153 | +++ b/drivers/input/mouse/synaptics.c | ||
4154 | @@ -862,8 +862,9 @@ static void synaptics_report_ext_buttons(struct psmouse *psmouse, | ||
4155 | if (!SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap)) | ||
4156 | return; | ||
4157 | |||
4158 | - /* Bug in FW 8.1, buttons are reported only when ExtBit is 1 */ | ||
4159 | - if (SYN_ID_FULL(priv->identity) == 0x801 && | ||
4160 | + /* Bug in FW 8.1 & 8.2, buttons are reported only when ExtBit is 1 */ | ||
4161 | + if ((SYN_ID_FULL(priv->identity) == 0x801 || | ||
4162 | + SYN_ID_FULL(priv->identity) == 0x802) && | ||
4163 | !((psmouse->packet[0] ^ psmouse->packet[3]) & 0x02)) | ||
4164 | return; | ||
4165 | |||
4166 | diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c | ||
4167 | index 8d0ead98eb6e..a296425a7270 100644 | ||
4168 | --- a/drivers/md/bcache/super.c | ||
4169 | +++ b/drivers/md/bcache/super.c | ||
4170 | @@ -1015,8 +1015,12 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c) | ||
4171 | */ | ||
4172 | atomic_set(&dc->count, 1); | ||
4173 | |||
4174 | - if (bch_cached_dev_writeback_start(dc)) | ||
4175 | + /* Block writeback thread, but spawn it */ | ||
4176 | + down_write(&dc->writeback_lock); | ||
4177 | + if (bch_cached_dev_writeback_start(dc)) { | ||
4178 | + up_write(&dc->writeback_lock); | ||
4179 | return -ENOMEM; | ||
4180 | + } | ||
4181 | |||
4182 | if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) { | ||
4183 | bch_sectors_dirty_init(dc); | ||
4184 | @@ -1028,6 +1032,9 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c) | ||
4185 | bch_cached_dev_run(dc); | ||
4186 | bcache_device_link(&dc->disk, c, "bdev"); | ||
4187 | |||
4188 | + /* Allow the writeback thread to proceed */ | ||
4189 | + up_write(&dc->writeback_lock); | ||
4190 | + | ||
4191 | pr_info("Caching %s as %s on set %pU", | ||
4192 | bdevname(dc->bdev, buf), dc->disk.disk->disk_name, | ||
4193 | dc->disk.c->sb.set_uuid); | ||
4194 | @@ -1366,6 +1373,9 @@ static void cache_set_flush(struct closure *cl) | ||
4195 | struct btree *b; | ||
4196 | unsigned i; | ||
4197 | |||
4198 | + if (!c) | ||
4199 | + closure_return(cl); | ||
4200 | + | ||
4201 | bch_cache_accounting_destroy(&c->accounting); | ||
4202 | |||
4203 | kobject_put(&c->internal); | ||
4204 | @@ -1828,11 +1838,12 @@ static int cache_alloc(struct cache_sb *sb, struct cache *ca) | ||
4205 | return 0; | ||
4206 | } | ||
4207 | |||
4208 | -static void register_cache(struct cache_sb *sb, struct page *sb_page, | ||
4209 | +static int register_cache(struct cache_sb *sb, struct page *sb_page, | ||
4210 | struct block_device *bdev, struct cache *ca) | ||
4211 | { | ||
4212 | char name[BDEVNAME_SIZE]; | ||
4213 | - const char *err = "cannot allocate memory"; | ||
4214 | + const char *err = NULL; | ||
4215 | + int ret = 0; | ||
4216 | |||
4217 | memcpy(&ca->sb, sb, sizeof(struct cache_sb)); | ||
4218 | ca->bdev = bdev; | ||
4219 | @@ -1847,27 +1858,35 @@ static void register_cache(struct cache_sb *sb, struct page *sb_page, | ||
4220 | if (blk_queue_discard(bdev_get_queue(ca->bdev))) | ||
4221 | ca->discard = CACHE_DISCARD(&ca->sb); | ||
4222 | |||
4223 | - if (cache_alloc(sb, ca) != 0) | ||
4224 | + ret = cache_alloc(sb, ca); | ||
4225 | + if (ret != 0) | ||
4226 | goto err; | ||
4227 | |||
4228 | - err = "error creating kobject"; | ||
4229 | - if (kobject_add(&ca->kobj, &part_to_dev(bdev->bd_part)->kobj, "bcache")) | ||
4230 | - goto err; | ||
4231 | + if (kobject_add(&ca->kobj, &part_to_dev(bdev->bd_part)->kobj, "bcache")) { | ||
4232 | + err = "error calling kobject_add"; | ||
4233 | + ret = -ENOMEM; | ||
4234 | + goto out; | ||
4235 | + } | ||
4236 | |||
4237 | mutex_lock(&bch_register_lock); | ||
4238 | err = register_cache_set(ca); | ||
4239 | mutex_unlock(&bch_register_lock); | ||
4240 | |||
4241 | - if (err) | ||
4242 | - goto err; | ||
4243 | + if (err) { | ||
4244 | + ret = -ENODEV; | ||
4245 | + goto out; | ||
4246 | + } | ||
4247 | |||
4248 | pr_info("registered cache device %s", bdevname(bdev, name)); | ||
4249 | + | ||
4250 | out: | ||
4251 | kobject_put(&ca->kobj); | ||
4252 | - return; | ||
4253 | + | ||
4254 | err: | ||
4255 | - pr_notice("error opening %s: %s", bdevname(bdev, name), err); | ||
4256 | - goto out; | ||
4257 | + if (err) | ||
4258 | + pr_notice("error opening %s: %s", bdevname(bdev, name), err); | ||
4259 | + | ||
4260 | + return ret; | ||
4261 | } | ||
4262 | |||
4263 | /* Global interfaces/init */ | ||
4264 | @@ -1965,7 +1984,8 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, | ||
4265 | if (!ca) | ||
4266 | goto err_close; | ||
4267 | |||
4268 | - register_cache(sb, sb_page, bdev, ca); | ||
4269 | + if (register_cache(sb, sb_page, bdev, ca) != 0) | ||
4270 | + goto err_close; | ||
4271 | } | ||
4272 | out: | ||
4273 | if (sb_page) | ||
4274 | diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c | ||
4275 | index f6543f3a970f..27f2ef300f8b 100644 | ||
4276 | --- a/drivers/md/dm-cache-metadata.c | ||
4277 | +++ b/drivers/md/dm-cache-metadata.c | ||
4278 | @@ -867,19 +867,40 @@ static int blocks_are_unmapped_or_clean(struct dm_cache_metadata *cmd, | ||
4279 | return 0; | ||
4280 | } | ||
4281 | |||
4282 | -#define WRITE_LOCK(cmd) \ | ||
4283 | - if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) \ | ||
4284 | +#define WRITE_LOCK(cmd) \ | ||
4285 | + down_write(&cmd->root_lock); \ | ||
4286 | + if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \ | ||
4287 | + up_write(&cmd->root_lock); \ | ||
4288 | return -EINVAL; \ | ||
4289 | - down_write(&cmd->root_lock) | ||
4290 | + } | ||
4291 | |||
4292 | #define WRITE_LOCK_VOID(cmd) \ | ||
4293 | - if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) \ | ||
4294 | + down_write(&cmd->root_lock); \ | ||
4295 | + if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \ | ||
4296 | + up_write(&cmd->root_lock); \ | ||
4297 | return; \ | ||
4298 | - down_write(&cmd->root_lock) | ||
4299 | + } | ||
4300 | |||
4301 | #define WRITE_UNLOCK(cmd) \ | ||
4302 | up_write(&cmd->root_lock) | ||
4303 | |||
4304 | +#define READ_LOCK(cmd) \ | ||
4305 | + down_read(&cmd->root_lock); \ | ||
4306 | + if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \ | ||
4307 | + up_read(&cmd->root_lock); \ | ||
4308 | + return -EINVAL; \ | ||
4309 | + } | ||
4310 | + | ||
4311 | +#define READ_LOCK_VOID(cmd) \ | ||
4312 | + down_read(&cmd->root_lock); \ | ||
4313 | + if (cmd->fail_io || dm_bm_is_read_only(cmd->bm)) { \ | ||
4314 | + up_read(&cmd->root_lock); \ | ||
4315 | + return; \ | ||
4316 | + } | ||
4317 | + | ||
4318 | +#define READ_UNLOCK(cmd) \ | ||
4319 | + up_read(&cmd->root_lock) | ||
4320 | + | ||
4321 | int dm_cache_resize(struct dm_cache_metadata *cmd, dm_cblock_t new_cache_size) | ||
4322 | { | ||
4323 | int r; | ||
4324 | @@ -1015,22 +1036,20 @@ int dm_cache_load_discards(struct dm_cache_metadata *cmd, | ||
4325 | { | ||
4326 | int r; | ||
4327 | |||
4328 | - down_read(&cmd->root_lock); | ||
4329 | + READ_LOCK(cmd); | ||
4330 | r = __load_discards(cmd, fn, context); | ||
4331 | - up_read(&cmd->root_lock); | ||
4332 | + READ_UNLOCK(cmd); | ||
4333 | |||
4334 | return r; | ||
4335 | } | ||
4336 | |||
4337 | -dm_cblock_t dm_cache_size(struct dm_cache_metadata *cmd) | ||
4338 | +int dm_cache_size(struct dm_cache_metadata *cmd, dm_cblock_t *result) | ||
4339 | { | ||
4340 | - dm_cblock_t r; | ||
4341 | + READ_LOCK(cmd); | ||
4342 | + *result = cmd->cache_blocks; | ||
4343 | + READ_UNLOCK(cmd); | ||
4344 | |||
4345 | - down_read(&cmd->root_lock); | ||
4346 | - r = cmd->cache_blocks; | ||
4347 | - up_read(&cmd->root_lock); | ||
4348 | - | ||
4349 | - return r; | ||
4350 | + return 0; | ||
4351 | } | ||
4352 | |||
4353 | static int __remove(struct dm_cache_metadata *cmd, dm_cblock_t cblock) | ||
4354 | @@ -1188,9 +1207,9 @@ int dm_cache_load_mappings(struct dm_cache_metadata *cmd, | ||
4355 | { | ||
4356 | int r; | ||
4357 | |||
4358 | - down_read(&cmd->root_lock); | ||
4359 | + READ_LOCK(cmd); | ||
4360 | r = __load_mappings(cmd, policy, fn, context); | ||
4361 | - up_read(&cmd->root_lock); | ||
4362 | + READ_UNLOCK(cmd); | ||
4363 | |||
4364 | return r; | ||
4365 | } | ||
4366 | @@ -1215,18 +1234,18 @@ static int __dump_mappings(struct dm_cache_metadata *cmd) | ||
4367 | |||
4368 | void dm_cache_dump(struct dm_cache_metadata *cmd) | ||
4369 | { | ||
4370 | - down_read(&cmd->root_lock); | ||
4371 | + READ_LOCK_VOID(cmd); | ||
4372 | __dump_mappings(cmd); | ||
4373 | - up_read(&cmd->root_lock); | ||
4374 | + READ_UNLOCK(cmd); | ||
4375 | } | ||
4376 | |||
4377 | int dm_cache_changed_this_transaction(struct dm_cache_metadata *cmd) | ||
4378 | { | ||
4379 | int r; | ||
4380 | |||
4381 | - down_read(&cmd->root_lock); | ||
4382 | + READ_LOCK(cmd); | ||
4383 | r = cmd->changed; | ||
4384 | - up_read(&cmd->root_lock); | ||
4385 | + READ_UNLOCK(cmd); | ||
4386 | |||
4387 | return r; | ||
4388 | } | ||
4389 | @@ -1276,9 +1295,9 @@ int dm_cache_set_dirty(struct dm_cache_metadata *cmd, | ||
4390 | void dm_cache_metadata_get_stats(struct dm_cache_metadata *cmd, | ||
4391 | struct dm_cache_statistics *stats) | ||
4392 | { | ||
4393 | - down_read(&cmd->root_lock); | ||
4394 | + READ_LOCK_VOID(cmd); | ||
4395 | *stats = cmd->stats; | ||
4396 | - up_read(&cmd->root_lock); | ||
4397 | + READ_UNLOCK(cmd); | ||
4398 | } | ||
4399 | |||
4400 | void dm_cache_metadata_set_stats(struct dm_cache_metadata *cmd, | ||
4401 | @@ -1312,9 +1331,9 @@ int dm_cache_get_free_metadata_block_count(struct dm_cache_metadata *cmd, | ||
4402 | { | ||
4403 | int r = -EINVAL; | ||
4404 | |||
4405 | - down_read(&cmd->root_lock); | ||
4406 | + READ_LOCK(cmd); | ||
4407 | r = dm_sm_get_nr_free(cmd->metadata_sm, result); | ||
4408 | - up_read(&cmd->root_lock); | ||
4409 | + READ_UNLOCK(cmd); | ||
4410 | |||
4411 | return r; | ||
4412 | } | ||
4413 | @@ -1324,9 +1343,9 @@ int dm_cache_get_metadata_dev_size(struct dm_cache_metadata *cmd, | ||
4414 | { | ||
4415 | int r = -EINVAL; | ||
4416 | |||
4417 | - down_read(&cmd->root_lock); | ||
4418 | + READ_LOCK(cmd); | ||
4419 | r = dm_sm_get_nr_blocks(cmd->metadata_sm, result); | ||
4420 | - up_read(&cmd->root_lock); | ||
4421 | + READ_UNLOCK(cmd); | ||
4422 | |||
4423 | return r; | ||
4424 | } | ||
4425 | @@ -1417,7 +1436,13 @@ int dm_cache_write_hints(struct dm_cache_metadata *cmd, struct dm_cache_policy * | ||
4426 | |||
4427 | int dm_cache_metadata_all_clean(struct dm_cache_metadata *cmd, bool *result) | ||
4428 | { | ||
4429 | - return blocks_are_unmapped_or_clean(cmd, 0, cmd->cache_blocks, result); | ||
4430 | + int r; | ||
4431 | + | ||
4432 | + READ_LOCK(cmd); | ||
4433 | + r = blocks_are_unmapped_or_clean(cmd, 0, cmd->cache_blocks, result); | ||
4434 | + READ_UNLOCK(cmd); | ||
4435 | + | ||
4436 | + return r; | ||
4437 | } | ||
4438 | |||
4439 | void dm_cache_metadata_set_read_only(struct dm_cache_metadata *cmd) | ||
4440 | @@ -1440,10 +1465,7 @@ int dm_cache_metadata_set_needs_check(struct dm_cache_metadata *cmd) | ||
4441 | struct dm_block *sblock; | ||
4442 | struct cache_disk_superblock *disk_super; | ||
4443 | |||
4444 | - /* | ||
4445 | - * We ignore fail_io for this function. | ||
4446 | - */ | ||
4447 | - down_write(&cmd->root_lock); | ||
4448 | + WRITE_LOCK(cmd); | ||
4449 | set_bit(NEEDS_CHECK, &cmd->flags); | ||
4450 | |||
4451 | r = superblock_lock(cmd, &sblock); | ||
4452 | @@ -1458,19 +1480,17 @@ int dm_cache_metadata_set_needs_check(struct dm_cache_metadata *cmd) | ||
4453 | dm_bm_unlock(sblock); | ||
4454 | |||
4455 | out: | ||
4456 | - up_write(&cmd->root_lock); | ||
4457 | + WRITE_UNLOCK(cmd); | ||
4458 | return r; | ||
4459 | } | ||
4460 | |||
4461 | -bool dm_cache_metadata_needs_check(struct dm_cache_metadata *cmd) | ||
4462 | +int dm_cache_metadata_needs_check(struct dm_cache_metadata *cmd, bool *result) | ||
4463 | { | ||
4464 | - bool needs_check; | ||
4465 | + READ_LOCK(cmd); | ||
4466 | + *result = !!test_bit(NEEDS_CHECK, &cmd->flags); | ||
4467 | + READ_UNLOCK(cmd); | ||
4468 | |||
4469 | - down_read(&cmd->root_lock); | ||
4470 | - needs_check = !!test_bit(NEEDS_CHECK, &cmd->flags); | ||
4471 | - up_read(&cmd->root_lock); | ||
4472 | - | ||
4473 | - return needs_check; | ||
4474 | + return 0; | ||
4475 | } | ||
4476 | |||
4477 | int dm_cache_metadata_abort(struct dm_cache_metadata *cmd) | ||
4478 | diff --git a/drivers/md/dm-cache-metadata.h b/drivers/md/dm-cache-metadata.h | ||
4479 | index 2ffee21f318d..8528744195e5 100644 | ||
4480 | --- a/drivers/md/dm-cache-metadata.h | ||
4481 | +++ b/drivers/md/dm-cache-metadata.h | ||
4482 | @@ -66,7 +66,7 @@ void dm_cache_metadata_close(struct dm_cache_metadata *cmd); | ||
4483 | * origin blocks to map to. | ||
4484 | */ | ||
4485 | int dm_cache_resize(struct dm_cache_metadata *cmd, dm_cblock_t new_cache_size); | ||
4486 | -dm_cblock_t dm_cache_size(struct dm_cache_metadata *cmd); | ||
4487 | +int dm_cache_size(struct dm_cache_metadata *cmd, dm_cblock_t *result); | ||
4488 | |||
4489 | int dm_cache_discard_bitset_resize(struct dm_cache_metadata *cmd, | ||
4490 | sector_t discard_block_size, | ||
4491 | @@ -137,7 +137,7 @@ int dm_cache_write_hints(struct dm_cache_metadata *cmd, struct dm_cache_policy * | ||
4492 | */ | ||
4493 | int dm_cache_metadata_all_clean(struct dm_cache_metadata *cmd, bool *result); | ||
4494 | |||
4495 | -bool dm_cache_metadata_needs_check(struct dm_cache_metadata *cmd); | ||
4496 | +int dm_cache_metadata_needs_check(struct dm_cache_metadata *cmd, bool *result); | ||
4497 | int dm_cache_metadata_set_needs_check(struct dm_cache_metadata *cmd); | ||
4498 | void dm_cache_metadata_set_read_only(struct dm_cache_metadata *cmd); | ||
4499 | void dm_cache_metadata_set_read_write(struct dm_cache_metadata *cmd); | ||
4500 | diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c | ||
4501 | index 2fd4c8296144..515f83e7d9ab 100644 | ||
4502 | --- a/drivers/md/dm-cache-target.c | ||
4503 | +++ b/drivers/md/dm-cache-target.c | ||
4504 | @@ -987,9 +987,14 @@ static void notify_mode_switch(struct cache *cache, enum cache_metadata_mode mod | ||
4505 | |||
4506 | static void set_cache_mode(struct cache *cache, enum cache_metadata_mode new_mode) | ||
4507 | { | ||
4508 | - bool needs_check = dm_cache_metadata_needs_check(cache->cmd); | ||
4509 | + bool needs_check; | ||
4510 | enum cache_metadata_mode old_mode = get_cache_mode(cache); | ||
4511 | |||
4512 | + if (dm_cache_metadata_needs_check(cache->cmd, &needs_check)) { | ||
4513 | + DMERR("unable to read needs_check flag, setting failure mode"); | ||
4514 | + new_mode = CM_FAIL; | ||
4515 | + } | ||
4516 | + | ||
4517 | if (new_mode == CM_WRITE && needs_check) { | ||
4518 | DMERR("%s: unable to switch cache to write mode until repaired.", | ||
4519 | cache_device_name(cache)); | ||
4520 | @@ -3513,6 +3518,7 @@ static void cache_status(struct dm_target *ti, status_type_t type, | ||
4521 | char buf[BDEVNAME_SIZE]; | ||
4522 | struct cache *cache = ti->private; | ||
4523 | dm_cblock_t residency; | ||
4524 | + bool needs_check; | ||
4525 | |||
4526 | switch (type) { | ||
4527 | case STATUSTYPE_INFO: | ||
4528 | @@ -3586,7 +3592,9 @@ static void cache_status(struct dm_target *ti, status_type_t type, | ||
4529 | else | ||
4530 | DMEMIT("rw "); | ||
4531 | |||
4532 | - if (dm_cache_metadata_needs_check(cache->cmd)) | ||
4533 | + r = dm_cache_metadata_needs_check(cache->cmd, &needs_check); | ||
4534 | + | ||
4535 | + if (r || needs_check) | ||
4536 | DMEMIT("needs_check "); | ||
4537 | else | ||
4538 | DMEMIT("- "); | ||
4539 | diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c | ||
4540 | index 61f184ad081c..e108deebbaaa 100644 | ||
4541 | --- a/drivers/md/dm-snap.c | ||
4542 | +++ b/drivers/md/dm-snap.c | ||
4543 | @@ -1106,6 +1106,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) | ||
4544 | int i; | ||
4545 | int r = -EINVAL; | ||
4546 | char *origin_path, *cow_path; | ||
4547 | + dev_t origin_dev, cow_dev; | ||
4548 | unsigned args_used, num_flush_bios = 1; | ||
4549 | fmode_t origin_mode = FMODE_READ; | ||
4550 | |||
4551 | @@ -1136,11 +1137,19 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) | ||
4552 | ti->error = "Cannot get origin device"; | ||
4553 | goto bad_origin; | ||
4554 | } | ||
4555 | + origin_dev = s->origin->bdev->bd_dev; | ||
4556 | |||
4557 | cow_path = argv[0]; | ||
4558 | argv++; | ||
4559 | argc--; | ||
4560 | |||
4561 | + cow_dev = dm_get_dev_t(cow_path); | ||
4562 | + if (cow_dev && cow_dev == origin_dev) { | ||
4563 | + ti->error = "COW device cannot be the same as origin device"; | ||
4564 | + r = -EINVAL; | ||
4565 | + goto bad_cow; | ||
4566 | + } | ||
4567 | + | ||
4568 | r = dm_get_device(ti, cow_path, dm_table_get_mode(ti->table), &s->cow); | ||
4569 | if (r) { | ||
4570 | ti->error = "Cannot get COW device"; | ||
4571 | diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c | ||
4572 | index 061152a43730..cb5d0daf53bb 100644 | ||
4573 | --- a/drivers/md/dm-table.c | ||
4574 | +++ b/drivers/md/dm-table.c | ||
4575 | @@ -365,6 +365,26 @@ static int upgrade_mode(struct dm_dev_internal *dd, fmode_t new_mode, | ||
4576 | } | ||
4577 | |||
4578 | /* | ||
4579 | + * Convert the path to a device | ||
4580 | + */ | ||
4581 | +dev_t dm_get_dev_t(const char *path) | ||
4582 | +{ | ||
4583 | + dev_t uninitialized_var(dev); | ||
4584 | + struct block_device *bdev; | ||
4585 | + | ||
4586 | + bdev = lookup_bdev(path); | ||
4587 | + if (IS_ERR(bdev)) | ||
4588 | + dev = name_to_dev_t(path); | ||
4589 | + else { | ||
4590 | + dev = bdev->bd_dev; | ||
4591 | + bdput(bdev); | ||
4592 | + } | ||
4593 | + | ||
4594 | + return dev; | ||
4595 | +} | ||
4596 | +EXPORT_SYMBOL_GPL(dm_get_dev_t); | ||
4597 | + | ||
4598 | +/* | ||
4599 | * Add a device to the list, or just increment the usage count if | ||
4600 | * it's already present. | ||
4601 | */ | ||
4602 | @@ -372,23 +392,15 @@ int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode, | ||
4603 | struct dm_dev **result) | ||
4604 | { | ||
4605 | int r; | ||
4606 | - dev_t uninitialized_var(dev); | ||
4607 | + dev_t dev; | ||
4608 | struct dm_dev_internal *dd; | ||
4609 | struct dm_table *t = ti->table; | ||
4610 | - struct block_device *bdev; | ||
4611 | |||
4612 | BUG_ON(!t); | ||
4613 | |||
4614 | - /* convert the path to a device */ | ||
4615 | - bdev = lookup_bdev(path); | ||
4616 | - if (IS_ERR(bdev)) { | ||
4617 | - dev = name_to_dev_t(path); | ||
4618 | - if (!dev) | ||
4619 | - return -ENODEV; | ||
4620 | - } else { | ||
4621 | - dev = bdev->bd_dev; | ||
4622 | - bdput(bdev); | ||
4623 | - } | ||
4624 | + dev = dm_get_dev_t(path); | ||
4625 | + if (!dev) | ||
4626 | + return -ENODEV; | ||
4627 | |||
4628 | dd = find_device(&t->devices, dev); | ||
4629 | if (!dd) { | ||
4630 | diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c | ||
4631 | index c219a053c7f6..911ada643364 100644 | ||
4632 | --- a/drivers/md/dm-thin-metadata.c | ||
4633 | +++ b/drivers/md/dm-thin-metadata.c | ||
4634 | @@ -1943,5 +1943,8 @@ bool dm_pool_metadata_needs_check(struct dm_pool_metadata *pmd) | ||
4635 | |||
4636 | void dm_pool_issue_prefetches(struct dm_pool_metadata *pmd) | ||
4637 | { | ||
4638 | - dm_tm_issue_prefetches(pmd->tm); | ||
4639 | + down_read(&pmd->root_lock); | ||
4640 | + if (!pmd->fail_io) | ||
4641 | + dm_tm_issue_prefetches(pmd->tm); | ||
4642 | + up_read(&pmd->root_lock); | ||
4643 | } | ||
4644 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c | ||
4645 | index dd834927bc66..c338aebb4ccd 100644 | ||
4646 | --- a/drivers/md/dm.c | ||
4647 | +++ b/drivers/md/dm.c | ||
4648 | @@ -1109,12 +1109,8 @@ static void rq_completed(struct mapped_device *md, int rw, bool run_queue) | ||
4649 | * back into ->request_fn() could deadlock attempting to grab the | ||
4650 | * queue lock again. | ||
4651 | */ | ||
4652 | - if (run_queue) { | ||
4653 | - if (md->queue->mq_ops) | ||
4654 | - blk_mq_run_hw_queues(md->queue, true); | ||
4655 | - else | ||
4656 | - blk_run_queue_async(md->queue); | ||
4657 | - } | ||
4658 | + if (!md->queue->mq_ops && run_queue) | ||
4659 | + blk_run_queue_async(md->queue); | ||
4660 | |||
4661 | /* | ||
4662 | * dm_put() must be at the end of this function. See the comment above | ||
4663 | @@ -1214,9 +1210,9 @@ static void dm_requeue_original_request(struct mapped_device *md, | ||
4664 | { | ||
4665 | int rw = rq_data_dir(rq); | ||
4666 | |||
4667 | + rq_end_stats(md, rq); | ||
4668 | dm_unprep_request(rq); | ||
4669 | |||
4670 | - rq_end_stats(md, rq); | ||
4671 | if (!rq->q->mq_ops) | ||
4672 | old_requeue_request(rq); | ||
4673 | else { | ||
4674 | @@ -1336,7 +1332,10 @@ static void dm_complete_request(struct request *rq, int error) | ||
4675 | struct dm_rq_target_io *tio = tio_from_request(rq); | ||
4676 | |||
4677 | tio->error = error; | ||
4678 | - blk_complete_request(rq); | ||
4679 | + if (!rq->q->mq_ops) | ||
4680 | + blk_complete_request(rq); | ||
4681 | + else | ||
4682 | + blk_mq_complete_request(rq, error); | ||
4683 | } | ||
4684 | |||
4685 | /* | ||
4686 | diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c | ||
4687 | index 0a72ab6e6c20..dd483bb2e111 100644 | ||
4688 | --- a/drivers/md/multipath.c | ||
4689 | +++ b/drivers/md/multipath.c | ||
4690 | @@ -129,7 +129,9 @@ static void multipath_make_request(struct mddev *mddev, struct bio * bio) | ||
4691 | } | ||
4692 | multipath = conf->multipaths + mp_bh->path; | ||
4693 | |||
4694 | - mp_bh->bio = *bio; | ||
4695 | + bio_init(&mp_bh->bio); | ||
4696 | + __bio_clone_fast(&mp_bh->bio, bio); | ||
4697 | + | ||
4698 | mp_bh->bio.bi_iter.bi_sector += multipath->rdev->data_offset; | ||
4699 | mp_bh->bio.bi_bdev = multipath->rdev->bdev; | ||
4700 | mp_bh->bio.bi_rw |= REQ_FAILFAST_TRANSPORT; | ||
4701 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c | ||
4702 | index c4b913409226..515554c7365b 100644 | ||
4703 | --- a/drivers/md/raid1.c | ||
4704 | +++ b/drivers/md/raid1.c | ||
4705 | @@ -2274,6 +2274,7 @@ static void handle_write_finished(struct r1conf *conf, struct r1bio *r1_bio) | ||
4706 | if (fail) { | ||
4707 | spin_lock_irq(&conf->device_lock); | ||
4708 | list_add(&r1_bio->retry_list, &conf->bio_end_io_list); | ||
4709 | + conf->nr_queued++; | ||
4710 | spin_unlock_irq(&conf->device_lock); | ||
4711 | md_wakeup_thread(conf->mddev->thread); | ||
4712 | } else { | ||
4713 | @@ -2391,8 +2392,10 @@ static void raid1d(struct md_thread *thread) | ||
4714 | LIST_HEAD(tmp); | ||
4715 | spin_lock_irqsave(&conf->device_lock, flags); | ||
4716 | if (!test_bit(MD_CHANGE_PENDING, &mddev->flags)) { | ||
4717 | - list_add(&tmp, &conf->bio_end_io_list); | ||
4718 | - list_del_init(&conf->bio_end_io_list); | ||
4719 | + while (!list_empty(&conf->bio_end_io_list)) { | ||
4720 | + list_move(conf->bio_end_io_list.prev, &tmp); | ||
4721 | + conf->nr_queued--; | ||
4722 | + } | ||
4723 | } | ||
4724 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
4725 | while (!list_empty(&tmp)) { | ||
4726 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
4727 | index ce959b4ae4df..ebb0dd612ebd 100644 | ||
4728 | --- a/drivers/md/raid10.c | ||
4729 | +++ b/drivers/md/raid10.c | ||
4730 | @@ -2664,6 +2664,7 @@ static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio) | ||
4731 | if (fail) { | ||
4732 | spin_lock_irq(&conf->device_lock); | ||
4733 | list_add(&r10_bio->retry_list, &conf->bio_end_io_list); | ||
4734 | + conf->nr_queued++; | ||
4735 | spin_unlock_irq(&conf->device_lock); | ||
4736 | md_wakeup_thread(conf->mddev->thread); | ||
4737 | } else { | ||
4738 | @@ -2691,8 +2692,10 @@ static void raid10d(struct md_thread *thread) | ||
4739 | LIST_HEAD(tmp); | ||
4740 | spin_lock_irqsave(&conf->device_lock, flags); | ||
4741 | if (!test_bit(MD_CHANGE_PENDING, &mddev->flags)) { | ||
4742 | - list_add(&tmp, &conf->bio_end_io_list); | ||
4743 | - list_del_init(&conf->bio_end_io_list); | ||
4744 | + while (!list_empty(&conf->bio_end_io_list)) { | ||
4745 | + list_move(conf->bio_end_io_list.prev, &tmp); | ||
4746 | + conf->nr_queued--; | ||
4747 | + } | ||
4748 | } | ||
4749 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
4750 | while (!list_empty(&tmp)) { | ||
4751 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c | ||
4752 | index 704ef7fcfbf8..10ce885445f6 100644 | ||
4753 | --- a/drivers/md/raid5.c | ||
4754 | +++ b/drivers/md/raid5.c | ||
4755 | @@ -340,8 +340,7 @@ static void release_inactive_stripe_list(struct r5conf *conf, | ||
4756 | int hash) | ||
4757 | { | ||
4758 | int size; | ||
4759 | - unsigned long do_wakeup = 0; | ||
4760 | - int i = 0; | ||
4761 | + bool do_wakeup = false; | ||
4762 | unsigned long flags; | ||
4763 | |||
4764 | if (hash == NR_STRIPE_HASH_LOCKS) { | ||
4765 | @@ -362,19 +361,15 @@ static void release_inactive_stripe_list(struct r5conf *conf, | ||
4766 | !list_empty(list)) | ||
4767 | atomic_dec(&conf->empty_inactive_list_nr); | ||
4768 | list_splice_tail_init(list, conf->inactive_list + hash); | ||
4769 | - do_wakeup |= 1 << hash; | ||
4770 | + do_wakeup = true; | ||
4771 | spin_unlock_irqrestore(conf->hash_locks + hash, flags); | ||
4772 | } | ||
4773 | size--; | ||
4774 | hash--; | ||
4775 | } | ||
4776 | |||
4777 | - for (i = 0; i < NR_STRIPE_HASH_LOCKS; i++) { | ||
4778 | - if (do_wakeup & (1 << i)) | ||
4779 | - wake_up(&conf->wait_for_stripe[i]); | ||
4780 | - } | ||
4781 | - | ||
4782 | if (do_wakeup) { | ||
4783 | + wake_up(&conf->wait_for_stripe); | ||
4784 | if (atomic_read(&conf->active_stripes) == 0) | ||
4785 | wake_up(&conf->wait_for_quiescent); | ||
4786 | if (conf->retry_read_aligned) | ||
4787 | @@ -687,15 +682,14 @@ raid5_get_active_stripe(struct r5conf *conf, sector_t sector, | ||
4788 | if (!sh) { | ||
4789 | set_bit(R5_INACTIVE_BLOCKED, | ||
4790 | &conf->cache_state); | ||
4791 | - wait_event_exclusive_cmd( | ||
4792 | - conf->wait_for_stripe[hash], | ||
4793 | + wait_event_lock_irq( | ||
4794 | + conf->wait_for_stripe, | ||
4795 | !list_empty(conf->inactive_list + hash) && | ||
4796 | (atomic_read(&conf->active_stripes) | ||
4797 | < (conf->max_nr_stripes * 3 / 4) | ||
4798 | || !test_bit(R5_INACTIVE_BLOCKED, | ||
4799 | &conf->cache_state)), | ||
4800 | - spin_unlock_irq(conf->hash_locks + hash), | ||
4801 | - spin_lock_irq(conf->hash_locks + hash)); | ||
4802 | + *(conf->hash_locks + hash)); | ||
4803 | clear_bit(R5_INACTIVE_BLOCKED, | ||
4804 | &conf->cache_state); | ||
4805 | } else { | ||
4806 | @@ -720,9 +714,6 @@ raid5_get_active_stripe(struct r5conf *conf, sector_t sector, | ||
4807 | } | ||
4808 | } while (sh == NULL); | ||
4809 | |||
4810 | - if (!list_empty(conf->inactive_list + hash)) | ||
4811 | - wake_up(&conf->wait_for_stripe[hash]); | ||
4812 | - | ||
4813 | spin_unlock_irq(conf->hash_locks + hash); | ||
4814 | return sh; | ||
4815 | } | ||
4816 | @@ -2091,6 +2082,14 @@ static int resize_chunks(struct r5conf *conf, int new_disks, int new_sectors) | ||
4817 | unsigned long cpu; | ||
4818 | int err = 0; | ||
4819 | |||
4820 | + /* | ||
4821 | + * Never shrink. And mddev_suspend() could deadlock if this is called | ||
4822 | + * from raid5d. In that case, scribble_disks and scribble_sectors | ||
4823 | + * should equal to new_disks and new_sectors | ||
4824 | + */ | ||
4825 | + if (conf->scribble_disks >= new_disks && | ||
4826 | + conf->scribble_sectors >= new_sectors) | ||
4827 | + return 0; | ||
4828 | mddev_suspend(conf->mddev); | ||
4829 | get_online_cpus(); | ||
4830 | for_each_present_cpu(cpu) { | ||
4831 | @@ -2112,6 +2111,10 @@ static int resize_chunks(struct r5conf *conf, int new_disks, int new_sectors) | ||
4832 | } | ||
4833 | put_online_cpus(); | ||
4834 | mddev_resume(conf->mddev); | ||
4835 | + if (!err) { | ||
4836 | + conf->scribble_disks = new_disks; | ||
4837 | + conf->scribble_sectors = new_sectors; | ||
4838 | + } | ||
4839 | return err; | ||
4840 | } | ||
4841 | |||
4842 | @@ -2192,7 +2195,7 @@ static int resize_stripes(struct r5conf *conf, int newsize) | ||
4843 | cnt = 0; | ||
4844 | list_for_each_entry(nsh, &newstripes, lru) { | ||
4845 | lock_device_hash_lock(conf, hash); | ||
4846 | - wait_event_exclusive_cmd(conf->wait_for_stripe[hash], | ||
4847 | + wait_event_cmd(conf->wait_for_stripe, | ||
4848 | !list_empty(conf->inactive_list + hash), | ||
4849 | unlock_device_hash_lock(conf, hash), | ||
4850 | lock_device_hash_lock(conf, hash)); | ||
4851 | @@ -4238,7 +4241,6 @@ static void break_stripe_batch_list(struct stripe_head *head_sh, | ||
4852 | WARN_ON_ONCE(sh->state & ((1 << STRIPE_ACTIVE) | | ||
4853 | (1 << STRIPE_SYNCING) | | ||
4854 | (1 << STRIPE_REPLACED) | | ||
4855 | - (1 << STRIPE_PREREAD_ACTIVE) | | ||
4856 | (1 << STRIPE_DELAYED) | | ||
4857 | (1 << STRIPE_BIT_DELAY) | | ||
4858 | (1 << STRIPE_FULL_WRITE) | | ||
4859 | @@ -4253,6 +4255,7 @@ static void break_stripe_batch_list(struct stripe_head *head_sh, | ||
4860 | (1 << STRIPE_REPLACED))); | ||
4861 | |||
4862 | set_mask_bits(&sh->state, ~(STRIPE_EXPAND_SYNC_FLAGS | | ||
4863 | + (1 << STRIPE_PREREAD_ACTIVE) | | ||
4864 | (1 << STRIPE_DEGRADED)), | ||
4865 | head_sh->state & (1 << STRIPE_INSYNC)); | ||
4866 | |||
4867 | @@ -6414,6 +6417,12 @@ static int raid5_alloc_percpu(struct r5conf *conf) | ||
4868 | } | ||
4869 | put_online_cpus(); | ||
4870 | |||
4871 | + if (!err) { | ||
4872 | + conf->scribble_disks = max(conf->raid_disks, | ||
4873 | + conf->previous_raid_disks); | ||
4874 | + conf->scribble_sectors = max(conf->chunk_sectors, | ||
4875 | + conf->prev_chunk_sectors); | ||
4876 | + } | ||
4877 | return err; | ||
4878 | } | ||
4879 | |||
4880 | @@ -6504,9 +6513,7 @@ static struct r5conf *setup_conf(struct mddev *mddev) | ||
4881 | seqcount_init(&conf->gen_lock); | ||
4882 | mutex_init(&conf->cache_size_mutex); | ||
4883 | init_waitqueue_head(&conf->wait_for_quiescent); | ||
4884 | - for (i = 0; i < NR_STRIPE_HASH_LOCKS; i++) { | ||
4885 | - init_waitqueue_head(&conf->wait_for_stripe[i]); | ||
4886 | - } | ||
4887 | + init_waitqueue_head(&conf->wait_for_stripe); | ||
4888 | init_waitqueue_head(&conf->wait_for_overlap); | ||
4889 | INIT_LIST_HEAD(&conf->handle_list); | ||
4890 | INIT_LIST_HEAD(&conf->hold_list); | ||
4891 | @@ -7015,8 +7022,8 @@ static int run(struct mddev *mddev) | ||
4892 | } | ||
4893 | |||
4894 | if (discard_supported && | ||
4895 | - mddev->queue->limits.max_discard_sectors >= stripe && | ||
4896 | - mddev->queue->limits.discard_granularity >= stripe) | ||
4897 | + mddev->queue->limits.max_discard_sectors >= (stripe >> 9) && | ||
4898 | + mddev->queue->limits.discard_granularity >= stripe) | ||
4899 | queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, | ||
4900 | mddev->queue); | ||
4901 | else | ||
4902 | diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h | ||
4903 | index a415e1cd39b8..517d4b68a1be 100644 | ||
4904 | --- a/drivers/md/raid5.h | ||
4905 | +++ b/drivers/md/raid5.h | ||
4906 | @@ -510,6 +510,8 @@ struct r5conf { | ||
4907 | * conversions | ||
4908 | */ | ||
4909 | } __percpu *percpu; | ||
4910 | + int scribble_disks; | ||
4911 | + int scribble_sectors; | ||
4912 | #ifdef CONFIG_HOTPLUG_CPU | ||
4913 | struct notifier_block cpu_notify; | ||
4914 | #endif | ||
4915 | @@ -522,7 +524,7 @@ struct r5conf { | ||
4916 | atomic_t empty_inactive_list_nr; | ||
4917 | struct llist_head released_stripes; | ||
4918 | wait_queue_head_t wait_for_quiescent; | ||
4919 | - wait_queue_head_t wait_for_stripe[NR_STRIPE_HASH_LOCKS]; | ||
4920 | + wait_queue_head_t wait_for_stripe; | ||
4921 | wait_queue_head_t wait_for_overlap; | ||
4922 | unsigned long cache_state; | ||
4923 | #define R5_INACTIVE_BLOCKED 1 /* release of inactive stripes blocked, | ||
4924 | diff --git a/drivers/media/i2c/adv7511.c b/drivers/media/i2c/adv7511.c | ||
4925 | index e4900df1140b..c24839cfcc35 100644 | ||
4926 | --- a/drivers/media/i2c/adv7511.c | ||
4927 | +++ b/drivers/media/i2c/adv7511.c | ||
4928 | @@ -1161,12 +1161,23 @@ static void adv7511_dbg_dump_edid(int lvl, int debug, struct v4l2_subdev *sd, in | ||
4929 | } | ||
4930 | } | ||
4931 | |||
4932 | +static void adv7511_notify_no_edid(struct v4l2_subdev *sd) | ||
4933 | +{ | ||
4934 | + struct adv7511_state *state = get_adv7511_state(sd); | ||
4935 | + struct adv7511_edid_detect ed; | ||
4936 | + | ||
4937 | + /* We failed to read the EDID, so send an event for this. */ | ||
4938 | + ed.present = false; | ||
4939 | + ed.segment = adv7511_rd(sd, 0xc4); | ||
4940 | + v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed); | ||
4941 | + v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, 0x0); | ||
4942 | +} | ||
4943 | + | ||
4944 | static void adv7511_edid_handler(struct work_struct *work) | ||
4945 | { | ||
4946 | struct delayed_work *dwork = to_delayed_work(work); | ||
4947 | struct adv7511_state *state = container_of(dwork, struct adv7511_state, edid_handler); | ||
4948 | struct v4l2_subdev *sd = &state->sd; | ||
4949 | - struct adv7511_edid_detect ed; | ||
4950 | |||
4951 | v4l2_dbg(1, debug, sd, "%s:\n", __func__); | ||
4952 | |||
4953 | @@ -1191,9 +1202,7 @@ static void adv7511_edid_handler(struct work_struct *work) | ||
4954 | } | ||
4955 | |||
4956 | /* We failed to read the EDID, so send an event for this. */ | ||
4957 | - ed.present = false; | ||
4958 | - ed.segment = adv7511_rd(sd, 0xc4); | ||
4959 | - v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed); | ||
4960 | + adv7511_notify_no_edid(sd); | ||
4961 | v4l2_dbg(1, debug, sd, "%s: no edid found\n", __func__); | ||
4962 | } | ||
4963 | |||
4964 | @@ -1264,7 +1273,6 @@ static void adv7511_check_monitor_present_status(struct v4l2_subdev *sd) | ||
4965 | /* update read only ctrls */ | ||
4966 | v4l2_ctrl_s_ctrl(state->hotplug_ctrl, adv7511_have_hotplug(sd) ? 0x1 : 0x0); | ||
4967 | v4l2_ctrl_s_ctrl(state->rx_sense_ctrl, adv7511_have_rx_sense(sd) ? 0x1 : 0x0); | ||
4968 | - v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 0x0); | ||
4969 | |||
4970 | if ((status & MASK_ADV7511_HPD_DETECT) && ((status & MASK_ADV7511_MSEN_DETECT) || state->edid.segments)) { | ||
4971 | v4l2_dbg(1, debug, sd, "%s: hotplug and (rx-sense or edid)\n", __func__); | ||
4972 | @@ -1294,6 +1302,7 @@ static void adv7511_check_monitor_present_status(struct v4l2_subdev *sd) | ||
4973 | } | ||
4974 | adv7511_s_power(sd, false); | ||
4975 | memset(&state->edid, 0, sizeof(struct adv7511_state_edid)); | ||
4976 | + adv7511_notify_no_edid(sd); | ||
4977 | } | ||
4978 | } | ||
4979 | |||
4980 | @@ -1370,6 +1379,7 @@ static bool adv7511_check_edid_status(struct v4l2_subdev *sd) | ||
4981 | } | ||
4982 | /* one more segment read ok */ | ||
4983 | state->edid.segments = segment + 1; | ||
4984 | + v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, 0x1); | ||
4985 | if (((state->edid.data[0x7e] >> 1) + 1) > state->edid.segments) { | ||
4986 | /* Request next EDID segment */ | ||
4987 | v4l2_dbg(1, debug, sd, "%s: request segment %d\n", __func__, state->edid.segments); | ||
4988 | @@ -1389,7 +1399,6 @@ static bool adv7511_check_edid_status(struct v4l2_subdev *sd) | ||
4989 | ed.present = true; | ||
4990 | ed.segment = 0; | ||
4991 | state->edid_detect_counter++; | ||
4992 | - v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 0x0); | ||
4993 | v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed); | ||
4994 | return ed.present; | ||
4995 | } | ||
4996 | diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c | ||
4997 | index 15a4ebc2844d..51dbef2f9a48 100644 | ||
4998 | --- a/drivers/media/pci/bt8xx/bttv-driver.c | ||
4999 | +++ b/drivers/media/pci/bt8xx/bttv-driver.c | ||
5000 | @@ -2334,6 +2334,19 @@ static int bttv_g_fmt_vid_overlay(struct file *file, void *priv, | ||
5001 | return 0; | ||
5002 | } | ||
5003 | |||
5004 | +static void bttv_get_width_mask_vid_cap(const struct bttv_format *fmt, | ||
5005 | + unsigned int *width_mask, | ||
5006 | + unsigned int *width_bias) | ||
5007 | +{ | ||
5008 | + if (fmt->flags & FORMAT_FLAGS_PLANAR) { | ||
5009 | + *width_mask = ~15; /* width must be a multiple of 16 pixels */ | ||
5010 | + *width_bias = 8; /* nearest */ | ||
5011 | + } else { | ||
5012 | + *width_mask = ~3; /* width must be a multiple of 4 pixels */ | ||
5013 | + *width_bias = 2; /* nearest */ | ||
5014 | + } | ||
5015 | +} | ||
5016 | + | ||
5017 | static int bttv_try_fmt_vid_cap(struct file *file, void *priv, | ||
5018 | struct v4l2_format *f) | ||
5019 | { | ||
5020 | @@ -2343,6 +2356,7 @@ static int bttv_try_fmt_vid_cap(struct file *file, void *priv, | ||
5021 | enum v4l2_field field; | ||
5022 | __s32 width, height; | ||
5023 | __s32 height2; | ||
5024 | + unsigned int width_mask, width_bias; | ||
5025 | int rc; | ||
5026 | |||
5027 | fmt = format_by_fourcc(f->fmt.pix.pixelformat); | ||
5028 | @@ -2375,9 +2389,9 @@ static int bttv_try_fmt_vid_cap(struct file *file, void *priv, | ||
5029 | width = f->fmt.pix.width; | ||
5030 | height = f->fmt.pix.height; | ||
5031 | |||
5032 | + bttv_get_width_mask_vid_cap(fmt, &width_mask, &width_bias); | ||
5033 | rc = limit_scaled_size_lock(fh, &width, &height, field, | ||
5034 | - /* width_mask: 4 pixels */ ~3, | ||
5035 | - /* width_bias: nearest */ 2, | ||
5036 | + width_mask, width_bias, | ||
5037 | /* adjust_size */ 1, | ||
5038 | /* adjust_crop */ 0); | ||
5039 | if (0 != rc) | ||
5040 | @@ -2410,6 +2424,7 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv, | ||
5041 | struct bttv_fh *fh = priv; | ||
5042 | struct bttv *btv = fh->btv; | ||
5043 | __s32 width, height; | ||
5044 | + unsigned int width_mask, width_bias; | ||
5045 | enum v4l2_field field; | ||
5046 | |||
5047 | retval = bttv_switch_type(fh, f->type); | ||
5048 | @@ -2424,9 +2439,10 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv, | ||
5049 | height = f->fmt.pix.height; | ||
5050 | field = f->fmt.pix.field; | ||
5051 | |||
5052 | + fmt = format_by_fourcc(f->fmt.pix.pixelformat); | ||
5053 | + bttv_get_width_mask_vid_cap(fmt, &width_mask, &width_bias); | ||
5054 | retval = limit_scaled_size_lock(fh, &width, &height, f->fmt.pix.field, | ||
5055 | - /* width_mask: 4 pixels */ ~3, | ||
5056 | - /* width_bias: nearest */ 2, | ||
5057 | + width_mask, width_bias, | ||
5058 | /* adjust_size */ 1, | ||
5059 | /* adjust_crop */ 1); | ||
5060 | if (0 != retval) | ||
5061 | @@ -2434,8 +2450,6 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv, | ||
5062 | |||
5063 | f->fmt.pix.field = field; | ||
5064 | |||
5065 | - fmt = format_by_fourcc(f->fmt.pix.pixelformat); | ||
5066 | - | ||
5067 | /* update our state informations */ | ||
5068 | fh->fmt = fmt; | ||
5069 | fh->cap.field = f->fmt.pix.field; | ||
5070 | diff --git a/drivers/media/pci/saa7134/saa7134-video.c b/drivers/media/pci/saa7134/saa7134-video.c | ||
5071 | index 518086c7aed5..15e56c07b217 100644 | ||
5072 | --- a/drivers/media/pci/saa7134/saa7134-video.c | ||
5073 | +++ b/drivers/media/pci/saa7134/saa7134-video.c | ||
5074 | @@ -1219,10 +1219,13 @@ static int saa7134_g_fmt_vid_cap(struct file *file, void *priv, | ||
5075 | f->fmt.pix.height = dev->height; | ||
5076 | f->fmt.pix.field = dev->field; | ||
5077 | f->fmt.pix.pixelformat = dev->fmt->fourcc; | ||
5078 | - f->fmt.pix.bytesperline = | ||
5079 | - (f->fmt.pix.width * dev->fmt->depth) >> 3; | ||
5080 | + if (dev->fmt->planar) | ||
5081 | + f->fmt.pix.bytesperline = f->fmt.pix.width; | ||
5082 | + else | ||
5083 | + f->fmt.pix.bytesperline = | ||
5084 | + (f->fmt.pix.width * dev->fmt->depth) / 8; | ||
5085 | f->fmt.pix.sizeimage = | ||
5086 | - f->fmt.pix.height * f->fmt.pix.bytesperline; | ||
5087 | + (f->fmt.pix.height * f->fmt.pix.width * dev->fmt->depth) / 8; | ||
5088 | f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; | ||
5089 | return 0; | ||
5090 | } | ||
5091 | @@ -1298,10 +1301,13 @@ static int saa7134_try_fmt_vid_cap(struct file *file, void *priv, | ||
5092 | if (f->fmt.pix.height > maxh) | ||
5093 | f->fmt.pix.height = maxh; | ||
5094 | f->fmt.pix.width &= ~0x03; | ||
5095 | - f->fmt.pix.bytesperline = | ||
5096 | - (f->fmt.pix.width * fmt->depth) >> 3; | ||
5097 | + if (fmt->planar) | ||
5098 | + f->fmt.pix.bytesperline = f->fmt.pix.width; | ||
5099 | + else | ||
5100 | + f->fmt.pix.bytesperline = | ||
5101 | + (f->fmt.pix.width * fmt->depth) / 8; | ||
5102 | f->fmt.pix.sizeimage = | ||
5103 | - f->fmt.pix.height * f->fmt.pix.bytesperline; | ||
5104 | + (f->fmt.pix.height * f->fmt.pix.width * fmt->depth) / 8; | ||
5105 | f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; | ||
5106 | |||
5107 | return 0; | ||
5108 | diff --git a/drivers/media/platform/coda/coda-bit.c b/drivers/media/platform/coda/coda-bit.c | ||
5109 | index 654e964f84a2..d76511c1c1e3 100644 | ||
5110 | --- a/drivers/media/platform/coda/coda-bit.c | ||
5111 | +++ b/drivers/media/platform/coda/coda-bit.c | ||
5112 | @@ -1342,7 +1342,7 @@ static void coda_finish_encode(struct coda_ctx *ctx) | ||
5113 | |||
5114 | /* Calculate bytesused field */ | ||
5115 | if (dst_buf->sequence == 0) { | ||
5116 | - vb2_set_plane_payload(&dst_buf->vb2_buf, 0, | ||
5117 | + vb2_set_plane_payload(&dst_buf->vb2_buf, 0, wr_ptr - start_ptr + | ||
5118 | ctx->vpu_header_size[0] + | ||
5119 | ctx->vpu_header_size[1] + | ||
5120 | ctx->vpu_header_size[2]); | ||
5121 | diff --git a/drivers/media/usb/pwc/pwc-if.c b/drivers/media/usb/pwc/pwc-if.c | ||
5122 | index b79c36fd8cd2..58f23bcfe94e 100644 | ||
5123 | --- a/drivers/media/usb/pwc/pwc-if.c | ||
5124 | +++ b/drivers/media/usb/pwc/pwc-if.c | ||
5125 | @@ -91,6 +91,7 @@ static const struct usb_device_id pwc_device_table [] = { | ||
5126 | { USB_DEVICE(0x0471, 0x0312) }, | ||
5127 | { USB_DEVICE(0x0471, 0x0313) }, /* the 'new' 720K */ | ||
5128 | { USB_DEVICE(0x0471, 0x0329) }, /* Philips SPC 900NC PC Camera */ | ||
5129 | + { USB_DEVICE(0x0471, 0x032C) }, /* Philips SPC 880NC PC Camera */ | ||
5130 | { USB_DEVICE(0x069A, 0x0001) }, /* Askey */ | ||
5131 | { USB_DEVICE(0x046D, 0x08B0) }, /* Logitech QuickCam Pro 3000 */ | ||
5132 | { USB_DEVICE(0x046D, 0x08B1) }, /* Logitech QuickCam Notebook Pro */ | ||
5133 | @@ -811,6 +812,11 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id | ||
5134 | name = "Philips SPC 900NC webcam"; | ||
5135 | type_id = 740; | ||
5136 | break; | ||
5137 | + case 0x032C: | ||
5138 | + PWC_INFO("Philips SPC 880NC USB webcam detected.\n"); | ||
5139 | + name = "Philips SPC 880NC webcam"; | ||
5140 | + type_id = 740; | ||
5141 | + break; | ||
5142 | default: | ||
5143 | return -ENODEV; | ||
5144 | break; | ||
5145 | diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c | ||
5146 | index 327e83ac2469..f38c076752ce 100644 | ||
5147 | --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c | ||
5148 | +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c | ||
5149 | @@ -415,7 +415,8 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user | ||
5150 | get_user(kp->index, &up->index) || | ||
5151 | get_user(kp->type, &up->type) || | ||
5152 | get_user(kp->flags, &up->flags) || | ||
5153 | - get_user(kp->memory, &up->memory)) | ||
5154 | + get_user(kp->memory, &up->memory) || | ||
5155 | + get_user(kp->length, &up->length)) | ||
5156 | return -EFAULT; | ||
5157 | |||
5158 | if (V4L2_TYPE_IS_OUTPUT(kp->type)) | ||
5159 | @@ -427,9 +428,6 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user | ||
5160 | return -EFAULT; | ||
5161 | |||
5162 | if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) { | ||
5163 | - if (get_user(kp->length, &up->length)) | ||
5164 | - return -EFAULT; | ||
5165 | - | ||
5166 | num_planes = kp->length; | ||
5167 | if (num_planes == 0) { | ||
5168 | kp->m.planes = NULL; | ||
5169 | @@ -462,16 +460,14 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user | ||
5170 | } else { | ||
5171 | switch (kp->memory) { | ||
5172 | case V4L2_MEMORY_MMAP: | ||
5173 | - if (get_user(kp->length, &up->length) || | ||
5174 | - get_user(kp->m.offset, &up->m.offset)) | ||
5175 | + if (get_user(kp->m.offset, &up->m.offset)) | ||
5176 | return -EFAULT; | ||
5177 | break; | ||
5178 | case V4L2_MEMORY_USERPTR: | ||
5179 | { | ||
5180 | compat_long_t tmp; | ||
5181 | |||
5182 | - if (get_user(kp->length, &up->length) || | ||
5183 | - get_user(tmp, &up->m.userptr)) | ||
5184 | + if (get_user(tmp, &up->m.userptr)) | ||
5185 | return -EFAULT; | ||
5186 | |||
5187 | kp->m.userptr = (unsigned long)compat_ptr(tmp); | ||
5188 | @@ -513,7 +509,8 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user | ||
5189 | copy_to_user(&up->timecode, &kp->timecode, sizeof(struct v4l2_timecode)) || | ||
5190 | put_user(kp->sequence, &up->sequence) || | ||
5191 | put_user(kp->reserved2, &up->reserved2) || | ||
5192 | - put_user(kp->reserved, &up->reserved)) | ||
5193 | + put_user(kp->reserved, &up->reserved) || | ||
5194 | + put_user(kp->length, &up->length)) | ||
5195 | return -EFAULT; | ||
5196 | |||
5197 | if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) { | ||
5198 | @@ -536,13 +533,11 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user | ||
5199 | } else { | ||
5200 | switch (kp->memory) { | ||
5201 | case V4L2_MEMORY_MMAP: | ||
5202 | - if (put_user(kp->length, &up->length) || | ||
5203 | - put_user(kp->m.offset, &up->m.offset)) | ||
5204 | + if (put_user(kp->m.offset, &up->m.offset)) | ||
5205 | return -EFAULT; | ||
5206 | break; | ||
5207 | case V4L2_MEMORY_USERPTR: | ||
5208 | - if (put_user(kp->length, &up->length) || | ||
5209 | - put_user(kp->m.userptr, &up->m.userptr)) | ||
5210 | + if (put_user(kp->m.userptr, &up->m.userptr)) | ||
5211 | return -EFAULT; | ||
5212 | break; | ||
5213 | case V4L2_MEMORY_OVERLAY: | ||
5214 | diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c | ||
5215 | index 0b05aa938799..1a173d0af694 100644 | ||
5216 | --- a/drivers/misc/mei/bus.c | ||
5217 | +++ b/drivers/misc/mei/bus.c | ||
5218 | @@ -53,6 +53,11 @@ ssize_t __mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length, | ||
5219 | bus = cl->dev; | ||
5220 | |||
5221 | mutex_lock(&bus->device_lock); | ||
5222 | + if (bus->dev_state != MEI_DEV_ENABLED) { | ||
5223 | + rets = -ENODEV; | ||
5224 | + goto out; | ||
5225 | + } | ||
5226 | + | ||
5227 | if (!mei_cl_is_connected(cl)) { | ||
5228 | rets = -ENODEV; | ||
5229 | goto out; | ||
5230 | @@ -109,6 +114,10 @@ ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length) | ||
5231 | bus = cl->dev; | ||
5232 | |||
5233 | mutex_lock(&bus->device_lock); | ||
5234 | + if (bus->dev_state != MEI_DEV_ENABLED) { | ||
5235 | + rets = -ENODEV; | ||
5236 | + goto out; | ||
5237 | + } | ||
5238 | |||
5239 | cb = mei_cl_read_cb(cl, NULL); | ||
5240 | if (cb) | ||
5241 | diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c | ||
5242 | index d8486168415a..553113eb1bdb 100644 | ||
5243 | --- a/drivers/mmc/card/block.c | ||
5244 | +++ b/drivers/mmc/card/block.c | ||
5245 | @@ -596,6 +596,14 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, | ||
5246 | struct mmc_card *card; | ||
5247 | int err = 0, ioc_err = 0; | ||
5248 | |||
5249 | + /* | ||
5250 | + * The caller must have CAP_SYS_RAWIO, and must be calling this on the | ||
5251 | + * whole block device, not on a partition. This prevents overspray | ||
5252 | + * between sibling partitions. | ||
5253 | + */ | ||
5254 | + if ((!capable(CAP_SYS_RAWIO)) || (bdev != bdev->bd_contains)) | ||
5255 | + return -EPERM; | ||
5256 | + | ||
5257 | idata = mmc_blk_ioctl_copy_from_user(ic_ptr); | ||
5258 | if (IS_ERR(idata)) | ||
5259 | return PTR_ERR(idata); | ||
5260 | @@ -638,6 +646,14 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev, | ||
5261 | int i, err = 0, ioc_err = 0; | ||
5262 | __u64 num_of_cmds; | ||
5263 | |||
5264 | + /* | ||
5265 | + * The caller must have CAP_SYS_RAWIO, and must be calling this on the | ||
5266 | + * whole block device, not on a partition. This prevents overspray | ||
5267 | + * between sibling partitions. | ||
5268 | + */ | ||
5269 | + if ((!capable(CAP_SYS_RAWIO)) || (bdev != bdev->bd_contains)) | ||
5270 | + return -EPERM; | ||
5271 | + | ||
5272 | if (copy_from_user(&num_of_cmds, &user->num_of_cmds, | ||
5273 | sizeof(num_of_cmds))) | ||
5274 | return -EFAULT; | ||
5275 | @@ -693,14 +709,6 @@ cmd_err: | ||
5276 | static int mmc_blk_ioctl(struct block_device *bdev, fmode_t mode, | ||
5277 | unsigned int cmd, unsigned long arg) | ||
5278 | { | ||
5279 | - /* | ||
5280 | - * The caller must have CAP_SYS_RAWIO, and must be calling this on the | ||
5281 | - * whole block device, not on a partition. This prevents overspray | ||
5282 | - * between sibling partitions. | ||
5283 | - */ | ||
5284 | - if ((!capable(CAP_SYS_RAWIO)) || (bdev != bdev->bd_contains)) | ||
5285 | - return -EPERM; | ||
5286 | - | ||
5287 | switch (cmd) { | ||
5288 | case MMC_IOC_CMD: | ||
5289 | return mmc_blk_ioctl_cmd(bdev, | ||
5290 | diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c | ||
5291 | index 1c1b45ef3faf..aad3243a48fc 100644 | ||
5292 | --- a/drivers/mmc/host/mmc_spi.c | ||
5293 | +++ b/drivers/mmc/host/mmc_spi.c | ||
5294 | @@ -1436,6 +1436,12 @@ static int mmc_spi_probe(struct spi_device *spi) | ||
5295 | host->pdata->cd_debounce); | ||
5296 | if (status != 0) | ||
5297 | goto fail_add_host; | ||
5298 | + | ||
5299 | + /* The platform has a CD GPIO signal that may support | ||
5300 | + * interrupts, so let mmc_gpiod_request_cd_irq() decide | ||
5301 | + * if polling is needed or not. | ||
5302 | + */ | ||
5303 | + mmc->caps &= ~MMC_CAP_NEEDS_POLL; | ||
5304 | mmc_gpiod_request_cd_irq(mmc); | ||
5305 | } | ||
5306 | |||
5307 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c | ||
5308 | index 8814eb6b83bf..1a802af827ed 100644 | ||
5309 | --- a/drivers/mmc/host/sdhci.c | ||
5310 | +++ b/drivers/mmc/host/sdhci.c | ||
5311 | @@ -666,9 +666,20 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) | ||
5312 | if (!data) | ||
5313 | target_timeout = cmd->busy_timeout * 1000; | ||
5314 | else { | ||
5315 | - target_timeout = data->timeout_ns / 1000; | ||
5316 | - if (host->clock) | ||
5317 | - target_timeout += data->timeout_clks / host->clock; | ||
5318 | + target_timeout = DIV_ROUND_UP(data->timeout_ns, 1000); | ||
5319 | + if (host->clock && data->timeout_clks) { | ||
5320 | + unsigned long long val; | ||
5321 | + | ||
5322 | + /* | ||
5323 | + * data->timeout_clks is in units of clock cycles. | ||
5324 | + * host->clock is in Hz. target_timeout is in us. | ||
5325 | + * Hence, us = 1000000 * cycles / Hz. Round up. | ||
5326 | + */ | ||
5327 | + val = 1000000 * data->timeout_clks; | ||
5328 | + if (do_div(val, host->clock)) | ||
5329 | + target_timeout++; | ||
5330 | + target_timeout += val; | ||
5331 | + } | ||
5332 | } | ||
5333 | |||
5334 | /* | ||
5335 | @@ -3095,14 +3106,14 @@ int sdhci_add_host(struct sdhci_host *host) | ||
5336 | if (caps[0] & SDHCI_TIMEOUT_CLK_UNIT) | ||
5337 | host->timeout_clk *= 1000; | ||
5338 | |||
5339 | + if (override_timeout_clk) | ||
5340 | + host->timeout_clk = override_timeout_clk; | ||
5341 | + | ||
5342 | mmc->max_busy_timeout = host->ops->get_max_timeout_count ? | ||
5343 | host->ops->get_max_timeout_count(host) : 1 << 27; | ||
5344 | mmc->max_busy_timeout /= host->timeout_clk; | ||
5345 | } | ||
5346 | |||
5347 | - if (override_timeout_clk) | ||
5348 | - host->timeout_clk = override_timeout_clk; | ||
5349 | - | ||
5350 | mmc->caps |= MMC_CAP_SDIO_IRQ | MMC_CAP_ERASE | MMC_CAP_CMD23; | ||
5351 | mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD; | ||
5352 | |||
5353 | diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c | ||
5354 | index ad9ffea7d659..6234eab38ff3 100644 | ||
5355 | --- a/drivers/mmc/host/sh_mmcif.c | ||
5356 | +++ b/drivers/mmc/host/sh_mmcif.c | ||
5357 | @@ -397,38 +397,26 @@ static void sh_mmcif_start_dma_tx(struct sh_mmcif_host *host) | ||
5358 | } | ||
5359 | |||
5360 | static struct dma_chan * | ||
5361 | -sh_mmcif_request_dma_one(struct sh_mmcif_host *host, | ||
5362 | - struct sh_mmcif_plat_data *pdata, | ||
5363 | - enum dma_transfer_direction direction) | ||
5364 | +sh_mmcif_request_dma_pdata(struct sh_mmcif_host *host, uintptr_t slave_id) | ||
5365 | { | ||
5366 | - struct dma_slave_config cfg = { 0, }; | ||
5367 | - struct dma_chan *chan; | ||
5368 | - void *slave_data = NULL; | ||
5369 | - struct resource *res; | ||
5370 | - struct device *dev = sh_mmcif_host_to_dev(host); | ||
5371 | dma_cap_mask_t mask; | ||
5372 | - int ret; | ||
5373 | |||
5374 | dma_cap_zero(mask); | ||
5375 | dma_cap_set(DMA_SLAVE, mask); | ||
5376 | + if (slave_id <= 0) | ||
5377 | + return NULL; | ||
5378 | |||
5379 | - if (pdata) | ||
5380 | - slave_data = direction == DMA_MEM_TO_DEV ? | ||
5381 | - (void *)pdata->slave_id_tx : | ||
5382 | - (void *)pdata->slave_id_rx; | ||
5383 | - | ||
5384 | - chan = dma_request_slave_channel_compat(mask, shdma_chan_filter, | ||
5385 | - slave_data, dev, | ||
5386 | - direction == DMA_MEM_TO_DEV ? "tx" : "rx"); | ||
5387 | - | ||
5388 | - dev_dbg(dev, "%s: %s: got channel %p\n", __func__, | ||
5389 | - direction == DMA_MEM_TO_DEV ? "TX" : "RX", chan); | ||
5390 | + return dma_request_channel(mask, shdma_chan_filter, (void *)slave_id); | ||
5391 | +} | ||
5392 | |||
5393 | - if (!chan) | ||
5394 | - return NULL; | ||
5395 | +static int sh_mmcif_dma_slave_config(struct sh_mmcif_host *host, | ||
5396 | + struct dma_chan *chan, | ||
5397 | + enum dma_transfer_direction direction) | ||
5398 | +{ | ||
5399 | + struct resource *res; | ||
5400 | + struct dma_slave_config cfg = { 0, }; | ||
5401 | |||
5402 | res = platform_get_resource(host->pd, IORESOURCE_MEM, 0); | ||
5403 | - | ||
5404 | cfg.direction = direction; | ||
5405 | |||
5406 | if (direction == DMA_DEV_TO_MEM) { | ||
5407 | @@ -439,38 +427,42 @@ sh_mmcif_request_dma_one(struct sh_mmcif_host *host, | ||
5408 | cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; | ||
5409 | } | ||
5410 | |||
5411 | - ret = dmaengine_slave_config(chan, &cfg); | ||
5412 | - if (ret < 0) { | ||
5413 | - dma_release_channel(chan); | ||
5414 | - return NULL; | ||
5415 | - } | ||
5416 | - | ||
5417 | - return chan; | ||
5418 | + return dmaengine_slave_config(chan, &cfg); | ||
5419 | } | ||
5420 | |||
5421 | -static void sh_mmcif_request_dma(struct sh_mmcif_host *host, | ||
5422 | - struct sh_mmcif_plat_data *pdata) | ||
5423 | +static void sh_mmcif_request_dma(struct sh_mmcif_host *host) | ||
5424 | { | ||
5425 | struct device *dev = sh_mmcif_host_to_dev(host); | ||
5426 | host->dma_active = false; | ||
5427 | |||
5428 | - if (pdata) { | ||
5429 | - if (pdata->slave_id_tx <= 0 || pdata->slave_id_rx <= 0) | ||
5430 | - return; | ||
5431 | - } else if (!dev->of_node) { | ||
5432 | - return; | ||
5433 | + /* We can only either use DMA for both Tx and Rx or not use it at all */ | ||
5434 | + if (IS_ENABLED(CONFIG_SUPERH) && dev->platform_data) { | ||
5435 | + struct sh_mmcif_plat_data *pdata = dev->platform_data; | ||
5436 | + | ||
5437 | + host->chan_tx = sh_mmcif_request_dma_pdata(host, | ||
5438 | + pdata->slave_id_tx); | ||
5439 | + host->chan_rx = sh_mmcif_request_dma_pdata(host, | ||
5440 | + pdata->slave_id_rx); | ||
5441 | + } else { | ||
5442 | + host->chan_tx = dma_request_slave_channel(dev, "tx"); | ||
5443 | + host->chan_rx = dma_request_slave_channel(dev, "rx"); | ||
5444 | } | ||
5445 | + dev_dbg(dev, "%s: got channel TX %p RX %p\n", __func__, host->chan_tx, | ||
5446 | + host->chan_rx); | ||
5447 | |||
5448 | - /* We can only either use DMA for both Tx and Rx or not use it at all */ | ||
5449 | - host->chan_tx = sh_mmcif_request_dma_one(host, pdata, DMA_MEM_TO_DEV); | ||
5450 | - if (!host->chan_tx) | ||
5451 | - return; | ||
5452 | + if (!host->chan_tx || !host->chan_rx || | ||
5453 | + sh_mmcif_dma_slave_config(host, host->chan_tx, DMA_MEM_TO_DEV) || | ||
5454 | + sh_mmcif_dma_slave_config(host, host->chan_rx, DMA_DEV_TO_MEM)) | ||
5455 | + goto error; | ||
5456 | |||
5457 | - host->chan_rx = sh_mmcif_request_dma_one(host, pdata, DMA_DEV_TO_MEM); | ||
5458 | - if (!host->chan_rx) { | ||
5459 | + return; | ||
5460 | + | ||
5461 | +error: | ||
5462 | + if (host->chan_tx) | ||
5463 | dma_release_channel(host->chan_tx); | ||
5464 | - host->chan_tx = NULL; | ||
5465 | - } | ||
5466 | + if (host->chan_rx) | ||
5467 | + dma_release_channel(host->chan_rx); | ||
5468 | + host->chan_tx = host->chan_rx = NULL; | ||
5469 | } | ||
5470 | |||
5471 | static void sh_mmcif_release_dma(struct sh_mmcif_host *host) | ||
5472 | @@ -1102,7 +1094,7 @@ static void sh_mmcif_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | ||
5473 | if (ios->power_mode == MMC_POWER_UP) { | ||
5474 | if (!host->card_present) { | ||
5475 | /* See if we also get DMA */ | ||
5476 | - sh_mmcif_request_dma(host, dev->platform_data); | ||
5477 | + sh_mmcif_request_dma(host); | ||
5478 | host->card_present = true; | ||
5479 | } | ||
5480 | sh_mmcif_set_power(host, ios); | ||
5481 | diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c | ||
5482 | index 43b3392ffee7..652d01832873 100644 | ||
5483 | --- a/drivers/mtd/onenand/onenand_base.c | ||
5484 | +++ b/drivers/mtd/onenand/onenand_base.c | ||
5485 | @@ -2599,6 +2599,7 @@ static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) | ||
5486 | */ | ||
5487 | static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs) | ||
5488 | { | ||
5489 | + struct onenand_chip *this = mtd->priv; | ||
5490 | int ret; | ||
5491 | |||
5492 | ret = onenand_block_isbad(mtd, ofs); | ||
5493 | @@ -2610,7 +2611,7 @@ static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs) | ||
5494 | } | ||
5495 | |||
5496 | onenand_get_device(mtd, FL_WRITING); | ||
5497 | - ret = mtd_block_markbad(mtd, ofs); | ||
5498 | + ret = this->block_markbad(mtd, ofs); | ||
5499 | onenand_release_device(mtd); | ||
5500 | return ret; | ||
5501 | } | ||
5502 | diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c | ||
5503 | index ed622fa29dfa..a4ac6fedac75 100644 | ||
5504 | --- a/drivers/net/ethernet/marvell/mvneta.c | ||
5505 | +++ b/drivers/net/ethernet/marvell/mvneta.c | ||
5506 | @@ -3404,7 +3404,7 @@ static int mvneta_probe(struct platform_device *pdev) | ||
5507 | dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; | ||
5508 | dev->hw_features |= dev->features; | ||
5509 | dev->vlan_features |= dev->features; | ||
5510 | - dev->priv_flags |= IFF_UNICAST_FLT; | ||
5511 | + dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE; | ||
5512 | dev->gso_max_segs = MVNETA_MAX_TSO_SEGS; | ||
5513 | |||
5514 | err = register_netdev(dev); | ||
5515 | diff --git a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c | ||
5516 | index 696852eb23c3..7a3f990c1935 100644 | ||
5517 | --- a/drivers/net/irda/irtty-sir.c | ||
5518 | +++ b/drivers/net/irda/irtty-sir.c | ||
5519 | @@ -430,16 +430,6 @@ static int irtty_open(struct tty_struct *tty) | ||
5520 | |||
5521 | /* Module stuff handled via irda_ldisc.owner - Jean II */ | ||
5522 | |||
5523 | - /* First make sure we're not already connected. */ | ||
5524 | - if (tty->disc_data != NULL) { | ||
5525 | - priv = tty->disc_data; | ||
5526 | - if (priv && priv->magic == IRTTY_MAGIC) { | ||
5527 | - ret = -EEXIST; | ||
5528 | - goto out; | ||
5529 | - } | ||
5530 | - tty->disc_data = NULL; /* ### */ | ||
5531 | - } | ||
5532 | - | ||
5533 | /* stop the underlying driver */ | ||
5534 | irtty_stop_receiver(tty, TRUE); | ||
5535 | if (tty->ops->stop) | ||
5536 | diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c | ||
5537 | index 01f08a7751f7..e7034c55e796 100644 | ||
5538 | --- a/drivers/net/rionet.c | ||
5539 | +++ b/drivers/net/rionet.c | ||
5540 | @@ -280,7 +280,7 @@ static void rionet_outb_msg_event(struct rio_mport *mport, void *dev_id, int mbo | ||
5541 | struct net_device *ndev = dev_id; | ||
5542 | struct rionet_private *rnet = netdev_priv(ndev); | ||
5543 | |||
5544 | - spin_lock(&rnet->lock); | ||
5545 | + spin_lock(&rnet->tx_lock); | ||
5546 | |||
5547 | if (netif_msg_intr(rnet)) | ||
5548 | printk(KERN_INFO | ||
5549 | @@ -299,7 +299,7 @@ static void rionet_outb_msg_event(struct rio_mport *mport, void *dev_id, int mbo | ||
5550 | if (rnet->tx_cnt < RIONET_TX_RING_SIZE) | ||
5551 | netif_wake_queue(ndev); | ||
5552 | |||
5553 | - spin_unlock(&rnet->lock); | ||
5554 | + spin_unlock(&rnet->tx_lock); | ||
5555 | } | ||
5556 | |||
5557 | static int rionet_open(struct net_device *ndev) | ||
5558 | diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c | ||
5559 | index d906fa13ba97..610c442c7ab2 100644 | ||
5560 | --- a/drivers/net/wireless/iwlwifi/mvm/fw.c | ||
5561 | +++ b/drivers/net/wireless/iwlwifi/mvm/fw.c | ||
5562 | @@ -106,7 +106,7 @@ static int iwl_send_tx_ant_cfg(struct iwl_mvm *mvm, u8 valid_tx_ant) | ||
5563 | sizeof(tx_ant_cmd), &tx_ant_cmd); | ||
5564 | } | ||
5565 | |||
5566 | -static void iwl_free_fw_paging(struct iwl_mvm *mvm) | ||
5567 | +void iwl_free_fw_paging(struct iwl_mvm *mvm) | ||
5568 | { | ||
5569 | int i; | ||
5570 | |||
5571 | @@ -126,6 +126,8 @@ static void iwl_free_fw_paging(struct iwl_mvm *mvm) | ||
5572 | get_order(mvm->fw_paging_db[i].fw_paging_size)); | ||
5573 | } | ||
5574 | kfree(mvm->trans->paging_download_buf); | ||
5575 | + mvm->trans->paging_download_buf = NULL; | ||
5576 | + | ||
5577 | memset(mvm->fw_paging_db, 0, sizeof(mvm->fw_paging_db)); | ||
5578 | } | ||
5579 | |||
5580 | diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h | ||
5581 | index 4bde2d027dcd..244e26c26821 100644 | ||
5582 | --- a/drivers/net/wireless/iwlwifi/mvm/mvm.h | ||
5583 | +++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h | ||
5584 | @@ -1190,6 +1190,9 @@ void iwl_mvm_rx_umac_scan_complete_notif(struct iwl_mvm *mvm, | ||
5585 | void iwl_mvm_rx_umac_scan_iter_complete_notif(struct iwl_mvm *mvm, | ||
5586 | struct iwl_rx_cmd_buffer *rxb); | ||
5587 | |||
5588 | +/* Paging */ | ||
5589 | +void iwl_free_fw_paging(struct iwl_mvm *mvm); | ||
5590 | + | ||
5591 | /* MVM debugfs */ | ||
5592 | #ifdef CONFIG_IWLWIFI_DEBUGFS | ||
5593 | int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir); | ||
5594 | diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c | ||
5595 | index 13c97f665ba8..c3adf2bcdc85 100644 | ||
5596 | --- a/drivers/net/wireless/iwlwifi/mvm/ops.c | ||
5597 | +++ b/drivers/net/wireless/iwlwifi/mvm/ops.c | ||
5598 | @@ -645,6 +645,8 @@ static void iwl_op_mode_mvm_stop(struct iwl_op_mode *op_mode) | ||
5599 | for (i = 0; i < NVM_MAX_NUM_SECTIONS; i++) | ||
5600 | kfree(mvm->nvm_sections[i].data); | ||
5601 | |||
5602 | + iwl_free_fw_paging(mvm); | ||
5603 | + | ||
5604 | iwl_mvm_tof_clean(mvm); | ||
5605 | |||
5606 | ieee80211_free_hw(mvm->hw); | ||
5607 | diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c | ||
5608 | index 7e2c43f701bc..496b9b662dc6 100644 | ||
5609 | --- a/drivers/nvdimm/bus.c | ||
5610 | +++ b/drivers/nvdimm/bus.c | ||
5611 | @@ -513,10 +513,10 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, | ||
5612 | |||
5613 | /* fail write commands (when read-only) */ | ||
5614 | if (read_only) | ||
5615 | - switch (ioctl_cmd) { | ||
5616 | - case ND_IOCTL_VENDOR: | ||
5617 | - case ND_IOCTL_SET_CONFIG_DATA: | ||
5618 | - case ND_IOCTL_ARS_START: | ||
5619 | + switch (cmd) { | ||
5620 | + case ND_CMD_VENDOR: | ||
5621 | + case ND_CMD_SET_CONFIG_DATA: | ||
5622 | + case ND_CMD_ARS_START: | ||
5623 | dev_dbg(&nvdimm_bus->dev, "'%s' command while read-only.\n", | ||
5624 | nvdimm ? nvdimm_cmd_name(cmd) | ||
5625 | : nvdimm_bus_cmd_name(cmd)); | ||
5626 | diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c | ||
5627 | index 1a3556a9e9ea..ed01c0172e4a 100644 | ||
5628 | --- a/drivers/of/of_reserved_mem.c | ||
5629 | +++ b/drivers/of/of_reserved_mem.c | ||
5630 | @@ -32,11 +32,13 @@ int __init __weak early_init_dt_alloc_reserved_memory_arch(phys_addr_t size, | ||
5631 | phys_addr_t align, phys_addr_t start, phys_addr_t end, bool nomap, | ||
5632 | phys_addr_t *res_base) | ||
5633 | { | ||
5634 | + phys_addr_t base; | ||
5635 | /* | ||
5636 | * We use __memblock_alloc_base() because memblock_alloc_base() | ||
5637 | * panic()s on allocation failure. | ||
5638 | */ | ||
5639 | - phys_addr_t base = __memblock_alloc_base(size, align, end); | ||
5640 | + end = !end ? MEMBLOCK_ALLOC_ANYWHERE : end; | ||
5641 | + base = __memblock_alloc_base(size, align, end); | ||
5642 | if (!base) | ||
5643 | return -ENOMEM; | ||
5644 | |||
5645 | diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c | ||
5646 | index edb1984201e9..7aafb5fb9336 100644 | ||
5647 | --- a/drivers/pci/probe.c | ||
5648 | +++ b/drivers/pci/probe.c | ||
5649 | @@ -179,6 +179,9 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | ||
5650 | u16 orig_cmd; | ||
5651 | struct pci_bus_region region, inverted_region; | ||
5652 | |||
5653 | + if (dev->non_compliant_bars) | ||
5654 | + return 0; | ||
5655 | + | ||
5656 | mask = type ? PCI_ROM_ADDRESS_MASK : ~0; | ||
5657 | |||
5658 | /* No printks while decoding is disabled! */ | ||
5659 | @@ -1174,6 +1177,7 @@ void pci_msi_setup_pci_dev(struct pci_dev *dev) | ||
5660 | int pci_setup_device(struct pci_dev *dev) | ||
5661 | { | ||
5662 | u32 class; | ||
5663 | + u16 cmd; | ||
5664 | u8 hdr_type; | ||
5665 | int pos = 0; | ||
5666 | struct pci_bus_region region; | ||
5667 | @@ -1219,6 +1223,16 @@ int pci_setup_device(struct pci_dev *dev) | ||
5668 | /* device class may be changed after fixup */ | ||
5669 | class = dev->class >> 8; | ||
5670 | |||
5671 | + if (dev->non_compliant_bars) { | ||
5672 | + pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||
5673 | + if (cmd & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { | ||
5674 | + dev_info(&dev->dev, "device has non-compliant BARs; disabling IO/MEM decoding\n"); | ||
5675 | + cmd &= ~PCI_COMMAND_IO; | ||
5676 | + cmd &= ~PCI_COMMAND_MEMORY; | ||
5677 | + pci_write_config_word(dev, PCI_COMMAND, cmd); | ||
5678 | + } | ||
5679 | + } | ||
5680 | + | ||
5681 | switch (dev->hdr_type) { /* header type */ | ||
5682 | case PCI_HEADER_TYPE_NORMAL: /* standard header */ | ||
5683 | if (class == PCI_CLASS_BRIDGE_PCI) | ||
5684 | diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c | ||
5685 | index 2e6ca69635aa..17dd8fe12b54 100644 | ||
5686 | --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c | ||
5687 | +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c | ||
5688 | @@ -779,7 +779,7 @@ static int bcm2835_pctl_dt_node_to_map(struct pinctrl_dev *pctldev, | ||
5689 | } | ||
5690 | if (num_pulls) { | ||
5691 | err = of_property_read_u32_index(np, "brcm,pull", | ||
5692 | - (num_funcs > 1) ? i : 0, &pull); | ||
5693 | + (num_pulls > 1) ? i : 0, &pull); | ||
5694 | if (err) | ||
5695 | goto out; | ||
5696 | err = bcm2835_pctl_dt_node_to_map_pull(pc, np, pin, | ||
5697 | diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c | ||
5698 | index d78ee151c9e4..be3bc2f4edd4 100644 | ||
5699 | --- a/drivers/platform/x86/ideapad-laptop.c | ||
5700 | +++ b/drivers/platform/x86/ideapad-laptop.c | ||
5701 | @@ -865,6 +865,20 @@ static const struct dmi_system_id no_hw_rfkill_list[] = { | ||
5702 | }, | ||
5703 | }, | ||
5704 | { | ||
5705 | + .ident = "Lenovo ideapad Y700-15ISK", | ||
5706 | + .matches = { | ||
5707 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
5708 | + DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad Y700-15ISK"), | ||
5709 | + }, | ||
5710 | + }, | ||
5711 | + { | ||
5712 | + .ident = "Lenovo ideapad Y700 Touch-15ISK", | ||
5713 | + .matches = { | ||
5714 | + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
5715 | + DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad Y700 Touch-15ISK"), | ||
5716 | + }, | ||
5717 | + }, | ||
5718 | + { | ||
5719 | .ident = "Lenovo ideapad Y700-17ISK", | ||
5720 | .matches = { | ||
5721 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
5722 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c | ||
5723 | index 73b7683355cd..7b94b8ee087c 100644 | ||
5724 | --- a/drivers/regulator/core.c | ||
5725 | +++ b/drivers/regulator/core.c | ||
5726 | @@ -132,24 +132,24 @@ static bool have_full_constraints(void) | ||
5727 | return has_full_constraints || of_have_populated_dt(); | ||
5728 | } | ||
5729 | |||
5730 | +static inline struct regulator_dev *rdev_get_supply(struct regulator_dev *rdev) | ||
5731 | +{ | ||
5732 | + if (rdev && rdev->supply) | ||
5733 | + return rdev->supply->rdev; | ||
5734 | + | ||
5735 | + return NULL; | ||
5736 | +} | ||
5737 | + | ||
5738 | /** | ||
5739 | * regulator_lock_supply - lock a regulator and its supplies | ||
5740 | * @rdev: regulator source | ||
5741 | */ | ||
5742 | static void regulator_lock_supply(struct regulator_dev *rdev) | ||
5743 | { | ||
5744 | - struct regulator *supply; | ||
5745 | - int i = 0; | ||
5746 | - | ||
5747 | - while (1) { | ||
5748 | - mutex_lock_nested(&rdev->mutex, i++); | ||
5749 | - supply = rdev->supply; | ||
5750 | - | ||
5751 | - if (!rdev->supply) | ||
5752 | - return; | ||
5753 | + int i; | ||
5754 | |||
5755 | - rdev = supply->rdev; | ||
5756 | - } | ||
5757 | + for (i = 0; rdev->supply; rdev = rdev_get_supply(rdev), i++) | ||
5758 | + mutex_lock_nested(&rdev->mutex, i); | ||
5759 | } | ||
5760 | |||
5761 | /** | ||
5762 | diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h | ||
5763 | index 074878b55a0b..d044f3f273be 100644 | ||
5764 | --- a/drivers/scsi/aacraid/aacraid.h | ||
5765 | +++ b/drivers/scsi/aacraid/aacraid.h | ||
5766 | @@ -944,6 +944,7 @@ struct fib { | ||
5767 | */ | ||
5768 | struct list_head fiblink; | ||
5769 | void *data; | ||
5770 | + u32 vector_no; | ||
5771 | struct hw_fib *hw_fib_va; /* Actual shared object */ | ||
5772 | dma_addr_t hw_fib_pa; /* physical address of hw_fib*/ | ||
5773 | }; | ||
5774 | @@ -2113,6 +2114,7 @@ static inline unsigned int cap_to_cyls(sector_t capacity, unsigned divisor) | ||
5775 | int aac_acquire_irq(struct aac_dev *dev); | ||
5776 | void aac_free_irq(struct aac_dev *dev); | ||
5777 | const char *aac_driverinfo(struct Scsi_Host *); | ||
5778 | +void aac_fib_vector_assign(struct aac_dev *dev); | ||
5779 | struct fib *aac_fib_alloc(struct aac_dev *dev); | ||
5780 | int aac_fib_setup(struct aac_dev *dev); | ||
5781 | void aac_fib_map_free(struct aac_dev *dev); | ||
5782 | diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c | ||
5783 | index a1f90fe849c9..4cbf54928640 100644 | ||
5784 | --- a/drivers/scsi/aacraid/commsup.c | ||
5785 | +++ b/drivers/scsi/aacraid/commsup.c | ||
5786 | @@ -83,13 +83,38 @@ static int fib_map_alloc(struct aac_dev *dev) | ||
5787 | |||
5788 | void aac_fib_map_free(struct aac_dev *dev) | ||
5789 | { | ||
5790 | - pci_free_consistent(dev->pdev, | ||
5791 | - dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB), | ||
5792 | - dev->hw_fib_va, dev->hw_fib_pa); | ||
5793 | + if (dev->hw_fib_va && dev->max_fib_size) { | ||
5794 | + pci_free_consistent(dev->pdev, | ||
5795 | + (dev->max_fib_size * | ||
5796 | + (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)), | ||
5797 | + dev->hw_fib_va, dev->hw_fib_pa); | ||
5798 | + } | ||
5799 | dev->hw_fib_va = NULL; | ||
5800 | dev->hw_fib_pa = 0; | ||
5801 | } | ||
5802 | |||
5803 | +void aac_fib_vector_assign(struct aac_dev *dev) | ||
5804 | +{ | ||
5805 | + u32 i = 0; | ||
5806 | + u32 vector = 1; | ||
5807 | + struct fib *fibptr = NULL; | ||
5808 | + | ||
5809 | + for (i = 0, fibptr = &dev->fibs[i]; | ||
5810 | + i < (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); | ||
5811 | + i++, fibptr++) { | ||
5812 | + if ((dev->max_msix == 1) || | ||
5813 | + (i > ((dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1) | ||
5814 | + - dev->vector_cap))) { | ||
5815 | + fibptr->vector_no = 0; | ||
5816 | + } else { | ||
5817 | + fibptr->vector_no = vector; | ||
5818 | + vector++; | ||
5819 | + if (vector == dev->max_msix) | ||
5820 | + vector = 1; | ||
5821 | + } | ||
5822 | + } | ||
5823 | +} | ||
5824 | + | ||
5825 | /** | ||
5826 | * aac_fib_setup - setup the fibs | ||
5827 | * @dev: Adapter to set up | ||
5828 | @@ -151,6 +176,12 @@ int aac_fib_setup(struct aac_dev * dev) | ||
5829 | hw_fib_pa = hw_fib_pa + | ||
5830 | dev->max_fib_size + sizeof(struct aac_fib_xporthdr); | ||
5831 | } | ||
5832 | + | ||
5833 | + /* | ||
5834 | + *Assign vector numbers to fibs | ||
5835 | + */ | ||
5836 | + aac_fib_vector_assign(dev); | ||
5837 | + | ||
5838 | /* | ||
5839 | * Add the fib chain to the free list | ||
5840 | */ | ||
5841 | diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c | ||
5842 | index 3b6e5c67e853..aa6eccb8940b 100644 | ||
5843 | --- a/drivers/scsi/aacraid/linit.c | ||
5844 | +++ b/drivers/scsi/aacraid/linit.c | ||
5845 | @@ -1404,8 +1404,18 @@ static int aac_acquire_resources(struct aac_dev *dev) | ||
5846 | |||
5847 | aac_adapter_enable_int(dev); | ||
5848 | |||
5849 | - if (!dev->sync_mode) | ||
5850 | + /*max msix may change after EEH | ||
5851 | + * Re-assign vectors to fibs | ||
5852 | + */ | ||
5853 | + aac_fib_vector_assign(dev); | ||
5854 | + | ||
5855 | + if (!dev->sync_mode) { | ||
5856 | + /* After EEH recovery or suspend resume, max_msix count | ||
5857 | + * may change, therfore updating in init as well. | ||
5858 | + */ | ||
5859 | aac_adapter_start(dev); | ||
5860 | + dev->init->Sa_MSIXVectors = cpu_to_le32(dev->max_msix); | ||
5861 | + } | ||
5862 | return 0; | ||
5863 | |||
5864 | error_iounmap: | ||
5865 | diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c | ||
5866 | index 2aa34ea8ceb1..bc0203f3d243 100644 | ||
5867 | --- a/drivers/scsi/aacraid/src.c | ||
5868 | +++ b/drivers/scsi/aacraid/src.c | ||
5869 | @@ -156,8 +156,8 @@ static irqreturn_t aac_src_intr_message(int irq, void *dev_id) | ||
5870 | break; | ||
5871 | if (dev->msi_enabled && dev->max_msix > 1) | ||
5872 | atomic_dec(&dev->rrq_outstanding[vector_no]); | ||
5873 | - aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL); | ||
5874 | dev->host_rrq[index++] = 0; | ||
5875 | + aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL); | ||
5876 | if (index == (vector_no + 1) * dev->vector_cap) | ||
5877 | index = vector_no * dev->vector_cap; | ||
5878 | dev->host_rrq_idx[vector_no] = index; | ||
5879 | @@ -452,36 +452,20 @@ static int aac_src_deliver_message(struct fib *fib) | ||
5880 | #endif | ||
5881 | |||
5882 | u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size); | ||
5883 | + u16 vector_no; | ||
5884 | |||
5885 | atomic_inc(&q->numpending); | ||
5886 | |||
5887 | if (dev->msi_enabled && fib->hw_fib_va->header.Command != AifRequest && | ||
5888 | dev->max_msix > 1) { | ||
5889 | - u_int16_t vector_no, first_choice = 0xffff; | ||
5890 | - | ||
5891 | - vector_no = dev->fibs_pushed_no % dev->max_msix; | ||
5892 | - do { | ||
5893 | - vector_no += 1; | ||
5894 | - if (vector_no == dev->max_msix) | ||
5895 | - vector_no = 1; | ||
5896 | - if (atomic_read(&dev->rrq_outstanding[vector_no]) < | ||
5897 | - dev->vector_cap) | ||
5898 | - break; | ||
5899 | - if (0xffff == first_choice) | ||
5900 | - first_choice = vector_no; | ||
5901 | - else if (vector_no == first_choice) | ||
5902 | - break; | ||
5903 | - } while (1); | ||
5904 | - if (vector_no == first_choice) | ||
5905 | - vector_no = 0; | ||
5906 | - atomic_inc(&dev->rrq_outstanding[vector_no]); | ||
5907 | - if (dev->fibs_pushed_no == 0xffffffff) | ||
5908 | - dev->fibs_pushed_no = 0; | ||
5909 | - else | ||
5910 | - dev->fibs_pushed_no++; | ||
5911 | + vector_no = fib->vector_no; | ||
5912 | fib->hw_fib_va->header.Handle += (vector_no << 16); | ||
5913 | + } else { | ||
5914 | + vector_no = 0; | ||
5915 | } | ||
5916 | |||
5917 | + atomic_inc(&dev->rrq_outstanding[vector_no]); | ||
5918 | + | ||
5919 | if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { | ||
5920 | /* Calculate the amount to the fibsize bits */ | ||
5921 | fibsize = (hdr_size + 127) / 128 - 1; | ||
5922 | diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c | ||
5923 | index b846a4683562..fc6a83188c1e 100644 | ||
5924 | --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c | ||
5925 | +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c | ||
5926 | @@ -1336,6 +1336,7 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, | ||
5927 | case AHC_DEV_Q_TAGGED: | ||
5928 | scsi_change_queue_depth(sdev, | ||
5929 | dev->openings + dev->active); | ||
5930 | + break; | ||
5931 | default: | ||
5932 | /* | ||
5933 | * We allow the OS to queue 2 untagged transactions to | ||
5934 | diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c | ||
5935 | index fe0c5143f8e6..758f76e88704 100644 | ||
5936 | --- a/drivers/scsi/be2iscsi/be_main.c | ||
5937 | +++ b/drivers/scsi/be2iscsi/be_main.c | ||
5938 | @@ -4470,6 +4470,7 @@ put_shost: | ||
5939 | scsi_host_put(phba->shost); | ||
5940 | free_kset: | ||
5941 | iscsi_boot_destroy_kset(phba->boot_kset); | ||
5942 | + phba->boot_kset = NULL; | ||
5943 | return -ENOMEM; | ||
5944 | } | ||
5945 | |||
5946 | diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c | ||
5947 | index 536cd5a80422..43ac62623bf2 100644 | ||
5948 | --- a/drivers/scsi/ipr.c | ||
5949 | +++ b/drivers/scsi/ipr.c | ||
5950 | @@ -4003,13 +4003,17 @@ static ssize_t ipr_store_update_fw(struct device *dev, | ||
5951 | struct ipr_sglist *sglist; | ||
5952 | char fname[100]; | ||
5953 | char *src; | ||
5954 | - int len, result, dnld_size; | ||
5955 | + char *endline; | ||
5956 | + int result, dnld_size; | ||
5957 | |||
5958 | if (!capable(CAP_SYS_ADMIN)) | ||
5959 | return -EACCES; | ||
5960 | |||
5961 | - len = snprintf(fname, 99, "%s", buf); | ||
5962 | - fname[len-1] = '\0'; | ||
5963 | + snprintf(fname, sizeof(fname), "%s", buf); | ||
5964 | + | ||
5965 | + endline = strchr(fname, '\n'); | ||
5966 | + if (endline) | ||
5967 | + *endline = '\0'; | ||
5968 | |||
5969 | if (request_firmware(&fw_entry, fname, &ioa_cfg->pdev->dev)) { | ||
5970 | dev_err(&ioa_cfg->pdev->dev, "Firmware file %s not found\n", fname); | ||
5971 | diff --git a/drivers/scsi/scsi_common.c b/drivers/scsi/scsi_common.c | ||
5972 | index c126966130ab..ce79de822e46 100644 | ||
5973 | --- a/drivers/scsi/scsi_common.c | ||
5974 | +++ b/drivers/scsi/scsi_common.c | ||
5975 | @@ -278,8 +278,16 @@ int scsi_set_sense_information(u8 *buf, int buf_len, u64 info) | ||
5976 | ucp[3] = 0; | ||
5977 | put_unaligned_be64(info, &ucp[4]); | ||
5978 | } else if ((buf[0] & 0x7f) == 0x70) { | ||
5979 | - buf[0] |= 0x80; | ||
5980 | - put_unaligned_be64(info, &buf[3]); | ||
5981 | + /* | ||
5982 | + * Only set the 'VALID' bit if we can represent the value | ||
5983 | + * correctly; otherwise just fill out the lower bytes and | ||
5984 | + * clear the 'VALID' flag. | ||
5985 | + */ | ||
5986 | + if (info <= 0xffffffffUL) | ||
5987 | + buf[0] |= 0x80; | ||
5988 | + else | ||
5989 | + buf[0] &= 0x7f; | ||
5990 | + put_unaligned_be32((u32)info, &buf[3]); | ||
5991 | } | ||
5992 | |||
5993 | return 0; | ||
5994 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c | ||
5995 | index bb669d32ccd0..cc84ea7d09cc 100644 | ||
5996 | --- a/drivers/scsi/sd.c | ||
5997 | +++ b/drivers/scsi/sd.c | ||
5998 | @@ -648,7 +648,7 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode) | ||
5999 | */ | ||
6000 | if (sdkp->lbprz) { | ||
6001 | q->limits.discard_alignment = 0; | ||
6002 | - q->limits.discard_granularity = 1; | ||
6003 | + q->limits.discard_granularity = logical_block_size; | ||
6004 | } else { | ||
6005 | q->limits.discard_alignment = sdkp->unmap_alignment * | ||
6006 | logical_block_size; | ||
6007 | diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c | ||
6008 | index 5e820674432c..ae7d9bdf409c 100644 | ||
6009 | --- a/drivers/scsi/sg.c | ||
6010 | +++ b/drivers/scsi/sg.c | ||
6011 | @@ -652,7 +652,8 @@ sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos) | ||
6012 | else | ||
6013 | hp->dxfer_direction = (mxsize > 0) ? SG_DXFER_FROM_DEV : SG_DXFER_NONE; | ||
6014 | hp->dxfer_len = mxsize; | ||
6015 | - if (hp->dxfer_direction == SG_DXFER_TO_DEV) | ||
6016 | + if ((hp->dxfer_direction == SG_DXFER_TO_DEV) || | ||
6017 | + (hp->dxfer_direction == SG_DXFER_TO_FROM_DEV)) | ||
6018 | hp->dxferp = (char __user *)buf + cmd_size; | ||
6019 | else | ||
6020 | hp->dxferp = NULL; | ||
6021 | diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c | ||
6022 | index 3fba42ad9fb8..0f636cc4c809 100644 | ||
6023 | --- a/drivers/scsi/storvsc_drv.c | ||
6024 | +++ b/drivers/scsi/storvsc_drv.c | ||
6025 | @@ -889,8 +889,9 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb, | ||
6026 | do_work = true; | ||
6027 | process_err_fn = storvsc_remove_lun; | ||
6028 | break; | ||
6029 | - case (SRB_STATUS_ABORTED | SRB_STATUS_AUTOSENSE_VALID): | ||
6030 | - if ((asc == 0x2a) && (ascq == 0x9)) { | ||
6031 | + case SRB_STATUS_ABORTED: | ||
6032 | + if (vm_srb->srb_status & SRB_STATUS_AUTOSENSE_VALID && | ||
6033 | + (asc == 0x2a) && (ascq == 0x9)) { | ||
6034 | do_work = true; | ||
6035 | process_err_fn = storvsc_device_scan; | ||
6036 | /* | ||
6037 | diff --git a/drivers/staging/android/ion/ion_test.c b/drivers/staging/android/ion/ion_test.c | ||
6038 | index b8dcf5a26cc4..58d46893e5ff 100644 | ||
6039 | --- a/drivers/staging/android/ion/ion_test.c | ||
6040 | +++ b/drivers/staging/android/ion/ion_test.c | ||
6041 | @@ -285,8 +285,8 @@ static int __init ion_test_init(void) | ||
6042 | { | ||
6043 | ion_test_pdev = platform_device_register_simple("ion-test", | ||
6044 | -1, NULL, 0); | ||
6045 | - if (!ion_test_pdev) | ||
6046 | - return -ENODEV; | ||
6047 | + if (IS_ERR(ion_test_pdev)) | ||
6048 | + return PTR_ERR(ion_test_pdev); | ||
6049 | |||
6050 | return platform_driver_probe(&ion_test_platform_driver, ion_test_probe); | ||
6051 | } | ||
6052 | diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c | ||
6053 | index 6cc304a4c59b..27fbf1a81097 100644 | ||
6054 | --- a/drivers/staging/comedi/drivers/ni_mio_common.c | ||
6055 | +++ b/drivers/staging/comedi/drivers/ni_mio_common.c | ||
6056 | @@ -246,24 +246,24 @@ static void ni_writel(struct comedi_device *dev, uint32_t data, int reg) | ||
6057 | { | ||
6058 | if (dev->mmio) | ||
6059 | writel(data, dev->mmio + reg); | ||
6060 | - | ||
6061 | - outl(data, dev->iobase + reg); | ||
6062 | + else | ||
6063 | + outl(data, dev->iobase + reg); | ||
6064 | } | ||
6065 | |||
6066 | static void ni_writew(struct comedi_device *dev, uint16_t data, int reg) | ||
6067 | { | ||
6068 | if (dev->mmio) | ||
6069 | writew(data, dev->mmio + reg); | ||
6070 | - | ||
6071 | - outw(data, dev->iobase + reg); | ||
6072 | + else | ||
6073 | + outw(data, dev->iobase + reg); | ||
6074 | } | ||
6075 | |||
6076 | static void ni_writeb(struct comedi_device *dev, uint8_t data, int reg) | ||
6077 | { | ||
6078 | if (dev->mmio) | ||
6079 | writeb(data, dev->mmio + reg); | ||
6080 | - | ||
6081 | - outb(data, dev->iobase + reg); | ||
6082 | + else | ||
6083 | + outb(data, dev->iobase + reg); | ||
6084 | } | ||
6085 | |||
6086 | static uint32_t ni_readl(struct comedi_device *dev, int reg) | ||
6087 | diff --git a/drivers/staging/comedi/drivers/ni_tiocmd.c b/drivers/staging/comedi/drivers/ni_tiocmd.c | ||
6088 | index 437f723bb34d..823e47910004 100644 | ||
6089 | --- a/drivers/staging/comedi/drivers/ni_tiocmd.c | ||
6090 | +++ b/drivers/staging/comedi/drivers/ni_tiocmd.c | ||
6091 | @@ -92,7 +92,7 @@ static int ni_tio_input_inttrig(struct comedi_device *dev, | ||
6092 | unsigned long flags; | ||
6093 | int ret = 0; | ||
6094 | |||
6095 | - if (trig_num != cmd->start_src) | ||
6096 | + if (trig_num != cmd->start_arg) | ||
6097 | return -EINVAL; | ||
6098 | |||
6099 | spin_lock_irqsave(&counter->lock, flags); | ||
6100 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c | ||
6101 | index 94f4ffac723f..d151bc3d6971 100644 | ||
6102 | --- a/drivers/target/target_core_transport.c | ||
6103 | +++ b/drivers/target/target_core_transport.c | ||
6104 | @@ -2618,8 +2618,6 @@ void target_wait_for_sess_cmds(struct se_session *se_sess) | ||
6105 | |||
6106 | list_for_each_entry_safe(se_cmd, tmp_cmd, | ||
6107 | &se_sess->sess_wait_list, se_cmd_list) { | ||
6108 | - list_del_init(&se_cmd->se_cmd_list); | ||
6109 | - | ||
6110 | pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:" | ||
6111 | " %d\n", se_cmd, se_cmd->t_state, | ||
6112 | se_cmd->se_tfo->get_cmd_state(se_cmd)); | ||
6113 | diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c | ||
6114 | index ba08b5521382..3d5f8f432b5b 100644 | ||
6115 | --- a/drivers/thermal/thermal_core.c | ||
6116 | +++ b/drivers/thermal/thermal_core.c | ||
6117 | @@ -454,6 +454,10 @@ static void handle_thermal_trip(struct thermal_zone_device *tz, int trip) | ||
6118 | { | ||
6119 | enum thermal_trip_type type; | ||
6120 | |||
6121 | + /* Ignore disabled trip points */ | ||
6122 | + if (test_bit(trip, &tz->trips_disabled)) | ||
6123 | + return; | ||
6124 | + | ||
6125 | tz->ops->get_trip_type(tz, trip, &type); | ||
6126 | |||
6127 | if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT) | ||
6128 | @@ -1796,6 +1800,7 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type, | ||
6129 | { | ||
6130 | struct thermal_zone_device *tz; | ||
6131 | enum thermal_trip_type trip_type; | ||
6132 | + int trip_temp; | ||
6133 | int result; | ||
6134 | int count; | ||
6135 | int passive = 0; | ||
6136 | @@ -1867,9 +1872,15 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type, | ||
6137 | goto unregister; | ||
6138 | |||
6139 | for (count = 0; count < trips; count++) { | ||
6140 | - tz->ops->get_trip_type(tz, count, &trip_type); | ||
6141 | + if (tz->ops->get_trip_type(tz, count, &trip_type)) | ||
6142 | + set_bit(count, &tz->trips_disabled); | ||
6143 | if (trip_type == THERMAL_TRIP_PASSIVE) | ||
6144 | passive = 1; | ||
6145 | + if (tz->ops->get_trip_temp(tz, count, &trip_temp)) | ||
6146 | + set_bit(count, &tz->trips_disabled); | ||
6147 | + /* Check for bogus trip points */ | ||
6148 | + if (trip_temp == 0) | ||
6149 | + set_bit(count, &tz->trips_disabled); | ||
6150 | } | ||
6151 | |||
6152 | if (!passive) { | ||
6153 | diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c | ||
6154 | index 52d82d2ac726..56ccbcefdd85 100644 | ||
6155 | --- a/drivers/tty/serial/8250/8250_port.c | ||
6156 | +++ b/drivers/tty/serial/8250/8250_port.c | ||
6157 | @@ -713,22 +713,16 @@ static int size_fifo(struct uart_8250_port *up) | ||
6158 | */ | ||
6159 | static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p) | ||
6160 | { | ||
6161 | - unsigned char old_dll, old_dlm, old_lcr; | ||
6162 | - unsigned int id; | ||
6163 | + unsigned char old_lcr; | ||
6164 | + unsigned int id, old_dl; | ||
6165 | |||
6166 | old_lcr = serial_in(p, UART_LCR); | ||
6167 | serial_out(p, UART_LCR, UART_LCR_CONF_MODE_A); | ||
6168 | + old_dl = serial_dl_read(p); | ||
6169 | + serial_dl_write(p, 0); | ||
6170 | + id = serial_dl_read(p); | ||
6171 | + serial_dl_write(p, old_dl); | ||
6172 | |||
6173 | - old_dll = serial_in(p, UART_DLL); | ||
6174 | - old_dlm = serial_in(p, UART_DLM); | ||
6175 | - | ||
6176 | - serial_out(p, UART_DLL, 0); | ||
6177 | - serial_out(p, UART_DLM, 0); | ||
6178 | - | ||
6179 | - id = serial_in(p, UART_DLL) | serial_in(p, UART_DLM) << 8; | ||
6180 | - | ||
6181 | - serial_out(p, UART_DLL, old_dll); | ||
6182 | - serial_out(p, UART_DLM, old_dlm); | ||
6183 | serial_out(p, UART_LCR, old_lcr); | ||
6184 | |||
6185 | return id; | ||
6186 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
6187 | index fa4e23930614..d37fdcc3143c 100644 | ||
6188 | --- a/drivers/usb/class/cdc-acm.c | ||
6189 | +++ b/drivers/usb/class/cdc-acm.c | ||
6190 | @@ -1114,6 +1114,9 @@ static int acm_probe(struct usb_interface *intf, | ||
6191 | if (quirks == NO_UNION_NORMAL) { | ||
6192 | data_interface = usb_ifnum_to_if(usb_dev, 1); | ||
6193 | control_interface = usb_ifnum_to_if(usb_dev, 0); | ||
6194 | + /* we would crash */ | ||
6195 | + if (!data_interface || !control_interface) | ||
6196 | + return -ENODEV; | ||
6197 | goto skip_normal_probe; | ||
6198 | } | ||
6199 | |||
6200 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c | ||
6201 | index 56593a9a8726..2057d91d8336 100644 | ||
6202 | --- a/drivers/usb/core/driver.c | ||
6203 | +++ b/drivers/usb/core/driver.c | ||
6204 | @@ -502,11 +502,15 @@ static int usb_unbind_interface(struct device *dev) | ||
6205 | int usb_driver_claim_interface(struct usb_driver *driver, | ||
6206 | struct usb_interface *iface, void *priv) | ||
6207 | { | ||
6208 | - struct device *dev = &iface->dev; | ||
6209 | + struct device *dev; | ||
6210 | struct usb_device *udev; | ||
6211 | int retval = 0; | ||
6212 | int lpm_disable_error; | ||
6213 | |||
6214 | + if (!iface) | ||
6215 | + return -ENODEV; | ||
6216 | + | ||
6217 | + dev = &iface->dev; | ||
6218 | if (dev->driver) | ||
6219 | return -EBUSY; | ||
6220 | |||
6221 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
6222 | index 1560f3f3e756..2a274884c7ea 100644 | ||
6223 | --- a/drivers/usb/core/hub.c | ||
6224 | +++ b/drivers/usb/core/hub.c | ||
6225 | @@ -4277,7 +4277,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, | ||
6226 | { | ||
6227 | struct usb_device *hdev = hub->hdev; | ||
6228 | struct usb_hcd *hcd = bus_to_hcd(hdev->bus); | ||
6229 | - int i, j, retval; | ||
6230 | + int retries, operations, retval, i; | ||
6231 | unsigned delay = HUB_SHORT_RESET_TIME; | ||
6232 | enum usb_device_speed oldspeed = udev->speed; | ||
6233 | const char *speed; | ||
6234 | @@ -4379,7 +4379,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, | ||
6235 | * first 8 bytes of the device descriptor to get the ep0 maxpacket | ||
6236 | * value. | ||
6237 | */ | ||
6238 | - for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) { | ||
6239 | + for (retries = 0; retries < GET_DESCRIPTOR_TRIES; (++retries, msleep(100))) { | ||
6240 | bool did_new_scheme = false; | ||
6241 | |||
6242 | if (use_new_scheme(udev, retry_counter)) { | ||
6243 | @@ -4406,7 +4406,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, | ||
6244 | * 255 is for WUSB devices, we actually need to use | ||
6245 | * 512 (WUSB1.0[4.8.1]). | ||
6246 | */ | ||
6247 | - for (j = 0; j < 3; ++j) { | ||
6248 | + for (operations = 0; operations < 3; ++operations) { | ||
6249 | buf->bMaxPacketSize0 = 0; | ||
6250 | r = usb_control_msg(udev, usb_rcvaddr0pipe(), | ||
6251 | USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, | ||
6252 | @@ -4426,7 +4426,13 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, | ||
6253 | r = -EPROTO; | ||
6254 | break; | ||
6255 | } | ||
6256 | - if (r == 0) | ||
6257 | + /* | ||
6258 | + * Some devices time out if they are powered on | ||
6259 | + * when already connected. They need a second | ||
6260 | + * reset. But only on the first attempt, | ||
6261 | + * lest we get into a time out/reset loop | ||
6262 | + */ | ||
6263 | + if (r == 0 || (r == -ETIMEDOUT && retries == 0)) | ||
6264 | break; | ||
6265 | } | ||
6266 | udev->descriptor.bMaxPacketSize0 = | ||
6267 | @@ -4458,7 +4464,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, | ||
6268 | * authorization will assign the final address. | ||
6269 | */ | ||
6270 | if (udev->wusb == 0) { | ||
6271 | - for (j = 0; j < SET_ADDRESS_TRIES; ++j) { | ||
6272 | + for (operations = 0; operations < SET_ADDRESS_TRIES; ++operations) { | ||
6273 | retval = hub_set_address(udev, devnum); | ||
6274 | if (retval >= 0) | ||
6275 | break; | ||
6276 | diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c | ||
6277 | index c6bfd13f6c92..1950e87b4219 100644 | ||
6278 | --- a/drivers/usb/misc/iowarrior.c | ||
6279 | +++ b/drivers/usb/misc/iowarrior.c | ||
6280 | @@ -787,6 +787,12 @@ static int iowarrior_probe(struct usb_interface *interface, | ||
6281 | iface_desc = interface->cur_altsetting; | ||
6282 | dev->product_id = le16_to_cpu(udev->descriptor.idProduct); | ||
6283 | |||
6284 | + if (iface_desc->desc.bNumEndpoints < 1) { | ||
6285 | + dev_err(&interface->dev, "Invalid number of endpoints\n"); | ||
6286 | + retval = -EINVAL; | ||
6287 | + goto error; | ||
6288 | + } | ||
6289 | + | ||
6290 | /* set up the endpoint information */ | ||
6291 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | ||
6292 | endpoint = &iface_desc->endpoint[i].desc; | ||
6293 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c | ||
6294 | index 7a76fe4c2f9e..bdc0f2f24f19 100644 | ||
6295 | --- a/drivers/usb/serial/cp210x.c | ||
6296 | +++ b/drivers/usb/serial/cp210x.c | ||
6297 | @@ -164,6 +164,7 @@ static const struct usb_device_id id_table[] = { | ||
6298 | { USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */ | ||
6299 | { USB_DEVICE(0x1901, 0x0190) }, /* GE B850 CP2105 Recorder interface */ | ||
6300 | { USB_DEVICE(0x1901, 0x0193) }, /* GE B650 CP2104 PMC interface */ | ||
6301 | + { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */ | ||
6302 | { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */ | ||
6303 | { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ | ||
6304 | { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */ | ||
6305 | diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c | ||
6306 | index 01bf53392819..244acb1299a9 100644 | ||
6307 | --- a/drivers/usb/serial/cypress_m8.c | ||
6308 | +++ b/drivers/usb/serial/cypress_m8.c | ||
6309 | @@ -447,6 +447,11 @@ static int cypress_generic_port_probe(struct usb_serial_port *port) | ||
6310 | struct usb_serial *serial = port->serial; | ||
6311 | struct cypress_private *priv; | ||
6312 | |||
6313 | + if (!port->interrupt_out_urb || !port->interrupt_in_urb) { | ||
6314 | + dev_err(&port->dev, "required endpoint is missing\n"); | ||
6315 | + return -ENODEV; | ||
6316 | + } | ||
6317 | + | ||
6318 | priv = kzalloc(sizeof(struct cypress_private), GFP_KERNEL); | ||
6319 | if (!priv) | ||
6320 | return -ENOMEM; | ||
6321 | @@ -606,12 +611,6 @@ static int cypress_open(struct tty_struct *tty, struct usb_serial_port *port) | ||
6322 | cypress_set_termios(tty, port, &priv->tmp_termios); | ||
6323 | |||
6324 | /* setup the port and start reading from the device */ | ||
6325 | - if (!port->interrupt_in_urb) { | ||
6326 | - dev_err(&port->dev, "%s - interrupt_in_urb is empty!\n", | ||
6327 | - __func__); | ||
6328 | - return -1; | ||
6329 | - } | ||
6330 | - | ||
6331 | usb_fill_int_urb(port->interrupt_in_urb, serial->dev, | ||
6332 | usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress), | ||
6333 | port->interrupt_in_urb->transfer_buffer, | ||
6334 | diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c | ||
6335 | index 12b0e67473ba..3df7b7ec178e 100644 | ||
6336 | --- a/drivers/usb/serial/digi_acceleport.c | ||
6337 | +++ b/drivers/usb/serial/digi_acceleport.c | ||
6338 | @@ -1251,8 +1251,27 @@ static int digi_port_init(struct usb_serial_port *port, unsigned port_num) | ||
6339 | |||
6340 | static int digi_startup(struct usb_serial *serial) | ||
6341 | { | ||
6342 | + struct device *dev = &serial->interface->dev; | ||
6343 | struct digi_serial *serial_priv; | ||
6344 | int ret; | ||
6345 | + int i; | ||
6346 | + | ||
6347 | + /* check whether the device has the expected number of endpoints */ | ||
6348 | + if (serial->num_port_pointers < serial->type->num_ports + 1) { | ||
6349 | + dev_err(dev, "OOB endpoints missing\n"); | ||
6350 | + return -ENODEV; | ||
6351 | + } | ||
6352 | + | ||
6353 | + for (i = 0; i < serial->type->num_ports + 1 ; i++) { | ||
6354 | + if (!serial->port[i]->read_urb) { | ||
6355 | + dev_err(dev, "bulk-in endpoint missing\n"); | ||
6356 | + return -ENODEV; | ||
6357 | + } | ||
6358 | + if (!serial->port[i]->write_urb) { | ||
6359 | + dev_err(dev, "bulk-out endpoint missing\n"); | ||
6360 | + return -ENODEV; | ||
6361 | + } | ||
6362 | + } | ||
6363 | |||
6364 | serial_priv = kzalloc(sizeof(*serial_priv), GFP_KERNEL); | ||
6365 | if (!serial_priv) | ||
6366 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
6367 | index 8c660ae401d8..b61f12160d37 100644 | ||
6368 | --- a/drivers/usb/serial/ftdi_sio.c | ||
6369 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
6370 | @@ -1004,6 +1004,10 @@ static const struct usb_device_id id_table_combined[] = { | ||
6371 | { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_DISPLAY_PID) }, | ||
6372 | { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_LITE_PID) }, | ||
6373 | { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_ANALOG_PID) }, | ||
6374 | + /* ICP DAS I-756xU devices */ | ||
6375 | + { USB_DEVICE(ICPDAS_VID, ICPDAS_I7560U_PID) }, | ||
6376 | + { USB_DEVICE(ICPDAS_VID, ICPDAS_I7561U_PID) }, | ||
6377 | + { USB_DEVICE(ICPDAS_VID, ICPDAS_I7563U_PID) }, | ||
6378 | { } /* Terminating entry */ | ||
6379 | }; | ||
6380 | |||
6381 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
6382 | index a84df2513994..c5d6c1e73e8e 100644 | ||
6383 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
6384 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
6385 | @@ -872,6 +872,14 @@ | ||
6386 | #define NOVITUS_BONO_E_PID 0x6010 | ||
6387 | |||
6388 | /* | ||
6389 | + * ICPDAS I-756*U devices | ||
6390 | + */ | ||
6391 | +#define ICPDAS_VID 0x1b5c | ||
6392 | +#define ICPDAS_I7560U_PID 0x0103 | ||
6393 | +#define ICPDAS_I7561U_PID 0x0104 | ||
6394 | +#define ICPDAS_I7563U_PID 0x0105 | ||
6395 | + | ||
6396 | +/* | ||
6397 | * RT Systems programming cables for various ham radios | ||
6398 | */ | ||
6399 | #define RTSYSTEMS_VID 0x2100 /* Vendor ID */ | ||
6400 | diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c | ||
6401 | index fd707d6a10e2..89726f702202 100644 | ||
6402 | --- a/drivers/usb/serial/mct_u232.c | ||
6403 | +++ b/drivers/usb/serial/mct_u232.c | ||
6404 | @@ -376,14 +376,21 @@ static void mct_u232_msr_to_state(struct usb_serial_port *port, | ||
6405 | |||
6406 | static int mct_u232_port_probe(struct usb_serial_port *port) | ||
6407 | { | ||
6408 | + struct usb_serial *serial = port->serial; | ||
6409 | struct mct_u232_private *priv; | ||
6410 | |||
6411 | + /* check first to simplify error handling */ | ||
6412 | + if (!serial->port[1] || !serial->port[1]->interrupt_in_urb) { | ||
6413 | + dev_err(&port->dev, "expected endpoint missing\n"); | ||
6414 | + return -ENODEV; | ||
6415 | + } | ||
6416 | + | ||
6417 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
6418 | if (!priv) | ||
6419 | return -ENOMEM; | ||
6420 | |||
6421 | /* Use second interrupt-in endpoint for reading. */ | ||
6422 | - priv->read_urb = port->serial->port[1]->interrupt_in_urb; | ||
6423 | + priv->read_urb = serial->port[1]->interrupt_in_urb; | ||
6424 | priv->read_urb->context = port; | ||
6425 | |||
6426 | spin_lock_init(&priv->lock); | ||
6427 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
6428 | index 348e19834b83..c6f497f16526 100644 | ||
6429 | --- a/drivers/usb/serial/option.c | ||
6430 | +++ b/drivers/usb/serial/option.c | ||
6431 | @@ -1818,6 +1818,8 @@ static const struct usb_device_id option_ids[] = { | ||
6432 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x00, 0x00) }, | ||
6433 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x02, 0x01) }, | ||
6434 | { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, | ||
6435 | + { USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7e19, 0xff), /* D-Link DWM-221 B1 */ | ||
6436 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
6437 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ | ||
6438 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ | ||
6439 | { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x4000, 0xff) }, /* OLICARD300 - MT6225 */ | ||
6440 | diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c | ||
6441 | index 5c66d3f7a6d0..ce0cd6e20d4f 100644 | ||
6442 | --- a/drivers/usb/storage/uas.c | ||
6443 | +++ b/drivers/usb/storage/uas.c | ||
6444 | @@ -812,7 +812,7 @@ static struct scsi_host_template uas_host_template = { | ||
6445 | .slave_configure = uas_slave_configure, | ||
6446 | .eh_abort_handler = uas_eh_abort_handler, | ||
6447 | .eh_bus_reset_handler = uas_eh_bus_reset_handler, | ||
6448 | - .can_queue = 65536, /* Is there a limit on the _host_ ? */ | ||
6449 | + .can_queue = MAX_CMNDS, | ||
6450 | .this_id = -1, | ||
6451 | .sg_tablesize = SG_NONE, | ||
6452 | .skip_settle_delay = 1, | ||
6453 | diff --git a/drivers/watchdog/rc32434_wdt.c b/drivers/watchdog/rc32434_wdt.c | ||
6454 | index 71e78ef4b736..3a75f3b53452 100644 | ||
6455 | --- a/drivers/watchdog/rc32434_wdt.c | ||
6456 | +++ b/drivers/watchdog/rc32434_wdt.c | ||
6457 | @@ -237,7 +237,7 @@ static long rc32434_wdt_ioctl(struct file *file, unsigned int cmd, | ||
6458 | return -EINVAL; | ||
6459 | /* Fall through */ | ||
6460 | case WDIOC_GETTIMEOUT: | ||
6461 | - return copy_to_user(argp, &timeout, sizeof(int)); | ||
6462 | + return copy_to_user(argp, &timeout, sizeof(int)) ? -EFAULT : 0; | ||
6463 | default: | ||
6464 | return -ENOTTY; | ||
6465 | } | ||
6466 | diff --git a/fs/coredump.c b/fs/coredump.c | ||
6467 | index 1777331eee76..dfc87c5f5a54 100644 | ||
6468 | --- a/fs/coredump.c | ||
6469 | +++ b/fs/coredump.c | ||
6470 | @@ -32,6 +32,9 @@ | ||
6471 | #include <linux/pipe_fs_i.h> | ||
6472 | #include <linux/oom.h> | ||
6473 | #include <linux/compat.h> | ||
6474 | +#include <linux/sched.h> | ||
6475 | +#include <linux/fs.h> | ||
6476 | +#include <linux/path.h> | ||
6477 | |||
6478 | #include <asm/uaccess.h> | ||
6479 | #include <asm/mmu_context.h> | ||
6480 | @@ -627,6 +630,8 @@ void do_coredump(const siginfo_t *siginfo) | ||
6481 | } | ||
6482 | } else { | ||
6483 | struct inode *inode; | ||
6484 | + int open_flags = O_CREAT | O_RDWR | O_NOFOLLOW | | ||
6485 | + O_LARGEFILE | O_EXCL; | ||
6486 | |||
6487 | if (cprm.limit < binfmt->min_coredump) | ||
6488 | goto fail_unlock; | ||
6489 | @@ -665,10 +670,27 @@ void do_coredump(const siginfo_t *siginfo) | ||
6490 | * what matters is that at least one of the two processes | ||
6491 | * writes its coredump successfully, not which one. | ||
6492 | */ | ||
6493 | - cprm.file = filp_open(cn.corename, | ||
6494 | - O_CREAT | 2 | O_NOFOLLOW | | ||
6495 | - O_LARGEFILE | O_EXCL, | ||
6496 | - 0600); | ||
6497 | + if (need_suid_safe) { | ||
6498 | + /* | ||
6499 | + * Using user namespaces, normal user tasks can change | ||
6500 | + * their current->fs->root to point to arbitrary | ||
6501 | + * directories. Since the intention of the "only dump | ||
6502 | + * with a fully qualified path" rule is to control where | ||
6503 | + * coredumps may be placed using root privileges, | ||
6504 | + * current->fs->root must not be used. Instead, use the | ||
6505 | + * root directory of init_task. | ||
6506 | + */ | ||
6507 | + struct path root; | ||
6508 | + | ||
6509 | + task_lock(&init_task); | ||
6510 | + get_fs_root(init_task.fs, &root); | ||
6511 | + task_unlock(&init_task); | ||
6512 | + cprm.file = file_open_root(root.dentry, root.mnt, | ||
6513 | + cn.corename, open_flags, 0600); | ||
6514 | + path_put(&root); | ||
6515 | + } else { | ||
6516 | + cprm.file = filp_open(cn.corename, open_flags, 0600); | ||
6517 | + } | ||
6518 | if (IS_ERR(cprm.file)) | ||
6519 | goto fail_unlock; | ||
6520 | |||
6521 | diff --git a/fs/fhandle.c b/fs/fhandle.c | ||
6522 | index d59712dfa3e7..ca3c3dd01789 100644 | ||
6523 | --- a/fs/fhandle.c | ||
6524 | +++ b/fs/fhandle.c | ||
6525 | @@ -228,7 +228,7 @@ long do_handle_open(int mountdirfd, | ||
6526 | path_put(&path); | ||
6527 | return fd; | ||
6528 | } | ||
6529 | - file = file_open_root(path.dentry, path.mnt, "", open_flag); | ||
6530 | + file = file_open_root(path.dentry, path.mnt, "", open_flag, 0); | ||
6531 | if (IS_ERR(file)) { | ||
6532 | put_unused_fd(fd); | ||
6533 | retval = PTR_ERR(file); | ||
6534 | diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c | ||
6535 | index 7a8ea1351584..60d6fc2e0e4b 100644 | ||
6536 | --- a/fs/fs-writeback.c | ||
6537 | +++ b/fs/fs-writeback.c | ||
6538 | @@ -281,13 +281,15 @@ locked_inode_to_wb_and_lock_list(struct inode *inode) | ||
6539 | wb_get(wb); | ||
6540 | spin_unlock(&inode->i_lock); | ||
6541 | spin_lock(&wb->list_lock); | ||
6542 | - wb_put(wb); /* not gonna deref it anymore */ | ||
6543 | |||
6544 | /* i_wb may have changed inbetween, can't use inode_to_wb() */ | ||
6545 | - if (likely(wb == inode->i_wb)) | ||
6546 | - return wb; /* @inode already has ref */ | ||
6547 | + if (likely(wb == inode->i_wb)) { | ||
6548 | + wb_put(wb); /* @inode already has ref */ | ||
6549 | + return wb; | ||
6550 | + } | ||
6551 | |||
6552 | spin_unlock(&wb->list_lock); | ||
6553 | + wb_put(wb); | ||
6554 | cpu_relax(); | ||
6555 | spin_lock(&inode->i_lock); | ||
6556 | } | ||
6557 | @@ -1339,10 +1341,10 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) | ||
6558 | * we go e.g. from filesystem. Flusher thread uses __writeback_single_inode() | ||
6559 | * and does more profound writeback list handling in writeback_sb_inodes(). | ||
6560 | */ | ||
6561 | -static int | ||
6562 | -writeback_single_inode(struct inode *inode, struct bdi_writeback *wb, | ||
6563 | - struct writeback_control *wbc) | ||
6564 | +static int writeback_single_inode(struct inode *inode, | ||
6565 | + struct writeback_control *wbc) | ||
6566 | { | ||
6567 | + struct bdi_writeback *wb; | ||
6568 | int ret = 0; | ||
6569 | |||
6570 | spin_lock(&inode->i_lock); | ||
6571 | @@ -1380,7 +1382,8 @@ writeback_single_inode(struct inode *inode, struct bdi_writeback *wb, | ||
6572 | ret = __writeback_single_inode(inode, wbc); | ||
6573 | |||
6574 | wbc_detach_inode(wbc); | ||
6575 | - spin_lock(&wb->list_lock); | ||
6576 | + | ||
6577 | + wb = inode_to_wb_and_lock_list(inode); | ||
6578 | spin_lock(&inode->i_lock); | ||
6579 | /* | ||
6580 | * If inode is clean, remove it from writeback lists. Otherwise don't | ||
6581 | @@ -1455,6 +1458,7 @@ static long writeback_sb_inodes(struct super_block *sb, | ||
6582 | |||
6583 | while (!list_empty(&wb->b_io)) { | ||
6584 | struct inode *inode = wb_inode(wb->b_io.prev); | ||
6585 | + struct bdi_writeback *tmp_wb; | ||
6586 | |||
6587 | if (inode->i_sb != sb) { | ||
6588 | if (work->sb) { | ||
6589 | @@ -1545,15 +1549,23 @@ static long writeback_sb_inodes(struct super_block *sb, | ||
6590 | cond_resched(); | ||
6591 | } | ||
6592 | |||
6593 | - | ||
6594 | - spin_lock(&wb->list_lock); | ||
6595 | + /* | ||
6596 | + * Requeue @inode if still dirty. Be careful as @inode may | ||
6597 | + * have been switched to another wb in the meantime. | ||
6598 | + */ | ||
6599 | + tmp_wb = inode_to_wb_and_lock_list(inode); | ||
6600 | spin_lock(&inode->i_lock); | ||
6601 | if (!(inode->i_state & I_DIRTY_ALL)) | ||
6602 | wrote++; | ||
6603 | - requeue_inode(inode, wb, &wbc); | ||
6604 | + requeue_inode(inode, tmp_wb, &wbc); | ||
6605 | inode_sync_complete(inode); | ||
6606 | spin_unlock(&inode->i_lock); | ||
6607 | |||
6608 | + if (unlikely(tmp_wb != wb)) { | ||
6609 | + spin_unlock(&tmp_wb->list_lock); | ||
6610 | + spin_lock(&wb->list_lock); | ||
6611 | + } | ||
6612 | + | ||
6613 | /* | ||
6614 | * bail out to wb_writeback() often enough to check | ||
6615 | * background threshold and other termination conditions. | ||
6616 | @@ -2340,7 +2352,6 @@ EXPORT_SYMBOL(sync_inodes_sb); | ||
6617 | */ | ||
6618 | int write_inode_now(struct inode *inode, int sync) | ||
6619 | { | ||
6620 | - struct bdi_writeback *wb = &inode_to_bdi(inode)->wb; | ||
6621 | struct writeback_control wbc = { | ||
6622 | .nr_to_write = LONG_MAX, | ||
6623 | .sync_mode = sync ? WB_SYNC_ALL : WB_SYNC_NONE, | ||
6624 | @@ -2352,7 +2363,7 @@ int write_inode_now(struct inode *inode, int sync) | ||
6625 | wbc.nr_to_write = 0; | ||
6626 | |||
6627 | might_sleep(); | ||
6628 | - return writeback_single_inode(inode, wb, &wbc); | ||
6629 | + return writeback_single_inode(inode, &wbc); | ||
6630 | } | ||
6631 | EXPORT_SYMBOL(write_inode_now); | ||
6632 | |||
6633 | @@ -2369,7 +2380,7 @@ EXPORT_SYMBOL(write_inode_now); | ||
6634 | */ | ||
6635 | int sync_inode(struct inode *inode, struct writeback_control *wbc) | ||
6636 | { | ||
6637 | - return writeback_single_inode(inode, &inode_to_bdi(inode)->wb, wbc); | ||
6638 | + return writeback_single_inode(inode, wbc); | ||
6639 | } | ||
6640 | EXPORT_SYMBOL(sync_inode); | ||
6641 | |||
6642 | diff --git a/fs/fuse/cuse.c b/fs/fuse/cuse.c | ||
6643 | index 8e3ee1936c7e..c5b6b7165489 100644 | ||
6644 | --- a/fs/fuse/cuse.c | ||
6645 | +++ b/fs/fuse/cuse.c | ||
6646 | @@ -90,7 +90,7 @@ static struct list_head *cuse_conntbl_head(dev_t devt) | ||
6647 | |||
6648 | static ssize_t cuse_read_iter(struct kiocb *kiocb, struct iov_iter *to) | ||
6649 | { | ||
6650 | - struct fuse_io_priv io = { .async = 0, .file = kiocb->ki_filp }; | ||
6651 | + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb->ki_filp); | ||
6652 | loff_t pos = 0; | ||
6653 | |||
6654 | return fuse_direct_io(&io, to, &pos, FUSE_DIO_CUSE); | ||
6655 | @@ -98,7 +98,7 @@ static ssize_t cuse_read_iter(struct kiocb *kiocb, struct iov_iter *to) | ||
6656 | |||
6657 | static ssize_t cuse_write_iter(struct kiocb *kiocb, struct iov_iter *from) | ||
6658 | { | ||
6659 | - struct fuse_io_priv io = { .async = 0, .file = kiocb->ki_filp }; | ||
6660 | + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb->ki_filp); | ||
6661 | loff_t pos = 0; | ||
6662 | /* | ||
6663 | * No locking or generic_write_checks(), the server is | ||
6664 | diff --git a/fs/fuse/file.c b/fs/fuse/file.c | ||
6665 | index 570ca4053c80..c2e340d6ec6e 100644 | ||
6666 | --- a/fs/fuse/file.c | ||
6667 | +++ b/fs/fuse/file.c | ||
6668 | @@ -528,6 +528,11 @@ static void fuse_release_user_pages(struct fuse_req *req, int write) | ||
6669 | } | ||
6670 | } | ||
6671 | |||
6672 | +static void fuse_io_release(struct kref *kref) | ||
6673 | +{ | ||
6674 | + kfree(container_of(kref, struct fuse_io_priv, refcnt)); | ||
6675 | +} | ||
6676 | + | ||
6677 | static ssize_t fuse_get_res_by_io(struct fuse_io_priv *io) | ||
6678 | { | ||
6679 | if (io->err) | ||
6680 | @@ -585,8 +590,9 @@ static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos) | ||
6681 | } | ||
6682 | |||
6683 | io->iocb->ki_complete(io->iocb, res, 0); | ||
6684 | - kfree(io); | ||
6685 | } | ||
6686 | + | ||
6687 | + kref_put(&io->refcnt, fuse_io_release); | ||
6688 | } | ||
6689 | |||
6690 | static void fuse_aio_complete_req(struct fuse_conn *fc, struct fuse_req *req) | ||
6691 | @@ -613,6 +619,7 @@ static size_t fuse_async_req_send(struct fuse_conn *fc, struct fuse_req *req, | ||
6692 | size_t num_bytes, struct fuse_io_priv *io) | ||
6693 | { | ||
6694 | spin_lock(&io->lock); | ||
6695 | + kref_get(&io->refcnt); | ||
6696 | io->size += num_bytes; | ||
6697 | io->reqs++; | ||
6698 | spin_unlock(&io->lock); | ||
6699 | @@ -691,7 +698,7 @@ static void fuse_short_read(struct fuse_req *req, struct inode *inode, | ||
6700 | |||
6701 | static int fuse_do_readpage(struct file *file, struct page *page) | ||
6702 | { | ||
6703 | - struct fuse_io_priv io = { .async = 0, .file = file }; | ||
6704 | + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file); | ||
6705 | struct inode *inode = page->mapping->host; | ||
6706 | struct fuse_conn *fc = get_fuse_conn(inode); | ||
6707 | struct fuse_req *req; | ||
6708 | @@ -984,7 +991,7 @@ static size_t fuse_send_write_pages(struct fuse_req *req, struct file *file, | ||
6709 | size_t res; | ||
6710 | unsigned offset; | ||
6711 | unsigned i; | ||
6712 | - struct fuse_io_priv io = { .async = 0, .file = file }; | ||
6713 | + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file); | ||
6714 | |||
6715 | for (i = 0; i < req->num_pages; i++) | ||
6716 | fuse_wait_on_page_writeback(inode, req->pages[i]->index); | ||
6717 | @@ -1398,7 +1405,7 @@ static ssize_t __fuse_direct_read(struct fuse_io_priv *io, | ||
6718 | |||
6719 | static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to) | ||
6720 | { | ||
6721 | - struct fuse_io_priv io = { .async = 0, .file = iocb->ki_filp }; | ||
6722 | + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb->ki_filp); | ||
6723 | return __fuse_direct_read(&io, to, &iocb->ki_pos); | ||
6724 | } | ||
6725 | |||
6726 | @@ -1406,7 +1413,7 @@ static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from) | ||
6727 | { | ||
6728 | struct file *file = iocb->ki_filp; | ||
6729 | struct inode *inode = file_inode(file); | ||
6730 | - struct fuse_io_priv io = { .async = 0, .file = file }; | ||
6731 | + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file); | ||
6732 | ssize_t res; | ||
6733 | |||
6734 | if (is_bad_inode(inode)) | ||
6735 | @@ -2786,6 +2793,7 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) | ||
6736 | loff_t i_size; | ||
6737 | size_t count = iov_iter_count(iter); | ||
6738 | struct fuse_io_priv *io; | ||
6739 | + bool is_sync = is_sync_kiocb(iocb); | ||
6740 | |||
6741 | pos = offset; | ||
6742 | inode = file->f_mapping->host; | ||
6743 | @@ -2806,6 +2814,7 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) | ||
6744 | if (!io) | ||
6745 | return -ENOMEM; | ||
6746 | spin_lock_init(&io->lock); | ||
6747 | + kref_init(&io->refcnt); | ||
6748 | io->reqs = 1; | ||
6749 | io->bytes = -1; | ||
6750 | io->size = 0; | ||
6751 | @@ -2825,12 +2834,18 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) | ||
6752 | * to wait on real async I/O requests, so we must submit this request | ||
6753 | * synchronously. | ||
6754 | */ | ||
6755 | - if (!is_sync_kiocb(iocb) && (offset + count > i_size) && | ||
6756 | + if (!is_sync && (offset + count > i_size) && | ||
6757 | iov_iter_rw(iter) == WRITE) | ||
6758 | io->async = false; | ||
6759 | |||
6760 | - if (io->async && is_sync_kiocb(iocb)) | ||
6761 | + if (io->async && is_sync) { | ||
6762 | + /* | ||
6763 | + * Additional reference to keep io around after | ||
6764 | + * calling fuse_aio_complete() | ||
6765 | + */ | ||
6766 | + kref_get(&io->refcnt); | ||
6767 | io->done = &wait; | ||
6768 | + } | ||
6769 | |||
6770 | if (iov_iter_rw(iter) == WRITE) { | ||
6771 | ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE); | ||
6772 | @@ -2843,14 +2858,14 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) | ||
6773 | fuse_aio_complete(io, ret < 0 ? ret : 0, -1); | ||
6774 | |||
6775 | /* we have a non-extending, async request, so return */ | ||
6776 | - if (!is_sync_kiocb(iocb)) | ||
6777 | + if (!is_sync) | ||
6778 | return -EIOCBQUEUED; | ||
6779 | |||
6780 | wait_for_completion(&wait); | ||
6781 | ret = fuse_get_res_by_io(io); | ||
6782 | } | ||
6783 | |||
6784 | - kfree(io); | ||
6785 | + kref_put(&io->refcnt, fuse_io_release); | ||
6786 | |||
6787 | if (iov_iter_rw(iter) == WRITE) { | ||
6788 | if (ret > 0) | ||
6789 | diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h | ||
6790 | index 405113101db8..604cd42dafef 100644 | ||
6791 | --- a/fs/fuse/fuse_i.h | ||
6792 | +++ b/fs/fuse/fuse_i.h | ||
6793 | @@ -22,6 +22,7 @@ | ||
6794 | #include <linux/rbtree.h> | ||
6795 | #include <linux/poll.h> | ||
6796 | #include <linux/workqueue.h> | ||
6797 | +#include <linux/kref.h> | ||
6798 | |||
6799 | /** Max number of pages that can be used in a single read request */ | ||
6800 | #define FUSE_MAX_PAGES_PER_REQ 32 | ||
6801 | @@ -243,6 +244,7 @@ struct fuse_args { | ||
6802 | |||
6803 | /** The request IO state (for asynchronous processing) */ | ||
6804 | struct fuse_io_priv { | ||
6805 | + struct kref refcnt; | ||
6806 | int async; | ||
6807 | spinlock_t lock; | ||
6808 | unsigned reqs; | ||
6809 | @@ -256,6 +258,13 @@ struct fuse_io_priv { | ||
6810 | struct completion *done; | ||
6811 | }; | ||
6812 | |||
6813 | +#define FUSE_IO_PRIV_SYNC(f) \ | ||
6814 | +{ \ | ||
6815 | + .refcnt = { ATOMIC_INIT(1) }, \ | ||
6816 | + .async = 0, \ | ||
6817 | + .file = f, \ | ||
6818 | +} | ||
6819 | + | ||
6820 | /** | ||
6821 | * Request flags | ||
6822 | * | ||
6823 | diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c | ||
6824 | index 81e622681c82..624a57a9c4aa 100644 | ||
6825 | --- a/fs/jbd2/journal.c | ||
6826 | +++ b/fs/jbd2/journal.c | ||
6827 | @@ -1408,11 +1408,12 @@ out: | ||
6828 | /** | ||
6829 | * jbd2_mark_journal_empty() - Mark on disk journal as empty. | ||
6830 | * @journal: The journal to update. | ||
6831 | + * @write_op: With which operation should we write the journal sb | ||
6832 | * | ||
6833 | * Update a journal's dynamic superblock fields to show that journal is empty. | ||
6834 | * Write updated superblock to disk waiting for IO to complete. | ||
6835 | */ | ||
6836 | -static void jbd2_mark_journal_empty(journal_t *journal) | ||
6837 | +static void jbd2_mark_journal_empty(journal_t *journal, int write_op) | ||
6838 | { | ||
6839 | journal_superblock_t *sb = journal->j_superblock; | ||
6840 | |||
6841 | @@ -1430,7 +1431,7 @@ static void jbd2_mark_journal_empty(journal_t *journal) | ||
6842 | sb->s_start = cpu_to_be32(0); | ||
6843 | read_unlock(&journal->j_state_lock); | ||
6844 | |||
6845 | - jbd2_write_superblock(journal, WRITE_FUA); | ||
6846 | + jbd2_write_superblock(journal, write_op); | ||
6847 | |||
6848 | /* Log is no longer empty */ | ||
6849 | write_lock(&journal->j_state_lock); | ||
6850 | @@ -1716,7 +1717,13 @@ int jbd2_journal_destroy(journal_t *journal) | ||
6851 | if (journal->j_sb_buffer) { | ||
6852 | if (!is_journal_aborted(journal)) { | ||
6853 | mutex_lock(&journal->j_checkpoint_mutex); | ||
6854 | - jbd2_mark_journal_empty(journal); | ||
6855 | + | ||
6856 | + write_lock(&journal->j_state_lock); | ||
6857 | + journal->j_tail_sequence = | ||
6858 | + ++journal->j_transaction_sequence; | ||
6859 | + write_unlock(&journal->j_state_lock); | ||
6860 | + | ||
6861 | + jbd2_mark_journal_empty(journal, WRITE_FLUSH_FUA); | ||
6862 | mutex_unlock(&journal->j_checkpoint_mutex); | ||
6863 | } else | ||
6864 | err = -EIO; | ||
6865 | @@ -1975,7 +1982,7 @@ int jbd2_journal_flush(journal_t *journal) | ||
6866 | * the magic code for a fully-recovered superblock. Any future | ||
6867 | * commits of data to the journal will restore the current | ||
6868 | * s_start value. */ | ||
6869 | - jbd2_mark_journal_empty(journal); | ||
6870 | + jbd2_mark_journal_empty(journal, WRITE_FUA); | ||
6871 | mutex_unlock(&journal->j_checkpoint_mutex); | ||
6872 | write_lock(&journal->j_state_lock); | ||
6873 | J_ASSERT(!journal->j_running_transaction); | ||
6874 | @@ -2021,7 +2028,7 @@ int jbd2_journal_wipe(journal_t *journal, int write) | ||
6875 | if (write) { | ||
6876 | /* Lock to make assertions happy... */ | ||
6877 | mutex_lock(&journal->j_checkpoint_mutex); | ||
6878 | - jbd2_mark_journal_empty(journal); | ||
6879 | + jbd2_mark_journal_empty(journal, WRITE_FUA); | ||
6880 | mutex_unlock(&journal->j_checkpoint_mutex); | ||
6881 | } | ||
6882 | |||
6883 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c | ||
6884 | index a9f096c7e99f..7d5351cd67fb 100644 | ||
6885 | --- a/fs/nfsd/nfs4proc.c | ||
6886 | +++ b/fs/nfsd/nfs4proc.c | ||
6887 | @@ -877,6 +877,7 @@ nfsd4_secinfo(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
6888 | &exp, &dentry); | ||
6889 | if (err) | ||
6890 | return err; | ||
6891 | + fh_unlock(&cstate->current_fh); | ||
6892 | if (d_really_is_negative(dentry)) { | ||
6893 | exp_put(exp); | ||
6894 | err = nfserr_noent; | ||
6895 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c | ||
6896 | index 51c9e9ca39a4..12935209deca 100644 | ||
6897 | --- a/fs/nfsd/nfs4xdr.c | ||
6898 | +++ b/fs/nfsd/nfs4xdr.c | ||
6899 | @@ -1072,8 +1072,9 @@ nfsd4_decode_rename(struct nfsd4_compoundargs *argp, struct nfsd4_rename *rename | ||
6900 | |||
6901 | READ_BUF(4); | ||
6902 | rename->rn_snamelen = be32_to_cpup(p++); | ||
6903 | - READ_BUF(rename->rn_snamelen + 4); | ||
6904 | + READ_BUF(rename->rn_snamelen); | ||
6905 | SAVEMEM(rename->rn_sname, rename->rn_snamelen); | ||
6906 | + READ_BUF(4); | ||
6907 | rename->rn_tnamelen = be32_to_cpup(p++); | ||
6908 | READ_BUF(rename->rn_tnamelen); | ||
6909 | SAVEMEM(rename->rn_tname, rename->rn_tnamelen); | ||
6910 | @@ -1155,13 +1156,14 @@ nfsd4_decode_setclientid(struct nfsd4_compoundargs *argp, struct nfsd4_setclient | ||
6911 | READ_BUF(8); | ||
6912 | setclientid->se_callback_prog = be32_to_cpup(p++); | ||
6913 | setclientid->se_callback_netid_len = be32_to_cpup(p++); | ||
6914 | - | ||
6915 | - READ_BUF(setclientid->se_callback_netid_len + 4); | ||
6916 | + READ_BUF(setclientid->se_callback_netid_len); | ||
6917 | SAVEMEM(setclientid->se_callback_netid_val, setclientid->se_callback_netid_len); | ||
6918 | + READ_BUF(4); | ||
6919 | setclientid->se_callback_addr_len = be32_to_cpup(p++); | ||
6920 | |||
6921 | - READ_BUF(setclientid->se_callback_addr_len + 4); | ||
6922 | + READ_BUF(setclientid->se_callback_addr_len); | ||
6923 | SAVEMEM(setclientid->se_callback_addr_val, setclientid->se_callback_addr_len); | ||
6924 | + READ_BUF(4); | ||
6925 | setclientid->se_callback_ident = be32_to_cpup(p++); | ||
6926 | |||
6927 | DECODE_TAIL; | ||
6928 | @@ -1815,8 +1817,9 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp) | ||
6929 | |||
6930 | READ_BUF(4); | ||
6931 | argp->taglen = be32_to_cpup(p++); | ||
6932 | - READ_BUF(argp->taglen + 8); | ||
6933 | + READ_BUF(argp->taglen); | ||
6934 | SAVEMEM(argp->tag, argp->taglen); | ||
6935 | + READ_BUF(8); | ||
6936 | argp->minorversion = be32_to_cpup(p++); | ||
6937 | argp->opcnt = be32_to_cpup(p++); | ||
6938 | max_reply += 4 + (XDR_QUADLEN(argp->taglen) << 2); | ||
6939 | diff --git a/fs/ocfs2/dlm/dlmconvert.c b/fs/ocfs2/dlm/dlmconvert.c | ||
6940 | index e36d63ff1783..f90931335c6b 100644 | ||
6941 | --- a/fs/ocfs2/dlm/dlmconvert.c | ||
6942 | +++ b/fs/ocfs2/dlm/dlmconvert.c | ||
6943 | @@ -262,6 +262,7 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm, | ||
6944 | struct dlm_lock *lock, int flags, int type) | ||
6945 | { | ||
6946 | enum dlm_status status; | ||
6947 | + u8 old_owner = res->owner; | ||
6948 | |||
6949 | mlog(0, "type=%d, convert_type=%d, busy=%d\n", lock->ml.type, | ||
6950 | lock->ml.convert_type, res->state & DLM_LOCK_RES_IN_PROGRESS); | ||
6951 | @@ -287,6 +288,19 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm, | ||
6952 | status = DLM_DENIED; | ||
6953 | goto bail; | ||
6954 | } | ||
6955 | + | ||
6956 | + if (lock->ml.type == type && lock->ml.convert_type == LKM_IVMODE) { | ||
6957 | + mlog(0, "last convert request returned DLM_RECOVERING, but " | ||
6958 | + "owner has already queued and sent ast to me. res %.*s, " | ||
6959 | + "(cookie=%u:%llu, type=%d, conv=%d)\n", | ||
6960 | + res->lockname.len, res->lockname.name, | ||
6961 | + dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)), | ||
6962 | + dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie)), | ||
6963 | + lock->ml.type, lock->ml.convert_type); | ||
6964 | + status = DLM_NORMAL; | ||
6965 | + goto bail; | ||
6966 | + } | ||
6967 | + | ||
6968 | res->state |= DLM_LOCK_RES_IN_PROGRESS; | ||
6969 | /* move lock to local convert queue */ | ||
6970 | /* do not alter lock refcount. switching lists. */ | ||
6971 | @@ -316,11 +330,19 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm, | ||
6972 | spin_lock(&res->spinlock); | ||
6973 | res->state &= ~DLM_LOCK_RES_IN_PROGRESS; | ||
6974 | lock->convert_pending = 0; | ||
6975 | - /* if it failed, move it back to granted queue */ | ||
6976 | + /* if it failed, move it back to granted queue. | ||
6977 | + * if master returns DLM_NORMAL and then down before sending ast, | ||
6978 | + * it may have already been moved to granted queue, reset to | ||
6979 | + * DLM_RECOVERING and retry convert */ | ||
6980 | if (status != DLM_NORMAL) { | ||
6981 | if (status != DLM_NOTQUEUED) | ||
6982 | dlm_error(status); | ||
6983 | dlm_revert_pending_convert(res, lock); | ||
6984 | + } else if ((res->state & DLM_LOCK_RES_RECOVERING) || | ||
6985 | + (old_owner != res->owner)) { | ||
6986 | + mlog(0, "res %.*s is in recovering or has been recovered.\n", | ||
6987 | + res->lockname.len, res->lockname.name); | ||
6988 | + status = DLM_RECOVERING; | ||
6989 | } | ||
6990 | bail: | ||
6991 | spin_unlock(&res->spinlock); | ||
6992 | diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c | ||
6993 | index 42f0cae93a0a..4a338803e7e9 100644 | ||
6994 | --- a/fs/ocfs2/dlm/dlmrecovery.c | ||
6995 | +++ b/fs/ocfs2/dlm/dlmrecovery.c | ||
6996 | @@ -2064,7 +2064,6 @@ void dlm_move_lockres_to_recovery_list(struct dlm_ctxt *dlm, | ||
6997 | dlm_lock_get(lock); | ||
6998 | if (lock->convert_pending) { | ||
6999 | /* move converting lock back to granted */ | ||
7000 | - BUG_ON(i != DLM_CONVERTING_LIST); | ||
7001 | mlog(0, "node died with convert pending " | ||
7002 | "on %.*s. move back to granted list.\n", | ||
7003 | res->lockname.len, res->lockname.name); | ||
7004 | diff --git a/fs/open.c b/fs/open.c | ||
7005 | index b6f1e96a7c0b..6a24f988d253 100644 | ||
7006 | --- a/fs/open.c | ||
7007 | +++ b/fs/open.c | ||
7008 | @@ -995,14 +995,12 @@ struct file *filp_open(const char *filename, int flags, umode_t mode) | ||
7009 | EXPORT_SYMBOL(filp_open); | ||
7010 | |||
7011 | struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt, | ||
7012 | - const char *filename, int flags) | ||
7013 | + const char *filename, int flags, umode_t mode) | ||
7014 | { | ||
7015 | struct open_flags op; | ||
7016 | - int err = build_open_flags(flags, 0, &op); | ||
7017 | + int err = build_open_flags(flags, mode, &op); | ||
7018 | if (err) | ||
7019 | return ERR_PTR(err); | ||
7020 | - if (flags & O_CREAT) | ||
7021 | - return ERR_PTR(-EINVAL); | ||
7022 | return do_file_open_root(dentry, mnt, filename, &op); | ||
7023 | } | ||
7024 | EXPORT_SYMBOL(file_open_root); | ||
7025 | diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c | ||
7026 | index 8ebd9a334085..87645955990d 100644 | ||
7027 | --- a/fs/proc_namespace.c | ||
7028 | +++ b/fs/proc_namespace.c | ||
7029 | @@ -197,6 +197,8 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) | ||
7030 | if (sb->s_op->show_devname) { | ||
7031 | seq_puts(m, "device "); | ||
7032 | err = sb->s_op->show_devname(m, mnt_path.dentry); | ||
7033 | + if (err) | ||
7034 | + goto out; | ||
7035 | } else { | ||
7036 | if (r->mnt_devname) { | ||
7037 | seq_puts(m, "device "); | ||
7038 | diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c | ||
7039 | index ef0d64b2a6d9..353ff31dcee1 100644 | ||
7040 | --- a/fs/quota/dquot.c | ||
7041 | +++ b/fs/quota/dquot.c | ||
7042 | @@ -1398,7 +1398,7 @@ static int dquot_active(const struct inode *inode) | ||
7043 | static int __dquot_initialize(struct inode *inode, int type) | ||
7044 | { | ||
7045 | int cnt, init_needed = 0; | ||
7046 | - struct dquot **dquots, *got[MAXQUOTAS]; | ||
7047 | + struct dquot **dquots, *got[MAXQUOTAS] = {}; | ||
7048 | struct super_block *sb = inode->i_sb; | ||
7049 | qsize_t rsv; | ||
7050 | int ret = 0; | ||
7051 | @@ -1415,7 +1415,6 @@ static int __dquot_initialize(struct inode *inode, int type) | ||
7052 | int rc; | ||
7053 | struct dquot *dquot; | ||
7054 | |||
7055 | - got[cnt] = NULL; | ||
7056 | if (type != -1 && cnt != type) | ||
7057 | continue; | ||
7058 | /* | ||
7059 | diff --git a/fs/splice.c b/fs/splice.c | ||
7060 | index 4cf700d50b40..0f77e9682857 100644 | ||
7061 | --- a/fs/splice.c | ||
7062 | +++ b/fs/splice.c | ||
7063 | @@ -185,6 +185,9 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, | ||
7064 | unsigned int spd_pages = spd->nr_pages; | ||
7065 | int ret, do_wakeup, page_nr; | ||
7066 | |||
7067 | + if (!spd_pages) | ||
7068 | + return 0; | ||
7069 | + | ||
7070 | ret = 0; | ||
7071 | do_wakeup = 0; | ||
7072 | page_nr = 0; | ||
7073 | diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c | ||
7074 | index 0ef7c2ed3f8a..4fa14820e2e2 100644 | ||
7075 | --- a/fs/xfs/xfs_attr_list.c | ||
7076 | +++ b/fs/xfs/xfs_attr_list.c | ||
7077 | @@ -202,8 +202,10 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) | ||
7078 | sbp->namelen, | ||
7079 | sbp->valuelen, | ||
7080 | &sbp->name[sbp->namelen]); | ||
7081 | - if (error) | ||
7082 | + if (error) { | ||
7083 | + kmem_free(sbuf); | ||
7084 | return error; | ||
7085 | + } | ||
7086 | if (context->seen_enough) | ||
7087 | break; | ||
7088 | cursor->offset++; | ||
7089 | @@ -454,14 +456,13 @@ xfs_attr3_leaf_list_int( | ||
7090 | args.rmtblkcnt = xfs_attr3_rmt_blocks( | ||
7091 | args.dp->i_mount, valuelen); | ||
7092 | retval = xfs_attr_rmtval_get(&args); | ||
7093 | - if (retval) | ||
7094 | - return retval; | ||
7095 | - retval = context->put_listent(context, | ||
7096 | - entry->flags, | ||
7097 | - name_rmt->name, | ||
7098 | - (int)name_rmt->namelen, | ||
7099 | - valuelen, | ||
7100 | - args.value); | ||
7101 | + if (!retval) | ||
7102 | + retval = context->put_listent(context, | ||
7103 | + entry->flags, | ||
7104 | + name_rmt->name, | ||
7105 | + (int)name_rmt->namelen, | ||
7106 | + valuelen, | ||
7107 | + args.value); | ||
7108 | kmem_free(args.value); | ||
7109 | } else { | ||
7110 | retval = context->put_listent(context, | ||
7111 | diff --git a/include/asm-generic/bitops/lock.h b/include/asm-generic/bitops/lock.h | ||
7112 | index c30266e94806..8ef0ccbf8167 100644 | ||
7113 | --- a/include/asm-generic/bitops/lock.h | ||
7114 | +++ b/include/asm-generic/bitops/lock.h | ||
7115 | @@ -29,16 +29,16 @@ do { \ | ||
7116 | * @nr: the bit to set | ||
7117 | * @addr: the address to start counting from | ||
7118 | * | ||
7119 | - * This operation is like clear_bit_unlock, however it is not atomic. | ||
7120 | - * It does provide release barrier semantics so it can be used to unlock | ||
7121 | - * a bit lock, however it would only be used if no other CPU can modify | ||
7122 | - * any bits in the memory until the lock is released (a good example is | ||
7123 | - * if the bit lock itself protects access to the other bits in the word). | ||
7124 | + * A weaker form of clear_bit_unlock() as used by __bit_lock_unlock(). If all | ||
7125 | + * the bits in the word are protected by this lock some archs can use weaker | ||
7126 | + * ops to safely unlock. | ||
7127 | + * | ||
7128 | + * See for example x86's implementation. | ||
7129 | */ | ||
7130 | #define __clear_bit_unlock(nr, addr) \ | ||
7131 | do { \ | ||
7132 | - smp_mb(); \ | ||
7133 | - __clear_bit(nr, addr); \ | ||
7134 | + smp_mb__before_atomic(); \ | ||
7135 | + clear_bit(nr, addr); \ | ||
7136 | } while (0) | ||
7137 | |||
7138 | #endif /* _ASM_GENERIC_BITOPS_LOCK_H_ */ | ||
7139 | diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h | ||
7140 | index 8e30faeab183..a7c7f74808a4 100644 | ||
7141 | --- a/include/linux/cgroup-defs.h | ||
7142 | +++ b/include/linux/cgroup-defs.h | ||
7143 | @@ -216,6 +216,9 @@ struct css_set { | ||
7144 | /* all css_task_iters currently walking this cset */ | ||
7145 | struct list_head task_iters; | ||
7146 | |||
7147 | + /* dead and being drained, ignore for migration */ | ||
7148 | + bool dead; | ||
7149 | + | ||
7150 | /* For RCU-protected deletion */ | ||
7151 | struct rcu_head rcu_head; | ||
7152 | }; | ||
7153 | diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h | ||
7154 | index ec1c61c87d89..899ab9f8549e 100644 | ||
7155 | --- a/include/linux/device-mapper.h | ||
7156 | +++ b/include/linux/device-mapper.h | ||
7157 | @@ -124,6 +124,8 @@ struct dm_dev { | ||
7158 | char name[16]; | ||
7159 | }; | ||
7160 | |||
7161 | +dev_t dm_get_dev_t(const char *path); | ||
7162 | + | ||
7163 | /* | ||
7164 | * Constructors should call these functions to ensure destination devices | ||
7165 | * are opened/closed correctly. | ||
7166 | diff --git a/include/linux/fs.h b/include/linux/fs.h | ||
7167 | index 3aa514254161..22c5a0cf16e3 100644 | ||
7168 | --- a/include/linux/fs.h | ||
7169 | +++ b/include/linux/fs.h | ||
7170 | @@ -2217,7 +2217,7 @@ extern long do_sys_open(int dfd, const char __user *filename, int flags, | ||
7171 | extern struct file *file_open_name(struct filename *, int, umode_t); | ||
7172 | extern struct file *filp_open(const char *, int, umode_t); | ||
7173 | extern struct file *file_open_root(struct dentry *, struct vfsmount *, | ||
7174 | - const char *, int); | ||
7175 | + const char *, int, umode_t); | ||
7176 | extern struct file * dentry_open(const struct path *, int, const struct cred *); | ||
7177 | extern int filp_close(struct file *, fl_owner_t id); | ||
7178 | |||
7179 | diff --git a/include/linux/kernel.h b/include/linux/kernel.h | ||
7180 | index 350dfb08aee3..924853d33a13 100644 | ||
7181 | --- a/include/linux/kernel.h | ||
7182 | +++ b/include/linux/kernel.h | ||
7183 | @@ -607,7 +607,7 @@ do { \ | ||
7184 | |||
7185 | #define do_trace_printk(fmt, args...) \ | ||
7186 | do { \ | ||
7187 | - static const char *trace_printk_fmt \ | ||
7188 | + static const char *trace_printk_fmt __used \ | ||
7189 | __attribute__((section("__trace_printk_fmt"))) = \ | ||
7190 | __builtin_constant_p(fmt) ? fmt : NULL; \ | ||
7191 | \ | ||
7192 | @@ -651,7 +651,7 @@ int __trace_printk(unsigned long ip, const char *fmt, ...); | ||
7193 | */ | ||
7194 | |||
7195 | #define trace_puts(str) ({ \ | ||
7196 | - static const char *trace_printk_fmt \ | ||
7197 | + static const char *trace_printk_fmt __used \ | ||
7198 | __attribute__((section("__trace_printk_fmt"))) = \ | ||
7199 | __builtin_constant_p(str) ? str : NULL; \ | ||
7200 | \ | ||
7201 | @@ -673,7 +673,7 @@ extern void trace_dump_stack(int skip); | ||
7202 | #define ftrace_vprintk(fmt, vargs) \ | ||
7203 | do { \ | ||
7204 | if (__builtin_constant_p(fmt)) { \ | ||
7205 | - static const char *trace_printk_fmt \ | ||
7206 | + static const char *trace_printk_fmt __used \ | ||
7207 | __attribute__((section("__trace_printk_fmt"))) = \ | ||
7208 | __builtin_constant_p(fmt) ? fmt : NULL; \ | ||
7209 | \ | ||
7210 | diff --git a/include/linux/pci.h b/include/linux/pci.h | ||
7211 | index 6ae25aae88fd..4e554bfff129 100644 | ||
7212 | --- a/include/linux/pci.h | ||
7213 | +++ b/include/linux/pci.h | ||
7214 | @@ -359,6 +359,7 @@ struct pci_dev { | ||
7215 | unsigned int io_window_1k:1; /* Intel P2P bridge 1K I/O windows */ | ||
7216 | unsigned int irq_managed:1; | ||
7217 | unsigned int has_secondary_link:1; | ||
7218 | + unsigned int non_compliant_bars:1; /* broken BARs; ignore them */ | ||
7219 | pci_dev_flags_t dev_flags; | ||
7220 | atomic_t enable_cnt; /* pci_enable_device has been called */ | ||
7221 | |||
7222 | diff --git a/include/linux/platform_data/asoc-s3c.h b/include/linux/platform_data/asoc-s3c.h | ||
7223 | index 5e0bc779e6c5..33f88b4479e4 100644 | ||
7224 | --- a/include/linux/platform_data/asoc-s3c.h | ||
7225 | +++ b/include/linux/platform_data/asoc-s3c.h | ||
7226 | @@ -39,6 +39,10 @@ struct samsung_i2s { | ||
7227 | */ | ||
7228 | struct s3c_audio_pdata { | ||
7229 | int (*cfg_gpio)(struct platform_device *); | ||
7230 | + void *dma_playback; | ||
7231 | + void *dma_capture; | ||
7232 | + void *dma_play_sec; | ||
7233 | + void *dma_capture_mic; | ||
7234 | union { | ||
7235 | struct samsung_i2s i2s; | ||
7236 | } type; | ||
7237 | diff --git a/include/linux/thermal.h b/include/linux/thermal.h | ||
7238 | index e13a1ace50e9..4a849f19e6c9 100644 | ||
7239 | --- a/include/linux/thermal.h | ||
7240 | +++ b/include/linux/thermal.h | ||
7241 | @@ -156,6 +156,7 @@ struct thermal_attr { | ||
7242 | * @trip_hyst_attrs: attributes for trip points for sysfs: trip hysteresis | ||
7243 | * @devdata: private pointer for device private data | ||
7244 | * @trips: number of trip points the thermal zone supports | ||
7245 | + * @trips_disabled; bitmap for disabled trips | ||
7246 | * @passive_delay: number of milliseconds to wait between polls when | ||
7247 | * performing passive cooling. | ||
7248 | * @polling_delay: number of milliseconds to wait between polls when | ||
7249 | @@ -191,6 +192,7 @@ struct thermal_zone_device { | ||
7250 | struct thermal_attr *trip_hyst_attrs; | ||
7251 | void *devdata; | ||
7252 | int trips; | ||
7253 | + unsigned long trips_disabled; /* bitmap for disabled trips */ | ||
7254 | int passive_delay; | ||
7255 | int polling_delay; | ||
7256 | int temperature; | ||
7257 | diff --git a/include/linux/tty.h b/include/linux/tty.h | ||
7258 | index 6b6e811f4575..3bf03b6b52e9 100644 | ||
7259 | --- a/include/linux/tty.h | ||
7260 | +++ b/include/linux/tty.h | ||
7261 | @@ -594,7 +594,7 @@ static inline int tty_ldisc_receive_buf(struct tty_ldisc *ld, unsigned char *p, | ||
7262 | count = ld->ops->receive_buf2(ld->tty, p, f, count); | ||
7263 | else { | ||
7264 | count = min_t(int, count, ld->tty->receive_room); | ||
7265 | - if (count) | ||
7266 | + if (count && ld->ops->receive_buf) | ||
7267 | ld->ops->receive_buf(ld->tty, p, f, count); | ||
7268 | } | ||
7269 | return count; | ||
7270 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c | ||
7271 | index fb1ecfd2decd..dc94f8beb097 100644 | ||
7272 | --- a/kernel/cgroup.c | ||
7273 | +++ b/kernel/cgroup.c | ||
7274 | @@ -2498,6 +2498,14 @@ static void cgroup_migrate_add_src(struct css_set *src_cset, | ||
7275 | lockdep_assert_held(&cgroup_mutex); | ||
7276 | lockdep_assert_held(&css_set_lock); | ||
7277 | |||
7278 | + /* | ||
7279 | + * If ->dead, @src_set is associated with one or more dead cgroups | ||
7280 | + * and doesn't contain any migratable tasks. Ignore it early so | ||
7281 | + * that the rest of migration path doesn't get confused by it. | ||
7282 | + */ | ||
7283 | + if (src_cset->dead) | ||
7284 | + return; | ||
7285 | + | ||
7286 | src_cgrp = cset_cgroup_from_root(src_cset, dst_cgrp->root); | ||
7287 | |||
7288 | if (!list_empty(&src_cset->mg_preload_node)) | ||
7289 | @@ -5131,6 +5139,7 @@ static int cgroup_destroy_locked(struct cgroup *cgrp) | ||
7290 | __releases(&cgroup_mutex) __acquires(&cgroup_mutex) | ||
7291 | { | ||
7292 | struct cgroup_subsys_state *css; | ||
7293 | + struct cgrp_cset_link *link; | ||
7294 | int ssid; | ||
7295 | |||
7296 | lockdep_assert_held(&cgroup_mutex); | ||
7297 | @@ -5151,11 +5160,18 @@ static int cgroup_destroy_locked(struct cgroup *cgrp) | ||
7298 | return -EBUSY; | ||
7299 | |||
7300 | /* | ||
7301 | - * Mark @cgrp dead. This prevents further task migration and child | ||
7302 | - * creation by disabling cgroup_lock_live_group(). | ||
7303 | + * Mark @cgrp and the associated csets dead. The former prevents | ||
7304 | + * further task migration and child creation by disabling | ||
7305 | + * cgroup_lock_live_group(). The latter makes the csets ignored by | ||
7306 | + * the migration path. | ||
7307 | */ | ||
7308 | cgrp->self.flags &= ~CSS_ONLINE; | ||
7309 | |||
7310 | + spin_lock_bh(&css_set_lock); | ||
7311 | + list_for_each_entry(link, &cgrp->cset_links, cset_link) | ||
7312 | + link->cset->dead = true; | ||
7313 | + spin_unlock_bh(&css_set_lock); | ||
7314 | + | ||
7315 | /* initiate massacre of all css's */ | ||
7316 | for_each_css(css, ssid, cgrp) | ||
7317 | kill_css(css); | ||
7318 | diff --git a/kernel/events/core.c b/kernel/events/core.c | ||
7319 | index 1087bbeb152b..faf2067fc8e2 100644 | ||
7320 | --- a/kernel/events/core.c | ||
7321 | +++ b/kernel/events/core.c | ||
7322 | @@ -7979,6 +7979,9 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, | ||
7323 | } | ||
7324 | } | ||
7325 | |||
7326 | + /* symmetric to unaccount_event() in _free_event() */ | ||
7327 | + account_event(event); | ||
7328 | + | ||
7329 | return event; | ||
7330 | |||
7331 | err_per_task: | ||
7332 | @@ -8342,8 +8345,6 @@ SYSCALL_DEFINE5(perf_event_open, | ||
7333 | } | ||
7334 | } | ||
7335 | |||
7336 | - account_event(event); | ||
7337 | - | ||
7338 | /* | ||
7339 | * Special case software events and allow them to be part of | ||
7340 | * any hardware group. | ||
7341 | @@ -8626,8 +8627,6 @@ perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu, | ||
7342 | /* Mark owner so we could distinguish it from user events. */ | ||
7343 | event->owner = EVENT_OWNER_KERNEL; | ||
7344 | |||
7345 | - account_event(event); | ||
7346 | - | ||
7347 | ctx = find_get_context(event->pmu, task, event); | ||
7348 | if (IS_ERR(ctx)) { | ||
7349 | err = PTR_ERR(ctx); | ||
7350 | diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c | ||
7351 | index b7342a24f559..b7dd5718836e 100644 | ||
7352 | --- a/kernel/power/hibernate.c | ||
7353 | +++ b/kernel/power/hibernate.c | ||
7354 | @@ -339,6 +339,7 @@ int hibernation_snapshot(int platform_mode) | ||
7355 | pm_message_t msg; | ||
7356 | int error; | ||
7357 | |||
7358 | + pm_suspend_clear_flags(); | ||
7359 | error = platform_begin(platform_mode); | ||
7360 | if (error) | ||
7361 | goto Close; | ||
7362 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
7363 | index eb70592f03f6..70e5e09341f1 100644 | ||
7364 | --- a/kernel/sched/core.c | ||
7365 | +++ b/kernel/sched/core.c | ||
7366 | @@ -5525,6 +5525,7 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu) | ||
7367 | |||
7368 | case CPU_UP_PREPARE: | ||
7369 | rq->calc_load_update = calc_load_update; | ||
7370 | + account_reset_rq(rq); | ||
7371 | break; | ||
7372 | |||
7373 | case CPU_ONLINE: | ||
7374 | diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c | ||
7375 | index 05de80b48586..f74ea89e77a8 100644 | ||
7376 | --- a/kernel/sched/cputime.c | ||
7377 | +++ b/kernel/sched/cputime.c | ||
7378 | @@ -259,21 +259,21 @@ static __always_inline bool steal_account_process_tick(void) | ||
7379 | #ifdef CONFIG_PARAVIRT | ||
7380 | if (static_key_false(¶virt_steal_enabled)) { | ||
7381 | u64 steal; | ||
7382 | - cputime_t steal_ct; | ||
7383 | + unsigned long steal_jiffies; | ||
7384 | |||
7385 | steal = paravirt_steal_clock(smp_processor_id()); | ||
7386 | steal -= this_rq()->prev_steal_time; | ||
7387 | |||
7388 | /* | ||
7389 | - * cputime_t may be less precise than nsecs (eg: if it's | ||
7390 | - * based on jiffies). Lets cast the result to cputime | ||
7391 | + * steal is in nsecs but our caller is expecting steal | ||
7392 | + * time in jiffies. Lets cast the result to jiffies | ||
7393 | * granularity and account the rest on the next rounds. | ||
7394 | */ | ||
7395 | - steal_ct = nsecs_to_cputime(steal); | ||
7396 | - this_rq()->prev_steal_time += cputime_to_nsecs(steal_ct); | ||
7397 | + steal_jiffies = nsecs_to_jiffies(steal); | ||
7398 | + this_rq()->prev_steal_time += jiffies_to_nsecs(steal_jiffies); | ||
7399 | |||
7400 | - account_steal_time(steal_ct); | ||
7401 | - return steal_ct; | ||
7402 | + account_steal_time(jiffies_to_cputime(steal_jiffies)); | ||
7403 | + return steal_jiffies; | ||
7404 | } | ||
7405 | #endif | ||
7406 | return false; | ||
7407 | diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h | ||
7408 | index b242775bf670..0517abd7dd73 100644 | ||
7409 | --- a/kernel/sched/sched.h | ||
7410 | +++ b/kernel/sched/sched.h | ||
7411 | @@ -1770,3 +1770,16 @@ static inline u64 irq_time_read(int cpu) | ||
7412 | } | ||
7413 | #endif /* CONFIG_64BIT */ | ||
7414 | #endif /* CONFIG_IRQ_TIME_ACCOUNTING */ | ||
7415 | + | ||
7416 | +static inline void account_reset_rq(struct rq *rq) | ||
7417 | +{ | ||
7418 | +#ifdef CONFIG_IRQ_TIME_ACCOUNTING | ||
7419 | + rq->prev_irq_time = 0; | ||
7420 | +#endif | ||
7421 | +#ifdef CONFIG_PARAVIRT | ||
7422 | + rq->prev_steal_time = 0; | ||
7423 | +#endif | ||
7424 | +#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING | ||
7425 | + rq->prev_steal_time_rq = 0; | ||
7426 | +#endif | ||
7427 | +} | ||
7428 | diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c | ||
7429 | index 7e7746a42a62..10a1d7dc9313 100644 | ||
7430 | --- a/kernel/sysctl_binary.c | ||
7431 | +++ b/kernel/sysctl_binary.c | ||
7432 | @@ -1321,7 +1321,7 @@ static ssize_t binary_sysctl(const int *name, int nlen, | ||
7433 | } | ||
7434 | |||
7435 | mnt = task_active_pid_ns(current)->proc_mnt; | ||
7436 | - file = file_open_root(mnt->mnt_root, mnt, pathname, flags); | ||
7437 | + file = file_open_root(mnt->mnt_root, mnt, pathname, flags, 0); | ||
7438 | result = PTR_ERR(file); | ||
7439 | if (IS_ERR(file)) | ||
7440 | goto out_putname; | ||
7441 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
7442 | index d9293402ee68..8305cbb2d5a2 100644 | ||
7443 | --- a/kernel/trace/trace.c | ||
7444 | +++ b/kernel/trace/trace.c | ||
7445 | @@ -4949,7 +4949,10 @@ static ssize_t tracing_splice_read_pipe(struct file *filp, | ||
7446 | |||
7447 | spd.nr_pages = i; | ||
7448 | |||
7449 | - ret = splice_to_pipe(pipe, &spd); | ||
7450 | + if (i) | ||
7451 | + ret = splice_to_pipe(pipe, &spd); | ||
7452 | + else | ||
7453 | + ret = 0; | ||
7454 | out: | ||
7455 | splice_shrink_spd(&spd); | ||
7456 | return ret; | ||
7457 | diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c | ||
7458 | index e4e56589ec1d..be3222b7d72e 100644 | ||
7459 | --- a/kernel/trace/trace_irqsoff.c | ||
7460 | +++ b/kernel/trace/trace_irqsoff.c | ||
7461 | @@ -109,8 +109,12 @@ static int func_prolog_dec(struct trace_array *tr, | ||
7462 | return 0; | ||
7463 | |||
7464 | local_save_flags(*flags); | ||
7465 | - /* slight chance to get a false positive on tracing_cpu */ | ||
7466 | - if (!irqs_disabled_flags(*flags)) | ||
7467 | + /* | ||
7468 | + * Slight chance to get a false positive on tracing_cpu, | ||
7469 | + * although I'm starting to think there isn't a chance. | ||
7470 | + * Leave this for now just to be paranoid. | ||
7471 | + */ | ||
7472 | + if (!irqs_disabled_flags(*flags) && !preempt_count()) | ||
7473 | return 0; | ||
7474 | |||
7475 | *data = per_cpu_ptr(tr->trace_buffer.data, cpu); | ||
7476 | diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c | ||
7477 | index 060df67dbdd1..f96f0383f6c6 100644 | ||
7478 | --- a/kernel/trace/trace_printk.c | ||
7479 | +++ b/kernel/trace/trace_printk.c | ||
7480 | @@ -296,6 +296,9 @@ static int t_show(struct seq_file *m, void *v) | ||
7481 | const char *str = *fmt; | ||
7482 | int i; | ||
7483 | |||
7484 | + if (!*fmt) | ||
7485 | + return 0; | ||
7486 | + | ||
7487 | seq_printf(m, "0x%lx : \"", *(unsigned long *)fmt); | ||
7488 | |||
7489 | /* | ||
7490 | diff --git a/kernel/watchdog.c b/kernel/watchdog.c | ||
7491 | index 18f34cf75f74..198137b1cadc 100644 | ||
7492 | --- a/kernel/watchdog.c | ||
7493 | +++ b/kernel/watchdog.c | ||
7494 | @@ -907,6 +907,9 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write, | ||
7495 | * both lockup detectors are disabled if proc_watchdog_update() | ||
7496 | * returns an error. | ||
7497 | */ | ||
7498 | + if (old == new) | ||
7499 | + goto out; | ||
7500 | + | ||
7501 | err = proc_watchdog_update(); | ||
7502 | } | ||
7503 | out: | ||
7504 | @@ -951,7 +954,7 @@ int proc_soft_watchdog(struct ctl_table *table, int write, | ||
7505 | int proc_watchdog_thresh(struct ctl_table *table, int write, | ||
7506 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
7507 | { | ||
7508 | - int err, old; | ||
7509 | + int err, old, new; | ||
7510 | |||
7511 | get_online_cpus(); | ||
7512 | mutex_lock(&watchdog_proc_mutex); | ||
7513 | @@ -971,6 +974,10 @@ int proc_watchdog_thresh(struct ctl_table *table, int write, | ||
7514 | /* | ||
7515 | * Update the sample period. Restore on failure. | ||
7516 | */ | ||
7517 | + new = ACCESS_ONCE(watchdog_thresh); | ||
7518 | + if (old == new) | ||
7519 | + goto out; | ||
7520 | + | ||
7521 | set_sample_period(); | ||
7522 | err = proc_watchdog_update(); | ||
7523 | if (err) { | ||
7524 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c | ||
7525 | index ee6acd279953..fc0bcc41d57f 100644 | ||
7526 | --- a/mm/memcontrol.c | ||
7527 | +++ b/mm/memcontrol.c | ||
7528 | @@ -1332,7 +1332,7 @@ static unsigned long mem_cgroup_get_limit(struct mem_cgroup *memcg) | ||
7529 | return limit; | ||
7530 | } | ||
7531 | |||
7532 | -static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, | ||
7533 | +static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, | ||
7534 | int order) | ||
7535 | { | ||
7536 | struct oom_control oc = { | ||
7537 | @@ -1410,6 +1410,7 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, | ||
7538 | } | ||
7539 | unlock: | ||
7540 | mutex_unlock(&oom_lock); | ||
7541 | + return chosen; | ||
7542 | } | ||
7543 | |||
7544 | #if MAX_NUMNODES > 1 | ||
7545 | @@ -5121,6 +5122,7 @@ static ssize_t memory_high_write(struct kernfs_open_file *of, | ||
7546 | char *buf, size_t nbytes, loff_t off) | ||
7547 | { | ||
7548 | struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of)); | ||
7549 | + unsigned long nr_pages; | ||
7550 | unsigned long high; | ||
7551 | int err; | ||
7552 | |||
7553 | @@ -5131,6 +5133,11 @@ static ssize_t memory_high_write(struct kernfs_open_file *of, | ||
7554 | |||
7555 | memcg->high = high; | ||
7556 | |||
7557 | + nr_pages = page_counter_read(&memcg->memory); | ||
7558 | + if (nr_pages > high) | ||
7559 | + try_to_free_mem_cgroup_pages(memcg, nr_pages - high, | ||
7560 | + GFP_KERNEL, true); | ||
7561 | + | ||
7562 | memcg_wb_domain_size_changed(memcg); | ||
7563 | return nbytes; | ||
7564 | } | ||
7565 | @@ -5152,6 +5159,8 @@ static ssize_t memory_max_write(struct kernfs_open_file *of, | ||
7566 | char *buf, size_t nbytes, loff_t off) | ||
7567 | { | ||
7568 | struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of)); | ||
7569 | + unsigned int nr_reclaims = MEM_CGROUP_RECLAIM_RETRIES; | ||
7570 | + bool drained = false; | ||
7571 | unsigned long max; | ||
7572 | int err; | ||
7573 | |||
7574 | @@ -5160,9 +5169,36 @@ static ssize_t memory_max_write(struct kernfs_open_file *of, | ||
7575 | if (err) | ||
7576 | return err; | ||
7577 | |||
7578 | - err = mem_cgroup_resize_limit(memcg, max); | ||
7579 | - if (err) | ||
7580 | - return err; | ||
7581 | + xchg(&memcg->memory.limit, max); | ||
7582 | + | ||
7583 | + for (;;) { | ||
7584 | + unsigned long nr_pages = page_counter_read(&memcg->memory); | ||
7585 | + | ||
7586 | + if (nr_pages <= max) | ||
7587 | + break; | ||
7588 | + | ||
7589 | + if (signal_pending(current)) { | ||
7590 | + err = -EINTR; | ||
7591 | + break; | ||
7592 | + } | ||
7593 | + | ||
7594 | + if (!drained) { | ||
7595 | + drain_all_stock(memcg); | ||
7596 | + drained = true; | ||
7597 | + continue; | ||
7598 | + } | ||
7599 | + | ||
7600 | + if (nr_reclaims) { | ||
7601 | + if (!try_to_free_mem_cgroup_pages(memcg, nr_pages - max, | ||
7602 | + GFP_KERNEL, true)) | ||
7603 | + nr_reclaims--; | ||
7604 | + continue; | ||
7605 | + } | ||
7606 | + | ||
7607 | + mem_cgroup_events(memcg, MEMCG_OOM, 1); | ||
7608 | + if (!mem_cgroup_out_of_memory(memcg, GFP_KERNEL, 0)) | ||
7609 | + break; | ||
7610 | + } | ||
7611 | |||
7612 | memcg_wb_domain_size_changed(memcg); | ||
7613 | return nbytes; | ||
7614 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
7615 | index 9d666df5ef95..c69531afbd8f 100644 | ||
7616 | --- a/mm/page_alloc.c | ||
7617 | +++ b/mm/page_alloc.c | ||
7618 | @@ -662,34 +662,28 @@ static inline void __free_one_page(struct page *page, | ||
7619 | unsigned long combined_idx; | ||
7620 | unsigned long uninitialized_var(buddy_idx); | ||
7621 | struct page *buddy; | ||
7622 | - unsigned int max_order = MAX_ORDER; | ||
7623 | + unsigned int max_order; | ||
7624 | + | ||
7625 | + max_order = min_t(unsigned int, MAX_ORDER, pageblock_order + 1); | ||
7626 | |||
7627 | VM_BUG_ON(!zone_is_initialized(zone)); | ||
7628 | VM_BUG_ON_PAGE(page->flags & PAGE_FLAGS_CHECK_AT_PREP, page); | ||
7629 | |||
7630 | VM_BUG_ON(migratetype == -1); | ||
7631 | - if (is_migrate_isolate(migratetype)) { | ||
7632 | - /* | ||
7633 | - * We restrict max order of merging to prevent merge | ||
7634 | - * between freepages on isolate pageblock and normal | ||
7635 | - * pageblock. Without this, pageblock isolation | ||
7636 | - * could cause incorrect freepage accounting. | ||
7637 | - */ | ||
7638 | - max_order = min_t(unsigned int, MAX_ORDER, pageblock_order + 1); | ||
7639 | - } else { | ||
7640 | + if (likely(!is_migrate_isolate(migratetype))) | ||
7641 | __mod_zone_freepage_state(zone, 1 << order, migratetype); | ||
7642 | - } | ||
7643 | |||
7644 | - page_idx = pfn & ((1 << max_order) - 1); | ||
7645 | + page_idx = pfn & ((1 << MAX_ORDER) - 1); | ||
7646 | |||
7647 | VM_BUG_ON_PAGE(page_idx & ((1 << order) - 1), page); | ||
7648 | VM_BUG_ON_PAGE(bad_range(zone, page), page); | ||
7649 | |||
7650 | +continue_merging: | ||
7651 | while (order < max_order - 1) { | ||
7652 | buddy_idx = __find_buddy_index(page_idx, order); | ||
7653 | buddy = page + (buddy_idx - page_idx); | ||
7654 | if (!page_is_buddy(page, buddy, order)) | ||
7655 | - break; | ||
7656 | + goto done_merging; | ||
7657 | /* | ||
7658 | * Our buddy is free or it is CONFIG_DEBUG_PAGEALLOC guard page, | ||
7659 | * merge with it and move up one order. | ||
7660 | @@ -706,6 +700,32 @@ static inline void __free_one_page(struct page *page, | ||
7661 | page_idx = combined_idx; | ||
7662 | order++; | ||
7663 | } | ||
7664 | + if (max_order < MAX_ORDER) { | ||
7665 | + /* If we are here, it means order is >= pageblock_order. | ||
7666 | + * We want to prevent merge between freepages on isolate | ||
7667 | + * pageblock and normal pageblock. Without this, pageblock | ||
7668 | + * isolation could cause incorrect freepage or CMA accounting. | ||
7669 | + * | ||
7670 | + * We don't want to hit this code for the more frequent | ||
7671 | + * low-order merging. | ||
7672 | + */ | ||
7673 | + if (unlikely(has_isolate_pageblock(zone))) { | ||
7674 | + int buddy_mt; | ||
7675 | + | ||
7676 | + buddy_idx = __find_buddy_index(page_idx, order); | ||
7677 | + buddy = page + (buddy_idx - page_idx); | ||
7678 | + buddy_mt = get_pageblock_migratetype(buddy); | ||
7679 | + | ||
7680 | + if (migratetype != buddy_mt | ||
7681 | + && (is_migrate_isolate(migratetype) || | ||
7682 | + is_migrate_isolate(buddy_mt))) | ||
7683 | + goto done_merging; | ||
7684 | + } | ||
7685 | + max_order++; | ||
7686 | + goto continue_merging; | ||
7687 | + } | ||
7688 | + | ||
7689 | +done_merging: | ||
7690 | set_page_order(page, order); | ||
7691 | |||
7692 | /* | ||
7693 | diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c | ||
7694 | index 7f22119276f3..b1b0a1c0bd8d 100644 | ||
7695 | --- a/net/bluetooth/mgmt.c | ||
7696 | +++ b/net/bluetooth/mgmt.c | ||
7697 | @@ -7155,6 +7155,10 @@ static int add_advertising(struct sock *sk, struct hci_dev *hdev, | ||
7698 | return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, | ||
7699 | status); | ||
7700 | |||
7701 | + if (data_len != sizeof(*cp) + cp->adv_data_len + cp->scan_rsp_len) | ||
7702 | + return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING, | ||
7703 | + MGMT_STATUS_INVALID_PARAMS); | ||
7704 | + | ||
7705 | flags = __le32_to_cpu(cp->flags); | ||
7706 | timeout = __le16_to_cpu(cp->timeout); | ||
7707 | duration = __le16_to_cpu(cp->duration); | ||
7708 | diff --git a/scripts/coccinelle/iterators/use_after_iter.cocci b/scripts/coccinelle/iterators/use_after_iter.cocci | ||
7709 | index f085f5968c52..ce8cc9c006e5 100644 | ||
7710 | --- a/scripts/coccinelle/iterators/use_after_iter.cocci | ||
7711 | +++ b/scripts/coccinelle/iterators/use_after_iter.cocci | ||
7712 | @@ -123,7 +123,7 @@ list_remove_head(x,c,...) | ||
7713 | | | ||
7714 | sizeof(<+...c...+>) | ||
7715 | | | ||
7716 | -&c->member | ||
7717 | + &c->member | ||
7718 | | | ||
7719 | c = E | ||
7720 | | | ||
7721 | diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile | ||
7722 | index d79cba4ce3eb..ebced77deb9c 100644 | ||
7723 | --- a/scripts/kconfig/Makefile | ||
7724 | +++ b/scripts/kconfig/Makefile | ||
7725 | @@ -96,13 +96,15 @@ savedefconfig: $(obj)/conf | ||
7726 | defconfig: $(obj)/conf | ||
7727 | ifeq ($(KBUILD_DEFCONFIG),) | ||
7728 | $< $(silent) --defconfig $(Kconfig) | ||
7729 | -else ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),) | ||
7730 | +else | ||
7731 | +ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),) | ||
7732 | @$(kecho) "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'" | ||
7733 | $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig) | ||
7734 | else | ||
7735 | @$(kecho) "*** Default configuration is based on target '$(KBUILD_DEFCONFIG)'" | ||
7736 | $(Q)$(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG) | ||
7737 | endif | ||
7738 | +endif | ||
7739 | |||
7740 | %_defconfig: $(obj)/conf | ||
7741 | $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig) | ||
7742 | diff --git a/scripts/package/mkspec b/scripts/package/mkspec | ||
7743 | index 71004daefe31..fe44d68e9344 100755 | ||
7744 | --- a/scripts/package/mkspec | ||
7745 | +++ b/scripts/package/mkspec | ||
7746 | @@ -131,11 +131,11 @@ echo 'rm -rf $RPM_BUILD_ROOT' | ||
7747 | echo "" | ||
7748 | echo "%post" | ||
7749 | echo "if [ -x /sbin/installkernel -a -r /boot/vmlinuz-$KERNELRELEASE -a -r /boot/System.map-$KERNELRELEASE ]; then" | ||
7750 | -echo "cp /boot/vmlinuz-$KERNELRELEASE /boot/vmlinuz-$KERNELRELEASE-rpm" | ||
7751 | -echo "cp /boot/System.map-$KERNELRELEASE /boot/System.map-$KERNELRELEASE-rpm" | ||
7752 | +echo "cp /boot/vmlinuz-$KERNELRELEASE /boot/.vmlinuz-$KERNELRELEASE-rpm" | ||
7753 | +echo "cp /boot/System.map-$KERNELRELEASE /boot/.System.map-$KERNELRELEASE-rpm" | ||
7754 | echo "rm -f /boot/vmlinuz-$KERNELRELEASE /boot/System.map-$KERNELRELEASE" | ||
7755 | -echo "/sbin/installkernel $KERNELRELEASE /boot/vmlinuz-$KERNELRELEASE-rpm /boot/System.map-$KERNELRELEASE-rpm" | ||
7756 | -echo "rm -f /boot/vmlinuz-$KERNELRELEASE-rpm /boot/System.map-$KERNELRELEASE-rpm" | ||
7757 | +echo "/sbin/installkernel $KERNELRELEASE /boot/.vmlinuz-$KERNELRELEASE-rpm /boot/.System.map-$KERNELRELEASE-rpm" | ||
7758 | +echo "rm -f /boot/.vmlinuz-$KERNELRELEASE-rpm /boot/.System.map-$KERNELRELEASE-rpm" | ||
7759 | echo "fi" | ||
7760 | echo "" | ||
7761 | echo "%files" | ||
7762 | diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c | ||
7763 | index 6b5a811e01a5..3a9b66c6e09c 100644 | ||
7764 | --- a/sound/core/pcm_lib.c | ||
7765 | +++ b/sound/core/pcm_lib.c | ||
7766 | @@ -322,7 +322,7 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream, | ||
7767 | char name[16]; | ||
7768 | snd_pcm_debug_name(substream, name, sizeof(name)); | ||
7769 | pcm_err(substream->pcm, | ||
7770 | - "BUG: %s, pos = %ld, buffer size = %ld, period size = %ld\n", | ||
7771 | + "invalid position: %s, pos = %ld, buffer size = %ld, period size = %ld\n", | ||
7772 | name, pos, runtime->buffer_size, | ||
7773 | runtime->period_size); | ||
7774 | } | ||
7775 | diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c | ||
7776 | index c1c855a6c0af..a47e8ae0eb30 100644 | ||
7777 | --- a/sound/pci/hda/patch_cirrus.c | ||
7778 | +++ b/sound/pci/hda/patch_cirrus.c | ||
7779 | @@ -174,8 +174,12 @@ static void cs_automute(struct hda_codec *codec) | ||
7780 | snd_hda_gen_update_outputs(codec); | ||
7781 | |||
7782 | if (spec->gpio_eapd_hp || spec->gpio_eapd_speaker) { | ||
7783 | - spec->gpio_data = spec->gen.hp_jack_present ? | ||
7784 | - spec->gpio_eapd_hp : spec->gpio_eapd_speaker; | ||
7785 | + if (spec->gen.automute_speaker) | ||
7786 | + spec->gpio_data = spec->gen.hp_jack_present ? | ||
7787 | + spec->gpio_eapd_hp : spec->gpio_eapd_speaker; | ||
7788 | + else | ||
7789 | + spec->gpio_data = | ||
7790 | + spec->gpio_eapd_hp | spec->gpio_eapd_speaker; | ||
7791 | snd_hda_codec_write(codec, 0x01, 0, | ||
7792 | AC_VERB_SET_GPIO_DATA, spec->gpio_data); | ||
7793 | } | ||
7794 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c | ||
7795 | index ef198903c0c3..600af5878e75 100644 | ||
7796 | --- a/sound/pci/hda/patch_conexant.c | ||
7797 | +++ b/sound/pci/hda/patch_conexant.c | ||
7798 | @@ -204,8 +204,13 @@ static void cx_auto_reboot_notify(struct hda_codec *codec) | ||
7799 | { | ||
7800 | struct conexant_spec *spec = codec->spec; | ||
7801 | |||
7802 | - if (codec->core.vendor_id != 0x14f150f2) | ||
7803 | + switch (codec->core.vendor_id) { | ||
7804 | + case 0x14f150f2: /* CX20722 */ | ||
7805 | + case 0x14f150f4: /* CX20724 */ | ||
7806 | + break; | ||
7807 | + default: | ||
7808 | return; | ||
7809 | + } | ||
7810 | |||
7811 | /* Turn the CX20722 codec into D3 to avoid spurious noises | ||
7812 | from the internal speaker during (and after) reboot */ | ||
7813 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c | ||
7814 | index 70c945603379..f7bcd8dbac14 100644 | ||
7815 | --- a/sound/pci/hda/patch_hdmi.c | ||
7816 | +++ b/sound/pci/hda/patch_hdmi.c | ||
7817 | @@ -2353,6 +2353,10 @@ static void intel_pin_eld_notify(void *audio_ptr, int port) | ||
7818 | struct hda_codec *codec = audio_ptr; | ||
7819 | int pin_nid = port + 0x04; | ||
7820 | |||
7821 | + /* we assume only from port-B to port-D */ | ||
7822 | + if (port < 1 || port > 3) | ||
7823 | + return; | ||
7824 | + | ||
7825 | /* skip notification during system suspend (but not in runtime PM); | ||
7826 | * the state will be updated at resume | ||
7827 | */ | ||
7828 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
7829 | index c2430b36e1ce..6968b796baa3 100644 | ||
7830 | --- a/sound/pci/hda/patch_realtek.c | ||
7831 | +++ b/sound/pci/hda/patch_realtek.c | ||
7832 | @@ -5529,6 +5529,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
7833 | SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), | ||
7834 | SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE), | ||
7835 | SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | ||
7836 | + SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | ||
7837 | SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), | ||
7838 | SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), | ||
7839 | SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), | ||
7840 | diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c | ||
7841 | index 42bcbac801a3..ccdab29a8b66 100644 | ||
7842 | --- a/sound/pci/intel8x0.c | ||
7843 | +++ b/sound/pci/intel8x0.c | ||
7844 | @@ -2879,6 +2879,7 @@ static void intel8x0_measure_ac97_clock(struct intel8x0 *chip) | ||
7845 | |||
7846 | static struct snd_pci_quirk intel8x0_clock_list[] = { | ||
7847 | SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000), | ||
7848 | + SND_PCI_QUIRK(0x1014, 0x0581, "AD1981B", 48000), | ||
7849 | SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100), | ||
7850 | SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000), | ||
7851 | SND_PCI_QUIRK(0x1028, 0x01ad, "AD1981B", 48000), | ||
7852 | diff --git a/sound/soc/samsung/ac97.c b/sound/soc/samsung/ac97.c | ||
7853 | index e4145509d63c..9c5219392460 100644 | ||
7854 | --- a/sound/soc/samsung/ac97.c | ||
7855 | +++ b/sound/soc/samsung/ac97.c | ||
7856 | @@ -324,7 +324,7 @@ static const struct snd_soc_component_driver s3c_ac97_component = { | ||
7857 | |||
7858 | static int s3c_ac97_probe(struct platform_device *pdev) | ||
7859 | { | ||
7860 | - struct resource *mem_res, *dmatx_res, *dmarx_res, *dmamic_res, *irq_res; | ||
7861 | + struct resource *mem_res, *irq_res; | ||
7862 | struct s3c_audio_pdata *ac97_pdata; | ||
7863 | int ret; | ||
7864 | |||
7865 | @@ -335,24 +335,6 @@ static int s3c_ac97_probe(struct platform_device *pdev) | ||
7866 | } | ||
7867 | |||
7868 | /* Check for availability of necessary resource */ | ||
7869 | - dmatx_res = platform_get_resource(pdev, IORESOURCE_DMA, 0); | ||
7870 | - if (!dmatx_res) { | ||
7871 | - dev_err(&pdev->dev, "Unable to get AC97-TX dma resource\n"); | ||
7872 | - return -ENXIO; | ||
7873 | - } | ||
7874 | - | ||
7875 | - dmarx_res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | ||
7876 | - if (!dmarx_res) { | ||
7877 | - dev_err(&pdev->dev, "Unable to get AC97-RX dma resource\n"); | ||
7878 | - return -ENXIO; | ||
7879 | - } | ||
7880 | - | ||
7881 | - dmamic_res = platform_get_resource(pdev, IORESOURCE_DMA, 2); | ||
7882 | - if (!dmamic_res) { | ||
7883 | - dev_err(&pdev->dev, "Unable to get AC97-MIC dma resource\n"); | ||
7884 | - return -ENXIO; | ||
7885 | - } | ||
7886 | - | ||
7887 | irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
7888 | if (!irq_res) { | ||
7889 | dev_err(&pdev->dev, "AC97 IRQ not provided!\n"); | ||
7890 | @@ -364,11 +346,11 @@ static int s3c_ac97_probe(struct platform_device *pdev) | ||
7891 | if (IS_ERR(s3c_ac97.regs)) | ||
7892 | return PTR_ERR(s3c_ac97.regs); | ||
7893 | |||
7894 | - s3c_ac97_pcm_out.channel = dmatx_res->start; | ||
7895 | + s3c_ac97_pcm_out.slave = ac97_pdata->dma_playback; | ||
7896 | s3c_ac97_pcm_out.dma_addr = mem_res->start + S3C_AC97_PCM_DATA; | ||
7897 | - s3c_ac97_pcm_in.channel = dmarx_res->start; | ||
7898 | + s3c_ac97_pcm_in.slave = ac97_pdata->dma_capture; | ||
7899 | s3c_ac97_pcm_in.dma_addr = mem_res->start + S3C_AC97_PCM_DATA; | ||
7900 | - s3c_ac97_mic_in.channel = dmamic_res->start; | ||
7901 | + s3c_ac97_mic_in.slave = ac97_pdata->dma_capture_mic; | ||
7902 | s3c_ac97_mic_in.dma_addr = mem_res->start + S3C_AC97_MIC_DATA; | ||
7903 | |||
7904 | init_completion(&s3c_ac97.done); | ||
7905 | diff --git a/sound/soc/samsung/dma.h b/sound/soc/samsung/dma.h | ||
7906 | index 0e85dcfec023..085ef30f5ca2 100644 | ||
7907 | --- a/sound/soc/samsung/dma.h | ||
7908 | +++ b/sound/soc/samsung/dma.h | ||
7909 | @@ -15,7 +15,7 @@ | ||
7910 | #include <sound/dmaengine_pcm.h> | ||
7911 | |||
7912 | struct s3c_dma_params { | ||
7913 | - int channel; /* Channel ID */ | ||
7914 | + void *slave; /* Channel ID */ | ||
7915 | dma_addr_t dma_addr; | ||
7916 | int dma_size; /* Size of the DMA transfer */ | ||
7917 | char *ch_name; | ||
7918 | diff --git a/sound/soc/samsung/dmaengine.c b/sound/soc/samsung/dmaengine.c | ||
7919 | index 506f5bf6d082..727008d57d14 100644 | ||
7920 | --- a/sound/soc/samsung/dmaengine.c | ||
7921 | +++ b/sound/soc/samsung/dmaengine.c | ||
7922 | @@ -50,14 +50,14 @@ void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, | ||
7923 | |||
7924 | if (playback) { | ||
7925 | playback_data = &playback->dma_data; | ||
7926 | - playback_data->filter_data = (void *)playback->channel; | ||
7927 | + playback_data->filter_data = playback->slave; | ||
7928 | playback_data->chan_name = playback->ch_name; | ||
7929 | playback_data->addr = playback->dma_addr; | ||
7930 | playback_data->addr_width = playback->dma_size; | ||
7931 | } | ||
7932 | if (capture) { | ||
7933 | capture_data = &capture->dma_data; | ||
7934 | - capture_data->filter_data = (void *)capture->channel; | ||
7935 | + capture_data->filter_data = capture->slave; | ||
7936 | capture_data->chan_name = capture->ch_name; | ||
7937 | capture_data->addr = capture->dma_addr; | ||
7938 | capture_data->addr_width = capture->dma_size; | ||
7939 | diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c | ||
7940 | index 7dbf899b2af2..e163b0148c4b 100644 | ||
7941 | --- a/sound/soc/samsung/i2s.c | ||
7942 | +++ b/sound/soc/samsung/i2s.c | ||
7943 | @@ -1260,27 +1260,14 @@ static int samsung_i2s_probe(struct platform_device *pdev) | ||
7944 | pri_dai->lock = &pri_dai->spinlock; | ||
7945 | |||
7946 | if (!np) { | ||
7947 | - res = platform_get_resource(pdev, IORESOURCE_DMA, 0); | ||
7948 | - if (!res) { | ||
7949 | - dev_err(&pdev->dev, | ||
7950 | - "Unable to get I2S-TX dma resource\n"); | ||
7951 | - return -ENXIO; | ||
7952 | - } | ||
7953 | - pri_dai->dma_playback.channel = res->start; | ||
7954 | - | ||
7955 | - res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | ||
7956 | - if (!res) { | ||
7957 | - dev_err(&pdev->dev, | ||
7958 | - "Unable to get I2S-RX dma resource\n"); | ||
7959 | - return -ENXIO; | ||
7960 | - } | ||
7961 | - pri_dai->dma_capture.channel = res->start; | ||
7962 | - | ||
7963 | if (i2s_pdata == NULL) { | ||
7964 | dev_err(&pdev->dev, "Can't work without s3c_audio_pdata\n"); | ||
7965 | return -EINVAL; | ||
7966 | } | ||
7967 | |||
7968 | + pri_dai->dma_playback.slave = i2s_pdata->dma_playback; | ||
7969 | + pri_dai->dma_capture.slave = i2s_pdata->dma_capture; | ||
7970 | + | ||
7971 | if (&i2s_pdata->type) | ||
7972 | i2s_cfg = &i2s_pdata->type.i2s; | ||
7973 | |||
7974 | @@ -1341,11 +1328,8 @@ static int samsung_i2s_probe(struct platform_device *pdev) | ||
7975 | sec_dai->dma_playback.dma_addr = regs_base + I2STXDS; | ||
7976 | sec_dai->dma_playback.ch_name = "tx-sec"; | ||
7977 | |||
7978 | - if (!np) { | ||
7979 | - res = platform_get_resource(pdev, IORESOURCE_DMA, 2); | ||
7980 | - if (res) | ||
7981 | - sec_dai->dma_playback.channel = res->start; | ||
7982 | - } | ||
7983 | + if (!np) | ||
7984 | + sec_dai->dma_playback.slave = i2s_pdata->dma_play_sec; | ||
7985 | |||
7986 | sec_dai->dma_playback.dma_size = 4; | ||
7987 | sec_dai->addr = pri_dai->addr; | ||
7988 | diff --git a/sound/soc/samsung/pcm.c b/sound/soc/samsung/pcm.c | ||
7989 | index b320a9d3fbf8..c77f324e0bb8 100644 | ||
7990 | --- a/sound/soc/samsung/pcm.c | ||
7991 | +++ b/sound/soc/samsung/pcm.c | ||
7992 | @@ -486,7 +486,7 @@ static const struct snd_soc_component_driver s3c_pcm_component = { | ||
7993 | static int s3c_pcm_dev_probe(struct platform_device *pdev) | ||
7994 | { | ||
7995 | struct s3c_pcm_info *pcm; | ||
7996 | - struct resource *mem_res, *dmatx_res, *dmarx_res; | ||
7997 | + struct resource *mem_res; | ||
7998 | struct s3c_audio_pdata *pcm_pdata; | ||
7999 | int ret; | ||
8000 | |||
8001 | @@ -499,18 +499,6 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev) | ||
8002 | pcm_pdata = pdev->dev.platform_data; | ||
8003 | |||
8004 | /* Check for availability of necessary resource */ | ||
8005 | - dmatx_res = platform_get_resource(pdev, IORESOURCE_DMA, 0); | ||
8006 | - if (!dmatx_res) { | ||
8007 | - dev_err(&pdev->dev, "Unable to get PCM-TX dma resource\n"); | ||
8008 | - return -ENXIO; | ||
8009 | - } | ||
8010 | - | ||
8011 | - dmarx_res = platform_get_resource(pdev, IORESOURCE_DMA, 1); | ||
8012 | - if (!dmarx_res) { | ||
8013 | - dev_err(&pdev->dev, "Unable to get PCM-RX dma resource\n"); | ||
8014 | - return -ENXIO; | ||
8015 | - } | ||
8016 | - | ||
8017 | mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
8018 | if (!mem_res) { | ||
8019 | dev_err(&pdev->dev, "Unable to get register resource\n"); | ||
8020 | @@ -568,8 +556,10 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev) | ||
8021 | s3c_pcm_stereo_out[pdev->id].dma_addr = mem_res->start | ||
8022 | + S3C_PCM_TXFIFO; | ||
8023 | |||
8024 | - s3c_pcm_stereo_in[pdev->id].channel = dmarx_res->start; | ||
8025 | - s3c_pcm_stereo_out[pdev->id].channel = dmatx_res->start; | ||
8026 | + if (pcm_pdata) { | ||
8027 | + s3c_pcm_stereo_in[pdev->id].slave = pcm_pdata->dma_capture; | ||
8028 | + s3c_pcm_stereo_out[pdev->id].slave = pcm_pdata->dma_playback; | ||
8029 | + } | ||
8030 | |||
8031 | pcm->dma_capture = &s3c_pcm_stereo_in[pdev->id]; | ||
8032 | pcm->dma_playback = &s3c_pcm_stereo_out[pdev->id]; | ||
8033 | diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c | ||
8034 | index 2b766d212ce0..77d27c85a32a 100644 | ||
8035 | --- a/sound/soc/samsung/s3c2412-i2s.c | ||
8036 | +++ b/sound/soc/samsung/s3c2412-i2s.c | ||
8037 | @@ -34,13 +34,13 @@ | ||
8038 | #include "s3c2412-i2s.h" | ||
8039 | |||
8040 | static struct s3c_dma_params s3c2412_i2s_pcm_stereo_out = { | ||
8041 | - .channel = DMACH_I2S_OUT, | ||
8042 | + .slave = (void *)(uintptr_t)DMACH_I2S_OUT, | ||
8043 | .ch_name = "tx", | ||
8044 | .dma_size = 4, | ||
8045 | }; | ||
8046 | |||
8047 | static struct s3c_dma_params s3c2412_i2s_pcm_stereo_in = { | ||
8048 | - .channel = DMACH_I2S_IN, | ||
8049 | + .slave = (void *)(uintptr_t)DMACH_I2S_IN, | ||
8050 | .ch_name = "rx", | ||
8051 | .dma_size = 4, | ||
8052 | }; | ||
8053 | diff --git a/sound/soc/samsung/s3c24xx-i2s.c b/sound/soc/samsung/s3c24xx-i2s.c | ||
8054 | index 5bf723689692..9da3a77ea2c7 100644 | ||
8055 | --- a/sound/soc/samsung/s3c24xx-i2s.c | ||
8056 | +++ b/sound/soc/samsung/s3c24xx-i2s.c | ||
8057 | @@ -32,13 +32,13 @@ | ||
8058 | #include "s3c24xx-i2s.h" | ||
8059 | |||
8060 | static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_out = { | ||
8061 | - .channel = DMACH_I2S_OUT, | ||
8062 | + .slave = (void *)(uintptr_t)DMACH_I2S_OUT, | ||
8063 | .ch_name = "tx", | ||
8064 | .dma_size = 2, | ||
8065 | }; | ||
8066 | |||
8067 | static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_in = { | ||
8068 | - .channel = DMACH_I2S_IN, | ||
8069 | + .slave = (void *)(uintptr_t)DMACH_I2S_IN, | ||
8070 | .ch_name = "rx", | ||
8071 | .dma_size = 2, | ||
8072 | }; | ||
8073 | diff --git a/sound/soc/samsung/spdif.c b/sound/soc/samsung/spdif.c | ||
8074 | index 36dbc0e96004..9dd7ee6d03ff 100644 | ||
8075 | --- a/sound/soc/samsung/spdif.c | ||
8076 | +++ b/sound/soc/samsung/spdif.c | ||
8077 | @@ -359,7 +359,7 @@ static const struct snd_soc_component_driver samsung_spdif_component = { | ||
8078 | static int spdif_probe(struct platform_device *pdev) | ||
8079 | { | ||
8080 | struct s3c_audio_pdata *spdif_pdata; | ||
8081 | - struct resource *mem_res, *dma_res; | ||
8082 | + struct resource *mem_res; | ||
8083 | struct samsung_spdif_info *spdif; | ||
8084 | int ret; | ||
8085 | |||
8086 | @@ -367,12 +367,6 @@ static int spdif_probe(struct platform_device *pdev) | ||
8087 | |||
8088 | dev_dbg(&pdev->dev, "Entered %s\n", __func__); | ||
8089 | |||
8090 | - dma_res = platform_get_resource(pdev, IORESOURCE_DMA, 0); | ||
8091 | - if (!dma_res) { | ||
8092 | - dev_err(&pdev->dev, "Unable to get dma resource.\n"); | ||
8093 | - return -ENXIO; | ||
8094 | - } | ||
8095 | - | ||
8096 | mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
8097 | if (!mem_res) { | ||
8098 | dev_err(&pdev->dev, "Unable to get register resource.\n"); | ||
8099 | @@ -432,7 +426,7 @@ static int spdif_probe(struct platform_device *pdev) | ||
8100 | |||
8101 | spdif_stereo_out.dma_size = 2; | ||
8102 | spdif_stereo_out.dma_addr = mem_res->start + DATA_OUTBUF; | ||
8103 | - spdif_stereo_out.channel = dma_res->start; | ||
8104 | + spdif_stereo_out.slave = spdif_pdata ? spdif_pdata->dma_playback : NULL; | ||
8105 | |||
8106 | spdif->dma_playback = &spdif_stereo_out; | ||
8107 | |||
8108 | diff --git a/sound/usb/clock.c b/sound/usb/clock.c | ||
8109 | index 2ed260b10f6d..7ccbcaf6a147 100644 | ||
8110 | --- a/sound/usb/clock.c | ||
8111 | +++ b/sound/usb/clock.c | ||
8112 | @@ -285,6 +285,8 @@ static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface, | ||
8113 | unsigned char data[3]; | ||
8114 | int err, crate; | ||
8115 | |||
8116 | + if (get_iface_desc(alts)->bNumEndpoints < 1) | ||
8117 | + return -EINVAL; | ||
8118 | ep = get_endpoint(alts, 0)->bEndpointAddress; | ||
8119 | |||
8120 | /* if endpoint doesn't have sampling rate control, bail out */ | ||
8121 | diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c | ||
8122 | index 7b1cb365ffab..c07a7eda42a2 100644 | ||
8123 | --- a/sound/usb/endpoint.c | ||
8124 | +++ b/sound/usb/endpoint.c | ||
8125 | @@ -438,6 +438,9 @@ exit_clear: | ||
8126 | * | ||
8127 | * New endpoints will be added to chip->ep_list and must be freed by | ||
8128 | * calling snd_usb_endpoint_free(). | ||
8129 | + * | ||
8130 | + * For SND_USB_ENDPOINT_TYPE_SYNC, the caller needs to guarantee that | ||
8131 | + * bNumEndpoints > 1 beforehand. | ||
8132 | */ | ||
8133 | struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip, | ||
8134 | struct usb_host_interface *alts, | ||
8135 | diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c | ||
8136 | index 279025650568..f6c3bf79af9a 100644 | ||
8137 | --- a/sound/usb/mixer_quirks.c | ||
8138 | +++ b/sound/usb/mixer_quirks.c | ||
8139 | @@ -1519,7 +1519,11 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol, | ||
8140 | |||
8141 | /* use known values for that card: interface#1 altsetting#1 */ | ||
8142 | iface = usb_ifnum_to_if(chip->dev, 1); | ||
8143 | + if (!iface || iface->num_altsetting < 2) | ||
8144 | + return -EINVAL; | ||
8145 | alts = &iface->altsetting[1]; | ||
8146 | + if (get_iface_desc(alts)->bNumEndpoints < 1) | ||
8147 | + return -EINVAL; | ||
8148 | ep = get_endpoint(alts, 0)->bEndpointAddress; | ||
8149 | |||
8150 | err = snd_usb_ctl_msg(chip->dev, | ||
8151 | diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c | ||
8152 | index 9245f52d43bd..44d178ee9177 100644 | ||
8153 | --- a/sound/usb/pcm.c | ||
8154 | +++ b/sound/usb/pcm.c | ||
8155 | @@ -159,6 +159,8 @@ static int init_pitch_v1(struct snd_usb_audio *chip, int iface, | ||
8156 | unsigned char data[1]; | ||
8157 | int err; | ||
8158 | |||
8159 | + if (get_iface_desc(alts)->bNumEndpoints < 1) | ||
8160 | + return -EINVAL; | ||
8161 | ep = get_endpoint(alts, 0)->bEndpointAddress; | ||
8162 | |||
8163 | data[0] = 1; | ||
8164 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
8165 | index c458d60d5030..cd7eac28edee 100644 | ||
8166 | --- a/sound/usb/quirks.c | ||
8167 | +++ b/sound/usb/quirks.c | ||
8168 | @@ -150,6 +150,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, | ||
8169 | usb_audio_err(chip, "cannot memdup\n"); | ||
8170 | return -ENOMEM; | ||
8171 | } | ||
8172 | + INIT_LIST_HEAD(&fp->list); | ||
8173 | if (fp->nr_rates > MAX_NR_RATES) { | ||
8174 | kfree(fp); | ||
8175 | return -EINVAL; | ||
8176 | @@ -167,19 +168,20 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, | ||
8177 | stream = (fp->endpoint & USB_DIR_IN) | ||
8178 | ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; | ||
8179 | err = snd_usb_add_audio_stream(chip, stream, fp); | ||
8180 | - if (err < 0) { | ||
8181 | - kfree(fp); | ||
8182 | - kfree(rate_table); | ||
8183 | - return err; | ||
8184 | - } | ||
8185 | + if (err < 0) | ||
8186 | + goto error; | ||
8187 | if (fp->iface != get_iface_desc(&iface->altsetting[0])->bInterfaceNumber || | ||
8188 | fp->altset_idx >= iface->num_altsetting) { | ||
8189 | - kfree(fp); | ||
8190 | - kfree(rate_table); | ||
8191 | - return -EINVAL; | ||
8192 | + err = -EINVAL; | ||
8193 | + goto error; | ||
8194 | } | ||
8195 | alts = &iface->altsetting[fp->altset_idx]; | ||
8196 | altsd = get_iface_desc(alts); | ||
8197 | + if (altsd->bNumEndpoints < 1) { | ||
8198 | + err = -EINVAL; | ||
8199 | + goto error; | ||
8200 | + } | ||
8201 | + | ||
8202 | fp->protocol = altsd->bInterfaceProtocol; | ||
8203 | |||
8204 | if (fp->datainterval == 0) | ||
8205 | @@ -190,6 +192,12 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, | ||
8206 | snd_usb_init_pitch(chip, fp->iface, alts, fp); | ||
8207 | snd_usb_init_sample_rate(chip, fp->iface, alts, fp, fp->rate_max); | ||
8208 | return 0; | ||
8209 | + | ||
8210 | + error: | ||
8211 | + list_del(&fp->list); /* unlink for avoiding double-free */ | ||
8212 | + kfree(fp); | ||
8213 | + kfree(rate_table); | ||
8214 | + return err; | ||
8215 | } | ||
8216 | |||
8217 | static int create_auto_pcm_quirk(struct snd_usb_audio *chip, | ||
8218 | @@ -462,6 +470,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip, | ||
8219 | fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; | ||
8220 | fp->datainterval = 0; | ||
8221 | fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); | ||
8222 | + INIT_LIST_HEAD(&fp->list); | ||
8223 | |||
8224 | switch (fp->maxpacksize) { | ||
8225 | case 0x120: | ||
8226 | @@ -485,6 +494,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip, | ||
8227 | ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; | ||
8228 | err = snd_usb_add_audio_stream(chip, stream, fp); | ||
8229 | if (err < 0) { | ||
8230 | + list_del(&fp->list); /* unlink for avoiding double-free */ | ||
8231 | kfree(fp); | ||
8232 | return err; | ||
8233 | } | ||
8234 | @@ -1121,6 +1131,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) | ||
8235 | switch (chip->usb_id) { | ||
8236 | case USB_ID(0x045E, 0x075D): /* MS Lifecam Cinema */ | ||
8237 | case USB_ID(0x045E, 0x076D): /* MS Lifecam HD-5000 */ | ||
8238 | + case USB_ID(0x045E, 0x076E): /* MS Lifecam HD-5001 */ | ||
8239 | case USB_ID(0x045E, 0x076F): /* MS Lifecam HD-6000 */ | ||
8240 | case USB_ID(0x045E, 0x0772): /* MS Lifecam Studio */ | ||
8241 | case USB_ID(0x045E, 0x0779): /* MS Lifecam HD-3000 */ | ||
8242 | diff --git a/sound/usb/stream.c b/sound/usb/stream.c | ||
8243 | index 8ee14f2365e7..3b23102230c0 100644 | ||
8244 | --- a/sound/usb/stream.c | ||
8245 | +++ b/sound/usb/stream.c | ||
8246 | @@ -316,7 +316,9 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits, | ||
8247 | /* | ||
8248 | * add this endpoint to the chip instance. | ||
8249 | * if a stream with the same endpoint already exists, append to it. | ||
8250 | - * if not, create a new pcm stream. | ||
8251 | + * if not, create a new pcm stream. note, fp is added to the substream | ||
8252 | + * fmt_list and will be freed on the chip instance release. do not free | ||
8253 | + * fp or do remove it from the substream fmt_list to avoid double-free. | ||
8254 | */ | ||
8255 | int snd_usb_add_audio_stream(struct snd_usb_audio *chip, | ||
8256 | int stream, | ||
8257 | @@ -677,6 +679,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no) | ||
8258 | * (fp->maxpacksize & 0x7ff); | ||
8259 | fp->attributes = parse_uac_endpoint_attributes(chip, alts, protocol, iface_no); | ||
8260 | fp->clock = clock; | ||
8261 | + INIT_LIST_HEAD(&fp->list); | ||
8262 | |||
8263 | /* some quirks for attributes here */ | ||
8264 | |||
8265 | @@ -725,6 +728,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no) | ||
8266 | dev_dbg(&dev->dev, "%u:%d: add audio endpoint %#x\n", iface_no, altno, fp->endpoint); | ||
8267 | err = snd_usb_add_audio_stream(chip, stream, fp); | ||
8268 | if (err < 0) { | ||
8269 | + list_del(&fp->list); /* unlink for avoiding double-free */ | ||
8270 | kfree(fp->rate_table); | ||
8271 | kfree(fp->chmap); | ||
8272 | kfree(fp); | ||
8273 | diff --git a/tools/hv/Makefile b/tools/hv/Makefile | ||
8274 | index a8ab79556926..a8c4644022a6 100644 | ||
8275 | --- a/tools/hv/Makefile | ||
8276 | +++ b/tools/hv/Makefile | ||
8277 | @@ -5,6 +5,8 @@ PTHREAD_LIBS = -lpthread | ||
8278 | WARNINGS = -Wall -Wextra | ||
8279 | CFLAGS = $(WARNINGS) -g $(PTHREAD_LIBS) $(shell getconf LFS_CFLAGS) | ||
8280 | |||
8281 | +CFLAGS += -D__EXPORTED_HEADERS__ -I../../include/uapi -I../../include | ||
8282 | + | ||
8283 | all: hv_kvp_daemon hv_vss_daemon hv_fcopy_daemon | ||
8284 | %: %.c | ||
8285 | $(CC) $(CFLAGS) -o $@ $^ | ||
8286 | diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c | ||
8287 | index b48e87693aa5..a35db828bd0d 100644 | ||
8288 | --- a/tools/perf/util/parse-events.c | ||
8289 | +++ b/tools/perf/util/parse-events.c | ||
8290 | @@ -2101,11 +2101,11 @@ char *parse_events_formats_error_string(char *additional_terms) | ||
8291 | |||
8292 | /* valid terms */ | ||
8293 | if (additional_terms) { | ||
8294 | - if (!asprintf(&str, "valid terms: %s,%s", | ||
8295 | - additional_terms, static_terms)) | ||
8296 | + if (asprintf(&str, "valid terms: %s,%s", | ||
8297 | + additional_terms, static_terms) < 0) | ||
8298 | goto fail; | ||
8299 | } else { | ||
8300 | - if (!asprintf(&str, "valid terms: %s", static_terms)) | ||
8301 | + if (asprintf(&str, "valid terms: %s", static_terms) < 0) | ||
8302 | goto fail; | ||
8303 | } | ||
8304 | return str; | ||
8305 | diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c | ||
8306 | index e4b173dec4b9..6f2a0279476c 100644 | ||
8307 | --- a/tools/perf/util/pmu.c | ||
8308 | +++ b/tools/perf/util/pmu.c | ||
8309 | @@ -283,13 +283,12 @@ static int pmu_aliases_parse(char *dir, struct list_head *head) | ||
8310 | { | ||
8311 | struct dirent *evt_ent; | ||
8312 | DIR *event_dir; | ||
8313 | - int ret = 0; | ||
8314 | |||
8315 | event_dir = opendir(dir); | ||
8316 | if (!event_dir) | ||
8317 | return -EINVAL; | ||
8318 | |||
8319 | - while (!ret && (evt_ent = readdir(event_dir))) { | ||
8320 | + while ((evt_ent = readdir(event_dir))) { | ||
8321 | char path[PATH_MAX]; | ||
8322 | char *name = evt_ent->d_name; | ||
8323 | FILE *file; | ||
8324 | @@ -305,17 +304,19 @@ static int pmu_aliases_parse(char *dir, struct list_head *head) | ||
8325 | |||
8326 | snprintf(path, PATH_MAX, "%s/%s", dir, name); | ||
8327 | |||
8328 | - ret = -EINVAL; | ||
8329 | file = fopen(path, "r"); | ||
8330 | - if (!file) | ||
8331 | - break; | ||
8332 | + if (!file) { | ||
8333 | + pr_debug("Cannot open %s\n", path); | ||
8334 | + continue; | ||
8335 | + } | ||
8336 | |||
8337 | - ret = perf_pmu__new_alias(head, dir, name, file); | ||
8338 | + if (perf_pmu__new_alias(head, dir, name, file) < 0) | ||
8339 | + pr_debug("Cannot set up %s\n", name); | ||
8340 | fclose(file); | ||
8341 | } | ||
8342 | |||
8343 | closedir(event_dir); | ||
8344 | - return ret; | ||
8345 | + return 0; | ||
8346 | } | ||
8347 | |||
8348 | /* | ||
8349 | diff --git a/tools/perf/util/setup.py b/tools/perf/util/setup.py | ||
8350 | index 1833103768cb..c8680984d2d6 100644 | ||
8351 | --- a/tools/perf/util/setup.py | ||
8352 | +++ b/tools/perf/util/setup.py | ||
8353 | @@ -22,6 +22,7 @@ cflags = getenv('CFLAGS', '').split() | ||
8354 | # switch off several checks (need to be at the end of cflags list) | ||
8355 | cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter' ] | ||
8356 | |||
8357 | +src_perf = getenv('srctree') + '/tools/perf' | ||
8358 | build_lib = getenv('PYTHON_EXTBUILD_LIB') | ||
8359 | build_tmp = getenv('PYTHON_EXTBUILD_TMP') | ||
8360 | libtraceevent = getenv('LIBTRACEEVENT') | ||
8361 | @@ -30,6 +31,9 @@ libapikfs = getenv('LIBAPI') | ||
8362 | ext_sources = [f.strip() for f in file('util/python-ext-sources') | ||
8363 | if len(f.strip()) > 0 and f[0] != '#'] | ||
8364 | |||
8365 | +# use full paths with source files | ||
8366 | +ext_sources = map(lambda x: '%s/%s' % (src_perf, x) , ext_sources) | ||
8367 | + | ||
8368 | perf = Extension('perf', | ||
8369 | sources = ext_sources, | ||
8370 | include_dirs = ['util/include'], | ||
8371 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c | ||
8372 | index 7338e30421d8..fefbf2d148ef 100644 | ||
8373 | --- a/virt/kvm/kvm_main.c | ||
8374 | +++ b/virt/kvm/kvm_main.c | ||
8375 | @@ -547,6 +547,16 @@ static struct kvm *kvm_create_vm(unsigned long type) | ||
8376 | if (!kvm) | ||
8377 | return ERR_PTR(-ENOMEM); | ||
8378 | |||
8379 | + spin_lock_init(&kvm->mmu_lock); | ||
8380 | + atomic_inc(¤t->mm->mm_count); | ||
8381 | + kvm->mm = current->mm; | ||
8382 | + kvm_eventfd_init(kvm); | ||
8383 | + mutex_init(&kvm->lock); | ||
8384 | + mutex_init(&kvm->irq_lock); | ||
8385 | + mutex_init(&kvm->slots_lock); | ||
8386 | + atomic_set(&kvm->users_count, 1); | ||
8387 | + INIT_LIST_HEAD(&kvm->devices); | ||
8388 | + | ||
8389 | r = kvm_arch_init_vm(kvm, type); | ||
8390 | if (r) | ||
8391 | goto out_err_no_disable; | ||
8392 | @@ -579,16 +589,6 @@ static struct kvm *kvm_create_vm(unsigned long type) | ||
8393 | goto out_err; | ||
8394 | } | ||
8395 | |||
8396 | - spin_lock_init(&kvm->mmu_lock); | ||
8397 | - kvm->mm = current->mm; | ||
8398 | - atomic_inc(&kvm->mm->mm_count); | ||
8399 | - kvm_eventfd_init(kvm); | ||
8400 | - mutex_init(&kvm->lock); | ||
8401 | - mutex_init(&kvm->irq_lock); | ||
8402 | - mutex_init(&kvm->slots_lock); | ||
8403 | - atomic_set(&kvm->users_count, 1); | ||
8404 | - INIT_LIST_HEAD(&kvm->devices); | ||
8405 | - | ||
8406 | r = kvm_init_mmu_notifier(kvm); | ||
8407 | if (r) | ||
8408 | goto out_err; | ||
8409 | @@ -613,6 +613,7 @@ out_err_no_disable: | ||
8410 | for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) | ||
8411 | kvm_free_memslots(kvm, kvm->memslots[i]); | ||
8412 | kvm_arch_free_vm(kvm); | ||
8413 | + mmdrop(current->mm); | ||
8414 | return ERR_PTR(r); | ||
8415 | } | ||
8416 |