From: Sasha Levin Date: Sat, 27 Jul 2024 14:04:15 +0000 (-0400) Subject: Fixes for 5.10 X-Git-Tag: v6.1.103~102 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=865986620a4f3175fb82e7e1d0c2439ee286242a;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.10 Signed-off-by: Sasha Levin --- diff --git a/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-board-reset.patch b/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-board-reset.patch new file mode 100644 index 00000000000..1f850e32888 --- /dev/null +++ b/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-board-reset.patch @@ -0,0 +1,36 @@ +From d8b93606c2967ace00537c3dcb89ff44547a1a9f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 17 Jun 2024 11:13:31 +0200 +Subject: ARM: dts: imx6qdl-kontron-samx6i: fix board reset + +From: Michael Walle + +[ Upstream commit b972d6b3b46345023aee56a95df8e2c137aa4ee4 ] + +On i.MX6 the board is reset by the watchdog. But in turn to do a +complete board reset, we have to assert the WDOG_B output which is +routed also to the CPLD which then do a complete power-cycle of the +board. + +Fixes: 2125212785c9 ("ARM: dts: imx6qdl-kontron-samx6i: add Kontron SMARC SoM Support") +Signed-off-by: Michael Walle +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +index cf001c251fe37..8eda848e9f0e8 100644 +--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi ++++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +@@ -813,5 +813,6 @@ &wdog1 { + /* CPLD is feeded by watchdog (hardwired) */ + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_wdog1>; ++ fsl,ext-reset-output; + status = "okay"; + }; +-- +2.43.0 + diff --git a/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-pcie-reset-polari.patch b/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-pcie-reset-polari.patch new file mode 100644 index 00000000000..308e1ff4f08 --- /dev/null +++ b/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-pcie-reset-polari.patch @@ -0,0 +1,35 @@ +From 5f88823f1a78e243efb7f3552cb904b842aa48f6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 17 Jun 2024 11:13:38 +0200 +Subject: ARM: dts: imx6qdl-kontron-samx6i: fix PCIe reset polarity + +From: Michael Walle + +[ Upstream commit df35c6e9027cf9affe699e632a48082ab1bbba4c ] + +The PCIe reset line is active low. Fix it. + +Fixes: 2a51f9dae13d ("ARM: dts: imx6qdl-kontron-samx6i: Add iMX6-based Kontron SMARC-sAMX6i module") +Signed-off-by: Michael Walle +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +index 115084500c37f..9ec1519e17195 100644 +--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi ++++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +@@ -728,7 +728,7 @@ &pcie { + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_pcie>; + wake-up-gpio = <&gpio6 18 GPIO_ACTIVE_HIGH>; +- reset-gpio = <&gpio3 13 GPIO_ACTIVE_HIGH>; ++ reset-gpio = <&gpio3 13 GPIO_ACTIVE_LOW>; + }; + + /* LCD_BKLT_PWM */ +-- +2.43.0 + diff --git a/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-phy-reset.patch b/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-phy-reset.patch new file mode 100644 index 00000000000..94615dc6b02 --- /dev/null +++ b/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-phy-reset.patch @@ -0,0 +1,49 @@ +From 12d54e59bfe54eeaec5486ae7377570dab951e90 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 17 Jun 2024 11:13:30 +0200 +Subject: ARM: dts: imx6qdl-kontron-samx6i: fix PHY reset + +From: Michael Walle + +[ Upstream commit edfea889a049abe80f0d55c0365bf60fbade272f ] + +The PHY reset line is connected to both the SoC (GPIO1_25) and +the CPLD. We must not use the GPIO1_25 as it will drive against +the output buffer of the CPLD. Instead there is another GPIO +(GPIO2_01), an input to the CPLD, which will tell the CPLD to +assert the PHY reset line. + +Fixes: 2a51f9dae13d ("ARM: dts: imx6qdl-kontron-samx6i: Add iMX6-based Kontron SMARC-sAMX6i module") +Fixes: 5694eed98cca ("ARM: dts: imx6qdl-kontron-samx6i: move phy reset into phy-node") +Signed-off-by: Michael Walle +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +index e2b7bfddedcda..cf001c251fe37 100644 +--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi ++++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +@@ -269,7 +269,7 @@ mdio { + ethphy: ethernet-phy@1 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <1>; +- reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>; ++ reset-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>; + reset-assert-us = <1000>; + }; + }; +@@ -512,7 +512,7 @@ MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0 + MX6QDL_PAD_ENET_MDIO__ENET_MDIO 0x1b0b0 + MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1b0b0 + MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0 +- MX6QDL_PAD_ENET_CRS_DV__GPIO1_IO25 0x1b0b0 /* RST_GBE0_PHY# */ ++ MX6QDL_PAD_NANDF_D1__GPIO2_IO01 0x1b0b0 /* RST_GBE0_PHY# */ + >; + }; + +-- +2.43.0 + diff --git a/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-spi0-chip-selects.patch b/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-spi0-chip-selects.patch new file mode 100644 index 00000000000..463ac555f36 --- /dev/null +++ b/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-fix-spi0-chip-selects.patch @@ -0,0 +1,88 @@ +From 611485bdf131764cee225f8f3f14d11362e9b15b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 17 Jun 2024 11:13:33 +0200 +Subject: ARM: dts: imx6qdl-kontron-samx6i: fix SPI0 chip selects + +From: Michael Walle + +[ Upstream commit 74e1c956a68a65d642447d852e95b3fbb69bebaa ] + +There is a comment in the imx6q variant dtsi claiming that these +modules will have one more chip select than the imx6dl variant. +This is wrong. Ordinary GPIOs are used for chip selects and both +variants of the module share the very same PCB and both have this +GPIO routed to the SPI0_CS1# pin of the SMARC connector. + +Fix it by moving the third chip select description to the common dtsi. + +Fixes: 2125212785c9 ("ARM: dts: imx6qdl-kontron-samx6i: add Kontron SMARC SoM Support") +Signed-off-by: Michael Walle +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi | 23 ------------------- + arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi | 5 +++- + 2 files changed, 4 insertions(+), 24 deletions(-) + +diff --git a/arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi +index 4d6a0c3e8455f..ff062f4fd726e 100644 +--- a/arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi ++++ b/arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi +@@ -5,31 +5,8 @@ + + #include "imx6q.dtsi" + #include "imx6qdl-kontron-samx6i.dtsi" +-#include + + / { + model = "Kontron SMARC sAMX6i Quad/Dual"; + compatible = "kontron,imx6q-samx6i", "fsl,imx6q"; + }; +- +-/* Quad/Dual SoMs have 3 chip-select signals */ +-&ecspi4 { +- cs-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>, +- <&gpio3 29 GPIO_ACTIVE_LOW>, +- <&gpio3 25 GPIO_ACTIVE_LOW>; +-}; +- +-&pinctrl_ecspi4 { +- fsl,pins = < +- MX6QDL_PAD_EIM_D21__ECSPI4_SCLK 0x100b1 +- MX6QDL_PAD_EIM_D28__ECSPI4_MOSI 0x100b1 +- MX6QDL_PAD_EIM_D22__ECSPI4_MISO 0x100b1 +- +- /* SPI4_IMX_CS2# - connected to internal flash */ +- MX6QDL_PAD_EIM_D24__GPIO3_IO24 0x1b0b0 +- /* SPI4_IMX_CS0# - connected to SMARC SPI0_CS0# */ +- MX6QDL_PAD_EIM_D29__GPIO3_IO29 0x1b0b0 +- /* SPI4_CS3# - connected to SMARC SPI0_CS1# */ +- MX6QDL_PAD_EIM_D25__GPIO3_IO25 0x1b0b0 +- >; +-}; +diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +index 8eda848e9f0e8..115084500c37f 100644 +--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi ++++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +@@ -244,7 +244,8 @@ &ecspi4 { + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_ecspi4>; + cs-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>, +- <&gpio3 29 GPIO_ACTIVE_LOW>; ++ <&gpio3 29 GPIO_ACTIVE_LOW>, ++ <&gpio3 25 GPIO_ACTIVE_LOW>; + status = "okay"; + + /* default boot source: workaround #1 for errata ERR006282 */ +@@ -460,6 +461,8 @@ MX6QDL_PAD_EIM_D22__ECSPI4_MISO 0x100b1 + MX6QDL_PAD_EIM_D24__GPIO3_IO24 0x1b0b0 + /* SPI_IMX_CS0# - connected to SMARC SPI0_CS0# */ + MX6QDL_PAD_EIM_D29__GPIO3_IO29 0x1b0b0 ++ /* SPI4_CS3# - connected to SMARC SPI0_CS1# */ ++ MX6QDL_PAD_EIM_D25__GPIO3_IO25 0x1b0b0 + >; + }; + +-- +2.43.0 + diff --git a/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-move-phy-reset-into-p.patch b/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-move-phy-reset-into-p.patch new file mode 100644 index 00000000000..cb3775282ca --- /dev/null +++ b/queue-5.10/arm-dts-imx6qdl-kontron-samx6i-move-phy-reset-into-p.patch @@ -0,0 +1,50 @@ +From af8849b411249b86dce30e5f88983d5f1f300374 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jul 2022 15:05:20 +0200 +Subject: ARM: dts: imx6qdl-kontron-samx6i: move phy reset into phy-node + +From: Marco Felsch + +[ Upstream commit 5694eed98cca5c164ebb5b831b65b4c9eee4b2d5 ] + +Add ethernet-phy node so we can drop the deprecated fec phy-reset-gpios +property. The reset-assert-us value is taken from the existing logic +since the fec driver will add an 1ms assert delay per default if +phy-reset-gpios is used and phy-reset-duration is not specified. + +Signed-off-by: Marco Felsch +Signed-off-by: Shawn Guo +Stable-dep-of: edfea889a049 ("ARM: dts: imx6qdl-kontron-samx6i: fix PHY reset") +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +index 37d94aa45a8b7..e2b7bfddedcda 100644 +--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi ++++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi +@@ -260,7 +260,19 @@ &fec { + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_enet>; + phy-mode = "rgmii"; +- phy-reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>; ++ phy-handle = <ðphy>; ++ ++ mdio { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ ethphy: ethernet-phy@1 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <1>; ++ reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>; ++ reset-assert-us = <1000>; ++ }; ++ }; + }; + + &i2c_intern { +-- +2.43.0 + diff --git a/queue-5.10/arm-pxa-spitz-use-gpio-descriptors-for-audio.patch b/queue-5.10/arm-pxa-spitz-use-gpio-descriptors-for-audio.patch new file mode 100644 index 00000000000..3bc1273ffb8 --- /dev/null +++ b/queue-5.10/arm-pxa-spitz-use-gpio-descriptors-for-audio.patch @@ -0,0 +1,256 @@ +From 0bcfc30297f7f6399d3d60009d3694596d61290b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 11 Sep 2019 16:43:59 +0200 +Subject: ARM: pxa: spitz: use gpio descriptors for audio + +From: Arnd Bergmann + +[ Upstream commit 726d8c965bae2d7468445d990849e281dca8cbf7 ] + +The audio driver should not use a hardwired gpio number +from the header. Change it to use a lookup table. + +Acked-by: Mark Brown +Cc: alsa-devel@alsa-project.org +Reviewed-by: Linus Walleij +Signed-off-by: Arnd Bergmann +Stable-dep-of: 78ab3d352f29 ("ARM: spitz: fix GPIO assignment for backlight") +Signed-off-by: Sasha Levin +--- + arch/arm/mach-pxa/spitz.c | 33 ++++++++++- + arch/arm/mach-pxa/{include/mach => }/spitz.h | 2 +- + arch/arm/mach-pxa/spitz_pm.c | 2 +- + sound/soc/pxa/spitz.c | 58 ++++++++------------ + 4 files changed, 57 insertions(+), 38 deletions(-) + rename arch/arm/mach-pxa/{include/mach => }/spitz.h (99%) + +diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c +index 264de0bc97d68..8f880dbc05fdb 100644 +--- a/arch/arm/mach-pxa/spitz.c ++++ b/arch/arm/mach-pxa/spitz.c +@@ -43,7 +43,7 @@ + #include + #include + #include +-#include ++#include "spitz.h" + #include "sharpsl_pm.h" + #include + +@@ -954,11 +954,42 @@ static void __init spitz_i2c_init(void) + static inline void spitz_i2c_init(void) {} + #endif + ++static struct gpiod_lookup_table spitz_audio_gpio_table = { ++ .dev_id = "spitz-audio", ++ .table = { ++ GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE, ++ "mute-l", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE, ++ "mute-r", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("sharp-scoop.1", SPITZ_GPIO_MIC_BIAS - SPITZ_SCP2_GPIO_BASE, ++ "mic", GPIO_ACTIVE_HIGH), ++ { }, ++ }, ++}; ++ ++static struct gpiod_lookup_table akita_audio_gpio_table = { ++ .dev_id = "spitz-audio", ++ .table = { ++ GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE, ++ "mute-l", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE, ++ "mute-r", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("i2c-max7310", AKITA_GPIO_MIC_BIAS - AKITA_IOEXP_GPIO_BASE, ++ "mic", GPIO_ACTIVE_HIGH), ++ { }, ++ }, ++}; ++ + /****************************************************************************** + * Audio devices + ******************************************************************************/ + static inline void spitz_audio_init(void) + { ++ if (machine_is_akita()) ++ gpiod_add_lookup_table(&akita_audio_gpio_table); ++ else ++ gpiod_add_lookup_table(&spitz_audio_gpio_table); ++ + platform_device_register_simple("spitz-audio", -1, NULL, 0); + } + +diff --git a/arch/arm/mach-pxa/include/mach/spitz.h b/arch/arm/mach-pxa/spitz.h +similarity index 99% +rename from arch/arm/mach-pxa/include/mach/spitz.h +rename to arch/arm/mach-pxa/spitz.h +index 04828d8918aa3..f97e3ebd762d5 100644 +--- a/arch/arm/mach-pxa/include/mach/spitz.h ++++ b/arch/arm/mach-pxa/spitz.h +@@ -11,7 +11,7 @@ + #define __ASM_ARCH_SPITZ_H 1 + #endif + +-#include "irqs.h" /* PXA_NR_BUILTIN_GPIO, PXA_GPIO_TO_IRQ */ ++#include /* PXA_NR_BUILTIN_GPIO, PXA_GPIO_TO_IRQ */ + #include + + /* Spitz/Akita GPIOs */ +diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c +index 25a1f8c5a7382..6167f96d7b41e 100644 +--- a/arch/arm/mach-pxa/spitz_pm.c ++++ b/arch/arm/mach-pxa/spitz_pm.c +@@ -20,7 +20,7 @@ + #include + #include + +-#include ++#include "spitz.h" + #include "pxa27x.h" + #include "sharpsl_pm.h" + +diff --git a/sound/soc/pxa/spitz.c b/sound/soc/pxa/spitz.c +index 7c1384a869ca4..44303b6eb228b 100644 +--- a/sound/soc/pxa/spitz.c ++++ b/sound/soc/pxa/spitz.c +@@ -14,13 +14,12 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include + + #include +-#include + #include "../codecs/wm8750.h" + #include "pxa2xx-i2s.h" + +@@ -37,7 +36,7 @@ + + static int spitz_jack_func; + static int spitz_spk_func; +-static int spitz_mic_gpio; ++static struct gpio_desc *gpiod_mic, *gpiod_mute_l, *gpiod_mute_r; + + static void spitz_ext_control(struct snd_soc_dapm_context *dapm) + { +@@ -56,8 +55,8 @@ static void spitz_ext_control(struct snd_soc_dapm_context *dapm) + snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); + snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); + snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack"); +- gpio_set_value(SPITZ_GPIO_MUTE_L, 1); +- gpio_set_value(SPITZ_GPIO_MUTE_R, 1); ++ gpiod_set_value(gpiod_mute_l, 1); ++ gpiod_set_value(gpiod_mute_r, 1); + break; + case SPITZ_MIC: + /* enable mic jack and bias, mute hp */ +@@ -65,8 +64,8 @@ static void spitz_ext_control(struct snd_soc_dapm_context *dapm) + snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); + snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); + snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); +- gpio_set_value(SPITZ_GPIO_MUTE_L, 0); +- gpio_set_value(SPITZ_GPIO_MUTE_R, 0); ++ gpiod_set_value(gpiod_mute_l, 0); ++ gpiod_set_value(gpiod_mute_r, 0); + break; + case SPITZ_LINE: + /* enable line jack, disable mic bias and mute hp */ +@@ -74,8 +73,8 @@ static void spitz_ext_control(struct snd_soc_dapm_context *dapm) + snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); + snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); + snd_soc_dapm_enable_pin_unlocked(dapm, "Line Jack"); +- gpio_set_value(SPITZ_GPIO_MUTE_L, 0); +- gpio_set_value(SPITZ_GPIO_MUTE_R, 0); ++ gpiod_set_value(gpiod_mute_l, 0); ++ gpiod_set_value(gpiod_mute_r, 0); + break; + case SPITZ_HEADSET: + /* enable and unmute headset jack enable mic bias, mute L hp */ +@@ -83,8 +82,8 @@ static void spitz_ext_control(struct snd_soc_dapm_context *dapm) + snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); + snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); + snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack"); +- gpio_set_value(SPITZ_GPIO_MUTE_L, 0); +- gpio_set_value(SPITZ_GPIO_MUTE_R, 1); ++ gpiod_set_value(gpiod_mute_l, 0); ++ gpiod_set_value(gpiod_mute_r, 1); + break; + case SPITZ_HP_OFF: + +@@ -93,8 +92,8 @@ static void spitz_ext_control(struct snd_soc_dapm_context *dapm) + snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); + snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); + snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); +- gpio_set_value(SPITZ_GPIO_MUTE_L, 0); +- gpio_set_value(SPITZ_GPIO_MUTE_R, 0); ++ gpiod_set_value(gpiod_mute_l, 0); ++ gpiod_set_value(gpiod_mute_r, 0); + break; + } + +@@ -199,7 +198,7 @@ static int spitz_set_spk(struct snd_kcontrol *kcontrol, + static int spitz_mic_bias(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *k, int event) + { +- gpio_set_value_cansleep(spitz_mic_gpio, SND_SOC_DAPM_EVENT_ON(event)); ++ gpiod_set_value_cansleep(gpiod_mic, SND_SOC_DAPM_EVENT_ON(event)); + return 0; + } + +@@ -287,39 +286,28 @@ static int spitz_probe(struct platform_device *pdev) + struct snd_soc_card *card = &snd_soc_spitz; + int ret; + +- if (machine_is_akita()) +- spitz_mic_gpio = AKITA_GPIO_MIC_BIAS; +- else +- spitz_mic_gpio = SPITZ_GPIO_MIC_BIAS; +- +- ret = gpio_request(spitz_mic_gpio, "MIC GPIO"); +- if (ret) +- goto err1; +- +- ret = gpio_direction_output(spitz_mic_gpio, 0); +- if (ret) +- goto err2; ++ gpiod_mic = devm_gpiod_get(&pdev->dev, "mic", GPIOD_OUT_LOW); ++ if (IS_ERR(gpiod_mic)) ++ return PTR_ERR(gpiod_mic); ++ gpiod_mute_l = devm_gpiod_get(&pdev->dev, "mute-l", GPIOD_OUT_LOW); ++ if (IS_ERR(gpiod_mute_l)) ++ return PTR_ERR(gpiod_mute_l); ++ gpiod_mute_r = devm_gpiod_get(&pdev->dev, "mute-r", GPIOD_OUT_LOW); ++ if (IS_ERR(gpiod_mute_r)) ++ return PTR_ERR(gpiod_mute_r); + + card->dev = &pdev->dev; + + ret = devm_snd_soc_register_card(&pdev->dev, card); +- if (ret) { ++ if (ret) + dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", + ret); +- goto err2; +- } +- +- return 0; + +-err2: +- gpio_free(spitz_mic_gpio); +-err1: + return ret; + } + + static int spitz_remove(struct platform_device *pdev) + { +- gpio_free(spitz_mic_gpio); + return 0; + } + +-- +2.43.0 + diff --git a/queue-5.10/arm-spitz-fix-gpio-assignment-for-backlight.patch b/queue-5.10/arm-spitz-fix-gpio-assignment-for-backlight.patch new file mode 100644 index 00000000000..bfb0b797d5d --- /dev/null +++ b/queue-5.10/arm-spitz-fix-gpio-assignment-for-backlight.patch @@ -0,0 +1,91 @@ +From e40a90a12417e2c6c34428acd98410a3888d2dac Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 Jun 2024 11:08:41 -0700 +Subject: ARM: spitz: fix GPIO assignment for backlight + +From: Dmitry Torokhov + +[ Upstream commit 78ab3d352f2982bf3f7e506bfbaba7afee1ed8a9 ] + +GPIOs controlling backlight on Spitz and Akita are coming from GPIO +expanders, not the pxa27xx-gpio block, correct it. + +Additionally GPIO lookup tables operate with pin numbers rather than +legacy GPIO numbers, fix that as well. Use raw numbers instead of legacy +GPIO names to avoid confusion. + +Fixes: ee0c8e494cc3 ("backlight: corgi: Convert to use GPIO descriptors") +Reviewed-by: Linus Walleij +Signed-off-by: Dmitry Torokhov +Link: https://lore.kernel.org/r/20240628180852.1738922-2-dmitry.torokhov@gmail.com +Signed-off-by: Arnd Bergmann +Signed-off-by: Sasha Levin +--- + arch/arm/mach-pxa/spitz.c | 30 ++++++++++-------------------- + 1 file changed, 10 insertions(+), 20 deletions(-) + +diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c +index 8f880dbc05fdb..9bdc20706d187 100644 +--- a/arch/arm/mach-pxa/spitz.c ++++ b/arch/arm/mach-pxa/spitz.c +@@ -516,10 +516,8 @@ static struct pxa2xx_spi_chip spitz_ads7846_chip = { + static struct gpiod_lookup_table spitz_lcdcon_gpio_table = { + .dev_id = "spi2.1", + .table = { +- GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_BACKLIGHT_CONT, +- "BL_CONT", GPIO_ACTIVE_LOW), +- GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_BACKLIGHT_ON, +- "BL_ON", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("sharp-scoop.1", 6, "BL_CONT", GPIO_ACTIVE_LOW), ++ GPIO_LOOKUP("sharp-scoop.1", 7, "BL_ON", GPIO_ACTIVE_HIGH), + { }, + }, + }; +@@ -527,10 +525,8 @@ static struct gpiod_lookup_table spitz_lcdcon_gpio_table = { + static struct gpiod_lookup_table akita_lcdcon_gpio_table = { + .dev_id = "spi2.1", + .table = { +- GPIO_LOOKUP("gpio-pxa", AKITA_GPIO_BACKLIGHT_CONT, +- "BL_CONT", GPIO_ACTIVE_LOW), +- GPIO_LOOKUP("gpio-pxa", AKITA_GPIO_BACKLIGHT_ON, +- "BL_ON", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("i2c-max7310", 3, "BL_ON", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("i2c-max7310", 4, "BL_CONT", GPIO_ACTIVE_LOW), + { }, + }, + }; +@@ -957,12 +953,9 @@ static inline void spitz_i2c_init(void) {} + static struct gpiod_lookup_table spitz_audio_gpio_table = { + .dev_id = "spitz-audio", + .table = { +- GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE, +- "mute-l", GPIO_ACTIVE_HIGH), +- GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE, +- "mute-r", GPIO_ACTIVE_HIGH), +- GPIO_LOOKUP("sharp-scoop.1", SPITZ_GPIO_MIC_BIAS - SPITZ_SCP2_GPIO_BASE, +- "mic", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("sharp-scoop.0", 3, "mute-l", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("sharp-scoop.0", 4, "mute-r", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("sharp-scoop.1", 8, "mic", GPIO_ACTIVE_HIGH), + { }, + }, + }; +@@ -970,12 +963,9 @@ static struct gpiod_lookup_table spitz_audio_gpio_table = { + static struct gpiod_lookup_table akita_audio_gpio_table = { + .dev_id = "spitz-audio", + .table = { +- GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE, +- "mute-l", GPIO_ACTIVE_HIGH), +- GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE, +- "mute-r", GPIO_ACTIVE_HIGH), +- GPIO_LOOKUP("i2c-max7310", AKITA_GPIO_MIC_BIAS - AKITA_IOEXP_GPIO_BASE, +- "mic", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("sharp-scoop.0", 3, "mute-l", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("sharp-scoop.0", 4, "mute-r", GPIO_ACTIVE_HIGH), ++ GPIO_LOOKUP("i2c-max7310", 2, "mic", GPIO_ACTIVE_HIGH), + { }, + }, + }; +-- +2.43.0 + diff --git a/queue-5.10/arm64-dts-amlogic-gx-correct-hdmi-clocks.patch b/queue-5.10/arm64-dts-amlogic-gx-correct-hdmi-clocks.patch new file mode 100644 index 00000000000..ff08bcc1ae5 --- /dev/null +++ b/queue-5.10/arm64-dts-amlogic-gx-correct-hdmi-clocks.patch @@ -0,0 +1,63 @@ +From dafed29468f6b97fe3d126731d67b86d2faa513c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jun 2024 17:27:30 +0200 +Subject: arm64: dts: amlogic: gx: correct hdmi clocks + +From: Jerome Brunet + +[ Upstream commit 0602ba0dcd0e76067a0b7543e92b2de3fb231073 ] + +The clocks provided to HDMI tx are not consistent between gx and g12: +* gx receives the peripheral clock as 'isfr' while g12 receives it as + 'iahb' +* g12 gets the HDMI system clock as 'isfr' but gx does not even get it. + It surely needs that clock since the driver is directly poking around + the clock controller's registers for that clock. + +Align gx SoCs with g12 and provide: + * the HDMI peripheral clock as 'iahb' + * the HDMI system clock as 'isfr' + +Fixes: 6939db7e0dbf ("ARM64: dts: meson-gx: Add support for HDMI output") +Signed-off-by: Jerome Brunet +Link: https://lore.kernel.org/r/20240626152733.1350376-2-jbrunet@baylibre.com +Signed-off-by: Neil Armstrong +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 4 ++-- + arch/arm64/boot/dts/amlogic/meson-gxl.dtsi | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +index 7c029f552a23b..256c46771db78 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi +@@ -311,8 +311,8 @@ &hdmi_tx { + <&reset RESET_HDMI_SYSTEM_RESET>, + <&reset RESET_HDMI_TX>; + reset-names = "hdmitx_apb", "hdmitx", "hdmitx_phy"; +- clocks = <&clkc CLKID_HDMI_PCLK>, +- <&clkc CLKID_CLK81>, ++ clocks = <&clkc CLKID_HDMI>, ++ <&clkc CLKID_HDMI_PCLK>, + <&clkc CLKID_GCLK_VENCI_INT0>; + clock-names = "isfr", "iahb", "venci"; + }; +diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi +index 3500229350522..a689bd14ece99 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi +@@ -323,8 +323,8 @@ &hdmi_tx { + <&reset RESET_HDMI_SYSTEM_RESET>, + <&reset RESET_HDMI_TX>; + reset-names = "hdmitx_apb", "hdmitx", "hdmitx_phy"; +- clocks = <&clkc CLKID_HDMI_PCLK>, +- <&clkc CLKID_CLK81>, ++ clocks = <&clkc CLKID_HDMI>, ++ <&clkc CLKID_HDMI_PCLK>, + <&clkc CLKID_GCLK_VENCI_INT0>; + clock-names = "isfr", "iahb", "venci"; + }; +-- +2.43.0 + diff --git a/queue-5.10/arm64-dts-mediatek-mt7622-fix-emmc-pinctrl-mux.patch b/queue-5.10/arm64-dts-mediatek-mt7622-fix-emmc-pinctrl-mux.patch new file mode 100644 index 00000000000..36bfa61c4a6 --- /dev/null +++ b/queue-5.10/arm64-dts-mediatek-mt7622-fix-emmc-pinctrl-mux.patch @@ -0,0 +1,66 @@ +From c7ac8bd12f888f7820e7646fe3f006a639e32cd9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 4 Jun 2024 09:49:16 +0200 +Subject: arm64: dts: mediatek: mt7622: fix "emmc" pinctrl mux +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Rafał Miłecki + +[ Upstream commit aebba1030a5766cdf894ed4ab0cac7aed5aee9c1 ] + +Value "emmc_rst" is a group name and should be part of the "groups" +property. + +This fixes: +arch/arm64/boot/dts/mediatek/mt7622-rfb1.dtb: pinctrl@10211000: emmc-pins-default:mux:function: ['emmc', 'emmc_rst'] is too long + from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt7622-pinctrl.yaml# +arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dtb: pinctrl@10211000: emmc-pins-default:mux:function: ['emmc', 'emmc_rst'] is too long + from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt7622-pinctrl.yaml# + +Fixes: 3725ba3f5574 ("arm64: dts: mt7622: add pinctrl related device nodes") +Fixes: 0b6286dd96c0 ("arm64: dts: mt7622: add bananapi BPI-R64 board") +Signed-off-by: Rafał Miłecki +Reviewed-by: AngeloGioacchino Del Regno +Link: https://lore.kernel.org/r/20240604074916.7929-1-zajec5@gmail.com +Signed-off-by: AngeloGioacchino Del Regno +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts | 4 ++-- + arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +index 778174a7d649b..46e412b436ed9 100644 +--- a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts ++++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +@@ -285,8 +285,8 @@ asm_sel { + /* eMMC is shared pin with parallel NAND */ + emmc_pins_default: emmc-pins-default { + mux { +- function = "emmc", "emmc_rst"; +- groups = "emmc"; ++ function = "emmc"; ++ groups = "emmc", "emmc_rst"; + }; + + /* "NDL0","NDL1","NDL2","NDL3","NDL4","NDL5","NDL6","NDL7", +diff --git a/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts +index 810575de66702..5dd993496a5c0 100644 +--- a/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts ++++ b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts +@@ -249,8 +249,8 @@ &pio { + /* eMMC is shared pin with parallel NAND */ + emmc_pins_default: emmc-pins-default { + mux { +- function = "emmc", "emmc_rst"; +- groups = "emmc"; ++ function = "emmc"; ++ groups = "emmc", "emmc_rst"; + }; + + /* "NDL0","NDL1","NDL2","NDL3","NDL4","NDL5","NDL6","NDL7", +-- +2.43.0 + diff --git a/queue-5.10/arm64-dts-mediatek-mt8183-kukui-drop-bogus-output-en.patch b/queue-5.10/arm64-dts-mediatek-mt8183-kukui-drop-bogus-output-en.patch new file mode 100644 index 00000000000..f8fcd02b5ba --- /dev/null +++ b/queue-5.10/arm64-dts-mediatek-mt8183-kukui-drop-bogus-output-en.patch @@ -0,0 +1,51 @@ +From 85e60efb8fdc58eb4e94899c54c76eece5f4c879 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Apr 2024 15:56:12 +0800 +Subject: arm64: dts: mediatek: mt8183-kukui: Drop bogus output-enable property + +From: Chen-Yu Tsai + +[ Upstream commit e9a9055fdcdc1e5a27cef118c5b4f09cdd2fa28e ] + +The "output-enable" property is set on uart1's RTS pin. This is bogus +because the hardware does not actually have a controllable output +buffer. Secondly, the implementation incorrectly treats this property +as a request to switch the pin to GPIO output. This does not fit the +intended semantic of "output-enable" and it does not have any affect +either because the pin is muxed to the UART function, not the GPIO +function. + +Drop the property. + +Fixes: cd894e274b74 ("arm64: dts: mt8183: Add krane-sku176 board") +Signed-off-by: Chen-Yu Tsai +Link: https://lore.kernel.org/r/20240412075613.1200048-1-wenst@chromium.org +Signed-off-by: AngeloGioacchino Del Regno +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi +index a4f860bb4a842..ad8b11267c7d2 100644 +--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi ++++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi +@@ -628,7 +628,6 @@ pins_tx { + }; + pins_rts { + pinmux = ; +- output-enable; + }; + pins_cts { + pinmux = ; +@@ -647,7 +646,6 @@ pins_tx { + }; + pins_rts { + pinmux = ; +- output-enable; + }; + pins_cts { + pinmux = ; +-- +2.43.0 + diff --git a/queue-5.10/arm64-dts-qcom-msm8996-specify-ufs-core_clk-frequenc.patch b/queue-5.10/arm64-dts-qcom-msm8996-specify-ufs-core_clk-frequenc.patch new file mode 100644 index 00000000000..cd53cac880a --- /dev/null +++ b/queue-5.10/arm64-dts-qcom-msm8996-specify-ufs-core_clk-frequenc.patch @@ -0,0 +1,42 @@ +From 05007e05d8489d6f712e6e55e02385b5a2eb5faa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Apr 2024 03:04:31 +0300 +Subject: arm64: dts: qcom: msm8996: specify UFS core_clk frequencies + +From: Dmitry Baryshkov + +[ Upstream commit 02f838b7f8cdfb7a96b7f08e7f6716f230bdecba ] + +Follow the example of other platforms and specify core_clk frequencies +in the frequency table in addition to the core_clk_src frequencies. The +driver should be setting the leaf frequency instead of some interim +clock freq. + +Suggested-by: Nitin Rawat +Fixes: 57fc67ef0d35 ("arm64: dts: qcom: msm8996: Add ufs related nodes") +Reviewed-by: Konrad Dybcio +Reviewed-by: Manivannan Sadhasivam +Signed-off-by: Dmitry Baryshkov +Link: https://lore.kernel.org/r/20240408-msm8996-fix-ufs-v4-1-ee1a28bf8579@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/msm8996.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi +index e990e727cc0fa..118fd1e47d5c4 100644 +--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi +@@ -927,7 +927,7 @@ ufshc: ufshc@624000 { + <&gcc GCC_UFS_RX_SYMBOL_0_CLK>; + freq-table-hz = + <100000000 200000000>, +- <0 0>, ++ <100000000 200000000>, + <0 0>, + <0 0>, + <0 0>, +-- +2.43.0 + diff --git a/queue-5.10/arm64-dts-qcom-sdm845-add-power-domain-to-ufs-phy.patch b/queue-5.10/arm64-dts-qcom-sdm845-add-power-domain-to-ufs-phy.patch new file mode 100644 index 00000000000..ccc4630e0e9 --- /dev/null +++ b/queue-5.10/arm64-dts-qcom-sdm845-add-power-domain-to-ufs-phy.patch @@ -0,0 +1,38 @@ +From 91b533b15c46423ec33a06ebb28e7b7dbd58c3b2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 May 2024 19:19:32 +0300 +Subject: arm64: dts: qcom: sdm845: add power-domain to UFS PHY + +From: Dmitry Baryshkov + +[ Upstream commit fd39ae8b9bc10419b1e4b849cdbc6755a967ade1 ] + +The UFS PHY is powered on via the UFS_PHY_GDSC power domain. Add +corresponding power-domain the the PHY node. + +Fixes: cc16687fbd74 ("arm64: dts: qcom: sdm845: add UFS controller") +Signed-off-by: Dmitry Baryshkov +Reviewed-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20240501-qcom-phy-fixes-v1-6-f1fd15c33fb3@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/sdm845.dtsi | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qcom/sdm845.dtsi +index b00f6d8bc8bac..da48ae60155af 100644 +--- a/arch/arm64/boot/dts/qcom/sdm845.dtsi ++++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi +@@ -2125,6 +2125,8 @@ ufs_mem_phy: phy@1d87000 { + clocks = <&gcc GCC_UFS_MEM_CLKREF_CLK>, + <&gcc GCC_UFS_PHY_PHY_AUX_CLK>; + ++ power-domains = <&gcc UFS_PHY_GDSC>; ++ + resets = <&ufs_mem_hc 0>; + reset-names = "ufsphy"; + status = "disabled"; +-- +2.43.0 + diff --git a/queue-5.10/arm64-dts-rockchip-increase-vop-clk-rate-on-rk3328.patch b/queue-5.10/arm64-dts-rockchip-increase-vop-clk-rate-on-rk3328.patch new file mode 100644 index 00000000000..3c14614bfe6 --- /dev/null +++ b/queue-5.10/arm64-dts-rockchip-increase-vop-clk-rate-on-rk3328.patch @@ -0,0 +1,42 @@ +From 493aaa94d0b7cd1e04500495c7336b8260bac1a2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 15 Jun 2024 17:03:52 +0000 +Subject: arm64: dts: rockchip: Increase VOP clk rate on RK3328 + +From: Jonas Karlman + +[ Upstream commit 0f2ddb128fa20f8441d903285632f2c69e90fae1 ] + +The VOP on RK3328 needs to run at a higher rate in order to produce a +proper 3840x2160 signal. + +Change to use 300MHz for VIO clk and 400MHz for VOP clk, same rates used +by vendor 4.4 kernel. + +Fixes: 52e02d377a72 ("arm64: dts: rockchip: add core dtsi file for RK3328 SoCs") +Signed-off-by: Jonas Karlman +Link: https://lore.kernel.org/r/20240615170417.3134517-2-jonas@kwiboo.se +Signed-off-by: Heiko Stuebner +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/rockchip/rk3328.dtsi | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +index 10df6636a6b6c..3c6398e98f767 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -811,8 +811,8 @@ cru: clock-controller@ff440000 { + <0>, <24000000>, + <24000000>, <24000000>, + <15000000>, <15000000>, +- <100000000>, <100000000>, +- <100000000>, <100000000>, ++ <300000000>, <100000000>, ++ <400000000>, <100000000>, + <50000000>, <100000000>, + <100000000>, <100000000>, + <50000000>, <50000000>, +-- +2.43.0 + diff --git a/queue-5.10/asoc-max98088-check-for-clk_prepare_enable-error.patch b/queue-5.10/asoc-max98088-check-for-clk_prepare_enable-error.patch new file mode 100644 index 00000000000..a6c7d4c9494 --- /dev/null +++ b/queue-5.10/asoc-max98088-check-for-clk_prepare_enable-error.patch @@ -0,0 +1,53 @@ +From 0e96cea1c1b825cdc7fa1502b579b2e60dbd5296 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 Jun 2024 16:05:34 +0800 +Subject: ASoC: max98088: Check for clk_prepare_enable() error + +From: Chen Ni + +[ Upstream commit 1a70579723fde3624a72dfea6e79e55be6e36659 ] + +clk_prepare_enable() may fail, so we should better check its return +value and propagate it in the case of error. + +Fixes: 62a7fc32a628 ("ASoC: max98088: Add master clock handling") +Signed-off-by: Chen Ni +Link: https://patch.msgid.link/20240628080534.843815-1-nichen@iscas.ac.cn +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/max98088.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c +index f8e49e45ce33f..a71fbfddc29a7 100644 +--- a/sound/soc/codecs/max98088.c ++++ b/sound/soc/codecs/max98088.c +@@ -1319,6 +1319,7 @@ static int max98088_set_bias_level(struct snd_soc_component *component, + enum snd_soc_bias_level level) + { + struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component); ++ int ret; + + switch (level) { + case SND_SOC_BIAS_ON: +@@ -1334,10 +1335,13 @@ static int max98088_set_bias_level(struct snd_soc_component *component, + */ + if (!IS_ERR(max98088->mclk)) { + if (snd_soc_component_get_bias_level(component) == +- SND_SOC_BIAS_ON) ++ SND_SOC_BIAS_ON) { + clk_disable_unprepare(max98088->mclk); +- else +- clk_prepare_enable(max98088->mclk); ++ } else { ++ ret = clk_prepare_enable(max98088->mclk); ++ if (ret) ++ return ret; ++ } + } + break; + +-- +2.43.0 + diff --git a/queue-5.10/ath11k-dp-stop-rx-pktlog-before-suspend.patch b/queue-5.10/ath11k-dp-stop-rx-pktlog-before-suspend.patch new file mode 100644 index 00000000000..3afd561c180 --- /dev/null +++ b/queue-5.10/ath11k-dp-stop-rx-pktlog-before-suspend.patch @@ -0,0 +1,131 @@ +From 3d3a8456e51d4592c61c64ccac80568d6e875d6e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 11 Dec 2020 19:35:46 +0200 +Subject: ath11k: dp: stop rx pktlog before suspend + +From: Carl Huang + +[ Upstream commit 840c36fa727aea13a2401a5d1d33b722b79df5af ] + +Stop dp rx pktlog when entering suspend and reap the mon_status buffer to keep +it empty. During resume restart the reap timer. + +Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1 + +Signed-off-by: Carl Huang +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1607708150-21066-7-git-send-email-kvalo@codeaurora.org +Stable-dep-of: d2b0ca38d362 ("wifi: ath11k: fix wrong handling of CCMP256 and GCMP ciphers") +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath11k/dp.h | 1 + + drivers/net/wireless/ath/ath11k/dp_rx.c | 48 +++++++++++++++++++++++++ + drivers/net/wireless/ath/ath11k/dp_rx.h | 3 ++ + drivers/net/wireless/ath/ath11k/mac.c | 4 +++ + 4 files changed, 56 insertions(+) + +diff --git a/drivers/net/wireless/ath/ath11k/dp.h b/drivers/net/wireless/ath/ath11k/dp.h +index c4972233149f4..89dc3ab2e2fb5 100644 +--- a/drivers/net/wireless/ath/ath11k/dp.h ++++ b/drivers/net/wireless/ath/ath11k/dp.h +@@ -40,6 +40,7 @@ struct dp_rx_tid { + + #define DP_REO_DESC_FREE_THRESHOLD 64 + #define DP_REO_DESC_FREE_TIMEOUT_MS 1000 ++#define DP_MON_PURGE_TIMEOUT_MS 100 + #define DP_MON_SERVICE_BUDGET 128 + + struct dp_reo_cache_flush_elem { +diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.c b/drivers/net/wireless/ath/ath11k/dp_rx.c +index a50325f4634ba..a83b5edea66b9 100644 +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -274,6 +274,28 @@ static void ath11k_dp_service_mon_ring(struct timer_list *t) + msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL)); + } + ++static int ath11k_dp_purge_mon_ring(struct ath11k_base *ab) ++{ ++ int i, reaped = 0; ++ unsigned long timeout = jiffies + msecs_to_jiffies(DP_MON_PURGE_TIMEOUT_MS); ++ ++ do { ++ for (i = 0; i < ab->hw_params.num_rxmda_per_pdev; i++) ++ reaped += ath11k_dp_rx_process_mon_rings(ab, i, ++ NULL, ++ DP_MON_SERVICE_BUDGET); ++ ++ /* nothing more to reap */ ++ if (reaped < DP_MON_SERVICE_BUDGET) ++ return 0; ++ ++ } while (time_before(jiffies, timeout)); ++ ++ ath11k_warn(ab, "dp mon ring purge timeout"); ++ ++ return -ETIMEDOUT; ++} ++ + /* Returns number of Rx buffers replenished */ + int ath11k_dp_rxbufs_replenish(struct ath11k_base *ab, int mac_id, + struct dp_rxdma_ring *rx_ring, +@@ -5065,3 +5087,29 @@ int ath11k_dp_rx_pdev_mon_detach(struct ath11k *ar) + ath11k_dp_mon_link_free(ar); + return 0; + } ++ ++int ath11k_dp_rx_pktlog_start(struct ath11k_base *ab) ++{ ++ /* start reap timer */ ++ mod_timer(&ab->mon_reap_timer, ++ jiffies + msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL)); ++ ++ return 0; ++} ++ ++int ath11k_dp_rx_pktlog_stop(struct ath11k_base *ab, bool stop_timer) ++{ ++ int ret; ++ ++ if (stop_timer) ++ del_timer_sync(&ab->mon_reap_timer); ++ ++ /* reap all the monitor related rings */ ++ ret = ath11k_dp_purge_mon_ring(ab); ++ if (ret) { ++ ath11k_warn(ab, "failed to purge dp mon ring: %d\n", ret); ++ return ret; ++ } ++ ++ return 0; ++} +diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.h b/drivers/net/wireless/ath/ath11k/dp_rx.h +index 6986752fc4b68..623da3bf9dc81 100644 +--- a/drivers/net/wireless/ath/ath11k/dp_rx.h ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.h +@@ -92,4 +92,7 @@ int ath11k_dp_rx_pdev_mon_detach(struct ath11k *ar); + int ath11k_dp_rx_pdev_mon_attach(struct ath11k *ar); + int ath11k_peer_rx_frag_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id); + ++int ath11k_dp_rx_pktlog_start(struct ath11k_base *ab); ++int ath11k_dp_rx_pktlog_stop(struct ath11k_base *ab, bool stop_timer); ++ + #endif /* ATH11K_DP_RX_H */ +diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c +index 3170c54c97b74..835e181d22cb7 100644 +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -4149,6 +4149,10 @@ static int ath11k_mac_config_mon_status_default(struct ath11k *ar, bool enable) + &tlv_filter); + } + ++ if (enable && !ar->ab->hw_params.rxdma1_enable) ++ mod_timer(&ar->ab->mon_reap_timer, jiffies + ++ msecs_to_jiffies(ATH11K_MON_TIMER_INTERVAL)); ++ + return ret; + } + +-- +2.43.0 + diff --git a/queue-5.10/bna-adjust-name-buf-size-of-bna_tcb-and-bna_ccb-stru.patch b/queue-5.10/bna-adjust-name-buf-size-of-bna_tcb-and-bna_ccb-stru.patch new file mode 100644 index 00000000000..46c9febfb82 --- /dev/null +++ b/queue-5.10/bna-adjust-name-buf-size-of-bna_tcb-and-bna_ccb-stru.patch @@ -0,0 +1,77 @@ +From f94d8fcbbab37fc338600bec99fdc5c46c9d52dc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Jul 2024 10:50:08 +0000 +Subject: bna: adjust 'name' buf size of bna_tcb and bna_ccb structures + +From: Alexey Kodanev + +[ Upstream commit c9741a03dc8e491e57b95fba0058ab46b7e506da ] + +To have enough space to write all possible sprintf() args. Currently +'name' size is 16, but the first '%s' specifier may already need at +least 16 characters, since 'bnad->netdev->name' is used there. + +For '%d' specifiers, assume that they require: + * 1 char for 'tx_id + tx_info->tcb[i]->id' sum, BNAD_MAX_TXQ_PER_TX is 8 + * 2 chars for 'rx_id + rx_info->rx_ctrl[i].ccb->id', BNAD_MAX_RXP_PER_RX + is 16 + +And replace sprintf with snprintf. + +Detected using the static analysis tool - Svace. + +Fixes: 8b230ed8ec96 ("bna: Brocade 10Gb Ethernet device driver") +Signed-off-by: Alexey Kodanev +Reviewed-by: Simon Horman +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/brocade/bna/bna_types.h | 2 +- + drivers/net/ethernet/brocade/bna/bnad.c | 11 ++++++----- + 2 files changed, 7 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/ethernet/brocade/bna/bna_types.h b/drivers/net/ethernet/brocade/bna/bna_types.h +index 666b6922e24db..ebf54d74c2bbe 100644 +--- a/drivers/net/ethernet/brocade/bna/bna_types.h ++++ b/drivers/net/ethernet/brocade/bna/bna_types.h +@@ -410,7 +410,7 @@ struct bna_ib { + /* Tx object */ + + /* Tx datapath control structure */ +-#define BNA_Q_NAME_SIZE 16 ++#define BNA_Q_NAME_SIZE (IFNAMSIZ + 6) + struct bna_tcb { + /* Fast path */ + void **sw_qpt; +diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c +index 7e4e831d720f8..9ccfb038ffc70 100644 +--- a/drivers/net/ethernet/brocade/bna/bnad.c ++++ b/drivers/net/ethernet/brocade/bna/bnad.c +@@ -1535,8 +1535,9 @@ bnad_tx_msix_register(struct bnad *bnad, struct bnad_tx_info *tx_info, + + for (i = 0; i < num_txqs; i++) { + vector_num = tx_info->tcb[i]->intr_vector; +- sprintf(tx_info->tcb[i]->name, "%s TXQ %d", bnad->netdev->name, +- tx_id + tx_info->tcb[i]->id); ++ snprintf(tx_info->tcb[i]->name, BNA_Q_NAME_SIZE, "%s TXQ %d", ++ bnad->netdev->name, ++ tx_id + tx_info->tcb[i]->id); + err = request_irq(bnad->msix_table[vector_num].vector, + (irq_handler_t)bnad_msix_tx, 0, + tx_info->tcb[i]->name, +@@ -1586,9 +1587,9 @@ bnad_rx_msix_register(struct bnad *bnad, struct bnad_rx_info *rx_info, + + for (i = 0; i < num_rxps; i++) { + vector_num = rx_info->rx_ctrl[i].ccb->intr_vector; +- sprintf(rx_info->rx_ctrl[i].ccb->name, "%s CQ %d", +- bnad->netdev->name, +- rx_id + rx_info->rx_ctrl[i].ccb->id); ++ snprintf(rx_info->rx_ctrl[i].ccb->name, BNA_Q_NAME_SIZE, ++ "%s CQ %d", bnad->netdev->name, ++ rx_id + rx_info->rx_ctrl[i].ccb->id); + err = request_irq(bnad->msix_table[vector_num].vector, + (irq_handler_t)bnad_msix_rx, 0, + rx_info->rx_ctrl[i].ccb->name, +-- +2.43.0 + diff --git a/queue-5.10/bnxt_re-fix-imm_data-endianness.patch b/queue-5.10/bnxt_re-fix-imm_data-endianness.patch new file mode 100644 index 00000000000..2632978b9f7 --- /dev/null +++ b/queue-5.10/bnxt_re-fix-imm_data-endianness.patch @@ -0,0 +1,105 @@ +From cdb7473a66507a71b62f415136bc49a9da7a1592 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jul 2024 14:21:02 +0200 +Subject: bnxt_re: Fix imm_data endianness + +From: Jack Wang + +[ Upstream commit 95b087f87b780daafad1dbb2c84e81b729d5d33f ] + +When map a device between servers with MLX and BCM RoCE nics, RTRS +server complain about unknown imm type, and can't map the device, + +After more debug, it seems bnxt_re wrongly handle the +imm_data, this patch fixed the compat issue with MLX for us. + +In off list discussion, Selvin confirmed HW is working in little endian format +and all data needs to be converted to LE while providing. + +This patch fix the endianness for imm_data + +Fixes: 1ac5a4047975 ("RDMA/bnxt_re: Add bnxt_re RoCE driver") +Signed-off-by: Jack Wang +Link: https://lore.kernel.org/r/20240710122102.37569-1-jinpu.wang@ionos.com +Acked-by: Selvin Xavier +Signed-off-by: Leon Romanovsky +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/bnxt_re/ib_verbs.c | 8 ++++---- + drivers/infiniband/hw/bnxt_re/qplib_fp.h | 6 +++--- + 2 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c +index a0d7777acb6d4..f16e0b2c7895e 100644 +--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c ++++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c +@@ -2357,7 +2357,7 @@ static int bnxt_re_build_send_wqe(struct bnxt_re_qp *qp, + break; + case IB_WR_SEND_WITH_IMM: + wqe->type = BNXT_QPLIB_SWQE_TYPE_SEND_WITH_IMM; +- wqe->send.imm_data = wr->ex.imm_data; ++ wqe->send.imm_data = be32_to_cpu(wr->ex.imm_data); + break; + case IB_WR_SEND_WITH_INV: + wqe->type = BNXT_QPLIB_SWQE_TYPE_SEND_WITH_INV; +@@ -2387,7 +2387,7 @@ static int bnxt_re_build_rdma_wqe(const struct ib_send_wr *wr, + break; + case IB_WR_RDMA_WRITE_WITH_IMM: + wqe->type = BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE_WITH_IMM; +- wqe->rdma.imm_data = wr->ex.imm_data; ++ wqe->rdma.imm_data = be32_to_cpu(wr->ex.imm_data); + break; + case IB_WR_RDMA_READ: + wqe->type = BNXT_QPLIB_SWQE_TYPE_RDMA_READ; +@@ -3334,7 +3334,7 @@ static void bnxt_re_process_res_shadow_qp_wc(struct bnxt_re_qp *gsi_sqp, + wc->byte_len = orig_cqe->length; + wc->qp = &gsi_qp->ib_qp; + +- wc->ex.imm_data = orig_cqe->immdata; ++ wc->ex.imm_data = cpu_to_be32(le32_to_cpu(orig_cqe->immdata)); + wc->src_qp = orig_cqe->src_qp; + memcpy(wc->smac, orig_cqe->smac, ETH_ALEN); + if (bnxt_re_is_vlan_pkt(orig_cqe, &vlan_id, &sl)) { +@@ -3474,7 +3474,7 @@ int bnxt_re_poll_cq(struct ib_cq *ib_cq, int num_entries, struct ib_wc *wc) + continue; + } + wc->qp = &qp->ib_qp; +- wc->ex.imm_data = cqe->immdata; ++ wc->ex.imm_data = cpu_to_be32(le32_to_cpu(cqe->immdata)); + wc->src_qp = cqe->src_qp; + memcpy(wc->smac, cqe->smac, ETH_ALEN); + wc->port_num = 1; +diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.h b/drivers/infiniband/hw/bnxt_re/qplib_fp.h +index 667f93d90045e..f112f013df7d9 100644 +--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.h ++++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.h +@@ -162,7 +162,7 @@ struct bnxt_qplib_swqe { + /* Send, with imm, inval key */ + struct { + union { +- __be32 imm_data; ++ u32 imm_data; + u32 inv_key; + }; + u32 q_key; +@@ -180,7 +180,7 @@ struct bnxt_qplib_swqe { + /* RDMA write, with imm, read */ + struct { + union { +- __be32 imm_data; ++ u32 imm_data; + u32 inv_key; + }; + u64 remote_va; +@@ -372,7 +372,7 @@ struct bnxt_qplib_cqe { + u16 cfa_meta; + u64 wr_id; + union { +- __be32 immdata; ++ __le32 immdata; + u32 invrkey; + }; + u64 qp_handle; +-- +2.43.0 + diff --git a/queue-5.10/bpf-annotate-btf-show-functions-with-__printf.patch b/queue-5.10/bpf-annotate-btf-show-functions-with-__printf.patch new file mode 100644 index 00000000000..04caaf6c5ea --- /dev/null +++ b/queue-5.10/bpf-annotate-btf-show-functions-with-__printf.patch @@ -0,0 +1,56 @@ +From cf6b2c9e76708260150b4b3ef81f30661bbe58f6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Jul 2024 19:23:21 +0100 +Subject: bpf: annotate BTF show functions with __printf + +From: Alan Maguire + +[ Upstream commit b3470da314fd8018ee237e382000c4154a942420 ] + +-Werror=suggest-attribute=format warns about two functions +in kernel/bpf/btf.c [1]; add __printf() annotations to silence +these warnings since for CONFIG_WERROR=y they will trigger +build failures. + +[1] https://lore.kernel.org/bpf/a8b20c72-6631-4404-9e1f-0410642d7d20@gmail.com/ + +Fixes: 31d0bc81637d ("bpf: Move to generic BTF show support, apply it to seq files/strings") +Reported-by: Mirsad Todorovac +Signed-off-by: Alan Maguire +Tested-by: Mirsad Todorovac +Link: https://lore.kernel.org/r/20240711182321.963667-1-alan.maguire@oracle.com +Signed-off-by: Alexei Starovoitov +Signed-off-by: Sasha Levin +--- + kernel/bpf/btf.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c +index 06c028bdb8d4d..326feb2301700 100644 +--- a/kernel/bpf/btf.c ++++ b/kernel/bpf/btf.c +@@ -5344,8 +5344,8 @@ static void btf_type_show(const struct btf *btf, u32 type_id, void *obj, + btf_type_ops(t)->show(btf, t, type_id, obj, 0, show); + } + +-static void btf_seq_show(struct btf_show *show, const char *fmt, +- va_list args) ++__printf(2, 0) static void btf_seq_show(struct btf_show *show, const char *fmt, ++ va_list args) + { + seq_vprintf((struct seq_file *)show->target, fmt, args); + } +@@ -5378,8 +5378,8 @@ struct btf_show_snprintf { + int len; /* length we would have written */ + }; + +-static void btf_snprintf_show(struct btf_show *show, const char *fmt, +- va_list args) ++__printf(2, 0) static void btf_snprintf_show(struct btf_show *show, const char *fmt, ++ va_list args) + { + struct btf_show_snprintf *ssnprintf = (struct btf_show_snprintf *)show; + int len; +-- +2.43.0 + diff --git a/queue-5.10/bpf-eliminate-remaining-make-w-1-warnings-in-kernel-.patch b/queue-5.10/bpf-eliminate-remaining-make-w-1-warnings-in-kernel-.patch new file mode 100644 index 00000000000..3a4ee4daaf7 --- /dev/null +++ b/queue-5.10/bpf-eliminate-remaining-make-w-1-warnings-in-kernel-.patch @@ -0,0 +1,60 @@ +From 4e5c94e4315883f327d91b409d0b7df47194abef Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Jul 2024 10:28:59 +0100 +Subject: bpf: Eliminate remaining "make W=1" warnings in kernel/bpf/btf.o +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Alan Maguire + +[ Upstream commit 2454075f8e2915cebbe52a1195631bc7efe2b7e1 ] + +As reported by Mirsad [1] we still see format warnings in kernel/bpf/btf.o +at W=1 warning level: + + CC kernel/bpf/btf.o +./kernel/bpf/btf.c: In function ‘btf_type_seq_show_flags’: +./kernel/bpf/btf.c:7553:21: warning: assignment left-hand side might be a candidate for a format attribute [-Wsuggest-attribute=format] + 7553 | sseq.showfn = btf_seq_show; + | ^ +./kernel/bpf/btf.c: In function ‘btf_type_snprintf_show’: +./kernel/bpf/btf.c:7604:31: warning: assignment left-hand side might be a candidate for a format attribute [-Wsuggest-attribute=format] + 7604 | ssnprintf.show.showfn = btf_snprintf_show; + | ^ + +Combined with CONFIG_WERROR=y these can halt the build. + +The fix (annotating the structure field with __printf()) +suggested by Mirsad resolves these. Apologies I missed this last time. +No other W=1 warnings were observed in kernel/bpf after this fix. + +[1] https://lore.kernel.org/bpf/92c9d047-f058-400c-9c7d-81d4dc1ef71b@gmail.com/ + +Fixes: b3470da314fd ("bpf: annotate BTF show functions with __printf") +Reported-by: Mirsad Todorovac +Suggested-by: Mirsad Todorovac +Signed-off-by: Alan Maguire +Signed-off-by: Daniel Borkmann +Link: https://lore.kernel.org/bpf/20240712092859.1390960-1-alan.maguire@oracle.com +Signed-off-by: Sasha Levin +--- + kernel/bpf/btf.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c +index 326feb2301700..cfbb038d150c4 100644 +--- a/kernel/bpf/btf.c ++++ b/kernel/bpf/btf.c +@@ -340,7 +340,7 @@ static const char *btf_type_str(const struct btf_type *t) + struct btf_show { + u64 flags; + void *target; /* target of show operation (seq file, buffer) */ +- void (*showfn)(struct btf_show *show, const char *fmt, va_list args); ++ __printf(2, 0) void (*showfn)(struct btf_show *show, const char *fmt, va_list args); + const struct btf *btf; + /* below are used during iteration */ + struct { +-- +2.43.0 + diff --git a/queue-5.10/bpftool-mount-bpffs-when-pinmaps-path-not-under-the-.patch b/queue-5.10/bpftool-mount-bpffs-when-pinmaps-path-not-under-the-.patch new file mode 100644 index 00000000000..3aadb247df7 --- /dev/null +++ b/queue-5.10/bpftool-mount-bpffs-when-pinmaps-path-not-under-the-.patch @@ -0,0 +1,46 @@ +From 073974deac183db58a9aff5010937dcf268e303b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Jul 2024 21:11:50 +0800 +Subject: bpftool: Mount bpffs when pinmaps path not under the bpffs + +From: Tao Chen + +[ Upstream commit da5f8fd1f0d393d5eaaba9ad8c22d1c26bb2bf9b ] + +As Quentin said [0], BPF map pinning will fail if the pinmaps path is not +under the bpffs, like: + + libbpf: specified path /home/ubuntu/test/sock_ops_map is not on BPF FS + Error: failed to pin all maps + + [0] https://github.com/libbpf/bpftool/issues/146 + +Fixes: 3767a94b3253 ("bpftool: add pinmaps argument to the load/loadall") +Signed-off-by: Tao Chen +Signed-off-by: Daniel Borkmann +Tested-by: Quentin Monnet +Reviewed-by: Quentin Monnet +Link: https://lore.kernel.org/bpf/20240702131150.15622-1-chen.dylane@gmail.com +Signed-off-by: Sasha Levin +--- + tools/bpf/bpftool/prog.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c +index d07996e7952f3..469e8db5684aa 100644 +--- a/tools/bpf/bpftool/prog.c ++++ b/tools/bpf/bpftool/prog.c +@@ -1611,6 +1611,10 @@ static int load_with_options(int argc, char **argv, bool first_prog_only) + } + + if (pinmaps) { ++ err = create_and_mount_bpffs_dir(pinmaps); ++ if (err) ++ goto err_unpin; ++ + err = bpf_object__pin_maps(obj, pinmaps); + if (err) { + p_err("failed to pin all maps"); +-- +2.43.0 + diff --git a/queue-5.10/coresight-fix-ref-leak-when-of_coresight_parse_endpo.patch b/queue-5.10/coresight-fix-ref-leak-when-of_coresight_parse_endpo.patch new file mode 100644 index 00000000000..42310243174 --- /dev/null +++ b/queue-5.10/coresight-fix-ref-leak-when-of_coresight_parse_endpo.patch @@ -0,0 +1,45 @@ +From 7bc22d5cf0f4f6d7767ec1a80fdda5804aa2fd2c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 29 May 2024 14:36:26 +0100 +Subject: coresight: Fix ref leak when of_coresight_parse_endpoint() fails + +From: James Clark + +[ Upstream commit 7fcb9cb2fe47294e16067c3cfd25332c8662a115 ] + +of_graph_get_next_endpoint() releases the reference to the previous +endpoint on each iteration, but when parsing fails the loop exits +early meaning the last reference is never dropped. + +Fix it by dropping the refcount in the exit condition. + +Fixes: d375b356e687 ("coresight: Fix support for sparsely populated ports") +Signed-off-by: James Clark +Reported-by: Laurent Pinchart +Reviewed-by: Laurent Pinchart +Signed-off-by: Suzuki K Poulose +Link: https://lore.kernel.org/r/20240529133626.90080-1-james.clark@arm.com +Signed-off-by: Sasha Levin +--- + drivers/hwtracing/coresight/coresight-platform.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/hwtracing/coresight/coresight-platform.c b/drivers/hwtracing/coresight/coresight-platform.c +index c594f45319fc5..dfb8022c4da1a 100644 +--- a/drivers/hwtracing/coresight/coresight-platform.c ++++ b/drivers/hwtracing/coresight/coresight-platform.c +@@ -323,8 +323,10 @@ static int of_get_coresight_platform_data(struct device *dev, + continue; + + ret = of_coresight_parse_endpoint(dev, ep, pdata); +- if (ret) ++ if (ret) { ++ of_node_put(ep); + return ret; ++ } + } + + return 0; +-- +2.43.0 + diff --git a/queue-5.10/drm-etnaviv-fix-dma-direction-handling-for-cached-rw.patch b/queue-5.10/drm-etnaviv-fix-dma-direction-handling-for-cached-rw.patch new file mode 100644 index 00000000000..8d445353a2d --- /dev/null +++ b/queue-5.10/drm-etnaviv-fix-dma-direction-handling-for-cached-rw.patch @@ -0,0 +1,42 @@ +From d33ab0ebd493f683bb4e8ed507cbda4c16752765 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 21 Jun 2024 19:11:06 +0200 +Subject: drm/etnaviv: fix DMA direction handling for cached RW buffers + +From: Lucas Stach + +[ Upstream commit 58979ad6330a70450ed78837be3095107d022ea9 ] + +The dma sync operation needs to be done with DMA_BIDIRECTIONAL when +the BO is prepared for both read and write operations. + +Fixes: a8c21a5451d8 ("drm/etnaviv: add initial etnaviv DRM driver") +Signed-off-by: Lucas Stach +Reviewed-by: Philipp Zabel +Reviewed-by: Christian Gmeiner +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/etnaviv/etnaviv_gem.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c +index 424474041c943..aa372982335e9 100644 +--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c ++++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c +@@ -364,9 +364,11 @@ static void *etnaviv_gem_vmap_impl(struct etnaviv_gem_object *obj) + + static inline enum dma_data_direction etnaviv_op_to_dma_dir(u32 op) + { +- if (op & ETNA_PREP_READ) ++ op &= ETNA_PREP_READ | ETNA_PREP_WRITE; ++ ++ if (op == ETNA_PREP_READ) + return DMA_FROM_DEVICE; +- else if (op & ETNA_PREP_WRITE) ++ else if (op == ETNA_PREP_WRITE) + return DMA_TO_DEVICE; + else + return DMA_BIDIRECTIONAL; +-- +2.43.0 + diff --git a/queue-5.10/drm-panel-boe-tv101wum-nl6-check-for-errors-on-the-n.patch b/queue-5.10/drm-panel-boe-tv101wum-nl6-check-for-errors-on-the-n.patch new file mode 100644 index 00000000000..f29c941b76b --- /dev/null +++ b/queue-5.10/drm-panel-boe-tv101wum-nl6-check-for-errors-on-the-n.patch @@ -0,0 +1,49 @@ +From a866fd86a7f04ab64f4a6d1d21309f04bf97adc0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 May 2024 14:36:38 -0700 +Subject: drm/panel: boe-tv101wum-nl6: Check for errors on the NOP in prepare() + +From: Douglas Anderson + +[ Upstream commit 6320b9199dd99622668649c234d4e8a99e44a9c8 ] + +The mipi_dsi_dcs_nop() function returns an error but we weren't +checking it in boe_panel_prepare(). Add a check. This is highly +unlikely to matter in practice. If the NOP failed then likely later +MIPI commands would fail too. + +Found by code inspection. + +Fixes: 812562b8d881 ("drm/panel: boe-tv101wum-nl6: Fine tune the panel power sequence") +Signed-off-by: Douglas Anderson +Reviewed-by: AngeloGioacchino Del Regno +Reviewed-by: Dmitry Baryshkov +Reviewed-by: Linus Walleij +Link: https://lore.kernel.org/r/20240517143643.3.Ibffbaa5b4999ac0e55f43bf353144433b099d727@changeid +Signed-off-by: Neil Armstrong +Link: https://patchwork.freedesktop.org/patch/msgid/20240517143643.3.Ibffbaa5b4999ac0e55f43bf353144433b099d727@changeid +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c +index c448be3d01d16..0a2d5f461aee8 100644 +--- a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c ++++ b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c +@@ -553,7 +553,11 @@ static int boe_panel_prepare(struct drm_panel *panel) + usleep_range(5000, 10000); + + if (boe->desc->lp11_before_reset) { +- mipi_dsi_dcs_nop(boe->dsi); ++ ret = mipi_dsi_dcs_nop(boe->dsi); ++ if (ret < 0) { ++ dev_err(&boe->dsi->dev, "Failed to send NOP: %d\n", ret); ++ goto poweroff; ++ } + usleep_range(1000, 2000); + } + gpiod_set_value(boe->enable_gpio, 1); +-- +2.43.0 + diff --git a/queue-5.10/drm-panel-boe-tv101wum-nl6-if-prepare-fails-disable-.patch b/queue-5.10/drm-panel-boe-tv101wum-nl6-if-prepare-fails-disable-.patch new file mode 100644 index 00000000000..e4fc1d990c4 --- /dev/null +++ b/queue-5.10/drm-panel-boe-tv101wum-nl6-if-prepare-fails-disable-.patch @@ -0,0 +1,48 @@ +From e046b15f59b0052ee88766f811df4a36bb5127e3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 May 2024 14:36:37 -0700 +Subject: drm/panel: boe-tv101wum-nl6: If prepare fails, disable GPIO before + regulators + +From: Douglas Anderson + +[ Upstream commit 587c48f622374e5d47b1d515c6006a4df4dee882 ] + +The enable GPIO should clearly be set low before turning off +regulators. That matches both the inverse order that things were +enabled and also the order in unprepare(). + +Fixes: a869b9db7adf ("drm/panel: support for boe tv101wum-nl6 wuxga dsi video mode panel") +Signed-off-by: Douglas Anderson +Reviewed-by: Dmitry Baryshkov +Reviewed-by: Linus Walleij +Link: https://lore.kernel.org/r/20240517143643.2.Ieac346cd0f1606948ba39ceea06b55359fe972b6@changeid +Signed-off-by: Neil Armstrong +Link: https://patchwork.freedesktop.org/patch/msgid/20240517143643.2.Ieac346cd0f1606948ba39ceea06b55359fe972b6@changeid +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c +index 9e518213a54ff..c448be3d01d16 100644 +--- a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c ++++ b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c +@@ -574,13 +574,13 @@ static int boe_panel_prepare(struct drm_panel *panel) + return 0; + + poweroff: ++ gpiod_set_value(boe->enable_gpio, 0); + regulator_disable(boe->avee); + poweroffavdd: + regulator_disable(boe->avdd); + poweroff1v8: + usleep_range(5000, 7000); + regulator_disable(boe->pp1800); +- gpiod_set_value(boe->enable_gpio, 0); + + return ret; + } +-- +2.43.0 + diff --git a/queue-5.10/drm-qxl-add-check-for-drm_cvt_mode.patch b/queue-5.10/drm-qxl-add-check-for-drm_cvt_mode.patch new file mode 100644 index 00000000000..a8b16832d39 --- /dev/null +++ b/queue-5.10/drm-qxl-add-check-for-drm_cvt_mode.patch @@ -0,0 +1,39 @@ +From a61ceaedc662644b27734bd3c59c7921be945990 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 21 Jun 2024 15:10:31 +0800 +Subject: drm/qxl: Add check for drm_cvt_mode + +From: Chen Ni + +[ Upstream commit 7bd09a2db0f617377027a2bb0b9179e6959edff3 ] + +Add check for the return value of drm_cvt_mode() and return the error if +it fails in order to avoid NULL pointer dereference. + +Fixes: 1b043677d4be ("drm/qxl: add qxl_add_mode helper function") +Signed-off-by: Chen Ni +Reviewed-by: Heng Qi +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20240621071031.1987974-1-nichen@iscas.ac.cn +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/qxl/qxl_display.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c +index f22a1b776f4ba..3ffa721d777bf 100644 +--- a/drivers/gpu/drm/qxl/qxl_display.c ++++ b/drivers/gpu/drm/qxl/qxl_display.c +@@ -232,6 +232,9 @@ static int qxl_add_mode(struct drm_connector *connector, + return 0; + + mode = drm_cvt_mode(dev, width, height, 60, false, false, false); ++ if (!mode) ++ return 0; ++ + if (preferred) + mode->type |= DRM_MODE_TYPE_PREFERRED; + mode->hdisplay = width; +-- +2.43.0 + diff --git a/queue-5.10/edac-i10nm-make-skx_common.o-a-separate-module.patch b/queue-5.10/edac-i10nm-make-skx_common.o-a-separate-module.patch new file mode 100644 index 00000000000..0e5218e7111 --- /dev/null +++ b/queue-5.10/edac-i10nm-make-skx_common.o-a-separate-module.patch @@ -0,0 +1,190 @@ +From 06bee78cc96fa40928ca4306240a8c805c0c70c9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 29 May 2024 11:51:11 +0200 +Subject: EDAC, i10nm: make skx_common.o a separate module + +From: Arnd Bergmann + +[ Upstream commit 123b158635505c89ed0d3ef45c5845ff9030a466 ] + +Commit 598afa050403 ("kbuild: warn objects shared among multiple modules") +was added to track down cases where the same object is linked into +multiple modules. This can cause serious problems if some modules are +builtin while others are not. + +That test triggers this warning: + +scripts/Makefile.build:236: drivers/edac/Makefile: skx_common.o is added to multiple modules: i10nm_edac skx_edac + +Make this a separate module instead. + +[Tony: Added more background details to commit message] + +Fixes: d4dc89d069aa ("EDAC, i10nm: Add a driver for Intel 10nm server processors") +Signed-off-by: Arnd Bergmann +Signed-off-by: Tony Luck +Link: https://lore.kernel.org/all/20240529095132.1929397-1-arnd@kernel.org/ +Signed-off-by: Sasha Levin +--- + drivers/edac/Makefile | 10 ++++++---- + drivers/edac/skx_common.c | 21 +++++++++++++++++++-- + drivers/edac/skx_common.h | 4 ++-- + 3 files changed, 27 insertions(+), 8 deletions(-) + +diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile +index 3a849168780dd..eec69c885c1de 100644 +--- a/drivers/edac/Makefile ++++ b/drivers/edac/Makefile +@@ -58,11 +58,13 @@ obj-$(CONFIG_EDAC_MPC85XX) += mpc85xx_edac_mod.o + layerscape_edac_mod-y := fsl_ddr_edac.o layerscape_edac.o + obj-$(CONFIG_EDAC_LAYERSCAPE) += layerscape_edac_mod.o + +-skx_edac-y := skx_common.o skx_base.o +-obj-$(CONFIG_EDAC_SKX) += skx_edac.o ++skx_edac_common-y := skx_common.o + +-i10nm_edac-y := skx_common.o i10nm_base.o +-obj-$(CONFIG_EDAC_I10NM) += i10nm_edac.o ++skx_edac-y := skx_base.o ++obj-$(CONFIG_EDAC_SKX) += skx_edac.o skx_edac_common.o ++ ++i10nm_edac-y := i10nm_base.o ++obj-$(CONFIG_EDAC_I10NM) += i10nm_edac.o skx_edac_common.o + + obj-$(CONFIG_EDAC_MV64X60) += mv64x60_edac.o + obj-$(CONFIG_EDAC_CELL) += cell_edac.o +diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c +index 300bfd8383e17..b585cbe3eff94 100644 +--- a/drivers/edac/skx_common.c ++++ b/drivers/edac/skx_common.c +@@ -46,7 +46,7 @@ static u64 skx_tolm, skx_tohm; + static LIST_HEAD(dev_edac_list); + static bool skx_mem_cfg_2lm; + +-int __init skx_adxl_get(void) ++int skx_adxl_get(void) + { + const char * const *names; + int i, j; +@@ -108,12 +108,14 @@ int __init skx_adxl_get(void) + + return -ENODEV; + } ++EXPORT_SYMBOL_GPL(skx_adxl_get); + +-void __exit skx_adxl_put(void) ++void skx_adxl_put(void) + { + kfree(adxl_values); + kfree(adxl_msg); + } ++EXPORT_SYMBOL_GPL(skx_adxl_put); + + static bool skx_adxl_decode(struct decoded_addr *res, bool error_in_1st_level_mem) + { +@@ -180,12 +182,14 @@ void skx_set_mem_cfg(bool mem_cfg_2lm) + { + skx_mem_cfg_2lm = mem_cfg_2lm; + } ++EXPORT_SYMBOL_GPL(skx_set_mem_cfg); + + void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_log) + { + skx_decode = decode; + skx_show_retry_rd_err_log = show_retry_log; + } ++EXPORT_SYMBOL_GPL(skx_set_decode); + + int skx_get_src_id(struct skx_dev *d, int off, u8 *id) + { +@@ -199,6 +203,7 @@ int skx_get_src_id(struct skx_dev *d, int off, u8 *id) + *id = GET_BITFIELD(reg, 12, 14); + return 0; + } ++EXPORT_SYMBOL_GPL(skx_get_src_id); + + int skx_get_node_id(struct skx_dev *d, u8 *id) + { +@@ -212,6 +217,7 @@ int skx_get_node_id(struct skx_dev *d, u8 *id) + *id = GET_BITFIELD(reg, 0, 2); + return 0; + } ++EXPORT_SYMBOL_GPL(skx_get_node_id); + + static int get_width(u32 mtr) + { +@@ -277,6 +283,7 @@ int skx_get_all_bus_mappings(struct res_config *cfg, struct list_head **list) + *list = &dev_edac_list; + return ndev; + } ++EXPORT_SYMBOL_GPL(skx_get_all_bus_mappings); + + int skx_get_hi_lo(unsigned int did, int off[], u64 *tolm, u64 *tohm) + { +@@ -316,6 +323,7 @@ int skx_get_hi_lo(unsigned int did, int off[], u64 *tolm, u64 *tohm) + pci_dev_put(pdev); + return -ENODEV; + } ++EXPORT_SYMBOL_GPL(skx_get_hi_lo); + + static int skx_get_dimm_attr(u32 reg, int lobit, int hibit, int add, + int minval, int maxval, const char *name) +@@ -369,6 +377,7 @@ int skx_get_dimm_info(u32 mtr, u32 mcmtr, u32 amap, struct dimm_info *dimm, + + return 1; + } ++EXPORT_SYMBOL_GPL(skx_get_dimm_info); + + int skx_get_nvdimm_info(struct dimm_info *dimm, struct skx_imc *imc, + int chan, int dimmno, const char *mod_str) +@@ -417,6 +426,7 @@ int skx_get_nvdimm_info(struct dimm_info *dimm, struct skx_imc *imc, + + return (size == 0 || size == ~0ull) ? 0 : 1; + } ++EXPORT_SYMBOL_GPL(skx_get_nvdimm_info); + + int skx_register_mci(struct skx_imc *imc, struct pci_dev *pdev, + const char *ctl_name, const char *mod_str, +@@ -484,6 +494,7 @@ int skx_register_mci(struct skx_imc *imc, struct pci_dev *pdev, + imc->mci = NULL; + return rc; + } ++EXPORT_SYMBOL_GPL(skx_register_mci); + + static void skx_unregister_mci(struct skx_imc *imc) + { +@@ -663,6 +674,7 @@ int skx_mce_check_error(struct notifier_block *nb, unsigned long val, + mce->kflags |= MCE_HANDLED_EDAC; + return NOTIFY_DONE; + } ++EXPORT_SYMBOL_GPL(skx_mce_check_error); + + void skx_remove(void) + { +@@ -698,3 +710,8 @@ void skx_remove(void) + kfree(d); + } + } ++EXPORT_SYMBOL_GPL(skx_remove); ++ ++MODULE_LICENSE("GPL v2"); ++MODULE_AUTHOR("Tony Luck"); ++MODULE_DESCRIPTION("MC Driver for Intel server processors"); +diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h +index 9773bd8e05322..b93c33ac8e607 100644 +--- a/drivers/edac/skx_common.h ++++ b/drivers/edac/skx_common.h +@@ -134,8 +134,8 @@ typedef int (*get_dimm_config_f)(struct mem_ctl_info *mci); + typedef bool (*skx_decode_f)(struct decoded_addr *res); + typedef void (*skx_show_retry_log_f)(struct decoded_addr *res, char *msg, int len); + +-int __init skx_adxl_get(void); +-void __exit skx_adxl_put(void); ++int skx_adxl_get(void); ++void skx_adxl_put(void); + void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_log); + void skx_set_mem_cfg(bool mem_cfg_2lm); + +-- +2.43.0 + diff --git a/queue-5.10/edac-skx_common-add-new-adxl-components-for-2-level-.patch b/queue-5.10/edac-skx_common-add-new-adxl-components-for-2-level-.patch new file mode 100644 index 00000000000..c002c16e5aa --- /dev/null +++ b/queue-5.10/edac-skx_common-add-new-adxl-components-for-2-level-.patch @@ -0,0 +1,216 @@ +From 97030743c07a6e8feebca218b85e8718e9949333 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 11 Jun 2021 10:01:18 -0700 +Subject: EDAC/skx_common: Add new ADXL components for 2-level memory + +From: Qiuxu Zhuo + +[ Upstream commit 2f4348e5a86198704368a699a7c4cdeb21d569f5 ] + +Some Intel servers may configure memory in 2 levels, using +fast "near" memory (e.g. DDR) as a cache for larger, slower, +"far" memory (e.g. 3D X-point). + +In these configurations the BIOS ADXL address translation for +an address in a 2-level memory range will provide details of +both the "near" and far components. + +Current exported ADXL components are only for 1-level memory +system or for 2nd level memory of 2-level memory system. So +add new ADXL components for 1st level memory of 2-level memory +system to fully support 2-level memory system and the detection +of memory error source(1st level memory or 2nd level memory). + +Signed-off-by: Qiuxu Zhuo +Signed-off-by: Tony Luck +Link: https://lore.kernel.org/r/20210611170123.1057025-2-tony.luck@intel.com +Stable-dep-of: 123b15863550 ("EDAC, i10nm: make skx_common.o a separate module") +Signed-off-by: Sasha Levin +--- + drivers/edac/skx_common.c | 67 ++++++++++++++++++++++++++++++++------- + drivers/edac/skx_common.h | 11 +++++++ + 2 files changed, 67 insertions(+), 11 deletions(-) + +diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c +index 2b4ce8e5ac2fa..300bfd8383e17 100644 +--- a/drivers/edac/skx_common.c ++++ b/drivers/edac/skx_common.c +@@ -23,10 +23,13 @@ + #include "skx_common.h" + + static const char * const component_names[] = { +- [INDEX_SOCKET] = "ProcessorSocketId", +- [INDEX_MEMCTRL] = "MemoryControllerId", +- [INDEX_CHANNEL] = "ChannelId", +- [INDEX_DIMM] = "DimmSlotId", ++ [INDEX_SOCKET] = "ProcessorSocketId", ++ [INDEX_MEMCTRL] = "MemoryControllerId", ++ [INDEX_CHANNEL] = "ChannelId", ++ [INDEX_DIMM] = "DimmSlotId", ++ [INDEX_NM_MEMCTRL] = "NmMemoryControllerId", ++ [INDEX_NM_CHANNEL] = "NmChannelId", ++ [INDEX_NM_DIMM] = "NmDimmSlotId", + }; + + static int component_indices[ARRAY_SIZE(component_names)]; +@@ -34,12 +37,14 @@ static int adxl_component_count; + static const char * const *adxl_component_names; + static u64 *adxl_values; + static char *adxl_msg; ++static unsigned long adxl_nm_bitmap; + + static char skx_msg[MSG_SIZE]; + static skx_decode_f skx_decode; + static skx_show_retry_log_f skx_show_retry_rd_err_log; + static u64 skx_tolm, skx_tohm; + static LIST_HEAD(dev_edac_list); ++static bool skx_mem_cfg_2lm; + + int __init skx_adxl_get(void) + { +@@ -56,14 +61,25 @@ int __init skx_adxl_get(void) + for (j = 0; names[j]; j++) { + if (!strcmp(component_names[i], names[j])) { + component_indices[i] = j; ++ ++ if (i >= INDEX_NM_FIRST) ++ adxl_nm_bitmap |= 1 << i; ++ + break; + } + } + +- if (!names[j]) ++ if (!names[j] && i < INDEX_NM_FIRST) + goto err; + } + ++ if (skx_mem_cfg_2lm) { ++ if (!adxl_nm_bitmap) ++ skx_printk(KERN_NOTICE, "Not enough ADXL components for 2-level memory.\n"); ++ else ++ edac_dbg(2, "adxl_nm_bitmap: 0x%lx\n", adxl_nm_bitmap); ++ } ++ + adxl_component_names = names; + while (*names++) + adxl_component_count++; +@@ -99,7 +115,7 @@ void __exit skx_adxl_put(void) + kfree(adxl_msg); + } + +-static bool skx_adxl_decode(struct decoded_addr *res) ++static bool skx_adxl_decode(struct decoded_addr *res, bool error_in_1st_level_mem) + { + struct skx_dev *d; + int i, len = 0; +@@ -116,11 +132,20 @@ static bool skx_adxl_decode(struct decoded_addr *res) + } + + res->socket = (int)adxl_values[component_indices[INDEX_SOCKET]]; +- res->imc = (int)adxl_values[component_indices[INDEX_MEMCTRL]]; +- res->channel = (int)adxl_values[component_indices[INDEX_CHANNEL]]; +- res->dimm = (int)adxl_values[component_indices[INDEX_DIMM]]; ++ if (error_in_1st_level_mem) { ++ res->imc = (adxl_nm_bitmap & BIT_NM_MEMCTRL) ? ++ (int)adxl_values[component_indices[INDEX_NM_MEMCTRL]] : -1; ++ res->channel = (adxl_nm_bitmap & BIT_NM_CHANNEL) ? ++ (int)adxl_values[component_indices[INDEX_NM_CHANNEL]] : -1; ++ res->dimm = (adxl_nm_bitmap & BIT_NM_DIMM) ? ++ (int)adxl_values[component_indices[INDEX_NM_DIMM]] : -1; ++ } else { ++ res->imc = (int)adxl_values[component_indices[INDEX_MEMCTRL]]; ++ res->channel = (int)adxl_values[component_indices[INDEX_CHANNEL]]; ++ res->dimm = (int)adxl_values[component_indices[INDEX_DIMM]]; ++ } + +- if (res->imc > NUM_IMC - 1) { ++ if (res->imc > NUM_IMC - 1 || res->imc < 0) { + skx_printk(KERN_ERR, "Bad imc %d\n", res->imc); + return false; + } +@@ -151,6 +176,11 @@ static bool skx_adxl_decode(struct decoded_addr *res) + return true; + } + ++void skx_set_mem_cfg(bool mem_cfg_2lm) ++{ ++ skx_mem_cfg_2lm = mem_cfg_2lm; ++} ++ + void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_log) + { + skx_decode = decode; +@@ -565,6 +595,21 @@ static void skx_mce_output_error(struct mem_ctl_info *mci, + optype, skx_msg); + } + ++static bool skx_error_in_1st_level_mem(const struct mce *m) ++{ ++ u32 errcode; ++ ++ if (!skx_mem_cfg_2lm) ++ return false; ++ ++ errcode = GET_BITFIELD(m->status, 0, 15); ++ ++ if ((errcode & 0xef80) != 0x280) ++ return false; ++ ++ return true; ++} ++ + int skx_mce_check_error(struct notifier_block *nb, unsigned long val, + void *data) + { +@@ -584,7 +629,7 @@ int skx_mce_check_error(struct notifier_block *nb, unsigned long val, + res.addr = mce->addr; + + if (adxl_component_count) { +- if (!skx_adxl_decode(&res)) ++ if (!skx_adxl_decode(&res, skx_error_in_1st_level_mem(mce))) + return NOTIFY_DONE; + } else if (!skx_decode || !skx_decode(&res)) { + return NOTIFY_DONE; +diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h +index 78f8c1de0b71c..9773bd8e05322 100644 +--- a/drivers/edac/skx_common.h ++++ b/drivers/edac/skx_common.h +@@ -9,6 +9,8 @@ + #ifndef _SKX_COMM_EDAC_H + #define _SKX_COMM_EDAC_H + ++#include ++ + #define MSG_SIZE 1024 + + /* +@@ -90,9 +92,17 @@ enum { + INDEX_MEMCTRL, + INDEX_CHANNEL, + INDEX_DIMM, ++ INDEX_NM_FIRST, ++ INDEX_NM_MEMCTRL = INDEX_NM_FIRST, ++ INDEX_NM_CHANNEL, ++ INDEX_NM_DIMM, + INDEX_MAX + }; + ++#define BIT_NM_MEMCTRL BIT_ULL(INDEX_NM_MEMCTRL) ++#define BIT_NM_CHANNEL BIT_ULL(INDEX_NM_CHANNEL) ++#define BIT_NM_DIMM BIT_ULL(INDEX_NM_DIMM) ++ + struct decoded_addr { + struct skx_dev *dev; + u64 addr; +@@ -127,6 +137,7 @@ typedef void (*skx_show_retry_log_f)(struct decoded_addr *res, char *msg, int le + int __init skx_adxl_get(void); + void __exit skx_adxl_put(void); + void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_log); ++void skx_set_mem_cfg(bool mem_cfg_2lm); + + int skx_get_src_id(struct skx_dev *d, int off, u8 *id); + int skx_get_node_id(struct skx_dev *d, u8 *id); +-- +2.43.0 + diff --git a/queue-5.10/ext4-avoid-writing-unitialized-memory-to-disk-in-ea-.patch b/queue-5.10/ext4-avoid-writing-unitialized-memory-to-disk-in-ea-.patch new file mode 100644 index 00000000000..f910ad4a52b --- /dev/null +++ b/queue-5.10/ext4-avoid-writing-unitialized-memory-to-disk-in-ea-.patch @@ -0,0 +1,46 @@ +From 0ec6e242848d02537d7f7a6f4a0601dc3afd8cc8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 13 Jun 2024 17:02:34 +0200 +Subject: ext4: avoid writing unitialized memory to disk in EA inodes + +From: Jan Kara + +[ Upstream commit 65121eff3e4c8c90f8126debf3c369228691c591 ] + +If the extended attribute size is not a multiple of block size, the last +block in the EA inode will have uninitialized tail which will get +written to disk. We will never expose the data to userspace but still +this is not a good practice so just zero out the tail of the block as it +isn't going to cause a noticeable performance overhead. + +Fixes: e50e5129f384 ("ext4: xattr-in-inode support") +Reported-by: syzbot+9c1fe13fcb51574b249b@syzkaller.appspotmail.com +Reported-by: Hugh Dickins +Signed-off-by: Jan Kara +Link: https://patch.msgid.link/20240613150234.25176-1-jack@suse.cz +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/ext4/xattr.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c +index 2dcb7d2bb85e8..b91a1d1099d59 100644 +--- a/fs/ext4/xattr.c ++++ b/fs/ext4/xattr.c +@@ -1377,6 +1377,12 @@ static int ext4_xattr_inode_write(handle_t *handle, struct inode *ea_inode, + goto out; + + memcpy(bh->b_data, buf, csize); ++ /* ++ * Zero out block tail to avoid writing uninitialized memory ++ * to disk. ++ */ ++ if (csize < blocksize) ++ memset(bh->b_data + csize, 0, blocksize - csize); + set_buffer_uptodate(bh); + ext4_handle_dirty_metadata(handle, ea_inode, bh); + +-- +2.43.0 + diff --git a/queue-5.10/ext4-fix-infinite-loop-when-replaying-fast_commit.patch b/queue-5.10/ext4-fix-infinite-loop-when-replaying-fast_commit.patch new file mode 100644 index 00000000000..0afa8583f12 --- /dev/null +++ b/queue-5.10/ext4-fix-infinite-loop-when-replaying-fast_commit.patch @@ -0,0 +1,48 @@ +From e0a5b188c5da8d878039312efc1ea6b8dbf754d7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 May 2024 09:28:57 +0100 +Subject: ext4: fix infinite loop when replaying fast_commit + +From: Luis Henriques (SUSE) + +[ Upstream commit 907c3fe532253a6ef4eb9c4d67efb71fab58c706 ] + +When doing fast_commit replay an infinite loop may occur due to an +uninitialized extent_status struct. ext4_ext_determine_insert_hole() does +not detect the replay and calls ext4_es_find_extent_range(), which will +return immediately without initializing the 'es' variable. + +Because 'es' contains garbage, an integer overflow may happen causing an +infinite loop in this function, easily reproducible using fstest generic/039. + +This commit fixes this issue by unconditionally initializing the structure +in function ext4_es_find_extent_range(). + +Thanks to Zhang Yi, for figuring out the real problem! + +Fixes: 8016e29f4362 ("ext4: fast commit recovery path") +Signed-off-by: Luis Henriques (SUSE) +Reviewed-by: Zhang Yi +Link: https://patch.msgid.link/20240515082857.32730-1-luis.henriques@linux.dev +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/ext4/extents_status.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c +index f37e62546745b..be3b3ccbf70b6 100644 +--- a/fs/ext4/extents_status.c ++++ b/fs/ext4/extents_status.c +@@ -312,6 +312,8 @@ void ext4_es_find_extent_range(struct inode *inode, + ext4_lblk_t lblk, ext4_lblk_t end, + struct extent_status *es) + { ++ es->es_lblk = es->es_len = es->es_pblk = 0; ++ + if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) + return; + +-- +2.43.0 + diff --git a/queue-5.10/firmware-turris-mox-rwtm-fix-checking-return-value-o.patch b/queue-5.10/firmware-turris-mox-rwtm-fix-checking-return-value-o.patch new file mode 100644 index 00000000000..635f8c0b929 --- /dev/null +++ b/queue-5.10/firmware-turris-mox-rwtm-fix-checking-return-value-o.patch @@ -0,0 +1,70 @@ +From 97ef8bfecf9bf3728afff664c205a2e95dd9632c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Jul 2024 13:59:11 +0200 +Subject: firmware: turris-mox-rwtm: Fix checking return value of + wait_for_completion_timeout() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Marek Behún + +[ Upstream commit 8467cfe821ac3526f7598682ad5f90689fa8cc49 ] + +The wait_for_completion_timeout() function returns 0 if timed out, and a +positive value if completed. Fix the usage of this function. + +Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver") +Fixes: 2eab59cf0d20 ("firmware: turris-mox-rwtm: fail probing when firmware does not support hwrng") +Signed-off-by: Marek Behún +Reviewed-by: Ilpo Järvinen +Reviewed-by: Andy Shevchenko +Signed-off-by: Arnd Bergmann +Signed-off-by: Sasha Levin +--- + drivers/firmware/turris-mox-rwtm.c | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c +index 0bef988580ada..32c94c306b23e 100644 +--- a/drivers/firmware/turris-mox-rwtm.c ++++ b/drivers/firmware/turris-mox-rwtm.c +@@ -199,9 +199,8 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) + if (ret < 0) + return ret; + +- ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); +- if (ret < 0) +- return ret; ++ if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) ++ return -ETIMEDOUT; + + ret = mox_get_status(MBOX_CMD_BOARD_INFO, reply->retval); + if (ret == -ENODATA) { +@@ -235,9 +234,8 @@ static int mox_get_board_info(struct mox_rwtm *rwtm) + if (ret < 0) + return ret; + +- ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); +- if (ret < 0) +- return ret; ++ if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) ++ return -ETIMEDOUT; + + ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval); + if (ret == -ENODATA) { +@@ -274,9 +272,8 @@ static int check_get_random_support(struct mox_rwtm *rwtm) + if (ret < 0) + return ret; + +- ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2); +- if (ret < 0) +- return ret; ++ if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2)) ++ return -ETIMEDOUT; + + return mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval); + } +-- +2.43.0 + diff --git a/queue-5.10/firmware-turris-mox-rwtm-initialize-completion-befor.patch b/queue-5.10/firmware-turris-mox-rwtm-initialize-completion-befor.patch new file mode 100644 index 00000000000..55bb428542c --- /dev/null +++ b/queue-5.10/firmware-turris-mox-rwtm-initialize-completion-befor.patch @@ -0,0 +1,47 @@ +From 10853c04aff47053b99724a4fb35a3e62a89f8f3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Jul 2024 13:59:12 +0200 +Subject: firmware: turris-mox-rwtm: Initialize completion before mailbox +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Marek Behún + +[ Upstream commit 49e24c80d3c81c43e2a56101449e1eea32fcf292 ] + +Initialize the completion before the mailbox channel is requested. + +Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver") +Signed-off-by: Marek Behún +Reviewed-by: Andy Shevchenko +Signed-off-by: Arnd Bergmann +Signed-off-by: Sasha Levin +--- + drivers/firmware/turris-mox-rwtm.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c +index 32c94c306b23e..dcb717254c79e 100644 +--- a/drivers/firmware/turris-mox-rwtm.c ++++ b/drivers/firmware/turris-mox-rwtm.c +@@ -496,6 +496,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) + platform_set_drvdata(pdev, rwtm); + + mutex_init(&rwtm->busy); ++ init_completion(&rwtm->cmd_done); + + rwtm->mbox_client.dev = dev; + rwtm->mbox_client.rx_callback = mox_rwtm_rx_callback; +@@ -509,8 +510,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev) + goto remove_files; + } + +- init_completion(&rwtm->cmd_done); +- + ret = mox_get_board_info(rwtm); + if (ret < 0) + dev_warn(dev, "Cannot read board information: %i\n", ret); +-- +2.43.0 + diff --git a/queue-5.10/fs-nilfs2-remove-some-unused-macros-to-tame-gcc.patch b/queue-5.10/fs-nilfs2-remove-some-unused-macros-to-tame-gcc.patch new file mode 100644 index 00000000000..d661adfe148 --- /dev/null +++ b/queue-5.10/fs-nilfs2-remove-some-unused-macros-to-tame-gcc.patch @@ -0,0 +1,48 @@ +From 2c2cf42e03322fc4a4ac3aa5242676087dd81640 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 15 Dec 2020 20:45:27 -0800 +Subject: fs/nilfs2: remove some unused macros to tame gcc + +From: Alex Shi + +[ Upstream commit e7920b3e9d9f5470d5ff7d883e72a47addc0a137 ] + +There some macros are unused and cause gcc warning. Remove them. + + fs/nilfs2/segment.c:137:0: warning: macro "nilfs_cnt32_gt" is not used [-Wunused-macros] + fs/nilfs2/segment.c:144:0: warning: macro "nilfs_cnt32_le" is not used [-Wunused-macros] + fs/nilfs2/segment.c:143:0: warning: macro "nilfs_cnt32_lt" is not used [-Wunused-macros] + +Link: https://lkml.kernel.org/r/1607552733-24292-1-git-send-email-konishi.ryusuke@gmail.com +Signed-off-by: Ryusuke Konishi +Signed-off-by: Alex Shi +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Stable-dep-of: 0f3819e8c483 ("nilfs2: avoid undefined behavior in nilfs_cnt32_ge macro") +Signed-off-by: Sasha Levin +--- + fs/nilfs2/segment.c | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c +index 02407c524382c..1f7ae5f36bde7 100644 +--- a/fs/nilfs2/segment.c ++++ b/fs/nilfs2/segment.c +@@ -134,14 +134,9 @@ static void nilfs_segctor_do_flush(struct nilfs_sc_info *, int); + static void nilfs_segctor_do_immediate_flush(struct nilfs_sc_info *); + static void nilfs_dispose_list(struct the_nilfs *, struct list_head *, int); + +-#define nilfs_cnt32_gt(a, b) \ +- (typecheck(__u32, a) && typecheck(__u32, b) && \ +- ((__s32)(b) - (__s32)(a) < 0)) + #define nilfs_cnt32_ge(a, b) \ + (typecheck(__u32, a) && typecheck(__u32, b) && \ + ((__s32)(a) - (__s32)(b) >= 0)) +-#define nilfs_cnt32_lt(a, b) nilfs_cnt32_gt(b, a) +-#define nilfs_cnt32_le(a, b) nilfs_cnt32_ge(b, a) + + static int nilfs_prepare_segment_lock(struct super_block *sb, + struct nilfs_transaction_info *ti) +-- +2.43.0 + diff --git a/queue-5.10/fs-proc-task_mmu-indicate-pm_file-for-pmd-mapped-fil.patch b/queue-5.10/fs-proc-task_mmu-indicate-pm_file-for-pmd-mapped-fil.patch new file mode 100644 index 00000000000..cff04ee89f9 --- /dev/null +++ b/queue-5.10/fs-proc-task_mmu-indicate-pm_file-for-pmd-mapped-fil.patch @@ -0,0 +1,65 @@ +From 899b9441771907c197929d6204c548274031ff0c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 7 Jun 2024 14:23:52 +0200 +Subject: fs/proc/task_mmu: indicate PM_FILE for PMD-mapped file THP + +From: David Hildenbrand + +[ Upstream commit 3f9f022e975d930709848a86a1c79775b0585202 ] + +Patch series "fs/proc: move page_mapcount() to fs/proc/internal.h". + +With all other page_mapcount() users in the tree gone, move +page_mapcount() to fs/proc/internal.h, rename it and extend the +documentation to prevent future (ab)use. + +... of course, I find some issues while working on that code that I sort +first ;) + +We'll now only end up calling page_mapcount() [now +folio_precise_page_mapcount()] on pages mapped via present page table +entries. Except for /proc/kpagecount, that still does questionable +things, but we'll leave that legacy interface as is for now. + +Did a quick sanity check. Likely we would want some better selfestest for +/proc/$/pagemap + smaps. I'll see if I can find some time to write some +more. + +This patch (of 6): + +Looks like we never taught pagemap_pmd_range() about the existence of +PMD-mapped file THPs. Seems to date back to the times when we first added +support for non-anon THPs in the form of shmem THP. + +Link: https://lkml.kernel.org/r/20240607122357.115423-1-david@redhat.com +Link: https://lkml.kernel.org/r/20240607122357.115423-2-david@redhat.com +Signed-off-by: David Hildenbrand +Fixes: 800d8c63b2e9 ("shmem: add huge pages support") +Acked-by: Kirill A. Shutemov +Reviewed-by: Lance Yang +Reviewed-by: Oscar Salvador +Cc: David Hildenbrand +Cc: Jonathan Corbet +Cc: Alexey Dobriyan +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + fs/proc/task_mmu.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c +index 39b1038076c3e..97023c0dca60a 100644 +--- a/fs/proc/task_mmu.c ++++ b/fs/proc/task_mmu.c +@@ -1468,6 +1468,8 @@ static int pagemap_pmd_range(pmd_t *pmdp, unsigned long addr, unsigned long end, + } + #endif + ++ if (page && !PageAnon(page)) ++ flags |= PM_FILE; + if (page && !migration && page_mapcount(page) == 1) + flags |= PM_MMAP_EXCLUSIVE; + +-- +2.43.0 + diff --git a/queue-5.10/gss_krb5-fix-the-error-handling-path-for-crypto_sync.patch b/queue-5.10/gss_krb5-fix-the-error-handling-path-for-crypto_sync.patch new file mode 100644 index 00000000000..2a8450bd845 --- /dev/null +++ b/queue-5.10/gss_krb5-fix-the-error-handling-path-for-crypto_sync.patch @@ -0,0 +1,38 @@ +From b1e4cf3fae23aba8081c24e859ecdb94a015765d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 6 Jul 2024 14:50:08 +0800 +Subject: gss_krb5: Fix the error handling path for crypto_sync_skcipher_setkey + +From: Gaosheng Cui + +[ Upstream commit a3123341dc358952ce2bf8067fbdfb7eaadf71bb ] + +If we fail to call crypto_sync_skcipher_setkey, we should free the +memory allocation for cipher, replace err_return with err_free_cipher +to free the memory of cipher. + +Fixes: 4891f2d008e4 ("gss_krb5: import functionality to derive keys into the kernel") +Signed-off-by: Gaosheng Cui +Reviewed-by: Simon Horman +Signed-off-by: Chuck Lever +Signed-off-by: Sasha Levin +--- + net/sunrpc/auth_gss/gss_krb5_keys.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/sunrpc/auth_gss/gss_krb5_keys.c b/net/sunrpc/auth_gss/gss_krb5_keys.c +index 726c076950c04..fc4639687c0fd 100644 +--- a/net/sunrpc/auth_gss/gss_krb5_keys.c ++++ b/net/sunrpc/auth_gss/gss_krb5_keys.c +@@ -161,7 +161,7 @@ u32 krb5_derive_key(const struct gss_krb5_enctype *gk5e, + if (IS_ERR(cipher)) + goto err_return; + if (crypto_sync_skcipher_setkey(cipher, inkey->data, inkey->len)) +- goto err_return; ++ goto err_free_cipher; + + /* allocate and set up buffers */ + +-- +2.43.0 + diff --git a/queue-5.10/hfsplus-fix-to-avoid-false-alarm-of-circular-locking.patch b/queue-5.10/hfsplus-fix-to-avoid-false-alarm-of-circular-locking.patch new file mode 100644 index 00000000000..31de7b19c84 --- /dev/null +++ b/queue-5.10/hfsplus-fix-to-avoid-false-alarm-of-circular-locking.patch @@ -0,0 +1,211 @@ +From 817bcf1bb643f86f35713c2a520714c7f13928ff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 7 Jun 2024 22:23:04 +0800 +Subject: hfsplus: fix to avoid false alarm of circular locking +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Chao Yu + +[ Upstream commit be4edd1642ee205ed7bbf66edc0453b1be1fb8d7 ] + +Syzbot report potential ABBA deadlock as below: + +loop0: detected capacity change from 0 to 1024 +====================================================== +WARNING: possible circular locking dependency detected +6.9.0-syzkaller-10323-g8f6a15f095a6 #0 Not tainted +------------------------------------------------------ +syz-executor171/5344 is trying to acquire lock: +ffff88807cb980b0 (&tree->tree_lock){+.+.}-{3:3}, at: hfsplus_file_truncate+0x811/0xb50 fs/hfsplus/extents.c:595 + +but task is already holding lock: +ffff88807a930108 (&HFSPLUS_I(inode)->extents_lock){+.+.}-{3:3}, at: hfsplus_file_truncate+0x2da/0xb50 fs/hfsplus/extents.c:576 + +which lock already depends on the new lock. + +the existing dependency chain (in reverse order) is: + +-> #1 (&HFSPLUS_I(inode)->extents_lock){+.+.}-{3:3}: + lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5754 + __mutex_lock_common kernel/locking/mutex.c:608 [inline] + __mutex_lock+0x136/0xd70 kernel/locking/mutex.c:752 + hfsplus_file_extend+0x21b/0x1b70 fs/hfsplus/extents.c:457 + hfsplus_bmap_reserve+0x105/0x4e0 fs/hfsplus/btree.c:358 + hfsplus_rename_cat+0x1d0/0x1050 fs/hfsplus/catalog.c:456 + hfsplus_rename+0x12e/0x1c0 fs/hfsplus/dir.c:552 + vfs_rename+0xbdb/0xf00 fs/namei.c:4887 + do_renameat2+0xd94/0x13f0 fs/namei.c:5044 + __do_sys_rename fs/namei.c:5091 [inline] + __se_sys_rename fs/namei.c:5089 [inline] + __x64_sys_rename+0x86/0xa0 fs/namei.c:5089 + do_syscall_x64 arch/x86/entry/common.c:52 [inline] + do_syscall_64+0xf5/0x240 arch/x86/entry/common.c:83 + entry_SYSCALL_64_after_hwframe+0x77/0x7f + +-> #0 (&tree->tree_lock){+.+.}-{3:3}: + check_prev_add kernel/locking/lockdep.c:3134 [inline] + check_prevs_add kernel/locking/lockdep.c:3253 [inline] + validate_chain+0x18cb/0x58e0 kernel/locking/lockdep.c:3869 + __lock_acquire+0x1346/0x1fd0 kernel/locking/lockdep.c:5137 + lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5754 + __mutex_lock_common kernel/locking/mutex.c:608 [inline] + __mutex_lock+0x136/0xd70 kernel/locking/mutex.c:752 + hfsplus_file_truncate+0x811/0xb50 fs/hfsplus/extents.c:595 + hfsplus_setattr+0x1ce/0x280 fs/hfsplus/inode.c:265 + notify_change+0xb9d/0xe70 fs/attr.c:497 + do_truncate+0x220/0x310 fs/open.c:65 + handle_truncate fs/namei.c:3308 [inline] + do_open fs/namei.c:3654 [inline] + path_openat+0x2a3d/0x3280 fs/namei.c:3807 + do_filp_open+0x235/0x490 fs/namei.c:3834 + do_sys_openat2+0x13e/0x1d0 fs/open.c:1406 + do_sys_open fs/open.c:1421 [inline] + __do_sys_creat fs/open.c:1497 [inline] + __se_sys_creat fs/open.c:1491 [inline] + __x64_sys_creat+0x123/0x170 fs/open.c:1491 + do_syscall_x64 arch/x86/entry/common.c:52 [inline] + do_syscall_64+0xf5/0x240 arch/x86/entry/common.c:83 + entry_SYSCALL_64_after_hwframe+0x77/0x7f + +other info that might help us debug this: + + Possible unsafe locking scenario: + + CPU0 CPU1 + ---- ---- + lock(&HFSPLUS_I(inode)->extents_lock); + lock(&tree->tree_lock); + lock(&HFSPLUS_I(inode)->extents_lock); + lock(&tree->tree_lock); + +This is a false alarm as tree_lock mutex are different, one is +from sbi->cat_tree, and another is from sbi->ext_tree: + +Thread A Thread B +- hfsplus_rename + - hfsplus_rename_cat + - hfs_find_init + - mutext_lock(cat_tree->tree_lock) + - hfsplus_setattr + - hfsplus_file_truncate + - mutex_lock(hip->extents_lock) + - hfs_find_init + - mutext_lock(ext_tree->tree_lock) + - hfs_bmap_reserve + - hfsplus_file_extend + - mutex_lock(hip->extents_lock) + +So, let's call mutex_lock_nested for tree_lock mutex lock, and pass +correct lock class for it. + +Fixes: 31651c607151 ("hfsplus: avoid deadlock on file truncation") +Reported-by: syzbot+6030b3b1b9bf70e538c4@syzkaller.appspotmail.com +Closes: https://lore.kernel.org/linux-fsdevel/000000000000e37a4005ef129563@google.com +Cc: Ernesto A. Fernández +Signed-off-by: Chao Yu +Link: https://lore.kernel.org/r/20240607142304.455441-1-chao@kernel.org +Signed-off-by: Christian Brauner +Signed-off-by: Sasha Levin +--- + fs/hfsplus/bfind.c | 15 ++------------- + fs/hfsplus/extents.c | 9 ++++++--- + fs/hfsplus/hfsplus_fs.h | 21 +++++++++++++++++++++ + 3 files changed, 29 insertions(+), 16 deletions(-) + +diff --git a/fs/hfsplus/bfind.c b/fs/hfsplus/bfind.c +index ca2ba8c9f82ef..901e83d65d202 100644 +--- a/fs/hfsplus/bfind.c ++++ b/fs/hfsplus/bfind.c +@@ -25,19 +25,8 @@ int hfs_find_init(struct hfs_btree *tree, struct hfs_find_data *fd) + fd->key = ptr + tree->max_key_len + 2; + hfs_dbg(BNODE_REFS, "find_init: %d (%p)\n", + tree->cnid, __builtin_return_address(0)); +- switch (tree->cnid) { +- case HFSPLUS_CAT_CNID: +- mutex_lock_nested(&tree->tree_lock, CATALOG_BTREE_MUTEX); +- break; +- case HFSPLUS_EXT_CNID: +- mutex_lock_nested(&tree->tree_lock, EXTENTS_BTREE_MUTEX); +- break; +- case HFSPLUS_ATTR_CNID: +- mutex_lock_nested(&tree->tree_lock, ATTR_BTREE_MUTEX); +- break; +- default: +- BUG(); +- } ++ mutex_lock_nested(&tree->tree_lock, ++ hfsplus_btree_lock_class(tree)); + return 0; + } + +diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c +index 7054a542689f9..c95a2f0ed4a74 100644 +--- a/fs/hfsplus/extents.c ++++ b/fs/hfsplus/extents.c +@@ -430,7 +430,8 @@ int hfsplus_free_fork(struct super_block *sb, u32 cnid, + hfsplus_free_extents(sb, ext_entry, total_blocks - start, + total_blocks); + total_blocks = start; +- mutex_lock(&fd.tree->tree_lock); ++ mutex_lock_nested(&fd.tree->tree_lock, ++ hfsplus_btree_lock_class(fd.tree)); + } while (total_blocks > blocks); + hfs_find_exit(&fd); + +@@ -592,7 +593,8 @@ void hfsplus_file_truncate(struct inode *inode) + alloc_cnt, alloc_cnt - blk_cnt); + hfsplus_dump_extent(hip->first_extents); + hip->first_blocks = blk_cnt; +- mutex_lock(&fd.tree->tree_lock); ++ mutex_lock_nested(&fd.tree->tree_lock, ++ hfsplus_btree_lock_class(fd.tree)); + break; + } + res = __hfsplus_ext_cache_extent(&fd, inode, alloc_cnt); +@@ -606,7 +608,8 @@ void hfsplus_file_truncate(struct inode *inode) + hfsplus_free_extents(sb, hip->cached_extents, + alloc_cnt - start, alloc_cnt - blk_cnt); + hfsplus_dump_extent(hip->cached_extents); +- mutex_lock(&fd.tree->tree_lock); ++ mutex_lock_nested(&fd.tree->tree_lock, ++ hfsplus_btree_lock_class(fd.tree)); + if (blk_cnt > start) { + hip->extent_state |= HFSPLUS_EXT_DIRTY; + break; +diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h +index c438680ef9f75..bfbe88e804eb0 100644 +--- a/fs/hfsplus/hfsplus_fs.h ++++ b/fs/hfsplus/hfsplus_fs.h +@@ -557,6 +557,27 @@ static inline __be32 __hfsp_ut2mt(time64_t ut) + return cpu_to_be32(lower_32_bits(ut) + HFSPLUS_UTC_OFFSET); + } + ++static inline enum hfsplus_btree_mutex_classes ++hfsplus_btree_lock_class(struct hfs_btree *tree) ++{ ++ enum hfsplus_btree_mutex_classes class; ++ ++ switch (tree->cnid) { ++ case HFSPLUS_CAT_CNID: ++ class = CATALOG_BTREE_MUTEX; ++ break; ++ case HFSPLUS_EXT_CNID: ++ class = EXTENTS_BTREE_MUTEX; ++ break; ++ case HFSPLUS_ATTR_CNID: ++ class = ATTR_BTREE_MUTEX; ++ break; ++ default: ++ BUG(); ++ } ++ return class; ++} ++ + /* compatibility */ + #define hfsp_mt2ut(t) (struct timespec64){ .tv_sec = __hfsp_mt2ut(t) } + #define hfsp_ut2mt(t) __hfsp_ut2mt((t).tv_sec) +-- +2.43.0 + diff --git a/queue-5.10/hwmon-adt7475-fix-default-duty-on-fan-is-disabled.patch b/queue-5.10/hwmon-adt7475-fix-default-duty-on-fan-is-disabled.patch new file mode 100644 index 00000000000..b566e2f8064 --- /dev/null +++ b/queue-5.10/hwmon-adt7475-fix-default-duty-on-fan-is-disabled.patch @@ -0,0 +1,38 @@ +From 1f1d17c8eb26fd9fc4f6345901f057e9a96109c2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Jul 2024 15:32:52 +0800 +Subject: hwmon: (adt7475) Fix default duty on fan is disabled + +From: Wayne Tung + +[ Upstream commit 39b24cced70fdc336dbc0070f8b3bde61d8513a8 ] + +According to the comments on fan is disabled, we change to manual mode +and set the duty cycle to 0. +For setting the duty cycle part, the register is wrong. Fix it. + +Fixes: 1c301fc5394f ("hwmon: Add a driver for the ADT7475 hardware monitoring chip") +Signed-off-by: Wayne Tung +Link: https://lore.kernel.org/r/20240701073252.317397-1-chineweff@gmail.com +Signed-off-by: Guenter Roeck +Signed-off-by: Sasha Levin +--- + drivers/hwmon/adt7475.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c +index 22e314725def0..b4c0f01f52c4f 100644 +--- a/drivers/hwmon/adt7475.c ++++ b/drivers/hwmon/adt7475.c +@@ -1770,7 +1770,7 @@ static void adt7475_read_pwm(struct i2c_client *client, int index) + data->pwm[CONTROL][index] &= ~0xE0; + data->pwm[CONTROL][index] |= (7 << 5); + +- i2c_smbus_write_byte_data(client, PWM_CONFIG_REG(index), ++ i2c_smbus_write_byte_data(client, PWM_REG(index), + data->pwm[INPUT][index]); + + i2c_smbus_write_byte_data(client, PWM_CONFIG_REG(index), +-- +2.43.0 + diff --git a/queue-5.10/hwmon-max6697-fix-swapped-temp-1-8-critical-alarms.patch b/queue-5.10/hwmon-max6697-fix-swapped-temp-1-8-critical-alarms.patch new file mode 100644 index 00000000000..dca386e4434 --- /dev/null +++ b/queue-5.10/hwmon-max6697-fix-swapped-temp-1-8-critical-alarms.patch @@ -0,0 +1,48 @@ +From 423c3ac4a7b16c94960a63ac0cf26b0ec75a79b5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 13 Jul 2024 12:03:53 -0700 +Subject: hwmon: (max6697) Fix swapped temp{1,8} critical alarms + +From: Guenter Roeck + +[ Upstream commit 1ea3fd1eb9869fcdcbc9c68f9728bfc47b9503f1 ] + +The critical alarm bit for the local temperature sensor (temp1) is in +bit 7 of register 0x45 (not bit 6), and the critical alarm bit for remote +temperature sensor 7 (temp8) is in bit 6 (not bit 7). + +This only affects MAX6581 since all other chips supported by this driver +do not support those critical alarms. + +Fixes: 5372d2d71c46 ("hwmon: Driver for Maxim MAX6697 and compatibles") +Reviewed-by: Tzung-Bi Shih +Signed-off-by: Guenter Roeck +Signed-off-by: Sasha Levin +--- + drivers/hwmon/max6697.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/hwmon/max6697.c b/drivers/hwmon/max6697.c +index 3fa2a3b3c9954..7508d67c3dfb0 100644 +--- a/drivers/hwmon/max6697.c ++++ b/drivers/hwmon/max6697.c +@@ -430,14 +430,14 @@ static SENSOR_DEVICE_ATTR_RO(temp6_max_alarm, alarm, 20); + static SENSOR_DEVICE_ATTR_RO(temp7_max_alarm, alarm, 21); + static SENSOR_DEVICE_ATTR_RO(temp8_max_alarm, alarm, 23); + +-static SENSOR_DEVICE_ATTR_RO(temp1_crit_alarm, alarm, 14); ++static SENSOR_DEVICE_ATTR_RO(temp1_crit_alarm, alarm, 15); + static SENSOR_DEVICE_ATTR_RO(temp2_crit_alarm, alarm, 8); + static SENSOR_DEVICE_ATTR_RO(temp3_crit_alarm, alarm, 9); + static SENSOR_DEVICE_ATTR_RO(temp4_crit_alarm, alarm, 10); + static SENSOR_DEVICE_ATTR_RO(temp5_crit_alarm, alarm, 11); + static SENSOR_DEVICE_ATTR_RO(temp6_crit_alarm, alarm, 12); + static SENSOR_DEVICE_ATTR_RO(temp7_crit_alarm, alarm, 13); +-static SENSOR_DEVICE_ATTR_RO(temp8_crit_alarm, alarm, 15); ++static SENSOR_DEVICE_ATTR_RO(temp8_crit_alarm, alarm, 14); + + static SENSOR_DEVICE_ATTR_RO(temp2_fault, alarm, 1); + static SENSOR_DEVICE_ATTR_RO(temp3_fault, alarm, 2); +-- +2.43.0 + diff --git a/queue-5.10/hwmon-max6697-fix-underflow-when-writing-limit-attri.patch b/queue-5.10/hwmon-max6697-fix-underflow-when-writing-limit-attri.patch new file mode 100644 index 00000000000..7cc71ec5169 --- /dev/null +++ b/queue-5.10/hwmon-max6697-fix-underflow-when-writing-limit-attri.patch @@ -0,0 +1,40 @@ +From 10eb80af4f3c1487dc9566b66c3230cc8d2183cf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 13 Jul 2024 14:26:19 -0700 +Subject: hwmon: (max6697) Fix underflow when writing limit attributes + +From: Guenter Roeck + +[ Upstream commit cbf7467828cd4ec7ceac7a8b5b5ddb2f69f07b0e ] + +Using DIV_ROUND_CLOSEST() on an unbound value can result in underflows. +Indeed, module test scripts report: + +temp1_max: Suspected underflow: [min=0, read 255000, written -9223372036854775808] +temp1_crit: Suspected underflow: [min=0, read 255000, written -9223372036854775808] + +Fix by introducing an extra set of clamping. + +Fixes: 5372d2d71c46 ("hwmon: Driver for Maxim MAX6697 and compatibles") +Reviewed-by: Tzung-Bi Shih +Signed-off-by: Guenter Roeck +Signed-off-by: Sasha Levin +--- + drivers/hwmon/max6697.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/hwmon/max6697.c b/drivers/hwmon/max6697.c +index fc3241101178d..3fa2a3b3c9954 100644 +--- a/drivers/hwmon/max6697.c ++++ b/drivers/hwmon/max6697.c +@@ -312,6 +312,7 @@ static ssize_t temp_store(struct device *dev, + return ret; + + mutex_lock(&data->update_lock); ++ temp = clamp_val(temp, -1000000, 1000000); /* prevent underflow */ + temp = DIV_ROUND_CLOSEST(temp, 1000) + data->temp_offset; + temp = clamp_val(temp, 0, data->type == max6581 ? 255 : 127); + data->temp[nr][index] = temp; +-- +2.43.0 + diff --git a/queue-5.10/input-elan_i2c-do-not-leave-interrupt-disabled-on-su.patch b/queue-5.10/input-elan_i2c-do-not-leave-interrupt-disabled-on-su.patch new file mode 100644 index 00000000000..c64cc82ef8d --- /dev/null +++ b/queue-5.10/input-elan_i2c-do-not-leave-interrupt-disabled-on-su.patch @@ -0,0 +1,36 @@ +From fb26cb32772c76ccac2aa124d7503d81a00176a4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jun 2024 23:02:48 -0700 +Subject: Input: elan_i2c - do not leave interrupt disabled on suspend failure + +From: Dmitry Torokhov + +[ Upstream commit 5f82c1e04721e7cd98e604eb4e58f0724d8e5a65 ] + +Make sure interrupts are not left disabled when we fail to suspend the +touch controller. + +Fixes: 6696777c6506 ("Input: add driver for Elan I2C/SMbus touchpad") +Link: https://lore.kernel.org/r/ZmKiiL-1wzKrhqBj@google.com +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/mouse/elan_i2c_core.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c +index 6f59c8b245f24..14c2c66414f4e 100644 +--- a/drivers/input/mouse/elan_i2c_core.c ++++ b/drivers/input/mouse/elan_i2c_core.c +@@ -1340,6 +1340,8 @@ static int __maybe_unused elan_suspend(struct device *dev) + } + + err: ++ if (ret) ++ enable_irq(client->irq); + mutex_unlock(&data->sysfs_mutex); + return ret; + } +-- +2.43.0 + diff --git a/queue-5.10/input-qt1050-handle-chip_id-reading-error.patch b/queue-5.10/input-qt1050-handle-chip_id-reading-error.patch new file mode 100644 index 00000000000..8da7c851796 --- /dev/null +++ b/queue-5.10/input-qt1050-handle-chip_id-reading-error.patch @@ -0,0 +1,49 @@ +From 16ce1be297925f325e337b9bacf9aa12bc58aa28 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 17 Jun 2024 20:30:18 +0200 +Subject: Input: qt1050 - handle CHIP_ID reading error + +From: Andrei Lalaev + +[ Upstream commit 866a5c7e2781cf1b019072288f1f5c64186dcb63 ] + +If the device is missing, we get the following error: + + qt1050 3-0041: ID -1340767592 not supported + +Let's handle this situation and print more informative error +when reading of CHIP_ID fails: + + qt1050 3-0041: Failed to read chip ID: -6 + +Fixes: cbebf5addec1 ("Input: qt1050 - add Microchip AT42QT1050 support") +Signed-off-by: Andrei Lalaev +Reviewed-by: Marco Felsch +Link: https://lore.kernel.org/r/20240617183018.916234-1-andrey.lalaev@gmail.com +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/keyboard/qt1050.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/input/keyboard/qt1050.c b/drivers/input/keyboard/qt1050.c +index 403060d05c3b3..7193a4198e214 100644 +--- a/drivers/input/keyboard/qt1050.c ++++ b/drivers/input/keyboard/qt1050.c +@@ -226,7 +226,12 @@ static bool qt1050_identify(struct qt1050_priv *ts) + int err; + + /* Read Chip ID */ +- regmap_read(ts->regmap, QT1050_CHIP_ID, &val); ++ err = regmap_read(ts->regmap, QT1050_CHIP_ID, &val); ++ if (err) { ++ dev_err(&ts->client->dev, "Failed to read chip ID: %d\n", err); ++ return false; ++ } ++ + if (val != QT1050_CHIP_ID_VER) { + dev_err(&ts->client->dev, "ID %d not supported\n", val); + return false; +-- +2.43.0 + diff --git a/queue-5.10/ipvs-avoid-unnecessary-calls-to-skb_is_gso_sctp.patch b/queue-5.10/ipvs-avoid-unnecessary-calls-to-skb_is_gso_sctp.patch new file mode 100644 index 00000000000..dc910e3c9ba --- /dev/null +++ b/queue-5.10/ipvs-avoid-unnecessary-calls-to-skb_is_gso_sctp.patch @@ -0,0 +1,47 @@ +From 846e0819d2dd3f26f581a918f587a07b4e12ae90 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 23 May 2024 18:54:44 +0200 +Subject: ipvs: Avoid unnecessary calls to skb_is_gso_sctp + +From: Ismael Luceno + +[ Upstream commit 53796b03295cf7ab1fc8600016fa6dfbf4a494a0 ] + +In the context of the SCTP SNAT/DNAT handler, these calls can only +return true. + +Fixes: e10d3ba4d434 ("ipvs: Fix checksumming on GSO of SCTP packets") +Signed-off-by: Ismael Luceno +Acked-by: Julian Anastasov +Acked-by: Simon Horman +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/ipvs/ip_vs_proto_sctp.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/net/netfilter/ipvs/ip_vs_proto_sctp.c b/net/netfilter/ipvs/ip_vs_proto_sctp.c +index 1e689c7141271..83e452916403d 100644 +--- a/net/netfilter/ipvs/ip_vs_proto_sctp.c ++++ b/net/netfilter/ipvs/ip_vs_proto_sctp.c +@@ -126,7 +126,7 @@ sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, + if (sctph->source != cp->vport || payload_csum || + skb->ip_summed == CHECKSUM_PARTIAL) { + sctph->source = cp->vport; +- if (!skb_is_gso(skb) || !skb_is_gso_sctp(skb)) ++ if (!skb_is_gso(skb)) + sctp_nat_csum(skb, sctph, sctphoff); + } else { + skb->ip_summed = CHECKSUM_UNNECESSARY; +@@ -175,7 +175,7 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, + (skb->ip_summed == CHECKSUM_PARTIAL && + !(skb_dst(skb)->dev->features & NETIF_F_SCTP_CRC))) { + sctph->dest = cp->dport; +- if (!skb_is_gso(skb) || !skb_is_gso_sctp(skb)) ++ if (!skb_is_gso(skb)) + sctp_nat_csum(skb, sctph, sctphoff); + } else if (skb->ip_summed != CHECKSUM_PARTIAL) { + skb->ip_summed = CHECKSUM_UNNECESSARY; +-- +2.43.0 + diff --git a/queue-5.10/kvm-s390-fix-race-in-gmap_make_secure.patch b/queue-5.10/kvm-s390-fix-race-in-gmap_make_secure.patch new file mode 100644 index 00000000000..77c7be11b0d --- /dev/null +++ b/queue-5.10/kvm-s390-fix-race-in-gmap_make_secure.patch @@ -0,0 +1,95 @@ +From f7d5788fd019b54a579f631afe37e8a69894cc2a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 Apr 2023 11:27:53 +0200 +Subject: KVM: s390: fix race in gmap_make_secure() + +From: Claudio Imbrenda + +[ Upstream commit c148dc8e2fa403be501612ee409db866eeed35c0 ] + +Fix a potential race in gmap_make_secure() and remove the last user of +follow_page() without FOLL_GET. + +The old code is locking something it doesn't have a reference to, and +as explained by Jason and David in this discussion: +https://lore.kernel.org/linux-mm/Y9J4P%2FRNvY1Ztn0Q@nvidia.com/ +it can lead to all kind of bad things, including the page getting +unmapped (MADV_DONTNEED), freed, reallocated as a larger folio and the +unlock_page() would target the wrong bit. +There is also another race with the FOLL_WRITE, which could race +between the follow_page() and the get_locked_pte(). + +The main point is to remove the last use of follow_page() without +FOLL_GET or FOLL_PIN, removing the races can be considered a nice +bonus. + +Link: https://lore.kernel.org/linux-mm/Y9J4P%2FRNvY1Ztn0Q@nvidia.com/ +Suggested-by: Jason Gunthorpe +Fixes: 214d9bbcd3a6 ("s390/mm: provide memory management functions for protected KVM guests") +Reviewed-by: Jason Gunthorpe +Signed-off-by: Claudio Imbrenda +Message-Id: <20230428092753.27913-2-imbrenda@linux.ibm.com> +Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference") +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/uv.c | 32 +++++++++++--------------------- + 1 file changed, 11 insertions(+), 21 deletions(-) + +diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c +index c38103f3044da..6abf73e832445 100644 +--- a/arch/s390/kernel/uv.c ++++ b/arch/s390/kernel/uv.c +@@ -213,21 +213,10 @@ static int expected_page_refs(struct page *page) + return res; + } + +-static int make_secure_pte(pte_t *ptep, unsigned long addr, +- struct page *exp_page, struct uv_cb_header *uvcb) ++static int make_page_secure(struct page *page, struct uv_cb_header *uvcb) + { +- pte_t entry = READ_ONCE(*ptep); +- struct page *page; + int expected, cc = 0; + +- if (!pte_present(entry)) +- return -ENXIO; +- if (pte_val(entry) & _PAGE_INVALID) +- return -ENXIO; +- +- page = pte_page(entry); +- if (page != exp_page) +- return -ENXIO; + if (PageWriteback(page)) + return -EAGAIN; + expected = expected_page_refs(page); +@@ -318,17 +307,18 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb) + goto out; + + rc = -ENXIO; +- page = follow_page(vma, uaddr, FOLL_WRITE); +- if (IS_ERR_OR_NULL(page)) +- goto out; +- +- lock_page(page); + ptep = get_locked_pte(gmap->mm, uaddr, &ptelock); +- if (should_export_before_import(uvcb, gmap->mm)) +- uv_convert_from_secure(page_to_phys(page)); +- rc = make_secure_pte(ptep, uaddr, page, uvcb); ++ if (pte_present(*ptep) && !(pte_val(*ptep) & _PAGE_INVALID) && pte_write(*ptep)) { ++ page = pte_page(*ptep); ++ rc = -EAGAIN; ++ if (trylock_page(page)) { ++ if (should_export_before_import(uvcb, gmap->mm)) ++ uv_convert_from_secure(page_to_phys(page)); ++ rc = make_page_secure(page, uvcb); ++ unlock_page(page); ++ } ++ } + pte_unmap_unlock(ptep, ptelock); +- unlock_page(page); + out: + mmap_read_unlock(gmap->mm); + +-- +2.43.0 + diff --git a/queue-5.10/kvm-s390-pv-add-export-before-import.patch b/queue-5.10/kvm-s390-pv-add-export-before-import.patch new file mode 100644 index 00000000000..74d66f6f863 --- /dev/null +++ b/queue-5.10/kvm-s390-pv-add-export-before-import.patch @@ -0,0 +1,81 @@ +From fd4f645d27e14d69d1c7e9c277f5128920e06791 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Jun 2022 15:56:07 +0200 +Subject: KVM: s390: pv: add export before import + +From: Claudio Imbrenda + +[ Upstream commit 72b1daff2671cef2c8cccc6c4e52f8d5ce4ebe58 ] + +Due to upcoming changes, it will be possible to temporarily have +multiple protected VMs in the same address space, although only one +will be actually active. + +In that scenario, it is necessary to perform an export of every page +that is to be imported, since the hardware does not allow a page +belonging to a protected guest to be imported into a different +protected guest. + +This also applies to pages that are shared, and thus accessible by the +host. + +Signed-off-by: Claudio Imbrenda +Reviewed-by: Janosch Frank +Link: https://lore.kernel.org/r/20220628135619.32410-7-imbrenda@linux.ibm.com +Message-Id: <20220628135619.32410-7-imbrenda@linux.ibm.com> +Signed-off-by: Janosch Frank +Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference") +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/uv.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c +index 5173c24a02637..c38103f3044da 100644 +--- a/arch/s390/kernel/uv.c ++++ b/arch/s390/kernel/uv.c +@@ -255,6 +255,32 @@ static int make_secure_pte(pte_t *ptep, unsigned long addr, + return uvcb->rc == 0x10a ? -ENXIO : -EINVAL; + } + ++/** ++ * should_export_before_import - Determine whether an export is needed ++ * before an import-like operation ++ * @uvcb: the Ultravisor control block of the UVC to be performed ++ * @mm: the mm of the process ++ * ++ * Returns whether an export is needed before every import-like operation. ++ * This is needed for shared pages, which don't trigger a secure storage ++ * exception when accessed from a different guest. ++ * ++ * Although considered as one, the Unpin Page UVC is not an actual import, ++ * so it is not affected. ++ * ++ * No export is needed also when there is only one protected VM, because the ++ * page cannot belong to the wrong VM in that case (there is no "other VM" ++ * it can belong to). ++ * ++ * Return: true if an export is needed before every import, otherwise false. ++ */ ++static bool should_export_before_import(struct uv_cb_header *uvcb, struct mm_struct *mm) ++{ ++ if (uvcb->cmd == UVC_CMD_UNPIN_PAGE_SHARED) ++ return false; ++ return atomic_read(&mm->context.protected_count) > 1; ++} ++ + /* + * Requests the Ultravisor to make a page accessible to a guest. + * If it's brought in the first time, it will be cleared. If +@@ -298,6 +324,8 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb) + + lock_page(page); + ptep = get_locked_pte(gmap->mm, uaddr, &ptelock); ++ if (should_export_before_import(uvcb, gmap->mm)) ++ uv_convert_from_secure(page_to_phys(page)); + rc = make_secure_pte(ptep, uaddr, page, uvcb); + pte_unmap_unlock(ptep, ptelock); + unlock_page(page); +-- +2.43.0 + diff --git a/queue-5.10/kvm-s390-pv-avoid-stalls-when-making-pages-secure.patch b/queue-5.10/kvm-s390-pv-avoid-stalls-when-making-pages-secure.patch new file mode 100644 index 00000000000..be095dd9d38 --- /dev/null +++ b/queue-5.10/kvm-s390-pv-avoid-stalls-when-making-pages-secure.patch @@ -0,0 +1,110 @@ +From e88645a7bea4dee26297a5f1c95913e80788ffeb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Sep 2021 15:24:52 +0200 +Subject: KVM: s390: pv: avoid stalls when making pages secure + +From: Claudio Imbrenda + +[ Upstream commit f0a1a0615a6ff6d38af2c65a522698fb4bb85df6 ] + +Improve make_secure_pte to avoid stalls when the system is heavily +overcommitted. This was especially problematic in kvm_s390_pv_unpack, +because of the loop over all pages that needed unpacking. + +Due to the locks being held, it was not possible to simply replace +uv_call with uv_call_sched. A more complex approach was +needed, in which uv_call is replaced with __uv_call, which does not +loop. When the UVC needs to be executed again, -EAGAIN is returned, and +the caller (or its caller) will try again. + +When -EAGAIN is returned, the path is the same as when the page is in +writeback (and the writeback check is also performed, which is +harmless). + +Fixes: 214d9bbcd3a672 ("s390/mm: provide memory management functions for protected KVM guests") +Signed-off-by: Claudio Imbrenda +Reviewed-by: Janosch Frank +Reviewed-by: Christian Borntraeger +Link: https://lore.kernel.org/r/20210920132502.36111-5-imbrenda@linux.ibm.com +Signed-off-by: Christian Borntraeger +Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference") +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/uv.c | 29 +++++++++++++++++++++++------ + arch/s390/kvm/intercept.c | 5 +++++ + 2 files changed, 28 insertions(+), 6 deletions(-) + +diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c +index c811b2313100b..422765c81dd69 100644 +--- a/arch/s390/kernel/uv.c ++++ b/arch/s390/kernel/uv.c +@@ -186,7 +186,7 @@ static int make_secure_pte(pte_t *ptep, unsigned long addr, + { + pte_t entry = READ_ONCE(*ptep); + struct page *page; +- int expected, rc = 0; ++ int expected, cc = 0; + + if (!pte_present(entry)) + return -ENXIO; +@@ -202,12 +202,25 @@ static int make_secure_pte(pte_t *ptep, unsigned long addr, + if (!page_ref_freeze(page, expected)) + return -EBUSY; + set_bit(PG_arch_1, &page->flags); +- rc = uv_call(0, (u64)uvcb); ++ /* ++ * If the UVC does not succeed or fail immediately, we don't want to ++ * loop for long, or we might get stall notifications. ++ * On the other hand, this is a complex scenario and we are holding a lot of ++ * locks, so we can't easily sleep and reschedule. We try only once, ++ * and if the UVC returned busy or partial completion, we return ++ * -EAGAIN and we let the callers deal with it. ++ */ ++ cc = __uv_call(0, (u64)uvcb); + page_ref_unfreeze(page, expected); +- /* Return -ENXIO if the page was not mapped, -EINVAL otherwise */ +- if (rc) +- rc = uvcb->rc == 0x10a ? -ENXIO : -EINVAL; +- return rc; ++ /* ++ * Return -ENXIO if the page was not mapped, -EINVAL for other errors. ++ * If busy or partially completed, return -EAGAIN. ++ */ ++ if (cc == UVC_CC_OK) ++ return 0; ++ else if (cc == UVC_CC_BUSY || cc == UVC_CC_PARTIAL) ++ return -EAGAIN; ++ return uvcb->rc == 0x10a ? -ENXIO : -EINVAL; + } + + /* +@@ -260,6 +273,10 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb) + mmap_read_unlock(gmap->mm); + + if (rc == -EAGAIN) { ++ /* ++ * If we are here because the UVC returned busy or partial ++ * completion, this is just a useless check, but it is safe. ++ */ + wait_on_page_writeback(page); + } else if (rc == -EBUSY) { + /* +diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c +index 8bf72a323e4fa..8f13943c9160d 100644 +--- a/arch/s390/kvm/intercept.c ++++ b/arch/s390/kvm/intercept.c +@@ -535,6 +535,11 @@ static int handle_pv_uvc(struct kvm_vcpu *vcpu) + */ + if (rc == -EINVAL) + return 0; ++ /* ++ * If we got -EAGAIN here, we simply return it. It will eventually ++ * get propagated all the way to userspace, which should then try ++ * again. ++ */ + return rc; + } + +-- +2.43.0 + diff --git a/queue-5.10/kvm-s390-pv-properly-handle-page-flags-for-protected.patch b/queue-5.10/kvm-s390-pv-properly-handle-page-flags-for-protected.patch new file mode 100644 index 00000000000..845c0fd6693 --- /dev/null +++ b/queue-5.10/kvm-s390-pv-properly-handle-page-flags-for-protected.patch @@ -0,0 +1,184 @@ +From 118aed88a4b89ddc321e735e50c4836e20fffe3b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Sep 2021 15:24:54 +0200 +Subject: KVM: s390: pv: properly handle page flags for protected guests + +From: Claudio Imbrenda + +[ Upstream commit 380d97bd02fca7b9b41aec2d1c767874d602bc78 ] + +Introduce variants of the convert and destroy page functions that also +clear the PG_arch_1 bit used to mark them as secure pages. + +The PG_arch_1 flag is always allowed to overindicate; using the new +functions introduced here allows to reduce the extent of overindication +and thus improve performance. + +These new functions can only be called on pages for which a reference +is already being held. + +Signed-off-by: Claudio Imbrenda +Reviewed-by: Janosch Frank +Reviewed-by: Christian Borntraeger +Link: https://lore.kernel.org/r/20210920132502.36111-7-imbrenda@linux.ibm.com +Signed-off-by: Christian Borntraeger +Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference") +Signed-off-by: Sasha Levin +--- + arch/s390/include/asm/pgtable.h | 9 ++++++--- + arch/s390/include/asm/uv.h | 10 ++++++++-- + arch/s390/kernel/uv.c | 34 ++++++++++++++++++++++++++++++++- + arch/s390/mm/gmap.c | 4 +++- + 4 files changed, 50 insertions(+), 7 deletions(-) + +diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h +index 2338345912a31..e967cc2a01f7e 100644 +--- a/arch/s390/include/asm/pgtable.h ++++ b/arch/s390/include/asm/pgtable.h +@@ -1080,8 +1080,9 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, + pte_t res; + + res = ptep_xchg_lazy(mm, addr, ptep, __pte(_PAGE_INVALID)); ++ /* At this point the reference through the mapping is still present */ + if (mm_is_protected(mm) && pte_present(res)) +- uv_convert_from_secure(pte_val(res) & PAGE_MASK); ++ uv_convert_owned_from_secure(pte_val(res) & PAGE_MASK); + return res; + } + +@@ -1097,8 +1098,9 @@ static inline pte_t ptep_clear_flush(struct vm_area_struct *vma, + pte_t res; + + res = ptep_xchg_direct(vma->vm_mm, addr, ptep, __pte(_PAGE_INVALID)); ++ /* At this point the reference through the mapping is still present */ + if (mm_is_protected(vma->vm_mm) && pte_present(res)) +- uv_convert_from_secure(pte_val(res) & PAGE_MASK); ++ uv_convert_owned_from_secure(pte_val(res) & PAGE_MASK); + return res; + } + +@@ -1122,8 +1124,9 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, + } else { + res = ptep_xchg_lazy(mm, addr, ptep, __pte(_PAGE_INVALID)); + } ++ /* At this point the reference through the mapping is still present */ + if (mm_is_protected(mm) && pte_present(res)) +- uv_convert_from_secure(pte_val(res) & PAGE_MASK); ++ uv_convert_owned_from_secure(pte_val(res) & PAGE_MASK); + return res; + } + +diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h +index 12c5f006c1364..bbd51aa94d05c 100644 +--- a/arch/s390/include/asm/uv.h ++++ b/arch/s390/include/asm/uv.h +@@ -351,8 +351,9 @@ static inline int is_prot_virt_host(void) + } + + int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb); +-int uv_destroy_page(unsigned long paddr); ++int uv_destroy_owned_page(unsigned long paddr); + int uv_convert_from_secure(unsigned long paddr); ++int uv_convert_owned_from_secure(unsigned long paddr); + int gmap_convert_to_secure(struct gmap *gmap, unsigned long gaddr); + + void setup_uv(void); +@@ -362,7 +363,7 @@ void adjust_to_uv_max(unsigned long *vmax); + static inline void setup_uv(void) {} + static inline void adjust_to_uv_max(unsigned long *vmax) {} + +-static inline int uv_destroy_page(unsigned long paddr) ++static inline int uv_destroy_owned_page(unsigned long paddr) + { + return 0; + } +@@ -371,6 +372,11 @@ static inline int uv_convert_from_secure(unsigned long paddr) + { + return 0; + } ++ ++static inline int uv_convert_owned_from_secure(unsigned long paddr) ++{ ++ return 0; ++} + #endif + + #if defined(CONFIG_PROTECTED_VIRTUALIZATION_GUEST) || IS_ENABLED(CONFIG_KVM) +diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c +index 422765c81dd69..5173c24a02637 100644 +--- a/arch/s390/kernel/uv.c ++++ b/arch/s390/kernel/uv.c +@@ -121,7 +121,7 @@ static int uv_pin_shared(unsigned long paddr) + * + * @paddr: Absolute host address of page to be destroyed + */ +-int uv_destroy_page(unsigned long paddr) ++static int uv_destroy_page(unsigned long paddr) + { + struct uv_cb_cfs uvcb = { + .header.cmd = UVC_CMD_DESTR_SEC_STOR, +@@ -141,6 +141,22 @@ int uv_destroy_page(unsigned long paddr) + return 0; + } + ++/* ++ * The caller must already hold a reference to the page ++ */ ++int uv_destroy_owned_page(unsigned long paddr) ++{ ++ struct page *page = phys_to_page(paddr); ++ int rc; ++ ++ get_page(page); ++ rc = uv_destroy_page(paddr); ++ if (!rc) ++ clear_bit(PG_arch_1, &page->flags); ++ put_page(page); ++ return rc; ++} ++ + /* + * Requests the Ultravisor to encrypt a guest page and make it + * accessible to the host for paging (export). +@@ -160,6 +176,22 @@ int uv_convert_from_secure(unsigned long paddr) + return 0; + } + ++/* ++ * The caller must already hold a reference to the page ++ */ ++int uv_convert_owned_from_secure(unsigned long paddr) ++{ ++ struct page *page = phys_to_page(paddr); ++ int rc; ++ ++ get_page(page); ++ rc = uv_convert_from_secure(paddr); ++ if (!rc) ++ clear_bit(PG_arch_1, &page->flags); ++ put_page(page); ++ return rc; ++} ++ + /* + * Calculate the expected ref_count for a page that would otherwise have no + * further pins. This was cribbed from similar functions in other places in +diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c +index ad4bae2465b19..46daa9115a192 100644 +--- a/arch/s390/mm/gmap.c ++++ b/arch/s390/mm/gmap.c +@@ -2693,8 +2693,10 @@ static int __s390_reset_acc(pte_t *ptep, unsigned long addr, + { + pte_t pte = READ_ONCE(*ptep); + ++ /* There is a reference through the mapping */ + if (pte_present(pte)) +- WARN_ON_ONCE(uv_destroy_page(pte_val(pte) & PAGE_MASK)); ++ WARN_ON_ONCE(uv_destroy_owned_page(pte_val(pte) & PAGE_MASK)); ++ + return 0; + } + +-- +2.43.0 + diff --git a/queue-5.10/leds-trigger-unregister-sysfs-attributes-before-call.patch b/queue-5.10/leds-trigger-unregister-sysfs-attributes-before-call.patch new file mode 100644 index 00000000000..35e6cbf346b --- /dev/null +++ b/queue-5.10/leds-trigger-unregister-sysfs-attributes-before-call.patch @@ -0,0 +1,57 @@ +From 2de0d283f0c3ab9ccd4ad74bd622cc037d163d8b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 4 May 2024 18:25:33 +0200 +Subject: leds: trigger: Unregister sysfs attributes before calling + deactivate() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Hans de Goede + +[ Upstream commit c0dc9adf9474ecb7106e60e5472577375aedaed3 ] + +Triggers which have trigger specific sysfs attributes typically store +related data in trigger-data allocated by the activate() callback and +freed by the deactivate() callback. + +Calling device_remove_groups() after calling deactivate() leaves a window +where the sysfs attributes show/store functions could be called after +deactivation and then operate on the just freed trigger-data. + +Move the device_remove_groups() call to before deactivate() to close +this race window. + +This also makes the deactivation path properly do things in reverse order +of the activation path which calls the activate() callback before calling +device_add_groups(). + +Fixes: a7e7a3156300 ("leds: triggers: add device attribute support") +Cc: Uwe Kleine-König +Signed-off-by: Hans de Goede +Acked-by: Uwe Kleine-König +Link: https://lore.kernel.org/r/20240504162533.76780-1-hdegoede@redhat.com +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/leds/led-triggers.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c +index 4e7b78a84149b..cbe70f38cb572 100644 +--- a/drivers/leds/led-triggers.c ++++ b/drivers/leds/led-triggers.c +@@ -177,9 +177,9 @@ int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig) + flags); + cancel_work_sync(&led_cdev->set_brightness_work); + led_stop_software_blink(led_cdev); ++ device_remove_groups(led_cdev->dev, led_cdev->trigger->groups); + if (led_cdev->trigger->deactivate) + led_cdev->trigger->deactivate(led_cdev); +- device_remove_groups(led_cdev->dev, led_cdev->trigger->groups); + led_cdev->trigger = NULL; + led_cdev->trigger_data = NULL; + led_cdev->activated = false; +-- +2.43.0 + diff --git a/queue-5.10/lib-objagg-fix-general-protection-fault.patch b/queue-5.10/lib-objagg-fix-general-protection-fault.patch new file mode 100644 index 00000000000..4b3d27dfc7a --- /dev/null +++ b/queue-5.10/lib-objagg-fix-general-protection-fault.patch @@ -0,0 +1,75 @@ +From 8533f3aaf1b580a53c7d9d91e8e1503261df7eab Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jun 2024 16:49:41 +0200 +Subject: lib: objagg: Fix general protection fault + +From: Ido Schimmel + +[ Upstream commit b4a3a89fffcdf09702b1f161b914e52abca1894d ] + +The library supports aggregation of objects into other objects only if +the parent object does not have a parent itself. That is, nesting is not +supported. + +Aggregation happens in two cases: Without and with hints, where hints +are a pre-computed recommendation on how to aggregate the provided +objects. + +Nesting is not possible in the first case due to a check that prevents +it, but in the second case there is no check because the assumption is +that nesting cannot happen when creating objects based on hints. The +violation of this assumption leads to various warnings and eventually to +a general protection fault [1]. + +Before fixing the root cause, error out when nesting happens and warn. + +[1] +general protection fault, probably for non-canonical address 0xdead000000000d90: 0000 [#1] PREEMPT SMP PTI +CPU: 1 PID: 1083 Comm: kworker/1:9 Tainted: G W 6.9.0-rc6-custom-gd9b4f1cca7fb #7 +Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019 +Workqueue: mlxsw_core mlxsw_sp_acl_tcam_vregion_rehash_work +RIP: 0010:mlxsw_sp_acl_erp_bf_insert+0x25/0x80 +[...] +Call Trace: + + mlxsw_sp_acl_atcam_entry_add+0x256/0x3c0 + mlxsw_sp_acl_tcam_entry_create+0x5e/0xa0 + mlxsw_sp_acl_tcam_vchunk_migrate_one+0x16b/0x270 + mlxsw_sp_acl_tcam_vregion_rehash_work+0xbe/0x510 + process_one_work+0x151/0x370 + worker_thread+0x2cb/0x3e0 + kthread+0xd0/0x100 + ret_from_fork+0x34/0x50 + ret_from_fork_asm+0x1a/0x30 + + +Fixes: 9069a3817d82 ("lib: objagg: implement optimization hints assembly and use hints for object creation") +Reported-by: Alexander Zubkov +Signed-off-by: Ido Schimmel +Reviewed-by: Amit Cohen +Tested-by: Alexander Zubkov +Signed-off-by: Petr Machata +Reviewed-by: Simon Horman +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + lib/objagg.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/lib/objagg.c b/lib/objagg.c +index 5e1676ccdaddd..73d7116025736 100644 +--- a/lib/objagg.c ++++ b/lib/objagg.c +@@ -167,6 +167,9 @@ static int objagg_obj_parent_assign(struct objagg *objagg, + { + void *delta_priv; + ++ if (WARN_ON(!objagg_obj_is_root(parent))) ++ return -EINVAL; ++ + delta_priv = objagg->ops->delta_create(objagg->priv, parent->obj, + objagg_obj->obj); + if (IS_ERR(delta_priv)) +-- +2.43.0 + diff --git a/queue-5.10/m68k-atari-fix-tt-bootup-freeze-unexpected-scu-inter.patch b/queue-5.10/m68k-atari-fix-tt-bootup-freeze-unexpected-scu-inter.patch new file mode 100644 index 00000000000..0048e3864c1 --- /dev/null +++ b/queue-5.10/m68k-atari-fix-tt-bootup-freeze-unexpected-scu-inter.patch @@ -0,0 +1,58 @@ +From e59a81de3661795d2814571b5b87ff2341b97bfc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 24 Jun 2024 17:49:01 +0300 +Subject: m68k: atari: Fix TT bootup freeze / unexpected (SCU) interrupt + messages +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Eero Tamminen + +[ Upstream commit f70065a9fd988983b2c693631b801f25a615fc04 ] + +Avoid freeze on Atari TT / MegaSTe boot with continuous messages of: + + unexpected interrupt from 112 + +Which was due to VBL interrupt being enabled in SCU sys mask, but there +being no handler for that any more. + +(Bug and fix were first verified on real Atari TT HW by Christian, + this patch later on in Hatari emulator.) + +Fixes: 1fa0b29f3a43f9dd ("fbdev: Kill Atari vblank cursor blinking") +Reported-by: Nicolas Pomarède +Closes: https://listengine.tuxfamily.org/lists.tuxfamily.org/hatari-devel/2024/06/msg00016.html +Closes: https://lore.kernel.org/all/9aa793d7-82ed-4fbd-bce5-60810d8a9119@helsinkinet.fi +Tested-by: Christian Zietz +Signed-off-by: Eero Tamminen +Reviewed-by: Michael Schmitz +Reviewed-by: Geert Uytterhoeven +Link: https://lore.kernel.org/20240624144901.5236-1-oak@helsinkinet.fi +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Sasha Levin +--- + arch/m68k/atari/ataints.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c +index 56f02ea2c248d..715d1e0d973e6 100644 +--- a/arch/m68k/atari/ataints.c ++++ b/arch/m68k/atari/ataints.c +@@ -302,11 +302,7 @@ void __init atari_init_IRQ(void) + + if (ATARIHW_PRESENT(SCU)) { + /* init the SCU if present */ +- tt_scu.sys_mask = 0x10; /* enable VBL (for the cursor) and +- * disable HSYNC interrupts (who +- * needs them?) MFP and SCC are +- * enabled in VME mask +- */ ++ tt_scu.sys_mask = 0x0; /* disable all interrupts */ + tt_scu.vme_mask = 0x60; /* enable MFP and SCC ints */ + } else { + /* If no SCU and no Hades, the HSYNC interrupt needs to be +-- +2.43.0 + diff --git a/queue-5.10/m68k-cmpxchg-fix-return-value-for-default-case-in-__.patch b/queue-5.10/m68k-cmpxchg-fix-return-value-for-default-case-in-__.patch new file mode 100644 index 00000000000..3863a6f9fc5 --- /dev/null +++ b/queue-5.10/m68k-cmpxchg-fix-return-value-for-default-case-in-__.patch @@ -0,0 +1,38 @@ +From c67cac458e0b1746ca444aeec8df4fda131ea329 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Jul 2024 05:41:17 +0200 +Subject: m68k: cmpxchg: Fix return value for default case in __arch_xchg() + +From: Thorsten Blum + +[ Upstream commit 21b9e722ad28c19c2bc83f18f540b3dbd89bf762 ] + +The return value of __invalid_xchg_size() is assigned to tmp instead of +the return variable x. Assign it to x instead. + +Fixes: 2501cf768e4009a0 ("m68k: Fix xchg/cmpxchg to fail to link if given an inappropriate pointer") +Signed-off-by: Thorsten Blum +Reviewed-by: Geert Uytterhoeven +Link: https://lore.kernel.org/20240702034116.140234-2-thorsten.blum@toblux.com +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Sasha Levin +--- + arch/m68k/include/asm/cmpxchg.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/m68k/include/asm/cmpxchg.h b/arch/m68k/include/asm/cmpxchg.h +index 3a3bdcfcd3754..2035b30d79518 100644 +--- a/arch/m68k/include/asm/cmpxchg.h ++++ b/arch/m68k/include/asm/cmpxchg.h +@@ -33,7 +33,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz + x = tmp; + break; + default: +- tmp = __invalid_xchg_size(x, ptr, size); ++ x = __invalid_xchg_size(x, ptr, size); + break; + } + +-- +2.43.0 + diff --git a/queue-5.10/macintosh-therm_windtunnel-fix-module-unload.patch b/queue-5.10/macintosh-therm_windtunnel-fix-module-unload.patch new file mode 100644 index 00000000000..de8764630c5 --- /dev/null +++ b/queue-5.10/macintosh-therm_windtunnel-fix-module-unload.patch @@ -0,0 +1,48 @@ +From 7fb0900cc6445b0d2d3e90393a69442056798379 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jul 2024 23:54:17 -0400 +Subject: macintosh/therm_windtunnel: fix module unload. + +From: Nick Bowler + +[ Upstream commit fd748e177194ebcbbaf98df75152a30e08230cc6 ] + +The of_device_unregister call in therm_windtunnel's module_exit procedure +does not fully reverse the effects of of_platform_device_create in the +module_init prodedure. Once you unload this module, it is impossible +to load it ever again since only the first of_platform_device_create +call on the fan node succeeds. + +This driver predates first git commit, and it turns out back then +of_platform_device_create worked differently than it does today. +So this is actually an old regression. + +The appropriate function to undo of_platform_device_create now appears +to be of_platform_device_destroy, and switching to use this makes it +possible to unload and load the module as expected. + +Signed-off-by: Nick Bowler +Fixes: c6e126de43e7 ("of: Keep track of populated platform devices") +Signed-off-by: Michael Ellerman +Link: https://msgid.link/20240711035428.16696-1-nbowler@draconx.ca +Signed-off-by: Sasha Levin +--- + drivers/macintosh/therm_windtunnel.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/macintosh/therm_windtunnel.c b/drivers/macintosh/therm_windtunnel.c +index f55f6adf5e5ff..49805eb4d145a 100644 +--- a/drivers/macintosh/therm_windtunnel.c ++++ b/drivers/macintosh/therm_windtunnel.c +@@ -549,7 +549,7 @@ g4fan_exit( void ) + platform_driver_unregister( &therm_of_driver ); + + if( x.of_dev ) +- of_device_unregister( x.of_dev ); ++ of_platform_device_destroy(&x.of_dev->dev, NULL); + } + + module_init(g4fan_init); +-- +2.43.0 + diff --git a/queue-5.10/media-dvb-usb-fix-unexpected-infinite-loop-in-dvb_us.patch b/queue-5.10/media-dvb-usb-fix-unexpected-infinite-loop-in-dvb_us.patch new file mode 100644 index 00000000000..0a702b70d3f --- /dev/null +++ b/queue-5.10/media-dvb-usb-fix-unexpected-infinite-loop-in-dvb_us.patch @@ -0,0 +1,144 @@ +From 9e19753345dc6d804bd0480da5c5e4734243af49 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 May 2024 20:44:14 +0800 +Subject: media: dvb-usb: Fix unexpected infinite loop in + dvb_usb_read_remote_control() + +From: Zheng Yejian + +[ Upstream commit 2052138b7da52ad5ccaf74f736d00f39a1c9198c ] + +Infinite log printing occurs during fuzz test: + + rc rc1: DViCO FusionHDTV DVB-T USB (LGZ201) as ... + ... + dvb-usb: schedule remote query interval to 100 msecs. + dvb-usb: DViCO FusionHDTV DVB-T USB (LGZ201) successfully initialized ... + dvb-usb: bulk message failed: -22 (1/0) + dvb-usb: bulk message failed: -22 (1/0) + dvb-usb: bulk message failed: -22 (1/0) + ... + dvb-usb: bulk message failed: -22 (1/0) + +Looking into the codes, there is a loop in dvb_usb_read_remote_control(), +that is in rc_core_dvb_usb_remote_init() create a work that will call +dvb_usb_read_remote_control(), and this work will reschedule itself at +'rc_interval' intervals to recursively call dvb_usb_read_remote_control(), +see following code snippet: + + rc_core_dvb_usb_remote_init() { + ... + INIT_DELAYED_WORK(&d->rc_query_work, dvb_usb_read_remote_control); + schedule_delayed_work(&d->rc_query_work, + msecs_to_jiffies(rc_interval)); + ... + } + + dvb_usb_read_remote_control() { + ... + err = d->props.rc.core.rc_query(d); + if (err) + err(...) // Did not return even if query failed + schedule_delayed_work(&d->rc_query_work, + msecs_to_jiffies(rc_interval)); + } + +When the infinite log printing occurs, the query callback +'d->props.rc.core.rc_query' is cxusb_rc_query(). And the log is due to +the failure of finding a valid 'generic_bulk_ctrl_endpoint' +in usb_bulk_msg(), see following code snippet: + + cxusb_rc_query() { + cxusb_ctrl_msg() { + dvb_usb_generic_rw() { + ret = usb_bulk_msg(d->udev, usb_sndbulkpipe(d->udev, + d->props.generic_bulk_ctrl_endpoint),...); + if (ret) + err("bulk message failed: %d (%d/%d)",ret,wlen,actlen); + ... + } + ... + } + +By analyzing the corresponding USB descriptor, it shows that the +bNumEndpoints is 0 in its interface descriptor, but +the 'generic_bulk_ctrl_endpoint' is 1, that means user don't configure +a valid endpoint for 'generic_bulk_ctrl_endpoint', therefore this +'invalid' USB device should be rejected before it calls into +dvb_usb_read_remote_control(). + +To fix it, we need to add endpoint check for 'generic_bulk_ctrl_endpoint'. +And as Sean suggested, the same check and clear halts should be done for +'generic_bulk_ctrl_endpoint_response'. So introduce +dvb_usb_check_bulk_endpoint() to do it for both of them. + +Fixes: 4d43e13f723e ("V4L/DVB (4643): Multi-input patch for DVB-USB device") +Signed-off-by: Zheng Yejian +Signed-off-by: Sean Young +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/usb/dvb-usb/dvb-usb-init.c | 35 +++++++++++++++++++++--- + 1 file changed, 31 insertions(+), 4 deletions(-) + +diff --git a/drivers/media/usb/dvb-usb/dvb-usb-init.c b/drivers/media/usb/dvb-usb/dvb-usb-init.c +index 58eea8ab54779..6cf6d08cc4ec9 100644 +--- a/drivers/media/usb/dvb-usb/dvb-usb-init.c ++++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c +@@ -23,11 +23,40 @@ static int dvb_usb_force_pid_filter_usage; + module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage, int, 0444); + MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a PID filter, if any (default: 0)."); + ++static int dvb_usb_check_bulk_endpoint(struct dvb_usb_device *d, u8 endpoint) ++{ ++ if (endpoint) { ++ int ret; ++ ++ ret = usb_pipe_type_check(d->udev, usb_sndbulkpipe(d->udev, endpoint)); ++ if (ret) ++ return ret; ++ ret = usb_pipe_type_check(d->udev, usb_rcvbulkpipe(d->udev, endpoint)); ++ if (ret) ++ return ret; ++ } ++ return 0; ++} ++ ++static void dvb_usb_clear_halt(struct dvb_usb_device *d, u8 endpoint) ++{ ++ if (endpoint) { ++ usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, endpoint)); ++ usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, endpoint)); ++ } ++} ++ + static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs) + { + struct dvb_usb_adapter *adap; + int ret, n, o; + ++ ret = dvb_usb_check_bulk_endpoint(d, d->props.generic_bulk_ctrl_endpoint); ++ if (ret) ++ return ret; ++ ret = dvb_usb_check_bulk_endpoint(d, d->props.generic_bulk_ctrl_endpoint_response); ++ if (ret) ++ return ret; + for (n = 0; n < d->props.num_adapters; n++) { + adap = &d->adapter[n]; + adap->dev = d; +@@ -103,10 +132,8 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs) + * when reloading the driver w/o replugging the device + * sometimes a timeout occurs, this helps + */ +- if (d->props.generic_bulk_ctrl_endpoint != 0) { +- usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint)); +- usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint)); +- } ++ dvb_usb_clear_halt(d, d->props.generic_bulk_ctrl_endpoint); ++ dvb_usb_clear_halt(d, d->props.generic_bulk_ctrl_endpoint_response); + + return 0; + +-- +2.43.0 + diff --git a/queue-5.10/media-imon-fix-race-getting-ictx-lock.patch b/queue-5.10/media-imon-fix-race-getting-ictx-lock.patch new file mode 100644 index 00000000000..8f54491ab41 --- /dev/null +++ b/queue-5.10/media-imon-fix-race-getting-ictx-lock.patch @@ -0,0 +1,51 @@ +From f4e1c5b71055248d6f9b0653ed4ee31e1a6e4f57 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 May 2024 21:10:27 +0000 +Subject: media: imon: Fix race getting ictx->lock + +From: Ricardo Ribalda + +[ Upstream commit 24147897507cd3a7d63745d1518a638bf4132238 ] + +Lets fix a race between mutex_is_lock() and mutex_lock(). + +<-mutex is not locked +if (!mutex_is_locked(&ictx->lock)) { + unlock = true; <- mutex is locked externaly + mutex_lock(&ictx->lock); +} + +Let's use mutex_trylock() that does mutex_is_lock() and mutex_lock() +atomically. + +Fix the following cocci warning: +drivers/media/rc/imon.c:1167:1-7: preceding lock on line 1153 + +Fixes: 23ef710e1a6c ("[media] imon: add conditional locking in change_protocol") +Signed-off-by: Ricardo Ribalda +Signed-off-by: Sean Young +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/rc/imon.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c +index 253a1d1a840a0..cd4995e74b977 100644 +--- a/drivers/media/rc/imon.c ++++ b/drivers/media/rc/imon.c +@@ -1153,10 +1153,7 @@ static int imon_ir_change_protocol(struct rc_dev *rc, u64 *rc_proto) + + memcpy(ictx->usb_tx_buf, &ir_proto_packet, sizeof(ir_proto_packet)); + +- if (!mutex_is_locked(&ictx->lock)) { +- unlock = true; +- mutex_lock(&ictx->lock); +- } ++ unlock = mutex_trylock(&ictx->lock); + + retval = send_packet(ictx); + if (retval) +-- +2.43.0 + diff --git a/queue-5.10/media-renesas-vsp1-fix-_irqsave-and-_irq-mix.patch b/queue-5.10/media-renesas-vsp1-fix-_irqsave-and-_irq-mix.patch new file mode 100644 index 00000000000..2efe6bc0d7f --- /dev/null +++ b/queue-5.10/media-renesas-vsp1-fix-_irqsave-and-_irq-mix.patch @@ -0,0 +1,117 @@ +From d1b92e50f2fa82c7c452269d564d59f5f2846f01 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 5 May 2024 20:22:27 +0300 +Subject: media: renesas: vsp1: Fix _irqsave and _irq mix + +From: Laurent Pinchart + +[ Upstream commit 57edbbcf5258c378a9b9d0c80d33b03a010b22c8 ] + +The histogram support mixes _irqsave and _irq, causing the following +smatch warning: + + drivers/media/platform/renesas/vsp1/vsp1_histo.c:153 histo_stop_streaming() + warn: mixing irqsave and irq + +The histo_stop_streaming() calls spin_lock_irqsave() followed by +wait_event_lock_irq(). The former hints that interrupts may be disabled +by the caller, while the latter reenables interrupts unconditionally. +This doesn't cause any real bug, as the function is always called with +interrupts enabled, but the pattern is still incorrect. + +Fix the problem by using spin_lock_irq() instead of spin_lock_irqsave() +in histo_stop_streaming(). While at it, switch to spin_lock_irq() and +spin_lock() as appropriate elsewhere. + +Fixes: 99362e32332b ("[media] v4l: vsp1: Add histogram support") +Reported-by: Dan Carpenter +Closes: https://lore.kernel.org/linux-renesas-soc/164d74ff-312c-468f-be64-afa7182cd2f4@moroto.mountain/ +Reviewed-by: Kieran Bingham +Signed-off-by: Laurent Pinchart +Signed-off-by: Sasha Levin +--- + drivers/media/platform/vsp1/vsp1_histo.c | 20 ++++++++------------ + 1 file changed, 8 insertions(+), 12 deletions(-) + +diff --git a/drivers/media/platform/vsp1/vsp1_histo.c b/drivers/media/platform/vsp1/vsp1_histo.c +index a91e142bcb948..37df7d2d4639e 100644 +--- a/drivers/media/platform/vsp1/vsp1_histo.c ++++ b/drivers/media/platform/vsp1/vsp1_histo.c +@@ -36,9 +36,8 @@ struct vsp1_histogram_buffer * + vsp1_histogram_buffer_get(struct vsp1_histogram *histo) + { + struct vsp1_histogram_buffer *buf = NULL; +- unsigned long flags; + +- spin_lock_irqsave(&histo->irqlock, flags); ++ spin_lock(&histo->irqlock); + + if (list_empty(&histo->irqqueue)) + goto done; +@@ -49,7 +48,7 @@ vsp1_histogram_buffer_get(struct vsp1_histogram *histo) + histo->readout = true; + + done: +- spin_unlock_irqrestore(&histo->irqlock, flags); ++ spin_unlock(&histo->irqlock); + return buf; + } + +@@ -58,7 +57,6 @@ void vsp1_histogram_buffer_complete(struct vsp1_histogram *histo, + size_t size) + { + struct vsp1_pipeline *pipe = histo->entity.pipe; +- unsigned long flags; + + /* + * The pipeline pointer is guaranteed to be valid as this function is +@@ -70,10 +68,10 @@ void vsp1_histogram_buffer_complete(struct vsp1_histogram *histo, + vb2_set_plane_payload(&buf->buf.vb2_buf, 0, size); + vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_DONE); + +- spin_lock_irqsave(&histo->irqlock, flags); ++ spin_lock(&histo->irqlock); + histo->readout = false; + wake_up(&histo->wait_queue); +- spin_unlock_irqrestore(&histo->irqlock, flags); ++ spin_unlock(&histo->irqlock); + } + + /* ----------------------------------------------------------------------------- +@@ -124,11 +122,10 @@ static void histo_buffer_queue(struct vb2_buffer *vb) + struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); + struct vsp1_histogram *histo = vb2_get_drv_priv(vb->vb2_queue); + struct vsp1_histogram_buffer *buf = to_vsp1_histogram_buffer(vbuf); +- unsigned long flags; + +- spin_lock_irqsave(&histo->irqlock, flags); ++ spin_lock_irq(&histo->irqlock); + list_add_tail(&buf->queue, &histo->irqqueue); +- spin_unlock_irqrestore(&histo->irqlock, flags); ++ spin_unlock_irq(&histo->irqlock); + } + + static int histo_start_streaming(struct vb2_queue *vq, unsigned int count) +@@ -140,9 +137,8 @@ static void histo_stop_streaming(struct vb2_queue *vq) + { + struct vsp1_histogram *histo = vb2_get_drv_priv(vq); + struct vsp1_histogram_buffer *buffer; +- unsigned long flags; + +- spin_lock_irqsave(&histo->irqlock, flags); ++ spin_lock_irq(&histo->irqlock); + + /* Remove all buffers from the IRQ queue. */ + list_for_each_entry(buffer, &histo->irqqueue, queue) +@@ -152,7 +148,7 @@ static void histo_stop_streaming(struct vb2_queue *vq) + /* Wait for the buffer being read out (if any) to complete. */ + wait_event_lock_irq(histo->wait_queue, !histo->readout, histo->irqlock); + +- spin_unlock_irqrestore(&histo->irqlock, flags); ++ spin_unlock_irq(&histo->irqlock); + } + + static const struct vb2_ops histo_video_queue_qops = { +-- +2.43.0 + diff --git a/queue-5.10/media-renesas-vsp1-store-rpf-partition-configuration.patch b/queue-5.10/media-renesas-vsp1-store-rpf-partition-configuration.patch new file mode 100644 index 00000000000..53336fb6dc2 --- /dev/null +++ b/queue-5.10/media-renesas-vsp1-store-rpf-partition-configuration.patch @@ -0,0 +1,66 @@ +From 49b096b77b1f52e84fed6eff637ac6362a9fd6d0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 19 Nov 2023 03:11:51 +0200 +Subject: media: renesas: vsp1: Store RPF partition configuration per RPF + instance + +From: Laurent Pinchart + +[ Upstream commit a213bc09b1025c771ee722ee341af1d84375db8a ] + +The vsp1_partition structure stores the RPF partition configuration in a +single field for all RPF instances, while each RPF can have its own +configuration. Fix it by storing the configuration separately for each +RPF instance. + +Signed-off-by: Laurent Pinchart +Fixes: ab45e8585182 ("media: v4l: vsp1: Allow entities to participate in the partition algorithm") +Reviewed-by: Jacopo Mondi +Signed-off-by: Sasha Levin +--- + drivers/media/platform/vsp1/vsp1_pipe.h | 2 +- + drivers/media/platform/vsp1/vsp1_rpf.c | 8 +++++--- + 2 files changed, 6 insertions(+), 4 deletions(-) + +diff --git a/drivers/media/platform/vsp1/vsp1_pipe.h b/drivers/media/platform/vsp1/vsp1_pipe.h +index ae646c9ef3373..15daf35bda216 100644 +--- a/drivers/media/platform/vsp1/vsp1_pipe.h ++++ b/drivers/media/platform/vsp1/vsp1_pipe.h +@@ -73,7 +73,7 @@ struct vsp1_partition_window { + * @wpf: The WPF partition window configuration + */ + struct vsp1_partition { +- struct vsp1_partition_window rpf; ++ struct vsp1_partition_window rpf[VSP1_MAX_RPF]; + struct vsp1_partition_window uds_sink; + struct vsp1_partition_window uds_source; + struct vsp1_partition_window sru; +diff --git a/drivers/media/platform/vsp1/vsp1_rpf.c b/drivers/media/platform/vsp1/vsp1_rpf.c +index 75083cb234fe3..996a3058d5b76 100644 +--- a/drivers/media/platform/vsp1/vsp1_rpf.c ++++ b/drivers/media/platform/vsp1/vsp1_rpf.c +@@ -271,8 +271,8 @@ static void rpf_configure_partition(struct vsp1_entity *entity, + * 'width' need to be adjusted. + */ + if (pipe->partitions > 1) { +- crop.width = pipe->partition->rpf.width; +- crop.left += pipe->partition->rpf.left; ++ crop.width = pipe->partition->rpf[rpf->entity.index].width; ++ crop.left += pipe->partition->rpf[rpf->entity.index].left; + } + + if (pipe->interlaced) { +@@ -327,7 +327,9 @@ static void rpf_partition(struct vsp1_entity *entity, + unsigned int partition_idx, + struct vsp1_partition_window *window) + { +- partition->rpf = *window; ++ struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev); ++ ++ partition->rpf[rpf->entity.index] = *window; + } + + static const struct vsp1_entity_operations rpf_entity_ops = { +-- +2.43.0 + diff --git a/queue-5.10/media-uvcvideo-allow-entity-defined-get_info-and-get.patch b/queue-5.10/media-uvcvideo-allow-entity-defined-get_info-and-get.patch new file mode 100644 index 00000000000..57e9cb0de74 --- /dev/null +++ b/queue-5.10/media-uvcvideo-allow-entity-defined-get_info-and-get.patch @@ -0,0 +1,84 @@ +From 9a4268e2cfb1c82e79dc2960547f91490240fb83 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 23 Dec 2020 14:35:21 +0100 +Subject: media: uvcvideo: Allow entity-defined get_info and get_cur + +From: Ricardo Ribalda + +[ Upstream commit 65900c581d014499f0f8ceabfc02c652e9a88771 ] + +Allows controls to get their properties and current value +from an entity-defined function instead of via a query to the USB +device. + +Signed-off-by: Ricardo Ribalda +Signed-off-by: Laurent Pinchart +Signed-off-by: Mauro Carvalho Chehab +Stable-dep-of: 86419686e66d ("media: uvcvideo: Override default flags") +Signed-off-by: Sasha Levin +--- + drivers/media/usb/uvc/uvc_ctrl.c | 22 ++++++++++++++++++---- + drivers/media/usb/uvc/uvcvideo.h | 5 +++++ + 2 files changed, 23 insertions(+), 4 deletions(-) + +diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c +index 5e0acabed37a0..e1a98c95b7854 100644 +--- a/drivers/media/usb/uvc/uvc_ctrl.c ++++ b/drivers/media/usb/uvc/uvc_ctrl.c +@@ -1002,10 +1002,20 @@ static int __uvc_ctrl_get(struct uvc_video_chain *chain, + return -EACCES; + + if (!ctrl->loaded) { +- ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, ctrl->entity->id, +- chain->dev->intfnum, ctrl->info.selector, ++ if (ctrl->entity->get_cur) { ++ ret = ctrl->entity->get_cur(chain->dev, ++ ctrl->entity, ++ ctrl->info.selector, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), + ctrl->info.size); ++ } else { ++ ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, ++ ctrl->entity->id, ++ chain->dev->intfnum, ++ ctrl->info.selector, ++ uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), ++ ctrl->info.size); ++ } + if (ret < 0) + return ret; + +@@ -1718,8 +1728,12 @@ static int uvc_ctrl_get_flags(struct uvc_device *dev, + if (data == NULL) + return -ENOMEM; + +- ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, dev->intfnum, +- info->selector, data, 1); ++ if (ctrl->entity->get_info) ++ ret = ctrl->entity->get_info(dev, ctrl->entity, ++ ctrl->info.selector, data); ++ else ++ ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, ++ dev->intfnum, info->selector, data, 1); + if (!ret) + info->flags |= (data[0] & UVC_CONTROL_CAP_GET ? + UVC_CTRL_FLAG_GET_CUR : 0) +diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h +index c75990c0957e7..c3241cf5f7b43 100644 +--- a/drivers/media/usb/uvc/uvcvideo.h ++++ b/drivers/media/usb/uvc/uvcvideo.h +@@ -354,6 +354,11 @@ struct uvc_entity { + u8 bNrInPins; + u8 *baSourceID; + ++ int (*get_info)(struct uvc_device *dev, struct uvc_entity *entity, ++ u8 cs, u8 *caps); ++ int (*get_cur)(struct uvc_device *dev, struct uvc_entity *entity, ++ u8 cs, void *data, u16 size); ++ + unsigned int ncontrols; + struct uvc_control *controls; + }; +-- +2.43.0 + diff --git a/queue-5.10/media-uvcvideo-override-default-flags.patch b/queue-5.10/media-uvcvideo-override-default-flags.patch new file mode 100644 index 00000000000..6a5a15869a3 --- /dev/null +++ b/queue-5.10/media-uvcvideo-override-default-flags.patch @@ -0,0 +1,68 @@ +From 328913ef496a7e4ef213514a7329cfb9052049f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 2 Jun 2024 14:50:53 +0800 +Subject: media: uvcvideo: Override default flags + +From: Daniel Schaefer + +[ Upstream commit 86419686e66da5b90a07fb8a40ab138fe97189b5 ] + +When the UVC device has a control that is readonly it doesn't set the +SET_CUR flag. For example the privacy control has SET_CUR flag set in +the defaults in the `uvc_ctrls` variable. Even if the device does not +have it set, it's not cleared by uvc_ctrl_get_flags(). + +Originally written with assignment in commit 859086ae3636 ("media: +uvcvideo: Apply flags from device to actual properties"). But changed to +|= in commit 0dc68cabdb62 ("media: uvcvideo: Prevent setting unavailable +flags"). It would not clear the default flags. + +With this patch applied the correct flags are reported to user space. +Tested with: + +``` +> v4l2-ctl --list-ctrls | grep privacy +privacy 0x009a0910 (bool) : default=0 value=0 flags=read-only +``` + +Signed-off-by: Daniel Schaefer +Fixes: 0dc68cabdb62 ("media: uvcvideo: Prevent setting unavailable flags") +Reviewed-by: Ricardo Ribalda +Reviewed-by: Laurent Pinchart +Link: https://lore.kernel.org/r/20240602065053.36850-1-dhs@frame.work +Signed-off-by: Laurent Pinchart +Signed-off-by: Sasha Levin +--- + drivers/media/usb/uvc/uvc_ctrl.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c +index e1a98c95b7854..c89f582bd5320 100644 +--- a/drivers/media/usb/uvc/uvc_ctrl.c ++++ b/drivers/media/usb/uvc/uvc_ctrl.c +@@ -1734,7 +1734,13 @@ static int uvc_ctrl_get_flags(struct uvc_device *dev, + else + ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, + dev->intfnum, info->selector, data, 1); +- if (!ret) ++ ++ if (!ret) { ++ info->flags &= ~(UVC_CTRL_FLAG_GET_CUR | ++ UVC_CTRL_FLAG_SET_CUR | ++ UVC_CTRL_FLAG_AUTO_UPDATE | ++ UVC_CTRL_FLAG_ASYNCHRONOUS); ++ + info->flags |= (data[0] & UVC_CONTROL_CAP_GET ? + UVC_CTRL_FLAG_GET_CUR : 0) + | (data[0] & UVC_CONTROL_CAP_SET ? +@@ -1743,6 +1749,7 @@ static int uvc_ctrl_get_flags(struct uvc_device *dev, + UVC_CTRL_FLAG_AUTO_UPDATE : 0) + | (data[0] & UVC_CONTROL_CAP_ASYNCHRONOUS ? + UVC_CTRL_FLAG_ASYNCHRONOUS : 0); ++ } + + kfree(data); + return ret; +-- +2.43.0 + diff --git a/queue-5.10/media-venus-flush-all-buffers-in-output-plane-stream.patch b/queue-5.10/media-venus-flush-all-buffers-in-output-plane-stream.patch new file mode 100644 index 00000000000..1ec7e691d4b --- /dev/null +++ b/queue-5.10/media-venus-flush-all-buffers-in-output-plane-stream.patch @@ -0,0 +1,43 @@ +From 58283cf57d9a2895bd74c3f2ba2036315dc53a56 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jan 2024 11:42:14 +0530 +Subject: media: venus: flush all buffers in output plane streamoff + +From: Dikshita Agarwal + +[ Upstream commit e750a4b1224142bd8dd057b0d5adf8a5608b7e77 ] + +For scenarios, when source change is followed by VIDIOC_STREAMOFF +on output plane, driver should discard any queued OUTPUT +buffers, which are not decoded or dequeued. +Flush with HFI_FLUSH_INPUT does not have any actual impact. +So, fix it, by invoking HFI_FLUSH_ALL, which will flush all +queued buffers. + +Fixes: 85872f861d4c ("media: venus: Mark last capture buffer") +Signed-off-by: Dikshita Agarwal +Tested-by: Nathan Hebert +Reviewed-by: Bryan O'Donoghue +Signed-off-by: Stanimir Varbanov +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/platform/qcom/venus/vdec.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c +index c437a929a5451..b6edfa812bb7d 100644 +--- a/drivers/media/platform/qcom/venus/vdec.c ++++ b/drivers/media/platform/qcom/venus/vdec.c +@@ -1142,7 +1142,7 @@ static int vdec_stop_output(struct venus_inst *inst) + break; + case VENUS_DEC_STATE_INIT: + case VENUS_DEC_STATE_CAPTURE_SETUP: +- ret = hfi_session_flush(inst, HFI_FLUSH_INPUT, true); ++ ret = hfi_session_flush(inst, HFI_FLUSH_ALL, true); + break; + default: + break; +-- +2.43.0 + diff --git a/queue-5.10/memory-fsl_ifc-make-fsl_ifc-config-visible-and-selec.patch b/queue-5.10/memory-fsl_ifc-make-fsl_ifc-config-visible-and-selec.patch new file mode 100644 index 00000000000..b91eb5612b6 --- /dev/null +++ b/queue-5.10/memory-fsl_ifc-make-fsl_ifc-config-visible-and-selec.patch @@ -0,0 +1,54 @@ +From 51df79923483b56775358272229d9b2f2e824ca2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 30 May 2024 16:46:36 +0200 +Subject: memory: fsl_ifc: Make FSL_IFC config visible and selectable + +From: Esben Haabendal + +[ Upstream commit 9ba0cae3cac07c21c583f9ff194f74043f90d29c ] + +While use of fsl_ifc driver with NAND flash is fine, as the fsl_ifc_nand +driver selects FSL_IFC automatically, we need the CONFIG_FSL_IFC option to +be selectable for platforms using fsl_ifc with NOR flash. + +Fixes: ea0c0ad6b6eb ("memory: Enable compile testing for most of the drivers") +Reviewed-by: Miquel Raynal +Signed-off-by: Esben Haabendal +Link: https://lore.kernel.org/r/20240530-fsl-ifc-config-v3-1-1fd2c3d233dd@geanix.com +Signed-off-by: Krzysztof Kozlowski +Signed-off-by: Sasha Levin +--- + drivers/memory/Kconfig | 2 +- + drivers/mtd/nand/raw/Kconfig | 3 +-- + 2 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/drivers/memory/Kconfig b/drivers/memory/Kconfig +index cc2c83e1accfb..244dc48d1b715 100644 +--- a/drivers/memory/Kconfig ++++ b/drivers/memory/Kconfig +@@ -159,7 +159,7 @@ config FSL_CORENET_CF + represents a coherency violation. + + config FSL_IFC +- bool "Freescale IFC driver" if COMPILE_TEST ++ bool "Freescale IFC driver" + depends on FSL_SOC || ARCH_LAYERSCAPE || SOC_LS1021A || COMPILE_TEST + depends on HAS_IOMEM + +diff --git a/drivers/mtd/nand/raw/Kconfig b/drivers/mtd/nand/raw/Kconfig +index 6c46f25b57e2a..205663298734a 100644 +--- a/drivers/mtd/nand/raw/Kconfig ++++ b/drivers/mtd/nand/raw/Kconfig +@@ -282,8 +282,7 @@ config MTD_NAND_FSL_IFC + tristate "Freescale IFC NAND controller" + depends on FSL_SOC || ARCH_LAYERSCAPE || SOC_LS1021A || COMPILE_TEST + depends on HAS_IOMEM +- select FSL_IFC +- select MEMORY ++ depends on FSL_IFC + help + Various Freescale chips e.g P1010, include a NAND Flash machine + with built-in hardware ECC capabilities. +-- +2.43.0 + diff --git a/queue-5.10/mfd-omap-usb-tll-use-struct_size-to-allocate-tll.patch b/queue-5.10/mfd-omap-usb-tll-use-struct_size-to-allocate-tll.patch new file mode 100644 index 00000000000..57bd566871a --- /dev/null +++ b/queue-5.10/mfd-omap-usb-tll-use-struct_size-to-allocate-tll.patch @@ -0,0 +1,69 @@ +From 789b01478db436dec028efb664e50e867416933f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 26 Jun 2024 21:37:03 +0200 +Subject: mfd: omap-usb-tll: Use struct_size to allocate tll + +From: Javier Carrasco + +[ Upstream commit 40176714c818b0b6a2ca8213cdb7654fbd49b742 ] + +Commit 16c2004d9e4d ("mfd: omap-usb-tll: Allocate driver data at once") +changed the memory allocation of 'tll' to consolidate it into a single +allocation, introducing an incorrect size calculation. + +In particular, the allocation for the array of pointers was converted +into a single-pointer allocation. + +The memory allocation used to occur in two steps: + +tll = devm_kzalloc(dev, sizeof(struct usbtll_omap), GFP_KERNEL); +tll->ch_clk = devm_kzalloc(dev, sizeof(struct clk *) * tll->nch, + GFP_KERNEL); + +And it turned that into the following allocation: + +tll = devm_kzalloc(dev, sizeof(*tll) + sizeof(tll->ch_clk[nch]), + GFP_KERNEL); + +sizeof(tll->ch_clk[nch]) returns the size of a single pointer instead of +the expected nch pointers. + +This bug went unnoticed because the allocation size was small enough to +fit within the minimum size of a memory allocation for this particular +case [1]. + +The complete allocation can still be done at once with the struct_size +macro, which comes in handy for structures with a trailing flexible +array. + +Fix the memory allocation to obtain the original size again. + +Link: https://lore.kernel.org/all/202406261121.2FFD65647@keescook/ [1] +Fixes: 16c2004d9e4d ("mfd: omap-usb-tll: Allocate driver data at once") +Reviewed-by: Kees Cook +Signed-off-by: Javier Carrasco +Fixes: commit 16c2004d9e4d ("mfd: omap-usb-tll: Allocate driver data at once") +Link: https://lore.kernel.org/r/20240626-omap-usb-tll-counted_by-v2-1-4bedf20d1b51@gmail.com +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/mfd/omap-usb-tll.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/mfd/omap-usb-tll.c b/drivers/mfd/omap-usb-tll.c +index 16fad79c73f1f..99ca0dfa127b5 100644 +--- a/drivers/mfd/omap-usb-tll.c ++++ b/drivers/mfd/omap-usb-tll.c +@@ -237,8 +237,7 @@ static int usbtll_omap_probe(struct platform_device *pdev) + break; + } + +- tll = devm_kzalloc(dev, sizeof(*tll) + sizeof(tll->ch_clk[nch]), +- GFP_KERNEL); ++ tll = devm_kzalloc(dev, struct_size(tll, ch_clk, nch), GFP_KERNEL); + if (!tll) { + pm_runtime_put_sync(dev); + pm_runtime_disable(dev); +-- +2.43.0 + diff --git a/queue-5.10/mips-octeron-remove-source-file-executable-bit.patch b/queue-5.10/mips-octeron-remove-source-file-executable-bit.patch new file mode 100644 index 00000000000..349f2c4b695 --- /dev/null +++ b/queue-5.10/mips-octeron-remove-source-file-executable-bit.patch @@ -0,0 +1,27 @@ +From e7858c8222eb88c79ea7a7ac950717a8aad999b4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jul 2024 16:48:30 +0900 +Subject: MIPS: Octeron: remove source file executable bit + +From: Dominique Martinet + +[ Upstream commit 89c7f5078935872cf47a713a645affb5037be694 ] + +This does not matter the least, but there is no other .[ch] file in the +repo that is executable, so clean this up. + +Fixes: 29b83a64df3b ("MIPS: Octeon: Add PCIe link status check") +Signed-off-by: Dominique Martinet +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/pci/pcie-octeon.c | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + mode change 100755 => 100644 arch/mips/pci/pcie-octeon.c + +diff --git a/arch/mips/pci/pcie-octeon.c b/arch/mips/pci/pcie-octeon.c +old mode 100755 +new mode 100644 +-- +2.43.0 + diff --git a/queue-5.10/mlxsw-spectrum_acl-fix-acl-scale-regression-and-firm.patch b/queue-5.10/mlxsw-spectrum_acl-fix-acl-scale-regression-and-firm.patch new file mode 100644 index 00000000000..af875f54cea --- /dev/null +++ b/queue-5.10/mlxsw-spectrum_acl-fix-acl-scale-regression-and-firm.patch @@ -0,0 +1,252 @@ +From 1ef332e5c1b1296aa537854752ff430936597df3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jun 2024 16:49:43 +0200 +Subject: mlxsw: spectrum_acl: Fix ACL scale regression and firmware errors + +From: Ido Schimmel + +[ Upstream commit 75d8d7a63065b18df9555dbaab0b42d4c6f20943 ] + +ACLs that reside in the algorithmic TCAM (A-TCAM) in Spectrum-2 and +newer ASICs can share the same mask if their masks only differ in up to +8 consecutive bits. For example, consider the following filters: + + # tc filter add dev swp1 ingress pref 1 proto ip flower dst_ip 192.0.2.0/24 action drop + # tc filter add dev swp1 ingress pref 1 proto ip flower dst_ip 198.51.100.128/25 action drop + +The second filter can use the same mask as the first (dst_ip/24) with a +delta of 1 bit. + +However, the above only works because the two filters have different +values in the common unmasked part (dst_ip/24). When entries have the +same value in the common unmasked part they create undesired collisions +in the device since many entries now have the same key. This leads to +firmware errors such as [1] and to a reduced scale. + +Fix by adjusting the hash table key to only include the value in the +common unmasked part. That is, without including the delta bits. That +way the driver will detect the collision during filter insertion and +spill the filter into the circuit TCAM (C-TCAM). + +Add a test case that fails without the fix and adjust existing cases +that check C-TCAM spillage according to the above limitation. + +[1] +mlxsw_spectrum2 0000:06:00.0: EMAD reg access failed (tid=3379b18a00003394,reg_id=3027(ptce3),type=write,status=8(resource not available)) + +Fixes: c22291f7cf45 ("mlxsw: spectrum: acl: Implement delta for ERP") +Reported-by: Alexander Zubkov +Signed-off-by: Ido Schimmel +Reviewed-by: Amit Cohen +Tested-by: Alexander Zubkov +Signed-off-by: Petr Machata +Reviewed-by: Simon Horman +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + .../mellanox/mlxsw/spectrum_acl_atcam.c | 18 +++--- + .../mlxsw/spectrum_acl_bloom_filter.c | 2 +- + .../mellanox/mlxsw/spectrum_acl_tcam.h | 9 +-- + .../drivers/net/mlxsw/spectrum-2/tc_flower.sh | 55 +++++++++++++++++-- + 4 files changed, 63 insertions(+), 21 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c +index 4b713832fdd55..f5c0a4214c4e5 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c +@@ -391,7 +391,8 @@ mlxsw_sp_acl_atcam_region_entry_insert(struct mlxsw_sp *mlxsw_sp, + if (err) + return err; + +- lkey_id = aregion->ops->lkey_id_get(aregion, aentry->enc_key, erp_id); ++ lkey_id = aregion->ops->lkey_id_get(aregion, aentry->ht_key.enc_key, ++ erp_id); + if (IS_ERR(lkey_id)) + return PTR_ERR(lkey_id); + aentry->lkey_id = lkey_id; +@@ -399,7 +400,7 @@ mlxsw_sp_acl_atcam_region_entry_insert(struct mlxsw_sp *mlxsw_sp, + kvdl_index = mlxsw_afa_block_first_kvdl_index(rulei->act_block); + mlxsw_reg_ptce3_pack(ptce3_pl, true, MLXSW_REG_PTCE3_OP_WRITE_WRITE, + priority, region->tcam_region_info, +- aentry->enc_key, erp_id, ++ aentry->ht_key.enc_key, erp_id, + aentry->delta_info.start, + aentry->delta_info.mask, + aentry->delta_info.value, +@@ -428,7 +429,7 @@ mlxsw_sp_acl_atcam_region_entry_remove(struct mlxsw_sp *mlxsw_sp, + + mlxsw_reg_ptce3_pack(ptce3_pl, false, MLXSW_REG_PTCE3_OP_WRITE_WRITE, 0, + region->tcam_region_info, +- aentry->enc_key, erp_id, ++ aentry->ht_key.enc_key, erp_id, + aentry->delta_info.start, + aentry->delta_info.mask, + aentry->delta_info.value, +@@ -457,7 +458,7 @@ mlxsw_sp_acl_atcam_region_entry_action_replace(struct mlxsw_sp *mlxsw_sp, + kvdl_index = mlxsw_afa_block_first_kvdl_index(rulei->act_block); + mlxsw_reg_ptce3_pack(ptce3_pl, true, MLXSW_REG_PTCE3_OP_WRITE_UPDATE, + priority, region->tcam_region_info, +- aentry->enc_key, erp_id, ++ aentry->ht_key.enc_key, erp_id, + aentry->delta_info.start, + aentry->delta_info.mask, + aentry->delta_info.value, +@@ -480,15 +481,13 @@ __mlxsw_sp_acl_atcam_entry_add(struct mlxsw_sp *mlxsw_sp, + int err; + + mlxsw_afk_encode(afk, region->key_info, &rulei->values, +- aentry->ht_key.full_enc_key, mask); ++ aentry->ht_key.enc_key, mask); + + erp_mask = mlxsw_sp_acl_erp_mask_get(aregion, mask, false); + if (IS_ERR(erp_mask)) + return PTR_ERR(erp_mask); + aentry->erp_mask = erp_mask; + aentry->ht_key.erp_id = mlxsw_sp_acl_erp_mask_erp_id(erp_mask); +- memcpy(aentry->enc_key, aentry->ht_key.full_enc_key, +- sizeof(aentry->enc_key)); + + /* Compute all needed delta information and clear the delta bits + * from the encrypted key. +@@ -497,9 +496,8 @@ __mlxsw_sp_acl_atcam_entry_add(struct mlxsw_sp *mlxsw_sp, + aentry->delta_info.start = mlxsw_sp_acl_erp_delta_start(delta); + aentry->delta_info.mask = mlxsw_sp_acl_erp_delta_mask(delta); + aentry->delta_info.value = +- mlxsw_sp_acl_erp_delta_value(delta, +- aentry->ht_key.full_enc_key); +- mlxsw_sp_acl_erp_delta_clear(delta, aentry->enc_key); ++ mlxsw_sp_acl_erp_delta_value(delta, aentry->ht_key.enc_key); ++ mlxsw_sp_acl_erp_delta_clear(delta, aentry->ht_key.enc_key); + + /* Add rule to the list of A-TCAM rules, assuming this + * rule is intended to A-TCAM. In case this rule does +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c +index 2d2e29c202770..3ab87db83b7fc 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c +@@ -136,7 +136,7 @@ __mlxsw_sp_acl_bf_key_encode(struct mlxsw_sp_acl_atcam_region *aregion, + memcpy(chunk + pad_bytes, &erp_region_id, + sizeof(erp_region_id)); + memcpy(chunk + key_offset, +- &aentry->enc_key[chunk_key_offsets[chunk_index]], ++ &aentry->ht_key.enc_key[chunk_key_offsets[chunk_index]], + chunk_key_len); + chunk += chunk_len; + } +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h +index a41df10ade9bf..f28c47ae54880 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h +@@ -171,9 +171,9 @@ struct mlxsw_sp_acl_atcam_region { + }; + + struct mlxsw_sp_acl_atcam_entry_ht_key { +- char full_enc_key[MLXSW_REG_PTCEX_FLEX_KEY_BLOCKS_LEN]; /* Encoded +- * key. +- */ ++ char enc_key[MLXSW_REG_PTCEX_FLEX_KEY_BLOCKS_LEN]; /* Encoded key, minus ++ * delta bits. ++ */ + u8 erp_id; + }; + +@@ -185,9 +185,6 @@ struct mlxsw_sp_acl_atcam_entry { + struct rhash_head ht_node; + struct list_head list; /* Member in entries_list */ + struct mlxsw_sp_acl_atcam_entry_ht_key ht_key; +- char enc_key[MLXSW_REG_PTCEX_FLEX_KEY_BLOCKS_LEN]; /* Encoded key, +- * minus delta bits. +- */ + struct { + u16 start; + u8 mask; +diff --git a/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh b/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh +index 616d3581419ca..21d0f419cc6d7 100755 +--- a/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh ++++ b/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh +@@ -11,7 +11,7 @@ ALL_TESTS="single_mask_test identical_filters_test two_masks_test \ + multiple_masks_test ctcam_edge_cases_test delta_simple_test \ + delta_two_masks_one_key_test delta_simple_rehash_test \ + bloom_simple_test bloom_complex_test bloom_delta_test \ +- max_erp_entries_test max_group_size_test" ++ max_erp_entries_test max_group_size_test collision_test" + NUM_NETIFS=2 + source $lib_dir/lib.sh + source $lib_dir/tc_common.sh +@@ -457,7 +457,7 @@ delta_two_masks_one_key_test() + { + # If 2 keys are the same and only differ in mask in a way that + # they belong under the same ERP (second is delta of the first), +- # there should be no C-TCAM spill. ++ # there should be C-TCAM spill. + + RET=0 + +@@ -474,8 +474,8 @@ delta_two_masks_one_key_test() + tp_record "mlxsw:*" "tc filter add dev $h2 ingress protocol ip \ + pref 2 handle 102 flower $tcflags dst_ip 192.0.2.2 \ + action drop" +- tp_check_hits "mlxsw:mlxsw_sp_acl_atcam_entry_add_ctcam_spill" 0 +- check_err $? "incorrect C-TCAM spill while inserting the second rule" ++ tp_check_hits "mlxsw:mlxsw_sp_acl_atcam_entry_add_ctcam_spill" 1 ++ check_err $? "C-TCAM spill did not happen while inserting the second rule" + + $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \ + -t ip -q +@@ -1087,6 +1087,53 @@ max_group_size_test() + log_test "max ACL group size test ($tcflags). max size $max_size" + } + ++collision_test() ++{ ++ # Filters cannot share an eRP if in the common unmasked part (i.e., ++ # without the delta bits) they have the same values. If the driver does ++ # not prevent such configuration (by spilling into the C-TCAM), then ++ # multiple entries will be present in the device with the same key, ++ # leading to collisions and a reduced scale. ++ # ++ # Create such a scenario and make sure all the filters are successfully ++ # added. ++ ++ RET=0 ++ ++ local ret ++ ++ if [[ "$tcflags" != "skip_sw" ]]; then ++ return 0; ++ fi ++ ++ # Add a single dst_ip/24 filter and multiple dst_ip/32 filters that all ++ # have the same values in the common unmasked part (dst_ip/24). ++ ++ tc filter add dev $h2 ingress pref 1 proto ipv4 handle 101 \ ++ flower $tcflags dst_ip 198.51.100.0/24 \ ++ action drop ++ ++ for i in {0..255}; do ++ tc filter add dev $h2 ingress pref 2 proto ipv4 \ ++ handle $((102 + i)) \ ++ flower $tcflags dst_ip 198.51.100.${i}/32 \ ++ action drop ++ ret=$? ++ [[ $ret -ne 0 ]] && break ++ done ++ ++ check_err $ret "failed to add all the filters" ++ ++ for i in {255..0}; do ++ tc filter del dev $h2 ingress pref 2 proto ipv4 \ ++ handle $((102 + i)) flower ++ done ++ ++ tc filter del dev $h2 ingress pref 1 proto ipv4 handle 101 flower ++ ++ log_test "collision test ($tcflags)" ++} ++ + setup_prepare() + { + h1=${NETIFS[p1]} +-- +2.43.0 + diff --git a/queue-5.10/mlxsw-spectrum_acl_bloom_filter-make-mlxsw_sp_acl_bf.patch b/queue-5.10/mlxsw-spectrum_acl_bloom_filter-make-mlxsw_sp_acl_bf.patch new file mode 100644 index 00000000000..012ae08853a --- /dev/null +++ b/queue-5.10/mlxsw-spectrum_acl_bloom_filter-make-mlxsw_sp_acl_bf.patch @@ -0,0 +1,90 @@ +From f53e2fd00b52975ae5e0b787e73c93fe856da3f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jan 2022 18:06:48 +0200 +Subject: mlxsw: spectrum_acl_bloom_filter: Make mlxsw_sp_acl_bf_key_encode() + more flexible + +From: Amit Cohen + +[ Upstream commit 5d5c3ba9e4121b7738d10be3825f4d9a5a1d80ef ] + +Spectrum-4 will calculate hash function for bloom filter differently from +the existing ASICs. + +One of the changes is related to the way that the chunks will be build - +without padding. + +As preparation for support of Spectrum-4 bloom filter, make +mlxsw_sp_acl_bf_key_encode() more flexible, so it will be able to use it +for Spectrum-4 as well. + +Signed-off-by: Amit Cohen +Reviewed-by: Petr Machata +Signed-off-by: Ido Schimmel +Signed-off-by: Jakub Kicinski +Stable-dep-of: 75d8d7a63065 ("mlxsw: spectrum_acl: Fix ACL scale regression and firmware errors") +Signed-off-by: Sasha Levin +--- + .../mlxsw/spectrum_acl_bloom_filter.c | 36 +++++++++++++------ + 1 file changed, 25 insertions(+), 11 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c +index 2e8b17e3b9358..2d2e29c202770 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c +@@ -116,9 +116,10 @@ static u16 mlxsw_sp_acl_bf_crc(const u8 *buffer, size_t len) + } + + static void +-mlxsw_sp_acl_bf_key_encode(struct mlxsw_sp_acl_atcam_region *aregion, +- struct mlxsw_sp_acl_atcam_entry *aentry, +- char *output, u8 *len) ++__mlxsw_sp_acl_bf_key_encode(struct mlxsw_sp_acl_atcam_region *aregion, ++ struct mlxsw_sp_acl_atcam_entry *aentry, ++ char *output, u8 *len, u8 max_chunks, u8 pad_bytes, ++ u8 key_offset, u8 chunk_key_len, u8 chunk_len) + { + struct mlxsw_afk_key_info *key_info = aregion->region->key_info; + u8 chunk_index, chunk_count, block_count; +@@ -129,17 +130,30 @@ mlxsw_sp_acl_bf_key_encode(struct mlxsw_sp_acl_atcam_region *aregion, + chunk_count = 1 + ((block_count - 1) >> 2); + erp_region_id = cpu_to_be16(aentry->ht_key.erp_id | + (aregion->region->id << 4)); +- for (chunk_index = MLXSW_BLOOM_KEY_CHUNKS - chunk_count; +- chunk_index < MLXSW_BLOOM_KEY_CHUNKS; chunk_index++) { +- memset(chunk, 0, MLXSW_BLOOM_CHUNK_PAD_BYTES); +- memcpy(chunk + MLXSW_BLOOM_CHUNK_PAD_BYTES, &erp_region_id, ++ for (chunk_index = max_chunks - chunk_count; chunk_index < max_chunks; ++ chunk_index++) { ++ memset(chunk, 0, pad_bytes); ++ memcpy(chunk + pad_bytes, &erp_region_id, + sizeof(erp_region_id)); +- memcpy(chunk + MLXSW_BLOOM_CHUNK_KEY_OFFSET, ++ memcpy(chunk + key_offset, + &aentry->enc_key[chunk_key_offsets[chunk_index]], +- MLXSW_BLOOM_CHUNK_KEY_BYTES); +- chunk += MLXSW_BLOOM_KEY_CHUNK_BYTES; ++ chunk_key_len); ++ chunk += chunk_len; + } +- *len = chunk_count * MLXSW_BLOOM_KEY_CHUNK_BYTES; ++ *len = chunk_count * chunk_len; ++} ++ ++static void ++mlxsw_sp_acl_bf_key_encode(struct mlxsw_sp_acl_atcam_region *aregion, ++ struct mlxsw_sp_acl_atcam_entry *aentry, ++ char *output, u8 *len) ++{ ++ __mlxsw_sp_acl_bf_key_encode(aregion, aentry, output, len, ++ MLXSW_BLOOM_KEY_CHUNKS, ++ MLXSW_BLOOM_CHUNK_PAD_BYTES, ++ MLXSW_BLOOM_CHUNK_KEY_OFFSET, ++ MLXSW_BLOOM_CHUNK_KEY_BYTES, ++ MLXSW_BLOOM_KEY_CHUNK_BYTES); + } + + static unsigned int +-- +2.43.0 + diff --git a/queue-5.10/mlxsw-spectrum_acl_erp-fix-object-nesting-warning.patch b/queue-5.10/mlxsw-spectrum_acl_erp-fix-object-nesting-warning.patch new file mode 100644 index 00000000000..b921b5eb015 --- /dev/null +++ b/queue-5.10/mlxsw-spectrum_acl_erp-fix-object-nesting-warning.patch @@ -0,0 +1,184 @@ +From e1dfde7e1ac0321d99a00931282e5785b1391f3e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jun 2024 16:49:42 +0200 +Subject: mlxsw: spectrum_acl_erp: Fix object nesting warning + +From: Ido Schimmel + +[ Upstream commit 97d833ceb27dc19f8777d63f90be4a27b5daeedf ] + +ACLs in Spectrum-2 and newer ASICs can reside in the algorithmic TCAM +(A-TCAM) or in the ordinary circuit TCAM (C-TCAM). The former can +contain more ACLs (i.e., tc filters), but the number of masks in each +region (i.e., tc chain) is limited. + +In order to mitigate the effects of the above limitation, the device +allows filters to share a single mask if their masks only differ in up +to 8 consecutive bits. For example, dst_ip/25 can be represented using +dst_ip/24 with a delta of 1 bit. The C-TCAM does not have a limit on the +number of masks being used (and therefore does not support mask +aggregation), but can contain a limited number of filters. + +The driver uses the "objagg" library to perform the mask aggregation by +passing it objects that consist of the filter's mask and whether the +filter is to be inserted into the A-TCAM or the C-TCAM since filters in +different TCAMs cannot share a mask. + +The set of created objects is dependent on the insertion order of the +filters and is not necessarily optimal. Therefore, the driver will +periodically ask the library to compute a more optimal set ("hints") by +looking at all the existing objects. + +When the library asks the driver whether two objects can be aggregated +the driver only compares the provided masks and ignores the A-TCAM / +C-TCAM indication. This is the right thing to do since the goal is to +move as many filters as possible to the A-TCAM. The driver also forbids +two identical masks from being aggregated since this can only happen if +one was intentionally put in the C-TCAM to avoid a conflict in the +A-TCAM. + +The above can result in the following set of hints: + +H1: {mask X, A-TCAM} -> H2: {mask Y, A-TCAM} // X is Y + delta +H3: {mask Y, C-TCAM} -> H4: {mask Z, A-TCAM} // Y is Z + delta + +After getting the hints from the library the driver will start migrating +filters from one region to another while consulting the computed hints +and instructing the device to perform a lookup in both regions during +the transition. + +Assuming a filter with mask X is being migrated into the A-TCAM in the +new region, the hints lookup will return H1. Since H2 is the parent of +H1, the library will try to find the object associated with it and +create it if necessary in which case another hints lookup (recursive) +will be performed. This hints lookup for {mask Y, A-TCAM} will either +return H2 or H3 since the driver passes the library an object comparison +function that ignores the A-TCAM / C-TCAM indication. + +This can eventually lead to nested objects which are not supported by +the library [1]. + +Fix by removing the object comparison function from both the driver and +the library as the driver was the only user. That way the lookup will +only return exact matches. + +I do not have a reliable reproducer that can reproduce the issue in a +timely manner, but before the fix the issue would reproduce in several +minutes and with the fix it does not reproduce in over an hour. + +Note that the current usefulness of the hints is limited because they +include the C-TCAM indication and represent aggregation that cannot +actually happen. This will be addressed in net-next. + +[1] +WARNING: CPU: 0 PID: 153 at lib/objagg.c:170 objagg_obj_parent_assign+0xb5/0xd0 +Modules linked in: +CPU: 0 PID: 153 Comm: kworker/0:18 Not tainted 6.9.0-rc6-custom-g70fbc2c1c38b #42 +Hardware name: Mellanox Technologies Ltd. MSN3700C/VMOD0008, BIOS 5.11 10/10/2018 +Workqueue: mlxsw_core mlxsw_sp_acl_tcam_vregion_rehash_work +RIP: 0010:objagg_obj_parent_assign+0xb5/0xd0 +[...] +Call Trace: + + __objagg_obj_get+0x2bb/0x580 + objagg_obj_get+0xe/0x80 + mlxsw_sp_acl_erp_mask_get+0xb5/0xf0 + mlxsw_sp_acl_atcam_entry_add+0xe8/0x3c0 + mlxsw_sp_acl_tcam_entry_create+0x5e/0xa0 + mlxsw_sp_acl_tcam_vchunk_migrate_one+0x16b/0x270 + mlxsw_sp_acl_tcam_vregion_rehash_work+0xbe/0x510 + process_one_work+0x151/0x370 + +Fixes: 9069a3817d82 ("lib: objagg: implement optimization hints assembly and use hints for object creation") +Signed-off-by: Ido Schimmel +Reviewed-by: Amit Cohen +Tested-by: Alexander Zubkov +Signed-off-by: Petr Machata +Reviewed-by: Simon Horman +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + .../ethernet/mellanox/mlxsw/spectrum_acl_erp.c | 13 ------------- + include/linux/objagg.h | 1 - + lib/objagg.c | 15 --------------- + 3 files changed, 29 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c +index d231f4d2888be..9eee229303cce 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c +@@ -1217,18 +1217,6 @@ static bool mlxsw_sp_acl_erp_delta_check(void *priv, const void *parent_obj, + return err ? false : true; + } + +-static int mlxsw_sp_acl_erp_hints_obj_cmp(const void *obj1, const void *obj2) +-{ +- const struct mlxsw_sp_acl_erp_key *key1 = obj1; +- const struct mlxsw_sp_acl_erp_key *key2 = obj2; +- +- /* For hints purposes, two objects are considered equal +- * in case the masks are the same. Does not matter what +- * the "ctcam" value is. +- */ +- return memcmp(key1->mask, key2->mask, sizeof(key1->mask)); +-} +- + static void *mlxsw_sp_acl_erp_delta_create(void *priv, void *parent_obj, + void *obj) + { +@@ -1308,7 +1296,6 @@ static void mlxsw_sp_acl_erp_root_destroy(void *priv, void *root_priv) + static const struct objagg_ops mlxsw_sp_acl_erp_objagg_ops = { + .obj_size = sizeof(struct mlxsw_sp_acl_erp_key), + .delta_check = mlxsw_sp_acl_erp_delta_check, +- .hints_obj_cmp = mlxsw_sp_acl_erp_hints_obj_cmp, + .delta_create = mlxsw_sp_acl_erp_delta_create, + .delta_destroy = mlxsw_sp_acl_erp_delta_destroy, + .root_create = mlxsw_sp_acl_erp_root_create, +diff --git a/include/linux/objagg.h b/include/linux/objagg.h +index 78021777df462..6df5b887dc547 100644 +--- a/include/linux/objagg.h ++++ b/include/linux/objagg.h +@@ -8,7 +8,6 @@ struct objagg_ops { + size_t obj_size; + bool (*delta_check)(void *priv, const void *parent_obj, + const void *obj); +- int (*hints_obj_cmp)(const void *obj1, const void *obj2); + void * (*delta_create)(void *priv, void *parent_obj, void *obj); + void (*delta_destroy)(void *priv, void *delta_priv); + void * (*root_create)(void *priv, void *obj, unsigned int root_id); +diff --git a/lib/objagg.c b/lib/objagg.c +index 73d7116025736..57bde522f2493 100644 +--- a/lib/objagg.c ++++ b/lib/objagg.c +@@ -909,20 +909,6 @@ static const struct objagg_opt_algo *objagg_opt_algos[] = { + [OBJAGG_OPT_ALGO_SIMPLE_GREEDY] = &objagg_opt_simple_greedy, + }; + +-static int objagg_hints_obj_cmp(struct rhashtable_compare_arg *arg, +- const void *obj) +-{ +- struct rhashtable *ht = arg->ht; +- struct objagg_hints *objagg_hints = +- container_of(ht, struct objagg_hints, node_ht); +- const struct objagg_ops *ops = objagg_hints->ops; +- const char *ptr = obj; +- +- ptr += ht->p.key_offset; +- return ops->hints_obj_cmp ? ops->hints_obj_cmp(ptr, arg->key) : +- memcmp(ptr, arg->key, ht->p.key_len); +-} +- + /** + * objagg_hints_get - obtains hints instance + * @objagg: objagg instance +@@ -961,7 +947,6 @@ struct objagg_hints *objagg_hints_get(struct objagg *objagg, + offsetof(struct objagg_hints_node, obj); + objagg_hints->ht_params.head_offset = + offsetof(struct objagg_hints_node, ht_node); +- objagg_hints->ht_params.obj_cmpfn = objagg_hints_obj_cmp; + + err = rhashtable_init(&objagg_hints->node_ht, &objagg_hints->ht_params); + if (err) +-- +2.43.0 + diff --git a/queue-5.10/mtd-make-mtd_test.c-a-separate-module.patch b/queue-5.10/mtd-make-mtd_test.c-a-separate-module.patch new file mode 100644 index 00000000000..8b56f6ec8d5 --- /dev/null +++ b/queue-5.10/mtd-make-mtd_test.c-a-separate-module.patch @@ -0,0 +1,114 @@ +From b45c8ddf5789cfe72887b5d8950513a3ae5ba1c2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 29 May 2024 11:50:39 +0200 +Subject: mtd: make mtd_test.c a separate module + +From: Arnd Bergmann + +[ Upstream commit a5cf054d325e6f362e82fe6d124a1871a4af8174 ] + +This file gets linked into nine different modules, which causes a warning: + +scripts/Makefile.build:236: drivers/mtd/tests/Makefile: mtd_test.o is added to multiple modules: mtd_nandbiterrs mtd_oobtest mtd_pagetest mtd_readtest mtd_speedtest mtd_stresstest mtd_subpagetest mtd_torturetest + +Make it a separate module instead. + +Fixes: a995c792280d ("mtd: tests: rename sources in order to link a helper object") +Signed-off-by: Arnd Bergmann +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20240529095049.1915393-1-arnd@kernel.org +Signed-off-by: Sasha Levin +--- + drivers/mtd/tests/Makefile | 34 +++++++++++++++++----------------- + drivers/mtd/tests/mtd_test.c | 9 +++++++++ + 2 files changed, 26 insertions(+), 17 deletions(-) + +diff --git a/drivers/mtd/tests/Makefile b/drivers/mtd/tests/Makefile +index 5de0378f90dbd..7dae831ee8b6b 100644 +--- a/drivers/mtd/tests/Makefile ++++ b/drivers/mtd/tests/Makefile +@@ -1,19 +1,19 @@ + # SPDX-License-Identifier: GPL-2.0 +-obj-$(CONFIG_MTD_TESTS) += mtd_oobtest.o +-obj-$(CONFIG_MTD_TESTS) += mtd_pagetest.o +-obj-$(CONFIG_MTD_TESTS) += mtd_readtest.o +-obj-$(CONFIG_MTD_TESTS) += mtd_speedtest.o +-obj-$(CONFIG_MTD_TESTS) += mtd_stresstest.o +-obj-$(CONFIG_MTD_TESTS) += mtd_subpagetest.o +-obj-$(CONFIG_MTD_TESTS) += mtd_torturetest.o +-obj-$(CONFIG_MTD_TESTS) += mtd_nandecctest.o +-obj-$(CONFIG_MTD_TESTS) += mtd_nandbiterrs.o ++obj-$(CONFIG_MTD_TESTS) += mtd_oobtest.o mtd_test.o ++obj-$(CONFIG_MTD_TESTS) += mtd_pagetest.o mtd_test.o ++obj-$(CONFIG_MTD_TESTS) += mtd_readtest.o mtd_test.o ++obj-$(CONFIG_MTD_TESTS) += mtd_speedtest.o mtd_test.o ++obj-$(CONFIG_MTD_TESTS) += mtd_stresstest.o mtd_test.o ++obj-$(CONFIG_MTD_TESTS) += mtd_subpagetest.o mtd_test.o ++obj-$(CONFIG_MTD_TESTS) += mtd_torturetest.o mtd_test.o ++obj-$(CONFIG_MTD_TESTS) += mtd_nandecctest.o mtd_test.o ++obj-$(CONFIG_MTD_TESTS) += mtd_nandbiterrs.o mtd_test.o + +-mtd_oobtest-objs := oobtest.o mtd_test.o +-mtd_pagetest-objs := pagetest.o mtd_test.o +-mtd_readtest-objs := readtest.o mtd_test.o +-mtd_speedtest-objs := speedtest.o mtd_test.o +-mtd_stresstest-objs := stresstest.o mtd_test.o +-mtd_subpagetest-objs := subpagetest.o mtd_test.o +-mtd_torturetest-objs := torturetest.o mtd_test.o +-mtd_nandbiterrs-objs := nandbiterrs.o mtd_test.o ++mtd_oobtest-objs := oobtest.o ++mtd_pagetest-objs := pagetest.o ++mtd_readtest-objs := readtest.o ++mtd_speedtest-objs := speedtest.o ++mtd_stresstest-objs := stresstest.o ++mtd_subpagetest-objs := subpagetest.o ++mtd_torturetest-objs := torturetest.o ++mtd_nandbiterrs-objs := nandbiterrs.o +diff --git a/drivers/mtd/tests/mtd_test.c b/drivers/mtd/tests/mtd_test.c +index c84250beffdc9..f391e0300cdc9 100644 +--- a/drivers/mtd/tests/mtd_test.c ++++ b/drivers/mtd/tests/mtd_test.c +@@ -25,6 +25,7 @@ int mtdtest_erase_eraseblock(struct mtd_info *mtd, unsigned int ebnum) + + return 0; + } ++EXPORT_SYMBOL_GPL(mtdtest_erase_eraseblock); + + static int is_block_bad(struct mtd_info *mtd, unsigned int ebnum) + { +@@ -57,6 +58,7 @@ int mtdtest_scan_for_bad_eraseblocks(struct mtd_info *mtd, unsigned char *bbt, + + return 0; + } ++EXPORT_SYMBOL_GPL(mtdtest_scan_for_bad_eraseblocks); + + int mtdtest_erase_good_eraseblocks(struct mtd_info *mtd, unsigned char *bbt, + unsigned int eb, int ebcnt) +@@ -75,6 +77,7 @@ int mtdtest_erase_good_eraseblocks(struct mtd_info *mtd, unsigned char *bbt, + + return 0; + } ++EXPORT_SYMBOL_GPL(mtdtest_erase_good_eraseblocks); + + int mtdtest_read(struct mtd_info *mtd, loff_t addr, size_t size, void *buf) + { +@@ -92,6 +95,7 @@ int mtdtest_read(struct mtd_info *mtd, loff_t addr, size_t size, void *buf) + + return err; + } ++EXPORT_SYMBOL_GPL(mtdtest_read); + + int mtdtest_write(struct mtd_info *mtd, loff_t addr, size_t size, + const void *buf) +@@ -107,3 +111,8 @@ int mtdtest_write(struct mtd_info *mtd, loff_t addr, size_t size, + + return err; + } ++EXPORT_SYMBOL_GPL(mtdtest_write); ++ ++MODULE_LICENSE("GPL"); ++MODULE_DESCRIPTION("MTD function test helpers"); ++MODULE_AUTHOR("Akinobu Mita"); +-- +2.43.0 + diff --git a/queue-5.10/net-dsa-b53-limit-chip-wide-jumbo-frame-config-to-cp.patch b/queue-5.10/net-dsa-b53-limit-chip-wide-jumbo-frame-config-to-cp.patch new file mode 100644 index 00000000000..74d308452ef --- /dev/null +++ b/queue-5.10/net-dsa-b53-limit-chip-wide-jumbo-frame-config-to-cp.patch @@ -0,0 +1,49 @@ +From 03e94126f4aa4a937a4186317de966853c2db46b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Jul 2024 11:08:20 +0200 +Subject: net: dsa: b53: Limit chip-wide jumbo frame config to CPU ports + +From: Martin Willi + +[ Upstream commit c5118072e228e7e4385fc5ac46b2e31cf6c4f2d3 ] + +Broadcom switches supported by the b53 driver use a chip-wide jumbo frame +configuration. In the commit referenced with the Fixes tag, the setting +is applied just for the last port changing its MTU. + +While configuring CPU ports accounts for tagger overhead, user ports do +not. When setting the MTU for a user port, the chip-wide setting is +reduced to not include the tagger overhead, resulting in an potentially +insufficient chip-wide maximum frame size for the CPU port. + +As, by design, the CPU port MTU is adjusted for any user port change, +apply the chip-wide setting only for CPU ports. This aligns the driver +to the behavior of other switch drivers. + +Fixes: 6ae5834b983a ("net: dsa: b53: add MTU configuration support") +Suggested-by: Vladimir Oltean +Signed-off-by: Martin Willi +Reviewed-by: Vladimir Oltean +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + drivers/net/dsa/b53/b53_common.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c +index d3b37cebcfde8..2bf07a3980544 100644 +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -2180,6 +2180,9 @@ static int b53_change_mtu(struct dsa_switch *ds, int port, int mtu) + if (is5325(dev) || is5365(dev)) + return -EOPNOTSUPP; + ++ if (!dsa_is_cpu_port(ds, port)) ++ return 0; ++ + enable_jumbo = (mtu >= JMS_MIN_SIZE); + allow_10_100 = (dev->chip_id == BCM583XX_DEVICE_ID); + +-- +2.43.0 + diff --git a/queue-5.10/net-dsa-mv88e6xxx-limit-chip-wide-frame-size-config-.patch b/queue-5.10/net-dsa-mv88e6xxx-limit-chip-wide-frame-size-config-.patch new file mode 100644 index 00000000000..9606e22fcda --- /dev/null +++ b/queue-5.10/net-dsa-mv88e6xxx-limit-chip-wide-frame-size-config-.patch @@ -0,0 +1,50 @@ +From 36ca4e73430a84bc0f2128f521256b4293987084 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Jul 2024 11:08:19 +0200 +Subject: net: dsa: mv88e6xxx: Limit chip-wide frame size config to CPU ports + +From: Martin Willi + +[ Upstream commit 66b6095c264e1b4e0a441c6329861806504e06c6 ] + +Marvell chips not supporting per-port jumbo frame size configurations use +a chip-wide frame size configuration. In the commit referenced with the +Fixes tag, the setting is applied just for the last port changing its MTU. + +While configuring CPU ports accounts for tagger overhead, user ports do +not. When setting the MTU for a user port, the chip-wide setting is +reduced to not include the tagger overhead, resulting in an potentially +insufficient maximum frame size for the CPU port. Specifically, sending +full-size frames from the CPU port on a MV88E6097 having a user port MTU +of 1500 bytes results in dropped frames. + +As, by design, the CPU port MTU is adjusted for any user port change, +apply the chip-wide setting only for CPU ports. + +Fixes: 1baf0fac10fb ("net: dsa: mv88e6xxx: Use chip-wide max frame size for MTU") +Suggested-by: Vladimir Oltean +Signed-off-by: Martin Willi +Reviewed-by: Vladimir Oltean +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + drivers/net/dsa/mv88e6xxx/chip.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c +index 6a1ae774cfe99..c7f93329ae753 100644 +--- a/drivers/net/dsa/mv88e6xxx/chip.c ++++ b/drivers/net/dsa/mv88e6xxx/chip.c +@@ -2774,7 +2774,8 @@ static int mv88e6xxx_change_mtu(struct dsa_switch *ds, int port, int new_mtu) + mv88e6xxx_reg_lock(chip); + if (chip->info->ops->port_set_jumbo_size) + ret = chip->info->ops->port_set_jumbo_size(chip, port, new_mtu); +- else if (chip->info->ops->set_max_frame_size) ++ else if (chip->info->ops->set_max_frame_size && ++ dsa_is_cpu_port(ds, port)) + ret = chip->info->ops->set_max_frame_size(chip, new_mtu); + mv88e6xxx_reg_unlock(chip); + +-- +2.43.0 + diff --git a/queue-5.10/net-esp-cleanup-esp_output_tail_tcp-in-case-of-unsup.patch b/queue-5.10/net-esp-cleanup-esp_output_tail_tcp-in-case-of-unsup.patch new file mode 100644 index 00000000000..416270c1236 --- /dev/null +++ b/queue-5.10/net-esp-cleanup-esp_output_tail_tcp-in-case-of-unsup.patch @@ -0,0 +1,63 @@ +From 9c1b37f4a6104fc77e9eb21e44567a440ba921ad Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 18 May 2024 13:04:39 +0000 +Subject: net: esp: cleanup esp_output_tail_tcp() in case of unsupported + ESPINTCP + +From: Hagar Hemdan + +[ Upstream commit 96f887a612e4cda89efc3f54bc10c1997e3ab0e9 ] + +xmit() functions should consume skb or return error codes in error +paths. +When the configuration "CONFIG_INET_ESPINTCP" is not set, the +implementation of the function "esp_output_tail_tcp" violates this rule. +The function frees the skb and returns the error code. +This change removes the kfree_skb from both functions, for both +esp4 and esp6. +WARN_ON is added because esp_output_tail_tcp() should never be called if +CONFIG_INET_ESPINTCP is not set. + +This bug was discovered and resolved using Coverity Static Analysis +Security Testing (SAST) by Synopsys, Inc. + +Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)") +Signed-off-by: Hagar Hemdan +Signed-off-by: Steffen Klassert +Signed-off-by: Sasha Levin +--- + net/ipv4/esp4.c | 3 +-- + net/ipv6/esp6.c | 3 +-- + 2 files changed, 2 insertions(+), 4 deletions(-) + +diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c +index 412a3c153cad3..adfefcd88bbcc 100644 +--- a/net/ipv4/esp4.c ++++ b/net/ipv4/esp4.c +@@ -239,8 +239,7 @@ static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb) + #else + static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb) + { +- kfree_skb(skb); +- ++ WARN_ON(1); + return -EOPNOTSUPP; + } + #endif +diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c +index fddc811bbde1f..39154531d4559 100644 +--- a/net/ipv6/esp6.c ++++ b/net/ipv6/esp6.c +@@ -255,8 +255,7 @@ static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb) + #else + static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb) + { +- kfree_skb(skb); +- ++ WARN_ON(1); + return -EOPNOTSUPP; + } + #endif +-- +2.43.0 + diff --git a/queue-5.10/net-fec-fix-fec_ecr_en1588-being-cleared-on-link-dow.patch b/queue-5.10/net-fec-fix-fec_ecr_en1588-being-cleared-on-link-dow.patch new file mode 100644 index 00000000000..8ccb7999c1b --- /dev/null +++ b/queue-5.10/net-fec-fix-fec_ecr_en1588-being-cleared-on-link-dow.patch @@ -0,0 +1,50 @@ +From 114bbfad957c4eaa6041ef4e7297af49d9d235c7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 19 Jun 2024 14:31:11 +0200 +Subject: net: fec: Fix FEC_ECR_EN1588 being cleared on link-down +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Csókás, Bence + +[ Upstream commit c32fe1986f27cac329767d3497986e306cad1d5e ] + +FEC_ECR_EN1588 bit gets cleared after MAC reset in `fec_stop()`, which +makes all 1588 functionality shut down, and all the extended registers +disappear, on link-down, making the adapter fall back to compatibility +"dumb mode". However, some functionality needs to be retained (e.g. PPS) +even without link. + +Fixes: 6605b730c061 ("FEC: Add time stamping code and a PTP hardware clock") +Cc: Richard Cochran +Reviewed-by: Andrew Lunn +Link: https://lore.kernel.org/netdev/5fa9fadc-a89d-467a-aae9-c65469ff5fe1@lunn.ch/ +Signed-off-by: Csókás, Bence +Reviewed-by: Wei Fang +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/freescale/fec_main.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c +index 269c6365ec09b..a591ca0b37787 100644 +--- a/drivers/net/ethernet/freescale/fec_main.c ++++ b/drivers/net/ethernet/freescale/fec_main.c +@@ -1201,6 +1201,12 @@ fec_stop(struct net_device *ndev) + writel(FEC_ECR_ETHEREN, fep->hwp + FEC_ECNTRL); + writel(rmii_mode, fep->hwp + FEC_R_CNTRL); + } ++ ++ if (fep->bufdesc_ex) { ++ val = readl(fep->hwp + FEC_ECNTRL); ++ val |= FEC_ECR_EN1588; ++ writel(val, fep->hwp + FEC_ECNTRL); ++ } + } + + static void +-- +2.43.0 + diff --git a/queue-5.10/net-fec-refactor-define-magic-constants.patch b/queue-5.10/net-fec-refactor-define-magic-constants.patch new file mode 100644 index 00000000000..5865604a0e0 --- /dev/null +++ b/queue-5.10/net-fec-refactor-define-magic-constants.patch @@ -0,0 +1,149 @@ +From 55e5e9d7bc2e8d51c28dafa993bc21e5b221f745 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 12 Feb 2024 16:37:17 +0100 +Subject: net: fec: Refactor: #define magic constants +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Csókás Bence + +[ Upstream commit ff049886671ccd4e624a30ec464cb20e4c39a313 ] + +Add defines for bits of ECR, RCR control registers, TX watermark etc. + +Signed-off-by: Csókás Bence +Reviewed-by: Andrew Lunn +Link: https://lore.kernel.org/r/20240212153717.10023-1-csokas.bence@prolan.hu +Signed-off-by: Jakub Kicinski +Stable-dep-of: c32fe1986f27 ("net: fec: Fix FEC_ECR_EN1588 being cleared on link-down") +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/freescale/fec_main.c | 46 +++++++++++++++-------- + 1 file changed, 30 insertions(+), 16 deletions(-) + +diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c +index adb76db66031f..269c6365ec09b 100644 +--- a/drivers/net/ethernet/freescale/fec_main.c ++++ b/drivers/net/ethernet/freescale/fec_main.c +@@ -220,8 +220,8 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address"); + #define PKT_MINBUF_SIZE 64 + + /* FEC receive acceleration */ +-#define FEC_RACC_IPDIS (1 << 1) +-#define FEC_RACC_PRODIS (1 << 2) ++#define FEC_RACC_IPDIS BIT(1) ++#define FEC_RACC_PRODIS BIT(2) + #define FEC_RACC_SHIFT16 BIT(7) + #define FEC_RACC_OPTIONS (FEC_RACC_IPDIS | FEC_RACC_PRODIS) + +@@ -253,8 +253,23 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address"); + #define FEC_MMFR_TA (2 << 16) + #define FEC_MMFR_DATA(v) (v & 0xffff) + /* FEC ECR bits definition */ +-#define FEC_ECR_MAGICEN (1 << 2) +-#define FEC_ECR_SLEEP (1 << 3) ++#define FEC_ECR_RESET BIT(0) ++#define FEC_ECR_ETHEREN BIT(1) ++#define FEC_ECR_MAGICEN BIT(2) ++#define FEC_ECR_SLEEP BIT(3) ++#define FEC_ECR_EN1588 BIT(4) ++#define FEC_ECR_BYTESWP BIT(8) ++/* FEC RCR bits definition */ ++#define FEC_RCR_LOOP BIT(0) ++#define FEC_RCR_HALFDPX BIT(1) ++#define FEC_RCR_MII BIT(2) ++#define FEC_RCR_PROMISC BIT(3) ++#define FEC_RCR_BC_REJ BIT(4) ++#define FEC_RCR_FLOWCTL BIT(5) ++#define FEC_RCR_RMII BIT(8) ++#define FEC_RCR_10BASET BIT(9) ++/* TX WMARK bits */ ++#define FEC_TXWMRK_STRFWD BIT(8) + + #define FEC_MII_TIMEOUT 30000 /* us */ + +@@ -949,7 +964,7 @@ fec_restart(struct net_device *ndev) + u32 val; + u32 temp_mac[2]; + u32 rcntl = OPT_FRAME_SIZE | 0x04; +- u32 ecntl = 0x2; /* ETHEREN */ ++ u32 ecntl = FEC_ECR_ETHEREN; + + /* Whack a reset. We should wait for this. + * For i.MX6SX SOC, enet use AXI bus, we use disable MAC +@@ -1025,18 +1040,18 @@ fec_restart(struct net_device *ndev) + fep->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID) + rcntl |= (1 << 6); + else if (fep->phy_interface == PHY_INTERFACE_MODE_RMII) +- rcntl |= (1 << 8); ++ rcntl |= FEC_RCR_RMII; + else +- rcntl &= ~(1 << 8); ++ rcntl &= ~FEC_RCR_RMII; + + /* 1G, 100M or 10M */ + if (ndev->phydev) { + if (ndev->phydev->speed == SPEED_1000) + ecntl |= (1 << 5); + else if (ndev->phydev->speed == SPEED_100) +- rcntl &= ~(1 << 9); ++ rcntl &= ~FEC_RCR_10BASET; + else +- rcntl |= (1 << 9); ++ rcntl |= FEC_RCR_10BASET; + } + } else { + #ifdef FEC_MIIGSK_ENR +@@ -1095,13 +1110,13 @@ fec_restart(struct net_device *ndev) + + if (fep->quirks & FEC_QUIRK_ENET_MAC) { + /* enable ENET endian swap */ +- ecntl |= (1 << 8); ++ ecntl |= FEC_ECR_BYTESWP; + /* enable ENET store and forward mode */ +- writel(1 << 8, fep->hwp + FEC_X_WMRK); ++ writel(FEC_TXWMRK_STRFWD, fep->hwp + FEC_X_WMRK); + } + + if (fep->bufdesc_ex) +- ecntl |= (1 << 4); ++ ecntl |= FEC_ECR_EN1588; + + #ifndef CONFIG_M5272 + /* Enable the MIB statistic event counters */ +@@ -1148,7 +1163,7 @@ static void + fec_stop(struct net_device *ndev) + { + struct fec_enet_private *fep = netdev_priv(ndev); +- u32 rmii_mode = readl(fep->hwp + FEC_R_CNTRL) & (1 << 8); ++ u32 rmii_mode = readl(fep->hwp + FEC_R_CNTRL) & FEC_RCR_RMII; + u32 val; + + /* We cannot expect a graceful transmit stop without link !!! */ +@@ -1167,7 +1182,7 @@ fec_stop(struct net_device *ndev) + if (fep->quirks & FEC_QUIRK_HAS_AVB) { + writel(0, fep->hwp + FEC_ECNTRL); + } else { +- writel(1, fep->hwp + FEC_ECNTRL); ++ writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL); + udelay(10); + } + writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK); +@@ -1183,12 +1198,11 @@ fec_stop(struct net_device *ndev) + /* We have to keep ENET enabled to have MII interrupt stay working */ + if (fep->quirks & FEC_QUIRK_ENET_MAC && + !(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) { +- writel(2, fep->hwp + FEC_ECNTRL); ++ writel(FEC_ECR_ETHEREN, fep->hwp + FEC_ECNTRL); + writel(rmii_mode, fep->hwp + FEC_R_CNTRL); + } + } + +- + static void + fec_timeout(struct net_device *ndev, unsigned int txqueue) + { +-- +2.43.0 + diff --git a/queue-5.10/net-smc-allow-smc-d-1mb-dmb-allocations.patch b/queue-5.10/net-smc-allow-smc-d-1mb-dmb-allocations.patch new file mode 100644 index 00000000000..1b894bce817 --- /dev/null +++ b/queue-5.10/net-smc-allow-smc-d-1mb-dmb-allocations.patch @@ -0,0 +1,107 @@ +From 331ab7774f5b71d339461740db9db8a2c4e3d8d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 9 Aug 2021 10:10:14 +0200 +Subject: net/smc: Allow SMC-D 1MB DMB allocations + +From: Stefan Raspl + +[ Upstream commit 67161779a9ea926fccee8de047ae66cbd3482b91 ] + +Commit a3fe3d01bd0d7 ("net/smc: introduce sg-logic for RMBs") introduced +a restriction for RMB allocations as used by SMC-R. However, SMC-D does +not use scatter-gather lists to back its DMBs, yet it was limited by +this restriction, still. +This patch exempts SMC, but limits allocations to the maximum RMB/DMB +size respectively. + +Signed-off-by: Stefan Raspl +Signed-off-by: Guvenc Gulce +Signed-off-by: David S. Miller +Stable-dep-of: 3ac14b9dfbd3 ("net/smc: set rmb's SG_MAX_SINGLE_ALLOC limitation only when CONFIG_ARCH_NO_SG_CHAIN is defined") +Signed-off-by: Sasha Levin +--- + net/smc/smc_core.c | 31 ++++++++++++++++--------------- + 1 file changed, 16 insertions(+), 15 deletions(-) + +diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c +index ab9ecdd1af0ac..701bfc2bab239 100644 +--- a/net/smc/smc_core.c ++++ b/net/smc/smc_core.c +@@ -1375,21 +1375,30 @@ int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini) + return rc; + } + +-/* convert the RMB size into the compressed notation - minimum 16K. ++#define SMCD_DMBE_SIZES 6 /* 0 -> 16KB, 1 -> 32KB, .. 6 -> 1MB */ ++#define SMCR_RMBE_SIZES 5 /* 0 -> 16KB, 1 -> 32KB, .. 5 -> 512KB */ ++ ++/* convert the RMB size into the compressed notation (minimum 16K, see ++ * SMCD/R_DMBE_SIZES. + * In contrast to plain ilog2, this rounds towards the next power of 2, + * so the socket application gets at least its desired sndbuf / rcvbuf size. + */ +-static u8 smc_compress_bufsize(int size) ++static u8 smc_compress_bufsize(int size, bool is_smcd, bool is_rmb) + { ++ const unsigned int max_scat = SG_MAX_SINGLE_ALLOC * PAGE_SIZE; + u8 compressed; + + if (size <= SMC_BUF_MIN_SIZE) + return 0; + +- size = (size - 1) >> 14; +- compressed = ilog2(size) + 1; +- if (compressed >= SMC_RMBE_SIZES) +- compressed = SMC_RMBE_SIZES - 1; ++ size = (size - 1) >> 14; /* convert to 16K multiple */ ++ compressed = min_t(u8, ilog2(size) + 1, ++ is_smcd ? SMCD_DMBE_SIZES : SMCR_RMBE_SIZES); ++ ++ if (!is_smcd && is_rmb) ++ /* RMBs are backed by & limited to max size of scatterlists */ ++ compressed = min_t(u8, compressed, ilog2(max_scat >> 14)); ++ + return compressed; + } + +@@ -1608,17 +1617,12 @@ static int smcr_buf_map_usable_links(struct smc_link_group *lgr, + return rc; + } + +-#define SMCD_DMBE_SIZES 6 /* 0 -> 16KB, 1 -> 32KB, .. 6 -> 1MB */ +- + static struct smc_buf_desc *smcd_new_buf_create(struct smc_link_group *lgr, + bool is_dmb, int bufsize) + { + struct smc_buf_desc *buf_desc; + int rc; + +- if (smc_compress_bufsize(bufsize) > SMCD_DMBE_SIZES) +- return ERR_PTR(-EAGAIN); +- + /* try to alloc a new DMB */ + buf_desc = kzalloc(sizeof(*buf_desc), GFP_KERNEL); + if (!buf_desc) +@@ -1666,9 +1670,8 @@ static int __smc_buf_create(struct smc_sock *smc, bool is_smcd, bool is_rmb) + /* use socket send buffer size (w/o overhead) as start value */ + sk_buf_size = smc->sk.sk_sndbuf / 2; + +- for (bufsize_short = smc_compress_bufsize(sk_buf_size); ++ for (bufsize_short = smc_compress_bufsize(sk_buf_size, is_smcd, is_rmb); + bufsize_short >= 0; bufsize_short--) { +- + if (is_rmb) { + lock = &lgr->rmbs_lock; + buf_list = &lgr->rmbs[bufsize_short]; +@@ -1677,8 +1680,6 @@ static int __smc_buf_create(struct smc_sock *smc, bool is_smcd, bool is_rmb) + buf_list = &lgr->sndbufs[bufsize_short]; + } + bufsize = smc_uncompress_bufsize(bufsize_short); +- if ((1 << get_order(bufsize)) > SG_MAX_SINGLE_ALLOC) +- continue; + + /* check for reusable slot in the link group */ + buf_desc = smc_buf_get_slot(bufsize_short, lock, buf_list); +-- +2.43.0 + diff --git a/queue-5.10/net-smc-set-rmb-s-sg_max_single_alloc-limitation-onl.patch b/queue-5.10/net-smc-set-rmb-s-sg_max_single_alloc-limitation-onl.patch new file mode 100644 index 00000000000..a4a76c32263 --- /dev/null +++ b/queue-5.10/net-smc-set-rmb-s-sg_max_single_alloc-limitation-onl.patch @@ -0,0 +1,57 @@ +From 0497d9b221aeb82dc8f2711abedafd61758ba3a4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 3 Jun 2024 11:00:18 +0800 +Subject: net/smc: set rmb's SG_MAX_SINGLE_ALLOC limitation only when + CONFIG_ARCH_NO_SG_CHAIN is defined + +From: Guangguan Wang + +[ Upstream commit 3ac14b9dfbd345e891d48d89f6c2fa519848f0f4 ] + +SG_MAX_SINGLE_ALLOC is used to limit maximum number of entries that +will be allocated in one piece of scatterlist. When the entries of +scatterlist exceeds SG_MAX_SINGLE_ALLOC, sg chain will be used. From +commit 7c703e54cc71 ("arch: switch the default on ARCH_HAS_SG_CHAIN"), +we can know that the macro CONFIG_ARCH_NO_SG_CHAIN is used to identify +whether sg chain is supported. So, SMC-R's rmb buffer should be limited +by SG_MAX_SINGLE_ALLOC only when the macro CONFIG_ARCH_NO_SG_CHAIN is +defined. + +Fixes: a3fe3d01bd0d ("net/smc: introduce sg-logic for RMBs") +Signed-off-by: Guangguan Wang +Co-developed-by: Wen Gu +Signed-off-by: Wen Gu +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/smc/smc_core.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c +index 701bfc2bab239..0e9d22e9c760b 100644 +--- a/net/smc/smc_core.c ++++ b/net/smc/smc_core.c +@@ -1385,7 +1385,6 @@ int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini) + */ + static u8 smc_compress_bufsize(int size, bool is_smcd, bool is_rmb) + { +- const unsigned int max_scat = SG_MAX_SINGLE_ALLOC * PAGE_SIZE; + u8 compressed; + + if (size <= SMC_BUF_MIN_SIZE) +@@ -1395,9 +1394,11 @@ static u8 smc_compress_bufsize(int size, bool is_smcd, bool is_rmb) + compressed = min_t(u8, ilog2(size) + 1, + is_smcd ? SMCD_DMBE_SIZES : SMCR_RMBE_SIZES); + ++#ifdef CONFIG_ARCH_NO_SG_CHAIN + if (!is_smcd && is_rmb) + /* RMBs are backed by & limited to max size of scatterlists */ +- compressed = min_t(u8, compressed, ilog2(max_scat >> 14)); ++ compressed = min_t(u8, compressed, ilog2((SG_MAX_SINGLE_ALLOC * PAGE_SIZE) >> 14)); ++#endif + + return compressed; + } +-- +2.43.0 + diff --git a/queue-5.10/netfilter-ctnetlink-use-helper-function-to-calculate.patch b/queue-5.10/netfilter-ctnetlink-use-helper-function-to-calculate.patch new file mode 100644 index 00000000000..3c6289408bc --- /dev/null +++ b/queue-5.10/netfilter-ctnetlink-use-helper-function-to-calculate.patch @@ -0,0 +1,38 @@ +From 6691d1a81c3af73771e0487297d0fe41e3c47a9d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 13 Jul 2024 16:47:38 +0200 +Subject: netfilter: ctnetlink: use helper function to calculate expect ID + +From: Pablo Neira Ayuso + +[ Upstream commit 782161895eb4ac45cf7cfa8db375bd4766cb8299 ] + +Delete expectation path is missing a call to the nf_expect_get_id() +helper function to calculate the expectation ID, otherwise LSB of the +expectation object address is leaked to userspace. + +Fixes: 3c79107631db ("netfilter: ctnetlink: don't use conntrack/expect object addresses as id") +Reported-by: zdi-disclosures@trendmicro.com +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nf_conntrack_netlink.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c +index ceb7c988edefa..b55e87143c2ce 100644 +--- a/net/netfilter/nf_conntrack_netlink.c ++++ b/net/netfilter/nf_conntrack_netlink.c +@@ -3413,7 +3413,8 @@ static int ctnetlink_del_expect(struct net *net, struct sock *ctnl, + + if (cda[CTA_EXPECT_ID]) { + __be32 id = nla_get_be32(cda[CTA_EXPECT_ID]); +- if (ntohl(id) != (u32)(unsigned long)exp) { ++ ++ if (id != nf_expect_get_id(exp)) { + nf_ct_expect_put(exp); + return -ENOENT; + } +-- +2.43.0 + diff --git a/queue-5.10/netfilter-nf_tables-rise-cap-on-selinux-secmark-cont.patch b/queue-5.10/netfilter-nf_tables-rise-cap-on-selinux-secmark-cont.patch new file mode 100644 index 00000000000..83606f73f69 --- /dev/null +++ b/queue-5.10/netfilter-nf_tables-rise-cap-on-selinux-secmark-cont.patch @@ -0,0 +1,34 @@ +From 369c99ebcd37888f4818592a5610da019ef70155 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 3 Jun 2024 20:16:59 +0200 +Subject: netfilter: nf_tables: rise cap on SELinux secmark context + +From: Pablo Neira Ayuso + +[ Upstream commit e29630247be24c3987e2b048f8e152771b32d38b ] + +secmark context is artificially limited 256 bytes, rise it to 4Kbytes. + +Fixes: fb961945457f ("netfilter: nf_tables: add SECMARK support") +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + include/uapi/linux/netfilter/nf_tables.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/uapi/linux/netfilter/nf_tables.h b/include/uapi/linux/netfilter/nf_tables.h +index f93ffb1b67398..40d9005370939 100644 +--- a/include/uapi/linux/netfilter/nf_tables.h ++++ b/include/uapi/linux/netfilter/nf_tables.h +@@ -1284,7 +1284,7 @@ enum nft_secmark_attributes { + #define NFTA_SECMARK_MAX (__NFTA_SECMARK_MAX - 1) + + /* Max security context length */ +-#define NFT_SECMARK_CTX_MAXLEN 256 ++#define NFT_SECMARK_CTX_MAXLEN 4096 + + /** + * enum nft_reject_types - nf_tables reject expression reject types +-- +2.43.0 + diff --git a/queue-5.10/nilfs2-avoid-undefined-behavior-in-nilfs_cnt32_ge-ma.patch b/queue-5.10/nilfs2-avoid-undefined-behavior-in-nilfs_cnt32_ge-ma.patch new file mode 100644 index 00000000000..fdd341bf264 --- /dev/null +++ b/queue-5.10/nilfs2-avoid-undefined-behavior-in-nilfs_cnt32_ge-ma.patch @@ -0,0 +1,47 @@ +From 120a7f476c01d3315808810d1e7d3b9fbe3541a3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Jul 2024 03:35:12 +0900 +Subject: nilfs2: avoid undefined behavior in nilfs_cnt32_ge macro + +From: Ryusuke Konishi + +[ Upstream commit 0f3819e8c483771a59cf9d3190cd68a7a990083c ] + +According to the C standard 3.4.3p3, the result of signed integer overflow +is undefined. The macro nilfs_cnt32_ge(), which compares two sequence +numbers, uses signed integer subtraction that can overflow, and therefore +the result of the calculation may differ from what is expected due to +undefined behavior in different environments. + +Similar to an earlier change to the jiffies-related comparison macros in +commit 5a581b367b5d ("jiffies: Avoid undefined behavior from signed +overflow"), avoid this potential issue by changing the definition of the +macro to perform the subtraction as unsigned integers, then cast the +result to a signed integer for comparison. + +Link: https://lkml.kernel.org/r/20130727225828.GA11864@linux.vnet.ibm.com +Link: https://lkml.kernel.org/r/20240702183512.6390-1-konishi.ryusuke@gmail.com +Fixes: 9ff05123e3bf ("nilfs2: segment constructor") +Signed-off-by: Ryusuke Konishi +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + fs/nilfs2/segment.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c +index 1f7ae5f36bde7..d9f92df15a84f 100644 +--- a/fs/nilfs2/segment.c ++++ b/fs/nilfs2/segment.c +@@ -136,7 +136,7 @@ static void nilfs_dispose_list(struct the_nilfs *, struct list_head *, int); + + #define nilfs_cnt32_ge(a, b) \ + (typecheck(__u32, a) && typecheck(__u32, b) && \ +- ((__s32)(a) - (__s32)(b) >= 0)) ++ ((__s32)((a) - (b)) >= 0)) + + static int nilfs_prepare_segment_lock(struct super_block *sb, + struct nilfs_transaction_info *ti) +-- +2.43.0 + diff --git a/queue-5.10/pci-fix-resource-double-counting-on-remove-rescan.patch b/queue-5.10/pci-fix-resource-double-counting-on-remove-rescan.patch new file mode 100644 index 00000000000..8930394c3f1 --- /dev/null +++ b/queue-5.10/pci-fix-resource-double-counting-on-remove-rescan.patch @@ -0,0 +1,73 @@ +From 74a8f2f22884457026c4de7c3bbf7c65d160c627 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 13:25:16 +0300 +Subject: PCI: Fix resource double counting on remove & rescan +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +[ Upstream commit 903534fa7d30214d8ba840ab1cd9e917e0c88e41 ] + +pbus_size_mem() keeps the size of the optional resources in +children_add_size. When calculating the PCI bridge window size, +calculate_memsize() lower bounds size by old_size before adding +children_add_size and performing the window size alignment. This +results in double counting for the resources in children_add_size +because old_size may be based on the previous size of the bridge +window after it has already included children_add_size (that is, +size1 in pbus_size_mem() from an earlier invocation of that +function). + +As a result, on repeated remove of the bus & rescan cycles the resource +size keeps increasing when children_add_size is non-zero as can be seen +from this extract: + + iomem0: 23fffd00000-23fffdfffff : PCI Bus 0000:03 # 1MiB + iomem1: 20000000000-200001fffff : PCI Bus 0000:03 # 2MiB + iomem2: 20000000000-200002fffff : PCI Bus 0000:03 # 3MiB + iomem3: 20000000000-200003fffff : PCI Bus 0000:03 # 4MiB + iomem4: 20000000000-200004fffff : PCI Bus 0000:03 # 5MiB + +Solve the double counting by moving old_size check later in +calculate_memsize() so that children_add_size is already accounted for. + +After the patch, the bridge window retains its size as expected: + + iomem0: 23fffd00000-23fffdfffff : PCI Bus 0000:03 # 1MiB + iomem1: 20000000000-200000fffff : PCI Bus 0000:03 # 1MiB + iomem2: 20000000000-200000fffff : PCI Bus 0000:03 # 1MiB + +Fixes: a4ac9fea016f ("PCI : Calculate right add_size") +Link: https://lore.kernel.org/r/20240507102523.57320-2-ilpo.jarvinen@linux.intel.com +Tested-by: Lidong Wang +Signed-off-by: Ilpo Järvinen +Signed-off-by: Bjorn Helgaas +Reviewed-by: Mika Westerberg +Signed-off-by: Sasha Levin +--- + drivers/pci/setup-bus.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c +index 16d291e10627b..a159bfdfa2512 100644 +--- a/drivers/pci/setup-bus.c ++++ b/drivers/pci/setup-bus.c +@@ -824,11 +824,9 @@ static resource_size_t calculate_memsize(resource_size_t size, + size = min_size; + if (old_size == 1) + old_size = 0; +- if (size < old_size) +- size = old_size; + +- size = ALIGN(max(size, add_size) + children_add_size, align); +- return size; ++ size = max(size, add_size) + children_add_size; ++ return ALIGN(max(size, old_size), align); + } + + resource_size_t __weak pcibios_window_alignment(struct pci_bus *bus, +-- +2.43.0 + diff --git a/queue-5.10/perf-fix-perf_aux_size-for-greater-than-32-bit-size.patch b/queue-5.10/perf-fix-perf_aux_size-for-greater-than-32-bit-size.patch new file mode 100644 index 00000000000..661213ba152 --- /dev/null +++ b/queue-5.10/perf-fix-perf_aux_size-for-greater-than-32-bit-size.patch @@ -0,0 +1,37 @@ +From 8664a5356ee8efe6b903e23cc62a97858d54491d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 24 Jun 2024 23:10:58 +0300 +Subject: perf: Fix perf_aux_size() for greater-than 32-bit size + +From: Adrian Hunter + +[ Upstream commit 3df94a5b1078dfe2b0c03f027d018800faf44c82 ] + +perf_buffer->aux_nr_pages uses a 32-bit type, so a cast is needed to +calculate a 64-bit size. + +Fixes: 45bfb2e50471 ("perf: Add AUX area to ring buffer for raw data streams") +Signed-off-by: Adrian Hunter +Signed-off-by: Peter Zijlstra (Intel) +Link: https://lore.kernel.org/r/20240624201101.60186-5-adrian.hunter@intel.com +Signed-off-by: Sasha Levin +--- + kernel/events/internal.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/events/internal.h b/kernel/events/internal.h +index aa23ffdaf819f..8e63cc2bd4f7d 100644 +--- a/kernel/events/internal.h ++++ b/kernel/events/internal.h +@@ -128,7 +128,7 @@ static inline unsigned long perf_data_size(struct perf_buffer *rb) + + static inline unsigned long perf_aux_size(struct perf_buffer *rb) + { +- return rb->aux_nr_pages << PAGE_SHIFT; ++ return (unsigned long)rb->aux_nr_pages << PAGE_SHIFT; + } + + #define __DEFINE_OUTPUT_COPY_BODY(advance_buf, memcpy_func, ...) \ +-- +2.43.0 + diff --git a/queue-5.10/perf-prevent-passing-zero-nr_pages-to-rb_alloc_aux.patch b/queue-5.10/perf-prevent-passing-zero-nr_pages-to-rb_alloc_aux.patch new file mode 100644 index 00000000000..f4c07ef3ecc --- /dev/null +++ b/queue-5.10/perf-prevent-passing-zero-nr_pages-to-rb_alloc_aux.patch @@ -0,0 +1,51 @@ +From caa344a5b3ad62de1af46589729099d9d2b81471 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 24 Jun 2024 23:10:59 +0300 +Subject: perf: Prevent passing zero nr_pages to rb_alloc_aux() + +From: Adrian Hunter + +[ Upstream commit dbc48c8f41c208082cfa95e973560134489e3309 ] + +nr_pages is unsigned long but gets passed to rb_alloc_aux() as an int, +and is stored as an int. + +Only power-of-2 values are accepted, so if nr_pages is a 64_bit value, it +will be passed to rb_alloc_aux() as zero. + +That is not ideal because: + 1. the value is incorrect + 2. rb_alloc_aux() is at risk of misbehaving, although it manages to + return -ENOMEM in that case, it is a result of passing zero to get_order() + even though the get_order() result is documented to be undefined in that + case. + +Fix by simply validating the maximum supported value in the first place. +Use -ENOMEM error code for consistency with the current error code that +is returned in that case. + +Fixes: 45bfb2e50471 ("perf: Add AUX area to ring buffer for raw data streams") +Signed-off-by: Adrian Hunter +Signed-off-by: Peter Zijlstra (Intel) +Link: https://lore.kernel.org/r/20240624201101.60186-6-adrian.hunter@intel.com +Signed-off-by: Sasha Levin +--- + kernel/events/core.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/kernel/events/core.c b/kernel/events/core.c +index 3a191bec69aca..b60325cc8604d 100644 +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -6239,6 +6239,8 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma) + return -EINVAL; + + nr_pages = vma_size / PAGE_SIZE; ++ if (nr_pages > INT_MAX) ++ return -ENOMEM; + + mutex_lock(&event->mmap_mutex); + ret = -EINVAL; +-- +2.43.0 + diff --git a/queue-5.10/perf-report-fix-condition-in-sort__sym_cmp.patch b/queue-5.10/perf-report-fix-condition-in-sort__sym_cmp.patch new file mode 100644 index 00000000000..df603f57ddd --- /dev/null +++ b/queue-5.10/perf-report-fix-condition-in-sort__sym_cmp.patch @@ -0,0 +1,42 @@ +From 72d4446994f8a306b7a3033b3754e438be3f8e0a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 21 Jun 2024 10:05:25 -0700 +Subject: perf report: Fix condition in sort__sym_cmp() + +From: Namhyung Kim + +[ Upstream commit cb39d05e67dc24985ff9f5150e71040fa4d60ab8 ] + +It's expected that both hist entries are in the same hists when +comparing two. But the current code in the function checks one without +dso sort key and other with the key. This would make the condition true +in any case. + +I guess the intention of the original commit was to add '!' for the +right side too. But as it should be the same, let's just remove it. + +Fixes: 69849fc5d2119 ("perf hists: Move sort__has_dso into struct perf_hpp_list") +Reviewed-by: Kan Liang +Signed-off-by: Namhyung Kim +Link: https://lore.kernel.org/r/20240621170528.608772-2-namhyung@kernel.org +Signed-off-by: Sasha Levin +--- + tools/perf/util/sort.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c +index 42806102010bb..bbebb1e51b88f 100644 +--- a/tools/perf/util/sort.c ++++ b/tools/perf/util/sort.c +@@ -272,7 +272,7 @@ sort__sym_cmp(struct hist_entry *left, struct hist_entry *right) + * comparing symbol address alone is not enough since it's a + * relative address within a dso. + */ +- if (!hists__has(left->hists, dso) || hists__has(right->hists, dso)) { ++ if (!hists__has(left->hists, dso)) { + ret = sort__dso_cmp(left, right); + if (ret != 0) + return ret; +-- +2.43.0 + diff --git a/queue-5.10/perf-x86-intel-pt-fix-pt_topa_entry_for_page-address.patch b/queue-5.10/perf-x86-intel-pt-fix-pt_topa_entry_for_page-address.patch new file mode 100644 index 00000000000..41f9bc0baa5 --- /dev/null +++ b/queue-5.10/perf-x86-intel-pt-fix-pt_topa_entry_for_page-address.patch @@ -0,0 +1,42 @@ +From b40a6ea6e5b9ed320e1e8e41d53c4755eaeec4f4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 24 Jun 2024 23:10:57 +0300 +Subject: perf/x86/intel/pt: Fix pt_topa_entry_for_page() address calculation + +From: Adrian Hunter + +[ Upstream commit 3520b251dcae2b4a27b95cd6f745c54fd658bda5 ] + +Currently, perf allocates an array of page pointers which is limited in +size by MAX_PAGE_ORDER. That in turn limits the maximum Intel PT buffer +size to 2GiB. Should that limitation be lifted, the Intel PT driver can +support larger sizes, except for one calculation in +pt_topa_entry_for_page(), which is limited to 32-bits. + +Fix pt_topa_entry_for_page() address calculation by adding a cast. + +Fixes: 39152ee51b77 ("perf/x86/intel/pt: Get rid of reverse lookup table for ToPA") +Signed-off-by: Adrian Hunter +Signed-off-by: Peter Zijlstra (Intel) +Link: https://lore.kernel.org/r/20240624201101.60186-4-adrian.hunter@intel.com +Signed-off-by: Sasha Levin +--- + arch/x86/events/intel/pt.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c +index 5667b8b994e34..d97d34b4669be 100644 +--- a/arch/x86/events/intel/pt.c ++++ b/arch/x86/events/intel/pt.c +@@ -973,7 +973,7 @@ pt_topa_entry_for_page(struct pt_buffer *buf, unsigned int pg) + * order allocations, there shouldn't be many of these. + */ + list_for_each_entry(topa, &buf->tables, list) { +- if (topa->offset + topa->size > pg << PAGE_SHIFT) ++ if (topa->offset + topa->size > (unsigned long)pg << PAGE_SHIFT) + goto found; + } + +-- +2.43.0 + diff --git a/queue-5.10/pinctrl-core-fix-possible-memory-leak-when-pinctrl_e.patch b/queue-5.10/pinctrl-core-fix-possible-memory-leak-when-pinctrl_e.patch new file mode 100644 index 00000000000..8c7fd69b983 --- /dev/null +++ b/queue-5.10/pinctrl-core-fix-possible-memory-leak-when-pinctrl_e.patch @@ -0,0 +1,59 @@ +From 93313b63656f52c884cb2e87e5a1ca57df172b68 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jun 2024 10:37:02 +0800 +Subject: pinctrl: core: fix possible memory leak when pinctrl_enable() fails + +From: Yang Yingliang + +[ Upstream commit ae1cf4759972c5fe665ee4c5e0c29de66fe3cf4a ] + +In devm_pinctrl_register(), if pinctrl_enable() fails in pinctrl_register(), +the "pctldev" has not been added to dev resources, so devm_pinctrl_dev_release() +can not be called, it leads memory leak. + +Introduce pinctrl_uninit_controller(), call it in the error path to free memory. + +Fixes: 5038a66dad01 ("pinctrl: core: delete incorrect free in pinctrl_enable()") +Signed-off-by: Yang Yingliang +Reviewed-by: Dan Carpenter +Link: https://lore.kernel.org/r/20240606023704.3931561-2-yangyingliang@huawei.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/core.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c +index 3d44d6f48cc4c..8152d24e128a3 100644 +--- a/drivers/pinctrl/core.c ++++ b/drivers/pinctrl/core.c +@@ -2039,6 +2039,14 @@ pinctrl_init_controller(struct pinctrl_desc *pctldesc, struct device *dev, + return ERR_PTR(ret); + } + ++static void pinctrl_uninit_controller(struct pinctrl_dev *pctldev, struct pinctrl_desc *pctldesc) ++{ ++ pinctrl_free_pindescs(pctldev, pctldesc->pins, ++ pctldesc->npins); ++ mutex_destroy(&pctldev->mutex); ++ kfree(pctldev); ++} ++ + static int pinctrl_claim_hogs(struct pinctrl_dev *pctldev) + { + pctldev->p = create_pinctrl(pctldev->dev, pctldev); +@@ -2119,8 +2127,10 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, + return pctldev; + + error = pinctrl_enable(pctldev); +- if (error) ++ if (error) { ++ pinctrl_uninit_controller(pctldev, pctldesc); + return ERR_PTR(error); ++ } + + return pctldev; + } +-- +2.43.0 + diff --git a/queue-5.10/pinctrl-freescale-mxs-fix-refcount-of-child.patch b/queue-5.10/pinctrl-freescale-mxs-fix-refcount-of-child.patch new file mode 100644 index 00000000000..8660501777c --- /dev/null +++ b/queue-5.10/pinctrl-freescale-mxs-fix-refcount-of-child.patch @@ -0,0 +1,43 @@ +From b46723af86879433069dda68525322cababe6200 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 4 May 2024 21:20:16 +0800 +Subject: pinctrl: freescale: mxs: Fix refcount of child + +From: Peng Fan + +[ Upstream commit 7f500f2011c0bbb6e1cacab74b4c99222e60248e ] + +of_get_next_child() will increase refcount of the returned node, need +use of_node_put() on it when done. + +Per current implementation, 'child' will be override by +for_each_child_of_node(np, child), so use of_get_child_count to avoid +refcount leakage. + +Fixes: 17723111e64f ("pinctrl: add pinctrl-mxs support") +Signed-off-by: Peng Fan +Link: https://lore.kernel.org/20240504-pinctrl-cleanup-v2-18-26c5f2dc1181@nxp.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/freescale/pinctrl-mxs.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/pinctrl/freescale/pinctrl-mxs.c b/drivers/pinctrl/freescale/pinctrl-mxs.c +index 735cedd0958a2..5b0fcf15f2804 100644 +--- a/drivers/pinctrl/freescale/pinctrl-mxs.c ++++ b/drivers/pinctrl/freescale/pinctrl-mxs.c +@@ -405,8 +405,8 @@ static int mxs_pinctrl_probe_dt(struct platform_device *pdev, + int ret; + u32 val; + +- child = of_get_next_child(np, NULL); +- if (!child) { ++ val = of_get_child_count(np); ++ if (val == 0) { + dev_err(&pdev->dev, "no group is defined\n"); + return -ENOENT; + } +-- +2.43.0 + diff --git a/queue-5.10/pinctrl-rockchip-update-rk3308-iomux-routes.patch b/queue-5.10/pinctrl-rockchip-update-rk3308-iomux-routes.patch new file mode 100644 index 00000000000..bdd0fe8c788 --- /dev/null +++ b/queue-5.10/pinctrl-rockchip-update-rk3308-iomux-routes.patch @@ -0,0 +1,60 @@ +From 7677c872f21257fb241d7e8059c9a68c2e66caba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 May 2024 17:16:32 +0500 +Subject: pinctrl: rockchip: update rk3308 iomux routes + +From: Dmitry Yashin + +[ Upstream commit a8f2548548584549ea29d43431781d67c4afa42b ] + +Some of the rk3308 iomux routes in rk3308_mux_route_data belong to +the rk3308b SoC. Remove them and correct i2c3 routes. + +Fixes: 7825aeb7b208 ("pinctrl: rockchip: add rk3308 SoC support") +Signed-off-by: Dmitry Yashin +Reviewed-by: Heiko Stuebner +Link: https://lore.kernel.org/r/20240515121634.23945-2-dmt.yashin@gmail.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/pinctrl-rockchip.c | 17 ++--------------- + 1 file changed, 2 insertions(+), 15 deletions(-) + +diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c +index 02b41f1bafe71..e0f22ce219ee8 100644 +--- a/drivers/pinctrl/pinctrl-rockchip.c ++++ b/drivers/pinctrl/pinctrl-rockchip.c +@@ -720,9 +720,8 @@ static struct rockchip_mux_route_data rk3308_mux_route_data[] = { + RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */ + RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */ + RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */ +- RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x608, BIT(16 + 8) | BIT(16 + 9)), /* i2c3_sdam0 */ +- RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(8)), /* i2c3_sdam1 */ +- RK_MUXROUTE_SAME(2, RK_PA0, 3, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(9)), /* i2c3_sdam2 */ ++ RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x314, BIT(16 + 4)), /* i2c3_sdam0 */ ++ RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x314, BIT(16 + 4) | BIT(4)), /* i2c3_sdam1 */ + RK_MUXROUTE_SAME(1, RK_PA3, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclktxm0 */ + RK_MUXROUTE_SAME(1, RK_PA4, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclkrxm0 */ + RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclktxm1 */ +@@ -731,18 +730,6 @@ static struct rockchip_mux_route_data rk3308_mux_route_data[] = { + RK_MUXROUTE_SAME(1, RK_PB6, 4, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* pdm-clkm1 */ + RK_MUXROUTE_SAME(2, RK_PA6, 2, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* pdm-clkm2 */ + RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x600, BIT(16 + 2) | BIT(2)), /* pdm-clkm-m2 */ +- RK_MUXROUTE_SAME(3, RK_PB2, 3, 0x314, BIT(16 + 9)), /* spi1_miso */ +- RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x314, BIT(16 + 9) | BIT(9)), /* spi1_miso_m1 */ +- RK_MUXROUTE_SAME(0, RK_PB3, 3, 0x314, BIT(16 + 10) | BIT(16 + 11)), /* owire_m0 */ +- RK_MUXROUTE_SAME(1, RK_PC6, 7, 0x314, BIT(16 + 10) | BIT(16 + 11) | BIT(10)), /* owire_m1 */ +- RK_MUXROUTE_SAME(2, RK_PA2, 5, 0x314, BIT(16 + 10) | BIT(16 + 11) | BIT(11)), /* owire_m2 */ +- RK_MUXROUTE_SAME(0, RK_PB3, 2, 0x314, BIT(16 + 12) | BIT(16 + 13)), /* can_rxd_m0 */ +- RK_MUXROUTE_SAME(1, RK_PC6, 5, 0x314, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* can_rxd_m1 */ +- RK_MUXROUTE_SAME(2, RK_PA2, 4, 0x314, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* can_rxd_m2 */ +- RK_MUXROUTE_SAME(1, RK_PC4, 3, 0x314, BIT(16 + 14)), /* mac_rxd0_m0 */ +- RK_MUXROUTE_SAME(4, RK_PA2, 2, 0x314, BIT(16 + 14) | BIT(14)), /* mac_rxd0_m1 */ +- RK_MUXROUTE_SAME(3, RK_PB4, 4, 0x314, BIT(16 + 15)), /* uart3_rx */ +- RK_MUXROUTE_SAME(0, RK_PC1, 3, 0x314, BIT(16 + 15) | BIT(15)), /* uart3_rx_m1 */ + }; + + static struct rockchip_mux_route_data rk3328_mux_route_data[] = { +-- +2.43.0 + diff --git a/queue-5.10/pinctrl-single-fix-possible-memory-leak-when-pinctrl.patch b/queue-5.10/pinctrl-single-fix-possible-memory-leak-when-pinctrl.patch new file mode 100644 index 00000000000..65aeb9391da --- /dev/null +++ b/queue-5.10/pinctrl-single-fix-possible-memory-leak-when-pinctrl.patch @@ -0,0 +1,60 @@ +From 13744d9605353313f3214f8fd401d53f9f289fc8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jun 2024 10:37:03 +0800 +Subject: pinctrl: single: fix possible memory leak when pinctrl_enable() fails + +From: Yang Yingliang + +[ Upstream commit 8f773bfbdd428819328a2d185976cfc6ae811cd3 ] + +This driver calls pinctrl_register_and_init() which is not +devm_ managed, it will leads memory leak if pinctrl_enable() +fails. Replace it with devm_pinctrl_register_and_init(). +And call pcs_free_resources() if pinctrl_enable() fails. + +Fixes: 5038a66dad01 ("pinctrl: core: delete incorrect free in pinctrl_enable()") +Signed-off-by: Yang Yingliang +Reviewed-by: Dan Carpenter +Link: https://lore.kernel.org/r/20240606023704.3931561-3-yangyingliang@huawei.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/pinctrl-single.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c +index 22e471933b373..4860c4dd853f3 100644 +--- a/drivers/pinctrl/pinctrl-single.c ++++ b/drivers/pinctrl/pinctrl-single.c +@@ -1332,7 +1332,6 @@ static void pcs_irq_free(struct pcs_device *pcs) + static void pcs_free_resources(struct pcs_device *pcs) + { + pcs_irq_free(pcs); +- pinctrl_unregister(pcs->pctl); + + #if IS_BUILTIN(CONFIG_PINCTRL_SINGLE) + if (pcs->missing_nr_pinctrl_cells) +@@ -1889,7 +1888,7 @@ static int pcs_probe(struct platform_device *pdev) + if (ret < 0) + goto free; + +- ret = pinctrl_register_and_init(&pcs->desc, pcs->dev, pcs, &pcs->pctl); ++ ret = devm_pinctrl_register_and_init(pcs->dev, &pcs->desc, pcs, &pcs->pctl); + if (ret) { + dev_err(pcs->dev, "could not register single pinctrl driver\n"); + goto free; +@@ -1922,8 +1921,10 @@ static int pcs_probe(struct platform_device *pdev) + + dev_info(pcs->dev, "%i pins, size %u\n", pcs->desc.npins, pcs->size); + +- return pinctrl_enable(pcs->pctl); ++ if (pinctrl_enable(pcs->pctl)) ++ goto free; + ++ return 0; + free: + pcs_free_resources(pcs); + +-- +2.43.0 + diff --git a/queue-5.10/pinctrl-ti-ti-iodelay-drop-if-block-with-always-fals.patch b/queue-5.10/pinctrl-ti-ti-iodelay-drop-if-block-with-always-fals.patch new file mode 100644 index 00000000000..c925d0c6420 --- /dev/null +++ b/queue-5.10/pinctrl-ti-ti-iodelay-drop-if-block-with-always-fals.patch @@ -0,0 +1,44 @@ +From b6073c13b8a7e1ea02d7f0e3186e26face7a4c72 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 9 Oct 2023 10:38:39 +0200 +Subject: pinctrl: ti: ti-iodelay: Drop if block with always false condition +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit 88b3f108502bc45e6ebd005702add46759f3f45a ] + +ti_iodelay_remove() is only called after ti_iodelay_probe() completed +successfully. In this case platform_set_drvdata() was called with a +non-NULL argument and so platform_get_drvdata() won't return NULL. + +Simplify by removing the if block with the always false condition. + +Signed-off-by: Uwe Kleine-König +Link: https://lore.kernel.org/r/20231009083856.222030-4-u.kleine-koenig@pengutronix.de +Signed-off-by: Linus Walleij +Stable-dep-of: 9b401f4a7170 ("pinctrl: ti: ti-iodelay: fix possible memory leak when pinctrl_enable() fails") +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/ti/pinctrl-ti-iodelay.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c +index cfb924228d877..60d94c1fc6a6d 100644 +--- a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c ++++ b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c +@@ -906,9 +906,6 @@ static int ti_iodelay_remove(struct platform_device *pdev) + { + struct ti_iodelay_device *iod = platform_get_drvdata(pdev); + +- if (!iod) +- return 0; +- + if (iod->pctl) + pinctrl_unregister(iod->pctl); + +-- +2.43.0 + diff --git a/queue-5.10/pinctrl-ti-ti-iodelay-fix-possible-memory-leak-when-.patch b/queue-5.10/pinctrl-ti-ti-iodelay-fix-possible-memory-leak-when-.patch new file mode 100644 index 00000000000..6c21be52546 --- /dev/null +++ b/queue-5.10/pinctrl-ti-ti-iodelay-fix-possible-memory-leak-when-.patch @@ -0,0 +1,64 @@ +From 40da3a85ce051af316fba4b1b4bba0be2ed1723c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jun 2024 10:37:04 +0800 +Subject: pinctrl: ti: ti-iodelay: fix possible memory leak when + pinctrl_enable() fails + +From: Yang Yingliang + +[ Upstream commit 9b401f4a7170125365160c9af267a41ff6b39001 ] + +This driver calls pinctrl_register_and_init() which is not +devm_ managed, it will leads memory leak if pinctrl_enable() +fails. Replace it with devm_pinctrl_register_and_init(). +And add missing of_node_put() in the error path. + +Fixes: 5038a66dad01 ("pinctrl: core: delete incorrect free in pinctrl_enable()") +Signed-off-by: Yang Yingliang +Reviewed-by: Dan Carpenter +Link: https://lore.kernel.org/r/20240606023704.3931561-4-yangyingliang@huawei.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/ti/pinctrl-ti-iodelay.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c +index 60d94c1fc6a6d..6e1b067fb72ed 100644 +--- a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c ++++ b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c +@@ -881,7 +881,7 @@ static int ti_iodelay_probe(struct platform_device *pdev) + iod->desc.name = dev_name(dev); + iod->desc.owner = THIS_MODULE; + +- ret = pinctrl_register_and_init(&iod->desc, dev, iod, &iod->pctl); ++ ret = devm_pinctrl_register_and_init(dev, &iod->desc, iod, &iod->pctl); + if (ret) { + dev_err(dev, "Failed to register pinctrl\n"); + goto exit_out; +@@ -889,7 +889,11 @@ static int ti_iodelay_probe(struct platform_device *pdev) + + platform_set_drvdata(pdev, iod); + +- return pinctrl_enable(iod->pctl); ++ ret = pinctrl_enable(iod->pctl); ++ if (ret) ++ goto exit_out; ++ ++ return 0; + + exit_out: + of_node_put(np); +@@ -906,9 +910,6 @@ static int ti_iodelay_remove(struct platform_device *pdev) + { + struct ti_iodelay_device *iod = platform_get_drvdata(pdev); + +- if (iod->pctl) +- pinctrl_unregister(iod->pctl); +- + ti_iodelay_pinconf_deinit_dev(iod); + + /* Expect other allocations to be freed by devm */ +-- +2.43.0 + diff --git a/queue-5.10/platform-chrome-cros_ec_debugfs-fix-wrong-ec-message.patch b/queue-5.10/platform-chrome-cros_ec_debugfs-fix-wrong-ec-message.patch new file mode 100644 index 00000000000..9a1bac00331 --- /dev/null +++ b/queue-5.10/platform-chrome-cros_ec_debugfs-fix-wrong-ec-message.patch @@ -0,0 +1,38 @@ +From b8d20d5e440cc0d607210b6267acdc24c2ca5370 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 11 Jun 2024 11:31:10 +0000 +Subject: platform/chrome: cros_ec_debugfs: fix wrong EC message version + +From: Tzung-Bi Shih + +[ Upstream commit c2a28647bbb4e0894e8824362410f72b06ac57a4 ] + +ec_read_version_supported() uses ec_params_get_cmd_versions_v1 but it +wrongly uses message version 0. + +Fix it. + +Fixes: e86264595225 ("mfd: cros_ec: add debugfs, console log file") +Reviewed-by: Guenter Roeck +Link: https://lore.kernel.org/r/20240611113110.16955-1-tzungbi@kernel.org +Signed-off-by: Tzung-Bi Shih +Signed-off-by: Sasha Levin +--- + drivers/platform/chrome/cros_ec_debugfs.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c +index 0dbceee87a4b1..2928c3cb37854 100644 +--- a/drivers/platform/chrome/cros_ec_debugfs.c ++++ b/drivers/platform/chrome/cros_ec_debugfs.c +@@ -326,6 +326,7 @@ static int ec_read_version_supported(struct cros_ec_dev *ec) + if (!msg) + return 0; + ++ msg->version = 1; + msg->command = EC_CMD_GET_CMD_VERSIONS + ec->cmd_offset; + msg->outsize = sizeof(*params); + msg->insize = sizeof(*response); +-- +2.43.0 + diff --git a/queue-5.10/powerpc-xmon-fix-disassembly-cpu-feature-checks.patch b/queue-5.10/powerpc-xmon-fix-disassembly-cpu-feature-checks.patch new file mode 100644 index 00000000000..24ea8c8abc3 --- /dev/null +++ b/queue-5.10/powerpc-xmon-fix-disassembly-cpu-feature-checks.patch @@ -0,0 +1,99 @@ +From e5bab442449a34965cfd16fd2697f0a922547e64 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 May 2024 22:12:47 +1000 +Subject: powerpc/xmon: Fix disassembly CPU feature checks + +From: Michael Ellerman + +[ Upstream commit 14196e47c5ffe32af7ed5a51c9e421c5ea5bccce ] + +In the xmon disassembly code there are several CPU feature checks to +determine what dialects should be passed to the disassembler. The +dialect controls which instructions the disassembler will recognise. + +Unfortunately the checks are incorrect, because instead of passing a +single CPU feature they are passing a mask of feature bits. + +For example the code: + + if (cpu_has_feature(CPU_FTRS_POWER5)) + dialect |= PPC_OPCODE_POWER5; + +Is trying to check if the system is running on a Power5 CPU. But +CPU_FTRS_POWER5 is a mask of *all* the feature bits that are enabled on +a Power5. + +In practice the test will always return true for any 64-bit CPU, because +at least one bit in the mask will be present in the CPU_FTRS_ALWAYS +mask. + +Similarly for all the other checks against CPU_FTRS_xx masks. + +Rather than trying to match the disassembly behaviour exactly to the +current CPU, just differentiate between 32-bit and 64-bit, and Altivec, +VSX and HTM. + +That will cause some instructions to be shown in disassembly even +on a CPU that doesn't support them, but that's OK, objdump -d output +has the same behaviour, and if anything it's less confusing than some +instructions not being disassembled. + +Fixes: 897f112bb42e ("[POWERPC] Import updated version of ppc disassembly code for xmon") +Signed-off-by: Michael Ellerman +Link: https://msgid.link/20240509121248.270878-2-mpe@ellerman.id.au +Signed-off-by: Sasha Levin +--- + arch/powerpc/xmon/ppc-dis.c | 33 +++++++++++---------------------- + 1 file changed, 11 insertions(+), 22 deletions(-) + +diff --git a/arch/powerpc/xmon/ppc-dis.c b/arch/powerpc/xmon/ppc-dis.c +index 75fa98221d485..af105e1bc3fca 100644 +--- a/arch/powerpc/xmon/ppc-dis.c ++++ b/arch/powerpc/xmon/ppc-dis.c +@@ -122,32 +122,21 @@ int print_insn_powerpc (unsigned long insn, unsigned long memaddr) + bool insn_is_short; + ppc_cpu_t dialect; + +- dialect = PPC_OPCODE_PPC | PPC_OPCODE_COMMON +- | PPC_OPCODE_64 | PPC_OPCODE_POWER4 | PPC_OPCODE_ALTIVEC; ++ dialect = PPC_OPCODE_PPC | PPC_OPCODE_COMMON; + +- if (cpu_has_feature(CPU_FTRS_POWER5)) +- dialect |= PPC_OPCODE_POWER5; ++ if (IS_ENABLED(CONFIG_PPC64)) ++ dialect |= PPC_OPCODE_64 | PPC_OPCODE_POWER4 | PPC_OPCODE_CELL | ++ PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | ++ PPC_OPCODE_POWER9; + +- if (cpu_has_feature(CPU_FTRS_CELL)) +- dialect |= (PPC_OPCODE_CELL | PPC_OPCODE_ALTIVEC); ++ if (cpu_has_feature(CPU_FTR_TM)) ++ dialect |= PPC_OPCODE_HTM; + +- if (cpu_has_feature(CPU_FTRS_POWER6)) +- dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_ALTIVEC); ++ if (cpu_has_feature(CPU_FTR_ALTIVEC)) ++ dialect |= PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2; + +- if (cpu_has_feature(CPU_FTRS_POWER7)) +- dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 +- | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX); +- +- if (cpu_has_feature(CPU_FTRS_POWER8)) +- dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 +- | PPC_OPCODE_POWER8 | PPC_OPCODE_HTM +- | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 | PPC_OPCODE_VSX); +- +- if (cpu_has_feature(CPU_FTRS_POWER9)) +- dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 +- | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 | PPC_OPCODE_HTM +- | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 +- | PPC_OPCODE_VSX | PPC_OPCODE_VSX3); ++ if (cpu_has_feature(CPU_FTR_VSX)) ++ dialect |= PPC_OPCODE_VSX | PPC_OPCODE_VSX3; + + /* Get the major opcode of the insn. */ + opcode = NULL; +-- +2.43.0 + diff --git a/queue-5.10/pwm-stm32-always-do-lazy-disabling.patch b/queue-5.10/pwm-stm32-always-do-lazy-disabling.patch new file mode 100644 index 00000000000..fffaabdbf89 --- /dev/null +++ b/queue-5.10/pwm-stm32-always-do-lazy-disabling.patch @@ -0,0 +1,56 @@ +From bfbfdc43469cf2fe5a46e62066ce190f92a19d4c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Jul 2024 13:00:06 +0200 +Subject: pwm: stm32: Always do lazy disabling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit 7346e7a058a2c9aa9ff1cc699c7bf18a402d9f84 ] + +When the state changes from enabled to disabled, polarity, duty_cycle +and period are not configured in hardware and TIM_CCER_CCxE is just +cleared. However if the state changes from one disabled state to +another, all parameters are written to hardware because the early exit +from stm32_pwm_apply() is only taken if the pwm is currently enabled. + +This yields surprises like: Applying + + { .period = 1, .duty_cycle = 0, .enabled = false } + +succeeds if the pwm is initially on, but fails if it's already off +because 1 is a too small period. + +Update the check for lazy disable to always exit early if the target +state is disabled, no matter what is currently configured. + +Fixes: 7edf7369205b ("pwm: Add driver for STM32 plaftorm") +Signed-off-by: Uwe Kleine-König +Link: https://lore.kernel.org/r/20240703110010.672654-2-u.kleine-koenig@baylibre.com +Signed-off-by: Uwe Kleine-König +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-stm32.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/pwm/pwm-stm32.c b/drivers/pwm/pwm-stm32.c +index 3e5f1b622af89..7146b3f6755bc 100644 +--- a/drivers/pwm/pwm-stm32.c ++++ b/drivers/pwm/pwm-stm32.c +@@ -452,8 +452,9 @@ static int stm32_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, + + enabled = pwm->state.enabled; + +- if (enabled && !state->enabled) { +- stm32_pwm_disable(priv, pwm->hwpwm); ++ if (!state->enabled) { ++ if (enabled) ++ stm32_pwm_disable(priv, pwm->hwpwm); + return 0; + } + +-- +2.43.0 + diff --git a/queue-5.10/qed-improve-the-stack-space-of-filter_config.patch b/queue-5.10/qed-improve-the-stack-space-of-filter_config.patch new file mode 100644 index 00000000000..b29a6a841ae --- /dev/null +++ b/queue-5.10/qed-improve-the-stack-space-of-filter_config.patch @@ -0,0 +1,217 @@ +From e4d2d8612de707a7c62f973a4e3f1ddb0f8fe32b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Sep 2021 10:50:24 +0300 +Subject: qed: Improve the stack space of filter_config() + +From: Shai Malin + +[ Upstream commit f55e36d5ab76c3097ff36ecea60b91c6b0d80fc8 ] + +As it was reported and discussed in: https://lore.kernel.org/lkml/CAHk-=whF9F89vsfH8E9TGc0tZA-yhzi2Di8wOtquNB5vRkFX5w@mail.gmail.com/ +This patch improves the stack space of qede_config_rx_mode() by +splitting filter_config() to 3 functions and removing the +union qed_filter_type_params. + +Reported-by: Naresh Kamboju +Signed-off-by: Ariel Elior +Signed-off-by: Shai Malin +Signed-off-by: David S. Miller +Stable-dep-of: b5d14b0c6716 ("wifi: virt_wifi: avoid reporting connection success with wrong SSID") +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/qlogic/qed/qed_l2.c | 23 ++------- + .../net/ethernet/qlogic/qede/qede_filter.c | 47 ++++++++----------- + include/linux/qed/qed_eth_if.h | 21 ++++----- + 3 files changed, 30 insertions(+), 61 deletions(-) + +diff --git a/drivers/net/ethernet/qlogic/qed/qed_l2.c b/drivers/net/ethernet/qlogic/qed/qed_l2.c +index 0157bcd2efffa..198022bc1f941 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_l2.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_l2.c +@@ -2762,25 +2762,6 @@ static int qed_configure_filter_mcast(struct qed_dev *cdev, + return qed_filter_mcast_cmd(cdev, &mcast, QED_SPQ_MODE_CB, NULL); + } + +-static int qed_configure_filter(struct qed_dev *cdev, +- struct qed_filter_params *params) +-{ +- enum qed_filter_rx_mode_type accept_flags; +- +- switch (params->type) { +- case QED_FILTER_TYPE_UCAST: +- return qed_configure_filter_ucast(cdev, ¶ms->filter.ucast); +- case QED_FILTER_TYPE_MCAST: +- return qed_configure_filter_mcast(cdev, ¶ms->filter.mcast); +- case QED_FILTER_TYPE_RX_MODE: +- accept_flags = params->filter.accept_flags; +- return qed_configure_filter_rx_mode(cdev, accept_flags); +- default: +- DP_NOTICE(cdev, "Unknown filter type %d\n", (int)params->type); +- return -EINVAL; +- } +-} +- + static int qed_configure_arfs_searcher(struct qed_dev *cdev, + enum qed_filter_config_mode mode) + { +@@ -2903,7 +2884,9 @@ static const struct qed_eth_ops qed_eth_ops_pass = { + .q_rx_stop = &qed_stop_rxq, + .q_tx_start = &qed_start_txq, + .q_tx_stop = &qed_stop_txq, +- .filter_config = &qed_configure_filter, ++ .filter_config_rx_mode = &qed_configure_filter_rx_mode, ++ .filter_config_ucast = &qed_configure_filter_ucast, ++ .filter_config_mcast = &qed_configure_filter_mcast, + .fastpath_stop = &qed_fastpath_stop, + .eth_cqe_completion = &qed_fp_cqe_completion, + .get_vport_stats = &qed_get_vport_stats, +diff --git a/drivers/net/ethernet/qlogic/qede/qede_filter.c b/drivers/net/ethernet/qlogic/qede/qede_filter.c +index 5f4962d90022e..f4385466418ce 100644 +--- a/drivers/net/ethernet/qlogic/qede/qede_filter.c ++++ b/drivers/net/ethernet/qlogic/qede/qede_filter.c +@@ -619,30 +619,28 @@ static int qede_set_ucast_rx_mac(struct qede_dev *edev, + enum qed_filter_xcast_params_type opcode, + unsigned char mac[ETH_ALEN]) + { +- struct qed_filter_params filter_cmd; ++ struct qed_filter_ucast_params ucast; + +- memset(&filter_cmd, 0, sizeof(filter_cmd)); +- filter_cmd.type = QED_FILTER_TYPE_UCAST; +- filter_cmd.filter.ucast.type = opcode; +- filter_cmd.filter.ucast.mac_valid = 1; +- ether_addr_copy(filter_cmd.filter.ucast.mac, mac); ++ memset(&ucast, 0, sizeof(ucast)); ++ ucast.type = opcode; ++ ucast.mac_valid = 1; ++ ether_addr_copy(ucast.mac, mac); + +- return edev->ops->filter_config(edev->cdev, &filter_cmd); ++ return edev->ops->filter_config_ucast(edev->cdev, &ucast); + } + + static int qede_set_ucast_rx_vlan(struct qede_dev *edev, + enum qed_filter_xcast_params_type opcode, + u16 vid) + { +- struct qed_filter_params filter_cmd; ++ struct qed_filter_ucast_params ucast; + +- memset(&filter_cmd, 0, sizeof(filter_cmd)); +- filter_cmd.type = QED_FILTER_TYPE_UCAST; +- filter_cmd.filter.ucast.type = opcode; +- filter_cmd.filter.ucast.vlan_valid = 1; +- filter_cmd.filter.ucast.vlan = vid; ++ memset(&ucast, 0, sizeof(ucast)); ++ ucast.type = opcode; ++ ucast.vlan_valid = 1; ++ ucast.vlan = vid; + +- return edev->ops->filter_config(edev->cdev, &filter_cmd); ++ return edev->ops->filter_config_ucast(edev->cdev, &ucast); + } + + static int qede_config_accept_any_vlan(struct qede_dev *edev, bool action) +@@ -1057,18 +1055,17 @@ static int qede_set_mcast_rx_mac(struct qede_dev *edev, + enum qed_filter_xcast_params_type opcode, + unsigned char *mac, int num_macs) + { +- struct qed_filter_params filter_cmd; ++ struct qed_filter_mcast_params mcast; + int i; + +- memset(&filter_cmd, 0, sizeof(filter_cmd)); +- filter_cmd.type = QED_FILTER_TYPE_MCAST; +- filter_cmd.filter.mcast.type = opcode; +- filter_cmd.filter.mcast.num = num_macs; ++ memset(&mcast, 0, sizeof(mcast)); ++ mcast.type = opcode; ++ mcast.num = num_macs; + + for (i = 0; i < num_macs; i++, mac += ETH_ALEN) +- ether_addr_copy(filter_cmd.filter.mcast.mac[i], mac); ++ ether_addr_copy(mcast.mac[i], mac); + +- return edev->ops->filter_config(edev->cdev, &filter_cmd); ++ return edev->ops->filter_config_mcast(edev->cdev, &mcast); + } + + int qede_set_mac_addr(struct net_device *ndev, void *p) +@@ -1194,7 +1191,6 @@ void qede_config_rx_mode(struct net_device *ndev) + { + enum qed_filter_rx_mode_type accept_flags; + struct qede_dev *edev = netdev_priv(ndev); +- struct qed_filter_params rx_mode; + unsigned char *uc_macs, *temp; + struct netdev_hw_addr *ha; + int rc, uc_count; +@@ -1220,10 +1216,6 @@ void qede_config_rx_mode(struct net_device *ndev) + + netif_addr_unlock_bh(ndev); + +- /* Configure the struct for the Rx mode */ +- memset(&rx_mode, 0, sizeof(struct qed_filter_params)); +- rx_mode.type = QED_FILTER_TYPE_RX_MODE; +- + /* Remove all previous unicast secondary macs and multicast macs + * (configure / leave the primary mac) + */ +@@ -1271,8 +1263,7 @@ void qede_config_rx_mode(struct net_device *ndev) + qede_config_accept_any_vlan(edev, false); + } + +- rx_mode.filter.accept_flags = accept_flags; +- edev->ops->filter_config(edev->cdev, &rx_mode); ++ edev->ops->filter_config_rx_mode(edev->cdev, accept_flags); + out: + kfree(uc_macs); + } +diff --git a/include/linux/qed/qed_eth_if.h b/include/linux/qed/qed_eth_if.h +index 812a4d7511633..4df0bf0a0864e 100644 +--- a/include/linux/qed/qed_eth_if.h ++++ b/include/linux/qed/qed_eth_if.h +@@ -145,12 +145,6 @@ struct qed_filter_mcast_params { + unsigned char mac[64][ETH_ALEN]; + }; + +-union qed_filter_type_params { +- enum qed_filter_rx_mode_type accept_flags; +- struct qed_filter_ucast_params ucast; +- struct qed_filter_mcast_params mcast; +-}; +- + enum qed_filter_type { + QED_FILTER_TYPE_UCAST, + QED_FILTER_TYPE_MCAST, +@@ -158,11 +152,6 @@ enum qed_filter_type { + QED_MAX_FILTER_TYPES, + }; + +-struct qed_filter_params { +- enum qed_filter_type type; +- union qed_filter_type_params filter; +-}; +- + struct qed_tunn_params { + u16 vxlan_port; + u8 update_vxlan_port; +@@ -314,8 +303,14 @@ struct qed_eth_ops { + + int (*q_tx_stop)(struct qed_dev *cdev, u8 rss_id, void *handle); + +- int (*filter_config)(struct qed_dev *cdev, +- struct qed_filter_params *params); ++ int (*filter_config_rx_mode)(struct qed_dev *cdev, ++ enum qed_filter_rx_mode_type type); ++ ++ int (*filter_config_ucast)(struct qed_dev *cdev, ++ struct qed_filter_ucast_params *params); ++ ++ int (*filter_config_mcast)(struct qed_dev *cdev, ++ struct qed_filter_mcast_params *params); + + int (*fastpath_stop)(struct qed_dev *cdev); + +-- +2.43.0 + diff --git a/queue-5.10/rdma-device-return-error-earlier-if-port-in-not-vali.patch b/queue-5.10/rdma-device-return-error-earlier-if-port-in-not-vali.patch new file mode 100644 index 00000000000..129ba6f8ae3 --- /dev/null +++ b/queue-5.10/rdma-device-return-error-earlier-if-port-in-not-vali.patch @@ -0,0 +1,46 @@ +From de5f8f409d81e03a9ff4427f28d800844d3767e4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 24 Jun 2024 16:24:32 +0300 +Subject: RDMA/device: Return error earlier if port in not valid + +From: Leon Romanovsky + +[ Upstream commit 917918f57a7b139c043e78c502876f2c286f4f0a ] + +There is no need to allocate port data if port provided is not valid. + +Fixes: c2261dd76b54 ("RDMA/device: Add ib_device_set_netdev() as an alternative to get_netdev") +Link: https://lore.kernel.org/r/022047a8b16988fc88d4426da50bf60a4833311b.1719235449.git.leon@kernel.org +Signed-off-by: Leon Romanovsky +Signed-off-by: Sasha Levin +--- + drivers/infiniband/core/device.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c +index 94c3bad72cc59..3848fe0449a4c 100644 +--- a/drivers/infiniband/core/device.c ++++ b/drivers/infiniband/core/device.c +@@ -2106,6 +2106,9 @@ int ib_device_set_netdev(struct ib_device *ib_dev, struct net_device *ndev, + unsigned long flags; + int ret; + ++ if (!rdma_is_port_valid(ib_dev, port)) ++ return -EINVAL; ++ + /* + * Drivers wish to call this before ib_register_driver, so we have to + * setup the port data early. +@@ -2114,9 +2117,6 @@ int ib_device_set_netdev(struct ib_device *ib_dev, struct net_device *ndev, + if (ret) + return ret; + +- if (!rdma_is_port_valid(ib_dev, port)) +- return -EINVAL; +- + pdata = &ib_dev->port_data[port]; + spin_lock_irqsave(&pdata->netdev_lock, flags); + old_ndev = rcu_dereference_protected( +-- +2.43.0 + diff --git a/queue-5.10/rdma-hns-fix-missing-pagesize-and-alignment-check-in.patch b/queue-5.10/rdma-hns-fix-missing-pagesize-and-alignment-check-in.patch new file mode 100644 index 00000000000..238b85ad048 --- /dev/null +++ b/queue-5.10/rdma-hns-fix-missing-pagesize-and-alignment-check-in.patch @@ -0,0 +1,64 @@ +From d424af5787e4a4f6d6db7a0c3de52c6caee442ec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jul 2024 21:37:01 +0800 +Subject: RDMA/hns: Fix missing pagesize and alignment check in FRMR + +From: Chengchang Tang + +[ Upstream commit d387d4b54eb84208bd4ca13572e106851d0a0819 ] + +The offset requires 128B alignment and the page size ranges from +4K to 128M. + +Fixes: 68a997c5d28c ("RDMA/hns: Add FRMR support for hip08") +Signed-off-by: Chengchang Tang +Signed-off-by: Junxian Huang +Link: https://lore.kernel.org/r/20240710133705.896445-5-huangjunxian6@hisilicon.com +Signed-off-by: Leon Romanovsky +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/hns/hns_roce_device.h | 4 ++++ + drivers/infiniband/hw/hns/hns_roce_mr.c | 5 +++++ + 2 files changed, 9 insertions(+) + +diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h +index fe54e09eeccdd..72a41f34ecfd5 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_device.h ++++ b/drivers/infiniband/hw/hns/hns_roce_device.h +@@ -98,6 +98,7 @@ + #define MR_TYPE_DMA 0x03 + + #define HNS_ROCE_FRMR_MAX_PA 512 ++#define HNS_ROCE_FRMR_ALIGN_SIZE 128 + + #define PKEY_ID 0xffff + #define GUID_LEN 8 +@@ -267,6 +268,9 @@ enum { + #define HNS_HW_PAGE_SHIFT 12 + #define HNS_HW_PAGE_SIZE (1 << HNS_HW_PAGE_SHIFT) + ++#define HNS_HW_MAX_PAGE_SHIFT 27 ++#define HNS_HW_MAX_PAGE_SIZE (1 << HNS_HW_MAX_PAGE_SHIFT) ++ + struct hns_roce_uar { + u64 pfn; + unsigned long index; +diff --git a/drivers/infiniband/hw/hns/hns_roce_mr.c b/drivers/infiniband/hw/hns/hns_roce_mr.c +index c038ed7d94962..7e93c9b4a33f1 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_mr.c ++++ b/drivers/infiniband/hw/hns/hns_roce_mr.c +@@ -486,6 +486,11 @@ int hns_roce_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents, + struct hns_roce_mtr *mtr = &mr->pbl_mtr; + int ret, sg_num = 0; + ++ if (!IS_ALIGNED(*sg_offset, HNS_ROCE_FRMR_ALIGN_SIZE) || ++ ibmr->page_size < HNS_HW_PAGE_SIZE || ++ ibmr->page_size > HNS_HW_MAX_PAGE_SIZE) ++ return sg_num; ++ + mr->npages = 0; + mr->page_list = kvcalloc(mr->pbl_mtr.hem_cfg.buf_pg_count, + sizeof(dma_addr_t), GFP_KERNEL); +-- +2.43.0 + diff --git a/queue-5.10/rdma-mlx4-fix-truncated-output-warning-in-alias_guid.patch b/queue-5.10/rdma-mlx4-fix-truncated-output-warning-in-alias_guid.patch new file mode 100644 index 00000000000..31a90aa9eef --- /dev/null +++ b/queue-5.10/rdma-mlx4-fix-truncated-output-warning-in-alias_guid.patch @@ -0,0 +1,52 @@ +From 5cb04325991db3f282d6b3b1b8421fa616133339 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 16 Jun 2024 19:17:30 +0300 +Subject: RDMA/mlx4: Fix truncated output warning in alias_GUID.c +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Leon Romanovsky + +[ Upstream commit 5953e0647cec703ef436ead37fed48943507b433 ] + +drivers/infiniband/hw/mlx4/alias_GUID.c: In function ‘mlx4_ib_init_alias_guid_service’: +drivers/infiniband/hw/mlx4/alias_GUID.c:878:74: error: ‘%d’ directive +output may be truncated writing between 1 and 11 bytes into a region of +size 5 [-Werror=format-truncation=] + 878 | snprintf(alias_wq_name, sizeof alias_wq_name, "alias_guid%d", i); + | ^~ +drivers/infiniband/hw/mlx4/alias_GUID.c:878:63: note: directive argument in the range [-2147483641, 2147483646] + 878 | snprintf(alias_wq_name, sizeof alias_wq_name, "alias_guid%d", i); + | ^~~~~~~~~~~~~~ +drivers/infiniband/hw/mlx4/alias_GUID.c:878:17: note: ‘snprintf’ output +between 12 and 22 bytes into a destination of size 15 + 878 | snprintf(alias_wq_name, sizeof alias_wq_name, "alias_guid%d", i); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +cc1: all warnings being treated as errors + +Fixes: a0c64a17aba8 ("mlx4: Add alias_guid mechanism") +Link: https://lore.kernel.org/r/1951c9500109ca7e36dcd523f8a5f2d0d2a608d1.1718554641.git.leon@kernel.org +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/mlx4/alias_GUID.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/infiniband/hw/mlx4/alias_GUID.c b/drivers/infiniband/hw/mlx4/alias_GUID.c +index cca414ecfcd5a..05420e189ca90 100644 +--- a/drivers/infiniband/hw/mlx4/alias_GUID.c ++++ b/drivers/infiniband/hw/mlx4/alias_GUID.c +@@ -832,7 +832,7 @@ void mlx4_ib_destroy_alias_guid_service(struct mlx4_ib_dev *dev) + + int mlx4_ib_init_alias_guid_service(struct mlx4_ib_dev *dev) + { +- char alias_wq_name[15]; ++ char alias_wq_name[22]; + int ret = 0; + int i, j; + union ib_gid gid; +-- +2.43.0 + diff --git a/queue-5.10/rdma-mlx4-fix-truncated-output-warning-in-mad.c.patch b/queue-5.10/rdma-mlx4-fix-truncated-output-warning-in-mad.c.patch new file mode 100644 index 00000000000..7ae85b3a86f --- /dev/null +++ b/queue-5.10/rdma-mlx4-fix-truncated-output-warning-in-mad.c.patch @@ -0,0 +1,82 @@ +From 347a0ba04832e282993782c8f3360e5dd923ac5e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 16 Jun 2024 19:16:33 +0300 +Subject: RDMA/mlx4: Fix truncated output warning in mad.c +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Leon Romanovsky + +[ Upstream commit 0d2e6992fc956e3308cd5376c18567def4cb3967 ] + +Increase size of the name array to avoid truncated output warning. + +drivers/infiniband/hw/mlx4/mad.c: In function ‘mlx4_ib_alloc_demux_ctx’: +drivers/infiniband/hw/mlx4/mad.c:2197:47: error: ‘%d’ directive output +may be truncated writing between 1 and 11 bytes into a region of size 4 +[-Werror=format-truncation=] + 2197 | snprintf(name, sizeof(name), "mlx4_ibt%d", port); + | ^~ +drivers/infiniband/hw/mlx4/mad.c:2197:38: note: directive argument in +the range [-2147483645, 2147483647] + 2197 | snprintf(name, sizeof(name), "mlx4_ibt%d", port); + | ^~~~~~~~~~~~ +drivers/infiniband/hw/mlx4/mad.c:2197:9: note: ‘snprintf’ output between +10 and 20 bytes into a destination of size 12 + 2197 | snprintf(name, sizeof(name), "mlx4_ibt%d", port); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +drivers/infiniband/hw/mlx4/mad.c:2205:48: error: ‘%d’ directive output +may be truncated writing between 1 and 11 bytes into a region of size 3 +[-Werror=format-truncation=] + 2205 | snprintf(name, sizeof(name), "mlx4_ibwi%d", port); + | ^~ +drivers/infiniband/hw/mlx4/mad.c:2205:38: note: directive argument in +the range [-2147483645, 2147483647] + 2205 | snprintf(name, sizeof(name), "mlx4_ibwi%d", port); + | ^~~~~~~~~~~~~ +drivers/infiniband/hw/mlx4/mad.c:2205:9: note: ‘snprintf’ output between +11 and 21 bytes into a destination of size 12 + 2205 | snprintf(name, sizeof(name), "mlx4_ibwi%d", port); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +drivers/infiniband/hw/mlx4/mad.c:2213:48: error: ‘%d’ directive output +may be truncated writing between 1 and 11 bytes into a region of size 3 +[-Werror=format-truncation=] + 2213 | snprintf(name, sizeof(name), "mlx4_ibud%d", port); + | ^~ +drivers/infiniband/hw/mlx4/mad.c:2213:38: note: directive argument in +the range [-2147483645, 2147483647] + 2213 | snprintf(name, sizeof(name), "mlx4_ibud%d", port); + | ^~~~~~~~~~~~~ +drivers/infiniband/hw/mlx4/mad.c:2213:9: note: ‘snprintf’ output between +11 and 21 bytes into a destination of size 12 + 2213 | snprintf(name, sizeof(name), "mlx4_ibud%d", port); + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +cc1: all warnings being treated as errors +make[6]: *** [scripts/Makefile.build:244: drivers/infiniband/hw/mlx4/mad.o] Error 1 + +Fixes: fc06573dfaf8 ("IB/mlx4: Initialize SR-IOV IB support for slaves in master context") +Link: https://lore.kernel.org/r/f3798b3ce9a410257d7e1ec7c9e285f1352e256a.1718554569.git.leon@kernel.org +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/mlx4/mad.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c +index 8bd16474708fb..44ea25e825490 100644 +--- a/drivers/infiniband/hw/mlx4/mad.c ++++ b/drivers/infiniband/hw/mlx4/mad.c +@@ -2155,7 +2155,7 @@ static int mlx4_ib_alloc_demux_ctx(struct mlx4_ib_dev *dev, + struct mlx4_ib_demux_ctx *ctx, + int port) + { +- char name[12]; ++ char name[21]; + int ret = 0; + int i; + +-- +2.43.0 + diff --git a/queue-5.10/rdma-rxe-don-t-set-bth_ack_mask-for-uc-or-ud-qps.patch b/queue-5.10/rdma-rxe-don-t-set-bth_ack_mask-for-uc-or-ud-qps.patch new file mode 100644 index 00000000000..68cef764dd4 --- /dev/null +++ b/queue-5.10/rdma-rxe-don-t-set-bth_ack_mask-for-uc-or-ud-qps.patch @@ -0,0 +1,53 @@ +From 8c22337d29d8a59977cd63d687be9604077b7410 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 24 Jun 2024 10:03:48 +0800 +Subject: RDMA/rxe: Don't set BTH_ACK_MASK for UC or UD QPs + +From: Honggang LI + +[ Upstream commit 4adcaf969d77d3d3aa3871bbadc196258a38aec6 ] + +BTH_ACK_MASK bit is used to indicate that an acknowledge +(for this packet) should be scheduled by the responder. +Both UC and UD QPs are unacknowledged, so don't set +BTH_ACK_MASK for UC or UD QPs. + +Fixes: 8700e3e7c485 ("Soft RoCE driver") +Signed-off-by: Honggang LI +Link: https://lore.kernel.org/r/20240624020348.494338-1-honggangli@163.com +Reviewed-by: Zhu Yanjun +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/sw/rxe/rxe_req.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c +index 69238f856c677..a034aa8fc5ca5 100644 +--- a/drivers/infiniband/sw/rxe/rxe_req.c ++++ b/drivers/infiniband/sw/rxe/rxe_req.c +@@ -362,7 +362,7 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp, + int solicited; + u16 pkey; + u32 qp_num; +- int ack_req; ++ int ack_req = 0; + + /* length from start of bth to end of icrc */ + paylen = rxe_opcode[opcode].length + payload + pad + RXE_ICRC_SIZE; +@@ -396,8 +396,9 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp, + qp_num = (pkt->mask & RXE_DETH_MASK) ? ibwr->wr.ud.remote_qpn : + qp->attr.dest_qp_num; + +- ack_req = ((pkt->mask & RXE_END_MASK) || +- (qp->req.noack_pkts++ > RXE_MAX_PKT_PER_ACK)); ++ if (qp_type(qp) != IB_QPT_UD && qp_type(qp) != IB_QPT_UC) ++ ack_req = ((pkt->mask & RXE_END_MASK) || ++ (qp->req.noack_pkts++ > RXE_MAX_PKT_PER_ACK)); + if (ack_req) + qp->req.noack_pkts = 0; + +-- +2.43.0 + diff --git a/queue-5.10/revert-leds-led-core-fix-refcount-leak-in-of_led_get.patch b/queue-5.10/revert-leds-led-core-fix-refcount-leak-in-of_led_get.patch new file mode 100644 index 00000000000..50cb5049e7e --- /dev/null +++ b/queue-5.10/revert-leds-led-core-fix-refcount-leak-in-of_led_get.patch @@ -0,0 +1,84 @@ +From f729fe3fffef2504b175727e271d8afd9dd7fe7d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 25 Jun 2024 10:34:38 +0200 +Subject: Revert "leds: led-core: Fix refcount leak in of_led_get()" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Luca Ceresoli + +[ Upstream commit 940b27161afc6ec53fc66245a4fb3518394cdc92 ] + +This reverts commit da1afe8e6099980fe1e2fd7436dca284af9d3f29. + +Commit 699a8c7c4bd3 ("leds: Add of_led_get() and led_put()"), introduced in +5.5, added of_led_get() and led_put() but missed a put_device() in +led_put(), thus creating a leak in case the consumer device is removed. + +Arguably device removal was not very popular, so this went apparently +unnoticed until 2022. In January 2023 two different patches got merged to +fix the same bug: + + - commit da1afe8e6099 ("leds: led-core: Fix refcount leak in of_led_get()") + - commit 445110941eb9 ("leds: led-class: Add missing put_device() to led_put()") + +They fix the bug in two different ways, which creates no patch conflicts, +and both were merged in v6.2. The result is that now there is one more +put_device() than get_device()s, instead of one less. + +Arguably device removal is not very popular yet, so this apparently hasn't +been noticed as well up to now. But it blew up here while I'm working with +device tree overlay insertion and removal. The symptom is an apparently +unrelated list of oopses on device removal, with reasons: + + kernfs: can not remove 'uevent', no directory + kernfs: can not remove 'brightness', no directory + kernfs: can not remove 'max_brightness', no directory + ... + +Here sysfs fails removing attribute files, which is because the device name +changed and so the sysfs path. This is because the device name string got +corrupted, which is because it got freed too early and its memory reused. + +Different symptoms could appear in different use cases. + +Fix by removing one of the two fixes. + +The choice was to remove commit da1afe8e6099 because: + + * it is calling put_device() inside of_led_get() just after getting the + device, thus it is basically not refcounting the LED device at all + during its entire lifetime + * it does not add a corresponding put_device() in led_get(), so it fixes + only the OF case + +The other fix (445110941eb9) is adding the put_device() in led_put() so it +covers the entire lifetime, and it works even in the non-DT case. + +Fixes: da1afe8e6099 ("leds: led-core: Fix refcount leak in of_led_get()") +Co-developed-by: Hervé Codina +Signed-off-by: Hervé Codina +Signed-off-by: Luca Ceresoli +Link: https://lore.kernel.org/r/20240625-led-class-device-leak-v2-1-75fdccf47421@bootlin.com +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/leds/led-class.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c +index fcb9eee3b6097..e28a4bb716032 100644 +--- a/drivers/leds/led-class.c ++++ b/drivers/leds/led-class.c +@@ -236,7 +236,6 @@ struct led_classdev *of_led_get(struct device_node *np, int index) + + led_dev = class_find_device_by_of_node(leds_class, led_node); + of_node_put(led_node); +- put_device(led_dev); + + if (!led_dev) + return ERR_PTR(-EPROBE_DEFER); +-- +2.43.0 + diff --git a/queue-5.10/rtc-interface-add-rtc-offset-to-alarm-after-fix-up.patch b/queue-5.10/rtc-interface-add-rtc-offset-to-alarm-after-fix-up.patch new file mode 100644 index 00000000000..b183d44682a --- /dev/null +++ b/queue-5.10/rtc-interface-add-rtc-offset-to-alarm-after-fix-up.patch @@ -0,0 +1,60 @@ +From 8784ad286d93d23cda7c172bdb78d564adde6d38 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 19 Jun 2024 16:04:52 +0200 +Subject: rtc: interface: Add RTC offset to alarm after fix-up +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Csókás, Bence + +[ Upstream commit 463927a8902a9f22c3633960119410f57d4c8920 ] + +`rtc_add_offset()` is called by `__rtc_read_time()` +and `__rtc_read_alarm()` to add the RTC's offset to +the raw read-outs from the device drivers. However, +in the latter case, a fix-up algorithm is run if +the RTC device does not report a full `struct rtc_time` +alarm value. In that case, the offset was forgot to be +added. + +Fixes: fd6792bb022e ("rtc: fix alarm read and set offset") + +Signed-off-by: Csókás, Bence +Link: https://lore.kernel.org/r/20240619140451.2800578-1-csokas.bence@prolan.hu +Signed-off-by: Alexandre Belloni +Signed-off-by: Sasha Levin +--- + drivers/rtc/interface.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c +index 146056858135e..154ea5ae2c0c3 100644 +--- a/drivers/rtc/interface.c ++++ b/drivers/rtc/interface.c +@@ -274,10 +274,9 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) + return err; + + /* full-function RTCs won't have such missing fields */ +- if (rtc_valid_tm(&alarm->time) == 0) { +- rtc_add_offset(rtc, &alarm->time); +- return 0; +- } ++ err = rtc_valid_tm(&alarm->time); ++ if (!err) ++ goto done; + + /* get the "after" timestamp, to detect wrapped fields */ + err = rtc_read_time(rtc, &now); +@@ -379,6 +378,8 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) + if (err) + dev_warn(&rtc->dev, "invalid alarm value: %ptR\n", + &alarm->time); ++ else ++ rtc_add_offset(rtc, &alarm->time); + + return err; + } +-- +2.43.0 + diff --git a/queue-5.10/s390-mm-convert-gmap_make_secure-to-use-a-folio.patch b/queue-5.10/s390-mm-convert-gmap_make_secure-to-use-a-folio.patch new file mode 100644 index 00000000000..179b7f2aa78 --- /dev/null +++ b/queue-5.10/s390-mm-convert-gmap_make_secure-to-use-a-folio.patch @@ -0,0 +1,102 @@ +From dcf9963a3697f7116e800f41566d6271a3e4f9b4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Mar 2024 16:11:47 +0000 +Subject: s390/mm: Convert gmap_make_secure to use a folio + +From: Matthew Wilcox (Oracle) + +[ Upstream commit d35c34bb32f2cc4ec0b52e91ad7a8fcab55d7856 ] + +Remove uses of deprecated page APIs, and move the check for large +folios to here to avoid taking the folio lock if the folio is too large. +We could do better here by attempting to split the large folio, but I'll +leave that improvement for someone who can test it. + +Acked-by: Claudio Imbrenda +Signed-off-by: Matthew Wilcox (Oracle) +Link: https://lore.kernel.org/r/20240322161149.2327518-3-willy@infradead.org +Signed-off-by: Alexander Gordeev +Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference") +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/uv.c | 27 ++++++++++++++------------- + 1 file changed, 14 insertions(+), 13 deletions(-) + +diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c +index c99b7f9de1e1f..8c73d4901e145 100644 +--- a/arch/s390/kernel/uv.c ++++ b/arch/s390/kernel/uv.c +@@ -213,13 +213,10 @@ static int expected_folio_refs(struct folio *folio) + return res; + } + +-static int make_page_secure(struct page *page, struct uv_cb_header *uvcb) ++static int make_folio_secure(struct folio *folio, struct uv_cb_header *uvcb) + { +- struct folio *folio = page_folio(page); + int expected, cc = 0; + +- if (folio_test_large(folio)) +- return -EINVAL; + if (folio_test_writeback(folio)) + return -EAGAIN; + expected = expected_folio_refs(folio); +@@ -285,7 +282,7 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb) + bool local_drain = false; + spinlock_t *ptelock; + unsigned long uaddr; +- struct page *page; ++ struct folio *folio; + pte_t *ptep; + int rc; + +@@ -312,15 +309,19 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb) + rc = -ENXIO; + ptep = get_locked_pte(gmap->mm, uaddr, &ptelock); + if (pte_present(*ptep) && !(pte_val(*ptep) & _PAGE_INVALID) && pte_write(*ptep)) { +- page = pte_page(*ptep); ++ folio = page_folio(pte_page(*ptep)); ++ rc = -EINVAL; ++ if (folio_test_large(folio)) ++ goto unlock; + rc = -EAGAIN; +- if (trylock_page(page)) { ++ if (folio_trylock(folio)) { + if (should_export_before_import(uvcb, gmap->mm)) +- uv_convert_from_secure(page_to_phys(page)); +- rc = make_page_secure(page, uvcb); +- unlock_page(page); ++ uv_convert_from_secure(PFN_PHYS(folio_pfn(folio))); ++ rc = make_folio_secure(folio, uvcb); ++ folio_unlock(folio); + } + } ++unlock: + pte_unmap_unlock(ptep, ptelock); + out: + mmap_read_unlock(gmap->mm); +@@ -330,10 +331,10 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb) + * If we are here because the UVC returned busy or partial + * completion, this is just a useless check, but it is safe. + */ +- wait_on_page_writeback(page); ++ folio_wait_writeback(folio); + } else if (rc == -EBUSY) { + /* +- * If we have tried a local drain and the page refcount ++ * If we have tried a local drain and the folio refcount + * still does not match our expected safe value, try with a + * system wide drain. This is needed if the pagevecs holding + * the page are on a different CPU. +@@ -344,7 +345,7 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb) + return -EAGAIN; + } + /* +- * We are here if the page refcount does not match the ++ * We are here if the folio refcount does not match the + * expected safe value. The main culprits are usually + * pagevecs. With lru_add_drain() we drain the pagevecs + * on the local CPU so that hopefully the refcount will +-- +2.43.0 + diff --git a/queue-5.10/s390-mm-convert-make_page_secure-to-use-a-folio.patch b/queue-5.10/s390-mm-convert-make_page_secure-to-use-a-folio.patch new file mode 100644 index 00000000000..669f2ce1351 --- /dev/null +++ b/queue-5.10/s390-mm-convert-make_page_secure-to-use-a-folio.patch @@ -0,0 +1,93 @@ +From 50313569a6656a37f839809b0cffc30e85721e4b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Mar 2024 16:11:46 +0000 +Subject: s390/mm: Convert make_page_secure to use a folio + +From: Matthew Wilcox (Oracle) + +[ Upstream commit 259e660d91d0e7261ae0ee37bb37266d6006a546 ] + +These page APIs are deprecated, so convert the incoming page to a folio +and use the folio APIs instead. The ultravisor API cannot handle large +folios, so return -EINVAL if one has slipped through. + +Acked-by: Claudio Imbrenda +Signed-off-by: Matthew Wilcox (Oracle) +Link: https://lore.kernel.org/r/20240322161149.2327518-2-willy@infradead.org +Signed-off-by: Alexander Gordeev +Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference") +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/uv.c | 29 ++++++++++++++++------------- + 1 file changed, 16 insertions(+), 13 deletions(-) + +diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c +index 6abf73e832445..c99b7f9de1e1f 100644 +--- a/arch/s390/kernel/uv.c ++++ b/arch/s390/kernel/uv.c +@@ -193,21 +193,21 @@ int uv_convert_owned_from_secure(unsigned long paddr) + } + + /* +- * Calculate the expected ref_count for a page that would otherwise have no ++ * Calculate the expected ref_count for a folio that would otherwise have no + * further pins. This was cribbed from similar functions in other places in + * the kernel, but with some slight modifications. We know that a secure +- * page can not be a huge page for example. ++ * folio can not be a large folio, for example. + */ +-static int expected_page_refs(struct page *page) ++static int expected_folio_refs(struct folio *folio) + { + int res; + +- res = page_mapcount(page); +- if (PageSwapCache(page)) { ++ res = folio_mapcount(folio); ++ if (folio_test_swapcache(folio)) { + res++; +- } else if (page_mapping(page)) { ++ } else if (folio_mapping(folio)) { + res++; +- if (page_has_private(page)) ++ if (folio->private) + res++; + } + return res; +@@ -215,14 +215,17 @@ static int expected_page_refs(struct page *page) + + static int make_page_secure(struct page *page, struct uv_cb_header *uvcb) + { ++ struct folio *folio = page_folio(page); + int expected, cc = 0; + +- if (PageWriteback(page)) ++ if (folio_test_large(folio)) ++ return -EINVAL; ++ if (folio_test_writeback(folio)) + return -EAGAIN; +- expected = expected_page_refs(page); +- if (!page_ref_freeze(page, expected)) ++ expected = expected_folio_refs(folio); ++ if (!folio_ref_freeze(folio, expected)) + return -EBUSY; +- set_bit(PG_arch_1, &page->flags); ++ set_bit(PG_arch_1, &folio->flags); + /* + * If the UVC does not succeed or fail immediately, we don't want to + * loop for long, or we might get stall notifications. +@@ -232,9 +235,9 @@ static int make_page_secure(struct page *page, struct uv_cb_header *uvcb) + * -EAGAIN and we let the callers deal with it. + */ + cc = __uv_call(0, (u64)uvcb); +- page_ref_unfreeze(page, expected); ++ folio_ref_unfreeze(folio, expected); + /* +- * Return -ENXIO if the page was not mapped, -EINVAL for other errors. ++ * Return -ENXIO if the folio was not mapped, -EINVAL for other errors. + * If busy or partially completed, return -EAGAIN. + */ + if (cc == UVC_CC_OK) +-- +2.43.0 + diff --git a/queue-5.10/s390-uv-don-t-call-folio_wait_writeback-without-a-fo.patch b/queue-5.10/s390-uv-don-t-call-folio_wait_writeback-without-a-fo.patch new file mode 100644 index 00000000000..267637c6969 --- /dev/null +++ b/queue-5.10/s390-uv-don-t-call-folio_wait_writeback-without-a-fo.patch @@ -0,0 +1,53 @@ +From a9da14f5b6e51ae2c623ec5fedb06b5c50eb4398 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 May 2024 20:29:46 +0200 +Subject: s390/uv: Don't call folio_wait_writeback() without a folio reference + +From: David Hildenbrand + +[ Upstream commit 3f29f6537f54d74e64bac0a390fb2e26da25800d ] + +folio_wait_writeback() requires that no spinlocks are held and that +a folio reference is held, as documented. After we dropped the PTL, the +folio could get freed concurrently. So grab a temporary reference. + +Fixes: 214d9bbcd3a6 ("s390/mm: provide memory management functions for protected KVM guests") +Reviewed-by: Claudio Imbrenda +Signed-off-by: David Hildenbrand +Link: https://lore.kernel.org/r/20240508182955.358628-2-david@redhat.com +Signed-off-by: Heiko Carstens +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/uv.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c +index 8c73d4901e145..03a8a9a52186a 100644 +--- a/arch/s390/kernel/uv.c ++++ b/arch/s390/kernel/uv.c +@@ -320,6 +320,13 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb) + rc = make_folio_secure(folio, uvcb); + folio_unlock(folio); + } ++ ++ /* ++ * Once we drop the PTL, the folio may get unmapped and ++ * freed immediately. We need a temporary reference. ++ */ ++ if (rc == -EAGAIN) ++ folio_get(folio); + } + unlock: + pte_unmap_unlock(ptep, ptelock); +@@ -332,6 +339,7 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb) + * completion, this is just a useless check, but it is safe. + */ + folio_wait_writeback(folio); ++ folio_put(folio); + } else if (rc == -EBUSY) { + /* + * If we have tried a local drain and the folio refcount +-- +2.43.0 + diff --git a/queue-5.10/saa7134-unchecked-i2c_transfer-function-result-fixed.patch b/queue-5.10/saa7134-unchecked-i2c_transfer-function-result-fixed.patch new file mode 100644 index 00000000000..4b0d5f817e7 --- /dev/null +++ b/queue-5.10/saa7134-unchecked-i2c_transfer-function-result-fixed.patch @@ -0,0 +1,51 @@ +From 0bab7de4c0c8721784e759681d88e68d8ac76742 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 16 Feb 2024 15:40:06 +0300 +Subject: saa7134: Unchecked i2c_transfer function result fixed + +From: Aleksandr Burakov + +[ Upstream commit 9d8683b3fd93f0e378f24dc3d9604e5d7d3e0a17 ] + +Return value of function 'i2c_transfer' is not checked that +may cause undefined behaviour. + +Found by Linux Verification Center (linuxtesting.org) with SVACE. + +Fixes: 2cf36ac44730 ("[PATCH] v4l: 656: added support for the following cards") +Signed-off-by: Aleksandr Burakov +Signed-off-by: Hans Verkuil +Signed-off-by: Sasha Levin +--- + drivers/media/pci/saa7134/saa7134-dvb.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/drivers/media/pci/saa7134/saa7134-dvb.c b/drivers/media/pci/saa7134/saa7134-dvb.c +index f359cd5c006a7..c786b83a69d2b 100644 +--- a/drivers/media/pci/saa7134/saa7134-dvb.c ++++ b/drivers/media/pci/saa7134/saa7134-dvb.c +@@ -466,7 +466,9 @@ static int philips_europa_tuner_sleep(struct dvb_frontend *fe) + /* switch the board to analog mode */ + if (fe->ops.i2c_gate_ctrl) + fe->ops.i2c_gate_ctrl(fe, 1); +- i2c_transfer(&dev->i2c_adap, &analog_msg, 1); ++ if (i2c_transfer(&dev->i2c_adap, &analog_msg, 1) != 1) ++ return -EIO; ++ + return 0; + } + +@@ -1018,7 +1020,9 @@ static int md8800_set_voltage2(struct dvb_frontend *fe, + else + wbuf[1] = rbuf & 0xef; + msg[0].len = 2; +- i2c_transfer(&dev->i2c_adap, msg, 1); ++ if (i2c_transfer(&dev->i2c_adap, msg, 1) != 1) ++ return -EIO; ++ + return 0; + } + +-- +2.43.0 + diff --git a/queue-5.10/selftests-bpf-check-length-of-recv-in-test_sockmap.patch b/queue-5.10/selftests-bpf-check-length-of-recv-in-test_sockmap.patch new file mode 100644 index 00000000000..86b01d07f66 --- /dev/null +++ b/queue-5.10/selftests-bpf-check-length-of-recv-in-test_sockmap.patch @@ -0,0 +1,40 @@ +From 09faeb481ab2a499381294e16cf8c85ef4bc18c1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 23 May 2024 14:50:03 +0800 +Subject: selftests/bpf: Check length of recv in test_sockmap + +From: Geliang Tang + +[ Upstream commit de1b5ea789dc28066cc8dc634b6825bd6148f38b ] + +The value of recv in msg_loop may be negative, like EWOULDBLOCK, so it's +necessary to check if it is positive before accumulating it to bytes_recvd. + +Fixes: 16962b2404ac ("bpf: sockmap, add selftests") +Signed-off-by: Geliang Tang +Signed-off-by: Daniel Borkmann +Tested-by: Jakub Sitnicki +Acked-by: John Fastabend +Link: https://lore.kernel.org/bpf/5172563f7c7b2a2e953cef02e89fc34664a7b190.1716446893.git.tanggeliang@kylinos.cn +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/bpf/test_sockmap.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/bpf/test_sockmap.c b/tools/testing/selftests/bpf/test_sockmap.c +index daf848258410e..61be5993416e9 100644 +--- a/tools/testing/selftests/bpf/test_sockmap.c ++++ b/tools/testing/selftests/bpf/test_sockmap.c +@@ -663,7 +663,8 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt, + } + } + +- s->bytes_recvd += recv; ++ if (recv > 0) ++ s->bytes_recvd += recv; + + if (data) { + int chunk_sz = opt->sendpage ? +-- +2.43.0 + diff --git a/queue-5.10/selftests-bpf-close-fd-in-error-path-in-drop_on_reus.patch b/queue-5.10/selftests-bpf-close-fd-in-error-path-in-drop_on_reus.patch new file mode 100644 index 00000000000..98e09080f82 --- /dev/null +++ b/queue-5.10/selftests-bpf-close-fd-in-error-path-in-drop_on_reus.patch @@ -0,0 +1,40 @@ +From 70f73fd411a68bd8f9bdad6897c612339c3be3d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Jul 2024 17:16:19 +0800 +Subject: selftests/bpf: Close fd in error path in drop_on_reuseport + +From: Geliang Tang + +[ Upstream commit adae187ebedcd95d02f045bc37dfecfd5b29434b ] + +In the error path when update_lookup_map() fails in drop_on_reuseport in +prog_tests/sk_lookup.c, "server1", the fd of server 1, should be closed. +This patch fixes this by using "goto close_srv1" lable instead of "detach" +to close "server1" in this case. + +Fixes: 0ab5539f8584 ("selftests/bpf: Tests for BPF_SK_LOOKUP attach point") +Acked-by: Eduard Zingerman +Signed-off-by: Geliang Tang +Link: https://lore.kernel.org/r/86aed33b4b0ea3f04497c757845cff7e8e621a2d.1720515893.git.tanggeliang@kylinos.cn +Signed-off-by: Martin KaFai Lau +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/bpf/prog_tests/sk_lookup.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/bpf/prog_tests/sk_lookup.c b/tools/testing/selftests/bpf/prog_tests/sk_lookup.c +index b4c9f4a96ae4d..95a1d3ee55a78 100644 +--- a/tools/testing/selftests/bpf/prog_tests/sk_lookup.c ++++ b/tools/testing/selftests/bpf/prog_tests/sk_lookup.c +@@ -964,7 +964,7 @@ static void drop_on_reuseport(const struct test *t) + + err = update_lookup_map(t->sock_map, SERVER_A, server1); + if (err) +- goto detach; ++ goto close_srv1; + + /* second server on destination address we should never reach */ + server2 = make_server(t->sotype, t->connect_to.ip, t->connect_to.port, +-- +2.43.0 + diff --git a/queue-5.10/selftests-bpf-fix-prog-numbers-in-test_sockmap.patch b/queue-5.10/selftests-bpf-fix-prog-numbers-in-test_sockmap.patch new file mode 100644 index 00000000000..b8c0ffd2cb2 --- /dev/null +++ b/queue-5.10/selftests-bpf-fix-prog-numbers-in-test_sockmap.patch @@ -0,0 +1,78 @@ +From 26aa4be77d70bcfe4c94fba62b248375cb55a688 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 17 May 2024 14:21:46 +0800 +Subject: selftests/bpf: Fix prog numbers in test_sockmap + +From: Geliang Tang + +[ Upstream commit 6c8d7598dfed759bf1d9d0322b4c2b42eb7252d8 ] + +bpf_prog5 and bpf_prog7 are removed from progs/test_sockmap_kern.h in +commit d79a32129b21 ("bpf: Selftests, remove prints from sockmap tests"), +now there are only 9 progs in it, not 11: + + SEC("sk_skb1") + int bpf_prog1(struct __sk_buff *skb) + SEC("sk_skb2") + int bpf_prog2(struct __sk_buff *skb) + SEC("sk_skb3") + int bpf_prog3(struct __sk_buff *skb) + SEC("sockops") + int bpf_sockmap(struct bpf_sock_ops *skops) + SEC("sk_msg1") + int bpf_prog4(struct sk_msg_md *msg) + SEC("sk_msg2") + int bpf_prog6(struct sk_msg_md *msg) + SEC("sk_msg3") + int bpf_prog8(struct sk_msg_md *msg) + SEC("sk_msg4") + int bpf_prog9(struct sk_msg_md *msg) + SEC("sk_msg5") + int bpf_prog10(struct sk_msg_md *msg) + +This patch updates the array sizes of prog_fd[], prog_attach_type[] and +prog_type[] from 11 to 9 accordingly. + +Fixes: d79a32129b21 ("bpf: Selftests, remove prints from sockmap tests") +Signed-off-by: Geliang Tang +Signed-off-by: Andrii Nakryiko +Link: https://lore.kernel.org/bpf/9c10d9f974f07fcb354a43a8eca67acb2fafc587.1715926605.git.tanggeliang@kylinos.cn +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/bpf/test_sockmap.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/tools/testing/selftests/bpf/test_sockmap.c b/tools/testing/selftests/bpf/test_sockmap.c +index 85d57633c8b65..daf848258410e 100644 +--- a/tools/testing/selftests/bpf/test_sockmap.c ++++ b/tools/testing/selftests/bpf/test_sockmap.c +@@ -65,7 +65,7 @@ int passed; + int failed; + int map_fd[9]; + struct bpf_map *maps[9]; +-int prog_fd[11]; ++int prog_fd[9]; + + int txmsg_pass; + int txmsg_redir; +@@ -1708,8 +1708,6 @@ int prog_attach_type[] = { + BPF_SK_MSG_VERDICT, + BPF_SK_MSG_VERDICT, + BPF_SK_MSG_VERDICT, +- BPF_SK_MSG_VERDICT, +- BPF_SK_MSG_VERDICT, + }; + + int prog_type[] = { +@@ -1722,8 +1720,6 @@ int prog_type[] = { + BPF_PROG_TYPE_SK_MSG, + BPF_PROG_TYPE_SK_MSG, + BPF_PROG_TYPE_SK_MSG, +- BPF_PROG_TYPE_SK_MSG, +- BPF_PROG_TYPE_SK_MSG, + }; + + static int populate_progs(char *bpf_file) +-- +2.43.0 + diff --git a/queue-5.10/selftests-forwarding-devlink_lib-wait-for-udev-event.patch b/queue-5.10/selftests-forwarding-devlink_lib-wait-for-udev-event.patch new file mode 100644 index 00000000000..a3c73ae85db --- /dev/null +++ b/queue-5.10/selftests-forwarding-devlink_lib-wait-for-udev-event.patch @@ -0,0 +1,77 @@ +From a05d5e453e12159b609e8a4630de974808c58910 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Jul 2024 17:27:02 +0200 +Subject: selftests: forwarding: devlink_lib: Wait for udev events after + reloading + +From: Amit Cohen + +[ Upstream commit f67a90a0c8f5b3d0acc18f10650d90fec44775f9 ] + +Lately, an additional locking was added by commit c0a40097f0bc +("drivers: core: synchronize really_probe() and dev_uevent()"). The +locking protects dev_uevent() calling. This function is used to send +messages from the kernel to user space. Uevent messages notify user space +about changes in device states, such as when a device is added, removed, +or changed. These messages are used by udev (or other similar user-space +tools) to apply device-specific rules. + +After reloading devlink instance, udev events should be processed. This +locking causes a short delay of udev events handling. + +One example for useful udev rule is renaming ports. 'forwading.config' +can be configured to use names after udev rules are applied. Some tests run +devlink_reload() and immediately use the updated names. This worked before +the above mentioned commit was pushed, but now the delay of uevent messages +causes that devlink_reload() returns before udev events are handled and +tests fail. + +Adjust devlink_reload() to not assume that udev events are already +processed when devlink reload is done, instead, wait for udev events to +ensure they are processed before returning from the function. + +Without this patch: +TESTS='rif_mac_profile' ./resource_scale.sh +TEST: 'rif_mac_profile' 4 [ OK ] +sysctl: cannot stat /proc/sys/net/ipv6/conf/swp1/disable_ipv6: No such file or directory +sysctl: cannot stat /proc/sys/net/ipv6/conf/swp1/disable_ipv6: No such file or directory +sysctl: cannot stat /proc/sys/net/ipv6/conf/swp2/disable_ipv6: No such file or directory +sysctl: cannot stat /proc/sys/net/ipv6/conf/swp2/disable_ipv6: No such file or directory +Cannot find device "swp1" +Cannot find device "swp2" +TEST: setup_wait_dev (: Interface swp1 does not come up.) [FAIL] + +With this patch: +$ TESTS='rif_mac_profile' ./resource_scale.sh +TEST: 'rif_mac_profile' 4 [ OK ] +TEST: 'rif_mac_profile' overflow 5 [ OK ] + +This is relevant not only for this test. + +Fixes: bc7cbb1e9f4c ("selftests: forwarding: Add devlink_lib.sh") +Signed-off-by: Amit Cohen +Reviewed-by: Ido Schimmel +Signed-off-by: Petr Machata +Link: https://patch.msgid.link/89367666e04b38a8993027f1526801ca327ab96a.1720709333.git.petrm@nvidia.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/net/forwarding/devlink_lib.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tools/testing/selftests/net/forwarding/devlink_lib.sh b/tools/testing/selftests/net/forwarding/devlink_lib.sh +index 9c12c4fd3afc9..6edfd207e3240 100644 +--- a/tools/testing/selftests/net/forwarding/devlink_lib.sh ++++ b/tools/testing/selftests/net/forwarding/devlink_lib.sh +@@ -113,6 +113,8 @@ devlink_reload() + still_pending=$(devlink resource show "$DEVLINK_DEV" | \ + grep -c "size_new") + check_err $still_pending "Failed reload - There are still unset sizes" ++ ++ udevadm settle + } + + declare -A DEVLINK_ORIG +-- +2.43.0 + diff --git a/queue-5.10/series b/queue-5.10/series new file mode 100644 index 00000000000..6c6fcf861f3 --- /dev/null +++ b/queue-5.10/series @@ -0,0 +1,124 @@ +edac-skx_common-add-new-adxl-components-for-2-level-.patch +edac-i10nm-make-skx_common.o-a-separate-module.patch +platform-chrome-cros_ec_debugfs-fix-wrong-ec-message.patch +hfsplus-fix-to-avoid-false-alarm-of-circular-locking.patch +x86-of-return-consistent-error-type-from-x86_of_pci_.patch +x86-pci-intel_mid_pci-fix-pcibios_-return-code-handl.patch +x86-pci-xen-fix-pcibios_-return-code-handling.patch +x86-platform-iosf_mbi-convert-pcibios_-return-codes-.patch +hwmon-adt7475-fix-default-duty-on-fan-is-disabled.patch +pwm-stm32-always-do-lazy-disabling.patch +hwmon-max6697-fix-underflow-when-writing-limit-attri.patch +hwmon-max6697-fix-swapped-temp-1-8-critical-alarms.patch +arm64-dts-qcom-sdm845-add-power-domain-to-ufs-phy.patch +soc-qcom-rpmh-rsc-ensure-irqs-aren-t-disabled-by-rpm.patch +arm64-dts-qcom-msm8996-specify-ufs-core_clk-frequenc.patch +memory-fsl_ifc-make-fsl_ifc-config-visible-and-selec.patch +soc-qcom-pdr-protect-locator_addr-with-the-main-mute.patch +soc-qcom-pdr-fix-parsing-of-domains-lists.patch +arm64-dts-rockchip-increase-vop-clk-rate-on-rk3328.patch +arm-dts-imx6qdl-kontron-samx6i-move-phy-reset-into-p.patch +arm-dts-imx6qdl-kontron-samx6i-fix-phy-reset.patch +arm-dts-imx6qdl-kontron-samx6i-fix-board-reset.patch +arm-dts-imx6qdl-kontron-samx6i-fix-spi0-chip-selects.patch +arm-dts-imx6qdl-kontron-samx6i-fix-pcie-reset-polari.patch +arm64-dts-mediatek-mt8183-kukui-drop-bogus-output-en.patch +arm64-dts-mediatek-mt7622-fix-emmc-pinctrl-mux.patch +arm64-dts-amlogic-gx-correct-hdmi-clocks.patch +m68k-atari-fix-tt-bootup-freeze-unexpected-scu-inter.patch +x86-xen-convert-comma-to-semicolon.patch +m68k-cmpxchg-fix-return-value-for-default-case-in-__.patch +arm-pxa-spitz-use-gpio-descriptors-for-audio.patch +arm-spitz-fix-gpio-assignment-for-backlight.patch +firmware-turris-mox-rwtm-fix-checking-return-value-o.patch +firmware-turris-mox-rwtm-initialize-completion-befor.patch +wifi-brcmsmac-lcn-phy-code-is-used-for-bcm4313-2g-on.patch +selftests-bpf-fix-prog-numbers-in-test_sockmap.patch +net-esp-cleanup-esp_output_tail_tcp-in-case-of-unsup.patch +net-smc-allow-smc-d-1mb-dmb-allocations.patch +net-smc-set-rmb-s-sg_max_single_alloc-limitation-onl.patch +selftests-bpf-check-length-of-recv-in-test_sockmap.patch +lib-objagg-fix-general-protection-fault.patch +mlxsw-spectrum_acl_erp-fix-object-nesting-warning.patch +mlxsw-spectrum_acl_bloom_filter-make-mlxsw_sp_acl_bf.patch +mlxsw-spectrum_acl-fix-acl-scale-regression-and-firm.patch +ath11k-dp-stop-rx-pktlog-before-suspend.patch +wifi-ath11k-fix-wrong-handling-of-ccmp256-and-gcmp-c.patch +wifi-cfg80211-fix-typo-in-cfg80211_calculate_bitrate.patch +wifi-cfg80211-handle-2x996-ru-allocation-in-cfg80211.patch +net-fec-refactor-define-magic-constants.patch +net-fec-fix-fec_ecr_en1588-being-cleared-on-link-dow.patch +ipvs-avoid-unnecessary-calls-to-skb_is_gso_sctp.patch +netfilter-nf_tables-rise-cap-on-selinux-secmark-cont.patch +bpftool-mount-bpffs-when-pinmaps-path-not-under-the-.patch +perf-x86-intel-pt-fix-pt_topa_entry_for_page-address.patch +perf-fix-perf_aux_size-for-greater-than-32-bit-size.patch +perf-prevent-passing-zero-nr_pages-to-rb_alloc_aux.patch +qed-improve-the-stack-space-of-filter_config.patch +wifi-virt_wifi-avoid-reporting-connection-success-wi.patch +gss_krb5-fix-the-error-handling-path-for-crypto_sync.patch +wifi-virt_wifi-don-t-use-strlen-in-const-context.patch +selftests-bpf-close-fd-in-error-path-in-drop_on_reus.patch +bpf-annotate-btf-show-functions-with-__printf.patch +bna-adjust-name-buf-size-of-bna_tcb-and-bna_ccb-stru.patch +bpf-eliminate-remaining-make-w-1-warnings-in-kernel-.patch +selftests-forwarding-devlink_lib-wait-for-udev-event.patch +xdp-fix-invalid-wait-context-of-page_pool_destroy.patch +drm-panel-boe-tv101wum-nl6-if-prepare-fails-disable-.patch +drm-panel-boe-tv101wum-nl6-check-for-errors-on-the-n.patch +media-dvb-usb-fix-unexpected-infinite-loop-in-dvb_us.patch +media-imon-fix-race-getting-ictx-lock.patch +kvm-s390-pv-avoid-stalls-when-making-pages-secure.patch +kvm-s390-pv-properly-handle-page-flags-for-protected.patch +kvm-s390-pv-add-export-before-import.patch +kvm-s390-fix-race-in-gmap_make_secure.patch +s390-mm-convert-make_page_secure-to-use-a-folio.patch +s390-mm-convert-gmap_make_secure-to-use-a-folio.patch +s390-uv-don-t-call-folio_wait_writeback-without-a-fo.patch +saa7134-unchecked-i2c_transfer-function-result-fixed.patch +media-uvcvideo-allow-entity-defined-get_info-and-get.patch +media-uvcvideo-override-default-flags.patch +media-renesas-vsp1-fix-_irqsave-and-_irq-mix.patch +media-renesas-vsp1-store-rpf-partition-configuration.patch +leds-trigger-unregister-sysfs-attributes-before-call.patch +perf-report-fix-condition-in-sort__sym_cmp.patch +drm-etnaviv-fix-dma-direction-handling-for-cached-rw.patch +drm-qxl-add-check-for-drm_cvt_mode.patch +revert-leds-led-core-fix-refcount-leak-in-of_led_get.patch +ext4-fix-infinite-loop-when-replaying-fast_commit.patch +media-venus-flush-all-buffers-in-output-plane-stream.patch +mfd-omap-usb-tll-use-struct_size-to-allocate-tll.patch +xprtrdma-rename-frwr_release_mr.patch +xprtrdma-fix-rpcrdma_reqs_reset.patch +sunrpc-avoid-soft-lockup-when-transmitting-udp-to-re.patch +ext4-avoid-writing-unitialized-memory-to-disk-in-ea-.patch +sparc64-fix-incorrect-function-signature-and-add-pro.patch +sunrpc-fixup-gss_status-tracepoint-error-output.patch +pci-fix-resource-double-counting-on-remove-rescan.patch +coresight-fix-ref-leak-when-of_coresight_parse_endpo.patch +input-qt1050-handle-chip_id-reading-error.patch +rdma-mlx4-fix-truncated-output-warning-in-mad.c.patch +rdma-mlx4-fix-truncated-output-warning-in-alias_guid.patch +rdma-rxe-don-t-set-bth_ack_mask-for-uc-or-ud-qps.patch +asoc-max98088-check-for-clk_prepare_enable-error.patch +mtd-make-mtd_test.c-a-separate-module.patch +rdma-device-return-error-earlier-if-port-in-not-vali.patch +input-elan_i2c-do-not-leave-interrupt-disabled-on-su.patch +mips-octeron-remove-source-file-executable-bit.patch +powerpc-xmon-fix-disassembly-cpu-feature-checks.patch +macintosh-therm_windtunnel-fix-module-unload.patch +rdma-hns-fix-missing-pagesize-and-alignment-check-in.patch +bnxt_re-fix-imm_data-endianness.patch +netfilter-ctnetlink-use-helper-function-to-calculate.patch +net-dsa-mv88e6xxx-limit-chip-wide-frame-size-config-.patch +net-dsa-b53-limit-chip-wide-jumbo-frame-config-to-cp.patch +pinctrl-rockchip-update-rk3308-iomux-routes.patch +pinctrl-core-fix-possible-memory-leak-when-pinctrl_e.patch +pinctrl-single-fix-possible-memory-leak-when-pinctrl.patch +pinctrl-ti-ti-iodelay-drop-if-block-with-always-fals.patch +pinctrl-ti-ti-iodelay-fix-possible-memory-leak-when-.patch +pinctrl-freescale-mxs-fix-refcount-of-child.patch +fs-proc-task_mmu-indicate-pm_file-for-pmd-mapped-fil.patch +fs-nilfs2-remove-some-unused-macros-to-tame-gcc.patch +nilfs2-avoid-undefined-behavior-in-nilfs_cnt32_ge-ma.patch +rtc-interface-add-rtc-offset-to-alarm-after-fix-up.patch diff --git a/queue-5.10/soc-qcom-pdr-fix-parsing-of-domains-lists.patch b/queue-5.10/soc-qcom-pdr-fix-parsing-of-domains-lists.patch new file mode 100644 index 00000000000..2c023c4bd0e --- /dev/null +++ b/queue-5.10/soc-qcom-pdr-fix-parsing-of-domains-lists.patch @@ -0,0 +1,43 @@ +From 0534b67f02edbeaf47341f47e742d330e410f73b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 22 Jun 2024 01:03:41 +0300 +Subject: soc: qcom: pdr: fix parsing of domains lists + +From: Dmitry Baryshkov + +[ Upstream commit 57f20d51f35780f240ecf39d81cda23612800a92 ] + +While parsing the domains list, start offsets from 0 rather than from +domains_read. The domains_read is equal to the total count of the +domains we have seen, while the domains list in the message starts from +offset 0. + +Fixes: fbe639b44a82 ("soc: qcom: Introduce Protection Domain Restart helpers") +Tested-by: Steev Klimaszewski +Tested-by: Alexey Minnekhanov +Reviewed-by: Chris Lew +Tested-by: Neil Armstrong # on SM8550-QRD +Signed-off-by: Dmitry Baryshkov +Link: https://lore.kernel.org/r/20240622-qcom-pd-mapper-v9-2-a84ee3591c8e@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/soc/qcom/pdr_interface.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/soc/qcom/pdr_interface.c b/drivers/soc/qcom/pdr_interface.c +index 373725b6d5444..6e3cbd8226637 100644 +--- a/drivers/soc/qcom/pdr_interface.c ++++ b/drivers/soc/qcom/pdr_interface.c +@@ -418,7 +418,7 @@ static int pdr_locate_service(struct pdr_handle *pdr, struct pdr_service *pds) + if (ret < 0) + goto out; + +- for (i = domains_read; i < resp->domain_list_len; i++) { ++ for (i = 0; i < resp->domain_list_len; i++) { + entry = &resp->domain_list[i]; + + if (strnlen(entry->name, sizeof(entry->name)) == sizeof(entry->name)) +-- +2.43.0 + diff --git a/queue-5.10/soc-qcom-pdr-protect-locator_addr-with-the-main-mute.patch b/queue-5.10/soc-qcom-pdr-protect-locator_addr-with-the-main-mute.patch new file mode 100644 index 00000000000..c83536157ee --- /dev/null +++ b/queue-5.10/soc-qcom-pdr-protect-locator_addr-with-the-main-mute.patch @@ -0,0 +1,73 @@ +From 984a2ce8489d6476f8360015fb67f5a9abdc8b90 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 22 Jun 2024 01:03:40 +0300 +Subject: soc: qcom: pdr: protect locator_addr with the main mutex + +From: Dmitry Baryshkov + +[ Upstream commit 107924c14e3ddd85119ca43c26a4ee1056fa9b84 ] + +If the service locator server is restarted fast enough, the PDR can +rewrite locator_addr fields concurrently. Protect them by placing +modification of those fields under the main pdr->lock. + +Fixes: fbe639b44a82 ("soc: qcom: Introduce Protection Domain Restart helpers") +Tested-by: Neil Armstrong # on SM8550-QRD +Tested-by: Steev Klimaszewski +Tested-by: Alexey Minnekhanov +Signed-off-by: Dmitry Baryshkov +Link: https://lore.kernel.org/r/20240622-qcom-pd-mapper-v9-1-a84ee3591c8e@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/soc/qcom/pdr_interface.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/soc/qcom/pdr_interface.c b/drivers/soc/qcom/pdr_interface.c +index 205cc96823b70..373725b6d5444 100644 +--- a/drivers/soc/qcom/pdr_interface.c ++++ b/drivers/soc/qcom/pdr_interface.c +@@ -76,12 +76,12 @@ static int pdr_locator_new_server(struct qmi_handle *qmi, + locator_hdl); + struct pdr_service *pds; + ++ mutex_lock(&pdr->lock); + /* Create a local client port for QMI communication */ + pdr->locator_addr.sq_family = AF_QIPCRTR; + pdr->locator_addr.sq_node = svc->node; + pdr->locator_addr.sq_port = svc->port; + +- mutex_lock(&pdr->lock); + pdr->locator_init_complete = true; + mutex_unlock(&pdr->lock); + +@@ -104,10 +104,10 @@ static void pdr_locator_del_server(struct qmi_handle *qmi, + + mutex_lock(&pdr->lock); + pdr->locator_init_complete = false; +- mutex_unlock(&pdr->lock); + + pdr->locator_addr.sq_node = 0; + pdr->locator_addr.sq_port = 0; ++ mutex_unlock(&pdr->lock); + } + + static struct qmi_ops pdr_locator_ops = { +@@ -366,12 +366,14 @@ static int pdr_get_domain_list(struct servreg_get_domain_list_req *req, + if (ret < 0) + return ret; + ++ mutex_lock(&pdr->lock); + ret = qmi_send_request(&pdr->locator_hdl, + &pdr->locator_addr, + &txn, SERVREG_GET_DOMAIN_LIST_REQ, + SERVREG_GET_DOMAIN_LIST_REQ_MAX_LEN, + servreg_get_domain_list_req_ei, + req); ++ mutex_unlock(&pdr->lock); + if (ret < 0) { + qmi_txn_cancel(&txn); + return ret; +-- +2.43.0 + diff --git a/queue-5.10/soc-qcom-rpmh-rsc-ensure-irqs-aren-t-disabled-by-rpm.patch b/queue-5.10/soc-qcom-rpmh-rsc-ensure-irqs-aren-t-disabled-by-rpm.patch new file mode 100644 index 00000000000..a62fedde225 --- /dev/null +++ b/queue-5.10/soc-qcom-rpmh-rsc-ensure-irqs-aren-t-disabled-by-rpm.patch @@ -0,0 +1,84 @@ +From 4e81e0104cdcc67102ebbcb697118484de4148b5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 May 2024 11:41:28 -0700 +Subject: soc: qcom: rpmh-rsc: Ensure irqs aren't disabled by + rpmh_rsc_send_data() callers + +From: Stephen Boyd + +[ Upstream commit e43111f52b9ec5c2d700f89a1d61c8d10dc2d9e9 ] + +Dan pointed out that Smatch is concerned about this code because it uses +spin_lock_irqsave() and then calls wait_event_lock_irq() which enables +irqs before going to sleep. The comment above the function says it +should be called with interrupts enabled, but we simply hope that's true +without really confirming that. Let's add a might_sleep() here to +confirm that interrupts and preemption aren't disabled. Once we do that, +we can change the lock to be non-saving, spin_lock_irq(), to clarify +that we don't expect irqs to be disabled. If irqs are disabled by +callers they're going to be enabled anyway in the wait_event_lock_irq() +call which would be bad. + +This should make Smatch happier and find bad callers faster with the +might_sleep(). We can drop the WARN_ON() in the caller because we have +the might_sleep() now, simplifying the code. + +Reported-by: Dan Carpenter +Closes: https://lore.kernel.org/r/911181ed-c430-4592-ad26-4dc948834e08@moroto.mountain +Fixes: 2bc20f3c8487 ("soc: qcom: rpmh-rsc: Sleep waiting for tcs slots to be free") +Cc: Douglas Anderson +Signed-off-by: Stephen Boyd +Reviewed-by: Douglas Anderson +Link: https://lore.kernel.org/r/20240509184129.3924422-1-swboyd@chromium.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/soc/qcom/rpmh-rsc.c | 7 ++++--- + drivers/soc/qcom/rpmh.c | 1 - + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/soc/qcom/rpmh-rsc.c b/drivers/soc/qcom/rpmh-rsc.c +index a297911afe571..26e6dd860b5d9 100644 +--- a/drivers/soc/qcom/rpmh-rsc.c ++++ b/drivers/soc/qcom/rpmh-rsc.c +@@ -629,13 +629,14 @@ int rpmh_rsc_send_data(struct rsc_drv *drv, const struct tcs_request *msg) + { + struct tcs_group *tcs; + int tcs_id; +- unsigned long flags; ++ ++ might_sleep(); + + tcs = get_tcs_for_msg(drv, msg); + if (IS_ERR(tcs)) + return PTR_ERR(tcs); + +- spin_lock_irqsave(&drv->lock, flags); ++ spin_lock_irq(&drv->lock); + + /* Wait forever for a free tcs. It better be there eventually! */ + wait_event_lock_irq(drv->tcs_wait, +@@ -654,7 +655,7 @@ int rpmh_rsc_send_data(struct rsc_drv *drv, const struct tcs_request *msg) + write_tcs_reg_sync(drv, RSC_DRV_CMD_WAIT_FOR_CMPL, tcs_id, 0); + enable_tcs_irq(drv, tcs_id, true); + } +- spin_unlock_irqrestore(&drv->lock, flags); ++ spin_unlock_irq(&drv->lock); + + /* + * These two can be done after the lock is released because: +diff --git a/drivers/soc/qcom/rpmh.c b/drivers/soc/qcom/rpmh.c +index b61e183ede694..707e176ed4ed8 100644 +--- a/drivers/soc/qcom/rpmh.c ++++ b/drivers/soc/qcom/rpmh.c +@@ -193,7 +193,6 @@ static int __rpmh_write(const struct device *dev, enum rpmh_state state, + rpm_msg->msg.state = state; + + if (state == RPMH_ACTIVE_ONLY_STATE) { +- WARN_ON(irqs_disabled()); + ret = rpmh_rsc_send_data(ctrlr_to_drv(ctrlr), &rpm_msg->msg); + } else { + /* Clean up our call by spoofing tx_done */ +-- +2.43.0 + diff --git a/queue-5.10/sparc64-fix-incorrect-function-signature-and-add-pro.patch b/queue-5.10/sparc64-fix-incorrect-function-signature-and-add-pro.patch new file mode 100644 index 00000000000..552fb095856 --- /dev/null +++ b/queue-5.10/sparc64-fix-incorrect-function-signature-and-add-pro.patch @@ -0,0 +1,75 @@ +From 3279a9cc193519c203b3761d6b86c8e95fab2be8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jul 2024 11:41:53 +0200 +Subject: sparc64: Fix incorrect function signature and add prototype for + prom_cif_init +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Andreas Larsson + +[ Upstream commit a6c3ea1ec96307dbfbb2f16d96c674c5cc80f445 ] + +Remove the unused cif_stack argument and add a protype in oplib_64.h +Commit ef3e035c3a9b ("sparc64: Fix register corruption in top-most +kernel stack frame during boot.") removed the cif_stack argument to +prom_cif init in the declaration at the caller site and the usage of it +within prom_cif_init, but not in the function signature of the function +itself. + +This also fixes the following warning: +arch/sparc/prom/p1275.c:52:6: warning: no previous prototype for ‘prom_cif_init’ + +Fixes: ef3e035c3a9b ("sparc64: Fix register corruption in top-most kernel stack frame during boot.") +Link: https://lore.kernel.org/r/20240710094155.458731-3-andreas@gaisler.com +Signed-off-by: Andreas Larsson +Signed-off-by: Sasha Levin +--- + arch/sparc/include/asm/oplib_64.h | 1 + + arch/sparc/prom/init_64.c | 3 --- + arch/sparc/prom/p1275.c | 2 +- + 3 files changed, 2 insertions(+), 4 deletions(-) + +diff --git a/arch/sparc/include/asm/oplib_64.h b/arch/sparc/include/asm/oplib_64.h +index a67abebd43592..1b86d02a84556 100644 +--- a/arch/sparc/include/asm/oplib_64.h ++++ b/arch/sparc/include/asm/oplib_64.h +@@ -247,6 +247,7 @@ void prom_sun4v_guest_soft_state(void); + int prom_ihandle2path(int handle, char *buffer, int bufsize); + + /* Client interface level routines. */ ++void prom_cif_init(void *cif_handler); + void p1275_cmd_direct(unsigned long *); + + #endif /* !(__SPARC64_OPLIB_H) */ +diff --git a/arch/sparc/prom/init_64.c b/arch/sparc/prom/init_64.c +index 103aa91043185..f7b8a1a865b8f 100644 +--- a/arch/sparc/prom/init_64.c ++++ b/arch/sparc/prom/init_64.c +@@ -26,9 +26,6 @@ phandle prom_chosen_node; + * routines in the prom library. + * It gets passed the pointer to the PROM vector. + */ +- +-extern void prom_cif_init(void *); +- + void __init prom_init(void *cif_handler) + { + phandle node; +diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c +index 889aa602f8d86..51c3f984bbf72 100644 +--- a/arch/sparc/prom/p1275.c ++++ b/arch/sparc/prom/p1275.c +@@ -49,7 +49,7 @@ void p1275_cmd_direct(unsigned long *args) + local_irq_restore(flags); + } + +-void prom_cif_init(void *cif_handler, void *cif_stack) ++void prom_cif_init(void *cif_handler) + { + p1275buf.prom_cif_handler = (void (*)(long *))cif_handler; + } +-- +2.43.0 + diff --git a/queue-5.10/sunrpc-avoid-soft-lockup-when-transmitting-udp-to-re.patch b/queue-5.10/sunrpc-avoid-soft-lockup-when-transmitting-udp-to-re.patch new file mode 100644 index 00000000000..c55de02a319 --- /dev/null +++ b/queue-5.10/sunrpc-avoid-soft-lockup-when-transmitting-udp-to-re.patch @@ -0,0 +1,57 @@ +From 0f7939619971bd05aad6b63b3c343b3bb9ac5c22 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 19 Jun 2024 11:05:13 +1000 +Subject: SUNRPC: avoid soft lockup when transmitting UDP to reachable server. + +From: NeilBrown + +[ Upstream commit 6258cf25d5e3155c3219ab5a79b970eef7996356 ] + +Prior to the commit identified below, call_transmit_status() would +handle -EPERM and other errors related to an unreachable server by +falling through to call_status() which added a 3-second delay and +handled the failure as a timeout. + +Since that commit, call_transmit_status() falls through to +handle_bind(). For UDP this moves straight on to handle_connect() and +handle_transmit() so we immediately retransmit - and likely get the same +error. + +This results in an indefinite loop in __rpc_execute() which triggers a +soft-lockup warning. + +For the errors that indicate an unreachable server, +call_transmit_status() should fall back to call_status() as it did +before. This cannot cause the thundering herd that the previous patch +was avoiding, as the call_status() will insert a delay. + +Fixes: ed7dc973bd91 ("SUNRPC: Prevent thundering herd when the socket is not connected") +Signed-off-by: NeilBrown +Signed-off-by: Anna Schumaker +Signed-off-by: Sasha Levin +--- + net/sunrpc/clnt.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c +index 196a3b11d1509..86397f9c4bc83 100644 +--- a/net/sunrpc/clnt.c ++++ b/net/sunrpc/clnt.c +@@ -2188,12 +2188,13 @@ call_transmit_status(struct rpc_task *task) + task->tk_action = call_transmit; + task->tk_status = 0; + break; +- case -ECONNREFUSED: + case -EHOSTDOWN: + case -ENETDOWN: + case -EHOSTUNREACH: + case -ENETUNREACH: + case -EPERM: ++ break; ++ case -ECONNREFUSED: + if (RPC_IS_SOFTCONN(task)) { + if (!task->tk_msg.rpc_proc->p_proc) + trace_xprt_ping(task->tk_xprt, +-- +2.43.0 + diff --git a/queue-5.10/sunrpc-fixup-gss_status-tracepoint-error-output.patch b/queue-5.10/sunrpc-fixup-gss_status-tracepoint-error-output.patch new file mode 100644 index 00000000000..72542b03bcf --- /dev/null +++ b/queue-5.10/sunrpc-fixup-gss_status-tracepoint-error-output.patch @@ -0,0 +1,36 @@ +From ed75bdf76fd32a82e3168ff804f632bbe98eaad2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Jul 2024 13:21:00 -0400 +Subject: SUNRPC: Fixup gss_status tracepoint error output + +From: Benjamin Coddington + +[ Upstream commit b9fae9f06d84ffab0f3f9118f3a96bbcdc528bf6 ] + +The GSS routine errors are values, not flags. + +Fixes: 0c77668ddb4e ("SUNRPC: Introduce trace points in rpc_auth_gss.ko") +Signed-off-by: Benjamin Coddington +Reviewed-by: Chuck Lever +Signed-off-by: Anna Schumaker +Signed-off-by: Sasha Levin +--- + include/trace/events/rpcgss.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/trace/events/rpcgss.h b/include/trace/events/rpcgss.h +index ffdbe6f85da8b..9c8cb69c79112 100644 +--- a/include/trace/events/rpcgss.h ++++ b/include/trace/events/rpcgss.h +@@ -52,7 +52,7 @@ TRACE_DEFINE_ENUM(GSS_S_UNSEQ_TOKEN); + TRACE_DEFINE_ENUM(GSS_S_GAP_TOKEN); + + #define show_gss_status(x) \ +- __print_flags(x, "|", \ ++ __print_symbolic(x, \ + { GSS_S_BAD_MECH, "GSS_S_BAD_MECH" }, \ + { GSS_S_BAD_NAME, "GSS_S_BAD_NAME" }, \ + { GSS_S_BAD_NAMETYPE, "GSS_S_BAD_NAMETYPE" }, \ +-- +2.43.0 + diff --git a/queue-5.10/wifi-ath11k-fix-wrong-handling-of-ccmp256-and-gcmp-c.patch b/queue-5.10/wifi-ath11k-fix-wrong-handling-of-ccmp256-and-gcmp-c.patch new file mode 100644 index 00000000000..b640b92612b --- /dev/null +++ b/queue-5.10/wifi-ath11k-fix-wrong-handling-of-ccmp256-and-gcmp-c.patch @@ -0,0 +1,133 @@ +From 71b2feffc57c0ad580bcbbf3090ad6194a01d871 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 11 Jun 2024 09:42:34 +0300 +Subject: wifi: ath11k: fix wrong handling of CCMP256 and GCMP ciphers + +From: Baochen Qiang + +[ Upstream commit d2b0ca38d362ebf16ca79cd7f309d5bb8b581deb ] + +Currently for CCMP256, GCMP128 and GCMP256 ciphers, in ath11k_install_key() +IEEE80211_KEY_FLAG_GENERATE_IV_MGMT is not set. And in ath11k_mac_mgmt_tx_wmi() +a length of IEEE80211_CCMP_MIC_LEN is reserved for all ciphers. + +This results in unexpected management frame drop in case either of above 3 ciphers +is used. The reason is, without IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set, mac80211 +will not generate CCMP/GCMP headers in frame for ath11k. Also MIC length reserved +is wrong. Such frame is dropped later by hardware: + +ath11k_pci 0000:5a:00.0: mac tx mgmt frame, buf id 0 +ath11k_pci 0000:5a:00.0: mgmt tx compl ev pdev_id 1, desc_id 0, status 1 + +From user point of view, we have observed very low throughput due to this issue: +action frames are all dropped so ADDBA response from DUT never reaches AP. AP +can not use aggregation thus throughput is low. + +Fix this by setting IEEE80211_KEY_FLAG_GENERATE_IV_MGMT flag and by reserving proper +MIC length for those ciphers. + +Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.30 +Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 + +Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices") +Reported-by: Yaroslav Isakov +Tested-by: Yaroslav Isakov +Closes: https://lore.kernel.org/all/CADS+iDX5=JtJr0apAtAQ02WWBxgOFEv8G063vuGYwDTC8AVZaw@mail.gmail.com +Signed-off-by: Baochen Qiang +Acked-by: Jeff Johnson +Signed-off-by: Kalle Valo +Link: https://msgid.link/20240605014826.22498-1-quic_bqiang@quicinc.com +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath11k/dp_rx.c | 3 +-- + drivers/net/wireless/ath/ath11k/dp_rx.h | 3 +++ + drivers/net/wireless/ath/ath11k/mac.c | 15 +++++++++++---- + 3 files changed, 15 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.c b/drivers/net/wireless/ath/ath11k/dp_rx.c +index a83b5edea66b9..6c4b84282e44c 100644 +--- a/drivers/net/wireless/ath/ath11k/dp_rx.c ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c +@@ -1852,8 +1852,7 @@ static void ath11k_dp_rx_h_csum_offload(struct sk_buff *msdu) + CHECKSUM_NONE : CHECKSUM_UNNECESSARY; + } + +-static int ath11k_dp_rx_crypto_mic_len(struct ath11k *ar, +- enum hal_encrypt_type enctype) ++int ath11k_dp_rx_crypto_mic_len(struct ath11k *ar, enum hal_encrypt_type enctype) + { + switch (enctype) { + case HAL_ENCRYPT_TYPE_OPEN: +diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.h b/drivers/net/wireless/ath/ath11k/dp_rx.h +index 623da3bf9dc81..c322e30caa968 100644 +--- a/drivers/net/wireless/ath/ath11k/dp_rx.h ++++ b/drivers/net/wireless/ath/ath11k/dp_rx.h +@@ -1,6 +1,7 @@ + /* SPDX-License-Identifier: BSD-3-Clause-Clear */ + /* + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved. + */ + #ifndef ATH11K_DP_RX_H + #define ATH11K_DP_RX_H +@@ -95,4 +96,6 @@ int ath11k_peer_rx_frag_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id + int ath11k_dp_rx_pktlog_start(struct ath11k_base *ab); + int ath11k_dp_rx_pktlog_stop(struct ath11k_base *ab, bool stop_timer); + ++int ath11k_dp_rx_crypto_mic_len(struct ath11k *ar, enum hal_encrypt_type enctype); ++ + #endif /* ATH11K_DP_RX_H */ +diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c +index 835e181d22cb7..b66b6a7072d82 100644 +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -2410,6 +2410,7 @@ static int ath11k_install_key(struct ath11k_vif *arvif, + + switch (key->cipher) { + case WLAN_CIPHER_SUITE_CCMP: ++ case WLAN_CIPHER_SUITE_CCMP_256: + arg.key_cipher = WMI_CIPHER_AES_CCM; + /* TODO: Re-check if flag is valid */ + key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; +@@ -2419,12 +2420,10 @@ static int ath11k_install_key(struct ath11k_vif *arvif, + arg.key_txmic_len = 8; + arg.key_rxmic_len = 8; + break; +- case WLAN_CIPHER_SUITE_CCMP_256: +- arg.key_cipher = WMI_CIPHER_AES_CCM; +- break; + case WLAN_CIPHER_SUITE_GCMP: + case WLAN_CIPHER_SUITE_GCMP_256: + arg.key_cipher = WMI_CIPHER_AES_GCM; ++ key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT; + break; + default: + ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher); +@@ -3946,7 +3945,10 @@ static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif, + { + struct ath11k_base *ab = ar->ab; + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; ++ struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb); + struct ieee80211_tx_info *info; ++ enum hal_encrypt_type enctype; ++ unsigned int mic_len; + dma_addr_t paddr; + int buf_id; + int ret; +@@ -3966,7 +3968,12 @@ static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif, + ieee80211_is_deauth(hdr->frame_control) || + ieee80211_is_disassoc(hdr->frame_control)) && + ieee80211_has_protected(hdr->frame_control)) { +- skb_put(skb, IEEE80211_CCMP_MIC_LEN); ++ if (!(skb_cb->flags & ATH11K_SKB_CIPHER_SET)) ++ ath11k_warn(ab, "WMI management tx frame without ATH11K_SKB_CIPHER_SET"); ++ ++ enctype = ath11k_dp_tx_get_encrypt_type(skb_cb->cipher); ++ mic_len = ath11k_dp_rx_crypto_mic_len(ar, enctype); ++ skb_put(skb, mic_len); + } + } + +-- +2.43.0 + diff --git a/queue-5.10/wifi-brcmsmac-lcn-phy-code-is-used-for-bcm4313-2g-on.patch b/queue-5.10/wifi-brcmsmac-lcn-phy-code-is-used-for-bcm4313-2g-on.patch new file mode 100644 index 00000000000..69d94935dd3 --- /dev/null +++ b/queue-5.10/wifi-brcmsmac-lcn-phy-code-is-used-for-bcm4313-2g-on.patch @@ -0,0 +1,75 @@ +From 0a47e7d687e8ef32d4739a799bc5235a0e6e443c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 May 2024 16:10:37 -0700 +Subject: wifi: brcmsmac: LCN PHY code is used for BCM4313 2G-only device + +From: Samasth Norway Ananda + +[ Upstream commit c636fa85feb450ca414a10010ed05361a73c93a6 ] + +The band_idx variable in the function wlc_lcnphy_tx_iqlo_cal() will +never be set to 1 as BCM4313 is the only device for which the LCN PHY +code is used. This is a 2G-only device. + +Fixes: 5b435de0d786 ("net: wireless: add brcm80211 drivers") +Signed-off-by: Samasth Norway Ananda +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +Link: https://msgid.link/20240509231037.2014109-1-samasth.norway.ananda@oracle.com +Signed-off-by: Sasha Levin +--- + .../broadcom/brcm80211/brcmsmac/phy/phy_lcn.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c +index 7717eb85a1db6..47c0e8e429e54 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c +@@ -2567,7 +2567,6 @@ wlc_lcnphy_tx_iqlo_cal(struct brcms_phy *pi, + + struct lcnphy_txgains cal_gains, temp_gains; + u16 hash; +- u8 band_idx; + int j; + u16 ncorr_override[5]; + u16 syst_coeffs[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +@@ -2599,6 +2598,9 @@ wlc_lcnphy_tx_iqlo_cal(struct brcms_phy *pi, + u16 *values_to_save; + struct brcms_phy_lcnphy *pi_lcn = pi->u.pi_lcnphy; + ++ if (WARN_ON(CHSPEC_IS5G(pi->radio_chanspec))) ++ return; ++ + values_to_save = kmalloc_array(20, sizeof(u16), GFP_ATOMIC); + if (NULL == values_to_save) + return; +@@ -2662,20 +2664,18 @@ wlc_lcnphy_tx_iqlo_cal(struct brcms_phy *pi, + hash = (target_gains->gm_gain << 8) | + (target_gains->pga_gain << 4) | (target_gains->pad_gain); + +- band_idx = (CHSPEC_IS5G(pi->radio_chanspec) ? 1 : 0); +- + cal_gains = *target_gains; + memset(ncorr_override, 0, sizeof(ncorr_override)); +- for (j = 0; j < iqcal_gainparams_numgains_lcnphy[band_idx]; j++) { +- if (hash == tbl_iqcal_gainparams_lcnphy[band_idx][j][0]) { ++ for (j = 0; j < iqcal_gainparams_numgains_lcnphy[0]; j++) { ++ if (hash == tbl_iqcal_gainparams_lcnphy[0][j][0]) { + cal_gains.gm_gain = +- tbl_iqcal_gainparams_lcnphy[band_idx][j][1]; ++ tbl_iqcal_gainparams_lcnphy[0][j][1]; + cal_gains.pga_gain = +- tbl_iqcal_gainparams_lcnphy[band_idx][j][2]; ++ tbl_iqcal_gainparams_lcnphy[0][j][2]; + cal_gains.pad_gain = +- tbl_iqcal_gainparams_lcnphy[band_idx][j][3]; ++ tbl_iqcal_gainparams_lcnphy[0][j][3]; + memcpy(ncorr_override, +- &tbl_iqcal_gainparams_lcnphy[band_idx][j][3], ++ &tbl_iqcal_gainparams_lcnphy[0][j][3], + sizeof(ncorr_override)); + break; + } +-- +2.43.0 + diff --git a/queue-5.10/wifi-cfg80211-fix-typo-in-cfg80211_calculate_bitrate.patch b/queue-5.10/wifi-cfg80211-fix-typo-in-cfg80211_calculate_bitrate.patch new file mode 100644 index 00000000000..571e9b1917d --- /dev/null +++ b/queue-5.10/wifi-cfg80211-fix-typo-in-cfg80211_calculate_bitrate.patch @@ -0,0 +1,45 @@ +From 355f3d39e3cbc048988253aace4561f5c3356f86 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jun 2024 10:06:52 +0800 +Subject: wifi: cfg80211: fix typo in cfg80211_calculate_bitrate_he() + +From: Baochen Qiang + +[ Upstream commit 9ee0d44f055276fe2802b2f65058e920853f4f99 ] + +rates_996 is mistakenly written as rates_969, fix it. + +Fixes: c4cbaf7973a7 ("cfg80211: Add support for HE") +Signed-off-by: Baochen Qiang +Link: https://msgid.link/20240606020653.33205-2-quic_bqiang@quicinc.com +Signed-off-by: Johannes Berg +Signed-off-by: Sasha Levin +--- + net/wireless/util.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/net/wireless/util.c b/net/wireless/util.c +index 4b32e85c2d9a1..0d5b1c18d62f2 100644 +--- a/net/wireless/util.c ++++ b/net/wireless/util.c +@@ -1334,7 +1334,7 @@ static u32 cfg80211_calculate_bitrate_he(struct rate_info *rate) + 2048, /* 1.000000... */ + }; + u32 rates_160M[3] = { 960777777, 907400000, 816666666 }; +- u32 rates_969[3] = { 480388888, 453700000, 408333333 }; ++ u32 rates_996[3] = { 480388888, 453700000, 408333333 }; + u32 rates_484[3] = { 229411111, 216666666, 195000000 }; + u32 rates_242[3] = { 114711111, 108333333, 97500000 }; + u32 rates_106[3] = { 40000000, 37777777, 34000000 }; +@@ -1359,7 +1359,7 @@ static u32 cfg80211_calculate_bitrate_he(struct rate_info *rate) + else if (rate->bw == RATE_INFO_BW_80 || + (rate->bw == RATE_INFO_BW_HE_RU && + rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_996)) +- result = rates_969[rate->he_gi]; ++ result = rates_996[rate->he_gi]; + else if (rate->bw == RATE_INFO_BW_40 || + (rate->bw == RATE_INFO_BW_HE_RU && + rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_484)) +-- +2.43.0 + diff --git a/queue-5.10/wifi-cfg80211-handle-2x996-ru-allocation-in-cfg80211.patch b/queue-5.10/wifi-cfg80211-handle-2x996-ru-allocation-in-cfg80211.patch new file mode 100644 index 00000000000..a54e6824333 --- /dev/null +++ b/queue-5.10/wifi-cfg80211-handle-2x996-ru-allocation-in-cfg80211.patch @@ -0,0 +1,45 @@ +From 5d2abfe4fbf9b74c504a6f78700f09bb25ec99f9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Jun 2024 10:06:53 +0800 +Subject: wifi: cfg80211: handle 2x996 RU allocation in + cfg80211_calculate_bitrate_he() + +From: Baochen Qiang + +[ Upstream commit bcbd771cd5d68c0c52567556097d75f9fc4e7cd6 ] + +Currently NL80211_RATE_INFO_HE_RU_ALLOC_2x996 is not handled in +cfg80211_calculate_bitrate_he(), leading to below warning: + +kernel: invalid HE MCS: bw:6, ru:6 +kernel: WARNING: CPU: 0 PID: 2312 at net/wireless/util.c:1501 cfg80211_calculate_bitrate_he+0x22b/0x270 [cfg80211] + +Fix it by handling 2x996 RU allocation in the same way as 160 MHz bandwidth. + +Fixes: c4cbaf7973a7 ("cfg80211: Add support for HE") +Signed-off-by: Baochen Qiang +Link: https://msgid.link/20240606020653.33205-3-quic_bqiang@quicinc.com +Signed-off-by: Johannes Berg +Signed-off-by: Sasha Levin +--- + net/wireless/util.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/net/wireless/util.c b/net/wireless/util.c +index 0d5b1c18d62f2..37719fc39f64d 100644 +--- a/net/wireless/util.c ++++ b/net/wireless/util.c +@@ -1354,7 +1354,9 @@ static u32 cfg80211_calculate_bitrate_he(struct rate_info *rate) + if (WARN_ON_ONCE(rate->nss < 1 || rate->nss > 8)) + return 0; + +- if (rate->bw == RATE_INFO_BW_160) ++ if (rate->bw == RATE_INFO_BW_160 || ++ (rate->bw == RATE_INFO_BW_HE_RU && ++ rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_2x996)) + result = rates_160M[rate->he_gi]; + else if (rate->bw == RATE_INFO_BW_80 || + (rate->bw == RATE_INFO_BW_HE_RU && +-- +2.43.0 + diff --git a/queue-5.10/wifi-virt_wifi-avoid-reporting-connection-success-wi.patch b/queue-5.10/wifi-virt_wifi-avoid-reporting-connection-success-wi.patch new file mode 100644 index 00000000000..d085410aa43 --- /dev/null +++ b/queue-5.10/wifi-virt_wifi-avoid-reporting-connection-success-wi.patch @@ -0,0 +1,98 @@ +From 943b8609733eb09555b27e5e5750bac5ec369bba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jul 2024 10:37:56 +0800 +Subject: wifi: virt_wifi: avoid reporting connection success with wrong SSID + +From: En-Wei Wu + +[ Upstream commit b5d14b0c6716fad7f0c94ac6e1d6f60a49f985c7 ] + +When user issues a connection with a different SSID than the one +virt_wifi has advertised, the __cfg80211_connect_result() will +trigger the warning: WARN_ON(bss_not_found). + +The issue is because the connection code in virt_wifi does not +check the SSID from user space (it only checks the BSSID), and +virt_wifi will call cfg80211_connect_result() with WLAN_STATUS_SUCCESS +even if the SSID is different from the one virt_wifi has advertised. +Eventually cfg80211 won't be able to find the cfg80211_bss and generate +the warning. + +Fixed it by checking the SSID (from user space) in the connection code. + +Fixes: c7cdba31ed8b ("mac80211-next: rtnetlink wifi simulation device") +Reported-by: syzbot+d6eb9cee2885ec06f5e3@syzkaller.appspotmail.com +Signed-off-by: En-Wei Wu +Link: https://patch.msgid.link/20240705023756.10954-1-en-wei.wu@canonical.com +Signed-off-by: Johannes Berg +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/virt_wifi.c | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/wireless/virt_wifi.c b/drivers/net/wireless/virt_wifi.c +index 514f2c1124b61..ec730bc44adc1 100644 +--- a/drivers/net/wireless/virt_wifi.c ++++ b/drivers/net/wireless/virt_wifi.c +@@ -136,6 +136,8 @@ static struct ieee80211_supported_band band_5ghz = { + /* Assigned at module init. Guaranteed locally-administered and unicast. */ + static u8 fake_router_bssid[ETH_ALEN] __ro_after_init = {}; + ++#define VIRT_WIFI_SSID "VirtWifi" ++ + static void virt_wifi_inform_bss(struct wiphy *wiphy) + { + u64 tsf = div_u64(ktime_get_boottime_ns(), 1000); +@@ -146,8 +148,8 @@ static void virt_wifi_inform_bss(struct wiphy *wiphy) + u8 ssid[8]; + } __packed ssid = { + .tag = WLAN_EID_SSID, +- .len = 8, +- .ssid = "VirtWifi", ++ .len = strlen(VIRT_WIFI_SSID), ++ .ssid = VIRT_WIFI_SSID, + }; + + informed_bss = cfg80211_inform_bss(wiphy, &channel_5ghz, +@@ -213,6 +215,8 @@ struct virt_wifi_netdev_priv { + struct net_device *upperdev; + u32 tx_packets; + u32 tx_failed; ++ u32 connect_requested_ssid_len; ++ u8 connect_requested_ssid[IEEE80211_MAX_SSID_LEN]; + u8 connect_requested_bss[ETH_ALEN]; + bool is_up; + bool is_connected; +@@ -229,6 +233,12 @@ static int virt_wifi_connect(struct wiphy *wiphy, struct net_device *netdev, + if (priv->being_deleted || !priv->is_up) + return -EBUSY; + ++ if (!sme->ssid) ++ return -EINVAL; ++ ++ priv->connect_requested_ssid_len = sme->ssid_len; ++ memcpy(priv->connect_requested_ssid, sme->ssid, sme->ssid_len); ++ + could_schedule = schedule_delayed_work(&priv->connect, HZ * 2); + if (!could_schedule) + return -EBUSY; +@@ -252,12 +262,15 @@ static void virt_wifi_connect_complete(struct work_struct *work) + container_of(work, struct virt_wifi_netdev_priv, connect.work); + u8 *requested_bss = priv->connect_requested_bss; + bool right_addr = ether_addr_equal(requested_bss, fake_router_bssid); ++ bool right_ssid = priv->connect_requested_ssid_len == strlen(VIRT_WIFI_SSID) && ++ !memcmp(priv->connect_requested_ssid, VIRT_WIFI_SSID, ++ priv->connect_requested_ssid_len); + u16 status = WLAN_STATUS_SUCCESS; + + if (is_zero_ether_addr(requested_bss)) + requested_bss = NULL; + +- if (!priv->is_up || (requested_bss && !right_addr)) ++ if (!priv->is_up || (requested_bss && !right_addr) || !right_ssid) + status = WLAN_STATUS_UNSPECIFIED_FAILURE; + else + priv->is_connected = true; +-- +2.43.0 + diff --git a/queue-5.10/wifi-virt_wifi-don-t-use-strlen-in-const-context.patch b/queue-5.10/wifi-virt_wifi-don-t-use-strlen-in-const-context.patch new file mode 100644 index 00000000000..f0cdf98902b --- /dev/null +++ b/queue-5.10/wifi-virt_wifi-don-t-use-strlen-in-const-context.patch @@ -0,0 +1,56 @@ +From 7f6817d824beb179e008b680f4d8530ce598450e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Jul 2024 08:34:09 +0200 +Subject: wifi: virt_wifi: don't use strlen() in const context + +From: Johannes Berg + +[ Upstream commit 6e909f489191b365364e9d636dec33b5dfd4e5eb ] + +Looks like not all compilers allow strlen(constant) as +a constant, so don't do that. Instead, revert back to +defining the length as the first submission had it. + +Fixes: b5d14b0c6716 ("wifi: virt_wifi: avoid reporting connection success with wrong SSID") +Reported-by: kernel test robot +Closes: https://lore.kernel.org/oe-kbuild-all/202407090934.NnR1TUbW-lkp@intel.com/ +Closes: https://lore.kernel.org/oe-kbuild-all/202407090944.mpwLHGt9-lkp@intel.com/ +Signed-off-by: Johannes Berg +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/virt_wifi.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/virt_wifi.c b/drivers/net/wireless/virt_wifi.c +index ec730bc44adc1..dd6675436bda6 100644 +--- a/drivers/net/wireless/virt_wifi.c ++++ b/drivers/net/wireless/virt_wifi.c +@@ -137,6 +137,7 @@ static struct ieee80211_supported_band band_5ghz = { + static u8 fake_router_bssid[ETH_ALEN] __ro_after_init = {}; + + #define VIRT_WIFI_SSID "VirtWifi" ++#define VIRT_WIFI_SSID_LEN 8 + + static void virt_wifi_inform_bss(struct wiphy *wiphy) + { +@@ -148,7 +149,7 @@ static void virt_wifi_inform_bss(struct wiphy *wiphy) + u8 ssid[8]; + } __packed ssid = { + .tag = WLAN_EID_SSID, +- .len = strlen(VIRT_WIFI_SSID), ++ .len = VIRT_WIFI_SSID_LEN, + .ssid = VIRT_WIFI_SSID, + }; + +@@ -262,7 +263,7 @@ static void virt_wifi_connect_complete(struct work_struct *work) + container_of(work, struct virt_wifi_netdev_priv, connect.work); + u8 *requested_bss = priv->connect_requested_bss; + bool right_addr = ether_addr_equal(requested_bss, fake_router_bssid); +- bool right_ssid = priv->connect_requested_ssid_len == strlen(VIRT_WIFI_SSID) && ++ bool right_ssid = priv->connect_requested_ssid_len == VIRT_WIFI_SSID_LEN && + !memcmp(priv->connect_requested_ssid, VIRT_WIFI_SSID, + priv->connect_requested_ssid_len); + u16 status = WLAN_STATUS_SUCCESS; +-- +2.43.0 + diff --git a/queue-5.10/x86-of-return-consistent-error-type-from-x86_of_pci_.patch b/queue-5.10/x86-of-return-consistent-error-type-from-x86_of_pci_.patch new file mode 100644 index 00000000000..a6b3101d330 --- /dev/null +++ b/queue-5.10/x86-of-return-consistent-error-type-from-x86_of_pci_.patch @@ -0,0 +1,45 @@ +From a61c3ca26a356af68ccea327fcce45078fd221ea Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 27 May 2024 15:55:35 +0300 +Subject: x86/of: Return consistent error type from x86_of_pci_irq_enable() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +[ Upstream commit ec0b4c4d45cf7cf9a6c9626a494a89cb1ae7c645 ] + +x86_of_pci_irq_enable() returns PCIBIOS_* code received from +pci_read_config_byte() directly and also -EINVAL which are not +compatible error types. x86_of_pci_irq_enable() is used as +(*pcibios_enable_irq) function which should not return PCIBIOS_* codes. + +Convert the PCIBIOS_* return code from pci_read_config_byte() into +normal errno using pcibios_err_to_errno(). + +Fixes: 96e0a0797eba ("x86: dtb: Add support for PCI devices backed by dtb nodes") +Signed-off-by: Ilpo Järvinen +Signed-off-by: Borislav Petkov (AMD) +Link: https://lore.kernel.org/r/20240527125538.13620-1-ilpo.jarvinen@linux.intel.com +Signed-off-by: Sasha Levin +--- + arch/x86/kernel/devicetree.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c +index ddffd80f5c525..2d654fdf001dc 100644 +--- a/arch/x86/kernel/devicetree.c ++++ b/arch/x86/kernel/devicetree.c +@@ -92,7 +92,7 @@ static int x86_of_pci_irq_enable(struct pci_dev *dev) + + ret = pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); + if (ret) +- return ret; ++ return pcibios_err_to_errno(ret); + if (!pin) + return 0; + +-- +2.43.0 + diff --git a/queue-5.10/x86-pci-intel_mid_pci-fix-pcibios_-return-code-handl.patch b/queue-5.10/x86-pci-intel_mid_pci-fix-pcibios_-return-code-handl.patch new file mode 100644 index 00000000000..0b3ea50f12c --- /dev/null +++ b/queue-5.10/x86-pci-intel_mid_pci-fix-pcibios_-return-code-handl.patch @@ -0,0 +1,53 @@ +From a384a66a7410a3a041ebde6fd9825d764f79ec4e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 27 May 2024 15:55:36 +0300 +Subject: x86/pci/intel_mid_pci: Fix PCIBIOS_* return code handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +[ Upstream commit 724852059e97c48557151b3aa4af424614819752 ] + +intel_mid_pci_irq_enable() uses pci_read_config_byte() that returns +PCIBIOS_* codes. The error handling, however, assumes the codes are +normal errnos because it checks for < 0. + +intel_mid_pci_irq_enable() also returns the PCIBIOS_* code back to the +caller but the function is used as the (*pcibios_enable_irq) function +which should return normal errnos. + +Convert the error check to plain non-zero check which works for +PCIBIOS_* return codes and convert the PCIBIOS_* return code using +pcibios_err_to_errno() into normal errno before returning it. + +Fixes: 5b395e2be6c4 ("x86/platform/intel-mid: Make IRQ allocation a bit more flexible") +Signed-off-by: Ilpo Järvinen +Signed-off-by: Borislav Petkov (AMD) +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20240527125538.13620-2-ilpo.jarvinen@linux.intel.com +Signed-off-by: Sasha Levin +--- + arch/x86/pci/intel_mid_pci.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/pci/intel_mid_pci.c b/arch/x86/pci/intel_mid_pci.c +index 24ca4ee2802fb..3399dcdd526c6 100644 +--- a/arch/x86/pci/intel_mid_pci.c ++++ b/arch/x86/pci/intel_mid_pci.c +@@ -223,9 +223,9 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev) + return 0; + + ret = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &gsi); +- if (ret < 0) { ++ if (ret) { + dev_warn(&dev->dev, "Failed to read interrupt line: %d\n", ret); +- return ret; ++ return pcibios_err_to_errno(ret); + } + + switch (intel_mid_identify_cpu()) { +-- +2.43.0 + diff --git a/queue-5.10/x86-pci-xen-fix-pcibios_-return-code-handling.patch b/queue-5.10/x86-pci-xen-fix-pcibios_-return-code-handling.patch new file mode 100644 index 00000000000..57f421dbd87 --- /dev/null +++ b/queue-5.10/x86-pci-xen-fix-pcibios_-return-code-handling.patch @@ -0,0 +1,54 @@ +From 146d2142449eb7f86dcb46db2722973fd11ad24c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 27 May 2024 15:55:37 +0300 +Subject: x86/pci/xen: Fix PCIBIOS_* return code handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +[ Upstream commit e9d7b435dfaec58432f4106aaa632bf39f52ce9f ] + +xen_pcifront_enable_irq() uses pci_read_config_byte() that returns +PCIBIOS_* codes. The error handling, however, assumes the codes are +normal errnos because it checks for < 0. + +xen_pcifront_enable_irq() also returns the PCIBIOS_* code back to the +caller but the function is used as the (*pcibios_enable_irq) function +which should return normal errnos. + +Convert the error check to plain non-zero check which works for +PCIBIOS_* return codes and convert the PCIBIOS_* return code using +pcibios_err_to_errno() into normal errno before returning it. + +Fixes: 3f2a230caf21 ("xen: handled remapped IRQs when enabling a pcifront PCI device.") +Signed-off-by: Ilpo Järvinen +Signed-off-by: Borislav Petkov (AMD) +Reviewed-by: Juergen Gross +Link: https://lore.kernel.org/r/20240527125538.13620-3-ilpo.jarvinen@linux.intel.com +Signed-off-by: Sasha Levin +--- + arch/x86/pci/xen.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c +index 326d6d1737338..cbe9ab42cbebb 100644 +--- a/arch/x86/pci/xen.c ++++ b/arch/x86/pci/xen.c +@@ -37,10 +37,10 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev) + u8 gsi; + + rc = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &gsi); +- if (rc < 0) { ++ if (rc) { + dev_warn(&dev->dev, "Xen PCI: failed to read interrupt line: %d\n", + rc); +- return rc; ++ return pcibios_err_to_errno(rc); + } + /* In PV DomU the Xen PCI backend puts the PIRQ in the interrupt line.*/ + pirq = gsi; +-- +2.43.0 + diff --git a/queue-5.10/x86-platform-iosf_mbi-convert-pcibios_-return-codes-.patch b/queue-5.10/x86-platform-iosf_mbi-convert-pcibios_-return-codes-.patch new file mode 100644 index 00000000000..bc353272691 --- /dev/null +++ b/queue-5.10/x86-platform-iosf_mbi-convert-pcibios_-return-codes-.patch @@ -0,0 +1,54 @@ +From 7231ee444e9e5753211eb0b501e032e155ce41ff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 27 May 2024 15:55:38 +0300 +Subject: x86/platform/iosf_mbi: Convert PCIBIOS_* return codes to errnos +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +[ Upstream commit 7821fa101eab529521aa4b724bf708149d70820c ] + +iosf_mbi_pci_{read,write}_mdr() use pci_{read,write}_config_dword() +that return PCIBIOS_* codes but functions also return -ENODEV which are +not compatible error codes. As neither of the functions are related to +PCI read/write functions, they should return normal errnos. + +Convert PCIBIOS_* returns code using pcibios_err_to_errno() into normal +errno before returning it. + +Fixes: 46184415368a ("arch: x86: New MailBox support driver for Intel SOC's") +Signed-off-by: Ilpo Järvinen +Signed-off-by: Borislav Petkov (AMD) +Link: https://lore.kernel.org/r/20240527125538.13620-4-ilpo.jarvinen@linux.intel.com +Signed-off-by: Sasha Levin +--- + arch/x86/platform/intel/iosf_mbi.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/platform/intel/iosf_mbi.c b/arch/x86/platform/intel/iosf_mbi.c +index 526f70f27c1c3..70a1c3877f8e3 100644 +--- a/arch/x86/platform/intel/iosf_mbi.c ++++ b/arch/x86/platform/intel/iosf_mbi.c +@@ -62,7 +62,7 @@ static int iosf_mbi_pci_read_mdr(u32 mcrx, u32 mcr, u32 *mdr) + + fail_read: + dev_err(&mbi_pdev->dev, "PCI config access failed with %d\n", result); +- return result; ++ return pcibios_err_to_errno(result); + } + + static int iosf_mbi_pci_write_mdr(u32 mcrx, u32 mcr, u32 mdr) +@@ -91,7 +91,7 @@ static int iosf_mbi_pci_write_mdr(u32 mcrx, u32 mcr, u32 mdr) + + fail_write: + dev_err(&mbi_pdev->dev, "PCI config access failed with %d\n", result); +- return result; ++ return pcibios_err_to_errno(result); + } + + int iosf_mbi_read(u8 port, u8 opcode, u32 offset, u32 *mdr) +-- +2.43.0 + diff --git a/queue-5.10/x86-xen-convert-comma-to-semicolon.patch b/queue-5.10/x86-xen-convert-comma-to-semicolon.patch new file mode 100644 index 00000000000..f1c071a324f --- /dev/null +++ b/queue-5.10/x86-xen-convert-comma-to-semicolon.patch @@ -0,0 +1,46 @@ +From 26b7bee703ee45efa12283fcdf508aef3252aa95 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Jul 2024 11:10:10 +0800 +Subject: x86/xen: Convert comma to semicolon + +From: Chen Ni + +[ Upstream commit 349d271416c61f82b853336509b1d0dc04c1fcbb ] + +Replace a comma between expression statements by a semicolon. + +Fixes: 8310b77b48c5 ("Xen/gnttab: handle p2m update errors on a per-slot basis") +Signed-off-by: Chen Ni +Reviewed-by: Juergen Gross +Link: https://lore.kernel.org/r/20240702031010.1411875-1-nichen@iscas.ac.cn +Signed-off-by: Juergen Gross +Signed-off-by: Sasha Levin +--- + arch/x86/xen/p2m.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c +index e809f14468464..bfa972f7e8745 100644 +--- a/arch/x86/xen/p2m.c ++++ b/arch/x86/xen/p2m.c +@@ -736,7 +736,7 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, + * immediate unmapping. + */ + map_ops[i].status = GNTST_general_error; +- unmap[0].host_addr = map_ops[i].host_addr, ++ unmap[0].host_addr = map_ops[i].host_addr; + unmap[0].handle = map_ops[i].handle; + map_ops[i].handle = ~0; + if (map_ops[i].flags & GNTMAP_device_map) +@@ -746,7 +746,7 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, + + if (kmap_ops) { + kmap_ops[i].status = GNTST_general_error; +- unmap[1].host_addr = kmap_ops[i].host_addr, ++ unmap[1].host_addr = kmap_ops[i].host_addr; + unmap[1].handle = kmap_ops[i].handle; + kmap_ops[i].handle = ~0; + if (kmap_ops[i].flags & GNTMAP_device_map) +-- +2.43.0 + diff --git a/queue-5.10/xdp-fix-invalid-wait-context-of-page_pool_destroy.patch b/queue-5.10/xdp-fix-invalid-wait-context-of-page_pool_destroy.patch new file mode 100644 index 00000000000..da0d388a449 --- /dev/null +++ b/queue-5.10/xdp-fix-invalid-wait-context-of-page_pool_destroy.patch @@ -0,0 +1,142 @@ +From c96231fcc8d60a4e319fbdc71c0736b2ac7a84b6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Jul 2024 09:51:16 +0000 +Subject: xdp: fix invalid wait context of page_pool_destroy() + +From: Taehee Yoo + +[ Upstream commit 59a931c5b732ca5fc2ca727f5a72aeabaafa85ec ] + +If the driver uses a page pool, it creates a page pool with +page_pool_create(). +The reference count of page pool is 1 as default. +A page pool will be destroyed only when a reference count reaches 0. +page_pool_destroy() is used to destroy page pool, it decreases a +reference count. +When a page pool is destroyed, ->disconnect() is called, which is +mem_allocator_disconnect(). +This function internally acquires mutex_lock(). + +If the driver uses XDP, it registers a memory model with +xdp_rxq_info_reg_mem_model(). +The xdp_rxq_info_reg_mem_model() internally increases a page pool +reference count if a memory model is a page pool. +Now the reference count is 2. + +To destroy a page pool, the driver should call both page_pool_destroy() +and xdp_unreg_mem_model(). +The xdp_unreg_mem_model() internally calls page_pool_destroy(). +Only page_pool_destroy() decreases a reference count. + +If a driver calls page_pool_destroy() then xdp_unreg_mem_model(), we +will face an invalid wait context warning. +Because xdp_unreg_mem_model() calls page_pool_destroy() with +rcu_read_lock(). +The page_pool_destroy() internally acquires mutex_lock(). + +Splat looks like: +============================= +[ BUG: Invalid wait context ] +6.10.0-rc6+ #4 Tainted: G W +----------------------------- +ethtool/1806 is trying to lock: +ffffffff90387b90 (mem_id_lock){+.+.}-{4:4}, at: mem_allocator_disconnect+0x73/0x150 +other info that might help us debug this: +context-{5:5} +3 locks held by ethtool/1806: +stack backtrace: +CPU: 0 PID: 1806 Comm: ethtool Tainted: G W 6.10.0-rc6+ #4 f916f41f172891c800f2fed +Hardware name: ASUS System Product Name/PRIME Z690-P D4, BIOS 0603 11/01/2021 +Call Trace: + +dump_stack_lvl+0x7e/0xc0 +__lock_acquire+0x1681/0x4de0 +? _printk+0x64/0xe0 +? __pfx_mark_lock.part.0+0x10/0x10 +? __pfx___lock_acquire+0x10/0x10 +lock_acquire+0x1b3/0x580 +? mem_allocator_disconnect+0x73/0x150 +? __wake_up_klogd.part.0+0x16/0xc0 +? __pfx_lock_acquire+0x10/0x10 +? dump_stack_lvl+0x91/0xc0 +__mutex_lock+0x15c/0x1690 +? mem_allocator_disconnect+0x73/0x150 +? __pfx_prb_read_valid+0x10/0x10 +? mem_allocator_disconnect+0x73/0x150 +? __pfx_llist_add_batch+0x10/0x10 +? console_unlock+0x193/0x1b0 +? lockdep_hardirqs_on+0xbe/0x140 +? __pfx___mutex_lock+0x10/0x10 +? tick_nohz_tick_stopped+0x16/0x90 +? __irq_work_queue_local+0x1e5/0x330 +? irq_work_queue+0x39/0x50 +? __wake_up_klogd.part.0+0x79/0xc0 +? mem_allocator_disconnect+0x73/0x150 +mem_allocator_disconnect+0x73/0x150 +? __pfx_mem_allocator_disconnect+0x10/0x10 +? mark_held_locks+0xa5/0xf0 +? rcu_is_watching+0x11/0xb0 +page_pool_release+0x36e/0x6d0 +page_pool_destroy+0xd7/0x440 +xdp_unreg_mem_model+0x1a7/0x2a0 +? __pfx_xdp_unreg_mem_model+0x10/0x10 +? kfree+0x125/0x370 +? bnxt_free_ring.isra.0+0x2eb/0x500 +? bnxt_free_mem+0x5ac/0x2500 +xdp_rxq_info_unreg+0x4a/0xd0 +bnxt_free_mem+0x1356/0x2500 +bnxt_close_nic+0xf0/0x3b0 +? __pfx_bnxt_close_nic+0x10/0x10 +? ethnl_parse_bit+0x2c6/0x6d0 +? __pfx___nla_validate_parse+0x10/0x10 +? __pfx_ethnl_parse_bit+0x10/0x10 +bnxt_set_features+0x2a8/0x3e0 +__netdev_update_features+0x4dc/0x1370 +? ethnl_parse_bitset+0x4ff/0x750 +? __pfx_ethnl_parse_bitset+0x10/0x10 +? __pfx___netdev_update_features+0x10/0x10 +? mark_held_locks+0xa5/0xf0 +? _raw_spin_unlock_irqrestore+0x42/0x70 +? __pm_runtime_resume+0x7d/0x110 +ethnl_set_features+0x32d/0xa20 + +To fix this problem, it uses rhashtable_lookup_fast() instead of +rhashtable_lookup() with rcu_read_lock(). +Using xa without rcu_read_lock() here is safe. +xa is freed by __xdp_mem_allocator_rcu_free() and this is called by +call_rcu() of mem_xa_remove(). +The mem_xa_remove() is called by page_pool_destroy() if a reference +count reaches 0. +The xa is already protected by the reference count mechanism well in the +control plane. +So removing rcu_read_lock() for page_pool_destroy() is safe. + +Fixes: c3f812cea0d7 ("page_pool: do not release pool until inflight == 0.") +Signed-off-by: Taehee Yoo +Reviewed-by: Jakub Kicinski +Link: https://patch.msgid.link/20240712095116.3801586-1-ap420073@gmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/core/xdp.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/net/core/xdp.c b/net/core/xdp.c +index fd98d6059007c..b2ad644df21f1 100644 +--- a/net/core/xdp.c ++++ b/net/core/xdp.c +@@ -124,10 +124,8 @@ void xdp_unreg_mem_model(struct xdp_mem_info *mem) + return; + + if (type == MEM_TYPE_PAGE_POOL) { +- rcu_read_lock(); +- xa = rhashtable_lookup(mem_id_ht, &id, mem_id_rht_params); ++ xa = rhashtable_lookup_fast(mem_id_ht, &id, mem_id_rht_params); + page_pool_destroy(xa->page_pool); +- rcu_read_unlock(); + } + } + EXPORT_SYMBOL_GPL(xdp_unreg_mem_model); +-- +2.43.0 + diff --git a/queue-5.10/xprtrdma-fix-rpcrdma_reqs_reset.patch b/queue-5.10/xprtrdma-fix-rpcrdma_reqs_reset.patch new file mode 100644 index 00000000000..f1cbaf19454 --- /dev/null +++ b/queue-5.10/xprtrdma-fix-rpcrdma_reqs_reset.patch @@ -0,0 +1,85 @@ +From 864803acfc4b41c46c69540a53b1ca0a8dd4b3ac Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 4 Jun 2024 15:45:23 -0400 +Subject: xprtrdma: Fix rpcrdma_reqs_reset() + +From: Chuck Lever + +[ Upstream commit acd9f2dd23c632568156217aac7a05f5a0313152 ] + +Avoid FastReg operations getting MW_BIND_ERR after a reconnect. + +rpcrdma_reqs_reset() is called on transport tear-down to get each +rpcrdma_req back into a clean state. + +MRs on req->rl_registered are waiting for a FastReg, are already +registered, or are waiting for invalidation. If the transport is +being torn down when reqs_reset() is called, the matching LocalInv +might never be posted. That leaves these MR registered /and/ on +req->rl_free_mrs, where they can be re-used for the next +connection. + +Since xprtrdma does not keep specific track of the MR state, it's +not possible to know what state these MRs are in, so the only safe +thing to do is release them immediately. + +Fixes: 5de55ce951a1 ("xprtrdma: Release in-flight MRs on disconnect") +Signed-off-by: Chuck Lever +Signed-off-by: Anna Schumaker +Signed-off-by: Sasha Levin +--- + net/sunrpc/xprtrdma/frwr_ops.c | 3 ++- + net/sunrpc/xprtrdma/verbs.c | 16 +++++++++++++++- + 2 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c +index 177099f6ae182..2035d748d923c 100644 +--- a/net/sunrpc/xprtrdma/frwr_ops.c ++++ b/net/sunrpc/xprtrdma/frwr_ops.c +@@ -86,7 +86,8 @@ static void frwr_mr_recycle(struct rpcrdma_mr *mr) + frwr_mr_release(mr); + } + +-/* frwr_reset - Place MRs back on the free list ++/** ++ * frwr_reset - Place MRs back on @req's free list + * @req: request to reset + * + * Used after a failed marshal. For FRWR, this means the MRs +diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c +index 167f0d99b8580..9262c94a13c1d 100644 +--- a/net/sunrpc/xprtrdma/verbs.c ++++ b/net/sunrpc/xprtrdma/verbs.c +@@ -932,6 +932,8 @@ static int rpcrdma_reqs_setup(struct rpcrdma_xprt *r_xprt) + + static void rpcrdma_req_reset(struct rpcrdma_req *req) + { ++ struct rpcrdma_mr *mr; ++ + /* Credits are valid for only one connection */ + req->rl_slot.rq_cong = 0; + +@@ -941,7 +943,19 @@ static void rpcrdma_req_reset(struct rpcrdma_req *req) + rpcrdma_regbuf_dma_unmap(req->rl_sendbuf); + rpcrdma_regbuf_dma_unmap(req->rl_recvbuf); + +- frwr_reset(req); ++ /* The verbs consumer can't know the state of an MR on the ++ * req->rl_registered list unless a successful completion ++ * has occurred, so they cannot be re-used. ++ */ ++ while ((mr = rpcrdma_mr_pop(&req->rl_registered))) { ++ struct rpcrdma_buffer *buf = &mr->mr_xprt->rx_buf; ++ ++ spin_lock(&buf->rb_lock); ++ list_del(&mr->mr_all); ++ spin_unlock(&buf->rb_lock); ++ ++ frwr_mr_release(mr); ++ } + } + + /* ASSUMPTION: the rb_allreqs list is stable for the duration, +-- +2.43.0 + diff --git a/queue-5.10/xprtrdma-rename-frwr_release_mr.patch b/queue-5.10/xprtrdma-rename-frwr_release_mr.patch new file mode 100644 index 00000000000..99922338c9b --- /dev/null +++ b/queue-5.10/xprtrdma-rename-frwr_release_mr.patch @@ -0,0 +1,88 @@ +From 5c5c988e8c16b3b5cf477dea6903400cdd7322c5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 19 Apr 2021 14:03:00 -0400 +Subject: xprtrdma: Rename frwr_release_mr() + +From: Chuck Lever + +[ Upstream commit f912af77e2c1ba25bd40534668b10da5b20f686a ] + +Clean up: To be consistent with other functions in this source file, +follow the naming convention of putting the object being acted upon +before the action itself. + +Signed-off-by: Chuck Lever +Signed-off-by: Trond Myklebust +Stable-dep-of: acd9f2dd23c6 ("xprtrdma: Fix rpcrdma_reqs_reset()") +Signed-off-by: Sasha Levin +--- + net/sunrpc/xprtrdma/frwr_ops.c | 6 +++--- + net/sunrpc/xprtrdma/verbs.c | 4 ++-- + net/sunrpc/xprtrdma/xprt_rdma.h | 2 +- + 3 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c +index bf3627dce5529..177099f6ae182 100644 +--- a/net/sunrpc/xprtrdma/frwr_ops.c ++++ b/net/sunrpc/xprtrdma/frwr_ops.c +@@ -50,11 +50,11 @@ + #endif + + /** +- * frwr_release_mr - Destroy one MR ++ * frwr_mr_release - Destroy one MR + * @mr: MR allocated by frwr_mr_init + * + */ +-void frwr_release_mr(struct rpcrdma_mr *mr) ++void frwr_mr_release(struct rpcrdma_mr *mr) + { + int rc; + +@@ -83,7 +83,7 @@ static void frwr_mr_recycle(struct rpcrdma_mr *mr) + r_xprt->rx_stats.mrs_recycled++; + spin_unlock(&r_xprt->rx_buf.rb_lock); + +- frwr_release_mr(mr); ++ frwr_mr_release(mr); + } + + /* frwr_reset - Place MRs back on the free list +diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c +index 9e9df38b29f74..167f0d99b8580 100644 +--- a/net/sunrpc/xprtrdma/verbs.c ++++ b/net/sunrpc/xprtrdma/verbs.c +@@ -1100,7 +1100,7 @@ void rpcrdma_req_destroy(struct rpcrdma_req *req) + list_del(&mr->mr_all); + spin_unlock(&buf->rb_lock); + +- frwr_release_mr(mr); ++ frwr_mr_release(mr); + } + + rpcrdma_regbuf_free(req->rl_recvbuf); +@@ -1131,7 +1131,7 @@ static void rpcrdma_mrs_destroy(struct rpcrdma_xprt *r_xprt) + list_del(&mr->mr_all); + spin_unlock(&buf->rb_lock); + +- frwr_release_mr(mr); ++ frwr_mr_release(mr); + + spin_lock(&buf->rb_lock); + } +diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h +index 702f0344523cc..73c8ab89456b0 100644 +--- a/net/sunrpc/xprtrdma/xprt_rdma.h ++++ b/net/sunrpc/xprtrdma/xprt_rdma.h +@@ -520,7 +520,7 @@ rpcrdma_data_dir(bool writing) + void frwr_reset(struct rpcrdma_req *req); + int frwr_query_device(struct rpcrdma_ep *ep, const struct ib_device *device); + int frwr_mr_init(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr *mr); +-void frwr_release_mr(struct rpcrdma_mr *mr); ++void frwr_mr_release(struct rpcrdma_mr *mr); + struct rpcrdma_mr_seg *frwr_map(struct rpcrdma_xprt *r_xprt, + struct rpcrdma_mr_seg *seg, + int nsegs, bool writing, __be32 xid, +-- +2.43.0 +