mirror of
https://github.com/Fishwaldo/build.git
synced 2025-04-14 18:11:38 +00:00
4617 lines
151 KiB
Diff
4617 lines
151 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 7d7cf0082443..ef4697fcb8ea 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 5
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 43
|
|
+SUBLEVEL = 44
|
|
EXTRAVERSION =
|
|
NAME = Kleptomaniac Octopus
|
|
|
|
diff --git a/arch/arm/boot/compressed/vmlinux.lds.S b/arch/arm/boot/compressed/vmlinux.lds.S
|
|
index fc7ed03d8b93..51b078604978 100644
|
|
--- a/arch/arm/boot/compressed/vmlinux.lds.S
|
|
+++ b/arch/arm/boot/compressed/vmlinux.lds.S
|
|
@@ -43,7 +43,7 @@ SECTIONS
|
|
}
|
|
.table : ALIGN(4) {
|
|
_table_start = .;
|
|
- LONG(ZIMAGE_MAGIC(2))
|
|
+ LONG(ZIMAGE_MAGIC(4))
|
|
LONG(ZIMAGE_MAGIC(0x5a534c4b))
|
|
LONG(ZIMAGE_MAGIC(__piggy_size_addr - _start))
|
|
LONG(ZIMAGE_MAGIC(_kernel_bss_size))
|
|
diff --git a/arch/arm/boot/dts/bcm-hr2.dtsi b/arch/arm/boot/dts/bcm-hr2.dtsi
|
|
index e4d49731287f..e35398cc60a0 100644
|
|
--- a/arch/arm/boot/dts/bcm-hr2.dtsi
|
|
+++ b/arch/arm/boot/dts/bcm-hr2.dtsi
|
|
@@ -75,7 +75,7 @@
|
|
timer@20200 {
|
|
compatible = "arm,cortex-a9-global-timer";
|
|
reg = <0x20200 0x100>;
|
|
- interrupts = <GIC_PPI 11 IRQ_TYPE_LEVEL_HIGH>;
|
|
+ interrupts = <GIC_PPI 11 IRQ_TYPE_EDGE_RISING>;
|
|
clocks = <&periph_clk>;
|
|
};
|
|
|
|
@@ -83,7 +83,7 @@
|
|
compatible = "arm,cortex-a9-twd-timer";
|
|
reg = <0x20600 0x20>;
|
|
interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(1) |
|
|
- IRQ_TYPE_LEVEL_HIGH)>;
|
|
+ IRQ_TYPE_EDGE_RISING)>;
|
|
clocks = <&periph_clk>;
|
|
};
|
|
|
|
@@ -91,7 +91,7 @@
|
|
compatible = "arm,cortex-a9-twd-wdt";
|
|
reg = <0x20620 0x20>;
|
|
interrupts = <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(1) |
|
|
- IRQ_TYPE_LEVEL_HIGH)>;
|
|
+ IRQ_TYPE_EDGE_RISING)>;
|
|
clocks = <&periph_clk>;
|
|
};
|
|
|
|
diff --git a/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts b/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
|
|
index 4c3f606e5b8d..f65448c01e31 100644
|
|
--- a/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
|
|
+++ b/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts
|
|
@@ -24,7 +24,7 @@
|
|
|
|
leds {
|
|
act {
|
|
- gpios = <&gpio 47 GPIO_ACTIVE_HIGH>;
|
|
+ gpios = <&gpio 47 GPIO_ACTIVE_LOW>;
|
|
};
|
|
};
|
|
|
|
diff --git a/arch/arm/boot/dts/imx6q-b450v3.dts b/arch/arm/boot/dts/imx6q-b450v3.dts
|
|
index 95b8f2d71821..fb0980190aa0 100644
|
|
--- a/arch/arm/boot/dts/imx6q-b450v3.dts
|
|
+++ b/arch/arm/boot/dts/imx6q-b450v3.dts
|
|
@@ -65,13 +65,6 @@
|
|
};
|
|
};
|
|
|
|
-&clks {
|
|
- assigned-clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>,
|
|
- <&clks IMX6QDL_CLK_LDB_DI1_SEL>;
|
|
- assigned-clock-parents = <&clks IMX6QDL_CLK_PLL3_USB_OTG>,
|
|
- <&clks IMX6QDL_CLK_PLL3_USB_OTG>;
|
|
-};
|
|
-
|
|
&ldb {
|
|
status = "okay";
|
|
|
|
diff --git a/arch/arm/boot/dts/imx6q-b650v3.dts b/arch/arm/boot/dts/imx6q-b650v3.dts
|
|
index 611cb7ae7e55..8f762d9c5ae9 100644
|
|
--- a/arch/arm/boot/dts/imx6q-b650v3.dts
|
|
+++ b/arch/arm/boot/dts/imx6q-b650v3.dts
|
|
@@ -65,13 +65,6 @@
|
|
};
|
|
};
|
|
|
|
-&clks {
|
|
- assigned-clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>,
|
|
- <&clks IMX6QDL_CLK_LDB_DI1_SEL>;
|
|
- assigned-clock-parents = <&clks IMX6QDL_CLK_PLL3_USB_OTG>,
|
|
- <&clks IMX6QDL_CLK_PLL3_USB_OTG>;
|
|
-};
|
|
-
|
|
&ldb {
|
|
status = "okay";
|
|
|
|
diff --git a/arch/arm/boot/dts/imx6q-b850v3.dts b/arch/arm/boot/dts/imx6q-b850v3.dts
|
|
index e4cb118f88c6..1ea64ecf4291 100644
|
|
--- a/arch/arm/boot/dts/imx6q-b850v3.dts
|
|
+++ b/arch/arm/boot/dts/imx6q-b850v3.dts
|
|
@@ -53,17 +53,6 @@
|
|
};
|
|
};
|
|
|
|
-&clks {
|
|
- assigned-clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>,
|
|
- <&clks IMX6QDL_CLK_LDB_DI1_SEL>,
|
|
- <&clks IMX6QDL_CLK_IPU1_DI0_PRE_SEL>,
|
|
- <&clks IMX6QDL_CLK_IPU2_DI0_PRE_SEL>;
|
|
- assigned-clock-parents = <&clks IMX6QDL_CLK_PLL5_VIDEO_DIV>,
|
|
- <&clks IMX6QDL_CLK_PLL5_VIDEO_DIV>,
|
|
- <&clks IMX6QDL_CLK_PLL2_PFD2_396M>,
|
|
- <&clks IMX6QDL_CLK_PLL2_PFD2_396M>;
|
|
-};
|
|
-
|
|
&ldb {
|
|
fsl,dual-channel;
|
|
status = "okay";
|
|
diff --git a/arch/arm/boot/dts/imx6q-bx50v3.dtsi b/arch/arm/boot/dts/imx6q-bx50v3.dtsi
|
|
index fa27dcdf06f1..1938b04199c4 100644
|
|
--- a/arch/arm/boot/dts/imx6q-bx50v3.dtsi
|
|
+++ b/arch/arm/boot/dts/imx6q-bx50v3.dtsi
|
|
@@ -377,3 +377,18 @@
|
|
#interrupt-cells = <1>;
|
|
};
|
|
};
|
|
+
|
|
+&clks {
|
|
+ assigned-clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>,
|
|
+ <&clks IMX6QDL_CLK_LDB_DI1_SEL>,
|
|
+ <&clks IMX6QDL_CLK_IPU1_DI0_PRE_SEL>,
|
|
+ <&clks IMX6QDL_CLK_IPU1_DI1_PRE_SEL>,
|
|
+ <&clks IMX6QDL_CLK_IPU2_DI0_PRE_SEL>,
|
|
+ <&clks IMX6QDL_CLK_IPU2_DI1_PRE_SEL>;
|
|
+ assigned-clock-parents = <&clks IMX6QDL_CLK_PLL5_VIDEO_DIV>,
|
|
+ <&clks IMX6QDL_CLK_PLL5_VIDEO_DIV>,
|
|
+ <&clks IMX6QDL_CLK_PLL2_PFD0_352M>,
|
|
+ <&clks IMX6QDL_CLK_PLL2_PFD0_352M>,
|
|
+ <&clks IMX6QDL_CLK_PLL2_PFD0_352M>,
|
|
+ <&clks IMX6QDL_CLK_PLL2_PFD0_352M>;
|
|
+};
|
|
diff --git a/arch/arm/boot/dts/rk3036.dtsi b/arch/arm/boot/dts/rk3036.dtsi
|
|
index c776321b2cc4..d282a7b638d8 100644
|
|
--- a/arch/arm/boot/dts/rk3036.dtsi
|
|
+++ b/arch/arm/boot/dts/rk3036.dtsi
|
|
@@ -128,7 +128,7 @@
|
|
assigned-clocks = <&cru SCLK_GPU>;
|
|
assigned-clock-rates = <100000000>;
|
|
clocks = <&cru SCLK_GPU>, <&cru SCLK_GPU>;
|
|
- clock-names = "core", "bus";
|
|
+ clock-names = "bus", "core";
|
|
resets = <&cru SRST_GPU>;
|
|
status = "disabled";
|
|
};
|
|
diff --git a/arch/arm/boot/dts/rk3228-evb.dts b/arch/arm/boot/dts/rk3228-evb.dts
|
|
index 5670b33fd1bd..aed879db6c15 100644
|
|
--- a/arch/arm/boot/dts/rk3228-evb.dts
|
|
+++ b/arch/arm/boot/dts/rk3228-evb.dts
|
|
@@ -46,7 +46,7 @@
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
- phy: phy@0 {
|
|
+ phy: ethernet-phy@0 {
|
|
compatible = "ethernet-phy-id1234.d400", "ethernet-phy-ieee802.3-c22";
|
|
reg = <0>;
|
|
clocks = <&cru SCLK_MAC_PHY>;
|
|
diff --git a/arch/arm/boot/dts/rk3229-xms6.dts b/arch/arm/boot/dts/rk3229-xms6.dts
|
|
index 679fc2b00e5a..933ef69da32a 100644
|
|
--- a/arch/arm/boot/dts/rk3229-xms6.dts
|
|
+++ b/arch/arm/boot/dts/rk3229-xms6.dts
|
|
@@ -150,7 +150,7 @@
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
- phy: phy@0 {
|
|
+ phy: ethernet-phy@0 {
|
|
compatible = "ethernet-phy-id1234.d400",
|
|
"ethernet-phy-ieee802.3-c22";
|
|
reg = <0>;
|
|
diff --git a/arch/arm/boot/dts/rk322x.dtsi b/arch/arm/boot/dts/rk322x.dtsi
|
|
index 340ed6ccb08f..6bb78b19c555 100644
|
|
--- a/arch/arm/boot/dts/rk322x.dtsi
|
|
+++ b/arch/arm/boot/dts/rk322x.dtsi
|
|
@@ -561,7 +561,7 @@
|
|
"pp1",
|
|
"ppmmu1";
|
|
clocks = <&cru ACLK_GPU>, <&cru ACLK_GPU>;
|
|
- clock-names = "core", "bus";
|
|
+ clock-names = "bus", "core";
|
|
resets = <&cru SRST_GPU_A>;
|
|
status = "disabled";
|
|
};
|
|
@@ -1033,7 +1033,7 @@
|
|
};
|
|
};
|
|
|
|
- spi-0 {
|
|
+ spi0 {
|
|
spi0_clk: spi0-clk {
|
|
rockchip,pins = <0 RK_PB1 2 &pcfg_pull_up>;
|
|
};
|
|
@@ -1051,7 +1051,7 @@
|
|
};
|
|
};
|
|
|
|
- spi-1 {
|
|
+ spi1 {
|
|
spi1_clk: spi1-clk {
|
|
rockchip,pins = <0 RK_PC7 2 &pcfg_pull_up>;
|
|
};
|
|
diff --git a/arch/arm/boot/dts/rk3xxx.dtsi b/arch/arm/boot/dts/rk3xxx.dtsi
|
|
index 97307a405e60..bce0b05ef7bf 100644
|
|
--- a/arch/arm/boot/dts/rk3xxx.dtsi
|
|
+++ b/arch/arm/boot/dts/rk3xxx.dtsi
|
|
@@ -84,7 +84,7 @@
|
|
compatible = "arm,mali-400";
|
|
reg = <0x10090000 0x10000>;
|
|
clocks = <&cru ACLK_GPU>, <&cru ACLK_GPU>;
|
|
- clock-names = "core", "bus";
|
|
+ clock-names = "bus", "core";
|
|
assigned-clocks = <&cru ACLK_GPU>;
|
|
assigned-clock-rates = <100000000>;
|
|
resets = <&cru SRST_GPU>;
|
|
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
|
|
index 99929122dad7..3546d294d55f 100644
|
|
--- a/arch/arm/include/asm/assembler.h
|
|
+++ b/arch/arm/include/asm/assembler.h
|
|
@@ -18,11 +18,11 @@
|
|
#endif
|
|
|
|
#include <asm/ptrace.h>
|
|
-#include <asm/domain.h>
|
|
#include <asm/opcodes-virt.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/page.h>
|
|
#include <asm/thread_info.h>
|
|
+#include <asm/uaccess-asm.h>
|
|
|
|
#define IOMEM(x) (x)
|
|
|
|
@@ -446,79 +446,6 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
|
|
.size \name , . - \name
|
|
.endm
|
|
|
|
- .macro csdb
|
|
-#ifdef CONFIG_THUMB2_KERNEL
|
|
- .inst.w 0xf3af8014
|
|
-#else
|
|
- .inst 0xe320f014
|
|
-#endif
|
|
- .endm
|
|
-
|
|
- .macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req
|
|
-#ifndef CONFIG_CPU_USE_DOMAINS
|
|
- adds \tmp, \addr, #\size - 1
|
|
- sbcscc \tmp, \tmp, \limit
|
|
- bcs \bad
|
|
-#ifdef CONFIG_CPU_SPECTRE
|
|
- movcs \addr, #0
|
|
- csdb
|
|
-#endif
|
|
-#endif
|
|
- .endm
|
|
-
|
|
- .macro uaccess_mask_range_ptr, addr:req, size:req, limit:req, tmp:req
|
|
-#ifdef CONFIG_CPU_SPECTRE
|
|
- sub \tmp, \limit, #1
|
|
- subs \tmp, \tmp, \addr @ tmp = limit - 1 - addr
|
|
- addhs \tmp, \tmp, #1 @ if (tmp >= 0) {
|
|
- subshs \tmp, \tmp, \size @ tmp = limit - (addr + size) }
|
|
- movlo \addr, #0 @ if (tmp < 0) addr = NULL
|
|
- csdb
|
|
-#endif
|
|
- .endm
|
|
-
|
|
- .macro uaccess_disable, tmp, isb=1
|
|
-#ifdef CONFIG_CPU_SW_DOMAIN_PAN
|
|
- /*
|
|
- * Whenever we re-enter userspace, the domains should always be
|
|
- * set appropriately.
|
|
- */
|
|
- mov \tmp, #DACR_UACCESS_DISABLE
|
|
- mcr p15, 0, \tmp, c3, c0, 0 @ Set domain register
|
|
- .if \isb
|
|
- instr_sync
|
|
- .endif
|
|
-#endif
|
|
- .endm
|
|
-
|
|
- .macro uaccess_enable, tmp, isb=1
|
|
-#ifdef CONFIG_CPU_SW_DOMAIN_PAN
|
|
- /*
|
|
- * Whenever we re-enter userspace, the domains should always be
|
|
- * set appropriately.
|
|
- */
|
|
- mov \tmp, #DACR_UACCESS_ENABLE
|
|
- mcr p15, 0, \tmp, c3, c0, 0
|
|
- .if \isb
|
|
- instr_sync
|
|
- .endif
|
|
-#endif
|
|
- .endm
|
|
-
|
|
- .macro uaccess_save, tmp
|
|
-#ifdef CONFIG_CPU_SW_DOMAIN_PAN
|
|
- mrc p15, 0, \tmp, c3, c0, 0
|
|
- str \tmp, [sp, #SVC_DACR]
|
|
-#endif
|
|
- .endm
|
|
-
|
|
- .macro uaccess_restore
|
|
-#ifdef CONFIG_CPU_SW_DOMAIN_PAN
|
|
- ldr r0, [sp, #SVC_DACR]
|
|
- mcr p15, 0, r0, c3, c0, 0
|
|
-#endif
|
|
- .endm
|
|
-
|
|
.irp c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo
|
|
.macro ret\c, reg
|
|
#if __LINUX_ARM_ARCH__ < 6
|
|
diff --git a/arch/arm/include/asm/uaccess-asm.h b/arch/arm/include/asm/uaccess-asm.h
|
|
new file mode 100644
|
|
index 000000000000..907571fd05c6
|
|
--- /dev/null
|
|
+++ b/arch/arm/include/asm/uaccess-asm.h
|
|
@@ -0,0 +1,117 @@
|
|
+/* SPDX-License-Identifier: GPL-2.0-only */
|
|
+
|
|
+#ifndef __ASM_UACCESS_ASM_H__
|
|
+#define __ASM_UACCESS_ASM_H__
|
|
+
|
|
+#include <asm/asm-offsets.h>
|
|
+#include <asm/domain.h>
|
|
+#include <asm/memory.h>
|
|
+#include <asm/thread_info.h>
|
|
+
|
|
+ .macro csdb
|
|
+#ifdef CONFIG_THUMB2_KERNEL
|
|
+ .inst.w 0xf3af8014
|
|
+#else
|
|
+ .inst 0xe320f014
|
|
+#endif
|
|
+ .endm
|
|
+
|
|
+ .macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req
|
|
+#ifndef CONFIG_CPU_USE_DOMAINS
|
|
+ adds \tmp, \addr, #\size - 1
|
|
+ sbcscc \tmp, \tmp, \limit
|
|
+ bcs \bad
|
|
+#ifdef CONFIG_CPU_SPECTRE
|
|
+ movcs \addr, #0
|
|
+ csdb
|
|
+#endif
|
|
+#endif
|
|
+ .endm
|
|
+
|
|
+ .macro uaccess_mask_range_ptr, addr:req, size:req, limit:req, tmp:req
|
|
+#ifdef CONFIG_CPU_SPECTRE
|
|
+ sub \tmp, \limit, #1
|
|
+ subs \tmp, \tmp, \addr @ tmp = limit - 1 - addr
|
|
+ addhs \tmp, \tmp, #1 @ if (tmp >= 0) {
|
|
+ subshs \tmp, \tmp, \size @ tmp = limit - (addr + size) }
|
|
+ movlo \addr, #0 @ if (tmp < 0) addr = NULL
|
|
+ csdb
|
|
+#endif
|
|
+ .endm
|
|
+
|
|
+ .macro uaccess_disable, tmp, isb=1
|
|
+#ifdef CONFIG_CPU_SW_DOMAIN_PAN
|
|
+ /*
|
|
+ * Whenever we re-enter userspace, the domains should always be
|
|
+ * set appropriately.
|
|
+ */
|
|
+ mov \tmp, #DACR_UACCESS_DISABLE
|
|
+ mcr p15, 0, \tmp, c3, c0, 0 @ Set domain register
|
|
+ .if \isb
|
|
+ instr_sync
|
|
+ .endif
|
|
+#endif
|
|
+ .endm
|
|
+
|
|
+ .macro uaccess_enable, tmp, isb=1
|
|
+#ifdef CONFIG_CPU_SW_DOMAIN_PAN
|
|
+ /*
|
|
+ * Whenever we re-enter userspace, the domains should always be
|
|
+ * set appropriately.
|
|
+ */
|
|
+ mov \tmp, #DACR_UACCESS_ENABLE
|
|
+ mcr p15, 0, \tmp, c3, c0, 0
|
|
+ .if \isb
|
|
+ instr_sync
|
|
+ .endif
|
|
+#endif
|
|
+ .endm
|
|
+
|
|
+#if defined(CONFIG_CPU_SW_DOMAIN_PAN) || defined(CONFIG_CPU_USE_DOMAINS)
|
|
+#define DACR(x...) x
|
|
+#else
|
|
+#define DACR(x...)
|
|
+#endif
|
|
+
|
|
+ /*
|
|
+ * Save the address limit on entry to a privileged exception.
|
|
+ *
|
|
+ * If we are using the DACR for kernel access by the user accessors
|
|
+ * (CONFIG_CPU_USE_DOMAINS=y), always reset the DACR kernel domain
|
|
+ * back to client mode, whether or not \disable is set.
|
|
+ *
|
|
+ * If we are using SW PAN, set the DACR user domain to no access
|
|
+ * if \disable is set.
|
|
+ */
|
|
+ .macro uaccess_entry, tsk, tmp0, tmp1, tmp2, disable
|
|
+ ldr \tmp1, [\tsk, #TI_ADDR_LIMIT]
|
|
+ mov \tmp2, #TASK_SIZE
|
|
+ str \tmp2, [\tsk, #TI_ADDR_LIMIT]
|
|
+ DACR( mrc p15, 0, \tmp0, c3, c0, 0)
|
|
+ DACR( str \tmp0, [sp, #SVC_DACR])
|
|
+ str \tmp1, [sp, #SVC_ADDR_LIMIT]
|
|
+ .if \disable && IS_ENABLED(CONFIG_CPU_SW_DOMAIN_PAN)
|
|
+ /* kernel=client, user=no access */
|
|
+ mov \tmp2, #DACR_UACCESS_DISABLE
|
|
+ mcr p15, 0, \tmp2, c3, c0, 0
|
|
+ instr_sync
|
|
+ .elseif IS_ENABLED(CONFIG_CPU_USE_DOMAINS)
|
|
+ /* kernel=client */
|
|
+ bic \tmp2, \tmp0, #domain_mask(DOMAIN_KERNEL)
|
|
+ orr \tmp2, \tmp2, #domain_val(DOMAIN_KERNEL, DOMAIN_CLIENT)
|
|
+ mcr p15, 0, \tmp2, c3, c0, 0
|
|
+ instr_sync
|
|
+ .endif
|
|
+ .endm
|
|
+
|
|
+ /* Restore the user access state previously saved by uaccess_entry */
|
|
+ .macro uaccess_exit, tsk, tmp0, tmp1
|
|
+ ldr \tmp1, [sp, #SVC_ADDR_LIMIT]
|
|
+ DACR( ldr \tmp0, [sp, #SVC_DACR])
|
|
+ str \tmp1, [\tsk, #TI_ADDR_LIMIT]
|
|
+ DACR( mcr p15, 0, \tmp0, c3, c0, 0)
|
|
+ .endm
|
|
+
|
|
+#undef DACR
|
|
+
|
|
+#endif /* __ASM_UACCESS_ASM_H__ */
|
|
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
|
|
index 858d4e541532..a874b753397e 100644
|
|
--- a/arch/arm/kernel/entry-armv.S
|
|
+++ b/arch/arm/kernel/entry-armv.S
|
|
@@ -27,6 +27,7 @@
|
|
#include <asm/unistd.h>
|
|
#include <asm/tls.h>
|
|
#include <asm/system_info.h>
|
|
+#include <asm/uaccess-asm.h>
|
|
|
|
#include "entry-header.S"
|
|
#include <asm/entry-macro-multi.S>
|
|
@@ -179,15 +180,7 @@ ENDPROC(__und_invalid)
|
|
stmia r7, {r2 - r6}
|
|
|
|
get_thread_info tsk
|
|
- ldr r0, [tsk, #TI_ADDR_LIMIT]
|
|
- mov r1, #TASK_SIZE
|
|
- str r1, [tsk, #TI_ADDR_LIMIT]
|
|
- str r0, [sp, #SVC_ADDR_LIMIT]
|
|
-
|
|
- uaccess_save r0
|
|
- .if \uaccess
|
|
- uaccess_disable r0
|
|
- .endif
|
|
+ uaccess_entry tsk, r0, r1, r2, \uaccess
|
|
|
|
.if \trace
|
|
#ifdef CONFIG_TRACE_IRQFLAGS
|
|
diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S
|
|
index 32051ec5b33f..40db0f9188b6 100644
|
|
--- a/arch/arm/kernel/entry-header.S
|
|
+++ b/arch/arm/kernel/entry-header.S
|
|
@@ -6,6 +6,7 @@
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/errno.h>
|
|
#include <asm/thread_info.h>
|
|
+#include <asm/uaccess-asm.h>
|
|
#include <asm/v7m.h>
|
|
|
|
@ Bad Abort numbers
|
|
@@ -217,9 +218,7 @@
|
|
blne trace_hardirqs_off
|
|
#endif
|
|
.endif
|
|
- ldr r1, [sp, #SVC_ADDR_LIMIT]
|
|
- uaccess_restore
|
|
- str r1, [tsk, #TI_ADDR_LIMIT]
|
|
+ uaccess_exit tsk, r0, r1
|
|
|
|
#ifndef CONFIG_THUMB2_KERNEL
|
|
@ ARM mode SVC restore
|
|
@@ -263,9 +262,7 @@
|
|
@ on the stack remains correct).
|
|
@
|
|
.macro svc_exit_via_fiq
|
|
- ldr r1, [sp, #SVC_ADDR_LIMIT]
|
|
- uaccess_restore
|
|
- str r1, [tsk, #TI_ADDR_LIMIT]
|
|
+ uaccess_exit tsk, r0, r1
|
|
#ifndef CONFIG_THUMB2_KERNEL
|
|
@ ARM mode restore
|
|
mov r0, sp
|
|
diff --git a/arch/arm64/boot/dts/mediatek/mt8173.dtsi b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
|
|
index 15f1842f6df3..5891b7151432 100644
|
|
--- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi
|
|
+++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
|
|
@@ -1397,8 +1397,8 @@
|
|
"venc_lt_sel";
|
|
assigned-clocks = <&topckgen CLK_TOP_VENC_SEL>,
|
|
<&topckgen CLK_TOP_VENC_LT_SEL>;
|
|
- assigned-clock-parents = <&topckgen CLK_TOP_VENCPLL_D2>,
|
|
- <&topckgen CLK_TOP_UNIVPLL1_D2>;
|
|
+ assigned-clock-parents = <&topckgen CLK_TOP_VCODECPLL>,
|
|
+ <&topckgen CLK_TOP_VCODECPLL_370P5>;
|
|
};
|
|
|
|
vencltsys: clock-controller@19000000 {
|
|
diff --git a/arch/arm64/boot/dts/rockchip/rk3328-evb.dts b/arch/arm64/boot/dts/rockchip/rk3328-evb.dts
|
|
index 6abc6f4a86cf..05265b38cc02 100644
|
|
--- a/arch/arm64/boot/dts/rockchip/rk3328-evb.dts
|
|
+++ b/arch/arm64/boot/dts/rockchip/rk3328-evb.dts
|
|
@@ -86,7 +86,7 @@
|
|
assigned-clock-rate = <50000000>;
|
|
assigned-clocks = <&cru SCLK_MAC2PHY>;
|
|
assigned-clock-parents = <&cru SCLK_MAC2PHY_SRC>;
|
|
-
|
|
+ status = "okay";
|
|
};
|
|
|
|
&i2c1 {
|
|
diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
|
|
index cd97016b7c18..c5d8d1c58291 100644
|
|
--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
|
|
+++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
|
|
@@ -1881,10 +1881,10 @@
|
|
gpu: gpu@ff9a0000 {
|
|
compatible = "rockchip,rk3399-mali", "arm,mali-t860";
|
|
reg = <0x0 0xff9a0000 0x0 0x10000>;
|
|
- interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH 0>,
|
|
- <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH 0>,
|
|
- <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH 0>;
|
|
- interrupt-names = "gpu", "job", "mmu";
|
|
+ interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH 0>,
|
|
+ <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH 0>,
|
|
+ <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH 0>;
|
|
+ interrupt-names = "job", "mmu", "gpu";
|
|
clocks = <&cru ACLK_GPU>;
|
|
power-domains = <&power RK3399_PD_GPU>;
|
|
status = "disabled";
|
|
diff --git a/arch/csky/abiv1/inc/abi/entry.h b/arch/csky/abiv1/inc/abi/entry.h
|
|
index 5056ebb902d1..61d94ec7dd16 100644
|
|
--- a/arch/csky/abiv1/inc/abi/entry.h
|
|
+++ b/arch/csky/abiv1/inc/abi/entry.h
|
|
@@ -167,8 +167,8 @@
|
|
* BA Reserved C D V
|
|
*/
|
|
cprcr r6, cpcr30
|
|
- lsri r6, 28
|
|
- lsli r6, 28
|
|
+ lsri r6, 29
|
|
+ lsli r6, 29
|
|
addi r6, 0xe
|
|
cpwcr r6, cpcr30
|
|
|
|
diff --git a/arch/csky/abiv2/inc/abi/entry.h b/arch/csky/abiv2/inc/abi/entry.h
|
|
index 111973c6c713..9023828ede97 100644
|
|
--- a/arch/csky/abiv2/inc/abi/entry.h
|
|
+++ b/arch/csky/abiv2/inc/abi/entry.h
|
|
@@ -225,8 +225,8 @@
|
|
*/
|
|
mfcr r6, cr<30, 15> /* Get MSA0 */
|
|
2:
|
|
- lsri r6, 28
|
|
- lsli r6, 28
|
|
+ lsri r6, 29
|
|
+ lsli r6, 29
|
|
addi r6, 0x1ce
|
|
mtcr r6, cr<30, 15> /* Set MSA0 */
|
|
|
|
diff --git a/arch/csky/include/asm/uaccess.h b/arch/csky/include/asm/uaccess.h
|
|
index eaa1c3403a42..60f8a4112588 100644
|
|
--- a/arch/csky/include/asm/uaccess.h
|
|
+++ b/arch/csky/include/asm/uaccess.h
|
|
@@ -254,7 +254,7 @@ do { \
|
|
|
|
extern int __get_user_bad(void);
|
|
|
|
-#define __copy_user(to, from, n) \
|
|
+#define ___copy_to_user(to, from, n) \
|
|
do { \
|
|
int w0, w1, w2, w3; \
|
|
asm volatile( \
|
|
@@ -289,31 +289,34 @@ do { \
|
|
" subi %0, 4 \n" \
|
|
" br 3b \n" \
|
|
"5: cmpnei %0, 0 \n" /* 1B */ \
|
|
- " bf 8f \n" \
|
|
+ " bf 13f \n" \
|
|
" ldb %3, (%2, 0) \n" \
|
|
"6: stb %3, (%1, 0) \n" \
|
|
" addi %2, 1 \n" \
|
|
" addi %1, 1 \n" \
|
|
" subi %0, 1 \n" \
|
|
" br 5b \n" \
|
|
- "7: br 8f \n" \
|
|
+ "7: subi %0, 4 \n" \
|
|
+ "8: subi %0, 4 \n" \
|
|
+ "12: subi %0, 4 \n" \
|
|
+ " br 13f \n" \
|
|
".section __ex_table, \"a\" \n" \
|
|
".align 2 \n" \
|
|
- ".long 2b, 7b \n" \
|
|
- ".long 9b, 7b \n" \
|
|
- ".long 10b, 7b \n" \
|
|
+ ".long 2b, 13f \n" \
|
|
+ ".long 4b, 13f \n" \
|
|
+ ".long 6b, 13f \n" \
|
|
+ ".long 9b, 12b \n" \
|
|
+ ".long 10b, 8b \n" \
|
|
".long 11b, 7b \n" \
|
|
- ".long 4b, 7b \n" \
|
|
- ".long 6b, 7b \n" \
|
|
".previous \n" \
|
|
- "8: \n" \
|
|
+ "13: \n" \
|
|
: "=r"(n), "=r"(to), "=r"(from), "=r"(w0), \
|
|
"=r"(w1), "=r"(w2), "=r"(w3) \
|
|
: "0"(n), "1"(to), "2"(from) \
|
|
: "memory"); \
|
|
} while (0)
|
|
|
|
-#define __copy_user_zeroing(to, from, n) \
|
|
+#define ___copy_from_user(to, from, n) \
|
|
do { \
|
|
int tmp; \
|
|
int nsave; \
|
|
@@ -356,22 +359,22 @@ do { \
|
|
" addi %1, 1 \n" \
|
|
" subi %0, 1 \n" \
|
|
" br 5b \n" \
|
|
- "8: mov %3, %0 \n" \
|
|
- " movi %4, 0 \n" \
|
|
- "9: stb %4, (%1, 0) \n" \
|
|
- " addi %1, 1 \n" \
|
|
- " subi %3, 1 \n" \
|
|
- " cmpnei %3, 0 \n" \
|
|
- " bt 9b \n" \
|
|
- " br 7f \n" \
|
|
+ "8: stw %3, (%1, 0) \n" \
|
|
+ " subi %0, 4 \n" \
|
|
+ " bf 7f \n" \
|
|
+ "9: subi %0, 8 \n" \
|
|
+ " bf 7f \n" \
|
|
+ "13: stw %3, (%1, 8) \n" \
|
|
+ " subi %0, 12 \n" \
|
|
+ " bf 7f \n" \
|
|
".section __ex_table, \"a\" \n" \
|
|
".align 2 \n" \
|
|
- ".long 2b, 8b \n" \
|
|
+ ".long 2b, 7f \n" \
|
|
+ ".long 4b, 7f \n" \
|
|
+ ".long 6b, 7f \n" \
|
|
".long 10b, 8b \n" \
|
|
- ".long 11b, 8b \n" \
|
|
- ".long 12b, 8b \n" \
|
|
- ".long 4b, 8b \n" \
|
|
- ".long 6b, 8b \n" \
|
|
+ ".long 11b, 9b \n" \
|
|
+ ".long 12b,13b \n" \
|
|
".previous \n" \
|
|
"7: \n" \
|
|
: "=r"(n), "=r"(to), "=r"(from), "=r"(nsave), \
|
|
diff --git a/arch/csky/kernel/entry.S b/arch/csky/kernel/entry.S
|
|
index a7a5b67df898..65c55f22532a 100644
|
|
--- a/arch/csky/kernel/entry.S
|
|
+++ b/arch/csky/kernel/entry.S
|
|
@@ -318,8 +318,6 @@ ENTRY(__switch_to)
|
|
|
|
mfcr a2, psr /* Save PSR value */
|
|
stw a2, (a3, THREAD_SR) /* Save PSR in task struct */
|
|
- bclri a2, 6 /* Disable interrupts */
|
|
- mtcr a2, psr
|
|
|
|
SAVE_SWITCH_STACK
|
|
|
|
diff --git a/arch/csky/kernel/perf_callchain.c b/arch/csky/kernel/perf_callchain.c
|
|
index e68ff375c8f8..ab55e98ee8f6 100644
|
|
--- a/arch/csky/kernel/perf_callchain.c
|
|
+++ b/arch/csky/kernel/perf_callchain.c
|
|
@@ -12,12 +12,17 @@ struct stackframe {
|
|
|
|
static int unwind_frame_kernel(struct stackframe *frame)
|
|
{
|
|
- if (kstack_end((void *)frame->fp))
|
|
+ unsigned long low = (unsigned long)task_stack_page(current);
|
|
+ unsigned long high = low + THREAD_SIZE;
|
|
+
|
|
+ if (unlikely(frame->fp < low || frame->fp > high))
|
|
return -EPERM;
|
|
- if (frame->fp & 0x3 || frame->fp < TASK_SIZE)
|
|
+
|
|
+ if (kstack_end((void *)frame->fp) || frame->fp & 0x3)
|
|
return -EPERM;
|
|
|
|
*frame = *(struct stackframe *)frame->fp;
|
|
+
|
|
if (__kernel_text_address(frame->lr)) {
|
|
int graph = 0;
|
|
|
|
diff --git a/arch/csky/lib/usercopy.c b/arch/csky/lib/usercopy.c
|
|
index 647a23986fb5..3c9bd645e643 100644
|
|
--- a/arch/csky/lib/usercopy.c
|
|
+++ b/arch/csky/lib/usercopy.c
|
|
@@ -7,10 +7,7 @@
|
|
unsigned long raw_copy_from_user(void *to, const void *from,
|
|
unsigned long n)
|
|
{
|
|
- if (access_ok(from, n))
|
|
- __copy_user_zeroing(to, from, n);
|
|
- else
|
|
- memset(to, 0, n);
|
|
+ ___copy_from_user(to, from, n);
|
|
return n;
|
|
}
|
|
EXPORT_SYMBOL(raw_copy_from_user);
|
|
@@ -18,8 +15,7 @@ EXPORT_SYMBOL(raw_copy_from_user);
|
|
unsigned long raw_copy_to_user(void *to, const void *from,
|
|
unsigned long n)
|
|
{
|
|
- if (access_ok(to, n))
|
|
- __copy_user(to, from, n);
|
|
+ ___copy_to_user(to, from, n);
|
|
return n;
|
|
}
|
|
EXPORT_SYMBOL(raw_copy_to_user);
|
|
diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c
|
|
index ddca8287d43b..3e54484797f6 100644
|
|
--- a/arch/parisc/mm/init.c
|
|
+++ b/arch/parisc/mm/init.c
|
|
@@ -588,7 +588,7 @@ void __init mem_init(void)
|
|
> BITS_PER_LONG);
|
|
|
|
high_memory = __va((max_pfn << PAGE_SHIFT));
|
|
- set_max_mapnr(page_to_pfn(virt_to_page(high_memory - 1)) + 1);
|
|
+ set_max_mapnr(max_low_pfn);
|
|
memblock_free_all();
|
|
|
|
#ifdef CONFIG_PA11
|
|
diff --git a/arch/riscv/kernel/stacktrace.c b/arch/riscv/kernel/stacktrace.c
|
|
index 0940681d2f68..19e46f4160cc 100644
|
|
--- a/arch/riscv/kernel/stacktrace.c
|
|
+++ b/arch/riscv/kernel/stacktrace.c
|
|
@@ -63,7 +63,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
|
|
|
#else /* !CONFIG_FRAME_POINTER */
|
|
|
|
-static void notrace walk_stackframe(struct task_struct *task,
|
|
+void notrace walk_stackframe(struct task_struct *task,
|
|
struct pt_regs *regs, bool (*fn)(unsigned long, void *), void *arg)
|
|
{
|
|
unsigned long sp, pc;
|
|
diff --git a/arch/x86/include/asm/dma.h b/arch/x86/include/asm/dma.h
|
|
index 00f7cf45e699..8e95aa4b0d17 100644
|
|
--- a/arch/x86/include/asm/dma.h
|
|
+++ b/arch/x86/include/asm/dma.h
|
|
@@ -74,7 +74,7 @@
|
|
#define MAX_DMA_PFN ((16UL * 1024 * 1024) >> PAGE_SHIFT)
|
|
|
|
/* 4GB broken PCI/AGP hardware bus master zone */
|
|
-#define MAX_DMA32_PFN ((4UL * 1024 * 1024 * 1024) >> PAGE_SHIFT)
|
|
+#define MAX_DMA32_PFN (1UL << (32 - PAGE_SHIFT))
|
|
|
|
#ifdef CONFIG_X86_32
|
|
/* The maximum address that we can perform a DMA transfer to on this platform */
|
|
diff --git a/arch/x86/include/uapi/asm/unistd.h b/arch/x86/include/uapi/asm/unistd.h
|
|
index 196fdd02b8b1..be5e2e747f50 100644
|
|
--- a/arch/x86/include/uapi/asm/unistd.h
|
|
+++ b/arch/x86/include/uapi/asm/unistd.h
|
|
@@ -2,8 +2,15 @@
|
|
#ifndef _UAPI_ASM_X86_UNISTD_H
|
|
#define _UAPI_ASM_X86_UNISTD_H
|
|
|
|
-/* x32 syscall flag bit */
|
|
-#define __X32_SYSCALL_BIT 0x40000000UL
|
|
+/*
|
|
+ * x32 syscall flag bit. Some user programs expect syscall NR macros
|
|
+ * and __X32_SYSCALL_BIT to have type int, even though syscall numbers
|
|
+ * are, for practical purposes, unsigned long.
|
|
+ *
|
|
+ * Fortunately, expressions like (nr & ~__X32_SYSCALL_BIT) do the right
|
|
+ * thing regardless.
|
|
+ */
|
|
+#define __X32_SYSCALL_BIT 0x40000000
|
|
|
|
#ifndef __KERNEL__
|
|
# ifdef __i386__
|
|
diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
|
|
index e5cb67d67c03..c94fec268ef2 100644
|
|
--- a/arch/x86/kernel/fpu/xstate.c
|
|
+++ b/arch/x86/kernel/fpu/xstate.c
|
|
@@ -952,18 +952,31 @@ static inline bool xfeatures_mxcsr_quirk(u64 xfeatures)
|
|
return true;
|
|
}
|
|
|
|
-/*
|
|
- * This is similar to user_regset_copyout(), but will not add offset to
|
|
- * the source data pointer or increment pos, count, kbuf, and ubuf.
|
|
- */
|
|
-static inline void
|
|
-__copy_xstate_to_kernel(void *kbuf, const void *data,
|
|
- unsigned int offset, unsigned int size, unsigned int size_total)
|
|
+static void fill_gap(unsigned to, void **kbuf, unsigned *pos, unsigned *count)
|
|
{
|
|
- if (offset < size_total) {
|
|
- unsigned int copy = min(size, size_total - offset);
|
|
+ if (*pos < to) {
|
|
+ unsigned size = to - *pos;
|
|
+
|
|
+ if (size > *count)
|
|
+ size = *count;
|
|
+ memcpy(*kbuf, (void *)&init_fpstate.xsave + *pos, size);
|
|
+ *kbuf += size;
|
|
+ *pos += size;
|
|
+ *count -= size;
|
|
+ }
|
|
+}
|
|
|
|
- memcpy(kbuf + offset, data, copy);
|
|
+static void copy_part(unsigned offset, unsigned size, void *from,
|
|
+ void **kbuf, unsigned *pos, unsigned *count)
|
|
+{
|
|
+ fill_gap(offset, kbuf, pos, count);
|
|
+ if (size > *count)
|
|
+ size = *count;
|
|
+ if (size) {
|
|
+ memcpy(*kbuf, from, size);
|
|
+ *kbuf += size;
|
|
+ *pos += size;
|
|
+ *count -= size;
|
|
}
|
|
}
|
|
|
|
@@ -976,8 +989,9 @@ __copy_xstate_to_kernel(void *kbuf, const void *data,
|
|
*/
|
|
int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int offset_start, unsigned int size_total)
|
|
{
|
|
- unsigned int offset, size;
|
|
struct xstate_header header;
|
|
+ const unsigned off_mxcsr = offsetof(struct fxregs_state, mxcsr);
|
|
+ unsigned count = size_total;
|
|
int i;
|
|
|
|
/*
|
|
@@ -993,46 +1007,42 @@ int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int of
|
|
header.xfeatures = xsave->header.xfeatures;
|
|
header.xfeatures &= ~XFEATURE_MASK_SUPERVISOR;
|
|
|
|
+ if (header.xfeatures & XFEATURE_MASK_FP)
|
|
+ copy_part(0, off_mxcsr,
|
|
+ &xsave->i387, &kbuf, &offset_start, &count);
|
|
+ if (header.xfeatures & (XFEATURE_MASK_SSE | XFEATURE_MASK_YMM))
|
|
+ copy_part(off_mxcsr, MXCSR_AND_FLAGS_SIZE,
|
|
+ &xsave->i387.mxcsr, &kbuf, &offset_start, &count);
|
|
+ if (header.xfeatures & XFEATURE_MASK_FP)
|
|
+ copy_part(offsetof(struct fxregs_state, st_space), 128,
|
|
+ &xsave->i387.st_space, &kbuf, &offset_start, &count);
|
|
+ if (header.xfeatures & XFEATURE_MASK_SSE)
|
|
+ copy_part(xstate_offsets[XFEATURE_MASK_SSE], 256,
|
|
+ &xsave->i387.xmm_space, &kbuf, &offset_start, &count);
|
|
+ /*
|
|
+ * Fill xsave->i387.sw_reserved value for ptrace frame:
|
|
+ */
|
|
+ copy_part(offsetof(struct fxregs_state, sw_reserved), 48,
|
|
+ xstate_fx_sw_bytes, &kbuf, &offset_start, &count);
|
|
/*
|
|
* Copy xregs_state->header:
|
|
*/
|
|
- offset = offsetof(struct xregs_state, header);
|
|
- size = sizeof(header);
|
|
-
|
|
- __copy_xstate_to_kernel(kbuf, &header, offset, size, size_total);
|
|
+ copy_part(offsetof(struct xregs_state, header), sizeof(header),
|
|
+ &header, &kbuf, &offset_start, &count);
|
|
|
|
- for (i = 0; i < XFEATURE_MAX; i++) {
|
|
+ for (i = FIRST_EXTENDED_XFEATURE; i < XFEATURE_MAX; i++) {
|
|
/*
|
|
* Copy only in-use xstates:
|
|
*/
|
|
if ((header.xfeatures >> i) & 1) {
|
|
void *src = __raw_xsave_addr(xsave, i);
|
|
|
|
- offset = xstate_offsets[i];
|
|
- size = xstate_sizes[i];
|
|
-
|
|
- /* The next component has to fit fully into the output buffer: */
|
|
- if (offset + size > size_total)
|
|
- break;
|
|
-
|
|
- __copy_xstate_to_kernel(kbuf, src, offset, size, size_total);
|
|
+ copy_part(xstate_offsets[i], xstate_sizes[i],
|
|
+ src, &kbuf, &offset_start, &count);
|
|
}
|
|
|
|
}
|
|
-
|
|
- if (xfeatures_mxcsr_quirk(header.xfeatures)) {
|
|
- offset = offsetof(struct fxregs_state, mxcsr);
|
|
- size = MXCSR_AND_FLAGS_SIZE;
|
|
- __copy_xstate_to_kernel(kbuf, &xsave->i387.mxcsr, offset, size, size_total);
|
|
- }
|
|
-
|
|
- /*
|
|
- * Fill xsave->i387.sw_reserved value for ptrace frame:
|
|
- */
|
|
- offset = offsetof(struct fxregs_state, sw_reserved);
|
|
- size = sizeof(xstate_fx_sw_bytes);
|
|
-
|
|
- __copy_xstate_to_kernel(kbuf, xstate_fx_sw_bytes, offset, size, size_total);
|
|
+ fill_gap(size_total, &kbuf, &offset_start, &count);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/block/blk-core.c b/block/blk-core.c
|
|
index 1075aaff606d..d5e668ec751b 100644
|
|
--- a/block/blk-core.c
|
|
+++ b/block/blk-core.c
|
|
@@ -886,14 +886,11 @@ generic_make_request_checks(struct bio *bio)
|
|
}
|
|
|
|
/*
|
|
- * Non-mq queues do not honor REQ_NOWAIT, so complete a bio
|
|
- * with BLK_STS_AGAIN status in order to catch -EAGAIN and
|
|
- * to give a chance to the caller to repeat request gracefully.
|
|
+ * For a REQ_NOWAIT based request, return -EOPNOTSUPP
|
|
+ * if queue is not a request based queue.
|
|
*/
|
|
- if ((bio->bi_opf & REQ_NOWAIT) && !queue_is_mq(q)) {
|
|
- status = BLK_STS_AGAIN;
|
|
- goto end_io;
|
|
- }
|
|
+ if ((bio->bi_opf & REQ_NOWAIT) && !queue_is_mq(q))
|
|
+ goto not_supported;
|
|
|
|
if (should_fail_bio(bio))
|
|
goto end_io;
|
|
diff --git a/drivers/clk/qcom/gcc-sm8150.c b/drivers/clk/qcom/gcc-sm8150.c
|
|
index 20877214acff..e3959ff5cb55 100644
|
|
--- a/drivers/clk/qcom/gcc-sm8150.c
|
|
+++ b/drivers/clk/qcom/gcc-sm8150.c
|
|
@@ -75,8 +75,7 @@ static struct clk_alpha_pll_postdiv gpll0_out_even = {
|
|
.clkr.hw.init = &(struct clk_init_data){
|
|
.name = "gpll0_out_even",
|
|
.parent_data = &(const struct clk_parent_data){
|
|
- .fw_name = "bi_tcxo",
|
|
- .name = "bi_tcxo",
|
|
+ .hw = &gpll0.clkr.hw,
|
|
},
|
|
.num_parents = 1,
|
|
.ops = &clk_trion_pll_postdiv_ops,
|
|
diff --git a/drivers/clk/ti/clk-33xx.c b/drivers/clk/ti/clk-33xx.c
|
|
index a360d3109555..73f567d8022f 100644
|
|
--- a/drivers/clk/ti/clk-33xx.c
|
|
+++ b/drivers/clk/ti/clk-33xx.c
|
|
@@ -212,7 +212,7 @@ static const struct omap_clkctrl_reg_data am3_mpu_clkctrl_regs[] __initconst = {
|
|
};
|
|
|
|
static const struct omap_clkctrl_reg_data am3_l4_rtc_clkctrl_regs[] __initconst = {
|
|
- { AM3_L4_RTC_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clk_32768_ck" },
|
|
+ { AM3_L4_RTC_RTC_CLKCTRL, NULL, CLKF_SW_SUP, "clk-24mhz-clkctrl:0000:0" },
|
|
{ 0 },
|
|
};
|
|
|
|
diff --git a/drivers/crypto/chelsio/chtls/chtls_io.c b/drivers/crypto/chelsio/chtls/chtls_io.c
|
|
index 98bc5a4cd5e7..ce1f1d5d7cd5 100644
|
|
--- a/drivers/crypto/chelsio/chtls/chtls_io.c
|
|
+++ b/drivers/crypto/chelsio/chtls/chtls_io.c
|
|
@@ -682,7 +682,7 @@ int chtls_push_frames(struct chtls_sock *csk, int comp)
|
|
make_tx_data_wr(sk, skb, immdlen, len,
|
|
credits_needed, completion);
|
|
tp->snd_nxt += len;
|
|
- tp->lsndtime = tcp_time_stamp(tp);
|
|
+ tp->lsndtime = tcp_jiffies32;
|
|
if (completion)
|
|
ULP_SKB_CB(skb)->flags &= ~ULPCB_FLAG_NEED_HDR;
|
|
} else {
|
|
diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c
|
|
index 9fa6d3a967d2..100575973e1f 100644
|
|
--- a/drivers/gpio/gpio-bcm-kona.c
|
|
+++ b/drivers/gpio/gpio-bcm-kona.c
|
|
@@ -619,7 +619,7 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev)
|
|
|
|
kona_gpio->reg_base = devm_platform_ioremap_resource(pdev, 0);
|
|
if (IS_ERR(kona_gpio->reg_base)) {
|
|
- ret = -ENXIO;
|
|
+ ret = PTR_ERR(kona_gpio->reg_base);
|
|
goto err_irq_domain;
|
|
}
|
|
|
|
diff --git a/drivers/gpio/gpio-exar.c b/drivers/gpio/gpio-exar.c
|
|
index fae327d5b06e..6890d32d9f25 100644
|
|
--- a/drivers/gpio/gpio-exar.c
|
|
+++ b/drivers/gpio/gpio-exar.c
|
|
@@ -145,8 +145,10 @@ static int gpio_exar_probe(struct platform_device *pdev)
|
|
mutex_init(&exar_gpio->lock);
|
|
|
|
index = ida_simple_get(&ida_index, 0, 0, GFP_KERNEL);
|
|
- if (index < 0)
|
|
- goto err_destroy;
|
|
+ if (index < 0) {
|
|
+ ret = index;
|
|
+ goto err_mutex_destroy;
|
|
+ }
|
|
|
|
sprintf(exar_gpio->name, "exar_gpio%d", index);
|
|
exar_gpio->gpio_chip.label = exar_gpio->name;
|
|
@@ -173,6 +175,7 @@ static int gpio_exar_probe(struct platform_device *pdev)
|
|
|
|
err_destroy:
|
|
ida_simple_remove(&ida_index, index);
|
|
+err_mutex_destroy:
|
|
mutex_destroy(&exar_gpio->lock);
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/gpio/gpio-pxa.c b/drivers/gpio/gpio-pxa.c
|
|
index 9888b62f37af..432c487f77b4 100644
|
|
--- a/drivers/gpio/gpio-pxa.c
|
|
+++ b/drivers/gpio/gpio-pxa.c
|
|
@@ -663,8 +663,8 @@ static int pxa_gpio_probe(struct platform_device *pdev)
|
|
pchip->irq1 = irq1;
|
|
|
|
gpio_reg_base = devm_platform_ioremap_resource(pdev, 0);
|
|
- if (!gpio_reg_base)
|
|
- return -EINVAL;
|
|
+ if (IS_ERR(gpio_reg_base))
|
|
+ return PTR_ERR(gpio_reg_base);
|
|
|
|
clk = clk_get(&pdev->dev, NULL);
|
|
if (IS_ERR(clk)) {
|
|
diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c
|
|
index 8a01d3694b28..cecde5440a39 100644
|
|
--- a/drivers/gpio/gpio-tegra.c
|
|
+++ b/drivers/gpio/gpio-tegra.c
|
|
@@ -365,6 +365,7 @@ static void tegra_gpio_irq_shutdown(struct irq_data *d)
|
|
struct tegra_gpio_info *tgi = bank->tgi;
|
|
unsigned int gpio = d->hwirq;
|
|
|
|
+ tegra_gpio_irq_mask(d);
|
|
gpiochip_unlock_as_irq(&tgi->gc, gpio);
|
|
}
|
|
|
|
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
|
|
index a8cf55eb54d8..abdf448b11a3 100644
|
|
--- a/drivers/gpio/gpiolib.c
|
|
+++ b/drivers/gpio/gpiolib.c
|
|
@@ -3894,7 +3894,9 @@ int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset)
|
|
}
|
|
}
|
|
|
|
- if (test_bit(FLAG_IS_OUT, &desc->flags)) {
|
|
+ /* To be valid for IRQ the line needs to be input or open drain */
|
|
+ if (test_bit(FLAG_IS_OUT, &desc->flags) &&
|
|
+ !test_bit(FLAG_OPEN_DRAIN, &desc->flags)) {
|
|
chip_err(chip,
|
|
"%s: tried to flag a GPIO set as output for IRQ\n",
|
|
__func__);
|
|
@@ -3957,7 +3959,12 @@ void gpiochip_enable_irq(struct gpio_chip *chip, unsigned int offset)
|
|
|
|
if (!IS_ERR(desc) &&
|
|
!WARN_ON(!test_bit(FLAG_USED_AS_IRQ, &desc->flags))) {
|
|
- WARN_ON(test_bit(FLAG_IS_OUT, &desc->flags));
|
|
+ /*
|
|
+ * We must not be output when using IRQ UNLESS we are
|
|
+ * open drain.
|
|
+ */
|
|
+ WARN_ON(test_bit(FLAG_IS_OUT, &desc->flags) &&
|
|
+ !test_bit(FLAG_OPEN_DRAIN, &desc->flags));
|
|
set_bit(FLAG_IRQ_IS_ENABLED, &desc->flags);
|
|
}
|
|
}
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
|
|
index 6d021ecc8d59..edb561baf8b9 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
|
|
@@ -1288,7 +1288,7 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
|
|
}
|
|
|
|
/* Free the BO*/
|
|
- amdgpu_bo_unref(&mem->bo);
|
|
+ drm_gem_object_put_unlocked(&mem->bo->tbo.base);
|
|
mutex_destroy(&mem->lock);
|
|
kfree(mem);
|
|
|
|
@@ -1630,7 +1630,8 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,
|
|
AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE |
|
|
AMDGPU_VM_PAGE_EXECUTABLE | AMDGPU_VM_MTYPE_NC;
|
|
|
|
- (*mem)->bo = amdgpu_bo_ref(bo);
|
|
+ drm_gem_object_get(&bo->tbo.base);
|
|
+ (*mem)->bo = bo;
|
|
(*mem)->va = va;
|
|
(*mem)->domain = (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?
|
|
AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT;
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
|
|
index 14417cebe38b..6f118292e40f 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
|
|
@@ -4290,11 +4290,7 @@ static int gfx_v10_0_set_powergating_state(void *handle,
|
|
switch (adev->asic_type) {
|
|
case CHIP_NAVI10:
|
|
case CHIP_NAVI14:
|
|
- if (!enable) {
|
|
- amdgpu_gfx_off_ctrl(adev, false);
|
|
- cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);
|
|
- } else
|
|
- amdgpu_gfx_off_ctrl(adev, true);
|
|
+ amdgpu_gfx_off_ctrl(adev, enable);
|
|
break;
|
|
default:
|
|
break;
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
|
|
index c34ddaa65324..6004fdacc866 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
|
|
@@ -4839,10 +4839,9 @@ static int gfx_v9_0_set_powergating_state(void *handle,
|
|
switch (adev->asic_type) {
|
|
case CHIP_RAVEN:
|
|
case CHIP_RENOIR:
|
|
- if (!enable) {
|
|
+ if (!enable)
|
|
amdgpu_gfx_off_ctrl(adev, false);
|
|
- cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);
|
|
- }
|
|
+
|
|
if (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS) {
|
|
gfx_v9_0_enable_sck_slow_down_on_power_up(adev, true);
|
|
gfx_v9_0_enable_sck_slow_down_on_power_down(adev, true);
|
|
@@ -4868,12 +4867,7 @@ static int gfx_v9_0_set_powergating_state(void *handle,
|
|
amdgpu_gfx_off_ctrl(adev, true);
|
|
break;
|
|
case CHIP_VEGA12:
|
|
- if (!enable) {
|
|
- amdgpu_gfx_off_ctrl(adev, false);
|
|
- cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);
|
|
- } else {
|
|
- amdgpu_gfx_off_ctrl(adev, true);
|
|
- }
|
|
+ amdgpu_gfx_off_ctrl(adev, enable);
|
|
break;
|
|
default:
|
|
break;
|
|
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
index 9f30343262f3..9fd12e108a70 100644
|
|
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
@@ -6951,13 +6951,6 @@ static int dm_update_plane_state(struct dc *dc,
|
|
return -EINVAL;
|
|
}
|
|
|
|
- if (new_plane_state->crtc_x <= -new_acrtc->max_cursor_width ||
|
|
- new_plane_state->crtc_y <= -new_acrtc->max_cursor_height) {
|
|
- DRM_DEBUG_ATOMIC("Bad cursor position %d, %d\n",
|
|
- new_plane_state->crtc_x, new_plane_state->crtc_y);
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
|
|
index 8bb5fbef7de0..9eb3a0dcd1f2 100644
|
|
--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
|
|
+++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
|
|
@@ -320,12 +320,12 @@ static void pp_dpm_en_umd_pstate(struct pp_hwmgr *hwmgr,
|
|
if (*level & profile_mode_mask) {
|
|
hwmgr->saved_dpm_level = hwmgr->dpm_level;
|
|
hwmgr->en_umd_pstate = true;
|
|
- amdgpu_device_ip_set_clockgating_state(hwmgr->adev,
|
|
- AMD_IP_BLOCK_TYPE_GFX,
|
|
- AMD_CG_STATE_UNGATE);
|
|
amdgpu_device_ip_set_powergating_state(hwmgr->adev,
|
|
AMD_IP_BLOCK_TYPE_GFX,
|
|
AMD_PG_STATE_UNGATE);
|
|
+ amdgpu_device_ip_set_clockgating_state(hwmgr->adev,
|
|
+ AMD_IP_BLOCK_TYPE_GFX,
|
|
+ AMD_CG_STATE_UNGATE);
|
|
}
|
|
} else {
|
|
/* exit umd pstate, restore level, enable gfx cg*/
|
|
diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
|
|
index a066e9297777..b51a124e505a 100644
|
|
--- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
|
|
+++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
|
|
@@ -1541,12 +1541,12 @@ static int smu_enable_umd_pstate(void *handle,
|
|
if (*level & profile_mode_mask) {
|
|
smu_dpm_ctx->saved_dpm_level = smu_dpm_ctx->dpm_level;
|
|
smu_dpm_ctx->enable_umd_pstate = true;
|
|
- amdgpu_device_ip_set_clockgating_state(smu->adev,
|
|
- AMD_IP_BLOCK_TYPE_GFX,
|
|
- AMD_CG_STATE_UNGATE);
|
|
amdgpu_device_ip_set_powergating_state(smu->adev,
|
|
AMD_IP_BLOCK_TYPE_GFX,
|
|
AMD_PG_STATE_UNGATE);
|
|
+ amdgpu_device_ip_set_clockgating_state(smu->adev,
|
|
+ AMD_IP_BLOCK_TYPE_GFX,
|
|
+ AMD_CG_STATE_UNGATE);
|
|
}
|
|
} else {
|
|
/* exit umd pstate, restore level, enable gfx cg*/
|
|
diff --git a/drivers/gpu/drm/ingenic/ingenic-drm.c b/drivers/gpu/drm/ingenic/ingenic-drm.c
|
|
index 9e95f6fd5406..376fca6ca9f4 100644
|
|
--- a/drivers/gpu/drm/ingenic/ingenic-drm.c
|
|
+++ b/drivers/gpu/drm/ingenic/ingenic-drm.c
|
|
@@ -467,7 +467,7 @@ static int ingenic_drm_encoder_atomic_check(struct drm_encoder *encoder,
|
|
|
|
static irqreturn_t ingenic_drm_irq_handler(int irq, void *arg)
|
|
{
|
|
- struct ingenic_drm *priv = arg;
|
|
+ struct ingenic_drm *priv = drm_device_get_priv(arg);
|
|
unsigned int state;
|
|
|
|
regmap_read(priv->map, JZ_REG_LCD_STATE, &state);
|
|
diff --git a/drivers/hwmon/nct7904.c b/drivers/hwmon/nct7904.c
|
|
index 281c81edabc6..dfb122b5e1b7 100644
|
|
--- a/drivers/hwmon/nct7904.c
|
|
+++ b/drivers/hwmon/nct7904.c
|
|
@@ -356,6 +356,7 @@ static int nct7904_read_temp(struct device *dev, u32 attr, int channel,
|
|
struct nct7904_data *data = dev_get_drvdata(dev);
|
|
int ret, temp;
|
|
unsigned int reg1, reg2, reg3;
|
|
+ s8 temps;
|
|
|
|
switch (attr) {
|
|
case hwmon_temp_input:
|
|
@@ -461,7 +462,8 @@ static int nct7904_read_temp(struct device *dev, u32 attr, int channel,
|
|
|
|
if (ret < 0)
|
|
return ret;
|
|
- *val = ret * 1000;
|
|
+ temps = ret;
|
|
+ *val = temps * 1000;
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/infiniband/core/rdma_core.c b/drivers/infiniband/core/rdma_core.c
|
|
index 1c95fefa1f06..d0580eed3bcb 100644
|
|
--- a/drivers/infiniband/core/rdma_core.c
|
|
+++ b/drivers/infiniband/core/rdma_core.c
|
|
@@ -160,9 +160,9 @@ static int uverbs_destroy_uobject(struct ib_uobject *uobj,
|
|
uobj->context = NULL;
|
|
|
|
/*
|
|
- * For DESTROY the usecnt is held write locked, the caller is expected
|
|
- * to put it unlock and put the object when done with it. Only DESTROY
|
|
- * can remove the IDR handle.
|
|
+ * For DESTROY the usecnt is not changed, the caller is expected to
|
|
+ * manage it via uobj_put_destroy(). Only DESTROY can remove the IDR
|
|
+ * handle.
|
|
*/
|
|
if (reason != RDMA_REMOVE_DESTROY)
|
|
atomic_set(&uobj->usecnt, 0);
|
|
@@ -194,7 +194,7 @@ static int uverbs_destroy_uobject(struct ib_uobject *uobj,
|
|
/*
|
|
* This calls uverbs_destroy_uobject() using the RDMA_REMOVE_DESTROY
|
|
* sequence. It should only be used from command callbacks. On success the
|
|
- * caller must pair this with rdma_lookup_put_uobject(LOOKUP_WRITE). This
|
|
+ * caller must pair this with uobj_put_destroy(). This
|
|
* version requires the caller to have already obtained an
|
|
* LOOKUP_DESTROY uobject kref.
|
|
*/
|
|
@@ -205,6 +205,13 @@ int uobj_destroy(struct ib_uobject *uobj, struct uverbs_attr_bundle *attrs)
|
|
|
|
down_read(&ufile->hw_destroy_rwsem);
|
|
|
|
+ /*
|
|
+ * Once the uobject is destroyed by RDMA_REMOVE_DESTROY then it is left
|
|
+ * write locked as the callers put it back with UVERBS_LOOKUP_DESTROY.
|
|
+ * This is because any other concurrent thread can still see the object
|
|
+ * in the xarray due to RCU. Leaving it locked ensures nothing else will
|
|
+ * touch it.
|
|
+ */
|
|
ret = uverbs_try_lock_object(uobj, UVERBS_LOOKUP_WRITE);
|
|
if (ret)
|
|
goto out_unlock;
|
|
@@ -223,7 +230,7 @@ out_unlock:
|
|
/*
|
|
* uobj_get_destroy destroys the HW object and returns a handle to the uobj
|
|
* with a NULL object pointer. The caller must pair this with
|
|
- * uverbs_put_destroy.
|
|
+ * uobj_put_destroy().
|
|
*/
|
|
struct ib_uobject *__uobj_get_destroy(const struct uverbs_api_object *obj,
|
|
u32 id, struct uverbs_attr_bundle *attrs)
|
|
@@ -257,8 +264,7 @@ int __uobj_perform_destroy(const struct uverbs_api_object *obj, u32 id,
|
|
uobj = __uobj_get_destroy(obj, id, attrs);
|
|
if (IS_ERR(uobj))
|
|
return PTR_ERR(uobj);
|
|
-
|
|
- rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE);
|
|
+ uobj_put_destroy(uobj);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c b/drivers/infiniband/hw/i40iw/i40iw_cm.c
|
|
index 2d6a378e8560..b1df93b69df4 100644
|
|
--- a/drivers/infiniband/hw/i40iw/i40iw_cm.c
|
|
+++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c
|
|
@@ -1987,7 +1987,6 @@ static int i40iw_addr_resolve_neigh(struct i40iw_device *iwdev,
|
|
struct rtable *rt;
|
|
struct neighbour *neigh;
|
|
int rc = arpindex;
|
|
- struct net_device *netdev = iwdev->netdev;
|
|
__be32 dst_ipaddr = htonl(dst_ip);
|
|
__be32 src_ipaddr = htonl(src_ip);
|
|
|
|
@@ -1997,9 +1996,6 @@ static int i40iw_addr_resolve_neigh(struct i40iw_device *iwdev,
|
|
return rc;
|
|
}
|
|
|
|
- if (netif_is_bond_slave(netdev))
|
|
- netdev = netdev_master_upper_dev_get(netdev);
|
|
-
|
|
neigh = dst_neigh_lookup(&rt->dst, &dst_ipaddr);
|
|
|
|
rcu_read_lock();
|
|
@@ -2065,7 +2061,6 @@ static int i40iw_addr_resolve_neigh_ipv6(struct i40iw_device *iwdev,
|
|
{
|
|
struct neighbour *neigh;
|
|
int rc = arpindex;
|
|
- struct net_device *netdev = iwdev->netdev;
|
|
struct dst_entry *dst;
|
|
struct sockaddr_in6 dst_addr;
|
|
struct sockaddr_in6 src_addr;
|
|
@@ -2086,9 +2081,6 @@ static int i40iw_addr_resolve_neigh_ipv6(struct i40iw_device *iwdev,
|
|
return rc;
|
|
}
|
|
|
|
- if (netif_is_bond_slave(netdev))
|
|
- netdev = netdev_master_upper_dev_get(netdev);
|
|
-
|
|
neigh = dst_neigh_lookup(dst, dst_addr.sin6_addr.in6_u.u6_addr32);
|
|
|
|
rcu_read_lock();
|
|
diff --git a/drivers/infiniband/hw/qib/qib_sysfs.c b/drivers/infiniband/hw/qib/qib_sysfs.c
|
|
index 568b21eb6ea1..021df0654ba7 100644
|
|
--- a/drivers/infiniband/hw/qib/qib_sysfs.c
|
|
+++ b/drivers/infiniband/hw/qib/qib_sysfs.c
|
|
@@ -760,7 +760,7 @@ int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
|
|
qib_dev_err(dd,
|
|
"Skipping linkcontrol sysfs info, (err %d) port %u\n",
|
|
ret, port_num);
|
|
- goto bail;
|
|
+ goto bail_link;
|
|
}
|
|
kobject_uevent(&ppd->pport_kobj, KOBJ_ADD);
|
|
|
|
@@ -770,7 +770,7 @@ int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
|
|
qib_dev_err(dd,
|
|
"Skipping sl2vl sysfs info, (err %d) port %u\n",
|
|
ret, port_num);
|
|
- goto bail_link;
|
|
+ goto bail_sl;
|
|
}
|
|
kobject_uevent(&ppd->sl2vl_kobj, KOBJ_ADD);
|
|
|
|
@@ -780,7 +780,7 @@ int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
|
|
qib_dev_err(dd,
|
|
"Skipping diag_counters sysfs info, (err %d) port %u\n",
|
|
ret, port_num);
|
|
- goto bail_sl;
|
|
+ goto bail_diagc;
|
|
}
|
|
kobject_uevent(&ppd->diagc_kobj, KOBJ_ADD);
|
|
|
|
@@ -793,7 +793,7 @@ int qib_create_port_files(struct ib_device *ibdev, u8 port_num,
|
|
qib_dev_err(dd,
|
|
"Skipping Congestion Control sysfs info, (err %d) port %u\n",
|
|
ret, port_num);
|
|
- goto bail_diagc;
|
|
+ goto bail_cc;
|
|
}
|
|
|
|
kobject_uevent(&ppd->pport_cc_kobj, KOBJ_ADD);
|
|
@@ -854,6 +854,7 @@ void qib_verbs_unregister_sysfs(struct qib_devdata *dd)
|
|
&cc_table_bin_attr);
|
|
kobject_put(&ppd->pport_cc_kobj);
|
|
}
|
|
+ kobject_put(&ppd->diagc_kobj);
|
|
kobject_put(&ppd->sl2vl_kobj);
|
|
kobject_put(&ppd->pport_kobj);
|
|
}
|
|
diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
|
|
index e580ae9cc55a..780fd2dfc07e 100644
|
|
--- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
|
|
+++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c
|
|
@@ -829,7 +829,7 @@ static int pvrdma_pci_probe(struct pci_dev *pdev,
|
|
!(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
|
|
dev_err(&pdev->dev, "PCI BAR region not MMIO\n");
|
|
ret = -ENOMEM;
|
|
- goto err_free_device;
|
|
+ goto err_disable_pdev;
|
|
}
|
|
|
|
ret = pci_request_regions(pdev, DRV_NAME);
|
|
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
|
|
index 2aa3457a30ce..0e5f27caf2b2 100644
|
|
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
|
|
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
|
|
@@ -377,8 +377,12 @@ struct ipoib_dev_priv {
|
|
struct ipoib_rx_buf *rx_ring;
|
|
|
|
struct ipoib_tx_buf *tx_ring;
|
|
+ /* cyclic ring variables for managing tx_ring, for UD only */
|
|
unsigned int tx_head;
|
|
unsigned int tx_tail;
|
|
+ /* cyclic ring variables for counting overall outstanding send WRs */
|
|
+ unsigned int global_tx_head;
|
|
+ unsigned int global_tx_tail;
|
|
struct ib_sge tx_sge[MAX_SKB_FRAGS + 1];
|
|
struct ib_ud_wr tx_wr;
|
|
struct ib_wc send_wc[MAX_SEND_CQE];
|
|
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
|
|
index c59e00a0881f..9bf0fa30df28 100644
|
|
--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
|
|
+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
|
|
@@ -756,7 +756,8 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_
|
|
return;
|
|
}
|
|
|
|
- if ((priv->tx_head - priv->tx_tail) == ipoib_sendq_size - 1) {
|
|
+ if ((priv->global_tx_head - priv->global_tx_tail) ==
|
|
+ ipoib_sendq_size - 1) {
|
|
ipoib_dbg(priv, "TX ring 0x%x full, stopping kernel net queue\n",
|
|
tx->qp->qp_num);
|
|
netif_stop_queue(dev);
|
|
@@ -786,7 +787,7 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_
|
|
} else {
|
|
netif_trans_update(dev);
|
|
++tx->tx_head;
|
|
- ++priv->tx_head;
|
|
+ ++priv->global_tx_head;
|
|
}
|
|
}
|
|
|
|
@@ -820,10 +821,11 @@ void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc)
|
|
netif_tx_lock(dev);
|
|
|
|
++tx->tx_tail;
|
|
- ++priv->tx_tail;
|
|
+ ++priv->global_tx_tail;
|
|
|
|
if (unlikely(netif_queue_stopped(dev) &&
|
|
- (priv->tx_head - priv->tx_tail) <= ipoib_sendq_size >> 1 &&
|
|
+ ((priv->global_tx_head - priv->global_tx_tail) <=
|
|
+ ipoib_sendq_size >> 1) &&
|
|
test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)))
|
|
netif_wake_queue(dev);
|
|
|
|
@@ -1232,8 +1234,9 @@ timeout:
|
|
dev_kfree_skb_any(tx_req->skb);
|
|
netif_tx_lock_bh(p->dev);
|
|
++p->tx_tail;
|
|
- ++priv->tx_tail;
|
|
- if (unlikely(priv->tx_head - priv->tx_tail == ipoib_sendq_size >> 1) &&
|
|
+ ++priv->global_tx_tail;
|
|
+ if (unlikely((priv->global_tx_head - priv->global_tx_tail) <=
|
|
+ ipoib_sendq_size >> 1) &&
|
|
netif_queue_stopped(p->dev) &&
|
|
test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
|
|
netif_wake_queue(p->dev);
|
|
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
|
|
index c332b4761816..da3c5315bbb5 100644
|
|
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
|
|
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
|
|
@@ -407,9 +407,11 @@ static void ipoib_ib_handle_tx_wc(struct net_device *dev, struct ib_wc *wc)
|
|
dev_kfree_skb_any(tx_req->skb);
|
|
|
|
++priv->tx_tail;
|
|
+ ++priv->global_tx_tail;
|
|
|
|
if (unlikely(netif_queue_stopped(dev) &&
|
|
- ((priv->tx_head - priv->tx_tail) <= ipoib_sendq_size >> 1) &&
|
|
+ ((priv->global_tx_head - priv->global_tx_tail) <=
|
|
+ ipoib_sendq_size >> 1) &&
|
|
test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)))
|
|
netif_wake_queue(dev);
|
|
|
|
@@ -634,7 +636,8 @@ int ipoib_send(struct net_device *dev, struct sk_buff *skb,
|
|
else
|
|
priv->tx_wr.wr.send_flags &= ~IB_SEND_IP_CSUM;
|
|
/* increase the tx_head after send success, but use it for queue state */
|
|
- if (priv->tx_head - priv->tx_tail == ipoib_sendq_size - 1) {
|
|
+ if ((priv->global_tx_head - priv->global_tx_tail) ==
|
|
+ ipoib_sendq_size - 1) {
|
|
ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n");
|
|
netif_stop_queue(dev);
|
|
}
|
|
@@ -662,6 +665,7 @@ int ipoib_send(struct net_device *dev, struct sk_buff *skb,
|
|
|
|
rc = priv->tx_head;
|
|
++priv->tx_head;
|
|
+ ++priv->global_tx_head;
|
|
}
|
|
return rc;
|
|
}
|
|
@@ -807,6 +811,7 @@ int ipoib_ib_dev_stop_default(struct net_device *dev)
|
|
ipoib_dma_unmap_tx(priv, tx_req);
|
|
dev_kfree_skb_any(tx_req->skb);
|
|
++priv->tx_tail;
|
|
+ ++priv->global_tx_tail;
|
|
}
|
|
|
|
for (i = 0; i < ipoib_recvq_size; ++i) {
|
|
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
|
|
index ac0583ff280d..4fd095fd63b6 100644
|
|
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
|
|
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
|
|
@@ -1188,9 +1188,11 @@ static void ipoib_timeout(struct net_device *dev)
|
|
|
|
ipoib_warn(priv, "transmit timeout: latency %d msecs\n",
|
|
jiffies_to_msecs(jiffies - dev_trans_start(dev)));
|
|
- ipoib_warn(priv, "queue stopped %d, tx_head %u, tx_tail %u\n",
|
|
- netif_queue_stopped(dev),
|
|
- priv->tx_head, priv->tx_tail);
|
|
+ ipoib_warn(priv,
|
|
+ "queue stopped %d, tx_head %u, tx_tail %u, global_tx_head %u, global_tx_tail %u\n",
|
|
+ netif_queue_stopped(dev), priv->tx_head, priv->tx_tail,
|
|
+ priv->global_tx_head, priv->global_tx_tail);
|
|
+
|
|
/* XXX reset QP, etc. */
|
|
}
|
|
|
|
@@ -1705,7 +1707,7 @@ static int ipoib_dev_init_default(struct net_device *dev)
|
|
goto out_rx_ring_cleanup;
|
|
}
|
|
|
|
- /* priv->tx_head, tx_tail & tx_outstanding are already 0 */
|
|
+ /* priv->tx_head, tx_tail and global_tx_tail/head are already 0 */
|
|
|
|
if (ipoib_transport_dev_init(dev, priv->ca)) {
|
|
pr_warn("%s: ipoib_transport_dev_init failed\n",
|
|
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
|
|
index cb6e3a5f509c..0d57e51b8ba1 100644
|
|
--- a/drivers/input/evdev.c
|
|
+++ b/drivers/input/evdev.c
|
|
@@ -326,20 +326,6 @@ static int evdev_fasync(int fd, struct file *file, int on)
|
|
return fasync_helper(fd, file, on, &client->fasync);
|
|
}
|
|
|
|
-static int evdev_flush(struct file *file, fl_owner_t id)
|
|
-{
|
|
- struct evdev_client *client = file->private_data;
|
|
- struct evdev *evdev = client->evdev;
|
|
-
|
|
- mutex_lock(&evdev->mutex);
|
|
-
|
|
- if (evdev->exist && !client->revoked)
|
|
- input_flush_device(&evdev->handle, file);
|
|
-
|
|
- mutex_unlock(&evdev->mutex);
|
|
- return 0;
|
|
-}
|
|
-
|
|
static void evdev_free(struct device *dev)
|
|
{
|
|
struct evdev *evdev = container_of(dev, struct evdev, dev);
|
|
@@ -453,6 +439,10 @@ static int evdev_release(struct inode *inode, struct file *file)
|
|
unsigned int i;
|
|
|
|
mutex_lock(&evdev->mutex);
|
|
+
|
|
+ if (evdev->exist && !client->revoked)
|
|
+ input_flush_device(&evdev->handle, file);
|
|
+
|
|
evdev_ungrab(evdev, client);
|
|
mutex_unlock(&evdev->mutex);
|
|
|
|
@@ -1310,7 +1300,6 @@ static const struct file_operations evdev_fops = {
|
|
.compat_ioctl = evdev_ioctl_compat,
|
|
#endif
|
|
.fasync = evdev_fasync,
|
|
- .flush = evdev_flush,
|
|
.llseek = no_llseek,
|
|
};
|
|
|
|
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
|
|
index 6b40a1c68f9f..c77cdb3b62b5 100644
|
|
--- a/drivers/input/joystick/xpad.c
|
|
+++ b/drivers/input/joystick/xpad.c
|
|
@@ -458,6 +458,16 @@ static const u8 xboxone_fw2015_init[] = {
|
|
0x05, 0x20, 0x00, 0x01, 0x00
|
|
};
|
|
|
|
+/*
|
|
+ * This packet is required for Xbox One S (0x045e:0x02ea)
|
|
+ * and Xbox One Elite Series 2 (0x045e:0x0b00) pads to
|
|
+ * initialize the controller that was previously used in
|
|
+ * Bluetooth mode.
|
|
+ */
|
|
+static const u8 xboxone_s_init[] = {
|
|
+ 0x05, 0x20, 0x00, 0x0f, 0x06
|
|
+};
|
|
+
|
|
/*
|
|
* This packet is required for the Titanfall 2 Xbox One pads
|
|
* (0x0e6f:0x0165) to finish initialization and for Hori pads
|
|
@@ -516,6 +526,8 @@ static const struct xboxone_init_packet xboxone_init_packets[] = {
|
|
XBOXONE_INIT_PKT(0x0e6f, 0x0165, xboxone_hori_init),
|
|
XBOXONE_INIT_PKT(0x0f0d, 0x0067, xboxone_hori_init),
|
|
XBOXONE_INIT_PKT(0x0000, 0x0000, xboxone_fw2015_init),
|
|
+ XBOXONE_INIT_PKT(0x045e, 0x02ea, xboxone_s_init),
|
|
+ XBOXONE_INIT_PKT(0x045e, 0x0b00, xboxone_s_init),
|
|
XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_init1),
|
|
XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_init2),
|
|
XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumblebegin_init),
|
|
diff --git a/drivers/input/keyboard/dlink-dir685-touchkeys.c b/drivers/input/keyboard/dlink-dir685-touchkeys.c
|
|
index b0ead7199c40..a69dcc3bd30c 100644
|
|
--- a/drivers/input/keyboard/dlink-dir685-touchkeys.c
|
|
+++ b/drivers/input/keyboard/dlink-dir685-touchkeys.c
|
|
@@ -143,7 +143,7 @@ MODULE_DEVICE_TABLE(of, dir685_tk_of_match);
|
|
|
|
static struct i2c_driver dir685_tk_i2c_driver = {
|
|
.driver = {
|
|
- .name = "dlin-dir685-touchkeys",
|
|
+ .name = "dlink-dir685-touchkeys",
|
|
.of_match_table = of_match_ptr(dir685_tk_of_match),
|
|
},
|
|
.probe = dir685_tk_probe,
|
|
diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
|
|
index 190b9974526b..258d5fe3d395 100644
|
|
--- a/drivers/input/rmi4/rmi_driver.c
|
|
+++ b/drivers/input/rmi4/rmi_driver.c
|
|
@@ -205,7 +205,7 @@ static irqreturn_t rmi_irq_fn(int irq, void *dev_id)
|
|
|
|
if (count) {
|
|
kfree(attn_data.data);
|
|
- attn_data.data = NULL;
|
|
+ drvdata->attn_data.data = NULL;
|
|
}
|
|
|
|
if (!kfifo_is_empty(&drvdata->attn_fifo))
|
|
@@ -1210,7 +1210,8 @@ static int rmi_driver_probe(struct device *dev)
|
|
if (data->input) {
|
|
rmi_driver_set_input_name(rmi_dev, data->input);
|
|
if (!rmi_dev->xport->input) {
|
|
- if (input_register_device(data->input)) {
|
|
+ retval = input_register_device(data->input);
|
|
+ if (retval) {
|
|
dev_err(dev, "%s: Failed to register input device.\n",
|
|
__func__);
|
|
goto err_destroy_functions;
|
|
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
|
|
index 08e919dbeb5d..7e048b557462 100644
|
|
--- a/drivers/input/serio/i8042-x86ia64io.h
|
|
+++ b/drivers/input/serio/i8042-x86ia64io.h
|
|
@@ -662,6 +662,13 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
|
|
},
|
|
},
|
|
+ {
|
|
+ /* Lenovo ThinkPad Twist S230u */
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "33474HU"),
|
|
+ },
|
|
+ },
|
|
{ }
|
|
};
|
|
|
|
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
|
|
index 16d70201de4a..397cb1d3f481 100644
|
|
--- a/drivers/input/touchscreen/usbtouchscreen.c
|
|
+++ b/drivers/input/touchscreen/usbtouchscreen.c
|
|
@@ -182,6 +182,7 @@ static const struct usb_device_id usbtouch_devices[] = {
|
|
#endif
|
|
|
|
#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH
|
|
+ {USB_DEVICE(0x255e, 0x0001), .driver_info = DEVTYPE_IRTOUCH},
|
|
{USB_DEVICE(0x595a, 0x0001), .driver_info = DEVTYPE_IRTOUCH},
|
|
{USB_DEVICE(0x6615, 0x0001), .driver_info = DEVTYPE_IRTOUCH},
|
|
{USB_DEVICE(0x6615, 0x0012), .driver_info = DEVTYPE_IRTOUCH_HIRES},
|
|
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
|
|
index cd3c0ea56657..9d7232e26ecf 100644
|
|
--- a/drivers/iommu/iommu.c
|
|
+++ b/drivers/iommu/iommu.c
|
|
@@ -492,7 +492,7 @@ struct iommu_group *iommu_group_alloc(void)
|
|
NULL, "%d", group->id);
|
|
if (ret) {
|
|
ida_simple_remove(&iommu_group_ida, group->id);
|
|
- kfree(group);
|
|
+ kobject_put(&group->kobj);
|
|
return ERR_PTR(ret);
|
|
}
|
|
|
|
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
|
|
index 9d01b5dca519..7f480c6b1981 100644
|
|
--- a/drivers/mmc/core/block.c
|
|
+++ b/drivers/mmc/core/block.c
|
|
@@ -2475,8 +2475,8 @@ static int mmc_rpmb_chrdev_release(struct inode *inode, struct file *filp)
|
|
struct mmc_rpmb_data *rpmb = container_of(inode->i_cdev,
|
|
struct mmc_rpmb_data, chrdev);
|
|
|
|
- put_device(&rpmb->dev);
|
|
mmc_blk_put(rpmb->md);
|
|
+ put_device(&rpmb->dev);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/net/bonding/bond_sysfs_slave.c b/drivers/net/bonding/bond_sysfs_slave.c
|
|
index 007481557191..9b8346638f69 100644
|
|
--- a/drivers/net/bonding/bond_sysfs_slave.c
|
|
+++ b/drivers/net/bonding/bond_sysfs_slave.c
|
|
@@ -149,8 +149,10 @@ int bond_sysfs_slave_add(struct slave *slave)
|
|
|
|
err = kobject_init_and_add(&slave->kobj, &slave_ktype,
|
|
&(slave->dev->dev.kobj), "bonding_slave");
|
|
- if (err)
|
|
+ if (err) {
|
|
+ kobject_put(&slave->kobj);
|
|
return err;
|
|
+ }
|
|
|
|
for (a = slave_attrs; *a; ++a) {
|
|
err = sysfs_create_file(&slave->kobj, &((*a)->attr));
|
|
diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
|
|
index cffaf4fdd772..6027bb65f7f6 100644
|
|
--- a/drivers/net/dsa/mt7530.c
|
|
+++ b/drivers/net/dsa/mt7530.c
|
|
@@ -639,11 +639,8 @@ mt7530_cpu_port_enable(struct mt7530_priv *priv,
|
|
mt7530_write(priv, MT7530_PVC_P(port),
|
|
PORT_SPEC_TAG);
|
|
|
|
- /* Disable auto learning on the cpu port */
|
|
- mt7530_set(priv, MT7530_PSC_P(port), SA_DIS);
|
|
-
|
|
- /* Unknown unicast frame fordwarding to the cpu port */
|
|
- mt7530_set(priv, MT7530_MFC, UNU_FFP(BIT(port)));
|
|
+ /* Unknown multicast frame forwarding to the cpu port */
|
|
+ mt7530_rmw(priv, MT7530_MFC, UNM_FFP_MASK, UNM_FFP(BIT(port)));
|
|
|
|
/* Set CPU port number */
|
|
if (priv->id == ID_MT7621)
|
|
@@ -1246,8 +1243,6 @@ mt7530_setup(struct dsa_switch *ds)
|
|
/* Enable and reset MIB counters */
|
|
mt7530_mib_reset(ds);
|
|
|
|
- mt7530_clear(priv, MT7530_MFC, UNU_FFP_MASK);
|
|
-
|
|
for (i = 0; i < MT7530_NUM_PORTS; i++) {
|
|
/* Disable forwarding by default on all ports */
|
|
mt7530_rmw(priv, MT7530_PCR_P(i), PCR_MATRIX_MASK,
|
|
diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h
|
|
index 756140b7dfd5..0e7e36d8f994 100644
|
|
--- a/drivers/net/dsa/mt7530.h
|
|
+++ b/drivers/net/dsa/mt7530.h
|
|
@@ -31,6 +31,7 @@ enum {
|
|
#define MT7530_MFC 0x10
|
|
#define BC_FFP(x) (((x) & 0xff) << 24)
|
|
#define UNM_FFP(x) (((x) & 0xff) << 16)
|
|
+#define UNM_FFP_MASK UNM_FFP(~0)
|
|
#define UNU_FFP(x) (((x) & 0xff) << 8)
|
|
#define UNU_FFP_MASK UNU_FFP(~0)
|
|
#define CPU_EN BIT(7)
|
|
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
|
|
index edf8452a2574..63ee0c49be7c 100644
|
|
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
|
|
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
|
|
@@ -9285,7 +9285,7 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init,
|
|
bnxt_free_skbs(bp);
|
|
|
|
/* Save ring stats before shutdown */
|
|
- if (bp->bnapi)
|
|
+ if (bp->bnapi && irq_re_init)
|
|
bnxt_get_ring_stats(bp, &bp->net_stats_prev);
|
|
if (irq_re_init) {
|
|
bnxt_free_irq(bp);
|
|
diff --git a/drivers/net/ethernet/freescale/Kconfig b/drivers/net/ethernet/freescale/Kconfig
|
|
index 6a7e8993119f..941c7e667afc 100644
|
|
--- a/drivers/net/ethernet/freescale/Kconfig
|
|
+++ b/drivers/net/ethernet/freescale/Kconfig
|
|
@@ -77,6 +77,7 @@ config UCC_GETH
|
|
depends on QUICC_ENGINE
|
|
select FSL_PQ_MDIO
|
|
select PHYLIB
|
|
+ select FIXED_PHY
|
|
---help---
|
|
This driver supports the Gigabit Ethernet mode of the QUICC Engine,
|
|
which is available on some Freescale SOCs.
|
|
@@ -90,6 +91,7 @@ config GIANFAR
|
|
depends on HAS_DMA
|
|
select FSL_PQ_MDIO
|
|
select PHYLIB
|
|
+ select FIXED_PHY
|
|
select CRC32
|
|
---help---
|
|
This driver supports the Gigabit TSEC on the MPC83xx, MPC85xx,
|
|
diff --git a/drivers/net/ethernet/freescale/dpaa/Kconfig b/drivers/net/ethernet/freescale/dpaa/Kconfig
|
|
index 3b325733a4f8..0a54c7e0e4ae 100644
|
|
--- a/drivers/net/ethernet/freescale/dpaa/Kconfig
|
|
+++ b/drivers/net/ethernet/freescale/dpaa/Kconfig
|
|
@@ -3,6 +3,7 @@ menuconfig FSL_DPAA_ETH
|
|
tristate "DPAA Ethernet"
|
|
depends on FSL_DPAA && FSL_FMAN
|
|
select PHYLIB
|
|
+ select FIXED_PHY
|
|
select FSL_FMAN_MAC
|
|
---help---
|
|
Data Path Acceleration Architecture Ethernet driver,
|
|
diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
|
|
index 00c4beb760c3..cd9d08695cc1 100644
|
|
--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
|
|
+++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
|
|
@@ -2802,7 +2802,7 @@ static int dpaa_eth_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
/* Do this here, so we can be verbose early */
|
|
- SET_NETDEV_DEV(net_dev, dev);
|
|
+ SET_NETDEV_DEV(net_dev, dev->parent);
|
|
dev_set_drvdata(dev, net_dev);
|
|
|
|
priv = netdev_priv(net_dev);
|
|
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
|
|
index 4344a59c823f..6122057d60c0 100644
|
|
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
|
|
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
|
|
@@ -1070,7 +1070,7 @@ void mvpp2_cls_oversize_rxq_set(struct mvpp2_port *port)
|
|
(port->first_rxq >> MVPP2_CLS_OVERSIZE_RXQ_LOW_BITS));
|
|
|
|
val = mvpp2_read(port->priv, MVPP2_CLS_SWFWD_PCTRL_REG);
|
|
- val |= MVPP2_CLS_SWFWD_PCTRL_MASK(port->id);
|
|
+ val &= ~MVPP2_CLS_SWFWD_PCTRL_MASK(port->id);
|
|
mvpp2_write(port->priv, MVPP2_CLS_SWFWD_PCTRL_REG, val);
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
|
|
index 6e501af0e532..f6ff9620a137 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
|
|
@@ -2734,7 +2734,7 @@ void mlx4_opreq_action(struct work_struct *work)
|
|
if (err) {
|
|
mlx4_err(dev, "Failed to retrieve required operation: %d\n",
|
|
err);
|
|
- return;
|
|
+ goto out;
|
|
}
|
|
MLX4_GET(modifier, outbox, GET_OP_REQ_MODIFIER_OFFSET);
|
|
MLX4_GET(token, outbox, GET_OP_REQ_TOKEN_OFFSET);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
|
|
index 08048a2d7259..b6a3370068f1 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
|
|
@@ -861,6 +861,7 @@ static void cmd_work_handler(struct work_struct *work)
|
|
int alloc_ret;
|
|
int cmd_mode;
|
|
|
|
+ complete(&ent->handling);
|
|
sem = ent->page_queue ? &cmd->pages_sem : &cmd->sem;
|
|
down(sem);
|
|
if (!ent->page_queue) {
|
|
@@ -978,6 +979,11 @@ static int wait_func(struct mlx5_core_dev *dev, struct mlx5_cmd_work_ent *ent)
|
|
struct mlx5_cmd *cmd = &dev->cmd;
|
|
int err;
|
|
|
|
+ if (!wait_for_completion_timeout(&ent->handling, timeout) &&
|
|
+ cancel_work_sync(&ent->work)) {
|
|
+ ent->ret = -ECANCELED;
|
|
+ goto out_err;
|
|
+ }
|
|
if (cmd->mode == CMD_MODE_POLLING || ent->polling) {
|
|
wait_for_completion(&ent->done);
|
|
} else if (!wait_for_completion_timeout(&ent->done, timeout)) {
|
|
@@ -985,12 +991,17 @@ static int wait_func(struct mlx5_core_dev *dev, struct mlx5_cmd_work_ent *ent)
|
|
mlx5_cmd_comp_handler(dev, 1UL << ent->idx, true);
|
|
}
|
|
|
|
+out_err:
|
|
err = ent->ret;
|
|
|
|
if (err == -ETIMEDOUT) {
|
|
mlx5_core_warn(dev, "%s(0x%x) timeout. Will cause a leak of a command resource\n",
|
|
mlx5_command_str(msg_to_opcode(ent->in)),
|
|
msg_to_opcode(ent->in));
|
|
+ } else if (err == -ECANCELED) {
|
|
+ mlx5_core_warn(dev, "%s(0x%x) canceled on out of queue timeout.\n",
|
|
+ mlx5_command_str(msg_to_opcode(ent->in)),
|
|
+ msg_to_opcode(ent->in));
|
|
}
|
|
mlx5_core_dbg(dev, "err %d, delivery status %s(%d)\n",
|
|
err, deliv_status_to_str(ent->status), ent->status);
|
|
@@ -1026,6 +1037,7 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in,
|
|
ent->token = token;
|
|
ent->polling = force_polling;
|
|
|
|
+ init_completion(&ent->handling);
|
|
if (!callback)
|
|
init_completion(&ent->done);
|
|
|
|
@@ -1045,6 +1057,8 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in,
|
|
err = wait_func(dev, ent);
|
|
if (err == -ETIMEDOUT)
|
|
goto out;
|
|
+ if (err == -ECANCELED)
|
|
+ goto out_free;
|
|
|
|
ds = ent->ts2 - ent->ts1;
|
|
op = MLX5_GET(mbox_in, in->first.data, opcode);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
|
|
index 38aa55638bbe..98304c42e495 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
|
|
@@ -1103,7 +1103,7 @@ void mlx5e_close_drop_rq(struct mlx5e_rq *drop_rq);
|
|
int mlx5e_create_indirect_rqt(struct mlx5e_priv *priv);
|
|
|
|
int mlx5e_create_indirect_tirs(struct mlx5e_priv *priv, bool inner_ttc);
|
|
-void mlx5e_destroy_indirect_tirs(struct mlx5e_priv *priv, bool inner_ttc);
|
|
+void mlx5e_destroy_indirect_tirs(struct mlx5e_priv *priv);
|
|
|
|
int mlx5e_create_direct_rqts(struct mlx5e_priv *priv, struct mlx5e_tir *tirs);
|
|
void mlx5e_destroy_direct_rqts(struct mlx5e_priv *priv, struct mlx5e_tir *tirs);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c
|
|
index 46725cd743a3..7d1985fa0d4f 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls.c
|
|
@@ -69,8 +69,8 @@ static void mlx5e_ktls_del(struct net_device *netdev,
|
|
struct mlx5e_ktls_offload_context_tx *tx_priv =
|
|
mlx5e_get_ktls_tx_priv_ctx(tls_ctx);
|
|
|
|
- mlx5_ktls_destroy_key(priv->mdev, tx_priv->key_id);
|
|
mlx5e_destroy_tis(priv->mdev, tx_priv->tisn);
|
|
+ mlx5_ktls_destroy_key(priv->mdev, tx_priv->key_id);
|
|
kvfree(tx_priv);
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
index 0e340893ca00..c133beb6a7a5 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
@@ -2758,7 +2758,8 @@ void mlx5e_modify_tirs_hash(struct mlx5e_priv *priv, void *in, int inlen)
|
|
mlx5_core_modify_tir(mdev, priv->indir_tir[tt].tirn, in, inlen);
|
|
}
|
|
|
|
- if (!mlx5e_tunnel_inner_ft_supported(priv->mdev))
|
|
+ /* Verify inner tirs resources allocated */
|
|
+ if (!priv->inner_indir_tir[0].tirn)
|
|
return;
|
|
|
|
for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++) {
|
|
@@ -3405,14 +3406,15 @@ out:
|
|
return err;
|
|
}
|
|
|
|
-void mlx5e_destroy_indirect_tirs(struct mlx5e_priv *priv, bool inner_ttc)
|
|
+void mlx5e_destroy_indirect_tirs(struct mlx5e_priv *priv)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < MLX5E_NUM_INDIR_TIRS; i++)
|
|
mlx5e_destroy_tir(priv->mdev, &priv->indir_tir[i]);
|
|
|
|
- if (!inner_ttc || !mlx5e_tunnel_inner_ft_supported(priv->mdev))
|
|
+ /* Verify inner tirs resources allocated */
|
|
+ if (!priv->inner_indir_tir[0].tirn)
|
|
return;
|
|
|
|
for (i = 0; i < MLX5E_NUM_INDIR_TIRS; i++)
|
|
@@ -5119,7 +5121,7 @@ err_destroy_xsk_rqts:
|
|
err_destroy_direct_tirs:
|
|
mlx5e_destroy_direct_tirs(priv, priv->direct_tir);
|
|
err_destroy_indirect_tirs:
|
|
- mlx5e_destroy_indirect_tirs(priv, true);
|
|
+ mlx5e_destroy_indirect_tirs(priv);
|
|
err_destroy_direct_rqts:
|
|
mlx5e_destroy_direct_rqts(priv, priv->direct_tir);
|
|
err_destroy_indirect_rqts:
|
|
@@ -5138,7 +5140,7 @@ static void mlx5e_cleanup_nic_rx(struct mlx5e_priv *priv)
|
|
mlx5e_destroy_direct_tirs(priv, priv->xsk_tir);
|
|
mlx5e_destroy_direct_rqts(priv, priv->xsk_tir);
|
|
mlx5e_destroy_direct_tirs(priv, priv->direct_tir);
|
|
- mlx5e_destroy_indirect_tirs(priv, true);
|
|
+ mlx5e_destroy_indirect_tirs(priv);
|
|
mlx5e_destroy_direct_rqts(priv, priv->direct_tir);
|
|
mlx5e_destroy_rqt(priv, &priv->indir_rqt);
|
|
mlx5e_close_drop_rq(&priv->drop_rq);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
|
|
index fddf644ba349..9b232ef36d53 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
|
|
@@ -1597,7 +1597,7 @@ err_destroy_ttc_table:
|
|
err_destroy_direct_tirs:
|
|
mlx5e_destroy_direct_tirs(priv, priv->direct_tir);
|
|
err_destroy_indirect_tirs:
|
|
- mlx5e_destroy_indirect_tirs(priv, false);
|
|
+ mlx5e_destroy_indirect_tirs(priv);
|
|
err_destroy_direct_rqts:
|
|
mlx5e_destroy_direct_rqts(priv, priv->direct_tir);
|
|
err_destroy_indirect_rqts:
|
|
@@ -1614,7 +1614,7 @@ static void mlx5e_cleanup_rep_rx(struct mlx5e_priv *priv)
|
|
mlx5_del_flow_rules(rpriv->vport_rx_rule);
|
|
mlx5e_destroy_ttc_table(priv, &priv->fs.ttc);
|
|
mlx5e_destroy_direct_tirs(priv, priv->direct_tir);
|
|
- mlx5e_destroy_indirect_tirs(priv, false);
|
|
+ mlx5e_destroy_indirect_tirs(priv);
|
|
mlx5e_destroy_direct_rqts(priv, priv->direct_tir);
|
|
mlx5e_destroy_rqt(priv, &priv->indir_rqt);
|
|
mlx5e_close_drop_rq(&priv->drop_rq);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
|
|
index dee12f17f9c2..d9e0fc146741 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
|
|
@@ -537,10 +537,9 @@ bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget)
|
|
void mlx5e_free_txqsq_descs(struct mlx5e_txqsq *sq)
|
|
{
|
|
struct mlx5e_tx_wqe_info *wi;
|
|
+ u32 dma_fifo_cc, nbytes = 0;
|
|
+ u16 ci, sqcc, npkts = 0;
|
|
struct sk_buff *skb;
|
|
- u32 dma_fifo_cc;
|
|
- u16 sqcc;
|
|
- u16 ci;
|
|
int i;
|
|
|
|
sqcc = sq->cc;
|
|
@@ -565,11 +564,15 @@ void mlx5e_free_txqsq_descs(struct mlx5e_txqsq *sq)
|
|
}
|
|
|
|
dev_kfree_skb_any(skb);
|
|
+ npkts++;
|
|
+ nbytes += wi->num_bytes;
|
|
sqcc += wi->num_wqebbs;
|
|
}
|
|
|
|
sq->dma_fifo_cc = dma_fifo_cc;
|
|
sq->cc = sqcc;
|
|
+
|
|
+ netdev_tx_completed_queue(sq->txq, npkts, nbytes);
|
|
}
|
|
|
|
#ifdef CONFIG_MLX5_CORE_IPOIB
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/events.c b/drivers/net/ethernet/mellanox/mlx5/core/events.c
|
|
index 8bcf3426b9c6..3ce17c3d7a00 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/events.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/events.c
|
|
@@ -346,8 +346,10 @@ int mlx5_events_init(struct mlx5_core_dev *dev)
|
|
events->dev = dev;
|
|
dev->priv.events = events;
|
|
events->wq = create_singlethread_workqueue("mlx5_events");
|
|
- if (!events->wq)
|
|
+ if (!events->wq) {
|
|
+ kfree(events);
|
|
return -ENOMEM;
|
|
+ }
|
|
INIT_WORK(&events->pcie_core_work, mlx5_pcie_event);
|
|
|
|
return 0;
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
|
index 86e6bbb57482..8d9aab45fd8e 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
|
@@ -417,6 +417,12 @@ static void del_sw_ns(struct fs_node *node)
|
|
|
|
static void del_sw_prio(struct fs_node *node)
|
|
{
|
|
+ struct mlx5_flow_root_namespace *root_ns;
|
|
+ struct mlx5_flow_namespace *ns;
|
|
+
|
|
+ fs_get_obj(ns, node);
|
|
+ root_ns = container_of(ns, struct mlx5_flow_root_namespace, ns);
|
|
+ mutex_destroy(&root_ns->chain_lock);
|
|
kfree(node);
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
|
|
index 3ed8ab2d703d..0fed2419623d 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
|
|
@@ -396,7 +396,7 @@ static int mlx5i_init_rx(struct mlx5e_priv *priv)
|
|
err_destroy_direct_tirs:
|
|
mlx5e_destroy_direct_tirs(priv, priv->direct_tir);
|
|
err_destroy_indirect_tirs:
|
|
- mlx5e_destroy_indirect_tirs(priv, true);
|
|
+ mlx5e_destroy_indirect_tirs(priv);
|
|
err_destroy_direct_rqts:
|
|
mlx5e_destroy_direct_rqts(priv, priv->direct_tir);
|
|
err_destroy_indirect_rqts:
|
|
@@ -412,7 +412,7 @@ static void mlx5i_cleanup_rx(struct mlx5e_priv *priv)
|
|
{
|
|
mlx5i_destroy_flow_steering(priv);
|
|
mlx5e_destroy_direct_tirs(priv, priv->direct_tir);
|
|
- mlx5e_destroy_indirect_tirs(priv, true);
|
|
+ mlx5e_destroy_indirect_tirs(priv);
|
|
mlx5e_destroy_direct_rqts(priv, priv->direct_tir);
|
|
mlx5e_destroy_rqt(priv, &priv->indir_rqt);
|
|
mlx5e_close_drop_rq(&priv->drop_rq);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
|
|
index c96a0e501007..7dcdda9ca351 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
|
|
@@ -1183,7 +1183,7 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, bool boot)
|
|
|
|
err = mlx5_function_setup(dev, boot);
|
|
if (err)
|
|
- goto out;
|
|
+ goto err_function;
|
|
|
|
if (boot) {
|
|
err = mlx5_init_once(dev);
|
|
@@ -1229,6 +1229,7 @@ err_load:
|
|
mlx5_cleanup_once(dev);
|
|
function_teardown:
|
|
mlx5_function_teardown(dev, boot);
|
|
+err_function:
|
|
dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR;
|
|
mutex_unlock(&dev->intf_state_mutex);
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
|
|
index a806c6190bb1..6a432bb93dbb 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
|
|
@@ -3932,6 +3932,7 @@ static void mlxsw_sp_ports_remove(struct mlxsw_sp *mlxsw_sp)
|
|
mlxsw_sp_cpu_port_remove(mlxsw_sp);
|
|
kfree(mlxsw_sp->port_to_module);
|
|
kfree(mlxsw_sp->ports);
|
|
+ mlxsw_sp->ports = NULL;
|
|
}
|
|
|
|
static int mlxsw_sp_ports_create(struct mlxsw_sp *mlxsw_sp)
|
|
@@ -3986,6 +3987,7 @@ err_cpu_port_create:
|
|
kfree(mlxsw_sp->port_to_module);
|
|
err_port_to_module_alloc:
|
|
kfree(mlxsw_sp->ports);
|
|
+ mlxsw_sp->ports = NULL;
|
|
return err;
|
|
}
|
|
|
|
@@ -4040,6 +4042,14 @@ static void mlxsw_sp_port_unsplit_create(struct mlxsw_sp *mlxsw_sp,
|
|
}
|
|
}
|
|
|
|
+static struct mlxsw_sp_port *
|
|
+mlxsw_sp_port_get_by_local_port(struct mlxsw_sp *mlxsw_sp, u8 local_port)
|
|
+{
|
|
+ if (mlxsw_sp->ports && mlxsw_sp->ports[local_port])
|
|
+ return mlxsw_sp->ports[local_port];
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port,
|
|
unsigned int count,
|
|
struct netlink_ext_ack *extack)
|
|
@@ -4058,7 +4068,7 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port,
|
|
local_ports_in_1x = MLXSW_CORE_RES_GET(mlxsw_core, LOCAL_PORTS_IN_1X);
|
|
local_ports_in_2x = MLXSW_CORE_RES_GET(mlxsw_core, LOCAL_PORTS_IN_2X);
|
|
|
|
- mlxsw_sp_port = mlxsw_sp->ports[local_port];
|
|
+ mlxsw_sp_port = mlxsw_sp_port_get_by_local_port(mlxsw_sp, local_port);
|
|
if (!mlxsw_sp_port) {
|
|
dev_err(mlxsw_sp->bus_info->dev, "Port number \"%d\" does not exist\n",
|
|
local_port);
|
|
@@ -4136,7 +4146,7 @@ static int mlxsw_sp_port_unsplit(struct mlxsw_core *mlxsw_core, u8 local_port,
|
|
local_ports_in_1x = MLXSW_CORE_RES_GET(mlxsw_core, LOCAL_PORTS_IN_1X);
|
|
local_ports_in_2x = MLXSW_CORE_RES_GET(mlxsw_core, LOCAL_PORTS_IN_2X);
|
|
|
|
- mlxsw_sp_port = mlxsw_sp->ports[local_port];
|
|
+ mlxsw_sp_port = mlxsw_sp_port_get_by_local_port(mlxsw_sp, local_port);
|
|
if (!mlxsw_sp_port) {
|
|
dev_err(mlxsw_sp->bus_info->dev, "Port number \"%d\" does not exist\n",
|
|
local_port);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
|
|
index 63e7a058b7c6..059cc1600890 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
|
|
@@ -1258,6 +1258,7 @@ static void mlxsw_sx_ports_remove(struct mlxsw_sx *mlxsw_sx)
|
|
if (mlxsw_sx_port_created(mlxsw_sx, i))
|
|
mlxsw_sx_port_remove(mlxsw_sx, i);
|
|
kfree(mlxsw_sx->ports);
|
|
+ mlxsw_sx->ports = NULL;
|
|
}
|
|
|
|
static int mlxsw_sx_ports_create(struct mlxsw_sx *mlxsw_sx)
|
|
@@ -1292,6 +1293,7 @@ err_port_module_info_get:
|
|
if (mlxsw_sx_port_created(mlxsw_sx, i))
|
|
mlxsw_sx_port_remove(mlxsw_sx, i);
|
|
kfree(mlxsw_sx->ports);
|
|
+ mlxsw_sx->ports = NULL;
|
|
return err;
|
|
}
|
|
|
|
@@ -1375,6 +1377,12 @@ static int mlxsw_sx_port_type_set(struct mlxsw_core *mlxsw_core, u8 local_port,
|
|
u8 module, width;
|
|
int err;
|
|
|
|
+ if (!mlxsw_sx->ports || !mlxsw_sx->ports[local_port]) {
|
|
+ dev_err(mlxsw_sx->bus_info->dev, "Port number \"%d\" does not exist\n",
|
|
+ local_port);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
if (new_type == DEVLINK_PORT_TYPE_AUTO)
|
|
return -EOPNOTSUPP;
|
|
|
|
diff --git a/drivers/net/ethernet/microchip/encx24j600.c b/drivers/net/ethernet/microchip/encx24j600.c
|
|
index 52c41d11f565..c3a6edc0ddf6 100644
|
|
--- a/drivers/net/ethernet/microchip/encx24j600.c
|
|
+++ b/drivers/net/ethernet/microchip/encx24j600.c
|
|
@@ -1070,7 +1070,7 @@ static int encx24j600_spi_probe(struct spi_device *spi)
|
|
if (unlikely(ret)) {
|
|
netif_err(priv, probe, ndev, "Error %d initializing card encx24j600 card\n",
|
|
ret);
|
|
- goto out_free;
|
|
+ goto out_stop;
|
|
}
|
|
|
|
eidled = encx24j600_read_reg(priv, EIDLED);
|
|
@@ -1088,6 +1088,8 @@ static int encx24j600_spi_probe(struct spi_device *spi)
|
|
|
|
out_unregister:
|
|
unregister_netdev(priv->ndev);
|
|
+out_stop:
|
|
+ kthread_stop(priv->kworker_task);
|
|
out_free:
|
|
free_netdev(ndev);
|
|
|
|
@@ -1100,6 +1102,7 @@ static int encx24j600_spi_remove(struct spi_device *spi)
|
|
struct encx24j600_priv *priv = dev_get_drvdata(&spi->dev);
|
|
|
|
unregister_netdev(priv->ndev);
|
|
+ kthread_stop(priv->kworker_task);
|
|
|
|
free_netdev(priv->ndev);
|
|
|
|
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
|
|
index 2a533280b124..29b9c728a65e 100644
|
|
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
|
|
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
|
|
@@ -3651,7 +3651,7 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
|
|
ahw->diag_cnt = 0;
|
|
ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST);
|
|
if (ret)
|
|
- goto fail_diag_irq;
|
|
+ goto fail_mbx_args;
|
|
|
|
if (adapter->flags & QLCNIC_MSIX_ENABLED)
|
|
intrpt_id = ahw->intr_tbl[0].id;
|
|
@@ -3681,6 +3681,8 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
|
|
|
|
done:
|
|
qlcnic_free_mbx_args(&cmd);
|
|
+
|
|
+fail_mbx_args:
|
|
qlcnic_83xx_diag_free_res(netdev, drv_sds_rings);
|
|
|
|
fail_diag_irq:
|
|
diff --git a/drivers/net/ethernet/sun/cassini.c b/drivers/net/ethernet/sun/cassini.c
|
|
index c91876f8c536..6e78a33aa5e4 100644
|
|
--- a/drivers/net/ethernet/sun/cassini.c
|
|
+++ b/drivers/net/ethernet/sun/cassini.c
|
|
@@ -4971,7 +4971,7 @@ static int cas_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
cas_cacheline_size)) {
|
|
dev_err(&pdev->dev, "Could not set PCI cache "
|
|
"line size\n");
|
|
- goto err_write_cacheline;
|
|
+ goto err_out_free_res;
|
|
}
|
|
}
|
|
#endif
|
|
@@ -5144,7 +5144,6 @@ err_out_iounmap:
|
|
err_out_free_res:
|
|
pci_release_regions(pdev);
|
|
|
|
-err_write_cacheline:
|
|
/* Try to restore it in case the error occurred after we
|
|
* set it.
|
|
*/
|
|
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
|
|
index d7a953c647b4..39df8c8feb6c 100644
|
|
--- a/drivers/net/ethernet/ti/cpsw.c
|
|
+++ b/drivers/net/ethernet/ti/cpsw.c
|
|
@@ -2999,11 +2999,15 @@ static int cpsw_suspend(struct device *dev)
|
|
struct cpsw_common *cpsw = dev_get_drvdata(dev);
|
|
int i;
|
|
|
|
+ rtnl_lock();
|
|
+
|
|
for (i = 0; i < cpsw->data.slaves; i++)
|
|
if (cpsw->slaves[i].ndev)
|
|
if (netif_running(cpsw->slaves[i].ndev))
|
|
cpsw_ndo_stop(cpsw->slaves[i].ndev);
|
|
|
|
+ rtnl_unlock();
|
|
+
|
|
/* Select sleep pin state */
|
|
pinctrl_pm_select_sleep_state(dev);
|
|
|
|
diff --git a/drivers/net/hamradio/bpqether.c b/drivers/net/hamradio/bpqether.c
|
|
index fbea6f232819..e2ad3c2e8df5 100644
|
|
--- a/drivers/net/hamradio/bpqether.c
|
|
+++ b/drivers/net/hamradio/bpqether.c
|
|
@@ -127,7 +127,8 @@ static inline struct net_device *bpq_get_ax25_dev(struct net_device *dev)
|
|
{
|
|
struct bpqdev *bpq;
|
|
|
|
- list_for_each_entry_rcu(bpq, &bpq_devices, bpq_list) {
|
|
+ list_for_each_entry_rcu(bpq, &bpq_devices, bpq_list,
|
|
+ lockdep_rtnl_is_held()) {
|
|
if (bpq->ethdev == dev)
|
|
return bpq->axdev;
|
|
}
|
|
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
|
|
index fe630438f67b..9bb37ac99a10 100644
|
|
--- a/drivers/net/usb/cdc_ether.c
|
|
+++ b/drivers/net/usb/cdc_ether.c
|
|
@@ -808,14 +808,21 @@ static const struct usb_device_id products[] = {
|
|
.driver_info = 0,
|
|
},
|
|
|
|
-/* Microsoft Surface 3 dock (based on Realtek RTL8153) */
|
|
+/* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153) */
|
|
{
|
|
USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM,
|
|
USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
|
.driver_info = 0,
|
|
},
|
|
|
|
- /* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
|
+/* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153B) */
|
|
+{
|
|
+ USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x0927, USB_CLASS_COMM,
|
|
+ USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
|
+ .driver_info = 0,
|
|
+},
|
|
+
|
|
+/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
|
{
|
|
USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM,
|
|
USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
|
diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
|
|
index 73a852b2f417..34eec26b0c1f 100644
|
|
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
|
|
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
|
|
@@ -258,7 +258,9 @@ int cmdq_pkt_flush_async(struct cmdq_pkt *pkt, cmdq_async_flush_cb cb,
|
|
spin_unlock_irqrestore(&client->lock, flags);
|
|
}
|
|
|
|
- mbox_send_message(client->chan, pkt);
|
|
+ err = mbox_send_message(client->chan, pkt);
|
|
+ if (err < 0)
|
|
+ return err;
|
|
/* We can send next packet immediately, so just call txdone. */
|
|
mbox_client_txdone(client->chan, 0);
|
|
|
|
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
|
|
index 7051611229c9..b67372737dc9 100644
|
|
--- a/drivers/usb/dwc3/dwc3-pci.c
|
|
+++ b/drivers/usb/dwc3/dwc3-pci.c
|
|
@@ -114,6 +114,7 @@ static const struct property_entry dwc3_pci_intel_properties[] = {
|
|
|
|
static const struct property_entry dwc3_pci_mrfld_properties[] = {
|
|
PROPERTY_ENTRY_STRING("dr_mode", "otg"),
|
|
+ PROPERTY_ENTRY_STRING("linux,extcon-name", "mrfld_bcove_pwrsrc"),
|
|
PROPERTY_ENTRY_BOOL("linux,sysdev_is_parent"),
|
|
{}
|
|
};
|
|
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c
|
|
index b47938dff1a2..238f555fe494 100644
|
|
--- a/drivers/usb/gadget/legacy/inode.c
|
|
+++ b/drivers/usb/gadget/legacy/inode.c
|
|
@@ -1361,7 +1361,6 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
|
|
|
|
req->buf = dev->rbuf;
|
|
req->context = NULL;
|
|
- value = -EOPNOTSUPP;
|
|
switch (ctrl->bRequest) {
|
|
|
|
case USB_REQ_GET_DESCRIPTOR:
|
|
@@ -1784,7 +1783,7 @@ static ssize_t
|
|
dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
|
{
|
|
struct dev_data *dev = fd->private_data;
|
|
- ssize_t value = len, length = len;
|
|
+ ssize_t value, length = len;
|
|
unsigned total;
|
|
u32 tag;
|
|
char *kbuf;
|
|
diff --git a/drivers/usb/phy/phy-twl6030-usb.c b/drivers/usb/phy/phy-twl6030-usb.c
|
|
index bfebf1f2e991..9a7e655d5280 100644
|
|
--- a/drivers/usb/phy/phy-twl6030-usb.c
|
|
+++ b/drivers/usb/phy/phy-twl6030-usb.c
|
|
@@ -377,7 +377,7 @@ static int twl6030_usb_probe(struct platform_device *pdev)
|
|
if (status < 0) {
|
|
dev_err(&pdev->dev, "can't get IRQ %d, err %d\n",
|
|
twl->irq1, status);
|
|
- return status;
|
|
+ goto err_put_regulator;
|
|
}
|
|
|
|
status = request_threaded_irq(twl->irq2, NULL, twl6030_usb_irq,
|
|
@@ -386,8 +386,7 @@ static int twl6030_usb_probe(struct platform_device *pdev)
|
|
if (status < 0) {
|
|
dev_err(&pdev->dev, "can't get IRQ %d, err %d\n",
|
|
twl->irq2, status);
|
|
- free_irq(twl->irq1, twl);
|
|
- return status;
|
|
+ goto err_free_irq1;
|
|
}
|
|
|
|
twl->asleep = 0;
|
|
@@ -396,6 +395,13 @@ static int twl6030_usb_probe(struct platform_device *pdev)
|
|
dev_info(&pdev->dev, "Initialized TWL6030 USB module\n");
|
|
|
|
return 0;
|
|
+
|
|
+err_free_irq1:
|
|
+ free_irq(twl->irq1, twl);
|
|
+err_put_regulator:
|
|
+ regulator_put(twl->usb3v3);
|
|
+
|
|
+ return status;
|
|
}
|
|
|
|
static int twl6030_usb_remove(struct platform_device *pdev)
|
|
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
|
|
index c5642bcb6b46..7ce3cfd965d2 100644
|
|
--- a/fs/binfmt_elf.c
|
|
+++ b/fs/binfmt_elf.c
|
|
@@ -1731,7 +1731,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t,
|
|
(!regset->active || regset->active(t->task, regset) > 0)) {
|
|
int ret;
|
|
size_t size = regset_size(t->task, regset);
|
|
- void *data = kmalloc(size, GFP_KERNEL);
|
|
+ void *data = kzalloc(size, GFP_KERNEL);
|
|
if (unlikely(!data))
|
|
return 0;
|
|
ret = regset->get(t->task, regset,
|
|
diff --git a/fs/cachefiles/rdwr.c b/fs/cachefiles/rdwr.c
|
|
index 44a3ce1e4ce4..ad057ed2b30b 100644
|
|
--- a/fs/cachefiles/rdwr.c
|
|
+++ b/fs/cachefiles/rdwr.c
|
|
@@ -60,9 +60,9 @@ static int cachefiles_read_waiter(wait_queue_entry_t *wait, unsigned mode,
|
|
object = container_of(op->op.object, struct cachefiles_object, fscache);
|
|
spin_lock(&object->work_lock);
|
|
list_add_tail(&monitor->op_link, &op->to_do);
|
|
+ fscache_enqueue_retrieval(op);
|
|
spin_unlock(&object->work_lock);
|
|
|
|
- fscache_enqueue_retrieval(op);
|
|
fscache_put_retrieval(op);
|
|
return 0;
|
|
}
|
|
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
|
|
index 2d602c2b0ff6..b2695919435e 100644
|
|
--- a/fs/ceph/caps.c
|
|
+++ b/fs/ceph/caps.c
|
|
@@ -3938,7 +3938,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
|
|
__ceph_queue_cap_release(session, cap);
|
|
spin_unlock(&session->s_cap_lock);
|
|
}
|
|
- goto done;
|
|
+ goto flush_cap_releases;
|
|
}
|
|
|
|
/* these will work even if we don't have a cap yet */
|
|
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
|
|
index b095094c0842..4959dbe740f7 100644
|
|
--- a/fs/cifs/file.c
|
|
+++ b/fs/cifs/file.c
|
|
@@ -3997,7 +3997,7 @@ cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *offset)
|
|
* than it negotiated since it will refuse the read
|
|
* then.
|
|
*/
|
|
- if ((tcon->ses) && !(tcon->ses->capabilities &
|
|
+ if (!(tcon->ses->capabilities &
|
|
tcon->ses->server->vals->cap_large_files)) {
|
|
current_read_size = min_t(uint,
|
|
current_read_size, CIFSMaxBufSize);
|
|
diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
|
|
index 47bc27d4169e..110e5c4db819 100644
|
|
--- a/fs/gfs2/log.c
|
|
+++ b/fs/gfs2/log.c
|
|
@@ -598,13 +598,13 @@ void gfs2_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)
|
|
struct buffer_head *bh = bd->bd_bh;
|
|
struct gfs2_glock *gl = bd->bd_gl;
|
|
|
|
+ sdp->sd_log_num_revoke++;
|
|
+ if (atomic_inc_return(&gl->gl_revokes) == 1)
|
|
+ gfs2_glock_hold(gl);
|
|
bh->b_private = NULL;
|
|
bd->bd_blkno = bh->b_blocknr;
|
|
gfs2_remove_from_ail(bd); /* drops ref on bh */
|
|
bd->bd_bh = NULL;
|
|
- sdp->sd_log_num_revoke++;
|
|
- if (atomic_inc_return(&gl->gl_revokes) == 1)
|
|
- gfs2_glock_hold(gl);
|
|
set_bit(GLF_LFLUSH, &gl->gl_flags);
|
|
list_add(&bd->bd_list, &sdp->sd_log_revokes);
|
|
}
|
|
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
|
|
index 7c016a082aa6..cbee745169b8 100644
|
|
--- a/fs/gfs2/quota.c
|
|
+++ b/fs/gfs2/quota.c
|
|
@@ -1040,8 +1040,7 @@ int gfs2_quota_lock(struct gfs2_inode *ip, kuid_t uid, kgid_t gid)
|
|
u32 x;
|
|
int error = 0;
|
|
|
|
- if (capable(CAP_SYS_RESOURCE) ||
|
|
- sdp->sd_args.ar_quota != GFS2_QUOTA_ON)
|
|
+ if (sdp->sd_args.ar_quota != GFS2_QUOTA_ON)
|
|
return 0;
|
|
|
|
error = gfs2_quota_hold(ip, uid, gid);
|
|
diff --git a/fs/gfs2/quota.h b/fs/gfs2/quota.h
|
|
index 765627d9a91e..fe68a91dc16f 100644
|
|
--- a/fs/gfs2/quota.h
|
|
+++ b/fs/gfs2/quota.h
|
|
@@ -44,7 +44,8 @@ static inline int gfs2_quota_lock_check(struct gfs2_inode *ip,
|
|
int ret;
|
|
|
|
ap->allowed = UINT_MAX; /* Assume we are permitted a whole lot */
|
|
- if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF)
|
|
+ if (capable(CAP_SYS_RESOURCE) ||
|
|
+ sdp->sd_args.ar_quota == GFS2_QUOTA_OFF)
|
|
return 0;
|
|
ret = gfs2_quota_lock(ip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE);
|
|
if (ret)
|
|
diff --git a/include/asm-generic/topology.h b/include/asm-generic/topology.h
|
|
index 238873739550..5aa8705df87e 100644
|
|
--- a/include/asm-generic/topology.h
|
|
+++ b/include/asm-generic/topology.h
|
|
@@ -48,7 +48,7 @@
|
|
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
|
#define cpumask_of_node(node) ((node) == 0 ? cpu_online_mask : cpu_none_mask)
|
|
#else
|
|
- #define cpumask_of_node(node) ((void)node, cpu_online_mask)
|
|
+ #define cpumask_of_node(node) ((void)(node), cpu_online_mask)
|
|
#endif
|
|
#endif
|
|
#ifndef pcibus_to_node
|
|
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
|
|
index 7f3486e32e5d..624d2643bfba 100644
|
|
--- a/include/linux/ieee80211.h
|
|
+++ b/include/linux/ieee80211.h
|
|
@@ -2047,7 +2047,7 @@ ieee80211_he_ppe_size(u8 ppe_thres_hdr, const u8 *phy_cap_info)
|
|
}
|
|
|
|
/* HE Operation defines */
|
|
-#define IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK 0x00000003
|
|
+#define IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK 0x00000007
|
|
#define IEEE80211_HE_OPERATION_TWT_REQUIRED 0x00000008
|
|
#define IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK 0x00003ff0
|
|
#define IEEE80211_HE_OPERATION_RTS_THRESHOLD_OFFSET 4
|
|
diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
|
|
index 3e80f03a387f..897829651204 100644
|
|
--- a/include/linux/mlx5/driver.h
|
|
+++ b/include/linux/mlx5/driver.h
|
|
@@ -756,6 +756,7 @@ struct mlx5_cmd_work_ent {
|
|
struct delayed_work cb_timeout_work;
|
|
void *context;
|
|
int idx;
|
|
+ struct completion handling;
|
|
struct completion done;
|
|
struct mlx5_cmd *cmd;
|
|
struct work_struct work;
|
|
diff --git a/include/linux/mm.h b/include/linux/mm.h
|
|
index afa77b683a04..53bad834adf5 100644
|
|
--- a/include/linux/mm.h
|
|
+++ b/include/linux/mm.h
|
|
@@ -695,6 +695,11 @@ static inline void *kvcalloc(size_t n, size_t size, gfp_t flags)
|
|
|
|
extern void kvfree(const void *addr);
|
|
|
|
+/*
|
|
+ * Mapcount of compound page as a whole, does not include mapped sub-pages.
|
|
+ *
|
|
+ * Must be called only for compound pages or any their tail sub-pages.
|
|
+ */
|
|
static inline int compound_mapcount(struct page *page)
|
|
{
|
|
VM_BUG_ON_PAGE(!PageCompound(page), page);
|
|
@@ -714,10 +719,16 @@ static inline void page_mapcount_reset(struct page *page)
|
|
|
|
int __page_mapcount(struct page *page);
|
|
|
|
+/*
|
|
+ * Mapcount of 0-order page; when compound sub-page, includes
|
|
+ * compound_mapcount().
|
|
+ *
|
|
+ * Result is undefined for pages which cannot be mapped into userspace.
|
|
+ * For example SLAB or special types of pages. See function page_has_type().
|
|
+ * They use this place in struct page differently.
|
|
+ */
|
|
static inline int page_mapcount(struct page *page)
|
|
{
|
|
- VM_BUG_ON_PAGE(PageSlab(page), page);
|
|
-
|
|
if (unlikely(PageCompound(page)))
|
|
return __page_mapcount(page);
|
|
return atomic_read(&page->_mapcount) + 1;
|
|
diff --git a/include/linux/netfilter/nf_conntrack_pptp.h b/include/linux/netfilter/nf_conntrack_pptp.h
|
|
index fcc409de31a4..a28aa289afdc 100644
|
|
--- a/include/linux/netfilter/nf_conntrack_pptp.h
|
|
+++ b/include/linux/netfilter/nf_conntrack_pptp.h
|
|
@@ -10,7 +10,7 @@
|
|
#include <net/netfilter/nf_conntrack_expect.h>
|
|
#include <uapi/linux/netfilter/nf_conntrack_tuple_common.h>
|
|
|
|
-extern const char *const pptp_msg_name[];
|
|
+const char *pptp_msg_name(u_int16_t msg);
|
|
|
|
/* state of the control session */
|
|
enum pptp_ctrlsess_state {
|
|
diff --git a/include/net/act_api.h b/include/net/act_api.h
|
|
index b18c699681ca..59d05feecfb8 100644
|
|
--- a/include/net/act_api.h
|
|
+++ b/include/net/act_api.h
|
|
@@ -69,7 +69,8 @@ static inline void tcf_tm_dump(struct tcf_t *dtm, const struct tcf_t *stm)
|
|
{
|
|
dtm->install = jiffies_to_clock_t(jiffies - stm->install);
|
|
dtm->lastuse = jiffies_to_clock_t(jiffies - stm->lastuse);
|
|
- dtm->firstuse = jiffies_to_clock_t(jiffies - stm->firstuse);
|
|
+ dtm->firstuse = stm->firstuse ?
|
|
+ jiffies_to_clock_t(jiffies - stm->firstuse) : 0;
|
|
dtm->expires = jiffies_to_clock_t(stm->expires);
|
|
}
|
|
|
|
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
|
|
index ab1ca9e238d2..ffbae7683450 100644
|
|
--- a/include/net/ip_fib.h
|
|
+++ b/include/net/ip_fib.h
|
|
@@ -244,7 +244,6 @@ struct fib_dump_filter {
|
|
u32 table_id;
|
|
/* filter_set is an optimization that an entry is set */
|
|
bool filter_set;
|
|
- bool dump_all_families;
|
|
bool dump_routes;
|
|
bool dump_exceptions;
|
|
unsigned char protocol;
|
|
@@ -423,6 +422,16 @@ static inline int fib_num_tclassid_users(struct net *net)
|
|
#endif
|
|
int fib_unmerge(struct net *net);
|
|
|
|
+static inline bool nhc_l3mdev_matches_dev(const struct fib_nh_common *nhc,
|
|
+const struct net_device *dev)
|
|
+{
|
|
+ if (nhc->nhc_dev == dev ||
|
|
+ l3mdev_master_ifindex_rcu(nhc->nhc_dev) == dev->ifindex)
|
|
+ return true;
|
|
+
|
|
+ return false;
|
|
+}
|
|
+
|
|
/* Exported by fib_semantics.c */
|
|
int ip_fib_check_default(__be32 gw, struct net_device *dev);
|
|
int fib_sync_down_dev(struct net_device *dev, unsigned long event, bool force);
|
|
diff --git a/include/net/nexthop.h b/include/net/nexthop.h
|
|
index 331ebbc94fe7..3bb618e5ecf7 100644
|
|
--- a/include/net/nexthop.h
|
|
+++ b/include/net/nexthop.h
|
|
@@ -70,6 +70,7 @@ struct nh_grp_entry {
|
|
};
|
|
|
|
struct nh_group {
|
|
+ struct nh_group *spare; /* spare group for removals */
|
|
u16 num_nh;
|
|
bool mpath;
|
|
bool has_v4;
|
|
@@ -136,21 +137,20 @@ static inline unsigned int nexthop_num_path(const struct nexthop *nh)
|
|
{
|
|
unsigned int rc = 1;
|
|
|
|
- if (nexthop_is_multipath(nh)) {
|
|
+ if (nh->is_group) {
|
|
struct nh_group *nh_grp;
|
|
|
|
nh_grp = rcu_dereference_rtnl(nh->nh_grp);
|
|
- rc = nh_grp->num_nh;
|
|
+ if (nh_grp->mpath)
|
|
+ rc = nh_grp->num_nh;
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
|
|
static inline
|
|
-struct nexthop *nexthop_mpath_select(const struct nexthop *nh, int nhsel)
|
|
+struct nexthop *nexthop_mpath_select(const struct nh_group *nhg, int nhsel)
|
|
{
|
|
- const struct nh_group *nhg = rcu_dereference_rtnl(nh->nh_grp);
|
|
-
|
|
/* for_nexthops macros in fib_semantics.c grabs a pointer to
|
|
* the nexthop before checking nhsel
|
|
*/
|
|
@@ -185,12 +185,14 @@ static inline bool nexthop_is_blackhole(const struct nexthop *nh)
|
|
{
|
|
const struct nh_info *nhi;
|
|
|
|
- if (nexthop_is_multipath(nh)) {
|
|
- if (nexthop_num_path(nh) > 1)
|
|
- return false;
|
|
- nh = nexthop_mpath_select(nh, 0);
|
|
- if (!nh)
|
|
+ if (nh->is_group) {
|
|
+ struct nh_group *nh_grp;
|
|
+
|
|
+ nh_grp = rcu_dereference_rtnl(nh->nh_grp);
|
|
+ if (nh_grp->num_nh > 1)
|
|
return false;
|
|
+
|
|
+ nh = nh_grp->nh_entries[0].nh;
|
|
}
|
|
|
|
nhi = rcu_dereference_rtnl(nh->nh_info);
|
|
@@ -216,16 +218,46 @@ struct fib_nh_common *nexthop_fib_nhc(struct nexthop *nh, int nhsel)
|
|
BUILD_BUG_ON(offsetof(struct fib_nh, nh_common) != 0);
|
|
BUILD_BUG_ON(offsetof(struct fib6_nh, nh_common) != 0);
|
|
|
|
- if (nexthop_is_multipath(nh)) {
|
|
- nh = nexthop_mpath_select(nh, nhsel);
|
|
- if (!nh)
|
|
- return NULL;
|
|
+ if (nh->is_group) {
|
|
+ struct nh_group *nh_grp;
|
|
+
|
|
+ nh_grp = rcu_dereference_rtnl(nh->nh_grp);
|
|
+ if (nh_grp->mpath) {
|
|
+ nh = nexthop_mpath_select(nh_grp, nhsel);
|
|
+ if (!nh)
|
|
+ return NULL;
|
|
+ }
|
|
}
|
|
|
|
nhi = rcu_dereference_rtnl(nh->nh_info);
|
|
return &nhi->fib_nhc;
|
|
}
|
|
|
|
+static inline bool nexthop_uses_dev(const struct nexthop *nh,
|
|
+ const struct net_device *dev)
|
|
+{
|
|
+ struct nh_info *nhi;
|
|
+
|
|
+ if (nh->is_group) {
|
|
+ struct nh_group *nhg = rcu_dereference(nh->nh_grp);
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < nhg->num_nh; i++) {
|
|
+ struct nexthop *nhe = nhg->nh_entries[i].nh;
|
|
+
|
|
+ nhi = rcu_dereference(nhe->nh_info);
|
|
+ if (nhc_l3mdev_matches_dev(&nhi->fib_nhc, dev))
|
|
+ return true;
|
|
+ }
|
|
+ } else {
|
|
+ nhi = rcu_dereference(nh->nh_info);
|
|
+ if (nhc_l3mdev_matches_dev(&nhi->fib_nhc, dev))
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ return false;
|
|
+}
|
|
+
|
|
static inline unsigned int fib_info_num_path(const struct fib_info *fi)
|
|
{
|
|
if (unlikely(fi->nh))
|
|
@@ -263,8 +295,11 @@ static inline struct fib6_nh *nexthop_fib6_nh(struct nexthop *nh)
|
|
{
|
|
struct nh_info *nhi;
|
|
|
|
- if (nexthop_is_multipath(nh)) {
|
|
- nh = nexthop_mpath_select(nh, 0);
|
|
+ if (nh->is_group) {
|
|
+ struct nh_group *nh_grp;
|
|
+
|
|
+ nh_grp = rcu_dereference_rtnl(nh->nh_grp);
|
|
+ nh = nexthop_mpath_select(nh_grp, 0);
|
|
if (!nh)
|
|
return NULL;
|
|
}
|
|
diff --git a/include/net/tls.h b/include/net/tls.h
|
|
index 093abb5a3dff..db26e3ec918f 100644
|
|
--- a/include/net/tls.h
|
|
+++ b/include/net/tls.h
|
|
@@ -157,6 +157,8 @@ struct tls_sw_context_tx {
|
|
struct tls_rec *open_rec;
|
|
struct list_head tx_list;
|
|
atomic_t encrypt_pending;
|
|
+ /* protect crypto_wait with encrypt_pending */
|
|
+ spinlock_t encrypt_compl_lock;
|
|
int async_notify;
|
|
int async_capable;
|
|
|
|
@@ -177,6 +179,8 @@ struct tls_sw_context_rx {
|
|
int async_capable;
|
|
bool decrypted;
|
|
atomic_t decrypt_pending;
|
|
+ /* protect crypto_wait with decrypt_pending*/
|
|
+ spinlock_t decrypt_compl_lock;
|
|
bool async_notify;
|
|
};
|
|
|
|
diff --git a/include/rdma/uverbs_std_types.h b/include/rdma/uverbs_std_types.h
|
|
index 05eabfd5d0d3..9f382e7d4579 100644
|
|
--- a/include/rdma/uverbs_std_types.h
|
|
+++ b/include/rdma/uverbs_std_types.h
|
|
@@ -88,7 +88,7 @@ struct ib_uobject *__uobj_get_destroy(const struct uverbs_api_object *obj,
|
|
|
|
static inline void uobj_put_destroy(struct ib_uobject *uobj)
|
|
{
|
|
- rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE);
|
|
+ rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_DESTROY);
|
|
}
|
|
|
|
static inline void uobj_put_read(struct ib_uobject *uobj)
|
|
diff --git a/include/uapi/linux/xfrm.h b/include/uapi/linux/xfrm.h
|
|
index 5f3b9fec7b5f..ff7cfdc6cb44 100644
|
|
--- a/include/uapi/linux/xfrm.h
|
|
+++ b/include/uapi/linux/xfrm.h
|
|
@@ -304,7 +304,7 @@ enum xfrm_attr_type_t {
|
|
XFRMA_PROTO, /* __u8 */
|
|
XFRMA_ADDRESS_FILTER, /* struct xfrm_address_filter */
|
|
XFRMA_PAD,
|
|
- XFRMA_OFFLOAD_DEV, /* struct xfrm_state_offload */
|
|
+ XFRMA_OFFLOAD_DEV, /* struct xfrm_user_offload */
|
|
XFRMA_SET_MARK, /* __u32 */
|
|
XFRMA_SET_MARK_MASK, /* __u32 */
|
|
XFRMA_IF_ID, /* __u32 */
|
|
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
|
|
index a8a57bebb5fa..f765475be359 100644
|
|
--- a/mm/khugepaged.c
|
|
+++ b/mm/khugepaged.c
|
|
@@ -1655,6 +1655,7 @@ static void collapse_file(struct mm_struct *mm,
|
|
if (page_has_private(page) &&
|
|
!try_to_release_page(page, GFP_KERNEL)) {
|
|
result = SCAN_PAGE_HAS_PRIVATE;
|
|
+ putback_lru_page(page);
|
|
goto out_unlock;
|
|
}
|
|
|
|
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
|
|
index bb222b882b67..e5a3dc28116d 100644
|
|
--- a/net/ax25/af_ax25.c
|
|
+++ b/net/ax25/af_ax25.c
|
|
@@ -635,8 +635,10 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname,
|
|
break;
|
|
|
|
case SO_BINDTODEVICE:
|
|
- if (optlen > IFNAMSIZ)
|
|
- optlen = IFNAMSIZ;
|
|
+ if (optlen > IFNAMSIZ - 1)
|
|
+ optlen = IFNAMSIZ - 1;
|
|
+
|
|
+ memset(devname, 0, sizeof(devname));
|
|
|
|
if (copy_from_user(devname, optval, optlen)) {
|
|
res = -EFAULT;
|
|
diff --git a/net/bridge/netfilter/nft_reject_bridge.c b/net/bridge/netfilter/nft_reject_bridge.c
|
|
index b325b569e761..f48cf4cfb80f 100644
|
|
--- a/net/bridge/netfilter/nft_reject_bridge.c
|
|
+++ b/net/bridge/netfilter/nft_reject_bridge.c
|
|
@@ -31,6 +31,12 @@ static void nft_reject_br_push_etherhdr(struct sk_buff *oldskb,
|
|
ether_addr_copy(eth->h_dest, eth_hdr(oldskb)->h_source);
|
|
eth->h_proto = eth_hdr(oldskb)->h_proto;
|
|
skb_pull(nskb, ETH_HLEN);
|
|
+
|
|
+ if (skb_vlan_tag_present(oldskb)) {
|
|
+ u16 vid = skb_vlan_tag_get(oldskb);
|
|
+
|
|
+ __vlan_hwaccel_put_tag(nskb, oldskb->vlan_proto, vid);
|
|
+ }
|
|
}
|
|
|
|
static int nft_bridge_iphdr_validate(struct sk_buff *skb)
|
|
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
|
|
index 2352afa62d1f..e513b8876d13 100644
|
|
--- a/net/ceph/osd_client.c
|
|
+++ b/net/ceph/osd_client.c
|
|
@@ -3652,7 +3652,9 @@ static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg)
|
|
* supported.
|
|
*/
|
|
req->r_t.target_oloc.pool = m.redirect.oloc.pool;
|
|
- req->r_flags |= CEPH_OSD_FLAG_REDIRECTED;
|
|
+ req->r_flags |= CEPH_OSD_FLAG_REDIRECTED |
|
|
+ CEPH_OSD_FLAG_IGNORE_OVERLAY |
|
|
+ CEPH_OSD_FLAG_IGNORE_CACHE;
|
|
req->r_tid = 0;
|
|
__submit_request(req, false);
|
|
goto out_unlock_osdc;
|
|
diff --git a/net/core/dev.c b/net/core/dev.c
|
|
index 120b994af31c..8552874e5aac 100644
|
|
--- a/net/core/dev.c
|
|
+++ b/net/core/dev.c
|
|
@@ -4713,11 +4713,12 @@ static inline int nf_ingress(struct sk_buff *skb, struct packet_type **pt_prev,
|
|
return 0;
|
|
}
|
|
|
|
-static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc,
|
|
+static int __netif_receive_skb_core(struct sk_buff **pskb, bool pfmemalloc,
|
|
struct packet_type **ppt_prev)
|
|
{
|
|
struct packet_type *ptype, *pt_prev;
|
|
rx_handler_func_t *rx_handler;
|
|
+ struct sk_buff *skb = *pskb;
|
|
struct net_device *orig_dev;
|
|
bool deliver_exact = false;
|
|
int ret = NET_RX_DROP;
|
|
@@ -4748,8 +4749,10 @@ another_round:
|
|
ret2 = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb);
|
|
preempt_enable();
|
|
|
|
- if (ret2 != XDP_PASS)
|
|
- return NET_RX_DROP;
|
|
+ if (ret2 != XDP_PASS) {
|
|
+ ret = NET_RX_DROP;
|
|
+ goto out;
|
|
+ }
|
|
skb_reset_mac_len(skb);
|
|
}
|
|
|
|
@@ -4899,6 +4902,13 @@ drop:
|
|
}
|
|
|
|
out:
|
|
+ /* The invariant here is that if *ppt_prev is not NULL
|
|
+ * then skb should also be non-NULL.
|
|
+ *
|
|
+ * Apparently *ppt_prev assignment above holds this invariant due to
|
|
+ * skb dereferencing near it.
|
|
+ */
|
|
+ *pskb = skb;
|
|
return ret;
|
|
}
|
|
|
|
@@ -4908,7 +4918,7 @@ static int __netif_receive_skb_one_core(struct sk_buff *skb, bool pfmemalloc)
|
|
struct packet_type *pt_prev = NULL;
|
|
int ret;
|
|
|
|
- ret = __netif_receive_skb_core(skb, pfmemalloc, &pt_prev);
|
|
+ ret = __netif_receive_skb_core(&skb, pfmemalloc, &pt_prev);
|
|
if (pt_prev)
|
|
ret = INDIRECT_CALL_INET(pt_prev->func, ipv6_rcv, ip_rcv, skb,
|
|
skb->dev, pt_prev, orig_dev);
|
|
@@ -4986,7 +4996,7 @@ static void __netif_receive_skb_list_core(struct list_head *head, bool pfmemallo
|
|
struct packet_type *pt_prev = NULL;
|
|
|
|
skb_list_del_init(skb);
|
|
- __netif_receive_skb_core(skb, pfmemalloc, &pt_prev);
|
|
+ __netif_receive_skb_core(&skb, pfmemalloc, &pt_prev);
|
|
if (!pt_prev)
|
|
continue;
|
|
if (pt_curr != pt_prev || od_curr != orig_dev) {
|
|
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
|
|
index 23c2210fa7ec..f734ce0bcb56 100644
|
|
--- a/net/dsa/slave.c
|
|
+++ b/net/dsa/slave.c
|
|
@@ -1409,6 +1409,7 @@ int dsa_slave_create(struct dsa_port *port)
|
|
if (ds->ops->port_vlan_add && ds->ops->port_vlan_del)
|
|
slave_dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
|
slave_dev->hw_features |= NETIF_F_HW_TC;
|
|
+ slave_dev->features |= NETIF_F_LLTX;
|
|
slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;
|
|
if (!IS_ERR_OR_NULL(port->mac))
|
|
ether_addr_copy(slave_dev->dev_addr, port->mac);
|
|
diff --git a/net/dsa/tag_mtk.c b/net/dsa/tag_mtk.c
|
|
index b5705cba8318..d6619edd53e5 100644
|
|
--- a/net/dsa/tag_mtk.c
|
|
+++ b/net/dsa/tag_mtk.c
|
|
@@ -15,6 +15,7 @@
|
|
#define MTK_HDR_XMIT_TAGGED_TPID_8100 1
|
|
#define MTK_HDR_RECV_SOURCE_PORT_MASK GENMASK(2, 0)
|
|
#define MTK_HDR_XMIT_DP_BIT_MASK GENMASK(5, 0)
|
|
+#define MTK_HDR_XMIT_SA_DIS BIT(6)
|
|
|
|
static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb,
|
|
struct net_device *dev)
|
|
@@ -22,6 +23,9 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb,
|
|
struct dsa_port *dp = dsa_slave_to_port(dev);
|
|
u8 *mtk_tag;
|
|
bool is_vlan_skb = true;
|
|
+ unsigned char *dest = eth_hdr(skb)->h_dest;
|
|
+ bool is_multicast_skb = is_multicast_ether_addr(dest) &&
|
|
+ !is_broadcast_ether_addr(dest);
|
|
|
|
/* Build the special tag after the MAC Source Address. If VLAN header
|
|
* is present, it's required that VLAN header and special tag is
|
|
@@ -47,6 +51,10 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb,
|
|
MTK_HDR_XMIT_UNTAGGED;
|
|
mtk_tag[1] = (1 << dp->index) & MTK_HDR_XMIT_DP_BIT_MASK;
|
|
|
|
+ /* Disable SA learning for multicast frames */
|
|
+ if (unlikely(is_multicast_skb))
|
|
+ mtk_tag[1] |= MTK_HDR_XMIT_SA_DIS;
|
|
+
|
|
/* Tag control information is kept for 802.1Q */
|
|
if (!is_vlan_skb) {
|
|
mtk_tag[2] = 0;
|
|
@@ -61,6 +69,9 @@ static struct sk_buff *mtk_tag_rcv(struct sk_buff *skb, struct net_device *dev,
|
|
{
|
|
int port;
|
|
__be16 *phdr, hdr;
|
|
+ unsigned char *dest = eth_hdr(skb)->h_dest;
|
|
+ bool is_multicast_skb = is_multicast_ether_addr(dest) &&
|
|
+ !is_broadcast_ether_addr(dest);
|
|
|
|
if (unlikely(!pskb_may_pull(skb, MTK_HDR_LEN)))
|
|
return NULL;
|
|
@@ -86,6 +97,10 @@ static struct sk_buff *mtk_tag_rcv(struct sk_buff *skb, struct net_device *dev,
|
|
if (!skb->dev)
|
|
return NULL;
|
|
|
|
+ /* Only unicast or broadcast frames are offloaded */
|
|
+ if (likely(!is_multicast_skb))
|
|
+ skb->offload_fwd_mark = 1;
|
|
+
|
|
return skb;
|
|
}
|
|
|
|
diff --git a/net/ipv4/esp4_offload.c b/net/ipv4/esp4_offload.c
|
|
index e2e219c7854a..25c8ba6732df 100644
|
|
--- a/net/ipv4/esp4_offload.c
|
|
+++ b/net/ipv4/esp4_offload.c
|
|
@@ -63,10 +63,8 @@ static struct sk_buff *esp4_gro_receive(struct list_head *head,
|
|
sp->olen++;
|
|
|
|
xo = xfrm_offload(skb);
|
|
- if (!xo) {
|
|
- xfrm_state_put(x);
|
|
+ if (!xo)
|
|
goto out_reset;
|
|
- }
|
|
}
|
|
|
|
xo->flags |= XFRM_GRO;
|
|
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
|
|
index 48bf3b9be475..2b0521feadaa 100644
|
|
--- a/net/ipv4/fib_frontend.c
|
|
+++ b/net/ipv4/fib_frontend.c
|
|
@@ -319,17 +319,18 @@ bool fib_info_nh_uses_dev(struct fib_info *fi, const struct net_device *dev)
|
|
{
|
|
bool dev_match = false;
|
|
#ifdef CONFIG_IP_ROUTE_MULTIPATH
|
|
- int ret;
|
|
+ if (unlikely(fi->nh)) {
|
|
+ dev_match = nexthop_uses_dev(fi->nh, dev);
|
|
+ } else {
|
|
+ int ret;
|
|
|
|
- for (ret = 0; ret < fib_info_num_path(fi); ret++) {
|
|
- const struct fib_nh_common *nhc = fib_info_nhc(fi, ret);
|
|
+ for (ret = 0; ret < fib_info_num_path(fi); ret++) {
|
|
+ const struct fib_nh_common *nhc = fib_info_nhc(fi, ret);
|
|
|
|
- if (nhc->nhc_dev == dev) {
|
|
- dev_match = true;
|
|
- break;
|
|
- } else if (l3mdev_master_ifindex_rcu(nhc->nhc_dev) == dev->ifindex) {
|
|
- dev_match = true;
|
|
- break;
|
|
+ if (nhc_l3mdev_matches_dev(nhc, dev)) {
|
|
+ dev_match = true;
|
|
+ break;
|
|
+ }
|
|
}
|
|
}
|
|
#else
|
|
@@ -928,7 +929,6 @@ int ip_valid_fib_dump_req(struct net *net, const struct nlmsghdr *nlh,
|
|
else
|
|
filter->dump_exceptions = false;
|
|
|
|
- filter->dump_all_families = (rtm->rtm_family == AF_UNSPEC);
|
|
filter->flags = rtm->rtm_flags;
|
|
filter->protocol = rtm->rtm_protocol;
|
|
filter->rt_type = rtm->rtm_type;
|
|
@@ -1000,7 +1000,7 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
|
|
if (filter.table_id) {
|
|
tb = fib_get_table(net, filter.table_id);
|
|
if (!tb) {
|
|
- if (filter.dump_all_families)
|
|
+ if (rtnl_msg_family(cb->nlh) != PF_INET)
|
|
return skb->len;
|
|
|
|
NL_SET_ERR_MSG(cb->extack, "ipv4: FIB table does not exist");
|
|
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
|
|
index b0010c710802..5e486895d67c 100644
|
|
--- a/net/ipv4/inet_connection_sock.c
|
|
+++ b/net/ipv4/inet_connection_sock.c
|
|
@@ -24,17 +24,19 @@
|
|
#include <net/addrconf.h>
|
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
-/* match_wildcard == true: IPV6_ADDR_ANY equals to any IPv6 addresses if IPv6
|
|
- * only, and any IPv4 addresses if not IPv6 only
|
|
- * match_wildcard == false: addresses must be exactly the same, i.e.
|
|
- * IPV6_ADDR_ANY only equals to IPV6_ADDR_ANY,
|
|
- * and 0.0.0.0 equals to 0.0.0.0 only
|
|
+/* match_sk*_wildcard == true: IPV6_ADDR_ANY equals to any IPv6 addresses
|
|
+ * if IPv6 only, and any IPv4 addresses
|
|
+ * if not IPv6 only
|
|
+ * match_sk*_wildcard == false: addresses must be exactly the same, i.e.
|
|
+ * IPV6_ADDR_ANY only equals to IPV6_ADDR_ANY,
|
|
+ * and 0.0.0.0 equals to 0.0.0.0 only
|
|
*/
|
|
static bool ipv6_rcv_saddr_equal(const struct in6_addr *sk1_rcv_saddr6,
|
|
const struct in6_addr *sk2_rcv_saddr6,
|
|
__be32 sk1_rcv_saddr, __be32 sk2_rcv_saddr,
|
|
bool sk1_ipv6only, bool sk2_ipv6only,
|
|
- bool match_wildcard)
|
|
+ bool match_sk1_wildcard,
|
|
+ bool match_sk2_wildcard)
|
|
{
|
|
int addr_type = ipv6_addr_type(sk1_rcv_saddr6);
|
|
int addr_type2 = sk2_rcv_saddr6 ? ipv6_addr_type(sk2_rcv_saddr6) : IPV6_ADDR_MAPPED;
|
|
@@ -44,8 +46,8 @@ static bool ipv6_rcv_saddr_equal(const struct in6_addr *sk1_rcv_saddr6,
|
|
if (!sk2_ipv6only) {
|
|
if (sk1_rcv_saddr == sk2_rcv_saddr)
|
|
return true;
|
|
- if (!sk1_rcv_saddr || !sk2_rcv_saddr)
|
|
- return match_wildcard;
|
|
+ return (match_sk1_wildcard && !sk1_rcv_saddr) ||
|
|
+ (match_sk2_wildcard && !sk2_rcv_saddr);
|
|
}
|
|
return false;
|
|
}
|
|
@@ -53,11 +55,11 @@ static bool ipv6_rcv_saddr_equal(const struct in6_addr *sk1_rcv_saddr6,
|
|
if (addr_type == IPV6_ADDR_ANY && addr_type2 == IPV6_ADDR_ANY)
|
|
return true;
|
|
|
|
- if (addr_type2 == IPV6_ADDR_ANY && match_wildcard &&
|
|
+ if (addr_type2 == IPV6_ADDR_ANY && match_sk2_wildcard &&
|
|
!(sk2_ipv6only && addr_type == IPV6_ADDR_MAPPED))
|
|
return true;
|
|
|
|
- if (addr_type == IPV6_ADDR_ANY && match_wildcard &&
|
|
+ if (addr_type == IPV6_ADDR_ANY && match_sk1_wildcard &&
|
|
!(sk1_ipv6only && addr_type2 == IPV6_ADDR_MAPPED))
|
|
return true;
|
|
|
|
@@ -69,18 +71,19 @@ static bool ipv6_rcv_saddr_equal(const struct in6_addr *sk1_rcv_saddr6,
|
|
}
|
|
#endif
|
|
|
|
-/* match_wildcard == true: 0.0.0.0 equals to any IPv4 addresses
|
|
- * match_wildcard == false: addresses must be exactly the same, i.e.
|
|
- * 0.0.0.0 only equals to 0.0.0.0
|
|
+/* match_sk*_wildcard == true: 0.0.0.0 equals to any IPv4 addresses
|
|
+ * match_sk*_wildcard == false: addresses must be exactly the same, i.e.
|
|
+ * 0.0.0.0 only equals to 0.0.0.0
|
|
*/
|
|
static bool ipv4_rcv_saddr_equal(__be32 sk1_rcv_saddr, __be32 sk2_rcv_saddr,
|
|
- bool sk2_ipv6only, bool match_wildcard)
|
|
+ bool sk2_ipv6only, bool match_sk1_wildcard,
|
|
+ bool match_sk2_wildcard)
|
|
{
|
|
if (!sk2_ipv6only) {
|
|
if (sk1_rcv_saddr == sk2_rcv_saddr)
|
|
return true;
|
|
- if (!sk1_rcv_saddr || !sk2_rcv_saddr)
|
|
- return match_wildcard;
|
|
+ return (match_sk1_wildcard && !sk1_rcv_saddr) ||
|
|
+ (match_sk2_wildcard && !sk2_rcv_saddr);
|
|
}
|
|
return false;
|
|
}
|
|
@@ -96,10 +99,12 @@ bool inet_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2,
|
|
sk2->sk_rcv_saddr,
|
|
ipv6_only_sock(sk),
|
|
ipv6_only_sock(sk2),
|
|
+ match_wildcard,
|
|
match_wildcard);
|
|
#endif
|
|
return ipv4_rcv_saddr_equal(sk->sk_rcv_saddr, sk2->sk_rcv_saddr,
|
|
- ipv6_only_sock(sk2), match_wildcard);
|
|
+ ipv6_only_sock(sk2), match_wildcard,
|
|
+ match_wildcard);
|
|
}
|
|
EXPORT_SYMBOL(inet_rcv_saddr_equal);
|
|
|
|
@@ -273,10 +278,10 @@ static inline int sk_reuseport_match(struct inet_bind_bucket *tb,
|
|
tb->fast_rcv_saddr,
|
|
sk->sk_rcv_saddr,
|
|
tb->fast_ipv6_only,
|
|
- ipv6_only_sock(sk), true);
|
|
+ ipv6_only_sock(sk), true, false);
|
|
#endif
|
|
return ipv4_rcv_saddr_equal(tb->fast_rcv_saddr, sk->sk_rcv_saddr,
|
|
- ipv6_only_sock(sk), true);
|
|
+ ipv6_only_sock(sk), true, false);
|
|
}
|
|
|
|
/* Obtain a reference to a local port for the given sock,
|
|
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c
|
|
index 8ecaf0f26973..bd41354ed8c1 100644
|
|
--- a/net/ipv4/ip_vti.c
|
|
+++ b/net/ipv4/ip_vti.c
|
|
@@ -93,7 +93,28 @@ static int vti_rcv_proto(struct sk_buff *skb)
|
|
|
|
static int vti_rcv_tunnel(struct sk_buff *skb)
|
|
{
|
|
- return vti_rcv(skb, ip_hdr(skb)->saddr, true);
|
|
+ struct ip_tunnel_net *itn = net_generic(dev_net(skb->dev), vti_net_id);
|
|
+ const struct iphdr *iph = ip_hdr(skb);
|
|
+ struct ip_tunnel *tunnel;
|
|
+
|
|
+ tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex, TUNNEL_NO_KEY,
|
|
+ iph->saddr, iph->daddr, 0);
|
|
+ if (tunnel) {
|
|
+ struct tnl_ptk_info tpi = {
|
|
+ .proto = htons(ETH_P_IP),
|
|
+ };
|
|
+
|
|
+ if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
|
|
+ goto drop;
|
|
+ if (iptunnel_pull_header(skb, 0, tpi.proto, false))
|
|
+ goto drop;
|
|
+ return ip_tunnel_rcv(tunnel, skb, &tpi, NULL, false);
|
|
+ }
|
|
+
|
|
+ return -EINVAL;
|
|
+drop:
|
|
+ kfree_skb(skb);
|
|
+ return 0;
|
|
}
|
|
|
|
static int vti_rcv_cb(struct sk_buff *skb, int err)
|
|
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c
|
|
index 2f01cf6fa0de..678575adaf3b 100644
|
|
--- a/net/ipv4/ipip.c
|
|
+++ b/net/ipv4/ipip.c
|
|
@@ -698,7 +698,7 @@ out:
|
|
|
|
rtnl_link_failed:
|
|
#if IS_ENABLED(CONFIG_MPLS)
|
|
- xfrm4_tunnel_deregister(&mplsip_handler, AF_INET);
|
|
+ xfrm4_tunnel_deregister(&mplsip_handler, AF_MPLS);
|
|
xfrm_tunnel_mplsip_failed:
|
|
|
|
#endif
|
|
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
|
|
index 58007439cffd..d71935618871 100644
|
|
--- a/net/ipv4/ipmr.c
|
|
+++ b/net/ipv4/ipmr.c
|
|
@@ -2609,7 +2609,7 @@ static int ipmr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
|
|
|
|
mrt = ipmr_get_table(sock_net(skb->sk), filter.table_id);
|
|
if (!mrt) {
|
|
- if (filter.dump_all_families)
|
|
+ if (rtnl_msg_family(cb->nlh) != RTNL_FAMILY_IPMR)
|
|
return skb->len;
|
|
|
|
NL_SET_ERR_MSG(cb->extack, "ipv4: MR table does not exist");
|
|
diff --git a/net/ipv4/netfilter/nf_nat_pptp.c b/net/ipv4/netfilter/nf_nat_pptp.c
|
|
index b2aeb7bf5dac..2a1e10f4ae93 100644
|
|
--- a/net/ipv4/netfilter/nf_nat_pptp.c
|
|
+++ b/net/ipv4/netfilter/nf_nat_pptp.c
|
|
@@ -166,8 +166,7 @@ pptp_outbound_pkt(struct sk_buff *skb,
|
|
break;
|
|
default:
|
|
pr_debug("unknown outbound packet 0x%04x:%s\n", msg,
|
|
- msg <= PPTP_MSG_MAX ? pptp_msg_name[msg] :
|
|
- pptp_msg_name[0]);
|
|
+ pptp_msg_name(msg));
|
|
/* fall through */
|
|
case PPTP_SET_LINK_INFO:
|
|
/* only need to NAT in case PAC is behind NAT box */
|
|
@@ -268,9 +267,7 @@ pptp_inbound_pkt(struct sk_buff *skb,
|
|
pcid_off = offsetof(union pptp_ctrl_union, setlink.peersCallID);
|
|
break;
|
|
default:
|
|
- pr_debug("unknown inbound packet %s\n",
|
|
- msg <= PPTP_MSG_MAX ? pptp_msg_name[msg] :
|
|
- pptp_msg_name[0]);
|
|
+ pr_debug("unknown inbound packet %s\n", pptp_msg_name(msg));
|
|
/* fall through */
|
|
case PPTP_START_SESSION_REQUEST:
|
|
case PPTP_START_SESSION_REPLY:
|
|
diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c
|
|
index 3737d32ad11a..a01f500d6a6b 100644
|
|
--- a/net/ipv4/nexthop.c
|
|
+++ b/net/ipv4/nexthop.c
|
|
@@ -64,9 +64,16 @@ static void nexthop_free_mpath(struct nexthop *nh)
|
|
int i;
|
|
|
|
nhg = rcu_dereference_raw(nh->nh_grp);
|
|
- for (i = 0; i < nhg->num_nh; ++i)
|
|
- WARN_ON(nhg->nh_entries[i].nh);
|
|
+ for (i = 0; i < nhg->num_nh; ++i) {
|
|
+ struct nh_grp_entry *nhge = &nhg->nh_entries[i];
|
|
+
|
|
+ WARN_ON(!list_empty(&nhge->nh_list));
|
|
+ nexthop_put(nhge->nh);
|
|
+ }
|
|
+
|
|
+ WARN_ON(nhg->spare == nhg);
|
|
|
|
+ kfree(nhg->spare);
|
|
kfree(nhg);
|
|
}
|
|
|
|
@@ -277,6 +284,7 @@ out:
|
|
return 0;
|
|
|
|
nla_put_failure:
|
|
+ nlmsg_cancel(skb, nlh);
|
|
return -EMSGSIZE;
|
|
}
|
|
|
|
@@ -434,7 +442,7 @@ static int nh_check_attr_group(struct net *net, struct nlattr *tb[],
|
|
if (!valid_group_nh(nh, len, extack))
|
|
return -EINVAL;
|
|
}
|
|
- for (i = NHA_GROUP + 1; i < __NHA_MAX; ++i) {
|
|
+ for (i = NHA_GROUP_TYPE + 1; i < __NHA_MAX; ++i) {
|
|
if (!tb[i])
|
|
continue;
|
|
|
|
@@ -694,41 +702,56 @@ static void nh_group_rebalance(struct nh_group *nhg)
|
|
}
|
|
}
|
|
|
|
-static void remove_nh_grp_entry(struct nh_grp_entry *nhge,
|
|
- struct nh_group *nhg,
|
|
+static void remove_nh_grp_entry(struct net *net, struct nh_grp_entry *nhge,
|
|
struct nl_info *nlinfo)
|
|
{
|
|
+ struct nh_grp_entry *nhges, *new_nhges;
|
|
+ struct nexthop *nhp = nhge->nh_parent;
|
|
struct nexthop *nh = nhge->nh;
|
|
- struct nh_grp_entry *nhges;
|
|
- bool found = false;
|
|
- int i;
|
|
+ struct nh_group *nhg, *newg;
|
|
+ int i, j;
|
|
|
|
WARN_ON(!nh);
|
|
|
|
- nhges = nhg->nh_entries;
|
|
- for (i = 0; i < nhg->num_nh; ++i) {
|
|
- if (found) {
|
|
- nhges[i-1].nh = nhges[i].nh;
|
|
- nhges[i-1].weight = nhges[i].weight;
|
|
- list_del(&nhges[i].nh_list);
|
|
- list_add(&nhges[i-1].nh_list, &nhges[i-1].nh->grp_list);
|
|
- } else if (nhg->nh_entries[i].nh == nh) {
|
|
- found = true;
|
|
- }
|
|
- }
|
|
+ nhg = rtnl_dereference(nhp->nh_grp);
|
|
+ newg = nhg->spare;
|
|
|
|
- if (WARN_ON(!found))
|
|
+ /* last entry, keep it visible and remove the parent */
|
|
+ if (nhg->num_nh == 1) {
|
|
+ remove_nexthop(net, nhp, nlinfo);
|
|
return;
|
|
+ }
|
|
+
|
|
+ newg->has_v4 = nhg->has_v4;
|
|
+ newg->mpath = nhg->mpath;
|
|
+ newg->num_nh = nhg->num_nh;
|
|
|
|
- nhg->num_nh--;
|
|
- nhg->nh_entries[nhg->num_nh].nh = NULL;
|
|
+ /* copy old entries to new except the one getting removed */
|
|
+ nhges = nhg->nh_entries;
|
|
+ new_nhges = newg->nh_entries;
|
|
+ for (i = 0, j = 0; i < nhg->num_nh; ++i) {
|
|
+ /* current nexthop getting removed */
|
|
+ if (nhg->nh_entries[i].nh == nh) {
|
|
+ newg->num_nh--;
|
|
+ continue;
|
|
+ }
|
|
|
|
- nh_group_rebalance(nhg);
|
|
+ list_del(&nhges[i].nh_list);
|
|
+ new_nhges[j].nh_parent = nhges[i].nh_parent;
|
|
+ new_nhges[j].nh = nhges[i].nh;
|
|
+ new_nhges[j].weight = nhges[i].weight;
|
|
+ list_add(&new_nhges[j].nh_list, &new_nhges[j].nh->grp_list);
|
|
+ j++;
|
|
+ }
|
|
|
|
- nexthop_put(nh);
|
|
+ nh_group_rebalance(newg);
|
|
+ rcu_assign_pointer(nhp->nh_grp, newg);
|
|
+
|
|
+ list_del(&nhge->nh_list);
|
|
+ nexthop_put(nhge->nh);
|
|
|
|
if (nlinfo)
|
|
- nexthop_notify(RTM_NEWNEXTHOP, nhge->nh_parent, nlinfo);
|
|
+ nexthop_notify(RTM_NEWNEXTHOP, nhp, nlinfo);
|
|
}
|
|
|
|
static void remove_nexthop_from_groups(struct net *net, struct nexthop *nh,
|
|
@@ -736,17 +759,11 @@ static void remove_nexthop_from_groups(struct net *net, struct nexthop *nh,
|
|
{
|
|
struct nh_grp_entry *nhge, *tmp;
|
|
|
|
- list_for_each_entry_safe(nhge, tmp, &nh->grp_list, nh_list) {
|
|
- struct nh_group *nhg;
|
|
-
|
|
- list_del(&nhge->nh_list);
|
|
- nhg = rtnl_dereference(nhge->nh_parent->nh_grp);
|
|
- remove_nh_grp_entry(nhge, nhg, nlinfo);
|
|
+ list_for_each_entry_safe(nhge, tmp, &nh->grp_list, nh_list)
|
|
+ remove_nh_grp_entry(net, nhge, nlinfo);
|
|
|
|
- /* if this group has no more entries then remove it */
|
|
- if (!nhg->num_nh)
|
|
- remove_nexthop(net, nhge->nh_parent, nlinfo);
|
|
- }
|
|
+ /* make sure all see the newly published array before releasing rtnl */
|
|
+ synchronize_rcu();
|
|
}
|
|
|
|
static void remove_nexthop_group(struct nexthop *nh, struct nl_info *nlinfo)
|
|
@@ -760,10 +777,7 @@ static void remove_nexthop_group(struct nexthop *nh, struct nl_info *nlinfo)
|
|
if (WARN_ON(!nhge->nh))
|
|
continue;
|
|
|
|
- list_del(&nhge->nh_list);
|
|
- nexthop_put(nhge->nh);
|
|
- nhge->nh = NULL;
|
|
- nhg->num_nh--;
|
|
+ list_del_init(&nhge->nh_list);
|
|
}
|
|
}
|
|
|
|
@@ -1086,6 +1100,7 @@ static struct nexthop *nexthop_create_group(struct net *net,
|
|
{
|
|
struct nlattr *grps_attr = cfg->nh_grp;
|
|
struct nexthop_grp *entry = nla_data(grps_attr);
|
|
+ u16 num_nh = nla_len(grps_attr) / sizeof(*entry);
|
|
struct nh_group *nhg;
|
|
struct nexthop *nh;
|
|
int i;
|
|
@@ -1096,12 +1111,21 @@ static struct nexthop *nexthop_create_group(struct net *net,
|
|
|
|
nh->is_group = 1;
|
|
|
|
- nhg = nexthop_grp_alloc(nla_len(grps_attr) / sizeof(*entry));
|
|
+ nhg = nexthop_grp_alloc(num_nh);
|
|
if (!nhg) {
|
|
kfree(nh);
|
|
return ERR_PTR(-ENOMEM);
|
|
}
|
|
|
|
+ /* spare group used for removals */
|
|
+ nhg->spare = nexthop_grp_alloc(num_nh);
|
|
+ if (!nhg) {
|
|
+ kfree(nhg);
|
|
+ kfree(nh);
|
|
+ return NULL;
|
|
+ }
|
|
+ nhg->spare->spare = nhg;
|
|
+
|
|
for (i = 0; i < nhg->num_nh; ++i) {
|
|
struct nexthop *nhe;
|
|
struct nh_info *nhi;
|
|
@@ -1133,6 +1157,7 @@ out_no_nh:
|
|
for (; i >= 0; --i)
|
|
nexthop_put(nhg->nh_entries[i].nh);
|
|
|
|
+ kfree(nhg->spare);
|
|
kfree(nhg);
|
|
kfree(nh);
|
|
|
|
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
|
|
index 558ddf7ab395..b3a8d32f7d8d 100644
|
|
--- a/net/ipv4/route.c
|
|
+++ b/net/ipv4/route.c
|
|
@@ -490,18 +490,16 @@ u32 ip_idents_reserve(u32 hash, int segs)
|
|
atomic_t *p_id = ip_idents + hash % IP_IDENTS_SZ;
|
|
u32 old = READ_ONCE(*p_tstamp);
|
|
u32 now = (u32)jiffies;
|
|
- u32 new, delta = 0;
|
|
+ u32 delta = 0;
|
|
|
|
if (old != now && cmpxchg(p_tstamp, old, now) == old)
|
|
delta = prandom_u32_max(now - old);
|
|
|
|
- /* Do not use atomic_add_return() as it makes UBSAN unhappy */
|
|
- do {
|
|
- old = (u32)atomic_read(p_id);
|
|
- new = old + delta + segs;
|
|
- } while (atomic_cmpxchg(p_id, old, new) != old);
|
|
-
|
|
- return new - segs;
|
|
+ /* If UBSAN reports an error there, please make sure your compiler
|
|
+ * supports -fno-strict-overflow before reporting it that was a bug
|
|
+ * in UBSAN, and it has been fixed in GCC-8.
|
|
+ */
|
|
+ return atomic_add_return(segs + delta, p_id) - segs;
|
|
}
|
|
EXPORT_SYMBOL(ip_idents_reserve);
|
|
|
|
diff --git a/net/ipv6/esp6_offload.c b/net/ipv6/esp6_offload.c
|
|
index fd535053245b..93e086cf058a 100644
|
|
--- a/net/ipv6/esp6_offload.c
|
|
+++ b/net/ipv6/esp6_offload.c
|
|
@@ -85,10 +85,8 @@ static struct sk_buff *esp6_gro_receive(struct list_head *head,
|
|
sp->olen++;
|
|
|
|
xo = xfrm_offload(skb);
|
|
- if (!xo) {
|
|
- xfrm_state_put(x);
|
|
+ if (!xo)
|
|
goto out_reset;
|
|
- }
|
|
}
|
|
|
|
xo->flags |= XFRM_GRO;
|
|
@@ -123,9 +121,16 @@ static void esp6_gso_encap(struct xfrm_state *x, struct sk_buff *skb)
|
|
struct ip_esp_hdr *esph;
|
|
struct ipv6hdr *iph = ipv6_hdr(skb);
|
|
struct xfrm_offload *xo = xfrm_offload(skb);
|
|
- int proto = iph->nexthdr;
|
|
+ u8 proto = iph->nexthdr;
|
|
|
|
skb_push(skb, -skb_network_offset(skb));
|
|
+
|
|
+ if (x->outer_mode.encap == XFRM_MODE_TRANSPORT) {
|
|
+ __be16 frag;
|
|
+
|
|
+ ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &proto, &frag);
|
|
+ }
|
|
+
|
|
esph = ip_esp_hdr(skb);
|
|
*skb_mac_header(skb) = IPPROTO_ESP;
|
|
|
|
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
|
|
index c75274e0745c..7a0c877ca306 100644
|
|
--- a/net/ipv6/ip6_fib.c
|
|
+++ b/net/ipv6/ip6_fib.c
|
|
@@ -613,7 +613,7 @@ static int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
|
|
if (arg.filter.table_id) {
|
|
tb = fib6_get_table(net, arg.filter.table_id);
|
|
if (!tb) {
|
|
- if (arg.filter.dump_all_families)
|
|
+ if (rtnl_msg_family(cb->nlh) != PF_INET6)
|
|
goto out;
|
|
|
|
NL_SET_ERR_MSG_MOD(cb->extack, "FIB table does not exist");
|
|
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
|
|
index 857a89ad4d6c..dd41313d7fa5 100644
|
|
--- a/net/ipv6/ip6mr.c
|
|
+++ b/net/ipv6/ip6mr.c
|
|
@@ -2498,7 +2498,7 @@ static int ip6mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
|
|
|
|
mrt = ip6mr_get_table(sock_net(skb->sk), filter.table_id);
|
|
if (!mrt) {
|
|
- if (filter.dump_all_families)
|
|
+ if (rtnl_msg_family(cb->nlh) != RTNL_FAMILY_IP6MR)
|
|
return skb->len;
|
|
|
|
NL_SET_ERR_MSG_MOD(cb->extack, "MR table does not exist");
|
|
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
|
|
index 38a0383dfbcf..aa5150929996 100644
|
|
--- a/net/mac80211/mesh_hwmp.c
|
|
+++ b/net/mac80211/mesh_hwmp.c
|
|
@@ -1103,7 +1103,14 @@ void mesh_path_start_discovery(struct ieee80211_sub_if_data *sdata)
|
|
mesh_path_sel_frame_tx(MPATH_PREQ, 0, sdata->vif.addr, ifmsh->sn,
|
|
target_flags, mpath->dst, mpath->sn, da, 0,
|
|
ttl, lifetime, 0, ifmsh->preq_id++, sdata);
|
|
+
|
|
+ spin_lock_bh(&mpath->state_lock);
|
|
+ if (mpath->flags & MESH_PATH_DELETED) {
|
|
+ spin_unlock_bh(&mpath->state_lock);
|
|
+ goto enddiscovery;
|
|
+ }
|
|
mod_timer(&mpath->timer, jiffies + mpath->discovery_timeout);
|
|
+ spin_unlock_bh(&mpath->state_lock);
|
|
|
|
enddiscovery:
|
|
rcu_read_unlock();
|
|
diff --git a/net/netfilter/ipset/ip_set_list_set.c b/net/netfilter/ipset/ip_set_list_set.c
|
|
index 67ac50104e6f..63908123f7ba 100644
|
|
--- a/net/netfilter/ipset/ip_set_list_set.c
|
|
+++ b/net/netfilter/ipset/ip_set_list_set.c
|
|
@@ -59,7 +59,7 @@ list_set_ktest(struct ip_set *set, const struct sk_buff *skb,
|
|
/* Don't lookup sub-counters at all */
|
|
opt->cmdflags &= ~IPSET_FLAG_MATCH_COUNTERS;
|
|
if (opt->cmdflags & IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE)
|
|
- opt->cmdflags &= ~IPSET_FLAG_SKIP_COUNTER_UPDATE;
|
|
+ opt->cmdflags |= IPSET_FLAG_SKIP_COUNTER_UPDATE;
|
|
list_for_each_entry_rcu(e, &map->members, list) {
|
|
ret = ip_set_test(e->id, skb, par, opt);
|
|
if (ret <= 0)
|
|
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
|
|
index c2ad462f33f1..48db4aec02de 100644
|
|
--- a/net/netfilter/nf_conntrack_core.c
|
|
+++ b/net/netfilter/nf_conntrack_core.c
|
|
@@ -1879,22 +1879,18 @@ static void nf_conntrack_attach(struct sk_buff *nskb, const struct sk_buff *skb)
|
|
nf_conntrack_get(skb_nfct(nskb));
|
|
}
|
|
|
|
-static int nf_conntrack_update(struct net *net, struct sk_buff *skb)
|
|
+static int __nf_conntrack_update(struct net *net, struct sk_buff *skb,
|
|
+ struct nf_conn *ct,
|
|
+ enum ip_conntrack_info ctinfo)
|
|
{
|
|
struct nf_conntrack_tuple_hash *h;
|
|
struct nf_conntrack_tuple tuple;
|
|
- enum ip_conntrack_info ctinfo;
|
|
struct nf_nat_hook *nat_hook;
|
|
unsigned int status;
|
|
- struct nf_conn *ct;
|
|
int dataoff;
|
|
u16 l3num;
|
|
u8 l4num;
|
|
|
|
- ct = nf_ct_get(skb, &ctinfo);
|
|
- if (!ct || nf_ct_is_confirmed(ct))
|
|
- return 0;
|
|
-
|
|
l3num = nf_ct_l3num(ct);
|
|
|
|
dataoff = get_l4proto(skb, skb_network_offset(skb), l3num, &l4num);
|
|
@@ -1951,6 +1947,76 @@ static int nf_conntrack_update(struct net *net, struct sk_buff *skb)
|
|
return 0;
|
|
}
|
|
|
|
+/* This packet is coming from userspace via nf_queue, complete the packet
|
|
+ * processing after the helper invocation in nf_confirm().
|
|
+ */
|
|
+static int nf_confirm_cthelper(struct sk_buff *skb, struct nf_conn *ct,
|
|
+ enum ip_conntrack_info ctinfo)
|
|
+{
|
|
+ const struct nf_conntrack_helper *helper;
|
|
+ const struct nf_conn_help *help;
|
|
+ int protoff;
|
|
+
|
|
+ help = nfct_help(ct);
|
|
+ if (!help)
|
|
+ return 0;
|
|
+
|
|
+ helper = rcu_dereference(help->helper);
|
|
+ if (!(helper->flags & NF_CT_HELPER_F_USERSPACE))
|
|
+ return 0;
|
|
+
|
|
+ switch (nf_ct_l3num(ct)) {
|
|
+ case NFPROTO_IPV4:
|
|
+ protoff = skb_network_offset(skb) + ip_hdrlen(skb);
|
|
+ break;
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
+ case NFPROTO_IPV6: {
|
|
+ __be16 frag_off;
|
|
+ u8 pnum;
|
|
+
|
|
+ pnum = ipv6_hdr(skb)->nexthdr;
|
|
+ protoff = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), &pnum,
|
|
+ &frag_off);
|
|
+ if (protoff < 0 || (frag_off & htons(~0x7)) != 0)
|
|
+ return 0;
|
|
+ break;
|
|
+ }
|
|
+#endif
|
|
+ default:
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ if (test_bit(IPS_SEQ_ADJUST_BIT, &ct->status) &&
|
|
+ !nf_is_loopback_packet(skb)) {
|
|
+ if (!nf_ct_seq_adjust(skb, ct, ctinfo, protoff)) {
|
|
+ NF_CT_STAT_INC_ATOMIC(nf_ct_net(ct), drop);
|
|
+ return -1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* We've seen it coming out the other side: confirm it */
|
|
+ return nf_conntrack_confirm(skb) == NF_DROP ? - 1 : 0;
|
|
+}
|
|
+
|
|
+static int nf_conntrack_update(struct net *net, struct sk_buff *skb)
|
|
+{
|
|
+ enum ip_conntrack_info ctinfo;
|
|
+ struct nf_conn *ct;
|
|
+ int err;
|
|
+
|
|
+ ct = nf_ct_get(skb, &ctinfo);
|
|
+ if (!ct)
|
|
+ return 0;
|
|
+
|
|
+ if (!nf_ct_is_confirmed(ct)) {
|
|
+ err = __nf_conntrack_update(net, skb, ct, ctinfo);
|
|
+ if (err < 0)
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ return nf_confirm_cthelper(skb, ct, ctinfo);
|
|
+}
|
|
+
|
|
static bool nf_conntrack_get_tuple_skb(struct nf_conntrack_tuple *dst_tuple,
|
|
const struct sk_buff *skb)
|
|
{
|
|
diff --git a/net/netfilter/nf_conntrack_pptp.c b/net/netfilter/nf_conntrack_pptp.c
|
|
index a971183f11af..1f44d523b512 100644
|
|
--- a/net/netfilter/nf_conntrack_pptp.c
|
|
+++ b/net/netfilter/nf_conntrack_pptp.c
|
|
@@ -72,24 +72,32 @@ EXPORT_SYMBOL_GPL(nf_nat_pptp_hook_expectfn);
|
|
|
|
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG)
|
|
/* PptpControlMessageType names */
|
|
-const char *const pptp_msg_name[] = {
|
|
- "UNKNOWN_MESSAGE",
|
|
- "START_SESSION_REQUEST",
|
|
- "START_SESSION_REPLY",
|
|
- "STOP_SESSION_REQUEST",
|
|
- "STOP_SESSION_REPLY",
|
|
- "ECHO_REQUEST",
|
|
- "ECHO_REPLY",
|
|
- "OUT_CALL_REQUEST",
|
|
- "OUT_CALL_REPLY",
|
|
- "IN_CALL_REQUEST",
|
|
- "IN_CALL_REPLY",
|
|
- "IN_CALL_CONNECT",
|
|
- "CALL_CLEAR_REQUEST",
|
|
- "CALL_DISCONNECT_NOTIFY",
|
|
- "WAN_ERROR_NOTIFY",
|
|
- "SET_LINK_INFO"
|
|
+static const char *const pptp_msg_name_array[PPTP_MSG_MAX + 1] = {
|
|
+ [0] = "UNKNOWN_MESSAGE",
|
|
+ [PPTP_START_SESSION_REQUEST] = "START_SESSION_REQUEST",
|
|
+ [PPTP_START_SESSION_REPLY] = "START_SESSION_REPLY",
|
|
+ [PPTP_STOP_SESSION_REQUEST] = "STOP_SESSION_REQUEST",
|
|
+ [PPTP_STOP_SESSION_REPLY] = "STOP_SESSION_REPLY",
|
|
+ [PPTP_ECHO_REQUEST] = "ECHO_REQUEST",
|
|
+ [PPTP_ECHO_REPLY] = "ECHO_REPLY",
|
|
+ [PPTP_OUT_CALL_REQUEST] = "OUT_CALL_REQUEST",
|
|
+ [PPTP_OUT_CALL_REPLY] = "OUT_CALL_REPLY",
|
|
+ [PPTP_IN_CALL_REQUEST] = "IN_CALL_REQUEST",
|
|
+ [PPTP_IN_CALL_REPLY] = "IN_CALL_REPLY",
|
|
+ [PPTP_IN_CALL_CONNECT] = "IN_CALL_CONNECT",
|
|
+ [PPTP_CALL_CLEAR_REQUEST] = "CALL_CLEAR_REQUEST",
|
|
+ [PPTP_CALL_DISCONNECT_NOTIFY] = "CALL_DISCONNECT_NOTIFY",
|
|
+ [PPTP_WAN_ERROR_NOTIFY] = "WAN_ERROR_NOTIFY",
|
|
+ [PPTP_SET_LINK_INFO] = "SET_LINK_INFO"
|
|
};
|
|
+
|
|
+const char *pptp_msg_name(u_int16_t msg)
|
|
+{
|
|
+ if (msg > PPTP_MSG_MAX)
|
|
+ return pptp_msg_name_array[0];
|
|
+
|
|
+ return pptp_msg_name_array[msg];
|
|
+}
|
|
EXPORT_SYMBOL(pptp_msg_name);
|
|
#endif
|
|
|
|
@@ -276,7 +284,7 @@ pptp_inbound_pkt(struct sk_buff *skb, unsigned int protoff,
|
|
typeof(nf_nat_pptp_hook_inbound) nf_nat_pptp_inbound;
|
|
|
|
msg = ntohs(ctlh->messageType);
|
|
- pr_debug("inbound control message %s\n", pptp_msg_name[msg]);
|
|
+ pr_debug("inbound control message %s\n", pptp_msg_name(msg));
|
|
|
|
switch (msg) {
|
|
case PPTP_START_SESSION_REPLY:
|
|
@@ -311,7 +319,7 @@ pptp_inbound_pkt(struct sk_buff *skb, unsigned int protoff,
|
|
pcid = pptpReq->ocack.peersCallID;
|
|
if (info->pns_call_id != pcid)
|
|
goto invalid;
|
|
- pr_debug("%s, CID=%X, PCID=%X\n", pptp_msg_name[msg],
|
|
+ pr_debug("%s, CID=%X, PCID=%X\n", pptp_msg_name(msg),
|
|
ntohs(cid), ntohs(pcid));
|
|
|
|
if (pptpReq->ocack.resultCode == PPTP_OUTCALL_CONNECT) {
|
|
@@ -328,7 +336,7 @@ pptp_inbound_pkt(struct sk_buff *skb, unsigned int protoff,
|
|
goto invalid;
|
|
|
|
cid = pptpReq->icreq.callID;
|
|
- pr_debug("%s, CID=%X\n", pptp_msg_name[msg], ntohs(cid));
|
|
+ pr_debug("%s, CID=%X\n", pptp_msg_name(msg), ntohs(cid));
|
|
info->cstate = PPTP_CALL_IN_REQ;
|
|
info->pac_call_id = cid;
|
|
break;
|
|
@@ -347,7 +355,7 @@ pptp_inbound_pkt(struct sk_buff *skb, unsigned int protoff,
|
|
if (info->pns_call_id != pcid)
|
|
goto invalid;
|
|
|
|
- pr_debug("%s, PCID=%X\n", pptp_msg_name[msg], ntohs(pcid));
|
|
+ pr_debug("%s, PCID=%X\n", pptp_msg_name(msg), ntohs(pcid));
|
|
info->cstate = PPTP_CALL_IN_CONF;
|
|
|
|
/* we expect a GRE connection from PAC to PNS */
|
|
@@ -357,7 +365,7 @@ pptp_inbound_pkt(struct sk_buff *skb, unsigned int protoff,
|
|
case PPTP_CALL_DISCONNECT_NOTIFY:
|
|
/* server confirms disconnect */
|
|
cid = pptpReq->disc.callID;
|
|
- pr_debug("%s, CID=%X\n", pptp_msg_name[msg], ntohs(cid));
|
|
+ pr_debug("%s, CID=%X\n", pptp_msg_name(msg), ntohs(cid));
|
|
info->cstate = PPTP_CALL_NONE;
|
|
|
|
/* untrack this call id, unexpect GRE packets */
|
|
@@ -384,7 +392,7 @@ pptp_inbound_pkt(struct sk_buff *skb, unsigned int protoff,
|
|
invalid:
|
|
pr_debug("invalid %s: type=%d cid=%u pcid=%u "
|
|
"cstate=%d sstate=%d pns_cid=%u pac_cid=%u\n",
|
|
- msg <= PPTP_MSG_MAX ? pptp_msg_name[msg] : pptp_msg_name[0],
|
|
+ pptp_msg_name(msg),
|
|
msg, ntohs(cid), ntohs(pcid), info->cstate, info->sstate,
|
|
ntohs(info->pns_call_id), ntohs(info->pac_call_id));
|
|
return NF_ACCEPT;
|
|
@@ -404,7 +412,7 @@ pptp_outbound_pkt(struct sk_buff *skb, unsigned int protoff,
|
|
typeof(nf_nat_pptp_hook_outbound) nf_nat_pptp_outbound;
|
|
|
|
msg = ntohs(ctlh->messageType);
|
|
- pr_debug("outbound control message %s\n", pptp_msg_name[msg]);
|
|
+ pr_debug("outbound control message %s\n", pptp_msg_name(msg));
|
|
|
|
switch (msg) {
|
|
case PPTP_START_SESSION_REQUEST:
|
|
@@ -426,7 +434,7 @@ pptp_outbound_pkt(struct sk_buff *skb, unsigned int protoff,
|
|
info->cstate = PPTP_CALL_OUT_REQ;
|
|
/* track PNS call id */
|
|
cid = pptpReq->ocreq.callID;
|
|
- pr_debug("%s, CID=%X\n", pptp_msg_name[msg], ntohs(cid));
|
|
+ pr_debug("%s, CID=%X\n", pptp_msg_name(msg), ntohs(cid));
|
|
info->pns_call_id = cid;
|
|
break;
|
|
|
|
@@ -440,7 +448,7 @@ pptp_outbound_pkt(struct sk_buff *skb, unsigned int protoff,
|
|
pcid = pptpReq->icack.peersCallID;
|
|
if (info->pac_call_id != pcid)
|
|
goto invalid;
|
|
- pr_debug("%s, CID=%X PCID=%X\n", pptp_msg_name[msg],
|
|
+ pr_debug("%s, CID=%X PCID=%X\n", pptp_msg_name(msg),
|
|
ntohs(cid), ntohs(pcid));
|
|
|
|
if (pptpReq->icack.resultCode == PPTP_INCALL_ACCEPT) {
|
|
@@ -480,7 +488,7 @@ pptp_outbound_pkt(struct sk_buff *skb, unsigned int protoff,
|
|
invalid:
|
|
pr_debug("invalid %s: type=%d cid=%u pcid=%u "
|
|
"cstate=%d sstate=%d pns_cid=%u pac_cid=%u\n",
|
|
- msg <= PPTP_MSG_MAX ? pptp_msg_name[msg] : pptp_msg_name[0],
|
|
+ pptp_msg_name(msg),
|
|
msg, ntohs(cid), ntohs(pcid), info->cstate, info->sstate,
|
|
ntohs(info->pns_call_id), ntohs(info->pac_call_id));
|
|
return NF_ACCEPT;
|
|
diff --git a/net/netfilter/nfnetlink_cthelper.c b/net/netfilter/nfnetlink_cthelper.c
|
|
index 60838d5fb8e0..81406b93f126 100644
|
|
--- a/net/netfilter/nfnetlink_cthelper.c
|
|
+++ b/net/netfilter/nfnetlink_cthelper.c
|
|
@@ -103,7 +103,7 @@ nfnl_cthelper_from_nlattr(struct nlattr *attr, struct nf_conn *ct)
|
|
if (help->helper->data_len == 0)
|
|
return -EINVAL;
|
|
|
|
- nla_memcpy(help->data, nla_data(attr), sizeof(help->data));
|
|
+ nla_memcpy(help->data, attr, sizeof(help->data));
|
|
return 0;
|
|
}
|
|
|
|
@@ -240,6 +240,7 @@ nfnl_cthelper_create(const struct nlattr * const tb[],
|
|
ret = -ENOMEM;
|
|
goto err2;
|
|
}
|
|
+ helper->data_len = size;
|
|
|
|
helper->flags |= NF_CT_HELPER_F_USERSPACE;
|
|
memcpy(&helper->tuple, tuple, sizeof(struct nf_conntrack_tuple));
|
|
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
|
|
index 930f48a20546..2a4d50e04441 100644
|
|
--- a/net/qrtr/qrtr.c
|
|
+++ b/net/qrtr/qrtr.c
|
|
@@ -711,7 +711,7 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
|
|
}
|
|
mutex_unlock(&qrtr_node_lock);
|
|
|
|
- qrtr_local_enqueue(node, skb, type, from, to);
|
|
+ qrtr_local_enqueue(NULL, skb, type, from, to);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
|
|
index b06cae508158..6927b658dad3 100644
|
|
--- a/net/sctp/sm_sideeffect.c
|
|
+++ b/net/sctp/sm_sideeffect.c
|
|
@@ -1522,9 +1522,17 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type,
|
|
timeout = asoc->timeouts[cmd->obj.to];
|
|
BUG_ON(!timeout);
|
|
|
|
- timer->expires = jiffies + timeout;
|
|
- sctp_association_hold(asoc);
|
|
- add_timer(timer);
|
|
+ /*
|
|
+ * SCTP has a hard time with timer starts. Because we process
|
|
+ * timer starts as side effects, it can be hard to tell if we
|
|
+ * have already started a timer or not, which leads to BUG
|
|
+ * halts when we call add_timer. So here, instead of just starting
|
|
+ * a timer, if the timer is already started, and just mod
|
|
+ * the timer with the shorter of the two expiration times
|
|
+ */
|
|
+ if (!timer_pending(timer))
|
|
+ sctp_association_hold(asoc);
|
|
+ timer_reduce(timer, jiffies + timeout);
|
|
break;
|
|
|
|
case SCTP_CMD_TIMER_RESTART:
|
|
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
|
|
index 5625a9500f21..84138a07e936 100644
|
|
--- a/net/sctp/sm_statefuns.c
|
|
+++ b/net/sctp/sm_statefuns.c
|
|
@@ -1856,12 +1856,13 @@ static enum sctp_disposition sctp_sf_do_dupcook_a(
|
|
/* Update the content of current association. */
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc));
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev));
|
|
- if (sctp_state(asoc, SHUTDOWN_PENDING) &&
|
|
+ if ((sctp_state(asoc, SHUTDOWN_PENDING) ||
|
|
+ sctp_state(asoc, SHUTDOWN_SENT)) &&
|
|
(sctp_sstate(asoc->base.sk, CLOSING) ||
|
|
sock_flag(asoc->base.sk, SOCK_DEAD))) {
|
|
- /* if were currently in SHUTDOWN_PENDING, but the socket
|
|
- * has been closed by user, don't transition to ESTABLISHED.
|
|
- * Instead trigger SHUTDOWN bundled with COOKIE_ACK.
|
|
+ /* If the socket has been closed by user, don't
|
|
+ * transition to ESTABLISHED. Instead trigger SHUTDOWN
|
|
+ * bundled with COOKIE_ACK.
|
|
*/
|
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl));
|
|
return sctp_sf_do_9_2_start_shutdown(net, ep, asoc,
|
|
diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c
|
|
index 186c78431217..8f0977a9d423 100644
|
|
--- a/net/tipc/udp_media.c
|
|
+++ b/net/tipc/udp_media.c
|
|
@@ -161,9 +161,11 @@ static int tipc_udp_xmit(struct net *net, struct sk_buff *skb,
|
|
struct udp_bearer *ub, struct udp_media_addr *src,
|
|
struct udp_media_addr *dst, struct dst_cache *cache)
|
|
{
|
|
- struct dst_entry *ndst = dst_cache_get(cache);
|
|
+ struct dst_entry *ndst;
|
|
int ttl, err = 0;
|
|
|
|
+ local_bh_disable();
|
|
+ ndst = dst_cache_get(cache);
|
|
if (dst->proto == htons(ETH_P_IP)) {
|
|
struct rtable *rt = (struct rtable *)ndst;
|
|
|
|
@@ -210,9 +212,11 @@ static int tipc_udp_xmit(struct net *net, struct sk_buff *skb,
|
|
src->port, dst->port, false);
|
|
#endif
|
|
}
|
|
+ local_bh_enable();
|
|
return err;
|
|
|
|
tx_error:
|
|
+ local_bh_enable();
|
|
kfree_skb(skb);
|
|
return err;
|
|
}
|
|
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
|
|
index 5513a08a4308..fbf6a496ee8b 100644
|
|
--- a/net/tls/tls_sw.c
|
|
+++ b/net/tls/tls_sw.c
|
|
@@ -203,10 +203,12 @@ static void tls_decrypt_done(struct crypto_async_request *req, int err)
|
|
|
|
kfree(aead_req);
|
|
|
|
+ spin_lock_bh(&ctx->decrypt_compl_lock);
|
|
pending = atomic_dec_return(&ctx->decrypt_pending);
|
|
|
|
- if (!pending && READ_ONCE(ctx->async_notify))
|
|
+ if (!pending && ctx->async_notify)
|
|
complete(&ctx->async_wait.completion);
|
|
+ spin_unlock_bh(&ctx->decrypt_compl_lock);
|
|
}
|
|
|
|
static int tls_do_decryption(struct sock *sk,
|
|
@@ -464,10 +466,12 @@ static void tls_encrypt_done(struct crypto_async_request *req, int err)
|
|
ready = true;
|
|
}
|
|
|
|
+ spin_lock_bh(&ctx->encrypt_compl_lock);
|
|
pending = atomic_dec_return(&ctx->encrypt_pending);
|
|
|
|
- if (!pending && READ_ONCE(ctx->async_notify))
|
|
+ if (!pending && ctx->async_notify)
|
|
complete(&ctx->async_wait.completion);
|
|
+ spin_unlock_bh(&ctx->encrypt_compl_lock);
|
|
|
|
if (!ready)
|
|
return;
|
|
@@ -777,7 +781,7 @@ static int tls_push_record(struct sock *sk, int flags,
|
|
|
|
static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk,
|
|
bool full_record, u8 record_type,
|
|
- size_t *copied, int flags)
|
|
+ ssize_t *copied, int flags)
|
|
{
|
|
struct tls_context *tls_ctx = tls_get_ctx(sk);
|
|
struct tls_sw_context_tx *ctx = tls_sw_ctx_tx(tls_ctx);
|
|
@@ -793,9 +797,10 @@ static int bpf_exec_tx_verdict(struct sk_msg *msg, struct sock *sk,
|
|
psock = sk_psock_get(sk);
|
|
if (!psock || !policy) {
|
|
err = tls_push_record(sk, flags, record_type);
|
|
- if (err && err != -EINPROGRESS) {
|
|
+ if (err && sk->sk_err == EBADMSG) {
|
|
*copied -= sk_msg_free(sk, msg);
|
|
tls_free_open_rec(sk);
|
|
+ err = -sk->sk_err;
|
|
}
|
|
if (psock)
|
|
sk_psock_put(sk, psock);
|
|
@@ -821,9 +826,10 @@ more_data:
|
|
switch (psock->eval) {
|
|
case __SK_PASS:
|
|
err = tls_push_record(sk, flags, record_type);
|
|
- if (err && err != -EINPROGRESS) {
|
|
+ if (err && sk->sk_err == EBADMSG) {
|
|
*copied -= sk_msg_free(sk, msg);
|
|
tls_free_open_rec(sk);
|
|
+ err = -sk->sk_err;
|
|
goto out_err;
|
|
}
|
|
break;
|
|
@@ -913,7 +919,8 @@ int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
|
|
unsigned char record_type = TLS_RECORD_TYPE_DATA;
|
|
bool is_kvec = iov_iter_is_kvec(&msg->msg_iter);
|
|
bool eor = !(msg->msg_flags & MSG_MORE);
|
|
- size_t try_to_copy, copied = 0;
|
|
+ size_t try_to_copy;
|
|
+ ssize_t copied = 0;
|
|
struct sk_msg *msg_pl, *msg_en;
|
|
struct tls_rec *rec;
|
|
int required_size;
|
|
@@ -923,6 +930,7 @@ int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
|
|
int num_zc = 0;
|
|
int orig_size;
|
|
int ret = 0;
|
|
+ int pending;
|
|
|
|
if (msg->msg_flags & ~(MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL))
|
|
return -EOPNOTSUPP;
|
|
@@ -1089,13 +1097,19 @@ trim_sgl:
|
|
goto send_end;
|
|
} else if (num_zc) {
|
|
/* Wait for pending encryptions to get completed */
|
|
- smp_store_mb(ctx->async_notify, true);
|
|
+ spin_lock_bh(&ctx->encrypt_compl_lock);
|
|
+ ctx->async_notify = true;
|
|
|
|
- if (atomic_read(&ctx->encrypt_pending))
|
|
+ pending = atomic_read(&ctx->encrypt_pending);
|
|
+ spin_unlock_bh(&ctx->encrypt_compl_lock);
|
|
+ if (pending)
|
|
crypto_wait_req(-EINPROGRESS, &ctx->async_wait);
|
|
else
|
|
reinit_completion(&ctx->async_wait.completion);
|
|
|
|
+ /* There can be no concurrent accesses, since we have no
|
|
+ * pending encrypt operations
|
|
+ */
|
|
WRITE_ONCE(ctx->async_notify, false);
|
|
|
|
if (ctx->async_wait.err) {
|
|
@@ -1115,7 +1129,7 @@ send_end:
|
|
|
|
release_sock(sk);
|
|
mutex_unlock(&tls_ctx->tx_lock);
|
|
- return copied ? copied : ret;
|
|
+ return copied > 0 ? copied : ret;
|
|
}
|
|
|
|
static int tls_sw_do_sendpage(struct sock *sk, struct page *page,
|
|
@@ -1129,7 +1143,7 @@ static int tls_sw_do_sendpage(struct sock *sk, struct page *page,
|
|
struct sk_msg *msg_pl;
|
|
struct tls_rec *rec;
|
|
int num_async = 0;
|
|
- size_t copied = 0;
|
|
+ ssize_t copied = 0;
|
|
bool full_record;
|
|
int record_room;
|
|
int ret = 0;
|
|
@@ -1231,7 +1245,7 @@ wait_for_memory:
|
|
}
|
|
sendpage_end:
|
|
ret = sk_stream_error(sk, flags, ret);
|
|
- return copied ? copied : ret;
|
|
+ return copied > 0 ? copied : ret;
|
|
}
|
|
|
|
int tls_sw_sendpage_locked(struct sock *sk, struct page *page,
|
|
@@ -1724,6 +1738,7 @@ int tls_sw_recvmsg(struct sock *sk,
|
|
bool is_kvec = iov_iter_is_kvec(&msg->msg_iter);
|
|
bool is_peek = flags & MSG_PEEK;
|
|
int num_async = 0;
|
|
+ int pending;
|
|
|
|
flags |= nonblock;
|
|
|
|
@@ -1886,8 +1901,11 @@ pick_next_record:
|
|
recv_end:
|
|
if (num_async) {
|
|
/* Wait for all previously submitted records to be decrypted */
|
|
- smp_store_mb(ctx->async_notify, true);
|
|
- if (atomic_read(&ctx->decrypt_pending)) {
|
|
+ spin_lock_bh(&ctx->decrypt_compl_lock);
|
|
+ ctx->async_notify = true;
|
|
+ pending = atomic_read(&ctx->decrypt_pending);
|
|
+ spin_unlock_bh(&ctx->decrypt_compl_lock);
|
|
+ if (pending) {
|
|
err = crypto_wait_req(-EINPROGRESS, &ctx->async_wait);
|
|
if (err) {
|
|
/* one of async decrypt failed */
|
|
@@ -1899,6 +1917,10 @@ recv_end:
|
|
} else {
|
|
reinit_completion(&ctx->async_wait.completion);
|
|
}
|
|
+
|
|
+ /* There can be no concurrent accesses, since we have no
|
|
+ * pending decrypt operations
|
|
+ */
|
|
WRITE_ONCE(ctx->async_notify, false);
|
|
|
|
/* Drain records from the rx_list & copy if required */
|
|
@@ -2285,6 +2307,7 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
|
|
|
|
if (tx) {
|
|
crypto_init_wait(&sw_ctx_tx->async_wait);
|
|
+ spin_lock_init(&sw_ctx_tx->encrypt_compl_lock);
|
|
crypto_info = &ctx->crypto_send.info;
|
|
cctx = &ctx->tx;
|
|
aead = &sw_ctx_tx->aead_send;
|
|
@@ -2293,6 +2316,7 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx)
|
|
sw_ctx_tx->tx_work.sk = sk;
|
|
} else {
|
|
crypto_init_wait(&sw_ctx_rx->async_wait);
|
|
+ spin_lock_init(&sw_ctx_rx->decrypt_compl_lock);
|
|
crypto_info = &ctx->crypto_recv.info;
|
|
cctx = &ctx->rx;
|
|
skb_queue_head_init(&sw_ctx_rx->rx_list);
|
|
diff --git a/net/wireless/core.c b/net/wireless/core.c
|
|
index 3e25229a059d..ee5bb8d8af04 100644
|
|
--- a/net/wireless/core.c
|
|
+++ b/net/wireless/core.c
|
|
@@ -142,7 +142,7 @@ int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
|
|
if (result)
|
|
return result;
|
|
|
|
- if (rdev->wiphy.debugfsdir)
|
|
+ if (!IS_ERR_OR_NULL(rdev->wiphy.debugfsdir))
|
|
debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
|
|
rdev->wiphy.debugfsdir,
|
|
rdev->wiphy.debugfsdir->d_parent, newname);
|
|
diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c
|
|
index c5dba371a765..993f14acbb9f 100644
|
|
--- a/net/xdp/xdp_umem.c
|
|
+++ b/net/xdp/xdp_umem.c
|
|
@@ -341,8 +341,8 @@ static int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr)
|
|
{
|
|
bool unaligned_chunks = mr->flags & XDP_UMEM_UNALIGNED_CHUNK_FLAG;
|
|
u32 chunk_size = mr->chunk_size, headroom = mr->headroom;
|
|
+ u64 npgs, addr = mr->addr, size = mr->len;
|
|
unsigned int chunks, chunks_per_page;
|
|
- u64 addr = mr->addr, size = mr->len;
|
|
int err;
|
|
|
|
if (chunk_size < XDP_UMEM_MIN_CHUNK_SIZE || chunk_size > PAGE_SIZE) {
|
|
@@ -372,6 +372,10 @@ static int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr)
|
|
if ((addr + size) < addr)
|
|
return -EINVAL;
|
|
|
|
+ npgs = div_u64(size, PAGE_SIZE);
|
|
+ if (npgs > U32_MAX)
|
|
+ return -EINVAL;
|
|
+
|
|
chunks = (unsigned int)div_u64(size, chunk_size);
|
|
if (chunks == 0)
|
|
return -EINVAL;
|
|
@@ -391,7 +395,7 @@ static int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr)
|
|
umem->size = size;
|
|
umem->headroom = headroom;
|
|
umem->chunk_size_nohr = chunk_size - headroom;
|
|
- umem->npgs = size / PAGE_SIZE;
|
|
+ umem->npgs = (u32)npgs;
|
|
umem->pgs = NULL;
|
|
umem->user = NULL;
|
|
umem->flags = mr->flags;
|
|
diff --git a/net/xfrm/xfrm_device.c b/net/xfrm/xfrm_device.c
|
|
index 64486ad81341..c365b918be35 100644
|
|
--- a/net/xfrm/xfrm_device.c
|
|
+++ b/net/xfrm/xfrm_device.c
|
|
@@ -25,12 +25,10 @@ static void __xfrm_transport_prep(struct xfrm_state *x, struct sk_buff *skb,
|
|
struct xfrm_offload *xo = xfrm_offload(skb);
|
|
|
|
skb_reset_mac_len(skb);
|
|
- pskb_pull(skb, skb->mac_len + hsize + x->props.header_len);
|
|
-
|
|
- if (xo->flags & XFRM_GSO_SEGMENT) {
|
|
- skb_reset_transport_header(skb);
|
|
+ if (xo->flags & XFRM_GSO_SEGMENT)
|
|
skb->transport_header -= x->props.header_len;
|
|
- }
|
|
+
|
|
+ pskb_pull(skb, skb_transport_offset(skb) + x->props.header_len);
|
|
}
|
|
|
|
static void __xfrm_mode_tunnel_prep(struct xfrm_state *x, struct sk_buff *skb,
|
|
diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c
|
|
index 2c86a2fc3915..7a8474547791 100644
|
|
--- a/net/xfrm/xfrm_input.c
|
|
+++ b/net/xfrm/xfrm_input.c
|
|
@@ -643,7 +643,7 @@ resume:
|
|
dev_put(skb->dev);
|
|
|
|
spin_lock(&x->lock);
|
|
- if (nexthdr <= 0) {
|
|
+ if (nexthdr < 0) {
|
|
if (nexthdr == -EBADMSG) {
|
|
xfrm_audit_state_icvfail(x, skb,
|
|
x->type->proto);
|
|
diff --git a/net/xfrm/xfrm_interface.c b/net/xfrm/xfrm_interface.c
|
|
index 4d5627e274fe..0ab2b35c95de 100644
|
|
--- a/net/xfrm/xfrm_interface.c
|
|
+++ b/net/xfrm/xfrm_interface.c
|
|
@@ -772,7 +772,28 @@ static void __net_exit xfrmi_exit_net(struct net *net)
|
|
rtnl_unlock();
|
|
}
|
|
|
|
+static void __net_exit xfrmi_exit_batch_net(struct list_head *net_exit_list)
|
|
+{
|
|
+ struct net *net;
|
|
+ LIST_HEAD(list);
|
|
+
|
|
+ rtnl_lock();
|
|
+ list_for_each_entry(net, net_exit_list, exit_list) {
|
|
+ struct xfrmi_net *xfrmn = net_generic(net, xfrmi_net_id);
|
|
+ struct xfrm_if __rcu **xip;
|
|
+ struct xfrm_if *xi;
|
|
+
|
|
+ for (xip = &xfrmn->xfrmi[0];
|
|
+ (xi = rtnl_dereference(*xip)) != NULL;
|
|
+ xip = &xi->next)
|
|
+ unregister_netdevice_queue(xi->dev, &list);
|
|
+ }
|
|
+ unregister_netdevice_many(&list);
|
|
+ rtnl_unlock();
|
|
+}
|
|
+
|
|
static struct pernet_operations xfrmi_net_ops = {
|
|
+ .exit_batch = xfrmi_exit_batch_net,
|
|
.exit = xfrmi_exit_net,
|
|
.id = &xfrmi_net_id,
|
|
.size = sizeof(struct xfrmi_net),
|
|
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c
|
|
index b1db55b50ba1..9a6a8c4008ab 100644
|
|
--- a/net/xfrm/xfrm_output.c
|
|
+++ b/net/xfrm/xfrm_output.c
|
|
@@ -586,18 +586,20 @@ int xfrm_output(struct sock *sk, struct sk_buff *skb)
|
|
xfrm_state_hold(x);
|
|
|
|
if (skb_is_gso(skb)) {
|
|
- skb_shinfo(skb)->gso_type |= SKB_GSO_ESP;
|
|
+ if (skb->inner_protocol)
|
|
+ return xfrm_output_gso(net, sk, skb);
|
|
|
|
- return xfrm_output2(net, sk, skb);
|
|
+ skb_shinfo(skb)->gso_type |= SKB_GSO_ESP;
|
|
+ goto out;
|
|
}
|
|
|
|
if (x->xso.dev && x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM)
|
|
goto out;
|
|
+ } else {
|
|
+ if (skb_is_gso(skb))
|
|
+ return xfrm_output_gso(net, sk, skb);
|
|
}
|
|
|
|
- if (skb_is_gso(skb))
|
|
- return xfrm_output_gso(net, sk, skb);
|
|
-
|
|
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
|
err = skb_checksum_help(skb);
|
|
if (err) {
|
|
@@ -643,7 +645,8 @@ void xfrm_local_error(struct sk_buff *skb, int mtu)
|
|
|
|
if (skb->protocol == htons(ETH_P_IP))
|
|
proto = AF_INET;
|
|
- else if (skb->protocol == htons(ETH_P_IPV6))
|
|
+ else if (skb->protocol == htons(ETH_P_IPV6) &&
|
|
+ skb->sk->sk_family == AF_INET6)
|
|
proto = AF_INET6;
|
|
else
|
|
return;
|
|
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
|
|
index 264cf05a4eaa..6a1a21ae47bb 100644
|
|
--- a/net/xfrm/xfrm_policy.c
|
|
+++ b/net/xfrm/xfrm_policy.c
|
|
@@ -1433,12 +1433,7 @@ static void xfrm_policy_requeue(struct xfrm_policy *old,
|
|
static bool xfrm_policy_mark_match(struct xfrm_policy *policy,
|
|
struct xfrm_policy *pol)
|
|
{
|
|
- u32 mark = policy->mark.v & policy->mark.m;
|
|
-
|
|
- if (policy->mark.v == pol->mark.v && policy->mark.m == pol->mark.m)
|
|
- return true;
|
|
-
|
|
- if ((mark & pol->mark.m) == pol->mark.v &&
|
|
+ if (policy->mark.v == pol->mark.v &&
|
|
policy->priority == pol->priority)
|
|
return true;
|
|
|
|
diff --git a/samples/bpf/lwt_len_hist_user.c b/samples/bpf/lwt_len_hist_user.c
|
|
index 587b68b1f8dd..430a4b7e353e 100644
|
|
--- a/samples/bpf/lwt_len_hist_user.c
|
|
+++ b/samples/bpf/lwt_len_hist_user.c
|
|
@@ -15,8 +15,6 @@
|
|
#define MAX_INDEX 64
|
|
#define MAX_STARS 38
|
|
|
|
-char bpf_log_buf[BPF_LOG_BUF_SIZE];
|
|
-
|
|
static void stars(char *str, long val, long max, int width)
|
|
{
|
|
int i;
|
|
diff --git a/security/commoncap.c b/security/commoncap.c
|
|
index f4ee0ae106b2..0ca31c8bc0b1 100644
|
|
--- a/security/commoncap.c
|
|
+++ b/security/commoncap.c
|
|
@@ -812,6 +812,7 @@ int cap_bprm_set_creds(struct linux_binprm *bprm)
|
|
int ret;
|
|
kuid_t root_uid;
|
|
|
|
+ new->cap_ambient = old->cap_ambient;
|
|
if (WARN_ON(!cap_ambient_invariant_ok(old)))
|
|
return -EPERM;
|
|
|
|
diff --git a/sound/core/hwdep.c b/sound/core/hwdep.c
|
|
index 00cb5aed10a9..28bec15b0959 100644
|
|
--- a/sound/core/hwdep.c
|
|
+++ b/sound/core/hwdep.c
|
|
@@ -216,12 +216,12 @@ static int snd_hwdep_dsp_load(struct snd_hwdep *hw,
|
|
if (info.index >= 32)
|
|
return -EINVAL;
|
|
/* check whether the dsp was already loaded */
|
|
- if (hw->dsp_loaded & (1 << info.index))
|
|
+ if (hw->dsp_loaded & (1u << info.index))
|
|
return -EBUSY;
|
|
err = hw->ops.dsp_load(hw, &info);
|
|
if (err < 0)
|
|
return err;
|
|
- hw->dsp_loaded |= (1 << info.index);
|
|
+ hw->dsp_loaded |= (1u << info.index);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
|
index c5bec191e003..da4d21445e80 100644
|
|
--- a/sound/pci/hda/patch_realtek.c
|
|
+++ b/sound/pci/hda/patch_realtek.c
|
|
@@ -384,6 +384,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
|
|
case 0x10ec0282:
|
|
case 0x10ec0283:
|
|
case 0x10ec0286:
|
|
+ case 0x10ec0287:
|
|
case 0x10ec0288:
|
|
case 0x10ec0285:
|
|
case 0x10ec0298:
|
|
@@ -5484,18 +5485,9 @@ static void alc_fixup_tpt470_dock(struct hda_codec *codec,
|
|
{ 0x19, 0x21a11010 }, /* dock mic */
|
|
{ }
|
|
};
|
|
- /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
|
|
- * the speaker output becomes too low by some reason on Thinkpads with
|
|
- * ALC298 codec
|
|
- */
|
|
- static const hda_nid_t preferred_pairs[] = {
|
|
- 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
|
|
- 0
|
|
- };
|
|
struct alc_spec *spec = codec->spec;
|
|
|
|
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
|
|
- spec->gen.preferred_dacs = preferred_pairs;
|
|
spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
|
|
snd_hda_apply_pincfgs(codec, pincfgs);
|
|
} else if (action == HDA_FIXUP_ACT_INIT) {
|
|
@@ -5508,6 +5500,23 @@ static void alc_fixup_tpt470_dock(struct hda_codec *codec,
|
|
}
|
|
}
|
|
|
|
+static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
|
|
+ const struct hda_fixup *fix, int action)
|
|
+{
|
|
+ /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
|
|
+ * the speaker output becomes too low by some reason on Thinkpads with
|
|
+ * ALC298 codec
|
|
+ */
|
|
+ static const hda_nid_t preferred_pairs[] = {
|
|
+ 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
|
|
+ 0
|
|
+ };
|
|
+ struct alc_spec *spec = codec->spec;
|
|
+
|
|
+ if (action == HDA_FIXUP_ACT_PRE_PROBE)
|
|
+ spec->gen.preferred_dacs = preferred_pairs;
|
|
+}
|
|
+
|
|
static void alc_shutup_dell_xps13(struct hda_codec *codec)
|
|
{
|
|
struct alc_spec *spec = codec->spec;
|
|
@@ -6063,6 +6072,7 @@ enum {
|
|
ALC700_FIXUP_INTEL_REFERENCE,
|
|
ALC274_FIXUP_DELL_BIND_DACS,
|
|
ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
|
|
+ ALC298_FIXUP_TPT470_DOCK_FIX,
|
|
ALC298_FIXUP_TPT470_DOCK,
|
|
ALC255_FIXUP_DUMMY_LINEOUT_VERB,
|
|
ALC255_FIXUP_DELL_HEADSET_MIC,
|
|
@@ -6994,12 +7004,18 @@ static const struct hda_fixup alc269_fixups[] = {
|
|
.chained = true,
|
|
.chain_id = ALC274_FIXUP_DELL_BIND_DACS
|
|
},
|
|
- [ALC298_FIXUP_TPT470_DOCK] = {
|
|
+ [ALC298_FIXUP_TPT470_DOCK_FIX] = {
|
|
.type = HDA_FIXUP_FUNC,
|
|
.v.func = alc_fixup_tpt470_dock,
|
|
.chained = true,
|
|
.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
|
|
},
|
|
+ [ALC298_FIXUP_TPT470_DOCK] = {
|
|
+ .type = HDA_FIXUP_FUNC,
|
|
+ .v.func = alc_fixup_tpt470_dacs,
|
|
+ .chained = true,
|
|
+ .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
|
|
+ },
|
|
[ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
|
|
.type = HDA_FIXUP_PINS,
|
|
.v.pins = (const struct hda_pintbl[]) {
|
|
@@ -7638,6 +7654,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
|
{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
|
|
{.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
|
|
{.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
|
|
+ {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
|
|
{.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
|
|
{.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
|
|
{.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
|
|
@@ -8305,6 +8322,7 @@ static int patch_alc269(struct hda_codec *codec)
|
|
case 0x10ec0215:
|
|
case 0x10ec0245:
|
|
case 0x10ec0285:
|
|
+ case 0x10ec0287:
|
|
case 0x10ec0289:
|
|
spec->codec_variant = ALC269_TYPE_ALC215;
|
|
spec->shutup = alc225_shutup;
|
|
@@ -9583,6 +9601,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = {
|
|
HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
|
|
HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
|
|
HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
|
|
+ HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
|
|
HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
|
|
HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
|
|
HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
|
|
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
|
|
index 583edacc9fe8..f55afe3a98e3 100644
|
|
--- a/sound/usb/mixer.c
|
|
+++ b/sound/usb/mixer.c
|
|
@@ -1171,6 +1171,14 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
|
|
cval->res = 384;
|
|
}
|
|
break;
|
|
+ case USB_ID(0x0495, 0x3042): /* ESS Technology Asus USB DAC */
|
|
+ if ((strstr(kctl->id.name, "Playback Volume") != NULL) ||
|
|
+ strstr(kctl->id.name, "Capture Volume") != NULL) {
|
|
+ cval->min >>= 8;
|
|
+ cval->max = 0;
|
|
+ cval->res = 1;
|
|
+ }
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
|
|
index 39d6c6fa5e33..ac84f0b2b0bc 100644
|
|
--- a/sound/usb/mixer_maps.c
|
|
+++ b/sound/usb/mixer_maps.c
|
|
@@ -387,6 +387,21 @@ static const struct usbmix_connector_map trx40_mobo_connector_map[] = {
|
|
{}
|
|
};
|
|
|
|
+/* Rear panel + front mic on Gigabyte TRX40 Aorus Master with ALC1220-VB */
|
|
+static const struct usbmix_name_map aorus_master_alc1220vb_map[] = {
|
|
+ { 17, NULL }, /* OT, IEC958?, disabled */
|
|
+ { 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */
|
|
+ { 16, "Line Out" }, /* OT */
|
|
+ { 22, "Line Out Playback" }, /* FU */
|
|
+ { 7, "Line" }, /* IT */
|
|
+ { 19, "Line Capture" }, /* FU */
|
|
+ { 8, "Mic" }, /* IT */
|
|
+ { 20, "Mic Capture" }, /* FU */
|
|
+ { 9, "Front Mic" }, /* IT */
|
|
+ { 21, "Front Mic Capture" }, /* FU */
|
|
+ {}
|
|
+};
|
|
+
|
|
/*
|
|
* Control map entries
|
|
*/
|
|
@@ -506,6 +521,10 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
|
.id = USB_ID(0x05a7, 0x1020),
|
|
.map = bose_companion5_map,
|
|
},
|
|
+ { /* Gigabyte TRX40 Aorus Master (rear panel + front mic) */
|
|
+ .id = USB_ID(0x0414, 0xa001),
|
|
+ .map = aorus_master_alc1220vb_map,
|
|
+ },
|
|
{ /* Gigabyte TRX40 Aorus Pro WiFi */
|
|
.id = USB_ID(0x0414, 0xa002),
|
|
.map = trx40_mobo_map,
|
|
@@ -529,6 +548,11 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
|
.map = trx40_mobo_map,
|
|
.connector_map = trx40_mobo_connector_map,
|
|
},
|
|
+ { /* Asrock TRX40 Creator */
|
|
+ .id = USB_ID(0x26ce, 0x0a01),
|
|
+ .map = trx40_mobo_map,
|
|
+ .connector_map = trx40_mobo_connector_map,
|
|
+ },
|
|
{ 0 } /* terminator */
|
|
};
|
|
|
|
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
|
|
index 8c2f5c23e1b4..bbae11605a4c 100644
|
|
--- a/sound/usb/quirks-table.h
|
|
+++ b/sound/usb/quirks-table.h
|
|
@@ -3647,6 +3647,32 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
|
|
ALC1220_VB_DESKTOP(0x0414, 0xa002), /* Gigabyte TRX40 Aorus Pro WiFi */
|
|
ALC1220_VB_DESKTOP(0x0db0, 0x0d64), /* MSI TRX40 Creator */
|
|
ALC1220_VB_DESKTOP(0x0db0, 0x543d), /* MSI TRX40 */
|
|
+ALC1220_VB_DESKTOP(0x26ce, 0x0a01), /* Asrock TRX40 Creator */
|
|
#undef ALC1220_VB_DESKTOP
|
|
|
|
+/* Two entries for Gigabyte TRX40 Aorus Master:
|
|
+ * TRX40 Aorus Master has two USB-audio devices, one for the front headphone
|
|
+ * with ESS SABRE9218 DAC chip, while another for the rest I/O (the rear
|
|
+ * panel and the front mic) with Realtek ALC1220-VB.
|
|
+ * Here we provide two distinct names for making UCM profiles easier.
|
|
+ */
|
|
+{
|
|
+ USB_DEVICE(0x0414, 0xa000),
|
|
+ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
|
+ .vendor_name = "Gigabyte",
|
|
+ .product_name = "Aorus Master Front Headphone",
|
|
+ .profile_name = "Gigabyte-Aorus-Master-Front-Headphone",
|
|
+ .ifnum = QUIRK_NO_INTERFACE
|
|
+ }
|
|
+},
|
|
+{
|
|
+ USB_DEVICE(0x0414, 0xa001),
|
|
+ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
|
+ .vendor_name = "Gigabyte",
|
|
+ .product_name = "Aorus Master Main Audio",
|
|
+ .profile_name = "Gigabyte-Aorus-Master-Main-Audio",
|
|
+ .ifnum = QUIRK_NO_INTERFACE
|
|
+ }
|
|
+},
|
|
+
|
|
#undef USB_DEVICE_VENDOR_SPEC
|
|
diff --git a/tools/arch/x86/include/uapi/asm/unistd.h b/tools/arch/x86/include/uapi/asm/unistd.h
|
|
index 196fdd02b8b1..30d7d04d72d6 100644
|
|
--- a/tools/arch/x86/include/uapi/asm/unistd.h
|
|
+++ b/tools/arch/x86/include/uapi/asm/unistd.h
|
|
@@ -3,7 +3,7 @@
|
|
#define _UAPI_ASM_X86_UNISTD_H
|
|
|
|
/* x32 syscall flag bit */
|
|
-#define __X32_SYSCALL_BIT 0x40000000UL
|
|
+#define __X32_SYSCALL_BIT 0x40000000
|
|
|
|
#ifndef __KERNEL__
|
|
# ifdef __i386__
|
|
diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c
|
|
index 6ccf6f6d09df..5b7d6c16d33f 100644
|
|
--- a/tools/perf/util/srcline.c
|
|
+++ b/tools/perf/util/srcline.c
|
|
@@ -193,16 +193,30 @@ static void find_address_in_section(bfd *abfd, asection *section, void *data)
|
|
bfd_vma pc, vma;
|
|
bfd_size_type size;
|
|
struct a2l_data *a2l = data;
|
|
+ flagword flags;
|
|
|
|
if (a2l->found)
|
|
return;
|
|
|
|
- if ((bfd_get_section_flags(abfd, section) & SEC_ALLOC) == 0)
|
|
+#ifdef bfd_get_section_flags
|
|
+ flags = bfd_get_section_flags(abfd, section);
|
|
+#else
|
|
+ flags = bfd_section_flags(section);
|
|
+#endif
|
|
+ if ((flags & SEC_ALLOC) == 0)
|
|
return;
|
|
|
|
pc = a2l->addr;
|
|
+#ifdef bfd_get_section_vma
|
|
vma = bfd_get_section_vma(abfd, section);
|
|
+#else
|
|
+ vma = bfd_section_vma(section);
|
|
+#endif
|
|
+#ifdef bfd_get_section_size
|
|
size = bfd_get_section_size(section);
|
|
+#else
|
|
+ size = bfd_section_size(section);
|
|
+#endif
|
|
|
|
if (pc < vma || pc >= vma + size)
|
|
return;
|