Annotation of /trunk/kernel-magellan/patches-4.20/0110-4.20.11-all-fixes.patch
Parent Directory | Revision Log
Revision 3287 -
(hide annotations)
(download)
Mon Mar 4 10:38:36 2019 UTC (5 years, 6 months ago) by niro
File size: 119145 byte(s)
Mon Mar 4 10:38:36 2019 UTC (5 years, 6 months ago) by niro
File size: 119145 byte(s)
linux-4.20.11
1 | niro | 3287 | diff --git a/Documentation/devicetree/bindings/eeprom/at24.txt b/Documentation/devicetree/bindings/eeprom/at24.txt |
2 | index aededdbc262b..f9a7c984274c 100644 | ||
3 | --- a/Documentation/devicetree/bindings/eeprom/at24.txt | ||
4 | +++ b/Documentation/devicetree/bindings/eeprom/at24.txt | ||
5 | @@ -27,6 +27,7 @@ Required properties: | ||
6 | "atmel,24c256", | ||
7 | "atmel,24c512", | ||
8 | "atmel,24c1024", | ||
9 | + "atmel,24c2048", | ||
10 | |||
11 | If <manufacturer> is not "atmel", then a fallback must be used | ||
12 | with the same <model> and "atmel" as manufacturer. | ||
13 | diff --git a/Makefile b/Makefile | ||
14 | index 6f7a8172de44..193cfe3a3d70 100644 | ||
15 | --- a/Makefile | ||
16 | +++ b/Makefile | ||
17 | @@ -1,7 +1,7 @@ | ||
18 | # SPDX-License-Identifier: GPL-2.0 | ||
19 | VERSION = 4 | ||
20 | PATCHLEVEL = 20 | ||
21 | -SUBLEVEL = 10 | ||
22 | +SUBLEVEL = 11 | ||
23 | EXTRAVERSION = | ||
24 | NAME = Shy Crocodile | ||
25 | |||
26 | diff --git a/arch/alpha/include/asm/irq.h b/arch/alpha/include/asm/irq.h | ||
27 | index 4d17cacd1462..432402c8e47f 100644 | ||
28 | --- a/arch/alpha/include/asm/irq.h | ||
29 | +++ b/arch/alpha/include/asm/irq.h | ||
30 | @@ -56,15 +56,15 @@ | ||
31 | |||
32 | #elif defined(CONFIG_ALPHA_DP264) || \ | ||
33 | defined(CONFIG_ALPHA_LYNX) || \ | ||
34 | - defined(CONFIG_ALPHA_SHARK) || \ | ||
35 | - defined(CONFIG_ALPHA_EIGER) | ||
36 | + defined(CONFIG_ALPHA_SHARK) | ||
37 | # define NR_IRQS 64 | ||
38 | |||
39 | #elif defined(CONFIG_ALPHA_TITAN) | ||
40 | #define NR_IRQS 80 | ||
41 | |||
42 | #elif defined(CONFIG_ALPHA_RAWHIDE) || \ | ||
43 | - defined(CONFIG_ALPHA_TAKARA) | ||
44 | + defined(CONFIG_ALPHA_TAKARA) || \ | ||
45 | + defined(CONFIG_ALPHA_EIGER) | ||
46 | # define NR_IRQS 128 | ||
47 | |||
48 | #elif defined(CONFIG_ALPHA_WILDFIRE) | ||
49 | diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c | ||
50 | index d73dc473fbb9..188fc9256baf 100644 | ||
51 | --- a/arch/alpha/mm/fault.c | ||
52 | +++ b/arch/alpha/mm/fault.c | ||
53 | @@ -78,7 +78,7 @@ __load_new_mm_context(struct mm_struct *next_mm) | ||
54 | /* Macro for exception fixup code to access integer registers. */ | ||
55 | #define dpf_reg(r) \ | ||
56 | (((unsigned long *)regs)[(r) <= 8 ? (r) : (r) <= 15 ? (r)-16 : \ | ||
57 | - (r) <= 18 ? (r)+8 : (r)-10]) | ||
58 | + (r) <= 18 ? (r)+10 : (r)-10]) | ||
59 | |||
60 | asmlinkage void | ||
61 | do_page_fault(unsigned long address, unsigned long mmcsr, | ||
62 | diff --git a/arch/arm/boot/dts/da850-evm.dts b/arch/arm/boot/dts/da850-evm.dts | ||
63 | index a3c9b346721d..f04bc3e15332 100644 | ||
64 | --- a/arch/arm/boot/dts/da850-evm.dts | ||
65 | +++ b/arch/arm/boot/dts/da850-evm.dts | ||
66 | @@ -94,6 +94,28 @@ | ||
67 | regulator-boot-on; | ||
68 | }; | ||
69 | |||
70 | + baseboard_3v3: fixedregulator-3v3 { | ||
71 | + /* TPS73701DCQ */ | ||
72 | + compatible = "regulator-fixed"; | ||
73 | + regulator-name = "baseboard_3v3"; | ||
74 | + regulator-min-microvolt = <3300000>; | ||
75 | + regulator-max-microvolt = <3300000>; | ||
76 | + vin-supply = <&vbat>; | ||
77 | + regulator-always-on; | ||
78 | + regulator-boot-on; | ||
79 | + }; | ||
80 | + | ||
81 | + baseboard_1v8: fixedregulator-1v8 { | ||
82 | + /* TPS73701DCQ */ | ||
83 | + compatible = "regulator-fixed"; | ||
84 | + regulator-name = "baseboard_1v8"; | ||
85 | + regulator-min-microvolt = <1800000>; | ||
86 | + regulator-max-microvolt = <1800000>; | ||
87 | + vin-supply = <&vbat>; | ||
88 | + regulator-always-on; | ||
89 | + regulator-boot-on; | ||
90 | + }; | ||
91 | + | ||
92 | backlight_lcd: backlight-regulator { | ||
93 | compatible = "regulator-fixed"; | ||
94 | regulator-name = "lcd_backlight_pwr"; | ||
95 | @@ -105,7 +127,7 @@ | ||
96 | |||
97 | sound { | ||
98 | compatible = "simple-audio-card"; | ||
99 | - simple-audio-card,name = "DA850/OMAP-L138 EVM"; | ||
100 | + simple-audio-card,name = "DA850-OMAPL138 EVM"; | ||
101 | simple-audio-card,widgets = | ||
102 | "Line", "Line In", | ||
103 | "Line", "Line Out"; | ||
104 | @@ -210,10 +232,9 @@ | ||
105 | |||
106 | /* Regulators */ | ||
107 | IOVDD-supply = <&vdcdc2_reg>; | ||
108 | - /* Derived from VBAT: Baseboard 3.3V / 1.8V */ | ||
109 | - AVDD-supply = <&vbat>; | ||
110 | - DRVDD-supply = <&vbat>; | ||
111 | - DVDD-supply = <&vbat>; | ||
112 | + AVDD-supply = <&baseboard_3v3>; | ||
113 | + DRVDD-supply = <&baseboard_3v3>; | ||
114 | + DVDD-supply = <&baseboard_1v8>; | ||
115 | }; | ||
116 | tca6416: gpio@20 { | ||
117 | compatible = "ti,tca6416"; | ||
118 | diff --git a/arch/arm/boot/dts/da850-lcdk.dts b/arch/arm/boot/dts/da850-lcdk.dts | ||
119 | index 0177e3ed20fe..3a2fa6e035a3 100644 | ||
120 | --- a/arch/arm/boot/dts/da850-lcdk.dts | ||
121 | +++ b/arch/arm/boot/dts/da850-lcdk.dts | ||
122 | @@ -39,9 +39,39 @@ | ||
123 | }; | ||
124 | }; | ||
125 | |||
126 | + vcc_5vd: fixedregulator-vcc_5vd { | ||
127 | + compatible = "regulator-fixed"; | ||
128 | + regulator-name = "vcc_5vd"; | ||
129 | + regulator-min-microvolt = <5000000>; | ||
130 | + regulator-max-microvolt = <5000000>; | ||
131 | + regulator-boot-on; | ||
132 | + }; | ||
133 | + | ||
134 | + vcc_3v3d: fixedregulator-vcc_3v3d { | ||
135 | + /* TPS650250 - VDCDC1 */ | ||
136 | + compatible = "regulator-fixed"; | ||
137 | + regulator-name = "vcc_3v3d"; | ||
138 | + regulator-min-microvolt = <3300000>; | ||
139 | + regulator-max-microvolt = <3300000>; | ||
140 | + vin-supply = <&vcc_5vd>; | ||
141 | + regulator-always-on; | ||
142 | + regulator-boot-on; | ||
143 | + }; | ||
144 | + | ||
145 | + vcc_1v8d: fixedregulator-vcc_1v8d { | ||
146 | + /* TPS650250 - VDCDC2 */ | ||
147 | + compatible = "regulator-fixed"; | ||
148 | + regulator-name = "vcc_1v8d"; | ||
149 | + regulator-min-microvolt = <1800000>; | ||
150 | + regulator-max-microvolt = <1800000>; | ||
151 | + vin-supply = <&vcc_5vd>; | ||
152 | + regulator-always-on; | ||
153 | + regulator-boot-on; | ||
154 | + }; | ||
155 | + | ||
156 | sound { | ||
157 | compatible = "simple-audio-card"; | ||
158 | - simple-audio-card,name = "DA850/OMAP-L138 LCDK"; | ||
159 | + simple-audio-card,name = "DA850-OMAPL138 LCDK"; | ||
160 | simple-audio-card,widgets = | ||
161 | "Line", "Line In", | ||
162 | "Line", "Line Out"; | ||
163 | @@ -221,6 +251,12 @@ | ||
164 | compatible = "ti,tlv320aic3106"; | ||
165 | reg = <0x18>; | ||
166 | status = "okay"; | ||
167 | + | ||
168 | + /* Regulators */ | ||
169 | + IOVDD-supply = <&vcc_3v3d>; | ||
170 | + AVDD-supply = <&vcc_3v3d>; | ||
171 | + DRVDD-supply = <&vcc_3v3d>; | ||
172 | + DVDD-supply = <&vcc_1v8d>; | ||
173 | }; | ||
174 | }; | ||
175 | |||
176 | diff --git a/arch/arm/boot/dts/kirkwood-dnskw.dtsi b/arch/arm/boot/dts/kirkwood-dnskw.dtsi | ||
177 | index cbaf06f2f78e..eb917462b219 100644 | ||
178 | --- a/arch/arm/boot/dts/kirkwood-dnskw.dtsi | ||
179 | +++ b/arch/arm/boot/dts/kirkwood-dnskw.dtsi | ||
180 | @@ -36,8 +36,8 @@ | ||
181 | compatible = "gpio-fan"; | ||
182 | pinctrl-0 = <&pmx_fan_high_speed &pmx_fan_low_speed>; | ||
183 | pinctrl-names = "default"; | ||
184 | - gpios = <&gpio1 14 GPIO_ACTIVE_LOW | ||
185 | - &gpio1 13 GPIO_ACTIVE_LOW>; | ||
186 | + gpios = <&gpio1 14 GPIO_ACTIVE_HIGH | ||
187 | + &gpio1 13 GPIO_ACTIVE_HIGH>; | ||
188 | gpio-fan,speed-map = <0 0 | ||
189 | 3000 1 | ||
190 | 6000 2>; | ||
191 | diff --git a/arch/arm/boot/dts/omap5-board-common.dtsi b/arch/arm/boot/dts/omap5-board-common.dtsi | ||
192 | index bf7ca00f4c21..c2dc4199b4ec 100644 | ||
193 | --- a/arch/arm/boot/dts/omap5-board-common.dtsi | ||
194 | +++ b/arch/arm/boot/dts/omap5-board-common.dtsi | ||
195 | @@ -317,7 +317,8 @@ | ||
196 | |||
197 | palmas_sys_nirq_pins: pinmux_palmas_sys_nirq_pins { | ||
198 | pinctrl-single,pins = < | ||
199 | - OMAP5_IOPAD(0x068, PIN_INPUT_PULLUP | MUX_MODE0) /* sys_nirq1 */ | ||
200 | + /* sys_nirq1 is pulled down as the SoC is inverting it for GIC */ | ||
201 | + OMAP5_IOPAD(0x068, PIN_INPUT_PULLUP | MUX_MODE0) | ||
202 | >; | ||
203 | }; | ||
204 | |||
205 | @@ -385,7 +386,8 @@ | ||
206 | |||
207 | palmas: palmas@48 { | ||
208 | compatible = "ti,palmas"; | ||
209 | - interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* IRQ_SYS_1N */ | ||
210 | + /* sys_nirq/ext_sys_irq pins get inverted at mpuss wakeupgen */ | ||
211 | + interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_LOW>; | ||
212 | reg = <0x48>; | ||
213 | interrupt-controller; | ||
214 | #interrupt-cells = <2>; | ||
215 | @@ -651,7 +653,8 @@ | ||
216 | pinctrl-names = "default"; | ||
217 | pinctrl-0 = <&twl6040_pins>; | ||
218 | |||
219 | - interrupts = <GIC_SPI 119 IRQ_TYPE_NONE>; /* IRQ_SYS_2N cascaded to gic */ | ||
220 | + /* sys_nirq/ext_sys_irq pins get inverted at mpuss wakeupgen */ | ||
221 | + interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_LOW>; | ||
222 | |||
223 | /* audpwron gpio defined in the board specific dts */ | ||
224 | |||
225 | diff --git a/arch/arm/boot/dts/omap5-cm-t54.dts b/arch/arm/boot/dts/omap5-cm-t54.dts | ||
226 | index 5e21fb430a65..e78d3718f145 100644 | ||
227 | --- a/arch/arm/boot/dts/omap5-cm-t54.dts | ||
228 | +++ b/arch/arm/boot/dts/omap5-cm-t54.dts | ||
229 | @@ -181,6 +181,13 @@ | ||
230 | OMAP5_IOPAD(0x0042, PIN_INPUT_PULLDOWN | MUX_MODE6) /* llib_wakereqin.gpio1_wk15 */ | ||
231 | >; | ||
232 | }; | ||
233 | + | ||
234 | + palmas_sys_nirq_pins: pinmux_palmas_sys_nirq_pins { | ||
235 | + pinctrl-single,pins = < | ||
236 | + /* sys_nirq1 is pulled down as the SoC is inverting it for GIC */ | ||
237 | + OMAP5_IOPAD(0x068, PIN_INPUT_PULLUP | MUX_MODE0) | ||
238 | + >; | ||
239 | + }; | ||
240 | }; | ||
241 | |||
242 | &omap5_pmx_core { | ||
243 | @@ -414,8 +421,11 @@ | ||
244 | |||
245 | palmas: palmas@48 { | ||
246 | compatible = "ti,palmas"; | ||
247 | - interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* IRQ_SYS_1N */ | ||
248 | reg = <0x48>; | ||
249 | + pinctrl-0 = <&palmas_sys_nirq_pins>; | ||
250 | + pinctrl-names = "default"; | ||
251 | + /* sys_nirq/ext_sys_irq pins get inverted at mpuss wakeupgen */ | ||
252 | + interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_LOW>; | ||
253 | interrupt-controller; | ||
254 | #interrupt-cells = <2>; | ||
255 | ti,system-power-controller; | ||
256 | diff --git a/arch/arm/mach-integrator/impd1.c b/arch/arm/mach-integrator/impd1.c | ||
257 | index a109f6482413..0f916c245a2e 100644 | ||
258 | --- a/arch/arm/mach-integrator/impd1.c | ||
259 | +++ b/arch/arm/mach-integrator/impd1.c | ||
260 | @@ -393,7 +393,11 @@ static int __ref impd1_probe(struct lm_device *dev) | ||
261 | sizeof(*lookup) + 3 * sizeof(struct gpiod_lookup), | ||
262 | GFP_KERNEL); | ||
263 | chipname = devm_kstrdup(&dev->dev, devname, GFP_KERNEL); | ||
264 | - mmciname = kasprintf(GFP_KERNEL, "lm%x:00700", dev->id); | ||
265 | + mmciname = devm_kasprintf(&dev->dev, GFP_KERNEL, | ||
266 | + "lm%x:00700", dev->id); | ||
267 | + if (!lookup || !chipname || !mmciname) | ||
268 | + return -ENOMEM; | ||
269 | + | ||
270 | lookup->dev_id = mmciname; | ||
271 | /* | ||
272 | * Offsets on GPIO block 1: | ||
273 | diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c | ||
274 | index fc5fb776a710..17558be4bf0a 100644 | ||
275 | --- a/arch/arm/mach-omap2/omap-wakeupgen.c | ||
276 | +++ b/arch/arm/mach-omap2/omap-wakeupgen.c | ||
277 | @@ -50,6 +50,9 @@ | ||
278 | #define OMAP4_NR_BANKS 4 | ||
279 | #define OMAP4_NR_IRQS 128 | ||
280 | |||
281 | +#define SYS_NIRQ1_EXT_SYS_IRQ_1 7 | ||
282 | +#define SYS_NIRQ2_EXT_SYS_IRQ_2 119 | ||
283 | + | ||
284 | static void __iomem *wakeupgen_base; | ||
285 | static void __iomem *sar_base; | ||
286 | static DEFINE_RAW_SPINLOCK(wakeupgen_lock); | ||
287 | @@ -153,6 +156,37 @@ static void wakeupgen_unmask(struct irq_data *d) | ||
288 | irq_chip_unmask_parent(d); | ||
289 | } | ||
290 | |||
291 | +/* | ||
292 | + * The sys_nirq pins bypass peripheral modules and are wired directly | ||
293 | + * to MPUSS wakeupgen. They get automatically inverted for GIC. | ||
294 | + */ | ||
295 | +static int wakeupgen_irq_set_type(struct irq_data *d, unsigned int type) | ||
296 | +{ | ||
297 | + bool inverted = false; | ||
298 | + | ||
299 | + switch (type) { | ||
300 | + case IRQ_TYPE_LEVEL_LOW: | ||
301 | + type &= ~IRQ_TYPE_LEVEL_MASK; | ||
302 | + type |= IRQ_TYPE_LEVEL_HIGH; | ||
303 | + inverted = true; | ||
304 | + break; | ||
305 | + case IRQ_TYPE_EDGE_FALLING: | ||
306 | + type &= ~IRQ_TYPE_EDGE_BOTH; | ||
307 | + type |= IRQ_TYPE_EDGE_RISING; | ||
308 | + inverted = true; | ||
309 | + break; | ||
310 | + default: | ||
311 | + break; | ||
312 | + } | ||
313 | + | ||
314 | + if (inverted && d->hwirq != SYS_NIRQ1_EXT_SYS_IRQ_1 && | ||
315 | + d->hwirq != SYS_NIRQ2_EXT_SYS_IRQ_2) | ||
316 | + pr_warn("wakeupgen: irq%li polarity inverted in dts\n", | ||
317 | + d->hwirq); | ||
318 | + | ||
319 | + return irq_chip_set_type_parent(d, type); | ||
320 | +} | ||
321 | + | ||
322 | #ifdef CONFIG_HOTPLUG_CPU | ||
323 | static DEFINE_PER_CPU(u32 [MAX_NR_REG_BANKS], irqmasks); | ||
324 | |||
325 | @@ -446,7 +480,7 @@ static struct irq_chip wakeupgen_chip = { | ||
326 | .irq_mask = wakeupgen_mask, | ||
327 | .irq_unmask = wakeupgen_unmask, | ||
328 | .irq_retrigger = irq_chip_retrigger_hierarchy, | ||
329 | - .irq_set_type = irq_chip_set_type_parent, | ||
330 | + .irq_set_type = wakeupgen_irq_set_type, | ||
331 | .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND, | ||
332 | #ifdef CONFIG_SMP | ||
333 | .irq_set_affinity = irq_chip_set_affinity_parent, | ||
334 | diff --git a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts | ||
335 | index dc20145dd393..c6509a02480d 100644 | ||
336 | --- a/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts | ||
337 | +++ b/arch/arm64/boot/dts/rockchip/rk3328-rock64.dts | ||
338 | @@ -40,6 +40,7 @@ | ||
339 | pinctrl-0 = <&usb30_host_drv>; | ||
340 | regulator-name = "vcc_host_5v"; | ||
341 | regulator-always-on; | ||
342 | + regulator-boot-on; | ||
343 | vin-supply = <&vcc_sys>; | ||
344 | }; | ||
345 | |||
346 | @@ -51,6 +52,7 @@ | ||
347 | pinctrl-0 = <&usb20_host_drv>; | ||
348 | regulator-name = "vcc_host1_5v"; | ||
349 | regulator-always-on; | ||
350 | + regulator-boot-on; | ||
351 | vin-supply = <&vcc_sys>; | ||
352 | }; | ||
353 | |||
354 | diff --git a/arch/csky/include/asm/io.h b/arch/csky/include/asm/io.h | ||
355 | index ecae6b358f95..c1dfa9c10e36 100644 | ||
356 | --- a/arch/csky/include/asm/io.h | ||
357 | +++ b/arch/csky/include/asm/io.h | ||
358 | @@ -15,6 +15,31 @@ extern void iounmap(void *addr); | ||
359 | extern int remap_area_pages(unsigned long address, phys_addr_t phys_addr, | ||
360 | size_t size, unsigned long flags); | ||
361 | |||
362 | +/* | ||
363 | + * I/O memory access primitives. Reads are ordered relative to any | ||
364 | + * following Normal memory access. Writes are ordered relative to any prior | ||
365 | + * Normal memory access. | ||
366 | + * | ||
367 | + * For CACHEV1 (807, 810), store instruction could fast retire, so we need | ||
368 | + * another mb() to prevent st fast retire. | ||
369 | + * | ||
370 | + * For CACHEV2 (860), store instruction with PAGE_ATTR_NO_BUFFERABLE won't | ||
371 | + * fast retire. | ||
372 | + */ | ||
373 | +#define readb(c) ({ u8 __v = readb_relaxed(c); rmb(); __v; }) | ||
374 | +#define readw(c) ({ u16 __v = readw_relaxed(c); rmb(); __v; }) | ||
375 | +#define readl(c) ({ u32 __v = readl_relaxed(c); rmb(); __v; }) | ||
376 | + | ||
377 | +#ifdef CONFIG_CPU_HAS_CACHEV2 | ||
378 | +#define writeb(v,c) ({ wmb(); writeb_relaxed((v),(c)); }) | ||
379 | +#define writew(v,c) ({ wmb(); writew_relaxed((v),(c)); }) | ||
380 | +#define writel(v,c) ({ wmb(); writel_relaxed((v),(c)); }) | ||
381 | +#else | ||
382 | +#define writeb(v,c) ({ wmb(); writeb_relaxed((v),(c)); mb(); }) | ||
383 | +#define writew(v,c) ({ wmb(); writew_relaxed((v),(c)); mb(); }) | ||
384 | +#define writel(v,c) ({ wmb(); writel_relaxed((v),(c)); mb(); }) | ||
385 | +#endif | ||
386 | + | ||
387 | #define ioremap_nocache(phy, sz) ioremap(phy, sz) | ||
388 | #define ioremap_wc ioremap_nocache | ||
389 | #define ioremap_wt ioremap_nocache | ||
390 | diff --git a/arch/csky/kernel/module.c b/arch/csky/kernel/module.c | ||
391 | index 65abab0c7a47..b5ad7d9de18c 100644 | ||
392 | --- a/arch/csky/kernel/module.c | ||
393 | +++ b/arch/csky/kernel/module.c | ||
394 | @@ -12,7 +12,7 @@ | ||
395 | #include <linux/spinlock.h> | ||
396 | #include <asm/pgtable.h> | ||
397 | |||
398 | -#if defined(__CSKYABIV2__) | ||
399 | +#ifdef CONFIG_CPU_CK810 | ||
400 | #define IS_BSR32(hi16, lo16) (((hi16) & 0xFC00) == 0xE000) | ||
401 | #define IS_JSRI32(hi16, lo16) ((hi16) == 0xEAE0) | ||
402 | |||
403 | @@ -25,6 +25,26 @@ | ||
404 | *(uint16_t *)(addr) = 0xE8Fa; \ | ||
405 | *((uint16_t *)(addr) + 1) = 0x0000; \ | ||
406 | } while (0) | ||
407 | + | ||
408 | +static void jsri_2_lrw_jsr(uint32_t *location) | ||
409 | +{ | ||
410 | + uint16_t *location_tmp = (uint16_t *)location; | ||
411 | + | ||
412 | + if (IS_BSR32(*location_tmp, *(location_tmp + 1))) | ||
413 | + return; | ||
414 | + | ||
415 | + if (IS_JSRI32(*location_tmp, *(location_tmp + 1))) { | ||
416 | + /* jsri 0x... --> lrw r26, 0x... */ | ||
417 | + CHANGE_JSRI_TO_LRW(location); | ||
418 | + /* lsli r0, r0 --> jsr r26 */ | ||
419 | + SET_JSR32_R26(location + 1); | ||
420 | + } | ||
421 | +} | ||
422 | +#else | ||
423 | +static void inline jsri_2_lrw_jsr(uint32_t *location) | ||
424 | +{ | ||
425 | + return; | ||
426 | +} | ||
427 | #endif | ||
428 | |||
429 | int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | ||
430 | @@ -35,9 +55,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | ||
431 | Elf32_Sym *sym; | ||
432 | uint32_t *location; | ||
433 | short *temp; | ||
434 | -#if defined(__CSKYABIV2__) | ||
435 | - uint16_t *location_tmp; | ||
436 | -#endif | ||
437 | |||
438 | for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { | ||
439 | /* This is where to make the change */ | ||
440 | @@ -59,18 +76,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | ||
441 | case R_CSKY_PCRELJSR_IMM11BY2: | ||
442 | break; | ||
443 | case R_CSKY_PCRELJSR_IMM26BY2: | ||
444 | -#if defined(__CSKYABIV2__) | ||
445 | - location_tmp = (uint16_t *)location; | ||
446 | - if (IS_BSR32(*location_tmp, *(location_tmp + 1))) | ||
447 | - break; | ||
448 | - | ||
449 | - if (IS_JSRI32(*location_tmp, *(location_tmp + 1))) { | ||
450 | - /* jsri 0x... --> lrw r26, 0x... */ | ||
451 | - CHANGE_JSRI_TO_LRW(location); | ||
452 | - /* lsli r0, r0 --> jsr r26 */ | ||
453 | - SET_JSR32_R26(location + 1); | ||
454 | - } | ||
455 | -#endif | ||
456 | + jsri_2_lrw_jsr(location); | ||
457 | break; | ||
458 | case R_CSKY_ADDR_HI16: | ||
459 | temp = ((short *)location) + 1; | ||
460 | diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h | ||
461 | index db706ffc4ca9..5ff63d53b31c 100644 | ||
462 | --- a/arch/powerpc/include/asm/book3s/64/pgtable.h | ||
463 | +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h | ||
464 | @@ -904,7 +904,7 @@ static inline int pud_none(pud_t pud) | ||
465 | |||
466 | static inline int pud_present(pud_t pud) | ||
467 | { | ||
468 | - return (pud_raw(pud) & cpu_to_be64(_PAGE_PRESENT)); | ||
469 | + return !!(pud_raw(pud) & cpu_to_be64(_PAGE_PRESENT)); | ||
470 | } | ||
471 | |||
472 | extern struct page *pud_page(pud_t pud); | ||
473 | @@ -951,7 +951,7 @@ static inline int pgd_none(pgd_t pgd) | ||
474 | |||
475 | static inline int pgd_present(pgd_t pgd) | ||
476 | { | ||
477 | - return (pgd_raw(pgd) & cpu_to_be64(_PAGE_PRESENT)); | ||
478 | + return !!(pgd_raw(pgd) & cpu_to_be64(_PAGE_PRESENT)); | ||
479 | } | ||
480 | |||
481 | static inline pte_t pgd_pte(pgd_t pgd) | ||
482 | diff --git a/arch/riscv/include/asm/pgtable-bits.h b/arch/riscv/include/asm/pgtable-bits.h | ||
483 | index 2fa2942be221..470755cb7558 100644 | ||
484 | --- a/arch/riscv/include/asm/pgtable-bits.h | ||
485 | +++ b/arch/riscv/include/asm/pgtable-bits.h | ||
486 | @@ -35,6 +35,12 @@ | ||
487 | #define _PAGE_SPECIAL _PAGE_SOFT | ||
488 | #define _PAGE_TABLE _PAGE_PRESENT | ||
489 | |||
490 | +/* | ||
491 | + * _PAGE_PROT_NONE is set on not-present pages (and ignored by the hardware) to | ||
492 | + * distinguish them from swapped out pages | ||
493 | + */ | ||
494 | +#define _PAGE_PROT_NONE _PAGE_READ | ||
495 | + | ||
496 | #define _PAGE_PFN_SHIFT 10 | ||
497 | |||
498 | /* Set of bits to preserve across pte_modify() */ | ||
499 | diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h | ||
500 | index 16301966d65b..a8179a8c1491 100644 | ||
501 | --- a/arch/riscv/include/asm/pgtable.h | ||
502 | +++ b/arch/riscv/include/asm/pgtable.h | ||
503 | @@ -44,7 +44,7 @@ | ||
504 | /* Page protection bits */ | ||
505 | #define _PAGE_BASE (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_USER) | ||
506 | |||
507 | -#define PAGE_NONE __pgprot(0) | ||
508 | +#define PAGE_NONE __pgprot(_PAGE_PROT_NONE) | ||
509 | #define PAGE_READ __pgprot(_PAGE_BASE | _PAGE_READ) | ||
510 | #define PAGE_WRITE __pgprot(_PAGE_BASE | _PAGE_READ | _PAGE_WRITE) | ||
511 | #define PAGE_EXEC __pgprot(_PAGE_BASE | _PAGE_EXEC) | ||
512 | @@ -98,7 +98,7 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]; | ||
513 | |||
514 | static inline int pmd_present(pmd_t pmd) | ||
515 | { | ||
516 | - return (pmd_val(pmd) & _PAGE_PRESENT); | ||
517 | + return (pmd_val(pmd) & (_PAGE_PRESENT | _PAGE_PROT_NONE)); | ||
518 | } | ||
519 | |||
520 | static inline int pmd_none(pmd_t pmd) | ||
521 | @@ -178,7 +178,7 @@ static inline pte_t *pte_offset_kernel(pmd_t *pmd, unsigned long addr) | ||
522 | |||
523 | static inline int pte_present(pte_t pte) | ||
524 | { | ||
525 | - return (pte_val(pte) & _PAGE_PRESENT); | ||
526 | + return (pte_val(pte) & (_PAGE_PRESENT | _PAGE_PROT_NONE)); | ||
527 | } | ||
528 | |||
529 | static inline int pte_none(pte_t pte) | ||
530 | @@ -380,7 +380,7 @@ static inline int ptep_clear_flush_young(struct vm_area_struct *vma, | ||
531 | * | ||
532 | * Format of swap PTE: | ||
533 | * bit 0: _PAGE_PRESENT (zero) | ||
534 | - * bit 1: reserved for future use (zero) | ||
535 | + * bit 1: _PAGE_PROT_NONE (zero) | ||
536 | * bits 2 to 6: swap type | ||
537 | * bits 7 to XLEN-1: swap offset | ||
538 | */ | ||
539 | diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c | ||
540 | index 60f1e02eed36..6c898d540d9d 100644 | ||
541 | --- a/arch/riscv/kernel/ptrace.c | ||
542 | +++ b/arch/riscv/kernel/ptrace.c | ||
543 | @@ -172,6 +172,6 @@ void do_syscall_trace_exit(struct pt_regs *regs) | ||
544 | |||
545 | #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS | ||
546 | if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) | ||
547 | - trace_sys_exit(regs, regs->regs[0]); | ||
548 | + trace_sys_exit(regs, regs_return_value(regs)); | ||
549 | #endif | ||
550 | } | ||
551 | diff --git a/arch/s390/kernel/swsusp.S b/arch/s390/kernel/swsusp.S | ||
552 | index 537f97fde37f..b6796e616812 100644 | ||
553 | --- a/arch/s390/kernel/swsusp.S | ||
554 | +++ b/arch/s390/kernel/swsusp.S | ||
555 | @@ -30,10 +30,10 @@ | ||
556 | .section .text | ||
557 | ENTRY(swsusp_arch_suspend) | ||
558 | lg %r1,__LC_NODAT_STACK | ||
559 | - aghi %r1,-STACK_FRAME_OVERHEAD | ||
560 | stmg %r6,%r15,__SF_GPRS(%r1) | ||
561 | + aghi %r1,-STACK_FRAME_OVERHEAD | ||
562 | stg %r15,__SF_BACKCHAIN(%r1) | ||
563 | - lgr %r1,%r15 | ||
564 | + lgr %r15,%r1 | ||
565 | |||
566 | /* Store FPU registers */ | ||
567 | brasl %r14,save_fpu_regs | ||
568 | diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c | ||
569 | index 374a19712e20..b684f0294f35 100644 | ||
570 | --- a/arch/x86/events/core.c | ||
571 | +++ b/arch/x86/events/core.c | ||
572 | @@ -2278,6 +2278,19 @@ void perf_check_microcode(void) | ||
573 | x86_pmu.check_microcode(); | ||
574 | } | ||
575 | |||
576 | +static int x86_pmu_check_period(struct perf_event *event, u64 value) | ||
577 | +{ | ||
578 | + if (x86_pmu.check_period && x86_pmu.check_period(event, value)) | ||
579 | + return -EINVAL; | ||
580 | + | ||
581 | + if (value && x86_pmu.limit_period) { | ||
582 | + if (x86_pmu.limit_period(event, value) > value) | ||
583 | + return -EINVAL; | ||
584 | + } | ||
585 | + | ||
586 | + return 0; | ||
587 | +} | ||
588 | + | ||
589 | static struct pmu pmu = { | ||
590 | .pmu_enable = x86_pmu_enable, | ||
591 | .pmu_disable = x86_pmu_disable, | ||
592 | @@ -2302,6 +2315,7 @@ static struct pmu pmu = { | ||
593 | .event_idx = x86_pmu_event_idx, | ||
594 | .sched_task = x86_pmu_sched_task, | ||
595 | .task_ctx_size = sizeof(struct x86_perf_task_context), | ||
596 | + .check_period = x86_pmu_check_period, | ||
597 | }; | ||
598 | |||
599 | void arch_perf_update_userpage(struct perf_event *event, | ||
600 | diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c | ||
601 | index 90b6718ff861..ede20c44cc69 100644 | ||
602 | --- a/arch/x86/events/intel/core.c | ||
603 | +++ b/arch/x86/events/intel/core.c | ||
604 | @@ -3587,6 +3587,11 @@ static void intel_pmu_sched_task(struct perf_event_context *ctx, | ||
605 | intel_pmu_lbr_sched_task(ctx, sched_in); | ||
606 | } | ||
607 | |||
608 | +static int intel_pmu_check_period(struct perf_event *event, u64 value) | ||
609 | +{ | ||
610 | + return intel_pmu_has_bts_period(event, value) ? -EINVAL : 0; | ||
611 | +} | ||
612 | + | ||
613 | PMU_FORMAT_ATTR(offcore_rsp, "config1:0-63"); | ||
614 | |||
615 | PMU_FORMAT_ATTR(ldlat, "config1:0-15"); | ||
616 | @@ -3667,6 +3672,8 @@ static __initconst const struct x86_pmu core_pmu = { | ||
617 | .cpu_starting = intel_pmu_cpu_starting, | ||
618 | .cpu_dying = intel_pmu_cpu_dying, | ||
619 | .cpu_dead = intel_pmu_cpu_dead, | ||
620 | + | ||
621 | + .check_period = intel_pmu_check_period, | ||
622 | }; | ||
623 | |||
624 | static struct attribute *intel_pmu_attrs[]; | ||
625 | @@ -3711,6 +3718,8 @@ static __initconst const struct x86_pmu intel_pmu = { | ||
626 | |||
627 | .guest_get_msrs = intel_guest_get_msrs, | ||
628 | .sched_task = intel_pmu_sched_task, | ||
629 | + | ||
630 | + .check_period = intel_pmu_check_period, | ||
631 | }; | ||
632 | |||
633 | static __init void intel_clovertown_quirk(void) | ||
634 | diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h | ||
635 | index 78d7b7031bfc..d46fd6754d92 100644 | ||
636 | --- a/arch/x86/events/perf_event.h | ||
637 | +++ b/arch/x86/events/perf_event.h | ||
638 | @@ -646,6 +646,11 @@ struct x86_pmu { | ||
639 | * Intel host/guest support (KVM) | ||
640 | */ | ||
641 | struct perf_guest_switch_msr *(*guest_get_msrs)(int *nr); | ||
642 | + | ||
643 | + /* | ||
644 | + * Check period value for PERF_EVENT_IOC_PERIOD ioctl. | ||
645 | + */ | ||
646 | + int (*check_period) (struct perf_event *event, u64 period); | ||
647 | }; | ||
648 | |||
649 | struct x86_perf_task_context { | ||
650 | @@ -857,7 +862,7 @@ static inline int amd_pmu_init(void) | ||
651 | |||
652 | #ifdef CONFIG_CPU_SUP_INTEL | ||
653 | |||
654 | -static inline bool intel_pmu_has_bts(struct perf_event *event) | ||
655 | +static inline bool intel_pmu_has_bts_period(struct perf_event *event, u64 period) | ||
656 | { | ||
657 | struct hw_perf_event *hwc = &event->hw; | ||
658 | unsigned int hw_event, bts_event; | ||
659 | @@ -868,7 +873,14 @@ static inline bool intel_pmu_has_bts(struct perf_event *event) | ||
660 | hw_event = hwc->config & INTEL_ARCH_EVENT_MASK; | ||
661 | bts_event = x86_pmu.event_map(PERF_COUNT_HW_BRANCH_INSTRUCTIONS); | ||
662 | |||
663 | - return hw_event == bts_event && hwc->sample_period == 1; | ||
664 | + return hw_event == bts_event && period == 1; | ||
665 | +} | ||
666 | + | ||
667 | +static inline bool intel_pmu_has_bts(struct perf_event *event) | ||
668 | +{ | ||
669 | + struct hw_perf_event *hwc = &event->hw; | ||
670 | + | ||
671 | + return intel_pmu_has_bts_period(event, hwc->sample_period); | ||
672 | } | ||
673 | |||
674 | int intel_pmu_save_and_restart(struct perf_event *event); | ||
675 | diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c | ||
676 | index 8e02b30cf08e..3ebd77770f98 100644 | ||
677 | --- a/arch/x86/ia32/ia32_aout.c | ||
678 | +++ b/arch/x86/ia32/ia32_aout.c | ||
679 | @@ -51,7 +51,7 @@ static unsigned long get_dr(int n) | ||
680 | /* | ||
681 | * fill in the user structure for a core dump.. | ||
682 | */ | ||
683 | -static void dump_thread32(struct pt_regs *regs, struct user32 *dump) | ||
684 | +static void fill_dump(struct pt_regs *regs, struct user32 *dump) | ||
685 | { | ||
686 | u32 fs, gs; | ||
687 | memset(dump, 0, sizeof(*dump)); | ||
688 | @@ -157,10 +157,12 @@ static int aout_core_dump(struct coredump_params *cprm) | ||
689 | fs = get_fs(); | ||
690 | set_fs(KERNEL_DS); | ||
691 | has_dumped = 1; | ||
692 | + | ||
693 | + fill_dump(cprm->regs, &dump); | ||
694 | + | ||
695 | strncpy(dump.u_comm, current->comm, sizeof(current->comm)); | ||
696 | dump.u_ar0 = offsetof(struct user32, regs); | ||
697 | dump.signal = cprm->siginfo->si_signo; | ||
698 | - dump_thread32(cprm->regs, &dump); | ||
699 | |||
700 | /* | ||
701 | * If the size of the dump file exceeds the rlimit, then see | ||
702 | diff --git a/arch/x86/include/asm/uv/bios.h b/arch/x86/include/asm/uv/bios.h | ||
703 | index e652a7cc6186..3f697a9e3f59 100644 | ||
704 | --- a/arch/x86/include/asm/uv/bios.h | ||
705 | +++ b/arch/x86/include/asm/uv/bios.h | ||
706 | @@ -48,7 +48,8 @@ enum { | ||
707 | BIOS_STATUS_SUCCESS = 0, | ||
708 | BIOS_STATUS_UNIMPLEMENTED = -ENOSYS, | ||
709 | BIOS_STATUS_EINVAL = -EINVAL, | ||
710 | - BIOS_STATUS_UNAVAIL = -EBUSY | ||
711 | + BIOS_STATUS_UNAVAIL = -EBUSY, | ||
712 | + BIOS_STATUS_ABORT = -EINTR, | ||
713 | }; | ||
714 | |||
715 | /* Address map parameters */ | ||
716 | @@ -167,4 +168,9 @@ extern long system_serial_number; | ||
717 | |||
718 | extern struct kobject *sgi_uv_kobj; /* /sys/firmware/sgi_uv */ | ||
719 | |||
720 | +/* | ||
721 | + * EFI runtime lock; cf. firmware/efi/runtime-wrappers.c for details | ||
722 | + */ | ||
723 | +extern struct semaphore __efi_uv_runtime_lock; | ||
724 | + | ||
725 | #endif /* _ASM_X86_UV_BIOS_H */ | ||
726 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c | ||
727 | index 11641d9e7f6f..13baba9d1cc1 100644 | ||
728 | --- a/arch/x86/kvm/svm.c | ||
729 | +++ b/arch/x86/kvm/svm.c | ||
730 | @@ -6255,6 +6255,9 @@ static int sev_guest_init(struct kvm *kvm, struct kvm_sev_cmd *argp) | ||
731 | int asid, ret; | ||
732 | |||
733 | ret = -EBUSY; | ||
734 | + if (unlikely(sev->active)) | ||
735 | + return ret; | ||
736 | + | ||
737 | asid = sev_asid_new(); | ||
738 | if (asid < 0) | ||
739 | return ret; | ||
740 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
741 | index 4ce6595e454c..bbd0520867a8 100644 | ||
742 | --- a/arch/x86/kvm/vmx.c | ||
743 | +++ b/arch/x86/kvm/vmx.c | ||
744 | @@ -2779,7 +2779,8 @@ static void add_atomic_switch_msr(struct vcpu_vmx *vmx, unsigned msr, | ||
745 | if (!entry_only) | ||
746 | j = find_msr(&m->host, msr); | ||
747 | |||
748 | - if (i == NR_AUTOLOAD_MSRS || j == NR_AUTOLOAD_MSRS) { | ||
749 | + if ((i < 0 && m->guest.nr == NR_AUTOLOAD_MSRS) || | ||
750 | + (j < 0 && m->host.nr == NR_AUTOLOAD_MSRS)) { | ||
751 | printk_once(KERN_WARNING "Not enough msr switch entries. " | ||
752 | "Can't add msr %x\n", msr); | ||
753 | return; | ||
754 | @@ -3620,9 +3621,11 @@ static void nested_vmx_setup_ctls_msrs(struct nested_vmx_msrs *msrs, bool apicv) | ||
755 | * secondary cpu-based controls. Do not include those that | ||
756 | * depend on CPUID bits, they are added later by vmx_cpuid_update. | ||
757 | */ | ||
758 | - rdmsr(MSR_IA32_VMX_PROCBASED_CTLS2, | ||
759 | - msrs->secondary_ctls_low, | ||
760 | - msrs->secondary_ctls_high); | ||
761 | + if (msrs->procbased_ctls_high & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) | ||
762 | + rdmsr(MSR_IA32_VMX_PROCBASED_CTLS2, | ||
763 | + msrs->secondary_ctls_low, | ||
764 | + msrs->secondary_ctls_high); | ||
765 | + | ||
766 | msrs->secondary_ctls_low = 0; | ||
767 | msrs->secondary_ctls_high &= | ||
768 | SECONDARY_EXEC_DESC | | ||
769 | diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c | ||
770 | index 4a6a5a26c582..eb33432f2f24 100644 | ||
771 | --- a/arch/x86/platform/uv/bios_uv.c | ||
772 | +++ b/arch/x86/platform/uv/bios_uv.c | ||
773 | @@ -29,7 +29,8 @@ | ||
774 | |||
775 | struct uv_systab *uv_systab; | ||
776 | |||
777 | -s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) | ||
778 | +static s64 __uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, | ||
779 | + u64 a4, u64 a5) | ||
780 | { | ||
781 | struct uv_systab *tab = uv_systab; | ||
782 | s64 ret; | ||
783 | @@ -51,6 +52,19 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) | ||
784 | |||
785 | return ret; | ||
786 | } | ||
787 | + | ||
788 | +s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5) | ||
789 | +{ | ||
790 | + s64 ret; | ||
791 | + | ||
792 | + if (down_interruptible(&__efi_uv_runtime_lock)) | ||
793 | + return BIOS_STATUS_ABORT; | ||
794 | + | ||
795 | + ret = __uv_bios_call(which, a1, a2, a3, a4, a5); | ||
796 | + up(&__efi_uv_runtime_lock); | ||
797 | + | ||
798 | + return ret; | ||
799 | +} | ||
800 | EXPORT_SYMBOL_GPL(uv_bios_call); | ||
801 | |||
802 | s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, | ||
803 | @@ -59,10 +73,15 @@ s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, | ||
804 | unsigned long bios_flags; | ||
805 | s64 ret; | ||
806 | |||
807 | + if (down_interruptible(&__efi_uv_runtime_lock)) | ||
808 | + return BIOS_STATUS_ABORT; | ||
809 | + | ||
810 | local_irq_save(bios_flags); | ||
811 | - ret = uv_bios_call(which, a1, a2, a3, a4, a5); | ||
812 | + ret = __uv_bios_call(which, a1, a2, a3, a4, a5); | ||
813 | local_irq_restore(bios_flags); | ||
814 | |||
815 | + up(&__efi_uv_runtime_lock); | ||
816 | + | ||
817 | return ret; | ||
818 | } | ||
819 | |||
820 | diff --git a/block/blk-flush.c b/block/blk-flush.c | ||
821 | index 8b44b86779da..87fc49daa2b4 100644 | ||
822 | --- a/block/blk-flush.c | ||
823 | +++ b/block/blk-flush.c | ||
824 | @@ -424,7 +424,7 @@ static void mq_flush_data_end_io(struct request *rq, blk_status_t error) | ||
825 | blk_flush_complete_seq(rq, fq, REQ_FSEQ_DATA, error); | ||
826 | spin_unlock_irqrestore(&fq->mq_flush_lock, flags); | ||
827 | |||
828 | - blk_mq_run_hw_queue(hctx, true); | ||
829 | + blk_mq_sched_restart(hctx); | ||
830 | } | ||
831 | |||
832 | /** | ||
833 | diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c | ||
834 | index 274699463b4f..7bbbf8256a41 100644 | ||
835 | --- a/drivers/acpi/numa.c | ||
836 | +++ b/drivers/acpi/numa.c | ||
837 | @@ -146,9 +146,9 @@ acpi_table_print_srat_entry(struct acpi_subtable_header *header) | ||
838 | { | ||
839 | struct acpi_srat_mem_affinity *p = | ||
840 | (struct acpi_srat_mem_affinity *)header; | ||
841 | - pr_debug("SRAT Memory (0x%lx length 0x%lx) in proximity domain %d %s%s%s\n", | ||
842 | - (unsigned long)p->base_address, | ||
843 | - (unsigned long)p->length, | ||
844 | + pr_debug("SRAT Memory (0x%llx length 0x%llx) in proximity domain %d %s%s%s\n", | ||
845 | + (unsigned long long)p->base_address, | ||
846 | + (unsigned long long)p->length, | ||
847 | p->proximity_domain, | ||
848 | (p->flags & ACPI_SRAT_MEM_ENABLED) ? | ||
849 | "enabled" : "disabled", | ||
850 | diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c | ||
851 | index 7aa3dcad2175..df34a12a388f 100644 | ||
852 | --- a/drivers/cpufreq/cpufreq.c | ||
853 | +++ b/drivers/cpufreq/cpufreq.c | ||
854 | @@ -1530,17 +1530,16 @@ static unsigned int __cpufreq_get(struct cpufreq_policy *policy) | ||
855 | { | ||
856 | unsigned int ret_freq = 0; | ||
857 | |||
858 | - if (!cpufreq_driver->get) | ||
859 | + if (unlikely(policy_is_inactive(policy)) || !cpufreq_driver->get) | ||
860 | return ret_freq; | ||
861 | |||
862 | ret_freq = cpufreq_driver->get(policy->cpu); | ||
863 | |||
864 | /* | ||
865 | - * Updating inactive policies is invalid, so avoid doing that. Also | ||
866 | - * if fast frequency switching is used with the given policy, the check | ||
867 | + * If fast frequency switching is used with the given policy, the check | ||
868 | * against policy->cur is pointless, so skip it in that case too. | ||
869 | */ | ||
870 | - if (unlikely(policy_is_inactive(policy)) || policy->fast_switch_enabled) | ||
871 | + if (policy->fast_switch_enabled) | ||
872 | return ret_freq; | ||
873 | |||
874 | if (ret_freq && policy->cur && | ||
875 | @@ -1569,10 +1568,7 @@ unsigned int cpufreq_get(unsigned int cpu) | ||
876 | |||
877 | if (policy) { | ||
878 | down_read(&policy->rwsem); | ||
879 | - | ||
880 | - if (!policy_is_inactive(policy)) | ||
881 | - ret_freq = __cpufreq_get(policy); | ||
882 | - | ||
883 | + ret_freq = __cpufreq_get(policy); | ||
884 | up_read(&policy->rwsem); | ||
885 | |||
886 | cpufreq_cpu_put(policy); | ||
887 | diff --git a/drivers/crypto/ccree/cc_driver.c b/drivers/crypto/ccree/cc_driver.c | ||
888 | index 1ff229c2aeab..186a2536fb8b 100644 | ||
889 | --- a/drivers/crypto/ccree/cc_driver.c | ||
890 | +++ b/drivers/crypto/ccree/cc_driver.c | ||
891 | @@ -364,7 +364,7 @@ static int init_cc_resources(struct platform_device *plat_dev) | ||
892 | rc = cc_ivgen_init(new_drvdata); | ||
893 | if (rc) { | ||
894 | dev_err(dev, "cc_ivgen_init failed\n"); | ||
895 | - goto post_power_mgr_err; | ||
896 | + goto post_buf_mgr_err; | ||
897 | } | ||
898 | |||
899 | /* Allocate crypto algs */ | ||
900 | @@ -387,6 +387,9 @@ static int init_cc_resources(struct platform_device *plat_dev) | ||
901 | goto post_hash_err; | ||
902 | } | ||
903 | |||
904 | + /* All set, we can allow autosuspend */ | ||
905 | + cc_pm_go(new_drvdata); | ||
906 | + | ||
907 | /* If we got here and FIPS mode is enabled | ||
908 | * it means all FIPS test passed, so let TEE | ||
909 | * know we're good. | ||
910 | @@ -401,8 +404,6 @@ post_cipher_err: | ||
911 | cc_cipher_free(new_drvdata); | ||
912 | post_ivgen_err: | ||
913 | cc_ivgen_fini(new_drvdata); | ||
914 | -post_power_mgr_err: | ||
915 | - cc_pm_fini(new_drvdata); | ||
916 | post_buf_mgr_err: | ||
917 | cc_buffer_mgr_fini(new_drvdata); | ||
918 | post_req_mgr_err: | ||
919 | diff --git a/drivers/crypto/ccree/cc_pm.c b/drivers/crypto/ccree/cc_pm.c | ||
920 | index d990f472e89f..6ff7e75ad90e 100644 | ||
921 | --- a/drivers/crypto/ccree/cc_pm.c | ||
922 | +++ b/drivers/crypto/ccree/cc_pm.c | ||
923 | @@ -100,20 +100,19 @@ int cc_pm_put_suspend(struct device *dev) | ||
924 | |||
925 | int cc_pm_init(struct cc_drvdata *drvdata) | ||
926 | { | ||
927 | - int rc = 0; | ||
928 | struct device *dev = drvdata_to_dev(drvdata); | ||
929 | |||
930 | /* must be before the enabling to avoid resdundent suspending */ | ||
931 | pm_runtime_set_autosuspend_delay(dev, CC_SUSPEND_TIMEOUT); | ||
932 | pm_runtime_use_autosuspend(dev); | ||
933 | /* activate the PM module */ | ||
934 | - rc = pm_runtime_set_active(dev); | ||
935 | - if (rc) | ||
936 | - return rc; | ||
937 | - /* enable the PM module*/ | ||
938 | - pm_runtime_enable(dev); | ||
939 | + return pm_runtime_set_active(dev); | ||
940 | +} | ||
941 | |||
942 | - return rc; | ||
943 | +/* enable the PM module*/ | ||
944 | +void cc_pm_go(struct cc_drvdata *drvdata) | ||
945 | +{ | ||
946 | + pm_runtime_enable(drvdata_to_dev(drvdata)); | ||
947 | } | ||
948 | |||
949 | void cc_pm_fini(struct cc_drvdata *drvdata) | ||
950 | diff --git a/drivers/crypto/ccree/cc_pm.h b/drivers/crypto/ccree/cc_pm.h | ||
951 | index 020a5403c58b..f62624357020 100644 | ||
952 | --- a/drivers/crypto/ccree/cc_pm.h | ||
953 | +++ b/drivers/crypto/ccree/cc_pm.h | ||
954 | @@ -16,6 +16,7 @@ | ||
955 | extern const struct dev_pm_ops ccree_pm; | ||
956 | |||
957 | int cc_pm_init(struct cc_drvdata *drvdata); | ||
958 | +void cc_pm_go(struct cc_drvdata *drvdata); | ||
959 | void cc_pm_fini(struct cc_drvdata *drvdata); | ||
960 | int cc_pm_suspend(struct device *dev); | ||
961 | int cc_pm_resume(struct device *dev); | ||
962 | @@ -29,6 +30,8 @@ static inline int cc_pm_init(struct cc_drvdata *drvdata) | ||
963 | return 0; | ||
964 | } | ||
965 | |||
966 | +static void cc_pm_go(struct cc_drvdata *drvdata) {} | ||
967 | + | ||
968 | static inline void cc_pm_fini(struct cc_drvdata *drvdata) {} | ||
969 | |||
970 | static inline int cc_pm_suspend(struct device *dev) | ||
971 | diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c | ||
972 | index 8903b9ccfc2b..e2abfdb5cee6 100644 | ||
973 | --- a/drivers/firmware/efi/runtime-wrappers.c | ||
974 | +++ b/drivers/firmware/efi/runtime-wrappers.c | ||
975 | @@ -146,6 +146,13 @@ void efi_call_virt_check_flags(unsigned long flags, const char *call) | ||
976 | */ | ||
977 | static DEFINE_SEMAPHORE(efi_runtime_lock); | ||
978 | |||
979 | +/* | ||
980 | + * Expose the EFI runtime lock to the UV platform | ||
981 | + */ | ||
982 | +#ifdef CONFIG_X86_UV | ||
983 | +extern struct semaphore __efi_uv_runtime_lock __alias(efi_runtime_lock); | ||
984 | +#endif | ||
985 | + | ||
986 | /* | ||
987 | * Calls the appropriate efi_runtime_service() with the appropriate | ||
988 | * arguments. | ||
989 | diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c | ||
990 | index 995cf0b9e0b1..2d1dfa1e0745 100644 | ||
991 | --- a/drivers/gpio/gpio-mxc.c | ||
992 | +++ b/drivers/gpio/gpio-mxc.c | ||
993 | @@ -17,6 +17,7 @@ | ||
994 | #include <linux/irqchip/chained_irq.h> | ||
995 | #include <linux/platform_device.h> | ||
996 | #include <linux/slab.h> | ||
997 | +#include <linux/syscore_ops.h> | ||
998 | #include <linux/gpio/driver.h> | ||
999 | #include <linux/of.h> | ||
1000 | #include <linux/of_device.h> | ||
1001 | @@ -550,33 +551,38 @@ static void mxc_gpio_restore_regs(struct mxc_gpio_port *port) | ||
1002 | writel(port->gpio_saved_reg.dr, port->base + GPIO_DR); | ||
1003 | } | ||
1004 | |||
1005 | -static int __maybe_unused mxc_gpio_noirq_suspend(struct device *dev) | ||
1006 | +static int mxc_gpio_syscore_suspend(void) | ||
1007 | { | ||
1008 | - struct platform_device *pdev = to_platform_device(dev); | ||
1009 | - struct mxc_gpio_port *port = platform_get_drvdata(pdev); | ||
1010 | + struct mxc_gpio_port *port; | ||
1011 | |||
1012 | - mxc_gpio_save_regs(port); | ||
1013 | - clk_disable_unprepare(port->clk); | ||
1014 | + /* walk through all ports */ | ||
1015 | + list_for_each_entry(port, &mxc_gpio_ports, node) { | ||
1016 | + mxc_gpio_save_regs(port); | ||
1017 | + clk_disable_unprepare(port->clk); | ||
1018 | + } | ||
1019 | |||
1020 | return 0; | ||
1021 | } | ||
1022 | |||
1023 | -static int __maybe_unused mxc_gpio_noirq_resume(struct device *dev) | ||
1024 | +static void mxc_gpio_syscore_resume(void) | ||
1025 | { | ||
1026 | - struct platform_device *pdev = to_platform_device(dev); | ||
1027 | - struct mxc_gpio_port *port = platform_get_drvdata(pdev); | ||
1028 | + struct mxc_gpio_port *port; | ||
1029 | int ret; | ||
1030 | |||
1031 | - ret = clk_prepare_enable(port->clk); | ||
1032 | - if (ret) | ||
1033 | - return ret; | ||
1034 | - mxc_gpio_restore_regs(port); | ||
1035 | - | ||
1036 | - return 0; | ||
1037 | + /* walk through all ports */ | ||
1038 | + list_for_each_entry(port, &mxc_gpio_ports, node) { | ||
1039 | + ret = clk_prepare_enable(port->clk); | ||
1040 | + if (ret) { | ||
1041 | + pr_err("mxc: failed to enable gpio clock %d\n", ret); | ||
1042 | + return; | ||
1043 | + } | ||
1044 | + mxc_gpio_restore_regs(port); | ||
1045 | + } | ||
1046 | } | ||
1047 | |||
1048 | -static const struct dev_pm_ops mxc_gpio_dev_pm_ops = { | ||
1049 | - SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(mxc_gpio_noirq_suspend, mxc_gpio_noirq_resume) | ||
1050 | +static struct syscore_ops mxc_gpio_syscore_ops = { | ||
1051 | + .suspend = mxc_gpio_syscore_suspend, | ||
1052 | + .resume = mxc_gpio_syscore_resume, | ||
1053 | }; | ||
1054 | |||
1055 | static struct platform_driver mxc_gpio_driver = { | ||
1056 | @@ -584,7 +590,6 @@ static struct platform_driver mxc_gpio_driver = { | ||
1057 | .name = "gpio-mxc", | ||
1058 | .of_match_table = mxc_gpio_dt_ids, | ||
1059 | .suppress_bind_attrs = true, | ||
1060 | - .pm = &mxc_gpio_dev_pm_ops, | ||
1061 | }, | ||
1062 | .probe = mxc_gpio_probe, | ||
1063 | .id_table = mxc_gpio_devtype, | ||
1064 | @@ -592,6 +597,8 @@ static struct platform_driver mxc_gpio_driver = { | ||
1065 | |||
1066 | static int __init gpio_mxc_init(void) | ||
1067 | { | ||
1068 | + register_syscore_ops(&mxc_gpio_syscore_ops); | ||
1069 | + | ||
1070 | return platform_driver_register(&mxc_gpio_driver); | ||
1071 | } | ||
1072 | subsys_initcall(gpio_mxc_init); | ||
1073 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | ||
1074 | index 30bc345d6fdf..8547fdaf8273 100644 | ||
1075 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | ||
1076 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | ||
1077 | @@ -1684,8 +1684,10 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) | ||
1078 | amdgpu_xgmi_add_device(adev); | ||
1079 | amdgpu_amdkfd_device_init(adev); | ||
1080 | |||
1081 | - if (amdgpu_sriov_vf(adev)) | ||
1082 | + if (amdgpu_sriov_vf(adev)) { | ||
1083 | + amdgpu_virt_init_data_exchange(adev); | ||
1084 | amdgpu_virt_release_full_gpu(adev, true); | ||
1085 | + } | ||
1086 | |||
1087 | return 0; | ||
1088 | } | ||
1089 | @@ -2597,9 +2599,6 @@ fence_driver_init: | ||
1090 | goto failed; | ||
1091 | } | ||
1092 | |||
1093 | - if (amdgpu_sriov_vf(adev)) | ||
1094 | - amdgpu_virt_init_data_exchange(adev); | ||
1095 | - | ||
1096 | amdgpu_fbdev_init(adev); | ||
1097 | |||
1098 | r = amdgpu_pm_sysfs_init(adev); | ||
1099 | @@ -3271,6 +3270,7 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, | ||
1100 | r = amdgpu_ib_ring_tests(adev); | ||
1101 | |||
1102 | error: | ||
1103 | + amdgpu_virt_init_data_exchange(adev); | ||
1104 | amdgpu_virt_release_full_gpu(adev, true); | ||
1105 | if (!r && adev->virt.gim_feature & AMDGIM_FEATURE_GIM_FLR_VRAMLOST) { | ||
1106 | atomic_inc(&adev->vram_lost_counter); | ||
1107 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | ||
1108 | index 0877ff9a9594..8c9abaa7601a 100644 | ||
1109 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | ||
1110 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | ||
1111 | @@ -850,9 +850,6 @@ static void amdgpu_vm_bo_param(struct amdgpu_device *adev, struct amdgpu_vm *vm, | ||
1112 | bp->size = amdgpu_vm_bo_size(adev, level); | ||
1113 | bp->byte_align = AMDGPU_GPU_PAGE_SIZE; | ||
1114 | bp->domain = AMDGPU_GEM_DOMAIN_VRAM; | ||
1115 | - if (bp->size <= PAGE_SIZE && adev->asic_type >= CHIP_VEGA10 && | ||
1116 | - adev->flags & AMD_IS_APU) | ||
1117 | - bp->domain |= AMDGPU_GEM_DOMAIN_GTT; | ||
1118 | bp->domain = amdgpu_bo_get_preferred_pin_domain(adev, bp->domain); | ||
1119 | bp->flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS | | ||
1120 | AMDGPU_GEM_CREATE_CPU_GTT_USWC; | ||
1121 | diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | ||
1122 | index 21363b2b2ee5..88ed064b3585 100644 | ||
1123 | --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | ||
1124 | +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | ||
1125 | @@ -112,7 +112,10 @@ static const struct soc15_reg_golden golden_settings_gc_9_0[] = | ||
1126 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x4a2c0e68), | ||
1127 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0xb5d3f197), | ||
1128 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_CACHE_INVALIDATION, 0x3fff3af3, 0x19200000), | ||
1129 | - SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000003ff) | ||
1130 | + SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000003ff), | ||
1131 | + SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC1_F32_INT_DIS, 0x00000000, 0x00000800), | ||
1132 | + SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC2_F32_INT_DIS, 0x00000000, 0x00000800), | ||
1133 | + SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_DEBUG, 0x00000000, 0x00008000) | ||
1134 | }; | ||
1135 | |||
1136 | static const struct soc15_reg_golden golden_settings_gc_9_0_vg10[] = | ||
1137 | @@ -134,10 +137,7 @@ static const struct soc15_reg_golden golden_settings_gc_9_0_vg10[] = | ||
1138 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_UTCL1_CNTL2, 0x00030000, 0x00020000), | ||
1139 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1, 0x0000000f, 0x01000107), | ||
1140 | SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x00001800, 0x00000800), | ||
1141 | - SOC15_REG_GOLDEN_VALUE(GC, 0, mmWD_UTCL1_CNTL, 0x08000000, 0x08000080), | ||
1142 | - SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC1_F32_INT_DIS, 0x00000000, 0x00000800), | ||
1143 | - SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_MEC2_F32_INT_DIS, 0x00000000, 0x00000800), | ||
1144 | - SOC15_REG_GOLDEN_VALUE(GC, 0, mmCP_DEBUG, 0x00000000, 0x00008000) | ||
1145 | + SOC15_REG_GOLDEN_VALUE(GC, 0, mmWD_UTCL1_CNTL, 0x08000000, 0x08000080) | ||
1146 | }; | ||
1147 | |||
1148 | static const struct soc15_reg_golden golden_settings_gc_9_0_vg20[] = | ||
1149 | diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | ||
1150 | index 8cbb4655896a..b11a1c17a7f2 100644 | ||
1151 | --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | ||
1152 | +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | ||
1153 | @@ -174,7 +174,7 @@ static int xgpu_ai_send_access_requests(struct amdgpu_device *adev, | ||
1154 | return r; | ||
1155 | } | ||
1156 | /* Retrieve checksum from mailbox2 */ | ||
1157 | - if (req == IDH_REQ_GPU_INIT_ACCESS) { | ||
1158 | + if (req == IDH_REQ_GPU_INIT_ACCESS || req == IDH_REQ_GPU_RESET_ACCESS) { | ||
1159 | adev->virt.fw_reserve.checksum_key = | ||
1160 | RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, | ||
1161 | mmBIF_BX_PF0_MAILBOX_MSGBUF_RCV_DW2)); | ||
1162 | diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | ||
1163 | index 7a8c9172d30a..86d5dc5f8887 100644 | ||
1164 | --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | ||
1165 | +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | ||
1166 | @@ -73,7 +73,6 @@ static const struct soc15_reg_golden golden_settings_sdma_4[] = { | ||
1167 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC1_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000), | ||
1168 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_PAGE, 0x000003ff, 0x000003c0), | ||
1169 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_WATERMK, 0xfc000000, 0x00000000), | ||
1170 | - SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831f07), | ||
1171 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CLK_CTRL, 0xffffffff, 0x3f000100), | ||
1172 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GFX_IB_CNTL, 0x800f0100, 0x00000100), | ||
1173 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GFX_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000), | ||
1174 | @@ -91,6 +90,7 @@ static const struct soc15_reg_golden golden_settings_sdma_4[] = { | ||
1175 | static const struct soc15_reg_golden golden_settings_sdma_vg10[] = { | ||
1176 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0018773f, 0x00104002), | ||
1177 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104002), | ||
1178 | + SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831d07), | ||
1179 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG, 0x0018773f, 0x00104002), | ||
1180 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104002) | ||
1181 | }; | ||
1182 | @@ -98,6 +98,7 @@ static const struct soc15_reg_golden golden_settings_sdma_vg10[] = { | ||
1183 | static const struct soc15_reg_golden golden_settings_sdma_vg12[] = { | ||
1184 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0018773f, 0x00104001), | ||
1185 | SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104001), | ||
1186 | + SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831d07), | ||
1187 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG, 0x0018773f, 0x00104001), | ||
1188 | SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104001) | ||
1189 | }; | ||
1190 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | ||
1191 | index 3b7fce5d7258..b9e19b0eb905 100644 | ||
1192 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | ||
1193 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c | ||
1194 | @@ -2244,6 +2244,13 @@ static int vega20_force_clock_level(struct pp_hwmgr *hwmgr, | ||
1195 | soft_min_level = mask ? (ffs(mask) - 1) : 0; | ||
1196 | soft_max_level = mask ? (fls(mask) - 1) : 0; | ||
1197 | |||
1198 | + if (soft_max_level >= data->dpm_table.gfx_table.count) { | ||
1199 | + pr_err("Clock level specified %d is over max allowed %d\n", | ||
1200 | + soft_max_level, | ||
1201 | + data->dpm_table.gfx_table.count - 1); | ||
1202 | + return -EINVAL; | ||
1203 | + } | ||
1204 | + | ||
1205 | data->dpm_table.gfx_table.dpm_state.soft_min_level = | ||
1206 | data->dpm_table.gfx_table.dpm_levels[soft_min_level].value; | ||
1207 | data->dpm_table.gfx_table.dpm_state.soft_max_level = | ||
1208 | @@ -2264,6 +2271,13 @@ static int vega20_force_clock_level(struct pp_hwmgr *hwmgr, | ||
1209 | soft_min_level = mask ? (ffs(mask) - 1) : 0; | ||
1210 | soft_max_level = mask ? (fls(mask) - 1) : 0; | ||
1211 | |||
1212 | + if (soft_max_level >= data->dpm_table.mem_table.count) { | ||
1213 | + pr_err("Clock level specified %d is over max allowed %d\n", | ||
1214 | + soft_max_level, | ||
1215 | + data->dpm_table.mem_table.count - 1); | ||
1216 | + return -EINVAL; | ||
1217 | + } | ||
1218 | + | ||
1219 | data->dpm_table.mem_table.dpm_state.soft_min_level = | ||
1220 | data->dpm_table.mem_table.dpm_levels[soft_min_level].value; | ||
1221 | data->dpm_table.mem_table.dpm_state.soft_max_level = | ||
1222 | diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c | ||
1223 | index 8e28e738cb52..391547358756 100644 | ||
1224 | --- a/drivers/gpu/drm/bridge/tc358767.c | ||
1225 | +++ b/drivers/gpu/drm/bridge/tc358767.c | ||
1226 | @@ -98,6 +98,8 @@ | ||
1227 | #define DP0_STARTVAL 0x064c | ||
1228 | #define DP0_ACTIVEVAL 0x0650 | ||
1229 | #define DP0_SYNCVAL 0x0654 | ||
1230 | +#define SYNCVAL_HS_POL_ACTIVE_LOW (1 << 15) | ||
1231 | +#define SYNCVAL_VS_POL_ACTIVE_LOW (1 << 31) | ||
1232 | #define DP0_MISC 0x0658 | ||
1233 | #define TU_SIZE_RECOMMENDED (63) /* LSCLK cycles per TU */ | ||
1234 | #define BPC_6 (0 << 5) | ||
1235 | @@ -142,6 +144,8 @@ | ||
1236 | #define DP0_LTLOOPCTRL 0x06d8 | ||
1237 | #define DP0_SNKLTCTRL 0x06e4 | ||
1238 | |||
1239 | +#define DP1_SRCCTRL 0x07a0 | ||
1240 | + | ||
1241 | /* PHY */ | ||
1242 | #define DP_PHY_CTRL 0x0800 | ||
1243 | #define DP_PHY_RST BIT(28) /* DP PHY Global Soft Reset */ | ||
1244 | @@ -150,6 +154,7 @@ | ||
1245 | #define PHY_M1_RST BIT(12) /* Reset PHY1 Main Channel */ | ||
1246 | #define PHY_RDY BIT(16) /* PHY Main Channels Ready */ | ||
1247 | #define PHY_M0_RST BIT(8) /* Reset PHY0 Main Channel */ | ||
1248 | +#define PHY_2LANE BIT(2) /* PHY Enable 2 lanes */ | ||
1249 | #define PHY_A0_EN BIT(1) /* PHY Aux Channel0 Enable */ | ||
1250 | #define PHY_M0_EN BIT(0) /* PHY Main Channel0 Enable */ | ||
1251 | |||
1252 | @@ -540,6 +545,7 @@ static int tc_aux_link_setup(struct tc_data *tc) | ||
1253 | unsigned long rate; | ||
1254 | u32 value; | ||
1255 | int ret; | ||
1256 | + u32 dp_phy_ctrl; | ||
1257 | |||
1258 | rate = clk_get_rate(tc->refclk); | ||
1259 | switch (rate) { | ||
1260 | @@ -564,7 +570,10 @@ static int tc_aux_link_setup(struct tc_data *tc) | ||
1261 | value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2; | ||
1262 | tc_write(SYS_PLLPARAM, value); | ||
1263 | |||
1264 | - tc_write(DP_PHY_CTRL, BGREN | PWR_SW_EN | BIT(2) | PHY_A0_EN); | ||
1265 | + dp_phy_ctrl = BGREN | PWR_SW_EN | PHY_A0_EN; | ||
1266 | + if (tc->link.base.num_lanes == 2) | ||
1267 | + dp_phy_ctrl |= PHY_2LANE; | ||
1268 | + tc_write(DP_PHY_CTRL, dp_phy_ctrl); | ||
1269 | |||
1270 | /* | ||
1271 | * Initially PLLs are in bypass. Force PLL parameter update, | ||
1272 | @@ -719,7 +728,9 @@ static int tc_set_video_mode(struct tc_data *tc, struct drm_display_mode *mode) | ||
1273 | |||
1274 | tc_write(DP0_ACTIVEVAL, (mode->vdisplay << 16) | (mode->hdisplay)); | ||
1275 | |||
1276 | - tc_write(DP0_SYNCVAL, (vsync_len << 16) | (hsync_len << 0)); | ||
1277 | + tc_write(DP0_SYNCVAL, (vsync_len << 16) | (hsync_len << 0) | | ||
1278 | + ((mode->flags & DRM_MODE_FLAG_NHSYNC) ? SYNCVAL_HS_POL_ACTIVE_LOW : 0) | | ||
1279 | + ((mode->flags & DRM_MODE_FLAG_NVSYNC) ? SYNCVAL_VS_POL_ACTIVE_LOW : 0)); | ||
1280 | |||
1281 | tc_write(DPIPXLFMT, VS_POL_ACTIVE_LOW | HS_POL_ACTIVE_LOW | | ||
1282 | DE_POL_ACTIVE_HIGH | SUB_CFG_TYPE_CONFIG1 | DPI_BPP_RGB888); | ||
1283 | @@ -829,12 +840,11 @@ static int tc_main_link_setup(struct tc_data *tc) | ||
1284 | if (!tc->mode) | ||
1285 | return -EINVAL; | ||
1286 | |||
1287 | - /* from excel file - DP0_SrcCtrl */ | ||
1288 | - tc_write(DP0_SRCCTRL, DP0_SRCCTRL_SCRMBLDIS | DP0_SRCCTRL_EN810B | | ||
1289 | - DP0_SRCCTRL_LANESKEW | DP0_SRCCTRL_LANES_2 | | ||
1290 | - DP0_SRCCTRL_BW27 | DP0_SRCCTRL_AUTOCORRECT); | ||
1291 | - /* from excel file - DP1_SrcCtrl */ | ||
1292 | - tc_write(0x07a0, 0x00003083); | ||
1293 | + tc_write(DP0_SRCCTRL, tc_srcctrl(tc)); | ||
1294 | + /* SSCG and BW27 on DP1 must be set to the same as on DP0 */ | ||
1295 | + tc_write(DP1_SRCCTRL, | ||
1296 | + (tc->link.spread ? DP0_SRCCTRL_SSCG : 0) | | ||
1297 | + ((tc->link.base.rate != 162000) ? DP0_SRCCTRL_BW27 : 0)); | ||
1298 | |||
1299 | rate = clk_get_rate(tc->refclk); | ||
1300 | switch (rate) { | ||
1301 | @@ -855,8 +865,11 @@ static int tc_main_link_setup(struct tc_data *tc) | ||
1302 | } | ||
1303 | value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2; | ||
1304 | tc_write(SYS_PLLPARAM, value); | ||
1305 | + | ||
1306 | /* Setup Main Link */ | ||
1307 | - dp_phy_ctrl = BGREN | PWR_SW_EN | BIT(2) | PHY_A0_EN | PHY_M0_EN; | ||
1308 | + dp_phy_ctrl = BGREN | PWR_SW_EN | PHY_A0_EN | PHY_M0_EN; | ||
1309 | + if (tc->link.base.num_lanes == 2) | ||
1310 | + dp_phy_ctrl |= PHY_2LANE; | ||
1311 | tc_write(DP_PHY_CTRL, dp_phy_ctrl); | ||
1312 | msleep(100); | ||
1313 | |||
1314 | @@ -1105,10 +1118,20 @@ static bool tc_bridge_mode_fixup(struct drm_bridge *bridge, | ||
1315 | static enum drm_mode_status tc_connector_mode_valid(struct drm_connector *connector, | ||
1316 | struct drm_display_mode *mode) | ||
1317 | { | ||
1318 | + struct tc_data *tc = connector_to_tc(connector); | ||
1319 | + u32 req, avail; | ||
1320 | + u32 bits_per_pixel = 24; | ||
1321 | + | ||
1322 | /* DPI interface clock limitation: upto 154 MHz */ | ||
1323 | if (mode->clock > 154000) | ||
1324 | return MODE_CLOCK_HIGH; | ||
1325 | |||
1326 | + req = mode->clock * bits_per_pixel / 8; | ||
1327 | + avail = tc->link.base.num_lanes * tc->link.base.rate; | ||
1328 | + | ||
1329 | + if (req > avail) | ||
1330 | + return MODE_BAD; | ||
1331 | + | ||
1332 | return MODE_OK; | ||
1333 | } | ||
1334 | |||
1335 | @@ -1195,6 +1218,10 @@ static int tc_bridge_attach(struct drm_bridge *bridge) | ||
1336 | |||
1337 | drm_display_info_set_bus_formats(&tc->connector.display_info, | ||
1338 | &bus_format, 1); | ||
1339 | + tc->connector.display_info.bus_flags = | ||
1340 | + DRM_BUS_FLAG_DE_HIGH | | ||
1341 | + DRM_BUS_FLAG_PIXDATA_NEGEDGE | | ||
1342 | + DRM_BUS_FLAG_SYNC_NEGEDGE; | ||
1343 | drm_connector_attach_encoder(&tc->connector, tc->bridge.encoder); | ||
1344 | |||
1345 | return 0; | ||
1346 | diff --git a/drivers/gpu/drm/drm_lease.c b/drivers/gpu/drm/drm_lease.c | ||
1347 | index c61680ad962d..6e59789e3316 100644 | ||
1348 | --- a/drivers/gpu/drm/drm_lease.c | ||
1349 | +++ b/drivers/gpu/drm/drm_lease.c | ||
1350 | @@ -521,7 +521,8 @@ int drm_mode_create_lease_ioctl(struct drm_device *dev, | ||
1351 | |||
1352 | object_count = cl->object_count; | ||
1353 | |||
1354 | - object_ids = memdup_user(u64_to_user_ptr(cl->object_ids), object_count * sizeof(__u32)); | ||
1355 | + object_ids = memdup_user(u64_to_user_ptr(cl->object_ids), | ||
1356 | + array_size(object_count, sizeof(__u32))); | ||
1357 | if (IS_ERR(object_ids)) | ||
1358 | return PTR_ERR(object_ids); | ||
1359 | |||
1360 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c | ||
1361 | index 6ae9a6080cc8..296f9c0fe19b 100644 | ||
1362 | --- a/drivers/gpu/drm/i915/i915_gem.c | ||
1363 | +++ b/drivers/gpu/drm/i915/i915_gem.c | ||
1364 | @@ -1826,6 +1826,16 @@ i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data, | ||
1365 | return 0; | ||
1366 | } | ||
1367 | |||
1368 | +static inline bool | ||
1369 | +__vma_matches(struct vm_area_struct *vma, struct file *filp, | ||
1370 | + unsigned long addr, unsigned long size) | ||
1371 | +{ | ||
1372 | + if (vma->vm_file != filp) | ||
1373 | + return false; | ||
1374 | + | ||
1375 | + return vma->vm_start == addr && (vma->vm_end - vma->vm_start) == size; | ||
1376 | +} | ||
1377 | + | ||
1378 | /** | ||
1379 | * i915_gem_mmap_ioctl - Maps the contents of an object, returning the address | ||
1380 | * it is mapped to. | ||
1381 | @@ -1884,7 +1894,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, | ||
1382 | return -EINTR; | ||
1383 | } | ||
1384 | vma = find_vma(mm, addr); | ||
1385 | - if (vma) | ||
1386 | + if (vma && __vma_matches(vma, obj->base.filp, addr, args->size)) | ||
1387 | vma->vm_page_prot = | ||
1388 | pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); | ||
1389 | else | ||
1390 | diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h | ||
1391 | index db6fa1d0cbda..f35139b3ebc5 100644 | ||
1392 | --- a/drivers/gpu/drm/i915/intel_drv.h | ||
1393 | +++ b/drivers/gpu/drm/i915/intel_drv.h | ||
1394 | @@ -209,6 +209,16 @@ struct intel_fbdev { | ||
1395 | unsigned long vma_flags; | ||
1396 | async_cookie_t cookie; | ||
1397 | int preferred_bpp; | ||
1398 | + | ||
1399 | + /* Whether or not fbdev hpd processing is temporarily suspended */ | ||
1400 | + bool hpd_suspended : 1; | ||
1401 | + /* Set when a hotplug was received while HPD processing was | ||
1402 | + * suspended | ||
1403 | + */ | ||
1404 | + bool hpd_waiting : 1; | ||
1405 | + | ||
1406 | + /* Protects hpd_suspended */ | ||
1407 | + struct mutex hpd_lock; | ||
1408 | }; | ||
1409 | |||
1410 | struct intel_encoder { | ||
1411 | diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c | ||
1412 | index f99332972b7a..9e2e998b198f 100644 | ||
1413 | --- a/drivers/gpu/drm/i915/intel_fbdev.c | ||
1414 | +++ b/drivers/gpu/drm/i915/intel_fbdev.c | ||
1415 | @@ -679,6 +679,7 @@ int intel_fbdev_init(struct drm_device *dev) | ||
1416 | if (ifbdev == NULL) | ||
1417 | return -ENOMEM; | ||
1418 | |||
1419 | + mutex_init(&ifbdev->hpd_lock); | ||
1420 | drm_fb_helper_prepare(dev, &ifbdev->helper, &intel_fb_helper_funcs); | ||
1421 | |||
1422 | if (!intel_fbdev_init_bios(dev, ifbdev)) | ||
1423 | @@ -752,6 +753,26 @@ void intel_fbdev_fini(struct drm_i915_private *dev_priv) | ||
1424 | intel_fbdev_destroy(ifbdev); | ||
1425 | } | ||
1426 | |||
1427 | +/* Suspends/resumes fbdev processing of incoming HPD events. When resuming HPD | ||
1428 | + * processing, fbdev will perform a full connector reprobe if a hotplug event | ||
1429 | + * was received while HPD was suspended. | ||
1430 | + */ | ||
1431 | +static void intel_fbdev_hpd_set_suspend(struct intel_fbdev *ifbdev, int state) | ||
1432 | +{ | ||
1433 | + bool send_hpd = false; | ||
1434 | + | ||
1435 | + mutex_lock(&ifbdev->hpd_lock); | ||
1436 | + ifbdev->hpd_suspended = state == FBINFO_STATE_SUSPENDED; | ||
1437 | + send_hpd = !ifbdev->hpd_suspended && ifbdev->hpd_waiting; | ||
1438 | + ifbdev->hpd_waiting = false; | ||
1439 | + mutex_unlock(&ifbdev->hpd_lock); | ||
1440 | + | ||
1441 | + if (send_hpd) { | ||
1442 | + DRM_DEBUG_KMS("Handling delayed fbcon HPD event\n"); | ||
1443 | + drm_fb_helper_hotplug_event(&ifbdev->helper); | ||
1444 | + } | ||
1445 | +} | ||
1446 | + | ||
1447 | void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous) | ||
1448 | { | ||
1449 | struct drm_i915_private *dev_priv = to_i915(dev); | ||
1450 | @@ -773,6 +794,7 @@ void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous | ||
1451 | */ | ||
1452 | if (state != FBINFO_STATE_RUNNING) | ||
1453 | flush_work(&dev_priv->fbdev_suspend_work); | ||
1454 | + | ||
1455 | console_lock(); | ||
1456 | } else { | ||
1457 | /* | ||
1458 | @@ -800,17 +822,26 @@ void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous | ||
1459 | |||
1460 | drm_fb_helper_set_suspend(&ifbdev->helper, state); | ||
1461 | console_unlock(); | ||
1462 | + | ||
1463 | + intel_fbdev_hpd_set_suspend(ifbdev, state); | ||
1464 | } | ||
1465 | |||
1466 | void intel_fbdev_output_poll_changed(struct drm_device *dev) | ||
1467 | { | ||
1468 | struct intel_fbdev *ifbdev = to_i915(dev)->fbdev; | ||
1469 | + bool send_hpd; | ||
1470 | |||
1471 | if (!ifbdev) | ||
1472 | return; | ||
1473 | |||
1474 | intel_fbdev_sync(ifbdev); | ||
1475 | - if (ifbdev->vma || ifbdev->helper.deferred_setup) | ||
1476 | + | ||
1477 | + mutex_lock(&ifbdev->hpd_lock); | ||
1478 | + send_hpd = !ifbdev->hpd_suspended; | ||
1479 | + ifbdev->hpd_waiting = true; | ||
1480 | + mutex_unlock(&ifbdev->hpd_lock); | ||
1481 | + | ||
1482 | + if (send_hpd && (ifbdev->vma || ifbdev->helper.deferred_setup)) | ||
1483 | drm_fb_helper_hotplug_event(&ifbdev->helper); | ||
1484 | } | ||
1485 | |||
1486 | diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/falcon.c b/drivers/gpu/drm/nouveau/nvkm/engine/falcon.c | ||
1487 | index 816ccaedfc73..8675613e142b 100644 | ||
1488 | --- a/drivers/gpu/drm/nouveau/nvkm/engine/falcon.c | ||
1489 | +++ b/drivers/gpu/drm/nouveau/nvkm/engine/falcon.c | ||
1490 | @@ -22,6 +22,7 @@ | ||
1491 | #include <engine/falcon.h> | ||
1492 | |||
1493 | #include <core/gpuobj.h> | ||
1494 | +#include <subdev/mc.h> | ||
1495 | #include <subdev/timer.h> | ||
1496 | #include <engine/fifo.h> | ||
1497 | |||
1498 | @@ -107,8 +108,10 @@ nvkm_falcon_fini(struct nvkm_engine *engine, bool suspend) | ||
1499 | } | ||
1500 | } | ||
1501 | |||
1502 | - nvkm_mask(device, base + 0x048, 0x00000003, 0x00000000); | ||
1503 | - nvkm_wr32(device, base + 0x014, 0xffffffff); | ||
1504 | + if (nvkm_mc_enabled(device, engine->subdev.index)) { | ||
1505 | + nvkm_mask(device, base + 0x048, 0x00000003, 0x00000000); | ||
1506 | + nvkm_wr32(device, base + 0x014, 0xffffffff); | ||
1507 | + } | ||
1508 | return 0; | ||
1509 | } | ||
1510 | |||
1511 | diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c | ||
1512 | index 3695cde669f8..07914e36939e 100644 | ||
1513 | --- a/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c | ||
1514 | +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c | ||
1515 | @@ -132,11 +132,12 @@ nvkm_therm_update(struct nvkm_therm *therm, int mode) | ||
1516 | duty = nvkm_therm_update_linear(therm); | ||
1517 | break; | ||
1518 | case NVBIOS_THERM_FAN_OTHER: | ||
1519 | - if (therm->cstate) | ||
1520 | + if (therm->cstate) { | ||
1521 | duty = therm->cstate; | ||
1522 | - else | ||
1523 | + poll = false; | ||
1524 | + } else { | ||
1525 | duty = nvkm_therm_update_linear_fallback(therm); | ||
1526 | - poll = false; | ||
1527 | + } | ||
1528 | break; | ||
1529 | } | ||
1530 | immd = false; | ||
1531 | diff --git a/drivers/gpu/drm/scheduler/sched_entity.c b/drivers/gpu/drm/scheduler/sched_entity.c | ||
1532 | index 3e22a54a99c2..2c02f5b03db8 100644 | ||
1533 | --- a/drivers/gpu/drm/scheduler/sched_entity.c | ||
1534 | +++ b/drivers/gpu/drm/scheduler/sched_entity.c | ||
1535 | @@ -434,13 +434,10 @@ struct drm_sched_job *drm_sched_entity_pop_job(struct drm_sched_entity *entity) | ||
1536 | |||
1537 | while ((entity->dependency = | ||
1538 | sched->ops->dependency(sched_job, entity))) { | ||
1539 | + trace_drm_sched_job_wait_dep(sched_job, entity->dependency); | ||
1540 | |||
1541 | - if (drm_sched_entity_add_dependency_cb(entity)) { | ||
1542 | - | ||
1543 | - trace_drm_sched_job_wait_dep(sched_job, | ||
1544 | - entity->dependency); | ||
1545 | + if (drm_sched_entity_add_dependency_cb(entity)) | ||
1546 | return NULL; | ||
1547 | - } | ||
1548 | } | ||
1549 | |||
1550 | /* skip jobs from entity that marked guilty */ | ||
1551 | diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c | ||
1552 | index 9d9e8146db90..d7b409a3c0f8 100644 | ||
1553 | --- a/drivers/gpu/drm/vkms/vkms_crc.c | ||
1554 | +++ b/drivers/gpu/drm/vkms/vkms_crc.c | ||
1555 | @@ -1,4 +1,5 @@ | ||
1556 | -// SPDX-License-Identifier: GPL-2.0 | ||
1557 | +// SPDX-License-Identifier: GPL-2.0+ | ||
1558 | + | ||
1559 | #include "vkms_drv.h" | ||
1560 | #include <linux/crc32.h> | ||
1561 | #include <drm/drm_atomic.h> | ||
1562 | diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c | ||
1563 | index 177bbcb38306..eb56ee893761 100644 | ||
1564 | --- a/drivers/gpu/drm/vkms/vkms_crtc.c | ||
1565 | +++ b/drivers/gpu/drm/vkms/vkms_crtc.c | ||
1566 | @@ -1,10 +1,4 @@ | ||
1567 | -// SPDX-License-Identifier: GPL-2.0 | ||
1568 | -/* | ||
1569 | - * This program is free software; you can redistribute it and/or modify | ||
1570 | - * it under the terms of the GNU General Public License as published by | ||
1571 | - * the Free Software Foundation; either version 2 of the License, or | ||
1572 | - * (at your option) any later version. | ||
1573 | - */ | ||
1574 | +// SPDX-License-Identifier: GPL-2.0+ | ||
1575 | |||
1576 | #include "vkms_drv.h" | ||
1577 | #include <drm/drm_atomic_helper.h> | ||
1578 | diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c | ||
1579 | index 07cfde1b4132..8048b2486b0e 100644 | ||
1580 | --- a/drivers/gpu/drm/vkms/vkms_drv.c | ||
1581 | +++ b/drivers/gpu/drm/vkms/vkms_drv.c | ||
1582 | @@ -1,9 +1,4 @@ | ||
1583 | -/* | ||
1584 | - * This program is free software; you can redistribute it and/or modify | ||
1585 | - * it under the terms of the GNU General Public License as published by | ||
1586 | - * the Free Software Foundation; either version 2 of the License, or | ||
1587 | - * (at your option) any later version. | ||
1588 | - */ | ||
1589 | +// SPDX-License-Identifier: GPL-2.0+ | ||
1590 | |||
1591 | /** | ||
1592 | * DOC: vkms (Virtual Kernel Modesetting) | ||
1593 | diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h | ||
1594 | index 1c93990693e3..5adbc6fca41b 100644 | ||
1595 | --- a/drivers/gpu/drm/vkms/vkms_drv.h | ||
1596 | +++ b/drivers/gpu/drm/vkms/vkms_drv.h | ||
1597 | @@ -1,3 +1,5 @@ | ||
1598 | +/* SPDX-License-Identifier: GPL-2.0+ */ | ||
1599 | + | ||
1600 | #ifndef _VKMS_DRV_H_ | ||
1601 | #define _VKMS_DRV_H_ | ||
1602 | |||
1603 | diff --git a/drivers/gpu/drm/vkms/vkms_gem.c b/drivers/gpu/drm/vkms/vkms_gem.c | ||
1604 | index d04e988b4cbe..8310b96d4a9c 100644 | ||
1605 | --- a/drivers/gpu/drm/vkms/vkms_gem.c | ||
1606 | +++ b/drivers/gpu/drm/vkms/vkms_gem.c | ||
1607 | @@ -1,10 +1,4 @@ | ||
1608 | -// SPDX-License-Identifier: GPL-2.0 | ||
1609 | -/* | ||
1610 | - * This program is free software; you can redistribute it and/or modify | ||
1611 | - * it under the terms of the GNU General Public License as published by | ||
1612 | - * the Free Software Foundation; either version 2 of the License, or | ||
1613 | - * (at your option) any later version. | ||
1614 | - */ | ||
1615 | +// SPDX-License-Identifier: GPL-2.0+ | ||
1616 | |||
1617 | #include <linux/shmem_fs.h> | ||
1618 | |||
1619 | diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms_output.c | ||
1620 | index 271a0eb9042c..4173e4f48334 100644 | ||
1621 | --- a/drivers/gpu/drm/vkms/vkms_output.c | ||
1622 | +++ b/drivers/gpu/drm/vkms/vkms_output.c | ||
1623 | @@ -1,10 +1,4 @@ | ||
1624 | -// SPDX-License-Identifier: GPL-2.0 | ||
1625 | -/* | ||
1626 | - * This program is free software; you can redistribute it and/or modify | ||
1627 | - * it under the terms of the GNU General Public License as published by | ||
1628 | - * the Free Software Foundation; either version 2 of the License, or | ||
1629 | - * (at your option) any later version. | ||
1630 | - */ | ||
1631 | +// SPDX-License-Identifier: GPL-2.0+ | ||
1632 | |||
1633 | #include "vkms_drv.h" | ||
1634 | #include <drm/drm_crtc_helper.h> | ||
1635 | diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c | ||
1636 | index e3bcea4b4891..8ffc1dad6485 100644 | ||
1637 | --- a/drivers/gpu/drm/vkms/vkms_plane.c | ||
1638 | +++ b/drivers/gpu/drm/vkms/vkms_plane.c | ||
1639 | @@ -1,10 +1,4 @@ | ||
1640 | -// SPDX-License-Identifier: GPL-2.0 | ||
1641 | -/* | ||
1642 | - * This program is free software; you can redistribute it and/or modify | ||
1643 | - * it under the terms of the GNU General Public License as published by | ||
1644 | - * the Free Software Foundation; either version 2 of the License, or | ||
1645 | - * (at your option) any later version. | ||
1646 | - */ | ||
1647 | +// SPDX-License-Identifier: GPL-2.0+ | ||
1648 | |||
1649 | #include "vkms_drv.h" | ||
1650 | #include <drm/drm_plane_helper.h> | ||
1651 | diff --git a/drivers/input/misc/bma150.c b/drivers/input/misc/bma150.c | ||
1652 | index 1efcfdf9f8a8..dd9dd4e40827 100644 | ||
1653 | --- a/drivers/input/misc/bma150.c | ||
1654 | +++ b/drivers/input/misc/bma150.c | ||
1655 | @@ -481,13 +481,14 @@ static int bma150_register_input_device(struct bma150_data *bma150) | ||
1656 | idev->close = bma150_irq_close; | ||
1657 | input_set_drvdata(idev, bma150); | ||
1658 | |||
1659 | + bma150->input = idev; | ||
1660 | + | ||
1661 | error = input_register_device(idev); | ||
1662 | if (error) { | ||
1663 | input_free_device(idev); | ||
1664 | return error; | ||
1665 | } | ||
1666 | |||
1667 | - bma150->input = idev; | ||
1668 | return 0; | ||
1669 | } | ||
1670 | |||
1671 | @@ -510,15 +511,15 @@ static int bma150_register_polled_device(struct bma150_data *bma150) | ||
1672 | |||
1673 | bma150_init_input_device(bma150, ipoll_dev->input); | ||
1674 | |||
1675 | + bma150->input_polled = ipoll_dev; | ||
1676 | + bma150->input = ipoll_dev->input; | ||
1677 | + | ||
1678 | error = input_register_polled_device(ipoll_dev); | ||
1679 | if (error) { | ||
1680 | input_free_polled_device(ipoll_dev); | ||
1681 | return error; | ||
1682 | } | ||
1683 | |||
1684 | - bma150->input_polled = ipoll_dev; | ||
1685 | - bma150->input = ipoll_dev->input; | ||
1686 | - | ||
1687 | return 0; | ||
1688 | } | ||
1689 | |||
1690 | diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c | ||
1691 | index f322a1768fbb..225ae6980182 100644 | ||
1692 | --- a/drivers/input/mouse/elan_i2c_core.c | ||
1693 | +++ b/drivers/input/mouse/elan_i2c_core.c | ||
1694 | @@ -1336,7 +1336,6 @@ MODULE_DEVICE_TABLE(i2c, elan_id); | ||
1695 | static const struct acpi_device_id elan_acpi_id[] = { | ||
1696 | { "ELAN0000", 0 }, | ||
1697 | { "ELAN0100", 0 }, | ||
1698 | - { "ELAN0501", 0 }, | ||
1699 | { "ELAN0600", 0 }, | ||
1700 | { "ELAN0602", 0 }, | ||
1701 | { "ELAN0605", 0 }, | ||
1702 | @@ -1346,6 +1345,7 @@ static const struct acpi_device_id elan_acpi_id[] = { | ||
1703 | { "ELAN060C", 0 }, | ||
1704 | { "ELAN0611", 0 }, | ||
1705 | { "ELAN0612", 0 }, | ||
1706 | + { "ELAN0617", 0 }, | ||
1707 | { "ELAN0618", 0 }, | ||
1708 | { "ELAN061C", 0 }, | ||
1709 | { "ELAN061D", 0 }, | ||
1710 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c | ||
1711 | index 9fe075c137dc..a7f8b1614559 100644 | ||
1712 | --- a/drivers/input/mouse/elantech.c | ||
1713 | +++ b/drivers/input/mouse/elantech.c | ||
1714 | @@ -1119,6 +1119,8 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse, | ||
1715 | * Asus UX31 0x361f00 20, 15, 0e clickpad | ||
1716 | * Asus UX32VD 0x361f02 00, 15, 0e clickpad | ||
1717 | * Avatar AVIU-145A2 0x361f00 ? clickpad | ||
1718 | + * Fujitsu CELSIUS H760 0x570f02 40, 14, 0c 3 hw buttons (**) | ||
1719 | + * Fujitsu CELSIUS H780 0x5d0f02 41, 16, 0d 3 hw buttons (**) | ||
1720 | * Fujitsu LIFEBOOK E544 0x470f00 d0, 12, 09 2 hw buttons | ||
1721 | * Fujitsu LIFEBOOK E546 0x470f00 50, 12, 09 2 hw buttons | ||
1722 | * Fujitsu LIFEBOOK E547 0x470f00 50, 12, 09 2 hw buttons | ||
1723 | @@ -1171,6 +1173,13 @@ static const struct dmi_system_id elantech_dmi_has_middle_button[] = { | ||
1724 | DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H760"), | ||
1725 | }, | ||
1726 | }, | ||
1727 | + { | ||
1728 | + /* Fujitsu H780 also has a middle button */ | ||
1729 | + .matches = { | ||
1730 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
1731 | + DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H780"), | ||
1732 | + }, | ||
1733 | + }, | ||
1734 | #endif | ||
1735 | { } | ||
1736 | }; | ||
1737 | diff --git a/drivers/irqchip/irq-csky-apb-intc.c b/drivers/irqchip/irq-csky-apb-intc.c | ||
1738 | index 2543baba8b1f..5a2ec43b7ddd 100644 | ||
1739 | --- a/drivers/irqchip/irq-csky-apb-intc.c | ||
1740 | +++ b/drivers/irqchip/irq-csky-apb-intc.c | ||
1741 | @@ -95,7 +95,7 @@ static inline void setup_irq_channel(u32 magic, void __iomem *reg_addr) | ||
1742 | |||
1743 | /* Setup 64 channel slots */ | ||
1744 | for (i = 0; i < INTC_IRQS; i += 4) | ||
1745 | - writel_relaxed(build_channel_val(i, magic), reg_addr + i); | ||
1746 | + writel(build_channel_val(i, magic), reg_addr + i); | ||
1747 | } | ||
1748 | |||
1749 | static int __init | ||
1750 | @@ -135,16 +135,10 @@ ck_intc_init_comm(struct device_node *node, struct device_node *parent) | ||
1751 | static inline bool handle_irq_perbit(struct pt_regs *regs, u32 hwirq, | ||
1752 | u32 irq_base) | ||
1753 | { | ||
1754 | - u32 irq; | ||
1755 | - | ||
1756 | if (hwirq == 0) | ||
1757 | return 0; | ||
1758 | |||
1759 | - while (hwirq) { | ||
1760 | - irq = __ffs(hwirq); | ||
1761 | - hwirq &= ~BIT(irq); | ||
1762 | - handle_domain_irq(root_domain, irq_base + irq, regs); | ||
1763 | - } | ||
1764 | + handle_domain_irq(root_domain, irq_base + __fls(hwirq), regs); | ||
1765 | |||
1766 | return 1; | ||
1767 | } | ||
1768 | @@ -154,12 +148,16 @@ static void gx_irq_handler(struct pt_regs *regs) | ||
1769 | { | ||
1770 | bool ret; | ||
1771 | |||
1772 | - do { | ||
1773 | - ret = handle_irq_perbit(regs, | ||
1774 | - readl_relaxed(reg_base + GX_INTC_PEN31_00), 0); | ||
1775 | - ret |= handle_irq_perbit(regs, | ||
1776 | - readl_relaxed(reg_base + GX_INTC_PEN63_32), 32); | ||
1777 | - } while (ret); | ||
1778 | +retry: | ||
1779 | + ret = handle_irq_perbit(regs, | ||
1780 | + readl(reg_base + GX_INTC_PEN63_32), 32); | ||
1781 | + if (ret) | ||
1782 | + goto retry; | ||
1783 | + | ||
1784 | + ret = handle_irq_perbit(regs, | ||
1785 | + readl(reg_base + GX_INTC_PEN31_00), 0); | ||
1786 | + if (ret) | ||
1787 | + goto retry; | ||
1788 | } | ||
1789 | |||
1790 | static int __init | ||
1791 | @@ -174,14 +172,14 @@ gx_intc_init(struct device_node *node, struct device_node *parent) | ||
1792 | /* | ||
1793 | * Initial enable reg to disable all interrupts | ||
1794 | */ | ||
1795 | - writel_relaxed(0x0, reg_base + GX_INTC_NEN31_00); | ||
1796 | - writel_relaxed(0x0, reg_base + GX_INTC_NEN63_32); | ||
1797 | + writel(0x0, reg_base + GX_INTC_NEN31_00); | ||
1798 | + writel(0x0, reg_base + GX_INTC_NEN63_32); | ||
1799 | |||
1800 | /* | ||
1801 | * Initial mask reg with all unmasked, because we only use enalbe reg | ||
1802 | */ | ||
1803 | - writel_relaxed(0x0, reg_base + GX_INTC_NMASK31_00); | ||
1804 | - writel_relaxed(0x0, reg_base + GX_INTC_NMASK63_32); | ||
1805 | + writel(0x0, reg_base + GX_INTC_NMASK31_00); | ||
1806 | + writel(0x0, reg_base + GX_INTC_NMASK63_32); | ||
1807 | |||
1808 | setup_irq_channel(0x03020100, reg_base + GX_INTC_SOURCE); | ||
1809 | |||
1810 | @@ -204,20 +202,29 @@ static void ck_irq_handler(struct pt_regs *regs) | ||
1811 | void __iomem *reg_pen_lo = reg_base + CK_INTC_PEN31_00; | ||
1812 | void __iomem *reg_pen_hi = reg_base + CK_INTC_PEN63_32; | ||
1813 | |||
1814 | - do { | ||
1815 | - /* handle 0 - 31 irqs */ | ||
1816 | - ret = handle_irq_perbit(regs, readl_relaxed(reg_pen_lo), 0); | ||
1817 | - ret |= handle_irq_perbit(regs, readl_relaxed(reg_pen_hi), 32); | ||
1818 | +retry: | ||
1819 | + /* handle 0 - 63 irqs */ | ||
1820 | + ret = handle_irq_perbit(regs, readl(reg_pen_hi), 32); | ||
1821 | + if (ret) | ||
1822 | + goto retry; | ||
1823 | |||
1824 | - if (nr_irq == INTC_IRQS) | ||
1825 | - continue; | ||
1826 | + ret = handle_irq_perbit(regs, readl(reg_pen_lo), 0); | ||
1827 | + if (ret) | ||
1828 | + goto retry; | ||
1829 | + | ||
1830 | + if (nr_irq == INTC_IRQS) | ||
1831 | + return; | ||
1832 | |||
1833 | - /* handle 64 - 127 irqs */ | ||
1834 | - ret |= handle_irq_perbit(regs, | ||
1835 | - readl_relaxed(reg_pen_lo + CK_INTC_DUAL_BASE), 64); | ||
1836 | - ret |= handle_irq_perbit(regs, | ||
1837 | - readl_relaxed(reg_pen_hi + CK_INTC_DUAL_BASE), 96); | ||
1838 | - } while (ret); | ||
1839 | + /* handle 64 - 127 irqs */ | ||
1840 | + ret = handle_irq_perbit(regs, | ||
1841 | + readl(reg_pen_hi + CK_INTC_DUAL_BASE), 96); | ||
1842 | + if (ret) | ||
1843 | + goto retry; | ||
1844 | + | ||
1845 | + ret = handle_irq_perbit(regs, | ||
1846 | + readl(reg_pen_lo + CK_INTC_DUAL_BASE), 64); | ||
1847 | + if (ret) | ||
1848 | + goto retry; | ||
1849 | } | ||
1850 | |||
1851 | static int __init | ||
1852 | @@ -230,11 +237,11 @@ ck_intc_init(struct device_node *node, struct device_node *parent) | ||
1853 | return ret; | ||
1854 | |||
1855 | /* Initial enable reg to disable all interrupts */ | ||
1856 | - writel_relaxed(0, reg_base + CK_INTC_NEN31_00); | ||
1857 | - writel_relaxed(0, reg_base + CK_INTC_NEN63_32); | ||
1858 | + writel(0, reg_base + CK_INTC_NEN31_00); | ||
1859 | + writel(0, reg_base + CK_INTC_NEN63_32); | ||
1860 | |||
1861 | /* Enable irq intc */ | ||
1862 | - writel_relaxed(BIT(31), reg_base + CK_INTC_ICR); | ||
1863 | + writel(BIT(31), reg_base + CK_INTC_ICR); | ||
1864 | |||
1865 | ck_set_gc(node, reg_base, CK_INTC_NEN31_00, 0); | ||
1866 | ck_set_gc(node, reg_base, CK_INTC_NEN63_32, 32); | ||
1867 | @@ -260,8 +267,8 @@ ck_dual_intc_init(struct device_node *node, struct device_node *parent) | ||
1868 | return ret; | ||
1869 | |||
1870 | /* Initial enable reg to disable all interrupts */ | ||
1871 | - writel_relaxed(0, reg_base + CK_INTC_NEN31_00 + CK_INTC_DUAL_BASE); | ||
1872 | - writel_relaxed(0, reg_base + CK_INTC_NEN63_32 + CK_INTC_DUAL_BASE); | ||
1873 | + writel(0, reg_base + CK_INTC_NEN31_00 + CK_INTC_DUAL_BASE); | ||
1874 | + writel(0, reg_base + CK_INTC_NEN63_32 + CK_INTC_DUAL_BASE); | ||
1875 | |||
1876 | ck_set_gc(node, reg_base + CK_INTC_DUAL_BASE, CK_INTC_NEN31_00, 64); | ||
1877 | ck_set_gc(node, reg_base + CK_INTC_DUAL_BASE, CK_INTC_NEN63_32, 96); | ||
1878 | diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c | ||
1879 | index 1ef828575fae..9fc5423f83c1 100644 | ||
1880 | --- a/drivers/md/dm-crypt.c | ||
1881 | +++ b/drivers/md/dm-crypt.c | ||
1882 | @@ -932,7 +932,7 @@ static int dm_crypt_integrity_io_alloc(struct dm_crypt_io *io, struct bio *bio) | ||
1883 | if (IS_ERR(bip)) | ||
1884 | return PTR_ERR(bip); | ||
1885 | |||
1886 | - tag_len = io->cc->on_disk_tag_size * bio_sectors(bio); | ||
1887 | + tag_len = io->cc->on_disk_tag_size * (bio_sectors(bio) >> io->cc->sector_shift); | ||
1888 | |||
1889 | bip->bip_iter.bi_size = tag_len; | ||
1890 | bip->bip_iter.bi_sector = io->cc->start + io->sector; | ||
1891 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c | ||
1892 | index ca8af21bf644..e83b63608262 100644 | ||
1893 | --- a/drivers/md/dm-thin.c | ||
1894 | +++ b/drivers/md/dm-thin.c | ||
1895 | @@ -257,6 +257,7 @@ struct pool { | ||
1896 | |||
1897 | spinlock_t lock; | ||
1898 | struct bio_list deferred_flush_bios; | ||
1899 | + struct bio_list deferred_flush_completions; | ||
1900 | struct list_head prepared_mappings; | ||
1901 | struct list_head prepared_discards; | ||
1902 | struct list_head prepared_discards_pt2; | ||
1903 | @@ -956,6 +957,39 @@ static void process_prepared_mapping_fail(struct dm_thin_new_mapping *m) | ||
1904 | mempool_free(m, &m->tc->pool->mapping_pool); | ||
1905 | } | ||
1906 | |||
1907 | +static void complete_overwrite_bio(struct thin_c *tc, struct bio *bio) | ||
1908 | +{ | ||
1909 | + struct pool *pool = tc->pool; | ||
1910 | + unsigned long flags; | ||
1911 | + | ||
1912 | + /* | ||
1913 | + * If the bio has the REQ_FUA flag set we must commit the metadata | ||
1914 | + * before signaling its completion. | ||
1915 | + */ | ||
1916 | + if (!bio_triggers_commit(tc, bio)) { | ||
1917 | + bio_endio(bio); | ||
1918 | + return; | ||
1919 | + } | ||
1920 | + | ||
1921 | + /* | ||
1922 | + * Complete bio with an error if earlier I/O caused changes to the | ||
1923 | + * metadata that can't be committed, e.g, due to I/O errors on the | ||
1924 | + * metadata device. | ||
1925 | + */ | ||
1926 | + if (dm_thin_aborted_changes(tc->td)) { | ||
1927 | + bio_io_error(bio); | ||
1928 | + return; | ||
1929 | + } | ||
1930 | + | ||
1931 | + /* | ||
1932 | + * Batch together any bios that trigger commits and then issue a | ||
1933 | + * single commit for them in process_deferred_bios(). | ||
1934 | + */ | ||
1935 | + spin_lock_irqsave(&pool->lock, flags); | ||
1936 | + bio_list_add(&pool->deferred_flush_completions, bio); | ||
1937 | + spin_unlock_irqrestore(&pool->lock, flags); | ||
1938 | +} | ||
1939 | + | ||
1940 | static void process_prepared_mapping(struct dm_thin_new_mapping *m) | ||
1941 | { | ||
1942 | struct thin_c *tc = m->tc; | ||
1943 | @@ -988,7 +1022,7 @@ static void process_prepared_mapping(struct dm_thin_new_mapping *m) | ||
1944 | */ | ||
1945 | if (bio) { | ||
1946 | inc_remap_and_issue_cell(tc, m->cell, m->data_block); | ||
1947 | - bio_endio(bio); | ||
1948 | + complete_overwrite_bio(tc, bio); | ||
1949 | } else { | ||
1950 | inc_all_io_entry(tc->pool, m->cell->holder); | ||
1951 | remap_and_issue(tc, m->cell->holder, m->data_block); | ||
1952 | @@ -2317,7 +2351,7 @@ static void process_deferred_bios(struct pool *pool) | ||
1953 | { | ||
1954 | unsigned long flags; | ||
1955 | struct bio *bio; | ||
1956 | - struct bio_list bios; | ||
1957 | + struct bio_list bios, bio_completions; | ||
1958 | struct thin_c *tc; | ||
1959 | |||
1960 | tc = get_first_thin(pool); | ||
1961 | @@ -2328,26 +2362,36 @@ static void process_deferred_bios(struct pool *pool) | ||
1962 | } | ||
1963 | |||
1964 | /* | ||
1965 | - * If there are any deferred flush bios, we must commit | ||
1966 | - * the metadata before issuing them. | ||
1967 | + * If there are any deferred flush bios, we must commit the metadata | ||
1968 | + * before issuing them or signaling their completion. | ||
1969 | */ | ||
1970 | bio_list_init(&bios); | ||
1971 | + bio_list_init(&bio_completions); | ||
1972 | + | ||
1973 | spin_lock_irqsave(&pool->lock, flags); | ||
1974 | bio_list_merge(&bios, &pool->deferred_flush_bios); | ||
1975 | bio_list_init(&pool->deferred_flush_bios); | ||
1976 | + | ||
1977 | + bio_list_merge(&bio_completions, &pool->deferred_flush_completions); | ||
1978 | + bio_list_init(&pool->deferred_flush_completions); | ||
1979 | spin_unlock_irqrestore(&pool->lock, flags); | ||
1980 | |||
1981 | - if (bio_list_empty(&bios) && | ||
1982 | + if (bio_list_empty(&bios) && bio_list_empty(&bio_completions) && | ||
1983 | !(dm_pool_changed_this_transaction(pool->pmd) && need_commit_due_to_time(pool))) | ||
1984 | return; | ||
1985 | |||
1986 | if (commit(pool)) { | ||
1987 | + bio_list_merge(&bios, &bio_completions); | ||
1988 | + | ||
1989 | while ((bio = bio_list_pop(&bios))) | ||
1990 | bio_io_error(bio); | ||
1991 | return; | ||
1992 | } | ||
1993 | pool->last_commit_jiffies = jiffies; | ||
1994 | |||
1995 | + while ((bio = bio_list_pop(&bio_completions))) | ||
1996 | + bio_endio(bio); | ||
1997 | + | ||
1998 | while ((bio = bio_list_pop(&bios))) | ||
1999 | generic_make_request(bio); | ||
2000 | } | ||
2001 | @@ -2954,6 +2998,7 @@ static struct pool *pool_create(struct mapped_device *pool_md, | ||
2002 | INIT_DELAYED_WORK(&pool->no_space_timeout, do_no_space_timeout); | ||
2003 | spin_lock_init(&pool->lock); | ||
2004 | bio_list_init(&pool->deferred_flush_bios); | ||
2005 | + bio_list_init(&pool->deferred_flush_completions); | ||
2006 | INIT_LIST_HEAD(&pool->prepared_mappings); | ||
2007 | INIT_LIST_HEAD(&pool->prepared_discards); | ||
2008 | INIT_LIST_HEAD(&pool->prepared_discards_pt2); | ||
2009 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c | ||
2010 | index 1d54109071cc..fa47249fa3e4 100644 | ||
2011 | --- a/drivers/md/raid1.c | ||
2012 | +++ b/drivers/md/raid1.c | ||
2013 | @@ -1863,6 +1863,20 @@ static void end_sync_read(struct bio *bio) | ||
2014 | reschedule_retry(r1_bio); | ||
2015 | } | ||
2016 | |||
2017 | +static void abort_sync_write(struct mddev *mddev, struct r1bio *r1_bio) | ||
2018 | +{ | ||
2019 | + sector_t sync_blocks = 0; | ||
2020 | + sector_t s = r1_bio->sector; | ||
2021 | + long sectors_to_go = r1_bio->sectors; | ||
2022 | + | ||
2023 | + /* make sure these bits don't get cleared. */ | ||
2024 | + do { | ||
2025 | + md_bitmap_end_sync(mddev->bitmap, s, &sync_blocks, 1); | ||
2026 | + s += sync_blocks; | ||
2027 | + sectors_to_go -= sync_blocks; | ||
2028 | + } while (sectors_to_go > 0); | ||
2029 | +} | ||
2030 | + | ||
2031 | static void end_sync_write(struct bio *bio) | ||
2032 | { | ||
2033 | int uptodate = !bio->bi_status; | ||
2034 | @@ -1874,15 +1888,7 @@ static void end_sync_write(struct bio *bio) | ||
2035 | struct md_rdev *rdev = conf->mirrors[find_bio_disk(r1_bio, bio)].rdev; | ||
2036 | |||
2037 | if (!uptodate) { | ||
2038 | - sector_t sync_blocks = 0; | ||
2039 | - sector_t s = r1_bio->sector; | ||
2040 | - long sectors_to_go = r1_bio->sectors; | ||
2041 | - /* make sure these bits doesn't get cleared. */ | ||
2042 | - do { | ||
2043 | - md_bitmap_end_sync(mddev->bitmap, s, &sync_blocks, 1); | ||
2044 | - s += sync_blocks; | ||
2045 | - sectors_to_go -= sync_blocks; | ||
2046 | - } while (sectors_to_go > 0); | ||
2047 | + abort_sync_write(mddev, r1_bio); | ||
2048 | set_bit(WriteErrorSeen, &rdev->flags); | ||
2049 | if (!test_and_set_bit(WantReplacement, &rdev->flags)) | ||
2050 | set_bit(MD_RECOVERY_NEEDED, & | ||
2051 | @@ -2172,8 +2178,10 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio) | ||
2052 | (i == r1_bio->read_disk || | ||
2053 | !test_bit(MD_RECOVERY_SYNC, &mddev->recovery)))) | ||
2054 | continue; | ||
2055 | - if (test_bit(Faulty, &conf->mirrors[i].rdev->flags)) | ||
2056 | + if (test_bit(Faulty, &conf->mirrors[i].rdev->flags)) { | ||
2057 | + abort_sync_write(mddev, r1_bio); | ||
2058 | continue; | ||
2059 | + } | ||
2060 | |||
2061 | bio_set_op_attrs(wbio, REQ_OP_WRITE, 0); | ||
2062 | if (test_bit(FailFast, &conf->mirrors[i].rdev->flags)) | ||
2063 | diff --git a/drivers/misc/eeprom/Kconfig b/drivers/misc/eeprom/Kconfig | ||
2064 | index fe7a1d27a017..a846faefa210 100644 | ||
2065 | --- a/drivers/misc/eeprom/Kconfig | ||
2066 | +++ b/drivers/misc/eeprom/Kconfig | ||
2067 | @@ -13,7 +13,7 @@ config EEPROM_AT24 | ||
2068 | ones like at24c64, 24lc02 or fm24c04: | ||
2069 | |||
2070 | 24c00, 24c01, 24c02, spd (readonly 24c02), 24c04, 24c08, | ||
2071 | - 24c16, 24c32, 24c64, 24c128, 24c256, 24c512, 24c1024 | ||
2072 | + 24c16, 24c32, 24c64, 24c128, 24c256, 24c512, 24c1024, 24c2048 | ||
2073 | |||
2074 | Unless you like data loss puzzles, always be sure that any chip | ||
2075 | you configure as a 24c32 (32 kbit) or larger is NOT really a | ||
2076 | diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c | ||
2077 | index 636ed7149793..ddfcf4ade7bf 100644 | ||
2078 | --- a/drivers/misc/eeprom/at24.c | ||
2079 | +++ b/drivers/misc/eeprom/at24.c | ||
2080 | @@ -156,6 +156,7 @@ AT24_CHIP_DATA(at24_data_24c128, 131072 / 8, AT24_FLAG_ADDR16); | ||
2081 | AT24_CHIP_DATA(at24_data_24c256, 262144 / 8, AT24_FLAG_ADDR16); | ||
2082 | AT24_CHIP_DATA(at24_data_24c512, 524288 / 8, AT24_FLAG_ADDR16); | ||
2083 | AT24_CHIP_DATA(at24_data_24c1024, 1048576 / 8, AT24_FLAG_ADDR16); | ||
2084 | +AT24_CHIP_DATA(at24_data_24c2048, 2097152 / 8, AT24_FLAG_ADDR16); | ||
2085 | /* identical to 24c08 ? */ | ||
2086 | AT24_CHIP_DATA(at24_data_INT3499, 8192 / 8, 0); | ||
2087 | |||
2088 | @@ -182,6 +183,7 @@ static const struct i2c_device_id at24_ids[] = { | ||
2089 | { "24c256", (kernel_ulong_t)&at24_data_24c256 }, | ||
2090 | { "24c512", (kernel_ulong_t)&at24_data_24c512 }, | ||
2091 | { "24c1024", (kernel_ulong_t)&at24_data_24c1024 }, | ||
2092 | + { "24c2048", (kernel_ulong_t)&at24_data_24c2048 }, | ||
2093 | { "at24", 0 }, | ||
2094 | { /* END OF LIST */ } | ||
2095 | }; | ||
2096 | @@ -210,6 +212,7 @@ static const struct of_device_id at24_of_match[] = { | ||
2097 | { .compatible = "atmel,24c256", .data = &at24_data_24c256 }, | ||
2098 | { .compatible = "atmel,24c512", .data = &at24_data_24c512 }, | ||
2099 | { .compatible = "atmel,24c1024", .data = &at24_data_24c1024 }, | ||
2100 | + { .compatible = "atmel,24c2048", .data = &at24_data_24c2048 }, | ||
2101 | { /* END OF LIST */ }, | ||
2102 | }; | ||
2103 | MODULE_DEVICE_TABLE(of, at24_of_match); | ||
2104 | diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c | ||
2105 | index 111934838da2..4f1912a1e071 100644 | ||
2106 | --- a/drivers/mmc/core/block.c | ||
2107 | +++ b/drivers/mmc/core/block.c | ||
2108 | @@ -2114,7 +2114,7 @@ static void mmc_blk_mq_req_done(struct mmc_request *mrq) | ||
2109 | if (waiting) | ||
2110 | wake_up(&mq->wait); | ||
2111 | else | ||
2112 | - kblockd_schedule_work(&mq->complete_work); | ||
2113 | + queue_work(mq->card->complete_wq, &mq->complete_work); | ||
2114 | |||
2115 | return; | ||
2116 | } | ||
2117 | @@ -2928,6 +2928,13 @@ static int mmc_blk_probe(struct mmc_card *card) | ||
2118 | |||
2119 | mmc_fixup_device(card, mmc_blk_fixups); | ||
2120 | |||
2121 | + card->complete_wq = alloc_workqueue("mmc_complete", | ||
2122 | + WQ_MEM_RECLAIM | WQ_HIGHPRI, 0); | ||
2123 | + if (unlikely(!card->complete_wq)) { | ||
2124 | + pr_err("Failed to create mmc completion workqueue"); | ||
2125 | + return -ENOMEM; | ||
2126 | + } | ||
2127 | + | ||
2128 | md = mmc_blk_alloc(card); | ||
2129 | if (IS_ERR(md)) | ||
2130 | return PTR_ERR(md); | ||
2131 | @@ -2991,6 +2998,7 @@ static void mmc_blk_remove(struct mmc_card *card) | ||
2132 | pm_runtime_put_noidle(&card->dev); | ||
2133 | mmc_blk_remove_req(md); | ||
2134 | dev_set_drvdata(&card->dev, NULL); | ||
2135 | + destroy_workqueue(card->complete_wq); | ||
2136 | } | ||
2137 | |||
2138 | static int _mmc_blk_suspend(struct mmc_card *card) | ||
2139 | diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c | ||
2140 | index 279e326e397e..70fadc976795 100644 | ||
2141 | --- a/drivers/mmc/host/sunxi-mmc.c | ||
2142 | +++ b/drivers/mmc/host/sunxi-mmc.c | ||
2143 | @@ -1399,13 +1399,37 @@ static int sunxi_mmc_probe(struct platform_device *pdev) | ||
2144 | mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | | ||
2145 | MMC_CAP_ERASE | MMC_CAP_SDIO_IRQ; | ||
2146 | |||
2147 | - if (host->cfg->clk_delays || host->use_new_timings) | ||
2148 | + /* | ||
2149 | + * Some H5 devices do not have signal traces precise enough to | ||
2150 | + * use HS DDR mode for their eMMC chips. | ||
2151 | + * | ||
2152 | + * We still enable HS DDR modes for all the other controller | ||
2153 | + * variants that support them. | ||
2154 | + */ | ||
2155 | + if ((host->cfg->clk_delays || host->use_new_timings) && | ||
2156 | + !of_device_is_compatible(pdev->dev.of_node, | ||
2157 | + "allwinner,sun50i-h5-emmc")) | ||
2158 | mmc->caps |= MMC_CAP_1_8V_DDR | MMC_CAP_3_3V_DDR; | ||
2159 | |||
2160 | ret = mmc_of_parse(mmc); | ||
2161 | if (ret) | ||
2162 | goto error_free_dma; | ||
2163 | |||
2164 | + /* | ||
2165 | + * If we don't support delay chains in the SoC, we can't use any | ||
2166 | + * of the higher speed modes. Mask them out in case the device | ||
2167 | + * tree specifies the properties for them, which gets added to | ||
2168 | + * the caps by mmc_of_parse() above. | ||
2169 | + */ | ||
2170 | + if (!(host->cfg->clk_delays || host->use_new_timings)) { | ||
2171 | + mmc->caps &= ~(MMC_CAP_3_3V_DDR | MMC_CAP_1_8V_DDR | | ||
2172 | + MMC_CAP_1_2V_DDR | MMC_CAP_UHS); | ||
2173 | + mmc->caps2 &= ~MMC_CAP2_HS200; | ||
2174 | + } | ||
2175 | + | ||
2176 | + /* TODO: This driver doesn't support HS400 mode yet */ | ||
2177 | + mmc->caps2 &= ~MMC_CAP2_HS400; | ||
2178 | + | ||
2179 | ret = sunxi_mmc_init_host(host); | ||
2180 | if (ret) | ||
2181 | goto error_free_dma; | ||
2182 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c | ||
2183 | index 962012135b62..5f9a5ef93969 100644 | ||
2184 | --- a/drivers/nvme/host/core.c | ||
2185 | +++ b/drivers/nvme/host/core.c | ||
2186 | @@ -2084,18 +2084,20 @@ static void nvme_init_subnqn(struct nvme_subsystem *subsys, struct nvme_ctrl *ct | ||
2187 | size_t nqnlen; | ||
2188 | int off; | ||
2189 | |||
2190 | - nqnlen = strnlen(id->subnqn, NVMF_NQN_SIZE); | ||
2191 | - if (nqnlen > 0 && nqnlen < NVMF_NQN_SIZE) { | ||
2192 | - strlcpy(subsys->subnqn, id->subnqn, NVMF_NQN_SIZE); | ||
2193 | - return; | ||
2194 | - } | ||
2195 | + if(!(ctrl->quirks & NVME_QUIRK_IGNORE_DEV_SUBNQN)) { | ||
2196 | + nqnlen = strnlen(id->subnqn, NVMF_NQN_SIZE); | ||
2197 | + if (nqnlen > 0 && nqnlen < NVMF_NQN_SIZE) { | ||
2198 | + strlcpy(subsys->subnqn, id->subnqn, NVMF_NQN_SIZE); | ||
2199 | + return; | ||
2200 | + } | ||
2201 | |||
2202 | - if (ctrl->vs >= NVME_VS(1, 2, 1)) | ||
2203 | - dev_warn(ctrl->device, "missing or invalid SUBNQN field.\n"); | ||
2204 | + if (ctrl->vs >= NVME_VS(1, 2, 1)) | ||
2205 | + dev_warn(ctrl->device, "missing or invalid SUBNQN field.\n"); | ||
2206 | + } | ||
2207 | |||
2208 | /* Generate a "fake" NQN per Figure 254 in NVMe 1.3 + ECN 001 */ | ||
2209 | off = snprintf(subsys->subnqn, NVMF_NQN_SIZE, | ||
2210 | - "nqn.2014.08.org.nvmexpress:%4x%4x", | ||
2211 | + "nqn.2014.08.org.nvmexpress:%04x%04x", | ||
2212 | le16_to_cpu(id->vid), le16_to_cpu(id->ssvid)); | ||
2213 | memcpy(subsys->subnqn + off, id->sn, sizeof(id->sn)); | ||
2214 | off += sizeof(id->sn); | ||
2215 | diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c | ||
2216 | index 9901afd804ce..2b1d1f066efa 100644 | ||
2217 | --- a/drivers/nvme/host/multipath.c | ||
2218 | +++ b/drivers/nvme/host/multipath.c | ||
2219 | @@ -586,6 +586,7 @@ int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) | ||
2220 | return 0; | ||
2221 | out_free_ana_log_buf: | ||
2222 | kfree(ctrl->ana_log_buf); | ||
2223 | + ctrl->ana_log_buf = NULL; | ||
2224 | out: | ||
2225 | return error; | ||
2226 | } | ||
2227 | @@ -593,5 +594,6 @@ out: | ||
2228 | void nvme_mpath_uninit(struct nvme_ctrl *ctrl) | ||
2229 | { | ||
2230 | kfree(ctrl->ana_log_buf); | ||
2231 | + ctrl->ana_log_buf = NULL; | ||
2232 | } | ||
2233 | |||
2234 | diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h | ||
2235 | index 081cbdcce880..6ffa99a10a60 100644 | ||
2236 | --- a/drivers/nvme/host/nvme.h | ||
2237 | +++ b/drivers/nvme/host/nvme.h | ||
2238 | @@ -90,6 +90,11 @@ enum nvme_quirks { | ||
2239 | * Set MEDIUM priority on SQ creation | ||
2240 | */ | ||
2241 | NVME_QUIRK_MEDIUM_PRIO_SQ = (1 << 7), | ||
2242 | + | ||
2243 | + /* | ||
2244 | + * Ignore device provided subnqn. | ||
2245 | + */ | ||
2246 | + NVME_QUIRK_IGNORE_DEV_SUBNQN = (1 << 8), | ||
2247 | }; | ||
2248 | |||
2249 | /* | ||
2250 | diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c | ||
2251 | index c33bb201b884..c0d01048ce4d 100644 | ||
2252 | --- a/drivers/nvme/host/pci.c | ||
2253 | +++ b/drivers/nvme/host/pci.c | ||
2254 | @@ -913,9 +913,11 @@ static void nvme_complete_cqes(struct nvme_queue *nvmeq, u16 start, u16 end) | ||
2255 | |||
2256 | static inline void nvme_update_cq_head(struct nvme_queue *nvmeq) | ||
2257 | { | ||
2258 | - if (++nvmeq->cq_head == nvmeq->q_depth) { | ||
2259 | + if (nvmeq->cq_head == nvmeq->q_depth - 1) { | ||
2260 | nvmeq->cq_head = 0; | ||
2261 | nvmeq->cq_phase = !nvmeq->cq_phase; | ||
2262 | + } else { | ||
2263 | + nvmeq->cq_head++; | ||
2264 | } | ||
2265 | } | ||
2266 | |||
2267 | @@ -1748,8 +1750,9 @@ static void nvme_free_host_mem(struct nvme_dev *dev) | ||
2268 | struct nvme_host_mem_buf_desc *desc = &dev->host_mem_descs[i]; | ||
2269 | size_t size = le32_to_cpu(desc->size) * dev->ctrl.page_size; | ||
2270 | |||
2271 | - dma_free_coherent(dev->dev, size, dev->host_mem_desc_bufs[i], | ||
2272 | - le64_to_cpu(desc->addr)); | ||
2273 | + dma_free_attrs(dev->dev, size, dev->host_mem_desc_bufs[i], | ||
2274 | + le64_to_cpu(desc->addr), | ||
2275 | + DMA_ATTR_NO_KERNEL_MAPPING | DMA_ATTR_NO_WARN); | ||
2276 | } | ||
2277 | |||
2278 | kfree(dev->host_mem_desc_bufs); | ||
2279 | @@ -1815,8 +1818,9 @@ out_free_bufs: | ||
2280 | while (--i >= 0) { | ||
2281 | size_t size = le32_to_cpu(descs[i].size) * dev->ctrl.page_size; | ||
2282 | |||
2283 | - dma_free_coherent(dev->dev, size, bufs[i], | ||
2284 | - le64_to_cpu(descs[i].addr)); | ||
2285 | + dma_free_attrs(dev->dev, size, bufs[i], | ||
2286 | + le64_to_cpu(descs[i].addr), | ||
2287 | + DMA_ATTR_NO_KERNEL_MAPPING | DMA_ATTR_NO_WARN); | ||
2288 | } | ||
2289 | |||
2290 | kfree(bufs); | ||
2291 | @@ -2696,6 +2700,8 @@ static const struct pci_device_id nvme_id_table[] = { | ||
2292 | { PCI_VDEVICE(INTEL, 0xf1a5), /* Intel 600P/P3100 */ | ||
2293 | .driver_data = NVME_QUIRK_NO_DEEPEST_PS | | ||
2294 | NVME_QUIRK_MEDIUM_PRIO_SQ }, | ||
2295 | + { PCI_VDEVICE(INTEL, 0xf1a6), /* Intel 760p/Pro 7600p */ | ||
2296 | + .driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN, }, | ||
2297 | { PCI_VDEVICE(INTEL, 0x5845), /* Qemu emulated controller */ | ||
2298 | .driver_data = NVME_QUIRK_IDENTIFY_CNS, }, | ||
2299 | { PCI_DEVICE(0x1bb1, 0x0100), /* Seagate Nytro Flash Storage */ | ||
2300 | diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c | ||
2301 | index 9f5a201c4c87..02b52cacde33 100644 | ||
2302 | --- a/drivers/s390/crypto/ap_bus.c | ||
2303 | +++ b/drivers/s390/crypto/ap_bus.c | ||
2304 | @@ -248,7 +248,8 @@ static inline int ap_test_config(unsigned int *field, unsigned int nr) | ||
2305 | static inline int ap_test_config_card_id(unsigned int id) | ||
2306 | { | ||
2307 | if (!ap_configuration) /* QCI not supported */ | ||
2308 | - return 1; | ||
2309 | + /* only ids 0...3F may be probed */ | ||
2310 | + return id < 0x40 ? 1 : 0; | ||
2311 | return ap_test_config(ap_configuration->apm, id); | ||
2312 | } | ||
2313 | |||
2314 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c | ||
2315 | index ba4b8b3ce8cf..c0e21433b1d8 100644 | ||
2316 | --- a/drivers/scsi/sd.c | ||
2317 | +++ b/drivers/scsi/sd.c | ||
2318 | @@ -2960,9 +2960,6 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp) | ||
2319 | if (rot == 1) { | ||
2320 | blk_queue_flag_set(QUEUE_FLAG_NONROT, q); | ||
2321 | blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, q); | ||
2322 | - } else { | ||
2323 | - blk_queue_flag_clear(QUEUE_FLAG_NONROT, q); | ||
2324 | - blk_queue_flag_set(QUEUE_FLAG_ADD_RANDOM, q); | ||
2325 | } | ||
2326 | |||
2327 | if (sdkp->device->type == TYPE_ZBC) { | ||
2328 | @@ -3099,6 +3096,15 @@ static int sd_revalidate_disk(struct gendisk *disk) | ||
2329 | if (sdkp->media_present) { | ||
2330 | sd_read_capacity(sdkp, buffer); | ||
2331 | |||
2332 | + /* | ||
2333 | + * set the default to rotational. All non-rotational devices | ||
2334 | + * support the block characteristics VPD page, which will | ||
2335 | + * cause this to be updated correctly and any device which | ||
2336 | + * doesn't support it should be treated as rotational. | ||
2337 | + */ | ||
2338 | + blk_queue_flag_clear(QUEUE_FLAG_NONROT, q); | ||
2339 | + blk_queue_flag_set(QUEUE_FLAG_ADD_RANDOM, q); | ||
2340 | + | ||
2341 | if (scsi_device_supports_vpd(sdp)) { | ||
2342 | sd_read_block_provisioning(sdkp); | ||
2343 | sd_read_block_limits(sdkp); | ||
2344 | diff --git a/drivers/soc/renesas/r8a774c0-sysc.c b/drivers/soc/renesas/r8a774c0-sysc.c | ||
2345 | index e1ac4c0f6640..11050e17ea81 100644 | ||
2346 | --- a/drivers/soc/renesas/r8a774c0-sysc.c | ||
2347 | +++ b/drivers/soc/renesas/r8a774c0-sysc.c | ||
2348 | @@ -28,19 +28,6 @@ static struct rcar_sysc_area r8a774c0_areas[] __initdata = { | ||
2349 | { "3dg-b", 0x100, 1, R8A774C0_PD_3DG_B, R8A774C0_PD_3DG_A }, | ||
2350 | }; | ||
2351 | |||
2352 | -static void __init rcar_sysc_fix_parent(struct rcar_sysc_area *areas, | ||
2353 | - unsigned int num_areas, u8 id, | ||
2354 | - int new_parent) | ||
2355 | -{ | ||
2356 | - unsigned int i; | ||
2357 | - | ||
2358 | - for (i = 0; i < num_areas; i++) | ||
2359 | - if (areas[i].isr_bit == id) { | ||
2360 | - areas[i].parent = new_parent; | ||
2361 | - return; | ||
2362 | - } | ||
2363 | -} | ||
2364 | - | ||
2365 | /* Fixups for RZ/G2E ES1.0 revision */ | ||
2366 | static const struct soc_device_attribute r8a774c0[] __initconst = { | ||
2367 | { .soc_id = "r8a774c0", .revision = "ES1.0" }, | ||
2368 | @@ -50,12 +37,10 @@ static const struct soc_device_attribute r8a774c0[] __initconst = { | ||
2369 | static int __init r8a774c0_sysc_init(void) | ||
2370 | { | ||
2371 | if (soc_device_match(r8a774c0)) { | ||
2372 | - rcar_sysc_fix_parent(r8a774c0_areas, | ||
2373 | - ARRAY_SIZE(r8a774c0_areas), | ||
2374 | - R8A774C0_PD_3DG_A, R8A774C0_PD_3DG_B); | ||
2375 | - rcar_sysc_fix_parent(r8a774c0_areas, | ||
2376 | - ARRAY_SIZE(r8a774c0_areas), | ||
2377 | - R8A774C0_PD_3DG_B, R8A774C0_PD_ALWAYS_ON); | ||
2378 | + /* Fix incorrect 3DG hierarchy */ | ||
2379 | + swap(r8a774c0_areas[6], r8a774c0_areas[7]); | ||
2380 | + r8a774c0_areas[6].parent = R8A774C0_PD_ALWAYS_ON; | ||
2381 | + r8a774c0_areas[7].parent = R8A774C0_PD_3DG_B; | ||
2382 | } | ||
2383 | |||
2384 | return 0; | ||
2385 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h | ||
2386 | index 38ab0fca49e1..373639199291 100644 | ||
2387 | --- a/fs/cifs/cifsglob.h | ||
2388 | +++ b/fs/cifs/cifsglob.h | ||
2389 | @@ -1426,6 +1426,7 @@ struct mid_q_entry { | ||
2390 | int mid_state; /* wish this were enum but can not pass to wait_event */ | ||
2391 | unsigned int mid_flags; | ||
2392 | __le16 command; /* smb command code */ | ||
2393 | + unsigned int optype; /* operation type */ | ||
2394 | bool large_buf:1; /* if valid response, is pointer to large buf */ | ||
2395 | bool multiRsp:1; /* multiple trans2 responses for one request */ | ||
2396 | bool multiEnd:1; /* both received */ | ||
2397 | @@ -1562,6 +1563,25 @@ static inline void free_dfs_info_array(struct dfs_info3_param *param, | ||
2398 | kfree(param); | ||
2399 | } | ||
2400 | |||
2401 | +static inline bool is_interrupt_error(int error) | ||
2402 | +{ | ||
2403 | + switch (error) { | ||
2404 | + case -EINTR: | ||
2405 | + case -ERESTARTSYS: | ||
2406 | + case -ERESTARTNOHAND: | ||
2407 | + case -ERESTARTNOINTR: | ||
2408 | + return true; | ||
2409 | + } | ||
2410 | + return false; | ||
2411 | +} | ||
2412 | + | ||
2413 | +static inline bool is_retryable_error(int error) | ||
2414 | +{ | ||
2415 | + if (is_interrupt_error(error) || error == -EAGAIN) | ||
2416 | + return true; | ||
2417 | + return false; | ||
2418 | +} | ||
2419 | + | ||
2420 | #define MID_FREE 0 | ||
2421 | #define MID_REQUEST_ALLOCATED 1 | ||
2422 | #define MID_REQUEST_SUBMITTED 2 | ||
2423 | diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c | ||
2424 | index fce610f6cd24..327a101f7894 100644 | ||
2425 | --- a/fs/cifs/cifssmb.c | ||
2426 | +++ b/fs/cifs/cifssmb.c | ||
2427 | @@ -2043,7 +2043,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata) | ||
2428 | |||
2429 | for (j = 0; j < nr_pages; j++) { | ||
2430 | unlock_page(wdata2->pages[j]); | ||
2431 | - if (rc != 0 && rc != -EAGAIN) { | ||
2432 | + if (rc != 0 && !is_retryable_error(rc)) { | ||
2433 | SetPageError(wdata2->pages[j]); | ||
2434 | end_page_writeback(wdata2->pages[j]); | ||
2435 | put_page(wdata2->pages[j]); | ||
2436 | @@ -2052,7 +2052,7 @@ cifs_writev_requeue(struct cifs_writedata *wdata) | ||
2437 | |||
2438 | if (rc) { | ||
2439 | kref_put(&wdata2->refcount, cifs_writedata_release); | ||
2440 | - if (rc == -EAGAIN) | ||
2441 | + if (is_retryable_error(rc)) | ||
2442 | continue; | ||
2443 | break; | ||
2444 | } | ||
2445 | @@ -2061,7 +2061,8 @@ cifs_writev_requeue(struct cifs_writedata *wdata) | ||
2446 | i += nr_pages; | ||
2447 | } while (i < wdata->nr_pages); | ||
2448 | |||
2449 | - mapping_set_error(inode->i_mapping, rc); | ||
2450 | + if (rc != 0 && !is_retryable_error(rc)) | ||
2451 | + mapping_set_error(inode->i_mapping, rc); | ||
2452 | kref_put(&wdata->refcount, cifs_writedata_release); | ||
2453 | } | ||
2454 | |||
2455 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c | ||
2456 | index 8431854b129f..c13effbaadba 100644 | ||
2457 | --- a/fs/cifs/file.c | ||
2458 | +++ b/fs/cifs/file.c | ||
2459 | @@ -732,7 +732,8 @@ reopen_success: | ||
2460 | |||
2461 | if (can_flush) { | ||
2462 | rc = filemap_write_and_wait(inode->i_mapping); | ||
2463 | - mapping_set_error(inode->i_mapping, rc); | ||
2464 | + if (!is_interrupt_error(rc)) | ||
2465 | + mapping_set_error(inode->i_mapping, rc); | ||
2466 | |||
2467 | if (tcon->unix_ext) | ||
2468 | rc = cifs_get_inode_info_unix(&inode, full_path, | ||
2469 | @@ -1139,6 +1140,10 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile) | ||
2470 | return -EINVAL; | ||
2471 | } | ||
2472 | |||
2473 | + BUILD_BUG_ON(sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE) > | ||
2474 | + PAGE_SIZE); | ||
2475 | + max_buf = min_t(unsigned int, max_buf - sizeof(struct smb_hdr), | ||
2476 | + PAGE_SIZE); | ||
2477 | max_num = (max_buf - sizeof(struct smb_hdr)) / | ||
2478 | sizeof(LOCKING_ANDX_RANGE); | ||
2479 | buf = kcalloc(max_num, sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL); | ||
2480 | @@ -1477,6 +1482,10 @@ cifs_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock, | ||
2481 | if (max_buf < (sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE))) | ||
2482 | return -EINVAL; | ||
2483 | |||
2484 | + BUILD_BUG_ON(sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE) > | ||
2485 | + PAGE_SIZE); | ||
2486 | + max_buf = min_t(unsigned int, max_buf - sizeof(struct smb_hdr), | ||
2487 | + PAGE_SIZE); | ||
2488 | max_num = (max_buf - sizeof(struct smb_hdr)) / | ||
2489 | sizeof(LOCKING_ANDX_RANGE); | ||
2490 | buf = kcalloc(max_num, sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL); | ||
2491 | @@ -2109,6 +2118,7 @@ static int cifs_writepages(struct address_space *mapping, | ||
2492 | pgoff_t end, index; | ||
2493 | struct cifs_writedata *wdata; | ||
2494 | int rc = 0; | ||
2495 | + int saved_rc = 0; | ||
2496 | unsigned int xid; | ||
2497 | |||
2498 | /* | ||
2499 | @@ -2137,8 +2147,10 @@ retry: | ||
2500 | |||
2501 | rc = server->ops->wait_mtu_credits(server, cifs_sb->wsize, | ||
2502 | &wsize, &credits); | ||
2503 | - if (rc) | ||
2504 | + if (rc != 0) { | ||
2505 | + done = true; | ||
2506 | break; | ||
2507 | + } | ||
2508 | |||
2509 | tofind = min((wsize / PAGE_SIZE) - 1, end - index) + 1; | ||
2510 | |||
2511 | @@ -2146,6 +2158,7 @@ retry: | ||
2512 | &found_pages); | ||
2513 | if (!wdata) { | ||
2514 | rc = -ENOMEM; | ||
2515 | + done = true; | ||
2516 | add_credits_and_wake_if(server, credits, 0); | ||
2517 | break; | ||
2518 | } | ||
2519 | @@ -2174,7 +2187,7 @@ retry: | ||
2520 | if (rc != 0) { | ||
2521 | add_credits_and_wake_if(server, wdata->credits, 0); | ||
2522 | for (i = 0; i < nr_pages; ++i) { | ||
2523 | - if (rc == -EAGAIN) | ||
2524 | + if (is_retryable_error(rc)) | ||
2525 | redirty_page_for_writepage(wbc, | ||
2526 | wdata->pages[i]); | ||
2527 | else | ||
2528 | @@ -2182,7 +2195,7 @@ retry: | ||
2529 | end_page_writeback(wdata->pages[i]); | ||
2530 | put_page(wdata->pages[i]); | ||
2531 | } | ||
2532 | - if (rc != -EAGAIN) | ||
2533 | + if (!is_retryable_error(rc)) | ||
2534 | mapping_set_error(mapping, rc); | ||
2535 | } | ||
2536 | kref_put(&wdata->refcount, cifs_writedata_release); | ||
2537 | @@ -2192,6 +2205,15 @@ retry: | ||
2538 | continue; | ||
2539 | } | ||
2540 | |||
2541 | + /* Return immediately if we received a signal during writing */ | ||
2542 | + if (is_interrupt_error(rc)) { | ||
2543 | + done = true; | ||
2544 | + break; | ||
2545 | + } | ||
2546 | + | ||
2547 | + if (rc != 0 && saved_rc == 0) | ||
2548 | + saved_rc = rc; | ||
2549 | + | ||
2550 | wbc->nr_to_write -= nr_pages; | ||
2551 | if (wbc->nr_to_write <= 0) | ||
2552 | done = true; | ||
2553 | @@ -2209,6 +2231,9 @@ retry: | ||
2554 | goto retry; | ||
2555 | } | ||
2556 | |||
2557 | + if (saved_rc != 0) | ||
2558 | + rc = saved_rc; | ||
2559 | + | ||
2560 | if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) | ||
2561 | mapping->writeback_index = index; | ||
2562 | |||
2563 | @@ -2241,8 +2266,8 @@ cifs_writepage_locked(struct page *page, struct writeback_control *wbc) | ||
2564 | set_page_writeback(page); | ||
2565 | retry_write: | ||
2566 | rc = cifs_partialpagewrite(page, 0, PAGE_SIZE); | ||
2567 | - if (rc == -EAGAIN) { | ||
2568 | - if (wbc->sync_mode == WB_SYNC_ALL) | ||
2569 | + if (is_retryable_error(rc)) { | ||
2570 | + if (wbc->sync_mode == WB_SYNC_ALL && rc == -EAGAIN) | ||
2571 | goto retry_write; | ||
2572 | redirty_page_for_writepage(wbc, page); | ||
2573 | } else if (rc != 0) { | ||
2574 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c | ||
2575 | index a81a9df997c1..84d51ca91ef7 100644 | ||
2576 | --- a/fs/cifs/inode.c | ||
2577 | +++ b/fs/cifs/inode.c | ||
2578 | @@ -2261,6 +2261,11 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs) | ||
2579 | * the flush returns error? | ||
2580 | */ | ||
2581 | rc = filemap_write_and_wait(inode->i_mapping); | ||
2582 | + if (is_interrupt_error(rc)) { | ||
2583 | + rc = -ERESTARTSYS; | ||
2584 | + goto out; | ||
2585 | + } | ||
2586 | + | ||
2587 | mapping_set_error(inode->i_mapping, rc); | ||
2588 | rc = 0; | ||
2589 | |||
2590 | @@ -2404,6 +2409,11 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) | ||
2591 | * the flush returns error? | ||
2592 | */ | ||
2593 | rc = filemap_write_and_wait(inode->i_mapping); | ||
2594 | + if (is_interrupt_error(rc)) { | ||
2595 | + rc = -ERESTARTSYS; | ||
2596 | + goto cifs_setattr_exit; | ||
2597 | + } | ||
2598 | + | ||
2599 | mapping_set_error(inode->i_mapping, rc); | ||
2600 | rc = 0; | ||
2601 | |||
2602 | diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c | ||
2603 | index 2fc3d31967ee..b204e84b87fb 100644 | ||
2604 | --- a/fs/cifs/smb2file.c | ||
2605 | +++ b/fs/cifs/smb2file.c | ||
2606 | @@ -128,6 +128,8 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock, | ||
2607 | if (max_buf < sizeof(struct smb2_lock_element)) | ||
2608 | return -EINVAL; | ||
2609 | |||
2610 | + BUILD_BUG_ON(sizeof(struct smb2_lock_element) > PAGE_SIZE); | ||
2611 | + max_buf = min_t(unsigned int, max_buf, PAGE_SIZE); | ||
2612 | max_num = max_buf / sizeof(struct smb2_lock_element); | ||
2613 | buf = kcalloc(max_num, sizeof(struct smb2_lock_element), GFP_KERNEL); | ||
2614 | if (!buf) | ||
2615 | @@ -264,6 +266,8 @@ smb2_push_mandatory_locks(struct cifsFileInfo *cfile) | ||
2616 | return -EINVAL; | ||
2617 | } | ||
2618 | |||
2619 | + BUILD_BUG_ON(sizeof(struct smb2_lock_element) > PAGE_SIZE); | ||
2620 | + max_buf = min_t(unsigned int, max_buf, PAGE_SIZE); | ||
2621 | max_num = max_buf / sizeof(struct smb2_lock_element); | ||
2622 | buf = kcalloc(max_num, sizeof(struct smb2_lock_element), GFP_KERNEL); | ||
2623 | if (!buf) { | ||
2624 | diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c | ||
2625 | index a8999f930b22..057d2034209f 100644 | ||
2626 | --- a/fs/cifs/smb2inode.c | ||
2627 | +++ b/fs/cifs/smb2inode.c | ||
2628 | @@ -294,6 +294,8 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, | ||
2629 | int rc; | ||
2630 | struct smb2_file_all_info *smb2_data; | ||
2631 | __u32 create_options = 0; | ||
2632 | + struct cifs_fid fid; | ||
2633 | + bool no_cached_open = tcon->nohandlecache; | ||
2634 | |||
2635 | *adjust_tz = false; | ||
2636 | *symlink = false; | ||
2637 | @@ -302,6 +304,21 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, | ||
2638 | GFP_KERNEL); | ||
2639 | if (smb2_data == NULL) | ||
2640 | return -ENOMEM; | ||
2641 | + | ||
2642 | + /* If it is a root and its handle is cached then use it */ | ||
2643 | + if (!strlen(full_path) && !no_cached_open) { | ||
2644 | + rc = open_shroot(xid, tcon, &fid); | ||
2645 | + if (rc) | ||
2646 | + goto out; | ||
2647 | + rc = SMB2_query_info(xid, tcon, fid.persistent_fid, | ||
2648 | + fid.volatile_fid, smb2_data); | ||
2649 | + close_shroot(&tcon->crfid); | ||
2650 | + if (rc) | ||
2651 | + goto out; | ||
2652 | + move_smb2_info_to_cifs(data, smb2_data); | ||
2653 | + goto out; | ||
2654 | + } | ||
2655 | + | ||
2656 | if (backup_cred(cifs_sb)) | ||
2657 | create_options |= CREATE_OPEN_BACKUP_INTENT; | ||
2658 | |||
2659 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c | ||
2660 | index d7dd7d38fad6..aa71e620f3cd 100644 | ||
2661 | --- a/fs/cifs/smb2ops.c | ||
2662 | +++ b/fs/cifs/smb2ops.c | ||
2663 | @@ -154,7 +154,11 @@ smb2_get_credits(struct mid_q_entry *mid) | ||
2664 | { | ||
2665 | struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)mid->resp_buf; | ||
2666 | |||
2667 | - return le16_to_cpu(shdr->CreditRequest); | ||
2668 | + if (mid->mid_state == MID_RESPONSE_RECEIVED | ||
2669 | + || mid->mid_state == MID_RESPONSE_MALFORMED) | ||
2670 | + return le16_to_cpu(shdr->CreditRequest); | ||
2671 | + | ||
2672 | + return 0; | ||
2673 | } | ||
2674 | |||
2675 | static int | ||
2676 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c | ||
2677 | index c393ac255af7..28712080add9 100644 | ||
2678 | --- a/fs/cifs/smb2pdu.c | ||
2679 | +++ b/fs/cifs/smb2pdu.c | ||
2680 | @@ -2826,9 +2826,10 @@ smb2_echo_callback(struct mid_q_entry *mid) | ||
2681 | { | ||
2682 | struct TCP_Server_Info *server = mid->callback_data; | ||
2683 | struct smb2_echo_rsp *rsp = (struct smb2_echo_rsp *)mid->resp_buf; | ||
2684 | - unsigned int credits_received = 1; | ||
2685 | + unsigned int credits_received = 0; | ||
2686 | |||
2687 | - if (mid->mid_state == MID_RESPONSE_RECEIVED) | ||
2688 | + if (mid->mid_state == MID_RESPONSE_RECEIVED | ||
2689 | + || mid->mid_state == MID_RESPONSE_MALFORMED) | ||
2690 | credits_received = le16_to_cpu(rsp->sync_hdr.CreditRequest); | ||
2691 | |||
2692 | DeleteMidQEntry(mid); | ||
2693 | @@ -3085,7 +3086,7 @@ smb2_readv_callback(struct mid_q_entry *mid) | ||
2694 | struct TCP_Server_Info *server = tcon->ses->server; | ||
2695 | struct smb2_sync_hdr *shdr = | ||
2696 | (struct smb2_sync_hdr *)rdata->iov[0].iov_base; | ||
2697 | - unsigned int credits_received = 1; | ||
2698 | + unsigned int credits_received = 0; | ||
2699 | struct smb_rqst rqst = { .rq_iov = rdata->iov, | ||
2700 | .rq_nvec = 2, | ||
2701 | .rq_pages = rdata->pages, | ||
2702 | @@ -3124,6 +3125,9 @@ smb2_readv_callback(struct mid_q_entry *mid) | ||
2703 | task_io_account_read(rdata->got_bytes); | ||
2704 | cifs_stats_bytes_read(tcon, rdata->got_bytes); | ||
2705 | break; | ||
2706 | + case MID_RESPONSE_MALFORMED: | ||
2707 | + credits_received = le16_to_cpu(shdr->CreditRequest); | ||
2708 | + /* fall through */ | ||
2709 | default: | ||
2710 | if (rdata->result != -ENODATA) | ||
2711 | rdata->result = -EIO; | ||
2712 | @@ -3317,7 +3321,7 @@ smb2_writev_callback(struct mid_q_entry *mid) | ||
2713 | struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); | ||
2714 | unsigned int written; | ||
2715 | struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf; | ||
2716 | - unsigned int credits_received = 1; | ||
2717 | + unsigned int credits_received = 0; | ||
2718 | |||
2719 | switch (mid->mid_state) { | ||
2720 | case MID_RESPONSE_RECEIVED: | ||
2721 | @@ -3345,6 +3349,9 @@ smb2_writev_callback(struct mid_q_entry *mid) | ||
2722 | case MID_RETRY_NEEDED: | ||
2723 | wdata->result = -EAGAIN; | ||
2724 | break; | ||
2725 | + case MID_RESPONSE_MALFORMED: | ||
2726 | + credits_received = le16_to_cpu(rsp->sync_hdr.CreditRequest); | ||
2727 | + /* fall through */ | ||
2728 | default: | ||
2729 | wdata->result = -EIO; | ||
2730 | break; | ||
2731 | diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c | ||
2732 | index d51064c1ba42..6f937e826910 100644 | ||
2733 | --- a/fs/cifs/transport.c | ||
2734 | +++ b/fs/cifs/transport.c | ||
2735 | @@ -781,8 +781,25 @@ cifs_setup_request(struct cifs_ses *ses, struct smb_rqst *rqst) | ||
2736 | } | ||
2737 | |||
2738 | static void | ||
2739 | -cifs_noop_callback(struct mid_q_entry *mid) | ||
2740 | +cifs_compound_callback(struct mid_q_entry *mid) | ||
2741 | { | ||
2742 | + struct TCP_Server_Info *server = mid->server; | ||
2743 | + | ||
2744 | + add_credits(server, server->ops->get_credits(mid), mid->optype); | ||
2745 | +} | ||
2746 | + | ||
2747 | +static void | ||
2748 | +cifs_compound_last_callback(struct mid_q_entry *mid) | ||
2749 | +{ | ||
2750 | + cifs_compound_callback(mid); | ||
2751 | + cifs_wake_up_task(mid); | ||
2752 | +} | ||
2753 | + | ||
2754 | +static void | ||
2755 | +cifs_cancelled_callback(struct mid_q_entry *mid) | ||
2756 | +{ | ||
2757 | + cifs_compound_callback(mid); | ||
2758 | + DeleteMidQEntry(mid); | ||
2759 | } | ||
2760 | |||
2761 | int | ||
2762 | @@ -860,12 +877,16 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, | ||
2763 | } | ||
2764 | |||
2765 | midQ[i]->mid_state = MID_REQUEST_SUBMITTED; | ||
2766 | + midQ[i]->optype = optype; | ||
2767 | /* | ||
2768 | - * We don't invoke the callback compounds unless it is the last | ||
2769 | - * request. | ||
2770 | + * Invoke callback for every part of the compound chain | ||
2771 | + * to calculate credits properly. Wake up this thread only when | ||
2772 | + * the last element is received. | ||
2773 | */ | ||
2774 | if (i < num_rqst - 1) | ||
2775 | - midQ[i]->callback = cifs_noop_callback; | ||
2776 | + midQ[i]->callback = cifs_compound_callback; | ||
2777 | + else | ||
2778 | + midQ[i]->callback = cifs_compound_last_callback; | ||
2779 | } | ||
2780 | cifs_in_send_inc(ses->server); | ||
2781 | rc = smb_send_rqst(ses->server, num_rqst, rqst, flags); | ||
2782 | @@ -879,8 +900,20 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, | ||
2783 | |||
2784 | mutex_unlock(&ses->server->srv_mutex); | ||
2785 | |||
2786 | - if (rc < 0) | ||
2787 | + if (rc < 0) { | ||
2788 | + /* Sending failed for some reason - return credits back */ | ||
2789 | + for (i = 0; i < num_rqst; i++) | ||
2790 | + add_credits(ses->server, credits[i], optype); | ||
2791 | goto out; | ||
2792 | + } | ||
2793 | + | ||
2794 | + /* | ||
2795 | + * At this point the request is passed to the network stack - we assume | ||
2796 | + * that any credits taken from the server structure on the client have | ||
2797 | + * been spent and we can't return them back. Once we receive responses | ||
2798 | + * we will collect credits granted by the server in the mid callbacks | ||
2799 | + * and add those credits to the server structure. | ||
2800 | + */ | ||
2801 | |||
2802 | /* | ||
2803 | * Compounding is never used during session establish. | ||
2804 | @@ -894,25 +927,25 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, | ||
2805 | |||
2806 | for (i = 0; i < num_rqst; i++) { | ||
2807 | rc = wait_for_response(ses->server, midQ[i]); | ||
2808 | - if (rc != 0) { | ||
2809 | + if (rc != 0) | ||
2810 | + break; | ||
2811 | + } | ||
2812 | + if (rc != 0) { | ||
2813 | + for (; i < num_rqst; i++) { | ||
2814 | cifs_dbg(VFS, "Cancelling wait for mid %llu cmd: %d\n", | ||
2815 | midQ[i]->mid, le16_to_cpu(midQ[i]->command)); | ||
2816 | send_cancel(ses->server, &rqst[i], midQ[i]); | ||
2817 | spin_lock(&GlobalMid_Lock); | ||
2818 | if (midQ[i]->mid_state == MID_REQUEST_SUBMITTED) { | ||
2819 | midQ[i]->mid_flags |= MID_WAIT_CANCELLED; | ||
2820 | - midQ[i]->callback = DeleteMidQEntry; | ||
2821 | + midQ[i]->callback = cifs_cancelled_callback; | ||
2822 | cancelled_mid[i] = true; | ||
2823 | + credits[i] = 0; | ||
2824 | } | ||
2825 | spin_unlock(&GlobalMid_Lock); | ||
2826 | } | ||
2827 | } | ||
2828 | |||
2829 | - for (i = 0; i < num_rqst; i++) | ||
2830 | - if (!cancelled_mid[i] && midQ[i]->resp_buf | ||
2831 | - && (midQ[i]->mid_state == MID_RESPONSE_RECEIVED)) | ||
2832 | - credits[i] = ses->server->ops->get_credits(midQ[i]); | ||
2833 | - | ||
2834 | for (i = 0; i < num_rqst; i++) { | ||
2835 | if (rc < 0) | ||
2836 | goto out; | ||
2837 | @@ -971,7 +1004,6 @@ out: | ||
2838 | for (i = 0; i < num_rqst; i++) { | ||
2839 | if (!cancelled_mid[i]) | ||
2840 | cifs_delete_mid(midQ[i]); | ||
2841 | - add_credits(ses->server, credits[i], optype); | ||
2842 | } | ||
2843 | |||
2844 | return rc; | ||
2845 | diff --git a/fs/inode.c b/fs/inode.c | ||
2846 | index 35d2108d567c..9e198f00b64c 100644 | ||
2847 | --- a/fs/inode.c | ||
2848 | +++ b/fs/inode.c | ||
2849 | @@ -730,11 +730,8 @@ static enum lru_status inode_lru_isolate(struct list_head *item, | ||
2850 | return LRU_REMOVED; | ||
2851 | } | ||
2852 | |||
2853 | - /* | ||
2854 | - * Recently referenced inodes and inodes with many attached pages | ||
2855 | - * get one more pass. | ||
2856 | - */ | ||
2857 | - if (inode->i_state & I_REFERENCED || inode->i_data.nrpages > 1) { | ||
2858 | + /* recently referenced inodes get one more pass */ | ||
2859 | + if (inode->i_state & I_REFERENCED) { | ||
2860 | inode->i_state &= ~I_REFERENCED; | ||
2861 | spin_unlock(&inode->i_lock); | ||
2862 | return LRU_ROTATE; | ||
2863 | diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c | ||
2864 | index b33f9785b756..72a7681f4046 100644 | ||
2865 | --- a/fs/nfsd/nfsctl.c | ||
2866 | +++ b/fs/nfsd/nfsctl.c | ||
2867 | @@ -1239,8 +1239,8 @@ static __net_init int nfsd_init_net(struct net *net) | ||
2868 | retval = nfsd_idmap_init(net); | ||
2869 | if (retval) | ||
2870 | goto out_idmap_error; | ||
2871 | - nn->nfsd4_lease = 45; /* default lease time */ | ||
2872 | - nn->nfsd4_grace = 45; | ||
2873 | + nn->nfsd4_lease = 90; /* default lease time */ | ||
2874 | + nn->nfsd4_grace = 90; | ||
2875 | nn->somebody_reclaimed = false; | ||
2876 | nn->clverifier_counter = prandom_u32(); | ||
2877 | nn->clientid_counter = prandom_u32(); | ||
2878 | diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c | ||
2879 | index 47c3764c469b..7bcf5714ca24 100644 | ||
2880 | --- a/fs/proc/task_mmu.c | ||
2881 | +++ b/fs/proc/task_mmu.c | ||
2882 | @@ -423,7 +423,7 @@ struct mem_size_stats { | ||
2883 | }; | ||
2884 | |||
2885 | static void smaps_account(struct mem_size_stats *mss, struct page *page, | ||
2886 | - bool compound, bool young, bool dirty) | ||
2887 | + bool compound, bool young, bool dirty, bool locked) | ||
2888 | { | ||
2889 | int i, nr = compound ? 1 << compound_order(page) : 1; | ||
2890 | unsigned long size = nr * PAGE_SIZE; | ||
2891 | @@ -450,24 +450,31 @@ static void smaps_account(struct mem_size_stats *mss, struct page *page, | ||
2892 | else | ||
2893 | mss->private_clean += size; | ||
2894 | mss->pss += (u64)size << PSS_SHIFT; | ||
2895 | + if (locked) | ||
2896 | + mss->pss_locked += (u64)size << PSS_SHIFT; | ||
2897 | return; | ||
2898 | } | ||
2899 | |||
2900 | for (i = 0; i < nr; i++, page++) { | ||
2901 | int mapcount = page_mapcount(page); | ||
2902 | + unsigned long pss = (PAGE_SIZE << PSS_SHIFT); | ||
2903 | |||
2904 | if (mapcount >= 2) { | ||
2905 | if (dirty || PageDirty(page)) | ||
2906 | mss->shared_dirty += PAGE_SIZE; | ||
2907 | else | ||
2908 | mss->shared_clean += PAGE_SIZE; | ||
2909 | - mss->pss += (PAGE_SIZE << PSS_SHIFT) / mapcount; | ||
2910 | + mss->pss += pss / mapcount; | ||
2911 | + if (locked) | ||
2912 | + mss->pss_locked += pss / mapcount; | ||
2913 | } else { | ||
2914 | if (dirty || PageDirty(page)) | ||
2915 | mss->private_dirty += PAGE_SIZE; | ||
2916 | else | ||
2917 | mss->private_clean += PAGE_SIZE; | ||
2918 | - mss->pss += PAGE_SIZE << PSS_SHIFT; | ||
2919 | + mss->pss += pss; | ||
2920 | + if (locked) | ||
2921 | + mss->pss_locked += pss; | ||
2922 | } | ||
2923 | } | ||
2924 | } | ||
2925 | @@ -490,6 +497,7 @@ static void smaps_pte_entry(pte_t *pte, unsigned long addr, | ||
2926 | { | ||
2927 | struct mem_size_stats *mss = walk->private; | ||
2928 | struct vm_area_struct *vma = walk->vma; | ||
2929 | + bool locked = !!(vma->vm_flags & VM_LOCKED); | ||
2930 | struct page *page = NULL; | ||
2931 | |||
2932 | if (pte_present(*pte)) { | ||
2933 | @@ -532,7 +540,7 @@ static void smaps_pte_entry(pte_t *pte, unsigned long addr, | ||
2934 | if (!page) | ||
2935 | return; | ||
2936 | |||
2937 | - smaps_account(mss, page, false, pte_young(*pte), pte_dirty(*pte)); | ||
2938 | + smaps_account(mss, page, false, pte_young(*pte), pte_dirty(*pte), locked); | ||
2939 | } | ||
2940 | |||
2941 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
2942 | @@ -541,6 +549,7 @@ static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr, | ||
2943 | { | ||
2944 | struct mem_size_stats *mss = walk->private; | ||
2945 | struct vm_area_struct *vma = walk->vma; | ||
2946 | + bool locked = !!(vma->vm_flags & VM_LOCKED); | ||
2947 | struct page *page; | ||
2948 | |||
2949 | /* FOLL_DUMP will return -EFAULT on huge zero page */ | ||
2950 | @@ -555,7 +564,7 @@ static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr, | ||
2951 | /* pass */; | ||
2952 | else | ||
2953 | VM_BUG_ON_PAGE(1, page); | ||
2954 | - smaps_account(mss, page, true, pmd_young(*pmd), pmd_dirty(*pmd)); | ||
2955 | + smaps_account(mss, page, true, pmd_young(*pmd), pmd_dirty(*pmd), locked); | ||
2956 | } | ||
2957 | #else | ||
2958 | static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr, | ||
2959 | @@ -737,11 +746,8 @@ static void smap_gather_stats(struct vm_area_struct *vma, | ||
2960 | } | ||
2961 | } | ||
2962 | #endif | ||
2963 | - | ||
2964 | /* mmap_sem is held in m_start */ | ||
2965 | walk_page_vma(vma, &smaps_walk); | ||
2966 | - if (vma->vm_flags & VM_LOCKED) | ||
2967 | - mss->pss_locked += mss->pss; | ||
2968 | } | ||
2969 | |||
2970 | #define SEQ_PUT_DEC(str, val) \ | ||
2971 | diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h | ||
2972 | index de7377815b6b..8ef330027b13 100644 | ||
2973 | --- a/include/linux/mmc/card.h | ||
2974 | +++ b/include/linux/mmc/card.h | ||
2975 | @@ -308,6 +308,7 @@ struct mmc_card { | ||
2976 | unsigned int nr_parts; | ||
2977 | |||
2978 | unsigned int bouncesz; /* Bounce buffer size */ | ||
2979 | + struct workqueue_struct *complete_wq; /* Private workqueue */ | ||
2980 | }; | ||
2981 | |||
2982 | static inline bool mmc_large_sector(struct mmc_card *card) | ||
2983 | diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h | ||
2984 | index 53c500f0ca79..c2876e740514 100644 | ||
2985 | --- a/include/linux/perf_event.h | ||
2986 | +++ b/include/linux/perf_event.h | ||
2987 | @@ -447,6 +447,11 @@ struct pmu { | ||
2988 | * Filter events for PMU-specific reasons. | ||
2989 | */ | ||
2990 | int (*filter_match) (struct perf_event *event); /* optional */ | ||
2991 | + | ||
2992 | + /* | ||
2993 | + * Check period value for PERF_EVENT_IOC_PERIOD ioctl. | ||
2994 | + */ | ||
2995 | + int (*check_period) (struct perf_event *event, u64 value); /* optional */ | ||
2996 | }; | ||
2997 | |||
2998 | enum perf_addr_filter_action_t { | ||
2999 | diff --git a/kernel/events/core.c b/kernel/events/core.c | ||
3000 | index 84530ab358c3..699bc25d6204 100644 | ||
3001 | --- a/kernel/events/core.c | ||
3002 | +++ b/kernel/events/core.c | ||
3003 | @@ -4963,6 +4963,11 @@ static void __perf_event_period(struct perf_event *event, | ||
3004 | } | ||
3005 | } | ||
3006 | |||
3007 | +static int perf_event_check_period(struct perf_event *event, u64 value) | ||
3008 | +{ | ||
3009 | + return event->pmu->check_period(event, value); | ||
3010 | +} | ||
3011 | + | ||
3012 | static int perf_event_period(struct perf_event *event, u64 __user *arg) | ||
3013 | { | ||
3014 | u64 value; | ||
3015 | @@ -4979,6 +4984,9 @@ static int perf_event_period(struct perf_event *event, u64 __user *arg) | ||
3016 | if (event->attr.freq && value > sysctl_perf_event_sample_rate) | ||
3017 | return -EINVAL; | ||
3018 | |||
3019 | + if (perf_event_check_period(event, value)) | ||
3020 | + return -EINVAL; | ||
3021 | + | ||
3022 | event_function_call(event, __perf_event_period, &value); | ||
3023 | |||
3024 | return 0; | ||
3025 | @@ -9391,6 +9399,11 @@ static int perf_pmu_nop_int(struct pmu *pmu) | ||
3026 | return 0; | ||
3027 | } | ||
3028 | |||
3029 | +static int perf_event_nop_int(struct perf_event *event, u64 value) | ||
3030 | +{ | ||
3031 | + return 0; | ||
3032 | +} | ||
3033 | + | ||
3034 | static DEFINE_PER_CPU(unsigned int, nop_txn_flags); | ||
3035 | |||
3036 | static void perf_pmu_start_txn(struct pmu *pmu, unsigned int flags) | ||
3037 | @@ -9691,6 +9704,9 @@ got_cpu_context: | ||
3038 | pmu->pmu_disable = perf_pmu_nop_void; | ||
3039 | } | ||
3040 | |||
3041 | + if (!pmu->check_period) | ||
3042 | + pmu->check_period = perf_event_nop_int; | ||
3043 | + | ||
3044 | if (!pmu->event_idx) | ||
3045 | pmu->event_idx = perf_event_idx_default; | ||
3046 | |||
3047 | diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c | ||
3048 | index 309ef5a64af5..5ab4fe3b1dcc 100644 | ||
3049 | --- a/kernel/events/ring_buffer.c | ||
3050 | +++ b/kernel/events/ring_buffer.c | ||
3051 | @@ -734,7 +734,7 @@ struct ring_buffer *rb_alloc(int nr_pages, long watermark, int cpu, int flags) | ||
3052 | size = sizeof(struct ring_buffer); | ||
3053 | size += nr_pages * sizeof(void *); | ||
3054 | |||
3055 | - if (order_base_2(size) >= MAX_ORDER) | ||
3056 | + if (order_base_2(size) >= PAGE_SHIFT+MAX_ORDER) | ||
3057 | goto fail; | ||
3058 | |||
3059 | rb = kzalloc(size, GFP_KERNEL); | ||
3060 | diff --git a/kernel/signal.c b/kernel/signal.c | ||
3061 | index cf4cf68c3ea8..ac969af3e9a0 100644 | ||
3062 | --- a/kernel/signal.c | ||
3063 | +++ b/kernel/signal.c | ||
3064 | @@ -2436,9 +2436,12 @@ relock: | ||
3065 | } | ||
3066 | |||
3067 | /* Has this task already been marked for death? */ | ||
3068 | - ksig->info.si_signo = signr = SIGKILL; | ||
3069 | - if (signal_group_exit(signal)) | ||
3070 | + if (signal_group_exit(signal)) { | ||
3071 | + ksig->info.si_signo = signr = SIGKILL; | ||
3072 | + sigdelset(¤t->pending.signal, SIGKILL); | ||
3073 | + recalc_sigpending(); | ||
3074 | goto fatal; | ||
3075 | + } | ||
3076 | |||
3077 | for (;;) { | ||
3078 | struct k_sigaction *ka; | ||
3079 | diff --git a/kernel/trace/trace_probe_tmpl.h b/kernel/trace/trace_probe_tmpl.h | ||
3080 | index 5c56afc17cf8..4737bb8c07a3 100644 | ||
3081 | --- a/kernel/trace/trace_probe_tmpl.h | ||
3082 | +++ b/kernel/trace/trace_probe_tmpl.h | ||
3083 | @@ -180,10 +180,12 @@ store_trace_args(void *data, struct trace_probe *tp, struct pt_regs *regs, | ||
3084 | if (unlikely(arg->dynamic)) | ||
3085 | *dl = make_data_loc(maxlen, dyndata - base); | ||
3086 | ret = process_fetch_insn(arg->code, regs, dl, base); | ||
3087 | - if (unlikely(ret < 0 && arg->dynamic)) | ||
3088 | + if (unlikely(ret < 0 && arg->dynamic)) { | ||
3089 | *dl = make_data_loc(0, dyndata - base); | ||
3090 | - else | ||
3091 | + } else { | ||
3092 | dyndata += ret; | ||
3093 | + maxlen -= ret; | ||
3094 | + } | ||
3095 | } | ||
3096 | } | ||
3097 | |||
3098 | diff --git a/mm/vmscan.c b/mm/vmscan.c | ||
3099 | index 62ac0c488624..8e377bbac3a6 100644 | ||
3100 | --- a/mm/vmscan.c | ||
3101 | +++ b/mm/vmscan.c | ||
3102 | @@ -487,16 +487,6 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl, | ||
3103 | delta = freeable / 2; | ||
3104 | } | ||
3105 | |||
3106 | - /* | ||
3107 | - * Make sure we apply some minimal pressure on default priority | ||
3108 | - * even on small cgroups. Stale objects are not only consuming memory | ||
3109 | - * by themselves, but can also hold a reference to a dying cgroup, | ||
3110 | - * preventing it from being reclaimed. A dying cgroup with all | ||
3111 | - * corresponding structures like per-cpu stats and kmem caches | ||
3112 | - * can be really big, so it may lead to a significant waste of memory. | ||
3113 | - */ | ||
3114 | - delta = max_t(unsigned long long, delta, min(freeable, batch_size)); | ||
3115 | - | ||
3116 | total_scan += delta; | ||
3117 | if (total_scan < 0) { | ||
3118 | pr_err("shrink_slab: %pF negative objects to delete nr=%ld\n", | ||
3119 | diff --git a/net/sunrpc/auth_gss/gss_krb5_seqnum.c b/net/sunrpc/auth_gss/gss_krb5_seqnum.c | ||
3120 | index fb6656295204..507105127095 100644 | ||
3121 | --- a/net/sunrpc/auth_gss/gss_krb5_seqnum.c | ||
3122 | +++ b/net/sunrpc/auth_gss/gss_krb5_seqnum.c | ||
3123 | @@ -44,7 +44,7 @@ krb5_make_rc4_seq_num(struct krb5_ctx *kctx, int direction, s32 seqnum, | ||
3124 | unsigned char *cksum, unsigned char *buf) | ||
3125 | { | ||
3126 | struct crypto_sync_skcipher *cipher; | ||
3127 | - unsigned char plain[8]; | ||
3128 | + unsigned char *plain; | ||
3129 | s32 code; | ||
3130 | |||
3131 | dprintk("RPC: %s:\n", __func__); | ||
3132 | @@ -52,6 +52,10 @@ krb5_make_rc4_seq_num(struct krb5_ctx *kctx, int direction, s32 seqnum, | ||
3133 | if (IS_ERR(cipher)) | ||
3134 | return PTR_ERR(cipher); | ||
3135 | |||
3136 | + plain = kmalloc(8, GFP_NOFS); | ||
3137 | + if (!plain) | ||
3138 | + return -ENOMEM; | ||
3139 | + | ||
3140 | plain[0] = (unsigned char) ((seqnum >> 24) & 0xff); | ||
3141 | plain[1] = (unsigned char) ((seqnum >> 16) & 0xff); | ||
3142 | plain[2] = (unsigned char) ((seqnum >> 8) & 0xff); | ||
3143 | @@ -67,6 +71,7 @@ krb5_make_rc4_seq_num(struct krb5_ctx *kctx, int direction, s32 seqnum, | ||
3144 | |||
3145 | code = krb5_encrypt(cipher, cksum, plain, buf, 8); | ||
3146 | out: | ||
3147 | + kfree(plain); | ||
3148 | crypto_free_sync_skcipher(cipher); | ||
3149 | return code; | ||
3150 | } | ||
3151 | @@ -77,12 +82,17 @@ krb5_make_seq_num(struct krb5_ctx *kctx, | ||
3152 | u32 seqnum, | ||
3153 | unsigned char *cksum, unsigned char *buf) | ||
3154 | { | ||
3155 | - unsigned char plain[8]; | ||
3156 | + unsigned char *plain; | ||
3157 | + s32 code; | ||
3158 | |||
3159 | if (kctx->enctype == ENCTYPE_ARCFOUR_HMAC) | ||
3160 | return krb5_make_rc4_seq_num(kctx, direction, seqnum, | ||
3161 | cksum, buf); | ||
3162 | |||
3163 | + plain = kmalloc(8, GFP_NOFS); | ||
3164 | + if (!plain) | ||
3165 | + return -ENOMEM; | ||
3166 | + | ||
3167 | plain[0] = (unsigned char) (seqnum & 0xff); | ||
3168 | plain[1] = (unsigned char) ((seqnum >> 8) & 0xff); | ||
3169 | plain[2] = (unsigned char) ((seqnum >> 16) & 0xff); | ||
3170 | @@ -93,7 +103,9 @@ krb5_make_seq_num(struct krb5_ctx *kctx, | ||
3171 | plain[6] = direction; | ||
3172 | plain[7] = direction; | ||
3173 | |||
3174 | - return krb5_encrypt(key, cksum, plain, buf, 8); | ||
3175 | + code = krb5_encrypt(key, cksum, plain, buf, 8); | ||
3176 | + kfree(plain); | ||
3177 | + return code; | ||
3178 | } | ||
3179 | |||
3180 | static s32 | ||
3181 | @@ -101,7 +113,7 @@ krb5_get_rc4_seq_num(struct krb5_ctx *kctx, unsigned char *cksum, | ||
3182 | unsigned char *buf, int *direction, s32 *seqnum) | ||
3183 | { | ||
3184 | struct crypto_sync_skcipher *cipher; | ||
3185 | - unsigned char plain[8]; | ||
3186 | + unsigned char *plain; | ||
3187 | s32 code; | ||
3188 | |||
3189 | dprintk("RPC: %s:\n", __func__); | ||
3190 | @@ -113,20 +125,28 @@ krb5_get_rc4_seq_num(struct krb5_ctx *kctx, unsigned char *cksum, | ||
3191 | if (code) | ||
3192 | goto out; | ||
3193 | |||
3194 | + plain = kmalloc(8, GFP_NOFS); | ||
3195 | + if (!plain) { | ||
3196 | + code = -ENOMEM; | ||
3197 | + goto out; | ||
3198 | + } | ||
3199 | + | ||
3200 | code = krb5_decrypt(cipher, cksum, buf, plain, 8); | ||
3201 | if (code) | ||
3202 | - goto out; | ||
3203 | + goto out_plain; | ||
3204 | |||
3205 | if ((plain[4] != plain[5]) || (plain[4] != plain[6]) | ||
3206 | || (plain[4] != plain[7])) { | ||
3207 | code = (s32)KG_BAD_SEQ; | ||
3208 | - goto out; | ||
3209 | + goto out_plain; | ||
3210 | } | ||
3211 | |||
3212 | *direction = plain[4]; | ||
3213 | |||
3214 | *seqnum = ((plain[0] << 24) | (plain[1] << 16) | | ||
3215 | (plain[2] << 8) | (plain[3])); | ||
3216 | +out_plain: | ||
3217 | + kfree(plain); | ||
3218 | out: | ||
3219 | crypto_free_sync_skcipher(cipher); | ||
3220 | return code; | ||
3221 | @@ -139,7 +159,7 @@ krb5_get_seq_num(struct krb5_ctx *kctx, | ||
3222 | int *direction, u32 *seqnum) | ||
3223 | { | ||
3224 | s32 code; | ||
3225 | - unsigned char plain[8]; | ||
3226 | + unsigned char *plain; | ||
3227 | struct crypto_sync_skcipher *key = kctx->seq; | ||
3228 | |||
3229 | dprintk("RPC: krb5_get_seq_num:\n"); | ||
3230 | @@ -147,18 +167,25 @@ krb5_get_seq_num(struct krb5_ctx *kctx, | ||
3231 | if (kctx->enctype == ENCTYPE_ARCFOUR_HMAC) | ||
3232 | return krb5_get_rc4_seq_num(kctx, cksum, buf, | ||
3233 | direction, seqnum); | ||
3234 | + plain = kmalloc(8, GFP_NOFS); | ||
3235 | + if (!plain) | ||
3236 | + return -ENOMEM; | ||
3237 | |||
3238 | if ((code = krb5_decrypt(key, cksum, buf, plain, 8))) | ||
3239 | - return code; | ||
3240 | + goto out; | ||
3241 | |||
3242 | if ((plain[4] != plain[5]) || (plain[4] != plain[6]) || | ||
3243 | - (plain[4] != plain[7])) | ||
3244 | - return (s32)KG_BAD_SEQ; | ||
3245 | + (plain[4] != plain[7])) { | ||
3246 | + code = (s32)KG_BAD_SEQ; | ||
3247 | + goto out; | ||
3248 | + } | ||
3249 | |||
3250 | *direction = plain[4]; | ||
3251 | |||
3252 | *seqnum = ((plain[0]) | | ||
3253 | (plain[1] << 8) | (plain[2] << 16) | (plain[3] << 24)); | ||
3254 | |||
3255 | - return 0; | ||
3256 | +out: | ||
3257 | + kfree(plain); | ||
3258 | + return code; | ||
3259 | } | ||
3260 | diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c | ||
3261 | index 6c99fa8ac5fa..6c0b30391ba9 100644 | ||
3262 | --- a/sound/core/pcm_lib.c | ||
3263 | +++ b/sound/core/pcm_lib.c | ||
3264 | @@ -2112,13 +2112,6 @@ int pcm_lib_apply_appl_ptr(struct snd_pcm_substream *substream, | ||
3265 | return 0; | ||
3266 | } | ||
3267 | |||
3268 | -/* allow waiting for a capture stream that hasn't been started */ | ||
3269 | -#if IS_ENABLED(CONFIG_SND_PCM_OSS) | ||
3270 | -#define wait_capture_start(substream) ((substream)->oss.oss) | ||
3271 | -#else | ||
3272 | -#define wait_capture_start(substream) false | ||
3273 | -#endif | ||
3274 | - | ||
3275 | /* the common loop for read/write data */ | ||
3276 | snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream, | ||
3277 | void *data, bool interleaved, | ||
3278 | @@ -2184,16 +2177,11 @@ snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream, | ||
3279 | snd_pcm_update_hw_ptr(substream); | ||
3280 | |||
3281 | if (!is_playback && | ||
3282 | - runtime->status->state == SNDRV_PCM_STATE_PREPARED) { | ||
3283 | - if (size >= runtime->start_threshold) { | ||
3284 | - err = snd_pcm_start(substream); | ||
3285 | - if (err < 0) | ||
3286 | - goto _end_unlock; | ||
3287 | - } else if (!wait_capture_start(substream)) { | ||
3288 | - /* nothing to do */ | ||
3289 | - err = 0; | ||
3290 | + runtime->status->state == SNDRV_PCM_STATE_PREPARED && | ||
3291 | + size >= runtime->start_threshold) { | ||
3292 | + err = snd_pcm_start(substream); | ||
3293 | + if (err < 0) | ||
3294 | goto _end_unlock; | ||
3295 | - } | ||
3296 | } | ||
3297 | |||
3298 | avail = snd_pcm_avail(substream); | ||
3299 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c | ||
3300 | index 152f54137082..a4ee7656d9ee 100644 | ||
3301 | --- a/sound/pci/hda/patch_conexant.c | ||
3302 | +++ b/sound/pci/hda/patch_conexant.c | ||
3303 | @@ -924,6 +924,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = { | ||
3304 | SND_PCI_QUIRK(0x103c, 0x807C, "HP EliteBook 820 G3", CXT_FIXUP_HP_DOCK), | ||
3305 | SND_PCI_QUIRK(0x103c, 0x80FD, "HP ProBook 640 G2", CXT_FIXUP_HP_DOCK), | ||
3306 | SND_PCI_QUIRK(0x103c, 0x828c, "HP EliteBook 840 G4", CXT_FIXUP_HP_DOCK), | ||
3307 | + SND_PCI_QUIRK(0x103c, 0x83b2, "HP EliteBook 840 G5", CXT_FIXUP_HP_DOCK), | ||
3308 | SND_PCI_QUIRK(0x103c, 0x83b3, "HP EliteBook 830 G5", CXT_FIXUP_HP_DOCK), | ||
3309 | SND_PCI_QUIRK(0x103c, 0x83d3, "HP ProBook 640 G4", CXT_FIXUP_HP_DOCK), | ||
3310 | SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE), | ||
3311 | diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c | ||
3312 | index d00734d31e04..e5b6769b9797 100644 | ||
3313 | --- a/sound/soc/codecs/hdmi-codec.c | ||
3314 | +++ b/sound/soc/codecs/hdmi-codec.c | ||
3315 | @@ -795,6 +795,8 @@ static int hdmi_codec_probe(struct platform_device *pdev) | ||
3316 | if (hcd->spdif) | ||
3317 | hcp->daidrv[i] = hdmi_spdif_dai; | ||
3318 | |||
3319 | + dev_set_drvdata(dev, hcp); | ||
3320 | + | ||
3321 | ret = devm_snd_soc_register_component(dev, &hdmi_driver, hcp->daidrv, | ||
3322 | dai_count); | ||
3323 | if (ret) { | ||
3324 | @@ -802,8 +804,6 @@ static int hdmi_codec_probe(struct platform_device *pdev) | ||
3325 | __func__, ret); | ||
3326 | return ret; | ||
3327 | } | ||
3328 | - | ||
3329 | - dev_set_drvdata(dev, hcp); | ||
3330 | return 0; | ||
3331 | } | ||
3332 | |||
3333 | diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c | ||
3334 | index 382847154227..db114f3977e0 100644 | ||
3335 | --- a/sound/usb/pcm.c | ||
3336 | +++ b/sound/usb/pcm.c | ||
3337 | @@ -314,6 +314,9 @@ static int search_roland_implicit_fb(struct usb_device *dev, int ifnum, | ||
3338 | return 0; | ||
3339 | } | ||
3340 | |||
3341 | +/* Setup an implicit feedback endpoint from a quirk. Returns 0 if no quirk | ||
3342 | + * applies. Returns 1 if a quirk was found. | ||
3343 | + */ | ||
3344 | static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs, | ||
3345 | struct usb_device *dev, | ||
3346 | struct usb_interface_descriptor *altsd, | ||
3347 | @@ -384,7 +387,7 @@ add_sync_ep: | ||
3348 | |||
3349 | subs->data_endpoint->sync_master = subs->sync_endpoint; | ||
3350 | |||
3351 | - return 0; | ||
3352 | + return 1; | ||
3353 | } | ||
3354 | |||
3355 | static int set_sync_endpoint(struct snd_usb_substream *subs, | ||
3356 | @@ -423,6 +426,10 @@ static int set_sync_endpoint(struct snd_usb_substream *subs, | ||
3357 | if (err < 0) | ||
3358 | return err; | ||
3359 | |||
3360 | + /* endpoint set by quirk */ | ||
3361 | + if (err > 0) | ||
3362 | + return 0; | ||
3363 | + | ||
3364 | if (altsd->bNumEndpoints < 2) | ||
3365 | return 0; | ||
3366 | |||
3367 | diff --git a/tools/arch/riscv/include/uapi/asm/bitsperlong.h b/tools/arch/riscv/include/uapi/asm/bitsperlong.h | ||
3368 | new file mode 100644 | ||
3369 | index 000000000000..0b3cb52fd29d | ||
3370 | --- /dev/null | ||
3371 | +++ b/tools/arch/riscv/include/uapi/asm/bitsperlong.h | ||
3372 | @@ -0,0 +1,25 @@ | ||
3373 | +/* | ||
3374 | + * Copyright (C) 2012 ARM Ltd. | ||
3375 | + * Copyright (C) 2015 Regents of the University of California | ||
3376 | + * | ||
3377 | + * This program is free software; you can redistribute it and/or modify | ||
3378 | + * it under the terms of the GNU General Public License version 2 as | ||
3379 | + * published by the Free Software Foundation. | ||
3380 | + * | ||
3381 | + * This program is distributed in the hope that it will be useful, | ||
3382 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
3383 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
3384 | + * GNU General Public License for more details. | ||
3385 | + * | ||
3386 | + * You should have received a copy of the GNU General Public License | ||
3387 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
3388 | + */ | ||
3389 | + | ||
3390 | +#ifndef _UAPI_ASM_RISCV_BITSPERLONG_H | ||
3391 | +#define _UAPI_ASM_RISCV_BITSPERLONG_H | ||
3392 | + | ||
3393 | +#define __BITS_PER_LONG (__SIZEOF_POINTER__ * 8) | ||
3394 | + | ||
3395 | +#include <asm-generic/bitsperlong.h> | ||
3396 | + | ||
3397 | +#endif /* _UAPI_ASM_RISCV_BITSPERLONG_H */ | ||
3398 | diff --git a/tools/include/uapi/asm/bitsperlong.h b/tools/include/uapi/asm/bitsperlong.h | ||
3399 | index 8dd6aefdafa4..57aaeaf8e192 100644 | ||
3400 | --- a/tools/include/uapi/asm/bitsperlong.h | ||
3401 | +++ b/tools/include/uapi/asm/bitsperlong.h | ||
3402 | @@ -13,6 +13,10 @@ | ||
3403 | #include "../../arch/mips/include/uapi/asm/bitsperlong.h" | ||
3404 | #elif defined(__ia64__) | ||
3405 | #include "../../arch/ia64/include/uapi/asm/bitsperlong.h" | ||
3406 | +#elif defined(__riscv) | ||
3407 | +#include "../../arch/riscv/include/uapi/asm/bitsperlong.h" | ||
3408 | +#elif defined(__alpha__) | ||
3409 | +#include "../../arch/alpha/include/uapi/asm/bitsperlong.h" | ||
3410 | #else | ||
3411 | #include <asm-generic/bitsperlong.h> | ||
3412 | #endif | ||
3413 | diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c | ||
3414 | index 1410d66192f7..63a3afc7f32b 100644 | ||
3415 | --- a/tools/perf/builtin-stat.c | ||
3416 | +++ b/tools/perf/builtin-stat.c | ||
3417 | @@ -561,7 +561,8 @@ try_again: | ||
3418 | break; | ||
3419 | } | ||
3420 | } | ||
3421 | - wait4(child_pid, &status, 0, &stat_config.ru_data); | ||
3422 | + if (child_pid != -1) | ||
3423 | + wait4(child_pid, &status, 0, &stat_config.ru_data); | ||
3424 | |||
3425 | if (workload_exec_errno) { | ||
3426 | const char *emsg = str_error_r(workload_exec_errno, msg, sizeof(msg)); | ||
3427 | diff --git a/tools/perf/tests/shell/lib/probe_vfs_getname.sh b/tools/perf/tests/shell/lib/probe_vfs_getname.sh | ||
3428 | index 1c16e56cd93e..7cb99b433888 100644 | ||
3429 | --- a/tools/perf/tests/shell/lib/probe_vfs_getname.sh | ||
3430 | +++ b/tools/perf/tests/shell/lib/probe_vfs_getname.sh | ||
3431 | @@ -13,7 +13,8 @@ add_probe_vfs_getname() { | ||
3432 | local verbose=$1 | ||
3433 | if [ $had_vfs_getname -eq 1 ] ; then | ||
3434 | line=$(perf probe -L getname_flags 2>&1 | egrep 'result.*=.*filename;' | sed -r 's/[[:space:]]+([[:digit:]]+)[[:space:]]+result->uptr.*/\1/') | ||
3435 | - perf probe $verbose "vfs_getname=getname_flags:${line} pathname=result->name:string" | ||
3436 | + perf probe -q "vfs_getname=getname_flags:${line} pathname=result->name:string" || \ | ||
3437 | + perf probe $verbose "vfs_getname=getname_flags:${line} pathname=filename:string" | ||
3438 | fi | ||
3439 | } | ||
3440 | |||
3441 | diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c | ||
3442 | index 32ef7bdca1cf..dc2212e12184 100644 | ||
3443 | --- a/tools/perf/util/callchain.c | ||
3444 | +++ b/tools/perf/util/callchain.c | ||
3445 | @@ -766,6 +766,7 @@ static enum match_result match_chain(struct callchain_cursor_node *node, | ||
3446 | cnode->cycles_count += node->branch_flags.cycles; | ||
3447 | cnode->iter_count += node->nr_loop_iter; | ||
3448 | cnode->iter_cycles += node->iter_cycles; | ||
3449 | + cnode->from_count++; | ||
3450 | } | ||
3451 | } | ||
3452 | |||
3453 | @@ -1345,10 +1346,10 @@ static int branch_to_str(char *bf, int bfsize, | ||
3454 | static int branch_from_str(char *bf, int bfsize, | ||
3455 | u64 branch_count, | ||
3456 | u64 cycles_count, u64 iter_count, | ||
3457 | - u64 iter_cycles) | ||
3458 | + u64 iter_cycles, u64 from_count) | ||
3459 | { | ||
3460 | int printed = 0, i = 0; | ||
3461 | - u64 cycles; | ||
3462 | + u64 cycles, v = 0; | ||
3463 | |||
3464 | cycles = cycles_count / branch_count; | ||
3465 | if (cycles) { | ||
3466 | @@ -1357,14 +1358,16 @@ static int branch_from_str(char *bf, int bfsize, | ||
3467 | bf + printed, bfsize - printed); | ||
3468 | } | ||
3469 | |||
3470 | - if (iter_count) { | ||
3471 | - printed += count_pri64_printf(i++, "iter", | ||
3472 | - iter_count, | ||
3473 | - bf + printed, bfsize - printed); | ||
3474 | + if (iter_count && from_count) { | ||
3475 | + v = iter_count / from_count; | ||
3476 | + if (v) { | ||
3477 | + printed += count_pri64_printf(i++, "iter", | ||
3478 | + v, bf + printed, bfsize - printed); | ||
3479 | |||
3480 | - printed += count_pri64_printf(i++, "avg_cycles", | ||
3481 | - iter_cycles / iter_count, | ||
3482 | - bf + printed, bfsize - printed); | ||
3483 | + printed += count_pri64_printf(i++, "avg_cycles", | ||
3484 | + iter_cycles / iter_count, | ||
3485 | + bf + printed, bfsize - printed); | ||
3486 | + } | ||
3487 | } | ||
3488 | |||
3489 | if (i) | ||
3490 | @@ -1377,6 +1380,7 @@ static int counts_str_build(char *bf, int bfsize, | ||
3491 | u64 branch_count, u64 predicted_count, | ||
3492 | u64 abort_count, u64 cycles_count, | ||
3493 | u64 iter_count, u64 iter_cycles, | ||
3494 | + u64 from_count, | ||
3495 | struct branch_type_stat *brtype_stat) | ||
3496 | { | ||
3497 | int printed; | ||
3498 | @@ -1389,7 +1393,8 @@ static int counts_str_build(char *bf, int bfsize, | ||
3499 | predicted_count, abort_count, brtype_stat); | ||
3500 | } else { | ||
3501 | printed = branch_from_str(bf, bfsize, branch_count, | ||
3502 | - cycles_count, iter_count, iter_cycles); | ||
3503 | + cycles_count, iter_count, iter_cycles, | ||
3504 | + from_count); | ||
3505 | } | ||
3506 | |||
3507 | if (!printed) | ||
3508 | @@ -1402,13 +1407,14 @@ static int callchain_counts_printf(FILE *fp, char *bf, int bfsize, | ||
3509 | u64 branch_count, u64 predicted_count, | ||
3510 | u64 abort_count, u64 cycles_count, | ||
3511 | u64 iter_count, u64 iter_cycles, | ||
3512 | + u64 from_count, | ||
3513 | struct branch_type_stat *brtype_stat) | ||
3514 | { | ||
3515 | char str[256]; | ||
3516 | |||
3517 | counts_str_build(str, sizeof(str), branch_count, | ||
3518 | predicted_count, abort_count, cycles_count, | ||
3519 | - iter_count, iter_cycles, brtype_stat); | ||
3520 | + iter_count, iter_cycles, from_count, brtype_stat); | ||
3521 | |||
3522 | if (fp) | ||
3523 | return fprintf(fp, "%s", str); | ||
3524 | @@ -1422,6 +1428,7 @@ int callchain_list_counts__printf_value(struct callchain_list *clist, | ||
3525 | u64 branch_count, predicted_count; | ||
3526 | u64 abort_count, cycles_count; | ||
3527 | u64 iter_count, iter_cycles; | ||
3528 | + u64 from_count; | ||
3529 | |||
3530 | branch_count = clist->branch_count; | ||
3531 | predicted_count = clist->predicted_count; | ||
3532 | @@ -1429,11 +1436,12 @@ int callchain_list_counts__printf_value(struct callchain_list *clist, | ||
3533 | cycles_count = clist->cycles_count; | ||
3534 | iter_count = clist->iter_count; | ||
3535 | iter_cycles = clist->iter_cycles; | ||
3536 | + from_count = clist->from_count; | ||
3537 | |||
3538 | return callchain_counts_printf(fp, bf, bfsize, branch_count, | ||
3539 | predicted_count, abort_count, | ||
3540 | cycles_count, iter_count, iter_cycles, | ||
3541 | - &clist->brtype_stat); | ||
3542 | + from_count, &clist->brtype_stat); | ||
3543 | } | ||
3544 | |||
3545 | static void free_callchain_node(struct callchain_node *node) | ||
3546 | diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h | ||
3547 | index 154560b1eb65..99d38ac019b8 100644 | ||
3548 | --- a/tools/perf/util/callchain.h | ||
3549 | +++ b/tools/perf/util/callchain.h | ||
3550 | @@ -118,6 +118,7 @@ struct callchain_list { | ||
3551 | bool has_children; | ||
3552 | }; | ||
3553 | u64 branch_count; | ||
3554 | + u64 from_count; | ||
3555 | u64 predicted_count; | ||
3556 | u64 abort_count; | ||
3557 | u64 cycles_count; | ||
3558 | diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c | ||
3559 | index 9397e3f2444d..ea228dd0a187 100644 | ||
3560 | --- a/tools/perf/util/machine.c | ||
3561 | +++ b/tools/perf/util/machine.c | ||
3562 | @@ -2005,7 +2005,7 @@ static void save_iterations(struct iterations *iter, | ||
3563 | { | ||
3564 | int i; | ||
3565 | |||
3566 | - iter->nr_loop_iter = nr; | ||
3567 | + iter->nr_loop_iter++; | ||
3568 | iter->cycles = 0; | ||
3569 | |||
3570 | for (i = 0; i < nr; i++) |