Contents of /trunk/kernel-alx/patches-4.1/0101-4.1.2-all-fixes.patch
Parent Directory | Revision Log
Revision 2748 -
(show annotations)
(download)
Mon Jan 11 12:00:45 2016 UTC (8 years, 8 months ago) by niro
File size: 72997 byte(s)
Mon Jan 11 12:00:45 2016 UTC (8 years, 8 months ago) by niro
File size: 72997 byte(s)
-linux-4.1 patches up to 4.1.15
1 | diff --git a/Documentation/devicetree/bindings/net/marvell-armada-370-neta.txt b/Documentation/devicetree/bindings/net/marvell-armada-370-neta.txt |
2 | index 750d577e8083..f5a8ca29aff0 100644 |
3 | --- a/Documentation/devicetree/bindings/net/marvell-armada-370-neta.txt |
4 | +++ b/Documentation/devicetree/bindings/net/marvell-armada-370-neta.txt |
5 | @@ -1,7 +1,7 @@ |
6 | * Marvell Armada 370 / Armada XP Ethernet Controller (NETA) |
7 | |
8 | Required properties: |
9 | -- compatible: should be "marvell,armada-370-neta". |
10 | +- compatible: "marvell,armada-370-neta" or "marvell,armada-xp-neta". |
11 | - reg: address and length of the register set for the device. |
12 | - interrupts: interrupt for the device |
13 | - phy: See ethernet.txt file in the same directory. |
14 | diff --git a/Makefile b/Makefile |
15 | index 1caf4ad3eb8a..cef84c061f02 100644 |
16 | --- a/Makefile |
17 | +++ b/Makefile |
18 | @@ -1,6 +1,6 @@ |
19 | VERSION = 4 |
20 | PATCHLEVEL = 1 |
21 | -SUBLEVEL = 1 |
22 | +SUBLEVEL = 2 |
23 | EXTRAVERSION = |
24 | NAME = Series 4800 |
25 | |
26 | diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi |
27 | index ec96f0b36346..06a2f2ae9d1e 100644 |
28 | --- a/arch/arm/boot/dts/armada-370-xp.dtsi |
29 | +++ b/arch/arm/boot/dts/armada-370-xp.dtsi |
30 | @@ -270,7 +270,6 @@ |
31 | }; |
32 | |
33 | eth0: ethernet@70000 { |
34 | - compatible = "marvell,armada-370-neta"; |
35 | reg = <0x70000 0x4000>; |
36 | interrupts = <8>; |
37 | clocks = <&gateclk 4>; |
38 | @@ -286,7 +285,6 @@ |
39 | }; |
40 | |
41 | eth1: ethernet@74000 { |
42 | - compatible = "marvell,armada-370-neta"; |
43 | reg = <0x74000 0x4000>; |
44 | interrupts = <10>; |
45 | clocks = <&gateclk 3>; |
46 | diff --git a/arch/arm/boot/dts/armada-370.dtsi b/arch/arm/boot/dts/armada-370.dtsi |
47 | index 00b50db57c9c..ca4257b2f77d 100644 |
48 | --- a/arch/arm/boot/dts/armada-370.dtsi |
49 | +++ b/arch/arm/boot/dts/armada-370.dtsi |
50 | @@ -307,6 +307,14 @@ |
51 | dmacap,memset; |
52 | }; |
53 | }; |
54 | + |
55 | + ethernet@70000 { |
56 | + compatible = "marvell,armada-370-neta"; |
57 | + }; |
58 | + |
59 | + ethernet@74000 { |
60 | + compatible = "marvell,armada-370-neta"; |
61 | + }; |
62 | }; |
63 | }; |
64 | }; |
65 | diff --git a/arch/arm/boot/dts/armada-xp-mv78260.dtsi b/arch/arm/boot/dts/armada-xp-mv78260.dtsi |
66 | index 8479fdc9e9c2..c5fdc99f0dbe 100644 |
67 | --- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi |
68 | +++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi |
69 | @@ -318,7 +318,7 @@ |
70 | }; |
71 | |
72 | eth3: ethernet@34000 { |
73 | - compatible = "marvell,armada-370-neta"; |
74 | + compatible = "marvell,armada-xp-neta"; |
75 | reg = <0x34000 0x4000>; |
76 | interrupts = <14>; |
77 | clocks = <&gateclk 1>; |
78 | diff --git a/arch/arm/boot/dts/armada-xp-mv78460.dtsi b/arch/arm/boot/dts/armada-xp-mv78460.dtsi |
79 | index 661d54c81580..0e24f1a38540 100644 |
80 | --- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi |
81 | +++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi |
82 | @@ -356,7 +356,7 @@ |
83 | }; |
84 | |
85 | eth3: ethernet@34000 { |
86 | - compatible = "marvell,armada-370-neta"; |
87 | + compatible = "marvell,armada-xp-neta"; |
88 | reg = <0x34000 0x4000>; |
89 | interrupts = <14>; |
90 | clocks = <&gateclk 1>; |
91 | diff --git a/arch/arm/boot/dts/armada-xp.dtsi b/arch/arm/boot/dts/armada-xp.dtsi |
92 | index 013d63f69e36..8fdd6d7c0ab1 100644 |
93 | --- a/arch/arm/boot/dts/armada-xp.dtsi |
94 | +++ b/arch/arm/boot/dts/armada-xp.dtsi |
95 | @@ -177,7 +177,7 @@ |
96 | }; |
97 | |
98 | eth2: ethernet@30000 { |
99 | - compatible = "marvell,armada-370-neta"; |
100 | + compatible = "marvell,armada-xp-neta"; |
101 | reg = <0x30000 0x4000>; |
102 | interrupts = <12>; |
103 | clocks = <&gateclk 2>; |
104 | @@ -220,6 +220,14 @@ |
105 | }; |
106 | }; |
107 | |
108 | + ethernet@70000 { |
109 | + compatible = "marvell,armada-xp-neta"; |
110 | + }; |
111 | + |
112 | + ethernet@74000 { |
113 | + compatible = "marvell,armada-xp-neta"; |
114 | + }; |
115 | + |
116 | xor@f0900 { |
117 | compatible = "marvell,orion-xor"; |
118 | reg = <0xF0900 0x100 |
119 | diff --git a/arch/arm/boot/dts/sun5i-a10s.dtsi b/arch/arm/boot/dts/sun5i-a10s.dtsi |
120 | index 2fd8988f310c..3794ca16499d 100644 |
121 | --- a/arch/arm/boot/dts/sun5i-a10s.dtsi |
122 | +++ b/arch/arm/boot/dts/sun5i-a10s.dtsi |
123 | @@ -573,7 +573,7 @@ |
124 | }; |
125 | |
126 | rtp: rtp@01c25000 { |
127 | - compatible = "allwinner,sun4i-a10-ts"; |
128 | + compatible = "allwinner,sun5i-a13-ts"; |
129 | reg = <0x01c25000 0x100>; |
130 | interrupts = <29>; |
131 | #thermal-sensor-cells = <0>; |
132 | diff --git a/arch/arm/boot/dts/sun5i-a13.dtsi b/arch/arm/boot/dts/sun5i-a13.dtsi |
133 | index 883cb4873688..5098185abde6 100644 |
134 | --- a/arch/arm/boot/dts/sun5i-a13.dtsi |
135 | +++ b/arch/arm/boot/dts/sun5i-a13.dtsi |
136 | @@ -555,7 +555,7 @@ |
137 | }; |
138 | |
139 | rtp: rtp@01c25000 { |
140 | - compatible = "allwinner,sun4i-a10-ts"; |
141 | + compatible = "allwinner,sun5i-a13-ts"; |
142 | reg = <0x01c25000 0x100>; |
143 | interrupts = <29>; |
144 | #thermal-sensor-cells = <0>; |
145 | diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi |
146 | index fdd181792b4b..2b4847c7cbd4 100644 |
147 | --- a/arch/arm/boot/dts/sun7i-a20.dtsi |
148 | +++ b/arch/arm/boot/dts/sun7i-a20.dtsi |
149 | @@ -1042,7 +1042,7 @@ |
150 | }; |
151 | |
152 | rtp: rtp@01c25000 { |
153 | - compatible = "allwinner,sun4i-a10-ts"; |
154 | + compatible = "allwinner,sun5i-a13-ts"; |
155 | reg = <0x01c25000 0x100>; |
156 | interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>; |
157 | #thermal-sensor-cells = <0>; |
158 | diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S |
159 | index 79caf79b304a..f7db3a5d80e3 100644 |
160 | --- a/arch/arm/kvm/interrupts.S |
161 | +++ b/arch/arm/kvm/interrupts.S |
162 | @@ -170,13 +170,9 @@ __kvm_vcpu_return: |
163 | @ Don't trap coprocessor accesses for host kernel |
164 | set_hstr vmexit |
165 | set_hdcr vmexit |
166 | - set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11)) |
167 | + set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11)), after_vfp_restore |
168 | |
169 | #ifdef CONFIG_VFPv3 |
170 | - @ Save floating point registers we if let guest use them. |
171 | - tst r2, #(HCPTR_TCP(10) | HCPTR_TCP(11)) |
172 | - bne after_vfp_restore |
173 | - |
174 | @ Switch VFP/NEON hardware state to the host's |
175 | add r7, vcpu, #VCPU_VFP_GUEST |
176 | store_vfp_state r7 |
177 | @@ -188,6 +184,8 @@ after_vfp_restore: |
178 | @ Restore FPEXC_EN which we clobbered on entry |
179 | pop {r2} |
180 | VFPFMXR FPEXC, r2 |
181 | +#else |
182 | +after_vfp_restore: |
183 | #endif |
184 | |
185 | @ Reset Hyp-role |
186 | @@ -483,7 +481,7 @@ switch_to_guest_vfp: |
187 | push {r3-r7} |
188 | |
189 | @ NEON/VFP used. Turn on VFP access. |
190 | - set_hcptr vmexit, (HCPTR_TCP(10) | HCPTR_TCP(11)) |
191 | + set_hcptr vmtrap, (HCPTR_TCP(10) | HCPTR_TCP(11)) |
192 | |
193 | @ Switch VFP/NEON hardware state to the guest's |
194 | add r7, r0, #VCPU_VFP_HOST |
195 | diff --git a/arch/arm/kvm/interrupts_head.S b/arch/arm/kvm/interrupts_head.S |
196 | index 35e4a3a0c476..48efe2ee452c 100644 |
197 | --- a/arch/arm/kvm/interrupts_head.S |
198 | +++ b/arch/arm/kvm/interrupts_head.S |
199 | @@ -591,8 +591,13 @@ ARM_BE8(rev r6, r6 ) |
200 | .endm |
201 | |
202 | /* Configures the HCPTR (Hyp Coprocessor Trap Register) on entry/return |
203 | - * (hardware reset value is 0). Keep previous value in r2. */ |
204 | -.macro set_hcptr operation, mask |
205 | + * (hardware reset value is 0). Keep previous value in r2. |
206 | + * An ISB is emited on vmexit/vmtrap, but executed on vmexit only if |
207 | + * VFP wasn't already enabled (always executed on vmtrap). |
208 | + * If a label is specified with vmexit, it is branched to if VFP wasn't |
209 | + * enabled. |
210 | + */ |
211 | +.macro set_hcptr operation, mask, label = none |
212 | mrc p15, 4, r2, c1, c1, 2 |
213 | ldr r3, =\mask |
214 | .if \operation == vmentry |
215 | @@ -601,6 +606,17 @@ ARM_BE8(rev r6, r6 ) |
216 | bic r3, r2, r3 @ Don't trap defined coproc-accesses |
217 | .endif |
218 | mcr p15, 4, r3, c1, c1, 2 |
219 | + .if \operation != vmentry |
220 | + .if \operation == vmexit |
221 | + tst r2, #(HCPTR_TCP(10) | HCPTR_TCP(11)) |
222 | + beq 1f |
223 | + .endif |
224 | + isb |
225 | + .if \label != none |
226 | + b \label |
227 | + .endif |
228 | +1: |
229 | + .endif |
230 | .endm |
231 | |
232 | /* Configures the HDCR (Hyp Debug Configuration Register) on entry/return |
233 | diff --git a/arch/arm/kvm/psci.c b/arch/arm/kvm/psci.c |
234 | index 02fa8eff6ae1..531e922486b2 100644 |
235 | --- a/arch/arm/kvm/psci.c |
236 | +++ b/arch/arm/kvm/psci.c |
237 | @@ -230,10 +230,6 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu) |
238 | case PSCI_0_2_FN64_AFFINITY_INFO: |
239 | val = kvm_psci_vcpu_affinity_info(vcpu); |
240 | break; |
241 | - case PSCI_0_2_FN_MIGRATE: |
242 | - case PSCI_0_2_FN64_MIGRATE: |
243 | - val = PSCI_RET_NOT_SUPPORTED; |
244 | - break; |
245 | case PSCI_0_2_FN_MIGRATE_INFO_TYPE: |
246 | /* |
247 | * Trusted OS is MP hence does not require migration |
248 | @@ -242,10 +238,6 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu) |
249 | */ |
250 | val = PSCI_0_2_TOS_MP; |
251 | break; |
252 | - case PSCI_0_2_FN_MIGRATE_INFO_UP_CPU: |
253 | - case PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU: |
254 | - val = PSCI_RET_NOT_SUPPORTED; |
255 | - break; |
256 | case PSCI_0_2_FN_SYSTEM_OFF: |
257 | kvm_psci_system_off(vcpu); |
258 | /* |
259 | @@ -271,7 +263,8 @@ static int kvm_psci_0_2_call(struct kvm_vcpu *vcpu) |
260 | ret = 0; |
261 | break; |
262 | default: |
263 | - return -EINVAL; |
264 | + val = PSCI_RET_NOT_SUPPORTED; |
265 | + break; |
266 | } |
267 | |
268 | *vcpu_reg(vcpu, 0) = val; |
269 | @@ -291,12 +284,9 @@ static int kvm_psci_0_1_call(struct kvm_vcpu *vcpu) |
270 | case KVM_PSCI_FN_CPU_ON: |
271 | val = kvm_psci_vcpu_on(vcpu); |
272 | break; |
273 | - case KVM_PSCI_FN_CPU_SUSPEND: |
274 | - case KVM_PSCI_FN_MIGRATE: |
275 | + default: |
276 | val = PSCI_RET_NOT_SUPPORTED; |
277 | break; |
278 | - default: |
279 | - return -EINVAL; |
280 | } |
281 | |
282 | *vcpu_reg(vcpu, 0) = val; |
283 | diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c |
284 | index 469a150bf98f..a2e8ef3c0bd9 100644 |
285 | --- a/arch/arm/mach-imx/clk-imx6q.c |
286 | +++ b/arch/arm/mach-imx/clk-imx6q.c |
287 | @@ -443,7 +443,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) |
288 | clk[IMX6QDL_CLK_GPMI_IO] = imx_clk_gate2("gpmi_io", "enfc", base + 0x78, 28); |
289 | clk[IMX6QDL_CLK_GPMI_APB] = imx_clk_gate2("gpmi_apb", "usdhc3", base + 0x78, 30); |
290 | clk[IMX6QDL_CLK_ROM] = imx_clk_gate2("rom", "ahb", base + 0x7c, 0); |
291 | - clk[IMX6QDL_CLK_SATA] = imx_clk_gate2("sata", "ipg", base + 0x7c, 4); |
292 | + clk[IMX6QDL_CLK_SATA] = imx_clk_gate2("sata", "ahb", base + 0x7c, 4); |
293 | clk[IMX6QDL_CLK_SDMA] = imx_clk_gate2("sdma", "ahb", base + 0x7c, 6); |
294 | clk[IMX6QDL_CLK_SPBA] = imx_clk_gate2("spba", "ipg", base + 0x7c, 12); |
295 | clk[IMX6QDL_CLK_SPDIF] = imx_clk_gate2("spdif", "spdif_podf", base + 0x7c, 14); |
296 | diff --git a/arch/arm/mach-mvebu/pm-board.c b/arch/arm/mach-mvebu/pm-board.c |
297 | index 6dfd4ab97b2a..301ab38d38ba 100644 |
298 | --- a/arch/arm/mach-mvebu/pm-board.c |
299 | +++ b/arch/arm/mach-mvebu/pm-board.c |
300 | @@ -43,6 +43,9 @@ static void mvebu_armada_xp_gp_pm_enter(void __iomem *sdram_reg, u32 srcmd) |
301 | for (i = 0; i < ARMADA_XP_GP_PIC_NR_GPIOS; i++) |
302 | ackcmd |= BIT(pic_raw_gpios[i]); |
303 | |
304 | + srcmd = cpu_to_le32(srcmd); |
305 | + ackcmd = cpu_to_le32(ackcmd); |
306 | + |
307 | /* |
308 | * Wait a while, the PIC needs quite a bit of time between the |
309 | * two GPIO commands. |
310 | diff --git a/arch/arm/mach-tegra/cpuidle-tegra20.c b/arch/arm/mach-tegra/cpuidle-tegra20.c |
311 | index 88de2dce2e87..7469347b1749 100644 |
312 | --- a/arch/arm/mach-tegra/cpuidle-tegra20.c |
313 | +++ b/arch/arm/mach-tegra/cpuidle-tegra20.c |
314 | @@ -34,6 +34,7 @@ |
315 | #include "iomap.h" |
316 | #include "irq.h" |
317 | #include "pm.h" |
318 | +#include "reset.h" |
319 | #include "sleep.h" |
320 | |
321 | #ifdef CONFIG_PM_SLEEP |
322 | @@ -70,15 +71,13 @@ static struct cpuidle_driver tegra_idle_driver = { |
323 | |
324 | #ifdef CONFIG_PM_SLEEP |
325 | #ifdef CONFIG_SMP |
326 | -static void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE); |
327 | - |
328 | static int tegra20_reset_sleeping_cpu_1(void) |
329 | { |
330 | int ret = 0; |
331 | |
332 | tegra_pen_lock(); |
333 | |
334 | - if (readl(pmc + PMC_SCRATCH41) == CPU_RESETTABLE) |
335 | + if (readb(tegra20_cpu1_resettable_status) == CPU_RESETTABLE) |
336 | tegra20_cpu_shutdown(1); |
337 | else |
338 | ret = -EINVAL; |
339 | diff --git a/arch/arm/mach-tegra/reset-handler.S b/arch/arm/mach-tegra/reset-handler.S |
340 | index 71be4af5e975..e3070fdab80b 100644 |
341 | --- a/arch/arm/mach-tegra/reset-handler.S |
342 | +++ b/arch/arm/mach-tegra/reset-handler.S |
343 | @@ -169,10 +169,10 @@ after_errata: |
344 | cmp r6, #TEGRA20 |
345 | bne 1f |
346 | /* If not CPU0, don't let CPU0 reset CPU1 now that CPU1 is coming up. */ |
347 | - mov32 r5, TEGRA_PMC_BASE |
348 | - mov r0, #0 |
349 | + mov32 r5, TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET |
350 | + mov r0, #CPU_NOT_RESETTABLE |
351 | cmp r10, #0 |
352 | - strne r0, [r5, #PMC_SCRATCH41] |
353 | + strneb r0, [r5, #__tegra20_cpu1_resettable_status_offset] |
354 | 1: |
355 | #endif |
356 | |
357 | @@ -281,6 +281,10 @@ __tegra_cpu_reset_handler_data: |
358 | .rept TEGRA_RESET_DATA_SIZE |
359 | .long 0 |
360 | .endr |
361 | + .globl __tegra20_cpu1_resettable_status_offset |
362 | + .equ __tegra20_cpu1_resettable_status_offset, \ |
363 | + . - __tegra_cpu_reset_handler_start |
364 | + .byte 0 |
365 | .align L1_CACHE_SHIFT |
366 | |
367 | ENTRY(__tegra_cpu_reset_handler_end) |
368 | diff --git a/arch/arm/mach-tegra/reset.h b/arch/arm/mach-tegra/reset.h |
369 | index 76a93434c6ee..29c3dec0126a 100644 |
370 | --- a/arch/arm/mach-tegra/reset.h |
371 | +++ b/arch/arm/mach-tegra/reset.h |
372 | @@ -35,6 +35,7 @@ extern unsigned long __tegra_cpu_reset_handler_data[TEGRA_RESET_DATA_SIZE]; |
373 | |
374 | void __tegra_cpu_reset_handler_start(void); |
375 | void __tegra_cpu_reset_handler(void); |
376 | +void __tegra20_cpu1_resettable_status_offset(void); |
377 | void __tegra_cpu_reset_handler_end(void); |
378 | void tegra_secondary_startup(void); |
379 | |
380 | @@ -47,6 +48,9 @@ void tegra_secondary_startup(void); |
381 | (IO_ADDRESS(TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET + \ |
382 | ((u32)&__tegra_cpu_reset_handler_data[TEGRA_RESET_MASK_LP2] - \ |
383 | (u32)__tegra_cpu_reset_handler_start))) |
384 | +#define tegra20_cpu1_resettable_status \ |
385 | + (IO_ADDRESS(TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET + \ |
386 | + (u32)__tegra20_cpu1_resettable_status_offset)) |
387 | #endif |
388 | |
389 | #define tegra_cpu_reset_handler_offset \ |
390 | diff --git a/arch/arm/mach-tegra/sleep-tegra20.S b/arch/arm/mach-tegra/sleep-tegra20.S |
391 | index be4bc5f853f5..e6b684e14322 100644 |
392 | --- a/arch/arm/mach-tegra/sleep-tegra20.S |
393 | +++ b/arch/arm/mach-tegra/sleep-tegra20.S |
394 | @@ -97,9 +97,10 @@ ENDPROC(tegra20_hotplug_shutdown) |
395 | ENTRY(tegra20_cpu_shutdown) |
396 | cmp r0, #0 |
397 | reteq lr @ must not be called for CPU 0 |
398 | - mov32 r1, TEGRA_PMC_VIRT + PMC_SCRATCH41 |
399 | + mov32 r1, TEGRA_IRAM_RESET_BASE_VIRT |
400 | + ldr r2, =__tegra20_cpu1_resettable_status_offset |
401 | mov r12, #CPU_RESETTABLE |
402 | - str r12, [r1] |
403 | + strb r12, [r1, r2] |
404 | |
405 | cpu_to_halt_reg r1, r0 |
406 | ldr r3, =TEGRA_FLOW_CTRL_VIRT |
407 | @@ -182,38 +183,41 @@ ENDPROC(tegra_pen_unlock) |
408 | /* |
409 | * tegra20_cpu_clear_resettable(void) |
410 | * |
411 | - * Called to clear the "resettable soon" flag in PMC_SCRATCH41 when |
412 | + * Called to clear the "resettable soon" flag in IRAM variable when |
413 | * it is expected that the secondary CPU will be idle soon. |
414 | */ |
415 | ENTRY(tegra20_cpu_clear_resettable) |
416 | - mov32 r1, TEGRA_PMC_VIRT + PMC_SCRATCH41 |
417 | + mov32 r1, TEGRA_IRAM_RESET_BASE_VIRT |
418 | + ldr r2, =__tegra20_cpu1_resettable_status_offset |
419 | mov r12, #CPU_NOT_RESETTABLE |
420 | - str r12, [r1] |
421 | + strb r12, [r1, r2] |
422 | ret lr |
423 | ENDPROC(tegra20_cpu_clear_resettable) |
424 | |
425 | /* |
426 | * tegra20_cpu_set_resettable_soon(void) |
427 | * |
428 | - * Called to set the "resettable soon" flag in PMC_SCRATCH41 when |
429 | + * Called to set the "resettable soon" flag in IRAM variable when |
430 | * it is expected that the secondary CPU will be idle soon. |
431 | */ |
432 | ENTRY(tegra20_cpu_set_resettable_soon) |
433 | - mov32 r1, TEGRA_PMC_VIRT + PMC_SCRATCH41 |
434 | + mov32 r1, TEGRA_IRAM_RESET_BASE_VIRT |
435 | + ldr r2, =__tegra20_cpu1_resettable_status_offset |
436 | mov r12, #CPU_RESETTABLE_SOON |
437 | - str r12, [r1] |
438 | + strb r12, [r1, r2] |
439 | ret lr |
440 | ENDPROC(tegra20_cpu_set_resettable_soon) |
441 | |
442 | /* |
443 | * tegra20_cpu_is_resettable_soon(void) |
444 | * |
445 | - * Returns true if the "resettable soon" flag in PMC_SCRATCH41 has been |
446 | + * Returns true if the "resettable soon" flag in IRAM variable has been |
447 | * set because it is expected that the secondary CPU will be idle soon. |
448 | */ |
449 | ENTRY(tegra20_cpu_is_resettable_soon) |
450 | - mov32 r1, TEGRA_PMC_VIRT + PMC_SCRATCH41 |
451 | - ldr r12, [r1] |
452 | + mov32 r1, TEGRA_IRAM_RESET_BASE_VIRT |
453 | + ldr r2, =__tegra20_cpu1_resettable_status_offset |
454 | + ldrb r12, [r1, r2] |
455 | cmp r12, #CPU_RESETTABLE_SOON |
456 | moveq r0, #1 |
457 | movne r0, #0 |
458 | @@ -256,9 +260,10 @@ ENTRY(tegra20_sleep_cpu_secondary_finish) |
459 | mov r0, #TEGRA_FLUSH_CACHE_LOUIS |
460 | bl tegra_disable_clean_inv_dcache |
461 | |
462 | - mov32 r0, TEGRA_PMC_VIRT + PMC_SCRATCH41 |
463 | + mov32 r0, TEGRA_IRAM_RESET_BASE_VIRT |
464 | + ldr r4, =__tegra20_cpu1_resettable_status_offset |
465 | mov r3, #CPU_RESETTABLE |
466 | - str r3, [r0] |
467 | + strb r3, [r0, r4] |
468 | |
469 | bl tegra_cpu_do_idle |
470 | |
471 | @@ -274,10 +279,10 @@ ENTRY(tegra20_sleep_cpu_secondary_finish) |
472 | |
473 | bl tegra_pen_lock |
474 | |
475 | - mov32 r3, TEGRA_PMC_VIRT |
476 | - add r0, r3, #PMC_SCRATCH41 |
477 | + mov32 r0, TEGRA_IRAM_RESET_BASE_VIRT |
478 | + ldr r4, =__tegra20_cpu1_resettable_status_offset |
479 | mov r3, #CPU_NOT_RESETTABLE |
480 | - str r3, [r0] |
481 | + strb r3, [r0, r4] |
482 | |
483 | bl tegra_pen_unlock |
484 | |
485 | diff --git a/arch/arm/mach-tegra/sleep.h b/arch/arm/mach-tegra/sleep.h |
486 | index 92d46ec1361a..0d59360d891d 100644 |
487 | --- a/arch/arm/mach-tegra/sleep.h |
488 | +++ b/arch/arm/mach-tegra/sleep.h |
489 | @@ -18,6 +18,7 @@ |
490 | #define __MACH_TEGRA_SLEEP_H |
491 | |
492 | #include "iomap.h" |
493 | +#include "irammap.h" |
494 | |
495 | #define TEGRA_ARM_PERIF_VIRT (TEGRA_ARM_PERIF_BASE - IO_CPU_PHYS \ |
496 | + IO_CPU_VIRT) |
497 | @@ -29,6 +30,9 @@ |
498 | + IO_APB_VIRT) |
499 | #define TEGRA_PMC_VIRT (TEGRA_PMC_BASE - IO_APB_PHYS + IO_APB_VIRT) |
500 | |
501 | +#define TEGRA_IRAM_RESET_BASE_VIRT (IO_IRAM_VIRT + \ |
502 | + TEGRA_IRAM_RESET_HANDLER_OFFSET) |
503 | + |
504 | /* PMC_SCRATCH37-39 and 41 are used for tegra_pen_lock and idle */ |
505 | #define PMC_SCRATCH37 0x130 |
506 | #define PMC_SCRATCH38 0x134 |
507 | diff --git a/arch/mips/include/asm/mach-generic/spaces.h b/arch/mips/include/asm/mach-generic/spaces.h |
508 | index 9488fa5f8866..afc96ecb9004 100644 |
509 | --- a/arch/mips/include/asm/mach-generic/spaces.h |
510 | +++ b/arch/mips/include/asm/mach-generic/spaces.h |
511 | @@ -94,7 +94,11 @@ |
512 | #endif |
513 | |
514 | #ifndef FIXADDR_TOP |
515 | +#ifdef CONFIG_KVM_GUEST |
516 | +#define FIXADDR_TOP ((unsigned long)(long)(int)0x7ffe0000) |
517 | +#else |
518 | #define FIXADDR_TOP ((unsigned long)(long)(int)0xfffe0000) |
519 | #endif |
520 | +#endif |
521 | |
522 | #endif /* __ASM_MACH_GENERIC_SPACES_H */ |
523 | diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c |
524 | index bb68e8d520e8..52f205ae1281 100644 |
525 | --- a/arch/mips/kvm/mips.c |
526 | +++ b/arch/mips/kvm/mips.c |
527 | @@ -982,7 +982,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log) |
528 | |
529 | /* If nothing is dirty, don't bother messing with page tables. */ |
530 | if (is_dirty) { |
531 | - memslot = &kvm->memslots->memslots[log->slot]; |
532 | + memslot = id_to_memslot(kvm->memslots, log->slot); |
533 | |
534 | ga = memslot->base_gfn << PAGE_SHIFT; |
535 | ga_end = ga + (memslot->npages << PAGE_SHIFT); |
536 | diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c |
537 | index 12b638425bb9..d90893b76e7c 100644 |
538 | --- a/arch/powerpc/perf/core-book3s.c |
539 | +++ b/arch/powerpc/perf/core-book3s.c |
540 | @@ -131,7 +131,16 @@ static void pmao_restore_workaround(bool ebb) { } |
541 | |
542 | static bool regs_use_siar(struct pt_regs *regs) |
543 | { |
544 | - return !!regs->result; |
545 | + /* |
546 | + * When we take a performance monitor exception the regs are setup |
547 | + * using perf_read_regs() which overloads some fields, in particular |
548 | + * regs->result to tell us whether to use SIAR. |
549 | + * |
550 | + * However if the regs are from another exception, eg. a syscall, then |
551 | + * they have not been setup using perf_read_regs() and so regs->result |
552 | + * is something random. |
553 | + */ |
554 | + return ((TRAP(regs) == 0xf00) && regs->result); |
555 | } |
556 | |
557 | /* |
558 | diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c |
559 | index 9f73c8059022..49b74454d7ee 100644 |
560 | --- a/arch/s390/kernel/crash_dump.c |
561 | +++ b/arch/s390/kernel/crash_dump.c |
562 | @@ -415,7 +415,7 @@ static void *nt_s390_vx_low(void *ptr, __vector128 *vx_regs) |
563 | ptr += len; |
564 | /* Copy lower halves of SIMD registers 0-15 */ |
565 | for (i = 0; i < 16; i++) { |
566 | - memcpy(ptr, &vx_regs[i], 8); |
567 | + memcpy(ptr, &vx_regs[i].u[2], 8); |
568 | ptr += 8; |
569 | } |
570 | return ptr; |
571 | diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c |
572 | index 9de47265ef73..b745a109bfc1 100644 |
573 | --- a/arch/s390/kvm/interrupt.c |
574 | +++ b/arch/s390/kvm/interrupt.c |
575 | @@ -1061,7 +1061,7 @@ static int __inject_extcall(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) |
576 | if (sclp_has_sigpif()) |
577 | return __inject_extcall_sigpif(vcpu, src_id); |
578 | |
579 | - if (!test_and_set_bit(IRQ_PEND_EXT_EXTERNAL, &li->pending_irqs)) |
580 | + if (test_and_set_bit(IRQ_PEND_EXT_EXTERNAL, &li->pending_irqs)) |
581 | return -EBUSY; |
582 | *extcall = irq->u.extcall; |
583 | atomic_set_mask(CPUSTAT_EXT_INT, li->cpuflags); |
584 | @@ -1606,6 +1606,9 @@ void kvm_s390_clear_float_irqs(struct kvm *kvm) |
585 | int i; |
586 | |
587 | spin_lock(&fi->lock); |
588 | + fi->pending_irqs = 0; |
589 | + memset(&fi->srv_signal, 0, sizeof(fi->srv_signal)); |
590 | + memset(&fi->mchk, 0, sizeof(fi->mchk)); |
591 | for (i = 0; i < FIRQ_LIST_COUNT; i++) |
592 | clear_irq_list(&fi->lists[i]); |
593 | for (i = 0; i < FIRQ_MAX_COUNT; i++) |
594 | diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c |
595 | index 55423d8be580..9afb9d602f84 100644 |
596 | --- a/arch/s390/net/bpf_jit_comp.c |
597 | +++ b/arch/s390/net/bpf_jit_comp.c |
598 | @@ -227,7 +227,7 @@ static inline void reg_set_seen(struct bpf_jit *jit, u32 b1) |
599 | ({ \ |
600 | /* Branch instruction needs 6 bytes */ \ |
601 | int rel = (addrs[i + off + 1] - (addrs[i + 1] - 6)) / 2;\ |
602 | - _EMIT6(op1 | reg(b1, b2) << 16 | rel, op2 | mask); \ |
603 | + _EMIT6(op1 | reg(b1, b2) << 16 | (rel & 0xffff), op2 | mask); \ |
604 | REG_SET_SEEN(b1); \ |
605 | REG_SET_SEEN(b2); \ |
606 | }) |
607 | diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h |
608 | index f4a555beef19..41b06fca39f7 100644 |
609 | --- a/arch/x86/include/asm/kvm_host.h |
610 | +++ b/arch/x86/include/asm/kvm_host.h |
611 | @@ -591,7 +591,7 @@ struct kvm_arch { |
612 | struct kvm_pic *vpic; |
613 | struct kvm_ioapic *vioapic; |
614 | struct kvm_pit *vpit; |
615 | - int vapics_in_nmi_mode; |
616 | + atomic_t vapics_in_nmi_mode; |
617 | struct mutex apic_map_lock; |
618 | struct kvm_apic_map *apic_map; |
619 | |
620 | diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c |
621 | index 4dce6f8b6129..f90952f64e79 100644 |
622 | --- a/arch/x86/kvm/i8254.c |
623 | +++ b/arch/x86/kvm/i8254.c |
624 | @@ -305,7 +305,7 @@ static void pit_do_work(struct kthread_work *work) |
625 | * LVT0 to NMI delivery. Other PIC interrupts are just sent to |
626 | * VCPU0, and only if its LVT0 is in EXTINT mode. |
627 | */ |
628 | - if (kvm->arch.vapics_in_nmi_mode > 0) |
629 | + if (atomic_read(&kvm->arch.vapics_in_nmi_mode) > 0) |
630 | kvm_for_each_vcpu(i, vcpu, kvm) |
631 | kvm_apic_nmi_wd_deliver(vcpu); |
632 | } |
633 | diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c |
634 | index 4c7deb4f78a1..67d07e051436 100644 |
635 | --- a/arch/x86/kvm/lapic.c |
636 | +++ b/arch/x86/kvm/lapic.c |
637 | @@ -1250,10 +1250,10 @@ static void apic_manage_nmi_watchdog(struct kvm_lapic *apic, u32 lvt0_val) |
638 | if (!nmi_wd_enabled) { |
639 | apic_debug("Receive NMI setting on APIC_LVT0 " |
640 | "for cpu %d\n", apic->vcpu->vcpu_id); |
641 | - apic->vcpu->kvm->arch.vapics_in_nmi_mode++; |
642 | + atomic_inc(&apic->vcpu->kvm->arch.vapics_in_nmi_mode); |
643 | } |
644 | } else if (nmi_wd_enabled) |
645 | - apic->vcpu->kvm->arch.vapics_in_nmi_mode--; |
646 | + atomic_dec(&apic->vcpu->kvm->arch.vapics_in_nmi_mode); |
647 | } |
648 | |
649 | static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) |
650 | @@ -1808,6 +1808,7 @@ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu, |
651 | apic_update_ppr(apic); |
652 | hrtimer_cancel(&apic->lapic_timer.timer); |
653 | apic_update_lvtt(apic); |
654 | + apic_manage_nmi_watchdog(apic, kvm_apic_get_reg(apic, APIC_LVT0)); |
655 | update_divide_count(apic); |
656 | start_apic_timer(apic); |
657 | apic->irr_pending = true; |
658 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c |
659 | index 9afa233b5482..4911bf19122b 100644 |
660 | --- a/arch/x86/kvm/svm.c |
661 | +++ b/arch/x86/kvm/svm.c |
662 | @@ -511,8 +511,10 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu) |
663 | { |
664 | struct vcpu_svm *svm = to_svm(vcpu); |
665 | |
666 | - if (svm->vmcb->control.next_rip != 0) |
667 | + if (svm->vmcb->control.next_rip != 0) { |
668 | + WARN_ON(!static_cpu_has(X86_FEATURE_NRIPS)); |
669 | svm->next_rip = svm->vmcb->control.next_rip; |
670 | + } |
671 | |
672 | if (!svm->next_rip) { |
673 | if (emulate_instruction(vcpu, EMULTYPE_SKIP) != |
674 | @@ -4317,7 +4319,9 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu, |
675 | break; |
676 | } |
677 | |
678 | - vmcb->control.next_rip = info->next_rip; |
679 | + /* TODO: Advertise NRIPS to guest hypervisor unconditionally */ |
680 | + if (static_cpu_has(X86_FEATURE_NRIPS)) |
681 | + vmcb->control.next_rip = info->next_rip; |
682 | vmcb->control.exit_code = icpt_info.exit_code; |
683 | vmexit = nested_svm_exit_handled(svm); |
684 | |
685 | diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c |
686 | index 14a63ed6fe09..ff9911707160 100644 |
687 | --- a/arch/x86/pci/acpi.c |
688 | +++ b/arch/x86/pci/acpi.c |
689 | @@ -81,6 +81,17 @@ static const struct dmi_system_id pci_crs_quirks[] __initconst = { |
690 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), |
691 | }, |
692 | }, |
693 | + /* https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/931368 */ |
694 | + /* https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/1033299 */ |
695 | + { |
696 | + .callback = set_use_crs, |
697 | + .ident = "Foxconn K8M890-8237A", |
698 | + .matches = { |
699 | + DMI_MATCH(DMI_BOARD_VENDOR, "Foxconn"), |
700 | + DMI_MATCH(DMI_BOARD_NAME, "K8M890-8237A"), |
701 | + DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), |
702 | + }, |
703 | + }, |
704 | |
705 | /* Now for the blacklist.. */ |
706 | |
707 | @@ -121,8 +132,10 @@ void __init pci_acpi_crs_quirks(void) |
708 | { |
709 | int year; |
710 | |
711 | - if (dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL) && year < 2008) |
712 | - pci_use_crs = false; |
713 | + if (dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL) && year < 2008) { |
714 | + if (iomem_resource.end <= 0xffffffff) |
715 | + pci_use_crs = false; |
716 | + } |
717 | |
718 | dmi_check_system(pci_crs_quirks); |
719 | |
720 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c |
721 | index 6414661ac1c4..c45d274a75c8 100644 |
722 | --- a/drivers/cpufreq/intel_pstate.c |
723 | +++ b/drivers/cpufreq/intel_pstate.c |
724 | @@ -535,7 +535,7 @@ static void byt_set_pstate(struct cpudata *cpudata, int pstate) |
725 | |
726 | val |= vid; |
727 | |
728 | - wrmsrl(MSR_IA32_PERF_CTL, val); |
729 | + wrmsrl_on_cpu(cpudata->cpu, MSR_IA32_PERF_CTL, val); |
730 | } |
731 | |
732 | #define BYT_BCLK_FREQS 5 |
733 | diff --git a/drivers/cpuidle/cpuidle-powernv.c b/drivers/cpuidle/cpuidle-powernv.c |
734 | index 59372077ec7c..3442764a5293 100644 |
735 | --- a/drivers/cpuidle/cpuidle-powernv.c |
736 | +++ b/drivers/cpuidle/cpuidle-powernv.c |
737 | @@ -60,6 +60,8 @@ static int nap_loop(struct cpuidle_device *dev, |
738 | return index; |
739 | } |
740 | |
741 | +/* Register for fastsleep only in oneshot mode of broadcast */ |
742 | +#ifdef CONFIG_TICK_ONESHOT |
743 | static int fastsleep_loop(struct cpuidle_device *dev, |
744 | struct cpuidle_driver *drv, |
745 | int index) |
746 | @@ -83,7 +85,7 @@ static int fastsleep_loop(struct cpuidle_device *dev, |
747 | |
748 | return index; |
749 | } |
750 | - |
751 | +#endif |
752 | /* |
753 | * States for dedicated partition case. |
754 | */ |
755 | @@ -209,7 +211,14 @@ static int powernv_add_idle_states(void) |
756 | powernv_states[nr_idle_states].flags = 0; |
757 | powernv_states[nr_idle_states].target_residency = 100; |
758 | powernv_states[nr_idle_states].enter = &nap_loop; |
759 | - } else if (flags[i] & OPAL_PM_SLEEP_ENABLED || |
760 | + } |
761 | + |
762 | + /* |
763 | + * All cpuidle states with CPUIDLE_FLAG_TIMER_STOP set must come |
764 | + * within this config dependency check. |
765 | + */ |
766 | +#ifdef CONFIG_TICK_ONESHOT |
767 | + if (flags[i] & OPAL_PM_SLEEP_ENABLED || |
768 | flags[i] & OPAL_PM_SLEEP_ENABLED_ER1) { |
769 | /* Add FASTSLEEP state */ |
770 | strcpy(powernv_states[nr_idle_states].name, "FastSleep"); |
771 | @@ -218,7 +227,7 @@ static int powernv_add_idle_states(void) |
772 | powernv_states[nr_idle_states].target_residency = 300000; |
773 | powernv_states[nr_idle_states].enter = &fastsleep_loop; |
774 | } |
775 | - |
776 | +#endif |
777 | powernv_states[nr_idle_states].exit_latency = |
778 | ((unsigned int)latency_ns[i]) / 1000; |
779 | |
780 | diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c |
781 | index 857414afa29a..f062158d4dc9 100644 |
782 | --- a/drivers/crypto/talitos.c |
783 | +++ b/drivers/crypto/talitos.c |
784 | @@ -925,7 +925,8 @@ static int sg_to_link_tbl(struct scatterlist *sg, int sg_count, |
785 | sg_count--; |
786 | link_tbl_ptr--; |
787 | } |
788 | - be16_add_cpu(&link_tbl_ptr->len, cryptlen); |
789 | + link_tbl_ptr->len = cpu_to_be16(be16_to_cpu(link_tbl_ptr->len) |
790 | + + cryptlen); |
791 | |
792 | /* tag end of link table */ |
793 | link_tbl_ptr->j_extent = DESC_PTR_LNKTBL_RETURN; |
794 | @@ -2561,6 +2562,7 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev, |
795 | break; |
796 | default: |
797 | dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type); |
798 | + kfree(t_alg); |
799 | return ERR_PTR(-EINVAL); |
800 | } |
801 | |
802 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
803 | index e1c7e9e51045..ca9f4edbb940 100644 |
804 | --- a/drivers/iommu/amd_iommu.c |
805 | +++ b/drivers/iommu/amd_iommu.c |
806 | @@ -1869,9 +1869,15 @@ static void free_pt_##LVL (unsigned long __pt) \ |
807 | pt = (u64 *)__pt; \ |
808 | \ |
809 | for (i = 0; i < 512; ++i) { \ |
810 | + /* PTE present? */ \ |
811 | if (!IOMMU_PTE_PRESENT(pt[i])) \ |
812 | continue; \ |
813 | \ |
814 | + /* Large PTE? */ \ |
815 | + if (PM_PTE_LEVEL(pt[i]) == 0 || \ |
816 | + PM_PTE_LEVEL(pt[i]) == 7) \ |
817 | + continue; \ |
818 | + \ |
819 | p = (unsigned long)IOMMU_PTE_PAGE(pt[i]); \ |
820 | FN(p); \ |
821 | } \ |
822 | diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c |
823 | index 66a803b9dd3a..65075ef75e2a 100644 |
824 | --- a/drivers/iommu/arm-smmu.c |
825 | +++ b/drivers/iommu/arm-smmu.c |
826 | @@ -1567,7 +1567,7 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu) |
827 | return -ENODEV; |
828 | } |
829 | |
830 | - if ((id & ID0_S1TS) && ((smmu->version == 1) || (id & ID0_ATOSNS))) { |
831 | + if ((id & ID0_S1TS) && ((smmu->version == 1) || !(id & ID0_ATOSNS))) { |
832 | smmu->features |= ARM_SMMU_FEAT_TRANS_OPS; |
833 | dev_notice(smmu->dev, "\taddress translation ops\n"); |
834 | } |
835 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c |
836 | index c80287a02735..9231cdfe2757 100644 |
837 | --- a/drivers/mmc/host/sdhci.c |
838 | +++ b/drivers/mmc/host/sdhci.c |
839 | @@ -848,7 +848,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) |
840 | int sg_cnt; |
841 | |
842 | sg_cnt = sdhci_pre_dma_transfer(host, data, NULL); |
843 | - if (sg_cnt == 0) { |
844 | + if (sg_cnt <= 0) { |
845 | /* |
846 | * This only happens when someone fed |
847 | * us an invalid request. |
848 | diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c |
849 | index b0f69248cb71..e9b1810d319f 100644 |
850 | --- a/drivers/net/can/dev.c |
851 | +++ b/drivers/net/can/dev.c |
852 | @@ -440,6 +440,9 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) |
853 | struct can_frame *cf = (struct can_frame *)skb->data; |
854 | u8 dlc = cf->can_dlc; |
855 | |
856 | + if (!(skb->tstamp.tv64)) |
857 | + __net_timestamp(skb); |
858 | + |
859 | netif_rx(priv->echo_skb[idx]); |
860 | priv->echo_skb[idx] = NULL; |
861 | |
862 | @@ -575,6 +578,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) |
863 | if (unlikely(!skb)) |
864 | return NULL; |
865 | |
866 | + __net_timestamp(skb); |
867 | skb->protocol = htons(ETH_P_CAN); |
868 | skb->pkt_type = PACKET_BROADCAST; |
869 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
870 | @@ -603,6 +607,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev, |
871 | if (unlikely(!skb)) |
872 | return NULL; |
873 | |
874 | + __net_timestamp(skb); |
875 | skb->protocol = htons(ETH_P_CANFD); |
876 | skb->pkt_type = PACKET_BROADCAST; |
877 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
878 | diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c |
879 | index c837eb91d43e..f64f5290d6f8 100644 |
880 | --- a/drivers/net/can/slcan.c |
881 | +++ b/drivers/net/can/slcan.c |
882 | @@ -207,6 +207,7 @@ static void slc_bump(struct slcan *sl) |
883 | if (!skb) |
884 | return; |
885 | |
886 | + __net_timestamp(skb); |
887 | skb->dev = sl->dev; |
888 | skb->protocol = htons(ETH_P_CAN); |
889 | skb->pkt_type = PACKET_BROADCAST; |
890 | diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c |
891 | index 674f367087c5..0ce868de855d 100644 |
892 | --- a/drivers/net/can/vcan.c |
893 | +++ b/drivers/net/can/vcan.c |
894 | @@ -78,6 +78,9 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev) |
895 | skb->dev = dev; |
896 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
897 | |
898 | + if (!(skb->tstamp.tv64)) |
899 | + __net_timestamp(skb); |
900 | + |
901 | netif_rx_ni(skb); |
902 | } |
903 | |
904 | diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-desc.c b/drivers/net/ethernet/amd/xgbe/xgbe-desc.c |
905 | index d81fc6bd4759..5c92fb71b37e 100644 |
906 | --- a/drivers/net/ethernet/amd/xgbe/xgbe-desc.c |
907 | +++ b/drivers/net/ethernet/amd/xgbe/xgbe-desc.c |
908 | @@ -263,7 +263,7 @@ static int xgbe_alloc_pages(struct xgbe_prv_data *pdata, |
909 | int ret; |
910 | |
911 | /* Try to obtain pages, decreasing order if necessary */ |
912 | - gfp |= __GFP_COLD | __GFP_COMP; |
913 | + gfp |= __GFP_COLD | __GFP_COMP | __GFP_NOWARN; |
914 | while (order >= 0) { |
915 | pages = alloc_pages(gfp, order); |
916 | if (pages) |
917 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
918 | index 33501bcddc48..8a97d28f3d65 100644 |
919 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
920 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
921 | @@ -9323,7 +9323,8 @@ unload_error: |
922 | * function stop ramrod is sent, since as part of this ramrod FW access |
923 | * PTP registers. |
924 | */ |
925 | - bnx2x_stop_ptp(bp); |
926 | + if (bp->flags & PTP_SUPPORTED) |
927 | + bnx2x_stop_ptp(bp); |
928 | |
929 | /* Disable HW interrupts, NAPI */ |
930 | bnx2x_netif_stop(bp, 1); |
931 | diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c |
932 | index ce5f7f9cff06..74d0389bf233 100644 |
933 | --- a/drivers/net/ethernet/marvell/mvneta.c |
934 | +++ b/drivers/net/ethernet/marvell/mvneta.c |
935 | @@ -310,6 +310,7 @@ struct mvneta_port { |
936 | unsigned int link; |
937 | unsigned int duplex; |
938 | unsigned int speed; |
939 | + unsigned int tx_csum_limit; |
940 | int use_inband_status:1; |
941 | }; |
942 | |
943 | @@ -1013,6 +1014,12 @@ static void mvneta_defaults_set(struct mvneta_port *pp) |
944 | val = mvreg_read(pp, MVNETA_GMAC_CLOCK_DIVIDER); |
945 | val |= MVNETA_GMAC_1MS_CLOCK_ENABLE; |
946 | mvreg_write(pp, MVNETA_GMAC_CLOCK_DIVIDER, val); |
947 | + } else { |
948 | + val = mvreg_read(pp, MVNETA_GMAC_AUTONEG_CONFIG); |
949 | + val &= ~(MVNETA_GMAC_INBAND_AN_ENABLE | |
950 | + MVNETA_GMAC_AN_SPEED_EN | |
951 | + MVNETA_GMAC_AN_DUPLEX_EN); |
952 | + mvreg_write(pp, MVNETA_GMAC_AUTONEG_CONFIG, val); |
953 | } |
954 | |
955 | mvneta_set_ucast_table(pp, -1); |
956 | @@ -2502,8 +2509,10 @@ static int mvneta_change_mtu(struct net_device *dev, int mtu) |
957 | |
958 | dev->mtu = mtu; |
959 | |
960 | - if (!netif_running(dev)) |
961 | + if (!netif_running(dev)) { |
962 | + netdev_update_features(dev); |
963 | return 0; |
964 | + } |
965 | |
966 | /* The interface is running, so we have to force a |
967 | * reallocation of the queues |
968 | @@ -2532,9 +2541,26 @@ static int mvneta_change_mtu(struct net_device *dev, int mtu) |
969 | mvneta_start_dev(pp); |
970 | mvneta_port_up(pp); |
971 | |
972 | + netdev_update_features(dev); |
973 | + |
974 | return 0; |
975 | } |
976 | |
977 | +static netdev_features_t mvneta_fix_features(struct net_device *dev, |
978 | + netdev_features_t features) |
979 | +{ |
980 | + struct mvneta_port *pp = netdev_priv(dev); |
981 | + |
982 | + if (pp->tx_csum_limit && dev->mtu > pp->tx_csum_limit) { |
983 | + features &= ~(NETIF_F_IP_CSUM | NETIF_F_TSO); |
984 | + netdev_info(dev, |
985 | + "Disable IP checksum for MTU greater than %dB\n", |
986 | + pp->tx_csum_limit); |
987 | + } |
988 | + |
989 | + return features; |
990 | +} |
991 | + |
992 | /* Get mac address */ |
993 | static void mvneta_get_mac_addr(struct mvneta_port *pp, unsigned char *addr) |
994 | { |
995 | @@ -2856,6 +2882,7 @@ static const struct net_device_ops mvneta_netdev_ops = { |
996 | .ndo_set_rx_mode = mvneta_set_rx_mode, |
997 | .ndo_set_mac_address = mvneta_set_mac_addr, |
998 | .ndo_change_mtu = mvneta_change_mtu, |
999 | + .ndo_fix_features = mvneta_fix_features, |
1000 | .ndo_get_stats64 = mvneta_get_stats64, |
1001 | .ndo_do_ioctl = mvneta_ioctl, |
1002 | }; |
1003 | @@ -3101,6 +3128,9 @@ static int mvneta_probe(struct platform_device *pdev) |
1004 | } |
1005 | } |
1006 | |
1007 | + if (of_device_is_compatible(dn, "marvell,armada-370-neta")) |
1008 | + pp->tx_csum_limit = 1600; |
1009 | + |
1010 | pp->tx_ring_size = MVNETA_MAX_TXD; |
1011 | pp->rx_ring_size = MVNETA_MAX_RXD; |
1012 | |
1013 | @@ -3179,6 +3209,7 @@ static int mvneta_remove(struct platform_device *pdev) |
1014 | |
1015 | static const struct of_device_id mvneta_match[] = { |
1016 | { .compatible = "marvell,armada-370-neta" }, |
1017 | + { .compatible = "marvell,armada-xp-neta" }, |
1018 | { } |
1019 | }; |
1020 | MODULE_DEVICE_TABLE(of, mvneta_match); |
1021 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1022 | index cf467a9f6cc7..a5a0b8420d26 100644 |
1023 | --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1024 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1025 | @@ -1973,10 +1973,6 @@ void mlx4_en_free_resources(struct mlx4_en_priv *priv) |
1026 | mlx4_en_destroy_cq(priv, &priv->rx_cq[i]); |
1027 | } |
1028 | |
1029 | - if (priv->base_tx_qpn) { |
1030 | - mlx4_qp_release_range(priv->mdev->dev, priv->base_tx_qpn, priv->tx_ring_num); |
1031 | - priv->base_tx_qpn = 0; |
1032 | - } |
1033 | } |
1034 | |
1035 | int mlx4_en_alloc_resources(struct mlx4_en_priv *priv) |
1036 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
1037 | index 2a77a6b19121..eab4e080ebd2 100644 |
1038 | --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
1039 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c |
1040 | @@ -723,7 +723,7 @@ static int get_fixed_ipv6_csum(__wsum hw_checksum, struct sk_buff *skb, |
1041 | } |
1042 | #endif |
1043 | static int check_csum(struct mlx4_cqe *cqe, struct sk_buff *skb, void *va, |
1044 | - int hwtstamp_rx_filter) |
1045 | + netdev_features_t dev_features) |
1046 | { |
1047 | __wsum hw_checksum = 0; |
1048 | |
1049 | @@ -731,14 +731,8 @@ static int check_csum(struct mlx4_cqe *cqe, struct sk_buff *skb, void *va, |
1050 | |
1051 | hw_checksum = csum_unfold((__force __sum16)cqe->checksum); |
1052 | |
1053 | - if (((struct ethhdr *)va)->h_proto == htons(ETH_P_8021Q) && |
1054 | - hwtstamp_rx_filter != HWTSTAMP_FILTER_NONE) { |
1055 | - /* next protocol non IPv4 or IPv6 */ |
1056 | - if (((struct vlan_hdr *)hdr)->h_vlan_encapsulated_proto |
1057 | - != htons(ETH_P_IP) && |
1058 | - ((struct vlan_hdr *)hdr)->h_vlan_encapsulated_proto |
1059 | - != htons(ETH_P_IPV6)) |
1060 | - return -1; |
1061 | + if (cqe->vlan_my_qpn & cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK) && |
1062 | + !(dev_features & NETIF_F_HW_VLAN_CTAG_RX)) { |
1063 | hw_checksum = get_fixed_vlan_csum(hw_checksum, hdr); |
1064 | hdr += sizeof(struct vlan_hdr); |
1065 | } |
1066 | @@ -901,7 +895,8 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud |
1067 | |
1068 | if (ip_summed == CHECKSUM_COMPLETE) { |
1069 | void *va = skb_frag_address(skb_shinfo(gro_skb)->frags); |
1070 | - if (check_csum(cqe, gro_skb, va, ring->hwtstamp_rx_filter)) { |
1071 | + if (check_csum(cqe, gro_skb, va, |
1072 | + dev->features)) { |
1073 | ip_summed = CHECKSUM_NONE; |
1074 | ring->csum_none++; |
1075 | ring->csum_complete--; |
1076 | @@ -956,7 +951,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud |
1077 | } |
1078 | |
1079 | if (ip_summed == CHECKSUM_COMPLETE) { |
1080 | - if (check_csum(cqe, skb, skb->data, ring->hwtstamp_rx_filter)) { |
1081 | + if (check_csum(cqe, skb, skb->data, dev->features)) { |
1082 | ip_summed = CHECKSUM_NONE; |
1083 | ring->csum_complete--; |
1084 | ring->csum_none++; |
1085 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
1086 | index 7bed3a88579f..c10d98f6ad96 100644 |
1087 | --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
1088 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
1089 | @@ -66,6 +66,7 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, |
1090 | ring->size = size; |
1091 | ring->size_mask = size - 1; |
1092 | ring->stride = stride; |
1093 | + ring->full_size = ring->size - HEADROOM - MAX_DESC_TXBBS; |
1094 | |
1095 | tmp = size * sizeof(struct mlx4_en_tx_info); |
1096 | ring->tx_info = kmalloc_node(tmp, GFP_KERNEL | __GFP_NOWARN, node); |
1097 | @@ -180,6 +181,7 @@ void mlx4_en_destroy_tx_ring(struct mlx4_en_priv *priv, |
1098 | mlx4_bf_free(mdev->dev, &ring->bf); |
1099 | mlx4_qp_remove(mdev->dev, &ring->qp); |
1100 | mlx4_qp_free(mdev->dev, &ring->qp); |
1101 | + mlx4_qp_release_range(priv->mdev->dev, ring->qpn, 1); |
1102 | mlx4_en_unmap_buffer(&ring->wqres.buf); |
1103 | mlx4_free_hwq_res(mdev->dev, &ring->wqres, ring->buf_size); |
1104 | kfree(ring->bounce_buf); |
1105 | @@ -231,6 +233,11 @@ void mlx4_en_deactivate_tx_ring(struct mlx4_en_priv *priv, |
1106 | MLX4_QP_STATE_RST, NULL, 0, 0, &ring->qp); |
1107 | } |
1108 | |
1109 | +static inline bool mlx4_en_is_tx_ring_full(struct mlx4_en_tx_ring *ring) |
1110 | +{ |
1111 | + return ring->prod - ring->cons > ring->full_size; |
1112 | +} |
1113 | + |
1114 | static void mlx4_en_stamp_wqe(struct mlx4_en_priv *priv, |
1115 | struct mlx4_en_tx_ring *ring, int index, |
1116 | u8 owner) |
1117 | @@ -473,11 +480,10 @@ static bool mlx4_en_process_tx_cq(struct net_device *dev, |
1118 | |
1119 | netdev_tx_completed_queue(ring->tx_queue, packets, bytes); |
1120 | |
1121 | - /* |
1122 | - * Wakeup Tx queue if this stopped, and at least 1 packet |
1123 | - * was completed |
1124 | + /* Wakeup Tx queue if this stopped, and ring is not full. |
1125 | */ |
1126 | - if (netif_tx_queue_stopped(ring->tx_queue) && txbbs_skipped > 0) { |
1127 | + if (netif_tx_queue_stopped(ring->tx_queue) && |
1128 | + !mlx4_en_is_tx_ring_full(ring)) { |
1129 | netif_tx_wake_queue(ring->tx_queue); |
1130 | ring->wake_queue++; |
1131 | } |
1132 | @@ -921,8 +927,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) |
1133 | skb_tx_timestamp(skb); |
1134 | |
1135 | /* Check available TXBBs And 2K spare for prefetch */ |
1136 | - stop_queue = (int)(ring->prod - ring_cons) > |
1137 | - ring->size - HEADROOM - MAX_DESC_TXBBS; |
1138 | + stop_queue = mlx4_en_is_tx_ring_full(ring); |
1139 | if (unlikely(stop_queue)) { |
1140 | netif_tx_stop_queue(ring->tx_queue); |
1141 | ring->queue_stopped++; |
1142 | @@ -991,8 +996,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) |
1143 | smp_rmb(); |
1144 | |
1145 | ring_cons = ACCESS_ONCE(ring->cons); |
1146 | - if (unlikely(((int)(ring->prod - ring_cons)) <= |
1147 | - ring->size - HEADROOM - MAX_DESC_TXBBS)) { |
1148 | + if (unlikely(!mlx4_en_is_tx_ring_full(ring))) { |
1149 | netif_tx_wake_queue(ring->tx_queue); |
1150 | ring->wake_queue++; |
1151 | } |
1152 | diff --git a/drivers/net/ethernet/mellanox/mlx4/intf.c b/drivers/net/ethernet/mellanox/mlx4/intf.c |
1153 | index 6fce58718837..0d80aed59043 100644 |
1154 | --- a/drivers/net/ethernet/mellanox/mlx4/intf.c |
1155 | +++ b/drivers/net/ethernet/mellanox/mlx4/intf.c |
1156 | @@ -93,8 +93,14 @@ int mlx4_register_interface(struct mlx4_interface *intf) |
1157 | mutex_lock(&intf_mutex); |
1158 | |
1159 | list_add_tail(&intf->list, &intf_list); |
1160 | - list_for_each_entry(priv, &dev_list, dev_list) |
1161 | + list_for_each_entry(priv, &dev_list, dev_list) { |
1162 | + if (mlx4_is_mfunc(&priv->dev) && (intf->flags & MLX4_INTFF_BONDING)) { |
1163 | + mlx4_dbg(&priv->dev, |
1164 | + "SRIOV, disabling HA mode for intf proto %d\n", intf->protocol); |
1165 | + intf->flags &= ~MLX4_INTFF_BONDING; |
1166 | + } |
1167 | mlx4_add_device(intf, priv); |
1168 | + } |
1169 | |
1170 | mutex_unlock(&intf_mutex); |
1171 | |
1172 | diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1173 | index d021f079f181..909fcf803c54 100644 |
1174 | --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1175 | +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h |
1176 | @@ -279,6 +279,7 @@ struct mlx4_en_tx_ring { |
1177 | u32 size; /* number of TXBBs */ |
1178 | u32 size_mask; |
1179 | u16 stride; |
1180 | + u32 full_size; |
1181 | u16 cqn; /* index of port CQ associated with this ring */ |
1182 | u32 buf_size; |
1183 | __be32 doorbell_qpn; |
1184 | @@ -579,7 +580,6 @@ struct mlx4_en_priv { |
1185 | int vids[128]; |
1186 | bool wol; |
1187 | struct device *ddev; |
1188 | - int base_tx_qpn; |
1189 | struct hlist_head mac_hash[MLX4_EN_MAC_HASH_SIZE]; |
1190 | struct hwtstamp_config hwtstamp_config; |
1191 | |
1192 | diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c |
1193 | index bdfe51fc3a65..d551df62e61a 100644 |
1194 | --- a/drivers/net/phy/phy_device.c |
1195 | +++ b/drivers/net/phy/phy_device.c |
1196 | @@ -796,10 +796,11 @@ static int genphy_config_advert(struct phy_device *phydev) |
1197 | if (phydev->supported & (SUPPORTED_1000baseT_Half | |
1198 | SUPPORTED_1000baseT_Full)) { |
1199 | adv |= ethtool_adv_to_mii_ctrl1000_t(advertise); |
1200 | - if (adv != oldadv) |
1201 | - changed = 1; |
1202 | } |
1203 | |
1204 | + if (adv != oldadv) |
1205 | + changed = 1; |
1206 | + |
1207 | err = phy_write(phydev, MII_CTRL1000, adv); |
1208 | if (err < 0) |
1209 | return err; |
1210 | diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c |
1211 | index 968787abf78d..ec383b0f5443 100644 |
1212 | --- a/drivers/net/xen-netback/xenbus.c |
1213 | +++ b/drivers/net/xen-netback/xenbus.c |
1214 | @@ -681,6 +681,9 @@ static int xen_register_watchers(struct xenbus_device *dev, struct xenvif *vif) |
1215 | char *node; |
1216 | unsigned maxlen = strlen(dev->nodename) + sizeof("/rate"); |
1217 | |
1218 | + if (vif->credit_watch.node) |
1219 | + return -EADDRINUSE; |
1220 | + |
1221 | node = kmalloc(maxlen, GFP_KERNEL); |
1222 | if (!node) |
1223 | return -ENOMEM; |
1224 | @@ -770,6 +773,7 @@ static void connect(struct backend_info *be) |
1225 | } |
1226 | |
1227 | xen_net_read_rate(dev, &credit_bytes, &credit_usec); |
1228 | + xen_unregister_watchers(be->vif); |
1229 | xen_register_watchers(dev, be->vif); |
1230 | read_xenbus_vif_flags(be); |
1231 | |
1232 | diff --git a/drivers/s390/kvm/virtio_ccw.c b/drivers/s390/kvm/virtio_ccw.c |
1233 | index 6f1fa1773e76..f8d8fdb26b72 100644 |
1234 | --- a/drivers/s390/kvm/virtio_ccw.c |
1235 | +++ b/drivers/s390/kvm/virtio_ccw.c |
1236 | @@ -65,6 +65,7 @@ struct virtio_ccw_device { |
1237 | bool is_thinint; |
1238 | bool going_away; |
1239 | bool device_lost; |
1240 | + unsigned int config_ready; |
1241 | void *airq_info; |
1242 | }; |
1243 | |
1244 | @@ -833,8 +834,11 @@ static void virtio_ccw_get_config(struct virtio_device *vdev, |
1245 | if (ret) |
1246 | goto out_free; |
1247 | |
1248 | - memcpy(vcdev->config, config_area, sizeof(vcdev->config)); |
1249 | - memcpy(buf, &vcdev->config[offset], len); |
1250 | + memcpy(vcdev->config, config_area, offset + len); |
1251 | + if (buf) |
1252 | + memcpy(buf, &vcdev->config[offset], len); |
1253 | + if (vcdev->config_ready < offset + len) |
1254 | + vcdev->config_ready = offset + len; |
1255 | |
1256 | out_free: |
1257 | kfree(config_area); |
1258 | @@ -857,6 +861,9 @@ static void virtio_ccw_set_config(struct virtio_device *vdev, |
1259 | if (!config_area) |
1260 | goto out_free; |
1261 | |
1262 | + /* Make sure we don't overwrite fields. */ |
1263 | + if (vcdev->config_ready < offset) |
1264 | + virtio_ccw_get_config(vdev, 0, NULL, offset); |
1265 | memcpy(&vcdev->config[offset], buf, len); |
1266 | /* Write the config area to the host. */ |
1267 | memcpy(config_area, vcdev->config, sizeof(vcdev->config)); |
1268 | diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c |
1269 | index 3507f880eb74..45b8c8b338df 100644 |
1270 | --- a/drivers/usb/gadget/function/f_fs.c |
1271 | +++ b/drivers/usb/gadget/function/f_fs.c |
1272 | @@ -3435,6 +3435,7 @@ done: |
1273 | static void ffs_closed(struct ffs_data *ffs) |
1274 | { |
1275 | struct ffs_dev *ffs_obj; |
1276 | + struct f_fs_opts *opts; |
1277 | |
1278 | ENTER(); |
1279 | ffs_dev_lock(); |
1280 | @@ -3449,8 +3450,13 @@ static void ffs_closed(struct ffs_data *ffs) |
1281 | ffs_obj->ffs_closed_callback) |
1282 | ffs_obj->ffs_closed_callback(ffs); |
1283 | |
1284 | - if (!ffs_obj->opts || ffs_obj->opts->no_configfs |
1285 | - || !ffs_obj->opts->func_inst.group.cg_item.ci_parent) |
1286 | + if (ffs_obj->opts) |
1287 | + opts = ffs_obj->opts; |
1288 | + else |
1289 | + goto done; |
1290 | + |
1291 | + if (opts->no_configfs || !opts->func_inst.group.cg_item.ci_parent |
1292 | + || !atomic_read(&opts->func_inst.group.cg_item.ci_kref.refcount)) |
1293 | goto done; |
1294 | |
1295 | unregister_gadget_item(ffs_obj->opts-> |
1296 | diff --git a/fs/dcache.c b/fs/dcache.c |
1297 | index 37b5afdaf698..50bb3c207621 100644 |
1298 | --- a/fs/dcache.c |
1299 | +++ b/fs/dcache.c |
1300 | @@ -2927,17 +2927,6 @@ restart: |
1301 | vfsmnt = &mnt->mnt; |
1302 | continue; |
1303 | } |
1304 | - /* |
1305 | - * Filesystems needing to implement special "root names" |
1306 | - * should do so with ->d_dname() |
1307 | - */ |
1308 | - if (IS_ROOT(dentry) && |
1309 | - (dentry->d_name.len != 1 || |
1310 | - dentry->d_name.name[0] != '/')) { |
1311 | - WARN(1, "Root dentry has weird name <%.*s>\n", |
1312 | - (int) dentry->d_name.len, |
1313 | - dentry->d_name.name); |
1314 | - } |
1315 | if (!error) |
1316 | error = is_mounted(vfsmnt) ? 1 : 2; |
1317 | break; |
1318 | diff --git a/fs/inode.c b/fs/inode.c |
1319 | index ea37cd17b53f..6e342cadef81 100644 |
1320 | --- a/fs/inode.c |
1321 | +++ b/fs/inode.c |
1322 | @@ -1693,8 +1693,8 @@ int file_remove_suid(struct file *file) |
1323 | error = security_inode_killpriv(dentry); |
1324 | if (!error && killsuid) |
1325 | error = __remove_suid(dentry, killsuid); |
1326 | - if (!error && (inode->i_sb->s_flags & MS_NOSEC)) |
1327 | - inode->i_flags |= S_NOSEC; |
1328 | + if (!error) |
1329 | + inode_has_no_xattr(inode); |
1330 | |
1331 | return error; |
1332 | } |
1333 | diff --git a/fs/namespace.c b/fs/namespace.c |
1334 | index 1b9e11167bae..1d4a97c573e0 100644 |
1335 | --- a/fs/namespace.c |
1336 | +++ b/fs/namespace.c |
1337 | @@ -3185,11 +3185,15 @@ bool fs_fully_visible(struct file_system_type *type) |
1338 | if (mnt->mnt.mnt_root != mnt->mnt.mnt_sb->s_root) |
1339 | continue; |
1340 | |
1341 | - /* This mount is not fully visible if there are any child mounts |
1342 | - * that cover anything except for empty directories. |
1343 | + /* This mount is not fully visible if there are any |
1344 | + * locked child mounts that cover anything except for |
1345 | + * empty directories. |
1346 | */ |
1347 | list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) { |
1348 | struct inode *inode = child->mnt_mountpoint->d_inode; |
1349 | + /* Only worry about locked mounts */ |
1350 | + if (!(mnt->mnt.mnt_flags & MNT_LOCKED)) |
1351 | + continue; |
1352 | if (!S_ISDIR(inode->i_mode)) |
1353 | goto next; |
1354 | if (inode->i_nlink > 2) |
1355 | diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c |
1356 | index 2c1036080d52..a7106eda5024 100644 |
1357 | --- a/fs/ufs/balloc.c |
1358 | +++ b/fs/ufs/balloc.c |
1359 | @@ -51,8 +51,8 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count) |
1360 | |
1361 | if (ufs_fragnum(fragment) + count > uspi->s_fpg) |
1362 | ufs_error (sb, "ufs_free_fragments", "internal error"); |
1363 | - |
1364 | - lock_ufs(sb); |
1365 | + |
1366 | + mutex_lock(&UFS_SB(sb)->s_lock); |
1367 | |
1368 | cgno = ufs_dtog(uspi, fragment); |
1369 | bit = ufs_dtogd(uspi, fragment); |
1370 | @@ -115,13 +115,13 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count) |
1371 | if (sb->s_flags & MS_SYNCHRONOUS) |
1372 | ubh_sync_block(UCPI_UBH(ucpi)); |
1373 | ufs_mark_sb_dirty(sb); |
1374 | - |
1375 | - unlock_ufs(sb); |
1376 | + |
1377 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1378 | UFSD("EXIT\n"); |
1379 | return; |
1380 | |
1381 | failed: |
1382 | - unlock_ufs(sb); |
1383 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1384 | UFSD("EXIT (FAILED)\n"); |
1385 | return; |
1386 | } |
1387 | @@ -151,7 +151,7 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count) |
1388 | goto failed; |
1389 | } |
1390 | |
1391 | - lock_ufs(sb); |
1392 | + mutex_lock(&UFS_SB(sb)->s_lock); |
1393 | |
1394 | do_more: |
1395 | overflow = 0; |
1396 | @@ -211,12 +211,12 @@ do_more: |
1397 | } |
1398 | |
1399 | ufs_mark_sb_dirty(sb); |
1400 | - unlock_ufs(sb); |
1401 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1402 | UFSD("EXIT\n"); |
1403 | return; |
1404 | |
1405 | failed_unlock: |
1406 | - unlock_ufs(sb); |
1407 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1408 | failed: |
1409 | UFSD("EXIT (FAILED)\n"); |
1410 | return; |
1411 | @@ -357,7 +357,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, |
1412 | usb1 = ubh_get_usb_first(uspi); |
1413 | *err = -ENOSPC; |
1414 | |
1415 | - lock_ufs(sb); |
1416 | + mutex_lock(&UFS_SB(sb)->s_lock); |
1417 | tmp = ufs_data_ptr_to_cpu(sb, p); |
1418 | |
1419 | if (count + ufs_fragnum(fragment) > uspi->s_fpb) { |
1420 | @@ -378,19 +378,19 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, |
1421 | "fragment %llu, tmp %llu\n", |
1422 | (unsigned long long)fragment, |
1423 | (unsigned long long)tmp); |
1424 | - unlock_ufs(sb); |
1425 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1426 | return INVBLOCK; |
1427 | } |
1428 | if (fragment < UFS_I(inode)->i_lastfrag) { |
1429 | UFSD("EXIT (ALREADY ALLOCATED)\n"); |
1430 | - unlock_ufs(sb); |
1431 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1432 | return 0; |
1433 | } |
1434 | } |
1435 | else { |
1436 | if (tmp) { |
1437 | UFSD("EXIT (ALREADY ALLOCATED)\n"); |
1438 | - unlock_ufs(sb); |
1439 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1440 | return 0; |
1441 | } |
1442 | } |
1443 | @@ -399,7 +399,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, |
1444 | * There is not enough space for user on the device |
1445 | */ |
1446 | if (!capable(CAP_SYS_RESOURCE) && ufs_freespace(uspi, UFS_MINFREE) <= 0) { |
1447 | - unlock_ufs(sb); |
1448 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1449 | UFSD("EXIT (FAILED)\n"); |
1450 | return 0; |
1451 | } |
1452 | @@ -424,7 +424,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, |
1453 | ufs_clear_frags(inode, result + oldcount, |
1454 | newcount - oldcount, locked_page != NULL); |
1455 | } |
1456 | - unlock_ufs(sb); |
1457 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1458 | UFSD("EXIT, result %llu\n", (unsigned long long)result); |
1459 | return result; |
1460 | } |
1461 | @@ -439,7 +439,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, |
1462 | fragment + count); |
1463 | ufs_clear_frags(inode, result + oldcount, newcount - oldcount, |
1464 | locked_page != NULL); |
1465 | - unlock_ufs(sb); |
1466 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1467 | UFSD("EXIT, result %llu\n", (unsigned long long)result); |
1468 | return result; |
1469 | } |
1470 | @@ -477,7 +477,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, |
1471 | *err = 0; |
1472 | UFS_I(inode)->i_lastfrag = max(UFS_I(inode)->i_lastfrag, |
1473 | fragment + count); |
1474 | - unlock_ufs(sb); |
1475 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1476 | if (newcount < request) |
1477 | ufs_free_fragments (inode, result + newcount, request - newcount); |
1478 | ufs_free_fragments (inode, tmp, oldcount); |
1479 | @@ -485,7 +485,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, |
1480 | return result; |
1481 | } |
1482 | |
1483 | - unlock_ufs(sb); |
1484 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1485 | UFSD("EXIT (FAILED)\n"); |
1486 | return 0; |
1487 | } |
1488 | diff --git a/fs/ufs/ialloc.c b/fs/ufs/ialloc.c |
1489 | index 7caa01652888..fd0203ce1f7f 100644 |
1490 | --- a/fs/ufs/ialloc.c |
1491 | +++ b/fs/ufs/ialloc.c |
1492 | @@ -69,11 +69,11 @@ void ufs_free_inode (struct inode * inode) |
1493 | |
1494 | ino = inode->i_ino; |
1495 | |
1496 | - lock_ufs(sb); |
1497 | + mutex_lock(&UFS_SB(sb)->s_lock); |
1498 | |
1499 | if (!((ino > 1) && (ino < (uspi->s_ncg * uspi->s_ipg )))) { |
1500 | ufs_warning(sb, "ufs_free_inode", "reserved inode or nonexistent inode %u\n", ino); |
1501 | - unlock_ufs(sb); |
1502 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1503 | return; |
1504 | } |
1505 | |
1506 | @@ -81,7 +81,7 @@ void ufs_free_inode (struct inode * inode) |
1507 | bit = ufs_inotocgoff (ino); |
1508 | ucpi = ufs_load_cylinder (sb, cg); |
1509 | if (!ucpi) { |
1510 | - unlock_ufs(sb); |
1511 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1512 | return; |
1513 | } |
1514 | ucg = ubh_get_ucg(UCPI_UBH(ucpi)); |
1515 | @@ -115,7 +115,7 @@ void ufs_free_inode (struct inode * inode) |
1516 | ubh_sync_block(UCPI_UBH(ucpi)); |
1517 | |
1518 | ufs_mark_sb_dirty(sb); |
1519 | - unlock_ufs(sb); |
1520 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1521 | UFSD("EXIT\n"); |
1522 | } |
1523 | |
1524 | @@ -193,7 +193,7 @@ struct inode *ufs_new_inode(struct inode *dir, umode_t mode) |
1525 | sbi = UFS_SB(sb); |
1526 | uspi = sbi->s_uspi; |
1527 | |
1528 | - lock_ufs(sb); |
1529 | + mutex_lock(&sbi->s_lock); |
1530 | |
1531 | /* |
1532 | * Try to place the inode in its parent directory |
1533 | @@ -331,21 +331,21 @@ cg_found: |
1534 | sync_dirty_buffer(bh); |
1535 | brelse(bh); |
1536 | } |
1537 | - unlock_ufs(sb); |
1538 | + mutex_unlock(&sbi->s_lock); |
1539 | |
1540 | UFSD("allocating inode %lu\n", inode->i_ino); |
1541 | UFSD("EXIT\n"); |
1542 | return inode; |
1543 | |
1544 | fail_remove_inode: |
1545 | - unlock_ufs(sb); |
1546 | + mutex_unlock(&sbi->s_lock); |
1547 | clear_nlink(inode); |
1548 | unlock_new_inode(inode); |
1549 | iput(inode); |
1550 | UFSD("EXIT (FAILED): err %d\n", err); |
1551 | return ERR_PTR(err); |
1552 | failed: |
1553 | - unlock_ufs(sb); |
1554 | + mutex_unlock(&sbi->s_lock); |
1555 | make_bad_inode(inode); |
1556 | iput (inode); |
1557 | UFSD("EXIT (FAILED): err %d\n", err); |
1558 | diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c |
1559 | index be7d42c7d938..2d93ab07da8a 100644 |
1560 | --- a/fs/ufs/inode.c |
1561 | +++ b/fs/ufs/inode.c |
1562 | @@ -902,6 +902,9 @@ void ufs_evict_inode(struct inode * inode) |
1563 | invalidate_inode_buffers(inode); |
1564 | clear_inode(inode); |
1565 | |
1566 | - if (want_delete) |
1567 | + if (want_delete) { |
1568 | + lock_ufs(inode->i_sb); |
1569 | ufs_free_inode(inode); |
1570 | + unlock_ufs(inode->i_sb); |
1571 | + } |
1572 | } |
1573 | diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c |
1574 | index e491a93a7e9a..60ee32249b72 100644 |
1575 | --- a/fs/ufs/namei.c |
1576 | +++ b/fs/ufs/namei.c |
1577 | @@ -128,12 +128,12 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry, |
1578 | if (l > sb->s_blocksize) |
1579 | goto out_notlocked; |
1580 | |
1581 | + lock_ufs(dir->i_sb); |
1582 | inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO); |
1583 | err = PTR_ERR(inode); |
1584 | if (IS_ERR(inode)) |
1585 | - goto out_notlocked; |
1586 | + goto out; |
1587 | |
1588 | - lock_ufs(dir->i_sb); |
1589 | if (l > UFS_SB(sb)->s_uspi->s_maxsymlinklen) { |
1590 | /* slow symlink */ |
1591 | inode->i_op = &ufs_symlink_inode_operations; |
1592 | @@ -174,7 +174,12 @@ static int ufs_link (struct dentry * old_dentry, struct inode * dir, |
1593 | inode_inc_link_count(inode); |
1594 | ihold(inode); |
1595 | |
1596 | - error = ufs_add_nondir(dentry, inode); |
1597 | + error = ufs_add_link(dentry, inode); |
1598 | + if (error) { |
1599 | + inode_dec_link_count(inode); |
1600 | + iput(inode); |
1601 | + } else |
1602 | + d_instantiate(dentry, inode); |
1603 | unlock_ufs(dir->i_sb); |
1604 | return error; |
1605 | } |
1606 | @@ -184,9 +189,13 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode) |
1607 | struct inode * inode; |
1608 | int err; |
1609 | |
1610 | + lock_ufs(dir->i_sb); |
1611 | + inode_inc_link_count(dir); |
1612 | + |
1613 | inode = ufs_new_inode(dir, S_IFDIR|mode); |
1614 | + err = PTR_ERR(inode); |
1615 | if (IS_ERR(inode)) |
1616 | - return PTR_ERR(inode); |
1617 | + goto out_dir; |
1618 | |
1619 | inode->i_op = &ufs_dir_inode_operations; |
1620 | inode->i_fop = &ufs_dir_operations; |
1621 | @@ -194,9 +203,6 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode) |
1622 | |
1623 | inode_inc_link_count(inode); |
1624 | |
1625 | - lock_ufs(dir->i_sb); |
1626 | - inode_inc_link_count(dir); |
1627 | - |
1628 | err = ufs_make_empty(inode, dir); |
1629 | if (err) |
1630 | goto out_fail; |
1631 | @@ -206,6 +212,7 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode) |
1632 | goto out_fail; |
1633 | unlock_ufs(dir->i_sb); |
1634 | |
1635 | + unlock_new_inode(inode); |
1636 | d_instantiate(dentry, inode); |
1637 | out: |
1638 | return err; |
1639 | @@ -215,6 +222,7 @@ out_fail: |
1640 | inode_dec_link_count(inode); |
1641 | unlock_new_inode(inode); |
1642 | iput (inode); |
1643 | +out_dir: |
1644 | inode_dec_link_count(dir); |
1645 | unlock_ufs(dir->i_sb); |
1646 | goto out; |
1647 | diff --git a/fs/ufs/super.c b/fs/ufs/super.c |
1648 | index b3bc3e7ae79d..dc33f9416340 100644 |
1649 | --- a/fs/ufs/super.c |
1650 | +++ b/fs/ufs/super.c |
1651 | @@ -694,6 +694,7 @@ static int ufs_sync_fs(struct super_block *sb, int wait) |
1652 | unsigned flags; |
1653 | |
1654 | lock_ufs(sb); |
1655 | + mutex_lock(&UFS_SB(sb)->s_lock); |
1656 | |
1657 | UFSD("ENTER\n"); |
1658 | |
1659 | @@ -711,6 +712,7 @@ static int ufs_sync_fs(struct super_block *sb, int wait) |
1660 | ufs_put_cstotal(sb); |
1661 | |
1662 | UFSD("EXIT\n"); |
1663 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1664 | unlock_ufs(sb); |
1665 | |
1666 | return 0; |
1667 | @@ -799,6 +801,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) |
1668 | UFSD("flag %u\n", (int)(sb->s_flags & MS_RDONLY)); |
1669 | |
1670 | mutex_init(&sbi->mutex); |
1671 | + mutex_init(&sbi->s_lock); |
1672 | spin_lock_init(&sbi->work_lock); |
1673 | INIT_DELAYED_WORK(&sbi->sync_work, delayed_sync_fs); |
1674 | /* |
1675 | @@ -1277,6 +1280,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) |
1676 | |
1677 | sync_filesystem(sb); |
1678 | lock_ufs(sb); |
1679 | + mutex_lock(&UFS_SB(sb)->s_lock); |
1680 | uspi = UFS_SB(sb)->s_uspi; |
1681 | flags = UFS_SB(sb)->s_flags; |
1682 | usb1 = ubh_get_usb_first(uspi); |
1683 | @@ -1290,6 +1294,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) |
1684 | new_mount_opt = 0; |
1685 | ufs_set_opt (new_mount_opt, ONERROR_LOCK); |
1686 | if (!ufs_parse_options (data, &new_mount_opt)) { |
1687 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1688 | unlock_ufs(sb); |
1689 | return -EINVAL; |
1690 | } |
1691 | @@ -1297,12 +1302,14 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) |
1692 | new_mount_opt |= ufstype; |
1693 | } else if ((new_mount_opt & UFS_MOUNT_UFSTYPE) != ufstype) { |
1694 | pr_err("ufstype can't be changed during remount\n"); |
1695 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1696 | unlock_ufs(sb); |
1697 | return -EINVAL; |
1698 | } |
1699 | |
1700 | if ((*mount_flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { |
1701 | UFS_SB(sb)->s_mount_opt = new_mount_opt; |
1702 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1703 | unlock_ufs(sb); |
1704 | return 0; |
1705 | } |
1706 | @@ -1326,6 +1333,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) |
1707 | */ |
1708 | #ifndef CONFIG_UFS_FS_WRITE |
1709 | pr_err("ufs was compiled with read-only support, can't be mounted as read-write\n"); |
1710 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1711 | unlock_ufs(sb); |
1712 | return -EINVAL; |
1713 | #else |
1714 | @@ -1335,11 +1343,13 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) |
1715 | ufstype != UFS_MOUNT_UFSTYPE_SUNx86 && |
1716 | ufstype != UFS_MOUNT_UFSTYPE_UFS2) { |
1717 | pr_err("this ufstype is read-only supported\n"); |
1718 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1719 | unlock_ufs(sb); |
1720 | return -EINVAL; |
1721 | } |
1722 | if (!ufs_read_cylinder_structures(sb)) { |
1723 | pr_err("failed during remounting\n"); |
1724 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1725 | unlock_ufs(sb); |
1726 | return -EPERM; |
1727 | } |
1728 | @@ -1347,6 +1357,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) |
1729 | #endif |
1730 | } |
1731 | UFS_SB(sb)->s_mount_opt = new_mount_opt; |
1732 | + mutex_unlock(&UFS_SB(sb)->s_lock); |
1733 | unlock_ufs(sb); |
1734 | return 0; |
1735 | } |
1736 | diff --git a/fs/ufs/ufs.h b/fs/ufs/ufs.h |
1737 | index 2a07396d5f9e..cf6368d42d4a 100644 |
1738 | --- a/fs/ufs/ufs.h |
1739 | +++ b/fs/ufs/ufs.h |
1740 | @@ -30,6 +30,7 @@ struct ufs_sb_info { |
1741 | int work_queued; /* non-zero if the delayed work is queued */ |
1742 | struct delayed_work sync_work; /* FS sync delayed work */ |
1743 | spinlock_t work_lock; /* protects sync_work and work_queued */ |
1744 | + struct mutex s_lock; |
1745 | }; |
1746 | |
1747 | struct ufs_inode_info { |
1748 | diff --git a/include/net/netns/sctp.h b/include/net/netns/sctp.h |
1749 | index 3573a81815ad..8ba379f9e467 100644 |
1750 | --- a/include/net/netns/sctp.h |
1751 | +++ b/include/net/netns/sctp.h |
1752 | @@ -31,6 +31,7 @@ struct netns_sctp { |
1753 | struct list_head addr_waitq; |
1754 | struct timer_list addr_wq_timer; |
1755 | struct list_head auto_asconf_splist; |
1756 | + /* Lock that protects both addr_waitq and auto_asconf_splist */ |
1757 | spinlock_t addr_wq_lock; |
1758 | |
1759 | /* Lock that protects the local_addr_list writers */ |
1760 | diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h |
1761 | index 2bb2fcf5b11f..495c87e367b3 100644 |
1762 | --- a/include/net/sctp/structs.h |
1763 | +++ b/include/net/sctp/structs.h |
1764 | @@ -223,6 +223,10 @@ struct sctp_sock { |
1765 | atomic_t pd_mode; |
1766 | /* Receive to here while partial delivery is in effect. */ |
1767 | struct sk_buff_head pd_lobby; |
1768 | + |
1769 | + /* These must be the last fields, as they will skipped on copies, |
1770 | + * like on accept and peeloff operations |
1771 | + */ |
1772 | struct list_head auto_asconf_list; |
1773 | int do_auto_asconf; |
1774 | }; |
1775 | diff --git a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c |
1776 | index a9a4a1b7863d..8d423bc649b9 100644 |
1777 | --- a/net/bridge/br_ioctl.c |
1778 | +++ b/net/bridge/br_ioctl.c |
1779 | @@ -247,9 +247,7 @@ static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) |
1780 | if (!ns_capable(dev_net(dev)->user_ns, CAP_NET_ADMIN)) |
1781 | return -EPERM; |
1782 | |
1783 | - spin_lock_bh(&br->lock); |
1784 | br_stp_set_bridge_priority(br, args[1]); |
1785 | - spin_unlock_bh(&br->lock); |
1786 | return 0; |
1787 | |
1788 | case BRCTL_SET_PORT_PRIORITY: |
1789 | diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c |
1790 | index 41146872c1b4..7832d07f48f6 100644 |
1791 | --- a/net/bridge/br_stp_if.c |
1792 | +++ b/net/bridge/br_stp_if.c |
1793 | @@ -243,12 +243,13 @@ bool br_stp_recalculate_bridge_id(struct net_bridge *br) |
1794 | return true; |
1795 | } |
1796 | |
1797 | -/* called under bridge lock */ |
1798 | +/* Acquires and releases bridge lock */ |
1799 | void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio) |
1800 | { |
1801 | struct net_bridge_port *p; |
1802 | int wasroot; |
1803 | |
1804 | + spin_lock_bh(&br->lock); |
1805 | wasroot = br_is_root_bridge(br); |
1806 | |
1807 | list_for_each_entry(p, &br->port_list, list) { |
1808 | @@ -266,6 +267,7 @@ void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio) |
1809 | br_port_state_selection(br); |
1810 | if (br_is_root_bridge(br) && !wasroot) |
1811 | br_become_root_bridge(br); |
1812 | + spin_unlock_bh(&br->lock); |
1813 | } |
1814 | |
1815 | /* called under bridge lock */ |
1816 | diff --git a/net/can/af_can.c b/net/can/af_can.c |
1817 | index 32d710eaf1fc..689c818ed007 100644 |
1818 | --- a/net/can/af_can.c |
1819 | +++ b/net/can/af_can.c |
1820 | @@ -310,8 +310,12 @@ int can_send(struct sk_buff *skb, int loop) |
1821 | return err; |
1822 | } |
1823 | |
1824 | - if (newskb) |
1825 | + if (newskb) { |
1826 | + if (!(newskb->tstamp.tv64)) |
1827 | + __net_timestamp(newskb); |
1828 | + |
1829 | netif_rx_ni(newskb); |
1830 | + } |
1831 | |
1832 | /* update statistics */ |
1833 | can_stats.tx_frames++; |
1834 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c |
1835 | index 3de654256028..2237c1b3cdd2 100644 |
1836 | --- a/net/core/neighbour.c |
1837 | +++ b/net/core/neighbour.c |
1838 | @@ -957,6 +957,8 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) |
1839 | rc = 0; |
1840 | if (neigh->nud_state & (NUD_CONNECTED | NUD_DELAY | NUD_PROBE)) |
1841 | goto out_unlock_bh; |
1842 | + if (neigh->dead) |
1843 | + goto out_dead; |
1844 | |
1845 | if (!(neigh->nud_state & (NUD_STALE | NUD_INCOMPLETE))) { |
1846 | if (NEIGH_VAR(neigh->parms, MCAST_PROBES) + |
1847 | @@ -1013,6 +1015,13 @@ out_unlock_bh: |
1848 | write_unlock(&neigh->lock); |
1849 | local_bh_enable(); |
1850 | return rc; |
1851 | + |
1852 | +out_dead: |
1853 | + if (neigh->nud_state & NUD_STALE) |
1854 | + goto out_unlock_bh; |
1855 | + write_unlock_bh(&neigh->lock); |
1856 | + kfree_skb(skb); |
1857 | + return 1; |
1858 | } |
1859 | EXPORT_SYMBOL(__neigh_event_send); |
1860 | |
1861 | @@ -1076,6 +1085,8 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, |
1862 | if (!(flags & NEIGH_UPDATE_F_ADMIN) && |
1863 | (old & (NUD_NOARP | NUD_PERMANENT))) |
1864 | goto out; |
1865 | + if (neigh->dead) |
1866 | + goto out; |
1867 | |
1868 | if (!(new & NUD_VALID)) { |
1869 | neigh_del_timer(neigh); |
1870 | @@ -1225,6 +1236,8 @@ EXPORT_SYMBOL(neigh_update); |
1871 | */ |
1872 | void __neigh_set_probe_once(struct neighbour *neigh) |
1873 | { |
1874 | + if (neigh->dead) |
1875 | + return; |
1876 | neigh->updated = jiffies; |
1877 | if (!(neigh->nud_state & NUD_FAILED)) |
1878 | return; |
1879 | diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c |
1880 | index 8b47a4d79d04..a5aa54ea6533 100644 |
1881 | --- a/net/ipv4/af_inet.c |
1882 | +++ b/net/ipv4/af_inet.c |
1883 | @@ -228,6 +228,8 @@ int inet_listen(struct socket *sock, int backlog) |
1884 | err = 0; |
1885 | if (err) |
1886 | goto out; |
1887 | + |
1888 | + tcp_fastopen_init_key_once(true); |
1889 | } |
1890 | err = inet_csk_listen_start(sk, backlog); |
1891 | if (err) |
1892 | diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c |
1893 | index 7cfb0893f263..6ddde89996f4 100644 |
1894 | --- a/net/ipv4/ip_sockglue.c |
1895 | +++ b/net/ipv4/ip_sockglue.c |
1896 | @@ -432,6 +432,15 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf |
1897 | kfree_skb(skb); |
1898 | } |
1899 | |
1900 | +/* For some errors we have valid addr_offset even with zero payload and |
1901 | + * zero port. Also, addr_offset should be supported if port is set. |
1902 | + */ |
1903 | +static inline bool ipv4_datagram_support_addr(struct sock_exterr_skb *serr) |
1904 | +{ |
1905 | + return serr->ee.ee_origin == SO_EE_ORIGIN_ICMP || |
1906 | + serr->ee.ee_origin == SO_EE_ORIGIN_LOCAL || serr->port; |
1907 | +} |
1908 | + |
1909 | /* IPv4 supports cmsg on all imcp errors and some timestamps |
1910 | * |
1911 | * Timestamp code paths do not initialize the fields expected by cmsg: |
1912 | @@ -498,7 +507,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) |
1913 | |
1914 | serr = SKB_EXT_ERR(skb); |
1915 | |
1916 | - if (sin && serr->port) { |
1917 | + if (sin && ipv4_datagram_support_addr(serr)) { |
1918 | sin->sin_family = AF_INET; |
1919 | sin->sin_addr.s_addr = *(__be32 *)(skb_network_header(skb) + |
1920 | serr->addr_offset); |
1921 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
1922 | index f1377f2a0472..bb2ce74f6004 100644 |
1923 | --- a/net/ipv4/tcp.c |
1924 | +++ b/net/ipv4/tcp.c |
1925 | @@ -2545,10 +2545,13 @@ static int do_tcp_setsockopt(struct sock *sk, int level, |
1926 | |
1927 | case TCP_FASTOPEN: |
1928 | if (val >= 0 && ((1 << sk->sk_state) & (TCPF_CLOSE | |
1929 | - TCPF_LISTEN))) |
1930 | + TCPF_LISTEN))) { |
1931 | + tcp_fastopen_init_key_once(true); |
1932 | + |
1933 | err = fastopen_init_queue(sk, val); |
1934 | - else |
1935 | + } else { |
1936 | err = -EINVAL; |
1937 | + } |
1938 | break; |
1939 | case TCP_TIMESTAMP: |
1940 | if (!tp->repair) |
1941 | diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c |
1942 | index 46b087a27503..f9c0fb84e435 100644 |
1943 | --- a/net/ipv4/tcp_fastopen.c |
1944 | +++ b/net/ipv4/tcp_fastopen.c |
1945 | @@ -78,8 +78,6 @@ static bool __tcp_fastopen_cookie_gen(const void *path, |
1946 | struct tcp_fastopen_context *ctx; |
1947 | bool ok = false; |
1948 | |
1949 | - tcp_fastopen_init_key_once(true); |
1950 | - |
1951 | rcu_read_lock(); |
1952 | ctx = rcu_dereference(tcp_fastopen_ctx); |
1953 | if (ctx) { |
1954 | diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c |
1955 | index 762a58c772b8..62d908e64eeb 100644 |
1956 | --- a/net/ipv6/datagram.c |
1957 | +++ b/net/ipv6/datagram.c |
1958 | @@ -325,6 +325,16 @@ void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu) |
1959 | kfree_skb(skb); |
1960 | } |
1961 | |
1962 | +/* For some errors we have valid addr_offset even with zero payload and |
1963 | + * zero port. Also, addr_offset should be supported if port is set. |
1964 | + */ |
1965 | +static inline bool ipv6_datagram_support_addr(struct sock_exterr_skb *serr) |
1966 | +{ |
1967 | + return serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6 || |
1968 | + serr->ee.ee_origin == SO_EE_ORIGIN_ICMP || |
1969 | + serr->ee.ee_origin == SO_EE_ORIGIN_LOCAL || serr->port; |
1970 | +} |
1971 | + |
1972 | /* IPv6 supports cmsg on all origins aside from SO_EE_ORIGIN_LOCAL. |
1973 | * |
1974 | * At one point, excluding local errors was a quick test to identify icmp/icmp6 |
1975 | @@ -389,7 +399,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len) |
1976 | |
1977 | serr = SKB_EXT_ERR(skb); |
1978 | |
1979 | - if (sin && serr->port) { |
1980 | + if (sin && ipv6_datagram_support_addr(serr)) { |
1981 | const unsigned char *nh = skb_network_header(skb); |
1982 | sin->sin6_family = AF_INET6; |
1983 | sin->sin6_flowinfo = 0; |
1984 | diff --git a/net/mac80211/key.c b/net/mac80211/key.c |
1985 | index a907f2d5c12d..81e9785f38bc 100644 |
1986 | --- a/net/mac80211/key.c |
1987 | +++ b/net/mac80211/key.c |
1988 | @@ -66,12 +66,15 @@ update_vlan_tailroom_need_count(struct ieee80211_sub_if_data *sdata, int delta) |
1989 | if (sdata->vif.type != NL80211_IFTYPE_AP) |
1990 | return; |
1991 | |
1992 | - mutex_lock(&sdata->local->mtx); |
1993 | + /* crypto_tx_tailroom_needed_cnt is protected by this */ |
1994 | + assert_key_lock(sdata->local); |
1995 | + |
1996 | + rcu_read_lock(); |
1997 | |
1998 | - list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) |
1999 | + list_for_each_entry_rcu(vlan, &sdata->u.ap.vlans, u.vlan.list) |
2000 | vlan->crypto_tx_tailroom_needed_cnt += delta; |
2001 | |
2002 | - mutex_unlock(&sdata->local->mtx); |
2003 | + rcu_read_unlock(); |
2004 | } |
2005 | |
2006 | static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata) |
2007 | @@ -95,6 +98,8 @@ static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata) |
2008 | * http://mid.gmane.org/1308590980.4322.19.camel@jlt3.sipsolutions.net |
2009 | */ |
2010 | |
2011 | + assert_key_lock(sdata->local); |
2012 | + |
2013 | update_vlan_tailroom_need_count(sdata, 1); |
2014 | |
2015 | if (!sdata->crypto_tx_tailroom_needed_cnt++) { |
2016 | @@ -109,6 +114,8 @@ static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata) |
2017 | static void decrease_tailroom_need_count(struct ieee80211_sub_if_data *sdata, |
2018 | int delta) |
2019 | { |
2020 | + assert_key_lock(sdata->local); |
2021 | + |
2022 | WARN_ON_ONCE(sdata->crypto_tx_tailroom_needed_cnt < delta); |
2023 | |
2024 | update_vlan_tailroom_need_count(sdata, -delta); |
2025 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
2026 | index b5989c6ee551..fe1610ddeacf 100644 |
2027 | --- a/net/packet/af_packet.c |
2028 | +++ b/net/packet/af_packet.c |
2029 | @@ -1272,16 +1272,6 @@ static void packet_sock_destruct(struct sock *sk) |
2030 | sk_refcnt_debug_dec(sk); |
2031 | } |
2032 | |
2033 | -static int fanout_rr_next(struct packet_fanout *f, unsigned int num) |
2034 | -{ |
2035 | - int x = atomic_read(&f->rr_cur) + 1; |
2036 | - |
2037 | - if (x >= num) |
2038 | - x = 0; |
2039 | - |
2040 | - return x; |
2041 | -} |
2042 | - |
2043 | static unsigned int fanout_demux_hash(struct packet_fanout *f, |
2044 | struct sk_buff *skb, |
2045 | unsigned int num) |
2046 | @@ -1293,13 +1283,9 @@ static unsigned int fanout_demux_lb(struct packet_fanout *f, |
2047 | struct sk_buff *skb, |
2048 | unsigned int num) |
2049 | { |
2050 | - int cur, old; |
2051 | + unsigned int val = atomic_inc_return(&f->rr_cur); |
2052 | |
2053 | - cur = atomic_read(&f->rr_cur); |
2054 | - while ((old = atomic_cmpxchg(&f->rr_cur, cur, |
2055 | - fanout_rr_next(f, num))) != cur) |
2056 | - cur = old; |
2057 | - return cur; |
2058 | + return val % num; |
2059 | } |
2060 | |
2061 | static unsigned int fanout_demux_cpu(struct packet_fanout *f, |
2062 | @@ -1353,7 +1339,7 @@ static int packet_rcv_fanout(struct sk_buff *skb, struct net_device *dev, |
2063 | struct packet_type *pt, struct net_device *orig_dev) |
2064 | { |
2065 | struct packet_fanout *f = pt->af_packet_priv; |
2066 | - unsigned int num = f->num_members; |
2067 | + unsigned int num = READ_ONCE(f->num_members); |
2068 | struct packet_sock *po; |
2069 | unsigned int idx; |
2070 | |
2071 | diff --git a/net/sctp/output.c b/net/sctp/output.c |
2072 | index fc5e45b8a832..abe7c2db2412 100644 |
2073 | --- a/net/sctp/output.c |
2074 | +++ b/net/sctp/output.c |
2075 | @@ -599,7 +599,9 @@ out: |
2076 | return err; |
2077 | no_route: |
2078 | kfree_skb(nskb); |
2079 | - IP_INC_STATS(sock_net(asoc->base.sk), IPSTATS_MIB_OUTNOROUTES); |
2080 | + |
2081 | + if (asoc) |
2082 | + IP_INC_STATS(sock_net(asoc->base.sk), IPSTATS_MIB_OUTNOROUTES); |
2083 | |
2084 | /* FIXME: Returning the 'err' will effect all the associations |
2085 | * associated with a socket, although only one of the paths of the |
2086 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
2087 | index f09de7fac2e6..5f6c4e61325b 100644 |
2088 | --- a/net/sctp/socket.c |
2089 | +++ b/net/sctp/socket.c |
2090 | @@ -1528,8 +1528,10 @@ static void sctp_close(struct sock *sk, long timeout) |
2091 | |
2092 | /* Supposedly, no process has access to the socket, but |
2093 | * the net layers still may. |
2094 | + * Also, sctp_destroy_sock() needs to be called with addr_wq_lock |
2095 | + * held and that should be grabbed before socket lock. |
2096 | */ |
2097 | - local_bh_disable(); |
2098 | + spin_lock_bh(&net->sctp.addr_wq_lock); |
2099 | bh_lock_sock(sk); |
2100 | |
2101 | /* Hold the sock, since sk_common_release() will put sock_put() |
2102 | @@ -1539,7 +1541,7 @@ static void sctp_close(struct sock *sk, long timeout) |
2103 | sk_common_release(sk); |
2104 | |
2105 | bh_unlock_sock(sk); |
2106 | - local_bh_enable(); |
2107 | + spin_unlock_bh(&net->sctp.addr_wq_lock); |
2108 | |
2109 | sock_put(sk); |
2110 | |
2111 | @@ -3580,6 +3582,7 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval, |
2112 | if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf)) |
2113 | return 0; |
2114 | |
2115 | + spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock); |
2116 | if (val == 0 && sp->do_auto_asconf) { |
2117 | list_del(&sp->auto_asconf_list); |
2118 | sp->do_auto_asconf = 0; |
2119 | @@ -3588,6 +3591,7 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval, |
2120 | &sock_net(sk)->sctp.auto_asconf_splist); |
2121 | sp->do_auto_asconf = 1; |
2122 | } |
2123 | + spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock); |
2124 | return 0; |
2125 | } |
2126 | |
2127 | @@ -4121,18 +4125,28 @@ static int sctp_init_sock(struct sock *sk) |
2128 | local_bh_disable(); |
2129 | percpu_counter_inc(&sctp_sockets_allocated); |
2130 | sock_prot_inuse_add(net, sk->sk_prot, 1); |
2131 | + |
2132 | + /* Nothing can fail after this block, otherwise |
2133 | + * sctp_destroy_sock() will be called without addr_wq_lock held |
2134 | + */ |
2135 | if (net->sctp.default_auto_asconf) { |
2136 | + spin_lock(&sock_net(sk)->sctp.addr_wq_lock); |
2137 | list_add_tail(&sp->auto_asconf_list, |
2138 | &net->sctp.auto_asconf_splist); |
2139 | sp->do_auto_asconf = 1; |
2140 | - } else |
2141 | + spin_unlock(&sock_net(sk)->sctp.addr_wq_lock); |
2142 | + } else { |
2143 | sp->do_auto_asconf = 0; |
2144 | + } |
2145 | + |
2146 | local_bh_enable(); |
2147 | |
2148 | return 0; |
2149 | } |
2150 | |
2151 | -/* Cleanup any SCTP per socket resources. */ |
2152 | +/* Cleanup any SCTP per socket resources. Must be called with |
2153 | + * sock_net(sk)->sctp.addr_wq_lock held if sp->do_auto_asconf is true |
2154 | + */ |
2155 | static void sctp_destroy_sock(struct sock *sk) |
2156 | { |
2157 | struct sctp_sock *sp; |
2158 | @@ -7195,6 +7209,19 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk, |
2159 | newinet->mc_list = NULL; |
2160 | } |
2161 | |
2162 | +static inline void sctp_copy_descendant(struct sock *sk_to, |
2163 | + const struct sock *sk_from) |
2164 | +{ |
2165 | + int ancestor_size = sizeof(struct inet_sock) + |
2166 | + sizeof(struct sctp_sock) - |
2167 | + offsetof(struct sctp_sock, auto_asconf_list); |
2168 | + |
2169 | + if (sk_from->sk_family == PF_INET6) |
2170 | + ancestor_size += sizeof(struct ipv6_pinfo); |
2171 | + |
2172 | + __inet_sk_copy_descendant(sk_to, sk_from, ancestor_size); |
2173 | +} |
2174 | + |
2175 | /* Populate the fields of the newsk from the oldsk and migrate the assoc |
2176 | * and its messages to the newsk. |
2177 | */ |
2178 | @@ -7209,7 +7236,6 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, |
2179 | struct sk_buff *skb, *tmp; |
2180 | struct sctp_ulpevent *event; |
2181 | struct sctp_bind_hashbucket *head; |
2182 | - struct list_head tmplist; |
2183 | |
2184 | /* Migrate socket buffer sizes and all the socket level options to the |
2185 | * new socket. |
2186 | @@ -7217,12 +7243,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, |
2187 | newsk->sk_sndbuf = oldsk->sk_sndbuf; |
2188 | newsk->sk_rcvbuf = oldsk->sk_rcvbuf; |
2189 | /* Brute force copy old sctp opt. */ |
2190 | - if (oldsp->do_auto_asconf) { |
2191 | - memcpy(&tmplist, &newsp->auto_asconf_list, sizeof(tmplist)); |
2192 | - inet_sk_copy_descendant(newsk, oldsk); |
2193 | - memcpy(&newsp->auto_asconf_list, &tmplist, sizeof(tmplist)); |
2194 | - } else |
2195 | - inet_sk_copy_descendant(newsk, oldsk); |
2196 | + sctp_copy_descendant(newsk, oldsk); |
2197 | |
2198 | /* Restore the ep value that was overwritten with the above structure |
2199 | * copy. |
2200 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c |
2201 | index 7dade28affba..212070e1de1a 100644 |
2202 | --- a/security/selinux/hooks.c |
2203 | +++ b/security/selinux/hooks.c |
2204 | @@ -403,6 +403,7 @@ static int selinux_is_sblabel_mnt(struct super_block *sb) |
2205 | return sbsec->behavior == SECURITY_FS_USE_XATTR || |
2206 | sbsec->behavior == SECURITY_FS_USE_TRANS || |
2207 | sbsec->behavior == SECURITY_FS_USE_TASK || |
2208 | + sbsec->behavior == SECURITY_FS_USE_NATIVE || |
2209 | /* Special handling. Genfs but also in-core setxattr handler */ |
2210 | !strcmp(sb->s_type->name, "sysfs") || |
2211 | !strcmp(sb->s_type->name, "pstore") || |
2212 | diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c |
2213 | index 78fb8201014f..950064a0942d 100644 |
2214 | --- a/virt/kvm/arm/vgic.c |
2215 | +++ b/virt/kvm/arm/vgic.c |
2216 | @@ -1561,7 +1561,7 @@ int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int irq_num, |
2217 | goto out; |
2218 | } |
2219 | |
2220 | - if (irq_num >= kvm->arch.vgic.nr_irqs) |
2221 | + if (irq_num >= min(kvm->arch.vgic.nr_irqs, 1020)) |
2222 | return -EINVAL; |
2223 | |
2224 | vcpu_id = vgic_update_irq_pending(kvm, cpuid, irq_num, level); |
2225 | @@ -2161,10 +2161,7 @@ int kvm_set_irq(struct kvm *kvm, int irq_source_id, |
2226 | |
2227 | BUG_ON(!vgic_initialized(kvm)); |
2228 | |
2229 | - if (spi > kvm->arch.vgic.nr_irqs) |
2230 | - return -EINVAL; |
2231 | return kvm_vgic_inject_irq(kvm, 0, spi, level); |
2232 | - |
2233 | } |
2234 | |
2235 | /* MSI not implemented yet */ |