diff options
author | Mike Pagano <mpagano@gentoo.org> | 2022-06-09 07:27:32 -0400 |
---|---|---|
committer | Mike Pagano <mpagano@gentoo.org> | 2022-06-09 07:27:32 -0400 |
commit | a2be423064e975ee7d2874bcd57b21c949c4954f (patch) | |
tree | 9d52edfb2cab72daa2f8c5c13091946717c0f897 | |
parent | Linux patch 5.10.120 (diff) | |
download | linux-patches-a2be423064e975ee7d2874bcd57b21c949c4954f.tar.gz linux-patches-a2be423064e975ee7d2874bcd57b21c949c4954f.tar.bz2 linux-patches-a2be423064e975ee7d2874bcd57b21c949c4954f.zip |
Linux patch 5.10.1215.10-130
Signed-off-by: Mike Pagano <mpagano@gentoo.org>
-rw-r--r-- | 0000_README | 4 | ||||
-rw-r--r-- | 1120_linux-5.10.121.patch | 16978 |
2 files changed, 16982 insertions, 0 deletions
diff --git a/0000_README b/0000_README index 773deb53..89e3b935 100644 --- a/0000_README +++ b/0000_README @@ -523,6 +523,10 @@ Patch: 1119_linux-5.10.120.patch From: http://www.kernel.org Desc: Linux 5.10.120 +Patch: 1120_linux-5.10.121.patch +From: http://www.kernel.org +Desc: Linux 5.10.121 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1120_linux-5.10.121.patch b/1120_linux-5.10.121.patch new file mode 100644 index 00000000..77711bdb --- /dev/null +++ b/1120_linux-5.10.121.patch @@ -0,0 +1,16978 @@ +diff --git a/Documentation/conf.py b/Documentation/conf.py +index ed2b43ec7754e..f47c3f1682db9 100644 +--- a/Documentation/conf.py ++++ b/Documentation/conf.py +@@ -176,7 +176,7 @@ finally: + # + # This is also used if you do content translation via gettext catalogs. + # Usually you set "language" from the command line for these cases. +-language = None ++language = 'en' + + # There are two options for replacing |today|: either, you set today to some + # non-false value, then it is used: +diff --git a/Documentation/devicetree/bindings/display/sitronix,st7735r.yaml b/Documentation/devicetree/bindings/display/sitronix,st7735r.yaml +index 0cebaaefda032..419c3b2ac5a6f 100644 +--- a/Documentation/devicetree/bindings/display/sitronix,st7735r.yaml ++++ b/Documentation/devicetree/bindings/display/sitronix,st7735r.yaml +@@ -72,6 +72,7 @@ examples: + dc-gpios = <&gpio 43 GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio 80 GPIO_ACTIVE_HIGH>; + rotation = <270>; ++ backlight = <&backlight>; + }; + }; + +diff --git a/Documentation/devicetree/bindings/gpio/gpio-altera.txt b/Documentation/devicetree/bindings/gpio/gpio-altera.txt +index 146e554b3c676..2a80e272cd666 100644 +--- a/Documentation/devicetree/bindings/gpio/gpio-altera.txt ++++ b/Documentation/devicetree/bindings/gpio/gpio-altera.txt +@@ -9,8 +9,9 @@ Required properties: + - The second cell is reserved and is currently unused. + - gpio-controller : Marks the device node as a GPIO controller. + - interrupt-controller: Mark the device node as an interrupt controller +-- #interrupt-cells : Should be 1. The interrupt type is fixed in the hardware. ++- #interrupt-cells : Should be 2. The interrupt type is fixed in the hardware. + - The first cell is the GPIO offset number within the GPIO controller. ++ - The second cell is the interrupt trigger type and level flags. + - interrupts: Specify the interrupt. + - altr,interrupt-type: Specifies the interrupt trigger type the GPIO + hardware is synthesized. This field is required if the Altera GPIO controller +@@ -38,6 +39,6 @@ gpio_altr: gpio@ff200000 { + altr,interrupt-type = <IRQ_TYPE_EDGE_RISING>; + #gpio-cells = <2>; + gpio-controller; +- #interrupt-cells = <1>; ++ #interrupt-cells = <2>; + interrupt-controller; + }; +diff --git a/Documentation/devicetree/bindings/spi/qcom,spi-qcom-qspi.yaml b/Documentation/devicetree/bindings/spi/qcom,spi-qcom-qspi.yaml +index ef5698f426b2c..392204a08e96c 100644 +--- a/Documentation/devicetree/bindings/spi/qcom,spi-qcom-qspi.yaml ++++ b/Documentation/devicetree/bindings/spi/qcom,spi-qcom-qspi.yaml +@@ -45,6 +45,7 @@ properties: + maxItems: 2 + + interconnect-names: ++ minItems: 1 + items: + - const: qspi-config + - const: qspi-memory +diff --git a/Makefile b/Makefile +index fdd2ac273f420..5233d3d9a3b52 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 10 +-SUBLEVEL = 120 ++SUBLEVEL = 121 + EXTRAVERSION = + NAME = Dare mighty things + +diff --git a/arch/arm/boot/dts/bcm2835-rpi-b.dts b/arch/arm/boot/dts/bcm2835-rpi-b.dts +index 1b63d6b19750b..25d87212cefd3 100644 +--- a/arch/arm/boot/dts/bcm2835-rpi-b.dts ++++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts +@@ -53,18 +53,17 @@ + "GPIO18", + "NC", /* GPIO19 */ + "NC", /* GPIO20 */ +- "GPIO21", ++ "CAM_GPIO0", + "GPIO22", + "GPIO23", + "GPIO24", + "GPIO25", + "NC", /* GPIO26 */ +- "CAM_GPIO0", +- /* Binary number representing build/revision */ +- "CONFIG0", +- "CONFIG1", +- "CONFIG2", +- "CONFIG3", ++ "GPIO27", ++ "GPIO28", ++ "GPIO29", ++ "GPIO30", ++ "GPIO31", + "NC", /* GPIO32 */ + "NC", /* GPIO33 */ + "NC", /* GPIO34 */ +diff --git a/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts b/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts +index 33b2b77aa47db..00582eb2c12e2 100644 +--- a/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts ++++ b/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts +@@ -74,16 +74,18 @@ + "GPIO27", + "SDA0", + "SCL0", +- "NC", /* GPIO30 */ +- "NC", /* GPIO31 */ +- "NC", /* GPIO32 */ +- "NC", /* GPIO33 */ +- "NC", /* GPIO34 */ +- "NC", /* GPIO35 */ +- "NC", /* GPIO36 */ +- "NC", /* GPIO37 */ +- "NC", /* GPIO38 */ +- "NC", /* GPIO39 */ ++ /* Used by BT module */ ++ "CTS0", ++ "RTS0", ++ "TXD0", ++ "RXD0", ++ /* Used by Wifi */ ++ "SD1_CLK", ++ "SD1_CMD", ++ "SD1_DATA0", ++ "SD1_DATA1", ++ "SD1_DATA2", ++ "SD1_DATA3", + "CAM_GPIO1", /* GPIO40 */ + "WL_ON", /* GPIO41 */ + "NC", /* GPIO42 */ +diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts +index 61010266ca9a3..90472e76a313e 100644 +--- a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts ++++ b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts +@@ -45,7 +45,7 @@ + #gpio-cells = <2>; + gpio-line-names = "BT_ON", + "WL_ON", +- "STATUS_LED_R", ++ "PWR_LED_R", + "LAN_RUN", + "", + "CAM_GPIO0", +diff --git a/arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts b/arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts +index 588d9411ceb61..3dfce4312dfc4 100644 +--- a/arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts ++++ b/arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts +@@ -63,8 +63,8 @@ + "GPIO43", + "GPIO44", + "GPIO45", +- "GPIO46", +- "GPIO47", ++ "SMPS_SCL", ++ "SMPS_SDA", + /* Used by eMMC */ + "SD_CLK_R", + "SD_CMD_R", +diff --git a/arch/arm/boot/dts/exynos5250-smdk5250.dts b/arch/arm/boot/dts/exynos5250-smdk5250.dts +index 572198b6834e6..06c4e09965035 100644 +--- a/arch/arm/boot/dts/exynos5250-smdk5250.dts ++++ b/arch/arm/boot/dts/exynos5250-smdk5250.dts +@@ -129,7 +129,7 @@ + samsung,i2c-max-bus-freq = <20000>; + + eeprom@50 { +- compatible = "samsung,s524ad0xd1"; ++ compatible = "samsung,s524ad0xd1", "atmel,24c128"; + reg = <0x50>; + }; + +@@ -289,7 +289,7 @@ + samsung,i2c-max-bus-freq = <20000>; + + eeprom@51 { +- compatible = "samsung,s524ad0xd1"; ++ compatible = "samsung,s524ad0xd1", "atmel,24c128"; + reg = <0x51>; + }; + +diff --git a/arch/arm/boot/dts/imx6dl-eckelmann-ci4x10.dts b/arch/arm/boot/dts/imx6dl-eckelmann-ci4x10.dts +index b4a9523e325b4..864dc5018451f 100644 +--- a/arch/arm/boot/dts/imx6dl-eckelmann-ci4x10.dts ++++ b/arch/arm/boot/dts/imx6dl-eckelmann-ci4x10.dts +@@ -297,7 +297,11 @@ + phy-mode = "rmii"; + phy-reset-gpios = <&gpio1 18 GPIO_ACTIVE_LOW>; + phy-handle = <&phy>; +- clocks = <&clks IMX6QDL_CLK_ENET>, <&clks IMX6QDL_CLK_ENET>, <&rmii_clk>; ++ clocks = <&clks IMX6QDL_CLK_ENET>, ++ <&clks IMX6QDL_CLK_ENET>, ++ <&rmii_clk>, ++ <&clks IMX6QDL_CLK_ENET_REF>; ++ clock-names = "ipg", "ahb", "ptp", "enet_out"; + status = "okay"; + + mdio { +diff --git a/arch/arm/boot/dts/imx6qdl-colibri.dtsi b/arch/arm/boot/dts/imx6qdl-colibri.dtsi +index 4e2a309c93fa8..1e86b38147080 100644 +--- a/arch/arm/boot/dts/imx6qdl-colibri.dtsi ++++ b/arch/arm/boot/dts/imx6qdl-colibri.dtsi +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: GPL-2.0+ OR MIT + /* +- * Copyright 2014-2020 Toradex ++ * Copyright 2014-2022 Toradex + * Copyright 2012 Freescale Semiconductor, Inc. + * Copyright 2011 Linaro Ltd. + */ +@@ -132,7 +132,7 @@ + clock-frequency = <100000>; + pinctrl-names = "default", "gpio"; + pinctrl-0 = <&pinctrl_i2c2>; +- pinctrl-0 = <&pinctrl_i2c2_gpio>; ++ pinctrl-1 = <&pinctrl_i2c2_gpio>; + scl-gpios = <&gpio2 30 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; + sda-gpios = <&gpio3 16 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; + status = "okay"; +@@ -488,7 +488,7 @@ + >; + }; + +- pinctrl_i2c2_gpio: i2c2grp { ++ pinctrl_i2c2_gpio: i2c2gpiogrp { + fsl,pins = < + MX6QDL_PAD_EIM_EB2__GPIO2_IO30 0x4001b8b1 + MX6QDL_PAD_EIM_D16__GPIO3_IO16 0x4001b8b1 +diff --git a/arch/arm/boot/dts/ox820.dtsi b/arch/arm/boot/dts/ox820.dtsi +index 90846a7655b49..dde4364892bf0 100644 +--- a/arch/arm/boot/dts/ox820.dtsi ++++ b/arch/arm/boot/dts/ox820.dtsi +@@ -287,7 +287,7 @@ + clocks = <&armclk>; + }; + +- gic: gic@1000 { ++ gic: interrupt-controller@1000 { + compatible = "arm,arm11mp-gic"; + interrupt-controller; + #interrupt-cells = <3>; +diff --git a/arch/arm/boot/dts/s5pv210-aries.dtsi b/arch/arm/boot/dts/s5pv210-aries.dtsi +index 986fa0b1a8774..9005f0a23e8f2 100644 +--- a/arch/arm/boot/dts/s5pv210-aries.dtsi ++++ b/arch/arm/boot/dts/s5pv210-aries.dtsi +@@ -564,7 +564,6 @@ + reset-gpios = <&mp05 5 GPIO_ACTIVE_LOW>; + vdd3-supply = <&ldo7_reg>; + vci-supply = <&ldo17_reg>; +- spi-cs-high; + spi-max-frequency = <1200000>; + + pinctrl-names = "default"; +@@ -637,7 +636,7 @@ + }; + + &i2s0 { +- dmas = <&pdma0 9>, <&pdma0 10>, <&pdma0 11>; ++ dmas = <&pdma0 10>, <&pdma0 9>, <&pdma0 11>; + status = "okay"; + }; + +diff --git a/arch/arm/boot/dts/s5pv210.dtsi b/arch/arm/boot/dts/s5pv210.dtsi +index 2871351ab9074..eb7e3660ada79 100644 +--- a/arch/arm/boot/dts/s5pv210.dtsi ++++ b/arch/arm/boot/dts/s5pv210.dtsi +@@ -240,8 +240,8 @@ + reg = <0xeee30000 0x1000>; + interrupt-parent = <&vic2>; + interrupts = <16>; +- dma-names = "rx", "tx", "tx-sec"; +- dmas = <&pdma1 9>, <&pdma1 10>, <&pdma1 11>; ++ dma-names = "tx", "rx", "tx-sec"; ++ dmas = <&pdma1 10>, <&pdma1 9>, <&pdma1 11>; + clock-names = "iis", + "i2s_opclk0", + "i2s_opclk1"; +@@ -260,8 +260,8 @@ + reg = <0xe2100000 0x1000>; + interrupt-parent = <&vic2>; + interrupts = <17>; +- dma-names = "rx", "tx"; +- dmas = <&pdma1 12>, <&pdma1 13>; ++ dma-names = "tx", "rx"; ++ dmas = <&pdma1 13>, <&pdma1 12>; + clock-names = "iis", "i2s_opclk0"; + clocks = <&clocks CLK_I2S1>, <&clocks SCLK_AUDIO1>; + pinctrl-names = "default"; +@@ -275,8 +275,8 @@ + reg = <0xe2a00000 0x1000>; + interrupt-parent = <&vic2>; + interrupts = <18>; +- dma-names = "rx", "tx"; +- dmas = <&pdma1 14>, <&pdma1 15>; ++ dma-names = "tx", "rx"; ++ dmas = <&pdma1 15>, <&pdma1 14>; + clock-names = "iis", "i2s_opclk0"; + clocks = <&clocks CLK_I2S2>, <&clocks SCLK_AUDIO2>; + pinctrl-names = "default"; +diff --git a/arch/arm/boot/dts/stm32mp15xx-dhcor-avenger96.dtsi b/arch/arm/boot/dts/stm32mp15xx-dhcor-avenger96.dtsi +index 944d38b85eef4..f3e0c790a4b19 100644 +--- a/arch/arm/boot/dts/stm32mp15xx-dhcor-avenger96.dtsi ++++ b/arch/arm/boot/dts/stm32mp15xx-dhcor-avenger96.dtsi +@@ -141,6 +141,7 @@ + compatible = "snps,dwmac-mdio"; + reset-gpios = <&gpioz 2 GPIO_ACTIVE_LOW>; + reset-delay-us = <1000>; ++ reset-post-delay-us = <1000>; + + phy0: ethernet-phy@7 { + reg = <7>; +diff --git a/arch/arm/boot/dts/suniv-f1c100s.dtsi b/arch/arm/boot/dts/suniv-f1c100s.dtsi +index 6100d3b75f613..def8301014487 100644 +--- a/arch/arm/boot/dts/suniv-f1c100s.dtsi ++++ b/arch/arm/boot/dts/suniv-f1c100s.dtsi +@@ -104,8 +104,10 @@ + + wdt: watchdog@1c20ca0 { + compatible = "allwinner,suniv-f1c100s-wdt", +- "allwinner,sun4i-a10-wdt"; ++ "allwinner,sun6i-a31-wdt"; + reg = <0x01c20ca0 0x20>; ++ interrupts = <16>; ++ clocks = <&osc32k>; + }; + + uart0: serial@1c25000 { +diff --git a/arch/arm/mach-hisi/platsmp.c b/arch/arm/mach-hisi/platsmp.c +index da7a09c1dae56..1cd1d9b0aabf9 100644 +--- a/arch/arm/mach-hisi/platsmp.c ++++ b/arch/arm/mach-hisi/platsmp.c +@@ -67,14 +67,17 @@ static void __init hi3xxx_smp_prepare_cpus(unsigned int max_cpus) + } + ctrl_base = of_iomap(np, 0); + if (!ctrl_base) { ++ of_node_put(np); + pr_err("failed to map address\n"); + return; + } + if (of_property_read_u32(np, "smp-offset", &offset) < 0) { ++ of_node_put(np); + pr_err("failed to find smp-offset property\n"); + return; + } + ctrl_base += offset; ++ of_node_put(np); + } + } + +@@ -160,6 +163,7 @@ static int hip01_boot_secondary(unsigned int cpu, struct task_struct *idle) + if (WARN_ON(!node)) + return -1; + ctrl_base = of_iomap(node, 0); ++ of_node_put(node); + + /* set the secondary core boot from DDR */ + remap_reg_value = readl_relaxed(ctrl_base + REG_SC_CTRL); +diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig +index 9e0f592d87d8e..35a3430c7942d 100644 +--- a/arch/arm/mach-mediatek/Kconfig ++++ b/arch/arm/mach-mediatek/Kconfig +@@ -30,6 +30,7 @@ config MACH_MT7623 + config MACH_MT7629 + bool "MediaTek MT7629 SoCs support" + default ARCH_MEDIATEK ++ select HAVE_ARM_ARCH_TIMER + + config MACH_MT8127 + bool "MediaTek MT8127 SoCs support" +diff --git a/arch/arm/mach-omap1/clock.c b/arch/arm/mach-omap1/clock.c +index bd5be82101f32..d89bda12bf3cd 100644 +--- a/arch/arm/mach-omap1/clock.c ++++ b/arch/arm/mach-omap1/clock.c +@@ -41,7 +41,7 @@ static DEFINE_SPINLOCK(clockfw_lock); + unsigned long omap1_uart_recalc(struct clk *clk) + { + unsigned int val = __raw_readl(clk->enable_reg); +- return val & clk->enable_bit ? 48000000 : 12000000; ++ return val & 1 << clk->enable_bit ? 48000000 : 12000000; + } + + unsigned long omap1_sossi_recalc(struct clk *clk) +diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c +index 2e35354b61f56..167e871f059ef 100644 +--- a/arch/arm/mach-pxa/cm-x300.c ++++ b/arch/arm/mach-pxa/cm-x300.c +@@ -354,13 +354,13 @@ static struct platform_device cm_x300_spi_gpio = { + static struct gpiod_lookup_table cm_x300_spi_gpiod_table = { + .dev_id = "spi_gpio", + .table = { +- GPIO_LOOKUP("gpio-pxa", GPIO_LCD_SCL, ++ GPIO_LOOKUP("pca9555.1", GPIO_LCD_SCL - GPIO_LCD_BASE, + "sck", GPIO_ACTIVE_HIGH), +- GPIO_LOOKUP("gpio-pxa", GPIO_LCD_DIN, ++ GPIO_LOOKUP("pca9555.1", GPIO_LCD_DIN - GPIO_LCD_BASE, + "mosi", GPIO_ACTIVE_HIGH), +- GPIO_LOOKUP("gpio-pxa", GPIO_LCD_DOUT, ++ GPIO_LOOKUP("pca9555.1", GPIO_LCD_DOUT - GPIO_LCD_BASE, + "miso", GPIO_ACTIVE_HIGH), +- GPIO_LOOKUP("gpio-pxa", GPIO_LCD_CS, ++ GPIO_LOOKUP("pca9555.1", GPIO_LCD_CS - GPIO_LCD_BASE, + "cs", GPIO_ACTIVE_HIGH), + { }, + }, +diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c +index cd9fa465b9b2a..9aee8e0f2bb1d 100644 +--- a/arch/arm/mach-pxa/magician.c ++++ b/arch/arm/mach-pxa/magician.c +@@ -681,7 +681,7 @@ static struct platform_device bq24022 = { + static struct gpiod_lookup_table bq24022_gpiod_table = { + .dev_id = "gpio-regulator", + .table = { +- GPIO_LOOKUP("gpio-pxa", EGPIO_MAGICIAN_BQ24022_ISET2, ++ GPIO_LOOKUP("htc-egpio-0", EGPIO_MAGICIAN_BQ24022_ISET2 - MAGICIAN_EGPIO_BASE, + NULL, GPIO_ACTIVE_HIGH), + GPIO_LOOKUP("gpio-pxa", GPIO30_MAGICIAN_BQ24022_nCHARGE_EN, + "enable", GPIO_ACTIVE_LOW), +diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c +index 431709725d02b..ded5e343e1984 100644 +--- a/arch/arm/mach-pxa/tosa.c ++++ b/arch/arm/mach-pxa/tosa.c +@@ -296,9 +296,9 @@ static struct gpiod_lookup_table tosa_mci_gpio_table = { + .table = { + GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_nSD_DETECT, + "cd", GPIO_ACTIVE_LOW), +- GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_SD_WP, ++ GPIO_LOOKUP("sharp-scoop.0", TOSA_GPIO_SD_WP - TOSA_SCOOP_GPIO_BASE, + "wp", GPIO_ACTIVE_LOW), +- GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_PWR_ON, ++ GPIO_LOOKUP("sharp-scoop.0", TOSA_GPIO_PWR_ON - TOSA_SCOOP_GPIO_BASE, + "power", GPIO_ACTIVE_HIGH), + { }, + }, +diff --git a/arch/arm/mach-vexpress/dcscb.c b/arch/arm/mach-vexpress/dcscb.c +index a0554d7d04f7c..e1adc098f89ac 100644 +--- a/arch/arm/mach-vexpress/dcscb.c ++++ b/arch/arm/mach-vexpress/dcscb.c +@@ -144,6 +144,7 @@ static int __init dcscb_init(void) + if (!node) + return -ENODEV; + dcscb_base = of_iomap(node, 0); ++ of_node_put(node); + if (!dcscb_base) + return -EADDRNOTAVAIL; + cfg = readl_relaxed(dcscb_base + DCS_CFG_R); +diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms +index 5c4ac1c9f4e02..889e78f40a25a 100644 +--- a/arch/arm64/Kconfig.platforms ++++ b/arch/arm64/Kconfig.platforms +@@ -250,6 +250,7 @@ config ARCH_STRATIX10 + + config ARCH_SYNQUACER + bool "Socionext SynQuacer SoC Family" ++ select IRQ_FASTEOI_HIERARCHY_HANDLERS + + config ARCH_TEGRA + bool "NVIDIA Tegra SoC Family" +diff --git a/arch/arm64/boot/dts/qcom/ipq8074.dtsi b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +index 776a6b0f61a62..dca040f66f5f3 100644 +--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +@@ -13,7 +13,7 @@ + clocks { + sleep_clk: sleep_clk { + compatible = "fixed-clock"; +- clock-frequency = <32000>; ++ clock-frequency = <32768>; + #clock-cells = <0>; + }; + +diff --git a/arch/arm64/boot/dts/qcom/msm8994.dtsi b/arch/arm64/boot/dts/qcom/msm8994.dtsi +index 45f9a44326a6d..297408b947ffb 100644 +--- a/arch/arm64/boot/dts/qcom/msm8994.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8994.dtsi +@@ -316,7 +316,7 @@ + #dma-cells = <1>; + qcom,ee = <0>; + qcom,controlled-remotely; +- num-channels = <18>; ++ num-channels = <24>; + qcom,num-ees = <4>; + }; + +@@ -412,7 +412,7 @@ + #dma-cells = <1>; + qcom,ee = <0>; + qcom,controlled-remotely; +- num-channels = <18>; ++ num-channels = <24>; + qcom,num-ees = <4>; + }; + +diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi +index 52ba4d07e7712..c5f3d4f8f4d21 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi +@@ -1471,6 +1471,7 @@ + reg = <0xf780 0x24>; + clocks = <&sdhci>; + clock-names = "emmcclk"; ++ drive-impedance-ohm = <50>; + #phy-cells = <0>; + status = "disabled"; + }; +@@ -1481,7 +1482,6 @@ + clock-names = "refclk"; + #phy-cells = <1>; + resets = <&cru SRST_PCIEPHY>; +- drive-impedance-ohm = <50>; + reset-names = "phy"; + status = "disabled"; + }; +diff --git a/arch/arm64/kernel/sys_compat.c b/arch/arm64/kernel/sys_compat.c +index 3c18c2454089b..51274bab25653 100644 +--- a/arch/arm64/kernel/sys_compat.c ++++ b/arch/arm64/kernel/sys_compat.c +@@ -115,6 +115,6 @@ long compat_arm_syscall(struct pt_regs *regs, int scno) + (compat_thumb_mode(regs) ? 2 : 4); + + arm64_notify_die("Oops - bad compat syscall(2)", regs, +- SIGILL, ILL_ILLTRP, addr, scno); ++ SIGILL, ILL_ILLTRP, addr, 0); + return 0; + } +diff --git a/arch/arm64/mm/copypage.c b/arch/arm64/mm/copypage.c +index 70a71f38b6a9e..24913271e898c 100644 +--- a/arch/arm64/mm/copypage.c ++++ b/arch/arm64/mm/copypage.c +@@ -16,8 +16,8 @@ + + void copy_highpage(struct page *to, struct page *from) + { +- struct page *kto = page_address(to); +- struct page *kfrom = page_address(from); ++ void *kto = page_address(to); ++ void *kfrom = page_address(from); + + copy_page(kto, kfrom); + +diff --git a/arch/csky/kernel/probes/kprobes.c b/arch/csky/kernel/probes/kprobes.c +index 589f090f48b99..556b9ba61ec06 100644 +--- a/arch/csky/kernel/probes/kprobes.c ++++ b/arch/csky/kernel/probes/kprobes.c +@@ -28,7 +28,7 @@ static int __kprobes patch_text_cb(void *priv) + struct csky_insn_patch *param = priv; + unsigned int addr = (unsigned int)param->addr; + +- if (atomic_inc_return(¶m->cpu_count) == 1) { ++ if (atomic_inc_return(¶m->cpu_count) == num_online_cpus()) { + *(u16 *) addr = cpu_to_le16(param->opcode); + dcache_wb_range(addr, addr + 2); + atomic_inc(¶m->cpu_count); +diff --git a/arch/m68k/Kconfig.cpu b/arch/m68k/Kconfig.cpu +index c17205da47fe3..936cd9619bf01 100644 +--- a/arch/m68k/Kconfig.cpu ++++ b/arch/m68k/Kconfig.cpu +@@ -312,7 +312,7 @@ comment "Processor Specific Options" + + config M68KFPU_EMU + bool "Math emulation support" +- depends on MMU ++ depends on M68KCLASSIC && FPU + help + At some point in the future, this will cause floating-point math + instructions to be emulated by the kernel on machines that lack a +diff --git a/arch/m68k/include/asm/raw_io.h b/arch/m68k/include/asm/raw_io.h +index 80eb2396d01eb..3ba40bc1dfaa9 100644 +--- a/arch/m68k/include/asm/raw_io.h ++++ b/arch/m68k/include/asm/raw_io.h +@@ -80,14 +80,14 @@ + ({ u16 __v = le16_to_cpu(*(__force volatile u16 *) (addr)); __v; }) + + #define rom_out_8(addr, b) \ +- ({u8 __maybe_unused __w, __v = (b); u32 _addr = ((u32) (addr)); \ ++ (void)({u8 __maybe_unused __w, __v = (b); u32 _addr = ((u32) (addr)); \ + __w = ((*(__force volatile u8 *) ((_addr | 0x10000) + (__v<<1)))); }) + #define rom_out_be16(addr, w) \ +- ({u16 __maybe_unused __w, __v = (w); u32 _addr = ((u32) (addr)); \ ++ (void)({u16 __maybe_unused __w, __v = (w); u32 _addr = ((u32) (addr)); \ + __w = ((*(__force volatile u16 *) ((_addr & 0xFFFF0000UL) + ((__v & 0xFF)<<1)))); \ + __w = ((*(__force volatile u16 *) ((_addr | 0x10000) + ((__v >> 8)<<1)))); }) + #define rom_out_le16(addr, w) \ +- ({u16 __maybe_unused __w, __v = (w); u32 _addr = ((u32) (addr)); \ ++ (void)({u16 __maybe_unused __w, __v = (w); u32 _addr = ((u32) (addr)); \ + __w = ((*(__force volatile u16 *) ((_addr & 0xFFFF0000UL) + ((__v >> 8)<<1)))); \ + __w = ((*(__force volatile u16 *) ((_addr | 0x10000) + ((__v & 0xFF)<<1)))); }) + +diff --git a/arch/mips/include/asm/mach-ip27/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ip27/cpu-feature-overrides.h +index 58f829c9b6c70..79d6fd249583f 100644 +--- a/arch/mips/include/asm/mach-ip27/cpu-feature-overrides.h ++++ b/arch/mips/include/asm/mach-ip27/cpu-feature-overrides.h +@@ -26,7 +26,6 @@ + #define cpu_has_3k_cache 0 + #define cpu_has_4k_cache 1 + #define cpu_has_tx39_cache 0 +-#define cpu_has_fpu 1 + #define cpu_has_nofpuex 0 + #define cpu_has_32fpr 1 + #define cpu_has_counter 1 +diff --git a/arch/mips/include/asm/mach-ip30/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ip30/cpu-feature-overrides.h +index 49a93e82c2528..2635b6ba1cb54 100644 +--- a/arch/mips/include/asm/mach-ip30/cpu-feature-overrides.h ++++ b/arch/mips/include/asm/mach-ip30/cpu-feature-overrides.h +@@ -29,7 +29,6 @@ + #define cpu_has_3k_cache 0 + #define cpu_has_4k_cache 1 + #define cpu_has_tx39_cache 0 +-#define cpu_has_fpu 1 + #define cpu_has_nofpuex 0 + #define cpu_has_32fpr 1 + #define cpu_has_counter 1 +diff --git a/arch/openrisc/include/asm/timex.h b/arch/openrisc/include/asm/timex.h +index d52b4e536e3f9..5487fa93dd9be 100644 +--- a/arch/openrisc/include/asm/timex.h ++++ b/arch/openrisc/include/asm/timex.h +@@ -23,6 +23,7 @@ static inline cycles_t get_cycles(void) + { + return mfspr(SPR_TTCR); + } ++#define get_cycles get_cycles + + /* This isn't really used any more */ + #define CLOCK_TICK_RATE 1000 +diff --git a/arch/openrisc/kernel/head.S b/arch/openrisc/kernel/head.S +index af355e3f4619a..459b0a1e4eb23 100644 +--- a/arch/openrisc/kernel/head.S ++++ b/arch/openrisc/kernel/head.S +@@ -521,6 +521,15 @@ _start: + l.ori r3,r0,0x1 + l.mtspr r0,r3,SPR_SR + ++ /* ++ * Start the TTCR as early as possible, so that the RNG can make use of ++ * measurements of boot time from the earliest opportunity. Especially ++ * important is that the TTCR does not return zero by the time we reach ++ * rand_initialize(). ++ */ ++ l.movhi r3,hi(SPR_TTMR_CR) ++ l.mtspr r0,r3,SPR_TTMR ++ + CLEAR_GPR(r1) + CLEAR_GPR(r2) + CLEAR_GPR(r3) +diff --git a/arch/parisc/include/asm/fb.h b/arch/parisc/include/asm/fb.h +index c4cd6360f9964..d63a2acb91f2b 100644 +--- a/arch/parisc/include/asm/fb.h ++++ b/arch/parisc/include/asm/fb.h +@@ -12,9 +12,13 @@ static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, + pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE; + } + ++#if defined(CONFIG_STI_CONSOLE) || defined(CONFIG_FB_STI) ++int fb_is_primary_device(struct fb_info *info); ++#else + static inline int fb_is_primary_device(struct fb_info *info) + { + return 0; + } ++#endif + + #endif /* _ASM_FB_H_ */ +diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h +index f2c5c26869f1a..03ae544eb6cc4 100644 +--- a/arch/powerpc/include/asm/page.h ++++ b/arch/powerpc/include/asm/page.h +@@ -216,6 +216,9 @@ static inline bool pfn_valid(unsigned long pfn) + #define __pa(x) ((phys_addr_t)(unsigned long)(x) - VIRT_PHYS_OFFSET) + #else + #ifdef CONFIG_PPC64 ++ ++#define VIRTUAL_WARN_ON(x) WARN_ON(IS_ENABLED(CONFIG_DEBUG_VIRTUAL) && (x)) ++ + /* + * gcc miscompiles (unsigned long)(&static_var) - PAGE_OFFSET + * with -mcmodel=medium, so we use & and | instead of - and + on 64-bit. +@@ -223,13 +226,13 @@ static inline bool pfn_valid(unsigned long pfn) + */ + #define __va(x) \ + ({ \ +- VIRTUAL_BUG_ON((unsigned long)(x) >= PAGE_OFFSET); \ ++ VIRTUAL_WARN_ON((unsigned long)(x) >= PAGE_OFFSET); \ + (void *)(unsigned long)((phys_addr_t)(x) | PAGE_OFFSET); \ + }) + + #define __pa(x) \ + ({ \ +- VIRTUAL_BUG_ON((unsigned long)(x) < PAGE_OFFSET); \ ++ VIRTUAL_WARN_ON((unsigned long)(x) < PAGE_OFFSET); \ + (unsigned long)(x) & 0x0fffffffffffffffUL; \ + }) + +diff --git a/arch/powerpc/include/asm/vas.h b/arch/powerpc/include/asm/vas.h +index e33f80b0ea819..47062b4570490 100644 +--- a/arch/powerpc/include/asm/vas.h ++++ b/arch/powerpc/include/asm/vas.h +@@ -52,7 +52,7 @@ enum vas_cop_type { + * Receive window attributes specified by the (in-kernel) owner of window. + */ + struct vas_rx_win_attr { +- void *rx_fifo; ++ u64 rx_fifo; + int rx_fifo_size; + int wcreds_max; + +diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c +index c3bb800dc4352..1a5ba26aab156 100644 +--- a/arch/powerpc/kernel/fadump.c ++++ b/arch/powerpc/kernel/fadump.c +@@ -861,7 +861,6 @@ static int fadump_alloc_mem_ranges(struct fadump_mrange_info *mrange_info) + sizeof(struct fadump_memory_range)); + return 0; + } +- + static inline int fadump_add_mem_range(struct fadump_mrange_info *mrange_info, + u64 base, u64 end) + { +@@ -880,7 +879,12 @@ static inline int fadump_add_mem_range(struct fadump_mrange_info *mrange_info, + start = mem_ranges[mrange_info->mem_range_cnt - 1].base; + size = mem_ranges[mrange_info->mem_range_cnt - 1].size; + +- if ((start + size) == base) ++ /* ++ * Boot memory area needs separate PT_LOAD segment(s) as it ++ * is moved to a different location at the time of crash. ++ * So, fold only if the region is not boot memory area. ++ */ ++ if ((start + size) == base && start >= fw_dump.boot_mem_top) + is_adjacent = true; + } + if (!is_adjacent) { +diff --git a/arch/powerpc/kernel/idle.c b/arch/powerpc/kernel/idle.c +index 1f835539fda42..f0271daa8f6a6 100644 +--- a/arch/powerpc/kernel/idle.c ++++ b/arch/powerpc/kernel/idle.c +@@ -37,7 +37,7 @@ static int __init powersave_off(char *arg) + { + ppc_md.power_save = NULL; + cpuidle_disable = IDLE_POWERSAVE_OFF; +- return 0; ++ return 1; + } + __setup("powersave=off", powersave_off); + +diff --git a/arch/powerpc/perf/isa207-common.c b/arch/powerpc/perf/isa207-common.c +index 58448f0e47213..52990becbdfc7 100644 +--- a/arch/powerpc/perf/isa207-common.c ++++ b/arch/powerpc/perf/isa207-common.c +@@ -363,7 +363,8 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) + if (event_is_threshold(event) && is_thresh_cmp_valid(event)) { + mask |= CNST_THRESH_MASK; + value |= CNST_THRESH_VAL(event >> EVENT_THRESH_SHIFT); +- } ++ } else if (event_is_threshold(event)) ++ return -1; + } else { + /* + * Special case for PM_MRK_FAB_RSP_MATCH and PM_MRK_FAB_RSP_MATCH_CYC, +diff --git a/arch/powerpc/platforms/4xx/cpm.c b/arch/powerpc/platforms/4xx/cpm.c +index ae8b812c92029..2481e78c04234 100644 +--- a/arch/powerpc/platforms/4xx/cpm.c ++++ b/arch/powerpc/platforms/4xx/cpm.c +@@ -327,6 +327,6 @@ late_initcall(cpm_init); + static int __init cpm_powersave_off(char *arg) + { + cpm.powersave_off = 1; +- return 0; ++ return 1; + } + __setup("powersave=off", cpm_powersave_off); +diff --git a/arch/powerpc/platforms/8xx/cpm1.c b/arch/powerpc/platforms/8xx/cpm1.c +index c58b6f1c40e35..3ef5e9fd3a9b6 100644 +--- a/arch/powerpc/platforms/8xx/cpm1.c ++++ b/arch/powerpc/platforms/8xx/cpm1.c +@@ -280,6 +280,7 @@ cpm_setbrg(uint brg, uint rate) + out_be32(bp, (((BRG_UART_CLK_DIV16 / rate) - 1) << 1) | + CPM_BRG_EN | CPM_BRG_DIV16); + } ++EXPORT_SYMBOL(cpm_setbrg); + + struct cpm_ioport16 { + __be16 dir, par, odr_sor, dat, intr; +diff --git a/arch/powerpc/platforms/powernv/opal-fadump.c b/arch/powerpc/platforms/powernv/opal-fadump.c +index 9a360ced663b0..e23a51a05f99a 100644 +--- a/arch/powerpc/platforms/powernv/opal-fadump.c ++++ b/arch/powerpc/platforms/powernv/opal-fadump.c +@@ -60,7 +60,7 @@ void __init opal_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node) + addr = be64_to_cpu(addr); + pr_debug("Kernel metadata addr: %llx\n", addr); + opal_fdm_active = (void *)addr; +- if (opal_fdm_active->registered_regions == 0) ++ if (be16_to_cpu(opal_fdm_active->registered_regions) == 0) + return; + + ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_BOOT_MEM, &addr); +@@ -95,17 +95,17 @@ static int opal_fadump_unregister(struct fw_dump *fadump_conf); + static void opal_fadump_update_config(struct fw_dump *fadump_conf, + const struct opal_fadump_mem_struct *fdm) + { +- pr_debug("Boot memory regions count: %d\n", fdm->region_cnt); ++ pr_debug("Boot memory regions count: %d\n", be16_to_cpu(fdm->region_cnt)); + + /* + * The destination address of the first boot memory region is the + * destination address of boot memory regions. + */ +- fadump_conf->boot_mem_dest_addr = fdm->rgn[0].dest; ++ fadump_conf->boot_mem_dest_addr = be64_to_cpu(fdm->rgn[0].dest); + pr_debug("Destination address of boot memory regions: %#016llx\n", + fadump_conf->boot_mem_dest_addr); + +- fadump_conf->fadumphdr_addr = fdm->fadumphdr_addr; ++ fadump_conf->fadumphdr_addr = be64_to_cpu(fdm->fadumphdr_addr); + } + + /* +@@ -126,9 +126,9 @@ static void opal_fadump_get_config(struct fw_dump *fadump_conf, + fadump_conf->boot_memory_size = 0; + + pr_debug("Boot memory regions:\n"); +- for (i = 0; i < fdm->region_cnt; i++) { +- base = fdm->rgn[i].src; +- size = fdm->rgn[i].size; ++ for (i = 0; i < be16_to_cpu(fdm->region_cnt); i++) { ++ base = be64_to_cpu(fdm->rgn[i].src); ++ size = be64_to_cpu(fdm->rgn[i].size); + pr_debug("\t[%03d] base: 0x%lx, size: 0x%lx\n", i, base, size); + + fadump_conf->boot_mem_addr[i] = base; +@@ -143,7 +143,7 @@ static void opal_fadump_get_config(struct fw_dump *fadump_conf, + * Start address of reserve dump area (permanent reservation) for + * re-registering FADump after dump capture. + */ +- fadump_conf->reserve_dump_area_start = fdm->rgn[0].dest; ++ fadump_conf->reserve_dump_area_start = be64_to_cpu(fdm->rgn[0].dest); + + /* + * Rarely, but it can so happen that system crashes before all +@@ -155,13 +155,14 @@ static void opal_fadump_get_config(struct fw_dump *fadump_conf, + * Hope the memory that could not be preserved only has pages + * that are usually filtered out while saving the vmcore. + */ +- if (fdm->region_cnt > fdm->registered_regions) { ++ if (be16_to_cpu(fdm->region_cnt) > be16_to_cpu(fdm->registered_regions)) { + pr_warn("Not all memory regions were saved!!!\n"); + pr_warn(" Unsaved memory regions:\n"); +- i = fdm->registered_regions; +- while (i < fdm->region_cnt) { ++ i = be16_to_cpu(fdm->registered_regions); ++ while (i < be16_to_cpu(fdm->region_cnt)) { + pr_warn("\t[%03d] base: 0x%llx, size: 0x%llx\n", +- i, fdm->rgn[i].src, fdm->rgn[i].size); ++ i, be64_to_cpu(fdm->rgn[i].src), ++ be64_to_cpu(fdm->rgn[i].size)); + i++; + } + +@@ -170,7 +171,7 @@ static void opal_fadump_get_config(struct fw_dump *fadump_conf, + } + + fadump_conf->boot_mem_top = (fadump_conf->boot_memory_size + hole_size); +- fadump_conf->boot_mem_regs_cnt = fdm->region_cnt; ++ fadump_conf->boot_mem_regs_cnt = be16_to_cpu(fdm->region_cnt); + opal_fadump_update_config(fadump_conf, fdm); + } + +@@ -178,35 +179,38 @@ static void opal_fadump_get_config(struct fw_dump *fadump_conf, + static void opal_fadump_init_metadata(struct opal_fadump_mem_struct *fdm) + { + fdm->version = OPAL_FADUMP_VERSION; +- fdm->region_cnt = 0; +- fdm->registered_regions = 0; +- fdm->fadumphdr_addr = 0; ++ fdm->region_cnt = cpu_to_be16(0); ++ fdm->registered_regions = cpu_to_be16(0); ++ fdm->fadumphdr_addr = cpu_to_be64(0); + } + + static u64 opal_fadump_init_mem_struct(struct fw_dump *fadump_conf) + { + u64 addr = fadump_conf->reserve_dump_area_start; ++ u16 reg_cnt; + int i; + + opal_fdm = __va(fadump_conf->kernel_metadata); + opal_fadump_init_metadata(opal_fdm); + + /* Boot memory regions */ ++ reg_cnt = be16_to_cpu(opal_fdm->region_cnt); + for (i = 0; i < fadump_conf->boot_mem_regs_cnt; i++) { +- opal_fdm->rgn[i].src = fadump_conf->boot_mem_addr[i]; +- opal_fdm->rgn[i].dest = addr; +- opal_fdm->rgn[i].size = fadump_conf->boot_mem_sz[i]; ++ opal_fdm->rgn[i].src = cpu_to_be64(fadump_conf->boot_mem_addr[i]); ++ opal_fdm->rgn[i].dest = cpu_to_be64(addr); ++ opal_fdm->rgn[i].size = cpu_to_be64(fadump_conf->boot_mem_sz[i]); + +- opal_fdm->region_cnt++; ++ reg_cnt++; + addr += fadump_conf->boot_mem_sz[i]; + } ++ opal_fdm->region_cnt = cpu_to_be16(reg_cnt); + + /* + * Kernel metadata is passed to f/w and retrieved in capture kerenl. + * So, use it to save fadump header address instead of calculating it. + */ +- opal_fdm->fadumphdr_addr = (opal_fdm->rgn[0].dest + +- fadump_conf->boot_memory_size); ++ opal_fdm->fadumphdr_addr = cpu_to_be64(be64_to_cpu(opal_fdm->rgn[0].dest) + ++ fadump_conf->boot_memory_size); + + opal_fadump_update_config(fadump_conf, opal_fdm); + +@@ -269,18 +273,21 @@ static u64 opal_fadump_get_bootmem_min(void) + static int opal_fadump_register(struct fw_dump *fadump_conf) + { + s64 rc = OPAL_PARAMETER; ++ u16 registered_regs; + int i, err = -EIO; + +- for (i = 0; i < opal_fdm->region_cnt; i++) { ++ registered_regs = be16_to_cpu(opal_fdm->registered_regions); ++ for (i = 0; i < be16_to_cpu(opal_fdm->region_cnt); i++) { + rc = opal_mpipl_update(OPAL_MPIPL_ADD_RANGE, +- opal_fdm->rgn[i].src, +- opal_fdm->rgn[i].dest, +- opal_fdm->rgn[i].size); ++ be64_to_cpu(opal_fdm->rgn[i].src), ++ be64_to_cpu(opal_fdm->rgn[i].dest), ++ be64_to_cpu(opal_fdm->rgn[i].size)); + if (rc != OPAL_SUCCESS) + break; + +- opal_fdm->registered_regions++; ++ registered_regs++; + } ++ opal_fdm->registered_regions = cpu_to_be16(registered_regs); + + switch (rc) { + case OPAL_SUCCESS: +@@ -291,7 +298,8 @@ static int opal_fadump_register(struct fw_dump *fadump_conf) + case OPAL_RESOURCE: + /* If MAX regions limit in f/w is hit, warn and proceed. */ + pr_warn("%d regions could not be registered for MPIPL as MAX limit is reached!\n", +- (opal_fdm->region_cnt - opal_fdm->registered_regions)); ++ (be16_to_cpu(opal_fdm->region_cnt) - ++ be16_to_cpu(opal_fdm->registered_regions))); + fadump_conf->dump_registered = 1; + err = 0; + break; +@@ -312,7 +320,7 @@ static int opal_fadump_register(struct fw_dump *fadump_conf) + * If some regions were registered before OPAL_MPIPL_ADD_RANGE + * OPAL call failed, unregister all regions. + */ +- if ((err < 0) && (opal_fdm->registered_regions > 0)) ++ if ((err < 0) && (be16_to_cpu(opal_fdm->registered_regions) > 0)) + opal_fadump_unregister(fadump_conf); + + return err; +@@ -328,7 +336,7 @@ static int opal_fadump_unregister(struct fw_dump *fadump_conf) + return -EIO; + } + +- opal_fdm->registered_regions = 0; ++ opal_fdm->registered_regions = cpu_to_be16(0); + fadump_conf->dump_registered = 0; + return 0; + } +@@ -563,19 +571,20 @@ static void opal_fadump_region_show(struct fw_dump *fadump_conf, + else + fdm_ptr = opal_fdm; + +- for (i = 0; i < fdm_ptr->region_cnt; i++) { ++ for (i = 0; i < be16_to_cpu(fdm_ptr->region_cnt); i++) { + /* + * Only regions that are registered for MPIPL + * would have dump data. + */ + if ((fadump_conf->dump_active) && +- (i < fdm_ptr->registered_regions)) +- dumped_bytes = fdm_ptr->rgn[i].size; ++ (i < be16_to_cpu(fdm_ptr->registered_regions))) ++ dumped_bytes = be64_to_cpu(fdm_ptr->rgn[i].size); + + seq_printf(m, "DUMP: Src: %#016llx, Dest: %#016llx, ", +- fdm_ptr->rgn[i].src, fdm_ptr->rgn[i].dest); ++ be64_to_cpu(fdm_ptr->rgn[i].src), ++ be64_to_cpu(fdm_ptr->rgn[i].dest)); + seq_printf(m, "Size: %#llx, Dumped: %#llx bytes\n", +- fdm_ptr->rgn[i].size, dumped_bytes); ++ be64_to_cpu(fdm_ptr->rgn[i].size), dumped_bytes); + } + + /* Dump is active. Show reserved area start address. */ +@@ -624,6 +633,7 @@ void __init opal_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node) + { + const __be32 *prop; + unsigned long dn; ++ __be64 be_addr; + u64 addr = 0; + int i, len; + s64 ret; +@@ -680,13 +690,13 @@ void __init opal_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node) + if (!prop) + return; + +- ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_KERNEL, &addr); +- if ((ret != OPAL_SUCCESS) || !addr) { ++ ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_KERNEL, &be_addr); ++ if ((ret != OPAL_SUCCESS) || !be_addr) { + pr_err("Failed to get Kernel metadata (%lld)\n", ret); + return; + } + +- addr = be64_to_cpu(addr); ++ addr = be64_to_cpu(be_addr); + pr_debug("Kernel metadata addr: %llx\n", addr); + + opal_fdm_active = __va(addr); +@@ -697,14 +707,14 @@ void __init opal_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node) + } + + /* Kernel regions not registered with f/w for MPIPL */ +- if (opal_fdm_active->registered_regions == 0) { ++ if (be16_to_cpu(opal_fdm_active->registered_regions) == 0) { + opal_fdm_active = NULL; + return; + } + +- ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_CPU, &addr); +- if (addr) { +- addr = be64_to_cpu(addr); ++ ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_CPU, &be_addr); ++ if (be_addr) { ++ addr = be64_to_cpu(be_addr); + pr_debug("CPU metadata addr: %llx\n", addr); + opal_cpu_metadata = __va(addr); + } +diff --git a/arch/powerpc/platforms/powernv/opal-fadump.h b/arch/powerpc/platforms/powernv/opal-fadump.h +index f1e9ecf548c5d..3f715efb0aa6e 100644 +--- a/arch/powerpc/platforms/powernv/opal-fadump.h ++++ b/arch/powerpc/platforms/powernv/opal-fadump.h +@@ -31,14 +31,14 @@ + * OPAL FADump kernel metadata + * + * The address of this structure will be registered with f/w for retrieving +- * and processing during crash dump. ++ * in the capture kernel to process the crash dump. + */ + struct opal_fadump_mem_struct { + u8 version; + u8 reserved[3]; +- u16 region_cnt; /* number of regions */ +- u16 registered_regions; /* Regions registered for MPIPL */ +- u64 fadumphdr_addr; ++ __be16 region_cnt; /* number of regions */ ++ __be16 registered_regions; /* Regions registered for MPIPL */ ++ __be64 fadumphdr_addr; + struct opal_mpipl_region rgn[FADUMP_MAX_MEM_REGS]; + } __packed; + +@@ -135,7 +135,7 @@ static inline void opal_fadump_read_regs(char *bufp, unsigned int regs_cnt, + for (i = 0; i < regs_cnt; i++, bufp += reg_entry_size) { + reg_entry = (struct hdat_fadump_reg_entry *)bufp; + val = (cpu_endian ? be64_to_cpu(reg_entry->reg_val) : +- reg_entry->reg_val); ++ (u64)(reg_entry->reg_val)); + opal_fadump_set_regval_regnum(regs, + be32_to_cpu(reg_entry->reg_type), + be32_to_cpu(reg_entry->reg_num), +diff --git a/arch/powerpc/platforms/powernv/ultravisor.c b/arch/powerpc/platforms/powernv/ultravisor.c +index e4a00ad06f9d3..67c8c4b2d8b17 100644 +--- a/arch/powerpc/platforms/powernv/ultravisor.c ++++ b/arch/powerpc/platforms/powernv/ultravisor.c +@@ -55,6 +55,7 @@ static int __init uv_init(void) + return -ENODEV; + + uv_memcons = memcons_init(node, "memcons"); ++ of_node_put(node); + if (!uv_memcons) + return -ENOENT; + +diff --git a/arch/powerpc/platforms/powernv/vas-fault.c b/arch/powerpc/platforms/powernv/vas-fault.c +index 3d21fce254b74..dd9c23c097816 100644 +--- a/arch/powerpc/platforms/powernv/vas-fault.c ++++ b/arch/powerpc/platforms/powernv/vas-fault.c +@@ -352,7 +352,7 @@ int vas_setup_fault_window(struct vas_instance *vinst) + vas_init_rx_win_attr(&attr, VAS_COP_TYPE_FAULT); + + attr.rx_fifo_size = vinst->fault_fifo_size; +- attr.rx_fifo = vinst->fault_fifo; ++ attr.rx_fifo = __pa(vinst->fault_fifo); + + /* + * Max creds is based on number of CRBs can fit in the FIFO. +diff --git a/arch/powerpc/platforms/powernv/vas-window.c b/arch/powerpc/platforms/powernv/vas-window.c +index 7ba0840fc3b55..3a86cdd5ae6c3 100644 +--- a/arch/powerpc/platforms/powernv/vas-window.c ++++ b/arch/powerpc/platforms/powernv/vas-window.c +@@ -403,7 +403,7 @@ static void init_winctx_regs(struct vas_window *window, + * + * See also: Design note in function header. + */ +- val = __pa(winctx->rx_fifo); ++ val = winctx->rx_fifo; + val = SET_FIELD(VAS_PAGE_MIGRATION_SELECT, val, 0); + write_hvwc_reg(window, VREG(LFIFO_BAR), val); + +@@ -737,7 +737,7 @@ static void init_winctx_for_rxwin(struct vas_window *rxwin, + */ + winctx->fifo_disable = true; + winctx->intr_disable = true; +- winctx->rx_fifo = NULL; ++ winctx->rx_fifo = 0; + } + + winctx->lnotify_lpid = rxattr->lnotify_lpid; +diff --git a/arch/powerpc/platforms/powernv/vas.h b/arch/powerpc/platforms/powernv/vas.h +index 70f793e8f6cc6..1f6e73809205e 100644 +--- a/arch/powerpc/platforms/powernv/vas.h ++++ b/arch/powerpc/platforms/powernv/vas.h +@@ -383,7 +383,7 @@ struct vas_window { + * is a container for the register fields in the window context. + */ + struct vas_winctx { +- void *rx_fifo; ++ u64 rx_fifo; + int rx_fifo_size; + int wcreds_max; + int rsvd_txbuf_count; +diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c +index 6b4a34b36d987..8ff9bcfe4b8d4 100644 +--- a/arch/powerpc/sysdev/dart_iommu.c ++++ b/arch/powerpc/sysdev/dart_iommu.c +@@ -403,9 +403,10 @@ void __init iommu_init_early_dart(struct pci_controller_ops *controller_ops) + } + + /* Initialize the DART HW */ +- if (dart_init(dn) != 0) ++ if (dart_init(dn) != 0) { ++ of_node_put(dn); + return; +- ++ } + /* + * U4 supports a DART bypass, we use it for 64-bit capable devices to + * improve performance. However, that only works for devices connected +@@ -418,6 +419,7 @@ void __init iommu_init_early_dart(struct pci_controller_ops *controller_ops) + + /* Setup pci_dma ops */ + set_pci_dma_ops(&dma_iommu_ops); ++ of_node_put(dn); + } + + #ifdef CONFIG_PM +diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c +index 07c164f7f8cfe..3f9f78621cf3c 100644 +--- a/arch/powerpc/sysdev/fsl_rio.c ++++ b/arch/powerpc/sysdev/fsl_rio.c +@@ -505,8 +505,10 @@ int fsl_rio_setup(struct platform_device *dev) + if (rc) { + dev_err(&dev->dev, "Can't get %pOF property 'reg'\n", + rmu_node); ++ of_node_put(rmu_node); + goto err_rmu; + } ++ of_node_put(rmu_node); + rmu_regs_win = ioremap(rmu_regs.start, resource_size(&rmu_regs)); + if (!rmu_regs_win) { + dev_err(&dev->dev, "Unable to map rmu register window\n"); +diff --git a/arch/powerpc/sysdev/xics/icp-opal.c b/arch/powerpc/sysdev/xics/icp-opal.c +index 68fd2540b0931..7fa520efcefa0 100644 +--- a/arch/powerpc/sysdev/xics/icp-opal.c ++++ b/arch/powerpc/sysdev/xics/icp-opal.c +@@ -195,6 +195,7 @@ int icp_opal_init(void) + + printk("XICS: Using OPAL ICP fallbacks\n"); + ++ of_node_put(np); + return 0; + } + +diff --git a/arch/riscv/include/asm/irq_work.h b/arch/riscv/include/asm/irq_work.h +index d6c277992f76a..b53891964ae03 100644 +--- a/arch/riscv/include/asm/irq_work.h ++++ b/arch/riscv/include/asm/irq_work.h +@@ -4,7 +4,7 @@ + + static inline bool arch_irq_work_has_interrupt(void) + { +- return true; ++ return IS_ENABLED(CONFIG_SMP); + } + extern void arch_irq_work_raise(void); + #endif /* _ASM_RISCV_IRQ_WORK_H */ +diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S +index 1a819c18bedec..47d1411db0a93 100644 +--- a/arch/riscv/kernel/head.S ++++ b/arch/riscv/kernel/head.S +@@ -261,6 +261,7 @@ clear_bss_done: + REG_S a0, (a2) + + /* Initialize page tables and relocate to virtual addresses */ ++ la tp, init_task + la sp, init_thread_union + THREAD_SIZE + mv a0, s1 + call setup_vm +diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h +index 7f3c9ac34bd8d..63098df81c9f2 100644 +--- a/arch/s390/include/asm/kexec.h ++++ b/arch/s390/include/asm/kexec.h +@@ -9,6 +9,8 @@ + #ifndef _S390_KEXEC_H + #define _S390_KEXEC_H + ++#include <linux/module.h> ++ + #include <asm/processor.h> + #include <asm/page.h> + #include <asm/setup.h> +@@ -83,4 +85,12 @@ struct kimage_arch { + extern const struct kexec_file_ops s390_kexec_image_ops; + extern const struct kexec_file_ops s390_kexec_elf_ops; + ++#ifdef CONFIG_KEXEC_FILE ++struct purgatory_info; ++int arch_kexec_apply_relocations_add(struct purgatory_info *pi, ++ Elf_Shdr *section, ++ const Elf_Shdr *relsec, ++ const Elf_Shdr *symtab); ++#define arch_kexec_apply_relocations_add arch_kexec_apply_relocations_add ++#endif + #endif /*_S390_KEXEC_H */ +diff --git a/arch/s390/include/asm/preempt.h b/arch/s390/include/asm/preempt.h +index b5f545db461a4..60e101b8460ce 100644 +--- a/arch/s390/include/asm/preempt.h ++++ b/arch/s390/include/asm/preempt.h +@@ -46,10 +46,17 @@ static inline bool test_preempt_need_resched(void) + + static inline void __preempt_count_add(int val) + { +- if (__builtin_constant_p(val) && (val >= -128) && (val <= 127)) +- __atomic_add_const(val, &S390_lowcore.preempt_count); +- else +- __atomic_add(val, &S390_lowcore.preempt_count); ++ /* ++ * With some obscure config options and CONFIG_PROFILE_ALL_BRANCHES ++ * enabled, gcc 12 fails to handle __builtin_constant_p(). ++ */ ++ if (!IS_ENABLED(CONFIG_PROFILE_ALL_BRANCHES)) { ++ if (__builtin_constant_p(val) && (val >= -128) && (val <= 127)) { ++ __atomic_add_const(val, &S390_lowcore.preempt_count); ++ return; ++ } ++ } ++ __atomic_add(val, &S390_lowcore.preempt_count); + } + + static inline void __preempt_count_sub(int val) +diff --git a/arch/s390/kernel/perf_event.c b/arch/s390/kernel/perf_event.c +index 1e75cc9835468..b922dc0c81309 100644 +--- a/arch/s390/kernel/perf_event.c ++++ b/arch/s390/kernel/perf_event.c +@@ -51,7 +51,7 @@ static struct kvm_s390_sie_block *sie_block(struct pt_regs *regs) + if (!stack) + return NULL; + +- return (struct kvm_s390_sie_block *) stack->empty1[0]; ++ return (struct kvm_s390_sie_block *)stack->empty1[1]; + } + + static bool is_in_guest(struct pt_regs *regs) +diff --git a/arch/um/drivers/chan_user.c b/arch/um/drivers/chan_user.c +index 6040817c036f3..25727ed648b72 100644 +--- a/arch/um/drivers/chan_user.c ++++ b/arch/um/drivers/chan_user.c +@@ -220,7 +220,7 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out, + unsigned long *stack_out) + { + struct winch_data data; +- int fds[2], n, err; ++ int fds[2], n, err, pid; + char c; + + err = os_pipe(fds, 1, 1); +@@ -238,8 +238,9 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out, + * problem with /dev/net/tun, which if held open by this + * thread, prevents the TUN/TAP device from being reused. + */ +- err = run_helper_thread(winch_thread, &data, CLONE_FILES, stack_out); +- if (err < 0) { ++ pid = run_helper_thread(winch_thread, &data, CLONE_FILES, stack_out); ++ if (pid < 0) { ++ err = pid; + printk(UM_KERN_ERR "fork of winch_thread failed - errno = %d\n", + -err); + goto out_close; +@@ -263,7 +264,7 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out, + goto out_close; + } + +- return err; ++ return pid; + + out_close: + close(fds[1]); +diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h +index 4c19ce4c49f18..66ab6a07330b2 100644 +--- a/arch/um/include/asm/thread_info.h ++++ b/arch/um/include/asm/thread_info.h +@@ -63,6 +63,7 @@ static inline struct thread_info *current_thread_info(void) + #define TIF_RESTORE_SIGMASK 7 + #define TIF_NOTIFY_RESUME 8 + #define TIF_SECCOMP 9 /* secure computing */ ++#define TIF_SINGLESTEP 10 /* single stepping userspace */ + + #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) + #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) +@@ -70,5 +71,6 @@ static inline struct thread_info *current_thread_info(void) + #define _TIF_MEMDIE (1 << TIF_MEMDIE) + #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) + #define _TIF_SECCOMP (1 << TIF_SECCOMP) ++#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) + + #endif +diff --git a/arch/um/kernel/exec.c b/arch/um/kernel/exec.c +index e8fd5d540b05d..7f7a74c82abb6 100644 +--- a/arch/um/kernel/exec.c ++++ b/arch/um/kernel/exec.c +@@ -44,7 +44,7 @@ void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp) + { + PT_REGS_IP(regs) = eip; + PT_REGS_SP(regs) = esp; +- current->ptrace &= ~PT_DTRACE; ++ clear_thread_flag(TIF_SINGLESTEP); + #ifdef SUBARCH_EXECVE1 + SUBARCH_EXECVE1(regs->regs); + #endif +diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c +index 9505a7e87396a..8eb8b736abc18 100644 +--- a/arch/um/kernel/process.c ++++ b/arch/um/kernel/process.c +@@ -341,7 +341,7 @@ int singlestepping(void * t) + { + struct task_struct *task = t ? t : current; + +- if (!(task->ptrace & PT_DTRACE)) ++ if (!test_thread_flag(TIF_SINGLESTEP)) + return 0; + + if (task->thread.singlestep_syscall) +diff --git a/arch/um/kernel/ptrace.c b/arch/um/kernel/ptrace.c +index b425f47bddbb3..d37802ced5636 100644 +--- a/arch/um/kernel/ptrace.c ++++ b/arch/um/kernel/ptrace.c +@@ -12,7 +12,7 @@ + + void user_enable_single_step(struct task_struct *child) + { +- child->ptrace |= PT_DTRACE; ++ set_tsk_thread_flag(child, TIF_SINGLESTEP); + child->thread.singlestep_syscall = 0; + + #ifdef SUBARCH_SET_SINGLESTEPPING +@@ -22,7 +22,7 @@ void user_enable_single_step(struct task_struct *child) + + void user_disable_single_step(struct task_struct *child) + { +- child->ptrace &= ~PT_DTRACE; ++ clear_tsk_thread_flag(child, TIF_SINGLESTEP); + child->thread.singlestep_syscall = 0; + + #ifdef SUBARCH_SET_SINGLESTEPPING +@@ -121,7 +121,7 @@ static void send_sigtrap(struct uml_pt_regs *regs, int error_code) + } + + /* +- * XXX Check PT_DTRACE vs TIF_SINGLESTEP for singlestepping check and ++ * XXX Check TIF_SINGLESTEP for singlestepping check and + * PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check + */ + int syscall_trace_enter(struct pt_regs *regs) +@@ -145,7 +145,7 @@ void syscall_trace_leave(struct pt_regs *regs) + audit_syscall_exit(regs); + + /* Fake a debug trap */ +- if (ptraced & PT_DTRACE) ++ if (test_thread_flag(TIF_SINGLESTEP)) + send_sigtrap(®s->regs, 0); + + if (!test_thread_flag(TIF_SYSCALL_TRACE)) +diff --git a/arch/um/kernel/signal.c b/arch/um/kernel/signal.c +index 88cd9b5c1b744..ae4658f576ab7 100644 +--- a/arch/um/kernel/signal.c ++++ b/arch/um/kernel/signal.c +@@ -53,7 +53,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) + unsigned long sp; + int err; + +- if ((current->ptrace & PT_DTRACE) && (current->ptrace & PT_PTRACED)) ++ if (test_thread_flag(TIF_SINGLESTEP) && (current->ptrace & PT_PTRACED)) + singlestep = 1; + + /* Did we come from a system call? */ +@@ -128,7 +128,7 @@ void do_signal(struct pt_regs *regs) + * on the host. The tracing thread will check this flag and + * PTRACE_SYSCALL if necessary. + */ +- if (current->ptrace & PT_DTRACE) ++ if (test_thread_flag(TIF_SINGLESTEP)) + current->thread.singlestep_syscall = + is_syscall(PT_REGS_IP(¤t->thread.regs)); + +diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig +index db95ac482e0ef..ed713840d4698 100644 +--- a/arch/x86/Kconfig ++++ b/arch/x86/Kconfig +@@ -1321,7 +1321,7 @@ config MICROCODE + + config MICROCODE_INTEL + bool "Intel microcode loading support" +- depends on MICROCODE ++ depends on CPU_SUP_INTEL && MICROCODE + default MICROCODE + help + This options enables microcode patch loading support for Intel +@@ -1333,7 +1333,7 @@ config MICROCODE_INTEL + + config MICROCODE_AMD + bool "AMD microcode loading support" +- depends on MICROCODE ++ depends on CPU_SUP_AMD && MICROCODE + help + If you select this option, microcode patch loading support for AMD + processors will be enabled. +diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S +index a24ce5905ab82..2f2d52729e176 100644 +--- a/arch/x86/entry/entry_64.S ++++ b/arch/x86/entry/entry_64.S +@@ -500,6 +500,7 @@ SYM_CODE_START(\asmsym) + call vc_switch_off_ist + movq %rax, %rsp /* Switch to new stack */ + ++ ENCODE_FRAME_POINTER + UNWIND_HINT_REGS + + /* Update pt_regs */ +diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c +index 9185cb1d13b9b..5876289e48d89 100644 +--- a/arch/x86/entry/vdso/vma.c ++++ b/arch/x86/entry/vdso/vma.c +@@ -440,7 +440,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) + static __init int vdso_setup(char *s) + { + vdso64_enabled = simple_strtoul(s, NULL, 0); +- return 0; ++ return 1; + } + __setup("vdso=", vdso_setup); + +diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c +index ccc9ee1971e89..8a85658a24cc1 100644 +--- a/arch/x86/events/amd/ibs.c ++++ b/arch/x86/events/amd/ibs.c +@@ -312,6 +312,16 @@ static int perf_ibs_init(struct perf_event *event) + hwc->config_base = perf_ibs->msr; + hwc->config = config; + ++ /* ++ * rip recorded by IbsOpRip will not be consistent with rsp and rbp ++ * recorded as part of interrupt regs. Thus we need to use rip from ++ * interrupt regs while unwinding call stack. Setting _EARLY flag ++ * makes sure we unwind call-stack before perf sample rip is set to ++ * IbsOpRip. ++ */ ++ if (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN) ++ event->attr.sample_type |= __PERF_SAMPLE_CALLCHAIN_EARLY; ++ + return 0; + } + +@@ -692,6 +702,14 @@ fail: + data.raw = &raw; + } + ++ /* ++ * rip recorded by IbsOpRip will not be consistent with rsp and rbp ++ * recorded as part of interrupt regs. Thus we need to use rip from ++ * interrupt regs while unwinding call stack. ++ */ ++ if (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN) ++ data.callchain = perf_callchain(event, iregs); ++ + throttle = perf_event_overflow(event, &data, ®s); + out: + if (throttle) { +@@ -764,9 +782,10 @@ static __init int perf_ibs_pmu_init(struct perf_ibs *perf_ibs, char *name) + return ret; + } + +-static __init void perf_event_ibs_init(void) ++static __init int perf_event_ibs_init(void) + { + struct attribute **attr = ibs_op_format_attrs; ++ int ret; + + /* + * Some chips fail to reset the fetch count when it is written; instead +@@ -778,7 +797,9 @@ static __init void perf_event_ibs_init(void) + if (boot_cpu_data.x86 == 0x19 && boot_cpu_data.x86_model < 0x10) + perf_ibs_fetch.fetch_ignore_if_zero_rip = 1; + +- perf_ibs_pmu_init(&perf_ibs_fetch, "ibs_fetch"); ++ ret = perf_ibs_pmu_init(&perf_ibs_fetch, "ibs_fetch"); ++ if (ret) ++ return ret; + + if (ibs_caps & IBS_CAPS_OPCNT) { + perf_ibs_op.config_mask |= IBS_OP_CNT_CTL; +@@ -791,15 +812,35 @@ static __init void perf_event_ibs_init(void) + perf_ibs_op.cnt_mask |= IBS_OP_MAX_CNT_EXT_MASK; + } + +- perf_ibs_pmu_init(&perf_ibs_op, "ibs_op"); ++ ret = perf_ibs_pmu_init(&perf_ibs_op, "ibs_op"); ++ if (ret) ++ goto err_op; ++ ++ ret = register_nmi_handler(NMI_LOCAL, perf_ibs_nmi_handler, 0, "perf_ibs"); ++ if (ret) ++ goto err_nmi; + +- register_nmi_handler(NMI_LOCAL, perf_ibs_nmi_handler, 0, "perf_ibs"); + pr_info("perf: AMD IBS detected (0x%08x)\n", ibs_caps); ++ return 0; ++ ++err_nmi: ++ perf_pmu_unregister(&perf_ibs_op.pmu); ++ free_percpu(perf_ibs_op.pcpu); ++ perf_ibs_op.pcpu = NULL; ++err_op: ++ perf_pmu_unregister(&perf_ibs_fetch.pmu); ++ free_percpu(perf_ibs_fetch.pcpu); ++ perf_ibs_fetch.pcpu = NULL; ++ ++ return ret; + } + + #else /* defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_AMD) */ + +-static __init void perf_event_ibs_init(void) { } ++static __init int perf_event_ibs_init(void) ++{ ++ return 0; ++} + + #endif + +@@ -1069,9 +1110,7 @@ static __init int amd_ibs_init(void) + x86_pmu_amd_ibs_starting_cpu, + x86_pmu_amd_ibs_dying_cpu); + +- perf_event_ibs_init(); +- +- return 0; ++ return perf_event_ibs_init(); + } + + /* Since we need the pci subsystem to init ibs we can't do this earlier: */ +diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c +index 5ba13b00e3a71..f6eadf9320a1a 100644 +--- a/arch/x86/events/intel/core.c ++++ b/arch/x86/events/intel/core.c +@@ -254,7 +254,7 @@ static struct event_constraint intel_icl_event_constraints[] = { + INTEL_EVENT_CONSTRAINT_RANGE(0x03, 0x0a, 0xf), + INTEL_EVENT_CONSTRAINT_RANGE(0x1f, 0x28, 0xf), + INTEL_EVENT_CONSTRAINT(0x32, 0xf), /* SW_PREFETCH_ACCESS.* */ +- INTEL_EVENT_CONSTRAINT_RANGE(0x48, 0x54, 0xf), ++ INTEL_EVENT_CONSTRAINT_RANGE(0x48, 0x56, 0xf), + INTEL_EVENT_CONSTRAINT_RANGE(0x60, 0x8b, 0xf), + INTEL_UEVENT_CONSTRAINT(0x04a3, 0xff), /* CYCLE_ACTIVITY.STALLS_TOTAL */ + INTEL_UEVENT_CONSTRAINT(0x10a3, 0xff), /* CYCLE_ACTIVITY.CYCLES_MEM_ANY */ +diff --git a/arch/x86/include/asm/acenv.h b/arch/x86/include/asm/acenv.h +index 9aff97f0de7fd..d937c55e717e6 100644 +--- a/arch/x86/include/asm/acenv.h ++++ b/arch/x86/include/asm/acenv.h +@@ -13,7 +13,19 @@ + + /* Asm macros */ + +-#define ACPI_FLUSH_CPU_CACHE() wbinvd() ++/* ++ * ACPI_FLUSH_CPU_CACHE() flushes caches on entering sleep states. ++ * It is required to prevent data loss. ++ * ++ * While running inside virtual machine, the kernel can bypass cache flushing. ++ * Changing sleep state in a virtual machine doesn't affect the host system ++ * sleep state and cannot lead to data loss. ++ */ ++#define ACPI_FLUSH_CPU_CACHE() \ ++do { \ ++ if (!cpu_feature_enabled(X86_FEATURE_HYPERVISOR)) \ ++ wbinvd(); \ ++} while (0) + + int __acpi_acquire_global_lock(unsigned int *lock); + int __acpi_release_global_lock(unsigned int *lock); +diff --git a/arch/x86/include/asm/kexec.h b/arch/x86/include/asm/kexec.h +index 6802c59e82523..8e80c2655ca9c 100644 +--- a/arch/x86/include/asm/kexec.h ++++ b/arch/x86/include/asm/kexec.h +@@ -191,6 +191,14 @@ extern int arch_kexec_post_alloc_pages(void *vaddr, unsigned int pages, + extern void arch_kexec_pre_free_pages(void *vaddr, unsigned int pages); + #define arch_kexec_pre_free_pages arch_kexec_pre_free_pages + ++#ifdef CONFIG_KEXEC_FILE ++struct purgatory_info; ++int arch_kexec_apply_relocations_add(struct purgatory_info *pi, ++ Elf_Shdr *section, ++ const Elf_Shdr *relsec, ++ const Elf_Shdr *symtab); ++#define arch_kexec_apply_relocations_add arch_kexec_apply_relocations_add ++#endif + #endif + + typedef void crash_vmclear_fn(void); +diff --git a/arch/x86/include/asm/suspend_32.h b/arch/x86/include/asm/suspend_32.h +index fdbd9d7b7bca1..3b97aa9215430 100644 +--- a/arch/x86/include/asm/suspend_32.h ++++ b/arch/x86/include/asm/suspend_32.h +@@ -21,7 +21,6 @@ struct saved_context { + #endif + unsigned long cr0, cr2, cr3, cr4; + u64 misc_enable; +- bool misc_enable_saved; + struct saved_msrs saved_msrs; + struct desc_ptr gdt_desc; + struct desc_ptr idt; +@@ -30,6 +29,7 @@ struct saved_context { + unsigned long tr; + unsigned long safety; + unsigned long return_address; ++ bool misc_enable_saved; + } __attribute__((packed)); + + /* routines for saving/restoring kernel state */ +diff --git a/arch/x86/include/asm/suspend_64.h b/arch/x86/include/asm/suspend_64.h +index 35bb35d28733e..54df06687d834 100644 +--- a/arch/x86/include/asm/suspend_64.h ++++ b/arch/x86/include/asm/suspend_64.h +@@ -14,9 +14,13 @@ + * Image of the saved processor state, used by the low level ACPI suspend to + * RAM code and by the low level hibernation code. + * +- * If you modify it, fix arch/x86/kernel/acpi/wakeup_64.S and make sure that +- * __save/__restore_processor_state(), defined in arch/x86/kernel/suspend_64.c, +- * still work as required. ++ * If you modify it, check how it is used in arch/x86/kernel/acpi/wakeup_64.S ++ * and make sure that __save/__restore_processor_state(), defined in ++ * arch/x86/power/cpu.c, still work as required. ++ * ++ * Because the structure is packed, make sure to avoid unaligned members. For ++ * optimisation purposes but also because tools like kmemleak only search for ++ * pointers that are aligned. + */ + struct saved_context { + struct pt_regs regs; +@@ -36,7 +40,6 @@ struct saved_context { + + unsigned long cr0, cr2, cr3, cr4; + u64 misc_enable; +- bool misc_enable_saved; + struct saved_msrs saved_msrs; + unsigned long efer; + u16 gdt_pad; /* Unused */ +@@ -48,6 +51,7 @@ struct saved_context { + unsigned long tr; + unsigned long safety; + unsigned long return_address; ++ bool misc_enable_saved; + } __attribute__((packed)); + + #define loaddebug(thread,register) \ +diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c +index 24539a05c58c7..1c96f2425eafd 100644 +--- a/arch/x86/kernel/apic/apic.c ++++ b/arch/x86/kernel/apic/apic.c +@@ -168,7 +168,7 @@ static __init int setup_apicpmtimer(char *s) + { + apic_calibrate_pmtmr = 1; + notsc_setup(NULL); +- return 0; ++ return 1; + } + __setup("apicpmtimer", setup_apicpmtimer); + #endif +diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c +index 40f466de89242..9c283562dfd49 100644 +--- a/arch/x86/kernel/apic/x2apic_uv_x.c ++++ b/arch/x86/kernel/apic/x2apic_uv_x.c +@@ -199,7 +199,13 @@ static void __init uv_tsc_check_sync(void) + int mmr_shift; + char *state; + +- /* Different returns from different UV BIOS versions */ ++ /* UV5 guarantees synced TSCs; do not zero TSC_ADJUST */ ++ if (!is_uv(UV2|UV3|UV4)) { ++ mark_tsc_async_resets("UV5+"); ++ return; ++ } ++ ++ /* UV2,3,4, UV BIOS TSC sync state available */ + mmr = uv_early_read_mmr(UVH_TSC_SYNC_MMR); + mmr_shift = + is_uv2_hub() ? UVH_TSC_SYNC_SHIFT_UV2K : UVH_TSC_SYNC_SHIFT; +diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c +index 816fdbec795a4..c6ad53e38f653 100644 +--- a/arch/x86/kernel/cpu/intel.c ++++ b/arch/x86/kernel/cpu/intel.c +@@ -88,7 +88,7 @@ static bool ring3mwait_disabled __read_mostly; + static int __init ring3mwait_disable(char *__unused) + { + ring3mwait_disabled = true; +- return 0; ++ return 1; + } + __setup("ring3mwait=disable", ring3mwait_disable); + +diff --git a/arch/x86/kernel/cpu/mce/amd.c b/arch/x86/kernel/cpu/mce/amd.c +index f73f1184b1c13..09f7c652346a9 100644 +--- a/arch/x86/kernel/cpu/mce/amd.c ++++ b/arch/x86/kernel/cpu/mce/amd.c +@@ -1457,10 +1457,23 @@ out_free: + kfree(bank); + } + ++static void __threshold_remove_device(struct threshold_bank **bp) ++{ ++ unsigned int bank, numbanks = this_cpu_read(mce_num_banks); ++ ++ for (bank = 0; bank < numbanks; bank++) { ++ if (!bp[bank]) ++ continue; ++ ++ threshold_remove_bank(bp[bank]); ++ bp[bank] = NULL; ++ } ++ kfree(bp); ++} ++ + int mce_threshold_remove_device(unsigned int cpu) + { + struct threshold_bank **bp = this_cpu_read(threshold_banks); +- unsigned int bank, numbanks = this_cpu_read(mce_num_banks); + + if (!bp) + return 0; +@@ -1471,13 +1484,7 @@ int mce_threshold_remove_device(unsigned int cpu) + */ + this_cpu_write(threshold_banks, NULL); + +- for (bank = 0; bank < numbanks; bank++) { +- if (bp[bank]) { +- threshold_remove_bank(bp[bank]); +- bp[bank] = NULL; +- } +- } +- kfree(bp); ++ __threshold_remove_device(bp); + return 0; + } + +@@ -1514,15 +1521,14 @@ int mce_threshold_create_device(unsigned int cpu) + if (!(this_cpu_read(bank_map) & (1 << bank))) + continue; + err = threshold_create_bank(bp, cpu, bank); +- if (err) +- goto out_err; ++ if (err) { ++ __threshold_remove_device(bp); ++ return err; ++ } + } + this_cpu_write(threshold_banks, bp); + + if (thresholding_irq_en) + mce_threshold_vector = amd_threshold_interrupt; + return 0; +-out_err: +- mce_threshold_remove_device(cpu); +- return err; + } +diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c +index 60d2c3798ba28..2f97d1a1032f3 100644 +--- a/arch/x86/kernel/step.c ++++ b/arch/x86/kernel/step.c +@@ -175,8 +175,7 @@ void set_task_blockstep(struct task_struct *task, bool on) + * + * NOTE: this means that set/clear TIF_BLOCKSTEP is only safe if + * task is current or it can't be running, otherwise we can race +- * with __switch_to_xtra(). We rely on ptrace_freeze_traced() but +- * PTRACE_KILL is not safe. ++ * with __switch_to_xtra(). We rely on ptrace_freeze_traced(). + */ + local_irq_disable(); + debugctl = get_debugctlmsr(); +diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c +index 504fa5425bcec..3fd1c81eb5e35 100644 +--- a/arch/x86/kernel/sys_x86_64.c ++++ b/arch/x86/kernel/sys_x86_64.c +@@ -68,9 +68,6 @@ static int __init control_va_addr_alignment(char *str) + if (*str == 0) + return 1; + +- if (*str == '=') +- str++; +- + if (!strcmp(str, "32")) + va_align.flags = ALIGN_VA_32; + else if (!strcmp(str, "64")) +@@ -80,11 +77,11 @@ static int __init control_va_addr_alignment(char *str) + else if (!strcmp(str, "on")) + va_align.flags = ALIGN_VA_32 | ALIGN_VA_64; + else +- return 0; ++ pr_warn("invalid option value: 'align_va_addr=%s'\n", str); + + return 1; + } +-__setup("align_va_addr", control_va_addr_alignment); ++__setup("align_va_addr=", control_va_addr_alignment); + + SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, + unsigned long, prot, unsigned long, flags, +diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c +index 0c2389d0fdafe..90881d7b42ead 100644 +--- a/arch/x86/kvm/vmx/nested.c ++++ b/arch/x86/kvm/vmx/nested.c +@@ -3668,12 +3668,34 @@ vmcs12_guest_cr4(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) + } + + static void vmcs12_save_pending_event(struct kvm_vcpu *vcpu, +- struct vmcs12 *vmcs12) ++ struct vmcs12 *vmcs12, ++ u32 vm_exit_reason, u32 exit_intr_info) + { + u32 idt_vectoring; + unsigned int nr; + +- if (vcpu->arch.exception.injected) { ++ /* ++ * Per the SDM, VM-Exits due to double and triple faults are never ++ * considered to occur during event delivery, even if the double/triple ++ * fault is the result of an escalating vectoring issue. ++ * ++ * Note, the SDM qualifies the double fault behavior with "The original ++ * event results in a double-fault exception". It's unclear why the ++ * qualification exists since exits due to double fault can occur only ++ * while vectoring a different exception (injected events are never ++ * subject to interception), i.e. there's _always_ an original event. ++ * ++ * The SDM also uses NMI as a confusing example for the "original event ++ * causes the VM exit directly" clause. NMI isn't special in any way, ++ * the same rule applies to all events that cause an exit directly. ++ * NMI is an odd choice for the example because NMIs can only occur on ++ * instruction boundaries, i.e. they _can't_ occur during vectoring. ++ */ ++ if ((u16)vm_exit_reason == EXIT_REASON_TRIPLE_FAULT || ++ ((u16)vm_exit_reason == EXIT_REASON_EXCEPTION_NMI && ++ is_double_fault(exit_intr_info))) { ++ vmcs12->idt_vectoring_info_field = 0; ++ } else if (vcpu->arch.exception.injected) { + nr = vcpu->arch.exception.nr; + idt_vectoring = nr | VECTORING_INFO_VALID_MASK; + +@@ -3706,6 +3728,8 @@ static void vmcs12_save_pending_event(struct kvm_vcpu *vcpu, + idt_vectoring |= INTR_TYPE_EXT_INTR; + + vmcs12->idt_vectoring_info_field = idt_vectoring; ++ } else { ++ vmcs12->idt_vectoring_info_field = 0; + } + } + +@@ -4143,12 +4167,12 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, + /* update exit information fields: */ + vmcs12->vm_exit_reason = vm_exit_reason; + vmcs12->exit_qualification = exit_qualification; +- vmcs12->vm_exit_intr_info = exit_intr_info; +- +- vmcs12->idt_vectoring_info_field = 0; +- vmcs12->vm_exit_instruction_len = vmcs_read32(VM_EXIT_INSTRUCTION_LEN); +- vmcs12->vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); + ++ /* ++ * On VM-Exit due to a failed VM-Entry, the VMCS isn't marked launched ++ * and only EXIT_REASON and EXIT_QUALIFICATION are updated, all other ++ * exit info fields are unmodified. ++ */ + if (!(vmcs12->vm_exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY)) { + vmcs12->launch_state = 1; + +@@ -4160,7 +4184,12 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, + * Transfer the event that L0 or L1 may wanted to inject into + * L2 to IDT_VECTORING_INFO_FIELD. + */ +- vmcs12_save_pending_event(vcpu, vmcs12); ++ vmcs12_save_pending_event(vcpu, vmcs12, ++ vm_exit_reason, exit_intr_info); ++ ++ vmcs12->vm_exit_intr_info = exit_intr_info; ++ vmcs12->vm_exit_instruction_len = vmcs_read32(VM_EXIT_INSTRUCTION_LEN); ++ vmcs12->vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); + + /* + * According to spec, there's no need to store the guest's +diff --git a/arch/x86/kvm/vmx/vmcs.h b/arch/x86/kvm/vmx/vmcs.h +index 571d9ad80a59e..69c147df957fd 100644 +--- a/arch/x86/kvm/vmx/vmcs.h ++++ b/arch/x86/kvm/vmx/vmcs.h +@@ -102,6 +102,11 @@ static inline bool is_breakpoint(u32 intr_info) + return is_exception_n(intr_info, BP_VECTOR); + } + ++static inline bool is_double_fault(u32 intr_info) ++{ ++ return is_exception_n(intr_info, DF_VECTOR); ++} ++ + static inline bool is_page_fault(u32 intr_info) + { + return is_exception_n(intr_info, PF_VECTOR); +diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c +index 65d15df6212d6..0e65d00e2339f 100644 +--- a/arch/x86/lib/delay.c ++++ b/arch/x86/lib/delay.c +@@ -54,8 +54,8 @@ static void delay_loop(u64 __loops) + " jnz 2b \n" + "3: dec %0 \n" + +- : /* we don't need output */ +- :"a" (loops) ++ : "+a" (loops) ++ : + ); + } + +diff --git a/arch/x86/mm/pat/memtype.c b/arch/x86/mm/pat/memtype.c +index 232932bda4e5e..f9c53a7107407 100644 +--- a/arch/x86/mm/pat/memtype.c ++++ b/arch/x86/mm/pat/memtype.c +@@ -101,7 +101,7 @@ int pat_debug_enable; + static int __init pat_debug_setup(char *str) + { + pat_debug_enable = 1; +- return 0; ++ return 1; + } + __setup("debugpat", pat_debug_setup); + +diff --git a/arch/x86/um/ldt.c b/arch/x86/um/ldt.c +index 3ee234b6234dd..255a44dd415a9 100644 +--- a/arch/x86/um/ldt.c ++++ b/arch/x86/um/ldt.c +@@ -23,9 +23,11 @@ static long write_ldt_entry(struct mm_id *mm_idp, int func, + { + long res; + void *stub_addr; ++ ++ BUILD_BUG_ON(sizeof(*desc) % sizeof(long)); ++ + res = syscall_stub_data(mm_idp, (unsigned long *)desc, +- (sizeof(*desc) + sizeof(long) - 1) & +- ~(sizeof(long) - 1), ++ sizeof(*desc) / sizeof(long), + addr, &stub_addr); + if (!res) { + unsigned long args[] = { func, +diff --git a/arch/xtensa/kernel/ptrace.c b/arch/xtensa/kernel/ptrace.c +index bb3f4797d212b..db6cdea471d83 100644 +--- a/arch/xtensa/kernel/ptrace.c ++++ b/arch/xtensa/kernel/ptrace.c +@@ -226,12 +226,12 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task) + + void user_enable_single_step(struct task_struct *child) + { +- child->ptrace |= PT_SINGLESTEP; ++ set_tsk_thread_flag(child, TIF_SINGLESTEP); + } + + void user_disable_single_step(struct task_struct *child) + { +- child->ptrace &= ~PT_SINGLESTEP; ++ clear_tsk_thread_flag(child, TIF_SINGLESTEP); + } + + /* +diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c +index 1fb1047f905ca..1cb230fafdf2b 100644 +--- a/arch/xtensa/kernel/signal.c ++++ b/arch/xtensa/kernel/signal.c +@@ -465,7 +465,7 @@ static void do_signal(struct pt_regs *regs) + /* Set up the stack frame */ + ret = setup_frame(&ksig, sigmask_to_save(), regs); + signal_setup_done(ret, &ksig, 0); +- if (current->ptrace & PT_SINGLESTEP) ++ if (test_thread_flag(TIF_SINGLESTEP)) + task_pt_regs(current)->icountlevel = 1; + + return; +@@ -491,7 +491,7 @@ static void do_signal(struct pt_regs *regs) + /* If there's no signal to deliver, we just restore the saved mask. */ + restore_saved_sigmask(); + +- if (current->ptrace & PT_SINGLESTEP) ++ if (test_thread_flag(TIF_SINGLESTEP)) + task_pt_regs(current)->icountlevel = 1; + return; + } +diff --git a/arch/xtensa/platforms/iss/simdisk.c b/arch/xtensa/platforms/iss/simdisk.c +index 3447556d276d3..2b3c829f655b3 100644 +--- a/arch/xtensa/platforms/iss/simdisk.c ++++ b/arch/xtensa/platforms/iss/simdisk.c +@@ -213,12 +213,18 @@ static ssize_t proc_read_simdisk(struct file *file, char __user *buf, + struct simdisk *dev = PDE_DATA(file_inode(file)); + const char *s = dev->filename; + if (s) { +- ssize_t n = simple_read_from_buffer(buf, size, ppos, +- s, strlen(s)); +- if (n < 0) +- return n; +- buf += n; +- size -= n; ++ ssize_t len = strlen(s); ++ char *temp = kmalloc(len + 2, GFP_KERNEL); ++ ++ if (!temp) ++ return -ENOMEM; ++ ++ len = scnprintf(temp, len + 2, "%s\n", s); ++ len = simple_read_from_buffer(buf, size, ppos, ++ temp, len); ++ ++ kfree(temp); ++ return len; + } + return simple_read_from_buffer(buf, size, ppos, "\n", 1); + } +diff --git a/block/bfq-cgroup.c b/block/bfq-cgroup.c +index c2fdd6fcdaee6..be6733558b831 100644 +--- a/block/bfq-cgroup.c ++++ b/block/bfq-cgroup.c +@@ -553,6 +553,7 @@ static void bfq_pd_init(struct blkg_policy_data *pd) + */ + bfqg->bfqd = bfqd; + bfqg->active_entities = 0; ++ bfqg->online = true; + bfqg->rq_pos_tree = RB_ROOT; + } + +@@ -581,28 +582,11 @@ static void bfq_group_set_parent(struct bfq_group *bfqg, + entity->sched_data = &parent->sched_data; + } + +-static struct bfq_group *bfq_lookup_bfqg(struct bfq_data *bfqd, +- struct blkcg *blkcg) ++static void bfq_link_bfqg(struct bfq_data *bfqd, struct bfq_group *bfqg) + { +- struct blkcg_gq *blkg; +- +- blkg = blkg_lookup(blkcg, bfqd->queue); +- if (likely(blkg)) +- return blkg_to_bfqg(blkg); +- return NULL; +-} +- +-struct bfq_group *bfq_find_set_group(struct bfq_data *bfqd, +- struct blkcg *blkcg) +-{ +- struct bfq_group *bfqg, *parent; ++ struct bfq_group *parent; + struct bfq_entity *entity; + +- bfqg = bfq_lookup_bfqg(bfqd, blkcg); +- +- if (unlikely(!bfqg)) +- return NULL; +- + /* + * Update chain of bfq_groups as we might be handling a leaf group + * which, along with some of its relatives, has not been hooked yet +@@ -619,8 +603,24 @@ struct bfq_group *bfq_find_set_group(struct bfq_data *bfqd, + bfq_group_set_parent(curr_bfqg, parent); + } + } ++} + +- return bfqg; ++struct bfq_group *bfq_bio_bfqg(struct bfq_data *bfqd, struct bio *bio) ++{ ++ struct blkcg_gq *blkg = bio->bi_blkg; ++ struct bfq_group *bfqg; ++ ++ while (blkg) { ++ bfqg = blkg_to_bfqg(blkg); ++ if (bfqg->online) { ++ bio_associate_blkg_from_css(bio, &blkg->blkcg->css); ++ return bfqg; ++ } ++ blkg = blkg->parent; ++ } ++ bio_associate_blkg_from_css(bio, ++ &bfqg_to_blkg(bfqd->root_group)->blkcg->css); ++ return bfqd->root_group; + } + + /** +@@ -696,25 +696,15 @@ void bfq_bfqq_move(struct bfq_data *bfqd, struct bfq_queue *bfqq, + * Move bic to blkcg, assuming that bfqd->lock is held; which makes + * sure that the reference to cgroup is valid across the call (see + * comments in bfq_bic_update_cgroup on this issue) +- * +- * NOTE: an alternative approach might have been to store the current +- * cgroup in bfqq and getting a reference to it, reducing the lookup +- * time here, at the price of slightly more complex code. + */ +-static struct bfq_group *__bfq_bic_change_cgroup(struct bfq_data *bfqd, +- struct bfq_io_cq *bic, +- struct blkcg *blkcg) ++static void *__bfq_bic_change_cgroup(struct bfq_data *bfqd, ++ struct bfq_io_cq *bic, ++ struct bfq_group *bfqg) + { + struct bfq_queue *async_bfqq = bic_to_bfqq(bic, 0); + struct bfq_queue *sync_bfqq = bic_to_bfqq(bic, 1); +- struct bfq_group *bfqg; + struct bfq_entity *entity; + +- bfqg = bfq_find_set_group(bfqd, blkcg); +- +- if (unlikely(!bfqg)) +- bfqg = bfqd->root_group; +- + if (async_bfqq) { + entity = &async_bfqq->entity; + +@@ -725,9 +715,39 @@ static struct bfq_group *__bfq_bic_change_cgroup(struct bfq_data *bfqd, + } + + if (sync_bfqq) { +- entity = &sync_bfqq->entity; +- if (entity->sched_data != &bfqg->sched_data) +- bfq_bfqq_move(bfqd, sync_bfqq, bfqg); ++ if (!sync_bfqq->new_bfqq && !bfq_bfqq_coop(sync_bfqq)) { ++ /* We are the only user of this bfqq, just move it */ ++ if (sync_bfqq->entity.sched_data != &bfqg->sched_data) ++ bfq_bfqq_move(bfqd, sync_bfqq, bfqg); ++ } else { ++ struct bfq_queue *bfqq; ++ ++ /* ++ * The queue was merged to a different queue. Check ++ * that the merge chain still belongs to the same ++ * cgroup. ++ */ ++ for (bfqq = sync_bfqq; bfqq; bfqq = bfqq->new_bfqq) ++ if (bfqq->entity.sched_data != ++ &bfqg->sched_data) ++ break; ++ if (bfqq) { ++ /* ++ * Some queue changed cgroup so the merge is ++ * not valid anymore. We cannot easily just ++ * cancel the merge (by clearing new_bfqq) as ++ * there may be other processes using this ++ * queue and holding refs to all queues below ++ * sync_bfqq->new_bfqq. Similarly if the merge ++ * already happened, we need to detach from ++ * bfqq now so that we cannot merge bio to a ++ * request from the old cgroup. ++ */ ++ bfq_put_cooperator(sync_bfqq); ++ bfq_release_process_ref(bfqd, sync_bfqq); ++ bic_set_bfqq(bic, NULL, 1); ++ } ++ } + } + + return bfqg; +@@ -736,20 +756,24 @@ static struct bfq_group *__bfq_bic_change_cgroup(struct bfq_data *bfqd, + void bfq_bic_update_cgroup(struct bfq_io_cq *bic, struct bio *bio) + { + struct bfq_data *bfqd = bic_to_bfqd(bic); +- struct bfq_group *bfqg = NULL; ++ struct bfq_group *bfqg = bfq_bio_bfqg(bfqd, bio); + uint64_t serial_nr; + +- rcu_read_lock(); +- serial_nr = __bio_blkcg(bio)->css.serial_nr; ++ serial_nr = bfqg_to_blkg(bfqg)->blkcg->css.serial_nr; + + /* + * Check whether blkcg has changed. The condition may trigger + * spuriously on a newly created cic but there's no harm. + */ + if (unlikely(!bfqd) || likely(bic->blkcg_serial_nr == serial_nr)) +- goto out; ++ return; + +- bfqg = __bfq_bic_change_cgroup(bfqd, bic, __bio_blkcg(bio)); ++ /* ++ * New cgroup for this process. Make sure it is linked to bfq internal ++ * cgroup hierarchy. ++ */ ++ bfq_link_bfqg(bfqd, bfqg); ++ __bfq_bic_change_cgroup(bfqd, bic, bfqg); + /* + * Update blkg_path for bfq_log_* functions. We cache this + * path, and update it here, for the following +@@ -802,8 +826,6 @@ void bfq_bic_update_cgroup(struct bfq_io_cq *bic, struct bio *bio) + */ + blkg_path(bfqg_to_blkg(bfqg), bfqg->blkg_path, sizeof(bfqg->blkg_path)); + bic->blkcg_serial_nr = serial_nr; +-out: +- rcu_read_unlock(); + } + + /** +@@ -931,6 +953,7 @@ static void bfq_pd_offline(struct blkg_policy_data *pd) + + put_async_queues: + bfq_put_async_queues(bfqd, bfqg); ++ bfqg->online = false; + + spin_unlock_irqrestore(&bfqd->lock, flags); + /* +@@ -1420,7 +1443,7 @@ void bfq_end_wr_async(struct bfq_data *bfqd) + bfq_end_wr_async_queues(bfqd, bfqd->root_group); + } + +-struct bfq_group *bfq_find_set_group(struct bfq_data *bfqd, struct blkcg *blkcg) ++struct bfq_group *bfq_bio_bfqg(struct bfq_data *bfqd, struct bio *bio) + { + return bfqd->root_group; + } +diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c +index de2cd4bd602fd..592d32a46c4c3 100644 +--- a/block/bfq-iosched.c ++++ b/block/bfq-iosched.c +@@ -2227,10 +2227,17 @@ static bool bfq_bio_merge(struct request_queue *q, struct bio *bio, + + spin_lock_irq(&bfqd->lock); + +- if (bic) ++ if (bic) { ++ /* ++ * Make sure cgroup info is uptodate for current process before ++ * considering the merge. ++ */ ++ bfq_bic_update_cgroup(bic, bio); ++ + bfqd->bio_bfqq = bic_to_bfqq(bic, op_is_sync(bio->bi_opf)); +- else ++ } else { + bfqd->bio_bfqq = NULL; ++ } + bfqd->bio_bic = bic; + + ret = blk_mq_sched_try_merge(q, bio, nr_segs, &free); +@@ -2260,8 +2267,6 @@ static int bfq_request_merge(struct request_queue *q, struct request **req, + return ELEVATOR_NO_MERGE; + } + +-static struct bfq_queue *bfq_init_rq(struct request *rq); +- + static void bfq_request_merged(struct request_queue *q, struct request *req, + enum elv_merge type) + { +@@ -2270,7 +2275,7 @@ static void bfq_request_merged(struct request_queue *q, struct request *req, + blk_rq_pos(req) < + blk_rq_pos(container_of(rb_prev(&req->rb_node), + struct request, rb_node))) { +- struct bfq_queue *bfqq = bfq_init_rq(req); ++ struct bfq_queue *bfqq = RQ_BFQQ(req); + struct bfq_data *bfqd; + struct request *prev, *next_rq; + +@@ -2322,8 +2327,8 @@ static void bfq_request_merged(struct request_queue *q, struct request *req, + static void bfq_requests_merged(struct request_queue *q, struct request *rq, + struct request *next) + { +- struct bfq_queue *bfqq = bfq_init_rq(rq), +- *next_bfqq = bfq_init_rq(next); ++ struct bfq_queue *bfqq = RQ_BFQQ(rq), ++ *next_bfqq = RQ_BFQQ(next); + + if (!bfqq) + return; +@@ -2502,6 +2507,14 @@ bfq_setup_merge(struct bfq_queue *bfqq, struct bfq_queue *new_bfqq) + if (process_refs == 0 || new_process_refs == 0) + return NULL; + ++ /* ++ * Make sure merged queues belong to the same parent. Parents could ++ * have changed since the time we decided the two queues are suitable ++ * for merging. ++ */ ++ if (new_bfqq->entity.parent != bfqq->entity.parent) ++ return NULL; ++ + bfq_log_bfqq(bfqq->bfqd, bfqq, "scheduling merge with queue %d", + new_bfqq->pid); + +@@ -4917,7 +4930,7 @@ void bfq_put_queue(struct bfq_queue *bfqq) + bfqg_and_blkg_put(bfqg); + } + +-static void bfq_put_cooperator(struct bfq_queue *bfqq) ++void bfq_put_cooperator(struct bfq_queue *bfqq) + { + struct bfq_queue *__bfqq, *next; + +@@ -5149,14 +5162,7 @@ static struct bfq_queue *bfq_get_queue(struct bfq_data *bfqd, + struct bfq_queue *bfqq; + struct bfq_group *bfqg; + +- rcu_read_lock(); +- +- bfqg = bfq_find_set_group(bfqd, __bio_blkcg(bio)); +- if (!bfqg) { +- bfqq = &bfqd->oom_bfqq; +- goto out; +- } +- ++ bfqg = bfq_bio_bfqg(bfqd, bio); + if (!is_sync) { + async_bfqq = bfq_async_queue_prio(bfqd, bfqg, ioprio_class, + ioprio); +@@ -5200,7 +5206,6 @@ static struct bfq_queue *bfq_get_queue(struct bfq_data *bfqd, + out: + bfqq->ref++; /* get a process reference to this queue */ + bfq_log_bfqq(bfqd, bfqq, "get_queue, at end: %p, %d", bfqq, bfqq->ref); +- rcu_read_unlock(); + return bfqq; + } + +@@ -5503,6 +5508,8 @@ static inline void bfq_update_insert_stats(struct request_queue *q, + unsigned int cmd_flags) {} + #endif /* CONFIG_BFQ_CGROUP_DEBUG */ + ++static struct bfq_queue *bfq_init_rq(struct request *rq); ++ + static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq, + bool at_head) + { +@@ -5517,17 +5524,14 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq, + bfqg_stats_update_legacy_io(q, rq); + #endif + spin_lock_irq(&bfqd->lock); ++ bfqq = bfq_init_rq(rq); + if (blk_mq_sched_try_insert_merge(q, rq)) { + spin_unlock_irq(&bfqd->lock); + return; + } + +- spin_unlock_irq(&bfqd->lock); +- + blk_mq_sched_request_inserted(rq); + +- spin_lock_irq(&bfqd->lock); +- bfqq = bfq_init_rq(rq); + if (!bfqq || at_head || blk_rq_is_passthrough(rq)) { + if (at_head) + list_add(&rq->queuelist, &bfqd->dispatch); +diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h +index 703895224562c..2a4a6f44efffe 100644 +--- a/block/bfq-iosched.h ++++ b/block/bfq-iosched.h +@@ -901,6 +901,8 @@ struct bfq_group { + + /* reference counter (see comments in bfq_bic_update_cgroup) */ + int ref; ++ /* Is bfq_group still online? */ ++ bool online; + + struct bfq_entity entity; + struct bfq_sched_data sched_data; +@@ -954,6 +956,7 @@ void bfq_weights_tree_remove(struct bfq_data *bfqd, + void bfq_bfqq_expire(struct bfq_data *bfqd, struct bfq_queue *bfqq, + bool compensate, enum bfqq_expiration reason); + void bfq_put_queue(struct bfq_queue *bfqq); ++void bfq_put_cooperator(struct bfq_queue *bfqq); + void bfq_end_wr_async_queues(struct bfq_data *bfqd, struct bfq_group *bfqg); + void bfq_release_process_ref(struct bfq_data *bfqd, struct bfq_queue *bfqq); + void bfq_schedule_dispatch(struct bfq_data *bfqd); +@@ -981,8 +984,7 @@ void bfq_bfqq_move(struct bfq_data *bfqd, struct bfq_queue *bfqq, + void bfq_init_entity(struct bfq_entity *entity, struct bfq_group *bfqg); + void bfq_bic_update_cgroup(struct bfq_io_cq *bic, struct bio *bio); + void bfq_end_wr_async(struct bfq_data *bfqd); +-struct bfq_group *bfq_find_set_group(struct bfq_data *bfqd, +- struct blkcg *blkcg); ++struct bfq_group *bfq_bio_bfqg(struct bfq_data *bfqd, struct bio *bio); + struct blkcg_gq *bfqg_to_blkg(struct bfq_group *bfqg); + struct bfq_group *bfqq_group(struct bfq_queue *bfqq); + struct bfq_group *bfq_create_group_hierarchy(struct bfq_data *bfqd, int node); +diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c +index 5b19665bc486a..484c6b2dd264e 100644 +--- a/block/blk-cgroup.c ++++ b/block/blk-cgroup.c +@@ -1892,12 +1892,8 @@ EXPORT_SYMBOL_GPL(bio_associate_blkg); + */ + void bio_clone_blkg_association(struct bio *dst, struct bio *src) + { +- if (src->bi_blkg) { +- if (dst->bi_blkg) +- blkg_put(dst->bi_blkg); +- blkg_get(src->bi_blkg); +- dst->bi_blkg = src->bi_blkg; +- } ++ if (src->bi_blkg) ++ bio_associate_blkg_from_css(dst, &bio_blkcg(src)->css); + } + EXPORT_SYMBOL_GPL(bio_clone_blkg_association); + +diff --git a/block/blk-iolatency.c b/block/blk-iolatency.c +index d8b0d8bd132bc..74511a060d598 100644 +--- a/block/blk-iolatency.c ++++ b/block/blk-iolatency.c +@@ -86,7 +86,17 @@ struct iolatency_grp; + struct blk_iolatency { + struct rq_qos rqos; + struct timer_list timer; +- atomic_t enabled; ++ ++ /* ++ * ->enabled is the master enable switch gating the throttling logic and ++ * inflight tracking. The number of cgroups which have iolat enabled is ++ * tracked in ->enable_cnt, and ->enable is flipped on/off accordingly ++ * from ->enable_work with the request_queue frozen. For details, See ++ * blkiolatency_enable_work_fn(). ++ */ ++ bool enabled; ++ atomic_t enable_cnt; ++ struct work_struct enable_work; + }; + + static inline struct blk_iolatency *BLKIOLATENCY(struct rq_qos *rqos) +@@ -94,11 +104,6 @@ static inline struct blk_iolatency *BLKIOLATENCY(struct rq_qos *rqos) + return container_of(rqos, struct blk_iolatency, rqos); + } + +-static inline bool blk_iolatency_enabled(struct blk_iolatency *blkiolat) +-{ +- return atomic_read(&blkiolat->enabled) > 0; +-} +- + struct child_latency_info { + spinlock_t lock; + +@@ -463,7 +468,7 @@ static void blkcg_iolatency_throttle(struct rq_qos *rqos, struct bio *bio) + struct blkcg_gq *blkg = bio->bi_blkg; + bool issue_as_root = bio_issue_as_root_blkg(bio); + +- if (!blk_iolatency_enabled(blkiolat)) ++ if (!blkiolat->enabled) + return; + + while (blkg && blkg->parent) { +@@ -593,7 +598,6 @@ static void blkcg_iolatency_done_bio(struct rq_qos *rqos, struct bio *bio) + u64 window_start; + u64 now; + bool issue_as_root = bio_issue_as_root_blkg(bio); +- bool enabled = false; + int inflight = 0; + + blkg = bio->bi_blkg; +@@ -604,8 +608,7 @@ static void blkcg_iolatency_done_bio(struct rq_qos *rqos, struct bio *bio) + if (!iolat) + return; + +- enabled = blk_iolatency_enabled(iolat->blkiolat); +- if (!enabled) ++ if (!iolat->blkiolat->enabled) + return; + + now = ktime_to_ns(ktime_get()); +@@ -644,6 +647,7 @@ static void blkcg_iolatency_exit(struct rq_qos *rqos) + struct blk_iolatency *blkiolat = BLKIOLATENCY(rqos); + + del_timer_sync(&blkiolat->timer); ++ flush_work(&blkiolat->enable_work); + blkcg_deactivate_policy(rqos->q, &blkcg_policy_iolatency); + kfree(blkiolat); + } +@@ -715,6 +719,44 @@ next: + rcu_read_unlock(); + } + ++/** ++ * blkiolatency_enable_work_fn - Enable or disable iolatency on the device ++ * @work: enable_work of the blk_iolatency of interest ++ * ++ * iolatency needs to keep track of the number of in-flight IOs per cgroup. This ++ * is relatively expensive as it involves walking up the hierarchy twice for ++ * every IO. Thus, if iolatency is not enabled in any cgroup for the device, we ++ * want to disable the in-flight tracking. ++ * ++ * We have to make sure that the counting is balanced - we don't want to leak ++ * the in-flight counts by disabling accounting in the completion path while IOs ++ * are in flight. This is achieved by ensuring that no IO is in flight by ++ * freezing the queue while flipping ->enabled. As this requires a sleepable ++ * context, ->enabled flipping is punted to this work function. ++ */ ++static void blkiolatency_enable_work_fn(struct work_struct *work) ++{ ++ struct blk_iolatency *blkiolat = container_of(work, struct blk_iolatency, ++ enable_work); ++ bool enabled; ++ ++ /* ++ * There can only be one instance of this function running for @blkiolat ++ * and it's guaranteed to be executed at least once after the latest ++ * ->enabled_cnt modification. Acting on the latest ->enable_cnt is ++ * sufficient. ++ * ++ * Also, we know @blkiolat is safe to access as ->enable_work is flushed ++ * in blkcg_iolatency_exit(). ++ */ ++ enabled = atomic_read(&blkiolat->enable_cnt); ++ if (enabled != blkiolat->enabled) { ++ blk_mq_freeze_queue(blkiolat->rqos.q); ++ blkiolat->enabled = enabled; ++ blk_mq_unfreeze_queue(blkiolat->rqos.q); ++ } ++} ++ + int blk_iolatency_init(struct request_queue *q) + { + struct blk_iolatency *blkiolat; +@@ -740,17 +782,15 @@ int blk_iolatency_init(struct request_queue *q) + } + + timer_setup(&blkiolat->timer, blkiolatency_timer_fn, 0); ++ INIT_WORK(&blkiolat->enable_work, blkiolatency_enable_work_fn); + + return 0; + } + +-/* +- * return 1 for enabling iolatency, return -1 for disabling iolatency, otherwise +- * return 0. +- */ +-static int iolatency_set_min_lat_nsec(struct blkcg_gq *blkg, u64 val) ++static void iolatency_set_min_lat_nsec(struct blkcg_gq *blkg, u64 val) + { + struct iolatency_grp *iolat = blkg_to_lat(blkg); ++ struct blk_iolatency *blkiolat = iolat->blkiolat; + u64 oldval = iolat->min_lat_nsec; + + iolat->min_lat_nsec = val; +@@ -758,13 +798,15 @@ static int iolatency_set_min_lat_nsec(struct blkcg_gq *blkg, u64 val) + iolat->cur_win_nsec = min_t(u64, iolat->cur_win_nsec, + BLKIOLATENCY_MAX_WIN_SIZE); + +- if (!oldval && val) +- return 1; ++ if (!oldval && val) { ++ if (atomic_inc_return(&blkiolat->enable_cnt) == 1) ++ schedule_work(&blkiolat->enable_work); ++ } + if (oldval && !val) { + blkcg_clear_delay(blkg); +- return -1; ++ if (atomic_dec_return(&blkiolat->enable_cnt) == 0) ++ schedule_work(&blkiolat->enable_work); + } +- return 0; + } + + static void iolatency_clear_scaling(struct blkcg_gq *blkg) +@@ -796,7 +838,6 @@ static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf, + u64 lat_val = 0; + u64 oldval; + int ret; +- int enable = 0; + + ret = blkg_conf_prep(blkcg, &blkcg_policy_iolatency, buf, &ctx); + if (ret) +@@ -831,41 +872,12 @@ static ssize_t iolatency_set_limit(struct kernfs_open_file *of, char *buf, + blkg = ctx.blkg; + oldval = iolat->min_lat_nsec; + +- enable = iolatency_set_min_lat_nsec(blkg, lat_val); +- if (enable) { +- if (!blk_get_queue(blkg->q)) { +- ret = -ENODEV; +- goto out; +- } +- +- blkg_get(blkg); +- } +- +- if (oldval != iolat->min_lat_nsec) { ++ iolatency_set_min_lat_nsec(blkg, lat_val); ++ if (oldval != iolat->min_lat_nsec) + iolatency_clear_scaling(blkg); +- } +- + ret = 0; + out: + blkg_conf_finish(&ctx); +- if (ret == 0 && enable) { +- struct iolatency_grp *tmp = blkg_to_lat(blkg); +- struct blk_iolatency *blkiolat = tmp->blkiolat; +- +- blk_mq_freeze_queue(blkg->q); +- +- if (enable == 1) +- atomic_inc(&blkiolat->enabled); +- else if (enable == -1) +- atomic_dec(&blkiolat->enabled); +- else +- WARN_ON_ONCE(1); +- +- blk_mq_unfreeze_queue(blkg->q); +- +- blkg_put(blkg); +- blk_put_queue(blkg->q); +- } + return ret ?: nbytes; + } + +@@ -1006,14 +1018,8 @@ static void iolatency_pd_offline(struct blkg_policy_data *pd) + { + struct iolatency_grp *iolat = pd_to_lat(pd); + struct blkcg_gq *blkg = lat_to_blkg(iolat); +- struct blk_iolatency *blkiolat = iolat->blkiolat; +- int ret; + +- ret = iolatency_set_min_lat_nsec(blkg, 0); +- if (ret == 1) +- atomic_inc(&blkiolat->enabled); +- if (ret == -1) +- atomic_dec(&blkiolat->enabled); ++ iolatency_set_min_lat_nsec(blkg, 0); + iolatency_clear_scaling(blkg); + } + +diff --git a/crypto/cryptd.c b/crypto/cryptd.c +index a1bea0f4baa88..668095eca0faf 100644 +--- a/crypto/cryptd.c ++++ b/crypto/cryptd.c +@@ -39,6 +39,10 @@ struct cryptd_cpu_queue { + }; + + struct cryptd_queue { ++ /* ++ * Protected by disabling BH to allow enqueueing from softinterrupt and ++ * dequeuing from kworker (cryptd_queue_worker()). ++ */ + struct cryptd_cpu_queue __percpu *cpu_queue; + }; + +@@ -125,28 +129,28 @@ static void cryptd_fini_queue(struct cryptd_queue *queue) + static int cryptd_enqueue_request(struct cryptd_queue *queue, + struct crypto_async_request *request) + { +- int cpu, err; ++ int err; + struct cryptd_cpu_queue *cpu_queue; + refcount_t *refcnt; + +- cpu = get_cpu(); ++ local_bh_disable(); + cpu_queue = this_cpu_ptr(queue->cpu_queue); + err = crypto_enqueue_request(&cpu_queue->queue, request); + + refcnt = crypto_tfm_ctx(request->tfm); + + if (err == -ENOSPC) +- goto out_put_cpu; ++ goto out; + +- queue_work_on(cpu, cryptd_wq, &cpu_queue->work); ++ queue_work_on(smp_processor_id(), cryptd_wq, &cpu_queue->work); + + if (!refcount_read(refcnt)) +- goto out_put_cpu; ++ goto out; + + refcount_inc(refcnt); + +-out_put_cpu: +- put_cpu(); ++out: ++ local_bh_enable(); + + return err; + } +@@ -162,15 +166,10 @@ static void cryptd_queue_worker(struct work_struct *work) + cpu_queue = container_of(work, struct cryptd_cpu_queue, work); + /* + * Only handle one request at a time to avoid hogging crypto workqueue. +- * preempt_disable/enable is used to prevent being preempted by +- * cryptd_enqueue_request(). local_bh_disable/enable is used to prevent +- * cryptd_enqueue_request() being accessed from software interrupts. + */ + local_bh_disable(); +- preempt_disable(); + backlog = crypto_get_backlog(&cpu_queue->queue); + req = crypto_dequeue_request(&cpu_queue->queue); +- preempt_enable(); + local_bh_enable(); + + if (!req) +diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c +index bd16340088389..619d34d73dcfe 100644 +--- a/drivers/acpi/property.c ++++ b/drivers/acpi/property.c +@@ -433,6 +433,16 @@ void acpi_init_properties(struct acpi_device *adev) + acpi_extract_apple_properties(adev); + } + ++static void acpi_free_device_properties(struct list_head *list) ++{ ++ struct acpi_device_properties *props, *tmp; ++ ++ list_for_each_entry_safe(props, tmp, list, list) { ++ list_del(&props->list); ++ kfree(props); ++ } ++} ++ + static void acpi_destroy_nondev_subnodes(struct list_head *list) + { + struct acpi_data_node *dn, *next; +@@ -445,22 +455,18 @@ static void acpi_destroy_nondev_subnodes(struct list_head *list) + wait_for_completion(&dn->kobj_done); + list_del(&dn->sibling); + ACPI_FREE((void *)dn->data.pointer); ++ acpi_free_device_properties(&dn->data.properties); + kfree(dn); + } + } + + void acpi_free_properties(struct acpi_device *adev) + { +- struct acpi_device_properties *props, *tmp; +- + acpi_destroy_nondev_subnodes(&adev->data.subnodes); + ACPI_FREE((void *)adev->data.pointer); + adev->data.of_compatible = NULL; + adev->data.pointer = NULL; +- list_for_each_entry_safe(props, tmp, &adev->data.properties, list) { +- list_del(&props->list); +- kfree(props); +- } ++ acpi_free_device_properties(&adev->data.properties); + } + + /** +diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c +index 503935b1deeb1..cfda5720de027 100644 +--- a/drivers/acpi/sleep.c ++++ b/drivers/acpi/sleep.c +@@ -377,6 +377,18 @@ static const struct dmi_system_id acpisleep_dmi_table[] __initconst = { + DMI_MATCH(DMI_PRODUCT_NAME, "20GGA00L00"), + }, + }, ++ /* ++ * ASUS B1400CEAE hangs on resume from suspend (see ++ * https://bugzilla.kernel.org/show_bug.cgi?id=215742). ++ */ ++ { ++ .callback = init_default_s3, ++ .ident = "ASUS B1400CEAE", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), ++ DMI_MATCH(DMI_PRODUCT_NAME, "ASUS EXPERTBOOK B1400CEAE"), ++ }, ++ }, + {}, + }; + +diff --git a/drivers/base/memory.c b/drivers/base/memory.c +index de058d15b33ea..49eb14271f287 100644 +--- a/drivers/base/memory.c ++++ b/drivers/base/memory.c +@@ -560,10 +560,9 @@ int register_memory(struct memory_block *memory) + } + ret = xa_err(xa_store(&memory_blocks, memory->dev.id, memory, + GFP_KERNEL)); +- if (ret) { +- put_device(&memory->dev); ++ if (ret) + device_unregister(&memory->dev); +- } ++ + return ret; + } + +diff --git a/drivers/base/node.c b/drivers/base/node.c +index 21965de8538be..5f745c906c330 100644 +--- a/drivers/base/node.c ++++ b/drivers/base/node.c +@@ -655,6 +655,7 @@ static int register_node(struct node *node, int num) + */ + void unregister_node(struct node *node) + { ++ compaction_unregister_node(node); + hugetlb_unregister_node(node); /* no-op, if memoryless node */ + node_remove_accesses(node); + node_remove_caches(node); +diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c +index 3cdbd81f983fa..407527ff6b1f6 100644 +--- a/drivers/block/drbd/drbd_main.c ++++ b/drivers/block/drbd/drbd_main.c +@@ -3631,9 +3631,8 @@ const char *cmdname(enum drbd_packet cmd) + * when we want to support more than + * one PRO_VERSION */ + static const char *cmdnames[] = { ++ + [P_DATA] = "Data", +- [P_WSAME] = "WriteSame", +- [P_TRIM] = "Trim", + [P_DATA_REPLY] = "DataReply", + [P_RS_DATA_REPLY] = "RSDataReply", + [P_BARRIER] = "Barrier", +@@ -3644,7 +3643,6 @@ const char *cmdname(enum drbd_packet cmd) + [P_DATA_REQUEST] = "DataRequest", + [P_RS_DATA_REQUEST] = "RSDataRequest", + [P_SYNC_PARAM] = "SyncParam", +- [P_SYNC_PARAM89] = "SyncParam89", + [P_PROTOCOL] = "ReportProtocol", + [P_UUIDS] = "ReportUUIDs", + [P_SIZES] = "ReportSizes", +@@ -3652,6 +3650,7 @@ const char *cmdname(enum drbd_packet cmd) + [P_SYNC_UUID] = "ReportSyncUUID", + [P_AUTH_CHALLENGE] = "AuthChallenge", + [P_AUTH_RESPONSE] = "AuthResponse", ++ [P_STATE_CHG_REQ] = "StateChgRequest", + [P_PING] = "Ping", + [P_PING_ACK] = "PingAck", + [P_RECV_ACK] = "RecvAck", +@@ -3662,24 +3661,26 @@ const char *cmdname(enum drbd_packet cmd) + [P_NEG_DREPLY] = "NegDReply", + [P_NEG_RS_DREPLY] = "NegRSDReply", + [P_BARRIER_ACK] = "BarrierAck", +- [P_STATE_CHG_REQ] = "StateChgRequest", + [P_STATE_CHG_REPLY] = "StateChgReply", + [P_OV_REQUEST] = "OVRequest", + [P_OV_REPLY] = "OVReply", + [P_OV_RESULT] = "OVResult", + [P_CSUM_RS_REQUEST] = "CsumRSRequest", + [P_RS_IS_IN_SYNC] = "CsumRSIsInSync", ++ [P_SYNC_PARAM89] = "SyncParam89", + [P_COMPRESSED_BITMAP] = "CBitmap", + [P_DELAY_PROBE] = "DelayProbe", + [P_OUT_OF_SYNC] = "OutOfSync", +- [P_RETRY_WRITE] = "RetryWrite", + [P_RS_CANCEL] = "RSCancel", + [P_CONN_ST_CHG_REQ] = "conn_st_chg_req", + [P_CONN_ST_CHG_REPLY] = "conn_st_chg_reply", + [P_RETRY_WRITE] = "retry_write", + [P_PROTOCOL_UPDATE] = "protocol_update", ++ [P_TRIM] = "Trim", + [P_RS_THIN_REQ] = "rs_thin_req", + [P_RS_DEALLOCATED] = "rs_deallocated", ++ [P_WSAME] = "WriteSame", ++ [P_ZEROES] = "Zeroes", + + /* enum drbd_packet, but not commands - obsoleted flags: + * P_MAY_IGNORE +diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c +index 59c452fff8352..ecde800ba2102 100644 +--- a/drivers/block/nbd.c ++++ b/drivers/block/nbd.c +@@ -880,11 +880,15 @@ static int wait_for_reconnect(struct nbd_device *nbd) + struct nbd_config *config = nbd->config; + if (!config->dead_conn_timeout) + return 0; +- if (test_bit(NBD_RT_DISCONNECTED, &config->runtime_flags)) ++ ++ if (!wait_event_timeout(config->conn_wait, ++ test_bit(NBD_RT_DISCONNECTED, ++ &config->runtime_flags) || ++ atomic_read(&config->live_connections) > 0, ++ config->dead_conn_timeout)) + return 0; +- return wait_event_timeout(config->conn_wait, +- atomic_read(&config->live_connections) > 0, +- config->dead_conn_timeout) > 0; ++ ++ return !test_bit(NBD_RT_DISCONNECTED, &config->runtime_flags); + } + + static int nbd_handle_cmd(struct nbd_cmd *cmd, int index) +@@ -2029,6 +2033,7 @@ static void nbd_disconnect_and_put(struct nbd_device *nbd) + mutex_lock(&nbd->config_lock); + nbd_disconnect(nbd); + sock_shutdown(nbd); ++ wake_up(&nbd->config->conn_wait); + /* + * Make sure recv thread has finished, so it does not drop the last + * config ref and try to destroy the workqueue from inside the work +diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c +index 02e2056780ad2..9b54eec9b17eb 100644 +--- a/drivers/block/virtio_blk.c ++++ b/drivers/block/virtio_blk.c +@@ -865,11 +865,12 @@ static int virtblk_probe(struct virtio_device *vdev) + blk_queue_io_opt(q, blk_size * opt_io_size); + + if (virtio_has_feature(vdev, VIRTIO_BLK_F_DISCARD)) { +- q->limits.discard_granularity = blk_size; +- + virtio_cread(vdev, struct virtio_blk_config, + discard_sector_alignment, &v); +- q->limits.discard_alignment = v ? v << SECTOR_SHIFT : 0; ++ if (v) ++ q->limits.discard_granularity = v << SECTOR_SHIFT; ++ else ++ q->limits.discard_granularity = blk_size; + + virtio_cread(vdev, struct virtio_blk_config, + max_discard_sectors, &v); +diff --git a/drivers/char/hw_random/omap3-rom-rng.c b/drivers/char/hw_random/omap3-rom-rng.c +index e0d77fa048fb6..f06e4f95114f9 100644 +--- a/drivers/char/hw_random/omap3-rom-rng.c ++++ b/drivers/char/hw_random/omap3-rom-rng.c +@@ -92,7 +92,7 @@ static int __maybe_unused omap_rom_rng_runtime_resume(struct device *dev) + + r = ddata->rom_rng_call(0, 0, RNG_GEN_PRNG_HW_INIT); + if (r != 0) { +- clk_disable(ddata->clk); ++ clk_disable_unprepare(ddata->clk); + dev_err(dev, "HW init failed: %d\n", r); + + return -EIO; +diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c +index 8f147274f826a..05e7339752ac3 100644 +--- a/drivers/char/ipmi/ipmi_msghandler.c ++++ b/drivers/char/ipmi/ipmi_msghandler.c +@@ -11,8 +11,8 @@ + * Copyright 2002 MontaVista Software Inc. + */ + +-#define pr_fmt(fmt) "%s" fmt, "IPMI message handler: " +-#define dev_fmt pr_fmt ++#define pr_fmt(fmt) "IPMI message handler: " fmt ++#define dev_fmt(fmt) pr_fmt(fmt) + + #include <linux/module.h> + #include <linux/errno.h> +diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c +index 3de679723648b..4771397495130 100644 +--- a/drivers/char/ipmi/ipmi_ssif.c ++++ b/drivers/char/ipmi/ipmi_ssif.c +@@ -840,6 +840,14 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result, + break; + + case SSIF_GETTING_EVENTS: ++ if (!msg) { ++ /* Should never happen, but just in case. */ ++ dev_warn(&ssif_info->client->dev, ++ "No message set while getting events\n"); ++ ipmi_ssif_unlock_cond(ssif_info, flags); ++ break; ++ } ++ + if ((result < 0) || (len < 3) || (msg->rsp[2] != 0)) { + /* Error getting event, probably done. */ + msg->done(msg); +@@ -864,6 +872,14 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result, + break; + + case SSIF_GETTING_MESSAGES: ++ if (!msg) { ++ /* Should never happen, but just in case. */ ++ dev_warn(&ssif_info->client->dev, ++ "No message set while getting messages\n"); ++ ipmi_ssif_unlock_cond(ssif_info, flags); ++ break; ++ } ++ + if ((result < 0) || (len < 3) || (msg->rsp[2] != 0)) { + /* Error getting event, probably done. */ + msg->done(msg); +@@ -887,6 +903,13 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result, + deliver_recv_msg(ssif_info, msg); + } + break; ++ ++ default: ++ /* Should never happen, but just in case. */ ++ dev_warn(&ssif_info->client->dev, ++ "Invalid state in message done handling: %d\n", ++ ssif_info->ssif_state); ++ ipmi_ssif_unlock_cond(ssif_info, flags); + } + + flags = ipmi_ssif_lock_cond(ssif_info, &oflags); +diff --git a/drivers/char/random.c b/drivers/char/random.c +index c206db96f60a1..5776dfd4a6fca 100644 +--- a/drivers/char/random.c ++++ b/drivers/char/random.c +@@ -79,8 +79,7 @@ static enum { + CRNG_EARLY = 1, /* At least POOL_EARLY_BITS collected */ + CRNG_READY = 2 /* Fully initialized with POOL_READY_BITS collected */ + } crng_init __read_mostly = CRNG_EMPTY; +-static DEFINE_STATIC_KEY_FALSE(crng_is_ready); +-#define crng_ready() (static_branch_likely(&crng_is_ready) || crng_init >= CRNG_READY) ++#define crng_ready() (likely(crng_init >= CRNG_READY)) + /* Various types of waiters for crng_init->CRNG_READY transition. */ + static DECLARE_WAIT_QUEUE_HEAD(crng_init_wait); + static struct fasync_struct *fasync; +@@ -110,11 +109,6 @@ bool rng_is_initialized(void) + } + EXPORT_SYMBOL(rng_is_initialized); + +-static void __cold crng_set_ready(struct work_struct *work) +-{ +- static_branch_enable(&crng_is_ready); +-} +- + /* Used by wait_for_random_bytes(), and considered an entropy collector, below. */ + static void try_to_generate_entropy(void); + +@@ -268,7 +262,7 @@ static void crng_reseed(void) + ++next_gen; + WRITE_ONCE(base_crng.generation, next_gen); + WRITE_ONCE(base_crng.birth, jiffies); +- if (!static_branch_likely(&crng_is_ready)) ++ if (!crng_ready()) + crng_init = CRNG_READY; + spin_unlock_irqrestore(&base_crng.lock, flags); + memzero_explicit(key, sizeof(key)); +@@ -711,7 +705,6 @@ static void extract_entropy(void *buf, size_t len) + + static void __cold _credit_init_bits(size_t bits) + { +- static struct execute_work set_ready; + unsigned int new, orig, add; + unsigned long flags; + +@@ -727,7 +720,6 @@ static void __cold _credit_init_bits(size_t bits) + + if (orig < POOL_READY_BITS && new >= POOL_READY_BITS) { + crng_reseed(); /* Sets crng_init to CRNG_READY under base_crng.lock. */ +- execute_in_process_context(crng_set_ready, &set_ready); + process_random_ready_list(); + wake_up_interruptible(&crng_init_wait); + kill_fasync(&fasync, SIGIO, POLL_IN); +diff --git a/drivers/cpufreq/mediatek-cpufreq.c b/drivers/cpufreq/mediatek-cpufreq.c +index a310372dc53e9..82f6592bbadb0 100644 +--- a/drivers/cpufreq/mediatek-cpufreq.c ++++ b/drivers/cpufreq/mediatek-cpufreq.c +@@ -44,6 +44,8 @@ struct mtk_cpu_dvfs_info { + bool need_voltage_tracking; + }; + ++static struct platform_device *cpufreq_pdev; ++ + static LIST_HEAD(dvfs_info_list); + + static struct mtk_cpu_dvfs_info *mtk_cpu_dvfs_info_lookup(int cpu) +@@ -546,7 +548,6 @@ static int __init mtk_cpufreq_driver_init(void) + { + struct device_node *np; + const struct of_device_id *match; +- struct platform_device *pdev; + int err; + + np = of_find_node_by_path("/"); +@@ -570,15 +571,23 @@ static int __init mtk_cpufreq_driver_init(void) + * and the device registration codes are put here to handle defer + * probing. + */ +- pdev = platform_device_register_simple("mtk-cpufreq", -1, NULL, 0); +- if (IS_ERR(pdev)) { ++ cpufreq_pdev = platform_device_register_simple("mtk-cpufreq", -1, NULL, 0); ++ if (IS_ERR(cpufreq_pdev)) { + pr_err("failed to register mtk-cpufreq platform device\n"); +- return PTR_ERR(pdev); ++ platform_driver_unregister(&mtk_cpufreq_platdrv); ++ return PTR_ERR(cpufreq_pdev); + } + + return 0; + } +-device_initcall(mtk_cpufreq_driver_init); ++module_init(mtk_cpufreq_driver_init) ++ ++static void __exit mtk_cpufreq_driver_exit(void) ++{ ++ platform_device_unregister(cpufreq_pdev); ++ platform_driver_unregister(&mtk_cpufreq_platdrv); ++} ++module_exit(mtk_cpufreq_driver_exit) + + MODULE_DESCRIPTION("MediaTek CPUFreq driver"); + MODULE_AUTHOR("Pi-Cheng Chen <pi-cheng.chen@linaro.org>"); +diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +index f783748462f94..7b3be3dc2210e 100644 +--- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c ++++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +@@ -93,6 +93,68 @@ static int sun8i_ss_cipher_fallback(struct skcipher_request *areq) + return err; + } + ++static int sun8i_ss_setup_ivs(struct skcipher_request *areq) ++{ ++ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq); ++ struct sun8i_cipher_tfm_ctx *op = crypto_skcipher_ctx(tfm); ++ struct sun8i_ss_dev *ss = op->ss; ++ struct sun8i_cipher_req_ctx *rctx = skcipher_request_ctx(areq); ++ struct scatterlist *sg = areq->src; ++ unsigned int todo, offset; ++ unsigned int len = areq->cryptlen; ++ unsigned int ivsize = crypto_skcipher_ivsize(tfm); ++ struct sun8i_ss_flow *sf = &ss->flows[rctx->flow]; ++ int i = 0; ++ u32 a; ++ int err; ++ ++ rctx->ivlen = ivsize; ++ if (rctx->op_dir & SS_DECRYPTION) { ++ offset = areq->cryptlen - ivsize; ++ scatterwalk_map_and_copy(sf->biv, areq->src, offset, ++ ivsize, 0); ++ } ++ ++ /* we need to copy all IVs from source in case DMA is bi-directionnal */ ++ while (sg && len) { ++ if (sg_dma_len(sg) == 0) { ++ sg = sg_next(sg); ++ continue; ++ } ++ if (i == 0) ++ memcpy(sf->iv[0], areq->iv, ivsize); ++ a = dma_map_single(ss->dev, sf->iv[i], ivsize, DMA_TO_DEVICE); ++ if (dma_mapping_error(ss->dev, a)) { ++ memzero_explicit(sf->iv[i], ivsize); ++ dev_err(ss->dev, "Cannot DMA MAP IV\n"); ++ err = -EFAULT; ++ goto dma_iv_error; ++ } ++ rctx->p_iv[i] = a; ++ /* we need to setup all others IVs only in the decrypt way */ ++ if (rctx->op_dir & SS_ENCRYPTION) ++ return 0; ++ todo = min(len, sg_dma_len(sg)); ++ len -= todo; ++ i++; ++ if (i < MAX_SG) { ++ offset = sg->length - ivsize; ++ scatterwalk_map_and_copy(sf->iv[i], sg, offset, ivsize, 0); ++ } ++ rctx->niv = i; ++ sg = sg_next(sg); ++ } ++ ++ return 0; ++dma_iv_error: ++ i--; ++ while (i >= 0) { ++ dma_unmap_single(ss->dev, rctx->p_iv[i], ivsize, DMA_TO_DEVICE); ++ memzero_explicit(sf->iv[i], ivsize); ++ } ++ return err; ++} ++ + static int sun8i_ss_cipher(struct skcipher_request *areq) + { + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq); +@@ -101,9 +163,9 @@ static int sun8i_ss_cipher(struct skcipher_request *areq) + struct sun8i_cipher_req_ctx *rctx = skcipher_request_ctx(areq); + struct skcipher_alg *alg = crypto_skcipher_alg(tfm); + struct sun8i_ss_alg_template *algt; ++ struct sun8i_ss_flow *sf = &ss->flows[rctx->flow]; + struct scatterlist *sg; + unsigned int todo, len, offset, ivsize; +- void *backup_iv = NULL; + int nr_sgs = 0; + int nr_sgd = 0; + int err = 0; +@@ -134,30 +196,9 @@ static int sun8i_ss_cipher(struct skcipher_request *areq) + + ivsize = crypto_skcipher_ivsize(tfm); + if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) { +- rctx->ivlen = ivsize; +- rctx->biv = kzalloc(ivsize, GFP_KERNEL | GFP_DMA); +- if (!rctx->biv) { +- err = -ENOMEM; ++ err = sun8i_ss_setup_ivs(areq); ++ if (err) + goto theend_key; +- } +- if (rctx->op_dir & SS_DECRYPTION) { +- backup_iv = kzalloc(ivsize, GFP_KERNEL); +- if (!backup_iv) { +- err = -ENOMEM; +- goto theend_key; +- } +- offset = areq->cryptlen - ivsize; +- scatterwalk_map_and_copy(backup_iv, areq->src, offset, +- ivsize, 0); +- } +- memcpy(rctx->biv, areq->iv, ivsize); +- rctx->p_iv = dma_map_single(ss->dev, rctx->biv, rctx->ivlen, +- DMA_TO_DEVICE); +- if (dma_mapping_error(ss->dev, rctx->p_iv)) { +- dev_err(ss->dev, "Cannot DMA MAP IV\n"); +- err = -ENOMEM; +- goto theend_iv; +- } + } + if (areq->src == areq->dst) { + nr_sgs = dma_map_sg(ss->dev, areq->src, sg_nents(areq->src), +@@ -240,21 +281,19 @@ theend_sgs: + } + + theend_iv: +- if (rctx->p_iv) +- dma_unmap_single(ss->dev, rctx->p_iv, rctx->ivlen, +- DMA_TO_DEVICE); +- + if (areq->iv && ivsize > 0) { +- if (rctx->biv) { +- offset = areq->cryptlen - ivsize; +- if (rctx->op_dir & SS_DECRYPTION) { +- memcpy(areq->iv, backup_iv, ivsize); +- kfree_sensitive(backup_iv); +- } else { +- scatterwalk_map_and_copy(areq->iv, areq->dst, offset, +- ivsize, 0); +- } +- kfree(rctx->biv); ++ for (i = 0; i < rctx->niv; i++) { ++ dma_unmap_single(ss->dev, rctx->p_iv[i], ivsize, DMA_TO_DEVICE); ++ memzero_explicit(sf->iv[i], ivsize); ++ } ++ ++ offset = areq->cryptlen - ivsize; ++ if (rctx->op_dir & SS_DECRYPTION) { ++ memcpy(areq->iv, sf->biv, ivsize); ++ memzero_explicit(sf->biv, ivsize); ++ } else { ++ scatterwalk_map_and_copy(areq->iv, areq->dst, offset, ++ ivsize, 0); + } + } + +diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +index 319fe3279a716..6575305786436 100644 +--- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c ++++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-core.c +@@ -66,6 +66,7 @@ int sun8i_ss_run_task(struct sun8i_ss_dev *ss, struct sun8i_cipher_req_ctx *rctx + const char *name) + { + int flow = rctx->flow; ++ unsigned int ivlen = rctx->ivlen; + u32 v = SS_START; + int i; + +@@ -104,15 +105,14 @@ int sun8i_ss_run_task(struct sun8i_ss_dev *ss, struct sun8i_cipher_req_ctx *rctx + mutex_lock(&ss->mlock); + writel(rctx->p_key, ss->base + SS_KEY_ADR_REG); + +- if (i == 0) { +- if (rctx->p_iv) +- writel(rctx->p_iv, ss->base + SS_IV_ADR_REG); +- } else { +- if (rctx->biv) { +- if (rctx->op_dir == SS_ENCRYPTION) +- writel(rctx->t_dst[i - 1].addr + rctx->t_dst[i - 1].len * 4 - rctx->ivlen, ss->base + SS_IV_ADR_REG); ++ if (ivlen) { ++ if (rctx->op_dir == SS_ENCRYPTION) { ++ if (i == 0) ++ writel(rctx->p_iv[0], ss->base + SS_IV_ADR_REG); + else +- writel(rctx->t_src[i - 1].addr + rctx->t_src[i - 1].len * 4 - rctx->ivlen, ss->base + SS_IV_ADR_REG); ++ writel(rctx->t_dst[i - 1].addr + rctx->t_dst[i - 1].len * 4 - ivlen, ss->base + SS_IV_ADR_REG); ++ } else { ++ writel(rctx->p_iv[i], ss->base + SS_IV_ADR_REG); + } + } + +@@ -464,7 +464,7 @@ static void sun8i_ss_free_flows(struct sun8i_ss_dev *ss, int i) + */ + static int allocate_flows(struct sun8i_ss_dev *ss) + { +- int i, err; ++ int i, j, err; + + ss->flows = devm_kcalloc(ss->dev, MAXFLOW, sizeof(struct sun8i_ss_flow), + GFP_KERNEL); +@@ -474,6 +474,18 @@ static int allocate_flows(struct sun8i_ss_dev *ss) + for (i = 0; i < MAXFLOW; i++) { + init_completion(&ss->flows[i].complete); + ++ ss->flows[i].biv = devm_kmalloc(ss->dev, AES_BLOCK_SIZE, ++ GFP_KERNEL | GFP_DMA); ++ if (!ss->flows[i].biv) ++ goto error_engine; ++ ++ for (j = 0; j < MAX_SG; j++) { ++ ss->flows[i].iv[j] = devm_kmalloc(ss->dev, AES_BLOCK_SIZE, ++ GFP_KERNEL | GFP_DMA); ++ if (!ss->flows[i].iv[j]) ++ goto error_engine; ++ } ++ + ss->flows[i].engine = crypto_engine_alloc_init(ss->dev, true); + if (!ss->flows[i].engine) { + dev_err(ss->dev, "Cannot allocate engine\n"); +diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +index c9edecd43ef96..55d652cd468be 100644 +--- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c ++++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-hash.c +@@ -379,13 +379,21 @@ int sun8i_ss_hash_run(struct crypto_engine *engine, void *breq) + } + + len = areq->nbytes; +- for_each_sg(areq->src, sg, nr_sgs, i) { ++ sg = areq->src; ++ i = 0; ++ while (len > 0 && sg) { ++ if (sg_dma_len(sg) == 0) { ++ sg = sg_next(sg); ++ continue; ++ } + rctx->t_src[i].addr = sg_dma_address(sg); + todo = min(len, sg_dma_len(sg)); + rctx->t_src[i].len = todo / 4; + len -= todo; + rctx->t_dst[i].addr = addr_res; + rctx->t_dst[i].len = digestsize / 4; ++ sg = sg_next(sg); ++ i++; + } + if (len > 0) { + dev_err(ss->dev, "remaining len %d\n", len); +diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +index 1a66457f4a205..49147195ecf6c 100644 +--- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h ++++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss.h +@@ -120,11 +120,15 @@ struct sginfo { + * @complete: completion for the current task on this flow + * @status: set to 1 by interrupt if task is done + * @stat_req: number of request done by this flow ++ * @iv: list of IV to use for each step ++ * @biv: buffer which contain the backuped IV + */ + struct sun8i_ss_flow { + struct crypto_engine *engine; + struct completion complete; + int status; ++ u8 *iv[MAX_SG]; ++ u8 *biv; + #ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG + unsigned long stat_req; + #endif +@@ -163,28 +167,28 @@ struct sun8i_ss_dev { + * @t_src: list of mapped SGs with their size + * @t_dst: list of mapped SGs with their size + * @p_key: DMA address of the key +- * @p_iv: DMA address of the IV ++ * @p_iv: DMA address of the IVs ++ * @niv: Number of IVs DMA mapped + * @method: current algorithm for this request + * @op_mode: op_mode for this request + * @op_dir: direction (encrypt vs decrypt) for this request + * @flow: the flow to use for this request +- * @ivlen: size of biv ++ * @ivlen: size of IVs + * @keylen: keylen for this request +- * @biv: buffer which contain the IV + * @fallback_req: request struct for invoking the fallback skcipher TFM + */ + struct sun8i_cipher_req_ctx { + struct sginfo t_src[MAX_SG]; + struct sginfo t_dst[MAX_SG]; + u32 p_key; +- u32 p_iv; ++ u32 p_iv[MAX_SG]; ++ int niv; + u32 method; + u32 op_mode; + u32 op_dir; + int flow; + unsigned int ivlen; + unsigned int keylen; +- void *biv; + struct skcipher_request fallback_req; // keep at the end + }; + +diff --git a/drivers/crypto/ccree/cc_buffer_mgr.c b/drivers/crypto/ccree/cc_buffer_mgr.c +index 11e0278c8631d..6140e49273226 100644 +--- a/drivers/crypto/ccree/cc_buffer_mgr.c ++++ b/drivers/crypto/ccree/cc_buffer_mgr.c +@@ -356,12 +356,14 @@ void cc_unmap_cipher_request(struct device *dev, void *ctx, + req_ctx->mlli_params.mlli_dma_addr); + } + +- dma_unmap_sg(dev, src, req_ctx->in_nents, DMA_BIDIRECTIONAL); +- dev_dbg(dev, "Unmapped req->src=%pK\n", sg_virt(src)); +- + if (src != dst) { +- dma_unmap_sg(dev, dst, req_ctx->out_nents, DMA_BIDIRECTIONAL); ++ dma_unmap_sg(dev, src, req_ctx->in_nents, DMA_TO_DEVICE); ++ dma_unmap_sg(dev, dst, req_ctx->out_nents, DMA_FROM_DEVICE); + dev_dbg(dev, "Unmapped req->dst=%pK\n", sg_virt(dst)); ++ dev_dbg(dev, "Unmapped req->src=%pK\n", sg_virt(src)); ++ } else { ++ dma_unmap_sg(dev, src, req_ctx->in_nents, DMA_BIDIRECTIONAL); ++ dev_dbg(dev, "Unmapped req->src=%pK\n", sg_virt(src)); + } + } + +@@ -377,6 +379,7 @@ int cc_map_cipher_request(struct cc_drvdata *drvdata, void *ctx, + u32 dummy = 0; + int rc = 0; + u32 mapped_nents = 0; ++ int src_direction = (src != dst ? DMA_TO_DEVICE : DMA_BIDIRECTIONAL); + + req_ctx->dma_buf_type = CC_DMA_BUF_DLLI; + mlli_params->curr_pool = NULL; +@@ -399,7 +402,7 @@ int cc_map_cipher_request(struct cc_drvdata *drvdata, void *ctx, + } + + /* Map the src SGL */ +- rc = cc_map_sg(dev, src, nbytes, DMA_BIDIRECTIONAL, &req_ctx->in_nents, ++ rc = cc_map_sg(dev, src, nbytes, src_direction, &req_ctx->in_nents, + LLI_MAX_NUM_OF_DATA_ENTRIES, &dummy, &mapped_nents); + if (rc) + goto cipher_exit; +@@ -416,7 +419,7 @@ int cc_map_cipher_request(struct cc_drvdata *drvdata, void *ctx, + } + } else { + /* Map the dst sg */ +- rc = cc_map_sg(dev, dst, nbytes, DMA_BIDIRECTIONAL, ++ rc = cc_map_sg(dev, dst, nbytes, DMA_FROM_DEVICE, + &req_ctx->out_nents, LLI_MAX_NUM_OF_DATA_ENTRIES, + &dummy, &mapped_nents); + if (rc) +@@ -456,6 +459,7 @@ void cc_unmap_aead_request(struct device *dev, struct aead_request *req) + struct aead_req_ctx *areq_ctx = aead_request_ctx(req); + unsigned int hw_iv_size = areq_ctx->hw_iv_size; + struct cc_drvdata *drvdata = dev_get_drvdata(dev); ++ int src_direction = (req->src != req->dst ? DMA_TO_DEVICE : DMA_BIDIRECTIONAL); + + if (areq_ctx->mac_buf_dma_addr) { + dma_unmap_single(dev, areq_ctx->mac_buf_dma_addr, +@@ -514,13 +518,11 @@ void cc_unmap_aead_request(struct device *dev, struct aead_request *req) + sg_virt(req->src), areq_ctx->src.nents, areq_ctx->assoc.nents, + areq_ctx->assoclen, req->cryptlen); + +- dma_unmap_sg(dev, req->src, areq_ctx->src.mapped_nents, +- DMA_BIDIRECTIONAL); ++ dma_unmap_sg(dev, req->src, areq_ctx->src.mapped_nents, src_direction); + if (req->src != req->dst) { + dev_dbg(dev, "Unmapping dst sgl: req->dst=%pK\n", + sg_virt(req->dst)); +- dma_unmap_sg(dev, req->dst, areq_ctx->dst.mapped_nents, +- DMA_BIDIRECTIONAL); ++ dma_unmap_sg(dev, req->dst, areq_ctx->dst.mapped_nents, DMA_FROM_DEVICE); + } + if (drvdata->coherent && + areq_ctx->gen_ctx.op_type == DRV_CRYPTO_DIRECTION_DECRYPT && +@@ -843,7 +845,7 @@ static int cc_aead_chain_data(struct cc_drvdata *drvdata, + else + size_for_map -= authsize; + +- rc = cc_map_sg(dev, req->dst, size_for_map, DMA_BIDIRECTIONAL, ++ rc = cc_map_sg(dev, req->dst, size_for_map, DMA_FROM_DEVICE, + &areq_ctx->dst.mapped_nents, + LLI_MAX_NUM_OF_DATA_ENTRIES, &dst_last_bytes, + &dst_mapped_nents); +@@ -1056,7 +1058,8 @@ int cc_map_aead_request(struct cc_drvdata *drvdata, struct aead_request *req) + size_to_map += authsize; + } + +- rc = cc_map_sg(dev, req->src, size_to_map, DMA_BIDIRECTIONAL, ++ rc = cc_map_sg(dev, req->src, size_to_map, ++ (req->src != req->dst ? DMA_TO_DEVICE : DMA_BIDIRECTIONAL), + &areq_ctx->src.mapped_nents, + (LLI_MAX_NUM_OF_ASSOC_DATA_ENTRIES + + LLI_MAX_NUM_OF_DATA_ENTRIES), +diff --git a/drivers/crypto/marvell/cesa/cipher.c b/drivers/crypto/marvell/cesa/cipher.c +index b4a6ff9dd6d5e..596a8c74e40a5 100644 +--- a/drivers/crypto/marvell/cesa/cipher.c ++++ b/drivers/crypto/marvell/cesa/cipher.c +@@ -614,7 +614,6 @@ struct skcipher_alg mv_cesa_ecb_des3_ede_alg = { + .decrypt = mv_cesa_ecb_des3_ede_decrypt, + .min_keysize = DES3_EDE_KEY_SIZE, + .max_keysize = DES3_EDE_KEY_SIZE, +- .ivsize = DES3_EDE_BLOCK_SIZE, + .base = { + .cra_name = "ecb(des3_ede)", + .cra_driver_name = "mv-ecb-des3-ede", +diff --git a/drivers/crypto/nx/nx-common-powernv.c b/drivers/crypto/nx/nx-common-powernv.c +index 13c65deda8e97..8a4f10bb3fcdd 100644 +--- a/drivers/crypto/nx/nx-common-powernv.c ++++ b/drivers/crypto/nx/nx-common-powernv.c +@@ -827,7 +827,7 @@ static int __init vas_cfg_coproc_info(struct device_node *dn, int chip_id, + goto err_out; + + vas_init_rx_win_attr(&rxattr, coproc->ct); +- rxattr.rx_fifo = (void *)rx_fifo; ++ rxattr.rx_fifo = rx_fifo; + rxattr.rx_fifo_size = fifo_size; + rxattr.lnotify_lpid = lpid; + rxattr.lnotify_pid = pid; +diff --git a/drivers/devfreq/rk3399_dmc.c b/drivers/devfreq/rk3399_dmc.c +index 2e912166a9934..7e52375d9818d 100644 +--- a/drivers/devfreq/rk3399_dmc.c ++++ b/drivers/devfreq/rk3399_dmc.c +@@ -485,6 +485,8 @@ static int rk3399_dmcfreq_remove(struct platform_device *pdev) + { + struct rk3399_dmcfreq *dmcfreq = dev_get_drvdata(&pdev->dev); + ++ devfreq_event_disable_edev(dmcfreq->edev); ++ + /* + * Before remove the opp table we need to unregister the opp notifier. + */ +diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c +index 4da88578ed646..ae65eb90afaba 100644 +--- a/drivers/dma/idxd/cdev.c ++++ b/drivers/dma/idxd/cdev.c +@@ -266,10 +266,16 @@ int idxd_cdev_register(void) + rc = alloc_chrdev_region(&ictx[i].devt, 0, MINORMASK, + ictx[i].name); + if (rc) +- return rc; ++ goto err_free_chrdev_region; + } + + return 0; ++ ++err_free_chrdev_region: ++ for (i--; i >= 0; i--) ++ unregister_chrdev_region(ictx[i].devt, MINORMASK); ++ ++ return rc; + } + + void idxd_cdev_remove(void) +diff --git a/drivers/dma/stm32-mdma.c b/drivers/dma/stm32-mdma.c +index fe36738f2dd7e..9d54746c422c6 100644 +--- a/drivers/dma/stm32-mdma.c ++++ b/drivers/dma/stm32-mdma.c +@@ -40,7 +40,6 @@ + STM32_MDMA_SHIFT(mask)) + + #define STM32_MDMA_GISR0 0x0000 /* MDMA Int Status Reg 1 */ +-#define STM32_MDMA_GISR1 0x0004 /* MDMA Int Status Reg 2 */ + + /* MDMA Channel x interrupt/status register */ + #define STM32_MDMA_CISR(x) (0x40 + 0x40 * (x)) /* x = 0..62 */ +@@ -196,7 +195,7 @@ + + #define STM32_MDMA_MAX_BUF_LEN 128 + #define STM32_MDMA_MAX_BLOCK_LEN 65536 +-#define STM32_MDMA_MAX_CHANNELS 63 ++#define STM32_MDMA_MAX_CHANNELS 32 + #define STM32_MDMA_MAX_REQUESTS 256 + #define STM32_MDMA_MAX_BURST 128 + #define STM32_MDMA_VERY_HIGH_PRIORITY 0x11 +@@ -1345,90 +1344,84 @@ static void stm32_mdma_xfer_end(struct stm32_mdma_chan *chan) + static irqreturn_t stm32_mdma_irq_handler(int irq, void *devid) + { + struct stm32_mdma_device *dmadev = devid; +- struct stm32_mdma_chan *chan = devid; +- u32 reg, id, ien, status, flag; ++ struct stm32_mdma_chan *chan; ++ u32 reg, id, ccr, ien, status; + + /* Find out which channel generates the interrupt */ + status = readl_relaxed(dmadev->base + STM32_MDMA_GISR0); +- if (status) { +- id = __ffs(status); +- } else { +- status = readl_relaxed(dmadev->base + STM32_MDMA_GISR1); +- if (!status) { +- dev_dbg(mdma2dev(dmadev), "spurious it\n"); +- return IRQ_NONE; +- } +- id = __ffs(status); +- /* +- * As GISR0 provides status for channel id from 0 to 31, +- * so GISR1 provides status for channel id from 32 to 62 +- */ +- id += 32; ++ if (!status) { ++ dev_dbg(mdma2dev(dmadev), "spurious it\n"); ++ return IRQ_NONE; + } ++ id = __ffs(status); + + chan = &dmadev->chan[id]; + if (!chan) { +- dev_dbg(mdma2dev(dmadev), "MDMA channel not initialized\n"); +- goto exit; ++ dev_warn(mdma2dev(dmadev), "MDMA channel not initialized\n"); ++ return IRQ_NONE; + } + + /* Handle interrupt for the channel */ + spin_lock(&chan->vchan.lock); +- status = stm32_mdma_read(dmadev, STM32_MDMA_CISR(chan->id)); +- ien = stm32_mdma_read(dmadev, STM32_MDMA_CCR(chan->id)); +- ien &= STM32_MDMA_CCR_IRQ_MASK; +- ien >>= 1; ++ status = stm32_mdma_read(dmadev, STM32_MDMA_CISR(id)); ++ /* Mask Channel ReQuest Active bit which can be set in case of MEM2MEM */ ++ status &= ~STM32_MDMA_CISR_CRQA; ++ ccr = stm32_mdma_read(dmadev, STM32_MDMA_CCR(id)); ++ ien = (ccr & STM32_MDMA_CCR_IRQ_MASK) >> 1; + + if (!(status & ien)) { + spin_unlock(&chan->vchan.lock); +- dev_dbg(chan2dev(chan), +- "spurious it (status=0x%04x, ien=0x%04x)\n", +- status, ien); ++ dev_warn(chan2dev(chan), ++ "spurious it (status=0x%04x, ien=0x%04x)\n", ++ status, ien); + return IRQ_NONE; + } + +- flag = __ffs(status & ien); +- reg = STM32_MDMA_CIFCR(chan->id); ++ reg = STM32_MDMA_CIFCR(id); + +- switch (1 << flag) { +- case STM32_MDMA_CISR_TEIF: +- id = chan->id; +- status = readl_relaxed(dmadev->base + STM32_MDMA_CESR(id)); +- dev_err(chan2dev(chan), "Transfer Err: stat=0x%08x\n", status); ++ if (status & STM32_MDMA_CISR_TEIF) { ++ dev_err(chan2dev(chan), "Transfer Err: stat=0x%08x\n", ++ readl_relaxed(dmadev->base + STM32_MDMA_CESR(id))); + stm32_mdma_set_bits(dmadev, reg, STM32_MDMA_CIFCR_CTEIF); +- break; ++ status &= ~STM32_MDMA_CISR_TEIF; ++ } + +- case STM32_MDMA_CISR_CTCIF: ++ if (status & STM32_MDMA_CISR_CTCIF) { + stm32_mdma_set_bits(dmadev, reg, STM32_MDMA_CIFCR_CCTCIF); ++ status &= ~STM32_MDMA_CISR_CTCIF; + stm32_mdma_xfer_end(chan); +- break; ++ } + +- case STM32_MDMA_CISR_BRTIF: ++ if (status & STM32_MDMA_CISR_BRTIF) { + stm32_mdma_set_bits(dmadev, reg, STM32_MDMA_CIFCR_CBRTIF); +- break; ++ status &= ~STM32_MDMA_CISR_BRTIF; ++ } + +- case STM32_MDMA_CISR_BTIF: ++ if (status & STM32_MDMA_CISR_BTIF) { + stm32_mdma_set_bits(dmadev, reg, STM32_MDMA_CIFCR_CBTIF); ++ status &= ~STM32_MDMA_CISR_BTIF; + chan->curr_hwdesc++; + if (chan->desc && chan->desc->cyclic) { + if (chan->curr_hwdesc == chan->desc->count) + chan->curr_hwdesc = 0; + vchan_cyclic_callback(&chan->desc->vdesc); + } +- break; ++ } + +- case STM32_MDMA_CISR_TCIF: ++ if (status & STM32_MDMA_CISR_TCIF) { + stm32_mdma_set_bits(dmadev, reg, STM32_MDMA_CIFCR_CLTCIF); +- break; ++ status &= ~STM32_MDMA_CISR_TCIF; ++ } + +- default: +- dev_err(chan2dev(chan), "it %d unhandled (status=0x%04x)\n", +- 1 << flag, status); ++ if (status) { ++ stm32_mdma_set_bits(dmadev, reg, status); ++ dev_err(chan2dev(chan), "DMA error: status=0x%08x\n", status); ++ if (!(ccr & STM32_MDMA_CCR_EN)) ++ dev_err(chan2dev(chan), "chan disabled by HW\n"); + } + + spin_unlock(&chan->vchan.lock); + +-exit: + return IRQ_HANDLED; + } + +diff --git a/drivers/edac/dmc520_edac.c b/drivers/edac/dmc520_edac.c +index b8a7d9594afd4..1fa5ca57e9ec1 100644 +--- a/drivers/edac/dmc520_edac.c ++++ b/drivers/edac/dmc520_edac.c +@@ -489,7 +489,7 @@ static int dmc520_edac_probe(struct platform_device *pdev) + dev = &pdev->dev; + + for (idx = 0; idx < NUMBER_OF_IRQS; idx++) { +- irq = platform_get_irq_byname(pdev, dmc520_irq_configs[idx].name); ++ irq = platform_get_irq_byname_optional(pdev, dmc520_irq_configs[idx].name); + irqs[idx] = irq; + masks[idx] = dmc520_irq_configs[idx].mask; + if (irq >= 0) { +diff --git a/drivers/firmware/arm_scmi/base.c b/drivers/firmware/arm_scmi/base.c +index 017e5d8bd869a..e51d28ba2833d 100644 +--- a/drivers/firmware/arm_scmi/base.c ++++ b/drivers/firmware/arm_scmi/base.c +@@ -188,7 +188,7 @@ static int scmi_base_implementation_list_get(const struct scmi_handle *handle, + break; + + loop_num_ret = le32_to_cpu(*num_ret); +- if (tot_num_ret + loop_num_ret > MAX_PROTOCOLS_IMP) { ++ if (loop_num_ret > MAX_PROTOCOLS_IMP - tot_num_ret) { + dev_err(dev, "No. of Protocol > MAX_PROTOCOLS_IMP"); + break; + } +diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c +index 921a99578ff0e..01424af654db7 100644 +--- a/drivers/gpio/gpiolib-of.c ++++ b/drivers/gpio/gpiolib-of.c +@@ -933,6 +933,11 @@ static int of_gpiochip_add_pin_range(struct gpio_chip *chip) + if (!np) + return 0; + ++ if (!of_property_read_bool(np, "gpio-ranges") && ++ chip->of_gpio_ranges_fallback) { ++ return chip->of_gpio_ranges_fallback(chip, np); ++ } ++ + group_names = of_find_property(np, group_names_propname, NULL); + + for (;; index++) { +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +index 867fcee6b0d3b..ffd8f5601e28a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +@@ -116,7 +116,7 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, union drm_amdgpu_cs + int ret; + + if (cs->in.num_chunks == 0) +- return 0; ++ return -EINVAL; + + chunk_array = kmalloc_array(cs->in.num_chunks, sizeof(uint64_t), GFP_KERNEL); + if (!chunk_array) +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +index b313ce4c3e97d..30005ed8156f0 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +@@ -625,8 +625,7 @@ int amdgpu_ucode_create_bo(struct amdgpu_device *adev) + + void amdgpu_ucode_free_bo(struct amdgpu_device *adev) + { +- if (adev->firmware.load_type != AMDGPU_FW_LOAD_DIRECT) +- amdgpu_bo_free_kernel(&adev->firmware.fw_buf, ++ amdgpu_bo_free_kernel(&adev->firmware.fw_buf, + &adev->firmware.fw_buf_mc, + &adev->firmware.fw_buf_ptr); + } +diff --git a/drivers/gpu/drm/amd/pm/powerplay/kv_dpm.c b/drivers/gpu/drm/amd/pm/powerplay/kv_dpm.c +index 4b3faaccecb94..c8a5a5698edd9 100644 +--- a/drivers/gpu/drm/amd/pm/powerplay/kv_dpm.c ++++ b/drivers/gpu/drm/amd/pm/powerplay/kv_dpm.c +@@ -1609,19 +1609,7 @@ static int kv_update_samu_dpm(struct amdgpu_device *adev, bool gate) + + static u8 kv_get_acp_boot_level(struct amdgpu_device *adev) + { +- u8 i; +- struct amdgpu_clock_voltage_dependency_table *table = +- &adev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table; +- +- for (i = 0; i < table->count; i++) { +- if (table->entries[i].clk >= 0) /* XXX */ +- break; +- } +- +- if (i >= table->count) +- i = table->count - 1; +- +- return i; ++ return 0; + } + + static void kv_update_acp_boot_level(struct amdgpu_device *adev) +diff --git a/drivers/gpu/drm/amd/pm/powerplay/si_dpm.c b/drivers/gpu/drm/amd/pm/powerplay/si_dpm.c +index a1e7ba5995c57..d6544a6dabc7c 100644 +--- a/drivers/gpu/drm/amd/pm/powerplay/si_dpm.c ++++ b/drivers/gpu/drm/amd/pm/powerplay/si_dpm.c +@@ -7250,17 +7250,15 @@ static int si_parse_power_table(struct amdgpu_device *adev) + if (!adev->pm.dpm.ps) + return -ENOMEM; + power_state_offset = (u8 *)state_array->states; +- for (i = 0; i < state_array->ucNumEntries; i++) { ++ for (adev->pm.dpm.num_ps = 0, i = 0; i < state_array->ucNumEntries; i++) { + u8 *idx; + power_state = (union pplib_power_state *)power_state_offset; + non_clock_array_index = power_state->v2.nonClockInfoIndex; + non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) + &non_clock_info_array->nonClockInfo[non_clock_array_index]; + ps = kzalloc(sizeof(struct si_ps), GFP_KERNEL); +- if (ps == NULL) { +- kfree(adev->pm.dpm.ps); ++ if (ps == NULL) + return -ENOMEM; +- } + adev->pm.dpm.ps[i].ps_priv = ps; + si_parse_pplib_non_clock_info(adev, &adev->pm.dpm.ps[i], + non_clock_info, +@@ -7282,8 +7280,8 @@ static int si_parse_power_table(struct amdgpu_device *adev) + k++; + } + power_state_offset += 2 + power_state->v2.ucNumDPMLevels; ++ adev->pm.dpm.num_ps++; + } +- adev->pm.dpm.num_ps = state_array->ucNumEntries; + + /* fill in the vce power states */ + for (i = 0; i < adev->pm.dpm.num_of_vce_states; i++) { +diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_plane.c b/drivers/gpu/drm/arm/display/komeda/komeda_plane.c +index 98e915e325ddf..bc3f42e915e91 100644 +--- a/drivers/gpu/drm/arm/display/komeda/komeda_plane.c ++++ b/drivers/gpu/drm/arm/display/komeda/komeda_plane.c +@@ -264,6 +264,10 @@ static int komeda_plane_add(struct komeda_kms_dev *kms, + + formats = komeda_get_layer_fourcc_list(&mdev->fmt_tbl, + layer->layer_type, &n_formats); ++ if (!formats) { ++ kfree(kplane); ++ return -ENOMEM; ++ } + + err = drm_universal_plane_init(&kms->base, plane, + get_possible_crtcs(kms, c->pipeline), +@@ -274,8 +278,10 @@ static int komeda_plane_add(struct komeda_kms_dev *kms, + + komeda_put_fourcc_list(formats); + +- if (err) +- goto cleanup; ++ if (err) { ++ kfree(kplane); ++ return err; ++ } + + drm_plane_helper_add(plane, &komeda_plane_helper_funcs); + +diff --git a/drivers/gpu/drm/arm/malidp_crtc.c b/drivers/gpu/drm/arm/malidp_crtc.c +index 587d94798f5c2..af729094260c4 100644 +--- a/drivers/gpu/drm/arm/malidp_crtc.c ++++ b/drivers/gpu/drm/arm/malidp_crtc.c +@@ -483,7 +483,10 @@ static void malidp_crtc_reset(struct drm_crtc *crtc) + if (crtc->state) + malidp_crtc_destroy_state(crtc, crtc->state); + +- __drm_atomic_helper_crtc_reset(crtc, &state->base); ++ if (state) ++ __drm_atomic_helper_crtc_reset(crtc, &state->base); ++ else ++ __drm_atomic_helper_crtc_reset(crtc, NULL); + } + + static int malidp_crtc_enable_vblank(struct drm_crtc *crtc) +diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +index c6f059be4b897..aca2f14f04c2a 100644 +--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c ++++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +@@ -1306,6 +1306,7 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id) + return 0; + + err_unregister_cec: ++ cec_unregister_adapter(adv7511->cec_adap); + i2c_unregister_device(adv7511->i2c_cec); + if (adv7511->cec_clk) + clk_disable_unprepare(adv7511->cec_clk); +diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +index aa1bb86293fdf..9755672caf1a5 100644 +--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c ++++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +@@ -1639,8 +1639,19 @@ static ssize_t analogix_dpaux_transfer(struct drm_dp_aux *aux, + struct drm_dp_aux_msg *msg) + { + struct analogix_dp_device *dp = to_dp(aux); ++ int ret; ++ ++ pm_runtime_get_sync(dp->dev); ++ ++ ret = analogix_dp_detect_hpd(dp); ++ if (ret) ++ goto out; + +- return analogix_dp_transfer(dp, msg); ++ ret = analogix_dp_transfer(dp, msg); ++out: ++ pm_runtime_put(dp->dev); ++ ++ return ret; + } + + struct analogix_dp_device * +@@ -1705,8 +1716,10 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data) + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + + dp->reg_base = devm_ioremap_resource(&pdev->dev, res); +- if (IS_ERR(dp->reg_base)) +- return ERR_CAST(dp->reg_base); ++ if (IS_ERR(dp->reg_base)) { ++ ret = PTR_ERR(dp->reg_base); ++ goto err_disable_clk; ++ } + + dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd"); + +@@ -1718,7 +1731,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data) + if (IS_ERR(dp->hpd_gpiod)) { + dev_err(dev, "error getting HDP GPIO: %ld\n", + PTR_ERR(dp->hpd_gpiod)); +- return ERR_CAST(dp->hpd_gpiod); ++ ret = PTR_ERR(dp->hpd_gpiod); ++ goto err_disable_clk; + } + + if (dp->hpd_gpiod) { +@@ -1738,7 +1752,8 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data) + + if (dp->irq == -ENXIO) { + dev_err(&pdev->dev, "failed to get irq\n"); +- return ERR_PTR(-ENODEV); ++ ret = -ENODEV; ++ goto err_disable_clk; + } + + ret = devm_request_threaded_irq(&pdev->dev, dp->irq, +@@ -1747,11 +1762,15 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data) + irq_flags, "analogix-dp", dp); + if (ret) { + dev_err(&pdev->dev, "failed to request irq\n"); +- return ERR_PTR(ret); ++ goto err_disable_clk; + } + disable_irq(dp->irq); + + return dp; ++ ++err_disable_clk: ++ clk_disable_unprepare(dp->clock); ++ return ERR_PTR(ret); + } + EXPORT_SYMBOL_GPL(analogix_dp_probe); + +diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c +index 862e173d34315..4334e466b4e05 100644 +--- a/drivers/gpu/drm/drm_edid.c ++++ b/drivers/gpu/drm/drm_edid.c +@@ -1995,9 +1995,6 @@ struct edid *drm_do_get_edid(struct drm_connector *connector, + + connector_bad_edid(connector, edid, edid[0x7e] + 1); + +- edid[EDID_LENGTH-1] += edid[0x7e] - valid_extensions; +- edid[0x7e] = valid_extensions; +- + new = kmalloc_array(valid_extensions + 1, EDID_LENGTH, + GFP_KERNEL); + if (!new) +@@ -2014,6 +2011,9 @@ struct edid *drm_do_get_edid(struct drm_connector *connector, + base += EDID_LENGTH; + } + ++ new[EDID_LENGTH - 1] += new[0x7e] - valid_extensions; ++ new[0x7e] = valid_extensions; ++ + kfree(edid); + edid = new; + } +diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c +index affe1cfed0098..24f643982903a 100644 +--- a/drivers/gpu/drm/drm_plane.c ++++ b/drivers/gpu/drm/drm_plane.c +@@ -186,6 +186,13 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, + if (WARN_ON(config->num_total_plane >= 32)) + return -EINVAL; + ++ /* ++ * First driver to need more than 64 formats needs to fix this. Each ++ * format is encoded as a bit and the current code only supports a u64. ++ */ ++ if (WARN_ON(format_count > 64)) ++ return -EINVAL; ++ + WARN_ON(drm_drv_uses_atomic_modeset(dev) && + (!funcs->atomic_destroy_state || + !funcs->atomic_duplicate_state)); +@@ -207,13 +214,6 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, + return -ENOMEM; + } + +- /* +- * First driver to need more than 64 formats needs to fix this. Each +- * format is encoded as a bit and the current code only supports a u64. +- */ +- if (WARN_ON(format_count > 64)) +- return -EINVAL; +- + if (format_modifiers) { + const uint64_t *temp_modifiers = format_modifiers; + +diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c +index 984569a59a90a..9ba2fe48228f1 100644 +--- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c ++++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c +@@ -282,6 +282,12 @@ void etnaviv_iommu_unmap_gem(struct etnaviv_iommu_context *context, + + mutex_lock(&context->lock); + ++ /* Bail if the mapping has been reaped by another thread */ ++ if (!mapping->context) { ++ mutex_unlock(&context->lock); ++ return; ++ } ++ + /* If the vram node is on the mm, unmap and remove the node */ + if (mapping->vram_node.mm == &context->mm) + etnaviv_iommu_remove_mapping(context, mapping); +diff --git a/drivers/gpu/drm/gma500/psb_intel_display.c b/drivers/gpu/drm/gma500/psb_intel_display.c +index 531c5485be172..bd3df5adb96f2 100644 +--- a/drivers/gpu/drm/gma500/psb_intel_display.c ++++ b/drivers/gpu/drm/gma500/psb_intel_display.c +@@ -536,14 +536,15 @@ void psb_intel_crtc_init(struct drm_device *dev, int pipe, + + struct drm_crtc *psb_intel_get_crtc_from_pipe(struct drm_device *dev, int pipe) + { +- struct drm_crtc *crtc = NULL; ++ struct drm_crtc *crtc; + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + struct gma_crtc *gma_crtc = to_gma_crtc(crtc); ++ + if (gma_crtc->pipe == pipe) +- break; ++ return crtc; + } +- return crtc; ++ return NULL; + } + + int gma_connector_clones(struct drm_device *dev, int type_mask) +diff --git a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c +index eed037ec0b297..8777d35ac7a73 100644 +--- a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c ++++ b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c +@@ -121,9 +121,25 @@ struct i2c_adapter_lookup { + #define ICL_GPIO_DDPA_CTRLCLK_2 8 + #define ICL_GPIO_DDPA_CTRLDATA_2 9 + +-static enum port intel_dsi_seq_port_to_port(u8 port) ++static enum port intel_dsi_seq_port_to_port(struct intel_dsi *intel_dsi, ++ u8 seq_port) + { +- return port ? PORT_C : PORT_A; ++ /* ++ * If single link DSI is being used on any port, the VBT sequence block ++ * send packet apparently always has 0 for the port. Just use the port ++ * we have configured, and ignore the sequence block port. ++ */ ++ if (hweight8(intel_dsi->ports) == 1) ++ return ffs(intel_dsi->ports) - 1; ++ ++ if (seq_port) { ++ if (intel_dsi->ports & PORT_B) ++ return PORT_B; ++ else if (intel_dsi->ports & PORT_C) ++ return PORT_C; ++ } ++ ++ return PORT_A; + } + + static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi, +@@ -145,15 +161,10 @@ static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi, + + seq_port = (flags >> MIPI_PORT_SHIFT) & 3; + +- /* For DSI single link on Port A & C, the seq_port value which is +- * parsed from Sequence Block#53 of VBT has been set to 0 +- * Now, read/write of packets for the DSI single link on Port A and +- * Port C will based on the DVO port from VBT block 2. +- */ +- if (intel_dsi->ports == (1 << PORT_C)) +- port = PORT_C; +- else +- port = intel_dsi_seq_port_to_port(seq_port); ++ port = intel_dsi_seq_port_to_port(intel_dsi, seq_port); ++ ++ if (drm_WARN_ON(&dev_priv->drm, !intel_dsi->dsi_hosts[port])) ++ goto out; + + dsi_device = intel_dsi->dsi_hosts[port]->device; + if (!dsi_device) { +diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c +index 74e66dea57086..5e670aace59f3 100644 +--- a/drivers/gpu/drm/i915/i915_perf.c ++++ b/drivers/gpu/drm/i915/i915_perf.c +@@ -3964,8 +3964,8 @@ addr_err: + return ERR_PTR(err); + } + +-static ssize_t show_dynamic_id(struct device *dev, +- struct device_attribute *attr, ++static ssize_t show_dynamic_id(struct kobject *kobj, ++ struct kobj_attribute *attr, + char *buf) + { + struct i915_oa_config *oa_config = +diff --git a/drivers/gpu/drm/i915/i915_perf_types.h b/drivers/gpu/drm/i915/i915_perf_types.h +index a36a455ae3369..534951ff38bb3 100644 +--- a/drivers/gpu/drm/i915/i915_perf_types.h ++++ b/drivers/gpu/drm/i915/i915_perf_types.h +@@ -54,7 +54,7 @@ struct i915_oa_config { + + struct attribute_group sysfs_metric; + struct attribute *attrs[2]; +- struct device_attribute sysfs_metric_id; ++ struct kobj_attribute sysfs_metric_id; + + struct kref ref; + struct rcu_head rcu; +diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c +index b6bb5fc7d183e..e34718cf5c2e9 100644 +--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c ++++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c +@@ -10,6 +10,7 @@ + #include <linux/clk.h> + #include <linux/dma-mapping.h> + #include <linux/module.h> ++#include <linux/mutex.h> + #include <linux/of_device.h> + #include <linux/platform_device.h> + #include <linux/regmap.h> +@@ -68,6 +69,21 @@ struct ingenic_drm { + + bool panel_is_sharp; + bool no_vblank; ++ ++ /* ++ * clk_mutex is used to synchronize the pixel clock rate update with ++ * the VBLANK. When the pixel clock's parent clock needs to be updated, ++ * clock_nb's notifier function will lock the mutex, then wait until the ++ * next VBLANK. At that point, the parent clock's rate can be updated, ++ * and the mutex is then unlocked. If an atomic commit happens in the ++ * meantime, it will lock on the mutex, effectively waiting until the ++ * clock update process finishes. Finally, the pixel clock's rate will ++ * be recomputed when the mutex has been released, in the pending atomic ++ * commit, or a future one. ++ */ ++ struct mutex clk_mutex; ++ bool update_clk_rate; ++ struct notifier_block clock_nb; + }; + + static const u32 ingenic_drm_primary_formats[] = { +@@ -111,6 +127,29 @@ static inline struct ingenic_drm *drm_crtc_get_priv(struct drm_crtc *crtc) + return container_of(crtc, struct ingenic_drm, crtc); + } + ++static inline struct ingenic_drm *drm_nb_get_priv(struct notifier_block *nb) ++{ ++ return container_of(nb, struct ingenic_drm, clock_nb); ++} ++ ++static int ingenic_drm_update_pixclk(struct notifier_block *nb, ++ unsigned long action, ++ void *data) ++{ ++ struct ingenic_drm *priv = drm_nb_get_priv(nb); ++ ++ switch (action) { ++ case PRE_RATE_CHANGE: ++ mutex_lock(&priv->clk_mutex); ++ priv->update_clk_rate = true; ++ drm_crtc_wait_one_vblank(&priv->crtc); ++ return NOTIFY_OK; ++ default: ++ mutex_unlock(&priv->clk_mutex); ++ return NOTIFY_OK; ++ } ++} ++ + static void ingenic_drm_crtc_atomic_enable(struct drm_crtc *crtc, + struct drm_crtc_state *state) + { +@@ -276,8 +315,14 @@ static void ingenic_drm_crtc_atomic_flush(struct drm_crtc *crtc, + + if (drm_atomic_crtc_needs_modeset(state)) { + ingenic_drm_crtc_update_timings(priv, &state->mode); ++ priv->update_clk_rate = true; ++ } + ++ if (priv->update_clk_rate) { ++ mutex_lock(&priv->clk_mutex); + clk_set_rate(priv->pix_clk, state->adjusted_mode.clock * 1000); ++ priv->update_clk_rate = false; ++ mutex_unlock(&priv->clk_mutex); + } + + if (event) { +@@ -936,16 +981,28 @@ static int ingenic_drm_bind(struct device *dev, bool has_components) + if (soc_info->has_osd) + regmap_write(priv->map, JZ_REG_LCD_OSDC, JZ_LCD_OSDC_OSDEN); + ++ mutex_init(&priv->clk_mutex); ++ priv->clock_nb.notifier_call = ingenic_drm_update_pixclk; ++ ++ parent_clk = clk_get_parent(priv->pix_clk); ++ ret = clk_notifier_register(parent_clk, &priv->clock_nb); ++ if (ret) { ++ dev_err(dev, "Unable to register clock notifier\n"); ++ goto err_devclk_disable; ++ } ++ + ret = drm_dev_register(drm, 0); + if (ret) { + dev_err(dev, "Failed to register DRM driver\n"); +- goto err_devclk_disable; ++ goto err_clk_notifier_unregister; + } + + drm_fbdev_generic_setup(drm, 32); + + return 0; + ++err_clk_notifier_unregister: ++ clk_notifier_unregister(parent_clk, &priv->clock_nb); + err_devclk_disable: + if (priv->lcd_clk) + clk_disable_unprepare(priv->lcd_clk); +@@ -967,7 +1024,9 @@ static int compare_of(struct device *dev, void *data) + static void ingenic_drm_unbind(struct device *dev) + { + struct ingenic_drm *priv = dev_get_drvdata(dev); ++ struct clk *parent_clk = clk_get_parent(priv->pix_clk); + ++ clk_notifier_unregister(parent_clk, &priv->clock_nb); + if (priv->lcd_clk) + clk_disable_unprepare(priv->lcd_clk); + clk_disable_unprepare(priv->pix_clk); +diff --git a/drivers/gpu/drm/mediatek/mtk_cec.c b/drivers/gpu/drm/mediatek/mtk_cec.c +index cb29b649fcdba..12bf937694977 100644 +--- a/drivers/gpu/drm/mediatek/mtk_cec.c ++++ b/drivers/gpu/drm/mediatek/mtk_cec.c +@@ -84,7 +84,7 @@ static void mtk_cec_mask(struct mtk_cec *cec, unsigned int offset, + u32 tmp = readl(cec->regs + offset) & ~mask; + + tmp |= val & mask; +- writel(val, cec->regs + offset); ++ writel(tmp, cec->regs + offset); + } + + void mtk_cec_set_hpd_event(struct device *dev, +diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +index 39563daff4a0b..dffc133b8b1cc 100644 +--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c ++++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +@@ -1308,6 +1308,7 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev) + BUG_ON(!node); + + ret = a6xx_gmu_init(a6xx_gpu, node); ++ of_node_put(node); + if (ret) { + a6xx_destroy(&(a6xx_gpu->base.base)); + return ERR_PTR(ret); +diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c +index 6f0f54588124b..108882bbd2b8b 100644 +--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c ++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c +@@ -146,6 +146,7 @@ static void dpu_hw_intf_setup_timing_engine(struct dpu_hw_intf *ctx, + active_v_end = active_v_start + (p->yres * hsync_period) - 1; + + display_v_start += p->hsync_pulse_width + p->h_back_porch; ++ display_v_end -= p->h_front_porch; + + active_hctl = (active_h_end << 16) | active_h_start; + display_hctl = active_hctl; +diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +index 08e082d0443af..7503f093f3b64 100644 +--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c ++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +@@ -678,8 +678,10 @@ static void _dpu_kms_hw_destroy(struct dpu_kms *dpu_kms) + for (i = 0; i < dpu_kms->catalog->vbif_count; i++) { + u32 vbif_idx = dpu_kms->catalog->vbif[i].id; + +- if ((vbif_idx < VBIF_MAX) && dpu_kms->hw_vbif[vbif_idx]) ++ if ((vbif_idx < VBIF_MAX) && dpu_kms->hw_vbif[vbif_idx]) { + dpu_hw_vbif_destroy(dpu_kms->hw_vbif[vbif_idx]); ++ dpu_kms->hw_vbif[vbif_idx] = NULL; ++ } + } + } + +@@ -937,7 +939,9 @@ static int dpu_kms_hw_init(struct msm_kms *kms) + + dpu_kms_parse_data_bus_icc_path(dpu_kms); + +- pm_runtime_get_sync(&dpu_kms->pdev->dev); ++ rc = pm_runtime_resume_and_get(&dpu_kms->pdev->dev); ++ if (rc < 0) ++ goto error; + + dpu_kms->core_rev = readl_relaxed(dpu_kms->mmio + 0x0); + +diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c +index a8fa084dfa494..ff4f207cbdeaf 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c +@@ -608,9 +608,15 @@ int mdp5_crtc_setup_pipeline(struct drm_crtc *crtc, + if (ret) + return ret; + +- mdp5_mixer_release(new_crtc_state->state, old_mixer); ++ ret = mdp5_mixer_release(new_crtc_state->state, old_mixer); ++ if (ret) ++ return ret; ++ + if (old_r_mixer) { +- mdp5_mixer_release(new_crtc_state->state, old_r_mixer); ++ ret = mdp5_mixer_release(new_crtc_state->state, old_r_mixer); ++ if (ret) ++ return ret; ++ + if (!need_right_mixer) + pipeline->r_mixer = NULL; + } +@@ -977,8 +983,10 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc, + + ret = msm_gem_get_and_pin_iova(cursor_bo, kms->aspace, + &mdp5_crtc->cursor.iova); +- if (ret) ++ if (ret) { ++ drm_gem_object_put(cursor_bo); + return -EINVAL; ++ } + + pm_runtime_get_sync(&pdev->dev); + +diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +index e193865ce9a26..9baaaef706ab5 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +@@ -598,9 +598,9 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev) + pdev = mdp5_kms->pdev; + + irq = irq_of_parse_and_map(pdev->dev.of_node, 0); +- if (irq < 0) { +- ret = irq; +- DRM_DEV_ERROR(&pdev->dev, "failed to get irq: %d\n", ret); ++ if (!irq) { ++ ret = -EINVAL; ++ DRM_DEV_ERROR(&pdev->dev, "failed to get irq\n"); + goto fail; + } + +diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.c +index 954db683ae444..2536def2a0005 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.c ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.c +@@ -116,21 +116,28 @@ int mdp5_mixer_assign(struct drm_atomic_state *s, struct drm_crtc *crtc, + return 0; + } + +-void mdp5_mixer_release(struct drm_atomic_state *s, struct mdp5_hw_mixer *mixer) ++int mdp5_mixer_release(struct drm_atomic_state *s, struct mdp5_hw_mixer *mixer) + { + struct mdp5_global_state *global_state = mdp5_get_global_state(s); +- struct mdp5_hw_mixer_state *new_state = &global_state->hwmixer; ++ struct mdp5_hw_mixer_state *new_state; + + if (!mixer) +- return; ++ return 0; ++ ++ if (IS_ERR(global_state)) ++ return PTR_ERR(global_state); ++ ++ new_state = &global_state->hwmixer; + + if (WARN_ON(!new_state->hwmixer_to_crtc[mixer->idx])) +- return; ++ return -EINVAL; + + DBG("%s: release from crtc %s", mixer->name, + new_state->hwmixer_to_crtc[mixer->idx]->name); + + new_state->hwmixer_to_crtc[mixer->idx] = NULL; ++ ++ return 0; + } + + void mdp5_mixer_destroy(struct mdp5_hw_mixer *mixer) +diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.h b/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.h +index 43c9ba43ce185..545ee223b9d74 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.h ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_mixer.h +@@ -30,7 +30,7 @@ void mdp5_mixer_destroy(struct mdp5_hw_mixer *lm); + int mdp5_mixer_assign(struct drm_atomic_state *s, struct drm_crtc *crtc, + uint32_t caps, struct mdp5_hw_mixer **mixer, + struct mdp5_hw_mixer **r_mixer); +-void mdp5_mixer_release(struct drm_atomic_state *s, +- struct mdp5_hw_mixer *mixer); ++int mdp5_mixer_release(struct drm_atomic_state *s, ++ struct mdp5_hw_mixer *mixer); + + #endif /* __MDP5_LM_H__ */ +diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c +index ba6695963aa66..a4f5cb90f3e80 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.c +@@ -119,18 +119,23 @@ int mdp5_pipe_assign(struct drm_atomic_state *s, struct drm_plane *plane, + return 0; + } + +-void mdp5_pipe_release(struct drm_atomic_state *s, struct mdp5_hw_pipe *hwpipe) ++int mdp5_pipe_release(struct drm_atomic_state *s, struct mdp5_hw_pipe *hwpipe) + { + struct msm_drm_private *priv = s->dev->dev_private; + struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms)); + struct mdp5_global_state *state = mdp5_get_global_state(s); +- struct mdp5_hw_pipe_state *new_state = &state->hwpipe; ++ struct mdp5_hw_pipe_state *new_state; + + if (!hwpipe) +- return; ++ return 0; ++ ++ if (IS_ERR(state)) ++ return PTR_ERR(state); ++ ++ new_state = &state->hwpipe; + + if (WARN_ON(!new_state->hwpipe_to_plane[hwpipe->idx])) +- return; ++ return -EINVAL; + + DBG("%s: release from plane %s", hwpipe->name, + new_state->hwpipe_to_plane[hwpipe->idx]->name); +@@ -141,6 +146,8 @@ void mdp5_pipe_release(struct drm_atomic_state *s, struct mdp5_hw_pipe *hwpipe) + } + + new_state->hwpipe_to_plane[hwpipe->idx] = NULL; ++ ++ return 0; + } + + void mdp5_pipe_destroy(struct mdp5_hw_pipe *hwpipe) +diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.h b/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.h +index 9b26d0761bd4f..cca67938cab21 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.h ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_pipe.h +@@ -37,7 +37,7 @@ int mdp5_pipe_assign(struct drm_atomic_state *s, struct drm_plane *plane, + uint32_t caps, uint32_t blkcfg, + struct mdp5_hw_pipe **hwpipe, + struct mdp5_hw_pipe **r_hwpipe); +-void mdp5_pipe_release(struct drm_atomic_state *s, struct mdp5_hw_pipe *hwpipe); ++int mdp5_pipe_release(struct drm_atomic_state *s, struct mdp5_hw_pipe *hwpipe); + + struct mdp5_hw_pipe *mdp5_pipe_init(enum mdp5_pipe pipe, + uint32_t reg_offset, uint32_t caps); +diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c +index da07993339702..0dc23c86747e8 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_plane.c +@@ -393,12 +393,24 @@ static int mdp5_plane_atomic_check_with_state(struct drm_crtc_state *crtc_state, + mdp5_state->r_hwpipe = NULL; + + +- mdp5_pipe_release(state->state, old_hwpipe); +- mdp5_pipe_release(state->state, old_right_hwpipe); ++ ret = mdp5_pipe_release(state->state, old_hwpipe); ++ if (ret) ++ return ret; ++ ++ ret = mdp5_pipe_release(state->state, old_right_hwpipe); ++ if (ret) ++ return ret; ++ + } + } else { +- mdp5_pipe_release(state->state, mdp5_state->hwpipe); +- mdp5_pipe_release(state->state, mdp5_state->r_hwpipe); ++ ret = mdp5_pipe_release(state->state, mdp5_state->hwpipe); ++ if (ret) ++ return ret; ++ ++ ret = mdp5_pipe_release(state->state, mdp5_state->r_hwpipe); ++ if (ret) ++ return ret; ++ + mdp5_state->hwpipe = mdp5_state->r_hwpipe = NULL; + } + +diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c +index 6cd6934c8c9f1..ebd05678a27ba 100644 +--- a/drivers/gpu/drm/msm/dp/dp_display.c ++++ b/drivers/gpu/drm/msm/dp/dp_display.c +@@ -111,6 +111,7 @@ struct dp_display_private { + u32 hpd_state; + u32 event_pndx; + u32 event_gndx; ++ struct task_struct *ev_tsk; + struct dp_event event_list[DP_EVENT_Q_MAX]; + spinlock_t event_lock; + +@@ -194,6 +195,8 @@ void dp_display_signal_audio_complete(struct msm_dp *dp_display) + complete_all(&dp->audio_comp); + } + ++static int dp_hpd_event_thread_start(struct dp_display_private *dp_priv); ++ + static int dp_display_bind(struct device *dev, struct device *master, + void *data) + { +@@ -234,9 +237,18 @@ static int dp_display_bind(struct device *dev, struct device *master, + } + + rc = dp_register_audio_driver(dev, dp->audio); +- if (rc) ++ if (rc) { + DRM_ERROR("Audio registration Dp failed\n"); ++ goto end; ++ } + ++ rc = dp_hpd_event_thread_start(dp); ++ if (rc) { ++ DRM_ERROR("Event thread create failed\n"); ++ goto end; ++ } ++ ++ return 0; + end: + return rc; + } +@@ -255,6 +267,11 @@ static void dp_display_unbind(struct device *dev, struct device *master, + return; + } + ++ /* disable all HPD interrupts */ ++ dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, false); ++ ++ kthread_stop(dp->ev_tsk); ++ + dp_power_client_deinit(dp->power); + dp_aux_unregister(dp->aux); + priv->dp = NULL; +@@ -984,12 +1001,17 @@ static int hpd_event_thread(void *data) + while (1) { + if (timeout_mode) { + wait_event_timeout(dp_priv->event_q, +- (dp_priv->event_pndx == dp_priv->event_gndx), +- EVENT_TIMEOUT); ++ (dp_priv->event_pndx == dp_priv->event_gndx) || ++ kthread_should_stop(), EVENT_TIMEOUT); + } else { + wait_event_interruptible(dp_priv->event_q, +- (dp_priv->event_pndx != dp_priv->event_gndx)); ++ (dp_priv->event_pndx != dp_priv->event_gndx) || ++ kthread_should_stop()); + } ++ ++ if (kthread_should_stop()) ++ break; ++ + spin_lock_irqsave(&dp_priv->event_lock, flag); + todo = &dp_priv->event_list[dp_priv->event_gndx]; + if (todo->delay) { +@@ -1062,12 +1084,17 @@ static int hpd_event_thread(void *data) + return 0; + } + +-static void dp_hpd_event_setup(struct dp_display_private *dp_priv) ++static int dp_hpd_event_thread_start(struct dp_display_private *dp_priv) + { +- init_waitqueue_head(&dp_priv->event_q); +- spin_lock_init(&dp_priv->event_lock); ++ /* set event q to empty */ ++ dp_priv->event_gndx = 0; ++ dp_priv->event_pndx = 0; + +- kthread_run(hpd_event_thread, dp_priv, "dp_hpd_handler"); ++ dp_priv->ev_tsk = kthread_run(hpd_event_thread, dp_priv, "dp_hpd_handler"); ++ if (IS_ERR(dp_priv->ev_tsk)) ++ return PTR_ERR(dp_priv->ev_tsk); ++ ++ return 0; + } + + static irqreturn_t dp_display_irq_handler(int irq, void *dev_id) +@@ -1125,10 +1152,9 @@ int dp_display_request_irq(struct msm_dp *dp_display) + dp = container_of(dp_display, struct dp_display_private, dp_display); + + dp->irq = irq_of_parse_and_map(dp->pdev->dev.of_node, 0); +- if (dp->irq < 0) { +- rc = dp->irq; +- DRM_ERROR("failed to get irq: %d\n", rc); +- return rc; ++ if (!dp->irq) { ++ DRM_ERROR("failed to get irq\n"); ++ return -EINVAL; + } + + rc = devm_request_irq(&dp->pdev->dev, dp->irq, +@@ -1167,8 +1193,11 @@ static int dp_display_probe(struct platform_device *pdev) + return -EPROBE_DEFER; + } + ++ /* setup event q */ + mutex_init(&dp->event_mutex); + g_dp_display = &dp->dp_display; ++ init_waitqueue_head(&dp->event_q); ++ spin_lock_init(&dp->event_lock); + + /* Store DP audio handle inside DP display */ + g_dp_display->dp_audio = dp->audio; +@@ -1308,8 +1337,6 @@ void msm_dp_irq_postinstall(struct msm_dp *dp_display) + + dp = container_of(dp_display, struct dp_display_private, dp_display); + +- dp_hpd_event_setup(dp); +- + dp_add_event(dp, EV_HPD_INIT_SETUP, 0, 100); + } + +diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c +index 64454a63bbacf..51e8318cc8ff4 100644 +--- a/drivers/gpu/drm/msm/dsi/dsi_host.c ++++ b/drivers/gpu/drm/msm/dsi/dsi_host.c +@@ -1371,10 +1371,10 @@ static int dsi_cmds2buf_tx(struct msm_dsi_host *msm_host, + dsi_get_bpp(msm_host->format) / 8; + + len = dsi_cmd_dma_add(msm_host, msg); +- if (!len) { ++ if (len < 0) { + pr_err("%s: failed to add cmd type = 0x%x\n", + __func__, msg->type); +- return -EINVAL; ++ return len; + } + + /* for video mode, do not send cmds more than +@@ -1393,10 +1393,14 @@ static int dsi_cmds2buf_tx(struct msm_dsi_host *msm_host, + } + + ret = dsi_cmd_dma_tx(msm_host, len); +- if (ret < len) { +- pr_err("%s: cmd dma tx failed, type=0x%x, data0=0x%x, len=%d\n", +- __func__, msg->type, (*(u8 *)(msg->tx_buf)), len); +- return -ECOMM; ++ if (ret < 0) { ++ pr_err("%s: cmd dma tx failed, type=0x%x, data0=0x%x, len=%d, ret=%d\n", ++ __func__, msg->type, (*(u8 *)(msg->tx_buf)), len, ret); ++ return ret; ++ } else if (ret < len) { ++ pr_err("%s: cmd dma tx failed, type=0x%x, data0=0x%x, ret=%d len=%d\n", ++ __func__, msg->type, (*(u8 *)(msg->tx_buf)), ret, len); ++ return -EIO; + } + + return len; +@@ -2139,9 +2143,12 @@ int msm_dsi_host_cmd_rx(struct mipi_dsi_host *host, + } + + ret = dsi_cmds2buf_tx(msm_host, msg); +- if (ret < msg->tx_len) { ++ if (ret < 0) { + pr_err("%s: Read cmd Tx failed, %d\n", __func__, ret); + return ret; ++ } else if (ret < msg->tx_len) { ++ pr_err("%s: Read cmd Tx failed, too short: %d\n", __func__, ret); ++ return -ECOMM; + } + + /* +diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c +index 94f948ef279d1..28b33b35a30ce 100644 +--- a/drivers/gpu/drm/msm/hdmi/hdmi.c ++++ b/drivers/gpu/drm/msm/hdmi/hdmi.c +@@ -142,6 +142,10 @@ static struct hdmi *msm_hdmi_init(struct platform_device *pdev) + /* HDCP needs physical address of hdmi register */ + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, + config->mmio_name); ++ if (!res) { ++ ret = -EINVAL; ++ goto fail; ++ } + hdmi->mmio_phy_addr = res->start; + + hdmi->qfprom_mmio = msm_ioremap(pdev, +@@ -311,9 +315,9 @@ int msm_hdmi_modeset_init(struct hdmi *hdmi, + } + + hdmi->irq = irq_of_parse_and_map(pdev->dev.of_node, 0); +- if (hdmi->irq < 0) { +- ret = hdmi->irq; +- DRM_DEV_ERROR(dev->dev, "failed to get irq: %d\n", ret); ++ if (!hdmi->irq) { ++ ret = -EINVAL; ++ DRM_DEV_ERROR(dev->dev, "failed to get irq\n"); + goto fail; + } + +diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c +index e37e5afc680a2..087efcb1f34cf 100644 +--- a/drivers/gpu/drm/msm/msm_drv.c ++++ b/drivers/gpu/drm/msm/msm_drv.c +@@ -10,6 +10,7 @@ + #include <linux/uaccess.h> + #include <uapi/linux/sched/types.h> + ++#include <drm/drm_bridge.h> + #include <drm/drm_drv.h> + #include <drm/drm_file.h> + #include <drm/drm_ioctl.h> +diff --git a/drivers/gpu/drm/msm/msm_gem_prime.c b/drivers/gpu/drm/msm/msm_gem_prime.c +index 515ef80816a0d..8c64ce7288f1e 100644 +--- a/drivers/gpu/drm/msm/msm_gem_prime.c ++++ b/drivers/gpu/drm/msm/msm_gem_prime.c +@@ -17,7 +17,7 @@ struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj) + int npages = obj->size >> PAGE_SHIFT; + + if (WARN_ON(!msm_obj->pages)) /* should have already pinned! */ +- return NULL; ++ return ERR_PTR(-ENOMEM); + + return drm_prime_pages_to_sg(obj->dev, msm_obj->pages, npages); + } +diff --git a/drivers/gpu/drm/nouveau/dispnv50/atom.h b/drivers/gpu/drm/nouveau/dispnv50/atom.h +index 3d82b3c67decc..93f8f4f645784 100644 +--- a/drivers/gpu/drm/nouveau/dispnv50/atom.h ++++ b/drivers/gpu/drm/nouveau/dispnv50/atom.h +@@ -160,14 +160,14 @@ nv50_head_atom_get(struct drm_atomic_state *state, struct drm_crtc *crtc) + static inline struct drm_encoder * + nv50_head_atom_get_encoder(struct nv50_head_atom *atom) + { +- struct drm_encoder *encoder = NULL; ++ struct drm_encoder *encoder; + + /* We only ever have a single encoder */ + drm_for_each_encoder_mask(encoder, atom->state.crtc->dev, + atom->state.encoder_mask) +- break; ++ return encoder; + +- return encoder; ++ return NULL; + } + + #define nv50_wndw_atom(p) container_of((p), struct nv50_wndw_atom, state) +diff --git a/drivers/gpu/drm/nouveau/dispnv50/crc.c b/drivers/gpu/drm/nouveau/dispnv50/crc.c +index 66f32d965c723..5624a716e11c1 100644 +--- a/drivers/gpu/drm/nouveau/dispnv50/crc.c ++++ b/drivers/gpu/drm/nouveau/dispnv50/crc.c +@@ -411,9 +411,18 @@ void nv50_crc_atomic_check_outp(struct nv50_atom *atom) + struct nv50_head_atom *armh = nv50_head_atom(old_crtc_state); + struct nv50_head_atom *asyh = nv50_head_atom(new_crtc_state); + struct nv50_outp_atom *outp_atom; +- struct nouveau_encoder *outp = +- nv50_real_outp(nv50_head_atom_get_encoder(armh)); +- struct drm_encoder *encoder = &outp->base.base; ++ struct nouveau_encoder *outp; ++ struct drm_encoder *encoder, *enc; ++ ++ enc = nv50_head_atom_get_encoder(armh); ++ if (!enc) ++ continue; ++ ++ outp = nv50_real_outp(enc); ++ if (!outp) ++ continue; ++ ++ encoder = &outp->base.base; + + if (!asyh->clr.crc) + continue; +@@ -464,8 +473,16 @@ void nv50_crc_atomic_set(struct nv50_head *head, + struct drm_device *dev = crtc->dev; + struct nv50_crc *crc = &head->crc; + const struct nv50_crc_func *func = nv50_disp(dev)->core->func->crc; +- struct nouveau_encoder *outp = +- nv50_real_outp(nv50_head_atom_get_encoder(asyh)); ++ struct nouveau_encoder *outp; ++ struct drm_encoder *encoder; ++ ++ encoder = nv50_head_atom_get_encoder(asyh); ++ if (!encoder) ++ return; ++ ++ outp = nv50_real_outp(encoder); ++ if (!outp) ++ return; + + func->set_src(head, outp->or, + nv50_crc_source_type(outp, asyh->crc.src), +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c +index dc184e857f857..5214fd0658b88 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c +@@ -135,10 +135,10 @@ nvkm_cstate_find_best(struct nvkm_clk *clk, struct nvkm_pstate *pstate, + + list_for_each_entry_from_reverse(cstate, &pstate->list, head) { + if (nvkm_cstate_valid(clk, cstate, max_volt, clk->temp)) +- break; ++ return cstate; + } + +- return cstate; ++ return NULL; + } + + static struct nvkm_cstate * +@@ -169,6 +169,8 @@ nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate *pstate, int cstatei) + if (!list_empty(&pstate->list)) { + cstate = nvkm_cstate_get(clk, pstate, cstatei); + cstate = nvkm_cstate_find_best(clk, pstate, cstate); ++ if (!cstate) ++ return -EINVAL; + } else { + cstate = &pstate->base; + } +diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c +index 959dcbd8a29c1..bf2c845ef3a20 100644 +--- a/drivers/gpu/drm/panel/panel-simple.c ++++ b/drivers/gpu/drm/panel/panel-simple.c +@@ -676,7 +676,7 @@ static const struct drm_display_mode ampire_am_1280800n3tzqw_t00h_mode = { + static const struct panel_desc ampire_am_1280800n3tzqw_t00h = { + .modes = &ire_am_1280800n3tzqw_t00h_mode, + .num_modes = 1, +- .bpc = 6, ++ .bpc = 8, + .size = { + .width = 217, + .height = 136, +@@ -2144,6 +2144,7 @@ static const struct panel_desc innolux_g070y2_l01 = { + .unprepare = 800, + }, + .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, ++ .bus_flags = DRM_BUS_FLAG_DE_HIGH, + .connector_type = DRM_MODE_CONNECTOR_LVDS, + }; + +diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +index 0f23144491e40..91568f166a8ad 100644 +--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c ++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +@@ -2097,10 +2097,10 @@ static int vop_bind(struct device *dev, struct device *master, void *data) + vop_win_init(vop); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- vop->len = resource_size(res); + vop->regs = devm_ioremap_resource(dev, res); + if (IS_ERR(vop->regs)) + return PTR_ERR(vop->regs); ++ vop->len = resource_size(res); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (res) { +diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c +index 62488ac149238..089c00a8e7d49 100644 +--- a/drivers/gpu/drm/stm/ltdc.c ++++ b/drivers/gpu/drm/stm/ltdc.c +@@ -527,8 +527,8 @@ static void ltdc_crtc_mode_set_nofb(struct drm_crtc *crtc) + struct drm_device *ddev = crtc->dev; + struct drm_connector_list_iter iter; + struct drm_connector *connector = NULL; +- struct drm_encoder *encoder = NULL; +- struct drm_bridge *bridge = NULL; ++ struct drm_encoder *encoder = NULL, *en_iter; ++ struct drm_bridge *bridge = NULL, *br_iter; + struct drm_display_mode *mode = &crtc->state->adjusted_mode; + struct videomode vm; + u32 hsync, vsync, accum_hbp, accum_vbp, accum_act_w, accum_act_h; +@@ -538,15 +538,19 @@ static void ltdc_crtc_mode_set_nofb(struct drm_crtc *crtc) + int ret; + + /* get encoder from crtc */ +- drm_for_each_encoder(encoder, ddev) +- if (encoder->crtc == crtc) ++ drm_for_each_encoder(en_iter, ddev) ++ if (en_iter->crtc == crtc) { ++ encoder = en_iter; + break; ++ } + + if (encoder) { + /* get bridge from encoder */ +- list_for_each_entry(bridge, &encoder->bridge_chain, chain_node) +- if (bridge->encoder == encoder) ++ list_for_each_entry(br_iter, &encoder->bridge_chain, chain_node) ++ if (br_iter->encoder == encoder) { ++ bridge = br_iter; + break; ++ } + + /* Get the connector from encoder */ + drm_connector_list_iter_begin(ddev, &iter); +diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c +index b177525588c14..8ece0dd0b469d 100644 +--- a/drivers/gpu/drm/tilcdc/tilcdc_external.c ++++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c +@@ -60,11 +60,13 @@ struct drm_connector *tilcdc_encoder_find_connector(struct drm_device *ddev, + int tilcdc_add_component_encoder(struct drm_device *ddev) + { + struct tilcdc_drm_private *priv = ddev->dev_private; +- struct drm_encoder *encoder; ++ struct drm_encoder *encoder = NULL, *iter; + +- list_for_each_entry(encoder, &ddev->mode_config.encoder_list, head) +- if (encoder->possible_crtcs & (1 << priv->crtc->index)) ++ list_for_each_entry(iter, &ddev->mode_config.encoder_list, head) ++ if (iter->possible_crtcs & (1 << priv->crtc->index)) { ++ encoder = iter; + break; ++ } + + if (!encoder) { + dev_err(ddev->dev, "%s: No suitable encoder found\n", __func__); +diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c +index ad691571d759f..95fa6fc052a72 100644 +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -564,6 +564,7 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data) + struct vc4_hvs *hvs = NULL; + int ret; + u32 dispctrl; ++ u32 reg; + + hvs = devm_kzalloc(&pdev->dev, sizeof(*hvs), GFP_KERNEL); + if (!hvs) +@@ -635,6 +636,26 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data) + + vc4->hvs = hvs; + ++ reg = HVS_READ(SCALER_DISPECTRL); ++ reg &= ~SCALER_DISPECTRL_DSP2_MUX_MASK; ++ HVS_WRITE(SCALER_DISPECTRL, ++ reg | VC4_SET_FIELD(0, SCALER_DISPECTRL_DSP2_MUX)); ++ ++ reg = HVS_READ(SCALER_DISPCTRL); ++ reg &= ~SCALER_DISPCTRL_DSP3_MUX_MASK; ++ HVS_WRITE(SCALER_DISPCTRL, ++ reg | VC4_SET_FIELD(3, SCALER_DISPCTRL_DSP3_MUX)); ++ ++ reg = HVS_READ(SCALER_DISPEOLN); ++ reg &= ~SCALER_DISPEOLN_DSP4_MUX_MASK; ++ HVS_WRITE(SCALER_DISPEOLN, ++ reg | VC4_SET_FIELD(3, SCALER_DISPEOLN_DSP4_MUX)); ++ ++ reg = HVS_READ(SCALER_DISPDITHER); ++ reg &= ~SCALER_DISPDITHER_DSP5_MUX_MASK; ++ HVS_WRITE(SCALER_DISPDITHER, ++ reg | VC4_SET_FIELD(3, SCALER_DISPDITHER_DSP5_MUX)); ++ + dispctrl = HVS_READ(SCALER_DISPCTRL); + + dispctrl |= SCALER_DISPCTRL_ENABLE; +@@ -642,10 +663,6 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data) + SCALER_DISPCTRL_DISPEIRQ(1) | + SCALER_DISPCTRL_DISPEIRQ(2); + +- /* Set DSP3 (PV1) to use HVS channel 2, which would otherwise +- * be unused. +- */ +- dispctrl &= ~SCALER_DISPCTRL_DSP3_MUX_MASK; + dispctrl &= ~(SCALER_DISPCTRL_DMAEIRQ | + SCALER_DISPCTRL_SLVWREIRQ | + SCALER_DISPCTRL_SLVRDEIRQ | +@@ -659,7 +676,6 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data) + SCALER_DISPCTRL_DSPEISLUR(1) | + SCALER_DISPCTRL_DSPEISLUR(2) | + SCALER_DISPCTRL_SCLEIRQ); +- dispctrl |= VC4_SET_FIELD(2, SCALER_DISPCTRL_DSP3_MUX); + + HVS_WRITE(SCALER_DISPCTRL, dispctrl); + +diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c +index d13502ae973dd..f8fa09dfea5da 100644 +--- a/drivers/gpu/drm/vc4/vc4_txp.c ++++ b/drivers/gpu/drm/vc4/vc4_txp.c +@@ -295,12 +295,18 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn, + if (WARN_ON(i == ARRAY_SIZE(drm_fmts))) + return; + +- ctrl = TXP_GO | TXP_VSTART_AT_EOF | TXP_EI | ++ ctrl = TXP_GO | TXP_EI | + VC4_SET_FIELD(0xf, TXP_BYTE_ENABLE) | + VC4_SET_FIELD(txp_fmts[i], TXP_FORMAT); + + if (fb->format->has_alpha) + ctrl |= TXP_ALPHA_ENABLE; ++ else ++ /* ++ * If TXP_ALPHA_ENABLE isn't set and TXP_ALPHA_INVERT is, the ++ * hardware will force the output padding to be 0xff. ++ */ ++ ctrl |= TXP_ALPHA_INVERT; + + gem = drm_fb_cma_get_gem_obj(fb, 0); + TXP_WRITE(TXP_DST_PTR, gem->paddr + fb->offsets[0]); +diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c +index f84b7e61311bc..9b2b99e853422 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_display.c ++++ b/drivers/gpu/drm/virtio/virtgpu_display.c +@@ -177,6 +177,8 @@ static int virtio_gpu_conn_get_modes(struct drm_connector *connector) + DRM_DEBUG("add mode: %dx%d\n", width, height); + mode = drm_cvt_mode(connector->dev, width, height, 60, + false, false, false); ++ if (!mode) ++ return count; + mode->type |= DRM_MODE_TYPE_PREFERRED; + drm_mode_probed_add(connector, mode); + count++; +diff --git a/drivers/hid/hid-bigbenff.c b/drivers/hid/hid-bigbenff.c +index 74ad8bf98bfd5..e8c5e3ac9fff1 100644 +--- a/drivers/hid/hid-bigbenff.c ++++ b/drivers/hid/hid-bigbenff.c +@@ -347,6 +347,12 @@ static int bigben_probe(struct hid_device *hid, + bigben->report = list_entry(report_list->next, + struct hid_report, list); + ++ if (list_empty(&hid->inputs)) { ++ hid_err(hid, "no inputs found\n"); ++ error = -ENODEV; ++ goto error_hw_stop; ++ } ++ + hidinput = list_first_entry(&hid->inputs, struct hid_input, list); + set_bit(FF_RUMBLE, hidinput->input->ffbit); + +diff --git a/drivers/hid/hid-elan.c b/drivers/hid/hid-elan.c +index 0e8f424025fea..838673303f77f 100644 +--- a/drivers/hid/hid-elan.c ++++ b/drivers/hid/hid-elan.c +@@ -188,7 +188,6 @@ static int elan_input_configured(struct hid_device *hdev, struct hid_input *hi) + ret = input_mt_init_slots(input, ELAN_MAX_FINGERS, INPUT_MT_POINTER); + if (ret) { + hid_err(hdev, "Failed to init elan MT slots: %d\n", ret); +- input_free_device(input); + return ret; + } + +@@ -200,7 +199,6 @@ static int elan_input_configured(struct hid_device *hdev, struct hid_input *hi) + hid_err(hdev, "Failed to register elan input device: %d\n", + ret); + input_mt_destroy_slots(input); +- input_free_device(input); + return ret; + } + +diff --git a/drivers/hid/hid-led.c b/drivers/hid/hid-led.c +index c2c66ceca1327..7d82f8d426bbc 100644 +--- a/drivers/hid/hid-led.c ++++ b/drivers/hid/hid-led.c +@@ -366,7 +366,7 @@ static const struct hidled_config hidled_configs[] = { + .type = DREAM_CHEEKY, + .name = "Dream Cheeky Webmail Notifier", + .short_name = "dream_cheeky", +- .max_brightness = 31, ++ .max_brightness = 63, + .num_leds = 1, + .report_size = 9, + .report_type = RAW_REQUEST, +diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c +index 424c296845dbb..e8a7f47b8fce3 100644 +--- a/drivers/hwtracing/coresight/coresight-core.c ++++ b/drivers/hwtracing/coresight/coresight-core.c +@@ -1337,7 +1337,7 @@ static int coresight_fixup_device_conns(struct coresight_device *csdev) + continue; + conn->child_dev = + coresight_find_csdev_by_fwnode(conn->child_fwnode); +- if (conn->child_dev) { ++ if (conn->child_dev && conn->child_dev->has_conns_grp) { + ret = coresight_make_links(csdev, conn, + conn->child_dev); + if (ret) +@@ -1486,6 +1486,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc) + int nr_refcnts = 1; + atomic_t *refcnts = NULL; + struct coresight_device *csdev; ++ bool registered = false; + + csdev = kzalloc(sizeof(*csdev), GFP_KERNEL); + if (!csdev) { +@@ -1506,7 +1507,8 @@ struct coresight_device *coresight_register(struct coresight_desc *desc) + refcnts = kcalloc(nr_refcnts, sizeof(*refcnts), GFP_KERNEL); + if (!refcnts) { + ret = -ENOMEM; +- goto err_free_csdev; ++ kfree(csdev); ++ goto err_out; + } + + csdev->refcnt = refcnts; +@@ -1530,6 +1532,13 @@ struct coresight_device *coresight_register(struct coresight_desc *desc) + csdev->dev.fwnode = fwnode_handle_get(dev_fwnode(desc->dev)); + dev_set_name(&csdev->dev, "%s", desc->name); + ++ /* ++ * Make sure the device registration and the connection fixup ++ * are synchronised, so that we don't see uninitialised devices ++ * on the coresight bus while trying to resolve the connections. ++ */ ++ mutex_lock(&coresight_mutex); ++ + ret = device_register(&csdev->dev); + if (ret) { + put_device(&csdev->dev); +@@ -1537,7 +1546,7 @@ struct coresight_device *coresight_register(struct coresight_desc *desc) + * All resources are free'd explicitly via + * coresight_device_release(), triggered from put_device(). + */ +- goto err_out; ++ goto out_unlock; + } + + if (csdev->type == CORESIGHT_DEV_TYPE_SINK || +@@ -1552,11 +1561,11 @@ struct coresight_device *coresight_register(struct coresight_desc *desc) + * from put_device(), which is in turn called from + * function device_unregister(). + */ +- goto err_out; ++ goto out_unlock; + } + } +- +- mutex_lock(&coresight_mutex); ++ /* Device is now registered */ ++ registered = true; + + ret = coresight_create_conns_sysfs_group(csdev); + if (!ret) +@@ -1566,16 +1575,18 @@ struct coresight_device *coresight_register(struct coresight_desc *desc) + if (!ret && cti_assoc_ops && cti_assoc_ops->add) + cti_assoc_ops->add(csdev); + ++out_unlock: + mutex_unlock(&coresight_mutex); +- if (ret) { ++ /* Success */ ++ if (!ret) ++ return csdev; ++ ++ /* Unregister the device if needed */ ++ if (registered) { + coresight_unregister(csdev); + return ERR_PTR(ret); + } + +- return csdev; +- +-err_free_csdev: +- kfree(csdev); + err_out: + /* Cleanup the connection information */ + coresight_release_platform_data(NULL, desc->pdata); +diff --git a/drivers/i2c/busses/i2c-at91-master.c b/drivers/i2c/busses/i2c-at91-master.c +index 66864f9cf7ac5..7960fa4b8c5b0 100644 +--- a/drivers/i2c/busses/i2c-at91-master.c ++++ b/drivers/i2c/busses/i2c-at91-master.c +@@ -657,6 +657,7 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num) + unsigned int_addr_flag = 0; + struct i2c_msg *m_start = msg; + bool is_read; ++ u8 *dma_buf = NULL; + + dev_dbg(&adap->dev, "at91_xfer: processing %d messages:\n", num); + +@@ -704,7 +705,17 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num) + dev->msg = m_start; + dev->recv_len_abort = false; + ++ if (dev->use_dma) { ++ dma_buf = i2c_get_dma_safe_msg_buf(m_start, 1); ++ if (!dma_buf) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ dev->buf = dma_buf; ++ } ++ + ret = at91_do_twi_transfer(dev); ++ i2c_put_dma_safe_msg_buf(dma_buf, m_start, !ret); + + ret = (ret < 0) ? ret : num; + out: +diff --git a/drivers/i2c/busses/i2c-npcm7xx.c b/drivers/i2c/busses/i2c-npcm7xx.c +index 2ad166355ec9b..20a2f903b7f6c 100644 +--- a/drivers/i2c/busses/i2c-npcm7xx.c ++++ b/drivers/i2c/busses/i2c-npcm7xx.c +@@ -359,14 +359,14 @@ static int npcm_i2c_get_SCL(struct i2c_adapter *_adap) + { + struct npcm_i2c *bus = container_of(_adap, struct npcm_i2c, adap); + +- return !!(I2CCTL3_SCL_LVL & ioread32(bus->reg + NPCM_I2CCTL3)); ++ return !!(I2CCTL3_SCL_LVL & ioread8(bus->reg + NPCM_I2CCTL3)); + } + + static int npcm_i2c_get_SDA(struct i2c_adapter *_adap) + { + struct npcm_i2c *bus = container_of(_adap, struct npcm_i2c, adap); + +- return !!(I2CCTL3_SDA_LVL & ioread32(bus->reg + NPCM_I2CCTL3)); ++ return !!(I2CCTL3_SDA_LVL & ioread8(bus->reg + NPCM_I2CCTL3)); + } + + static inline u16 npcm_i2c_get_index(struct npcm_i2c *bus) +@@ -563,6 +563,15 @@ static inline void npcm_i2c_nack(struct npcm_i2c *bus) + iowrite8(val, bus->reg + NPCM_I2CCTL1); + } + ++static inline void npcm_i2c_clear_master_status(struct npcm_i2c *bus) ++{ ++ u8 val; ++ ++ /* Clear NEGACK, STASTR and BER bits */ ++ val = NPCM_I2CST_BER | NPCM_I2CST_NEGACK | NPCM_I2CST_STASTR; ++ iowrite8(val, bus->reg + NPCM_I2CST); ++} ++ + #if IS_ENABLED(CONFIG_I2C_SLAVE) + static void npcm_i2c_slave_int_enable(struct npcm_i2c *bus, bool enable) + { +@@ -642,8 +651,8 @@ static void npcm_i2c_reset(struct npcm_i2c *bus) + iowrite8(NPCM_I2CCST_BB, bus->reg + NPCM_I2CCST); + iowrite8(0xFF, bus->reg + NPCM_I2CST); + +- /* Clear EOB bit */ +- iowrite8(NPCM_I2CCST3_EO_BUSY, bus->reg + NPCM_I2CCST3); ++ /* Clear and disable EOB */ ++ npcm_i2c_eob_int(bus, false); + + /* Clear all fifo bits: */ + iowrite8(NPCM_I2CFIF_CTS_CLR_FIFO, bus->reg + NPCM_I2CFIF_CTS); +@@ -655,6 +664,9 @@ static void npcm_i2c_reset(struct npcm_i2c *bus) + } + #endif + ++ /* clear status bits for spurious interrupts */ ++ npcm_i2c_clear_master_status(bus); ++ + bus->state = I2C_IDLE; + } + +@@ -815,15 +827,6 @@ static void npcm_i2c_read_fifo(struct npcm_i2c *bus, u8 bytes_in_fifo) + } + } + +-static inline void npcm_i2c_clear_master_status(struct npcm_i2c *bus) +-{ +- u8 val; +- +- /* Clear NEGACK, STASTR and BER bits */ +- val = NPCM_I2CST_BER | NPCM_I2CST_NEGACK | NPCM_I2CST_STASTR; +- iowrite8(val, bus->reg + NPCM_I2CST); +-} +- + static void npcm_i2c_master_abort(struct npcm_i2c *bus) + { + /* Only current master is allowed to issue a stop condition */ +@@ -1231,7 +1234,16 @@ static irqreturn_t npcm_i2c_int_slave_handler(struct npcm_i2c *bus) + ret = IRQ_HANDLED; + } /* SDAST */ + +- return ret; ++ /* ++ * if irq is not one of the above, make sure EOB is disabled and all ++ * status bits are cleared. ++ */ ++ if (ret == IRQ_NONE) { ++ npcm_i2c_eob_int(bus, false); ++ npcm_i2c_clear_master_status(bus); ++ } ++ ++ return IRQ_HANDLED; + } + + static int npcm_i2c_reg_slave(struct i2c_client *client) +@@ -1467,6 +1479,9 @@ static void npcm_i2c_irq_handle_nack(struct npcm_i2c *bus) + npcm_i2c_eob_int(bus, false); + npcm_i2c_master_stop(bus); + ++ /* Clear SDA Status bit (by reading dummy byte) */ ++ npcm_i2c_rd_byte(bus); ++ + /* + * The bus is released from stall only after the SW clears + * NEGACK bit. Then a Stop condition is sent. +@@ -1474,6 +1489,8 @@ static void npcm_i2c_irq_handle_nack(struct npcm_i2c *bus) + npcm_i2c_clear_master_status(bus); + readx_poll_timeout_atomic(ioread8, bus->reg + NPCM_I2CCST, val, + !(val & NPCM_I2CCST_BUSY), 10, 200); ++ /* verify no status bits are still set after bus is released */ ++ npcm_i2c_clear_master_status(bus); + } + bus->state = I2C_IDLE; + +@@ -1672,10 +1689,10 @@ static int npcm_i2c_recovery_tgclk(struct i2c_adapter *_adap) + int iter = 27; + + if ((npcm_i2c_get_SDA(_adap) == 1) && (npcm_i2c_get_SCL(_adap) == 1)) { +- dev_dbg(bus->dev, "bus%d recovery skipped, bus not stuck", +- bus->num); ++ dev_dbg(bus->dev, "bus%d-0x%x recovery skipped, bus not stuck", ++ bus->num, bus->dest_addr); + npcm_i2c_reset(bus); +- return status; ++ return 0; + } + + npcm_i2c_int_enable(bus, false); +@@ -1909,6 +1926,7 @@ static int npcm_i2c_init_module(struct npcm_i2c *bus, enum i2c_mode mode, + bus_freq_hz < I2C_FREQ_MIN_HZ || bus_freq_hz > I2C_FREQ_MAX_HZ) + return -EINVAL; + ++ npcm_i2c_int_enable(bus, false); + npcm_i2c_disable(bus); + + /* Configure FIFO mode : */ +@@ -1937,10 +1955,17 @@ static int npcm_i2c_init_module(struct npcm_i2c *bus, enum i2c_mode mode, + val = (val | NPCM_I2CCTL1_NMINTE) & ~NPCM_I2CCTL1_RWS; + iowrite8(val, bus->reg + NPCM_I2CCTL1); + +- npcm_i2c_int_enable(bus, true); +- + npcm_i2c_reset(bus); + ++ /* check HW is OK: SDA and SCL should be high at this point. */ ++ if ((npcm_i2c_get_SDA(&bus->adap) == 0) || (npcm_i2c_get_SCL(&bus->adap) == 0)) { ++ dev_err(bus->dev, "I2C%d init fail: lines are low\n", bus->num); ++ dev_err(bus->dev, "SDA=%d SCL=%d\n", npcm_i2c_get_SDA(&bus->adap), ++ npcm_i2c_get_SCL(&bus->adap)); ++ return -ENXIO; ++ } ++ ++ npcm_i2c_int_enable(bus, true); + return 0; + } + +@@ -1988,10 +2013,14 @@ static irqreturn_t npcm_i2c_bus_irq(int irq, void *dev_id) + #if IS_ENABLED(CONFIG_I2C_SLAVE) + if (bus->slave) { + bus->master_or_slave = I2C_SLAVE; +- return npcm_i2c_int_slave_handler(bus); ++ if (npcm_i2c_int_slave_handler(bus)) ++ return IRQ_HANDLED; + } + #endif +- return IRQ_NONE; ++ /* clear status bits for spurious interrupts */ ++ npcm_i2c_clear_master_status(bus); ++ ++ return IRQ_HANDLED; + } + + static bool npcm_i2c_master_start_xmit(struct npcm_i2c *bus, +@@ -2047,8 +2076,7 @@ static int npcm_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, + u16 nwrite, nread; + u8 *write_data, *read_data; + u8 slave_addr; +- int timeout; +- int ret = 0; ++ unsigned long timeout; + bool read_block = false; + bool read_PEC = false; + u8 bus_busy; +@@ -2099,13 +2127,13 @@ static int npcm_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, + * 9: bits per transaction (including the ack/nack) + */ + timeout_usec = (2 * 9 * USEC_PER_SEC / bus->bus_freq) * (2 + nread + nwrite); +- timeout = max(msecs_to_jiffies(35), usecs_to_jiffies(timeout_usec)); ++ timeout = max_t(unsigned long, bus->adap.timeout, usecs_to_jiffies(timeout_usec)); + if (nwrite >= 32 * 1024 || nread >= 32 * 1024) { + dev_err(bus->dev, "i2c%d buffer too big\n", bus->num); + return -EINVAL; + } + +- time_left = jiffies + msecs_to_jiffies(DEFAULT_STALL_COUNT) + 1; ++ time_left = jiffies + timeout + 1; + do { + /* + * we must clear slave address immediately when the bus is not +@@ -2138,12 +2166,12 @@ static int npcm_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, + bus->read_block_use = read_block; + + reinit_completion(&bus->cmd_complete); +- if (!npcm_i2c_master_start_xmit(bus, slave_addr, nwrite, nread, +- write_data, read_data, read_PEC, +- read_block)) +- ret = -EBUSY; + +- if (ret != -EBUSY) { ++ npcm_i2c_int_enable(bus, true); ++ ++ if (npcm_i2c_master_start_xmit(bus, slave_addr, nwrite, nread, ++ write_data, read_data, read_PEC, ++ read_block)) { + time_left = wait_for_completion_timeout(&bus->cmd_complete, + timeout); + +@@ -2157,26 +2185,31 @@ static int npcm_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, + } + } + } +- ret = bus->cmd_err; + + /* if there was BER, check if need to recover the bus: */ + if (bus->cmd_err == -EAGAIN) +- ret = i2c_recover_bus(adap); ++ bus->cmd_err = i2c_recover_bus(adap); + + /* + * After any type of error, check if LAST bit is still set, + * due to a HW issue. + * It cannot be cleared without resetting the module. + */ +- if (bus->cmd_err && +- (NPCM_I2CRXF_CTL_LAST_PEC & ioread8(bus->reg + NPCM_I2CRXF_CTL))) ++ else if (bus->cmd_err && ++ (NPCM_I2CRXF_CTL_LAST_PEC & ioread8(bus->reg + NPCM_I2CRXF_CTL))) + npcm_i2c_reset(bus); + ++ /* after any xfer, successful or not, stall and EOB must be disabled */ ++ npcm_i2c_stall_after_start(bus, false); ++ npcm_i2c_eob_int(bus, false); ++ + #if IS_ENABLED(CONFIG_I2C_SLAVE) + /* reenable slave if it was enabled */ + if (bus->slave) + iowrite8((bus->slave->addr & 0x7F) | NPCM_I2CADDR_SAEN, + bus->reg + NPCM_I2CADDR1); ++#else ++ npcm_i2c_int_enable(bus, false); + #endif + return bus->cmd_err; + } +@@ -2269,7 +2302,7 @@ static int npcm_i2c_probe_bus(struct platform_device *pdev) + adap = &bus->adap; + adap->owner = THIS_MODULE; + adap->retries = 3; +- adap->timeout = HZ; ++ adap->timeout = msecs_to_jiffies(35); + adap->algo = &npcm_i2c_algo; + adap->quirks = &npcm_i2c_quirks; + adap->algo_data = bus; +diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c +index 8722ca23f889b..6a7a7a074a975 100644 +--- a/drivers/i2c/busses/i2c-rcar.c ++++ b/drivers/i2c/busses/i2c-rcar.c +@@ -999,8 +999,10 @@ static int rcar_i2c_probe(struct platform_device *pdev) + pm_runtime_enable(dev); + pm_runtime_get_sync(dev); + ret = rcar_i2c_clock_calculate(priv); +- if (ret < 0) +- goto out_pm_put; ++ if (ret < 0) { ++ pm_runtime_put(dev); ++ goto out_pm_disable; ++ } + + rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */ + +@@ -1029,19 +1031,19 @@ static int rcar_i2c_probe(struct platform_device *pdev) + + ret = platform_get_irq(pdev, 0); + if (ret < 0) +- goto out_pm_disable; ++ goto out_pm_put; + priv->irq = ret; + ret = devm_request_irq(dev, priv->irq, irqhandler, irqflags, dev_name(dev), priv); + if (ret < 0) { + dev_err(dev, "cannot get irq %d\n", priv->irq); +- goto out_pm_disable; ++ goto out_pm_put; + } + + platform_set_drvdata(pdev, priv); + + ret = i2c_add_numbered_adapter(adap); + if (ret < 0) +- goto out_pm_disable; ++ goto out_pm_put; + + if (priv->flags & ID_P_HOST_NOTIFY) { + priv->host_notify_client = i2c_new_slave_host_notify_device(adap); +@@ -1058,7 +1060,8 @@ static int rcar_i2c_probe(struct platform_device *pdev) + out_del_device: + i2c_del_adapter(&priv->adap); + out_pm_put: +- pm_runtime_put(dev); ++ if (priv->flags & ID_P_PM_BLOCKED) ++ pm_runtime_put(dev); + out_pm_disable: + pm_runtime_disable(dev); + return ret; +diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c +index 329ee4f48d957..cfc2110fc38ab 100644 +--- a/drivers/infiniband/hw/hfi1/file_ops.c ++++ b/drivers/infiniband/hw/hfi1/file_ops.c +@@ -306,6 +306,8 @@ static ssize_t hfi1_write_iter(struct kiocb *kiocb, struct iov_iter *from) + unsigned long dim = from->nr_segs; + int idx; + ++ if (!HFI1_CAP_IS_KSET(SDMA)) ++ return -EINVAL; + idx = srcu_read_lock(&fd->pq_srcu); + pq = srcu_dereference(fd->pq, &fd->pq_srcu); + if (!cq || !pq) { +diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c +index fa2cd76747ff4..837293aac68fe 100644 +--- a/drivers/infiniband/hw/hfi1/init.c ++++ b/drivers/infiniband/hw/hfi1/init.c +@@ -530,7 +530,7 @@ void set_link_ipg(struct hfi1_pportdata *ppd) + u16 shift, mult; + u64 src; + u32 current_egress_rate; /* Mbits /sec */ +- u32 max_pkt_time; ++ u64 max_pkt_time; + /* + * max_pkt_time is the maximum packet egress time in units + * of the fabric clock period 1/(805 MHz). +diff --git a/drivers/infiniband/hw/hfi1/sdma.c b/drivers/infiniband/hw/hfi1/sdma.c +index 0b73dc7847aae..a044bee257f94 100644 +--- a/drivers/infiniband/hw/hfi1/sdma.c ++++ b/drivers/infiniband/hw/hfi1/sdma.c +@@ -1330,11 +1330,13 @@ void sdma_clean(struct hfi1_devdata *dd, size_t num_engines) + kvfree(sde->tx_ring); + sde->tx_ring = NULL; + } +- spin_lock_irq(&dd->sde_map_lock); +- sdma_map_free(rcu_access_pointer(dd->sdma_map)); +- RCU_INIT_POINTER(dd->sdma_map, NULL); +- spin_unlock_irq(&dd->sde_map_lock); +- synchronize_rcu(); ++ if (rcu_access_pointer(dd->sdma_map)) { ++ spin_lock_irq(&dd->sde_map_lock); ++ sdma_map_free(rcu_access_pointer(dd->sdma_map)); ++ RCU_INIT_POINTER(dd->sdma_map, NULL); ++ spin_unlock_irq(&dd->sde_map_lock); ++ synchronize_rcu(); ++ } + kfree(dd->per_sdma); + dd->per_sdma = NULL; + +diff --git a/drivers/infiniband/sw/rdmavt/qp.c b/drivers/infiniband/sw/rdmavt/qp.c +index d8d52a00a1be9..585a9c76e5183 100644 +--- a/drivers/infiniband/sw/rdmavt/qp.c ++++ b/drivers/infiniband/sw/rdmavt/qp.c +@@ -2826,7 +2826,7 @@ void rvt_qp_iter(struct rvt_dev_info *rdi, + EXPORT_SYMBOL(rvt_qp_iter); + + /* +- * This should be called with s_lock held. ++ * This should be called with s_lock and r_lock held. + */ + void rvt_send_complete(struct rvt_qp *qp, struct rvt_swqe *wqe, + enum ib_wc_status status) +@@ -3185,7 +3185,9 @@ send_comp: + rvp->n_loop_pkts++; + flush_send: + sqp->s_rnr_retry = sqp->s_rnr_retry_cnt; ++ spin_lock(&sqp->r_lock); + rvt_send_complete(sqp, wqe, send_status); ++ spin_unlock(&sqp->r_lock); + if (local_ops) { + atomic_dec(&sqp->local_ops_pending); + local_ops = 0; +@@ -3239,7 +3241,9 @@ serr: + spin_unlock_irqrestore(&qp->r_lock, flags); + serr_no_r_lock: + spin_lock_irqsave(&sqp->s_lock, flags); ++ spin_lock(&sqp->r_lock); + rvt_send_complete(sqp, wqe, send_status); ++ spin_unlock(&sqp->r_lock); + if (sqp->ibqp.qp_type == IB_QPT_RC) { + int lastwqe; + +diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c +index d4917646641aa..69238f856c677 100644 +--- a/drivers/infiniband/sw/rxe/rxe_req.c ++++ b/drivers/infiniband/sw/rxe/rxe_req.c +@@ -650,7 +650,7 @@ next_wqe: + opcode = next_opcode(qp, wqe, wqe->wr.opcode); + if (unlikely(opcode < 0)) { + wqe->status = IB_WC_LOC_QP_OP_ERR; +- goto exit; ++ goto err; + } + + mask = rxe_opcode[opcode].mask; +diff --git a/drivers/input/misc/sparcspkr.c b/drivers/input/misc/sparcspkr.c +index fe43e5557ed72..cdcb7737c46aa 100644 +--- a/drivers/input/misc/sparcspkr.c ++++ b/drivers/input/misc/sparcspkr.c +@@ -205,6 +205,7 @@ static int bbc_beep_probe(struct platform_device *op) + + info = &state->u.bbc; + info->clock_freq = of_getintprop_default(dp, "clock-frequency", 0); ++ of_node_put(dp); + if (!info->clock_freq) + goto out_free; + +diff --git a/drivers/input/touchscreen/stmfts.c b/drivers/input/touchscreen/stmfts.c +index 64b690a72d105..a05a7a66b4ed4 100644 +--- a/drivers/input/touchscreen/stmfts.c ++++ b/drivers/input/touchscreen/stmfts.c +@@ -337,13 +337,15 @@ static int stmfts_input_open(struct input_dev *dev) + struct stmfts_data *sdata = input_get_drvdata(dev); + int err; + +- err = pm_runtime_get_sync(&sdata->client->dev); +- if (err < 0) +- goto out; ++ err = pm_runtime_resume_and_get(&sdata->client->dev); ++ if (err) ++ return err; + + err = i2c_smbus_write_byte(sdata->client, STMFTS_MS_MT_SENSE_ON); +- if (err) +- goto out; ++ if (err) { ++ pm_runtime_put_sync(&sdata->client->dev); ++ return err; ++ } + + mutex_lock(&sdata->mutex); + sdata->running = true; +@@ -366,9 +368,7 @@ static int stmfts_input_open(struct input_dev *dev) + "failed to enable touchkey\n"); + } + +-out: +- pm_runtime_put_noidle(&sdata->client->dev); +- return err; ++ return 0; + } + + static void stmfts_input_close(struct input_dev *dev) +diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c +index 6eaefc9e7b3d6..e988f6f198c5c 100644 +--- a/drivers/iommu/amd/init.c ++++ b/drivers/iommu/amd/init.c +@@ -84,7 +84,7 @@ + #define ACPI_DEVFLAG_LINT1 0x80 + #define ACPI_DEVFLAG_ATSDIS 0x10000000 + +-#define LOOP_TIMEOUT 100000 ++#define LOOP_TIMEOUT 2000000 + /* + * ACPI table definitions + * +diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c +index 21749859ad459..477dde39823c7 100644 +--- a/drivers/iommu/intel/iommu.c ++++ b/drivers/iommu/intel/iommu.c +@@ -6296,7 +6296,7 @@ static void quirk_igfx_skip_te_disable(struct pci_dev *dev) + ver = (dev->device >> 8) & 0xff; + if (ver != 0x45 && ver != 0x46 && ver != 0x4c && + ver != 0x4e && ver != 0x8a && ver != 0x98 && +- ver != 0x9a) ++ ver != 0x9a && ver != 0xa7) + return; + + if (risky_device(dev)) +diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c +index 3615cd6241c4d..149f2e53b39d4 100644 +--- a/drivers/iommu/msm_iommu.c ++++ b/drivers/iommu/msm_iommu.c +@@ -616,16 +616,19 @@ static void insert_iommu_master(struct device *dev, + static int qcom_iommu_of_xlate(struct device *dev, + struct of_phandle_args *spec) + { +- struct msm_iommu_dev *iommu; ++ struct msm_iommu_dev *iommu = NULL, *iter; + unsigned long flags; + int ret = 0; + + spin_lock_irqsave(&msm_iommu_lock, flags); +- list_for_each_entry(iommu, &qcom_iommu_devices, dev_node) +- if (iommu->dev->of_node == spec->np) ++ list_for_each_entry(iter, &qcom_iommu_devices, dev_node) { ++ if (iter->dev->of_node == spec->np) { ++ iommu = iter; + break; ++ } ++ } + +- if (!iommu || iommu->dev->of_node != spec->np) { ++ if (!iommu) { + ret = -ENODEV; + goto fail; + } +diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c +index 19387d2bc4b4f..051815c9d2bb4 100644 +--- a/drivers/iommu/mtk_iommu.c ++++ b/drivers/iommu/mtk_iommu.c +@@ -768,8 +768,7 @@ static int mtk_iommu_remove(struct platform_device *pdev) + iommu_device_sysfs_remove(&data->iommu); + iommu_device_unregister(&data->iommu); + +- if (iommu_present(&platform_bus_type)) +- bus_set_iommu(&platform_bus_type, NULL); ++ list_del(&data->list); + + clk_disable_unprepare(data->bclk); + devm_free_irq(&pdev->dev, data->irq, data); +diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c +index 84f2741aaac6a..c76fb70c70bb6 100644 +--- a/drivers/irqchip/irq-armada-370-xp.c ++++ b/drivers/irqchip/irq-armada-370-xp.c +@@ -308,7 +308,16 @@ static inline int armada_370_xp_msi_init(struct device_node *node, + + static void armada_xp_mpic_perf_init(void) + { +- unsigned long cpuid = cpu_logical_map(smp_processor_id()); ++ unsigned long cpuid; ++ ++ /* ++ * This Performance Counter Overflow interrupt is specific for ++ * Armada 370 and XP. It is not available on Armada 375, 38x and 39x. ++ */ ++ if (!of_machine_is_compatible("marvell,armada-370-xp")) ++ return; ++ ++ cpuid = cpu_logical_map(smp_processor_id()); + + /* Enable Performance Counter Overflow interrupts */ + writel(ARMADA_370_XP_INT_CAUSE_PERF(cpuid), +diff --git a/drivers/irqchip/irq-aspeed-i2c-ic.c b/drivers/irqchip/irq-aspeed-i2c-ic.c +index 8d591c179f812..3d3210828e9bf 100644 +--- a/drivers/irqchip/irq-aspeed-i2c-ic.c ++++ b/drivers/irqchip/irq-aspeed-i2c-ic.c +@@ -79,8 +79,8 @@ static int __init aspeed_i2c_ic_of_init(struct device_node *node, + } + + i2c_ic->parent_irq = irq_of_parse_and_map(node, 0); +- if (i2c_ic->parent_irq < 0) { +- ret = i2c_ic->parent_irq; ++ if (!i2c_ic->parent_irq) { ++ ret = -EINVAL; + goto err_iounmap; + } + +diff --git a/drivers/irqchip/irq-aspeed-scu-ic.c b/drivers/irqchip/irq-aspeed-scu-ic.c +index 0f0aac7cc1140..7cb13364ecfa1 100644 +--- a/drivers/irqchip/irq-aspeed-scu-ic.c ++++ b/drivers/irqchip/irq-aspeed-scu-ic.c +@@ -159,8 +159,8 @@ static int aspeed_scu_ic_of_init_common(struct aspeed_scu_ic *scu_ic, + } + + irq = irq_of_parse_and_map(node, 0); +- if (irq < 0) { +- rc = irq; ++ if (!irq) { ++ rc = -EINVAL; + goto err; + } + +diff --git a/drivers/irqchip/irq-sni-exiu.c b/drivers/irqchip/irq-sni-exiu.c +index abd011fcecf4a..c7db617e1a2f6 100644 +--- a/drivers/irqchip/irq-sni-exiu.c ++++ b/drivers/irqchip/irq-sni-exiu.c +@@ -37,11 +37,26 @@ struct exiu_irq_data { + u32 spi_base; + }; + +-static void exiu_irq_eoi(struct irq_data *d) ++static void exiu_irq_ack(struct irq_data *d) + { + struct exiu_irq_data *data = irq_data_get_irq_chip_data(d); + + writel(BIT(d->hwirq), data->base + EIREQCLR); ++} ++ ++static void exiu_irq_eoi(struct irq_data *d) ++{ ++ struct exiu_irq_data *data = irq_data_get_irq_chip_data(d); ++ ++ /* ++ * Level triggered interrupts are latched and must be cleared during ++ * EOI or the interrupt will be jammed on. Of course if a level ++ * triggered interrupt is still asserted then the write will not clear ++ * the interrupt. ++ */ ++ if (irqd_is_level_type(d)) ++ writel(BIT(d->hwirq), data->base + EIREQCLR); ++ + irq_chip_eoi_parent(d); + } + +@@ -91,10 +106,13 @@ static int exiu_irq_set_type(struct irq_data *d, unsigned int type) + writel_relaxed(val, data->base + EILVL); + + val = readl_relaxed(data->base + EIEDG); +- if (type == IRQ_TYPE_LEVEL_LOW || type == IRQ_TYPE_LEVEL_HIGH) ++ if (type == IRQ_TYPE_LEVEL_LOW || type == IRQ_TYPE_LEVEL_HIGH) { + val &= ~BIT(d->hwirq); +- else ++ irq_set_handler_locked(d, handle_fasteoi_irq); ++ } else { + val |= BIT(d->hwirq); ++ irq_set_handler_locked(d, handle_fasteoi_ack_irq); ++ } + writel_relaxed(val, data->base + EIEDG); + + writel_relaxed(BIT(d->hwirq), data->base + EIREQCLR); +@@ -104,6 +122,7 @@ static int exiu_irq_set_type(struct irq_data *d, unsigned int type) + + static struct irq_chip exiu_irq_chip = { + .name = "EXIU", ++ .irq_ack = exiu_irq_ack, + .irq_eoi = exiu_irq_eoi, + .irq_enable = exiu_irq_enable, + .irq_mask = exiu_irq_mask, +diff --git a/drivers/irqchip/irq-xtensa-mx.c b/drivers/irqchip/irq-xtensa-mx.c +index 27933338f7b36..8c581c985aa7d 100644 +--- a/drivers/irqchip/irq-xtensa-mx.c ++++ b/drivers/irqchip/irq-xtensa-mx.c +@@ -151,14 +151,25 @@ static struct irq_chip xtensa_mx_irq_chip = { + .irq_set_affinity = xtensa_mx_irq_set_affinity, + }; + ++static void __init xtensa_mx_init_common(struct irq_domain *root_domain) ++{ ++ unsigned int i; ++ ++ irq_set_default_host(root_domain); ++ secondary_init_irq(); ++ ++ /* Initialize default IRQ routing to CPU 0 */ ++ for (i = 0; i < XCHAL_NUM_EXTINTERRUPTS; ++i) ++ set_er(1, MIROUT(i)); ++} ++ + int __init xtensa_mx_init_legacy(struct device_node *interrupt_parent) + { + struct irq_domain *root_domain = + irq_domain_add_legacy(NULL, NR_IRQS - 1, 1, 0, + &xtensa_mx_irq_domain_ops, + &xtensa_mx_irq_chip); +- irq_set_default_host(root_domain); +- secondary_init_irq(); ++ xtensa_mx_init_common(root_domain); + return 0; + } + +@@ -168,8 +179,7 @@ static int __init xtensa_mx_init(struct device_node *np, + struct irq_domain *root_domain = + irq_domain_add_linear(np, NR_IRQS, &xtensa_mx_irq_domain_ops, + &xtensa_mx_irq_chip); +- irq_set_default_host(root_domain); +- secondary_init_irq(); ++ xtensa_mx_init_common(root_domain); + return 0; + } + IRQCHIP_DECLARE(xtensa_mx_irq_chip, "cdns,xtensa-mx", xtensa_mx_init); +diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig +index 5cdc361da37cb..539a2ed4e13dc 100644 +--- a/drivers/macintosh/Kconfig ++++ b/drivers/macintosh/Kconfig +@@ -44,6 +44,7 @@ config ADB_IOP + config ADB_CUDA + bool "Support for Cuda/Egret based Macs and PowerMacs" + depends on (ADB || PPC_PMAC) && !PPC_PMAC64 ++ select RTC_LIB + help + This provides support for Cuda/Egret based Macintosh and + Power Macintosh systems. This includes most m68k based Macs, +@@ -57,6 +58,7 @@ config ADB_CUDA + config ADB_PMU + bool "Support for PMU based PowerMacs and PowerBooks" + depends on PPC_PMAC || MAC ++ select RTC_LIB + help + On PowerBooks, iBooks, and recent iMacs and Power Macintoshes, the + PMU is an embedded microprocessor whose primary function is to +@@ -67,6 +69,10 @@ config ADB_PMU + this device; you should do so if your machine is one of those + mentioned above. + ++config ADB_PMU_EVENT ++ def_bool y ++ depends on ADB_PMU && INPUT=y ++ + config ADB_PMU_LED + bool "Support for the Power/iBook front LED" + depends on PPC_PMAC && ADB_PMU +diff --git a/drivers/macintosh/Makefile b/drivers/macintosh/Makefile +index 49819b1b6f201..712edcb3e0b08 100644 +--- a/drivers/macintosh/Makefile ++++ b/drivers/macintosh/Makefile +@@ -12,7 +12,8 @@ obj-$(CONFIG_MAC_EMUMOUSEBTN) += mac_hid.o + obj-$(CONFIG_INPUT_ADBHID) += adbhid.o + obj-$(CONFIG_ANSLCD) += ans-lcd.o + +-obj-$(CONFIG_ADB_PMU) += via-pmu.o via-pmu-event.o ++obj-$(CONFIG_ADB_PMU) += via-pmu.o ++obj-$(CONFIG_ADB_PMU_EVENT) += via-pmu-event.o + obj-$(CONFIG_ADB_PMU_LED) += via-pmu-led.o + obj-$(CONFIG_PMAC_BACKLIGHT) += via-pmu-backlight.o + obj-$(CONFIG_ADB_CUDA) += via-cuda.o +diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c +index 73e6ae88fafd4..aae6328b2429d 100644 +--- a/drivers/macintosh/via-pmu.c ++++ b/drivers/macintosh/via-pmu.c +@@ -1460,7 +1460,7 @@ next: + pmu_pass_intr(data, len); + /* len == 6 is probably a bad check. But how do I + * know what PMU versions send what events here? */ +- if (len == 6) { ++ if (IS_ENABLED(CONFIG_ADB_PMU_EVENT) && len == 6) { + via_pmu_event(PMU_EVT_POWER, !!(data[1]&8)); + via_pmu_event(PMU_EVT_LID, data[1]&1); + } +diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c +index 3e7d4b20ab34f..4229b9b5da98f 100644 +--- a/drivers/mailbox/mailbox.c ++++ b/drivers/mailbox/mailbox.c +@@ -82,11 +82,11 @@ static void msg_submit(struct mbox_chan *chan) + exit: + spin_unlock_irqrestore(&chan->lock, flags); + +- /* kick start the timer immediately to avoid delays */ + if (!err && (chan->txdone_method & TXDONE_BY_POLL)) { +- /* but only if not already active */ +- if (!hrtimer_active(&chan->mbox->poll_hrt)) +- hrtimer_start(&chan->mbox->poll_hrt, 0, HRTIMER_MODE_REL); ++ /* kick start the timer immediately to avoid delays */ ++ spin_lock_irqsave(&chan->mbox->poll_hrt_lock, flags); ++ hrtimer_start(&chan->mbox->poll_hrt, 0, HRTIMER_MODE_REL); ++ spin_unlock_irqrestore(&chan->mbox->poll_hrt_lock, flags); + } + } + +@@ -120,20 +120,26 @@ static enum hrtimer_restart txdone_hrtimer(struct hrtimer *hrtimer) + container_of(hrtimer, struct mbox_controller, poll_hrt); + bool txdone, resched = false; + int i; ++ unsigned long flags; + + for (i = 0; i < mbox->num_chans; i++) { + struct mbox_chan *chan = &mbox->chans[i]; + + if (chan->active_req && chan->cl) { +- resched = true; + txdone = chan->mbox->ops->last_tx_done(chan); + if (txdone) + tx_tick(chan, 0); ++ else ++ resched = true; + } + } + + if (resched) { +- hrtimer_forward_now(hrtimer, ms_to_ktime(mbox->txpoll_period)); ++ spin_lock_irqsave(&mbox->poll_hrt_lock, flags); ++ if (!hrtimer_is_queued(hrtimer)) ++ hrtimer_forward_now(hrtimer, ms_to_ktime(mbox->txpoll_period)); ++ spin_unlock_irqrestore(&mbox->poll_hrt_lock, flags); ++ + return HRTIMER_RESTART; + } + return HRTIMER_NORESTART; +@@ -500,6 +506,7 @@ int mbox_controller_register(struct mbox_controller *mbox) + hrtimer_init(&mbox->poll_hrt, CLOCK_MONOTONIC, + HRTIMER_MODE_REL); + mbox->poll_hrt.function = txdone_hrtimer; ++ spin_lock_init(&mbox->poll_hrt_lock); + } + + for (i = 0; i < mbox->num_chans; i++) { +diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c +index 418914373a513..f64834785c8b9 100644 +--- a/drivers/md/bcache/btree.c ++++ b/drivers/md/bcache/btree.c +@@ -2006,8 +2006,7 @@ int bch_btree_check(struct cache_set *c) + int i; + struct bkey *k = NULL; + struct btree_iter iter; +- struct btree_check_state *check_state; +- char name[32]; ++ struct btree_check_state check_state; + + /* check and mark root node keys */ + for_each_key_filter(&c->root->keys, k, &iter, bch_ptr_invalid) +@@ -2018,63 +2017,58 @@ int bch_btree_check(struct cache_set *c) + if (c->root->level == 0) + return 0; + +- check_state = kzalloc(sizeof(struct btree_check_state), GFP_KERNEL); +- if (!check_state) +- return -ENOMEM; +- +- check_state->c = c; +- check_state->total_threads = bch_btree_chkthread_nr(); +- check_state->key_idx = 0; +- spin_lock_init(&check_state->idx_lock); +- atomic_set(&check_state->started, 0); +- atomic_set(&check_state->enough, 0); +- init_waitqueue_head(&check_state->wait); ++ check_state.c = c; ++ check_state.total_threads = bch_btree_chkthread_nr(); ++ check_state.key_idx = 0; ++ spin_lock_init(&check_state.idx_lock); ++ atomic_set(&check_state.started, 0); ++ atomic_set(&check_state.enough, 0); ++ init_waitqueue_head(&check_state.wait); + ++ rw_lock(0, c->root, c->root->level); + /* + * Run multiple threads to check btree nodes in parallel, +- * if check_state->enough is non-zero, it means current ++ * if check_state.enough is non-zero, it means current + * running check threads are enough, unncessary to create + * more. + */ +- for (i = 0; i < check_state->total_threads; i++) { +- /* fetch latest check_state->enough earlier */ ++ for (i = 0; i < check_state.total_threads; i++) { ++ /* fetch latest check_state.enough earlier */ + smp_mb__before_atomic(); +- if (atomic_read(&check_state->enough)) ++ if (atomic_read(&check_state.enough)) + break; + +- check_state->infos[i].result = 0; +- check_state->infos[i].state = check_state; +- snprintf(name, sizeof(name), "bch_btrchk[%u]", i); +- atomic_inc(&check_state->started); ++ check_state.infos[i].result = 0; ++ check_state.infos[i].state = &check_state; + +- check_state->infos[i].thread = ++ check_state.infos[i].thread = + kthread_run(bch_btree_check_thread, +- &check_state->infos[i], +- name); +- if (IS_ERR(check_state->infos[i].thread)) { ++ &check_state.infos[i], ++ "bch_btrchk[%d]", i); ++ if (IS_ERR(check_state.infos[i].thread)) { + pr_err("fails to run thread bch_btrchk[%d]\n", i); + for (--i; i >= 0; i--) +- kthread_stop(check_state->infos[i].thread); ++ kthread_stop(check_state.infos[i].thread); + ret = -ENOMEM; + goto out; + } ++ atomic_inc(&check_state.started); + } + + /* + * Must wait for all threads to stop. + */ +- wait_event_interruptible(check_state->wait, +- atomic_read(&check_state->started) == 0); ++ wait_event(check_state.wait, atomic_read(&check_state.started) == 0); + +- for (i = 0; i < check_state->total_threads; i++) { +- if (check_state->infos[i].result) { +- ret = check_state->infos[i].result; ++ for (i = 0; i < check_state.total_threads; i++) { ++ if (check_state.infos[i].result) { ++ ret = check_state.infos[i].result; + goto out; + } + } + + out: +- kfree(check_state); ++ rw_unlock(0, c->root); + return ret; + } + +diff --git a/drivers/md/bcache/btree.h b/drivers/md/bcache/btree.h +index 50482107134f1..1b5fdbc0d83eb 100644 +--- a/drivers/md/bcache/btree.h ++++ b/drivers/md/bcache/btree.h +@@ -226,7 +226,7 @@ struct btree_check_info { + int result; + }; + +-#define BCH_BTR_CHKTHREAD_MAX 64 ++#define BCH_BTR_CHKTHREAD_MAX 12 + struct btree_check_state { + struct cache_set *c; + int total_threads; +diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c +index c6613e8173337..aea4833f67fc1 100644 +--- a/drivers/md/bcache/journal.c ++++ b/drivers/md/bcache/journal.c +@@ -407,6 +407,11 @@ err: + return ret; + } + ++void bch_journal_space_reserve(struct journal *j) ++{ ++ j->do_reserve = true; ++} ++ + /* Journalling */ + + static void btree_flush_write(struct cache_set *c) +@@ -625,12 +630,30 @@ static void do_journal_discard(struct cache *ca) + } + } + ++static unsigned int free_journal_buckets(struct cache_set *c) ++{ ++ struct journal *j = &c->journal; ++ struct cache *ca = c->cache; ++ struct journal_device *ja = &c->cache->journal; ++ unsigned int n; ++ ++ /* In case njournal_buckets is not power of 2 */ ++ if (ja->cur_idx >= ja->discard_idx) ++ n = ca->sb.njournal_buckets + ja->discard_idx - ja->cur_idx; ++ else ++ n = ja->discard_idx - ja->cur_idx; ++ ++ if (n > (1 + j->do_reserve)) ++ return n - (1 + j->do_reserve); ++ ++ return 0; ++} ++ + static void journal_reclaim(struct cache_set *c) + { + struct bkey *k = &c->journal.key; + struct cache *ca = c->cache; + uint64_t last_seq; +- unsigned int next; + struct journal_device *ja = &ca->journal; + atomic_t p __maybe_unused; + +@@ -653,12 +676,10 @@ static void journal_reclaim(struct cache_set *c) + if (c->journal.blocks_free) + goto out; + +- next = (ja->cur_idx + 1) % ca->sb.njournal_buckets; +- /* No space available on this device */ +- if (next == ja->discard_idx) ++ if (!free_journal_buckets(c)) + goto out; + +- ja->cur_idx = next; ++ ja->cur_idx = (ja->cur_idx + 1) % ca->sb.njournal_buckets; + k->ptr[0] = MAKE_PTR(0, + bucket_to_sector(c, ca->sb.d[ja->cur_idx]), + ca->sb.nr_this_dev); +diff --git a/drivers/md/bcache/journal.h b/drivers/md/bcache/journal.h +index f2ea34d5f431b..cd316b4a1e95f 100644 +--- a/drivers/md/bcache/journal.h ++++ b/drivers/md/bcache/journal.h +@@ -105,6 +105,7 @@ struct journal { + spinlock_t lock; + spinlock_t flush_write_lock; + bool btree_flushing; ++ bool do_reserve; + /* used when waiting because the journal was full */ + struct closure_waitlist wait; + struct closure io; +@@ -182,5 +183,6 @@ int bch_journal_replay(struct cache_set *c, struct list_head *list); + + void bch_journal_free(struct cache_set *c); + int bch_journal_alloc(struct cache_set *c); ++void bch_journal_space_reserve(struct journal *j); + + #endif /* _BCACHE_JOURNAL_H */ +diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c +index 2143263831456..97895262fc542 100644 +--- a/drivers/md/bcache/request.c ++++ b/drivers/md/bcache/request.c +@@ -1109,6 +1109,12 @@ static void detached_dev_do_request(struct bcache_device *d, struct bio *bio) + * which would call closure_get(&dc->disk.cl) + */ + ddip = kzalloc(sizeof(struct detached_dev_io_private), GFP_NOIO); ++ if (!ddip) { ++ bio->bi_status = BLK_STS_RESOURCE; ++ bio->bi_end_io(bio); ++ return; ++ } ++ + ddip->d = d; + /* Count on the bcache device */ + ddip->start_time = part_start_io_acct(d->disk, &ddip->part, bio); +diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c +index 81f1cc5b34999..7f5ea25096430 100644 +--- a/drivers/md/bcache/super.c ++++ b/drivers/md/bcache/super.c +@@ -2150,6 +2150,7 @@ static int run_cache_set(struct cache_set *c) + + flash_devs_run(c); + ++ bch_journal_space_reserve(&c->journal); + set_bit(CACHE_SET_RUNNING, &c->flags); + return 0; + err: +diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c +index 952253f24175a..0145046a45f43 100644 +--- a/drivers/md/bcache/writeback.c ++++ b/drivers/md/bcache/writeback.c +@@ -756,13 +756,11 @@ static int bch_writeback_thread(void *arg) + + /* Init */ + #define INIT_KEYS_EACH_TIME 500000 +-#define INIT_KEYS_SLEEP_MS 100 + + struct sectors_dirty_init { + struct btree_op op; + unsigned int inode; + size_t count; +- struct bkey start; + }; + + static int sectors_dirty_init_fn(struct btree_op *_op, struct btree *b, +@@ -778,11 +776,8 @@ static int sectors_dirty_init_fn(struct btree_op *_op, struct btree *b, + KEY_START(k), KEY_SIZE(k)); + + op->count++; +- if (atomic_read(&b->c->search_inflight) && +- !(op->count % INIT_KEYS_EACH_TIME)) { +- bkey_copy_key(&op->start, k); +- return -EAGAIN; +- } ++ if (!(op->count % INIT_KEYS_EACH_TIME)) ++ cond_resched(); + + return MAP_CONTINUE; + } +@@ -797,24 +792,16 @@ static int bch_root_node_dirty_init(struct cache_set *c, + bch_btree_op_init(&op.op, -1); + op.inode = d->id; + op.count = 0; +- op.start = KEY(op.inode, 0, 0); +- +- do { +- ret = bcache_btree(map_keys_recurse, +- k, +- c->root, +- &op.op, +- &op.start, +- sectors_dirty_init_fn, +- 0); +- if (ret == -EAGAIN) +- schedule_timeout_interruptible( +- msecs_to_jiffies(INIT_KEYS_SLEEP_MS)); +- else if (ret < 0) { +- pr_warn("sectors dirty init failed, ret=%d!\n", ret); +- break; +- } +- } while (ret == -EAGAIN); ++ ++ ret = bcache_btree(map_keys_recurse, ++ k, ++ c->root, ++ &op.op, ++ &KEY(op.inode, 0, 0), ++ sectors_dirty_init_fn, ++ 0); ++ if (ret < 0) ++ pr_warn("sectors dirty init failed, ret=%d!\n", ret); + + return ret; + } +@@ -858,7 +845,6 @@ static int bch_dirty_init_thread(void *arg) + goto out; + } + skip_nr--; +- cond_resched(); + } + + if (p) { +@@ -868,7 +854,6 @@ static int bch_dirty_init_thread(void *arg) + + p = NULL; + prev_idx = cur_idx; +- cond_resched(); + } + + out: +@@ -899,67 +884,55 @@ void bch_sectors_dirty_init(struct bcache_device *d) + struct btree_iter iter; + struct sectors_dirty_init op; + struct cache_set *c = d->c; +- struct bch_dirty_init_state *state; +- char name[32]; ++ struct bch_dirty_init_state state; + + /* Just count root keys if no leaf node */ ++ rw_lock(0, c->root, c->root->level); + if (c->root->level == 0) { + bch_btree_op_init(&op.op, -1); + op.inode = d->id; + op.count = 0; +- op.start = KEY(op.inode, 0, 0); + + for_each_key_filter(&c->root->keys, + k, &iter, bch_ptr_invalid) + sectors_dirty_init_fn(&op.op, c->root, k); +- return; +- } + +- state = kzalloc(sizeof(struct bch_dirty_init_state), GFP_KERNEL); +- if (!state) { +- pr_warn("sectors dirty init failed: cannot allocate memory\n"); ++ rw_unlock(0, c->root); + return; + } + +- state->c = c; +- state->d = d; +- state->total_threads = bch_btre_dirty_init_thread_nr(); +- state->key_idx = 0; +- spin_lock_init(&state->idx_lock); +- atomic_set(&state->started, 0); +- atomic_set(&state->enough, 0); +- init_waitqueue_head(&state->wait); +- +- for (i = 0; i < state->total_threads; i++) { +- /* Fetch latest state->enough earlier */ ++ state.c = c; ++ state.d = d; ++ state.total_threads = bch_btre_dirty_init_thread_nr(); ++ state.key_idx = 0; ++ spin_lock_init(&state.idx_lock); ++ atomic_set(&state.started, 0); ++ atomic_set(&state.enough, 0); ++ init_waitqueue_head(&state.wait); ++ ++ for (i = 0; i < state.total_threads; i++) { ++ /* Fetch latest state.enough earlier */ + smp_mb__before_atomic(); +- if (atomic_read(&state->enough)) ++ if (atomic_read(&state.enough)) + break; + +- state->infos[i].state = state; +- atomic_inc(&state->started); +- snprintf(name, sizeof(name), "bch_dirty_init[%d]", i); +- +- state->infos[i].thread = +- kthread_run(bch_dirty_init_thread, +- &state->infos[i], +- name); +- if (IS_ERR(state->infos[i].thread)) { ++ state.infos[i].state = &state; ++ state.infos[i].thread = ++ kthread_run(bch_dirty_init_thread, &state.infos[i], ++ "bch_dirtcnt[%d]", i); ++ if (IS_ERR(state.infos[i].thread)) { + pr_err("fails to run thread bch_dirty_init[%d]\n", i); + for (--i; i >= 0; i--) +- kthread_stop(state->infos[i].thread); ++ kthread_stop(state.infos[i].thread); + goto out; + } ++ atomic_inc(&state.started); + } + +- /* +- * Must wait for all threads to stop. +- */ +- wait_event_interruptible(state->wait, +- atomic_read(&state->started) == 0); +- + out: +- kfree(state); ++ /* Must wait for all threads to stop. */ ++ wait_event(state.wait, atomic_read(&state.started) == 0); ++ rw_unlock(0, c->root); + } + + void bch_cached_dev_writeback_init(struct cached_dev *dc) +diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h +index 3f1230e22de01..0f1d96920630d 100644 +--- a/drivers/md/bcache/writeback.h ++++ b/drivers/md/bcache/writeback.h +@@ -16,7 +16,7 @@ + + #define BCH_AUTO_GC_DIRTY_THRESHOLD 50 + +-#define BCH_DIRTY_INIT_THRD_MAX 64 ++#define BCH_DIRTY_INIT_THRD_MAX 12 + /* + * 14 (16384ths) is chosen here as something that each backing device + * should be a reasonable fraction of the share, and not to blow up +diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c +index ea3130e116801..d377ea0609255 100644 +--- a/drivers/md/md-bitmap.c ++++ b/drivers/md/md-bitmap.c +@@ -639,14 +639,6 @@ re_read: + daemon_sleep = le32_to_cpu(sb->daemon_sleep) * HZ; + write_behind = le32_to_cpu(sb->write_behind); + sectors_reserved = le32_to_cpu(sb->sectors_reserved); +- /* Setup nodes/clustername only if bitmap version is +- * cluster-compatible +- */ +- if (sb->version == cpu_to_le32(BITMAP_MAJOR_CLUSTERED)) { +- nodes = le32_to_cpu(sb->nodes); +- strlcpy(bitmap->mddev->bitmap_info.cluster_name, +- sb->cluster_name, 64); +- } + + /* verify that the bitmap-specific fields are valid */ + if (sb->magic != cpu_to_le32(BITMAP_MAGIC)) +@@ -668,6 +660,16 @@ re_read: + goto out; + } + ++ /* ++ * Setup nodes/clustername only if bitmap version is ++ * cluster-compatible ++ */ ++ if (sb->version == cpu_to_le32(BITMAP_MAJOR_CLUSTERED)) { ++ nodes = le32_to_cpu(sb->nodes); ++ strlcpy(bitmap->mddev->bitmap_info.cluster_name, ++ sb->cluster_name, 64); ++ } ++ + /* keep the array size field of the bitmap superblock up to date */ + sb->sync_size = cpu_to_le64(bitmap->mddev->resync_max_sectors); + +@@ -700,9 +702,9 @@ re_read: + + out: + kunmap_atomic(sb); +- /* Assigning chunksize is required for "re_read" */ +- bitmap->mddev->bitmap_info.chunksize = chunksize; + if (err == 0 && nodes && (bitmap->cluster_slot < 0)) { ++ /* Assigning chunksize is required for "re_read" */ ++ bitmap->mddev->bitmap_info.chunksize = chunksize; + err = md_setup_cluster(bitmap->mddev, nodes); + if (err) { + pr_warn("%s: Could not setup cluster service (%d)\n", +@@ -713,18 +715,18 @@ out: + goto re_read; + } + +- + out_no_sb: +- if (test_bit(BITMAP_STALE, &bitmap->flags)) +- bitmap->events_cleared = bitmap->mddev->events; +- bitmap->mddev->bitmap_info.chunksize = chunksize; +- bitmap->mddev->bitmap_info.daemon_sleep = daemon_sleep; +- bitmap->mddev->bitmap_info.max_write_behind = write_behind; +- bitmap->mddev->bitmap_info.nodes = nodes; +- if (bitmap->mddev->bitmap_info.space == 0 || +- bitmap->mddev->bitmap_info.space > sectors_reserved) +- bitmap->mddev->bitmap_info.space = sectors_reserved; +- if (err) { ++ if (err == 0) { ++ if (test_bit(BITMAP_STALE, &bitmap->flags)) ++ bitmap->events_cleared = bitmap->mddev->events; ++ bitmap->mddev->bitmap_info.chunksize = chunksize; ++ bitmap->mddev->bitmap_info.daemon_sleep = daemon_sleep; ++ bitmap->mddev->bitmap_info.max_write_behind = write_behind; ++ bitmap->mddev->bitmap_info.nodes = nodes; ++ if (bitmap->mddev->bitmap_info.space == 0 || ++ bitmap->mddev->bitmap_info.space > sectors_reserved) ++ bitmap->mddev->bitmap_info.space = sectors_reserved; ++ } else { + md_bitmap_print_sb(bitmap); + if (bitmap->cluster_slot < 0) + md_cluster_stop(bitmap->mddev); +diff --git a/drivers/md/md.c b/drivers/md/md.c +index cc3876500c4b2..7a9701adee738 100644 +--- a/drivers/md/md.c ++++ b/drivers/md/md.c +@@ -2648,14 +2648,16 @@ static void sync_sbs(struct mddev *mddev, int nospares) + + static bool does_sb_need_changing(struct mddev *mddev) + { +- struct md_rdev *rdev; ++ struct md_rdev *rdev = NULL, *iter; + struct mdp_superblock_1 *sb; + int role; + + /* Find a good rdev */ +- rdev_for_each(rdev, mddev) +- if ((rdev->raid_disk >= 0) && !test_bit(Faulty, &rdev->flags)) ++ rdev_for_each(iter, mddev) ++ if ((iter->raid_disk >= 0) && !test_bit(Faulty, &iter->flags)) { ++ rdev = iter; + break; ++ } + + /* No good device found. */ + if (!rdev) +@@ -9728,16 +9730,18 @@ static int read_rdev(struct mddev *mddev, struct md_rdev *rdev) + + void md_reload_sb(struct mddev *mddev, int nr) + { +- struct md_rdev *rdev; ++ struct md_rdev *rdev = NULL, *iter; + int err; + + /* Find the rdev */ +- rdev_for_each_rcu(rdev, mddev) { +- if (rdev->desc_nr == nr) ++ rdev_for_each_rcu(iter, mddev) { ++ if (iter->desc_nr == nr) { ++ rdev = iter; + break; ++ } + } + +- if (!rdev || rdev->desc_nr != nr) { ++ if (!rdev) { + pr_warn("%s: %d Could not find rdev with nr %d\n", __func__, __LINE__, nr); + return; + } +diff --git a/drivers/media/cec/core/cec-adap.c b/drivers/media/cec/core/cec-adap.c +index 2e5698fbc3a87..e23aa608f66f6 100644 +--- a/drivers/media/cec/core/cec-adap.c ++++ b/drivers/media/cec/core/cec-adap.c +@@ -1271,7 +1271,7 @@ static int cec_config_log_addr(struct cec_adapter *adap, + * While trying to poll the physical address was reset + * and the adapter was unconfigured, so bail out. + */ +- if (!adap->is_configuring) ++ if (adap->phys_addr == CEC_PHYS_ADDR_INVALID) + return -EINTR; + + if (err) +@@ -1328,7 +1328,6 @@ static void cec_adap_unconfigure(struct cec_adapter *adap) + adap->phys_addr != CEC_PHYS_ADDR_INVALID) + WARN_ON(adap->ops->adap_log_addr(adap, CEC_LOG_ADDR_INVALID)); + adap->log_addrs.log_addr_mask = 0; +- adap->is_configuring = false; + adap->is_configured = false; + cec_flush(adap); + wake_up_interruptible(&adap->kthread_waitq); +@@ -1520,9 +1519,10 @@ unconfigure: + for (i = 0; i < las->num_log_addrs; i++) + las->log_addr[i] = CEC_LOG_ADDR_INVALID; + cec_adap_unconfigure(adap); ++ adap->is_configuring = false; + adap->kthread_config = NULL; +- mutex_unlock(&adap->lock); + complete(&adap->config_completion); ++ mutex_unlock(&adap->lock); + return 0; + } + +diff --git a/drivers/media/i2c/ov7670.c b/drivers/media/i2c/ov7670.c +index b42b289faaef4..154776d0069ea 100644 +--- a/drivers/media/i2c/ov7670.c ++++ b/drivers/media/i2c/ov7670.c +@@ -2000,7 +2000,6 @@ static int ov7670_remove(struct i2c_client *client) + v4l2_async_unregister_subdev(sd); + v4l2_ctrl_handler_free(&info->hdl); + media_entity_cleanup(&info->sd.entity); +- ov7670_power_off(sd); + return 0; + } + +diff --git a/drivers/media/pci/cx23885/cx23885-core.c b/drivers/media/pci/cx23885/cx23885-core.c +index 4e8132d4b2dfa..a23c025595a04 100644 +--- a/drivers/media/pci/cx23885/cx23885-core.c ++++ b/drivers/media/pci/cx23885/cx23885-core.c +@@ -2154,7 +2154,7 @@ static int cx23885_initdev(struct pci_dev *pci_dev, + err = pci_set_dma_mask(pci_dev, 0xffffffff); + if (err) { + pr_err("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name); +- goto fail_ctrl; ++ goto fail_dma_set_mask; + } + + err = request_irq(pci_dev->irq, cx23885_irq, +@@ -2162,7 +2162,7 @@ static int cx23885_initdev(struct pci_dev *pci_dev, + if (err < 0) { + pr_err("%s: can't get IRQ %d\n", + dev->name, pci_dev->irq); +- goto fail_irq; ++ goto fail_dma_set_mask; + } + + switch (dev->board) { +@@ -2184,7 +2184,7 @@ static int cx23885_initdev(struct pci_dev *pci_dev, + + return 0; + +-fail_irq: ++fail_dma_set_mask: + cx23885_dev_unregister(dev); + fail_ctrl: + v4l2_ctrl_handler_free(hdl); +diff --git a/drivers/media/pci/cx25821/cx25821-core.c b/drivers/media/pci/cx25821/cx25821-core.c +index 285047b32c44a..a3d45287a5343 100644 +--- a/drivers/media/pci/cx25821/cx25821-core.c ++++ b/drivers/media/pci/cx25821/cx25821-core.c +@@ -1340,11 +1340,11 @@ static void cx25821_finidev(struct pci_dev *pci_dev) + struct cx25821_dev *dev = get_cx25821(v4l2_dev); + + cx25821_shutdown(dev); +- pci_disable_device(pci_dev); + + /* unregister stuff */ + if (pci_dev->irq) + free_irq(pci_dev->irq, dev); ++ pci_disable_device(pci_dev); + + cx25821_dev_unregister(dev); + v4l2_device_unregister(v4l2_dev); +diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c +index 757a58829a512..9d9124308f6ad 100644 +--- a/drivers/media/platform/aspeed-video.c ++++ b/drivers/media/platform/aspeed-video.c +@@ -1723,6 +1723,7 @@ static int aspeed_video_probe(struct platform_device *pdev) + + rc = aspeed_video_setup_video(video); + if (rc) { ++ aspeed_video_free_buf(video, &video->jpeg); + clk_unprepare(video->vclk); + clk_unprepare(video->eclk); + return rc; +@@ -1748,8 +1749,7 @@ static int aspeed_video_remove(struct platform_device *pdev) + + v4l2_device_unregister(v4l2_dev); + +- dma_free_coherent(video->dev, VE_JPEG_HEADER_SIZE, video->jpeg.virt, +- video->jpeg.dma); ++ aspeed_video_free_buf(video, &video->jpeg); + + of_reserved_mem_device_release(dev); + +diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c +index 2333079a83c71..14d4830d5db51 100644 +--- a/drivers/media/platform/coda/coda-common.c ++++ b/drivers/media/platform/coda/coda-common.c +@@ -1318,7 +1318,8 @@ static int coda_enum_frameintervals(struct file *file, void *fh, + struct v4l2_frmivalenum *f) + { + struct coda_ctx *ctx = fh_to_ctx(fh); +- int i; ++ struct coda_q_data *q_data; ++ const struct coda_codec *codec; + + if (f->index) + return -EINVAL; +@@ -1327,12 +1328,19 @@ static int coda_enum_frameintervals(struct file *file, void *fh, + if (!ctx->vdoa && f->pixel_format == V4L2_PIX_FMT_YUYV) + return -EINVAL; + +- for (i = 0; i < CODA_MAX_FORMATS; i++) { +- if (f->pixel_format == ctx->cvd->src_formats[i] || +- f->pixel_format == ctx->cvd->dst_formats[i]) +- break; ++ if (coda_format_normalize_yuv(f->pixel_format) == V4L2_PIX_FMT_YUV420) { ++ q_data = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); ++ codec = coda_find_codec(ctx->dev, f->pixel_format, ++ q_data->fourcc); ++ } else { ++ codec = coda_find_codec(ctx->dev, V4L2_PIX_FMT_YUV420, ++ f->pixel_format); + } +- if (i == CODA_MAX_FORMATS) ++ if (!codec) ++ return -EINVAL; ++ ++ if (f->width < MIN_W || f->width > codec->max_w || ++ f->height < MIN_H || f->height > codec->max_h) + return -EINVAL; + + f->type = V4L2_FRMIVAL_TYPE_CONTINUOUS; +@@ -2335,8 +2343,8 @@ static void coda_encode_ctrls(struct coda_ctx *ctx) + V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET, -12, 12, 1, 0); + v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_PROFILE, +- V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE, 0x0, +- V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE); ++ V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE, 0x0, ++ V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE); + if (ctx->dev->devtype->product == CODA_HX4 || + ctx->dev->devtype->product == CODA_7541) { + v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, +@@ -2350,12 +2358,15 @@ static void coda_encode_ctrls(struct coda_ctx *ctx) + if (ctx->dev->devtype->product == CODA_960) { + v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops, + V4L2_CID_MPEG_VIDEO_H264_LEVEL, +- V4L2_MPEG_VIDEO_H264_LEVEL_4_0, +- ~((1 << V4L2_MPEG_VIDEO_H264_LEVEL_2_0) | ++ V4L2_MPEG_VIDEO_H264_LEVEL_4_2, ++ ~((1 << V4L2_MPEG_VIDEO_H264_LEVEL_1_0) | ++ (1 << V4L2_MPEG_VIDEO_H264_LEVEL_2_0) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_0) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_1) | + (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_2) | +- (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_0)), ++ (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_0) | ++ (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_1) | ++ (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_2)), + V4L2_MPEG_VIDEO_H264_LEVEL_4_0); + } + v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops, +@@ -2417,7 +2428,7 @@ static void coda_decode_ctrls(struct coda_ctx *ctx) + ctx->h264_profile_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls, + &coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_PROFILE, + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, +- ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) | ++ ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) | + (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) | + (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)), + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH); +diff --git a/drivers/media/platform/exynos4-is/fimc-is.c b/drivers/media/platform/exynos4-is/fimc-is.c +index d26fa5967d821..dc2a144cd29b6 100644 +--- a/drivers/media/platform/exynos4-is/fimc-is.c ++++ b/drivers/media/platform/exynos4-is/fimc-is.c +@@ -140,7 +140,7 @@ static int fimc_is_enable_clocks(struct fimc_is *is) + dev_err(&is->pdev->dev, "clock %s enable failed\n", + fimc_is_clocks[i]); + for (--i; i >= 0; i--) +- clk_disable(is->clocks[i]); ++ clk_disable_unprepare(is->clocks[i]); + return ret; + } + pr_debug("enabled clock: %s\n", fimc_is_clocks[i]); +@@ -830,7 +830,7 @@ static int fimc_is_probe(struct platform_device *pdev) + + ret = pm_runtime_resume_and_get(dev); + if (ret < 0) +- goto err_irq; ++ goto err_pm_disable; + + vb2_dma_contig_set_max_seg_size(dev, DMA_BIT_MASK(32)); + +@@ -864,6 +864,8 @@ err_pm: + pm_runtime_put_noidle(dev); + if (!pm_runtime_enabled(dev)) + fimc_is_runtime_suspend(dev); ++err_pm_disable: ++ pm_runtime_disable(dev); + err_irq: + free_irq(is->irq, is); + err_clk: +diff --git a/drivers/media/platform/exynos4-is/fimc-isp-video.h b/drivers/media/platform/exynos4-is/fimc-isp-video.h +index edcb3a5e3cb90..2dd4ddbc748a1 100644 +--- a/drivers/media/platform/exynos4-is/fimc-isp-video.h ++++ b/drivers/media/platform/exynos4-is/fimc-isp-video.h +@@ -32,7 +32,7 @@ static inline int fimc_isp_video_device_register(struct fimc_isp *isp, + return 0; + } + +-void fimc_isp_video_device_unregister(struct fimc_isp *isp, ++static inline void fimc_isp_video_device_unregister(struct fimc_isp *isp, + enum v4l2_buf_type type) + { + } +diff --git a/drivers/media/platform/qcom/venus/hfi.c b/drivers/media/platform/qcom/venus/hfi.c +index a59022adb14c7..966b4d9b57a97 100644 +--- a/drivers/media/platform/qcom/venus/hfi.c ++++ b/drivers/media/platform/qcom/venus/hfi.c +@@ -104,6 +104,9 @@ int hfi_core_deinit(struct venus_core *core, bool blocking) + mutex_lock(&core->lock); + } + ++ if (!core->ops) ++ goto unlock; ++ + ret = core->ops->core_deinit(core); + + if (!ret) +diff --git a/drivers/media/platform/rockchip/rga/rga.c b/drivers/media/platform/rockchip/rga/rga.c +index d99ea8973b678..e3246344fb724 100644 +--- a/drivers/media/platform/rockchip/rga/rga.c ++++ b/drivers/media/platform/rockchip/rga/rga.c +@@ -868,7 +868,7 @@ static int rga_probe(struct platform_device *pdev) + + ret = pm_runtime_resume_and_get(rga->dev); + if (ret < 0) +- goto rel_vdev; ++ goto rel_m2m; + + rga->version.major = (rga_read(rga, RGA_VERSION_INFO) >> 24) & 0xFF; + rga->version.minor = (rga_read(rga, RGA_VERSION_INFO) >> 20) & 0x0F; +@@ -884,7 +884,7 @@ static int rga_probe(struct platform_device *pdev) + DMA_ATTR_WRITE_COMBINE); + if (!rga->cmdbuf_virt) { + ret = -ENOMEM; +- goto rel_vdev; ++ goto rel_m2m; + } + + rga->src_mmu_pages = +@@ -921,6 +921,8 @@ free_src_pages: + free_dma: + dma_free_attrs(rga->dev, RGA_CMDBUF_SIZE, rga->cmdbuf_virt, + rga->cmdbuf_phy, DMA_ATTR_WRITE_COMBINE); ++rel_m2m: ++ v4l2_m2m_release(rga->m2m_dev); + rel_vdev: + video_device_release(vfd); + unreg_v4l2_dev: +diff --git a/drivers/media/platform/sti/delta/delta-v4l2.c b/drivers/media/platform/sti/delta/delta-v4l2.c +index c691b3d81549d..5da49a0ab70b9 100644 +--- a/drivers/media/platform/sti/delta/delta-v4l2.c ++++ b/drivers/media/platform/sti/delta/delta-v4l2.c +@@ -1862,7 +1862,7 @@ static int delta_probe(struct platform_device *pdev) + if (ret) { + dev_err(delta->dev, "%s failed to initialize firmware ipc channel\n", + DELTA_PREFIX); +- goto err; ++ goto err_pm_disable; + } + + /* register all available decoders */ +@@ -1876,7 +1876,7 @@ static int delta_probe(struct platform_device *pdev) + if (ret) { + dev_err(delta->dev, "%s failed to register V4L2 device\n", + DELTA_PREFIX); +- goto err; ++ goto err_pm_disable; + } + + delta->work_queue = create_workqueue(DELTA_NAME); +@@ -1901,6 +1901,8 @@ err_work_queue: + destroy_workqueue(delta->work_queue); + err_v4l2: + v4l2_device_unregister(&delta->v4l2_dev); ++err_pm_disable: ++ pm_runtime_disable(dev); + err: + return ret; + } +diff --git a/drivers/media/platform/vsp1/vsp1_rpf.c b/drivers/media/platform/vsp1/vsp1_rpf.c +index 85587c1b6a373..75083cb234fe3 100644 +--- a/drivers/media/platform/vsp1/vsp1_rpf.c ++++ b/drivers/media/platform/vsp1/vsp1_rpf.c +@@ -291,11 +291,11 @@ static void rpf_configure_partition(struct vsp1_entity *entity, + + crop.left * fmtinfo->bpp[0] / 8; + + if (format->num_planes > 1) { ++ unsigned int bpl = format->plane_fmt[1].bytesperline; + unsigned int offset; + +- offset = crop.top * format->plane_fmt[1].bytesperline +- + crop.left / fmtinfo->hsub +- * fmtinfo->bpp[1] / 8; ++ offset = crop.top / fmtinfo->vsub * bpl ++ + crop.left / fmtinfo->hsub * fmtinfo->bpp[1] / 8; + mem.addr[1] += offset; + mem.addr[2] += offset; + } +diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c +index a7962ca2ac8e3..bc9ac6002e259 100644 +--- a/drivers/media/rc/imon.c ++++ b/drivers/media/rc/imon.c +@@ -153,6 +153,24 @@ struct imon_context { + const struct imon_usb_dev_descr *dev_descr; + /* device description with key */ + /* table for front panels */ ++ /* ++ * Fields for deferring free_imon_context(). ++ * ++ * Since reference to "struct imon_context" is stored into ++ * "struct file"->private_data, we need to remember ++ * how many file descriptors might access this "struct imon_context". ++ */ ++ refcount_t users; ++ /* ++ * Use a flag for telling display_open()/vfd_write()/lcd_write() that ++ * imon_disconnect() was already called. ++ */ ++ bool disconnected; ++ /* ++ * We need to wait for RCU grace period in order to allow ++ * display_open() to safely check ->disconnected and increment ->users. ++ */ ++ struct rcu_head rcu; + }; + + #define TOUCH_TIMEOUT (HZ/30) +@@ -160,18 +178,18 @@ struct imon_context { + /* vfd character device file operations */ + static const struct file_operations vfd_fops = { + .owner = THIS_MODULE, +- .open = &display_open, +- .write = &vfd_write, +- .release = &display_close, ++ .open = display_open, ++ .write = vfd_write, ++ .release = display_close, + .llseek = noop_llseek, + }; + + /* lcd character device file operations */ + static const struct file_operations lcd_fops = { + .owner = THIS_MODULE, +- .open = &display_open, +- .write = &lcd_write, +- .release = &display_close, ++ .open = display_open, ++ .write = lcd_write, ++ .release = display_close, + .llseek = noop_llseek, + }; + +@@ -439,9 +457,6 @@ static struct usb_driver imon_driver = { + .id_table = imon_usb_id_table, + }; + +-/* to prevent races between open() and disconnect(), probing, etc */ +-static DEFINE_MUTEX(driver_lock); +- + /* Module bookkeeping bits */ + MODULE_AUTHOR(MOD_AUTHOR); + MODULE_DESCRIPTION(MOD_DESC); +@@ -481,9 +496,11 @@ static void free_imon_context(struct imon_context *ictx) + struct device *dev = ictx->dev; + + usb_free_urb(ictx->tx_urb); ++ WARN_ON(ictx->dev_present_intf0); + usb_free_urb(ictx->rx_urb_intf0); ++ WARN_ON(ictx->dev_present_intf1); + usb_free_urb(ictx->rx_urb_intf1); +- kfree(ictx); ++ kfree_rcu(ictx, rcu); + + dev_dbg(dev, "%s: iMON context freed\n", __func__); + } +@@ -499,9 +516,6 @@ static int display_open(struct inode *inode, struct file *file) + int subminor; + int retval = 0; + +- /* prevent races with disconnect */ +- mutex_lock(&driver_lock); +- + subminor = iminor(inode); + interface = usb_find_interface(&imon_driver, subminor); + if (!interface) { +@@ -509,13 +523,16 @@ static int display_open(struct inode *inode, struct file *file) + retval = -ENODEV; + goto exit; + } +- ictx = usb_get_intfdata(interface); + +- if (!ictx) { ++ rcu_read_lock(); ++ ictx = usb_get_intfdata(interface); ++ if (!ictx || ictx->disconnected || !refcount_inc_not_zero(&ictx->users)) { ++ rcu_read_unlock(); + pr_err("no context found for minor %d\n", subminor); + retval = -ENODEV; + goto exit; + } ++ rcu_read_unlock(); + + mutex_lock(&ictx->lock); + +@@ -533,8 +550,10 @@ static int display_open(struct inode *inode, struct file *file) + + mutex_unlock(&ictx->lock); + ++ if (retval && refcount_dec_and_test(&ictx->users)) ++ free_imon_context(ictx); ++ + exit: +- mutex_unlock(&driver_lock); + return retval; + } + +@@ -544,16 +563,9 @@ exit: + */ + static int display_close(struct inode *inode, struct file *file) + { +- struct imon_context *ictx = NULL; ++ struct imon_context *ictx = file->private_data; + int retval = 0; + +- ictx = file->private_data; +- +- if (!ictx) { +- pr_err("no context for device\n"); +- return -ENODEV; +- } +- + mutex_lock(&ictx->lock); + + if (!ictx->display_supported) { +@@ -568,6 +580,8 @@ static int display_close(struct inode *inode, struct file *file) + } + + mutex_unlock(&ictx->lock); ++ if (refcount_dec_and_test(&ictx->users)) ++ free_imon_context(ictx); + return retval; + } + +@@ -937,15 +951,12 @@ static ssize_t vfd_write(struct file *file, const char __user *buf, + int offset; + int seq; + int retval = 0; +- struct imon_context *ictx; ++ struct imon_context *ictx = file->private_data; + static const unsigned char vfd_packet6[] = { + 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; + +- ictx = file->private_data; +- if (!ictx) { +- pr_err_ratelimited("no context for device\n"); ++ if (ictx->disconnected) + return -ENODEV; +- } + + mutex_lock(&ictx->lock); + +@@ -1021,13 +1032,10 @@ static ssize_t lcd_write(struct file *file, const char __user *buf, + size_t n_bytes, loff_t *pos) + { + int retval = 0; +- struct imon_context *ictx; ++ struct imon_context *ictx = file->private_data; + +- ictx = file->private_data; +- if (!ictx) { +- pr_err_ratelimited("no context for device\n"); ++ if (ictx->disconnected) + return -ENODEV; +- } + + mutex_lock(&ictx->lock); + +@@ -2405,7 +2413,6 @@ static int imon_probe(struct usb_interface *interface, + int ifnum, sysfs_err; + int ret = 0; + struct imon_context *ictx = NULL; +- struct imon_context *first_if_ctx = NULL; + u16 vendor, product; + + usbdev = usb_get_dev(interface_to_usbdev(interface)); +@@ -2417,17 +2424,12 @@ static int imon_probe(struct usb_interface *interface, + dev_dbg(dev, "%s: found iMON device (%04x:%04x, intf%d)\n", + __func__, vendor, product, ifnum); + +- /* prevent races probing devices w/multiple interfaces */ +- mutex_lock(&driver_lock); +- + first_if = usb_ifnum_to_if(usbdev, 0); + if (!first_if) { + ret = -ENODEV; + goto fail; + } + +- first_if_ctx = usb_get_intfdata(first_if); +- + if (ifnum == 0) { + ictx = imon_init_intf0(interface, id); + if (!ictx) { +@@ -2435,9 +2437,11 @@ static int imon_probe(struct usb_interface *interface, + ret = -ENODEV; + goto fail; + } ++ refcount_set(&ictx->users, 1); + + } else { + /* this is the secondary interface on the device */ ++ struct imon_context *first_if_ctx = usb_get_intfdata(first_if); + + /* fail early if first intf failed to register */ + if (!first_if_ctx) { +@@ -2451,14 +2455,13 @@ static int imon_probe(struct usb_interface *interface, + ret = -ENODEV; + goto fail; + } ++ refcount_inc(&ictx->users); + + } + + usb_set_intfdata(interface, ictx); + + if (ifnum == 0) { +- mutex_lock(&ictx->lock); +- + if (product == 0xffdc && ictx->rf_device) { + sysfs_err = sysfs_create_group(&interface->dev.kobj, + &imon_rf_attr_group); +@@ -2469,21 +2472,17 @@ static int imon_probe(struct usb_interface *interface, + + if (ictx->display_supported) + imon_init_display(ictx, interface); +- +- mutex_unlock(&ictx->lock); + } + + dev_info(dev, "iMON device (%04x:%04x, intf%d) on usb<%d:%d> initialized\n", + vendor, product, ifnum, + usbdev->bus->busnum, usbdev->devnum); + +- mutex_unlock(&driver_lock); + usb_put_dev(usbdev); + + return 0; + + fail: +- mutex_unlock(&driver_lock); + usb_put_dev(usbdev); + dev_err(dev, "unable to register, err %d\n", ret); + +@@ -2499,10 +2498,8 @@ static void imon_disconnect(struct usb_interface *interface) + struct device *dev; + int ifnum; + +- /* prevent races with multi-interface device probing and display_open */ +- mutex_lock(&driver_lock); +- + ictx = usb_get_intfdata(interface); ++ ictx->disconnected = true; + dev = ictx->dev; + ifnum = interface->cur_altsetting->desc.bInterfaceNumber; + +@@ -2543,11 +2540,9 @@ static void imon_disconnect(struct usb_interface *interface) + } + } + +- if (!ictx->dev_present_intf0 && !ictx->dev_present_intf1) ++ if (refcount_dec_and_test(&ictx->users)) + free_imon_context(ictx); + +- mutex_unlock(&driver_lock); +- + dev_dbg(dev, "%s: iMON device (intf%d) disconnected\n", + __func__, ifnum); + } +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c +index 3915d551d59e7..fccd1798445d5 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c +@@ -2569,6 +2569,11 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, + } while (0); + mutex_unlock(&pvr2_unit_mtx); + ++ INIT_WORK(&hdw->workpoll, pvr2_hdw_worker_poll); ++ ++ if (hdw->unit_number == -1) ++ goto fail; ++ + cnt1 = 0; + cnt2 = scnprintf(hdw->name+cnt1,sizeof(hdw->name)-cnt1,"pvrusb2"); + cnt1 += cnt2; +@@ -2580,8 +2585,6 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, + if (cnt1 >= sizeof(hdw->name)) cnt1 = sizeof(hdw->name)-1; + hdw->name[cnt1] = 0; + +- INIT_WORK(&hdw->workpoll,pvr2_hdw_worker_poll); +- + pvr2_trace(PVR2_TRACE_INIT,"Driver unit number is %d, name is %s", + hdw->unit_number,hdw->name); + +diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c +index 753b8a99e08fc..b40a2b904acef 100644 +--- a/drivers/media/usb/uvc/uvc_v4l2.c ++++ b/drivers/media/usb/uvc/uvc_v4l2.c +@@ -863,29 +863,31 @@ static int uvc_ioctl_enum_input(struct file *file, void *fh, + struct uvc_video_chain *chain = handle->chain; + const struct uvc_entity *selector = chain->selector; + struct uvc_entity *iterm = NULL; ++ struct uvc_entity *it; + u32 index = input->index; +- int pin = 0; + + if (selector == NULL || + (chain->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) { + if (index != 0) + return -EINVAL; +- list_for_each_entry(iterm, &chain->entities, chain) { +- if (UVC_ENTITY_IS_ITERM(iterm)) ++ list_for_each_entry(it, &chain->entities, chain) { ++ if (UVC_ENTITY_IS_ITERM(it)) { ++ iterm = it; + break; ++ } + } +- pin = iterm->id; + } else if (index < selector->bNrInPins) { +- pin = selector->baSourceID[index]; +- list_for_each_entry(iterm, &chain->entities, chain) { +- if (!UVC_ENTITY_IS_ITERM(iterm)) ++ list_for_each_entry(it, &chain->entities, chain) { ++ if (!UVC_ENTITY_IS_ITERM(it)) + continue; +- if (iterm->id == pin) ++ if (it->id == selector->baSourceID[index]) { ++ iterm = it; + break; ++ } + } + } + +- if (iterm == NULL || iterm->id != pin) ++ if (iterm == NULL) + return -EINVAL; + + memset(input, 0, sizeof(*input)); +diff --git a/drivers/memory/samsung/exynos5422-dmc.c b/drivers/memory/samsung/exynos5422-dmc.c +index 3d230f07eaf21..049a1356f7dd4 100644 +--- a/drivers/memory/samsung/exynos5422-dmc.c ++++ b/drivers/memory/samsung/exynos5422-dmc.c +@@ -1327,7 +1327,6 @@ static int exynos5_dmc_init_clks(struct exynos5_dmc *dmc) + */ + static int exynos5_performance_counters_init(struct exynos5_dmc *dmc) + { +- int counters_size; + int ret, i; + + dmc->num_counters = devfreq_event_get_edev_count(dmc->dev, +@@ -1337,8 +1336,8 @@ static int exynos5_performance_counters_init(struct exynos5_dmc *dmc) + return dmc->num_counters; + } + +- counters_size = sizeof(struct devfreq_event_dev) * dmc->num_counters; +- dmc->counter = devm_kzalloc(dmc->dev, counters_size, GFP_KERNEL); ++ dmc->counter = devm_kcalloc(dmc->dev, dmc->num_counters, ++ sizeof(*dmc->counter), GFP_KERNEL); + if (!dmc->counter) + return -ENOMEM; + +diff --git a/drivers/mfd/davinci_voicecodec.c b/drivers/mfd/davinci_voicecodec.c +index e5c8bc998eb4e..965820481f1e1 100644 +--- a/drivers/mfd/davinci_voicecodec.c ++++ b/drivers/mfd/davinci_voicecodec.c +@@ -46,14 +46,12 @@ static int __init davinci_vc_probe(struct platform_device *pdev) + } + clk_enable(davinci_vc->clk); + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- +- fifo_base = (dma_addr_t)res->start; +- davinci_vc->base = devm_ioremap_resource(&pdev->dev, res); ++ davinci_vc->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(davinci_vc->base)) { + ret = PTR_ERR(davinci_vc->base); + goto fail; + } ++ fifo_base = (dma_addr_t)res->start; + + davinci_vc->regmap = devm_regmap_init_mmio(&pdev->dev, + davinci_vc->base, +diff --git a/drivers/mfd/ipaq-micro.c b/drivers/mfd/ipaq-micro.c +index e92eeeb67a98a..4cd5ecc722112 100644 +--- a/drivers/mfd/ipaq-micro.c ++++ b/drivers/mfd/ipaq-micro.c +@@ -403,7 +403,7 @@ static int __init micro_probe(struct platform_device *pdev) + micro_reset_comm(micro); + + irq = platform_get_irq(pdev, 0); +- if (!irq) ++ if (irq < 0) + return -EINVAL; + ret = devm_request_irq(&pdev->dev, irq, micro_serial_isr, + IRQF_SHARED, "ipaq-micro", +diff --git a/drivers/misc/ocxl/file.c b/drivers/misc/ocxl/file.c +index 4d1b44de14921..c742ab02ae186 100644 +--- a/drivers/misc/ocxl/file.c ++++ b/drivers/misc/ocxl/file.c +@@ -558,7 +558,9 @@ int ocxl_file_register_afu(struct ocxl_afu *afu) + + err_unregister: + ocxl_sysfs_unregister_afu(info); // safe to call even if register failed ++ free_minor(info); + device_unregister(&info->dev); ++ return rc; + err_put: + ocxl_afu_put(afu); + free_minor(info); +diff --git a/drivers/mmc/host/jz4740_mmc.c b/drivers/mmc/host/jz4740_mmc.c +index a1f92fed2a55b..aa3dfb9c1071b 100644 +--- a/drivers/mmc/host/jz4740_mmc.c ++++ b/drivers/mmc/host/jz4740_mmc.c +@@ -236,6 +236,26 @@ static int jz4740_mmc_acquire_dma_channels(struct jz4740_mmc_host *host) + return PTR_ERR(host->dma_rx); + } + ++ /* ++ * Limit the maximum segment size in any SG entry according to ++ * the parameters of the DMA engine device. ++ */ ++ if (host->dma_tx) { ++ struct device *dev = host->dma_tx->device->dev; ++ unsigned int max_seg_size = dma_get_max_seg_size(dev); ++ ++ if (max_seg_size < host->mmc->max_seg_size) ++ host->mmc->max_seg_size = max_seg_size; ++ } ++ ++ if (host->dma_rx) { ++ struct device *dev = host->dma_rx->device->dev; ++ unsigned int max_seg_size = dma_get_max_seg_size(dev); ++ ++ if (max_seg_size < host->mmc->max_seg_size) ++ host->mmc->max_seg_size = max_seg_size; ++ } ++ + return 0; + } + +diff --git a/drivers/mmc/host/sdhci_am654.c b/drivers/mmc/host/sdhci_am654.c +index a64ea143d1852..7cab9d831afb3 100644 +--- a/drivers/mmc/host/sdhci_am654.c ++++ b/drivers/mmc/host/sdhci_am654.c +@@ -147,6 +147,9 @@ struct sdhci_am654_data { + int drv_strength; + int strb_sel; + u32 flags; ++ u32 quirks; ++ ++#define SDHCI_AM654_QUIRK_FORCE_CDTEST BIT(0) + }; + + struct sdhci_am654_driver_data { +@@ -369,6 +372,21 @@ static void sdhci_am654_write_b(struct sdhci_host *host, u8 val, int reg) + } + } + ++static void sdhci_am654_reset(struct sdhci_host *host, u8 mask) ++{ ++ u8 ctrl; ++ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); ++ struct sdhci_am654_data *sdhci_am654 = sdhci_pltfm_priv(pltfm_host); ++ ++ sdhci_reset(host, mask); ++ ++ if (sdhci_am654->quirks & SDHCI_AM654_QUIRK_FORCE_CDTEST) { ++ ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); ++ ctrl |= SDHCI_CTRL_CDTEST_INS | SDHCI_CTRL_CDTEST_EN; ++ sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); ++ } ++} ++ + static int sdhci_am654_execute_tuning(struct mmc_host *mmc, u32 opcode) + { + struct sdhci_host *host = mmc_priv(mmc); +@@ -500,7 +518,7 @@ static struct sdhci_ops sdhci_j721e_4bit_ops = { + .set_clock = sdhci_j721e_4bit_set_clock, + .write_b = sdhci_am654_write_b, + .irq = sdhci_am654_cqhci_irq, +- .reset = sdhci_reset, ++ .reset = sdhci_am654_reset, + }; + + static const struct sdhci_pltfm_data sdhci_j721e_4bit_pdata = { +@@ -719,6 +737,9 @@ static int sdhci_am654_get_of_property(struct platform_device *pdev, + device_property_read_u32(dev, "ti,clkbuf-sel", + &sdhci_am654->clkbuf_sel); + ++ if (device_property_read_bool(dev, "ti,fails-without-test-cd")) ++ sdhci_am654->quirks |= SDHCI_AM654_QUIRK_FORCE_CDTEST; ++ + sdhci_get_of_property(pdev); + + return 0; +diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c +index 96a27e06401fd..9bd65f3f805c0 100644 +--- a/drivers/mtd/chips/cfi_cmdset_0002.c ++++ b/drivers/mtd/chips/cfi_cmdset_0002.c +@@ -59,6 +59,10 @@ + #define CFI_SR_WBASB BIT(3) + #define CFI_SR_SLSB BIT(1) + ++enum cfi_quirks { ++ CFI_QUIRK_DQ_TRUE_DATA = BIT(0), ++}; ++ + static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *); + static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *); + #if !FORCE_WORD_WRITE +@@ -432,6 +436,15 @@ static void fixup_s29ns512p_sectors(struct mtd_info *mtd) + mtd->name); + } + ++static void fixup_quirks(struct mtd_info *mtd) ++{ ++ struct map_info *map = mtd->priv; ++ struct cfi_private *cfi = map->fldrv_priv; ++ ++ if (cfi->mfr == CFI_MFR_AMD && cfi->id == 0x0c01) ++ cfi->quirks |= CFI_QUIRK_DQ_TRUE_DATA; ++} ++ + /* Used to fix CFI-Tables of chips without Extended Query Tables */ + static struct cfi_fixup cfi_nopri_fixup_table[] = { + { CFI_MFR_SST, 0x234a, fixup_sst39vf }, /* SST39VF1602 */ +@@ -470,6 +483,7 @@ static struct cfi_fixup cfi_fixup_table[] = { + #if !FORCE_WORD_WRITE + { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers }, + #endif ++ { CFI_MFR_ANY, CFI_ID_ANY, fixup_quirks }, + { 0, 0, NULL } + }; + static struct cfi_fixup jedec_fixup_table[] = { +@@ -798,21 +812,25 @@ static struct mtd_info *cfi_amdstd_setup(struct mtd_info *mtd) + } + + /* +- * Return true if the chip is ready. ++ * Return true if the chip is ready and has the correct value. + * + * Ready is one of: read mode, query mode, erase-suspend-read mode (in any + * non-suspended sector) and is indicated by no toggle bits toggling. + * ++ * Error are indicated by toggling bits or bits held with the wrong value, ++ * or with bits toggling. ++ * + * Note that anything more complicated than checking if no bits are toggling + * (including checking DQ5 for an error status) is tricky to get working + * correctly and is therefore not done (particularly with interleaved chips + * as each chip must be checked independently of the others). + */ + static int __xipram chip_ready(struct map_info *map, struct flchip *chip, +- unsigned long addr) ++ unsigned long addr, map_word *expected) + { + struct cfi_private *cfi = map->fldrv_priv; + map_word d, t; ++ int ret; + + if (cfi_use_status_reg(cfi)) { + map_word ready = CMD(CFI_SR_DRB); +@@ -822,57 +840,32 @@ static int __xipram chip_ready(struct map_info *map, struct flchip *chip, + */ + cfi_send_gen_cmd(0x70, cfi->addr_unlock1, chip->start, map, cfi, + cfi->device_type, NULL); +- d = map_read(map, addr); ++ t = map_read(map, addr); + +- return map_word_andequal(map, d, ready, ready); ++ return map_word_andequal(map, t, ready, ready); + } + + d = map_read(map, addr); + t = map_read(map, addr); + +- return map_word_equal(map, d, t); ++ ret = map_word_equal(map, d, t); ++ ++ if (!ret || !expected) ++ return ret; ++ ++ return map_word_equal(map, t, *expected); + } + +-/* +- * Return true if the chip is ready and has the correct value. +- * +- * Ready is one of: read mode, query mode, erase-suspend-read mode (in any +- * non-suspended sector) and it is indicated by no bits toggling. +- * +- * Error are indicated by toggling bits or bits held with the wrong value, +- * or with bits toggling. +- * +- * Note that anything more complicated than checking if no bits are toggling +- * (including checking DQ5 for an error status) is tricky to get working +- * correctly and is therefore not done (particularly with interleaved chips +- * as each chip must be checked independently of the others). +- * +- */ + static int __xipram chip_good(struct map_info *map, struct flchip *chip, +- unsigned long addr, map_word expected) ++ unsigned long addr, map_word *expected) + { + struct cfi_private *cfi = map->fldrv_priv; +- map_word oldd, curd; +- +- if (cfi_use_status_reg(cfi)) { +- map_word ready = CMD(CFI_SR_DRB); +- +- /* +- * For chips that support status register, check device +- * ready bit +- */ +- cfi_send_gen_cmd(0x70, cfi->addr_unlock1, chip->start, map, cfi, +- cfi->device_type, NULL); +- curd = map_read(map, addr); +- +- return map_word_andequal(map, curd, ready, ready); +- } ++ map_word *datum = expected; + +- oldd = map_read(map, addr); +- curd = map_read(map, addr); ++ if (cfi->quirks & CFI_QUIRK_DQ_TRUE_DATA) ++ datum = NULL; + +- return map_word_equal(map, oldd, curd) && +- map_word_equal(map, curd, expected); ++ return chip_ready(map, chip, addr, datum); + } + + static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode) +@@ -889,7 +882,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr + + case FL_STATUS: + for (;;) { +- if (chip_ready(map, chip, adr)) ++ if (chip_ready(map, chip, adr, NULL)) + break; + + if (time_after(jiffies, timeo)) { +@@ -927,7 +920,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr + chip->state = FL_ERASE_SUSPENDING; + chip->erase_suspended = 1; + for (;;) { +- if (chip_ready(map, chip, adr)) ++ if (chip_ready(map, chip, adr, NULL)) + break; + + if (time_after(jiffies, timeo)) { +@@ -1458,7 +1451,7 @@ static int do_otp_lock(struct map_info *map, struct flchip *chip, loff_t adr, + /* wait for chip to become ready */ + timeo = jiffies + msecs_to_jiffies(2); + for (;;) { +- if (chip_ready(map, chip, adr)) ++ if (chip_ready(map, chip, adr, NULL)) + break; + + if (time_after(jiffies, timeo)) { +@@ -1694,7 +1687,7 @@ static int __xipram do_write_oneword_once(struct map_info *map, + * "chip_good" to avoid the failure due to scheduling. + */ + if (time_after(jiffies, timeo) && +- !chip_good(map, chip, adr, datum)) { ++ !chip_good(map, chip, adr, &datum)) { + xip_enable(map, chip, adr); + printk(KERN_WARNING "MTD %s(): software timeout\n", __func__); + xip_disable(map, chip, adr); +@@ -1702,7 +1695,7 @@ static int __xipram do_write_oneword_once(struct map_info *map, + break; + } + +- if (chip_good(map, chip, adr, datum)) { ++ if (chip_good(map, chip, adr, &datum)) { + if (cfi_check_err_status(map, chip, adr)) + ret = -EIO; + break; +@@ -1974,14 +1967,14 @@ static int __xipram do_write_buffer_wait(struct map_info *map, + * "chip_good" to avoid the failure due to scheduling. + */ + if (time_after(jiffies, timeo) && +- !chip_good(map, chip, adr, datum)) { ++ !chip_good(map, chip, adr, &datum)) { + pr_err("MTD %s(): software timeout, address:0x%.8lx.\n", + __func__, adr); + ret = -EIO; + break; + } + +- if (chip_good(map, chip, adr, datum)) { ++ if (chip_good(map, chip, adr, &datum)) { + if (cfi_check_err_status(map, chip, adr)) + ret = -EIO; + break; +@@ -2190,7 +2183,7 @@ static int cfi_amdstd_panic_wait(struct map_info *map, struct flchip *chip, + * If the driver thinks the chip is idle, and no toggle bits + * are changing, then the chip is actually idle for sure. + */ +- if (chip->state == FL_READY && chip_ready(map, chip, adr)) ++ if (chip->state == FL_READY && chip_ready(map, chip, adr, NULL)) + return 0; + + /* +@@ -2207,7 +2200,7 @@ static int cfi_amdstd_panic_wait(struct map_info *map, struct flchip *chip, + + /* wait for the chip to become ready */ + for (i = 0; i < jiffies_to_usecs(timeo); i++) { +- if (chip_ready(map, chip, adr)) ++ if (chip_ready(map, chip, adr, NULL)) + return 0; + + udelay(1); +@@ -2271,13 +2264,13 @@ retry: + map_write(map, datum, adr); + + for (i = 0; i < jiffies_to_usecs(uWriteTimeout); i++) { +- if (chip_ready(map, chip, adr)) ++ if (chip_ready(map, chip, adr, NULL)) + break; + + udelay(1); + } + +- if (!chip_good(map, chip, adr, datum) || ++ if (!chip_ready(map, chip, adr, &datum) || + cfi_check_err_status(map, chip, adr)) { + /* reset on all failures. */ + map_write(map, CMD(0xF0), chip->start); +@@ -2419,6 +2412,7 @@ static int __xipram do_erase_chip(struct map_info *map, struct flchip *chip) + DECLARE_WAITQUEUE(wait, current); + int ret; + int retry_cnt = 0; ++ map_word datum = map_word_ff(map); + + adr = cfi->addr_unlock1; + +@@ -2473,7 +2467,7 @@ static int __xipram do_erase_chip(struct map_info *map, struct flchip *chip) + chip->erase_suspended = 0; + } + +- if (chip_good(map, chip, adr, map_word_ff(map))) { ++ if (chip_ready(map, chip, adr, &datum)) { + if (cfi_check_err_status(map, chip, adr)) + ret = -EIO; + break; +@@ -2518,6 +2512,7 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip, + DECLARE_WAITQUEUE(wait, current); + int ret; + int retry_cnt = 0; ++ map_word datum = map_word_ff(map); + + adr += chip->start; + +@@ -2572,7 +2567,7 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip, + chip->erase_suspended = 0; + } + +- if (chip_good(map, chip, adr, map_word_ff(map))) { ++ if (chip_ready(map, chip, adr, &datum)) { + if (cfi_check_err_status(map, chip, adr)) + ret = -EIO; + break; +@@ -2766,7 +2761,7 @@ static int __maybe_unused do_ppb_xxlock(struct map_info *map, + */ + timeo = jiffies + msecs_to_jiffies(2000); /* 2s max (un)locking */ + for (;;) { +- if (chip_ready(map, chip, adr)) ++ if (chip_ready(map, chip, adr, NULL)) + break; + + if (time_after(jiffies, timeo)) { +diff --git a/drivers/mtd/nand/raw/cadence-nand-controller.c b/drivers/mtd/nand/raw/cadence-nand-controller.c +index b46786cd53e0b..4fdb39214a124 100644 +--- a/drivers/mtd/nand/raw/cadence-nand-controller.c ++++ b/drivers/mtd/nand/raw/cadence-nand-controller.c +@@ -2983,11 +2983,10 @@ static int cadence_nand_dt_probe(struct platform_device *ofdev) + if (IS_ERR(cdns_ctrl->reg)) + return PTR_ERR(cdns_ctrl->reg); + +- res = platform_get_resource(ofdev, IORESOURCE_MEM, 1); +- cdns_ctrl->io.dma = res->start; +- cdns_ctrl->io.virt = devm_ioremap_resource(&ofdev->dev, res); ++ cdns_ctrl->io.virt = devm_platform_get_and_ioremap_resource(ofdev, 1, &res); + if (IS_ERR(cdns_ctrl->io.virt)) + return PTR_ERR(cdns_ctrl->io.virt); ++ cdns_ctrl->io.dma = res->start; + + dt->clk = devm_clk_get(cdns_ctrl->dev, "nf_clk"); + if (IS_ERR(dt->clk)) +diff --git a/drivers/mtd/nand/raw/denali_pci.c b/drivers/mtd/nand/raw/denali_pci.c +index 20c085a30adcb..de7e722d38262 100644 +--- a/drivers/mtd/nand/raw/denali_pci.c ++++ b/drivers/mtd/nand/raw/denali_pci.c +@@ -74,22 +74,21 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) + return ret; + } + +- denali->reg = ioremap(csr_base, csr_len); ++ denali->reg = devm_ioremap(denali->dev, csr_base, csr_len); + if (!denali->reg) { + dev_err(&dev->dev, "Spectra: Unable to remap memory region\n"); + return -ENOMEM; + } + +- denali->host = ioremap(mem_base, mem_len); ++ denali->host = devm_ioremap(denali->dev, mem_base, mem_len); + if (!denali->host) { + dev_err(&dev->dev, "Spectra: ioremap failed!"); +- ret = -ENOMEM; +- goto out_unmap_reg; ++ return -ENOMEM; + } + + ret = denali_init(denali); + if (ret) +- goto out_unmap_host; ++ return ret; + + nsels = denali->nbanks; + +@@ -117,10 +116,6 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) + + out_remove_denali: + denali_remove(denali); +-out_unmap_host: +- iounmap(denali->host); +-out_unmap_reg: +- iounmap(denali->reg); + return ret; + } + +@@ -129,8 +124,6 @@ static void denali_pci_remove(struct pci_dev *dev) + struct denali_controller *denali = pci_get_drvdata(dev); + + denali_remove(denali); +- iounmap(denali->reg); +- iounmap(denali->host); + } + + static struct pci_driver denali_pci_driver = { +diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c +index 2b26a875a8550..e8146a47da123 100644 +--- a/drivers/mtd/spi-nor/core.c ++++ b/drivers/mtd/spi-nor/core.c +@@ -827,6 +827,15 @@ static int spi_nor_write_16bit_sr_and_check(struct spi_nor *nor, u8 sr1) + if (ret) + return ret; + ++ ret = spi_nor_read_sr(nor, sr_cr); ++ if (ret) ++ return ret; ++ ++ if (sr1 != sr_cr[0]) { ++ dev_dbg(nor->dev, "SR: Read back test failed\n"); ++ return -EIO; ++ } ++ + if (nor->flags & SNOR_F_NO_READ_CR) + return 0; + +diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h +index fa1246e399806..766dbd19bba61 100644 +--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h ++++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h +@@ -426,7 +426,7 @@ struct mcp251xfd_hw_tef_obj { + /* The tx_obj_raw version is used in spi async, i.e. without + * regmap. We have to take care of endianness ourselves. + */ +-struct mcp251xfd_hw_tx_obj_raw { ++struct __packed mcp251xfd_hw_tx_obj_raw { + __le32 id; + __le32 flags; + u8 data[sizeof_field(struct canfd_frame, data)]; +diff --git a/drivers/net/can/xilinx_can.c b/drivers/net/can/xilinx_can.c +index 375998263af7a..1c42417810fcd 100644 +--- a/drivers/net/can/xilinx_can.c ++++ b/drivers/net/can/xilinx_can.c +@@ -239,7 +239,7 @@ static const struct can_bittiming_const xcan_bittiming_const_canfd = { + }; + + /* AXI CANFD Data Bittiming constants as per AXI CANFD 1.0 specs */ +-static struct can_bittiming_const xcan_data_bittiming_const_canfd = { ++static const struct can_bittiming_const xcan_data_bittiming_const_canfd = { + .name = DRIVER_NAME, + .tseg1_min = 1, + .tseg1_max = 16, +@@ -265,7 +265,7 @@ static const struct can_bittiming_const xcan_bittiming_const_canfd2 = { + }; + + /* AXI CANFD 2.0 Data Bittiming constants as per AXI CANFD 2.0 spec */ +-static struct can_bittiming_const xcan_data_bittiming_const_canfd2 = { ++static const struct can_bittiming_const xcan_data_bittiming_const_canfd2 = { + .name = DRIVER_NAME, + .tseg1_min = 1, + .tseg1_max = 32, +diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c +index c355824ddb814..265620a81f9f6 100644 +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -1952,13 +1952,7 @@ static void mt7531_sgmii_validate(struct mt7530_priv *priv, int port, + /* Port5 supports ethier RGMII or SGMII. + * Port6 supports SGMII only. + */ +- switch (port) { +- case 5: +- if (mt7531_is_rgmii_port(priv, port)) +- break; +- fallthrough; +- case 6: +- phylink_set(supported, 1000baseX_Full); ++ if (port == 6) { + phylink_set(supported, 2500baseX_Full); + phylink_set(supported, 2500baseT_Full); + } +@@ -2315,8 +2309,6 @@ static void + mt7530_mac_port_validate(struct dsa_switch *ds, int port, + unsigned long *supported) + { +- if (port == 5) +- phylink_set(supported, 1000baseX_Full); + } + + static void mt7531_mac_port_validate(struct dsa_switch *ds, int port, +@@ -2353,8 +2345,10 @@ mt753x_phylink_validate(struct dsa_switch *ds, int port, + } + + /* This switch only supports 1G full-duplex. */ +- if (state->interface != PHY_INTERFACE_MODE_MII) ++ if (state->interface != PHY_INTERFACE_MODE_MII) { + phylink_set(mask, 1000baseT_Full); ++ phylink_set(mask, 1000baseX_Full); ++ } + + priv->info->mac_port_validate(ds, port, mask); + +diff --git a/drivers/net/ethernet/broadcom/Makefile b/drivers/net/ethernet/broadcom/Makefile +index 7046ad6d3d0e3..ac50da49ca770 100644 +--- a/drivers/net/ethernet/broadcom/Makefile ++++ b/drivers/net/ethernet/broadcom/Makefile +@@ -16,3 +16,8 @@ obj-$(CONFIG_BGMAC_BCMA) += bgmac-bcma.o bgmac-bcma-mdio.o + obj-$(CONFIG_BGMAC_PLATFORM) += bgmac-platform.o + obj-$(CONFIG_SYSTEMPORT) += bcmsysport.o + obj-$(CONFIG_BNXT) += bnxt/ ++ ++# FIXME: temporarily silence -Warray-bounds on non W=1+ builds ++ifndef KBUILD_EXTRA_WARN ++CFLAGS_tg3.o += -Wno-array-bounds ++endif +diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c +index d6b6ebb3f1ec7..51e071c20e397 100644 +--- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c ++++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c +@@ -1150,7 +1150,7 @@ static struct sock *chtls_recv_sock(struct sock *lsk, + fl6.daddr = ip6h->saddr; + fl6.fl6_dport = inet_rsk(oreq)->ir_rmt_port; + fl6.fl6_sport = htons(inet_rsk(oreq)->ir_num); +- security_req_classify_flow(oreq, flowi6_to_flowi(&fl6)); ++ security_req_classify_flow(oreq, flowi6_to_flowi_common(&fl6)); + dst = ip6_dst_lookup_flow(sock_net(lsk), lsk, &fl6, NULL); + if (IS_ERR(dst)) + goto free_sk; +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c b/drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c +index 4e4029d5c8e11..9553d280ec1b7 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_api_cmd.c +@@ -818,7 +818,6 @@ static int api_chain_init(struct hinic_api_cmd_chain *chain, + { + struct hinic_hwif *hwif = attr->hwif; + struct pci_dev *pdev = hwif->pdev; +- size_t cell_ctxt_size; + + chain->hwif = hwif; + chain->chain_type = attr->chain_type; +@@ -830,8 +829,8 @@ static int api_chain_init(struct hinic_api_cmd_chain *chain, + + sema_init(&chain->sem, 1); + +- cell_ctxt_size = chain->num_cells * sizeof(*chain->cell_ctxt); +- chain->cell_ctxt = devm_kzalloc(&pdev->dev, cell_ctxt_size, GFP_KERNEL); ++ chain->cell_ctxt = devm_kcalloc(&pdev->dev, chain->num_cells, ++ sizeof(*chain->cell_ctxt), GFP_KERNEL); + if (!chain->cell_ctxt) + return -ENOMEM; + +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c b/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c +index 5a6bbee819cde..21b8235952d33 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c +@@ -796,11 +796,10 @@ static int init_cmdqs_ctxt(struct hinic_hwdev *hwdev, + struct hinic_cmdq_ctxt *cmdq_ctxts; + struct pci_dev *pdev = hwif->pdev; + struct hinic_pfhwdev *pfhwdev; +- size_t cmdq_ctxts_size; + int err; + +- cmdq_ctxts_size = HINIC_MAX_CMDQ_TYPES * sizeof(*cmdq_ctxts); +- cmdq_ctxts = devm_kzalloc(&pdev->dev, cmdq_ctxts_size, GFP_KERNEL); ++ cmdq_ctxts = devm_kcalloc(&pdev->dev, HINIC_MAX_CMDQ_TYPES, ++ sizeof(*cmdq_ctxts), GFP_KERNEL); + if (!cmdq_ctxts) + return -ENOMEM; + +@@ -884,7 +883,6 @@ int hinic_init_cmdqs(struct hinic_cmdqs *cmdqs, struct hinic_hwif *hwif, + struct hinic_func_to_io *func_to_io = cmdqs_to_func_to_io(cmdqs); + struct pci_dev *pdev = hwif->pdev; + struct hinic_hwdev *hwdev; +- size_t saved_wqs_size; + u16 max_wqe_size; + int err; + +@@ -895,8 +893,8 @@ int hinic_init_cmdqs(struct hinic_cmdqs *cmdqs, struct hinic_hwif *hwif, + if (!cmdqs->cmdq_buf_pool) + return -ENOMEM; + +- saved_wqs_size = HINIC_MAX_CMDQ_TYPES * sizeof(struct hinic_wq); +- cmdqs->saved_wqs = devm_kzalloc(&pdev->dev, saved_wqs_size, GFP_KERNEL); ++ cmdqs->saved_wqs = devm_kcalloc(&pdev->dev, HINIC_MAX_CMDQ_TYPES, ++ sizeof(*cmdqs->saved_wqs), GFP_KERNEL); + if (!cmdqs->saved_wqs) { + err = -ENOMEM; + goto err_saved_wqs; +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c b/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c +index 0c74f66746344..799b85c88eff8 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c +@@ -162,7 +162,6 @@ static int init_msix(struct hinic_hwdev *hwdev) + struct hinic_hwif *hwif = hwdev->hwif; + struct pci_dev *pdev = hwif->pdev; + int nr_irqs, num_aeqs, num_ceqs; +- size_t msix_entries_size; + int i, err; + + num_aeqs = HINIC_HWIF_NUM_AEQS(hwif); +@@ -171,8 +170,8 @@ static int init_msix(struct hinic_hwdev *hwdev) + if (nr_irqs > HINIC_HWIF_NUM_IRQS(hwif)) + nr_irqs = HINIC_HWIF_NUM_IRQS(hwif); + +- msix_entries_size = nr_irqs * sizeof(*hwdev->msix_entries); +- hwdev->msix_entries = devm_kzalloc(&pdev->dev, msix_entries_size, ++ hwdev->msix_entries = devm_kcalloc(&pdev->dev, nr_irqs, ++ sizeof(*hwdev->msix_entries), + GFP_KERNEL); + if (!hwdev->msix_entries) + return -ENOMEM; +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c b/drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c +index 19942fef99d97..7396158df64f7 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c +@@ -631,16 +631,15 @@ static int alloc_eq_pages(struct hinic_eq *eq) + struct hinic_hwif *hwif = eq->hwif; + struct pci_dev *pdev = hwif->pdev; + u32 init_val, addr, val; +- size_t addr_size; + int err, pg; + +- addr_size = eq->num_pages * sizeof(*eq->dma_addr); +- eq->dma_addr = devm_kzalloc(&pdev->dev, addr_size, GFP_KERNEL); ++ eq->dma_addr = devm_kcalloc(&pdev->dev, eq->num_pages, ++ sizeof(*eq->dma_addr), GFP_KERNEL); + if (!eq->dma_addr) + return -ENOMEM; + +- addr_size = eq->num_pages * sizeof(*eq->virt_addr); +- eq->virt_addr = devm_kzalloc(&pdev->dev, addr_size, GFP_KERNEL); ++ eq->virt_addr = devm_kcalloc(&pdev->dev, eq->num_pages, ++ sizeof(*eq->virt_addr), GFP_KERNEL); + if (!eq->virt_addr) { + err = -ENOMEM; + goto err_virt_addr_alloc; +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c b/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c +index 819fa13034c05..027dcc4535065 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c +@@ -647,6 +647,7 @@ int hinic_pf_to_mgmt_init(struct hinic_pf_to_mgmt *pf_to_mgmt, + err = alloc_msg_buf(pf_to_mgmt); + if (err) { + dev_err(&pdev->dev, "Failed to allocate msg buffers\n"); ++ destroy_workqueue(pf_to_mgmt->workq); + hinic_health_reporters_destroy(hwdev->devlink_dev); + return err; + } +@@ -654,6 +655,7 @@ int hinic_pf_to_mgmt_init(struct hinic_pf_to_mgmt *pf_to_mgmt, + err = hinic_api_cmd_init(pf_to_mgmt->cmd_chain, hwif); + if (err) { + dev_err(&pdev->dev, "Failed to initialize cmd chains\n"); ++ destroy_workqueue(pf_to_mgmt->workq); + hinic_health_reporters_destroy(hwdev->devlink_dev); + return err; + } +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_wq.c b/drivers/net/ethernet/huawei/hinic/hinic_hw_wq.c +index f04ac00e3e703..f930cd6a75f71 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_wq.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_wq.c +@@ -192,20 +192,20 @@ static int alloc_page_arrays(struct hinic_wqs *wqs) + { + struct hinic_hwif *hwif = wqs->hwif; + struct pci_dev *pdev = hwif->pdev; +- size_t size; + +- size = wqs->num_pages * sizeof(*wqs->page_paddr); +- wqs->page_paddr = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); ++ wqs->page_paddr = devm_kcalloc(&pdev->dev, wqs->num_pages, ++ sizeof(*wqs->page_paddr), GFP_KERNEL); + if (!wqs->page_paddr) + return -ENOMEM; + +- size = wqs->num_pages * sizeof(*wqs->page_vaddr); +- wqs->page_vaddr = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); ++ wqs->page_vaddr = devm_kcalloc(&pdev->dev, wqs->num_pages, ++ sizeof(*wqs->page_vaddr), GFP_KERNEL); + if (!wqs->page_vaddr) + goto err_page_vaddr; + +- size = wqs->num_pages * sizeof(*wqs->shadow_page_vaddr); +- wqs->shadow_page_vaddr = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); ++ wqs->shadow_page_vaddr = devm_kcalloc(&pdev->dev, wqs->num_pages, ++ sizeof(*wqs->shadow_page_vaddr), ++ GFP_KERNEL); + if (!wqs->shadow_page_vaddr) + goto err_page_shadow_vaddr; + +@@ -378,15 +378,14 @@ static int alloc_wqes_shadow(struct hinic_wq *wq) + { + struct hinic_hwif *hwif = wq->hwif; + struct pci_dev *pdev = hwif->pdev; +- size_t size; + +- size = wq->num_q_pages * wq->max_wqe_size; +- wq->shadow_wqe = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); ++ wq->shadow_wqe = devm_kcalloc(&pdev->dev, wq->num_q_pages, ++ wq->max_wqe_size, GFP_KERNEL); + if (!wq->shadow_wqe) + return -ENOMEM; + +- size = wq->num_q_pages * sizeof(wq->prod_idx); +- wq->shadow_idx = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); ++ wq->shadow_idx = devm_kcalloc(&pdev->dev, wq->num_q_pages, ++ sizeof(*wq->shadow_idx), GFP_KERNEL); + if (!wq->shadow_idx) + goto err_shadow_idx; + +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_main.c b/drivers/net/ethernet/huawei/hinic/hinic_main.c +index 350225bbe0be1..ace949fe62331 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_main.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_main.c +@@ -144,13 +144,12 @@ static int create_txqs(struct hinic_dev *nic_dev) + { + int err, i, j, num_txqs = hinic_hwdev_num_qps(nic_dev->hwdev); + struct net_device *netdev = nic_dev->netdev; +- size_t txq_size; + + if (nic_dev->txqs) + return -EINVAL; + +- txq_size = num_txqs * sizeof(*nic_dev->txqs); +- nic_dev->txqs = devm_kzalloc(&netdev->dev, txq_size, GFP_KERNEL); ++ nic_dev->txqs = devm_kcalloc(&netdev->dev, num_txqs, ++ sizeof(*nic_dev->txqs), GFP_KERNEL); + if (!nic_dev->txqs) + return -ENOMEM; + +@@ -242,13 +241,12 @@ static int create_rxqs(struct hinic_dev *nic_dev) + { + int err, i, j, num_rxqs = hinic_hwdev_num_qps(nic_dev->hwdev); + struct net_device *netdev = nic_dev->netdev; +- size_t rxq_size; + + if (nic_dev->rxqs) + return -EINVAL; + +- rxq_size = num_rxqs * sizeof(*nic_dev->rxqs); +- nic_dev->rxqs = devm_kzalloc(&netdev->dev, rxq_size, GFP_KERNEL); ++ nic_dev->rxqs = devm_kcalloc(&netdev->dev, num_rxqs, ++ sizeof(*nic_dev->rxqs), GFP_KERNEL); + if (!nic_dev->rxqs) + return -ENOMEM; + +diff --git a/drivers/net/ethernet/huawei/hinic/hinic_tx.c b/drivers/net/ethernet/huawei/hinic/hinic_tx.c +index 8da7d46363b27..3828b09bfea3f 100644 +--- a/drivers/net/ethernet/huawei/hinic/hinic_tx.c ++++ b/drivers/net/ethernet/huawei/hinic/hinic_tx.c +@@ -861,7 +861,6 @@ int hinic_init_txq(struct hinic_txq *txq, struct hinic_sq *sq, + struct hinic_dev *nic_dev = netdev_priv(netdev); + struct hinic_hwdev *hwdev = nic_dev->hwdev; + int err, irqname_len; +- size_t sges_size; + + txq->netdev = netdev; + txq->sq = sq; +@@ -870,13 +869,13 @@ int hinic_init_txq(struct hinic_txq *txq, struct hinic_sq *sq, + + txq->max_sges = HINIC_MAX_SQ_BUFDESCS; + +- sges_size = txq->max_sges * sizeof(*txq->sges); +- txq->sges = devm_kzalloc(&netdev->dev, sges_size, GFP_KERNEL); ++ txq->sges = devm_kcalloc(&netdev->dev, txq->max_sges, ++ sizeof(*txq->sges), GFP_KERNEL); + if (!txq->sges) + return -ENOMEM; + +- sges_size = txq->max_sges * sizeof(*txq->free_sges); +- txq->free_sges = devm_kzalloc(&netdev->dev, sges_size, GFP_KERNEL); ++ txq->free_sges = devm_kcalloc(&netdev->dev, txq->max_sges, ++ sizeof(*txq->free_sges), GFP_KERNEL); + if (!txq->free_sges) { + err = -ENOMEM; + goto err_alloc_free_sges; +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +index 55772f0cbbf8f..15472fb15d7d2 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +@@ -2024,16 +2024,16 @@ void mlx5_del_flow_rules(struct mlx5_flow_handle *handle) + down_write_ref_node(&fte->node, false); + for (i = handle->num_rules - 1; i >= 0; i--) + tree_remove_node(&handle->rule[i]->node, true); +- if (fte->dests_size) { +- if (fte->modify_mask) +- modify_fte(fte); +- up_write_ref_node(&fte->node, false); +- } else if (list_empty(&fte->node.children)) { ++ if (list_empty(&fte->node.children)) { + del_hw_fte(&fte->node); + /* Avoid double call to del_hw_fte */ + fte->node.del_hw_func = NULL; + up_write_ref_node(&fte->node, false); + tree_put_node(&fte->node, false); ++ } else if (fte->dests_size) { ++ if (fte->modify_mask) ++ modify_fte(fte); ++ up_write_ref_node(&fte->node, false); + } else { + up_write_ref_node(&fte->node, false); + } +diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c +index 7ec1d0ee9beeb..ecd1856bef5e3 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c +@@ -133,7 +133,7 @@ static int mlxsw_get_cooling_device_idx(struct mlxsw_thermal *thermal, + /* Allow mlxsw thermal zone binding to an external cooling device */ + for (i = 0; i < ARRAY_SIZE(mlxsw_thermal_external_allowed_cdev); i++) { + if (strnstr(cdev->type, mlxsw_thermal_external_allowed_cdev[i], +- sizeof(cdev->type))) ++ strlen(cdev->type))) + return 0; + } + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c +index 5f92b16913605..aff6d4f35cd2f 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c +@@ -168,8 +168,6 @@ static int mlxsw_sp_dcbnl_ieee_setets(struct net_device *dev, + static int mlxsw_sp_dcbnl_app_validate(struct net_device *dev, + struct dcb_app *app) + { +- int prio; +- + if (app->priority >= IEEE_8021QAZ_MAX_TCS) { + netdev_err(dev, "APP entry with priority value %u is invalid\n", + app->priority); +@@ -183,17 +181,6 @@ static int mlxsw_sp_dcbnl_app_validate(struct net_device *dev, + app->protocol); + return -EINVAL; + } +- +- /* Warn about any DSCP APP entries with the same PID. */ +- prio = fls(dcb_ieee_getapp_mask(dev, app)); +- if (prio--) { +- if (prio < app->priority) +- netdev_warn(dev, "Choosing priority %d for DSCP %d in favor of previously-active value of %d\n", +- app->priority, app->protocol, prio); +- else if (prio > app->priority) +- netdev_warn(dev, "Ignoring new priority %d for DSCP %d in favor of current value of %d\n", +- app->priority, app->protocol, prio); +- } + break; + + case IEEE_8021QAZ_APP_SEL_ETHERTYPE: +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_trap.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_trap.c +index 433f14ade464c..02ba6aa011055 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_trap.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_trap.c +@@ -709,7 +709,7 @@ static const struct mlxsw_sp_trap_item mlxsw_sp_trap_items_arr[] = { + .trap = MLXSW_SP_TRAP_CONTROL(LLDP, LLDP, TRAP), + .listeners_arr = { + MLXSW_RXL(mlxsw_sp_rx_ptp_listener, LLDP, TRAP_TO_CPU, +- false, SP_LLDP, DISCARD), ++ true, SP_LLDP, DISCARD), + }, + }, + { +diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c +index 6f950979d25e4..fa1a872c4bc83 100644 +--- a/drivers/net/ethernet/sfc/ef10.c ++++ b/drivers/net/ethernet/sfc/ef10.c +@@ -2240,7 +2240,7 @@ int efx_ef10_tx_tso_desc(struct efx_tx_queue *tx_queue, struct sk_buff *skb, + * guaranteed to satisfy the second as we only attempt TSO if + * inner_network_header <= 208. + */ +- ip_tot_len = -EFX_TSO2_MAX_HDRLEN; ++ ip_tot_len = 0x10000 - EFX_TSO2_MAX_HDRLEN; + EFX_WARN_ON_ONCE_PARANOID(mss + EFX_TSO2_MAX_HDRLEN + + (tcp->doff << 2u) > ip_tot_len); + +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +index 0462dcc93e536..dd5c4ef92ef3c 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +@@ -1084,8 +1084,9 @@ static int stmmac_test_rxp(struct stmmac_priv *priv) + unsigned char addr[ETH_ALEN] = {0xde, 0xad, 0xbe, 0xef, 0x00, 0x00}; + struct tc_cls_u32_offload cls_u32 = { }; + struct stmmac_packet_attrs attr = { }; +- struct tc_action **actions, *act; ++ struct tc_action **actions; + struct tc_u32_sel *sel; ++ struct tcf_gact *gact; + struct tcf_exts *exts; + int ret, i, nk = 1; + +@@ -1104,14 +1105,14 @@ static int stmmac_test_rxp(struct stmmac_priv *priv) + goto cleanup_sel; + } + +- actions = kzalloc(nk * sizeof(*actions), GFP_KERNEL); ++ actions = kcalloc(nk, sizeof(*actions), GFP_KERNEL); + if (!actions) { + ret = -ENOMEM; + goto cleanup_exts; + } + +- act = kzalloc(nk * sizeof(*act), GFP_KERNEL); +- if (!act) { ++ gact = kcalloc(nk, sizeof(*gact), GFP_KERNEL); ++ if (!gact) { + ret = -ENOMEM; + goto cleanup_actions; + } +@@ -1126,9 +1127,7 @@ static int stmmac_test_rxp(struct stmmac_priv *priv) + exts->nr_actions = nk; + exts->actions = actions; + for (i = 0; i < nk; i++) { +- struct tcf_gact *gact = to_gact(&act[i]); +- +- actions[i] = &act[i]; ++ actions[i] = (struct tc_action *)&gact[i]; + gact->tcf_action = TC_ACT_SHOT; + } + +@@ -1152,7 +1151,7 @@ static int stmmac_test_rxp(struct stmmac_priv *priv) + stmmac_tc_setup_cls_u32(priv, priv, &cls_u32); + + cleanup_act: +- kfree(act); ++ kfree(gact); + cleanup_actions: + kfree(actions); + cleanup_exts: +diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c +index e3676386d0eeb..18484370da0d4 100644 +--- a/drivers/net/hyperv/netvsc_drv.c ++++ b/drivers/net/hyperv/netvsc_drv.c +@@ -2629,7 +2629,10 @@ static int netvsc_suspend(struct hv_device *dev) + + /* Save the current config info */ + ndev_ctx->saved_netvsc_dev_info = netvsc_devinfo_get(nvdev); +- ++ if (!ndev_ctx->saved_netvsc_dev_info) { ++ ret = -ENOMEM; ++ goto out; ++ } + ret = netvsc_detach(net, nvdev); + out: + rtnl_unlock(); +diff --git a/drivers/net/ipa/ipa_endpoint.c b/drivers/net/ipa/ipa_endpoint.c +index eb25a13042ea9..7e1208446e04b 100644 +--- a/drivers/net/ipa/ipa_endpoint.c ++++ b/drivers/net/ipa/ipa_endpoint.c +@@ -884,7 +884,7 @@ static int ipa_endpoint_replenish_one(struct ipa_endpoint *endpoint) + err_trans_free: + gsi_trans_free(trans); + err_free_pages: +- __free_pages(page, get_order(IPA_RX_BUFFER_SIZE)); ++ put_page(page); + + return -ENOMEM; + } +@@ -1179,7 +1179,7 @@ void ipa_endpoint_trans_release(struct ipa_endpoint *endpoint, + struct page *page = trans->data; + + if (page) +- __free_pages(page, get_order(IPA_RX_BUFFER_SIZE)); ++ put_page(page); + } + } + +diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c +index 92e94ac94a342..bbbe198f83e88 100644 +--- a/drivers/net/phy/micrel.c ++++ b/drivers/net/phy/micrel.c +@@ -283,7 +283,7 @@ static int kszphy_config_reset(struct phy_device *phydev) + } + } + +- if (priv->led_mode >= 0) ++ if (priv->type && priv->led_mode >= 0) + kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); + + return 0; +@@ -299,10 +299,10 @@ static int kszphy_config_init(struct phy_device *phydev) + + type = priv->type; + +- if (type->has_broadcast_disable) ++ if (type && type->has_broadcast_disable) + kszphy_broadcast_disable(phydev); + +- if (type->has_nand_tree_disable) ++ if (type && type->has_nand_tree_disable) + kszphy_nand_tree_disable(phydev); + + return kszphy_config_reset(phydev); +@@ -1112,7 +1112,7 @@ static int kszphy_probe(struct phy_device *phydev) + + priv->type = type; + +- if (type->led_mode_reg) { ++ if (type && type->led_mode_reg) { + ret = of_property_read_u32(np, "micrel,led-mode", + &priv->led_mode); + if (ret) +@@ -1133,7 +1133,8 @@ static int kszphy_probe(struct phy_device *phydev) + unsigned long rate = clk_get_rate(clk); + bool rmii_ref_clk_sel_25_mhz; + +- priv->rmii_ref_clk_sel = type->has_rmii_ref_clk_sel; ++ if (type) ++ priv->rmii_ref_clk_sel = type->has_rmii_ref_clk_sel; + rmii_ref_clk_sel_25_mhz = of_property_read_bool(np, + "micrel,rmii-reference-clock-select-25-mhz"); + +diff --git a/drivers/net/wireguard/socket.c b/drivers/net/wireguard/socket.c +index 473221aa22368..eef5911fa2100 100644 +--- a/drivers/net/wireguard/socket.c ++++ b/drivers/net/wireguard/socket.c +@@ -49,7 +49,7 @@ static int send4(struct wg_device *wg, struct sk_buff *skb, + rt = dst_cache_get_ip4(cache, &fl.saddr); + + if (!rt) { +- security_sk_classify_flow(sock, flowi4_to_flowi(&fl)); ++ security_sk_classify_flow(sock, flowi4_to_flowi_common(&fl)); + if (unlikely(!inet_confirm_addr(sock_net(sock), NULL, 0, + fl.saddr, RT_SCOPE_HOST))) { + endpoint->src4.s_addr = 0; +@@ -129,7 +129,7 @@ static int send6(struct wg_device *wg, struct sk_buff *skb, + dst = dst_cache_get_ip6(cache, &fl.saddr); + + if (!dst) { +- security_sk_classify_flow(sock, flowi6_to_flowi(&fl)); ++ security_sk_classify_flow(sock, flowi6_to_flowi_common(&fl)); + if (unlikely(!ipv6_addr_any(&fl.saddr) && + !ipv6_chk_addr(sock_net(sock), &fl.saddr, NULL, 0))) { + endpoint->src6 = fl.saddr = in6addr_any; +diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c +index b59d482d9c23e..b61cd275fbda2 100644 +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -5170,13 +5170,29 @@ err: + static void ath10k_stop(struct ieee80211_hw *hw) + { + struct ath10k *ar = hw->priv; ++ u32 opt; + + ath10k_drain_tx(ar); + + mutex_lock(&ar->conf_mutex); + if (ar->state != ATH10K_STATE_OFF) { +- if (!ar->hw_rfkill_on) +- ath10k_halt(ar); ++ if (!ar->hw_rfkill_on) { ++ /* If the current driver state is RESTARTING but not yet ++ * fully RESTARTED because of incoming suspend event, ++ * then ath10k_halt() is already called via ++ * ath10k_core_restart() and should not be called here. ++ */ ++ if (ar->state != ATH10K_STATE_RESTARTING) { ++ ath10k_halt(ar); ++ } else { ++ /* Suspending here, because when in RESTARTING ++ * state, ath10k_core_stop() skips ++ * ath10k_wait_for_suspend(). ++ */ ++ opt = WMI_PDEV_SUSPEND_AND_DISABLE_INTR; ++ ath10k_wait_for_suspend(ar, opt); ++ } ++ } + ar->state = ATH10K_STATE_OFF; + } + mutex_unlock(&ar->conf_mutex); +diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c +index cc9122f420243..44282aec069d3 100644 +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -4008,8 +4008,8 @@ static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work) + } + + arvif = ath11k_vif_to_arvif(skb_cb->vif); +- if (ar->allocated_vdev_map & (1LL << arvif->vdev_id) && +- arvif->is_started) { ++ mutex_lock(&ar->conf_mutex); ++ if (ar->allocated_vdev_map & (1LL << arvif->vdev_id)) { + ret = ath11k_mac_mgmt_tx_wmi(ar, arvif, skb); + if (ret) { + ath11k_warn(ar->ab, "failed to tx mgmt frame, vdev_id %d :%d\n", +@@ -4025,6 +4025,7 @@ static void ath11k_mgmt_over_wmi_tx_work(struct work_struct *work) + arvif->is_started); + ieee80211_free_txskb(ar->hw, skb); + } ++ mutex_unlock(&ar->conf_mutex); + } + } + +@@ -5325,6 +5326,7 @@ ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw, + struct ath11k *ar = hw->priv; + struct ath11k_base *ab = ar->ab; + struct ath11k_vif *arvif = (void *)vif->drv_priv; ++ struct ath11k_peer *peer; + int ret; + + mutex_lock(&ar->conf_mutex); +@@ -5336,9 +5338,13 @@ ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw, + WARN_ON(!arvif->is_started); + + if (ab->hw_params.vdev_start_delay && +- arvif->vdev_type == WMI_VDEV_TYPE_MONITOR && +- ath11k_peer_find_by_addr(ab, ar->mac_addr)) +- ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr); ++ arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { ++ spin_lock_bh(&ab->base_lock); ++ peer = ath11k_peer_find_by_addr(ab, ar->mac_addr); ++ spin_unlock_bh(&ab->base_lock); ++ if (peer) ++ ath11k_peer_delete(ar, arvif->vdev_id, ar->mac_addr); ++ } + + ret = ath11k_mac_vdev_stop(arvif); + if (ret) +diff --git a/drivers/net/wireless/ath/ath11k/spectral.c b/drivers/net/wireless/ath/ath11k/spectral.c +index ac2a8cfdc1c01..f5ab455ea1a22 100644 +--- a/drivers/net/wireless/ath/ath11k/spectral.c ++++ b/drivers/net/wireless/ath/ath11k/spectral.c +@@ -214,7 +214,10 @@ static int ath11k_spectral_scan_config(struct ath11k *ar, + return -ENODEV; + + arvif->spectral_enabled = (mode != ATH11K_SPECTRAL_DISABLED); ++ ++ spin_lock_bh(&ar->spectral.lock); + ar->spectral.mode = mode; ++ spin_unlock_bh(&ar->spectral.lock); + + ret = ath11k_wmi_vdev_spectral_enable(ar, arvif->vdev_id, + ATH11K_WMI_SPECTRAL_TRIGGER_CMD_CLEAR, +@@ -829,9 +832,6 @@ static inline void ath11k_spectral_ring_free(struct ath11k *ar) + { + struct ath11k_spectral *sp = &ar->spectral; + +- if (!sp->enabled) +- return; +- + ath11k_dbring_srng_cleanup(ar, &sp->rx_ring); + ath11k_dbring_buf_cleanup(ar, &sp->rx_ring); + } +@@ -883,15 +883,16 @@ void ath11k_spectral_deinit(struct ath11k_base *ab) + if (!sp->enabled) + continue; + +- ath11k_spectral_debug_unregister(ar); +- ath11k_spectral_ring_free(ar); ++ mutex_lock(&ar->conf_mutex); ++ ath11k_spectral_scan_config(ar, ATH11K_SPECTRAL_DISABLED); ++ mutex_unlock(&ar->conf_mutex); + + spin_lock_bh(&sp->lock); +- +- sp->mode = ATH11K_SPECTRAL_DISABLED; + sp->enabled = false; +- + spin_unlock_bh(&sp->lock); ++ ++ ath11k_spectral_debug_unregister(ar); ++ ath11k_spectral_ring_free(ar); + } + } + +diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +index b0a4ca3559fd8..abed1effd95ca 100644 +--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +@@ -5615,7 +5615,7 @@ unsigned int ar9003_get_paprd_scale_factor(struct ath_hw *ah, + + static u8 ar9003_get_eepmisc(struct ath_hw *ah) + { +- return ah->eeprom.map4k.baseEepHeader.eepMisc; ++ return ah->eeprom.ar9300_eep.baseEepHeader.opCapFlags.eepMisc; + } + + const struct eeprom_ops eep_ar9300_ops = { +diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h +index a171dbb29fbb6..ad949eb02f3d2 100644 +--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h ++++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h +@@ -720,7 +720,7 @@ + #define AR_CH0_TOP2 (AR_SREV_9300(ah) ? 0x1628c : \ + (AR_SREV_9462(ah) ? 0x16290 : 0x16284)) + #define AR_CH0_TOP2_XPABIASLVL (AR_SREV_9561(ah) ? 0x1e00 : 0xf000) +-#define AR_CH0_TOP2_XPABIASLVL_S 12 ++#define AR_CH0_TOP2_XPABIASLVL_S (AR_SREV_9561(ah) ? 9 : 12) + + #define AR_CH0_XTAL (AR_SREV_9300(ah) ? 0x16294 : \ + ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x16298 : \ +diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +index 0bdc4dcb7b8fe..30ddf333e04dc 100644 +--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c ++++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +@@ -1006,6 +1006,14 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv, + goto rx_next; + } + ++ if (rxstatus->rs_keyix >= ATH_KEYMAX && ++ rxstatus->rs_keyix != ATH9K_RXKEYIX_INVALID) { ++ ath_dbg(common, ANY, ++ "Invalid keyix, dropping (keyix: %d)\n", ++ rxstatus->rs_keyix); ++ goto rx_next; ++ } ++ + /* Get the RX status information */ + + memset(rx_status, 0, sizeof(struct ieee80211_rx_status)); +diff --git a/drivers/net/wireless/ath/carl9170/tx.c b/drivers/net/wireless/ath/carl9170/tx.c +index 235cf77cd60c5..43050dc7b98df 100644 +--- a/drivers/net/wireless/ath/carl9170/tx.c ++++ b/drivers/net/wireless/ath/carl9170/tx.c +@@ -1557,6 +1557,9 @@ static struct carl9170_vif_info *carl9170_pick_beaconing_vif(struct ar9170 *ar) + goto out; + } + } while (ar->beacon_enabled && i--); ++ ++ /* no entry found in list */ ++ return NULL; + } + + out: +diff --git a/drivers/net/wireless/broadcom/b43/phy_n.c b/drivers/net/wireless/broadcom/b43/phy_n.c +index 665b737fbb0d8..39975b7d1a16b 100644 +--- a/drivers/net/wireless/broadcom/b43/phy_n.c ++++ b/drivers/net/wireless/broadcom/b43/phy_n.c +@@ -582,7 +582,7 @@ static void b43_nphy_adjust_lna_gain_table(struct b43_wldev *dev) + u16 data[4]; + s16 gain[2]; + u16 minmax[2]; +- static const u16 lna_gain[4] = { -2, 10, 19, 25 }; ++ static const s16 lna_gain[4] = { -2, 10, 19, 25 }; + + if (nphy->hang_avoid) + b43_nphy_stay_in_carrier_search(dev, 1); +diff --git a/drivers/net/wireless/broadcom/b43legacy/phy.c b/drivers/net/wireless/broadcom/b43legacy/phy.c +index 05404fbd1e70b..c1395e622759e 100644 +--- a/drivers/net/wireless/broadcom/b43legacy/phy.c ++++ b/drivers/net/wireless/broadcom/b43legacy/phy.c +@@ -1123,7 +1123,7 @@ void b43legacy_phy_lo_b_measure(struct b43legacy_wldev *dev) + struct b43legacy_phy *phy = &dev->phy; + u16 regstack[12] = { 0 }; + u16 mls; +- u16 fval; ++ s16 fval; + int i; + int j; + +diff --git a/drivers/net/wireless/intel/ipw2x00/libipw_tx.c b/drivers/net/wireless/intel/ipw2x00/libipw_tx.c +index d9baa2fa603b2..e4c60caa6543c 100644 +--- a/drivers/net/wireless/intel/ipw2x00/libipw_tx.c ++++ b/drivers/net/wireless/intel/ipw2x00/libipw_tx.c +@@ -383,7 +383,7 @@ netdev_tx_t libipw_xmit(struct sk_buff *skb, struct net_device *dev) + + /* Each fragment may need to have room for encryption + * pre/postfix */ +- if (host_encrypt) ++ if (host_encrypt && crypt && crypt->ops) + bytes_per_frag -= crypt->ops->extra_mpdu_prefix_len + + crypt->ops->extra_mpdu_postfix_len; + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/power.c b/drivers/net/wireless/intel/iwlwifi/mvm/power.c +index c146303ec73b1..66a968de3bc26 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/power.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/power.c +@@ -621,6 +621,9 @@ static void iwl_mvm_power_get_vifs_iterator(void *_data, u8 *mac, + struct iwl_power_vifs *power_iterator = _data; + bool active = mvmvif->phy_ctxt && mvmvif->phy_ctxt->id < NUM_PHY_CTX; + ++ if (!mvmvif->uploaded) ++ return; ++ + switch (ieee80211_vif_type_p2p(vif)) { + case NL80211_IFTYPE_P2P_DEVICE: + break; +diff --git a/drivers/net/wireless/marvell/mwifiex/11h.c b/drivers/net/wireless/marvell/mwifiex/11h.c +index d2ee6469e67bb..3fa25cd64cda0 100644 +--- a/drivers/net/wireless/marvell/mwifiex/11h.c ++++ b/drivers/net/wireless/marvell/mwifiex/11h.c +@@ -303,5 +303,7 @@ void mwifiex_dfs_chan_sw_work_queue(struct work_struct *work) + + mwifiex_dbg(priv->adapter, MSG, + "indicating channel switch completion to kernel\n"); ++ mutex_lock(&priv->wdev.mtx); + cfg80211_ch_switch_notify(priv->netdev, &priv->dfs_chandef); ++ mutex_unlock(&priv->wdev.mtx); + } +diff --git a/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c b/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c +index 2477e18c7caec..025619cd14e82 100644 +--- a/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c ++++ b/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c +@@ -460,8 +460,10 @@ static void rtl8180_tx(struct ieee80211_hw *dev, + struct rtl8180_priv *priv = dev->priv; + struct rtl8180_tx_ring *ring; + struct rtl8180_tx_desc *entry; ++ unsigned int prio = 0; + unsigned long flags; +- unsigned int idx, prio, hw_prio; ++ unsigned int idx, hw_prio; ++ + dma_addr_t mapping; + u32 tx_flags; + u8 rc_flags; +@@ -470,7 +472,9 @@ static void rtl8180_tx(struct ieee80211_hw *dev, + /* do arithmetic and then convert to le16 */ + u16 frame_duration = 0; + +- prio = skb_get_queue_mapping(skb); ++ /* rtl8180/rtl8185 only has one useable tx queue */ ++ if (dev->queues > IEEE80211_AC_BK) ++ prio = skb_get_queue_mapping(skb); + ring = &priv->tx_ring[prio]; + + mapping = dma_map_single(&priv->pdev->dev, skb->data, skb->len, +diff --git a/drivers/net/wireless/realtek/rtlwifi/usb.c b/drivers/net/wireless/realtek/rtlwifi/usb.c +index 06e073defad65..c6e4fda7e431f 100644 +--- a/drivers/net/wireless/realtek/rtlwifi/usb.c ++++ b/drivers/net/wireless/realtek/rtlwifi/usb.c +@@ -1015,7 +1015,7 @@ int rtl_usb_probe(struct usb_interface *intf, + hw = ieee80211_alloc_hw(sizeof(struct rtl_priv) + + sizeof(struct rtl_usb_priv), &rtl_ops); + if (!hw) { +- WARN_ONCE(true, "rtl_usb: ieee80211 alloc failed\n"); ++ pr_warn("rtl_usb: ieee80211 alloc failed\n"); + return -ENOMEM; + } + rtlpriv = hw->priv; +diff --git a/drivers/nfc/st21nfca/se.c b/drivers/nfc/st21nfca/se.c +index 0841e0e370a03..0194e80193d9c 100644 +--- a/drivers/nfc/st21nfca/se.c ++++ b/drivers/nfc/st21nfca/se.c +@@ -241,7 +241,7 @@ int st21nfca_hci_se_io(struct nfc_hci_dev *hdev, u32 se_idx, + } + EXPORT_SYMBOL(st21nfca_hci_se_io); + +-static void st21nfca_se_wt_timeout(struct timer_list *t) ++static void st21nfca_se_wt_work(struct work_struct *work) + { + /* + * No answer from the secure element +@@ -254,8 +254,9 @@ static void st21nfca_se_wt_timeout(struct timer_list *t) + */ + /* hardware reset managed through VCC_UICC_OUT power supply */ + u8 param = 0x01; +- struct st21nfca_hci_info *info = from_timer(info, t, +- se_info.bwi_timer); ++ struct st21nfca_hci_info *info = container_of(work, ++ struct st21nfca_hci_info, ++ se_info.timeout_work); + + pr_debug("\n"); + +@@ -273,6 +274,13 @@ static void st21nfca_se_wt_timeout(struct timer_list *t) + info->se_info.cb(info->se_info.cb_context, NULL, 0, -ETIME); + } + ++static void st21nfca_se_wt_timeout(struct timer_list *t) ++{ ++ struct st21nfca_hci_info *info = from_timer(info, t, se_info.bwi_timer); ++ ++ schedule_work(&info->se_info.timeout_work); ++} ++ + static void st21nfca_se_activation_timeout(struct timer_list *t) + { + struct st21nfca_hci_info *info = from_timer(info, t, +@@ -364,6 +372,7 @@ int st21nfca_apdu_reader_event_received(struct nfc_hci_dev *hdev, + switch (event) { + case ST21NFCA_EVT_TRANSMIT_DATA: + del_timer_sync(&info->se_info.bwi_timer); ++ cancel_work_sync(&info->se_info.timeout_work); + info->se_info.bwi_active = false; + r = nfc_hci_send_event(hdev, ST21NFCA_DEVICE_MGNT_GATE, + ST21NFCA_EVT_SE_END_OF_APDU_TRANSFER, NULL, 0); +@@ -393,6 +402,7 @@ void st21nfca_se_init(struct nfc_hci_dev *hdev) + struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev); + + init_completion(&info->se_info.req_completion); ++ INIT_WORK(&info->se_info.timeout_work, st21nfca_se_wt_work); + /* initialize timers */ + timer_setup(&info->se_info.bwi_timer, st21nfca_se_wt_timeout, 0); + info->se_info.bwi_active = false; +@@ -420,6 +430,7 @@ void st21nfca_se_deinit(struct nfc_hci_dev *hdev) + if (info->se_info.se_active) + del_timer_sync(&info->se_info.se_active_timer); + ++ cancel_work_sync(&info->se_info.timeout_work); + info->se_info.bwi_active = false; + info->se_info.se_active = false; + } +diff --git a/drivers/nfc/st21nfca/st21nfca.h b/drivers/nfc/st21nfca/st21nfca.h +index 5e0de0fef1d4e..0e4a93d11efb7 100644 +--- a/drivers/nfc/st21nfca/st21nfca.h ++++ b/drivers/nfc/st21nfca/st21nfca.h +@@ -141,6 +141,7 @@ struct st21nfca_se_info { + + se_io_cb_t cb; + void *cb_context; ++ struct work_struct timeout_work; + }; + + struct st21nfca_hci_info { +diff --git a/drivers/nvdimm/core.c b/drivers/nvdimm/core.c +index c21ba0602029c..1c92c883afdd8 100644 +--- a/drivers/nvdimm/core.c ++++ b/drivers/nvdimm/core.c +@@ -400,9 +400,7 @@ static ssize_t capability_show(struct device *dev, + if (!nd_desc->fw_ops) + return -EOPNOTSUPP; + +- nvdimm_bus_lock(dev); + cap = nd_desc->fw_ops->capability(nd_desc); +- nvdimm_bus_unlock(dev); + + switch (cap) { + case NVDIMM_FWA_CAP_QUIESCE: +@@ -427,10 +425,8 @@ static ssize_t activate_show(struct device *dev, + if (!nd_desc->fw_ops) + return -EOPNOTSUPP; + +- nvdimm_bus_lock(dev); + cap = nd_desc->fw_ops->capability(nd_desc); + state = nd_desc->fw_ops->activate_state(nd_desc); +- nvdimm_bus_unlock(dev); + + if (cap < NVDIMM_FWA_CAP_QUIESCE) + return -EOPNOTSUPP; +@@ -475,7 +471,6 @@ static ssize_t activate_store(struct device *dev, + else + return -EINVAL; + +- nvdimm_bus_lock(dev); + state = nd_desc->fw_ops->activate_state(nd_desc); + + switch (state) { +@@ -493,7 +488,6 @@ static ssize_t activate_store(struct device *dev, + default: + rc = -ENXIO; + } +- nvdimm_bus_unlock(dev); + + if (rc == 0) + rc = len; +@@ -516,10 +510,7 @@ static umode_t nvdimm_bus_firmware_visible(struct kobject *kobj, struct attribut + if (!nd_desc->fw_ops) + return 0; + +- nvdimm_bus_lock(dev); + cap = nd_desc->fw_ops->capability(nd_desc); +- nvdimm_bus_unlock(dev); +- + if (cap < NVDIMM_FWA_CAP_QUIESCE) + return 0; + +diff --git a/drivers/nvdimm/security.c b/drivers/nvdimm/security.c +index 4b80150e4afa7..b5aa55c614616 100644 +--- a/drivers/nvdimm/security.c ++++ b/drivers/nvdimm/security.c +@@ -379,11 +379,6 @@ static int security_overwrite(struct nvdimm *nvdimm, unsigned int keyid) + || !nvdimm->sec.flags) + return -EOPNOTSUPP; + +- if (dev->driver == NULL) { +- dev_dbg(dev, "Unable to overwrite while DIMM active.\n"); +- return -EINVAL; +- } +- + rc = check_security_state(nvdimm); + if (rc) + return rc; +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c +index e73a5c62a858d..d301f0280ff6a 100644 +--- a/drivers/nvme/host/core.c ++++ b/drivers/nvme/host/core.c +@@ -2024,7 +2024,7 @@ static void nvme_set_queue_limits(struct nvme_ctrl *ctrl, + blk_queue_max_segments(q, min_t(u32, max_segments, USHRT_MAX)); + } + blk_queue_virt_boundary(q, NVME_CTRL_PAGE_SIZE - 1); +- blk_queue_dma_alignment(q, 7); ++ blk_queue_dma_alignment(q, 3); + blk_queue_write_cache(q, vwc, vwc); + } + +diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c +index a36db0701d178..7de24a10dd921 100644 +--- a/drivers/nvme/host/pci.c ++++ b/drivers/nvme/host/pci.c +@@ -1666,6 +1666,7 @@ static int nvme_alloc_admin_tags(struct nvme_dev *dev) + dev->ctrl.admin_q = blk_mq_init_queue(&dev->admin_tagset); + if (IS_ERR(dev->ctrl.admin_q)) { + blk_mq_free_tag_set(&dev->admin_tagset); ++ dev->ctrl.admin_q = NULL; + return -ENOMEM; + } + if (!blk_get_queue(dev->ctrl.admin_q)) { +diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c +index 43a77d7200087..c8a0c0e9dec1c 100644 +--- a/drivers/of/overlay.c ++++ b/drivers/of/overlay.c +@@ -170,9 +170,7 @@ static int overlay_notify(struct overlay_changeset *ovcs, + + ret = blocking_notifier_call_chain(&overlay_notify_chain, + action, &nd); +- if (ret == NOTIFY_OK || ret == NOTIFY_STOP) +- return 0; +- if (ret) { ++ if (notifier_to_errno(ret)) { + ret = notifier_to_errno(ret); + pr_err("overlay changeset %s notifier error %d, target: %pOF\n", + of_overlay_action_name[action], ret, nd.target); +diff --git a/drivers/opp/of.c b/drivers/opp/of.c +index 5de46aa99d243..3d7adc0de1288 100644 +--- a/drivers/opp/of.c ++++ b/drivers/opp/of.c +@@ -346,11 +346,11 @@ static int _bandwidth_supported(struct device *dev, struct opp_table *opp_table) + + /* Checking only first OPP is sufficient */ + np = of_get_next_available_child(opp_np, NULL); ++ of_node_put(opp_np); + if (!np) { + dev_err(dev, "OPP table empty\n"); + return -EINVAL; + } +- of_node_put(opp_np); + + prop = of_find_property(np, "opp-peak-kBps", NULL); + of_node_put(np); +diff --git a/drivers/pci/controller/cadence/pcie-cadence-ep.c b/drivers/pci/controller/cadence/pcie-cadence-ep.c +index 1af14474abcf1..4c5e6349d78ce 100644 +--- a/drivers/pci/controller/cadence/pcie-cadence-ep.c ++++ b/drivers/pci/controller/cadence/pcie-cadence-ep.c +@@ -154,8 +154,7 @@ static int cdns_pcie_ep_map_addr(struct pci_epc *epc, u8 fn, phys_addr_t addr, + struct cdns_pcie *pcie = &ep->pcie; + u32 r; + +- r = find_first_zero_bit(&ep->ob_region_map, +- sizeof(ep->ob_region_map) * BITS_PER_LONG); ++ r = find_first_zero_bit(&ep->ob_region_map, BITS_PER_LONG); + if (r >= ep->max_regions - 1) { + dev_err(&epc->dev, "no free outbound region\n"); + return -EINVAL; +diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c +index 5cf1ef12fb9b0..ceb4815379cd4 100644 +--- a/drivers/pci/controller/dwc/pci-imx6.c ++++ b/drivers/pci/controller/dwc/pci-imx6.c +@@ -401,6 +401,11 @@ static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie) + dev_err(dev, "failed to disable vpcie regulator: %d\n", + ret); + } ++ ++ /* Some boards don't have PCIe reset GPIO. */ ++ if (gpio_is_valid(imx6_pcie->reset_gpio)) ++ gpio_set_value_cansleep(imx6_pcie->reset_gpio, ++ imx6_pcie->gpio_active_high); + } + + static unsigned int imx6_pcie_grp_offset(const struct imx6_pcie *imx6_pcie) +@@ -523,15 +528,6 @@ static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie) + /* allow the clocks to stabilize */ + usleep_range(200, 500); + +- /* Some boards don't have PCIe reset GPIO. */ +- if (gpio_is_valid(imx6_pcie->reset_gpio)) { +- gpio_set_value_cansleep(imx6_pcie->reset_gpio, +- imx6_pcie->gpio_active_high); +- msleep(100); +- gpio_set_value_cansleep(imx6_pcie->reset_gpio, +- !imx6_pcie->gpio_active_high); +- } +- + switch (imx6_pcie->drvdata->variant) { + case IMX8MQ: + reset_control_deassert(imx6_pcie->pciephy_reset); +@@ -574,6 +570,15 @@ static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie) + break; + } + ++ /* Some boards don't have PCIe reset GPIO. */ ++ if (gpio_is_valid(imx6_pcie->reset_gpio)) { ++ msleep(100); ++ gpio_set_value_cansleep(imx6_pcie->reset_gpio, ++ !imx6_pcie->gpio_active_high); ++ /* Wait for 100ms after PERST# deassertion (PCIe r5.0, 6.6.1) */ ++ msleep(100); ++ } ++ + return; + + err_ref_clk: +diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c +index 44c2a6572199c..42d8116a4a002 100644 +--- a/drivers/pci/controller/dwc/pcie-designware-host.c ++++ b/drivers/pci/controller/dwc/pcie-designware-host.c +@@ -392,7 +392,8 @@ int dw_pcie_host_init(struct pcie_port *pp) + sizeof(pp->msi_msg), + DMA_FROM_DEVICE, + DMA_ATTR_SKIP_CPU_SYNC); +- if (dma_mapping_error(pci->dev, pp->msi_data)) { ++ ret = dma_mapping_error(pci->dev, pp->msi_data); ++ if (ret) { + dev_err(pci->dev, "Failed to map MSI data\n"); + pp->msi_data = 0; + goto err_free_msi; +diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c +index 557554f53ce9c..9c7cdc4e12f21 100644 +--- a/drivers/pci/controller/dwc/pcie-qcom.c ++++ b/drivers/pci/controller/dwc/pcie-qcom.c +@@ -1443,22 +1443,21 @@ static int qcom_pcie_probe(struct platform_device *pdev) + } + + ret = phy_init(pcie->phy); +- if (ret) { +- pm_runtime_disable(&pdev->dev); ++ if (ret) + goto err_pm_runtime_put; +- } + + platform_set_drvdata(pdev, pcie); + + ret = dw_pcie_host_init(pp); + if (ret) { + dev_err(dev, "cannot initialize host\n"); +- pm_runtime_disable(&pdev->dev); +- goto err_pm_runtime_put; ++ goto err_phy_exit; + } + + return 0; + ++err_phy_exit: ++ phy_exit(pcie->phy); + err_pm_runtime_put: + pm_runtime_put(dev); + pm_runtime_disable(dev); +diff --git a/drivers/pci/controller/pcie-rockchip-ep.c b/drivers/pci/controller/pcie-rockchip-ep.c +index 7631dc3961c12..379cde59988cf 100644 +--- a/drivers/pci/controller/pcie-rockchip-ep.c ++++ b/drivers/pci/controller/pcie-rockchip-ep.c +@@ -264,8 +264,7 @@ static int rockchip_pcie_ep_map_addr(struct pci_epc *epc, u8 fn, + struct rockchip_pcie *pcie = &ep->rockchip; + u32 r; + +- r = find_first_zero_bit(&ep->ob_region_map, +- sizeof(ep->ob_region_map) * BITS_PER_LONG); ++ r = find_first_zero_bit(&ep->ob_region_map, BITS_PER_LONG); + /* + * Region 0 is reserved for configuration space and shouldn't + * be used elsewhere per TRM, so leave it out. +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index cda17c6151480..1162734546481 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -2829,6 +2829,8 @@ static const struct dmi_system_id bridge_d3_blacklist[] = { + DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."), + DMI_MATCH(DMI_BOARD_NAME, "X299 DESIGNARE EX-CF"), + }, ++ }, ++ { + /* + * Downstream device is not accessible after putting a root port + * into D3cold and back into D0 on Elo i2. +@@ -4975,18 +4977,18 @@ static int pci_dev_reset_slot_function(struct pci_dev *dev, int probe) + + static void pci_dev_lock(struct pci_dev *dev) + { +- pci_cfg_access_lock(dev); + /* block PM suspend, driver probe, etc. */ + device_lock(&dev->dev); ++ pci_cfg_access_lock(dev); + } + + /* Return 1 on successful lock, 0 on contention */ + static int pci_dev_trylock(struct pci_dev *dev) + { +- if (pci_cfg_access_trylock(dev)) { +- if (device_trylock(&dev->dev)) ++ if (device_trylock(&dev->dev)) { ++ if (pci_cfg_access_trylock(dev)) + return 1; +- pci_cfg_access_unlock(dev); ++ device_unlock(&dev->dev); + } + + return 0; +@@ -4994,8 +4996,8 @@ static int pci_dev_trylock(struct pci_dev *dev) + + static void pci_dev_unlock(struct pci_dev *dev) + { +- device_unlock(&dev->dev); + pci_cfg_access_unlock(dev); ++ device_unlock(&dev->dev); + } + + static void pci_dev_save_and_disable(struct pci_dev *dev) +diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c +index 65dff5f3457ac..c40546eeecb39 100644 +--- a/drivers/pci/pcie/aer.c ++++ b/drivers/pci/pcie/aer.c +@@ -101,6 +101,11 @@ struct aer_stats { + #define ERR_COR_ID(d) (d & 0xffff) + #define ERR_UNCOR_ID(d) (d >> 16) + ++#define AER_ERR_STATUS_MASK (PCI_ERR_ROOT_UNCOR_RCV | \ ++ PCI_ERR_ROOT_COR_RCV | \ ++ PCI_ERR_ROOT_MULTI_COR_RCV | \ ++ PCI_ERR_ROOT_MULTI_UNCOR_RCV) ++ + static int pcie_aer_disable; + static pci_ers_result_t aer_root_reset(struct pci_dev *dev); + +@@ -1187,7 +1192,7 @@ static irqreturn_t aer_irq(int irq, void *context) + struct aer_err_source e_src = {}; + + pci_read_config_dword(rp, aer + PCI_ERR_ROOT_STATUS, &e_src.status); +- if (!(e_src.status & (PCI_ERR_ROOT_UNCOR_RCV|PCI_ERR_ROOT_COR_RCV))) ++ if (!(e_src.status & AER_ERR_STATUS_MASK)) + return IRQ_NONE; + + pci_read_config_dword(rp, aer + PCI_ERR_ROOT_ERR_SRC, &e_src.id); +diff --git a/drivers/phy/qualcomm/phy-qcom-qmp.c b/drivers/phy/qualcomm/phy-qcom-qmp.c +index 0cda168469625..ea46950c5d2a9 100644 +--- a/drivers/phy/qualcomm/phy-qcom-qmp.c ++++ b/drivers/phy/qualcomm/phy-qcom-qmp.c +@@ -3717,6 +3717,11 @@ static const struct phy_ops qcom_qmp_pcie_ufs_ops = { + .owner = THIS_MODULE, + }; + ++static void qcom_qmp_reset_control_put(void *data) ++{ ++ reset_control_put(data); ++} ++ + static + int qcom_qmp_phy_create(struct device *dev, struct device_node *np, int id, + void __iomem *serdes, const struct qmp_phy_cfg *cfg) +@@ -3789,7 +3794,7 @@ int qcom_qmp_phy_create(struct device *dev, struct device_node *np, int id, + * all phys that don't need this. + */ + snprintf(prop_name, sizeof(prop_name), "pipe%d", id); +- qphy->pipe_clk = of_clk_get_by_name(np, prop_name); ++ qphy->pipe_clk = devm_get_clk_from_child(dev, np, prop_name); + if (IS_ERR(qphy->pipe_clk)) { + if (cfg->type == PHY_TYPE_PCIE || + cfg->type == PHY_TYPE_USB3) { +@@ -3811,6 +3816,10 @@ int qcom_qmp_phy_create(struct device *dev, struct device_node *np, int id, + dev_err(dev, "failed to get lane%d reset\n", id); + return PTR_ERR(qphy->lane_rst); + } ++ ret = devm_add_action_or_reset(dev, qcom_qmp_reset_control_put, ++ qphy->lane_rst); ++ if (ret) ++ return ret; + } + + if (cfg->type == PHY_TYPE_UFS || cfg->type == PHY_TYPE_PCIE) +diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c +index 6768b2f03d685..39d2024dc2ee5 100644 +--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c ++++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c +@@ -351,6 +351,22 @@ static int bcm2835_gpio_direction_output(struct gpio_chip *chip, + return pinctrl_gpio_direction_output(chip->base + offset); + } + ++static int bcm2835_of_gpio_ranges_fallback(struct gpio_chip *gc, ++ struct device_node *np) ++{ ++ struct pinctrl_dev *pctldev = of_pinctrl_get(np); ++ ++ of_node_put(np); ++ ++ if (!pctldev) ++ return 0; ++ ++ gpiochip_add_pin_range(gc, pinctrl_dev_get_devname(pctldev), 0, 0, ++ gc->ngpio); ++ ++ return 0; ++} ++ + static const struct gpio_chip bcm2835_gpio_chip = { + .label = MODULE_NAME, + .owner = THIS_MODULE, +@@ -365,6 +381,7 @@ static const struct gpio_chip bcm2835_gpio_chip = { + .base = -1, + .ngpio = BCM2835_NUM_GPIOS, + .can_sleep = false, ++ .of_gpio_ranges_fallback = bcm2835_of_gpio_ranges_fallback, + }; + + static const struct gpio_chip bcm2711_gpio_chip = { +@@ -381,6 +398,7 @@ static const struct gpio_chip bcm2711_gpio_chip = { + .base = -1, + .ngpio = BCM2711_NUM_GPIOS, + .can_sleep = false, ++ .of_gpio_ranges_fallback = bcm2835_of_gpio_ranges_fallback, + }; + + static void bcm2835_gpio_irq_handle_bank(struct bcm2835_pinctrl *pc, +diff --git a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +index 5cb018f988003..85a0052bb0e62 100644 +--- a/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c ++++ b/drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +@@ -781,7 +781,7 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev, + for (i = 0; i < nr_irq_parent; i++) { + int irq = irq_of_parse_and_map(np, i); + +- if (irq < 0) ++ if (!irq) + continue; + girq->parents[i] = irq; + } +diff --git a/drivers/pinctrl/renesas/core.c b/drivers/pinctrl/renesas/core.c +index 258972672eda1..54f1a7334027a 100644 +--- a/drivers/pinctrl/renesas/core.c ++++ b/drivers/pinctrl/renesas/core.c +@@ -71,12 +71,11 @@ static int sh_pfc_map_resources(struct sh_pfc *pfc, + + /* Fill them. */ + for (i = 0; i < num_windows; i++) { +- res = platform_get_resource(pdev, IORESOURCE_MEM, i); +- windows->phys = res->start; +- windows->size = resource_size(res); +- windows->virt = devm_ioremap_resource(pfc->dev, res); ++ windows->virt = devm_platform_get_and_ioremap_resource(pdev, i, &res); + if (IS_ERR(windows->virt)) + return -ENOMEM; ++ windows->phys = res->start; ++ windows->size = resource_size(res); + windows++; + } + for (i = 0; i < num_irqs; i++) +diff --git a/drivers/pinctrl/renesas/pinctrl-rzn1.c b/drivers/pinctrl/renesas/pinctrl-rzn1.c +index ef5fb25b6016d..849d091205d4d 100644 +--- a/drivers/pinctrl/renesas/pinctrl-rzn1.c ++++ b/drivers/pinctrl/renesas/pinctrl-rzn1.c +@@ -865,17 +865,15 @@ static int rzn1_pinctrl_probe(struct platform_device *pdev) + ipctl->mdio_func[0] = -1; + ipctl->mdio_func[1] = -1; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- ipctl->lev1_protect_phys = (u32)res->start + 0x400; +- ipctl->lev1 = devm_ioremap_resource(&pdev->dev, res); ++ ipctl->lev1 = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(ipctl->lev1)) + return PTR_ERR(ipctl->lev1); ++ ipctl->lev1_protect_phys = (u32)res->start + 0x400; + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 1); +- ipctl->lev2_protect_phys = (u32)res->start + 0x400; +- ipctl->lev2 = devm_ioremap_resource(&pdev->dev, res); ++ ipctl->lev2 = devm_platform_get_and_ioremap_resource(pdev, 1, &res); + if (IS_ERR(ipctl->lev2)) + return PTR_ERR(ipctl->lev2); ++ ipctl->lev2_protect_phys = (u32)res->start + 0x400; + + ipctl->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(ipctl->clk)) +diff --git a/drivers/platform/chrome/cros_ec.c b/drivers/platform/chrome/cros_ec.c +index 3104680b74855..979f92194e81a 100644 +--- a/drivers/platform/chrome/cros_ec.c ++++ b/drivers/platform/chrome/cros_ec.c +@@ -175,6 +175,8 @@ int cros_ec_register(struct cros_ec_device *ec_dev) + ec_dev->max_request = sizeof(struct ec_params_hello); + ec_dev->max_response = sizeof(struct ec_response_get_protocol_info); + ec_dev->max_passthru = 0; ++ ec_dev->ec = NULL; ++ ec_dev->pd = NULL; + + ec_dev->din = devm_kzalloc(dev, ec_dev->din_size, GFP_KERNEL); + if (!ec_dev->din) +@@ -231,18 +233,16 @@ int cros_ec_register(struct cros_ec_device *ec_dev) + if (IS_ERR(ec_dev->pd)) { + dev_err(ec_dev->dev, + "Failed to create CrOS PD platform device\n"); +- platform_device_unregister(ec_dev->ec); +- return PTR_ERR(ec_dev->pd); ++ err = PTR_ERR(ec_dev->pd); ++ goto exit; + } + } + + if (IS_ENABLED(CONFIG_OF) && dev->of_node) { + err = devm_of_platform_populate(dev); + if (err) { +- platform_device_unregister(ec_dev->pd); +- platform_device_unregister(ec_dev->ec); + dev_err(dev, "Failed to register sub-devices\n"); +- return err; ++ goto exit; + } + } + +@@ -264,12 +264,16 @@ int cros_ec_register(struct cros_ec_device *ec_dev) + err = blocking_notifier_chain_register(&ec_dev->event_notifier, + &ec_dev->notifier_ready); + if (err) +- return err; ++ goto exit; + } + + dev_info(dev, "Chrome EC device registered\n"); + + return 0; ++exit: ++ platform_device_unregister(ec_dev->ec); ++ platform_device_unregister(ec_dev->pd); ++ return err; + } + EXPORT_SYMBOL(cros_ec_register); + +diff --git a/drivers/platform/chrome/cros_ec_chardev.c b/drivers/platform/chrome/cros_ec_chardev.c +index e0bce869c49a9..fd33de546aee0 100644 +--- a/drivers/platform/chrome/cros_ec_chardev.c ++++ b/drivers/platform/chrome/cros_ec_chardev.c +@@ -301,7 +301,7 @@ static long cros_ec_chardev_ioctl_xcmd(struct cros_ec_dev *ec, void __user *arg) + } + + s_cmd->command += ec->cmd_offset; +- ret = cros_ec_cmd_xfer_status(ec->ec_dev, s_cmd); ++ ret = cros_ec_cmd_xfer(ec->ec_dev, s_cmd); + /* Only copy data to userland if data was received. */ + if (ret < 0) + goto exit; +diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c +index 9f698a7aad129..e1fadf059e05e 100644 +--- a/drivers/platform/chrome/cros_ec_proto.c ++++ b/drivers/platform/chrome/cros_ec_proto.c +@@ -560,22 +560,28 @@ exit: + EXPORT_SYMBOL(cros_ec_query_all); + + /** +- * cros_ec_cmd_xfer_status() - Send a command to the ChromeOS EC. ++ * cros_ec_cmd_xfer() - Send a command to the ChromeOS EC. + * @ec_dev: EC device. + * @msg: Message to write. + * +- * Call this to send a command to the ChromeOS EC. This should be used instead of calling the EC's +- * cmd_xfer() callback directly. It returns success status only if both the command was transmitted +- * successfully and the EC replied with success status. ++ * Call this to send a command to the ChromeOS EC. This should be used instead ++ * of calling the EC's cmd_xfer() callback directly. This function does not ++ * convert EC command execution error codes to Linux error codes. Most ++ * in-kernel users will want to use cros_ec_cmd_xfer_status() instead since ++ * that function implements the conversion. + * + * Return: +- * >=0 - The number of bytes transferred +- * <0 - Linux error code ++ * >0 - EC command was executed successfully. The return value is the number ++ * of bytes returned by the EC (excluding the header). ++ * =0 - EC communication was successful. EC command execution results are ++ * reported in msg->result. The result will be EC_RES_SUCCESS if the ++ * command was executed successfully or report an EC command execution ++ * error. ++ * <0 - EC communication error. Return value is the Linux error code. + */ +-int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev, +- struct cros_ec_command *msg) ++int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) + { +- int ret, mapped; ++ int ret; + + mutex_lock(&ec_dev->lock); + if (ec_dev->proto_version == EC_PROTO_VERSION_UNKNOWN) { +@@ -616,6 +622,32 @@ int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev, + ret = send_command(ec_dev, msg); + mutex_unlock(&ec_dev->lock); + ++ return ret; ++} ++EXPORT_SYMBOL(cros_ec_cmd_xfer); ++ ++/** ++ * cros_ec_cmd_xfer_status() - Send a command to the ChromeOS EC. ++ * @ec_dev: EC device. ++ * @msg: Message to write. ++ * ++ * Call this to send a command to the ChromeOS EC. This should be used instead of calling the EC's ++ * cmd_xfer() callback directly. It returns success status only if both the command was transmitted ++ * successfully and the EC replied with success status. ++ * ++ * Return: ++ * >=0 - The number of bytes transferred. ++ * <0 - Linux error code ++ */ ++int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev, ++ struct cros_ec_command *msg) ++{ ++ int ret, mapped; ++ ++ ret = cros_ec_cmd_xfer(ec_dev, msg); ++ if (ret < 0) ++ return ret; ++ + mapped = cros_ec_map_error(msg->result); + if (mapped) { + dev_dbg(ec_dev->dev, "Command result (err: %d [%d])\n", +diff --git a/drivers/platform/mips/cpu_hwmon.c b/drivers/platform/mips/cpu_hwmon.c +index 386389ffec419..d8c5f9195f85f 100644 +--- a/drivers/platform/mips/cpu_hwmon.c ++++ b/drivers/platform/mips/cpu_hwmon.c +@@ -55,55 +55,6 @@ out: + static int nr_packages; + static struct device *cpu_hwmon_dev; + +-static SENSOR_DEVICE_ATTR(name, 0444, NULL, NULL, 0); +- +-static struct attribute *cpu_hwmon_attributes[] = { +- &sensor_dev_attr_name.dev_attr.attr, +- NULL +-}; +- +-/* Hwmon device attribute group */ +-static struct attribute_group cpu_hwmon_attribute_group = { +- .attrs = cpu_hwmon_attributes, +-}; +- +-static ssize_t get_cpu_temp(struct device *dev, +- struct device_attribute *attr, char *buf); +-static ssize_t cpu_temp_label(struct device *dev, +- struct device_attribute *attr, char *buf); +- +-static SENSOR_DEVICE_ATTR(temp1_input, 0444, get_cpu_temp, NULL, 1); +-static SENSOR_DEVICE_ATTR(temp1_label, 0444, cpu_temp_label, NULL, 1); +-static SENSOR_DEVICE_ATTR(temp2_input, 0444, get_cpu_temp, NULL, 2); +-static SENSOR_DEVICE_ATTR(temp2_label, 0444, cpu_temp_label, NULL, 2); +-static SENSOR_DEVICE_ATTR(temp3_input, 0444, get_cpu_temp, NULL, 3); +-static SENSOR_DEVICE_ATTR(temp3_label, 0444, cpu_temp_label, NULL, 3); +-static SENSOR_DEVICE_ATTR(temp4_input, 0444, get_cpu_temp, NULL, 4); +-static SENSOR_DEVICE_ATTR(temp4_label, 0444, cpu_temp_label, NULL, 4); +- +-static const struct attribute *hwmon_cputemp[4][3] = { +- { +- &sensor_dev_attr_temp1_input.dev_attr.attr, +- &sensor_dev_attr_temp1_label.dev_attr.attr, +- NULL +- }, +- { +- &sensor_dev_attr_temp2_input.dev_attr.attr, +- &sensor_dev_attr_temp2_label.dev_attr.attr, +- NULL +- }, +- { +- &sensor_dev_attr_temp3_input.dev_attr.attr, +- &sensor_dev_attr_temp3_label.dev_attr.attr, +- NULL +- }, +- { +- &sensor_dev_attr_temp4_input.dev_attr.attr, +- &sensor_dev_attr_temp4_label.dev_attr.attr, +- NULL +- } +-}; +- + static ssize_t cpu_temp_label(struct device *dev, + struct device_attribute *attr, char *buf) + { +@@ -121,24 +72,47 @@ static ssize_t get_cpu_temp(struct device *dev, + return sprintf(buf, "%d\n", value); + } + +-static int create_sysfs_cputemp_files(struct kobject *kobj) +-{ +- int i, ret = 0; +- +- for (i = 0; i < nr_packages; i++) +- ret = sysfs_create_files(kobj, hwmon_cputemp[i]); ++static SENSOR_DEVICE_ATTR(temp1_input, 0444, get_cpu_temp, NULL, 1); ++static SENSOR_DEVICE_ATTR(temp1_label, 0444, cpu_temp_label, NULL, 1); ++static SENSOR_DEVICE_ATTR(temp2_input, 0444, get_cpu_temp, NULL, 2); ++static SENSOR_DEVICE_ATTR(temp2_label, 0444, cpu_temp_label, NULL, 2); ++static SENSOR_DEVICE_ATTR(temp3_input, 0444, get_cpu_temp, NULL, 3); ++static SENSOR_DEVICE_ATTR(temp3_label, 0444, cpu_temp_label, NULL, 3); ++static SENSOR_DEVICE_ATTR(temp4_input, 0444, get_cpu_temp, NULL, 4); ++static SENSOR_DEVICE_ATTR(temp4_label, 0444, cpu_temp_label, NULL, 4); + +- return ret; +-} ++static struct attribute *cpu_hwmon_attributes[] = { ++ &sensor_dev_attr_temp1_input.dev_attr.attr, ++ &sensor_dev_attr_temp1_label.dev_attr.attr, ++ &sensor_dev_attr_temp2_input.dev_attr.attr, ++ &sensor_dev_attr_temp2_label.dev_attr.attr, ++ &sensor_dev_attr_temp3_input.dev_attr.attr, ++ &sensor_dev_attr_temp3_label.dev_attr.attr, ++ &sensor_dev_attr_temp4_input.dev_attr.attr, ++ &sensor_dev_attr_temp4_label.dev_attr.attr, ++ NULL ++}; + +-static void remove_sysfs_cputemp_files(struct kobject *kobj) ++static umode_t cpu_hwmon_is_visible(struct kobject *kobj, ++ struct attribute *attr, int i) + { +- int i; ++ int id = i / 2; + +- for (i = 0; i < nr_packages; i++) +- sysfs_remove_files(kobj, hwmon_cputemp[i]); ++ if (id < nr_packages) ++ return attr->mode; ++ return 0; + } + ++static struct attribute_group cpu_hwmon_group = { ++ .attrs = cpu_hwmon_attributes, ++ .is_visible = cpu_hwmon_is_visible, ++}; ++ ++static const struct attribute_group *cpu_hwmon_groups[] = { ++ &cpu_hwmon_group, ++ NULL ++}; ++ + #define CPU_THERMAL_THRESHOLD 90000 + static struct delayed_work thermal_work; + +@@ -159,50 +133,31 @@ static void do_thermal_timer(struct work_struct *work) + + static int __init loongson_hwmon_init(void) + { +- int ret; +- + pr_info("Loongson Hwmon Enter...\n"); + + if (cpu_has_csr()) + csr_temp_enable = csr_readl(LOONGSON_CSR_FEATURES) & + LOONGSON_CSRF_TEMP; + +- cpu_hwmon_dev = hwmon_device_register_with_info(NULL, "cpu_hwmon", NULL, NULL, NULL); +- if (IS_ERR(cpu_hwmon_dev)) { +- ret = PTR_ERR(cpu_hwmon_dev); +- pr_err("hwmon_device_register fail!\n"); +- goto fail_hwmon_device_register; +- } +- + nr_packages = loongson_sysconf.nr_cpus / + loongson_sysconf.cores_per_package; + +- ret = create_sysfs_cputemp_files(&cpu_hwmon_dev->kobj); +- if (ret) { +- pr_err("fail to create cpu temperature interface!\n"); +- goto fail_create_sysfs_cputemp_files; ++ cpu_hwmon_dev = hwmon_device_register_with_groups(NULL, "cpu_hwmon", ++ NULL, cpu_hwmon_groups); ++ if (IS_ERR(cpu_hwmon_dev)) { ++ pr_err("hwmon_device_register fail!\n"); ++ return PTR_ERR(cpu_hwmon_dev); + } + + INIT_DEFERRABLE_WORK(&thermal_work, do_thermal_timer); + schedule_delayed_work(&thermal_work, msecs_to_jiffies(20000)); + +- return ret; +- +-fail_create_sysfs_cputemp_files: +- sysfs_remove_group(&cpu_hwmon_dev->kobj, +- &cpu_hwmon_attribute_group); +- hwmon_device_unregister(cpu_hwmon_dev); +- +-fail_hwmon_device_register: +- return ret; ++ return 0; + } + + static void __exit loongson_hwmon_exit(void) + { + cancel_delayed_work_sync(&thermal_work); +- remove_sysfs_cputemp_files(&cpu_hwmon_dev->kobj); +- sysfs_remove_group(&cpu_hwmon_dev->kobj, +- &cpu_hwmon_attribute_group); + hwmon_device_unregister(cpu_hwmon_dev); + } + +diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c +index 2c48e55c4104e..6e3f3511e7ddd 100644 +--- a/drivers/regulator/core.c ++++ b/drivers/regulator/core.c +@@ -2027,10 +2027,13 @@ struct regulator *_regulator_get(struct device *dev, const char *id, + rdev->exclusive = 1; + + ret = _regulator_is_enabled(rdev); +- if (ret > 0) ++ if (ret > 0) { + rdev->use_count = 1; +- else ++ regulator->enable_count = 1; ++ } else { + rdev->use_count = 0; ++ regulator->enable_count = 0; ++ } + } + + link = device_link_add(dev, &rdev->dev, DL_FLAG_STATELESS); +diff --git a/drivers/regulator/pfuze100-regulator.c b/drivers/regulator/pfuze100-regulator.c +index 01a12cfcea7c6..0a19500d3725e 100644 +--- a/drivers/regulator/pfuze100-regulator.c ++++ b/drivers/regulator/pfuze100-regulator.c +@@ -531,6 +531,7 @@ static int pfuze_parse_regulators_dt(struct pfuze_chip *chip) + parent = of_get_child_by_name(np, "regulators"); + if (!parent) { + dev_err(dev, "regulators node not found\n"); ++ of_node_put(np); + return -EINVAL; + } + +@@ -560,6 +561,7 @@ static int pfuze_parse_regulators_dt(struct pfuze_chip *chip) + } + + of_node_put(parent); ++ of_node_put(np); + if (ret < 0) { + dev_err(dev, "Error parsing regulator init data: %d\n", + ret); +diff --git a/drivers/regulator/qcom_smd-regulator.c b/drivers/regulator/qcom_smd-regulator.c +index 8d784a2a09d86..05d227f9d2f28 100644 +--- a/drivers/regulator/qcom_smd-regulator.c ++++ b/drivers/regulator/qcom_smd-regulator.c +@@ -844,32 +844,31 @@ static const struct rpm_regulator_data rpm_pm8950_regulators[] = { + { "s2", QCOM_SMD_RPM_SMPA, 2, &pm8950_hfsmps, "vdd_s2" }, + { "s3", QCOM_SMD_RPM_SMPA, 3, &pm8950_hfsmps, "vdd_s3" }, + { "s4", QCOM_SMD_RPM_SMPA, 4, &pm8950_hfsmps, "vdd_s4" }, +- { "s5", QCOM_SMD_RPM_SMPA, 5, &pm8950_ftsmps2p5, "vdd_s5" }, ++ /* S5 is managed via SPMI. */ + { "s6", QCOM_SMD_RPM_SMPA, 6, &pm8950_hfsmps, "vdd_s6" }, + + { "l1", QCOM_SMD_RPM_LDOA, 1, &pm8950_ult_nldo, "vdd_l1_l19" }, + { "l2", QCOM_SMD_RPM_LDOA, 2, &pm8950_ult_nldo, "vdd_l2_l23" }, + { "l3", QCOM_SMD_RPM_LDOA, 3, &pm8950_ult_nldo, "vdd_l3" }, +- { "l4", QCOM_SMD_RPM_LDOA, 4, &pm8950_ult_pldo, "vdd_l4_l5_l6_l7_l16" }, +- { "l5", QCOM_SMD_RPM_LDOA, 5, &pm8950_pldo_lv, "vdd_l4_l5_l6_l7_l16" }, +- { "l6", QCOM_SMD_RPM_LDOA, 6, &pm8950_pldo_lv, "vdd_l4_l5_l6_l7_l16" }, +- { "l7", QCOM_SMD_RPM_LDOA, 7, &pm8950_pldo_lv, "vdd_l4_l5_l6_l7_l16" }, ++ /* L4 seems not to exist. */ ++ { "l5", QCOM_SMD_RPM_LDOA, 5, &pm8950_pldo_lv, "vdd_l5_l6_l7_l16" }, ++ { "l6", QCOM_SMD_RPM_LDOA, 6, &pm8950_pldo_lv, "vdd_l5_l6_l7_l16" }, ++ { "l7", QCOM_SMD_RPM_LDOA, 7, &pm8950_pldo_lv, "vdd_l5_l6_l7_l16" }, + { "l8", QCOM_SMD_RPM_LDOA, 8, &pm8950_ult_pldo, "vdd_l8_l11_l12_l17_l22" }, + { "l9", QCOM_SMD_RPM_LDOA, 9, &pm8950_ult_pldo, "vdd_l9_l10_l13_l14_l15_l18" }, + { "l10", QCOM_SMD_RPM_LDOA, 10, &pm8950_ult_nldo, "vdd_l9_l10_l13_l14_l15_l18"}, +- { "l11", QCOM_SMD_RPM_LDOA, 11, &pm8950_ult_pldo, "vdd_l8_l11_l12_l17_l22"}, +- { "l12", QCOM_SMD_RPM_LDOA, 12, &pm8950_ult_pldo, "vdd_l8_l11_l12_l17_l22"}, +- { "l13", QCOM_SMD_RPM_LDOA, 13, &pm8950_ult_pldo, "vdd_l9_l10_l13_l14_l15_l18"}, +- { "l14", QCOM_SMD_RPM_LDOA, 14, &pm8950_ult_pldo, "vdd_l9_l10_l13_l14_l15_l18"}, +- { "l15", QCOM_SMD_RPM_LDOA, 15, &pm8950_ult_pldo, "vdd_l9_l10_l13_l14_l15_l18"}, +- { "l16", QCOM_SMD_RPM_LDOA, 16, &pm8950_ult_pldo, "vdd_l4_l5_l6_l7_l16"}, +- { "l17", QCOM_SMD_RPM_LDOA, 17, &pm8950_ult_pldo, "vdd_l8_l11_l12_l17_l22"}, +- { "l18", QCOM_SMD_RPM_LDOA, 18, &pm8950_ult_pldo, "vdd_l9_l10_l13_l14_l15_l18"}, +- { "l19", QCOM_SMD_RPM_LDOA, 18, &pm8950_pldo, "vdd_l1_l19"}, +- { "l20", QCOM_SMD_RPM_LDOA, 18, &pm8950_pldo, "vdd_l20"}, +- { "l21", QCOM_SMD_RPM_LDOA, 18, &pm8950_pldo, "vdd_l21"}, +- { "l22", QCOM_SMD_RPM_LDOA, 18, &pm8950_pldo, "vdd_l8_l11_l12_l17_l22"}, +- { "l23", QCOM_SMD_RPM_LDOA, 18, &pm8950_pldo, "vdd_l2_l23"}, ++ { "l11", QCOM_SMD_RPM_LDOA, 11, &pm8950_ult_pldo, "vdd_l8_l11_l12_l17_l22" }, ++ { "l12", QCOM_SMD_RPM_LDOA, 12, &pm8950_ult_pldo, "vdd_l8_l11_l12_l17_l22" }, ++ { "l13", QCOM_SMD_RPM_LDOA, 13, &pm8950_ult_pldo, "vdd_l9_l10_l13_l14_l15_l18" }, ++ { "l14", QCOM_SMD_RPM_LDOA, 14, &pm8950_ult_pldo, "vdd_l9_l10_l13_l14_l15_l18" }, ++ { "l15", QCOM_SMD_RPM_LDOA, 15, &pm8950_ult_pldo, "vdd_l9_l10_l13_l14_l15_l18" }, ++ { "l16", QCOM_SMD_RPM_LDOA, 16, &pm8950_ult_pldo, "vdd_l5_l6_l7_l16" }, ++ { "l17", QCOM_SMD_RPM_LDOA, 17, &pm8950_ult_pldo, "vdd_l8_l11_l12_l17_l22" }, ++ /* L18 seems not to exist. */ ++ { "l19", QCOM_SMD_RPM_LDOA, 19, &pm8950_pldo, "vdd_l1_l19" }, ++ /* L20 & L21 seem not to exist. */ ++ { "l22", QCOM_SMD_RPM_LDOA, 22, &pm8950_pldo, "vdd_l8_l11_l12_l17_l22" }, ++ { "l23", QCOM_SMD_RPM_LDOA, 23, &pm8950_pldo, "vdd_l2_l23" }, + {} + }; + +diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c +index 6cb48ae8e1241..d8967bf72ef26 100644 +--- a/drivers/scsi/dc395x.c ++++ b/drivers/scsi/dc395x.c +@@ -3631,10 +3631,19 @@ static struct DeviceCtlBlk *device_alloc(struct AdapterCtlBlk *acb, + #endif + if (dcb->target_lun != 0) { + /* Copy settings */ +- struct DeviceCtlBlk *p; +- list_for_each_entry(p, &acb->dcb_list, list) +- if (p->target_id == dcb->target_id) ++ struct DeviceCtlBlk *p = NULL, *iter; ++ ++ list_for_each_entry(iter, &acb->dcb_list, list) ++ if (iter->target_id == dcb->target_id) { ++ p = iter; + break; ++ } ++ ++ if (!p) { ++ kfree(dcb); ++ return NULL; ++ } ++ + dprintkdbg(DBG_1, + "device_alloc: <%02i-%i> copy from <%02i-%i>\n", + dcb->target_id, dcb->target_lun, +diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c +index 5ea426effa609..bbc5d6b9be737 100644 +--- a/drivers/scsi/fcoe/fcoe_ctlr.c ++++ b/drivers/scsi/fcoe/fcoe_ctlr.c +@@ -1969,7 +1969,7 @@ EXPORT_SYMBOL(fcoe_ctlr_recv_flogi); + * + * Returns: u64 fc world wide name + */ +-u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN], ++u64 fcoe_wwn_from_mac(unsigned char mac[ETH_ALEN], + unsigned int scheme, unsigned int port) + { + u64 wwn; +diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c +index a50f870c5f725..755d68b981602 100644 +--- a/drivers/scsi/lpfc/lpfc_sli.c ++++ b/drivers/scsi/lpfc/lpfc_sli.c +@@ -17445,7 +17445,6 @@ lpfc_fc_frame_check(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr) + case FC_RCTL_ELS_REP: /* extended link services reply */ + case FC_RCTL_ELS4_REQ: /* FC-4 ELS request */ + case FC_RCTL_ELS4_REP: /* FC-4 ELS reply */ +- case FC_RCTL_BA_NOP: /* basic link service NOP */ + case FC_RCTL_BA_ABTS: /* basic link service abort */ + case FC_RCTL_BA_RMC: /* remove connection */ + case FC_RCTL_BA_ACC: /* basic accept */ +@@ -17466,6 +17465,7 @@ lpfc_fc_frame_check(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr) + fc_vft_hdr = (struct fc_vft_header *)fc_hdr; + fc_hdr = &((struct fc_frame_header *)fc_vft_hdr)[1]; + return lpfc_fc_frame_check(phba, fc_hdr); ++ case FC_RCTL_BA_NOP: /* basic link service NOP */ + default: + goto drop; + } +@@ -18284,12 +18284,14 @@ lpfc_sli4_send_seq_to_ulp(struct lpfc_vport *vport, + if (!lpfc_complete_unsol_iocb(phba, + phba->sli4_hba.els_wq->pring, + iocbq, fc_hdr->fh_r_ctl, +- fc_hdr->fh_type)) ++ fc_hdr->fh_type)) { + lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT, + "2540 Ring %d handler: unexpected Rctl " + "x%x Type x%x received\n", + LPFC_ELS_RING, + fc_hdr->fh_r_ctl, fc_hdr->fh_type); ++ lpfc_in_buf_free(phba, &seq_dmabuf->dbuf); ++ } + + /* Free iocb created in lpfc_prep_seq */ + list_for_each_entry_safe(curr_iocb, next_iocb, +diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c +index 80f546976c7e1..daffa36988aee 100644 +--- a/drivers/scsi/megaraid.c ++++ b/drivers/scsi/megaraid.c +@@ -4634,7 +4634,7 @@ static int __init megaraid_init(void) + * major number allocation. + */ + major = register_chrdev(0, "megadev_legacy", &megadev_fops); +- if (!major) { ++ if (major < 0) { + printk(KERN_WARNING + "megaraid: failed to register char device\n"); + } +diff --git a/drivers/scsi/ufs/ti-j721e-ufs.c b/drivers/scsi/ufs/ti-j721e-ufs.c +index eafe0db98d542..122d650d08102 100644 +--- a/drivers/scsi/ufs/ti-j721e-ufs.c ++++ b/drivers/scsi/ufs/ti-j721e-ufs.c +@@ -29,11 +29,9 @@ static int ti_j721e_ufs_probe(struct platform_device *pdev) + return PTR_ERR(regbase); + + pm_runtime_enable(dev); +- ret = pm_runtime_get_sync(dev); +- if (ret < 0) { +- pm_runtime_put_noidle(dev); ++ ret = pm_runtime_resume_and_get(dev); ++ if (ret < 0) + goto disable_pm; +- } + + /* Select MPHY refclk frequency */ + clk = devm_clk_get(dev, NULL); +diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c +index 20182e39cb282..08331ecbe91fb 100644 +--- a/drivers/scsi/ufs/ufs-qcom.c ++++ b/drivers/scsi/ufs/ufs-qcom.c +@@ -623,12 +623,7 @@ static int ufs_qcom_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) + return err; + } + +- err = ufs_qcom_ice_resume(host); +- if (err) +- return err; +- +- hba->is_sys_suspended = false; +- return 0; ++ return ufs_qcom_ice_resume(host); + } + + static void ufs_qcom_dev_ref_clk_ctrl(struct ufs_qcom_host *host, bool enable) +@@ -669,8 +664,11 @@ static void ufs_qcom_dev_ref_clk_ctrl(struct ufs_qcom_host *host, bool enable) + + writel_relaxed(temp, host->dev_ref_clk_ctrl_mmio); + +- /* ensure that ref_clk is enabled/disabled before we return */ +- wmb(); ++ /* ++ * Make sure the write to ref_clk reaches the destination and ++ * not stored in a Write Buffer (WB). ++ */ ++ readl(host->dev_ref_clk_ctrl_mmio); + + /* + * If we call hibern8 exit after this, we need to make sure that +diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c +index bf302776340ce..ea6ceab1a1b25 100644 +--- a/drivers/scsi/ufs/ufshcd.c ++++ b/drivers/scsi/ufs/ufshcd.c +@@ -107,8 +107,13 @@ int ufshcd_dump_regs(struct ufs_hba *hba, size_t offset, size_t len, + if (!regs) + return -ENOMEM; + +- for (pos = 0; pos < len; pos += 4) ++ for (pos = 0; pos < len; pos += 4) { ++ if (offset == 0 && ++ pos >= REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER && ++ pos <= REG_UIC_ERROR_CODE_DME) ++ continue; + regs[pos / 4] = ufshcd_readl(hba, offset + pos); ++ } + + ufshcd_hex_dump(prefix, regs, len); + kfree(regs); +diff --git a/drivers/soc/qcom/llcc-qcom.c b/drivers/soc/qcom/llcc-qcom.c +index 70fbe70c6213c..2e06f48d683d1 100644 +--- a/drivers/soc/qcom/llcc-qcom.c ++++ b/drivers/soc/qcom/llcc-qcom.c +@@ -496,6 +496,7 @@ static const struct of_device_id qcom_llcc_of_match[] = { + { .compatible = "qcom,sdm845-llcc", .data = &sdm845_cfg }, + { } + }; ++MODULE_DEVICE_TABLE(of, qcom_llcc_of_match); + + static struct platform_driver qcom_llcc_driver = { + .driver = { +diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c +index a9709aae54abb..fb76c8bc3c64b 100644 +--- a/drivers/soc/qcom/smp2p.c ++++ b/drivers/soc/qcom/smp2p.c +@@ -420,6 +420,7 @@ static int smp2p_parse_ipc(struct qcom_smp2p *smp2p) + } + + smp2p->ipc_regmap = syscon_node_to_regmap(syscon); ++ of_node_put(syscon); + if (IS_ERR(smp2p->ipc_regmap)) + return PTR_ERR(smp2p->ipc_regmap); + +diff --git a/drivers/soc/qcom/smsm.c b/drivers/soc/qcom/smsm.c +index c428d0f78816e..6564f15c53190 100644 +--- a/drivers/soc/qcom/smsm.c ++++ b/drivers/soc/qcom/smsm.c +@@ -359,6 +359,7 @@ static int smsm_parse_ipc(struct qcom_smsm *smsm, unsigned host_id) + return 0; + + host->ipc_regmap = syscon_node_to_regmap(syscon); ++ of_node_put(syscon); + if (IS_ERR(host->ipc_regmap)) + return PTR_ERR(host->ipc_regmap); + +diff --git a/drivers/soc/ti/ti_sci_pm_domains.c b/drivers/soc/ti/ti_sci_pm_domains.c +index 8afb3f45d2637..a33ec7eaf23d1 100644 +--- a/drivers/soc/ti/ti_sci_pm_domains.c ++++ b/drivers/soc/ti/ti_sci_pm_domains.c +@@ -183,6 +183,8 @@ static int ti_sci_pm_domain_probe(struct platform_device *pdev) + devm_kcalloc(dev, max_id + 1, + sizeof(*pd_provider->data.domains), + GFP_KERNEL); ++ if (!pd_provider->data.domains) ++ return -ENOMEM; + + pd_provider->data.num_domains = max_id + 1; + pd_provider->data.xlate = ti_sci_pd_xlate; +diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c +index 9851551ebbe05..46ae46a944c5c 100644 +--- a/drivers/spi/spi-fsl-qspi.c ++++ b/drivers/spi/spi-fsl-qspi.c +@@ -876,6 +876,10 @@ static int fsl_qspi_probe(struct platform_device *pdev) + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, + "QuadSPI-memory"); ++ if (!res) { ++ ret = -EINVAL; ++ goto err_put_ctrl; ++ } + q->memmap_phy = res->start; + /* Since there are 4 cs, map size required is 4 times ahb_buf_size */ + q->ahb_addr = devm_ioremap(dev, q->memmap_phy, +diff --git a/drivers/spi/spi-img-spfi.c b/drivers/spi/spi-img-spfi.c +index 5f05d519fbbd0..71376b6df89db 100644 +--- a/drivers/spi/spi-img-spfi.c ++++ b/drivers/spi/spi-img-spfi.c +@@ -731,7 +731,7 @@ static int img_spfi_resume(struct device *dev) + int ret; + + ret = pm_runtime_get_sync(dev); +- if (ret) { ++ if (ret < 0) { + pm_runtime_put_noidle(dev); + return ret; + } +diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c +index e39fd38f5180e..ea03cc589e61f 100644 +--- a/drivers/spi/spi-rspi.c ++++ b/drivers/spi/spi-rspi.c +@@ -1107,14 +1107,11 @@ static struct dma_chan *rspi_request_dma_chan(struct device *dev, + } + + memset(&cfg, 0, sizeof(cfg)); ++ cfg.dst_addr = port_addr + RSPI_SPDR; ++ cfg.src_addr = port_addr + RSPI_SPDR; ++ cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; ++ cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; + cfg.direction = dir; +- if (dir == DMA_MEM_TO_DEV) { +- cfg.dst_addr = port_addr; +- cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; +- } else { +- cfg.src_addr = port_addr; +- cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; +- } + + ret = dmaengine_slave_config(chan, &cfg); + if (ret) { +@@ -1145,12 +1142,12 @@ static int rspi_request_dma(struct device *dev, struct spi_controller *ctlr, + } + + ctlr->dma_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV, dma_tx_id, +- res->start + RSPI_SPDR); ++ res->start); + if (!ctlr->dma_tx) + return -ENODEV; + + ctlr->dma_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM, dma_rx_id, +- res->start + RSPI_SPDR); ++ res->start); + if (!ctlr->dma_rx) { + dma_release_channel(ctlr->dma_tx); + ctlr->dma_tx = NULL; +diff --git a/drivers/spi/spi-stm32-qspi.c b/drivers/spi/spi-stm32-qspi.c +index 4f24f63922126..9c58dcd7b3242 100644 +--- a/drivers/spi/spi-stm32-qspi.c ++++ b/drivers/spi/spi-stm32-qspi.c +@@ -295,7 +295,8 @@ static int stm32_qspi_wait_cmd(struct stm32_qspi *qspi, + if (!op->data.nbytes) + goto wait_nobusy; + +- if (readl_relaxed(qspi->io_base + QSPI_SR) & SR_TCF) ++ if ((readl_relaxed(qspi->io_base + QSPI_SR) & SR_TCF) || ++ qspi->fmode == CCR_FMODE_APM) + goto out; + + reinit_completion(&qspi->data_completion); +diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c +index e06aafe169e0c..081da1fd3fd7e 100644 +--- a/drivers/spi/spi-ti-qspi.c ++++ b/drivers/spi/spi-ti-qspi.c +@@ -448,6 +448,7 @@ static int ti_qspi_dma_xfer(struct ti_qspi *qspi, dma_addr_t dma_dst, + enum dma_ctrl_flags flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT; + struct dma_async_tx_descriptor *tx; + int ret; ++ unsigned long time_left; + + tx = dmaengine_prep_dma_memcpy(chan, dma_dst, dma_src, len, flags); + if (!tx) { +@@ -467,9 +468,9 @@ static int ti_qspi_dma_xfer(struct ti_qspi *qspi, dma_addr_t dma_dst, + } + + dma_async_issue_pending(chan); +- ret = wait_for_completion_timeout(&qspi->transfer_complete, ++ time_left = wait_for_completion_timeout(&qspi->transfer_complete, + msecs_to_jiffies(len)); +- if (ret <= 0) { ++ if (time_left == 0) { + dmaengine_terminate_sync(chan); + dev_err(qspi->dev, "DMA wait_for_completion_timeout\n"); + return -ETIMEDOUT; +diff --git a/drivers/staging/media/hantro/hantro_v4l2.c b/drivers/staging/media/hantro/hantro_v4l2.c +index 5c2ca61add8e8..b65f2f3ef357f 100644 +--- a/drivers/staging/media/hantro/hantro_v4l2.c ++++ b/drivers/staging/media/hantro/hantro_v4l2.c +@@ -644,8 +644,12 @@ static int hantro_buf_prepare(struct vb2_buffer *vb) + * (for OUTPUT buffers, if userspace passes 0 bytesused, v4l2-core sets + * it to buffer length). + */ +- if (V4L2_TYPE_IS_CAPTURE(vq->type)) +- vb2_set_plane_payload(vb, 0, pix_fmt->plane_fmt[0].sizeimage); ++ if (V4L2_TYPE_IS_CAPTURE(vq->type)) { ++ if (ctx->is_encoder) ++ vb2_set_plane_payload(vb, 0, 0); ++ else ++ vb2_set_plane_payload(vb, 0, pix_fmt->plane_fmt[0].sizeimage); ++ } + + return 0; + } +diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c +index 5487f6d0bcb63..7013f7ce36781 100644 +--- a/drivers/staging/media/rkvdec/rkvdec-h264.c ++++ b/drivers/staging/media/rkvdec/rkvdec-h264.c +@@ -112,6 +112,7 @@ struct rkvdec_h264_run { + const struct v4l2_ctrl_h264_sps *sps; + const struct v4l2_ctrl_h264_pps *pps; + const struct v4l2_ctrl_h264_scaling_matrix *scaling_matrix; ++ int ref_buf_idx[V4L2_H264_NUM_DPB_ENTRIES]; + }; + + struct rkvdec_h264_ctx { +@@ -661,8 +662,8 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, + WRITE_PPS(0xff, PROFILE_IDC); + WRITE_PPS(1, CONSTRAINT_SET3_FLAG); + WRITE_PPS(sps->chroma_format_idc, CHROMA_FORMAT_IDC); +- WRITE_PPS(sps->bit_depth_luma_minus8 + 8, BIT_DEPTH_LUMA); +- WRITE_PPS(sps->bit_depth_chroma_minus8 + 8, BIT_DEPTH_CHROMA); ++ WRITE_PPS(sps->bit_depth_luma_minus8, BIT_DEPTH_LUMA); ++ WRITE_PPS(sps->bit_depth_chroma_minus8, BIT_DEPTH_CHROMA); + WRITE_PPS(0, QPPRIME_Y_ZERO_TRANSFORM_BYPASS_FLAG); + WRITE_PPS(sps->log2_max_frame_num_minus4, LOG2_MAX_FRAME_NUM_MINUS4); + WRITE_PPS(sps->max_num_ref_frames, MAX_NUM_REF_FRAMES); +@@ -725,6 +726,26 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, + } + } + ++static void lookup_ref_buf_idx(struct rkvdec_ctx *ctx, ++ struct rkvdec_h264_run *run) ++{ ++ const struct v4l2_ctrl_h264_decode_params *dec_params = run->decode_params; ++ u32 i; ++ ++ for (i = 0; i < ARRAY_SIZE(dec_params->dpb); i++) { ++ struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx; ++ const struct v4l2_h264_dpb_entry *dpb = run->decode_params->dpb; ++ struct vb2_queue *cap_q = &m2m_ctx->cap_q_ctx.q; ++ int buf_idx = -1; ++ ++ if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE) ++ buf_idx = vb2_find_timestamp(cap_q, ++ dpb[i].reference_ts, 0); ++ ++ run->ref_buf_idx[i] = buf_idx; ++ } ++} ++ + static void assemble_hw_rps(struct rkvdec_ctx *ctx, + struct rkvdec_h264_run *run) + { +@@ -762,7 +783,7 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, + + for (j = 0; j < RKVDEC_NUM_REFLIST; j++) { + for (i = 0; i < h264_ctx->reflists.num_valid; i++) { +- u8 dpb_valid = 0; ++ bool dpb_valid = run->ref_buf_idx[i] >= 0; + u8 idx = 0; + + switch (j) { +@@ -779,8 +800,6 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, + + if (idx >= ARRAY_SIZE(dec_params->dpb)) + continue; +- dpb_valid = !!(dpb[idx].flags & +- V4L2_H264_DPB_ENTRY_FLAG_ACTIVE); + + set_ps_field(hw_rps, DPB_INFO(i, j), + idx | dpb_valid << 4); +@@ -859,13 +878,8 @@ get_ref_buf(struct rkvdec_ctx *ctx, struct rkvdec_h264_run *run, + unsigned int dpb_idx) + { + struct v4l2_m2m_ctx *m2m_ctx = ctx->fh.m2m_ctx; +- const struct v4l2_h264_dpb_entry *dpb = run->decode_params->dpb; + struct vb2_queue *cap_q = &m2m_ctx->cap_q_ctx.q; +- int buf_idx = -1; +- +- if (dpb[dpb_idx].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE) +- buf_idx = vb2_find_timestamp(cap_q, +- dpb[dpb_idx].reference_ts, 0); ++ int buf_idx = run->ref_buf_idx[dpb_idx]; + + /* + * If a DPB entry is unused or invalid, address of current destination +@@ -1102,6 +1116,7 @@ static int rkvdec_h264_run(struct rkvdec_ctx *ctx) + + assemble_hw_scaling_list(ctx, &run); + assemble_hw_pps(ctx, &run); ++ lookup_ref_buf_idx(ctx, &run); + assemble_hw_rps(ctx, &run); + config_registers(ctx, &run); + +diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c +index a7788e7a9542a..e384ea8d72801 100644 +--- a/drivers/staging/media/rkvdec/rkvdec.c ++++ b/drivers/staging/media/rkvdec/rkvdec.c +@@ -1000,7 +1000,6 @@ static const char * const rkvdec_clk_names[] = { + static int rkvdec_probe(struct platform_device *pdev) + { + struct rkvdec_dev *rkvdec; +- struct resource *res; + unsigned int i; + int ret, irq; + +@@ -1032,8 +1031,7 @@ static int rkvdec_probe(struct platform_device *pdev) + */ + clk_set_rate(rkvdec->clocks[0].clk, 500 * 1000 * 1000); + +- res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- rkvdec->regs = devm_ioremap_resource(&pdev->dev, res); ++ rkvdec->regs = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(rkvdec->regs)) + return PTR_ERR(rkvdec->regs); + +diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c +index 109f019d21480..1eded5c4ebda6 100644 +--- a/drivers/target/target_core_device.c ++++ b/drivers/target/target_core_device.c +@@ -831,7 +831,6 @@ bool target_configure_unmap_from_queue(struct se_dev_attrib *attrib, + attrib->unmap_granularity = q->limits.discard_granularity / block_size; + attrib->unmap_granularity_alignment = q->limits.discard_alignment / + block_size; +- attrib->unmap_zeroes_data = !!(q->limits.max_write_zeroes_sectors); + return true; + } + EXPORT_SYMBOL(target_configure_unmap_from_queue); +diff --git a/drivers/thermal/broadcom/bcm2711_thermal.c b/drivers/thermal/broadcom/bcm2711_thermal.c +index 67c2a737bc9d9..7b536c8a59dca 100644 +--- a/drivers/thermal/broadcom/bcm2711_thermal.c ++++ b/drivers/thermal/broadcom/bcm2711_thermal.c +@@ -38,7 +38,6 @@ static int bcm2711_get_temp(void *data, int *temp) + int offset = thermal_zone_get_offset(priv->thermal); + u32 val; + int ret; +- long t; + + ret = regmap_read(priv->regmap, AVS_RO_TEMP_STATUS, &val); + if (ret) +@@ -50,9 +49,7 @@ static int bcm2711_get_temp(void *data, int *temp) + val &= AVS_RO_TEMP_STATUS_DATA_MSK; + + /* Convert a HW code to a temperature reading (millidegree celsius) */ +- t = slope * val + offset; +- +- *temp = t < 0 ? 0 : t; ++ *temp = slope * val + offset; + + return 0; + } +diff --git a/drivers/thermal/broadcom/sr-thermal.c b/drivers/thermal/broadcom/sr-thermal.c +index 475ce29007713..85ab9edd580cc 100644 +--- a/drivers/thermal/broadcom/sr-thermal.c ++++ b/drivers/thermal/broadcom/sr-thermal.c +@@ -60,6 +60,9 @@ static int sr_thermal_probe(struct platform_device *pdev) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) ++ return -ENOENT; ++ + sr_thermal->regs = (void __iomem *)devm_memremap(&pdev->dev, res->start, + resource_size(res), + MEMREMAP_WB); +diff --git a/drivers/thermal/imx_sc_thermal.c b/drivers/thermal/imx_sc_thermal.c +index 8d76dbfde6a9f..331a241eb0ef3 100644 +--- a/drivers/thermal/imx_sc_thermal.c ++++ b/drivers/thermal/imx_sc_thermal.c +@@ -94,8 +94,8 @@ static int imx_sc_thermal_probe(struct platform_device *pdev) + sensor = devm_kzalloc(&pdev->dev, sizeof(*sensor), GFP_KERNEL); + if (!sensor) { + of_node_put(child); +- of_node_put(sensor_np); +- return -ENOMEM; ++ ret = -ENOMEM; ++ goto put_node; + } + + ret = thermal_zone_of_get_sensor_id(child, +@@ -124,7 +124,9 @@ static int imx_sc_thermal_probe(struct platform_device *pdev) + dev_warn(&pdev->dev, "failed to add hwmon sysfs attributes\n"); + } + ++put_node: + of_node_put(sensor_np); ++ of_node_put(np); + + return ret; + } +diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c +index d9e34ac376626..dd449945e1e5e 100644 +--- a/drivers/thermal/thermal_core.c ++++ b/drivers/thermal/thermal_core.c +@@ -1092,10 +1092,7 @@ __thermal_cooling_device_register(struct device_node *np, + { + struct thermal_cooling_device *cdev; + struct thermal_zone_device *pos = NULL; +- int result; +- +- if (type && strlen(type) >= THERMAL_NAME_LENGTH) +- return ERR_PTR(-EINVAL); ++ int id, ret; + + if (!ops || !ops->get_max_state || !ops->get_cur_state || + !ops->set_cur_state) +@@ -1105,14 +1102,18 @@ __thermal_cooling_device_register(struct device_node *np, + if (!cdev) + return ERR_PTR(-ENOMEM); + +- result = ida_simple_get(&thermal_cdev_ida, 0, 0, GFP_KERNEL); +- if (result < 0) { +- kfree(cdev); +- return ERR_PTR(result); ++ ret = ida_simple_get(&thermal_cdev_ida, 0, 0, GFP_KERNEL); ++ if (ret < 0) ++ goto out_kfree_cdev; ++ cdev->id = ret; ++ id = ret; ++ ++ cdev->type = kstrdup(type ? type : "", GFP_KERNEL); ++ if (!cdev->type) { ++ ret = -ENOMEM; ++ goto out_ida_remove; + } + +- cdev->id = result; +- strlcpy(cdev->type, type ? : "", sizeof(cdev->type)); + mutex_init(&cdev->lock); + INIT_LIST_HEAD(&cdev->thermal_instances); + cdev->np = np; +@@ -1122,12 +1123,9 @@ __thermal_cooling_device_register(struct device_node *np, + cdev->devdata = devdata; + thermal_cooling_device_setup_sysfs(cdev); + dev_set_name(&cdev->device, "cooling_device%d", cdev->id); +- result = device_register(&cdev->device); +- if (result) { +- ida_simple_remove(&thermal_cdev_ida, cdev->id); +- put_device(&cdev->device); +- return ERR_PTR(result); +- } ++ ret = device_register(&cdev->device); ++ if (ret) ++ goto out_kfree_type; + + /* Add 'this' new cdev to the global cdev list */ + mutex_lock(&thermal_list_lock); +@@ -1145,6 +1143,17 @@ __thermal_cooling_device_register(struct device_node *np, + mutex_unlock(&thermal_list_lock); + + return cdev; ++ ++out_kfree_type: ++ thermal_cooling_device_destroy_sysfs(cdev); ++ kfree(cdev->type); ++ put_device(&cdev->device); ++ cdev = NULL; ++out_ida_remove: ++ ida_simple_remove(&thermal_cdev_ida, id); ++out_kfree_cdev: ++ kfree(cdev); ++ return ERR_PTR(ret); + } + + /** +@@ -1303,6 +1312,7 @@ void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev) + ida_simple_remove(&thermal_cdev_ida, cdev->id); + device_del(&cdev->device); + thermal_cooling_device_destroy_sysfs(cdev); ++ kfree(cdev->type); + put_device(&cdev->device); + } + EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister); +diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c +index a7363bc66c11a..351ad0b020291 100644 +--- a/drivers/tty/serial/pch_uart.c ++++ b/drivers/tty/serial/pch_uart.c +@@ -628,22 +628,6 @@ static int push_rx(struct eg20t_port *priv, const unsigned char *buf, + return 0; + } + +-static int pop_tx_x(struct eg20t_port *priv, unsigned char *buf) +-{ +- int ret = 0; +- struct uart_port *port = &priv->port; +- +- if (port->x_char) { +- dev_dbg(priv->port.dev, "%s:X character send %02x (%lu)\n", +- __func__, port->x_char, jiffies); +- buf[0] = port->x_char; +- port->x_char = 0; +- ret = 1; +- } +- +- return ret; +-} +- + static int dma_push_rx(struct eg20t_port *priv, int size) + { + int room; +@@ -893,9 +877,10 @@ static unsigned int handle_tx(struct eg20t_port *priv) + + fifo_size = max(priv->fifo_size, 1); + tx_empty = 1; +- if (pop_tx_x(priv, xmit->buf)) { +- pch_uart_hal_write(priv, xmit->buf, 1); ++ if (port->x_char) { ++ pch_uart_hal_write(priv, &port->x_char, 1); + port->icount.tx++; ++ port->x_char = 0; + tx_empty = 0; + fifo_size--; + } +@@ -950,9 +935,11 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv) + } + + fifo_size = max(priv->fifo_size, 1); +- if (pop_tx_x(priv, xmit->buf)) { +- pch_uart_hal_write(priv, xmit->buf, 1); ++ ++ if (port->x_char) { ++ pch_uart_hal_write(priv, &port->x_char, 1); + port->icount.tx++; ++ port->x_char = 0; + fifo_size--; + } + +diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c +index 0fc473321d3e3..6c4a50addadd8 100644 +--- a/drivers/tty/tty_buffer.c ++++ b/drivers/tty/tty_buffer.c +@@ -172,7 +172,8 @@ static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size) + have queued and recycle that ? */ + if (atomic_read(&port->buf.mem_used) > port->buf.mem_limit) + return NULL; +- p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC); ++ p = kmalloc(sizeof(struct tty_buffer) + 2 * size, ++ GFP_ATOMIC | __GFP_NOWARN); + if (p == NULL) + return NULL; + +diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c +index ddd1d3eef912b..bf5e376676977 100644 +--- a/drivers/usb/core/hcd.c ++++ b/drivers/usb/core/hcd.c +@@ -2661,6 +2661,7 @@ int usb_add_hcd(struct usb_hcd *hcd, + { + int retval; + struct usb_device *rhdev; ++ struct usb_hcd *shared_hcd; + + if (!hcd->skip_phy_initialization && usb_hcd_is_primary_hcd(hcd)) { + hcd->phy_roothub = usb_phy_roothub_alloc(hcd->self.sysdev); +@@ -2817,13 +2818,26 @@ int usb_add_hcd(struct usb_hcd *hcd, + goto err_hcd_driver_start; + } + ++ /* starting here, usbcore will pay attention to the shared HCD roothub */ ++ shared_hcd = hcd->shared_hcd; ++ if (!usb_hcd_is_primary_hcd(hcd) && shared_hcd && HCD_DEFER_RH_REGISTER(shared_hcd)) { ++ retval = register_root_hub(shared_hcd); ++ if (retval != 0) ++ goto err_register_root_hub; ++ ++ if (shared_hcd->uses_new_polling && HCD_POLL_RH(shared_hcd)) ++ usb_hcd_poll_rh_status(shared_hcd); ++ } ++ + /* starting here, usbcore will pay attention to this root hub */ +- retval = register_root_hub(hcd); +- if (retval != 0) +- goto err_register_root_hub; ++ if (!HCD_DEFER_RH_REGISTER(hcd)) { ++ retval = register_root_hub(hcd); ++ if (retval != 0) ++ goto err_register_root_hub; + +- if (hcd->uses_new_polling && HCD_POLL_RH(hcd)) +- usb_hcd_poll_rh_status(hcd); ++ if (hcd->uses_new_polling && HCD_POLL_RH(hcd)) ++ usb_hcd_poll_rh_status(hcd); ++ } + + return retval; + +@@ -2866,6 +2880,7 @@ EXPORT_SYMBOL_GPL(usb_add_hcd); + void usb_remove_hcd(struct usb_hcd *hcd) + { + struct usb_device *rhdev = hcd->self.root_hub; ++ bool rh_registered; + + dev_info(hcd->self.controller, "remove, state %x\n", hcd->state); + +@@ -2876,6 +2891,7 @@ void usb_remove_hcd(struct usb_hcd *hcd) + + dev_dbg(hcd->self.controller, "roothub graceful disconnect\n"); + spin_lock_irq (&hcd_root_hub_lock); ++ rh_registered = hcd->rh_registered; + hcd->rh_registered = 0; + spin_unlock_irq (&hcd_root_hub_lock); + +@@ -2885,7 +2901,8 @@ void usb_remove_hcd(struct usb_hcd *hcd) + cancel_work_sync(&hcd->died_work); + + mutex_lock(&usb_bus_idr_lock); +- usb_disconnect(&rhdev); /* Sets rhdev to NULL */ ++ if (rh_registered) ++ usb_disconnect(&rhdev); /* Sets rhdev to NULL */ + mutex_unlock(&usb_bus_idr_lock); + + /* +diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c +index 7e5fd6afd9f45..f03ee889ecc70 100644 +--- a/drivers/usb/core/quirks.c ++++ b/drivers/usb/core/quirks.c +@@ -511,6 +511,9 @@ static const struct usb_device_id usb_quirk_list[] = { + /* DJI CineSSD */ + { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM }, + ++ /* DELL USB GEN2 */ ++ { USB_DEVICE(0x413c, 0xb062), .driver_info = USB_QUIRK_NO_LPM | USB_QUIRK_RESET_RESUME }, ++ + /* VCOM device */ + { USB_DEVICE(0x4296, 0x7570), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS }, + +diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c +index 1f0503dc96eed..05fe6ded66a52 100644 +--- a/drivers/usb/dwc3/gadget.c ++++ b/drivers/usb/dwc3/gadget.c +@@ -2960,14 +2960,14 @@ static bool dwc3_gadget_endpoint_trbs_complete(struct dwc3_ep *dep, + struct dwc3 *dwc = dep->dwc; + bool no_started_trb = true; + +- if (!dep->endpoint.desc) +- return no_started_trb; +- + dwc3_gadget_ep_cleanup_completed_requests(dep, event, status); + + if (dep->flags & DWC3_EP_END_TRANSFER_PENDING) + goto out; + ++ if (!dep->endpoint.desc) ++ return no_started_trb; ++ + if (usb_endpoint_xfer_isoc(dep->endpoint.desc) && + list_empty(&dep->started_list) && + (list_empty(&dep->pending_list) || status == -EXDEV)) +diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c +index 48e2c04741891..886279755804e 100644 +--- a/drivers/usb/host/xhci-pci.c ++++ b/drivers/usb/host/xhci-pci.c +@@ -59,6 +59,7 @@ + #define PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI 0x9a13 + #define PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI 0x1138 + #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI 0x461e ++#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_N_XHCI 0x464e + #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI 0x51ed + + #define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 +@@ -263,6 +264,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) + pdev->device == PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI || + pdev->device == PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI || + pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_XHCI || ++ pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_N_XHCI || + pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI)) + xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW; + +diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c +index 2eb4083c5b45c..a40c0f3b85c2c 100644 +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -1137,6 +1137,8 @@ static const struct usb_device_id option_ids[] = { + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM12, 0xff, 0, 0) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 0x0620, 0xff, 0xff, 0x30) }, /* EM160R-GL */ + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 0x0620, 0xff, 0, 0) }, ++ { USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, 0x0700, 0xff), /* BG95 */ ++ .driver_info = RSVD(3) | ZLP }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x30) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) }, + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10), +diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_sim.c +index f2ad450db5478..e65c0fa95d311 100644 +--- a/drivers/vdpa/vdpa_sim/vdpa_sim.c ++++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c +@@ -473,11 +473,14 @@ static void vdpasim_set_vq_ready(struct vdpa_device *vdpa, u16 idx, bool ready) + { + struct vdpasim *vdpasim = vdpa_to_sim(vdpa); + struct vdpasim_virtqueue *vq = &vdpasim->vqs[idx]; ++ bool old_ready; + + spin_lock(&vdpasim->lock); ++ old_ready = vq->ready; + vq->ready = ready; +- if (vq->ready) ++ if (vq->ready && !old_ready) { + vdpasim_queue_ready(vdpasim, idx); ++ } + spin_unlock(&vdpasim->lock); + } + +diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c +index 40496e9e9b438..f304163e87e99 100644 +--- a/drivers/video/console/sticon.c ++++ b/drivers/video/console/sticon.c +@@ -46,6 +46,7 @@ + #include <linux/slab.h> + #include <linux/font.h> + #include <linux/crc32.h> ++#include <linux/fb.h> + + #include <asm/io.h> + +@@ -392,7 +393,9 @@ static int __init sticonsole_init(void) + for (i = 0; i < MAX_NR_CONSOLES; i++) + font_data[i] = STI_DEF_FONT; + +- pr_info("sticon: Initializing STI text console.\n"); ++ pr_info("sticon: Initializing STI text console on %s at [%s]\n", ++ sticon_sti->sti_data->inq_outptr.dev_name, ++ sticon_sti->pa_path); + console_lock(); + err = do_take_over_console(&sti_con, 0, MAX_NR_CONSOLES - 1, + PAGE0->mem_cons.cl_class != CL_DUPLEX); +diff --git a/drivers/video/console/sticore.c b/drivers/video/console/sticore.c +index 6a26a364f9bd7..77622ef401d8f 100644 +--- a/drivers/video/console/sticore.c ++++ b/drivers/video/console/sticore.c +@@ -30,10 +30,11 @@ + #include <asm/pdc.h> + #include <asm/cacheflush.h> + #include <asm/grfioctl.h> ++#include <asm/fb.h> + + #include "../fbdev/sticore.h" + +-#define STI_DRIVERVERSION "Version 0.9b" ++#define STI_DRIVERVERSION "Version 0.9c" + + static struct sti_struct *default_sti __read_mostly; + +@@ -502,7 +503,7 @@ sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name) + if (!fbfont) + return NULL; + +- pr_info("STI selected %dx%d framebuffer font %s for sticon\n", ++ pr_info(" using %ux%u framebuffer font %s\n", + fbfont->width, fbfont->height, fbfont->name); + + bpc = ((fbfont->width+7)/8) * fbfont->height; +@@ -946,6 +947,7 @@ out_err: + + static void sticore_check_for_default_sti(struct sti_struct *sti, char *path) + { ++ pr_info(" located at [%s]\n", sti->pa_path); + if (strcmp (path, default_sti_path) == 0) + default_sti = sti; + } +@@ -957,7 +959,6 @@ static void sticore_check_for_default_sti(struct sti_struct *sti, char *path) + */ + static int __init sticore_pa_init(struct parisc_device *dev) + { +- char pa_path[21]; + struct sti_struct *sti = NULL; + int hpa = dev->hpa.start; + +@@ -970,8 +971,8 @@ static int __init sticore_pa_init(struct parisc_device *dev) + if (!sti) + return 1; + +- print_pa_hwpath(dev, pa_path); +- sticore_check_for_default_sti(sti, pa_path); ++ print_pa_hwpath(dev, sti->pa_path); ++ sticore_check_for_default_sti(sti, sti->pa_path); + return 0; + } + +@@ -1007,9 +1008,8 @@ static int sticore_pci_init(struct pci_dev *pd, const struct pci_device_id *ent) + + sti = sti_try_rom_generic(rom_base, fb_base, pd); + if (sti) { +- char pa_path[30]; +- print_pci_hwpath(pd, pa_path); +- sticore_check_for_default_sti(sti, pa_path); ++ print_pci_hwpath(pd, sti->pa_path); ++ sticore_check_for_default_sti(sti, sti->pa_path); + } + + if (!sti) { +@@ -1127,6 +1127,22 @@ int sti_call(const struct sti_struct *sti, unsigned long func, + return ret; + } + ++/* check if given fb_info is the primary device */ ++int fb_is_primary_device(struct fb_info *info) ++{ ++ struct sti_struct *sti; ++ ++ sti = sti_get_rom(0); ++ ++ /* if no built-in graphics card found, allow any fb driver as default */ ++ if (!sti) ++ return true; ++ ++ /* return true if it's the default built-in framebuffer driver */ ++ return (sti->info == info); ++} ++EXPORT_SYMBOL(fb_is_primary_device); ++ + MODULE_AUTHOR("Philipp Rumpf, Helge Deller, Thomas Bogendoerfer"); + MODULE_DESCRIPTION("Core STI driver for HP's NGLE series graphics cards in HP PARISC machines"); + MODULE_LICENSE("GPL v2"); +diff --git a/drivers/video/fbdev/amba-clcd.c b/drivers/video/fbdev/amba-clcd.c +index 33595cc4778e9..79efefd224f40 100644 +--- a/drivers/video/fbdev/amba-clcd.c ++++ b/drivers/video/fbdev/amba-clcd.c +@@ -771,12 +771,15 @@ static int clcdfb_of_vram_setup(struct clcd_fb *fb) + return -ENODEV; + + fb->fb.screen_base = of_iomap(memory, 0); +- if (!fb->fb.screen_base) ++ if (!fb->fb.screen_base) { ++ of_node_put(memory); + return -ENOMEM; ++ } + + fb->fb.fix.smem_start = of_translate_address(memory, + of_get_address(memory, 0, &size, NULL)); + fb->fb.fix.smem_len = size; ++ of_node_put(memory); + + return 0; + } +diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c +index f102519ccefb4..13de2bebb09a5 100644 +--- a/drivers/video/fbdev/core/fbcon.c ++++ b/drivers/video/fbdev/core/fbcon.c +@@ -3300,6 +3300,9 @@ static void fbcon_register_existing_fbs(struct work_struct *work) + + console_lock(); + ++ deferred_takeover = false; ++ logo_shown = FBCON_LOGO_DONTSHOW; ++ + for_each_registered_fb(i) + fbcon_fb_registered(registered_fb[i]); + +@@ -3317,8 +3320,6 @@ static int fbcon_output_notifier(struct notifier_block *nb, + pr_info("fbcon: Taking over console\n"); + + dummycon_unregister_output_notifier(&fbcon_output_nb); +- deferred_takeover = false; +- logo_shown = FBCON_LOGO_DONTSHOW; + + /* We may get called in atomic context */ + schedule_work(&fbcon_deferred_takeover_work); +diff --git a/drivers/video/fbdev/sticore.h b/drivers/video/fbdev/sticore.h +index c338f7848ae2b..0ebdd28a0b813 100644 +--- a/drivers/video/fbdev/sticore.h ++++ b/drivers/video/fbdev/sticore.h +@@ -370,6 +370,9 @@ struct sti_struct { + + /* pointer to all internal data */ + struct sti_all_data *sti_data; ++ ++ /* pa_path of this device */ ++ char pa_path[24]; + }; + + +diff --git a/drivers/video/fbdev/stifb.c b/drivers/video/fbdev/stifb.c +index 265865610edc6..002f265d8db58 100644 +--- a/drivers/video/fbdev/stifb.c ++++ b/drivers/video/fbdev/stifb.c +@@ -1317,11 +1317,11 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref) + goto out_err3; + } + ++ /* save for primary gfx device detection & unregister_framebuffer() */ ++ sti->info = info; + if (register_framebuffer(&fb->info) < 0) + goto out_err4; + +- sti->info = info; /* save for unregister_framebuffer() */ +- + fb_info(&fb->info, "%s %dx%d-%d frame buffer device, %s, id: %04x, mmio: 0x%04lx\n", + fix->id, + var->xres, +diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c +index 8be709cb8542a..efe0fb3ad8bdc 100644 +--- a/fs/afs/rxrpc.c ++++ b/fs/afs/rxrpc.c +@@ -572,6 +572,8 @@ static void afs_deliver_to_call(struct afs_call *call) + case -ENODATA: + case -EBADMSG: + case -EMSGSIZE: ++ case -ENOMEM: ++ case -EFAULT: + abort_code = RXGEN_CC_UNMARSHAL; + if (state != AFS_CALL_CL_AWAIT_REPLY) + abort_code = RXGEN_SS_UNMARSHAL; +@@ -579,7 +581,7 @@ static void afs_deliver_to_call(struct afs_call *call) + abort_code, ret, "KUM"); + goto local_abort; + default: +- abort_code = RX_USER_ABORT; ++ abort_code = RX_CALL_DEAD; + rxrpc_kernel_abort_call(call->net->socket, call->rxcall, + abort_code, ret, "KER"); + goto local_abort; +@@ -871,7 +873,7 @@ void afs_send_empty_reply(struct afs_call *call) + case -ENOMEM: + _debug("oom"); + rxrpc_kernel_abort_call(net->socket, call->rxcall, +- RX_USER_ABORT, -ENOMEM, "KOO"); ++ RXGEN_SS_MARSHAL, -ENOMEM, "KOO"); + fallthrough; + default: + _leave(" [error]"); +@@ -913,7 +915,7 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len) + if (n == -ENOMEM) { + _debug("oom"); + rxrpc_kernel_abort_call(net->socket, call->rxcall, +- RX_USER_ABORT, -ENOMEM, "KOO"); ++ RXGEN_SS_MARSHAL, -ENOMEM, "KOO"); + } + _leave(" [error]"); + } +diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c +index b9c658e0548eb..69f4db05191a3 100644 +--- a/fs/binfmt_flat.c ++++ b/fs/binfmt_flat.c +@@ -427,6 +427,30 @@ static void old_reloc(unsigned long rl) + + /****************************************************************************/ + ++static inline u32 __user *skip_got_header(u32 __user *rp) ++{ ++ if (IS_ENABLED(CONFIG_RISCV)) { ++ /* ++ * RISC-V has a 16 byte GOT PLT header for elf64-riscv ++ * and 8 byte GOT PLT header for elf32-riscv. ++ * Skip the whole GOT PLT header, since it is reserved ++ * for the dynamic linker (ld.so). ++ */ ++ u32 rp_val0, rp_val1; ++ ++ if (get_user(rp_val0, rp)) ++ return rp; ++ if (get_user(rp_val1, rp + 1)) ++ return rp; ++ ++ if (rp_val0 == 0xffffffff && rp_val1 == 0xffffffff) ++ rp += 4; ++ else if (rp_val0 == 0xffffffff) ++ rp += 2; ++ } ++ return rp; ++} ++ + static int load_flat_file(struct linux_binprm *bprm, + struct lib_info *libinfo, int id, unsigned long *extra_stack) + { +@@ -774,7 +798,8 @@ static int load_flat_file(struct linux_binprm *bprm, + * image. + */ + if (flags & FLAT_FLAG_GOTPIC) { +- for (rp = (u32 __user *)datapos; ; rp++) { ++ rp = skip_got_header((u32 __user *) datapos); ++ for (; ; rp++) { + u32 addr, rp_val; + if (get_user(rp_val, rp)) + return -EFAULT; +diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c +index 87e55b024ac2e..35acdab56a1c9 100644 +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -3061,7 +3061,7 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device + ~BTRFS_FEATURE_INCOMPAT_SUPP; + if (features) { + btrfs_err(fs_info, +- "cannot mount because of unsupported optional features (%llx)", ++ "cannot mount because of unsupported optional features (0x%llx)", + features); + err = -EINVAL; + goto fail_alloc; +@@ -3099,7 +3099,7 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device + ~BTRFS_FEATURE_COMPAT_RO_SUPP; + if (!sb_rdonly(sb) && features) { + btrfs_err(fs_info, +- "cannot mount read-write because of unsupported optional features (%llx)", ++ "cannot mount read-write because of unsupported optional features (0x%llx)", + features); + err = -EINVAL; + goto fail_alloc; +diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c +index 366d047638646..2fdf178aa76f6 100644 +--- a/fs/btrfs/volumes.c ++++ b/fs/btrfs/volumes.c +@@ -7191,12 +7191,12 @@ int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info) + * do another round of validation checks. + */ + if (total_dev != fs_info->fs_devices->total_devices) { +- btrfs_err(fs_info, +- "super_num_devices %llu mismatch with num_devices %llu found here", ++ btrfs_warn(fs_info, ++"super block num_devices %llu mismatch with DEV_ITEM count %llu, will be repaired on next transaction commit", + btrfs_super_num_devices(fs_info->super_copy), + total_dev); +- ret = -EINVAL; +- goto error; ++ fs_info->fs_devices->total_devices = total_dev; ++ btrfs_set_super_num_devices(fs_info->super_copy, total_dev); + } + if (btrfs_super_total_bytes(fs_info->super_copy) < + fs_info->fs_devices->total_rw_bytes) { +diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c +index a718dc77e604e..97cd4df040608 100644 +--- a/fs/cifs/smb2inode.c ++++ b/fs/cifs/smb2inode.c +@@ -371,8 +371,6 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, + num_rqst++; + + if (cfile) { +- cifsFileInfo_put(cfile); +- cfile = NULL; + rc = compound_send_recv(xid, ses, server, + flags, num_rqst - 2, + &rqst[1], &resp_buftype[1], +diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c +index c758ff41b6386..7fea94ebda573 100644 +--- a/fs/cifs/smb2ops.c ++++ b/fs/cifs/smb2ops.c +@@ -3632,7 +3632,7 @@ static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon, + if (rc) + goto out; + +- if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) == 0) ++ if (cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) + smb2_set_sparse(xid, tcon, cfile, inode, false); + + eof = cpu_to_le64(off + len); +diff --git a/fs/dax.c b/fs/dax.c +index d5d7b9393bcaa..3e7e9a57fd28c 100644 +--- a/fs/dax.c ++++ b/fs/dax.c +@@ -846,7 +846,8 @@ static void dax_entry_mkclean(struct address_space *mapping, pgoff_t index, + if (!pmd_dirty(*pmdp) && !pmd_write(*pmdp)) + goto unlock_pmd; + +- flush_cache_page(vma, address, pfn); ++ flush_cache_range(vma, address, ++ address + HPAGE_PMD_SIZE); + pmd = pmdp_invalidate(vma, address, pmdp); + pmd = pmd_wrprotect(pmd); + pmd = pmd_mkclean(pmd); +diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c +index 1e9d8999b9390..2ce96a9ce63c0 100644 +--- a/fs/dlm/lock.c ++++ b/fs/dlm/lock.c +@@ -1551,6 +1551,7 @@ static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype, + lkb->lkb_wait_type = 0; + lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; + lkb->lkb_wait_count--; ++ unhold_lkb(lkb); + goto out_del; + } + +@@ -1577,6 +1578,7 @@ static int _remove_from_waiters(struct dlm_lkb *lkb, int mstype, + log_error(ls, "remwait error %x reply %d wait_type %d overlap", + lkb->lkb_id, mstype, lkb->lkb_wait_type); + lkb->lkb_wait_count--; ++ unhold_lkb(lkb); + lkb->lkb_wait_type = 0; + } + +@@ -5312,11 +5314,16 @@ int dlm_recover_waiters_post(struct dlm_ls *ls) + lkb->lkb_flags &= ~DLM_IFL_OVERLAP_UNLOCK; + lkb->lkb_flags &= ~DLM_IFL_OVERLAP_CANCEL; + lkb->lkb_wait_type = 0; +- lkb->lkb_wait_count = 0; ++ /* drop all wait_count references we still ++ * hold a reference for this iteration. ++ */ ++ while (lkb->lkb_wait_count) { ++ lkb->lkb_wait_count--; ++ unhold_lkb(lkb); ++ } + mutex_lock(&ls->ls_waiters_mutex); + list_del_init(&lkb->lkb_wait_reply); + mutex_unlock(&ls->ls_waiters_mutex); +- unhold_lkb(lkb); /* for waiters list */ + + if (oc || ou) { + /* do an unlock or cancel instead of resending */ +diff --git a/fs/dlm/plock.c b/fs/dlm/plock.c +index c38b2b8ffd1d3..a10d2bcfe75a8 100644 +--- a/fs/dlm/plock.c ++++ b/fs/dlm/plock.c +@@ -23,11 +23,11 @@ struct plock_op { + struct list_head list; + int done; + struct dlm_plock_info info; ++ int (*callback)(struct file_lock *fl, int result); + }; + + struct plock_xop { + struct plock_op xop; +- int (*callback)(struct file_lock *fl, int result); + void *fl; + void *file; + struct file_lock flc; +@@ -129,19 +129,18 @@ int dlm_posix_lock(dlm_lockspace_t *lockspace, u64 number, struct file *file, + /* fl_owner is lockd which doesn't distinguish + processes on the nfs client */ + op->info.owner = (__u64) fl->fl_pid; +- xop->callback = fl->fl_lmops->lm_grant; ++ op->callback = fl->fl_lmops->lm_grant; + locks_init_lock(&xop->flc); + locks_copy_lock(&xop->flc, fl); + xop->fl = fl; + xop->file = file; + } else { + op->info.owner = (__u64)(long) fl->fl_owner; +- xop->callback = NULL; + } + + send_op(op); + +- if (xop->callback == NULL) { ++ if (!op->callback) { + rv = wait_event_interruptible(recv_wq, (op->done != 0)); + if (rv == -ERESTARTSYS) { + log_debug(ls, "dlm_posix_lock: wait killed %llx", +@@ -203,7 +202,7 @@ static int dlm_plock_callback(struct plock_op *op) + file = xop->file; + flc = &xop->flc; + fl = xop->fl; +- notify = xop->callback; ++ notify = op->callback; + + if (op->info.rv) { + notify(fl, op->info.rv); +@@ -436,10 +435,9 @@ static ssize_t dev_write(struct file *file, const char __user *u, size_t count, + if (op->info.fsid == info.fsid && + op->info.number == info.number && + op->info.owner == info.owner) { +- struct plock_xop *xop = (struct plock_xop *)op; + list_del_init(&op->list); + memcpy(&op->info, &info, sizeof(info)); +- if (xop->callback) ++ if (op->callback) + do_callback = 1; + else + op->done = 1; +diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h +index 8329961546b58..4ad1c3ce9398a 100644 +--- a/fs/ext4/ext4.h ++++ b/fs/ext4/ext4.h +@@ -1419,12 +1419,6 @@ struct ext4_super_block { + + #ifdef __KERNEL__ + +-#ifdef CONFIG_FS_ENCRYPTION +-#define DUMMY_ENCRYPTION_ENABLED(sbi) ((sbi)->s_dummy_enc_policy.policy != NULL) +-#else +-#define DUMMY_ENCRYPTION_ENABLED(sbi) (0) +-#endif +- + /* Number of quota types we support */ + #define EXT4_MAXQUOTAS 3 + +diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c +index 80b876ab6b1fe..6641b74ad4620 100644 +--- a/fs/ext4/extents.c ++++ b/fs/ext4/extents.c +@@ -371,7 +371,7 @@ static int ext4_valid_extent_entries(struct inode *inode, + { + unsigned short entries; + ext4_lblk_t lblock = 0; +- ext4_lblk_t prev = 0; ++ ext4_lblk_t cur = 0; + + if (eh->eh_entries == 0) + return 1; +@@ -395,11 +395,11 @@ static int ext4_valid_extent_entries(struct inode *inode, + + /* Check for overlapping extents */ + lblock = le32_to_cpu(ext->ee_block); +- if ((lblock <= prev) && prev) { ++ if (lblock < cur) { + *pblk = ext4_ext_pblock(ext); + return 0; + } +- prev = lblock + ext4_ext_get_actual_len(ext) - 1; ++ cur = lblock + ext4_ext_get_actual_len(ext); + ext++; + entries--; + } +@@ -419,13 +419,13 @@ static int ext4_valid_extent_entries(struct inode *inode, + + /* Check for overlapping index extents */ + lblock = le32_to_cpu(ext_idx->ei_block); +- if ((lblock <= prev) && prev) { ++ if (lblock < cur) { + *pblk = ext4_idx_pblock(ext_idx); + return 0; + } + ext_idx++; + entries--; +- prev = lblock; ++ cur = lblock + 1; + } + } + return 1; +diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c +index c9a8c7d24f89c..fbad4180514c9 100644 +--- a/fs/ext4/inline.c ++++ b/fs/ext4/inline.c +@@ -1974,6 +1974,18 @@ int ext4_convert_inline_data(struct inode *inode) + if (!ext4_has_inline_data(inode)) { + ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); + return 0; ++ } else if (!ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { ++ /* ++ * Inode has inline data but EXT4_STATE_MAY_INLINE_DATA is ++ * cleared. This means we are in the middle of moving of ++ * inline data to delay allocated block. Just force writeout ++ * here to finish conversion. ++ */ ++ error = filemap_flush(inode->i_mapping); ++ if (error) ++ return error; ++ if (!ext4_has_inline_data(inode)) ++ return 0; + } + + needed_blocks = ext4_writepage_trans_blocks(inode); +diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c +index 31ab73c4b07e7..72e3f55f1e07a 100644 +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -5444,6 +5444,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) + if (attr->ia_valid & ATTR_SIZE) { + handle_t *handle; + loff_t oldsize = inode->i_size; ++ loff_t old_disksize; + int shrink = (attr->ia_size < inode->i_size); + + if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { +@@ -5517,6 +5518,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) + inode->i_sb->s_blocksize_bits); + + down_write(&EXT4_I(inode)->i_data_sem); ++ old_disksize = EXT4_I(inode)->i_disksize; + EXT4_I(inode)->i_disksize = attr->ia_size; + rc = ext4_mark_inode_dirty(handle, inode); + if (!error) +@@ -5528,6 +5530,8 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) + */ + if (!error) + i_size_write(inode, attr->ia_size); ++ else ++ EXT4_I(inode)->i_disksize = old_disksize; + up_write(&EXT4_I(inode)->i_data_sem); + ext4_journal_stop(handle); + if (error) +diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c +index 47ea35e98ffe9..feae39f1db37c 100644 +--- a/fs/ext4/namei.c ++++ b/fs/ext4/namei.c +@@ -280,9 +280,9 @@ static struct dx_frame *dx_probe(struct ext4_filename *fname, + struct dx_hash_info *hinfo, + struct dx_frame *frame); + static void dx_release(struct dx_frame *frames); +-static int dx_make_map(struct inode *dir, struct ext4_dir_entry_2 *de, +- unsigned blocksize, struct dx_hash_info *hinfo, +- struct dx_map_entry map[]); ++static int dx_make_map(struct inode *dir, struct buffer_head *bh, ++ struct dx_hash_info *hinfo, ++ struct dx_map_entry *map_tail); + static void dx_sort_map(struct dx_map_entry *map, unsigned count); + static struct ext4_dir_entry_2 *dx_move_dirents(char *from, char *to, + struct dx_map_entry *offsets, int count, unsigned blocksize); +@@ -756,12 +756,14 @@ static struct dx_frame * + dx_probe(struct ext4_filename *fname, struct inode *dir, + struct dx_hash_info *hinfo, struct dx_frame *frame_in) + { +- unsigned count, indirect; ++ unsigned count, indirect, level, i; + struct dx_entry *at, *entries, *p, *q, *m; + struct dx_root *root; + struct dx_frame *frame = frame_in; + struct dx_frame *ret_err = ERR_PTR(ERR_BAD_DX_DIR); + u32 hash; ++ ext4_lblk_t block; ++ ext4_lblk_t blocks[EXT4_HTREE_LEVEL]; + + memset(frame_in, 0, EXT4_HTREE_LEVEL * sizeof(frame_in[0])); + frame->bh = ext4_read_dirblock(dir, 0, INDEX); +@@ -817,6 +819,8 @@ dx_probe(struct ext4_filename *fname, struct inode *dir, + } + + dxtrace(printk("Look up %x", hash)); ++ level = 0; ++ blocks[0] = 0; + while (1) { + count = dx_get_count(entries); + if (!count || count > dx_get_limit(entries)) { +@@ -858,15 +862,27 @@ dx_probe(struct ext4_filename *fname, struct inode *dir, + dx_get_block(at))); + frame->entries = entries; + frame->at = at; +- if (!indirect--) ++ ++ block = dx_get_block(at); ++ for (i = 0; i <= level; i++) { ++ if (blocks[i] == block) { ++ ext4_warning_inode(dir, ++ "dx entry: tree cycle block %u points back to block %u", ++ blocks[level], block); ++ goto fail; ++ } ++ } ++ if (++level > indirect) + return frame; ++ blocks[level] = block; + frame++; +- frame->bh = ext4_read_dirblock(dir, dx_get_block(at), INDEX); ++ frame->bh = ext4_read_dirblock(dir, block, INDEX); + if (IS_ERR(frame->bh)) { + ret_err = (struct dx_frame *) frame->bh; + frame->bh = NULL; + goto fail; + } ++ + entries = ((struct dx_node *) frame->bh->b_data)->entries; + + if (dx_get_limit(entries) != dx_node_limit(dir)) { +@@ -1208,15 +1224,23 @@ static inline int search_dirblock(struct buffer_head *bh, + * Create map of hash values, offsets, and sizes, stored at end of block. + * Returns number of entries mapped. + */ +-static int dx_make_map(struct inode *dir, struct ext4_dir_entry_2 *de, +- unsigned blocksize, struct dx_hash_info *hinfo, ++static int dx_make_map(struct inode *dir, struct buffer_head *bh, ++ struct dx_hash_info *hinfo, + struct dx_map_entry *map_tail) + { + int count = 0; +- char *base = (char *) de; ++ struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *)bh->b_data; ++ unsigned int buflen = bh->b_size; ++ char *base = bh->b_data; + struct dx_hash_info h = *hinfo; + +- while ((char *) de < base + blocksize) { ++ if (ext4_has_metadata_csum(dir->i_sb)) ++ buflen -= sizeof(struct ext4_dir_entry_tail); ++ ++ while ((char *) de < base + buflen) { ++ if (ext4_check_dir_entry(dir, NULL, de, bh, base, buflen, ++ ((char *)de) - base)) ++ return -EFSCORRUPTED; + if (de->name_len && de->inode) { + ext4fs_dirhash(dir, de->name, de->name_len, &h); + map_tail--; +@@ -1226,8 +1250,7 @@ static int dx_make_map(struct inode *dir, struct ext4_dir_entry_2 *de, + count++; + cond_resched(); + } +- /* XXX: do we need to check rec_len == 0 case? -Chris */ +- de = ext4_next_entry(de, blocksize); ++ de = ext4_next_entry(de, dir->i_sb->s_blocksize); + } + return count; + } +@@ -1853,8 +1876,11 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, + + /* create map in the end of data2 block */ + map = (struct dx_map_entry *) (data2 + blocksize); +- count = dx_make_map(dir, (struct ext4_dir_entry_2 *) data1, +- blocksize, hinfo, map); ++ count = dx_make_map(dir, *bh, hinfo, map); ++ if (count < 0) { ++ err = count; ++ goto journal_error; ++ } + map -= count; + dx_sort_map(map, count); + /* Ensure that neither split block is over half full */ +@@ -3500,6 +3526,9 @@ static struct buffer_head *ext4_get_first_dir_block(handle_t *handle, + struct buffer_head *bh; + + if (!ext4_has_inline_data(inode)) { ++ struct ext4_dir_entry_2 *de; ++ unsigned int offset; ++ + /* The first directory block must not be a hole, so + * treat it as DIRENT_HTREE + */ +@@ -3508,9 +3537,30 @@ static struct buffer_head *ext4_get_first_dir_block(handle_t *handle, + *retval = PTR_ERR(bh); + return NULL; + } +- *parent_de = ext4_next_entry( +- (struct ext4_dir_entry_2 *)bh->b_data, +- inode->i_sb->s_blocksize); ++ ++ de = (struct ext4_dir_entry_2 *) bh->b_data; ++ if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, ++ bh->b_size, 0) || ++ le32_to_cpu(de->inode) != inode->i_ino || ++ strcmp(".", de->name)) { ++ EXT4_ERROR_INODE(inode, "directory missing '.'"); ++ brelse(bh); ++ *retval = -EFSCORRUPTED; ++ return NULL; ++ } ++ offset = ext4_rec_len_from_disk(de->rec_len, ++ inode->i_sb->s_blocksize); ++ de = ext4_next_entry(de, inode->i_sb->s_blocksize); ++ if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, ++ bh->b_size, offset) || ++ le32_to_cpu(de->inode) == 0 || strcmp("..", de->name)) { ++ EXT4_ERROR_INODE(inode, "directory missing '..'"); ++ brelse(bh); ++ *retval = -EFSCORRUPTED; ++ return NULL; ++ } ++ *parent_de = de; ++ + return bh; + } + +diff --git a/fs/ext4/super.c b/fs/ext4/super.c +index 3e26edeca8c73..a0af833f7da70 100644 +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -1960,6 +1960,7 @@ static const struct mount_opts { + MOPT_EXT4_ONLY | MOPT_CLEAR}, + {Opt_warn_on_error, EXT4_MOUNT_WARN_ON_ERROR, MOPT_SET}, + {Opt_nowarn_on_error, EXT4_MOUNT_WARN_ON_ERROR, MOPT_CLEAR}, ++ {Opt_commit, 0, MOPT_NO_EXT2}, + {Opt_nojournal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, + MOPT_EXT4_ONLY | MOPT_CLEAR}, + {Opt_journal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, +@@ -2083,6 +2084,12 @@ static int ext4_set_test_dummy_encryption(struct super_block *sb, + struct ext4_sb_info *sbi = EXT4_SB(sb); + int err; + ++ if (!ext4_has_feature_encrypt(sb)) { ++ ext4_msg(sb, KERN_WARNING, ++ "test_dummy_encryption requires encrypt feature"); ++ return -1; ++ } ++ + /* + * This mount option is just for testing, and it's not worthwhile to + * implement the extra complexity (e.g. RCU protection) that would be +@@ -2110,11 +2117,13 @@ static int ext4_set_test_dummy_encryption(struct super_block *sb, + return -1; + } + ext4_msg(sb, KERN_WARNING, "Test dummy encryption mode enabled"); ++ return 1; + #else + ext4_msg(sb, KERN_WARNING, +- "Test dummy encryption mount option ignored"); ++ "test_dummy_encryption option not supported"); ++ return -1; ++ + #endif +- return 1; + } + + static int handle_mount_opt(struct super_block *sb, char *opt, int token, +@@ -4537,7 +4546,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) + sbi->s_inodes_per_block; + sbi->s_desc_per_block = blocksize / EXT4_DESC_SIZE(sb); + sbi->s_sbh = bh; +- sbi->s_mount_state = le16_to_cpu(es->s_state); ++ sbi->s_mount_state = le16_to_cpu(es->s_state) & ~EXT4_FC_REPLAY; + sbi->s_addr_per_block_bits = ilog2(EXT4_ADDR_PER_BLOCK(sb)); + sbi->s_desc_per_block_bits = ilog2(EXT4_DESC_PER_BLOCK(sb)); + +@@ -4928,12 +4937,6 @@ no_journal: + goto failed_mount_wq; + } + +- if (DUMMY_ENCRYPTION_ENABLED(sbi) && !sb_rdonly(sb) && +- !ext4_has_feature_encrypt(sb)) { +- ext4_set_feature_encrypt(sb); +- ext4_commit_super(sb, 1); +- } +- + /* + * Get the # of file system overhead blocks from the + * superblock if present. +@@ -5997,7 +6000,8 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) + if (err) + goto restore_opts; + } +- sbi->s_mount_state = le16_to_cpu(es->s_state); ++ sbi->s_mount_state = (le16_to_cpu(es->s_state) & ++ ~EXT4_FC_REPLAY); + + err = ext4_setup_super(sb, es, 0); + if (err) +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index 6c4bf22a3e83e..1066725c3c5d5 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -1021,8 +1021,8 @@ enum count_type { + */ + #define PAGE_TYPE_OF_BIO(type) ((type) > META ? META : (type)) + enum page_type { +- DATA, +- NODE, ++ DATA = 0, ++ NODE = 1, /* should not change this */ + META, + NR_PAGE_TYPE, + META_FLUSH, +@@ -2284,11 +2284,17 @@ static inline void dec_valid_node_count(struct f2fs_sb_info *sbi, + { + spin_lock(&sbi->stat_lock); + +- f2fs_bug_on(sbi, !sbi->total_valid_block_count); +- f2fs_bug_on(sbi, !sbi->total_valid_node_count); ++ if (unlikely(!sbi->total_valid_block_count || ++ !sbi->total_valid_node_count)) { ++ f2fs_warn(sbi, "dec_valid_node_count: inconsistent block counts, total_valid_block:%u, total_valid_node:%u", ++ sbi->total_valid_block_count, ++ sbi->total_valid_node_count); ++ set_sbi_flag(sbi, SBI_NEED_FSCK); ++ } else { ++ sbi->total_valid_block_count--; ++ sbi->total_valid_node_count--; ++ } + +- sbi->total_valid_node_count--; +- sbi->total_valid_block_count--; + if (sbi->reserved_blocks && + sbi->current_reserved_blocks < sbi->reserved_blocks) + sbi->current_reserved_blocks++; +@@ -3729,6 +3735,7 @@ extern struct kmem_cache *f2fs_inode_entry_slab; + * inline.c + */ + bool f2fs_may_inline_data(struct inode *inode); ++bool f2fs_sanity_check_inline_data(struct inode *inode); + bool f2fs_may_inline_dentry(struct inode *inode); + void f2fs_do_read_inline_data(struct page *page, struct page *ipage); + void f2fs_truncate_inline_inode(struct inode *inode, +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 792f9059d897c..defa068b4c7cd 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -1413,11 +1413,19 @@ static int f2fs_do_zero_range(struct dnode_of_data *dn, pgoff_t start, + ret = -ENOSPC; + break; + } +- if (dn->data_blkaddr != NEW_ADDR) { +- f2fs_invalidate_blocks(sbi, dn->data_blkaddr); +- dn->data_blkaddr = NEW_ADDR; +- f2fs_set_data_blkaddr(dn); ++ ++ if (dn->data_blkaddr == NEW_ADDR) ++ continue; ++ ++ if (!f2fs_is_valid_blkaddr(sbi, dn->data_blkaddr, ++ DATA_GENERIC_ENHANCE)) { ++ ret = -EFSCORRUPTED; ++ break; + } ++ ++ f2fs_invalidate_blocks(sbi, dn->data_blkaddr); ++ dn->data_blkaddr = NEW_ADDR; ++ f2fs_set_data_blkaddr(dn); + } + + f2fs_update_extent_cache_range(dn, start, 0, index - start); +@@ -1736,6 +1744,10 @@ static long f2fs_fallocate(struct file *file, int mode, + + inode_lock(inode); + ++ ret = file_modified(file); ++ if (ret) ++ goto out; ++ + if (mode & FALLOC_FL_PUNCH_HOLE) { + if (offset >= inode->i_size) + goto out; +diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c +index 1d7dafdaffe30..f97c23ec93ce5 100644 +--- a/fs/f2fs/inline.c ++++ b/fs/f2fs/inline.c +@@ -14,21 +14,40 @@ + #include "node.h" + #include <trace/events/f2fs.h> + +-bool f2fs_may_inline_data(struct inode *inode) ++static bool support_inline_data(struct inode *inode) + { + if (f2fs_is_atomic_file(inode)) + return false; +- + if (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode)) + return false; +- + if (i_size_read(inode) > MAX_INLINE_DATA(inode)) + return false; ++ return true; ++} + +- if (f2fs_post_read_required(inode)) ++bool f2fs_may_inline_data(struct inode *inode) ++{ ++ if (!support_inline_data(inode)) + return false; + +- return true; ++ return !f2fs_post_read_required(inode); ++} ++ ++bool f2fs_sanity_check_inline_data(struct inode *inode) ++{ ++ if (!f2fs_has_inline_data(inode)) ++ return false; ++ ++ if (!support_inline_data(inode)) ++ return true; ++ ++ /* ++ * used by sanity_check_inode(), when disk layout fields has not ++ * been synchronized to inmem fields. ++ */ ++ return (S_ISREG(inode->i_mode) && ++ (file_is_encrypt(inode) || file_is_verity(inode) || ++ (F2FS_I(inode)->i_flags & F2FS_COMPR_FL))); + } + + bool f2fs_may_inline_dentry(struct inode *inode) +diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c +index 98483f50e5e92..87752550f78c8 100644 +--- a/fs/f2fs/inode.c ++++ b/fs/f2fs/inode.c +@@ -272,8 +272,7 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page) + } + } + +- if (f2fs_has_inline_data(inode) && +- (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode))) { ++ if (f2fs_sanity_check_inline_data(inode)) { + set_sbi_flag(sbi, SBI_NEED_FSCK); + f2fs_warn(sbi, "%s: inode (ino=%lx, mode=%u) should not have inline_data, run fsck to fix", + __func__, inode->i_ino, inode->i_mode); +@@ -757,8 +756,22 @@ retry: + f2fs_lock_op(sbi); + err = f2fs_remove_inode_page(inode); + f2fs_unlock_op(sbi); +- if (err == -ENOENT) ++ if (err == -ENOENT) { + err = 0; ++ ++ /* ++ * in fuzzed image, another node may has the same ++ * block address as inode's, if it was truncated ++ * previously, truncation of inode node will fail. ++ */ ++ if (is_inode_flag_set(inode, FI_DIRTY_INODE)) { ++ f2fs_warn(F2FS_I_SB(inode), ++ "f2fs_evict_inode: inconsistent node id, ino:%lu", ++ inode->i_ino); ++ f2fs_inode_synced(inode); ++ set_sbi_flag(sbi, SBI_NEED_FSCK); ++ } ++ } + } + + /* give more chances, if ENOMEM case */ +diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c +index 49f5cb532738d..20091f4cf84de 100644 +--- a/fs/f2fs/segment.c ++++ b/fs/f2fs/segment.c +@@ -356,16 +356,19 @@ void f2fs_drop_inmem_page(struct inode *inode, struct page *page) + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); + struct list_head *head = &fi->inmem_pages; + struct inmem_pages *cur = NULL; ++ struct inmem_pages *tmp; + + f2fs_bug_on(sbi, !IS_ATOMIC_WRITTEN_PAGE(page)); + + mutex_lock(&fi->inmem_lock); +- list_for_each_entry(cur, head, list) { +- if (cur->page == page) ++ list_for_each_entry(tmp, head, list) { ++ if (tmp->page == page) { ++ cur = tmp; + break; ++ } + } + +- f2fs_bug_on(sbi, list_empty(head) || cur->page != page); ++ f2fs_bug_on(sbi, !cur); + list_del(&cur->list); + mutex_unlock(&fi->inmem_lock); + +@@ -4420,7 +4423,7 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) + unsigned int i, start, end; + unsigned int readed, start_blk = 0; + int err = 0; +- block_t total_node_blocks = 0; ++ block_t sit_valid_blocks[2] = {0, 0}; + + do { + readed = f2fs_ra_meta_pages(sbi, start_blk, BIO_MAX_PAGES, +@@ -4445,8 +4448,8 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) + if (err) + return err; + seg_info_from_raw_sit(se, &sit); +- if (IS_NODESEG(se->type)) +- total_node_blocks += se->valid_blocks; ++ ++ sit_valid_blocks[SE_PAGETYPE(se)] += se->valid_blocks; + + /* build discard map only one time */ + if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { +@@ -4484,15 +4487,15 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) + sit = sit_in_journal(journal, i); + + old_valid_blocks = se->valid_blocks; +- if (IS_NODESEG(se->type)) +- total_node_blocks -= old_valid_blocks; ++ ++ sit_valid_blocks[SE_PAGETYPE(se)] -= old_valid_blocks; + + err = check_block_count(sbi, start, &sit); + if (err) + break; + seg_info_from_raw_sit(se, &sit); +- if (IS_NODESEG(se->type)) +- total_node_blocks += se->valid_blocks; ++ ++ sit_valid_blocks[SE_PAGETYPE(se)] += se->valid_blocks; + + if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) { + memset(se->discard_map, 0xff, SIT_VBLOCK_MAP_SIZE); +@@ -4512,13 +4515,24 @@ static int build_sit_entries(struct f2fs_sb_info *sbi) + } + up_read(&curseg->journal_rwsem); + +- if (!err && total_node_blocks != valid_node_count(sbi)) { ++ if (err) ++ return err; ++ ++ if (sit_valid_blocks[NODE] != valid_node_count(sbi)) { + f2fs_err(sbi, "SIT is corrupted node# %u vs %u", +- total_node_blocks, valid_node_count(sbi)); +- err = -EFSCORRUPTED; ++ sit_valid_blocks[NODE], valid_node_count(sbi)); ++ return -EFSCORRUPTED; + } + +- return err; ++ if (sit_valid_blocks[DATA] + sit_valid_blocks[NODE] > ++ valid_user_blocks(sbi)) { ++ f2fs_err(sbi, "SIT is corrupted data# %u %u vs %u", ++ sit_valid_blocks[DATA], sit_valid_blocks[NODE], ++ valid_user_blocks(sbi)); ++ return -EFSCORRUPTED; ++ } ++ ++ return 0; + } + + static void init_free_segmap(struct f2fs_sb_info *sbi) +diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h +index beef833a69604..eafd89f0c77e8 100644 +--- a/fs/f2fs/segment.h ++++ b/fs/f2fs/segment.h +@@ -24,6 +24,7 @@ + + #define IS_DATASEG(t) ((t) <= CURSEG_COLD_DATA) + #define IS_NODESEG(t) ((t) >= CURSEG_HOT_NODE && (t) <= CURSEG_COLD_NODE) ++#define SE_PAGETYPE(se) ((IS_NODESEG((se)->type) ? NODE : DATA)) + + static inline void sanity_check_seg_type(struct f2fs_sb_info *sbi, + unsigned short seg_type) +@@ -573,11 +574,10 @@ static inline int reserved_sections(struct f2fs_sb_info *sbi) + return GET_SEC_FROM_SEG(sbi, reserved_segments(sbi)); + } + +-static inline bool has_curseg_enough_space(struct f2fs_sb_info *sbi) ++static inline bool has_curseg_enough_space(struct f2fs_sb_info *sbi, ++ unsigned int node_blocks, unsigned int dent_blocks) + { +- unsigned int node_blocks = get_pages(sbi, F2FS_DIRTY_NODES) + +- get_pages(sbi, F2FS_DIRTY_DENTS); +- unsigned int dent_blocks = get_pages(sbi, F2FS_DIRTY_DENTS); ++ + unsigned int segno, left_blocks; + int i; + +@@ -603,19 +603,28 @@ static inline bool has_curseg_enough_space(struct f2fs_sb_info *sbi) + static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi, + int freed, int needed) + { +- int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES); +- int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS); +- int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA); ++ unsigned int total_node_blocks = get_pages(sbi, F2FS_DIRTY_NODES) + ++ get_pages(sbi, F2FS_DIRTY_DENTS) + ++ get_pages(sbi, F2FS_DIRTY_IMETA); ++ unsigned int total_dent_blocks = get_pages(sbi, F2FS_DIRTY_DENTS); ++ unsigned int node_secs = total_node_blocks / BLKS_PER_SEC(sbi); ++ unsigned int dent_secs = total_dent_blocks / BLKS_PER_SEC(sbi); ++ unsigned int node_blocks = total_node_blocks % BLKS_PER_SEC(sbi); ++ unsigned int dent_blocks = total_dent_blocks % BLKS_PER_SEC(sbi); ++ unsigned int free, need_lower, need_upper; + + if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) + return false; + +- if (free_sections(sbi) + freed == reserved_sections(sbi) + needed && +- has_curseg_enough_space(sbi)) ++ free = free_sections(sbi) + freed; ++ need_lower = node_secs + dent_secs + reserved_sections(sbi) + needed; ++ need_upper = need_lower + (node_blocks ? 1 : 0) + (dent_blocks ? 1 : 0); ++ ++ if (free > need_upper) + return false; +- return (free_sections(sbi) + freed) <= +- (node_secs + 2 * dent_secs + imeta_secs + +- reserved_sections(sbi) + needed); ++ else if (free <= need_lower) ++ return true; ++ return !has_curseg_enough_space(sbi, node_blocks, dent_blocks); + } + + static inline bool f2fs_is_checkpoint_ready(struct f2fs_sb_info *sbi) +diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c +index 78ee14f6e939e..ccfb6c5a8fbc0 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -2292,7 +2292,8 @@ int f2fs_quota_sync(struct super_block *sb, int type) + if (!sb_has_quota_active(sb, cnt)) + continue; + +- inode_lock(dqopt->files[cnt]); ++ if (!f2fs_sb_has_quota_ino(sbi)) ++ inode_lock(dqopt->files[cnt]); + + /* + * do_quotactl +@@ -2311,7 +2312,8 @@ int f2fs_quota_sync(struct super_block *sb, int type) + up_read(&sbi->quota_sem); + f2fs_unlock_op(sbi); + +- inode_unlock(dqopt->files[cnt]); ++ if (!f2fs_sb_has_quota_ino(sbi)) ++ inode_unlock(dqopt->files[cnt]); + + if (ret) + break; +diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c +index f7e3304b78029..353735032947c 100644 +--- a/fs/fat/fatent.c ++++ b/fs/fat/fatent.c +@@ -93,7 +93,8 @@ static int fat12_ent_bread(struct super_block *sb, struct fat_entry *fatent, + err_brelse: + brelse(bhs[0]); + err: +- fat_msg(sb, KERN_ERR, "FAT read failed (blocknr %llu)", (llu)blocknr); ++ fat_msg_ratelimit(sb, KERN_ERR, "FAT read failed (blocknr %llu)", ++ (llu)blocknr); + return -EIO; + } + +@@ -106,8 +107,8 @@ static int fat_ent_bread(struct super_block *sb, struct fat_entry *fatent, + fatent->fat_inode = MSDOS_SB(sb)->fat_inode; + fatent->bhs[0] = sb_bread(sb, blocknr); + if (!fatent->bhs[0]) { +- fat_msg(sb, KERN_ERR, "FAT read failed (blocknr %llu)", +- (llu)blocknr); ++ fat_msg_ratelimit(sb, KERN_ERR, "FAT read failed (blocknr %llu)", ++ (llu)blocknr); + return -EIO; + } + fatent->nr_bhs = 1; +diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c +index a0869194ab739..46c15dd2405c6 100644 +--- a/fs/fs-writeback.c ++++ b/fs/fs-writeback.c +@@ -1650,11 +1650,12 @@ static long writeback_sb_inodes(struct super_block *sb, + }; + unsigned long start_time = jiffies; + long write_chunk; +- long wrote = 0; /* count both pages and inodes */ ++ long total_wrote = 0; /* count both pages and inodes */ + + while (!list_empty(&wb->b_io)) { + struct inode *inode = wb_inode(wb->b_io.prev); + struct bdi_writeback *tmp_wb; ++ long wrote; + + if (inode->i_sb != sb) { + if (work->sb) { +@@ -1730,7 +1731,9 @@ static long writeback_sb_inodes(struct super_block *sb, + + wbc_detach_inode(&wbc); + work->nr_pages -= write_chunk - wbc.nr_to_write; +- wrote += write_chunk - wbc.nr_to_write; ++ wrote = write_chunk - wbc.nr_to_write - wbc.pages_skipped; ++ wrote = wrote < 0 ? 0 : wrote; ++ total_wrote += wrote; + + if (need_resched()) { + /* +@@ -1752,7 +1755,7 @@ static long writeback_sb_inodes(struct super_block *sb, + tmp_wb = inode_to_wb_and_lock_list(inode); + spin_lock(&inode->i_lock); + if (!(inode->i_state & I_DIRTY_ALL)) +- wrote++; ++ total_wrote++; + requeue_inode(inode, tmp_wb, &wbc); + inode_sync_complete(inode); + spin_unlock(&inode->i_lock); +@@ -1766,14 +1769,14 @@ static long writeback_sb_inodes(struct super_block *sb, + * bail out to wb_writeback() often enough to check + * background threshold and other termination conditions. + */ +- if (wrote) { ++ if (total_wrote) { + if (time_is_before_jiffies(start_time + HZ / 10UL)) + break; + if (work->nr_pages <= 0) + break; + } + } +- return wrote; ++ return total_wrote; + } + + static long __writeback_inodes_wb(struct bdi_writeback *wb, +diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c +index 6e173ae378c44..ad953ecb58532 100644 +--- a/fs/gfs2/quota.c ++++ b/fs/gfs2/quota.c +@@ -531,34 +531,42 @@ static void qdsb_put(struct gfs2_quota_data *qd) + */ + int gfs2_qa_get(struct gfs2_inode *ip) + { +- int error = 0; + struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); ++ struct inode *inode = &ip->i_inode; + + if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF) + return 0; + +- down_write(&ip->i_rw_mutex); ++ spin_lock(&inode->i_lock); + if (ip->i_qadata == NULL) { +- ip->i_qadata = kmem_cache_zalloc(gfs2_qadata_cachep, GFP_NOFS); +- if (!ip->i_qadata) { +- error = -ENOMEM; +- goto out; +- } ++ struct gfs2_qadata *tmp; ++ ++ spin_unlock(&inode->i_lock); ++ tmp = kmem_cache_zalloc(gfs2_qadata_cachep, GFP_NOFS); ++ if (!tmp) ++ return -ENOMEM; ++ ++ spin_lock(&inode->i_lock); ++ if (ip->i_qadata == NULL) ++ ip->i_qadata = tmp; ++ else ++ kmem_cache_free(gfs2_qadata_cachep, tmp); + } + ip->i_qadata->qa_ref++; +-out: +- up_write(&ip->i_rw_mutex); +- return error; ++ spin_unlock(&inode->i_lock); ++ return 0; + } + + void gfs2_qa_put(struct gfs2_inode *ip) + { +- down_write(&ip->i_rw_mutex); ++ struct inode *inode = &ip->i_inode; ++ ++ spin_lock(&inode->i_lock); + if (ip->i_qadata && --ip->i_qadata->qa_ref == 0) { + kmem_cache_free(gfs2_qadata_cachep, ip->i_qadata); + ip->i_qadata = NULL; + } +- up_write(&ip->i_rw_mutex); ++ spin_unlock(&inode->i_lock); + } + + int gfs2_quota_hold(struct gfs2_inode *ip, kuid_t uid, kgid_t gid) +diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c +index cd9f7baa5bb7b..dd33b31b0a826 100644 +--- a/fs/iomap/buffered-io.c ++++ b/fs/iomap/buffered-io.c +@@ -528,7 +528,8 @@ iomap_write_failed(struct inode *inode, loff_t pos, unsigned len) + * write started inside the existing inode size. + */ + if (pos + len > i_size) +- truncate_pagecache_range(inode, max(pos, i_size), pos + len); ++ truncate_pagecache_range(inode, max(pos, i_size), ++ pos + len - 1); + } + + static int +diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c +index e58ae29a223d7..0ce17ea8fa8a1 100644 +--- a/fs/jfs/jfs_dmap.c ++++ b/fs/jfs/jfs_dmap.c +@@ -385,7 +385,8 @@ int dbFree(struct inode *ip, s64 blkno, s64 nblocks) + } + + /* write the last buffer. */ +- write_metapage(mp); ++ if (mp) ++ write_metapage(mp); + + IREAD_UNLOCK(ipbmap); + +diff --git a/fs/nfs/file.c b/fs/nfs/file.c +index 7b47f9b063f1f..ad856b7b9a46c 100644 +--- a/fs/nfs/file.c ++++ b/fs/nfs/file.c +@@ -208,15 +208,16 @@ static int + nfs_file_fsync_commit(struct file *file, int datasync) + { + struct inode *inode = file_inode(file); +- int ret; ++ int ret, ret2; + + dprintk("NFS: fsync file(%pD2) datasync %d\n", file, datasync); + + nfs_inc_stats(inode, NFSIOS_VFSFSYNC); + ret = nfs_commit_inode(inode, FLUSH_SYNC); +- if (ret < 0) +- return ret; +- return file_check_and_advance_wb_err(file); ++ ret2 = file_check_and_advance_wb_err(file); ++ if (ret2 < 0) ++ return ret2; ++ return ret; + } + + int +@@ -389,11 +390,8 @@ static int nfs_write_end(struct file *file, struct address_space *mapping, + return status; + NFS_I(mapping->host)->write_io += copied; + +- if (nfs_ctx_key_to_expire(ctx, mapping->host)) { +- status = nfs_wb_all(mapping->host); +- if (status < 0) +- return status; +- } ++ if (nfs_ctx_key_to_expire(ctx, mapping->host)) ++ nfs_wb_all(mapping->host); + + return copied; + } +diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c +index b3b9eff5d5727..8c0803d980084 100644 +--- a/fs/nfs/pnfs.c ++++ b/fs/nfs/pnfs.c +@@ -2006,6 +2006,7 @@ lookup_again: + lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags); + if (lo == NULL) { + spin_unlock(&ino->i_lock); ++ lseg = ERR_PTR(-ENOMEM); + trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg, + PNFS_UPDATE_LAYOUT_NOMEM); + goto out; +@@ -2134,6 +2135,7 @@ lookup_again: + + lgp = pnfs_alloc_init_layoutget_args(ino, ctx, &stateid, &arg, gfp_flags); + if (!lgp) { ++ lseg = ERR_PTR(-ENOMEM); + trace_pnfs_update_layout(ino, pos, count, iomode, lo, NULL, + PNFS_UPDATE_LAYOUT_NOMEM); + nfs_layoutget_end(lo); +diff --git a/fs/nfs/write.c b/fs/nfs/write.c +index 5d07799513a65..dc08a0c02f095 100644 +--- a/fs/nfs/write.c ++++ b/fs/nfs/write.c +@@ -675,11 +675,7 @@ static int nfs_writepage_locked(struct page *page, + err = nfs_do_writepage(page, wbc, &pgio); + pgio.pg_error = 0; + nfs_pageio_complete(&pgio); +- if (err < 0) +- return err; +- if (nfs_error_is_fatal(pgio.pg_error)) +- return pgio.pg_error; +- return 0; ++ return err; + } + + int nfs_writepage(struct page *page, struct writeback_control *wbc) +@@ -730,9 +726,6 @@ int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc) + + if (err < 0) + goto out_err; +- err = pgio.pg_error; +- if (nfs_error_is_fatal(err)) +- goto out_err; + return 0; + out_err: + return err; +@@ -1411,7 +1404,7 @@ static void nfs_async_write_error(struct list_head *head, int error) + while (!list_empty(head)) { + req = nfs_list_entry(head->next); + nfs_list_remove_request(req); +- if (nfs_error_is_fatal(error)) ++ if (nfs_error_is_fatal_on_server(error)) + nfs_write_error(req, error); + else + nfs_redirty_request(req); +diff --git a/fs/notify/fdinfo.c b/fs/notify/fdinfo.c +index f0d6b54be412e..765b50aeadd28 100644 +--- a/fs/notify/fdinfo.c ++++ b/fs/notify/fdinfo.c +@@ -83,16 +83,9 @@ static void inotify_fdinfo(struct seq_file *m, struct fsnotify_mark *mark) + inode_mark = container_of(mark, struct inotify_inode_mark, fsn_mark); + inode = igrab(fsnotify_conn_inode(mark->connector)); + if (inode) { +- /* +- * IN_ALL_EVENTS represents all of the mask bits +- * that we expose to userspace. There is at +- * least one bit (FS_EVENT_ON_CHILD) which is +- * used only internally to the kernel. +- */ +- u32 mask = mark->mask & IN_ALL_EVENTS; +- seq_printf(m, "inotify wd:%x ino:%lx sdev:%x mask:%x ignored_mask:%x ", ++ seq_printf(m, "inotify wd:%x ino:%lx sdev:%x mask:%x ignored_mask:0 ", + inode_mark->wd, inode->i_ino, inode->i_sb->s_dev, +- mask, mark->ignored_mask); ++ inotify_mark_user_mask(mark)); + show_mark_fhandle(m, inode); + seq_putc(m, '\n'); + iput(inode); +diff --git a/fs/notify/inotify/inotify.h b/fs/notify/inotify/inotify.h +index 2007e37119160..8f00151eb731f 100644 +--- a/fs/notify/inotify/inotify.h ++++ b/fs/notify/inotify/inotify.h +@@ -22,6 +22,18 @@ static inline struct inotify_event_info *INOTIFY_E(struct fsnotify_event *fse) + return container_of(fse, struct inotify_event_info, fse); + } + ++/* ++ * INOTIFY_USER_FLAGS represents all of the mask bits that we expose to ++ * userspace. There is at least one bit (FS_EVENT_ON_CHILD) which is ++ * used only internally to the kernel. ++ */ ++#define INOTIFY_USER_MASK (IN_ALL_EVENTS | IN_ONESHOT | IN_EXCL_UNLINK) ++ ++static inline __u32 inotify_mark_user_mask(struct fsnotify_mark *fsn_mark) ++{ ++ return fsn_mark->mask & INOTIFY_USER_MASK; ++} ++ + extern void inotify_ignored_and_remove_idr(struct fsnotify_mark *fsn_mark, + struct fsnotify_group *group); + extern int inotify_handle_inode_event(struct fsnotify_mark *inode_mark, +diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c +index 5f6c6bf65909c..32b6b97021bef 100644 +--- a/fs/notify/inotify/inotify_user.c ++++ b/fs/notify/inotify/inotify_user.c +@@ -88,7 +88,7 @@ static inline __u32 inotify_arg_to_mask(struct inode *inode, u32 arg) + mask |= FS_EVENT_ON_CHILD; + + /* mask off the flags used to open the fd */ +- mask |= (arg & (IN_ALL_EVENTS | IN_ONESHOT | IN_EXCL_UNLINK)); ++ mask |= (arg & INOTIFY_USER_MASK); + + return mask; + } +diff --git a/fs/notify/mark.c b/fs/notify/mark.c +index 8387937b9d01c..5b44be5f93dd8 100644 +--- a/fs/notify/mark.c ++++ b/fs/notify/mark.c +@@ -430,7 +430,7 @@ void fsnotify_free_mark(struct fsnotify_mark *mark) + void fsnotify_destroy_mark(struct fsnotify_mark *mark, + struct fsnotify_group *group) + { +- mutex_lock_nested(&group->mark_mutex, SINGLE_DEPTH_NESTING); ++ mutex_lock(&group->mark_mutex); + fsnotify_detach_mark(mark); + mutex_unlock(&group->mark_mutex); + fsnotify_free_mark(mark); +@@ -742,7 +742,7 @@ void fsnotify_clear_marks_by_group(struct fsnotify_group *group, + * move marks to free to to_free list in one go and then free marks in + * to_free list one by one. + */ +- mutex_lock_nested(&group->mark_mutex, SINGLE_DEPTH_NESTING); ++ mutex_lock(&group->mark_mutex); + list_for_each_entry_safe(mark, lmark, &group->marks_list, g_list) { + if ((1U << mark->connector->type) & type_mask) + list_move(&mark->g_list, &to_free); +@@ -751,7 +751,7 @@ void fsnotify_clear_marks_by_group(struct fsnotify_group *group, + + clear: + while (1) { +- mutex_lock_nested(&group->mark_mutex, SINGLE_DEPTH_NESTING); ++ mutex_lock(&group->mark_mutex); + if (list_empty(head)) { + mutex_unlock(&group->mark_mutex); + break; +diff --git a/fs/ocfs2/dlmfs/userdlm.c b/fs/ocfs2/dlmfs/userdlm.c +index 339f098d9592c..8fa289de39391 100644 +--- a/fs/ocfs2/dlmfs/userdlm.c ++++ b/fs/ocfs2/dlmfs/userdlm.c +@@ -435,6 +435,11 @@ again: + } + + spin_lock(&lockres->l_lock); ++ if (lockres->l_flags & USER_LOCK_IN_TEARDOWN) { ++ spin_unlock(&lockres->l_lock); ++ status = -EAGAIN; ++ goto bail; ++ } + + /* We only compare against the currently granted level + * here. If the lock is blocked waiting on a downconvert, +@@ -597,7 +602,7 @@ int user_dlm_destroy_lock(struct user_lock_res *lockres) + spin_lock(&lockres->l_lock); + if (lockres->l_flags & USER_LOCK_IN_TEARDOWN) { + spin_unlock(&lockres->l_lock); +- return 0; ++ goto bail; + } + + lockres->l_flags |= USER_LOCK_IN_TEARDOWN; +@@ -611,12 +616,17 @@ int user_dlm_destroy_lock(struct user_lock_res *lockres) + } + + if (lockres->l_ro_holders || lockres->l_ex_holders) { ++ lockres->l_flags &= ~USER_LOCK_IN_TEARDOWN; + spin_unlock(&lockres->l_lock); + goto bail; + } + + status = 0; + if (!(lockres->l_flags & USER_LOCK_ATTACHED)) { ++ /* ++ * lock is never requested, leave USER_LOCK_IN_TEARDOWN set ++ * to avoid new lock request coming in. ++ */ + spin_unlock(&lockres->l_lock); + goto bail; + } +@@ -627,6 +637,10 @@ int user_dlm_destroy_lock(struct user_lock_res *lockres) + + status = ocfs2_dlm_unlock(conn, &lockres->l_lksb, DLM_LKF_VALBLK); + if (status) { ++ spin_lock(&lockres->l_lock); ++ lockres->l_flags &= ~USER_LOCK_IN_TEARDOWN; ++ lockres->l_flags &= ~USER_LOCK_BUSY; ++ spin_unlock(&lockres->l_lock); + user_log_dlm_error("ocfs2_dlm_unlock", status, lockres); + goto bail; + } +diff --git a/fs/proc/generic.c b/fs/proc/generic.c +index 09e4d8a499a38..5898761698c22 100644 +--- a/fs/proc/generic.c ++++ b/fs/proc/generic.c +@@ -453,6 +453,9 @@ static struct proc_dir_entry *__proc_create(struct proc_dir_entry **parent, + proc_set_user(ent, (*parent)->uid, (*parent)->gid); + + ent->proc_dops = &proc_misc_dentry_ops; ++ /* Revalidate everything under /proc/${pid}/net */ ++ if ((*parent)->proc_dops == &proc_net_dentry_ops) ++ pde_force_lookup(ent); + + out: + return ent; +diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c +index 1aa9236bf1af5..707477e27f831 100644 +--- a/fs/proc/proc_net.c ++++ b/fs/proc/proc_net.c +@@ -362,6 +362,9 @@ static __net_init int proc_net_ns_init(struct net *net) + + proc_set_user(netd, uid, gid); + ++ /* Seed dentry revalidation for /proc/${pid}/net */ ++ pde_force_lookup(netd); ++ + err = -EEXIST; + net_statd = proc_net_mkdir(net, "stat", netd); + if (!net_statd) +diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c +index 2d25bab687647..98c82f4935e1e 100644 +--- a/fs/xfs/libxfs/xfs_btree.c ++++ b/fs/xfs/libxfs/xfs_btree.c +@@ -353,20 +353,17 @@ xfs_btree_free_block( + */ + void + xfs_btree_del_cursor( +- xfs_btree_cur_t *cur, /* btree cursor */ +- int error) /* del because of error */ ++ struct xfs_btree_cur *cur, /* btree cursor */ ++ int error) /* del because of error */ + { +- int i; /* btree level */ ++ int i; /* btree level */ + + /* +- * Clear the buffer pointers, and release the buffers. +- * If we're doing this in the face of an error, we +- * need to make sure to inspect all of the entries +- * in the bc_bufs array for buffers to be unlocked. +- * This is because some of the btree code works from +- * level n down to 0, and if we get an error along +- * the way we won't have initialized all the entries +- * down to 0. ++ * Clear the buffer pointers and release the buffers. If we're doing ++ * this because of an error, inspect all of the entries in the bc_bufs ++ * array for buffers to be unlocked. This is because some of the btree ++ * code works from level n down to 0, and if we get an error along the ++ * way we won't have initialized all the entries down to 0. + */ + for (i = 0; i < cur->bc_nlevels; i++) { + if (cur->bc_bufs[i]) +@@ -374,17 +371,17 @@ xfs_btree_del_cursor( + else if (!error) + break; + } ++ + /* +- * Can't free a bmap cursor without having dealt with the +- * allocated indirect blocks' accounting. +- */ +- ASSERT(cur->bc_btnum != XFS_BTNUM_BMAP || +- cur->bc_ino.allocated == 0); +- /* +- * Free the cursor. ++ * If we are doing a BMBT update, the number of unaccounted blocks ++ * allocated during this cursor life time should be zero. If it's not ++ * zero, then we should be shut down or on our way to shutdown due to ++ * cancelling a dirty transaction on error. + */ ++ ASSERT(cur->bc_btnum != XFS_BTNUM_BMAP || cur->bc_ino.allocated == 0 || ++ XFS_FORCED_SHUTDOWN(cur->bc_mp) || error != 0); + if (unlikely(cur->bc_flags & XFS_BTREE_STAGING)) +- kmem_free((void *)cur->bc_ops); ++ kmem_free(cur->bc_ops); + kmem_cache_free(xfs_btree_cur_zone, cur); + } + +diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c +index 1d95ed387d66d..80c4579d68357 100644 +--- a/fs/xfs/xfs_dquot.c ++++ b/fs/xfs/xfs_dquot.c +@@ -500,6 +500,42 @@ xfs_dquot_alloc( + return dqp; + } + ++/* Check the ondisk dquot's id and type match what the incore dquot expects. */ ++static bool ++xfs_dquot_check_type( ++ struct xfs_dquot *dqp, ++ struct xfs_disk_dquot *ddqp) ++{ ++ uint8_t ddqp_type; ++ uint8_t dqp_type; ++ ++ ddqp_type = ddqp->d_type & XFS_DQTYPE_REC_MASK; ++ dqp_type = xfs_dquot_type(dqp); ++ ++ if (be32_to_cpu(ddqp->d_id) != dqp->q_id) ++ return false; ++ ++ /* ++ * V5 filesystems always expect an exact type match. V4 filesystems ++ * expect an exact match for user dquots and for non-root group and ++ * project dquots. ++ */ ++ if (xfs_sb_version_hascrc(&dqp->q_mount->m_sb) || ++ dqp_type == XFS_DQTYPE_USER || dqp->q_id != 0) ++ return ddqp_type == dqp_type; ++ ++ /* ++ * V4 filesystems support either group or project quotas, but not both ++ * at the same time. The non-user quota file can be switched between ++ * group and project quota uses depending on the mount options, which ++ * means that we can encounter the other type when we try to load quota ++ * defaults. Quotacheck will soon reset the the entire quota file ++ * (including the root dquot) anyway, but don't log scary corruption ++ * reports to dmesg. ++ */ ++ return ddqp_type == XFS_DQTYPE_GROUP || ddqp_type == XFS_DQTYPE_PROJ; ++} ++ + /* Copy the in-core quota fields in from the on-disk buffer. */ + STATIC int + xfs_dquot_from_disk( +@@ -512,8 +548,7 @@ xfs_dquot_from_disk( + * Ensure that we got the type and ID we were looking for. + * Everything else was checked by the dquot buffer verifier. + */ +- if ((ddqp->d_type & XFS_DQTYPE_REC_MASK) != xfs_dquot_type(dqp) || +- be32_to_cpu(ddqp->d_id) != dqp->q_id) { ++ if (!xfs_dquot_check_type(dqp, ddqp)) { + xfs_alert_tag(bp->b_mount, XFS_PTAG_VERIFIER_ERROR, + "Metadata corruption detected at %pS, quota %u", + __this_address, dqp->q_id); +diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c +index 7b9ff824e82d4..74bc2beadc237 100644 +--- a/fs/xfs/xfs_iomap.c ++++ b/fs/xfs/xfs_iomap.c +@@ -870,6 +870,9 @@ xfs_buffered_write_iomap_begin( + int allocfork = XFS_DATA_FORK; + int error = 0; + ++ if (XFS_FORCED_SHUTDOWN(mp)) ++ return -EIO; ++ + /* we can't use delayed allocations when using extent size hints */ + if (xfs_get_extsz_hint(ip)) + return xfs_direct_write_iomap_begin(inode, offset, count, +diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c +index fa2d05e65ff1f..b445e63cbc3c7 100644 +--- a/fs/xfs/xfs_log.c ++++ b/fs/xfs/xfs_log.c +@@ -347,6 +347,25 @@ xlog_tic_add_region(xlog_ticket_t *tic, uint len, uint type) + tic->t_res_num++; + } + ++bool ++xfs_log_writable( ++ struct xfs_mount *mp) ++{ ++ /* ++ * Never write to the log on norecovery mounts, if the block device is ++ * read-only, or if the filesystem is shutdown. Read-only mounts still ++ * allow internal writes for log recovery and unmount purposes, so don't ++ * restrict that case here. ++ */ ++ if (mp->m_flags & XFS_MOUNT_NORECOVERY) ++ return false; ++ if (xfs_readonly_buftarg(mp->m_log->l_targ)) ++ return false; ++ if (XFS_FORCED_SHUTDOWN(mp)) ++ return false; ++ return true; ++} ++ + /* + * Replenish the byte reservation required by moving the grant write head. + */ +@@ -886,15 +905,8 @@ xfs_log_unmount_write( + { + struct xlog *log = mp->m_log; + +- /* +- * Don't write out unmount record on norecovery mounts or ro devices. +- * Or, if we are doing a forced umount (typically because of IO errors). +- */ +- if (mp->m_flags & XFS_MOUNT_NORECOVERY || +- xfs_readonly_buftarg(log->l_targ)) { +- ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); ++ if (!xfs_log_writable(mp)) + return; +- } + + xfs_log_force(mp, XFS_LOG_SYNC); + +diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h +index 58c3fcbec94a2..98c913da7587e 100644 +--- a/fs/xfs/xfs_log.h ++++ b/fs/xfs/xfs_log.h +@@ -127,6 +127,7 @@ int xfs_log_reserve(struct xfs_mount *mp, + int xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic); + void xfs_log_unmount(struct xfs_mount *mp); + int xfs_log_force_umount(struct xfs_mount *mp, int logerror); ++bool xfs_log_writable(struct xfs_mount *mp); + + struct xlog_ticket *xfs_log_ticket_get(struct xlog_ticket *ticket); + void xfs_log_ticket_put(struct xlog_ticket *ticket); +diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c +index 7110507a2b6bc..44b05e1d5d327 100644 +--- a/fs/xfs/xfs_mount.c ++++ b/fs/xfs/xfs_mount.c +@@ -631,6 +631,47 @@ xfs_check_summary_counts( + return xfs_initialize_perag_data(mp, mp->m_sb.sb_agcount); + } + ++/* ++ * Flush and reclaim dirty inodes in preparation for unmount. Inodes and ++ * internal inode structures can be sitting in the CIL and AIL at this point, ++ * so we need to unpin them, write them back and/or reclaim them before unmount ++ * can proceed. ++ * ++ * An inode cluster that has been freed can have its buffer still pinned in ++ * memory because the transaction is still sitting in a iclog. The stale inodes ++ * on that buffer will be pinned to the buffer until the transaction hits the ++ * disk and the callbacks run. Pushing the AIL will skip the stale inodes and ++ * may never see the pinned buffer, so nothing will push out the iclog and ++ * unpin the buffer. ++ * ++ * Hence we need to force the log to unpin everything first. However, log ++ * forces don't wait for the discards they issue to complete, so we have to ++ * explicitly wait for them to complete here as well. ++ * ++ * Then we can tell the world we are unmounting so that error handling knows ++ * that the filesystem is going away and we should error out anything that we ++ * have been retrying in the background. This will prevent never-ending ++ * retries in AIL pushing from hanging the unmount. ++ * ++ * Finally, we can push the AIL to clean all the remaining dirty objects, then ++ * reclaim the remaining inodes that are still in memory at this point in time. ++ */ ++static void ++xfs_unmount_flush_inodes( ++ struct xfs_mount *mp) ++{ ++ xfs_log_force(mp, XFS_LOG_SYNC); ++ xfs_extent_busy_wait_all(mp); ++ flush_workqueue(xfs_discard_wq); ++ ++ mp->m_flags |= XFS_MOUNT_UNMOUNTING; ++ ++ xfs_ail_push_all_sync(mp->m_ail); ++ cancel_delayed_work_sync(&mp->m_reclaim_work); ++ xfs_reclaim_inodes(mp); ++ xfs_health_unmount(mp); ++} ++ + /* + * This function does the following on an initial mount of a file system: + * - reads the superblock from disk and init the mount struct +@@ -1005,7 +1046,7 @@ xfs_mountfs( + /* Clean out dquots that might be in memory after quotacheck. */ + xfs_qm_unmount(mp); + /* +- * Cancel all delayed reclaim work and reclaim the inodes directly. ++ * Flush all inode reclamation work and flush the log. + * We have to do this /after/ rtunmount and qm_unmount because those + * two will have scheduled delayed reclaim for the rt/quota inodes. + * +@@ -1015,11 +1056,8 @@ xfs_mountfs( + * qm_unmount_quotas and therefore rely on qm_unmount to release the + * quota inodes. + */ +- cancel_delayed_work_sync(&mp->m_reclaim_work); +- xfs_reclaim_inodes(mp); +- xfs_health_unmount(mp); ++ xfs_unmount_flush_inodes(mp); + out_log_dealloc: +- mp->m_flags |= XFS_MOUNT_UNMOUNTING; + xfs_log_mount_cancel(mp); + out_fail_wait: + if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) +@@ -1060,47 +1098,7 @@ xfs_unmountfs( + xfs_rtunmount_inodes(mp); + xfs_irele(mp->m_rootip); + +- /* +- * We can potentially deadlock here if we have an inode cluster +- * that has been freed has its buffer still pinned in memory because +- * the transaction is still sitting in a iclog. The stale inodes +- * on that buffer will be pinned to the buffer until the +- * transaction hits the disk and the callbacks run. Pushing the AIL will +- * skip the stale inodes and may never see the pinned buffer, so +- * nothing will push out the iclog and unpin the buffer. Hence we +- * need to force the log here to ensure all items are flushed into the +- * AIL before we go any further. +- */ +- xfs_log_force(mp, XFS_LOG_SYNC); +- +- /* +- * Wait for all busy extents to be freed, including completion of +- * any discard operation. +- */ +- xfs_extent_busy_wait_all(mp); +- flush_workqueue(xfs_discard_wq); +- +- /* +- * We now need to tell the world we are unmounting. This will allow +- * us to detect that the filesystem is going away and we should error +- * out anything that we have been retrying in the background. This will +- * prevent neverending retries in AIL pushing from hanging the unmount. +- */ +- mp->m_flags |= XFS_MOUNT_UNMOUNTING; +- +- /* +- * Flush all pending changes from the AIL. +- */ +- xfs_ail_push_all_sync(mp->m_ail); +- +- /* +- * Reclaim all inodes. At this point there should be no dirty inodes and +- * none should be pinned or locked. Stop background inode reclaim here +- * if it is still running. +- */ +- cancel_delayed_work_sync(&mp->m_reclaim_work); +- xfs_reclaim_inodes(mp); +- xfs_health_unmount(mp); ++ xfs_unmount_flush_inodes(mp); + + xfs_qm_unmount(mp); + +@@ -1176,8 +1174,7 @@ xfs_fs_writable( + int + xfs_log_sbcount(xfs_mount_t *mp) + { +- /* allow this to proceed during the freeze sequence... */ +- if (!xfs_fs_writable(mp, SB_FREEZE_COMPLETE)) ++ if (!xfs_log_writable(mp)) + return 0; + + /* +diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c +index b2a9abee8b2b0..64e5da33733b9 100644 +--- a/fs/xfs/xfs_qm.c ++++ b/fs/xfs/xfs_qm.c +@@ -1785,6 +1785,29 @@ xfs_qm_vop_chown( + xfs_trans_mod_dquot(tp, newdq, bfield, ip->i_d.di_nblocks); + xfs_trans_mod_dquot(tp, newdq, XFS_TRANS_DQ_ICOUNT, 1); + ++ /* ++ * Back when we made quota reservations for the chown, we reserved the ++ * ondisk blocks + delalloc blocks with the new dquot. Now that we've ++ * switched the dquots, decrease the new dquot's block reservation ++ * (having already bumped up the real counter) so that we don't have ++ * any reservation to give back when we commit. ++ */ ++ xfs_trans_mod_dquot(tp, newdq, XFS_TRANS_DQ_RES_BLKS, ++ -ip->i_delayed_blks); ++ ++ /* ++ * Give the incore reservation for delalloc blocks back to the old ++ * dquot. We don't normally handle delalloc quota reservations ++ * transactionally, so just lock the dquot and subtract from the ++ * reservation. Dirty the transaction because it's too late to turn ++ * back now. ++ */ ++ tp->t_flags |= XFS_TRANS_DIRTY; ++ xfs_dqlock(prevdq); ++ ASSERT(prevdq->q_blk.reserved >= ip->i_delayed_blks); ++ prevdq->q_blk.reserved -= ip->i_delayed_blks; ++ xfs_dqunlock(prevdq); ++ + /* + * Take an extra reference, because the inode is going to keep + * this dquot pointer even after the trans_commit. +@@ -1807,84 +1830,39 @@ xfs_qm_vop_chown_reserve( + uint flags) + { + struct xfs_mount *mp = ip->i_mount; +- uint64_t delblks; + unsigned int blkflags; +- struct xfs_dquot *udq_unres = NULL; +- struct xfs_dquot *gdq_unres = NULL; +- struct xfs_dquot *pdq_unres = NULL; + struct xfs_dquot *udq_delblks = NULL; + struct xfs_dquot *gdq_delblks = NULL; + struct xfs_dquot *pdq_delblks = NULL; +- int error; +- + + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); + ASSERT(XFS_IS_QUOTA_RUNNING(mp)); + +- delblks = ip->i_delayed_blks; + blkflags = XFS_IS_REALTIME_INODE(ip) ? + XFS_QMOPT_RES_RTBLKS : XFS_QMOPT_RES_REGBLKS; + + if (XFS_IS_UQUOTA_ON(mp) && udqp && +- i_uid_read(VFS_I(ip)) != udqp->q_id) { ++ i_uid_read(VFS_I(ip)) != udqp->q_id) + udq_delblks = udqp; +- /* +- * If there are delayed allocation blocks, then we have to +- * unreserve those from the old dquot, and add them to the +- * new dquot. +- */ +- if (delblks) { +- ASSERT(ip->i_udquot); +- udq_unres = ip->i_udquot; +- } +- } ++ + if (XFS_IS_GQUOTA_ON(ip->i_mount) && gdqp && +- i_gid_read(VFS_I(ip)) != gdqp->q_id) { ++ i_gid_read(VFS_I(ip)) != gdqp->q_id) + gdq_delblks = gdqp; +- if (delblks) { +- ASSERT(ip->i_gdquot); +- gdq_unres = ip->i_gdquot; +- } +- } + + if (XFS_IS_PQUOTA_ON(ip->i_mount) && pdqp && +- ip->i_d.di_projid != pdqp->q_id) { ++ ip->i_d.di_projid != pdqp->q_id) + pdq_delblks = pdqp; +- if (delblks) { +- ASSERT(ip->i_pdquot); +- pdq_unres = ip->i_pdquot; +- } +- } +- +- error = xfs_trans_reserve_quota_bydquots(tp, ip->i_mount, +- udq_delblks, gdq_delblks, pdq_delblks, +- ip->i_d.di_nblocks, 1, flags | blkflags); +- if (error) +- return error; + + /* +- * Do the delayed blks reservations/unreservations now. Since, these +- * are done without the help of a transaction, if a reservation fails +- * its previous reservations won't be automatically undone by trans +- * code. So, we have to do it manually here. ++ * Reserve enough quota to handle blocks on disk and reserved for a ++ * delayed allocation. We'll actually transfer the delalloc ++ * reservation between dquots at chown time, even though that part is ++ * only semi-transactional. + */ +- if (delblks) { +- /* +- * Do the reservations first. Unreservation can't fail. +- */ +- ASSERT(udq_delblks || gdq_delblks || pdq_delblks); +- ASSERT(udq_unres || gdq_unres || pdq_unres); +- error = xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount, +- udq_delblks, gdq_delblks, pdq_delblks, +- (xfs_qcnt_t)delblks, 0, flags | blkflags); +- if (error) +- return error; +- xfs_trans_reserve_quota_bydquots(NULL, ip->i_mount, +- udq_unres, gdq_unres, pdq_unres, +- -((xfs_qcnt_t)delblks), 0, blkflags); +- } +- +- return 0; ++ return xfs_trans_reserve_quota_bydquots(tp, ip->i_mount, udq_delblks, ++ gdq_delblks, pdq_delblks, ++ ip->i_d.di_nblocks + ip->i_delayed_blks, ++ 1, blkflags | flags); + } + + int +diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c +index 8e88a7ca387ea..8d3abf06c54f8 100644 +--- a/fs/xfs/xfs_symlink.c ++++ b/fs/xfs/xfs_symlink.c +@@ -300,6 +300,7 @@ xfs_symlink( + } + ASSERT(pathlen == 0); + } ++ i_size_write(VFS_I(ip), ip->i_d.di_size); + + /* + * Create the directory entry for the symlink. +diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h +index e97daf6ffbb19..4526b6a1e5831 100644 +--- a/include/drm/drm_edid.h ++++ b/include/drm/drm_edid.h +@@ -121,7 +121,7 @@ struct detailed_data_monitor_range { + u8 supported_scalings; + u8 preferred_refresh; + } __attribute__((packed)) cvt; +- } formula; ++ } __attribute__((packed)) formula; + } __attribute__((packed)); + + struct detailed_data_wpindex { +@@ -154,7 +154,7 @@ struct detailed_non_pixel { + struct detailed_data_wpindex color; + struct std_timing timings[6]; + struct cvt_timing cvt[4]; +- } data; ++ } __attribute__((packed)) data; + } __attribute__((packed)); + + #define EDID_DETAIL_EST_TIMINGS 0xf7 +@@ -172,7 +172,7 @@ struct detailed_timing { + union { + struct detailed_pixel_timing pixel_data; + struct detailed_non_pixel other_data; +- } data; ++ } __attribute__((packed)) data; + } __attribute__((packed)); + + #define DRM_EDID_INPUT_SERRATION_VSYNC (1 << 0) +diff --git a/include/linux/bpf.h b/include/linux/bpf.h +index ea3ff499e94a3..f21bc441e3fa8 100644 +--- a/include/linux/bpf.h ++++ b/include/linux/bpf.h +@@ -1730,6 +1730,8 @@ void bpf_offload_dev_netdev_unregister(struct bpf_offload_dev *offdev, + struct net_device *netdev); + bool bpf_offload_dev_match(struct bpf_prog *prog, struct net_device *netdev); + ++void unpriv_ebpf_notify(int new_state); ++ + #if defined(CONFIG_NET) && defined(CONFIG_BPF_SYSCALL) + int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr); + +diff --git a/include/linux/efi.h b/include/linux/efi.h +index e17cd4c44f93a..3bac68fb7ff1c 100644 +--- a/include/linux/efi.h ++++ b/include/linux/efi.h +@@ -167,6 +167,8 @@ struct capsule_info { + size_t page_bytes_remain; + }; + ++int efi_capsule_setup_info(struct capsule_info *cap_info, void *kbuff, ++ size_t hdr_bytes); + int __efi_capsule_setup_info(struct capsule_info *cap_info); + + typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg); +diff --git a/include/linux/font.h b/include/linux/font.h +index b5b312c19e463..4f50d736ea72b 100644 +--- a/include/linux/font.h ++++ b/include/linux/font.h +@@ -16,7 +16,7 @@ + struct font_desc { + int idx; + const char *name; +- int width, height; ++ unsigned int width, height; + const void *data; + int pref; + }; +diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h +index b216899b4745e..0552a9859a01e 100644 +--- a/include/linux/gpio/driver.h ++++ b/include/linux/gpio/driver.h +@@ -477,6 +477,18 @@ struct gpio_chip { + */ + int (*of_xlate)(struct gpio_chip *gc, + const struct of_phandle_args *gpiospec, u32 *flags); ++ ++ /** ++ * @of_gpio_ranges_fallback: ++ * ++ * Optional hook for the case that no gpio-ranges property is defined ++ * within the device tree node "np" (usually DT before introduction ++ * of gpio-ranges). So this callback is helpful to provide the ++ * necessary backward compatibility for the pin ranges. ++ */ ++ int (*of_gpio_ranges_fallback)(struct gpio_chip *gc, ++ struct device_node *np); ++ + #endif /* CONFIG_OF_GPIO */ + }; + +diff --git a/include/linux/kexec.h b/include/linux/kexec.h +index 5f61389f5f361..037192c3a46f7 100644 +--- a/include/linux/kexec.h ++++ b/include/linux/kexec.h +@@ -187,14 +187,6 @@ void *kexec_purgatory_get_symbol_addr(struct kimage *image, const char *name); + int arch_kexec_kernel_image_probe(struct kimage *image, void *buf, + unsigned long buf_len); + void *arch_kexec_kernel_image_load(struct kimage *image); +-int arch_kexec_apply_relocations_add(struct purgatory_info *pi, +- Elf_Shdr *section, +- const Elf_Shdr *relsec, +- const Elf_Shdr *symtab); +-int arch_kexec_apply_relocations(struct purgatory_info *pi, +- Elf_Shdr *section, +- const Elf_Shdr *relsec, +- const Elf_Shdr *symtab); + int arch_kimage_file_post_load_cleanup(struct kimage *image); + #ifdef CONFIG_KEXEC_SIG + int arch_kexec_kernel_verify_sig(struct kimage *image, void *buf, +@@ -223,6 +215,44 @@ extern int crash_exclude_mem_range(struct crash_mem *mem, + unsigned long long mend); + extern int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map, + void **addr, unsigned long *sz); ++ ++#ifndef arch_kexec_apply_relocations_add ++/* ++ * arch_kexec_apply_relocations_add - apply relocations of type RELA ++ * @pi: Purgatory to be relocated. ++ * @section: Section relocations applying to. ++ * @relsec: Section containing RELAs. ++ * @symtab: Corresponding symtab. ++ * ++ * Return: 0 on success, negative errno on error. ++ */ ++static inline int ++arch_kexec_apply_relocations_add(struct purgatory_info *pi, Elf_Shdr *section, ++ const Elf_Shdr *relsec, const Elf_Shdr *symtab) ++{ ++ pr_err("RELA relocation unsupported.\n"); ++ return -ENOEXEC; ++} ++#endif ++ ++#ifndef arch_kexec_apply_relocations ++/* ++ * arch_kexec_apply_relocations - apply relocations of type REL ++ * @pi: Purgatory to be relocated. ++ * @section: Section relocations applying to. ++ * @relsec: Section containing RELs. ++ * @symtab: Corresponding symtab. ++ * ++ * Return: 0 on success, negative errno on error. ++ */ ++static inline int ++arch_kexec_apply_relocations(struct purgatory_info *pi, Elf_Shdr *section, ++ const Elf_Shdr *relsec, const Elf_Shdr *symtab) ++{ ++ pr_err("REL relocation unsupported.\n"); ++ return -ENOEXEC; ++} ++#endif + #endif /* CONFIG_KEXEC_FILE */ + + #ifdef CONFIG_KEXEC_ELF +diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h +index a6a3d4ddfc2df..d13631a5e9087 100644 +--- a/include/linux/lsm_hook_defs.h ++++ b/include/linux/lsm_hook_defs.h +@@ -311,7 +311,7 @@ LSM_HOOK(int, 0, secmark_relabel_packet, u32 secid) + LSM_HOOK(void, LSM_RET_VOID, secmark_refcount_inc, void) + LSM_HOOK(void, LSM_RET_VOID, secmark_refcount_dec, void) + LSM_HOOK(void, LSM_RET_VOID, req_classify_flow, const struct request_sock *req, +- struct flowi *fl) ++ struct flowi_common *flic) + LSM_HOOK(int, 0, tun_dev_alloc_security, void **security) + LSM_HOOK(void, LSM_RET_VOID, tun_dev_free_security, void *security) + LSM_HOOK(int, 0, tun_dev_create, void) +@@ -351,7 +351,7 @@ LSM_HOOK(int, 0, xfrm_state_delete_security, struct xfrm_state *x) + LSM_HOOK(int, 0, xfrm_policy_lookup, struct xfrm_sec_ctx *ctx, u32 fl_secid, + u8 dir) + LSM_HOOK(int, 1, xfrm_state_pol_flow_match, struct xfrm_state *x, +- struct xfrm_policy *xp, const struct flowi *fl) ++ struct xfrm_policy *xp, const struct flowi_common *flic) + LSM_HOOK(int, 0, xfrm_decode_session, struct sk_buff *skb, u32 *secid, + int ckall) + #endif /* CONFIG_SECURITY_NETWORK_XFRM */ +diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h +index a8531b37e6f52..64cdf4d7bfb30 100644 +--- a/include/linux/lsm_hooks.h ++++ b/include/linux/lsm_hooks.h +@@ -1105,7 +1105,7 @@ + * @xfrm_state_pol_flow_match: + * @x contains the state to match. + * @xp contains the policy to check for a match. +- * @fl contains the flow to check for a match. ++ * @flic contains the flowi_common struct to check for a match. + * Return 1 if there is a match. + * @xfrm_decode_session: + * @skb points to skb to decode. +diff --git a/include/linux/mailbox_controller.h b/include/linux/mailbox_controller.h +index 36d6ce673503c..6fee33cb52f58 100644 +--- a/include/linux/mailbox_controller.h ++++ b/include/linux/mailbox_controller.h +@@ -83,6 +83,7 @@ struct mbox_controller { + const struct of_phandle_args *sp); + /* Internal to API */ + struct hrtimer poll_hrt; ++ spinlock_t poll_hrt_lock; + struct list_head node; + }; + +diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h +index fd1ecb8211060..d88bb56c18e2e 100644 +--- a/include/linux/mtd/cfi.h ++++ b/include/linux/mtd/cfi.h +@@ -286,6 +286,7 @@ struct cfi_private { + map_word sector_erase_cmd; + unsigned long chipshift; /* Because they're of the same type */ + const char *im_name; /* inter_module name for cmdset_setup */ ++ unsigned long quirks; + struct flchip chips[]; /* per-chip data structure for each chip */ + }; + +diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h +index ac398e143c9a1..843678bfc364f 100644 +--- a/include/linux/nodemask.h ++++ b/include/linux/nodemask.h +@@ -375,14 +375,13 @@ static inline void __nodes_fold(nodemask_t *dstp, const nodemask_t *origp, + } + + #if MAX_NUMNODES > 1 +-#define for_each_node_mask(node, mask) \ +- for ((node) = first_node(mask); \ +- (node) < MAX_NUMNODES; \ +- (node) = next_node((node), (mask))) ++#define for_each_node_mask(node, mask) \ ++ for ((node) = first_node(mask); \ ++ (node >= 0) && (node) < MAX_NUMNODES; \ ++ (node) = next_node((node), (mask))) + #else /* MAX_NUMNODES == 1 */ +-#define for_each_node_mask(node, mask) \ +- if (!nodes_empty(mask)) \ +- for ((node) = 0; (node) < 1; (node)++) ++#define for_each_node_mask(node, mask) \ ++ for ((node) = 0; (node) < 1 && !nodes_empty(mask); (node)++) + #endif /* MAX_NUMNODES */ + + /* +diff --git a/include/linux/platform_data/cros_ec_proto.h b/include/linux/platform_data/cros_ec_proto.h +index 02599687770c5..7f03e02c48cd4 100644 +--- a/include/linux/platform_data/cros_ec_proto.h ++++ b/include/linux/platform_data/cros_ec_proto.h +@@ -216,6 +216,9 @@ int cros_ec_prepare_tx(struct cros_ec_device *ec_dev, + int cros_ec_check_result(struct cros_ec_device *ec_dev, + struct cros_ec_command *msg); + ++int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev, ++ struct cros_ec_command *msg); ++ + int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev, + struct cros_ec_command *msg); + +diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h +index 2a9df80ea8876..ae7dbdfa3d832 100644 +--- a/include/linux/ptrace.h ++++ b/include/linux/ptrace.h +@@ -30,7 +30,6 @@ extern int ptrace_access_vm(struct task_struct *tsk, unsigned long addr, + + #define PT_SEIZED 0x00010000 /* SEIZE used, enable new behavior */ + #define PT_PTRACED 0x00000001 +-#define PT_DTRACE 0x00000002 /* delayed trace (used on m68k, i386) */ + + #define PT_OPT_FLAG_SHIFT 3 + /* PT_TRACE_* event enable flags */ +@@ -47,12 +46,6 @@ extern int ptrace_access_vm(struct task_struct *tsk, unsigned long addr, + #define PT_EXITKILL (PTRACE_O_EXITKILL << PT_OPT_FLAG_SHIFT) + #define PT_SUSPEND_SECCOMP (PTRACE_O_SUSPEND_SECCOMP << PT_OPT_FLAG_SHIFT) + +-/* single stepping state bits (used on ARM and PA-RISC) */ +-#define PT_SINGLESTEP_BIT 31 +-#define PT_SINGLESTEP (1<<PT_SINGLESTEP_BIT) +-#define PT_BLOCKSTEP_BIT 30 +-#define PT_BLOCKSTEP (1<<PT_BLOCKSTEP_BIT) +- + extern long arch_ptrace(struct task_struct *child, long request, + unsigned long addr, unsigned long data); + extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); +diff --git a/include/linux/security.h b/include/linux/security.h +index 330029ef7e894..e9b4b54106147 100644 +--- a/include/linux/security.h ++++ b/include/linux/security.h +@@ -170,7 +170,7 @@ struct sk_buff; + struct sock; + struct sockaddr; + struct socket; +-struct flowi; ++struct flowi_common; + struct dst_entry; + struct xfrm_selector; + struct xfrm_policy; +@@ -1363,8 +1363,9 @@ int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u + int security_sk_alloc(struct sock *sk, int family, gfp_t priority); + void security_sk_free(struct sock *sk); + void security_sk_clone(const struct sock *sk, struct sock *newsk); +-void security_sk_classify_flow(struct sock *sk, struct flowi *fl); +-void security_req_classify_flow(const struct request_sock *req, struct flowi *fl); ++void security_sk_classify_flow(struct sock *sk, struct flowi_common *flic); ++void security_req_classify_flow(const struct request_sock *req, ++ struct flowi_common *flic); + void security_sock_graft(struct sock*sk, struct socket *parent); + int security_inet_conn_request(struct sock *sk, + struct sk_buff *skb, struct request_sock *req); +@@ -1515,11 +1516,13 @@ static inline void security_sk_clone(const struct sock *sk, struct sock *newsk) + { + } + +-static inline void security_sk_classify_flow(struct sock *sk, struct flowi *fl) ++static inline void security_sk_classify_flow(struct sock *sk, ++ struct flowi_common *flic) + { + } + +-static inline void security_req_classify_flow(const struct request_sock *req, struct flowi *fl) ++static inline void security_req_classify_flow(const struct request_sock *req, ++ struct flowi_common *flic) + { + } + +@@ -1646,9 +1649,9 @@ void security_xfrm_state_free(struct xfrm_state *x); + int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir); + int security_xfrm_state_pol_flow_match(struct xfrm_state *x, + struct xfrm_policy *xp, +- const struct flowi *fl); ++ const struct flowi_common *flic); + int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid); +-void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl); ++void security_skb_classify_flow(struct sk_buff *skb, struct flowi_common *flic); + + #else /* CONFIG_SECURITY_NETWORK_XFRM */ + +@@ -1700,7 +1703,8 @@ static inline int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_s + } + + static inline int security_xfrm_state_pol_flow_match(struct xfrm_state *x, +- struct xfrm_policy *xp, const struct flowi *fl) ++ struct xfrm_policy *xp, ++ const struct flowi_common *flic) + { + return 1; + } +@@ -1710,7 +1714,8 @@ static inline int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid) + return 0; + } + +-static inline void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl) ++static inline void security_skb_classify_flow(struct sk_buff *skb, ++ struct flowi_common *flic) + { + } + +diff --git a/include/linux/thermal.h b/include/linux/thermal.h +index 176d9454e8f36..7097d4dcfdd07 100644 +--- a/include/linux/thermal.h ++++ b/include/linux/thermal.h +@@ -92,7 +92,7 @@ struct thermal_cooling_device_ops { + + struct thermal_cooling_device { + int id; +- char type[THERMAL_NAME_LENGTH]; ++ char *type; + struct device device; + struct device_node *np; + void *devdata; +diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h +index 3dbb42c637c14..9f05016d823f8 100644 +--- a/include/linux/usb/hcd.h ++++ b/include/linux/usb/hcd.h +@@ -124,6 +124,7 @@ struct usb_hcd { + #define HCD_FLAG_RH_RUNNING 5 /* root hub is running? */ + #define HCD_FLAG_DEAD 6 /* controller has died? */ + #define HCD_FLAG_INTF_AUTHORIZED 7 /* authorize interfaces? */ ++#define HCD_FLAG_DEFER_RH_REGISTER 8 /* Defer roothub registration */ + + /* The flags can be tested using these macros; they are likely to + * be slightly faster than test_bit(). +@@ -134,6 +135,7 @@ struct usb_hcd { + #define HCD_WAKEUP_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING)) + #define HCD_RH_RUNNING(hcd) ((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING)) + #define HCD_DEAD(hcd) ((hcd)->flags & (1U << HCD_FLAG_DEAD)) ++#define HCD_DEFER_RH_REGISTER(hcd) ((hcd)->flags & (1U << HCD_FLAG_DEFER_RH_REGISTER)) + + /* + * Specifies if interfaces are authorized by default +diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h +index 243de74e118e7..ede7a153c69a5 100644 +--- a/include/net/bluetooth/hci.h ++++ b/include/net/bluetooth/hci.h +@@ -1503,7 +1503,7 @@ struct hci_cp_le_set_scan_enable { + } __packed; + + #define HCI_LE_USE_PEER_ADDR 0x00 +-#define HCI_LE_USE_WHITELIST 0x01 ++#define HCI_LE_USE_ACCEPT_LIST 0x01 + + #define HCI_OP_LE_CREATE_CONN 0x200d + struct hci_cp_le_create_conn { +@@ -1523,22 +1523,22 @@ struct hci_cp_le_create_conn { + + #define HCI_OP_LE_CREATE_CONN_CANCEL 0x200e + +-#define HCI_OP_LE_READ_WHITE_LIST_SIZE 0x200f +-struct hci_rp_le_read_white_list_size { ++#define HCI_OP_LE_READ_ACCEPT_LIST_SIZE 0x200f ++struct hci_rp_le_read_accept_list_size { + __u8 status; + __u8 size; + } __packed; + +-#define HCI_OP_LE_CLEAR_WHITE_LIST 0x2010 ++#define HCI_OP_LE_CLEAR_ACCEPT_LIST 0x2010 + +-#define HCI_OP_LE_ADD_TO_WHITE_LIST 0x2011 +-struct hci_cp_le_add_to_white_list { ++#define HCI_OP_LE_ADD_TO_ACCEPT_LIST 0x2011 ++struct hci_cp_le_add_to_accept_list { + __u8 bdaddr_type; + bdaddr_t bdaddr; + } __packed; + +-#define HCI_OP_LE_DEL_FROM_WHITE_LIST 0x2012 +-struct hci_cp_le_del_from_white_list { ++#define HCI_OP_LE_DEL_FROM_ACCEPT_LIST 0x2012 ++struct hci_cp_le_del_from_accept_list { + __u8 bdaddr_type; + bdaddr_t bdaddr; + } __packed; +diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h +index 09104ca14a3e4..11a92bb4d7a9f 100644 +--- a/include/net/bluetooth/hci_core.h ++++ b/include/net/bluetooth/hci_core.h +@@ -308,7 +308,7 @@ struct hci_dev { + __u8 max_page; + __u8 features[HCI_MAX_PAGES][8]; + __u8 le_features[8]; +- __u8 le_white_list_size; ++ __u8 le_accept_list_size; + __u8 le_resolv_list_size; + __u8 le_num_of_adv_sets; + __u8 le_states[8]; +@@ -364,6 +364,8 @@ struct hci_dev { + __u8 ssp_debug_mode; + __u8 hw_error_code; + __u32 clock; ++ __u16 advmon_allowlist_duration; ++ __u16 advmon_no_filter_duration; + + __u16 devid_source; + __u16 devid_vendor; +@@ -497,14 +499,14 @@ struct hci_dev { + struct hci_conn_hash conn_hash; + + struct list_head mgmt_pending; +- struct list_head blacklist; +- struct list_head whitelist; ++ struct list_head reject_list; ++ struct list_head accept_list; + struct list_head uuids; + struct list_head link_keys; + struct list_head long_term_keys; + struct list_head identity_resolving_keys; + struct list_head remote_oob_data; +- struct list_head le_white_list; ++ struct list_head le_accept_list; + struct list_head le_resolv_list; + struct list_head le_conn_params; + struct list_head pend_le_conns; +@@ -545,6 +547,14 @@ struct hci_dev { + struct delayed_work rpa_expired; + bdaddr_t rpa; + ++ enum { ++ INTERLEAVE_SCAN_NONE, ++ INTERLEAVE_SCAN_NO_FILTER, ++ INTERLEAVE_SCAN_ALLOWLIST ++ } interleave_scan_state; ++ ++ struct delayed_work interleave_scan; ++ + #if IS_ENABLED(CONFIG_BT_LEDS) + struct led_trigger *power_led; + #endif +diff --git a/include/net/flow.h b/include/net/flow.h +index b2531df3f65f1..39d0cedcddeee 100644 +--- a/include/net/flow.h ++++ b/include/net/flow.h +@@ -195,11 +195,21 @@ static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4) + return container_of(fl4, struct flowi, u.ip4); + } + ++static inline struct flowi_common *flowi4_to_flowi_common(struct flowi4 *fl4) ++{ ++ return &(flowi4_to_flowi(fl4)->u.__fl_common); ++} ++ + static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6) + { + return container_of(fl6, struct flowi, u.ip6); + } + ++static inline struct flowi_common *flowi6_to_flowi_common(struct flowi6 *fl6) ++{ ++ return &(flowi6_to_flowi(fl6)->u.__fl_common); ++} ++ + static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn) + { + return container_of(fldn, struct flowi, u.dn); +diff --git a/include/net/if_inet6.h b/include/net/if_inet6.h +index 8bf5906073bc7..e03ba8e80781a 100644 +--- a/include/net/if_inet6.h ++++ b/include/net/if_inet6.h +@@ -64,6 +64,14 @@ struct inet6_ifaddr { + + struct hlist_node addr_lst; + struct list_head if_list; ++ /* ++ * Used to safely traverse idev->addr_list in process context ++ * if the idev->lock needed to protect idev->addr_list cannot be held. ++ * In that case, add the items to this list temporarily and iterate ++ * without holding idev->lock. ++ * See addrconf_ifdown and dev_forward_change. ++ */ ++ struct list_head if_list_aux; + + struct list_head tmp_list; + struct inet6_ifaddr *ifpub; +diff --git a/include/net/route.h b/include/net/route.h +index a07c277cd33e8..2551f3f03b37e 100644 +--- a/include/net/route.h ++++ b/include/net/route.h +@@ -165,7 +165,7 @@ static inline struct rtable *ip_route_output_ports(struct net *net, struct flowi + sk ? inet_sk_flowi_flags(sk) : 0, + daddr, saddr, dport, sport, sock_net_uid(net, sk)); + if (sk) +- security_sk_classify_flow(sk, flowi4_to_flowi(fl4)); ++ security_sk_classify_flow(sk, flowi4_to_flowi_common(fl4)); + return ip_route_output_flow(net, fl4, sk); + } + +@@ -322,7 +322,7 @@ static inline struct rtable *ip_route_connect(struct flowi4 *fl4, + ip_rt_put(rt); + flowi4_update_output(fl4, oif, tos, fl4->daddr, fl4->saddr); + } +- security_sk_classify_flow(sk, flowi4_to_flowi(fl4)); ++ security_sk_classify_flow(sk, flowi4_to_flowi_common(fl4)); + return ip_route_output_flow(net, fl4, sk); + } + +@@ -338,7 +338,7 @@ static inline struct rtable *ip_route_newports(struct flowi4 *fl4, struct rtable + flowi4_update_output(fl4, sk->sk_bound_dev_if, + RT_CONN_FLAGS(sk), fl4->daddr, + fl4->saddr); +- security_sk_classify_flow(sk, flowi4_to_flowi(fl4)); ++ security_sk_classify_flow(sk, flowi4_to_flowi_common(fl4)); + return ip_route_output_flow(sock_net(sk), fl4, sk); + } + return rt; +diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h +index fac8e89aed81d..310e0dbffda99 100644 +--- a/include/scsi/libfcoe.h ++++ b/include/scsi/libfcoe.h +@@ -249,7 +249,8 @@ int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct fc_lport *, + struct fc_frame *); + + /* libfcoe funcs */ +-u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN], unsigned int, unsigned int); ++u64 fcoe_wwn_from_mac(unsigned char mac[ETH_ALEN], unsigned int scheme, ++ unsigned int port); + int fcoe_libfc_config(struct fc_lport *, struct fcoe_ctlr *, + const struct libfc_function_template *, int init_fcp); + u32 fcoe_fc_crc(struct fc_frame *fp); +diff --git a/include/sound/jack.h b/include/sound/jack.h +index 9eb2b5ec1ec41..78f3619f3de94 100644 +--- a/include/sound/jack.h ++++ b/include/sound/jack.h +@@ -62,6 +62,7 @@ struct snd_jack { + const char *id; + #ifdef CONFIG_SND_JACK_INPUT_DEV + struct input_dev *input_dev; ++ struct mutex input_dev_lock; + int registered; + int type; + char name[100]; +diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h +index 4a3ab0ed6e062..1c714336b8635 100644 +--- a/include/trace/events/rxrpc.h ++++ b/include/trace/events/rxrpc.h +@@ -1509,7 +1509,7 @@ TRACE_EVENT(rxrpc_call_reset, + __entry->call_serial = call->rx_serial; + __entry->conn_serial = call->conn->hi_serial; + __entry->tx_seq = call->tx_hard_ack; +- __entry->rx_seq = call->ackr_seen; ++ __entry->rx_seq = call->rx_hard_ack; + ), + + TP_printk("c=%08x %08x:%08x r=%08x/%08x tx=%08x rx=%08x", +diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h +index 2070df64958ea..b4feeb4b216a0 100644 +--- a/include/trace/events/vmscan.h ++++ b/include/trace/events/vmscan.h +@@ -283,7 +283,7 @@ TRACE_EVENT(mm_vmscan_lru_isolate, + __field(unsigned long, nr_scanned) + __field(unsigned long, nr_skipped) + __field(unsigned long, nr_taken) +- __field(isolate_mode_t, isolate_mode) ++ __field(unsigned int, isolate_mode) + __field(int, lru) + ), + +@@ -294,7 +294,7 @@ TRACE_EVENT(mm_vmscan_lru_isolate, + __entry->nr_scanned = nr_scanned; + __entry->nr_skipped = nr_skipped; + __entry->nr_taken = nr_taken; +- __entry->isolate_mode = isolate_mode; ++ __entry->isolate_mode = (__force unsigned int)isolate_mode; + __entry->lru = lru; + ), + +diff --git a/init/Kconfig b/init/Kconfig +index 13685bffef370..22912631d79b4 100644 +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -68,6 +68,11 @@ config CC_HAS_ASM_GOTO_OUTPUT + depends on CC_HAS_ASM_GOTO + def_bool $(success,echo 'int foo(int x) { asm goto ("": "=r"(x) ::: bar); return x; bar: return 0; }' | $(CC) -x c - -c -o /dev/null) + ++config CC_HAS_ASM_GOTO_TIED_OUTPUT ++ depends on CC_HAS_ASM_GOTO_OUTPUT ++ # Detect buggy gcc and clang, fixed in gcc-11 clang-14. ++ def_bool $(success,echo 'int foo(int *x) { asm goto (".long (%l[bar]) - .\n": "+m"(*x) ::: bar); return *x; bar: return 0; }' | $CC -x c - -c -o /dev/null) ++ + config TOOLS_SUPPORT_RELR + def_bool $(success,env "CC=$(CC)" "LD=$(LD)" "NM=$(NM)" "OBJCOPY=$(OBJCOPY)" $(srctree)/scripts/tools-support-relr.sh) + +diff --git a/ipc/mqueue.c b/ipc/mqueue.c +index 05d2176cc4712..86969de170843 100644 +--- a/ipc/mqueue.c ++++ b/ipc/mqueue.c +@@ -45,6 +45,7 @@ + + struct mqueue_fs_context { + struct ipc_namespace *ipc_ns; ++ bool newns; /* Set if newly created ipc namespace */ + }; + + #define MQUEUE_MAGIC 0x19800202 +@@ -424,6 +425,14 @@ static int mqueue_get_tree(struct fs_context *fc) + { + struct mqueue_fs_context *ctx = fc->fs_private; + ++ /* ++ * With a newly created ipc namespace, we don't need to do a search ++ * for an ipc namespace match, but we still need to set s_fs_info. ++ */ ++ if (ctx->newns) { ++ fc->s_fs_info = ctx->ipc_ns; ++ return get_tree_nodev(fc, mqueue_fill_super); ++ } + return get_tree_keyed(fc, mqueue_fill_super, ctx->ipc_ns); + } + +@@ -451,6 +460,10 @@ static int mqueue_init_fs_context(struct fs_context *fc) + return 0; + } + ++/* ++ * mq_init_ns() is currently the only caller of mq_create_mount(). ++ * So the ns parameter is always a newly created ipc namespace. ++ */ + static struct vfsmount *mq_create_mount(struct ipc_namespace *ns) + { + struct mqueue_fs_context *ctx; +@@ -462,6 +475,7 @@ static struct vfsmount *mq_create_mount(struct ipc_namespace *ns) + return ERR_CAST(fc); + + ctx = fc->fs_private; ++ ctx->newns = true; + put_ipc_ns(ctx->ipc_ns); + ctx->ipc_ns = get_ipc_ns(ns); + put_user_ns(fc->user_ns); +diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c +index 4575d2d60cb10..c19e669afba0e 100644 +--- a/kernel/bpf/stackmap.c ++++ b/kernel/bpf/stackmap.c +@@ -121,7 +121,6 @@ static struct bpf_map *stack_map_alloc(union bpf_attr *attr) + return ERR_PTR(-E2BIG); + + cost = n_buckets * sizeof(struct stack_map_bucket *) + sizeof(*smap); +- cost += n_buckets * (value_size + sizeof(struct stack_map_bucket)); + err = bpf_map_charge_init(&mem, cost); + if (err) + return ERR_PTR(err); +diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c +index f8ae546798651..ee7da1f2462f5 100644 +--- a/kernel/dma/debug.c ++++ b/kernel/dma/debug.c +@@ -448,7 +448,7 @@ void debug_dma_dump_mappings(struct device *dev) + * other hand, consumes a single dma_debug_entry, but inserts 'nents' + * entries into the tree. + */ +-static RADIX_TREE(dma_active_cacheline, GFP_NOWAIT); ++static RADIX_TREE(dma_active_cacheline, GFP_ATOMIC); + static DEFINE_SPINLOCK(radix_lock); + #define ACTIVE_CACHELINE_MAX_OVERLAP ((1 << RADIX_TREE_MAX_TAGS) - 1) + #define CACHELINE_PER_PAGE_SHIFT (PAGE_SHIFT - L1_CACHE_SHIFT) +diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c +index aea9104265f29..2e0f0b3fb9ab0 100644 +--- a/kernel/kexec_file.c ++++ b/kernel/kexec_file.c +@@ -108,40 +108,6 @@ int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf, + } + #endif + +-/* +- * arch_kexec_apply_relocations_add - apply relocations of type RELA +- * @pi: Purgatory to be relocated. +- * @section: Section relocations applying to. +- * @relsec: Section containing RELAs. +- * @symtab: Corresponding symtab. +- * +- * Return: 0 on success, negative errno on error. +- */ +-int __weak +-arch_kexec_apply_relocations_add(struct purgatory_info *pi, Elf_Shdr *section, +- const Elf_Shdr *relsec, const Elf_Shdr *symtab) +-{ +- pr_err("RELA relocation unsupported.\n"); +- return -ENOEXEC; +-} +- +-/* +- * arch_kexec_apply_relocations - apply relocations of type REL +- * @pi: Purgatory to be relocated. +- * @section: Section relocations applying to. +- * @relsec: Section containing RELs. +- * @symtab: Corresponding symtab. +- * +- * Return: 0 on success, negative errno on error. +- */ +-int __weak +-arch_kexec_apply_relocations(struct purgatory_info *pi, Elf_Shdr *section, +- const Elf_Shdr *relsec, const Elf_Shdr *symtab) +-{ +- pr_err("REL relocation unsupported.\n"); +- return -ENOEXEC; +-} +- + /* + * Free up memory used by kernel, initrd, and command line. This is temporary + * memory allocation which is not needed any more after these buffers have +diff --git a/kernel/ptrace.c b/kernel/ptrace.c +index d99f73f83bf5f..aab480e24bd60 100644 +--- a/kernel/ptrace.c ++++ b/kernel/ptrace.c +@@ -1219,9 +1219,8 @@ int ptrace_request(struct task_struct *child, long request, + return ptrace_resume(child, request, data); + + case PTRACE_KILL: +- if (child->exit_state) /* already dead */ +- return 0; +- return ptrace_resume(child, request, SIGKILL); ++ send_sig_info(SIGKILL, SEND_SIG_NOINFO, child); ++ return 0; + + #ifdef CONFIG_HAVE_ARCH_TRACEHOOK + case PTRACE_GETREGSET: +diff --git a/kernel/rcu/Kconfig b/kernel/rcu/Kconfig +index b71e21f73c403..cd6e11403f1b1 100644 +--- a/kernel/rcu/Kconfig ++++ b/kernel/rcu/Kconfig +@@ -86,6 +86,7 @@ config TASKS_RCU + + config TASKS_RUDE_RCU + def_bool 0 ++ select IRQ_WORK + help + This option enables a task-based RCU implementation that uses + only context switch (including preemption) and user-mode +diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h +index 7c05c5ab78653..14af29fe13770 100644 +--- a/kernel/rcu/tasks.h ++++ b/kernel/rcu/tasks.h +@@ -620,6 +620,9 @@ static void rcu_tasks_be_rude(struct work_struct *work) + // Wait for one rude RCU-tasks grace period. + static void rcu_tasks_rude_wait_gp(struct rcu_tasks *rtp) + { ++ if (num_online_cpus() <= 1) ++ return; // Fastpath for only one CPU. ++ + rtp->n_ipis += cpumask_weight(cpu_online_mask); + schedule_on_each_cpu(rcu_tasks_be_rude); + } +diff --git a/kernel/scftorture.c b/kernel/scftorture.c +index 554a521ee235e..060ee0b1569a0 100644 +--- a/kernel/scftorture.c ++++ b/kernel/scftorture.c +@@ -253,9 +253,10 @@ static void scf_handler(void *scfc_in) + } + this_cpu_inc(scf_invoked_count); + if (longwait <= 0) { +- if (!(r & 0xffc0)) ++ if (!(r & 0xffc0)) { + udelay(r & 0x3f); +- goto out; ++ goto out; ++ } + } + if (r & 0xfff) + goto out; +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index 1a306ef51bbe5..bca0efc03a51d 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -4758,8 +4758,8 @@ static int tg_unthrottle_up(struct task_group *tg, void *data) + + cfs_rq->throttle_count--; + if (!cfs_rq->throttle_count) { +- cfs_rq->throttled_clock_task_time += rq_clock_task(rq) - +- cfs_rq->throttled_clock_task; ++ cfs_rq->throttled_clock_pelt_time += rq_clock_pelt(rq) - ++ cfs_rq->throttled_clock_pelt; + + /* Add cfs_rq with already running entity in the list */ + if (cfs_rq->nr_running >= 1) +@@ -4776,7 +4776,7 @@ static int tg_throttle_down(struct task_group *tg, void *data) + + /* group is entering throttled state, stop time */ + if (!cfs_rq->throttle_count) { +- cfs_rq->throttled_clock_task = rq_clock_task(rq); ++ cfs_rq->throttled_clock_pelt = rq_clock_pelt(rq); + list_del_leaf_cfs_rq(cfs_rq); + } + cfs_rq->throttle_count++; +@@ -5194,7 +5194,7 @@ static void sync_throttle(struct task_group *tg, int cpu) + pcfs_rq = tg->parent->cfs_rq[cpu]; + + cfs_rq->throttle_count = pcfs_rq->throttle_count; +- cfs_rq->throttled_clock_task = rq_clock_task(cpu_rq(cpu)); ++ cfs_rq->throttled_clock_pelt = rq_clock_pelt(cpu_rq(cpu)); + } + + /* conditionally throttle active cfs_rq's from put_prev_entity() */ +diff --git a/kernel/sched/pelt.h b/kernel/sched/pelt.h +index 45bf08e22207c..89150ced09cf4 100644 +--- a/kernel/sched/pelt.h ++++ b/kernel/sched/pelt.h +@@ -145,9 +145,9 @@ static inline u64 rq_clock_pelt(struct rq *rq) + static inline u64 cfs_rq_clock_pelt(struct cfs_rq *cfs_rq) + { + if (unlikely(cfs_rq->throttle_count)) +- return cfs_rq->throttled_clock_task - cfs_rq->throttled_clock_task_time; ++ return cfs_rq->throttled_clock_pelt - cfs_rq->throttled_clock_pelt_time; + +- return rq_clock_pelt(rq_of(cfs_rq)) - cfs_rq->throttled_clock_task_time; ++ return rq_clock_pelt(rq_of(cfs_rq)) - cfs_rq->throttled_clock_pelt_time; + } + #else + static inline u64 cfs_rq_clock_pelt(struct cfs_rq *cfs_rq) +diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h +index 08db8e095e48f..8d39f5d99172a 100644 +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -599,8 +599,8 @@ struct cfs_rq { + s64 runtime_remaining; + + u64 throttled_clock; +- u64 throttled_clock_task; +- u64 throttled_clock_task_time; ++ u64 throttled_clock_pelt; ++ u64 throttled_clock_pelt_time; + int throttled; + int throttle_count; + struct list_head throttled_list; +diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c +index 4a5d35dc490b2..a63713dcd05d5 100644 +--- a/kernel/trace/ftrace.c ++++ b/kernel/trace/ftrace.c +@@ -4427,7 +4427,7 @@ int ftrace_func_mapper_add_ip(struct ftrace_func_mapper *mapper, + * @ip: The instruction pointer address to remove the data from + * + * Returns the data if it is found, otherwise NULL. +- * Note, if the data pointer is used as the data itself, (see ++ * Note, if the data pointer is used as the data itself, (see + * ftrace_func_mapper_find_ip(), then the return value may be meaningless, + * if the data pointer was set to zero. + */ +@@ -5153,8 +5153,6 @@ int register_ftrace_direct(unsigned long ip, unsigned long addr) + __add_hash_entry(direct_functions, entry); + + ret = ftrace_set_filter_ip(&direct_ops, ip, 0, 0); +- if (ret) +- remove_hash_entry(direct_functions, entry); + + if (!ret && !(direct_ops.flags & FTRACE_OPS_FL_ENABLED)) { + ret = register_ftrace_function(&direct_ops); +@@ -5163,6 +5161,7 @@ int register_ftrace_direct(unsigned long ip, unsigned long addr) + } + + if (ret) { ++ remove_hash_entry(direct_functions, entry); + kfree(entry); + if (!direct->count) { + list_del_rcu(&direct->next); +diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c +index eb7200699cf66..3ed1723b68d56 100644 +--- a/kernel/trace/trace_events_hist.c ++++ b/kernel/trace/trace_events_hist.c +@@ -1789,8 +1789,11 @@ static int init_var_ref(struct hist_field *ref_field, + return err; + free: + kfree(ref_field->system); ++ ref_field->system = NULL; + kfree(ref_field->event_name); ++ ref_field->event_name = NULL; + kfree(ref_field->name); ++ ref_field->name = NULL; + + goto out; + } +diff --git a/mm/compaction.c b/mm/compaction.c +index dba424447473d..8dfbe86bd74f7 100644 +--- a/mm/compaction.c ++++ b/mm/compaction.c +@@ -1747,6 +1747,8 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc) + + update_fast_start_pfn(cc, free_pfn); + pfn = pageblock_start_pfn(free_pfn); ++ if (pfn < cc->zone->zone_start_pfn) ++ pfn = cc->zone->zone_start_pfn; + cc->fast_search_fail = 0; + found_block = true; + set_pageblock_skip(freepage); +diff --git a/mm/hugetlb.c b/mm/hugetlb.c +index fce705fc2848a..c42c76447e103 100644 +--- a/mm/hugetlb.c ++++ b/mm/hugetlb.c +@@ -5465,7 +5465,14 @@ int huge_pmd_unshare(struct mm_struct *mm, struct vm_area_struct *vma, + pud_clear(pud); + put_page(virt_to_page(ptep)); + mm_dec_nr_pmds(mm); +- *addr = ALIGN(*addr, HPAGE_SIZE * PTRS_PER_PTE) - HPAGE_SIZE; ++ /* ++ * This update of passed address optimizes loops sequentially ++ * processing addresses in increments of huge page size (PMD_SIZE ++ * in this case). By clearing the pud, a PUD_SIZE area is unmapped. ++ * Update address to the 'last page' in the cleared area so that ++ * calling loop can move to first page past this area. ++ */ ++ *addr |= PUD_SIZE - PMD_SIZE; + return 1; + } + #define want_pmd_share() (1) +diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c +index ecd2ffcf2ba28..140d9764c77e3 100644 +--- a/net/bluetooth/hci_conn.c ++++ b/net/bluetooth/hci_conn.c +@@ -240,7 +240,7 @@ int hci_disconnect(struct hci_conn *conn, __u8 reason) + { + BT_DBG("hcon %p", conn); + +- /* When we are master of an established connection and it enters ++ /* When we are central of an established connection and it enters + * the disconnect timeout, then go ahead and try to read the + * current clock offset. Processing of the result is done + * within the event handling and hci_clock_offset_evt function. +@@ -1065,16 +1065,16 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, + + hci_req_init(&req, hdev); + +- /* Disable advertising if we're active. For master role ++ /* Disable advertising if we're active. For central role + * connections most controllers will refuse to connect if +- * advertising is enabled, and for slave role connections we ++ * advertising is enabled, and for peripheral role connections we + * anyway have to disable it in order to start directed + * advertising. + */ + if (hci_dev_test_flag(hdev, HCI_LE_ADV)) + __hci_req_disable_advertising(&req); + +- /* If requested to connect as slave use directed advertising */ ++ /* If requested to connect as peripheral use directed advertising */ + if (conn->role == HCI_ROLE_SLAVE) { + /* If we're active scanning most controllers are unable + * to initiate advertising. Simply reject the attempt. +diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c +index c331b4176de73..2cb0cf035476b 100644 +--- a/net/bluetooth/hci_core.c ++++ b/net/bluetooth/hci_core.c +@@ -742,14 +742,14 @@ static int hci_init3_req(struct hci_request *req, unsigned long opt) + } + + if (hdev->commands[26] & 0x40) { +- /* Read LE White List Size */ +- hci_req_add(req, HCI_OP_LE_READ_WHITE_LIST_SIZE, ++ /* Read LE Accept List Size */ ++ hci_req_add(req, HCI_OP_LE_READ_ACCEPT_LIST_SIZE, + 0, NULL); + } + + if (hdev->commands[26] & 0x80) { +- /* Clear LE White List */ +- hci_req_add(req, HCI_OP_LE_CLEAR_WHITE_LIST, 0, NULL); ++ /* Clear LE Accept List */ ++ hci_req_add(req, HCI_OP_LE_CLEAR_ACCEPT_LIST, 0, NULL); + } + + if (hdev->commands[34] & 0x40) { +@@ -3548,13 +3548,13 @@ static int hci_suspend_notifier(struct notifier_block *nb, unsigned long action, + /* Suspend consists of two actions: + * - First, disconnect everything and make the controller not + * connectable (disabling scanning) +- * - Second, program event filter/whitelist and enable scan ++ * - Second, program event filter/accept list and enable scan + */ + ret = hci_change_suspend_state(hdev, BT_SUSPEND_DISCONNECT); + if (!ret) + state = BT_SUSPEND_DISCONNECT; + +- /* Only configure whitelist if disconnect succeeded and wake ++ /* Only configure accept list if disconnect succeeded and wake + * isn't being prevented. + */ + if (!ret && !(hdev->prevent_wake && hdev->prevent_wake(hdev))) { +@@ -3606,6 +3606,9 @@ struct hci_dev *hci_alloc_dev(void) + hdev->cur_adv_instance = 0x00; + hdev->adv_instance_timeout = 0; + ++ hdev->advmon_allowlist_duration = 300; ++ hdev->advmon_no_filter_duration = 500; ++ + hdev->sniff_max_interval = 800; + hdev->sniff_min_interval = 80; + +@@ -3654,14 +3657,14 @@ struct hci_dev *hci_alloc_dev(void) + mutex_init(&hdev->req_lock); + + INIT_LIST_HEAD(&hdev->mgmt_pending); +- INIT_LIST_HEAD(&hdev->blacklist); +- INIT_LIST_HEAD(&hdev->whitelist); ++ INIT_LIST_HEAD(&hdev->reject_list); ++ INIT_LIST_HEAD(&hdev->accept_list); + INIT_LIST_HEAD(&hdev->uuids); + INIT_LIST_HEAD(&hdev->link_keys); + INIT_LIST_HEAD(&hdev->long_term_keys); + INIT_LIST_HEAD(&hdev->identity_resolving_keys); + INIT_LIST_HEAD(&hdev->remote_oob_data); +- INIT_LIST_HEAD(&hdev->le_white_list); ++ INIT_LIST_HEAD(&hdev->le_accept_list); + INIT_LIST_HEAD(&hdev->le_resolv_list); + INIT_LIST_HEAD(&hdev->le_conn_params); + INIT_LIST_HEAD(&hdev->pend_le_conns); +@@ -3877,8 +3880,8 @@ void hci_cleanup_dev(struct hci_dev *hdev) + destroy_workqueue(hdev->req_workqueue); + + hci_dev_lock(hdev); +- hci_bdaddr_list_clear(&hdev->blacklist); +- hci_bdaddr_list_clear(&hdev->whitelist); ++ hci_bdaddr_list_clear(&hdev->reject_list); ++ hci_bdaddr_list_clear(&hdev->accept_list); + hci_uuids_clear(hdev); + hci_link_keys_clear(hdev); + hci_smp_ltks_clear(hdev); +@@ -3886,7 +3889,7 @@ void hci_cleanup_dev(struct hci_dev *hdev) + hci_remote_oob_data_clear(hdev); + hci_adv_instances_clear(hdev); + hci_adv_monitors_clear(hdev); +- hci_bdaddr_list_clear(&hdev->le_white_list); ++ hci_bdaddr_list_clear(&hdev->le_accept_list); + hci_bdaddr_list_clear(&hdev->le_resolv_list); + hci_conn_params_clear_all(hdev); + hci_discovery_filter_clear(hdev); +diff --git a/net/bluetooth/hci_debugfs.c b/net/bluetooth/hci_debugfs.c +index 5e8af2658e44a..338833f123659 100644 +--- a/net/bluetooth/hci_debugfs.c ++++ b/net/bluetooth/hci_debugfs.c +@@ -125,7 +125,7 @@ static int device_list_show(struct seq_file *f, void *ptr) + struct bdaddr_list *b; + + hci_dev_lock(hdev); +- list_for_each_entry(b, &hdev->whitelist, list) ++ list_for_each_entry(b, &hdev->accept_list, list) + seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type); + list_for_each_entry(p, &hdev->le_conn_params, list) { + seq_printf(f, "%pMR (type %u) %u\n", &p->addr, p->addr_type, +@@ -144,7 +144,7 @@ static int blacklist_show(struct seq_file *f, void *p) + struct bdaddr_list *b; + + hci_dev_lock(hdev); +- list_for_each_entry(b, &hdev->blacklist, list) ++ list_for_each_entry(b, &hdev->reject_list, list) + seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type); + hci_dev_unlock(hdev); + +@@ -734,7 +734,7 @@ static int white_list_show(struct seq_file *f, void *ptr) + struct bdaddr_list *b; + + hci_dev_lock(hdev); +- list_for_each_entry(b, &hdev->le_white_list, list) ++ list_for_each_entry(b, &hdev->le_accept_list, list) + seq_printf(f, "%pMR (type %u)\n", &b->bdaddr, b->bdaddr_type); + hci_dev_unlock(hdev); + +@@ -1145,7 +1145,7 @@ void hci_debugfs_create_le(struct hci_dev *hdev) + &force_static_address_fops); + + debugfs_create_u8("white_list_size", 0444, hdev->debugfs, +- &hdev->le_white_list_size); ++ &hdev->le_accept_list_size); + debugfs_create_file("white_list", 0444, hdev->debugfs, hdev, + &white_list_fops); + debugfs_create_u8("resolv_list_size", 0444, hdev->debugfs, +diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c +index e926e80d9731b..954b29605c942 100644 +--- a/net/bluetooth/hci_event.c ++++ b/net/bluetooth/hci_event.c +@@ -236,7 +236,7 @@ static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb) + + hdev->ssp_debug_mode = 0; + +- hci_bdaddr_list_clear(&hdev->le_white_list); ++ hci_bdaddr_list_clear(&hdev->le_accept_list); + hci_bdaddr_list_clear(&hdev->le_resolv_list); + } + +@@ -1456,21 +1456,21 @@ static void hci_cc_le_read_num_adv_sets(struct hci_dev *hdev, + hdev->le_num_of_adv_sets = rp->num_of_sets; + } + +-static void hci_cc_le_read_white_list_size(struct hci_dev *hdev, +- struct sk_buff *skb) ++static void hci_cc_le_read_accept_list_size(struct hci_dev *hdev, ++ struct sk_buff *skb) + { +- struct hci_rp_le_read_white_list_size *rp = (void *) skb->data; ++ struct hci_rp_le_read_accept_list_size *rp = (void *)skb->data; + + BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size); + + if (rp->status) + return; + +- hdev->le_white_list_size = rp->size; ++ hdev->le_accept_list_size = rp->size; + } + +-static void hci_cc_le_clear_white_list(struct hci_dev *hdev, +- struct sk_buff *skb) ++static void hci_cc_le_clear_accept_list(struct hci_dev *hdev, ++ struct sk_buff *skb) + { + __u8 status = *((__u8 *) skb->data); + +@@ -1479,13 +1479,13 @@ static void hci_cc_le_clear_white_list(struct hci_dev *hdev, + if (status) + return; + +- hci_bdaddr_list_clear(&hdev->le_white_list); ++ hci_bdaddr_list_clear(&hdev->le_accept_list); + } + +-static void hci_cc_le_add_to_white_list(struct hci_dev *hdev, +- struct sk_buff *skb) ++static void hci_cc_le_add_to_accept_list(struct hci_dev *hdev, ++ struct sk_buff *skb) + { +- struct hci_cp_le_add_to_white_list *sent; ++ struct hci_cp_le_add_to_accept_list *sent; + __u8 status = *((__u8 *) skb->data); + + BT_DBG("%s status 0x%2.2x", hdev->name, status); +@@ -1493,18 +1493,18 @@ static void hci_cc_le_add_to_white_list(struct hci_dev *hdev, + if (status) + return; + +- sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_WHITE_LIST); ++ sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_ACCEPT_LIST); + if (!sent) + return; + +- hci_bdaddr_list_add(&hdev->le_white_list, &sent->bdaddr, +- sent->bdaddr_type); ++ hci_bdaddr_list_add(&hdev->le_accept_list, &sent->bdaddr, ++ sent->bdaddr_type); + } + +-static void hci_cc_le_del_from_white_list(struct hci_dev *hdev, +- struct sk_buff *skb) ++static void hci_cc_le_del_from_accept_list(struct hci_dev *hdev, ++ struct sk_buff *skb) + { +- struct hci_cp_le_del_from_white_list *sent; ++ struct hci_cp_le_del_from_accept_list *sent; + __u8 status = *((__u8 *) skb->data); + + BT_DBG("%s status 0x%2.2x", hdev->name, status); +@@ -1512,11 +1512,11 @@ static void hci_cc_le_del_from_white_list(struct hci_dev *hdev, + if (status) + return; + +- sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_WHITE_LIST); ++ sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_ACCEPT_LIST); + if (!sent) + return; + +- hci_bdaddr_list_del(&hdev->le_white_list, &sent->bdaddr, ++ hci_bdaddr_list_del(&hdev->le_accept_list, &sent->bdaddr, + sent->bdaddr_type); + } + +@@ -2331,7 +2331,7 @@ static void cs_le_create_conn(struct hci_dev *hdev, bdaddr_t *peer_addr, + /* We don't want the connection attempt to stick around + * indefinitely since LE doesn't have a page timeout concept + * like BR/EDR. Set a timer for any connection that doesn't use +- * the white list for connecting. ++ * the accept list for connecting. + */ + if (filter_policy == HCI_LE_USE_PEER_ADDR) + queue_delayed_work(conn->hdev->workqueue, +@@ -2587,7 +2587,7 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) + * only used during suspend. + */ + if (ev->link_type == ACL_LINK && +- hci_bdaddr_list_lookup_with_flags(&hdev->whitelist, ++ hci_bdaddr_list_lookup_with_flags(&hdev->accept_list, + &ev->bdaddr, + BDADDR_BREDR)) { + conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr, +@@ -2709,28 +2709,28 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) + return; + } + +- if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr, ++ hci_dev_lock(hdev); ++ ++ if (hci_bdaddr_list_lookup(&hdev->reject_list, &ev->bdaddr, + BDADDR_BREDR)) { + hci_reject_conn(hdev, &ev->bdaddr); +- return; ++ goto unlock; + } + +- /* Require HCI_CONNECTABLE or a whitelist entry to accept the ++ /* Require HCI_CONNECTABLE or an accept list entry to accept the + * connection. These features are only touched through mgmt so + * only do the checks if HCI_MGMT is set. + */ + if (hci_dev_test_flag(hdev, HCI_MGMT) && + !hci_dev_test_flag(hdev, HCI_CONNECTABLE) && +- !hci_bdaddr_list_lookup_with_flags(&hdev->whitelist, &ev->bdaddr, ++ !hci_bdaddr_list_lookup_with_flags(&hdev->accept_list, &ev->bdaddr, + BDADDR_BREDR)) { + hci_reject_conn(hdev, &ev->bdaddr); +- return; ++ goto unlock; + } + + /* Connection accepted */ + +- hci_dev_lock(hdev); +- + ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr); + if (ie) + memcpy(ie->data.dev_class, ev->dev_class, 3); +@@ -2742,8 +2742,7 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) + HCI_ROLE_SLAVE); + if (!conn) { + bt_dev_err(hdev, "no memory for new connection"); +- hci_dev_unlock(hdev); +- return; ++ goto unlock; + } + } + +@@ -2759,9 +2758,9 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) + bacpy(&cp.bdaddr, &ev->bdaddr); + + if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER)) +- cp.role = 0x00; /* Become master */ ++ cp.role = 0x00; /* Become central */ + else +- cp.role = 0x01; /* Remain slave */ ++ cp.role = 0x01; /* Remain peripheral */ + + hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp); + } else if (!(flags & HCI_PROTO_DEFER)) { +@@ -2783,6 +2782,10 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) + conn->state = BT_CONNECT2; + hci_connect_cfm(conn, 0); + } ++ ++ return; ++unlock: ++ hci_dev_unlock(hdev); + } + + static u8 hci_to_mgmt_reason(u8 err) +@@ -3481,20 +3484,20 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb, + hci_cc_le_set_scan_enable(hdev, skb); + break; + +- case HCI_OP_LE_READ_WHITE_LIST_SIZE: +- hci_cc_le_read_white_list_size(hdev, skb); ++ case HCI_OP_LE_READ_ACCEPT_LIST_SIZE: ++ hci_cc_le_read_accept_list_size(hdev, skb); + break; + +- case HCI_OP_LE_CLEAR_WHITE_LIST: +- hci_cc_le_clear_white_list(hdev, skb); ++ case HCI_OP_LE_CLEAR_ACCEPT_LIST: ++ hci_cc_le_clear_accept_list(hdev, skb); + break; + +- case HCI_OP_LE_ADD_TO_WHITE_LIST: +- hci_cc_le_add_to_white_list(hdev, skb); ++ case HCI_OP_LE_ADD_TO_ACCEPT_LIST: ++ hci_cc_le_add_to_accept_list(hdev, skb); + break; + +- case HCI_OP_LE_DEL_FROM_WHITE_LIST: +- hci_cc_le_del_from_white_list(hdev, skb); ++ case HCI_OP_LE_DEL_FROM_ACCEPT_LIST: ++ hci_cc_le_del_from_accept_list(hdev, skb); + break; + + case HCI_OP_LE_READ_SUPPORTED_STATES: +@@ -5153,8 +5156,8 @@ static void le_conn_complete_evt(struct hci_dev *hdev, u8 status, + conn->dst_type = bdaddr_type; + + /* If we didn't have a hci_conn object previously +- * but we're in master role this must be something +- * initiated using a white list. Since white list based ++ * but we're in central role this must be something ++ * initiated using an accept list. Since accept list based + * connections are not "first class citizens" we don't + * have full tracking of them. Therefore, we go ahead + * with a "best effort" approach of determining the +@@ -5204,7 +5207,7 @@ static void le_conn_complete_evt(struct hci_dev *hdev, u8 status, + addr_type = BDADDR_LE_RANDOM; + + /* Drop the connection if the device is blocked */ +- if (hci_bdaddr_list_lookup(&hdev->blacklist, &conn->dst, addr_type)) { ++ if (hci_bdaddr_list_lookup(&hdev->reject_list, &conn->dst, addr_type)) { + hci_conn_drop(conn); + goto unlock; + } +@@ -5372,7 +5375,7 @@ static struct hci_conn *check_pending_le_conn(struct hci_dev *hdev, + return NULL; + + /* Ignore if the device is blocked */ +- if (hci_bdaddr_list_lookup(&hdev->blacklist, addr, addr_type)) ++ if (hci_bdaddr_list_lookup(&hdev->reject_list, addr, addr_type)) + return NULL; + + /* Most controller will fail if we try to create new connections +diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c +index d965b7c66bd62..a0f980e615052 100644 +--- a/net/bluetooth/hci_request.c ++++ b/net/bluetooth/hci_request.c +@@ -382,6 +382,53 @@ void __hci_req_write_fast_connectable(struct hci_request *req, bool enable) + hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type); + } + ++static void start_interleave_scan(struct hci_dev *hdev) ++{ ++ hdev->interleave_scan_state = INTERLEAVE_SCAN_NO_FILTER; ++ queue_delayed_work(hdev->req_workqueue, ++ &hdev->interleave_scan, 0); ++} ++ ++static bool is_interleave_scanning(struct hci_dev *hdev) ++{ ++ return hdev->interleave_scan_state != INTERLEAVE_SCAN_NONE; ++} ++ ++static void cancel_interleave_scan(struct hci_dev *hdev) ++{ ++ bt_dev_dbg(hdev, "cancelling interleave scan"); ++ ++ cancel_delayed_work_sync(&hdev->interleave_scan); ++ ++ hdev->interleave_scan_state = INTERLEAVE_SCAN_NONE; ++} ++ ++/* Return true if interleave_scan wasn't started until exiting this function, ++ * otherwise, return false ++ */ ++static bool __hci_update_interleaved_scan(struct hci_dev *hdev) ++{ ++ /* If there is at least one ADV monitors and one pending LE connection ++ * or one device to be scanned for, we should alternate between ++ * allowlist scan and one without any filters to save power. ++ */ ++ bool use_interleaving = hci_is_adv_monitoring(hdev) && ++ !(list_empty(&hdev->pend_le_conns) && ++ list_empty(&hdev->pend_le_reports)); ++ bool is_interleaving = is_interleave_scanning(hdev); ++ ++ if (use_interleaving && !is_interleaving) { ++ start_interleave_scan(hdev); ++ bt_dev_dbg(hdev, "starting interleave scan"); ++ return true; ++ } ++ ++ if (!use_interleaving && is_interleaving) ++ cancel_interleave_scan(hdev); ++ ++ return false; ++} ++ + /* This function controls the background scanning based on hdev->pend_le_conns + * list. If there are pending LE connection we start the background scanning, + * otherwise we stop it. +@@ -454,8 +501,7 @@ static void __hci_update_background_scan(struct hci_request *req) + hci_req_add_le_scan_disable(req, false); + + hci_req_add_le_passive_scan(req); +- +- BT_DBG("%s starting background scanning", hdev->name); ++ bt_dev_dbg(hdev, "starting background scanning"); + } + } + +@@ -690,17 +736,17 @@ void hci_req_add_le_scan_disable(struct hci_request *req, bool rpa_le_conn) + } + } + +-static void del_from_white_list(struct hci_request *req, bdaddr_t *bdaddr, +- u8 bdaddr_type) ++static void del_from_accept_list(struct hci_request *req, bdaddr_t *bdaddr, ++ u8 bdaddr_type) + { +- struct hci_cp_le_del_from_white_list cp; ++ struct hci_cp_le_del_from_accept_list cp; + + cp.bdaddr_type = bdaddr_type; + bacpy(&cp.bdaddr, bdaddr); + +- bt_dev_dbg(req->hdev, "Remove %pMR (0x%x) from whitelist", &cp.bdaddr, ++ bt_dev_dbg(req->hdev, "Remove %pMR (0x%x) from accept list", &cp.bdaddr, + cp.bdaddr_type); +- hci_req_add(req, HCI_OP_LE_DEL_FROM_WHITE_LIST, sizeof(cp), &cp); ++ hci_req_add(req, HCI_OP_LE_DEL_FROM_ACCEPT_LIST, sizeof(cp), &cp); + + if (use_ll_privacy(req->hdev) && + hci_dev_test_flag(req->hdev, HCI_ENABLE_LL_PRIVACY)) { +@@ -719,31 +765,31 @@ static void del_from_white_list(struct hci_request *req, bdaddr_t *bdaddr, + } + } + +-/* Adds connection to white list if needed. On error, returns -1. */ +-static int add_to_white_list(struct hci_request *req, +- struct hci_conn_params *params, u8 *num_entries, +- bool allow_rpa) ++/* Adds connection to accept list if needed. On error, returns -1. */ ++static int add_to_accept_list(struct hci_request *req, ++ struct hci_conn_params *params, u8 *num_entries, ++ bool allow_rpa) + { +- struct hci_cp_le_add_to_white_list cp; ++ struct hci_cp_le_add_to_accept_list cp; + struct hci_dev *hdev = req->hdev; + +- /* Already in white list */ +- if (hci_bdaddr_list_lookup(&hdev->le_white_list, ¶ms->addr, ++ /* Already in accept list */ ++ if (hci_bdaddr_list_lookup(&hdev->le_accept_list, ¶ms->addr, + params->addr_type)) + return 0; + + /* Select filter policy to accept all advertising */ +- if (*num_entries >= hdev->le_white_list_size) ++ if (*num_entries >= hdev->le_accept_list_size) + return -1; + +- /* White list can not be used with RPAs */ ++ /* Accept list can not be used with RPAs */ + if (!allow_rpa && + !hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY) && + hci_find_irk_by_addr(hdev, ¶ms->addr, params->addr_type)) { + return -1; + } + +- /* During suspend, only wakeable devices can be in whitelist */ ++ /* During suspend, only wakeable devices can be in accept list */ + if (hdev->suspended && !hci_conn_test_flag(HCI_CONN_FLAG_REMOTE_WAKEUP, + params->current_flags)) + return 0; +@@ -752,9 +798,9 @@ static int add_to_white_list(struct hci_request *req, + cp.bdaddr_type = params->addr_type; + bacpy(&cp.bdaddr, ¶ms->addr); + +- bt_dev_dbg(hdev, "Add %pMR (0x%x) to whitelist", &cp.bdaddr, ++ bt_dev_dbg(hdev, "Add %pMR (0x%x) to accept list", &cp.bdaddr, + cp.bdaddr_type); +- hci_req_add(req, HCI_OP_LE_ADD_TO_WHITE_LIST, sizeof(cp), &cp); ++ hci_req_add(req, HCI_OP_LE_ADD_TO_ACCEPT_LIST, sizeof(cp), &cp); + + if (use_ll_privacy(hdev) && + hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY)) { +@@ -782,27 +828,31 @@ static int add_to_white_list(struct hci_request *req, + return 0; + } + +-static u8 update_white_list(struct hci_request *req) ++static u8 update_accept_list(struct hci_request *req) + { + struct hci_dev *hdev = req->hdev; + struct hci_conn_params *params; + struct bdaddr_list *b; + u8 num_entries = 0; + bool pend_conn, pend_report; +- /* We allow whitelisting even with RPAs in suspend. In the worst case, +- * we won't be able to wake from devices that use the privacy1.2 ++ /* We allow usage of accept list even with RPAs in suspend. In the worst ++ * case, we won't be able to wake from devices that use the privacy1.2 + * features. Additionally, once we support privacy1.2 and IRK + * offloading, we can update this to also check for those conditions. + */ + bool allow_rpa = hdev->suspended; + +- /* Go through the current white list programmed into the ++ if (use_ll_privacy(hdev) && ++ hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY)) ++ allow_rpa = true; ++ ++ /* Go through the current accept list programmed into the + * controller one by one and check if that address is still + * in the list of pending connections or list of devices to + * report. If not present in either list, then queue the + * command to remove it from the controller. + */ +- list_for_each_entry(b, &hdev->le_white_list, list) { ++ list_for_each_entry(b, &hdev->le_accept_list, list) { + pend_conn = hci_pend_le_action_lookup(&hdev->pend_le_conns, + &b->bdaddr, + b->bdaddr_type); +@@ -811,14 +861,14 @@ static u8 update_white_list(struct hci_request *req) + b->bdaddr_type); + + /* If the device is not likely to connect or report, +- * remove it from the whitelist. ++ * remove it from the accept list. + */ + if (!pend_conn && !pend_report) { +- del_from_white_list(req, &b->bdaddr, b->bdaddr_type); ++ del_from_accept_list(req, &b->bdaddr, b->bdaddr_type); + continue; + } + +- /* White list can not be used with RPAs */ ++ /* Accept list can not be used with RPAs */ + if (!allow_rpa && + !hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY) && + hci_find_irk_by_addr(hdev, &b->bdaddr, b->bdaddr_type)) { +@@ -828,39 +878,44 @@ static u8 update_white_list(struct hci_request *req) + num_entries++; + } + +- /* Since all no longer valid white list entries have been ++ /* Since all no longer valid accept list entries have been + * removed, walk through the list of pending connections + * and ensure that any new device gets programmed into + * the controller. + * + * If the list of the devices is larger than the list of +- * available white list entries in the controller, then ++ * available accept list entries in the controller, then + * just abort and return filer policy value to not use the +- * white list. ++ * accept list. + */ + list_for_each_entry(params, &hdev->pend_le_conns, action) { +- if (add_to_white_list(req, params, &num_entries, allow_rpa)) ++ if (add_to_accept_list(req, params, &num_entries, allow_rpa)) + return 0x00; + } + + /* After adding all new pending connections, walk through + * the list of pending reports and also add these to the +- * white list if there is still space. Abort if space runs out. ++ * accept list if there is still space. Abort if space runs out. + */ + list_for_each_entry(params, &hdev->pend_le_reports, action) { +- if (add_to_white_list(req, params, &num_entries, allow_rpa)) ++ if (add_to_accept_list(req, params, &num_entries, allow_rpa)) + return 0x00; + } + +- /* Once the controller offloading of advertisement monitor is in place, +- * the if condition should include the support of MSFT extension +- * support. If suspend is ongoing, whitelist should be the default to +- * prevent waking by random advertisements. ++ /* Use the allowlist unless the following conditions are all true: ++ * - We are not currently suspending ++ * - There are 1 or more ADV monitors registered ++ * - Interleaved scanning is not currently using the allowlist ++ * ++ * Once the controller offloading of advertisement monitor is in place, ++ * the above condition should include the support of MSFT extension ++ * support. + */ +- if (!idr_is_empty(&hdev->adv_monitors_idr) && !hdev->suspended) ++ if (!idr_is_empty(&hdev->adv_monitors_idr) && !hdev->suspended && ++ hdev->interleave_scan_state != INTERLEAVE_SCAN_ALLOWLIST) + return 0x00; + +- /* Select filter policy to use white list */ ++ /* Select filter policy to use accept list */ + return 0x01; + } + +@@ -1010,20 +1065,24 @@ void hci_req_add_le_passive_scan(struct hci_request *req) + &own_addr_type)) + return; + +- /* Adding or removing entries from the white list must ++ if (__hci_update_interleaved_scan(hdev)) ++ return; ++ ++ bt_dev_dbg(hdev, "interleave state %d", hdev->interleave_scan_state); ++ /* Adding or removing entries from the accept list must + * happen before enabling scanning. The controller does +- * not allow white list modification while scanning. ++ * not allow accept list modification while scanning. + */ +- filter_policy = update_white_list(req); ++ filter_policy = update_accept_list(req); + + /* When the controller is using random resolvable addresses and + * with that having LE privacy enabled, then controllers with + * Extended Scanner Filter Policies support can now enable support + * for handling directed advertising. + * +- * So instead of using filter polices 0x00 (no whitelist) +- * and 0x01 (whitelist enabled) use the new filter policies +- * 0x02 (no whitelist) and 0x03 (whitelist enabled). ++ * So instead of using filter polices 0x00 (no accept list) ++ * and 0x01 (accept list enabled) use the new filter policies ++ * 0x02 (no accept list) and 0x03 (accept list enabled). + */ + if (hci_dev_test_flag(hdev, HCI_PRIVACY) && + (hdev->le_features[0] & HCI_LE_EXT_SCAN_POLICY)) +@@ -1043,7 +1102,8 @@ void hci_req_add_le_passive_scan(struct hci_request *req) + interval = hdev->le_scan_interval; + } + +- bt_dev_dbg(hdev, "LE passive scan with whitelist = %d", filter_policy); ++ bt_dev_dbg(hdev, "LE passive scan with accept list = %d", ++ filter_policy); + hci_req_start_scan(req, LE_SCAN_PASSIVE, interval, window, + own_addr_type, filter_policy, addr_resolv); + } +@@ -1091,7 +1151,7 @@ static void hci_req_set_event_filter(struct hci_request *req) + /* Always clear event filter when starting */ + hci_req_clear_event_filter(req); + +- list_for_each_entry(b, &hdev->whitelist, list) { ++ list_for_each_entry(b, &hdev->accept_list, list) { + if (!hci_conn_test_flag(HCI_CONN_FLAG_REMOTE_WAKEUP, + b->current_flags)) + continue; +@@ -1884,6 +1944,62 @@ unlock: + hci_dev_unlock(hdev); + } + ++static int hci_req_add_le_interleaved_scan(struct hci_request *req, ++ unsigned long opt) ++{ ++ struct hci_dev *hdev = req->hdev; ++ int ret = 0; ++ ++ hci_dev_lock(hdev); ++ ++ if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) ++ hci_req_add_le_scan_disable(req, false); ++ hci_req_add_le_passive_scan(req); ++ ++ switch (hdev->interleave_scan_state) { ++ case INTERLEAVE_SCAN_ALLOWLIST: ++ bt_dev_dbg(hdev, "next state: allowlist"); ++ hdev->interleave_scan_state = INTERLEAVE_SCAN_NO_FILTER; ++ break; ++ case INTERLEAVE_SCAN_NO_FILTER: ++ bt_dev_dbg(hdev, "next state: no filter"); ++ hdev->interleave_scan_state = INTERLEAVE_SCAN_ALLOWLIST; ++ break; ++ case INTERLEAVE_SCAN_NONE: ++ BT_ERR("unexpected error"); ++ ret = -1; ++ } ++ ++ hci_dev_unlock(hdev); ++ ++ return ret; ++} ++ ++static void interleave_scan_work(struct work_struct *work) ++{ ++ struct hci_dev *hdev = container_of(work, struct hci_dev, ++ interleave_scan.work); ++ u8 status; ++ unsigned long timeout; ++ ++ if (hdev->interleave_scan_state == INTERLEAVE_SCAN_ALLOWLIST) { ++ timeout = msecs_to_jiffies(hdev->advmon_allowlist_duration); ++ } else if (hdev->interleave_scan_state == INTERLEAVE_SCAN_NO_FILTER) { ++ timeout = msecs_to_jiffies(hdev->advmon_no_filter_duration); ++ } else { ++ bt_dev_err(hdev, "unexpected error"); ++ return; ++ } ++ ++ hci_req_sync(hdev, hci_req_add_le_interleaved_scan, 0, ++ HCI_CMD_TIMEOUT, &status); ++ ++ /* Don't continue interleaving if it was canceled */ ++ if (is_interleave_scanning(hdev)) ++ queue_delayed_work(hdev->req_workqueue, ++ &hdev->interleave_scan, timeout); ++} ++ + int hci_get_random_address(struct hci_dev *hdev, bool require_privacy, + bool use_rpa, struct adv_info *adv_instance, + u8 *own_addr_type, bdaddr_t *rand_addr) +@@ -2447,11 +2563,11 @@ int hci_update_random_address(struct hci_request *req, bool require_privacy, + return 0; + } + +-static bool disconnected_whitelist_entries(struct hci_dev *hdev) ++static bool disconnected_accept_list_entries(struct hci_dev *hdev) + { + struct bdaddr_list *b; + +- list_for_each_entry(b, &hdev->whitelist, list) { ++ list_for_each_entry(b, &hdev->accept_list, list) { + struct hci_conn *conn; + + conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &b->bdaddr); +@@ -2483,7 +2599,7 @@ void __hci_req_update_scan(struct hci_request *req) + return; + + if (hci_dev_test_flag(hdev, HCI_CONNECTABLE) || +- disconnected_whitelist_entries(hdev)) ++ disconnected_accept_list_entries(hdev)) + scan = SCAN_PAGE; + else + scan = SCAN_DISABLED; +@@ -2972,7 +3088,7 @@ static int active_scan(struct hci_request *req, unsigned long opt) + uint16_t interval = opt; + struct hci_dev *hdev = req->hdev; + u8 own_addr_type; +- /* White list is not used for discovery */ ++ /* Accept list is not used for discovery */ + u8 filter_policy = 0x00; + /* Discovery doesn't require controller address resolution */ + bool addr_resolv = false; +@@ -3311,6 +3427,7 @@ void hci_request_setup(struct hci_dev *hdev) + INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work); + INIT_DELAYED_WORK(&hdev->le_scan_restart, le_scan_restart_work); + INIT_DELAYED_WORK(&hdev->adv_instance_expire, adv_timeout_expire); ++ INIT_DELAYED_WORK(&hdev->interleave_scan, interleave_scan_work); + } + + void hci_request_cancel_all(struct hci_dev *hdev) +@@ -3330,4 +3447,6 @@ void hci_request_cancel_all(struct hci_dev *hdev) + cancel_delayed_work_sync(&hdev->adv_instance_expire); + hdev->adv_instance_timeout = 0; + } ++ ++ cancel_interleave_scan(hdev); + } +diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c +index 53f85d7c5f9e5..71d18d3295f50 100644 +--- a/net/bluetooth/hci_sock.c ++++ b/net/bluetooth/hci_sock.c +@@ -897,7 +897,7 @@ static int hci_sock_release(struct socket *sock) + return 0; + } + +-static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg) ++static int hci_sock_reject_list_add(struct hci_dev *hdev, void __user *arg) + { + bdaddr_t bdaddr; + int err; +@@ -907,14 +907,14 @@ static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg) + + hci_dev_lock(hdev); + +- err = hci_bdaddr_list_add(&hdev->blacklist, &bdaddr, BDADDR_BREDR); ++ err = hci_bdaddr_list_add(&hdev->reject_list, &bdaddr, BDADDR_BREDR); + + hci_dev_unlock(hdev); + + return err; + } + +-static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg) ++static int hci_sock_reject_list_del(struct hci_dev *hdev, void __user *arg) + { + bdaddr_t bdaddr; + int err; +@@ -924,7 +924,7 @@ static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg) + + hci_dev_lock(hdev); + +- err = hci_bdaddr_list_del(&hdev->blacklist, &bdaddr, BDADDR_BREDR); ++ err = hci_bdaddr_list_del(&hdev->reject_list, &bdaddr, BDADDR_BREDR); + + hci_dev_unlock(hdev); + +@@ -964,12 +964,12 @@ static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd, + case HCIBLOCKADDR: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; +- return hci_sock_blacklist_add(hdev, (void __user *)arg); ++ return hci_sock_reject_list_add(hdev, (void __user *)arg); + + case HCIUNBLOCKADDR: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; +- return hci_sock_blacklist_del(hdev, (void __user *)arg); ++ return hci_sock_reject_list_del(hdev, (void __user *)arg); + } + + return -ENOIOCTLCMD; +diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c +index 012c1a0abda8c..2557cd917f5ed 100644 +--- a/net/bluetooth/l2cap_core.c ++++ b/net/bluetooth/l2cap_core.c +@@ -1688,8 +1688,8 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn) + if (hcon->out) + smp_conn_security(hcon, hcon->pending_sec_level); + +- /* For LE slave connections, make sure the connection interval +- * is in the range of the minium and maximum interval that has ++ /* For LE peripheral connections, make sure the connection interval ++ * is in the range of the minimum and maximum interval that has + * been configured for this connection. If not, then trigger + * the connection update procedure. + */ +@@ -7540,7 +7540,7 @@ static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid, + BT_DBG("chan %p, len %d", chan, skb->len); + + /* If we receive data on a fixed channel before the info req/rsp +- * procdure is done simply assume that the channel is supported ++ * procedure is done simply assume that the channel is supported + * and mark it as ready. + */ + if (chan->chan_type == L2CAP_CHAN_FIXED) +@@ -7652,7 +7652,7 @@ static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb) + * at least ensure that we ignore incoming data from them. + */ + if (hcon->type == LE_LINK && +- hci_bdaddr_list_lookup(&hcon->hdev->blacklist, &hcon->dst, ++ hci_bdaddr_list_lookup(&hcon->hdev->reject_list, &hcon->dst, + bdaddr_dst_type(hcon))) { + kfree_skb(skb); + return; +@@ -8108,7 +8108,7 @@ static void l2cap_connect_cfm(struct hci_conn *hcon, u8 status) + dst_type = bdaddr_dst_type(hcon); + + /* If device is blocked, do not create channels for it */ +- if (hci_bdaddr_list_lookup(&hdev->blacklist, &hcon->dst, dst_type)) ++ if (hci_bdaddr_list_lookup(&hdev->reject_list, &hcon->dst, dst_type)) + return; + + /* Find fixed channels and notify them of the new connection. We +diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c +index 08f67f91d427f..878bf73822449 100644 +--- a/net/bluetooth/mgmt.c ++++ b/net/bluetooth/mgmt.c +@@ -4041,7 +4041,7 @@ static int get_device_flags(struct sock *sk, struct hci_dev *hdev, void *data, + memset(&rp, 0, sizeof(rp)); + + if (cp->addr.type == BDADDR_BREDR) { +- br_params = hci_bdaddr_list_lookup_with_flags(&hdev->whitelist, ++ br_params = hci_bdaddr_list_lookup_with_flags(&hdev->accept_list, + &cp->addr.bdaddr, + cp->addr.type); + if (!br_params) +@@ -4109,7 +4109,7 @@ static int set_device_flags(struct sock *sk, struct hci_dev *hdev, void *data, + hci_dev_lock(hdev); + + if (cp->addr.type == BDADDR_BREDR) { +- br_params = hci_bdaddr_list_lookup_with_flags(&hdev->whitelist, ++ br_params = hci_bdaddr_list_lookup_with_flags(&hdev->accept_list, + &cp->addr.bdaddr, + cp->addr.type); + +@@ -4979,7 +4979,7 @@ static int block_device(struct sock *sk, struct hci_dev *hdev, void *data, + + hci_dev_lock(hdev); + +- err = hci_bdaddr_list_add(&hdev->blacklist, &cp->addr.bdaddr, ++ err = hci_bdaddr_list_add(&hdev->reject_list, &cp->addr.bdaddr, + cp->addr.type); + if (err < 0) { + status = MGMT_STATUS_FAILED; +@@ -5015,7 +5015,7 @@ static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data, + + hci_dev_lock(hdev); + +- err = hci_bdaddr_list_del(&hdev->blacklist, &cp->addr.bdaddr, ++ err = hci_bdaddr_list_del(&hdev->reject_list, &cp->addr.bdaddr, + cp->addr.type); + if (err < 0) { + status = MGMT_STATUS_INVALID_PARAMS; +@@ -6506,7 +6506,7 @@ static int add_device(struct sock *sk, struct hci_dev *hdev, + goto unlock; + } + +- err = hci_bdaddr_list_add_with_flags(&hdev->whitelist, ++ err = hci_bdaddr_list_add_with_flags(&hdev->accept_list, + &cp->addr.bdaddr, + cp->addr.type, 0); + if (err) +@@ -6604,7 +6604,7 @@ static int remove_device(struct sock *sk, struct hci_dev *hdev, + } + + if (cp->addr.type == BDADDR_BREDR) { +- err = hci_bdaddr_list_del(&hdev->whitelist, ++ err = hci_bdaddr_list_del(&hdev->accept_list, + &cp->addr.bdaddr, + cp->addr.type); + if (err) { +@@ -6675,7 +6675,7 @@ static int remove_device(struct sock *sk, struct hci_dev *hdev, + goto unlock; + } + +- list_for_each_entry_safe(b, btmp, &hdev->whitelist, list) { ++ list_for_each_entry_safe(b, btmp, &hdev->accept_list, list) { + device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type); + list_del(&b->list); + kfree(b); +diff --git a/net/bluetooth/mgmt_config.c b/net/bluetooth/mgmt_config.c +index b30b571f8caf8..2d3ad288c78ac 100644 +--- a/net/bluetooth/mgmt_config.c ++++ b/net/bluetooth/mgmt_config.c +@@ -67,6 +67,8 @@ int read_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data, + HDEV_PARAM_U16(0x001a, le_supv_timeout), + HDEV_PARAM_U16_JIFFIES_TO_MSECS(0x001b, + def_le_autoconnect_timeout), ++ HDEV_PARAM_U16(0x001d, advmon_allowlist_duration), ++ HDEV_PARAM_U16(0x001e, advmon_no_filter_duration), + }; + struct mgmt_rp_read_def_system_config *rp = (void *)params; + +@@ -138,6 +140,8 @@ int set_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data, + case 0x0019: + case 0x001a: + case 0x001b: ++ case 0x001d: ++ case 0x001e: + if (len != sizeof(u16)) { + bt_dev_warn(hdev, "invalid length %d, exp %zu for type %d", + len, sizeof(u16), type); +@@ -251,6 +255,12 @@ int set_def_system_config(struct sock *sk, struct hci_dev *hdev, void *data, + hdev->def_le_autoconnect_timeout = + msecs_to_jiffies(TLV_GET_LE16(buffer)); + break; ++ case 0x0001d: ++ hdev->advmon_allowlist_duration = TLV_GET_LE16(buffer); ++ break; ++ case 0x0001e: ++ hdev->advmon_no_filter_duration = TLV_GET_LE16(buffer); ++ break; + default: + bt_dev_warn(hdev, "unsupported parameter %u", type); + break; +diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c +index 2f2b8ddc4dd5d..df254c7de2dd6 100644 +--- a/net/bluetooth/sco.c ++++ b/net/bluetooth/sco.c +@@ -575,19 +575,24 @@ static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen + addr->sa_family != AF_BLUETOOTH) + return -EINVAL; + +- if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) +- return -EBADFD; ++ lock_sock(sk); ++ if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND) { ++ err = -EBADFD; ++ goto done; ++ } + +- if (sk->sk_type != SOCK_SEQPACKET) +- return -EINVAL; ++ if (sk->sk_type != SOCK_SEQPACKET) { ++ err = -EINVAL; ++ goto done; ++ } + + hdev = hci_get_route(&sa->sco_bdaddr, &sco_pi(sk)->src, BDADDR_BREDR); +- if (!hdev) +- return -EHOSTUNREACH; ++ if (!hdev) { ++ err = -EHOSTUNREACH; ++ goto done; ++ } + hci_dev_lock(hdev); + +- lock_sock(sk); +- + /* Set destination address and psm */ + bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr); + +diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c +index 2b7879afc333b..b7374dbee23a3 100644 +--- a/net/bluetooth/smp.c ++++ b/net/bluetooth/smp.c +@@ -909,8 +909,8 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth, + hcon->pending_sec_level = BT_SECURITY_HIGH; + } + +- /* If both devices have Keyoard-Display I/O, the master +- * Confirms and the slave Enters the passkey. ++ /* If both devices have Keyboard-Display I/O, the initiator ++ * Confirms and the responder Enters the passkey. + */ + if (smp->method == OVERLAP) { + if (hcon->role == HCI_ROLE_MASTER) +@@ -3076,7 +3076,7 @@ static void bredr_pairing(struct l2cap_chan *chan) + if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags)) + return; + +- /* Only master may initiate SMP over BR/EDR */ ++ /* Only initiator may initiate SMP over BR/EDR */ + if (hcon->role != HCI_ROLE_MASTER) + return; + +diff --git a/net/core/dev.c b/net/core/dev.c +index 0bab2aca07fd3..af52050b0f383 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -3241,11 +3241,15 @@ int skb_checksum_help(struct sk_buff *skb) + } + + offset = skb_checksum_start_offset(skb); +- BUG_ON(offset >= skb_headlen(skb)); ++ ret = -EINVAL; ++ if (WARN_ON_ONCE(offset >= skb_headlen(skb))) ++ goto out; ++ + csum = skb_checksum(skb, offset, skb->len - offset, 0); + + offset += skb->csum_offset; +- BUG_ON(offset + sizeof(__sum16) > skb_headlen(skb)); ++ if (WARN_ON_ONCE(offset + sizeof(__sum16) > skb_headlen(skb))) ++ goto out; + + ret = skb_ensure_writable(skb, offset + sizeof(__sum16)); + if (ret) +diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c +index b0b6e6a4784e5..2455b0c0e4866 100644 +--- a/net/dccp/ipv4.c ++++ b/net/dccp/ipv4.c +@@ -464,7 +464,7 @@ static struct dst_entry* dccp_v4_route_skb(struct net *net, struct sock *sk, + .fl4_dport = dccp_hdr(skb)->dccph_sport, + }; + +- security_skb_classify_flow(skb, flowi4_to_flowi(&fl4)); ++ security_skb_classify_flow(skb, flowi4_to_flowi_common(&fl4)); + rt = ip_route_output_flow(net, &fl4, sk); + if (IS_ERR(rt)) { + IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES); +diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c +index 49f4034bf1263..2be5c69824f94 100644 +--- a/net/dccp/ipv6.c ++++ b/net/dccp/ipv6.c +@@ -203,7 +203,7 @@ static int dccp_v6_send_response(const struct sock *sk, struct request_sock *req + fl6.flowi6_oif = ireq->ir_iif; + fl6.fl6_dport = ireq->ir_rmt_port; + fl6.fl6_sport = htons(ireq->ir_num); +- security_req_classify_flow(req, flowi6_to_flowi(&fl6)); ++ security_req_classify_flow(req, flowi6_to_flowi_common(&fl6)); + + + rcu_read_lock(); +@@ -279,7 +279,7 @@ static void dccp_v6_ctl_send_reset(const struct sock *sk, struct sk_buff *rxskb) + fl6.flowi6_oif = inet6_iif(rxskb); + fl6.fl6_dport = dccp_hdr(skb)->dccph_dport; + fl6.fl6_sport = dccp_hdr(skb)->dccph_sport; +- security_skb_classify_flow(rxskb, flowi6_to_flowi(&fl6)); ++ security_skb_classify_flow(rxskb, flowi6_to_flowi_common(&fl6)); + + /* sk = NULL, but it is safe for now. RST socket required. */ + dst = ip6_dst_lookup_flow(sock_net(ctl_sk), ctl_sk, &fl6, NULL); +@@ -912,7 +912,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, + fl6.flowi6_oif = sk->sk_bound_dev_if; + fl6.fl6_dport = usin->sin6_port; + fl6.fl6_sport = inet->inet_sport; +- security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); ++ security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6)); + + opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk)); + final_p = fl6_update_dst(&fl6, opt, &final); +diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c +index b71b836cc7d19..cd65d3146c300 100644 +--- a/net/ipv4/icmp.c ++++ b/net/ipv4/icmp.c +@@ -447,7 +447,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb) + fl4.flowi4_tos = RT_TOS(ip_hdr(skb)->tos); + fl4.flowi4_proto = IPPROTO_ICMP; + fl4.flowi4_oif = l3mdev_master_ifindex(skb->dev); +- security_skb_classify_flow(skb, flowi4_to_flowi(&fl4)); ++ security_skb_classify_flow(skb, flowi4_to_flowi_common(&fl4)); + rt = ip_route_output_key(net, &fl4); + if (IS_ERR(rt)) + goto out_unlock; +@@ -503,7 +503,7 @@ static struct rtable *icmp_route_lookup(struct net *net, + route_lookup_dev = icmp_get_route_lookup_dev(skb_in); + fl4->flowi4_oif = l3mdev_master_ifindex(route_lookup_dev); + +- security_skb_classify_flow(skb_in, flowi4_to_flowi(fl4)); ++ security_skb_classify_flow(skb_in, flowi4_to_flowi_common(fl4)); + rt = ip_route_output_key_hash(net, fl4, skb_in); + if (IS_ERR(rt)) + return rt; +diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c +index addd595bb3fe6..7785a4775e58a 100644 +--- a/net/ipv4/inet_connection_sock.c ++++ b/net/ipv4/inet_connection_sock.c +@@ -602,7 +602,7 @@ struct dst_entry *inet_csk_route_req(const struct sock *sk, + (opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr, + ireq->ir_loc_addr, ireq->ir_rmt_port, + htons(ireq->ir_num), sk->sk_uid); +- security_req_classify_flow(req, flowi4_to_flowi(fl4)); ++ security_req_classify_flow(req, flowi4_to_flowi_common(fl4)); + rt = ip_route_output_flow(net, fl4, sk); + if (IS_ERR(rt)) + goto no_route; +@@ -640,7 +640,7 @@ struct dst_entry *inet_csk_route_child_sock(const struct sock *sk, + (opt && opt->opt.srr) ? opt->opt.faddr : ireq->ir_rmt_addr, + ireq->ir_loc_addr, ireq->ir_rmt_port, + htons(ireq->ir_num), sk->sk_uid); +- security_req_classify_flow(req, flowi4_to_flowi(fl4)); ++ security_req_classify_flow(req, flowi4_to_flowi_common(fl4)); + rt = ip_route_output_flow(net, fl4, sk); + if (IS_ERR(rt)) + goto no_route; +diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c +index 5e48b3d3a00db..f77b0af3cb657 100644 +--- a/net/ipv4/ip_output.c ++++ b/net/ipv4/ip_output.c +@@ -1712,7 +1712,7 @@ void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, + daddr, saddr, + tcp_hdr(skb)->source, tcp_hdr(skb)->dest, + arg->uid); +- security_skb_classify_flow(skb, flowi4_to_flowi(&fl4)); ++ security_skb_classify_flow(skb, flowi4_to_flowi_common(&fl4)); + rt = ip_route_output_key(net, &fl4); + if (IS_ERR(rt)) + return; +diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c +index 2853a3f0fc632..1bad851b3fc35 100644 +--- a/net/ipv4/ping.c ++++ b/net/ipv4/ping.c +@@ -796,7 +796,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + fl4.fl4_icmp_type = user_icmph.type; + fl4.fl4_icmp_code = user_icmph.code; + +- security_sk_classify_flow(sk, flowi4_to_flowi(&fl4)); ++ security_sk_classify_flow(sk, flowi4_to_flowi_common(&fl4)); + rt = ip_route_output_flow(net, &fl4, sk); + if (IS_ERR(rt)) { + err = PTR_ERR(rt); +diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c +index 5d95f80314f95..4899ebe569eb6 100644 +--- a/net/ipv4/raw.c ++++ b/net/ipv4/raw.c +@@ -640,7 +640,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + goto done; + } + +- security_sk_classify_flow(sk, flowi4_to_flowi(&fl4)); ++ security_sk_classify_flow(sk, flowi4_to_flowi_common(&fl4)); + rt = ip_route_output_flow(net, &fl4, sk); + if (IS_ERR(rt)) { + err = PTR_ERR(rt); +diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c +index 0b616094e7947..10b469aee4920 100644 +--- a/net/ipv4/syncookies.c ++++ b/net/ipv4/syncookies.c +@@ -424,7 +424,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) + inet_sk_flowi_flags(sk), + opt->srr ? opt->faddr : ireq->ir_rmt_addr, + ireq->ir_loc_addr, th->source, th->dest, sk->sk_uid); +- security_req_classify_flow(req, flowi4_to_flowi(&fl4)); ++ security_req_classify_flow(req, flowi4_to_flowi_common(&fl4)); + rt = ip_route_output_key(sock_net(sk), &fl4); + if (IS_ERR(rt)) { + reqsk_free(req); +diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c +index e97a2dd206e14..6056d5609167c 100644 +--- a/net/ipv4/udp.c ++++ b/net/ipv4/udp.c +@@ -1204,7 +1204,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + faddr, saddr, dport, inet->inet_sport, + sk->sk_uid); + +- security_sk_classify_flow(sk, flowi4_to_flowi(fl4)); ++ security_sk_classify_flow(sk, flowi4_to_flowi_common(fl4)); + rt = ip_route_output_flow(net, fl4, sk); + if (IS_ERR(rt)) { + err = PTR_ERR(rt); +diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c +index 86bcb18256982..0562fb321959e 100644 +--- a/net/ipv6/addrconf.c ++++ b/net/ipv6/addrconf.c +@@ -789,6 +789,7 @@ static void dev_forward_change(struct inet6_dev *idev) + { + struct net_device *dev; + struct inet6_ifaddr *ifa; ++ LIST_HEAD(tmp_addr_list); + + if (!idev) + return; +@@ -807,14 +808,24 @@ static void dev_forward_change(struct inet6_dev *idev) + } + } + ++ read_lock_bh(&idev->lock); + list_for_each_entry(ifa, &idev->addr_list, if_list) { + if (ifa->flags&IFA_F_TENTATIVE) + continue; ++ list_add_tail(&ifa->if_list_aux, &tmp_addr_list); ++ } ++ read_unlock_bh(&idev->lock); ++ ++ while (!list_empty(&tmp_addr_list)) { ++ ifa = list_first_entry(&tmp_addr_list, ++ struct inet6_ifaddr, if_list_aux); ++ list_del(&ifa->if_list_aux); + if (idev->cnf.forwarding) + addrconf_join_anycast(ifa); + else + addrconf_leave_anycast(ifa); + } ++ + inet6_netconf_notify_devconf(dev_net(dev), RTM_NEWNETCONF, + NETCONFA_FORWARDING, + dev->ifindex, &idev->cnf); +@@ -3710,7 +3721,8 @@ static int addrconf_ifdown(struct net_device *dev, bool unregister) + unsigned long event = unregister ? NETDEV_UNREGISTER : NETDEV_DOWN; + struct net *net = dev_net(dev); + struct inet6_dev *idev; +- struct inet6_ifaddr *ifa, *tmp; ++ struct inet6_ifaddr *ifa; ++ LIST_HEAD(tmp_addr_list); + bool keep_addr = false; + bool was_ready; + int state, i; +@@ -3802,16 +3814,23 @@ restart: + write_lock_bh(&idev->lock); + } + +- list_for_each_entry_safe(ifa, tmp, &idev->addr_list, if_list) { ++ list_for_each_entry(ifa, &idev->addr_list, if_list) ++ list_add_tail(&ifa->if_list_aux, &tmp_addr_list); ++ write_unlock_bh(&idev->lock); ++ ++ while (!list_empty(&tmp_addr_list)) { + struct fib6_info *rt = NULL; + bool keep; + ++ ifa = list_first_entry(&tmp_addr_list, ++ struct inet6_ifaddr, if_list_aux); ++ list_del(&ifa->if_list_aux); ++ + addrconf_del_dad_work(ifa); + + keep = keep_addr && (ifa->flags & IFA_F_PERMANENT) && + !addr_is_local(&ifa->addr); + +- write_unlock_bh(&idev->lock); + spin_lock_bh(&ifa->lock); + + if (keep) { +@@ -3842,15 +3861,14 @@ restart: + addrconf_leave_solict(ifa->idev, &ifa->addr); + } + +- write_lock_bh(&idev->lock); + if (!keep) { ++ write_lock_bh(&idev->lock); + list_del_rcu(&ifa->if_list); ++ write_unlock_bh(&idev->lock); + in6_ifa_put(ifa); + } + } + +- write_unlock_bh(&idev->lock); +- + /* Step 5: Discard anycast and multicast list */ + if (unregister) { + ipv6_ac_destroy_dev(idev); +@@ -4182,7 +4200,8 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id, + send_rs = send_mld && + ipv6_accept_ra(ifp->idev) && + ifp->idev->cnf.rtr_solicits != 0 && +- (dev->flags&IFF_LOOPBACK) == 0; ++ (dev->flags & IFF_LOOPBACK) == 0 && ++ (dev->type != ARPHRD_TUNNEL); + read_unlock_bh(&ifp->idev->lock); + + /* While dad is in progress mld report's source address is in6_addrany. +diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c +index 090575346daf6..890a9cfc6ce27 100644 +--- a/net/ipv6/af_inet6.c ++++ b/net/ipv6/af_inet6.c +@@ -819,7 +819,7 @@ int inet6_sk_rebuild_header(struct sock *sk) + fl6.fl6_dport = inet->inet_dport; + fl6.fl6_sport = inet->inet_sport; + fl6.flowi6_uid = sk->sk_uid; +- security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); ++ security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6)); + + rcu_read_lock(); + final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt), +diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c +index cc8ad7ddecdaa..206f66310a88d 100644 +--- a/net/ipv6/datagram.c ++++ b/net/ipv6/datagram.c +@@ -60,7 +60,7 @@ static void ip6_datagram_flow_key_init(struct flowi6 *fl6, struct sock *sk) + if (!fl6->flowi6_oif && ipv6_addr_is_multicast(&fl6->daddr)) + fl6->flowi6_oif = np->mcast_oif; + +- security_sk_classify_flow(sk, flowi6_to_flowi(fl6)); ++ security_sk_classify_flow(sk, flowi6_to_flowi_common(fl6)); + } + + int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr) +diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c +index cbab41d557b20..fd1f896115c1e 100644 +--- a/net/ipv6/icmp.c ++++ b/net/ipv6/icmp.c +@@ -573,7 +573,7 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, + fl6.fl6_icmp_code = code; + fl6.flowi6_uid = sock_net_uid(net, NULL); + fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, NULL); +- security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); ++ security_skb_classify_flow(skb, flowi6_to_flowi_common(&fl6)); + + np = inet6_sk(sk); + +@@ -755,7 +755,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb) + fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY; + fl6.flowi6_mark = mark; + fl6.flowi6_uid = sock_net_uid(net, NULL); +- security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); ++ security_skb_classify_flow(skb, flowi6_to_flowi_common(&fl6)); + + local_bh_disable(); + sk = icmpv6_xmit_lock(net); +@@ -1008,7 +1008,7 @@ void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6, + fl6->fl6_icmp_type = type; + fl6->fl6_icmp_code = 0; + fl6->flowi6_oif = oif; +- security_sk_classify_flow(sk, flowi6_to_flowi(fl6)); ++ security_sk_classify_flow(sk, flowi6_to_flowi_common(fl6)); + } + + static void __net_exit icmpv6_sk_exit(struct net *net) +diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c +index e315526fa244a..5a9f4d722f35d 100644 +--- a/net/ipv6/inet6_connection_sock.c ++++ b/net/ipv6/inet6_connection_sock.c +@@ -46,7 +46,7 @@ struct dst_entry *inet6_csk_route_req(const struct sock *sk, + fl6->fl6_dport = ireq->ir_rmt_port; + fl6->fl6_sport = htons(ireq->ir_num); + fl6->flowi6_uid = sk->sk_uid; +- security_req_classify_flow(req, flowi6_to_flowi(fl6)); ++ security_req_classify_flow(req, flowi6_to_flowi_common(fl6)); + + dst = ip6_dst_lookup_flow(sock_net(sk), sk, fl6, final_p); + if (IS_ERR(dst)) +@@ -95,7 +95,7 @@ static struct dst_entry *inet6_csk_route_socket(struct sock *sk, + fl6->fl6_sport = inet->inet_sport; + fl6->fl6_dport = inet->inet_dport; + fl6->flowi6_uid = sk->sk_uid; +- security_sk_classify_flow(sk, flowi6_to_flowi(fl6)); ++ security_sk_classify_flow(sk, flowi6_to_flowi_common(fl6)); + + rcu_read_lock(); + final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final); +diff --git a/net/ipv6/netfilter/nf_reject_ipv6.c b/net/ipv6/netfilter/nf_reject_ipv6.c +index 4aef6baaa55eb..bf95513736c92 100644 +--- a/net/ipv6/netfilter/nf_reject_ipv6.c ++++ b/net/ipv6/netfilter/nf_reject_ipv6.c +@@ -179,7 +179,7 @@ void nf_send_reset6(struct net *net, struct sk_buff *oldskb, int hook) + + fl6.flowi6_oif = l3mdev_master_ifindex(skb_dst(oldskb)->dev); + fl6.flowi6_mark = IP6_REPLY_MARK(net, oldskb->mark); +- security_skb_classify_flow(oldskb, flowi6_to_flowi(&fl6)); ++ security_skb_classify_flow(oldskb, flowi6_to_flowi_common(&fl6)); + dst = ip6_route_output(net, NULL, &fl6); + if (dst->error) { + dst_release(dst); +diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c +index 6caa062f68e72..6ac88fe24a8e0 100644 +--- a/net/ipv6/ping.c ++++ b/net/ipv6/ping.c +@@ -111,7 +111,7 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + fl6.flowi6_uid = sk->sk_uid; + fl6.fl6_icmp_type = user_icmph.icmp6_type; + fl6.fl6_icmp_code = user_icmph.icmp6_code; +- security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); ++ security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6)); + + ipcm6_init_sk(&ipc6, np); + ipc6.sockc.mark = sk->sk_mark; +diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c +index 38349054e361e..31eb54e92b3f9 100644 +--- a/net/ipv6/raw.c ++++ b/net/ipv6/raw.c +@@ -915,7 +915,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + fl6.flowi6_oif = np->mcast_oif; + else if (!fl6.flowi6_oif) + fl6.flowi6_oif = np->ucast_oif; +- security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); ++ security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6)); + + if (hdrincl) + fl6.flowi6_flags |= FLOWI_FLAG_KNOWN_NH; +diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c +index 5fa791cf39ca9..ca92dd6981dea 100644 +--- a/net/ipv6/syncookies.c ++++ b/net/ipv6/syncookies.c +@@ -234,7 +234,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) + fl6.fl6_dport = ireq->ir_rmt_port; + fl6.fl6_sport = inet_sk(sk)->inet_sport; + fl6.flowi6_uid = sk->sk_uid; +- security_req_classify_flow(req, flowi6_to_flowi(&fl6)); ++ security_req_classify_flow(req, flowi6_to_flowi_common(&fl6)); + + dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); + if (IS_ERR(dst)) +diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c +index df33145b876c6..303b54414a6cc 100644 +--- a/net/ipv6/tcp_ipv6.c ++++ b/net/ipv6/tcp_ipv6.c +@@ -278,7 +278,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, + opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk)); + final_p = fl6_update_dst(&fl6, opt, &final); + +- security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); ++ security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6)); + + dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); + if (IS_ERR(dst)) { +@@ -975,7 +975,7 @@ static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32 + fl6.fl6_dport = t1->dest; + fl6.fl6_sport = t1->source; + fl6.flowi6_uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL); +- security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); ++ security_skb_classify_flow(skb, flowi6_to_flowi_common(&fl6)); + + /* Pass a socket to ip6_dst_lookup either it is for RST + * Underlying function will use this to retrieve the network +diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c +index 10760164a80f4..7745d8a402091 100644 +--- a/net/ipv6/udp.c ++++ b/net/ipv6/udp.c +@@ -1497,7 +1497,7 @@ do_udp_sendmsg: + } else if (!fl6.flowi6_oif) + fl6.flowi6_oif = np->ucast_oif; + +- security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); ++ security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6)); + + if (ipc6.tclass < 0) + ipc6.tclass = np->tclass; +diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c +index e5e5036257b05..96f975777438f 100644 +--- a/net/l2tp/l2tp_ip6.c ++++ b/net/l2tp/l2tp_ip6.c +@@ -606,7 +606,7 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + else if (!fl6.flowi6_oif) + fl6.flowi6_oif = np->ucast_oif; + +- security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); ++ security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6)); + + if (ipc6.tclass < 0) + ipc6.tclass = np->tclass; +diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c +index 8f48aff74c7ba..5639a71257e41 100644 +--- a/net/mac80211/chan.c ++++ b/net/mac80211/chan.c +@@ -1652,12 +1652,9 @@ int ieee80211_vif_use_reserved_context(struct ieee80211_sub_if_data *sdata) + + if (new_ctx->replace_state == IEEE80211_CHANCTX_REPLACE_NONE) { + if (old_ctx) +- err = ieee80211_vif_use_reserved_reassign(sdata); +- else +- err = ieee80211_vif_use_reserved_assign(sdata); ++ return ieee80211_vif_use_reserved_reassign(sdata); + +- if (err) +- return err; ++ return ieee80211_vif_use_reserved_assign(sdata); + } + + /* +diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h +index fe8f586886b41..bcc94cc1b6201 100644 +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -1103,6 +1103,9 @@ struct tpt_led_trigger { + * a scan complete for an aborted scan. + * @SCAN_HW_CANCELLED: Set for our scan work function when the scan is being + * cancelled. ++ * @SCAN_BEACON_WAIT: Set whenever we're passive scanning because of radar/no-IR ++ * and could send a probe request after receiving a beacon. ++ * @SCAN_BEACON_DONE: Beacon received, we can now send a probe request + */ + enum { + SCAN_SW_SCANNING, +@@ -1111,6 +1114,8 @@ enum { + SCAN_COMPLETED, + SCAN_ABORTED, + SCAN_HW_CANCELLED, ++ SCAN_BEACON_WAIT, ++ SCAN_BEACON_DONE, + }; + + /** +diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c +index 6b50cb5e0e3cc..887f945bb12d4 100644 +--- a/net/mac80211/scan.c ++++ b/net/mac80211/scan.c +@@ -277,6 +277,16 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb) + if (likely(!sdata1 && !sdata2)) + return; + ++ if (test_and_clear_bit(SCAN_BEACON_WAIT, &local->scanning)) { ++ /* ++ * we were passive scanning because of radar/no-IR, but ++ * the beacon/proberesp rx gives us an opportunity to upgrade ++ * to active scan ++ */ ++ set_bit(SCAN_BEACON_DONE, &local->scanning); ++ ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0); ++ } ++ + if (ieee80211_is_probe_resp(mgmt->frame_control)) { + struct cfg80211_scan_request *scan_req; + struct cfg80211_sched_scan_request *sched_scan_req; +@@ -783,6 +793,8 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata, + IEEE80211_CHAN_RADAR)) || + !req->n_ssids) { + next_delay = IEEE80211_PASSIVE_CHANNEL_TIME; ++ if (req->n_ssids) ++ set_bit(SCAN_BEACON_WAIT, &local->scanning); + } else { + ieee80211_scan_state_send_probe(local, &next_delay); + next_delay = IEEE80211_CHANNEL_TIME; +@@ -994,6 +1006,8 @@ set_channel: + !scan_req->n_ssids) { + *next_delay = IEEE80211_PASSIVE_CHANNEL_TIME; + local->next_scan_state = SCAN_DECISION; ++ if (scan_req->n_ssids) ++ set_bit(SCAN_BEACON_WAIT, &local->scanning); + return; + } + +@@ -1086,6 +1100,8 @@ void ieee80211_scan_work(struct work_struct *work) + goto out; + } + ++ clear_bit(SCAN_BEACON_WAIT, &local->scanning); ++ + /* + * as long as no delay is required advance immediately + * without scheduling a new work +@@ -1096,6 +1112,10 @@ void ieee80211_scan_work(struct work_struct *work) + goto out_complete; + } + ++ if (test_and_clear_bit(SCAN_BEACON_DONE, &local->scanning) && ++ local->next_scan_state == SCAN_DECISION) ++ local->next_scan_state = SCAN_SEND_PROBE; ++ + switch (local->next_scan_state) { + case SCAN_DECISION: + /* if no more bands/channels left, complete scan */ +diff --git a/net/netfilter/nf_synproxy_core.c b/net/netfilter/nf_synproxy_core.c +index 2fc4ae960769d..3d6d49420db8b 100644 +--- a/net/netfilter/nf_synproxy_core.c ++++ b/net/netfilter/nf_synproxy_core.c +@@ -854,7 +854,7 @@ synproxy_send_tcp_ipv6(struct net *net, + fl6.fl6_sport = nth->source; + fl6.fl6_dport = nth->dest; + security_skb_classify_flow((struct sk_buff *)skb, +- flowi6_to_flowi(&fl6)); ++ flowi6_to_flowi_common(&fl6)); + err = nf_ip6_route(net, &dst, flowi6_to_flowi(&fl6), false); + if (err) { + goto free_nskb; +diff --git a/net/nfc/core.c b/net/nfc/core.c +index 3b2983813ff13..2ef56366bd5fe 100644 +--- a/net/nfc/core.c ++++ b/net/nfc/core.c +@@ -1158,6 +1158,7 @@ void nfc_unregister_device(struct nfc_dev *dev) + if (dev->rfkill) { + rfkill_unregister(dev->rfkill); + rfkill_destroy(dev->rfkill); ++ dev->rfkill = NULL; + } + dev->shutting_down = true; + device_unlock(&dev->dev); +diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h +index 3bad9f5f91023..ccb65412b6704 100644 +--- a/net/rxrpc/ar-internal.h ++++ b/net/rxrpc/ar-internal.h +@@ -659,13 +659,12 @@ struct rxrpc_call { + + spinlock_t input_lock; /* Lock for packet input to this call */ + +- /* receive-phase ACK management */ ++ /* Receive-phase ACK management (ACKs we send). */ + u8 ackr_reason; /* reason to ACK */ + rxrpc_serial_t ackr_serial; /* serial of packet being ACK'd */ +- rxrpc_serial_t ackr_first_seq; /* first sequence number received */ +- rxrpc_seq_t ackr_prev_seq; /* previous sequence number received */ +- rxrpc_seq_t ackr_consumed; /* Highest packet shown consumed */ +- rxrpc_seq_t ackr_seen; /* Highest packet shown seen */ ++ rxrpc_seq_t ackr_highest_seq; /* Higest sequence number received */ ++ atomic_t ackr_nr_unacked; /* Number of unacked packets */ ++ atomic_t ackr_nr_consumed; /* Number of packets needing hard ACK */ + + /* RTT management */ + rxrpc_serial_t rtt_serial[4]; /* Serial number of DATA or PING sent */ +@@ -675,8 +674,10 @@ struct rxrpc_call { + #define RXRPC_CALL_RTT_AVAIL_MASK 0xf + #define RXRPC_CALL_RTT_PEND_SHIFT 8 + +- /* transmission-phase ACK management */ ++ /* Transmission-phase ACK management (ACKs we've received). */ + ktime_t acks_latest_ts; /* Timestamp of latest ACK received */ ++ rxrpc_seq_t acks_first_seq; /* first sequence number received */ ++ rxrpc_seq_t acks_prev_seq; /* Highest previousPacket received */ + rxrpc_seq_t acks_lowest_nak; /* Lowest NACK in the buffer (or ==tx_hard_ack) */ + rxrpc_seq_t acks_lost_top; /* tx_top at the time lost-ack ping sent */ + rxrpc_serial_t acks_lost_ping; /* Serial number of probe ACK */ +diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c +index 22e05de5d1ca9..f8ecad2b730e8 100644 +--- a/net/rxrpc/call_event.c ++++ b/net/rxrpc/call_event.c +@@ -377,9 +377,9 @@ recheck_state: + if (test_bit(RXRPC_CALL_RX_HEARD, &call->flags) && + (int)call->conn->hi_serial - (int)call->rx_serial > 0) { + trace_rxrpc_call_reset(call); +- rxrpc_abort_call("EXP", call, 0, RX_USER_ABORT, -ECONNRESET); ++ rxrpc_abort_call("EXP", call, 0, RX_CALL_DEAD, -ECONNRESET); + } else { +- rxrpc_abort_call("EXP", call, 0, RX_USER_ABORT, -ETIME); ++ rxrpc_abort_call("EXP", call, 0, RX_CALL_TIMEOUT, -ETIME); + } + set_bit(RXRPC_CALL_EV_ABORT, &call->events); + goto recheck_state; +@@ -406,7 +406,8 @@ recheck_state: + goto recheck_state; + } + +- if (test_and_clear_bit(RXRPC_CALL_EV_RESEND, &call->events)) { ++ if (test_and_clear_bit(RXRPC_CALL_EV_RESEND, &call->events) && ++ call->state != RXRPC_CALL_CLIENT_RECV_REPLY) { + rxrpc_resend(call, now); + goto recheck_state; + } +diff --git a/net/rxrpc/conn_object.c b/net/rxrpc/conn_object.c +index 3bcbe0665f915..3ef05a0e90ad0 100644 +--- a/net/rxrpc/conn_object.c ++++ b/net/rxrpc/conn_object.c +@@ -184,7 +184,7 @@ void __rxrpc_disconnect_call(struct rxrpc_connection *conn, + chan->last_type = RXRPC_PACKET_TYPE_ABORT; + break; + default: +- chan->last_abort = RX_USER_ABORT; ++ chan->last_abort = RX_CALL_DEAD; + chan->last_type = RXRPC_PACKET_TYPE_ABORT; + break; + } +diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c +index dc201363f2c48..1145cb14d86f8 100644 +--- a/net/rxrpc/input.c ++++ b/net/rxrpc/input.c +@@ -412,8 +412,8 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + { + struct rxrpc_skb_priv *sp = rxrpc_skb(skb); + enum rxrpc_call_state state; +- unsigned int j, nr_subpackets; +- rxrpc_serial_t serial = sp->hdr.serial, ack_serial = 0; ++ unsigned int j, nr_subpackets, nr_unacked = 0; ++ rxrpc_serial_t serial = sp->hdr.serial, ack_serial = serial; + rxrpc_seq_t seq0 = sp->hdr.seq, hard_ack; + bool immediate_ack = false, jumbo_bad = false; + u8 ack = 0; +@@ -453,7 +453,6 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + !rxrpc_receiving_reply(call)) + goto unlock; + +- call->ackr_prev_seq = seq0; + hard_ack = READ_ONCE(call->rx_hard_ack); + + nr_subpackets = sp->nr_subpackets; +@@ -534,6 +533,9 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + ack_serial = serial; + } + ++ if (after(seq0, call->ackr_highest_seq)) ++ call->ackr_highest_seq = seq0; ++ + /* Queue the packet. We use a couple of memory barriers here as need + * to make sure that rx_top is perceived to be set after the buffer + * pointer and that the buffer pointer is set after the annotation and +@@ -567,6 +569,8 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + sp = NULL; + } + ++ nr_unacked++; ++ + if (last) { + set_bit(RXRPC_CALL_RX_LAST, &call->flags); + if (!ack) { +@@ -586,9 +590,14 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + } + call->rx_expect_next = seq + 1; + } ++ if (!ack) ++ ack_serial = serial; + } + + ack: ++ if (atomic_add_return(nr_unacked, &call->ackr_nr_unacked) > 2 && !ack) ++ ack = RXRPC_ACK_IDLE; ++ + if (ack) + rxrpc_propose_ACK(call, ack, ack_serial, + immediate_ack, true, +@@ -812,7 +821,7 @@ static void rxrpc_input_soft_acks(struct rxrpc_call *call, u8 *acks, + static bool rxrpc_is_ack_valid(struct rxrpc_call *call, + rxrpc_seq_t first_pkt, rxrpc_seq_t prev_pkt) + { +- rxrpc_seq_t base = READ_ONCE(call->ackr_first_seq); ++ rxrpc_seq_t base = READ_ONCE(call->acks_first_seq); + + if (after(first_pkt, base)) + return true; /* The window advanced */ +@@ -820,7 +829,7 @@ static bool rxrpc_is_ack_valid(struct rxrpc_call *call, + if (before(first_pkt, base)) + return false; /* firstPacket regressed */ + +- if (after_eq(prev_pkt, call->ackr_prev_seq)) ++ if (after_eq(prev_pkt, call->acks_prev_seq)) + return true; /* previousPacket hasn't regressed. */ + + /* Some rx implementations put a serial number in previousPacket. */ +@@ -906,8 +915,8 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb) + /* Discard any out-of-order or duplicate ACKs (outside lock). */ + if (!rxrpc_is_ack_valid(call, first_soft_ack, prev_pkt)) { + trace_rxrpc_rx_discard_ack(call->debug_id, ack_serial, +- first_soft_ack, call->ackr_first_seq, +- prev_pkt, call->ackr_prev_seq); ++ first_soft_ack, call->acks_first_seq, ++ prev_pkt, call->acks_prev_seq); + return; + } + +@@ -922,14 +931,14 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb) + /* Discard any out-of-order or duplicate ACKs (inside lock). */ + if (!rxrpc_is_ack_valid(call, first_soft_ack, prev_pkt)) { + trace_rxrpc_rx_discard_ack(call->debug_id, ack_serial, +- first_soft_ack, call->ackr_first_seq, +- prev_pkt, call->ackr_prev_seq); ++ first_soft_ack, call->acks_first_seq, ++ prev_pkt, call->acks_prev_seq); + goto out; + } + call->acks_latest_ts = skb->tstamp; + +- call->ackr_first_seq = first_soft_ack; +- call->ackr_prev_seq = prev_pkt; ++ call->acks_first_seq = first_soft_ack; ++ call->acks_prev_seq = prev_pkt; + + /* Parse rwind and mtu sizes if provided. */ + if (buf.info.rxMTU) +diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c +index a45c83f22236e..9683617db7049 100644 +--- a/net/rxrpc/output.c ++++ b/net/rxrpc/output.c +@@ -74,11 +74,18 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, + u8 reason) + { + rxrpc_serial_t serial; ++ unsigned int tmp; + rxrpc_seq_t hard_ack, top, seq; + int ix; + u32 mtu, jmax; + u8 *ackp = pkt->acks; + ++ tmp = atomic_xchg(&call->ackr_nr_unacked, 0); ++ tmp |= atomic_xchg(&call->ackr_nr_consumed, 0); ++ if (!tmp && (reason == RXRPC_ACK_DELAY || ++ reason == RXRPC_ACK_IDLE)) ++ return 0; ++ + /* Barrier against rxrpc_input_data(). */ + serial = call->ackr_serial; + hard_ack = READ_ONCE(call->rx_hard_ack); +@@ -89,7 +96,7 @@ static size_t rxrpc_fill_out_ack(struct rxrpc_connection *conn, + pkt->ack.bufferSpace = htons(8); + pkt->ack.maxSkew = htons(0); + pkt->ack.firstPacket = htonl(hard_ack + 1); +- pkt->ack.previousPacket = htonl(call->ackr_prev_seq); ++ pkt->ack.previousPacket = htonl(call->ackr_highest_seq); + pkt->ack.serial = htonl(serial); + pkt->ack.reason = reason; + pkt->ack.nAcks = top - hard_ack; +@@ -223,6 +230,10 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping, + n = rxrpc_fill_out_ack(conn, call, pkt, &hard_ack, &top, reason); + + spin_unlock_bh(&call->lock); ++ if (n == 0) { ++ kfree(pkt); ++ return 0; ++ } + + iov[0].iov_base = pkt; + iov[0].iov_len = sizeof(pkt->whdr) + sizeof(pkt->ack) + n; +@@ -259,13 +270,6 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping, + ntohl(pkt->ack.serial), + false, true, + rxrpc_propose_ack_retry_tx); +- } else { +- spin_lock_bh(&call->lock); +- if (after(hard_ack, call->ackr_consumed)) +- call->ackr_consumed = hard_ack; +- if (after(top, call->ackr_seen)) +- call->ackr_seen = top; +- spin_unlock_bh(&call->lock); + } + + rxrpc_set_keepalive(call); +diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c +index 2c842851d72e5..7878267739378 100644 +--- a/net/rxrpc/recvmsg.c ++++ b/net/rxrpc/recvmsg.c +@@ -260,11 +260,9 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call) + rxrpc_end_rx_phase(call, serial); + } else { + /* Check to see if there's an ACK that needs sending. */ +- if (after_eq(hard_ack, call->ackr_consumed + 2) || +- after_eq(top, call->ackr_seen + 2) || +- (hard_ack == top && after(hard_ack, call->ackr_consumed))) +- rxrpc_propose_ACK(call, RXRPC_ACK_DELAY, serial, +- true, true, ++ if (atomic_inc_return(&call->ackr_nr_consumed) > 2) ++ rxrpc_propose_ACK(call, RXRPC_ACK_IDLE, serial, ++ true, false, + rxrpc_propose_ack_rotate_rx); + if (call->ackr_reason && call->ackr_reason != RXRPC_ACK_DELAY) + rxrpc_send_ack_packet(call, false, NULL); +diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c +index d27140c836cce..aa23ba4e25662 100644 +--- a/net/rxrpc/sendmsg.c ++++ b/net/rxrpc/sendmsg.c +@@ -461,6 +461,12 @@ static int rxrpc_send_data(struct rxrpc_sock *rx, + + success: + ret = copied; ++ if (READ_ONCE(call->state) == RXRPC_CALL_COMPLETE) { ++ read_lock_bh(&call->state_lock); ++ if (call->error < 0) ++ ret = call->error; ++ read_unlock_bh(&call->state_lock); ++ } + out: + call->tx_pending = skb; + _leave(" = %d", ret); +diff --git a/net/rxrpc/sysctl.c b/net/rxrpc/sysctl.c +index 540351d6a5f47..555e0910786bc 100644 +--- a/net/rxrpc/sysctl.c ++++ b/net/rxrpc/sysctl.c +@@ -12,7 +12,7 @@ + + static struct ctl_table_header *rxrpc_sysctl_reg_table; + static const unsigned int four = 4; +-static const unsigned int thirtytwo = 32; ++static const unsigned int max_backlog = RXRPC_BACKLOG_MAX - 1; + static const unsigned int n_65535 = 65535; + static const unsigned int n_max_acks = RXRPC_RXTX_BUFF_SIZE - 1; + static const unsigned long one_jiffy = 1; +@@ -89,7 +89,7 @@ static struct ctl_table rxrpc_sysctl_table[] = { + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = (void *)&four, +- .extra2 = (void *)&thirtytwo, ++ .extra2 = (void *)&max_backlog, + }, + { + .procname = "rx_window_size", +diff --git a/net/sctp/input.c b/net/sctp/input.c +index 34494a0b28bd0..8f3aab6a4458b 100644 +--- a/net/sctp/input.c ++++ b/net/sctp/input.c +@@ -92,6 +92,7 @@ int sctp_rcv(struct sk_buff *skb) + struct sctp_chunk *chunk; + union sctp_addr src; + union sctp_addr dest; ++ int bound_dev_if; + int family; + struct sctp_af *af; + struct net *net = dev_net(skb->dev); +@@ -169,7 +170,8 @@ int sctp_rcv(struct sk_buff *skb) + * If a frame arrives on an interface and the receiving socket is + * bound to another interface, via SO_BINDTODEVICE, treat it as OOTB + */ +- if (sk->sk_bound_dev_if && (sk->sk_bound_dev_if != af->skb_iif(skb))) { ++ bound_dev_if = READ_ONCE(sk->sk_bound_dev_if); ++ if (bound_dev_if && (bound_dev_if != af->skb_iif(skb))) { + if (transport) { + sctp_transport_put(transport); + asoc = NULL; +diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c +index 35db3260e8d56..5d7710dd95145 100644 +--- a/net/smc/af_smc.c ++++ b/net/smc/af_smc.c +@@ -1118,9 +1118,9 @@ static int smc_connect(struct socket *sock, struct sockaddr *addr, + if (rc && rc != -EINPROGRESS) + goto out; + +- sock_hold(&smc->sk); /* sock put in passive closing */ + if (smc->use_fallback) + goto out; ++ sock_hold(&smc->sk); /* sock put in passive closing */ + if (flags & O_NONBLOCK) { + if (queue_work(smc_hs_wq, &smc->connect_work)) + smc->connect_nonblock = 1; +diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c +index f8d5f35cfc664..8a7f0c8fba5e9 100644 +--- a/net/wireless/nl80211.c ++++ b/net/wireless/nl80211.c +@@ -3485,6 +3485,7 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag + wdev_lock(wdev); + switch (wdev->iftype) { + case NL80211_IFTYPE_AP: ++ case NL80211_IFTYPE_P2P_GO: + if (wdev->ssid_len && + nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) + goto nla_put_failure_locked; +diff --git a/net/wireless/reg.c b/net/wireless/reg.c +index 6b3386e1d93a5..fd848609e656a 100644 +--- a/net/wireless/reg.c ++++ b/net/wireless/reg.c +@@ -787,6 +787,8 @@ static int __init load_builtin_regdb_keys(void) + return 0; + } + ++MODULE_FIRMWARE("regulatory.db.p7s"); ++ + static bool regdb_has_valid_signature(const u8 *data, unsigned int size) + { + const struct firmware *sig; +@@ -1058,6 +1060,8 @@ static void regdb_fw_cb(const struct firmware *fw, void *context) + release_firmware(fw); + } + ++MODULE_FIRMWARE("regulatory.db"); ++ + static int query_regdb_file(const char *alpha2) + { + ASSERT_RTNL(); +diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c +index 1befc6db723b0..717db5ecd0bd4 100644 +--- a/net/xfrm/xfrm_state.c ++++ b/net/xfrm/xfrm_state.c +@@ -1020,7 +1020,8 @@ static void xfrm_state_look_at(struct xfrm_policy *pol, struct xfrm_state *x, + if ((x->sel.family && + (x->sel.family != family || + !xfrm_selector_match(&x->sel, fl, family))) || +- !security_xfrm_state_pol_flow_match(x, pol, fl)) ++ !security_xfrm_state_pol_flow_match(x, pol, ++ &fl->u.__fl_common)) + return; + + if (!*best || +@@ -1035,7 +1036,8 @@ static void xfrm_state_look_at(struct xfrm_policy *pol, struct xfrm_state *x, + if ((!x->sel.family || + (x->sel.family == family && + xfrm_selector_match(&x->sel, fl, family))) && +- security_xfrm_state_pol_flow_match(x, pol, fl)) ++ security_xfrm_state_pol_flow_match(x, pol, ++ &fl->u.__fl_common)) + *error = -ESRCH; + } + } +diff --git a/scripts/faddr2line b/scripts/faddr2line +index 6c6439f69a725..0e6268d598835 100755 +--- a/scripts/faddr2line ++++ b/scripts/faddr2line +@@ -44,17 +44,6 @@ + set -o errexit + set -o nounset + +-READELF="${CROSS_COMPILE:-}readelf" +-ADDR2LINE="${CROSS_COMPILE:-}addr2line" +-SIZE="${CROSS_COMPILE:-}size" +-NM="${CROSS_COMPILE:-}nm" +- +-command -v awk >/dev/null 2>&1 || die "awk isn't installed" +-command -v ${READELF} >/dev/null 2>&1 || die "readelf isn't installed" +-command -v ${ADDR2LINE} >/dev/null 2>&1 || die "addr2line isn't installed" +-command -v ${SIZE} >/dev/null 2>&1 || die "size isn't installed" +-command -v ${NM} >/dev/null 2>&1 || die "nm isn't installed" +- + usage() { + echo "usage: faddr2line [--list] <object file> <func+offset> <func+offset>..." >&2 + exit 1 +@@ -69,6 +58,14 @@ die() { + exit 1 + } + ++READELF="${CROSS_COMPILE:-}readelf" ++ADDR2LINE="${CROSS_COMPILE:-}addr2line" ++AWK="awk" ++ ++command -v ${AWK} >/dev/null 2>&1 || die "${AWK} isn't installed" ++command -v ${READELF} >/dev/null 2>&1 || die "${READELF} isn't installed" ++command -v ${ADDR2LINE} >/dev/null 2>&1 || die "${ADDR2LINE} isn't installed" ++ + # Try to figure out the source directory prefix so we can remove it from the + # addr2line output. HACK ALERT: This assumes that start_kernel() is in + # init/main.c! This only works for vmlinux. Otherwise it falls back to +@@ -76,7 +73,7 @@ die() { + find_dir_prefix() { + local objfile=$1 + +- local start_kernel_addr=$(${READELF} -sW $objfile | awk '$8 == "start_kernel" {printf "0x%s", $2}') ++ local start_kernel_addr=$(${READELF} --symbols --wide $objfile | ${AWK} '$8 == "start_kernel" {printf "0x%s", $2}') + [[ -z $start_kernel_addr ]] && return + + local file_line=$(${ADDR2LINE} -e $objfile $start_kernel_addr) +@@ -97,86 +94,133 @@ __faddr2line() { + local dir_prefix=$3 + local print_warnings=$4 + +- local func=${func_addr%+*} ++ local sym_name=${func_addr%+*} + local offset=${func_addr#*+} + offset=${offset%/*} +- local size= +- [[ $func_addr =~ "/" ]] && size=${func_addr#*/} ++ local user_size= ++ [[ $func_addr =~ "/" ]] && user_size=${func_addr#*/} + +- if [[ -z $func ]] || [[ -z $offset ]] || [[ $func = $func_addr ]]; then ++ if [[ -z $sym_name ]] || [[ -z $offset ]] || [[ $sym_name = $func_addr ]]; then + warn "bad func+offset $func_addr" + DONE=1 + return + fi + + # Go through each of the object's symbols which match the func name. +- # In rare cases there might be duplicates. +- file_end=$(${SIZE} -Ax $objfile | awk '$1 == ".text" {print $2}') +- while read symbol; do +- local fields=($symbol) +- local sym_base=0x${fields[0]} +- local sym_type=${fields[1]} +- local sym_end=${fields[3]} +- +- # calculate the size +- local sym_size=$(($sym_end - $sym_base)) ++ # In rare cases there might be duplicates, in which case we print all ++ # matches. ++ while read line; do ++ local fields=($line) ++ local sym_addr=0x${fields[1]} ++ local sym_elf_size=${fields[2]} ++ local sym_sec=${fields[6]} ++ ++ # Get the section size: ++ local sec_size=$(${READELF} --section-headers --wide $objfile | ++ sed 's/\[ /\[/' | ++ ${AWK} -v sec=$sym_sec '$1 == "[" sec "]" { print "0x" $6; exit }') ++ ++ if [[ -z $sec_size ]]; then ++ warn "bad section size: section: $sym_sec" ++ DONE=1 ++ return ++ fi ++ ++ # Calculate the symbol size. ++ # ++ # Unfortunately we can't use the ELF size, because kallsyms ++ # also includes the padding bytes in its size calculation. For ++ # kallsyms, the size calculation is the distance between the ++ # symbol and the next symbol in a sorted list. ++ local sym_size ++ local cur_sym_addr ++ local found=0 ++ while read line; do ++ local fields=($line) ++ cur_sym_addr=0x${fields[1]} ++ local cur_sym_elf_size=${fields[2]} ++ local cur_sym_name=${fields[7]:-} ++ ++ if [[ $cur_sym_addr = $sym_addr ]] && ++ [[ $cur_sym_elf_size = $sym_elf_size ]] && ++ [[ $cur_sym_name = $sym_name ]]; then ++ found=1 ++ continue ++ fi ++ ++ if [[ $found = 1 ]]; then ++ sym_size=$(($cur_sym_addr - $sym_addr)) ++ [[ $sym_size -lt $sym_elf_size ]] && continue; ++ found=2 ++ break ++ fi ++ done < <(${READELF} --symbols --wide $objfile | ${AWK} -v sec=$sym_sec '$7 == sec' | sort --key=2) ++ ++ if [[ $found = 0 ]]; then ++ warn "can't find symbol: sym_name: $sym_name sym_sec: $sym_sec sym_addr: $sym_addr sym_elf_size: $sym_elf_size" ++ DONE=1 ++ return ++ fi ++ ++ # If nothing was found after the symbol, assume it's the last ++ # symbol in the section. ++ [[ $found = 1 ]] && sym_size=$(($sec_size - $sym_addr)) ++ + if [[ -z $sym_size ]] || [[ $sym_size -le 0 ]]; then +- warn "bad symbol size: base: $sym_base end: $sym_end" ++ warn "bad symbol size: sym_addr: $sym_addr cur_sym_addr: $cur_sym_addr" + DONE=1 + return + fi ++ + sym_size=0x$(printf %x $sym_size) + +- # calculate the address +- local addr=$(($sym_base + $offset)) ++ # Calculate the section address from user-supplied offset: ++ local addr=$(($sym_addr + $offset)) + if [[ -z $addr ]] || [[ $addr = 0 ]]; then +- warn "bad address: $sym_base + $offset" ++ warn "bad address: $sym_addr + $offset" + DONE=1 + return + fi + addr=0x$(printf %x $addr) + +- # weed out non-function symbols +- if [[ $sym_type != t ]] && [[ $sym_type != T ]]; then +- [[ $print_warnings = 1 ]] && +- echo "skipping $func address at $addr due to non-function symbol of type '$sym_type'" +- continue +- fi +- +- # if the user provided a size, make sure it matches the symbol's size +- if [[ -n $size ]] && [[ $size -ne $sym_size ]]; then ++ # If the user provided a size, make sure it matches the symbol's size: ++ if [[ -n $user_size ]] && [[ $user_size -ne $sym_size ]]; then + [[ $print_warnings = 1 ]] && +- echo "skipping $func address at $addr due to size mismatch ($size != $sym_size)" ++ echo "skipping $sym_name address at $addr due to size mismatch ($user_size != $sym_size)" + continue; + fi + +- # make sure the provided offset is within the symbol's range ++ # Make sure the provided offset is within the symbol's range: + if [[ $offset -gt $sym_size ]]; then + [[ $print_warnings = 1 ]] && +- echo "skipping $func address at $addr due to size mismatch ($offset > $sym_size)" ++ echo "skipping $sym_name address at $addr due to size mismatch ($offset > $sym_size)" + continue + fi + +- # separate multiple entries with a blank line ++ # In case of duplicates or multiple addresses specified on the ++ # cmdline, separate multiple entries with a blank line: + [[ $FIRST = 0 ]] && echo + FIRST=0 + +- # pass real address to addr2line +- echo "$func+$offset/$sym_size:" +- local file_lines=$(${ADDR2LINE} -fpie $objfile $addr | sed "s; $dir_prefix\(\./\)*; ;") +- [[ -z $file_lines ]] && return ++ echo "$sym_name+$offset/$sym_size:" + ++ # Pass section address to addr2line and strip absolute paths ++ # from the output: ++ local output=$(${ADDR2LINE} -fpie $objfile $addr | sed "s; $dir_prefix\(\./\)*; ;") ++ [[ -z $output ]] && continue ++ ++ # Default output (non --list): + if [[ $LIST = 0 ]]; then +- echo "$file_lines" | while read -r line ++ echo "$output" | while read -r line + do + echo $line + done + DONE=1; +- return ++ continue + fi + +- # show each line with context +- echo "$file_lines" | while read -r line ++ # For --list, show each line with its corresponding source code: ++ echo "$output" | while read -r line + do + echo + echo $line +@@ -184,12 +228,12 @@ __faddr2line() { + n1=$[$n-5] + n2=$[$n+5] + f=$(echo $line | sed 's/.*at \(.\+\):.*/\1/g') +- awk 'NR>=strtonum("'$n1'") && NR<=strtonum("'$n2'") { if (NR=='$n') printf(">%d<", NR); else printf(" %d ", NR); printf("\t%s\n", $0)}' $f ++ ${AWK} 'NR>=strtonum("'$n1'") && NR<=strtonum("'$n2'") { if (NR=='$n') printf(">%d<", NR); else printf(" %d ", NR); printf("\t%s\n", $0)}' $f + done + + DONE=1 + +- done < <(${NM} -n $objfile | awk -v fn=$func -v end=$file_end '$3 == fn { found=1; line=$0; start=$1; next } found == 1 { found=0; print line, "0x"$1 } END {if (found == 1) print line, end; }') ++ done < <(${READELF} --symbols --wide $objfile | ${AWK} -v fn=$sym_name '$4 == "FUNC" && $8 == fn') + } + + [[ $# -lt 2 ]] && usage +diff --git a/security/integrity/ima/Kconfig b/security/integrity/ima/Kconfig +index 9e72edb8d31af..755af0b29e755 100644 +--- a/security/integrity/ima/Kconfig ++++ b/security/integrity/ima/Kconfig +@@ -69,10 +69,9 @@ choice + hash, defined as 20 bytes, and a null terminated pathname, + limited to 255 characters. The 'ima-ng' measurement list + template permits both larger hash digests and longer +- pathnames. ++ pathnames. The configured default template can be replaced ++ by specifying "ima_template=" on the boot command line. + +- config IMA_TEMPLATE +- bool "ima" + config IMA_NG_TEMPLATE + bool "ima-ng (default)" + config IMA_SIG_TEMPLATE +@@ -82,7 +81,6 @@ endchoice + config IMA_DEFAULT_TEMPLATE + string + depends on IMA +- default "ima" if IMA_TEMPLATE + default "ima-ng" if IMA_NG_TEMPLATE + default "ima-sig" if IMA_SIG_TEMPLATE + +@@ -102,19 +100,19 @@ choice + + config IMA_DEFAULT_HASH_SHA256 + bool "SHA256" +- depends on CRYPTO_SHA256=y && !IMA_TEMPLATE ++ depends on CRYPTO_SHA256=y + + config IMA_DEFAULT_HASH_SHA512 + bool "SHA512" +- depends on CRYPTO_SHA512=y && !IMA_TEMPLATE ++ depends on CRYPTO_SHA512=y + + config IMA_DEFAULT_HASH_WP512 + bool "WP512" +- depends on CRYPTO_WP512=y && !IMA_TEMPLATE ++ depends on CRYPTO_WP512=y + + config IMA_DEFAULT_HASH_SM3 + bool "SM3" +- depends on CRYPTO_SM3=y && !IMA_TEMPLATE ++ depends on CRYPTO_SM3=y + endchoice + + config IMA_DEFAULT_HASH +diff --git a/security/integrity/platform_certs/keyring_handler.h b/security/integrity/platform_certs/keyring_handler.h +index 2462bfa08fe34..cd06bd6072be2 100644 +--- a/security/integrity/platform_certs/keyring_handler.h ++++ b/security/integrity/platform_certs/keyring_handler.h +@@ -30,3 +30,11 @@ efi_element_handler_t get_handler_for_db(const efi_guid_t *sig_type); + efi_element_handler_t get_handler_for_dbx(const efi_guid_t *sig_type); + + #endif ++ ++#ifndef UEFI_QUIRK_SKIP_CERT ++#define UEFI_QUIRK_SKIP_CERT(vendor, product) \ ++ .matches = { \ ++ DMI_MATCH(DMI_BOARD_VENDOR, vendor), \ ++ DMI_MATCH(DMI_PRODUCT_NAME, product), \ ++ }, ++#endif +diff --git a/security/integrity/platform_certs/load_uefi.c b/security/integrity/platform_certs/load_uefi.c +index f290f78c3f301..555d2dfc0ff79 100644 +--- a/security/integrity/platform_certs/load_uefi.c ++++ b/security/integrity/platform_certs/load_uefi.c +@@ -3,6 +3,7 @@ + #include <linux/kernel.h> + #include <linux/sched.h> + #include <linux/cred.h> ++#include <linux/dmi.h> + #include <linux/err.h> + #include <linux/efi.h> + #include <linux/slab.h> +@@ -11,6 +12,31 @@ + #include "../integrity.h" + #include "keyring_handler.h" + ++/* ++ * On T2 Macs reading the db and dbx efi variables to load UEFI Secure Boot ++ * certificates causes occurrence of a page fault in Apple's firmware and ++ * a crash disabling EFI runtime services. The following quirk skips reading ++ * these variables. ++ */ ++static const struct dmi_system_id uefi_skip_cert[] = { ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro15,1") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro15,2") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro15,3") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro15,4") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro16,1") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro16,2") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro16,3") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro16,4") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookAir8,1") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookAir8,2") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookAir9,1") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacMini8,1") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacPro7,1") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "iMac20,1") }, ++ { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "iMac20,2") }, ++ { } ++}; ++ + /* + * Look to see if a UEFI variable called MokIgnoreDB exists and return true if + * it does. +@@ -137,6 +163,13 @@ static int __init load_uefi_certs(void) + unsigned long dbsize = 0, dbxsize = 0, mokxsize = 0; + efi_status_t status; + int rc = 0; ++ const struct dmi_system_id *dmi_id; ++ ++ dmi_id = dmi_first_match(uefi_skip_cert); ++ if (dmi_id) { ++ pr_err("Reading UEFI Secure Boot Certs is not supported on T2 Macs.\n"); ++ return false; ++ } + + if (!efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE)) + return false; +diff --git a/security/security.c b/security/security.c +index 360706cdababc..8ea826ea6167e 100644 +--- a/security/security.c ++++ b/security/security.c +@@ -2223,15 +2223,16 @@ void security_sk_clone(const struct sock *sk, struct sock *newsk) + } + EXPORT_SYMBOL(security_sk_clone); + +-void security_sk_classify_flow(struct sock *sk, struct flowi *fl) ++void security_sk_classify_flow(struct sock *sk, struct flowi_common *flic) + { +- call_void_hook(sk_getsecid, sk, &fl->flowi_secid); ++ call_void_hook(sk_getsecid, sk, &flic->flowic_secid); + } + EXPORT_SYMBOL(security_sk_classify_flow); + +-void security_req_classify_flow(const struct request_sock *req, struct flowi *fl) ++void security_req_classify_flow(const struct request_sock *req, ++ struct flowi_common *flic) + { +- call_void_hook(req_classify_flow, req, fl); ++ call_void_hook(req_classify_flow, req, flic); + } + EXPORT_SYMBOL(security_req_classify_flow); + +@@ -2423,7 +2424,7 @@ int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir) + + int security_xfrm_state_pol_flow_match(struct xfrm_state *x, + struct xfrm_policy *xp, +- const struct flowi *fl) ++ const struct flowi_common *flic) + { + struct security_hook_list *hp; + int rc = LSM_RET_DEFAULT(xfrm_state_pol_flow_match); +@@ -2439,7 +2440,7 @@ int security_xfrm_state_pol_flow_match(struct xfrm_state *x, + */ + hlist_for_each_entry(hp, &security_hook_heads.xfrm_state_pol_flow_match, + list) { +- rc = hp->hook.xfrm_state_pol_flow_match(x, xp, fl); ++ rc = hp->hook.xfrm_state_pol_flow_match(x, xp, flic); + break; + } + return rc; +@@ -2450,9 +2451,9 @@ int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid) + return call_int_hook(xfrm_decode_session, 0, skb, secid, 1); + } + +-void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl) ++void security_skb_classify_flow(struct sk_buff *skb, struct flowi_common *flic) + { +- int rc = call_int_hook(xfrm_decode_session, 0, skb, &fl->flowi_secid, ++ int rc = call_int_hook(xfrm_decode_session, 0, skb, &flic->flowic_secid, + 0); + + BUG_ON(rc); +diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c +index 8c901ae05dd84..ee37ce2e2619b 100644 +--- a/security/selinux/hooks.c ++++ b/security/selinux/hooks.c +@@ -5448,9 +5448,9 @@ static void selinux_secmark_refcount_dec(void) + } + + static void selinux_req_classify_flow(const struct request_sock *req, +- struct flowi *fl) ++ struct flowi_common *flic) + { +- fl->flowi_secid = req->secid; ++ flic->flowic_secid = req->secid; + } + + static int selinux_tun_dev_alloc_security(void **security) +diff --git a/security/selinux/include/xfrm.h b/security/selinux/include/xfrm.h +index a0b4653162922..0a6f34a7a9714 100644 +--- a/security/selinux/include/xfrm.h ++++ b/security/selinux/include/xfrm.h +@@ -26,7 +26,7 @@ int selinux_xfrm_state_delete(struct xfrm_state *x); + int selinux_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir); + int selinux_xfrm_state_pol_flow_match(struct xfrm_state *x, + struct xfrm_policy *xp, +- const struct flowi *fl); ++ const struct flowi_common *flic); + + #ifdef CONFIG_SECURITY_NETWORK_XFRM + extern atomic_t selinux_xfrm_refcount; +diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c +index 00e95f8bd7c73..114245b6f7c7b 100644 +--- a/security/selinux/xfrm.c ++++ b/security/selinux/xfrm.c +@@ -175,9 +175,10 @@ int selinux_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir) + */ + int selinux_xfrm_state_pol_flow_match(struct xfrm_state *x, + struct xfrm_policy *xp, +- const struct flowi *fl) ++ const struct flowi_common *flic) + { + u32 state_sid; ++ u32 flic_sid; + + if (!xp->security) + if (x->security) +@@ -196,17 +197,17 @@ int selinux_xfrm_state_pol_flow_match(struct xfrm_state *x, + return 0; + + state_sid = x->security->ctx_sid; ++ flic_sid = flic->flowic_secid; + +- if (fl->flowi_secid != state_sid) ++ if (flic_sid != state_sid) + return 0; + + /* We don't need a separate SA Vs. policy polmatch check since the SA + * is now of the same label as the flow and a flow Vs. policy polmatch + * check had already happened in selinux_xfrm_policy_lookup() above. */ +- return (avc_has_perm(&selinux_state, +- fl->flowi_secid, state_sid, +- SECCLASS_ASSOCIATION, ASSOCIATION__SENDTO, +- NULL) ? 0 : 1); ++ return (avc_has_perm(&selinux_state, flic_sid, state_sid, ++ SECCLASS_ASSOCIATION, ASSOCIATION__SENDTO, ++ NULL) ? 0 : 1); + } + + static u32 selinux_xfrm_skb_sid_egress(struct sk_buff *skb) +diff --git a/sound/core/jack.c b/sound/core/jack.c +index dc2e06ae24149..45e28db6ea38d 100644 +--- a/sound/core/jack.c ++++ b/sound/core/jack.c +@@ -34,8 +34,11 @@ static int snd_jack_dev_disconnect(struct snd_device *device) + #ifdef CONFIG_SND_JACK_INPUT_DEV + struct snd_jack *jack = device->device_data; + +- if (!jack->input_dev) ++ mutex_lock(&jack->input_dev_lock); ++ if (!jack->input_dev) { ++ mutex_unlock(&jack->input_dev_lock); + return 0; ++ } + + /* If the input device is registered with the input subsystem + * then we need to use a different deallocator. */ +@@ -44,6 +47,7 @@ static int snd_jack_dev_disconnect(struct snd_device *device) + else + input_free_device(jack->input_dev); + jack->input_dev = NULL; ++ mutex_unlock(&jack->input_dev_lock); + #endif /* CONFIG_SND_JACK_INPUT_DEV */ + return 0; + } +@@ -82,8 +86,11 @@ static int snd_jack_dev_register(struct snd_device *device) + snprintf(jack->name, sizeof(jack->name), "%s %s", + card->shortname, jack->id); + +- if (!jack->input_dev) ++ mutex_lock(&jack->input_dev_lock); ++ if (!jack->input_dev) { ++ mutex_unlock(&jack->input_dev_lock); + return 0; ++ } + + jack->input_dev->name = jack->name; + +@@ -108,6 +115,7 @@ static int snd_jack_dev_register(struct snd_device *device) + if (err == 0) + jack->registered = 1; + ++ mutex_unlock(&jack->input_dev_lock); + return err; + } + #endif /* CONFIG_SND_JACK_INPUT_DEV */ +@@ -228,9 +236,11 @@ int snd_jack_new(struct snd_card *card, const char *id, int type, + return -ENOMEM; + } + +- /* don't creat input device for phantom jack */ +- if (!phantom_jack) { + #ifdef CONFIG_SND_JACK_INPUT_DEV ++ mutex_init(&jack->input_dev_lock); ++ ++ /* don't create input device for phantom jack */ ++ if (!phantom_jack) { + int i; + + jack->input_dev = input_allocate_device(); +@@ -248,8 +258,8 @@ int snd_jack_new(struct snd_card *card, const char *id, int type, + input_set_capability(jack->input_dev, EV_SW, + jack_switch_types[i]); + +-#endif /* CONFIG_SND_JACK_INPUT_DEV */ + } ++#endif /* CONFIG_SND_JACK_INPUT_DEV */ + + err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops); + if (err < 0) +@@ -289,10 +299,14 @@ EXPORT_SYMBOL(snd_jack_new); + void snd_jack_set_parent(struct snd_jack *jack, struct device *parent) + { + WARN_ON(jack->registered); +- if (!jack->input_dev) ++ mutex_lock(&jack->input_dev_lock); ++ if (!jack->input_dev) { ++ mutex_unlock(&jack->input_dev_lock); + return; ++ } + + jack->input_dev->dev.parent = parent; ++ mutex_unlock(&jack->input_dev_lock); + } + EXPORT_SYMBOL(snd_jack_set_parent); + +@@ -340,6 +354,8 @@ EXPORT_SYMBOL(snd_jack_set_key); + + /** + * snd_jack_report - Report the current status of a jack ++ * Note: This function uses mutexes and should be called from a ++ * context which can sleep (such as a workqueue). + * + * @jack: The jack to report status for + * @status: The current status of the jack +@@ -359,8 +375,11 @@ void snd_jack_report(struct snd_jack *jack, int status) + status & jack_kctl->mask_bits); + + #ifdef CONFIG_SND_JACK_INPUT_DEV +- if (!jack->input_dev) ++ mutex_lock(&jack->input_dev_lock); ++ if (!jack->input_dev) { ++ mutex_unlock(&jack->input_dev_lock); + return; ++ } + + for (i = 0; i < ARRAY_SIZE(jack->key); i++) { + int testbit = SND_JACK_BTN_0 >> i; +@@ -379,6 +398,7 @@ void snd_jack_report(struct snd_jack *jack, int status) + } + + input_sync(jack->input_dev); ++ mutex_unlock(&jack->input_dev_lock); + #endif /* CONFIG_SND_JACK_INPUT_DEV */ + } + EXPORT_SYMBOL(snd_jack_report); +diff --git a/sound/core/pcm_memory.c b/sound/core/pcm_memory.c +index a9a0d74f31656..191883842a35d 100644 +--- a/sound/core/pcm_memory.c ++++ b/sound/core/pcm_memory.c +@@ -434,7 +434,6 @@ EXPORT_SYMBOL(snd_pcm_lib_malloc_pages); + */ + int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream) + { +- struct snd_card *card = substream->pcm->card; + struct snd_pcm_runtime *runtime; + + if (PCM_RUNTIME_CHECK(substream)) +@@ -443,6 +442,8 @@ int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream) + if (runtime->dma_area == NULL) + return 0; + if (runtime->dma_buffer_p != &substream->dma_buffer) { ++ struct snd_card *card = substream->pcm->card; ++ + /* it's a newly allocated buffer. release it now. */ + do_free_pages(card, runtime->dma_buffer_p); + kfree(runtime->dma_buffer_p); +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index f630f9257ad11..71a9462e8f6ec 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -1990,6 +1990,7 @@ enum { + ALC1220_FIXUP_CLEVO_PB51ED_PINS, + ALC887_FIXUP_ASUS_AUDIO, + ALC887_FIXUP_ASUS_HMIC, ++ ALCS1200A_FIXUP_MIC_VREF, + }; + + static void alc889_fixup_coef(struct hda_codec *codec, +@@ -2535,6 +2536,14 @@ static const struct hda_fixup alc882_fixups[] = { + .chained = true, + .chain_id = ALC887_FIXUP_ASUS_AUDIO, + }, ++ [ALCS1200A_FIXUP_MIC_VREF] = { ++ .type = HDA_FIXUP_PINCTLS, ++ .v.pins = (const struct hda_pintbl[]) { ++ { 0x18, PIN_VREF50 }, /* rear mic */ ++ { 0x19, PIN_VREF50 }, /* front mic */ ++ {} ++ } ++ }, + }; + + static const struct snd_pci_quirk alc882_fixup_tbl[] = { +@@ -2572,6 +2581,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { + SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601), + SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS), + SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3), ++ SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF), + SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP), + SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP), + SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT), +@@ -8651,6 +8661,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { + SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK), + SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE), ++ SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK), + SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), +diff --git a/sound/soc/atmel/atmel-classd.c b/sound/soc/atmel/atmel-classd.c +index b1a28a9382fbc..f91a0e728ed5d 100644 +--- a/sound/soc/atmel/atmel-classd.c ++++ b/sound/soc/atmel/atmel-classd.c +@@ -458,7 +458,6 @@ static const struct snd_soc_component_driver atmel_classd_cpu_dai_component = { + .num_controls = ARRAY_SIZE(atmel_classd_snd_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, +- .endianness = 1, + }; + + /* ASoC sound card */ +diff --git a/sound/soc/atmel/atmel-pdmic.c b/sound/soc/atmel/atmel-pdmic.c +index 8e1d8230b180f..049383e5405ee 100644 +--- a/sound/soc/atmel/atmel-pdmic.c ++++ b/sound/soc/atmel/atmel-pdmic.c +@@ -481,7 +481,6 @@ static const struct snd_soc_component_driver atmel_pdmic_cpu_dai_component = { + .num_controls = ARRAY_SIZE(atmel_pdmic_snd_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, +- .endianness = 1, + }; + + /* ASoC sound card */ +diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig +index 52c89a6f54e9a..25f331551f689 100644 +--- a/sound/soc/codecs/Kconfig ++++ b/sound/soc/codecs/Kconfig +@@ -857,7 +857,6 @@ config SND_SOC_MAX98095 + + config SND_SOC_MAX98357A + tristate "Maxim MAX98357A CODEC" +- depends on GPIOLIB + + config SND_SOC_MAX98371 + tristate +@@ -1099,7 +1098,6 @@ config SND_SOC_RT1015 + + config SND_SOC_RT1015P + tristate +- depends on GPIOLIB + + config SND_SOC_RT1305 + tristate +diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c +index 5b6405392f085..0c73979cad4a4 100644 +--- a/sound/soc/codecs/max98090.c ++++ b/sound/soc/codecs/max98090.c +@@ -393,7 +393,8 @@ static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol, + struct soc_mixer_control *mc = + (struct soc_mixer_control *)kcontrol->private_value; + unsigned int mask = (1 << fls(mc->max)) - 1; +- unsigned int sel = ucontrol->value.integer.value[0]; ++ int sel_unchecked = ucontrol->value.integer.value[0]; ++ unsigned int sel; + unsigned int val = snd_soc_component_read(component, mc->reg); + unsigned int *select; + +@@ -413,8 +414,9 @@ static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol, + + val = (val >> mc->shift) & mask; + +- if (sel < 0 || sel > mc->max) ++ if (sel_unchecked < 0 || sel_unchecked > mc->max) + return -EINVAL; ++ sel = sel_unchecked; + + *select = sel; + +diff --git a/sound/soc/codecs/rk3328_codec.c b/sound/soc/codecs/rk3328_codec.c +index aed18cbb9f68e..e40b97929f6c2 100644 +--- a/sound/soc/codecs/rk3328_codec.c ++++ b/sound/soc/codecs/rk3328_codec.c +@@ -481,7 +481,7 @@ static int rk3328_platform_probe(struct platform_device *pdev) + ret = clk_prepare_enable(rk3328->pclk); + if (ret < 0) { + dev_err(&pdev->dev, "failed to enable acodec pclk\n"); +- return ret; ++ goto err_unprepare_mclk; + } + + base = devm_platform_ioremap_resource(pdev, 0); +diff --git a/sound/soc/codecs/rt5514.c b/sound/soc/codecs/rt5514.c +index 7081142a355e1..c444a56df95ba 100644 +--- a/sound/soc/codecs/rt5514.c ++++ b/sound/soc/codecs/rt5514.c +@@ -419,7 +419,7 @@ static int rt5514_dsp_voice_wake_up_put(struct snd_kcontrol *kcontrol, + } + } + +- return 0; ++ return 1; + } + + static const struct snd_kcontrol_new rt5514_snd_controls[] = { +diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c +index 420003d062c7f..d1533e95a74f6 100644 +--- a/sound/soc/codecs/rt5645.c ++++ b/sound/soc/codecs/rt5645.c +@@ -4095,9 +4095,14 @@ static int rt5645_i2c_remove(struct i2c_client *i2c) + if (i2c->irq) + free_irq(i2c->irq, rt5645); + ++ /* ++ * Since the rt5645_btn_check_callback() can queue jack_detect_work, ++ * the timer need to be delted first ++ */ ++ del_timer_sync(&rt5645->btn_check_timer); ++ + cancel_delayed_work_sync(&rt5645->jack_detect_work); + cancel_delayed_work_sync(&rt5645->rcclock_work); +- del_timer_sync(&rt5645->btn_check_timer); + + regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies); + +diff --git a/sound/soc/codecs/tscs454.c b/sound/soc/codecs/tscs454.c +index d0af16b4db2f4..a6f339bb47711 100644 +--- a/sound/soc/codecs/tscs454.c ++++ b/sound/soc/codecs/tscs454.c +@@ -3115,18 +3115,17 @@ static int set_aif_sample_format(struct snd_soc_component *component, + unsigned int width; + int ret; + +- switch (format) { +- case SNDRV_PCM_FORMAT_S16_LE: ++ switch (snd_pcm_format_width(format)) { ++ case 16: + width = FV_WL_16; + break; +- case SNDRV_PCM_FORMAT_S20_3LE: ++ case 20: + width = FV_WL_20; + break; +- case SNDRV_PCM_FORMAT_S24_3LE: ++ case 24: + width = FV_WL_24; + break; +- case SNDRV_PCM_FORMAT_S24_LE: +- case SNDRV_PCM_FORMAT_S32_LE: ++ case 32: + width = FV_WL_32; + break; + default: +@@ -3321,6 +3320,7 @@ static const struct snd_soc_component_driver soc_component_dev_tscs454 = { + .num_dapm_routes = ARRAY_SIZE(tscs454_intercon), + .controls = tscs454_snd_controls, + .num_controls = ARRAY_SIZE(tscs454_snd_controls), ++ .endianness = 1, + }; + + #define TSCS454_RATES SNDRV_PCM_RATE_8000_96000 +diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c +index 72e165cc64439..97ece3114b3dc 100644 +--- a/sound/soc/codecs/wm2000.c ++++ b/sound/soc/codecs/wm2000.c +@@ -536,7 +536,7 @@ static int wm2000_anc_transition(struct wm2000_priv *wm2000, + { + struct i2c_client *i2c = wm2000->i2c; + int i, j; +- int ret; ++ int ret = 0; + + if (wm2000->anc_mode == mode) + return 0; +@@ -566,13 +566,13 @@ static int wm2000_anc_transition(struct wm2000_priv *wm2000, + ret = anc_transitions[i].step[j](i2c, + anc_transitions[i].analogue); + if (ret != 0) +- return ret; ++ break; + } + + if (anc_transitions[i].dest == ANC_OFF) + clk_disable_unprepare(wm2000->mclk); + +- return 0; ++ return ret; + } + + static int wm2000_anc_set_mode(struct wm2000_priv *wm2000) +diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c +index f45cb4bbb6c4d..5997bb5acb738 100644 +--- a/sound/soc/fsl/imx-sgtl5000.c ++++ b/sound/soc/fsl/imx-sgtl5000.c +@@ -120,19 +120,19 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); + if (!data) { + ret = -ENOMEM; +- goto fail; ++ goto put_device; + } + + comp = devm_kzalloc(&pdev->dev, 3 * sizeof(*comp), GFP_KERNEL); + if (!comp) { + ret = -ENOMEM; +- goto fail; ++ goto put_device; + } + + data->codec_clk = clk_get(&codec_dev->dev, NULL); + if (IS_ERR(data->codec_clk)) { + ret = PTR_ERR(data->codec_clk); +- goto fail; ++ goto put_device; + } + + data->clk_frequency = clk_get_rate(data->codec_clk); +@@ -158,10 +158,10 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) + data->card.dev = &pdev->dev; + ret = snd_soc_of_parse_card_name(&data->card, "model"); + if (ret) +- goto fail; ++ goto put_device; + ret = snd_soc_of_parse_audio_routing(&data->card, "audio-routing"); + if (ret) +- goto fail; ++ goto put_device; + data->card.num_links = 1; + data->card.owner = THIS_MODULE; + data->card.dai_link = &data->dai; +@@ -176,7 +176,7 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) + if (ret != -EPROBE_DEFER) + dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", + ret); +- goto fail; ++ goto put_device; + } + + of_node_put(ssi_np); +@@ -184,6 +184,8 @@ static int imx_sgtl5000_probe(struct platform_device *pdev) + + return 0; + ++put_device: ++ put_device(&codec_dev->dev); + fail: + if (data && !IS_ERR(data->codec_clk)) + clk_put(data->codec_clk); +diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c +index 43ee3d095a1be..3020a993f6ef5 100644 +--- a/sound/soc/intel/boards/bytcr_rt5640.c ++++ b/sound/soc/intel/boards/bytcr_rt5640.c +@@ -615,6 +615,18 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = { + BYT_RT5640_OVCD_SF_0P75 | + BYT_RT5640_MCLK_EN), + }, ++ { /* HP Pro Tablet 408 */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "HP Pro Tablet 408"), ++ }, ++ .driver_data = (void *)(BYT_RT5640_DMIC1_MAP | ++ BYT_RT5640_JD_SRC_JD2_IN4N | ++ BYT_RT5640_OVCD_TH_1500UA | ++ BYT_RT5640_OVCD_SF_0P75 | ++ BYT_RT5640_SSP0_AIF1 | ++ BYT_RT5640_MCLK_EN), ++ }, + { /* HP Stream 7 */ + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), +diff --git a/sound/soc/mediatek/mt2701/mt2701-wm8960.c b/sound/soc/mediatek/mt2701/mt2701-wm8960.c +index 414e422c0eba0..70e494fb3da87 100644 +--- a/sound/soc/mediatek/mt2701/mt2701-wm8960.c ++++ b/sound/soc/mediatek/mt2701/mt2701-wm8960.c +@@ -129,7 +129,8 @@ static int mt2701_wm8960_machine_probe(struct platform_device *pdev) + if (!codec_node) { + dev_err(&pdev->dev, + "Property 'audio-codec' missing or invalid\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_platform_node; + } + for_each_card_prelinks(card, i, dai_link) { + if (dai_link->codecs->name) +@@ -140,7 +141,7 @@ static int mt2701_wm8960_machine_probe(struct platform_device *pdev) + ret = snd_soc_of_parse_audio_routing(card, "audio-routing"); + if (ret) { + dev_err(&pdev->dev, "failed to parse audio-routing: %d\n", ret); +- return ret; ++ goto put_codec_node; + } + + ret = devm_snd_soc_register_card(&pdev->dev, card); +@@ -148,6 +149,10 @@ static int mt2701_wm8960_machine_probe(struct platform_device *pdev) + dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n", + __func__, ret); + ++put_codec_node: ++ of_node_put(codec_node); ++put_platform_node: ++ of_node_put(platform_node); + return ret; + } + +diff --git a/sound/soc/mediatek/mt8173/mt8173-max98090.c b/sound/soc/mediatek/mt8173/mt8173-max98090.c +index 3bdd4931316cd..5f39e810e27ae 100644 +--- a/sound/soc/mediatek/mt8173/mt8173-max98090.c ++++ b/sound/soc/mediatek/mt8173/mt8173-max98090.c +@@ -167,7 +167,8 @@ static int mt8173_max98090_dev_probe(struct platform_device *pdev) + if (!codec_node) { + dev_err(&pdev->dev, + "Property 'audio-codec' missing or invalid\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_platform_node; + } + for_each_card_prelinks(card, i, dai_link) { + if (dai_link->codecs->name) +@@ -182,6 +183,8 @@ static int mt8173_max98090_dev_probe(struct platform_device *pdev) + __func__, ret); + + of_node_put(codec_node); ++ ++put_platform_node: + of_node_put(platform_node); + return ret; + } +diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c +index f2eda81985e27..d87ac26999cfd 100644 +--- a/sound/soc/mxs/mxs-saif.c ++++ b/sound/soc/mxs/mxs-saif.c +@@ -764,6 +764,7 @@ static int mxs_saif_probe(struct platform_device *pdev) + saif->master_id = saif->id; + } else { + ret = of_alias_get_id(master, "saif"); ++ of_node_put(master); + if (ret < 0) + return ret; + else +diff --git a/sound/soc/samsung/aries_wm8994.c b/sound/soc/samsung/aries_wm8994.c +index 0ac5956ba270d..18458192aff18 100644 +--- a/sound/soc/samsung/aries_wm8994.c ++++ b/sound/soc/samsung/aries_wm8994.c +@@ -585,19 +585,16 @@ static int aries_audio_probe(struct platform_device *pdev) + + extcon_np = of_parse_phandle(np, "extcon", 0); + priv->usb_extcon = extcon_find_edev_by_node(extcon_np); +- if (IS_ERR(priv->usb_extcon)) { +- if (PTR_ERR(priv->usb_extcon) != -EPROBE_DEFER) +- dev_err(dev, "Failed to get extcon device"); +- return PTR_ERR(priv->usb_extcon); +- } + of_node_put(extcon_np); ++ if (IS_ERR(priv->usb_extcon)) ++ return dev_err_probe(dev, PTR_ERR(priv->usb_extcon), ++ "Failed to get extcon device"); + + priv->adc = devm_iio_channel_get(dev, "headset-detect"); +- if (IS_ERR(priv->adc)) { +- if (PTR_ERR(priv->adc) != -EPROBE_DEFER) +- dev_err(dev, "Failed to get ADC channel"); +- return PTR_ERR(priv->adc); +- } ++ if (IS_ERR(priv->adc)) ++ return dev_err_probe(dev, PTR_ERR(priv->adc), ++ "Failed to get ADC channel"); ++ + if (priv->adc->channel->type != IIO_VOLTAGE) + return -EINVAL; + +diff --git a/sound/soc/samsung/arndale.c b/sound/soc/samsung/arndale.c +index 28587375813ac..35e34e534b8ba 100644 +--- a/sound/soc/samsung/arndale.c ++++ b/sound/soc/samsung/arndale.c +@@ -174,9 +174,8 @@ static int arndale_audio_probe(struct platform_device *pdev) + + ret = devm_snd_soc_register_card(card->dev, card); + if (ret) { +- if (ret != -EPROBE_DEFER) +- dev_err(&pdev->dev, +- "snd_soc_register_card() failed: %d\n", ret); ++ dev_err_probe(&pdev->dev, ret, ++ "snd_soc_register_card() failed\n"); + goto err_put_of_nodes; + } + return 0; +diff --git a/sound/soc/samsung/littlemill.c b/sound/soc/samsung/littlemill.c +index a1ff1400857ed..e73356a660872 100644 +--- a/sound/soc/samsung/littlemill.c ++++ b/sound/soc/samsung/littlemill.c +@@ -325,9 +325,8 @@ static int littlemill_probe(struct platform_device *pdev) + card->dev = &pdev->dev; + + ret = devm_snd_soc_register_card(&pdev->dev, card); +- if (ret && ret != -EPROBE_DEFER) +- dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", +- ret); ++ if (ret) ++ dev_err_probe(&pdev->dev, ret, "snd_soc_register_card() failed\n"); + + return ret; + } +diff --git a/sound/soc/samsung/lowland.c b/sound/soc/samsung/lowland.c +index 998d10cf8c947..7b12ccd2a9b22 100644 +--- a/sound/soc/samsung/lowland.c ++++ b/sound/soc/samsung/lowland.c +@@ -183,9 +183,8 @@ static int lowland_probe(struct platform_device *pdev) + card->dev = &pdev->dev; + + ret = devm_snd_soc_register_card(&pdev->dev, card); +- if (ret && ret != -EPROBE_DEFER) +- dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", +- ret); ++ if (ret) ++ dev_err_probe(&pdev->dev, ret, "snd_soc_register_card() failed\n"); + + return ret; + } +diff --git a/sound/soc/samsung/odroid.c b/sound/soc/samsung/odroid.c +index ca643a488c3ca..4ff12e2e704fe 100644 +--- a/sound/soc/samsung/odroid.c ++++ b/sound/soc/samsung/odroid.c +@@ -311,9 +311,7 @@ static int odroid_audio_probe(struct platform_device *pdev) + + ret = devm_snd_soc_register_card(dev, card); + if (ret < 0) { +- if (ret != -EPROBE_DEFER) +- dev_err(dev, "snd_soc_register_card() failed: %d\n", +- ret); ++ dev_err_probe(dev, ret, "snd_soc_register_card() failed\n"); + goto err_put_clk_i2s; + } + +diff --git a/sound/soc/samsung/smdk_wm8994.c b/sound/soc/samsung/smdk_wm8994.c +index 64a1a64656aba..92cd9e8a2e617 100644 +--- a/sound/soc/samsung/smdk_wm8994.c ++++ b/sound/soc/samsung/smdk_wm8994.c +@@ -178,8 +178,8 @@ static int smdk_audio_probe(struct platform_device *pdev) + + ret = devm_snd_soc_register_card(&pdev->dev, card); + +- if (ret && ret != -EPROBE_DEFER) +- dev_err(&pdev->dev, "snd_soc_register_card() failed:%d\n", ret); ++ if (ret) ++ dev_err_probe(&pdev->dev, ret, "snd_soc_register_card() failed\n"); + + return ret; + } +diff --git a/sound/soc/samsung/smdk_wm8994pcm.c b/sound/soc/samsung/smdk_wm8994pcm.c +index a01640576f71d..110a51a4f870a 100644 +--- a/sound/soc/samsung/smdk_wm8994pcm.c ++++ b/sound/soc/samsung/smdk_wm8994pcm.c +@@ -118,8 +118,8 @@ static int snd_smdk_probe(struct platform_device *pdev) + + smdk_pcm.dev = &pdev->dev; + ret = devm_snd_soc_register_card(&pdev->dev, &smdk_pcm); +- if (ret && ret != -EPROBE_DEFER) +- dev_err(&pdev->dev, "snd_soc_register_card failed %d\n", ret); ++ if (ret) ++ dev_err_probe(&pdev->dev, ret, "snd_soc_register_card failed\n"); + + return ret; + } +diff --git a/sound/soc/samsung/snow.c b/sound/soc/samsung/snow.c +index 07163f07c6d56..6aa2c66d8e8c9 100644 +--- a/sound/soc/samsung/snow.c ++++ b/sound/soc/samsung/snow.c +@@ -215,12 +215,9 @@ static int snow_probe(struct platform_device *pdev) + snd_soc_card_set_drvdata(card, priv); + + ret = devm_snd_soc_register_card(dev, card); +- if (ret) { +- if (ret != -EPROBE_DEFER) +- dev_err(&pdev->dev, +- "snd_soc_register_card failed (%d)\n", ret); +- return ret; +- } ++ if (ret) ++ return dev_err_probe(&pdev->dev, ret, ++ "snd_soc_register_card failed\n"); + + return ret; + } +diff --git a/sound/soc/samsung/speyside.c b/sound/soc/samsung/speyside.c +index f5f6ba00d0731..37b1f4f60b210 100644 +--- a/sound/soc/samsung/speyside.c ++++ b/sound/soc/samsung/speyside.c +@@ -330,9 +330,8 @@ static int speyside_probe(struct platform_device *pdev) + card->dev = &pdev->dev; + + ret = devm_snd_soc_register_card(&pdev->dev, card); +- if (ret && ret != -EPROBE_DEFER) +- dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", +- ret); ++ if (ret) ++ dev_err_probe(&pdev->dev, ret, "snd_soc_register_card() failed\n"); + + return ret; + } +diff --git a/sound/soc/samsung/tm2_wm5110.c b/sound/soc/samsung/tm2_wm5110.c +index 125e07f65d2b5..ca1be7a7cb8ab 100644 +--- a/sound/soc/samsung/tm2_wm5110.c ++++ b/sound/soc/samsung/tm2_wm5110.c +@@ -611,8 +611,7 @@ static int tm2_probe(struct platform_device *pdev) + + ret = devm_snd_soc_register_card(dev, card); + if (ret < 0) { +- if (ret != -EPROBE_DEFER) +- dev_err(dev, "Failed to register card: %d\n", ret); ++ dev_err_probe(dev, ret, "Failed to register card\n"); + goto dai_node_put; + } + +diff --git a/sound/soc/samsung/tobermory.c b/sound/soc/samsung/tobermory.c +index c962d2c2a7f78..95c6267b0c0cb 100644 +--- a/sound/soc/samsung/tobermory.c ++++ b/sound/soc/samsung/tobermory.c +@@ -229,9 +229,8 @@ static int tobermory_probe(struct platform_device *pdev) + card->dev = &pdev->dev; + + ret = devm_snd_soc_register_card(&pdev->dev, card); +- if (ret && ret != -EPROBE_DEFER) +- dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", +- ret); ++ if (ret) ++ dev_err_probe(&pdev->dev, ret, "snd_soc_register_card() failed\n"); + + return ret; + } +diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c +index 417732bdf2860..f2f7f2dde93cf 100644 +--- a/sound/soc/soc-dapm.c ++++ b/sound/soc/soc-dapm.c +@@ -3427,7 +3427,6 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol, + update.val = val; + card->update = &update; + } +- change |= reg_change; + + ret = soc_dapm_mixer_update_power(card, kcontrol, connect, + rconnect); +@@ -3529,7 +3528,6 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol, + update.val = val; + card->update = &update; + } +- change |= reg_change; + + ret = soc_dapm_mux_update_power(card, kcontrol, item[0], e); + +diff --git a/sound/soc/ti/j721e-evm.c b/sound/soc/ti/j721e-evm.c +index 265bbc5a2f96a..756cd9694cbe8 100644 +--- a/sound/soc/ti/j721e-evm.c ++++ b/sound/soc/ti/j721e-evm.c +@@ -631,17 +631,18 @@ static int j721e_soc_probe_cpb(struct j721e_priv *priv, int *link_idx, + codec_node = of_parse_phandle(node, "ti,cpb-codec", 0); + if (!codec_node) { + dev_err(priv->dev, "CPB codec node is not provided\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_dai_node; + } + + domain = &priv->audio_domains[J721E_AUDIO_DOMAIN_CPB]; + ret = j721e_get_clocks(priv->dev, &domain->codec, "cpb-codec-scki"); + if (ret) +- return ret; ++ goto put_codec_node; + + ret = j721e_get_clocks(priv->dev, &domain->mcasp, "cpb-mcasp-auxclk"); + if (ret) +- return ret; ++ goto put_codec_node; + + /* + * Common Processor Board, two links +@@ -651,8 +652,10 @@ static int j721e_soc_probe_cpb(struct j721e_priv *priv, int *link_idx, + comp_count = 6; + compnent = devm_kzalloc(priv->dev, comp_count * sizeof(*compnent), + GFP_KERNEL); +- if (!compnent) +- return -ENOMEM; ++ if (!compnent) { ++ ret = -ENOMEM; ++ goto put_codec_node; ++ } + + comp_idx = 0; + priv->dai_links[*link_idx].cpus = &compnent[comp_idx++]; +@@ -703,6 +706,12 @@ static int j721e_soc_probe_cpb(struct j721e_priv *priv, int *link_idx, + (*conf_idx)++; + + return 0; ++ ++put_codec_node: ++ of_node_put(codec_node); ++put_dai_node: ++ of_node_put(dai_node); ++ return ret; + } + + static int j721e_soc_probe_ivi(struct j721e_priv *priv, int *link_idx, +@@ -727,23 +736,25 @@ static int j721e_soc_probe_ivi(struct j721e_priv *priv, int *link_idx, + codeca_node = of_parse_phandle(node, "ti,ivi-codec-a", 0); + if (!codeca_node) { + dev_err(priv->dev, "IVI codec-a node is not provided\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto put_dai_node; + } + + codecb_node = of_parse_phandle(node, "ti,ivi-codec-b", 0); + if (!codecb_node) { + dev_warn(priv->dev, "IVI codec-b node is not provided\n"); +- return 0; ++ ret = 0; ++ goto put_codeca_node; + } + + domain = &priv->audio_domains[J721E_AUDIO_DOMAIN_IVI]; + ret = j721e_get_clocks(priv->dev, &domain->codec, "ivi-codec-scki"); + if (ret) +- return ret; ++ goto put_codecb_node; + + ret = j721e_get_clocks(priv->dev, &domain->mcasp, "ivi-mcasp-auxclk"); + if (ret) +- return ret; ++ goto put_codecb_node; + + /* + * IVI extension, two links +@@ -755,8 +766,10 @@ static int j721e_soc_probe_ivi(struct j721e_priv *priv, int *link_idx, + comp_count = 8; + compnent = devm_kzalloc(priv->dev, comp_count * sizeof(*compnent), + GFP_KERNEL); +- if (!compnent) +- return -ENOMEM; ++ if (!compnent) { ++ ret = -ENOMEM; ++ goto put_codecb_node; ++ } + + comp_idx = 0; + priv->dai_links[*link_idx].cpus = &compnent[comp_idx++]; +@@ -817,6 +830,15 @@ static int j721e_soc_probe_ivi(struct j721e_priv *priv, int *link_idx, + (*conf_idx)++; + + return 0; ++ ++ ++put_codecb_node: ++ of_node_put(codecb_node); ++put_codeca_node: ++ of_node_put(codeca_node); ++put_dai_node: ++ of_node_put(dai_node); ++ return ret; + } + + static int j721e_soc_probe(struct platform_device *pdev) +diff --git a/sound/usb/midi.c b/sound/usb/midi.c +index 84676a8fb60dc..93fee6e365a6e 100644 +--- a/sound/usb/midi.c ++++ b/sound/usb/midi.c +@@ -1161,6 +1161,9 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream) + + static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream) + { ++ struct usbmidi_out_port *port = substream->runtime->private_data; ++ ++ cancel_work_sync(&port->ep->work); + return substream_open(substream, 0, 0); + } + +diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c +index 61df26f048d91..8fada26529b79 100644 +--- a/tools/lib/bpf/libbpf.c ++++ b/tools/lib/bpf/libbpf.c +@@ -5928,9 +5928,10 @@ bpf_object__relocate_core(struct bpf_object *obj, const char *targ_btf_path) + */ + prog = NULL; + for (i = 0; i < obj->nr_programs; i++) { +- prog = &obj->programs[i]; +- if (strcmp(prog->sec_name, sec_name) == 0) ++ if (strcmp(obj->programs[i].sec_name, sec_name) == 0) { ++ prog = &obj->programs[i]; + break; ++ } + } + if (!prog) { + pr_warn("sec '%s': failed to find a BPF program\n", sec_name); +@@ -5945,10 +5946,17 @@ bpf_object__relocate_core(struct bpf_object *obj, const char *targ_btf_path) + insn_idx = rec->insn_off / BPF_INSN_SZ; + prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); + if (!prog) { +- pr_warn("sec '%s': failed to find program at insn #%d for CO-RE offset relocation #%d\n", +- sec_name, insn_idx, i); +- err = -EINVAL; +- goto out; ++ /* When __weak subprog is "overridden" by another instance ++ * of the subprog from a different object file, linker still ++ * appends all the .BTF.ext info that used to belong to that ++ * eliminated subprogram. ++ * This is similar to what x86-64 linker does for relocations. ++ * So just ignore such relocations just like we ignore ++ * subprog instructions when discovering subprograms. ++ */ ++ pr_debug("sec '%s': skipping CO-RE relocation #%d for insn #%d belonging to eliminated weak subprogram\n", ++ sec_name, i, insn_idx); ++ continue; + } + /* no need to apply CO-RE relocation if the program is + * not going to be loaded +diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config +index 41dff8d38448d..5ee3c4d1fbb2b 100644 +--- a/tools/perf/Makefile.config ++++ b/tools/perf/Makefile.config +@@ -222,18 +222,33 @@ ifdef PARSER_DEBUG + endif + + # Try different combinations to accommodate systems that only have +-# python[2][-config] in weird combinations but always preferring +-# python2 and python2-config as per pep-0394. If python2 or python +-# aren't found, then python3 is used. +-PYTHON_AUTO := python +-PYTHON_AUTO := $(if $(call get-executable,python3),python3,$(PYTHON_AUTO)) +-PYTHON_AUTO := $(if $(call get-executable,python),python,$(PYTHON_AUTO)) +-PYTHON_AUTO := $(if $(call get-executable,python2),python2,$(PYTHON_AUTO)) +-override PYTHON := $(call get-executable-or-default,PYTHON,$(PYTHON_AUTO)) +-PYTHON_AUTO_CONFIG := \ +- $(if $(call get-executable,$(PYTHON)-config),$(PYTHON)-config,python-config) +-override PYTHON_CONFIG := \ +- $(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON_AUTO_CONFIG)) ++# python[2][3]-config in weird combinations in the following order of ++# priority from lowest to highest: ++# * python3-config ++# * python-config ++# * python2-config as per pep-0394. ++# * $(PYTHON)-config (If PYTHON is user supplied but PYTHON_CONFIG isn't) ++# ++PYTHON_AUTO := python-config ++PYTHON_AUTO := $(if $(call get-executable,python3-config),python3-config,$(PYTHON_AUTO)) ++PYTHON_AUTO := $(if $(call get-executable,python-config),python-config,$(PYTHON_AUTO)) ++PYTHON_AUTO := $(if $(call get-executable,python2-config),python2-config,$(PYTHON_AUTO)) ++ ++# If PYTHON is defined but PYTHON_CONFIG isn't, then take $(PYTHON)-config as if it was the user ++# supplied value for PYTHON_CONFIG. Because it's "user supplied", error out if it doesn't exist. ++ifdef PYTHON ++ ifndef PYTHON_CONFIG ++ PYTHON_CONFIG_AUTO := $(call get-executable,$(PYTHON)-config) ++ PYTHON_CONFIG := $(if $(PYTHON_CONFIG_AUTO),$(PYTHON_CONFIG_AUTO),\ ++ $(call $(error $(PYTHON)-config not found))) ++ endif ++endif ++ ++# Select either auto detected python and python-config or use user supplied values if they are ++# defined. get-executable-or-default fails with an error if the first argument is supplied but ++# doesn't exist. ++override PYTHON_CONFIG := $(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON_AUTO)) ++override PYTHON := $(call get-executable-or-default,PYTHON,$(subst -config,,$(PYTHON_AUTO))) + + grep-libs = $(filter -l%,$(1)) + strip-libs = $(filter-out -l%,$(1)) +diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c +index d5bea5d3cd51a..7f7111d4b3ad0 100644 +--- a/tools/perf/builtin-c2c.c ++++ b/tools/perf/builtin-c2c.c +@@ -2694,9 +2694,7 @@ static int perf_c2c__report(int argc, const char **argv) + "the input file to process"), + OPT_INCR('N', "node-info", &c2c.node_info, + "show extra node info in report (repeat for more info)"), +-#ifdef HAVE_SLANG_SUPPORT + OPT_BOOLEAN(0, "stdio", &c2c.use_stdio, "Use the stdio interface"), +-#endif + OPT_BOOLEAN(0, "stats", &c2c.stats_only, + "Display only statistic tables (implies --stdio)"), + OPT_BOOLEAN(0, "full-symbols", &c2c.symbol_full, +@@ -2725,6 +2723,10 @@ static int perf_c2c__report(int argc, const char **argv) + if (argc) + usage_with_options(report_c2c_usage, options); + ++#ifndef HAVE_SLANG_SUPPORT ++ c2c.use_stdio = true; ++#endif ++ + if (c2c.stats_only) + c2c.use_stdio = true; + +diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c +index c679a79aef513..1f20f587e0534 100644 +--- a/tools/perf/pmu-events/jevents.c ++++ b/tools/perf/pmu-events/jevents.c +@@ -579,7 +579,7 @@ static int json_events(const char *fn, + } else if (json_streq(map, field, "ExtSel")) { + char *code = NULL; + addfield(map, &code, "", "", val); +- eventcode |= strtoul(code, NULL, 0) << 21; ++ eventcode |= strtoul(code, NULL, 0) << 8; + free(code); + } else if (json_streq(map, field, "EventName")) { + addfield(map, &je.name, "", "", val); +diff --git a/tools/perf/util/data.h b/tools/perf/util/data.h +index 75947ef6bc170..5b52ffedf0d54 100644 +--- a/tools/perf/util/data.h ++++ b/tools/perf/util/data.h +@@ -3,6 +3,7 @@ + #define __PERF_DATA_H + + #include <stdbool.h> ++#include <linux/types.h> + + enum perf_data_mode { + PERF_DATA_MODE_WRITE, +diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c +index 424ed19a9d542..ef65f7eed1ec9 100644 +--- a/tools/power/x86/turbostat/turbostat.c ++++ b/tools/power/x86/turbostat/turbostat.c +@@ -4189,6 +4189,7 @@ rapl_dram_energy_units_probe(int model, double rapl_energy_units) + case INTEL_FAM6_HASWELL_X: /* HSX */ + case INTEL_FAM6_BROADWELL_X: /* BDX */ + case INTEL_FAM6_XEON_PHI_KNL: /* KNL */ ++ case INTEL_FAM6_ICELAKE_X: /* ICX */ + return (rapl_dram_energy_units = 15.3 / 1000000); + default: + return (rapl_energy_units); +diff --git a/tools/testing/selftests/bpf/progs/btf_dump_test_case_syntax.c b/tools/testing/selftests/bpf/progs/btf_dump_test_case_syntax.c +index 31975c96e2c9c..fe43556e1a611 100644 +--- a/tools/testing/selftests/bpf/progs/btf_dump_test_case_syntax.c ++++ b/tools/testing/selftests/bpf/progs/btf_dump_test_case_syntax.c +@@ -94,7 +94,7 @@ typedef void (* (*signal_t)(int, void (*)(int)))(int); + + typedef char * (*fn_ptr_arr1_t[10])(int **); + +-typedef char * (* const (* const fn_ptr_arr2_t[5])())(char * (*)(int)); ++typedef char * (* (* const fn_ptr_arr2_t[5])())(char * (*)(int)); + + struct struct_w_typedefs { + int_t a; +diff --git a/tools/testing/selftests/cgroup/test_stress.sh b/tools/testing/selftests/cgroup/test_stress.sh +index 15d9d58963941..3c9c4554d5f6a 100755 +--- a/tools/testing/selftests/cgroup/test_stress.sh ++++ b/tools/testing/selftests/cgroup/test_stress.sh +@@ -1,4 +1,4 @@ + #!/bin/bash + # SPDX-License-Identifier: GPL-2.0 + +-./with_stress.sh -s subsys -s fork ./test_core ++./with_stress.sh -s subsys -s fork ${OUTPUT:-.}/test_core +diff --git a/tools/testing/selftests/resctrl/fill_buf.c b/tools/testing/selftests/resctrl/fill_buf.c +index 51e5cf22632f7..56ccbeae0638d 100644 +--- a/tools/testing/selftests/resctrl/fill_buf.c ++++ b/tools/testing/selftests/resctrl/fill_buf.c +@@ -121,8 +121,10 @@ static int fill_cache_read(unsigned char *start_ptr, unsigned char *end_ptr, + + /* Consume read result so that reading memory is not optimized out. */ + fp = fopen("/dev/null", "w"); +- if (!fp) ++ if (!fp) { + perror("Unable to write to /dev/null"); ++ return -1; ++ } + fprintf(fp, "Sum: %d ", ret); + fclose(fp); + |