Annotation of /trunk/kernel-magellan/patches-4.15/0104-4.15.5-all-fixes.patch
Parent Directory | Revision Log
Revision 3088 -
(hide annotations)
(download)
Wed Mar 21 14:52:30 2018 UTC (6 years, 1 month ago) by niro
File size: 222027 byte(s)
Wed Mar 21 14:52:30 2018 UTC (6 years, 1 month ago) by niro
File size: 222027 byte(s)
-linux-4.15.5
1 | niro | 3088 | diff --git a/Documentation/devicetree/bindings/dma/snps-dma.txt b/Documentation/devicetree/bindings/dma/snps-dma.txt |
2 | index a122723907ac..99acc712f83a 100644 | ||
3 | --- a/Documentation/devicetree/bindings/dma/snps-dma.txt | ||
4 | +++ b/Documentation/devicetree/bindings/dma/snps-dma.txt | ||
5 | @@ -64,6 +64,6 @@ Example: | ||
6 | reg = <0xe0000000 0x1000>; | ||
7 | interrupts = <0 35 0x4>; | ||
8 | dmas = <&dmahost 12 0 1>, | ||
9 | - <&dmahost 13 0 1 0>; | ||
10 | + <&dmahost 13 1 0>; | ||
11 | dma-names = "rx", "rx"; | ||
12 | }; | ||
13 | diff --git a/Documentation/filesystems/ext4.txt b/Documentation/filesystems/ext4.txt | ||
14 | index 75236c0c2ac2..d081ce0482cc 100644 | ||
15 | --- a/Documentation/filesystems/ext4.txt | ||
16 | +++ b/Documentation/filesystems/ext4.txt | ||
17 | @@ -233,7 +233,7 @@ data_err=ignore(*) Just print an error message if an error occurs | ||
18 | data_err=abort Abort the journal if an error occurs in a file | ||
19 | data buffer in ordered mode. | ||
20 | |||
21 | -grpid Give objects the same group ID as their creator. | ||
22 | +grpid New objects have the group ID of their parent. | ||
23 | bsdgroups | ||
24 | |||
25 | nogrpid (*) New objects have the group ID of their creator. | ||
26 | diff --git a/Makefile b/Makefile | ||
27 | index 8495e1ca052e..28c537fbe328 100644 | ||
28 | --- a/Makefile | ||
29 | +++ b/Makefile | ||
30 | @@ -1,7 +1,7 @@ | ||
31 | # SPDX-License-Identifier: GPL-2.0 | ||
32 | VERSION = 4 | ||
33 | PATCHLEVEL = 15 | ||
34 | -SUBLEVEL = 4 | ||
35 | +SUBLEVEL = 5 | ||
36 | EXTRAVERSION = | ||
37 | NAME = Fearless Coyote | ||
38 | |||
39 | diff --git a/arch/arm/boot/dts/arm-realview-eb-mp.dtsi b/arch/arm/boot/dts/arm-realview-eb-mp.dtsi | ||
40 | index 7b8d90b7aeea..29b636fce23f 100644 | ||
41 | --- a/arch/arm/boot/dts/arm-realview-eb-mp.dtsi | ||
42 | +++ b/arch/arm/boot/dts/arm-realview-eb-mp.dtsi | ||
43 | @@ -150,11 +150,6 @@ | ||
44 | interrupts = <0 8 IRQ_TYPE_LEVEL_HIGH>; | ||
45 | }; | ||
46 | |||
47 | -&charlcd { | ||
48 | - interrupt-parent = <&intc>; | ||
49 | - interrupts = <0 IRQ_TYPE_LEVEL_HIGH>; | ||
50 | -}; | ||
51 | - | ||
52 | &serial0 { | ||
53 | interrupt-parent = <&intc>; | ||
54 | interrupts = <0 4 IRQ_TYPE_LEVEL_HIGH>; | ||
55 | diff --git a/arch/arm/boot/dts/exynos5410.dtsi b/arch/arm/boot/dts/exynos5410.dtsi | ||
56 | index 06713ec86f0d..d2174727df9a 100644 | ||
57 | --- a/arch/arm/boot/dts/exynos5410.dtsi | ||
58 | +++ b/arch/arm/boot/dts/exynos5410.dtsi | ||
59 | @@ -333,7 +333,6 @@ | ||
60 | &rtc { | ||
61 | clocks = <&clock CLK_RTC>; | ||
62 | clock-names = "rtc"; | ||
63 | - interrupt-parent = <&pmu_system_controller>; | ||
64 | status = "disabled"; | ||
65 | }; | ||
66 | |||
67 | diff --git a/arch/arm/boot/dts/lpc3250-ea3250.dts b/arch/arm/boot/dts/lpc3250-ea3250.dts | ||
68 | index c43adb7b4d7c..58ea0a4e7afa 100644 | ||
69 | --- a/arch/arm/boot/dts/lpc3250-ea3250.dts | ||
70 | +++ b/arch/arm/boot/dts/lpc3250-ea3250.dts | ||
71 | @@ -156,8 +156,8 @@ | ||
72 | uda1380: uda1380@18 { | ||
73 | compatible = "nxp,uda1380"; | ||
74 | reg = <0x18>; | ||
75 | - power-gpio = <&gpio 0x59 0>; | ||
76 | - reset-gpio = <&gpio 0x51 0>; | ||
77 | + power-gpio = <&gpio 3 10 0>; | ||
78 | + reset-gpio = <&gpio 3 2 0>; | ||
79 | dac-clk = "wspll"; | ||
80 | }; | ||
81 | |||
82 | diff --git a/arch/arm/boot/dts/lpc3250-phy3250.dts b/arch/arm/boot/dts/lpc3250-phy3250.dts | ||
83 | index c72eb9845603..1e1c2f517a82 100644 | ||
84 | --- a/arch/arm/boot/dts/lpc3250-phy3250.dts | ||
85 | +++ b/arch/arm/boot/dts/lpc3250-phy3250.dts | ||
86 | @@ -81,8 +81,8 @@ | ||
87 | uda1380: uda1380@18 { | ||
88 | compatible = "nxp,uda1380"; | ||
89 | reg = <0x18>; | ||
90 | - power-gpio = <&gpio 0x59 0>; | ||
91 | - reset-gpio = <&gpio 0x51 0>; | ||
92 | + power-gpio = <&gpio 3 10 0>; | ||
93 | + reset-gpio = <&gpio 3 2 0>; | ||
94 | dac-clk = "wspll"; | ||
95 | }; | ||
96 | |||
97 | diff --git a/arch/arm/boot/dts/mt2701.dtsi b/arch/arm/boot/dts/mt2701.dtsi | ||
98 | index 965ddfbc9953..05557fce0f1d 100644 | ||
99 | --- a/arch/arm/boot/dts/mt2701.dtsi | ||
100 | +++ b/arch/arm/boot/dts/mt2701.dtsi | ||
101 | @@ -604,6 +604,7 @@ | ||
102 | compatible = "mediatek,mt2701-hifsys", "syscon"; | ||
103 | reg = <0 0x1a000000 0 0x1000>; | ||
104 | #clock-cells = <1>; | ||
105 | + #reset-cells = <1>; | ||
106 | }; | ||
107 | |||
108 | usb0: usb@1a1c0000 { | ||
109 | @@ -688,6 +689,7 @@ | ||
110 | compatible = "mediatek,mt2701-ethsys", "syscon"; | ||
111 | reg = <0 0x1b000000 0 0x1000>; | ||
112 | #clock-cells = <1>; | ||
113 | + #reset-cells = <1>; | ||
114 | }; | ||
115 | |||
116 | eth: ethernet@1b100000 { | ||
117 | diff --git a/arch/arm/boot/dts/mt7623.dtsi b/arch/arm/boot/dts/mt7623.dtsi | ||
118 | index 0640fb75bf59..3a442a16ea06 100644 | ||
119 | --- a/arch/arm/boot/dts/mt7623.dtsi | ||
120 | +++ b/arch/arm/boot/dts/mt7623.dtsi | ||
121 | @@ -758,6 +758,7 @@ | ||
122 | "syscon"; | ||
123 | reg = <0 0x1b000000 0 0x1000>; | ||
124 | #clock-cells = <1>; | ||
125 | + #reset-cells = <1>; | ||
126 | }; | ||
127 | |||
128 | eth: ethernet@1b100000 { | ||
129 | diff --git a/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts b/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts | ||
130 | index 688a86378cee..7bf5aa2237c9 100644 | ||
131 | --- a/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts | ||
132 | +++ b/arch/arm/boot/dts/mt7623n-bananapi-bpi-r2.dts | ||
133 | @@ -204,7 +204,7 @@ | ||
134 | bus-width = <4>; | ||
135 | max-frequency = <50000000>; | ||
136 | cap-sd-highspeed; | ||
137 | - cd-gpios = <&pio 261 0>; | ||
138 | + cd-gpios = <&pio 261 GPIO_ACTIVE_LOW>; | ||
139 | vmmc-supply = <&mt6323_vmch_reg>; | ||
140 | vqmmc-supply = <&mt6323_vio18_reg>; | ||
141 | }; | ||
142 | diff --git a/arch/arm/boot/dts/s5pv210.dtsi b/arch/arm/boot/dts/s5pv210.dtsi | ||
143 | index 726c5d0dbd5b..b290a5abb901 100644 | ||
144 | --- a/arch/arm/boot/dts/s5pv210.dtsi | ||
145 | +++ b/arch/arm/boot/dts/s5pv210.dtsi | ||
146 | @@ -463,6 +463,7 @@ | ||
147 | compatible = "samsung,exynos4210-ohci"; | ||
148 | reg = <0xec300000 0x100>; | ||
149 | interrupts = <23>; | ||
150 | + interrupt-parent = <&vic1>; | ||
151 | clocks = <&clocks CLK_USB_HOST>; | ||
152 | clock-names = "usbhost"; | ||
153 | #address-cells = <1>; | ||
154 | diff --git a/arch/arm/boot/dts/spear1310-evb.dts b/arch/arm/boot/dts/spear1310-evb.dts | ||
155 | index 84101e4eebbf..0f5f379323a8 100644 | ||
156 | --- a/arch/arm/boot/dts/spear1310-evb.dts | ||
157 | +++ b/arch/arm/boot/dts/spear1310-evb.dts | ||
158 | @@ -349,7 +349,7 @@ | ||
159 | spi0: spi@e0100000 { | ||
160 | status = "okay"; | ||
161 | num-cs = <3>; | ||
162 | - cs-gpios = <&gpio1 7 0>, <&spics 0>, <&spics 1>; | ||
163 | + cs-gpios = <&gpio1 7 0>, <&spics 0 0>, <&spics 1 0>; | ||
164 | |||
165 | stmpe610@0 { | ||
166 | compatible = "st,stmpe610"; | ||
167 | diff --git a/arch/arm/boot/dts/spear1340.dtsi b/arch/arm/boot/dts/spear1340.dtsi | ||
168 | index 5f347054527d..d4dbc4098653 100644 | ||
169 | --- a/arch/arm/boot/dts/spear1340.dtsi | ||
170 | +++ b/arch/arm/boot/dts/spear1340.dtsi | ||
171 | @@ -142,8 +142,8 @@ | ||
172 | reg = <0xb4100000 0x1000>; | ||
173 | interrupts = <0 105 0x4>; | ||
174 | status = "disabled"; | ||
175 | - dmas = <&dwdma0 0x600 0 0 1>, /* 0xC << 11 */ | ||
176 | - <&dwdma0 0x680 0 1 0>; /* 0xD << 7 */ | ||
177 | + dmas = <&dwdma0 12 0 1>, | ||
178 | + <&dwdma0 13 1 0>; | ||
179 | dma-names = "tx", "rx"; | ||
180 | }; | ||
181 | |||
182 | diff --git a/arch/arm/boot/dts/spear13xx.dtsi b/arch/arm/boot/dts/spear13xx.dtsi | ||
183 | index 17ea0abcdbd7..086b4b333249 100644 | ||
184 | --- a/arch/arm/boot/dts/spear13xx.dtsi | ||
185 | +++ b/arch/arm/boot/dts/spear13xx.dtsi | ||
186 | @@ -100,7 +100,7 @@ | ||
187 | reg = <0xb2800000 0x1000>; | ||
188 | interrupts = <0 29 0x4>; | ||
189 | status = "disabled"; | ||
190 | - dmas = <&dwdma0 0 0 0 0>; | ||
191 | + dmas = <&dwdma0 0 0 0>; | ||
192 | dma-names = "data"; | ||
193 | }; | ||
194 | |||
195 | @@ -290,8 +290,8 @@ | ||
196 | #size-cells = <0>; | ||
197 | interrupts = <0 31 0x4>; | ||
198 | status = "disabled"; | ||
199 | - dmas = <&dwdma0 0x2000 0 0 0>, /* 0x4 << 11 */ | ||
200 | - <&dwdma0 0x0280 0 0 0>; /* 0x5 << 7 */ | ||
201 | + dmas = <&dwdma0 4 0 0>, | ||
202 | + <&dwdma0 5 0 0>; | ||
203 | dma-names = "tx", "rx"; | ||
204 | }; | ||
205 | |||
206 | diff --git a/arch/arm/boot/dts/spear600.dtsi b/arch/arm/boot/dts/spear600.dtsi | ||
207 | index 6b32d20acc9f..00166eb9be86 100644 | ||
208 | --- a/arch/arm/boot/dts/spear600.dtsi | ||
209 | +++ b/arch/arm/boot/dts/spear600.dtsi | ||
210 | @@ -194,6 +194,7 @@ | ||
211 | rtc: rtc@fc900000 { | ||
212 | compatible = "st,spear600-rtc"; | ||
213 | reg = <0xfc900000 0x1000>; | ||
214 | + interrupt-parent = <&vic0>; | ||
215 | interrupts = <10>; | ||
216 | status = "disabled"; | ||
217 | }; | ||
218 | diff --git a/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi b/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi | ||
219 | index 68aab50a73ab..733678b75b88 100644 | ||
220 | --- a/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi | ||
221 | +++ b/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi | ||
222 | @@ -750,6 +750,7 @@ | ||
223 | reg = <0x10120000 0x1000>; | ||
224 | interrupt-names = "combined"; | ||
225 | interrupts = <14>; | ||
226 | + interrupt-parent = <&vica>; | ||
227 | clocks = <&clcdclk>, <&hclkclcd>; | ||
228 | clock-names = "clcdclk", "apb_pclk"; | ||
229 | status = "disabled"; | ||
230 | diff --git a/arch/arm/boot/dts/stih407.dtsi b/arch/arm/boot/dts/stih407.dtsi | ||
231 | index fa149837df14..11fdecd9312e 100644 | ||
232 | --- a/arch/arm/boot/dts/stih407.dtsi | ||
233 | +++ b/arch/arm/boot/dts/stih407.dtsi | ||
234 | @@ -8,6 +8,7 @@ | ||
235 | */ | ||
236 | #include "stih407-clock.dtsi" | ||
237 | #include "stih407-family.dtsi" | ||
238 | +#include <dt-bindings/gpio/gpio.h> | ||
239 | / { | ||
240 | soc { | ||
241 | sti-display-subsystem { | ||
242 | @@ -122,7 +123,7 @@ | ||
243 | <&clk_s_d2_quadfs 0>, | ||
244 | <&clk_s_d2_quadfs 1>; | ||
245 | |||
246 | - hdmi,hpd-gpio = <&pio5 3>; | ||
247 | + hdmi,hpd-gpio = <&pio5 3 GPIO_ACTIVE_LOW>; | ||
248 | reset-names = "hdmi"; | ||
249 | resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>; | ||
250 | ddc = <&hdmiddc>; | ||
251 | diff --git a/arch/arm/boot/dts/stih410.dtsi b/arch/arm/boot/dts/stih410.dtsi | ||
252 | index cffa50db5d72..68b5ff91d6a7 100644 | ||
253 | --- a/arch/arm/boot/dts/stih410.dtsi | ||
254 | +++ b/arch/arm/boot/dts/stih410.dtsi | ||
255 | @@ -9,6 +9,7 @@ | ||
256 | #include "stih410-clock.dtsi" | ||
257 | #include "stih407-family.dtsi" | ||
258 | #include "stih410-pinctrl.dtsi" | ||
259 | +#include <dt-bindings/gpio/gpio.h> | ||
260 | / { | ||
261 | aliases { | ||
262 | bdisp0 = &bdisp0; | ||
263 | @@ -213,7 +214,7 @@ | ||
264 | <&clk_s_d2_quadfs 0>, | ||
265 | <&clk_s_d2_quadfs 1>; | ||
266 | |||
267 | - hdmi,hpd-gpio = <&pio5 3>; | ||
268 | + hdmi,hpd-gpio = <&pio5 3 GPIO_ACTIVE_LOW>; | ||
269 | reset-names = "hdmi"; | ||
270 | resets = <&softreset STIH407_HDMI_TX_PHY_SOFTRESET>; | ||
271 | ddc = <&hdmiddc>; | ||
272 | diff --git a/arch/arm/mach-pxa/tosa-bt.c b/arch/arm/mach-pxa/tosa-bt.c | ||
273 | index 107f37210fb9..83606087edc7 100644 | ||
274 | --- a/arch/arm/mach-pxa/tosa-bt.c | ||
275 | +++ b/arch/arm/mach-pxa/tosa-bt.c | ||
276 | @@ -132,3 +132,7 @@ static struct platform_driver tosa_bt_driver = { | ||
277 | }, | ||
278 | }; | ||
279 | module_platform_driver(tosa_bt_driver); | ||
280 | + | ||
281 | +MODULE_LICENSE("GPL"); | ||
282 | +MODULE_AUTHOR("Dmitry Baryshkov"); | ||
283 | +MODULE_DESCRIPTION("Bluetooth built-in chip control"); | ||
284 | diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi | ||
285 | index 6b2127a6ced1..b84c0ca4f84a 100644 | ||
286 | --- a/arch/arm64/boot/dts/qcom/msm8916.dtsi | ||
287 | +++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi | ||
288 | @@ -906,6 +906,7 @@ | ||
289 | "dsi_phy_regulator"; | ||
290 | |||
291 | #clock-cells = <1>; | ||
292 | + #phy-cells = <0>; | ||
293 | |||
294 | clocks = <&gcc GCC_MDSS_AHB_CLK>; | ||
295 | clock-names = "iface_clk"; | ||
296 | @@ -1435,8 +1436,8 @@ | ||
297 | #address-cells = <1>; | ||
298 | #size-cells = <0>; | ||
299 | |||
300 | - qcom,ipc-1 = <&apcs 0 13>; | ||
301 | - qcom,ipc-6 = <&apcs 0 19>; | ||
302 | + qcom,ipc-1 = <&apcs 8 13>; | ||
303 | + qcom,ipc-3 = <&apcs 8 19>; | ||
304 | |||
305 | apps_smsm: apps@0 { | ||
306 | reg = <0>; | ||
307 | diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c | ||
308 | index 07823595b7f0..52f15cd896e1 100644 | ||
309 | --- a/arch/arm64/kernel/cpu_errata.c | ||
310 | +++ b/arch/arm64/kernel/cpu_errata.c | ||
311 | @@ -406,6 +406,15 @@ const struct arm64_cpu_capabilities arm64_errata[] = { | ||
312 | .capability = ARM64_HARDEN_BP_POST_GUEST_EXIT, | ||
313 | MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR_V1), | ||
314 | }, | ||
315 | + { | ||
316 | + .capability = ARM64_HARDEN_BRANCH_PREDICTOR, | ||
317 | + MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR), | ||
318 | + .enable = qcom_enable_link_stack_sanitization, | ||
319 | + }, | ||
320 | + { | ||
321 | + .capability = ARM64_HARDEN_BP_POST_GUEST_EXIT, | ||
322 | + MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR), | ||
323 | + }, | ||
324 | { | ||
325 | .capability = ARM64_HARDEN_BRANCH_PREDICTOR, | ||
326 | MIDR_ALL_VERSIONS(MIDR_BRCM_VULCAN), | ||
327 | diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c | ||
328 | index 0b5ab4d8b57d..30b5495b82b5 100644 | ||
329 | --- a/arch/arm64/kvm/hyp/switch.c | ||
330 | +++ b/arch/arm64/kvm/hyp/switch.c | ||
331 | @@ -400,8 +400,10 @@ int __hyp_text __kvm_vcpu_run(struct kvm_vcpu *vcpu) | ||
332 | u32 midr = read_cpuid_id(); | ||
333 | |||
334 | /* Apply BTAC predictors mitigation to all Falkor chips */ | ||
335 | - if ((midr & MIDR_CPU_MODEL_MASK) == MIDR_QCOM_FALKOR_V1) | ||
336 | + if (((midr & MIDR_CPU_MODEL_MASK) == MIDR_QCOM_FALKOR) || | ||
337 | + ((midr & MIDR_CPU_MODEL_MASK) == MIDR_QCOM_FALKOR_V1)) { | ||
338 | __qcom_hyp_sanitize_btac_predictors(); | ||
339 | + } | ||
340 | } | ||
341 | |||
342 | fp_enabled = __fpsimd_enabled(); | ||
343 | diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S | ||
344 | index 08572f95bd8a..248f2e7b24ab 100644 | ||
345 | --- a/arch/arm64/mm/proc.S | ||
346 | +++ b/arch/arm64/mm/proc.S | ||
347 | @@ -189,7 +189,8 @@ ENDPROC(idmap_cpu_replace_ttbr1) | ||
348 | dc cvac, cur_\()\type\()p // Ensure any existing dirty | ||
349 | dmb sy // lines are written back before | ||
350 | ldr \type, [cur_\()\type\()p] // loading the entry | ||
351 | - tbz \type, #0, next_\()\type // Skip invalid entries | ||
352 | + tbz \type, #0, skip_\()\type // Skip invalid and | ||
353 | + tbnz \type, #11, skip_\()\type // non-global entries | ||
354 | .endm | ||
355 | |||
356 | .macro __idmap_kpti_put_pgtable_ent_ng, type | ||
357 | @@ -249,8 +250,9 @@ ENTRY(idmap_kpti_install_ng_mappings) | ||
358 | add end_pgdp, cur_pgdp, #(PTRS_PER_PGD * 8) | ||
359 | do_pgd: __idmap_kpti_get_pgtable_ent pgd | ||
360 | tbnz pgd, #1, walk_puds | ||
361 | - __idmap_kpti_put_pgtable_ent_ng pgd | ||
362 | next_pgd: | ||
363 | + __idmap_kpti_put_pgtable_ent_ng pgd | ||
364 | +skip_pgd: | ||
365 | add cur_pgdp, cur_pgdp, #8 | ||
366 | cmp cur_pgdp, end_pgdp | ||
367 | b.ne do_pgd | ||
368 | @@ -278,8 +280,9 @@ walk_puds: | ||
369 | add end_pudp, cur_pudp, #(PTRS_PER_PUD * 8) | ||
370 | do_pud: __idmap_kpti_get_pgtable_ent pud | ||
371 | tbnz pud, #1, walk_pmds | ||
372 | - __idmap_kpti_put_pgtable_ent_ng pud | ||
373 | next_pud: | ||
374 | + __idmap_kpti_put_pgtable_ent_ng pud | ||
375 | +skip_pud: | ||
376 | add cur_pudp, cur_pudp, 8 | ||
377 | cmp cur_pudp, end_pudp | ||
378 | b.ne do_pud | ||
379 | @@ -298,8 +301,9 @@ walk_pmds: | ||
380 | add end_pmdp, cur_pmdp, #(PTRS_PER_PMD * 8) | ||
381 | do_pmd: __idmap_kpti_get_pgtable_ent pmd | ||
382 | tbnz pmd, #1, walk_ptes | ||
383 | - __idmap_kpti_put_pgtable_ent_ng pmd | ||
384 | next_pmd: | ||
385 | + __idmap_kpti_put_pgtable_ent_ng pmd | ||
386 | +skip_pmd: | ||
387 | add cur_pmdp, cur_pmdp, #8 | ||
388 | cmp cur_pmdp, end_pmdp | ||
389 | b.ne do_pmd | ||
390 | @@ -317,7 +321,7 @@ walk_ptes: | ||
391 | add end_ptep, cur_ptep, #(PTRS_PER_PTE * 8) | ||
392 | do_pte: __idmap_kpti_get_pgtable_ent pte | ||
393 | __idmap_kpti_put_pgtable_ent_ng pte | ||
394 | -next_pte: | ||
395 | +skip_pte: | ||
396 | add cur_ptep, cur_ptep, #8 | ||
397 | cmp cur_ptep, end_ptep | ||
398 | b.ne do_pte | ||
399 | diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig | ||
400 | index 8e0b3702f1c0..efaa3b130f4d 100644 | ||
401 | --- a/arch/mips/Kconfig | ||
402 | +++ b/arch/mips/Kconfig | ||
403 | @@ -119,12 +119,12 @@ config MIPS_GENERIC | ||
404 | select SYS_SUPPORTS_MULTITHREADING | ||
405 | select SYS_SUPPORTS_RELOCATABLE | ||
406 | select SYS_SUPPORTS_SMARTMIPS | ||
407 | - select USB_EHCI_BIG_ENDIAN_DESC if BIG_ENDIAN | ||
408 | - select USB_EHCI_BIG_ENDIAN_MMIO if BIG_ENDIAN | ||
409 | - select USB_OHCI_BIG_ENDIAN_DESC if BIG_ENDIAN | ||
410 | - select USB_OHCI_BIG_ENDIAN_MMIO if BIG_ENDIAN | ||
411 | - select USB_UHCI_BIG_ENDIAN_DESC if BIG_ENDIAN | ||
412 | - select USB_UHCI_BIG_ENDIAN_MMIO if BIG_ENDIAN | ||
413 | + select USB_EHCI_BIG_ENDIAN_DESC if CPU_BIG_ENDIAN | ||
414 | + select USB_EHCI_BIG_ENDIAN_MMIO if CPU_BIG_ENDIAN | ||
415 | + select USB_OHCI_BIG_ENDIAN_DESC if CPU_BIG_ENDIAN | ||
416 | + select USB_OHCI_BIG_ENDIAN_MMIO if CPU_BIG_ENDIAN | ||
417 | + select USB_UHCI_BIG_ENDIAN_DESC if CPU_BIG_ENDIAN | ||
418 | + select USB_UHCI_BIG_ENDIAN_MMIO if CPU_BIG_ENDIAN | ||
419 | select USE_OF | ||
420 | help | ||
421 | Select this to build a kernel which aims to support multiple boards, | ||
422 | diff --git a/arch/mips/kernel/cps-vec.S b/arch/mips/kernel/cps-vec.S | ||
423 | index e68e6e04063a..1025f937ab0e 100644 | ||
424 | --- a/arch/mips/kernel/cps-vec.S | ||
425 | +++ b/arch/mips/kernel/cps-vec.S | ||
426 | @@ -388,15 +388,16 @@ LEAF(mips_cps_boot_vpes) | ||
427 | |||
428 | #elif defined(CONFIG_MIPS_MT) | ||
429 | |||
430 | - .set push | ||
431 | - .set MIPS_ISA_LEVEL_RAW | ||
432 | - .set mt | ||
433 | - | ||
434 | /* If the core doesn't support MT then return */ | ||
435 | has_mt t0, 5f | ||
436 | |||
437 | /* Enter VPE configuration state */ | ||
438 | + .set push | ||
439 | + .set MIPS_ISA_LEVEL_RAW | ||
440 | + .set mt | ||
441 | dvpe | ||
442 | + .set pop | ||
443 | + | ||
444 | PTR_LA t1, 1f | ||
445 | jr.hb t1 | ||
446 | nop | ||
447 | @@ -422,6 +423,10 @@ LEAF(mips_cps_boot_vpes) | ||
448 | mtc0 t0, CP0_VPECONTROL | ||
449 | ehb | ||
450 | |||
451 | + .set push | ||
452 | + .set MIPS_ISA_LEVEL_RAW | ||
453 | + .set mt | ||
454 | + | ||
455 | /* Skip the VPE if its TC is not halted */ | ||
456 | mftc0 t0, CP0_TCHALT | ||
457 | beqz t0, 2f | ||
458 | @@ -495,6 +500,8 @@ LEAF(mips_cps_boot_vpes) | ||
459 | ehb | ||
460 | evpe | ||
461 | |||
462 | + .set pop | ||
463 | + | ||
464 | /* Check whether this VPE is meant to be running */ | ||
465 | li t0, 1 | ||
466 | sll t0, t0, a1 | ||
467 | @@ -509,7 +516,7 @@ LEAF(mips_cps_boot_vpes) | ||
468 | 1: jr.hb t0 | ||
469 | nop | ||
470 | |||
471 | -2: .set pop | ||
472 | +2: | ||
473 | |||
474 | #endif /* CONFIG_MIPS_MT_SMP */ | ||
475 | |||
476 | diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c | ||
477 | index 702c678de116..e4a1581ce822 100644 | ||
478 | --- a/arch/mips/kernel/setup.c | ||
479 | +++ b/arch/mips/kernel/setup.c | ||
480 | @@ -375,6 +375,7 @@ static void __init bootmem_init(void) | ||
481 | unsigned long reserved_end; | ||
482 | unsigned long mapstart = ~0UL; | ||
483 | unsigned long bootmap_size; | ||
484 | + phys_addr_t ramstart = (phys_addr_t)ULLONG_MAX; | ||
485 | bool bootmap_valid = false; | ||
486 | int i; | ||
487 | |||
488 | @@ -395,7 +396,8 @@ static void __init bootmem_init(void) | ||
489 | max_low_pfn = 0; | ||
490 | |||
491 | /* | ||
492 | - * Find the highest page frame number we have available. | ||
493 | + * Find the highest page frame number we have available | ||
494 | + * and the lowest used RAM address | ||
495 | */ | ||
496 | for (i = 0; i < boot_mem_map.nr_map; i++) { | ||
497 | unsigned long start, end; | ||
498 | @@ -407,6 +409,8 @@ static void __init bootmem_init(void) | ||
499 | end = PFN_DOWN(boot_mem_map.map[i].addr | ||
500 | + boot_mem_map.map[i].size); | ||
501 | |||
502 | + ramstart = min(ramstart, boot_mem_map.map[i].addr); | ||
503 | + | ||
504 | #ifndef CONFIG_HIGHMEM | ||
505 | /* | ||
506 | * Skip highmem here so we get an accurate max_low_pfn if low | ||
507 | @@ -436,6 +440,13 @@ static void __init bootmem_init(void) | ||
508 | mapstart = max(reserved_end, start); | ||
509 | } | ||
510 | |||
511 | + /* | ||
512 | + * Reserve any memory between the start of RAM and PHYS_OFFSET | ||
513 | + */ | ||
514 | + if (ramstart > PHYS_OFFSET) | ||
515 | + add_memory_region(PHYS_OFFSET, ramstart - PHYS_OFFSET, | ||
516 | + BOOT_MEM_RESERVED); | ||
517 | + | ||
518 | if (min_low_pfn >= max_low_pfn) | ||
519 | panic("Incorrect memory mapping !!!"); | ||
520 | if (min_low_pfn > ARCH_PFN_OFFSET) { | ||
521 | @@ -664,9 +675,6 @@ static int __init early_parse_mem(char *p) | ||
522 | |||
523 | add_memory_region(start, size, BOOT_MEM_RAM); | ||
524 | |||
525 | - if (start && start > PHYS_OFFSET) | ||
526 | - add_memory_region(PHYS_OFFSET, start - PHYS_OFFSET, | ||
527 | - BOOT_MEM_RESERVED); | ||
528 | return 0; | ||
529 | } | ||
530 | early_param("mem", early_parse_mem); | ||
531 | diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h | ||
532 | index 88187c285c70..1c02e6900f78 100644 | ||
533 | --- a/arch/powerpc/include/asm/topology.h | ||
534 | +++ b/arch/powerpc/include/asm/topology.h | ||
535 | @@ -44,6 +44,11 @@ extern int sysfs_add_device_to_node(struct device *dev, int nid); | ||
536 | extern void sysfs_remove_device_from_node(struct device *dev, int nid); | ||
537 | extern int numa_update_cpu_topology(bool cpus_locked); | ||
538 | |||
539 | +static inline void update_numa_cpu_lookup_table(unsigned int cpu, int node) | ||
540 | +{ | ||
541 | + numa_cpu_lookup_table[cpu] = node; | ||
542 | +} | ||
543 | + | ||
544 | static inline int early_cpu_to_node(int cpu) | ||
545 | { | ||
546 | int nid; | ||
547 | diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c | ||
548 | index 72be0c32e902..2010e4c827b7 100644 | ||
549 | --- a/arch/powerpc/kernel/process.c | ||
550 | +++ b/arch/powerpc/kernel/process.c | ||
551 | @@ -1509,14 +1509,15 @@ static int assign_thread_tidr(void) | ||
552 | { | ||
553 | int index; | ||
554 | int err; | ||
555 | + unsigned long flags; | ||
556 | |||
557 | again: | ||
558 | if (!ida_pre_get(&vas_thread_ida, GFP_KERNEL)) | ||
559 | return -ENOMEM; | ||
560 | |||
561 | - spin_lock(&vas_thread_id_lock); | ||
562 | + spin_lock_irqsave(&vas_thread_id_lock, flags); | ||
563 | err = ida_get_new_above(&vas_thread_ida, 1, &index); | ||
564 | - spin_unlock(&vas_thread_id_lock); | ||
565 | + spin_unlock_irqrestore(&vas_thread_id_lock, flags); | ||
566 | |||
567 | if (err == -EAGAIN) | ||
568 | goto again; | ||
569 | @@ -1524,9 +1525,9 @@ static int assign_thread_tidr(void) | ||
570 | return err; | ||
571 | |||
572 | if (index > MAX_THREAD_CONTEXT) { | ||
573 | - spin_lock(&vas_thread_id_lock); | ||
574 | + spin_lock_irqsave(&vas_thread_id_lock, flags); | ||
575 | ida_remove(&vas_thread_ida, index); | ||
576 | - spin_unlock(&vas_thread_id_lock); | ||
577 | + spin_unlock_irqrestore(&vas_thread_id_lock, flags); | ||
578 | return -ENOMEM; | ||
579 | } | ||
580 | |||
581 | @@ -1535,9 +1536,11 @@ static int assign_thread_tidr(void) | ||
582 | |||
583 | static void free_thread_tidr(int id) | ||
584 | { | ||
585 | - spin_lock(&vas_thread_id_lock); | ||
586 | + unsigned long flags; | ||
587 | + | ||
588 | + spin_lock_irqsave(&vas_thread_id_lock, flags); | ||
589 | ida_remove(&vas_thread_ida, id); | ||
590 | - spin_unlock(&vas_thread_id_lock); | ||
591 | + spin_unlock_irqrestore(&vas_thread_id_lock, flags); | ||
592 | } | ||
593 | |||
594 | /* | ||
595 | diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c | ||
596 | index adb6364f4091..09be66fcea68 100644 | ||
597 | --- a/arch/powerpc/mm/numa.c | ||
598 | +++ b/arch/powerpc/mm/numa.c | ||
599 | @@ -142,11 +142,6 @@ static void reset_numa_cpu_lookup_table(void) | ||
600 | numa_cpu_lookup_table[cpu] = -1; | ||
601 | } | ||
602 | |||
603 | -static void update_numa_cpu_lookup_table(unsigned int cpu, int node) | ||
604 | -{ | ||
605 | - numa_cpu_lookup_table[cpu] = node; | ||
606 | -} | ||
607 | - | ||
608 | static void map_cpu_to_node(int cpu, int node) | ||
609 | { | ||
610 | update_numa_cpu_lookup_table(cpu, node); | ||
611 | diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c | ||
612 | index cfbbee941a76..17ae5c15a9e0 100644 | ||
613 | --- a/arch/powerpc/mm/pgtable-radix.c | ||
614 | +++ b/arch/powerpc/mm/pgtable-radix.c | ||
615 | @@ -17,6 +17,7 @@ | ||
616 | #include <linux/of_fdt.h> | ||
617 | #include <linux/mm.h> | ||
618 | #include <linux/string_helpers.h> | ||
619 | +#include <linux/stop_machine.h> | ||
620 | |||
621 | #include <asm/pgtable.h> | ||
622 | #include <asm/pgalloc.h> | ||
623 | @@ -671,6 +672,30 @@ static void free_pmd_table(pmd_t *pmd_start, pud_t *pud) | ||
624 | pud_clear(pud); | ||
625 | } | ||
626 | |||
627 | +struct change_mapping_params { | ||
628 | + pte_t *pte; | ||
629 | + unsigned long start; | ||
630 | + unsigned long end; | ||
631 | + unsigned long aligned_start; | ||
632 | + unsigned long aligned_end; | ||
633 | +}; | ||
634 | + | ||
635 | +static int stop_machine_change_mapping(void *data) | ||
636 | +{ | ||
637 | + struct change_mapping_params *params = | ||
638 | + (struct change_mapping_params *)data; | ||
639 | + | ||
640 | + if (!data) | ||
641 | + return -1; | ||
642 | + | ||
643 | + spin_unlock(&init_mm.page_table_lock); | ||
644 | + pte_clear(&init_mm, params->aligned_start, params->pte); | ||
645 | + create_physical_mapping(params->aligned_start, params->start); | ||
646 | + create_physical_mapping(params->end, params->aligned_end); | ||
647 | + spin_lock(&init_mm.page_table_lock); | ||
648 | + return 0; | ||
649 | +} | ||
650 | + | ||
651 | static void remove_pte_table(pte_t *pte_start, unsigned long addr, | ||
652 | unsigned long end) | ||
653 | { | ||
654 | @@ -699,6 +724,52 @@ static void remove_pte_table(pte_t *pte_start, unsigned long addr, | ||
655 | } | ||
656 | } | ||
657 | |||
658 | +/* | ||
659 | + * clear the pte and potentially split the mapping helper | ||
660 | + */ | ||
661 | +static void split_kernel_mapping(unsigned long addr, unsigned long end, | ||
662 | + unsigned long size, pte_t *pte) | ||
663 | +{ | ||
664 | + unsigned long mask = ~(size - 1); | ||
665 | + unsigned long aligned_start = addr & mask; | ||
666 | + unsigned long aligned_end = addr + size; | ||
667 | + struct change_mapping_params params; | ||
668 | + bool split_region = false; | ||
669 | + | ||
670 | + if ((end - addr) < size) { | ||
671 | + /* | ||
672 | + * We're going to clear the PTE, but not flushed | ||
673 | + * the mapping, time to remap and flush. The | ||
674 | + * effects if visible outside the processor or | ||
675 | + * if we are running in code close to the | ||
676 | + * mapping we cleared, we are in trouble. | ||
677 | + */ | ||
678 | + if (overlaps_kernel_text(aligned_start, addr) || | ||
679 | + overlaps_kernel_text(end, aligned_end)) { | ||
680 | + /* | ||
681 | + * Hack, just return, don't pte_clear | ||
682 | + */ | ||
683 | + WARN_ONCE(1, "Linear mapping %lx->%lx overlaps kernel " | ||
684 | + "text, not splitting\n", addr, end); | ||
685 | + return; | ||
686 | + } | ||
687 | + split_region = true; | ||
688 | + } | ||
689 | + | ||
690 | + if (split_region) { | ||
691 | + params.pte = pte; | ||
692 | + params.start = addr; | ||
693 | + params.end = end; | ||
694 | + params.aligned_start = addr & ~(size - 1); | ||
695 | + params.aligned_end = min_t(unsigned long, aligned_end, | ||
696 | + (unsigned long)__va(memblock_end_of_DRAM())); | ||
697 | + stop_machine(stop_machine_change_mapping, ¶ms, NULL); | ||
698 | + return; | ||
699 | + } | ||
700 | + | ||
701 | + pte_clear(&init_mm, addr, pte); | ||
702 | +} | ||
703 | + | ||
704 | static void remove_pmd_table(pmd_t *pmd_start, unsigned long addr, | ||
705 | unsigned long end) | ||
706 | { | ||
707 | @@ -714,13 +785,7 @@ static void remove_pmd_table(pmd_t *pmd_start, unsigned long addr, | ||
708 | continue; | ||
709 | |||
710 | if (pmd_huge(*pmd)) { | ||
711 | - if (!IS_ALIGNED(addr, PMD_SIZE) || | ||
712 | - !IS_ALIGNED(next, PMD_SIZE)) { | ||
713 | - WARN_ONCE(1, "%s: unaligned range\n", __func__); | ||
714 | - continue; | ||
715 | - } | ||
716 | - | ||
717 | - pte_clear(&init_mm, addr, (pte_t *)pmd); | ||
718 | + split_kernel_mapping(addr, end, PMD_SIZE, (pte_t *)pmd); | ||
719 | continue; | ||
720 | } | ||
721 | |||
722 | @@ -745,13 +810,7 @@ static void remove_pud_table(pud_t *pud_start, unsigned long addr, | ||
723 | continue; | ||
724 | |||
725 | if (pud_huge(*pud)) { | ||
726 | - if (!IS_ALIGNED(addr, PUD_SIZE) || | ||
727 | - !IS_ALIGNED(next, PUD_SIZE)) { | ||
728 | - WARN_ONCE(1, "%s: unaligned range\n", __func__); | ||
729 | - continue; | ||
730 | - } | ||
731 | - | ||
732 | - pte_clear(&init_mm, addr, (pte_t *)pud); | ||
733 | + split_kernel_mapping(addr, end, PUD_SIZE, (pte_t *)pud); | ||
734 | continue; | ||
735 | } | ||
736 | |||
737 | @@ -777,13 +836,7 @@ static void remove_pagetable(unsigned long start, unsigned long end) | ||
738 | continue; | ||
739 | |||
740 | if (pgd_huge(*pgd)) { | ||
741 | - if (!IS_ALIGNED(addr, PGDIR_SIZE) || | ||
742 | - !IS_ALIGNED(next, PGDIR_SIZE)) { | ||
743 | - WARN_ONCE(1, "%s: unaligned range\n", __func__); | ||
744 | - continue; | ||
745 | - } | ||
746 | - | ||
747 | - pte_clear(&init_mm, addr, (pte_t *)pgd); | ||
748 | + split_kernel_mapping(addr, end, PGDIR_SIZE, (pte_t *)pgd); | ||
749 | continue; | ||
750 | } | ||
751 | |||
752 | diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c | ||
753 | index 813ea22c3e00..eec1367c2f32 100644 | ||
754 | --- a/arch/powerpc/mm/pgtable_64.c | ||
755 | +++ b/arch/powerpc/mm/pgtable_64.c | ||
756 | @@ -483,6 +483,8 @@ void mmu_partition_table_set_entry(unsigned int lpid, unsigned long dw0, | ||
757 | if (old & PATB_HR) { | ||
758 | asm volatile(PPC_TLBIE_5(%0,%1,2,0,1) : : | ||
759 | "r" (TLBIEL_INVAL_SET_LPID), "r" (lpid)); | ||
760 | + asm volatile(PPC_TLBIE_5(%0,%1,2,1,1) : : | ||
761 | + "r" (TLBIEL_INVAL_SET_LPID), "r" (lpid)); | ||
762 | trace_tlbie(lpid, 0, TLBIEL_INVAL_SET_LPID, lpid, 2, 0, 1); | ||
763 | } else { | ||
764 | asm volatile(PPC_TLBIE_5(%0,%1,2,0,0) : : | ||
765 | diff --git a/arch/powerpc/mm/tlb-radix.c b/arch/powerpc/mm/tlb-radix.c | ||
766 | index 884f4b705b57..913a2b81b177 100644 | ||
767 | --- a/arch/powerpc/mm/tlb-radix.c | ||
768 | +++ b/arch/powerpc/mm/tlb-radix.c | ||
769 | @@ -600,14 +600,12 @@ void radix__flush_tlb_all(void) | ||
770 | */ | ||
771 | asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1) | ||
772 | : : "r"(rb), "i"(r), "i"(1), "i"(ric), "r"(rs) : "memory"); | ||
773 | - trace_tlbie(0, 0, rb, rs, ric, prs, r); | ||
774 | /* | ||
775 | * now flush host entires by passing PRS = 0 and LPID == 0 | ||
776 | */ | ||
777 | asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1) | ||
778 | : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(0) : "memory"); | ||
779 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); | ||
780 | - trace_tlbie(0, 0, rb, 0, ric, prs, r); | ||
781 | } | ||
782 | |||
783 | void radix__flush_tlb_pte_p9_dd1(unsigned long old_pte, struct mm_struct *mm, | ||
784 | diff --git a/arch/powerpc/platforms/powernv/vas-window.c b/arch/powerpc/platforms/powernv/vas-window.c | ||
785 | index 2b3eb01ab110..b7c53a51c31b 100644 | ||
786 | --- a/arch/powerpc/platforms/powernv/vas-window.c | ||
787 | +++ b/arch/powerpc/platforms/powernv/vas-window.c | ||
788 | @@ -1063,16 +1063,16 @@ struct vas_window *vas_tx_win_open(int vasid, enum vas_cop_type cop, | ||
789 | rc = PTR_ERR(txwin->paste_kaddr); | ||
790 | goto free_window; | ||
791 | } | ||
792 | + } else { | ||
793 | + /* | ||
794 | + * A user mapping must ensure that context switch issues | ||
795 | + * CP_ABORT for this thread. | ||
796 | + */ | ||
797 | + rc = set_thread_uses_vas(); | ||
798 | + if (rc) | ||
799 | + goto free_window; | ||
800 | } | ||
801 | |||
802 | - /* | ||
803 | - * Now that we have a send window, ensure context switch issues | ||
804 | - * CP_ABORT for this thread. | ||
805 | - */ | ||
806 | - rc = -EINVAL; | ||
807 | - if (set_thread_uses_vas() < 0) | ||
808 | - goto free_window; | ||
809 | - | ||
810 | set_vinst_win(vinst, txwin); | ||
811 | |||
812 | return txwin; | ||
813 | diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c | ||
814 | index a7d14aa7bb7c..09083ad82f7a 100644 | ||
815 | --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c | ||
816 | +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c | ||
817 | @@ -36,6 +36,7 @@ | ||
818 | #include <asm/xics.h> | ||
819 | #include <asm/xive.h> | ||
820 | #include <asm/plpar_wrappers.h> | ||
821 | +#include <asm/topology.h> | ||
822 | |||
823 | #include "pseries.h" | ||
824 | #include "offline_states.h" | ||
825 | @@ -331,6 +332,7 @@ static void pseries_remove_processor(struct device_node *np) | ||
826 | BUG_ON(cpu_online(cpu)); | ||
827 | set_cpu_present(cpu, false); | ||
828 | set_hard_smp_processor_id(cpu, -1); | ||
829 | + update_numa_cpu_lookup_table(cpu, -1); | ||
830 | break; | ||
831 | } | ||
832 | if (cpu >= nr_cpu_ids) | ||
833 | diff --git a/arch/powerpc/sysdev/xive/spapr.c b/arch/powerpc/sysdev/xive/spapr.c | ||
834 | index d9c4c9366049..091f1d0d0af1 100644 | ||
835 | --- a/arch/powerpc/sysdev/xive/spapr.c | ||
836 | +++ b/arch/powerpc/sysdev/xive/spapr.c | ||
837 | @@ -356,7 +356,8 @@ static int xive_spapr_configure_queue(u32 target, struct xive_q *q, u8 prio, | ||
838 | |||
839 | rc = plpar_int_get_queue_info(0, target, prio, &esn_page, &esn_size); | ||
840 | if (rc) { | ||
841 | - pr_err("Error %lld getting queue info prio %d\n", rc, prio); | ||
842 | + pr_err("Error %lld getting queue info CPU %d prio %d\n", rc, | ||
843 | + target, prio); | ||
844 | rc = -EIO; | ||
845 | goto fail; | ||
846 | } | ||
847 | @@ -370,7 +371,8 @@ static int xive_spapr_configure_queue(u32 target, struct xive_q *q, u8 prio, | ||
848 | /* Configure and enable the queue in HW */ | ||
849 | rc = plpar_int_set_queue_config(flags, target, prio, qpage_phys, order); | ||
850 | if (rc) { | ||
851 | - pr_err("Error %lld setting queue for prio %d\n", rc, prio); | ||
852 | + pr_err("Error %lld setting queue for CPU %d prio %d\n", rc, | ||
853 | + target, prio); | ||
854 | rc = -EIO; | ||
855 | } else { | ||
856 | q->qpage = qpage; | ||
857 | @@ -389,8 +391,8 @@ static int xive_spapr_setup_queue(unsigned int cpu, struct xive_cpu *xc, | ||
858 | if (IS_ERR(qpage)) | ||
859 | return PTR_ERR(qpage); | ||
860 | |||
861 | - return xive_spapr_configure_queue(cpu, q, prio, qpage, | ||
862 | - xive_queue_shift); | ||
863 | + return xive_spapr_configure_queue(get_hard_smp_processor_id(cpu), | ||
864 | + q, prio, qpage, xive_queue_shift); | ||
865 | } | ||
866 | |||
867 | static void xive_spapr_cleanup_queue(unsigned int cpu, struct xive_cpu *xc, | ||
868 | @@ -399,10 +401,12 @@ static void xive_spapr_cleanup_queue(unsigned int cpu, struct xive_cpu *xc, | ||
869 | struct xive_q *q = &xc->queue[prio]; | ||
870 | unsigned int alloc_order; | ||
871 | long rc; | ||
872 | + int hw_cpu = get_hard_smp_processor_id(cpu); | ||
873 | |||
874 | - rc = plpar_int_set_queue_config(0, cpu, prio, 0, 0); | ||
875 | + rc = plpar_int_set_queue_config(0, hw_cpu, prio, 0, 0); | ||
876 | if (rc) | ||
877 | - pr_err("Error %ld setting queue for prio %d\n", rc, prio); | ||
878 | + pr_err("Error %ld setting queue for CPU %d prio %d\n", rc, | ||
879 | + hw_cpu, prio); | ||
880 | |||
881 | alloc_order = xive_alloc_order(xive_queue_shift); | ||
882 | free_pages((unsigned long)q->qpage, alloc_order); | ||
883 | diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c | ||
884 | index 59eea9c65d3e..79b7a3438d54 100644 | ||
885 | --- a/arch/s390/kernel/compat_linux.c | ||
886 | +++ b/arch/s390/kernel/compat_linux.c | ||
887 | @@ -110,7 +110,7 @@ COMPAT_SYSCALL_DEFINE2(s390_setregid16, u16, rgid, u16, egid) | ||
888 | |||
889 | COMPAT_SYSCALL_DEFINE1(s390_setgid16, u16, gid) | ||
890 | { | ||
891 | - return sys_setgid((gid_t)gid); | ||
892 | + return sys_setgid(low2highgid(gid)); | ||
893 | } | ||
894 | |||
895 | COMPAT_SYSCALL_DEFINE2(s390_setreuid16, u16, ruid, u16, euid) | ||
896 | @@ -120,7 +120,7 @@ COMPAT_SYSCALL_DEFINE2(s390_setreuid16, u16, ruid, u16, euid) | ||
897 | |||
898 | COMPAT_SYSCALL_DEFINE1(s390_setuid16, u16, uid) | ||
899 | { | ||
900 | - return sys_setuid((uid_t)uid); | ||
901 | + return sys_setuid(low2highuid(uid)); | ||
902 | } | ||
903 | |||
904 | COMPAT_SYSCALL_DEFINE3(s390_setresuid16, u16, ruid, u16, euid, u16, suid) | ||
905 | @@ -173,12 +173,12 @@ COMPAT_SYSCALL_DEFINE3(s390_getresgid16, u16 __user *, rgidp, | ||
906 | |||
907 | COMPAT_SYSCALL_DEFINE1(s390_setfsuid16, u16, uid) | ||
908 | { | ||
909 | - return sys_setfsuid((uid_t)uid); | ||
910 | + return sys_setfsuid(low2highuid(uid)); | ||
911 | } | ||
912 | |||
913 | COMPAT_SYSCALL_DEFINE1(s390_setfsgid16, u16, gid) | ||
914 | { | ||
915 | - return sys_setfsgid((gid_t)gid); | ||
916 | + return sys_setfsgid(low2highgid(gid)); | ||
917 | } | ||
918 | |||
919 | static int groups16_to_user(u16 __user *grouplist, struct group_info *group_info) | ||
920 | diff --git a/arch/x86/entry/calling.h b/arch/x86/entry/calling.h | ||
921 | index 3f48f695d5e6..dce7092ab24a 100644 | ||
922 | --- a/arch/x86/entry/calling.h | ||
923 | +++ b/arch/x86/entry/calling.h | ||
924 | @@ -97,80 +97,69 @@ For 32-bit we have the following conventions - kernel is built with | ||
925 | |||
926 | #define SIZEOF_PTREGS 21*8 | ||
927 | |||
928 | - .macro ALLOC_PT_GPREGS_ON_STACK | ||
929 | - addq $-(15*8), %rsp | ||
930 | - .endm | ||
931 | +.macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax | ||
932 | + /* | ||
933 | + * Push registers and sanitize registers of values that a | ||
934 | + * speculation attack might otherwise want to exploit. The | ||
935 | + * lower registers are likely clobbered well before they | ||
936 | + * could be put to use in a speculative execution gadget. | ||
937 | + * Interleave XOR with PUSH for better uop scheduling: | ||
938 | + */ | ||
939 | + pushq %rdi /* pt_regs->di */ | ||
940 | + pushq %rsi /* pt_regs->si */ | ||
941 | + pushq \rdx /* pt_regs->dx */ | ||
942 | + pushq %rcx /* pt_regs->cx */ | ||
943 | + pushq \rax /* pt_regs->ax */ | ||
944 | + pushq %r8 /* pt_regs->r8 */ | ||
945 | + xorq %r8, %r8 /* nospec r8 */ | ||
946 | + pushq %r9 /* pt_regs->r9 */ | ||
947 | + xorq %r9, %r9 /* nospec r9 */ | ||
948 | + pushq %r10 /* pt_regs->r10 */ | ||
949 | + xorq %r10, %r10 /* nospec r10 */ | ||
950 | + pushq %r11 /* pt_regs->r11 */ | ||
951 | + xorq %r11, %r11 /* nospec r11*/ | ||
952 | + pushq %rbx /* pt_regs->rbx */ | ||
953 | + xorl %ebx, %ebx /* nospec rbx*/ | ||
954 | + pushq %rbp /* pt_regs->rbp */ | ||
955 | + xorl %ebp, %ebp /* nospec rbp*/ | ||
956 | + pushq %r12 /* pt_regs->r12 */ | ||
957 | + xorq %r12, %r12 /* nospec r12*/ | ||
958 | + pushq %r13 /* pt_regs->r13 */ | ||
959 | + xorq %r13, %r13 /* nospec r13*/ | ||
960 | + pushq %r14 /* pt_regs->r14 */ | ||
961 | + xorq %r14, %r14 /* nospec r14*/ | ||
962 | + pushq %r15 /* pt_regs->r15 */ | ||
963 | + xorq %r15, %r15 /* nospec r15*/ | ||
964 | + UNWIND_HINT_REGS | ||
965 | +.endm | ||
966 | |||
967 | - .macro SAVE_C_REGS_HELPER offset=0 rax=1 rcx=1 r8910=1 r11=1 | ||
968 | - .if \r11 | ||
969 | - movq %r11, 6*8+\offset(%rsp) | ||
970 | - .endif | ||
971 | - .if \r8910 | ||
972 | - movq %r10, 7*8+\offset(%rsp) | ||
973 | - movq %r9, 8*8+\offset(%rsp) | ||
974 | - movq %r8, 9*8+\offset(%rsp) | ||
975 | - .endif | ||
976 | - .if \rax | ||
977 | - movq %rax, 10*8+\offset(%rsp) | ||
978 | - .endif | ||
979 | - .if \rcx | ||
980 | - movq %rcx, 11*8+\offset(%rsp) | ||
981 | - .endif | ||
982 | - movq %rdx, 12*8+\offset(%rsp) | ||
983 | - movq %rsi, 13*8+\offset(%rsp) | ||
984 | - movq %rdi, 14*8+\offset(%rsp) | ||
985 | - UNWIND_HINT_REGS offset=\offset extra=0 | ||
986 | - .endm | ||
987 | - .macro SAVE_C_REGS offset=0 | ||
988 | - SAVE_C_REGS_HELPER \offset, 1, 1, 1, 1 | ||
989 | - .endm | ||
990 | - .macro SAVE_C_REGS_EXCEPT_RAX_RCX offset=0 | ||
991 | - SAVE_C_REGS_HELPER \offset, 0, 0, 1, 1 | ||
992 | - .endm | ||
993 | - .macro SAVE_C_REGS_EXCEPT_R891011 | ||
994 | - SAVE_C_REGS_HELPER 0, 1, 1, 0, 0 | ||
995 | - .endm | ||
996 | - .macro SAVE_C_REGS_EXCEPT_RCX_R891011 | ||
997 | - SAVE_C_REGS_HELPER 0, 1, 0, 0, 0 | ||
998 | - .endm | ||
999 | - .macro SAVE_C_REGS_EXCEPT_RAX_RCX_R11 | ||
1000 | - SAVE_C_REGS_HELPER 0, 0, 0, 1, 0 | ||
1001 | - .endm | ||
1002 | - | ||
1003 | - .macro SAVE_EXTRA_REGS offset=0 | ||
1004 | - movq %r15, 0*8+\offset(%rsp) | ||
1005 | - movq %r14, 1*8+\offset(%rsp) | ||
1006 | - movq %r13, 2*8+\offset(%rsp) | ||
1007 | - movq %r12, 3*8+\offset(%rsp) | ||
1008 | - movq %rbp, 4*8+\offset(%rsp) | ||
1009 | - movq %rbx, 5*8+\offset(%rsp) | ||
1010 | - UNWIND_HINT_REGS offset=\offset | ||
1011 | - .endm | ||
1012 | - | ||
1013 | - .macro POP_EXTRA_REGS | ||
1014 | +.macro POP_REGS pop_rdi=1 skip_r11rcx=0 | ||
1015 | popq %r15 | ||
1016 | popq %r14 | ||
1017 | popq %r13 | ||
1018 | popq %r12 | ||
1019 | popq %rbp | ||
1020 | popq %rbx | ||
1021 | - .endm | ||
1022 | - | ||
1023 | - .macro POP_C_REGS | ||
1024 | + .if \skip_r11rcx | ||
1025 | + popq %rsi | ||
1026 | + .else | ||
1027 | popq %r11 | ||
1028 | + .endif | ||
1029 | popq %r10 | ||
1030 | popq %r9 | ||
1031 | popq %r8 | ||
1032 | popq %rax | ||
1033 | + .if \skip_r11rcx | ||
1034 | + popq %rsi | ||
1035 | + .else | ||
1036 | popq %rcx | ||
1037 | + .endif | ||
1038 | popq %rdx | ||
1039 | popq %rsi | ||
1040 | + .if \pop_rdi | ||
1041 | popq %rdi | ||
1042 | - .endm | ||
1043 | - | ||
1044 | - .macro icebp | ||
1045 | - .byte 0xf1 | ||
1046 | - .endm | ||
1047 | + .endif | ||
1048 | +.endm | ||
1049 | |||
1050 | /* | ||
1051 | * This is a sneaky trick to help the unwinder find pt_regs on the stack. The | ||
1052 | @@ -178,7 +167,7 @@ For 32-bit we have the following conventions - kernel is built with | ||
1053 | * is just setting the LSB, which makes it an invalid stack address and is also | ||
1054 | * a signal to the unwinder that it's a pt_regs pointer in disguise. | ||
1055 | * | ||
1056 | - * NOTE: This macro must be used *after* SAVE_EXTRA_REGS because it corrupts | ||
1057 | + * NOTE: This macro must be used *after* PUSH_AND_CLEAR_REGS because it corrupts | ||
1058 | * the original rbp. | ||
1059 | */ | ||
1060 | .macro ENCODE_FRAME_POINTER ptregs_offset=0 | ||
1061 | diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S | ||
1062 | index c752abe89d80..4fd9044e72e7 100644 | ||
1063 | --- a/arch/x86/entry/entry_64.S | ||
1064 | +++ b/arch/x86/entry/entry_64.S | ||
1065 | @@ -213,7 +213,7 @@ ENTRY(entry_SYSCALL_64) | ||
1066 | |||
1067 | swapgs | ||
1068 | /* | ||
1069 | - * This path is not taken when PAGE_TABLE_ISOLATION is disabled so it | ||
1070 | + * This path is only taken when PAGE_TABLE_ISOLATION is disabled so it | ||
1071 | * is not required to switch CR3. | ||
1072 | */ | ||
1073 | movq %rsp, PER_CPU_VAR(rsp_scratch) | ||
1074 | @@ -227,22 +227,8 @@ ENTRY(entry_SYSCALL_64) | ||
1075 | pushq %rcx /* pt_regs->ip */ | ||
1076 | GLOBAL(entry_SYSCALL_64_after_hwframe) | ||
1077 | pushq %rax /* pt_regs->orig_ax */ | ||
1078 | - pushq %rdi /* pt_regs->di */ | ||
1079 | - pushq %rsi /* pt_regs->si */ | ||
1080 | - pushq %rdx /* pt_regs->dx */ | ||
1081 | - pushq %rcx /* pt_regs->cx */ | ||
1082 | - pushq $-ENOSYS /* pt_regs->ax */ | ||
1083 | - pushq %r8 /* pt_regs->r8 */ | ||
1084 | - pushq %r9 /* pt_regs->r9 */ | ||
1085 | - pushq %r10 /* pt_regs->r10 */ | ||
1086 | - pushq %r11 /* pt_regs->r11 */ | ||
1087 | - pushq %rbx /* pt_regs->rbx */ | ||
1088 | - pushq %rbp /* pt_regs->rbp */ | ||
1089 | - pushq %r12 /* pt_regs->r12 */ | ||
1090 | - pushq %r13 /* pt_regs->r13 */ | ||
1091 | - pushq %r14 /* pt_regs->r14 */ | ||
1092 | - pushq %r15 /* pt_regs->r15 */ | ||
1093 | - UNWIND_HINT_REGS | ||
1094 | + | ||
1095 | + PUSH_AND_CLEAR_REGS rax=$-ENOSYS | ||
1096 | |||
1097 | TRACE_IRQS_OFF | ||
1098 | |||
1099 | @@ -321,15 +307,7 @@ GLOBAL(entry_SYSCALL_64_after_hwframe) | ||
1100 | syscall_return_via_sysret: | ||
1101 | /* rcx and r11 are already restored (see code above) */ | ||
1102 | UNWIND_HINT_EMPTY | ||
1103 | - POP_EXTRA_REGS | ||
1104 | - popq %rsi /* skip r11 */ | ||
1105 | - popq %r10 | ||
1106 | - popq %r9 | ||
1107 | - popq %r8 | ||
1108 | - popq %rax | ||
1109 | - popq %rsi /* skip rcx */ | ||
1110 | - popq %rdx | ||
1111 | - popq %rsi | ||
1112 | + POP_REGS pop_rdi=0 skip_r11rcx=1 | ||
1113 | |||
1114 | /* | ||
1115 | * Now all regs are restored except RSP and RDI. | ||
1116 | @@ -559,9 +537,7 @@ END(irq_entries_start) | ||
1117 | call switch_to_thread_stack | ||
1118 | 1: | ||
1119 | |||
1120 | - ALLOC_PT_GPREGS_ON_STACK | ||
1121 | - SAVE_C_REGS | ||
1122 | - SAVE_EXTRA_REGS | ||
1123 | + PUSH_AND_CLEAR_REGS | ||
1124 | ENCODE_FRAME_POINTER | ||
1125 | |||
1126 | testb $3, CS(%rsp) | ||
1127 | @@ -622,15 +598,7 @@ GLOBAL(swapgs_restore_regs_and_return_to_usermode) | ||
1128 | ud2 | ||
1129 | 1: | ||
1130 | #endif | ||
1131 | - POP_EXTRA_REGS | ||
1132 | - popq %r11 | ||
1133 | - popq %r10 | ||
1134 | - popq %r9 | ||
1135 | - popq %r8 | ||
1136 | - popq %rax | ||
1137 | - popq %rcx | ||
1138 | - popq %rdx | ||
1139 | - popq %rsi | ||
1140 | + POP_REGS pop_rdi=0 | ||
1141 | |||
1142 | /* | ||
1143 | * The stack is now user RDI, orig_ax, RIP, CS, EFLAGS, RSP, SS. | ||
1144 | @@ -688,8 +656,7 @@ GLOBAL(restore_regs_and_return_to_kernel) | ||
1145 | ud2 | ||
1146 | 1: | ||
1147 | #endif | ||
1148 | - POP_EXTRA_REGS | ||
1149 | - POP_C_REGS | ||
1150 | + POP_REGS | ||
1151 | addq $8, %rsp /* skip regs->orig_ax */ | ||
1152 | INTERRUPT_RETURN | ||
1153 | |||
1154 | @@ -904,7 +871,9 @@ ENTRY(\sym) | ||
1155 | pushq $-1 /* ORIG_RAX: no syscall to restart */ | ||
1156 | .endif | ||
1157 | |||
1158 | - ALLOC_PT_GPREGS_ON_STACK | ||
1159 | + /* Save all registers in pt_regs */ | ||
1160 | + PUSH_AND_CLEAR_REGS | ||
1161 | + ENCODE_FRAME_POINTER | ||
1162 | |||
1163 | .if \paranoid < 2 | ||
1164 | testb $3, CS(%rsp) /* If coming from userspace, switch stacks */ | ||
1165 | @@ -1117,9 +1086,7 @@ ENTRY(xen_failsafe_callback) | ||
1166 | addq $0x30, %rsp | ||
1167 | UNWIND_HINT_IRET_REGS | ||
1168 | pushq $-1 /* orig_ax = -1 => not a system call */ | ||
1169 | - ALLOC_PT_GPREGS_ON_STACK | ||
1170 | - SAVE_C_REGS | ||
1171 | - SAVE_EXTRA_REGS | ||
1172 | + PUSH_AND_CLEAR_REGS | ||
1173 | ENCODE_FRAME_POINTER | ||
1174 | jmp error_exit | ||
1175 | END(xen_failsafe_callback) | ||
1176 | @@ -1156,16 +1123,13 @@ idtentry machine_check do_mce has_error_code=0 paranoid=1 | ||
1177 | #endif | ||
1178 | |||
1179 | /* | ||
1180 | - * Save all registers in pt_regs, and switch gs if needed. | ||
1181 | + * Switch gs if needed. | ||
1182 | * Use slow, but surefire "are we in kernel?" check. | ||
1183 | * Return: ebx=0: need swapgs on exit, ebx=1: otherwise | ||
1184 | */ | ||
1185 | ENTRY(paranoid_entry) | ||
1186 | UNWIND_HINT_FUNC | ||
1187 | cld | ||
1188 | - SAVE_C_REGS 8 | ||
1189 | - SAVE_EXTRA_REGS 8 | ||
1190 | - ENCODE_FRAME_POINTER 8 | ||
1191 | movl $1, %ebx | ||
1192 | movl $MSR_GS_BASE, %ecx | ||
1193 | rdmsr | ||
1194 | @@ -1204,21 +1168,18 @@ ENTRY(paranoid_exit) | ||
1195 | jmp .Lparanoid_exit_restore | ||
1196 | .Lparanoid_exit_no_swapgs: | ||
1197 | TRACE_IRQS_IRETQ_DEBUG | ||
1198 | + RESTORE_CR3 scratch_reg=%rbx save_reg=%r14 | ||
1199 | .Lparanoid_exit_restore: | ||
1200 | jmp restore_regs_and_return_to_kernel | ||
1201 | END(paranoid_exit) | ||
1202 | |||
1203 | /* | ||
1204 | - * Save all registers in pt_regs, and switch gs if needed. | ||
1205 | + * Switch gs if needed. | ||
1206 | * Return: EBX=0: came from user mode; EBX=1: otherwise | ||
1207 | */ | ||
1208 | ENTRY(error_entry) | ||
1209 | - UNWIND_HINT_FUNC | ||
1210 | + UNWIND_HINT_REGS offset=8 | ||
1211 | cld | ||
1212 | - SAVE_C_REGS 8 | ||
1213 | - SAVE_EXTRA_REGS 8 | ||
1214 | - ENCODE_FRAME_POINTER 8 | ||
1215 | - xorl %ebx, %ebx | ||
1216 | testb $3, CS+8(%rsp) | ||
1217 | jz .Lerror_kernelspace | ||
1218 | |||
1219 | @@ -1399,22 +1360,7 @@ ENTRY(nmi) | ||
1220 | pushq 1*8(%rdx) /* pt_regs->rip */ | ||
1221 | UNWIND_HINT_IRET_REGS | ||
1222 | pushq $-1 /* pt_regs->orig_ax */ | ||
1223 | - pushq %rdi /* pt_regs->di */ | ||
1224 | - pushq %rsi /* pt_regs->si */ | ||
1225 | - pushq (%rdx) /* pt_regs->dx */ | ||
1226 | - pushq %rcx /* pt_regs->cx */ | ||
1227 | - pushq %rax /* pt_regs->ax */ | ||
1228 | - pushq %r8 /* pt_regs->r8 */ | ||
1229 | - pushq %r9 /* pt_regs->r9 */ | ||
1230 | - pushq %r10 /* pt_regs->r10 */ | ||
1231 | - pushq %r11 /* pt_regs->r11 */ | ||
1232 | - pushq %rbx /* pt_regs->rbx */ | ||
1233 | - pushq %rbp /* pt_regs->rbp */ | ||
1234 | - pushq %r12 /* pt_regs->r12 */ | ||
1235 | - pushq %r13 /* pt_regs->r13 */ | ||
1236 | - pushq %r14 /* pt_regs->r14 */ | ||
1237 | - pushq %r15 /* pt_regs->r15 */ | ||
1238 | - UNWIND_HINT_REGS | ||
1239 | + PUSH_AND_CLEAR_REGS rdx=(%rdx) | ||
1240 | ENCODE_FRAME_POINTER | ||
1241 | |||
1242 | /* | ||
1243 | @@ -1624,7 +1570,8 @@ end_repeat_nmi: | ||
1244 | * frame to point back to repeat_nmi. | ||
1245 | */ | ||
1246 | pushq $-1 /* ORIG_RAX: no syscall to restart */ | ||
1247 | - ALLOC_PT_GPREGS_ON_STACK | ||
1248 | + PUSH_AND_CLEAR_REGS | ||
1249 | + ENCODE_FRAME_POINTER | ||
1250 | |||
1251 | /* | ||
1252 | * Use paranoid_entry to handle SWAPGS, but no need to use paranoid_exit | ||
1253 | @@ -1648,8 +1595,7 @@ end_repeat_nmi: | ||
1254 | nmi_swapgs: | ||
1255 | SWAPGS_UNSAFE_STACK | ||
1256 | nmi_restore: | ||
1257 | - POP_EXTRA_REGS | ||
1258 | - POP_C_REGS | ||
1259 | + POP_REGS | ||
1260 | |||
1261 | /* | ||
1262 | * Skip orig_ax and the "outermost" frame to point RSP at the "iret" | ||
1263 | diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S | ||
1264 | index 98d5358e4041..fd65e016e413 100644 | ||
1265 | --- a/arch/x86/entry/entry_64_compat.S | ||
1266 | +++ b/arch/x86/entry/entry_64_compat.S | ||
1267 | @@ -85,15 +85,25 @@ ENTRY(entry_SYSENTER_compat) | ||
1268 | pushq %rcx /* pt_regs->cx */ | ||
1269 | pushq $-ENOSYS /* pt_regs->ax */ | ||
1270 | pushq $0 /* pt_regs->r8 = 0 */ | ||
1271 | + xorq %r8, %r8 /* nospec r8 */ | ||
1272 | pushq $0 /* pt_regs->r9 = 0 */ | ||
1273 | + xorq %r9, %r9 /* nospec r9 */ | ||
1274 | pushq $0 /* pt_regs->r10 = 0 */ | ||
1275 | + xorq %r10, %r10 /* nospec r10 */ | ||
1276 | pushq $0 /* pt_regs->r11 = 0 */ | ||
1277 | + xorq %r11, %r11 /* nospec r11 */ | ||
1278 | pushq %rbx /* pt_regs->rbx */ | ||
1279 | + xorl %ebx, %ebx /* nospec rbx */ | ||
1280 | pushq %rbp /* pt_regs->rbp (will be overwritten) */ | ||
1281 | + xorl %ebp, %ebp /* nospec rbp */ | ||
1282 | pushq $0 /* pt_regs->r12 = 0 */ | ||
1283 | + xorq %r12, %r12 /* nospec r12 */ | ||
1284 | pushq $0 /* pt_regs->r13 = 0 */ | ||
1285 | + xorq %r13, %r13 /* nospec r13 */ | ||
1286 | pushq $0 /* pt_regs->r14 = 0 */ | ||
1287 | + xorq %r14, %r14 /* nospec r14 */ | ||
1288 | pushq $0 /* pt_regs->r15 = 0 */ | ||
1289 | + xorq %r15, %r15 /* nospec r15 */ | ||
1290 | cld | ||
1291 | |||
1292 | /* | ||
1293 | @@ -214,15 +224,25 @@ GLOBAL(entry_SYSCALL_compat_after_hwframe) | ||
1294 | pushq %rbp /* pt_regs->cx (stashed in bp) */ | ||
1295 | pushq $-ENOSYS /* pt_regs->ax */ | ||
1296 | pushq $0 /* pt_regs->r8 = 0 */ | ||
1297 | + xorq %r8, %r8 /* nospec r8 */ | ||
1298 | pushq $0 /* pt_regs->r9 = 0 */ | ||
1299 | + xorq %r9, %r9 /* nospec r9 */ | ||
1300 | pushq $0 /* pt_regs->r10 = 0 */ | ||
1301 | + xorq %r10, %r10 /* nospec r10 */ | ||
1302 | pushq $0 /* pt_regs->r11 = 0 */ | ||
1303 | + xorq %r11, %r11 /* nospec r11 */ | ||
1304 | pushq %rbx /* pt_regs->rbx */ | ||
1305 | + xorl %ebx, %ebx /* nospec rbx */ | ||
1306 | pushq %rbp /* pt_regs->rbp (will be overwritten) */ | ||
1307 | + xorl %ebp, %ebp /* nospec rbp */ | ||
1308 | pushq $0 /* pt_regs->r12 = 0 */ | ||
1309 | + xorq %r12, %r12 /* nospec r12 */ | ||
1310 | pushq $0 /* pt_regs->r13 = 0 */ | ||
1311 | + xorq %r13, %r13 /* nospec r13 */ | ||
1312 | pushq $0 /* pt_regs->r14 = 0 */ | ||
1313 | + xorq %r14, %r14 /* nospec r14 */ | ||
1314 | pushq $0 /* pt_regs->r15 = 0 */ | ||
1315 | + xorq %r15, %r15 /* nospec r15 */ | ||
1316 | |||
1317 | /* | ||
1318 | * User mode is traced as though IRQs are on, and SYSENTER | ||
1319 | @@ -338,15 +358,25 @@ ENTRY(entry_INT80_compat) | ||
1320 | pushq %rcx /* pt_regs->cx */ | ||
1321 | pushq $-ENOSYS /* pt_regs->ax */ | ||
1322 | pushq $0 /* pt_regs->r8 = 0 */ | ||
1323 | + xorq %r8, %r8 /* nospec r8 */ | ||
1324 | pushq $0 /* pt_regs->r9 = 0 */ | ||
1325 | + xorq %r9, %r9 /* nospec r9 */ | ||
1326 | pushq $0 /* pt_regs->r10 = 0 */ | ||
1327 | + xorq %r10, %r10 /* nospec r10 */ | ||
1328 | pushq $0 /* pt_regs->r11 = 0 */ | ||
1329 | + xorq %r11, %r11 /* nospec r11 */ | ||
1330 | pushq %rbx /* pt_regs->rbx */ | ||
1331 | + xorl %ebx, %ebx /* nospec rbx */ | ||
1332 | pushq %rbp /* pt_regs->rbp */ | ||
1333 | + xorl %ebp, %ebp /* nospec rbp */ | ||
1334 | pushq %r12 /* pt_regs->r12 */ | ||
1335 | + xorq %r12, %r12 /* nospec r12 */ | ||
1336 | pushq %r13 /* pt_regs->r13 */ | ||
1337 | + xorq %r13, %r13 /* nospec r13 */ | ||
1338 | pushq %r14 /* pt_regs->r14 */ | ||
1339 | + xorq %r14, %r14 /* nospec r14 */ | ||
1340 | pushq %r15 /* pt_regs->r15 */ | ||
1341 | + xorq %r15, %r15 /* nospec r15 */ | ||
1342 | cld | ||
1343 | |||
1344 | /* | ||
1345 | diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c | ||
1346 | index 731153a4681e..56457cb73448 100644 | ||
1347 | --- a/arch/x86/events/intel/core.c | ||
1348 | +++ b/arch/x86/events/intel/core.c | ||
1349 | @@ -3559,7 +3559,7 @@ static int intel_snb_pebs_broken(int cpu) | ||
1350 | break; | ||
1351 | |||
1352 | case INTEL_FAM6_SANDYBRIDGE_X: | ||
1353 | - switch (cpu_data(cpu).x86_mask) { | ||
1354 | + switch (cpu_data(cpu).x86_stepping) { | ||
1355 | case 6: rev = 0x618; break; | ||
1356 | case 7: rev = 0x70c; break; | ||
1357 | } | ||
1358 | diff --git a/arch/x86/events/intel/lbr.c b/arch/x86/events/intel/lbr.c | ||
1359 | index ae64d0b69729..cf372b90557e 100644 | ||
1360 | --- a/arch/x86/events/intel/lbr.c | ||
1361 | +++ b/arch/x86/events/intel/lbr.c | ||
1362 | @@ -1186,7 +1186,7 @@ void __init intel_pmu_lbr_init_atom(void) | ||
1363 | * on PMU interrupt | ||
1364 | */ | ||
1365 | if (boot_cpu_data.x86_model == 28 | ||
1366 | - && boot_cpu_data.x86_mask < 10) { | ||
1367 | + && boot_cpu_data.x86_stepping < 10) { | ||
1368 | pr_cont("LBR disabled due to erratum"); | ||
1369 | return; | ||
1370 | } | ||
1371 | diff --git a/arch/x86/events/intel/p6.c b/arch/x86/events/intel/p6.c | ||
1372 | index a5604c352930..408879b0c0d4 100644 | ||
1373 | --- a/arch/x86/events/intel/p6.c | ||
1374 | +++ b/arch/x86/events/intel/p6.c | ||
1375 | @@ -234,7 +234,7 @@ static __initconst const struct x86_pmu p6_pmu = { | ||
1376 | |||
1377 | static __init void p6_pmu_rdpmc_quirk(void) | ||
1378 | { | ||
1379 | - if (boot_cpu_data.x86_mask < 9) { | ||
1380 | + if (boot_cpu_data.x86_stepping < 9) { | ||
1381 | /* | ||
1382 | * PPro erratum 26; fixed in stepping 9 and above. | ||
1383 | */ | ||
1384 | diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h | ||
1385 | index 8d0ec9df1cbe..f077401869ee 100644 | ||
1386 | --- a/arch/x86/include/asm/acpi.h | ||
1387 | +++ b/arch/x86/include/asm/acpi.h | ||
1388 | @@ -94,7 +94,7 @@ static inline unsigned int acpi_processor_cstate_check(unsigned int max_cstate) | ||
1389 | if (boot_cpu_data.x86 == 0x0F && | ||
1390 | boot_cpu_data.x86_vendor == X86_VENDOR_AMD && | ||
1391 | boot_cpu_data.x86_model <= 0x05 && | ||
1392 | - boot_cpu_data.x86_mask < 0x0A) | ||
1393 | + boot_cpu_data.x86_stepping < 0x0A) | ||
1394 | return 1; | ||
1395 | else if (boot_cpu_has(X86_BUG_AMD_APIC_C1E)) | ||
1396 | return 1; | ||
1397 | diff --git a/arch/x86/include/asm/barrier.h b/arch/x86/include/asm/barrier.h | ||
1398 | index 30d406146016..e1259f043ae9 100644 | ||
1399 | --- a/arch/x86/include/asm/barrier.h | ||
1400 | +++ b/arch/x86/include/asm/barrier.h | ||
1401 | @@ -40,7 +40,7 @@ static inline unsigned long array_index_mask_nospec(unsigned long index, | ||
1402 | |||
1403 | asm ("cmp %1,%2; sbb %0,%0;" | ||
1404 | :"=r" (mask) | ||
1405 | - :"r"(size),"r" (index) | ||
1406 | + :"g"(size),"r" (index) | ||
1407 | :"cc"); | ||
1408 | return mask; | ||
1409 | } | ||
1410 | diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h | ||
1411 | index 34d99af43994..6804d6642767 100644 | ||
1412 | --- a/arch/x86/include/asm/bug.h | ||
1413 | +++ b/arch/x86/include/asm/bug.h | ||
1414 | @@ -5,23 +5,20 @@ | ||
1415 | #include <linux/stringify.h> | ||
1416 | |||
1417 | /* | ||
1418 | - * Since some emulators terminate on UD2, we cannot use it for WARN. | ||
1419 | - * Since various instruction decoders disagree on the length of UD1, | ||
1420 | - * we cannot use it either. So use UD0 for WARN. | ||
1421 | + * Despite that some emulators terminate on UD2, we use it for WARN(). | ||
1422 | * | ||
1423 | - * (binutils knows about "ud1" but {en,de}codes it as 2 bytes, whereas | ||
1424 | - * our kernel decoder thinks it takes a ModRM byte, which seems consistent | ||
1425 | - * with various things like the Intel SDM instruction encoding rules) | ||
1426 | + * Since various instruction decoders/specs disagree on the encoding of | ||
1427 | + * UD0/UD1. | ||
1428 | */ | ||
1429 | |||
1430 | -#define ASM_UD0 ".byte 0x0f, 0xff" | ||
1431 | +#define ASM_UD0 ".byte 0x0f, 0xff" /* + ModRM (for Intel) */ | ||
1432 | #define ASM_UD1 ".byte 0x0f, 0xb9" /* + ModRM */ | ||
1433 | #define ASM_UD2 ".byte 0x0f, 0x0b" | ||
1434 | |||
1435 | #define INSN_UD0 0xff0f | ||
1436 | #define INSN_UD2 0x0b0f | ||
1437 | |||
1438 | -#define LEN_UD0 2 | ||
1439 | +#define LEN_UD2 2 | ||
1440 | |||
1441 | #ifdef CONFIG_GENERIC_BUG | ||
1442 | |||
1443 | @@ -77,7 +74,11 @@ do { \ | ||
1444 | unreachable(); \ | ||
1445 | } while (0) | ||
1446 | |||
1447 | -#define __WARN_FLAGS(flags) _BUG_FLAGS(ASM_UD0, BUGFLAG_WARNING|(flags)) | ||
1448 | +#define __WARN_FLAGS(flags) \ | ||
1449 | +do { \ | ||
1450 | + _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \ | ||
1451 | + annotate_reachable(); \ | ||
1452 | +} while (0) | ||
1453 | |||
1454 | #include <asm-generic/bug.h> | ||
1455 | |||
1456 | diff --git a/arch/x86/include/asm/nospec-branch.h b/arch/x86/include/asm/nospec-branch.h | ||
1457 | index 4d57894635f2..76b058533e47 100644 | ||
1458 | --- a/arch/x86/include/asm/nospec-branch.h | ||
1459 | +++ b/arch/x86/include/asm/nospec-branch.h | ||
1460 | @@ -6,6 +6,7 @@ | ||
1461 | #include <asm/alternative.h> | ||
1462 | #include <asm/alternative-asm.h> | ||
1463 | #include <asm/cpufeatures.h> | ||
1464 | +#include <asm/msr-index.h> | ||
1465 | |||
1466 | #ifdef __ASSEMBLY__ | ||
1467 | |||
1468 | @@ -164,10 +165,15 @@ static inline void vmexit_fill_RSB(void) | ||
1469 | |||
1470 | static inline void indirect_branch_prediction_barrier(void) | ||
1471 | { | ||
1472 | - alternative_input("", | ||
1473 | - "call __ibp_barrier", | ||
1474 | - X86_FEATURE_USE_IBPB, | ||
1475 | - ASM_NO_INPUT_CLOBBER("eax", "ecx", "edx", "memory")); | ||
1476 | + asm volatile(ALTERNATIVE("", | ||
1477 | + "movl %[msr], %%ecx\n\t" | ||
1478 | + "movl %[val], %%eax\n\t" | ||
1479 | + "movl $0, %%edx\n\t" | ||
1480 | + "wrmsr", | ||
1481 | + X86_FEATURE_USE_IBPB) | ||
1482 | + : : [msr] "i" (MSR_IA32_PRED_CMD), | ||
1483 | + [val] "i" (PRED_CMD_IBPB) | ||
1484 | + : "eax", "ecx", "edx", "memory"); | ||
1485 | } | ||
1486 | |||
1487 | #endif /* __ASSEMBLY__ */ | ||
1488 | diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h | ||
1489 | index 4baa6bceb232..d652a3808065 100644 | ||
1490 | --- a/arch/x86/include/asm/page_64.h | ||
1491 | +++ b/arch/x86/include/asm/page_64.h | ||
1492 | @@ -52,10 +52,6 @@ static inline void clear_page(void *page) | ||
1493 | |||
1494 | void copy_page(void *to, void *from); | ||
1495 | |||
1496 | -#ifdef CONFIG_X86_MCE | ||
1497 | -#define arch_unmap_kpfn arch_unmap_kpfn | ||
1498 | -#endif | ||
1499 | - | ||
1500 | #endif /* !__ASSEMBLY__ */ | ||
1501 | |||
1502 | #ifdef CONFIG_X86_VSYSCALL_EMULATION | ||
1503 | diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h | ||
1504 | index 892df375b615..554841fab717 100644 | ||
1505 | --- a/arch/x86/include/asm/paravirt.h | ||
1506 | +++ b/arch/x86/include/asm/paravirt.h | ||
1507 | @@ -297,9 +297,9 @@ static inline void __flush_tlb_global(void) | ||
1508 | { | ||
1509 | PVOP_VCALL0(pv_mmu_ops.flush_tlb_kernel); | ||
1510 | } | ||
1511 | -static inline void __flush_tlb_single(unsigned long addr) | ||
1512 | +static inline void __flush_tlb_one_user(unsigned long addr) | ||
1513 | { | ||
1514 | - PVOP_VCALL1(pv_mmu_ops.flush_tlb_single, addr); | ||
1515 | + PVOP_VCALL1(pv_mmu_ops.flush_tlb_one_user, addr); | ||
1516 | } | ||
1517 | |||
1518 | static inline void flush_tlb_others(const struct cpumask *cpumask, | ||
1519 | diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h | ||
1520 | index 6ec54d01972d..f624f1f10316 100644 | ||
1521 | --- a/arch/x86/include/asm/paravirt_types.h | ||
1522 | +++ b/arch/x86/include/asm/paravirt_types.h | ||
1523 | @@ -217,7 +217,7 @@ struct pv_mmu_ops { | ||
1524 | /* TLB operations */ | ||
1525 | void (*flush_tlb_user)(void); | ||
1526 | void (*flush_tlb_kernel)(void); | ||
1527 | - void (*flush_tlb_single)(unsigned long addr); | ||
1528 | + void (*flush_tlb_one_user)(unsigned long addr); | ||
1529 | void (*flush_tlb_others)(const struct cpumask *cpus, | ||
1530 | const struct flush_tlb_info *info); | ||
1531 | |||
1532 | diff --git a/arch/x86/include/asm/pgtable_32.h b/arch/x86/include/asm/pgtable_32.h | ||
1533 | index e67c0620aec2..e55466760ff8 100644 | ||
1534 | --- a/arch/x86/include/asm/pgtable_32.h | ||
1535 | +++ b/arch/x86/include/asm/pgtable_32.h | ||
1536 | @@ -61,7 +61,7 @@ void paging_init(void); | ||
1537 | #define kpte_clear_flush(ptep, vaddr) \ | ||
1538 | do { \ | ||
1539 | pte_clear(&init_mm, (vaddr), (ptep)); \ | ||
1540 | - __flush_tlb_one((vaddr)); \ | ||
1541 | + __flush_tlb_one_kernel((vaddr)); \ | ||
1542 | } while (0) | ||
1543 | |||
1544 | #endif /* !__ASSEMBLY__ */ | ||
1545 | diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h | ||
1546 | index 513f9604c192..44c2c4ec6d60 100644 | ||
1547 | --- a/arch/x86/include/asm/processor.h | ||
1548 | +++ b/arch/x86/include/asm/processor.h | ||
1549 | @@ -91,7 +91,7 @@ struct cpuinfo_x86 { | ||
1550 | __u8 x86; /* CPU family */ | ||
1551 | __u8 x86_vendor; /* CPU vendor */ | ||
1552 | __u8 x86_model; | ||
1553 | - __u8 x86_mask; | ||
1554 | + __u8 x86_stepping; | ||
1555 | #ifdef CONFIG_X86_64 | ||
1556 | /* Number of 4K pages in DTLB/ITLB combined(in pages): */ | ||
1557 | int x86_tlbsize; | ||
1558 | @@ -109,7 +109,7 @@ struct cpuinfo_x86 { | ||
1559 | char x86_vendor_id[16]; | ||
1560 | char x86_model_id[64]; | ||
1561 | /* in KB - valid for CPUS which support this call: */ | ||
1562 | - int x86_cache_size; | ||
1563 | + unsigned int x86_cache_size; | ||
1564 | int x86_cache_alignment; /* In bytes */ | ||
1565 | /* Cache QoS architectural values: */ | ||
1566 | int x86_cache_max_rmid; /* max index */ | ||
1567 | @@ -969,7 +969,4 @@ bool xen_set_default_idle(void); | ||
1568 | |||
1569 | void stop_this_cpu(void *dummy); | ||
1570 | void df_debug(struct pt_regs *regs, long error_code); | ||
1571 | - | ||
1572 | -void __ibp_barrier(void); | ||
1573 | - | ||
1574 | #endif /* _ASM_X86_PROCESSOR_H */ | ||
1575 | diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h | ||
1576 | index 2b8f18ca5874..84137c22fdfa 100644 | ||
1577 | --- a/arch/x86/include/asm/tlbflush.h | ||
1578 | +++ b/arch/x86/include/asm/tlbflush.h | ||
1579 | @@ -140,7 +140,7 @@ static inline unsigned long build_cr3_noflush(pgd_t *pgd, u16 asid) | ||
1580 | #else | ||
1581 | #define __flush_tlb() __native_flush_tlb() | ||
1582 | #define __flush_tlb_global() __native_flush_tlb_global() | ||
1583 | -#define __flush_tlb_single(addr) __native_flush_tlb_single(addr) | ||
1584 | +#define __flush_tlb_one_user(addr) __native_flush_tlb_one_user(addr) | ||
1585 | #endif | ||
1586 | |||
1587 | static inline bool tlb_defer_switch_to_init_mm(void) | ||
1588 | @@ -400,7 +400,7 @@ static inline void __native_flush_tlb_global(void) | ||
1589 | /* | ||
1590 | * flush one page in the user mapping | ||
1591 | */ | ||
1592 | -static inline void __native_flush_tlb_single(unsigned long addr) | ||
1593 | +static inline void __native_flush_tlb_one_user(unsigned long addr) | ||
1594 | { | ||
1595 | u32 loaded_mm_asid = this_cpu_read(cpu_tlbstate.loaded_mm_asid); | ||
1596 | |||
1597 | @@ -437,18 +437,31 @@ static inline void __flush_tlb_all(void) | ||
1598 | /* | ||
1599 | * flush one page in the kernel mapping | ||
1600 | */ | ||
1601 | -static inline void __flush_tlb_one(unsigned long addr) | ||
1602 | +static inline void __flush_tlb_one_kernel(unsigned long addr) | ||
1603 | { | ||
1604 | count_vm_tlb_event(NR_TLB_LOCAL_FLUSH_ONE); | ||
1605 | - __flush_tlb_single(addr); | ||
1606 | + | ||
1607 | + /* | ||
1608 | + * If PTI is off, then __flush_tlb_one_user() is just INVLPG or its | ||
1609 | + * paravirt equivalent. Even with PCID, this is sufficient: we only | ||
1610 | + * use PCID if we also use global PTEs for the kernel mapping, and | ||
1611 | + * INVLPG flushes global translations across all address spaces. | ||
1612 | + * | ||
1613 | + * If PTI is on, then the kernel is mapped with non-global PTEs, and | ||
1614 | + * __flush_tlb_one_user() will flush the given address for the current | ||
1615 | + * kernel address space and for its usermode counterpart, but it does | ||
1616 | + * not flush it for other address spaces. | ||
1617 | + */ | ||
1618 | + __flush_tlb_one_user(addr); | ||
1619 | |||
1620 | if (!static_cpu_has(X86_FEATURE_PTI)) | ||
1621 | return; | ||
1622 | |||
1623 | /* | ||
1624 | - * __flush_tlb_single() will have cleared the TLB entry for this ASID, | ||
1625 | - * but since kernel space is replicated across all, we must also | ||
1626 | - * invalidate all others. | ||
1627 | + * See above. We need to propagate the flush to all other address | ||
1628 | + * spaces. In principle, we only need to propagate it to kernelmode | ||
1629 | + * address spaces, but the extra bookkeeping we would need is not | ||
1630 | + * worth it. | ||
1631 | */ | ||
1632 | invalidate_other_asid(); | ||
1633 | } | ||
1634 | diff --git a/arch/x86/kernel/amd_nb.c b/arch/x86/kernel/amd_nb.c | ||
1635 | index 6db28f17ff28..c88e0b127810 100644 | ||
1636 | --- a/arch/x86/kernel/amd_nb.c | ||
1637 | +++ b/arch/x86/kernel/amd_nb.c | ||
1638 | @@ -235,7 +235,7 @@ int amd_cache_northbridges(void) | ||
1639 | if (boot_cpu_data.x86 == 0x10 && | ||
1640 | boot_cpu_data.x86_model >= 0x8 && | ||
1641 | (boot_cpu_data.x86_model > 0x9 || | ||
1642 | - boot_cpu_data.x86_mask >= 0x1)) | ||
1643 | + boot_cpu_data.x86_stepping >= 0x1)) | ||
1644 | amd_northbridges.flags |= AMD_NB_L3_INDEX_DISABLE; | ||
1645 | |||
1646 | if (boot_cpu_data.x86 == 0x15) | ||
1647 | diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c | ||
1648 | index 25ddf02598d2..b203af0855b5 100644 | ||
1649 | --- a/arch/x86/kernel/apic/apic.c | ||
1650 | +++ b/arch/x86/kernel/apic/apic.c | ||
1651 | @@ -546,7 +546,7 @@ static DEFINE_PER_CPU(struct clock_event_device, lapic_events); | ||
1652 | |||
1653 | static u32 hsx_deadline_rev(void) | ||
1654 | { | ||
1655 | - switch (boot_cpu_data.x86_mask) { | ||
1656 | + switch (boot_cpu_data.x86_stepping) { | ||
1657 | case 0x02: return 0x3a; /* EP */ | ||
1658 | case 0x04: return 0x0f; /* EX */ | ||
1659 | } | ||
1660 | @@ -556,7 +556,7 @@ static u32 hsx_deadline_rev(void) | ||
1661 | |||
1662 | static u32 bdx_deadline_rev(void) | ||
1663 | { | ||
1664 | - switch (boot_cpu_data.x86_mask) { | ||
1665 | + switch (boot_cpu_data.x86_stepping) { | ||
1666 | case 0x02: return 0x00000011; | ||
1667 | case 0x03: return 0x0700000e; | ||
1668 | case 0x04: return 0x0f00000c; | ||
1669 | @@ -568,7 +568,7 @@ static u32 bdx_deadline_rev(void) | ||
1670 | |||
1671 | static u32 skx_deadline_rev(void) | ||
1672 | { | ||
1673 | - switch (boot_cpu_data.x86_mask) { | ||
1674 | + switch (boot_cpu_data.x86_stepping) { | ||
1675 | case 0x03: return 0x01000136; | ||
1676 | case 0x04: return 0x02000014; | ||
1677 | } | ||
1678 | diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c | ||
1679 | index e4b0d92b3ae0..2a7fd56e67b3 100644 | ||
1680 | --- a/arch/x86/kernel/apm_32.c | ||
1681 | +++ b/arch/x86/kernel/apm_32.c | ||
1682 | @@ -2389,6 +2389,7 @@ static int __init apm_init(void) | ||
1683 | if (HZ != 100) | ||
1684 | idle_period = (idle_period * HZ) / 100; | ||
1685 | if (idle_threshold < 100) { | ||
1686 | + cpuidle_poll_state_init(&apm_idle_driver); | ||
1687 | if (!cpuidle_register_driver(&apm_idle_driver)) | ||
1688 | if (cpuidle_register_device(&apm_cpuidle_device)) | ||
1689 | cpuidle_unregister_driver(&apm_idle_driver); | ||
1690 | diff --git a/arch/x86/kernel/asm-offsets_32.c b/arch/x86/kernel/asm-offsets_32.c | ||
1691 | index fa1261eefa16..f91ba53e06c8 100644 | ||
1692 | --- a/arch/x86/kernel/asm-offsets_32.c | ||
1693 | +++ b/arch/x86/kernel/asm-offsets_32.c | ||
1694 | @@ -18,7 +18,7 @@ void foo(void) | ||
1695 | OFFSET(CPUINFO_x86, cpuinfo_x86, x86); | ||
1696 | OFFSET(CPUINFO_x86_vendor, cpuinfo_x86, x86_vendor); | ||
1697 | OFFSET(CPUINFO_x86_model, cpuinfo_x86, x86_model); | ||
1698 | - OFFSET(CPUINFO_x86_mask, cpuinfo_x86, x86_mask); | ||
1699 | + OFFSET(CPUINFO_x86_stepping, cpuinfo_x86, x86_stepping); | ||
1700 | OFFSET(CPUINFO_cpuid_level, cpuinfo_x86, cpuid_level); | ||
1701 | OFFSET(CPUINFO_x86_capability, cpuinfo_x86, x86_capability); | ||
1702 | OFFSET(CPUINFO_x86_vendor_id, cpuinfo_x86, x86_vendor_id); | ||
1703 | diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c | ||
1704 | index ea831c858195..e7d5a7883632 100644 | ||
1705 | --- a/arch/x86/kernel/cpu/amd.c | ||
1706 | +++ b/arch/x86/kernel/cpu/amd.c | ||
1707 | @@ -119,7 +119,7 @@ static void init_amd_k6(struct cpuinfo_x86 *c) | ||
1708 | return; | ||
1709 | } | ||
1710 | |||
1711 | - if (c->x86_model == 6 && c->x86_mask == 1) { | ||
1712 | + if (c->x86_model == 6 && c->x86_stepping == 1) { | ||
1713 | const int K6_BUG_LOOP = 1000000; | ||
1714 | int n; | ||
1715 | void (*f_vide)(void); | ||
1716 | @@ -149,7 +149,7 @@ static void init_amd_k6(struct cpuinfo_x86 *c) | ||
1717 | |||
1718 | /* K6 with old style WHCR */ | ||
1719 | if (c->x86_model < 8 || | ||
1720 | - (c->x86_model == 8 && c->x86_mask < 8)) { | ||
1721 | + (c->x86_model == 8 && c->x86_stepping < 8)) { | ||
1722 | /* We can only write allocate on the low 508Mb */ | ||
1723 | if (mbytes > 508) | ||
1724 | mbytes = 508; | ||
1725 | @@ -168,7 +168,7 @@ static void init_amd_k6(struct cpuinfo_x86 *c) | ||
1726 | return; | ||
1727 | } | ||
1728 | |||
1729 | - if ((c->x86_model == 8 && c->x86_mask > 7) || | ||
1730 | + if ((c->x86_model == 8 && c->x86_stepping > 7) || | ||
1731 | c->x86_model == 9 || c->x86_model == 13) { | ||
1732 | /* The more serious chips .. */ | ||
1733 | |||
1734 | @@ -221,7 +221,7 @@ static void init_amd_k7(struct cpuinfo_x86 *c) | ||
1735 | * are more robust with CLK_CTL set to 200xxxxx instead of 600xxxxx | ||
1736 | * As per AMD technical note 27212 0.2 | ||
1737 | */ | ||
1738 | - if ((c->x86_model == 8 && c->x86_mask >= 1) || (c->x86_model > 8)) { | ||
1739 | + if ((c->x86_model == 8 && c->x86_stepping >= 1) || (c->x86_model > 8)) { | ||
1740 | rdmsr(MSR_K7_CLK_CTL, l, h); | ||
1741 | if ((l & 0xfff00000) != 0x20000000) { | ||
1742 | pr_info("CPU: CLK_CTL MSR was %x. Reprogramming to %x\n", | ||
1743 | @@ -241,12 +241,12 @@ static void init_amd_k7(struct cpuinfo_x86 *c) | ||
1744 | * but they are not certified as MP capable. | ||
1745 | */ | ||
1746 | /* Athlon 660/661 is valid. */ | ||
1747 | - if ((c->x86_model == 6) && ((c->x86_mask == 0) || | ||
1748 | - (c->x86_mask == 1))) | ||
1749 | + if ((c->x86_model == 6) && ((c->x86_stepping == 0) || | ||
1750 | + (c->x86_stepping == 1))) | ||
1751 | return; | ||
1752 | |||
1753 | /* Duron 670 is valid */ | ||
1754 | - if ((c->x86_model == 7) && (c->x86_mask == 0)) | ||
1755 | + if ((c->x86_model == 7) && (c->x86_stepping == 0)) | ||
1756 | return; | ||
1757 | |||
1758 | /* | ||
1759 | @@ -256,8 +256,8 @@ static void init_amd_k7(struct cpuinfo_x86 *c) | ||
1760 | * See http://www.heise.de/newsticker/data/jow-18.10.01-000 for | ||
1761 | * more. | ||
1762 | */ | ||
1763 | - if (((c->x86_model == 6) && (c->x86_mask >= 2)) || | ||
1764 | - ((c->x86_model == 7) && (c->x86_mask >= 1)) || | ||
1765 | + if (((c->x86_model == 6) && (c->x86_stepping >= 2)) || | ||
1766 | + ((c->x86_model == 7) && (c->x86_stepping >= 1)) || | ||
1767 | (c->x86_model > 7)) | ||
1768 | if (cpu_has(c, X86_FEATURE_MP)) | ||
1769 | return; | ||
1770 | @@ -583,7 +583,7 @@ static void early_init_amd(struct cpuinfo_x86 *c) | ||
1771 | /* Set MTRR capability flag if appropriate */ | ||
1772 | if (c->x86 == 5) | ||
1773 | if (c->x86_model == 13 || c->x86_model == 9 || | ||
1774 | - (c->x86_model == 8 && c->x86_mask >= 8)) | ||
1775 | + (c->x86_model == 8 && c->x86_stepping >= 8)) | ||
1776 | set_cpu_cap(c, X86_FEATURE_K6_MTRR); | ||
1777 | #endif | ||
1778 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_PCI) | ||
1779 | @@ -769,7 +769,7 @@ static void init_amd_zn(struct cpuinfo_x86 *c) | ||
1780 | * Fix erratum 1076: CPB feature bit not being set in CPUID. It affects | ||
1781 | * all up to and including B1. | ||
1782 | */ | ||
1783 | - if (c->x86_model <= 1 && c->x86_mask <= 1) | ||
1784 | + if (c->x86_model <= 1 && c->x86_stepping <= 1) | ||
1785 | set_cpu_cap(c, X86_FEATURE_CPB); | ||
1786 | } | ||
1787 | |||
1788 | @@ -880,11 +880,11 @@ static unsigned int amd_size_cache(struct cpuinfo_x86 *c, unsigned int size) | ||
1789 | /* AMD errata T13 (order #21922) */ | ||
1790 | if ((c->x86 == 6)) { | ||
1791 | /* Duron Rev A0 */ | ||
1792 | - if (c->x86_model == 3 && c->x86_mask == 0) | ||
1793 | + if (c->x86_model == 3 && c->x86_stepping == 0) | ||
1794 | size = 64; | ||
1795 | /* Tbird rev A1/A2 */ | ||
1796 | if (c->x86_model == 4 && | ||
1797 | - (c->x86_mask == 0 || c->x86_mask == 1)) | ||
1798 | + (c->x86_stepping == 0 || c->x86_stepping == 1)) | ||
1799 | size = 256; | ||
1800 | } | ||
1801 | return size; | ||
1802 | @@ -1021,7 +1021,7 @@ static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum) | ||
1803 | } | ||
1804 | |||
1805 | /* OSVW unavailable or ID unknown, match family-model-stepping range */ | ||
1806 | - ms = (cpu->x86_model << 4) | cpu->x86_mask; | ||
1807 | + ms = (cpu->x86_model << 4) | cpu->x86_stepping; | ||
1808 | while ((range = *erratum++)) | ||
1809 | if ((cpu->x86 == AMD_MODEL_RANGE_FAMILY(range)) && | ||
1810 | (ms >= AMD_MODEL_RANGE_START(range)) && | ||
1811 | diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c | ||
1812 | index 71949bf2de5a..d71c8b54b696 100644 | ||
1813 | --- a/arch/x86/kernel/cpu/bugs.c | ||
1814 | +++ b/arch/x86/kernel/cpu/bugs.c | ||
1815 | @@ -162,8 +162,7 @@ static enum spectre_v2_mitigation_cmd __init spectre_v2_parse_cmdline(void) | ||
1816 | if (cmdline_find_option_bool(boot_command_line, "nospectre_v2")) | ||
1817 | return SPECTRE_V2_CMD_NONE; | ||
1818 | else { | ||
1819 | - ret = cmdline_find_option(boot_command_line, "spectre_v2", arg, | ||
1820 | - sizeof(arg)); | ||
1821 | + ret = cmdline_find_option(boot_command_line, "spectre_v2", arg, sizeof(arg)); | ||
1822 | if (ret < 0) | ||
1823 | return SPECTRE_V2_CMD_AUTO; | ||
1824 | |||
1825 | @@ -175,8 +174,7 @@ static enum spectre_v2_mitigation_cmd __init spectre_v2_parse_cmdline(void) | ||
1826 | } | ||
1827 | |||
1828 | if (i >= ARRAY_SIZE(mitigation_options)) { | ||
1829 | - pr_err("unknown option (%s). Switching to AUTO select\n", | ||
1830 | - mitigation_options[i].option); | ||
1831 | + pr_err("unknown option (%s). Switching to AUTO select\n", arg); | ||
1832 | return SPECTRE_V2_CMD_AUTO; | ||
1833 | } | ||
1834 | } | ||
1835 | @@ -185,8 +183,7 @@ static enum spectre_v2_mitigation_cmd __init spectre_v2_parse_cmdline(void) | ||
1836 | cmd == SPECTRE_V2_CMD_RETPOLINE_AMD || | ||
1837 | cmd == SPECTRE_V2_CMD_RETPOLINE_GENERIC) && | ||
1838 | !IS_ENABLED(CONFIG_RETPOLINE)) { | ||
1839 | - pr_err("%s selected but not compiled in. Switching to AUTO select\n", | ||
1840 | - mitigation_options[i].option); | ||
1841 | + pr_err("%s selected but not compiled in. Switching to AUTO select\n", mitigation_options[i].option); | ||
1842 | return SPECTRE_V2_CMD_AUTO; | ||
1843 | } | ||
1844 | |||
1845 | @@ -256,14 +253,14 @@ static void __init spectre_v2_select_mitigation(void) | ||
1846 | goto retpoline_auto; | ||
1847 | break; | ||
1848 | } | ||
1849 | - pr_err("kernel not compiled with retpoline; no mitigation available!"); | ||
1850 | + pr_err("Spectre mitigation: kernel not compiled with retpoline; no mitigation available!"); | ||
1851 | return; | ||
1852 | |||
1853 | retpoline_auto: | ||
1854 | if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) { | ||
1855 | retpoline_amd: | ||
1856 | if (!boot_cpu_has(X86_FEATURE_LFENCE_RDTSC)) { | ||
1857 | - pr_err("LFENCE not serializing. Switching to generic retpoline\n"); | ||
1858 | + pr_err("Spectre mitigation: LFENCE not serializing, switching to generic retpoline\n"); | ||
1859 | goto retpoline_generic; | ||
1860 | } | ||
1861 | mode = retp_compiler() ? SPECTRE_V2_RETPOLINE_AMD : | ||
1862 | @@ -281,7 +278,7 @@ static void __init spectre_v2_select_mitigation(void) | ||
1863 | pr_info("%s\n", spectre_v2_strings[mode]); | ||
1864 | |||
1865 | /* | ||
1866 | - * If neither SMEP or KPTI are available, there is a risk of | ||
1867 | + * If neither SMEP nor PTI are available, there is a risk of | ||
1868 | * hitting userspace addresses in the RSB after a context switch | ||
1869 | * from a shallow call stack to a deeper one. To prevent this fill | ||
1870 | * the entire RSB, even when using IBRS. | ||
1871 | @@ -295,21 +292,20 @@ static void __init spectre_v2_select_mitigation(void) | ||
1872 | if ((!boot_cpu_has(X86_FEATURE_PTI) && | ||
1873 | !boot_cpu_has(X86_FEATURE_SMEP)) || is_skylake_era()) { | ||
1874 | setup_force_cpu_cap(X86_FEATURE_RSB_CTXSW); | ||
1875 | - pr_info("Filling RSB on context switch\n"); | ||
1876 | + pr_info("Spectre v2 mitigation: Filling RSB on context switch\n"); | ||
1877 | } | ||
1878 | |||
1879 | /* Initialize Indirect Branch Prediction Barrier if supported */ | ||
1880 | if (boot_cpu_has(X86_FEATURE_IBPB)) { | ||
1881 | setup_force_cpu_cap(X86_FEATURE_USE_IBPB); | ||
1882 | - pr_info("Enabling Indirect Branch Prediction Barrier\n"); | ||
1883 | + pr_info("Spectre v2 mitigation: Enabling Indirect Branch Prediction Barrier\n"); | ||
1884 | } | ||
1885 | } | ||
1886 | |||
1887 | #undef pr_fmt | ||
1888 | |||
1889 | #ifdef CONFIG_SYSFS | ||
1890 | -ssize_t cpu_show_meltdown(struct device *dev, | ||
1891 | - struct device_attribute *attr, char *buf) | ||
1892 | +ssize_t cpu_show_meltdown(struct device *dev, struct device_attribute *attr, char *buf) | ||
1893 | { | ||
1894 | if (!boot_cpu_has_bug(X86_BUG_CPU_MELTDOWN)) | ||
1895 | return sprintf(buf, "Not affected\n"); | ||
1896 | @@ -318,16 +314,14 @@ ssize_t cpu_show_meltdown(struct device *dev, | ||
1897 | return sprintf(buf, "Vulnerable\n"); | ||
1898 | } | ||
1899 | |||
1900 | -ssize_t cpu_show_spectre_v1(struct device *dev, | ||
1901 | - struct device_attribute *attr, char *buf) | ||
1902 | +ssize_t cpu_show_spectre_v1(struct device *dev, struct device_attribute *attr, char *buf) | ||
1903 | { | ||
1904 | if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V1)) | ||
1905 | return sprintf(buf, "Not affected\n"); | ||
1906 | return sprintf(buf, "Mitigation: __user pointer sanitization\n"); | ||
1907 | } | ||
1908 | |||
1909 | -ssize_t cpu_show_spectre_v2(struct device *dev, | ||
1910 | - struct device_attribute *attr, char *buf) | ||
1911 | +ssize_t cpu_show_spectre_v2(struct device *dev, struct device_attribute *attr, char *buf) | ||
1912 | { | ||
1913 | if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V2)) | ||
1914 | return sprintf(buf, "Not affected\n"); | ||
1915 | @@ -337,9 +331,3 @@ ssize_t cpu_show_spectre_v2(struct device *dev, | ||
1916 | spectre_v2_module_string()); | ||
1917 | } | ||
1918 | #endif | ||
1919 | - | ||
1920 | -void __ibp_barrier(void) | ||
1921 | -{ | ||
1922 | - __wrmsr(MSR_IA32_PRED_CMD, PRED_CMD_IBPB, 0); | ||
1923 | -} | ||
1924 | -EXPORT_SYMBOL_GPL(__ibp_barrier); | ||
1925 | diff --git a/arch/x86/kernel/cpu/centaur.c b/arch/x86/kernel/cpu/centaur.c | ||
1926 | index 68bc6d9b3132..595be776727d 100644 | ||
1927 | --- a/arch/x86/kernel/cpu/centaur.c | ||
1928 | +++ b/arch/x86/kernel/cpu/centaur.c | ||
1929 | @@ -136,7 +136,7 @@ static void init_centaur(struct cpuinfo_x86 *c) | ||
1930 | clear_cpu_cap(c, X86_FEATURE_TSC); | ||
1931 | break; | ||
1932 | case 8: | ||
1933 | - switch (c->x86_mask) { | ||
1934 | + switch (c->x86_stepping) { | ||
1935 | default: | ||
1936 | name = "2"; | ||
1937 | break; | ||
1938 | @@ -211,7 +211,7 @@ centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size) | ||
1939 | * - Note, it seems this may only be in engineering samples. | ||
1940 | */ | ||
1941 | if ((c->x86 == 6) && (c->x86_model == 9) && | ||
1942 | - (c->x86_mask == 1) && (size == 65)) | ||
1943 | + (c->x86_stepping == 1) && (size == 65)) | ||
1944 | size -= 1; | ||
1945 | return size; | ||
1946 | } | ||
1947 | diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c | ||
1948 | index d63f4b5706e4..824aee0117bb 100644 | ||
1949 | --- a/arch/x86/kernel/cpu/common.c | ||
1950 | +++ b/arch/x86/kernel/cpu/common.c | ||
1951 | @@ -731,7 +731,7 @@ void cpu_detect(struct cpuinfo_x86 *c) | ||
1952 | cpuid(0x00000001, &tfms, &misc, &junk, &cap0); | ||
1953 | c->x86 = x86_family(tfms); | ||
1954 | c->x86_model = x86_model(tfms); | ||
1955 | - c->x86_mask = x86_stepping(tfms); | ||
1956 | + c->x86_stepping = x86_stepping(tfms); | ||
1957 | |||
1958 | if (cap0 & (1<<19)) { | ||
1959 | c->x86_clflush_size = ((misc >> 8) & 0xff) * 8; | ||
1960 | @@ -1184,9 +1184,9 @@ static void identify_cpu(struct cpuinfo_x86 *c) | ||
1961 | int i; | ||
1962 | |||
1963 | c->loops_per_jiffy = loops_per_jiffy; | ||
1964 | - c->x86_cache_size = -1; | ||
1965 | + c->x86_cache_size = 0; | ||
1966 | c->x86_vendor = X86_VENDOR_UNKNOWN; | ||
1967 | - c->x86_model = c->x86_mask = 0; /* So far unknown... */ | ||
1968 | + c->x86_model = c->x86_stepping = 0; /* So far unknown... */ | ||
1969 | c->x86_vendor_id[0] = '\0'; /* Unset */ | ||
1970 | c->x86_model_id[0] = '\0'; /* Unset */ | ||
1971 | c->x86_max_cores = 1; | ||
1972 | @@ -1378,8 +1378,8 @@ void print_cpu_info(struct cpuinfo_x86 *c) | ||
1973 | |||
1974 | pr_cont(" (family: 0x%x, model: 0x%x", c->x86, c->x86_model); | ||
1975 | |||
1976 | - if (c->x86_mask || c->cpuid_level >= 0) | ||
1977 | - pr_cont(", stepping: 0x%x)\n", c->x86_mask); | ||
1978 | + if (c->x86_stepping || c->cpuid_level >= 0) | ||
1979 | + pr_cont(", stepping: 0x%x)\n", c->x86_stepping); | ||
1980 | else | ||
1981 | pr_cont(")\n"); | ||
1982 | } | ||
1983 | diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c | ||
1984 | index 6b4bb335641f..8949b7ae6d92 100644 | ||
1985 | --- a/arch/x86/kernel/cpu/cyrix.c | ||
1986 | +++ b/arch/x86/kernel/cpu/cyrix.c | ||
1987 | @@ -215,7 +215,7 @@ static void init_cyrix(struct cpuinfo_x86 *c) | ||
1988 | |||
1989 | /* common case step number/rev -- exceptions handled below */ | ||
1990 | c->x86_model = (dir1 >> 4) + 1; | ||
1991 | - c->x86_mask = dir1 & 0xf; | ||
1992 | + c->x86_stepping = dir1 & 0xf; | ||
1993 | |||
1994 | /* Now cook; the original recipe is by Channing Corn, from Cyrix. | ||
1995 | * We do the same thing for each generation: we work out | ||
1996 | diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c | ||
1997 | index 319bf989fad1..d19e903214b4 100644 | ||
1998 | --- a/arch/x86/kernel/cpu/intel.c | ||
1999 | +++ b/arch/x86/kernel/cpu/intel.c | ||
2000 | @@ -116,14 +116,13 @@ struct sku_microcode { | ||
2001 | u32 microcode; | ||
2002 | }; | ||
2003 | static const struct sku_microcode spectre_bad_microcodes[] = { | ||
2004 | - { INTEL_FAM6_KABYLAKE_DESKTOP, 0x0B, 0x84 }, | ||
2005 | - { INTEL_FAM6_KABYLAKE_DESKTOP, 0x0A, 0x84 }, | ||
2006 | - { INTEL_FAM6_KABYLAKE_DESKTOP, 0x09, 0x84 }, | ||
2007 | - { INTEL_FAM6_KABYLAKE_MOBILE, 0x0A, 0x84 }, | ||
2008 | - { INTEL_FAM6_KABYLAKE_MOBILE, 0x09, 0x84 }, | ||
2009 | + { INTEL_FAM6_KABYLAKE_DESKTOP, 0x0B, 0x80 }, | ||
2010 | + { INTEL_FAM6_KABYLAKE_DESKTOP, 0x0A, 0x80 }, | ||
2011 | + { INTEL_FAM6_KABYLAKE_DESKTOP, 0x09, 0x80 }, | ||
2012 | + { INTEL_FAM6_KABYLAKE_MOBILE, 0x0A, 0x80 }, | ||
2013 | + { INTEL_FAM6_KABYLAKE_MOBILE, 0x09, 0x80 }, | ||
2014 | { INTEL_FAM6_SKYLAKE_X, 0x03, 0x0100013e }, | ||
2015 | { INTEL_FAM6_SKYLAKE_X, 0x04, 0x0200003c }, | ||
2016 | - { INTEL_FAM6_SKYLAKE_MOBILE, 0x03, 0xc2 }, | ||
2017 | { INTEL_FAM6_SKYLAKE_DESKTOP, 0x03, 0xc2 }, | ||
2018 | { INTEL_FAM6_BROADWELL_CORE, 0x04, 0x28 }, | ||
2019 | { INTEL_FAM6_BROADWELL_GT3E, 0x01, 0x1b }, | ||
2020 | @@ -136,8 +135,6 @@ static const struct sku_microcode spectre_bad_microcodes[] = { | ||
2021 | { INTEL_FAM6_HASWELL_X, 0x02, 0x3b }, | ||
2022 | { INTEL_FAM6_HASWELL_X, 0x04, 0x10 }, | ||
2023 | { INTEL_FAM6_IVYBRIDGE_X, 0x04, 0x42a }, | ||
2024 | - /* Updated in the 20180108 release; blacklist until we know otherwise */ | ||
2025 | - { INTEL_FAM6_ATOM_GEMINI_LAKE, 0x01, 0x22 }, | ||
2026 | /* Observed in the wild */ | ||
2027 | { INTEL_FAM6_SANDYBRIDGE_X, 0x06, 0x61b }, | ||
2028 | { INTEL_FAM6_SANDYBRIDGE_X, 0x07, 0x712 }, | ||
2029 | @@ -149,7 +146,7 @@ static bool bad_spectre_microcode(struct cpuinfo_x86 *c) | ||
2030 | |||
2031 | for (i = 0; i < ARRAY_SIZE(spectre_bad_microcodes); i++) { | ||
2032 | if (c->x86_model == spectre_bad_microcodes[i].model && | ||
2033 | - c->x86_mask == spectre_bad_microcodes[i].stepping) | ||
2034 | + c->x86_stepping == spectre_bad_microcodes[i].stepping) | ||
2035 | return (c->microcode <= spectre_bad_microcodes[i].microcode); | ||
2036 | } | ||
2037 | return false; | ||
2038 | @@ -196,7 +193,7 @@ static void early_init_intel(struct cpuinfo_x86 *c) | ||
2039 | * need the microcode to have already been loaded... so if it is | ||
2040 | * not, recommend a BIOS update and disable large pages. | ||
2041 | */ | ||
2042 | - if (c->x86 == 6 && c->x86_model == 0x1c && c->x86_mask <= 2 && | ||
2043 | + if (c->x86 == 6 && c->x86_model == 0x1c && c->x86_stepping <= 2 && | ||
2044 | c->microcode < 0x20e) { | ||
2045 | pr_warn("Atom PSE erratum detected, BIOS microcode update recommended\n"); | ||
2046 | clear_cpu_cap(c, X86_FEATURE_PSE); | ||
2047 | @@ -212,7 +209,7 @@ static void early_init_intel(struct cpuinfo_x86 *c) | ||
2048 | |||
2049 | /* CPUID workaround for 0F33/0F34 CPU */ | ||
2050 | if (c->x86 == 0xF && c->x86_model == 0x3 | ||
2051 | - && (c->x86_mask == 0x3 || c->x86_mask == 0x4)) | ||
2052 | + && (c->x86_stepping == 0x3 || c->x86_stepping == 0x4)) | ||
2053 | c->x86_phys_bits = 36; | ||
2054 | |||
2055 | /* | ||
2056 | @@ -310,7 +307,7 @@ int ppro_with_ram_bug(void) | ||
2057 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && | ||
2058 | boot_cpu_data.x86 == 6 && | ||
2059 | boot_cpu_data.x86_model == 1 && | ||
2060 | - boot_cpu_data.x86_mask < 8) { | ||
2061 | + boot_cpu_data.x86_stepping < 8) { | ||
2062 | pr_info("Pentium Pro with Errata#50 detected. Taking evasive action.\n"); | ||
2063 | return 1; | ||
2064 | } | ||
2065 | @@ -327,7 +324,7 @@ static void intel_smp_check(struct cpuinfo_x86 *c) | ||
2066 | * Mask B, Pentium, but not Pentium MMX | ||
2067 | */ | ||
2068 | if (c->x86 == 5 && | ||
2069 | - c->x86_mask >= 1 && c->x86_mask <= 4 && | ||
2070 | + c->x86_stepping >= 1 && c->x86_stepping <= 4 && | ||
2071 | c->x86_model <= 3) { | ||
2072 | /* | ||
2073 | * Remember we have B step Pentia with bugs | ||
2074 | @@ -370,7 +367,7 @@ static void intel_workarounds(struct cpuinfo_x86 *c) | ||
2075 | * SEP CPUID bug: Pentium Pro reports SEP but doesn't have it until | ||
2076 | * model 3 mask 3 | ||
2077 | */ | ||
2078 | - if ((c->x86<<8 | c->x86_model<<4 | c->x86_mask) < 0x633) | ||
2079 | + if ((c->x86<<8 | c->x86_model<<4 | c->x86_stepping) < 0x633) | ||
2080 | clear_cpu_cap(c, X86_FEATURE_SEP); | ||
2081 | |||
2082 | /* | ||
2083 | @@ -388,7 +385,7 @@ static void intel_workarounds(struct cpuinfo_x86 *c) | ||
2084 | * P4 Xeon erratum 037 workaround. | ||
2085 | * Hardware prefetcher may cause stale data to be loaded into the cache. | ||
2086 | */ | ||
2087 | - if ((c->x86 == 15) && (c->x86_model == 1) && (c->x86_mask == 1)) { | ||
2088 | + if ((c->x86 == 15) && (c->x86_model == 1) && (c->x86_stepping == 1)) { | ||
2089 | if (msr_set_bit(MSR_IA32_MISC_ENABLE, | ||
2090 | MSR_IA32_MISC_ENABLE_PREFETCH_DISABLE_BIT) > 0) { | ||
2091 | pr_info("CPU: C0 stepping P4 Xeon detected.\n"); | ||
2092 | @@ -403,7 +400,7 @@ static void intel_workarounds(struct cpuinfo_x86 *c) | ||
2093 | * Specification Update"). | ||
2094 | */ | ||
2095 | if (boot_cpu_has(X86_FEATURE_APIC) && (c->x86<<8 | c->x86_model<<4) == 0x520 && | ||
2096 | - (c->x86_mask < 0x6 || c->x86_mask == 0xb)) | ||
2097 | + (c->x86_stepping < 0x6 || c->x86_stepping == 0xb)) | ||
2098 | set_cpu_bug(c, X86_BUG_11AP); | ||
2099 | |||
2100 | |||
2101 | @@ -650,7 +647,7 @@ static void init_intel(struct cpuinfo_x86 *c) | ||
2102 | case 6: | ||
2103 | if (l2 == 128) | ||
2104 | p = "Celeron (Mendocino)"; | ||
2105 | - else if (c->x86_mask == 0 || c->x86_mask == 5) | ||
2106 | + else if (c->x86_stepping == 0 || c->x86_stepping == 5) | ||
2107 | p = "Celeron-A"; | ||
2108 | break; | ||
2109 | |||
2110 | diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c | ||
2111 | index 99442370de40..18dd8f22e353 100644 | ||
2112 | --- a/arch/x86/kernel/cpu/intel_rdt.c | ||
2113 | +++ b/arch/x86/kernel/cpu/intel_rdt.c | ||
2114 | @@ -771,7 +771,7 @@ static __init void rdt_quirks(void) | ||
2115 | cache_alloc_hsw_probe(); | ||
2116 | break; | ||
2117 | case INTEL_FAM6_SKYLAKE_X: | ||
2118 | - if (boot_cpu_data.x86_mask <= 4) | ||
2119 | + if (boot_cpu_data.x86_stepping <= 4) | ||
2120 | set_rdt_options("!cmt,!mbmtotal,!mbmlocal,!l3cat"); | ||
2121 | } | ||
2122 | } | ||
2123 | diff --git a/arch/x86/kernel/cpu/mcheck/mce-internal.h b/arch/x86/kernel/cpu/mcheck/mce-internal.h | ||
2124 | index aa0d5df9dc60..e956eb267061 100644 | ||
2125 | --- a/arch/x86/kernel/cpu/mcheck/mce-internal.h | ||
2126 | +++ b/arch/x86/kernel/cpu/mcheck/mce-internal.h | ||
2127 | @@ -115,4 +115,19 @@ static inline void mce_unregister_injector_chain(struct notifier_block *nb) { } | ||
2128 | |||
2129 | extern struct mca_config mca_cfg; | ||
2130 | |||
2131 | +#ifndef CONFIG_X86_64 | ||
2132 | +/* | ||
2133 | + * On 32-bit systems it would be difficult to safely unmap a poison page | ||
2134 | + * from the kernel 1:1 map because there are no non-canonical addresses that | ||
2135 | + * we can use to refer to the address without risking a speculative access. | ||
2136 | + * However, this isn't much of an issue because: | ||
2137 | + * 1) Few unmappable pages are in the 1:1 map. Most are in HIGHMEM which | ||
2138 | + * are only mapped into the kernel as needed | ||
2139 | + * 2) Few people would run a 32-bit kernel on a machine that supports | ||
2140 | + * recoverable errors because they have too much memory to boot 32-bit. | ||
2141 | + */ | ||
2142 | +static inline void mce_unmap_kpfn(unsigned long pfn) {} | ||
2143 | +#define mce_unmap_kpfn mce_unmap_kpfn | ||
2144 | +#endif | ||
2145 | + | ||
2146 | #endif /* __X86_MCE_INTERNAL_H__ */ | ||
2147 | diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c | ||
2148 | index 868e412b4f0c..2fe482f6ecd8 100644 | ||
2149 | --- a/arch/x86/kernel/cpu/mcheck/mce.c | ||
2150 | +++ b/arch/x86/kernel/cpu/mcheck/mce.c | ||
2151 | @@ -106,6 +106,10 @@ static struct irq_work mce_irq_work; | ||
2152 | |||
2153 | static void (*quirk_no_way_out)(int bank, struct mce *m, struct pt_regs *regs); | ||
2154 | |||
2155 | +#ifndef mce_unmap_kpfn | ||
2156 | +static void mce_unmap_kpfn(unsigned long pfn); | ||
2157 | +#endif | ||
2158 | + | ||
2159 | /* | ||
2160 | * CPU/chipset specific EDAC code can register a notifier call here to print | ||
2161 | * MCE errors in a human-readable form. | ||
2162 | @@ -582,7 +586,8 @@ static int srao_decode_notifier(struct notifier_block *nb, unsigned long val, | ||
2163 | |||
2164 | if (mce_usable_address(mce) && (mce->severity == MCE_AO_SEVERITY)) { | ||
2165 | pfn = mce->addr >> PAGE_SHIFT; | ||
2166 | - memory_failure(pfn, MCE_VECTOR, 0); | ||
2167 | + if (memory_failure(pfn, MCE_VECTOR, 0)) | ||
2168 | + mce_unmap_kpfn(pfn); | ||
2169 | } | ||
2170 | |||
2171 | return NOTIFY_OK; | ||
2172 | @@ -1049,12 +1054,13 @@ static int do_memory_failure(struct mce *m) | ||
2173 | ret = memory_failure(m->addr >> PAGE_SHIFT, MCE_VECTOR, flags); | ||
2174 | if (ret) | ||
2175 | pr_err("Memory error not recovered"); | ||
2176 | + else | ||
2177 | + mce_unmap_kpfn(m->addr >> PAGE_SHIFT); | ||
2178 | return ret; | ||
2179 | } | ||
2180 | |||
2181 | -#if defined(arch_unmap_kpfn) && defined(CONFIG_MEMORY_FAILURE) | ||
2182 | - | ||
2183 | -void arch_unmap_kpfn(unsigned long pfn) | ||
2184 | +#ifndef mce_unmap_kpfn | ||
2185 | +static void mce_unmap_kpfn(unsigned long pfn) | ||
2186 | { | ||
2187 | unsigned long decoy_addr; | ||
2188 | |||
2189 | @@ -1065,7 +1071,7 @@ void arch_unmap_kpfn(unsigned long pfn) | ||
2190 | * We would like to just call: | ||
2191 | * set_memory_np((unsigned long)pfn_to_kaddr(pfn), 1); | ||
2192 | * but doing that would radically increase the odds of a | ||
2193 | - * speculative access to the posion page because we'd have | ||
2194 | + * speculative access to the poison page because we'd have | ||
2195 | * the virtual address of the kernel 1:1 mapping sitting | ||
2196 | * around in registers. | ||
2197 | * Instead we get tricky. We create a non-canonical address | ||
2198 | @@ -1090,7 +1096,6 @@ void arch_unmap_kpfn(unsigned long pfn) | ||
2199 | |||
2200 | if (set_memory_np(decoy_addr, 1)) | ||
2201 | pr_warn("Could not invalidate pfn=0x%lx from 1:1 map\n", pfn); | ||
2202 | - | ||
2203 | } | ||
2204 | #endif | ||
2205 | |||
2206 | diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c | ||
2207 | index f7c55b0e753a..a15db2b4e0d6 100644 | ||
2208 | --- a/arch/x86/kernel/cpu/microcode/intel.c | ||
2209 | +++ b/arch/x86/kernel/cpu/microcode/intel.c | ||
2210 | @@ -921,7 +921,7 @@ static bool is_blacklisted(unsigned int cpu) | ||
2211 | */ | ||
2212 | if (c->x86 == 6 && | ||
2213 | c->x86_model == INTEL_FAM6_BROADWELL_X && | ||
2214 | - c->x86_mask == 0x01 && | ||
2215 | + c->x86_stepping == 0x01 && | ||
2216 | llc_size_per_core > 2621440 && | ||
2217 | c->microcode < 0x0b000021) { | ||
2218 | pr_err_once("Erratum BDF90: late loading with revision < 0x0b000021 (0x%x) disabled.\n", c->microcode); | ||
2219 | @@ -944,7 +944,7 @@ static enum ucode_state request_microcode_fw(int cpu, struct device *device, | ||
2220 | return UCODE_NFOUND; | ||
2221 | |||
2222 | sprintf(name, "intel-ucode/%02x-%02x-%02x", | ||
2223 | - c->x86, c->x86_model, c->x86_mask); | ||
2224 | + c->x86, c->x86_model, c->x86_stepping); | ||
2225 | |||
2226 | if (request_firmware_direct(&firmware, name, device)) { | ||
2227 | pr_debug("data file %s load failed\n", name); | ||
2228 | @@ -982,7 +982,7 @@ static struct microcode_ops microcode_intel_ops = { | ||
2229 | |||
2230 | static int __init calc_llc_size_per_core(struct cpuinfo_x86 *c) | ||
2231 | { | ||
2232 | - u64 llc_size = c->x86_cache_size * 1024; | ||
2233 | + u64 llc_size = c->x86_cache_size * 1024ULL; | ||
2234 | |||
2235 | do_div(llc_size, c->x86_max_cores); | ||
2236 | |||
2237 | diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c | ||
2238 | index fdc55215d44d..e12ee86906c6 100644 | ||
2239 | --- a/arch/x86/kernel/cpu/mtrr/generic.c | ||
2240 | +++ b/arch/x86/kernel/cpu/mtrr/generic.c | ||
2241 | @@ -859,7 +859,7 @@ int generic_validate_add_page(unsigned long base, unsigned long size, | ||
2242 | */ | ||
2243 | if (is_cpu(INTEL) && boot_cpu_data.x86 == 6 && | ||
2244 | boot_cpu_data.x86_model == 1 && | ||
2245 | - boot_cpu_data.x86_mask <= 7) { | ||
2246 | + boot_cpu_data.x86_stepping <= 7) { | ||
2247 | if (base & ((1 << (22 - PAGE_SHIFT)) - 1)) { | ||
2248 | pr_warn("mtrr: base(0x%lx000) is not 4 MiB aligned\n", base); | ||
2249 | return -EINVAL; | ||
2250 | diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c | ||
2251 | index 40d5a8a75212..7468de429087 100644 | ||
2252 | --- a/arch/x86/kernel/cpu/mtrr/main.c | ||
2253 | +++ b/arch/x86/kernel/cpu/mtrr/main.c | ||
2254 | @@ -711,8 +711,8 @@ void __init mtrr_bp_init(void) | ||
2255 | if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && | ||
2256 | boot_cpu_data.x86 == 0xF && | ||
2257 | boot_cpu_data.x86_model == 0x3 && | ||
2258 | - (boot_cpu_data.x86_mask == 0x3 || | ||
2259 | - boot_cpu_data.x86_mask == 0x4)) | ||
2260 | + (boot_cpu_data.x86_stepping == 0x3 || | ||
2261 | + boot_cpu_data.x86_stepping == 0x4)) | ||
2262 | phys_addr = 36; | ||
2263 | |||
2264 | size_or_mask = SIZE_OR_MASK_BITS(phys_addr); | ||
2265 | diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c | ||
2266 | index e7ecedafa1c8..2c8522a39ed5 100644 | ||
2267 | --- a/arch/x86/kernel/cpu/proc.c | ||
2268 | +++ b/arch/x86/kernel/cpu/proc.c | ||
2269 | @@ -72,8 +72,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) | ||
2270 | c->x86_model, | ||
2271 | c->x86_model_id[0] ? c->x86_model_id : "unknown"); | ||
2272 | |||
2273 | - if (c->x86_mask || c->cpuid_level >= 0) | ||
2274 | - seq_printf(m, "stepping\t: %d\n", c->x86_mask); | ||
2275 | + if (c->x86_stepping || c->cpuid_level >= 0) | ||
2276 | + seq_printf(m, "stepping\t: %d\n", c->x86_stepping); | ||
2277 | else | ||
2278 | seq_puts(m, "stepping\t: unknown\n"); | ||
2279 | if (c->microcode) | ||
2280 | @@ -91,8 +91,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) | ||
2281 | } | ||
2282 | |||
2283 | /* Cache size */ | ||
2284 | - if (c->x86_cache_size >= 0) | ||
2285 | - seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size); | ||
2286 | + if (c->x86_cache_size) | ||
2287 | + seq_printf(m, "cache size\t: %u KB\n", c->x86_cache_size); | ||
2288 | |||
2289 | show_cpuinfo_core(m, c, cpu); | ||
2290 | show_cpuinfo_misc(m, c); | ||
2291 | diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c | ||
2292 | index 1e82f787c160..c87560e1e3ef 100644 | ||
2293 | --- a/arch/x86/kernel/early-quirks.c | ||
2294 | +++ b/arch/x86/kernel/early-quirks.c | ||
2295 | @@ -527,6 +527,7 @@ static const struct pci_device_id intel_early_ids[] __initconst = { | ||
2296 | INTEL_SKL_IDS(&gen9_early_ops), | ||
2297 | INTEL_BXT_IDS(&gen9_early_ops), | ||
2298 | INTEL_KBL_IDS(&gen9_early_ops), | ||
2299 | + INTEL_CFL_IDS(&gen9_early_ops), | ||
2300 | INTEL_GLK_IDS(&gen9_early_ops), | ||
2301 | INTEL_CNL_IDS(&gen9_early_ops), | ||
2302 | }; | ||
2303 | diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S | ||
2304 | index c29020907886..b59e4fb40fd9 100644 | ||
2305 | --- a/arch/x86/kernel/head_32.S | ||
2306 | +++ b/arch/x86/kernel/head_32.S | ||
2307 | @@ -37,7 +37,7 @@ | ||
2308 | #define X86 new_cpu_data+CPUINFO_x86 | ||
2309 | #define X86_VENDOR new_cpu_data+CPUINFO_x86_vendor | ||
2310 | #define X86_MODEL new_cpu_data+CPUINFO_x86_model | ||
2311 | -#define X86_MASK new_cpu_data+CPUINFO_x86_mask | ||
2312 | +#define X86_STEPPING new_cpu_data+CPUINFO_x86_stepping | ||
2313 | #define X86_HARD_MATH new_cpu_data+CPUINFO_hard_math | ||
2314 | #define X86_CPUID new_cpu_data+CPUINFO_cpuid_level | ||
2315 | #define X86_CAPABILITY new_cpu_data+CPUINFO_x86_capability | ||
2316 | @@ -332,7 +332,7 @@ ENTRY(startup_32_smp) | ||
2317 | shrb $4,%al | ||
2318 | movb %al,X86_MODEL | ||
2319 | andb $0x0f,%cl # mask mask revision | ||
2320 | - movb %cl,X86_MASK | ||
2321 | + movb %cl,X86_STEPPING | ||
2322 | movl %edx,X86_CAPABILITY | ||
2323 | |||
2324 | .Lis486: | ||
2325 | diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c | ||
2326 | index 3a4b12809ab5..bc6bc6689e68 100644 | ||
2327 | --- a/arch/x86/kernel/mpparse.c | ||
2328 | +++ b/arch/x86/kernel/mpparse.c | ||
2329 | @@ -407,7 +407,7 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) | ||
2330 | processor.apicver = mpc_default_type > 4 ? 0x10 : 0x01; | ||
2331 | processor.cpuflag = CPU_ENABLED; | ||
2332 | processor.cpufeature = (boot_cpu_data.x86 << 8) | | ||
2333 | - (boot_cpu_data.x86_model << 4) | boot_cpu_data.x86_mask; | ||
2334 | + (boot_cpu_data.x86_model << 4) | boot_cpu_data.x86_stepping; | ||
2335 | processor.featureflag = boot_cpu_data.x86_capability[CPUID_1_EDX]; | ||
2336 | processor.reserved[0] = 0; | ||
2337 | processor.reserved[1] = 0; | ||
2338 | diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c | ||
2339 | index 041096bdef86..99dc79e76bdc 100644 | ||
2340 | --- a/arch/x86/kernel/paravirt.c | ||
2341 | +++ b/arch/x86/kernel/paravirt.c | ||
2342 | @@ -200,9 +200,9 @@ static void native_flush_tlb_global(void) | ||
2343 | __native_flush_tlb_global(); | ||
2344 | } | ||
2345 | |||
2346 | -static void native_flush_tlb_single(unsigned long addr) | ||
2347 | +static void native_flush_tlb_one_user(unsigned long addr) | ||
2348 | { | ||
2349 | - __native_flush_tlb_single(addr); | ||
2350 | + __native_flush_tlb_one_user(addr); | ||
2351 | } | ||
2352 | |||
2353 | struct static_key paravirt_steal_enabled; | ||
2354 | @@ -401,7 +401,7 @@ struct pv_mmu_ops pv_mmu_ops __ro_after_init = { | ||
2355 | |||
2356 | .flush_tlb_user = native_flush_tlb, | ||
2357 | .flush_tlb_kernel = native_flush_tlb_global, | ||
2358 | - .flush_tlb_single = native_flush_tlb_single, | ||
2359 | + .flush_tlb_one_user = native_flush_tlb_one_user, | ||
2360 | .flush_tlb_others = native_flush_tlb_others, | ||
2361 | |||
2362 | .pgd_alloc = __paravirt_pgd_alloc, | ||
2363 | diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S | ||
2364 | index 307d3bac5f04..11eda21eb697 100644 | ||
2365 | --- a/arch/x86/kernel/relocate_kernel_64.S | ||
2366 | +++ b/arch/x86/kernel/relocate_kernel_64.S | ||
2367 | @@ -68,6 +68,9 @@ relocate_kernel: | ||
2368 | movq %cr4, %rax | ||
2369 | movq %rax, CR4(%r11) | ||
2370 | |||
2371 | + /* Save CR4. Required to enable the right paging mode later. */ | ||
2372 | + movq %rax, %r13 | ||
2373 | + | ||
2374 | /* zero out flags, and disable interrupts */ | ||
2375 | pushq $0 | ||
2376 | popfq | ||
2377 | @@ -126,8 +129,13 @@ identity_mapped: | ||
2378 | /* | ||
2379 | * Set cr4 to a known state: | ||
2380 | * - physical address extension enabled | ||
2381 | + * - 5-level paging, if it was enabled before | ||
2382 | */ | ||
2383 | movl $X86_CR4_PAE, %eax | ||
2384 | + testq $X86_CR4_LA57, %r13 | ||
2385 | + jz 1f | ||
2386 | + orl $X86_CR4_LA57, %eax | ||
2387 | +1: | ||
2388 | movq %rax, %cr4 | ||
2389 | |||
2390 | jmp 1f | ||
2391 | diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c | ||
2392 | index ed556d50d7ed..844279c3ff4a 100644 | ||
2393 | --- a/arch/x86/kernel/smpboot.c | ||
2394 | +++ b/arch/x86/kernel/smpboot.c | ||
2395 | @@ -1431,7 +1431,6 @@ static void remove_siblinginfo(int cpu) | ||
2396 | cpumask_clear(cpu_llc_shared_mask(cpu)); | ||
2397 | cpumask_clear(topology_sibling_cpumask(cpu)); | ||
2398 | cpumask_clear(topology_core_cpumask(cpu)); | ||
2399 | - c->phys_proc_id = 0; | ||
2400 | c->cpu_core_id = 0; | ||
2401 | cpumask_clear_cpu(cpu, cpu_sibling_setup_mask); | ||
2402 | recompute_smt_state(); | ||
2403 | diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c | ||
2404 | index 446c9ef8cfc3..3d9b2308e7fa 100644 | ||
2405 | --- a/arch/x86/kernel/traps.c | ||
2406 | +++ b/arch/x86/kernel/traps.c | ||
2407 | @@ -181,7 +181,7 @@ int fixup_bug(struct pt_regs *regs, int trapnr) | ||
2408 | break; | ||
2409 | |||
2410 | case BUG_TRAP_TYPE_WARN: | ||
2411 | - regs->ip += LEN_UD0; | ||
2412 | + regs->ip += LEN_UD2; | ||
2413 | return 1; | ||
2414 | } | ||
2415 | |||
2416 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c | ||
2417 | index 2b8eb4da4d08..cc83bdcb65d1 100644 | ||
2418 | --- a/arch/x86/kvm/mmu.c | ||
2419 | +++ b/arch/x86/kvm/mmu.c | ||
2420 | @@ -5058,7 +5058,7 @@ void kvm_mmu_uninit_vm(struct kvm *kvm) | ||
2421 | typedef bool (*slot_level_handler) (struct kvm *kvm, struct kvm_rmap_head *rmap_head); | ||
2422 | |||
2423 | /* The caller should hold mmu-lock before calling this function. */ | ||
2424 | -static bool | ||
2425 | +static __always_inline bool | ||
2426 | slot_handle_level_range(struct kvm *kvm, struct kvm_memory_slot *memslot, | ||
2427 | slot_level_handler fn, int start_level, int end_level, | ||
2428 | gfn_t start_gfn, gfn_t end_gfn, bool lock_flush_tlb) | ||
2429 | @@ -5088,7 +5088,7 @@ slot_handle_level_range(struct kvm *kvm, struct kvm_memory_slot *memslot, | ||
2430 | return flush; | ||
2431 | } | ||
2432 | |||
2433 | -static bool | ||
2434 | +static __always_inline bool | ||
2435 | slot_handle_level(struct kvm *kvm, struct kvm_memory_slot *memslot, | ||
2436 | slot_level_handler fn, int start_level, int end_level, | ||
2437 | bool lock_flush_tlb) | ||
2438 | @@ -5099,7 +5099,7 @@ slot_handle_level(struct kvm *kvm, struct kvm_memory_slot *memslot, | ||
2439 | lock_flush_tlb); | ||
2440 | } | ||
2441 | |||
2442 | -static bool | ||
2443 | +static __always_inline bool | ||
2444 | slot_handle_all_level(struct kvm *kvm, struct kvm_memory_slot *memslot, | ||
2445 | slot_level_handler fn, bool lock_flush_tlb) | ||
2446 | { | ||
2447 | @@ -5107,7 +5107,7 @@ slot_handle_all_level(struct kvm *kvm, struct kvm_memory_slot *memslot, | ||
2448 | PT_MAX_HUGEPAGE_LEVEL, lock_flush_tlb); | ||
2449 | } | ||
2450 | |||
2451 | -static bool | ||
2452 | +static __always_inline bool | ||
2453 | slot_handle_large_level(struct kvm *kvm, struct kvm_memory_slot *memslot, | ||
2454 | slot_level_handler fn, bool lock_flush_tlb) | ||
2455 | { | ||
2456 | @@ -5115,7 +5115,7 @@ slot_handle_large_level(struct kvm *kvm, struct kvm_memory_slot *memslot, | ||
2457 | PT_MAX_HUGEPAGE_LEVEL, lock_flush_tlb); | ||
2458 | } | ||
2459 | |||
2460 | -static bool | ||
2461 | +static __always_inline bool | ||
2462 | slot_handle_leaf(struct kvm *kvm, struct kvm_memory_slot *memslot, | ||
2463 | slot_level_handler fn, bool lock_flush_tlb) | ||
2464 | { | ||
2465 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
2466 | index 6f623848260f..561d8937fac5 100644 | ||
2467 | --- a/arch/x86/kvm/vmx.c | ||
2468 | +++ b/arch/x86/kvm/vmx.c | ||
2469 | @@ -10131,7 +10131,8 @@ static void nested_get_vmcs12_pages(struct kvm_vcpu *vcpu, | ||
2470 | if (cpu_has_vmx_msr_bitmap() && | ||
2471 | nested_cpu_has(vmcs12, CPU_BASED_USE_MSR_BITMAPS) && | ||
2472 | nested_vmx_merge_msr_bitmap(vcpu, vmcs12)) | ||
2473 | - ; | ||
2474 | + vmcs_set_bits(CPU_BASED_VM_EXEC_CONTROL, | ||
2475 | + CPU_BASED_USE_MSR_BITMAPS); | ||
2476 | else | ||
2477 | vmcs_clear_bits(CPU_BASED_VM_EXEC_CONTROL, | ||
2478 | CPU_BASED_USE_MSR_BITMAPS); | ||
2479 | @@ -10220,8 +10221,8 @@ static inline bool nested_vmx_merge_msr_bitmap(struct kvm_vcpu *vcpu, | ||
2480 | * updated to reflect this when L1 (or its L2s) actually write to | ||
2481 | * the MSR. | ||
2482 | */ | ||
2483 | - bool pred_cmd = msr_write_intercepted_l01(vcpu, MSR_IA32_PRED_CMD); | ||
2484 | - bool spec_ctrl = msr_write_intercepted_l01(vcpu, MSR_IA32_SPEC_CTRL); | ||
2485 | + bool pred_cmd = !msr_write_intercepted_l01(vcpu, MSR_IA32_PRED_CMD); | ||
2486 | + bool spec_ctrl = !msr_write_intercepted_l01(vcpu, MSR_IA32_SPEC_CTRL); | ||
2487 | |||
2488 | if (!nested_cpu_has_virt_x2apic_mode(vmcs12) && | ||
2489 | !pred_cmd && !spec_ctrl) | ||
2490 | diff --git a/arch/x86/lib/cpu.c b/arch/x86/lib/cpu.c | ||
2491 | index d6f848d1211d..2dd1fe13a37b 100644 | ||
2492 | --- a/arch/x86/lib/cpu.c | ||
2493 | +++ b/arch/x86/lib/cpu.c | ||
2494 | @@ -18,7 +18,7 @@ unsigned int x86_model(unsigned int sig) | ||
2495 | { | ||
2496 | unsigned int fam, model; | ||
2497 | |||
2498 | - fam = x86_family(sig); | ||
2499 | + fam = x86_family(sig); | ||
2500 | |||
2501 | model = (sig >> 4) & 0xf; | ||
2502 | |||
2503 | diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c | ||
2504 | index 4a837289f2ad..60ae1fe3609f 100644 | ||
2505 | --- a/arch/x86/mm/init_64.c | ||
2506 | +++ b/arch/x86/mm/init_64.c | ||
2507 | @@ -256,7 +256,7 @@ static void __set_pte_vaddr(pud_t *pud, unsigned long vaddr, pte_t new_pte) | ||
2508 | * It's enough to flush this one mapping. | ||
2509 | * (PGE mappings get flushed as well) | ||
2510 | */ | ||
2511 | - __flush_tlb_one(vaddr); | ||
2512 | + __flush_tlb_one_kernel(vaddr); | ||
2513 | } | ||
2514 | |||
2515 | void set_pte_vaddr_p4d(p4d_t *p4d_page, unsigned long vaddr, pte_t new_pte) | ||
2516 | diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c | ||
2517 | index c45b6ec5357b..e2db83bebc3b 100644 | ||
2518 | --- a/arch/x86/mm/ioremap.c | ||
2519 | +++ b/arch/x86/mm/ioremap.c | ||
2520 | @@ -820,5 +820,5 @@ void __init __early_set_fixmap(enum fixed_addresses idx, | ||
2521 | set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, flags)); | ||
2522 | else | ||
2523 | pte_clear(&init_mm, addr, pte); | ||
2524 | - __flush_tlb_one(addr); | ||
2525 | + __flush_tlb_one_kernel(addr); | ||
2526 | } | ||
2527 | diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c | ||
2528 | index 58477ec3d66d..7c8686709636 100644 | ||
2529 | --- a/arch/x86/mm/kmmio.c | ||
2530 | +++ b/arch/x86/mm/kmmio.c | ||
2531 | @@ -168,7 +168,7 @@ static int clear_page_presence(struct kmmio_fault_page *f, bool clear) | ||
2532 | return -1; | ||
2533 | } | ||
2534 | |||
2535 | - __flush_tlb_one(f->addr); | ||
2536 | + __flush_tlb_one_kernel(f->addr); | ||
2537 | return 0; | ||
2538 | } | ||
2539 | |||
2540 | diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c | ||
2541 | index c3c5274410a9..9bb7f0ab9fe6 100644 | ||
2542 | --- a/arch/x86/mm/pgtable_32.c | ||
2543 | +++ b/arch/x86/mm/pgtable_32.c | ||
2544 | @@ -63,7 +63,7 @@ void set_pte_vaddr(unsigned long vaddr, pte_t pteval) | ||
2545 | * It's enough to flush this one mapping. | ||
2546 | * (PGE mappings get flushed as well) | ||
2547 | */ | ||
2548 | - __flush_tlb_one(vaddr); | ||
2549 | + __flush_tlb_one_kernel(vaddr); | ||
2550 | } | ||
2551 | |||
2552 | unsigned long __FIXADDR_TOP = 0xfffff000; | ||
2553 | diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c | ||
2554 | index 012d02624848..0c936435ea93 100644 | ||
2555 | --- a/arch/x86/mm/tlb.c | ||
2556 | +++ b/arch/x86/mm/tlb.c | ||
2557 | @@ -492,7 +492,7 @@ static void flush_tlb_func_common(const struct flush_tlb_info *f, | ||
2558 | * flush that changes context.tlb_gen from 2 to 3. If they get | ||
2559 | * processed on this CPU in reverse order, we'll see | ||
2560 | * local_tlb_gen == 1, mm_tlb_gen == 3, and end != TLB_FLUSH_ALL. | ||
2561 | - * If we were to use __flush_tlb_single() and set local_tlb_gen to | ||
2562 | + * If we were to use __flush_tlb_one_user() and set local_tlb_gen to | ||
2563 | * 3, we'd be break the invariant: we'd update local_tlb_gen above | ||
2564 | * 1 without the full flush that's needed for tlb_gen 2. | ||
2565 | * | ||
2566 | @@ -513,7 +513,7 @@ static void flush_tlb_func_common(const struct flush_tlb_info *f, | ||
2567 | |||
2568 | addr = f->start; | ||
2569 | while (addr < f->end) { | ||
2570 | - __flush_tlb_single(addr); | ||
2571 | + __flush_tlb_one_user(addr); | ||
2572 | addr += PAGE_SIZE; | ||
2573 | } | ||
2574 | if (local) | ||
2575 | @@ -660,7 +660,7 @@ static void do_kernel_range_flush(void *info) | ||
2576 | |||
2577 | /* flush range by one by one 'invlpg' */ | ||
2578 | for (addr = f->start; addr < f->end; addr += PAGE_SIZE) | ||
2579 | - __flush_tlb_one(addr); | ||
2580 | + __flush_tlb_one_kernel(addr); | ||
2581 | } | ||
2582 | |||
2583 | void flush_tlb_kernel_range(unsigned long start, unsigned long end) | ||
2584 | diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c | ||
2585 | index 8538a6723171..7d5d53f36a7a 100644 | ||
2586 | --- a/arch/x86/platform/uv/tlb_uv.c | ||
2587 | +++ b/arch/x86/platform/uv/tlb_uv.c | ||
2588 | @@ -299,7 +299,7 @@ static void bau_process_message(struct msg_desc *mdp, struct bau_control *bcp, | ||
2589 | local_flush_tlb(); | ||
2590 | stat->d_alltlb++; | ||
2591 | } else { | ||
2592 | - __flush_tlb_single(msg->address); | ||
2593 | + __flush_tlb_one_user(msg->address); | ||
2594 | stat->d_onetlb++; | ||
2595 | } | ||
2596 | stat->d_requestee++; | ||
2597 | diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c | ||
2598 | index d85076223a69..aae88fec9941 100644 | ||
2599 | --- a/arch/x86/xen/mmu_pv.c | ||
2600 | +++ b/arch/x86/xen/mmu_pv.c | ||
2601 | @@ -1300,12 +1300,12 @@ static void xen_flush_tlb(void) | ||
2602 | preempt_enable(); | ||
2603 | } | ||
2604 | |||
2605 | -static void xen_flush_tlb_single(unsigned long addr) | ||
2606 | +static void xen_flush_tlb_one_user(unsigned long addr) | ||
2607 | { | ||
2608 | struct mmuext_op *op; | ||
2609 | struct multicall_space mcs; | ||
2610 | |||
2611 | - trace_xen_mmu_flush_tlb_single(addr); | ||
2612 | + trace_xen_mmu_flush_tlb_one_user(addr); | ||
2613 | |||
2614 | preempt_disable(); | ||
2615 | |||
2616 | @@ -2370,7 +2370,7 @@ static const struct pv_mmu_ops xen_mmu_ops __initconst = { | ||
2617 | |||
2618 | .flush_tlb_user = xen_flush_tlb, | ||
2619 | .flush_tlb_kernel = xen_flush_tlb, | ||
2620 | - .flush_tlb_single = xen_flush_tlb_single, | ||
2621 | + .flush_tlb_one_user = xen_flush_tlb_one_user, | ||
2622 | .flush_tlb_others = xen_flush_tlb_others, | ||
2623 | |||
2624 | .pgd_alloc = xen_pgd_alloc, | ||
2625 | diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c | ||
2626 | index 13b4f19b9131..159a897151d6 100644 | ||
2627 | --- a/arch/x86/xen/p2m.c | ||
2628 | +++ b/arch/x86/xen/p2m.c | ||
2629 | @@ -694,6 +694,9 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, | ||
2630 | int i, ret = 0; | ||
2631 | pte_t *pte; | ||
2632 | |||
2633 | + if (xen_feature(XENFEAT_auto_translated_physmap)) | ||
2634 | + return 0; | ||
2635 | + | ||
2636 | if (kmap_ops) { | ||
2637 | ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, | ||
2638 | kmap_ops, count); | ||
2639 | @@ -736,6 +739,9 @@ int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, | ||
2640 | { | ||
2641 | int i, ret = 0; | ||
2642 | |||
2643 | + if (xen_feature(XENFEAT_auto_translated_physmap)) | ||
2644 | + return 0; | ||
2645 | + | ||
2646 | for (i = 0; i < count; i++) { | ||
2647 | unsigned long mfn = __pfn_to_mfn(page_to_pfn(pages[i])); | ||
2648 | unsigned long pfn = page_to_pfn(pages[i]); | ||
2649 | diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S | ||
2650 | index 497cc55a0c16..96f26e026783 100644 | ||
2651 | --- a/arch/x86/xen/xen-head.S | ||
2652 | +++ b/arch/x86/xen/xen-head.S | ||
2653 | @@ -9,7 +9,9 @@ | ||
2654 | |||
2655 | #include <asm/boot.h> | ||
2656 | #include <asm/asm.h> | ||
2657 | +#include <asm/msr.h> | ||
2658 | #include <asm/page_types.h> | ||
2659 | +#include <asm/percpu.h> | ||
2660 | #include <asm/unwind_hints.h> | ||
2661 | |||
2662 | #include <xen/interface/elfnote.h> | ||
2663 | @@ -35,6 +37,20 @@ ENTRY(startup_xen) | ||
2664 | mov %_ASM_SI, xen_start_info | ||
2665 | mov $init_thread_union+THREAD_SIZE, %_ASM_SP | ||
2666 | |||
2667 | +#ifdef CONFIG_X86_64 | ||
2668 | + /* Set up %gs. | ||
2669 | + * | ||
2670 | + * The base of %gs always points to the bottom of the irqstack | ||
2671 | + * union. If the stack protector canary is enabled, it is | ||
2672 | + * located at %gs:40. Note that, on SMP, the boot cpu uses | ||
2673 | + * init data section till per cpu areas are set up. | ||
2674 | + */ | ||
2675 | + movl $MSR_GS_BASE,%ecx | ||
2676 | + movq $INIT_PER_CPU_VAR(irq_stack_union),%rax | ||
2677 | + cdq | ||
2678 | + wrmsr | ||
2679 | +#endif | ||
2680 | + | ||
2681 | jmp xen_start_kernel | ||
2682 | END(startup_xen) | ||
2683 | __FINIT | ||
2684 | diff --git a/block/blk-wbt.c b/block/blk-wbt.c | ||
2685 | index ae8de9780085..f92fc84b5e2c 100644 | ||
2686 | --- a/block/blk-wbt.c | ||
2687 | +++ b/block/blk-wbt.c | ||
2688 | @@ -697,7 +697,15 @@ u64 wbt_default_latency_nsec(struct request_queue *q) | ||
2689 | |||
2690 | static int wbt_data_dir(const struct request *rq) | ||
2691 | { | ||
2692 | - return rq_data_dir(rq); | ||
2693 | + const int op = req_op(rq); | ||
2694 | + | ||
2695 | + if (op == REQ_OP_READ) | ||
2696 | + return READ; | ||
2697 | + else if (op == REQ_OP_WRITE || op == REQ_OP_FLUSH) | ||
2698 | + return WRITE; | ||
2699 | + | ||
2700 | + /* don't account */ | ||
2701 | + return -1; | ||
2702 | } | ||
2703 | |||
2704 | int wbt_init(struct request_queue *q) | ||
2705 | diff --git a/drivers/base/core.c b/drivers/base/core.c | ||
2706 | index 110230d86527..6835736daf2d 100644 | ||
2707 | --- a/drivers/base/core.c | ||
2708 | +++ b/drivers/base/core.c | ||
2709 | @@ -313,6 +313,9 @@ static void __device_link_del(struct device_link *link) | ||
2710 | dev_info(link->consumer, "Dropping the link to %s\n", | ||
2711 | dev_name(link->supplier)); | ||
2712 | |||
2713 | + if (link->flags & DL_FLAG_PM_RUNTIME) | ||
2714 | + pm_runtime_drop_link(link->consumer); | ||
2715 | + | ||
2716 | list_del(&link->s_node); | ||
2717 | list_del(&link->c_node); | ||
2718 | device_link_free(link); | ||
2719 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c | ||
2720 | index cc93522a6d41..1bbf14338bdb 100644 | ||
2721 | --- a/drivers/block/rbd.c | ||
2722 | +++ b/drivers/block/rbd.c | ||
2723 | @@ -124,11 +124,13 @@ static int atomic_dec_return_safe(atomic_t *v) | ||
2724 | #define RBD_FEATURE_STRIPINGV2 (1ULL<<1) | ||
2725 | #define RBD_FEATURE_EXCLUSIVE_LOCK (1ULL<<2) | ||
2726 | #define RBD_FEATURE_DATA_POOL (1ULL<<7) | ||
2727 | +#define RBD_FEATURE_OPERATIONS (1ULL<<8) | ||
2728 | |||
2729 | #define RBD_FEATURES_ALL (RBD_FEATURE_LAYERING | \ | ||
2730 | RBD_FEATURE_STRIPINGV2 | \ | ||
2731 | RBD_FEATURE_EXCLUSIVE_LOCK | \ | ||
2732 | - RBD_FEATURE_DATA_POOL) | ||
2733 | + RBD_FEATURE_DATA_POOL | \ | ||
2734 | + RBD_FEATURE_OPERATIONS) | ||
2735 | |||
2736 | /* Features supported by this (client software) implementation. */ | ||
2737 | |||
2738 | diff --git a/drivers/char/hw_random/via-rng.c b/drivers/char/hw_random/via-rng.c | ||
2739 | index d1f5bb534e0e..6e9df558325b 100644 | ||
2740 | --- a/drivers/char/hw_random/via-rng.c | ||
2741 | +++ b/drivers/char/hw_random/via-rng.c | ||
2742 | @@ -162,7 +162,7 @@ static int via_rng_init(struct hwrng *rng) | ||
2743 | /* Enable secondary noise source on CPUs where it is present. */ | ||
2744 | |||
2745 | /* Nehemiah stepping 8 and higher */ | ||
2746 | - if ((c->x86_model == 9) && (c->x86_mask > 7)) | ||
2747 | + if ((c->x86_model == 9) && (c->x86_stepping > 7)) | ||
2748 | lo |= VIA_NOISESRC2; | ||
2749 | |||
2750 | /* Esther */ | ||
2751 | diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c | ||
2752 | index 3a2ca0f79daf..d0c34df0529c 100644 | ||
2753 | --- a/drivers/cpufreq/acpi-cpufreq.c | ||
2754 | +++ b/drivers/cpufreq/acpi-cpufreq.c | ||
2755 | @@ -629,7 +629,7 @@ static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c) | ||
2756 | if (c->x86_vendor == X86_VENDOR_INTEL) { | ||
2757 | if ((c->x86 == 15) && | ||
2758 | (c->x86_model == 6) && | ||
2759 | - (c->x86_mask == 8)) { | ||
2760 | + (c->x86_stepping == 8)) { | ||
2761 | pr_info("Intel(R) Xeon(R) 7100 Errata AL30, processors may lock up on frequency changes: disabling acpi-cpufreq\n"); | ||
2762 | return -ENODEV; | ||
2763 | } | ||
2764 | diff --git a/drivers/cpufreq/longhaul.c b/drivers/cpufreq/longhaul.c | ||
2765 | index c46a12df40dd..d5e27bc7585a 100644 | ||
2766 | --- a/drivers/cpufreq/longhaul.c | ||
2767 | +++ b/drivers/cpufreq/longhaul.c | ||
2768 | @@ -775,7 +775,7 @@ static int longhaul_cpu_init(struct cpufreq_policy *policy) | ||
2769 | break; | ||
2770 | |||
2771 | case 7: | ||
2772 | - switch (c->x86_mask) { | ||
2773 | + switch (c->x86_stepping) { | ||
2774 | case 0: | ||
2775 | longhaul_version = TYPE_LONGHAUL_V1; | ||
2776 | cpu_model = CPU_SAMUEL2; | ||
2777 | @@ -787,7 +787,7 @@ static int longhaul_cpu_init(struct cpufreq_policy *policy) | ||
2778 | break; | ||
2779 | case 1 ... 15: | ||
2780 | longhaul_version = TYPE_LONGHAUL_V2; | ||
2781 | - if (c->x86_mask < 8) { | ||
2782 | + if (c->x86_stepping < 8) { | ||
2783 | cpu_model = CPU_SAMUEL2; | ||
2784 | cpuname = "C3 'Samuel 2' [C5B]"; | ||
2785 | } else { | ||
2786 | @@ -814,7 +814,7 @@ static int longhaul_cpu_init(struct cpufreq_policy *policy) | ||
2787 | numscales = 32; | ||
2788 | memcpy(mults, nehemiah_mults, sizeof(nehemiah_mults)); | ||
2789 | memcpy(eblcr, nehemiah_eblcr, sizeof(nehemiah_eblcr)); | ||
2790 | - switch (c->x86_mask) { | ||
2791 | + switch (c->x86_stepping) { | ||
2792 | case 0 ... 1: | ||
2793 | cpu_model = CPU_NEHEMIAH; | ||
2794 | cpuname = "C3 'Nehemiah A' [C5XLOE]"; | ||
2795 | diff --git a/drivers/cpufreq/p4-clockmod.c b/drivers/cpufreq/p4-clockmod.c | ||
2796 | index fd77812313f3..a25741b1281b 100644 | ||
2797 | --- a/drivers/cpufreq/p4-clockmod.c | ||
2798 | +++ b/drivers/cpufreq/p4-clockmod.c | ||
2799 | @@ -168,7 +168,7 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy) | ||
2800 | #endif | ||
2801 | |||
2802 | /* Errata workaround */ | ||
2803 | - cpuid = (c->x86 << 8) | (c->x86_model << 4) | c->x86_mask; | ||
2804 | + cpuid = (c->x86 << 8) | (c->x86_model << 4) | c->x86_stepping; | ||
2805 | switch (cpuid) { | ||
2806 | case 0x0f07: | ||
2807 | case 0x0f0a: | ||
2808 | diff --git a/drivers/cpufreq/powernow-k7.c b/drivers/cpufreq/powernow-k7.c | ||
2809 | index 80ac313e6c59..302e9ce793a0 100644 | ||
2810 | --- a/drivers/cpufreq/powernow-k7.c | ||
2811 | +++ b/drivers/cpufreq/powernow-k7.c | ||
2812 | @@ -131,7 +131,7 @@ static int check_powernow(void) | ||
2813 | return 0; | ||
2814 | } | ||
2815 | |||
2816 | - if ((c->x86_model == 6) && (c->x86_mask == 0)) { | ||
2817 | + if ((c->x86_model == 6) && (c->x86_stepping == 0)) { | ||
2818 | pr_info("K7 660[A0] core detected, enabling errata workarounds\n"); | ||
2819 | have_a0 = 1; | ||
2820 | } | ||
2821 | diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c | ||
2822 | index b6d7c4c98d0a..da7fdb4b661a 100644 | ||
2823 | --- a/drivers/cpufreq/powernv-cpufreq.c | ||
2824 | +++ b/drivers/cpufreq/powernv-cpufreq.c | ||
2825 | @@ -288,9 +288,9 @@ static int init_powernv_pstates(void) | ||
2826 | |||
2827 | if (id == pstate_max) | ||
2828 | powernv_pstate_info.max = i; | ||
2829 | - else if (id == pstate_nominal) | ||
2830 | + if (id == pstate_nominal) | ||
2831 | powernv_pstate_info.nominal = i; | ||
2832 | - else if (id == pstate_min) | ||
2833 | + if (id == pstate_min) | ||
2834 | powernv_pstate_info.min = i; | ||
2835 | |||
2836 | if (powernv_pstate_info.wof_enabled && id == pstate_turbo) { | ||
2837 | diff --git a/drivers/cpufreq/speedstep-centrino.c b/drivers/cpufreq/speedstep-centrino.c | ||
2838 | index 41bc5397f4bb..4fa5adf16c70 100644 | ||
2839 | --- a/drivers/cpufreq/speedstep-centrino.c | ||
2840 | +++ b/drivers/cpufreq/speedstep-centrino.c | ||
2841 | @@ -37,7 +37,7 @@ struct cpu_id | ||
2842 | { | ||
2843 | __u8 x86; /* CPU family */ | ||
2844 | __u8 x86_model; /* model */ | ||
2845 | - __u8 x86_mask; /* stepping */ | ||
2846 | + __u8 x86_stepping; /* stepping */ | ||
2847 | }; | ||
2848 | |||
2849 | enum { | ||
2850 | @@ -277,7 +277,7 @@ static int centrino_verify_cpu_id(const struct cpuinfo_x86 *c, | ||
2851 | { | ||
2852 | if ((c->x86 == x->x86) && | ||
2853 | (c->x86_model == x->x86_model) && | ||
2854 | - (c->x86_mask == x->x86_mask)) | ||
2855 | + (c->x86_stepping == x->x86_stepping)) | ||
2856 | return 1; | ||
2857 | return 0; | ||
2858 | } | ||
2859 | diff --git a/drivers/cpufreq/speedstep-lib.c b/drivers/cpufreq/speedstep-lib.c | ||
2860 | index 8085ec9000d1..e3a9962ee410 100644 | ||
2861 | --- a/drivers/cpufreq/speedstep-lib.c | ||
2862 | +++ b/drivers/cpufreq/speedstep-lib.c | ||
2863 | @@ -272,9 +272,9 @@ unsigned int speedstep_detect_processor(void) | ||
2864 | ebx = cpuid_ebx(0x00000001); | ||
2865 | ebx &= 0x000000FF; | ||
2866 | |||
2867 | - pr_debug("ebx value is %x, x86_mask is %x\n", ebx, c->x86_mask); | ||
2868 | + pr_debug("ebx value is %x, x86_stepping is %x\n", ebx, c->x86_stepping); | ||
2869 | |||
2870 | - switch (c->x86_mask) { | ||
2871 | + switch (c->x86_stepping) { | ||
2872 | case 4: | ||
2873 | /* | ||
2874 | * B-stepping [M-P4-M] | ||
2875 | @@ -361,7 +361,7 @@ unsigned int speedstep_detect_processor(void) | ||
2876 | msr_lo, msr_hi); | ||
2877 | if ((msr_hi & (1<<18)) && | ||
2878 | (relaxed_check ? 1 : (msr_hi & (3<<24)))) { | ||
2879 | - if (c->x86_mask == 0x01) { | ||
2880 | + if (c->x86_stepping == 0x01) { | ||
2881 | pr_debug("early PIII version\n"); | ||
2882 | return SPEEDSTEP_CPU_PIII_C_EARLY; | ||
2883 | } else | ||
2884 | diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c | ||
2885 | index 4b6642a25df5..1c6cbda56afe 100644 | ||
2886 | --- a/drivers/crypto/padlock-aes.c | ||
2887 | +++ b/drivers/crypto/padlock-aes.c | ||
2888 | @@ -512,7 +512,7 @@ static int __init padlock_init(void) | ||
2889 | |||
2890 | printk(KERN_NOTICE PFX "Using VIA PadLock ACE for AES algorithm.\n"); | ||
2891 | |||
2892 | - if (c->x86 == 6 && c->x86_model == 15 && c->x86_mask == 2) { | ||
2893 | + if (c->x86 == 6 && c->x86_model == 15 && c->x86_stepping == 2) { | ||
2894 | ecb_fetch_blocks = MAX_ECB_FETCH_BLOCKS; | ||
2895 | cbc_fetch_blocks = MAX_CBC_FETCH_BLOCKS; | ||
2896 | printk(KERN_NOTICE PFX "VIA Nano stepping 2 detected: enabling workaround.\n"); | ||
2897 | diff --git a/drivers/crypto/sunxi-ss/sun4i-ss-prng.c b/drivers/crypto/sunxi-ss/sun4i-ss-prng.c | ||
2898 | index 0d01d1624252..63d636424161 100644 | ||
2899 | --- a/drivers/crypto/sunxi-ss/sun4i-ss-prng.c | ||
2900 | +++ b/drivers/crypto/sunxi-ss/sun4i-ss-prng.c | ||
2901 | @@ -28,7 +28,7 @@ int sun4i_ss_prng_generate(struct crypto_rng *tfm, const u8 *src, | ||
2902 | algt = container_of(alg, struct sun4i_ss_alg_template, alg.rng); | ||
2903 | ss = algt->ss; | ||
2904 | |||
2905 | - spin_lock(&ss->slock); | ||
2906 | + spin_lock_bh(&ss->slock); | ||
2907 | |||
2908 | writel(mode, ss->base + SS_CTL); | ||
2909 | |||
2910 | @@ -51,6 +51,6 @@ int sun4i_ss_prng_generate(struct crypto_rng *tfm, const u8 *src, | ||
2911 | } | ||
2912 | |||
2913 | writel(0, ss->base + SS_CTL); | ||
2914 | - spin_unlock(&ss->slock); | ||
2915 | - return dlen; | ||
2916 | + spin_unlock_bh(&ss->slock); | ||
2917 | + return 0; | ||
2918 | } | ||
2919 | diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c | ||
2920 | index 78fb496ecb4e..99c4021fc33b 100644 | ||
2921 | --- a/drivers/devfreq/devfreq.c | ||
2922 | +++ b/drivers/devfreq/devfreq.c | ||
2923 | @@ -737,7 +737,7 @@ struct devfreq *devm_devfreq_add_device(struct device *dev, | ||
2924 | devfreq = devfreq_add_device(dev, profile, governor_name, data); | ||
2925 | if (IS_ERR(devfreq)) { | ||
2926 | devres_free(ptr); | ||
2927 | - return ERR_PTR(-ENOMEM); | ||
2928 | + return devfreq; | ||
2929 | } | ||
2930 | |||
2931 | *ptr = devfreq; | ||
2932 | diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c | ||
2933 | index b44d9d7db347..012fa3d1f407 100644 | ||
2934 | --- a/drivers/dma-buf/reservation.c | ||
2935 | +++ b/drivers/dma-buf/reservation.c | ||
2936 | @@ -455,13 +455,15 @@ long reservation_object_wait_timeout_rcu(struct reservation_object *obj, | ||
2937 | unsigned long timeout) | ||
2938 | { | ||
2939 | struct dma_fence *fence; | ||
2940 | - unsigned seq, shared_count, i = 0; | ||
2941 | + unsigned seq, shared_count; | ||
2942 | long ret = timeout ? timeout : 1; | ||
2943 | + int i; | ||
2944 | |||
2945 | retry: | ||
2946 | shared_count = 0; | ||
2947 | seq = read_seqcount_begin(&obj->seq); | ||
2948 | rcu_read_lock(); | ||
2949 | + i = -1; | ||
2950 | |||
2951 | fence = rcu_dereference(obj->fence_excl); | ||
2952 | if (fence && !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) { | ||
2953 | @@ -477,14 +479,14 @@ long reservation_object_wait_timeout_rcu(struct reservation_object *obj, | ||
2954 | fence = NULL; | ||
2955 | } | ||
2956 | |||
2957 | - if (!fence && wait_all) { | ||
2958 | + if (wait_all) { | ||
2959 | struct reservation_object_list *fobj = | ||
2960 | rcu_dereference(obj->fence); | ||
2961 | |||
2962 | if (fobj) | ||
2963 | shared_count = fobj->shared_count; | ||
2964 | |||
2965 | - for (i = 0; i < shared_count; ++i) { | ||
2966 | + for (i = 0; !fence && i < shared_count; ++i) { | ||
2967 | struct dma_fence *lfence = rcu_dereference(fobj->shared[i]); | ||
2968 | |||
2969 | if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, | ||
2970 | diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c | ||
2971 | index 8b16ec595fa7..329cb96f886f 100644 | ||
2972 | --- a/drivers/edac/amd64_edac.c | ||
2973 | +++ b/drivers/edac/amd64_edac.c | ||
2974 | @@ -3147,7 +3147,7 @@ static struct amd64_family_type *per_family_init(struct amd64_pvt *pvt) | ||
2975 | struct amd64_family_type *fam_type = NULL; | ||
2976 | |||
2977 | pvt->ext_model = boot_cpu_data.x86_model >> 4; | ||
2978 | - pvt->stepping = boot_cpu_data.x86_mask; | ||
2979 | + pvt->stepping = boot_cpu_data.x86_stepping; | ||
2980 | pvt->model = boot_cpu_data.x86_model; | ||
2981 | pvt->fam = boot_cpu_data.x86; | ||
2982 | |||
2983 | diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h | ||
2984 | index 58888400f1b8..caebdbebdcd8 100644 | ||
2985 | --- a/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h | ||
2986 | +++ b/drivers/gpu/drm/amd/powerplay/smumgr/rv_smumgr.h | ||
2987 | @@ -40,7 +40,7 @@ struct smu_table_entry { | ||
2988 | uint32_t table_addr_high; | ||
2989 | uint32_t table_addr_low; | ||
2990 | uint8_t *table; | ||
2991 | - uint32_t handle; | ||
2992 | + unsigned long handle; | ||
2993 | }; | ||
2994 | |||
2995 | struct smu_table_array { | ||
2996 | diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c | ||
2997 | index 9555a3542022..831b73392d82 100644 | ||
2998 | --- a/drivers/gpu/drm/ast/ast_mode.c | ||
2999 | +++ b/drivers/gpu/drm/ast/ast_mode.c | ||
3000 | @@ -644,6 +644,7 @@ static void ast_crtc_commit(struct drm_crtc *crtc) | ||
3001 | { | ||
3002 | struct ast_private *ast = crtc->dev->dev_private; | ||
3003 | ast_set_index_reg_mask(ast, AST_IO_SEQ_PORT, 0x1, 0xdf, 0); | ||
3004 | + ast_crtc_load_lut(crtc); | ||
3005 | } | ||
3006 | |||
3007 | |||
3008 | diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c | ||
3009 | index aad468d170a7..d9c0f7573905 100644 | ||
3010 | --- a/drivers/gpu/drm/drm_auth.c | ||
3011 | +++ b/drivers/gpu/drm/drm_auth.c | ||
3012 | @@ -230,6 +230,12 @@ int drm_dropmaster_ioctl(struct drm_device *dev, void *data, | ||
3013 | if (!dev->master) | ||
3014 | goto out_unlock; | ||
3015 | |||
3016 | + if (file_priv->master->lessor != NULL) { | ||
3017 | + DRM_DEBUG_LEASE("Attempt to drop lessee %d as master\n", file_priv->master->lessee_id); | ||
3018 | + ret = -EINVAL; | ||
3019 | + goto out_unlock; | ||
3020 | + } | ||
3021 | + | ||
3022 | ret = 0; | ||
3023 | drm_drop_master(dev, file_priv); | ||
3024 | out_unlock: | ||
3025 | diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c | ||
3026 | index 4756b3c9bf2c..9a9214ae0fb5 100644 | ||
3027 | --- a/drivers/gpu/drm/qxl/qxl_display.c | ||
3028 | +++ b/drivers/gpu/drm/qxl/qxl_display.c | ||
3029 | @@ -289,6 +289,7 @@ static void qxl_crtc_destroy(struct drm_crtc *crtc) | ||
3030 | { | ||
3031 | struct qxl_crtc *qxl_crtc = to_qxl_crtc(crtc); | ||
3032 | |||
3033 | + qxl_bo_unref(&qxl_crtc->cursor_bo); | ||
3034 | drm_crtc_cleanup(crtc); | ||
3035 | kfree(qxl_crtc); | ||
3036 | } | ||
3037 | @@ -495,6 +496,53 @@ static int qxl_primary_atomic_check(struct drm_plane *plane, | ||
3038 | return 0; | ||
3039 | } | ||
3040 | |||
3041 | +static int qxl_primary_apply_cursor(struct drm_plane *plane) | ||
3042 | +{ | ||
3043 | + struct drm_device *dev = plane->dev; | ||
3044 | + struct qxl_device *qdev = dev->dev_private; | ||
3045 | + struct drm_framebuffer *fb = plane->state->fb; | ||
3046 | + struct qxl_crtc *qcrtc = to_qxl_crtc(plane->state->crtc); | ||
3047 | + struct qxl_cursor_cmd *cmd; | ||
3048 | + struct qxl_release *release; | ||
3049 | + int ret = 0; | ||
3050 | + | ||
3051 | + if (!qcrtc->cursor_bo) | ||
3052 | + return 0; | ||
3053 | + | ||
3054 | + ret = qxl_alloc_release_reserved(qdev, sizeof(*cmd), | ||
3055 | + QXL_RELEASE_CURSOR_CMD, | ||
3056 | + &release, NULL); | ||
3057 | + if (ret) | ||
3058 | + return ret; | ||
3059 | + | ||
3060 | + ret = qxl_release_list_add(release, qcrtc->cursor_bo); | ||
3061 | + if (ret) | ||
3062 | + goto out_free_release; | ||
3063 | + | ||
3064 | + ret = qxl_release_reserve_list(release, false); | ||
3065 | + if (ret) | ||
3066 | + goto out_free_release; | ||
3067 | + | ||
3068 | + cmd = (struct qxl_cursor_cmd *)qxl_release_map(qdev, release); | ||
3069 | + cmd->type = QXL_CURSOR_SET; | ||
3070 | + cmd->u.set.position.x = plane->state->crtc_x + fb->hot_x; | ||
3071 | + cmd->u.set.position.y = plane->state->crtc_y + fb->hot_y; | ||
3072 | + | ||
3073 | + cmd->u.set.shape = qxl_bo_physical_address(qdev, qcrtc->cursor_bo, 0); | ||
3074 | + | ||
3075 | + cmd->u.set.visible = 1; | ||
3076 | + qxl_release_unmap(qdev, release, &cmd->release_info); | ||
3077 | + | ||
3078 | + qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); | ||
3079 | + qxl_release_fence_buffer_objects(release); | ||
3080 | + | ||
3081 | + return ret; | ||
3082 | + | ||
3083 | +out_free_release: | ||
3084 | + qxl_release_free(qdev, release); | ||
3085 | + return ret; | ||
3086 | +} | ||
3087 | + | ||
3088 | static void qxl_primary_atomic_update(struct drm_plane *plane, | ||
3089 | struct drm_plane_state *old_state) | ||
3090 | { | ||
3091 | @@ -510,6 +558,7 @@ static void qxl_primary_atomic_update(struct drm_plane *plane, | ||
3092 | .x2 = qfb->base.width, | ||
3093 | .y2 = qfb->base.height | ||
3094 | }; | ||
3095 | + int ret; | ||
3096 | bool same_shadow = false; | ||
3097 | |||
3098 | if (old_state->fb) { | ||
3099 | @@ -531,6 +580,11 @@ static void qxl_primary_atomic_update(struct drm_plane *plane, | ||
3100 | if (!same_shadow) | ||
3101 | qxl_io_destroy_primary(qdev); | ||
3102 | bo_old->is_primary = false; | ||
3103 | + | ||
3104 | + ret = qxl_primary_apply_cursor(plane); | ||
3105 | + if (ret) | ||
3106 | + DRM_ERROR( | ||
3107 | + "could not set cursor after creating primary"); | ||
3108 | } | ||
3109 | |||
3110 | if (!bo->is_primary) { | ||
3111 | @@ -571,11 +625,12 @@ static void qxl_cursor_atomic_update(struct drm_plane *plane, | ||
3112 | struct drm_device *dev = plane->dev; | ||
3113 | struct qxl_device *qdev = dev->dev_private; | ||
3114 | struct drm_framebuffer *fb = plane->state->fb; | ||
3115 | + struct qxl_crtc *qcrtc = to_qxl_crtc(plane->state->crtc); | ||
3116 | struct qxl_release *release; | ||
3117 | struct qxl_cursor_cmd *cmd; | ||
3118 | struct qxl_cursor *cursor; | ||
3119 | struct drm_gem_object *obj; | ||
3120 | - struct qxl_bo *cursor_bo, *user_bo = NULL; | ||
3121 | + struct qxl_bo *cursor_bo = NULL, *user_bo = NULL; | ||
3122 | int ret; | ||
3123 | void *user_ptr; | ||
3124 | int size = 64*64*4; | ||
3125 | @@ -628,6 +683,10 @@ static void qxl_cursor_atomic_update(struct drm_plane *plane, | ||
3126 | cmd->u.set.shape = qxl_bo_physical_address(qdev, | ||
3127 | cursor_bo, 0); | ||
3128 | cmd->type = QXL_CURSOR_SET; | ||
3129 | + | ||
3130 | + qxl_bo_unref(&qcrtc->cursor_bo); | ||
3131 | + qcrtc->cursor_bo = cursor_bo; | ||
3132 | + cursor_bo = NULL; | ||
3133 | } else { | ||
3134 | |||
3135 | ret = qxl_release_reserve_list(release, true); | ||
3136 | @@ -645,6 +704,8 @@ static void qxl_cursor_atomic_update(struct drm_plane *plane, | ||
3137 | qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false); | ||
3138 | qxl_release_fence_buffer_objects(release); | ||
3139 | |||
3140 | + qxl_bo_unref(&cursor_bo); | ||
3141 | + | ||
3142 | return; | ||
3143 | |||
3144 | out_backoff: | ||
3145 | diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h | ||
3146 | index 08752c0ffb35..00a1a66b052a 100644 | ||
3147 | --- a/drivers/gpu/drm/qxl/qxl_drv.h | ||
3148 | +++ b/drivers/gpu/drm/qxl/qxl_drv.h | ||
3149 | @@ -111,6 +111,8 @@ struct qxl_bo_list { | ||
3150 | struct qxl_crtc { | ||
3151 | struct drm_crtc base; | ||
3152 | int index; | ||
3153 | + | ||
3154 | + struct qxl_bo *cursor_bo; | ||
3155 | }; | ||
3156 | |||
3157 | struct qxl_output { | ||
3158 | diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c | ||
3159 | index d34d1cf33895..95f4db70dd22 100644 | ||
3160 | --- a/drivers/gpu/drm/radeon/radeon_uvd.c | ||
3161 | +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | ||
3162 | @@ -995,7 +995,7 @@ int radeon_uvd_calc_upll_dividers(struct radeon_device *rdev, | ||
3163 | /* calc dclk divider with current vco freq */ | ||
3164 | dclk_div = radeon_uvd_calc_upll_post_div(vco_freq, dclk, | ||
3165 | pd_min, pd_even); | ||
3166 | - if (vclk_div > pd_max) | ||
3167 | + if (dclk_div > pd_max) | ||
3168 | break; /* vco is too big, it has to stop */ | ||
3169 | |||
3170 | /* calc score with current vco freq */ | ||
3171 | diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c | ||
3172 | index ee3e74266a13..97a0a639dad9 100644 | ||
3173 | --- a/drivers/gpu/drm/radeon/si_dpm.c | ||
3174 | +++ b/drivers/gpu/drm/radeon/si_dpm.c | ||
3175 | @@ -2984,6 +2984,11 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | ||
3176 | (rdev->pdev->device == 0x6667)) { | ||
3177 | max_sclk = 75000; | ||
3178 | } | ||
3179 | + if ((rdev->pdev->revision == 0xC3) || | ||
3180 | + (rdev->pdev->device == 0x6665)) { | ||
3181 | + max_sclk = 60000; | ||
3182 | + max_mclk = 80000; | ||
3183 | + } | ||
3184 | } else if (rdev->family == CHIP_OLAND) { | ||
3185 | if ((rdev->pdev->revision == 0xC7) || | ||
3186 | (rdev->pdev->revision == 0x80) || | ||
3187 | diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c | ||
3188 | index c088703777e2..68eed684dff5 100644 | ||
3189 | --- a/drivers/gpu/drm/ttm/ttm_bo.c | ||
3190 | +++ b/drivers/gpu/drm/ttm/ttm_bo.c | ||
3191 | @@ -175,7 +175,8 @@ void ttm_bo_add_to_lru(struct ttm_buffer_object *bo) | ||
3192 | list_add_tail(&bo->lru, &man->lru[bo->priority]); | ||
3193 | kref_get(&bo->list_kref); | ||
3194 | |||
3195 | - if (bo->ttm && !(bo->ttm->page_flags & TTM_PAGE_FLAG_SG)) { | ||
3196 | + if (bo->ttm && !(bo->ttm->page_flags & | ||
3197 | + (TTM_PAGE_FLAG_SG | TTM_PAGE_FLAG_SWAPPED))) { | ||
3198 | list_add_tail(&bo->swap, | ||
3199 | &bo->glob->swap_lru[bo->priority]); | ||
3200 | kref_get(&bo->list_kref); | ||
3201 | diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c | ||
3202 | index c8ebb757e36b..b17d0d38f290 100644 | ||
3203 | --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c | ||
3204 | +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c | ||
3205 | @@ -299,7 +299,7 @@ static void ttm_bo_vm_close(struct vm_area_struct *vma) | ||
3206 | |||
3207 | static int ttm_bo_vm_access_kmap(struct ttm_buffer_object *bo, | ||
3208 | unsigned long offset, | ||
3209 | - void *buf, int len, int write) | ||
3210 | + uint8_t *buf, int len, int write) | ||
3211 | { | ||
3212 | unsigned long page = offset >> PAGE_SHIFT; | ||
3213 | unsigned long bytes_left = len; | ||
3214 | @@ -328,6 +328,7 @@ static int ttm_bo_vm_access_kmap(struct ttm_buffer_object *bo, | ||
3215 | ttm_bo_kunmap(&map); | ||
3216 | |||
3217 | page++; | ||
3218 | + buf += bytes; | ||
3219 | bytes_left -= bytes; | ||
3220 | offset = 0; | ||
3221 | } while (bytes_left); | ||
3222 | diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c | ||
3223 | index c13a4fd86b3c..a42744c7665b 100644 | ||
3224 | --- a/drivers/hwmon/coretemp.c | ||
3225 | +++ b/drivers/hwmon/coretemp.c | ||
3226 | @@ -268,13 +268,13 @@ static int adjust_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev) | ||
3227 | for (i = 0; i < ARRAY_SIZE(tjmax_model_table); i++) { | ||
3228 | const struct tjmax_model *tm = &tjmax_model_table[i]; | ||
3229 | if (c->x86_model == tm->model && | ||
3230 | - (tm->mask == ANY || c->x86_mask == tm->mask)) | ||
3231 | + (tm->mask == ANY || c->x86_stepping == tm->mask)) | ||
3232 | return tm->tjmax; | ||
3233 | } | ||
3234 | |||
3235 | /* Early chips have no MSR for TjMax */ | ||
3236 | |||
3237 | - if (c->x86_model == 0xf && c->x86_mask < 4) | ||
3238 | + if (c->x86_model == 0xf && c->x86_stepping < 4) | ||
3239 | usemsr_ee = 0; | ||
3240 | |||
3241 | if (c->x86_model > 0xe && usemsr_ee) { | ||
3242 | @@ -425,7 +425,7 @@ static int chk_ucode_version(unsigned int cpu) | ||
3243 | * Readings might stop update when processor visited too deep sleep, | ||
3244 | * fixed for stepping D0 (6EC). | ||
3245 | */ | ||
3246 | - if (c->x86_model == 0xe && c->x86_mask < 0xc && c->microcode < 0x39) { | ||
3247 | + if (c->x86_model == 0xe && c->x86_stepping < 0xc && c->microcode < 0x39) { | ||
3248 | pr_err("Errata AE18 not fixed, update BIOS or microcode of the CPU!\n"); | ||
3249 | return -ENODEV; | ||
3250 | } | ||
3251 | diff --git a/drivers/hwmon/hwmon-vid.c b/drivers/hwmon/hwmon-vid.c | ||
3252 | index ef91b8a67549..84e91286fc4f 100644 | ||
3253 | --- a/drivers/hwmon/hwmon-vid.c | ||
3254 | +++ b/drivers/hwmon/hwmon-vid.c | ||
3255 | @@ -293,7 +293,7 @@ u8 vid_which_vrm(void) | ||
3256 | if (c->x86 < 6) /* Any CPU with family lower than 6 */ | ||
3257 | return 0; /* doesn't have VID */ | ||
3258 | |||
3259 | - vrm_ret = find_vrm(c->x86, c->x86_model, c->x86_mask, c->x86_vendor); | ||
3260 | + vrm_ret = find_vrm(c->x86, c->x86_model, c->x86_stepping, c->x86_vendor); | ||
3261 | if (vrm_ret == 134) | ||
3262 | vrm_ret = get_via_model_d_vrm(); | ||
3263 | if (vrm_ret == 0) | ||
3264 | diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c | ||
3265 | index 0721e175664a..b960015cb073 100644 | ||
3266 | --- a/drivers/hwmon/k10temp.c | ||
3267 | +++ b/drivers/hwmon/k10temp.c | ||
3268 | @@ -226,7 +226,7 @@ static bool has_erratum_319(struct pci_dev *pdev) | ||
3269 | * and AM3 formats, but that's the best we can do. | ||
3270 | */ | ||
3271 | return boot_cpu_data.x86_model < 4 || | ||
3272 | - (boot_cpu_data.x86_model == 4 && boot_cpu_data.x86_mask <= 2); | ||
3273 | + (boot_cpu_data.x86_model == 4 && boot_cpu_data.x86_stepping <= 2); | ||
3274 | } | ||
3275 | |||
3276 | static int k10temp_probe(struct pci_dev *pdev, | ||
3277 | diff --git a/drivers/hwmon/k8temp.c b/drivers/hwmon/k8temp.c | ||
3278 | index 5a632bcf869b..e59f9113fb93 100644 | ||
3279 | --- a/drivers/hwmon/k8temp.c | ||
3280 | +++ b/drivers/hwmon/k8temp.c | ||
3281 | @@ -187,7 +187,7 @@ static int k8temp_probe(struct pci_dev *pdev, | ||
3282 | return -ENOMEM; | ||
3283 | |||
3284 | model = boot_cpu_data.x86_model; | ||
3285 | - stepping = boot_cpu_data.x86_mask; | ||
3286 | + stepping = boot_cpu_data.x86_stepping; | ||
3287 | |||
3288 | /* feature available since SH-C0, exclude older revisions */ | ||
3289 | if ((model == 4 && stepping == 0) || | ||
3290 | diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c | ||
3291 | index 465520627e4b..d7d042a20ab4 100644 | ||
3292 | --- a/drivers/infiniband/core/device.c | ||
3293 | +++ b/drivers/infiniband/core/device.c | ||
3294 | @@ -462,7 +462,6 @@ int ib_register_device(struct ib_device *device, | ||
3295 | struct ib_udata uhw = {.outlen = 0, .inlen = 0}; | ||
3296 | struct device *parent = device->dev.parent; | ||
3297 | |||
3298 | - WARN_ON_ONCE(!parent); | ||
3299 | WARN_ON_ONCE(device->dma_device); | ||
3300 | if (device->dev.dma_ops) { | ||
3301 | /* | ||
3302 | @@ -471,16 +470,25 @@ int ib_register_device(struct ib_device *device, | ||
3303 | * into device->dev. | ||
3304 | */ | ||
3305 | device->dma_device = &device->dev; | ||
3306 | - if (!device->dev.dma_mask) | ||
3307 | - device->dev.dma_mask = parent->dma_mask; | ||
3308 | - if (!device->dev.coherent_dma_mask) | ||
3309 | - device->dev.coherent_dma_mask = | ||
3310 | - parent->coherent_dma_mask; | ||
3311 | + if (!device->dev.dma_mask) { | ||
3312 | + if (parent) | ||
3313 | + device->dev.dma_mask = parent->dma_mask; | ||
3314 | + else | ||
3315 | + WARN_ON_ONCE(true); | ||
3316 | + } | ||
3317 | + if (!device->dev.coherent_dma_mask) { | ||
3318 | + if (parent) | ||
3319 | + device->dev.coherent_dma_mask = | ||
3320 | + parent->coherent_dma_mask; | ||
3321 | + else | ||
3322 | + WARN_ON_ONCE(true); | ||
3323 | + } | ||
3324 | } else { | ||
3325 | /* | ||
3326 | * The caller did not provide custom DMA operations. Use the | ||
3327 | * DMA mapping operations of the parent device. | ||
3328 | */ | ||
3329 | + WARN_ON_ONCE(!parent); | ||
3330 | device->dma_device = parent; | ||
3331 | } | ||
3332 | |||
3333 | diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c | ||
3334 | index e30d86fa1855..8ae1308eecc7 100644 | ||
3335 | --- a/drivers/infiniband/core/sysfs.c | ||
3336 | +++ b/drivers/infiniband/core/sysfs.c | ||
3337 | @@ -1276,7 +1276,6 @@ int ib_device_register_sysfs(struct ib_device *device, | ||
3338 | int ret; | ||
3339 | int i; | ||
3340 | |||
3341 | - WARN_ON_ONCE(!device->dev.parent); | ||
3342 | ret = dev_set_name(class_dev, "%s", device->name); | ||
3343 | if (ret) | ||
3344 | return ret; | ||
3345 | diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c | ||
3346 | index 4b64dd02e090..3205800f9579 100644 | ||
3347 | --- a/drivers/infiniband/core/user_mad.c | ||
3348 | +++ b/drivers/infiniband/core/user_mad.c | ||
3349 | @@ -500,7 +500,7 @@ static ssize_t ib_umad_write(struct file *filp, const char __user *buf, | ||
3350 | } | ||
3351 | |||
3352 | memset(&ah_attr, 0, sizeof ah_attr); | ||
3353 | - ah_attr.type = rdma_ah_find_type(file->port->ib_dev, | ||
3354 | + ah_attr.type = rdma_ah_find_type(agent->device, | ||
3355 | file->port->port_num); | ||
3356 | rdma_ah_set_dlid(&ah_attr, be16_to_cpu(packet->mad.hdr.lid)); | ||
3357 | rdma_ah_set_sl(&ah_attr, packet->mad.hdr.sl); | ||
3358 | diff --git a/drivers/infiniband/core/uverbs_std_types.c b/drivers/infiniband/core/uverbs_std_types.c | ||
3359 | index c3ee5d9b336d..cca70d36ee15 100644 | ||
3360 | --- a/drivers/infiniband/core/uverbs_std_types.c | ||
3361 | +++ b/drivers/infiniband/core/uverbs_std_types.c | ||
3362 | @@ -315,7 +315,7 @@ static int uverbs_create_cq_handler(struct ib_device *ib_dev, | ||
3363 | cq->uobject = &obj->uobject; | ||
3364 | cq->comp_handler = ib_uverbs_comp_handler; | ||
3365 | cq->event_handler = ib_uverbs_cq_event_handler; | ||
3366 | - cq->cq_context = &ev_file->ev_queue; | ||
3367 | + cq->cq_context = ev_file ? &ev_file->ev_queue : NULL; | ||
3368 | obj->uobject.object = cq; | ||
3369 | obj->uobject.user_handle = user_handle; | ||
3370 | atomic_set(&cq->usecnt, 0); | ||
3371 | diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c | ||
3372 | index 8c8a16791a3f..5caf37ba7fff 100644 | ||
3373 | --- a/drivers/infiniband/hw/mlx4/main.c | ||
3374 | +++ b/drivers/infiniband/hw/mlx4/main.c | ||
3375 | @@ -2995,9 +2995,8 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) | ||
3376 | kfree(ibdev->ib_uc_qpns_bitmap); | ||
3377 | |||
3378 | err_steer_qp_release: | ||
3379 | - if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) | ||
3380 | - mlx4_qp_release_range(dev, ibdev->steer_qpn_base, | ||
3381 | - ibdev->steer_qpn_count); | ||
3382 | + mlx4_qp_release_range(dev, ibdev->steer_qpn_base, | ||
3383 | + ibdev->steer_qpn_count); | ||
3384 | err_counter: | ||
3385 | for (i = 0; i < ibdev->num_ports; ++i) | ||
3386 | mlx4_ib_delete_counters_table(ibdev, &ibdev->counters_table[i]); | ||
3387 | @@ -3102,11 +3101,9 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr) | ||
3388 | ibdev->iboe.nb.notifier_call = NULL; | ||
3389 | } | ||
3390 | |||
3391 | - if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) { | ||
3392 | - mlx4_qp_release_range(dev, ibdev->steer_qpn_base, | ||
3393 | - ibdev->steer_qpn_count); | ||
3394 | - kfree(ibdev->ib_uc_qpns_bitmap); | ||
3395 | - } | ||
3396 | + mlx4_qp_release_range(dev, ibdev->steer_qpn_base, | ||
3397 | + ibdev->steer_qpn_count); | ||
3398 | + kfree(ibdev->ib_uc_qpns_bitmap); | ||
3399 | |||
3400 | iounmap(ibdev->uar_map); | ||
3401 | for (p = 0; p < ibdev->num_ports; ++p) | ||
3402 | diff --git a/drivers/infiniband/hw/qib/qib_rc.c b/drivers/infiniband/hw/qib/qib_rc.c | ||
3403 | index 8f5754fb8579..e4a9ba1dd9ba 100644 | ||
3404 | --- a/drivers/infiniband/hw/qib/qib_rc.c | ||
3405 | +++ b/drivers/infiniband/hw/qib/qib_rc.c | ||
3406 | @@ -434,13 +434,13 @@ int qib_make_rc_req(struct rvt_qp *qp, unsigned long *flags) | ||
3407 | qp->s_state = OP(COMPARE_SWAP); | ||
3408 | put_ib_ateth_swap(wqe->atomic_wr.swap, | ||
3409 | &ohdr->u.atomic_eth); | ||
3410 | - put_ib_ateth_swap(wqe->atomic_wr.compare_add, | ||
3411 | - &ohdr->u.atomic_eth); | ||
3412 | + put_ib_ateth_compare(wqe->atomic_wr.compare_add, | ||
3413 | + &ohdr->u.atomic_eth); | ||
3414 | } else { | ||
3415 | qp->s_state = OP(FETCH_ADD); | ||
3416 | put_ib_ateth_swap(wqe->atomic_wr.compare_add, | ||
3417 | &ohdr->u.atomic_eth); | ||
3418 | - put_ib_ateth_swap(0, &ohdr->u.atomic_eth); | ||
3419 | + put_ib_ateth_compare(0, &ohdr->u.atomic_eth); | ||
3420 | } | ||
3421 | put_ib_ateth_vaddr(wqe->atomic_wr.remote_addr, | ||
3422 | &ohdr->u.atomic_eth); | ||
3423 | diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h | ||
3424 | index d7472a442a2c..96c3a6c5c4b5 100644 | ||
3425 | --- a/drivers/infiniband/sw/rxe/rxe_loc.h | ||
3426 | +++ b/drivers/infiniband/sw/rxe/rxe_loc.h | ||
3427 | @@ -237,7 +237,6 @@ int rxe_srq_from_attr(struct rxe_dev *rxe, struct rxe_srq *srq, | ||
3428 | |||
3429 | void rxe_release(struct kref *kref); | ||
3430 | |||
3431 | -void rxe_drain_req_pkts(struct rxe_qp *qp, bool notify); | ||
3432 | int rxe_completer(void *arg); | ||
3433 | int rxe_requester(void *arg); | ||
3434 | int rxe_responder(void *arg); | ||
3435 | diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c | ||
3436 | index 4469592b839d..137d6c0c49d4 100644 | ||
3437 | --- a/drivers/infiniband/sw/rxe/rxe_qp.c | ||
3438 | +++ b/drivers/infiniband/sw/rxe/rxe_qp.c | ||
3439 | @@ -824,9 +824,9 @@ void rxe_qp_destroy(struct rxe_qp *qp) | ||
3440 | } | ||
3441 | |||
3442 | /* called when the last reference to the qp is dropped */ | ||
3443 | -void rxe_qp_cleanup(struct rxe_pool_entry *arg) | ||
3444 | +static void rxe_qp_do_cleanup(struct work_struct *work) | ||
3445 | { | ||
3446 | - struct rxe_qp *qp = container_of(arg, typeof(*qp), pelem); | ||
3447 | + struct rxe_qp *qp = container_of(work, typeof(*qp), cleanup_work.work); | ||
3448 | |||
3449 | rxe_drop_all_mcast_groups(qp); | ||
3450 | |||
3451 | @@ -859,3 +859,11 @@ void rxe_qp_cleanup(struct rxe_pool_entry *arg) | ||
3452 | kernel_sock_shutdown(qp->sk, SHUT_RDWR); | ||
3453 | sock_release(qp->sk); | ||
3454 | } | ||
3455 | + | ||
3456 | +/* called when the last reference to the qp is dropped */ | ||
3457 | +void rxe_qp_cleanup(struct rxe_pool_entry *arg) | ||
3458 | +{ | ||
3459 | + struct rxe_qp *qp = container_of(arg, typeof(*qp), pelem); | ||
3460 | + | ||
3461 | + execute_in_process_context(rxe_qp_do_cleanup, &qp->cleanup_work); | ||
3462 | +} | ||
3463 | diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c | ||
3464 | index 26a7f923045b..7bdaf71b8221 100644 | ||
3465 | --- a/drivers/infiniband/sw/rxe/rxe_req.c | ||
3466 | +++ b/drivers/infiniband/sw/rxe/rxe_req.c | ||
3467 | @@ -594,15 +594,8 @@ int rxe_requester(void *arg) | ||
3468 | rxe_add_ref(qp); | ||
3469 | |||
3470 | next_wqe: | ||
3471 | - if (unlikely(!qp->valid)) { | ||
3472 | - rxe_drain_req_pkts(qp, true); | ||
3473 | + if (unlikely(!qp->valid || qp->req.state == QP_STATE_ERROR)) | ||
3474 | goto exit; | ||
3475 | - } | ||
3476 | - | ||
3477 | - if (unlikely(qp->req.state == QP_STATE_ERROR)) { | ||
3478 | - rxe_drain_req_pkts(qp, true); | ||
3479 | - goto exit; | ||
3480 | - } | ||
3481 | |||
3482 | if (unlikely(qp->req.state == QP_STATE_RESET)) { | ||
3483 | qp->req.wqe_index = consumer_index(qp->sq.queue); | ||
3484 | diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c | ||
3485 | index 4240866a5331..01f926fd9029 100644 | ||
3486 | --- a/drivers/infiniband/sw/rxe/rxe_resp.c | ||
3487 | +++ b/drivers/infiniband/sw/rxe/rxe_resp.c | ||
3488 | @@ -1210,7 +1210,7 @@ static enum resp_states do_class_d1e_error(struct rxe_qp *qp) | ||
3489 | } | ||
3490 | } | ||
3491 | |||
3492 | -void rxe_drain_req_pkts(struct rxe_qp *qp, bool notify) | ||
3493 | +static void rxe_drain_req_pkts(struct rxe_qp *qp, bool notify) | ||
3494 | { | ||
3495 | struct sk_buff *skb; | ||
3496 | |||
3497 | diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/rxe/rxe_verbs.c | ||
3498 | index d03002b9d84d..7210a784abb4 100644 | ||
3499 | --- a/drivers/infiniband/sw/rxe/rxe_verbs.c | ||
3500 | +++ b/drivers/infiniband/sw/rxe/rxe_verbs.c | ||
3501 | @@ -814,6 +814,8 @@ static int rxe_post_send_kernel(struct rxe_qp *qp, struct ib_send_wr *wr, | ||
3502 | (queue_count(qp->sq.queue) > 1); | ||
3503 | |||
3504 | rxe_run_task(&qp->req.task, must_sched); | ||
3505 | + if (unlikely(qp->req.state == QP_STATE_ERROR)) | ||
3506 | + rxe_run_task(&qp->comp.task, 1); | ||
3507 | |||
3508 | return err; | ||
3509 | } | ||
3510 | diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h | ||
3511 | index 0c2dbe45c729..1019f5e7dbdd 100644 | ||
3512 | --- a/drivers/infiniband/sw/rxe/rxe_verbs.h | ||
3513 | +++ b/drivers/infiniband/sw/rxe/rxe_verbs.h | ||
3514 | @@ -35,6 +35,7 @@ | ||
3515 | #define RXE_VERBS_H | ||
3516 | |||
3517 | #include <linux/interrupt.h> | ||
3518 | +#include <linux/workqueue.h> | ||
3519 | #include <rdma/rdma_user_rxe.h> | ||
3520 | #include "rxe_pool.h" | ||
3521 | #include "rxe_task.h" | ||
3522 | @@ -281,6 +282,8 @@ struct rxe_qp { | ||
3523 | struct timer_list rnr_nak_timer; | ||
3524 | |||
3525 | spinlock_t state_lock; /* guard requester and completer */ | ||
3526 | + | ||
3527 | + struct execute_work cleanup_work; | ||
3528 | }; | ||
3529 | |||
3530 | enum rxe_mem_state { | ||
3531 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c | ||
3532 | index de17b7193299..1c42b00d3be2 100644 | ||
3533 | --- a/drivers/md/dm.c | ||
3534 | +++ b/drivers/md/dm.c | ||
3535 | @@ -817,7 +817,8 @@ static void dec_pending(struct dm_io *io, blk_status_t error) | ||
3536 | queue_io(md, bio); | ||
3537 | } else { | ||
3538 | /* done with normal IO or empty flush */ | ||
3539 | - bio->bi_status = io_error; | ||
3540 | + if (io_error) | ||
3541 | + bio->bi_status = io_error; | ||
3542 | bio_endio(bio); | ||
3543 | } | ||
3544 | } | ||
3545 | diff --git a/drivers/media/tuners/r820t.c b/drivers/media/tuners/r820t.c | ||
3546 | index ba80376a3b86..d097eb04a0e9 100644 | ||
3547 | --- a/drivers/media/tuners/r820t.c | ||
3548 | +++ b/drivers/media/tuners/r820t.c | ||
3549 | @@ -396,9 +396,11 @@ static int r820t_write(struct r820t_priv *priv, u8 reg, const u8 *val, | ||
3550 | return 0; | ||
3551 | } | ||
3552 | |||
3553 | -static int r820t_write_reg(struct r820t_priv *priv, u8 reg, u8 val) | ||
3554 | +static inline int r820t_write_reg(struct r820t_priv *priv, u8 reg, u8 val) | ||
3555 | { | ||
3556 | - return r820t_write(priv, reg, &val, 1); | ||
3557 | + u8 tmp = val; /* work around GCC PR81715 with asan-stack=1 */ | ||
3558 | + | ||
3559 | + return r820t_write(priv, reg, &tmp, 1); | ||
3560 | } | ||
3561 | |||
3562 | static int r820t_read_cache_reg(struct r820t_priv *priv, int reg) | ||
3563 | @@ -411,17 +413,18 @@ static int r820t_read_cache_reg(struct r820t_priv *priv, int reg) | ||
3564 | return -EINVAL; | ||
3565 | } | ||
3566 | |||
3567 | -static int r820t_write_reg_mask(struct r820t_priv *priv, u8 reg, u8 val, | ||
3568 | +static inline int r820t_write_reg_mask(struct r820t_priv *priv, u8 reg, u8 val, | ||
3569 | u8 bit_mask) | ||
3570 | { | ||
3571 | + u8 tmp = val; | ||
3572 | int rc = r820t_read_cache_reg(priv, reg); | ||
3573 | |||
3574 | if (rc < 0) | ||
3575 | return rc; | ||
3576 | |||
3577 | - val = (rc & ~bit_mask) | (val & bit_mask); | ||
3578 | + tmp = (rc & ~bit_mask) | (tmp & bit_mask); | ||
3579 | |||
3580 | - return r820t_write(priv, reg, &val, 1); | ||
3581 | + return r820t_write(priv, reg, &tmp, 1); | ||
3582 | } | ||
3583 | |||
3584 | static int r820t_read(struct r820t_priv *priv, u8 reg, u8 *val, int len) | ||
3585 | diff --git a/drivers/mmc/host/bcm2835.c b/drivers/mmc/host/bcm2835.c | ||
3586 | index 229dc18f0581..768972af8b85 100644 | ||
3587 | --- a/drivers/mmc/host/bcm2835.c | ||
3588 | +++ b/drivers/mmc/host/bcm2835.c | ||
3589 | @@ -1265,7 +1265,8 @@ static int bcm2835_add_host(struct bcm2835_host *host) | ||
3590 | char pio_limit_string[20]; | ||
3591 | int ret; | ||
3592 | |||
3593 | - mmc->f_max = host->max_clk; | ||
3594 | + if (!mmc->f_max || mmc->f_max > host->max_clk) | ||
3595 | + mmc->f_max = host->max_clk; | ||
3596 | mmc->f_min = host->max_clk / SDCDIV_MAX_CDIV; | ||
3597 | |||
3598 | mmc->max_busy_timeout = ~0 / (mmc->f_max / 1000); | ||
3599 | diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c | ||
3600 | index e0862d3f65b3..730fbe01726d 100644 | ||
3601 | --- a/drivers/mmc/host/meson-gx-mmc.c | ||
3602 | +++ b/drivers/mmc/host/meson-gx-mmc.c | ||
3603 | @@ -716,22 +716,6 @@ static int meson_mmc_clk_phase_tuning(struct mmc_host *mmc, u32 opcode, | ||
3604 | static int meson_mmc_execute_tuning(struct mmc_host *mmc, u32 opcode) | ||
3605 | { | ||
3606 | struct meson_host *host = mmc_priv(mmc); | ||
3607 | - int ret; | ||
3608 | - | ||
3609 | - /* | ||
3610 | - * If this is the initial tuning, try to get a sane Rx starting | ||
3611 | - * phase before doing the actual tuning. | ||
3612 | - */ | ||
3613 | - if (!mmc->doing_retune) { | ||
3614 | - ret = meson_mmc_clk_phase_tuning(mmc, opcode, host->rx_clk); | ||
3615 | - | ||
3616 | - if (ret) | ||
3617 | - return ret; | ||
3618 | - } | ||
3619 | - | ||
3620 | - ret = meson_mmc_clk_phase_tuning(mmc, opcode, host->tx_clk); | ||
3621 | - if (ret) | ||
3622 | - return ret; | ||
3623 | |||
3624 | return meson_mmc_clk_phase_tuning(mmc, opcode, host->rx_clk); | ||
3625 | } | ||
3626 | @@ -762,9 +746,8 @@ static void meson_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | ||
3627 | if (!IS_ERR(mmc->supply.vmmc)) | ||
3628 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd); | ||
3629 | |||
3630 | - /* Reset phases */ | ||
3631 | + /* Reset rx phase */ | ||
3632 | clk_set_phase(host->rx_clk, 0); | ||
3633 | - clk_set_phase(host->tx_clk, 270); | ||
3634 | |||
3635 | break; | ||
3636 | |||
3637 | diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c | ||
3638 | index 1f424374bbbb..4ffa6b173a21 100644 | ||
3639 | --- a/drivers/mmc/host/sdhci-of-esdhc.c | ||
3640 | +++ b/drivers/mmc/host/sdhci-of-esdhc.c | ||
3641 | @@ -589,10 +589,18 @@ static void esdhc_pltfm_set_bus_width(struct sdhci_host *host, int width) | ||
3642 | |||
3643 | static void esdhc_reset(struct sdhci_host *host, u8 mask) | ||
3644 | { | ||
3645 | + u32 val; | ||
3646 | + | ||
3647 | sdhci_reset(host, mask); | ||
3648 | |||
3649 | sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); | ||
3650 | sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); | ||
3651 | + | ||
3652 | + if (mask & SDHCI_RESET_ALL) { | ||
3653 | + val = sdhci_readl(host, ESDHC_TBCTL); | ||
3654 | + val &= ~ESDHC_TB_EN; | ||
3655 | + sdhci_writel(host, val, ESDHC_TBCTL); | ||
3656 | + } | ||
3657 | } | ||
3658 | |||
3659 | /* The SCFG, Supplemental Configuration Unit, provides SoC specific | ||
3660 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c | ||
3661 | index e9290a3439d5..d24306b2b839 100644 | ||
3662 | --- a/drivers/mmc/host/sdhci.c | ||
3663 | +++ b/drivers/mmc/host/sdhci.c | ||
3664 | @@ -21,6 +21,7 @@ | ||
3665 | #include <linux/dma-mapping.h> | ||
3666 | #include <linux/slab.h> | ||
3667 | #include <linux/scatterlist.h> | ||
3668 | +#include <linux/sizes.h> | ||
3669 | #include <linux/swiotlb.h> | ||
3670 | #include <linux/regulator/consumer.h> | ||
3671 | #include <linux/pm_runtime.h> | ||
3672 | @@ -502,8 +503,35 @@ static int sdhci_pre_dma_transfer(struct sdhci_host *host, | ||
3673 | if (data->host_cookie == COOKIE_PRE_MAPPED) | ||
3674 | return data->sg_count; | ||
3675 | |||
3676 | - sg_count = dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len, | ||
3677 | - mmc_get_dma_dir(data)); | ||
3678 | + /* Bounce write requests to the bounce buffer */ | ||
3679 | + if (host->bounce_buffer) { | ||
3680 | + unsigned int length = data->blksz * data->blocks; | ||
3681 | + | ||
3682 | + if (length > host->bounce_buffer_size) { | ||
3683 | + pr_err("%s: asked for transfer of %u bytes exceeds bounce buffer %u bytes\n", | ||
3684 | + mmc_hostname(host->mmc), length, | ||
3685 | + host->bounce_buffer_size); | ||
3686 | + return -EIO; | ||
3687 | + } | ||
3688 | + if (mmc_get_dma_dir(data) == DMA_TO_DEVICE) { | ||
3689 | + /* Copy the data to the bounce buffer */ | ||
3690 | + sg_copy_to_buffer(data->sg, data->sg_len, | ||
3691 | + host->bounce_buffer, | ||
3692 | + length); | ||
3693 | + } | ||
3694 | + /* Switch ownership to the DMA */ | ||
3695 | + dma_sync_single_for_device(host->mmc->parent, | ||
3696 | + host->bounce_addr, | ||
3697 | + host->bounce_buffer_size, | ||
3698 | + mmc_get_dma_dir(data)); | ||
3699 | + /* Just a dummy value */ | ||
3700 | + sg_count = 1; | ||
3701 | + } else { | ||
3702 | + /* Just access the data directly from memory */ | ||
3703 | + sg_count = dma_map_sg(mmc_dev(host->mmc), | ||
3704 | + data->sg, data->sg_len, | ||
3705 | + mmc_get_dma_dir(data)); | ||
3706 | + } | ||
3707 | |||
3708 | if (sg_count == 0) | ||
3709 | return -ENOSPC; | ||
3710 | @@ -673,6 +701,14 @@ static void sdhci_adma_table_post(struct sdhci_host *host, | ||
3711 | } | ||
3712 | } | ||
3713 | |||
3714 | +static u32 sdhci_sdma_address(struct sdhci_host *host) | ||
3715 | +{ | ||
3716 | + if (host->bounce_buffer) | ||
3717 | + return host->bounce_addr; | ||
3718 | + else | ||
3719 | + return sg_dma_address(host->data->sg); | ||
3720 | +} | ||
3721 | + | ||
3722 | static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) | ||
3723 | { | ||
3724 | u8 count; | ||
3725 | @@ -858,8 +894,8 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) | ||
3726 | SDHCI_ADMA_ADDRESS_HI); | ||
3727 | } else { | ||
3728 | WARN_ON(sg_cnt != 1); | ||
3729 | - sdhci_writel(host, sg_dma_address(data->sg), | ||
3730 | - SDHCI_DMA_ADDRESS); | ||
3731 | + sdhci_writel(host, sdhci_sdma_address(host), | ||
3732 | + SDHCI_DMA_ADDRESS); | ||
3733 | } | ||
3734 | } | ||
3735 | |||
3736 | @@ -2248,7 +2284,12 @@ static void sdhci_pre_req(struct mmc_host *mmc, struct mmc_request *mrq) | ||
3737 | |||
3738 | mrq->data->host_cookie = COOKIE_UNMAPPED; | ||
3739 | |||
3740 | - if (host->flags & SDHCI_REQ_USE_DMA) | ||
3741 | + /* | ||
3742 | + * No pre-mapping in the pre hook if we're using the bounce buffer, | ||
3743 | + * for that we would need two bounce buffers since one buffer is | ||
3744 | + * in flight when this is getting called. | ||
3745 | + */ | ||
3746 | + if (host->flags & SDHCI_REQ_USE_DMA && !host->bounce_buffer) | ||
3747 | sdhci_pre_dma_transfer(host, mrq->data, COOKIE_PRE_MAPPED); | ||
3748 | } | ||
3749 | |||
3750 | @@ -2352,8 +2393,45 @@ static bool sdhci_request_done(struct sdhci_host *host) | ||
3751 | struct mmc_data *data = mrq->data; | ||
3752 | |||
3753 | if (data && data->host_cookie == COOKIE_MAPPED) { | ||
3754 | - dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, | ||
3755 | - mmc_get_dma_dir(data)); | ||
3756 | + if (host->bounce_buffer) { | ||
3757 | + /* | ||
3758 | + * On reads, copy the bounced data into the | ||
3759 | + * sglist | ||
3760 | + */ | ||
3761 | + if (mmc_get_dma_dir(data) == DMA_FROM_DEVICE) { | ||
3762 | + unsigned int length = data->bytes_xfered; | ||
3763 | + | ||
3764 | + if (length > host->bounce_buffer_size) { | ||
3765 | + pr_err("%s: bounce buffer is %u bytes but DMA claims to have transferred %u bytes\n", | ||
3766 | + mmc_hostname(host->mmc), | ||
3767 | + host->bounce_buffer_size, | ||
3768 | + data->bytes_xfered); | ||
3769 | + /* Cap it down and continue */ | ||
3770 | + length = host->bounce_buffer_size; | ||
3771 | + } | ||
3772 | + dma_sync_single_for_cpu( | ||
3773 | + host->mmc->parent, | ||
3774 | + host->bounce_addr, | ||
3775 | + host->bounce_buffer_size, | ||
3776 | + DMA_FROM_DEVICE); | ||
3777 | + sg_copy_from_buffer(data->sg, | ||
3778 | + data->sg_len, | ||
3779 | + host->bounce_buffer, | ||
3780 | + length); | ||
3781 | + } else { | ||
3782 | + /* No copying, just switch ownership */ | ||
3783 | + dma_sync_single_for_cpu( | ||
3784 | + host->mmc->parent, | ||
3785 | + host->bounce_addr, | ||
3786 | + host->bounce_buffer_size, | ||
3787 | + mmc_get_dma_dir(data)); | ||
3788 | + } | ||
3789 | + } else { | ||
3790 | + /* Unmap the raw data */ | ||
3791 | + dma_unmap_sg(mmc_dev(host->mmc), data->sg, | ||
3792 | + data->sg_len, | ||
3793 | + mmc_get_dma_dir(data)); | ||
3794 | + } | ||
3795 | data->host_cookie = COOKIE_UNMAPPED; | ||
3796 | } | ||
3797 | } | ||
3798 | @@ -2636,7 +2714,8 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) | ||
3799 | */ | ||
3800 | if (intmask & SDHCI_INT_DMA_END) { | ||
3801 | u32 dmastart, dmanow; | ||
3802 | - dmastart = sg_dma_address(host->data->sg); | ||
3803 | + | ||
3804 | + dmastart = sdhci_sdma_address(host); | ||
3805 | dmanow = dmastart + host->data->bytes_xfered; | ||
3806 | /* | ||
3807 | * Force update to the next DMA block boundary. | ||
3808 | @@ -3217,6 +3296,68 @@ void __sdhci_read_caps(struct sdhci_host *host, u16 *ver, u32 *caps, u32 *caps1) | ||
3809 | } | ||
3810 | EXPORT_SYMBOL_GPL(__sdhci_read_caps); | ||
3811 | |||
3812 | +static int sdhci_allocate_bounce_buffer(struct sdhci_host *host) | ||
3813 | +{ | ||
3814 | + struct mmc_host *mmc = host->mmc; | ||
3815 | + unsigned int max_blocks; | ||
3816 | + unsigned int bounce_size; | ||
3817 | + int ret; | ||
3818 | + | ||
3819 | + /* | ||
3820 | + * Cap the bounce buffer at 64KB. Using a bigger bounce buffer | ||
3821 | + * has diminishing returns, this is probably because SD/MMC | ||
3822 | + * cards are usually optimized to handle this size of requests. | ||
3823 | + */ | ||
3824 | + bounce_size = SZ_64K; | ||
3825 | + /* | ||
3826 | + * Adjust downwards to maximum request size if this is less | ||
3827 | + * than our segment size, else hammer down the maximum | ||
3828 | + * request size to the maximum buffer size. | ||
3829 | + */ | ||
3830 | + if (mmc->max_req_size < bounce_size) | ||
3831 | + bounce_size = mmc->max_req_size; | ||
3832 | + max_blocks = bounce_size / 512; | ||
3833 | + | ||
3834 | + /* | ||
3835 | + * When we just support one segment, we can get significant | ||
3836 | + * speedups by the help of a bounce buffer to group scattered | ||
3837 | + * reads/writes together. | ||
3838 | + */ | ||
3839 | + host->bounce_buffer = devm_kmalloc(mmc->parent, | ||
3840 | + bounce_size, | ||
3841 | + GFP_KERNEL); | ||
3842 | + if (!host->bounce_buffer) { | ||
3843 | + pr_err("%s: failed to allocate %u bytes for bounce buffer, falling back to single segments\n", | ||
3844 | + mmc_hostname(mmc), | ||
3845 | + bounce_size); | ||
3846 | + /* | ||
3847 | + * Exiting with zero here makes sure we proceed with | ||
3848 | + * mmc->max_segs == 1. | ||
3849 | + */ | ||
3850 | + return 0; | ||
3851 | + } | ||
3852 | + | ||
3853 | + host->bounce_addr = dma_map_single(mmc->parent, | ||
3854 | + host->bounce_buffer, | ||
3855 | + bounce_size, | ||
3856 | + DMA_BIDIRECTIONAL); | ||
3857 | + ret = dma_mapping_error(mmc->parent, host->bounce_addr); | ||
3858 | + if (ret) | ||
3859 | + /* Again fall back to max_segs == 1 */ | ||
3860 | + return 0; | ||
3861 | + host->bounce_buffer_size = bounce_size; | ||
3862 | + | ||
3863 | + /* Lie about this since we're bouncing */ | ||
3864 | + mmc->max_segs = max_blocks; | ||
3865 | + mmc->max_seg_size = bounce_size; | ||
3866 | + mmc->max_req_size = bounce_size; | ||
3867 | + | ||
3868 | + pr_info("%s bounce up to %u segments into one, max segment size %u bytes\n", | ||
3869 | + mmc_hostname(mmc), max_blocks, bounce_size); | ||
3870 | + | ||
3871 | + return 0; | ||
3872 | +} | ||
3873 | + | ||
3874 | int sdhci_setup_host(struct sdhci_host *host) | ||
3875 | { | ||
3876 | struct mmc_host *mmc; | ||
3877 | @@ -3713,6 +3854,13 @@ int sdhci_setup_host(struct sdhci_host *host) | ||
3878 | */ | ||
3879 | mmc->max_blk_count = (host->quirks & SDHCI_QUIRK_NO_MULTIBLOCK) ? 1 : 65535; | ||
3880 | |||
3881 | + if (mmc->max_segs == 1) { | ||
3882 | + /* This may alter mmc->*_blk_* parameters */ | ||
3883 | + ret = sdhci_allocate_bounce_buffer(host); | ||
3884 | + if (ret) | ||
3885 | + return ret; | ||
3886 | + } | ||
3887 | + | ||
3888 | return 0; | ||
3889 | |||
3890 | unreg: | ||
3891 | diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h | ||
3892 | index 54bc444c317f..1d7d61e25dbf 100644 | ||
3893 | --- a/drivers/mmc/host/sdhci.h | ||
3894 | +++ b/drivers/mmc/host/sdhci.h | ||
3895 | @@ -440,6 +440,9 @@ struct sdhci_host { | ||
3896 | |||
3897 | int irq; /* Device IRQ */ | ||
3898 | void __iomem *ioaddr; /* Mapped address */ | ||
3899 | + char *bounce_buffer; /* For packing SDMA reads/writes */ | ||
3900 | + dma_addr_t bounce_addr; | ||
3901 | + unsigned int bounce_buffer_size; | ||
3902 | |||
3903 | const struct sdhci_ops *ops; /* Low level hw interface */ | ||
3904 | |||
3905 | diff --git a/drivers/mtd/nand/vf610_nfc.c b/drivers/mtd/nand/vf610_nfc.c | ||
3906 | index 8037d4b48a05..e2583a539b41 100644 | ||
3907 | --- a/drivers/mtd/nand/vf610_nfc.c | ||
3908 | +++ b/drivers/mtd/nand/vf610_nfc.c | ||
3909 | @@ -752,10 +752,8 @@ static int vf610_nfc_probe(struct platform_device *pdev) | ||
3910 | if (mtd->oobsize > 64) | ||
3911 | mtd->oobsize = 64; | ||
3912 | |||
3913 | - /* | ||
3914 | - * mtd->ecclayout is not specified here because we're using the | ||
3915 | - * default large page ECC layout defined in NAND core. | ||
3916 | - */ | ||
3917 | + /* Use default large page ECC layout defined in NAND core */ | ||
3918 | + mtd_set_ooblayout(mtd, &nand_ooblayout_lp_ops); | ||
3919 | if (chip->ecc.strength == 32) { | ||
3920 | nfc->ecc_mode = ECC_60_BYTE; | ||
3921 | chip->ecc.bytes = 60; | ||
3922 | diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c | ||
3923 | index 634b2f41cc9e..908acd4624e8 100644 | ||
3924 | --- a/drivers/net/ethernet/marvell/mvpp2.c | ||
3925 | +++ b/drivers/net/ethernet/marvell/mvpp2.c | ||
3926 | @@ -7127,6 +7127,7 @@ static void mvpp2_set_rx_mode(struct net_device *dev) | ||
3927 | int id = port->id; | ||
3928 | bool allmulti = dev->flags & IFF_ALLMULTI; | ||
3929 | |||
3930 | +retry: | ||
3931 | mvpp2_prs_mac_promisc_set(priv, id, dev->flags & IFF_PROMISC); | ||
3932 | mvpp2_prs_mac_multi_set(priv, id, MVPP2_PE_MAC_MC_ALL, allmulti); | ||
3933 | mvpp2_prs_mac_multi_set(priv, id, MVPP2_PE_MAC_MC_IP6, allmulti); | ||
3934 | @@ -7134,9 +7135,13 @@ static void mvpp2_set_rx_mode(struct net_device *dev) | ||
3935 | /* Remove all port->id's mcast enries */ | ||
3936 | mvpp2_prs_mcast_del_all(priv, id); | ||
3937 | |||
3938 | - if (allmulti && !netdev_mc_empty(dev)) { | ||
3939 | - netdev_for_each_mc_addr(ha, dev) | ||
3940 | - mvpp2_prs_mac_da_accept(priv, id, ha->addr, true); | ||
3941 | + if (!allmulti) { | ||
3942 | + netdev_for_each_mc_addr(ha, dev) { | ||
3943 | + if (mvpp2_prs_mac_da_accept(priv, id, ha->addr, true)) { | ||
3944 | + allmulti = true; | ||
3945 | + goto retry; | ||
3946 | + } | ||
3947 | + } | ||
3948 | } | ||
3949 | } | ||
3950 | |||
3951 | diff --git a/drivers/net/ethernet/mellanox/mlx4/qp.c b/drivers/net/ethernet/mellanox/mlx4/qp.c | ||
3952 | index 769598f7b6c8..3aaf4bad6c5a 100644 | ||
3953 | --- a/drivers/net/ethernet/mellanox/mlx4/qp.c | ||
3954 | +++ b/drivers/net/ethernet/mellanox/mlx4/qp.c | ||
3955 | @@ -287,6 +287,9 @@ void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt) | ||
3956 | u64 in_param = 0; | ||
3957 | int err; | ||
3958 | |||
3959 | + if (!cnt) | ||
3960 | + return; | ||
3961 | + | ||
3962 | if (mlx4_is_mfunc(dev)) { | ||
3963 | set_param_l(&in_param, base_qpn); | ||
3964 | set_param_h(&in_param, cnt); | ||
3965 | diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c | ||
3966 | index cd314946452c..9511f5fe62f4 100644 | ||
3967 | --- a/drivers/net/wireless/marvell/mwifiex/pcie.c | ||
3968 | +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c | ||
3969 | @@ -2781,7 +2781,10 @@ static void mwifiex_pcie_card_reset_work(struct mwifiex_adapter *adapter) | ||
3970 | { | ||
3971 | struct pcie_service_card *card = adapter->card; | ||
3972 | |||
3973 | - pci_reset_function(card->dev); | ||
3974 | + /* We can't afford to wait here; remove() might be waiting on us. If we | ||
3975 | + * can't grab the device lock, maybe we'll get another chance later. | ||
3976 | + */ | ||
3977 | + pci_try_reset_function(card->dev); | ||
3978 | } | ||
3979 | |||
3980 | static void mwifiex_pcie_work(struct work_struct *work) | ||
3981 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | ||
3982 | index 43e18c4c1e68..999ddd947b2a 100644 | ||
3983 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | ||
3984 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | ||
3985 | @@ -1123,7 +1123,7 @@ static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr) | ||
3986 | } | ||
3987 | if (0 == tmp) { | ||
3988 | read_addr = REG_DBI_RDATA + addr % 4; | ||
3989 | - ret = rtl_read_word(rtlpriv, read_addr); | ||
3990 | + ret = rtl_read_byte(rtlpriv, read_addr); | ||
3991 | } | ||
3992 | return ret; | ||
3993 | } | ||
3994 | @@ -1165,7 +1165,8 @@ static void _rtl8821ae_enable_aspm_back_door(struct ieee80211_hw *hw) | ||
3995 | } | ||
3996 | |||
3997 | tmp = _rtl8821ae_dbi_read(rtlpriv, 0x70f); | ||
3998 | - _rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7)); | ||
3999 | + _rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7) | | ||
4000 | + ASPM_L1_LATENCY << 3); | ||
4001 | |||
4002 | tmp = _rtl8821ae_dbi_read(rtlpriv, 0x719); | ||
4003 | _rtl8821ae_dbi_write(rtlpriv, 0x719, tmp | BIT(3) | BIT(4)); | ||
4004 | diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h | ||
4005 | index 92d4859ec906..2a37125b2ef5 100644 | ||
4006 | --- a/drivers/net/wireless/realtek/rtlwifi/wifi.h | ||
4007 | +++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h | ||
4008 | @@ -99,6 +99,7 @@ | ||
4009 | #define RTL_USB_MAX_RX_COUNT 100 | ||
4010 | #define QBSS_LOAD_SIZE 5 | ||
4011 | #define MAX_WMMELE_LENGTH 64 | ||
4012 | +#define ASPM_L1_LATENCY 7 | ||
4013 | |||
4014 | #define TOTAL_CAM_ENTRY 32 | ||
4015 | |||
4016 | diff --git a/drivers/pci/dwc/pci-keystone.c b/drivers/pci/dwc/pci-keystone.c | ||
4017 | index 5bee3af47588..39405598b22d 100644 | ||
4018 | --- a/drivers/pci/dwc/pci-keystone.c | ||
4019 | +++ b/drivers/pci/dwc/pci-keystone.c | ||
4020 | @@ -178,7 +178,7 @@ static int ks_pcie_get_irq_controller_info(struct keystone_pcie *ks_pcie, | ||
4021 | } | ||
4022 | |||
4023 | /* interrupt controller is in a child node */ | ||
4024 | - *np_temp = of_find_node_by_name(np_pcie, controller); | ||
4025 | + *np_temp = of_get_child_by_name(np_pcie, controller); | ||
4026 | if (!(*np_temp)) { | ||
4027 | dev_err(dev, "Node for %s is absent\n", controller); | ||
4028 | return -EINVAL; | ||
4029 | @@ -187,6 +187,7 @@ static int ks_pcie_get_irq_controller_info(struct keystone_pcie *ks_pcie, | ||
4030 | temp = of_irq_count(*np_temp); | ||
4031 | if (!temp) { | ||
4032 | dev_err(dev, "No IRQ entries in %s\n", controller); | ||
4033 | + of_node_put(*np_temp); | ||
4034 | return -EINVAL; | ||
4035 | } | ||
4036 | |||
4037 | @@ -204,6 +205,8 @@ static int ks_pcie_get_irq_controller_info(struct keystone_pcie *ks_pcie, | ||
4038 | break; | ||
4039 | } | ||
4040 | |||
4041 | + of_node_put(*np_temp); | ||
4042 | + | ||
4043 | if (temp) { | ||
4044 | *num_irqs = temp; | ||
4045 | return 0; | ||
4046 | diff --git a/drivers/pci/host/pcie-iproc-platform.c b/drivers/pci/host/pcie-iproc-platform.c | ||
4047 | index a5073a921a04..32228d41f746 100644 | ||
4048 | --- a/drivers/pci/host/pcie-iproc-platform.c | ||
4049 | +++ b/drivers/pci/host/pcie-iproc-platform.c | ||
4050 | @@ -92,6 +92,13 @@ static int iproc_pcie_pltfm_probe(struct platform_device *pdev) | ||
4051 | pcie->need_ob_cfg = true; | ||
4052 | } | ||
4053 | |||
4054 | + /* | ||
4055 | + * DT nodes are not used by all platforms that use the iProc PCIe | ||
4056 | + * core driver. For platforms that require explict inbound mapping | ||
4057 | + * configuration, "dma-ranges" would have been present in DT | ||
4058 | + */ | ||
4059 | + pcie->need_ib_cfg = of_property_read_bool(np, "dma-ranges"); | ||
4060 | + | ||
4061 | /* PHY use is optional */ | ||
4062 | pcie->phy = devm_phy_get(dev, "pcie-phy"); | ||
4063 | if (IS_ERR(pcie->phy)) { | ||
4064 | diff --git a/drivers/pci/host/pcie-iproc.c b/drivers/pci/host/pcie-iproc.c | ||
4065 | index 935909bbe5c4..75836067f538 100644 | ||
4066 | --- a/drivers/pci/host/pcie-iproc.c | ||
4067 | +++ b/drivers/pci/host/pcie-iproc.c | ||
4068 | @@ -1378,9 +1378,11 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res) | ||
4069 | } | ||
4070 | } | ||
4071 | |||
4072 | - ret = iproc_pcie_map_dma_ranges(pcie); | ||
4073 | - if (ret && ret != -ENOENT) | ||
4074 | - goto err_power_off_phy; | ||
4075 | + if (pcie->need_ib_cfg) { | ||
4076 | + ret = iproc_pcie_map_dma_ranges(pcie); | ||
4077 | + if (ret && ret != -ENOENT) | ||
4078 | + goto err_power_off_phy; | ||
4079 | + } | ||
4080 | |||
4081 | #ifdef CONFIG_ARM | ||
4082 | pcie->sysdata.private_data = pcie; | ||
4083 | diff --git a/drivers/pci/host/pcie-iproc.h b/drivers/pci/host/pcie-iproc.h | ||
4084 | index a6b55cec9a66..4ac6282f2bfd 100644 | ||
4085 | --- a/drivers/pci/host/pcie-iproc.h | ||
4086 | +++ b/drivers/pci/host/pcie-iproc.h | ||
4087 | @@ -74,6 +74,7 @@ struct iproc_msi; | ||
4088 | * @ob: outbound mapping related parameters | ||
4089 | * @ob_map: outbound mapping related parameters specific to the controller | ||
4090 | * | ||
4091 | + * @need_ib_cfg: indicates SW needs to configure the inbound mapping window | ||
4092 | * @ib: inbound mapping related parameters | ||
4093 | * @ib_map: outbound mapping region related parameters | ||
4094 | * | ||
4095 | @@ -101,6 +102,7 @@ struct iproc_pcie { | ||
4096 | struct iproc_pcie_ob ob; | ||
4097 | const struct iproc_pcie_ob_map *ob_map; | ||
4098 | |||
4099 | + bool need_ib_cfg; | ||
4100 | struct iproc_pcie_ib ib; | ||
4101 | const struct iproc_pcie_ib_map *ib_map; | ||
4102 | |||
4103 | diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c | ||
4104 | index 7bab0606f1a9..a89d8b990228 100644 | ||
4105 | --- a/drivers/pci/hotplug/pciehp_hpc.c | ||
4106 | +++ b/drivers/pci/hotplug/pciehp_hpc.c | ||
4107 | @@ -848,6 +848,13 @@ struct controller *pcie_init(struct pcie_device *dev) | ||
4108 | if (pdev->hotplug_user_indicators) | ||
4109 | slot_cap &= ~(PCI_EXP_SLTCAP_AIP | PCI_EXP_SLTCAP_PIP); | ||
4110 | |||
4111 | + /* | ||
4112 | + * We assume no Thunderbolt controllers support Command Complete events, | ||
4113 | + * but some controllers falsely claim they do. | ||
4114 | + */ | ||
4115 | + if (pdev->is_thunderbolt) | ||
4116 | + slot_cap |= PCI_EXP_SLTCAP_NCCS; | ||
4117 | + | ||
4118 | ctrl->slot_cap = slot_cap; | ||
4119 | mutex_init(&ctrl->ctrl_lock); | ||
4120 | init_waitqueue_head(&ctrl->queue); | ||
4121 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c | ||
4122 | index 10684b17d0bd..d22750ea7444 100644 | ||
4123 | --- a/drivers/pci/quirks.c | ||
4124 | +++ b/drivers/pci/quirks.c | ||
4125 | @@ -1636,8 +1636,8 @@ static void quirk_pcie_mch(struct pci_dev *pdev) | ||
4126 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7520_MCH, quirk_pcie_mch); | ||
4127 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7320_MCH, quirk_pcie_mch); | ||
4128 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7525_MCH, quirk_pcie_mch); | ||
4129 | -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0x1610, quirk_pcie_mch); | ||
4130 | |||
4131 | +DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_HUAWEI, 0x1610, PCI_CLASS_BRIDGE_PCI, 8, quirk_pcie_mch); | ||
4132 | |||
4133 | /* | ||
4134 | * It's possible for the MSI to get corrupted if shpc and acpi | ||
4135 | diff --git a/drivers/platform/x86/apple-gmux.c b/drivers/platform/x86/apple-gmux.c | ||
4136 | index 623d322447a2..7c4eb86c851e 100644 | ||
4137 | --- a/drivers/platform/x86/apple-gmux.c | ||
4138 | +++ b/drivers/platform/x86/apple-gmux.c | ||
4139 | @@ -24,7 +24,6 @@ | ||
4140 | #include <linux/delay.h> | ||
4141 | #include <linux/pci.h> | ||
4142 | #include <linux/vga_switcheroo.h> | ||
4143 | -#include <linux/vgaarb.h> | ||
4144 | #include <acpi/video.h> | ||
4145 | #include <asm/io.h> | ||
4146 | |||
4147 | @@ -54,7 +53,6 @@ struct apple_gmux_data { | ||
4148 | bool indexed; | ||
4149 | struct mutex index_lock; | ||
4150 | |||
4151 | - struct pci_dev *pdev; | ||
4152 | struct backlight_device *bdev; | ||
4153 | |||
4154 | /* switcheroo data */ | ||
4155 | @@ -599,23 +597,6 @@ static int gmux_resume(struct device *dev) | ||
4156 | return 0; | ||
4157 | } | ||
4158 | |||
4159 | -static struct pci_dev *gmux_get_io_pdev(void) | ||
4160 | -{ | ||
4161 | - struct pci_dev *pdev = NULL; | ||
4162 | - | ||
4163 | - while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev))) { | ||
4164 | - u16 cmd; | ||
4165 | - | ||
4166 | - pci_read_config_word(pdev, PCI_COMMAND, &cmd); | ||
4167 | - if (!(cmd & PCI_COMMAND_IO)) | ||
4168 | - continue; | ||
4169 | - | ||
4170 | - return pdev; | ||
4171 | - } | ||
4172 | - | ||
4173 | - return NULL; | ||
4174 | -} | ||
4175 | - | ||
4176 | static int is_thunderbolt(struct device *dev, void *data) | ||
4177 | { | ||
4178 | return to_pci_dev(dev)->is_thunderbolt; | ||
4179 | @@ -631,7 +612,6 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id) | ||
4180 | int ret = -ENXIO; | ||
4181 | acpi_status status; | ||
4182 | unsigned long long gpe; | ||
4183 | - struct pci_dev *pdev = NULL; | ||
4184 | |||
4185 | if (apple_gmux_data) | ||
4186 | return -EBUSY; | ||
4187 | @@ -682,7 +662,7 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id) | ||
4188 | ver_minor = (version >> 16) & 0xff; | ||
4189 | ver_release = (version >> 8) & 0xff; | ||
4190 | } else { | ||
4191 | - pr_info("gmux device not present or IO disabled\n"); | ||
4192 | + pr_info("gmux device not present\n"); | ||
4193 | ret = -ENODEV; | ||
4194 | goto err_release; | ||
4195 | } | ||
4196 | @@ -690,23 +670,6 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id) | ||
4197 | pr_info("Found gmux version %d.%d.%d [%s]\n", ver_major, ver_minor, | ||
4198 | ver_release, (gmux_data->indexed ? "indexed" : "classic")); | ||
4199 | |||
4200 | - /* | ||
4201 | - * Apple systems with gmux are EFI based and normally don't use | ||
4202 | - * VGA. In addition changing IO+MEM ownership between IGP and dGPU | ||
4203 | - * disables IO/MEM used for backlight control on some systems. | ||
4204 | - * Lock IO+MEM to GPU with active IO to prevent switch. | ||
4205 | - */ | ||
4206 | - pdev = gmux_get_io_pdev(); | ||
4207 | - if (pdev && vga_tryget(pdev, | ||
4208 | - VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM)) { | ||
4209 | - pr_err("IO+MEM vgaarb-locking for PCI:%s failed\n", | ||
4210 | - pci_name(pdev)); | ||
4211 | - ret = -EBUSY; | ||
4212 | - goto err_release; | ||
4213 | - } else if (pdev) | ||
4214 | - pr_info("locked IO for PCI:%s\n", pci_name(pdev)); | ||
4215 | - gmux_data->pdev = pdev; | ||
4216 | - | ||
4217 | memset(&props, 0, sizeof(props)); | ||
4218 | props.type = BACKLIGHT_PLATFORM; | ||
4219 | props.max_brightness = gmux_read32(gmux_data, GMUX_PORT_MAX_BRIGHTNESS); | ||
4220 | @@ -822,10 +785,6 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id) | ||
4221 | err_notify: | ||
4222 | backlight_device_unregister(bdev); | ||
4223 | err_release: | ||
4224 | - if (gmux_data->pdev) | ||
4225 | - vga_put(gmux_data->pdev, | ||
4226 | - VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM); | ||
4227 | - pci_dev_put(pdev); | ||
4228 | release_region(gmux_data->iostart, gmux_data->iolen); | ||
4229 | err_free: | ||
4230 | kfree(gmux_data); | ||
4231 | @@ -845,11 +804,6 @@ static void gmux_remove(struct pnp_dev *pnp) | ||
4232 | &gmux_notify_handler); | ||
4233 | } | ||
4234 | |||
4235 | - if (gmux_data->pdev) { | ||
4236 | - vga_put(gmux_data->pdev, | ||
4237 | - VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM); | ||
4238 | - pci_dev_put(gmux_data->pdev); | ||
4239 | - } | ||
4240 | backlight_device_unregister(gmux_data->bdev); | ||
4241 | |||
4242 | release_region(gmux_data->iostart, gmux_data->iolen); | ||
4243 | diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c | ||
4244 | index daa68acbc900..c0c8945603cb 100644 | ||
4245 | --- a/drivers/platform/x86/wmi.c | ||
4246 | +++ b/drivers/platform/x86/wmi.c | ||
4247 | @@ -933,7 +933,7 @@ static int wmi_dev_probe(struct device *dev) | ||
4248 | goto probe_failure; | ||
4249 | } | ||
4250 | |||
4251 | - buf = kmalloc(strlen(wdriver->driver.name) + 4, GFP_KERNEL); | ||
4252 | + buf = kmalloc(strlen(wdriver->driver.name) + 5, GFP_KERNEL); | ||
4253 | if (!buf) { | ||
4254 | ret = -ENOMEM; | ||
4255 | goto probe_string_failure; | ||
4256 | diff --git a/drivers/rtc/rtc-opal.c b/drivers/rtc/rtc-opal.c | ||
4257 | index e2a946c0e667..304e891e35fc 100644 | ||
4258 | --- a/drivers/rtc/rtc-opal.c | ||
4259 | +++ b/drivers/rtc/rtc-opal.c | ||
4260 | @@ -58,6 +58,7 @@ static void tm_to_opal(struct rtc_time *tm, u32 *y_m_d, u64 *h_m_s_ms) | ||
4261 | static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm) | ||
4262 | { | ||
4263 | long rc = OPAL_BUSY; | ||
4264 | + int retries = 10; | ||
4265 | u32 y_m_d; | ||
4266 | u64 h_m_s_ms; | ||
4267 | __be32 __y_m_d; | ||
4268 | @@ -67,8 +68,11 @@ static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm) | ||
4269 | rc = opal_rtc_read(&__y_m_d, &__h_m_s_ms); | ||
4270 | if (rc == OPAL_BUSY_EVENT) | ||
4271 | opal_poll_events(NULL); | ||
4272 | - else | ||
4273 | + else if (retries-- && (rc == OPAL_HARDWARE | ||
4274 | + || rc == OPAL_INTERNAL_ERROR)) | ||
4275 | msleep(10); | ||
4276 | + else if (rc != OPAL_BUSY && rc != OPAL_BUSY_EVENT) | ||
4277 | + break; | ||
4278 | } | ||
4279 | |||
4280 | if (rc != OPAL_SUCCESS) | ||
4281 | @@ -84,6 +88,7 @@ static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm) | ||
4282 | static int opal_set_rtc_time(struct device *dev, struct rtc_time *tm) | ||
4283 | { | ||
4284 | long rc = OPAL_BUSY; | ||
4285 | + int retries = 10; | ||
4286 | u32 y_m_d = 0; | ||
4287 | u64 h_m_s_ms = 0; | ||
4288 | |||
4289 | @@ -92,8 +97,11 @@ static int opal_set_rtc_time(struct device *dev, struct rtc_time *tm) | ||
4290 | rc = opal_rtc_write(y_m_d, h_m_s_ms); | ||
4291 | if (rc == OPAL_BUSY_EVENT) | ||
4292 | opal_poll_events(NULL); | ||
4293 | - else | ||
4294 | + else if (retries-- && (rc == OPAL_HARDWARE | ||
4295 | + || rc == OPAL_INTERNAL_ERROR)) | ||
4296 | msleep(10); | ||
4297 | + else if (rc != OPAL_BUSY && rc != OPAL_BUSY_EVENT) | ||
4298 | + break; | ||
4299 | } | ||
4300 | |||
4301 | return rc == OPAL_SUCCESS ? 0 : -EIO; | ||
4302 | diff --git a/drivers/scsi/smartpqi/Makefile b/drivers/scsi/smartpqi/Makefile | ||
4303 | index 0f42a225a664..e6b779930230 100644 | ||
4304 | --- a/drivers/scsi/smartpqi/Makefile | ||
4305 | +++ b/drivers/scsi/smartpqi/Makefile | ||
4306 | @@ -1,3 +1,3 @@ | ||
4307 | ccflags-y += -I. | ||
4308 | -obj-m += smartpqi.o | ||
4309 | +obj-$(CONFIG_SCSI_SMARTPQI) += smartpqi.o | ||
4310 | smartpqi-objs := smartpqi_init.o smartpqi_sis.o smartpqi_sas_transport.o | ||
4311 | diff --git a/drivers/target/iscsi/iscsi_target_auth.c b/drivers/target/iscsi/iscsi_target_auth.c | ||
4312 | index f9bc8ec6fb6b..9518ffd8b8ba 100644 | ||
4313 | --- a/drivers/target/iscsi/iscsi_target_auth.c | ||
4314 | +++ b/drivers/target/iscsi/iscsi_target_auth.c | ||
4315 | @@ -421,7 +421,8 @@ static int chap_server_compute_md5( | ||
4316 | auth_ret = 0; | ||
4317 | out: | ||
4318 | kzfree(desc); | ||
4319 | - crypto_free_shash(tfm); | ||
4320 | + if (tfm) | ||
4321 | + crypto_free_shash(tfm); | ||
4322 | kfree(challenge); | ||
4323 | kfree(challenge_binhex); | ||
4324 | return auth_ret; | ||
4325 | diff --git a/drivers/target/iscsi/iscsi_target_nego.c b/drivers/target/iscsi/iscsi_target_nego.c | ||
4326 | index b686e2ce9c0e..8a5e8d17a942 100644 | ||
4327 | --- a/drivers/target/iscsi/iscsi_target_nego.c | ||
4328 | +++ b/drivers/target/iscsi/iscsi_target_nego.c | ||
4329 | @@ -432,6 +432,9 @@ static void iscsi_target_sk_data_ready(struct sock *sk) | ||
4330 | if (test_and_set_bit(LOGIN_FLAGS_READ_ACTIVE, &conn->login_flags)) { | ||
4331 | write_unlock_bh(&sk->sk_callback_lock); | ||
4332 | pr_debug("Got LOGIN_FLAGS_READ_ACTIVE=1, conn: %p >>>>\n", conn); | ||
4333 | + if (iscsi_target_sk_data_ready == conn->orig_data_ready) | ||
4334 | + return; | ||
4335 | + conn->orig_data_ready(sk); | ||
4336 | return; | ||
4337 | } | ||
4338 | |||
4339 | diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig | ||
4340 | index f699abab1787..65812a2f60b4 100644 | ||
4341 | --- a/drivers/usb/Kconfig | ||
4342 | +++ b/drivers/usb/Kconfig | ||
4343 | @@ -19,6 +19,14 @@ config USB_EHCI_BIG_ENDIAN_MMIO | ||
4344 | config USB_EHCI_BIG_ENDIAN_DESC | ||
4345 | bool | ||
4346 | |||
4347 | +config USB_UHCI_BIG_ENDIAN_MMIO | ||
4348 | + bool | ||
4349 | + default y if SPARC_LEON | ||
4350 | + | ||
4351 | +config USB_UHCI_BIG_ENDIAN_DESC | ||
4352 | + bool | ||
4353 | + default y if SPARC_LEON | ||
4354 | + | ||
4355 | menuconfig USB_SUPPORT | ||
4356 | bool "USB support" | ||
4357 | depends on HAS_IOMEM | ||
4358 | diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig | ||
4359 | index b80a94e632af..2763a640359f 100644 | ||
4360 | --- a/drivers/usb/host/Kconfig | ||
4361 | +++ b/drivers/usb/host/Kconfig | ||
4362 | @@ -625,14 +625,6 @@ config USB_UHCI_ASPEED | ||
4363 | bool | ||
4364 | default y if ARCH_ASPEED | ||
4365 | |||
4366 | -config USB_UHCI_BIG_ENDIAN_MMIO | ||
4367 | - bool | ||
4368 | - default y if SPARC_LEON | ||
4369 | - | ||
4370 | -config USB_UHCI_BIG_ENDIAN_DESC | ||
4371 | - bool | ||
4372 | - default y if SPARC_LEON | ||
4373 | - | ||
4374 | config USB_FHCI_HCD | ||
4375 | tristate "Freescale QE USB Host Controller support" | ||
4376 | depends on OF_GPIO && QE_GPIO && QUICC_ENGINE | ||
4377 | diff --git a/drivers/video/console/dummycon.c b/drivers/video/console/dummycon.c | ||
4378 | index 9269d5685239..b90ef96e43d6 100644 | ||
4379 | --- a/drivers/video/console/dummycon.c | ||
4380 | +++ b/drivers/video/console/dummycon.c | ||
4381 | @@ -67,7 +67,6 @@ const struct consw dummy_con = { | ||
4382 | .con_switch = DUMMY, | ||
4383 | .con_blank = DUMMY, | ||
4384 | .con_font_set = DUMMY, | ||
4385 | - .con_font_get = DUMMY, | ||
4386 | .con_font_default = DUMMY, | ||
4387 | .con_font_copy = DUMMY, | ||
4388 | }; | ||
4389 | diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c | ||
4390 | index e06358da4b99..3dee267d7c75 100644 | ||
4391 | --- a/drivers/video/fbdev/atmel_lcdfb.c | ||
4392 | +++ b/drivers/video/fbdev/atmel_lcdfb.c | ||
4393 | @@ -1119,7 +1119,7 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo) | ||
4394 | goto put_display_node; | ||
4395 | } | ||
4396 | |||
4397 | - timings_np = of_find_node_by_name(display_np, "display-timings"); | ||
4398 | + timings_np = of_get_child_by_name(display_np, "display-timings"); | ||
4399 | if (!timings_np) { | ||
4400 | dev_err(dev, "failed to find display-timings node\n"); | ||
4401 | ret = -ENODEV; | ||
4402 | @@ -1140,6 +1140,12 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo) | ||
4403 | fb_add_videomode(&fb_vm, &info->modelist); | ||
4404 | } | ||
4405 | |||
4406 | + /* | ||
4407 | + * FIXME: Make sure we are not referencing any fields in display_np | ||
4408 | + * and timings_np and drop our references to them before returning to | ||
4409 | + * avoid leaking the nodes on probe deferral and driver unbind. | ||
4410 | + */ | ||
4411 | + | ||
4412 | return 0; | ||
4413 | |||
4414 | put_timings_node: | ||
4415 | diff --git a/drivers/video/fbdev/geode/video_gx.c b/drivers/video/fbdev/geode/video_gx.c | ||
4416 | index 6082f653c68a..67773e8bbb95 100644 | ||
4417 | --- a/drivers/video/fbdev/geode/video_gx.c | ||
4418 | +++ b/drivers/video/fbdev/geode/video_gx.c | ||
4419 | @@ -127,7 +127,7 @@ void gx_set_dclk_frequency(struct fb_info *info) | ||
4420 | int timeout = 1000; | ||
4421 | |||
4422 | /* Rev. 1 Geode GXs use a 14 MHz reference clock instead of 48 MHz. */ | ||
4423 | - if (cpu_data(0).x86_mask == 1) { | ||
4424 | + if (cpu_data(0).x86_stepping == 1) { | ||
4425 | pll_table = gx_pll_table_14MHz; | ||
4426 | pll_table_len = ARRAY_SIZE(gx_pll_table_14MHz); | ||
4427 | } else { | ||
4428 | diff --git a/drivers/xen/xenbus/xenbus.h b/drivers/xen/xenbus/xenbus.h | ||
4429 | index 149c5e7efc89..092981171df1 100644 | ||
4430 | --- a/drivers/xen/xenbus/xenbus.h | ||
4431 | +++ b/drivers/xen/xenbus/xenbus.h | ||
4432 | @@ -76,6 +76,7 @@ struct xb_req_data { | ||
4433 | struct list_head list; | ||
4434 | wait_queue_head_t wq; | ||
4435 | struct xsd_sockmsg msg; | ||
4436 | + uint32_t caller_req_id; | ||
4437 | enum xsd_sockmsg_type type; | ||
4438 | char *body; | ||
4439 | const struct kvec *vec; | ||
4440 | diff --git a/drivers/xen/xenbus/xenbus_comms.c b/drivers/xen/xenbus/xenbus_comms.c | ||
4441 | index 5b081a01779d..d239fc3c5e3d 100644 | ||
4442 | --- a/drivers/xen/xenbus/xenbus_comms.c | ||
4443 | +++ b/drivers/xen/xenbus/xenbus_comms.c | ||
4444 | @@ -309,6 +309,7 @@ static int process_msg(void) | ||
4445 | goto out; | ||
4446 | |||
4447 | if (req->state == xb_req_state_wait_reply) { | ||
4448 | + req->msg.req_id = req->caller_req_id; | ||
4449 | req->msg.type = state.msg.type; | ||
4450 | req->msg.len = state.msg.len; | ||
4451 | req->body = state.body; | ||
4452 | diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c | ||
4453 | index 3e59590c7254..3f3b29398ab8 100644 | ||
4454 | --- a/drivers/xen/xenbus/xenbus_xs.c | ||
4455 | +++ b/drivers/xen/xenbus/xenbus_xs.c | ||
4456 | @@ -227,6 +227,8 @@ static void xs_send(struct xb_req_data *req, struct xsd_sockmsg *msg) | ||
4457 | req->state = xb_req_state_queued; | ||
4458 | init_waitqueue_head(&req->wq); | ||
4459 | |||
4460 | + /* Save the caller req_id and restore it later in the reply */ | ||
4461 | + req->caller_req_id = req->msg.req_id; | ||
4462 | req->msg.req_id = xs_request_enter(req); | ||
4463 | |||
4464 | mutex_lock(&xb_write_mutex); | ||
4465 | @@ -310,6 +312,7 @@ static void *xs_talkv(struct xenbus_transaction t, | ||
4466 | req->num_vecs = num_vecs; | ||
4467 | req->cb = xs_wake_up; | ||
4468 | |||
4469 | + msg.req_id = 0; | ||
4470 | msg.tx_id = t.id; | ||
4471 | msg.type = type; | ||
4472 | msg.len = 0; | ||
4473 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c | ||
4474 | index 0f57602092cf..c04183cc2117 100644 | ||
4475 | --- a/fs/btrfs/inode.c | ||
4476 | +++ b/fs/btrfs/inode.c | ||
4477 | @@ -1330,8 +1330,11 @@ static noinline int run_delalloc_nocow(struct inode *inode, | ||
4478 | leaf = path->nodes[0]; | ||
4479 | if (path->slots[0] >= btrfs_header_nritems(leaf)) { | ||
4480 | ret = btrfs_next_leaf(root, path); | ||
4481 | - if (ret < 0) | ||
4482 | + if (ret < 0) { | ||
4483 | + if (cow_start != (u64)-1) | ||
4484 | + cur_offset = cow_start; | ||
4485 | goto error; | ||
4486 | + } | ||
4487 | if (ret > 0) | ||
4488 | break; | ||
4489 | leaf = path->nodes[0]; | ||
4490 | @@ -3366,6 +3369,11 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, | ||
4491 | ret = btrfs_orphan_reserve_metadata(trans, inode); | ||
4492 | ASSERT(!ret); | ||
4493 | if (ret) { | ||
4494 | + /* | ||
4495 | + * dec doesn't need spin_lock as ->orphan_block_rsv | ||
4496 | + * would be released only if ->orphan_inodes is | ||
4497 | + * zero. | ||
4498 | + */ | ||
4499 | atomic_dec(&root->orphan_inodes); | ||
4500 | clear_bit(BTRFS_INODE_ORPHAN_META_RESERVED, | ||
4501 | &inode->runtime_flags); | ||
4502 | @@ -3380,12 +3388,17 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, | ||
4503 | if (insert >= 1) { | ||
4504 | ret = btrfs_insert_orphan_item(trans, root, btrfs_ino(inode)); | ||
4505 | if (ret) { | ||
4506 | - atomic_dec(&root->orphan_inodes); | ||
4507 | if (reserve) { | ||
4508 | clear_bit(BTRFS_INODE_ORPHAN_META_RESERVED, | ||
4509 | &inode->runtime_flags); | ||
4510 | btrfs_orphan_release_metadata(inode); | ||
4511 | } | ||
4512 | + /* | ||
4513 | + * btrfs_orphan_commit_root may race with us and set | ||
4514 | + * ->orphan_block_rsv to zero, in order to avoid that, | ||
4515 | + * decrease ->orphan_inodes after everything is done. | ||
4516 | + */ | ||
4517 | + atomic_dec(&root->orphan_inodes); | ||
4518 | if (ret != -EEXIST) { | ||
4519 | clear_bit(BTRFS_INODE_HAS_ORPHAN_ITEM, | ||
4520 | &inode->runtime_flags); | ||
4521 | @@ -3417,28 +3430,26 @@ static int btrfs_orphan_del(struct btrfs_trans_handle *trans, | ||
4522 | { | ||
4523 | struct btrfs_root *root = inode->root; | ||
4524 | int delete_item = 0; | ||
4525 | - int release_rsv = 0; | ||
4526 | int ret = 0; | ||
4527 | |||
4528 | - spin_lock(&root->orphan_lock); | ||
4529 | if (test_and_clear_bit(BTRFS_INODE_HAS_ORPHAN_ITEM, | ||
4530 | &inode->runtime_flags)) | ||
4531 | delete_item = 1; | ||
4532 | |||
4533 | + if (delete_item && trans) | ||
4534 | + ret = btrfs_del_orphan_item(trans, root, btrfs_ino(inode)); | ||
4535 | + | ||
4536 | if (test_and_clear_bit(BTRFS_INODE_ORPHAN_META_RESERVED, | ||
4537 | &inode->runtime_flags)) | ||
4538 | - release_rsv = 1; | ||
4539 | - spin_unlock(&root->orphan_lock); | ||
4540 | + btrfs_orphan_release_metadata(inode); | ||
4541 | |||
4542 | - if (delete_item) { | ||
4543 | + /* | ||
4544 | + * btrfs_orphan_commit_root may race with us and set ->orphan_block_rsv | ||
4545 | + * to zero, in order to avoid that, decrease ->orphan_inodes after | ||
4546 | + * everything is done. | ||
4547 | + */ | ||
4548 | + if (delete_item) | ||
4549 | atomic_dec(&root->orphan_inodes); | ||
4550 | - if (trans) | ||
4551 | - ret = btrfs_del_orphan_item(trans, root, | ||
4552 | - btrfs_ino(inode)); | ||
4553 | - } | ||
4554 | - | ||
4555 | - if (release_rsv) | ||
4556 | - btrfs_orphan_release_metadata(inode); | ||
4557 | |||
4558 | return ret; | ||
4559 | } | ||
4560 | @@ -5263,7 +5274,7 @@ void btrfs_evict_inode(struct inode *inode) | ||
4561 | trace_btrfs_inode_evict(inode); | ||
4562 | |||
4563 | if (!root) { | ||
4564 | - kmem_cache_free(btrfs_inode_cachep, BTRFS_I(inode)); | ||
4565 | + clear_inode(inode); | ||
4566 | return; | ||
4567 | } | ||
4568 | |||
4569 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c | ||
4570 | index 7bf9b31561db..b5e1afb30f36 100644 | ||
4571 | --- a/fs/btrfs/tree-log.c | ||
4572 | +++ b/fs/btrfs/tree-log.c | ||
4573 | @@ -28,6 +28,7 @@ | ||
4574 | #include "hash.h" | ||
4575 | #include "compression.h" | ||
4576 | #include "qgroup.h" | ||
4577 | +#include "inode-map.h" | ||
4578 | |||
4579 | /* magic values for the inode_only field in btrfs_log_inode: | ||
4580 | * | ||
4581 | @@ -2494,6 +2495,9 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans, | ||
4582 | clean_tree_block(fs_info, next); | ||
4583 | btrfs_wait_tree_block_writeback(next); | ||
4584 | btrfs_tree_unlock(next); | ||
4585 | + } else { | ||
4586 | + if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags)) | ||
4587 | + clear_extent_buffer_dirty(next); | ||
4588 | } | ||
4589 | |||
4590 | WARN_ON(root_owner != | ||
4591 | @@ -2574,6 +2578,9 @@ static noinline int walk_up_log_tree(struct btrfs_trans_handle *trans, | ||
4592 | clean_tree_block(fs_info, next); | ||
4593 | btrfs_wait_tree_block_writeback(next); | ||
4594 | btrfs_tree_unlock(next); | ||
4595 | + } else { | ||
4596 | + if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags)) | ||
4597 | + clear_extent_buffer_dirty(next); | ||
4598 | } | ||
4599 | |||
4600 | WARN_ON(root_owner != BTRFS_TREE_LOG_OBJECTID); | ||
4601 | @@ -2652,6 +2659,9 @@ static int walk_log_tree(struct btrfs_trans_handle *trans, | ||
4602 | clean_tree_block(fs_info, next); | ||
4603 | btrfs_wait_tree_block_writeback(next); | ||
4604 | btrfs_tree_unlock(next); | ||
4605 | + } else { | ||
4606 | + if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &next->bflags)) | ||
4607 | + clear_extent_buffer_dirty(next); | ||
4608 | } | ||
4609 | |||
4610 | WARN_ON(log->root_key.objectid != | ||
4611 | @@ -3040,13 +3050,14 @@ static void free_log_tree(struct btrfs_trans_handle *trans, | ||
4612 | |||
4613 | while (1) { | ||
4614 | ret = find_first_extent_bit(&log->dirty_log_pages, | ||
4615 | - 0, &start, &end, EXTENT_DIRTY | EXTENT_NEW, | ||
4616 | + 0, &start, &end, | ||
4617 | + EXTENT_DIRTY | EXTENT_NEW | EXTENT_NEED_WAIT, | ||
4618 | NULL); | ||
4619 | if (ret) | ||
4620 | break; | ||
4621 | |||
4622 | clear_extent_bits(&log->dirty_log_pages, start, end, | ||
4623 | - EXTENT_DIRTY | EXTENT_NEW); | ||
4624 | + EXTENT_DIRTY | EXTENT_NEW | EXTENT_NEED_WAIT); | ||
4625 | } | ||
4626 | |||
4627 | /* | ||
4628 | @@ -5705,6 +5716,23 @@ int btrfs_recover_log_trees(struct btrfs_root *log_root_tree) | ||
4629 | path); | ||
4630 | } | ||
4631 | |||
4632 | + if (!ret && wc.stage == LOG_WALK_REPLAY_ALL) { | ||
4633 | + struct btrfs_root *root = wc.replay_dest; | ||
4634 | + | ||
4635 | + btrfs_release_path(path); | ||
4636 | + | ||
4637 | + /* | ||
4638 | + * We have just replayed everything, and the highest | ||
4639 | + * objectid of fs roots probably has changed in case | ||
4640 | + * some inode_item's got replayed. | ||
4641 | + * | ||
4642 | + * root->objectid_mutex is not acquired as log replay | ||
4643 | + * could only happen during mount. | ||
4644 | + */ | ||
4645 | + ret = btrfs_find_highest_objectid(root, | ||
4646 | + &root->highest_objectid); | ||
4647 | + } | ||
4648 | + | ||
4649 | key.offset = found_key.offset - 1; | ||
4650 | wc.replay_dest->log_root = NULL; | ||
4651 | free_extent_buffer(log->node); | ||
4652 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
4653 | index 534a9130f625..4c2f8b57bdc7 100644 | ||
4654 | --- a/fs/ext4/inode.c | ||
4655 | +++ b/fs/ext4/inode.c | ||
4656 | @@ -3767,10 +3767,18 @@ static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter) | ||
4657 | /* Credits for sb + inode write */ | ||
4658 | handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); | ||
4659 | if (IS_ERR(handle)) { | ||
4660 | - /* This is really bad luck. We've written the data | ||
4661 | - * but cannot extend i_size. Bail out and pretend | ||
4662 | - * the write failed... */ | ||
4663 | - ret = PTR_ERR(handle); | ||
4664 | + /* | ||
4665 | + * We wrote the data but cannot extend | ||
4666 | + * i_size. Bail out. In async io case, we do | ||
4667 | + * not return error here because we have | ||
4668 | + * already submmitted the corresponding | ||
4669 | + * bio. Returning error here makes the caller | ||
4670 | + * think that this IO is done and failed | ||
4671 | + * resulting in race with bio's completion | ||
4672 | + * handler. | ||
4673 | + */ | ||
4674 | + if (!ret) | ||
4675 | + ret = PTR_ERR(handle); | ||
4676 | if (inode->i_nlink) | ||
4677 | ext4_orphan_del(NULL, inode); | ||
4678 | |||
4679 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
4680 | index 7c46693a14d7..71594382e195 100644 | ||
4681 | --- a/fs/ext4/super.c | ||
4682 | +++ b/fs/ext4/super.c | ||
4683 | @@ -742,6 +742,7 @@ __acquires(bitlock) | ||
4684 | } | ||
4685 | |||
4686 | ext4_unlock_group(sb, grp); | ||
4687 | + ext4_commit_super(sb, 1); | ||
4688 | ext4_handle_error(sb); | ||
4689 | /* | ||
4690 | * We only get here in the ERRORS_RO case; relocking the group | ||
4691 | diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c | ||
4692 | index d5f0d96169c5..8c50d6878aa5 100644 | ||
4693 | --- a/fs/gfs2/bmap.c | ||
4694 | +++ b/fs/gfs2/bmap.c | ||
4695 | @@ -736,7 +736,7 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length, | ||
4696 | __be64 *ptr; | ||
4697 | sector_t lblock; | ||
4698 | sector_t lend; | ||
4699 | - int ret; | ||
4700 | + int ret = 0; | ||
4701 | int eob; | ||
4702 | unsigned int len; | ||
4703 | struct buffer_head *bh; | ||
4704 | @@ -748,12 +748,14 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length, | ||
4705 | goto out; | ||
4706 | } | ||
4707 | |||
4708 | - if ((flags & IOMAP_REPORT) && gfs2_is_stuffed(ip)) { | ||
4709 | - gfs2_stuffed_iomap(inode, iomap); | ||
4710 | - if (pos >= iomap->length) | ||
4711 | - return -ENOENT; | ||
4712 | - ret = 0; | ||
4713 | - goto out; | ||
4714 | + if (gfs2_is_stuffed(ip)) { | ||
4715 | + if (flags & IOMAP_REPORT) { | ||
4716 | + gfs2_stuffed_iomap(inode, iomap); | ||
4717 | + if (pos >= iomap->length) | ||
4718 | + ret = -ENOENT; | ||
4719 | + goto out; | ||
4720 | + } | ||
4721 | + BUG_ON(!(flags & IOMAP_WRITE)); | ||
4722 | } | ||
4723 | |||
4724 | lblock = pos >> inode->i_blkbits; | ||
4725 | @@ -764,7 +766,7 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length, | ||
4726 | iomap->type = IOMAP_HOLE; | ||
4727 | iomap->length = (u64)(lend - lblock) << inode->i_blkbits; | ||
4728 | iomap->flags = IOMAP_F_MERGED; | ||
4729 | - bmap_lock(ip, 0); | ||
4730 | + bmap_lock(ip, flags & IOMAP_WRITE); | ||
4731 | |||
4732 | /* | ||
4733 | * Directory data blocks have a struct gfs2_meta_header header, so the | ||
4734 | @@ -807,27 +809,28 @@ int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length, | ||
4735 | iomap->flags |= IOMAP_F_BOUNDARY; | ||
4736 | iomap->length = (u64)len << inode->i_blkbits; | ||
4737 | |||
4738 | - ret = 0; | ||
4739 | - | ||
4740 | out_release: | ||
4741 | release_metapath(&mp); | ||
4742 | - bmap_unlock(ip, 0); | ||
4743 | + bmap_unlock(ip, flags & IOMAP_WRITE); | ||
4744 | out: | ||
4745 | trace_gfs2_iomap_end(ip, iomap, ret); | ||
4746 | return ret; | ||
4747 | |||
4748 | do_alloc: | ||
4749 | - if (!(flags & IOMAP_WRITE)) { | ||
4750 | - if (pos >= i_size_read(inode)) { | ||
4751 | + if (flags & IOMAP_WRITE) { | ||
4752 | + ret = gfs2_iomap_alloc(inode, iomap, flags, &mp); | ||
4753 | + } else if (flags & IOMAP_REPORT) { | ||
4754 | + loff_t size = i_size_read(inode); | ||
4755 | + if (pos >= size) | ||
4756 | ret = -ENOENT; | ||
4757 | - goto out_release; | ||
4758 | - } | ||
4759 | - ret = 0; | ||
4760 | - iomap->length = hole_size(inode, lblock, &mp); | ||
4761 | - goto out_release; | ||
4762 | + else if (height <= ip->i_height) | ||
4763 | + iomap->length = hole_size(inode, lblock, &mp); | ||
4764 | + else | ||
4765 | + iomap->length = size - pos; | ||
4766 | + } else { | ||
4767 | + if (height <= ip->i_height) | ||
4768 | + iomap->length = hole_size(inode, lblock, &mp); | ||
4769 | } | ||
4770 | - | ||
4771 | - ret = gfs2_iomap_alloc(inode, iomap, flags, &mp); | ||
4772 | goto out_release; | ||
4773 | } | ||
4774 | |||
4775 | diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c | ||
4776 | index 8b08044b3120..c0681814c379 100644 | ||
4777 | --- a/fs/jbd2/transaction.c | ||
4778 | +++ b/fs/jbd2/transaction.c | ||
4779 | @@ -495,8 +495,10 @@ void jbd2_journal_free_reserved(handle_t *handle) | ||
4780 | EXPORT_SYMBOL(jbd2_journal_free_reserved); | ||
4781 | |||
4782 | /** | ||
4783 | - * int jbd2_journal_start_reserved(handle_t *handle) - start reserved handle | ||
4784 | + * int jbd2_journal_start_reserved() - start reserved handle | ||
4785 | * @handle: handle to start | ||
4786 | + * @type: for handle statistics | ||
4787 | + * @line_no: for handle statistics | ||
4788 | * | ||
4789 | * Start handle that has been previously reserved with jbd2_journal_reserve(). | ||
4790 | * This attaches @handle to the running transaction (or creates one if there's | ||
4791 | @@ -626,6 +628,7 @@ int jbd2_journal_extend(handle_t *handle, int nblocks) | ||
4792 | * int jbd2_journal_restart() - restart a handle . | ||
4793 | * @handle: handle to restart | ||
4794 | * @nblocks: nr credits requested | ||
4795 | + * @gfp_mask: memory allocation flags (for start_this_handle) | ||
4796 | * | ||
4797 | * Restart a handle for a multi-transaction filesystem | ||
4798 | * operation. | ||
4799 | diff --git a/fs/mbcache.c b/fs/mbcache.c | ||
4800 | index b8b8b9ced9f8..46b23bb432fe 100644 | ||
4801 | --- a/fs/mbcache.c | ||
4802 | +++ b/fs/mbcache.c | ||
4803 | @@ -94,6 +94,7 @@ int mb_cache_entry_create(struct mb_cache *cache, gfp_t mask, u32 key, | ||
4804 | entry->e_key = key; | ||
4805 | entry->e_value = value; | ||
4806 | entry->e_reusable = reusable; | ||
4807 | + entry->e_referenced = 0; | ||
4808 | head = mb_cache_entry_head(cache, key); | ||
4809 | hlist_bl_lock(head); | ||
4810 | hlist_bl_for_each_entry(dup, dup_node, head, e_hash_list) { | ||
4811 | diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c | ||
4812 | index 4689940a953c..5193218f5889 100644 | ||
4813 | --- a/fs/ocfs2/dlmglue.c | ||
4814 | +++ b/fs/ocfs2/dlmglue.c | ||
4815 | @@ -2486,6 +2486,15 @@ int ocfs2_inode_lock_with_page(struct inode *inode, | ||
4816 | ret = ocfs2_inode_lock_full(inode, ret_bh, ex, OCFS2_LOCK_NONBLOCK); | ||
4817 | if (ret == -EAGAIN) { | ||
4818 | unlock_page(page); | ||
4819 | + /* | ||
4820 | + * If we can't get inode lock immediately, we should not return | ||
4821 | + * directly here, since this will lead to a softlockup problem. | ||
4822 | + * The method is to get a blocking lock and immediately unlock | ||
4823 | + * before returning, this can avoid CPU resource waste due to | ||
4824 | + * lots of retries, and benefits fairness in getting lock. | ||
4825 | + */ | ||
4826 | + if (ocfs2_inode_lock(inode, ret_bh, ex) == 0) | ||
4827 | + ocfs2_inode_unlock(inode, ex); | ||
4828 | ret = AOP_TRUNCATED_PAGE; | ||
4829 | } | ||
4830 | |||
4831 | diff --git a/fs/seq_file.c b/fs/seq_file.c | ||
4832 | index 4be761c1a03d..eea09f6d8830 100644 | ||
4833 | --- a/fs/seq_file.c | ||
4834 | +++ b/fs/seq_file.c | ||
4835 | @@ -181,8 +181,11 @@ ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) | ||
4836 | * if request is to read from zero offset, reset iterator to first | ||
4837 | * record as it might have been already advanced by previous requests | ||
4838 | */ | ||
4839 | - if (*ppos == 0) | ||
4840 | + if (*ppos == 0) { | ||
4841 | m->index = 0; | ||
4842 | + m->version = 0; | ||
4843 | + m->count = 0; | ||
4844 | + } | ||
4845 | |||
4846 | /* Don't assume *ppos is where we left it */ | ||
4847 | if (unlikely(*ppos != m->read_pos)) { | ||
4848 | diff --git a/include/drm/i915_pciids.h b/include/drm/i915_pciids.h | ||
4849 | index 972a25633525..c65e4489006d 100644 | ||
4850 | --- a/include/drm/i915_pciids.h | ||
4851 | +++ b/include/drm/i915_pciids.h | ||
4852 | @@ -392,6 +392,12 @@ | ||
4853 | INTEL_VGA_DEVICE(0x3EA8, info), /* ULT GT3 */ \ | ||
4854 | INTEL_VGA_DEVICE(0x3EA5, info) /* ULT GT3 */ | ||
4855 | |||
4856 | +#define INTEL_CFL_IDS(info) \ | ||
4857 | + INTEL_CFL_S_GT1_IDS(info), \ | ||
4858 | + INTEL_CFL_S_GT2_IDS(info), \ | ||
4859 | + INTEL_CFL_H_GT2_IDS(info), \ | ||
4860 | + INTEL_CFL_U_GT3_IDS(info) | ||
4861 | + | ||
4862 | /* CNL U 2+2 */ | ||
4863 | #define INTEL_CNL_U_GT2_IDS(info) \ | ||
4864 | INTEL_VGA_DEVICE(0x5A52, info), \ | ||
4865 | diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h | ||
4866 | index 631354acfa72..73bc63e0a1c4 100644 | ||
4867 | --- a/include/linux/compiler-gcc.h | ||
4868 | +++ b/include/linux/compiler-gcc.h | ||
4869 | @@ -167,8 +167,6 @@ | ||
4870 | |||
4871 | #if GCC_VERSION >= 40100 | ||
4872 | # define __compiletime_object_size(obj) __builtin_object_size(obj, 0) | ||
4873 | - | ||
4874 | -#define __nostackprotector __attribute__((__optimize__("no-stack-protector"))) | ||
4875 | #endif | ||
4876 | |||
4877 | #if GCC_VERSION >= 40300 | ||
4878 | @@ -196,6 +194,11 @@ | ||
4879 | #endif /* __CHECKER__ */ | ||
4880 | #endif /* GCC_VERSION >= 40300 */ | ||
4881 | |||
4882 | +#if GCC_VERSION >= 40400 | ||
4883 | +#define __optimize(level) __attribute__((__optimize__(level))) | ||
4884 | +#define __nostackprotector __optimize("no-stack-protector") | ||
4885 | +#endif /* GCC_VERSION >= 40400 */ | ||
4886 | + | ||
4887 | #if GCC_VERSION >= 40500 | ||
4888 | |||
4889 | #ifndef __CHECKER__ | ||
4890 | diff --git a/include/linux/compiler.h b/include/linux/compiler.h | ||
4891 | index 52e611ab9a6c..5ff818e9a836 100644 | ||
4892 | --- a/include/linux/compiler.h | ||
4893 | +++ b/include/linux/compiler.h | ||
4894 | @@ -271,6 +271,10 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | ||
4895 | |||
4896 | #endif /* __ASSEMBLY__ */ | ||
4897 | |||
4898 | +#ifndef __optimize | ||
4899 | +# define __optimize(level) | ||
4900 | +#endif | ||
4901 | + | ||
4902 | /* Compile time object size, -1 for unknown */ | ||
4903 | #ifndef __compiletime_object_size | ||
4904 | # define __compiletime_object_size(obj) -1 | ||
4905 | diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h | ||
4906 | index 8f7788d23b57..a6989e02d0a0 100644 | ||
4907 | --- a/include/linux/cpuidle.h | ||
4908 | +++ b/include/linux/cpuidle.h | ||
4909 | @@ -225,7 +225,7 @@ static inline void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, | ||
4910 | } | ||
4911 | #endif | ||
4912 | |||
4913 | -#ifdef CONFIG_ARCH_HAS_CPU_RELAX | ||
4914 | +#if defined(CONFIG_CPU_IDLE) && defined(CONFIG_ARCH_HAS_CPU_RELAX) | ||
4915 | void cpuidle_poll_state_init(struct cpuidle_driver *drv); | ||
4916 | #else | ||
4917 | static inline void cpuidle_poll_state_init(struct cpuidle_driver *drv) {} | ||
4918 | diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h | ||
4919 | index 296d1e0ea87b..b708e5169d1d 100644 | ||
4920 | --- a/include/linux/jbd2.h | ||
4921 | +++ b/include/linux/jbd2.h | ||
4922 | @@ -418,26 +418,41 @@ static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh) | ||
4923 | #define JI_WAIT_DATA (1 << __JI_WAIT_DATA) | ||
4924 | |||
4925 | /** | ||
4926 | - * struct jbd_inode is the structure linking inodes in ordered mode | ||
4927 | - * present in a transaction so that we can sync them during commit. | ||
4928 | + * struct jbd_inode - The jbd_inode type is the structure linking inodes in | ||
4929 | + * ordered mode present in a transaction so that we can sync them during commit. | ||
4930 | */ | ||
4931 | struct jbd2_inode { | ||
4932 | - /* Which transaction does this inode belong to? Either the running | ||
4933 | - * transaction or the committing one. [j_list_lock] */ | ||
4934 | + /** | ||
4935 | + * @i_transaction: | ||
4936 | + * | ||
4937 | + * Which transaction does this inode belong to? Either the running | ||
4938 | + * transaction or the committing one. [j_list_lock] | ||
4939 | + */ | ||
4940 | transaction_t *i_transaction; | ||
4941 | |||
4942 | - /* Pointer to the running transaction modifying inode's data in case | ||
4943 | - * there is already a committing transaction touching it. [j_list_lock] */ | ||
4944 | + /** | ||
4945 | + * @i_next_transaction: | ||
4946 | + * | ||
4947 | + * Pointer to the running transaction modifying inode's data in case | ||
4948 | + * there is already a committing transaction touching it. [j_list_lock] | ||
4949 | + */ | ||
4950 | transaction_t *i_next_transaction; | ||
4951 | |||
4952 | - /* List of inodes in the i_transaction [j_list_lock] */ | ||
4953 | + /** | ||
4954 | + * @i_list: List of inodes in the i_transaction [j_list_lock] | ||
4955 | + */ | ||
4956 | struct list_head i_list; | ||
4957 | |||
4958 | - /* VFS inode this inode belongs to [constant during the lifetime | ||
4959 | - * of the structure] */ | ||
4960 | + /** | ||
4961 | + * @i_vfs_inode: | ||
4962 | + * | ||
4963 | + * VFS inode this inode belongs to [constant for lifetime of structure] | ||
4964 | + */ | ||
4965 | struct inode *i_vfs_inode; | ||
4966 | |||
4967 | - /* Flags of inode [j_list_lock] */ | ||
4968 | + /** | ||
4969 | + * @i_flags: Flags of inode [j_list_lock] | ||
4970 | + */ | ||
4971 | unsigned long i_flags; | ||
4972 | }; | ||
4973 | |||
4974 | @@ -447,12 +462,20 @@ struct jbd2_revoke_table_s; | ||
4975 | * struct handle_s - The handle_s type is the concrete type associated with | ||
4976 | * handle_t. | ||
4977 | * @h_transaction: Which compound transaction is this update a part of? | ||
4978 | + * @h_journal: Which journal handle belongs to - used iff h_reserved set. | ||
4979 | + * @h_rsv_handle: Handle reserved for finishing the logical operation. | ||
4980 | * @h_buffer_credits: Number of remaining buffers we are allowed to dirty. | ||
4981 | - * @h_ref: Reference count on this handle | ||
4982 | - * @h_err: Field for caller's use to track errors through large fs operations | ||
4983 | - * @h_sync: flag for sync-on-close | ||
4984 | - * @h_jdata: flag to force data journaling | ||
4985 | - * @h_aborted: flag indicating fatal error on handle | ||
4986 | + * @h_ref: Reference count on this handle. | ||
4987 | + * @h_err: Field for caller's use to track errors through large fs operations. | ||
4988 | + * @h_sync: Flag for sync-on-close. | ||
4989 | + * @h_jdata: Flag to force data journaling. | ||
4990 | + * @h_reserved: Flag for handle for reserved credits. | ||
4991 | + * @h_aborted: Flag indicating fatal error on handle. | ||
4992 | + * @h_type: For handle statistics. | ||
4993 | + * @h_line_no: For handle statistics. | ||
4994 | + * @h_start_jiffies: Handle Start time. | ||
4995 | + * @h_requested_credits: Holds @h_buffer_credits after handle is started. | ||
4996 | + * @saved_alloc_context: Saved context while transaction is open. | ||
4997 | **/ | ||
4998 | |||
4999 | /* Docbook can't yet cope with the bit fields, but will leave the documentation | ||
5000 | @@ -462,32 +485,23 @@ struct jbd2_revoke_table_s; | ||
5001 | struct jbd2_journal_handle | ||
5002 | { | ||
5003 | union { | ||
5004 | - /* Which compound transaction is this update a part of? */ | ||
5005 | transaction_t *h_transaction; | ||
5006 | /* Which journal handle belongs to - used iff h_reserved set */ | ||
5007 | journal_t *h_journal; | ||
5008 | }; | ||
5009 | |||
5010 | - /* Handle reserved for finishing the logical operation */ | ||
5011 | handle_t *h_rsv_handle; | ||
5012 | - | ||
5013 | - /* Number of remaining buffers we are allowed to dirty: */ | ||
5014 | int h_buffer_credits; | ||
5015 | - | ||
5016 | - /* Reference count on this handle */ | ||
5017 | int h_ref; | ||
5018 | - | ||
5019 | - /* Field for caller's use to track errors through large fs */ | ||
5020 | - /* operations */ | ||
5021 | int h_err; | ||
5022 | |||
5023 | /* Flags [no locking] */ | ||
5024 | - unsigned int h_sync: 1; /* sync-on-close */ | ||
5025 | - unsigned int h_jdata: 1; /* force data journaling */ | ||
5026 | - unsigned int h_reserved: 1; /* handle with reserved credits */ | ||
5027 | - unsigned int h_aborted: 1; /* fatal error on handle */ | ||
5028 | - unsigned int h_type: 8; /* for handle statistics */ | ||
5029 | - unsigned int h_line_no: 16; /* for handle statistics */ | ||
5030 | + unsigned int h_sync: 1; | ||
5031 | + unsigned int h_jdata: 1; | ||
5032 | + unsigned int h_reserved: 1; | ||
5033 | + unsigned int h_aborted: 1; | ||
5034 | + unsigned int h_type: 8; | ||
5035 | + unsigned int h_line_no: 16; | ||
5036 | |||
5037 | unsigned long h_start_jiffies; | ||
5038 | unsigned int h_requested_credits; | ||
5039 | @@ -729,228 +743,253 @@ jbd2_time_diff(unsigned long start, unsigned long end) | ||
5040 | /** | ||
5041 | * struct journal_s - The journal_s type is the concrete type associated with | ||
5042 | * journal_t. | ||
5043 | - * @j_flags: General journaling state flags | ||
5044 | - * @j_errno: Is there an outstanding uncleared error on the journal (from a | ||
5045 | - * prior abort)? | ||
5046 | - * @j_sb_buffer: First part of superblock buffer | ||
5047 | - * @j_superblock: Second part of superblock buffer | ||
5048 | - * @j_format_version: Version of the superblock format | ||
5049 | - * @j_state_lock: Protect the various scalars in the journal | ||
5050 | - * @j_barrier_count: Number of processes waiting to create a barrier lock | ||
5051 | - * @j_barrier: The barrier lock itself | ||
5052 | - * @j_running_transaction: The current running transaction.. | ||
5053 | - * @j_committing_transaction: the transaction we are pushing to disk | ||
5054 | - * @j_checkpoint_transactions: a linked circular list of all transactions | ||
5055 | - * waiting for checkpointing | ||
5056 | - * @j_wait_transaction_locked: Wait queue for waiting for a locked transaction | ||
5057 | - * to start committing, or for a barrier lock to be released | ||
5058 | - * @j_wait_done_commit: Wait queue for waiting for commit to complete | ||
5059 | - * @j_wait_commit: Wait queue to trigger commit | ||
5060 | - * @j_wait_updates: Wait queue to wait for updates to complete | ||
5061 | - * @j_wait_reserved: Wait queue to wait for reserved buffer credits to drop | ||
5062 | - * @j_checkpoint_mutex: Mutex for locking against concurrent checkpoints | ||
5063 | - * @j_head: Journal head - identifies the first unused block in the journal | ||
5064 | - * @j_tail: Journal tail - identifies the oldest still-used block in the | ||
5065 | - * journal. | ||
5066 | - * @j_free: Journal free - how many free blocks are there in the journal? | ||
5067 | - * @j_first: The block number of the first usable block | ||
5068 | - * @j_last: The block number one beyond the last usable block | ||
5069 | - * @j_dev: Device where we store the journal | ||
5070 | - * @j_blocksize: blocksize for the location where we store the journal. | ||
5071 | - * @j_blk_offset: starting block offset for into the device where we store the | ||
5072 | - * journal | ||
5073 | - * @j_fs_dev: Device which holds the client fs. For internal journal this will | ||
5074 | - * be equal to j_dev | ||
5075 | - * @j_reserved_credits: Number of buffers reserved from the running transaction | ||
5076 | - * @j_maxlen: Total maximum capacity of the journal region on disk. | ||
5077 | - * @j_list_lock: Protects the buffer lists and internal buffer state. | ||
5078 | - * @j_inode: Optional inode where we store the journal. If present, all journal | ||
5079 | - * block numbers are mapped into this inode via bmap(). | ||
5080 | - * @j_tail_sequence: Sequence number of the oldest transaction in the log | ||
5081 | - * @j_transaction_sequence: Sequence number of the next transaction to grant | ||
5082 | - * @j_commit_sequence: Sequence number of the most recently committed | ||
5083 | - * transaction | ||
5084 | - * @j_commit_request: Sequence number of the most recent transaction wanting | ||
5085 | - * commit | ||
5086 | - * @j_uuid: Uuid of client object. | ||
5087 | - * @j_task: Pointer to the current commit thread for this journal | ||
5088 | - * @j_max_transaction_buffers: Maximum number of metadata buffers to allow in a | ||
5089 | - * single compound commit transaction | ||
5090 | - * @j_commit_interval: What is the maximum transaction lifetime before we begin | ||
5091 | - * a commit? | ||
5092 | - * @j_commit_timer: The timer used to wakeup the commit thread | ||
5093 | - * @j_revoke_lock: Protect the revoke table | ||
5094 | - * @j_revoke: The revoke table - maintains the list of revoked blocks in the | ||
5095 | - * current transaction. | ||
5096 | - * @j_revoke_table: alternate revoke tables for j_revoke | ||
5097 | - * @j_wbuf: array of buffer_heads for jbd2_journal_commit_transaction | ||
5098 | - * @j_wbufsize: maximum number of buffer_heads allowed in j_wbuf, the | ||
5099 | - * number that will fit in j_blocksize | ||
5100 | - * @j_last_sync_writer: most recent pid which did a synchronous write | ||
5101 | - * @j_history_lock: Protect the transactions statistics history | ||
5102 | - * @j_proc_entry: procfs entry for the jbd statistics directory | ||
5103 | - * @j_stats: Overall statistics | ||
5104 | - * @j_private: An opaque pointer to fs-private information. | ||
5105 | - * @j_trans_commit_map: Lockdep entity to track transaction commit dependencies | ||
5106 | */ | ||
5107 | - | ||
5108 | struct journal_s | ||
5109 | { | ||
5110 | - /* General journaling state flags [j_state_lock] */ | ||
5111 | + /** | ||
5112 | + * @j_flags: General journaling state flags [j_state_lock] | ||
5113 | + */ | ||
5114 | unsigned long j_flags; | ||
5115 | |||
5116 | - /* | ||
5117 | + /** | ||
5118 | + * @j_errno: | ||
5119 | + * | ||
5120 | * Is there an outstanding uncleared error on the journal (from a prior | ||
5121 | * abort)? [j_state_lock] | ||
5122 | */ | ||
5123 | int j_errno; | ||
5124 | |||
5125 | - /* The superblock buffer */ | ||
5126 | + /** | ||
5127 | + * @j_sb_buffer: The first part of the superblock buffer. | ||
5128 | + */ | ||
5129 | struct buffer_head *j_sb_buffer; | ||
5130 | + | ||
5131 | + /** | ||
5132 | + * @j_superblock: The second part of the superblock buffer. | ||
5133 | + */ | ||
5134 | journal_superblock_t *j_superblock; | ||
5135 | |||
5136 | - /* Version of the superblock format */ | ||
5137 | + /** | ||
5138 | + * @j_format_version: Version of the superblock format. | ||
5139 | + */ | ||
5140 | int j_format_version; | ||
5141 | |||
5142 | - /* | ||
5143 | - * Protect the various scalars in the journal | ||
5144 | + /** | ||
5145 | + * @j_state_lock: Protect the various scalars in the journal. | ||
5146 | */ | ||
5147 | rwlock_t j_state_lock; | ||
5148 | |||
5149 | - /* | ||
5150 | + /** | ||
5151 | + * @j_barrier_count: | ||
5152 | + * | ||
5153 | * Number of processes waiting to create a barrier lock [j_state_lock] | ||
5154 | */ | ||
5155 | int j_barrier_count; | ||
5156 | |||
5157 | - /* The barrier lock itself */ | ||
5158 | + /** | ||
5159 | + * @j_barrier: The barrier lock itself. | ||
5160 | + */ | ||
5161 | struct mutex j_barrier; | ||
5162 | |||
5163 | - /* | ||
5164 | + /** | ||
5165 | + * @j_running_transaction: | ||
5166 | + * | ||
5167 | * Transactions: The current running transaction... | ||
5168 | * [j_state_lock] [caller holding open handle] | ||
5169 | */ | ||
5170 | transaction_t *j_running_transaction; | ||
5171 | |||
5172 | - /* | ||
5173 | + /** | ||
5174 | + * @j_committing_transaction: | ||
5175 | + * | ||
5176 | * the transaction we are pushing to disk | ||
5177 | * [j_state_lock] [caller holding open handle] | ||
5178 | */ | ||
5179 | transaction_t *j_committing_transaction; | ||
5180 | |||
5181 | - /* | ||
5182 | + /** | ||
5183 | + * @j_checkpoint_transactions: | ||
5184 | + * | ||
5185 | * ... and a linked circular list of all transactions waiting for | ||
5186 | * checkpointing. [j_list_lock] | ||
5187 | */ | ||
5188 | transaction_t *j_checkpoint_transactions; | ||
5189 | |||
5190 | - /* | ||
5191 | + /** | ||
5192 | + * @j_wait_transaction_locked: | ||
5193 | + * | ||
5194 | * Wait queue for waiting for a locked transaction to start committing, | ||
5195 | - * or for a barrier lock to be released | ||
5196 | + * or for a barrier lock to be released. | ||
5197 | */ | ||
5198 | wait_queue_head_t j_wait_transaction_locked; | ||
5199 | |||
5200 | - /* Wait queue for waiting for commit to complete */ | ||
5201 | + /** | ||
5202 | + * @j_wait_done_commit: Wait queue for waiting for commit to complete. | ||
5203 | + */ | ||
5204 | wait_queue_head_t j_wait_done_commit; | ||
5205 | |||
5206 | - /* Wait queue to trigger commit */ | ||
5207 | + /** | ||
5208 | + * @j_wait_commit: Wait queue to trigger commit. | ||
5209 | + */ | ||
5210 | wait_queue_head_t j_wait_commit; | ||
5211 | |||
5212 | - /* Wait queue to wait for updates to complete */ | ||
5213 | + /** | ||
5214 | + * @j_wait_updates: Wait queue to wait for updates to complete. | ||
5215 | + */ | ||
5216 | wait_queue_head_t j_wait_updates; | ||
5217 | |||
5218 | - /* Wait queue to wait for reserved buffer credits to drop */ | ||
5219 | + /** | ||
5220 | + * @j_wait_reserved: | ||
5221 | + * | ||
5222 | + * Wait queue to wait for reserved buffer credits to drop. | ||
5223 | + */ | ||
5224 | wait_queue_head_t j_wait_reserved; | ||
5225 | |||
5226 | - /* Semaphore for locking against concurrent checkpoints */ | ||
5227 | + /** | ||
5228 | + * @j_checkpoint_mutex: | ||
5229 | + * | ||
5230 | + * Semaphore for locking against concurrent checkpoints. | ||
5231 | + */ | ||
5232 | struct mutex j_checkpoint_mutex; | ||
5233 | |||
5234 | - /* | ||
5235 | + /** | ||
5236 | + * @j_chkpt_bhs: | ||
5237 | + * | ||
5238 | * List of buffer heads used by the checkpoint routine. This | ||
5239 | * was moved from jbd2_log_do_checkpoint() to reduce stack | ||
5240 | * usage. Access to this array is controlled by the | ||
5241 | - * j_checkpoint_mutex. [j_checkpoint_mutex] | ||
5242 | + * @j_checkpoint_mutex. [j_checkpoint_mutex] | ||
5243 | */ | ||
5244 | struct buffer_head *j_chkpt_bhs[JBD2_NR_BATCH]; | ||
5245 | - | ||
5246 | - /* | ||
5247 | + | ||
5248 | + /** | ||
5249 | + * @j_head: | ||
5250 | + * | ||
5251 | * Journal head: identifies the first unused block in the journal. | ||
5252 | * [j_state_lock] | ||
5253 | */ | ||
5254 | unsigned long j_head; | ||
5255 | |||
5256 | - /* | ||
5257 | + /** | ||
5258 | + * @j_tail: | ||
5259 | + * | ||
5260 | * Journal tail: identifies the oldest still-used block in the journal. | ||
5261 | * [j_state_lock] | ||
5262 | */ | ||
5263 | unsigned long j_tail; | ||
5264 | |||
5265 | - /* | ||
5266 | + /** | ||
5267 | + * @j_free: | ||
5268 | + * | ||
5269 | * Journal free: how many free blocks are there in the journal? | ||
5270 | * [j_state_lock] | ||
5271 | */ | ||
5272 | unsigned long j_free; | ||
5273 | |||
5274 | - /* | ||
5275 | - * Journal start and end: the block numbers of the first usable block | ||
5276 | - * and one beyond the last usable block in the journal. [j_state_lock] | ||
5277 | + /** | ||
5278 | + * @j_first: | ||
5279 | + * | ||
5280 | + * The block number of the first usable block in the journal | ||
5281 | + * [j_state_lock]. | ||
5282 | */ | ||
5283 | unsigned long j_first; | ||
5284 | + | ||
5285 | + /** | ||
5286 | + * @j_last: | ||
5287 | + * | ||
5288 | + * The block number one beyond the last usable block in the journal | ||
5289 | + * [j_state_lock]. | ||
5290 | + */ | ||
5291 | unsigned long j_last; | ||
5292 | |||
5293 | - /* | ||
5294 | - * Device, blocksize and starting block offset for the location where we | ||
5295 | - * store the journal. | ||
5296 | + /** | ||
5297 | + * @j_dev: Device where we store the journal. | ||
5298 | */ | ||
5299 | struct block_device *j_dev; | ||
5300 | + | ||
5301 | + /** | ||
5302 | + * @j_blocksize: Block size for the location where we store the journal. | ||
5303 | + */ | ||
5304 | int j_blocksize; | ||
5305 | + | ||
5306 | + /** | ||
5307 | + * @j_blk_offset: | ||
5308 | + * | ||
5309 | + * Starting block offset into the device where we store the journal. | ||
5310 | + */ | ||
5311 | unsigned long long j_blk_offset; | ||
5312 | + | ||
5313 | + /** | ||
5314 | + * @j_devname: Journal device name. | ||
5315 | + */ | ||
5316 | char j_devname[BDEVNAME_SIZE+24]; | ||
5317 | |||
5318 | - /* | ||
5319 | + /** | ||
5320 | + * @j_fs_dev: | ||
5321 | + * | ||
5322 | * Device which holds the client fs. For internal journal this will be | ||
5323 | * equal to j_dev. | ||
5324 | */ | ||
5325 | struct block_device *j_fs_dev; | ||
5326 | |||
5327 | - /* Total maximum capacity of the journal region on disk. */ | ||
5328 | + /** | ||
5329 | + * @j_maxlen: Total maximum capacity of the journal region on disk. | ||
5330 | + */ | ||
5331 | unsigned int j_maxlen; | ||
5332 | |||
5333 | - /* Number of buffers reserved from the running transaction */ | ||
5334 | + /** | ||
5335 | + * @j_reserved_credits: | ||
5336 | + * | ||
5337 | + * Number of buffers reserved from the running transaction. | ||
5338 | + */ | ||
5339 | atomic_t j_reserved_credits; | ||
5340 | |||
5341 | - /* | ||
5342 | - * Protects the buffer lists and internal buffer state. | ||
5343 | + /** | ||
5344 | + * @j_list_lock: Protects the buffer lists and internal buffer state. | ||
5345 | */ | ||
5346 | spinlock_t j_list_lock; | ||
5347 | |||
5348 | - /* Optional inode where we store the journal. If present, all */ | ||
5349 | - /* journal block numbers are mapped into this inode via */ | ||
5350 | - /* bmap(). */ | ||
5351 | + /** | ||
5352 | + * @j_inode: | ||
5353 | + * | ||
5354 | + * Optional inode where we store the journal. If present, all | ||
5355 | + * journal block numbers are mapped into this inode via bmap(). | ||
5356 | + */ | ||
5357 | struct inode *j_inode; | ||
5358 | |||
5359 | - /* | ||
5360 | + /** | ||
5361 | + * @j_tail_sequence: | ||
5362 | + * | ||
5363 | * Sequence number of the oldest transaction in the log [j_state_lock] | ||
5364 | */ | ||
5365 | tid_t j_tail_sequence; | ||
5366 | |||
5367 | - /* | ||
5368 | + /** | ||
5369 | + * @j_transaction_sequence: | ||
5370 | + * | ||
5371 | * Sequence number of the next transaction to grant [j_state_lock] | ||
5372 | */ | ||
5373 | tid_t j_transaction_sequence; | ||
5374 | |||
5375 | - /* | ||
5376 | + /** | ||
5377 | + * @j_commit_sequence: | ||
5378 | + * | ||
5379 | * Sequence number of the most recently committed transaction | ||
5380 | * [j_state_lock]. | ||
5381 | */ | ||
5382 | tid_t j_commit_sequence; | ||
5383 | |||
5384 | - /* | ||
5385 | + /** | ||
5386 | + * @j_commit_request: | ||
5387 | + * | ||
5388 | * Sequence number of the most recent transaction wanting commit | ||
5389 | * [j_state_lock] | ||
5390 | */ | ||
5391 | tid_t j_commit_request; | ||
5392 | |||
5393 | - /* | ||
5394 | + /** | ||
5395 | + * @j_uuid: | ||
5396 | + * | ||
5397 | * Journal uuid: identifies the object (filesystem, LVM volume etc) | ||
5398 | * backed by this journal. This will eventually be replaced by an array | ||
5399 | * of uuids, allowing us to index multiple devices within a single | ||
5400 | @@ -958,85 +997,151 @@ struct journal_s | ||
5401 | */ | ||
5402 | __u8 j_uuid[16]; | ||
5403 | |||
5404 | - /* Pointer to the current commit thread for this journal */ | ||
5405 | + /** | ||
5406 | + * @j_task: Pointer to the current commit thread for this journal. | ||
5407 | + */ | ||
5408 | struct task_struct *j_task; | ||
5409 | |||
5410 | - /* | ||
5411 | + /** | ||
5412 | + * @j_max_transaction_buffers: | ||
5413 | + * | ||
5414 | * Maximum number of metadata buffers to allow in a single compound | ||
5415 | - * commit transaction | ||
5416 | + * commit transaction. | ||
5417 | */ | ||
5418 | int j_max_transaction_buffers; | ||
5419 | |||
5420 | - /* | ||
5421 | + /** | ||
5422 | + * @j_commit_interval: | ||
5423 | + * | ||
5424 | * What is the maximum transaction lifetime before we begin a commit? | ||
5425 | */ | ||
5426 | unsigned long j_commit_interval; | ||
5427 | |||
5428 | - /* The timer used to wakeup the commit thread: */ | ||
5429 | + /** | ||
5430 | + * @j_commit_timer: The timer used to wakeup the commit thread. | ||
5431 | + */ | ||
5432 | struct timer_list j_commit_timer; | ||
5433 | |||
5434 | - /* | ||
5435 | - * The revoke table: maintains the list of revoked blocks in the | ||
5436 | - * current transaction. [j_revoke_lock] | ||
5437 | + /** | ||
5438 | + * @j_revoke_lock: Protect the revoke table. | ||
5439 | */ | ||
5440 | spinlock_t j_revoke_lock; | ||
5441 | + | ||
5442 | + /** | ||
5443 | + * @j_revoke: | ||
5444 | + * | ||
5445 | + * The revoke table - maintains the list of revoked blocks in the | ||
5446 | + * current transaction. | ||
5447 | + */ | ||
5448 | struct jbd2_revoke_table_s *j_revoke; | ||
5449 | + | ||
5450 | + /** | ||
5451 | + * @j_revoke_table: Alternate revoke tables for j_revoke. | ||
5452 | + */ | ||
5453 | struct jbd2_revoke_table_s *j_revoke_table[2]; | ||
5454 | |||
5455 | - /* | ||
5456 | - * array of bhs for jbd2_journal_commit_transaction | ||
5457 | + /** | ||
5458 | + * @j_wbuf: Array of bhs for jbd2_journal_commit_transaction. | ||
5459 | */ | ||
5460 | struct buffer_head **j_wbuf; | ||
5461 | + | ||
5462 | + /** | ||
5463 | + * @j_wbufsize: | ||
5464 | + * | ||
5465 | + * Size of @j_wbuf array. | ||
5466 | + */ | ||
5467 | int j_wbufsize; | ||
5468 | |||
5469 | - /* | ||
5470 | - * this is the pid of hte last person to run a synchronous operation | ||
5471 | - * through the journal | ||
5472 | + /** | ||
5473 | + * @j_last_sync_writer: | ||
5474 | + * | ||
5475 | + * The pid of the last person to run a synchronous operation | ||
5476 | + * through the journal. | ||
5477 | */ | ||
5478 | pid_t j_last_sync_writer; | ||
5479 | |||
5480 | - /* | ||
5481 | - * the average amount of time in nanoseconds it takes to commit a | ||
5482 | + /** | ||
5483 | + * @j_average_commit_time: | ||
5484 | + * | ||
5485 | + * The average amount of time in nanoseconds it takes to commit a | ||
5486 | * transaction to disk. [j_state_lock] | ||
5487 | */ | ||
5488 | u64 j_average_commit_time; | ||
5489 | |||
5490 | - /* | ||
5491 | - * minimum and maximum times that we should wait for | ||
5492 | - * additional filesystem operations to get batched into a | ||
5493 | - * synchronous handle in microseconds | ||
5494 | + /** | ||
5495 | + * @j_min_batch_time: | ||
5496 | + * | ||
5497 | + * Minimum time that we should wait for additional filesystem operations | ||
5498 | + * to get batched into a synchronous handle in microseconds. | ||
5499 | */ | ||
5500 | u32 j_min_batch_time; | ||
5501 | + | ||
5502 | + /** | ||
5503 | + * @j_max_batch_time: | ||
5504 | + * | ||
5505 | + * Maximum time that we should wait for additional filesystem operations | ||
5506 | + * to get batched into a synchronous handle in microseconds. | ||
5507 | + */ | ||
5508 | u32 j_max_batch_time; | ||
5509 | |||
5510 | - /* This function is called when a transaction is closed */ | ||
5511 | + /** | ||
5512 | + * @j_commit_callback: | ||
5513 | + * | ||
5514 | + * This function is called when a transaction is closed. | ||
5515 | + */ | ||
5516 | void (*j_commit_callback)(journal_t *, | ||
5517 | transaction_t *); | ||
5518 | |||
5519 | /* | ||
5520 | * Journal statistics | ||
5521 | */ | ||
5522 | + | ||
5523 | + /** | ||
5524 | + * @j_history_lock: Protect the transactions statistics history. | ||
5525 | + */ | ||
5526 | spinlock_t j_history_lock; | ||
5527 | + | ||
5528 | + /** | ||
5529 | + * @j_proc_entry: procfs entry for the jbd statistics directory. | ||
5530 | + */ | ||
5531 | struct proc_dir_entry *j_proc_entry; | ||
5532 | + | ||
5533 | + /** | ||
5534 | + * @j_stats: Overall statistics. | ||
5535 | + */ | ||
5536 | struct transaction_stats_s j_stats; | ||
5537 | |||
5538 | - /* Failed journal commit ID */ | ||
5539 | + /** | ||
5540 | + * @j_failed_commit: Failed journal commit ID. | ||
5541 | + */ | ||
5542 | unsigned int j_failed_commit; | ||
5543 | |||
5544 | - /* | ||
5545 | + /** | ||
5546 | + * @j_private: | ||
5547 | + * | ||
5548 | * An opaque pointer to fs-private information. ext3 puts its | ||
5549 | - * superblock pointer here | ||
5550 | + * superblock pointer here. | ||
5551 | */ | ||
5552 | void *j_private; | ||
5553 | |||
5554 | - /* Reference to checksum algorithm driver via cryptoapi */ | ||
5555 | + /** | ||
5556 | + * @j_chksum_driver: | ||
5557 | + * | ||
5558 | + * Reference to checksum algorithm driver via cryptoapi. | ||
5559 | + */ | ||
5560 | struct crypto_shash *j_chksum_driver; | ||
5561 | |||
5562 | - /* Precomputed journal UUID checksum for seeding other checksums */ | ||
5563 | + /** | ||
5564 | + * @j_csum_seed: | ||
5565 | + * | ||
5566 | + * Precomputed journal UUID checksum for seeding other checksums. | ||
5567 | + */ | ||
5568 | __u32 j_csum_seed; | ||
5569 | |||
5570 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | ||
5571 | - /* | ||
5572 | + /** | ||
5573 | + * @j_trans_commit_map: | ||
5574 | + * | ||
5575 | * Lockdep entity to track transaction commit dependencies. Handles | ||
5576 | * hold this "lock" for read, when we wait for commit, we acquire the | ||
5577 | * "lock" for writing. This matches the properties of jbd2 journalling | ||
5578 | diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h | ||
5579 | index a0610427e168..b82c4ae92411 100644 | ||
5580 | --- a/include/linux/mlx5/driver.h | ||
5581 | +++ b/include/linux/mlx5/driver.h | ||
5582 | @@ -1238,7 +1238,7 @@ mlx5_get_vector_affinity(struct mlx5_core_dev *dev, int vector) | ||
5583 | int eqn; | ||
5584 | int err; | ||
5585 | |||
5586 | - err = mlx5_vector2eqn(dev, vector, &eqn, &irq); | ||
5587 | + err = mlx5_vector2eqn(dev, MLX5_EQ_VEC_COMP_BASE + vector, &eqn, &irq); | ||
5588 | if (err) | ||
5589 | return NULL; | ||
5590 | |||
5591 | diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h | ||
5592 | index c30b32e3c862..10191c28fc04 100644 | ||
5593 | --- a/include/linux/mm_inline.h | ||
5594 | +++ b/include/linux/mm_inline.h | ||
5595 | @@ -127,10 +127,4 @@ static __always_inline enum lru_list page_lru(struct page *page) | ||
5596 | |||
5597 | #define lru_to_page(head) (list_entry((head)->prev, struct page, lru)) | ||
5598 | |||
5599 | -#ifdef arch_unmap_kpfn | ||
5600 | -extern void arch_unmap_kpfn(unsigned long pfn); | ||
5601 | -#else | ||
5602 | -static __always_inline void arch_unmap_kpfn(unsigned long pfn) { } | ||
5603 | -#endif | ||
5604 | - | ||
5605 | #endif | ||
5606 | diff --git a/include/linux/nospec.h b/include/linux/nospec.h | ||
5607 | index b99bced39ac2..fbc98e2c8228 100644 | ||
5608 | --- a/include/linux/nospec.h | ||
5609 | +++ b/include/linux/nospec.h | ||
5610 | @@ -19,20 +19,6 @@ | ||
5611 | static inline unsigned long array_index_mask_nospec(unsigned long index, | ||
5612 | unsigned long size) | ||
5613 | { | ||
5614 | - /* | ||
5615 | - * Warn developers about inappropriate array_index_nospec() usage. | ||
5616 | - * | ||
5617 | - * Even if the CPU speculates past the WARN_ONCE branch, the | ||
5618 | - * sign bit of @index is taken into account when generating the | ||
5619 | - * mask. | ||
5620 | - * | ||
5621 | - * This warning is compiled out when the compiler can infer that | ||
5622 | - * @index and @size are less than LONG_MAX. | ||
5623 | - */ | ||
5624 | - if (WARN_ONCE(index > LONG_MAX || size > LONG_MAX, | ||
5625 | - "array_index_nospec() limited to range of [0, LONG_MAX]\n")) | ||
5626 | - return 0; | ||
5627 | - | ||
5628 | /* | ||
5629 | * Always calculate and emit the mask even if the compiler | ||
5630 | * thinks the mask is not needed. The compiler does not take | ||
5631 | @@ -43,6 +29,26 @@ static inline unsigned long array_index_mask_nospec(unsigned long index, | ||
5632 | } | ||
5633 | #endif | ||
5634 | |||
5635 | +/* | ||
5636 | + * Warn developers about inappropriate array_index_nospec() usage. | ||
5637 | + * | ||
5638 | + * Even if the CPU speculates past the WARN_ONCE branch, the | ||
5639 | + * sign bit of @index is taken into account when generating the | ||
5640 | + * mask. | ||
5641 | + * | ||
5642 | + * This warning is compiled out when the compiler can infer that | ||
5643 | + * @index and @size are less than LONG_MAX. | ||
5644 | + */ | ||
5645 | +#define array_index_mask_nospec_check(index, size) \ | ||
5646 | +({ \ | ||
5647 | + if (WARN_ONCE(index > LONG_MAX || size > LONG_MAX, \ | ||
5648 | + "array_index_nospec() limited to range of [0, LONG_MAX]\n")) \ | ||
5649 | + _mask = 0; \ | ||
5650 | + else \ | ||
5651 | + _mask = array_index_mask_nospec(index, size); \ | ||
5652 | + _mask; \ | ||
5653 | +}) | ||
5654 | + | ||
5655 | /* | ||
5656 | * array_index_nospec - sanitize an array index after a bounds check | ||
5657 | * | ||
5658 | @@ -61,7 +67,7 @@ static inline unsigned long array_index_mask_nospec(unsigned long index, | ||
5659 | ({ \ | ||
5660 | typeof(index) _i = (index); \ | ||
5661 | typeof(size) _s = (size); \ | ||
5662 | - unsigned long _mask = array_index_mask_nospec(_i, _s); \ | ||
5663 | + unsigned long _mask = array_index_mask_nospec_check(_i, _s); \ | ||
5664 | \ | ||
5665 | BUILD_BUG_ON(sizeof(_i) > sizeof(long)); \ | ||
5666 | BUILD_BUG_ON(sizeof(_s) > sizeof(long)); \ | ||
5667 | diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h | ||
5668 | index fd84cda5ed7c..0d6a110dae7c 100644 | ||
5669 | --- a/include/rdma/ib_verbs.h | ||
5670 | +++ b/include/rdma/ib_verbs.h | ||
5671 | @@ -983,9 +983,9 @@ struct ib_wc { | ||
5672 | u32 invalidate_rkey; | ||
5673 | } ex; | ||
5674 | u32 src_qp; | ||
5675 | + u32 slid; | ||
5676 | int wc_flags; | ||
5677 | u16 pkey_index; | ||
5678 | - u32 slid; | ||
5679 | u8 sl; | ||
5680 | u8 dlid_path_bits; | ||
5681 | u8 port_num; /* valid only for DR SMPs on switches */ | ||
5682 | diff --git a/include/trace/events/xen.h b/include/trace/events/xen.h | ||
5683 | index b8adf05c534e..7dd8f34c37df 100644 | ||
5684 | --- a/include/trace/events/xen.h | ||
5685 | +++ b/include/trace/events/xen.h | ||
5686 | @@ -368,7 +368,7 @@ TRACE_EVENT(xen_mmu_flush_tlb, | ||
5687 | TP_printk("%s", "") | ||
5688 | ); | ||
5689 | |||
5690 | -TRACE_EVENT(xen_mmu_flush_tlb_single, | ||
5691 | +TRACE_EVENT(xen_mmu_flush_tlb_one_user, | ||
5692 | TP_PROTO(unsigned long addr), | ||
5693 | TP_ARGS(addr), | ||
5694 | TP_STRUCT__entry( | ||
5695 | diff --git a/kernel/memremap.c b/kernel/memremap.c | ||
5696 | index 403ab9cdb949..4712ce646e04 100644 | ||
5697 | --- a/kernel/memremap.c | ||
5698 | +++ b/kernel/memremap.c | ||
5699 | @@ -301,7 +301,8 @@ static void devm_memremap_pages_release(struct device *dev, void *data) | ||
5700 | |||
5701 | /* pages are dead and unused, undo the arch mapping */ | ||
5702 | align_start = res->start & ~(SECTION_SIZE - 1); | ||
5703 | - align_size = ALIGN(resource_size(res), SECTION_SIZE); | ||
5704 | + align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE) | ||
5705 | + - align_start; | ||
5706 | |||
5707 | mem_hotplug_begin(); | ||
5708 | arch_remove_memory(align_start, align_size); | ||
5709 | diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c | ||
5710 | index 61e7f0678d33..a764aec3c9a1 100644 | ||
5711 | --- a/kernel/trace/trace_events_filter.c | ||
5712 | +++ b/kernel/trace/trace_events_filter.c | ||
5713 | @@ -400,7 +400,6 @@ enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not) | ||
5714 | for (i = 0; i < len; i++) { | ||
5715 | if (buff[i] == '*') { | ||
5716 | if (!i) { | ||
5717 | - *search = buff + 1; | ||
5718 | type = MATCH_END_ONLY; | ||
5719 | } else if (i == len - 1) { | ||
5720 | if (type == MATCH_END_ONLY) | ||
5721 | @@ -410,14 +409,14 @@ enum regex_type filter_parse_regex(char *buff, int len, char **search, int *not) | ||
5722 | buff[i] = 0; | ||
5723 | break; | ||
5724 | } else { /* pattern continues, use full glob */ | ||
5725 | - type = MATCH_GLOB; | ||
5726 | - break; | ||
5727 | + return MATCH_GLOB; | ||
5728 | } | ||
5729 | } else if (strchr("[?\\", buff[i])) { | ||
5730 | - type = MATCH_GLOB; | ||
5731 | - break; | ||
5732 | + return MATCH_GLOB; | ||
5733 | } | ||
5734 | } | ||
5735 | + if (buff[0] == '*') | ||
5736 | + *search = buff + 1; | ||
5737 | |||
5738 | return type; | ||
5739 | } | ||
5740 | diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c | ||
5741 | index 40592e7b3568..268029ae1be6 100644 | ||
5742 | --- a/kernel/trace/trace_uprobe.c | ||
5743 | +++ b/kernel/trace/trace_uprobe.c | ||
5744 | @@ -608,7 +608,7 @@ static int probes_seq_show(struct seq_file *m, void *v) | ||
5745 | |||
5746 | /* Don't print "0x (null)" when offset is 0 */ | ||
5747 | if (tu->offset) { | ||
5748 | - seq_printf(m, "0x%p", (void *)tu->offset); | ||
5749 | + seq_printf(m, "0x%px", (void *)tu->offset); | ||
5750 | } else { | ||
5751 | switch (sizeof(void *)) { | ||
5752 | case 4: | ||
5753 | diff --git a/lib/swiotlb.c b/lib/swiotlb.c | ||
5754 | index cea19aaf303c..0d7f46fb993a 100644 | ||
5755 | --- a/lib/swiotlb.c | ||
5756 | +++ b/lib/swiotlb.c | ||
5757 | @@ -586,7 +586,7 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, | ||
5758 | |||
5759 | not_found: | ||
5760 | spin_unlock_irqrestore(&io_tlb_lock, flags); | ||
5761 | - if (printk_ratelimit()) | ||
5762 | + if (!(attrs & DMA_ATTR_NO_WARN) && printk_ratelimit()) | ||
5763 | dev_warn(hwdev, "swiotlb buffer is full (sz: %zd bytes)\n", size); | ||
5764 | return SWIOTLB_MAP_ERROR; | ||
5765 | found: | ||
5766 | @@ -713,6 +713,7 @@ void * | ||
5767 | swiotlb_alloc_coherent(struct device *hwdev, size_t size, | ||
5768 | dma_addr_t *dma_handle, gfp_t flags) | ||
5769 | { | ||
5770 | + bool warn = !(flags & __GFP_NOWARN); | ||
5771 | dma_addr_t dev_addr; | ||
5772 | void *ret; | ||
5773 | int order = get_order(size); | ||
5774 | @@ -738,8 +739,8 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size, | ||
5775 | * GFP_DMA memory; fall back on map_single(), which | ||
5776 | * will grab memory from the lowest available address range. | ||
5777 | */ | ||
5778 | - phys_addr_t paddr = map_single(hwdev, 0, size, | ||
5779 | - DMA_FROM_DEVICE, 0); | ||
5780 | + phys_addr_t paddr = map_single(hwdev, 0, size, DMA_FROM_DEVICE, | ||
5781 | + warn ? 0 : DMA_ATTR_NO_WARN); | ||
5782 | if (paddr == SWIOTLB_MAP_ERROR) | ||
5783 | goto err_warn; | ||
5784 | |||
5785 | @@ -769,9 +770,11 @@ swiotlb_alloc_coherent(struct device *hwdev, size_t size, | ||
5786 | return ret; | ||
5787 | |||
5788 | err_warn: | ||
5789 | - pr_warn("swiotlb: coherent allocation failed for device %s size=%zu\n", | ||
5790 | - dev_name(hwdev), size); | ||
5791 | - dump_stack(); | ||
5792 | + if (warn && printk_ratelimit()) { | ||
5793 | + pr_warn("swiotlb: coherent allocation failed for device %s size=%zu\n", | ||
5794 | + dev_name(hwdev), size); | ||
5795 | + dump_stack(); | ||
5796 | + } | ||
5797 | |||
5798 | return NULL; | ||
5799 | } | ||
5800 | diff --git a/mm/memory-failure.c b/mm/memory-failure.c | ||
5801 | index 4acdf393a801..c85fa0038848 100644 | ||
5802 | --- a/mm/memory-failure.c | ||
5803 | +++ b/mm/memory-failure.c | ||
5804 | @@ -1146,8 +1146,6 @@ int memory_failure(unsigned long pfn, int trapno, int flags) | ||
5805 | return 0; | ||
5806 | } | ||
5807 | |||
5808 | - arch_unmap_kpfn(pfn); | ||
5809 | - | ||
5810 | orig_head = hpage = compound_head(p); | ||
5811 | num_poisoned_pages_inc(); | ||
5812 | |||
5813 | diff --git a/mm/memory.c b/mm/memory.c | ||
5814 | index 793004608332..93e51ad41ba3 100644 | ||
5815 | --- a/mm/memory.c | ||
5816 | +++ b/mm/memory.c | ||
5817 | @@ -81,7 +81,7 @@ | ||
5818 | |||
5819 | #include "internal.h" | ||
5820 | |||
5821 | -#ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS | ||
5822 | +#if defined(LAST_CPUPID_NOT_IN_PAGE_FLAGS) && !defined(CONFIG_COMPILE_TEST) | ||
5823 | #warning Unfortunate NUMA and NUMA Balancing config, growing page-frame for last_cpupid. | ||
5824 | #endif | ||
5825 | |||
5826 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
5827 | index 76c9688b6a0a..d23818c5465a 100644 | ||
5828 | --- a/mm/page_alloc.c | ||
5829 | +++ b/mm/page_alloc.c | ||
5830 | @@ -1177,9 +1177,10 @@ static void free_one_page(struct zone *zone, | ||
5831 | } | ||
5832 | |||
5833 | static void __meminit __init_single_page(struct page *page, unsigned long pfn, | ||
5834 | - unsigned long zone, int nid) | ||
5835 | + unsigned long zone, int nid, bool zero) | ||
5836 | { | ||
5837 | - mm_zero_struct_page(page); | ||
5838 | + if (zero) | ||
5839 | + mm_zero_struct_page(page); | ||
5840 | set_page_links(page, zone, nid, pfn); | ||
5841 | init_page_count(page); | ||
5842 | page_mapcount_reset(page); | ||
5843 | @@ -1194,9 +1195,9 @@ static void __meminit __init_single_page(struct page *page, unsigned long pfn, | ||
5844 | } | ||
5845 | |||
5846 | static void __meminit __init_single_pfn(unsigned long pfn, unsigned long zone, | ||
5847 | - int nid) | ||
5848 | + int nid, bool zero) | ||
5849 | { | ||
5850 | - return __init_single_page(pfn_to_page(pfn), pfn, zone, nid); | ||
5851 | + return __init_single_page(pfn_to_page(pfn), pfn, zone, nid, zero); | ||
5852 | } | ||
5853 | |||
5854 | #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT | ||
5855 | @@ -1217,7 +1218,7 @@ static void __meminit init_reserved_page(unsigned long pfn) | ||
5856 | if (pfn >= zone->zone_start_pfn && pfn < zone_end_pfn(zone)) | ||
5857 | break; | ||
5858 | } | ||
5859 | - __init_single_pfn(pfn, zid, nid); | ||
5860 | + __init_single_pfn(pfn, zid, nid, true); | ||
5861 | } | ||
5862 | #else | ||
5863 | static inline void init_reserved_page(unsigned long pfn) | ||
5864 | @@ -1514,7 +1515,7 @@ static unsigned long __init deferred_init_range(int nid, int zid, | ||
5865 | page++; | ||
5866 | else | ||
5867 | page = pfn_to_page(pfn); | ||
5868 | - __init_single_page(page, pfn, zid, nid); | ||
5869 | + __init_single_page(page, pfn, zid, nid, true); | ||
5870 | cond_resched(); | ||
5871 | } | ||
5872 | } | ||
5873 | @@ -5393,15 +5394,20 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, | ||
5874 | * can be created for invalid pages (for alignment) | ||
5875 | * check here not to call set_pageblock_migratetype() against | ||
5876 | * pfn out of zone. | ||
5877 | + * | ||
5878 | + * Please note that MEMMAP_HOTPLUG path doesn't clear memmap | ||
5879 | + * because this is done early in sparse_add_one_section | ||
5880 | */ | ||
5881 | if (!(pfn & (pageblock_nr_pages - 1))) { | ||
5882 | struct page *page = pfn_to_page(pfn); | ||
5883 | |||
5884 | - __init_single_page(page, pfn, zone, nid); | ||
5885 | + __init_single_page(page, pfn, zone, nid, | ||
5886 | + context != MEMMAP_HOTPLUG); | ||
5887 | set_pageblock_migratetype(page, MIGRATE_MOVABLE); | ||
5888 | cond_resched(); | ||
5889 | } else { | ||
5890 | - __init_single_pfn(pfn, zone, nid); | ||
5891 | + __init_single_pfn(pfn, zone, nid, | ||
5892 | + context != MEMMAP_HOTPLUG); | ||
5893 | } | ||
5894 | } | ||
5895 | } | ||
5896 | diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c | ||
5897 | index f3a4efcf1456..3aa5a93ad107 100644 | ||
5898 | --- a/net/9p/trans_virtio.c | ||
5899 | +++ b/net/9p/trans_virtio.c | ||
5900 | @@ -160,7 +160,8 @@ static void req_done(struct virtqueue *vq) | ||
5901 | spin_unlock_irqrestore(&chan->lock, flags); | ||
5902 | /* Wakeup if anyone waiting for VirtIO ring space. */ | ||
5903 | wake_up(chan->vc_wq); | ||
5904 | - p9_client_cb(chan->client, req, REQ_STATUS_RCVD); | ||
5905 | + if (len) | ||
5906 | + p9_client_cb(chan->client, req, REQ_STATUS_RCVD); | ||
5907 | } | ||
5908 | } | ||
5909 | |||
5910 | diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c | ||
5911 | index 8ca9915befc8..aae3565c3a92 100644 | ||
5912 | --- a/net/mpls/af_mpls.c | ||
5913 | +++ b/net/mpls/af_mpls.c | ||
5914 | @@ -8,6 +8,7 @@ | ||
5915 | #include <linux/ipv6.h> | ||
5916 | #include <linux/mpls.h> | ||
5917 | #include <linux/netconf.h> | ||
5918 | +#include <linux/nospec.h> | ||
5919 | #include <linux/vmalloc.h> | ||
5920 | #include <linux/percpu.h> | ||
5921 | #include <net/ip.h> | ||
5922 | @@ -935,24 +936,27 @@ static int mpls_nh_build_multi(struct mpls_route_config *cfg, | ||
5923 | return err; | ||
5924 | } | ||
5925 | |||
5926 | -static bool mpls_label_ok(struct net *net, unsigned int index, | ||
5927 | +static bool mpls_label_ok(struct net *net, unsigned int *index, | ||
5928 | struct netlink_ext_ack *extack) | ||
5929 | { | ||
5930 | + bool is_ok = true; | ||
5931 | + | ||
5932 | /* Reserved labels may not be set */ | ||
5933 | - if (index < MPLS_LABEL_FIRST_UNRESERVED) { | ||
5934 | + if (*index < MPLS_LABEL_FIRST_UNRESERVED) { | ||
5935 | NL_SET_ERR_MSG(extack, | ||
5936 | "Invalid label - must be MPLS_LABEL_FIRST_UNRESERVED or higher"); | ||
5937 | - return false; | ||
5938 | + is_ok = false; | ||
5939 | } | ||
5940 | |||
5941 | /* The full 20 bit range may not be supported. */ | ||
5942 | - if (index >= net->mpls.platform_labels) { | ||
5943 | + if (is_ok && *index >= net->mpls.platform_labels) { | ||
5944 | NL_SET_ERR_MSG(extack, | ||
5945 | "Label >= configured maximum in platform_labels"); | ||
5946 | - return false; | ||
5947 | + is_ok = false; | ||
5948 | } | ||
5949 | |||
5950 | - return true; | ||
5951 | + *index = array_index_nospec(*index, net->mpls.platform_labels); | ||
5952 | + return is_ok; | ||
5953 | } | ||
5954 | |||
5955 | static int mpls_route_add(struct mpls_route_config *cfg, | ||
5956 | @@ -975,7 +979,7 @@ static int mpls_route_add(struct mpls_route_config *cfg, | ||
5957 | index = find_free_label(net); | ||
5958 | } | ||
5959 | |||
5960 | - if (!mpls_label_ok(net, index, extack)) | ||
5961 | + if (!mpls_label_ok(net, &index, extack)) | ||
5962 | goto errout; | ||
5963 | |||
5964 | /* Append makes no sense with mpls */ | ||
5965 | @@ -1052,7 +1056,7 @@ static int mpls_route_del(struct mpls_route_config *cfg, | ||
5966 | |||
5967 | index = cfg->rc_label; | ||
5968 | |||
5969 | - if (!mpls_label_ok(net, index, extack)) | ||
5970 | + if (!mpls_label_ok(net, &index, extack)) | ||
5971 | goto errout; | ||
5972 | |||
5973 | mpls_route_update(net, index, NULL, &cfg->rc_nlinfo); | ||
5974 | @@ -1810,7 +1814,7 @@ static int rtm_to_route_config(struct sk_buff *skb, | ||
5975 | goto errout; | ||
5976 | |||
5977 | if (!mpls_label_ok(cfg->rc_nlinfo.nl_net, | ||
5978 | - cfg->rc_label, extack)) | ||
5979 | + &cfg->rc_label, extack)) | ||
5980 | goto errout; | ||
5981 | break; | ||
5982 | } | ||
5983 | @@ -2137,7 +2141,7 @@ static int mpls_getroute(struct sk_buff *in_skb, struct nlmsghdr *in_nlh, | ||
5984 | goto errout; | ||
5985 | } | ||
5986 | |||
5987 | - if (!mpls_label_ok(net, in_label, extack)) { | ||
5988 | + if (!mpls_label_ok(net, &in_label, extack)) { | ||
5989 | err = -EINVAL; | ||
5990 | goto errout; | ||
5991 | } | ||
5992 | diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c | ||
5993 | index a3f2ab283aeb..852b838d37b3 100644 | ||
5994 | --- a/net/sunrpc/xprtrdma/rpc_rdma.c | ||
5995 | +++ b/net/sunrpc/xprtrdma/rpc_rdma.c | ||
5996 | @@ -143,7 +143,7 @@ static bool rpcrdma_args_inline(struct rpcrdma_xprt *r_xprt, | ||
5997 | if (xdr->page_len) { | ||
5998 | remaining = xdr->page_len; | ||
5999 | offset = offset_in_page(xdr->page_base); | ||
6000 | - count = 0; | ||
6001 | + count = RPCRDMA_MIN_SEND_SGES; | ||
6002 | while (remaining) { | ||
6003 | remaining -= min_t(unsigned int, | ||
6004 | PAGE_SIZE - offset, remaining); | ||
6005 | diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c | ||
6006 | index 8607c029c0dd..8cd7ee4fa0cd 100644 | ||
6007 | --- a/net/sunrpc/xprtrdma/verbs.c | ||
6008 | +++ b/net/sunrpc/xprtrdma/verbs.c | ||
6009 | @@ -509,7 +509,7 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia, | ||
6010 | pr_warn("rpcrdma: HCA provides only %d send SGEs\n", max_sge); | ||
6011 | return -ENOMEM; | ||
6012 | } | ||
6013 | - ia->ri_max_send_sges = max_sge - RPCRDMA_MIN_SEND_SGES; | ||
6014 | + ia->ri_max_send_sges = max_sge; | ||
6015 | |||
6016 | if (ia->ri_device->attrs.max_qp_wr <= RPCRDMA_BACKWARD_WRS) { | ||
6017 | dprintk("RPC: %s: insufficient wqe's available\n", | ||
6018 | @@ -1476,6 +1476,9 @@ __rpcrdma_dma_map_regbuf(struct rpcrdma_ia *ia, struct rpcrdma_regbuf *rb) | ||
6019 | static void | ||
6020 | rpcrdma_dma_unmap_regbuf(struct rpcrdma_regbuf *rb) | ||
6021 | { | ||
6022 | + if (!rb) | ||
6023 | + return; | ||
6024 | + | ||
6025 | if (!rpcrdma_regbuf_is_mapped(rb)) | ||
6026 | return; | ||
6027 | |||
6028 | @@ -1491,9 +1494,6 @@ rpcrdma_dma_unmap_regbuf(struct rpcrdma_regbuf *rb) | ||
6029 | void | ||
6030 | rpcrdma_free_regbuf(struct rpcrdma_regbuf *rb) | ||
6031 | { | ||
6032 | - if (!rb) | ||
6033 | - return; | ||
6034 | - | ||
6035 | rpcrdma_dma_unmap_regbuf(rb); | ||
6036 | kfree(rb); | ||
6037 | } | ||
6038 | diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c | ||
6039 | index d01913404581..a42cbbf2c8d9 100644 | ||
6040 | --- a/sound/core/seq/seq_clientmgr.c | ||
6041 | +++ b/sound/core/seq/seq_clientmgr.c | ||
6042 | @@ -1003,7 +1003,7 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, | ||
6043 | { | ||
6044 | struct snd_seq_client *client = file->private_data; | ||
6045 | int written = 0, len; | ||
6046 | - int err = -EINVAL; | ||
6047 | + int err; | ||
6048 | struct snd_seq_event event; | ||
6049 | |||
6050 | if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT)) | ||
6051 | @@ -1018,11 +1018,15 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, | ||
6052 | |||
6053 | /* allocate the pool now if the pool is not allocated yet */ | ||
6054 | if (client->pool->size > 0 && !snd_seq_write_pool_allocated(client)) { | ||
6055 | - if (snd_seq_pool_init(client->pool) < 0) | ||
6056 | + mutex_lock(&client->ioctl_mutex); | ||
6057 | + err = snd_seq_pool_init(client->pool); | ||
6058 | + mutex_unlock(&client->ioctl_mutex); | ||
6059 | + if (err < 0) | ||
6060 | return -ENOMEM; | ||
6061 | } | ||
6062 | |||
6063 | /* only process whole events */ | ||
6064 | + err = -EINVAL; | ||
6065 | while (count >= sizeof(struct snd_seq_event)) { | ||
6066 | /* Read in the event header from the user */ | ||
6067 | len = sizeof(event); | ||
6068 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
6069 | index 1750e00c5bb4..4ff1f0ca52fc 100644 | ||
6070 | --- a/sound/pci/hda/patch_realtek.c | ||
6071 | +++ b/sound/pci/hda/patch_realtek.c | ||
6072 | @@ -3378,6 +3378,19 @@ static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec, | ||
6073 | spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; | ||
6074 | } | ||
6075 | |||
6076 | +static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec, | ||
6077 | + const struct hda_fixup *fix, | ||
6078 | + int action) | ||
6079 | +{ | ||
6080 | + unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21); | ||
6081 | + unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19); | ||
6082 | + | ||
6083 | + if (cfg_headphone && cfg_headset_mic == 0x411111f0) | ||
6084 | + snd_hda_codec_set_pincfg(codec, 0x19, | ||
6085 | + (cfg_headphone & ~AC_DEFCFG_DEVICE) | | ||
6086 | + (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT)); | ||
6087 | +} | ||
6088 | + | ||
6089 | static void alc269_fixup_hweq(struct hda_codec *codec, | ||
6090 | const struct hda_fixup *fix, int action) | ||
6091 | { | ||
6092 | @@ -4850,6 +4863,28 @@ static void alc_fixup_tpt440_dock(struct hda_codec *codec, | ||
6093 | } | ||
6094 | } | ||
6095 | |||
6096 | +static void alc_fixup_tpt470_dock(struct hda_codec *codec, | ||
6097 | + const struct hda_fixup *fix, int action) | ||
6098 | +{ | ||
6099 | + static const struct hda_pintbl pincfgs[] = { | ||
6100 | + { 0x17, 0x21211010 }, /* dock headphone */ | ||
6101 | + { 0x19, 0x21a11010 }, /* dock mic */ | ||
6102 | + { } | ||
6103 | + }; | ||
6104 | + struct alc_spec *spec = codec->spec; | ||
6105 | + | ||
6106 | + if (action == HDA_FIXUP_ACT_PRE_PROBE) { | ||
6107 | + spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; | ||
6108 | + /* Enable DOCK device */ | ||
6109 | + snd_hda_codec_write(codec, 0x17, 0, | ||
6110 | + AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0); | ||
6111 | + /* Enable DOCK device */ | ||
6112 | + snd_hda_codec_write(codec, 0x19, 0, | ||
6113 | + AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0); | ||
6114 | + snd_hda_apply_pincfgs(codec, pincfgs); | ||
6115 | + } | ||
6116 | +} | ||
6117 | + | ||
6118 | static void alc_shutup_dell_xps13(struct hda_codec *codec) | ||
6119 | { | ||
6120 | struct alc_spec *spec = codec->spec; | ||
6121 | @@ -5229,6 +5264,7 @@ enum { | ||
6122 | ALC269_FIXUP_LIFEBOOK_EXTMIC, | ||
6123 | ALC269_FIXUP_LIFEBOOK_HP_PIN, | ||
6124 | ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT, | ||
6125 | + ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, | ||
6126 | ALC269_FIXUP_AMIC, | ||
6127 | ALC269_FIXUP_DMIC, | ||
6128 | ALC269VB_FIXUP_AMIC, | ||
6129 | @@ -5324,6 +5360,7 @@ enum { | ||
6130 | ALC700_FIXUP_INTEL_REFERENCE, | ||
6131 | ALC274_FIXUP_DELL_BIND_DACS, | ||
6132 | ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, | ||
6133 | + ALC298_FIXUP_TPT470_DOCK, | ||
6134 | }; | ||
6135 | |||
6136 | static const struct hda_fixup alc269_fixups[] = { | ||
6137 | @@ -5434,6 +5471,10 @@ static const struct hda_fixup alc269_fixups[] = { | ||
6138 | .type = HDA_FIXUP_FUNC, | ||
6139 | .v.func = alc269_fixup_pincfg_no_hp_to_lineout, | ||
6140 | }, | ||
6141 | + [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = { | ||
6142 | + .type = HDA_FIXUP_FUNC, | ||
6143 | + .v.func = alc269_fixup_pincfg_U7x7_headset_mic, | ||
6144 | + }, | ||
6145 | [ALC269_FIXUP_AMIC] = { | ||
6146 | .type = HDA_FIXUP_PINS, | ||
6147 | .v.pins = (const struct hda_pintbl[]) { | ||
6148 | @@ -6149,6 +6190,12 @@ static const struct hda_fixup alc269_fixups[] = { | ||
6149 | .chained = true, | ||
6150 | .chain_id = ALC274_FIXUP_DELL_BIND_DACS | ||
6151 | }, | ||
6152 | + [ALC298_FIXUP_TPT470_DOCK] = { | ||
6153 | + .type = HDA_FIXUP_FUNC, | ||
6154 | + .v.func = alc_fixup_tpt470_dock, | ||
6155 | + .chained = true, | ||
6156 | + .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE | ||
6157 | + }, | ||
6158 | }; | ||
6159 | |||
6160 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
6161 | @@ -6199,6 +6246,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
6162 | SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), | ||
6163 | SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER), | ||
6164 | SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), | ||
6165 | + SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), | ||
6166 | + SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), | ||
6167 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
6168 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
6169 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | ||
6170 | @@ -6300,6 +6349,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
6171 | SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT), | ||
6172 | SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN), | ||
6173 | SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN), | ||
6174 | + SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC), | ||
6175 | SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC), | ||
6176 | SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE), | ||
6177 | SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC), | ||
6178 | @@ -6328,8 +6378,16 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
6179 | SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK), | ||
6180 | SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK), | ||
6181 | SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), | ||
6182 | + SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6183 | + SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6184 | SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460), | ||
6185 | SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460), | ||
6186 | + SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK), | ||
6187 | + SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6188 | + SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6189 | + SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6190 | + SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6191 | + SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6192 | SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | ||
6193 | SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | ||
6194 | SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), | ||
6195 | @@ -6350,7 +6408,12 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
6196 | SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460), | ||
6197 | SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460), | ||
6198 | SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460), | ||
6199 | + SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6200 | + SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6201 | + SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6202 | SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | ||
6203 | + SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6204 | + SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||
6205 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), | ||
6206 | SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), | ||
6207 | SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */ | ||
6208 | @@ -6612,6 +6675,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | ||
6209 | {0x12, 0xb7a60130}, | ||
6210 | {0x14, 0x90170110}, | ||
6211 | {0x21, 0x02211020}), | ||
6212 | + SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
6213 | + {0x12, 0x90a60130}, | ||
6214 | + {0x14, 0x90170110}, | ||
6215 | + {0x14, 0x01011020}, | ||
6216 | + {0x21, 0x0221101f}), | ||
6217 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
6218 | ALC256_STANDARD_PINS), | ||
6219 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC, | ||
6220 | @@ -6681,6 +6749,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | ||
6221 | {0x12, 0x90a60120}, | ||
6222 | {0x14, 0x90170110}, | ||
6223 | {0x21, 0x0321101f}), | ||
6224 | + SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
6225 | + {0x12, 0xb7a60130}, | ||
6226 | + {0x14, 0x90170110}, | ||
6227 | + {0x21, 0x04211020}), | ||
6228 | SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1, | ||
6229 | ALC290_STANDARD_PINS, | ||
6230 | {0x15, 0x04211040}, | ||
6231 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c | ||
6232 | index 2b4ceda36291..20b28a5a1456 100644 | ||
6233 | --- a/sound/usb/mixer.c | ||
6234 | +++ b/sound/usb/mixer.c | ||
6235 | @@ -347,17 +347,20 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, | ||
6236 | int validx, int *value_ret) | ||
6237 | { | ||
6238 | struct snd_usb_audio *chip = cval->head.mixer->chip; | ||
6239 | - unsigned char buf[4 + 3 * sizeof(__u32)]; /* enough space for one range */ | ||
6240 | + /* enough space for one range */ | ||
6241 | + unsigned char buf[sizeof(__u16) + 3 * sizeof(__u32)]; | ||
6242 | unsigned char *val; | ||
6243 | - int idx = 0, ret, size; | ||
6244 | + int idx = 0, ret, val_size, size; | ||
6245 | __u8 bRequest; | ||
6246 | |||
6247 | + val_size = uac2_ctl_value_size(cval->val_type); | ||
6248 | + | ||
6249 | if (request == UAC_GET_CUR) { | ||
6250 | bRequest = UAC2_CS_CUR; | ||
6251 | - size = uac2_ctl_value_size(cval->val_type); | ||
6252 | + size = val_size; | ||
6253 | } else { | ||
6254 | bRequest = UAC2_CS_RANGE; | ||
6255 | - size = sizeof(buf); | ||
6256 | + size = sizeof(__u16) + 3 * val_size; | ||
6257 | } | ||
6258 | |||
6259 | memset(buf, 0, sizeof(buf)); | ||
6260 | @@ -390,16 +393,17 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, | ||
6261 | val = buf + sizeof(__u16); | ||
6262 | break; | ||
6263 | case UAC_GET_MAX: | ||
6264 | - val = buf + sizeof(__u16) * 2; | ||
6265 | + val = buf + sizeof(__u16) + val_size; | ||
6266 | break; | ||
6267 | case UAC_GET_RES: | ||
6268 | - val = buf + sizeof(__u16) * 3; | ||
6269 | + val = buf + sizeof(__u16) + val_size * 2; | ||
6270 | break; | ||
6271 | default: | ||
6272 | return -EINVAL; | ||
6273 | } | ||
6274 | |||
6275 | - *value_ret = convert_signed_value(cval, snd_usb_combine_bytes(val, sizeof(__u16))); | ||
6276 | + *value_ret = convert_signed_value(cval, | ||
6277 | + snd_usb_combine_bytes(val, val_size)); | ||
6278 | |||
6279 | return 0; | ||
6280 | } | ||
6281 | diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c | ||
6282 | index b9c9a19f9588..3cbfae6604f9 100644 | ||
6283 | --- a/sound/usb/pcm.c | ||
6284 | +++ b/sound/usb/pcm.c | ||
6285 | @@ -352,6 +352,15 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs, | ||
6286 | ep = 0x86; | ||
6287 | iface = usb_ifnum_to_if(dev, 2); | ||
6288 | |||
6289 | + if (!iface || iface->num_altsetting == 0) | ||
6290 | + return -EINVAL; | ||
6291 | + | ||
6292 | + alts = &iface->altsetting[1]; | ||
6293 | + goto add_sync_ep; | ||
6294 | + case USB_ID(0x1397, 0x0002): | ||
6295 | + ep = 0x81; | ||
6296 | + iface = usb_ifnum_to_if(dev, 1); | ||
6297 | + | ||
6298 | if (!iface || iface->num_altsetting == 0) | ||
6299 | return -EINVAL; | ||
6300 | |||
6301 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
6302 | index a66ef5777887..ea8f3de92fa4 100644 | ||
6303 | --- a/sound/usb/quirks.c | ||
6304 | +++ b/sound/usb/quirks.c | ||
6305 | @@ -1363,8 +1363,11 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, | ||
6306 | return SNDRV_PCM_FMTBIT_DSD_U32_BE; | ||
6307 | break; | ||
6308 | |||
6309 | - /* Amanero Combo384 USB interface with native DSD support */ | ||
6310 | - case USB_ID(0x16d0, 0x071a): | ||
6311 | + /* Amanero Combo384 USB based DACs with native DSD support */ | ||
6312 | + case USB_ID(0x16d0, 0x071a): /* Amanero - Combo384 */ | ||
6313 | + case USB_ID(0x2ab6, 0x0004): /* T+A DAC8DSD-V2.0, MP1000E-V2.0, MP2000R-V2.0, MP2500R-V2.0, MP3100HV-V2.0 */ | ||
6314 | + case USB_ID(0x2ab6, 0x0005): /* T+A USB HD Audio 1 */ | ||
6315 | + case USB_ID(0x2ab6, 0x0006): /* T+A USB HD Audio 2 */ | ||
6316 | if (fp->altsetting == 2) { | ||
6317 | switch (le16_to_cpu(chip->dev->descriptor.bcdDevice)) { | ||
6318 | case 0x199: | ||
6319 | diff --git a/tools/objtool/check.c b/tools/objtool/check.c | ||
6320 | index 2e458eb45586..c7fb5c2392ee 100644 | ||
6321 | --- a/tools/objtool/check.c | ||
6322 | +++ b/tools/objtool/check.c | ||
6323 | @@ -1935,13 +1935,19 @@ static bool ignore_unreachable_insn(struct instruction *insn) | ||
6324 | if (is_kasan_insn(insn) || is_ubsan_insn(insn)) | ||
6325 | return true; | ||
6326 | |||
6327 | - if (insn->type == INSN_JUMP_UNCONDITIONAL && insn->jump_dest) { | ||
6328 | - insn = insn->jump_dest; | ||
6329 | - continue; | ||
6330 | + if (insn->type == INSN_JUMP_UNCONDITIONAL) { | ||
6331 | + if (insn->jump_dest && | ||
6332 | + insn->jump_dest->func == insn->func) { | ||
6333 | + insn = insn->jump_dest; | ||
6334 | + continue; | ||
6335 | + } | ||
6336 | + | ||
6337 | + break; | ||
6338 | } | ||
6339 | |||
6340 | if (insn->offset + insn->len >= insn->func->offset + insn->func->len) | ||
6341 | break; | ||
6342 | + | ||
6343 | insn = list_next_entry(insn, list); | ||
6344 | } | ||
6345 | |||
6346 | diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c | ||
6347 | index 24dbf634e2dd..0b457e8e0f0c 100644 | ||
6348 | --- a/tools/testing/selftests/seccomp/seccomp_bpf.c | ||
6349 | +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c | ||
6350 | @@ -1717,7 +1717,7 @@ void tracer_ptrace(struct __test_metadata *_metadata, pid_t tracee, | ||
6351 | |||
6352 | if (nr == __NR_getpid) | ||
6353 | change_syscall(_metadata, tracee, __NR_getppid); | ||
6354 | - if (nr == __NR_open) | ||
6355 | + if (nr == __NR_openat) | ||
6356 | change_syscall(_metadata, tracee, -1); | ||
6357 | } | ||
6358 | |||
6359 | @@ -1792,7 +1792,7 @@ TEST_F(TRACE_syscall, ptrace_syscall_dropped) | ||
6360 | true); | ||
6361 | |||
6362 | /* Tracer should skip the open syscall, resulting in EPERM. */ | ||
6363 | - EXPECT_SYSCALL_RETURN(EPERM, syscall(__NR_open)); | ||
6364 | + EXPECT_SYSCALL_RETURN(EPERM, syscall(__NR_openat)); | ||
6365 | } | ||
6366 | |||
6367 | TEST_F(TRACE_syscall, syscall_allowed) | ||
6368 | diff --git a/tools/testing/selftests/vm/compaction_test.c b/tools/testing/selftests/vm/compaction_test.c | ||
6369 | index a65b016d4c13..1097f04e4d80 100644 | ||
6370 | --- a/tools/testing/selftests/vm/compaction_test.c | ||
6371 | +++ b/tools/testing/selftests/vm/compaction_test.c | ||
6372 | @@ -137,6 +137,8 @@ int check_compaction(unsigned long mem_free, unsigned int hugepage_size) | ||
6373 | printf("No of huge pages allocated = %d\n", | ||
6374 | (atoi(nr_hugepages))); | ||
6375 | |||
6376 | + lseek(fd, 0, SEEK_SET); | ||
6377 | + | ||
6378 | if (write(fd, initial_nr_hugepages, strlen(initial_nr_hugepages)) | ||
6379 | != strlen(initial_nr_hugepages)) { | ||
6380 | perror("Failed to write value to /proc/sys/vm/nr_hugepages\n"); | ||
6381 | diff --git a/tools/testing/selftests/x86/Makefile b/tools/testing/selftests/x86/Makefile | ||
6382 | index 5d4f10ac2af2..aa6e2d7f6a1f 100644 | ||
6383 | --- a/tools/testing/selftests/x86/Makefile | ||
6384 | +++ b/tools/testing/selftests/x86/Makefile | ||
6385 | @@ -5,16 +5,26 @@ include ../lib.mk | ||
6386 | |||
6387 | .PHONY: all all_32 all_64 warn_32bit_failure clean | ||
6388 | |||
6389 | -TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs syscall_nt ptrace_syscall test_mremap_vdso \ | ||
6390 | - check_initial_reg_state sigreturn ldt_gdt iopl mpx-mini-test ioperm \ | ||
6391 | +UNAME_M := $(shell uname -m) | ||
6392 | +CAN_BUILD_I386 := $(shell ./check_cc.sh $(CC) trivial_32bit_program.c -m32) | ||
6393 | +CAN_BUILD_X86_64 := $(shell ./check_cc.sh $(CC) trivial_64bit_program.c) | ||
6394 | + | ||
6395 | +TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs syscall_nt test_mremap_vdso \ | ||
6396 | + check_initial_reg_state sigreturn iopl mpx-mini-test ioperm \ | ||
6397 | protection_keys test_vdso test_vsyscall | ||
6398 | TARGETS_C_32BIT_ONLY := entry_from_vm86 syscall_arg_fault test_syscall_vdso unwind_vdso \ | ||
6399 | test_FCMOV test_FCOMI test_FISTTP \ | ||
6400 | vdso_restorer | ||
6401 | -TARGETS_C_64BIT_ONLY := fsgsbase sysret_rip 5lvl | ||
6402 | +TARGETS_C_64BIT_ONLY := fsgsbase sysret_rip | ||
6403 | +# Some selftests require 32bit support enabled also on 64bit systems | ||
6404 | +TARGETS_C_32BIT_NEEDED := ldt_gdt ptrace_syscall | ||
6405 | |||
6406 | -TARGETS_C_32BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_32BIT_ONLY) | ||
6407 | +TARGETS_C_32BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_32BIT_ONLY) $(TARGETS_C_32BIT_NEEDED) | ||
6408 | TARGETS_C_64BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_64BIT_ONLY) | ||
6409 | +ifeq ($(CAN_BUILD_I386)$(CAN_BUILD_X86_64),11) | ||
6410 | +TARGETS_C_64BIT_ALL += $(TARGETS_C_32BIT_NEEDED) | ||
6411 | +endif | ||
6412 | + | ||
6413 | BINARIES_32 := $(TARGETS_C_32BIT_ALL:%=%_32) | ||
6414 | BINARIES_64 := $(TARGETS_C_64BIT_ALL:%=%_64) | ||
6415 | |||
6416 | @@ -23,18 +33,16 @@ BINARIES_64 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_64)) | ||
6417 | |||
6418 | CFLAGS := -O2 -g -std=gnu99 -pthread -Wall -no-pie | ||
6419 | |||
6420 | -UNAME_M := $(shell uname -m) | ||
6421 | -CAN_BUILD_I386 := $(shell ./check_cc.sh $(CC) trivial_32bit_program.c -m32) | ||
6422 | -CAN_BUILD_X86_64 := $(shell ./check_cc.sh $(CC) trivial_64bit_program.c) | ||
6423 | - | ||
6424 | ifeq ($(CAN_BUILD_I386),1) | ||
6425 | all: all_32 | ||
6426 | TEST_PROGS += $(BINARIES_32) | ||
6427 | +EXTRA_CFLAGS += -DCAN_BUILD_32 | ||
6428 | endif | ||
6429 | |||
6430 | ifeq ($(CAN_BUILD_X86_64),1) | ||
6431 | all: all_64 | ||
6432 | TEST_PROGS += $(BINARIES_64) | ||
6433 | +EXTRA_CFLAGS += -DCAN_BUILD_64 | ||
6434 | endif | ||
6435 | |||
6436 | all_32: $(BINARIES_32) | ||
6437 | diff --git a/tools/testing/selftests/x86/mpx-mini-test.c b/tools/testing/selftests/x86/mpx-mini-test.c | ||
6438 | index ec0f6b45ce8b..9c0325e1ea68 100644 | ||
6439 | --- a/tools/testing/selftests/x86/mpx-mini-test.c | ||
6440 | +++ b/tools/testing/selftests/x86/mpx-mini-test.c | ||
6441 | @@ -315,11 +315,39 @@ static inline void *__si_bounds_upper(siginfo_t *si) | ||
6442 | return si->si_upper; | ||
6443 | } | ||
6444 | #else | ||
6445 | + | ||
6446 | +/* | ||
6447 | + * This deals with old version of _sigfault in some distros: | ||
6448 | + * | ||
6449 | + | ||
6450 | +old _sigfault: | ||
6451 | + struct { | ||
6452 | + void *si_addr; | ||
6453 | + } _sigfault; | ||
6454 | + | ||
6455 | +new _sigfault: | ||
6456 | + struct { | ||
6457 | + void __user *_addr; | ||
6458 | + int _trapno; | ||
6459 | + short _addr_lsb; | ||
6460 | + union { | ||
6461 | + struct { | ||
6462 | + void __user *_lower; | ||
6463 | + void __user *_upper; | ||
6464 | + } _addr_bnd; | ||
6465 | + __u32 _pkey; | ||
6466 | + }; | ||
6467 | + } _sigfault; | ||
6468 | + * | ||
6469 | + */ | ||
6470 | + | ||
6471 | static inline void **__si_bounds_hack(siginfo_t *si) | ||
6472 | { | ||
6473 | void *sigfault = &si->_sifields._sigfault; | ||
6474 | void *end_sigfault = sigfault + sizeof(si->_sifields._sigfault); | ||
6475 | - void **__si_lower = end_sigfault; | ||
6476 | + int *trapno = (int*)end_sigfault; | ||
6477 | + /* skip _trapno and _addr_lsb */ | ||
6478 | + void **__si_lower = (void**)(trapno + 2); | ||
6479 | |||
6480 | return __si_lower; | ||
6481 | } | ||
6482 | @@ -331,7 +359,7 @@ static inline void *__si_bounds_lower(siginfo_t *si) | ||
6483 | |||
6484 | static inline void *__si_bounds_upper(siginfo_t *si) | ||
6485 | { | ||
6486 | - return (*__si_bounds_hack(si)) + sizeof(void *); | ||
6487 | + return *(__si_bounds_hack(si) + 1); | ||
6488 | } | ||
6489 | #endif | ||
6490 | |||
6491 | diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c | ||
6492 | index bc1b0735bb50..f15aa5a76fe3 100644 | ||
6493 | --- a/tools/testing/selftests/x86/protection_keys.c | ||
6494 | +++ b/tools/testing/selftests/x86/protection_keys.c | ||
6495 | @@ -393,34 +393,6 @@ pid_t fork_lazy_child(void) | ||
6496 | return forkret; | ||
6497 | } | ||
6498 | |||
6499 | -void davecmp(void *_a, void *_b, int len) | ||
6500 | -{ | ||
6501 | - int i; | ||
6502 | - unsigned long *a = _a; | ||
6503 | - unsigned long *b = _b; | ||
6504 | - | ||
6505 | - for (i = 0; i < len / sizeof(*a); i++) { | ||
6506 | - if (a[i] == b[i]) | ||
6507 | - continue; | ||
6508 | - | ||
6509 | - dprintf3("[%3d]: a: %016lx b: %016lx\n", i, a[i], b[i]); | ||
6510 | - } | ||
6511 | -} | ||
6512 | - | ||
6513 | -void dumpit(char *f) | ||
6514 | -{ | ||
6515 | - int fd = open(f, O_RDONLY); | ||
6516 | - char buf[100]; | ||
6517 | - int nr_read; | ||
6518 | - | ||
6519 | - dprintf2("maps fd: %d\n", fd); | ||
6520 | - do { | ||
6521 | - nr_read = read(fd, &buf[0], sizeof(buf)); | ||
6522 | - write(1, buf, nr_read); | ||
6523 | - } while (nr_read > 0); | ||
6524 | - close(fd); | ||
6525 | -} | ||
6526 | - | ||
6527 | #define PKEY_DISABLE_ACCESS 0x1 | ||
6528 | #define PKEY_DISABLE_WRITE 0x2 | ||
6529 | |||
6530 | diff --git a/tools/testing/selftests/x86/single_step_syscall.c b/tools/testing/selftests/x86/single_step_syscall.c | ||
6531 | index a48da95c18fd..ddfdd635de16 100644 | ||
6532 | --- a/tools/testing/selftests/x86/single_step_syscall.c | ||
6533 | +++ b/tools/testing/selftests/x86/single_step_syscall.c | ||
6534 | @@ -119,7 +119,9 @@ static void check_result(void) | ||
6535 | |||
6536 | int main() | ||
6537 | { | ||
6538 | +#ifdef CAN_BUILD_32 | ||
6539 | int tmp; | ||
6540 | +#endif | ||
6541 | |||
6542 | sethandler(SIGTRAP, sigtrap, 0); | ||
6543 | |||
6544 | @@ -139,12 +141,13 @@ int main() | ||
6545 | : : "c" (post_nop) : "r11"); | ||
6546 | check_result(); | ||
6547 | #endif | ||
6548 | - | ||
6549 | +#ifdef CAN_BUILD_32 | ||
6550 | printf("[RUN]\tSet TF and check int80\n"); | ||
6551 | set_eflags(get_eflags() | X86_EFLAGS_TF); | ||
6552 | asm volatile ("int $0x80" : "=a" (tmp) : "a" (SYS_getpid) | ||
6553 | : INT80_CLOBBERS); | ||
6554 | check_result(); | ||
6555 | +#endif | ||
6556 | |||
6557 | /* | ||
6558 | * This test is particularly interesting if fast syscalls use | ||
6559 | diff --git a/tools/testing/selftests/x86/test_mremap_vdso.c b/tools/testing/selftests/x86/test_mremap_vdso.c | ||
6560 | index bf0d687c7db7..64f11c8d9b76 100644 | ||
6561 | --- a/tools/testing/selftests/x86/test_mremap_vdso.c | ||
6562 | +++ b/tools/testing/selftests/x86/test_mremap_vdso.c | ||
6563 | @@ -90,8 +90,12 @@ int main(int argc, char **argv, char **envp) | ||
6564 | vdso_size += PAGE_SIZE; | ||
6565 | } | ||
6566 | |||
6567 | +#ifdef __i386__ | ||
6568 | /* Glibc is likely to explode now - exit with raw syscall */ | ||
6569 | asm volatile ("int $0x80" : : "a" (__NR_exit), "b" (!!ret)); | ||
6570 | +#else /* __x86_64__ */ | ||
6571 | + syscall(SYS_exit, ret); | ||
6572 | +#endif | ||
6573 | } else { | ||
6574 | int status; | ||
6575 | |||
6576 | diff --git a/tools/testing/selftests/x86/test_vdso.c b/tools/testing/selftests/x86/test_vdso.c | ||
6577 | index 29973cde06d3..235259011704 100644 | ||
6578 | --- a/tools/testing/selftests/x86/test_vdso.c | ||
6579 | +++ b/tools/testing/selftests/x86/test_vdso.c | ||
6580 | @@ -26,20 +26,59 @@ | ||
6581 | # endif | ||
6582 | #endif | ||
6583 | |||
6584 | +/* max length of lines in /proc/self/maps - anything longer is skipped here */ | ||
6585 | +#define MAPS_LINE_LEN 128 | ||
6586 | + | ||
6587 | int nerrs = 0; | ||
6588 | |||
6589 | +typedef long (*getcpu_t)(unsigned *, unsigned *, void *); | ||
6590 | + | ||
6591 | +getcpu_t vgetcpu; | ||
6592 | +getcpu_t vdso_getcpu; | ||
6593 | + | ||
6594 | +static void *vsyscall_getcpu(void) | ||
6595 | +{ | ||
6596 | #ifdef __x86_64__ | ||
6597 | -# define VSYS(x) (x) | ||
6598 | + FILE *maps; | ||
6599 | + char line[MAPS_LINE_LEN]; | ||
6600 | + bool found = false; | ||
6601 | + | ||
6602 | + maps = fopen("/proc/self/maps", "r"); | ||
6603 | + if (!maps) /* might still be present, but ignore it here, as we test vDSO not vsyscall */ | ||
6604 | + return NULL; | ||
6605 | + | ||
6606 | + while (fgets(line, MAPS_LINE_LEN, maps)) { | ||
6607 | + char r, x; | ||
6608 | + void *start, *end; | ||
6609 | + char name[MAPS_LINE_LEN]; | ||
6610 | + | ||
6611 | + /* sscanf() is safe here as strlen(name) >= strlen(line) */ | ||
6612 | + if (sscanf(line, "%p-%p %c-%cp %*x %*x:%*x %*u %s", | ||
6613 | + &start, &end, &r, &x, name) != 5) | ||
6614 | + continue; | ||
6615 | + | ||
6616 | + if (strcmp(name, "[vsyscall]")) | ||
6617 | + continue; | ||
6618 | + | ||
6619 | + /* assume entries are OK, as we test vDSO here not vsyscall */ | ||
6620 | + found = true; | ||
6621 | + break; | ||
6622 | + } | ||
6623 | + | ||
6624 | + fclose(maps); | ||
6625 | + | ||
6626 | + if (!found) { | ||
6627 | + printf("Warning: failed to find vsyscall getcpu\n"); | ||
6628 | + return NULL; | ||
6629 | + } | ||
6630 | + return (void *) (0xffffffffff600800); | ||
6631 | #else | ||
6632 | -# define VSYS(x) 0 | ||
6633 | + return NULL; | ||
6634 | #endif | ||
6635 | +} | ||
6636 | |||
6637 | -typedef long (*getcpu_t)(unsigned *, unsigned *, void *); | ||
6638 | - | ||
6639 | -const getcpu_t vgetcpu = (getcpu_t)VSYS(0xffffffffff600800); | ||
6640 | -getcpu_t vdso_getcpu; | ||
6641 | |||
6642 | -void fill_function_pointers() | ||
6643 | +static void fill_function_pointers() | ||
6644 | { | ||
6645 | void *vdso = dlopen("linux-vdso.so.1", | ||
6646 | RTLD_LAZY | RTLD_LOCAL | RTLD_NOLOAD); | ||
6647 | @@ -54,6 +93,8 @@ void fill_function_pointers() | ||
6648 | vdso_getcpu = (getcpu_t)dlsym(vdso, "__vdso_getcpu"); | ||
6649 | if (!vdso_getcpu) | ||
6650 | printf("Warning: failed to find getcpu in vDSO\n"); | ||
6651 | + | ||
6652 | + vgetcpu = (getcpu_t) vsyscall_getcpu(); | ||
6653 | } | ||
6654 | |||
6655 | static long sys_getcpu(unsigned * cpu, unsigned * node, | ||
6656 | diff --git a/tools/testing/selftests/x86/test_vsyscall.c b/tools/testing/selftests/x86/test_vsyscall.c | ||
6657 | index 7a744fa7b786..be81621446f0 100644 | ||
6658 | --- a/tools/testing/selftests/x86/test_vsyscall.c | ||
6659 | +++ b/tools/testing/selftests/x86/test_vsyscall.c | ||
6660 | @@ -33,6 +33,9 @@ | ||
6661 | # endif | ||
6662 | #endif | ||
6663 | |||
6664 | +/* max length of lines in /proc/self/maps - anything longer is skipped here */ | ||
6665 | +#define MAPS_LINE_LEN 128 | ||
6666 | + | ||
6667 | static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *), | ||
6668 | int flags) | ||
6669 | { | ||
6670 | @@ -98,7 +101,7 @@ static int init_vsys(void) | ||
6671 | #ifdef __x86_64__ | ||
6672 | int nerrs = 0; | ||
6673 | FILE *maps; | ||
6674 | - char line[128]; | ||
6675 | + char line[MAPS_LINE_LEN]; | ||
6676 | bool found = false; | ||
6677 | |||
6678 | maps = fopen("/proc/self/maps", "r"); | ||
6679 | @@ -108,10 +111,12 @@ static int init_vsys(void) | ||
6680 | return 0; | ||
6681 | } | ||
6682 | |||
6683 | - while (fgets(line, sizeof(line), maps)) { | ||
6684 | + while (fgets(line, MAPS_LINE_LEN, maps)) { | ||
6685 | char r, x; | ||
6686 | void *start, *end; | ||
6687 | - char name[128]; | ||
6688 | + char name[MAPS_LINE_LEN]; | ||
6689 | + | ||
6690 | + /* sscanf() is safe here as strlen(name) >= strlen(line) */ | ||
6691 | if (sscanf(line, "%p-%p %c-%cp %*x %*x:%*x %*u %s", | ||
6692 | &start, &end, &r, &x, name) != 5) | ||
6693 | continue; |