commit:     484756ec295abad1911131a5e1ec42900f69526d
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Thu Nov 14 14:55:40 2024 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Thu Nov 14 14:55:40 2024 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=484756ec

Linux patch 6.1.117

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

 1116_linux-6.1.117.patch | 2607 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 2607 insertions(+)

diff --git a/1116_linux-6.1.117.patch b/1116_linux-6.1.117.patch
new file mode 100644
index 00000000..fff09e12
--- /dev/null
+++ b/1116_linux-6.1.117.patch
@@ -0,0 +1,2607 @@
+diff --git a/Makefile b/Makefile
+index 8f1f0f4a96b44e..c88229bb96269c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 6
+ PATCHLEVEL = 1
+-SUBLEVEL = 116
++SUBLEVEL = 117
+ EXTRAVERSION =
+ NAME = Curry Ramen
+ 
+diff --git a/arch/arm/boot/dts/rk3036-kylin.dts 
b/arch/arm/boot/dts/rk3036-kylin.dts
+index 67e1e04139e732..43926d0962bbdc 100644
+--- a/arch/arm/boot/dts/rk3036-kylin.dts
++++ b/arch/arm/boot/dts/rk3036-kylin.dts
+@@ -304,8 +304,8 @@ regulator-state-mem {
+ &i2c2 {
+       status = "okay";
+ 
+-      rt5616: rt5616@1b {
+-              compatible = "rt5616";
++      rt5616: audio-codec@1b {
++              compatible = "realtek,rt5616";
+               reg = <0x1b>;
+               clocks = <&cru SCLK_I2S_OUT>;
+               clock-names = "mclk";
+diff --git a/arch/arm/boot/dts/rk3036.dtsi b/arch/arm/boot/dts/rk3036.dtsi
+index c420c7c642cb0b..5bdbadd879fe88 100644
+--- a/arch/arm/boot/dts/rk3036.dtsi
++++ b/arch/arm/boot/dts/rk3036.dtsi
+@@ -382,12 +382,13 @@ reboot-mode {
+               };
+       };
+ 
+-      acodec: acodec-ana@20030000 {
+-              compatible = "rk3036-codec";
++      acodec: audio-codec@20030000 {
++              compatible = "rockchip,rk3036-codec";
+               reg = <0x20030000 0x4000>;
+-              rockchip,grf = <&grf>;
+               clock-names = "acodec_pclk";
+               clocks = <&cru PCLK_ACODEC>;
++              rockchip,grf = <&grf>;
++              #sound-dai-cells = <0>;
+               status = "disabled";
+       };
+ 
+@@ -397,7 +398,6 @@ hdmi: hdmi@20034000 {
+               interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cru  PCLK_HDMI>;
+               clock-names = "pclk";
+-              rockchip,grf = <&grf>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&hdmi_ctl>;
+               status = "disabled";
+@@ -550,11 +550,11 @@ i2c0: i2c@20072000 {
+       };
+ 
+       spi: spi@20074000 {
+-              compatible = "rockchip,rockchip-spi";
++              compatible = "rockchip,rk3036-spi";
+               reg = <0x20074000 0x1000>;
+               interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+-              clocks = <&cru PCLK_SPI>, <&cru SCLK_SPI>;
+-              clock-names = "apb-pclk","spi_pclk";
++              clocks = <&cru SCLK_SPI>, <&cru PCLK_SPI>;
++              clock-names = "spiclk", "apb_pclk";
+               dmas = <&pdma 8>, <&pdma 9>;
+               dma-names = "tx", "rx";
+               pinctrl-names = "default";
+diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
+index 1a62ef142a9888..57b437ed097479 100644
+--- a/arch/arm64/Kconfig
++++ b/arch/arm64/Kconfig
+@@ -2113,6 +2113,7 @@ config ARM64_SME
+       bool "ARM Scalable Matrix Extension support"
+       default y
+       depends on ARM64_SVE
++      depends on BROKEN
+       help
+         The Scalable Matrix Extension (SME) is an extension to the AArch64
+         execution state which utilises a substantial subset of the SVE
+diff --git a/arch/arm64/boot/dts/freescale/imx8-ss-vpu.dtsi 
b/arch/arm64/boot/dts/freescale/imx8-ss-vpu.dtsi
+index c6540768bdb926..87211c18d65a95 100644
+--- a/arch/arm64/boot/dts/freescale/imx8-ss-vpu.dtsi
++++ b/arch/arm64/boot/dts/freescale/imx8-ss-vpu.dtsi
+@@ -15,7 +15,7 @@ vpu: vpu@2c000000 {
+       mu_m0: mailbox@2d000000 {
+               compatible = "fsl,imx6sx-mu";
+               reg = <0x2d000000 0x20000>;
+-              interrupts = <GIC_SPI 469 IRQ_TYPE_LEVEL_HIGH>;
++              interrupts = <GIC_SPI 472 IRQ_TYPE_LEVEL_HIGH>;
+               #mbox-cells = <2>;
+               power-domains = <&pd IMX_SC_R_VPU_MU_0>;
+               status = "disabled";
+@@ -24,7 +24,7 @@ mu_m0: mailbox@2d000000 {
+       mu1_m0: mailbox@2d020000 {
+               compatible = "fsl,imx6sx-mu";
+               reg = <0x2d020000 0x20000>;
+-              interrupts = <GIC_SPI 470 IRQ_TYPE_LEVEL_HIGH>;
++              interrupts = <GIC_SPI 473 IRQ_TYPE_LEVEL_HIGH>;
+               #mbox-cells = <2>;
+               power-domains = <&pd IMX_SC_R_VPU_MU_1>;
+               status = "disabled";
+diff --git a/arch/arm64/boot/dts/freescale/imx8mp.dtsi 
b/arch/arm64/boot/dts/freescale/imx8mp.dtsi
+index 8c34b3e12a66a3..86af7115ac60c3 100644
+--- a/arch/arm64/boot/dts/freescale/imx8mp.dtsi
++++ b/arch/arm64/boot/dts/freescale/imx8mp.dtsi
+@@ -934,7 +934,7 @@ usdhc1: mmc@30b40000 {
+                               compatible = "fsl,imx8mp-usdhc", 
"fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
+                               reg = <0x30b40000 0x10000>;
+                               interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
+-                              clocks = <&clk IMX8MP_CLK_DUMMY>,
++                              clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
+                                        <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
+                                        <&clk IMX8MP_CLK_USDHC1_ROOT>;
+                               clock-names = "ipg", "ahb", "per";
+@@ -948,7 +948,7 @@ usdhc2: mmc@30b50000 {
+                               compatible = "fsl,imx8mp-usdhc", 
"fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
+                               reg = <0x30b50000 0x10000>;
+                               interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+-                              clocks = <&clk IMX8MP_CLK_DUMMY>,
++                              clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
+                                        <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
+                                        <&clk IMX8MP_CLK_USDHC2_ROOT>;
+                               clock-names = "ipg", "ahb", "per";
+@@ -962,7 +962,7 @@ usdhc3: mmc@30b60000 {
+                               compatible = "fsl,imx8mp-usdhc", 
"fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
+                               reg = <0x30b60000 0x10000>;
+                               interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
+-                              clocks = <&clk IMX8MP_CLK_DUMMY>,
++                              clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
+                                        <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
+                                        <&clk IMX8MP_CLK_USDHC3_ROOT>;
+                               clock-names = "ipg", "ahb", "per";
+diff --git a/arch/arm64/boot/dts/freescale/imx8qxp-ss-vpu.dtsi 
b/arch/arm64/boot/dts/freescale/imx8qxp-ss-vpu.dtsi
+new file mode 100644
+index 00000000000000..f81937b5fb720d
+--- /dev/null
++++ b/arch/arm64/boot/dts/freescale/imx8qxp-ss-vpu.dtsi
+@@ -0,0 +1,25 @@
++// SPDX-License-Identifier: (GPL-2.0-or-later OR X11)
++/*
++ * Copyright 2023 TQ-Systems GmbH <[email protected]>,
++ * D-82229 Seefeld, Germany.
++ * Author: Alexander Stein
++ */
++
++&mu_m0 {
++      interrupts = <GIC_SPI 469 IRQ_TYPE_LEVEL_HIGH>;
++};
++
++&mu1_m0 {
++      interrupts = <GIC_SPI 470 IRQ_TYPE_LEVEL_HIGH>;
++};
++
++&vpu_core0 {
++      reg = <0x2d040000 0x10000>;
++};
++
++&vpu_core1 {
++      reg = <0x2d050000 0x10000>;
++};
++
++/delete-node/ &mu2_m0;
++/delete-node/ &vpu_core2;
+diff --git a/arch/arm64/boot/dts/freescale/imx8qxp.dtsi 
b/arch/arm64/boot/dts/freescale/imx8qxp.dtsi
+index f4ea18bb95abfe..bec66bb2408292 100644
+--- a/arch/arm64/boot/dts/freescale/imx8qxp.dtsi
++++ b/arch/arm64/boot/dts/freescale/imx8qxp.dtsi
+@@ -46,9 +46,8 @@ aliases {
+               serial1 = &lpuart1;
+               serial2 = &lpuart2;
+               serial3 = &lpuart3;
+-              vpu_core0 = &vpu_core0;
+-              vpu_core1 = &vpu_core1;
+-              vpu_core2 = &vpu_core2;
++              vpu-core0 = &vpu_core0;
++              vpu-core1 = &vpu_core1;
+       };
+ 
+       cpus {
+@@ -316,6 +315,7 @@ map0 {
+ };
+ 
+ #include "imx8qxp-ss-img.dtsi"
++#include "imx8qxp-ss-vpu.dtsi"
+ #include "imx8qxp-ss-adma.dtsi"
+ #include "imx8qxp-ss-conn.dtsi"
+ #include "imx8qxp-ss-lsio.dtsi"
+diff --git a/arch/arm64/boot/dts/rockchip/rk3308-roc-cc.dts 
b/arch/arm64/boot/dts/rockchip/rk3308-roc-cc.dts
+index 7ea48167747c62..70aeca428b3807 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3308-roc-cc.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3308-roc-cc.dts
+@@ -36,14 +36,14 @@ leds {
+ 
+               power_led: led-0 {
+                       label = "firefly:red:power";
+-                      linux,default-trigger = "ir-power-click";
++                      linux,default-trigger = "default-on";
+                       default-state = "on";
+                       gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
+               };
+ 
+               user_led: led-1 {
+                       label = "firefly:blue:user";
+-                      linux,default-trigger = "ir-user-click";
++                      linux,default-trigger = "rc-feedback";
+                       default-state = "off";
+                       gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>;
+               };
+diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi 
b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+index 5adb2fbc2aafae..75ea512e9724f6 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+@@ -724,8 +724,7 @@ hdmi: hdmi@ff3c0000 {
+               compatible = "rockchip,rk3328-dw-hdmi";
+               reg = <0x0 0xff3c0000 0x0 0x20000>;
+               reg-io-width = <4>;
+-              interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
+-                           <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
++              interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cru PCLK_HDMI>,
+                        <&cru SCLK_HDMI_SFC>,
+                        <&cru SCLK_RTC32K>;
+diff --git a/arch/arm64/boot/dts/rockchip/rk3368-lion.dtsi 
b/arch/arm64/boot/dts/rockchip/rk3368-lion.dtsi
+index 5753e57fd7161f..e8859cfd2d39b2 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3368-lion.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3368-lion.dtsi
+@@ -60,7 +60,6 @@ i2c_lvds_blc: i2c@0 {
+                       fan: fan@18 {
+                               compatible = "ti,amc6821";
+                               reg = <0x18>;
+-                              #cooling-cells = <2>;
+                       };
+ 
+                       rtc_twi: rtc@6f {
+diff --git a/arch/arm64/boot/dts/rockchip/rk3399-eaidk-610.dts 
b/arch/arm64/boot/dts/rockchip/rk3399-eaidk-610.dts
+index d1f343345f6749..1f156f5a8666ad 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3399-eaidk-610.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3399-eaidk-610.dts
+@@ -541,7 +541,7 @@ &i2c1 {
+       status = "okay";
+ 
+       rt5651: audio-codec@1a {
+-              compatible = "rockchip,rt5651";
++              compatible = "realtek,rt5651";
+               reg = <0x1a>;
+               clocks = <&cru SCLK_I2S_8CH_OUT>;
+               clock-names = "mclk";
+diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rock960.dtsi 
b/arch/arm64/boot/dts/rockchip/rk3399-rock960.dtsi
+index 94e39ed633971f..d38b25a0c77f4f 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3399-rock960.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3399-rock960.dtsi
+@@ -575,7 +575,7 @@ &uart0 {
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               clocks = <&rk808 1>;
+-              clock-names = "ext_clock";
++              clock-names = "txco";
+               device-wakeup-gpios = <&gpio2 RK_PD3 GPIO_ACTIVE_HIGH>;
+               host-wakeup-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
+               shutdown-gpios = <&gpio0 RK_PB1 GPIO_ACTIVE_HIGH>;
+diff --git a/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts 
b/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts
+index dbec2b7173a0b6..31ea3d0182c062 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts
+@@ -163,7 +163,7 @@ &i2c1 {
+       status = "okay";
+ 
+       rt5651: rt5651@1a {
+-              compatible = "rockchip,rt5651";
++              compatible = "realtek,rt5651";
+               reg = <0x1a>;
+               clocks = <&cru SCLK_I2S_8CH_OUT>;
+               clock-names = "mclk";
+diff --git a/arch/arm64/boot/dts/rockchip/rk3566-pinenote.dtsi 
b/arch/arm64/boot/dts/rockchip/rk3566-pinenote.dtsi
+index 8d61f824c12dc8..52ab14308a5c19 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3566-pinenote.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3566-pinenote.dtsi
+@@ -685,8 +685,8 @@ bluetooth {
+               compatible = "brcm,bcm43438-bt";
+               clocks = <&rk817 1>;
+               clock-names = "lpo";
+-              device-wake-gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;
+-              host-wake-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>;
++              device-wakeup-gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;
++              host-wakeup-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>;
+               reset-gpios = <&gpio0 RK_PC4 GPIO_ACTIVE_LOW>;
+               pinctrl-0 = <&bt_enable_h>, <&bt_host_wake_l>, <&bt_wake_h>;
+               pinctrl-names = "default";
+diff --git a/arch/riscv/purgatory/entry.S b/arch/riscv/purgatory/entry.S
+index 0194f4554130ae..a4ede42bc15107 100644
+--- a/arch/riscv/purgatory/entry.S
++++ b/arch/riscv/purgatory/entry.S
+@@ -11,6 +11,8 @@
+ .macro        size, sym:req
+       .size \sym, . - \sym
+ .endm
++#include <asm/asm.h>
++#include <linux/linkage.h>
+ 
+ .text
+ 
+@@ -39,6 +41,7 @@ size purgatory_start
+ 
+ .data
+ 
++.align LGREG
+ .globl riscv_kernel_entry
+ riscv_kernel_entry:
+       .quad   0
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
+index d967fba2e85ec4..7ad7ebaaa93cdd 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
+@@ -132,8 +132,8 @@ static union acpi_object *amdgpu_atif_call(struct 
amdgpu_atif *atif,
+                                     &buffer);
+       obj = (union acpi_object *)buffer.pointer;
+ 
+-      /* Fail if calling the method fails and ATIF is supported */
+-      if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
++      /* Fail if calling the method fails */
++      if (ACPI_FAILURE(status)) {
+               DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n",
+                                acpi_format_exception(status));
+               kfree(obj);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+index 06ab6066da61a8..a8dd63f270c37f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+@@ -419,7 +419,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file 
*f, const char __user
+       ssize_t result = 0;
+       int r;
+ 
+-      if (size & 0x3 || *pos & 0x3)
++      if (size > 4096 || size & 0x3 || *pos & 0x3)
+               return -EINVAL;
+ 
+       r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
+@@ -2009,11 +2009,11 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
+       amdgpu_securedisplay_debugfs_init(adev);
+       amdgpu_fw_attestation_debugfs_init(adev);
+ 
+-      debugfs_create_file("amdgpu_evict_vram", 0444, root, adev,
++      debugfs_create_file("amdgpu_evict_vram", 0400, root, adev,
+                           &amdgpu_evict_vram_fops);
+-      debugfs_create_file("amdgpu_evict_gtt", 0444, root, adev,
++      debugfs_create_file("amdgpu_evict_gtt", 0400, root, adev,
+                           &amdgpu_evict_gtt_fops);
+-      debugfs_create_file("amdgpu_test_ib", 0444, root, adev,
++      debugfs_create_file("amdgpu_test_ib", 0400, root, adev,
+                           &amdgpu_debugfs_test_ib_fops);
+       debugfs_create_file("amdgpu_vm_info", 0444, root, adev,
+                           &amdgpu_debugfs_vm_info_fops);
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
+index e2e52aa0eeba9b..b5887658c6af60 100644
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -1878,7 +1878,7 @@ u8 *hid_alloc_report_buf(struct hid_report *report, 
gfp_t flags)
+ 
+       u32 len = hid_report_len(report) + 7;
+ 
+-      return kmalloc(len, flags);
++      return kzalloc(len, flags);
+ }
+ EXPORT_SYMBOL_GPL(hid_alloc_report_buf);
+ 
+diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c 
b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
+index 3a5c58694e0751..7bd7ac8d52e620 100644
+--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
++++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
+@@ -1014,7 +1014,8 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, 
struct bnxt_qplib_qp *qp)
+       hwq_attr.stride = sizeof(struct sq_sge);
+       hwq_attr.depth = bnxt_qplib_get_depth(sq);
+       hwq_attr.aux_stride = psn_sz;
+-      hwq_attr.aux_depth = bnxt_qplib_set_sq_size(sq, qp->wqe_mode);
++      hwq_attr.aux_depth = psn_sz ? bnxt_qplib_set_sq_size(sq, qp->wqe_mode)
++                                  : 0;
+       hwq_attr.type = HWQ_TYPE_QUEUE;
+       rc = bnxt_qplib_alloc_init_hwq(&sq->hwq, &hwq_attr);
+       if (rc)
+diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
+index 11f7c53e4b6342..96d04b5c9d76ea 100644
+--- a/drivers/irqchip/irq-gic-v3.c
++++ b/drivers/irqchip/irq-gic-v3.c
+@@ -473,6 +473,13 @@ static int gic_irq_set_irqchip_state(struct irq_data *d,
+       }
+ 
+       gic_poke_irq(d, reg);
++
++      /*
++       * Force read-back to guarantee that the active state has taken
++       * effect, and won't race with a guest-driven deactivation.
++       */
++      if (reg == GICD_ISACTIVER)
++              gic_peek_irq(d, reg);
+       return 0;
+ }
+ 
+diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
+index 8f7426b71e0258..e714114d495a95 100644
+--- a/drivers/md/dm-cache-target.c
++++ b/drivers/md/dm-cache-target.c
+@@ -1882,16 +1882,13 @@ static void check_migrations(struct work_struct *ws)
+  * This function gets called on the error paths of the constructor, so we
+  * have to cope with a partially initialised struct.
+  */
+-static void destroy(struct cache *cache)
++static void __destroy(struct cache *cache)
+ {
+-      unsigned int i;
+-
+       mempool_exit(&cache->migration_pool);
+ 
+       if (cache->prison)
+               dm_bio_prison_destroy_v2(cache->prison);
+ 
+-      cancel_delayed_work_sync(&cache->waker);
+       if (cache->wq)
+               destroy_workqueue(cache->wq);
+ 
+@@ -1919,13 +1916,22 @@ static void destroy(struct cache *cache)
+       if (cache->policy)
+               dm_cache_policy_destroy(cache->policy);
+ 
++      bioset_exit(&cache->bs);
++
++      kfree(cache);
++}
++
++static void destroy(struct cache *cache)
++{
++      unsigned int i;
++
++      cancel_delayed_work_sync(&cache->waker);
++
+       for (i = 0; i < cache->nr_ctr_args ; i++)
+               kfree(cache->ctr_args[i]);
+       kfree(cache->ctr_args);
+ 
+-      bioset_exit(&cache->bs);
+-
+-      kfree(cache);
++      __destroy(cache);
+ }
+ 
+ static void cache_dtr(struct dm_target *ti)
+@@ -1980,7 +1986,6 @@ struct cache_args {
+       sector_t cache_sectors;
+ 
+       struct dm_dev *origin_dev;
+-      sector_t origin_sectors;
+ 
+       uint32_t block_size;
+ 
+@@ -2061,6 +2066,7 @@ static int parse_cache_dev(struct cache_args *ca, struct 
dm_arg_set *as,
+ static int parse_origin_dev(struct cache_args *ca, struct dm_arg_set *as,
+                           char **error)
+ {
++      sector_t origin_sectors;
+       int r;
+ 
+       if (!at_least_one_arg(as, error))
+@@ -2073,8 +2079,8 @@ static int parse_origin_dev(struct cache_args *ca, 
struct dm_arg_set *as,
+               return r;
+       }
+ 
+-      ca->origin_sectors = get_dev_size(ca->origin_dev);
+-      if (ca->ti->len > ca->origin_sectors) {
++      origin_sectors = get_dev_size(ca->origin_dev);
++      if (ca->ti->len > origin_sectors) {
+               *error = "Device size larger than cached device";
+               return -EINVAL;
+       }
+@@ -2384,7 +2390,7 @@ static int cache_create(struct cache_args *ca, struct 
cache **result)
+ 
+       ca->metadata_dev = ca->origin_dev = ca->cache_dev = NULL;
+ 
+-      origin_blocks = cache->origin_sectors = ca->origin_sectors;
++      origin_blocks = cache->origin_sectors = ti->len;
+       origin_blocks = block_div(origin_blocks, ca->block_size);
+       cache->origin_blocks = to_oblock(origin_blocks);
+ 
+@@ -2538,7 +2544,7 @@ static int cache_create(struct cache_args *ca, struct 
cache **result)
+       *result = cache;
+       return 0;
+ bad:
+-      destroy(cache);
++      __destroy(cache);
+       return r;
+ }
+ 
+@@ -2589,7 +2595,7 @@ static int cache_ctr(struct dm_target *ti, unsigned int 
argc, char **argv)
+ 
+       r = copy_ctr_args(cache, argc - 3, (const char **)argv + 3);
+       if (r) {
+-              destroy(cache);
++              __destroy(cache);
+               goto out;
+       }
+ 
+@@ -2872,19 +2878,19 @@ static dm_cblock_t get_cache_dev_size(struct cache 
*cache)
+ static bool can_resize(struct cache *cache, dm_cblock_t new_size)
+ {
+       if (from_cblock(new_size) > from_cblock(cache->cache_size)) {
+-              if (cache->sized) {
+-                      DMERR("%s: unable to extend cache due to missing cache 
table reload",
+-                            cache_device_name(cache));
+-                      return false;
+-              }
++              DMERR("%s: unable to extend cache due to missing cache table 
reload",
++                    cache_device_name(cache));
++              return false;
+       }
+ 
+       /*
+        * We can't drop a dirty block when shrinking the cache.
+        */
+-      while (from_cblock(new_size) < from_cblock(cache->cache_size)) {
+-              new_size = to_cblock(from_cblock(new_size) + 1);
+-              if (is_dirty(cache, new_size)) {
++      if (cache->loaded_mappings) {
++              new_size = to_cblock(find_next_bit(cache->dirty_bitset,
++                                                 
from_cblock(cache->cache_size),
++                                                 from_cblock(new_size)));
++              if (new_size != cache->cache_size) {
+                       DMERR("%s: unable to shrink cache; cache block %llu is 
dirty",
+                             cache_device_name(cache),
+                             (unsigned long long) from_cblock(new_size));
+@@ -2920,20 +2926,15 @@ static int cache_preresume(struct dm_target *ti)
+       /*
+        * Check to see if the cache has resized.
+        */
+-      if (!cache->sized) {
+-              r = resize_cache_dev(cache, csize);
+-              if (r)
+-                      return r;
+-
+-              cache->sized = true;
+-
+-      } else if (csize != cache->cache_size) {
++      if (!cache->sized || csize != cache->cache_size) {
+               if (!can_resize(cache, csize))
+                       return -EINVAL;
+ 
+               r = resize_cache_dev(cache, csize);
+               if (r)
+                       return r;
++
++              cache->sized = true;
+       }
+ 
+       if (!cache->loaded_mappings) {
+diff --git a/drivers/md/dm-unstripe.c b/drivers/md/dm-unstripe.c
+index fdc8921e5c19f0..e69d297b9122ff 100644
+--- a/drivers/md/dm-unstripe.c
++++ b/drivers/md/dm-unstripe.c
+@@ -84,8 +84,8 @@ static int unstripe_ctr(struct dm_target *ti, unsigned int 
argc, char **argv)
+       }
+       uc->physical_start = start;
+ 
+-      uc->unstripe_offset = uc->unstripe * uc->chunk_size;
+-      uc->unstripe_width = (uc->stripes - 1) * uc->chunk_size;
++      uc->unstripe_offset = (sector_t)uc->unstripe * uc->chunk_size;
++      uc->unstripe_width = (sector_t)(uc->stripes - 1) * uc->chunk_size;
+       uc->chunk_shift = is_power_of_2(uc->chunk_size) ? fls(uc->chunk_size) - 
1 : 0;
+ 
+       tmp_len = ti->len;
+diff --git a/drivers/media/cec/usb/pulse8/pulse8-cec.c 
b/drivers/media/cec/usb/pulse8/pulse8-cec.c
+index ba67587bd43ec0..171366fe35443b 100644
+--- a/drivers/media/cec/usb/pulse8/pulse8-cec.c
++++ b/drivers/media/cec/usb/pulse8/pulse8-cec.c
+@@ -685,7 +685,7 @@ static int pulse8_setup(struct pulse8 *pulse8, struct 
serio *serio,
+       err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 4);
+       if (err)
+               return err;
+-      date = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
++      date = ((unsigned)data[0] << 24) | (data[1] << 16) | (data[2] << 8) | 
data[3];
+       dev_info(pulse8->dev, "Firmware build date %ptT\n", &date);
+ 
+       dev_dbg(pulse8->dev, "Persistent config:\n");
+diff --git a/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c 
b/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
+index fe30f5b0050dd9..a635ce4cd64304 100644
+--- a/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
++++ b/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
+@@ -1795,6 +1795,9 @@ static void tpg_precalculate_line(struct tpg_data *tpg)
+       unsigned p;
+       unsigned x;
+ 
++      if (WARN_ON_ONCE(!tpg->src_width || !tpg->scaled_width))
++              return;
++
+       switch (tpg->pattern) {
+       case TPG_PAT_GREEN:
+               contrast = TPG_COLOR_100_RED;
+diff --git a/drivers/media/dvb-core/dvb_frontend.c 
b/drivers/media/dvb-core/dvb_frontend.c
+index a1a3dbb0e7388c..a997cffbc8ea24 100644
+--- a/drivers/media/dvb-core/dvb_frontend.c
++++ b/drivers/media/dvb-core/dvb_frontend.c
+@@ -443,8 +443,8 @@ static int dvb_frontend_swzigzag_autotune(struct 
dvb_frontend *fe, int check_wra
+ 
+               default:
+                       fepriv->auto_step++;
+-                      fepriv->auto_sub_step = -1; /* it'll be incremented to 
0 in a moment */
+-                      break;
++                      fepriv->auto_sub_step = 0;
++                      continue;
+               }
+ 
+               if (!ready) fepriv->auto_sub_step++;
+diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
+index 04b7ce479fc381..d1212acb70932d 100644
+--- a/drivers/media/dvb-core/dvbdev.c
++++ b/drivers/media/dvb-core/dvbdev.c
+@@ -86,10 +86,15 @@ static DECLARE_RWSEM(minor_rwsem);
+ static int dvb_device_open(struct inode *inode, struct file *file)
+ {
+       struct dvb_device *dvbdev;
++      unsigned int minor = iminor(inode);
++
++      if (minor >= MAX_DVB_MINORS)
++              return -ENODEV;
+ 
+       mutex_lock(&dvbdev_mutex);
+       down_read(&minor_rwsem);
+-      dvbdev = dvb_minors[iminor(inode)];
++
++      dvbdev = dvb_minors[minor];
+ 
+       if (dvbdev && dvbdev->fops) {
+               int err = 0;
+@@ -529,7 +534,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct 
dvb_device **pdvbdev,
+       for (minor = 0; minor < MAX_DVB_MINORS; minor++)
+               if (dvb_minors[minor] == NULL)
+                       break;
+-      if (minor == MAX_DVB_MINORS) {
++      if (minor >= MAX_DVB_MINORS) {
+               if (new_node) {
+                       list_del (&new_node->list_head);
+                       kfree(dvbdevfops);
+@@ -544,6 +549,14 @@ int dvb_register_device(struct dvb_adapter *adap, struct 
dvb_device **pdvbdev,
+       }
+ #else
+       minor = nums2minor(adap->num, type, id);
++      if (minor >= MAX_DVB_MINORS) {
++              dvb_media_device_free(dvbdev);
++              list_del(&dvbdev->list_head);
++              kfree(dvbdev);
++              *pdvbdev = NULL;
++              mutex_unlock(&dvbdev_register_lock);
++              return ret;
++      }
+ #endif
+       dvbdev->minor = minor;
+       dvb_minors[minor] = dvb_device_get(dvbdev);
+diff --git a/drivers/media/dvb-frontends/cx24116.c 
b/drivers/media/dvb-frontends/cx24116.c
+index 8b978a9f74a4e5..f5dd3a81725a72 100644
+--- a/drivers/media/dvb-frontends/cx24116.c
++++ b/drivers/media/dvb-frontends/cx24116.c
+@@ -741,6 +741,7 @@ static int cx24116_read_snr_pct(struct dvb_frontend *fe, 
u16 *snr)
+ {
+       struct cx24116_state *state = fe->demodulator_priv;
+       u8 snr_reading;
++      int ret;
+       static const u32 snr_tab[] = { /* 10 x Table (rounded up) */
+               0x00000, 0x0199A, 0x03333, 0x04ccD, 0x06667,
+               0x08000, 0x0999A, 0x0b333, 0x0cccD, 0x0e667,
+@@ -749,7 +750,11 @@ static int cx24116_read_snr_pct(struct dvb_frontend *fe, 
u16 *snr)
+ 
+       dprintk("%s()\n", __func__);
+ 
+-      snr_reading = cx24116_readreg(state, CX24116_REG_QUALITY0);
++      ret = cx24116_readreg(state, CX24116_REG_QUALITY0);
++      if (ret  < 0)
++              return ret;
++
++      snr_reading = ret;
+ 
+       if (snr_reading >= 0xa0 /* 100% */)
+               *snr = 0xffff;
+diff --git a/drivers/media/dvb-frontends/stb0899_algo.c 
b/drivers/media/dvb-frontends/stb0899_algo.c
+index df89c33dac23c5..40537c4ccb0d75 100644
+--- a/drivers/media/dvb-frontends/stb0899_algo.c
++++ b/drivers/media/dvb-frontends/stb0899_algo.c
+@@ -269,7 +269,7 @@ static enum stb0899_status stb0899_search_carrier(struct 
stb0899_state *state)
+ 
+       short int derot_freq = 0, last_derot_freq = 0, derot_limit, next_loop = 
3;
+       int index = 0;
+-      u8 cfr[2];
++      u8 cfr[2] = {0};
+       u8 reg;
+ 
+       internal->status = NOCARRIER;
+diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
+index bda0c547ce4452..96c2fa2c3b7a55 100644
+--- a/drivers/media/i2c/adv7604.c
++++ b/drivers/media/i2c/adv7604.c
+@@ -2516,10 +2516,10 @@ static int adv76xx_log_status(struct v4l2_subdev *sd)
+       const struct adv76xx_chip_info *info = state->info;
+       struct v4l2_dv_timings timings;
+       struct stdi_readback stdi;
+-      u8 reg_io_0x02 = io_read(sd, 0x02);
++      int ret;
++      u8 reg_io_0x02;
+       u8 edid_enabled;
+       u8 cable_det;
+-
+       static const char * const csc_coeff_sel_rb[16] = {
+               "bypassed", "YPbPr601 -> RGB", "reserved", "YPbPr709 -> RGB",
+               "reserved", "RGB -> YPbPr601", "reserved", "RGB -> YPbPr709",
+@@ -2618,13 +2618,21 @@ static int adv76xx_log_status(struct v4l2_subdev *sd)
+       v4l2_info(sd, "-----Color space-----\n");
+       v4l2_info(sd, "RGB quantization range ctrl: %s\n",
+                       
rgb_quantization_range_txt[state->rgb_quantization_range]);
+-      v4l2_info(sd, "Input color space: %s\n",
+-                      input_color_space_txt[reg_io_0x02 >> 4]);
+-      v4l2_info(sd, "Output color space: %s %s, alt-gamma %s\n",
+-                      (reg_io_0x02 & 0x02) ? "RGB" : "YCbCr",
+-                      (((reg_io_0x02 >> 2) & 0x01) ^ (reg_io_0x02 & 0x01)) ?
+-                              "(16-235)" : "(0-255)",
+-                      (reg_io_0x02 & 0x08) ? "enabled" : "disabled");
++
++      ret = io_read(sd, 0x02);
++      if (ret < 0) {
++              v4l2_info(sd, "Can't read Input/Output color space\n");
++      } else {
++              reg_io_0x02 = ret;
++
++              v4l2_info(sd, "Input color space: %s\n",
++                              input_color_space_txt[reg_io_0x02 >> 4]);
++              v4l2_info(sd, "Output color space: %s %s, alt-gamma %s\n",
++                              (reg_io_0x02 & 0x02) ? "RGB" : "YCbCr",
++                              (((reg_io_0x02 >> 2) & 0x01) ^ (reg_io_0x02 & 
0x01)) ?
++                                      "(16-235)" : "(0-255)",
++                              (reg_io_0x02 & 0x08) ? "enabled" : "disabled");
++      }
+       v4l2_info(sd, "Color space conversion: %s\n",
+                       csc_coeff_sel_rb[cp_read(sd, info->cp_csc) >> 4]);
+ 
+diff --git a/drivers/media/i2c/ar0521.c b/drivers/media/i2c/ar0521.c
+index 02856a733238c3..1ede57958410cf 100644
+--- a/drivers/media/i2c/ar0521.c
++++ b/drivers/media/i2c/ar0521.c
+@@ -223,10 +223,10 @@ static u32 calc_pll(struct ar0521_dev *sensor, int num, 
u32 freq, u16 *pre_ptr,
+                       continue; /* Minimum value */
+               if (new_mult > 254)
+                       break; /* Maximum, larger pre won't work either */
+-              if (sensor->extclk_freq * (u64)new_mult < AR0521_PLL_MIN *
++              if (sensor->extclk_freq * (u64)new_mult < (u64)AR0521_PLL_MIN *
+                   new_pre)
+                       continue;
+-              if (sensor->extclk_freq * (u64)new_mult > AR0521_PLL_MAX *
++              if (sensor->extclk_freq * (u64)new_mult > (u64)AR0521_PLL_MAX *
+                   new_pre)
+                       break; /* Larger pre won't work either */
+               new_pll = div64_round_up(sensor->extclk_freq * (u64)new_mult,
+diff --git a/drivers/media/platform/amphion/vpu_core.c 
b/drivers/media/platform/amphion/vpu_core.c
+index 9add73b9b45f92..fabbf442c66abc 100644
+--- a/drivers/media/platform/amphion/vpu_core.c
++++ b/drivers/media/platform/amphion/vpu_core.c
+@@ -642,7 +642,7 @@ static int vpu_core_probe(struct platform_device *pdev)
+               return -ENODEV;
+ 
+       core->type = core->res->type;
+-      core->id = of_alias_get_id(dev->of_node, "vpu_core");
++      core->id = of_alias_get_id(dev->of_node, "vpu-core");
+       if (core->id < 0) {
+               dev_err(dev, "can't get vpu core id\n");
+               return core->id;
+diff --git a/drivers/media/platform/samsung/s5p-jpeg/jpeg-core.c 
b/drivers/media/platform/samsung/s5p-jpeg/jpeg-core.c
+index 55814041b8d8f3..d8d1f17cee83f3 100644
+--- a/drivers/media/platform/samsung/s5p-jpeg/jpeg-core.c
++++ b/drivers/media/platform/samsung/s5p-jpeg/jpeg-core.c
+@@ -775,11 +775,14 @@ static void exynos4_jpeg_parse_decode_h_tbl(struct 
s5p_jpeg_ctx *ctx)
+               (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + 
ctx->out_q.sos + 2;
+       jpeg_buffer.curr = 0;
+ 
+-      word = 0;
+-
+       if (get_word_be(&jpeg_buffer, &word))
+               return;
+-      jpeg_buffer.size = (long)word - 2;
++
++      if (word < 2)
++              jpeg_buffer.size = 0;
++      else
++              jpeg_buffer.size = (long)word - 2;
++
+       jpeg_buffer.data += 2;
+       jpeg_buffer.curr = 0;
+ 
+@@ -1058,6 +1061,7 @@ static int get_word_be(struct s5p_jpeg_buffer *buf, 
unsigned int *word)
+       if (byte == -1)
+               return -1;
+       *word = (unsigned int)byte | temp;
++
+       return 0;
+ }
+ 
+@@ -1145,7 +1149,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data 
*result,
+                       if (get_word_be(&jpeg_buffer, &word))
+                               break;
+                       length = (long)word - 2;
+-                      if (!length)
++                      if (length <= 0)
+                               return false;
+                       sof = jpeg_buffer.curr; /* after 0xffc0 */
+                       sof_len = length;
+@@ -1176,7 +1180,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data 
*result,
+                       if (get_word_be(&jpeg_buffer, &word))
+                               break;
+                       length = (long)word - 2;
+-                      if (!length)
++                      if (length <= 0)
+                               return false;
+                       if (n_dqt >= S5P_JPEG_MAX_MARKER)
+                               return false;
+@@ -1189,7 +1193,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data 
*result,
+                       if (get_word_be(&jpeg_buffer, &word))
+                               break;
+                       length = (long)word - 2;
+-                      if (!length)
++                      if (length <= 0)
+                               return false;
+                       if (n_dht >= S5P_JPEG_MAX_MARKER)
+                               return false;
+@@ -1214,6 +1218,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data 
*result,
+                       if (get_word_be(&jpeg_buffer, &word))
+                               break;
+                       length = (long)word - 2;
++                      /* No need to check underflows as skip() does it  */
+                       skip(&jpeg_buffer, length);
+                       break;
+               }
+diff --git a/drivers/media/usb/uvc/uvc_driver.c 
b/drivers/media/usb/uvc/uvc_driver.c
+index 004511d918c645..9b87a13a92fe49 100644
+--- a/drivers/media/usb/uvc/uvc_driver.c
++++ b/drivers/media/usb/uvc/uvc_driver.c
+@@ -368,7 +368,7 @@ static int uvc_parse_format(struct uvc_device *dev,
+        * Parse the frame descriptors. Only uncompressed, MJPEG and frame
+        * based formats have frame descriptors.
+        */
+-      while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE &&
++      while (ftype && buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE &&
+              buffer[2] == ftype) {
+               frame = &format->frame[format->nframes];
+               if (ftype != UVC_VS_FRAME_FRAME_BASED)
+diff --git a/drivers/media/v4l2-core/v4l2-ctrls-api.c 
b/drivers/media/v4l2-core/v4l2-ctrls-api.c
+index 002ea6588edf16..64b0c3ef27f5e5 100644
+--- a/drivers/media/v4l2-core/v4l2-ctrls-api.c
++++ b/drivers/media/v4l2-core/v4l2-ctrls-api.c
+@@ -753,9 +753,10 @@ static int get_ctrl(struct v4l2_ctrl *ctrl, struct 
v4l2_ext_control *c)
+               for (i = 0; i < master->ncontrols; i++)
+                       cur_to_new(master->cluster[i]);
+               ret = call_op(master, g_volatile_ctrl);
+-              new_to_user(c, ctrl);
++              if (!ret)
++                      ret = new_to_user(c, ctrl);
+       } else {
+-              cur_to_user(c, ctrl);
++              ret = cur_to_user(c, ctrl);
+       }
+       v4l2_ctrl_unlock(master);
+       return ret;
+@@ -770,7 +771,10 @@ int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct 
v4l2_control *control)
+       if (!ctrl || !ctrl->is_int)
+               return -EINVAL;
+       ret = get_ctrl(ctrl, &c);
+-      control->value = c.value;
++
++      if (!ret)
++              control->value = c.value;
++
+       return ret;
+ }
+ EXPORT_SYMBOL(v4l2_g_ctrl);
+@@ -811,10 +815,11 @@ static int set_ctrl_lock(struct v4l2_fh *fh, struct 
v4l2_ctrl *ctrl,
+       int ret;
+ 
+       v4l2_ctrl_lock(ctrl);
+-      user_to_new(c, ctrl);
+-      ret = set_ctrl(fh, ctrl, 0);
++      ret = user_to_new(c, ctrl);
++      if (!ret)
++              ret = set_ctrl(fh, ctrl, 0);
+       if (!ret)
+-              cur_to_user(c, ctrl);
++              ret = cur_to_user(c, ctrl);
+       v4l2_ctrl_unlock(ctrl);
+       return ret;
+ }
+diff --git a/drivers/net/can/c_can/c_can_main.c 
b/drivers/net/can/c_can/c_can_main.c
+index c63f7fc1e69177..511615dc334196 100644
+--- a/drivers/net/can/c_can/c_can_main.c
++++ b/drivers/net/can/c_can/c_can_main.c
+@@ -1011,7 +1011,6 @@ static int c_can_handle_bus_err(struct net_device *dev,
+ 
+       /* common for all type of bus errors */
+       priv->can.can_stats.bus_error++;
+-      stats->rx_errors++;
+ 
+       /* propagate the error condition to the CAN stack */
+       skb = alloc_can_err_skb(dev, &cf);
+@@ -1027,26 +1026,32 @@ static int c_can_handle_bus_err(struct net_device *dev,
+       case LEC_STUFF_ERROR:
+               netdev_dbg(dev, "stuff error\n");
+               cf->data[2] |= CAN_ERR_PROT_STUFF;
++              stats->rx_errors++;
+               break;
+       case LEC_FORM_ERROR:
+               netdev_dbg(dev, "form error\n");
+               cf->data[2] |= CAN_ERR_PROT_FORM;
++              stats->rx_errors++;
+               break;
+       case LEC_ACK_ERROR:
+               netdev_dbg(dev, "ack error\n");
+               cf->data[3] = CAN_ERR_PROT_LOC_ACK;
++              stats->tx_errors++;
+               break;
+       case LEC_BIT1_ERROR:
+               netdev_dbg(dev, "bit1 error\n");
+               cf->data[2] |= CAN_ERR_PROT_BIT1;
++              stats->tx_errors++;
+               break;
+       case LEC_BIT0_ERROR:
+               netdev_dbg(dev, "bit0 error\n");
+               cf->data[2] |= CAN_ERR_PROT_BIT0;
++              stats->tx_errors++;
+               break;
+       case LEC_CRC_ERROR:
+               netdev_dbg(dev, "CRC error\n");
+               cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ;
++              stats->rx_errors++;
+               break;
+       default:
+               break;
+diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c 
b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c
+index a894cb1fb9bfe1..29242dde814d66 100644
+--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c
++++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c
+@@ -2,7 +2,7 @@
+ //
+ // mcp251xfd - Microchip MCP251xFD Family CAN controller driver
+ //
+-// Copyright (c) 2019, 2020, 2021 Pengutronix,
++// Copyright (c) 2019, 2020, 2021, 2024 Pengutronix,
+ //               Marc Kleine-Budde <[email protected]>
+ //
+ // Based on:
+@@ -473,9 +473,11 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
+               };
+               const struct ethtool_coalesce ec = {
+                       .rx_coalesce_usecs_irq = priv->rx_coalesce_usecs_irq,
+-                      .rx_max_coalesced_frames_irq = 
priv->rx_obj_num_coalesce_irq,
++                      .rx_max_coalesced_frames_irq = 
priv->rx_obj_num_coalesce_irq == 0 ?
++                              1 : priv->rx_obj_num_coalesce_irq,
+                       .tx_coalesce_usecs_irq = priv->tx_coalesce_usecs_irq,
+-                      .tx_max_coalesced_frames_irq = 
priv->tx_obj_num_coalesce_irq,
++                      .tx_max_coalesced_frames_irq = 
priv->tx_obj_num_coalesce_irq == 0 ?
++                              1 : priv->tx_obj_num_coalesce_irq,
+               };
+               struct can_ram_layout layout;
+ 
+diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c 
b/drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c
+index d4df5ccb60e3c2..493daaa0c7a30d 100644
+--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c
++++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c
+@@ -16,9 +16,9 @@
+ 
+ #include "mcp251xfd.h"
+ 
+-static inline bool mcp251xfd_tx_fifo_sta_full(u32 fifo_sta)
++static inline bool mcp251xfd_tx_fifo_sta_empty(u32 fifo_sta)
+ {
+-      return !(fifo_sta & MCP251XFD_REG_FIFOSTA_TFNRFNIF);
++      return fifo_sta & MCP251XFD_REG_FIFOSTA_TFERFFIF;
+ }
+ 
+ static inline int
+@@ -122,7 +122,11 @@ mcp251xfd_get_tef_len(struct mcp251xfd_priv *priv, u8 
*len_p)
+       if (err)
+               return err;
+ 
+-      if (mcp251xfd_tx_fifo_sta_full(fifo_sta)) {
++      /* If the chip says the TX-FIFO is empty, but there are no TX
++       * buffers free in the ring, we assume all have been sent.
++       */
++      if (mcp251xfd_tx_fifo_sta_empty(fifo_sta) &&
++          mcp251xfd_get_tx_free(tx_ring) == 0) {
+               *len_p = tx_ring->obj_num;
+               return 0;
+       }
+diff --git a/drivers/net/ethernet/arc/emac_main.c 
b/drivers/net/ethernet/arc/emac_main.c
+index ba0646b3b122e9..a32b5f7c0b969c 100644
+--- a/drivers/net/ethernet/arc/emac_main.c
++++ b/drivers/net/ethernet/arc/emac_main.c
+@@ -111,6 +111,7 @@ static void arc_emac_tx_clean(struct net_device *ndev)
+ {
+       struct arc_emac_priv *priv = netdev_priv(ndev);
+       struct net_device_stats *stats = &ndev->stats;
++      struct device *dev = ndev->dev.parent;
+       unsigned int i;
+ 
+       for (i = 0; i < TX_BD_NUM; i++) {
+@@ -140,7 +141,7 @@ static void arc_emac_tx_clean(struct net_device *ndev)
+                       stats->tx_bytes += skb->len;
+               }
+ 
+-              dma_unmap_single(&ndev->dev, dma_unmap_addr(tx_buff, addr),
++              dma_unmap_single(dev, dma_unmap_addr(tx_buff, addr),
+                                dma_unmap_len(tx_buff, len), DMA_TO_DEVICE);
+ 
+               /* return the sk_buff to system */
+@@ -174,6 +175,7 @@ static void arc_emac_tx_clean(struct net_device *ndev)
+ static int arc_emac_rx(struct net_device *ndev, int budget)
+ {
+       struct arc_emac_priv *priv = netdev_priv(ndev);
++      struct device *dev = ndev->dev.parent;
+       unsigned int work_done;
+ 
+       for (work_done = 0; work_done < budget; work_done++) {
+@@ -223,9 +225,9 @@ static int arc_emac_rx(struct net_device *ndev, int budget)
+                       continue;
+               }
+ 
+-              addr = dma_map_single(&ndev->dev, (void *)skb->data,
++              addr = dma_map_single(dev, (void *)skb->data,
+                                     EMAC_BUFFER_SIZE, DMA_FROM_DEVICE);
+-              if (dma_mapping_error(&ndev->dev, addr)) {
++              if (dma_mapping_error(dev, addr)) {
+                       if (net_ratelimit())
+                               netdev_err(ndev, "cannot map dma buffer\n");
+                       dev_kfree_skb(skb);
+@@ -237,7 +239,7 @@ static int arc_emac_rx(struct net_device *ndev, int budget)
+               }
+ 
+               /* unmap previosly mapped skb */
+-              dma_unmap_single(&ndev->dev, dma_unmap_addr(rx_buff, addr),
++              dma_unmap_single(dev, dma_unmap_addr(rx_buff, addr),
+                                dma_unmap_len(rx_buff, len), DMA_FROM_DEVICE);
+ 
+               pktlen = info & LEN_MASK;
+@@ -423,6 +425,7 @@ static int arc_emac_open(struct net_device *ndev)
+ {
+       struct arc_emac_priv *priv = netdev_priv(ndev);
+       struct phy_device *phy_dev = ndev->phydev;
++      struct device *dev = ndev->dev.parent;
+       int i;
+ 
+       phy_dev->autoneg = AUTONEG_ENABLE;
+@@ -445,9 +448,9 @@ static int arc_emac_open(struct net_device *ndev)
+               if (unlikely(!rx_buff->skb))
+                       return -ENOMEM;
+ 
+-              addr = dma_map_single(&ndev->dev, (void *)rx_buff->skb->data,
++              addr = dma_map_single(dev, (void *)rx_buff->skb->data,
+                                     EMAC_BUFFER_SIZE, DMA_FROM_DEVICE);
+-              if (dma_mapping_error(&ndev->dev, addr)) {
++              if (dma_mapping_error(dev, addr)) {
+                       netdev_err(ndev, "cannot dma map\n");
+                       dev_kfree_skb(rx_buff->skb);
+                       return -ENOMEM;
+@@ -548,6 +551,7 @@ static void arc_emac_set_rx_mode(struct net_device *ndev)
+ static void arc_free_tx_queue(struct net_device *ndev)
+ {
+       struct arc_emac_priv *priv = netdev_priv(ndev);
++      struct device *dev = ndev->dev.parent;
+       unsigned int i;
+ 
+       for (i = 0; i < TX_BD_NUM; i++) {
+@@ -555,7 +559,7 @@ static void arc_free_tx_queue(struct net_device *ndev)
+               struct buffer_state *tx_buff = &priv->tx_buff[i];
+ 
+               if (tx_buff->skb) {
+-                      dma_unmap_single(&ndev->dev,
++                      dma_unmap_single(dev,
+                                        dma_unmap_addr(tx_buff, addr),
+                                        dma_unmap_len(tx_buff, len),
+                                        DMA_TO_DEVICE);
+@@ -579,6 +583,7 @@ static void arc_free_tx_queue(struct net_device *ndev)
+ static void arc_free_rx_queue(struct net_device *ndev)
+ {
+       struct arc_emac_priv *priv = netdev_priv(ndev);
++      struct device *dev = ndev->dev.parent;
+       unsigned int i;
+ 
+       for (i = 0; i < RX_BD_NUM; i++) {
+@@ -586,7 +591,7 @@ static void arc_free_rx_queue(struct net_device *ndev)
+               struct buffer_state *rx_buff = &priv->rx_buff[i];
+ 
+               if (rx_buff->skb) {
+-                      dma_unmap_single(&ndev->dev,
++                      dma_unmap_single(dev,
+                                        dma_unmap_addr(rx_buff, addr),
+                                        dma_unmap_len(rx_buff, len),
+                                        DMA_FROM_DEVICE);
+@@ -679,6 +684,7 @@ static netdev_tx_t arc_emac_tx(struct sk_buff *skb, struct 
net_device *ndev)
+       unsigned int len, *txbd_curr = &priv->txbd_curr;
+       struct net_device_stats *stats = &ndev->stats;
+       __le32 *info = &priv->txbd[*txbd_curr].info;
++      struct device *dev = ndev->dev.parent;
+       dma_addr_t addr;
+ 
+       if (skb_padto(skb, ETH_ZLEN))
+@@ -692,10 +698,9 @@ static netdev_tx_t arc_emac_tx(struct sk_buff *skb, 
struct net_device *ndev)
+               return NETDEV_TX_BUSY;
+       }
+ 
+-      addr = dma_map_single(&ndev->dev, (void *)skb->data, len,
+-                            DMA_TO_DEVICE);
++      addr = dma_map_single(dev, (void *)skb->data, len, DMA_TO_DEVICE);
+ 
+-      if (unlikely(dma_mapping_error(&ndev->dev, addr))) {
++      if (unlikely(dma_mapping_error(dev, addr))) {
+               stats->tx_dropped++;
+               stats->tx_errors++;
+               dev_kfree_skb_any(skb);
+diff --git a/drivers/net/ethernet/arc/emac_mdio.c 
b/drivers/net/ethernet/arc/emac_mdio.c
+index 87f40c2ba90404..078b1a72c16135 100644
+--- a/drivers/net/ethernet/arc/emac_mdio.c
++++ b/drivers/net/ethernet/arc/emac_mdio.c
+@@ -133,6 +133,7 @@ int arc_mdio_probe(struct arc_emac_priv *priv)
+       struct arc_emac_mdio_bus_data *data = &priv->bus_data;
+       struct device_node *np = priv->dev->of_node;
+       const char *name = "Synopsys MII Bus";
++      struct device_node *mdio_node;
+       struct mii_bus *bus;
+       int error;
+ 
+@@ -164,7 +165,13 @@ int arc_mdio_probe(struct arc_emac_priv *priv)
+ 
+       snprintf(bus->id, MII_BUS_ID_SIZE, "%s", bus->name);
+ 
+-      error = of_mdiobus_register(bus, priv->dev->of_node);
++      /* Backwards compatibility for EMAC nodes without MDIO subnode. */
++      mdio_node = of_get_child_by_name(np, "mdio");
++      if (!mdio_node)
++              mdio_node = of_node_get(np);
++
++      error = of_mdiobus_register(bus, mdio_node);
++      of_node_put(mdio_node);
+       if (error) {
+               mdiobus_free(bus);
+               return dev_err_probe(priv->dev, error,
+diff --git a/drivers/net/ethernet/freescale/enetc/enetc_vf.c 
b/drivers/net/ethernet/freescale/enetc/enetc_vf.c
+index dfcaac302e2451..b15db70769e5ee 100644
+--- a/drivers/net/ethernet/freescale/enetc/enetc_vf.c
++++ b/drivers/net/ethernet/freescale/enetc/enetc_vf.c
+@@ -78,11 +78,18 @@ static int enetc_vf_set_mac_addr(struct net_device *ndev, 
void *addr)
+ {
+       struct enetc_ndev_priv *priv = netdev_priv(ndev);
+       struct sockaddr *saddr = addr;
++      int err;
+ 
+       if (!is_valid_ether_addr(saddr->sa_data))
+               return -EADDRNOTAVAIL;
+ 
+-      return enetc_msg_vsi_set_primary_mac_addr(priv, saddr);
++      err = enetc_msg_vsi_set_primary_mac_addr(priv, saddr);
++      if (err)
++              return err;
++
++      eth_hw_addr_set(ndev, saddr->sa_data);
++
++      return 0;
+ }
+ 
+ static int enetc_vf_set_features(struct net_device *ndev,
+diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c 
b/drivers/net/ethernet/hisilicon/hns3/hnae3.c
+index 67b0bf310daaaf..9a63fbc6940831 100644
+--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c
++++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c
+@@ -25,8 +25,11 @@ void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo 
*ae_algo)
+               pci_id = pci_match_id(ae_algo->pdev_id_table, ae_dev->pdev);
+               if (!pci_id)
+                       continue;
+-              if (IS_ENABLED(CONFIG_PCI_IOV))
++              if (IS_ENABLED(CONFIG_PCI_IOV)) {
++                      device_lock(&ae_dev->pdev->dev);
+                       pci_disable_sriov(ae_dev->pdev);
++                      device_unlock(&ae_dev->pdev->dev);
++              }
+       }
+ }
+ EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare);
+diff --git a/drivers/net/ethernet/intel/i40e/i40e.h 
b/drivers/net/ethernet/intel/i40e/i40e.h
+index 5293fc00938cf5..22ac8c48ca340f 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e.h
++++ b/drivers/net/ethernet/intel/i40e/i40e.h
+@@ -790,6 +790,7 @@ enum i40e_filter_state {
+       I40E_FILTER_ACTIVE,             /* Added to switch by FW */
+       I40E_FILTER_FAILED,             /* Rejected by FW */
+       I40E_FILTER_REMOVE,             /* To be removed */
++      I40E_FILTER_NEW_SYNC,           /* New, not sent yet, is in 
i40e_sync_vsi_filters() */
+ /* There is no 'removed' state; the filter struct is freed */
+ };
+ struct i40e_mac_filter {
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c 
b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
+index 62497f5565c59d..b438cf846c41b2 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
+@@ -105,6 +105,7 @@ static char *i40e_filter_state_string[] = {
+       "ACTIVE",
+       "FAILED",
+       "REMOVE",
++      "NEW_SYNC",
+ };
+ 
+ /**
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c 
b/drivers/net/ethernet/intel/i40e/i40e_main.c
+index 5f46a0677d1955..3b165d8f03dc27 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -1251,6 +1251,7 @@ int i40e_count_filters(struct i40e_vsi *vsi)
+ 
+       hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {
+               if (f->state == I40E_FILTER_NEW ||
++                  f->state == I40E_FILTER_NEW_SYNC ||
+                   f->state == I40E_FILTER_ACTIVE)
+                       ++cnt;
+       }
+@@ -1437,6 +1438,8 @@ static int i40e_correct_mac_vlan_filters(struct i40e_vsi 
*vsi,
+ 
+                       new->f = add_head;
+                       new->state = add_head->state;
++                      if (add_head->state == I40E_FILTER_NEW)
++                              add_head->state = I40E_FILTER_NEW_SYNC;
+ 
+                       /* Add the new filter to the tmp list */
+                       hlist_add_head(&new->hlist, tmp_add_list);
+@@ -1546,6 +1549,8 @@ static int i40e_correct_vf_mac_vlan_filters(struct 
i40e_vsi *vsi,
+                               return -ENOMEM;
+                       new_mac->f = add_head;
+                       new_mac->state = add_head->state;
++                      if (add_head->state == I40E_FILTER_NEW)
++                              add_head->state = I40E_FILTER_NEW_SYNC;
+ 
+                       /* Add the new filter to the tmp list */
+                       hlist_add_head(&new_mac->hlist, tmp_add_list);
+@@ -2437,7 +2442,8 @@ static int
+ i40e_aqc_broadcast_filter(struct i40e_vsi *vsi, const char *vsi_name,
+                         struct i40e_mac_filter *f)
+ {
+-      bool enable = f->state == I40E_FILTER_NEW;
++      bool enable = f->state == I40E_FILTER_NEW ||
++                    f->state == I40E_FILTER_NEW_SYNC;
+       struct i40e_hw *hw = &vsi->back->hw;
+       int aq_ret;
+ 
+@@ -2611,6 +2617,7 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
+ 
+                               /* Add it to the hash list */
+                               hlist_add_head(&new->hlist, &tmp_add_list);
++                              f->state = I40E_FILTER_NEW_SYNC;
+                       }
+ 
+                       /* Count the number of active (current and new) VLAN
+@@ -2762,7 +2769,8 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
+               spin_lock_bh(&vsi->mac_filter_hash_lock);
+               hlist_for_each_entry_safe(new, h, &tmp_add_list, hlist) {
+                       /* Only update the state if we're still NEW */
+-                      if (new->f->state == I40E_FILTER_NEW)
++                      if (new->f->state == I40E_FILTER_NEW ||
++                          new->f->state == I40E_FILTER_NEW_SYNC)
+                               new->f->state = new->state;
+                       hlist_del(&new->hlist);
+                       netdev_hw_addr_refcnt(new->f, vsi->netdev, -1);
+diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c 
b/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c
+index 1839a37139dc16..b6bbf2376ef5c1 100644
+--- a/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c
++++ b/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c
+@@ -1694,11 +1694,12 @@ static int
+ ice_set_fdir_input_set(struct ice_vsi *vsi, struct ethtool_rx_flow_spec *fsp,
+                      struct ice_fdir_fltr *input)
+ {
+-      u16 dest_vsi, q_index = 0;
++      s16 q_index = ICE_FDIR_NO_QUEUE_IDX;
+       u16 orig_q_index = 0;
+       struct ice_pf *pf;
+       struct ice_hw *hw;
+       int flow_type;
++      u16 dest_vsi;
+       u8 dest_ctl;
+ 
+       if (!vsi || !fsp || !input)
+diff --git a/drivers/net/ethernet/intel/ice/ice_fdir.h 
b/drivers/net/ethernet/intel/ice/ice_fdir.h
+index b384d2a4ab1981..063ea3d5165327 100644
+--- a/drivers/net/ethernet/intel/ice/ice_fdir.h
++++ b/drivers/net/ethernet/intel/ice/ice_fdir.h
+@@ -50,6 +50,8 @@
+  */
+ #define ICE_FDIR_IPV4_PKT_FLAG_MF             0x20
+ 
++#define ICE_FDIR_NO_QUEUE_IDX                 -1
++
+ enum ice_fltr_prgm_desc_dest {
+       ICE_FLTR_PRGM_DESC_DEST_DROP_PKT,
+       ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX,
+@@ -181,7 +183,7 @@ struct ice_fdir_fltr {
+       u16 flex_fltr;
+ 
+       /* filter control */
+-      u16 q_index;
++      s16 q_index;
+       u16 orig_q_index;
+       u16 dest_vsi;
+       u8 dest_ctl;
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 
b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+index 045e57c444fd73..14e5b94b0b5ab1 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+@@ -3665,6 +3665,7 @@ static int stmmac_request_irq_single(struct net_device 
*dev)
+       /* Request the Wake IRQ in case of another line
+        * is used for WoL
+        */
++      priv->wol_irq_disabled = true;
+       if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) {
+               ret = request_irq(priv->wol_irq, stmmac_interrupt,
+                                 IRQF_SHARED, dev->name, dev);
+diff --git a/drivers/net/ethernet/vertexcom/mse102x.c 
b/drivers/net/ethernet/vertexcom/mse102x.c
+index aeed2a093e3411..dd766e175f7dbd 100644
+--- a/drivers/net/ethernet/vertexcom/mse102x.c
++++ b/drivers/net/ethernet/vertexcom/mse102x.c
+@@ -222,7 +222,7 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, 
struct sk_buff *txp,
+       struct mse102x_net_spi *mses = to_mse102x_spi(mse);
+       struct spi_transfer *xfer = &mses->spi_xfer;
+       struct spi_message *msg = &mses->spi_msg;
+-      struct sk_buff *tskb;
++      struct sk_buff *tskb = NULL;
+       int ret;
+ 
+       netif_dbg(mse, tx_queued, mse->ndev, "%s: skb %p, %d@%p\n",
+@@ -235,7 +235,6 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, 
struct sk_buff *txp,
+               if (!tskb)
+                       return -ENOMEM;
+ 
+-              dev_kfree_skb(txp);
+               txp = tskb;
+       }
+ 
+@@ -257,6 +256,8 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, 
struct sk_buff *txp,
+               mse->stats.xfer_err++;
+       }
+ 
++      dev_kfree_skb(tskb);
++
+       return ret;
+ }
+ 
+diff --git a/drivers/net/phy/dp83848.c b/drivers/net/phy/dp83848.c
+index 937061acfc613a..351411f0aa6f47 100644
+--- a/drivers/net/phy/dp83848.c
++++ b/drivers/net/phy/dp83848.c
+@@ -147,6 +147,8 @@ MODULE_DEVICE_TABLE(mdio, dp83848_tbl);
+               /* IRQ related */                               \
+               .config_intr    = dp83848_config_intr,          \
+               .handle_interrupt = dp83848_handle_interrupt,   \
++                                                              \
++              .flags          = PHY_RST_AFTER_CLK_EN,         \
+       }
+ 
+ static struct phy_driver dp83848_driver[] = {
+diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
+index e3e5107adaca66..11aa0a7d54cd7d 100644
+--- a/drivers/net/virtio_net.c
++++ b/drivers/net/virtio_net.c
+@@ -3887,6 +3887,12 @@ static int virtnet_probe(struct virtio_device *vdev)
+       if (vi->has_rss || vi->has_rss_hash_report) {
+               vi->rss_key_size =
+                       virtio_cread8(vdev, offsetof(struct virtio_net_config, 
rss_max_key_size));
++              if (vi->rss_key_size > VIRTIO_NET_RSS_MAX_KEY_SIZE) {
++                      dev_err(&vdev->dev, "rss_max_key_size=%u exceeds the 
limit %u.\n",
++                              vi->rss_key_size, VIRTIO_NET_RSS_MAX_KEY_SIZE);
++                      err = -EINVAL;
++                      goto free;
++              }
+ 
+               vi->rss_hash_types_supported =
+                   virtio_cread32(vdev, offsetof(struct virtio_net_config, 
supported_hash_types));
+diff --git a/drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c 
b/drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c
+index 91a0eb19e0d89e..f4f924d75103a4 100644
+--- a/drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c
++++ b/drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c
+@@ -262,7 +262,7 @@ int t7xx_dpmaif_rx_buf_alloc(struct dpmaif_ctrl 
*dpmaif_ctrl,
+       return 0;
+ 
+ err_unmap_skbs:
+-      while (--i > 0)
++      while (i--)
+               t7xx_unmap_bat_skb(dpmaif_ctrl->dev, bat_req->bat_skb, i);
+ 
+       return ret;
+diff --git a/drivers/platform/x86/amd/pmc.c b/drivers/platform/x86/amd/pmc.c
+index eb9fc6cb13e33b..f237c1ea8d3509 100644
+--- a/drivers/platform/x86/amd/pmc.c
++++ b/drivers/platform/x86/amd/pmc.c
+@@ -878,6 +878,11 @@ static int amd_pmc_s2d_init(struct amd_pmc_dev *dev)
+       amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_LOW, &phys_addr_low, 
STB_SPILL_TO_DRAM, 1);
+       amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_HIGH, &phys_addr_hi, 
STB_SPILL_TO_DRAM, 1);
+ 
++      if (!phys_addr_hi && !phys_addr_low) {
++              dev_err(dev->dev, "STB is not enabled on the system; disable 
enable_stb or contact system vendor\n");
++              return -EINVAL;
++      }
++
+       stb_phys_addr = ((u64)phys_addr_hi << 32 | phys_addr_low);
+ 
+       /* Clear msg_port for other SMU operation */
+diff --git a/drivers/pwm/pwm-imx-tpm.c b/drivers/pwm/pwm-imx-tpm.c
+index 318dc0be974b44..48eb32d9aae97f 100644
+--- a/drivers/pwm/pwm-imx-tpm.c
++++ b/drivers/pwm/pwm-imx-tpm.c
+@@ -106,7 +106,9 @@ static int pwm_imx_tpm_round_state(struct pwm_chip *chip,
+       p->prescale = prescale;
+ 
+       period_count = (clock_unit + ((1 << prescale) >> 1)) >> prescale;
+-      p->mod = period_count;
++      if (period_count == 0)
++              return -EINVAL;
++      p->mod = period_count - 1;
+ 
+       /* calculate real period HW can support */
+       tmp = (u64)period_count << prescale;
+diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c
+index 4c35b4a916355c..4c78288ffa72fe 100644
+--- a/drivers/scsi/sd_zbc.c
++++ b/drivers/scsi/sd_zbc.c
+@@ -216,8 +216,7 @@ static void *sd_zbc_alloc_report_buffer(struct scsi_disk 
*sdkp,
+       bufsize = min_t(size_t, bufsize, queue_max_segments(q) << PAGE_SHIFT);
+ 
+       while (bufsize >= SECTOR_SIZE) {
+-              buf = __vmalloc(bufsize,
+-                              GFP_KERNEL | __GFP_ZERO | __GFP_NORETRY);
++              buf = kvzalloc(bufsize, GFP_KERNEL | __GFP_NORETRY);
+               if (buf) {
+                       *buflen = bufsize;
+                       return buf;
+diff --git a/drivers/thermal/qcom/lmh.c b/drivers/thermal/qcom/lmh.c
+index 97cf0dc3a6c38d..1434ab8f6988c9 100644
+--- a/drivers/thermal/qcom/lmh.c
++++ b/drivers/thermal/qcom/lmh.c
+@@ -73,7 +73,14 @@ static struct irq_chip lmh_irq_chip = {
+ static int lmh_irq_map(struct irq_domain *d, unsigned int irq, 
irq_hw_number_t hw)
+ {
+       struct lmh_hw_data *lmh_data = d->host_data;
++      static struct lock_class_key lmh_lock_key;
++      static struct lock_class_key lmh_request_key;
+ 
++      /*
++       * This lock class tells lockdep that GPIO irqs are in a different
++       * category than their parents, so it won't report false recursion.
++       */
++      irq_set_lockdep_class(irq, &lmh_lock_key, &lmh_request_key);
+       irq_set_chip_and_handler(irq, &lmh_irq_chip, handle_simple_irq);
+       irq_set_chip_data(irq, lmh_data);
+ 
+diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
+index 323c8cd1714851..07476147559a51 100644
+--- a/drivers/thermal/thermal_of.c
++++ b/drivers/thermal/thermal_of.c
+@@ -238,18 +238,15 @@ static struct thermal_trip *thermal_of_trips_init(struct 
device_node *np, int *n
+       struct device_node *trips;
+       int ret, count;
+ 
++      *ntrips = 0;
++      
+       trips = of_get_child_by_name(np, "trips");
+-      if (!trips) {
+-              pr_err("Failed to find 'trips' node\n");
+-              return ERR_PTR(-EINVAL);
+-      }
++      if (!trips)
++              return NULL;
+ 
+       count = of_get_child_count(trips);
+-      if (!count) {
+-              pr_err("No trip point defined\n");
+-              ret = -EINVAL;
+-              goto out_of_node_put;
+-      }
++      if (!count)
++              return NULL;
+ 
+       tt = kzalloc(sizeof(*tt) * count, GFP_KERNEL);
+       if (!tt) {
+@@ -272,7 +269,6 @@ static struct thermal_trip *thermal_of_trips_init(struct 
device_node *np, int *n
+ 
+ out_kfree:
+       kfree(tt);
+-      *ntrips = 0;
+ out_of_node_put:
+       of_node_put(trips);
+ 
+@@ -619,11 +615,14 @@ struct thermal_zone_device 
*thermal_of_zone_register(struct device_node *sensor,
+ 
+       trips = thermal_of_trips_init(np, &ntrips);
+       if (IS_ERR(trips)) {
+-              pr_err("Failed to find trip points for %pOFn id=%d\n", sensor, 
id);
++              pr_err("Failed to parse trip points for %pOFn id=%d\n", sensor, 
id);
+               ret = PTR_ERR(trips);
+               goto out_kfree_of_ops;
+       }
+ 
++      if (!trips)
++              pr_info("No trip points found for %pOFn id=%d\n", sensor, id);
++
+       ret = thermal_of_monitor_init(np, &delay, &pdelay);
+       if (ret) {
+               pr_err("Failed to initialize monitoring delays from %pOFn\n", 
np);
+diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
+index 22edd8d451da02..297e6032bdd1a2 100644
+--- a/drivers/usb/dwc3/core.c
++++ b/drivers/usb/dwc3/core.c
+@@ -2131,10 +2131,18 @@ static int dwc3_suspend_common(struct dwc3 *dwc, 
pm_message_t msg)
+ {
+       u32 reg;
+ 
+-      dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) &
+-                          DWC3_GUSB2PHYCFG_SUSPHY) ||
+-                          (dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)) &
+-                          DWC3_GUSB3PIPECTL_SUSPHY);
++      if (!pm_runtime_suspended(dwc->dev) && !PMSG_IS_AUTO(msg)) {
++              dwc->susphy_state = (dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)) 
&
++                                  DWC3_GUSB2PHYCFG_SUSPHY) ||
++                                  (dwc3_readl(dwc->regs, 
DWC3_GUSB3PIPECTL(0)) &
++                                  DWC3_GUSB3PIPECTL_SUSPHY);
++              /*
++               * TI AM62 platform requires SUSPHY to be
++               * enabled for system suspend to work.
++               */
++              if (!dwc->susphy_state)
++                      dwc3_enable_susphy(dwc, true);
++      }
+ 
+       switch (dwc->current_dr_role) {
+       case DWC3_GCTL_PRTCAP_DEVICE:
+@@ -2183,15 +2191,6 @@ static int dwc3_suspend_common(struct dwc3 *dwc, 
pm_message_t msg)
+               break;
+       }
+ 
+-      if (!PMSG_IS_AUTO(msg)) {
+-              /*
+-               * TI AM62 platform requires SUSPHY to be
+-               * enabled for system suspend to work.
+-               */
+-              if (!dwc->susphy_state)
+-                      dwc3_enable_susphy(dwc, true);
+-      }
+-
+       return 0;
+ }
+ 
+diff --git a/drivers/usb/musb/sunxi.c b/drivers/usb/musb/sunxi.c
+index 7f9a999cd5ff14..4ffe0d4f2ac5cf 100644
+--- a/drivers/usb/musb/sunxi.c
++++ b/drivers/usb/musb/sunxi.c
+@@ -286,8 +286,6 @@ static int sunxi_musb_exit(struct musb *musb)
+       if (test_bit(SUNXI_MUSB_FL_HAS_SRAM, &glue->flags))
+               sunxi_sram_release(musb->controller->parent);
+ 
+-      devm_usb_put_phy(glue->dev, glue->xceiv);
+-
+       return 0;
+ }
+ 
+diff --git a/drivers/usb/serial/io_edgeport.c 
b/drivers/usb/serial/io_edgeport.c
+index 3a4c0febf33589..67c0c51603e59c 100644
+--- a/drivers/usb/serial/io_edgeport.c
++++ b/drivers/usb/serial/io_edgeport.c
+@@ -770,11 +770,12 @@ static void edge_bulk_out_data_callback(struct urb *urb)
+ static void edge_bulk_out_cmd_callback(struct urb *urb)
+ {
+       struct edgeport_port *edge_port = urb->context;
++      struct device *dev = &urb->dev->dev;
+       int status = urb->status;
+ 
+       atomic_dec(&CmdUrbs);
+-      dev_dbg(&urb->dev->dev, "%s - FREE URB %p (outstanding %d)\n",
+-              __func__, urb, atomic_read(&CmdUrbs));
++      dev_dbg(dev, "%s - FREE URB %p (outstanding %d)\n", __func__, urb,
++              atomic_read(&CmdUrbs));
+ 
+ 
+       /* clean up the transfer buffer */
+@@ -784,8 +785,7 @@ static void edge_bulk_out_cmd_callback(struct urb *urb)
+       usb_free_urb(urb);
+ 
+       if (status) {
+-              dev_dbg(&urb->dev->dev,
+-                      "%s - nonzero write bulk status received: %d\n",
++              dev_dbg(dev, "%s - nonzero write bulk status received: %d\n",
+                       __func__, status);
+               return;
+       }
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 9d2c8dc14945dc..ec737fcd2c40c2 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -251,6 +251,7 @@ static void option_instat_callback(struct urb *urb);
+ #define QUECTEL_VENDOR_ID                     0x2c7c
+ /* These Quectel products use Quectel's vendor ID */
+ #define QUECTEL_PRODUCT_EC21                  0x0121
++#define QUECTEL_PRODUCT_RG650V                        0x0122
+ #define QUECTEL_PRODUCT_EM061K_LTA            0x0123
+ #define QUECTEL_PRODUCT_EM061K_LMS            0x0124
+ #define QUECTEL_PRODUCT_EC25                  0x0125
+@@ -1273,6 +1274,8 @@ static const struct usb_device_id option_ids[] = {
+       { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EG912Y, 0xff, 0, 0) },
+       { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EG916Q, 0xff, 0x00, 0x00) },
+       { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) },
++      { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_RG650V, 0xff, 0xff, 0x30) },
++      { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_RG650V, 0xff, 0, 0) },
+ 
+       { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
+       { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
+@@ -2320,6 +2323,9 @@ static const struct usb_device_id option_ids[] = {
+       { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) },    
/* Fibocom FG150 Diag */
+       { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) },          
/* Fibocom FG150 AT */
+       { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0111, 0xff) },                   
/* Fibocom FM160 (MBIM mode) */
++      { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x0112, 0xff, 0xff, 0x30) },    
/* Fibocom FG132 Diag */
++      { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x0112, 0xff, 0xff, 0x40) },    
/* Fibocom FG132 AT */
++      { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x0112, 0xff, 0, 0) },          
/* Fibocom FG132 NMEA */
+       { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0115, 0xff),                     
/* Fibocom FM135 (laptop MBIM) */
+         .driver_info = RSVD(5) },
+       { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) },                   
/* Fibocom NL668-AM/NL652-EU (laptop MBIM) */
+diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c
+index 703a9c56355731..061ff754b307bc 100644
+--- a/drivers/usb/serial/qcserial.c
++++ b/drivers/usb/serial/qcserial.c
+@@ -166,6 +166,8 @@ static const struct usb_device_id id_table[] = {
+       {DEVICE_SWI(0x1199, 0x9090)},   /* Sierra Wireless EM7565 QDL */
+       {DEVICE_SWI(0x1199, 0x9091)},   /* Sierra Wireless EM7565 */
+       {DEVICE_SWI(0x1199, 0x90d2)},   /* Sierra Wireless EM9191 QDL */
++      {DEVICE_SWI(0x1199, 0x90e4)},   /* Sierra Wireless EM86xx QDL*/
++      {DEVICE_SWI(0x1199, 0x90e5)},   /* Sierra Wireless EM86xx */
+       {DEVICE_SWI(0x1199, 0xc080)},   /* Sierra Wireless EM7590 QDL */
+       {DEVICE_SWI(0x1199, 0xc081)},   /* Sierra Wireless EM7590 */
+       {DEVICE_SWI(0x413c, 0x81a2)},   /* Dell Wireless 5806 Gobi(TM) 4G LTE 
Mobile Broadband Card */
+diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c 
b/drivers/usb/typec/ucsi/ucsi_ccg.c
+index 835f1c4372ba24..8e500fe41e785f 100644
+--- a/drivers/usb/typec/ucsi/ucsi_ccg.c
++++ b/drivers/usb/typec/ucsi/ucsi_ccg.c
+@@ -441,6 +441,8 @@ static void ucsi_ccg_update_set_new_cam_cmd(struct 
ucsi_ccg *uc,
+ 
+       port = uc->orig;
+       new_cam = UCSI_SET_NEW_CAM_GET_AM(*cmd);
++      if (new_cam >= ARRAY_SIZE(uc->updated))
++              return;
+       new_port = &uc->updated[new_cam];
+       cam = new_port->linked_idx;
+       enter_new_mode = UCSI_SET_NEW_CAM_ENTER(*cmd);
+diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
+index e08e3852c47887..99a78ca28db295 100644
+--- a/fs/btrfs/delayed-ref.c
++++ b/fs/btrfs/delayed-ref.c
+@@ -622,7 +622,7 @@ static int insert_delayed_ref(struct btrfs_trans_handle 
*trans,
+                                             &href->ref_add_list);
+                       else if (ref->action == BTRFS_DROP_DELAYED_REF) {
+                               ASSERT(!list_empty(&exist->add_list));
+-                              list_del(&exist->add_list);
++                              list_del_init(&exist->add_list);
+                       } else {
+                               ASSERT(0);
+                       }
+diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
+index cf8c3771e4bfb7..964df0725f4c2f 100644
+--- a/fs/nfs/inode.c
++++ b/fs/nfs/inode.c
+@@ -206,13 +206,17 @@ void nfs_set_cache_invalid(struct inode *inode, unsigned 
long flags)
+               nfs_fscache_invalidate(inode, 0);
+       flags &= ~NFS_INO_REVAL_FORCED;
+ 
+-      nfsi->cache_validity |= flags;
+-
++      flags |= nfsi->cache_validity;
+       if (inode->i_mapping->nrpages == 0)
+-              nfsi->cache_validity &= ~(NFS_INO_INVALID_DATA |
+-                                        NFS_INO_DATA_INVAL_DEFER);
+-      else if (nfsi->cache_validity & NFS_INO_INVALID_DATA)
+-              nfsi->cache_validity &= ~NFS_INO_DATA_INVAL_DEFER;
++              flags &= ~NFS_INO_INVALID_DATA;
++
++      /* pairs with nfs_clear_invalid_mapping()'s smp_load_acquire() */
++      smp_store_release(&nfsi->cache_validity, flags);
++
++      if (inode->i_mapping->nrpages == 0 ||
++          nfsi->cache_validity & NFS_INO_INVALID_DATA) {
++              nfs_ooo_clear(nfsi);
++      }
+       trace_nfs_set_cache_invalid(inode, 0);
+ }
+ EXPORT_SYMBOL_GPL(nfs_set_cache_invalid);
+@@ -677,9 +681,10 @@ static int nfs_vmtruncate(struct inode * inode, loff_t 
offset)
+       trace_nfs_size_truncate(inode, offset);
+       i_size_write(inode, offset);
+       /* Optimisation */
+-      if (offset == 0)
+-              NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_DATA |
+-                              NFS_INO_DATA_INVAL_DEFER);
++      if (offset == 0) {
++              NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_DATA;
++              nfs_ooo_clear(NFS_I(inode));
++      }
+       NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_SIZE;
+ 
+       spin_unlock(&inode->i_lock);
+@@ -1099,7 +1104,7 @@ void nfs_inode_attach_open_context(struct 
nfs_open_context *ctx)
+ 
+       spin_lock(&inode->i_lock);
+       if (list_empty(&nfsi->open_files) &&
+-          (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER))
++          nfs_ooo_test(nfsi))
+               nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA |
+                                                    NFS_INO_REVAL_FORCED);
+       list_add_tail_rcu(&ctx->list, &nfsi->open_files);
+@@ -1329,6 +1334,13 @@ int nfs_clear_invalid_mapping(struct address_space 
*mapping)
+                                        TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
+               if (ret)
+                       goto out;
++              smp_rmb(); /* pairs with smp_wmb() below */
++              if (test_bit(NFS_INO_INVALIDATING, bitlock))
++                      continue;
++              /* pairs with nfs_set_cache_invalid()'s smp_store_release() */
++              if (!(smp_load_acquire(&nfsi->cache_validity) & 
NFS_INO_INVALID_DATA))
++                      goto out;
++              /* Slow-path that double-checks with spinlock held */
+               spin_lock(&inode->i_lock);
+               if (test_bit(NFS_INO_INVALIDATING, bitlock)) {
+                       spin_unlock(&inode->i_lock);
+@@ -1342,8 +1354,8 @@ int nfs_clear_invalid_mapping(struct address_space 
*mapping)
+ 
+       set_bit(NFS_INO_INVALIDATING, bitlock);
+       smp_wmb();
+-      nfsi->cache_validity &=
+-              ~(NFS_INO_INVALID_DATA | NFS_INO_DATA_INVAL_DEFER);
++      nfsi->cache_validity &= ~NFS_INO_INVALID_DATA;
++      nfs_ooo_clear(nfsi);
+       spin_unlock(&inode->i_lock);
+       trace_nfs_invalidate_mapping_enter(inode);
+       ret = nfs_invalidate_mapping(inode, mapping);
+@@ -1554,6 +1566,7 @@ void nfs_fattr_init(struct nfs_fattr *fattr)
+       fattr->gencount = nfs_inc_attr_generation_counter();
+       fattr->owner_name = NULL;
+       fattr->group_name = NULL;
++      fattr->mdsthreshold = NULL;
+ }
+ EXPORT_SYMBOL_GPL(nfs_fattr_init);
+ 
+@@ -1805,6 +1818,66 @@ static int nfs_inode_finish_partial_attr_update(const 
struct nfs_fattr *fattr,
+       return 0;
+ }
+ 
++static void nfs_ooo_merge(struct nfs_inode *nfsi,
++                        u64 start, u64 end)
++{
++      int i, cnt;
++
++      if (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER)
++              /* No point merging anything */
++              return;
++
++      if (!nfsi->ooo) {
++              nfsi->ooo = kmalloc(sizeof(*nfsi->ooo), GFP_ATOMIC);
++              if (!nfsi->ooo) {
++                      nfsi->cache_validity |= NFS_INO_DATA_INVAL_DEFER;
++                      return;
++              }
++              nfsi->ooo->cnt = 0;
++      }
++
++      /* add this range, merging if possible */
++      cnt = nfsi->ooo->cnt;
++      for (i = 0; i < cnt; i++) {
++              if (end == nfsi->ooo->gap[i].start)
++                      end = nfsi->ooo->gap[i].end;
++              else if (start == nfsi->ooo->gap[i].end)
++                      start = nfsi->ooo->gap[i].start;
++              else
++                      continue;
++              /* Remove 'i' from table and loop to insert the new range */
++              cnt -= 1;
++              nfsi->ooo->gap[i] = nfsi->ooo->gap[cnt];
++              i = -1;
++      }
++      if (start != end) {
++              if (cnt >= ARRAY_SIZE(nfsi->ooo->gap)) {
++                      nfsi->cache_validity |= NFS_INO_DATA_INVAL_DEFER;
++                      kfree(nfsi->ooo);
++                      nfsi->ooo = NULL;
++                      return;
++              }
++              nfsi->ooo->gap[cnt].start = start;
++              nfsi->ooo->gap[cnt].end = end;
++              cnt += 1;
++      }
++      nfsi->ooo->cnt = cnt;
++}
++
++static void nfs_ooo_record(struct nfs_inode *nfsi,
++                         struct nfs_fattr *fattr)
++{
++      /* This reply was out-of-order, so record in the
++       * pre/post change id, possibly cancelling
++       * gaps created when iversion was jumpped forward.
++       */
++      if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) &&
++          (fattr->valid & NFS_ATTR_FATTR_PRECHANGE))
++              nfs_ooo_merge(nfsi,
++                            fattr->change_attr,
++                            fattr->pre_change_attr);
++}
++
+ static int nfs_refresh_inode_locked(struct inode *inode,
+                                   struct nfs_fattr *fattr)
+ {
+@@ -1815,8 +1888,12 @@ static int nfs_refresh_inode_locked(struct inode *inode,
+ 
+       if (attr_cmp > 0 || nfs_inode_finish_partial_attr_update(fattr, inode))
+               ret = nfs_update_inode(inode, fattr);
+-      else if (attr_cmp == 0)
+-              ret = nfs_check_inode_attributes(inode, fattr);
++      else {
++              nfs_ooo_record(NFS_I(inode), fattr);
++
++              if (attr_cmp == 0)
++                      ret = nfs_check_inode_attributes(inode, fattr);
++      }
+ 
+       trace_nfs_refresh_inode_exit(inode, ret);
+       return ret;
+@@ -1907,6 +1984,8 @@ int nfs_post_op_update_inode_force_wcc_locked(struct 
inode *inode, struct nfs_fa
+       if (attr_cmp < 0)
+               return 0;
+       if ((fattr->valid & NFS_ATTR_FATTR) == 0 || !attr_cmp) {
++              /* Record the pre/post change info before clearing PRECHANGE */
++              nfs_ooo_record(NFS_I(inode), fattr);
+               fattr->valid &= ~(NFS_ATTR_FATTR_PRECHANGE
+                               | NFS_ATTR_FATTR_PRESIZE
+                               | NFS_ATTR_FATTR_PREMTIME
+@@ -2061,6 +2140,15 @@ static int nfs_update_inode(struct inode *inode, struct 
nfs_fattr *fattr)
+ 
+       /* More cache consistency checks */
+       if (fattr->valid & NFS_ATTR_FATTR_CHANGE) {
++              if (!have_writers && nfsi->ooo && nfsi->ooo->cnt == 1 &&
++                  nfsi->ooo->gap[0].end == inode_peek_iversion_raw(inode)) {
++                      /* There is one remaining gap that hasn't been
++                       * merged into iversion - do that now.
++                       */
++                      inode_set_iversion_raw(inode, nfsi->ooo->gap[0].start);
++                      kfree(nfsi->ooo);
++                      nfsi->ooo = NULL;
++              }
+               if (!inode_eq_iversion_raw(inode, fattr->change_attr)) {
+                       /* Could it be a race with writeback? */
+                       if (!(have_writers || have_delegation)) {
+@@ -2082,8 +2170,11 @@ static int nfs_update_inode(struct inode *inode, struct 
nfs_fattr *fattr)
+                               dprintk("NFS: change_attr change on server for 
file %s/%ld\n",
+                                               inode->i_sb->s_id,
+                                               inode->i_ino);
+-                      } else if (!have_delegation)
+-                              nfsi->cache_validity |= 
NFS_INO_DATA_INVAL_DEFER;
++                      } else if (!have_delegation) {
++                              nfs_ooo_record(nfsi, fattr);
++                              nfs_ooo_merge(nfsi, 
inode_peek_iversion_raw(inode),
++                                            fattr->change_attr);
++                      }
+                       inode_set_iversion_raw(inode, fattr->change_attr);
+               }
+       } else {
+@@ -2237,6 +2328,7 @@ struct inode *nfs_alloc_inode(struct super_block *sb)
+               return NULL;
+       nfsi->flags = 0UL;
+       nfsi->cache_validity = 0UL;
++      nfsi->ooo = NULL;
+ #if IS_ENABLED(CONFIG_NFS_V4)
+       nfsi->nfs4_acl = NULL;
+ #endif /* CONFIG_NFS_V4 */
+@@ -2249,6 +2341,7 @@ EXPORT_SYMBOL_GPL(nfs_alloc_inode);
+ 
+ void nfs_free_inode(struct inode *inode)
+ {
++      kfree(NFS_I(inode)->ooo);
+       kmem_cache_free(nfs_inode_cachep, NFS_I(inode));
+ }
+ EXPORT_SYMBOL_GPL(nfs_free_inode);
+diff --git a/fs/nfs/super.c b/fs/nfs/super.c
+index f7b4df29ac5f0b..3dffeb1d17b9cc 100644
+--- a/fs/nfs/super.c
++++ b/fs/nfs/super.c
+@@ -866,7 +866,15 @@ static int nfs_request_mount(struct fs_context *fc,
+        * Now ask the mount server to map our export path
+        * to a file handle.
+        */
+-      status = nfs_mount(&request, ctx->timeo, ctx->retrans);
++      if ((request.protocol == XPRT_TRANSPORT_UDP) ==
++          !(ctx->flags & NFS_MOUNT_TCP))
++              /*
++               * NFS protocol and mount protocol are both UDP or neither UDP
++               * so timeouts are compatible.  Use NFS timeouts for MOUNT
++               */
++              status = nfs_mount(&request, ctx->timeo, ctx->retrans);
++      else
++              status = nfs_mount(&request, NFS_UNSPEC_TIMEO, 
NFS_UNSPEC_RETRANS);
+       if (status != 0) {
+               dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n",
+                               request.hostname, status);
+diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
+index eec2ead5df6d2f..69fab4e5bc2aa0 100644
+--- a/fs/ocfs2/xattr.c
++++ b/fs/ocfs2/xattr.c
+@@ -2040,8 +2040,7 @@ static int ocfs2_xa_remove(struct ocfs2_xa_loc *loc,
+                               rc = 0;
+                       ocfs2_xa_cleanup_value_truncate(loc, "removing",
+                                                       orig_clusters);
+-                      if (rc)
+-                              goto out;
++                      goto out;
+               }
+       }
+ 
+diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
+index f4d5db3597187c..147cc771d5a660 100644
+--- a/fs/proc/vmcore.c
++++ b/fs/proc/vmcore.c
+@@ -457,10 +457,6 @@ static vm_fault_t mmap_vmcore_fault(struct vm_fault *vmf)
+ #endif
+ }
+ 
+-static const struct vm_operations_struct vmcore_mmap_ops = {
+-      .fault = mmap_vmcore_fault,
+-};
+-
+ /**
+  * vmcore_alloc_buf - allocate buffer in vmalloc memory
+  * @size: size of buffer
+@@ -488,6 +484,11 @@ static inline char *vmcore_alloc_buf(size_t size)
+  * virtually contiguous user-space in ELF layout.
+  */
+ #ifdef CONFIG_MMU
++
++static const struct vm_operations_struct vmcore_mmap_ops = {
++      .fault = mmap_vmcore_fault,
++};
++
+ /*
+  * remap_oldmem_pfn_checked - do remap_oldmem_pfn_range replacing all pages
+  * reported as not being ram with the zero page.
+diff --git a/fs/smb/server/mgmt/user_session.c 
b/fs/smb/server/mgmt/user_session.c
+index 844db95e66511c..710ac7b976fa87 100644
+--- a/fs/smb/server/mgmt/user_session.c
++++ b/fs/smb/server/mgmt/user_session.c
+@@ -90,7 +90,7 @@ static int __rpc_method(char *rpc_name)
+ 
+ int ksmbd_session_rpc_open(struct ksmbd_session *sess, char *rpc_name)
+ {
+-      struct ksmbd_session_rpc *entry;
++      struct ksmbd_session_rpc *entry, *old;
+       struct ksmbd_rpc_command *resp;
+       int method;
+ 
+@@ -106,16 +106,19 @@ int ksmbd_session_rpc_open(struct ksmbd_session *sess, 
char *rpc_name)
+       entry->id = ksmbd_ipc_id_alloc();
+       if (entry->id < 0)
+               goto free_entry;
+-      xa_store(&sess->rpc_handle_list, entry->id, entry, GFP_KERNEL);
++      old = xa_store(&sess->rpc_handle_list, entry->id, entry, GFP_KERNEL);
++      if (xa_is_err(old))
++              goto free_id;
+ 
+       resp = ksmbd_rpc_open(sess, entry->id);
+       if (!resp)
+-              goto free_id;
++              goto erase_xa;
+ 
+       kvfree(resp);
+       return entry->id;
+-free_id:
++erase_xa:
+       xa_erase(&sess->rpc_handle_list, entry->id);
++free_id:
+       ksmbd_rpc_id_free(entry->id);
+ free_entry:
+       kfree(entry);
+@@ -174,6 +177,7 @@ static void ksmbd_expire_session(struct ksmbd_conn *conn)
+       unsigned long id;
+       struct ksmbd_session *sess;
+ 
++      down_write(&sessions_table_lock);
+       down_write(&conn->session_lock);
+       xa_for_each(&conn->sessions, id, sess) {
+               if (atomic_read(&sess->refcnt) == 0 &&
+@@ -187,6 +191,7 @@ static void ksmbd_expire_session(struct ksmbd_conn *conn)
+               }
+       }
+       up_write(&conn->session_lock);
++      up_write(&sessions_table_lock);
+ }
+ 
+ int ksmbd_session_register(struct ksmbd_conn *conn,
+@@ -228,7 +233,6 @@ void ksmbd_sessions_deregister(struct ksmbd_conn *conn)
+                       }
+               }
+       }
+-      up_write(&sessions_table_lock);
+ 
+       down_write(&conn->session_lock);
+       xa_for_each(&conn->sessions, id, sess) {
+@@ -248,6 +252,7 @@ void ksmbd_sessions_deregister(struct ksmbd_conn *conn)
+               }
+       }
+       up_write(&conn->session_lock);
++      up_write(&sessions_table_lock);
+ }
+ 
+ struct ksmbd_session *ksmbd_session_lookup(struct ksmbd_conn *conn,
+diff --git a/fs/smb/server/server.c b/fs/smb/server/server.c
+index 09ebcf39d5bcb7..da5b9678ad05a0 100644
+--- a/fs/smb/server/server.c
++++ b/fs/smb/server/server.c
+@@ -238,11 +238,11 @@ static void __handle_ksmbd_work(struct ksmbd_work *work,
+       } while (is_chained == true);
+ 
+ send:
+-      if (work->sess)
+-              ksmbd_user_session_put(work->sess);
+       if (work->tcon)
+               ksmbd_tree_connect_put(work->tcon);
+       smb3_preauth_hash_rsp(work);
++      if (work->sess)
++              ksmbd_user_session_put(work->sess);
+       if (work->sess && work->sess->enc && work->encrypted &&
+           conn->ops->encrypt_resp) {
+               rc = conn->ops->encrypt_resp(work);
+diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
+index ac7d799d9d3871..dc6c3cc2c2b36c 100644
+--- a/include/linux/nfs_fs.h
++++ b/include/linux/nfs_fs.h
+@@ -190,6 +190,39 @@ struct nfs_inode {
+       /* Open contexts for shared mmap writes */
+       struct list_head        open_files;
+ 
++      /* Keep track of out-of-order replies.
++       * The ooo array contains start/end pairs of
++       * numbers from the changeid sequence when
++       * the inode's iversion has been updated.
++       * It also contains end/start pair (i.e. reverse order)
++       * of sections of the changeid sequence that have
++       * been seen in replies from the server.
++       * Normally these should match and when both
++       * A:B and B:A are found in ooo, they are both removed.
++       * And if a reply with A:B causes an iversion update
++       * of A:B, then neither are added.
++       * When a reply has pre_change that doesn't match
++       * iversion, then the changeid pair and any consequent
++       * change in iversion ARE added.  Later replies
++       * might fill in the gaps, or possibly a gap is caused
++       * by a change from another client.
++       * When a file or directory is opened, if the ooo table
++       * is not empty, then we assume the gaps were due to
++       * another client and we invalidate the cached data.
++       *
++       * We can only track a limited number of concurrent gaps.
++       * Currently that limit is 16.
++       * We allocate the table on demand.  If there is insufficient
++       * memory, then we probably cannot cache the file anyway
++       * so there is no loss.
++       */
++      struct {
++              int cnt;
++              struct {
++                      u64 start, end;
++              } gap[16];
++      } *ooo;
++
+ #if IS_ENABLED(CONFIG_NFS_V4)
+       struct nfs4_cached_acl  *nfs4_acl;
+         /* NFSv4 state */
+@@ -616,6 +649,20 @@ nfs_fileid_to_ino_t(u64 fileid)
+       return ino;
+ }
+ 
++static inline void nfs_ooo_clear(struct nfs_inode *nfsi)
++{
++      nfsi->cache_validity &= ~NFS_INO_DATA_INVAL_DEFER;
++      kfree(nfsi->ooo);
++      nfsi->ooo = NULL;
++}
++
++static inline bool nfs_ooo_test(struct nfs_inode *nfsi)
++{
++      return (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER) ||
++              (nfsi->ooo && nfsi->ooo->cnt > 0);
++
++}
++
+ #define NFS_JUKEBOX_RETRY_TIME (5 * HZ)
+ 
+ /* We need to block new opens while a file is being unlinked.
+diff --git a/include/linux/tick.h b/include/linux/tick.h
+index 9459fef5b85736..9701c571a5cfe9 100644
+--- a/include/linux/tick.h
++++ b/include/linux/tick.h
+@@ -252,12 +252,19 @@ static inline void tick_dep_set_task(struct task_struct 
*tsk,
+       if (tick_nohz_full_enabled())
+               tick_nohz_dep_set_task(tsk, bit);
+ }
++
+ static inline void tick_dep_clear_task(struct task_struct *tsk,
+                                      enum tick_dep_bits bit)
+ {
+       if (tick_nohz_full_enabled())
+               tick_nohz_dep_clear_task(tsk, bit);
+ }
++
++static inline void tick_dep_init_task(struct task_struct *tsk)
++{
++      atomic_set(&tsk->tick_dep_mask, 0);
++}
++
+ static inline void tick_dep_set_signal(struct task_struct *tsk,
+                                      enum tick_dep_bits bit)
+ {
+@@ -291,6 +298,7 @@ static inline void tick_dep_set_task(struct task_struct 
*tsk,
+                                    enum tick_dep_bits bit) { }
+ static inline void tick_dep_clear_task(struct task_struct *tsk,
+                                      enum tick_dep_bits bit) { }
++static inline void tick_dep_init_task(struct task_struct *tsk) { }
+ static inline void tick_dep_set_signal(struct task_struct *tsk,
+                                      enum tick_dep_bits bit) { }
+ static inline void tick_dep_clear_signal(struct signal_struct *signal,
+diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h
+index 45f09bec02c485..733f2a97589b26 100644
+--- a/include/linux/user_namespace.h
++++ b/include/linux/user_namespace.h
+@@ -131,7 +131,8 @@ static inline long get_rlimit_value(struct ucounts 
*ucounts, enum rlimit_type ty
+ 
+ long inc_rlimit_ucounts(struct ucounts *ucounts, enum rlimit_type type, long 
v);
+ bool dec_rlimit_ucounts(struct ucounts *ucounts, enum rlimit_type type, long 
v);
+-long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type);
++long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type,
++                          bool override_rlimit);
+ void dec_rlimit_put_ucounts(struct ucounts *ucounts, enum rlimit_type type);
+ bool is_rlimit_overlimit(struct ucounts *ucounts, enum rlimit_type type, 
unsigned long max);
+ 
+diff --git a/kernel/fork.c b/kernel/fork.c
+index 8dd46baee4c39b..09a935724bd952 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -97,6 +97,7 @@
+ #include <linux/scs.h>
+ #include <linux/io_uring.h>
+ #include <linux/bpf.h>
++#include <linux/tick.h>
+ 
+ #include <asm/pgalloc.h>
+ #include <linux/uaccess.h>
+@@ -2183,6 +2184,7 @@ static __latent_entropy struct task_struct *copy_process(
+       acct_clear_integrals(p);
+ 
+       posix_cputimers_init(&p->posix_cputimers);
++      tick_dep_init_task(p);
+ 
+       p->io_context = NULL;
+       audit_set_context(p, NULL);
+diff --git a/kernel/signal.c b/kernel/signal.c
+index 4bebd2443cc3a8..723c84d162ddba 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -426,7 +426,8 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t 
gfp_flags,
+        */
+       rcu_read_lock();
+       ucounts = task_ucounts(t);
+-      sigpending = inc_rlimit_get_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING);
++      sigpending = inc_rlimit_get_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING,
++                                          override_rlimit);
+       rcu_read_unlock();
+       if (!sigpending)
+               return NULL;
+diff --git a/kernel/ucount.c b/kernel/ucount.c
+index ee8e57fd6f9078..ced99a4bb56245 100644
+--- a/kernel/ucount.c
++++ b/kernel/ucount.c
+@@ -307,7 +307,8 @@ void dec_rlimit_put_ucounts(struct ucounts *ucounts, enum 
rlimit_type type)
+       do_dec_rlimit_put_ucounts(ucounts, NULL, type);
+ }
+ 
+-long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type)
++long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type,
++                          bool override_rlimit)
+ {
+       /* Caller must hold a reference to ucounts */
+       struct ucounts *iter;
+@@ -317,10 +318,11 @@ long inc_rlimit_get_ucounts(struct ucounts *ucounts, 
enum rlimit_type type)
+       for (iter = ucounts; iter; iter = iter->ns->ucounts) {
+               long new = atomic_long_add_return(1, &iter->rlimit[type]);
+               if (new < 0 || new > max)
+-                      goto unwind;
++                      goto dec_unwind;
+               if (iter == ucounts)
+                       ret = new;
+-              max = get_userns_rlimit_max(iter->ns, type);
++              if (!override_rlimit)
++                      max = get_userns_rlimit_max(iter->ns, type);
+               /*
+                * Grab an extra ucount reference for the caller when
+                * the rlimit count was previously 0.
+@@ -334,7 +336,6 @@ long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum 
rlimit_type type)
+ dec_unwind:
+       dec = atomic_long_sub_return(1, &iter->rlimit[type]);
+       WARN_ON_ONCE(dec < 0);
+-unwind:
+       do_dec_rlimit_put_ucounts(ucounts, iter, type);
+       return 0;
+ }
+diff --git a/mm/filemap.c b/mm/filemap.c
+index d3b925232a59e8..dc23b1336a8bd5 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -2738,7 +2738,7 @@ ssize_t filemap_read(struct kiocb *iocb, struct iov_iter 
*iter,
+       if (unlikely(!iov_iter_count(iter)))
+               return 0;
+ 
+-      iov_iter_truncate(iter, inode->i_sb->s_maxbytes);
++      iov_iter_truncate(iter, inode->i_sb->s_maxbytes - iocb->ki_pos);
+       folio_batch_init(&fbatch);
+ 
+       do {
+diff --git a/net/core/dst.c b/net/core/dst.c
+index d178c564138eeb..8db87258d14505 100644
+--- a/net/core/dst.c
++++ b/net/core/dst.c
+@@ -108,9 +108,6 @@ struct dst_entry *dst_destroy(struct dst_entry * dst)
+               child = xdst->child;
+       }
+ #endif
+-      if (!(dst->flags & DST_NOCOUNT))
+-              dst_entries_add(dst->ops, -1);
+-
+       if (dst->ops->destroy)
+               dst->ops->destroy(dst);
+       netdev_put(dst->dev, &dst->dev_tracker);
+@@ -160,6 +157,12 @@ void dst_dev_put(struct dst_entry *dst)
+ }
+ EXPORT_SYMBOL(dst_dev_put);
+ 
++static void dst_count_dec(struct dst_entry *dst)
++{
++      if (!(dst->flags & DST_NOCOUNT))
++              dst_entries_add(dst->ops, -1);
++}
++
+ void dst_release(struct dst_entry *dst)
+ {
+       if (dst) {
+@@ -169,8 +172,10 @@ void dst_release(struct dst_entry *dst)
+               if (WARN_ONCE(newrefcnt < 0, "dst_release underflow"))
+                       net_warn_ratelimited("%s: dst:%p refcnt:%d\n",
+                                            __func__, dst, newrefcnt);
+-              if (!newrefcnt)
++              if (!newrefcnt){
++                      dst_count_dec(dst);
+                       call_rcu(&dst->rcu_head, dst_destroy_rcu);
++              }
+       }
+ }
+ EXPORT_SYMBOL(dst_release);
+@@ -184,8 +189,10 @@ void dst_release_immediate(struct dst_entry *dst)
+               if (WARN_ONCE(newrefcnt < 0, "dst_release_immediate underflow"))
+                       net_warn_ratelimited("%s: dst:%p refcnt:%d\n",
+                                            __func__, dst, newrefcnt);
+-              if (!newrefcnt)
++              if (!newrefcnt){
++                      dst_count_dec(dst);
+                       dst_destroy(dst);
++              }
+       }
+ }
+ EXPORT_SYMBOL(dst_release_immediate);
+diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c
+index 807bea1a7d3c1b..f07e34bed8f3aa 100644
+--- a/net/mac80211/chan.c
++++ b/net/mac80211/chan.c
+@@ -245,9 +245,7 @@ ieee80211_get_max_required_bw(struct ieee80211_sub_if_data 
*sdata,
+       enum nl80211_chan_width max_bw = NL80211_CHAN_WIDTH_20_NOHT;
+       struct sta_info *sta;
+ 
+-      lockdep_assert_wiphy(sdata->local->hw.wiphy);
+-
+-      list_for_each_entry(sta, &sdata->local->sta_list, list) {
++      list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) {
+               if (sdata != sta->sdata &&
+                   !(sta->sdata->bss && sta->sdata->bss == sdata->bss))
+                       continue;
+diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
+index ee9ec74b9553f9..9a5530ca2f6b23 100644
+--- a/net/mac80211/mlme.c
++++ b/net/mac80211/mlme.c
+@@ -660,7 +660,7 @@ static bool ieee80211_add_vht_ie(struct 
ieee80211_sub_if_data *sdata,
+               bool disable_mu_mimo = false;
+               struct ieee80211_sub_if_data *other;
+ 
+-              list_for_each_entry(other, &local->interfaces, list) {
++              list_for_each_entry_rcu(other, &local->interfaces, list) {
+                       if (other->vif.bss_conf.mu_mimo_owner) {
+                               disable_mu_mimo = true;
+                               break;
+diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
+index edbf468e0bea37..f1147d156c1f30 100644
+--- a/net/mac80211/scan.c
++++ b/net/mac80211/scan.c
+@@ -501,7 +501,7 @@ static void __ieee80211_scan_completed(struct ieee80211_hw 
*hw, bool aborted)
+        * the scan was in progress; if there was none this will
+        * just be a no-op for the particular interface.
+        */
+-      list_for_each_entry(sdata, &local->interfaces, list) {
++      list_for_each_entry_rcu(sdata, &local->interfaces, list) {
+               if (ieee80211_sdata_running(sdata))
+                       ieee80211_queue_work(&sdata->local->hw, &sdata->work);
+       }
+diff --git a/net/mac80211/util.c b/net/mac80211/util.c
+index 3fe15089b24f5d..738f1f139a90ee 100644
+--- a/net/mac80211/util.c
++++ b/net/mac80211/util.c
+@@ -767,9 +767,7 @@ static void __iterate_interfaces(struct ieee80211_local 
*local,
+       struct ieee80211_sub_if_data *sdata;
+       bool active_only = iter_flags & IEEE80211_IFACE_ITER_ACTIVE;
+ 
+-      list_for_each_entry_rcu(sdata, &local->interfaces, list,
+-                              lockdep_is_held(&local->iflist_mtx) ||
+-                              lockdep_is_held(&local->hw.wiphy->mtx)) {
++      list_for_each_entry_rcu(sdata, &local->interfaces, list) {
+               switch (sdata->vif.type) {
+               case NL80211_IFTYPE_MONITOR:
+                       if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
+diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
+index f2b90053ecae78..748e3876ec6d33 100644
+--- a/net/mptcp/pm_userspace.c
++++ b/net/mptcp/pm_userspace.c
+@@ -89,6 +89,7 @@ static int mptcp_userspace_pm_delete_local_addr(struct 
mptcp_sock *msk,
+                                               struct mptcp_pm_addr_entry 
*addr)
+ {
+       struct mptcp_pm_addr_entry *entry, *tmp;
++      struct sock *sk = (struct sock *)msk;
+ 
+       list_for_each_entry_safe(entry, tmp, 
&msk->pm.userspace_pm_local_addr_list, list) {
+               if (mptcp_addresses_equal(&entry->addr, &addr->addr, false)) {
+@@ -96,7 +97,7 @@ static int mptcp_userspace_pm_delete_local_addr(struct 
mptcp_sock *msk,
+                        * be used multiple times (e.g. fullmesh mode).
+                        */
+                       list_del_rcu(&entry->list);
+-                      kfree(entry);
++                      sock_kfree_s(sk, entry, sizeof(*entry));
+                       msk->pm.local_addr_used--;
+                       return 0;
+               }
+diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
+index 212fef2b72f502..1d5cdc987abde4 100644
+--- a/net/sched/sch_taprio.c
++++ b/net/sched/sch_taprio.c
+@@ -1995,9 +1995,6 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff 
*skb)
+       struct nlattr *nest, *sched_nest;
+       unsigned int i;
+ 
+-      oper = rtnl_dereference(q->oper_sched);
+-      admin = rtnl_dereference(q->admin_sched);
+-
+       opt.num_tc = netdev_get_num_tc(dev);
+       memcpy(opt.prio_tc_map, dev->prio_tc_map, sizeof(opt.prio_tc_map));
+ 
+@@ -2024,18 +2021,23 @@ static int taprio_dump(struct Qdisc *sch, struct 
sk_buff *skb)
+           nla_put_u32(skb, TCA_TAPRIO_ATTR_TXTIME_DELAY, q->txtime_delay))
+               goto options_error;
+ 
++      rcu_read_lock();
++
++      oper = rtnl_dereference(q->oper_sched);
++      admin = rtnl_dereference(q->admin_sched);
++
+       if (taprio_dump_tc_entries(q, skb))
+-              goto options_error;
++              goto options_error_rcu;
+ 
+       if (oper && dump_schedule(skb, oper))
+-              goto options_error;
++              goto options_error_rcu;
+ 
+       if (!admin)
+               goto done;
+ 
+       sched_nest = nla_nest_start_noflag(skb, TCA_TAPRIO_ATTR_ADMIN_SCHED);
+       if (!sched_nest)
+-              goto options_error;
++              goto options_error_rcu;
+ 
+       if (dump_schedule(skb, admin))
+               goto admin_error;
+@@ -2043,11 +2045,15 @@ static int taprio_dump(struct Qdisc *sch, struct 
sk_buff *skb)
+       nla_nest_end(skb, sched_nest);
+ 
+ done:
++      rcu_read_unlock();
+       return nla_nest_end(skb, nest);
+ 
+ admin_error:
+       nla_nest_cancel(skb, sched_nest);
+ 
++options_error_rcu:
++      rcu_read_unlock();
++
+ options_error:
+       nla_nest_cancel(skb, nest);
+ 
+diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
+index a56749a50e5c53..4848d5d50a5f5d 100644
+--- a/net/sctp/sm_statefuns.c
++++ b/net/sctp/sm_statefuns.c
+@@ -3752,7 +3752,7 @@ enum sctp_disposition sctp_sf_ootb(struct net *net,
+               }
+ 
+               ch = (struct sctp_chunkhdr *)ch_end;
+-      } while (ch_end < skb_tail_pointer(skb));
++      } while (ch_end + sizeof(*ch) < skb_tail_pointer(skb));
+ 
+       if (ootb_shut_ack)
+               return sctp_sf_shut_8_4_5(net, ep, asoc, type, arg, commands);
+diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
+index 02f651f85e7398..190dae11f634a2 100644
+--- a/net/sunrpc/xprtsock.c
++++ b/net/sunrpc/xprtsock.c
+@@ -2351,6 +2351,7 @@ static void xs_tcp_setup_socket(struct work_struct *work)
+       case -EHOSTUNREACH:
+       case -EADDRINUSE:
+       case -ENOBUFS:
++      case -ENOTCONN:
+               break;
+       default:
+               printk("%s: connect returned unhandled error %d\n",
+diff --git a/net/vmw_vsock/hyperv_transport.c 
b/net/vmw_vsock/hyperv_transport.c
+index 59c3e269706904..53566c77814b5b 100644
+--- a/net/vmw_vsock/hyperv_transport.c
++++ b/net/vmw_vsock/hyperv_transport.c
+@@ -549,6 +549,7 @@ static void hvs_destruct(struct vsock_sock *vsk)
+               vmbus_hvsock_device_unregister(chan);
+ 
+       kfree(hvs);
++      vsk->trans = NULL;
+ }
+ 
+ static int hvs_dgram_bind(struct vsock_sock *vsk, struct sockaddr_vm *addr)
+diff --git a/net/vmw_vsock/virtio_transport_common.c 
b/net/vmw_vsock/virtio_transport_common.c
+index 9983b833b55d8d..b22dc7bed21824 100644
+--- a/net/vmw_vsock/virtio_transport_common.c
++++ b/net/vmw_vsock/virtio_transport_common.c
+@@ -827,6 +827,7 @@ void virtio_transport_destruct(struct vsock_sock *vsk)
+       struct virtio_vsock_sock *vvs = vsk->trans;
+ 
+       kfree(vvs);
++      vsk->trans = NULL;
+ }
+ EXPORT_SYMBOL_GPL(virtio_transport_destruct);
+ 
+diff --git a/security/keys/keyring.c b/security/keys/keyring.c
+index 4448758f643a57..f331725d5a370d 100644
+--- a/security/keys/keyring.c
++++ b/security/keys/keyring.c
+@@ -772,8 +772,11 @@ static bool search_nested_keyrings(struct key *keyring,
+       for (; slot < ASSOC_ARRAY_FAN_OUT; slot++) {
+               ptr = READ_ONCE(node->slots[slot]);
+ 
+-              if (assoc_array_ptr_is_meta(ptr) && node->back_pointer)
+-                      goto descend_to_node;
++              if (assoc_array_ptr_is_meta(ptr)) {
++                      if (node->back_pointer ||
++                          assoc_array_ptr_is_shortcut(ptr))
++                              goto descend_to_node;
++              }
+ 
+               if (!keyring_ptr_is_keyring(ptr))
+                       continue;
+diff --git a/sound/firewire/tascam/amdtp-tascam.c 
b/sound/firewire/tascam/amdtp-tascam.c
+index 64d66a8025455f..ad185ff3209db3 100644
+--- a/sound/firewire/tascam/amdtp-tascam.c
++++ b/sound/firewire/tascam/amdtp-tascam.c
+@@ -244,7 +244,7 @@ int amdtp_tscm_init(struct amdtp_stream *s, struct fw_unit 
*unit,
+       err = amdtp_stream_init(s, unit, dir, flags, fmt,
+                       process_ctx_payloads, sizeof(struct amdtp_tscm));
+       if (err < 0)
+-              return 0;
++              return err;
+ 
+       if (dir == AMDTP_OUT_STREAM) {
+               // Use fixed value for FDF field.
+diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
+index 5833623f6ffafd..a14b9cb48f69a8 100644
+--- a/sound/pci/hda/patch_conexant.c
++++ b/sound/pci/hda/patch_conexant.c
+@@ -205,8 +205,6 @@ static void cx_auto_shutdown(struct hda_codec *codec)
+ {
+       struct conexant_spec *spec = codec->spec;
+ 
+-      snd_hda_gen_shutup_speakers(codec);
+-
+       /* Turn the problematic codec into D3 to avoid spurious noises
+          from the internal speaker during (and after) reboot */
+       cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, false);
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index d750c6e6eb9844..1b5527cb59a938 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -10015,6 +10015,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = 
{
+       SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", 
ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", 
ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", 
ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
++      SND_PCI_QUIRK(0x1558, 0x28c1, "Clevo V370VND", 
ALC2XX_FIXUP_HEADSET_MIC),
+       SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", 
ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", 
ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", 
ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+diff --git a/sound/soc/amd/yc/acp6x-mach.c b/sound/soc/amd/yc/acp6x-mach.c
+index de655f687dd7dc..c18549759eab10 100644
+--- a/sound/soc/amd/yc/acp6x-mach.c
++++ b/sound/soc/amd/yc/acp6x-mach.c
+@@ -339,6 +339,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Redmi Book Pro 15 2022"),
+               }
+       },
++      {
++              .driver_data = &acp6x_card,
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_VENDOR, "TIMI"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Xiaomi Book Pro 14 2022"),
++              }
++      },
+       {
+               .driver_data = &acp6x_card,
+               .matches = {
+diff --git a/sound/soc/stm/stm32_spdifrx.c b/sound/soc/stm/stm32_spdifrx.c
+index d399c906bb921a..e66382680e098f 100644
+--- a/sound/soc/stm/stm32_spdifrx.c
++++ b/sound/soc/stm/stm32_spdifrx.c
+@@ -943,7 +943,7 @@ static int stm32_spdifrx_remove(struct platform_device 
*pdev)
+ {
+       struct stm32_spdifrx_data *spdifrx = platform_get_drvdata(pdev);
+ 
+-      if (spdifrx->ctrl_chan)
++      if (!IS_ERR(spdifrx->ctrl_chan))
+               dma_release_channel(spdifrx->ctrl_chan);
+ 
+       if (spdifrx->dmab)
+diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
+index 49facdf35b159d..102a9b3ba3bef3 100644
+--- a/sound/usb/mixer.c
++++ b/sound/usb/mixer.c
+@@ -1205,6 +1205,7 @@ static void volume_control_quirks(struct 
usb_mixer_elem_info *cval,
+               }
+               break;
+       case USB_ID(0x1bcf, 0x2283): /* NexiGo N930AF FHD Webcam */
++      case USB_ID(0x03f0, 0x654a): /* HP 320 FHD Webcam */
+               if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
+                       usb_audio_info(chip,
+                               "set resolution quirk: cval->res = 16\n");
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 86b8c6fa9a5d1e..e96f5361e762f7 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -2014,6 +2014,8 @@ struct usb_audio_quirk_flags_table {
+ 
+ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
+       /* Device matches */
++      DEVICE_FLG(0x03f0, 0x654a, /* HP 320 FHD Webcam */
++                 QUIRK_FLAG_GET_SAMPLE_RATE),
+       DEVICE_FLG(0x041e, 0x3000, /* Creative SB Extigy */
+                  QUIRK_FLAG_IGNORE_CTL_ERROR),
+       DEVICE_FLG(0x041e, 0x4080, /* Creative Live Cam VF0610 */
+diff --git a/tools/lib/thermal/sampling.c b/tools/lib/thermal/sampling.c
+index 70577423a9f0c2..f67c1f9ea1d785 100644
+--- a/tools/lib/thermal/sampling.c
++++ b/tools/lib/thermal/sampling.c
+@@ -16,6 +16,8 @@ static int handle_thermal_sample(struct nl_msg *n, void *arg)
+       struct thermal_handler_param *thp = arg;
+       struct thermal_handler *th = thp->th;
+ 
++      arg = thp->arg;
++
+       genlmsg_parse(nlh, 0, attrs, THERMAL_GENL_ATTR_MAX, NULL);
+ 
+       switch (genlhdr->cmd) {
+diff --git a/tools/testing/selftests/arm64/signal/test_signals.c 
b/tools/testing/selftests/arm64/signal/test_signals.c
+index 416b1ff431998c..00051b40d71ead 100644
+--- a/tools/testing/selftests/arm64/signal/test_signals.c
++++ b/tools/testing/selftests/arm64/signal/test_signals.c
+@@ -12,12 +12,10 @@
+ #include "test_signals.h"
+ #include "test_signals_utils.h"
+ 
+-struct tdescr *current;
++struct tdescr *current = &tde;
+ 
+ int main(int argc, char *argv[])
+ {
+-      current = &tde;
+-
+       ksft_print_msg("%s :: %s\n", current->name, current->descr);
+       if (test_setup(current) && test_init(current)) {
+               test_run(current);


Reply via email to