commit:     d2f4e11aceda401f8cd59582e5321c2f3c1690fd
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Fri Nov 26 11:58:41 2021 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Fri Nov 26 11:58:41 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=d2f4e11a

Linux 5.4.162

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

 0000_README              |    4 +
 1161_linux-5.4.162.patch | 3747 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3751 insertions(+)

diff --git a/0000_README b/0000_README
index c4cd1ed0..645731c2 100644
--- a/0000_README
+++ b/0000_README
@@ -687,6 +687,10 @@ Patch:  1160_linux-5.4.161.patch
 From:   http://www.kernel.org
 Desc:   Linux 5.4.161
 
+Patch:  1161_linux-5.4.162.patch
+From:   http://www.kernel.org
+Desc:   Linux 5.4.162
+
 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/1161_linux-5.4.162.patch b/1161_linux-5.4.162.patch
new file mode 100644
index 00000000..fb59fb92
--- /dev/null
+++ b/1161_linux-5.4.162.patch
@@ -0,0 +1,3747 @@
+diff --git a/Makefile b/Makefile
+index f552556966f1d..e8b05f7d3b238 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 4
+-SUBLEVEL = 161
++SUBLEVEL = 162
+ EXTRAVERSION =
+ NAME = Kleptomaniac Octopus
+ 
+diff --git a/arch/arm/boot/dts/bcm-nsp.dtsi b/arch/arm/boot/dts/bcm-nsp.dtsi
+index 43ff85d31dc12..5a1352fd90d16 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>;
+@@ -217,7 +217,7 @@
+                       #dma-cells = <1>;
+               };
+ 
+-              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/ls1021a-tsn.dts 
b/arch/arm/boot/dts/ls1021a-tsn.dts
+index 5b7689094b70e..7235ce2a32936 100644
+--- a/arch/arm/boot/dts/ls1021a-tsn.dts
++++ b/arch/arm/boot/dts/ls1021a-tsn.dts
+@@ -247,7 +247,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 c62fcca7b4263..aeb8a40b6b601 100644
+--- a/arch/arm/boot/dts/ls1021a.dtsi
++++ b/arch/arm/boot/dts/ls1021a.dtsi
+@@ -311,39 +311,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>;
+@@ -984,4 +951,37 @@
+               };
+ 
+       };
++
++      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/arm64/boot/dts/freescale/fsl-ls1088a.dtsi 
b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
+index 407ebdb35cd2e..6b1b728de9e9c 100644
+--- a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
++++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
+@@ -637,56 +637,56 @@
+               };
+ 
+               cluster1_core0_watchdog: wdt@c000000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc000000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster1_core1_watchdog: wdt@c010000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc010000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster1_core2_watchdog: wdt@c020000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc020000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster1_core3_watchdog: wdt@c030000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc030000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster2_core0_watchdog: wdt@c100000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc100000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster2_core1_watchdog: wdt@c110000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc110000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster2_core2_watchdog: wdt@c120000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc120000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster2_core3_watchdog: wdt@c130000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc130000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+diff --git a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi 
b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
+index 82f0fe6acbfb7..4bf4a22faa61a 100644
+--- a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
++++ b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
+@@ -227,56 +227,56 @@
+               };
+ 
+               cluster1_core0_watchdog: wdt@c000000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc000000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster1_core1_watchdog: wdt@c010000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc010000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster2_core0_watchdog: wdt@c100000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc100000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster2_core1_watchdog: wdt@c110000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc110000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster3_core0_watchdog: wdt@c200000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc200000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster3_core1_watchdog: wdt@c210000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc210000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster4_core0_watchdog: wdt@c300000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc300000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+               };
+ 
+               cluster4_core1_watchdog: wdt@c310000 {
+-                      compatible = "arm,sp805-wdt", "arm,primecell";
++                      compatible = "arm,sp805", "arm,primecell";
+                       reg = <0x0 0xc310000 0x0 0x1000>;
+                       clocks = <&clockgen 4 3>, <&clockgen 4 3>;
+                       clock-names = "wdog_clk", "apb_pclk";
+diff --git a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi 
b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
+index 253cc345f143a..0c88b72094774 100644
+--- a/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
++++ b/arch/arm64/boot/dts/hisilicon/hi3660.dtsi
+@@ -1086,7 +1086,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>;
+@@ -1094,7 +1094,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 108e2a4227f66..568faaba7ace9 100644
+--- a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
++++ b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
+@@ -839,7 +839,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/msm8998.dtsi 
b/arch/arm64/boot/dts/qcom/msm8998.dtsi
+index ccd535edbf4e1..dcb79003ca0e6 100644
+--- a/arch/arm64/boot/dts/qcom/msm8998.dtsi
++++ b/arch/arm64/boot/dts/qcom/msm8998.dtsi
+@@ -246,38 +246,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;
+                       };
+               };
+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 2421ec71a201c..41a66787247b6 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 a2645262f8623..b92549fb32400 100644
+--- a/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
++++ b/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
+@@ -582,7 +582,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>;
+@@ -591,7 +591,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/kernel/vdso32/Makefile 
b/arch/arm64/kernel/vdso32/Makefile
+index 40dffe60b8454..894791f03596d 100644
+--- a/arch/arm64/kernel/vdso32/Makefile
++++ b/arch/arm64/kernel/vdso32/Makefile
+@@ -32,7 +32,8 @@ cc32-as-instr = $(call try-run,\
+ # As a result we set our own flags here.
+ 
+ # KBUILD_CPPFLAGS and NOSTDINC_FLAGS from top-level Makefile
+-VDSO_CPPFLAGS := -D__KERNEL__ -nostdinc -isystem $(shell $(CC_COMPAT) 
-print-file-name=include)
++VDSO_CPPFLAGS := -D__KERNEL__ -nostdinc
++VDSO_CPPFLAGS += -isystem $(shell $(CC_COMPAT) -print-file-name=include 
2>/dev/null)
+ VDSO_CPPFLAGS += $(LINUXINCLUDE)
+ 
+ # Common C and assembly flags
+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/mips/Kconfig b/arch/mips/Kconfig
+index 041d34975ea2c..9749818eed6d6 100644
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -294,6 +294,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 HAVE_CLK
+diff --git a/arch/mips/bcm63xx/clk.c b/arch/mips/bcm63xx/clk.c
+index 164115944a7fd..aba6e2d6a736c 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/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 dbace1f3e1a97..745ceb945fc50 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/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 c259c6b3ac5ab..5674f978b9830 100644
+--- a/arch/powerpc/boot/dts/pcm032.dts
++++ b/arch/powerpc/boot/dts/pcm032.dts
+@@ -22,7 +22,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/kvm/book3s_hv_rmhandlers.S 
b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+index f9c7326672b95..c9c6619564ffa 100644
+--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
++++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+@@ -2535,7 +2535,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
+@@ -2545,7 +2545,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/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/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/ipl.c b/arch/s390/kernel/ipl.c
+index 6837affc19e81..7795cdee6427d 100644
+--- a/arch/s390/kernel/ipl.c
++++ b/arch/s390/kernel/ipl.c
+@@ -1783,7 +1783,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);
+@@ -1822,6 +1822,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/sh/Kconfig.debug b/arch/sh/Kconfig.debug
+index 010b6c33bbba2..71acd3d9b9e83 100644
+--- a/arch/sh/Kconfig.debug
++++ b/arch/sh/Kconfig.debug
+@@ -58,6 +58,7 @@ config DUMP_CODE
+ 
+ config DWARF_UNWINDER
+       bool "Enable the DWARF unwinder for stacktraces"
++      depends on DEBUG_KERNEL
+       select FRAME_POINTER
+       depends on SUPERH32
+       default n
+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/x86/events/intel/uncore_snbep.c 
b/arch/x86/events/intel/uncore_snbep.c
+index 9096a1693942d..0f61f46e6086f 100644
+--- a/arch/x86/events/intel/uncore_snbep.c
++++ b/arch/x86/events/intel/uncore_snbep.c
+@@ -3479,6 +3479,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))
+@@ -3546,6 +3549,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
+ };
+ 
+diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
+index 812db1ac8cb11..df4a4a9dc1e84 100644
+--- a/arch/x86/hyperv/hv_init.c
++++ b/arch/x86/hyperv/hv_init.c
+@@ -163,6 +163,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/drivers/base/firmware_loader/main.c 
b/drivers/base/firmware_loader/main.c
+index 249349f64bfe9..4f6b76bd957ef 100644
+--- a/drivers/base/firmware_loader/main.c
++++ b/drivers/base/firmware_loader/main.c
+@@ -98,12 +98,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,
+@@ -115,9 +118,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/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c
+index af957179b135e..48122f574cb65 100644
+--- a/drivers/clk/clk-ast2600.c
++++ b/drivers/clk/clk-ast2600.c
+@@ -48,6 +48,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:
+@@ -190,9 +192,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;
+@@ -664,7 +665,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);
+ 
+@@ -695,8 +696,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))
+@@ -741,6 +741,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 bc931988fe7b2..f3ac5a524f4ed 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 7490d4f4d9366..dff759c0f6193 100644
+--- a/drivers/clk/ingenic/cgu.c
++++ b/drivers/clk/ingenic/cgu.c
+@@ -426,15 +426,15 @@ ingenic_clk_calc_div(const struct ingenic_cgu_clk_info 
*clk_info,
+       }
+ 
+       /* 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 d004cdaa0e39a..c1e1148f0261d 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 = {
+@@ -3453,7 +3439,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/gpu/drm/amd/amdgpu/amdgpu_connectors.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+index cda0a76a733d3..0d39e386f6e9c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+@@ -829,6 +829,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/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
+index abc8c42b8b0c1..85583f9146305 100644
+--- a/drivers/gpu/drm/i915/display/intel_dp.c
++++ b/drivers/gpu/drm/i915/display/intel_dp.c
+@@ -166,6 +166,12 @@ static void vlv_steal_power_sequencer(struct 
drm_i915_private *dev_priv,
+                                     enum pipe pipe);
+ static void intel_dp_unset_edid(struct intel_dp *intel_dp);
+ 
++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)
+ {
+@@ -4261,6 +4267,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];
+@@ -7167,6 +7176,8 @@ intel_dp_init_connector(struct intel_digital_port 
*intel_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_link_params = true;
+       intel_dp->pps_pipe = INVALID_PIPE;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c 
b/drivers/gpu/drm/nouveau/nouveau_drm.c
+index 5347e5bdee8cc..e18938972a895 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
++++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
+@@ -779,7 +779,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);
+ 
+       dev->irq_enabled = false;
+       client = nvxx_client(&drm->client.base);
+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 ddb61a60c6104..ef69773b5bed5 100644
+--- a/drivers/gpu/drm/udl/udl_connector.c
++++ b/drivers/gpu/drm/udl/udl_connector.c
+@@ -29,7 +29,7 @@ static int udl_get_edid_block(void *data, u8 *buf, unsigned 
int block,
+               ret = usb_control_msg(udl->udev,
+                                     usb_rcvctrlpipe(udl->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/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c 
b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+index 057a4b0100106..8850da8e25d69 100644
+--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
++++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+@@ -1015,6 +1015,8 @@ static int st_lsm6dsx_set_odr(struct st_lsm6dsx_sensor 
*sensor, u16 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:
+@@ -1040,8 +1042,8 @@ static int st_lsm6dsx_set_odr(struct st_lsm6dsx_sensor 
*sensor, u16 req_odr)
+               }
+               break;
+       }
+-      default:
+-              break;
++      default: /* should never occur */
++              return -EINVAL;
+       }
+ 
+       if (req_odr > 0) {
+diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c 
b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+index a96f9142fe08e..dd006b177b544 100644
+--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
++++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+@@ -3081,8 +3081,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);
+ 
+@@ -3094,9 +3097,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/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/freescale/dpaa2/dpaa2-eth.c 
b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
+index 7af7cc7c8669a..34540e604f748 100644
+--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
++++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
+@@ -3616,10 +3616,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/i40e/i40e.h 
b/drivers/net/ethernet/intel/i40e/i40e.h
+index e571c6116c4b7..f8422dbfd54e6 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e.h
++++ b/drivers/net/ethernet/intel/i40e/i40e.h
+@@ -169,6 +169,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__,
+ };
+@@ -1146,6 +1147,7 @@ void i40e_ptp_save_hw_time(struct i40e_pf *pf);
+ 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_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 917be10a5cf5c..ce237da003ddb 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -1776,6 +1776,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;
+@@ -1783,13 +1784,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++) {
+@@ -1867,15 +1888,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) {
+@@ -2609,7 +2626,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) {
+@@ -5371,6 +5389,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
+@@ -5661,24 +5731,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
+@@ -6186,26 +6238,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
+@@ -7497,12 +7538,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];
+@@ -8067,9 +8116,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;
+       }
+ 
+@@ -13388,7 +13436,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 e561073054865..6e61aea42a0dd 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+@@ -621,14 +621,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));
+ 
+@@ -666,6 +665,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;
+ 
+@@ -2097,11 +2100,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;
+@@ -2190,9 +2194,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:
+@@ -4050,34 +4060,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
+@@ -4134,19 +4116,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_disable_vf(vf);
++      /* 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);
+ 
+diff --git a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c 
b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
+index 758bef02a2a86..ad1e796e5544a 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
+@@ -962,14 +962,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 bc46c262b42d8..484c2a6f1625d 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf_main.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_main.c
+@@ -1626,8 +1626,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;
+@@ -2057,8 +2056,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;
+@@ -2342,7 +2341,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) {
+@@ -3034,11 +3033,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 */
+@@ -3425,7 +3424,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_main.c 
b/drivers/net/ethernet/intel/ice/ice_main.c
+index d0ccb7ad447b1..6370e96ebfacc 100644
+--- a/drivers/net/ethernet/intel/ice/ice_main.c
++++ b/drivers/net/ethernet/intel/ice/ice_main.c
+@@ -3005,9 +3005,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/marvell/mvpp2/mvpp2_main.c 
b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+index dac0e51e6aafd..16a390c77d198 100644
+--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+@@ -4545,7 +4545,7 @@ static int mvpp2_port_init(struct mvpp2_port *port)
+       struct mvpp2 *priv = port->priv;
+       struct mvpp2_txq_pcpu *txq_pcpu;
+       unsigned int thread;
+-      int queue, err, val;
++      int queue, err;
+ 
+       /* Checks for hardware constraints */
+       if (port->first_rxq + port->nrxqs >
+@@ -4559,18 +4559,6 @@ static int mvpp2_port_init(struct mvpp2_port *port)
+       mvpp2_egress_disable(port);
+       mvpp2_port_disable(port);
+ 
+-      if (mvpp2_is_xlg(port->phy_interface)) {
+-              val = readl(port->base + MVPP22_XLG_CTRL0_REG);
+-              val &= ~MVPP22_XLG_CTRL0_FORCE_LINK_PASS;
+-              val |= MVPP22_XLG_CTRL0_FORCE_LINK_DOWN;
+-              writel(val, port->base + MVPP22_XLG_CTRL0_REG);
+-      } else {
+-              val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
+-              val &= ~MVPP2_GMAC_FORCE_LINK_PASS;
+-              val |= MVPP2_GMAC_FORCE_LINK_DOWN;
+-              writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
+-      }
+-
+       port->tx_time_coal = MVPP2_TXDONE_COAL_USEC;
+ 
+       port->txqs = devm_kcalloc(dev, port->ntxqs, sizeof(*port->txqs),
+diff --git a/drivers/net/tun.c b/drivers/net/tun.c
+index 7c40ae058e6d1..10211ea605140 100644
+--- a/drivers/net/tun.c
++++ b/drivers/net/tun.c
+@@ -1071,6 +1071,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;
+ 
+@@ -1117,6 +1118,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/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c
+index 8c0867bda8280..0dfaa1a43b674 100644
+--- a/drivers/platform/x86/hp_accel.c
++++ b/drivers/platform/x86/hp_accel.c
+@@ -372,9 +372,11 @@ static int lis3lv02d_add(struct acpi_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/scsi/advansys.c b/drivers/scsi/advansys.c
+index a242a62caaa16..7b3e52ff5f516 100644
+--- a/drivers/scsi/advansys.c
++++ b/drivers/scsi/advansys.c
+@@ -3366,8 +3366,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_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
+index 4a7ceaa34341c..51bab0979527b 100644
+--- a/drivers/scsi/lpfc/lpfc_sli.c
++++ b/drivers/scsi/lpfc/lpfc_sli.c
+@@ -19692,6 +19692,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/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
+index 12064ce76777d..16432d42a50aa 100644
+--- a/drivers/scsi/scsi_sysfs.c
++++ b/drivers/scsi/scsi_sysfs.c
+@@ -776,6 +776,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);
+@@ -794,20 +795,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/sh/maple/maple.c b/drivers/sh/maple/maple.c
+index e5d7fb81ad665..44a931d41a132 100644
+--- a/drivers/sh/maple/maple.c
++++ b/drivers/sh/maple/maple.c
+@@ -835,8 +835,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);
+@@ -849,6 +851,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/target/target_core_alua.c 
b/drivers/target/target_core_alua.c
+index 385e4cf9cfa63..0fc3135d3e4f6 100644
+--- a/drivers/target/target_core_alua.c
++++ b/drivers/target/target_core_alua.c
+@@ -1702,7 +1702,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 2d19f0e332b01..20fe287039857 100644
+--- a/drivers/target/target_core_device.c
++++ b/drivers/target/target_core_device.c
+@@ -758,6 +758,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;
+       dev->t10_alua.t10_dev = dev;
+ 
+diff --git a/drivers/target/target_core_internal.h 
b/drivers/target/target_core_internal.h
+index e7b3c6e5d5744..e4f072a680d41 100644
+--- a/drivers/target/target_core_internal.h
++++ b/drivers/target/target_core_internal.h
+@@ -150,6 +150,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 5cf9e7677926f..f52fe40002259 100644
+--- a/drivers/target/target_core_transport.c
++++ b/drivers/target/target_core_transport.c
+@@ -2021,32 +2021,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);
+@@ -2054,6 +2057,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;
+ }
+ 
+@@ -2091,29 +2100,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);
+ }
+ 
+ /*
+@@ -2131,14 +2159,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",
+@@ -2147,7 +2178,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 ec145a59f1993..bb148dbfbb88f 100644
+--- a/drivers/tty/tty_buffer.c
++++ b/drivers/tty/tty_buffer.c
+@@ -534,6 +534,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 5ef0747225f6b..e0b25dd869094 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 fed43c6dd85cc..b611c8b09a89f 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 4ecfbf6bb1fa8..902507da8aa85 100644
+--- a/drivers/usb/musb/tusb6010.c
++++ b/drivers/usb/musb/tusb6010.c
+@@ -1103,6 +1103,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/tps6598x.c b/drivers/usb/typec/tps6598x.c
+index a38d1409f15b7..67bebee693301 100644
+--- a/drivers/usb/typec/tps6598x.c
++++ b/drivers/usb/typec/tps6598x.c
+@@ -109,7 +109,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 79c9bd8d30254..559a7305cadaa 100644
+--- a/drivers/video/console/sticon.c
++++ b/drivers/video/console/sticon.c
+@@ -291,13 +291,13 @@ static unsigned long sticon_getxy(struct vc_data *conp, 
unsigned long pos,
+ static u8 sticon_build_attr(struct vc_data *conp, u8 color, u8 intens,
+                           u8 blink, u8 underline, u8 reverse, u8 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/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c
+index 11be02459b876..eb592b92aa9cd 100644
+--- a/fs/btrfs/async-thread.c
++++ b/fs/btrfs/async-thread.c
+@@ -237,6 +237,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
+@@ -325,6 +332,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);
+       }
+diff --git a/fs/udf/dir.c b/fs/udf/dir.c
+index c19dba45aa209..d0f92a52e3bab 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"
+@@ -44,7 +45,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;
+@@ -58,6 +59,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))
+@@ -68,6 +70,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;
+@@ -123,13 +140,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;
+@@ -187,8 +212,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 3c3d3b20889c8..3c009562375d3 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)
+@@ -135,6 +136,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 5663bae95700c..5193b94c06834 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/asm-generic/tlb.h b/include/asm-generic/tlb.h
+index c716ea81e6531..46294ef620ff9 100644
+--- a/include/asm-generic/tlb.h
++++ b/include/asm-generic/tlb.h
+@@ -495,6 +495,38 @@ static inline void tlb_end_vma(struct mmu_gather *tlb, 
struct vm_area_struct *vm
+ }
+ #endif
+ 
++/*
++ * tlb_flush_{pte|pmd|pud|p4d}_range() adjust the tlb->start and tlb->end,
++ * and set corresponding cleared_*.
++ */
++static inline void tlb_flush_pte_range(struct mmu_gather *tlb,
++                                   unsigned long address, unsigned long size)
++{
++      __tlb_adjust_range(tlb, address, size);
++      tlb->cleared_ptes = 1;
++}
++
++static inline void tlb_flush_pmd_range(struct mmu_gather *tlb,
++                                   unsigned long address, unsigned long size)
++{
++      __tlb_adjust_range(tlb, address, size);
++      tlb->cleared_pmds = 1;
++}
++
++static inline void tlb_flush_pud_range(struct mmu_gather *tlb,
++                                   unsigned long address, unsigned long size)
++{
++      __tlb_adjust_range(tlb, address, size);
++      tlb->cleared_puds = 1;
++}
++
++static inline void tlb_flush_p4d_range(struct mmu_gather *tlb,
++                                   unsigned long address, unsigned long size)
++{
++      __tlb_adjust_range(tlb, address, size);
++      tlb->cleared_p4ds = 1;
++}
++
+ #ifndef __tlb_remove_tlb_entry
+ #define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0)
+ #endif
+@@ -508,19 +540,17 @@ static inline void tlb_end_vma(struct mmu_gather *tlb, 
struct vm_area_struct *vm
+  */
+ #define tlb_remove_tlb_entry(tlb, ptep, address)              \
+       do {                                                    \
+-              __tlb_adjust_range(tlb, address, PAGE_SIZE);    \
+-              tlb->cleared_ptes = 1;                          \
++              tlb_flush_pte_range(tlb, address, PAGE_SIZE);   \
+               __tlb_remove_tlb_entry(tlb, ptep, address);     \
+       } while (0)
+ 
+ #define tlb_remove_huge_tlb_entry(h, tlb, ptep, address)      \
+       do {                                                    \
+               unsigned long _sz = huge_page_size(h);          \
+-              __tlb_adjust_range(tlb, address, _sz);          \
+               if (_sz == PMD_SIZE)                            \
+-                      tlb->cleared_pmds = 1;                  \
++                      tlb_flush_pmd_range(tlb, address, _sz); \
+               else if (_sz == PUD_SIZE)                       \
+-                      tlb->cleared_puds = 1;                  \
++                      tlb_flush_pud_range(tlb, address, _sz); \
+               __tlb_remove_tlb_entry(tlb, ptep, address);     \
+       } while (0)
+ 
+@@ -534,8 +564,7 @@ static inline void tlb_end_vma(struct mmu_gather *tlb, 
struct vm_area_struct *vm
+ 
+ #define tlb_remove_pmd_tlb_entry(tlb, pmdp, address)                  \
+       do {                                                            \
+-              __tlb_adjust_range(tlb, address, HPAGE_PMD_SIZE);       \
+-              tlb->cleared_pmds = 1;                                  \
++              tlb_flush_pmd_range(tlb, address, HPAGE_PMD_SIZE);      \
+               __tlb_remove_pmd_tlb_entry(tlb, pmdp, address);         \
+       } while (0)
+ 
+@@ -549,8 +578,7 @@ static inline void tlb_end_vma(struct mmu_gather *tlb, 
struct vm_area_struct *vm
+ 
+ #define tlb_remove_pud_tlb_entry(tlb, pudp, address)                  \
+       do {                                                            \
+-              __tlb_adjust_range(tlb, address, HPAGE_PUD_SIZE);       \
+-              tlb->cleared_puds = 1;                                  \
++              tlb_flush_pud_range(tlb, address, HPAGE_PUD_SIZE);      \
+               __tlb_remove_pud_tlb_entry(tlb, pudp, address);         \
+       } while (0)
+ 
+@@ -575,9 +603,8 @@ static inline void tlb_end_vma(struct mmu_gather *tlb, 
struct vm_area_struct *vm
+ #ifndef pte_free_tlb
+ #define pte_free_tlb(tlb, ptep, address)                      \
+       do {                                                    \
+-              __tlb_adjust_range(tlb, address, PAGE_SIZE);    \
++              tlb_flush_pmd_range(tlb, address, PAGE_SIZE);   \
+               tlb->freed_tables = 1;                          \
+-              tlb->cleared_pmds = 1;                          \
+               __pte_free_tlb(tlb, ptep, address);             \
+       } while (0)
+ #endif
+@@ -585,9 +612,8 @@ static inline void tlb_end_vma(struct mmu_gather *tlb, 
struct vm_area_struct *vm
+ #ifndef pmd_free_tlb
+ #define pmd_free_tlb(tlb, pmdp, address)                      \
+       do {                                                    \
+-              __tlb_adjust_range(tlb, address, PAGE_SIZE);    \
++              tlb_flush_pud_range(tlb, address, PAGE_SIZE);   \
+               tlb->freed_tables = 1;                          \
+-              tlb->cleared_puds = 1;                          \
+               __pmd_free_tlb(tlb, pmdp, address);             \
+       } while (0)
+ #endif
+@@ -596,9 +622,8 @@ static inline void tlb_end_vma(struct mmu_gather *tlb, 
struct vm_area_struct *vm
+ #ifndef pud_free_tlb
+ #define pud_free_tlb(tlb, pudp, address)                      \
+       do {                                                    \
+-              __tlb_adjust_range(tlb, address, PAGE_SIZE);    \
++              tlb_flush_p4d_range(tlb, address, PAGE_SIZE);   \
+               tlb->freed_tables = 1;                          \
+-              tlb->cleared_p4ds = 1;                          \
+               __pud_free_tlb(tlb, pudp, address);             \
+       } while (0)
+ #endif
+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/rdma/rdma_netlink.h b/include/rdma/rdma_netlink.h
+index ab22759de7ea0..7b3ef7a3d8d04 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 ef88b20c7b0a5..23dc8deac344d 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 7c9716fe731e2..59d7ebb8bbaf4 100644
+--- a/include/target/target_core_base.h
++++ b/include/target/target_core_base.h
+@@ -781,8 +781,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;
+@@ -804,6 +805,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        state_list;
+       struct list_head        qf_cmd_list;
+diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
+index 1796ff99c3e9c..a7613efc271ab 100644
+--- a/include/trace/events/f2fs.h
++++ b/include/trace/events/f2fs.h
+@@ -793,20 +793,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)
+ );
+ 
+@@ -820,7 +820,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)
+       ),
+@@ -828,14 +828,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/util.c b/ipc/util.c
+index 1821b6386d3b4..09c3bd9f8e768 100644
+--- a/ipc/util.c
++++ b/ipc/util.c
+@@ -446,8 +446,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));
+ }
+ 
+ /**
+@@ -462,7 +462,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/events/core.c b/kernel/events/core.c
+index 1993a741d2dc5..6ffe3d3e7b06d 100644
+--- a/kernel/events/core.c
++++ b/kernel/events/core.c
+@@ -6536,7 +6536,6 @@ void perf_output_sample(struct perf_output_handle 
*handle,
+ static u64 perf_virt_to_phys(u64 virt)
+ {
+       u64 phys_addr = 0;
+-      struct page *p = NULL;
+ 
+       if (!virt)
+               return 0;
+@@ -6555,14 +6554,15 @@ static u64 perf_virt_to_phys(u64 virt)
+                * If failed, leave phys_addr as 0.
+                */
+               if (current->mm != NULL) {
++                      struct page *p;
++
+                       pagefault_disable();
+-                      if (__get_user_pages_fast(virt, 1, 0, &p) == 1)
++                      if (__get_user_pages_fast(virt, 1, 0, &p) == 1) {
+                               phys_addr = page_to_phys(p) + virt % PAGE_SIZE;
++                              put_page(p);
++                      }
+                       pagefault_enable();
+               }
+-
+-              if (p)
+-                      put_page(p);
+       }
+ 
+       return phys_addr;
+diff --git a/kernel/sched/core.c b/kernel/sched/core.c
+index 5dc43d37e6a2b..f8ca0738d729e 100644
+--- a/kernel/sched/core.c
++++ b/kernel/sched/core.c
+@@ -2482,6 +2482,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);
+ }
+ #endif /* CONFIG_SMP */
+diff --git a/kernel/trace/trace_events_hist.c 
b/kernel/trace/trace_events_hist.c
+index f63766366e238..8b33a3c872750 100644
+--- a/kernel/trace/trace_events_hist.c
++++ b/kernel/trace/trace_events_hist.c
+@@ -149,6 +149,8 @@ struct hist_field {
+        */
+       unsigned int                    var_ref_idx;
+       bool                            read_once;
++
++      unsigned int                    var_str_idx;
+ };
+ 
+ static u64 hist_field_none(struct hist_field *field,
+@@ -351,6 +353,7 @@ struct hist_trigger_data {
+       unsigned int                    n_keys;
+       unsigned int                    n_fields;
+       unsigned int                    n_vars;
++      unsigned int                    n_var_str;
+       unsigned int                    key_size;
+       struct tracing_map_sort_key     sort_keys[TRACING_MAP_SORT_KEYS_MAX];
+       unsigned int                    n_sort_keys;
+@@ -2305,7 +2308,12 @@ static int hist_trigger_elt_data_alloc(struct 
tracing_map_elt *elt)
+               }
+       }
+ 
+-      n_str = hist_data->n_field_var_str + hist_data->n_save_var_str;
++      n_str = hist_data->n_field_var_str + hist_data->n_save_var_str +
++              hist_data->n_var_str;
++      if (n_str > SYNTH_FIELDS_MAX) {
++              hist_elt_data_free(elt_data);
++              return -EINVAL;
++      }
+ 
+       size = STR_VAR_LEN_MAX;
+ 
+@@ -2582,9 +2590,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;
+@@ -3522,7 +3531,7 @@ static inline void __update_field_vars(struct 
tracing_map_elt *elt,
+                       char *str = elt_data->field_var_str[j++];
+                       char *val_str = (char *)(uintptr_t)var_val;
+ 
+-                      strscpy(str, val_str, STR_VAR_LEN_MAX);
++                      strscpy(str, val_str, val->size);
+                       var_val = (u64)(uintptr_t)str;
+               }
+               tracing_map_set_var(elt, var_idx, var_val);
+@@ -4599,6 +4608,7 @@ static int create_var_field(struct hist_trigger_data 
*hist_data,
+ {
+       struct trace_array *tr = hist_data->event_file->tr;
+       unsigned long flags = 0;
++      int ret;
+ 
+       if (WARN_ON(val_idx >= TRACING_MAP_VALS_MAX + TRACING_MAP_VARS_MAX))
+               return -EINVAL;
+@@ -4613,7 +4623,12 @@ static int create_var_field(struct hist_trigger_data 
*hist_data,
+       if (WARN_ON(hist_data->n_vars > TRACING_MAP_VARS_MAX))
+               return -EINVAL;
+ 
+-      return __create_val_field(hist_data, val_idx, file, var_name, expr_str, 
flags);
++      ret = __create_val_field(hist_data, val_idx, file, var_name, expr_str, 
flags);
++
++      if (hist_data->fields[val_idx]->flags & HIST_FIELD_FL_STRING)
++              hist_data->fields[val_idx]->var_str_idx = 
hist_data->n_var_str++;
++
++      return ret;
+ }
+ 
+ static int create_val_fields(struct hist_trigger_data *hist_data,
+@@ -5333,6 +5348,22 @@ static void hist_trigger_elt_update(struct 
hist_trigger_data *hist_data,
+               hist_val = hist_field->fn(hist_field, elt, rbe, rec);
+               if (hist_field->flags & HIST_FIELD_FL_VAR) {
+                       var_idx = hist_field->var.idx;
++
++                      if (hist_field->flags & HIST_FIELD_FL_STRING) {
++                              unsigned int str_start, var_str_idx, idx;
++                              char *str, *val_str;
++
++                              str_start = hist_data->n_field_var_str +
++                                      hist_data->n_save_var_str;
++                              var_str_idx = hist_field->var_str_idx;
++                              idx = str_start + var_str_idx;
++
++                              str = elt_data->field_var_str[idx];
++                              val_str = (char *)(uintptr_t)hist_val;
++                              strscpy(str, val_str, hist_field->size);
++
++                              hist_val = (u64)(uintptr_t)str;
++                      }
+                       tracing_map_set_var(elt, var_idx, hist_val);
+                       continue;
+               }
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 95a32749af4da..20da6ede77041 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -3589,6 +3589,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));
+@@ -3617,10 +3618,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, &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;
+               }
+ 
+@@ -3677,6 +3676,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,
+diff --git a/mm/slab.h b/mm/slab.h
+index b2b01694dc43f..61feda3d7e008 100644
+--- a/mm/slab.h
++++ b/mm/slab.h
+@@ -211,7 +211,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/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
+index 385fccdcf69d0..0da90e73c79bf 100644
+--- a/net/batman-adv/fragmentation.c
++++ b/net/batman-adv/fragmentation.c
+@@ -391,6 +391,7 @@ out:
+ 
+ /**
+  * batadv_frag_create() - create a fragment from skb
++ * @net_dev: outgoing device for fragment
+  * @skb: skb to create fragment from
+  * @frag_head: header to use in new fragment
+  * @fragment_size: size of new fragment
+@@ -401,22 +402,25 @@ out:
+  *
+  * Return: the new fragment, NULL on error.
+  */
+-static struct sk_buff *batadv_frag_create(struct sk_buff *skb,
++static struct sk_buff *batadv_frag_create(struct net_device *net_dev,
++                                        struct sk_buff *skb,
+                                         struct batadv_frag_packet *frag_head,
+                                         unsigned int fragment_size)
+ {
++      unsigned int ll_reserved = LL_RESERVED_SPACE(net_dev);
++      unsigned int tailroom = net_dev->needed_tailroom;
+       struct sk_buff *skb_fragment;
+       unsigned int header_size = sizeof(*frag_head);
+       unsigned int mtu = fragment_size + header_size;
+ 
+-      skb_fragment = netdev_alloc_skb(NULL, mtu + ETH_HLEN);
++      skb_fragment = dev_alloc_skb(ll_reserved + mtu + tailroom);
+       if (!skb_fragment)
+               goto err;
+ 
+       skb_fragment->priority = skb->priority;
+ 
+       /* Eat the last mtu-bytes of the skb */
+-      skb_reserve(skb_fragment, header_size + ETH_HLEN);
++      skb_reserve(skb_fragment, ll_reserved + header_size);
+       skb_split(skb, skb_fragment, skb->len - fragment_size);
+ 
+       /* Add the header */
+@@ -439,11 +443,12 @@ int batadv_frag_send_packet(struct sk_buff *skb,
+                           struct batadv_orig_node *orig_node,
+                           struct batadv_neigh_node *neigh_node)
+ {
++      struct net_device *net_dev = neigh_node->if_incoming->net_dev;
+       struct batadv_priv *bat_priv;
+       struct batadv_hard_iface *primary_if = NULL;
+       struct batadv_frag_packet frag_header;
+       struct sk_buff *skb_fragment;
+-      unsigned int mtu = neigh_node->if_incoming->net_dev->mtu;
++      unsigned int mtu = net_dev->mtu;
+       unsigned int header_size = sizeof(frag_header);
+       unsigned int max_fragment_size, num_fragments;
+       int ret;
+@@ -503,7 +508,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
+                       goto put_primary_if;
+               }
+ 
+-              skb_fragment = batadv_frag_create(skb, &frag_header,
++              skb_fragment = batadv_frag_create(net_dev, skb, &frag_header,
+                                                 max_fragment_size);
+               if (!skb_fragment) {
+                       ret = -ENOMEM;
+@@ -522,13 +527,14 @@ int batadv_frag_send_packet(struct sk_buff *skb,
+               frag_header.no++;
+       }
+ 
+-      /* Make room for the fragment header. */
+-      if (batadv_skb_head_push(skb, header_size) < 0 ||
+-          pskb_expand_head(skb, header_size + ETH_HLEN, 0, GFP_ATOMIC) < 0) {
+-              ret = -ENOMEM;
++      /* make sure that there is at least enough head for the fragmentation
++       * and ethernet headers
++       */
++      ret = skb_cow_head(skb, ETH_HLEN + header_size);
++      if (ret < 0)
+               goto put_primary_if;
+-      }
+ 
++      skb_push(skb, header_size);
+       memcpy(skb->data, &frag_header, header_size);
+ 
+       /* Send the last fragment */
+diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
+index afb52282d5bd0..18e644f3cb309 100644
+--- a/net/batman-adv/hard-interface.c
++++ b/net/batman-adv/hard-interface.c
+@@ -554,6 +554,9 @@ static void batadv_hardif_recalc_extra_skbroom(struct 
net_device *soft_iface)
+       needed_headroom = lower_headroom + (lower_header_len - ETH_HLEN);
+       needed_headroom += batadv_max_header_len();
+ 
++      /* fragmentation headers don't strip the unicast/... header */
++      needed_headroom += sizeof(struct batadv_frag_packet);
++
+       soft_iface->needed_headroom = needed_headroom;
+       soft_iface->needed_tailroom = lower_tailroom;
+ }
+diff --git a/net/nfc/core.c b/net/nfc/core.c
+index c5f9c3ee82f8e..e752692d36802 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;
+       }
+ 
+@@ -1118,11 +1118,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) {
+@@ -1131,6 +1127,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;
+ }
+@@ -1147,10 +1149,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);
+@@ -1160,11 +1169,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 6a34a0a786eaa..1d0aa9e6044bf 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;
+diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c
+index e3ff884a48c56..b87d2a1ee0b16 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>
+@@ -218,6 +219,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;
+@@ -253,7 +255,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);
+@@ -261,10 +264,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/wireless/util.c b/net/wireless/util.c
+index aaefaf3422a1a..95533732f9d6f 100644
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -991,6 +991,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/sound/core/Makefile b/sound/core/Makefile
+index ee4a4a6b99ba7..d123587c0fd8f 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 6b1b4b834baef..04f4070fbf366 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 682ed39f79b01..b299b8b7f871a 100644
+--- a/sound/hda/hdac_stream.c
++++ b/sound/hda/hdac_stream.c
+@@ -289,6 +289,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;
+@@ -302,13 +303,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/isa/Kconfig b/sound/isa/Kconfig
+index b690ed937cbe8..df2e45c8814e9 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 7630f808d087c..6edde2f145025 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/nau8824.c b/sound/soc/codecs/nau8824.c
+index 15bd8335f6678..c8ccfa2fff848 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);
+@@ -1875,6 +1882,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)
+ {
+@@ -1899,6 +1934,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/soc-dapm.c b/sound/soc/soc-dapm.c
+index 66f6b698a5436..5876be5dd9bae 100644
+--- a/sound/soc/soc-dapm.c
++++ b/sound/soc/soc-dapm.c
+@@ -2542,8 +2542,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;
+@@ -2569,6 +2574,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
+@@ -3584,10 +3601,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 3f645200d3a5c..b3cdd10c83ae1 100644
+--- a/sound/soc/sof/intel/hda-dai.c
++++ b/sound/soc/sof/intel/hda-dai.c
+@@ -67,6 +67,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);
+@@ -106,12 +107,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/tools/perf/bench/futex-lock-pi.c 
b/tools/perf/bench/futex-lock-pi.c
+index 30d97121dc4fb..c54013806ba4a 100644
+--- a/tools/perf/bench/futex-lock-pi.c
++++ b/tools/perf/bench/futex-lock-pi.c
+@@ -224,6 +224,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 a00a6891447ab..11b7dbd374864 100644
+--- a/tools/perf/bench/futex-requeue.c
++++ b/tools/perf/bench/futex-requeue.c
+@@ -215,6 +215,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 a053cf2b70397..c3033d0905db1 100644
+--- a/tools/perf/bench/futex-wake-parallel.c
++++ b/tools/perf/bench/futex-wake-parallel.c
+@@ -319,6 +319,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 58906e9499bb0..ad44a78392dc4 100644
+--- a/tools/perf/bench/futex-wake.c
++++ b/tools/perf/bench/futex-wake.c
+@@ -209,5 +209,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 045723b3d9928..c62af807198de 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 c766813d56be0..782c0c8a9a836 100644
+--- a/tools/perf/util/bpf-event.c
++++ b/tools/perf/util/bpf-event.c
+@@ -108,7 +108,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 0fafcf264d235..ef64e197bc8df 100644
+--- a/tools/perf/util/env.c
++++ b/tools/perf/util/env.c
+@@ -69,12 +69,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;
+@@ -88,6 +89,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;
+               }
+       }
+@@ -97,6 +99,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 db40906e29373..37028215d4a53 100644
+--- a/tools/perf/util/env.h
++++ b/tools/perf/util/env.h
+@@ -117,6 +117,6 @@ 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);
+ #endif /* __PERF_ENV_H */

Reply via email to