public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Mike Pagano" <mpagano@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/linux-patches:5.15 commit in: /
Date: Thu, 25 Nov 2021 12:03:20 +0000 (UTC)	[thread overview]
Message-ID: <1637841787.10a5176e3cc2a9de7fc23b2caff20708456e0492.mpagano@gentoo> (raw)

commit:     10a5176e3cc2a9de7fc23b2caff20708456e0492
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Thu Nov 25 12:03:07 2021 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Thu Nov 25 12:03:07 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=10a5176e

Linux patch 5.15.5

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README             |     4 +
 1004_linux-5.15.5.patch | 12471 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 12475 insertions(+)

diff --git a/0000_README b/0000_README
index da91b24d..68d0c0db 100644
--- a/0000_README
+++ b/0000_README
@@ -59,6 +59,10 @@ Patch:  1003_linux-5.15.4.patch
 From:   http://www.kernel.org
 Desc:   Linux 5.15.4
 
+Patch:  1004_linux-5.15.5.patch
+From:   http://www.kernel.org
+Desc:   Linux 5.15.5
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1004_linux-5.15.5.patch b/1004_linux-5.15.5.patch
new file mode 100644
index 00000000..6dc653b7
--- /dev/null
+++ b/1004_linux-5.15.5.patch
@@ -0,0 +1,12471 @@
+diff --git a/Makefile b/Makefile
+index 759e68a02cf01..820ccbe7586fe 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 15
+-SUBLEVEL = 4
++SUBLEVEL = 5
+ EXTRAVERSION =
+ NAME = Trick or Treat
+ 
+diff --git a/arch/arc/kernel/process.c b/arch/arc/kernel/process.c
+index 3793876f42d9b..8e90052f6f056 100644
+--- a/arch/arc/kernel/process.c
++++ b/arch/arc/kernel/process.c
+@@ -294,7 +294,7 @@ int elf_check_arch(const struct elf32_hdr *x)
+ 	eflags = x->e_flags;
+ 	if ((eflags & EF_ARC_OSABI_MSK) != EF_ARC_OSABI_CURRENT) {
+ 		pr_err("ABI mismatch - you need newer toolchain\n");
+-		force_sigsegv(SIGSEGV);
++		force_fatal_sig(SIGSEGV);
+ 		return 0;
+ 	}
+ 
+diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
+index dcf2df6da98f0..4ebd512043be5 100644
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -1455,6 +1455,7 @@ config HIGHMEM
+ 	bool "High Memory Support"
+ 	depends on MMU
+ 	select KMAP_LOCAL
++	select KMAP_LOCAL_NON_LINEAR_PTE_ARRAY
+ 	help
+ 	  The address space of ARM processors is only 4 Gigabytes large
+ 	  and it has to accommodate user address space, kernel address
+diff --git a/arch/arm/boot/dts/bcm-nsp.dtsi b/arch/arm/boot/dts/bcm-nsp.dtsi
+index 748df7955ae67..e96ddb2e26e2c 100644
+--- a/arch/arm/boot/dts/bcm-nsp.dtsi
++++ b/arch/arm/boot/dts/bcm-nsp.dtsi
+@@ -77,7 +77,7 @@
+ 		interrupt-affinity = <&cpu0>, <&cpu1>;
+ 	};
+ 
+-	mpcore@19000000 {
++	mpcore-bus@19000000 {
+ 		compatible = "simple-bus";
+ 		ranges = <0x00000000 0x19000000 0x00023000>;
+ 		#address-cells = <1>;
+@@ -219,7 +219,7 @@
+ 			status = "disabled";
+ 		};
+ 
+-		sdio: sdhci@21000 {
++		sdio: mmc@21000 {
+ 			compatible = "brcm,sdhci-iproc-cygnus";
+ 			reg = <0x21000 0x100>;
+ 			interrupts = <GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>;
+diff --git a/arch/arm/boot/dts/bcm47094-linksys-panamera.dts b/arch/arm/boot/dts/bcm47094-linksys-panamera.dts
+index 05d4f2931772b..9bef6b9bfa8d9 100644
+--- a/arch/arm/boot/dts/bcm47094-linksys-panamera.dts
++++ b/arch/arm/boot/dts/bcm47094-linksys-panamera.dts
+@@ -129,7 +129,7 @@
+ 		};
+ 	};
+ 
+-	mdio-bus-mux@18003000 {
++	mdio-mux@18003000 {
+ 
+ 		/* BIT(9) = 1 => external mdio */
+ 		mdio@200 {
+diff --git a/arch/arm/boot/dts/bcm53016-meraki-mr32.dts b/arch/arm/boot/dts/bcm53016-meraki-mr32.dts
+index 612d61852bfb9..577a4dc604d93 100644
+--- a/arch/arm/boot/dts/bcm53016-meraki-mr32.dts
++++ b/arch/arm/boot/dts/bcm53016-meraki-mr32.dts
+@@ -195,3 +195,25 @@
+ 		};
+ 	};
+ };
++
++&srab {
++	status = "okay";
++
++	ports {
++		port@0 {
++			reg = <0>;
++			label = "poe";
++		};
++
++		port@5 {
++			reg = <5>;
++			label = "cpu";
++			ethernet = <&gmac0>;
++
++			fixed-link {
++				speed = <1000>;
++				duplex-full;
++			};
++		};
++	};
++};
+diff --git a/arch/arm/boot/dts/bcm5301x.dtsi b/arch/arm/boot/dts/bcm5301x.dtsi
+index f92089290ccd5..d4f355015e3ca 100644
+--- a/arch/arm/boot/dts/bcm5301x.dtsi
++++ b/arch/arm/boot/dts/bcm5301x.dtsi
+@@ -19,7 +19,7 @@
+ 	#size-cells = <1>;
+ 	interrupt-parent = <&gic>;
+ 
+-	chipcommonA@18000000 {
++	chipcommon-a-bus@18000000 {
+ 		compatible = "simple-bus";
+ 		ranges = <0x00000000 0x18000000 0x00001000>;
+ 		#address-cells = <1>;
+@@ -44,7 +44,7 @@
+ 		};
+ 	};
+ 
+-	mpcore@19000000 {
++	mpcore-bus@19000000 {
+ 		compatible = "simple-bus";
+ 		ranges = <0x00000000 0x19000000 0x00023000>;
+ 		#address-cells = <1>;
+@@ -369,8 +369,8 @@
+ 		#address-cells = <1>;
+ 	};
+ 
+-	mdio-bus-mux@18003000 {
+-		compatible = "mdio-mux-mmioreg";
++	mdio-mux@18003000 {
++		compatible = "mdio-mux-mmioreg", "mdio-mux";
+ 		mdio-parent-bus = <&mdio>;
+ 		#address-cells = <1>;
+ 		#size-cells = <0>;
+@@ -415,7 +415,7 @@
+ 		status = "disabled";
+ 	};
+ 
+-	dmu@1800c000 {
++	dmu-bus@1800c000 {
+ 		compatible = "simple-bus";
+ 		ranges = <0 0x1800c000 0x1000>;
+ 		#address-cells = <1>;
+diff --git a/arch/arm/boot/dts/ls1021a-tsn.dts b/arch/arm/boot/dts/ls1021a-tsn.dts
+index 9d8f0c2a8aba3..aca78b5eddf20 100644
+--- a/arch/arm/boot/dts/ls1021a-tsn.dts
++++ b/arch/arm/boot/dts/ls1021a-tsn.dts
+@@ -251,7 +251,7 @@
+ 
+ 	flash@0 {
+ 		/* Rev. A uses 64MB flash, Rev. B & C use 32MB flash */
+-		compatible = "jedec,spi-nor", "s25fl256s1", "s25fl512s";
++		compatible = "jedec,spi-nor";
+ 		spi-max-frequency = <20000000>;
+ 		#address-cells = <1>;
+ 		#size-cells = <1>;
+diff --git a/arch/arm/boot/dts/ls1021a.dtsi b/arch/arm/boot/dts/ls1021a.dtsi
+index 4fce81422943b..f3b8540750b61 100644
+--- a/arch/arm/boot/dts/ls1021a.dtsi
++++ b/arch/arm/boot/dts/ls1021a.dtsi
+@@ -329,39 +329,6 @@
+ 			#thermal-sensor-cells = <1>;
+ 		};
+ 
+-		thermal-zones {
+-			cpu_thermal: cpu-thermal {
+-				polling-delay-passive = <1000>;
+-				polling-delay = <5000>;
+-
+-				thermal-sensors = <&tmu 0>;
+-
+-				trips {
+-					cpu_alert: cpu-alert {
+-						temperature = <85000>;
+-						hysteresis = <2000>;
+-						type = "passive";
+-					};
+-					cpu_crit: cpu-crit {
+-						temperature = <95000>;
+-						hysteresis = <2000>;
+-						type = "critical";
+-					};
+-				};
+-
+-				cooling-maps {
+-					map0 {
+-						trip = <&cpu_alert>;
+-						cooling-device =
+-							<&cpu0 THERMAL_NO_LIMIT
+-							THERMAL_NO_LIMIT>,
+-							<&cpu1 THERMAL_NO_LIMIT
+-							THERMAL_NO_LIMIT>;
+-					};
+-				};
+-			};
+-		};
+-
+ 		dspi0: spi@2100000 {
+ 			compatible = "fsl,ls1021a-v1.0-dspi";
+ 			#address-cells = <1>;
+@@ -1016,4 +983,37 @@
+ 			big-endian;
+ 		};
+ 	};
++
++	thermal-zones {
++		cpu_thermal: cpu-thermal {
++			polling-delay-passive = <1000>;
++			polling-delay = <5000>;
++
++			thermal-sensors = <&tmu 0>;
++
++			trips {
++				cpu_alert: cpu-alert {
++					temperature = <85000>;
++					hysteresis = <2000>;
++					type = "passive";
++				};
++				cpu_crit: cpu-crit {
++					temperature = <95000>;
++					hysteresis = <2000>;
++					type = "critical";
++				};
++			};
++
++			cooling-maps {
++				map0 {
++					trip = <&cpu_alert>;
++					cooling-device =
++						<&cpu0 THERMAL_NO_LIMIT
++						THERMAL_NO_LIMIT>,
++						<&cpu1 THERMAL_NO_LIMIT
++						THERMAL_NO_LIMIT>;
++				};
++			};
++		};
++	};
+ };
+diff --git a/arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi b/arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi
+index 7f6aefd134514..e7534fe9c53cf 100644
+--- a/arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi
++++ b/arch/arm/boot/dts/omap-gpmc-smsc9221.dtsi
+@@ -29,7 +29,7 @@
+ 		compatible = "smsc,lan9221","smsc,lan9115";
+ 		bank-width = <2>;
+ 
+-		gpmc,mux-add-data;
++		gpmc,mux-add-data = <0>;
+ 		gpmc,cs-on-ns = <0>;
+ 		gpmc,cs-rd-off-ns = <42>;
+ 		gpmc,cs-wr-off-ns = <36>;
+diff --git a/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi b/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi
+index e5da3bc6f1050..218a10c0d8159 100644
+--- a/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi
++++ b/arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi
+@@ -22,7 +22,7 @@
+ 		compatible = "smsc,lan9221","smsc,lan9115";
+ 		bank-width = <2>;
+ 
+-		gpmc,mux-add-data;
++		gpmc,mux-add-data = <0>;
+ 		gpmc,cs-on-ns = <0>;
+ 		gpmc,cs-rd-off-ns = <42>;
+ 		gpmc,cs-wr-off-ns = <36>;
+diff --git a/arch/arm/boot/dts/qcom-ipq8064-rb3011.dts b/arch/arm/boot/dts/qcom-ipq8064-rb3011.dts
+index f7ea2e5dd1914..971d2e2292600 100644
+--- a/arch/arm/boot/dts/qcom-ipq8064-rb3011.dts
++++ b/arch/arm/boot/dts/qcom-ipq8064-rb3011.dts
+@@ -19,12 +19,12 @@
+ 		stdout-path = "serial0:115200n8";
+ 	};
+ 
+-	memory@0 {
++	memory@42000000 {
+ 		reg = <0x42000000 0x3e000000>;
+ 		device_type = "memory";
+ 	};
+ 
+-	mdio0: mdio@0 {
++	mdio0: mdio-0 {
+ 		status = "okay";
+ 		compatible = "virtual,mdio-gpio";
+ 		gpios = <&qcom_pinmux 1 GPIO_ACTIVE_HIGH>,
+@@ -91,7 +91,7 @@
+ 		};
+ 	};
+ 
+-	mdio1: mdio@1 {
++	mdio1: mdio-1 {
+ 		status = "okay";
+ 		compatible = "virtual,mdio-gpio";
+ 		gpios = <&qcom_pinmux 11 GPIO_ACTIVE_HIGH>,
+diff --git a/arch/arm/boot/dts/ste-ux500-samsung-skomer.dts b/arch/arm/boot/dts/ste-ux500-samsung-skomer.dts
+index 264f3e9b5fce5..86e83639fadc1 100644
+--- a/arch/arm/boot/dts/ste-ux500-samsung-skomer.dts
++++ b/arch/arm/boot/dts/ste-ux500-samsung-skomer.dts
+@@ -292,10 +292,10 @@
+ 					};
+ 
+ 					ab8500_ldo_aux2 {
+-						/* Supplies the Cypress TMA140 touchscreen only with 3.3V */
++						/* Supplies the Cypress TMA140 touchscreen only with 3.0V */
+ 						regulator-name = "AUX2";
+-						regulator-min-microvolt = <3300000>;
+-						regulator-max-microvolt = <3300000>;
++						regulator-min-microvolt = <3000000>;
++						regulator-max-microvolt = <3000000>;
+ 					};
+ 
+ 					ab8500_ldo_aux3 {
+@@ -314,9 +314,9 @@
+ 
+ 					ab8500_ldo_aux5 {
+ 						regulator-name = "AUX5";
++						/* Intended for 1V8 for touchscreen but actually left unused */
+ 						regulator-min-microvolt = <1050000>;
+ 						regulator-max-microvolt = <2790000>;
+-						regulator-always-on;
+ 					};
+ 
+ 					ab8500_ldo_aux6 {
+diff --git a/arch/arm/boot/dts/sun8i-a33.dtsi b/arch/arm/boot/dts/sun8i-a33.dtsi
+index 2beddbb3c5183..b3d1bdfb5118e 100644
+--- a/arch/arm/boot/dts/sun8i-a33.dtsi
++++ b/arch/arm/boot/dts/sun8i-a33.dtsi
+@@ -46,7 +46,7 @@
+ #include <dt-bindings/thermal/thermal.h>
+ 
+ / {
+-	cpu0_opp_table: opp_table0 {
++	cpu0_opp_table: opp-table-cpu {
+ 		compatible = "operating-points-v2";
+ 		opp-shared;
+ 
+@@ -164,7 +164,7 @@
+ 		io-channels = <&ths>;
+ 	};
+ 
+-	mali_opp_table: gpu-opp-table {
++	mali_opp_table: opp-table-gpu {
+ 		compatible = "operating-points-v2";
+ 
+ 		opp-144000000 {
+diff --git a/arch/arm/boot/dts/sun8i-a83t.dtsi b/arch/arm/boot/dts/sun8i-a83t.dtsi
+index ac97eac91349b..82fdb04122caa 100644
+--- a/arch/arm/boot/dts/sun8i-a83t.dtsi
++++ b/arch/arm/boot/dts/sun8i-a83t.dtsi
+@@ -200,7 +200,7 @@
+ 		status = "disabled";
+ 	};
+ 
+-	cpu0_opp_table: opp_table0 {
++	cpu0_opp_table: opp-table-cluster0 {
+ 		compatible = "operating-points-v2";
+ 		opp-shared;
+ 
+@@ -253,7 +253,7 @@
+ 		};
+ 	};
+ 
+-	cpu1_opp_table: opp_table1 {
++	cpu1_opp_table: opp-table-cluster1 {
+ 		compatible = "operating-points-v2";
+ 		opp-shared;
+ 
+diff --git a/arch/arm/boot/dts/sun8i-h3.dtsi b/arch/arm/boot/dts/sun8i-h3.dtsi
+index 4e89701df91f8..ae4f933abb895 100644
+--- a/arch/arm/boot/dts/sun8i-h3.dtsi
++++ b/arch/arm/boot/dts/sun8i-h3.dtsi
+@@ -44,7 +44,7 @@
+ #include <dt-bindings/thermal/thermal.h>
+ 
+ / {
+-	cpu0_opp_table: opp_table0 {
++	cpu0_opp_table: opp-table-cpu {
+ 		compatible = "operating-points-v2";
+ 		opp-shared;
+ 
+@@ -112,7 +112,7 @@
+ 		};
+ 	};
+ 
+-	gpu_opp_table: gpu-opp-table {
++	gpu_opp_table: opp-table-gpu {
+ 		compatible = "operating-points-v2";
+ 
+ 		opp-120000000 {
+diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a100.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a100.dtsi
+index cc321c04f1219..f6d7d7f7fdabe 100644
+--- a/arch/arm64/boot/dts/allwinner/sun50i-a100.dtsi
++++ b/arch/arm64/boot/dts/allwinner/sun50i-a100.dtsi
+@@ -343,19 +343,19 @@
+ 	};
+ 
+ 	thermal-zones {
+-		cpu-thermal-zone {
++		cpu-thermal {
+ 			polling-delay-passive = <0>;
+ 			polling-delay = <0>;
+ 			thermal-sensors = <&ths 0>;
+ 		};
+ 
+-		ddr-thermal-zone {
++		ddr-thermal {
+ 			polling-delay-passive = <0>;
+ 			polling-delay = <0>;
+ 			thermal-sensors = <&ths 2>;
+ 		};
+ 
+-		gpu-thermal-zone {
++		gpu-thermal {
+ 			polling-delay-passive = <0>;
+ 			polling-delay = <0>;
+ 			thermal-sensors = <&ths 1>;
+diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi
+index 578c37490d901..e39db51eb4489 100644
+--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi
++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-cpu-opp.dtsi
+@@ -4,7 +4,7 @@
+  */
+ 
+ / {
+-	cpu0_opp_table: opp_table0 {
++	cpu0_opp_table: opp-table-cpu {
+ 		compatible = "operating-points-v2";
+ 		opp-shared;
+ 
+diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5-cpu-opp.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h5-cpu-opp.dtsi
+index b2657201957eb..1afad8b437d72 100644
+--- a/arch/arm64/boot/dts/allwinner/sun50i-h5-cpu-opp.dtsi
++++ b/arch/arm64/boot/dts/allwinner/sun50i-h5-cpu-opp.dtsi
+@@ -2,7 +2,7 @@
+ // Copyright (C) 2020 Chen-Yu Tsai <wens@csie.org>
+ 
+ / {
+-	cpu_opp_table: cpu-opp-table {
++	cpu_opp_table: opp-table-cpu {
+ 		compatible = "operating-points-v2";
+ 		opp-shared;
+ 
+diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi
+index 578a63dedf466..9988e87ea7b3d 100644
+--- a/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi
++++ b/arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi
+@@ -217,7 +217,7 @@
+ 			};
+ 		};
+ 
+-		gpu_thermal {
++		gpu-thermal {
+ 			polling-delay-passive = <0>;
+ 			polling-delay = <0>;
+ 			thermal-sensors = <&ths 1>;
+diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-cpu-opp.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6-cpu-opp.dtsi
+index 8c6e8536b69fa..0baf0f8e4d272 100644
+--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-cpu-opp.dtsi
++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-cpu-opp.dtsi
+@@ -3,7 +3,7 @@
+ // Copyright (C) 2020 Clément Péron <peron.clem@gmail.com>
+ 
+ / {
+-	cpu_opp_table: cpu-opp-table {
++	cpu_opp_table: opp-table-cpu {
+ 		compatible = "allwinner,sun50i-h6-operating-points";
+ 		nvmem-cells = <&cpu_speed_grade>;
+ 		opp-shared;
+diff --git a/arch/arm64/boot/dts/broadcom/bcm4908/bcm4908.dtsi b/arch/arm64/boot/dts/broadcom/bcm4908/bcm4908.dtsi
+index f6b93bbb49228..5118816b1ed76 100644
+--- a/arch/arm64/boot/dts/broadcom/bcm4908/bcm4908.dtsi
++++ b/arch/arm64/boot/dts/broadcom/bcm4908/bcm4908.dtsi
+@@ -326,12 +326,12 @@
+ 				#reset-cells = <1>;
+ 			};
+ 		};
++	};
+ 
+-		reboot {
+-			compatible = "syscon-reboot";
+-			regmap = <&timer>;
+-			offset = <0x34>;
+-			mask = <1>;
+-		};
++	reboot {
++		compatible = "syscon-reboot";
++		regmap = <&timer>;
++		offset = <0x34>;
++		mask = <1>;
+ 	};
+ };
+diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1012a-rdb.dts b/arch/arm64/boot/dts/freescale/fsl-ls1012a-rdb.dts
+index 79f155dedb2d0..e662677a6e28f 100644
+--- a/arch/arm64/boot/dts/freescale/fsl-ls1012a-rdb.dts
++++ b/arch/arm64/boot/dts/freescale/fsl-ls1012a-rdb.dts
+@@ -15,6 +15,7 @@
+ 	compatible = "fsl,ls1012a-rdb", "fsl,ls1012a";
+ 
+ 	aliases {
++		serial0 = &duart0;
+ 		mmc0 = &esdhc0;
+ 		mmc1 = &esdhc1;
+ 	};
+diff --git a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
+index f85e437f80b73..6050723172436 100644
+--- a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
++++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
+@@ -847,7 +847,7 @@
+ 		};
+ 
+ 		cluster1_core0_watchdog: wdt@c000000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc000000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(16)>,
+@@ -857,7 +857,7 @@
+ 		};
+ 
+ 		cluster1_core1_watchdog: wdt@c010000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc010000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(16)>,
+@@ -867,7 +867,7 @@
+ 		};
+ 
+ 		cluster1_core2_watchdog: wdt@c020000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc020000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(16)>,
+@@ -877,7 +877,7 @@
+ 		};
+ 
+ 		cluster1_core3_watchdog: wdt@c030000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc030000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(16)>,
+@@ -887,7 +887,7 @@
+ 		};
+ 
+ 		cluster2_core0_watchdog: wdt@c100000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc100000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(16)>,
+@@ -897,7 +897,7 @@
+ 		};
+ 
+ 		cluster2_core1_watchdog: wdt@c110000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc110000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(16)>,
+@@ -907,7 +907,7 @@
+ 		};
+ 
+ 		cluster2_core2_watchdog: wdt@c120000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc120000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(16)>,
+@@ -917,7 +917,7 @@
+ 		};
+ 
+ 		cluster2_core3_watchdog: wdt@c130000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc130000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(16)>,
+diff --git a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
+index 801ba9612d361..1282b61da8a55 100644
+--- a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
++++ b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
+@@ -387,7 +387,7 @@
+ 		};
+ 
+ 		cluster1_core0_watchdog: wdt@c000000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc000000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(4)>,
+@@ -397,7 +397,7 @@
+ 		};
+ 
+ 		cluster1_core1_watchdog: wdt@c010000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc010000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(4)>,
+@@ -407,7 +407,7 @@
+ 		};
+ 
+ 		cluster2_core0_watchdog: wdt@c100000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc100000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(4)>,
+@@ -417,7 +417,7 @@
+ 		};
+ 
+ 		cluster2_core1_watchdog: wdt@c110000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc110000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(4)>,
+@@ -427,7 +427,7 @@
+ 		};
+ 
+ 		cluster3_core0_watchdog: wdt@c200000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc200000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(4)>,
+@@ -437,7 +437,7 @@
+ 		};
+ 
+ 		cluster3_core1_watchdog: wdt@c210000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc210000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(4)>,
+@@ -447,7 +447,7 @@
+ 		};
+ 
+ 		cluster4_core0_watchdog: wdt@c300000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc300000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(4)>,
+@@ -457,7 +457,7 @@
+ 		};
+ 
+ 		cluster4_core1_watchdog: wdt@c310000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xc310000 0x0 0x1000>;
+ 			clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
+ 					    QORIQ_CLK_PLL_DIV(4)>,
+diff --git a/arch/arm64/boot/dts/freescale/imx8mm-kontron-n801x-s.dts b/arch/arm64/boot/dts/freescale/imx8mm-kontron-n801x-s.dts
+index e99e7644ff392..49d7470812eef 100644
+--- a/arch/arm64/boot/dts/freescale/imx8mm-kontron-n801x-s.dts
++++ b/arch/arm64/boot/dts/freescale/imx8mm-kontron-n801x-s.dts
+@@ -123,8 +123,8 @@
+ 
+ 		ethphy: ethernet-phy@0 {
+ 			reg = <0>;
+-			reset-assert-us = <100>;
+-			reset-deassert-us = <100>;
++			reset-assert-us = <1>;
++			reset-deassert-us = <15000>;
+ 			reset-gpios = <&gpio4 27 GPIO_ACTIVE_LOW>;
+ 		};
+ 	};
+diff --git a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
+index 2d5c1a348716a..6eabec2602e23 100644
+--- a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
++++ b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
+@@ -1087,7 +1087,7 @@
+ 		};
+ 
+ 		watchdog0: watchdog@e8a06000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xe8a06000 0x0 0x1000>;
+ 			interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+ 			clocks = <&crg_ctrl HI3660_OSC32K>,
+@@ -1096,7 +1096,7 @@
+ 		};
+ 
+ 		watchdog1: watchdog@e8a07000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xe8a07000 0x0 0x1000>;
+ 			interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+ 			clocks = <&crg_ctrl HI3660_OSC32K>,
+diff --git a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
+index dde9371dc5451..e4860b8a638ec 100644
+--- a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
++++ b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
+@@ -840,7 +840,7 @@
+ 		};
+ 
+ 		watchdog0: watchdog@f8005000 {
+-			compatible = "arm,sp805-wdt", "arm,primecell";
++			compatible = "arm,sp805", "arm,primecell";
+ 			reg = <0x0 0xf8005000 0x0 0x1000>;
+ 			interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
+ 			clocks = <&ao_ctrl HI6220_WDT0_PCLK>,
+diff --git a/arch/arm64/boot/dts/qcom/ipq6018.dtsi b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
+index d2fe58e0eb7aa..7b6205c180df1 100644
+--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi
++++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi
+@@ -200,7 +200,7 @@
+ 			clock-names = "bam_clk";
+ 			#dma-cells = <1>;
+ 			qcom,ee = <1>;
+-			qcom,controlled-remotely = <1>;
++			qcom,controlled-remotely;
+ 			qcom,config-pipe-trust-reg = <0>;
+ 		};
+ 
+diff --git a/arch/arm64/boot/dts/qcom/ipq8074.dtsi b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+index db333001df4d6..97f99663c132e 100644
+--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
++++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+@@ -220,7 +220,7 @@
+ 			clock-names = "bam_clk";
+ 			#dma-cells = <1>;
+ 			qcom,ee = <1>;
+-			qcom,controlled-remotely = <1>;
++			qcom,controlled-remotely;
+ 			status = "disabled";
+ 		};
+ 
+diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi
+index fbff712639513..427bb20626549 100644
+--- a/arch/arm64/boot/dts/qcom/msm8916.dtsi
++++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi
+@@ -445,7 +445,7 @@
+ 			};
+ 		};
+ 
+-		rpm_msg_ram: memory@60000 {
++		rpm_msg_ram: sram@60000 {
+ 			compatible = "qcom,rpm-msg-ram";
+ 			reg = <0x00060000 0x8000>;
+ 		};
+diff --git a/arch/arm64/boot/dts/qcom/msm8994.dtsi b/arch/arm64/boot/dts/qcom/msm8994.dtsi
+index 986fe60dec5fb..5a9a5ed0565f6 100644
+--- a/arch/arm64/boot/dts/qcom/msm8994.dtsi
++++ b/arch/arm64/boot/dts/qcom/msm8994.dtsi
+@@ -715,7 +715,7 @@
+ 			reg = <0xfc400000 0x2000>;
+ 		};
+ 
+-		rpm_msg_ram: memory@fc428000 {
++		rpm_msg_ram: sram@fc428000 {
+ 			compatible = "qcom,rpm-msg-ram";
+ 			reg = <0xfc428000 0x4000>;
+ 		};
+diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi
+index 52df22ab3f6ae..f8d28dd76cfa8 100644
+--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi
++++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi
+@@ -638,7 +638,7 @@
+ 			};
+ 		};
+ 
+-		rpm_msg_ram: memory@68000 {
++		rpm_msg_ram: sram@68000 {
+ 			compatible = "qcom,rpm-msg-ram";
+ 			reg = <0x00068000 0x6000>;
+ 		};
+diff --git a/arch/arm64/boot/dts/qcom/msm8998.dtsi b/arch/arm64/boot/dts/qcom/msm8998.dtsi
+index 34039b5c80175..228339f81c327 100644
+--- a/arch/arm64/boot/dts/qcom/msm8998.dtsi
++++ b/arch/arm64/boot/dts/qcom/msm8998.dtsi
+@@ -308,38 +308,42 @@
+ 			LITTLE_CPU_SLEEP_0: cpu-sleep-0-0 {
+ 				compatible = "arm,idle-state";
+ 				idle-state-name = "little-retention";
++				/* CPU Retention (C2D), L2 Active */
+ 				arm,psci-suspend-param = <0x00000002>;
+ 				entry-latency-us = <81>;
+ 				exit-latency-us = <86>;
+-				min-residency-us = <200>;
++				min-residency-us = <504>;
+ 			};
+ 
+ 			LITTLE_CPU_SLEEP_1: cpu-sleep-0-1 {
+ 				compatible = "arm,idle-state";
+ 				idle-state-name = "little-power-collapse";
++				/* CPU + L2 Power Collapse (C3, D4) */
+ 				arm,psci-suspend-param = <0x40000003>;
+-				entry-latency-us = <273>;
+-				exit-latency-us = <612>;
+-				min-residency-us = <1000>;
++				entry-latency-us = <814>;
++				exit-latency-us = <4562>;
++				min-residency-us = <9183>;
+ 				local-timer-stop;
+ 			};
+ 
+ 			BIG_CPU_SLEEP_0: cpu-sleep-1-0 {
+ 				compatible = "arm,idle-state";
+ 				idle-state-name = "big-retention";
++				/* CPU Retention (C2D), L2 Active */
+ 				arm,psci-suspend-param = <0x00000002>;
+ 				entry-latency-us = <79>;
+ 				exit-latency-us = <82>;
+-				min-residency-us = <200>;
++				min-residency-us = <1302>;
+ 			};
+ 
+ 			BIG_CPU_SLEEP_1: cpu-sleep-1-1 {
+ 				compatible = "arm,idle-state";
+ 				idle-state-name = "big-power-collapse";
++				/* CPU + L2 Power Collapse (C3, D4) */
+ 				arm,psci-suspend-param = <0x40000003>;
+-				entry-latency-us = <336>;
+-				exit-latency-us = <525>;
+-				min-residency-us = <1000>;
++				entry-latency-us = <724>;
++				exit-latency-us = <2027>;
++				min-residency-us = <9419>;
+ 				local-timer-stop;
+ 			};
+ 		};
+@@ -857,7 +861,7 @@
+ 			reg = <0x00100000 0xb0000>;
+ 		};
+ 
+-		rpm_msg_ram: memory@778000 {
++		rpm_msg_ram: sram@778000 {
+ 			compatible = "qcom,rpm-msg-ram";
+ 			reg = <0x00778000 0x7000>;
+ 		};
+diff --git a/arch/arm64/boot/dts/qcom/qcs404.dtsi b/arch/arm64/boot/dts/qcom/qcs404.dtsi
+index 339790ba585de..ca5be16479809 100644
+--- a/arch/arm64/boot/dts/qcom/qcs404.dtsi
++++ b/arch/arm64/boot/dts/qcom/qcs404.dtsi
+@@ -318,7 +318,7 @@
+ 			status = "disabled";
+ 		};
+ 
+-		rpm_msg_ram: memory@60000 {
++		rpm_msg_ram: sram@60000 {
+ 			compatible = "qcom,rpm-msg-ram";
+ 			reg = <0x00060000 0x6000>;
+ 		};
+diff --git a/arch/arm64/boot/dts/qcom/sdm630.dtsi b/arch/arm64/boot/dts/qcom/sdm630.dtsi
+index 9c7f87e42fccd..a8724fd60645f 100644
+--- a/arch/arm64/boot/dts/qcom/sdm630.dtsi
++++ b/arch/arm64/boot/dts/qcom/sdm630.dtsi
+@@ -541,7 +541,7 @@
+ 					<&sleep_clk>;
+ 		};
+ 
+-		rpm_msg_ram: memory@778000 {
++		rpm_msg_ram: sram@778000 {
+ 			compatible = "qcom,rpm-msg-ram";
+ 			reg = <0x00778000 0x7000>;
+ 		};
+diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qcom/sdm845.dtsi
+index a810adc1a707f..519ca9a705b4f 100644
+--- a/arch/arm64/boot/dts/qcom/sdm845.dtsi
++++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi
+@@ -2320,7 +2320,7 @@
+ 			clock-names = "bam_clk";
+ 			#dma-cells = <1>;
+ 			qcom,ee = <0>;
+-			qcom,controlled-remotely = <1>;
++			qcom,controlled-remotely;
+ 			iommus = <&apps_smmu 0x704 0x1>,
+ 				 <&apps_smmu 0x706 0x1>,
+ 				 <&apps_smmu 0x714 0x1>,
+diff --git a/arch/arm64/boot/dts/qcom/sm6125.dtsi b/arch/arm64/boot/dts/qcom/sm6125.dtsi
+index 2b37ce6a9f9c5..9f476e3d0720b 100644
+--- a/arch/arm64/boot/dts/qcom/sm6125.dtsi
++++ b/arch/arm64/boot/dts/qcom/sm6125.dtsi
+@@ -380,7 +380,7 @@
+ 			status = "disabled";
+ 		};
+ 
+-		rpm_msg_ram: memory@45f0000 {
++		rpm_msg_ram: sram@45f0000 {
+ 			compatible = "qcom,rpm-msg-ram";
+ 			reg = <0x045f0000 0x7000>;
+ 		};
+diff --git a/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts b/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts
+index 2b5f001ff4a61..9e5d07f5712e6 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts
+@@ -385,10 +385,6 @@
+ 	};
+ };
+ 
+-&cdn_dp {
+-	status = "okay";
+-};
+-
+ &cpu_b0 {
+ 	cpu-supply = <&vdd_cpu_b>;
+ };
+diff --git a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts
+index 4a86efa32d687..f7124e15f0ff6 100644
+--- a/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts
++++ b/arch/arm64/boot/dts/xilinx/zynqmp-zc1751-xm016-dc2.dts
+@@ -131,7 +131,7 @@
+ 		reg = <0>;
+ 
+ 		partition@0 {
+-			label = "data";
++			label = "spi0-data";
+ 			reg = <0x0 0x100000>;
+ 		};
+ 	};
+@@ -149,7 +149,7 @@
+ 		reg = <0>;
+ 
+ 		partition@0 {
+-			label = "data";
++			label = "spi1-data";
+ 			reg = <0x0 0x84000>;
+ 		};
+ 	};
+diff --git a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
+index 28dccb891a535..8278876ad33fa 100644
+--- a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
++++ b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
+@@ -792,7 +792,7 @@
+ 		};
+ 
+ 		uart0: serial@ff000000 {
+-			compatible = "cdns,uart-r1p12", "xlnx,xuartps";
++			compatible = "xlnx,zynqmp-uart", "cdns,uart-r1p12";
+ 			status = "disabled";
+ 			interrupt-parent = <&gic>;
+ 			interrupts = <0 21 4>;
+@@ -802,7 +802,7 @@
+ 		};
+ 
+ 		uart1: serial@ff010000 {
+-			compatible = "cdns,uart-r1p12", "xlnx,xuartps";
++			compatible = "xlnx,zynqmp-uart", "cdns,uart-r1p12";
+ 			status = "disabled";
+ 			interrupt-parent = <&gic>;
+ 			interrupts = <0 22 4>;
+diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c
+index 57c27846320f4..58ad9c5ba3112 100644
+--- a/arch/arm64/kvm/hyp/nvhe/setup.c
++++ b/arch/arm64/kvm/hyp/nvhe/setup.c
+@@ -177,7 +177,7 @@ static int finalize_host_mappings_walker(u64 addr, u64 end, u32 level,
+ 
+ 	phys = kvm_pte_to_phys(pte);
+ 	if (!addr_is_memory(phys))
+-		return 0;
++		return -EINVAL;
+ 
+ 	/*
+ 	 * Adjust the host stage-2 mappings to match the ownership attributes
+@@ -206,8 +206,18 @@ static int finalize_host_mappings(void)
+ 		.cb	= finalize_host_mappings_walker,
+ 		.flags	= KVM_PGTABLE_WALK_LEAF,
+ 	};
++	int i, ret;
++
++	for (i = 0; i < hyp_memblock_nr; i++) {
++		struct memblock_region *reg = &hyp_memory[i];
++		u64 start = (u64)hyp_phys_to_virt(reg->base);
++
++		ret = kvm_pgtable_walk(&pkvm_pgtable, start, reg->size, &walker);
++		if (ret)
++			return ret;
++	}
+ 
+-	return kvm_pgtable_walk(&pkvm_pgtable, 0, BIT(pkvm_pgtable.ia_bits), &walker);
++	return 0;
+ }
+ 
+ void __noreturn __pkvm_init_finalise(void)
+diff --git a/arch/hexagon/include/asm/timer-regs.h b/arch/hexagon/include/asm/timer-regs.h
+deleted file mode 100644
+index ee6c61423a058..0000000000000
+--- a/arch/hexagon/include/asm/timer-regs.h
++++ /dev/null
+@@ -1,26 +0,0 @@
+-/* SPDX-License-Identifier: GPL-2.0-only */
+-/*
+- * Timer support for Hexagon
+- *
+- * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
+- */
+-
+-#ifndef _ASM_TIMER_REGS_H
+-#define _ASM_TIMER_REGS_H
+-
+-/*  This stuff should go into a platform specific file  */
+-#define TCX0_CLK_RATE		19200
+-#define TIMER_ENABLE		0
+-#define TIMER_CLR_ON_MATCH	1
+-
+-/*
+- * 8x50 HDD Specs 5-8.  Simulator co-sim not fixed until
+- * release 1.1, and then it's "adjustable" and probably not defaulted.
+- */
+-#define RTOS_TIMER_INT		3
+-#ifdef CONFIG_HEXAGON_COMET
+-#define RTOS_TIMER_REGS_ADDR	0xAB000000UL
+-#endif
+-#define SLEEP_CLK_RATE		32000
+-
+-#endif
+diff --git a/arch/hexagon/include/asm/timex.h b/arch/hexagon/include/asm/timex.h
+index 8d4ec76fceb45..dfe69e118b2be 100644
+--- a/arch/hexagon/include/asm/timex.h
++++ b/arch/hexagon/include/asm/timex.h
+@@ -7,11 +7,10 @@
+ #define _ASM_TIMEX_H
+ 
+ #include <asm-generic/timex.h>
+-#include <asm/timer-regs.h>
+ #include <asm/hexagon_vm.h>
+ 
+ /* Using TCX0 as our clock.  CLOCK_TICK_RATE scheduled to be removed. */
+-#define CLOCK_TICK_RATE              TCX0_CLK_RATE
++#define CLOCK_TICK_RATE              19200
+ 
+ #define ARCH_HAS_READ_CURRENT_TIMER
+ 
+diff --git a/arch/hexagon/kernel/time.c b/arch/hexagon/kernel/time.c
+index feffe527ac929..febc95714d756 100644
+--- a/arch/hexagon/kernel/time.c
++++ b/arch/hexagon/kernel/time.c
+@@ -17,9 +17,10 @@
+ #include <linux/of_irq.h>
+ #include <linux/module.h>
+ 
+-#include <asm/timer-regs.h>
+ #include <asm/hexagon_vm.h>
+ 
++#define TIMER_ENABLE		BIT(0)
++
+ /*
+  * For the clocksource we need:
+  *	pcycle frequency (600MHz)
+@@ -33,6 +34,13 @@ cycles_t	pcycle_freq_mhz;
+ cycles_t	thread_freq_mhz;
+ cycles_t	sleep_clk_freq;
+ 
++/*
++ * 8x50 HDD Specs 5-8.  Simulator co-sim not fixed until
++ * release 1.1, and then it's "adjustable" and probably not defaulted.
++ */
++#define RTOS_TIMER_INT		3
++#define RTOS_TIMER_REGS_ADDR	0xAB000000UL
++
+ static struct resource rtos_timer_resources[] = {
+ 	{
+ 		.start	= RTOS_TIMER_REGS_ADDR,
+@@ -80,7 +88,7 @@ static int set_next_event(unsigned long delta, struct clock_event_device *evt)
+ 	iowrite32(0, &rtos_timer->clear);
+ 
+ 	iowrite32(delta, &rtos_timer->match);
+-	iowrite32(1 << TIMER_ENABLE, &rtos_timer->enable);
++	iowrite32(TIMER_ENABLE, &rtos_timer->enable);
+ 	return 0;
+ }
+ 
+diff --git a/arch/hexagon/lib/io.c b/arch/hexagon/lib/io.c
+index d35d69d6588c4..55f75392857b0 100644
+--- a/arch/hexagon/lib/io.c
++++ b/arch/hexagon/lib/io.c
+@@ -27,6 +27,7 @@ void __raw_readsw(const void __iomem *addr, void *data, int len)
+ 		*dst++ = *src;
+ 
+ }
++EXPORT_SYMBOL(__raw_readsw);
+ 
+ /*
+  * __raw_writesw - read words a short at a time
+@@ -47,6 +48,7 @@ void __raw_writesw(void __iomem *addr, const void *data, int len)
+ 
+ 
+ }
++EXPORT_SYMBOL(__raw_writesw);
+ 
+ /*  Pretty sure len is pre-adjusted for the length of the access already */
+ void __raw_readsl(const void __iomem *addr, void *data, int len)
+@@ -62,6 +64,7 @@ void __raw_readsl(const void __iomem *addr, void *data, int len)
+ 
+ 
+ }
++EXPORT_SYMBOL(__raw_readsl);
+ 
+ void __raw_writesl(void __iomem *addr, const void *data, int len)
+ {
+@@ -76,3 +79,4 @@ void __raw_writesl(void __iomem *addr, const void *data, int len)
+ 
+ 
+ }
++EXPORT_SYMBOL(__raw_writesl);
+diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c
+index 9718ce94cc845..34d6458340b0f 100644
+--- a/arch/m68k/kernel/traps.c
++++ b/arch/m68k/kernel/traps.c
+@@ -1145,7 +1145,7 @@ asmlinkage void set_esp0(unsigned long ssp)
+  */
+ asmlinkage void fpsp040_die(void)
+ {
+-	force_sigsegv(SIGSEGV);
++	force_exit_sig(SIGSEGV);
+ }
+ 
+ #ifdef CONFIG_M68KFPU_EMU
+diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
+index cbbb302a460eb..a917d408d27d8 100644
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -332,6 +332,9 @@ config BCM63XX
+ 	select SYS_SUPPORTS_32BIT_KERNEL
+ 	select SYS_SUPPORTS_BIG_ENDIAN
+ 	select SYS_HAS_EARLY_PRINTK
++	select SYS_HAS_CPU_BMIPS32_3300
++	select SYS_HAS_CPU_BMIPS4350
++	select SYS_HAS_CPU_BMIPS4380
+ 	select SWAP_IO_SPACE
+ 	select GPIOLIB
+ 	select MIPS_L1_CACHE_SHIFT_4
+diff --git a/arch/mips/bcm63xx/clk.c b/arch/mips/bcm63xx/clk.c
+index 5a3e325275d0d..1c91064cb448b 100644
+--- a/arch/mips/bcm63xx/clk.c
++++ b/arch/mips/bcm63xx/clk.c
+@@ -381,6 +381,12 @@ void clk_disable(struct clk *clk)
+ 
+ EXPORT_SYMBOL(clk_disable);
+ 
++struct clk *clk_get_parent(struct clk *clk)
++{
++	return NULL;
++}
++EXPORT_SYMBOL(clk_get_parent);
++
+ unsigned long clk_get_rate(struct clk *clk)
+ {
+ 	if (!clk)
+diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile
+index 3548b3b452699..9112bdb86be45 100644
+--- a/arch/mips/boot/compressed/Makefile
++++ b/arch/mips/boot/compressed/Makefile
+@@ -56,6 +56,8 @@ $(obj)/uart-ath79.c: $(srctree)/arch/mips/ath79/early_printk.c
+ 
+ vmlinuzobjs-$(CONFIG_KERNEL_XZ) += $(obj)/ashldi3.o
+ 
++vmlinuzobjs-$(CONFIG_KERNEL_ZSTD) += $(obj)/bswapdi.o
++
+ extra-y += ashldi3.c
+ $(obj)/ashldi3.c: $(obj)/%.c: $(srctree)/lib/%.c FORCE
+ 	$(call if_changed,shipped)
+@@ -64,6 +66,10 @@ extra-y += bswapsi.c
+ $(obj)/bswapsi.c: $(obj)/%.c: $(srctree)/arch/mips/lib/%.c FORCE
+ 	$(call if_changed,shipped)
+ 
++extra-y += bswapdi.c
++$(obj)/bswapdi.c: $(obj)/%.c: $(srctree)/arch/mips/lib/%.c FORCE
++	$(call if_changed,shipped)
++
+ targets := $(notdir $(vmlinuzobjs-y))
+ 
+ targets += vmlinux.bin
+diff --git a/arch/mips/generic/yamon-dt.c b/arch/mips/generic/yamon-dt.c
+index a3aa22c77cadc..a07a5edbcda78 100644
+--- a/arch/mips/generic/yamon-dt.c
++++ b/arch/mips/generic/yamon-dt.c
+@@ -75,7 +75,7 @@ static unsigned int __init gen_fdt_mem_array(
+ __init int yamon_dt_append_memory(void *fdt,
+ 				  const struct yamon_mem_region *regions)
+ {
+-	unsigned long phys_memsize, memsize;
++	unsigned long phys_memsize = 0, memsize;
+ 	__be32 mem_array[2 * MAX_MEM_ARRAY_ENTRIES];
+ 	unsigned int mem_entries;
+ 	int i, err, mem_off;
+diff --git a/arch/mips/lantiq/clk.c b/arch/mips/lantiq/clk.c
+index dd819e31fcbbf..4916cccf378fd 100644
+--- a/arch/mips/lantiq/clk.c
++++ b/arch/mips/lantiq/clk.c
+@@ -158,6 +158,12 @@ void clk_deactivate(struct clk *clk)
+ }
+ EXPORT_SYMBOL(clk_deactivate);
+ 
++struct clk *clk_get_parent(struct clk *clk)
++{
++	return NULL;
++}
++EXPORT_SYMBOL(clk_get_parent);
++
+ static inline u32 get_counter_resolution(void)
+ {
+ 	u32 res;
+diff --git a/arch/mips/sni/time.c b/arch/mips/sni/time.c
+index 240bb68ec2478..ff3ba7e778901 100644
+--- a/arch/mips/sni/time.c
++++ b/arch/mips/sni/time.c
+@@ -18,14 +18,14 @@ static int a20r_set_periodic(struct clock_event_device *evt)
+ {
+ 	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 12) = 0x34;
+ 	wmb();
+-	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 0) = SNI_COUNTER0_DIV;
++	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 0) = SNI_COUNTER0_DIV & 0xff;
+ 	wmb();
+ 	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 0) = SNI_COUNTER0_DIV >> 8;
+ 	wmb();
+ 
+ 	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 12) = 0xb4;
+ 	wmb();
+-	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 8) = SNI_COUNTER2_DIV;
++	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 8) = SNI_COUNTER2_DIV & 0xff;
+ 	wmb();
+ 	*(volatile u8 *)(A20R_PT_CLOCK_BASE + 8) = SNI_COUNTER2_DIV >> 8;
+ 	wmb();
+diff --git a/arch/parisc/include/asm/rt_sigframe.h b/arch/parisc/include/asm/rt_sigframe.h
+index 4b9e3d707571b..2b3010ade00e7 100644
+--- a/arch/parisc/include/asm/rt_sigframe.h
++++ b/arch/parisc/include/asm/rt_sigframe.h
+@@ -2,7 +2,7 @@
+ #ifndef _ASM_PARISC_RT_SIGFRAME_H
+ #define _ASM_PARISC_RT_SIGFRAME_H
+ 
+-#define SIGRETURN_TRAMP 3
++#define SIGRETURN_TRAMP 4
+ #define SIGRESTARTBLOCK_TRAMP 5 
+ #define TRAMP_SIZE (SIGRETURN_TRAMP + SIGRESTARTBLOCK_TRAMP)
+ 
+diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
+index bbfe23c40c016..0fb06d87b3a5c 100644
+--- a/arch/parisc/kernel/signal.c
++++ b/arch/parisc/kernel/signal.c
+@@ -288,21 +288,22 @@ setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
+ 	   already in userspace. The first words of tramp are used to
+ 	   save the previous sigrestartblock trampoline that might be
+ 	   on the stack. We start the sigreturn trampoline at 
+-	   SIGRESTARTBLOCK_TRAMP. */
++	   SIGRESTARTBLOCK_TRAMP+X. */
+ 	err |= __put_user(in_syscall ? INSN_LDI_R25_1 : INSN_LDI_R25_0,
+ 			&frame->tramp[SIGRESTARTBLOCK_TRAMP+0]);
+-	err |= __put_user(INSN_BLE_SR2_R0, 
+-			&frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
+ 	err |= __put_user(INSN_LDI_R20,
++			&frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
++	err |= __put_user(INSN_BLE_SR2_R0,
+ 			&frame->tramp[SIGRESTARTBLOCK_TRAMP+2]);
++	err |= __put_user(INSN_NOP, &frame->tramp[SIGRESTARTBLOCK_TRAMP+3]);
+ 
+-	start = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP+0];
+-	end = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP+3];
++	start = (unsigned long) &frame->tramp[0];
++	end = (unsigned long) &frame->tramp[TRAMP_SIZE];
+ 	flush_user_dcache_range_asm(start, end);
+ 	flush_user_icache_range_asm(start, end);
+ 
+ 	/* TRAMP Words 0-4, Length 5 = SIGRESTARTBLOCK_TRAMP
+-	 * TRAMP Words 5-7, Length 3 = SIGRETURN_TRAMP
++	 * TRAMP Words 5-9, Length 4 = SIGRETURN_TRAMP
+ 	 * So the SIGRETURN_TRAMP is at the end of SIGRESTARTBLOCK_TRAMP
+ 	 */
+ 	rp = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP];
+diff --git a/arch/parisc/kernel/signal32.h b/arch/parisc/kernel/signal32.h
+index a5bdbb5678b72..f166250f2d064 100644
+--- a/arch/parisc/kernel/signal32.h
++++ b/arch/parisc/kernel/signal32.h
+@@ -36,7 +36,7 @@ struct compat_regfile {
+         compat_int_t rf_sar;
+ };
+ 
+-#define COMPAT_SIGRETURN_TRAMP 3
++#define COMPAT_SIGRETURN_TRAMP 4
+ #define COMPAT_SIGRESTARTBLOCK_TRAMP 5
+ #define COMPAT_TRAMP_SIZE (COMPAT_SIGRETURN_TRAMP + \
+ 				COMPAT_SIGRESTARTBLOCK_TRAMP)
+diff --git a/arch/powerpc/boot/dts/charon.dts b/arch/powerpc/boot/dts/charon.dts
+index 408b486b13dff..cd589539f313f 100644
+--- a/arch/powerpc/boot/dts/charon.dts
++++ b/arch/powerpc/boot/dts/charon.dts
+@@ -35,7 +35,7 @@
+ 		};
+ 	};
+ 
+-	memory {
++	memory@0 {
+ 		device_type = "memory";
+ 		reg = <0x00000000 0x08000000>;	// 128MB
+ 	};
+diff --git a/arch/powerpc/boot/dts/digsy_mtc.dts b/arch/powerpc/boot/dts/digsy_mtc.dts
+index 0e5e9d3acf79f..19a14e62e65f4 100644
+--- a/arch/powerpc/boot/dts/digsy_mtc.dts
++++ b/arch/powerpc/boot/dts/digsy_mtc.dts
+@@ -16,7 +16,7 @@
+ 	model = "intercontrol,digsy-mtc";
+ 	compatible = "intercontrol,digsy-mtc";
+ 
+-	memory {
++	memory@0 {
+ 		reg = <0x00000000 0x02000000>;	// 32MB
+ 	};
+ 
+diff --git a/arch/powerpc/boot/dts/lite5200.dts b/arch/powerpc/boot/dts/lite5200.dts
+index cb2782dd6132c..e7b194775d783 100644
+--- a/arch/powerpc/boot/dts/lite5200.dts
++++ b/arch/powerpc/boot/dts/lite5200.dts
+@@ -32,7 +32,7 @@
+ 		};
+ 	};
+ 
+-	memory {
++	memory@0 {
+ 		device_type = "memory";
+ 		reg = <0x00000000 0x04000000>;	// 64MB
+ 	};
+diff --git a/arch/powerpc/boot/dts/lite5200b.dts b/arch/powerpc/boot/dts/lite5200b.dts
+index 2b86c81f90485..547cbe726ff23 100644
+--- a/arch/powerpc/boot/dts/lite5200b.dts
++++ b/arch/powerpc/boot/dts/lite5200b.dts
+@@ -31,7 +31,7 @@
+ 		led4 { gpios = <&gpio_simple 2 1>; };
+ 	};
+ 
+-	memory {
++	memory@0 {
+ 		reg = <0x00000000 0x10000000>;	// 256MB
+ 	};
+ 
+diff --git a/arch/powerpc/boot/dts/media5200.dts b/arch/powerpc/boot/dts/media5200.dts
+index 61cae9dcddef4..f3188018faceb 100644
+--- a/arch/powerpc/boot/dts/media5200.dts
++++ b/arch/powerpc/boot/dts/media5200.dts
+@@ -32,7 +32,7 @@
+ 		};
+ 	};
+ 
+-	memory {
++	memory@0 {
+ 		reg = <0x00000000 0x08000000>;	// 128MB RAM
+ 	};
+ 
+diff --git a/arch/powerpc/boot/dts/mpc5200b.dtsi b/arch/powerpc/boot/dts/mpc5200b.dtsi
+index 648fe31795f49..8b796f3b11da7 100644
+--- a/arch/powerpc/boot/dts/mpc5200b.dtsi
++++ b/arch/powerpc/boot/dts/mpc5200b.dtsi
+@@ -33,7 +33,7 @@
+ 		};
+ 	};
+ 
+-	memory: memory {
++	memory: memory@0 {
+ 		device_type = "memory";
+ 		reg = <0x00000000 0x04000000>;	// 64MB
+ 	};
+diff --git a/arch/powerpc/boot/dts/o2d.dts b/arch/powerpc/boot/dts/o2d.dts
+index 24a46f65e5299..e0a8d3034417f 100644
+--- a/arch/powerpc/boot/dts/o2d.dts
++++ b/arch/powerpc/boot/dts/o2d.dts
+@@ -12,7 +12,7 @@
+ 	model = "ifm,o2d";
+ 	compatible = "ifm,o2d";
+ 
+-	memory {
++	memory@0 {
+ 		reg = <0x00000000 0x08000000>;  // 128MB
+ 	};
+ 
+diff --git a/arch/powerpc/boot/dts/o2d.dtsi b/arch/powerpc/boot/dts/o2d.dtsi
+index 6661955a2be47..b55a9e5bd828c 100644
+--- a/arch/powerpc/boot/dts/o2d.dtsi
++++ b/arch/powerpc/boot/dts/o2d.dtsi
+@@ -19,7 +19,7 @@
+ 	model = "ifm,o2d";
+ 	compatible = "ifm,o2d";
+ 
+-	memory {
++	memory@0 {
+ 		reg = <0x00000000 0x04000000>;	// 64MB
+ 	};
+ 
+diff --git a/arch/powerpc/boot/dts/o2dnt2.dts b/arch/powerpc/boot/dts/o2dnt2.dts
+index eeba7f5507d5d..c2eedbd1f5fcb 100644
+--- a/arch/powerpc/boot/dts/o2dnt2.dts
++++ b/arch/powerpc/boot/dts/o2dnt2.dts
+@@ -12,7 +12,7 @@
+ 	model = "ifm,o2dnt2";
+ 	compatible = "ifm,o2d";
+ 
+-	memory {
++	memory@0 {
+ 		reg = <0x00000000 0x08000000>;  // 128MB
+ 	};
+ 
+diff --git a/arch/powerpc/boot/dts/o3dnt.dts b/arch/powerpc/boot/dts/o3dnt.dts
+index fd00396b0593e..e4c1bdd412716 100644
+--- a/arch/powerpc/boot/dts/o3dnt.dts
++++ b/arch/powerpc/boot/dts/o3dnt.dts
+@@ -12,7 +12,7 @@
+ 	model = "ifm,o3dnt";
+ 	compatible = "ifm,o2d";
+ 
+-	memory {
++	memory@0 {
+ 		reg = <0x00000000 0x04000000>;  // 64MB
+ 	};
+ 
+diff --git a/arch/powerpc/boot/dts/pcm032.dts b/arch/powerpc/boot/dts/pcm032.dts
+index 780e13d99e7b8..1895bc95900cc 100644
+--- a/arch/powerpc/boot/dts/pcm032.dts
++++ b/arch/powerpc/boot/dts/pcm032.dts
+@@ -20,7 +20,7 @@
+ 	model = "phytec,pcm032";
+ 	compatible = "phytec,pcm032";
+ 
+-	memory {
++	memory@0 {
+ 		reg = <0x00000000 0x08000000>;	// 128MB
+ 	};
+ 
+diff --git a/arch/powerpc/boot/dts/tqm5200.dts b/arch/powerpc/boot/dts/tqm5200.dts
+index 9ed0bc78967e1..5bb25a9e40a01 100644
+--- a/arch/powerpc/boot/dts/tqm5200.dts
++++ b/arch/powerpc/boot/dts/tqm5200.dts
+@@ -32,7 +32,7 @@
+ 		};
+ 	};
+ 
+-	memory {
++	memory@0 {
+ 		device_type = "memory";
+ 		reg = <0x00000000 0x04000000>;	// 64MB
+ 	};
+diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
+index 7be36c1e1db6d..86e40db2dec56 100644
+--- a/arch/powerpc/kernel/Makefile
++++ b/arch/powerpc/kernel/Makefile
+@@ -196,3 +196,6 @@ clean-files := vmlinux.lds
+ # Force dependency (incbin is bad)
+ $(obj)/vdso32_wrapper.o : $(obj)/vdso32/vdso32.so.dbg
+ $(obj)/vdso64_wrapper.o : $(obj)/vdso64/vdso64.so.dbg
++
++# for cleaning
++subdir- += vdso32 vdso64
+diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
+index 9bdb95f5694f7..0d073b9fd52c5 100644
+--- a/arch/powerpc/kernel/head_8xx.S
++++ b/arch/powerpc/kernel/head_8xx.S
+@@ -733,6 +733,7 @@ _GLOBAL(mmu_pin_tlb)
+ #ifdef CONFIG_PIN_TLB_DATA
+ 	LOAD_REG_IMMEDIATE(r6, PAGE_OFFSET)
+ 	LOAD_REG_IMMEDIATE(r7, MI_SVALID | MI_PS8MEG | _PMD_ACCESSED)
++	li	r8, 0
+ #ifdef CONFIG_PIN_TLB_IMMR
+ 	li	r0, 3
+ #else
+@@ -741,26 +742,26 @@ _GLOBAL(mmu_pin_tlb)
+ 	mtctr	r0
+ 	cmpwi	r4, 0
+ 	beq	4f
+-	LOAD_REG_IMMEDIATE(r8, 0xf0 | _PAGE_RO | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT)
+ 	LOAD_REG_ADDR(r9, _sinittext)
+ 
+ 2:	ori	r0, r6, MD_EVALID
++	ori	r12, r8, 0xf0 | _PAGE_RO | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT
+ 	mtspr	SPRN_MD_CTR, r5
+ 	mtspr	SPRN_MD_EPN, r0
+ 	mtspr	SPRN_MD_TWC, r7
+-	mtspr	SPRN_MD_RPN, r8
++	mtspr	SPRN_MD_RPN, r12
+ 	addi	r5, r5, 0x100
+ 	addis	r6, r6, SZ_8M@h
+ 	addis	r8, r8, SZ_8M@h
+ 	cmplw	r6, r9
+ 	bdnzt	lt, 2b
+-
+-4:	LOAD_REG_IMMEDIATE(r8, 0xf0 | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT)
++4:
+ 2:	ori	r0, r6, MD_EVALID
++	ori	r12, r8, 0xf0 | _PAGE_DIRTY | _PAGE_SPS | _PAGE_SH | _PAGE_PRESENT
+ 	mtspr	SPRN_MD_CTR, r5
+ 	mtspr	SPRN_MD_EPN, r0
+ 	mtspr	SPRN_MD_TWC, r7
+-	mtspr	SPRN_MD_RPN, r8
++	mtspr	SPRN_MD_RPN, r12
+ 	addi	r5, r5, 0x100
+ 	addis	r6, r6, SZ_8M@h
+ 	addis	r8, r8, SZ_8M@h
+@@ -781,7 +782,7 @@ _GLOBAL(mmu_pin_tlb)
+ #endif
+ #if defined(CONFIG_PIN_TLB_IMMR) || defined(CONFIG_PIN_TLB_DATA)
+ 	lis	r0, (MD_RSV4I | MD_TWAM)@h
+-	mtspr	SPRN_MI_CTR, r0
++	mtspr	SPRN_MD_CTR, r0
+ #endif
+ 	mtspr	SPRN_SRR1, r10
+ 	mtspr	SPRN_SRR0, r11
+diff --git a/arch/powerpc/kernel/signal.h b/arch/powerpc/kernel/signal.h
+index 1f07317964e49..618aeccdf6918 100644
+--- a/arch/powerpc/kernel/signal.h
++++ b/arch/powerpc/kernel/signal.h
+@@ -25,8 +25,14 @@ static inline int __get_user_sigset(sigset_t *dst, const sigset_t __user *src)
+ 
+ 	return __get_user(dst->sig[0], (u64 __user *)&src->sig[0]);
+ }
+-#define unsafe_get_user_sigset(dst, src, label) \
+-	unsafe_get_user((dst)->sig[0], (u64 __user *)&(src)->sig[0], label)
++#define unsafe_get_user_sigset(dst, src, label) do {			\
++	sigset_t *__dst = dst;						\
++	const sigset_t __user *__src = src;				\
++	int i;								\
++									\
++	for (i = 0; i < _NSIG_WORDS; i++)				\
++		unsafe_get_user(__dst->sig[i], &__src->sig[i], label);	\
++} while (0)
+ 
+ #ifdef CONFIG_VSX
+ extern unsigned long copy_vsx_to_user(void __user *to,
+diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
+index 0608581967f09..f2da879264bcd 100644
+--- a/arch/powerpc/kernel/signal_32.c
++++ b/arch/powerpc/kernel/signal_32.c
+@@ -1062,8 +1062,10 @@ SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx,
+ 	 * or if another thread unmaps the region containing the context.
+ 	 * We kill the task with a SIGSEGV in this situation.
+ 	 */
+-	if (do_setcontext(new_ctx, regs, 0))
+-		do_exit(SIGSEGV);
++	if (do_setcontext(new_ctx, regs, 0)) {
++		force_exit_sig(SIGSEGV);
++		return -EFAULT;
++	}
+ 
+ 	set_thread_flag(TIF_RESTOREALL);
+ 	return 0;
+diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
+index 1831bba0582e1..bb9c077ac1322 100644
+--- a/arch/powerpc/kernel/signal_64.c
++++ b/arch/powerpc/kernel/signal_64.c
+@@ -703,15 +703,18 @@ SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx,
+ 	 * We kill the task with a SIGSEGV in this situation.
+ 	 */
+ 
+-	if (__get_user_sigset(&set, &new_ctx->uc_sigmask))
+-		do_exit(SIGSEGV);
++	if (__get_user_sigset(&set, &new_ctx->uc_sigmask)) {
++		force_exit_sig(SIGSEGV);
++		return -EFAULT;
++	}
+ 	set_current_blocked(&set);
+ 
+ 	if (!user_read_access_begin(new_ctx, ctx_size))
+ 		return -EFAULT;
+ 	if (__unsafe_restore_sigcontext(current, NULL, 0, &new_ctx->uc_mcontext)) {
+ 		user_read_access_end();
+-		do_exit(SIGSEGV);
++		force_exit_sig(SIGSEGV);
++		return -EFAULT;
+ 	}
+ 	user_read_access_end();
+ 
+diff --git a/arch/powerpc/kernel/watchdog.c b/arch/powerpc/kernel/watchdog.c
+index f9ea0e5357f92..3fa6d240bade2 100644
+--- a/arch/powerpc/kernel/watchdog.c
++++ b/arch/powerpc/kernel/watchdog.c
+@@ -187,6 +187,12 @@ static void watchdog_smp_panic(int cpu, u64 tb)
+ 	if (sysctl_hardlockup_all_cpu_backtrace)
+ 		trigger_allbutself_cpu_backtrace();
+ 
++	/*
++	 * Force flush any remote buffers that might be stuck in IRQ context
++	 * and therefore could not run their irq_work.
++	 */
++	printk_trigger_flush();
++
+ 	if (hardlockup_panic)
+ 		nmi_panic(NULL, "Hard LOCKUP");
+ 
+diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+index eb776d0c5d8e9..32a4b4d412b92 100644
+--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
++++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+@@ -2005,7 +2005,7 @@ hcall_real_table:
+ 	.globl	hcall_real_table_end
+ hcall_real_table_end:
+ 
+-_GLOBAL(kvmppc_h_set_xdabr)
++_GLOBAL_TOC(kvmppc_h_set_xdabr)
+ EXPORT_SYMBOL_GPL(kvmppc_h_set_xdabr)
+ 	andi.	r0, r5, DABRX_USER | DABRX_KERNEL
+ 	beq	6f
+@@ -2015,7 +2015,7 @@ EXPORT_SYMBOL_GPL(kvmppc_h_set_xdabr)
+ 6:	li	r3, H_PARAMETER
+ 	blr
+ 
+-_GLOBAL(kvmppc_h_set_dabr)
++_GLOBAL_TOC(kvmppc_h_set_dabr)
+ EXPORT_SYMBOL_GPL(kvmppc_h_set_dabr)
+ 	li	r5, DABRX_USER | DABRX_KERNEL
+ 3:
+diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
+index 6f14c8fb6359d..59d3cfcd78879 100644
+--- a/arch/powerpc/mm/numa.c
++++ b/arch/powerpc/mm/numa.c
+@@ -376,9 +376,9 @@ static void initialize_form2_numa_distance_lookup_table(void)
+ {
+ 	int i, j;
+ 	struct device_node *root;
+-	const __u8 *numa_dist_table;
++	const __u8 *form2_distances;
+ 	const __be32 *numa_lookup_index;
+-	int numa_dist_table_length;
++	int form2_distances_length;
+ 	int max_numa_index, distance_index;
+ 
+ 	if (firmware_has_feature(FW_FEATURE_OPAL))
+@@ -392,45 +392,41 @@ static void initialize_form2_numa_distance_lookup_table(void)
+ 	max_numa_index = of_read_number(&numa_lookup_index[0], 1);
+ 
+ 	/* first element of the array is the size and is encode-int */
+-	numa_dist_table = of_get_property(root, "ibm,numa-distance-table", NULL);
+-	numa_dist_table_length = of_read_number((const __be32 *)&numa_dist_table[0], 1);
++	form2_distances = of_get_property(root, "ibm,numa-distance-table", NULL);
++	form2_distances_length = of_read_number((const __be32 *)&form2_distances[0], 1);
+ 	/* Skip the size which is encoded int */
+-	numa_dist_table += sizeof(__be32);
++	form2_distances += sizeof(__be32);
+ 
+-	pr_debug("numa_dist_table_len = %d, numa_dist_indexes_len = %d\n",
+-		 numa_dist_table_length, max_numa_index);
++	pr_debug("form2_distances_len = %d, numa_dist_indexes_len = %d\n",
++		 form2_distances_length, max_numa_index);
+ 
+ 	for (i = 0; i < max_numa_index; i++)
+ 		/* +1 skip the max_numa_index in the property */
+ 		numa_id_index_table[i] = of_read_number(&numa_lookup_index[i + 1], 1);
+ 
+ 
+-	if (numa_dist_table_length != max_numa_index * max_numa_index) {
++	if (form2_distances_length != max_numa_index * max_numa_index) {
+ 		WARN(1, "Wrong NUMA distance information\n");
+-		/* consider everybody else just remote. */
+-		for (i = 0;  i < max_numa_index; i++) {
+-			for (j = 0; j < max_numa_index; j++) {
+-				int nodeA = numa_id_index_table[i];
+-				int nodeB = numa_id_index_table[j];
+-
+-				if (nodeA == nodeB)
+-					numa_distance_table[nodeA][nodeB] = LOCAL_DISTANCE;
+-				else
+-					numa_distance_table[nodeA][nodeB] = REMOTE_DISTANCE;
+-			}
+-		}
++		form2_distances = NULL; // don't use it
+ 	}
+-
+ 	distance_index = 0;
+ 	for (i = 0;  i < max_numa_index; i++) {
+ 		for (j = 0; j < max_numa_index; j++) {
+ 			int nodeA = numa_id_index_table[i];
+ 			int nodeB = numa_id_index_table[j];
+-
+-			numa_distance_table[nodeA][nodeB] = numa_dist_table[distance_index++];
+-			pr_debug("dist[%d][%d]=%d ", nodeA, nodeB, numa_distance_table[nodeA][nodeB]);
++			int dist;
++
++			if (form2_distances)
++				dist = form2_distances[distance_index++];
++			else if (nodeA == nodeB)
++				dist = LOCAL_DISTANCE;
++			else
++				dist = REMOTE_DISTANCE;
++			numa_distance_table[nodeA][nodeB] = dist;
++			pr_debug("dist[%d][%d]=%d ", nodeA, nodeB, dist);
+ 		}
+ 	}
++
+ 	of_node_put(root);
+ }
+ 
+diff --git a/arch/powerpc/sysdev/dcr-low.S b/arch/powerpc/sysdev/dcr-low.S
+index efeeb1b885a17..329b9c4ae5429 100644
+--- a/arch/powerpc/sysdev/dcr-low.S
++++ b/arch/powerpc/sysdev/dcr-low.S
+@@ -11,7 +11,7 @@
+ #include <asm/export.h>
+ 
+ #define DCR_ACCESS_PROLOG(table) \
+-	cmpli	cr0,r3,1024;	 \
++	cmplwi	cr0,r3,1024;	 \
+ 	rlwinm  r3,r3,4,18,27;   \
+ 	lis     r5,table@h;      \
+ 	ori     r5,r5,table@l;   \
+diff --git a/arch/powerpc/sysdev/xive/Kconfig b/arch/powerpc/sysdev/xive/Kconfig
+index 97796c6b63f04..785c292d104b7 100644
+--- a/arch/powerpc/sysdev/xive/Kconfig
++++ b/arch/powerpc/sysdev/xive/Kconfig
+@@ -3,7 +3,6 @@ config PPC_XIVE
+ 	bool
+ 	select PPC_SMP_MUXED_IPI
+ 	select HARDIRQS_SW_RESEND
+-	select IRQ_DOMAIN_NOMAP
+ 
+ config PPC_XIVE_NATIVE
+ 	bool
+diff --git a/arch/powerpc/sysdev/xive/common.c b/arch/powerpc/sysdev/xive/common.c
+index c5d75c02ad8b5..7b69299c29123 100644
+--- a/arch/powerpc/sysdev/xive/common.c
++++ b/arch/powerpc/sysdev/xive/common.c
+@@ -1443,8 +1443,7 @@ static const struct irq_domain_ops xive_irq_domain_ops = {
+ 
+ static void __init xive_init_host(struct device_node *np)
+ {
+-	xive_irq_domain = irq_domain_add_nomap(np, XIVE_MAX_IRQ,
+-					       &xive_irq_domain_ops, NULL);
++	xive_irq_domain = irq_domain_add_tree(np, &xive_irq_domain_ops, NULL);
+ 	if (WARN_ON(xive_irq_domain == NULL))
+ 		return;
+ 	irq_set_default_host(xive_irq_domain);
+diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
+index 0eb4568fbd290..41f3a75fe2ec8 100644
+--- a/arch/riscv/Makefile
++++ b/arch/riscv/Makefile
+@@ -108,11 +108,13 @@ PHONY += vdso_install
+ vdso_install:
+ 	$(Q)$(MAKE) $(build)=arch/riscv/kernel/vdso $@
+ 
++ifeq ($(KBUILD_EXTMOD),)
+ ifeq ($(CONFIG_MMU),y)
+ prepare: vdso_prepare
+ vdso_prepare: prepare0
+ 	$(Q)$(MAKE) $(build)=arch/riscv/kernel/vdso include/generated/vdso-offsets.h
+ endif
++endif
+ 
+ ifneq ($(CONFIG_XIP_KERNEL),y)
+ ifeq ($(CONFIG_RISCV_M_MODE)$(CONFIG_SOC_CANAAN),yy)
+diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
+index b86de61b8caa2..797041b5109a2 100644
+--- a/arch/s390/Kconfig
++++ b/arch/s390/Kconfig
+@@ -47,7 +47,7 @@ config ARCH_SUPPORTS_UPROBES
+ config KASAN_SHADOW_OFFSET
+ 	hex
+ 	depends on KASAN
+-	default 0x18000000000000
++	default 0x1C000000000000
+ 
+ config S390
+ 	def_bool y
+diff --git a/arch/s390/Makefile b/arch/s390/Makefile
+index 450b351dfa8ef..d4fd1426a8226 100644
+--- a/arch/s390/Makefile
++++ b/arch/s390/Makefile
+@@ -79,10 +79,12 @@ KBUILD_AFLAGS_DECOMPRESSOR += $(aflags-y)
+ KBUILD_CFLAGS_DECOMPRESSOR += $(cflags-y)
+ 
+ ifneq ($(call cc-option,-mstack-size=8192 -mstack-guard=128),)
+-cflags-$(CONFIG_CHECK_STACK) += -mstack-size=$(STACK_SIZE)
+-ifeq ($(call cc-option,-mstack-size=8192),)
+-cflags-$(CONFIG_CHECK_STACK) += -mstack-guard=$(CONFIG_STACK_GUARD)
+-endif
++  CC_FLAGS_CHECK_STACK := -mstack-size=$(STACK_SIZE)
++  ifeq ($(call cc-option,-mstack-size=8192),)
++    CC_FLAGS_CHECK_STACK += -mstack-guard=$(CONFIG_STACK_GUARD)
++  endif
++  export CC_FLAGS_CHECK_STACK
++  cflags-$(CONFIG_CHECK_STACK) += $(CC_FLAGS_CHECK_STACK)
+ endif
+ 
+ ifdef CONFIG_EXPOLINE
+diff --git a/arch/s390/boot/startup.c b/arch/s390/boot/startup.c
+index 6dc8d0a538640..b13352dd1e1cf 100644
+--- a/arch/s390/boot/startup.c
++++ b/arch/s390/boot/startup.c
+@@ -148,82 +148,56 @@ static void setup_ident_map_size(unsigned long max_physmem_end)
+ 
+ static void setup_kernel_memory_layout(void)
+ {
+-	bool vmalloc_size_verified = false;
+-	unsigned long vmemmap_off;
+-	unsigned long vspace_left;
++	unsigned long vmemmap_start;
+ 	unsigned long rte_size;
+ 	unsigned long pages;
+-	unsigned long vmax;
+ 
+ 	pages = ident_map_size / PAGE_SIZE;
+ 	/* vmemmap contains a multiple of PAGES_PER_SECTION struct pages */
+ 	vmemmap_size = SECTION_ALIGN_UP(pages) * sizeof(struct page);
+ 
+ 	/* choose kernel address space layout: 4 or 3 levels. */
+-	vmemmap_off = round_up(ident_map_size, _REGION3_SIZE);
++	vmemmap_start = round_up(ident_map_size, _REGION3_SIZE);
+ 	if (IS_ENABLED(CONFIG_KASAN) ||
+ 	    vmalloc_size > _REGION2_SIZE ||
+-	    vmemmap_off + vmemmap_size + vmalloc_size + MODULES_LEN > _REGION2_SIZE)
+-		vmax = _REGION1_SIZE;
+-	else
+-		vmax = _REGION2_SIZE;
+-
+-	/* keep vmemmap_off aligned to a top level region table entry */
+-	rte_size = vmax == _REGION1_SIZE ? _REGION2_SIZE : _REGION3_SIZE;
+-	MODULES_END = vmax;
+-	if (is_prot_virt_host()) {
+-		/*
+-		 * forcing modules and vmalloc area under the ultravisor
+-		 * secure storage limit, so that any vmalloc allocation
+-		 * we do could be used to back secure guest storage.
+-		 */
+-		adjust_to_uv_max(&MODULES_END);
+-	}
+-
+-#ifdef CONFIG_KASAN
+-	if (MODULES_END < vmax) {
+-		/* force vmalloc and modules below kasan shadow */
+-		MODULES_END = min(MODULES_END, KASAN_SHADOW_START);
++	    vmemmap_start + vmemmap_size + vmalloc_size + MODULES_LEN >
++		    _REGION2_SIZE) {
++		MODULES_END = _REGION1_SIZE;
++		rte_size = _REGION2_SIZE;
+ 	} else {
+-		/*
+-		 * leave vmalloc and modules above kasan shadow but make
+-		 * sure they don't overlap with it
+-		 */
+-		vmalloc_size = min(vmalloc_size, vmax - KASAN_SHADOW_END - MODULES_LEN);
+-		vmalloc_size_verified = true;
+-		vspace_left = KASAN_SHADOW_START;
++		MODULES_END = _REGION2_SIZE;
++		rte_size = _REGION3_SIZE;
+ 	}
++	/*
++	 * forcing modules and vmalloc area under the ultravisor
++	 * secure storage limit, so that any vmalloc allocation
++	 * we do could be used to back secure guest storage.
++	 */
++	adjust_to_uv_max(&MODULES_END);
++#ifdef CONFIG_KASAN
++	/* force vmalloc and modules below kasan shadow */
++	MODULES_END = min(MODULES_END, KASAN_SHADOW_START);
+ #endif
+ 	MODULES_VADDR = MODULES_END - MODULES_LEN;
+ 	VMALLOC_END = MODULES_VADDR;
+ 
+-	if (vmalloc_size_verified) {
+-		VMALLOC_START = VMALLOC_END - vmalloc_size;
+-	} else {
+-		vmemmap_off = round_up(ident_map_size, rte_size);
+-
+-		if (vmemmap_off + vmemmap_size > VMALLOC_END ||
+-		    vmalloc_size > VMALLOC_END - vmemmap_off - vmemmap_size) {
+-			/*
+-			 * allow vmalloc area to occupy up to 1/2 of
+-			 * the rest virtual space left.
+-			 */
+-			vmalloc_size = min(vmalloc_size, VMALLOC_END / 2);
+-		}
+-		VMALLOC_START = VMALLOC_END - vmalloc_size;
+-		vspace_left = VMALLOC_START;
+-	}
++	/* allow vmalloc area to occupy up to about 1/2 of the rest virtual space left */
++	vmalloc_size = min(vmalloc_size, round_down(VMALLOC_END / 2, _REGION3_SIZE));
++	VMALLOC_START = VMALLOC_END - vmalloc_size;
+ 
+-	pages = vspace_left / (PAGE_SIZE + sizeof(struct page));
++	/* split remaining virtual space between 1:1 mapping & vmemmap array */
++	pages = VMALLOC_START / (PAGE_SIZE + sizeof(struct page));
+ 	pages = SECTION_ALIGN_UP(pages);
+-	vmemmap_off = round_up(vspace_left - pages * sizeof(struct page), rte_size);
+-	/* keep vmemmap left most starting from a fresh region table entry */
+-	vmemmap_off = min(vmemmap_off, round_up(ident_map_size, rte_size));
+-	/* take care that identity map is lower then vmemmap */
+-	ident_map_size = min(ident_map_size, vmemmap_off);
++	/* keep vmemmap_start aligned to a top level region table entry */
++	vmemmap_start = round_down(VMALLOC_START - pages * sizeof(struct page), rte_size);
++	/* vmemmap_start is the future VMEM_MAX_PHYS, make sure it is within MAX_PHYSMEM */
++	vmemmap_start = min(vmemmap_start, 1UL << MAX_PHYSMEM_BITS);
++	/* make sure identity map doesn't overlay with vmemmap */
++	ident_map_size = min(ident_map_size, vmemmap_start);
+ 	vmemmap_size = SECTION_ALIGN_UP(ident_map_size / PAGE_SIZE) * sizeof(struct page);
+-	VMALLOC_START = max(vmemmap_off + vmemmap_size, VMALLOC_START);
+-	vmemmap = (struct page *)vmemmap_off;
++	/* make sure vmemmap doesn't overlay with vmalloc area */
++	VMALLOC_START = max(vmemmap_start + vmemmap_size, VMALLOC_START);
++	vmemmap = (struct page *)vmemmap_start;
+ }
+ 
+ /*
+diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h
+index ea398a05f6432..7f3c9ac34bd8d 100644
+--- a/arch/s390/include/asm/kexec.h
++++ b/arch/s390/include/asm/kexec.h
+@@ -74,6 +74,12 @@ void *kexec_file_add_components(struct kimage *image,
+ int arch_kexec_do_relocs(int r_type, void *loc, unsigned long val,
+ 			 unsigned long addr);
+ 
++#define ARCH_HAS_KIMAGE_ARCH
++
++struct kimage_arch {
++	void *ipl_buf;
++};
++
+ extern const struct kexec_file_ops s390_kexec_image_ops;
+ extern const struct kexec_file_ops s390_kexec_elf_ops;
+ 
+diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c
+index d72a6df058d79..785d54c9350c4 100644
+--- a/arch/s390/kernel/crash_dump.c
++++ b/arch/s390/kernel/crash_dump.c
+@@ -191,8 +191,8 @@ static int copy_oldmem_user(void __user *dst, void *src, size_t count)
+ 				return rc;
+ 		} else {
+ 			/* Check for swapped kdump oldmem areas */
+-			if (oldmem_data.start && from - oldmem_data.size < oldmem_data.size) {
+-				from -= oldmem_data.size;
++			if (oldmem_data.start && from - oldmem_data.start < oldmem_data.size) {
++				from -= oldmem_data.start;
+ 				len = min(count, oldmem_data.size - from);
+ 			} else if (oldmem_data.start && from < oldmem_data.size) {
+ 				len = min(count, oldmem_data.size - from);
+diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
+index e2cc35775b996..5ad1dde23dc59 100644
+--- a/arch/s390/kernel/ipl.c
++++ b/arch/s390/kernel/ipl.c
+@@ -2156,7 +2156,7 @@ void *ipl_report_finish(struct ipl_report *report)
+ 
+ 	buf = vzalloc(report->size);
+ 	if (!buf)
+-		return ERR_PTR(-ENOMEM);
++		goto out;
+ 	ptr = buf;
+ 
+ 	memcpy(ptr, report->ipib, report->ipib->hdr.len);
+@@ -2195,6 +2195,7 @@ void *ipl_report_finish(struct ipl_report *report)
+ 	}
+ 
+ 	BUG_ON(ptr > buf + report->size);
++out:
+ 	return buf;
+ }
+ 
+diff --git a/arch/s390/kernel/machine_kexec_file.c b/arch/s390/kernel/machine_kexec_file.c
+index f9e4baa64b675..e7435f3a3d2d2 100644
+--- a/arch/s390/kernel/machine_kexec_file.c
++++ b/arch/s390/kernel/machine_kexec_file.c
+@@ -12,6 +12,7 @@
+ #include <linux/kexec.h>
+ #include <linux/module_signature.h>
+ #include <linux/verification.h>
++#include <linux/vmalloc.h>
+ #include <asm/boot_data.h>
+ #include <asm/ipl.h>
+ #include <asm/setup.h>
+@@ -170,6 +171,7 @@ static int kexec_file_add_ipl_report(struct kimage *image,
+ 	struct kexec_buf buf;
+ 	unsigned long addr;
+ 	void *ptr, *end;
++	int ret;
+ 
+ 	buf.image = image;
+ 
+@@ -199,9 +201,13 @@ static int kexec_file_add_ipl_report(struct kimage *image,
+ 		ptr += len;
+ 	}
+ 
++	ret = -ENOMEM;
+ 	buf.buffer = ipl_report_finish(data->report);
++	if (!buf.buffer)
++		goto out;
+ 	buf.bufsz = data->report->size;
+ 	buf.memsz = buf.bufsz;
++	image->arch.ipl_buf = buf.buffer;
+ 
+ 	data->memsz += buf.memsz;
+ 
+@@ -209,7 +215,9 @@ static int kexec_file_add_ipl_report(struct kimage *image,
+ 		data->kernel_buf + offsetof(struct lowcore, ipl_parmblock_ptr);
+ 	*lc_ipl_parmblock_ptr = (__u32)buf.mem;
+ 
+-	return kexec_add_buffer(&buf);
++	ret = kexec_add_buffer(&buf);
++out:
++	return ret;
+ }
+ 
+ void *kexec_file_add_components(struct kimage *image,
+@@ -321,3 +329,11 @@ int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
+ 
+ 	return kexec_image_probe_default(image, buf, buf_len);
+ }
++
++int arch_kimage_file_post_load_cleanup(struct kimage *image)
++{
++	vfree(image->arch.ipl_buf);
++	image->arch.ipl_buf = NULL;
++
++	return kexec_image_post_load_cleanup_default(image);
++}
+diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
+index 67e5fff96ee06..d77269f168948 100644
+--- a/arch/s390/kernel/setup.c
++++ b/arch/s390/kernel/setup.c
+@@ -633,14 +633,6 @@ static struct notifier_block kdump_mem_nb = {
+ 
+ #endif
+ 
+-/*
+- * Make sure that the area above identity mapping is protected
+- */
+-static void __init reserve_above_ident_map(void)
+-{
+-	memblock_reserve(ident_map_size, ULONG_MAX);
+-}
+-
+ /*
+  * Reserve memory for kdump kernel to be loaded with kexec
+  */
+@@ -1005,11 +997,11 @@ void __init setup_arch(char **cmdline_p)
+ 	setup_control_program_code();
+ 
+ 	/* Do some memory reservations *before* memory is added to memblock */
+-	reserve_above_ident_map();
+ 	reserve_kernel();
+ 	reserve_initrd();
+ 	reserve_certificate_list();
+ 	reserve_mem_detect_info();
++	memblock_set_current_limit(ident_map_size);
+ 	memblock_allow_resize();
+ 
+ 	/* Get information about *all* installed memory */
+diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c
+index bcefc2173de45..12d28ff5281fa 100644
+--- a/arch/s390/kernel/traps.c
++++ b/arch/s390/kernel/traps.c
+@@ -84,7 +84,7 @@ static void default_trap_handler(struct pt_regs *regs)
+ {
+ 	if (user_mode(regs)) {
+ 		report_user_fault(regs, SIGSEGV, 0);
+-		do_exit(SIGSEGV);
++		force_exit_sig(SIGSEGV);
+ 	} else
+ 		die(regs, "Unknown program exception");
+ }
+diff --git a/arch/s390/kernel/vdso64/Makefile b/arch/s390/kernel/vdso64/Makefile
+index 6568de2367010..0dea82b87e54b 100644
+--- a/arch/s390/kernel/vdso64/Makefile
++++ b/arch/s390/kernel/vdso64/Makefile
+@@ -8,8 +8,9 @@ ARCH_REL_TYPE_ABS += R_390_GOT|R_390_PLT
+ include $(srctree)/lib/vdso/Makefile
+ obj-vdso64 = vdso_user_wrapper.o note.o
+ obj-cvdso64 = vdso64_generic.o getcpu.o
+-CFLAGS_REMOVE_getcpu.o = -pg $(CC_FLAGS_FTRACE) $(CC_FLAGS_EXPOLINE)
+-CFLAGS_REMOVE_vdso64_generic.o = -pg $(CC_FLAGS_FTRACE) $(CC_FLAGS_EXPOLINE)
++VDSO_CFLAGS_REMOVE := -pg $(CC_FLAGS_FTRACE) $(CC_FLAGS_EXPOLINE) $(CC_FLAGS_CHECK_STACK)
++CFLAGS_REMOVE_getcpu.o = $(VDSO_CFLAGS_REMOVE)
++CFLAGS_REMOVE_vdso64_generic.o = $(VDSO_CFLAGS_REMOVE)
+ 
+ # Build rules
+ 
+diff --git a/arch/sh/Kconfig.debug b/arch/sh/Kconfig.debug
+index 958f790273ab9..10290e5c1f438 100644
+--- a/arch/sh/Kconfig.debug
++++ b/arch/sh/Kconfig.debug
+@@ -54,6 +54,7 @@ config DUMP_CODE
+ 
+ config DWARF_UNWINDER
+ 	bool "Enable the DWARF unwinder for stacktraces"
++	depends on DEBUG_KERNEL
+ 	select FRAME_POINTER
+ 	default n
+ 	help
+diff --git a/arch/sh/include/asm/sfp-machine.h b/arch/sh/include/asm/sfp-machine.h
+index cbc7cf8c97ce6..2d2423478b71d 100644
+--- a/arch/sh/include/asm/sfp-machine.h
++++ b/arch/sh/include/asm/sfp-machine.h
+@@ -13,6 +13,14 @@
+ #ifndef _SFP_MACHINE_H
+ #define _SFP_MACHINE_H
+ 
++#ifdef __BIG_ENDIAN__
++#define __BYTE_ORDER __BIG_ENDIAN
++#define __LITTLE_ENDIAN 0
++#else
++#define __BYTE_ORDER __LITTLE_ENDIAN
++#define __BIG_ENDIAN 0
++#endif
++
+ #define _FP_W_TYPE_SIZE		32
+ #define _FP_W_TYPE		unsigned long
+ #define _FP_WS_TYPE		signed long
+diff --git a/arch/sh/kernel/cpu/sh4a/smp-shx3.c b/arch/sh/kernel/cpu/sh4a/smp-shx3.c
+index f8a2bec0f260b..1261dc7b84e8b 100644
+--- a/arch/sh/kernel/cpu/sh4a/smp-shx3.c
++++ b/arch/sh/kernel/cpu/sh4a/smp-shx3.c
+@@ -73,8 +73,9 @@ static void shx3_prepare_cpus(unsigned int max_cpus)
+ 	BUILD_BUG_ON(SMP_MSG_NR >= 8);
+ 
+ 	for (i = 0; i < SMP_MSG_NR; i++)
+-		request_irq(104 + i, ipi_interrupt_handler,
+-			    IRQF_PERCPU, "IPI", (void *)(long)i);
++		if (request_irq(104 + i, ipi_interrupt_handler,
++			    IRQF_PERCPU, "IPI", (void *)(long)i))
++			pr_err("Failed to request irq %d\n", i);
+ 
+ 	for (i = 0; i < max_cpus; i++)
+ 		set_cpu_present(i, true);
+diff --git a/arch/sh/math-emu/math.c b/arch/sh/math-emu/math.c
+index e8be0eca0444a..615ba932c398e 100644
+--- a/arch/sh/math-emu/math.c
++++ b/arch/sh/math-emu/math.c
+@@ -467,109 +467,6 @@ static int fpu_emulate(u16 code, struct sh_fpu_soft_struct *fregs, struct pt_reg
+ 		return id_sys(fregs, regs, code);
+ }
+ 
+-/**
+- *	denormal_to_double - Given denormalized float number,
+- *	                     store double float
+- *
+- *	@fpu: Pointer to sh_fpu_soft structure
+- *	@n: Index to FP register
+- */
+-static void denormal_to_double(struct sh_fpu_soft_struct *fpu, int n)
+-{
+-	unsigned long du, dl;
+-	unsigned long x = fpu->fpul;
+-	int exp = 1023 - 126;
+-
+-	if (x != 0 && (x & 0x7f800000) == 0) {
+-		du = (x & 0x80000000);
+-		while ((x & 0x00800000) == 0) {
+-			x <<= 1;
+-			exp--;
+-		}
+-		x &= 0x007fffff;
+-		du |= (exp << 20) | (x >> 3);
+-		dl = x << 29;
+-
+-		fpu->fp_regs[n] = du;
+-		fpu->fp_regs[n+1] = dl;
+-	}
+-}
+-
+-/**
+- *	ieee_fpe_handler - Handle denormalized number exception
+- *
+- *	@regs: Pointer to register structure
+- *
+- *	Returns 1 when it's handled (should not cause exception).
+- */
+-static int ieee_fpe_handler(struct pt_regs *regs)
+-{
+-	unsigned short insn = *(unsigned short *)regs->pc;
+-	unsigned short finsn;
+-	unsigned long nextpc;
+-	int nib[4] = {
+-		(insn >> 12) & 0xf,
+-		(insn >> 8) & 0xf,
+-		(insn >> 4) & 0xf,
+-		insn & 0xf};
+-
+-	if (nib[0] == 0xb ||
+-	    (nib[0] == 0x4 && nib[2] == 0x0 && nib[3] == 0xb)) /* bsr & jsr */
+-		regs->pr = regs->pc + 4;
+-
+-	if (nib[0] == 0xa || nib[0] == 0xb) { /* bra & bsr */
+-		nextpc = regs->pc + 4 + ((short) ((insn & 0xfff) << 4) >> 3);
+-		finsn = *(unsigned short *) (regs->pc + 2);
+-	} else if (nib[0] == 0x8 && nib[1] == 0xd) { /* bt/s */
+-		if (regs->sr & 1)
+-			nextpc = regs->pc + 4 + ((char) (insn & 0xff) << 1);
+-		else
+-			nextpc = regs->pc + 4;
+-		finsn = *(unsigned short *) (regs->pc + 2);
+-	} else if (nib[0] == 0x8 && nib[1] == 0xf) { /* bf/s */
+-		if (regs->sr & 1)
+-			nextpc = regs->pc + 4;
+-		else
+-			nextpc = regs->pc + 4 + ((char) (insn & 0xff) << 1);
+-		finsn = *(unsigned short *) (regs->pc + 2);
+-	} else if (nib[0] == 0x4 && nib[3] == 0xb &&
+-		 (nib[2] == 0x0 || nib[2] == 0x2)) { /* jmp & jsr */
+-		nextpc = regs->regs[nib[1]];
+-		finsn = *(unsigned short *) (regs->pc + 2);
+-	} else if (nib[0] == 0x0 && nib[3] == 0x3 &&
+-		 (nib[2] == 0x0 || nib[2] == 0x2)) { /* braf & bsrf */
+-		nextpc = regs->pc + 4 + regs->regs[nib[1]];
+-		finsn = *(unsigned short *) (regs->pc + 2);
+-	} else if (insn == 0x000b) { /* rts */
+-		nextpc = regs->pr;
+-		finsn = *(unsigned short *) (regs->pc + 2);
+-	} else {
+-		nextpc = regs->pc + 2;
+-		finsn = insn;
+-	}
+-
+-	if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */
+-		struct task_struct *tsk = current;
+-
+-		if ((tsk->thread.xstate->softfpu.fpscr & (1 << 17))) {
+-			/* FPU error */
+-			denormal_to_double (&tsk->thread.xstate->softfpu,
+-					    (finsn >> 8) & 0xf);
+-			tsk->thread.xstate->softfpu.fpscr &=
+-				~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK);
+-			task_thread_info(tsk)->status |= TS_USEDFPU;
+-		} else {
+-			force_sig_fault(SIGFPE, FPE_FLTINV,
+-					(void __user *)regs->pc);
+-		}
+-
+-		regs->pc = nextpc;
+-		return 1;
+-	}
+-
+-	return 0;
+-}
+-
+ /**
+  * fpu_init - Initialize FPU registers
+  * @fpu: Pointer to software emulated FPU registers.
+diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c
+index 02f3ad55dfe31..ffab16369beac 100644
+--- a/arch/sparc/kernel/signal_32.c
++++ b/arch/sparc/kernel/signal_32.c
+@@ -244,7 +244,7 @@ static int setup_frame(struct ksignal *ksig, struct pt_regs *regs,
+ 		get_sigframe(ksig, regs, sigframe_size);
+ 
+ 	if (invalid_frame_pointer(sf, sigframe_size)) {
+-		do_exit(SIGILL);
++		force_exit_sig(SIGILL);
+ 		return -EINVAL;
+ 	}
+ 
+@@ -336,7 +336,7 @@ static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs,
+ 	sf = (struct rt_signal_frame __user *)
+ 		get_sigframe(ksig, regs, sigframe_size);
+ 	if (invalid_frame_pointer(sf, sigframe_size)) {
+-		do_exit(SIGILL);
++		force_exit_sig(SIGILL);
+ 		return -EINVAL;
+ 	}
+ 
+diff --git a/arch/sparc/kernel/windows.c b/arch/sparc/kernel/windows.c
+index 69a6ba6e92937..8f20862ccc83e 100644
+--- a/arch/sparc/kernel/windows.c
++++ b/arch/sparc/kernel/windows.c
+@@ -121,8 +121,10 @@ void try_to_clear_window_buffer(struct pt_regs *regs, int who)
+ 
+ 		if ((sp & 7) ||
+ 		    copy_to_user((char __user *) sp, &tp->reg_window[window],
+-				 sizeof(struct reg_window32)))
+-			do_exit(SIGILL);
++				 sizeof(struct reg_window32))) {
++			force_exit_sig(SIGILL);
++			return;
++		}
+ 	}
+ 	tp->w_saved = 0;
+ }
+diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c
+index 3198c47673879..c32efb09db214 100644
+--- a/arch/um/kernel/trap.c
++++ b/arch/um/kernel/trap.c
+@@ -158,7 +158,7 @@ static void bad_segv(struct faultinfo fi, unsigned long ip)
+ 
+ void fatal_sigsegv(void)
+ {
+-	force_sigsegv(SIGSEGV);
++	force_fatal_sig(SIGSEGV);
+ 	do_signal(&current->thread.regs);
+ 	/*
+ 	 * This is to tell gcc that we're not returning - do_signal
+diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
+index ab9a4cbda78b8..6ce906815bb28 100644
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -1256,7 +1256,8 @@ config TOSHIBA
+ 
+ config I8K
+ 	tristate "Dell i8k legacy laptop support"
+-	select HWMON
++	depends on HWMON
++	depends on PROC_FS
+ 	select SENSORS_DELL_SMM
+ 	help
+ 	  This option enables legacy /proc/i8k userspace interface in hwmon
+diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c b/arch/x86/entry/vsyscall/vsyscall_64.c
+index 1b40b92970831..fd2ee9408e914 100644
+--- a/arch/x86/entry/vsyscall/vsyscall_64.c
++++ b/arch/x86/entry/vsyscall/vsyscall_64.c
+@@ -226,7 +226,8 @@ bool emulate_vsyscall(unsigned long error_code,
+ 	if ((!tmp && regs->orig_ax != syscall_nr) || regs->ip != address) {
+ 		warn_bad_vsyscall(KERN_DEBUG, regs,
+ 				  "seccomp tried to change syscall nr or ip");
+-		do_exit(SIGSYS);
++		force_exit_sig(SIGSYS);
++		return true;
+ 	}
+ 	regs->orig_ax = -1;
+ 	if (tmp)
+diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
+index bc3f97f834011..c7f1cc433a6aa 100644
+--- a/arch/x86/events/intel/core.c
++++ b/arch/x86/events/intel/core.c
+@@ -2999,8 +2999,10 @@ intel_vlbr_constraints(struct perf_event *event)
+ {
+ 	struct event_constraint *c = &vlbr_constraint;
+ 
+-	if (unlikely(constraint_match(c, event->hw.config)))
++	if (unlikely(constraint_match(c, event->hw.config))) {
++		event->hw.flags |= c->flags;
+ 		return c;
++	}
+ 
+ 	return NULL;
+ }
+diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c
+index eb2c6cea9d0d5..3660f698fb2aa 100644
+--- a/arch/x86/events/intel/uncore_snbep.c
++++ b/arch/x86/events/intel/uncore_snbep.c
+@@ -3608,6 +3608,9 @@ static int skx_cha_hw_config(struct intel_uncore_box *box, struct perf_event *ev
+ 	struct hw_perf_event_extra *reg1 = &event->hw.extra_reg;
+ 	struct extra_reg *er;
+ 	int idx = 0;
++	/* Any of the CHA events may be filtered by Thread/Core-ID.*/
++	if (event->hw.config & SNBEP_CBO_PMON_CTL_TID_EN)
++		idx = SKX_CHA_MSR_PMON_BOX_FILTER_TID;
+ 
+ 	for (er = skx_uncore_cha_extra_regs; er->msr; er++) {
+ 		if (er->event != (event->hw.config & er->config_mask))
+@@ -3675,6 +3678,7 @@ static struct event_constraint skx_uncore_iio_constraints[] = {
+ 	UNCORE_EVENT_CONSTRAINT(0xc0, 0xc),
+ 	UNCORE_EVENT_CONSTRAINT(0xc5, 0xc),
+ 	UNCORE_EVENT_CONSTRAINT(0xd4, 0xc),
++	UNCORE_EVENT_CONSTRAINT(0xd5, 0xc),
+ 	EVENT_CONSTRAINT_END
+ };
+ 
+@@ -4525,6 +4529,13 @@ static void snr_iio_cleanup_mapping(struct intel_uncore_type *type)
+ 	pmu_iio_cleanup_mapping(type, &snr_iio_mapping_group);
+ }
+ 
++static struct event_constraint snr_uncore_iio_constraints[] = {
++	UNCORE_EVENT_CONSTRAINT(0x83, 0x3),
++	UNCORE_EVENT_CONSTRAINT(0xc0, 0xc),
++	UNCORE_EVENT_CONSTRAINT(0xd5, 0xc),
++	EVENT_CONSTRAINT_END
++};
++
+ static struct intel_uncore_type snr_uncore_iio = {
+ 	.name			= "iio",
+ 	.num_counters		= 4,
+@@ -4536,6 +4547,7 @@ static struct intel_uncore_type snr_uncore_iio = {
+ 	.event_mask_ext		= SNR_IIO_PMON_RAW_EVENT_MASK_EXT,
+ 	.box_ctl		= SNR_IIO_MSR_PMON_BOX_CTL,
+ 	.msr_offset		= SNR_IIO_MSR_OFFSET,
++	.constraints		= snr_uncore_iio_constraints,
+ 	.ops			= &ivbep_uncore_msr_ops,
+ 	.format_group		= &snr_uncore_iio_format_group,
+ 	.attr_update		= snr_iio_attr_update,
+diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
+index 179fc173104d7..d20eef3d452a5 100644
+--- a/arch/x86/hyperv/hv_init.c
++++ b/arch/x86/hyperv/hv_init.c
+@@ -147,6 +147,9 @@ void set_hv_tscchange_cb(void (*cb)(void))
+ 		return;
+ 	}
+ 
++	if (!hv_vp_index)
++		return;
++
+ 	hv_reenlightenment_cb = cb;
+ 
+ 	/* Make sure callback is registered before we write to MSRs */
+diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
+index 750f74da9793c..fa24fd4d138df 100644
+--- a/arch/x86/include/asm/kvm_host.h
++++ b/arch/x86/include/asm/kvm_host.h
+@@ -364,6 +364,7 @@ union kvm_mmu_extended_role {
+ 		unsigned int cr4_smap:1;
+ 		unsigned int cr4_smep:1;
+ 		unsigned int cr4_la57:1;
++		unsigned int efer_lma:1;
+ 	};
+ };
+ 
+diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c
+index 63d3de02bbccb..8471a8b9b48e8 100644
+--- a/arch/x86/kernel/cpu/sgx/main.c
++++ b/arch/x86/kernel/cpu/sgx/main.c
+@@ -28,8 +28,7 @@ static DECLARE_WAIT_QUEUE_HEAD(ksgxd_waitq);
+ static LIST_HEAD(sgx_active_page_list);
+ static DEFINE_SPINLOCK(sgx_reclaimer_lock);
+ 
+-/* The free page list lock protected variables prepend the lock. */
+-static unsigned long sgx_nr_free_pages;
++static atomic_long_t sgx_nr_free_pages = ATOMIC_LONG_INIT(0);
+ 
+ /* Nodes with one or more EPC sections. */
+ static nodemask_t sgx_numa_mask;
+@@ -403,14 +402,15 @@ skip:
+ 
+ 		spin_lock(&node->lock);
+ 		list_add_tail(&epc_page->list, &node->free_page_list);
+-		sgx_nr_free_pages++;
+ 		spin_unlock(&node->lock);
++		atomic_long_inc(&sgx_nr_free_pages);
+ 	}
+ }
+ 
+ static bool sgx_should_reclaim(unsigned long watermark)
+ {
+-	return sgx_nr_free_pages < watermark && !list_empty(&sgx_active_page_list);
++	return atomic_long_read(&sgx_nr_free_pages) < watermark &&
++	       !list_empty(&sgx_active_page_list);
+ }
+ 
+ static int ksgxd(void *p)
+@@ -471,9 +471,9 @@ static struct sgx_epc_page *__sgx_alloc_epc_page_from_node(int nid)
+ 
+ 	page = list_first_entry(&node->free_page_list, struct sgx_epc_page, list);
+ 	list_del_init(&page->list);
+-	sgx_nr_free_pages--;
+ 
+ 	spin_unlock(&node->lock);
++	atomic_long_dec(&sgx_nr_free_pages);
+ 
+ 	return page;
+ }
+@@ -625,9 +625,9 @@ void sgx_free_epc_page(struct sgx_epc_page *page)
+ 	spin_lock(&node->lock);
+ 
+ 	list_add_tail(&page->list, &node->free_page_list);
+-	sgx_nr_free_pages++;
+ 
+ 	spin_unlock(&node->lock);
++	atomic_long_inc(&sgx_nr_free_pages);
+ }
+ 
+ static bool __init sgx_setup_epc_section(u64 phys_addr, u64 size,
+diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
+index 40ed44ead0631..d71267081153f 100644
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -742,6 +742,28 @@ dump_kernel_offset(struct notifier_block *self, unsigned long v, void *p)
+ 	return 0;
+ }
+ 
++static char *prepare_command_line(void)
++{
++#ifdef CONFIG_CMDLINE_BOOL
++#ifdef CONFIG_CMDLINE_OVERRIDE
++	strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
++#else
++	if (builtin_cmdline[0]) {
++		/* append boot loader cmdline to builtin */
++		strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
++		strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
++		strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
++	}
++#endif
++#endif
++
++	strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
++
++	parse_early_param();
++
++	return command_line;
++}
++
+ /*
+  * Determine if we were loaded by an EFI loader.  If so, then we have also been
+  * passed the efi memmap, systab, etc., so we should use these data structures
+@@ -830,6 +852,23 @@ void __init setup_arch(char **cmdline_p)
+ 
+ 	x86_init.oem.arch_setup();
+ 
++	/*
++	 * x86_configure_nx() is called before parse_early_param() (called by
++	 * prepare_command_line()) to detect whether hardware doesn't support
++	 * NX (so that the early EHCI debug console setup can safely call
++	 * set_fixmap()). It may then be called again from within noexec_setup()
++	 * during parsing early parameters to honor the respective command line
++	 * option.
++	 */
++	x86_configure_nx();
++
++	/*
++	 * This parses early params and it needs to run before
++	 * early_reserve_memory() because latter relies on such settings
++	 * supplied as early params.
++	 */
++	*cmdline_p = prepare_command_line();
++
+ 	/*
+ 	 * Do some memory reservations *before* memory is added to memblock, so
+ 	 * memblock allocations won't overwrite it.
+@@ -863,33 +902,6 @@ void __init setup_arch(char **cmdline_p)
+ 	bss_resource.start = __pa_symbol(__bss_start);
+ 	bss_resource.end = __pa_symbol(__bss_stop)-1;
+ 
+-#ifdef CONFIG_CMDLINE_BOOL
+-#ifdef CONFIG_CMDLINE_OVERRIDE
+-	strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
+-#else
+-	if (builtin_cmdline[0]) {
+-		/* append boot loader cmdline to builtin */
+-		strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
+-		strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
+-		strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
+-	}
+-#endif
+-#endif
+-
+-	strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
+-	*cmdline_p = command_line;
+-
+-	/*
+-	 * x86_configure_nx() is called before parse_early_param() to detect
+-	 * whether hardware doesn't support NX (so that the early EHCI debug
+-	 * console setup can safely call set_fixmap()). It may then be called
+-	 * again from within noexec_setup() during parsing early parameters
+-	 * to honor the respective command line option.
+-	 */
+-	x86_configure_nx();
+-
+-	parse_early_param();
+-
+ #ifdef CONFIG_MEMORY_HOTPLUG
+ 	/*
+ 	 * Memory used by the kernel cannot be hot-removed because Linux
+diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
+index e5a7a10a0164d..17d58740891e2 100644
+--- a/arch/x86/kernel/vm86_32.c
++++ b/arch/x86/kernel/vm86_32.c
+@@ -142,6 +142,7 @@ void save_v86_state(struct kernel_vm86_regs *regs, int retval)
+ 
+ 	user_access_end();
+ 
++exit_vm86:
+ 	preempt_disable();
+ 	tsk->thread.sp0 = vm86->saved_sp0;
+ 	tsk->thread.sysenter_cs = __KERNEL_CS;
+@@ -161,7 +162,8 @@ Efault_end:
+ 	user_access_end();
+ Efault:
+ 	pr_alert("could not access userspace vm86 info\n");
+-	do_exit(SIGSEGV);
++	force_exit_sig(SIGSEGV);
++	goto exit_vm86;
+ }
+ 
+ static int do_vm86_irq_handling(int subfunction, int irqnumber);
+diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
+index d5124b520f761..b9a13dc211d5d 100644
+--- a/arch/x86/kvm/hyperv.c
++++ b/arch/x86/kvm/hyperv.c
+@@ -2022,7 +2022,7 @@ static void kvm_hv_hypercall_set_result(struct kvm_vcpu *vcpu, u64 result)
+ {
+ 	bool longmode;
+ 
+-	longmode = is_64_bit_mode(vcpu);
++	longmode = is_64_bit_hypercall(vcpu);
+ 	if (longmode)
+ 		kvm_rax_write(vcpu, result);
+ 	else {
+@@ -2171,7 +2171,7 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
+ 	}
+ 
+ #ifdef CONFIG_X86_64
+-	if (is_64_bit_mode(vcpu)) {
++	if (is_64_bit_hypercall(vcpu)) {
+ 		hc.param = kvm_rcx_read(vcpu);
+ 		hc.ingpa = kvm_rdx_read(vcpu);
+ 		hc.outgpa = kvm_r8_read(vcpu);
+diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
+index 124168301d1ac..0e0f960a0bf8e 100644
+--- a/arch/x86/kvm/mmu/mmu.c
++++ b/arch/x86/kvm/mmu/mmu.c
+@@ -4679,6 +4679,7 @@ static union kvm_mmu_extended_role kvm_calc_mmu_role_ext(struct kvm_vcpu *vcpu,
+ 		/* PKEY and LA57 are active iff long mode is active. */
+ 		ext.cr4_pke = ____is_efer_lma(regs) && ____is_cr4_pke(regs);
+ 		ext.cr4_la57 = ____is_efer_lma(regs) && ____is_cr4_la57(regs);
++		ext.efer_lma = ____is_efer_lma(regs);
+ 	}
+ 
+ 	ext.valid = 1;
+diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c
+index 7e34d7163adab..ff19ce0780fea 100644
+--- a/arch/x86/kvm/svm/sev.c
++++ b/arch/x86/kvm/svm/sev.c
+@@ -1787,7 +1787,12 @@ int svm_vm_copy_asid_from(struct kvm *kvm, unsigned int source_fd)
+ 	mutex_unlock(&source_kvm->lock);
+ 	mutex_lock(&kvm->lock);
+ 
+-	if (sev_guest(kvm)) {
++	/*
++	 * Disallow out-of-band SEV/SEV-ES init if the target is already an
++	 * SEV guest, or if vCPUs have been created.  KVM relies on vCPUs being
++	 * created after SEV/SEV-ES initialization, e.g. to init intercepts.
++	 */
++	if (sev_guest(kvm) || kvm->created_vcpus) {
+ 		ret = -EINVAL;
+ 		goto e_mirror_unlock;
+ 	}
+diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
+index 3c9657f6923ec..8936d8383b2ee 100644
+--- a/arch/x86/kvm/vmx/nested.c
++++ b/arch/x86/kvm/vmx/nested.c
+@@ -2854,6 +2854,17 @@ static int nested_vmx_check_controls(struct kvm_vcpu *vcpu,
+ 	return 0;
+ }
+ 
++static int nested_vmx_check_address_space_size(struct kvm_vcpu *vcpu,
++				       struct vmcs12 *vmcs12)
++{
++#ifdef CONFIG_X86_64
++	if (CC(!!(vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) !=
++		!!(vcpu->arch.efer & EFER_LMA)))
++		return -EINVAL;
++#endif
++	return 0;
++}
++
+ static int nested_vmx_check_host_state(struct kvm_vcpu *vcpu,
+ 				       struct vmcs12 *vmcs12)
+ {
+@@ -2878,18 +2889,16 @@ static int nested_vmx_check_host_state(struct kvm_vcpu *vcpu,
+ 		return -EINVAL;
+ 
+ #ifdef CONFIG_X86_64
+-	ia32e = !!(vcpu->arch.efer & EFER_LMA);
++	ia32e = !!(vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE);
+ #else
+ 	ia32e = false;
+ #endif
+ 
+ 	if (ia32e) {
+-		if (CC(!(vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE)) ||
+-		    CC(!(vmcs12->host_cr4 & X86_CR4_PAE)))
++		if (CC(!(vmcs12->host_cr4 & X86_CR4_PAE)))
+ 			return -EINVAL;
+ 	} else {
+-		if (CC(vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) ||
+-		    CC(vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE) ||
++		if (CC(vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE) ||
+ 		    CC(vmcs12->host_cr4 & X86_CR4_PCIDE) ||
+ 		    CC((vmcs12->host_rip) >> 32))
+ 			return -EINVAL;
+@@ -3559,6 +3568,9 @@ static int nested_vmx_run(struct kvm_vcpu *vcpu, bool launch)
+ 	if (nested_vmx_check_controls(vcpu, vmcs12))
+ 		return nested_vmx_fail(vcpu, VMXERR_ENTRY_INVALID_CONTROL_FIELD);
+ 
++	if (nested_vmx_check_address_space_size(vcpu, vmcs12))
++		return nested_vmx_fail(vcpu, VMXERR_ENTRY_INVALID_HOST_STATE_FIELD);
++
+ 	if (nested_vmx_check_host_state(vcpu, vmcs12))
+ 		return nested_vmx_fail(vcpu, VMXERR_ENTRY_INVALID_HOST_STATE_FIELD);
+ 
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index c48e2b5729c5d..16c7465619f7a 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -8737,7 +8737,7 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
+ 
+ 	trace_kvm_hypercall(nr, a0, a1, a2, a3);
+ 
+-	op_64_bit = is_64_bit_mode(vcpu);
++	op_64_bit = is_64_bit_hypercall(vcpu);
+ 	if (!op_64_bit) {
+ 		nr &= 0xFFFFFFFF;
+ 		a0 &= 0xFFFFFFFF;
+@@ -9429,12 +9429,16 @@ static void vcpu_load_eoi_exitmap(struct kvm_vcpu *vcpu)
+ 	if (!kvm_apic_hw_enabled(vcpu->arch.apic))
+ 		return;
+ 
+-	if (to_hv_vcpu(vcpu))
++	if (to_hv_vcpu(vcpu)) {
+ 		bitmap_or((ulong *)eoi_exit_bitmap,
+ 			  vcpu->arch.ioapic_handled_vectors,
+ 			  to_hv_synic(vcpu)->vec_bitmap, 256);
++		static_call(kvm_x86_load_eoi_exitmap)(vcpu, eoi_exit_bitmap);
++		return;
++	}
+ 
+-	static_call(kvm_x86_load_eoi_exitmap)(vcpu, eoi_exit_bitmap);
++	static_call(kvm_x86_load_eoi_exitmap)(
++		vcpu, (u64 *)vcpu->arch.ioapic_handled_vectors);
+ }
+ 
+ void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
+diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h
+index 7d66d63dc55a6..9776a1db8ea85 100644
+--- a/arch/x86/kvm/x86.h
++++ b/arch/x86/kvm/x86.h
+@@ -153,12 +153,24 @@ static inline bool is_64_bit_mode(struct kvm_vcpu *vcpu)
+ {
+ 	int cs_db, cs_l;
+ 
++	WARN_ON_ONCE(vcpu->arch.guest_state_protected);
++
+ 	if (!is_long_mode(vcpu))
+ 		return false;
+ 	static_call(kvm_x86_get_cs_db_l_bits)(vcpu, &cs_db, &cs_l);
+ 	return cs_l;
+ }
+ 
++static inline bool is_64_bit_hypercall(struct kvm_vcpu *vcpu)
++{
++	/*
++	 * If running with protected guest state, the CS register is not
++	 * accessible. The hypercall register values will have had to been
++	 * provided in 64-bit mode, so assume the guest is in 64-bit.
++	 */
++	return vcpu->arch.guest_state_protected || is_64_bit_mode(vcpu);
++}
++
+ static inline bool x86_exception_has_error_code(unsigned int vector)
+ {
+ 	static u32 exception_has_error_code = BIT(DF_VECTOR) | BIT(TS_VECTOR) |
+diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c
+index 8f62baebd0286..0787d6645573e 100644
+--- a/arch/x86/kvm/xen.c
++++ b/arch/x86/kvm/xen.c
+@@ -299,7 +299,7 @@ int kvm_xen_hvm_get_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data)
+ 		break;
+ 
+ 	case KVM_XEN_ATTR_TYPE_SHARED_INFO:
+-		data->u.shared_info.gfn = gpa_to_gfn(kvm->arch.xen.shinfo_gfn);
++		data->u.shared_info.gfn = kvm->arch.xen.shinfo_gfn;
+ 		r = 0;
+ 		break;
+ 
+@@ -698,7 +698,7 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
+ 	    kvm_hv_hypercall_enabled(vcpu))
+ 		return kvm_hv_hypercall(vcpu);
+ 
+-	longmode = is_64_bit_mode(vcpu);
++	longmode = is_64_bit_hypercall(vcpu);
+ 	if (!longmode) {
+ 		params[0] = (u32)kvm_rbx_read(vcpu);
+ 		params[1] = (u32)kvm_rcx_read(vcpu);
+diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
+index ebff1af402e5b..0eec59e4df65c 100644
+--- a/block/blk-cgroup.c
++++ b/block/blk-cgroup.c
+@@ -639,7 +639,7 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
+ 	 */
+ 	ret = blk_queue_enter(q, 0);
+ 	if (ret)
+-		return ret;
++		goto fail;
+ 
+ 	rcu_read_lock();
+ 	spin_lock_irq(&q->queue_lock);
+@@ -675,13 +675,13 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
+ 		new_blkg = blkg_alloc(pos, q, GFP_KERNEL);
+ 		if (unlikely(!new_blkg)) {
+ 			ret = -ENOMEM;
+-			goto fail;
++			goto fail_exit_queue;
+ 		}
+ 
+ 		if (radix_tree_preload(GFP_KERNEL)) {
+ 			blkg_free(new_blkg);
+ 			ret = -ENOMEM;
+-			goto fail;
++			goto fail_exit_queue;
+ 		}
+ 
+ 		rcu_read_lock();
+@@ -721,9 +721,10 @@ fail_preloaded:
+ fail_unlock:
+ 	spin_unlock_irq(&q->queue_lock);
+ 	rcu_read_unlock();
++fail_exit_queue:
++	blk_queue_exit(q);
+ fail:
+ 	blkdev_put_no_open(bdev);
+-	blk_queue_exit(q);
+ 	/*
+ 	 * If queue was bypassing, we should retry.  Do so after a
+ 	 * short msleep().  It isn't strictly necessary but queue
+diff --git a/block/blk-core.c b/block/blk-core.c
+index 4d8f5fe915887..12aa8c1da6003 100644
+--- a/block/blk-core.c
++++ b/block/blk-core.c
+@@ -887,10 +887,8 @@ static noinline_for_stack bool submit_bio_checks(struct bio *bio)
+ 	if (unlikely(!current->io_context))
+ 		create_task_io_context(current, GFP_ATOMIC, q->node);
+ 
+-	if (blk_throtl_bio(bio)) {
+-		blkcg_bio_issue_init(bio);
++	if (blk_throtl_bio(bio))
+ 		return false;
+-	}
+ 
+ 	blk_cgroup_bio_start(bio);
+ 	blkcg_bio_issue_init(bio);
+diff --git a/block/ioprio.c b/block/ioprio.c
+index 0e4ff245f2bf2..313c14a70bbd3 100644
+--- a/block/ioprio.c
++++ b/block/ioprio.c
+@@ -69,7 +69,14 @@ int ioprio_check_cap(int ioprio)
+ 
+ 	switch (class) {
+ 		case IOPRIO_CLASS_RT:
+-			if (!capable(CAP_SYS_NICE) && !capable(CAP_SYS_ADMIN))
++			/*
++			 * Originally this only checked for CAP_SYS_ADMIN,
++			 * which was implicitly allowed for pid 0 by security
++			 * modules such as SELinux. Make sure we check
++			 * CAP_SYS_ADMIN first to avoid a denial/avc for
++			 * possibly missing CAP_SYS_NICE permission.
++			 */
++			if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_NICE))
+ 				return -EPERM;
+ 			fallthrough;
+ 			/* rt has prio field too */
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index 046faf0dbdd35..d8c3e730f7c2b 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -2031,8 +2031,9 @@ retry:
+ 			dev->horkage |= ATA_HORKAGE_NO_DMA_LOG;
+ 			goto retry;
+ 		}
+-		ata_dev_err(dev, "Read log page 0x%02x failed, Emask 0x%x\n",
+-			    (unsigned int)page, err_mask);
++		ata_dev_err(dev,
++			    "Read log 0x%02x page 0x%02x failed, Emask 0x%x\n",
++			    (unsigned int)log, (unsigned int)page, err_mask);
+ 	}
+ 
+ 	return err_mask;
+@@ -2166,6 +2167,9 @@ static void ata_dev_config_ncq_prio(struct ata_device *dev)
+ 	struct ata_port *ap = dev->link->ap;
+ 	unsigned int err_mask;
+ 
++	if (!ata_identify_page_supported(dev, ATA_LOG_SATA_SETTINGS))
++		return;
++
+ 	err_mask = ata_read_log_page(dev,
+ 				     ATA_LOG_IDENTIFY_DEVICE,
+ 				     ATA_LOG_SATA_SETTINGS,
+@@ -2442,7 +2446,8 @@ static void ata_dev_config_devslp(struct ata_device *dev)
+ 	 * Check device sleep capability. Get DevSlp timing variables
+ 	 * from SATA Settings page of Identify Device Data Log.
+ 	 */
+-	if (!ata_id_has_devslp(dev->id))
++	if (!ata_id_has_devslp(dev->id) ||
++	    !ata_identify_page_supported(dev, ATA_LOG_SATA_SETTINGS))
+ 		return;
+ 
+ 	err_mask = ata_read_log_page(dev,
+diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
+index bdbedc6660a87..ef904b8b112e6 100644
+--- a/drivers/base/firmware_loader/main.c
++++ b/drivers/base/firmware_loader/main.c
+@@ -100,12 +100,15 @@ static struct firmware_cache fw_cache;
+ extern struct builtin_fw __start_builtin_fw[];
+ extern struct builtin_fw __end_builtin_fw[];
+ 
+-static void fw_copy_to_prealloc_buf(struct firmware *fw,
++static bool fw_copy_to_prealloc_buf(struct firmware *fw,
+ 				    void *buf, size_t size)
+ {
+-	if (!buf || size < fw->size)
+-		return;
++	if (!buf)
++		return true;
++	if (size < fw->size)
++		return false;
+ 	memcpy(buf, fw->data, fw->size);
++	return true;
+ }
+ 
+ static bool fw_get_builtin_firmware(struct firmware *fw, const char *name,
+@@ -117,9 +120,7 @@ static bool fw_get_builtin_firmware(struct firmware *fw, const char *name,
+ 		if (strcmp(name, b_fw->name) == 0) {
+ 			fw->size = b_fw->size;
+ 			fw->data = b_fw->data;
+-			fw_copy_to_prealloc_buf(fw, buf, size);
+-
+-			return true;
++			return fw_copy_to_prealloc_buf(fw, buf, size);
+ 		}
+ 	}
+ 
+diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c
+index f47c7e20cc271..bb377bb13564a 100644
+--- a/drivers/bus/ti-sysc.c
++++ b/drivers/bus/ti-sysc.c
+@@ -6,6 +6,7 @@
+ #include <linux/io.h>
+ #include <linux/clk.h>
+ #include <linux/clkdev.h>
++#include <linux/cpu_pm.h>
+ #include <linux/delay.h>
+ #include <linux/list.h>
+ #include <linux/module.h>
+@@ -52,11 +53,18 @@ struct sysc_address {
+ 	struct list_head node;
+ };
+ 
++struct sysc_module {
++	struct sysc *ddata;
++	struct list_head node;
++};
++
+ struct sysc_soc_info {
+ 	unsigned long general_purpose:1;
+ 	enum sysc_soc soc;
+-	struct mutex list_lock;			/* disabled modules list lock */
++	struct mutex list_lock;	/* disabled and restored modules list lock */
+ 	struct list_head disabled_modules;
++	struct list_head restored_modules;
++	struct notifier_block nb;
+ };
+ 
+ enum sysc_clocks {
+@@ -1559,7 +1567,7 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
+ 		   0xffffffff, SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY),
+ 	SYSC_QUIRK("usb_otg_hs", 0, 0, 0x10, -ENODEV, 0x4ea2080d, 0xffffffff,
+ 		   SYSC_QUIRK_SWSUP_SIDLE | SYSC_QUIRK_SWSUP_MSTANDBY |
+-		   SYSC_QUIRK_REINIT_ON_RESUME),
++		   SYSC_QUIRK_REINIT_ON_CTX_LOST),
+ 	SYSC_QUIRK("wdt", 0, 0, 0x10, 0x14, 0x502a0500, 0xfffff0f0,
+ 		   SYSC_MODULE_QUIRK_WDT),
+ 	/* PRUSS on am3, am4 and am5 */
+@@ -2442,6 +2450,79 @@ static struct dev_pm_domain sysc_child_pm_domain = {
+ 	}
+ };
+ 
++/* Caller needs to take list_lock if ever used outside of cpu_pm */
++static void sysc_reinit_modules(struct sysc_soc_info *soc)
++{
++	struct sysc_module *module;
++	struct list_head *pos;
++	struct sysc *ddata;
++	int error = 0;
++
++	list_for_each(pos, &sysc_soc->restored_modules) {
++		module = list_entry(pos, struct sysc_module, node);
++		ddata = module->ddata;
++		error = sysc_reinit_module(ddata, ddata->enabled);
++	}
++}
++
++/**
++ * sysc_context_notifier - optionally reset and restore module after idle
++ * @nb: notifier block
++ * @cmd: unused
++ * @v: unused
++ *
++ * Some interconnect target modules need to be restored, or reset and restored
++ * on CPU_PM CPU_PM_CLUSTER_EXIT notifier. This is needed at least for am335x
++ * OTG and GPMC target modules even if the modules are unused.
++ */
++static int sysc_context_notifier(struct notifier_block *nb, unsigned long cmd,
++				 void *v)
++{
++	struct sysc_soc_info *soc;
++
++	soc = container_of(nb, struct sysc_soc_info, nb);
++
++	switch (cmd) {
++	case CPU_CLUSTER_PM_ENTER:
++		break;
++	case CPU_CLUSTER_PM_ENTER_FAILED:	/* No need to restore context */
++		break;
++	case CPU_CLUSTER_PM_EXIT:
++		sysc_reinit_modules(soc);
++		break;
++	}
++
++	return NOTIFY_OK;
++}
++
++/**
++ * sysc_add_restored - optionally add reset and restore quirk hanlling
++ * @ddata: device data
++ */
++static void sysc_add_restored(struct sysc *ddata)
++{
++	struct sysc_module *restored_module;
++
++	restored_module = kzalloc(sizeof(*restored_module), GFP_KERNEL);
++	if (!restored_module)
++		return;
++
++	restored_module->ddata = ddata;
++
++	mutex_lock(&sysc_soc->list_lock);
++
++	list_add(&restored_module->node, &sysc_soc->restored_modules);
++
++	if (sysc_soc->nb.notifier_call)
++		goto out_unlock;
++
++	sysc_soc->nb.notifier_call = sysc_context_notifier;
++	cpu_pm_register_notifier(&sysc_soc->nb);
++
++out_unlock:
++	mutex_unlock(&sysc_soc->list_lock);
++}
++
+ /**
+  * sysc_legacy_idle_quirk - handle children in omap_device compatible way
+  * @ddata: device driver data
+@@ -2941,12 +3022,14 @@ static int sysc_add_disabled(unsigned long base)
+ }
+ 
+ /*
+- * One time init to detect the booted SoC and disable unavailable features.
++ * One time init to detect the booted SoC, disable unavailable features
++ * and initialize list for optional cpu_pm notifier.
++ *
+  * Note that we initialize static data shared across all ti-sysc instances
+  * so ddata is only used for SoC type. This can be called from module_init
+  * once we no longer need to rely on platform data.
+  */
+-static int sysc_init_soc(struct sysc *ddata)
++static int sysc_init_static_data(struct sysc *ddata)
+ {
+ 	const struct soc_device_attribute *match;
+ 	struct ti_sysc_platform_data *pdata;
+@@ -2962,6 +3045,7 @@ static int sysc_init_soc(struct sysc *ddata)
+ 
+ 	mutex_init(&sysc_soc->list_lock);
+ 	INIT_LIST_HEAD(&sysc_soc->disabled_modules);
++	INIT_LIST_HEAD(&sysc_soc->restored_modules);
+ 	sysc_soc->general_purpose = true;
+ 
+ 	pdata = dev_get_platdata(ddata->dev);
+@@ -3026,15 +3110,24 @@ static int sysc_init_soc(struct sysc *ddata)
+ 	return 0;
+ }
+ 
+-static void sysc_cleanup_soc(void)
++static void sysc_cleanup_static_data(void)
+ {
++	struct sysc_module *restored_module;
+ 	struct sysc_address *disabled_module;
+ 	struct list_head *pos, *tmp;
+ 
+ 	if (!sysc_soc)
+ 		return;
+ 
++	if (sysc_soc->nb.notifier_call)
++		cpu_pm_unregister_notifier(&sysc_soc->nb);
++
+ 	mutex_lock(&sysc_soc->list_lock);
++	list_for_each_safe(pos, tmp, &sysc_soc->restored_modules) {
++		restored_module = list_entry(pos, struct sysc_module, node);
++		list_del(pos);
++		kfree(restored_module);
++	}
+ 	list_for_each_safe(pos, tmp, &sysc_soc->disabled_modules) {
+ 		disabled_module = list_entry(pos, struct sysc_address, node);
+ 		list_del(pos);
+@@ -3102,7 +3195,7 @@ static int sysc_probe(struct platform_device *pdev)
+ 	ddata->dev = &pdev->dev;
+ 	platform_set_drvdata(pdev, ddata);
+ 
+-	error = sysc_init_soc(ddata);
++	error = sysc_init_static_data(ddata);
+ 	if (error)
+ 		return error;
+ 
+@@ -3200,6 +3293,9 @@ static int sysc_probe(struct platform_device *pdev)
+ 		pm_runtime_put(&pdev->dev);
+ 	}
+ 
++	if (ddata->cfg.quirks & SYSC_QUIRK_REINIT_ON_CTX_LOST)
++		sysc_add_restored(ddata);
++
+ 	return 0;
+ 
+ err:
+@@ -3281,7 +3377,7 @@ static void __exit sysc_exit(void)
+ {
+ 	bus_unregister_notifier(&platform_bus_type, &sysc_nb);
+ 	platform_driver_unregister(&sysc_driver);
+-	sysc_cleanup_soc();
++	sysc_cleanup_static_data();
+ }
+ module_exit(sysc_exit);
+ 
+diff --git a/drivers/clk/at91/sama7g5.c b/drivers/clk/at91/sama7g5.c
+index cf8c079aa086a..019e712f90d6f 100644
+--- a/drivers/clk/at91/sama7g5.c
++++ b/drivers/clk/at91/sama7g5.c
+@@ -982,16 +982,7 @@ static void __init sama7g5_pmc_setup(struct device_node *np)
+ 	}
+ 
+ 	parent_names[0] = "cpupll_divpmcck";
+-	hw = at91_clk_register_master_pres(regmap, "cpuck", 1, parent_names,
+-					   &mck0_layout, &mck0_characteristics,
+-					   &pmc_mck0_lock,
+-					   CLK_SET_RATE_PARENT, 0);
+-	if (IS_ERR(hw))
+-		goto err_free;
+-
+-	sama7g5_pmc->chws[PMC_CPU] = hw;
+-
+-	hw = at91_clk_register_master_div(regmap, "mck0", "cpuck",
++	hw = at91_clk_register_master_div(regmap, "mck0", "cpupll_divpmcck",
+ 					  &mck0_layout, &mck0_characteristics,
+ 					  &pmc_mck0_lock, 0);
+ 	if (IS_ERR(hw))
+diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
+index bc3be5f3eae15..24dab2312bc6f 100644
+--- a/drivers/clk/clk-ast2600.c
++++ b/drivers/clk/clk-ast2600.c
+@@ -51,6 +51,8 @@ static DEFINE_SPINLOCK(aspeed_g6_clk_lock);
+ static struct clk_hw_onecell_data *aspeed_g6_clk_data;
+ 
+ static void __iomem *scu_g6_base;
++/* AST2600 revision: A0, A1, A2, etc */
++static u8 soc_rev;
+ 
+ /*
+  * Clocks marked with CLK_IS_CRITICAL:
+@@ -191,9 +193,8 @@ static struct clk_hw *ast2600_calc_pll(const char *name, u32 val)
+ static struct clk_hw *ast2600_calc_apll(const char *name, u32 val)
+ {
+ 	unsigned int mult, div;
+-	u32 chip_id = readl(scu_g6_base + ASPEED_G6_SILICON_REV);
+ 
+-	if (((chip_id & CHIP_REVISION_ID) >> 16) >= 2) {
++	if (soc_rev >= 2) {
+ 		if (val & BIT(24)) {
+ 			/* Pass through mode */
+ 			mult = div = 1;
+@@ -707,7 +708,7 @@ static const u32 ast2600_a1_axi_ahb200_tbl[] = {
+ static void __init aspeed_g6_cc(struct regmap *map)
+ {
+ 	struct clk_hw *hw;
+-	u32 val, div, divbits, chip_id, axi_div, ahb_div;
++	u32 val, div, divbits, axi_div, ahb_div;
+ 
+ 	clk_hw_register_fixed_rate(NULL, "clkin", NULL, 0, 25000000);
+ 
+@@ -738,8 +739,7 @@ static void __init aspeed_g6_cc(struct regmap *map)
+ 		axi_div = 2;
+ 
+ 	divbits = (val >> 11) & 0x3;
+-	regmap_read(map, ASPEED_G6_SILICON_REV, &chip_id);
+-	if (chip_id & BIT(16)) {
++	if (soc_rev >= 1) {
+ 		if (!divbits) {
+ 			ahb_div = ast2600_a1_axi_ahb200_tbl[(val >> 8) & 0x3];
+ 			if (val & BIT(16))
+@@ -784,6 +784,8 @@ static void __init aspeed_g6_cc_init(struct device_node *np)
+ 	if (!scu_g6_base)
+ 		return;
+ 
++	soc_rev = (readl(scu_g6_base + ASPEED_G6_SILICON_REV) & CHIP_REVISION_ID) >> 16;
++
+ 	aspeed_g6_clk_data = kzalloc(struct_size(aspeed_g6_clk_data, hws,
+ 				      ASPEED_G6_NUM_CLKS), GFP_KERNEL);
+ 	if (!aspeed_g6_clk_data)
+diff --git a/drivers/clk/imx/clk-imx6ul.c b/drivers/clk/imx/clk-imx6ul.c
+index 5dbb6a9377324..206e4c43f68f8 100644
+--- a/drivers/clk/imx/clk-imx6ul.c
++++ b/drivers/clk/imx/clk-imx6ul.c
+@@ -161,7 +161,6 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
+ 	hws[IMX6UL_PLL5_BYPASS] = imx_clk_hw_mux_flags("pll5_bypass", base + 0xa0, 16, 1, pll5_bypass_sels, ARRAY_SIZE(pll5_bypass_sels), CLK_SET_RATE_PARENT);
+ 	hws[IMX6UL_PLL6_BYPASS] = imx_clk_hw_mux_flags("pll6_bypass", base + 0xe0, 16, 1, pll6_bypass_sels, ARRAY_SIZE(pll6_bypass_sels), CLK_SET_RATE_PARENT);
+ 	hws[IMX6UL_PLL7_BYPASS] = imx_clk_hw_mux_flags("pll7_bypass", base + 0x20, 16, 1, pll7_bypass_sels, ARRAY_SIZE(pll7_bypass_sels), CLK_SET_RATE_PARENT);
+-	hws[IMX6UL_CLK_CSI_SEL] = imx_clk_hw_mux_flags("csi_sel", base + 0x3c, 9, 2, csi_sels, ARRAY_SIZE(csi_sels), CLK_SET_RATE_PARENT);
+ 
+ 	/* Do not bypass PLLs initially */
+ 	clk_set_parent(hws[IMX6UL_PLL1_BYPASS]->clk, hws[IMX6UL_CLK_PLL1]->clk);
+@@ -270,6 +269,7 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)
+ 	hws[IMX6UL_CLK_ECSPI_SEL]	  = imx_clk_hw_mux("ecspi_sel",	base + 0x38, 18, 1, ecspi_sels, ARRAY_SIZE(ecspi_sels));
+ 	hws[IMX6UL_CLK_LCDIF_PRE_SEL]	  = imx_clk_hw_mux_flags("lcdif_pre_sel", base + 0x38, 15, 3, lcdif_pre_sels, ARRAY_SIZE(lcdif_pre_sels), CLK_SET_RATE_PARENT);
+ 	hws[IMX6UL_CLK_LCDIF_SEL]	  = imx_clk_hw_mux("lcdif_sel",	base + 0x38, 9, 3, lcdif_sels, ARRAY_SIZE(lcdif_sels));
++	hws[IMX6UL_CLK_CSI_SEL]		  = imx_clk_hw_mux("csi_sel", base + 0x3c, 9, 2, csi_sels, ARRAY_SIZE(csi_sels));
+ 
+ 	hws[IMX6UL_CLK_LDB_DI0_DIV_SEL]  = imx_clk_hw_mux("ldb_di0", base + 0x20, 10, 1, ldb_di0_div_sels, ARRAY_SIZE(ldb_di0_div_sels));
+ 	hws[IMX6UL_CLK_LDB_DI1_DIV_SEL]  = imx_clk_hw_mux("ldb_di1", base + 0x20, 11, 1, ldb_di1_div_sels, ARRAY_SIZE(ldb_di1_div_sels));
+diff --git a/drivers/clk/ingenic/cgu.c b/drivers/clk/ingenic/cgu.c
+index 266c7595d3302..af31633a8862e 100644
+--- a/drivers/clk/ingenic/cgu.c
++++ b/drivers/clk/ingenic/cgu.c
+@@ -453,15 +453,15 @@ ingenic_clk_calc_div(struct clk_hw *hw,
+ 	}
+ 
+ 	/* Impose hardware constraints */
+-	div = min_t(unsigned, div, 1 << clk_info->div.bits);
+-	div = max_t(unsigned, div, 1);
++	div = clamp_t(unsigned int, div, clk_info->div.div,
++		      clk_info->div.div << clk_info->div.bits);
+ 
+ 	/*
+ 	 * If the divider value itself must be divided before being written to
+ 	 * the divider register, we must ensure we don't have any bits set that
+ 	 * would be lost as a result of doing so.
+ 	 */
+-	div /= clk_info->div.div;
++	div = DIV_ROUND_UP(div, clk_info->div.div);
+ 	div *= clk_info->div.div;
+ 
+ 	return div;
+diff --git a/drivers/clk/qcom/gcc-msm8996.c b/drivers/clk/qcom/gcc-msm8996.c
+index 3c3a7ff045621..9b1674b28d45d 100644
+--- a/drivers/clk/qcom/gcc-msm8996.c
++++ b/drivers/clk/qcom/gcc-msm8996.c
+@@ -2937,20 +2937,6 @@ static struct clk_branch gcc_smmu_aggre0_ahb_clk = {
+ 	},
+ };
+ 
+-static struct clk_branch gcc_aggre1_pnoc_ahb_clk = {
+-	.halt_reg = 0x82014,
+-	.clkr = {
+-		.enable_reg = 0x82014,
+-		.enable_mask = BIT(0),
+-		.hw.init = &(struct clk_init_data){
+-			.name = "gcc_aggre1_pnoc_ahb_clk",
+-			.parent_names = (const char *[]){ "periph_noc_clk_src" },
+-			.num_parents = 1,
+-			.ops = &clk_branch2_ops,
+-		},
+-	},
+-};
+-
+ static struct clk_branch gcc_aggre2_ufs_axi_clk = {
+ 	.halt_reg = 0x83014,
+ 	.clkr = {
+@@ -3474,7 +3460,6 @@ static struct clk_regmap *gcc_msm8996_clocks[] = {
+ 	[GCC_AGGRE0_CNOC_AHB_CLK] = &gcc_aggre0_cnoc_ahb_clk.clkr,
+ 	[GCC_SMMU_AGGRE0_AXI_CLK] = &gcc_smmu_aggre0_axi_clk.clkr,
+ 	[GCC_SMMU_AGGRE0_AHB_CLK] = &gcc_smmu_aggre0_ahb_clk.clkr,
+-	[GCC_AGGRE1_PNOC_AHB_CLK] = &gcc_aggre1_pnoc_ahb_clk.clkr,
+ 	[GCC_AGGRE2_UFS_AXI_CLK] = &gcc_aggre2_ufs_axi_clk.clkr,
+ 	[GCC_AGGRE2_USB3_AXI_CLK] = &gcc_aggre2_usb3_axi_clk.clkr,
+ 	[GCC_QSPI_AHB_CLK] = &gcc_qspi_ahb_clk.clkr,
+diff --git a/drivers/clk/sunxi-ng/ccu-sun4i-a10.c b/drivers/clk/sunxi-ng/ccu-sun4i-a10.c
+index f32366d9336e7..bd9a8782fec3d 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun4i-a10.c
++++ b/drivers/clk/sunxi-ng/ccu-sun4i-a10.c
+@@ -1464,7 +1464,7 @@ static void __init sun4i_ccu_init(struct device_node *node,
+ 	val &= ~GENMASK(7, 6);
+ 	writel(val | (2 << 6), reg + SUN4I_AHB_REG);
+ 
+-	sunxi_ccu_probe(node, reg, desc);
++	of_sunxi_ccu_probe(node, reg, desc);
+ }
+ 
+ static void __init sun4i_a10_ccu_setup(struct device_node *node)
+diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c b/drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c
+index a56142b909938..6f2a589705561 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c
++++ b/drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c
+@@ -196,7 +196,7 @@ static int sun50i_a100_r_ccu_probe(struct platform_device *pdev)
+ 	if (IS_ERR(reg))
+ 		return PTR_ERR(reg);
+ 
+-	return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a100_r_ccu_desc);
++	return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_a100_r_ccu_desc);
+ }
+ 
+ static const struct of_device_id sun50i_a100_r_ccu_ids[] = {
+diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a100.c b/drivers/clk/sunxi-ng/ccu-sun50i-a100.c
+index 81b48c73d389f..913bb08e6dee8 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun50i-a100.c
++++ b/drivers/clk/sunxi-ng/ccu-sun50i-a100.c
+@@ -1247,7 +1247,7 @@ static int sun50i_a100_ccu_probe(struct platform_device *pdev)
+ 		writel(val, reg + sun50i_a100_usb2_clk_regs[i]);
+ 	}
+ 
+-	ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a100_ccu_desc);
++	ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_a100_ccu_desc);
+ 	if (ret)
+ 		return ret;
+ 
+diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c
+index 149cfde817cba..54f25c624f020 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c
++++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c
+@@ -955,7 +955,7 @@ static int sun50i_a64_ccu_probe(struct platform_device *pdev)
+ 
+ 	writel(0x515, reg + SUN50I_A64_PLL_MIPI_REG);
+ 
+-	ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a64_ccu_desc);
++	ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_a64_ccu_desc);
+ 	if (ret)
+ 		return ret;
+ 
+diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
+index f8909a7ed5539..f30d7eb5424d8 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
+@@ -232,7 +232,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node,
+ 		return;
+ 	}
+ 
+-	sunxi_ccu_probe(node, reg, desc);
++	of_sunxi_ccu_probe(node, reg, desc);
+ }
+ 
+ static void __init sun50i_h6_r_ccu_setup(struct device_node *node)
+diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c
+index bff446b782907..c0800da2fa3d7 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c
++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c
+@@ -1240,7 +1240,7 @@ static int sun50i_h6_ccu_probe(struct platform_device *pdev)
+ 	val |= BIT(24);
+ 	writel(val, reg + SUN50I_H6_HDMI_CEC_CLK_REG);
+ 
+-	return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_h6_ccu_desc);
++	return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_h6_ccu_desc);
+ }
+ 
+ static const struct of_device_id sun50i_h6_ccu_ids[] = {
+diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h616.c b/drivers/clk/sunxi-ng/ccu-sun50i-h616.c
+index 225307305880e..22eb18079a154 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun50i-h616.c
++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h616.c
+@@ -1141,9 +1141,7 @@ static void __init sun50i_h616_ccu_setup(struct device_node *node)
+ 	val |= BIT(24);
+ 	writel(val, reg + SUN50I_H616_HDMI_CEC_CLK_REG);
+ 
+-	i = sunxi_ccu_probe(node, reg, &sun50i_h616_ccu_desc);
+-	if (i)
+-		pr_err("%pOF: probing clocks fails: %d\n", node, i);
++	of_sunxi_ccu_probe(node, reg, &sun50i_h616_ccu_desc);
+ }
+ 
+ CLK_OF_DECLARE(sun50i_h616_ccu, "allwinner,sun50i-h616-ccu",
+diff --git a/drivers/clk/sunxi-ng/ccu-sun5i.c b/drivers/clk/sunxi-ng/ccu-sun5i.c
+index b78e9b507c1c6..1f4bc0e773a7e 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun5i.c
++++ b/drivers/clk/sunxi-ng/ccu-sun5i.c
+@@ -1012,7 +1012,7 @@ static void __init sun5i_ccu_init(struct device_node *node,
+ 	val &= ~GENMASK(7, 6);
+ 	writel(val | (2 << 6), reg + SUN5I_AHB_REG);
+ 
+-	sunxi_ccu_probe(node, reg, desc);
++	of_sunxi_ccu_probe(node, reg, desc);
+ }
+ 
+ static void __init sun5i_a10s_ccu_setup(struct device_node *node)
+diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
+index 9b40d53266a3f..3df5c0b415804 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
++++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
+@@ -1257,7 +1257,7 @@ static void __init sun6i_a31_ccu_setup(struct device_node *node)
+ 	val |= 0x3 << 12;
+ 	writel(val, reg + SUN6I_A31_AHB1_REG);
+ 
+-	sunxi_ccu_probe(node, reg, &sun6i_a31_ccu_desc);
++	of_sunxi_ccu_probe(node, reg, &sun6i_a31_ccu_desc);
+ 
+ 	ccu_mux_notifier_register(pll_cpu_clk.common.hw.clk,
+ 				  &sun6i_a31_cpu_nb);
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a23.c b/drivers/clk/sunxi-ng/ccu-sun8i-a23.c
+index 103aa504f6c8a..577bb235d6584 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-a23.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-a23.c
+@@ -745,7 +745,7 @@ static void __init sun8i_a23_ccu_setup(struct device_node *node)
+ 	val &= ~BIT(16);
+ 	writel(val, reg + SUN8I_A23_PLL_MIPI_REG);
+ 
+-	sunxi_ccu_probe(node, reg, &sun8i_a23_ccu_desc);
++	of_sunxi_ccu_probe(node, reg, &sun8i_a23_ccu_desc);
+ }
+ CLK_OF_DECLARE(sun8i_a23_ccu, "allwinner,sun8i-a23-ccu",
+ 	       sun8i_a23_ccu_setup);
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a33.c b/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
+index 91838cd110377..8f65cd03f5acc 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
+@@ -805,7 +805,7 @@ static void __init sun8i_a33_ccu_setup(struct device_node *node)
+ 	val &= ~BIT(16);
+ 	writel(val, reg + SUN8I_A33_PLL_MIPI_REG);
+ 
+-	sunxi_ccu_probe(node, reg, &sun8i_a33_ccu_desc);
++	of_sunxi_ccu_probe(node, reg, &sun8i_a33_ccu_desc);
+ 
+ 	/* Gate then ungate PLL CPU after any rate changes */
+ 	ccu_pll_notifier_register(&sun8i_a33_pll_cpu_nb);
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a83t.c b/drivers/clk/sunxi-ng/ccu-sun8i-a83t.c
+index 2b434521c5ccf..c2ddcd2ddab4e 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-a83t.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-a83t.c
+@@ -906,7 +906,7 @@ static int sun8i_a83t_ccu_probe(struct platform_device *pdev)
+ 	sun8i_a83t_cpu_pll_fixup(reg + SUN8I_A83T_PLL_C0CPUX_REG);
+ 	sun8i_a83t_cpu_pll_fixup(reg + SUN8I_A83T_PLL_C1CPUX_REG);
+ 
+-	return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun8i_a83t_ccu_desc);
++	return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun8i_a83t_ccu_desc);
+ }
+ 
+ static const struct of_device_id sun8i_a83t_ccu_ids[] = {
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-de2.c b/drivers/clk/sunxi-ng/ccu-sun8i-de2.c
+index 524f33275bc73..4b94b6041b271 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-de2.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-de2.c
+@@ -342,7 +342,7 @@ static int sunxi_de2_clk_probe(struct platform_device *pdev)
+ 		goto err_disable_mod_clk;
+ 	}
+ 
+-	ret = sunxi_ccu_probe(pdev->dev.of_node, reg, ccu_desc);
++	ret = devm_sunxi_ccu_probe(&pdev->dev, reg, ccu_desc);
+ 	if (ret)
+ 		goto err_assert_reset;
+ 
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
+index 7e629a4493afd..d2fc2903787d8 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
+@@ -1154,7 +1154,7 @@ static void __init sunxi_h3_h5_ccu_init(struct device_node *node,
+ 	val &= ~GENMASK(19, 16);
+ 	writel(val | (0 << 16), reg + SUN8I_H3_PLL_AUDIO_REG);
+ 
+-	sunxi_ccu_probe(node, reg, desc);
++	of_sunxi_ccu_probe(node, reg, desc);
+ 
+ 	/* Gate then ungate PLL CPU after any rate changes */
+ 	ccu_pll_notifier_register(&sun8i_h3_pll_cpu_nb);
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r.c b/drivers/clk/sunxi-ng/ccu-sun8i-r.c
+index 4c8c491b87c27..9e754d1f754a1 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-r.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-r.c
+@@ -265,7 +265,7 @@ static void __init sunxi_r_ccu_init(struct device_node *node,
+ 		return;
+ 	}
+ 
+-	sunxi_ccu_probe(node, reg, desc);
++	of_sunxi_ccu_probe(node, reg, desc);
+ }
+ 
+ static void __init sun8i_a83t_r_ccu_setup(struct device_node *node)
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r40.c b/drivers/clk/sunxi-ng/ccu-sun8i-r40.c
+index 84153418453f4..002e0c3a04dbe 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-r40.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-r40.c
+@@ -1346,7 +1346,7 @@ static int sun8i_r40_ccu_probe(struct platform_device *pdev)
+ 	if (IS_ERR(regmap))
+ 		return PTR_ERR(regmap);
+ 
+-	ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun8i_r40_ccu_desc);
++	ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun8i_r40_ccu_desc);
+ 	if (ret)
+ 		return ret;
+ 
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c
+index f49724a22540e..ce150f83ab54e 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c
+@@ -822,7 +822,7 @@ static void __init sun8i_v3_v3s_ccu_init(struct device_node *node,
+ 	val &= ~GENMASK(19, 16);
+ 	writel(val, reg + SUN8I_V3S_PLL_AUDIO_REG);
+ 
+-	sunxi_ccu_probe(node, reg, ccu_desc);
++	of_sunxi_ccu_probe(node, reg, ccu_desc);
+ }
+ 
+ static void __init sun8i_v3s_ccu_setup(struct device_node *node)
+diff --git a/drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c b/drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c
+index 6616e8114f623..261e64416f26a 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c
++++ b/drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c
+@@ -246,8 +246,7 @@ static int sun9i_a80_de_clk_probe(struct platform_device *pdev)
+ 		goto err_disable_clk;
+ 	}
+ 
+-	ret = sunxi_ccu_probe(pdev->dev.of_node, reg,
+-			      &sun9i_a80_de_clk_desc);
++	ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_de_clk_desc);
+ 	if (ret)
+ 		goto err_assert_reset;
+ 
+diff --git a/drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c b/drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c
+index 4b4a507d04edf..596243b3e0fa3 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c
++++ b/drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c
+@@ -117,8 +117,7 @@ static int sun9i_a80_usb_clk_probe(struct platform_device *pdev)
+ 		return ret;
+ 	}
+ 
+-	ret = sunxi_ccu_probe(pdev->dev.of_node, reg,
+-			      &sun9i_a80_usb_clk_desc);
++	ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_usb_clk_desc);
+ 	if (ret)
+ 		goto err_disable_clk;
+ 
+diff --git a/drivers/clk/sunxi-ng/ccu-sun9i-a80.c b/drivers/clk/sunxi-ng/ccu-sun9i-a80.c
+index ef29582676f6e..97aaed0e68500 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun9i-a80.c
++++ b/drivers/clk/sunxi-ng/ccu-sun9i-a80.c
+@@ -1231,7 +1231,7 @@ static int sun9i_a80_ccu_probe(struct platform_device *pdev)
+ 	sun9i_a80_cpu_pll_fixup(reg + SUN9I_A80_PLL_C0CPUX_REG);
+ 	sun9i_a80_cpu_pll_fixup(reg + SUN9I_A80_PLL_C1CPUX_REG);
+ 
+-	return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun9i_a80_ccu_desc);
++	return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun9i_a80_ccu_desc);
+ }
+ 
+ static const struct of_device_id sun9i_a80_ccu_ids[] = {
+diff --git a/drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c b/drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c
+index 7ecc3a5a5b5e1..61ad7ee91c114 100644
+--- a/drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c
++++ b/drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c
+@@ -538,7 +538,7 @@ static void __init suniv_f1c100s_ccu_setup(struct device_node *node)
+ 	val &= ~GENMASK(19, 16);
+ 	writel(val | (3 << 16), reg + SUNIV_PLL_AUDIO_REG);
+ 
+-	sunxi_ccu_probe(node, reg, &suniv_ccu_desc);
++	of_sunxi_ccu_probe(node, reg, &suniv_ccu_desc);
+ 
+ 	/* Gate then ungate PLL CPU after any rate changes */
+ 	ccu_pll_notifier_register(&suniv_pll_cpu_nb);
+diff --git a/drivers/clk/sunxi-ng/ccu_common.c b/drivers/clk/sunxi-ng/ccu_common.c
+index 2e20e650b6c01..88cb569e58358 100644
+--- a/drivers/clk/sunxi-ng/ccu_common.c
++++ b/drivers/clk/sunxi-ng/ccu_common.c
+@@ -7,6 +7,7 @@
+ 
+ #include <linux/clk.h>
+ #include <linux/clk-provider.h>
++#include <linux/device.h>
+ #include <linux/iopoll.h>
+ #include <linux/slab.h>
+ 
+@@ -14,6 +15,11 @@
+ #include "ccu_gate.h"
+ #include "ccu_reset.h"
+ 
++struct sunxi_ccu {
++	const struct sunxi_ccu_desc	*desc;
++	struct ccu_reset		reset;
++};
++
+ static DEFINE_SPINLOCK(ccu_lock);
+ 
+ void ccu_helper_wait_for_lock(struct ccu_common *common, u32 lock)
+@@ -79,12 +85,15 @@ int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb)
+ 				     &pll_nb->clk_nb);
+ }
+ 
+-int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
+-		    const struct sunxi_ccu_desc *desc)
++static int sunxi_ccu_probe(struct sunxi_ccu *ccu, struct device *dev,
++			   struct device_node *node, void __iomem *reg,
++			   const struct sunxi_ccu_desc *desc)
+ {
+ 	struct ccu_reset *reset;
+ 	int i, ret;
+ 
++	ccu->desc = desc;
++
+ 	for (i = 0; i < desc->num_ccu_clks; i++) {
+ 		struct ccu_common *cclk = desc->ccu_clks[i];
+ 
+@@ -103,7 +112,10 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
+ 			continue;
+ 
+ 		name = hw->init->name;
+-		ret = of_clk_hw_register(node, hw);
++		if (dev)
++			ret = clk_hw_register(dev, hw);
++		else
++			ret = of_clk_hw_register(node, hw);
+ 		if (ret) {
+ 			pr_err("Couldn't register clock %d - %s\n", i, name);
+ 			goto err_clk_unreg;
+@@ -115,15 +127,10 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
+ 	if (ret)
+ 		goto err_clk_unreg;
+ 
+-	reset = kzalloc(sizeof(*reset), GFP_KERNEL);
+-	if (!reset) {
+-		ret = -ENOMEM;
+-		goto err_alloc_reset;
+-	}
+-
++	reset = &ccu->reset;
+ 	reset->rcdev.of_node = node;
+ 	reset->rcdev.ops = &ccu_reset_ops;
+-	reset->rcdev.owner = THIS_MODULE;
++	reset->rcdev.owner = dev ? dev->driver->owner : THIS_MODULE;
+ 	reset->rcdev.nr_resets = desc->num_resets;
+ 	reset->base = reg;
+ 	reset->lock = &ccu_lock;
+@@ -131,13 +138,11 @@ int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
+ 
+ 	ret = reset_controller_register(&reset->rcdev);
+ 	if (ret)
+-		goto err_of_clk_unreg;
++		goto err_del_provider;
+ 
+ 	return 0;
+ 
+-err_of_clk_unreg:
+-	kfree(reset);
+-err_alloc_reset:
++err_del_provider:
+ 	of_clk_del_provider(node);
+ err_clk_unreg:
+ 	while (--i >= 0) {
+@@ -149,3 +154,59 @@ err_clk_unreg:
+ 	}
+ 	return ret;
+ }
++
++static void devm_sunxi_ccu_release(struct device *dev, void *res)
++{
++	struct sunxi_ccu *ccu = res;
++	const struct sunxi_ccu_desc *desc = ccu->desc;
++	int i;
++
++	reset_controller_unregister(&ccu->reset.rcdev);
++	of_clk_del_provider(dev->of_node);
++
++	for (i = 0; i < desc->hw_clks->num; i++) {
++		struct clk_hw *hw = desc->hw_clks->hws[i];
++
++		if (!hw)
++			continue;
++		clk_hw_unregister(hw);
++	}
++}
++
++int devm_sunxi_ccu_probe(struct device *dev, void __iomem *reg,
++			 const struct sunxi_ccu_desc *desc)
++{
++	struct sunxi_ccu *ccu;
++	int ret;
++
++	ccu = devres_alloc(devm_sunxi_ccu_release, sizeof(*ccu), GFP_KERNEL);
++	if (!ccu)
++		return -ENOMEM;
++
++	ret = sunxi_ccu_probe(ccu, dev, dev->of_node, reg, desc);
++	if (ret) {
++		devres_free(ccu);
++		return ret;
++	}
++
++	devres_add(dev, ccu);
++
++	return 0;
++}
++
++void of_sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
++			const struct sunxi_ccu_desc *desc)
++{
++	struct sunxi_ccu *ccu;
++	int ret;
++
++	ccu = kzalloc(sizeof(*ccu), GFP_KERNEL);
++	if (!ccu)
++		return;
++
++	ret = sunxi_ccu_probe(ccu, NULL, node, reg, desc);
++	if (ret) {
++		pr_err("%pOF: probing clocks failed: %d\n", node, ret);
++		kfree(ccu);
++	}
++}
+diff --git a/drivers/clk/sunxi-ng/ccu_common.h b/drivers/clk/sunxi-ng/ccu_common.h
+index 04e7a12200a21..98a1834b58bb4 100644
+--- a/drivers/clk/sunxi-ng/ccu_common.h
++++ b/drivers/clk/sunxi-ng/ccu_common.h
+@@ -63,7 +63,9 @@ struct ccu_pll_nb {
+ 
+ int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb);
+ 
+-int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
+-		    const struct sunxi_ccu_desc *desc);
++int devm_sunxi_ccu_probe(struct device *dev, void __iomem *reg,
++			 const struct sunxi_ccu_desc *desc);
++void of_sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
++			const struct sunxi_ccu_desc *desc);
+ 
+ #endif /* _COMMON_H_ */
+diff --git a/drivers/dma/xilinx/xilinx_dpdma.c b/drivers/dma/xilinx/xilinx_dpdma.c
+index b280a53e8570a..ce5c66e6897d2 100644
+--- a/drivers/dma/xilinx/xilinx_dpdma.c
++++ b/drivers/dma/xilinx/xilinx_dpdma.c
+@@ -271,9 +271,6 @@ struct xilinx_dpdma_device {
+ /* -----------------------------------------------------------------------------
+  * DebugFS
+  */
+-
+-#ifdef CONFIG_DEBUG_FS
+-
+ #define XILINX_DPDMA_DEBUGFS_READ_MAX_SIZE	32
+ #define XILINX_DPDMA_DEBUGFS_UINT16_MAX_STR	"65535"
+ 
+@@ -299,7 +296,7 @@ struct xilinx_dpdma_debugfs_request {
+ 
+ static void xilinx_dpdma_debugfs_desc_done_irq(struct xilinx_dpdma_chan *chan)
+ {
+-	if (chan->id == dpdma_debugfs.chan_id)
++	if (IS_ENABLED(CONFIG_DEBUG_FS) && chan->id == dpdma_debugfs.chan_id)
+ 		dpdma_debugfs.xilinx_dpdma_irq_done_count++;
+ }
+ 
+@@ -462,16 +459,6 @@ static void xilinx_dpdma_debugfs_init(struct xilinx_dpdma_device *xdev)
+ 		dev_err(xdev->dev, "Failed to create debugfs testcase file\n");
+ }
+ 
+-#else
+-static void xilinx_dpdma_debugfs_init(struct xilinx_dpdma_device *xdev)
+-{
+-}
+-
+-static void xilinx_dpdma_debugfs_desc_done_irq(struct xilinx_dpdma_chan *chan)
+-{
+-}
+-#endif /* CONFIG_DEBUG_FS */
+-
+ /* -----------------------------------------------------------------------------
+  * I/O Accessors
+  */
+diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
+index fae5141251e5d..947474f6abb45 100644
+--- a/drivers/gpio/Kconfig
++++ b/drivers/gpio/Kconfig
+@@ -523,6 +523,7 @@ config GPIO_REG
+ config GPIO_ROCKCHIP
+ 	tristate "Rockchip GPIO support"
+ 	depends on ARCH_ROCKCHIP || COMPILE_TEST
++	select GENERIC_IRQ_CHIP
+ 	select GPIOLIB_IRQCHIP
+ 	default ARCH_ROCKCHIP
+ 	help
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+index b9c11c2b2885a..0de66f59adb8a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+@@ -827,6 +827,7 @@ static int amdgpu_connector_vga_get_modes(struct drm_connector *connector)
+ 
+ 	amdgpu_connector_get_edid(connector);
+ 	ret = amdgpu_connector_ddc_get_modes(connector);
++	amdgpu_get_native_mode(connector);
+ 
+ 	return ret;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index c1e34aa5925b2..96ca42bcfdbf9 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -3532,6 +3532,9 @@ int amdgpu_device_init(struct amdgpu_device *adev,
+ 		adev->rmmio_size = pci_resource_len(adev->pdev, 2);
+ 	}
+ 
++	for (i = 0; i < AMD_IP_BLOCK_TYPE_NUM; i++)
++		atomic_set(&adev->pm.pwr_state[i], POWER_STATE_UNKNOWN);
++
+ 	adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size);
+ 	if (adev->rmmio == NULL) {
+ 		return -ENOMEM;
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+index 6fee12c91ef59..d793eec69d61e 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+@@ -40,6 +40,39 @@
+ 
+ #include "dm_helpers.h"
+ 
++struct monitor_patch_info {
++	unsigned int manufacturer_id;
++	unsigned int product_id;
++	void (*patch_func)(struct dc_edid_caps *edid_caps, unsigned int param);
++	unsigned int patch_param;
++};
++static void set_max_dsc_bpp_limit(struct dc_edid_caps *edid_caps, unsigned int param);
++
++static const struct monitor_patch_info monitor_patch_table[] = {
++{0x6D1E, 0x5BBF, set_max_dsc_bpp_limit, 15},
++{0x6D1E, 0x5B9A, set_max_dsc_bpp_limit, 15},
++};
++
++static void set_max_dsc_bpp_limit(struct dc_edid_caps *edid_caps, unsigned int param)
++{
++	if (edid_caps)
++		edid_caps->panel_patch.max_dsc_target_bpp_limit = param;
++}
++
++static int amdgpu_dm_patch_edid_caps(struct dc_edid_caps *edid_caps)
++{
++	int i, ret = 0;
++
++	for (i = 0; i < ARRAY_SIZE(monitor_patch_table); i++)
++		if ((edid_caps->manufacturer_id == monitor_patch_table[i].manufacturer_id)
++			&&  (edid_caps->product_id == monitor_patch_table[i].product_id)) {
++			monitor_patch_table[i].patch_func(edid_caps, monitor_patch_table[i].patch_param);
++			ret++;
++		}
++
++	return ret;
++}
++
+ /* dm_helpers_parse_edid_caps
+  *
+  * Parse edid caps
+@@ -125,6 +158,8 @@ enum dc_edid_status dm_helpers_parse_edid_caps(
+ 	kfree(sads);
+ 	kfree(sadb);
+ 
++	amdgpu_dm_patch_edid_caps(edid_caps);
++
+ 	return result;
+ }
+ 
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
+index 34a126816133e..ede11eb120d4f 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
+@@ -1854,7 +1854,9 @@ static void swizzle_to_dml_params(
+ 	case DC_SW_VAR_D_X:
+ 		*sw_mode = dm_sw_var_d_x;
+ 		break;
+-
++	case DC_SW_VAR_R_X:
++		*sw_mode = dm_sw_var_r_x;
++		break;
+ 	default:
+ 		ASSERT(0); /* Not supported */
+ 		break;
+diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h b/drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h
+index 1051ca1a23b8a..edb9f7567d6d9 100644
+--- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h
++++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_enums.h
+@@ -80,11 +80,11 @@ enum dm_swizzle_mode {
+ 	dm_sw_SPARE_13 = 24,
+ 	dm_sw_64kb_s_x = 25,
+ 	dm_sw_64kb_d_x = 26,
+-	dm_sw_SPARE_14 = 27,
++	dm_sw_64kb_r_x = 27,
+ 	dm_sw_SPARE_15 = 28,
+ 	dm_sw_var_s_x = 29,
+ 	dm_sw_var_d_x = 30,
+-	dm_sw_64kb_r_x,
++	dm_sw_var_r_x = 31,
+ 	dm_sw_gfx7_2d_thin_l_vp,
+ 	dm_sw_gfx7_2d_thin_gl,
+ };
+diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h
+index 257f280d3d53f..bd077ea224a40 100644
+--- a/drivers/gpu/drm/amd/include/amd_shared.h
++++ b/drivers/gpu/drm/amd/include/amd_shared.h
+@@ -98,7 +98,8 @@ enum amd_ip_block_type {
+ 	AMD_IP_BLOCK_TYPE_ACP,
+ 	AMD_IP_BLOCK_TYPE_VCN,
+ 	AMD_IP_BLOCK_TYPE_MES,
+-	AMD_IP_BLOCK_TYPE_JPEG
++	AMD_IP_BLOCK_TYPE_JPEG,
++	AMD_IP_BLOCK_TYPE_NUM,
+ };
+ 
+ enum amd_clockgating_state {
+diff --git a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
+index 03581d5b18360..08362d506534b 100644
+--- a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
++++ b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
+@@ -927,6 +927,13 @@ int amdgpu_dpm_set_powergating_by_smu(struct amdgpu_device *adev, uint32_t block
+ {
+ 	int ret = 0;
+ 	const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
++	enum ip_power_state pwr_state = gate ? POWER_STATE_OFF : POWER_STATE_ON;
++
++	if (atomic_read(&adev->pm.pwr_state[block_type]) == pwr_state) {
++		dev_dbg(adev->dev, "IP block%d already in the target %s state!",
++				block_type, gate ? "gate" : "ungate");
++		return 0;
++	}
+ 
+ 	switch (block_type) {
+ 	case AMD_IP_BLOCK_TYPE_UVD:
+@@ -979,6 +986,9 @@ int amdgpu_dpm_set_powergating_by_smu(struct amdgpu_device *adev, uint32_t block
+ 		break;
+ 	}
+ 
++	if (!ret)
++		atomic_set(&adev->pm.pwr_state[block_type], pwr_state);
++
+ 	return ret;
+ }
+ 
+diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
+index 98f1b3d8c1d59..16e3f72d31b9f 100644
+--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
++++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
+@@ -417,6 +417,12 @@ struct amdgpu_dpm {
+ 	enum amd_dpm_forced_level forced_level;
+ };
+ 
++enum ip_power_state {
++	POWER_STATE_UNKNOWN,
++	POWER_STATE_ON,
++	POWER_STATE_OFF,
++};
++
+ struct amdgpu_pm {
+ 	struct mutex		mutex;
+ 	u32                     current_sclk;
+@@ -452,6 +458,8 @@ struct amdgpu_pm {
+ 	struct i2c_adapter smu_i2c;
+ 	struct mutex		smu_i2c_mutex;
+ 	struct list_head	pm_attr_list;
++
++	atomic_t		pwr_state[AMD_IP_BLOCK_TYPE_NUM];
+ };
+ 
+ #define R600_SSTU_DFLT                               0
+diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c
+index d53388199f34c..9d05674550a4f 100644
+--- a/drivers/gpu/drm/drm_gem_cma_helper.c
++++ b/drivers/gpu/drm/drm_gem_cma_helper.c
+@@ -210,8 +210,13 @@ void drm_gem_cma_free_object(struct drm_gem_object *gem_obj)
+ 			dma_buf_vunmap(gem_obj->import_attach->dmabuf, &map);
+ 		drm_prime_gem_destroy(gem_obj, cma_obj->sgt);
+ 	} else if (cma_obj->vaddr) {
+-		dma_free_wc(gem_obj->dev->dev, cma_obj->base.size,
+-			    cma_obj->vaddr, cma_obj->paddr);
++		if (cma_obj->map_noncoherent)
++			dma_free_noncoherent(gem_obj->dev->dev, cma_obj->base.size,
++					     cma_obj->vaddr, cma_obj->paddr,
++					     DMA_TO_DEVICE);
++		else
++			dma_free_wc(gem_obj->dev->dev, cma_obj->base.size,
++				    cma_obj->vaddr, cma_obj->paddr);
+ 	}
+ 
+ 	drm_gem_object_release(gem_obj);
+diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
+index deb23dbec8b52..d6c7f4f9a7a29 100644
+--- a/drivers/gpu/drm/drm_prime.c
++++ b/drivers/gpu/drm/drm_prime.c
+@@ -719,11 +719,13 @@ int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
+ 	if (obj->funcs && obj->funcs->mmap) {
+ 		vma->vm_ops = obj->funcs->vm_ops;
+ 
++		drm_gem_object_get(obj);
+ 		ret = obj->funcs->mmap(obj, vma);
+-		if (ret)
++		if (ret) {
++			drm_gem_object_put(obj);
+ 			return ret;
++		}
+ 		vma->vm_private_data = obj;
+-		drm_gem_object_get(obj);
+ 		return 0;
+ 	}
+ 
+diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
+index a3eae3f3eadce..638a00b2dc2d2 100644
+--- a/drivers/gpu/drm/i915/display/icl_dsi.c
++++ b/drivers/gpu/drm/i915/display/icl_dsi.c
+@@ -711,10 +711,7 @@ static void gen11_dsi_map_pll(struct intel_encoder *encoder,
+ 	intel_de_write(dev_priv, ICL_DPCLKA_CFGCR0, val);
+ 
+ 	for_each_dsi_phy(phy, intel_dsi->phys) {
+-		if (DISPLAY_VER(dev_priv) >= 12)
+-			val |= ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy);
+-		else
+-			val &= ~ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy);
++		val &= ~ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy);
+ 	}
+ 	intel_de_write(dev_priv, ICL_DPCLKA_CFGCR0, val);
+ 
+@@ -1150,8 +1147,6 @@ static void
+ gen11_dsi_enable_port_and_phy(struct intel_encoder *encoder,
+ 			      const struct intel_crtc_state *crtc_state)
+ {
+-	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+-
+ 	/* step 4a: power up all lanes of the DDI used by DSI */
+ 	gen11_dsi_power_up_lanes(encoder);
+ 
+@@ -1177,8 +1172,7 @@ gen11_dsi_enable_port_and_phy(struct intel_encoder *encoder,
+ 	gen11_dsi_configure_transcoder(encoder, crtc_state);
+ 
+ 	/* Step 4l: Gate DDI clocks */
+-	if (DISPLAY_VER(dev_priv) == 11)
+-		gen11_dsi_gate_clocks(encoder);
++	gen11_dsi_gate_clocks(encoder);
+ }
+ 
+ static void gen11_dsi_powerup_panel(struct intel_encoder *encoder)
+diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
+index fd71346aac7bc..32d5a556b7eac 100644
+--- a/drivers/gpu/drm/i915/display/intel_bios.c
++++ b/drivers/gpu/drm/i915/display/intel_bios.c
+@@ -1692,6 +1692,39 @@ static u8 map_ddc_pin(struct drm_i915_private *i915, u8 vbt_pin)
+ 	return 0;
+ }
+ 
++static u8 dvo_port_type(u8 dvo_port)
++{
++	switch (dvo_port) {
++	case DVO_PORT_HDMIA:
++	case DVO_PORT_HDMIB:
++	case DVO_PORT_HDMIC:
++	case DVO_PORT_HDMID:
++	case DVO_PORT_HDMIE:
++	case DVO_PORT_HDMIF:
++	case DVO_PORT_HDMIG:
++	case DVO_PORT_HDMIH:
++	case DVO_PORT_HDMII:
++		return DVO_PORT_HDMIA;
++	case DVO_PORT_DPA:
++	case DVO_PORT_DPB:
++	case DVO_PORT_DPC:
++	case DVO_PORT_DPD:
++	case DVO_PORT_DPE:
++	case DVO_PORT_DPF:
++	case DVO_PORT_DPG:
++	case DVO_PORT_DPH:
++	case DVO_PORT_DPI:
++		return DVO_PORT_DPA;
++	case DVO_PORT_MIPIA:
++	case DVO_PORT_MIPIB:
++	case DVO_PORT_MIPIC:
++	case DVO_PORT_MIPID:
++		return DVO_PORT_MIPIA;
++	default:
++		return dvo_port;
++	}
++}
++
+ static enum port __dvo_port_to_port(int n_ports, int n_dvo,
+ 				    const int port_mapping[][3], u8 dvo_port)
+ {
+@@ -2622,35 +2655,17 @@ bool intel_bios_is_port_edp(struct drm_i915_private *i915, enum port port)
+ 	return false;
+ }
+ 
+-static bool child_dev_is_dp_dual_mode(const struct child_device_config *child,
+-				      enum port port)
++static bool child_dev_is_dp_dual_mode(const struct child_device_config *child)
+ {
+-	static const struct {
+-		u16 dp, hdmi;
+-	} port_mapping[] = {
+-		/*
+-		 * Buggy VBTs may declare DP ports as having
+-		 * HDMI type dvo_port :( So let's check both.
+-		 */
+-		[PORT_B] = { DVO_PORT_DPB, DVO_PORT_HDMIB, },
+-		[PORT_C] = { DVO_PORT_DPC, DVO_PORT_HDMIC, },
+-		[PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, },
+-		[PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, },
+-		[PORT_F] = { DVO_PORT_DPF, DVO_PORT_HDMIF, },
+-	};
+-
+-	if (port == PORT_A || port >= ARRAY_SIZE(port_mapping))
+-		return false;
+-
+ 	if ((child->device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) !=
+ 	    (DEVICE_TYPE_DP_DUAL_MODE & DEVICE_TYPE_DP_DUAL_MODE_BITS))
+ 		return false;
+ 
+-	if (child->dvo_port == port_mapping[port].dp)
++	if (dvo_port_type(child->dvo_port) == DVO_PORT_DPA)
+ 		return true;
+ 
+ 	/* Only accept a HDMI dvo_port as DP++ if it has an AUX channel */
+-	if (child->dvo_port == port_mapping[port].hdmi &&
++	if (dvo_port_type(child->dvo_port) == DVO_PORT_HDMIA &&
+ 	    child->aux_channel != 0)
+ 		return true;
+ 
+@@ -2660,10 +2675,36 @@ static bool child_dev_is_dp_dual_mode(const struct child_device_config *child,
+ bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *i915,
+ 				     enum port port)
+ {
++	static const struct {
++		u16 dp, hdmi;
++	} port_mapping[] = {
++		/*
++		 * Buggy VBTs may declare DP ports as having
++		 * HDMI type dvo_port :( So let's check both.
++		 */
++		[PORT_B] = { DVO_PORT_DPB, DVO_PORT_HDMIB, },
++		[PORT_C] = { DVO_PORT_DPC, DVO_PORT_HDMIC, },
++		[PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, },
++		[PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, },
++		[PORT_F] = { DVO_PORT_DPF, DVO_PORT_HDMIF, },
++	};
+ 	const struct intel_bios_encoder_data *devdata;
+ 
++	if (HAS_DDI(i915)) {
++		const struct intel_bios_encoder_data *devdata;
++
++		devdata = intel_bios_encoder_data_lookup(i915, port);
++
++		return devdata && child_dev_is_dp_dual_mode(&devdata->child);
++	}
++
++	if (port == PORT_A || port >= ARRAY_SIZE(port_mapping))
++		return false;
++
+ 	list_for_each_entry(devdata, &i915->vbt.display_devices, node) {
+-		if (child_dev_is_dp_dual_mode(&devdata->child, port))
++		if ((devdata->child.dvo_port == port_mapping[port].dp ||
++		     devdata->child.dvo_port == port_mapping[port].hdmi) &&
++		    child_dev_is_dp_dual_mode(&devdata->child))
+ 			return true;
+ 	}
+ 
+diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
+index 5cf152be44877..b4c7355f89b69 100644
+--- a/drivers/gpu/drm/i915/display/intel_dp.c
++++ b/drivers/gpu/drm/i915/display/intel_dp.c
+@@ -111,6 +111,12 @@ bool intel_dp_is_edp(struct intel_dp *intel_dp)
+ static void intel_dp_unset_edid(struct intel_dp *intel_dp);
+ static int intel_dp_dsc_compute_bpp(struct intel_dp *intel_dp, u8 dsc_max_bpc);
+ 
++static void intel_dp_set_default_sink_rates(struct intel_dp *intel_dp)
++{
++	intel_dp->sink_rates[0] = 162000;
++	intel_dp->num_sink_rates = 1;
++}
++
+ /* update sink rates from dpcd */
+ static void intel_dp_set_sink_rates(struct intel_dp *intel_dp)
+ {
+@@ -1767,6 +1773,12 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp,
+ 	intel_dp->lane_count = lane_count;
+ }
+ 
++static void intel_dp_reset_max_link_params(struct intel_dp *intel_dp)
++{
++	intel_dp->max_link_lane_count = intel_dp_max_common_lane_count(intel_dp);
++	intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp);
++}
++
+ /* Enable backlight PWM and backlight PP control. */
+ void intel_edp_backlight_on(const struct intel_crtc_state *crtc_state,
+ 			    const struct drm_connector_state *conn_state)
+@@ -1926,8 +1938,7 @@ void intel_dp_sync_state(struct intel_encoder *encoder,
+ 	if (intel_dp->dpcd[DP_DPCD_REV] == 0)
+ 		intel_dp_get_dpcd(intel_dp);
+ 
+-	intel_dp->max_link_lane_count = intel_dp_max_common_lane_count(intel_dp);
+-	intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp);
++	intel_dp_reset_max_link_params(intel_dp);
+ }
+ 
+ bool intel_dp_initial_fastset_check(struct intel_encoder *encoder,
+@@ -2462,6 +2473,9 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
+ 	 */
+ 	intel_psr_init_dpcd(intel_dp);
+ 
++	/* Clear the default sink rates */
++	intel_dp->num_sink_rates = 0;
++
+ 	/* Read the eDP 1.4+ supported link rates. */
+ 	if (intel_dp->edp_dpcd[0] >= DP_EDP_14) {
+ 		__le16 sink_rates[DP_MAX_SUPPORTED_RATES];
+@@ -2497,6 +2511,7 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
+ 		intel_dp_set_sink_rates(intel_dp);
+ 
+ 	intel_dp_set_common_rates(intel_dp);
++	intel_dp_reset_max_link_params(intel_dp);
+ 
+ 	/* Read the eDP DSC DPCD registers */
+ 	if (DISPLAY_VER(dev_priv) >= 10)
+@@ -4240,12 +4255,7 @@ intel_dp_detect(struct drm_connector *connector,
+ 	 * supports link training fallback params.
+ 	 */
+ 	if (intel_dp->reset_link_params || intel_dp->is_mst) {
+-		/* Initial max link lane count */
+-		intel_dp->max_link_lane_count = intel_dp_max_common_lane_count(intel_dp);
+-
+-		/* Initial max link rate */
+-		intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp);
+-
++		intel_dp_reset_max_link_params(intel_dp);
+ 		intel_dp->reset_link_params = false;
+ 	}
+ 
+@@ -5296,6 +5306,9 @@ intel_dp_init_connector(struct intel_digital_port *dig_port,
+ 		return false;
+ 
+ 	intel_dp_set_source_rates(intel_dp);
++	intel_dp_set_default_sink_rates(intel_dp);
++	intel_dp_set_common_rates(intel_dp);
++	intel_dp_reset_max_link_params(intel_dp);
+ 
+ 	intel_dp->reset_link_params = true;
+ 	intel_dp->pps.pps_pipe = INVALID_PIPE;
+diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
+index 69faa39da178f..93c9de8f43e8e 100644
+--- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
++++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c
+@@ -148,6 +148,7 @@ static inline void clr_context_registered(struct intel_context *ce)
+ #define SCHED_STATE_BLOCKED_SHIFT			4
+ #define SCHED_STATE_BLOCKED		BIT(SCHED_STATE_BLOCKED_SHIFT)
+ #define SCHED_STATE_BLOCKED_MASK	(0xfff << SCHED_STATE_BLOCKED_SHIFT)
++
+ static inline void init_sched_state(struct intel_context *ce)
+ {
+ 	/* Only should be called from guc_lrc_desc_pin() */
+@@ -352,20 +353,29 @@ static inline void set_lrc_desc_registered(struct intel_guc *guc, u32 id,
+ 	xa_unlock_irqrestore(&guc->context_lookup, flags);
+ }
+ 
++static void decr_outstanding_submission_g2h(struct intel_guc *guc)
++{
++	if (atomic_dec_and_test(&guc->outstanding_submission_g2h))
++		wake_up_all(&guc->ct.wq);
++}
++
+ static int guc_submission_send_busy_loop(struct intel_guc *guc,
+ 					 const u32 *action,
+ 					 u32 len,
+ 					 u32 g2h_len_dw,
+ 					 bool loop)
+ {
+-	int err;
+-
+-	err = intel_guc_send_busy_loop(guc, action, len, g2h_len_dw, loop);
++	/*
++	 * We always loop when a send requires a reply (i.e. g2h_len_dw > 0),
++	 * so we don't handle the case where we don't get a reply because we
++	 * aborted the send due to the channel being busy.
++	 */
++	GEM_BUG_ON(g2h_len_dw && !loop);
+ 
+-	if (!err && g2h_len_dw)
++	if (g2h_len_dw)
+ 		atomic_inc(&guc->outstanding_submission_g2h);
+ 
+-	return err;
++	return intel_guc_send_busy_loop(guc, action, len, g2h_len_dw, loop);
+ }
+ 
+ int intel_guc_wait_for_pending_msg(struct intel_guc *guc,
+@@ -616,7 +626,7 @@ static void scrub_guc_desc_for_outstanding_g2h(struct intel_guc *guc)
+ 		init_sched_state(ce);
+ 
+ 		if (pending_enable || destroyed || deregister) {
+-			atomic_dec(&guc->outstanding_submission_g2h);
++			decr_outstanding_submission_g2h(guc);
+ 			if (deregister)
+ 				guc_signal_context_fence(ce);
+ 			if (destroyed) {
+@@ -635,7 +645,7 @@ static void scrub_guc_desc_for_outstanding_g2h(struct intel_guc *guc)
+ 				intel_engine_signal_breadcrumbs(ce->engine);
+ 			}
+ 			intel_context_sched_disable_unpin(ce);
+-			atomic_dec(&guc->outstanding_submission_g2h);
++			decr_outstanding_submission_g2h(guc);
+ 			spin_lock_irqsave(&ce->guc_state.lock, flags);
+ 			guc_blocked_fence_complete(ce);
+ 			spin_unlock_irqrestore(&ce->guc_state.lock, flags);
+@@ -797,15 +807,13 @@ __unwind_incomplete_requests(struct intel_context *ce)
+ 
+ 	spin_lock_irqsave(&sched_engine->lock, flags);
+ 	spin_lock(&ce->guc_active.lock);
+-	list_for_each_entry_safe(rq, rn,
+-				 &ce->guc_active.requests,
+-				 sched.link) {
++	list_for_each_entry_safe_reverse(rq, rn,
++					 &ce->guc_active.requests,
++					 sched.link) {
+ 		if (i915_request_completed(rq))
+ 			continue;
+ 
+ 		list_del_init(&rq->sched.link);
+-		spin_unlock(&ce->guc_active.lock);
+-
+ 		__i915_request_unsubmit(rq);
+ 
+ 		/* Push the request back into the queue for later resubmission. */
+@@ -816,10 +824,8 @@ __unwind_incomplete_requests(struct intel_context *ce)
+ 		}
+ 		GEM_BUG_ON(i915_sched_engine_is_empty(sched_engine));
+ 
+-		list_add_tail(&rq->sched.link, pl);
++		list_add(&rq->sched.link, pl);
+ 		set_bit(I915_FENCE_FLAG_PQUEUE, &rq->fence.flags);
+-
+-		spin_lock(&ce->guc_active.lock);
+ 	}
+ 	spin_unlock(&ce->guc_active.lock);
+ 	spin_unlock_irqrestore(&sched_engine->lock, flags);
+@@ -828,17 +834,33 @@ __unwind_incomplete_requests(struct intel_context *ce)
+ static void __guc_reset_context(struct intel_context *ce, bool stalled)
+ {
+ 	struct i915_request *rq;
++	unsigned long flags;
+ 	u32 head;
++	bool skip = false;
+ 
+ 	intel_context_get(ce);
+ 
+ 	/*
+-	 * GuC will implicitly mark the context as non-schedulable
+-	 * when it sends the reset notification. Make sure our state
+-	 * reflects this change. The context will be marked enabled
+-	 * on resubmission.
++	 * GuC will implicitly mark the context as non-schedulable when it sends
++	 * the reset notification. Make sure our state reflects this change. The
++	 * context will be marked enabled on resubmission.
++	 *
++	 * XXX: If the context is reset as a result of the request cancellation
++	 * this G2H is received after the schedule disable complete G2H which is
++	 * wrong as this creates a race between the request cancellation code
++	 * re-submitting the context and this G2H handler. This is a bug in the
++	 * GuC but can be worked around in the meantime but converting this to a
++	 * NOP if a pending enable is in flight as this indicates that a request
++	 * cancellation has occurred.
+ 	 */
+-	clr_context_enabled(ce);
++	spin_lock_irqsave(&ce->guc_state.lock, flags);
++	if (likely(!context_pending_enable(ce)))
++		clr_context_enabled(ce);
++	else
++		skip = true;
++	spin_unlock_irqrestore(&ce->guc_state.lock, flags);
++	if (unlikely(skip))
++		goto out_put;
+ 
+ 	rq = intel_context_find_active_request(ce);
+ 	if (!rq) {
+@@ -857,6 +879,7 @@ static void __guc_reset_context(struct intel_context *ce, bool stalled)
+ out_replay:
+ 	guc_reset_state(ce, head, stalled);
+ 	__unwind_incomplete_requests(ce);
++out_put:
+ 	intel_context_put(ce);
+ }
+ 
+@@ -1233,8 +1256,7 @@ static int register_context(struct intel_context *ce, bool loop)
+ }
+ 
+ static int __guc_action_deregister_context(struct intel_guc *guc,
+-					   u32 guc_id,
+-					   bool loop)
++					   u32 guc_id)
+ {
+ 	u32 action[] = {
+ 		INTEL_GUC_ACTION_DEREGISTER_CONTEXT,
+@@ -1243,16 +1265,16 @@ static int __guc_action_deregister_context(struct intel_guc *guc,
+ 
+ 	return guc_submission_send_busy_loop(guc, action, ARRAY_SIZE(action),
+ 					     G2H_LEN_DW_DEREGISTER_CONTEXT,
+-					     loop);
++					     true);
+ }
+ 
+-static int deregister_context(struct intel_context *ce, u32 guc_id, bool loop)
++static int deregister_context(struct intel_context *ce, u32 guc_id)
+ {
+ 	struct intel_guc *guc = ce_to_guc(ce);
+ 
+ 	trace_intel_context_deregister(ce);
+ 
+-	return __guc_action_deregister_context(guc, guc_id, loop);
++	return __guc_action_deregister_context(guc, guc_id);
+ }
+ 
+ static intel_engine_mask_t adjust_engine_mask(u8 class, intel_engine_mask_t mask)
+@@ -1340,26 +1362,23 @@ static int guc_lrc_desc_pin(struct intel_context *ce, bool loop)
+ 	 * registering this context.
+ 	 */
+ 	if (context_registered) {
++		bool disabled;
++		unsigned long flags;
++
+ 		trace_intel_context_steal_guc_id(ce);
+-		if (!loop) {
++		GEM_BUG_ON(!loop);
++
++		/* Seal race with Reset */
++		spin_lock_irqsave(&ce->guc_state.lock, flags);
++		disabled = submission_disabled(guc);
++		if (likely(!disabled)) {
+ 			set_context_wait_for_deregister_to_register(ce);
+ 			intel_context_get(ce);
+-		} else {
+-			bool disabled;
+-			unsigned long flags;
+-
+-			/* Seal race with Reset */
+-			spin_lock_irqsave(&ce->guc_state.lock, flags);
+-			disabled = submission_disabled(guc);
+-			if (likely(!disabled)) {
+-				set_context_wait_for_deregister_to_register(ce);
+-				intel_context_get(ce);
+-			}
+-			spin_unlock_irqrestore(&ce->guc_state.lock, flags);
+-			if (unlikely(disabled)) {
+-				reset_lrc_desc(guc, desc_idx);
+-				return 0;	/* Will get registered later */
+-			}
++		}
++		spin_unlock_irqrestore(&ce->guc_state.lock, flags);
++		if (unlikely(disabled)) {
++			reset_lrc_desc(guc, desc_idx);
++			return 0;	/* Will get registered later */
+ 		}
+ 
+ 		/*
+@@ -1367,13 +1386,9 @@ static int guc_lrc_desc_pin(struct intel_context *ce, bool loop)
+ 		 * context whose guc_id was stolen.
+ 		 */
+ 		with_intel_runtime_pm(runtime_pm, wakeref)
+-			ret = deregister_context(ce, ce->guc_id, loop);
+-		if (unlikely(ret == -EBUSY)) {
+-			clr_context_wait_for_deregister_to_register(ce);
+-			intel_context_put(ce);
+-		} else if (unlikely(ret == -ENODEV)) {
++			ret = deregister_context(ce, ce->guc_id);
++		if (unlikely(ret == -ENODEV))
+ 			ret = 0;	/* Will get registered later */
+-		}
+ 	} else {
+ 		with_intel_runtime_pm(runtime_pm, wakeref)
+ 			ret = register_context(ce, loop);
+@@ -1548,6 +1563,23 @@ static struct i915_sw_fence *guc_context_block(struct intel_context *ce)
+ 	return &ce->guc_blocked;
+ }
+ 
++#define SCHED_STATE_MULTI_BLOCKED_MASK \
++	(SCHED_STATE_BLOCKED_MASK & ~SCHED_STATE_BLOCKED)
++#define SCHED_STATE_NO_UNBLOCK \
++	(SCHED_STATE_MULTI_BLOCKED_MASK | \
++	 SCHED_STATE_PENDING_DISABLE | \
++	 SCHED_STATE_BANNED)
++
++static bool context_cant_unblock(struct intel_context *ce)
++{
++	lockdep_assert_held(&ce->guc_state.lock);
++
++	return (ce->guc_state.sched_state & SCHED_STATE_NO_UNBLOCK) ||
++		context_guc_id_invalid(ce) ||
++		!lrc_desc_registered(ce_to_guc(ce), ce->guc_id) ||
++		!intel_context_is_pinned(ce);
++}
++
+ static void guc_context_unblock(struct intel_context *ce)
+ {
+ 	struct intel_guc *guc = ce_to_guc(ce);
+@@ -1562,9 +1594,7 @@ static void guc_context_unblock(struct intel_context *ce)
+ 	spin_lock_irqsave(&ce->guc_state.lock, flags);
+ 
+ 	if (unlikely(submission_disabled(guc) ||
+-		     !intel_context_is_pinned(ce) ||
+-		     context_pending_disable(ce) ||
+-		     context_blocked(ce) > 1)) {
++		     context_cant_unblock(ce))) {
+ 		enable = false;
+ 	} else {
+ 		enable = true;
+@@ -1601,6 +1631,13 @@ static void guc_context_cancel_request(struct intel_context *ce,
+ 			guc_reset_state(ce, intel_ring_wrap(ce->ring, rq->head),
+ 					true);
+ 		}
++
++		/*
++		 * XXX: Racey if context is reset, see comment in
++		 * __guc_reset_context().
++		 */
++		flush_work(&ce_to_guc(ce)->ct.requests.worker);
++
+ 		guc_context_unblock(ce);
+ 	}
+ }
+@@ -1730,7 +1767,7 @@ static inline void guc_lrc_desc_unpin(struct intel_context *ce)
+ 	GEM_BUG_ON(context_enabled(ce));
+ 
+ 	clr_context_registered(ce);
+-	deregister_context(ce, ce->guc_id, true);
++	deregister_context(ce, ce->guc_id);
+ }
+ 
+ static void __guc_context_destroy(struct intel_context *ce)
+@@ -2583,12 +2620,6 @@ g2h_context_lookup(struct intel_guc *guc, u32 desc_idx)
+ 	return ce;
+ }
+ 
+-static void decr_outstanding_submission_g2h(struct intel_guc *guc)
+-{
+-	if (atomic_dec_and_test(&guc->outstanding_submission_g2h))
+-		wake_up_all(&guc->ct.wq);
+-}
+-
+ int intel_guc_deregister_done_process_msg(struct intel_guc *guc,
+ 					  const u32 *msg,
+ 					  u32 len)
+@@ -2721,7 +2752,12 @@ static void guc_handle_context_reset(struct intel_guc *guc,
+ {
+ 	trace_intel_context_reset(ce);
+ 
+-	if (likely(!intel_context_is_banned(ce))) {
++	/*
++	 * XXX: Racey if request cancellation has occurred, see comment in
++	 * __guc_reset_context().
++	 */
++	if (likely(!intel_context_is_banned(ce) &&
++		   !context_blocked(ce))) {
+ 		capture_error_state(guc, ce);
+ 		guc_context_replay(ce);
+ 	}
+diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
+index 6109cd9e33991..e7efd9ede8e4b 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
++++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
+@@ -562,6 +562,7 @@ nouveau_drm_device_init(struct drm_device *dev)
+ 		nvkm_dbgopt(nouveau_debug, "DRM");
+ 
+ 	INIT_LIST_HEAD(&drm->clients);
++	mutex_init(&drm->clients_lock);
+ 	spin_lock_init(&drm->tile.lock);
+ 
+ 	/* workaround an odd issue on nvc1 by disabling the device's
+@@ -632,6 +633,7 @@ fail_alloc:
+ static void
+ nouveau_drm_device_fini(struct drm_device *dev)
+ {
++	struct nouveau_cli *cli, *temp_cli;
+ 	struct nouveau_drm *drm = nouveau_drm(dev);
+ 
+ 	if (nouveau_pmops_runtime()) {
+@@ -656,9 +658,28 @@ nouveau_drm_device_fini(struct drm_device *dev)
+ 	nouveau_ttm_fini(drm);
+ 	nouveau_vga_fini(drm);
+ 
++	/*
++	 * There may be existing clients from as-yet unclosed files. For now,
++	 * clean them up here rather than deferring until the file is closed,
++	 * but this likely not correct if we want to support hot-unplugging
++	 * properly.
++	 */
++	mutex_lock(&drm->clients_lock);
++	list_for_each_entry_safe(cli, temp_cli, &drm->clients, head) {
++		list_del(&cli->head);
++		mutex_lock(&cli->mutex);
++		if (cli->abi16)
++			nouveau_abi16_fini(cli->abi16);
++		mutex_unlock(&cli->mutex);
++		nouveau_cli_fini(cli);
++		kfree(cli);
++	}
++	mutex_unlock(&drm->clients_lock);
++
+ 	nouveau_cli_fini(&drm->client);
+ 	nouveau_cli_fini(&drm->master);
+ 	nvif_parent_dtor(&drm->parent);
++	mutex_destroy(&drm->clients_lock);
+ 	kfree(drm);
+ }
+ 
+@@ -796,7 +817,7 @@ nouveau_drm_device_remove(struct drm_device *dev)
+ 	struct nvkm_client *client;
+ 	struct nvkm_device *device;
+ 
+-	drm_dev_unregister(dev);
++	drm_dev_unplug(dev);
+ 
+ 	client = nvxx_client(&drm->client.base);
+ 	device = nvkm_device_find(client->device);
+@@ -1090,9 +1111,9 @@ nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
+ 
+ 	fpriv->driver_priv = cli;
+ 
+-	mutex_lock(&drm->client.mutex);
++	mutex_lock(&drm->clients_lock);
+ 	list_add(&cli->head, &drm->clients);
+-	mutex_unlock(&drm->client.mutex);
++	mutex_unlock(&drm->clients_lock);
+ 
+ done:
+ 	if (ret && cli) {
+@@ -1110,6 +1131,16 @@ nouveau_drm_postclose(struct drm_device *dev, struct drm_file *fpriv)
+ {
+ 	struct nouveau_cli *cli = nouveau_cli(fpriv);
+ 	struct nouveau_drm *drm = nouveau_drm(dev);
++	int dev_index;
++
++	/*
++	 * The device is gone, and as it currently stands all clients are
++	 * cleaned up in the removal codepath. In the future this may change
++	 * so that we can support hot-unplugging, but for now we immediately
++	 * return to avoid a double-free situation.
++	 */
++	if (!drm_dev_enter(dev, &dev_index))
++		return;
+ 
+ 	pm_runtime_get_sync(dev->dev);
+ 
+@@ -1118,14 +1149,15 @@ nouveau_drm_postclose(struct drm_device *dev, struct drm_file *fpriv)
+ 		nouveau_abi16_fini(cli->abi16);
+ 	mutex_unlock(&cli->mutex);
+ 
+-	mutex_lock(&drm->client.mutex);
++	mutex_lock(&drm->clients_lock);
+ 	list_del(&cli->head);
+-	mutex_unlock(&drm->client.mutex);
++	mutex_unlock(&drm->clients_lock);
+ 
+ 	nouveau_cli_fini(cli);
+ 	kfree(cli);
+ 	pm_runtime_mark_last_busy(dev->dev);
+ 	pm_runtime_put_autosuspend(dev->dev);
++	drm_dev_exit(dev_index);
+ }
+ 
+ static const struct drm_ioctl_desc
+diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
+index ba65f136cf481..b2a970aa9bf4b 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
++++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
+@@ -139,6 +139,11 @@ struct nouveau_drm {
+ 
+ 	struct list_head clients;
+ 
++	/**
++	 * @clients_lock: Protects access to the @clients list of &struct nouveau_cli.
++	 */
++	struct mutex clients_lock;
++
+ 	u8 old_pm_cap;
+ 
+ 	struct {
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c
+index 6e3c450eaacef..3ff49344abc77 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmigv100.c
+@@ -62,7 +62,6 @@ gv100_hdmi_ctrl(struct nvkm_ior *ior, int head, bool enable, u8 max_ac_packet,
+ 		nvkm_wr32(device, 0x6f0108 + hdmi, vendor_infoframe.header);
+ 		nvkm_wr32(device, 0x6f010c + hdmi, vendor_infoframe.subpack0_low);
+ 		nvkm_wr32(device, 0x6f0110 + hdmi, vendor_infoframe.subpack0_high);
+-		nvkm_wr32(device, 0x6f0110 + hdmi, 0x00000000);
+ 		nvkm_wr32(device, 0x6f0114 + hdmi, 0x00000000);
+ 		nvkm_wr32(device, 0x6f0118 + hdmi, 0x00000000);
+ 		nvkm_wr32(device, 0x6f011c + hdmi, 0x00000000);
+diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
+index 3750fd2161317..930574ad2bca9 100644
+--- a/drivers/gpu/drm/udl/udl_connector.c
++++ b/drivers/gpu/drm/udl/udl_connector.c
+@@ -30,7 +30,7 @@ static int udl_get_edid_block(void *data, u8 *buf, unsigned int block,
+ 		int bval = (i + block * EDID_LENGTH) << 8;
+ 		ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+ 				      0x02, (0x80 | (0x02 << 5)), bval,
+-				      0xA1, read_buff, 2, HZ);
++				      0xA1, read_buff, 2, 1000);
+ 		if (ret < 1) {
+ 			DRM_ERROR("Read EDID byte %d failed err %x\n", i, ret);
+ 			kfree(read_buff);
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 29564b370341e..3706c635b12ee 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -1276,6 +1276,9 @@
+ #define	USB_DEVICE_ID_WEIDA_8752	0xC300
+ #define	USB_DEVICE_ID_WEIDA_8755	0xC301
+ 
++#define USB_VENDOR_ID_WINBOND		0x0416
++#define USB_DEVICE_ID_TSTP_MTOUCH	0xc168
++
+ #define USB_VENDOR_ID_WISEGROUP		0x0925
+ #define USB_DEVICE_ID_SMARTJOY_PLUS	0x0005
+ #define USB_DEVICE_ID_SUPER_JOY_BOX_3	0x8888
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 3ea7cb1cda84c..e1afddb7b33d8 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -193,6 +193,7 @@ static void mt_post_parse(struct mt_device *td, struct mt_application *app);
+ /* reserved					0x0014 */
+ #define MT_CLS_WIN_8_FORCE_MULTI_INPUT		0x0015
+ #define MT_CLS_WIN_8_DISABLE_WAKEUP		0x0016
++#define MT_CLS_WIN_8_NO_STICKY_FINGERS		0x0017
+ 
+ /* vendor specific classes */
+ #define MT_CLS_3M				0x0101
+@@ -294,6 +295,13 @@ static const struct mt_class mt_classes[] = {
+ 			MT_QUIRK_WIN8_PTP_BUTTONS |
+ 			MT_QUIRK_DISABLE_WAKEUP,
+ 		.export_all_inputs = true },
++	{ .name = MT_CLS_WIN_8_NO_STICKY_FINGERS,
++		.quirks = MT_QUIRK_ALWAYS_VALID |
++			MT_QUIRK_IGNORE_DUPLICATES |
++			MT_QUIRK_HOVERING |
++			MT_QUIRK_CONTACT_CNT_ACCURATE |
++			MT_QUIRK_WIN8_PTP_BUTTONS,
++		.export_all_inputs = true },
+ 
+ 	/*
+ 	 * vendor specific classes
+@@ -2120,6 +2128,11 @@ static const struct hid_device_id mt_devices[] = {
+ 		MT_USB_DEVICE(USB_VENDOR_ID_VTL,
+ 			USB_DEVICE_ID_VTL_MULTITOUCH_FF3F) },
+ 
++	/* Winbond Electronics Corp. */
++	{ .driver_data = MT_CLS_WIN_8_NO_STICKY_FINGERS,
++		HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH_WIN_8,
++			   USB_VENDOR_ID_WINBOND, USB_DEVICE_ID_TSTP_MTOUCH) },
++
+ 	/* Wistron panels */
+ 	{ .driver_data = MT_CLS_NSMU,
+ 		MT_USB_DEVICE(USB_VENDOR_ID_WISTRON,
+diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c
+index 7f11ea07d698f..ca873a3b98dbe 100644
+--- a/drivers/hv/hv_balloon.c
++++ b/drivers/hv/hv_balloon.c
+@@ -480,7 +480,7 @@ module_param(pressure_report_delay, uint, (S_IRUGO | S_IWUSR));
+ MODULE_PARM_DESC(pressure_report_delay, "Delay in secs in reporting pressure");
+ static atomic_t trans_id = ATOMIC_INIT(0);
+ 
+-static int dm_ring_size = 20 * 1024;
++static int dm_ring_size = VMBUS_RING_SIZE(16 * 1024);
+ 
+ /*
+  * Driver specific state.
+diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+index db45f1fc0b817..8dbf744c5651f 100644
+--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
++++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+@@ -1279,6 +1279,8 @@ st_lsm6dsx_set_odr(struct st_lsm6dsx_sensor *sensor, u32 req_odr)
+ 	int err;
+ 
+ 	switch (sensor->id) {
++	case ST_LSM6DSX_ID_GYRO:
++		break;
+ 	case ST_LSM6DSX_ID_EXT0:
+ 	case ST_LSM6DSX_ID_EXT1:
+ 	case ST_LSM6DSX_ID_EXT2:
+@@ -1304,8 +1306,8 @@ st_lsm6dsx_set_odr(struct st_lsm6dsx_sensor *sensor, u32 req_odr)
+ 		}
+ 		break;
+ 	}
+-	default:
+-		break;
++	default: /* should never occur */
++		return -EINVAL;
+ 	}
+ 
+ 	if (req_odr > 0) {
+diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c
+index 6146c3c1cbe5c..8d709986b88c7 100644
+--- a/drivers/infiniband/core/sysfs.c
++++ b/drivers/infiniband/core/sysfs.c
+@@ -757,7 +757,7 @@ static void ib_port_release(struct kobject *kobj)
+ 	if (port->hw_stats_data)
+ 		kfree(port->hw_stats_data->stats);
+ 	kfree(port->hw_stats_data);
+-	kfree(port);
++	kvfree(port);
+ }
+ 
+ static void ib_port_gid_attr_release(struct kobject *kobj)
+@@ -1189,7 +1189,7 @@ static struct ib_port *setup_port(struct ib_core_device *coredev, int port_num,
+ 	struct ib_port *p;
+ 	int ret;
+ 
+-	p = kzalloc(struct_size(p, attrs_list,
++	p = kvzalloc(struct_size(p, attrs_list,
+ 				attr->gid_tbl_len + attr->pkey_tbl_len),
+ 		    GFP_KERNEL);
+ 	if (!p)
+diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
+index 89a2b21976d63..20a46d8731455 100644
+--- a/drivers/infiniband/core/verbs.c
++++ b/drivers/infiniband/core/verbs.c
+@@ -1232,6 +1232,9 @@ static struct ib_qp *create_qp(struct ib_device *dev, struct ib_pd *pd,
+ 	INIT_LIST_HEAD(&qp->rdma_mrs);
+ 	INIT_LIST_HEAD(&qp->sig_mrs);
+ 
++	qp->send_cq = attr->send_cq;
++	qp->recv_cq = attr->recv_cq;
++
+ 	rdma_restrack_new(&qp->res, RDMA_RESTRACK_QP);
+ 	WARN_ONCE(!udata && !caller, "Missing kernel QP owner");
+ 	rdma_restrack_set_name(&qp->res, udata ? NULL : caller);
+diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+index 408dfbcc47b5e..b7ec3a3926785 100644
+--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
++++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+@@ -3354,8 +3354,11 @@ static void bnxt_re_process_res_ud_wc(struct bnxt_re_qp *qp,
+ 				      struct ib_wc *wc,
+ 				      struct bnxt_qplib_cqe *cqe)
+ {
++	struct bnxt_re_dev *rdev;
++	u16 vlan_id = 0;
+ 	u8 nw_type;
+ 
++	rdev = qp->rdev;
+ 	wc->opcode = IB_WC_RECV;
+ 	wc->status = __rc_to_ib_wc_status(cqe->status);
+ 
+@@ -3367,9 +3370,12 @@ static void bnxt_re_process_res_ud_wc(struct bnxt_re_qp *qp,
+ 		memcpy(wc->smac, cqe->smac, ETH_ALEN);
+ 		wc->wc_flags |= IB_WC_WITH_SMAC;
+ 		if (cqe->flags & CQ_RES_UD_FLAGS_META_FORMAT_VLAN) {
+-			wc->vlan_id = (cqe->cfa_meta & 0xFFF);
+-			if (wc->vlan_id < 0x1000)
+-				wc->wc_flags |= IB_WC_WITH_VLAN;
++			vlan_id = (cqe->cfa_meta & 0xFFF);
++		}
++		/* Mark only if vlan_id is non zero */
++		if (vlan_id && bnxt_re_check_if_vlan_valid(rdev, vlan_id)) {
++			wc->vlan_id = vlan_id;
++			wc->wc_flags |= IB_WC_WITH_VLAN;
+ 		}
+ 		nw_type = (cqe->flags & CQ_RES_UD_FLAGS_ROCE_IP_VER_MASK) >>
+ 			   CQ_RES_UD_FLAGS_ROCE_IP_VER_SFT;
+diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
+index f367f4a4abffc..aec2e1851fa70 100644
+--- a/drivers/infiniband/hw/mlx4/main.c
++++ b/drivers/infiniband/hw/mlx4/main.c
+@@ -2217,6 +2217,11 @@ static const struct ib_device_ops mlx4_ib_hw_stats_ops = {
+ 	.get_hw_stats = mlx4_ib_get_hw_stats,
+ };
+ 
++static const struct ib_device_ops mlx4_ib_hw_stats_ops1 = {
++	.alloc_hw_device_stats = mlx4_ib_alloc_hw_device_stats,
++	.get_hw_stats = mlx4_ib_get_hw_stats,
++};
++
+ static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev)
+ {
+ 	struct mlx4_ib_diag_counters *diag = ibdev->diag_counters;
+@@ -2229,9 +2234,16 @@ static int mlx4_ib_alloc_diag_counters(struct mlx4_ib_dev *ibdev)
+ 		return 0;
+ 
+ 	for (i = 0; i < MLX4_DIAG_COUNTERS_TYPES; i++) {
+-		/* i == 1 means we are building port counters */
+-		if (i && !per_port)
+-			continue;
++		/*
++		 * i == 1 means we are building port counters, set a different
++		 * stats ops without port stats callback.
++		 */
++		if (i && !per_port) {
++			ib_set_device_ops(&ibdev->ib_dev,
++					  &mlx4_ib_hw_stats_ops1);
++
++			return 0;
++		}
+ 
+ 		ret = __mlx4_ib_alloc_diag_counters(ibdev, &diag[i].name,
+ 						    &diag[i].offset,
+diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
+index f0c954575bdec..4fd73b51fabf2 100644
+--- a/drivers/infiniband/sw/rxe/rxe_loc.h
++++ b/drivers/infiniband/sw/rxe/rxe_loc.h
+@@ -86,6 +86,7 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
+ int mr_check_range(struct rxe_mr *mr, u64 iova, size_t length);
+ int advance_dma_data(struct rxe_dma_info *dma, unsigned int length);
+ int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey);
++int rxe_reg_fast_mr(struct rxe_qp *qp, struct rxe_send_wqe *wqe);
+ int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
+ void rxe_mr_cleanup(struct rxe_pool_entry *arg);
+ 
+diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c b/drivers/infiniband/sw/rxe/rxe_mr.c
+index 5890a82462161..bedcf15aaea75 100644
+--- a/drivers/infiniband/sw/rxe/rxe_mr.c
++++ b/drivers/infiniband/sw/rxe/rxe_mr.c
+@@ -48,8 +48,14 @@ static void rxe_mr_init(int access, struct rxe_mr *mr)
+ 	u32 lkey = mr->pelem.index << 8 | rxe_get_next_key(-1);
+ 	u32 rkey = (access & IB_ACCESS_REMOTE) ? lkey : 0;
+ 
+-	mr->ibmr.lkey = lkey;
+-	mr->ibmr.rkey = rkey;
++	/* set ibmr->l/rkey and also copy into private l/rkey
++	 * for user MRs these will always be the same
++	 * for cases where caller 'owns' the key portion
++	 * they may be different until REG_MR WQE is executed.
++	 */
++	mr->lkey = mr->ibmr.lkey = lkey;
++	mr->rkey = mr->ibmr.rkey = rkey;
++
+ 	mr->state = RXE_MR_STATE_INVALID;
+ 	mr->type = RXE_MR_TYPE_NONE;
+ 	mr->map_shift = ilog2(RXE_BUF_PER_MAP);
+@@ -191,10 +197,8 @@ int rxe_mr_init_fast(struct rxe_pd *pd, int max_pages, struct rxe_mr *mr)
+ {
+ 	int err;
+ 
+-	rxe_mr_init(0, mr);
+-
+-	/* In fastreg, we also set the rkey */
+-	mr->ibmr.rkey = mr->ibmr.lkey;
++	/* always allow remote access for FMRs */
++	rxe_mr_init(IB_ACCESS_REMOTE, mr);
+ 
+ 	err = rxe_mr_alloc(mr, max_pages);
+ 	if (err)
+@@ -507,8 +511,8 @@ struct rxe_mr *lookup_mr(struct rxe_pd *pd, int access, u32 key,
+ 	if (!mr)
+ 		return NULL;
+ 
+-	if (unlikely((type == RXE_LOOKUP_LOCAL && mr_lkey(mr) != key) ||
+-		     (type == RXE_LOOKUP_REMOTE && mr_rkey(mr) != key) ||
++	if (unlikely((type == RXE_LOOKUP_LOCAL && mr->lkey != key) ||
++		     (type == RXE_LOOKUP_REMOTE && mr->rkey != key) ||
+ 		     mr_pd(mr) != pd || (access && !(access & mr->access)) ||
+ 		     mr->state != RXE_MR_STATE_VALID)) {
+ 		rxe_drop_ref(mr);
+@@ -531,9 +535,9 @@ int rxe_invalidate_mr(struct rxe_qp *qp, u32 rkey)
+ 		goto err;
+ 	}
+ 
+-	if (rkey != mr->ibmr.rkey) {
+-		pr_err("%s: rkey (%#x) doesn't match mr->ibmr.rkey (%#x)\n",
+-			__func__, rkey, mr->ibmr.rkey);
++	if (rkey != mr->rkey) {
++		pr_err("%s: rkey (%#x) doesn't match mr->rkey (%#x)\n",
++			__func__, rkey, mr->rkey);
+ 		ret = -EINVAL;
+ 		goto err_drop_ref;
+ 	}
+@@ -554,6 +558,49 @@ err:
+ 	return ret;
+ }
+ 
++/* user can (re)register fast MR by executing a REG_MR WQE.
++ * user is expected to hold a reference on the ib mr until the
++ * WQE completes.
++ * Once a fast MR is created this is the only way to change the
++ * private keys. It is the responsibility of the user to maintain
++ * the ib mr keys in sync with rxe mr keys.
++ */
++int rxe_reg_fast_mr(struct rxe_qp *qp, struct rxe_send_wqe *wqe)
++{
++	struct rxe_mr *mr = to_rmr(wqe->wr.wr.reg.mr);
++	u32 key = wqe->wr.wr.reg.key;
++	u32 access = wqe->wr.wr.reg.access;
++
++	/* user can only register MR in free state */
++	if (unlikely(mr->state != RXE_MR_STATE_FREE)) {
++		pr_warn("%s: mr->lkey = 0x%x not free\n",
++			__func__, mr->lkey);
++		return -EINVAL;
++	}
++
++	/* user can only register mr with qp in same protection domain */
++	if (unlikely(qp->ibqp.pd != mr->ibmr.pd)) {
++		pr_warn("%s: qp->pd and mr->pd don't match\n",
++			__func__);
++		return -EINVAL;
++	}
++
++	/* user is only allowed to change key portion of l/rkey */
++	if (unlikely((mr->lkey & ~0xff) != (key & ~0xff))) {
++		pr_warn("%s: key = 0x%x has wrong index mr->lkey = 0x%x\n",
++			__func__, key, mr->lkey);
++		return -EINVAL;
++	}
++
++	mr->access = access;
++	mr->lkey = key;
++	mr->rkey = (access & IB_ACCESS_REMOTE) ? key : 0;
++	mr->iova = wqe->wr.wr.reg.mr->iova;
++	mr->state = RXE_MR_STATE_VALID;
++
++	return 0;
++}
++
+ int rxe_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
+ {
+ 	struct rxe_mr *mr = to_rmr(ibmr);
+diff --git a/drivers/infiniband/sw/rxe/rxe_mw.c b/drivers/infiniband/sw/rxe/rxe_mw.c
+index 5ba77df7598ed..a5e2ea7d80f02 100644
+--- a/drivers/infiniband/sw/rxe/rxe_mw.c
++++ b/drivers/infiniband/sw/rxe/rxe_mw.c
+@@ -21,7 +21,7 @@ int rxe_alloc_mw(struct ib_mw *ibmw, struct ib_udata *udata)
+ 	}
+ 
+ 	rxe_add_index(mw);
+-	ibmw->rkey = (mw->pelem.index << 8) | rxe_get_next_key(-1);
++	mw->rkey = ibmw->rkey = (mw->pelem.index << 8) | rxe_get_next_key(-1);
+ 	mw->state = (mw->ibmw.type == IB_MW_TYPE_2) ?
+ 			RXE_MW_STATE_FREE : RXE_MW_STATE_VALID;
+ 	spin_lock_init(&mw->lock);
+@@ -71,6 +71,8 @@ int rxe_dealloc_mw(struct ib_mw *ibmw)
+ static int rxe_check_bind_mw(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
+ 			 struct rxe_mw *mw, struct rxe_mr *mr)
+ {
++	u32 key = wqe->wr.wr.mw.rkey & 0xff;
++
+ 	if (mw->ibmw.type == IB_MW_TYPE_1) {
+ 		if (unlikely(mw->state != RXE_MW_STATE_VALID)) {
+ 			pr_err_once(
+@@ -108,7 +110,7 @@ static int rxe_check_bind_mw(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
+ 		}
+ 	}
+ 
+-	if (unlikely((wqe->wr.wr.mw.rkey & 0xff) == (mw->ibmw.rkey & 0xff))) {
++	if (unlikely(key == (mw->rkey & 0xff))) {
+ 		pr_err_once("attempt to bind MW with same key\n");
+ 		return -EINVAL;
+ 	}
+@@ -161,13 +163,9 @@ static int rxe_check_bind_mw(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
+ static void rxe_do_bind_mw(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
+ 		      struct rxe_mw *mw, struct rxe_mr *mr)
+ {
+-	u32 rkey;
+-	u32 new_rkey;
+-
+-	rkey = mw->ibmw.rkey;
+-	new_rkey = (rkey & 0xffffff00) | (wqe->wr.wr.mw.rkey & 0x000000ff);
++	u32 key = wqe->wr.wr.mw.rkey & 0xff;
+ 
+-	mw->ibmw.rkey = new_rkey;
++	mw->rkey = (mw->rkey & ~0xff) | key;
+ 	mw->access = wqe->wr.wr.mw.access;
+ 	mw->state = RXE_MW_STATE_VALID;
+ 	mw->addr = wqe->wr.wr.mw.addr;
+@@ -197,29 +195,29 @@ int rxe_bind_mw(struct rxe_qp *qp, struct rxe_send_wqe *wqe)
+ 	struct rxe_mw *mw;
+ 	struct rxe_mr *mr;
+ 	struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
++	u32 mw_rkey = wqe->wr.wr.mw.mw_rkey;
++	u32 mr_lkey = wqe->wr.wr.mw.mr_lkey;
+ 	unsigned long flags;
+ 
+-	mw = rxe_pool_get_index(&rxe->mw_pool,
+-				wqe->wr.wr.mw.mw_rkey >> 8);
++	mw = rxe_pool_get_index(&rxe->mw_pool, mw_rkey >> 8);
+ 	if (unlikely(!mw)) {
+ 		ret = -EINVAL;
+ 		goto err;
+ 	}
+ 
+-	if (unlikely(mw->ibmw.rkey != wqe->wr.wr.mw.mw_rkey)) {
++	if (unlikely(mw->rkey != mw_rkey)) {
+ 		ret = -EINVAL;
+ 		goto err_drop_mw;
+ 	}
+ 
+ 	if (likely(wqe->wr.wr.mw.length)) {
+-		mr = rxe_pool_get_index(&rxe->mr_pool,
+-					wqe->wr.wr.mw.mr_lkey >> 8);
++		mr = rxe_pool_get_index(&rxe->mr_pool, mr_lkey >> 8);
+ 		if (unlikely(!mr)) {
+ 			ret = -EINVAL;
+ 			goto err_drop_mw;
+ 		}
+ 
+-		if (unlikely(mr->ibmr.lkey != wqe->wr.wr.mw.mr_lkey)) {
++		if (unlikely(mr->lkey != mr_lkey)) {
+ 			ret = -EINVAL;
+ 			goto err_drop_mr;
+ 		}
+@@ -292,7 +290,7 @@ int rxe_invalidate_mw(struct rxe_qp *qp, u32 rkey)
+ 		goto err;
+ 	}
+ 
+-	if (rkey != mw->ibmw.rkey) {
++	if (rkey != mw->rkey) {
+ 		ret = -EINVAL;
+ 		goto err_drop_ref;
+ 	}
+@@ -323,7 +321,7 @@ struct rxe_mw *rxe_lookup_mw(struct rxe_qp *qp, int access, u32 rkey)
+ 	if (!mw)
+ 		return NULL;
+ 
+-	if (unlikely((rxe_mw_rkey(mw) != rkey) || rxe_mw_pd(mw) != pd ||
++	if (unlikely((mw->rkey != rkey) || rxe_mw_pd(mw) != pd ||
+ 		     (mw->ibmw.type == IB_MW_TYPE_2 && mw->qp != qp) ||
+ 		     (mw->length == 0) ||
+ 		     (access && !(access & mw->access)) ||
+diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c
+index 3894197a82f62..fc996fd31e589 100644
+--- a/drivers/infiniband/sw/rxe/rxe_req.c
++++ b/drivers/infiniband/sw/rxe/rxe_req.c
+@@ -572,7 +572,6 @@ static void update_state(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
+ static int rxe_do_local_ops(struct rxe_qp *qp, struct rxe_send_wqe *wqe)
+ {
+ 	u8 opcode = wqe->wr.opcode;
+-	struct rxe_mr *mr;
+ 	u32 rkey;
+ 	int ret;
+ 
+@@ -590,14 +589,11 @@ static int rxe_do_local_ops(struct rxe_qp *qp, struct rxe_send_wqe *wqe)
+ 		}
+ 		break;
+ 	case IB_WR_REG_MR:
+-		mr = to_rmr(wqe->wr.wr.reg.mr);
+-		rxe_add_ref(mr);
+-		mr->state = RXE_MR_STATE_VALID;
+-		mr->access = wqe->wr.wr.reg.access;
+-		mr->ibmr.lkey = wqe->wr.wr.reg.key;
+-		mr->ibmr.rkey = wqe->wr.wr.reg.key;
+-		mr->iova = wqe->wr.wr.reg.mr->iova;
+-		rxe_drop_ref(mr);
++		ret = rxe_reg_fast_mr(qp, wqe);
++		if (unlikely(ret)) {
++			wqe->status = IB_WC_LOC_QP_OP_ERR;
++			return ret;
++		}
+ 		break;
+ 	case IB_WR_BIND_MW:
+ 		ret = rxe_bind_mw(qp, wqe);
+diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h
+index ac2a2148027f4..d90b1d77de347 100644
+--- a/drivers/infiniband/sw/rxe/rxe_verbs.h
++++ b/drivers/infiniband/sw/rxe/rxe_verbs.h
+@@ -313,6 +313,8 @@ struct rxe_mr {
+ 
+ 	struct ib_umem		*umem;
+ 
++	u32			lkey;
++	u32			rkey;
+ 	enum rxe_mr_state	state;
+ 	enum rxe_mr_type	type;
+ 	u64			va;
+@@ -350,6 +352,7 @@ struct rxe_mw {
+ 	enum rxe_mw_state	state;
+ 	struct rxe_qp		*qp; /* Type 2 only */
+ 	struct rxe_mr		*mr;
++	u32			rkey;
+ 	int			access;
+ 	u64			addr;
+ 	u64			length;
+@@ -474,26 +477,11 @@ static inline struct rxe_pd *mr_pd(struct rxe_mr *mr)
+ 	return to_rpd(mr->ibmr.pd);
+ }
+ 
+-static inline u32 mr_lkey(struct rxe_mr *mr)
+-{
+-	return mr->ibmr.lkey;
+-}
+-
+-static inline u32 mr_rkey(struct rxe_mr *mr)
+-{
+-	return mr->ibmr.rkey;
+-}
+-
+ static inline struct rxe_pd *rxe_mw_pd(struct rxe_mw *mw)
+ {
+ 	return to_rpd(mw->ibmw.pd);
+ }
+ 
+-static inline u32 rxe_mw_rkey(struct rxe_mw *mw)
+-{
+-	return mw->ibmw.rkey;
+-}
+-
+ int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name);
+ 
+ void rxe_mc_cleanup(struct rxe_pool_entry *arg);
+diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c
+index fdfa39ec2a4d4..ad69eeb5ac5ba 100644
+--- a/drivers/iommu/apple-dart.c
++++ b/drivers/iommu/apple-dart.c
+@@ -70,6 +70,8 @@
+ #define DART_ERROR_ADDR_HI 0x54
+ #define DART_ERROR_ADDR_LO 0x50
+ 
++#define DART_STREAMS_ENABLE 0xfc
++
+ #define DART_TCR(sid) (0x100 + 4 * (sid))
+ #define DART_TCR_TRANSLATE_ENABLE BIT(7)
+ #define DART_TCR_BYPASS0_ENABLE BIT(8)
+@@ -301,6 +303,9 @@ static int apple_dart_hw_reset(struct apple_dart *dart)
+ 	apple_dart_hw_disable_dma(&stream_map);
+ 	apple_dart_hw_clear_all_ttbrs(&stream_map);
+ 
++	/* enable all streams globally since TCR is used to control isolation */
++	writel(DART_STREAM_ALL, dart->regs + DART_STREAMS_ENABLE);
++
+ 	/* clear any pending errors before the interrupt is unmasked */
+ 	writel(readl(dart->regs + DART_ERROR), dart->regs + DART_ERROR);
+ 
+diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
+index d75f59ae28e6e..9a356075d3450 100644
+--- a/drivers/iommu/intel/iommu.c
++++ b/drivers/iommu/intel/iommu.c
+@@ -412,6 +412,7 @@ static int __init intel_iommu_setup(char *str)
+ {
+ 	if (!str)
+ 		return -EINVAL;
++
+ 	while (*str) {
+ 		if (!strncmp(str, "on", 2)) {
+ 			dmar_disabled = 0;
+@@ -441,13 +442,16 @@ static int __init intel_iommu_setup(char *str)
+ 		} else if (!strncmp(str, "tboot_noforce", 13)) {
+ 			pr_info("Intel-IOMMU: not forcing on after tboot. This could expose security risk for tboot\n");
+ 			intel_iommu_tboot_noforce = 1;
++		} else {
++			pr_notice("Unknown option - '%s'\n", str);
+ 		}
+ 
+ 		str += strcspn(str, ",");
+ 		while (*str == ',')
+ 			str++;
+ 	}
+-	return 0;
++
++	return 1;
+ }
+ __setup("intel_iommu=", intel_iommu_setup);
+ 
+diff --git a/drivers/memory/tegra/tegra20-emc.c b/drivers/memory/tegra/tegra20-emc.c
+index c3462dbc8c22b..6fc90f2160e93 100644
+--- a/drivers/memory/tegra/tegra20-emc.c
++++ b/drivers/memory/tegra/tegra20-emc.c
+@@ -1117,4 +1117,5 @@ module_platform_driver(tegra_emc_driver);
+ 
+ MODULE_AUTHOR("Dmitry Osipenko <digetx@gmail.com>");
+ MODULE_DESCRIPTION("NVIDIA Tegra20 EMC driver");
++MODULE_SOFTDEP("pre: governor_simpleondemand");
+ MODULE_LICENSE("GPL v2");
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h
+index 1835d2e451c01..fc7fce642666c 100644
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_init_ops.h
+@@ -635,11 +635,13 @@ static int bnx2x_ilt_client_mem_op(struct bnx2x *bp, int cli_num,
+ {
+ 	int i, rc;
+ 	struct bnx2x_ilt *ilt = BP_ILT(bp);
+-	struct ilt_client_info *ilt_cli = &ilt->clients[cli_num];
++	struct ilt_client_info *ilt_cli;
+ 
+ 	if (!ilt || !ilt->lines)
+ 		return -1;
+ 
++	ilt_cli = &ilt->clients[cli_num];
++
+ 	if (ilt_cli->flags & (ILT_CLIENT_SKIP_INIT | ILT_CLIENT_SKIP_MEM))
+ 		return 0;
+ 
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
+index e6a4a768b10b2..1471b6130a2b9 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
+@@ -1868,7 +1868,7 @@ static int bnxt_tc_setup_indr_block_cb(enum tc_setup_type type,
+ 	struct flow_cls_offload *flower = type_data;
+ 	struct bnxt *bp = priv->bp;
+ 
+-	if (flower->common.chain_index)
++	if (!tc_cls_can_offload_and_chain0(bp->dev, type_data))
+ 		return -EOPNOTSUPP;
+ 
+ 	switch (type) {
+diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
+index 7065c71ed7b86..f3e443f2d9cf9 100644
+--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
++++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
+@@ -4538,10 +4538,10 @@ static int dpaa2_eth_remove(struct fsl_mc_device *ls_dev)
+ 
+ 	fsl_mc_portal_free(priv->mc_io);
+ 
+-	free_netdev(net_dev);
+-
+ 	dev_dbg(net_dev->dev.parent, "Removed interface %s\n", net_dev->name);
+ 
++	free_netdev(net_dev);
++
+ 	return 0;
+ }
+ 
+diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c
+index 09ae1939e6db4..36d52246bdc66 100644
+--- a/drivers/net/ethernet/intel/e100.c
++++ b/drivers/net/ethernet/intel/e100.c
+@@ -3003,9 +3003,10 @@ static void __e100_shutdown(struct pci_dev *pdev, bool *enable_wake)
+ 	struct net_device *netdev = pci_get_drvdata(pdev);
+ 	struct nic *nic = netdev_priv(netdev);
+ 
++	netif_device_detach(netdev);
++
+ 	if (netif_running(netdev))
+ 		e100_down(nic);
+-	netif_device_detach(netdev);
+ 
+ 	if ((nic->flags & wol_magic) | e100_asf(nic)) {
+ 		/* enable reverse auto-negotiation */
+@@ -3022,7 +3023,7 @@ static void __e100_shutdown(struct pci_dev *pdev, bool *enable_wake)
+ 		*enable_wake = false;
+ 	}
+ 
+-	pci_clear_master(pdev);
++	pci_disable_device(pdev);
+ }
+ 
+ static int __e100_power_off(struct pci_dev *pdev, bool wake)
+@@ -3042,8 +3043,6 @@ static int __maybe_unused e100_suspend(struct device *dev_d)
+ 
+ 	__e100_shutdown(to_pci_dev(dev_d), &wake);
+ 
+-	device_wakeup_disable(dev_d);
+-
+ 	return 0;
+ }
+ 
+@@ -3051,6 +3050,14 @@ static int __maybe_unused e100_resume(struct device *dev_d)
+ {
+ 	struct net_device *netdev = dev_get_drvdata(dev_d);
+ 	struct nic *nic = netdev_priv(netdev);
++	int err;
++
++	err = pci_enable_device(to_pci_dev(dev_d));
++	if (err) {
++		netdev_err(netdev, "Resume cannot enable PCI device, aborting\n");
++		return err;
++	}
++	pci_set_master(to_pci_dev(dev_d));
+ 
+ 	/* disable reverse auto-negotiation */
+ 	if (nic->phy == phy_82552_v) {
+@@ -3062,10 +3069,11 @@ static int __maybe_unused e100_resume(struct device *dev_d)
+ 		           smartspeed & ~(E100_82552_REV_ANEG));
+ 	}
+ 
+-	netif_device_attach(netdev);
+ 	if (netif_running(netdev))
+ 		e100_up(nic);
+ 
++	netif_device_attach(netdev);
++
+ 	return 0;
+ }
+ 
+diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
+index 39fb3d57c0574..b10bc59c5700f 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e.h
++++ b/drivers/net/ethernet/intel/i40e/i40e.h
+@@ -161,6 +161,7 @@ enum i40e_vsi_state_t {
+ 	__I40E_VSI_OVERFLOW_PROMISC,
+ 	__I40E_VSI_REINIT_REQUESTED,
+ 	__I40E_VSI_DOWN_REQUESTED,
++	__I40E_VSI_RELEASING,
+ 	/* This must be last as it determines the size of the BITMAP */
+ 	__I40E_VSI_STATE_SIZE__,
+ };
+@@ -1247,6 +1248,7 @@ void i40e_ptp_restore_hw_time(struct i40e_pf *pf);
+ void i40e_ptp_init(struct i40e_pf *pf);
+ void i40e_ptp_stop(struct i40e_pf *pf);
+ int i40e_ptp_alloc_pins(struct i40e_pf *pf);
++int i40e_update_adq_vsi_queues(struct i40e_vsi *vsi, int vsi_offset);
+ int i40e_is_vsi_uplink_mode_veb(struct i40e_vsi *vsi);
+ i40e_status i40e_get_partition_bw_setting(struct i40e_pf *pf);
+ i40e_status i40e_set_partition_bw_setting(struct i40e_pf *pf);
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
+index e04b540cedc85..76d0b809d1340 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -1790,6 +1790,7 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
+ 				     bool is_add)
+ {
+ 	struct i40e_pf *pf = vsi->back;
++	u16 num_tc_qps = 0;
+ 	u16 sections = 0;
+ 	u8 netdev_tc = 0;
+ 	u16 numtc = 1;
+@@ -1797,13 +1798,33 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
+ 	u8 offset;
+ 	u16 qmap;
+ 	int i;
+-	u16 num_tc_qps = 0;
+ 
+ 	sections = I40E_AQ_VSI_PROP_QUEUE_MAP_VALID;
+ 	offset = 0;
++	/* zero out queue mapping, it will get updated on the end of the function */
++	memset(ctxt->info.queue_mapping, 0, sizeof(ctxt->info.queue_mapping));
++
++	if (vsi->type == I40E_VSI_MAIN) {
++		/* This code helps add more queue to the VSI if we have
++		 * more cores than RSS can support, the higher cores will
++		 * be served by ATR or other filters. Furthermore, the
++		 * non-zero req_queue_pairs says that user requested a new
++		 * queue count via ethtool's set_channels, so use this
++		 * value for queues distribution across traffic classes
++		 */
++		if (vsi->req_queue_pairs > 0)
++			vsi->num_queue_pairs = vsi->req_queue_pairs;
++		else if (pf->flags & I40E_FLAG_MSIX_ENABLED)
++			vsi->num_queue_pairs = pf->num_lan_msix;
++	}
+ 
+ 	/* Number of queues per enabled TC */
+-	num_tc_qps = vsi->alloc_queue_pairs;
++	if (vsi->type == I40E_VSI_MAIN ||
++	    (vsi->type == I40E_VSI_SRIOV && vsi->num_queue_pairs != 0))
++		num_tc_qps = vsi->num_queue_pairs;
++	else
++		num_tc_qps = vsi->alloc_queue_pairs;
++
+ 	if (enabled_tc && (vsi->back->flags & I40E_FLAG_DCB_ENABLED)) {
+ 		/* Find numtc from enabled TC bitmap */
+ 		for (i = 0, numtc = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
+@@ -1881,15 +1902,11 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,
+ 		}
+ 		ctxt->info.tc_mapping[i] = cpu_to_le16(qmap);
+ 	}
+-
+-	/* Set actual Tx/Rx queue pairs */
+-	vsi->num_queue_pairs = offset;
+-	if ((vsi->type == I40E_VSI_MAIN) && (numtc == 1)) {
+-		if (vsi->req_queue_pairs > 0)
+-			vsi->num_queue_pairs = vsi->req_queue_pairs;
+-		else if (pf->flags & I40E_FLAG_MSIX_ENABLED)
+-			vsi->num_queue_pairs = pf->num_lan_msix;
+-	}
++	/* Do not change previously set num_queue_pairs for PFs and VFs*/
++	if ((vsi->type == I40E_VSI_MAIN && numtc != 1) ||
++	    (vsi->type == I40E_VSI_SRIOV && vsi->num_queue_pairs == 0) ||
++	    (vsi->type != I40E_VSI_MAIN && vsi->type != I40E_VSI_SRIOV))
++		vsi->num_queue_pairs = offset;
+ 
+ 	/* Scheduler section valid can only be set for ADD VSI */
+ 	if (is_add) {
+@@ -2623,7 +2640,8 @@ static void i40e_sync_filters_subtask(struct i40e_pf *pf)
+ 
+ 	for (v = 0; v < pf->num_alloc_vsi; v++) {
+ 		if (pf->vsi[v] &&
+-		    (pf->vsi[v]->flags & I40E_VSI_FLAG_FILTER_CHANGED)) {
++		    (pf->vsi[v]->flags & I40E_VSI_FLAG_FILTER_CHANGED) &&
++		    !test_bit(__I40E_VSI_RELEASING, pf->vsi[v]->state)) {
+ 			int ret = i40e_sync_vsi_filters(pf->vsi[v]);
+ 
+ 			if (ret) {
+@@ -5426,6 +5444,58 @@ static void i40e_vsi_update_queue_map(struct i40e_vsi *vsi,
+ 	       sizeof(vsi->info.tc_mapping));
+ }
+ 
++/**
++ * i40e_update_adq_vsi_queues - update queue mapping for ADq VSI
++ * @vsi: the VSI being reconfigured
++ * @vsi_offset: offset from main VF VSI
++ */
++int i40e_update_adq_vsi_queues(struct i40e_vsi *vsi, int vsi_offset)
++{
++	struct i40e_vsi_context ctxt = {};
++	struct i40e_pf *pf;
++	struct i40e_hw *hw;
++	int ret;
++
++	if (!vsi)
++		return I40E_ERR_PARAM;
++	pf = vsi->back;
++	hw = &pf->hw;
++
++	ctxt.seid = vsi->seid;
++	ctxt.pf_num = hw->pf_id;
++	ctxt.vf_num = vsi->vf_id + hw->func_caps.vf_base_id + vsi_offset;
++	ctxt.uplink_seid = vsi->uplink_seid;
++	ctxt.connection_type = I40E_AQ_VSI_CONN_TYPE_NORMAL;
++	ctxt.flags = I40E_AQ_VSI_TYPE_VF;
++	ctxt.info = vsi->info;
++
++	i40e_vsi_setup_queue_map(vsi, &ctxt, vsi->tc_config.enabled_tc,
++				 false);
++	if (vsi->reconfig_rss) {
++		vsi->rss_size = min_t(int, pf->alloc_rss_size,
++				      vsi->num_queue_pairs);
++		ret = i40e_vsi_config_rss(vsi);
++		if (ret) {
++			dev_info(&pf->pdev->dev, "Failed to reconfig rss for num_queues\n");
++			return ret;
++		}
++		vsi->reconfig_rss = false;
++	}
++
++	ret = i40e_aq_update_vsi_params(hw, &ctxt, NULL);
++	if (ret) {
++		dev_info(&pf->pdev->dev, "Update vsi config failed, err %s aq_err %s\n",
++			 i40e_stat_str(hw, ret),
++			 i40e_aq_str(hw, hw->aq.asq_last_status));
++		return ret;
++	}
++	/* update the local VSI info with updated queue map */
++	i40e_vsi_update_queue_map(vsi, &ctxt);
++	vsi->info.valid_sections = 0;
++
++	return ret;
++}
++
+ /**
+  * i40e_vsi_config_tc - Configure VSI Tx Scheduler for given TC map
+  * @vsi: VSI to be configured
+@@ -5716,24 +5786,6 @@ static void i40e_remove_queue_channels(struct i40e_vsi *vsi)
+ 	INIT_LIST_HEAD(&vsi->ch_list);
+ }
+ 
+-/**
+- * i40e_is_any_channel - channel exist or not
+- * @vsi: ptr to VSI to which channels are associated with
+- *
+- * Returns true or false if channel(s) exist for associated VSI or not
+- **/
+-static bool i40e_is_any_channel(struct i40e_vsi *vsi)
+-{
+-	struct i40e_channel *ch, *ch_tmp;
+-
+-	list_for_each_entry_safe(ch, ch_tmp, &vsi->ch_list, list) {
+-		if (ch->initialized)
+-			return true;
+-	}
+-
+-	return false;
+-}
+-
+ /**
+  * i40e_get_max_queues_for_channel
+  * @vsi: ptr to VSI to which channels are associated with
+@@ -6240,26 +6292,15 @@ int i40e_create_queue_channel(struct i40e_vsi *vsi,
+ 	/* By default we are in VEPA mode, if this is the first VF/VMDq
+ 	 * VSI to be added switch to VEB mode.
+ 	 */
+-	if ((!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) ||
+-	    (!i40e_is_any_channel(vsi))) {
+-		if (!is_power_of_2(vsi->tc_config.tc_info[0].qcount)) {
+-			dev_dbg(&pf->pdev->dev,
+-				"Failed to create channel. Override queues (%u) not power of 2\n",
+-				vsi->tc_config.tc_info[0].qcount);
+-			return -EINVAL;
+-		}
+ 
+-		if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) {
+-			pf->flags |= I40E_FLAG_VEB_MODE_ENABLED;
++	if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) {
++		pf->flags |= I40E_FLAG_VEB_MODE_ENABLED;
+ 
+-			if (vsi->type == I40E_VSI_MAIN) {
+-				if (pf->flags & I40E_FLAG_TC_MQPRIO)
+-					i40e_do_reset(pf, I40E_PF_RESET_FLAG,
+-						      true);
+-				else
+-					i40e_do_reset_safe(pf,
+-							   I40E_PF_RESET_FLAG);
+-			}
++		if (vsi->type == I40E_VSI_MAIN) {
++			if (pf->flags & I40E_FLAG_TC_MQPRIO)
++				i40e_do_reset(pf, I40E_PF_RESET_FLAG, true);
++			else
++				i40e_do_reset_safe(pf, I40E_PF_RESET_FLAG);
+ 		}
+ 		/* now onwards for main VSI, number of queues will be value
+ 		 * of TC0's queue count
+@@ -7912,12 +7953,20 @@ config_tc:
+ 			    vsi->seid);
+ 		need_reset = true;
+ 		goto exit;
+-	} else {
+-		dev_info(&vsi->back->pdev->dev,
+-			 "Setup channel (id:%u) utilizing num_queues %d\n",
+-			 vsi->seid, vsi->tc_config.tc_info[0].qcount);
++	} else if (enabled_tc &&
++		   (!is_power_of_2(vsi->tc_config.tc_info[0].qcount))) {
++		netdev_info(netdev,
++			    "Failed to create channel. Override queues (%u) not power of 2\n",
++			    vsi->tc_config.tc_info[0].qcount);
++		ret = -EINVAL;
++		need_reset = true;
++		goto exit;
+ 	}
+ 
++	dev_info(&vsi->back->pdev->dev,
++		 "Setup channel (id:%u) utilizing num_queues %d\n",
++		 vsi->seid, vsi->tc_config.tc_info[0].qcount);
++
+ 	if (pf->flags & I40E_FLAG_TC_MQPRIO) {
+ 		if (vsi->mqprio_qopt.max_rate[0]) {
+ 			u64 max_tx_rate = vsi->mqprio_qopt.max_rate[0];
+@@ -8482,9 +8531,8 @@ static int i40e_configure_clsflower(struct i40e_vsi *vsi,
+ 		err = i40e_add_del_cloud_filter(vsi, filter, true);
+ 
+ 	if (err) {
+-		dev_err(&pf->pdev->dev,
+-			"Failed to add cloud filter, err %s\n",
+-			i40e_stat_str(&pf->hw, err));
++		dev_err(&pf->pdev->dev, "Failed to add cloud filter, err %d\n",
++			err);
+ 		goto err;
+ 	}
+ 
+@@ -13771,7 +13819,7 @@ int i40e_vsi_release(struct i40e_vsi *vsi)
+ 		dev_info(&pf->pdev->dev, "Can't remove PF VSI\n");
+ 		return -ENODEV;
+ 	}
+-
++	set_bit(__I40E_VSI_RELEASING, vsi->state);
+ 	uplink_seid = vsi->uplink_seid;
+ 	if (vsi->type != I40E_VSI_SRIOV) {
+ 		if (vsi->netdev_registered) {
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+index 472f56b360b8c..80ae264c99ba0 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+@@ -183,17 +183,18 @@ void i40e_vc_notify_vf_reset(struct i40e_vf *vf)
+ /***********************misc routines*****************************/
+ 
+ /**
+- * i40e_vc_disable_vf
++ * i40e_vc_reset_vf
+  * @vf: pointer to the VF info
+- *
+- * Disable the VF through a SW reset.
++ * @notify_vf: notify vf about reset or not
++ * Reset VF handler.
+  **/
+-static inline void i40e_vc_disable_vf(struct i40e_vf *vf)
++static void i40e_vc_reset_vf(struct i40e_vf *vf, bool notify_vf)
+ {
+ 	struct i40e_pf *pf = vf->pf;
+ 	int i;
+ 
+-	i40e_vc_notify_vf_reset(vf);
++	if (notify_vf)
++		i40e_vc_notify_vf_reset(vf);
+ 
+ 	/* We want to ensure that an actual reset occurs initiated after this
+ 	 * function was called. However, we do not want to wait forever, so
+@@ -211,9 +212,14 @@ static inline void i40e_vc_disable_vf(struct i40e_vf *vf)
+ 		usleep_range(10000, 20000);
+ 	}
+ 
+-	dev_warn(&vf->pf->pdev->dev,
+-		 "Failed to initiate reset for VF %d after 200 milliseconds\n",
+-		 vf->vf_id);
++	if (notify_vf)
++		dev_warn(&vf->pf->pdev->dev,
++			 "Failed to initiate reset for VF %d after 200 milliseconds\n",
++			 vf->vf_id);
++	else
++		dev_dbg(&vf->pf->pdev->dev,
++			"Failed to initiate reset for VF %d after 200 milliseconds\n",
++			vf->vf_id);
+ }
+ 
+ /**
+@@ -674,14 +680,13 @@ static int i40e_config_vsi_rx_queue(struct i40e_vf *vf, u16 vsi_id,
+ 				    u16 vsi_queue_id,
+ 				    struct virtchnl_rxq_info *info)
+ {
++	u16 pf_queue_id = i40e_vc_get_pf_queue_id(vf, vsi_id, vsi_queue_id);
+ 	struct i40e_pf *pf = vf->pf;
++	struct i40e_vsi *vsi = pf->vsi[vf->lan_vsi_idx];
+ 	struct i40e_hw *hw = &pf->hw;
+ 	struct i40e_hmc_obj_rxq rx_ctx;
+-	u16 pf_queue_id;
+ 	int ret = 0;
+ 
+-	pf_queue_id = i40e_vc_get_pf_queue_id(vf, vsi_id, vsi_queue_id);
+-
+ 	/* clear the context structure first */
+ 	memset(&rx_ctx, 0, sizeof(struct i40e_hmc_obj_rxq));
+ 
+@@ -719,6 +724,10 @@ static int i40e_config_vsi_rx_queue(struct i40e_vf *vf, u16 vsi_id,
+ 	}
+ 	rx_ctx.rxmax = info->max_pkt_size;
+ 
++	/* if port VLAN is configured increase the max packet size */
++	if (vsi->info.pvid)
++		rx_ctx.rxmax += VLAN_HLEN;
++
+ 	/* enable 32bytes desc always */
+ 	rx_ctx.dsize = 1;
+ 
+@@ -2105,20 +2114,6 @@ err:
+ 	return ret;
+ }
+ 
+-/**
+- * i40e_vc_reset_vf_msg
+- * @vf: pointer to the VF info
+- *
+- * called from the VF to reset itself,
+- * unlike other virtchnl messages, PF driver
+- * doesn't send the response back to the VF
+- **/
+-static void i40e_vc_reset_vf_msg(struct i40e_vf *vf)
+-{
+-	if (test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states))
+-		i40e_reset_vf(vf, false);
+-}
+-
+ /**
+  * i40e_vc_config_promiscuous_mode_msg
+  * @vf: pointer to the VF info
+@@ -2217,11 +2212,12 @@ static int i40e_vc_config_queues_msg(struct i40e_vf *vf, u8 *msg)
+ 	struct virtchnl_vsi_queue_config_info *qci =
+ 	    (struct virtchnl_vsi_queue_config_info *)msg;
+ 	struct virtchnl_queue_pair_info *qpi;
+-	struct i40e_pf *pf = vf->pf;
+ 	u16 vsi_id, vsi_queue_id = 0;
+-	u16 num_qps_all = 0;
++	struct i40e_pf *pf = vf->pf;
+ 	i40e_status aq_ret = 0;
+ 	int i, j = 0, idx = 0;
++	struct i40e_vsi *vsi;
++	u16 num_qps_all = 0;
+ 
+ 	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
+ 		aq_ret = I40E_ERR_PARAM;
+@@ -2310,9 +2306,15 @@ static int i40e_vc_config_queues_msg(struct i40e_vf *vf, u8 *msg)
+ 		pf->vsi[vf->lan_vsi_idx]->num_queue_pairs =
+ 			qci->num_queue_pairs;
+ 	} else {
+-		for (i = 0; i < vf->num_tc; i++)
+-			pf->vsi[vf->ch[i].vsi_idx]->num_queue_pairs =
+-			       vf->ch[i].num_qps;
++		for (i = 0; i < vf->num_tc; i++) {
++			vsi = pf->vsi[vf->ch[i].vsi_idx];
++			vsi->num_queue_pairs = vf->ch[i].num_qps;
++
++			if (i40e_update_adq_vsi_queues(vsi, i)) {
++				aq_ret = I40E_ERR_CONFIG;
++				goto error_param;
++			}
++		}
+ 	}
+ 
+ error_param:
+@@ -2607,8 +2609,7 @@ static int i40e_vc_request_queues_msg(struct i40e_vf *vf, u8 *msg)
+ 	} else {
+ 		/* successful request */
+ 		vf->num_req_queues = req_pairs;
+-		i40e_vc_notify_vf_reset(vf);
+-		i40e_reset_vf(vf, false);
++		i40e_vc_reset_vf(vf, true);
+ 		return 0;
+ 	}
+ 
+@@ -3803,8 +3804,7 @@ static int i40e_vc_add_qch_msg(struct i40e_vf *vf, u8 *msg)
+ 	vf->num_req_queues = 0;
+ 
+ 	/* reset the VF in order to allocate resources */
+-	i40e_vc_notify_vf_reset(vf);
+-	i40e_reset_vf(vf, false);
++	i40e_vc_reset_vf(vf, true);
+ 
+ 	return I40E_SUCCESS;
+ 
+@@ -3844,8 +3844,7 @@ static int i40e_vc_del_qch_msg(struct i40e_vf *vf, u8 *msg)
+ 	}
+ 
+ 	/* reset the VF in order to allocate resources */
+-	i40e_vc_notify_vf_reset(vf);
+-	i40e_reset_vf(vf, false);
++	i40e_vc_reset_vf(vf, true);
+ 
+ 	return I40E_SUCCESS;
+ 
+@@ -3907,7 +3906,7 @@ int i40e_vc_process_vf_msg(struct i40e_pf *pf, s16 vf_id, u32 v_opcode,
+ 		i40e_vc_notify_vf_link_state(vf);
+ 		break;
+ 	case VIRTCHNL_OP_RESET_VF:
+-		i40e_vc_reset_vf_msg(vf);
++		i40e_vc_reset_vf(vf, false);
+ 		ret = 0;
+ 		break;
+ 	case VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE:
+@@ -4161,7 +4160,7 @@ int i40e_ndo_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
+ 	/* Force the VF interface down so it has to bring up with new MAC
+ 	 * address
+ 	 */
+-	i40e_vc_disable_vf(vf);
++	i40e_vc_reset_vf(vf, true);
+ 	dev_info(&pf->pdev->dev, "Bring down and up the VF interface to make this change effective.\n");
+ 
+ error_param:
+@@ -4169,34 +4168,6 @@ error_param:
+ 	return ret;
+ }
+ 
+-/**
+- * i40e_vsi_has_vlans - True if VSI has configured VLANs
+- * @vsi: pointer to the vsi
+- *
+- * Check if a VSI has configured any VLANs. False if we have a port VLAN or if
+- * we have no configured VLANs. Do not call while holding the
+- * mac_filter_hash_lock.
+- */
+-static bool i40e_vsi_has_vlans(struct i40e_vsi *vsi)
+-{
+-	bool have_vlans;
+-
+-	/* If we have a port VLAN, then the VSI cannot have any VLANs
+-	 * configured, as all MAC/VLAN filters will be assigned to the PVID.
+-	 */
+-	if (vsi->info.pvid)
+-		return false;
+-
+-	/* Since we don't have a PVID, we know that if the device is in VLAN
+-	 * mode it must be because of a VLAN filter configured on this VSI.
+-	 */
+-	spin_lock_bh(&vsi->mac_filter_hash_lock);
+-	have_vlans = i40e_is_vsi_in_vlan(vsi);
+-	spin_unlock_bh(&vsi->mac_filter_hash_lock);
+-
+-	return have_vlans;
+-}
+-
+ /**
+  * i40e_ndo_set_vf_port_vlan
+  * @netdev: network interface device structure
+@@ -4253,19 +4224,9 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id,
+ 		/* duplicate request, so just return success */
+ 		goto error_pvid;
+ 
+-	if (i40e_vsi_has_vlans(vsi)) {
+-		dev_err(&pf->pdev->dev,
+-			"VF %d has already configured VLAN filters and the administrator is requesting a port VLAN override.\nPlease unload and reload the VF driver for this change to take effect.\n",
+-			vf_id);
+-		/* Administrator Error - knock the VF offline until he does
+-		 * the right thing by reconfiguring his network correctly
+-		 * and then reloading the VF driver.
+-		 */
+-		i40e_vc_disable_vf(vf);
+-		/* During reset the VF got a new VSI, so refresh the pointer. */
+-		vsi = pf->vsi[vf->lan_vsi_idx];
+-	}
+-
++	i40e_vc_reset_vf(vf, true);
++	/* During reset the VF got a new VSI, so refresh a pointer. */
++	vsi = pf->vsi[vf->lan_vsi_idx];
+ 	/* Locked once because multiple functions below iterate list */
+ 	spin_lock_bh(&vsi->mac_filter_hash_lock);
+ 
+@@ -4641,7 +4602,7 @@ int i40e_ndo_set_vf_trust(struct net_device *netdev, int vf_id, bool setting)
+ 		goto out;
+ 
+ 	vf->trusted = setting;
+-	i40e_vc_disable_vf(vf);
++	i40e_vc_reset_vf(vf, true);
+ 	dev_info(&pf->pdev->dev, "VF %u is now %strusted\n",
+ 		 vf_id, setting ? "" : "un");
+ 
+diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h
+index 68c80f04113c8..46312a4415baf 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf.h
++++ b/drivers/net/ethernet/intel/iavf/iavf.h
+@@ -39,6 +39,7 @@
+ #include "iavf_txrx.h"
+ #include "iavf_fdir.h"
+ #include "iavf_adv_rss.h"
++#include <linux/bitmap.h>
+ 
+ #define DEFAULT_DEBUG_LEVEL_SHIFT 3
+ #define PFX "iavf: "
+diff --git a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
+index 5a359a0a20ecc..144a776793597 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
+@@ -1776,6 +1776,7 @@ static int iavf_set_channels(struct net_device *netdev,
+ {
+ 	struct iavf_adapter *adapter = netdev_priv(netdev);
+ 	u32 num_req = ch->combined_count;
++	int i;
+ 
+ 	if ((adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADQ) &&
+ 	    adapter->num_tc) {
+@@ -1786,7 +1787,7 @@ static int iavf_set_channels(struct net_device *netdev,
+ 	/* All of these should have already been checked by ethtool before this
+ 	 * even gets to us, but just to be sure.
+ 	 */
+-	if (num_req > adapter->vsi_res->num_queue_pairs)
++	if (num_req == 0 || num_req > adapter->vsi_res->num_queue_pairs)
+ 		return -EINVAL;
+ 
+ 	if (num_req == adapter->num_active_queues)
+@@ -1798,6 +1799,20 @@ static int iavf_set_channels(struct net_device *netdev,
+ 	adapter->num_req_queues = num_req;
+ 	adapter->flags |= IAVF_FLAG_REINIT_ITR_NEEDED;
+ 	iavf_schedule_reset(adapter);
++
++	/* wait for the reset is done */
++	for (i = 0; i < IAVF_RESET_WAIT_COMPLETE_COUNT; i++) {
++		msleep(IAVF_RESET_WAIT_MS);
++		if (adapter->flags & IAVF_FLAG_RESET_PENDING)
++			continue;
++		break;
++	}
++	if (i == IAVF_RESET_WAIT_COMPLETE_COUNT) {
++		adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED;
++		adapter->num_active_queues = num_req;
++		return -EOPNOTSUPP;
++	}
++
+ 	return 0;
+ }
+ 
+@@ -1844,14 +1859,13 @@ static int iavf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
+ 
+ 	if (hfunc)
+ 		*hfunc = ETH_RSS_HASH_TOP;
+-	if (!indir)
+-		return 0;
+-
+-	memcpy(key, adapter->rss_key, adapter->rss_key_size);
++	if (key)
++		memcpy(key, adapter->rss_key, adapter->rss_key_size);
+ 
+-	/* Each 32 bits pointed by 'indir' is stored with a lut entry */
+-	for (i = 0; i < adapter->rss_lut_size; i++)
+-		indir[i] = (u32)adapter->rss_lut[i];
++	if (indir)
++		/* Each 32 bits pointed by 'indir' is stored with a lut entry */
++		for (i = 0; i < adapter->rss_lut_size; i++)
++			indir[i] = (u32)adapter->rss_lut[i];
+ 
+ 	return 0;
+ }
+diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c
+index cada4e0e40b48..aaf8a2f396e46 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf_main.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_main.c
+@@ -687,6 +687,23 @@ static void iavf_del_vlan(struct iavf_adapter *adapter, u16 vlan)
+ 	spin_unlock_bh(&adapter->mac_vlan_list_lock);
+ }
+ 
++/**
++ * iavf_restore_filters
++ * @adapter: board private structure
++ *
++ * Restore existing non MAC filters when VF netdev comes back up
++ **/
++static void iavf_restore_filters(struct iavf_adapter *adapter)
++{
++	/* re-add all VLAN filters */
++	if (VLAN_ALLOWED(adapter)) {
++		u16 vid;
++
++		for_each_set_bit(vid, adapter->vsi.active_vlans, VLAN_N_VID)
++			iavf_add_vlan(adapter, vid);
++	}
++}
++
+ /**
+  * iavf_vlan_rx_add_vid - Add a VLAN filter to a device
+  * @netdev: network device struct
+@@ -700,8 +717,11 @@ static int iavf_vlan_rx_add_vid(struct net_device *netdev,
+ 
+ 	if (!VLAN_ALLOWED(adapter))
+ 		return -EIO;
++
+ 	if (iavf_add_vlan(adapter, vid) == NULL)
+ 		return -ENOMEM;
++
++	set_bit(vid, adapter->vsi.active_vlans);
+ 	return 0;
+ }
+ 
+@@ -716,11 +736,13 @@ static int iavf_vlan_rx_kill_vid(struct net_device *netdev,
+ {
+ 	struct iavf_adapter *adapter = netdev_priv(netdev);
+ 
+-	if (VLAN_ALLOWED(adapter)) {
+-		iavf_del_vlan(adapter, vid);
+-		return 0;
+-	}
+-	return -EIO;
++	if (!VLAN_ALLOWED(adapter))
++		return -EIO;
++
++	iavf_del_vlan(adapter, vid);
++	clear_bit(vid, adapter->vsi.active_vlans);
++
++	return 0;
+ }
+ 
+ /**
+@@ -1630,8 +1652,7 @@ static int iavf_process_aq_command(struct iavf_adapter *adapter)
+ 		iavf_set_promiscuous(adapter, FLAG_VF_MULTICAST_PROMISC);
+ 		return 0;
+ 	}
+-
+-	if ((adapter->aq_required & IAVF_FLAG_AQ_RELEASE_PROMISC) &&
++	if ((adapter->aq_required & IAVF_FLAG_AQ_RELEASE_PROMISC) ||
+ 	    (adapter->aq_required & IAVF_FLAG_AQ_RELEASE_ALLMULTI)) {
+ 		iavf_set_promiscuous(adapter, 0);
+ 		return 0;
+@@ -2074,8 +2095,8 @@ static void iavf_disable_vf(struct iavf_adapter *adapter)
+ 
+ 	iavf_free_misc_irq(adapter);
+ 	iavf_reset_interrupt_capability(adapter);
+-	iavf_free_queues(adapter);
+ 	iavf_free_q_vectors(adapter);
++	iavf_free_queues(adapter);
+ 	memset(adapter->vf_res, 0, IAVF_VIRTCHNL_VF_RESOURCE_SIZE);
+ 	iavf_shutdown_adminq(&adapter->hw);
+ 	adapter->netdev->flags &= ~IFF_UP;
+@@ -2356,7 +2377,7 @@ static void iavf_adminq_task(struct work_struct *work)
+ 
+ 	/* check for error indications */
+ 	val = rd32(hw, hw->aq.arq.len);
+-	if (val == 0xdeadbeef) /* indicates device in reset */
++	if (val == 0xdeadbeef || val == 0xffffffff) /* device in reset */
+ 		goto freedom;
+ 	oldval = val;
+ 	if (val & IAVF_VF_ARQLEN1_ARQVFE_MASK) {
+@@ -3041,8 +3062,10 @@ static int iavf_configure_clsflower(struct iavf_adapter *adapter,
+ 		return -ENOMEM;
+ 
+ 	while (!mutex_trylock(&adapter->crit_lock)) {
+-		if (--count == 0)
+-			goto err;
++		if (--count == 0) {
++			kfree(filter);
++			return err;
++		}
+ 		udelay(1);
+ 	}
+ 
+@@ -3053,11 +3076,11 @@ static int iavf_configure_clsflower(struct iavf_adapter *adapter,
+ 	/* start out with flow type and eth type IPv4 to begin with */
+ 	filter->f.flow_type = VIRTCHNL_TCP_V4_FLOW;
+ 	err = iavf_parse_cls_flower(adapter, cls_flower, filter);
+-	if (err < 0)
++	if (err)
+ 		goto err;
+ 
+ 	err = iavf_handle_tclass(adapter, tc, filter);
+-	if (err < 0)
++	if (err)
+ 		goto err;
+ 
+ 	/* add filter to the list */
+@@ -3247,6 +3270,9 @@ static int iavf_open(struct net_device *netdev)
+ 
+ 	spin_unlock_bh(&adapter->mac_vlan_list_lock);
+ 
++	/* Restore VLAN filters that were removed with IFF_DOWN */
++	iavf_restore_filters(adapter);
++
+ 	iavf_configure(adapter);
+ 
+ 	iavf_up_complete(adapter);
+@@ -3442,7 +3468,8 @@ static netdev_features_t iavf_fix_features(struct net_device *netdev,
+ {
+ 	struct iavf_adapter *adapter = netdev_priv(netdev);
+ 
+-	if (!(adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN))
++	if (adapter->vf_res &&
++	    !(adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN))
+ 		features &= ~(NETIF_F_HW_VLAN_CTAG_TX |
+ 			      NETIF_F_HW_VLAN_CTAG_RX |
+ 			      NETIF_F_HW_VLAN_CTAG_FILTER);
+diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
+index 8b23fbf3cdf4c..fba8f021c397d 100644
+--- a/drivers/net/ethernet/intel/ice/ice.h
++++ b/drivers/net/ethernet/intel/ice/ice.h
+@@ -139,13 +139,10 @@
+ #define ice_for_each_q_vector(vsi, i) \
+ 	for ((i) = 0; (i) < (vsi)->num_q_vectors; (i)++)
+ 
+-#define ICE_UCAST_PROMISC_BITS (ICE_PROMISC_UCAST_TX | ICE_PROMISC_MCAST_TX | \
+-				ICE_PROMISC_UCAST_RX | ICE_PROMISC_MCAST_RX)
++#define ICE_UCAST_PROMISC_BITS (ICE_PROMISC_UCAST_TX | ICE_PROMISC_UCAST_RX)
+ 
+ #define ICE_UCAST_VLAN_PROMISC_BITS (ICE_PROMISC_UCAST_TX | \
+-				     ICE_PROMISC_MCAST_TX | \
+ 				     ICE_PROMISC_UCAST_RX | \
+-				     ICE_PROMISC_MCAST_RX | \
+ 				     ICE_PROMISC_VLAN_TX  | \
+ 				     ICE_PROMISC_VLAN_RX)
+ 
+diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
+index 30077104d1439..a39136b0bd16a 100644
+--- a/drivers/net/ethernet/intel/ice/ice_main.c
++++ b/drivers/net/ethernet/intel/ice/ice_main.c
+@@ -4600,9 +4600,6 @@ static void ice_remove(struct pci_dev *pdev)
+ 	struct ice_pf *pf = pci_get_drvdata(pdev);
+ 	int i;
+ 
+-	if (!pf)
+-		return;
+-
+ 	for (i = 0; i < ICE_MAX_RESET_WAIT; i++) {
+ 		if (!ice_is_reset_in_progress(pf->state))
+ 			break;
+diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
+index 7e3ae4cc17a39..8c223beeb6b8a 100644
+--- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
++++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
+@@ -2952,6 +2952,7 @@ bool ice_is_any_vf_in_promisc(struct ice_pf *pf)
+ static int ice_vc_cfg_promiscuous_mode_msg(struct ice_vf *vf, u8 *msg)
+ {
+ 	enum virtchnl_status_code v_ret = VIRTCHNL_STATUS_SUCCESS;
++	enum ice_status mcast_status = 0, ucast_status = 0;
+ 	bool rm_promisc, alluni = false, allmulti = false;
+ 	struct virtchnl_promisc_info *info =
+ 	    (struct virtchnl_promisc_info *)msg;
+@@ -3041,52 +3042,51 @@ static int ice_vc_cfg_promiscuous_mode_msg(struct ice_vf *vf, u8 *msg)
+ 			goto error_param;
+ 		}
+ 	} else {
+-		enum ice_status status;
+-		u8 promisc_m;
+-
+-		if (alluni) {
+-			if (vf->port_vlan_info || vsi->num_vlan)
+-				promisc_m = ICE_UCAST_VLAN_PROMISC_BITS;
+-			else
+-				promisc_m = ICE_UCAST_PROMISC_BITS;
+-		} else if (allmulti) {
+-			if (vf->port_vlan_info || vsi->num_vlan)
+-				promisc_m = ICE_MCAST_VLAN_PROMISC_BITS;
+-			else
+-				promisc_m = ICE_MCAST_PROMISC_BITS;
++		u8 mcast_m, ucast_m;
++
++		if (vf->port_vlan_info || vsi->num_vlan > 1) {
++			mcast_m = ICE_MCAST_VLAN_PROMISC_BITS;
++			ucast_m = ICE_UCAST_VLAN_PROMISC_BITS;
+ 		} else {
+-			if (vf->port_vlan_info || vsi->num_vlan)
+-				promisc_m = ICE_UCAST_VLAN_PROMISC_BITS;
+-			else
+-				promisc_m = ICE_UCAST_PROMISC_BITS;
++			mcast_m = ICE_MCAST_PROMISC_BITS;
++			ucast_m = ICE_UCAST_PROMISC_BITS;
+ 		}
+ 
+-		/* Configure multicast/unicast with or without VLAN promiscuous
+-		 * mode
+-		 */
+-		status = ice_vf_set_vsi_promisc(vf, vsi, promisc_m, rm_promisc);
+-		if (status) {
+-			dev_err(dev, "%sable Tx/Rx filter promiscuous mode on VF-%d failed, error: %s\n",
+-				rm_promisc ? "dis" : "en", vf->vf_id,
+-				ice_stat_str(status));
+-			v_ret = ice_err_to_virt_err(status);
+-			goto error_param;
+-		} else {
+-			dev_dbg(dev, "%sable Tx/Rx filter promiscuous mode on VF-%d succeeded\n",
+-				rm_promisc ? "dis" : "en", vf->vf_id);
++		ucast_status = ice_vf_set_vsi_promisc(vf, vsi, ucast_m,
++						      !alluni);
++		if (ucast_status) {
++			dev_err(dev, "%sable Tx/Rx filter promiscuous mode on VF-%d failed\n",
++				alluni ? "en" : "dis", vf->vf_id);
++			v_ret = ice_err_to_virt_err(ucast_status);
++		}
++
++		mcast_status = ice_vf_set_vsi_promisc(vf, vsi, mcast_m,
++						      !allmulti);
++		if (mcast_status) {
++			dev_err(dev, "%sable Tx/Rx filter promiscuous mode on VF-%d failed\n",
++				allmulti ? "en" : "dis", vf->vf_id);
++			v_ret = ice_err_to_virt_err(mcast_status);
+ 		}
+ 	}
+ 
+-	if (allmulti &&
+-	    !test_and_set_bit(ICE_VF_STATE_MC_PROMISC, vf->vf_states))
+-		dev_info(dev, "VF %u successfully set multicast promiscuous mode\n", vf->vf_id);
+-	else if (!allmulti && test_and_clear_bit(ICE_VF_STATE_MC_PROMISC, vf->vf_states))
+-		dev_info(dev, "VF %u successfully unset multicast promiscuous mode\n", vf->vf_id);
++	if (!mcast_status) {
++		if (allmulti &&
++		    !test_and_set_bit(ICE_VF_STATE_MC_PROMISC, vf->vf_states))
++			dev_info(dev, "VF %u successfully set multicast promiscuous mode\n",
++				 vf->vf_id);
++		else if (!allmulti && test_and_clear_bit(ICE_VF_STATE_MC_PROMISC, vf->vf_states))
++			dev_info(dev, "VF %u successfully unset multicast promiscuous mode\n",
++				 vf->vf_id);
++	}
+ 
+-	if (alluni && !test_and_set_bit(ICE_VF_STATE_UC_PROMISC, vf->vf_states))
+-		dev_info(dev, "VF %u successfully set unicast promiscuous mode\n", vf->vf_id);
+-	else if (!alluni && test_and_clear_bit(ICE_VF_STATE_UC_PROMISC, vf->vf_states))
+-		dev_info(dev, "VF %u successfully unset unicast promiscuous mode\n", vf->vf_id);
++	if (!ucast_status) {
++		if (alluni && !test_and_set_bit(ICE_VF_STATE_UC_PROMISC, vf->vf_states))
++			dev_info(dev, "VF %u successfully set unicast promiscuous mode\n",
++				 vf->vf_id);
++		else if (!alluni && test_and_clear_bit(ICE_VF_STATE_UC_PROMISC, vf->vf_states))
++			dev_info(dev, "VF %u successfully unset unicast promiscuous mode\n",
++				 vf->vf_id);
++	}
+ 
+ error_param:
+ 	return ice_vc_send_msg_to_vf(vf, VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE,
+diff --git a/drivers/net/ethernet/marvell/mvmdio.c b/drivers/net/ethernet/marvell/mvmdio.c
+index 62a97c46fba05..ef878973b8597 100644
+--- a/drivers/net/ethernet/marvell/mvmdio.c
++++ b/drivers/net/ethernet/marvell/mvmdio.c
+@@ -429,12 +429,14 @@ static const struct of_device_id orion_mdio_match[] = {
+ };
+ MODULE_DEVICE_TABLE(of, orion_mdio_match);
+ 
++#ifdef CONFIG_ACPI
+ static const struct acpi_device_id orion_mdio_acpi_match[] = {
+ 	{ "MRVL0100", BUS_TYPE_SMI },
+ 	{ "MRVL0101", BUS_TYPE_XSMI },
+ 	{ },
+ };
+ MODULE_DEVICE_TABLE(acpi, orion_mdio_acpi_match);
++#endif
+ 
+ static struct platform_driver orion_mdio_driver = {
+ 	.probe = orion_mdio_probe,
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+index db5dfff585c99..c698e4b5381d7 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+@@ -334,6 +334,8 @@ static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
+ 	case MLX5_CMD_OP_PAGE_FAULT_RESUME:
+ 	case MLX5_CMD_OP_QUERY_ESW_FUNCTIONS:
+ 	case MLX5_CMD_OP_DEALLOC_SF:
++	case MLX5_CMD_OP_DESTROY_UCTX:
++	case MLX5_CMD_OP_DESTROY_UMEM:
+ 		return MLX5_CMD_STAT_OK;
+ 
+ 	case MLX5_CMD_OP_QUERY_HCA_CAP:
+@@ -459,9 +461,7 @@ static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
+ 	case MLX5_CMD_OP_MODIFY_GENERAL_OBJECT:
+ 	case MLX5_CMD_OP_QUERY_GENERAL_OBJECT:
+ 	case MLX5_CMD_OP_CREATE_UCTX:
+-	case MLX5_CMD_OP_DESTROY_UCTX:
+ 	case MLX5_CMD_OP_CREATE_UMEM:
+-	case MLX5_CMD_OP_DESTROY_UMEM:
+ 	case MLX5_CMD_OP_ALLOC_MEMIC:
+ 	case MLX5_CMD_OP_MODIFY_XRQ:
+ 	case MLX5_CMD_OP_RELEASE_XRQ_ERROR:
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cq.c b/drivers/net/ethernet/mellanox/mlx5/core/cq.c
+index 02e77ffe5c3e4..5371ad0a12eb5 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/cq.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/cq.c
+@@ -164,13 +164,14 @@ int mlx5_core_destroy_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq)
+ 	MLX5_SET(destroy_cq_in, in, cqn, cq->cqn);
+ 	MLX5_SET(destroy_cq_in, in, uid, cq->uid);
+ 	err = mlx5_cmd_exec_in(dev, destroy_cq, in);
++	if (err)
++		return err;
+ 
+ 	synchronize_irq(cq->irqn);
+-
+ 	mlx5_cq_put(cq);
+ 	wait_for_completion(&cq->free);
+ 
+-	return err;
++	return 0;
+ }
+ EXPORT_SYMBOL(mlx5_core_destroy_cq);
+ 
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
+index 07c8d9811bc81..10d195042ab55 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
+@@ -507,6 +507,8 @@ void mlx5_debug_cq_remove(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq)
+ 	if (!mlx5_debugfs_root)
+ 		return;
+ 
+-	if (cq->dbg)
++	if (cq->dbg) {
+ 		rem_res_tree(cq->dbg);
++		cq->dbg = NULL;
++	}
+ }
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c
+index 6c949abcd2e14..bc65151321ec2 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c
+@@ -1356,9 +1356,13 @@ mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv,
+ int
+ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
+ 			struct mlx5_flow_attr *attr,
++			struct mlx5e_tc_mod_hdr_acts *mod_acts,
+ 			const struct flow_action_entry *act,
+ 			struct netlink_ext_ack *extack)
+ {
++	bool clear_action = act->ct.action & TCA_CT_ACT_CLEAR;
++	int err;
++
+ 	if (!priv) {
+ 		NL_SET_ERR_MSG_MOD(extack,
+ 				   "offload of ct action isn't available");
+@@ -1369,6 +1373,17 @@ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
+ 	attr->ct_attr.ct_action = act->ct.action;
+ 	attr->ct_attr.nf_ft = act->ct.flow_table;
+ 
++	if (!clear_action)
++		goto out;
++
++	err = mlx5_tc_ct_entry_set_registers(priv, mod_acts, 0, 0, 0, 0);
++	if (err) {
++		NL_SET_ERR_MSG_MOD(extack, "Failed to set registers for ct clear");
++		return err;
++	}
++	attr->action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
++
++out:
+ 	return 0;
+ }
+ 
+@@ -1898,23 +1913,16 @@ __mlx5_tc_ct_flow_offload_clear(struct mlx5_tc_ct_priv *ct_priv,
+ 
+ 	memcpy(pre_ct_attr, attr, attr_sz);
+ 
+-	err = mlx5_tc_ct_entry_set_registers(ct_priv, mod_acts, 0, 0, 0, 0);
+-	if (err) {
+-		ct_dbg("Failed to set register for ct clear");
+-		goto err_set_registers;
+-	}
+-
+ 	mod_hdr = mlx5_modify_header_alloc(priv->mdev, ct_priv->ns_type,
+ 					   mod_acts->num_actions,
+ 					   mod_acts->actions);
+ 	if (IS_ERR(mod_hdr)) {
+ 		err = PTR_ERR(mod_hdr);
+ 		ct_dbg("Failed to add create ct clear mod hdr");
+-		goto err_set_registers;
++		goto err_mod_hdr;
+ 	}
+ 
+ 	pre_ct_attr->modify_hdr = mod_hdr;
+-	pre_ct_attr->action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
+ 
+ 	rule = mlx5_tc_rule_insert(priv, orig_spec, pre_ct_attr);
+ 	if (IS_ERR(rule)) {
+@@ -1930,7 +1938,7 @@ __mlx5_tc_ct_flow_offload_clear(struct mlx5_tc_ct_priv *ct_priv,
+ 
+ err_insert:
+ 	mlx5_modify_header_dealloc(priv->mdev, mod_hdr);
+-err_set_registers:
++err_mod_hdr:
+ 	netdev_warn(priv->netdev,
+ 		    "Failed to offload ct clear flow, err %d\n", err);
+ 	kfree(pre_ct_attr);
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.h b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.h
+index 363329f4aac61..99662af1e41a7 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.h
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.h
+@@ -110,6 +110,7 @@ int mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec);
+ int
+ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
+ 			struct mlx5_flow_attr *attr,
++			struct mlx5e_tc_mod_hdr_acts *mod_acts,
+ 			const struct flow_action_entry *act,
+ 			struct netlink_ext_ack *extack);
+ 
+@@ -172,6 +173,7 @@ mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec)
+ static inline int
+ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
+ 			struct mlx5_flow_attr *attr,
++			struct mlx5e_tc_mod_hdr_acts *mod_acts,
+ 			const struct flow_action_entry *act,
+ 			struct netlink_ext_ack *extack)
+ {
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_priv.h b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_priv.h
+index d1599b7b944bf..c340bf90354a0 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_priv.h
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_priv.h
+@@ -102,6 +102,7 @@ struct mlx5e_tc_flow {
+ 	refcount_t refcnt;
+ 	struct rcu_head rcu_head;
+ 	struct completion init_done;
++	struct completion del_hw_done;
+ 	int tunnel_id; /* the mapped tunnel id of this flow */
+ 	struct mlx5_flow_attr *attr;
+ };
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c
+index 1c44c6c345f5d..ec0163d75dd25 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c
+@@ -221,8 +221,14 @@ static void mlx5e_take_tmp_flow(struct mlx5e_tc_flow *flow,
+ 				struct list_head *flow_list,
+ 				int index)
+ {
+-	if (IS_ERR(mlx5e_flow_get(flow)))
++	if (IS_ERR(mlx5e_flow_get(flow))) {
++		/* Flow is being deleted concurrently. Wait for it to be
++		 * unoffloaded from hardware, otherwise deleting encap will
++		 * fail.
++		 */
++		wait_for_completion(&flow->del_hw_done);
+ 		return;
++	}
+ 	wait_for_completion(&flow->init_done);
+ 
+ 	flow->tmp_entry_index = index;
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
+index 62abce008c7b8..a2a9f68579dd8 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c
+@@ -55,6 +55,7 @@ struct mlx5e_ktls_offload_context_rx {
+ 	DECLARE_BITMAP(flags, MLX5E_NUM_PRIV_RX_FLAGS);
+ 
+ 	/* resync */
++	spinlock_t lock; /* protects resync fields */
+ 	struct mlx5e_ktls_rx_resync_ctx resync;
+ 	struct list_head list;
+ };
+@@ -386,14 +387,18 @@ static void resync_handle_seq_match(struct mlx5e_ktls_offload_context_rx *priv_r
+ 	struct mlx5e_icosq *sq;
+ 	bool trigger_poll;
+ 
+-	memcpy(info->rec_seq, &priv_rx->resync.sw_rcd_sn_be, sizeof(info->rec_seq));
+-
+ 	sq = &c->async_icosq;
+ 	ktls_resync = sq->ktls_resync;
++	trigger_poll = false;
+ 
+ 	spin_lock_bh(&ktls_resync->lock);
+-	list_add_tail(&priv_rx->list, &ktls_resync->list);
+-	trigger_poll = !test_and_set_bit(MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC, &sq->state);
++	spin_lock_bh(&priv_rx->lock);
++	memcpy(info->rec_seq, &priv_rx->resync.sw_rcd_sn_be, sizeof(info->rec_seq));
++	if (list_empty(&priv_rx->list)) {
++		list_add_tail(&priv_rx->list, &ktls_resync->list);
++		trigger_poll = !test_and_set_bit(MLX5E_SQ_STATE_PENDING_TLS_RX_RESYNC, &sq->state);
++	}
++	spin_unlock_bh(&priv_rx->lock);
+ 	spin_unlock_bh(&ktls_resync->lock);
+ 
+ 	if (!trigger_poll)
+@@ -617,6 +622,8 @@ int mlx5e_ktls_add_rx(struct net_device *netdev, struct sock *sk,
+ 	if (err)
+ 		goto err_create_key;
+ 
++	INIT_LIST_HEAD(&priv_rx->list);
++	spin_lock_init(&priv_rx->lock);
+ 	priv_rx->crypto_info  =
+ 		*(struct tls12_crypto_info_aes_gcm_128 *)crypto_info;
+ 
+@@ -730,10 +737,14 @@ bool mlx5e_ktls_rx_handle_resync_list(struct mlx5e_channel *c, int budget)
+ 		priv_rx = list_first_entry(&local_list,
+ 					   struct mlx5e_ktls_offload_context_rx,
+ 					   list);
++		spin_lock(&priv_rx->lock);
+ 		cseg = post_static_params(sq, priv_rx);
+-		if (IS_ERR(cseg))
++		if (IS_ERR(cseg)) {
++			spin_unlock(&priv_rx->lock);
+ 			break;
+-		list_del(&priv_rx->list);
++		}
++		list_del_init(&priv_rx->list);
++		spin_unlock(&priv_rx->lock);
+ 		db_cseg = cseg;
+ 	}
+ 	if (db_cseg)
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+index 129ff7e0d65cc..e3b320b6d85b9 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+@@ -1544,6 +1544,7 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
+ 		else
+ 			mlx5e_tc_unoffload_fdb_rules(esw, flow, attr);
+ 	}
++	complete_all(&flow->del_hw_done);
+ 
+ 	if (mlx5_flow_has_geneve_opt(flow))
+ 		mlx5_geneve_tlv_option_del(priv->mdev->geneve);
+@@ -3457,7 +3458,9 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv,
+ 			attr->dest_chain = act->chain_index;
+ 			break;
+ 		case FLOW_ACTION_CT:
+-			err = mlx5_tc_ct_parse_action(get_ct_priv(priv), attr, act, extack);
++			err = mlx5_tc_ct_parse_action(get_ct_priv(priv), attr,
++						      &parse_attr->mod_hdr_acts,
++						      act, extack);
+ 			if (err)
+ 				return err;
+ 
+@@ -4008,7 +4011,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
+ 				NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported");
+ 				return -EOPNOTSUPP;
+ 			}
+-			err = mlx5_tc_ct_parse_action(get_ct_priv(priv), attr, act, extack);
++			err = mlx5_tc_ct_parse_action(get_ct_priv(priv), attr,
++						      &parse_attr->mod_hdr_acts,
++						      act, extack);
+ 			if (err)
+ 				return err;
+ 
+@@ -4222,6 +4227,7 @@ mlx5e_alloc_flow(struct mlx5e_priv *priv, int attr_size,
+ 	INIT_LIST_HEAD(&flow->l3_to_l2_reformat);
+ 	refcount_set(&flow->refcnt, 1);
+ 	init_completion(&flow->init_done);
++	init_completion(&flow->del_hw_done);
+ 
+ 	*__flow = flow;
+ 	*__parse_attr = parse_attr;
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+index ec136b4992045..51a8cecc4a7ce 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+@@ -1305,12 +1305,17 @@ abort:
+  */
+ int mlx5_eswitch_enable(struct mlx5_eswitch *esw, int num_vfs)
+ {
++	bool toggle_lag;
+ 	int ret;
+ 
+ 	if (!mlx5_esw_allowed(esw))
+ 		return 0;
+ 
+-	mlx5_lag_disable_change(esw->dev);
++	toggle_lag = esw->mode == MLX5_ESWITCH_NONE;
++
++	if (toggle_lag)
++		mlx5_lag_disable_change(esw->dev);
++
+ 	down_write(&esw->mode_lock);
+ 	if (esw->mode == MLX5_ESWITCH_NONE) {
+ 		ret = mlx5_eswitch_enable_locked(esw, MLX5_ESWITCH_LEGACY, num_vfs);
+@@ -1324,7 +1329,10 @@ int mlx5_eswitch_enable(struct mlx5_eswitch *esw, int num_vfs)
+ 			esw->esw_funcs.num_vfs = num_vfs;
+ 	}
+ 	up_write(&esw->mode_lock);
+-	mlx5_lag_enable_change(esw->dev);
++
++	if (toggle_lag)
++		mlx5_lag_enable_change(esw->dev);
++
+ 	return ret;
+ }
+ 
+@@ -1572,6 +1580,11 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
+ 	esw->enabled_vports = 0;
+ 	esw->mode = MLX5_ESWITCH_NONE;
+ 	esw->offloads.inline_mode = MLX5_INLINE_MODE_NONE;
++	if (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, reformat) &&
++	    MLX5_CAP_ESW_FLOWTABLE_FDB(dev, decap))
++		esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_BASIC;
++	else
++		esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE;
+ 
+ 	dev->priv.eswitch = esw;
+ 	BLOCKING_INIT_NOTIFIER_HEAD(&esw->n_head);
+@@ -1934,7 +1947,7 @@ free_out:
+ 	return err;
+ }
+ 
+-u8 mlx5_eswitch_mode(struct mlx5_core_dev *dev)
++u8 mlx5_eswitch_mode(const struct mlx5_core_dev *dev)
+ {
+ 	struct mlx5_eswitch *esw = dev->priv.eswitch;
+ 
+@@ -1948,7 +1961,7 @@ mlx5_eswitch_get_encap_mode(const struct mlx5_core_dev *dev)
+ 	struct mlx5_eswitch *esw;
+ 
+ 	esw = dev->priv.eswitch;
+-	return mlx5_esw_allowed(esw) ? esw->offloads.encap :
++	return (mlx5_eswitch_mode(dev) == MLX5_ESWITCH_OFFLOADS)  ? esw->offloads.encap :
+ 		DEVLINK_ESWITCH_ENCAP_MODE_NONE;
+ }
+ EXPORT_SYMBOL(mlx5_eswitch_get_encap_mode);
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+index 0d461e38add37..0c79e11339362 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+@@ -3141,12 +3141,6 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
+ 	u64 mapping_id;
+ 	int err;
+ 
+-	if (MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, reformat) &&
+-	    MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, decap))
+-		esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_BASIC;
+-	else
+-		esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE;
+-
+ 	mutex_init(&esw->offloads.termtbl_mutex);
+ 	mlx5_rdma_enable_roce(esw->dev);
+ 
+@@ -3244,7 +3238,6 @@ void esw_offloads_disable(struct mlx5_eswitch *esw)
+ 	esw_offloads_metadata_uninit(esw);
+ 	mlx5_rdma_disable_roce(esw->dev);
+ 	mutex_destroy(&esw->offloads.termtbl_mutex);
+-	esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE;
+ }
+ 
+ static int esw_mode_from_devlink(u16 mode, u16 *mlx5_mode)
+@@ -3588,7 +3581,7 @@ int mlx5_devlink_eswitch_encap_mode_get(struct devlink *devlink,
+ 	*encap = esw->offloads.encap;
+ unlock:
+ 	up_write(&esw->mode_lock);
+-	return 0;
++	return err;
+ }
+ 
+ static bool
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lag.c b/drivers/net/ethernet/mellanox/mlx5/core/lag.c
+index d2105c1635c34..c19d9327095b2 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/lag.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/lag.c
+@@ -565,6 +565,7 @@ static int mlx5_handle_changeupper_event(struct mlx5_lag *ldev,
+ 	bool is_bonded, is_in_lag, mode_supported;
+ 	int bond_status = 0;
+ 	int num_slaves = 0;
++	int changed = 0;
+ 	int idx;
+ 
+ 	if (!netif_is_lag_master(upper))
+@@ -601,27 +602,27 @@ static int mlx5_handle_changeupper_event(struct mlx5_lag *ldev,
+ 	 */
+ 	is_in_lag = num_slaves == MLX5_MAX_PORTS && bond_status == 0x3;
+ 
+-	if (!mlx5_lag_is_ready(ldev) && is_in_lag) {
+-		NL_SET_ERR_MSG_MOD(info->info.extack,
+-				   "Can't activate LAG offload, PF is configured with more than 64 VFs");
+-		return 0;
+-	}
+-
+ 	/* Lag mode must be activebackup or hash. */
+ 	mode_supported = tracker->tx_type == NETDEV_LAG_TX_TYPE_ACTIVEBACKUP ||
+ 			 tracker->tx_type == NETDEV_LAG_TX_TYPE_HASH;
+ 
+-	if (is_in_lag && !mode_supported)
+-		NL_SET_ERR_MSG_MOD(info->info.extack,
+-				   "Can't activate LAG offload, TX type isn't supported");
+-
+ 	is_bonded = is_in_lag && mode_supported;
+ 	if (tracker->is_bonded != is_bonded) {
+ 		tracker->is_bonded = is_bonded;
+-		return 1;
++		changed = 1;
+ 	}
+ 
+-	return 0;
++	if (!is_in_lag)
++		return changed;
++
++	if (!mlx5_lag_is_ready(ldev))
++		NL_SET_ERR_MSG_MOD(info->info.extack,
++				   "Can't activate LAG offload, PF is configured with more than 64 VFs");
++	else if (!mode_supported)
++		NL_SET_ERR_MSG_MOD(info->info.extack,
++				   "Can't activate LAG offload, TX type isn't supported");
++
++	return changed;
+ }
+ 
+ static int mlx5_handle_changelowerstate_event(struct mlx5_lag *ldev,
+@@ -664,9 +665,6 @@ static int mlx5_lag_netdev_event(struct notifier_block *this,
+ 
+ 	ldev    = container_of(this, struct mlx5_lag, nb);
+ 
+-	if (!mlx5_lag_is_ready(ldev) && event == NETDEV_CHANGELOWERSTATE)
+-		return NOTIFY_DONE;
+-
+ 	tracker = ldev->tracker;
+ 
+ 	switch (event) {
+diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+index 85208128f135c..b7c2579c963b6 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+@@ -485,8 +485,28 @@ static int socfpga_dwmac_resume(struct device *dev)
+ }
+ #endif /* CONFIG_PM_SLEEP */
+ 
+-static SIMPLE_DEV_PM_OPS(socfpga_dwmac_pm_ops, stmmac_suspend,
+-					       socfpga_dwmac_resume);
++static int __maybe_unused socfpga_dwmac_runtime_suspend(struct device *dev)
++{
++	struct net_device *ndev = dev_get_drvdata(dev);
++	struct stmmac_priv *priv = netdev_priv(ndev);
++
++	stmmac_bus_clks_config(priv, false);
++
++	return 0;
++}
++
++static int __maybe_unused socfpga_dwmac_runtime_resume(struct device *dev)
++{
++	struct net_device *ndev = dev_get_drvdata(dev);
++	struct stmmac_priv *priv = netdev_priv(ndev);
++
++	return stmmac_bus_clks_config(priv, true);
++}
++
++static const struct dev_pm_ops socfpga_dwmac_pm_ops = {
++	SET_SYSTEM_SLEEP_PM_OPS(stmmac_suspend, socfpga_dwmac_resume)
++	SET_RUNTIME_PM_OPS(socfpga_dwmac_runtime_suspend, socfpga_dwmac_runtime_resume, NULL)
++};
+ 
+ static const struct socfpga_dwmac_ops socfpga_gen5_ops = {
+ 	.set_phy_mode = socfpga_gen5_set_phy_mode,
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+index 3d67d1fa36906..0ab20e2f984b9 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+@@ -511,6 +511,14 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
+ 	return true;
+ }
+ 
++static inline u32 stmmac_cdc_adjust(struct stmmac_priv *priv)
++{
++	/* Correct the clk domain crossing(CDC) error */
++	if (priv->plat->has_gmac4 && priv->plat->clk_ptp_rate)
++		return (2 * NSEC_PER_SEC) / priv->plat->clk_ptp_rate;
++	return 0;
++}
++
+ /* stmmac_get_tx_hwtstamp - get HW TX timestamps
+  * @priv: driver private structure
+  * @p : descriptor pointer
+@@ -524,7 +532,6 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv,
+ {
+ 	struct skb_shared_hwtstamps shhwtstamp;
+ 	bool found = false;
+-	s64 adjust = 0;
+ 	u64 ns = 0;
+ 
+ 	if (!priv->hwts_tx_en)
+@@ -543,12 +550,7 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv,
+ 	}
+ 
+ 	if (found) {
+-		/* Correct the clk domain crossing(CDC) error */
+-		if (priv->plat->has_gmac4 && priv->plat->clk_ptp_rate) {
+-			adjust += -(2 * (NSEC_PER_SEC /
+-					 priv->plat->clk_ptp_rate));
+-			ns += adjust;
+-		}
++		ns -= stmmac_cdc_adjust(priv);
+ 
+ 		memset(&shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps));
+ 		shhwtstamp.hwtstamp = ns_to_ktime(ns);
+@@ -573,7 +575,6 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p,
+ {
+ 	struct skb_shared_hwtstamps *shhwtstamp = NULL;
+ 	struct dma_desc *desc = p;
+-	u64 adjust = 0;
+ 	u64 ns = 0;
+ 
+ 	if (!priv->hwts_rx_en)
+@@ -586,11 +587,7 @@ static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p,
+ 	if (stmmac_get_rx_timestamp_status(priv, p, np, priv->adv_ts)) {
+ 		stmmac_get_timestamp(priv, desc, priv->adv_ts, &ns);
+ 
+-		/* Correct the clk domain crossing(CDC) error */
+-		if (priv->plat->has_gmac4 && priv->plat->clk_ptp_rate) {
+-			adjust += 2 * (NSEC_PER_SEC / priv->plat->clk_ptp_rate);
+-			ns -= adjust;
+-		}
++		ns -= stmmac_cdc_adjust(priv);
+ 
+ 		netdev_dbg(priv->dev, "get valid RX hw timestamp %llu\n", ns);
+ 		shhwtstamp = skb_hwtstamps(skb);
+diff --git a/drivers/net/ipa/ipa_endpoint.c b/drivers/net/ipa/ipa_endpoint.c
+index 5528d97110d56..ef790fd0ab56a 100644
+--- a/drivers/net/ipa/ipa_endpoint.c
++++ b/drivers/net/ipa/ipa_endpoint.c
+@@ -853,6 +853,7 @@ static void ipa_endpoint_init_hol_block_timer(struct ipa_endpoint *endpoint,
+ 	u32 offset;
+ 	u32 val;
+ 
++	/* This should only be changed when HOL_BLOCK_EN is disabled */
+ 	offset = IPA_REG_ENDP_INIT_HOL_BLOCK_TIMER_N_OFFSET(endpoint_id);
+ 	val = hol_block_timer_val(ipa, microseconds);
+ 	iowrite32(val, ipa->reg_virt + offset);
+@@ -868,6 +869,9 @@ ipa_endpoint_init_hol_block_enable(struct ipa_endpoint *endpoint, bool enable)
+ 	val = enable ? HOL_BLOCK_EN_FMASK : 0;
+ 	offset = IPA_REG_ENDP_INIT_HOL_BLOCK_EN_N_OFFSET(endpoint_id);
+ 	iowrite32(val, endpoint->ipa->reg_virt + offset);
++	/* When enabling, the register must be written twice for IPA v4.5+ */
++	if (enable && endpoint->ipa->version >= IPA_VERSION_4_5)
++		iowrite32(val, endpoint->ipa->reg_virt + offset);
+ }
+ 
+ void ipa_endpoint_modem_hol_block_clear_all(struct ipa *ipa)
+@@ -880,6 +884,7 @@ void ipa_endpoint_modem_hol_block_clear_all(struct ipa *ipa)
+ 		if (endpoint->toward_ipa || endpoint->ee_id != GSI_EE_MODEM)
+ 			continue;
+ 
++		ipa_endpoint_init_hol_block_enable(endpoint, false);
+ 		ipa_endpoint_init_hol_block_timer(endpoint, 0);
+ 		ipa_endpoint_init_hol_block_enable(endpoint, true);
+ 	}
+diff --git a/drivers/net/ipa/ipa_resource.c b/drivers/net/ipa/ipa_resource.c
+index e3da95d694099..06cec71993823 100644
+--- a/drivers/net/ipa/ipa_resource.c
++++ b/drivers/net/ipa/ipa_resource.c
+@@ -52,7 +52,7 @@ static bool ipa_resource_limits_valid(struct ipa *ipa,
+ 				return false;
+ 	}
+ 
+-	group_count = data->rsrc_group_src_count;
++	group_count = data->rsrc_group_dst_count;
+ 	if (!group_count || group_count > IPA_RESOURCE_GROUP_MAX)
+ 		return false;
+ 
+diff --git a/drivers/net/tun.c b/drivers/net/tun.c
+index fecc9a1d293ae..1572878c34031 100644
+--- a/drivers/net/tun.c
++++ b/drivers/net/tun.c
+@@ -1010,6 +1010,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
+ {
+ 	struct tun_struct *tun = netdev_priv(dev);
+ 	int txq = skb->queue_mapping;
++	struct netdev_queue *queue;
+ 	struct tun_file *tfile;
+ 	int len = skb->len;
+ 
+@@ -1054,6 +1055,10 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
+ 	if (ptr_ring_produce(&tfile->tx_ring, skb))
+ 		goto drop;
+ 
++	/* NETIF_F_LLTX requires to do our own update of trans_start */
++	queue = netdev_get_tx_queue(dev, txq);
++	queue->trans_start = jiffies;
++
+ 	/* Notify and wake up reader process */
+ 	if (tfile->flags & TUN_FASYNC)
+ 		kill_fasync(&tfile->fasync, SIGIO, POLL_IN);
+diff --git a/drivers/pinctrl/qcom/pinctrl-sdm845.c b/drivers/pinctrl/qcom/pinctrl-sdm845.c
+index c51793f6546f1..fdfd7b8f3a76d 100644
+--- a/drivers/pinctrl/qcom/pinctrl-sdm845.c
++++ b/drivers/pinctrl/qcom/pinctrl-sdm845.c
+@@ -1310,6 +1310,7 @@ static const struct msm_pinctrl_soc_data sdm845_pinctrl = {
+ 	.ngpios = 151,
+ 	.wakeirq_map = sdm845_pdc_map,
+ 	.nwakeirq_map = ARRAY_SIZE(sdm845_pdc_map),
++	.wakeirq_dual_edge_errata = true,
+ };
+ 
+ static const struct msm_pinctrl_soc_data sdm845_acpi_pinctrl = {
+diff --git a/drivers/pinctrl/qcom/pinctrl-sm8350.c b/drivers/pinctrl/qcom/pinctrl-sm8350.c
+index 4d8f8636c2b39..1c042d39380c6 100644
+--- a/drivers/pinctrl/qcom/pinctrl-sm8350.c
++++ b/drivers/pinctrl/qcom/pinctrl-sm8350.c
+@@ -1597,10 +1597,10 @@ static const struct msm_pingroup sm8350_groups[] = {
+ 	[200] = PINGROUP(200, qdss_gpio, _, _, _, _, _, _, _, _),
+ 	[201] = PINGROUP(201, _, _, _, _, _, _, _, _, _),
+ 	[202] = PINGROUP(202, _, _, _, _, _, _, _, _, _),
+-	[203] = UFS_RESET(ufs_reset, 0x1d8000),
+-	[204] = SDC_PINGROUP(sdc2_clk, 0x1cf000, 14, 6),
+-	[205] = SDC_PINGROUP(sdc2_cmd, 0x1cf000, 11, 3),
+-	[206] = SDC_PINGROUP(sdc2_data, 0x1cf000, 9, 0),
++	[203] = UFS_RESET(ufs_reset, 0xd8000),
++	[204] = SDC_PINGROUP(sdc2_clk, 0xcf000, 14, 6),
++	[205] = SDC_PINGROUP(sdc2_cmd, 0xcf000, 11, 3),
++	[206] = SDC_PINGROUP(sdc2_data, 0xcf000, 9, 0),
+ };
+ 
+ static const struct msm_gpio_wakeirq_map sm8350_pdc_map[] = {
+diff --git a/drivers/pinctrl/ralink/pinctrl-mt7620.c b/drivers/pinctrl/ralink/pinctrl-mt7620.c
+index 425d55a2ee19f..6853b5b8b0fe7 100644
+--- a/drivers/pinctrl/ralink/pinctrl-mt7620.c
++++ b/drivers/pinctrl/ralink/pinctrl-mt7620.c
+@@ -1,5 +1,6 @@
+ // SPDX-License-Identifier: GPL-2.0-only
+ 
++#include <asm/mach-ralink/ralink_regs.h>
+ #include <asm/mach-ralink/mt7620.h>
+ #include <linux/module.h>
+ #include <linux/platform_device.h>
+diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c
+index cc53f725c0419..ef24f53753c6e 100644
+--- a/drivers/platform/x86/hp_accel.c
++++ b/drivers/platform/x86/hp_accel.c
+@@ -331,9 +331,11 @@ static int lis3lv02d_probe(struct platform_device *device)
+ 	INIT_WORK(&hpled_led.work, delayed_set_status_worker);
+ 	ret = led_classdev_register(NULL, &hpled_led.led_classdev);
+ 	if (ret) {
++		i8042_remove_filter(hp_accel_i8042_filter);
+ 		lis3lv02d_joystick_disable(&lis3_dev);
+ 		lis3lv02d_poweroff(&lis3_dev);
+ 		flush_work(&hpled_led.work);
++		lis3lv02d_remove_fs(&lis3_dev);
+ 		return ret;
+ 	}
+ 
+diff --git a/drivers/platform/x86/think-lmi.c b/drivers/platform/x86/think-lmi.c
+index 9472aae72df29..c4d9c45350f7c 100644
+--- a/drivers/platform/x86/think-lmi.c
++++ b/drivers/platform/x86/think-lmi.c
+@@ -888,8 +888,10 @@ static int tlmi_analyze(void)
+ 			break;
+ 		if (!item)
+ 			break;
+-		if (!*item)
++		if (!*item) {
++			kfree(item);
+ 			continue;
++		}
+ 
+ 		/* It is not allowed to have '/' for file name. Convert it into '\'. */
+ 		strreplace(item, '/', '\\');
+@@ -902,6 +904,7 @@ static int tlmi_analyze(void)
+ 		setting = kzalloc(sizeof(*setting), GFP_KERNEL);
+ 		if (!setting) {
+ 			ret = -ENOMEM;
++			kfree(item);
+ 			goto fail_clear_attr;
+ 		}
+ 		setting->index = i;
+@@ -916,7 +919,6 @@ static int tlmi_analyze(void)
+ 		}
+ 		kobject_init(&setting->kobj, &tlmi_attr_setting_ktype);
+ 		tlmi_priv.setting[i] = setting;
+-		tlmi_priv.settings_count++;
+ 		kfree(item);
+ 	}
+ 
+@@ -983,7 +985,12 @@ static void tlmi_remove(struct wmi_device *wdev)
+ 
+ static int tlmi_probe(struct wmi_device *wdev, const void *context)
+ {
+-	tlmi_analyze();
++	int ret;
++
++	ret = tlmi_analyze();
++	if (ret)
++		return ret;
++
+ 	return tlmi_sysfs_init();
+ }
+ 
+diff --git a/drivers/platform/x86/think-lmi.h b/drivers/platform/x86/think-lmi.h
+index f8e26823075fd..2ce5086a5af27 100644
+--- a/drivers/platform/x86/think-lmi.h
++++ b/drivers/platform/x86/think-lmi.h
+@@ -55,7 +55,6 @@ struct tlmi_attr_setting {
+ struct think_lmi {
+ 	struct wmi_device *wmi_device;
+ 
+-	int settings_count;
+ 	bool can_set_bios_settings;
+ 	bool can_get_bios_selections;
+ 	bool can_set_bios_password;
+diff --git a/drivers/ptp/ptp_ocp.c b/drivers/ptp/ptp_ocp.c
+index caf9b37c5eb1e..e238ae8e94709 100644
+--- a/drivers/ptp/ptp_ocp.c
++++ b/drivers/ptp/ptp_ocp.c
+@@ -1049,10 +1049,11 @@ ptp_ocp_register_ext(struct ptp_ocp *bp, struct ocp_resource *r)
+ 	if (!ext)
+ 		return -ENOMEM;
+ 
+-	err = -EINVAL;
+ 	ext->mem = ptp_ocp_get_mem(bp, r);
+-	if (!ext->mem)
++	if (IS_ERR(ext->mem)) {
++		err = PTR_ERR(ext->mem);
+ 		goto out;
++	}
+ 
+ 	ext->bp = bp;
+ 	ext->info = r->extra;
+@@ -1122,8 +1123,8 @@ ptp_ocp_register_mem(struct ptp_ocp *bp, struct ocp_resource *r)
+ 	void __iomem *mem;
+ 
+ 	mem = ptp_ocp_get_mem(bp, r);
+-	if (!mem)
+-		return -EINVAL;
++	if (IS_ERR(mem))
++		return PTR_ERR(mem);
+ 
+ 	bp_assign_entry(bp, r, mem);
+ 
+diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
+index ffb3919675734..97be0765cb9bd 100644
+--- a/drivers/scsi/advansys.c
++++ b/drivers/scsi/advansys.c
+@@ -3308,8 +3308,8 @@ static void asc_prt_adv_board_info(struct seq_file *m, struct Scsi_Host *shost)
+ 		   shost->host_no);
+ 
+ 	seq_printf(m,
+-		   " iop_base 0x%lx, cable_detect: %X, err_code %u\n",
+-		   (unsigned long)v->iop_base,
++		   " iop_base 0x%p, cable_detect: %X, err_code %u\n",
++		   v->iop_base,
+ 		   AdvReadWordRegister(iop_base,IOPW_SCSI_CFG1) & CABLE_DETECT,
+ 		   v->err_code);
+ 
+diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h
+index c512f41991429..c9770b1d2366a 100644
+--- a/drivers/scsi/lpfc/lpfc_crtn.h
++++ b/drivers/scsi/lpfc/lpfc_crtn.h
+@@ -119,6 +119,8 @@ int lpfc_check_sli_ndlp(struct lpfc_hba *, struct lpfc_sli_ring *,
+ struct lpfc_nodelist *lpfc_nlp_init(struct lpfc_vport *vport, uint32_t did);
+ struct lpfc_nodelist *lpfc_nlp_get(struct lpfc_nodelist *);
+ int  lpfc_nlp_put(struct lpfc_nodelist *);
++void lpfc_check_nlp_post_devloss(struct lpfc_vport *vport,
++				 struct lpfc_nodelist *ndlp);
+ void lpfc_ignore_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
+ 			  struct lpfc_iocbq *rspiocb);
+ int  lpfc_nlp_not_used(struct lpfc_nodelist *ndlp);
+diff --git a/drivers/scsi/lpfc/lpfc_disc.h b/drivers/scsi/lpfc/lpfc_disc.h
+index 871b665bd72e3..37a4b79010bfc 100644
+--- a/drivers/scsi/lpfc/lpfc_disc.h
++++ b/drivers/scsi/lpfc/lpfc_disc.h
+@@ -85,6 +85,13 @@ enum lpfc_fc4_xpt_flags {
+ 	NLP_XPT_HAS_HH		= 0x10
+ };
+ 
++enum lpfc_nlp_save_flags {
++	/* devloss occurred during recovery */
++	NLP_IN_RECOV_POST_DEV_LOSS	= 0x1,
++	/* wait for outstanding LOGO to cmpl */
++	NLP_WAIT_FOR_LOGO		= 0x2,
++};
++
+ struct lpfc_nodelist {
+ 	struct list_head nlp_listp;
+ 	struct serv_parm fc_sparam;		/* buffer for service params */
+@@ -144,8 +151,9 @@ struct lpfc_nodelist {
+ 	unsigned long *active_rrqs_xri_bitmap;
+ 	struct lpfc_scsicmd_bkt *lat_data;	/* Latency data */
+ 	uint32_t fc4_prli_sent;
+-	u32 upcall_flags;
+-#define	NLP_WAIT_FOR_LOGO 0x2
++
++	/* flags to keep ndlp alive until special conditions are met */
++	enum lpfc_nlp_save_flags save_flags;
+ 
+ 	enum lpfc_fc4_xpt_flags fc4_xpt_flags;
+ 
+diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
+index 666b0a1b558ac..1a406df251cbf 100644
+--- a/drivers/scsi/lpfc/lpfc_els.c
++++ b/drivers/scsi/lpfc/lpfc_els.c
+@@ -2898,9 +2898,9 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
+ 	irsp = &(rspiocb->iocb);
+ 	spin_lock_irq(&ndlp->lock);
+ 	ndlp->nlp_flag &= ~NLP_LOGO_SND;
+-	if (ndlp->upcall_flags & NLP_WAIT_FOR_LOGO) {
++	if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) {
+ 		wake_up_waiter = 1;
+-		ndlp->upcall_flags &= ~NLP_WAIT_FOR_LOGO;
++		ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO;
+ 	}
+ 	spin_unlock_irq(&ndlp->lock);
+ 
+@@ -10713,6 +10713,9 @@ lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
+ 				 irsp->ulpStatus, irsp->un.ulpWord[4]);
+ 		goto fdisc_failed;
+ 	}
++
++	lpfc_check_nlp_post_devloss(vport, ndlp);
++
+ 	spin_lock_irq(shost->host_lock);
+ 	vport->fc_flag &= ~FC_VPORT_CVL_RCVD;
+ 	vport->fc_flag &= ~FC_VPORT_LOGO_RCVD;
+diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
+index 6f2e07c30f98f..9ccb904e35fcf 100644
+--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
++++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
+@@ -209,7 +209,12 @@ lpfc_dev_loss_tmo_callbk(struct fc_rport *rport)
+ 
+ 	spin_lock_irqsave(&ndlp->lock, iflags);
+ 	ndlp->nlp_flag |= NLP_IN_DEV_LOSS;
+-	ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
++
++	/* If there is a PLOGI in progress, and we are in a
++	 * NLP_NPR_2B_DISC state, don't turn off the flag.
++	 */
++	if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE)
++		ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
+ 
+ 	/*
+ 	 * The backend does not expect any more calls associated with this
+@@ -340,6 +345,37 @@ static void lpfc_check_inactive_vmid(struct lpfc_hba *phba)
+ 	lpfc_destroy_vport_work_array(phba, vports);
+ }
+ 
++/**
++ * lpfc_check_nlp_post_devloss - Check to restore ndlp refcnt after devloss
++ * @vport: Pointer to vport object.
++ * @ndlp: Pointer to remote node object.
++ *
++ * If NLP_IN_RECOV_POST_DEV_LOSS flag was set due to outstanding recovery of
++ * node during dev_loss_tmo processing, then this function restores the nlp_put
++ * kref decrement from lpfc_dev_loss_tmo_handler.
++ **/
++void
++lpfc_check_nlp_post_devloss(struct lpfc_vport *vport,
++			    struct lpfc_nodelist *ndlp)
++{
++	unsigned long iflags;
++
++	spin_lock_irqsave(&ndlp->lock, iflags);
++	if (ndlp->save_flags & NLP_IN_RECOV_POST_DEV_LOSS) {
++		ndlp->save_flags &= ~NLP_IN_RECOV_POST_DEV_LOSS;
++		spin_unlock_irqrestore(&ndlp->lock, iflags);
++		lpfc_nlp_get(ndlp);
++		lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY | LOG_NODE,
++				 "8438 Devloss timeout reversed on DID x%x "
++				 "refcnt %d ndlp %p flag x%x "
++				 "port_state = x%x\n",
++				 ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp,
++				 ndlp->nlp_flag, vport->port_state);
++		spin_lock_irqsave(&ndlp->lock, iflags);
++	}
++	spin_unlock_irqrestore(&ndlp->lock, iflags);
++}
++
+ /**
+  * lpfc_dev_loss_tmo_handler - Remote node devloss timeout handler
+  * @ndlp: Pointer to remote node object.
+@@ -358,6 +394,8 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
+ 	uint8_t *name;
+ 	int warn_on = 0;
+ 	int fcf_inuse = 0;
++	bool recovering = false;
++	struct fc_vport *fc_vport = NULL;
+ 	unsigned long iflags;
+ 
+ 	vport = ndlp->vport;
+@@ -394,6 +432,64 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
+ 
+ 	/* Fabric nodes are done. */
+ 	if (ndlp->nlp_type & NLP_FABRIC) {
++		spin_lock_irqsave(&ndlp->lock, iflags);
++		/* In massive vport configuration settings, it's possible
++		 * dev_loss_tmo fired during node recovery.  So, check if
++		 * fabric nodes are in discovery states outstanding.
++		 */
++		switch (ndlp->nlp_DID) {
++		case Fabric_DID:
++			fc_vport = vport->fc_vport;
++			if (fc_vport &&
++			    fc_vport->vport_state == FC_VPORT_INITIALIZING)
++				recovering = true;
++			break;
++		case Fabric_Cntl_DID:
++			if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND)
++				recovering = true;
++			break;
++		case FDMI_DID:
++			fallthrough;
++		case NameServer_DID:
++			if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE &&
++			    ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE)
++				recovering = true;
++			break;
++		}
++		spin_unlock_irqrestore(&ndlp->lock, iflags);
++
++		/* Mark an NLP_IN_RECOV_POST_DEV_LOSS flag to know if reversing
++		 * the following lpfc_nlp_put is necessary after fabric node is
++		 * recovered.
++		 */
++		if (recovering) {
++			lpfc_printf_vlog(vport, KERN_INFO,
++					 LOG_DISCOVERY | LOG_NODE,
++					 "8436 Devloss timeout marked on "
++					 "DID x%x refcnt %d ndlp %p "
++					 "flag x%x port_state = x%x\n",
++					 ndlp->nlp_DID, kref_read(&ndlp->kref),
++					 ndlp, ndlp->nlp_flag,
++					 vport->port_state);
++			spin_lock_irqsave(&ndlp->lock, iflags);
++			ndlp->save_flags |= NLP_IN_RECOV_POST_DEV_LOSS;
++			spin_unlock_irqrestore(&ndlp->lock, iflags);
++		} else if (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) {
++			/* Fabric node fully recovered before this dev_loss_tmo
++			 * queue work is processed.  Thus, ignore the
++			 * dev_loss_tmo event.
++			 */
++			lpfc_printf_vlog(vport, KERN_INFO,
++					 LOG_DISCOVERY | LOG_NODE,
++					 "8437 Devloss timeout ignored on "
++					 "DID x%x refcnt %d ndlp %p "
++					 "flag x%x port_state = x%x\n",
++					 ndlp->nlp_DID, kref_read(&ndlp->kref),
++					 ndlp, ndlp->nlp_flag,
++					 vport->port_state);
++			return fcf_inuse;
++		}
++
+ 		lpfc_nlp_put(ndlp);
+ 		return fcf_inuse;
+ 	}
+@@ -423,6 +519,14 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
+ 				 ndlp->nlp_state, ndlp->nlp_rpi);
+ 	}
+ 
++	/* If we are devloss, but we are in the process of rediscovering the
++	 * ndlp, don't issue a NLP_EVT_DEVICE_RM event.
++	 */
++	if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE &&
++	    ndlp->nlp_state <= NLP_STE_PRLI_ISSUE) {
++		return fcf_inuse;
++	}
++
+ 	if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD))
+ 		lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RM);
+ 
+@@ -4351,6 +4455,8 @@ lpfc_mbx_cmpl_fc_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
+ 		goto out;
+ 	}
+ 
++	lpfc_check_nlp_post_devloss(vport, ndlp);
++
+ 	if (phba->sli_rev < LPFC_SLI_REV4)
+ 		ndlp->nlp_rpi = mb->un.varWords[0];
+ 
+@@ -4360,6 +4466,7 @@ lpfc_mbx_cmpl_fc_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
+ 			 ndlp->nlp_state);
+ 
+ 	ndlp->nlp_flag |= NLP_RPI_REGISTERED;
++	ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
+ 	ndlp->nlp_type |= NLP_FABRIC;
+ 	lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
+ 
+@@ -4527,9 +4634,10 @@ lpfc_nlp_counters(struct lpfc_vport *vport, int state, int count)
+ void
+ lpfc_nlp_reg_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
+ {
+-
+ 	unsigned long iflags;
+ 
++	lpfc_check_nlp_post_devloss(vport, ndlp);
++
+ 	spin_lock_irqsave(&ndlp->lock, iflags);
+ 	if (ndlp->fc4_xpt_flags & NLP_XPT_REGD) {
+ 		/* Already registered with backend, trigger rescan */
+diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
+index 195169badb372..0fee8d590b0c4 100644
+--- a/drivers/scsi/lpfc/lpfc_init.c
++++ b/drivers/scsi/lpfc/lpfc_init.c
+@@ -3694,12 +3694,16 @@ lpfc_offline_prep(struct lpfc_hba *phba, int mbx_action)
+ 					lpfc_disc_state_machine(vports[i], ndlp,
+ 						NULL, NLP_EVT_DEVICE_RECOVERY);
+ 
+-					/* Don't remove the node unless the
++					/* Don't remove the node unless the node
+ 					 * has been unregistered with the
+-					 * transport.  If so, let dev_loss
+-					 * take care of the node.
++					 * transport, and we're not in recovery
++					 * before dev_loss_tmo triggered.
++					 * Otherwise, let dev_loss take care of
++					 * the node.
+ 					 */
+-					if (!(ndlp->fc4_xpt_flags &
++					if (!(ndlp->save_flags &
++					      NLP_IN_RECOV_POST_DEV_LOSS) &&
++					    !(ndlp->fc4_xpt_flags &
+ 					      (NVME_XPT_REGD | SCSI_XPT_REGD)))
+ 						lpfc_disc_state_machine
+ 							(vports[i], ndlp,
+diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
+index 364c8a9b99095..3d9175f1b6787 100644
+--- a/drivers/scsi/lpfc/lpfc_scsi.c
++++ b/drivers/scsi/lpfc/lpfc_scsi.c
+@@ -6455,28 +6455,28 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd)
+ 
+ 		/* Issue LOGO, if no LOGO is outstanding */
+ 		spin_lock_irqsave(&pnode->lock, flags);
+-		if (!(pnode->upcall_flags & NLP_WAIT_FOR_LOGO) &&
++		if (!(pnode->save_flags & NLP_WAIT_FOR_LOGO) &&
+ 		    !pnode->logo_waitq) {
+ 			pnode->logo_waitq = &waitq;
+ 			pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
+ 			pnode->nlp_flag |= NLP_ISSUE_LOGO;
+-			pnode->upcall_flags |= NLP_WAIT_FOR_LOGO;
++			pnode->save_flags |= NLP_WAIT_FOR_LOGO;
+ 			spin_unlock_irqrestore(&pnode->lock, flags);
+ 			lpfc_unreg_rpi(vport, pnode);
+ 			wait_event_timeout(waitq,
+-					   (!(pnode->upcall_flags &
++					   (!(pnode->save_flags &
+ 					      NLP_WAIT_FOR_LOGO)),
+ 					   msecs_to_jiffies(dev_loss_tmo *
+ 							    1000));
+ 
+-			if (pnode->upcall_flags & NLP_WAIT_FOR_LOGO) {
++			if (pnode->save_flags & NLP_WAIT_FOR_LOGO) {
+ 				lpfc_printf_vlog(vport, KERN_ERR, logit,
+ 						 "0725 SCSI layer TGTRST "
+ 						 "failed & LOGO TMO (%d, %llu) "
+ 						 "return x%x\n",
+ 						 tgt_id, lun_id, status);
+ 				spin_lock_irqsave(&pnode->lock, flags);
+-				pnode->upcall_flags &= ~NLP_WAIT_FOR_LOGO;
++				pnode->save_flags &= ~NLP_WAIT_FOR_LOGO;
+ 			} else {
+ 				spin_lock_irqsave(&pnode->lock, flags);
+ 			}
+diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
+index 2fc671c8a638c..9c1f485952ef7 100644
+--- a/drivers/scsi/lpfc/lpfc_sli.c
++++ b/drivers/scsi/lpfc/lpfc_sli.c
+@@ -12404,17 +12404,17 @@ lpfc_sli_issue_abort_iotag(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
+ 
+ 	/* ABTS WQE must go to the same WQ as the WQE to be aborted */
+ 	abtsiocbp->hba_wqidx = cmdiocb->hba_wqidx;
+-	if (cmdiocb->iocb_flag & LPFC_IO_FCP) {
+-		abtsiocbp->iocb_flag |= LPFC_IO_FCP;
+-		abtsiocbp->iocb_flag |= LPFC_USE_FCPWQIDX;
+-	}
++	if (cmdiocb->iocb_flag & LPFC_IO_FCP)
++		abtsiocbp->iocb_flag |= (LPFC_IO_FCP | LPFC_USE_FCPWQIDX);
+ 	if (cmdiocb->iocb_flag & LPFC_IO_FOF)
+ 		abtsiocbp->iocb_flag |= LPFC_IO_FOF;
+ 
+-	if (phba->link_state >= LPFC_LINK_UP)
+-		iabt->ulpCommand = CMD_ABORT_XRI_CN;
+-	else
++	if (phba->link_state < LPFC_LINK_UP ||
++	    (phba->sli_rev == LPFC_SLI_REV4 &&
++	     phba->sli4_hba.link_state.status == LPFC_FC_LA_TYPE_LINK_DOWN))
+ 		iabt->ulpCommand = CMD_CLOSE_XRI_CN;
++	else
++		iabt->ulpCommand = CMD_ABORT_XRI_CN;
+ 
+ 	if (cmpl)
+ 		abtsiocbp->iocb_cmpl = cmpl;
+@@ -21162,6 +21162,7 @@ lpfc_drain_txq(struct lpfc_hba *phba)
+ 					fail_msg,
+ 					piocbq->iotag, piocbq->sli4_xritag);
+ 			list_add_tail(&piocbq->list, &completions);
++			fail_msg = NULL;
+ 		}
+ 		spin_unlock_irqrestore(&pring->ring_lock, iflags);
+ 	}
+diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
+index 47db7e0beae6f..729d8252028e8 100644
+--- a/drivers/scsi/pm8001/pm8001_init.c
++++ b/drivers/scsi/pm8001/pm8001_init.c
+@@ -1198,6 +1198,7 @@ pm8001_init_ccb_tag(struct pm8001_hba_info *pm8001_ha, struct Scsi_Host *shost,
+ 		goto err_out;
+ 
+ 	/* Memory region for ccb_info*/
++	pm8001_ha->ccb_count = ccb_count;
+ 	pm8001_ha->ccb_info =
+ 		kcalloc(ccb_count, sizeof(struct pm8001_ccb_info), GFP_KERNEL);
+ 	if (!pm8001_ha->ccb_info) {
+@@ -1259,6 +1260,16 @@ static void pm8001_pci_remove(struct pci_dev *pdev)
+ 			tasklet_kill(&pm8001_ha->tasklet[j]);
+ #endif
+ 	scsi_host_put(pm8001_ha->shost);
++
++	for (i = 0; i < pm8001_ha->ccb_count; i++) {
++		dma_free_coherent(&pm8001_ha->pdev->dev,
++			sizeof(struct pm8001_prd) * PM8001_MAX_DMA_SG,
++			pm8001_ha->ccb_info[i].buf_prd,
++			pm8001_ha->ccb_info[i].ccb_dma_handle);
++	}
++	kfree(pm8001_ha->ccb_info);
++	kfree(pm8001_ha->devices);
++
+ 	pm8001_free(pm8001_ha);
+ 	kfree(sha->sas_phy);
+ 	kfree(sha->sas_port);
+diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
+index e18f2b60371db..f40a41f450d9b 100644
+--- a/drivers/scsi/pm8001/pm8001_sas.h
++++ b/drivers/scsi/pm8001/pm8001_sas.h
+@@ -517,6 +517,7 @@ struct pm8001_hba_info {
+ 	u32			iomb_size; /* SPC and SPCV IOMB size */
+ 	struct pm8001_device	*devices;
+ 	struct pm8001_ccb_info	*ccb_info;
++	u32			ccb_count;
+ #ifdef PM8001_USE_MSIX
+ 	int			number_of_intr;/*will be used in remove()*/
+ 	char			intr_drvname[PM8001_MAX_MSIX_VEC]
+diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
+index 7811c4952035b..a6debeea30798 100644
+--- a/drivers/scsi/qla2xxx/qla_mbx.c
++++ b/drivers/scsi/qla2xxx/qla_mbx.c
+@@ -1695,10 +1695,8 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa,
+ 		mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10;
+ 	if (IS_FWI2_CAPABLE(vha->hw))
+ 		mcp->in_mb |= MBX_19|MBX_18|MBX_17|MBX_16;
+-	if (IS_QLA27XX(vha->hw) || IS_QLA28XX(vha->hw)) {
+-		mcp->in_mb |= MBX_15;
+-		mcp->out_mb |= MBX_7|MBX_21|MBX_22|MBX_23;
+-	}
++	if (IS_QLA27XX(vha->hw) || IS_QLA28XX(vha->hw))
++		mcp->in_mb |= MBX_15|MBX_21|MBX_22|MBX_23;
+ 
+ 	mcp->tov = MBX_TOV_SECONDS;
+ 	mcp->flags = 0;
+diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
+index 66f507469a31a..ead65cdfb522e 100644
+--- a/drivers/scsi/scsi_debug.c
++++ b/drivers/scsi/scsi_debug.c
+@@ -1856,7 +1856,7 @@ static int resp_readcap16(struct scsi_cmnd *scp,
+ {
+ 	unsigned char *cmd = scp->cmnd;
+ 	unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
+-	int alloc_len;
++	u32 alloc_len;
+ 
+ 	alloc_len = get_unaligned_be32(cmd + 10);
+ 	/* following just in case virtual_gb changed */
+@@ -1885,7 +1885,7 @@ static int resp_readcap16(struct scsi_cmnd *scp,
+ 	}
+ 
+ 	return fill_from_dev_buffer(scp, arr,
+-			    min_t(int, alloc_len, SDEBUG_READCAP16_ARR_SZ));
++			    min_t(u32, alloc_len, SDEBUG_READCAP16_ARR_SZ));
+ }
+ 
+ #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
+@@ -1896,8 +1896,9 @@ static int resp_report_tgtpgs(struct scsi_cmnd *scp,
+ 	unsigned char *cmd = scp->cmnd;
+ 	unsigned char *arr;
+ 	int host_no = devip->sdbg_host->shost->host_no;
+-	int n, ret, alen, rlen;
+ 	int port_group_a, port_group_b, port_a, port_b;
++	u32 alen, n, rlen;
++	int ret;
+ 
+ 	alen = get_unaligned_be32(cmd + 6);
+ 	arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
+@@ -1959,9 +1960,9 @@ static int resp_report_tgtpgs(struct scsi_cmnd *scp,
+ 	 * - The constructed command length
+ 	 * - The maximum array size
+ 	 */
+-	rlen = min_t(int, alen, n);
++	rlen = min(alen, n);
+ 	ret = fill_from_dev_buffer(scp, arr,
+-			   min_t(int, rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
++			   min_t(u32, rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
+ 	kfree(arr);
+ 	return ret;
+ }
+diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+index 0e023547ff15a..ef4361b2d1423 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -2074,7 +2074,7 @@ EXPORT_SYMBOL_GPL(scsi_mode_select);
+ /**
+  *	scsi_mode_sense - issue a mode sense, falling back from 10 to six bytes if necessary.
+  *	@sdev:	SCSI device to be queried
+- *	@dbd:	set if mode sense will allow block descriptors to be returned
++ *	@dbd:	set to prevent mode sense from returning block descriptors
+  *	@modepage: mode page being requested
+  *	@buffer: request buffer (may not be smaller than eight bytes)
+  *	@len:	length of request buffer.
+@@ -2109,18 +2109,18 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
+ 		sshdr = &my_sshdr;
+ 
+  retry:
+-	use_10_for_ms = sdev->use_10_for_ms;
++	use_10_for_ms = sdev->use_10_for_ms || len > 255;
+ 
+ 	if (use_10_for_ms) {
+-		if (len < 8)
+-			len = 8;
++		if (len < 8 || len > 65535)
++			return -EINVAL;
+ 
+ 		cmd[0] = MODE_SENSE_10;
+-		cmd[8] = len;
++		put_unaligned_be16(len, &cmd[7]);
+ 		header_length = 8;
+ 	} else {
+ 		if (len < 4)
+-			len = 4;
++			return -EINVAL;
+ 
+ 		cmd[0] = MODE_SENSE;
+ 		cmd[4] = len;
+@@ -2144,9 +2144,15 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
+ 			if ((sshdr->sense_key == ILLEGAL_REQUEST) &&
+ 			    (sshdr->asc == 0x20) && (sshdr->ascq == 0)) {
+ 				/*
+-				 * Invalid command operation code
++				 * Invalid command operation code: retry using
++				 * MODE SENSE(6) if this was a MODE SENSE(10)
++				 * request, except if the request mode page is
++				 * too large for MODE SENSE single byte
++				 * allocation length field.
+ 				 */
+ 				if (use_10_for_ms) {
++					if (len > 255)
++						return -EIO;
+ 					sdev->use_10_for_ms = 0;
+ 					goto retry;
+ 				}
+@@ -2170,12 +2176,11 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
+ 		data->longlba = 0;
+ 		data->block_descriptor_length = 0;
+ 	} else if (use_10_for_ms) {
+-		data->length = buffer[0]*256 + buffer[1] + 2;
++		data->length = get_unaligned_be16(&buffer[0]) + 2;
+ 		data->medium_type = buffer[2];
+ 		data->device_specific = buffer[3];
+ 		data->longlba = buffer[4] & 0x01;
+-		data->block_descriptor_length = buffer[6]*256
+-			+ buffer[7];
++		data->block_descriptor_length = get_unaligned_be16(&buffer[6]);
+ 	} else {
+ 		data->length = buffer[0] + 1;
+ 		data->medium_type = buffer[1];
+diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
+index 8bb79ccc9a8b5..9527e734a999a 100644
+--- a/drivers/scsi/scsi_sysfs.c
++++ b/drivers/scsi/scsi_sysfs.c
+@@ -797,6 +797,7 @@ store_state_field(struct device *dev, struct device_attribute *attr,
+ 	int i, ret;
+ 	struct scsi_device *sdev = to_scsi_device(dev);
+ 	enum scsi_device_state state = 0;
++	bool rescan_dev = false;
+ 
+ 	for (i = 0; i < ARRAY_SIZE(sdev_states); i++) {
+ 		const int len = strlen(sdev_states[i].name);
+@@ -815,20 +816,27 @@ store_state_field(struct device *dev, struct device_attribute *attr,
+ 	}
+ 
+ 	mutex_lock(&sdev->state_mutex);
+-	ret = scsi_device_set_state(sdev, state);
+-	/*
+-	 * If the device state changes to SDEV_RUNNING, we need to
+-	 * run the queue to avoid I/O hang, and rescan the device
+-	 * to revalidate it. Running the queue first is necessary
+-	 * because another thread may be waiting inside
+-	 * blk_mq_freeze_queue_wait() and because that call may be
+-	 * waiting for pending I/O to finish.
+-	 */
+-	if (ret == 0 && state == SDEV_RUNNING) {
++	if (sdev->sdev_state == SDEV_RUNNING && state == SDEV_RUNNING) {
++		ret = count;
++	} else {
++		ret = scsi_device_set_state(sdev, state);
++		if (ret == 0 && state == SDEV_RUNNING)
++			rescan_dev = true;
++	}
++	mutex_unlock(&sdev->state_mutex);
++
++	if (rescan_dev) {
++		/*
++		 * If the device state changes to SDEV_RUNNING, we need to
++		 * run the queue to avoid I/O hang, and rescan the device
++		 * to revalidate it. Running the queue first is necessary
++		 * because another thread may be waiting inside
++		 * blk_mq_freeze_queue_wait() and because that call may be
++		 * waiting for pending I/O to finish.
++		 */
+ 		blk_mq_run_hw_queues(sdev->request_queue, true);
+ 		scsi_rescan_device(dev);
+ 	}
+-	mutex_unlock(&sdev->state_mutex);
+ 
+ 	return ret == 0 ? count : -EINVAL;
+ }
+diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
+index ecb2af3f43ca3..a5453f5e87c3e 100644
+--- a/drivers/scsi/smartpqi/smartpqi_init.c
++++ b/drivers/scsi/smartpqi/smartpqi_init.c
+@@ -234,15 +234,46 @@ static inline bool pqi_is_hba_lunid(u8 *scsi3addr)
+ 	return pqi_scsi3addr_equal(scsi3addr, RAID_CTLR_LUNID);
+ }
+ 
++#define PQI_DRIVER_SCRATCH_PQI_MODE			0x1
++#define PQI_DRIVER_SCRATCH_FW_TRIAGE_SUPPORTED		0x2
++
+ static inline enum pqi_ctrl_mode pqi_get_ctrl_mode(struct pqi_ctrl_info *ctrl_info)
+ {
+-	return sis_read_driver_scratch(ctrl_info);
++	return sis_read_driver_scratch(ctrl_info) & PQI_DRIVER_SCRATCH_PQI_MODE ? PQI_MODE : SIS_MODE;
+ }
+ 
+ static inline void pqi_save_ctrl_mode(struct pqi_ctrl_info *ctrl_info,
+ 	enum pqi_ctrl_mode mode)
+ {
+-	sis_write_driver_scratch(ctrl_info, mode);
++	u32 driver_scratch;
++
++	driver_scratch = sis_read_driver_scratch(ctrl_info);
++
++	if (mode == PQI_MODE)
++		driver_scratch |= PQI_DRIVER_SCRATCH_PQI_MODE;
++	else
++		driver_scratch &= ~PQI_DRIVER_SCRATCH_PQI_MODE;
++
++	sis_write_driver_scratch(ctrl_info, driver_scratch);
++}
++
++static inline bool pqi_is_fw_triage_supported(struct pqi_ctrl_info *ctrl_info)
++{
++	return (sis_read_driver_scratch(ctrl_info) & PQI_DRIVER_SCRATCH_FW_TRIAGE_SUPPORTED) != 0;
++}
++
++static inline void pqi_save_fw_triage_setting(struct pqi_ctrl_info *ctrl_info, bool is_supported)
++{
++	u32 driver_scratch;
++
++	driver_scratch = sis_read_driver_scratch(ctrl_info);
++
++	if (is_supported)
++		driver_scratch |= PQI_DRIVER_SCRATCH_FW_TRIAGE_SUPPORTED;
++	else
++		driver_scratch &= ~PQI_DRIVER_SCRATCH_FW_TRIAGE_SUPPORTED;
++
++	sis_write_driver_scratch(ctrl_info, driver_scratch);
+ }
+ 
+ static inline void pqi_ctrl_block_scan(struct pqi_ctrl_info *ctrl_info)
+@@ -7301,6 +7332,7 @@ static void pqi_ctrl_update_feature_flags(struct pqi_ctrl_info *ctrl_info,
+ 		ctrl_info->unique_wwid_in_report_phys_lun_supported =
+ 			firmware_feature->enabled;
+ 		break;
++		pqi_save_fw_triage_setting(ctrl_info, firmware_feature->enabled);
+ 	}
+ 
+ 	pqi_firmware_feature_status(ctrl_info, firmware_feature);
+@@ -7627,6 +7659,11 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info)
+ 	u32 product_id;
+ 
+ 	if (reset_devices) {
++		if (pqi_is_fw_triage_supported(ctrl_info)) {
++			rc = sis_wait_for_fw_triage_completion(ctrl_info);
++			if (rc)
++				return rc;
++		}
+ 		sis_soft_reset(ctrl_info);
+ 		msleep(PQI_POST_RESET_DELAY_SECS * PQI_HZ);
+ 	} else {
+diff --git a/drivers/scsi/smartpqi/smartpqi_sis.c b/drivers/scsi/smartpqi/smartpqi_sis.c
+index d63c46a8e38bb..8acd3a80f5822 100644
+--- a/drivers/scsi/smartpqi/smartpqi_sis.c
++++ b/drivers/scsi/smartpqi/smartpqi_sis.c
+@@ -51,12 +51,20 @@
+ #define SIS_BASE_STRUCT_REVISION		9
+ #define SIS_BASE_STRUCT_ALIGNMENT		16
+ 
++#define SIS_CTRL_KERNEL_FW_TRIAGE		0x3
+ #define SIS_CTRL_KERNEL_UP			0x80
+ #define SIS_CTRL_KERNEL_PANIC			0x100
+ #define SIS_CTRL_READY_TIMEOUT_SECS		180
+ #define SIS_CTRL_READY_RESUME_TIMEOUT_SECS	90
+ #define SIS_CTRL_READY_POLL_INTERVAL_MSECS	10
+ 
++enum sis_fw_triage_status {
++	FW_TRIAGE_NOT_STARTED = 0,
++	FW_TRIAGE_STARTED,
++	FW_TRIAGE_COND_INVALID,
++	FW_TRIAGE_COMPLETED
++};
++
+ #pragma pack(1)
+ 
+ /* for use with SIS_CMD_INIT_BASE_STRUCT_ADDRESS command */
+@@ -419,12 +427,55 @@ u32 sis_read_driver_scratch(struct pqi_ctrl_info *ctrl_info)
+ 	return readl(&ctrl_info->registers->sis_driver_scratch);
+ }
+ 
++static inline enum sis_fw_triage_status
++	sis_read_firmware_triage_status(struct pqi_ctrl_info *ctrl_info)
++{
++	return ((enum sis_fw_triage_status)(readl(&ctrl_info->registers->sis_firmware_status) &
++		SIS_CTRL_KERNEL_FW_TRIAGE));
++}
++
+ void sis_soft_reset(struct pqi_ctrl_info *ctrl_info)
+ {
+ 	writel(SIS_SOFT_RESET,
+ 		&ctrl_info->registers->sis_host_to_ctrl_doorbell);
+ }
+ 
++#define SIS_FW_TRIAGE_STATUS_TIMEOUT_SECS		300
++#define SIS_FW_TRIAGE_STATUS_POLL_INTERVAL_SECS		1
++
++int sis_wait_for_fw_triage_completion(struct pqi_ctrl_info *ctrl_info)
++{
++	int rc;
++	enum sis_fw_triage_status status;
++	unsigned long timeout;
++
++	timeout = (SIS_FW_TRIAGE_STATUS_TIMEOUT_SECS * PQI_HZ) + jiffies;
++	while (1) {
++		status = sis_read_firmware_triage_status(ctrl_info);
++		if (status == FW_TRIAGE_COND_INVALID) {
++			dev_err(&ctrl_info->pci_dev->dev,
++				"firmware triage condition invalid\n");
++			rc = -EINVAL;
++			break;
++		} else if (status == FW_TRIAGE_NOT_STARTED ||
++			status == FW_TRIAGE_COMPLETED) {
++			rc = 0;
++			break;
++		}
++
++		if (time_after(jiffies, timeout)) {
++			dev_err(&ctrl_info->pci_dev->dev,
++				"timed out waiting for firmware triage status\n");
++			rc = -ETIMEDOUT;
++			break;
++		}
++
++		ssleep(SIS_FW_TRIAGE_STATUS_POLL_INTERVAL_SECS);
++	}
++
++	return rc;
++}
++
+ static void __attribute__((unused)) verify_structures(void)
+ {
+ 	BUILD_BUG_ON(offsetof(struct sis_base_struct,
+diff --git a/drivers/scsi/smartpqi/smartpqi_sis.h b/drivers/scsi/smartpqi/smartpqi_sis.h
+index d29c1352a826a..c1db93054c863 100644
+--- a/drivers/scsi/smartpqi/smartpqi_sis.h
++++ b/drivers/scsi/smartpqi/smartpqi_sis.h
+@@ -28,5 +28,6 @@ void sis_write_driver_scratch(struct pqi_ctrl_info *ctrl_info, u32 value);
+ u32 sis_read_driver_scratch(struct pqi_ctrl_info *ctrl_info);
+ void sis_soft_reset(struct pqi_ctrl_info *ctrl_info);
+ u32 sis_get_product_id(struct pqi_ctrl_info *ctrl_info);
++int sis_wait_for_fw_triage_completion(struct pqi_ctrl_info *ctrl_info);
+ 
+ #endif	/* _SMARTPQI_SIS_H */
+diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
+index 20705cec83c55..55f2e4d6f10b7 100644
+--- a/drivers/scsi/ufs/ufshcd.c
++++ b/drivers/scsi/ufs/ufshcd.c
+@@ -6382,9 +6382,8 @@ static irqreturn_t ufshcd_tmc_handler(struct ufs_hba *hba)
+ 	irqreturn_t ret = IRQ_NONE;
+ 	int tag;
+ 
+-	pending = ufshcd_readl(hba, REG_UTP_TASK_REQ_DOOR_BELL);
+-
+ 	spin_lock_irqsave(hba->host->host_lock, flags);
++	pending = ufshcd_readl(hba, REG_UTP_TASK_REQ_DOOR_BELL);
+ 	issued = hba->outstanding_tasks & ~pending;
+ 	for_each_set_bit(tag, &issued, hba->nutmrs) {
+ 		struct request *req = hba->tmf_rqs[tag];
+@@ -6541,11 +6540,6 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
+ 	err = wait_for_completion_io_timeout(&wait,
+ 			msecs_to_jiffies(TM_CMD_TIMEOUT));
+ 	if (!err) {
+-		/*
+-		 * Make sure that ufshcd_compl_tm() does not trigger a
+-		 * use-after-free.
+-		 */
+-		req->end_io_data = NULL;
+ 		ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_ERR);
+ 		dev_err(hba->dev, "%s: task management cmd 0x%.2x timed-out\n",
+ 				__func__, tm_function);
+@@ -7040,6 +7034,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
+ 		goto release;
+ 	}
+ 
++	lrbp->cmd = NULL;
+ 	err = SUCCESS;
+ 
+ release:
+diff --git a/drivers/sh/maple/maple.c b/drivers/sh/maple/maple.c
+index bd0fbcdbdefe9..e24e220e56eea 100644
+--- a/drivers/sh/maple/maple.c
++++ b/drivers/sh/maple/maple.c
+@@ -834,8 +834,10 @@ static int __init maple_bus_init(void)
+ 
+ 	maple_queue_cache = KMEM_CACHE(maple_buffer, SLAB_HWCACHE_ALIGN);
+ 
+-	if (!maple_queue_cache)
++	if (!maple_queue_cache) {
++		retval = -ENOMEM;
+ 		goto cleanup_bothirqs;
++	}
+ 
+ 	INIT_LIST_HEAD(&maple_waitq);
+ 	INIT_LIST_HEAD(&maple_sentq);
+@@ -848,6 +850,7 @@ static int __init maple_bus_init(void)
+ 		if (!mdev[i]) {
+ 			while (i-- > 0)
+ 				maple_free_dev(mdev[i]);
++			retval = -ENOMEM;
+ 			goto cleanup_cache;
+ 		}
+ 		baseunits[i] = mdev[i];
+diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
+index 2a2f41b6df685..97b5a811bd7f7 100644
+--- a/drivers/spi/spi.c
++++ b/drivers/spi/spi.c
+@@ -3020,12 +3020,6 @@ void spi_unregister_controller(struct spi_controller *ctlr)
+ 
+ 	device_del(&ctlr->dev);
+ 
+-	/* Release the last reference on the controller if its driver
+-	 * has not yet been converted to devm_spi_alloc_master/slave().
+-	 */
+-	if (!ctlr->devm_allocated)
+-		put_device(&ctlr->dev);
+-
+ 	/* free bus id */
+ 	mutex_lock(&board_lock);
+ 	if (found == ctlr)
+@@ -3034,6 +3028,12 @@ void spi_unregister_controller(struct spi_controller *ctlr)
+ 
+ 	if (IS_ENABLED(CONFIG_SPI_DYNAMIC))
+ 		mutex_unlock(&ctlr->add_lock);
++
++	/* Release the last reference on the controller if its driver
++	 * has not yet been converted to devm_spi_alloc_master/slave().
++	 */
++	if (!ctlr->devm_allocated)
++		put_device(&ctlr->dev);
+ }
+ EXPORT_SYMBOL_GPL(spi_unregister_controller);
+ 
+diff --git a/drivers/staging/rtl8723bs/core/rtw_mlme.c b/drivers/staging/rtl8723bs/core/rtw_mlme.c
+index ab6a24d70cc96..cf79bec916c51 100644
+--- a/drivers/staging/rtl8723bs/core/rtw_mlme.c
++++ b/drivers/staging/rtl8723bs/core/rtw_mlme.c
+@@ -897,7 +897,6 @@ void rtw_free_assoc_resources(struct adapter *adapter, int lock_scanned_queue)
+ {
+ 	struct	mlme_priv *pmlmepriv = &adapter->mlmepriv;
+ 	struct wlan_network *tgt_network = &pmlmepriv->cur_network;
+-	struct	sta_priv *pstapriv = &adapter->stapriv;
+ 	struct dvobj_priv *psdpriv = adapter->dvobj;
+ 	struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+ 
+@@ -905,11 +904,7 @@ void rtw_free_assoc_resources(struct adapter *adapter, int lock_scanned_queue)
+ 		struct sta_info *psta;
+ 
+ 		psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.mac_address);
+-		spin_lock_bh(&(pstapriv->sta_hash_lock));
+ 		rtw_free_stainfo(adapter,  psta);
+-
+-		spin_unlock_bh(&(pstapriv->sta_hash_lock));
+-
+ 	}
+ 
+ 	if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)) {
+@@ -1239,16 +1234,13 @@ void rtw_joinbss_event_prehandle(struct adapter *adapter, u8 *pbuf)
+ 				rtw_indicate_connect(adapter);
+ 			}
+ 
++			spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
++
+ 			/* s5. Cancel assoc_timer */
+ 			del_timer_sync(&pmlmepriv->assoc_timer);
+-
+ 		} else {
+ 			spin_unlock_bh(&(pmlmepriv->scanned_queue.lock));
+-			goto ignore_joinbss_callback;
+ 		}
+-
+-		spin_unlock_bh(&(pmlmepriv->scanned_queue.lock));
+-
+ 	} else if (pnetwork->join_res == -4) {
+ 		rtw_reset_securitypriv(adapter);
+ 		_set_timer(&pmlmepriv->assoc_timer, 1);
+diff --git a/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c b/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c
+index 375d2a742dd2d..ad9c237054c4b 100644
+--- a/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c
++++ b/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c
+@@ -1489,9 +1489,7 @@ unsigned int OnDeAuth(struct adapter *padapter, union recv_frame *precv_frame)
+ 		struct sta_info *psta;
+ 		struct sta_priv *pstapriv = &padapter->stapriv;
+ 
+-		/* spin_lock_bh(&(pstapriv->sta_hash_lock)); */
+ 		/* rtw_free_stainfo(padapter, psta); */
+-		/* spin_unlock_bh(&(pstapriv->sta_hash_lock)); */
+ 
+ 		netdev_dbg(padapter->pnetdev,
+ 			   "ap recv deauth reason code(%d) sta:%pM\n", reason,
+@@ -1565,9 +1563,7 @@ unsigned int OnDisassoc(struct adapter *padapter, union recv_frame *precv_frame)
+ 		struct sta_info *psta;
+ 		struct sta_priv *pstapriv = &padapter->stapriv;
+ 
+-		/* spin_lock_bh(&(pstapriv->sta_hash_lock)); */
+ 		/* rtw_free_stainfo(padapter, psta); */
+-		/* spin_unlock_bh(&(pstapriv->sta_hash_lock)); */
+ 
+ 		netdev_dbg(padapter->pnetdev,
+ 			   "ap recv disassoc reason code(%d) sta:%pM\n",
+@@ -5919,7 +5915,6 @@ u8 chk_bmc_sleepq_hdl(struct adapter *padapter, unsigned char *pbuf)
+ 	struct sta_info *psta_bmc;
+ 	struct list_head *xmitframe_plist, *xmitframe_phead, *tmp;
+ 	struct xmit_frame *pxmitframe = NULL;
+-	struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+ 	struct sta_priv  *pstapriv = &padapter->stapriv;
+ 
+ 	/* for BC/MC Frames */
+@@ -5930,8 +5925,7 @@ u8 chk_bmc_sleepq_hdl(struct adapter *padapter, unsigned char *pbuf)
+ 	if ((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len > 0)) {
+ 		msleep(10);/*  10ms, ATIM(HIQ) Windows */
+ 
+-		/* spin_lock_bh(&psta_bmc->sleep_q.lock); */
+-		spin_lock_bh(&pxmitpriv->lock);
++		spin_lock_bh(&psta_bmc->sleep_q.lock);
+ 
+ 		xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
+ 		list_for_each_safe(xmitframe_plist, tmp, xmitframe_phead) {
+@@ -5954,8 +5948,7 @@ u8 chk_bmc_sleepq_hdl(struct adapter *padapter, unsigned char *pbuf)
+ 			rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
+ 		}
+ 
+-		/* spin_unlock_bh(&psta_bmc->sleep_q.lock); */
+-		spin_unlock_bh(&pxmitpriv->lock);
++		spin_unlock_bh(&psta_bmc->sleep_q.lock);
+ 
+ 		/* check hi queue and bmc_sleepq */
+ 		rtw_chk_hi_queue_cmd(padapter);
+diff --git a/drivers/staging/rtl8723bs/core/rtw_recv.c b/drivers/staging/rtl8723bs/core/rtw_recv.c
+index 5b0a596eefb77..3564e2af5741b 100644
+--- a/drivers/staging/rtl8723bs/core/rtw_recv.c
++++ b/drivers/staging/rtl8723bs/core/rtw_recv.c
+@@ -953,10 +953,8 @@ static signed int validate_recv_ctrl_frame(struct adapter *padapter, union recv_
+ 		if ((psta->state&WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap&BIT(psta->aid))) {
+ 			struct list_head	*xmitframe_plist, *xmitframe_phead;
+ 			struct xmit_frame *pxmitframe = NULL;
+-			struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+ 
+-			/* spin_lock_bh(&psta->sleep_q.lock); */
+-			spin_lock_bh(&pxmitpriv->lock);
++			spin_lock_bh(&psta->sleep_q.lock);
+ 
+ 			xmitframe_phead = get_list_head(&psta->sleep_q);
+ 			xmitframe_plist = get_next(xmitframe_phead);
+@@ -987,12 +985,10 @@ static signed int validate_recv_ctrl_frame(struct adapter *padapter, union recv_
+ 					update_beacon(padapter, WLAN_EID_TIM, NULL, true);
+ 				}
+ 
+-				/* spin_unlock_bh(&psta->sleep_q.lock); */
+-				spin_unlock_bh(&pxmitpriv->lock);
++				spin_unlock_bh(&psta->sleep_q.lock);
+ 
+ 			} else {
+-				/* spin_unlock_bh(&psta->sleep_q.lock); */
+-				spin_unlock_bh(&pxmitpriv->lock);
++				spin_unlock_bh(&psta->sleep_q.lock);
+ 
+ 				if (pstapriv->tim_bitmap&BIT(psta->aid)) {
+ 					if (psta->sleepq_len == 0) {
+diff --git a/drivers/staging/rtl8723bs/core/rtw_sta_mgt.c b/drivers/staging/rtl8723bs/core/rtw_sta_mgt.c
+index 67ca219f95bf8..3d269842677dd 100644
+--- a/drivers/staging/rtl8723bs/core/rtw_sta_mgt.c
++++ b/drivers/staging/rtl8723bs/core/rtw_sta_mgt.c
+@@ -263,7 +263,6 @@ exit:
+ 	return psta;
+ }
+ 
+-/*  using pstapriv->sta_hash_lock to protect */
+ u32 rtw_free_stainfo(struct adapter *padapter, struct sta_info *psta)
+ {
+ 	int i;
+@@ -289,51 +288,55 @@ u32 rtw_free_stainfo(struct adapter *padapter, struct sta_info *psta)
+ 
+ 	/* list_del_init(&psta->wakeup_list); */
+ 
+-	spin_lock_bh(&pxmitpriv->lock);
+-
++	spin_lock_bh(&psta->sleep_q.lock);
+ 	rtw_free_xmitframe_queue(pxmitpriv, &psta->sleep_q);
+ 	psta->sleepq_len = 0;
++	spin_unlock_bh(&psta->sleep_q.lock);
++
++	spin_lock_bh(&pxmitpriv->lock);
+ 
+ 	/* vo */
+-	/* spin_lock_bh(&(pxmitpriv->vo_pending.lock)); */
++	spin_lock_bh(&pstaxmitpriv->vo_q.sta_pending.lock);
+ 	rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->vo_q.sta_pending);
+ 	list_del_init(&(pstaxmitpriv->vo_q.tx_pending));
+ 	phwxmit = pxmitpriv->hwxmits;
+ 	phwxmit->accnt -= pstaxmitpriv->vo_q.qcnt;
+ 	pstaxmitpriv->vo_q.qcnt = 0;
+-	/* spin_unlock_bh(&(pxmitpriv->vo_pending.lock)); */
++	spin_unlock_bh(&pstaxmitpriv->vo_q.sta_pending.lock);
+ 
+ 	/* vi */
+-	/* spin_lock_bh(&(pxmitpriv->vi_pending.lock)); */
++	spin_lock_bh(&pstaxmitpriv->vi_q.sta_pending.lock);
+ 	rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->vi_q.sta_pending);
+ 	list_del_init(&(pstaxmitpriv->vi_q.tx_pending));
+ 	phwxmit = pxmitpriv->hwxmits+1;
+ 	phwxmit->accnt -= pstaxmitpriv->vi_q.qcnt;
+ 	pstaxmitpriv->vi_q.qcnt = 0;
+-	/* spin_unlock_bh(&(pxmitpriv->vi_pending.lock)); */
++	spin_unlock_bh(&pstaxmitpriv->vi_q.sta_pending.lock);
+ 
+ 	/* be */
+-	/* spin_lock_bh(&(pxmitpriv->be_pending.lock)); */
++	spin_lock_bh(&pstaxmitpriv->be_q.sta_pending.lock);
+ 	rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->be_q.sta_pending);
+ 	list_del_init(&(pstaxmitpriv->be_q.tx_pending));
+ 	phwxmit = pxmitpriv->hwxmits+2;
+ 	phwxmit->accnt -= pstaxmitpriv->be_q.qcnt;
+ 	pstaxmitpriv->be_q.qcnt = 0;
+-	/* spin_unlock_bh(&(pxmitpriv->be_pending.lock)); */
++	spin_unlock_bh(&pstaxmitpriv->be_q.sta_pending.lock);
+ 
+ 	/* bk */
+-	/* spin_lock_bh(&(pxmitpriv->bk_pending.lock)); */
++	spin_lock_bh(&pstaxmitpriv->bk_q.sta_pending.lock);
+ 	rtw_free_xmitframe_queue(pxmitpriv, &pstaxmitpriv->bk_q.sta_pending);
+ 	list_del_init(&(pstaxmitpriv->bk_q.tx_pending));
+ 	phwxmit = pxmitpriv->hwxmits+3;
+ 	phwxmit->accnt -= pstaxmitpriv->bk_q.qcnt;
+ 	pstaxmitpriv->bk_q.qcnt = 0;
+-	/* spin_unlock_bh(&(pxmitpriv->bk_pending.lock)); */
++	spin_unlock_bh(&pstaxmitpriv->bk_q.sta_pending.lock);
+ 
+ 	spin_unlock_bh(&pxmitpriv->lock);
+ 
++	spin_lock_bh(&pstapriv->sta_hash_lock);
+ 	list_del_init(&psta->hash_list);
+ 	pstapriv->asoc_sta_count--;
++	spin_unlock_bh(&pstapriv->sta_hash_lock);
+ 
+ 	/*  re-init sta_info; 20061114 will be init in alloc_stainfo */
+ 	/* _rtw_init_sta_xmit_priv(&psta->sta_xmitpriv); */
+@@ -428,6 +431,7 @@ void rtw_free_all_stainfo(struct adapter *padapter)
+ 	struct sta_info *psta = NULL;
+ 	struct	sta_priv *pstapriv = &padapter->stapriv;
+ 	struct sta_info *pbcmc_stainfo = rtw_get_bcmc_stainfo(padapter);
++	LIST_HEAD(stainfo_free_list);
+ 
+ 	if (pstapriv->asoc_sta_count == 1)
+ 		return;
+@@ -440,11 +444,16 @@ void rtw_free_all_stainfo(struct adapter *padapter)
+ 			psta = list_entry(plist, struct sta_info, hash_list);
+ 
+ 			if (pbcmc_stainfo != psta)
+-				rtw_free_stainfo(padapter, psta);
++				list_move(&psta->hash_list, &stainfo_free_list);
+ 		}
+ 	}
+ 
+ 	spin_unlock_bh(&pstapriv->sta_hash_lock);
++
++	list_for_each_safe(plist, tmp, &stainfo_free_list) {
++		psta = list_entry(plist, struct sta_info, hash_list);
++		rtw_free_stainfo(padapter, psta);
++	}
+ }
+ 
+ /* any station allocated can be searched by hash list */
+diff --git a/drivers/staging/rtl8723bs/core/rtw_xmit.c b/drivers/staging/rtl8723bs/core/rtw_xmit.c
+index 79e4d7df1ef57..6b37b42ec2266 100644
+--- a/drivers/staging/rtl8723bs/core/rtw_xmit.c
++++ b/drivers/staging/rtl8723bs/core/rtw_xmit.c
+@@ -1723,15 +1723,12 @@ void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, struct __queue *pfram
+ 	struct list_head *plist, *phead, *tmp;
+ 	struct	xmit_frame	*pxmitframe;
+ 
+-	spin_lock_bh(&pframequeue->lock);
+-
+ 	phead = get_list_head(pframequeue);
+ 	list_for_each_safe(plist, tmp, phead) {
+ 		pxmitframe = list_entry(plist, struct xmit_frame, list);
+ 
+ 		rtw_free_xmitframe(pxmitpriv, pxmitframe);
+ 	}
+-	spin_unlock_bh(&pframequeue->lock);
+ }
+ 
+ s32 rtw_xmitframe_enqueue(struct adapter *padapter, struct xmit_frame *pxmitframe)
+@@ -1786,6 +1783,7 @@ s32 rtw_xmit_classifier(struct adapter *padapter, struct xmit_frame *pxmitframe)
+ 	struct sta_info *psta;
+ 	struct tx_servq	*ptxservq;
+ 	struct pkt_attrib	*pattrib = &pxmitframe->attrib;
++	struct xmit_priv *xmit_priv = &padapter->xmitpriv;
+ 	struct hw_xmit	*phwxmits =  padapter->xmitpriv.hwxmits;
+ 	signed int res = _SUCCESS;
+ 
+@@ -1803,12 +1801,14 @@ s32 rtw_xmit_classifier(struct adapter *padapter, struct xmit_frame *pxmitframe)
+ 
+ 	ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
+ 
++	spin_lock_bh(&xmit_priv->lock);
+ 	if (list_empty(&ptxservq->tx_pending))
+ 		list_add_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue));
+ 
+ 	list_add_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending));
+ 	ptxservq->qcnt++;
+ 	phwxmits[ac_index].accnt++;
++	spin_unlock_bh(&xmit_priv->lock);
+ 
+ exit:
+ 
+@@ -2191,11 +2191,10 @@ void wakeup_sta_to_xmit(struct adapter *padapter, struct sta_info *psta)
+ 	struct list_head *xmitframe_plist, *xmitframe_phead, *tmp;
+ 	struct xmit_frame *pxmitframe = NULL;
+ 	struct sta_priv *pstapriv = &padapter->stapriv;
+-	struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+ 
+ 	psta_bmc = rtw_get_bcmc_stainfo(padapter);
+ 
+-	spin_lock_bh(&pxmitpriv->lock);
++	spin_lock_bh(&psta->sleep_q.lock);
+ 
+ 	xmitframe_phead = get_list_head(&psta->sleep_q);
+ 	list_for_each_safe(xmitframe_plist, tmp, xmitframe_phead) {
+@@ -2296,7 +2295,7 @@ void wakeup_sta_to_xmit(struct adapter *padapter, struct sta_info *psta)
+ 
+ _exit:
+ 
+-	spin_unlock_bh(&pxmitpriv->lock);
++	spin_unlock_bh(&psta->sleep_q.lock);
+ 
+ 	if (update_mask)
+ 		update_beacon(padapter, WLAN_EID_TIM, NULL, true);
+@@ -2308,9 +2307,8 @@ void xmit_delivery_enabled_frames(struct adapter *padapter, struct sta_info *pst
+ 	struct list_head *xmitframe_plist, *xmitframe_phead, *tmp;
+ 	struct xmit_frame *pxmitframe = NULL;
+ 	struct sta_priv *pstapriv = &padapter->stapriv;
+-	struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+ 
+-	spin_lock_bh(&pxmitpriv->lock);
++	spin_lock_bh(&psta->sleep_q.lock);
+ 
+ 	xmitframe_phead = get_list_head(&psta->sleep_q);
+ 	list_for_each_safe(xmitframe_plist, tmp, xmitframe_phead) {
+@@ -2363,7 +2361,7 @@ void xmit_delivery_enabled_frames(struct adapter *padapter, struct sta_info *pst
+ 		}
+ 	}
+ 
+-	spin_unlock_bh(&pxmitpriv->lock);
++	spin_unlock_bh(&psta->sleep_q.lock);
+ }
+ 
+ void enqueue_pending_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
+diff --git a/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c b/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c
+index 156d6aba18ca1..5f5c4719b5868 100644
+--- a/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c
++++ b/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c
+@@ -507,9 +507,7 @@ s32 rtl8723bs_hal_xmit(
+ 			rtw_issue_addbareq_cmd(padapter, pxmitframe);
+ 	}
+ 
+-	spin_lock_bh(&pxmitpriv->lock);
+ 	err = rtw_xmitframe_enqueue(padapter, pxmitframe);
+-	spin_unlock_bh(&pxmitpriv->lock);
+ 	if (err != _SUCCESS) {
+ 		rtw_free_xmitframe(pxmitpriv, pxmitframe);
+ 
+diff --git a/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c b/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c
+index 9d4a233a861e3..295121c268bd4 100644
+--- a/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c
++++ b/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c
+@@ -835,9 +835,7 @@ static int rtw_add_sta(struct net_device *dev, struct ieee_param *param)
+ 	psta = rtw_get_stainfo(pstapriv, param->sta_addr);
+ 	if (psta)
+ 	{
+-		spin_lock_bh(&(pstapriv->sta_hash_lock));
+ 		rtw_free_stainfo(padapter,  psta);
+-		spin_unlock_bh(&(pstapriv->sta_hash_lock));
+ 
+ 		psta = NULL;
+ 	}
+diff --git a/drivers/staging/wfx/bus_sdio.c b/drivers/staging/wfx/bus_sdio.c
+index e06d7e1ebe9c3..61b8cc05f2935 100644
+--- a/drivers/staging/wfx/bus_sdio.c
++++ b/drivers/staging/wfx/bus_sdio.c
+@@ -120,19 +120,22 @@ static int wfx_sdio_irq_subscribe(void *priv)
+ 		return ret;
+ 	}
+ 
++	flags = irq_get_trigger_type(bus->of_irq);
++	if (!flags)
++		flags = IRQF_TRIGGER_HIGH;
++	flags |= IRQF_ONESHOT;
++	ret = devm_request_threaded_irq(&bus->func->dev, bus->of_irq, NULL,
++					wfx_sdio_irq_handler_ext, flags,
++					"wfx", bus);
++	if (ret)
++		return ret;
+ 	sdio_claim_host(bus->func);
+ 	cccr = sdio_f0_readb(bus->func, SDIO_CCCR_IENx, NULL);
+ 	cccr |= BIT(0);
+ 	cccr |= BIT(bus->func->num);
+ 	sdio_f0_writeb(bus->func, cccr, SDIO_CCCR_IENx, NULL);
+ 	sdio_release_host(bus->func);
+-	flags = irq_get_trigger_type(bus->of_irq);
+-	if (!flags)
+-		flags = IRQF_TRIGGER_HIGH;
+-	flags |= IRQF_ONESHOT;
+-	return devm_request_threaded_irq(&bus->func->dev, bus->of_irq, NULL,
+-					 wfx_sdio_irq_handler_ext, flags,
+-					 "wfx", bus);
++	return 0;
+ }
+ 
+ static int wfx_sdio_irq_unsubscribe(void *priv)
+diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
+index cb1de1ecaaa61..bd0f2ce011dd7 100644
+--- a/drivers/target/target_core_alua.c
++++ b/drivers/target/target_core_alua.c
+@@ -1674,7 +1674,6 @@ int core_alua_set_tg_pt_gp_id(
+ 		pr_err("Maximum ALUA alua_tg_pt_gps_count:"
+ 			" 0x0000ffff reached\n");
+ 		spin_unlock(&dev->t10_alua.tg_pt_gps_lock);
+-		kmem_cache_free(t10_alua_tg_pt_gp_cache, tg_pt_gp);
+ 		return -ENOSPC;
+ 	}
+ again:
+diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
+index 8cb1fa0c05857..44bb380e7390c 100644
+--- a/drivers/target/target_core_device.c
++++ b/drivers/target/target_core_device.c
+@@ -772,6 +772,8 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)
+ 	INIT_LIST_HEAD(&dev->t10_alua.lba_map_list);
+ 	spin_lock_init(&dev->t10_alua.lba_map_lock);
+ 
++	INIT_WORK(&dev->delayed_cmd_work, target_do_delayed_work);
++
+ 	dev->t10_wwn.t10_dev = dev;
+ 	/*
+ 	 * Use OpenFabrics IEEE Company ID: 00 14 05
+diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h
+index a343bcfa2180f..a889a6237d9c1 100644
+--- a/drivers/target/target_core_internal.h
++++ b/drivers/target/target_core_internal.h
+@@ -151,6 +151,7 @@ int	transport_dump_vpd_ident(struct t10_vpd *, unsigned char *, int);
+ void	transport_clear_lun_ref(struct se_lun *);
+ sense_reason_t	target_cmd_size_check(struct se_cmd *cmd, unsigned int size);
+ void	target_qf_do_work(struct work_struct *work);
++void	target_do_delayed_work(struct work_struct *work);
+ bool	target_check_wce(struct se_device *dev);
+ bool	target_check_fua(struct se_device *dev);
+ void	__target_execute_cmd(struct se_cmd *, bool);
+diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
+index e60abd230e90f..72edf5bd75ee6 100644
+--- a/drivers/target/target_core_transport.c
++++ b/drivers/target/target_core_transport.c
+@@ -2189,32 +2189,35 @@ static bool target_handle_task_attr(struct se_cmd *cmd)
+ 	 */
+ 	switch (cmd->sam_task_attr) {
+ 	case TCM_HEAD_TAG:
++		atomic_inc_mb(&dev->non_ordered);
+ 		pr_debug("Added HEAD_OF_QUEUE for CDB: 0x%02x\n",
+ 			 cmd->t_task_cdb[0]);
+ 		return false;
+ 	case TCM_ORDERED_TAG:
+-		atomic_inc_mb(&dev->dev_ordered_sync);
++		atomic_inc_mb(&dev->delayed_cmd_count);
+ 
+ 		pr_debug("Added ORDERED for CDB: 0x%02x to ordered list\n",
+ 			 cmd->t_task_cdb[0]);
+-
+-		/*
+-		 * Execute an ORDERED command if no other older commands
+-		 * exist that need to be completed first.
+-		 */
+-		if (!atomic_read(&dev->simple_cmds))
+-			return false;
+ 		break;
+ 	default:
+ 		/*
+ 		 * For SIMPLE and UNTAGGED Task Attribute commands
+ 		 */
+-		atomic_inc_mb(&dev->simple_cmds);
++		atomic_inc_mb(&dev->non_ordered);
++
++		if (atomic_read(&dev->delayed_cmd_count) == 0)
++			return false;
+ 		break;
+ 	}
+ 
+-	if (atomic_read(&dev->dev_ordered_sync) == 0)
+-		return false;
++	if (cmd->sam_task_attr != TCM_ORDERED_TAG) {
++		atomic_inc_mb(&dev->delayed_cmd_count);
++		/*
++		 * We will account for this when we dequeue from the delayed
++		 * list.
++		 */
++		atomic_dec_mb(&dev->non_ordered);
++	}
+ 
+ 	spin_lock(&dev->delayed_cmd_lock);
+ 	list_add_tail(&cmd->se_delayed_node, &dev->delayed_cmd_list);
+@@ -2222,6 +2225,12 @@ static bool target_handle_task_attr(struct se_cmd *cmd)
+ 
+ 	pr_debug("Added CDB: 0x%02x Task Attr: 0x%02x to delayed CMD listn",
+ 		cmd->t_task_cdb[0], cmd->sam_task_attr);
++	/*
++	 * We may have no non ordered cmds when this function started or we
++	 * could have raced with the last simple/head cmd completing, so kick
++	 * the delayed handler here.
++	 */
++	schedule_work(&dev->delayed_cmd_work);
+ 	return true;
+ }
+ 
+@@ -2259,29 +2268,48 @@ EXPORT_SYMBOL(target_execute_cmd);
+  * Process all commands up to the last received ORDERED task attribute which
+  * requires another blocking boundary
+  */
+-static void target_restart_delayed_cmds(struct se_device *dev)
++void target_do_delayed_work(struct work_struct *work)
+ {
+-	for (;;) {
++	struct se_device *dev = container_of(work, struct se_device,
++					     delayed_cmd_work);
++
++	spin_lock(&dev->delayed_cmd_lock);
++	while (!dev->ordered_sync_in_progress) {
+ 		struct se_cmd *cmd;
+ 
+-		spin_lock(&dev->delayed_cmd_lock);
+-		if (list_empty(&dev->delayed_cmd_list)) {
+-			spin_unlock(&dev->delayed_cmd_lock);
++		if (list_empty(&dev->delayed_cmd_list))
+ 			break;
+-		}
+ 
+ 		cmd = list_entry(dev->delayed_cmd_list.next,
+ 				 struct se_cmd, se_delayed_node);
++
++		if (cmd->sam_task_attr == TCM_ORDERED_TAG) {
++			/*
++			 * Check if we started with:
++			 * [ordered] [simple] [ordered]
++			 * and we are now at the last ordered so we have to wait
++			 * for the simple cmd.
++			 */
++			if (atomic_read(&dev->non_ordered) > 0)
++				break;
++
++			dev->ordered_sync_in_progress = true;
++		}
++
+ 		list_del(&cmd->se_delayed_node);
++		atomic_dec_mb(&dev->delayed_cmd_count);
+ 		spin_unlock(&dev->delayed_cmd_lock);
+ 
++		if (cmd->sam_task_attr != TCM_ORDERED_TAG)
++			atomic_inc_mb(&dev->non_ordered);
++
+ 		cmd->transport_state |= CMD_T_SENT;
+ 
+ 		__target_execute_cmd(cmd, true);
+ 
+-		if (cmd->sam_task_attr == TCM_ORDERED_TAG)
+-			break;
++		spin_lock(&dev->delayed_cmd_lock);
+ 	}
++	spin_unlock(&dev->delayed_cmd_lock);
+ }
+ 
+ /*
+@@ -2299,14 +2327,17 @@ static void transport_complete_task_attr(struct se_cmd *cmd)
+ 		goto restart;
+ 
+ 	if (cmd->sam_task_attr == TCM_SIMPLE_TAG) {
+-		atomic_dec_mb(&dev->simple_cmds);
++		atomic_dec_mb(&dev->non_ordered);
+ 		dev->dev_cur_ordered_id++;
+ 	} else if (cmd->sam_task_attr == TCM_HEAD_TAG) {
++		atomic_dec_mb(&dev->non_ordered);
+ 		dev->dev_cur_ordered_id++;
+ 		pr_debug("Incremented dev_cur_ordered_id: %u for HEAD_OF_QUEUE\n",
+ 			 dev->dev_cur_ordered_id);
+ 	} else if (cmd->sam_task_attr == TCM_ORDERED_TAG) {
+-		atomic_dec_mb(&dev->dev_ordered_sync);
++		spin_lock(&dev->delayed_cmd_lock);
++		dev->ordered_sync_in_progress = false;
++		spin_unlock(&dev->delayed_cmd_lock);
+ 
+ 		dev->dev_cur_ordered_id++;
+ 		pr_debug("Incremented dev_cur_ordered_id: %u for ORDERED\n",
+@@ -2315,7 +2346,8 @@ static void transport_complete_task_attr(struct se_cmd *cmd)
+ 	cmd->se_cmd_flags &= ~SCF_TASK_ATTR_SET;
+ 
+ restart:
+-	target_restart_delayed_cmds(dev);
++	if (atomic_read(&dev->delayed_cmd_count) > 0)
++		schedule_work(&dev->delayed_cmd_work);
+ }
+ 
+ static void transport_complete_qf(struct se_cmd *cmd)
+diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
+index 635d0af229b72..6c7e65b1d9a1c 100644
+--- a/drivers/tty/tty_buffer.c
++++ b/drivers/tty/tty_buffer.c
+@@ -544,6 +544,9 @@ static void flush_to_ldisc(struct work_struct *work)
+ 		if (!count)
+ 			break;
+ 		head->read += count;
++
++		if (need_resched())
++			cond_resched();
+ 	}
+ 
+ 	mutex_unlock(&buf->lock);
+diff --git a/drivers/usb/host/max3421-hcd.c b/drivers/usb/host/max3421-hcd.c
+index 59cc1bc7f12f5..30de85a707fef 100644
+--- a/drivers/usb/host/max3421-hcd.c
++++ b/drivers/usb/host/max3421-hcd.c
+@@ -125,8 +125,6 @@ struct max3421_hcd {
+ 
+ 	struct task_struct *spi_thread;
+ 
+-	struct max3421_hcd *next;
+-
+ 	enum max3421_rh_state rh_state;
+ 	/* lower 16 bits contain port status, upper 16 bits the change mask: */
+ 	u32 port_status;
+@@ -174,8 +172,6 @@ struct max3421_ep {
+ 	u8 retransmit;			/* packet needs retransmission */
+ };
+ 
+-static struct max3421_hcd *max3421_hcd_list;
+-
+ #define MAX3421_FIFO_SIZE	64
+ 
+ #define MAX3421_SPI_DIR_RD	0	/* read register from MAX3421 */
+@@ -1882,9 +1878,8 @@ max3421_probe(struct spi_device *spi)
+ 	}
+ 	set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
+ 	max3421_hcd = hcd_to_max3421(hcd);
+-	max3421_hcd->next = max3421_hcd_list;
+-	max3421_hcd_list = max3421_hcd;
+ 	INIT_LIST_HEAD(&max3421_hcd->ep_list);
++	spi_set_drvdata(spi, max3421_hcd);
+ 
+ 	max3421_hcd->tx = kmalloc(sizeof(*max3421_hcd->tx), GFP_KERNEL);
+ 	if (!max3421_hcd->tx)
+@@ -1934,28 +1929,18 @@ error:
+ static int
+ max3421_remove(struct spi_device *spi)
+ {
+-	struct max3421_hcd *max3421_hcd = NULL, **prev;
+-	struct usb_hcd *hcd = NULL;
++	struct max3421_hcd *max3421_hcd;
++	struct usb_hcd *hcd;
+ 	unsigned long flags;
+ 
+-	for (prev = &max3421_hcd_list; *prev; prev = &(*prev)->next) {
+-		max3421_hcd = *prev;
+-		hcd = max3421_to_hcd(max3421_hcd);
+-		if (hcd->self.controller == &spi->dev)
+-			break;
+-	}
+-	if (!max3421_hcd) {
+-		dev_err(&spi->dev, "no MAX3421 HCD found for SPI device %p\n",
+-			spi);
+-		return -ENODEV;
+-	}
++	max3421_hcd = spi_get_drvdata(spi);
++	hcd = max3421_to_hcd(max3421_hcd);
+ 
+ 	usb_remove_hcd(hcd);
+ 
+ 	spin_lock_irqsave(&max3421_hcd->lock, flags);
+ 
+ 	kthread_stop(max3421_hcd->spi_thread);
+-	*prev = max3421_hcd->next;
+ 
+ 	spin_unlock_irqrestore(&max3421_hcd->lock, flags);
+ 
+diff --git a/drivers/usb/host/ohci-tmio.c b/drivers/usb/host/ohci-tmio.c
+index 08ec2ab0d95a5..3f3d62dc06746 100644
+--- a/drivers/usb/host/ohci-tmio.c
++++ b/drivers/usb/host/ohci-tmio.c
+@@ -199,7 +199,7 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev)
+ 	if (usb_disabled())
+ 		return -ENODEV;
+ 
+-	if (!cell)
++	if (!cell || !regs || !config || !sram)
+ 		return -EINVAL;
+ 
+ 	if (irq < 0)
+diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c
+index c968ecda42aa8..7ed4cc348d993 100644
+--- a/drivers/usb/musb/tusb6010.c
++++ b/drivers/usb/musb/tusb6010.c
+@@ -1104,6 +1104,11 @@ static int tusb_musb_init(struct musb *musb)
+ 
+ 	/* dma address for async dma */
+ 	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++	if (!mem) {
++		pr_debug("no async dma resource?\n");
++		ret = -ENODEV;
++		goto done;
++	}
+ 	musb->async = mem->start;
+ 
+ 	/* dma address for sync dma */
+diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
+index ea4cc0a6e40cc..97f50f301f13b 100644
+--- a/drivers/usb/typec/tipd/core.c
++++ b/drivers/usb/typec/tipd/core.c
+@@ -117,7 +117,7 @@ tps6598x_block_read(struct tps6598x *tps, u8 reg, void *val, size_t len)
+ 	u8 data[TPS_MAX_LEN + 1];
+ 	int ret;
+ 
+-	if (WARN_ON(len + 1 > sizeof(data)))
++	if (len + 1 > sizeof(data))
+ 		return -EINVAL;
+ 
+ 	if (!tps->i2c_protocol)
+diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
+index 1b451165311c9..40496e9e9b438 100644
+--- a/drivers/video/console/sticon.c
++++ b/drivers/video/console/sticon.c
+@@ -332,13 +332,13 @@ static u8 sticon_build_attr(struct vc_data *conp, u8 color,
+ 			    bool blink, bool underline, bool reverse,
+ 			    bool italic)
+ {
+-    u8 attr = ((color & 0x70) >> 1) | ((color & 7));
++	u8 fg = color & 7;
++	u8 bg = (color & 0x70) >> 4;
+ 
+-    if (reverse) {
+-	color = ((color >> 3) & 0x7) | ((color & 0x7) << 3);
+-    }
+-
+-    return attr;
++	if (reverse)
++		return (fg << 3) | bg;
++	else
++		return (bg << 3) | fg;
+ }
+ 
+ static void sticon_invert_region(struct vc_data *conp, u16 *p, int count)
+diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
+index edca3703b9640..ea42ba6445b2d 100644
+--- a/drivers/video/fbdev/efifb.c
++++ b/drivers/video/fbdev/efifb.c
+@@ -351,6 +351,17 @@ static int efifb_probe(struct platform_device *dev)
+ 	char *option = NULL;
+ 	efi_memory_desc_t md;
+ 
++	/*
++	 * Generic drivers must not be registered if a framebuffer exists.
++	 * If a native driver was probed, the display hardware was already
++	 * taken and attempting to use the system framebuffer is dangerous.
++	 */
++	if (num_registered_fb > 0) {
++		dev_err(&dev->dev,
++			"efifb: a framebuffer is already registered\n");
++		return -EINVAL;
++	}
++
+ 	if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled)
+ 		return -ENODEV;
+ 
+diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c
+index 62f0ded706815..b63074fd892e5 100644
+--- a/drivers/video/fbdev/simplefb.c
++++ b/drivers/video/fbdev/simplefb.c
+@@ -407,6 +407,17 @@ static int simplefb_probe(struct platform_device *pdev)
+ 	struct simplefb_par *par;
+ 	struct resource *mem;
+ 
++	/*
++	 * Generic drivers must not be registered if a framebuffer exists.
++	 * If a native driver was probed, the display hardware was already
++	 * taken and attempting to use the system framebuffer is dangerous.
++	 */
++	if (num_registered_fb > 0) {
++		dev_err(&pdev->dev,
++			"simplefb: a framebuffer is already registered\n");
++		return -EINVAL;
++	}
++
+ 	if (fb_get_options("simplefb", NULL))
+ 		return -ENODEV;
+ 
+diff --git a/fs/attr.c b/fs/attr.c
+index 473d21b3a86de..66899b6e9bd86 100644
+--- a/fs/attr.c
++++ b/fs/attr.c
+@@ -35,7 +35,7 @@ static bool chown_ok(struct user_namespace *mnt_userns,
+ 		     kuid_t uid)
+ {
+ 	kuid_t kuid = i_uid_into_mnt(mnt_userns, inode);
+-	if (uid_eq(current_fsuid(), kuid) && uid_eq(uid, kuid))
++	if (uid_eq(current_fsuid(), kuid) && uid_eq(uid, inode->i_uid))
+ 		return true;
+ 	if (capable_wrt_inode_uidgid(mnt_userns, inode, CAP_CHOWN))
+ 		return true;
+@@ -62,7 +62,7 @@ static bool chgrp_ok(struct user_namespace *mnt_userns,
+ {
+ 	kgid_t kgid = i_gid_into_mnt(mnt_userns, inode);
+ 	if (uid_eq(current_fsuid(), i_uid_into_mnt(mnt_userns, inode)) &&
+-	    (in_group_p(gid) || gid_eq(gid, kgid)))
++	    (in_group_p(gid) || gid_eq(gid, inode->i_gid)))
+ 		return true;
+ 	if (capable_wrt_inode_uidgid(mnt_userns, inode, CAP_CHOWN))
+ 		return true;
+diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c
+index 309516e6a9682..43c89952b7d25 100644
+--- a/fs/btrfs/async-thread.c
++++ b/fs/btrfs/async-thread.c
+@@ -234,6 +234,13 @@ static void run_ordered_work(struct __btrfs_workqueue *wq,
+ 				  ordered_list);
+ 		if (!test_bit(WORK_DONE_BIT, &work->flags))
+ 			break;
++		/*
++		 * Orders all subsequent loads after reading WORK_DONE_BIT,
++		 * paired with the smp_mb__before_atomic in btrfs_work_helper
++		 * this guarantees that the ordered function will see all
++		 * updates from ordinary work function.
++		 */
++		smp_rmb();
+ 
+ 		/*
+ 		 * we are going to call the ordered done function, but
+@@ -317,6 +324,13 @@ static void btrfs_work_helper(struct work_struct *normal_work)
+ 	thresh_exec_hook(wq);
+ 	work->func(work);
+ 	if (need_order) {
++		/*
++		 * Ensures all memory accesses done in the work function are
++		 * ordered before setting the WORK_DONE_BIT. Ensuring the thread
++		 * which is going to executed the ordered work sees them.
++		 * Pairs with the smp_rmb in run_ordered_work.
++		 */
++		smp_mb__before_atomic();
+ 		set_bit(WORK_DONE_BIT, &work->flags);
+ 		run_ordered_work(wq, work);
+ 	} else {
+diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
+index 088641ba7a8e6..62f4bafbe54bb 100644
+--- a/fs/btrfs/scrub.c
++++ b/fs/btrfs/scrub.c
+@@ -73,8 +73,8 @@ struct scrub_page {
+ 	u64			physical_for_dev_replace;
+ 	atomic_t		refs;
+ 	u8			mirror_num;
+-	int			have_csum:1;
+-	int			io_error:1;
++	unsigned int		have_csum:1;
++	unsigned int		io_error:1;
+ 	u8			csum[BTRFS_CSUM_SIZE];
+ 
+ 	struct scrub_recover	*recover;
+diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
+index 6afebc5b10c84..bc2e4683e8568 100644
+--- a/fs/btrfs/volumes.c
++++ b/fs/btrfs/volumes.c
+@@ -14,6 +14,7 @@
+ #include <linux/semaphore.h>
+ #include <linux/uuid.h>
+ #include <linux/list_sort.h>
++#include <linux/namei.h>
+ #include "misc.h"
+ #include "ctree.h"
+ #include "extent_map.h"
+@@ -1884,18 +1885,22 @@ out:
+ /*
+  * Function to update ctime/mtime for a given device path.
+  * Mainly used for ctime/mtime based probe like libblkid.
++ *
++ * We don't care about errors here, this is just to be kind to userspace.
+  */
+-static void update_dev_time(struct block_device *bdev)
++static void update_dev_time(const char *device_path)
+ {
+-	struct inode *inode = bdev->bd_inode;
++	struct path path;
+ 	struct timespec64 now;
++	int ret;
+ 
+-	/* Shouldn't happen but just in case. */
+-	if (!inode)
++	ret = kern_path(device_path, LOOKUP_FOLLOW, &path);
++	if (ret)
+ 		return;
+ 
+-	now = current_time(inode);
+-	generic_update_time(inode, &now, S_MTIME | S_CTIME);
++	now = current_time(d_inode(path.dentry));
++	inode_update_time(d_inode(path.dentry), &now, S_MTIME | S_CTIME);
++	path_put(&path);
+ }
+ 
+ static int btrfs_rm_dev_item(struct btrfs_device *device)
+@@ -2071,7 +2076,7 @@ void btrfs_scratch_superblocks(struct btrfs_fs_info *fs_info,
+ 	btrfs_kobject_uevent(bdev, KOBJ_CHANGE);
+ 
+ 	/* Update ctime/mtime for device path for libblkid */
+-	update_dev_time(bdev);
++	update_dev_time(device_path);
+ }
+ 
+ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
+@@ -2735,7 +2740,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
+ 	btrfs_forget_devices(device_path);
+ 
+ 	/* Update ctime/mtime for blkid or udev */
+-	update_dev_time(bdev);
++	update_dev_time(device_path);
+ 
+ 	return ret;
+ 
+diff --git a/fs/exec.c b/fs/exec.c
+index a098c133d8d74..ac7b51b51f38a 100644
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -1852,7 +1852,7 @@ out:
+ 	 * SIGSEGV.
+ 	 */
+ 	if (bprm->point_of_no_return && !fatal_signal_pending(current))
+-		force_sigsegv(SIGSEGV);
++		force_fatal_sig(SIGSEGV);
+ 
+ out_unmark:
+ 	current->fs->in_exec = 0;
+diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
+index b339ae89c1ad1..c242274e3479b 100644
+--- a/fs/f2fs/f2fs.h
++++ b/fs/f2fs/f2fs.h
+@@ -4152,8 +4152,7 @@ static inline bool f2fs_disable_compressed_file(struct inode *inode)
+ 
+ 	if (!f2fs_compressed_file(inode))
+ 		return true;
+-	if (S_ISREG(inode->i_mode) &&
+-		(get_dirty_pages(inode) || atomic_read(&fi->i_compr_blocks)))
++	if (S_ISREG(inode->i_mode) && F2FS_HAS_BLOCKS(inode))
+ 		return false;
+ 
+ 	fi->i_flags &= ~F2FS_COMPR_FL;
+diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
+index a135d22474154..d716553bdc025 100644
+--- a/fs/f2fs/segment.c
++++ b/fs/f2fs/segment.c
+@@ -561,7 +561,7 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi, bool from_bg)
+ 		goto do_sync;
+ 
+ 	/* checkpoint is the only way to shrink partial cached entries */
+-	if (f2fs_available_free_memory(sbi, NAT_ENTRIES) ||
++	if (f2fs_available_free_memory(sbi, NAT_ENTRIES) &&
+ 		f2fs_available_free_memory(sbi, INO_ENTRIES))
+ 		return;
+ 
+diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
+index dbe040b66802c..8795a5a8d4e89 100644
+--- a/fs/f2fs/super.c
++++ b/fs/f2fs/super.c
+@@ -1292,7 +1292,7 @@ default_check:
+ 	/* Not pass down write hints if the number of active logs is lesser
+ 	 * than NR_CURSEG_PERSIST_TYPE.
+ 	 */
+-	if (F2FS_OPTION(sbi).active_logs != NR_CURSEG_TYPE)
++	if (F2FS_OPTION(sbi).active_logs != NR_CURSEG_PERSIST_TYPE)
+ 		F2FS_OPTION(sbi).whint_mode = WHINT_MODE_OFF;
+ 
+ 	if (f2fs_sb_has_readonly(sbi) && !f2fs_readonly(sbi->sb)) {
+@@ -3487,7 +3487,7 @@ skip_cross:
+ 		NR_CURSEG_PERSIST_TYPE + nat_bits_blocks >= blocks_per_seg)) {
+ 		f2fs_warn(sbi, "Insane cp_payload: %u, nat_bits_blocks: %u)",
+ 			  cp_payload, nat_bits_blocks);
+-		return -EFSCORRUPTED;
++		return 1;
+ 	}
+ 
+ 	if (unlikely(f2fs_cp_error(sbi))) {
+diff --git a/fs/inode.c b/fs/inode.c
+index ed0cab8a32db1..9abc88d7959cb 100644
+--- a/fs/inode.c
++++ b/fs/inode.c
+@@ -1782,12 +1782,13 @@ EXPORT_SYMBOL(generic_update_time);
+  * This does the actual work of updating an inodes time or version.  Must have
+  * had called mnt_want_write() before calling this.
+  */
+-static int update_time(struct inode *inode, struct timespec64 *time, int flags)
++int inode_update_time(struct inode *inode, struct timespec64 *time, int flags)
+ {
+ 	if (inode->i_op->update_time)
+ 		return inode->i_op->update_time(inode, time, flags);
+ 	return generic_update_time(inode, time, flags);
+ }
++EXPORT_SYMBOL(inode_update_time);
+ 
+ /**
+  *	atime_needs_update	-	update the access time
+@@ -1857,7 +1858,7 @@ void touch_atime(const struct path *path)
+ 	 * of the fs read only, e.g. subvolumes in Btrfs.
+ 	 */
+ 	now = current_time(inode);
+-	update_time(inode, &now, S_ATIME);
++	inode_update_time(inode, &now, S_ATIME);
+ 	__mnt_drop_write(mnt);
+ skip_update:
+ 	sb_end_write(inode->i_sb);
+@@ -2002,7 +2003,7 @@ int file_update_time(struct file *file)
+ 	if (__mnt_want_write_file(file))
+ 		return 0;
+ 
+-	ret = update_time(inode, &now, sync_it);
++	ret = inode_update_time(inode, &now, sync_it);
+ 	__mnt_drop_write_file(file);
+ 
+ 	return ret;
+diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
+index cf030ebe28275..266d5152c3216 100644
+--- a/fs/nfsd/nfs4xdr.c
++++ b/fs/nfsd/nfs4xdr.c
+@@ -288,11 +288,8 @@ nfsd4_decode_bitmap4(struct nfsd4_compoundargs *argp, u32 *bmval, u32 bmlen)
+ 	p = xdr_inline_decode(argp->xdr, count << 2);
+ 	if (!p)
+ 		return nfserr_bad_xdr;
+-	i = 0;
+-	while (i < count)
+-		bmval[i++] = be32_to_cpup(p++);
+-	while (i < bmlen)
+-		bmval[i++] = 0;
++	for (i = 0; i < bmlen; i++)
++		bmval[i] = (i < count) ? be32_to_cpup(p++) : 0;
+ 
+ 	return nfs_ok;
+ }
+diff --git a/fs/pstore/Kconfig b/fs/pstore/Kconfig
+index 328da35da3908..8adabde685f13 100644
+--- a/fs/pstore/Kconfig
++++ b/fs/pstore/Kconfig
+@@ -173,7 +173,6 @@ config PSTORE_BLK
+ 	tristate "Log panic/oops to a block device"
+ 	depends on PSTORE
+ 	depends on BLOCK
+-	depends on BROKEN
+ 	select PSTORE_ZONE
+ 	default n
+ 	help
+diff --git a/fs/pstore/blk.c b/fs/pstore/blk.c
+index 04ce58c939a0b..6093088de49fd 100644
+--- a/fs/pstore/blk.c
++++ b/fs/pstore/blk.c
+@@ -311,7 +311,7 @@ static int __init __best_effort_init(void)
+ 	if (ret)
+ 		kfree(best_effort_dev);
+ 	else
+-		pr_info("attached %s (%zu) (no dedicated panic_write!)\n",
++		pr_info("attached %s (%lu) (no dedicated panic_write!)\n",
+ 			blkdev, best_effort_dev->zone.total_size);
+ 
+ 	return ret;
+diff --git a/fs/udf/dir.c b/fs/udf/dir.c
+index 70abdfad2df17..42e3e551fa4c3 100644
+--- a/fs/udf/dir.c
++++ b/fs/udf/dir.c
+@@ -31,6 +31,7 @@
+ #include <linux/mm.h>
+ #include <linux/slab.h>
+ #include <linux/bio.h>
++#include <linux/iversion.h>
+ 
+ #include "udf_i.h"
+ #include "udf_sb.h"
+@@ -43,7 +44,7 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
+ 	struct fileIdentDesc *fi = NULL;
+ 	struct fileIdentDesc cfi;
+ 	udf_pblk_t block, iblock;
+-	loff_t nf_pos;
++	loff_t nf_pos, emit_pos = 0;
+ 	int flen;
+ 	unsigned char *fname = NULL, *copy_name = NULL;
+ 	unsigned char *nameptr;
+@@ -57,6 +58,7 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
+ 	int i, num, ret = 0;
+ 	struct extent_position epos = { NULL, 0, {0, 0} };
+ 	struct super_block *sb = dir->i_sb;
++	bool pos_valid = false;
+ 
+ 	if (ctx->pos == 0) {
+ 		if (!dir_emit_dot(file, ctx))
+@@ -67,6 +69,21 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
+ 	if (nf_pos >= size)
+ 		goto out;
+ 
++	/*
++	 * Something changed since last readdir (either lseek was called or dir
++	 * changed)?  We need to verify the position correctly points at the
++	 * beginning of some dir entry so that the directory parsing code does
++	 * not get confused. Since UDF does not have any reliable way of
++	 * identifying beginning of dir entry (names are under user control),
++	 * we need to scan the directory from the beginning.
++	 */
++	if (!inode_eq_iversion(dir, file->f_version)) {
++		emit_pos = nf_pos;
++		nf_pos = 0;
++	} else {
++		pos_valid = true;
++	}
++
+ 	fname = kmalloc(UDF_NAME_LEN, GFP_NOFS);
+ 	if (!fname) {
+ 		ret = -ENOMEM;
+@@ -122,13 +139,21 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
+ 
+ 	while (nf_pos < size) {
+ 		struct kernel_lb_addr tloc;
++		loff_t cur_pos = nf_pos;
+ 
+-		ctx->pos = (nf_pos >> 2) + 1;
++		/* Update file position only if we got past the current one */
++		if (nf_pos >= emit_pos) {
++			ctx->pos = (nf_pos >> 2) + 1;
++			pos_valid = true;
++		}
+ 
+ 		fi = udf_fileident_read(dir, &nf_pos, &fibh, &cfi, &epos, &eloc,
+ 					&elen, &offset);
+ 		if (!fi)
+ 			goto out;
++		/* Still not at offset where user asked us to read from? */
++		if (cur_pos < emit_pos)
++			continue;
+ 
+ 		liu = le16_to_cpu(cfi.lengthOfImpUse);
+ 		lfi = cfi.lengthFileIdent;
+@@ -186,8 +211,11 @@ static int udf_readdir(struct file *file, struct dir_context *ctx)
+ 	} /* end while */
+ 
+ 	ctx->pos = (nf_pos >> 2) + 1;
++	pos_valid = true;
+ 
+ out:
++	if (pos_valid)
++		file->f_version = inode_query_iversion(dir);
+ 	if (fibh.sbh != fibh.ebh)
+ 		brelse(fibh.ebh);
+ 	brelse(fibh.sbh);
+diff --git a/fs/udf/namei.c b/fs/udf/namei.c
+index caeef08efed23..0ed4861b038f6 100644
+--- a/fs/udf/namei.c
++++ b/fs/udf/namei.c
+@@ -30,6 +30,7 @@
+ #include <linux/sched.h>
+ #include <linux/crc-itu-t.h>
+ #include <linux/exportfs.h>
++#include <linux/iversion.h>
+ 
+ static inline int udf_match(int len1, const unsigned char *name1, int len2,
+ 			    const unsigned char *name2)
+@@ -134,6 +135,8 @@ int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi,
+ 			mark_buffer_dirty_inode(fibh->ebh, inode);
+ 		mark_buffer_dirty_inode(fibh->sbh, inode);
+ 	}
++	inode_inc_iversion(inode);
++
+ 	return 0;
+ }
+ 
+diff --git a/fs/udf/super.c b/fs/udf/super.c
+index b2d7c57d06881..aa2f6093d3f6f 100644
+--- a/fs/udf/super.c
++++ b/fs/udf/super.c
+@@ -57,6 +57,7 @@
+ #include <linux/crc-itu-t.h>
+ #include <linux/log2.h>
+ #include <asm/byteorder.h>
++#include <linux/iversion.h>
+ 
+ #include "udf_sb.h"
+ #include "udf_i.h"
+@@ -149,6 +150,7 @@ static struct inode *udf_alloc_inode(struct super_block *sb)
+ 	init_rwsem(&ei->i_data_sem);
+ 	ei->cached_extent.lstart = -1;
+ 	spin_lock_init(&ei->i_extent_cache_lock);
++	inode_set_iversion(&ei->vfs_inode, 1);
+ 
+ 	return &ei->vfs_inode;
+ }
+diff --git a/include/linux/bpf.h b/include/linux/bpf.h
+index 3db6f6c95489e..bca11ac818c1f 100644
+--- a/include/linux/bpf.h
++++ b/include/linux/bpf.h
+@@ -190,7 +190,7 @@ struct bpf_map {
+ 	atomic64_t usercnt;
+ 	struct work_struct work;
+ 	struct mutex freeze_mutex;
+-	u64 writecnt; /* writable mmap cnt; protected by freeze_mutex */
++	atomic64_t writecnt;
+ };
+ 
+ static inline bool map_value_has_spin_lock(const struct bpf_map *map)
+@@ -1387,6 +1387,7 @@ void bpf_map_put(struct bpf_map *map);
+ void *bpf_map_area_alloc(u64 size, int numa_node);
+ void *bpf_map_area_mmapable_alloc(u64 size, int numa_node);
+ void bpf_map_area_free(void *base);
++bool bpf_map_write_active(const struct bpf_map *map);
+ void bpf_map_init_from_attr(struct bpf_map *map, union bpf_attr *attr);
+ int  generic_map_lookup_batch(struct bpf_map *map,
+ 			      const union bpf_attr *attr,
+diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
+index e5c2c9e71bf10..9000f3ffce8b3 100644
+--- a/include/linux/dmaengine.h
++++ b/include/linux/dmaengine.h
+@@ -944,10 +944,8 @@ struct dma_device {
+ 	void (*device_issue_pending)(struct dma_chan *chan);
+ 	void (*device_release)(struct dma_device *dev);
+ 	/* debugfs support */
+-#ifdef CONFIG_DEBUG_FS
+ 	void (*dbg_summary_show)(struct seq_file *s, struct dma_device *dev);
+ 	struct dentry *dbg_dev_root;
+-#endif
+ };
+ 
+ static inline int dmaengine_slave_config(struct dma_chan *chan,
+diff --git a/include/linux/fs.h b/include/linux/fs.h
+index e7a633353fd20..56eba723477e3 100644
+--- a/include/linux/fs.h
++++ b/include/linux/fs.h
+@@ -2498,6 +2498,8 @@ enum file_time_flags {
+ 
+ extern bool atime_needs_update(const struct path *, struct inode *);
+ extern void touch_atime(const struct path *);
++int inode_update_time(struct inode *inode, struct timespec64 *time, int flags);
++
+ static inline void file_accessed(struct file *file)
+ {
+ 	if (!(file->f_flags & O_NOATIME))
+diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h
+index 05e22770af517..b75395ec8d521 100644
+--- a/include/linux/ipc_namespace.h
++++ b/include/linux/ipc_namespace.h
+@@ -131,6 +131,16 @@ static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
+ 	return ns;
+ }
+ 
++static inline struct ipc_namespace *get_ipc_ns_not_zero(struct ipc_namespace *ns)
++{
++	if (ns) {
++		if (refcount_inc_not_zero(&ns->ns.count))
++			return ns;
++	}
++
++	return NULL;
++}
++
+ extern void put_ipc_ns(struct ipc_namespace *ns);
+ #else
+ static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
+@@ -147,6 +157,11 @@ static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
+ 	return ns;
+ }
+ 
++static inline struct ipc_namespace *get_ipc_ns_not_zero(struct ipc_namespace *ns)
++{
++	return ns;
++}
++
+ static inline void put_ipc_ns(struct ipc_namespace *ns)
+ {
+ }
+diff --git a/include/linux/mlx5/eswitch.h b/include/linux/mlx5/eswitch.h
+index 4ab5c1fc1270d..a09ed4c8361b6 100644
+--- a/include/linux/mlx5/eswitch.h
++++ b/include/linux/mlx5/eswitch.h
+@@ -136,13 +136,13 @@ u32 mlx5_eswitch_get_vport_metadata_for_set(struct mlx5_eswitch *esw,
+ 				       ESW_TUN_OPTS_SLOW_TABLE_GOTO_VPORT)
+ #define ESW_TUN_SLOW_TABLE_GOTO_VPORT_MARK ESW_TUN_OPTS_MASK
+ 
+-u8 mlx5_eswitch_mode(struct mlx5_core_dev *dev);
++u8 mlx5_eswitch_mode(const struct mlx5_core_dev *dev);
+ u16 mlx5_eswitch_get_total_vports(const struct mlx5_core_dev *dev);
+ struct mlx5_core_dev *mlx5_eswitch_get_core_dev(struct mlx5_eswitch *esw);
+ 
+ #else  /* CONFIG_MLX5_ESWITCH */
+ 
+-static inline u8 mlx5_eswitch_mode(struct mlx5_core_dev *dev)
++static inline u8 mlx5_eswitch_mode(const struct mlx5_core_dev *dev)
+ {
+ 	return MLX5_ESWITCH_NONE;
+ }
+diff --git a/include/linux/platform_data/ti-sysc.h b/include/linux/platform_data/ti-sysc.h
+index 9837fb011f2fb..989aa30c598dc 100644
+--- a/include/linux/platform_data/ti-sysc.h
++++ b/include/linux/platform_data/ti-sysc.h
+@@ -50,6 +50,7 @@ struct sysc_regbits {
+ 	s8 emufree_shift;
+ };
+ 
++#define SYSC_QUIRK_REINIT_ON_CTX_LOST	BIT(28)
+ #define SYSC_QUIRK_REINIT_ON_RESUME	BIT(27)
+ #define SYSC_QUIRK_GPMC_DEBUG		BIT(26)
+ #define SYSC_MODULE_QUIRK_ENA_RESETDONE	BIT(25)
+diff --git a/include/linux/printk.h b/include/linux/printk.h
+index 85b656f82d752..9497f6b983399 100644
+--- a/include/linux/printk.h
++++ b/include/linux/printk.h
+@@ -198,6 +198,7 @@ void dump_stack_print_info(const char *log_lvl);
+ void show_regs_print_info(const char *log_lvl);
+ extern asmlinkage void dump_stack_lvl(const char *log_lvl) __cold;
+ extern asmlinkage void dump_stack(void) __cold;
++void printk_trigger_flush(void);
+ #else
+ static inline __printf(1, 0)
+ int vprintk(const char *s, va_list args)
+@@ -274,6 +275,9 @@ static inline void dump_stack_lvl(const char *log_lvl)
+ static inline void dump_stack(void)
+ {
+ }
++static inline void printk_trigger_flush(void)
++{
++}
+ #endif
+ 
+ #ifdef CONFIG_SMP
+diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h
+index e5f4ce622ee61..9a707b555b0a0 100644
+--- a/include/linux/sched/signal.h
++++ b/include/linux/sched/signal.h
+@@ -338,6 +338,8 @@ extern int kill_pid(struct pid *pid, int sig, int priv);
+ extern __must_check bool do_notify_parent(struct task_struct *, int);
+ extern void __wake_up_parent(struct task_struct *p, struct task_struct *parent);
+ extern void force_sig(int);
++extern void force_fatal_sig(int);
++extern void force_exit_sig(int);
+ extern int send_sig(int, struct task_struct *, int);
+ extern int zap_other_threads(struct task_struct *p);
+ extern struct sigqueue *sigqueue_alloc(void);
+diff --git a/include/linux/sched/task.h b/include/linux/sched/task.h
+index ba88a69874004..058d7f371e25a 100644
+--- a/include/linux/sched/task.h
++++ b/include/linux/sched/task.h
+@@ -158,7 +158,7 @@ static inline struct vm_struct *task_stack_vm_area(const struct task_struct *t)
+  * Protects ->fs, ->files, ->mm, ->group_info, ->comm, keyring
+  * subscriptions and synchronises with wait4().  Also used in procfs.  Also
+  * pins the final release of task.io_context.  Also protects ->cpuset and
+- * ->cgroup.subsys[]. And ->vfork_done.
++ * ->cgroup.subsys[]. And ->vfork_done. And ->sysvshm.shm_clist.
+  *
+  * Nests both inside and outside of read_lock(&tasklist_lock).
+  * It must not be nested with write_lock_irq(&tasklist_lock),
+diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
+index 841e2f0f5240b..b8c273af2910c 100644
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -1671,6 +1671,22 @@ static inline int skb_unclone(struct sk_buff *skb, gfp_t pri)
+ 	return 0;
+ }
+ 
++/* This variant of skb_unclone() makes sure skb->truesize is not changed */
++static inline int skb_unclone_keeptruesize(struct sk_buff *skb, gfp_t pri)
++{
++	might_sleep_if(gfpflags_allow_blocking(pri));
++
++	if (skb_cloned(skb)) {
++		unsigned int save = skb->truesize;
++		int res;
++
++		res = pskb_expand_head(skb, 0, 0, pri);
++		skb->truesize = save;
++		return res;
++	}
++	return 0;
++}
++
+ /**
+  *	skb_header_cloned - is the header a clone
+  *	@skb: buffer to check
+diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
+index 3e475eeb5a995..57113190448c6 100644
+--- a/include/linux/trace_events.h
++++ b/include/linux/trace_events.h
+@@ -673,7 +673,7 @@ struct trace_event_file {
+ 
+ #define PERF_MAX_TRACE_SIZE	2048
+ 
+-#define MAX_FILTER_STR_VAL	256	/* Should handle KSYM_SYMBOL_LEN */
++#define MAX_FILTER_STR_VAL	256U	/* Should handle KSYM_SYMBOL_LEN */
+ 
+ enum event_trigger_type {
+ 	ETT_NONE		= (0),
+diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h
+index b465f8f3e554f..04e87f4b9417c 100644
+--- a/include/linux/virtio_net.h
++++ b/include/linux/virtio_net.h
+@@ -120,10 +120,15 @@ retry:
+ 
+ 	if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) {
+ 		u16 gso_size = __virtio16_to_cpu(little_endian, hdr->gso_size);
++		unsigned int nh_off = p_off;
+ 		struct skb_shared_info *shinfo = skb_shinfo(skb);
+ 
++		/* UFO may not include transport header in gso_size. */
++		if (gso_type & SKB_GSO_UDP)
++			nh_off -= thlen;
++
+ 		/* Too small packets are not really GSO ones. */
+-		if (skb->len - p_off > gso_size) {
++		if (skb->len - nh_off > gso_size) {
+ 			shinfo->gso_size = gso_size;
+ 			shinfo->gso_type = gso_type;
+ 
+diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h
+index a964daedc17b6..ea8595651c384 100644
+--- a/include/net/nfc/nci_core.h
++++ b/include/net/nfc/nci_core.h
+@@ -30,6 +30,7 @@ enum nci_flag {
+ 	NCI_UP,
+ 	NCI_DATA_EXCHANGE,
+ 	NCI_DATA_EXCHANGE_TO,
++	NCI_UNREG,
+ };
+ 
+ /* NCI device states */
+diff --git a/include/rdma/rdma_netlink.h b/include/rdma/rdma_netlink.h
+index 2758d9df71ee9..c2a79aeee113c 100644
+--- a/include/rdma/rdma_netlink.h
++++ b/include/rdma/rdma_netlink.h
+@@ -30,7 +30,7 @@ enum rdma_nl_flags {
+  * constant as well and the compiler checks they are the same.
+  */
+ #define MODULE_ALIAS_RDMA_NETLINK(_index, _val)                                \
+-	static inline void __chk_##_index(void)                                \
++	static inline void __maybe_unused __chk_##_index(void)                 \
+ 	{                                                                      \
+ 		BUILD_BUG_ON(_index != _val);                                  \
+ 	}                                                                      \
+diff --git a/include/sound/hdaudio_ext.h b/include/sound/hdaudio_ext.h
+index 375581634143c..d4e31ea16aba3 100644
+--- a/include/sound/hdaudio_ext.h
++++ b/include/sound/hdaudio_ext.h
+@@ -88,6 +88,8 @@ struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_bus *bus,
+ 					   struct snd_pcm_substream *substream,
+ 					   int type);
+ void snd_hdac_ext_stream_release(struct hdac_ext_stream *azx_dev, int type);
++void snd_hdac_ext_stream_decouple_locked(struct hdac_bus *bus,
++				  struct hdac_ext_stream *azx_dev, bool decouple);
+ void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
+ 				struct hdac_ext_stream *azx_dev, bool decouple);
+ void snd_hdac_ext_stop_streams(struct hdac_bus *bus);
+diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
+index fb11c7693b257..2121a323fd6c3 100644
+--- a/include/target/target_core_base.h
++++ b/include/target/target_core_base.h
+@@ -812,8 +812,9 @@ struct se_device {
+ 	atomic_long_t		read_bytes;
+ 	atomic_long_t		write_bytes;
+ 	/* Active commands on this virtual SE device */
+-	atomic_t		simple_cmds;
+-	atomic_t		dev_ordered_sync;
++	atomic_t		non_ordered;
++	bool			ordered_sync_in_progress;
++	atomic_t		delayed_cmd_count;
+ 	atomic_t		dev_qf_count;
+ 	u32			export_count;
+ 	spinlock_t		delayed_cmd_lock;
+@@ -834,6 +835,7 @@ struct se_device {
+ 	struct list_head	dev_sep_list;
+ 	struct list_head	dev_tmr_list;
+ 	struct work_struct	qf_work_queue;
++	struct work_struct	delayed_cmd_work;
+ 	struct list_head	delayed_cmd_list;
+ 	struct list_head	qf_cmd_list;
+ 	/* Pointer to associated SE HBA */
+diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
+index 4e881d91c8744..4cb055af1ec0b 100644
+--- a/include/trace/events/f2fs.h
++++ b/include/trace/events/f2fs.h
+@@ -807,20 +807,20 @@ TRACE_EVENT(f2fs_lookup_start,
+ 	TP_STRUCT__entry(
+ 		__field(dev_t,	dev)
+ 		__field(ino_t,	ino)
+-		__field(const char *,	name)
++		__string(name,	dentry->d_name.name)
+ 		__field(unsigned int, flags)
+ 	),
+ 
+ 	TP_fast_assign(
+ 		__entry->dev	= dir->i_sb->s_dev;
+ 		__entry->ino	= dir->i_ino;
+-		__entry->name	= dentry->d_name.name;
++		__assign_str(name, dentry->d_name.name);
+ 		__entry->flags	= flags;
+ 	),
+ 
+ 	TP_printk("dev = (%d,%d), pino = %lu, name:%s, flags:%u",
+ 		show_dev_ino(__entry),
+-		__entry->name,
++		__get_str(name),
+ 		__entry->flags)
+ );
+ 
+@@ -834,7 +834,7 @@ TRACE_EVENT(f2fs_lookup_end,
+ 	TP_STRUCT__entry(
+ 		__field(dev_t,	dev)
+ 		__field(ino_t,	ino)
+-		__field(const char *,	name)
++		__string(name,	dentry->d_name.name)
+ 		__field(nid_t,	cino)
+ 		__field(int,	err)
+ 	),
+@@ -842,14 +842,14 @@ TRACE_EVENT(f2fs_lookup_end,
+ 	TP_fast_assign(
+ 		__entry->dev	= dir->i_sb->s_dev;
+ 		__entry->ino	= dir->i_ino;
+-		__entry->name	= dentry->d_name.name;
++		__assign_str(name, dentry->d_name.name);
+ 		__entry->cino	= ino;
+ 		__entry->err	= err;
+ 	),
+ 
+ 	TP_printk("dev = (%d,%d), pino = %lu, name:%s, ino:%u, err:%d",
+ 		show_dev_ino(__entry),
+-		__entry->name,
++		__get_str(name),
+ 		__entry->cino,
+ 		__entry->err)
+ );
+diff --git a/ipc/shm.c b/ipc/shm.c
+index ab749be6d8b71..048eb183b24b9 100644
+--- a/ipc/shm.c
++++ b/ipc/shm.c
+@@ -62,9 +62,18 @@ struct shmid_kernel /* private to the kernel */
+ 	struct pid		*shm_lprid;
+ 	struct ucounts		*mlock_ucounts;
+ 
+-	/* The task created the shm object.  NULL if the task is dead. */
++	/*
++	 * The task created the shm object, for
++	 * task_lock(shp->shm_creator)
++	 */
+ 	struct task_struct	*shm_creator;
+-	struct list_head	shm_clist;	/* list by creator */
++
++	/*
++	 * List by creator. task_lock(->shm_creator) required for read/write.
++	 * If list_empty(), then the creator is dead already.
++	 */
++	struct list_head	shm_clist;
++	struct ipc_namespace	*ns;
+ } __randomize_layout;
+ 
+ /* shm_mode upper byte flags */
+@@ -115,6 +124,7 @@ static void do_shm_rmid(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp)
+ 	struct shmid_kernel *shp;
+ 
+ 	shp = container_of(ipcp, struct shmid_kernel, shm_perm);
++	WARN_ON(ns != shp->ns);
+ 
+ 	if (shp->shm_nattch) {
+ 		shp->shm_perm.mode |= SHM_DEST;
+@@ -225,10 +235,43 @@ static void shm_rcu_free(struct rcu_head *head)
+ 	kfree(shp);
+ }
+ 
+-static inline void shm_rmid(struct ipc_namespace *ns, struct shmid_kernel *s)
++/*
++ * It has to be called with shp locked.
++ * It must be called before ipc_rmid()
++ */
++static inline void shm_clist_rm(struct shmid_kernel *shp)
+ {
+-	list_del(&s->shm_clist);
+-	ipc_rmid(&shm_ids(ns), &s->shm_perm);
++	struct task_struct *creator;
++
++	/* ensure that shm_creator does not disappear */
++	rcu_read_lock();
++
++	/*
++	 * A concurrent exit_shm may do a list_del_init() as well.
++	 * Just do nothing if exit_shm already did the work
++	 */
++	if (!list_empty(&shp->shm_clist)) {
++		/*
++		 * shp->shm_creator is guaranteed to be valid *only*
++		 * if shp->shm_clist is not empty.
++		 */
++		creator = shp->shm_creator;
++
++		task_lock(creator);
++		/*
++		 * list_del_init() is a nop if the entry was already removed
++		 * from the list.
++		 */
++		list_del_init(&shp->shm_clist);
++		task_unlock(creator);
++	}
++	rcu_read_unlock();
++}
++
++static inline void shm_rmid(struct shmid_kernel *s)
++{
++	shm_clist_rm(s);
++	ipc_rmid(&shm_ids(s->ns), &s->shm_perm);
+ }
+ 
+ 
+@@ -283,7 +326,7 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)
+ 	shm_file = shp->shm_file;
+ 	shp->shm_file = NULL;
+ 	ns->shm_tot -= (shp->shm_segsz + PAGE_SIZE - 1) >> PAGE_SHIFT;
+-	shm_rmid(ns, shp);
++	shm_rmid(shp);
+ 	shm_unlock(shp);
+ 	if (!is_file_hugepages(shm_file))
+ 		shmem_lock(shm_file, 0, shp->mlock_ucounts);
+@@ -306,10 +349,10 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)
+  *
+  * 2) sysctl kernel.shm_rmid_forced is set to 1.
+  */
+-static bool shm_may_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)
++static bool shm_may_destroy(struct shmid_kernel *shp)
+ {
+ 	return (shp->shm_nattch == 0) &&
+-	       (ns->shm_rmid_forced ||
++	       (shp->ns->shm_rmid_forced ||
+ 		(shp->shm_perm.mode & SHM_DEST));
+ }
+ 
+@@ -340,7 +383,7 @@ static void shm_close(struct vm_area_struct *vma)
+ 	ipc_update_pid(&shp->shm_lprid, task_tgid(current));
+ 	shp->shm_dtim = ktime_get_real_seconds();
+ 	shp->shm_nattch--;
+-	if (shm_may_destroy(ns, shp))
++	if (shm_may_destroy(shp))
+ 		shm_destroy(ns, shp);
+ 	else
+ 		shm_unlock(shp);
+@@ -361,10 +404,10 @@ static int shm_try_destroy_orphaned(int id, void *p, void *data)
+ 	 *
+ 	 * As shp->* are changed under rwsem, it's safe to skip shp locking.
+ 	 */
+-	if (shp->shm_creator != NULL)
++	if (!list_empty(&shp->shm_clist))
+ 		return 0;
+ 
+-	if (shm_may_destroy(ns, shp)) {
++	if (shm_may_destroy(shp)) {
+ 		shm_lock_by_ptr(shp);
+ 		shm_destroy(ns, shp);
+ 	}
+@@ -382,48 +425,97 @@ void shm_destroy_orphaned(struct ipc_namespace *ns)
+ /* Locking assumes this will only be called with task == current */
+ void exit_shm(struct task_struct *task)
+ {
+-	struct ipc_namespace *ns = task->nsproxy->ipc_ns;
+-	struct shmid_kernel *shp, *n;
++	for (;;) {
++		struct shmid_kernel *shp;
++		struct ipc_namespace *ns;
+ 
+-	if (list_empty(&task->sysvshm.shm_clist))
+-		return;
++		task_lock(task);
++
++		if (list_empty(&task->sysvshm.shm_clist)) {
++			task_unlock(task);
++			break;
++		}
++
++		shp = list_first_entry(&task->sysvshm.shm_clist, struct shmid_kernel,
++				shm_clist);
+ 
+-	/*
+-	 * If kernel.shm_rmid_forced is not set then only keep track of
+-	 * which shmids are orphaned, so that a later set of the sysctl
+-	 * can clean them up.
+-	 */
+-	if (!ns->shm_rmid_forced) {
+-		down_read(&shm_ids(ns).rwsem);
+-		list_for_each_entry(shp, &task->sysvshm.shm_clist, shm_clist)
+-			shp->shm_creator = NULL;
+ 		/*
+-		 * Only under read lock but we are only called on current
+-		 * so no entry on the list will be shared.
++		 * 1) Get pointer to the ipc namespace. It is worth to say
++		 * that this pointer is guaranteed to be valid because
++		 * shp lifetime is always shorter than namespace lifetime
++		 * in which shp lives.
++		 * We taken task_lock it means that shp won't be freed.
+ 		 */
+-		list_del(&task->sysvshm.shm_clist);
+-		up_read(&shm_ids(ns).rwsem);
+-		return;
+-	}
++		ns = shp->ns;
+ 
+-	/*
+-	 * Destroy all already created segments, that were not yet mapped,
+-	 * and mark any mapped as orphan to cover the sysctl toggling.
+-	 * Destroy is skipped if shm_may_destroy() returns false.
+-	 */
+-	down_write(&shm_ids(ns).rwsem);
+-	list_for_each_entry_safe(shp, n, &task->sysvshm.shm_clist, shm_clist) {
+-		shp->shm_creator = NULL;
++		/*
++		 * 2) If kernel.shm_rmid_forced is not set then only keep track of
++		 * which shmids are orphaned, so that a later set of the sysctl
++		 * can clean them up.
++		 */
++		if (!ns->shm_rmid_forced)
++			goto unlink_continue;
+ 
+-		if (shm_may_destroy(ns, shp)) {
+-			shm_lock_by_ptr(shp);
+-			shm_destroy(ns, shp);
++		/*
++		 * 3) get a reference to the namespace.
++		 *    The refcount could be already 0. If it is 0, then
++		 *    the shm objects will be free by free_ipc_work().
++		 */
++		ns = get_ipc_ns_not_zero(ns);
++		if (!ns) {
++unlink_continue:
++			list_del_init(&shp->shm_clist);
++			task_unlock(task);
++			continue;
+ 		}
+-	}
+ 
+-	/* Remove the list head from any segments still attached. */
+-	list_del(&task->sysvshm.shm_clist);
+-	up_write(&shm_ids(ns).rwsem);
++		/*
++		 * 4) get a reference to shp.
++		 *   This cannot fail: shm_clist_rm() is called before
++		 *   ipc_rmid(), thus the refcount cannot be 0.
++		 */
++		WARN_ON(!ipc_rcu_getref(&shp->shm_perm));
++
++		/*
++		 * 5) unlink the shm segment from the list of segments
++		 *    created by current.
++		 *    This must be done last. After unlinking,
++		 *    only the refcounts obtained above prevent IPC_RMID
++		 *    from destroying the segment or the namespace.
++		 */
++		list_del_init(&shp->shm_clist);
++
++		task_unlock(task);
++
++		/*
++		 * 6) we have all references
++		 *    Thus lock & if needed destroy shp.
++		 */
++		down_write(&shm_ids(ns).rwsem);
++		shm_lock_by_ptr(shp);
++		/*
++		 * rcu_read_lock was implicitly taken in shm_lock_by_ptr, it's
++		 * safe to call ipc_rcu_putref here
++		 */
++		ipc_rcu_putref(&shp->shm_perm, shm_rcu_free);
++
++		if (ipc_valid_object(&shp->shm_perm)) {
++			if (shm_may_destroy(shp))
++				shm_destroy(ns, shp);
++			else
++				shm_unlock(shp);
++		} else {
++			/*
++			 * Someone else deleted the shp from namespace
++			 * idr/kht while we have waited.
++			 * Just unlock and continue.
++			 */
++			shm_unlock(shp);
++		}
++
++		up_write(&shm_ids(ns).rwsem);
++		put_ipc_ns(ns); /* paired with get_ipc_ns_not_zero */
++	}
+ }
+ 
+ static vm_fault_t shm_fault(struct vm_fault *vmf)
+@@ -680,7 +772,11 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
+ 	if (error < 0)
+ 		goto no_id;
+ 
++	shp->ns = ns;
++
++	task_lock(current);
+ 	list_add(&shp->shm_clist, &current->sysvshm.shm_clist);
++	task_unlock(current);
+ 
+ 	/*
+ 	 * shmid gets reported as "inode#" in /proc/pid/maps.
+@@ -1573,7 +1669,8 @@ out_nattch:
+ 	down_write(&shm_ids(ns).rwsem);
+ 	shp = shm_lock(ns, shmid);
+ 	shp->shm_nattch--;
+-	if (shm_may_destroy(ns, shp))
++
++	if (shm_may_destroy(shp))
+ 		shm_destroy(ns, shp);
+ 	else
+ 		shm_unlock(shp);
+diff --git a/ipc/util.c b/ipc/util.c
+index d48d8cfa1f3fa..fa2d86ef3fb80 100644
+--- a/ipc/util.c
++++ b/ipc/util.c
+@@ -447,8 +447,8 @@ static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
+ static void ipc_kht_remove(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)
+ {
+ 	if (ipcp->key != IPC_PRIVATE)
+-		rhashtable_remove_fast(&ids->key_ht, &ipcp->khtnode,
+-				       ipc_kht_params);
++		WARN_ON_ONCE(rhashtable_remove_fast(&ids->key_ht, &ipcp->khtnode,
++				       ipc_kht_params));
+ }
+ 
+ /**
+@@ -498,7 +498,7 @@ void ipc_rmid(struct ipc_ids *ids, struct kern_ipc_perm *ipcp)
+ {
+ 	int idx = ipcid_to_idx(ipcp->id);
+ 
+-	idr_remove(&ids->ipcs_idr, idx);
++	WARN_ON_ONCE(idr_remove(&ids->ipcs_idr, idx) != ipcp);
+ 	ipc_kht_remove(ids, ipcp);
+ 	ids->in_use--;
+ 	ipcp->deleted = true;
+diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c
+index 03145d45e3d5b..7dbd68195a2b0 100644
+--- a/kernel/bpf/cgroup.c
++++ b/kernel/bpf/cgroup.c
+@@ -1773,6 +1773,8 @@ sysctl_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
+ 		return &bpf_sysctl_get_new_value_proto;
+ 	case BPF_FUNC_sysctl_set_new_value:
+ 		return &bpf_sysctl_set_new_value_proto;
++	case BPF_FUNC_ktime_get_coarse_ns:
++		return &bpf_ktime_get_coarse_ns_proto;
+ 	default:
+ 		return cgroup_base_func_proto(func_id, prog);
+ 	}
+diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
+index 9aabf84afd4b2..6f600cc95ccda 100644
+--- a/kernel/bpf/helpers.c
++++ b/kernel/bpf/helpers.c
+@@ -1367,8 +1367,6 @@ bpf_base_func_proto(enum bpf_func_id func_id)
+ 		return &bpf_ktime_get_ns_proto;
+ 	case BPF_FUNC_ktime_get_boot_ns:
+ 		return &bpf_ktime_get_boot_ns_proto;
+-	case BPF_FUNC_ktime_get_coarse_ns:
+-		return &bpf_ktime_get_coarse_ns_proto;
+ 	case BPF_FUNC_ringbuf_output:
+ 		return &bpf_ringbuf_output_proto;
+ 	case BPF_FUNC_ringbuf_reserve:
+diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
+index 1cad6979a0d0f..ecd51a8a8680c 100644
+--- a/kernel/bpf/syscall.c
++++ b/kernel/bpf/syscall.c
+@@ -132,6 +132,21 @@ static struct bpf_map *find_and_alloc_map(union bpf_attr *attr)
+ 	return map;
+ }
+ 
++static void bpf_map_write_active_inc(struct bpf_map *map)
++{
++	atomic64_inc(&map->writecnt);
++}
++
++static void bpf_map_write_active_dec(struct bpf_map *map)
++{
++	atomic64_dec(&map->writecnt);
++}
++
++bool bpf_map_write_active(const struct bpf_map *map)
++{
++	return atomic64_read(&map->writecnt) != 0;
++}
++
+ static u32 bpf_map_value_size(const struct bpf_map *map)
+ {
+ 	if (map->map_type == BPF_MAP_TYPE_PERCPU_HASH ||
+@@ -596,11 +611,8 @@ static void bpf_map_mmap_open(struct vm_area_struct *vma)
+ {
+ 	struct bpf_map *map = vma->vm_file->private_data;
+ 
+-	if (vma->vm_flags & VM_MAYWRITE) {
+-		mutex_lock(&map->freeze_mutex);
+-		map->writecnt++;
+-		mutex_unlock(&map->freeze_mutex);
+-	}
++	if (vma->vm_flags & VM_MAYWRITE)
++		bpf_map_write_active_inc(map);
+ }
+ 
+ /* called for all unmapped memory region (including initial) */
+@@ -608,11 +620,8 @@ static void bpf_map_mmap_close(struct vm_area_struct *vma)
+ {
+ 	struct bpf_map *map = vma->vm_file->private_data;
+ 
+-	if (vma->vm_flags & VM_MAYWRITE) {
+-		mutex_lock(&map->freeze_mutex);
+-		map->writecnt--;
+-		mutex_unlock(&map->freeze_mutex);
+-	}
++	if (vma->vm_flags & VM_MAYWRITE)
++		bpf_map_write_active_dec(map);
+ }
+ 
+ static const struct vm_operations_struct bpf_map_default_vmops = {
+@@ -663,7 +672,7 @@ static int bpf_map_mmap(struct file *filp, struct vm_area_struct *vma)
+ 		goto out;
+ 
+ 	if (vma->vm_flags & VM_MAYWRITE)
+-		map->writecnt++;
++		bpf_map_write_active_inc(map);
+ out:
+ 	mutex_unlock(&map->freeze_mutex);
+ 	return err;
+@@ -1122,6 +1131,7 @@ static int map_update_elem(union bpf_attr *attr, bpfptr_t uattr)
+ 	map = __bpf_map_get(f);
+ 	if (IS_ERR(map))
+ 		return PTR_ERR(map);
++	bpf_map_write_active_inc(map);
+ 	if (!(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
+ 		err = -EPERM;
+ 		goto err_put;
+@@ -1157,6 +1167,7 @@ free_value:
+ free_key:
+ 	kvfree(key);
+ err_put:
++	bpf_map_write_active_dec(map);
+ 	fdput(f);
+ 	return err;
+ }
+@@ -1179,6 +1190,7 @@ static int map_delete_elem(union bpf_attr *attr)
+ 	map = __bpf_map_get(f);
+ 	if (IS_ERR(map))
+ 		return PTR_ERR(map);
++	bpf_map_write_active_inc(map);
+ 	if (!(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
+ 		err = -EPERM;
+ 		goto err_put;
+@@ -1209,6 +1221,7 @@ static int map_delete_elem(union bpf_attr *attr)
+ out:
+ 	kvfree(key);
+ err_put:
++	bpf_map_write_active_dec(map);
+ 	fdput(f);
+ 	return err;
+ }
+@@ -1516,6 +1529,7 @@ static int map_lookup_and_delete_elem(union bpf_attr *attr)
+ 	map = __bpf_map_get(f);
+ 	if (IS_ERR(map))
+ 		return PTR_ERR(map);
++	bpf_map_write_active_inc(map);
+ 	if (!(map_get_sys_perms(map, f) & FMODE_CAN_READ) ||
+ 	    !(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
+ 		err = -EPERM;
+@@ -1580,6 +1594,7 @@ free_value:
+ free_key:
+ 	kvfree(key);
+ err_put:
++	bpf_map_write_active_dec(map);
+ 	fdput(f);
+ 	return err;
+ }
+@@ -1607,8 +1622,7 @@ static int map_freeze(const union bpf_attr *attr)
+ 	}
+ 
+ 	mutex_lock(&map->freeze_mutex);
+-
+-	if (map->writecnt) {
++	if (bpf_map_write_active(map)) {
+ 		err = -EBUSY;
+ 		goto err_put;
+ 	}
+@@ -4143,6 +4157,9 @@ static int bpf_map_do_batch(const union bpf_attr *attr,
+ 			    union bpf_attr __user *uattr,
+ 			    int cmd)
+ {
++	bool has_read  = cmd == BPF_MAP_LOOKUP_BATCH ||
++			 cmd == BPF_MAP_LOOKUP_AND_DELETE_BATCH;
++	bool has_write = cmd != BPF_MAP_LOOKUP_BATCH;
+ 	struct bpf_map *map;
+ 	int err, ufd;
+ 	struct fd f;
+@@ -4155,16 +4172,13 @@ static int bpf_map_do_batch(const union bpf_attr *attr,
+ 	map = __bpf_map_get(f);
+ 	if (IS_ERR(map))
+ 		return PTR_ERR(map);
+-
+-	if ((cmd == BPF_MAP_LOOKUP_BATCH ||
+-	     cmd == BPF_MAP_LOOKUP_AND_DELETE_BATCH) &&
+-	    !(map_get_sys_perms(map, f) & FMODE_CAN_READ)) {
++	if (has_write)
++		bpf_map_write_active_inc(map);
++	if (has_read && !(map_get_sys_perms(map, f) & FMODE_CAN_READ)) {
+ 		err = -EPERM;
+ 		goto err_put;
+ 	}
+-
+-	if (cmd != BPF_MAP_LOOKUP_BATCH &&
+-	    !(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
++	if (has_write && !(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
+ 		err = -EPERM;
+ 		goto err_put;
+ 	}
+@@ -4177,8 +4191,9 @@ static int bpf_map_do_batch(const union bpf_attr *attr,
+ 		BPF_DO_BATCH(map->ops->map_update_batch);
+ 	else
+ 		BPF_DO_BATCH(map->ops->map_delete_batch);
+-
+ err_put:
++	if (has_write)
++		bpf_map_write_active_dec(map);
+ 	fdput(f);
+ 	return err;
+ }
+diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
+index ddba80554fef3..390d5661cd708 100644
+--- a/kernel/bpf/verifier.c
++++ b/kernel/bpf/verifier.c
+@@ -1143,7 +1143,8 @@ static void mark_ptr_not_null_reg(struct bpf_reg_state *reg)
+ 			/* transfer reg's id which is unique for every map_lookup_elem
+ 			 * as UID of the inner map.
+ 			 */
+-			reg->map_uid = reg->id;
++			if (map_value_has_timer(map->inner_map_meta))
++				reg->map_uid = reg->id;
+ 		} else if (map->map_type == BPF_MAP_TYPE_XSKMAP) {
+ 			reg->type = PTR_TO_XDP_SOCK;
+ 		} else if (map->map_type == BPF_MAP_TYPE_SOCKMAP ||
+@@ -3884,7 +3885,22 @@ static void coerce_reg_to_size(struct bpf_reg_state *reg, int size)
+ 
+ static bool bpf_map_is_rdonly(const struct bpf_map *map)
+ {
+-	return (map->map_flags & BPF_F_RDONLY_PROG) && map->frozen;
++	/* A map is considered read-only if the following condition are true:
++	 *
++	 * 1) BPF program side cannot change any of the map content. The
++	 *    BPF_F_RDONLY_PROG flag is throughout the lifetime of a map
++	 *    and was set at map creation time.
++	 * 2) The map value(s) have been initialized from user space by a
++	 *    loader and then "frozen", such that no new map update/delete
++	 *    operations from syscall side are possible for the rest of
++	 *    the map's lifetime from that point onwards.
++	 * 3) Any parallel/pending map update/delete operations from syscall
++	 *    side have been completed. Only after that point, it's safe to
++	 *    assume that map value(s) are immutable.
++	 */
++	return (map->map_flags & BPF_F_RDONLY_PROG) &&
++	       READ_ONCE(map->frozen) &&
++	       !bpf_map_write_active(map);
+ }
+ 
+ static int bpf_map_direct_read(struct bpf_map *map, int off, int size, u64 *val)
+@@ -11435,6 +11451,13 @@ static int check_map_prog_compatibility(struct bpf_verifier_env *env,
+ 		}
+ 	}
+ 
++	if (map_value_has_timer(map)) {
++		if (is_tracing_prog_type(prog_type)) {
++			verbose(env, "tracing progs cannot use bpf_timer yet\n");
++			return -EINVAL;
++		}
++	}
++
+ 	if ((bpf_prog_is_dev_bound(prog->aux) || bpf_map_is_dev_bound(map)) &&
+ 	    !bpf_offload_prog_map_match(prog, map)) {
+ 		verbose(env, "offload device mismatch between prog and map\n");
+diff --git a/kernel/entry/syscall_user_dispatch.c b/kernel/entry/syscall_user_dispatch.c
+index c240302f56e23..0b6379adff6bd 100644
+--- a/kernel/entry/syscall_user_dispatch.c
++++ b/kernel/entry/syscall_user_dispatch.c
+@@ -47,14 +47,18 @@ bool syscall_user_dispatch(struct pt_regs *regs)
+ 		 * access_ok() is performed once, at prctl time, when
+ 		 * the selector is loaded by userspace.
+ 		 */
+-		if (unlikely(__get_user(state, sd->selector)))
+-			do_exit(SIGSEGV);
++		if (unlikely(__get_user(state, sd->selector))) {
++			force_exit_sig(SIGSEGV);
++			return true;
++		}
+ 
+ 		if (likely(state == SYSCALL_DISPATCH_FILTER_ALLOW))
+ 			return false;
+ 
+-		if (state != SYSCALL_DISPATCH_FILTER_BLOCK)
+-			do_exit(SIGSYS);
++		if (state != SYSCALL_DISPATCH_FILTER_BLOCK) {
++			force_exit_sig(SIGSYS);
++			return true;
++		}
+ 	}
+ 
+ 	sd->on_dispatch = true;
+diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
+index a8d0a58deebc7..99221b016c68b 100644
+--- a/kernel/printk/printk.c
++++ b/kernel/printk/printk.c
+@@ -3252,6 +3252,11 @@ void defer_console_output(void)
+ 	preempt_enable();
+ }
+ 
++void printk_trigger_flush(void)
++{
++	defer_console_output();
++}
++
+ int vprintk_deferred(const char *fmt, va_list args)
+ {
+ 	int r;
+diff --git a/kernel/sched/autogroup.c b/kernel/sched/autogroup.c
+index 2067080bb2358..8629b37d118e7 100644
+--- a/kernel/sched/autogroup.c
++++ b/kernel/sched/autogroup.c
+@@ -31,7 +31,7 @@ static inline void autogroup_destroy(struct kref *kref)
+ 	ag->tg->rt_se = NULL;
+ 	ag->tg->rt_rq = NULL;
+ #endif
+-	sched_offline_group(ag->tg);
++	sched_release_group(ag->tg);
+ 	sched_destroy_group(ag->tg);
+ }
+ 
+diff --git a/kernel/sched/core.c b/kernel/sched/core.c
+index aea60eae21a7f..779f27a4b46ac 100644
+--- a/kernel/sched/core.c
++++ b/kernel/sched/core.c
+@@ -3707,6 +3707,9 @@ out:
+ 
+ bool cpus_share_cache(int this_cpu, int that_cpu)
+ {
++	if (this_cpu == that_cpu)
++		return true;
++
+ 	return per_cpu(sd_llc_id, this_cpu) == per_cpu(sd_llc_id, that_cpu);
+ }
+ 
+@@ -9717,6 +9720,22 @@ static void sched_free_group(struct task_group *tg)
+ 	kmem_cache_free(task_group_cache, tg);
+ }
+ 
++static void sched_free_group_rcu(struct rcu_head *rcu)
++{
++	sched_free_group(container_of(rcu, struct task_group, rcu));
++}
++
++static void sched_unregister_group(struct task_group *tg)
++{
++	unregister_fair_sched_group(tg);
++	unregister_rt_sched_group(tg);
++	/*
++	 * We have to wait for yet another RCU grace period to expire, as
++	 * print_cfs_stats() might run concurrently.
++	 */
++	call_rcu(&tg->rcu, sched_free_group_rcu);
++}
++
+ /* allocate runqueue etc for a new task group */
+ struct task_group *sched_create_group(struct task_group *parent)
+ {
+@@ -9760,25 +9779,35 @@ void sched_online_group(struct task_group *tg, struct task_group *parent)
+ }
+ 
+ /* rcu callback to free various structures associated with a task group */
+-static void sched_free_group_rcu(struct rcu_head *rhp)
++static void sched_unregister_group_rcu(struct rcu_head *rhp)
+ {
+ 	/* Now it should be safe to free those cfs_rqs: */
+-	sched_free_group(container_of(rhp, struct task_group, rcu));
++	sched_unregister_group(container_of(rhp, struct task_group, rcu));
+ }
+ 
+ void sched_destroy_group(struct task_group *tg)
+ {
+ 	/* Wait for possible concurrent references to cfs_rqs complete: */
+-	call_rcu(&tg->rcu, sched_free_group_rcu);
++	call_rcu(&tg->rcu, sched_unregister_group_rcu);
+ }
+ 
+-void sched_offline_group(struct task_group *tg)
++void sched_release_group(struct task_group *tg)
+ {
+ 	unsigned long flags;
+ 
+-	/* End participation in shares distribution: */
+-	unregister_fair_sched_group(tg);
+-
++	/*
++	 * Unlink first, to avoid walk_tg_tree_from() from finding us (via
++	 * sched_cfs_period_timer()).
++	 *
++	 * For this to be effective, we have to wait for all pending users of
++	 * this task group to leave their RCU critical section to ensure no new
++	 * user will see our dying task group any more. Specifically ensure
++	 * that tg_unthrottle_up() won't add decayed cfs_rq's to it.
++	 *
++	 * We therefore defer calling unregister_fair_sched_group() to
++	 * sched_unregister_group() which is guarantied to get called only after the
++	 * current RCU grace period has expired.
++	 */
+ 	spin_lock_irqsave(&task_group_lock, flags);
+ 	list_del_rcu(&tg->list);
+ 	list_del_rcu(&tg->siblings);
+@@ -9897,7 +9926,7 @@ static void cpu_cgroup_css_released(struct cgroup_subsys_state *css)
+ {
+ 	struct task_group *tg = css_tg(css);
+ 
+-	sched_offline_group(tg);
++	sched_release_group(tg);
+ }
+ 
+ static void cpu_cgroup_css_free(struct cgroup_subsys_state *css)
+@@ -9907,7 +9936,7 @@ static void cpu_cgroup_css_free(struct cgroup_subsys_state *css)
+ 	/*
+ 	 * Relies on the RCU grace period between css_released() and this.
+ 	 */
+-	sched_free_group(tg);
++	sched_unregister_group(tg);
+ }
+ 
+ /*
+diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
+index f6a05d9b54436..6f16dfb742462 100644
+--- a/kernel/sched/fair.c
++++ b/kernel/sched/fair.c
+@@ -11358,8 +11358,6 @@ void free_fair_sched_group(struct task_group *tg)
+ {
+ 	int i;
+ 
+-	destroy_cfs_bandwidth(tg_cfs_bandwidth(tg));
+-
+ 	for_each_possible_cpu(i) {
+ 		if (tg->cfs_rq)
+ 			kfree(tg->cfs_rq[i]);
+@@ -11436,6 +11434,8 @@ void unregister_fair_sched_group(struct task_group *tg)
+ 	struct rq *rq;
+ 	int cpu;
+ 
++	destroy_cfs_bandwidth(tg_cfs_bandwidth(tg));
++
+ 	for_each_possible_cpu(cpu) {
+ 		if (tg->se[cpu])
+ 			remove_entity_load_avg(tg->se[cpu]);
+diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
+index 3daf42a0f4623..bfef3f39b5552 100644
+--- a/kernel/sched/rt.c
++++ b/kernel/sched/rt.c
+@@ -137,13 +137,17 @@ static inline struct rq *rq_of_rt_se(struct sched_rt_entity *rt_se)
+ 	return rt_rq->rq;
+ }
+ 
+-void free_rt_sched_group(struct task_group *tg)
++void unregister_rt_sched_group(struct task_group *tg)
+ {
+-	int i;
+-
+ 	if (tg->rt_se)
+ 		destroy_rt_bandwidth(&tg->rt_bandwidth);
+ 
++}
++
++void free_rt_sched_group(struct task_group *tg)
++{
++	int i;
++
+ 	for_each_possible_cpu(i) {
+ 		if (tg->rt_rq)
+ 			kfree(tg->rt_rq[i]);
+@@ -250,6 +254,8 @@ static inline struct rt_rq *rt_rq_of_se(struct sched_rt_entity *rt_se)
+ 	return &rq->rt;
+ }
+ 
++void unregister_rt_sched_group(struct task_group *tg) { }
++
+ void free_rt_sched_group(struct task_group *tg) { }
+ 
+ int alloc_rt_sched_group(struct task_group *tg, struct task_group *parent)
+diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
+index 3d3e5793e1172..4f432826933da 100644
+--- a/kernel/sched/sched.h
++++ b/kernel/sched/sched.h
+@@ -486,6 +486,7 @@ extern void __refill_cfs_bandwidth_runtime(struct cfs_bandwidth *cfs_b);
+ extern void start_cfs_bandwidth(struct cfs_bandwidth *cfs_b);
+ extern void unthrottle_cfs_rq(struct cfs_rq *cfs_rq);
+ 
++extern void unregister_rt_sched_group(struct task_group *tg);
+ extern void free_rt_sched_group(struct task_group *tg);
+ extern int alloc_rt_sched_group(struct task_group *tg, struct task_group *parent);
+ extern void init_tg_rt_entry(struct task_group *tg, struct rt_rq *rt_rq,
+@@ -501,7 +502,7 @@ extern struct task_group *sched_create_group(struct task_group *parent);
+ extern void sched_online_group(struct task_group *tg,
+ 			       struct task_group *parent);
+ extern void sched_destroy_group(struct task_group *tg);
+-extern void sched_offline_group(struct task_group *tg);
++extern void sched_release_group(struct task_group *tg);
+ 
+ extern void sched_move_task(struct task_struct *tsk);
+ 
+diff --git a/kernel/signal.c b/kernel/signal.c
+index ef46309a94093..5892c91696f84 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -1298,6 +1298,12 @@ int do_send_sig_info(int sig, struct kernel_siginfo *info, struct task_struct *p
+ 	return ret;
+ }
+ 
++enum sig_handler {
++	HANDLER_CURRENT, /* If reachable use the current handler */
++	HANDLER_SIG_DFL, /* Always use SIG_DFL handler semantics */
++	HANDLER_EXIT,	 /* Only visible as the process exit code */
++};
++
+ /*
+  * Force a signal that the process can't ignore: if necessary
+  * we unblock the signal and change any SIG_IGN to SIG_DFL.
+@@ -1310,7 +1316,8 @@ int do_send_sig_info(int sig, struct kernel_siginfo *info, struct task_struct *p
+  * that is why we also clear SIGNAL_UNKILLABLE.
+  */
+ static int
+-force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t, bool sigdfl)
++force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t,
++	enum sig_handler handler)
+ {
+ 	unsigned long int flags;
+ 	int ret, blocked, ignored;
+@@ -1321,9 +1328,10 @@ force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t, bool
+ 	action = &t->sighand->action[sig-1];
+ 	ignored = action->sa.sa_handler == SIG_IGN;
+ 	blocked = sigismember(&t->blocked, sig);
+-	if (blocked || ignored || sigdfl) {
++	if (blocked || ignored || (handler != HANDLER_CURRENT)) {
+ 		action->sa.sa_handler = SIG_DFL;
+-		action->sa.sa_flags |= SA_IMMUTABLE;
++		if (handler == HANDLER_EXIT)
++			action->sa.sa_flags |= SA_IMMUTABLE;
+ 		if (blocked) {
+ 			sigdelset(&t->blocked, sig);
+ 			recalc_sigpending_and_wake(t);
+@@ -1343,7 +1351,7 @@ force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t, bool
+ 
+ int force_sig_info(struct kernel_siginfo *info)
+ {
+-	return force_sig_info_to_task(info, current, false);
++	return force_sig_info_to_task(info, current, HANDLER_CURRENT);
+ }
+ 
+ /*
+@@ -1650,6 +1658,32 @@ void force_sig(int sig)
+ }
+ EXPORT_SYMBOL(force_sig);
+ 
++void force_fatal_sig(int sig)
++{
++	struct kernel_siginfo info;
++
++	clear_siginfo(&info);
++	info.si_signo = sig;
++	info.si_errno = 0;
++	info.si_code = SI_KERNEL;
++	info.si_pid = 0;
++	info.si_uid = 0;
++	force_sig_info_to_task(&info, current, HANDLER_SIG_DFL);
++}
++
++void force_exit_sig(int sig)
++{
++	struct kernel_siginfo info;
++
++	clear_siginfo(&info);
++	info.si_signo = sig;
++	info.si_errno = 0;
++	info.si_code = SI_KERNEL;
++	info.si_pid = 0;
++	info.si_uid = 0;
++	force_sig_info_to_task(&info, current, HANDLER_EXIT);
++}
++
+ /*
+  * When things go south during signal handling, we
+  * will force a SIGSEGV. And if the signal that caused
+@@ -1658,15 +1692,10 @@ EXPORT_SYMBOL(force_sig);
+  */
+ void force_sigsegv(int sig)
+ {
+-	struct task_struct *p = current;
+-
+-	if (sig == SIGSEGV) {
+-		unsigned long flags;
+-		spin_lock_irqsave(&p->sighand->siglock, flags);
+-		p->sighand->action[sig - 1].sa.sa_handler = SIG_DFL;
+-		spin_unlock_irqrestore(&p->sighand->siglock, flags);
+-	}
+-	force_sig(SIGSEGV);
++	if (sig == SIGSEGV)
++		force_fatal_sig(SIGSEGV);
++	else
++		force_sig(SIGSEGV);
+ }
+ 
+ int force_sig_fault_to_task(int sig, int code, void __user *addr
+@@ -1685,7 +1714,7 @@ int force_sig_fault_to_task(int sig, int code, void __user *addr
+ 	info.si_flags = flags;
+ 	info.si_isr = isr;
+ #endif
+-	return force_sig_info_to_task(&info, t, false);
++	return force_sig_info_to_task(&info, t, HANDLER_CURRENT);
+ }
+ 
+ int force_sig_fault(int sig, int code, void __user *addr
+@@ -1805,7 +1834,8 @@ int force_sig_seccomp(int syscall, int reason, bool force_coredump)
+ 	info.si_errno = reason;
+ 	info.si_arch = syscall_get_arch(current);
+ 	info.si_syscall = syscall;
+-	return force_sig_info_to_task(&info, current, force_coredump);
++	return force_sig_info_to_task(&info, current,
++		force_coredump ? HANDLER_EXIT : HANDLER_CURRENT);
+ }
+ 
+ /* For the crazy architectures that include trap information in
+diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
+index 8e2eb950aa829..6c1038526d1fc 100644
+--- a/kernel/trace/bpf_trace.c
++++ b/kernel/trace/bpf_trace.c
+@@ -1037,8 +1037,6 @@ bpf_tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
+ 		return &bpf_ktime_get_ns_proto;
+ 	case BPF_FUNC_ktime_get_boot_ns:
+ 		return &bpf_ktime_get_boot_ns_proto;
+-	case BPF_FUNC_ktime_get_coarse_ns:
+-		return &bpf_ktime_get_coarse_ns_proto;
+ 	case BPF_FUNC_tail_call:
+ 		return &bpf_tail_call_proto;
+ 	case BPF_FUNC_get_current_pid_tgid:
+diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
+index f01e442716e2f..d860351b9dea6 100644
+--- a/kernel/trace/trace_events_hist.c
++++ b/kernel/trace/trace_events_hist.c
+@@ -1733,9 +1733,10 @@ static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data,
+ 		if (!hist_field->type)
+ 			goto free;
+ 
+-		if (field->filter_type == FILTER_STATIC_STRING)
++		if (field->filter_type == FILTER_STATIC_STRING) {
+ 			hist_field->fn = hist_field_string;
+-		else if (field->filter_type == FILTER_DYN_STRING)
++			hist_field->size = field->size;
++		} else if (field->filter_type == FILTER_DYN_STRING)
+ 			hist_field->fn = hist_field_dynstring;
+ 		else
+ 			hist_field->fn = hist_field_pstring;
+@@ -2690,8 +2691,10 @@ static inline void __update_field_vars(struct tracing_map_elt *elt,
+ 		if (val->flags & HIST_FIELD_FL_STRING) {
+ 			char *str = elt_data->field_var_str[j++];
+ 			char *val_str = (char *)(uintptr_t)var_val;
++			unsigned int size;
+ 
+-			strscpy(str, val_str, STR_VAR_LEN_MAX);
++			size = min(val->size, STR_VAR_LEN_MAX);
++			strscpy(str, val_str, size);
+ 			var_val = (u64)(uintptr_t)str;
+ 		}
+ 		tracing_map_set_var(elt, var_idx, var_val);
+@@ -4578,6 +4581,7 @@ static void hist_trigger_elt_update(struct hist_trigger_data *hist_data,
+ 			if (hist_field->flags & HIST_FIELD_FL_STRING) {
+ 				unsigned int str_start, var_str_idx, idx;
+ 				char *str, *val_str;
++				unsigned int size;
+ 
+ 				str_start = hist_data->n_field_var_str +
+ 					hist_data->n_save_var_str;
+@@ -4586,7 +4590,9 @@ static void hist_trigger_elt_update(struct hist_trigger_data *hist_data,
+ 
+ 				str = elt_data->field_var_str[idx];
+ 				val_str = (char *)(uintptr_t)hist_val;
+-				strscpy(str, val_str, STR_VAR_LEN_MAX);
++
++				size = min(hist_field->size, STR_VAR_LEN_MAX);
++				strscpy(str, val_str, size);
+ 
+ 				hist_val = (u64)(uintptr_t)str;
+ 			}
+diff --git a/lib/nmi_backtrace.c b/lib/nmi_backtrace.c
+index f9e89001b52eb..199ab201d5019 100644
+--- a/lib/nmi_backtrace.c
++++ b/lib/nmi_backtrace.c
+@@ -75,6 +75,12 @@ void nmi_trigger_cpumask_backtrace(const cpumask_t *mask,
+ 		touch_softlockup_watchdog();
+ 	}
+ 
++	/*
++	 * Force flush any remote buffers that might be stuck in IRQ context
++	 * and therefore could not run their irq_work.
++	 */
++	printk_trigger_flush();
++
+ 	clear_bit_unlock(0, &backtrace_flag);
+ 	put_cpu();
+ }
+diff --git a/mm/Kconfig b/mm/Kconfig
+index d16ba9249bc53..c048dea7e3420 100644
+--- a/mm/Kconfig
++++ b/mm/Kconfig
+@@ -887,6 +887,9 @@ config MAPPING_DIRTY_HELPERS
+ config KMAP_LOCAL
+ 	bool
+ 
++config KMAP_LOCAL_NON_LINEAR_PTE_ARRAY
++	bool
++
+ # struct io_mapping based helper.  Selected by drivers that need them
+ config IO_MAPPING
+ 	bool
+diff --git a/mm/damon/dbgfs.c b/mm/damon/dbgfs.c
+index faee070977d80..f94d19a690dfa 100644
+--- a/mm/damon/dbgfs.c
++++ b/mm/damon/dbgfs.c
+@@ -32,7 +32,7 @@ static char *user_input_str(const char __user *buf, size_t count, loff_t *ppos)
+ 	if (*ppos)
+ 		return ERR_PTR(-EINVAL);
+ 
+-	kbuf = kmalloc(count + 1, GFP_KERNEL);
++	kbuf = kmalloc(count + 1, GFP_KERNEL | __GFP_NOWARN);
+ 	if (!kbuf)
+ 		return ERR_PTR(-ENOMEM);
+ 
+@@ -247,7 +247,7 @@ static ssize_t dbgfs_kdamond_pid_read(struct file *file,
+ 	char *kbuf;
+ 	ssize_t len;
+ 
+-	kbuf = kmalloc(count, GFP_KERNEL);
++	kbuf = kmalloc(count, GFP_KERNEL | __GFP_NOWARN);
+ 	if (!kbuf)
+ 		return -ENOMEM;
+ 
+@@ -538,12 +538,14 @@ static ssize_t dbgfs_monitor_on_write(struct file *file,
+ 		return -EINVAL;
+ 	}
+ 
++	mutex_lock(&damon_dbgfs_lock);
+ 	if (!strncmp(kbuf, "on", count))
+ 		err = damon_start(dbgfs_ctxs, dbgfs_nr_ctxs);
+ 	else if (!strncmp(kbuf, "off", count))
+ 		err = damon_stop(dbgfs_ctxs, dbgfs_nr_ctxs);
+ 	else
+ 		err = -EINVAL;
++	mutex_unlock(&damon_dbgfs_lock);
+ 
+ 	if (err)
+ 		ret = err;
+@@ -596,15 +598,16 @@ static int __init __damon_dbgfs_init(void)
+ 
+ static int __init damon_dbgfs_init(void)
+ {
+-	int rc;
++	int rc = -ENOMEM;
+ 
++	mutex_lock(&damon_dbgfs_lock);
+ 	dbgfs_ctxs = kmalloc(sizeof(*dbgfs_ctxs), GFP_KERNEL);
+ 	if (!dbgfs_ctxs)
+-		return -ENOMEM;
++		goto out;
+ 	dbgfs_ctxs[0] = dbgfs_new_ctx();
+ 	if (!dbgfs_ctxs[0]) {
+ 		kfree(dbgfs_ctxs);
+-		return -ENOMEM;
++		goto out;
+ 	}
+ 	dbgfs_nr_ctxs = 1;
+ 
+@@ -615,6 +618,8 @@ static int __init damon_dbgfs_init(void)
+ 		pr_err("%s: dbgfs init failed\n", __func__);
+ 	}
+ 
++out:
++	mutex_unlock(&damon_dbgfs_lock);
+ 	return rc;
+ }
+ 
+diff --git a/mm/highmem.c b/mm/highmem.c
+index 4212ad0e4a195..1f0c8a52fd807 100644
+--- a/mm/highmem.c
++++ b/mm/highmem.c
+@@ -504,16 +504,22 @@ static inline int kmap_local_calc_idx(int idx)
+ 
+ static pte_t *__kmap_pte;
+ 
+-static pte_t *kmap_get_pte(void)
++static pte_t *kmap_get_pte(unsigned long vaddr, int idx)
+ {
++	if (IS_ENABLED(CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY))
++		/*
++		 * Set by the arch if __kmap_pte[-idx] does not produce
++		 * the correct entry.
++		 */
++		return virt_to_kpte(vaddr);
+ 	if (!__kmap_pte)
+ 		__kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN));
+-	return __kmap_pte;
++	return &__kmap_pte[-idx];
+ }
+ 
+ void *__kmap_local_pfn_prot(unsigned long pfn, pgprot_t prot)
+ {
+-	pte_t pteval, *kmap_pte = kmap_get_pte();
++	pte_t pteval, *kmap_pte;
+ 	unsigned long vaddr;
+ 	int idx;
+ 
+@@ -525,9 +531,10 @@ void *__kmap_local_pfn_prot(unsigned long pfn, pgprot_t prot)
+ 	preempt_disable();
+ 	idx = arch_kmap_local_map_idx(kmap_local_idx_push(), pfn);
+ 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
+-	BUG_ON(!pte_none(*(kmap_pte - idx)));
++	kmap_pte = kmap_get_pte(vaddr, idx);
++	BUG_ON(!pte_none(*kmap_pte));
+ 	pteval = pfn_pte(pfn, prot);
+-	arch_kmap_local_set_pte(&init_mm, vaddr, kmap_pte - idx, pteval);
++	arch_kmap_local_set_pte(&init_mm, vaddr, kmap_pte, pteval);
+ 	arch_kmap_local_post_map(vaddr, pteval);
+ 	current->kmap_ctrl.pteval[kmap_local_idx()] = pteval;
+ 	preempt_enable();
+@@ -560,7 +567,7 @@ EXPORT_SYMBOL(__kmap_local_page_prot);
+ void kunmap_local_indexed(void *vaddr)
+ {
+ 	unsigned long addr = (unsigned long) vaddr & PAGE_MASK;
+-	pte_t *kmap_pte = kmap_get_pte();
++	pte_t *kmap_pte;
+ 	int idx;
+ 
+ 	if (addr < __fix_to_virt(FIX_KMAP_END) ||
+@@ -585,8 +592,9 @@ void kunmap_local_indexed(void *vaddr)
+ 	idx = arch_kmap_local_unmap_idx(kmap_local_idx(), addr);
+ 	WARN_ON_ONCE(addr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
+ 
++	kmap_pte = kmap_get_pte(addr, idx);
+ 	arch_kmap_local_pre_unmap(addr);
+-	pte_clear(&init_mm, addr, kmap_pte - idx);
++	pte_clear(&init_mm, addr, kmap_pte);
+ 	arch_kmap_local_post_unmap(addr);
+ 	current->kmap_ctrl.pteval[kmap_local_idx()] = __pte(0);
+ 	kmap_local_idx_pop();
+@@ -608,7 +616,7 @@ EXPORT_SYMBOL(kunmap_local_indexed);
+ void __kmap_local_sched_out(void)
+ {
+ 	struct task_struct *tsk = current;
+-	pte_t *kmap_pte = kmap_get_pte();
++	pte_t *kmap_pte;
+ 	int i;
+ 
+ 	/* Clear kmaps */
+@@ -635,8 +643,9 @@ void __kmap_local_sched_out(void)
+ 		idx = arch_kmap_local_map_idx(i, pte_pfn(pteval));
+ 
+ 		addr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
++		kmap_pte = kmap_get_pte(addr, idx);
+ 		arch_kmap_local_pre_unmap(addr);
+-		pte_clear(&init_mm, addr, kmap_pte - idx);
++		pte_clear(&init_mm, addr, kmap_pte);
+ 		arch_kmap_local_post_unmap(addr);
+ 	}
+ }
+@@ -644,7 +653,7 @@ void __kmap_local_sched_out(void)
+ void __kmap_local_sched_in(void)
+ {
+ 	struct task_struct *tsk = current;
+-	pte_t *kmap_pte = kmap_get_pte();
++	pte_t *kmap_pte;
+ 	int i;
+ 
+ 	/* Restore kmaps */
+@@ -664,7 +673,8 @@ void __kmap_local_sched_in(void)
+ 		/* See comment in __kmap_local_sched_out() */
+ 		idx = arch_kmap_local_map_idx(i, pte_pfn(pteval));
+ 		addr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
+-		set_pte_at(&init_mm, addr, kmap_pte - idx, pteval);
++		kmap_pte = kmap_get_pte(addr, idx);
++		set_pte_at(&init_mm, addr, kmap_pte, pteval);
+ 		arch_kmap_local_post_map(addr, pteval);
+ 	}
+ }
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 95dc7b83381f9..f5ed98843557b 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -4439,6 +4439,7 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
+ 	struct hstate *h = hstate_vma(vma);
+ 	unsigned long sz = huge_page_size(h);
+ 	struct mmu_notifier_range range;
++	bool force_flush = false;
+ 
+ 	WARN_ON(!is_vm_hugetlb_page(vma));
+ 	BUG_ON(start & ~huge_page_mask(h));
+@@ -4467,10 +4468,8 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
+ 		ptl = huge_pte_lock(h, mm, ptep);
+ 		if (huge_pmd_unshare(mm, vma, &address, ptep)) {
+ 			spin_unlock(ptl);
+-			/*
+-			 * We just unmapped a page of PMDs by clearing a PUD.
+-			 * The caller's TLB flush range should cover this area.
+-			 */
++			tlb_flush_pmd_range(tlb, address & PUD_MASK, PUD_SIZE);
++			force_flush = true;
+ 			continue;
+ 		}
+ 
+@@ -4527,6 +4526,22 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
+ 	}
+ 	mmu_notifier_invalidate_range_end(&range);
+ 	tlb_end_vma(tlb, vma);
++
++	/*
++	 * If we unshared PMDs, the TLB flush was not recorded in mmu_gather. We
++	 * could defer the flush until now, since by holding i_mmap_rwsem we
++	 * guaranteed that the last refernece would not be dropped. But we must
++	 * do the flushing before we return, as otherwise i_mmap_rwsem will be
++	 * dropped and the last reference to the shared PMDs page might be
++	 * dropped as well.
++	 *
++	 * In theory we could defer the freeing of the PMD pages as well, but
++	 * huge_pmd_unshare() relies on the exact page_count for the PMD page to
++	 * detect sharing, so we cannot defer the release of the page either.
++	 * Instead, do flush now.
++	 */
++	if (force_flush)
++		tlb_flush_mmu_tlbonly(tlb);
+ }
+ 
+ void __unmap_hugepage_range_final(struct mmu_gather *tlb,
+@@ -5236,13 +5251,14 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm,
+ 	int ret = -ENOMEM;
+ 	struct page *page;
+ 	int writable;
+-	bool new_pagecache_page = false;
++	bool page_in_pagecache = false;
+ 
+ 	if (is_continue) {
+ 		ret = -EFAULT;
+ 		page = find_lock_page(mapping, idx);
+ 		if (!page)
+ 			goto out;
++		page_in_pagecache = true;
+ 	} else if (!*pagep) {
+ 		/* If a page already exists, then it's UFFDIO_COPY for
+ 		 * a non-missing case. Return -EEXIST.
+@@ -5330,7 +5346,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm,
+ 		ret = huge_add_to_page_cache(page, mapping, idx);
+ 		if (ret)
+ 			goto out_release_nounlock;
+-		new_pagecache_page = true;
++		page_in_pagecache = true;
+ 	}
+ 
+ 	ptl = huge_pte_lockptr(h, dst_mm, dst_pte);
+@@ -5394,7 +5410,7 @@ out_release_unlock:
+ 	if (vm_shared || is_continue)
+ 		unlock_page(page);
+ out_release_nounlock:
+-	if (!new_pagecache_page)
++	if (!page_in_pagecache)
+ 		restore_reserve_on_error(h, dst_vma, dst_addr, page);
+ 	put_page(page);
+ 	goto out;
+diff --git a/mm/slab.h b/mm/slab.h
+index 58c01a34e5b86..56ad7eea3ddfb 100644
+--- a/mm/slab.h
++++ b/mm/slab.h
+@@ -147,7 +147,7 @@ static inline slab_flags_t kmem_cache_flags(unsigned int object_size,
+ #define SLAB_CACHE_FLAGS (SLAB_NOLEAKTRACE | SLAB_RECLAIM_ACCOUNT | \
+ 			  SLAB_TEMPORARY | SLAB_ACCOUNT)
+ #else
+-#define SLAB_CACHE_FLAGS (0)
++#define SLAB_CACHE_FLAGS (SLAB_NOLEAKTRACE)
+ #endif
+ 
+ /* Common flags available with current configuration */
+diff --git a/net/core/filter.c b/net/core/filter.c
+index f4a63af45f008..1e6831880d1fd 100644
+--- a/net/core/filter.c
++++ b/net/core/filter.c
+@@ -7162,6 +7162,8 @@ sock_filter_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
+ #endif
+ 	case BPF_FUNC_sk_storage_get:
+ 		return &bpf_sk_storage_get_cg_sock_proto;
++	case BPF_FUNC_ktime_get_coarse_ns:
++		return &bpf_ktime_get_coarse_ns_proto;
+ 	default:
+ 		return bpf_base_func_proto(func_id);
+ 	}
+@@ -10306,6 +10308,8 @@ sk_reuseport_func_proto(enum bpf_func_id func_id,
+ 		return &sk_reuseport_load_bytes_relative_proto;
+ 	case BPF_FUNC_get_socket_cookie:
+ 		return &bpf_get_socket_ptr_cookie_proto;
++	case BPF_FUNC_ktime_get_coarse_ns:
++		return &bpf_ktime_get_coarse_ns_proto;
+ 	default:
+ 		return bpf_base_func_proto(func_id);
+ 	}
+@@ -10787,6 +10791,8 @@ bpf_sk_base_func_proto(enum bpf_func_id func_id)
+ 	case BPF_FUNC_skc_to_udp6_sock:
+ 		func = &bpf_skc_to_udp6_sock_proto;
+ 		break;
++	case BPF_FUNC_ktime_get_coarse_ns:
++		return &bpf_ktime_get_coarse_ns_proto;
+ 	default:
+ 		return bpf_base_func_proto(func_id);
+ 	}
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index fe9358437380c..38d7dee4bbe9e 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -3449,19 +3449,7 @@ EXPORT_SYMBOL(skb_split);
+  */
+ static int skb_prepare_for_shift(struct sk_buff *skb)
+ {
+-	int ret = 0;
+-
+-	if (skb_cloned(skb)) {
+-		/* Save and restore truesize: pskb_expand_head() may reallocate
+-		 * memory where ksize(kmalloc(S)) != ksize(kmalloc(S)), but we
+-		 * cannot change truesize at this point.
+-		 */
+-		unsigned int save_truesize = skb->truesize;
+-
+-		ret = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
+-		skb->truesize = save_truesize;
+-	}
+-	return ret;
++	return skb_unclone_keeptruesize(skb, GFP_ATOMIC);
+ }
+ 
+ /**
+diff --git a/net/core/sock.c b/net/core/sock.c
+index c1601f75ec4b3..1b31e10181629 100644
+--- a/net/core/sock.c
++++ b/net/core/sock.c
+@@ -2043,8 +2043,10 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
+ 	newsk->sk_prot_creator = prot;
+ 
+ 	/* SANITY */
+-	if (likely(newsk->sk_net_refcnt))
++	if (likely(newsk->sk_net_refcnt)) {
+ 		get_net(sock_net(newsk));
++		sock_inuse_add(sock_net(newsk), 1);
++	}
+ 	sk_node_init(&newsk->sk_node);
+ 	sock_lock_init(newsk);
+ 	bh_lock_sock(newsk);
+@@ -2115,8 +2117,6 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
+ 	newsk->sk_err_soft = 0;
+ 	newsk->sk_priority = 0;
+ 	newsk->sk_incoming_cpu = raw_smp_processor_id();
+-	if (likely(newsk->sk_net_refcnt))
+-		sock_inuse_add(sock_net(newsk), 1);
+ 
+ 	/* Before updating sk_refcnt, we must commit prior changes to memory
+ 	 * (Documentation/RCU/rculist_nulls.rst for details)
+diff --git a/net/ipv4/bpf_tcp_ca.c b/net/ipv4/bpf_tcp_ca.c
+index 0dcee9df13268..d3a2dbd13ea6b 100644
+--- a/net/ipv4/bpf_tcp_ca.c
++++ b/net/ipv4/bpf_tcp_ca.c
+@@ -212,6 +212,8 @@ bpf_tcp_ca_get_func_proto(enum bpf_func_id func_id,
+ 		    offsetof(struct tcp_congestion_ops, release))
+ 			return &bpf_sk_getsockopt_proto;
+ 		return NULL;
++	case BPF_FUNC_ktime_get_coarse_ns:
++		return &bpf_ktime_get_coarse_ns_proto;
+ 	default:
+ 		return bpf_base_func_proto(func_id);
+ 	}
+diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
+index 8affba5909bdf..844c6e5a82891 100644
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -1776,6 +1776,9 @@ static skb_frag_t *skb_advance_to_frag(struct sk_buff *skb, u32 offset_skb,
+ {
+ 	skb_frag_t *frag;
+ 
++	if (unlikely(offset_skb >= skb->len))
++		return NULL;
++
+ 	offset_skb -= skb_headlen(skb);
+ 	if ((int)offset_skb < 0 || skb_has_frag_list(skb))
+ 		return NULL;
+diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
+index 6d72f3ea48c4e..0492f6942778d 100644
+--- a/net/ipv4/tcp_output.c
++++ b/net/ipv4/tcp_output.c
+@@ -1562,7 +1562,7 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue,
+ 		return -ENOMEM;
+ 	}
+ 
+-	if (skb_unclone(skb, gfp))
++	if (skb_unclone_keeptruesize(skb, gfp))
+ 		return -ENOMEM;
+ 
+ 	/* Get a new skb... force flag on. */
+@@ -1672,7 +1672,7 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
+ {
+ 	u32 delta_truesize;
+ 
+-	if (skb_unclone(skb, GFP_ATOMIC))
++	if (skb_unclone_keeptruesize(skb, GFP_ATOMIC))
+ 		return -ENOMEM;
+ 
+ 	delta_truesize = __pskb_trim_head(skb, len);
+@@ -3184,7 +3184,7 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs)
+ 				 cur_mss, GFP_ATOMIC))
+ 			return -ENOMEM; /* We'll try again later. */
+ 	} else {
+-		if (skb_unclone(skb, GFP_ATOMIC))
++		if (skb_unclone_keeptruesize(skb, GFP_ATOMIC))
+ 			return -ENOMEM;
+ 
+ 		diff = tcp_skb_pcount(skb);
+diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
+index 2fffcf2b54f3f..2ce3fca545d37 100644
+--- a/net/ipv4/udp.c
++++ b/net/ipv4/udp.c
+@@ -1808,6 +1808,17 @@ int udp_read_sock(struct sock *sk, read_descriptor_t *desc,
+ 		skb = skb_recv_udp(sk, 0, 1, &err);
+ 		if (!skb)
+ 			return err;
++
++		if (udp_lib_checksum_complete(skb)) {
++			__UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS,
++					IS_UDPLITE(sk));
++			__UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS,
++					IS_UDPLITE(sk));
++			atomic_inc(&sk->sk_drops);
++			kfree_skb(skb);
++			continue;
++		}
++
+ 		used = recv_actor(desc, skb, 0, skb->len);
+ 		if (used <= 0) {
+ 			if (!copied)
+diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
+index d69b31c20fe28..d3f62fd12f0b5 100644
+--- a/net/mac80211/cfg.c
++++ b/net/mac80211/cfg.c
+@@ -80,7 +80,8 @@ static int ieee80211_set_mon_options(struct ieee80211_sub_if_data *sdata,
+ 	}
+ 
+ 	/* also validate MU-MIMO change */
+-	monitor_sdata = rtnl_dereference(local->monitor_sdata);
++	monitor_sdata = wiphy_dereference(local->hw.wiphy,
++					  local->monitor_sdata);
+ 
+ 	if (!monitor_sdata &&
+ 	    (params->vht_mumimo_groups || params->vht_mumimo_follow_addr))
+@@ -810,7 +811,8 @@ static int ieee80211_set_monitor_channel(struct wiphy *wiphy,
+ 
+ 	mutex_lock(&local->mtx);
+ 	if (local->use_chanctx) {
+-		sdata = rtnl_dereference(local->monitor_sdata);
++		sdata = wiphy_dereference(local->hw.wiphy,
++					  local->monitor_sdata);
+ 		if (sdata) {
+ 			ieee80211_vif_release_channel(sdata);
+ 			ret = ieee80211_vif_use_channel(sdata, chandef,
+@@ -2669,7 +2671,8 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
+ 		sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
+ 
+ 		if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
+-			sdata = rtnl_dereference(local->monitor_sdata);
++			sdata = wiphy_dereference(local->hw.wiphy,
++						  local->monitor_sdata);
+ 			if (!sdata)
+ 				return -EOPNOTSUPP;
+ 		}
+@@ -2729,7 +2732,8 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
+ 	mutex_unlock(&local->iflist_mtx);
+ 
+ 	if (has_monitor) {
+-		sdata = rtnl_dereference(local->monitor_sdata);
++		sdata = wiphy_dereference(local->hw.wiphy,
++					  local->monitor_sdata);
+ 		if (sdata) {
+ 			sdata->user_power_level = local->user_power_level;
+ 			if (txp_type != sdata->vif.bss_conf.txpower_type)
+diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
+index 62c95597704b4..041859b5b71d0 100644
+--- a/net/mac80211/iface.c
++++ b/net/mac80211/iface.c
+@@ -588,7 +588,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
+ 	 */
+ 	if (local->suspended) {
+ 		WARN_ON(local->wowlan);
+-		WARN_ON(rtnl_dereference(local->monitor_sdata));
++		WARN_ON(rcu_access_pointer(local->monitor_sdata));
+ 		return;
+ 	}
+ 
+@@ -932,6 +932,7 @@ int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
+ 		return 0;
+ 
+ 	ASSERT_RTNL();
++	lockdep_assert_wiphy(local->hw.wiphy);
+ 
+ 	if (local->monitor_sdata)
+ 		return 0;
+@@ -999,6 +1000,7 @@ void ieee80211_del_virtual_monitor(struct ieee80211_local *local)
+ 		return;
+ 
+ 	ASSERT_RTNL();
++	lockdep_assert_wiphy(local->hw.wiphy);
+ 
+ 	mutex_lock(&local->iflist_mtx);
+ 
+diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
+index c4071b015c188..419f06ef8c986 100644
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -364,7 +364,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,
+ 	 * the compiler to think we have walked past the end of the
+ 	 * struct member.
+ 	 */
+-	pos = (void *)&rthdr->it_optional[it_present - rthdr->it_optional];
++	pos = (void *)&rthdr->it_optional[it_present + 1 - rthdr->it_optional];
+ 
+ 	/* the order of the following fields is important */
+ 
+diff --git a/net/mac80211/util.c b/net/mac80211/util.c
+index 49cb96d251695..03ea4f929b997 100644
+--- a/net/mac80211/util.c
++++ b/net/mac80211/util.c
+@@ -796,7 +796,7 @@ static void __iterate_interfaces(struct ieee80211_local *local,
+ 
+ 	sdata = rcu_dereference_check(local->monitor_sdata,
+ 				      lockdep_is_held(&local->iflist_mtx) ||
+-				      lockdep_rtnl_is_held());
++				      lockdep_is_held(&local->hw.wiphy->mtx));
+ 	if (sdata &&
+ 	    (iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL || !active_only ||
+ 	     sdata->flags & IEEE80211_SDATA_IN_DRIVER))
+@@ -2379,7 +2379,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
+ 				   IEEE80211_TPT_LEDTRIG_FL_RADIO, 0);
+ 
+ 	/* add interfaces */
+-	sdata = rtnl_dereference(local->monitor_sdata);
++	sdata = wiphy_dereference(local->hw.wiphy, local->monitor_sdata);
+ 	if (sdata) {
+ 		/* in HW restart it exists already */
+ 		WARN_ON(local->resuming);
+@@ -2424,7 +2424,8 @@ int ieee80211_reconfig(struct ieee80211_local *local)
+ 				WARN_ON(drv_add_chanctx(local, ctx));
+ 		mutex_unlock(&local->chanctx_mtx);
+ 
+-		sdata = rtnl_dereference(local->monitor_sdata);
++		sdata = wiphy_dereference(local->hw.wiphy,
++					  local->monitor_sdata);
+ 		if (sdata && ieee80211_sdata_running(sdata))
+ 			ieee80211_assign_chanctx(local, sdata);
+ 	}
+diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c
+index 9ea6004abe1be..62c6733e07923 100644
+--- a/net/mac80211/wme.c
++++ b/net/mac80211/wme.c
+@@ -143,7 +143,6 @@ u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
+ u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
+ 			     struct sta_info *sta, struct sk_buff *skb)
+ {
+-	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+ 	struct mac80211_qos_map *qos_map;
+ 	bool qos;
+ 
+@@ -156,7 +155,7 @@ u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
+ 	else
+ 		qos = false;
+ 
+-	if (!qos || (info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER)) {
++	if (!qos) {
+ 		skb->priority = 0; /* required for correct WPA/11i MIC */
+ 		return IEEE80211_AC_BE;
+ 	}
+diff --git a/net/nfc/core.c b/net/nfc/core.c
+index 3c645c1d99c9b..dc7a2404efdf9 100644
+--- a/net/nfc/core.c
++++ b/net/nfc/core.c
+@@ -94,13 +94,13 @@ int nfc_dev_up(struct nfc_dev *dev)
+ 
+ 	device_lock(&dev->dev);
+ 
+-	if (dev->rfkill && rfkill_blocked(dev->rfkill)) {
+-		rc = -ERFKILL;
++	if (!device_is_registered(&dev->dev)) {
++		rc = -ENODEV;
+ 		goto error;
+ 	}
+ 
+-	if (!device_is_registered(&dev->dev)) {
+-		rc = -ENODEV;
++	if (dev->rfkill && rfkill_blocked(dev->rfkill)) {
++		rc = -ERFKILL;
+ 		goto error;
+ 	}
+ 
+@@ -1125,11 +1125,7 @@ int nfc_register_device(struct nfc_dev *dev)
+ 	if (rc)
+ 		pr_err("Could not register llcp device\n");
+ 
+-	rc = nfc_genl_device_added(dev);
+-	if (rc)
+-		pr_debug("The userspace won't be notified that the device %s was added\n",
+-			 dev_name(&dev->dev));
+-
++	device_lock(&dev->dev);
+ 	dev->rfkill = rfkill_alloc(dev_name(&dev->dev), &dev->dev,
+ 				   RFKILL_TYPE_NFC, &nfc_rfkill_ops, dev);
+ 	if (dev->rfkill) {
+@@ -1138,6 +1134,12 @@ int nfc_register_device(struct nfc_dev *dev)
+ 			dev->rfkill = NULL;
+ 		}
+ 	}
++	device_unlock(&dev->dev);
++
++	rc = nfc_genl_device_added(dev);
++	if (rc)
++		pr_debug("The userspace won't be notified that the device %s was added\n",
++			 dev_name(&dev->dev));
+ 
+ 	return 0;
+ }
+@@ -1154,10 +1156,17 @@ void nfc_unregister_device(struct nfc_dev *dev)
+ 
+ 	pr_debug("dev_name=%s\n", dev_name(&dev->dev));
+ 
++	rc = nfc_genl_device_removed(dev);
++	if (rc)
++		pr_debug("The userspace won't be notified that the device %s "
++			 "was removed\n", dev_name(&dev->dev));
++
++	device_lock(&dev->dev);
+ 	if (dev->rfkill) {
+ 		rfkill_unregister(dev->rfkill);
+ 		rfkill_destroy(dev->rfkill);
+ 	}
++	device_unlock(&dev->dev);
+ 
+ 	if (dev->ops->check_presence) {
+ 		device_lock(&dev->dev);
+@@ -1167,11 +1176,6 @@ void nfc_unregister_device(struct nfc_dev *dev)
+ 		cancel_work_sync(&dev->check_pres_work);
+ 	}
+ 
+-	rc = nfc_genl_device_removed(dev);
+-	if (rc)
+-		pr_debug("The userspace won't be notified that the device %s "
+-			 "was removed\n", dev_name(&dev->dev));
+-
+ 	nfc_llcp_unregister_device(dev);
+ 
+ 	mutex_lock(&nfc_devlist_mutex);
+diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
+index 82ab39d80726e..e41e2e9e54984 100644
+--- a/net/nfc/nci/core.c
++++ b/net/nfc/nci/core.c
+@@ -144,12 +144,15 @@ inline int nci_request(struct nci_dev *ndev,
+ {
+ 	int rc;
+ 
+-	if (!test_bit(NCI_UP, &ndev->flags))
+-		return -ENETDOWN;
+-
+ 	/* Serialize all requests */
+ 	mutex_lock(&ndev->req_lock);
+-	rc = __nci_request(ndev, req, opt, timeout);
++	/* check the state after obtaing the lock against any races
++	 * from nci_close_device when the device gets removed.
++	 */
++	if (test_bit(NCI_UP, &ndev->flags))
++		rc = __nci_request(ndev, req, opt, timeout);
++	else
++		rc = -ENETDOWN;
+ 	mutex_unlock(&ndev->req_lock);
+ 
+ 	return rc;
+@@ -473,6 +476,11 @@ static int nci_open_device(struct nci_dev *ndev)
+ 
+ 	mutex_lock(&ndev->req_lock);
+ 
++	if (test_bit(NCI_UNREG, &ndev->flags)) {
++		rc = -ENODEV;
++		goto done;
++	}
++
+ 	if (test_bit(NCI_UP, &ndev->flags)) {
+ 		rc = -EALREADY;
+ 		goto done;
+@@ -545,6 +553,10 @@ done:
+ static int nci_close_device(struct nci_dev *ndev)
+ {
+ 	nci_req_cancel(ndev, ENODEV);
++
++	/* This mutex needs to be held as a barrier for
++	 * caller nci_unregister_device
++	 */
+ 	mutex_lock(&ndev->req_lock);
+ 
+ 	if (!test_and_clear_bit(NCI_UP, &ndev->flags)) {
+@@ -582,8 +594,8 @@ static int nci_close_device(struct nci_dev *ndev)
+ 
+ 	del_timer_sync(&ndev->cmd_timer);
+ 
+-	/* Clear flags */
+-	ndev->flags = 0;
++	/* Clear flags except NCI_UNREG */
++	ndev->flags &= BIT(NCI_UNREG);
+ 
+ 	mutex_unlock(&ndev->req_lock);
+ 
+@@ -1270,6 +1282,12 @@ void nci_unregister_device(struct nci_dev *ndev)
+ {
+ 	struct nci_conn_info *conn_info, *n;
+ 
++	/* This set_bit is not protected with specialized barrier,
++	 * However, it is fine because the mutex_lock(&ndev->req_lock);
++	 * in nci_close_device() will help to emit one.
++	 */
++	set_bit(NCI_UNREG, &ndev->flags);
++
+ 	nci_close_device(ndev);
+ 
+ 	destroy_workqueue(ndev->cmd_wq);
+diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c
+index d64b0eeccbe4d..efc963ab995a3 100644
+--- a/net/sched/act_mirred.c
++++ b/net/sched/act_mirred.c
+@@ -19,6 +19,7 @@
+ #include <linux/if_arp.h>
+ #include <net/net_namespace.h>
+ #include <net/netlink.h>
++#include <net/dst.h>
+ #include <net/pkt_sched.h>
+ #include <net/pkt_cls.h>
+ #include <linux/tc_act/tc_mirred.h>
+@@ -228,6 +229,7 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a,
+ 	bool want_ingress;
+ 	bool is_redirect;
+ 	bool expects_nh;
++	bool at_ingress;
+ 	int m_eaction;
+ 	int mac_len;
+ 	bool at_nh;
+@@ -263,7 +265,8 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a,
+ 	 * ingress - that covers the TC S/W datapath.
+ 	 */
+ 	is_redirect = tcf_mirred_is_act_redirect(m_eaction);
+-	use_reinsert = skb_at_tc_ingress(skb) && is_redirect &&
++	at_ingress = skb_at_tc_ingress(skb);
++	use_reinsert = at_ingress && is_redirect &&
+ 		       tcf_mirred_can_reinsert(retval);
+ 	if (!use_reinsert) {
+ 		skb2 = skb_clone(skb, GFP_ATOMIC);
+@@ -271,10 +274,12 @@ static int tcf_mirred_act(struct sk_buff *skb, const struct tc_action *a,
+ 			goto out;
+ 	}
+ 
++	want_ingress = tcf_mirred_act_wants_ingress(m_eaction);
++
+ 	/* All mirred/redirected skbs should clear previous ct info */
+ 	nf_reset_ct(skb2);
+-
+-	want_ingress = tcf_mirred_act_wants_ingress(m_eaction);
++	if (want_ingress && !at_ingress) /* drop dst for egress -> ingress */
++		skb_dst_drop(skb2);
+ 
+ 	expects_nh = want_ingress || !m_mac_header_xmit;
+ 	at_nh = skb->data == skb_network_header(skb);
+diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c
+index d2206743dc714..d672c0f0e247f 100644
+--- a/net/smc/smc_core.c
++++ b/net/smc/smc_core.c
+@@ -665,13 +665,14 @@ static u8 smcr_next_link_id(struct smc_link_group *lgr)
+ 	int i;
+ 
+ 	while (1) {
++again:
+ 		link_id = ++lgr->next_link_id;
+ 		if (!link_id)	/* skip zero as link_id */
+ 			link_id = ++lgr->next_link_id;
+ 		for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
+ 			if (smc_link_usable(&lgr->lnk[i]) &&
+ 			    lgr->lnk[i].link_id == link_id)
+-				continue;
++				goto again;
+ 		}
+ 		break;
+ 	}
+diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c
+index dc60c32bb70df..d293614d5fc65 100644
+--- a/net/tipc/crypto.c
++++ b/net/tipc/crypto.c
+@@ -597,6 +597,10 @@ static int tipc_aead_init(struct tipc_aead **aead, struct tipc_aead_key *ukey,
+ 	tmp->cloned = NULL;
+ 	tmp->authsize = TIPC_AES_GCM_TAG_SIZE;
+ 	tmp->key = kmemdup(ukey, tipc_aead_key_size(ukey), GFP_KERNEL);
++	if (!tmp->key) {
++		tipc_aead_free(&tmp->rcu);
++		return -ENOMEM;
++	}
+ 	memcpy(&tmp->salt, ukey->key + keylen, TIPC_AES_GCM_SALT_SIZE);
+ 	atomic_set(&tmp->users, 0);
+ 	atomic64_set(&tmp->seqno, 0);
+diff --git a/net/tipc/link.c b/net/tipc/link.c
+index 1b7a487c88419..09ae8448f394f 100644
+--- a/net/tipc/link.c
++++ b/net/tipc/link.c
+@@ -1298,8 +1298,11 @@ static bool tipc_data_input(struct tipc_link *l, struct sk_buff *skb,
+ 		return false;
+ #ifdef CONFIG_TIPC_CRYPTO
+ 	case MSG_CRYPTO:
+-		tipc_crypto_msg_rcv(l->net, skb);
+-		return true;
++		if (TIPC_SKB_CB(skb)->decrypted) {
++			tipc_crypto_msg_rcv(l->net, skb);
++			return true;
++		}
++		fallthrough;
+ #endif
+ 	default:
+ 		pr_warn("Dropping received illegal msg type\n");
+diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
+index bf7cd47525472..16b3d0cc0bdb0 100644
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -922,33 +922,37 @@ nl80211_packet_pattern_policy[MAX_NL80211_PKTPAT + 1] = {
+ 	[NL80211_PKTPAT_OFFSET] = { .type = NLA_U32 },
+ };
+ 
+-int nl80211_prepare_wdev_dump(struct netlink_callback *cb,
+-			      struct cfg80211_registered_device **rdev,
+-			      struct wireless_dev **wdev)
++static int nl80211_prepare_wdev_dump(struct netlink_callback *cb,
++				     struct cfg80211_registered_device **rdev,
++				     struct wireless_dev **wdev,
++				     struct nlattr **attrbuf)
+ {
+ 	int err;
+ 
+ 	if (!cb->args[0]) {
+-		struct nlattr **attrbuf;
++		struct nlattr **attrbuf_free = NULL;
+ 
+-		attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf),
+-				  GFP_KERNEL);
+-		if (!attrbuf)
+-			return -ENOMEM;
++		if (!attrbuf) {
++			attrbuf = kcalloc(NUM_NL80211_ATTR, sizeof(*attrbuf),
++					  GFP_KERNEL);
++			if (!attrbuf)
++				return -ENOMEM;
++			attrbuf_free = attrbuf;
++		}
+ 
+ 		err = nlmsg_parse_deprecated(cb->nlh,
+ 					     GENL_HDRLEN + nl80211_fam.hdrsize,
+ 					     attrbuf, nl80211_fam.maxattr,
+ 					     nl80211_policy, NULL);
+ 		if (err) {
+-			kfree(attrbuf);
++			kfree(attrbuf_free);
+ 			return err;
+ 		}
+ 
+ 		rtnl_lock();
+ 		*wdev = __cfg80211_wdev_from_attrs(NULL, sock_net(cb->skb->sk),
+ 						   attrbuf);
+-		kfree(attrbuf);
++		kfree(attrbuf_free);
+ 		if (IS_ERR(*wdev)) {
+ 			rtnl_unlock();
+ 			return PTR_ERR(*wdev);
+@@ -6001,7 +6005,7 @@ static int nl80211_dump_station(struct sk_buff *skb,
+ 	int sta_idx = cb->args[2];
+ 	int err;
+ 
+-	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
++	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
+ 	if (err)
+ 		return err;
+ 	/* nl80211_prepare_wdev_dump acquired it in the successful case */
+@@ -6896,7 +6900,7 @@ static int nl80211_dump_mpath(struct sk_buff *skb,
+ 	int path_idx = cb->args[2];
+ 	int err;
+ 
+-	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
++	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
+ 	if (err)
+ 		return err;
+ 	/* nl80211_prepare_wdev_dump acquired it in the successful case */
+@@ -7096,7 +7100,7 @@ static int nl80211_dump_mpp(struct sk_buff *skb,
+ 	int path_idx = cb->args[2];
+ 	int err;
+ 
+-	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
++	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
+ 	if (err)
+ 		return err;
+ 	/* nl80211_prepare_wdev_dump acquired it in the successful case */
+@@ -9518,7 +9522,7 @@ static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb)
+ 	int start = cb->args[2], idx = 0;
+ 	int err;
+ 
+-	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
++	err = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, NULL);
+ 	if (err)
+ 		return err;
+ 	/* nl80211_prepare_wdev_dump acquired it in the successful case */
+@@ -9651,7 +9655,7 @@ static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb)
+ 	if (!attrbuf)
+ 		return -ENOMEM;
+ 
+-	res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev);
++	res = nl80211_prepare_wdev_dump(cb, &rdev, &wdev, attrbuf);
+ 	if (res) {
+ 		kfree(attrbuf);
+ 		return res;
+diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h
+index a3f387770f1bf..d642e3be4ee78 100644
+--- a/net/wireless/nl80211.h
++++ b/net/wireless/nl80211.h
+@@ -1,7 +1,7 @@
+ /* SPDX-License-Identifier: GPL-2.0 */
+ /*
+  * Portions of this file
+- * Copyright (C) 2018, 2020 Intel Corporation
++ * Copyright (C) 2018, 2020-2021 Intel Corporation
+  */
+ #ifndef __NET_WIRELESS_NL80211_H
+ #define __NET_WIRELESS_NL80211_H
+@@ -22,10 +22,6 @@ static inline u64 wdev_id(struct wireless_dev *wdev)
+ 	       ((u64)wiphy_to_rdev(wdev->wiphy)->wiphy_idx << 32);
+ }
+ 
+-int nl80211_prepare_wdev_dump(struct netlink_callback *cb,
+-			      struct cfg80211_registered_device **rdev,
+-			      struct wireless_dev **wdev);
+-
+ int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
+ 			  struct genl_info *info,
+ 			  struct cfg80211_chan_def *chandef);
+diff --git a/net/wireless/util.c b/net/wireless/util.c
+index a1a99a5749844..4ddc269164f86 100644
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -1044,6 +1044,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
+ 
+ 		switch (otype) {
+ 		case NL80211_IFTYPE_AP:
++		case NL80211_IFTYPE_P2P_GO:
+ 			cfg80211_stop_ap(rdev, dev, true);
+ 			break;
+ 		case NL80211_IFTYPE_ADHOC:
+diff --git a/samples/bpf/xdp_redirect_cpu_user.c b/samples/bpf/xdp_redirect_cpu_user.c
+index d84e6949007cc..a81704d3317ba 100644
+--- a/samples/bpf/xdp_redirect_cpu_user.c
++++ b/samples/bpf/xdp_redirect_cpu_user.c
+@@ -309,7 +309,6 @@ int main(int argc, char **argv)
+ 	const char *mprog_filename = NULL, *mprog_name = NULL;
+ 	struct xdp_redirect_cpu *skel;
+ 	struct bpf_map_info info = {};
+-	char ifname_buf[IF_NAMESIZE];
+ 	struct bpf_cpumap_val value;
+ 	__u32 infosz = sizeof(info);
+ 	int ret = EXIT_FAIL_OPTION;
+@@ -390,10 +389,10 @@ int main(int argc, char **argv)
+ 		case 'd':
+ 			if (strlen(optarg) >= IF_NAMESIZE) {
+ 				fprintf(stderr, "-d/--dev name too long\n");
++				usage(argv, long_options, __doc__, mask, true, skel->obj);
+ 				goto end_cpu;
+ 			}
+-			safe_strncpy(ifname_buf, optarg, strlen(ifname_buf));
+-			ifindex = if_nametoindex(ifname_buf);
++			ifindex = if_nametoindex(optarg);
+ 			if (!ifindex)
+ 				ifindex = strtoul(optarg, NULL, 0);
+ 			if (!ifindex) {
+diff --git a/samples/bpf/xdp_sample_user.c b/samples/bpf/xdp_sample_user.c
+index b32d821781990..8740838e77679 100644
+--- a/samples/bpf/xdp_sample_user.c
++++ b/samples/bpf/xdp_sample_user.c
+@@ -120,7 +120,10 @@ struct sample_output {
+ 		__u64 xmit;
+ 	} totals;
+ 	struct {
+-		__u64 pps;
++		union {
++			__u64 pps;
++			__u64 num;
++		};
+ 		__u64 drop;
+ 		__u64 err;
+ 	} rx_cnt;
+@@ -1322,7 +1325,7 @@ int sample_install_xdp(struct bpf_program *xdp_prog, int ifindex, bool generic,
+ 
+ static void sample_summary_print(void)
+ {
+-	double period = sample_out.rx_cnt.pps;
++	double num = sample_out.rx_cnt.num;
+ 
+ 	if (sample_out.totals.rx) {
+ 		double pkts = sample_out.totals.rx;
+@@ -1330,7 +1333,7 @@ static void sample_summary_print(void)
+ 		print_always("  Packets received    : %'-10llu\n",
+ 			     sample_out.totals.rx);
+ 		print_always("  Average packets/s   : %'-10.0f\n",
+-			     sample_round(pkts / period));
++			     sample_round(pkts / num));
+ 	}
+ 	if (sample_out.totals.redir) {
+ 		double pkts = sample_out.totals.redir;
+@@ -1338,7 +1341,7 @@ static void sample_summary_print(void)
+ 		print_always("  Packets redirected  : %'-10llu\n",
+ 			     sample_out.totals.redir);
+ 		print_always("  Average redir/s     : %'-10.0f\n",
+-			     sample_round(pkts / period));
++			     sample_round(pkts / num));
+ 	}
+ 	if (sample_out.totals.drop)
+ 		print_always("  Rx dropped          : %'-10llu\n",
+@@ -1355,7 +1358,7 @@ static void sample_summary_print(void)
+ 		print_always("  Packets transmitted : %'-10llu\n",
+ 			     sample_out.totals.xmit);
+ 		print_always("  Average transmit/s  : %'-10.0f\n",
+-			     sample_round(pkts / period));
++			     sample_round(pkts / num));
+ 	}
+ }
+ 
+@@ -1422,7 +1425,7 @@ static int sample_stats_collect(struct stats_record *rec)
+ 	return 0;
+ }
+ 
+-static void sample_summary_update(struct sample_output *out, int interval)
++static void sample_summary_update(struct sample_output *out)
+ {
+ 	sample_out.totals.rx += out->totals.rx;
+ 	sample_out.totals.redir += out->totals.redir;
+@@ -1430,12 +1433,11 @@ static void sample_summary_update(struct sample_output *out, int interval)
+ 	sample_out.totals.drop_xmit += out->totals.drop_xmit;
+ 	sample_out.totals.err += out->totals.err;
+ 	sample_out.totals.xmit += out->totals.xmit;
+-	sample_out.rx_cnt.pps += interval;
++	sample_out.rx_cnt.num++;
+ }
+ 
+ static void sample_stats_print(int mask, struct stats_record *cur,
+-			       struct stats_record *prev, char *prog_name,
+-			       int interval)
++			       struct stats_record *prev, char *prog_name)
+ {
+ 	struct sample_output out = {};
+ 
+@@ -1452,7 +1454,7 @@ static void sample_stats_print(int mask, struct stats_record *cur,
+ 	else if (mask & SAMPLE_DEVMAP_XMIT_CNT_MULTI)
+ 		stats_get_devmap_xmit_multi(cur, prev, 0, &out,
+ 					    mask & SAMPLE_DEVMAP_XMIT_CNT);
+-	sample_summary_update(&out, interval);
++	sample_summary_update(&out);
+ 
+ 	stats_print(prog_name, mask, cur, prev, &out);
+ }
+@@ -1495,7 +1497,7 @@ static void swap(struct stats_record **a, struct stats_record **b)
+ }
+ 
+ static int sample_timer_cb(int timerfd, struct stats_record **rec,
+-			   struct stats_record **prev, int interval)
++			   struct stats_record **prev)
+ {
+ 	char line[64] = "Summary";
+ 	int ret;
+@@ -1524,7 +1526,7 @@ static int sample_timer_cb(int timerfd, struct stats_record **rec,
+ 		snprintf(line, sizeof(line), "%s->%s", f ?: "?", t ?: "?");
+ 	}
+ 
+-	sample_stats_print(sample_mask, *rec, *prev, line, interval);
++	sample_stats_print(sample_mask, *rec, *prev, line);
+ 	return 0;
+ }
+ 
+@@ -1579,7 +1581,7 @@ int sample_run(int interval, void (*post_cb)(void *), void *ctx)
+ 		if (pfd[0].revents & POLLIN)
+ 			ret = sample_signal_cb();
+ 		else if (pfd[1].revents & POLLIN)
+-			ret = sample_timer_cb(timerfd, &rec, &prev, interval);
++			ret = sample_timer_cb(timerfd, &rec, &prev);
+ 
+ 		if (ret)
+ 			break;
+diff --git a/security/selinux/ss/hashtab.c b/security/selinux/ss/hashtab.c
+index b8f6b3e0a9219..a91fb0ed00de3 100644
+--- a/security/selinux/ss/hashtab.c
++++ b/security/selinux/ss/hashtab.c
+@@ -30,13 +30,20 @@ static u32 hashtab_compute_size(u32 nel)
+ 
+ int hashtab_init(struct hashtab *h, u32 nel_hint)
+ {
+-	h->size = hashtab_compute_size(nel_hint);
++	u32 size = hashtab_compute_size(nel_hint);
++
++	/* should already be zeroed, but better be safe */
+ 	h->nel = 0;
+-	if (!h->size)
+-		return 0;
++	h->size = 0;
++	h->htable = NULL;
+ 
+-	h->htable = kcalloc(h->size, sizeof(*h->htable), GFP_KERNEL);
+-	return h->htable ? 0 : -ENOMEM;
++	if (size) {
++		h->htable = kcalloc(size, sizeof(*h->htable), GFP_KERNEL);
++		if (!h->htable)
++			return -ENOMEM;
++		h->size = size;
++	}
++	return 0;
+ }
+ 
+ int __hashtab_insert(struct hashtab *h, struct hashtab_node **dst,
+diff --git a/sound/core/Makefile b/sound/core/Makefile
+index d774792850f31..79e1407cd0de7 100644
+--- a/sound/core/Makefile
++++ b/sound/core/Makefile
+@@ -9,7 +9,9 @@ ifneq ($(CONFIG_SND_PROC_FS),)
+ snd-y += info.o
+ snd-$(CONFIG_SND_OSSEMUL) += info_oss.o
+ endif
++ifneq ($(CONFIG_M68K),y)
+ snd-$(CONFIG_ISA_DMA_API) += isadma.o
++endif
+ snd-$(CONFIG_SND_OSSEMUL) += sound_oss.o
+ snd-$(CONFIG_SND_VMASTER) += vmaster.o
+ snd-$(CONFIG_SND_JACK)	  += ctljack.o jack.o
+diff --git a/sound/hda/ext/hdac_ext_stream.c b/sound/hda/ext/hdac_ext_stream.c
+index 0c005d67fa891..37154ed43bd53 100644
+--- a/sound/hda/ext/hdac_ext_stream.c
++++ b/sound/hda/ext/hdac_ext_stream.c
+@@ -106,20 +106,14 @@ void snd_hdac_stream_free_all(struct hdac_bus *bus)
+ }
+ EXPORT_SYMBOL_GPL(snd_hdac_stream_free_all);
+ 
+-/**
+- * snd_hdac_ext_stream_decouple - decouple the hdac stream
+- * @bus: HD-audio core bus
+- * @stream: HD-audio ext core stream object to initialize
+- * @decouple: flag to decouple
+- */
+-void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
+-				struct hdac_ext_stream *stream, bool decouple)
++void snd_hdac_ext_stream_decouple_locked(struct hdac_bus *bus,
++					 struct hdac_ext_stream *stream,
++					 bool decouple)
+ {
+ 	struct hdac_stream *hstream = &stream->hstream;
+ 	u32 val;
+ 	int mask = AZX_PPCTL_PROCEN(hstream->index);
+ 
+-	spin_lock_irq(&bus->reg_lock);
+ 	val = readw(bus->ppcap + AZX_REG_PP_PPCTL) & mask;
+ 
+ 	if (decouple && !val)
+@@ -128,6 +122,20 @@ void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
+ 		snd_hdac_updatel(bus->ppcap, AZX_REG_PP_PPCTL, mask, 0);
+ 
+ 	stream->decoupled = decouple;
++}
++EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_decouple_locked);
++
++/**
++ * snd_hdac_ext_stream_decouple - decouple the hdac stream
++ * @bus: HD-audio core bus
++ * @stream: HD-audio ext core stream object to initialize
++ * @decouple: flag to decouple
++ */
++void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
++				  struct hdac_ext_stream *stream, bool decouple)
++{
++	spin_lock_irq(&bus->reg_lock);
++	snd_hdac_ext_stream_decouple_locked(bus, stream, decouple);
+ 	spin_unlock_irq(&bus->reg_lock);
+ }
+ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_decouple);
+@@ -252,6 +260,7 @@ hdac_ext_link_stream_assign(struct hdac_bus *bus,
+ 		return NULL;
+ 	}
+ 
++	spin_lock_irq(&bus->reg_lock);
+ 	list_for_each_entry(stream, &bus->stream_list, list) {
+ 		struct hdac_ext_stream *hstream = container_of(stream,
+ 						struct hdac_ext_stream,
+@@ -266,17 +275,16 @@ hdac_ext_link_stream_assign(struct hdac_bus *bus,
+ 		}
+ 
+ 		if (!hstream->link_locked) {
+-			snd_hdac_ext_stream_decouple(bus, hstream, true);
++			snd_hdac_ext_stream_decouple_locked(bus, hstream, true);
+ 			res = hstream;
+ 			break;
+ 		}
+ 	}
+ 	if (res) {
+-		spin_lock_irq(&bus->reg_lock);
+ 		res->link_locked = 1;
+ 		res->link_substream = substream;
+-		spin_unlock_irq(&bus->reg_lock);
+ 	}
++	spin_unlock_irq(&bus->reg_lock);
+ 	return res;
+ }
+ 
+@@ -292,6 +300,7 @@ hdac_ext_host_stream_assign(struct hdac_bus *bus,
+ 		return NULL;
+ 	}
+ 
++	spin_lock_irq(&bus->reg_lock);
+ 	list_for_each_entry(stream, &bus->stream_list, list) {
+ 		struct hdac_ext_stream *hstream = container_of(stream,
+ 						struct hdac_ext_stream,
+@@ -301,18 +310,17 @@ hdac_ext_host_stream_assign(struct hdac_bus *bus,
+ 
+ 		if (!stream->opened) {
+ 			if (!hstream->decoupled)
+-				snd_hdac_ext_stream_decouple(bus, hstream, true);
++				snd_hdac_ext_stream_decouple_locked(bus, hstream, true);
+ 			res = hstream;
+ 			break;
+ 		}
+ 	}
+ 	if (res) {
+-		spin_lock_irq(&bus->reg_lock);
+ 		res->hstream.opened = 1;
+ 		res->hstream.running = 0;
+ 		res->hstream.substream = substream;
+-		spin_unlock_irq(&bus->reg_lock);
+ 	}
++	spin_unlock_irq(&bus->reg_lock);
+ 
+ 	return res;
+ }
+@@ -378,15 +386,17 @@ void snd_hdac_ext_stream_release(struct hdac_ext_stream *stream, int type)
+ 		break;
+ 
+ 	case HDAC_EXT_STREAM_TYPE_HOST:
++		spin_lock_irq(&bus->reg_lock);
+ 		if (stream->decoupled && !stream->link_locked)
+-			snd_hdac_ext_stream_decouple(bus, stream, false);
++			snd_hdac_ext_stream_decouple_locked(bus, stream, false);
++		spin_unlock_irq(&bus->reg_lock);
+ 		snd_hdac_stream_release(&stream->hstream);
+ 		break;
+ 
+ 	case HDAC_EXT_STREAM_TYPE_LINK:
+-		if (stream->decoupled && !stream->hstream.opened)
+-			snd_hdac_ext_stream_decouple(bus, stream, false);
+ 		spin_lock_irq(&bus->reg_lock);
++		if (stream->decoupled && !stream->hstream.opened)
++			snd_hdac_ext_stream_decouple_locked(bus, stream, false);
+ 		stream->link_locked = 0;
+ 		stream->link_substream = NULL;
+ 		spin_unlock_irq(&bus->reg_lock);
+diff --git a/sound/hda/hdac_stream.c b/sound/hda/hdac_stream.c
+index 1eb8563db2dff..9867555883c34 100644
+--- a/sound/hda/hdac_stream.c
++++ b/sound/hda/hdac_stream.c
+@@ -296,6 +296,7 @@ struct hdac_stream *snd_hdac_stream_assign(struct hdac_bus *bus,
+ 	int key = (substream->pcm->device << 16) | (substream->number << 2) |
+ 		(substream->stream + 1);
+ 
++	spin_lock_irq(&bus->reg_lock);
+ 	list_for_each_entry(azx_dev, &bus->stream_list, list) {
+ 		if (azx_dev->direction != substream->stream)
+ 			continue;
+@@ -309,13 +310,12 @@ struct hdac_stream *snd_hdac_stream_assign(struct hdac_bus *bus,
+ 			res = azx_dev;
+ 	}
+ 	if (res) {
+-		spin_lock_irq(&bus->reg_lock);
+ 		res->opened = 1;
+ 		res->running = 0;
+ 		res->assigned_key = key;
+ 		res->substream = substream;
+-		spin_unlock_irq(&bus->reg_lock);
+ 	}
++	spin_unlock_irq(&bus->reg_lock);
+ 	return res;
+ }
+ EXPORT_SYMBOL_GPL(snd_hdac_stream_assign);
+diff --git a/sound/hda/intel-dsp-config.c b/sound/hda/intel-dsp-config.c
+index c9d0ba353463b..b9ac9e9e45a48 100644
+--- a/sound/hda/intel-dsp-config.c
++++ b/sound/hda/intel-dsp-config.c
+@@ -31,6 +31,7 @@ struct config_entry {
+ 	u16 device;
+ 	u8 acpi_hid[ACPI_ID_LEN];
+ 	const struct dmi_system_id *dmi_table;
++	u8 codec_hid[ACPI_ID_LEN];
+ };
+ 
+ /*
+@@ -56,7 +57,7 @@ static const struct config_entry config_table[] = {
+ /*
+  * Apollolake (Broxton-P)
+  * the legacy HDAudio driver is used except on Up Squared (SOF) and
+- * Chromebooks (SST)
++ * Chromebooks (SST), as well as devices based on the ES8336 codec
+  */
+ #if IS_ENABLED(CONFIG_SND_SOC_SOF_APOLLOLAKE)
+ 	{
+@@ -73,6 +74,11 @@ static const struct config_entry config_table[] = {
+ 			{}
+ 		}
+ 	},
++	{
++		.flags = FLAG_SOF,
++		.device = 0x5a98,
++		.codec_hid = "ESSX8336",
++	},
+ #endif
+ #if IS_ENABLED(CONFIG_SND_SOC_INTEL_APL)
+ 	{
+@@ -137,7 +143,7 @@ static const struct config_entry config_table[] = {
+ 
+ /*
+  * Geminilake uses legacy HDAudio driver except for Google
+- * Chromebooks
++ * Chromebooks and devices based on the ES8336 codec
+  */
+ /* Geminilake */
+ #if IS_ENABLED(CONFIG_SND_SOC_SOF_GEMINILAKE)
+@@ -154,6 +160,11 @@ static const struct config_entry config_table[] = {
+ 			{}
+ 		}
+ 	},
++	{
++		.flags = FLAG_SOF,
++		.device = 0x3198,
++		.codec_hid = "ESSX8336",
++	},
+ #endif
+ 
+ /*
+@@ -311,6 +322,11 @@ static const struct config_entry config_table[] = {
+ 		.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
+ 		.device = 0x43c8,
+ 	},
++	{
++		.flags = FLAG_SOF,
++		.device = 0xa0c8,
++		.codec_hid = "ESSX8336",
++	},
+ #endif
+ 
+ /* Elkhart Lake */
+@@ -354,6 +370,8 @@ static const struct config_entry *snd_intel_dsp_find_config
+ 			continue;
+ 		if (table->dmi_table && !dmi_check_system(table->dmi_table))
+ 			continue;
++		if (table->codec_hid[0] && !acpi_dev_present(table->codec_hid, NULL, -1))
++			continue;
+ 		return table;
+ 	}
+ 	return NULL;
+diff --git a/sound/isa/Kconfig b/sound/isa/Kconfig
+index 6ffa48dd59830..570b88e0b2018 100644
+--- a/sound/isa/Kconfig
++++ b/sound/isa/Kconfig
+@@ -22,7 +22,7 @@ config SND_SB16_DSP
+ menuconfig SND_ISA
+ 	bool "ISA sound devices"
+ 	depends on ISA || COMPILE_TEST
+-	depends on ISA_DMA_API
++	depends on ISA_DMA_API && !M68K
+ 	default y
+ 	help
+ 	  Support for sound devices connected via the ISA bus.
+diff --git a/sound/isa/gus/gus_dma.c b/sound/isa/gus/gus_dma.c
+index a1c770d826dda..6d664dd8dde0b 100644
+--- a/sound/isa/gus/gus_dma.c
++++ b/sound/isa/gus/gus_dma.c
+@@ -126,6 +126,8 @@ static void snd_gf1_dma_interrupt(struct snd_gus_card * gus)
+ 	}
+ 	block = snd_gf1_dma_next_block(gus);
+ 	spin_unlock(&gus->dma_lock);
++	if (!block)
++		return;
+ 	snd_gf1_dma_program(gus, block->addr, block->buf_addr, block->count, (unsigned short) block->cmd);
+ 	kfree(block);
+ #if 0
+diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig
+index 93bc9bef7641f..41ce125971777 100644
+--- a/sound/pci/Kconfig
++++ b/sound/pci/Kconfig
+@@ -279,6 +279,7 @@ config SND_CS46XX_NEW_DSP
+ config SND_CS5530
+ 	tristate "CS5530 Audio"
+ 	depends on ISA_DMA_API && (X86_32 || COMPILE_TEST)
++	depends on !M68K
+ 	select SND_SB16_DSP
+ 	help
+ 	  Say Y here to include support for audio on Cyrix/NatSemi CS5530 chips.
+diff --git a/sound/soc/codecs/es8316.c b/sound/soc/codecs/es8316.c
+index 067757d1d70a3..5fb02635c1406 100644
+--- a/sound/soc/codecs/es8316.c
++++ b/sound/soc/codecs/es8316.c
+@@ -811,12 +811,9 @@ static int es8316_i2c_probe(struct i2c_client *i2c_client,
+ 	mutex_init(&es8316->lock);
+ 
+ 	ret = devm_request_threaded_irq(dev, es8316->irq, NULL, es8316_irq,
+-					IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
++					IRQF_TRIGGER_HIGH | IRQF_ONESHOT | IRQF_NO_AUTOEN,
+ 					"es8316", es8316);
+-	if (ret == 0) {
+-		/* Gets re-enabled by es8316_set_jack() */
+-		disable_irq(es8316->irq);
+-	} else {
++	if (ret) {
+ 		dev_warn(dev, "Failed to get IRQ %d: %d\n", es8316->irq, ret);
+ 		es8316->irq = -ENXIO;
+ 	}
+diff --git a/sound/soc/codecs/nau8824.c b/sound/soc/codecs/nau8824.c
+index f946ef65a4c19..f7018f2dd21fd 100644
+--- a/sound/soc/codecs/nau8824.c
++++ b/sound/soc/codecs/nau8824.c
+@@ -8,6 +8,7 @@
+ 
+ #include <linux/module.h>
+ #include <linux/delay.h>
++#include <linux/dmi.h>
+ #include <linux/init.h>
+ #include <linux/i2c.h>
+ #include <linux/regmap.h>
+@@ -27,6 +28,12 @@
+ 
+ #include "nau8824.h"
+ 
++#define NAU8824_JD_ACTIVE_HIGH			BIT(0)
++
++static int nau8824_quirk;
++static int quirk_override = -1;
++module_param_named(quirk, quirk_override, uint, 0444);
++MODULE_PARM_DESC(quirk, "Board-specific quirk override");
+ 
+ static int nau8824_config_sysclk(struct nau8824 *nau8824,
+ 	int clk_id, unsigned int freq);
+@@ -1845,6 +1852,34 @@ static int nau8824_read_device_properties(struct device *dev,
+ 	return 0;
+ }
+ 
++/* Please keep this list alphabetically sorted */
++static const struct dmi_system_id nau8824_quirk_table[] = {
++	{
++		/* Cyberbook T116 rugged tablet */
++		.matches = {
++			DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"),
++			DMI_EXACT_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"),
++			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "20170531"),
++		},
++		.driver_data = (void *)(NAU8824_JD_ACTIVE_HIGH),
++	},
++	{}
++};
++
++static void nau8824_check_quirks(void)
++{
++	const struct dmi_system_id *dmi_id;
++
++	if (quirk_override != -1) {
++		nau8824_quirk = quirk_override;
++		return;
++	}
++
++	dmi_id = dmi_first_match(nau8824_quirk_table);
++	if (dmi_id)
++		nau8824_quirk = (unsigned long)dmi_id->driver_data;
++}
++
+ static int nau8824_i2c_probe(struct i2c_client *i2c,
+ 	const struct i2c_device_id *id)
+ {
+@@ -1869,6 +1904,11 @@ static int nau8824_i2c_probe(struct i2c_client *i2c,
+ 	nau8824->irq = i2c->irq;
+ 	sema_init(&nau8824->jd_sem, 1);
+ 
++	nau8824_check_quirks();
++
++	if (nau8824_quirk & NAU8824_JD_ACTIVE_HIGH)
++		nau8824->jkdet_polarity = 0;
++
+ 	nau8824_print_device_properties(nau8824);
+ 
+ 	ret = regmap_read(nau8824->regmap, NAU8824_REG_I2C_DEVICE_ID, &value);
+diff --git a/sound/soc/codecs/rt5651.c b/sound/soc/codecs/rt5651.c
+index fc0c83b73f099..93820561b9f5d 100644
+--- a/sound/soc/codecs/rt5651.c
++++ b/sound/soc/codecs/rt5651.c
+@@ -2261,11 +2261,8 @@ static int rt5651_i2c_probe(struct i2c_client *i2c,
+ 
+ 	ret = devm_request_irq(&i2c->dev, rt5651->irq, rt5651_irq,
+ 			       IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
+-			       | IRQF_ONESHOT, "rt5651", rt5651);
+-	if (ret == 0) {
+-		/* Gets re-enabled by rt5651_set_jack() */
+-		disable_irq(rt5651->irq);
+-	} else {
++			       | IRQF_ONESHOT | IRQF_NO_AUTOEN, "rt5651", rt5651);
++	if (ret) {
+ 		dev_warn(&i2c->dev, "Failed to reguest IRQ %d: %d\n",
+ 			 rt5651->irq, ret);
+ 		rt5651->irq = -ENXIO;
+diff --git a/sound/soc/codecs/rt5682.c b/sound/soc/codecs/rt5682.c
+index 4a64cab99c55b..d550c0705c28b 100644
+--- a/sound/soc/codecs/rt5682.c
++++ b/sound/soc/codecs/rt5682.c
+@@ -46,6 +46,8 @@ static const struct reg_sequence patch_list[] = {
+ 	{RT5682_SAR_IL_CMD_1, 0x22b7},
+ 	{RT5682_SAR_IL_CMD_3, 0x0365},
+ 	{RT5682_SAR_IL_CMD_6, 0x0110},
++	{RT5682_CHARGE_PUMP_1, 0x0210},
++	{RT5682_HP_LOGIC_CTRL_2, 0x0007},
+ };
+ 
+ void rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev)
+@@ -1515,21 +1517,29 @@ static int rt5682_hp_event(struct snd_soc_dapm_widget *w,
+ 
+ 	switch (event) {
+ 	case SND_SOC_DAPM_PRE_PMU:
+-		snd_soc_component_write(component,
+-			RT5682_HP_LOGIC_CTRL_2, 0x0012);
+-		snd_soc_component_write(component,
+-			RT5682_HP_CTRL_2, 0x6000);
++		snd_soc_component_update_bits(component, RT5682_HP_CTRL_2,
++			RT5682_HP_C2_DAC_AMP_MUTE, 0);
++		snd_soc_component_update_bits(component, RT5682_HP_LOGIC_CTRL_2,
++			RT5682_HP_LC2_SIG_SOUR2_MASK, RT5682_HP_LC2_SIG_SOUR2_REG);
+ 		snd_soc_component_update_bits(component,
+ 			RT5682_DEPOP_1, 0x60, 0x60);
+ 		snd_soc_component_update_bits(component,
+ 			RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0080);
++		snd_soc_component_update_bits(component, RT5682_HP_CTRL_2,
++			RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN,
++			RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN);
++		usleep_range(5000, 10000);
++		snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1,
++			RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_L);
+ 		break;
+ 
+ 	case SND_SOC_DAPM_POST_PMD:
++		snd_soc_component_update_bits(component, RT5682_HP_CTRL_2,
++			RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN, 0);
++		snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1,
++			RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_M);
+ 		snd_soc_component_update_bits(component,
+ 			RT5682_DEPOP_1, 0x60, 0x0);
+-		snd_soc_component_write(component,
+-			RT5682_HP_CTRL_2, 0x0000);
+ 		snd_soc_component_update_bits(component,
+ 			RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0000);
+ 		break;
+@@ -1637,6 +1647,23 @@ static SOC_VALUE_ENUM_SINGLE_DECL(rt5682_adcdat_pin_enum,
+ static const struct snd_kcontrol_new rt5682_adcdat_pin_ctrl =
+ 	SOC_DAPM_ENUM("ADCDAT", rt5682_adcdat_pin_enum);
+ 
++static const unsigned int rt5682_hpo_sig_out_values[] = {
++	2,
++	7,
++};
++
++static const char * const rt5682_hpo_sig_out_mode[] = {
++	"Legacy",
++	"OneBit",
++};
++
++static SOC_VALUE_ENUM_SINGLE_DECL(rt5682_hpo_sig_out_enum,
++	RT5682_HP_LOGIC_CTRL_2, 0, RT5682_HP_LC2_SIG_SOUR1_MASK,
++	rt5682_hpo_sig_out_mode, rt5682_hpo_sig_out_values);
++
++static const struct snd_kcontrol_new rt5682_hpo_sig_demux =
++	SOC_DAPM_ENUM("HPO Signal Demux", rt5682_hpo_sig_out_enum);
++
+ static const struct snd_soc_dapm_widget rt5682_dapm_widgets[] = {
+ 	SND_SOC_DAPM_SUPPLY("LDO2", RT5682_PWR_ANLG_3, RT5682_PWR_LDO2_BIT,
+ 		0, NULL, 0),
+@@ -1820,6 +1847,10 @@ static const struct snd_soc_dapm_widget rt5682_dapm_widgets[] = {
+ 	SND_SOC_DAPM_SWITCH("HPOR Playback", SND_SOC_NOPM, 0, 0,
+ 		&hpor_switch),
+ 
++	SND_SOC_DAPM_OUT_DRV("HPO Legacy", SND_SOC_NOPM, 0, 0, NULL, 0),
++	SND_SOC_DAPM_OUT_DRV("HPO OneBit", SND_SOC_NOPM, 0, 0, NULL, 0),
++	SND_SOC_DAPM_DEMUX("HPO Signal Demux", SND_SOC_NOPM, 0, 0, &rt5682_hpo_sig_demux),
++
+ 	/* CLK DET */
+ 	SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5682_CLK_DET,
+ 		RT5682_SYS_CLK_DET_SFT,	0, NULL, 0),
+@@ -1987,10 +2018,19 @@ static const struct snd_soc_dapm_route rt5682_dapm_routes[] = {
+ 	{"HP Amp", NULL, "Charge Pump"},
+ 	{"HP Amp", NULL, "CLKDET SYS"},
+ 	{"HP Amp", NULL, "Vref1"},
+-	{"HPOL Playback", "Switch", "HP Amp"},
+-	{"HPOR Playback", "Switch", "HP Amp"},
++
++	{"HPO Signal Demux", NULL, "HP Amp"},
++
++	{"HPO Legacy", "Legacy", "HPO Signal Demux"},
++	{"HPO OneBit", "OneBit", "HPO Signal Demux"},
++
++	{"HPOL Playback", "Switch", "HPO Legacy"},
++	{"HPOR Playback", "Switch", "HPO Legacy"},
++
+ 	{"HPOL", NULL, "HPOL Playback"},
+ 	{"HPOR", NULL, "HPOR Playback"},
++	{"HPOL", NULL, "HPO OneBit"},
++	{"HPOR", NULL, "HPO OneBit"},
+ };
+ 
+ static int rt5682_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
+diff --git a/sound/soc/codecs/rt5682.h b/sound/soc/codecs/rt5682.h
+index b59221048ebf9..8e3244a62c160 100644
+--- a/sound/soc/codecs/rt5682.h
++++ b/sound/soc/codecs/rt5682.h
+@@ -375,6 +375,14 @@
+ #define RT5682_R_VOL_MASK			(0x3f)
+ #define RT5682_R_VOL_SFT			0
+ 
++/* Headphone Amp Control 2 (0x0003) */
++#define RT5682_HP_C2_DAC_AMP_MUTE_SFT		15
++#define RT5682_HP_C2_DAC_AMP_MUTE		(0x1 << 15)
++#define RT5682_HP_C2_DAC_L_EN_SFT		14
++#define RT5682_HP_C2_DAC_L_EN			(0x1 << 14)
++#define RT5682_HP_C2_DAC_R_EN_SFT		13
++#define RT5682_HP_C2_DAC_R_EN			(0x1 << 13)
++
+ /*Headphone Amp L/R Analog Gain and Digital NG2 Gain Control (0x0005 0x0006)*/
+ #define RT5682_G_HP				(0xf << 8)
+ #define RT5682_G_HP_SFT				8
+@@ -1265,6 +1273,10 @@
+ #define RT5682_HPA_CP_BIAS_6UA			(0x3 << 2)
+ 
+ /* Charge Pump Internal Register1 (0x0125) */
++#define RT5682_CP_SW_SIZE_MASK			(0x7 << 8)
++#define RT5682_CP_SW_SIZE_L			(0x4 << 8)
++#define RT5682_CP_SW_SIZE_M			(0x2 << 8)
++#define RT5682_CP_SW_SIZE_S			(0x1 << 8)
+ #define RT5682_CP_CLK_HP_MASK			(0x3 << 4)
+ #define RT5682_CP_CLK_HP_100KHZ			(0x0 << 4)
+ #define RT5682_CP_CLK_HP_200KHZ			(0x1 << 4)
+@@ -1315,6 +1327,14 @@
+ #define RT5682_DEB_STO_DAC_MASK			(0x7 << 4)
+ #define RT5682_DEB_80_MS			(0x0 << 4)
+ 
++/* HP Behavior Logic Control 2 (0x01db) */
++#define RT5682_HP_LC2_SIG_SOUR2_MASK		(0x1 << 4)
++#define RT5682_HP_LC2_SIG_SOUR2_REG		(0x1 << 4)
++#define RT5682_HP_LC2_SIG_SOUR2_DC_CAL		(0x0 << 4)
++#define RT5682_HP_LC2_SIG_SOUR1_MASK		(0x7)
++#define RT5682_HP_LC2_SIG_SOUR1_1BIT		(0x7)
++#define RT5682_HP_LC2_SIG_SOUR1_LEGA		(0x2)
++
+ /* SAR ADC Inline Command Control 1 (0x0210) */
+ #define RT5682_SAR_BUTT_DET_MASK		(0x1 << 15)
+ #define RT5682_SAR_BUTT_DET_EN			(0x1 << 15)
+diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c
+index 6b06248a9327a..f10496206ceed 100644
+--- a/sound/soc/intel/boards/sof_sdw.c
++++ b/sound/soc/intel/boards/sof_sdw.c
+@@ -213,6 +213,16 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {
+ 					SOF_RT715_DAI_ID_FIX |
+ 					SOF_SDW_FOUR_SPK),
+ 	},
++	{
++		.callback = sof_sdw_quirk_cb,
++		.matches = {
++			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"),
++			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0A45")
++		},
++		.driver_data = (void *)(SOF_SDW_TGL_HDMI |
++					RT711_JD2 |
++					SOF_RT715_DAI_ID_FIX),
++	},
+ 	/* AlderLake devices */
+ 	{
+ 		.callback = sof_sdw_quirk_cb,
+diff --git a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
+index 785d5f5f8a9c9..11801b905ecc2 100644
+--- a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
++++ b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
+@@ -156,6 +156,15 @@ static const struct snd_soc_acpi_adr_device rt711_sdca_0_adr[] = {
+ 	}
+ };
+ 
++static const struct snd_soc_acpi_adr_device rt1316_1_single_adr[] = {
++	{
++		.adr = 0x000131025D131601ull,
++		.num_endpoints = 1,
++		.endpoints = &single_endpoint,
++		.name_prefix = "rt1316-1"
++	}
++};
++
+ static const struct snd_soc_acpi_adr_device rt1316_1_group1_adr[] = {
+ 	{
+ 		.adr = 0x000131025D131601ull, /* unique ID is set for some reason */
+@@ -320,6 +329,25 @@ static const struct snd_soc_acpi_link_adr tgl_3_in_1_sdca[] = {
+ 	{}
+ };
+ 
++static const struct snd_soc_acpi_link_adr tgl_3_in_1_sdca_mono[] = {
++	{
++		.mask = BIT(0),
++		.num_adr = ARRAY_SIZE(rt711_sdca_0_adr),
++		.adr_d = rt711_sdca_0_adr,
++	},
++	{
++		.mask = BIT(1),
++		.num_adr = ARRAY_SIZE(rt1316_1_single_adr),
++		.adr_d = rt1316_1_single_adr,
++	},
++	{
++		.mask = BIT(3),
++		.num_adr = ARRAY_SIZE(rt714_3_adr),
++		.adr_d = rt714_3_adr,
++	},
++	{}
++};
++
+ static const struct snd_soc_acpi_codecs tgl_max98373_amp = {
+ 	.num_codecs = 1,
+ 	.codecs = {"MX98373"}
+@@ -412,6 +440,19 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_sdw_machines[] = {
+ 		.drv_name = "sof_sdw",
+ 		.sof_tplg_filename = "sof-tgl-rt711-rt1316-rt714.tplg",
+ 	},
++	{
++		/*
++		 * link_mask should be 0xB, but all links are enabled by BIOS.
++		 * This entry will be selected if there is no rt1316 amplifier exposed
++		 * on link2 since it will fail to match the above entry.
++		 */
++
++		.link_mask = 0xF, /* 4 active links required */
++		.links = tgl_3_in_1_sdca_mono,
++		.drv_name = "sof_sdw",
++		.sof_tplg_filename = "sof-tgl-rt711-l0-rt1316-l1-mono-rt714-l3.tplg",
++	},
++
+ 	{
+ 		.link_mask = 0x3, /* rt711 on link 0 and 1 rt1308 on link 1 */
+ 		.links = tgl_hp,
+diff --git a/sound/soc/mediatek/mt8195/mt8195-mt6359-rt1019-rt5682.c b/sound/soc/mediatek/mt8195/mt8195-mt6359-rt1019-rt5682.c
+index de09f67c04502..a3fa8efc8f81c 100644
+--- a/sound/soc/mediatek/mt8195/mt8195-mt6359-rt1019-rt5682.c
++++ b/sound/soc/mediatek/mt8195/mt8195-mt6359-rt1019-rt5682.c
+@@ -1040,8 +1040,10 @@ static int mt8195_mt6359_rt1019_rt5682_dev_probe(struct platform_device *pdev)
+ 	}
+ 
+ 	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+-	if (!priv)
++	if (!priv) {
++		of_node_put(platform_node);
+ 		return -ENOMEM;
++	}
+ 
+ 	snd_soc_card_set_drvdata(card, priv);
+ 
+@@ -1049,6 +1051,8 @@ static int mt8195_mt6359_rt1019_rt5682_dev_probe(struct platform_device *pdev)
+ 	if (ret)
+ 		dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
+ 			__func__, ret);
++
++	of_node_put(platform_node);
+ 	return ret;
+ }
+ 
+diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c
+index 16c6e0265749b..03e0d4eca7815 100644
+--- a/sound/soc/sh/rcar/dma.c
++++ b/sound/soc/sh/rcar/dma.c
+@@ -102,7 +102,7 @@ static int rsnd_dmaen_stop(struct rsnd_mod *mod,
+ 	struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
+ 
+ 	if (dmaen->chan)
+-		dmaengine_terminate_sync(dmaen->chan);
++		dmaengine_terminate_async(dmaen->chan);
+ 
+ 	return 0;
+ }
+diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
+index 59d07648a7e7f..0479bb0005abd 100644
+--- a/sound/soc/soc-dapm.c
++++ b/sound/soc/soc-dapm.c
+@@ -2557,8 +2557,13 @@ static struct snd_soc_dapm_widget *dapm_find_widget(
+ 	return NULL;
+ }
+ 
+-static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
+-				const char *pin, int status)
++/*
++ * set the DAPM pin status:
++ * returns 1 when the value has been updated, 0 when unchanged, or a negative
++ * error code; called from kcontrol put callback
++ */
++static int __snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
++				  const char *pin, int status)
+ {
+ 	struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
+ 	int ret = 0;
+@@ -2584,6 +2589,18 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
+ 	return ret;
+ }
+ 
++/*
++ * similar as __snd_soc_dapm_set_pin(), but returns 0 when successful;
++ * called from several API functions below
++ */
++static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
++				const char *pin, int status)
++{
++	int ret = __snd_soc_dapm_set_pin(dapm, pin, status);
++
++	return ret < 0 ? ret : 0;
++}
++
+ /**
+  * snd_soc_dapm_sync_unlocked - scan and power dapm paths
+  * @dapm: DAPM context
+@@ -3587,10 +3604,10 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
+ 	const char *pin = (const char *)kcontrol->private_value;
+ 	int ret;
+ 
+-	if (ucontrol->value.integer.value[0])
+-		ret = snd_soc_dapm_enable_pin(&card->dapm, pin);
+-	else
+-		ret = snd_soc_dapm_disable_pin(&card->dapm, pin);
++	mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
++	ret = __snd_soc_dapm_set_pin(&card->dapm, pin,
++				     !!ucontrol->value.integer.value[0]);
++	mutex_unlock(&card->dapm_mutex);
+ 
+ 	snd_soc_dapm_sync(&card->dapm);
+ 	return ret;
+diff --git a/sound/soc/sof/intel/hda-dai.c b/sound/soc/sof/intel/hda-dai.c
+index c1f9f0f584647..6704dbcd101cd 100644
+--- a/sound/soc/sof/intel/hda-dai.c
++++ b/sound/soc/sof/intel/hda-dai.c
+@@ -68,6 +68,7 @@ static struct hdac_ext_stream *
+ 		return NULL;
+ 	}
+ 
++	spin_lock_irq(&bus->reg_lock);
+ 	list_for_each_entry(stream, &bus->stream_list, list) {
+ 		struct hdac_ext_stream *hstream =
+ 			stream_to_hdac_ext_stream(stream);
+@@ -107,12 +108,12 @@ static struct hdac_ext_stream *
+ 		 * is updated in snd_hdac_ext_stream_decouple().
+ 		 */
+ 		if (!res->decoupled)
+-			snd_hdac_ext_stream_decouple(bus, res, true);
+-		spin_lock_irq(&bus->reg_lock);
++			snd_hdac_ext_stream_decouple_locked(bus, res, true);
++
+ 		res->link_locked = 1;
+ 		res->link_substream = substream;
+-		spin_unlock_irq(&bus->reg_lock);
+ 	}
++	spin_unlock_irq(&bus->reg_lock);
+ 
+ 	return res;
+ }
+diff --git a/sound/usb/clock.c b/sound/usb/clock.c
+index 81d5ce07d548b..98345a695dccb 100644
+--- a/sound/usb/clock.c
++++ b/sound/usb/clock.c
+@@ -496,6 +496,10 @@ int snd_usb_set_sample_rate_v2v3(struct snd_usb_audio *chip,
+ 	union uac23_clock_source_desc *cs_desc;
+ 
+ 	cs_desc = snd_usb_find_clock_source(chip, clock, fmt->protocol);
++
++	if (!cs_desc)
++		return 0;
++
+ 	if (fmt->protocol == UAC_VERSION_3)
+ 		bmControls = le32_to_cpu(cs_desc->v3.bmControls);
+ 	else
+diff --git a/sound/usb/implicit.c b/sound/usb/implicit.c
+index 23767a14d1266..70319c822c10b 100644
+--- a/sound/usb/implicit.c
++++ b/sound/usb/implicit.c
+@@ -54,8 +54,6 @@ static const struct snd_usb_implicit_fb_match playback_implicit_fb_quirks[] = {
+ 
+ 	/* Fixed EP */
+ 	/* FIXME: check the availability of generic matching */
+-	IMPLICIT_FB_FIXED_DEV(0x1397, 0x0001, 0x81, 1), /* Behringer UFX1604 */
+-	IMPLICIT_FB_FIXED_DEV(0x1397, 0x0002, 0x81, 1), /* Behringer UFX1204 */
+ 	IMPLICIT_FB_FIXED_DEV(0x2466, 0x8010, 0x81, 2), /* Fractal Audio Axe-Fx III */
+ 	IMPLICIT_FB_FIXED_DEV(0x31e9, 0x0001, 0x81, 2), /* Solid State Logic SSL2 */
+ 	IMPLICIT_FB_FIXED_DEV(0x31e9, 0x0002, 0x81, 2), /* Solid State Logic SSL2+ */
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 46082dc57be09..d489c1de3baec 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -2795,6 +2795,7 @@ static int snd_bbfpro_controls_create(struct usb_mixer_interface *mixer)
+ #define SND_DJM_750_IDX		0x1
+ #define SND_DJM_850_IDX		0x2
+ #define SND_DJM_900NXS2_IDX	0x3
++#define SND_DJM_750MK2_IDX	0x4
+ 
+ 
+ #define SND_DJM_CTL(_name, suffix, _default_value, _windex) { \
+@@ -2984,10 +2985,40 @@ static const struct snd_djm_ctl snd_djm_ctls_900nxs2[] = {
+ 	SND_DJM_CTL("Ch5 Input",   900nxs2_cap5, 3, SND_DJM_WINDEX_CAP)
+ };
+ 
++// DJM-750MK2
++static const u16 snd_djm_opts_750mk2_cap1[] = {
++	0x0100, 0x0102, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a };
++static const u16 snd_djm_opts_750mk2_cap2[] = {
++	0x0200, 0x0202, 0x0203, 0x0206, 0x0207, 0x0208, 0x0209, 0x020a };
++static const u16 snd_djm_opts_750mk2_cap3[] = {
++	0x0300, 0x0302, 0x0303, 0x0306, 0x0307, 0x0308, 0x0309, 0x030a };
++static const u16 snd_djm_opts_750mk2_cap4[] = {
++	0x0400, 0x0402, 0x0403, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a };
++static const u16 snd_djm_opts_750mk2_cap5[] = {
++	0x0507, 0x0508, 0x0509, 0x050a, 0x0511, 0x0512, 0x0513, 0x0514 };
++
++static const u16 snd_djm_opts_750mk2_pb1[] = { 0x0100, 0x0101, 0x0104 };
++static const u16 snd_djm_opts_750mk2_pb2[] = { 0x0200, 0x0201, 0x0204 };
++static const u16 snd_djm_opts_750mk2_pb3[] = { 0x0300, 0x0301, 0x0304 };
++
++
++static const struct snd_djm_ctl snd_djm_ctls_750mk2[] = {
++	SND_DJM_CTL("Capture Level", cap_level, 0, SND_DJM_WINDEX_CAPLVL),
++	SND_DJM_CTL("Ch1 Input",   750mk2_cap1, 2, SND_DJM_WINDEX_CAP),
++	SND_DJM_CTL("Ch2 Input",   750mk2_cap2, 2, SND_DJM_WINDEX_CAP),
++	SND_DJM_CTL("Ch3 Input",   750mk2_cap3, 2, SND_DJM_WINDEX_CAP),
++	SND_DJM_CTL("Ch4 Input",   750mk2_cap4, 2, SND_DJM_WINDEX_CAP),
++	SND_DJM_CTL("Ch5 Input",   750mk2_cap5, 3, SND_DJM_WINDEX_CAP),
++	SND_DJM_CTL("Ch1 Output",   750mk2_pb1, 0, SND_DJM_WINDEX_PB),
++	SND_DJM_CTL("Ch2 Output",   750mk2_pb2, 1, SND_DJM_WINDEX_PB),
++	SND_DJM_CTL("Ch3 Output",   750mk2_pb3, 2, SND_DJM_WINDEX_PB)
++};
++
+ 
+ static const struct snd_djm_device snd_djm_devices[] = {
+ 	SND_DJM_DEVICE(250mk2),
+ 	SND_DJM_DEVICE(750),
++	SND_DJM_DEVICE(750mk2),
+ 	SND_DJM_DEVICE(850),
+ 	SND_DJM_DEVICE(900nxs2)
+ };
+@@ -3235,6 +3266,9 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+ 	case USB_ID(0x08e4, 0x017f): /* Pioneer DJ DJM-750 */
+ 		err = snd_djm_controls_create(mixer, SND_DJM_750_IDX);
+ 		break;
++	case USB_ID(0x2b73, 0x001b): /* Pioneer DJ DJM-750MK2 */
++		err = snd_djm_controls_create(mixer, SND_DJM_750MK2_IDX);
++		break;
+ 	case USB_ID(0x08e4, 0x0163): /* Pioneer DJ DJM-850 */
+ 		err = snd_djm_controls_create(mixer, SND_DJM_850_IDX);
+ 		break;
+diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
+index 2af8c68fac275..b1522e43173e1 100644
+--- a/sound/usb/quirks-table.h
++++ b/sound/usb/quirks-table.h
+@@ -3892,6 +3892,64 @@ YAMAHA_DEVICE(0x7010, "UB99"),
+ 		}
+ 	}
+ },
++{
++	/*
++	 * Pioneer DJ DJM-750MK2
++	 * 10 channels playback & 12 channels capture @ 48kHz S24LE
++	 */
++	USB_DEVICE_VENDOR_SPEC(0x2b73, 0x001b),
++	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
++		.ifnum = QUIRK_ANY_INTERFACE,
++		.type = QUIRK_COMPOSITE,
++		.data = (const struct snd_usb_audio_quirk[]) {
++			{
++				.ifnum = 0,
++				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
++				.data = &(const struct audioformat) {
++					.formats = SNDRV_PCM_FMTBIT_S24_3LE,
++					.channels = 10,
++					.iface = 0,
++					.altsetting = 1,
++					.altset_idx = 1,
++					.endpoint = 0x01,
++					.ep_attr = USB_ENDPOINT_XFER_ISOC|
++					    USB_ENDPOINT_SYNC_ASYNC,
++					.rates = SNDRV_PCM_RATE_48000,
++					.rate_min = 48000,
++					.rate_max = 48000,
++					.nr_rates = 1,
++					.rate_table = (unsigned int[]) {
++						48000
++					}
++				}
++			},
++			{
++				.ifnum = 0,
++				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
++				.data = &(const struct audioformat) {
++					.formats = SNDRV_PCM_FMTBIT_S24_3LE,
++					.channels = 12,
++					.iface = 0,
++					.altsetting = 1,
++					.altset_idx = 1,
++					.endpoint = 0x82,
++					.ep_idx = 1,
++					.ep_attr = USB_ENDPOINT_XFER_ISOC|
++						USB_ENDPOINT_SYNC_ASYNC|
++						USB_ENDPOINT_USAGE_IMPLICIT_FB,
++					.rates = SNDRV_PCM_RATE_48000,
++					.rate_min = 48000,
++					.rate_max = 48000,
++					.nr_rates = 1,
++					.rate_table = (unsigned int[]) { 48000 }
++				}
++			},
++			{
++				.ifnum = -1
++			}
++		}
++	}
++},
+ {
+ 	/*
+ 	 * Pioneer DJ DJM-850
+diff --git a/tools/build/feature/test-all.c b/tools/build/feature/test-all.c
+index 9204395272912..0b243ce842be3 100644
+--- a/tools/build/feature/test-all.c
++++ b/tools/build/feature/test-all.c
+@@ -200,7 +200,6 @@ int main(int argc, char *argv[])
+ 	main_test_timerfd();
+ 	main_test_stackprotector_all();
+ 	main_test_libdw_dwarf_unwind();
+-	main_test_sync_compare_and_swap(argc, argv);
+ 	main_test_zlib();
+ 	main_test_pthread_attr_setaffinity_np();
+ 	main_test_pthread_barrier();
+diff --git a/tools/perf/bench/futex-lock-pi.c b/tools/perf/bench/futex-lock-pi.c
+index 5d1fe9c35807a..137890f78e17a 100644
+--- a/tools/perf/bench/futex-lock-pi.c
++++ b/tools/perf/bench/futex-lock-pi.c
+@@ -233,6 +233,7 @@ int bench_futex_lock_pi(int argc, const char **argv)
+ 	print_summary();
+ 
+ 	free(worker);
++	perf_cpu_map__put(cpu);
+ 	return ret;
+ err:
+ 	usage_with_options(bench_futex_lock_pi_usage, options);
+diff --git a/tools/perf/bench/futex-requeue.c b/tools/perf/bench/futex-requeue.c
+index 97fe31fd3a236..f7a5ffebb9408 100644
+--- a/tools/perf/bench/futex-requeue.c
++++ b/tools/perf/bench/futex-requeue.c
+@@ -294,6 +294,7 @@ int bench_futex_requeue(int argc, const char **argv)
+ 	print_summary();
+ 
+ 	free(worker);
++	perf_cpu_map__put(cpu);
+ 	return ret;
+ err:
+ 	usage_with_options(bench_futex_requeue_usage, options);
+diff --git a/tools/perf/bench/futex-wake-parallel.c b/tools/perf/bench/futex-wake-parallel.c
+index e970e6b9ad535..0983f40b4b408 100644
+--- a/tools/perf/bench/futex-wake-parallel.c
++++ b/tools/perf/bench/futex-wake-parallel.c
+@@ -329,6 +329,7 @@ int bench_futex_wake_parallel(int argc, const char **argv)
+ 	print_summary();
+ 
+ 	free(blocked_worker);
++	perf_cpu_map__put(cpu);
+ 	return ret;
+ }
+ #endif /* HAVE_PTHREAD_BARRIER */
+diff --git a/tools/perf/bench/futex-wake.c b/tools/perf/bench/futex-wake.c
+index 77f058a477903..2226a475e782b 100644
+--- a/tools/perf/bench/futex-wake.c
++++ b/tools/perf/bench/futex-wake.c
+@@ -222,5 +222,6 @@ int bench_futex_wake(int argc, const char **argv)
+ 	print_summary();
+ 
+ 	free(worker);
++	perf_cpu_map__put(cpu);
+ 	return ret;
+ }
+diff --git a/tools/perf/tests/shell/record+zstd_comp_decomp.sh b/tools/perf/tests/shell/record+zstd_comp_decomp.sh
+index 8a168cf8bacca..49bd875d51227 100755
+--- a/tools/perf/tests/shell/record+zstd_comp_decomp.sh
++++ b/tools/perf/tests/shell/record+zstd_comp_decomp.sh
+@@ -12,7 +12,7 @@ skip_if_no_z_record() {
+ 
+ collect_z_record() {
+ 	echo "Collecting compressed record file:"
+-	[[ "$(uname -m)" != s390x ]] && gflag='-g'
++	[ "$(uname -m)" != s390x ] && gflag='-g'
+ 	$perf_tool record -o $trace_file $gflag -z -F 5000 -- \
+ 		dd count=500 if=/dev/urandom of=/dev/null
+ }
+diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c
+index a410b3968b3af..16ad0e6e9e9c5 100644
+--- a/tools/perf/util/bpf-event.c
++++ b/tools/perf/util/bpf-event.c
+@@ -120,7 +120,11 @@ static int perf_env__fetch_btf(struct perf_env *env,
+ 	node->data_size = data_size;
+ 	memcpy(node->data, data, data_size);
+ 
+-	perf_env__insert_btf(env, node);
++	if (!perf_env__insert_btf(env, node)) {
++		/* Insertion failed because of a duplicate. */
++		free(node);
++		return -1;
++	}
+ 	return 0;
+ }
+ 
+diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c
+index cf773f0dec384..5b24eb010336c 100644
+--- a/tools/perf/util/env.c
++++ b/tools/perf/util/env.c
+@@ -74,12 +74,13 @@ out:
+ 	return node;
+ }
+ 
+-void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node)
++bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node)
+ {
+ 	struct rb_node *parent = NULL;
+ 	__u32 btf_id = btf_node->id;
+ 	struct btf_node *node;
+ 	struct rb_node **p;
++	bool ret = true;
+ 
+ 	down_write(&env->bpf_progs.lock);
+ 	p = &env->bpf_progs.btfs.rb_node;
+@@ -93,6 +94,7 @@ void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node)
+ 			p = &(*p)->rb_right;
+ 		} else {
+ 			pr_debug("duplicated btf %u\n", btf_id);
++			ret = false;
+ 			goto out;
+ 		}
+ 	}
+@@ -102,6 +104,7 @@ void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node)
+ 	env->bpf_progs.btfs_cnt++;
+ out:
+ 	up_write(&env->bpf_progs.lock);
++	return ret;
+ }
+ 
+ struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id)
+diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h
+index 1383876f72b37..163e5ec503a26 100644
+--- a/tools/perf/util/env.h
++++ b/tools/perf/util/env.h
+@@ -167,7 +167,7 @@ void perf_env__insert_bpf_prog_info(struct perf_env *env,
+ 				    struct bpf_prog_info_node *info_node);
+ struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,
+ 							__u32 prog_id);
+-void perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
++bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
+ struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id);
+ 
+ int perf_env__numa_node(struct perf_env *env, int cpu);
+diff --git a/tools/testing/selftests/gpio/Makefile b/tools/testing/selftests/gpio/Makefile
+index 39f2bbe8dd3df..42ea7d2aa8440 100644
+--- a/tools/testing/selftests/gpio/Makefile
++++ b/tools/testing/selftests/gpio/Makefile
+@@ -3,5 +3,6 @@
+ TEST_PROGS := gpio-mockup.sh
+ TEST_FILES := gpio-mockup-sysfs.sh
+ TEST_GEN_PROGS_EXTENDED := gpio-mockup-cdev
++CFLAGS += -I../../../../usr/include
+ 
+ include ../lib.mk
+diff --git a/tools/testing/selftests/net/gre_gso.sh b/tools/testing/selftests/net/gre_gso.sh
+index fdeb44d621eb9..3224651db97b8 100755
+--- a/tools/testing/selftests/net/gre_gso.sh
++++ b/tools/testing/selftests/net/gre_gso.sh
+@@ -118,16 +118,18 @@ gre_gst_test_checks()
+ 	local addr=$2
+ 	local proto=$3
+ 
+-	$NS_EXEC nc $proto -kl $port >/dev/null &
++	[ "$proto" == 6 ] && addr="[$addr]"
++
++	$NS_EXEC socat - tcp${proto}-listen:$port,reuseaddr,fork >/dev/null &
+ 	PID=$!
+ 	while ! $NS_EXEC ss -ltn | grep -q $port; do ((i++)); sleep 0.01; done
+ 
+-	cat $TMPFILE | timeout 1 nc $proto -N $addr $port
++	cat $TMPFILE | timeout 1 socat -u STDIN TCP:$addr:$port
+ 	log_test $? 0 "$name - copy file w/ TSO"
+ 
+ 	ethtool -K veth0 tso off
+ 
+-	cat $TMPFILE | timeout 1 nc $proto -N $addr $port
++	cat $TMPFILE | timeout 1 socat -u STDIN TCP:$addr:$port
+ 	log_test $? 0 "$name - copy file w/ GSO"
+ 
+ 	ethtool -K veth0 tso on
+@@ -155,8 +157,8 @@ gre6_gso_test()
+ 
+ 	sleep 2
+ 
+-	gre_gst_test_checks GREv6/v4 172.16.2.2
+-	gre_gst_test_checks GREv6/v6 2001:db8:1::2 -6
++	gre_gst_test_checks GREv6/v4 172.16.2.2 4
++	gre_gst_test_checks GREv6/v6 2001:db8:1::2 6
+ 
+ 	cleanup
+ }
+@@ -212,8 +214,8 @@ if [ ! -x "$(command -v ip)" ]; then
+ 	exit $ksft_skip
+ fi
+ 
+-if [ ! -x "$(command -v nc)" ]; then
+-	echo "SKIP: Could not run test without nc tool"
++if [ ! -x "$(command -v socat)" ]; then
++	echo "SKIP: Could not run test without socat tool"
+ 	exit $ksft_skip
+ fi
+ 


             reply	other threads:[~2021-11-25 12:03 UTC|newest]

Thread overview: 230+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-25 12:03 Mike Pagano [this message]
  -- strict thread matches above, loose matches on Subject: below --
2025-04-10 13:15 [gentoo-commits] proj/linux-patches:5.15 commit in: / Mike Pagano
2025-03-13 12:57 Mike Pagano
2025-02-01 23:09 Mike Pagano
2025-01-23 17:05 Mike Pagano
2025-01-09 13:56 Mike Pagano
2024-12-19 18:09 Mike Pagano
2024-12-14 23:50 Mike Pagano
2024-11-17 18:18 Mike Pagano
2024-11-14 14:57 Mike Pagano
2024-11-08 16:32 Mike Pagano
2024-11-01 11:32 Mike Pagano
2024-11-01 11:31 Mike Pagano
2024-10-25 11:48 Mike Pagano
2024-10-22 16:59 Mike Pagano
2024-10-17 14:14 Mike Pagano
2024-10-17 14:07 Mike Pagano
2024-09-12 12:42 Mike Pagano
2024-09-04 13:53 Mike Pagano
2024-08-19 10:44 Mike Pagano
2024-07-27  9:23 Mike Pagano
2024-07-27  9:22 Mike Pagano
2024-07-27  9:17 Mike Pagano
2024-07-18 12:16 Mike Pagano
2024-07-05 10:55 Mike Pagano
2024-07-05 10:50 Mike Pagano
2024-06-16 14:34 Mike Pagano
2024-05-25 15:15 Mike Pagano
2024-05-17 11:37 Mike Pagano
2024-05-05 18:11 Mike Pagano
2024-05-02 15:02 Mike Pagano
2024-04-27 22:51 Mike Pagano
2024-04-27 17:07 Mike Pagano
2024-04-18  3:05 Alice Ferrazzi
2024-04-13 13:08 Mike Pagano
2024-04-10 15:11 Mike Pagano
2024-03-27 11:25 Mike Pagano
2024-03-15 22:01 Mike Pagano
2024-03-06 18:08 Mike Pagano
2024-03-01 13:08 Mike Pagano
2024-02-23 13:14 Mike Pagano
2024-02-23 12:38 Mike Pagano
2024-01-25 23:33 Mike Pagano
2024-01-15 18:48 Mike Pagano
2024-01-05 14:33 Mike Pagano
2023-12-23 10:56 Mike Pagano
2023-12-20 15:20 Mike Pagano
2023-12-13 18:28 Mike Pagano
2023-12-08 11:14 Mike Pagano
2023-12-03 11:17 Mike Pagano
2023-12-01 10:56 Mike Pagano
2023-12-01 10:49 Mike Pagano
2023-11-28 17:52 Mike Pagano
2023-11-20 11:24 Mike Pagano
2023-11-08 17:29 Mike Pagano
2023-10-25 11:37 Mike Pagano
2023-10-22 22:54 Mike Pagano
2023-10-19 22:31 Mike Pagano
2023-10-18 20:11 Mike Pagano
2023-10-10 22:57 Mike Pagano
2023-10-06 12:37 Mike Pagano
2023-10-05 14:23 Mike Pagano
2023-09-23 10:17 Mike Pagano
2023-09-19 13:21 Mike Pagano
2023-09-06 22:17 Mike Pagano
2023-09-02  9:57 Mike Pagano
2023-08-30 14:45 Mike Pagano
2023-08-26 15:20 Mike Pagano
2023-08-16 17:02 Mike Pagano
2023-08-11 14:51 Mike Pagano
2023-08-08 18:41 Mike Pagano
2023-08-03 11:49 Mike Pagano
2023-07-27 11:48 Mike Pagano
2023-07-24 20:27 Mike Pagano
2023-07-23 15:12 Mike Pagano
2023-07-05 20:29 Mike Pagano
2023-06-28 10:26 Mike Pagano
2023-06-21 14:54 Alice Ferrazzi
2023-06-14 10:37 Mike Pagano
2023-06-14 10:18 Mike Pagano
2023-06-09 11:30 Mike Pagano
2023-06-05 11:49 Mike Pagano
2023-05-30 16:52 Mike Pagano
2023-05-24 17:06 Mike Pagano
2023-05-17 10:58 Mike Pagano
2023-05-11 16:03 Mike Pagano
2023-05-11 14:50 Alice Ferrazzi
2023-05-10 17:55 Mike Pagano
2023-04-30 23:41 Alice Ferrazzi
2023-04-26 12:20 Alice Ferrazzi
2023-04-20 11:16 Alice Ferrazzi
2023-04-13 16:10 Mike Pagano
2023-04-05 10:01 Alice Ferrazzi
2023-03-30 11:01 Alice Ferrazzi
2023-03-22 14:08 Alice Ferrazzi
2023-03-17 10:44 Mike Pagano
2023-03-13 11:31 Alice Ferrazzi
2023-03-12 12:34 Alice Ferrazzi
2023-03-11 14:10 Mike Pagano
2023-03-10 12:47 Mike Pagano
2023-03-03 15:00 Mike Pagano
2023-03-03 12:29 Mike Pagano
2023-02-25 11:45 Mike Pagano
2023-02-24  3:04 Alice Ferrazzi
2023-02-22 14:02 Alice Ferrazzi
2023-02-14 18:35 Mike Pagano
2023-02-09 12:35 Mike Pagano
2023-02-06 12:47 Mike Pagano
2023-02-02 19:07 Mike Pagano
2023-02-01  8:07 Alice Ferrazzi
2023-01-24  7:04 Alice Ferrazzi
2023-01-22 15:32 Mike Pagano
2023-01-18 11:08 Mike Pagano
2023-01-14 13:51 Mike Pagano
2023-01-12 12:18 Mike Pagano
2022-12-31 15:30 Mike Pagano
2022-12-21 19:00 Alice Ferrazzi
2022-12-19 12:25 Alice Ferrazzi
2022-12-14 12:13 Mike Pagano
2022-12-08 11:46 Alice Ferrazzi
2022-12-02 17:25 Mike Pagano
2022-11-26 11:56 Mike Pagano
2022-11-16 11:33 Alice Ferrazzi
2022-11-10 18:09 Mike Pagano
2022-11-03 15:22 Mike Pagano
2022-10-29  9:53 Mike Pagano
2022-10-26 11:25 Mike Pagano
2022-10-15 10:04 Mike Pagano
2022-10-12 11:18 Mike Pagano
2022-10-05 11:57 Mike Pagano
2022-09-28  9:33 Mike Pagano
2022-09-23 12:39 Mike Pagano
2022-09-20 12:01 Mike Pagano
2022-09-15 10:30 Mike Pagano
2022-09-08 11:04 Mike Pagano
2022-09-08 10:48 Mike Pagano
2022-09-05 12:03 Mike Pagano
2022-08-31 15:38 Mike Pagano
2022-08-25 10:32 Mike Pagano
2022-08-21 16:53 Mike Pagano
2022-08-17 14:32 Mike Pagano
2022-08-11 12:33 Mike Pagano
2022-08-03 14:24 Alice Ferrazzi
2022-07-29 16:38 Mike Pagano
2022-07-23 11:54 Alice Ferrazzi
2022-07-23 11:54 Alice Ferrazzi
2022-07-21 20:07 Mike Pagano
2022-07-15 10:02 Mike Pagano
2022-07-12 15:59 Mike Pagano
2022-07-07 16:16 Mike Pagano
2022-07-02 16:11 Mike Pagano
2022-06-29 11:08 Mike Pagano
2022-06-25 19:44 Mike Pagano
2022-06-22 12:44 Mike Pagano
2022-06-16 11:59 Mike Pagano
2022-06-14 17:11 Mike Pagano
2022-06-09 11:27 Mike Pagano
2022-06-06 11:02 Mike Pagano
2022-05-30 14:00 Mike Pagano
2022-05-25 13:04 Mike Pagano
2022-05-25 11:53 Mike Pagano
2022-05-18  9:47 Mike Pagano
2022-05-15 22:09 Mike Pagano
2022-05-12 11:28 Mike Pagano
2022-05-12 11:27 Mike Pagano
2022-05-09 10:57 Mike Pagano
2022-05-01 17:03 Mike Pagano
2022-04-27 13:14 Mike Pagano
2022-04-27 13:11 Mike Pagano
2022-04-26 12:12 Mike Pagano
2022-04-20 12:07 Mike Pagano
2022-04-13 19:47 Mike Pagano
2022-04-13 19:47 Mike Pagano
2022-04-12 18:42 Mike Pagano
2022-04-08 12:57 Mike Pagano
2022-04-08 12:55 Mike Pagano
2022-03-28 22:50 Mike Pagano
2022-03-28 10:57 Mike Pagano
2022-03-23 11:53 Mike Pagano
2022-03-19 13:18 Mike Pagano
2022-03-16 13:56 Mike Pagano
2022-03-11 12:01 Mike Pagano
2022-03-08 18:33 Mike Pagano
2022-03-02 13:05 Mike Pagano
2022-02-26 20:11 Mike Pagano
2022-02-23 12:54 Mike Pagano
2022-02-23 12:36 Mike Pagano
2022-02-16 12:45 Mike Pagano
2022-02-11 12:34 Mike Pagano
2022-02-08 17:53 Mike Pagano
2022-02-08 15:13 Mike Pagano
2022-02-05 19:03 Mike Pagano
2022-02-05 12:12 Mike Pagano
2022-02-01 17:22 Mike Pagano
2022-01-30 20:55 Mike Pagano
2022-01-29 17:42 Mike Pagano
2022-01-27 12:01 Mike Pagano
2022-01-27 11:37 Mike Pagano
2022-01-20 13:40 Mike Pagano
2022-01-16 10:21 Mike Pagano
2022-01-11 15:34 Mike Pagano
2022-01-05 12:53 Mike Pagano
2022-01-05 12:52 Mike Pagano
2021-12-29 13:05 Mike Pagano
2021-12-22 14:04 Mike Pagano
2021-12-21 19:30 Mike Pagano
2021-12-17 11:54 Mike Pagano
2021-12-16 16:03 Mike Pagano
2021-12-14 10:35 Mike Pagano
2021-12-08 13:18 Mike Pagano
2021-12-08 12:52 Mike Pagano
2021-12-03 15:38 Mike Pagano
2021-12-01 12:48 Mike Pagano
2021-11-30  0:49 Mike Pagano
2021-11-29 23:36 Mike Pagano
2021-11-21 20:56 Mike Pagano
2021-11-21 20:37 Mike Pagano
2021-11-21 10:34 Mike Pagano
2021-11-19 14:51 Mike Pagano
2021-11-18 19:49 Mike Pagano
2021-11-18 19:49 Mike Pagano
2021-11-16 22:18 Mike Pagano
2021-11-15 11:40 Mike Pagano
2021-11-12 14:37 Mike Pagano
2021-11-06 13:45 Mike Pagano
2021-11-04 12:22 Mike Pagano
2021-11-01 11:52 Mike Pagano
2021-10-21 17:16 Mike Pagano
2021-10-03 21:17 Mike Pagano
2021-10-03 20:29 Mike Pagano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1637841787.10a5176e3cc2a9de7fc23b2caff20708456e0492.mpagano@gentoo \
    --to=mpagano@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox