diff options
author | David S. Miller <davem@davemloft.net> | 2019-06-28 00:06:39 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-06-28 00:06:39 -0400 |
commit | d96ff269a04be286989ead13bf8b4be55bdee8ee (patch) | |
tree | 46b6d010a9a4dfe96dc86339d1cbded8874c6b8f | |
parent | 3a49584477ff4c8838833be9f3b7cc13f0f7c0d3 (diff) | |
parent | 556e2f6020bf90f63c5dd65e9a2254be6db3185b (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
The new route handling in ip_mc_finish_output() from 'net' overlapped
with the new support for returning congestion notifications from BPF
programs.
In order to handle this I had to take the dev_loopback_xmit() calls
out of the switch statement.
The aquantia driver conflicts were simple overlapping changes.
Signed-off-by: David S. Miller <davem@davemloft.net>
101 files changed, 719 insertions, 276 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index a6d9bbe526bc..b4304d10f14e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -3131,6 +3131,7 @@ F: arch/arm/mach-bcm/ | |||
3131 | BROADCOM BCM2835 ARM ARCHITECTURE | 3131 | BROADCOM BCM2835 ARM ARCHITECTURE |
3132 | M: Eric Anholt <eric@anholt.net> | 3132 | M: Eric Anholt <eric@anholt.net> |
3133 | M: Stefan Wahren <wahrenst@gmx.net> | 3133 | M: Stefan Wahren <wahrenst@gmx.net> |
3134 | L: bcm-kernel-feedback-list@broadcom.com | ||
3134 | L: linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers) | 3135 | L: linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers) |
3135 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 3136 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
3136 | T: git git://github.com/anholt/linux | 3137 | T: git git://github.com/anholt/linux |
@@ -3160,6 +3161,7 @@ F: arch/arm/boot/dts/bcm953012* | |||
3160 | 3161 | ||
3161 | BROADCOM BCM53573 ARM ARCHITECTURE | 3162 | BROADCOM BCM53573 ARM ARCHITECTURE |
3162 | M: Rafał Miłecki <rafal@milecki.pl> | 3163 | M: Rafał Miłecki <rafal@milecki.pl> |
3164 | L: bcm-kernel-feedback-list@broadcom.com | ||
3163 | L: linux-arm-kernel@lists.infradead.org | 3165 | L: linux-arm-kernel@lists.infradead.org |
3164 | S: Maintained | 3166 | S: Maintained |
3165 | F: arch/arm/boot/dts/bcm53573* | 3167 | F: arch/arm/boot/dts/bcm53573* |
@@ -2,7 +2,7 @@ | |||
2 | VERSION = 5 | 2 | VERSION = 5 |
3 | PATCHLEVEL = 2 | 3 | PATCHLEVEL = 2 |
4 | SUBLEVEL = 0 | 4 | SUBLEVEL = 0 |
5 | EXTRAVERSION = -rc5 | 5 | EXTRAVERSION = -rc6 |
6 | NAME = Golden Lions | 6 | NAME = Golden Lions |
7 | 7 | ||
8 | # *DOCUMENTATION* | 8 | # *DOCUMENTATION* |
diff --git a/arch/arm/boot/dts/gemini-dlink-dir-685.dts b/arch/arm/boot/dts/gemini-dlink-dir-685.dts index cfbfbc91a1e1..3613f05f8a80 100644 --- a/arch/arm/boot/dts/gemini-dlink-dir-685.dts +++ b/arch/arm/boot/dts/gemini-dlink-dir-685.dts | |||
@@ -20,7 +20,7 @@ | |||
20 | }; | 20 | }; |
21 | 21 | ||
22 | chosen { | 22 | chosen { |
23 | bootargs = "console=ttyS0,19200n8 root=/dev/sda1 rw rootwait"; | 23 | bootargs = "console=ttyS0,19200n8 root=/dev/sda1 rw rootwait consoleblank=300"; |
24 | stdout-path = "uart0:19200n8"; | 24 | stdout-path = "uart0:19200n8"; |
25 | }; | 25 | }; |
26 | 26 | ||
diff --git a/arch/arm/boot/dts/gemini-dlink-dns-313.dts b/arch/arm/boot/dts/gemini-dlink-dns-313.dts index b12504e10f0b..360642a02a48 100644 --- a/arch/arm/boot/dts/gemini-dlink-dns-313.dts +++ b/arch/arm/boot/dts/gemini-dlink-dns-313.dts | |||
@@ -11,7 +11,7 @@ | |||
11 | 11 | ||
12 | / { | 12 | / { |
13 | model = "D-Link DNS-313 1-Bay Network Storage Enclosure"; | 13 | model = "D-Link DNS-313 1-Bay Network Storage Enclosure"; |
14 | compatible = "dlink,dir-313", "cortina,gemini"; | 14 | compatible = "dlink,dns-313", "cortina,gemini"; |
15 | #address-cells = <1>; | 15 | #address-cells = <1>; |
16 | #size-cells = <1>; | 16 | #size-cells = <1>; |
17 | 17 | ||
diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi index bbf010c73336..a7f6d1d58e20 100644 --- a/arch/arm/boot/dts/imx6ul.dtsi +++ b/arch/arm/boot/dts/imx6ul.dtsi | |||
@@ -358,7 +358,7 @@ | |||
358 | pwm1: pwm@2080000 { | 358 | pwm1: pwm@2080000 { |
359 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; | 359 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; |
360 | reg = <0x02080000 0x4000>; | 360 | reg = <0x02080000 0x4000>; |
361 | interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>; | 361 | interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; |
362 | clocks = <&clks IMX6UL_CLK_PWM1>, | 362 | clocks = <&clks IMX6UL_CLK_PWM1>, |
363 | <&clks IMX6UL_CLK_PWM1>; | 363 | <&clks IMX6UL_CLK_PWM1>; |
364 | clock-names = "ipg", "per"; | 364 | clock-names = "ipg", "per"; |
@@ -369,7 +369,7 @@ | |||
369 | pwm2: pwm@2084000 { | 369 | pwm2: pwm@2084000 { |
370 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; | 370 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; |
371 | reg = <0x02084000 0x4000>; | 371 | reg = <0x02084000 0x4000>; |
372 | interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>; | 372 | interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>; |
373 | clocks = <&clks IMX6UL_CLK_PWM2>, | 373 | clocks = <&clks IMX6UL_CLK_PWM2>, |
374 | <&clks IMX6UL_CLK_PWM2>; | 374 | <&clks IMX6UL_CLK_PWM2>; |
375 | clock-names = "ipg", "per"; | 375 | clock-names = "ipg", "per"; |
@@ -380,7 +380,7 @@ | |||
380 | pwm3: pwm@2088000 { | 380 | pwm3: pwm@2088000 { |
381 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; | 381 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; |
382 | reg = <0x02088000 0x4000>; | 382 | reg = <0x02088000 0x4000>; |
383 | interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>; | 383 | interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>; |
384 | clocks = <&clks IMX6UL_CLK_PWM3>, | 384 | clocks = <&clks IMX6UL_CLK_PWM3>, |
385 | <&clks IMX6UL_CLK_PWM3>; | 385 | <&clks IMX6UL_CLK_PWM3>; |
386 | clock-names = "ipg", "per"; | 386 | clock-names = "ipg", "per"; |
@@ -391,7 +391,7 @@ | |||
391 | pwm4: pwm@208c000 { | 391 | pwm4: pwm@208c000 { |
392 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; | 392 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; |
393 | reg = <0x0208c000 0x4000>; | 393 | reg = <0x0208c000 0x4000>; |
394 | interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>; | 394 | interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>; |
395 | clocks = <&clks IMX6UL_CLK_PWM4>, | 395 | clocks = <&clks IMX6UL_CLK_PWM4>, |
396 | <&clks IMX6UL_CLK_PWM4>; | 396 | <&clks IMX6UL_CLK_PWM4>; |
397 | clock-names = "ipg", "per"; | 397 | clock-names = "ipg", "per"; |
diff --git a/arch/arm/boot/dts/meson8.dtsi b/arch/arm/boot/dts/meson8.dtsi index 7ef442462ea4..40c11b6b217a 100644 --- a/arch/arm/boot/dts/meson8.dtsi +++ b/arch/arm/boot/dts/meson8.dtsi | |||
@@ -248,8 +248,8 @@ | |||
248 | <GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>, | 248 | <GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>, |
249 | <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>, | 249 | <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>, |
250 | <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>, | 250 | <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>, |
251 | <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>, | 251 | <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>, |
252 | <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>, | 252 | <GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>, |
253 | <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>, | 253 | <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>, |
254 | <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>, | 254 | <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>, |
255 | <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>, | 255 | <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>, |
@@ -264,7 +264,6 @@ | |||
264 | clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>; | 264 | clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>; |
265 | clock-names = "bus", "core"; | 265 | clock-names = "bus", "core"; |
266 | operating-points-v2 = <&gpu_opp_table>; | 266 | operating-points-v2 = <&gpu_opp_table>; |
267 | switch-delay = <0xffff>; | ||
268 | }; | 267 | }; |
269 | }; | 268 | }; |
270 | }; /* end of / */ | 269 | }; /* end of / */ |
diff --git a/arch/arm/boot/dts/meson8b.dtsi b/arch/arm/boot/dts/meson8b.dtsi index 800cd65fc50a..ec67f49116d9 100644 --- a/arch/arm/boot/dts/meson8b.dtsi +++ b/arch/arm/boot/dts/meson8b.dtsi | |||
@@ -163,23 +163,23 @@ | |||
163 | 163 | ||
164 | opp-255000000 { | 164 | opp-255000000 { |
165 | opp-hz = /bits/ 64 <255000000>; | 165 | opp-hz = /bits/ 64 <255000000>; |
166 | opp-microvolt = <1150000>; | 166 | opp-microvolt = <1100000>; |
167 | }; | 167 | }; |
168 | opp-364300000 { | 168 | opp-364300000 { |
169 | opp-hz = /bits/ 64 <364300000>; | 169 | opp-hz = /bits/ 64 <364300000>; |
170 | opp-microvolt = <1150000>; | 170 | opp-microvolt = <1100000>; |
171 | }; | 171 | }; |
172 | opp-425000000 { | 172 | opp-425000000 { |
173 | opp-hz = /bits/ 64 <425000000>; | 173 | opp-hz = /bits/ 64 <425000000>; |
174 | opp-microvolt = <1150000>; | 174 | opp-microvolt = <1100000>; |
175 | }; | 175 | }; |
176 | opp-510000000 { | 176 | opp-510000000 { |
177 | opp-hz = /bits/ 64 <510000000>; | 177 | opp-hz = /bits/ 64 <510000000>; |
178 | opp-microvolt = <1150000>; | 178 | opp-microvolt = <1100000>; |
179 | }; | 179 | }; |
180 | opp-637500000 { | 180 | opp-637500000 { |
181 | opp-hz = /bits/ 64 <637500000>; | 181 | opp-hz = /bits/ 64 <637500000>; |
182 | opp-microvolt = <1150000>; | 182 | opp-microvolt = <1100000>; |
183 | turbo-mode; | 183 | turbo-mode; |
184 | }; | 184 | }; |
185 | }; | 185 | }; |
@@ -229,7 +229,6 @@ | |||
229 | clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>; | 229 | clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>; |
230 | clock-names = "bus", "core"; | 230 | clock-names = "bus", "core"; |
231 | operating-points-v2 = <&gpu_opp_table>; | 231 | operating-points-v2 = <&gpu_opp_table>; |
232 | switch-delay = <0xffff>; | ||
233 | }; | 232 | }; |
234 | }; | 233 | }; |
235 | }; /* end of / */ | 234 | }; /* end of / */ |
diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c index fd4a3bf27993..1b442b128569 100644 --- a/arch/arm/mach-omap2/prm3xxx.c +++ b/arch/arm/mach-omap2/prm3xxx.c | |||
@@ -430,7 +430,7 @@ static void omap3_prm_reconfigure_io_chain(void) | |||
430 | * registers, and omap3xxx_prm_reconfigure_io_chain() must be called. | 430 | * registers, and omap3xxx_prm_reconfigure_io_chain() must be called. |
431 | * No return value. | 431 | * No return value. |
432 | */ | 432 | */ |
433 | static void __init omap3xxx_prm_enable_io_wakeup(void) | 433 | static void omap3xxx_prm_enable_io_wakeup(void) |
434 | { | 434 | { |
435 | if (prm_features & PRM_HAS_IO_WAKEUP) | 435 | if (prm_features & PRM_HAS_IO_WAKEUP) |
436 | omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, | 436 | omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, |
diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi index 4cdf84c63320..22a1c74dddf3 100644 --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi | |||
@@ -28,7 +28,7 @@ | |||
28 | enable-method = "psci"; | 28 | enable-method = "psci"; |
29 | clocks = <&clockgen 1 0>; | 29 | clocks = <&clockgen 1 0>; |
30 | next-level-cache = <&l2>; | 30 | next-level-cache = <&l2>; |
31 | cpu-idle-states = <&CPU_PH20>; | 31 | cpu-idle-states = <&CPU_PW20>; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | cpu1: cpu@1 { | 34 | cpu1: cpu@1 { |
@@ -38,7 +38,7 @@ | |||
38 | enable-method = "psci"; | 38 | enable-method = "psci"; |
39 | clocks = <&clockgen 1 0>; | 39 | clocks = <&clockgen 1 0>; |
40 | next-level-cache = <&l2>; | 40 | next-level-cache = <&l2>; |
41 | cpu-idle-states = <&CPU_PH20>; | 41 | cpu-idle-states = <&CPU_PW20>; |
42 | }; | 42 | }; |
43 | 43 | ||
44 | l2: l2-cache { | 44 | l2: l2-cache { |
@@ -53,13 +53,13 @@ | |||
53 | */ | 53 | */ |
54 | entry-method = "arm,psci"; | 54 | entry-method = "arm,psci"; |
55 | 55 | ||
56 | CPU_PH20: cpu-ph20 { | 56 | CPU_PW20: cpu-pw20 { |
57 | compatible = "arm,idle-state"; | 57 | compatible = "arm,idle-state"; |
58 | idle-state-name = "PH20"; | 58 | idle-state-name = "PW20"; |
59 | arm,psci-suspend-param = <0x00010000>; | 59 | arm,psci-suspend-param = <0x0>; |
60 | entry-latency-us = <1000>; | 60 | entry-latency-us = <2000>; |
61 | exit-latency-us = <1000>; | 61 | exit-latency-us = <2000>; |
62 | min-residency-us = <3000>; | 62 | min-residency-us = <6000>; |
63 | }; | 63 | }; |
64 | }; | 64 | }; |
65 | 65 | ||
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig index 4d583514258c..6bca5b082ea4 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig | |||
@@ -613,6 +613,7 @@ CONFIG_RTC_DRV_TEGRA=y | |||
613 | CONFIG_RTC_DRV_IMX_SC=m | 613 | CONFIG_RTC_DRV_IMX_SC=m |
614 | CONFIG_RTC_DRV_XGENE=y | 614 | CONFIG_RTC_DRV_XGENE=y |
615 | CONFIG_DMADEVICES=y | 615 | CONFIG_DMADEVICES=y |
616 | CONFIG_FSL_EDMA=y | ||
616 | CONFIG_DMA_BCM2835=m | 617 | CONFIG_DMA_BCM2835=m |
617 | CONFIG_K3_DMA=y | 618 | CONFIG_K3_DMA=y |
618 | CONFIG_MV_XOR=y | 619 | CONFIG_MV_XOR=y |
diff --git a/arch/csky/kernel/signal.c b/arch/csky/kernel/signal.c index 04a43cfd4e09..d47a3381aad8 100644 --- a/arch/csky/kernel/signal.c +++ b/arch/csky/kernel/signal.c | |||
@@ -39,6 +39,11 @@ static int save_fpu_state(struct sigcontext __user *sc) | |||
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | struct rt_sigframe { | 41 | struct rt_sigframe { |
42 | /* | ||
43 | * pad[3] is compatible with the same struct defined in | ||
44 | * gcc/libgcc/config/csky/linux-unwind.h | ||
45 | */ | ||
46 | int pad[3]; | ||
42 | struct siginfo info; | 47 | struct siginfo info; |
43 | struct ucontext uc; | 48 | struct ucontext uc; |
44 | }; | 49 | }; |
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index f241ded9239b..1f0f29a289d3 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
@@ -786,6 +786,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs, | |||
786 | /* 32-bit PC relative address */ | 786 | /* 32-bit PC relative address */ |
787 | *loc = val - dot - 8 + addend; | 787 | *loc = val - dot - 8 + addend; |
788 | break; | 788 | break; |
789 | case R_PARISC_PCREL64: | ||
790 | /* 64-bit PC relative address */ | ||
791 | *loc64 = val - dot - 8 + addend; | ||
792 | break; | ||
789 | case R_PARISC_DIR64: | 793 | case R_PARISC_DIR64: |
790 | /* 64-bit effective address */ | 794 | /* 64-bit effective address */ |
791 | *loc64 = val + addend; | 795 | *loc64 = val + addend; |
diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h index b8286a2013b4..0d52f57fca04 100644 --- a/arch/powerpc/include/asm/page.h +++ b/arch/powerpc/include/asm/page.h | |||
@@ -319,6 +319,13 @@ struct vm_area_struct; | |||
319 | #endif /* __ASSEMBLY__ */ | 319 | #endif /* __ASSEMBLY__ */ |
320 | #include <asm/slice.h> | 320 | #include <asm/slice.h> |
321 | 321 | ||
322 | /* | ||
323 | * Allow 30-bit DMA for very limited Broadcom wifi chips on many powerbooks. | ||
324 | */ | ||
325 | #ifdef CONFIG_PPC32 | ||
326 | #define ARCH_ZONE_DMA_BITS 30 | ||
327 | #else | ||
322 | #define ARCH_ZONE_DMA_BITS 31 | 328 | #define ARCH_ZONE_DMA_BITS 31 |
329 | #endif | ||
323 | 330 | ||
324 | #endif /* _ASM_POWERPC_PAGE_H */ | 331 | #endif /* _ASM_POWERPC_PAGE_H */ |
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index 1d5f1bd0dacd..f255e22184b4 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S | |||
@@ -752,6 +752,7 @@ __secondary_start: | |||
752 | stw r0,0(r3) | 752 | stw r0,0(r3) |
753 | 753 | ||
754 | /* load up the MMU */ | 754 | /* load up the MMU */ |
755 | bl load_segment_registers | ||
755 | bl load_up_mmu | 756 | bl load_up_mmu |
756 | 757 | ||
757 | /* ptr to phys current thread */ | 758 | /* ptr to phys current thread */ |
diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h index bfeb469e8106..2ae635df9026 100644 --- a/arch/powerpc/kernel/head_booke.h +++ b/arch/powerpc/kernel/head_booke.h | |||
@@ -83,7 +83,7 @@ END_BTB_FLUSH_SECTION | |||
83 | SAVE_4GPRS(3, r11); \ | 83 | SAVE_4GPRS(3, r11); \ |
84 | SAVE_2GPRS(7, r11) | 84 | SAVE_2GPRS(7, r11) |
85 | 85 | ||
86 | .macro SYSCALL_ENTRY trapno intno | 86 | .macro SYSCALL_ENTRY trapno intno srr1 |
87 | mfspr r10, SPRN_SPRG_THREAD | 87 | mfspr r10, SPRN_SPRG_THREAD |
88 | #ifdef CONFIG_KVM_BOOKE_HV | 88 | #ifdef CONFIG_KVM_BOOKE_HV |
89 | BEGIN_FTR_SECTION | 89 | BEGIN_FTR_SECTION |
@@ -94,7 +94,7 @@ BEGIN_FTR_SECTION | |||
94 | mfspr r11, SPRN_SRR1 | 94 | mfspr r11, SPRN_SRR1 |
95 | mtocrf 0x80, r11 /* check MSR[GS] without clobbering reg */ | 95 | mtocrf 0x80, r11 /* check MSR[GS] without clobbering reg */ |
96 | bf 3, 1975f | 96 | bf 3, 1975f |
97 | b kvmppc_handler_BOOKE_INTERRUPT_\intno\()_SPRN_SRR1 | 97 | b kvmppc_handler_\intno\()_\srr1 |
98 | 1975: | 98 | 1975: |
99 | mr r12, r13 | 99 | mr r12, r13 |
100 | lwz r13, THREAD_NORMSAVE(2)(r10) | 100 | lwz r13, THREAD_NORMSAVE(2)(r10) |
@@ -145,9 +145,9 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV) | |||
145 | tophys(r11,r11) | 145 | tophys(r11,r11) |
146 | addi r11,r11,global_dbcr0@l | 146 | addi r11,r11,global_dbcr0@l |
147 | #ifdef CONFIG_SMP | 147 | #ifdef CONFIG_SMP |
148 | lwz r9,TASK_CPU(r2) | 148 | lwz r10, TASK_CPU(r2) |
149 | slwi r9,r9,3 | 149 | slwi r10, r10, 3 |
150 | add r11,r11,r9 | 150 | add r11, r11, r10 |
151 | #endif | 151 | #endif |
152 | lwz r12,0(r11) | 152 | lwz r12,0(r11) |
153 | mtspr SPRN_DBCR0,r12 | 153 | mtspr SPRN_DBCR0,r12 |
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index 0bf4651380f3..adf0505dbe02 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S | |||
@@ -409,7 +409,7 @@ interrupt_base: | |||
409 | 409 | ||
410 | /* System Call Interrupt */ | 410 | /* System Call Interrupt */ |
411 | START_EXCEPTION(SystemCall) | 411 | START_EXCEPTION(SystemCall) |
412 | SYSCALL_ENTRY 0xc00 SYSCALL | 412 | SYSCALL_ENTRY 0xc00 BOOKE_INTERRUPT_SYSCALL SPRN_SRR1 |
413 | 413 | ||
414 | /* Auxiliary Processor Unavailable Interrupt */ | 414 | /* Auxiliary Processor Unavailable Interrupt */ |
415 | EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \ | 415 | EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \ |
diff --git a/arch/powerpc/kvm/book3s_hv_builtin.c b/arch/powerpc/kvm/book3s_hv_builtin.c index 41f93dbcd29f..cb05ccc8bc6a 100644 --- a/arch/powerpc/kvm/book3s_hv_builtin.c +++ b/arch/powerpc/kvm/book3s_hv_builtin.c | |||
@@ -830,6 +830,7 @@ static void flush_guest_tlb(struct kvm *kvm) | |||
830 | } | 830 | } |
831 | } | 831 | } |
832 | asm volatile("ptesync": : :"memory"); | 832 | asm volatile("ptesync": : :"memory"); |
833 | asm volatile(PPC_INVALIDATE_ERAT : : :"memory"); | ||
833 | } | 834 | } |
834 | 835 | ||
835 | void kvmppc_check_need_tlb_flush(struct kvm *kvm, int pcpu, | 836 | void kvmppc_check_need_tlb_flush(struct kvm *kvm, int pcpu, |
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index d885a5831daa..337e64468d78 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -2500,17 +2500,28 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | |||
2500 | LOAD_REG_ADDR(r11, dawr_force_enable) | 2500 | LOAD_REG_ADDR(r11, dawr_force_enable) |
2501 | lbz r11, 0(r11) | 2501 | lbz r11, 0(r11) |
2502 | cmpdi r11, 0 | 2502 | cmpdi r11, 0 |
2503 | bne 3f | ||
2503 | li r3, H_HARDWARE | 2504 | li r3, H_HARDWARE |
2504 | beqlr | 2505 | blr |
2506 | 3: | ||
2505 | /* Emulate H_SET_DABR/X on P8 for the sake of compat mode guests */ | 2507 | /* Emulate H_SET_DABR/X on P8 for the sake of compat mode guests */ |
2506 | rlwimi r5, r4, 5, DAWRX_DR | DAWRX_DW | 2508 | rlwimi r5, r4, 5, DAWRX_DR | DAWRX_DW |
2507 | rlwimi r5, r4, 2, DAWRX_WT | 2509 | rlwimi r5, r4, 2, DAWRX_WT |
2508 | clrrdi r4, r4, 3 | 2510 | clrrdi r4, r4, 3 |
2509 | std r4, VCPU_DAWR(r3) | 2511 | std r4, VCPU_DAWR(r3) |
2510 | std r5, VCPU_DAWRX(r3) | 2512 | std r5, VCPU_DAWRX(r3) |
2513 | /* | ||
2514 | * If came in through the real mode hcall handler then it is necessary | ||
2515 | * to write the registers since the return path won't. Otherwise it is | ||
2516 | * sufficient to store then in the vcpu struct as they will be loaded | ||
2517 | * next time the vcpu is run. | ||
2518 | */ | ||
2519 | mfmsr r6 | ||
2520 | andi. r6, r6, MSR_DR /* in real mode? */ | ||
2521 | bne 4f | ||
2511 | mtspr SPRN_DAWR, r4 | 2522 | mtspr SPRN_DAWR, r4 |
2512 | mtspr SPRN_DAWRX, r5 | 2523 | mtspr SPRN_DAWRX, r5 |
2513 | li r3, 0 | 2524 | 4: li r3, 0 |
2514 | blr | 2525 | blr |
2515 | 2526 | ||
2516 | _GLOBAL(kvmppc_h_cede) /* r3 = vcpu pointer, r11 = msr, r13 = paca */ | 2527 | _GLOBAL(kvmppc_h_cede) /* r3 = vcpu pointer, r11 = msr, r13 = paca */ |
diff --git a/arch/powerpc/mm/book3s64/mmu_context.c b/arch/powerpc/mm/book3s64/mmu_context.c index bb70391401f7..794404d50a85 100644 --- a/arch/powerpc/mm/book3s64/mmu_context.c +++ b/arch/powerpc/mm/book3s64/mmu_context.c | |||
@@ -50,20 +50,52 @@ EXPORT_SYMBOL_GPL(hash__alloc_context_id); | |||
50 | 50 | ||
51 | void slb_setup_new_exec(void); | 51 | void slb_setup_new_exec(void); |
52 | 52 | ||
53 | static int realloc_context_ids(mm_context_t *ctx) | ||
54 | { | ||
55 | int i, id; | ||
56 | |||
57 | /* | ||
58 | * id 0 (aka. ctx->id) is special, we always allocate a new one, even if | ||
59 | * there wasn't one allocated previously (which happens in the exec | ||
60 | * case where ctx is newly allocated). | ||
61 | * | ||
62 | * We have to be a bit careful here. We must keep the existing ids in | ||
63 | * the array, so that we can test if they're non-zero to decide if we | ||
64 | * need to allocate a new one. However in case of error we must free the | ||
65 | * ids we've allocated but *not* any of the existing ones (or risk a | ||
66 | * UAF). That's why we decrement i at the start of the error handling | ||
67 | * loop, to skip the id that we just tested but couldn't reallocate. | ||
68 | */ | ||
69 | for (i = 0; i < ARRAY_SIZE(ctx->extended_id); i++) { | ||
70 | if (i == 0 || ctx->extended_id[i]) { | ||
71 | id = hash__alloc_context_id(); | ||
72 | if (id < 0) | ||
73 | goto error; | ||
74 | |||
75 | ctx->extended_id[i] = id; | ||
76 | } | ||
77 | } | ||
78 | |||
79 | /* The caller expects us to return id */ | ||
80 | return ctx->id; | ||
81 | |||
82 | error: | ||
83 | for (i--; i >= 0; i--) { | ||
84 | if (ctx->extended_id[i]) | ||
85 | ida_free(&mmu_context_ida, ctx->extended_id[i]); | ||
86 | } | ||
87 | |||
88 | return id; | ||
89 | } | ||
90 | |||
53 | static int hash__init_new_context(struct mm_struct *mm) | 91 | static int hash__init_new_context(struct mm_struct *mm) |
54 | { | 92 | { |
55 | int index; | 93 | int index; |
56 | 94 | ||
57 | index = hash__alloc_context_id(); | ||
58 | if (index < 0) | ||
59 | return index; | ||
60 | |||
61 | mm->context.hash_context = kmalloc(sizeof(struct hash_mm_context), | 95 | mm->context.hash_context = kmalloc(sizeof(struct hash_mm_context), |
62 | GFP_KERNEL); | 96 | GFP_KERNEL); |
63 | if (!mm->context.hash_context) { | 97 | if (!mm->context.hash_context) |
64 | ida_free(&mmu_context_ida, index); | ||
65 | return -ENOMEM; | 98 | return -ENOMEM; |
66 | } | ||
67 | 99 | ||
68 | /* | 100 | /* |
69 | * The old code would re-promote on fork, we don't do that when using | 101 | * The old code would re-promote on fork, we don't do that when using |
@@ -91,13 +123,20 @@ static int hash__init_new_context(struct mm_struct *mm) | |||
91 | mm->context.hash_context->spt = kmalloc(sizeof(struct subpage_prot_table), | 123 | mm->context.hash_context->spt = kmalloc(sizeof(struct subpage_prot_table), |
92 | GFP_KERNEL); | 124 | GFP_KERNEL); |
93 | if (!mm->context.hash_context->spt) { | 125 | if (!mm->context.hash_context->spt) { |
94 | ida_free(&mmu_context_ida, index); | ||
95 | kfree(mm->context.hash_context); | 126 | kfree(mm->context.hash_context); |
96 | return -ENOMEM; | 127 | return -ENOMEM; |
97 | } | 128 | } |
98 | } | 129 | } |
99 | #endif | 130 | #endif |
131 | } | ||
100 | 132 | ||
133 | index = realloc_context_ids(&mm->context); | ||
134 | if (index < 0) { | ||
135 | #ifdef CONFIG_PPC_SUBPAGE_PROT | ||
136 | kfree(mm->context.hash_context->spt); | ||
137 | #endif | ||
138 | kfree(mm->context.hash_context); | ||
139 | return index; | ||
101 | } | 140 | } |
102 | 141 | ||
103 | pkey_mm_init(mm); | 142 | pkey_mm_init(mm); |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index cba29131bccc..2540d3b2588c 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -248,7 +248,8 @@ void __init paging_init(void) | |||
248 | (long int)((top_of_ram - total_ram) >> 20)); | 248 | (long int)((top_of_ram - total_ram) >> 20)); |
249 | 249 | ||
250 | #ifdef CONFIG_ZONE_DMA | 250 | #ifdef CONFIG_ZONE_DMA |
251 | max_zone_pfns[ZONE_DMA] = min(max_low_pfn, 0x7fffffffUL >> PAGE_SHIFT); | 251 | max_zone_pfns[ZONE_DMA] = min(max_low_pfn, |
252 | ((1UL << ARCH_ZONE_DMA_BITS) - 1) >> PAGE_SHIFT); | ||
252 | #endif | 253 | #endif |
253 | max_zone_pfns[ZONE_NORMAL] = max_low_pfn; | 254 | max_zone_pfns[ZONE_NORMAL] = max_low_pfn; |
254 | #ifdef CONFIG_HIGHMEM | 255 | #ifdef CONFIG_HIGHMEM |
diff --git a/arch/powerpc/platforms/powermac/Kconfig b/arch/powerpc/platforms/powermac/Kconfig index f834a19ed772..c02d8c503b29 100644 --- a/arch/powerpc/platforms/powermac/Kconfig +++ b/arch/powerpc/platforms/powermac/Kconfig | |||
@@ -7,6 +7,7 @@ config PPC_PMAC | |||
7 | select PPC_INDIRECT_PCI if PPC32 | 7 | select PPC_INDIRECT_PCI if PPC32 |
8 | select PPC_MPC106 if PPC32 | 8 | select PPC_MPC106 if PPC32 |
9 | select PPC_NATIVE | 9 | select PPC_NATIVE |
10 | select ZONE_DMA if PPC32 | ||
10 | default y | 11 | default y |
11 | 12 | ||
12 | config PPC_PMAC64 | 13 | config PPC_PMAC64 |
diff --git a/drivers/auxdisplay/cfag12864bfb.c b/drivers/auxdisplay/cfag12864bfb.c index 40c8a552a478..4074886b7bc8 100644 --- a/drivers/auxdisplay/cfag12864bfb.c +++ b/drivers/auxdisplay/cfag12864bfb.c | |||
@@ -52,8 +52,9 @@ static const struct fb_var_screeninfo cfag12864bfb_var = { | |||
52 | 52 | ||
53 | static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma) | 53 | static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma) |
54 | { | 54 | { |
55 | return vm_insert_page(vma, vma->vm_start, | 55 | struct page *pages = virt_to_page(cfag12864b_buffer); |
56 | virt_to_page(cfag12864b_buffer)); | 56 | |
57 | return vm_map_pages_zero(vma, &pages, 1); | ||
57 | } | 58 | } |
58 | 59 | ||
59 | static struct fb_ops cfag12864bfb_ops = { | 60 | static struct fb_ops cfag12864bfb_ops = { |
diff --git a/drivers/auxdisplay/ht16k33.c b/drivers/auxdisplay/ht16k33.c index 21393ec3b9a4..9c0bb771751d 100644 --- a/drivers/auxdisplay/ht16k33.c +++ b/drivers/auxdisplay/ht16k33.c | |||
@@ -223,9 +223,9 @@ static const struct backlight_ops ht16k33_bl_ops = { | |||
223 | static int ht16k33_mmap(struct fb_info *info, struct vm_area_struct *vma) | 223 | static int ht16k33_mmap(struct fb_info *info, struct vm_area_struct *vma) |
224 | { | 224 | { |
225 | struct ht16k33_priv *priv = info->par; | 225 | struct ht16k33_priv *priv = info->par; |
226 | struct page *pages = virt_to_page(priv->fbdev.buffer); | ||
226 | 227 | ||
227 | return vm_insert_page(vma, vma->vm_start, | 228 | return vm_map_pages_zero(vma, &pages, 1); |
228 | virt_to_page(priv->fbdev.buffer)); | ||
229 | } | 229 | } |
230 | 230 | ||
231 | static struct fb_ops ht16k33_fb_ops = { | 231 | static struct fb_ops ht16k33_fb_ops = { |
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index aa51756fd4d6..87b410d6e51d 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c | |||
@@ -368,7 +368,7 @@ static struct clk_core *clk_core_get(struct clk_core *core, u8 p_index) | |||
368 | const char *dev_id = dev ? dev_name(dev) : NULL; | 368 | const char *dev_id = dev ? dev_name(dev) : NULL; |
369 | struct device_node *np = core->of_node; | 369 | struct device_node *np = core->of_node; |
370 | 370 | ||
371 | if (np && index >= 0) | 371 | if (np && (name || index >= 0)) |
372 | hw = of_clk_get_hw(np, index, name); | 372 | hw = of_clk_get_hw(np, index, name); |
373 | 373 | ||
374 | /* | 374 | /* |
diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c index 739f64fdf1e3..206fafd299ea 100644 --- a/drivers/clk/meson/g12a.c +++ b/drivers/clk/meson/g12a.c | |||
@@ -2734,8 +2734,8 @@ static struct clk_hw_onecell_data g12a_hw_onecell_data = { | |||
2734 | [CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw, | 2734 | [CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw, |
2735 | [CLKID_MALI_1] = &g12a_mali_1.hw, | 2735 | [CLKID_MALI_1] = &g12a_mali_1.hw, |
2736 | [CLKID_MALI] = &g12a_mali.hw, | 2736 | [CLKID_MALI] = &g12a_mali.hw, |
2737 | [CLKID_MPLL_5OM_DIV] = &g12a_mpll_50m_div.hw, | 2737 | [CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw, |
2738 | [CLKID_MPLL_5OM] = &g12a_mpll_50m.hw, | 2738 | [CLKID_MPLL_50M] = &g12a_mpll_50m.hw, |
2739 | [CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw, | 2739 | [CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw, |
2740 | [CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw, | 2740 | [CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw, |
2741 | [CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw, | 2741 | [CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw, |
diff --git a/drivers/clk/meson/g12a.h b/drivers/clk/meson/g12a.h index 39c41af70804..bcc05cd9882f 100644 --- a/drivers/clk/meson/g12a.h +++ b/drivers/clk/meson/g12a.h | |||
@@ -166,7 +166,7 @@ | |||
166 | #define CLKID_HDMI_DIV 167 | 166 | #define CLKID_HDMI_DIV 167 |
167 | #define CLKID_MALI_0_DIV 170 | 167 | #define CLKID_MALI_0_DIV 170 |
168 | #define CLKID_MALI_1_DIV 173 | 168 | #define CLKID_MALI_1_DIV 173 |
169 | #define CLKID_MPLL_5OM_DIV 176 | 169 | #define CLKID_MPLL_50M_DIV 176 |
170 | #define CLKID_SYS_PLL_DIV16_EN 178 | 170 | #define CLKID_SYS_PLL_DIV16_EN 178 |
171 | #define CLKID_SYS_PLL_DIV16 179 | 171 | #define CLKID_SYS_PLL_DIV16 179 |
172 | #define CLKID_CPU_CLK_DYN0_SEL 180 | 172 | #define CLKID_CPU_CLK_DYN0_SEL 180 |
diff --git a/drivers/clk/meson/meson8b.c b/drivers/clk/meson/meson8b.c index 37cf0f01bb5d..62cd3a7f1f65 100644 --- a/drivers/clk/meson/meson8b.c +++ b/drivers/clk/meson/meson8b.c | |||
@@ -1761,7 +1761,7 @@ static struct clk_regmap meson8m2_gp_pll = { | |||
1761 | }, | 1761 | }, |
1762 | }; | 1762 | }; |
1763 | 1763 | ||
1764 | static const char * const mmeson8b_vpu_0_1_parent_names[] = { | 1764 | static const char * const meson8b_vpu_0_1_parent_names[] = { |
1765 | "fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7" | 1765 | "fclk_div4", "fclk_div3", "fclk_div5", "fclk_div7" |
1766 | }; | 1766 | }; |
1767 | 1767 | ||
@@ -1778,8 +1778,8 @@ static struct clk_regmap meson8b_vpu_0_sel = { | |||
1778 | .hw.init = &(struct clk_init_data){ | 1778 | .hw.init = &(struct clk_init_data){ |
1779 | .name = "vpu_0_sel", | 1779 | .name = "vpu_0_sel", |
1780 | .ops = &clk_regmap_mux_ops, | 1780 | .ops = &clk_regmap_mux_ops, |
1781 | .parent_names = mmeson8b_vpu_0_1_parent_names, | 1781 | .parent_names = meson8b_vpu_0_1_parent_names, |
1782 | .num_parents = ARRAY_SIZE(mmeson8b_vpu_0_1_parent_names), | 1782 | .num_parents = ARRAY_SIZE(meson8b_vpu_0_1_parent_names), |
1783 | .flags = CLK_SET_RATE_PARENT, | 1783 | .flags = CLK_SET_RATE_PARENT, |
1784 | }, | 1784 | }, |
1785 | }; | 1785 | }; |
@@ -1837,8 +1837,8 @@ static struct clk_regmap meson8b_vpu_1_sel = { | |||
1837 | .hw.init = &(struct clk_init_data){ | 1837 | .hw.init = &(struct clk_init_data){ |
1838 | .name = "vpu_1_sel", | 1838 | .name = "vpu_1_sel", |
1839 | .ops = &clk_regmap_mux_ops, | 1839 | .ops = &clk_regmap_mux_ops, |
1840 | .parent_names = mmeson8b_vpu_0_1_parent_names, | 1840 | .parent_names = meson8b_vpu_0_1_parent_names, |
1841 | .num_parents = ARRAY_SIZE(mmeson8b_vpu_0_1_parent_names), | 1841 | .num_parents = ARRAY_SIZE(meson8b_vpu_0_1_parent_names), |
1842 | .flags = CLK_SET_RATE_PARENT, | 1842 | .flags = CLK_SET_RATE_PARENT, |
1843 | }, | 1843 | }, |
1844 | }; | 1844 | }; |
diff --git a/drivers/clk/socfpga/clk-s10.c b/drivers/clk/socfpga/clk-s10.c index 8281dfbf38c2..5bed36e12951 100644 --- a/drivers/clk/socfpga/clk-s10.c +++ b/drivers/clk/socfpga/clk-s10.c | |||
@@ -103,9 +103,9 @@ static const struct stratix10_perip_cnt_clock s10_main_perip_cnt_clks[] = { | |||
103 | { STRATIX10_NOC_CLK, "noc_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux), | 103 | { STRATIX10_NOC_CLK, "noc_clk", NULL, noc_mux, ARRAY_SIZE(noc_mux), |
104 | 0, 0, 0, 0x3C, 1}, | 104 | 0, 0, 0, 0x3C, 1}, |
105 | { STRATIX10_EMAC_A_FREE_CLK, "emaca_free_clk", NULL, emaca_free_mux, ARRAY_SIZE(emaca_free_mux), | 105 | { STRATIX10_EMAC_A_FREE_CLK, "emaca_free_clk", NULL, emaca_free_mux, ARRAY_SIZE(emaca_free_mux), |
106 | 0, 0, 4, 0xB0, 0}, | 106 | 0, 0, 2, 0xB0, 0}, |
107 | { STRATIX10_EMAC_B_FREE_CLK, "emacb_free_clk", NULL, emacb_free_mux, ARRAY_SIZE(emacb_free_mux), | 107 | { STRATIX10_EMAC_B_FREE_CLK, "emacb_free_clk", NULL, emacb_free_mux, ARRAY_SIZE(emacb_free_mux), |
108 | 0, 0, 4, 0xB0, 1}, | 108 | 0, 0, 2, 0xB0, 1}, |
109 | { STRATIX10_EMAC_PTP_FREE_CLK, "emac_ptp_free_clk", NULL, emac_ptp_free_mux, | 109 | { STRATIX10_EMAC_PTP_FREE_CLK, "emac_ptp_free_clk", NULL, emac_ptp_free_mux, |
110 | ARRAY_SIZE(emac_ptp_free_mux), 0, 0, 4, 0xB0, 2}, | 110 | ARRAY_SIZE(emac_ptp_free_mux), 0, 0, 4, 0xB0, 2}, |
111 | { STRATIX10_GPIO_DB_FREE_CLK, "gpio_db_free_clk", NULL, gpio_db_free_mux, | 111 | { STRATIX10_GPIO_DB_FREE_CLK, "gpio_db_free_clk", NULL, gpio_db_free_mux, |
diff --git a/drivers/clk/tegra/clk-tegra210.c b/drivers/clk/tegra/clk-tegra210.c index e1ba62d2b1a0..ac1d27a8c650 100644 --- a/drivers/clk/tegra/clk-tegra210.c +++ b/drivers/clk/tegra/clk-tegra210.c | |||
@@ -3366,6 +3366,8 @@ static struct tegra_clk_init_table init_table[] __initdata = { | |||
3366 | { TEGRA210_CLK_I2S3_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, | 3366 | { TEGRA210_CLK_I2S3_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, |
3367 | { TEGRA210_CLK_I2S4_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, | 3367 | { TEGRA210_CLK_I2S4_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, |
3368 | { TEGRA210_CLK_VIMCLK_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, | 3368 | { TEGRA210_CLK_VIMCLK_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, |
3369 | { TEGRA210_CLK_HDA, TEGRA210_CLK_PLL_P, 51000000, 0 }, | ||
3370 | { TEGRA210_CLK_HDA2CODEC_2X, TEGRA210_CLK_PLL_P, 48000000, 0 }, | ||
3369 | /* This MUST be the last entry. */ | 3371 | /* This MUST be the last entry. */ |
3370 | { TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 }, | 3372 | { TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 }, |
3371 | }; | 3373 | }; |
diff --git a/drivers/clk/ti/clkctrl.c b/drivers/clk/ti/clkctrl.c index 8e834317c97d..975995eea15c 100644 --- a/drivers/clk/ti/clkctrl.c +++ b/drivers/clk/ti/clkctrl.c | |||
@@ -229,6 +229,7 @@ static struct clk_hw *_ti_omap4_clkctrl_xlate(struct of_phandle_args *clkspec, | |||
229 | { | 229 | { |
230 | struct omap_clkctrl_provider *provider = data; | 230 | struct omap_clkctrl_provider *provider = data; |
231 | struct omap_clkctrl_clk *entry; | 231 | struct omap_clkctrl_clk *entry; |
232 | bool found = false; | ||
232 | 233 | ||
233 | if (clkspec->args_count != 2) | 234 | if (clkspec->args_count != 2) |
234 | return ERR_PTR(-EINVAL); | 235 | return ERR_PTR(-EINVAL); |
@@ -238,11 +239,13 @@ static struct clk_hw *_ti_omap4_clkctrl_xlate(struct of_phandle_args *clkspec, | |||
238 | 239 | ||
239 | list_for_each_entry(entry, &provider->clocks, node) { | 240 | list_for_each_entry(entry, &provider->clocks, node) { |
240 | if (entry->reg_offset == clkspec->args[0] && | 241 | if (entry->reg_offset == clkspec->args[0] && |
241 | entry->bit_offset == clkspec->args[1]) | 242 | entry->bit_offset == clkspec->args[1]) { |
243 | found = true; | ||
242 | break; | 244 | break; |
245 | } | ||
243 | } | 246 | } |
244 | 247 | ||
245 | if (!entry) | 248 | if (!found) |
246 | return ERR_PTR(-EINVAL); | 249 | return ERR_PTR(-EINVAL); |
247 | 250 | ||
248 | return entry->clk; | 251 | return entry->clk; |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index eac0c54c5970..b032d3899fa3 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -80,6 +80,7 @@ | |||
80 | #define HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP 0x1220 | 80 | #define HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP 0x1220 |
81 | #define HID_DEVICE_ID_ALPS_U1 0x1215 | 81 | #define HID_DEVICE_ID_ALPS_U1 0x1215 |
82 | #define HID_DEVICE_ID_ALPS_T4_BTNLESS 0x120C | 82 | #define HID_DEVICE_ID_ALPS_T4_BTNLESS 0x120C |
83 | #define HID_DEVICE_ID_ALPS_1222 0x1222 | ||
83 | 84 | ||
84 | 85 | ||
85 | #define USB_VENDOR_ID_AMI 0x046b | 86 | #define USB_VENDOR_ID_AMI 0x046b |
@@ -269,6 +270,7 @@ | |||
269 | #define USB_DEVICE_ID_CHICONY_MULTI_TOUCH 0xb19d | 270 | #define USB_DEVICE_ID_CHICONY_MULTI_TOUCH 0xb19d |
270 | #define USB_DEVICE_ID_CHICONY_WIRELESS 0x0618 | 271 | #define USB_DEVICE_ID_CHICONY_WIRELESS 0x0618 |
271 | #define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE 0x1053 | 272 | #define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE 0x1053 |
273 | #define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2 0x0939 | ||
272 | #define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123 | 274 | #define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123 |
273 | #define USB_DEVICE_ID_ASUS_AK1D 0x1125 | 275 | #define USB_DEVICE_ID_ASUS_AK1D 0x1125 |
274 | #define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A 0x1408 | 276 | #define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A 0x1408 |
@@ -569,6 +571,7 @@ | |||
569 | 571 | ||
570 | #define USB_VENDOR_ID_HUION 0x256c | 572 | #define USB_VENDOR_ID_HUION 0x256c |
571 | #define USB_DEVICE_ID_HUION_TABLET 0x006e | 573 | #define USB_DEVICE_ID_HUION_TABLET 0x006e |
574 | #define USB_DEVICE_ID_HUION_HS64 0x006d | ||
572 | 575 | ||
573 | #define USB_VENDOR_ID_IBM 0x04b3 | 576 | #define USB_VENDOR_ID_IBM 0x04b3 |
574 | #define USB_DEVICE_ID_IBM_SCROLLPOINT_III 0x3100 | 577 | #define USB_DEVICE_ID_IBM_SCROLLPOINT_III 0x3100 |
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c index e564bff86515..bfcf2ee58d14 100644 --- a/drivers/hid/hid-logitech-dj.c +++ b/drivers/hid/hid-logitech-dj.c | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | #define REPORT_ID_HIDPP_SHORT 0x10 | 31 | #define REPORT_ID_HIDPP_SHORT 0x10 |
32 | #define REPORT_ID_HIDPP_LONG 0x11 | 32 | #define REPORT_ID_HIDPP_LONG 0x11 |
33 | #define REPORT_ID_HIDPP_VERY_LONG 0x12 | ||
33 | 34 | ||
34 | #define HIDPP_REPORT_SHORT_LENGTH 7 | 35 | #define HIDPP_REPORT_SHORT_LENGTH 7 |
35 | #define HIDPP_REPORT_LONG_LENGTH 20 | 36 | #define HIDPP_REPORT_LONG_LENGTH 20 |
@@ -1242,7 +1243,8 @@ static int logi_dj_ll_raw_request(struct hid_device *hid, | |||
1242 | int ret; | 1243 | int ret; |
1243 | 1244 | ||
1244 | if ((buf[0] == REPORT_ID_HIDPP_SHORT) || | 1245 | if ((buf[0] == REPORT_ID_HIDPP_SHORT) || |
1245 | (buf[0] == REPORT_ID_HIDPP_LONG)) { | 1246 | (buf[0] == REPORT_ID_HIDPP_LONG) || |
1247 | (buf[0] == REPORT_ID_HIDPP_VERY_LONG)) { | ||
1246 | if (count < 2) | 1248 | if (count < 2) |
1247 | return -EINVAL; | 1249 | return -EINVAL; |
1248 | 1250 | ||
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 5df5dd56ecc8..b603c14d043b 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c | |||
@@ -1776,6 +1776,10 @@ static const struct hid_device_id mt_devices[] = { | |||
1776 | HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, | 1776 | HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, |
1777 | USB_VENDOR_ID_ALPS_JP, | 1777 | USB_VENDOR_ID_ALPS_JP, |
1778 | HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP) }, | 1778 | HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP) }, |
1779 | { .driver_data = MT_CLS_WIN_8_DUAL, | ||
1780 | HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, | ||
1781 | USB_VENDOR_ID_ALPS_JP, | ||
1782 | HID_DEVICE_ID_ALPS_1222) }, | ||
1779 | 1783 | ||
1780 | /* Lenovo X1 TAB Gen 2 */ | 1784 | /* Lenovo X1 TAB Gen 2 */ |
1781 | { .driver_data = MT_CLS_WIN_8_DUAL, | 1785 | { .driver_data = MT_CLS_WIN_8_DUAL, |
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c index e5ca6fe2ca57..671a285724f9 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c | |||
@@ -42,6 +42,7 @@ static const struct hid_device_id hid_quirks[] = { | |||
42 | { HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM), HID_QUIRK_NOGET }, | 42 | { HID_USB_DEVICE(USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM), HID_QUIRK_NOGET }, |
43 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_MULTI_TOUCH), HID_QUIRK_MULTI_INPUT }, | 43 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_MULTI_TOUCH), HID_QUIRK_MULTI_INPUT }, |
44 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL }, | 44 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL }, |
45 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2), HID_QUIRK_ALWAYS_POLL }, | ||
45 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS), HID_QUIRK_MULTI_INPUT }, | 46 | { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS), HID_QUIRK_MULTI_INPUT }, |
46 | { HID_USB_DEVICE(USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD), HID_QUIRK_BADPAD }, | 47 | { HID_USB_DEVICE(USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD), HID_QUIRK_BADPAD }, |
47 | { HID_USB_DEVICE(USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK), HID_QUIRK_NOGET }, | 48 | { HID_USB_DEVICE(USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK), HID_QUIRK_NOGET }, |
diff --git a/drivers/hid/hid-uclogic-core.c b/drivers/hid/hid-uclogic-core.c index 8fe02d81265d..914fb527ae7a 100644 --- a/drivers/hid/hid-uclogic-core.c +++ b/drivers/hid/hid-uclogic-core.c | |||
@@ -369,6 +369,8 @@ static const struct hid_device_id uclogic_devices[] = { | |||
369 | USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60) }, | 369 | USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60) }, |
370 | { HID_USB_DEVICE(USB_VENDOR_ID_HUION, | 370 | { HID_USB_DEVICE(USB_VENDOR_ID_HUION, |
371 | USB_DEVICE_ID_HUION_TABLET) }, | 371 | USB_DEVICE_ID_HUION_TABLET) }, |
372 | { HID_USB_DEVICE(USB_VENDOR_ID_HUION, | ||
373 | USB_DEVICE_ID_HUION_HS64) }, | ||
372 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, | 374 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, |
373 | USB_DEVICE_ID_HUION_TABLET) }, | 375 | USB_DEVICE_ID_HUION_TABLET) }, |
374 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, | 376 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, |
diff --git a/drivers/hid/hid-uclogic-params.c b/drivers/hid/hid-uclogic-params.c index 0187c9f8fc22..273d784fff66 100644 --- a/drivers/hid/hid-uclogic-params.c +++ b/drivers/hid/hid-uclogic-params.c | |||
@@ -977,6 +977,8 @@ int uclogic_params_init(struct uclogic_params *params, | |||
977 | /* FALL THROUGH */ | 977 | /* FALL THROUGH */ |
978 | case VID_PID(USB_VENDOR_ID_HUION, | 978 | case VID_PID(USB_VENDOR_ID_HUION, |
979 | USB_DEVICE_ID_HUION_TABLET): | 979 | USB_DEVICE_ID_HUION_TABLET): |
980 | case VID_PID(USB_VENDOR_ID_HUION, | ||
981 | USB_DEVICE_ID_HUION_HS64): | ||
980 | case VID_PID(USB_VENDOR_ID_UCLOGIC, | 982 | case VID_PID(USB_VENDOR_ID_UCLOGIC, |
981 | USB_DEVICE_ID_HUION_TABLET): | 983 | USB_DEVICE_ID_HUION_TABLET): |
982 | case VID_PID(USB_VENDOR_ID_UCLOGIC, | 984 | case VID_PID(USB_VENDOR_ID_UCLOGIC, |
diff --git a/drivers/hid/intel-ish-hid/ishtp-fw-loader.c b/drivers/hid/intel-ish-hid/ishtp-fw-loader.c index 22ba21457035..aa2dbed30fc3 100644 --- a/drivers/hid/intel-ish-hid/ishtp-fw-loader.c +++ b/drivers/hid/intel-ish-hid/ishtp-fw-loader.c | |||
@@ -816,9 +816,9 @@ static int load_fw_from_host(struct ishtp_cl_data *client_data) | |||
816 | goto end_err_fw_release; | 816 | goto end_err_fw_release; |
817 | 817 | ||
818 | release_firmware(fw); | 818 | release_firmware(fw); |
819 | kfree(filename); | ||
820 | dev_info(cl_data_to_dev(client_data), "ISH firmware %s loaded\n", | 819 | dev_info(cl_data_to_dev(client_data), "ISH firmware %s loaded\n", |
821 | filename); | 820 | filename); |
821 | kfree(filename); | ||
822 | return 0; | 822 | return 0; |
823 | 823 | ||
824 | end_err_fw_release: | 824 | end_err_fw_release: |
diff --git a/drivers/hid/intel-ish-hid/ishtp-hid-client.c b/drivers/hid/intel-ish-hid/ishtp-hid-client.c index c0487b34d2cf..6ba944b40fdb 100644 --- a/drivers/hid/intel-ish-hid/ishtp-hid-client.c +++ b/drivers/hid/intel-ish-hid/ishtp-hid-client.c | |||
@@ -891,7 +891,7 @@ static int hid_ishtp_cl_reset(struct ishtp_cl_device *cl_device) | |||
891 | */ | 891 | */ |
892 | static int hid_ishtp_cl_suspend(struct device *device) | 892 | static int hid_ishtp_cl_suspend(struct device *device) |
893 | { | 893 | { |
894 | struct ishtp_cl_device *cl_device = dev_get_drvdata(device); | 894 | struct ishtp_cl_device *cl_device = ishtp_dev_to_cl_device(device); |
895 | struct ishtp_cl *hid_ishtp_cl = ishtp_get_drvdata(cl_device); | 895 | struct ishtp_cl *hid_ishtp_cl = ishtp_get_drvdata(cl_device); |
896 | struct ishtp_cl_data *client_data = ishtp_get_client_data(hid_ishtp_cl); | 896 | struct ishtp_cl_data *client_data = ishtp_get_client_data(hid_ishtp_cl); |
897 | 897 | ||
@@ -912,7 +912,7 @@ static int hid_ishtp_cl_suspend(struct device *device) | |||
912 | */ | 912 | */ |
913 | static int hid_ishtp_cl_resume(struct device *device) | 913 | static int hid_ishtp_cl_resume(struct device *device) |
914 | { | 914 | { |
915 | struct ishtp_cl_device *cl_device = dev_get_drvdata(device); | 915 | struct ishtp_cl_device *cl_device = ishtp_dev_to_cl_device(device); |
916 | struct ishtp_cl *hid_ishtp_cl = ishtp_get_drvdata(cl_device); | 916 | struct ishtp_cl *hid_ishtp_cl = ishtp_get_drvdata(cl_device); |
917 | struct ishtp_cl_data *client_data = ishtp_get_client_data(hid_ishtp_cl); | 917 | struct ishtp_cl_data *client_data = ishtp_get_client_data(hid_ishtp_cl); |
918 | 918 | ||
diff --git a/drivers/hid/intel-ish-hid/ishtp/bus.c b/drivers/hid/intel-ish-hid/ishtp/bus.c index 794e700d65f7..c47c3328a0f4 100644 --- a/drivers/hid/intel-ish-hid/ishtp/bus.c +++ b/drivers/hid/intel-ish-hid/ishtp/bus.c | |||
@@ -471,7 +471,6 @@ static struct ishtp_cl_device *ishtp_bus_add_device(struct ishtp_device *dev, | |||
471 | } | 471 | } |
472 | 472 | ||
473 | ishtp_device_ready = true; | 473 | ishtp_device_ready = true; |
474 | dev_set_drvdata(&device->dev, device); | ||
475 | 474 | ||
476 | return device; | 475 | return device; |
477 | } | 476 | } |
@@ -640,6 +639,20 @@ void *ishtp_get_drvdata(struct ishtp_cl_device *cl_device) | |||
640 | EXPORT_SYMBOL(ishtp_get_drvdata); | 639 | EXPORT_SYMBOL(ishtp_get_drvdata); |
641 | 640 | ||
642 | /** | 641 | /** |
642 | * ishtp_dev_to_cl_device() - get ishtp_cl_device instance from device instance | ||
643 | * @device: device instance | ||
644 | * | ||
645 | * Get ish_cl_device instance which embeds device instance in it. | ||
646 | * | ||
647 | * Return: pointer to ishtp_cl_device instance | ||
648 | */ | ||
649 | struct ishtp_cl_device *ishtp_dev_to_cl_device(struct device *device) | ||
650 | { | ||
651 | return to_ishtp_cl_device(device); | ||
652 | } | ||
653 | EXPORT_SYMBOL(ishtp_dev_to_cl_device); | ||
654 | |||
655 | /** | ||
643 | * ishtp_bus_new_client() - Create a new client | 656 | * ishtp_bus_new_client() - Create a new client |
644 | * @dev: ISHTP device instance | 657 | * @dev: ISHTP device instance |
645 | * | 658 | * |
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 56297298d6ee..162b3236e72c 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
@@ -2504,7 +2504,6 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu, | |||
2504 | } | 2504 | } |
2505 | } | 2505 | } |
2506 | 2506 | ||
2507 | spin_lock(&iommu->lock); | ||
2508 | spin_lock_irqsave(&device_domain_lock, flags); | 2507 | spin_lock_irqsave(&device_domain_lock, flags); |
2509 | if (dev) | 2508 | if (dev) |
2510 | found = find_domain(dev); | 2509 | found = find_domain(dev); |
@@ -2520,16 +2519,17 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu, | |||
2520 | 2519 | ||
2521 | if (found) { | 2520 | if (found) { |
2522 | spin_unlock_irqrestore(&device_domain_lock, flags); | 2521 | spin_unlock_irqrestore(&device_domain_lock, flags); |
2523 | spin_unlock(&iommu->lock); | ||
2524 | free_devinfo_mem(info); | 2522 | free_devinfo_mem(info); |
2525 | /* Caller must free the original domain */ | 2523 | /* Caller must free the original domain */ |
2526 | return found; | 2524 | return found; |
2527 | } | 2525 | } |
2528 | 2526 | ||
2527 | spin_lock(&iommu->lock); | ||
2529 | ret = domain_attach_iommu(domain, iommu); | 2528 | ret = domain_attach_iommu(domain, iommu); |
2529 | spin_unlock(&iommu->lock); | ||
2530 | |||
2530 | if (ret) { | 2531 | if (ret) { |
2531 | spin_unlock_irqrestore(&device_domain_lock, flags); | 2532 | spin_unlock_irqrestore(&device_domain_lock, flags); |
2532 | spin_unlock(&iommu->lock); | ||
2533 | free_devinfo_mem(info); | 2533 | free_devinfo_mem(info); |
2534 | return NULL; | 2534 | return NULL; |
2535 | } | 2535 | } |
@@ -2539,7 +2539,6 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu, | |||
2539 | if (dev) | 2539 | if (dev) |
2540 | dev->archdata.iommu = info; | 2540 | dev->archdata.iommu = info; |
2541 | spin_unlock_irqrestore(&device_domain_lock, flags); | 2541 | spin_unlock_irqrestore(&device_domain_lock, flags); |
2542 | spin_unlock(&iommu->lock); | ||
2543 | 2542 | ||
2544 | /* PASID table is mandatory for a PCI device in scalable mode. */ | 2543 | /* PASID table is mandatory for a PCI device in scalable mode. */ |
2545 | if (dev && dev_is_pci(dev) && sm_supported(iommu)) { | 2544 | if (dev && dev_is_pci(dev) && sm_supported(iommu)) { |
diff --git a/drivers/md/dm-init.c b/drivers/md/dm-init.c index 352e803f566e..728733a514c7 100644 --- a/drivers/md/dm-init.c +++ b/drivers/md/dm-init.c | |||
@@ -140,8 +140,8 @@ static char __init *dm_parse_table_entry(struct dm_device *dev, char *str) | |||
140 | return ERR_PTR(-EINVAL); | 140 | return ERR_PTR(-EINVAL); |
141 | } | 141 | } |
142 | /* target_args */ | 142 | /* target_args */ |
143 | dev->target_args_array[n] = kstrndup(field[3], GFP_KERNEL, | 143 | dev->target_args_array[n] = kstrndup(field[3], DM_MAX_STR_SIZE, |
144 | DM_MAX_STR_SIZE); | 144 | GFP_KERNEL); |
145 | if (!dev->target_args_array[n]) | 145 | if (!dev->target_args_array[n]) |
146 | return ERR_PTR(-ENOMEM); | 146 | return ERR_PTR(-ENOMEM); |
147 | 147 | ||
@@ -272,10 +272,10 @@ static int __init dm_init_init(void) | |||
272 | return 0; | 272 | return 0; |
273 | 273 | ||
274 | if (strlen(create) >= DM_MAX_STR_SIZE) { | 274 | if (strlen(create) >= DM_MAX_STR_SIZE) { |
275 | DMERR("Argument is too big. Limit is %d\n", DM_MAX_STR_SIZE); | 275 | DMERR("Argument is too big. Limit is %d", DM_MAX_STR_SIZE); |
276 | return -EINVAL; | 276 | return -EINVAL; |
277 | } | 277 | } |
278 | str = kstrndup(create, GFP_KERNEL, DM_MAX_STR_SIZE); | 278 | str = kstrndup(create, DM_MAX_STR_SIZE, GFP_KERNEL); |
279 | if (!str) | 279 | if (!str) |
280 | return -ENOMEM; | 280 | return -ENOMEM; |
281 | 281 | ||
@@ -283,7 +283,7 @@ static int __init dm_init_init(void) | |||
283 | if (r) | 283 | if (r) |
284 | goto out; | 284 | goto out; |
285 | 285 | ||
286 | DMINFO("waiting for all devices to be available before creating mapped devices\n"); | 286 | DMINFO("waiting for all devices to be available before creating mapped devices"); |
287 | wait_for_device_probe(); | 287 | wait_for_device_probe(); |
288 | 288 | ||
289 | list_for_each_entry(dev, &devices, list) { | 289 | list_for_each_entry(dev, &devices, list) { |
diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c index 9ea2b0291f20..e549392e0ea5 100644 --- a/drivers/md/dm-log-writes.c +++ b/drivers/md/dm-log-writes.c | |||
@@ -60,6 +60,7 @@ | |||
60 | 60 | ||
61 | #define WRITE_LOG_VERSION 1ULL | 61 | #define WRITE_LOG_VERSION 1ULL |
62 | #define WRITE_LOG_MAGIC 0x6a736677736872ULL | 62 | #define WRITE_LOG_MAGIC 0x6a736677736872ULL |
63 | #define WRITE_LOG_SUPER_SECTOR 0 | ||
63 | 64 | ||
64 | /* | 65 | /* |
65 | * The disk format for this is braindead simple. | 66 | * The disk format for this is braindead simple. |
@@ -115,6 +116,7 @@ struct log_writes_c { | |||
115 | struct list_head logging_blocks; | 116 | struct list_head logging_blocks; |
116 | wait_queue_head_t wait; | 117 | wait_queue_head_t wait; |
117 | struct task_struct *log_kthread; | 118 | struct task_struct *log_kthread; |
119 | struct completion super_done; | ||
118 | }; | 120 | }; |
119 | 121 | ||
120 | struct pending_block { | 122 | struct pending_block { |
@@ -180,6 +182,14 @@ static void log_end_io(struct bio *bio) | |||
180 | bio_put(bio); | 182 | bio_put(bio); |
181 | } | 183 | } |
182 | 184 | ||
185 | static void log_end_super(struct bio *bio) | ||
186 | { | ||
187 | struct log_writes_c *lc = bio->bi_private; | ||
188 | |||
189 | complete(&lc->super_done); | ||
190 | log_end_io(bio); | ||
191 | } | ||
192 | |||
183 | /* | 193 | /* |
184 | * Meant to be called if there is an error, it will free all the pages | 194 | * Meant to be called if there is an error, it will free all the pages |
185 | * associated with the block. | 195 | * associated with the block. |
@@ -215,7 +225,8 @@ static int write_metadata(struct log_writes_c *lc, void *entry, | |||
215 | bio->bi_iter.bi_size = 0; | 225 | bio->bi_iter.bi_size = 0; |
216 | bio->bi_iter.bi_sector = sector; | 226 | bio->bi_iter.bi_sector = sector; |
217 | bio_set_dev(bio, lc->logdev->bdev); | 227 | bio_set_dev(bio, lc->logdev->bdev); |
218 | bio->bi_end_io = log_end_io; | 228 | bio->bi_end_io = (sector == WRITE_LOG_SUPER_SECTOR) ? |
229 | log_end_super : log_end_io; | ||
219 | bio->bi_private = lc; | 230 | bio->bi_private = lc; |
220 | bio_set_op_attrs(bio, REQ_OP_WRITE, 0); | 231 | bio_set_op_attrs(bio, REQ_OP_WRITE, 0); |
221 | 232 | ||
@@ -418,11 +429,18 @@ static int log_super(struct log_writes_c *lc) | |||
418 | super.nr_entries = cpu_to_le64(lc->logged_entries); | 429 | super.nr_entries = cpu_to_le64(lc->logged_entries); |
419 | super.sectorsize = cpu_to_le32(lc->sectorsize); | 430 | super.sectorsize = cpu_to_le32(lc->sectorsize); |
420 | 431 | ||
421 | if (write_metadata(lc, &super, sizeof(super), NULL, 0, 0)) { | 432 | if (write_metadata(lc, &super, sizeof(super), NULL, 0, |
433 | WRITE_LOG_SUPER_SECTOR)) { | ||
422 | DMERR("Couldn't write super"); | 434 | DMERR("Couldn't write super"); |
423 | return -1; | 435 | return -1; |
424 | } | 436 | } |
425 | 437 | ||
438 | /* | ||
439 | * Super sector should be writen in-order, otherwise the | ||
440 | * nr_entries could be rewritten incorrectly by an old bio. | ||
441 | */ | ||
442 | wait_for_completion_io(&lc->super_done); | ||
443 | |||
426 | return 0; | 444 | return 0; |
427 | } | 445 | } |
428 | 446 | ||
@@ -531,6 +549,7 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
531 | INIT_LIST_HEAD(&lc->unflushed_blocks); | 549 | INIT_LIST_HEAD(&lc->unflushed_blocks); |
532 | INIT_LIST_HEAD(&lc->logging_blocks); | 550 | INIT_LIST_HEAD(&lc->logging_blocks); |
533 | init_waitqueue_head(&lc->wait); | 551 | init_waitqueue_head(&lc->wait); |
552 | init_completion(&lc->super_done); | ||
534 | atomic_set(&lc->io_blocks, 0); | 553 | atomic_set(&lc->io_blocks, 0); |
535 | atomic_set(&lc->pending_blocks, 0); | 554 | atomic_set(&lc->pending_blocks, 0); |
536 | 555 | ||
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 350cf0451456..ec8b27e20de3 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
@@ -561,7 +561,7 @@ static char **realloc_argv(unsigned *size, char **old_argv) | |||
561 | gfp = GFP_NOIO; | 561 | gfp = GFP_NOIO; |
562 | } | 562 | } |
563 | argv = kmalloc_array(new_size, sizeof(*argv), gfp); | 563 | argv = kmalloc_array(new_size, sizeof(*argv), gfp); |
564 | if (argv) { | 564 | if (argv && old_argv) { |
565 | memcpy(argv, old_argv, *size * sizeof(*argv)); | 565 | memcpy(argv, old_argv, *size * sizeof(*argv)); |
566 | *size = new_size; | 566 | *size = new_size; |
567 | } | 567 | } |
diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 720d06531aa3..ea24ff0612e3 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c | |||
@@ -235,8 +235,8 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, | |||
235 | BUG(); | 235 | BUG(); |
236 | } | 236 | } |
237 | 237 | ||
238 | DMERR("%s: %s block %llu is corrupted", v->data_dev->name, type_str, | 238 | DMERR_LIMIT("%s: %s block %llu is corrupted", v->data_dev->name, |
239 | block); | 239 | type_str, block); |
240 | 240 | ||
241 | if (v->corrupted_errs == DM_VERITY_MAX_CORRUPTED_ERRS) | 241 | if (v->corrupted_errs == DM_VERITY_MAX_CORRUPTED_ERRS) |
242 | DMERR("%s: reached maximum errors", v->data_dev->name); | 242 | DMERR("%s: reached maximum errors", v->data_dev->name); |
diff --git a/drivers/mfd/stmfx.c b/drivers/mfd/stmfx.c index fe8efba2d45f..857991cb3cbb 100644 --- a/drivers/mfd/stmfx.c +++ b/drivers/mfd/stmfx.c | |||
@@ -204,12 +204,11 @@ static struct irq_chip stmfx_irq_chip = { | |||
204 | static irqreturn_t stmfx_irq_handler(int irq, void *data) | 204 | static irqreturn_t stmfx_irq_handler(int irq, void *data) |
205 | { | 205 | { |
206 | struct stmfx *stmfx = data; | 206 | struct stmfx *stmfx = data; |
207 | unsigned long n, pending; | 207 | unsigned long bits; |
208 | u32 ack; | 208 | u32 pending, ack; |
209 | int ret; | 209 | int n, ret; |
210 | 210 | ||
211 | ret = regmap_read(stmfx->map, STMFX_REG_IRQ_PENDING, | 211 | ret = regmap_read(stmfx->map, STMFX_REG_IRQ_PENDING, &pending); |
212 | (u32 *)&pending); | ||
213 | if (ret) | 212 | if (ret) |
214 | return IRQ_NONE; | 213 | return IRQ_NONE; |
215 | 214 | ||
@@ -224,7 +223,8 @@ static irqreturn_t stmfx_irq_handler(int irq, void *data) | |||
224 | return IRQ_NONE; | 223 | return IRQ_NONE; |
225 | } | 224 | } |
226 | 225 | ||
227 | for_each_set_bit(n, &pending, STMFX_REG_IRQ_SRC_MAX) | 226 | bits = pending; |
227 | for_each_set_bit(n, &bits, STMFX_REG_IRQ_SRC_MAX) | ||
228 | handle_nested_irq(irq_find_mapping(stmfx->irq_domain, n)); | 228 | handle_nested_irq(irq_find_mapping(stmfx->irq_domain, n)); |
229 | 229 | ||
230 | return IRQ_HANDLED; | 230 | return IRQ_HANDLED; |
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c index b5b68aa16eb3..6eb131292eb2 100644 --- a/drivers/mtd/nand/raw/nand_base.c +++ b/drivers/mtd/nand/raw/nand_base.c | |||
@@ -4662,7 +4662,6 @@ static int nand_detect(struct nand_chip *chip, struct nand_flash_dev *type) | |||
4662 | memorg = nanddev_get_memorg(&chip->base); | 4662 | memorg = nanddev_get_memorg(&chip->base); |
4663 | memorg->planes_per_lun = 1; | 4663 | memorg->planes_per_lun = 1; |
4664 | memorg->luns_per_target = 1; | 4664 | memorg->luns_per_target = 1; |
4665 | memorg->ntargets = 1; | ||
4666 | 4665 | ||
4667 | /* | 4666 | /* |
4668 | * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx) | 4667 | * Reset the chip, required by some chips (e.g. Micron MT29FxGxxxxx) |
@@ -5027,6 +5026,8 @@ static int nand_scan_ident(struct nand_chip *chip, unsigned int maxchips, | |||
5027 | if (ret) | 5026 | if (ret) |
5028 | return ret; | 5027 | return ret; |
5029 | 5028 | ||
5029 | memorg->ntargets = maxchips; | ||
5030 | |||
5030 | /* Read the flash type */ | 5031 | /* Read the flash type */ |
5031 | ret = nand_detect(chip, table); | 5032 | ret = nand_detect(chip, table); |
5032 | if (ret) { | 5033 | if (ret) { |
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index 73172d7f512b..0c2ec1c21434 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c | |||
@@ -1636,6 +1636,95 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor) | |||
1636 | return 0; | 1636 | return 0; |
1637 | } | 1637 | } |
1638 | 1638 | ||
1639 | /** | ||
1640 | * spi_nor_clear_sr_bp() - clear the Status Register Block Protection bits. | ||
1641 | * @nor: pointer to a 'struct spi_nor' | ||
1642 | * | ||
1643 | * Read-modify-write function that clears the Block Protection bits from the | ||
1644 | * Status Register without affecting other bits. | ||
1645 | * | ||
1646 | * Return: 0 on success, -errno otherwise. | ||
1647 | */ | ||
1648 | static int spi_nor_clear_sr_bp(struct spi_nor *nor) | ||
1649 | { | ||
1650 | int ret; | ||
1651 | u8 mask = SR_BP2 | SR_BP1 | SR_BP0; | ||
1652 | |||
1653 | ret = read_sr(nor); | ||
1654 | if (ret < 0) { | ||
1655 | dev_err(nor->dev, "error while reading status register\n"); | ||
1656 | return ret; | ||
1657 | } | ||
1658 | |||
1659 | write_enable(nor); | ||
1660 | |||
1661 | ret = write_sr(nor, ret & ~mask); | ||
1662 | if (ret) { | ||
1663 | dev_err(nor->dev, "write to status register failed\n"); | ||
1664 | return ret; | ||
1665 | } | ||
1666 | |||
1667 | ret = spi_nor_wait_till_ready(nor); | ||
1668 | if (ret) | ||
1669 | dev_err(nor->dev, "timeout while writing status register\n"); | ||
1670 | return ret; | ||
1671 | } | ||
1672 | |||
1673 | /** | ||
1674 | * spi_nor_spansion_clear_sr_bp() - clear the Status Register Block Protection | ||
1675 | * bits on spansion flashes. | ||
1676 | * @nor: pointer to a 'struct spi_nor' | ||
1677 | * | ||
1678 | * Read-modify-write function that clears the Block Protection bits from the | ||
1679 | * Status Register without affecting other bits. The function is tightly | ||
1680 | * coupled with the spansion_quad_enable() function. Both assume that the Write | ||
1681 | * Register with 16 bits, together with the Read Configuration Register (35h) | ||
1682 | * instructions are supported. | ||
1683 | * | ||
1684 | * Return: 0 on success, -errno otherwise. | ||
1685 | */ | ||
1686 | static int spi_nor_spansion_clear_sr_bp(struct spi_nor *nor) | ||
1687 | { | ||
1688 | int ret; | ||
1689 | u8 mask = SR_BP2 | SR_BP1 | SR_BP0; | ||
1690 | u8 sr_cr[2] = {0}; | ||
1691 | |||
1692 | /* Check current Quad Enable bit value. */ | ||
1693 | ret = read_cr(nor); | ||
1694 | if (ret < 0) { | ||
1695 | dev_err(nor->dev, | ||
1696 | "error while reading configuration register\n"); | ||
1697 | return ret; | ||
1698 | } | ||
1699 | |||
1700 | /* | ||
1701 | * When the configuration register Quad Enable bit is one, only the | ||
1702 | * Write Status (01h) command with two data bytes may be used. | ||
1703 | */ | ||
1704 | if (ret & CR_QUAD_EN_SPAN) { | ||
1705 | sr_cr[1] = ret; | ||
1706 | |||
1707 | ret = read_sr(nor); | ||
1708 | if (ret < 0) { | ||
1709 | dev_err(nor->dev, | ||
1710 | "error while reading status register\n"); | ||
1711 | return ret; | ||
1712 | } | ||
1713 | sr_cr[0] = ret & ~mask; | ||
1714 | |||
1715 | ret = write_sr_cr(nor, sr_cr); | ||
1716 | if (ret) | ||
1717 | dev_err(nor->dev, "16-bit write register failed\n"); | ||
1718 | return ret; | ||
1719 | } | ||
1720 | |||
1721 | /* | ||
1722 | * If the Quad Enable bit is zero, use the Write Status (01h) command | ||
1723 | * with one data byte. | ||
1724 | */ | ||
1725 | return spi_nor_clear_sr_bp(nor); | ||
1726 | } | ||
1727 | |||
1639 | /* Used when the "_ext_id" is two bytes at most */ | 1728 | /* Used when the "_ext_id" is two bytes at most */ |
1640 | #define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags) \ | 1729 | #define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags) \ |
1641 | .id = { \ | 1730 | .id = { \ |
@@ -3660,6 +3749,8 @@ static int spi_nor_init_params(struct spi_nor *nor, | |||
3660 | default: | 3749 | default: |
3661 | /* Kept only for backward compatibility purpose. */ | 3750 | /* Kept only for backward compatibility purpose. */ |
3662 | params->quad_enable = spansion_quad_enable; | 3751 | params->quad_enable = spansion_quad_enable; |
3752 | if (nor->clear_sr_bp) | ||
3753 | nor->clear_sr_bp = spi_nor_spansion_clear_sr_bp; | ||
3663 | break; | 3754 | break; |
3664 | } | 3755 | } |
3665 | 3756 | ||
@@ -3912,17 +4003,13 @@ static int spi_nor_init(struct spi_nor *nor) | |||
3912 | { | 4003 | { |
3913 | int err; | 4004 | int err; |
3914 | 4005 | ||
3915 | /* | 4006 | if (nor->clear_sr_bp) { |
3916 | * Atmel, SST, Intel/Numonyx, and others serial NOR tend to power up | 4007 | err = nor->clear_sr_bp(nor); |
3917 | * with the software protection bits set | 4008 | if (err) { |
3918 | */ | 4009 | dev_err(nor->dev, |
3919 | if (JEDEC_MFR(nor->info) == SNOR_MFR_ATMEL || | 4010 | "fail to clear block protection bits\n"); |
3920 | JEDEC_MFR(nor->info) == SNOR_MFR_INTEL || | 4011 | return err; |
3921 | JEDEC_MFR(nor->info) == SNOR_MFR_SST || | 4012 | } |
3922 | nor->info->flags & SPI_NOR_HAS_LOCK) { | ||
3923 | write_enable(nor); | ||
3924 | write_sr(nor, 0); | ||
3925 | spi_nor_wait_till_ready(nor); | ||
3926 | } | 4013 | } |
3927 | 4014 | ||
3928 | if (nor->quad_enable) { | 4015 | if (nor->quad_enable) { |
@@ -4047,6 +4134,16 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, | |||
4047 | if (info->flags & SPI_S3AN) | 4134 | if (info->flags & SPI_S3AN) |
4048 | nor->flags |= SNOR_F_READY_XSR_RDY; | 4135 | nor->flags |= SNOR_F_READY_XSR_RDY; |
4049 | 4136 | ||
4137 | /* | ||
4138 | * Atmel, SST, Intel/Numonyx, and others serial NOR tend to power up | ||
4139 | * with the software protection bits set. | ||
4140 | */ | ||
4141 | if (JEDEC_MFR(nor->info) == SNOR_MFR_ATMEL || | ||
4142 | JEDEC_MFR(nor->info) == SNOR_MFR_INTEL || | ||
4143 | JEDEC_MFR(nor->info) == SNOR_MFR_SST || | ||
4144 | nor->info->flags & SPI_NOR_HAS_LOCK) | ||
4145 | nor->clear_sr_bp = spi_nor_clear_sr_bp; | ||
4146 | |||
4050 | /* Parse the Serial Flash Discoverable Parameters table. */ | 4147 | /* Parse the Serial Flash Discoverable Parameters table. */ |
4051 | ret = spi_nor_init_params(nor, ¶ms); | 4148 | ret = spi_nor_init_params(nor, ¶ms); |
4052 | if (ret) | 4149 | if (ret) |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 4f5b3baf04c3..a30595955a37 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -4304,12 +4304,12 @@ void bond_setup(struct net_device *bond_dev) | |||
4304 | bond_dev->features |= NETIF_F_NETNS_LOCAL; | 4304 | bond_dev->features |= NETIF_F_NETNS_LOCAL; |
4305 | 4305 | ||
4306 | bond_dev->hw_features = BOND_VLAN_FEATURES | | 4306 | bond_dev->hw_features = BOND_VLAN_FEATURES | |
4307 | NETIF_F_HW_VLAN_CTAG_TX | | ||
4308 | NETIF_F_HW_VLAN_CTAG_RX | | 4307 | NETIF_F_HW_VLAN_CTAG_RX | |
4309 | NETIF_F_HW_VLAN_CTAG_FILTER; | 4308 | NETIF_F_HW_VLAN_CTAG_FILTER; |
4310 | 4309 | ||
4311 | bond_dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4; | 4310 | bond_dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4; |
4312 | bond_dev->features |= bond_dev->hw_features; | 4311 | bond_dev->features |= bond_dev->hw_features; |
4312 | bond_dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX; | ||
4313 | } | 4313 | } |
4314 | 4314 | ||
4315 | /* Destroy a bonding device. | 4315 | /* Destroy a bonding device. |
diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index deb4b6d321b8..a3d2d67894bd 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c | |||
@@ -433,9 +433,9 @@ int ksz_switch_register(struct ksz_device *dev, | |||
433 | return PTR_ERR(dev->reset_gpio); | 433 | return PTR_ERR(dev->reset_gpio); |
434 | 434 | ||
435 | if (dev->reset_gpio) { | 435 | if (dev->reset_gpio) { |
436 | gpiod_set_value(dev->reset_gpio, 1); | 436 | gpiod_set_value_cansleep(dev->reset_gpio, 1); |
437 | mdelay(10); | 437 | mdelay(10); |
438 | gpiod_set_value(dev->reset_gpio, 0); | 438 | gpiod_set_value_cansleep(dev->reset_gpio, 0); |
439 | } | 439 | } |
440 | 440 | ||
441 | mutex_init(&dev->dev_mutex); | 441 | mutex_init(&dev->dev_mutex); |
@@ -485,7 +485,7 @@ void ksz_switch_remove(struct ksz_device *dev) | |||
485 | dsa_unregister_switch(dev->ds); | 485 | dsa_unregister_switch(dev->ds); |
486 | 486 | ||
487 | if (dev->reset_gpio) | 487 | if (dev->reset_gpio) |
488 | gpiod_set_value(dev->reset_gpio, 1); | 488 | gpiod_set_value_cansleep(dev->reset_gpio, 1); |
489 | 489 | ||
490 | } | 490 | } |
491 | EXPORT_SYMBOL(ksz_switch_remove); | 491 | EXPORT_SYMBOL(ksz_switch_remove); |
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_filters.c b/drivers/net/ethernet/aquantia/atlantic/aq_filters.c index 04a4cb7cfcc5..440690b18734 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_filters.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_filters.c | |||
@@ -843,9 +843,14 @@ int aq_filters_vlans_update(struct aq_nic_s *aq_nic) | |||
843 | return err; | 843 | return err; |
844 | 844 | ||
845 | if (aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) { | 845 | if (aq_nic->ndev->features & NETIF_F_HW_VLAN_CTAG_FILTER) { |
846 | if (hweight < AQ_VLAN_MAX_FILTERS) | 846 | if (hweight < AQ_VLAN_MAX_FILTERS && hweight > 0) { |
847 | err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, true); | 847 | err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, |
848 | !(aq_nic->packet_filter & IFF_PROMISC)); | ||
849 | aq_nic->aq_nic_cfg.is_vlan_force_promisc = false; | ||
850 | } else { | ||
848 | /* otherwise left in promiscue mode */ | 851 | /* otherwise left in promiscue mode */ |
852 | aq_nic->aq_nic_cfg.is_vlan_force_promisc = true; | ||
853 | } | ||
849 | } | 854 | } |
850 | 855 | ||
851 | return err; | 856 | return err; |
@@ -866,6 +871,7 @@ int aq_filters_vlan_offload_off(struct aq_nic_s *aq_nic) | |||
866 | if (unlikely(!aq_hw_ops->hw_filter_vlan_ctrl)) | 871 | if (unlikely(!aq_hw_ops->hw_filter_vlan_ctrl)) |
867 | return -EOPNOTSUPP; | 872 | return -EOPNOTSUPP; |
868 | 873 | ||
874 | aq_nic->aq_nic_cfg.is_vlan_force_promisc = true; | ||
869 | err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, false); | 875 | err = aq_hw_ops->hw_filter_vlan_ctrl(aq_hw, false); |
870 | if (err) | 876 | if (err) |
871 | return err; | 877 | return err; |
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index 746f85e6de13..e1392766e21e 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c | |||
@@ -128,6 +128,7 @@ void aq_nic_cfg_start(struct aq_nic_s *self) | |||
128 | cfg->features = cfg->aq_hw_caps->hw_features; | 128 | cfg->features = cfg->aq_hw_caps->hw_features; |
129 | cfg->is_vlan_rx_strip = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_RX); | 129 | cfg->is_vlan_rx_strip = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_RX); |
130 | cfg->is_vlan_tx_insert = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_TX); | 130 | cfg->is_vlan_tx_insert = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_TX); |
131 | cfg->is_vlan_force_promisc = true; | ||
131 | } | 132 | } |
132 | 133 | ||
133 | static int aq_nic_update_link_status(struct aq_nic_s *self) | 134 | static int aq_nic_update_link_status(struct aq_nic_s *self) |
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h index 26c72f298684..255b54a6ae07 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h | |||
@@ -37,6 +37,7 @@ struct aq_nic_cfg_s { | |||
37 | u32 wol; | 37 | u32 wol; |
38 | u8 is_vlan_rx_strip; | 38 | u8 is_vlan_rx_strip; |
39 | u8 is_vlan_tx_insert; | 39 | u8 is_vlan_tx_insert; |
40 | bool is_vlan_force_promisc; | ||
40 | u16 is_mc_list_enabled; | 41 | u16 is_mc_list_enabled; |
41 | u16 mc_list_count; | 42 | u16 mc_list_count; |
42 | bool is_autoneg; | 43 | bool is_autoneg; |
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c index 1d216757bb9d..30f7fc4c97ff 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c | |||
@@ -808,8 +808,15 @@ static int hw_atl_b0_hw_packet_filter_set(struct aq_hw_s *self, | |||
808 | unsigned int packet_filter) | 808 | unsigned int packet_filter) |
809 | { | 809 | { |
810 | unsigned int i = 0U; | 810 | unsigned int i = 0U; |
811 | struct aq_nic_cfg_s *cfg = self->aq_nic_cfg; | ||
812 | |||
813 | hw_atl_rpfl2promiscuous_mode_en_set(self, | ||
814 | IS_FILTER_ENABLED(IFF_PROMISC)); | ||
815 | |||
816 | hw_atl_rpf_vlan_prom_mode_en_set(self, | ||
817 | IS_FILTER_ENABLED(IFF_PROMISC) || | ||
818 | cfg->is_vlan_force_promisc); | ||
811 | 819 | ||
812 | hw_atl_rpfl2promiscuous_mode_en_set(self, IS_FILTER_ENABLED(IFF_PROMISC)); | ||
813 | hw_atl_rpfl2multicast_flr_en_set(self, | 820 | hw_atl_rpfl2multicast_flr_en_set(self, |
814 | IS_FILTER_ENABLED(IFF_ALLMULTI), 0); | 821 | IS_FILTER_ENABLED(IFF_ALLMULTI), 0); |
815 | 822 | ||
@@ -818,13 +825,13 @@ static int hw_atl_b0_hw_packet_filter_set(struct aq_hw_s *self, | |||
818 | 825 | ||
819 | hw_atl_rpfl2broadcast_en_set(self, IS_FILTER_ENABLED(IFF_BROADCAST)); | 826 | hw_atl_rpfl2broadcast_en_set(self, IS_FILTER_ENABLED(IFF_BROADCAST)); |
820 | 827 | ||
821 | self->aq_nic_cfg->is_mc_list_enabled = IS_FILTER_ENABLED(IFF_MULTICAST); | 828 | cfg->is_mc_list_enabled = IS_FILTER_ENABLED(IFF_MULTICAST); |
822 | 829 | ||
823 | for (i = HW_ATL_B0_MAC_MIN; i < HW_ATL_B0_MAC_MAX; ++i) | 830 | for (i = HW_ATL_B0_MAC_MIN; i < HW_ATL_B0_MAC_MAX; ++i) |
824 | hw_atl_rpfl2_uc_flr_en_set(self, | 831 | hw_atl_rpfl2_uc_flr_en_set(self, |
825 | (self->aq_nic_cfg->is_mc_list_enabled && | 832 | (cfg->is_mc_list_enabled && |
826 | (i <= self->aq_nic_cfg->mc_list_count)) ? | 833 | (i <= cfg->mc_list_count)) ? |
827 | 1U : 0U, i); | 834 | 1U : 0U, i); |
828 | 835 | ||
829 | return aq_hw_err_from_flags(self); | 836 | return aq_hw_err_from_flags(self); |
830 | } | 837 | } |
@@ -1116,7 +1123,7 @@ static int hw_atl_b0_hw_vlan_set(struct aq_hw_s *self, | |||
1116 | static int hw_atl_b0_hw_vlan_ctrl(struct aq_hw_s *self, bool enable) | 1123 | static int hw_atl_b0_hw_vlan_ctrl(struct aq_hw_s *self, bool enable) |
1117 | { | 1124 | { |
1118 | /* set promisc in case of disabing the vland filter */ | 1125 | /* set promisc in case of disabing the vland filter */ |
1119 | hw_atl_rpf_vlan_prom_mode_en_set(self, !!!enable); | 1126 | hw_atl_rpf_vlan_prom_mode_en_set(self, !enable); |
1120 | 1127 | ||
1121 | return aq_hw_err_from_flags(self); | 1128 | return aq_hw_err_from_flags(self); |
1122 | } | 1129 | } |
diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c index 5d41e41a889c..a27d32f69de9 100644 --- a/drivers/net/ethernet/cadence/macb_main.c +++ b/drivers/net/ethernet/cadence/macb_main.c | |||
@@ -4303,7 +4303,7 @@ static int macb_probe(struct platform_device *pdev) | |||
4303 | if (PTR_ERR(mac) == -EPROBE_DEFER) { | 4303 | if (PTR_ERR(mac) == -EPROBE_DEFER) { |
4304 | err = -EPROBE_DEFER; | 4304 | err = -EPROBE_DEFER; |
4305 | goto err_out_free_netdev; | 4305 | goto err_out_free_netdev; |
4306 | } else if (!IS_ERR(mac)) { | 4306 | } else if (!IS_ERR_OR_NULL(mac)) { |
4307 | ether_addr_copy(bp->dev->dev_addr, mac); | 4307 | ether_addr_copy(bp->dev->dev_addr, mac); |
4308 | } else { | 4308 | } else { |
4309 | macb_get_hwaddr(bp); | 4309 | macb_get_hwaddr(bp); |
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c index 8a6785173228..492f8769ac12 100644 --- a/drivers/net/ethernet/emulex/benet/be_ethtool.c +++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c | |||
@@ -891,7 +891,7 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test, | |||
891 | u64 *data) | 891 | u64 *data) |
892 | { | 892 | { |
893 | struct be_adapter *adapter = netdev_priv(netdev); | 893 | struct be_adapter *adapter = netdev_priv(netdev); |
894 | int status; | 894 | int status, cnt; |
895 | u8 link_status = 0; | 895 | u8 link_status = 0; |
896 | 896 | ||
897 | if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) { | 897 | if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) { |
@@ -902,6 +902,9 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test, | |||
902 | 902 | ||
903 | memset(data, 0, sizeof(u64) * ETHTOOL_TESTS_NUM); | 903 | memset(data, 0, sizeof(u64) * ETHTOOL_TESTS_NUM); |
904 | 904 | ||
905 | /* check link status before offline tests */ | ||
906 | link_status = netif_carrier_ok(netdev); | ||
907 | |||
905 | if (test->flags & ETH_TEST_FL_OFFLINE) { | 908 | if (test->flags & ETH_TEST_FL_OFFLINE) { |
906 | if (be_loopback_test(adapter, BE_MAC_LOOPBACK, &data[0]) != 0) | 909 | if (be_loopback_test(adapter, BE_MAC_LOOPBACK, &data[0]) != 0) |
907 | test->flags |= ETH_TEST_FL_FAILED; | 910 | test->flags |= ETH_TEST_FL_FAILED; |
@@ -922,13 +925,26 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test, | |||
922 | test->flags |= ETH_TEST_FL_FAILED; | 925 | test->flags |= ETH_TEST_FL_FAILED; |
923 | } | 926 | } |
924 | 927 | ||
925 | status = be_cmd_link_status_query(adapter, NULL, &link_status, 0); | 928 | /* link status was down prior to test */ |
926 | if (status) { | 929 | if (!link_status) { |
927 | test->flags |= ETH_TEST_FL_FAILED; | ||
928 | data[4] = -1; | ||
929 | } else if (!link_status) { | ||
930 | test->flags |= ETH_TEST_FL_FAILED; | 930 | test->flags |= ETH_TEST_FL_FAILED; |
931 | data[4] = 1; | 931 | data[4] = 1; |
932 | return; | ||
933 | } | ||
934 | |||
935 | for (cnt = 10; cnt; cnt--) { | ||
936 | status = be_cmd_link_status_query(adapter, NULL, &link_status, | ||
937 | 0); | ||
938 | if (status) { | ||
939 | test->flags |= ETH_TEST_FL_FAILED; | ||
940 | data[4] = -1; | ||
941 | break; | ||
942 | } | ||
943 | |||
944 | if (link_status) | ||
945 | break; | ||
946 | |||
947 | msleep_interruptible(500); | ||
932 | } | 948 | } |
933 | } | 949 | } |
934 | 950 | ||
diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c index 67f9bb6e941b..9b036c857b1d 100644 --- a/drivers/net/ethernet/sis/sis900.c +++ b/drivers/net/ethernet/sis/sis900.c | |||
@@ -1057,7 +1057,7 @@ sis900_open(struct net_device *net_dev) | |||
1057 | sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); | 1057 | sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); |
1058 | 1058 | ||
1059 | /* Enable all known interrupts by setting the interrupt mask. */ | 1059 | /* Enable all known interrupts by setting the interrupt mask. */ |
1060 | sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); | 1060 | sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC); |
1061 | sw32(cr, RxENA | sr32(cr)); | 1061 | sw32(cr, RxENA | sr32(cr)); |
1062 | sw32(ier, IE); | 1062 | sw32(ier, IE); |
1063 | 1063 | ||
@@ -1578,7 +1578,7 @@ static void sis900_tx_timeout(struct net_device *net_dev) | |||
1578 | sw32(txdp, sis_priv->tx_ring_dma); | 1578 | sw32(txdp, sis_priv->tx_ring_dma); |
1579 | 1579 | ||
1580 | /* Enable all known interrupts by setting the interrupt mask. */ | 1580 | /* Enable all known interrupts by setting the interrupt mask. */ |
1581 | sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); | 1581 | sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC); |
1582 | } | 1582 | } |
1583 | 1583 | ||
1584 | /** | 1584 | /** |
@@ -1618,7 +1618,7 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev) | |||
1618 | spin_unlock_irqrestore(&sis_priv->lock, flags); | 1618 | spin_unlock_irqrestore(&sis_priv->lock, flags); |
1619 | return NETDEV_TX_OK; | 1619 | return NETDEV_TX_OK; |
1620 | } | 1620 | } |
1621 | sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len); | 1621 | sis_priv->tx_ring[entry].cmdsts = (OWN | INTR | skb->len); |
1622 | sw32(cr, TxENA | sr32(cr)); | 1622 | sw32(cr, TxENA | sr32(cr)); |
1623 | 1623 | ||
1624 | sis_priv->cur_tx ++; | 1624 | sis_priv->cur_tx ++; |
@@ -1674,7 +1674,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance) | |||
1674 | do { | 1674 | do { |
1675 | status = sr32(isr); | 1675 | status = sr32(isr); |
1676 | 1676 | ||
1677 | if ((status & (HIBERR|TxURN|TxERR|TxIDLE|RxORN|RxERR|RxOK)) == 0) | 1677 | if ((status & (HIBERR|TxURN|TxERR|TxIDLE|TxDESC|RxORN|RxERR|RxOK)) == 0) |
1678 | /* nothing intresting happened */ | 1678 | /* nothing intresting happened */ |
1679 | break; | 1679 | break; |
1680 | handled = 1; | 1680 | handled = 1; |
@@ -1684,7 +1684,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance) | |||
1684 | /* Rx interrupt */ | 1684 | /* Rx interrupt */ |
1685 | sis900_rx(net_dev); | 1685 | sis900_rx(net_dev); |
1686 | 1686 | ||
1687 | if (status & (TxURN | TxERR | TxIDLE)) | 1687 | if (status & (TxURN | TxERR | TxIDLE | TxDESC)) |
1688 | /* Tx interrupt */ | 1688 | /* Tx interrupt */ |
1689 | sis900_finish_xmit(net_dev); | 1689 | sis900_finish_xmit(net_dev); |
1690 | 1690 | ||
@@ -1896,8 +1896,8 @@ static void sis900_finish_xmit (struct net_device *net_dev) | |||
1896 | 1896 | ||
1897 | if (tx_status & OWN) { | 1897 | if (tx_status & OWN) { |
1898 | /* The packet is not transmitted yet (owned by hardware) ! | 1898 | /* The packet is not transmitted yet (owned by hardware) ! |
1899 | * Note: the interrupt is generated only when Tx Machine | 1899 | * Note: this is an almost impossible condition |
1900 | * is idle, so this is an almost impossible case */ | 1900 | * in case of TxDESC ('descriptor interrupt') */ |
1901 | break; | 1901 | break; |
1902 | } | 1902 | } |
1903 | 1903 | ||
@@ -2473,7 +2473,7 @@ static int sis900_resume(struct pci_dev *pci_dev) | |||
2473 | sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); | 2473 | sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); |
2474 | 2474 | ||
2475 | /* Enable all known interrupts by setting the interrupt mask. */ | 2475 | /* Enable all known interrupts by setting the interrupt mask. */ |
2476 | sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); | 2476 | sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC); |
2477 | sw32(cr, RxENA | sr32(cr)); | 2477 | sw32(cr, RxENA | sr32(cr)); |
2478 | sw32(ier, IE); | 2478 | sw32(ier, IE); |
2479 | 2479 | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c index 2dcdf761d525..020159622559 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c | |||
@@ -112,7 +112,7 @@ static int adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec, | |||
112 | * programmed with (2^32 – <new_sec_value>) | 112 | * programmed with (2^32 – <new_sec_value>) |
113 | */ | 113 | */ |
114 | if (gmac4) | 114 | if (gmac4) |
115 | sec = (100000000ULL - sec); | 115 | sec = -sec; |
116 | 116 | ||
117 | value = readl(ioaddr + PTP_TCR); | 117 | value = readl(ioaddr + PTP_TCR); |
118 | if (value & PTP_TCR_TSCTRLSSR) | 118 | if (value & PTP_TCR_TSCTRLSSR) |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index ee4f1e265993..8f5ebd51859e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
@@ -2892,12 +2892,15 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2892 | 2892 | ||
2893 | /* Manage tx mitigation */ | 2893 | /* Manage tx mitigation */ |
2894 | tx_q->tx_count_frames += nfrags + 1; | 2894 | tx_q->tx_count_frames += nfrags + 1; |
2895 | if (priv->tx_coal_frames <= tx_q->tx_count_frames) { | 2895 | if (likely(priv->tx_coal_frames > tx_q->tx_count_frames) && |
2896 | !(priv->synopsys_id >= DWMAC_CORE_4_00 && | ||
2897 | (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && | ||
2898 | priv->hwts_tx_en)) { | ||
2899 | stmmac_tx_timer_arm(priv, queue); | ||
2900 | } else { | ||
2901 | tx_q->tx_count_frames = 0; | ||
2896 | stmmac_set_tx_ic(priv, desc); | 2902 | stmmac_set_tx_ic(priv, desc); |
2897 | priv->xstats.tx_set_ic_bit++; | 2903 | priv->xstats.tx_set_ic_bit++; |
2898 | tx_q->tx_count_frames = 0; | ||
2899 | } else { | ||
2900 | stmmac_tx_timer_arm(priv, queue); | ||
2901 | } | 2904 | } |
2902 | 2905 | ||
2903 | skb_tx_timestamp(skb); | 2906 | skb_tx_timestamp(skb); |
@@ -3111,12 +3114,15 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3111 | * element in case of no SG. | 3114 | * element in case of no SG. |
3112 | */ | 3115 | */ |
3113 | tx_q->tx_count_frames += nfrags + 1; | 3116 | tx_q->tx_count_frames += nfrags + 1; |
3114 | if (priv->tx_coal_frames <= tx_q->tx_count_frames) { | 3117 | if (likely(priv->tx_coal_frames > tx_q->tx_count_frames) && |
3118 | !(priv->synopsys_id >= DWMAC_CORE_4_00 && | ||
3119 | (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && | ||
3120 | priv->hwts_tx_en)) { | ||
3121 | stmmac_tx_timer_arm(priv, queue); | ||
3122 | } else { | ||
3123 | tx_q->tx_count_frames = 0; | ||
3115 | stmmac_set_tx_ic(priv, desc); | 3124 | stmmac_set_tx_ic(priv, desc); |
3116 | priv->xstats.tx_set_ic_bit++; | 3125 | priv->xstats.tx_set_ic_bit++; |
3117 | tx_q->tx_count_frames = 0; | ||
3118 | } else { | ||
3119 | stmmac_tx_timer_arm(priv, queue); | ||
3120 | } | 3126 | } |
3121 | 3127 | ||
3122 | skb_tx_timestamp(skb); | 3128 | skb_tx_timestamp(skb); |
diff --git a/drivers/net/ppp/ppp_mppe.c b/drivers/net/ppp/ppp_mppe.c index ff61dd8748de..66c8e65f6872 100644 --- a/drivers/net/ppp/ppp_mppe.c +++ b/drivers/net/ppp/ppp_mppe.c | |||
@@ -63,6 +63,7 @@ MODULE_AUTHOR("Frank Cusack <fcusack@fcusack.com>"); | |||
63 | MODULE_DESCRIPTION("Point-to-Point Protocol Microsoft Point-to-Point Encryption support"); | 63 | MODULE_DESCRIPTION("Point-to-Point Protocol Microsoft Point-to-Point Encryption support"); |
64 | MODULE_LICENSE("Dual BSD/GPL"); | 64 | MODULE_LICENSE("Dual BSD/GPL"); |
65 | MODULE_ALIAS("ppp-compress-" __stringify(CI_MPPE)); | 65 | MODULE_ALIAS("ppp-compress-" __stringify(CI_MPPE)); |
66 | MODULE_SOFTDEP("pre: arc4"); | ||
66 | MODULE_VERSION("1.0.2"); | 67 | MODULE_VERSION("1.0.2"); |
67 | 68 | ||
68 | static unsigned int | 69 | static unsigned int |
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index f3422f85f604..abfa0da9bbd2 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -2153,12 +2153,12 @@ static void team_setup(struct net_device *dev) | |||
2153 | dev->features |= NETIF_F_NETNS_LOCAL; | 2153 | dev->features |= NETIF_F_NETNS_LOCAL; |
2154 | 2154 | ||
2155 | dev->hw_features = TEAM_VLAN_FEATURES | | 2155 | dev->hw_features = TEAM_VLAN_FEATURES | |
2156 | NETIF_F_HW_VLAN_CTAG_TX | | ||
2157 | NETIF_F_HW_VLAN_CTAG_RX | | 2156 | NETIF_F_HW_VLAN_CTAG_RX | |
2158 | NETIF_F_HW_VLAN_CTAG_FILTER; | 2157 | NETIF_F_HW_VLAN_CTAG_FILTER; |
2159 | 2158 | ||
2160 | dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4; | 2159 | dev->hw_features |= NETIF_F_GSO_ENCAP_ALL | NETIF_F_GSO_UDP_L4; |
2161 | dev->features |= dev->hw_features; | 2160 | dev->features |= dev->hw_features; |
2161 | dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX; | ||
2162 | } | 2162 | } |
2163 | 2163 | ||
2164 | static int team_newlink(struct net *src_net, struct net_device *dev, | 2164 | static int team_newlink(struct net *src_net, struct net_device *dev, |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index d080f8048e52..8b4ad10cf940 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
@@ -1482,7 +1482,7 @@ static int qmi_wwan_probe(struct usb_interface *intf, | |||
1482 | * different. Ignore the current interface if the number of endpoints | 1482 | * different. Ignore the current interface if the number of endpoints |
1483 | * equals the number for the diag interface (two). | 1483 | * equals the number for the diag interface (two). |
1484 | */ | 1484 | */ |
1485 | info = (void *)&id->driver_info; | 1485 | info = (void *)id->driver_info; |
1486 | 1486 | ||
1487 | if (info->data & QMI_WWAN_QUIRK_QUECTEL_DYNCFG) { | 1487 | if (info->data & QMI_WWAN_QUIRK_QUECTEL_DYNCFG) { |
1488 | if (desc->bNumEndpoints == 2) | 1488 | if (desc->bNumEndpoints == 2) |
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index 69ef9cce5858..54edf8956a25 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c | |||
@@ -350,8 +350,8 @@ static int vrf_finish_output6(struct net *net, struct sock *sk, | |||
350 | { | 350 | { |
351 | struct dst_entry *dst = skb_dst(skb); | 351 | struct dst_entry *dst = skb_dst(skb); |
352 | struct net_device *dev = dst->dev; | 352 | struct net_device *dev = dst->dev; |
353 | const struct in6_addr *nexthop; | ||
353 | struct neighbour *neigh; | 354 | struct neighbour *neigh; |
354 | struct in6_addr *nexthop; | ||
355 | int ret; | 355 | int ret; |
356 | 356 | ||
357 | nf_reset(skb); | 357 | nf_reset(skb); |
diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c index a98126ad9c3a..a4994aa3acc0 100644 --- a/drivers/pci/p2pdma.c +++ b/drivers/pci/p2pdma.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/percpu-refcount.h> | 18 | #include <linux/percpu-refcount.h> |
19 | #include <linux/random.h> | 19 | #include <linux/random.h> |
20 | #include <linux/seq_buf.h> | 20 | #include <linux/seq_buf.h> |
21 | #include <linux/iommu.h> | ||
21 | 22 | ||
22 | struct pci_p2pdma { | 23 | struct pci_p2pdma { |
23 | struct gen_pool *pool; | 24 | struct gen_pool *pool; |
@@ -299,6 +300,9 @@ static bool root_complex_whitelist(struct pci_dev *dev) | |||
299 | struct pci_dev *root = pci_get_slot(host->bus, PCI_DEVFN(0, 0)); | 300 | struct pci_dev *root = pci_get_slot(host->bus, PCI_DEVFN(0, 0)); |
300 | unsigned short vendor, device; | 301 | unsigned short vendor, device; |
301 | 302 | ||
303 | if (iommu_present(dev->dev.bus)) | ||
304 | return false; | ||
305 | |||
302 | if (!root) | 306 | if (!root) |
303 | return false; | 307 | return false; |
304 | 308 | ||
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c index 1b58e63b4e51..acb930b8c6a6 100644 --- a/drivers/scsi/qedi/qedi_main.c +++ b/drivers/scsi/qedi/qedi_main.c | |||
@@ -987,6 +987,9 @@ static int qedi_find_boot_info(struct qedi_ctx *qedi, | |||
987 | if (!iscsi_is_session_online(cls_sess)) | 987 | if (!iscsi_is_session_online(cls_sess)) |
988 | continue; | 988 | continue; |
989 | 989 | ||
990 | if (!sess->targetname) | ||
991 | continue; | ||
992 | |||
990 | if (pri_ctrl_flags) { | 993 | if (pri_ctrl_flags) { |
991 | if (!strcmp(pri_tgt->iscsi_name, sess->targetname) && | 994 | if (!strcmp(pri_tgt->iscsi_name, sess->targetname) && |
992 | !strcmp(pri_tgt->ip_addr, ep_ip_addr)) { | 995 | !strcmp(pri_tgt->ip_addr, ep_ip_addr)) { |
diff --git a/drivers/scsi/qedi/qedi_version.h b/drivers/scsi/qedi/qedi_version.h index f56f0ba0c4a8..0ac1055bd420 100644 --- a/drivers/scsi/qedi/qedi_version.h +++ b/drivers/scsi/qedi/qedi_version.h | |||
@@ -4,8 +4,8 @@ | |||
4 | * Copyright (c) 2016 Cavium Inc. | 4 | * Copyright (c) 2016 Cavium Inc. |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #define QEDI_MODULE_VERSION "8.33.0.21" | 7 | #define QEDI_MODULE_VERSION "8.37.0.20" |
8 | #define QEDI_DRIVER_MAJOR_VER 8 | 8 | #define QEDI_DRIVER_MAJOR_VER 8 |
9 | #define QEDI_DRIVER_MINOR_VER 33 | 9 | #define QEDI_DRIVER_MINOR_VER 37 |
10 | #define QEDI_DRIVER_REV_VER 0 | 10 | #define QEDI_DRIVER_REV_VER 0 |
11 | #define QEDI_DRIVER_ENG_VER 21 | 11 | #define QEDI_DRIVER_ENG_VER 20 |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 172ef21827dd..d056f5e7cf93 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -1731,8 +1731,8 @@ static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res, | |||
1731 | !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && | 1731 | !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && |
1732 | !qla2x00_isp_reg_stat(ha))) { | 1732 | !qla2x00_isp_reg_stat(ha))) { |
1733 | sp->comp = ∁ | 1733 | sp->comp = ∁ |
1734 | rval = ha->isp_ops->abort_command(sp); | ||
1735 | spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); | 1734 | spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); |
1735 | rval = ha->isp_ops->abort_command(sp); | ||
1736 | 1736 | ||
1737 | switch (rval) { | 1737 | switch (rval) { |
1738 | case QLA_SUCCESS: | 1738 | case QLA_SUCCESS: |
diff --git a/drivers/scsi/ufs/ufshcd-pltfrm.c b/drivers/scsi/ufs/ufshcd-pltfrm.c index 8a74ec30c3d2..d7d521b394c3 100644 --- a/drivers/scsi/ufs/ufshcd-pltfrm.c +++ b/drivers/scsi/ufs/ufshcd-pltfrm.c | |||
@@ -430,24 +430,21 @@ int ufshcd_pltfrm_init(struct platform_device *pdev, | |||
430 | goto dealloc_host; | 430 | goto dealloc_host; |
431 | } | 431 | } |
432 | 432 | ||
433 | pm_runtime_set_active(&pdev->dev); | ||
434 | pm_runtime_enable(&pdev->dev); | ||
435 | |||
436 | ufshcd_init_lanes_per_dir(hba); | 433 | ufshcd_init_lanes_per_dir(hba); |
437 | 434 | ||
438 | err = ufshcd_init(hba, mmio_base, irq); | 435 | err = ufshcd_init(hba, mmio_base, irq); |
439 | if (err) { | 436 | if (err) { |
440 | dev_err(dev, "Initialization failed\n"); | 437 | dev_err(dev, "Initialization failed\n"); |
441 | goto out_disable_rpm; | 438 | goto dealloc_host; |
442 | } | 439 | } |
443 | 440 | ||
444 | platform_set_drvdata(pdev, hba); | 441 | platform_set_drvdata(pdev, hba); |
445 | 442 | ||
443 | pm_runtime_set_active(&pdev->dev); | ||
444 | pm_runtime_enable(&pdev->dev); | ||
445 | |||
446 | return 0; | 446 | return 0; |
447 | 447 | ||
448 | out_disable_rpm: | ||
449 | pm_runtime_disable(&pdev->dev); | ||
450 | pm_runtime_set_suspended(&pdev->dev); | ||
451 | dealloc_host: | 448 | dealloc_host: |
452 | ufshcd_dealloc_host(hba); | 449 | ufshcd_dealloc_host(hba); |
453 | out: | 450 | out: |
diff --git a/fs/afs/callback.c b/fs/afs/callback.c index d441bef72163..915010464572 100644 --- a/fs/afs/callback.c +++ b/fs/afs/callback.c | |||
@@ -275,9 +275,9 @@ static void afs_break_one_callback(struct afs_server *server, | |||
275 | struct afs_super_info *as = AFS_FS_S(cbi->sb); | 275 | struct afs_super_info *as = AFS_FS_S(cbi->sb); |
276 | struct afs_volume *volume = as->volume; | 276 | struct afs_volume *volume = as->volume; |
277 | 277 | ||
278 | write_lock(&volume->cb_break_lock); | 278 | write_lock(&volume->cb_v_break_lock); |
279 | volume->cb_v_break++; | 279 | volume->cb_v_break++; |
280 | write_unlock(&volume->cb_break_lock); | 280 | write_unlock(&volume->cb_v_break_lock); |
281 | } else { | 281 | } else { |
282 | data.volume = NULL; | 282 | data.volume = NULL; |
283 | data.fid = *fid; | 283 | data.fid = *fid; |
diff --git a/fs/afs/inode.c b/fs/afs/inode.c index b42d9d09669c..18a50d4febcf 100644 --- a/fs/afs/inode.c +++ b/fs/afs/inode.c | |||
@@ -56,6 +56,16 @@ static noinline void dump_vnode(struct afs_vnode *vnode, struct afs_vnode *paren | |||
56 | } | 56 | } |
57 | 57 | ||
58 | /* | 58 | /* |
59 | * Set the file size and block count. Estimate the number of 512 bytes blocks | ||
60 | * used, rounded up to nearest 1K for consistency with other AFS clients. | ||
61 | */ | ||
62 | static void afs_set_i_size(struct afs_vnode *vnode, u64 size) | ||
63 | { | ||
64 | i_size_write(&vnode->vfs_inode, size); | ||
65 | vnode->vfs_inode.i_blocks = ((size + 1023) >> 10) << 1; | ||
66 | } | ||
67 | |||
68 | /* | ||
59 | * Initialise an inode from the vnode status. | 69 | * Initialise an inode from the vnode status. |
60 | */ | 70 | */ |
61 | static int afs_inode_init_from_status(struct afs_vnode *vnode, struct key *key, | 71 | static int afs_inode_init_from_status(struct afs_vnode *vnode, struct key *key, |
@@ -124,12 +134,7 @@ static int afs_inode_init_from_status(struct afs_vnode *vnode, struct key *key, | |||
124 | return afs_protocol_error(NULL, -EBADMSG, afs_eproto_file_type); | 134 | return afs_protocol_error(NULL, -EBADMSG, afs_eproto_file_type); |
125 | } | 135 | } |
126 | 136 | ||
127 | /* | 137 | afs_set_i_size(vnode, status->size); |
128 | * Estimate 512 bytes blocks used, rounded up to nearest 1K | ||
129 | * for consistency with other AFS clients. | ||
130 | */ | ||
131 | inode->i_blocks = ((i_size_read(inode) + 1023) >> 10) << 1; | ||
132 | i_size_write(&vnode->vfs_inode, status->size); | ||
133 | 138 | ||
134 | vnode->invalid_before = status->data_version; | 139 | vnode->invalid_before = status->data_version; |
135 | inode_set_iversion_raw(&vnode->vfs_inode, status->data_version); | 140 | inode_set_iversion_raw(&vnode->vfs_inode, status->data_version); |
@@ -207,11 +212,13 @@ static void afs_apply_status(struct afs_fs_cursor *fc, | |||
207 | 212 | ||
208 | if (expected_version && | 213 | if (expected_version && |
209 | *expected_version != status->data_version) { | 214 | *expected_version != status->data_version) { |
210 | kdebug("vnode modified %llx on {%llx:%llu} [exp %llx] %s", | 215 | if (test_bit(AFS_VNODE_CB_PROMISED, &vnode->flags)) |
211 | (unsigned long long) status->data_version, | 216 | pr_warn("kAFS: vnode modified {%llx:%llu} %llx->%llx %s\n", |
212 | vnode->fid.vid, vnode->fid.vnode, | 217 | vnode->fid.vid, vnode->fid.vnode, |
213 | (unsigned long long) *expected_version, | 218 | (unsigned long long)*expected_version, |
214 | fc->type ? fc->type->name : "???"); | 219 | (unsigned long long)status->data_version, |
220 | fc->type ? fc->type->name : "???"); | ||
221 | |||
215 | vnode->invalid_before = status->data_version; | 222 | vnode->invalid_before = status->data_version; |
216 | if (vnode->status.type == AFS_FTYPE_DIR) { | 223 | if (vnode->status.type == AFS_FTYPE_DIR) { |
217 | if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags)) | 224 | if (test_and_clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags)) |
@@ -230,7 +237,7 @@ static void afs_apply_status(struct afs_fs_cursor *fc, | |||
230 | 237 | ||
231 | if (data_changed) { | 238 | if (data_changed) { |
232 | inode_set_iversion_raw(&vnode->vfs_inode, status->data_version); | 239 | inode_set_iversion_raw(&vnode->vfs_inode, status->data_version); |
233 | i_size_write(&vnode->vfs_inode, status->size); | 240 | afs_set_i_size(vnode, status->size); |
234 | } | 241 | } |
235 | } | 242 | } |
236 | 243 | ||
diff --git a/fs/afs/internal.h b/fs/afs/internal.h index ce9559e98f17..0f84d0da5417 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h | |||
@@ -109,10 +109,8 @@ struct afs_call { | |||
109 | struct rxrpc_call *rxcall; /* RxRPC call handle */ | 109 | struct rxrpc_call *rxcall; /* RxRPC call handle */ |
110 | struct key *key; /* security for this call */ | 110 | struct key *key; /* security for this call */ |
111 | struct afs_net *net; /* The network namespace */ | 111 | struct afs_net *net; /* The network namespace */ |
112 | union { | 112 | struct afs_server *server; /* The fileserver record if fs op (pins ref) */ |
113 | struct afs_server *server; | 113 | struct afs_vlserver *vlserver; /* The vlserver record if vl op */ |
114 | struct afs_vlserver *vlserver; | ||
115 | }; | ||
116 | struct afs_cb_interest *cbi; /* Callback interest for server used */ | 114 | struct afs_cb_interest *cbi; /* Callback interest for server used */ |
117 | struct afs_vnode *lvnode; /* vnode being locked */ | 115 | struct afs_vnode *lvnode; /* vnode being locked */ |
118 | void *request; /* request data (first part) */ | 116 | void *request; /* request data (first part) */ |
@@ -616,7 +614,7 @@ struct afs_volume { | |||
616 | unsigned int servers_seq; /* Incremented each time ->servers changes */ | 614 | unsigned int servers_seq; /* Incremented each time ->servers changes */ |
617 | 615 | ||
618 | unsigned cb_v_break; /* Break-everything counter. */ | 616 | unsigned cb_v_break; /* Break-everything counter. */ |
619 | rwlock_t cb_break_lock; | 617 | rwlock_t cb_v_break_lock; |
620 | 618 | ||
621 | afs_voltype_t type; /* type of volume */ | 619 | afs_voltype_t type; /* type of volume */ |
622 | short error; | 620 | short error; |
diff --git a/fs/afs/volume.c b/fs/afs/volume.c index 08fdb3951c49..1a414300b654 100644 --- a/fs/afs/volume.c +++ b/fs/afs/volume.c | |||
@@ -43,6 +43,7 @@ static struct afs_volume *afs_alloc_volume(struct afs_fs_context *params, | |||
43 | atomic_set(&volume->usage, 1); | 43 | atomic_set(&volume->usage, 1); |
44 | INIT_LIST_HEAD(&volume->proc_link); | 44 | INIT_LIST_HEAD(&volume->proc_link); |
45 | rwlock_init(&volume->servers_lock); | 45 | rwlock_init(&volume->servers_lock); |
46 | rwlock_init(&volume->cb_v_break_lock); | ||
46 | memcpy(volume->name, vldb->name, vldb->name_len + 1); | 47 | memcpy(volume->name, vldb->name, vldb->name_len + 1); |
47 | 48 | ||
48 | slist = afs_alloc_server_list(params->cell, params->key, vldb, type_mask); | 49 | slist = afs_alloc_server_list(params->cell, params->key, vldb, type_mask); |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 9c8ca6cd3ce4..255f6754c70d 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -3077,8 +3077,7 @@ static const struct file_operations proc_tgid_base_operations = { | |||
3077 | 3077 | ||
3078 | struct pid *tgid_pidfd_to_pid(const struct file *file) | 3078 | struct pid *tgid_pidfd_to_pid(const struct file *file) |
3079 | { | 3079 | { |
3080 | if (!d_is_dir(file->f_path.dentry) || | 3080 | if (file->f_op != &proc_tgid_base_operations) |
3081 | (file->f_op != &proc_tgid_base_operations)) | ||
3082 | return ERR_PTR(-EBADF); | 3081 | return ERR_PTR(-EBADF); |
3083 | 3082 | ||
3084 | return proc_pid(file_inode(file)); | 3083 | return proc_pid(file_inode(file)); |
diff --git a/include/dt-bindings/clock/g12a-clkc.h b/include/dt-bindings/clock/g12a-clkc.h index 82c9e0c020b2..e10470ed7c4f 100644 --- a/include/dt-bindings/clock/g12a-clkc.h +++ b/include/dt-bindings/clock/g12a-clkc.h | |||
@@ -130,7 +130,7 @@ | |||
130 | #define CLKID_MALI_1_SEL 172 | 130 | #define CLKID_MALI_1_SEL 172 |
131 | #define CLKID_MALI_1 174 | 131 | #define CLKID_MALI_1 174 |
132 | #define CLKID_MALI 175 | 132 | #define CLKID_MALI 175 |
133 | #define CLKID_MPLL_5OM 177 | 133 | #define CLKID_MPLL_50M 177 |
134 | #define CLKID_CPU_CLK 187 | 134 | #define CLKID_CPU_CLK 187 |
135 | #define CLKID_PCIE_PLL 201 | 135 | #define CLKID_PCIE_PLL 201 |
136 | #define CLKID_VDEC_1 204 | 136 | #define CLKID_VDEC_1 204 |
diff --git a/include/linux/intel-ish-client-if.h b/include/linux/intel-ish-client-if.h index 16255c2ca2f4..0d6b4bc191c5 100644 --- a/include/linux/intel-ish-client-if.h +++ b/include/linux/intel-ish-client-if.h | |||
@@ -103,6 +103,7 @@ void ishtp_put_device(struct ishtp_cl_device *cl_dev); | |||
103 | void ishtp_get_device(struct ishtp_cl_device *cl_dev); | 103 | void ishtp_get_device(struct ishtp_cl_device *cl_dev); |
104 | void ishtp_set_drvdata(struct ishtp_cl_device *cl_device, void *data); | 104 | void ishtp_set_drvdata(struct ishtp_cl_device *cl_device, void *data); |
105 | void *ishtp_get_drvdata(struct ishtp_cl_device *cl_device); | 105 | void *ishtp_get_drvdata(struct ishtp_cl_device *cl_device); |
106 | struct ishtp_cl_device *ishtp_dev_to_cl_device(struct device *dev); | ||
106 | int ishtp_register_event_cb(struct ishtp_cl_device *device, | 107 | int ishtp_register_event_cb(struct ishtp_cl_device *device, |
107 | void (*read_cb)(struct ishtp_cl_device *)); | 108 | void (*read_cb)(struct ishtp_cl_device *)); |
108 | struct ishtp_fw_client *ishtp_fw_cl_get_client(struct ishtp_device *dev, | 109 | struct ishtp_fw_client *ishtp_fw_cl_get_client(struct ishtp_device *dev, |
diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h index b3d360b0ee3d..9f57cdfcc93d 100644 --- a/include/linux/mtd/spi-nor.h +++ b/include/linux/mtd/spi-nor.h | |||
@@ -373,6 +373,8 @@ struct flash_info; | |||
373 | * @flash_unlock: [FLASH-SPECIFIC] unlock a region of the SPI NOR | 373 | * @flash_unlock: [FLASH-SPECIFIC] unlock a region of the SPI NOR |
374 | * @flash_is_locked: [FLASH-SPECIFIC] check if a region of the SPI NOR is | 374 | * @flash_is_locked: [FLASH-SPECIFIC] check if a region of the SPI NOR is |
375 | * @quad_enable: [FLASH-SPECIFIC] enables SPI NOR quad mode | 375 | * @quad_enable: [FLASH-SPECIFIC] enables SPI NOR quad mode |
376 | * @clear_sr_bp: [FLASH-SPECIFIC] clears the Block Protection Bits from | ||
377 | * the SPI NOR Status Register. | ||
376 | * completely locked | 378 | * completely locked |
377 | * @priv: the private data | 379 | * @priv: the private data |
378 | */ | 380 | */ |
@@ -410,6 +412,7 @@ struct spi_nor { | |||
410 | int (*flash_unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len); | 412 | int (*flash_unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len); |
411 | int (*flash_is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len); | 413 | int (*flash_is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len); |
412 | int (*quad_enable)(struct spi_nor *nor); | 414 | int (*quad_enable)(struct spi_nor *nor); |
415 | int (*clear_sr_bp)(struct spi_nor *nor); | ||
413 | 416 | ||
414 | void *priv; | 417 | void *priv; |
415 | }; | 418 | }; |
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index c8bba0c28286..b69c16cbbf71 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
@@ -281,8 +281,8 @@ static inline bool ip6_sk_ignore_df(const struct sock *sk) | |||
281 | inet6_sk(sk)->pmtudisc == IPV6_PMTUDISC_OMIT; | 281 | inet6_sk(sk)->pmtudisc == IPV6_PMTUDISC_OMIT; |
282 | } | 282 | } |
283 | 283 | ||
284 | static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt, | 284 | static inline const struct in6_addr *rt6_nexthop(const struct rt6_info *rt, |
285 | struct in6_addr *daddr) | 285 | const struct in6_addr *daddr) |
286 | { | 286 | { |
287 | if (rt->rt6i_flags & RTF_GATEWAY) | 287 | if (rt->rt6i_flags & RTF_GATEWAY) |
288 | return &rt->rt6i_gateway; | 288 | return &rt->rt6i_gateway; |
diff --git a/include/net/route.h b/include/net/route.h index cfcd0f5980f9..630a0493f1f3 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
@@ -221,6 +221,7 @@ void ip_rt_get_source(u8 *src, struct sk_buff *skb, struct rtable *rt); | |||
221 | struct rtable *rt_dst_alloc(struct net_device *dev, | 221 | struct rtable *rt_dst_alloc(struct net_device *dev, |
222 | unsigned int flags, u16 type, | 222 | unsigned int flags, u16 type, |
223 | bool nopolicy, bool noxfrm, bool will_cache); | 223 | bool nopolicy, bool noxfrm, bool will_cache); |
224 | struct rtable *rt_dst_clone(struct net_device *dev, struct rtable *rt); | ||
224 | 225 | ||
225 | struct in_ifaddr; | 226 | struct in_ifaddr; |
226 | void fib_add_ifaddr(struct in_ifaddr *); | 227 | void fib_add_ifaddr(struct in_ifaddr *); |
diff --git a/include/net/tls.h b/include/net/tls.h index 63e473420b00..0279938386ab 100644 --- a/include/net/tls.h +++ b/include/net/tls.h | |||
@@ -407,21 +407,6 @@ static inline bool tls_is_partially_sent_record(struct tls_context *ctx) | |||
407 | return !!ctx->partially_sent_record; | 407 | return !!ctx->partially_sent_record; |
408 | } | 408 | } |
409 | 409 | ||
410 | static inline int tls_complete_pending_work(struct sock *sk, | ||
411 | struct tls_context *ctx, | ||
412 | int flags, long *timeo) | ||
413 | { | ||
414 | int rc = 0; | ||
415 | |||
416 | if (unlikely(sk->sk_write_pending)) | ||
417 | rc = wait_on_pending_writer(sk, timeo); | ||
418 | |||
419 | if (!rc && tls_is_partially_sent_record(ctx)) | ||
420 | rc = tls_push_partial_record(sk, ctx, flags); | ||
421 | |||
422 | return rc; | ||
423 | } | ||
424 | |||
425 | static inline bool tls_is_pending_open_record(struct tls_context *tls_ctx) | 410 | static inline bool tls_is_pending_open_record(struct tls_context *tls_ctx) |
426 | { | 411 | { |
427 | return tls_ctx->pending_open_record_frags; | 412 | return tls_ctx->pending_open_record_frags; |
diff --git a/kernel/fork.c b/kernel/fork.c index 75675b9bf6df..399aca51ff75 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -1712,31 +1712,6 @@ const struct file_operations pidfd_fops = { | |||
1712 | #endif | 1712 | #endif |
1713 | }; | 1713 | }; |
1714 | 1714 | ||
1715 | /** | ||
1716 | * pidfd_create() - Create a new pid file descriptor. | ||
1717 | * | ||
1718 | * @pid: struct pid that the pidfd will reference | ||
1719 | * | ||
1720 | * This creates a new pid file descriptor with the O_CLOEXEC flag set. | ||
1721 | * | ||
1722 | * Note, that this function can only be called after the fd table has | ||
1723 | * been unshared to avoid leaking the pidfd to the new process. | ||
1724 | * | ||
1725 | * Return: On success, a cloexec pidfd is returned. | ||
1726 | * On error, a negative errno number will be returned. | ||
1727 | */ | ||
1728 | static int pidfd_create(struct pid *pid) | ||
1729 | { | ||
1730 | int fd; | ||
1731 | |||
1732 | fd = anon_inode_getfd("[pidfd]", &pidfd_fops, get_pid(pid), | ||
1733 | O_RDWR | O_CLOEXEC); | ||
1734 | if (fd < 0) | ||
1735 | put_pid(pid); | ||
1736 | |||
1737 | return fd; | ||
1738 | } | ||
1739 | |||
1740 | static void __delayed_free_task(struct rcu_head *rhp) | 1715 | static void __delayed_free_task(struct rcu_head *rhp) |
1741 | { | 1716 | { |
1742 | struct task_struct *tsk = container_of(rhp, struct task_struct, rcu); | 1717 | struct task_struct *tsk = container_of(rhp, struct task_struct, rcu); |
@@ -1774,6 +1749,7 @@ static __latent_entropy struct task_struct *copy_process( | |||
1774 | int pidfd = -1, retval; | 1749 | int pidfd = -1, retval; |
1775 | struct task_struct *p; | 1750 | struct task_struct *p; |
1776 | struct multiprocess_signals delayed; | 1751 | struct multiprocess_signals delayed; |
1752 | struct file *pidfile = NULL; | ||
1777 | 1753 | ||
1778 | /* | 1754 | /* |
1779 | * Don't allow sharing the root directory with processes in a different | 1755 | * Don't allow sharing the root directory with processes in a different |
@@ -1822,8 +1798,6 @@ static __latent_entropy struct task_struct *copy_process( | |||
1822 | } | 1798 | } |
1823 | 1799 | ||
1824 | if (clone_flags & CLONE_PIDFD) { | 1800 | if (clone_flags & CLONE_PIDFD) { |
1825 | int reserved; | ||
1826 | |||
1827 | /* | 1801 | /* |
1828 | * - CLONE_PARENT_SETTID is useless for pidfds and also | 1802 | * - CLONE_PARENT_SETTID is useless for pidfds and also |
1829 | * parent_tidptr is used to return pidfds. | 1803 | * parent_tidptr is used to return pidfds. |
@@ -1834,16 +1808,6 @@ static __latent_entropy struct task_struct *copy_process( | |||
1834 | if (clone_flags & | 1808 | if (clone_flags & |
1835 | (CLONE_DETACHED | CLONE_PARENT_SETTID | CLONE_THREAD)) | 1809 | (CLONE_DETACHED | CLONE_PARENT_SETTID | CLONE_THREAD)) |
1836 | return ERR_PTR(-EINVAL); | 1810 | return ERR_PTR(-EINVAL); |
1837 | |||
1838 | /* | ||
1839 | * Verify that parent_tidptr is sane so we can potentially | ||
1840 | * reuse it later. | ||
1841 | */ | ||
1842 | if (get_user(reserved, parent_tidptr)) | ||
1843 | return ERR_PTR(-EFAULT); | ||
1844 | |||
1845 | if (reserved != 0) | ||
1846 | return ERR_PTR(-EINVAL); | ||
1847 | } | 1811 | } |
1848 | 1812 | ||
1849 | /* | 1813 | /* |
@@ -2058,11 +2022,20 @@ static __latent_entropy struct task_struct *copy_process( | |||
2058 | * if the fd table isn't shared). | 2022 | * if the fd table isn't shared). |
2059 | */ | 2023 | */ |
2060 | if (clone_flags & CLONE_PIDFD) { | 2024 | if (clone_flags & CLONE_PIDFD) { |
2061 | retval = pidfd_create(pid); | 2025 | retval = get_unused_fd_flags(O_RDWR | O_CLOEXEC); |
2062 | if (retval < 0) | 2026 | if (retval < 0) |
2063 | goto bad_fork_free_pid; | 2027 | goto bad_fork_free_pid; |
2064 | 2028 | ||
2065 | pidfd = retval; | 2029 | pidfd = retval; |
2030 | |||
2031 | pidfile = anon_inode_getfile("[pidfd]", &pidfd_fops, pid, | ||
2032 | O_RDWR | O_CLOEXEC); | ||
2033 | if (IS_ERR(pidfile)) { | ||
2034 | put_unused_fd(pidfd); | ||
2035 | goto bad_fork_free_pid; | ||
2036 | } | ||
2037 | get_pid(pid); /* held by pidfile now */ | ||
2038 | |||
2066 | retval = put_user(pidfd, parent_tidptr); | 2039 | retval = put_user(pidfd, parent_tidptr); |
2067 | if (retval) | 2040 | if (retval) |
2068 | goto bad_fork_put_pidfd; | 2041 | goto bad_fork_put_pidfd; |
@@ -2180,6 +2153,9 @@ static __latent_entropy struct task_struct *copy_process( | |||
2180 | goto bad_fork_cancel_cgroup; | 2153 | goto bad_fork_cancel_cgroup; |
2181 | } | 2154 | } |
2182 | 2155 | ||
2156 | /* past the last point of failure */ | ||
2157 | if (pidfile) | ||
2158 | fd_install(pidfd, pidfile); | ||
2183 | 2159 | ||
2184 | init_task_pid_links(p); | 2160 | init_task_pid_links(p); |
2185 | if (likely(p->pid)) { | 2161 | if (likely(p->pid)) { |
@@ -2246,8 +2222,10 @@ bad_fork_cancel_cgroup: | |||
2246 | bad_fork_cgroup_threadgroup_change_end: | 2222 | bad_fork_cgroup_threadgroup_change_end: |
2247 | cgroup_threadgroup_change_end(current); | 2223 | cgroup_threadgroup_change_end(current); |
2248 | bad_fork_put_pidfd: | 2224 | bad_fork_put_pidfd: |
2249 | if (clone_flags & CLONE_PIDFD) | 2225 | if (clone_flags & CLONE_PIDFD) { |
2250 | ksys_close(pidfd); | 2226 | fput(pidfile); |
2227 | put_unused_fd(pidfd); | ||
2228 | } | ||
2251 | bad_fork_free_pid: | 2229 | bad_fork_free_pid: |
2252 | if (pid != &init_struct_pid) | 2230 | if (pid != &init_struct_pid) |
2253 | free_pid(pid); | 2231 | free_pid(pid); |
diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c index 19d27bee285e..1555b0c6f7ec 100644 --- a/net/bluetooth/6lowpan.c +++ b/net/bluetooth/6lowpan.c | |||
@@ -160,10 +160,10 @@ static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_btle_dev *dev, | |||
160 | struct in6_addr *daddr, | 160 | struct in6_addr *daddr, |
161 | struct sk_buff *skb) | 161 | struct sk_buff *skb) |
162 | { | 162 | { |
163 | struct lowpan_peer *peer; | ||
164 | struct in6_addr *nexthop; | ||
165 | struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); | 163 | struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); |
166 | int count = atomic_read(&dev->peer_count); | 164 | int count = atomic_read(&dev->peer_count); |
165 | const struct in6_addr *nexthop; | ||
166 | struct lowpan_peer *peer; | ||
167 | 167 | ||
168 | BT_DBG("peers %d addr %pI6c rt %p", count, daddr, rt); | 168 | BT_DBG("peers %d addr %pI6c rt %p", count, daddr, rt); |
169 | 169 | ||
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 3cf0764d5793..15d1cb5aee18 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
@@ -1276,14 +1276,6 @@ int hci_conn_check_link_mode(struct hci_conn *conn) | |||
1276 | !test_bit(HCI_CONN_ENCRYPT, &conn->flags)) | 1276 | !test_bit(HCI_CONN_ENCRYPT, &conn->flags)) |
1277 | return 0; | 1277 | return 0; |
1278 | 1278 | ||
1279 | /* The minimum encryption key size needs to be enforced by the | ||
1280 | * host stack before establishing any L2CAP connections. The | ||
1281 | * specification in theory allows a minimum of 1, but to align | ||
1282 | * BR/EDR and LE transports, a minimum of 7 is chosen. | ||
1283 | */ | ||
1284 | if (conn->enc_key_size < HCI_MIN_ENC_KEY_SIZE) | ||
1285 | return 0; | ||
1286 | |||
1287 | return 1; | 1279 | return 1; |
1288 | } | 1280 | } |
1289 | 1281 | ||
@@ -1400,8 +1392,16 @@ auth: | |||
1400 | return 0; | 1392 | return 0; |
1401 | 1393 | ||
1402 | encrypt: | 1394 | encrypt: |
1403 | if (test_bit(HCI_CONN_ENCRYPT, &conn->flags)) | 1395 | if (test_bit(HCI_CONN_ENCRYPT, &conn->flags)) { |
1396 | /* Ensure that the encryption key size has been read, | ||
1397 | * otherwise stall the upper layer responses. | ||
1398 | */ | ||
1399 | if (!conn->enc_key_size) | ||
1400 | return 0; | ||
1401 | |||
1402 | /* Nothing else needed, all requirements are met */ | ||
1404 | return 1; | 1403 | return 1; |
1404 | } | ||
1405 | 1405 | ||
1406 | hci_conn_encrypt(conn); | 1406 | hci_conn_encrypt(conn); |
1407 | return 0; | 1407 | return 0; |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index b53acd6c9a3d..9f77432dbe38 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -1341,6 +1341,21 @@ static void l2cap_request_info(struct l2cap_conn *conn) | |||
1341 | sizeof(req), &req); | 1341 | sizeof(req), &req); |
1342 | } | 1342 | } |
1343 | 1343 | ||
1344 | static bool l2cap_check_enc_key_size(struct hci_conn *hcon) | ||
1345 | { | ||
1346 | /* The minimum encryption key size needs to be enforced by the | ||
1347 | * host stack before establishing any L2CAP connections. The | ||
1348 | * specification in theory allows a minimum of 1, but to align | ||
1349 | * BR/EDR and LE transports, a minimum of 7 is chosen. | ||
1350 | * | ||
1351 | * This check might also be called for unencrypted connections | ||
1352 | * that have no key size requirements. Ensure that the link is | ||
1353 | * actually encrypted before enforcing a key size. | ||
1354 | */ | ||
1355 | return (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags) || | ||
1356 | hcon->enc_key_size > HCI_MIN_ENC_KEY_SIZE); | ||
1357 | } | ||
1358 | |||
1344 | static void l2cap_do_start(struct l2cap_chan *chan) | 1359 | static void l2cap_do_start(struct l2cap_chan *chan) |
1345 | { | 1360 | { |
1346 | struct l2cap_conn *conn = chan->conn; | 1361 | struct l2cap_conn *conn = chan->conn; |
@@ -1358,9 +1373,14 @@ static void l2cap_do_start(struct l2cap_chan *chan) | |||
1358 | if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)) | 1373 | if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)) |
1359 | return; | 1374 | return; |
1360 | 1375 | ||
1361 | if (l2cap_chan_check_security(chan, true) && | 1376 | if (!l2cap_chan_check_security(chan, true) || |
1362 | __l2cap_no_conn_pending(chan)) | 1377 | !__l2cap_no_conn_pending(chan)) |
1378 | return; | ||
1379 | |||
1380 | if (l2cap_check_enc_key_size(conn->hcon)) | ||
1363 | l2cap_start_connection(chan); | 1381 | l2cap_start_connection(chan); |
1382 | else | ||
1383 | __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); | ||
1364 | } | 1384 | } |
1365 | 1385 | ||
1366 | static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask) | 1386 | static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask) |
@@ -1439,7 +1459,10 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
1439 | continue; | 1459 | continue; |
1440 | } | 1460 | } |
1441 | 1461 | ||
1442 | l2cap_start_connection(chan); | 1462 | if (l2cap_check_enc_key_size(conn->hcon)) |
1463 | l2cap_start_connection(chan); | ||
1464 | else | ||
1465 | l2cap_chan_close(chan, ECONNREFUSED); | ||
1443 | 1466 | ||
1444 | } else if (chan->state == BT_CONNECT2) { | 1467 | } else if (chan->state == BT_CONNECT2) { |
1445 | struct l2cap_conn_rsp rsp; | 1468 | struct l2cap_conn_rsp rsp; |
@@ -7490,7 +7513,7 @@ static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
7490 | } | 7513 | } |
7491 | 7514 | ||
7492 | if (chan->state == BT_CONNECT) { | 7515 | if (chan->state == BT_CONNECT) { |
7493 | if (!status) | 7516 | if (!status && l2cap_check_enc_key_size(hcon)) |
7494 | l2cap_start_connection(chan); | 7517 | l2cap_start_connection(chan); |
7495 | else | 7518 | else |
7496 | __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); | 7519 | __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); |
@@ -7499,7 +7522,7 @@ static void l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
7499 | struct l2cap_conn_rsp rsp; | 7522 | struct l2cap_conn_rsp rsp; |
7500 | __u16 res, stat; | 7523 | __u16 res, stat; |
7501 | 7524 | ||
7502 | if (!status) { | 7525 | if (!status && l2cap_check_enc_key_size(hcon)) { |
7503 | if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { | 7526 | if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { |
7504 | res = L2CAP_CR_PEND; | 7527 | res = L2CAP_CR_PEND; |
7505 | stat = L2CAP_CS_AUTHOR_PEND; | 7528 | stat = L2CAP_CS_AUTHOR_PEND; |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index cdd6c3418b9e..cc7ef0d05bbd 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -327,18 +327,35 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *sk | |||
327 | static int ip_mc_finish_output(struct net *net, struct sock *sk, | 327 | static int ip_mc_finish_output(struct net *net, struct sock *sk, |
328 | struct sk_buff *skb) | 328 | struct sk_buff *skb) |
329 | { | 329 | { |
330 | int ret; | 330 | struct rtable *new_rt; |
331 | bool do_cn = false; | ||
332 | int ret, err; | ||
331 | 333 | ||
332 | ret = BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb); | 334 | ret = BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb); |
333 | switch (ret) { | 335 | switch (ret) { |
334 | case NET_XMIT_SUCCESS: | ||
335 | return dev_loopback_xmit(net, sk, skb); | ||
336 | case NET_XMIT_CN: | 336 | case NET_XMIT_CN: |
337 | return dev_loopback_xmit(net, sk, skb) ? : ret; | 337 | do_cn = true; |
338 | /* fall through */ | ||
339 | case NET_XMIT_SUCCESS: | ||
340 | break; | ||
338 | default: | 341 | default: |
339 | kfree_skb(skb); | 342 | kfree_skb(skb); |
340 | return ret; | 343 | return ret; |
341 | } | 344 | } |
345 | |||
346 | /* Reset rt_iif so that inet_iif() will return skb->skb_iif. Setting | ||
347 | * this to non-zero causes ipi_ifindex in in_pktinfo to be overwritten, | ||
348 | * see ipv4_pktinfo_prepare(). | ||
349 | */ | ||
350 | new_rt = rt_dst_clone(net->loopback_dev, skb_rtable(skb)); | ||
351 | if (new_rt) { | ||
352 | new_rt->rt_iif = 0; | ||
353 | skb_dst_drop(skb); | ||
354 | skb_dst_set(skb, &new_rt->dst); | ||
355 | } | ||
356 | |||
357 | err = dev_loopback_xmit(net, sk, skb); | ||
358 | return (do_cn && err) ? ret : err; | ||
342 | } | 359 | } |
343 | 360 | ||
344 | int ip_mc_output(struct net *net, struct sock *sk, struct sk_buff *skb) | 361 | int ip_mc_output(struct net *net, struct sock *sk, struct sk_buff *skb) |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 0b8e06ca75d6..40a6abbc9cf6 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -197,7 +197,7 @@ static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash) | |||
197 | } | 197 | } |
198 | sk = __raw_v4_lookup(net, sk_next(sk), iph->protocol, | 198 | sk = __raw_v4_lookup(net, sk_next(sk), iph->protocol, |
199 | iph->saddr, iph->daddr, | 199 | iph->saddr, iph->daddr, |
200 | skb->dev->ifindex, sdif); | 200 | dif, sdif); |
201 | } | 201 | } |
202 | out: | 202 | out: |
203 | read_unlock(&raw_v4_hashinfo.lock); | 203 | read_unlock(&raw_v4_hashinfo.lock); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 59670fafcd26..a3e466b6a60c 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1648,6 +1648,39 @@ struct rtable *rt_dst_alloc(struct net_device *dev, | |||
1648 | } | 1648 | } |
1649 | EXPORT_SYMBOL(rt_dst_alloc); | 1649 | EXPORT_SYMBOL(rt_dst_alloc); |
1650 | 1650 | ||
1651 | struct rtable *rt_dst_clone(struct net_device *dev, struct rtable *rt) | ||
1652 | { | ||
1653 | struct rtable *new_rt; | ||
1654 | |||
1655 | new_rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK, | ||
1656 | rt->dst.flags); | ||
1657 | |||
1658 | if (new_rt) { | ||
1659 | new_rt->rt_genid = rt_genid_ipv4(dev_net(dev)); | ||
1660 | new_rt->rt_flags = rt->rt_flags; | ||
1661 | new_rt->rt_type = rt->rt_type; | ||
1662 | new_rt->rt_is_input = rt->rt_is_input; | ||
1663 | new_rt->rt_iif = rt->rt_iif; | ||
1664 | new_rt->rt_pmtu = rt->rt_pmtu; | ||
1665 | new_rt->rt_mtu_locked = rt->rt_mtu_locked; | ||
1666 | new_rt->rt_gw_family = rt->rt_gw_family; | ||
1667 | if (rt->rt_gw_family == AF_INET) | ||
1668 | new_rt->rt_gw4 = rt->rt_gw4; | ||
1669 | else if (rt->rt_gw_family == AF_INET6) | ||
1670 | new_rt->rt_gw6 = rt->rt_gw6; | ||
1671 | INIT_LIST_HEAD(&new_rt->rt_uncached); | ||
1672 | |||
1673 | new_rt->dst.flags |= DST_HOST; | ||
1674 | new_rt->dst.input = rt->dst.input; | ||
1675 | new_rt->dst.output = rt->dst.output; | ||
1676 | new_rt->dst.error = rt->dst.error; | ||
1677 | new_rt->dst.lastuse = jiffies; | ||
1678 | new_rt->dst.lwtstate = lwtstate_get(rt->dst.lwtstate); | ||
1679 | } | ||
1680 | return new_rt; | ||
1681 | } | ||
1682 | EXPORT_SYMBOL(rt_dst_clone); | ||
1683 | |||
1651 | /* called in rcu_read_lock() section */ | 1684 | /* called in rcu_read_lock() section */ |
1652 | int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr, | 1685 | int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr, |
1653 | u8 tos, struct net_device *dev, | 1686 | u8 tos, struct net_device *dev, |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 5e3a7963b3cb..8e49fd62eea9 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -59,8 +59,8 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff * | |||
59 | { | 59 | { |
60 | struct dst_entry *dst = skb_dst(skb); | 60 | struct dst_entry *dst = skb_dst(skb); |
61 | struct net_device *dev = dst->dev; | 61 | struct net_device *dev = dst->dev; |
62 | const struct in6_addr *nexthop; | ||
62 | struct neighbour *neigh; | 63 | struct neighbour *neigh; |
63 | struct in6_addr *nexthop; | ||
64 | int ret; | 64 | int ret; |
65 | 65 | ||
66 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) { | 66 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) { |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index e7c2824435c6..7556275b1cef 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -218,7 +218,8 @@ static struct neighbour *ip6_dst_neigh_lookup(const struct dst_entry *dst, | |||
218 | { | 218 | { |
219 | const struct rt6_info *rt = container_of(dst, struct rt6_info, dst); | 219 | const struct rt6_info *rt = container_of(dst, struct rt6_info, dst); |
220 | 220 | ||
221 | return ip6_neigh_lookup(&rt->rt6i_gateway, dst->dev, skb, daddr); | 221 | return ip6_neigh_lookup(rt6_nexthop(rt, &in6addr_any), |
222 | dst->dev, skb, daddr); | ||
222 | } | 223 | } |
223 | 224 | ||
224 | static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr) | 225 | static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr) |
@@ -6073,7 +6074,7 @@ static struct ctl_table ipv6_route_table_template[] = { | |||
6073 | .data = &init_net.ipv6.sysctl.skip_notify_on_dev_down, | 6074 | .data = &init_net.ipv6.sysctl.skip_notify_on_dev_down, |
6074 | .maxlen = sizeof(int), | 6075 | .maxlen = sizeof(int), |
6075 | .mode = 0644, | 6076 | .mode = 0644, |
6076 | .proc_handler = proc_dointvec, | 6077 | .proc_handler = proc_dointvec_minmax, |
6077 | .extra1 = &zero, | 6078 | .extra1 = &zero, |
6078 | .extra2 = &one, | 6079 | .extra2 = &one, |
6079 | }, | 6080 | }, |
diff --git a/net/netfilter/nf_flow_table_ip.c b/net/netfilter/nf_flow_table_ip.c index 241317473114..cdfc33517e85 100644 --- a/net/netfilter/nf_flow_table_ip.c +++ b/net/netfilter/nf_flow_table_ip.c | |||
@@ -439,9 +439,9 @@ nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb, | |||
439 | struct nf_flowtable *flow_table = priv; | 439 | struct nf_flowtable *flow_table = priv; |
440 | struct flow_offload_tuple tuple = {}; | 440 | struct flow_offload_tuple tuple = {}; |
441 | enum flow_offload_tuple_dir dir; | 441 | enum flow_offload_tuple_dir dir; |
442 | const struct in6_addr *nexthop; | ||
442 | struct flow_offload *flow; | 443 | struct flow_offload *flow; |
443 | struct net_device *outdev; | 444 | struct net_device *outdev; |
444 | struct in6_addr *nexthop; | ||
445 | struct ipv6hdr *ip6h; | 445 | struct ipv6hdr *ip6h; |
446 | struct rt6_info *rt; | 446 | struct rt6_info *rt; |
447 | 447 | ||
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 8c27e198268a..8d54f3047768 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -2412,6 +2412,9 @@ static void tpacket_destruct_skb(struct sk_buff *skb) | |||
2412 | 2412 | ||
2413 | ts = __packet_set_timestamp(po, ph, skb); | 2413 | ts = __packet_set_timestamp(po, ph, skb); |
2414 | __packet_set_status(po, ph, TP_STATUS_AVAILABLE | ts); | 2414 | __packet_set_status(po, ph, TP_STATUS_AVAILABLE | ts); |
2415 | |||
2416 | if (!packet_read_pending(&po->tx_ring)) | ||
2417 | complete(&po->skb_completion); | ||
2415 | } | 2418 | } |
2416 | 2419 | ||
2417 | sock_wfree(skb); | 2420 | sock_wfree(skb); |
@@ -2596,7 +2599,7 @@ static int tpacket_parse_header(struct packet_sock *po, void *frame, | |||
2596 | 2599 | ||
2597 | static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | 2600 | static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) |
2598 | { | 2601 | { |
2599 | struct sk_buff *skb; | 2602 | struct sk_buff *skb = NULL; |
2600 | struct net_device *dev; | 2603 | struct net_device *dev; |
2601 | struct virtio_net_hdr *vnet_hdr = NULL; | 2604 | struct virtio_net_hdr *vnet_hdr = NULL; |
2602 | struct sockcm_cookie sockc; | 2605 | struct sockcm_cookie sockc; |
@@ -2611,6 +2614,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | |||
2611 | int len_sum = 0; | 2614 | int len_sum = 0; |
2612 | int status = TP_STATUS_AVAILABLE; | 2615 | int status = TP_STATUS_AVAILABLE; |
2613 | int hlen, tlen, copylen = 0; | 2616 | int hlen, tlen, copylen = 0; |
2617 | long timeo = 0; | ||
2614 | 2618 | ||
2615 | mutex_lock(&po->pg_vec_lock); | 2619 | mutex_lock(&po->pg_vec_lock); |
2616 | 2620 | ||
@@ -2657,12 +2661,21 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) | |||
2657 | if ((size_max > dev->mtu + reserve + VLAN_HLEN) && !po->has_vnet_hdr) | 2661 | if ((size_max > dev->mtu + reserve + VLAN_HLEN) && !po->has_vnet_hdr) |
2658 | size_max = dev->mtu + reserve + VLAN_HLEN; | 2662 | size_max = dev->mtu + reserve + VLAN_HLEN; |
2659 | 2663 | ||
2664 | reinit_completion(&po->skb_completion); | ||
2665 | |||
2660 | do { | 2666 | do { |
2661 | ph = packet_current_frame(po, &po->tx_ring, | 2667 | ph = packet_current_frame(po, &po->tx_ring, |
2662 | TP_STATUS_SEND_REQUEST); | 2668 | TP_STATUS_SEND_REQUEST); |
2663 | if (unlikely(ph == NULL)) { | 2669 | if (unlikely(ph == NULL)) { |
2664 | if (need_wait && need_resched()) | 2670 | if (need_wait && skb) { |
2665 | schedule(); | 2671 | timeo = sock_sndtimeo(&po->sk, msg->msg_flags & MSG_DONTWAIT); |
2672 | timeo = wait_for_completion_interruptible_timeout(&po->skb_completion, timeo); | ||
2673 | if (timeo <= 0) { | ||
2674 | err = !timeo ? -ETIMEDOUT : -ERESTARTSYS; | ||
2675 | goto out_put; | ||
2676 | } | ||
2677 | } | ||
2678 | /* check for additional frames */ | ||
2666 | continue; | 2679 | continue; |
2667 | } | 2680 | } |
2668 | 2681 | ||
@@ -3218,6 +3231,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol, | |||
3218 | sock_init_data(sock, sk); | 3231 | sock_init_data(sock, sk); |
3219 | 3232 | ||
3220 | po = pkt_sk(sk); | 3233 | po = pkt_sk(sk); |
3234 | init_completion(&po->skb_completion); | ||
3221 | sk->sk_family = PF_PACKET; | 3235 | sk->sk_family = PF_PACKET; |
3222 | po->num = proto; | 3236 | po->num = proto; |
3223 | po->xmit = dev_queue_xmit; | 3237 | po->xmit = dev_queue_xmit; |
@@ -4327,7 +4341,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, | |||
4327 | req3->tp_sizeof_priv || | 4341 | req3->tp_sizeof_priv || |
4328 | req3->tp_feature_req_word) { | 4342 | req3->tp_feature_req_word) { |
4329 | err = -EINVAL; | 4343 | err = -EINVAL; |
4330 | goto out; | 4344 | goto out_free_pg_vec; |
4331 | } | 4345 | } |
4332 | } | 4346 | } |
4333 | break; | 4347 | break; |
@@ -4391,6 +4405,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, | |||
4391 | prb_shutdown_retire_blk_timer(po, rb_queue); | 4405 | prb_shutdown_retire_blk_timer(po, rb_queue); |
4392 | } | 4406 | } |
4393 | 4407 | ||
4408 | out_free_pg_vec: | ||
4394 | if (pg_vec) | 4409 | if (pg_vec) |
4395 | free_pg_vec(pg_vec, order, req->tp_block_nr); | 4410 | free_pg_vec(pg_vec, order, req->tp_block_nr); |
4396 | out: | 4411 | out: |
diff --git a/net/packet/internal.h b/net/packet/internal.h index b5bcff2b7a43..82fb2b10f790 100644 --- a/net/packet/internal.h +++ b/net/packet/internal.h | |||
@@ -128,6 +128,7 @@ struct packet_sock { | |||
128 | unsigned int tp_hdrlen; | 128 | unsigned int tp_hdrlen; |
129 | unsigned int tp_reserve; | 129 | unsigned int tp_reserve; |
130 | unsigned int tp_tstamp; | 130 | unsigned int tp_tstamp; |
131 | struct completion skb_completion; | ||
131 | struct net_device __rcu *cached_dev; | 132 | struct net_device __rcu *cached_dev; |
132 | int (*xmit)(struct sk_buff *skb); | 133 | int (*xmit)(struct sk_buff *skb); |
133 | struct packet_type prot_hook ____cacheline_aligned_in_smp; | 134 | struct packet_type prot_hook ____cacheline_aligned_in_smp; |
diff --git a/net/sched/sch_cbs.c b/net/sched/sch_cbs.c index e16a3d37d2bc..732e109c3055 100644 --- a/net/sched/sch_cbs.c +++ b/net/sched/sch_cbs.c | |||
@@ -549,12 +549,17 @@ static struct notifier_block cbs_device_notifier = { | |||
549 | 549 | ||
550 | static int __init cbs_module_init(void) | 550 | static int __init cbs_module_init(void) |
551 | { | 551 | { |
552 | int err = register_netdevice_notifier(&cbs_device_notifier); | 552 | int err; |
553 | 553 | ||
554 | err = register_netdevice_notifier(&cbs_device_notifier); | ||
554 | if (err) | 555 | if (err) |
555 | return err; | 556 | return err; |
556 | 557 | ||
557 | return register_qdisc(&cbs_qdisc_ops); | 558 | err = register_qdisc(&cbs_qdisc_ops); |
559 | if (err) | ||
560 | unregister_netdevice_notifier(&cbs_device_notifier); | ||
561 | |||
562 | return err; | ||
558 | } | 563 | } |
559 | 564 | ||
560 | static void __exit cbs_module_exit(void) | 565 | static void __exit cbs_module_exit(void) |
diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index e358437ba29b..69cebb2c998b 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c | |||
@@ -118,10 +118,6 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, | |||
118 | /* Initialize the bind addr area */ | 118 | /* Initialize the bind addr area */ |
119 | sctp_bind_addr_init(&ep->base.bind_addr, 0); | 119 | sctp_bind_addr_init(&ep->base.bind_addr, 0); |
120 | 120 | ||
121 | /* Remember who we are attached to. */ | ||
122 | ep->base.sk = sk; | ||
123 | sock_hold(ep->base.sk); | ||
124 | |||
125 | /* Create the lists of associations. */ | 121 | /* Create the lists of associations. */ |
126 | INIT_LIST_HEAD(&ep->asocs); | 122 | INIT_LIST_HEAD(&ep->asocs); |
127 | 123 | ||
@@ -154,6 +150,10 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, | |||
154 | ep->prsctp_enable = net->sctp.prsctp_enable; | 150 | ep->prsctp_enable = net->sctp.prsctp_enable; |
155 | ep->reconf_enable = net->sctp.reconf_enable; | 151 | ep->reconf_enable = net->sctp.reconf_enable; |
156 | 152 | ||
153 | /* Remember who we are attached to. */ | ||
154 | ep->base.sk = sk; | ||
155 | sock_hold(ep->base.sk); | ||
156 | |||
157 | return ep; | 157 | return ep; |
158 | 158 | ||
159 | nomem_shkey: | 159 | nomem_shkey: |
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index 828e319fdc0a..302e355f2ebc 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c | |||
@@ -2020,7 +2020,7 @@ static int __init smc_init(void) | |||
2020 | 2020 | ||
2021 | rc = smc_pnet_init(); | 2021 | rc = smc_pnet_init(); |
2022 | if (rc) | 2022 | if (rc) |
2023 | return rc; | 2023 | goto out_pernet_subsys; |
2024 | 2024 | ||
2025 | rc = smc_llc_init(); | 2025 | rc = smc_llc_init(); |
2026 | if (rc) { | 2026 | if (rc) { |
@@ -2071,6 +2071,9 @@ out_proto: | |||
2071 | proto_unregister(&smc_proto); | 2071 | proto_unregister(&smc_proto); |
2072 | out_pnet: | 2072 | out_pnet: |
2073 | smc_pnet_exit(); | 2073 | smc_pnet_exit(); |
2074 | out_pernet_subsys: | ||
2075 | unregister_pernet_subsys(&smc_net_ops); | ||
2076 | |||
2074 | return rc; | 2077 | return rc; |
2075 | } | 2078 | } |
2076 | 2079 | ||
diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c index 2d2850adc2a3..4ca50ddf8d16 100644 --- a/net/smc/smc_core.c +++ b/net/smc/smc_core.c | |||
@@ -652,7 +652,10 @@ create: | |||
652 | rc = smc_lgr_create(smc, ini); | 652 | rc = smc_lgr_create(smc, ini); |
653 | if (rc) | 653 | if (rc) |
654 | goto out; | 654 | goto out; |
655 | lgr = conn->lgr; | ||
656 | write_lock_bh(&lgr->conns_lock); | ||
655 | smc_lgr_register_conn(conn); /* add smc conn to lgr */ | 657 | smc_lgr_register_conn(conn); /* add smc conn to lgr */ |
658 | write_unlock_bh(&lgr->conns_lock); | ||
656 | } | 659 | } |
657 | conn->local_tx_ctrl.common.type = SMC_CDC_MSG_TYPE; | 660 | conn->local_tx_ctrl.common.type = SMC_CDC_MSG_TYPE; |
658 | conn->local_tx_ctrl.len = SMC_WR_TX_SIZE; | 661 | conn->local_tx_ctrl.len = SMC_WR_TX_SIZE; |
diff --git a/net/tipc/core.c b/net/tipc/core.c index ed536c05252a..c8370722f0bb 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c | |||
@@ -134,7 +134,7 @@ static int __init tipc_init(void) | |||
134 | if (err) | 134 | if (err) |
135 | goto out_sysctl; | 135 | goto out_sysctl; |
136 | 136 | ||
137 | err = register_pernet_subsys(&tipc_net_ops); | 137 | err = register_pernet_device(&tipc_net_ops); |
138 | if (err) | 138 | if (err) |
139 | goto out_pernet; | 139 | goto out_pernet; |
140 | 140 | ||
@@ -142,7 +142,7 @@ static int __init tipc_init(void) | |||
142 | if (err) | 142 | if (err) |
143 | goto out_socket; | 143 | goto out_socket; |
144 | 144 | ||
145 | err = register_pernet_subsys(&tipc_topsrv_net_ops); | 145 | err = register_pernet_device(&tipc_topsrv_net_ops); |
146 | if (err) | 146 | if (err) |
147 | goto out_pernet_topsrv; | 147 | goto out_pernet_topsrv; |
148 | 148 | ||
@@ -153,11 +153,11 @@ static int __init tipc_init(void) | |||
153 | pr_info("Started in single node mode\n"); | 153 | pr_info("Started in single node mode\n"); |
154 | return 0; | 154 | return 0; |
155 | out_bearer: | 155 | out_bearer: |
156 | unregister_pernet_subsys(&tipc_topsrv_net_ops); | 156 | unregister_pernet_device(&tipc_topsrv_net_ops); |
157 | out_pernet_topsrv: | 157 | out_pernet_topsrv: |
158 | tipc_socket_stop(); | 158 | tipc_socket_stop(); |
159 | out_socket: | 159 | out_socket: |
160 | unregister_pernet_subsys(&tipc_net_ops); | 160 | unregister_pernet_device(&tipc_net_ops); |
161 | out_pernet: | 161 | out_pernet: |
162 | tipc_unregister_sysctl(); | 162 | tipc_unregister_sysctl(); |
163 | out_sysctl: | 163 | out_sysctl: |
@@ -172,9 +172,9 @@ out_netlink: | |||
172 | static void __exit tipc_exit(void) | 172 | static void __exit tipc_exit(void) |
173 | { | 173 | { |
174 | tipc_bearer_cleanup(); | 174 | tipc_bearer_cleanup(); |
175 | unregister_pernet_subsys(&tipc_topsrv_net_ops); | 175 | unregister_pernet_device(&tipc_topsrv_net_ops); |
176 | tipc_socket_stop(); | 176 | tipc_socket_stop(); |
177 | unregister_pernet_subsys(&tipc_net_ops); | 177 | unregister_pernet_device(&tipc_net_ops); |
178 | tipc_netlink_stop(); | 178 | tipc_netlink_stop(); |
179 | tipc_netlink_compat_stop(); | 179 | tipc_netlink_compat_stop(); |
180 | tipc_unregister_sysctl(); | 180 | tipc_unregister_sysctl(); |
diff --git a/net/tipc/netlink_compat.c b/net/tipc/netlink_compat.c index 20783ccab794..d86030ef1232 100644 --- a/net/tipc/netlink_compat.c +++ b/net/tipc/netlink_compat.c | |||
@@ -445,7 +445,11 @@ static int tipc_nl_compat_bearer_disable(struct tipc_nl_compat_cmd_doit *cmd, | |||
445 | if (!bearer) | 445 | if (!bearer) |
446 | return -EMSGSIZE; | 446 | return -EMSGSIZE; |
447 | 447 | ||
448 | len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_BEARER_NAME); | 448 | len = TLV_GET_DATA_LEN(msg->req); |
449 | if (len <= 0) | ||
450 | return -EINVAL; | ||
451 | |||
452 | len = min_t(int, len, TIPC_MAX_BEARER_NAME); | ||
449 | if (!string_is_valid(name, len)) | 453 | if (!string_is_valid(name, len)) |
450 | return -EINVAL; | 454 | return -EINVAL; |
451 | 455 | ||
@@ -539,7 +543,11 @@ static int tipc_nl_compat_link_stat_dump(struct tipc_nl_compat_msg *msg, | |||
539 | 543 | ||
540 | name = (char *)TLV_DATA(msg->req); | 544 | name = (char *)TLV_DATA(msg->req); |
541 | 545 | ||
542 | len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_LINK_NAME); | 546 | len = TLV_GET_DATA_LEN(msg->req); |
547 | if (len <= 0) | ||
548 | return -EINVAL; | ||
549 | |||
550 | len = min_t(int, len, TIPC_MAX_BEARER_NAME); | ||
543 | if (!string_is_valid(name, len)) | 551 | if (!string_is_valid(name, len)) |
544 | return -EINVAL; | 552 | return -EINVAL; |
545 | 553 | ||
@@ -807,7 +815,11 @@ static int tipc_nl_compat_link_reset_stats(struct tipc_nl_compat_cmd_doit *cmd, | |||
807 | if (!link) | 815 | if (!link) |
808 | return -EMSGSIZE; | 816 | return -EMSGSIZE; |
809 | 817 | ||
810 | len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_LINK_NAME); | 818 | len = TLV_GET_DATA_LEN(msg->req); |
819 | if (len <= 0) | ||
820 | return -EINVAL; | ||
821 | |||
822 | len = min_t(int, len, TIPC_MAX_BEARER_NAME); | ||
811 | if (!string_is_valid(name, len)) | 823 | if (!string_is_valid(name, len)) |
812 | return -EINVAL; | 824 | return -EINVAL; |
813 | 825 | ||
diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c index fc81ae18cc44..e2b69e805d46 100644 --- a/net/tls/tls_main.c +++ b/net/tls/tls_main.c | |||
@@ -279,7 +279,8 @@ static void tls_sk_proto_close(struct sock *sk, long timeout) | |||
279 | goto skip_tx_cleanup; | 279 | goto skip_tx_cleanup; |
280 | } | 280 | } |
281 | 281 | ||
282 | if (!tls_complete_pending_work(sk, ctx, 0, &timeo)) | 282 | if (unlikely(sk->sk_write_pending) && |
283 | !wait_on_pending_writer(sk, &timeo)) | ||
283 | tls_handle_open_record(sk, 0); | 284 | tls_handle_open_record(sk, 0); |
284 | 285 | ||
285 | /* We need these for tls_sw_fallback handling of other packets */ | 286 | /* We need these for tls_sw_fallback handling of other packets */ |
diff --git a/samples/pidfd/pidfd-metadata.c b/samples/pidfd/pidfd-metadata.c index 14b454448429..c459155daf9a 100644 --- a/samples/pidfd/pidfd-metadata.c +++ b/samples/pidfd/pidfd-metadata.c | |||
@@ -83,7 +83,7 @@ static int pidfd_metadata_fd(pid_t pid, int pidfd) | |||
83 | 83 | ||
84 | int main(int argc, char *argv[]) | 84 | int main(int argc, char *argv[]) |
85 | { | 85 | { |
86 | int pidfd = 0, ret = EXIT_FAILURE; | 86 | int pidfd = -1, ret = EXIT_FAILURE; |
87 | char buf[4096] = { 0 }; | 87 | char buf[4096] = { 0 }; |
88 | pid_t pid; | 88 | pid_t pid; |
89 | int procfd, statusfd; | 89 | int procfd, statusfd; |
@@ -91,7 +91,11 @@ int main(int argc, char *argv[]) | |||
91 | 91 | ||
92 | pid = pidfd_clone(CLONE_PIDFD, &pidfd); | 92 | pid = pidfd_clone(CLONE_PIDFD, &pidfd); |
93 | if (pid < 0) | 93 | if (pid < 0) |
94 | exit(ret); | 94 | err(ret, "CLONE_PIDFD"); |
95 | if (pidfd == -1) { | ||
96 | warnx("CLONE_PIDFD is not supported by the kernel"); | ||
97 | goto out; | ||
98 | } | ||
95 | 99 | ||
96 | procfd = pidfd_metadata_fd(pid, pidfd); | 100 | procfd = pidfd_metadata_fd(pid, pidfd); |
97 | close(pidfd); | 101 | close(pidfd); |
diff --git a/tools/testing/selftests/powerpc/mm/.gitignore b/tools/testing/selftests/powerpc/mm/.gitignore index ba919308fe30..d503b8764a8e 100644 --- a/tools/testing/selftests/powerpc/mm/.gitignore +++ b/tools/testing/selftests/powerpc/mm/.gitignore | |||
@@ -3,4 +3,5 @@ subpage_prot | |||
3 | tempfile | 3 | tempfile |
4 | prot_sao | 4 | prot_sao |
5 | segv_errors | 5 | segv_errors |
6 | wild_bctr \ No newline at end of file | 6 | wild_bctr |
7 | large_vm_fork_separation \ No newline at end of file | ||
diff --git a/tools/testing/selftests/powerpc/mm/Makefile b/tools/testing/selftests/powerpc/mm/Makefile index 43d68420e363..f1fbc15800c4 100644 --- a/tools/testing/selftests/powerpc/mm/Makefile +++ b/tools/testing/selftests/powerpc/mm/Makefile | |||
@@ -2,7 +2,8 @@ | |||
2 | noarg: | 2 | noarg: |
3 | $(MAKE) -C ../ | 3 | $(MAKE) -C ../ |
4 | 4 | ||
5 | TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao segv_errors wild_bctr | 5 | TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao segv_errors wild_bctr \ |
6 | large_vm_fork_separation | ||
6 | TEST_GEN_FILES := tempfile | 7 | TEST_GEN_FILES := tempfile |
7 | 8 | ||
8 | top_srcdir = ../../../../.. | 9 | top_srcdir = ../../../../.. |
@@ -13,6 +14,7 @@ $(TEST_GEN_PROGS): ../harness.c | |||
13 | $(OUTPUT)/prot_sao: ../utils.c | 14 | $(OUTPUT)/prot_sao: ../utils.c |
14 | 15 | ||
15 | $(OUTPUT)/wild_bctr: CFLAGS += -m64 | 16 | $(OUTPUT)/wild_bctr: CFLAGS += -m64 |
17 | $(OUTPUT)/large_vm_fork_separation: CFLAGS += -m64 | ||
16 | 18 | ||
17 | $(OUTPUT)/tempfile: | 19 | $(OUTPUT)/tempfile: |
18 | dd if=/dev/zero of=$@ bs=64k count=1 | 20 | dd if=/dev/zero of=$@ bs=64k count=1 |
diff --git a/tools/testing/selftests/powerpc/mm/large_vm_fork_separation.c b/tools/testing/selftests/powerpc/mm/large_vm_fork_separation.c new file mode 100644 index 000000000000..2363a7f3ab0d --- /dev/null +++ b/tools/testing/selftests/powerpc/mm/large_vm_fork_separation.c | |||
@@ -0,0 +1,87 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0+ | ||
2 | // | ||
3 | // Copyright 2019, Michael Ellerman, IBM Corp. | ||
4 | // | ||
5 | // Test that allocating memory beyond the memory limit and then forking is | ||
6 | // handled correctly, ie. the child is able to access the mappings beyond the | ||
7 | // memory limit and the child's writes are not visible to the parent. | ||
8 | |||
9 | #include <stdio.h> | ||
10 | #include <stdlib.h> | ||
11 | #include <sys/mman.h> | ||
12 | #include <sys/types.h> | ||
13 | #include <sys/wait.h> | ||
14 | #include <unistd.h> | ||
15 | |||
16 | #include "utils.h" | ||
17 | |||
18 | |||
19 | #ifndef MAP_FIXED_NOREPLACE | ||
20 | #define MAP_FIXED_NOREPLACE MAP_FIXED // "Should be safe" above 512TB | ||
21 | #endif | ||
22 | |||
23 | |||
24 | static int test(void) | ||
25 | { | ||
26 | int p2c[2], c2p[2], rc, status, c, *p; | ||
27 | unsigned long page_size; | ||
28 | pid_t pid; | ||
29 | |||
30 | page_size = sysconf(_SC_PAGESIZE); | ||
31 | SKIP_IF(page_size != 65536); | ||
32 | |||
33 | // Create a mapping at 512TB to allocate an extended_id | ||
34 | p = mmap((void *)(512ul << 40), page_size, PROT_READ | PROT_WRITE, | ||
35 | MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE, -1, 0); | ||
36 | if (p == MAP_FAILED) { | ||
37 | perror("mmap"); | ||
38 | printf("Error: couldn't mmap(), confirm kernel has 4TB support?\n"); | ||
39 | return 1; | ||
40 | } | ||
41 | |||
42 | printf("parent writing %p = 1\n", p); | ||
43 | *p = 1; | ||
44 | |||
45 | FAIL_IF(pipe(p2c) == -1 || pipe(c2p) == -1); | ||
46 | |||
47 | pid = fork(); | ||
48 | if (pid == 0) { | ||
49 | FAIL_IF(read(p2c[0], &c, 1) != 1); | ||
50 | |||
51 | pid = getpid(); | ||
52 | printf("child writing %p = %d\n", p, pid); | ||
53 | *p = pid; | ||
54 | |||
55 | FAIL_IF(write(c2p[1], &c, 1) != 1); | ||
56 | FAIL_IF(read(p2c[0], &c, 1) != 1); | ||
57 | exit(0); | ||
58 | } | ||
59 | |||
60 | c = 0; | ||
61 | FAIL_IF(write(p2c[1], &c, 1) != 1); | ||
62 | FAIL_IF(read(c2p[0], &c, 1) != 1); | ||
63 | |||
64 | // Prevent compiler optimisation | ||
65 | barrier(); | ||
66 | |||
67 | rc = 0; | ||
68 | printf("parent reading %p = %d\n", p, *p); | ||
69 | if (*p != 1) { | ||
70 | printf("Error: BUG! parent saw child's write! *p = %d\n", *p); | ||
71 | rc = 1; | ||
72 | } | ||
73 | |||
74 | FAIL_IF(write(p2c[1], &c, 1) != 1); | ||
75 | FAIL_IF(waitpid(pid, &status, 0) == -1); | ||
76 | FAIL_IF(!WIFEXITED(status) || WEXITSTATUS(status)); | ||
77 | |||
78 | if (rc == 0) | ||
79 | printf("success: test completed OK\n"); | ||
80 | |||
81 | return rc; | ||
82 | } | ||
83 | |||
84 | int main(void) | ||
85 | { | ||
86 | return test_harness(test, "large_vm_fork_separation"); | ||
87 | } | ||