9164 lines
304 KiB
Diff
9164 lines
304 KiB
Diff
diff --git a/Documentation/fault-injection/provoke-crashes.rst b/Documentation/fault-injection/provoke-crashes.rst
|
|
index a20ba5d939320..18de17354206a 100644
|
|
--- a/Documentation/fault-injection/provoke-crashes.rst
|
|
+++ b/Documentation/fault-injection/provoke-crashes.rst
|
|
@@ -29,7 +29,7 @@ recur_count
|
|
cpoint_name
|
|
Where in the kernel to trigger the action. It can be
|
|
one of INT_HARDWARE_ENTRY, INT_HW_IRQ_EN, INT_TASKLET_ENTRY,
|
|
- FS_DEVRW, MEM_SWAPOUT, TIMERADD, SCSI_DISPATCH_CMD,
|
|
+ FS_DEVRW, MEM_SWAPOUT, TIMERADD, SCSI_QUEUE_RQ,
|
|
IDE_CORE_CP, or DIRECT
|
|
|
|
cpoint_type
|
|
diff --git a/Makefile b/Makefile
|
|
index 982aa1876aa04..91eb017f5296d 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 5
|
|
PATCHLEVEL = 10
|
|
-SUBLEVEL = 64
|
|
+SUBLEVEL = 65
|
|
EXTRAVERSION =
|
|
NAME = Dare mighty things
|
|
|
|
diff --git a/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi b/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi
|
|
index 7028e21bdd980..910eacc8ad3bd 100644
|
|
--- a/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi
|
|
+++ b/arch/arm/boot/dts/aspeed-g6-pinctrl.dtsi
|
|
@@ -208,12 +208,12 @@
|
|
};
|
|
|
|
pinctrl_hvi3c3_default: hvi3c3_default {
|
|
- function = "HVI3C3";
|
|
+ function = "I3C3";
|
|
groups = "HVI3C3";
|
|
};
|
|
|
|
pinctrl_hvi3c4_default: hvi3c4_default {
|
|
- function = "HVI3C4";
|
|
+ function = "I3C4";
|
|
groups = "HVI3C4";
|
|
};
|
|
|
|
diff --git a/arch/arm/boot/dts/at91-sam9x60ek.dts b/arch/arm/boot/dts/at91-sam9x60ek.dts
|
|
index edca66c232c15..ebbc9b23aef1c 100644
|
|
--- a/arch/arm/boot/dts/at91-sam9x60ek.dts
|
|
+++ b/arch/arm/boot/dts/at91-sam9x60ek.dts
|
|
@@ -92,6 +92,8 @@
|
|
|
|
leds {
|
|
compatible = "gpio-leds";
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&pinctrl_gpio_leds>;
|
|
status = "okay"; /* Conflict with pwm0. */
|
|
|
|
red {
|
|
@@ -537,6 +539,10 @@
|
|
AT91_PIOA 19 AT91_PERIPH_A (AT91_PINCTRL_PULL_UP | AT91_PINCTRL_DRIVE_STRENGTH_HI) /* PA19 DAT2 periph A with pullup */
|
|
AT91_PIOA 20 AT91_PERIPH_A (AT91_PINCTRL_PULL_UP | AT91_PINCTRL_DRIVE_STRENGTH_HI)>; /* PA20 DAT3 periph A with pullup */
|
|
};
|
|
+ pinctrl_sdmmc0_cd: sdmmc0_cd {
|
|
+ atmel,pins =
|
|
+ <AT91_PIOA 23 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
+ };
|
|
};
|
|
|
|
sdmmc1 {
|
|
@@ -569,6 +575,14 @@
|
|
AT91_PIOD 16 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
};
|
|
};
|
|
+
|
|
+ leds {
|
|
+ pinctrl_gpio_leds: gpio_leds {
|
|
+ atmel,pins = <AT91_PIOB 11 AT91_PERIPH_GPIO AT91_PINCTRL_NONE
|
|
+ AT91_PIOB 12 AT91_PERIPH_GPIO AT91_PINCTRL_NONE
|
|
+ AT91_PIOB 13 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
+ };
|
|
+ };
|
|
}; /* pinctrl */
|
|
|
|
&pwm0 {
|
|
@@ -580,7 +594,7 @@
|
|
&sdmmc0 {
|
|
bus-width = <4>;
|
|
pinctrl-names = "default";
|
|
- pinctrl-0 = <&pinctrl_sdmmc0_default>;
|
|
+ pinctrl-0 = <&pinctrl_sdmmc0_default &pinctrl_sdmmc0_cd>;
|
|
status = "okay";
|
|
cd-gpios = <&pioA 23 GPIO_ACTIVE_LOW>;
|
|
disable-wp;
|
|
diff --git a/arch/arm/boot/dts/at91-sama5d3_xplained.dts b/arch/arm/boot/dts/at91-sama5d3_xplained.dts
|
|
index 9c55a921263bd..cc55d1684322b 100644
|
|
--- a/arch/arm/boot/dts/at91-sama5d3_xplained.dts
|
|
+++ b/arch/arm/boot/dts/at91-sama5d3_xplained.dts
|
|
@@ -57,6 +57,8 @@
|
|
};
|
|
|
|
spi0: spi@f0004000 {
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&pinctrl_spi0_cs>;
|
|
cs-gpios = <&pioD 13 0>, <0>, <0>, <&pioD 16 0>;
|
|
status = "okay";
|
|
};
|
|
@@ -169,6 +171,8 @@
|
|
};
|
|
|
|
spi1: spi@f8008000 {
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&pinctrl_spi1_cs>;
|
|
cs-gpios = <&pioC 25 0>;
|
|
status = "okay";
|
|
};
|
|
@@ -248,6 +252,26 @@
|
|
<AT91_PIOE 3 AT91_PERIPH_GPIO AT91_PINCTRL_NONE
|
|
AT91_PIOE 4 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
};
|
|
+
|
|
+ pinctrl_gpio_leds: gpio_leds_default {
|
|
+ atmel,pins =
|
|
+ <AT91_PIOE 23 AT91_PERIPH_GPIO AT91_PINCTRL_NONE
|
|
+ AT91_PIOE 24 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
+ };
|
|
+
|
|
+ pinctrl_spi0_cs: spi0_cs_default {
|
|
+ atmel,pins =
|
|
+ <AT91_PIOD 13 AT91_PERIPH_GPIO AT91_PINCTRL_NONE
|
|
+ AT91_PIOD 16 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
+ };
|
|
+
|
|
+ pinctrl_spi1_cs: spi1_cs_default {
|
|
+ atmel,pins = <AT91_PIOC 25 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
+ };
|
|
+
|
|
+ pinctrl_vcc_mmc0_reg_gpio: vcc_mmc0_reg_gpio_default {
|
|
+ atmel,pins = <AT91_PIOE 2 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
+ };
|
|
};
|
|
};
|
|
};
|
|
@@ -339,6 +363,8 @@
|
|
|
|
vcc_mmc0_reg: fixedregulator_mmc0 {
|
|
compatible = "regulator-fixed";
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&pinctrl_vcc_mmc0_reg_gpio>;
|
|
gpio = <&pioE 2 GPIO_ACTIVE_LOW>;
|
|
regulator-name = "mmc0-card-supply";
|
|
regulator-min-microvolt = <3300000>;
|
|
@@ -362,6 +388,9 @@
|
|
|
|
leds {
|
|
compatible = "gpio-leds";
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&pinctrl_gpio_leds>;
|
|
+ status = "okay";
|
|
|
|
d2 {
|
|
label = "d2";
|
|
diff --git a/arch/arm/boot/dts/at91-sama5d4_xplained.dts b/arch/arm/boot/dts/at91-sama5d4_xplained.dts
|
|
index 0b3ad1b580b83..e42dae06b5826 100644
|
|
--- a/arch/arm/boot/dts/at91-sama5d4_xplained.dts
|
|
+++ b/arch/arm/boot/dts/at91-sama5d4_xplained.dts
|
|
@@ -90,6 +90,8 @@
|
|
};
|
|
|
|
spi1: spi@fc018000 {
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&pinctrl_spi0_cs>;
|
|
cs-gpios = <&pioB 21 0>;
|
|
status = "okay";
|
|
};
|
|
@@ -147,6 +149,19 @@
|
|
atmel,pins =
|
|
<AT91_PIOE 1 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
|
|
};
|
|
+ pinctrl_spi0_cs: spi0_cs_default {
|
|
+ atmel,pins =
|
|
+ <AT91_PIOB 21 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
+ };
|
|
+ pinctrl_gpio_leds: gpio_leds_default {
|
|
+ atmel,pins =
|
|
+ <AT91_PIOD 30 AT91_PERIPH_GPIO AT91_PINCTRL_NONE
|
|
+ AT91_PIOE 15 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
+ };
|
|
+ pinctrl_vcc_mmc1_reg: vcc_mmc1_reg {
|
|
+ atmel,pins =
|
|
+ <AT91_PIOE 4 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
|
|
+ };
|
|
};
|
|
};
|
|
};
|
|
@@ -252,6 +267,8 @@
|
|
|
|
leds {
|
|
compatible = "gpio-leds";
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&pinctrl_gpio_leds>;
|
|
status = "okay";
|
|
|
|
d8 {
|
|
@@ -278,6 +295,8 @@
|
|
|
|
vcc_mmc1_reg: fixedregulator_mmc1 {
|
|
compatible = "regulator-fixed";
|
|
+ pinctrl-names = "default";
|
|
+ pinctrl-0 = <&pinctrl_vcc_mmc1_reg>;
|
|
gpio = <&pioE 4 GPIO_ACTIVE_LOW>;
|
|
regulator-name = "VDD MCI1";
|
|
regulator-min-microvolt = <3300000>;
|
|
diff --git a/arch/arm/boot/dts/meson8.dtsi b/arch/arm/boot/dts/meson8.dtsi
|
|
index 04688e8abce2c..740a6c816266c 100644
|
|
--- a/arch/arm/boot/dts/meson8.dtsi
|
|
+++ b/arch/arm/boot/dts/meson8.dtsi
|
|
@@ -251,8 +251,13 @@
|
|
"pp2", "ppmmu2", "pp4", "ppmmu4",
|
|
"pp5", "ppmmu5", "pp6", "ppmmu6";
|
|
resets = <&reset RESET_MALI>;
|
|
+
|
|
clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>;
|
|
clock-names = "bus", "core";
|
|
+
|
|
+ assigned-clocks = <&clkc CLKID_MALI>;
|
|
+ assigned-clock-rates = <318750000>;
|
|
+
|
|
operating-points-v2 = <&gpu_opp_table>;
|
|
};
|
|
};
|
|
diff --git a/arch/arm/boot/dts/meson8b-ec100.dts b/arch/arm/boot/dts/meson8b-ec100.dts
|
|
index ed06102a40140..c6824d26dbbf6 100644
|
|
--- a/arch/arm/boot/dts/meson8b-ec100.dts
|
|
+++ b/arch/arm/boot/dts/meson8b-ec100.dts
|
|
@@ -153,7 +153,7 @@
|
|
regulator-min-microvolt = <860000>;
|
|
regulator-max-microvolt = <1140000>;
|
|
|
|
- vin-supply = <&vcc_5v>;
|
|
+ pwm-supply = <&vcc_5v>;
|
|
|
|
pwms = <&pwm_cd 0 1148 0>;
|
|
pwm-dutycycle-range = <100 0>;
|
|
@@ -237,7 +237,7 @@
|
|
regulator-min-microvolt = <860000>;
|
|
regulator-max-microvolt = <1140000>;
|
|
|
|
- vin-supply = <&vcc_5v>;
|
|
+ pwm-supply = <&vcc_5v>;
|
|
|
|
pwms = <&pwm_cd 1 1148 0>;
|
|
pwm-dutycycle-range = <100 0>;
|
|
diff --git a/arch/arm/boot/dts/meson8b-mxq.dts b/arch/arm/boot/dts/meson8b-mxq.dts
|
|
index 33037ef62d0ad..b2edac1fce6dc 100644
|
|
--- a/arch/arm/boot/dts/meson8b-mxq.dts
|
|
+++ b/arch/arm/boot/dts/meson8b-mxq.dts
|
|
@@ -39,6 +39,8 @@
|
|
regulator-min-microvolt = <860000>;
|
|
regulator-max-microvolt = <1140000>;
|
|
|
|
+ pwm-supply = <&vcc_5v>;
|
|
+
|
|
pwms = <&pwm_cd 0 1148 0>;
|
|
pwm-dutycycle-range = <100 0>;
|
|
|
|
@@ -84,7 +86,7 @@
|
|
regulator-min-microvolt = <860000>;
|
|
regulator-max-microvolt = <1140000>;
|
|
|
|
- vin-supply = <&vcc_5v>;
|
|
+ pwm-supply = <&vcc_5v>;
|
|
|
|
pwms = <&pwm_cd 1 1148 0>;
|
|
pwm-dutycycle-range = <100 0>;
|
|
diff --git a/arch/arm/boot/dts/meson8b-odroidc1.dts b/arch/arm/boot/dts/meson8b-odroidc1.dts
|
|
index 5963566dbcc9d..73ce1c13da24c 100644
|
|
--- a/arch/arm/boot/dts/meson8b-odroidc1.dts
|
|
+++ b/arch/arm/boot/dts/meson8b-odroidc1.dts
|
|
@@ -136,7 +136,7 @@
|
|
regulator-min-microvolt = <860000>;
|
|
regulator-max-microvolt = <1140000>;
|
|
|
|
- vin-supply = <&p5v0>;
|
|
+ pwm-supply = <&p5v0>;
|
|
|
|
pwms = <&pwm_cd 0 12218 0>;
|
|
pwm-dutycycle-range = <91 0>;
|
|
@@ -168,7 +168,7 @@
|
|
regulator-min-microvolt = <860000>;
|
|
regulator-max-microvolt = <1140000>;
|
|
|
|
- vin-supply = <&p5v0>;
|
|
+ pwm-supply = <&p5v0>;
|
|
|
|
pwms = <&pwm_cd 1 12218 0>;
|
|
pwm-dutycycle-range = <91 0>;
|
|
diff --git a/arch/arm64/boot/dts/exynos/exynos7.dtsi b/arch/arm64/boot/dts/exynos/exynos7.dtsi
|
|
index 7599e1a00ff51..48952a556648a 100644
|
|
--- a/arch/arm64/boot/dts/exynos/exynos7.dtsi
|
|
+++ b/arch/arm64/boot/dts/exynos/exynos7.dtsi
|
|
@@ -102,7 +102,7 @@
|
|
#address-cells = <0>;
|
|
interrupt-controller;
|
|
reg = <0x11001000 0x1000>,
|
|
- <0x11002000 0x1000>,
|
|
+ <0x11002000 0x2000>,
|
|
<0x11004000 0x2000>,
|
|
<0x11006000 0x2000>;
|
|
};
|
|
diff --git a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
|
|
index bbd34ae12a53b..2e437f20da39b 100644
|
|
--- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
|
|
+++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts
|
|
@@ -134,6 +134,23 @@
|
|
pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>;
|
|
status = "okay";
|
|
reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>;
|
|
+ /*
|
|
+ * U-Boot port for Turris Mox has a bug which always expects that "ranges" DT property
|
|
+ * contains exactly 2 ranges with 3 (child) address cells, 2 (parent) address cells and
|
|
+ * 2 size cells and also expects that the second range starts at 16 MB offset. If these
|
|
+ * conditions are not met then U-Boot crashes during loading kernel DTB file. PCIe address
|
|
+ * space is 128 MB long, so the best split between MEM and IO is to use fixed 16 MB window
|
|
+ * for IO and the rest 112 MB (64+32+16) for MEM, despite that maximal IO size is just 64 kB.
|
|
+ * This bug is not present in U-Boot ports for other Armada 3700 devices and is fixed in
|
|
+ * U-Boot version 2021.07. See relevant U-Boot commits (the last one contains fix):
|
|
+ * https://source.denx.de/u-boot/u-boot/-/commit/cb2ddb291ee6fcbddd6d8f4ff49089dfe580f5d7
|
|
+ * https://source.denx.de/u-boot/u-boot/-/commit/c64ac3b3185aeb3846297ad7391fc6df8ecd73bf
|
|
+ * https://source.denx.de/u-boot/u-boot/-/commit/4a82fca8e330157081fc132a591ebd99ba02ee33
|
|
+ */
|
|
+ #address-cells = <3>;
|
|
+ #size-cells = <2>;
|
|
+ ranges = <0x81000000 0 0xe8000000 0 0xe8000000 0 0x01000000 /* Port 0 IO */
|
|
+ 0x82000000 0 0xe9000000 0 0xe9000000 0 0x07000000>; /* Port 0 MEM */
|
|
|
|
/* enabled by U-Boot if PCIe module is present */
|
|
status = "disabled";
|
|
diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
|
|
index 83d2d83f7692b..2a2015a153627 100644
|
|
--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
|
|
+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
|
|
@@ -487,8 +487,15 @@
|
|
#interrupt-cells = <1>;
|
|
msi-parent = <&pcie0>;
|
|
msi-controller;
|
|
- ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x1000000 /* Port 0 MEM */
|
|
- 0x81000000 0 0xe9000000 0 0xe9000000 0 0x10000>; /* Port 0 IO*/
|
|
+ /*
|
|
+ * The 128 MiB address range [0xe8000000-0xf0000000] is
|
|
+ * dedicated for PCIe and can be assigned to 8 windows
|
|
+ * with size a power of two. Use one 64 KiB window for
|
|
+ * IO at the end and the remaining seven windows
|
|
+ * (totaling 127 MiB) for MEM.
|
|
+ */
|
|
+ ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x07f00000 /* Port 0 MEM */
|
|
+ 0x81000000 0 0xefff0000 0 0xefff0000 0 0x00010000>; /* Port 0 IO */
|
|
interrupt-map-mask = <0 0 0 7>;
|
|
interrupt-map = <0 0 0 1 &pcie_intc 0>,
|
|
<0 0 0 2 &pcie_intc 1>,
|
|
diff --git a/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi b/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi
|
|
index e3773b05c403b..3c73dfc430afc 100644
|
|
--- a/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi
|
|
+++ b/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi
|
|
@@ -55,7 +55,8 @@
|
|
pinctrl-0 = <&avb_pins>;
|
|
pinctrl-names = "default";
|
|
phy-handle = <&phy0>;
|
|
- phy-mode = "rgmii-id";
|
|
+ rx-internal-delay-ps = <1800>;
|
|
+ tx-internal-delay-ps = <2000>;
|
|
status = "okay";
|
|
|
|
phy0: ethernet-phy@0 {
|
|
diff --git a/arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi b/arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi
|
|
index b9e46aed53362..dde3a07bc417c 100644
|
|
--- a/arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi
|
|
+++ b/arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi
|
|
@@ -19,7 +19,8 @@
|
|
pinctrl-0 = <&avb_pins>;
|
|
pinctrl-names = "default";
|
|
phy-handle = <&phy0>;
|
|
- phy-mode = "rgmii-txid";
|
|
+ tx-internal-delay-ps = <2000>;
|
|
+ rx-internal-delay-ps = <1800>;
|
|
status = "okay";
|
|
|
|
phy0: ethernet-phy@0 {
|
|
diff --git a/arch/arm64/boot/dts/renesas/r8a774a1.dtsi b/arch/arm64/boot/dts/renesas/r8a774a1.dtsi
|
|
index c58a0846db502..a5ebe574fbace 100644
|
|
--- a/arch/arm64/boot/dts/renesas/r8a774a1.dtsi
|
|
+++ b/arch/arm64/boot/dts/renesas/r8a774a1.dtsi
|
|
@@ -1131,6 +1131,8 @@
|
|
power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
|
|
resets = <&cpg 812>;
|
|
phy-mode = "rgmii";
|
|
+ rx-internal-delay-ps = <0>;
|
|
+ tx-internal-delay-ps = <0>;
|
|
iommus = <&ipmmu_ds0 16>;
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
diff --git a/arch/arm64/boot/dts/renesas/r8a774b1.dtsi b/arch/arm64/boot/dts/renesas/r8a774b1.dtsi
|
|
index 9ebf6e58ba31c..20003a41a706b 100644
|
|
--- a/arch/arm64/boot/dts/renesas/r8a774b1.dtsi
|
|
+++ b/arch/arm64/boot/dts/renesas/r8a774b1.dtsi
|
|
@@ -1004,6 +1004,8 @@
|
|
power-domains = <&sysc R8A774B1_PD_ALWAYS_ON>;
|
|
resets = <&cpg 812>;
|
|
phy-mode = "rgmii";
|
|
+ rx-internal-delay-ps = <0>;
|
|
+ tx-internal-delay-ps = <0>;
|
|
iommus = <&ipmmu_ds0 16>;
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
diff --git a/arch/arm64/boot/dts/renesas/r8a774c0.dtsi b/arch/arm64/boot/dts/renesas/r8a774c0.dtsi
|
|
index f27d9b2eb996b..e0e54342cd4c7 100644
|
|
--- a/arch/arm64/boot/dts/renesas/r8a774c0.dtsi
|
|
+++ b/arch/arm64/boot/dts/renesas/r8a774c0.dtsi
|
|
@@ -960,6 +960,7 @@
|
|
power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
|
|
resets = <&cpg 812>;
|
|
phy-mode = "rgmii";
|
|
+ rx-internal-delay-ps = <0>;
|
|
iommus = <&ipmmu_ds0 16>;
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
diff --git a/arch/arm64/boot/dts/renesas/r8a774e1.dtsi b/arch/arm64/boot/dts/renesas/r8a774e1.dtsi
|
|
index 708258696b4f4..2e6c12a46daf5 100644
|
|
--- a/arch/arm64/boot/dts/renesas/r8a774e1.dtsi
|
|
+++ b/arch/arm64/boot/dts/renesas/r8a774e1.dtsi
|
|
@@ -1233,6 +1233,8 @@
|
|
power-domains = <&sysc R8A774E1_PD_ALWAYS_ON>;
|
|
resets = <&cpg 812>;
|
|
phy-mode = "rgmii";
|
|
+ rx-internal-delay-ps = <0>;
|
|
+ tx-internal-delay-ps = <0>;
|
|
iommus = <&ipmmu_ds0 16>;
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
diff --git a/arch/arm64/boot/dts/renesas/r8a77995-draak.dts b/arch/arm64/boot/dts/renesas/r8a77995-draak.dts
|
|
index 8f471881b7a36..2e4bb7ecd5bde 100644
|
|
--- a/arch/arm64/boot/dts/renesas/r8a77995-draak.dts
|
|
+++ b/arch/arm64/boot/dts/renesas/r8a77995-draak.dts
|
|
@@ -277,10 +277,6 @@
|
|
interrupt-parent = <&gpio1>;
|
|
interrupts = <28 IRQ_TYPE_LEVEL_LOW>;
|
|
|
|
- /* Depends on LVDS */
|
|
- max-clock = <135000000>;
|
|
- min-vrefresh = <50>;
|
|
-
|
|
adi,input-depth = <8>;
|
|
adi,input-colorspace = "rgb";
|
|
adi,input-clock = "1x";
|
|
diff --git a/arch/m68k/Kconfig.cpu b/arch/m68k/Kconfig.cpu
|
|
index 694c4fca9f5dc..c17205da47fe3 100644
|
|
--- a/arch/m68k/Kconfig.cpu
|
|
+++ b/arch/m68k/Kconfig.cpu
|
|
@@ -25,6 +25,7 @@ config COLDFIRE
|
|
bool "Coldfire CPU family support"
|
|
select ARCH_HAVE_CUSTOM_GPIO_H
|
|
select CPU_HAS_NO_BITFIELDS
|
|
+ select CPU_HAS_NO_CAS
|
|
select CPU_HAS_NO_MULDIV64
|
|
select GENERIC_CSUM
|
|
select GPIOLIB
|
|
@@ -38,6 +39,7 @@ config M68000
|
|
bool "MC68000"
|
|
depends on !MMU
|
|
select CPU_HAS_NO_BITFIELDS
|
|
+ select CPU_HAS_NO_CAS
|
|
select CPU_HAS_NO_MULDIV64
|
|
select CPU_HAS_NO_UNALIGNED
|
|
select GENERIC_CSUM
|
|
@@ -53,6 +55,7 @@ config M68000
|
|
config MCPU32
|
|
bool
|
|
select CPU_HAS_NO_BITFIELDS
|
|
+ select CPU_HAS_NO_CAS
|
|
select CPU_HAS_NO_UNALIGNED
|
|
select CPU_NO_EFFICIENT_FFS
|
|
help
|
|
@@ -357,7 +360,7 @@ config ADVANCED
|
|
|
|
config RMW_INSNS
|
|
bool "Use read-modify-write instructions"
|
|
- depends on ADVANCED
|
|
+ depends on ADVANCED && !CPU_HAS_NO_CAS
|
|
help
|
|
This allows to use certain instructions that work with indivisible
|
|
read-modify-write bus cycles. While this is faster than the
|
|
@@ -411,6 +414,9 @@ config NODES_SHIFT
|
|
config CPU_HAS_NO_BITFIELDS
|
|
bool
|
|
|
|
+config CPU_HAS_NO_CAS
|
|
+ bool
|
|
+
|
|
config CPU_HAS_NO_MULDIV64
|
|
bool
|
|
|
|
diff --git a/arch/m68k/emu/nfeth.c b/arch/m68k/emu/nfeth.c
|
|
index d2875e32abfca..79e55421cfb18 100644
|
|
--- a/arch/m68k/emu/nfeth.c
|
|
+++ b/arch/m68k/emu/nfeth.c
|
|
@@ -254,8 +254,8 @@ static void __exit nfeth_cleanup(void)
|
|
|
|
for (i = 0; i < MAX_UNIT; i++) {
|
|
if (nfeth_dev[i]) {
|
|
- unregister_netdev(nfeth_dev[0]);
|
|
- free_netdev(nfeth_dev[0]);
|
|
+ unregister_netdev(nfeth_dev[i]);
|
|
+ free_netdev(nfeth_dev[i]);
|
|
}
|
|
}
|
|
free_irq(nfEtherIRQ, nfeth_interrupt);
|
|
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
|
|
index 463c24e26000f..171913b9a9250 100644
|
|
--- a/arch/s390/include/asm/kvm_host.h
|
|
+++ b/arch/s390/include/asm/kvm_host.h
|
|
@@ -957,6 +957,7 @@ struct kvm_arch{
|
|
atomic64_t cmma_dirty_pages;
|
|
/* subset of available cpu features enabled by user space */
|
|
DECLARE_BITMAP(cpu_feat, KVM_S390_VM_CPU_FEAT_NR_BITS);
|
|
+ /* indexed by vcpu_idx */
|
|
DECLARE_BITMAP(idle_mask, KVM_MAX_VCPUS);
|
|
struct kvm_s390_gisa_interrupt gisa_int;
|
|
struct kvm_s390_pv pv;
|
|
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c
|
|
index b6619ae9a3e0c..89fbfb3b1e01d 100644
|
|
--- a/arch/s390/kernel/debug.c
|
|
+++ b/arch/s390/kernel/debug.c
|
|
@@ -24,6 +24,7 @@
|
|
#include <linux/export.h>
|
|
#include <linux/init.h>
|
|
#include <linux/fs.h>
|
|
+#include <linux/minmax.h>
|
|
#include <linux/debugfs.h>
|
|
|
|
#include <asm/debug.h>
|
|
@@ -92,6 +93,8 @@ static int debug_hex_ascii_format_fn(debug_info_t *id, struct debug_view *view,
|
|
char *out_buf, const char *in_buf);
|
|
static int debug_sprintf_format_fn(debug_info_t *id, struct debug_view *view,
|
|
char *out_buf, debug_sprintf_entry_t *curr_event);
|
|
+static void debug_areas_swap(debug_info_t *a, debug_info_t *b);
|
|
+static void debug_events_append(debug_info_t *dest, debug_info_t *src);
|
|
|
|
/* globals */
|
|
|
|
@@ -311,24 +314,6 @@ static debug_info_t *debug_info_create(const char *name, int pages_per_area,
|
|
goto out;
|
|
|
|
rc->mode = mode & ~S_IFMT;
|
|
-
|
|
- /* create root directory */
|
|
- rc->debugfs_root_entry = debugfs_create_dir(rc->name,
|
|
- debug_debugfs_root_entry);
|
|
-
|
|
- /* append new element to linked list */
|
|
- if (!debug_area_first) {
|
|
- /* first element in list */
|
|
- debug_area_first = rc;
|
|
- rc->prev = NULL;
|
|
- } else {
|
|
- /* append element to end of list */
|
|
- debug_area_last->next = rc;
|
|
- rc->prev = debug_area_last;
|
|
- }
|
|
- debug_area_last = rc;
|
|
- rc->next = NULL;
|
|
-
|
|
refcount_set(&rc->ref_count, 1);
|
|
out:
|
|
return rc;
|
|
@@ -388,27 +373,10 @@ static void debug_info_get(debug_info_t *db_info)
|
|
*/
|
|
static void debug_info_put(debug_info_t *db_info)
|
|
{
|
|
- int i;
|
|
-
|
|
if (!db_info)
|
|
return;
|
|
- if (refcount_dec_and_test(&db_info->ref_count)) {
|
|
- for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
|
|
- if (!db_info->views[i])
|
|
- continue;
|
|
- debugfs_remove(db_info->debugfs_entries[i]);
|
|
- }
|
|
- debugfs_remove(db_info->debugfs_root_entry);
|
|
- if (db_info == debug_area_first)
|
|
- debug_area_first = db_info->next;
|
|
- if (db_info == debug_area_last)
|
|
- debug_area_last = db_info->prev;
|
|
- if (db_info->prev)
|
|
- db_info->prev->next = db_info->next;
|
|
- if (db_info->next)
|
|
- db_info->next->prev = db_info->prev;
|
|
+ if (refcount_dec_and_test(&db_info->ref_count))
|
|
debug_info_free(db_info);
|
|
- }
|
|
}
|
|
|
|
/*
|
|
@@ -632,6 +600,31 @@ static int debug_close(struct inode *inode, struct file *file)
|
|
return 0; /* success */
|
|
}
|
|
|
|
+/* Create debugfs entries and add to internal list. */
|
|
+static void _debug_register(debug_info_t *id)
|
|
+{
|
|
+ /* create root directory */
|
|
+ id->debugfs_root_entry = debugfs_create_dir(id->name,
|
|
+ debug_debugfs_root_entry);
|
|
+
|
|
+ /* append new element to linked list */
|
|
+ if (!debug_area_first) {
|
|
+ /* first element in list */
|
|
+ debug_area_first = id;
|
|
+ id->prev = NULL;
|
|
+ } else {
|
|
+ /* append element to end of list */
|
|
+ debug_area_last->next = id;
|
|
+ id->prev = debug_area_last;
|
|
+ }
|
|
+ debug_area_last = id;
|
|
+ id->next = NULL;
|
|
+
|
|
+ debug_register_view(id, &debug_level_view);
|
|
+ debug_register_view(id, &debug_flush_view);
|
|
+ debug_register_view(id, &debug_pages_view);
|
|
+}
|
|
+
|
|
/**
|
|
* debug_register_mode() - creates and initializes debug area.
|
|
*
|
|
@@ -661,19 +654,16 @@ debug_info_t *debug_register_mode(const char *name, int pages_per_area,
|
|
if ((uid != 0) || (gid != 0))
|
|
pr_warn("Root becomes the owner of all s390dbf files in sysfs\n");
|
|
BUG_ON(!initialized);
|
|
- mutex_lock(&debug_mutex);
|
|
|
|
/* create new debug_info */
|
|
rc = debug_info_create(name, pages_per_area, nr_areas, buf_size, mode);
|
|
- if (!rc)
|
|
- goto out;
|
|
- debug_register_view(rc, &debug_level_view);
|
|
- debug_register_view(rc, &debug_flush_view);
|
|
- debug_register_view(rc, &debug_pages_view);
|
|
-out:
|
|
- if (!rc)
|
|
+ if (rc) {
|
|
+ mutex_lock(&debug_mutex);
|
|
+ _debug_register(rc);
|
|
+ mutex_unlock(&debug_mutex);
|
|
+ } else {
|
|
pr_err("Registering debug feature %s failed\n", name);
|
|
- mutex_unlock(&debug_mutex);
|
|
+ }
|
|
return rc;
|
|
}
|
|
EXPORT_SYMBOL(debug_register_mode);
|
|
@@ -702,6 +692,27 @@ debug_info_t *debug_register(const char *name, int pages_per_area,
|
|
}
|
|
EXPORT_SYMBOL(debug_register);
|
|
|
|
+/* Remove debugfs entries and remove from internal list. */
|
|
+static void _debug_unregister(debug_info_t *id)
|
|
+{
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
|
|
+ if (!id->views[i])
|
|
+ continue;
|
|
+ debugfs_remove(id->debugfs_entries[i]);
|
|
+ }
|
|
+ debugfs_remove(id->debugfs_root_entry);
|
|
+ if (id == debug_area_first)
|
|
+ debug_area_first = id->next;
|
|
+ if (id == debug_area_last)
|
|
+ debug_area_last = id->prev;
|
|
+ if (id->prev)
|
|
+ id->prev->next = id->next;
|
|
+ if (id->next)
|
|
+ id->next->prev = id->prev;
|
|
+}
|
|
+
|
|
/**
|
|
* debug_unregister() - give back debug area.
|
|
*
|
|
@@ -715,8 +726,10 @@ void debug_unregister(debug_info_t *id)
|
|
if (!id)
|
|
return;
|
|
mutex_lock(&debug_mutex);
|
|
- debug_info_put(id);
|
|
+ _debug_unregister(id);
|
|
mutex_unlock(&debug_mutex);
|
|
+
|
|
+ debug_info_put(id);
|
|
}
|
|
EXPORT_SYMBOL(debug_unregister);
|
|
|
|
@@ -726,35 +739,28 @@ EXPORT_SYMBOL(debug_unregister);
|
|
*/
|
|
static int debug_set_size(debug_info_t *id, int nr_areas, int pages_per_area)
|
|
{
|
|
- debug_entry_t ***new_areas;
|
|
+ debug_info_t *new_id;
|
|
unsigned long flags;
|
|
- int rc = 0;
|
|
|
|
if (!id || (nr_areas <= 0) || (pages_per_area < 0))
|
|
return -EINVAL;
|
|
- if (pages_per_area > 0) {
|
|
- new_areas = debug_areas_alloc(pages_per_area, nr_areas);
|
|
- if (!new_areas) {
|
|
- pr_info("Allocating memory for %i pages failed\n",
|
|
- pages_per_area);
|
|
- rc = -ENOMEM;
|
|
- goto out;
|
|
- }
|
|
- } else {
|
|
- new_areas = NULL;
|
|
+
|
|
+ new_id = debug_info_alloc("", pages_per_area, nr_areas, id->buf_size,
|
|
+ id->level, ALL_AREAS);
|
|
+ if (!new_id) {
|
|
+ pr_info("Allocating memory for %i pages failed\n",
|
|
+ pages_per_area);
|
|
+ return -ENOMEM;
|
|
}
|
|
+
|
|
spin_lock_irqsave(&id->lock, flags);
|
|
- debug_areas_free(id);
|
|
- id->areas = new_areas;
|
|
- id->nr_areas = nr_areas;
|
|
- id->pages_per_area = pages_per_area;
|
|
- id->active_area = 0;
|
|
- memset(id->active_entries, 0, sizeof(int)*id->nr_areas);
|
|
- memset(id->active_pages, 0, sizeof(int)*id->nr_areas);
|
|
+ debug_events_append(new_id, id);
|
|
+ debug_areas_swap(new_id, id);
|
|
+ debug_info_free(new_id);
|
|
spin_unlock_irqrestore(&id->lock, flags);
|
|
pr_info("%s: set new size (%i pages)\n", id->name, pages_per_area);
|
|
-out:
|
|
- return rc;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
/**
|
|
@@ -821,6 +827,42 @@ static inline debug_entry_t *get_active_entry(debug_info_t *id)
|
|
id->active_entries[id->active_area]);
|
|
}
|
|
|
|
+/* Swap debug areas of a and b. */
|
|
+static void debug_areas_swap(debug_info_t *a, debug_info_t *b)
|
|
+{
|
|
+ swap(a->nr_areas, b->nr_areas);
|
|
+ swap(a->pages_per_area, b->pages_per_area);
|
|
+ swap(a->areas, b->areas);
|
|
+ swap(a->active_area, b->active_area);
|
|
+ swap(a->active_pages, b->active_pages);
|
|
+ swap(a->active_entries, b->active_entries);
|
|
+}
|
|
+
|
|
+/* Append all debug events in active area from source to destination log. */
|
|
+static void debug_events_append(debug_info_t *dest, debug_info_t *src)
|
|
+{
|
|
+ debug_entry_t *from, *to, *last;
|
|
+
|
|
+ if (!src->areas || !dest->areas)
|
|
+ return;
|
|
+
|
|
+ /* Loop over all entries in src, starting with oldest. */
|
|
+ from = get_active_entry(src);
|
|
+ last = from;
|
|
+ do {
|
|
+ if (from->clock != 0LL) {
|
|
+ to = get_active_entry(dest);
|
|
+ memset(to, 0, dest->entry_size);
|
|
+ memcpy(to, from, min(src->entry_size,
|
|
+ dest->entry_size));
|
|
+ proceed_active_entry(dest);
|
|
+ }
|
|
+
|
|
+ proceed_active_entry(src);
|
|
+ from = get_active_entry(src);
|
|
+ } while (from != last);
|
|
+}
|
|
+
|
|
/*
|
|
* debug_finish_entry:
|
|
* - set timestamp, caller address, cpu number etc.
|
|
diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
|
|
index 2f177298c663b..2bb9996ff09b4 100644
|
|
--- a/arch/s390/kvm/interrupt.c
|
|
+++ b/arch/s390/kvm/interrupt.c
|
|
@@ -419,13 +419,13 @@ static unsigned long deliverable_irqs(struct kvm_vcpu *vcpu)
|
|
static void __set_cpu_idle(struct kvm_vcpu *vcpu)
|
|
{
|
|
kvm_s390_set_cpuflags(vcpu, CPUSTAT_WAIT);
|
|
- set_bit(vcpu->vcpu_id, vcpu->kvm->arch.idle_mask);
|
|
+ set_bit(kvm_vcpu_get_idx(vcpu), vcpu->kvm->arch.idle_mask);
|
|
}
|
|
|
|
static void __unset_cpu_idle(struct kvm_vcpu *vcpu)
|
|
{
|
|
kvm_s390_clear_cpuflags(vcpu, CPUSTAT_WAIT);
|
|
- clear_bit(vcpu->vcpu_id, vcpu->kvm->arch.idle_mask);
|
|
+ clear_bit(kvm_vcpu_get_idx(vcpu), vcpu->kvm->arch.idle_mask);
|
|
}
|
|
|
|
static void __reset_intercept_indicators(struct kvm_vcpu *vcpu)
|
|
@@ -3050,18 +3050,18 @@ int kvm_s390_get_irq_state(struct kvm_vcpu *vcpu, __u8 __user *buf, int len)
|
|
|
|
static void __airqs_kick_single_vcpu(struct kvm *kvm, u8 deliverable_mask)
|
|
{
|
|
- int vcpu_id, online_vcpus = atomic_read(&kvm->online_vcpus);
|
|
+ int vcpu_idx, online_vcpus = atomic_read(&kvm->online_vcpus);
|
|
struct kvm_s390_gisa_interrupt *gi = &kvm->arch.gisa_int;
|
|
struct kvm_vcpu *vcpu;
|
|
|
|
- for_each_set_bit(vcpu_id, kvm->arch.idle_mask, online_vcpus) {
|
|
- vcpu = kvm_get_vcpu(kvm, vcpu_id);
|
|
+ for_each_set_bit(vcpu_idx, kvm->arch.idle_mask, online_vcpus) {
|
|
+ vcpu = kvm_get_vcpu(kvm, vcpu_idx);
|
|
if (psw_ioint_disabled(vcpu))
|
|
continue;
|
|
deliverable_mask &= (u8)(vcpu->arch.sie_block->gcr[6] >> 24);
|
|
if (deliverable_mask) {
|
|
/* lately kicked but not yet running */
|
|
- if (test_and_set_bit(vcpu_id, gi->kicked_mask))
|
|
+ if (test_and_set_bit(vcpu_idx, gi->kicked_mask))
|
|
return;
|
|
kvm_s390_vcpu_wakeup(vcpu);
|
|
return;
|
|
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
|
|
index f94b4f78d4dab..7f719b468b440 100644
|
|
--- a/arch/s390/kvm/kvm-s390.c
|
|
+++ b/arch/s390/kvm/kvm-s390.c
|
|
@@ -4015,7 +4015,7 @@ static int vcpu_pre_run(struct kvm_vcpu *vcpu)
|
|
kvm_s390_patch_guest_per_regs(vcpu);
|
|
}
|
|
|
|
- clear_bit(vcpu->vcpu_id, vcpu->kvm->arch.gisa_int.kicked_mask);
|
|
+ clear_bit(kvm_vcpu_get_idx(vcpu), vcpu->kvm->arch.gisa_int.kicked_mask);
|
|
|
|
vcpu->arch.sie_block->icptcode = 0;
|
|
cpuflags = atomic_read(&vcpu->arch.sie_block->cpuflags);
|
|
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
|
|
index 79dcd647b378d..2d134833bca69 100644
|
|
--- a/arch/s390/kvm/kvm-s390.h
|
|
+++ b/arch/s390/kvm/kvm-s390.h
|
|
@@ -79,7 +79,7 @@ static inline int is_vcpu_stopped(struct kvm_vcpu *vcpu)
|
|
|
|
static inline int is_vcpu_idle(struct kvm_vcpu *vcpu)
|
|
{
|
|
- return test_bit(vcpu->vcpu_id, vcpu->kvm->arch.idle_mask);
|
|
+ return test_bit(kvm_vcpu_get_idx(vcpu), vcpu->kvm->arch.idle_mask);
|
|
}
|
|
|
|
static inline int kvm_is_ucontrol(struct kvm *kvm)
|
|
diff --git a/arch/s390/mm/kasan_init.c b/arch/s390/mm/kasan_init.c
|
|
index 5646b39c728a9..e9a9b7b616bc1 100644
|
|
--- a/arch/s390/mm/kasan_init.c
|
|
+++ b/arch/s390/mm/kasan_init.c
|
|
@@ -108,6 +108,9 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
|
sgt_prot &= ~_SEGMENT_ENTRY_NOEXEC;
|
|
}
|
|
|
|
+ /*
|
|
+ * The first 1MB of 1:1 mapping is mapped with 4KB pages
|
|
+ */
|
|
while (address < end) {
|
|
pg_dir = pgd_offset_k(address);
|
|
if (pgd_none(*pg_dir)) {
|
|
@@ -165,30 +168,26 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
|
|
|
pm_dir = pmd_offset(pu_dir, address);
|
|
if (pmd_none(*pm_dir)) {
|
|
- if (mode == POPULATE_ZERO_SHADOW &&
|
|
- IS_ALIGNED(address, PMD_SIZE) &&
|
|
+ if (IS_ALIGNED(address, PMD_SIZE) &&
|
|
end - address >= PMD_SIZE) {
|
|
- pmd_populate(&init_mm, pm_dir,
|
|
- kasan_early_shadow_pte);
|
|
- address = (address + PMD_SIZE) & PMD_MASK;
|
|
- continue;
|
|
- }
|
|
- /* the first megabyte of 1:1 is mapped with 4k pages */
|
|
- if (has_edat && address && end - address >= PMD_SIZE &&
|
|
- mode != POPULATE_ZERO_SHADOW) {
|
|
- void *page;
|
|
-
|
|
- if (mode == POPULATE_ONE2ONE) {
|
|
- page = (void *)address;
|
|
- } else {
|
|
- page = kasan_early_alloc_segment();
|
|
- memset(page, 0, _SEGMENT_SIZE);
|
|
+ if (mode == POPULATE_ZERO_SHADOW) {
|
|
+ pmd_populate(&init_mm, pm_dir, kasan_early_shadow_pte);
|
|
+ address = (address + PMD_SIZE) & PMD_MASK;
|
|
+ continue;
|
|
+ } else if (has_edat && address) {
|
|
+ void *page;
|
|
+
|
|
+ if (mode == POPULATE_ONE2ONE) {
|
|
+ page = (void *)address;
|
|
+ } else {
|
|
+ page = kasan_early_alloc_segment();
|
|
+ memset(page, 0, _SEGMENT_SIZE);
|
|
+ }
|
|
+ pmd_val(*pm_dir) = __pa(page) | sgt_prot;
|
|
+ address = (address + PMD_SIZE) & PMD_MASK;
|
|
+ continue;
|
|
}
|
|
- pmd_val(*pm_dir) = __pa(page) | sgt_prot;
|
|
- address = (address + PMD_SIZE) & PMD_MASK;
|
|
- continue;
|
|
}
|
|
-
|
|
pt_dir = kasan_early_pte_alloc();
|
|
pmd_populate(&init_mm, pm_dir, pt_dir);
|
|
} else if (pmd_large(*pm_dir)) {
|
|
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
|
|
index ca1a105e3b5d4..0ddb1fe353dc8 100644
|
|
--- a/arch/s390/pci/pci.c
|
|
+++ b/arch/s390/pci/pci.c
|
|
@@ -659,9 +659,10 @@ int zpci_enable_device(struct zpci_dev *zdev)
|
|
{
|
|
int rc;
|
|
|
|
- rc = clp_enable_fh(zdev, ZPCI_NR_DMA_SPACES);
|
|
- if (rc)
|
|
+ if (clp_enable_fh(zdev, ZPCI_NR_DMA_SPACES)) {
|
|
+ rc = -EIO;
|
|
goto out;
|
|
+ }
|
|
|
|
rc = zpci_dma_init_device(zdev);
|
|
if (rc)
|
|
@@ -684,7 +685,7 @@ int zpci_disable_device(struct zpci_dev *zdev)
|
|
* The zPCI function may already be disabled by the platform, this is
|
|
* detected in clp_disable_fh() which becomes a no-op.
|
|
*/
|
|
- return clp_disable_fh(zdev);
|
|
+ return clp_disable_fh(zdev) ? -EIO : 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(zpci_disable_device);
|
|
|
|
diff --git a/arch/s390/pci/pci_clp.c b/arch/s390/pci/pci_clp.c
|
|
index d3331596ddbe1..0a0e8b8293bef 100644
|
|
--- a/arch/s390/pci/pci_clp.c
|
|
+++ b/arch/s390/pci/pci_clp.c
|
|
@@ -213,15 +213,19 @@ out:
|
|
}
|
|
|
|
static int clp_refresh_fh(u32 fid);
|
|
-/*
|
|
- * Enable/Disable a given PCI function and update its function handle if
|
|
- * necessary
|
|
+/**
|
|
+ * clp_set_pci_fn() - Execute a command on a PCI function
|
|
+ * @zdev: Function that will be affected
|
|
+ * @nr_dma_as: DMA address space number
|
|
+ * @command: The command code to execute
|
|
+ *
|
|
+ * Returns: 0 on success, < 0 for Linux errors (e.g. -ENOMEM), and
|
|
+ * > 0 for non-success platform responses
|
|
*/
|
|
static int clp_set_pci_fn(struct zpci_dev *zdev, u8 nr_dma_as, u8 command)
|
|
{
|
|
struct clp_req_rsp_set_pci *rrb;
|
|
int rc, retries = 100;
|
|
- u32 fid = zdev->fid;
|
|
|
|
rrb = clp_alloc_block(GFP_KERNEL);
|
|
if (!rrb)
|
|
@@ -245,17 +249,16 @@ static int clp_set_pci_fn(struct zpci_dev *zdev, u8 nr_dma_as, u8 command)
|
|
}
|
|
} while (rrb->response.hdr.rsp == CLP_RC_SETPCIFN_BUSY);
|
|
|
|
- if (rc || rrb->response.hdr.rsp != CLP_RC_OK) {
|
|
- zpci_err("Set PCI FN:\n");
|
|
- zpci_err_clp(rrb->response.hdr.rsp, rc);
|
|
- }
|
|
-
|
|
if (!rc && rrb->response.hdr.rsp == CLP_RC_OK) {
|
|
zdev->fh = rrb->response.fh;
|
|
- } else if (!rc && rrb->response.hdr.rsp == CLP_RC_SETPCIFN_ALRDY &&
|
|
- rrb->response.fh == 0) {
|
|
+ } else if (!rc && rrb->response.hdr.rsp == CLP_RC_SETPCIFN_ALRDY) {
|
|
/* Function is already in desired state - update handle */
|
|
- rc = clp_refresh_fh(fid);
|
|
+ rc = clp_refresh_fh(zdev->fid);
|
|
+ } else {
|
|
+ zpci_err("Set PCI FN:\n");
|
|
+ zpci_err_clp(rrb->response.hdr.rsp, rc);
|
|
+ if (!rc)
|
|
+ rc = rrb->response.hdr.rsp;
|
|
}
|
|
clp_free_block(rrb);
|
|
return rc;
|
|
@@ -301,17 +304,13 @@ int clp_enable_fh(struct zpci_dev *zdev, u8 nr_dma_as)
|
|
|
|
rc = clp_set_pci_fn(zdev, nr_dma_as, CLP_SET_ENABLE_PCI_FN);
|
|
zpci_dbg(3, "ena fid:%x, fh:%x, rc:%d\n", zdev->fid, zdev->fh, rc);
|
|
- if (rc)
|
|
- goto out;
|
|
-
|
|
- if (zpci_use_mio(zdev)) {
|
|
+ if (!rc && zpci_use_mio(zdev)) {
|
|
rc = clp_set_pci_fn(zdev, nr_dma_as, CLP_SET_ENABLE_MIO);
|
|
zpci_dbg(3, "ena mio fid:%x, fh:%x, rc:%d\n",
|
|
zdev->fid, zdev->fh, rc);
|
|
if (rc)
|
|
clp_disable_fh(zdev);
|
|
}
|
|
-out:
|
|
return rc;
|
|
}
|
|
|
|
diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c
|
|
index 921f47b9bb247..ccc9ee1971e89 100644
|
|
--- a/arch/x86/events/amd/ibs.c
|
|
+++ b/arch/x86/events/amd/ibs.c
|
|
@@ -571,6 +571,7 @@ static struct perf_ibs perf_ibs_op = {
|
|
.start = perf_ibs_start,
|
|
.stop = perf_ibs_stop,
|
|
.read = perf_ibs_read,
|
|
+ .capabilities = PERF_PMU_CAP_NO_EXCLUDE,
|
|
},
|
|
.msr = MSR_AMD64_IBSOPCTL,
|
|
.config_mask = IBS_OP_CONFIG_MASK,
|
|
diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
|
|
index fc25c88c7ff29..9b5ff423e9398 100644
|
|
--- a/arch/x86/include/asm/mce.h
|
|
+++ b/arch/x86/include/asm/mce.h
|
|
@@ -259,6 +259,7 @@ enum mcp_flags {
|
|
MCP_TIMESTAMP = BIT(0), /* log time stamp */
|
|
MCP_UC = BIT(1), /* log uncorrected errors */
|
|
MCP_DONTLOG = BIT(2), /* only clear, don't log */
|
|
+ MCP_QUEUE_LOG = BIT(3), /* only queue to genpool */
|
|
};
|
|
bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b);
|
|
|
|
diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c
|
|
index b7a27589dfa0b..056d0367864e9 100644
|
|
--- a/arch/x86/kernel/cpu/mce/core.c
|
|
+++ b/arch/x86/kernel/cpu/mce/core.c
|
|
@@ -817,7 +817,10 @@ log_it:
|
|
if (mca_cfg.dont_log_ce && !mce_usable_address(&m))
|
|
goto clear_it;
|
|
|
|
- mce_log(&m);
|
|
+ if (flags & MCP_QUEUE_LOG)
|
|
+ mce_gen_pool_add(&m);
|
|
+ else
|
|
+ mce_log(&m);
|
|
|
|
clear_it:
|
|
/*
|
|
@@ -1628,10 +1631,12 @@ static void __mcheck_cpu_init_generic(void)
|
|
m_fl = MCP_DONTLOG;
|
|
|
|
/*
|
|
- * Log the machine checks left over from the previous reset.
|
|
+ * Log the machine checks left over from the previous reset. Log them
|
|
+ * only, do not start processing them. That will happen in mcheck_late_init()
|
|
+ * when all consumers have been registered on the notifier chain.
|
|
*/
|
|
bitmap_fill(all_banks, MAX_NR_BANKS);
|
|
- machine_check_poll(MCP_UC | m_fl, &all_banks);
|
|
+ machine_check_poll(MCP_UC | MCP_QUEUE_LOG | m_fl, &all_banks);
|
|
|
|
cr4_set_bits(X86_CR4_MCE);
|
|
|
|
diff --git a/arch/x86/kernel/cpu/resctrl/monitor.c b/arch/x86/kernel/cpu/resctrl/monitor.c
|
|
index 3075624723b27..576f16a505e37 100644
|
|
--- a/arch/x86/kernel/cpu/resctrl/monitor.c
|
|
+++ b/arch/x86/kernel/cpu/resctrl/monitor.c
|
|
@@ -241,6 +241,12 @@ static u64 __mon_event_count(u32 rmid, struct rmid_read *rr)
|
|
case QOS_L3_MBM_LOCAL_EVENT_ID:
|
|
m = &rr->d->mbm_local[rmid];
|
|
break;
|
|
+ default:
|
|
+ /*
|
|
+ * Code would never reach here because an invalid
|
|
+ * event id would fail the __rmid_read.
|
|
+ */
|
|
+ return RMID_VAL_ERROR;
|
|
}
|
|
|
|
if (rr->first) {
|
|
diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
|
|
index 5e25d93ec7d08..060d9a906535c 100644
|
|
--- a/arch/x86/kvm/mmu/mmu.c
|
|
+++ b/arch/x86/kvm/mmu/mmu.c
|
|
@@ -267,12 +267,6 @@ static bool check_mmio_spte(struct kvm_vcpu *vcpu, u64 spte)
|
|
static gpa_t translate_gpa(struct kvm_vcpu *vcpu, gpa_t gpa, u32 access,
|
|
struct x86_exception *exception)
|
|
{
|
|
- /* Check if guest physical address doesn't exceed guest maximum */
|
|
- if (kvm_vcpu_is_illegal_gpa(vcpu, gpa)) {
|
|
- exception->error_code |= PFERR_RSVD_MASK;
|
|
- return UNMAPPED_GVA;
|
|
- }
|
|
-
|
|
return gpa;
|
|
}
|
|
|
|
diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
|
|
index e0c7910207c0f..d5f24a2f3e916 100644
|
|
--- a/arch/x86/kvm/vmx/nested.c
|
|
+++ b/arch/x86/kvm/vmx/nested.c
|
|
@@ -2243,12 +2243,11 @@ static void prepare_vmcs02_early(struct vcpu_vmx *vmx, struct vmcs12 *vmcs12)
|
|
~PIN_BASED_VMX_PREEMPTION_TIMER);
|
|
|
|
/* Posted interrupts setting is only taken from vmcs12. */
|
|
- if (nested_cpu_has_posted_intr(vmcs12)) {
|
|
+ vmx->nested.pi_pending = false;
|
|
+ if (nested_cpu_has_posted_intr(vmcs12))
|
|
vmx->nested.posted_intr_nv = vmcs12->posted_intr_nv;
|
|
- vmx->nested.pi_pending = false;
|
|
- } else {
|
|
+ else
|
|
exec_control &= ~PIN_BASED_POSTED_INTR;
|
|
- }
|
|
pin_controls_set(vmx, exec_control);
|
|
|
|
/*
|
|
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
|
|
index de24d3826788a..fcd8bcb7e0ea9 100644
|
|
--- a/arch/x86/kvm/vmx/vmx.c
|
|
+++ b/arch/x86/kvm/vmx/vmx.c
|
|
@@ -6396,6 +6396,9 @@ static void vmx_handle_exit_irqoff(struct kvm_vcpu *vcpu)
|
|
{
|
|
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
|
|
|
+ if (vmx->emulation_required)
|
|
+ return;
|
|
+
|
|
if (vmx->exit_reason.basic == EXIT_REASON_EXTERNAL_INTERRUPT)
|
|
handle_external_interrupt_irqoff(vcpu);
|
|
else if (vmx->exit_reason.basic == EXIT_REASON_EXCEPTION_NMI)
|
|
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
|
index 812585986bb82..75c59ad27e9fd 100644
|
|
--- a/arch/x86/kvm/x86.c
|
|
+++ b/arch/x86/kvm/x86.c
|
|
@@ -3116,6 +3116,10 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|
if (!msr_info->host_initiated) {
|
|
s64 adj = data - vcpu->arch.ia32_tsc_adjust_msr;
|
|
adjust_tsc_offset_guest(vcpu, adj);
|
|
+ /* Before back to guest, tsc_timestamp must be adjusted
|
|
+ * as well, otherwise guest's percpu pvclock time could jump.
|
|
+ */
|
|
+ kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
|
|
}
|
|
vcpu->arch.ia32_tsc_adjust_msr = data;
|
|
}
|
|
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
|
index c91dca641eb46..8ea37328ca84e 100644
|
|
--- a/block/bfq-iosched.c
|
|
+++ b/block/bfq-iosched.c
|
|
@@ -2251,6 +2251,9 @@ static int bfq_request_merge(struct request_queue *q, struct request **req,
|
|
__rq = bfq_find_rq_fmerge(bfqd, bio, q);
|
|
if (__rq && elv_bio_merge_ok(__rq, bio)) {
|
|
*req = __rq;
|
|
+
|
|
+ if (blk_discard_mergable(__rq))
|
|
+ return ELEVATOR_DISCARD_MERGE;
|
|
return ELEVATOR_FRONT_MERGE;
|
|
}
|
|
|
|
diff --git a/block/bio.c b/block/bio.c
|
|
index 9c931df2d9864..0703a208ca248 100644
|
|
--- a/block/bio.c
|
|
+++ b/block/bio.c
|
|
@@ -978,6 +978,14 @@ static int __bio_iov_bvec_add_pages(struct bio *bio, struct iov_iter *iter)
|
|
return 0;
|
|
}
|
|
|
|
+static void bio_put_pages(struct page **pages, size_t size, size_t off)
|
|
+{
|
|
+ size_t i, nr = DIV_ROUND_UP(size + (off & ~PAGE_MASK), PAGE_SIZE);
|
|
+
|
|
+ for (i = 0; i < nr; i++)
|
|
+ put_page(pages[i]);
|
|
+}
|
|
+
|
|
#define PAGE_PTRS_PER_BVEC (sizeof(struct bio_vec) / sizeof(struct page *))
|
|
|
|
/**
|
|
@@ -1022,8 +1030,10 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
|
|
if (same_page)
|
|
put_page(page);
|
|
} else {
|
|
- if (WARN_ON_ONCE(bio_full(bio, len)))
|
|
- return -EINVAL;
|
|
+ if (WARN_ON_ONCE(bio_full(bio, len))) {
|
|
+ bio_put_pages(pages + i, left, offset);
|
|
+ return -EINVAL;
|
|
+ }
|
|
__bio_add_page(bio, page, len, offset);
|
|
}
|
|
offset = 0;
|
|
@@ -1068,6 +1078,7 @@ static int __bio_iov_append_get_pages(struct bio *bio, struct iov_iter *iter)
|
|
len = min_t(size_t, PAGE_SIZE - offset, left);
|
|
if (bio_add_hw_page(q, bio, page, len, offset,
|
|
max_append_sectors, &same_page) != len) {
|
|
+ bio_put_pages(pages + i, left, offset);
|
|
ret = -EINVAL;
|
|
break;
|
|
}
|
|
diff --git a/block/blk-crypto.c b/block/blk-crypto.c
|
|
index 5da43f0973b46..5ffa9aab49de0 100644
|
|
--- a/block/blk-crypto.c
|
|
+++ b/block/blk-crypto.c
|
|
@@ -332,7 +332,7 @@ int blk_crypto_init_key(struct blk_crypto_key *blk_key, const u8 *raw_key,
|
|
if (mode->keysize == 0)
|
|
return -EINVAL;
|
|
|
|
- if (dun_bytes == 0 || dun_bytes > BLK_CRYPTO_MAX_IV_SIZE)
|
|
+ if (dun_bytes == 0 || dun_bytes > mode->ivsize)
|
|
return -EINVAL;
|
|
|
|
if (!is_power_of_2(data_unit_size))
|
|
diff --git a/block/blk-merge.c b/block/blk-merge.c
|
|
index 349cd7d3af815..26f4bcc10de9d 100644
|
|
--- a/block/blk-merge.c
|
|
+++ b/block/blk-merge.c
|
|
@@ -341,6 +341,8 @@ void __blk_queue_split(struct bio **bio, unsigned int *nr_segs)
|
|
trace_block_split(q, split, (*bio)->bi_iter.bi_sector);
|
|
submit_bio_noacct(*bio);
|
|
*bio = split;
|
|
+
|
|
+ blk_throtl_charge_bio_split(*bio);
|
|
}
|
|
}
|
|
|
|
@@ -700,22 +702,6 @@ static void blk_account_io_merge_request(struct request *req)
|
|
}
|
|
}
|
|
|
|
-/*
|
|
- * Two cases of handling DISCARD merge:
|
|
- * If max_discard_segments > 1, the driver takes every bio
|
|
- * as a range and send them to controller together. The ranges
|
|
- * needn't to be contiguous.
|
|
- * Otherwise, the bios/requests will be handled as same as
|
|
- * others which should be contiguous.
|
|
- */
|
|
-static inline bool blk_discard_mergable(struct request *req)
|
|
-{
|
|
- if (req_op(req) == REQ_OP_DISCARD &&
|
|
- queue_max_discard_segments(req->q) > 1)
|
|
- return true;
|
|
- return false;
|
|
-}
|
|
-
|
|
static enum elv_merge blk_try_req_merge(struct request *req,
|
|
struct request *next)
|
|
{
|
|
diff --git a/block/blk-throttle.c b/block/blk-throttle.c
|
|
index b771c42999827..63e9d00a08321 100644
|
|
--- a/block/blk-throttle.c
|
|
+++ b/block/blk-throttle.c
|
|
@@ -178,6 +178,9 @@ struct throtl_grp {
|
|
unsigned int bad_bio_cnt; /* bios exceeding latency threshold */
|
|
unsigned long bio_cnt_reset_time;
|
|
|
|
+ atomic_t io_split_cnt[2];
|
|
+ atomic_t last_io_split_cnt[2];
|
|
+
|
|
struct blkg_rwstat stat_bytes;
|
|
struct blkg_rwstat stat_ios;
|
|
};
|
|
@@ -771,6 +774,8 @@ static inline void throtl_start_new_slice_with_credit(struct throtl_grp *tg,
|
|
tg->bytes_disp[rw] = 0;
|
|
tg->io_disp[rw] = 0;
|
|
|
|
+ atomic_set(&tg->io_split_cnt[rw], 0);
|
|
+
|
|
/*
|
|
* Previous slice has expired. We must have trimmed it after last
|
|
* bio dispatch. That means since start of last slice, we never used
|
|
@@ -793,6 +798,9 @@ static inline void throtl_start_new_slice(struct throtl_grp *tg, bool rw)
|
|
tg->io_disp[rw] = 0;
|
|
tg->slice_start[rw] = jiffies;
|
|
tg->slice_end[rw] = jiffies + tg->td->throtl_slice;
|
|
+
|
|
+ atomic_set(&tg->io_split_cnt[rw], 0);
|
|
+
|
|
throtl_log(&tg->service_queue,
|
|
"[%c] new slice start=%lu end=%lu jiffies=%lu",
|
|
rw == READ ? 'R' : 'W', tg->slice_start[rw],
|
|
@@ -1025,6 +1033,9 @@ static bool tg_may_dispatch(struct throtl_grp *tg, struct bio *bio,
|
|
jiffies + tg->td->throtl_slice);
|
|
}
|
|
|
|
+ if (iops_limit != UINT_MAX)
|
|
+ tg->io_disp[rw] += atomic_xchg(&tg->io_split_cnt[rw], 0);
|
|
+
|
|
if (tg_with_in_bps_limit(tg, bio, bps_limit, &bps_wait) &&
|
|
tg_with_in_iops_limit(tg, bio, iops_limit, &iops_wait)) {
|
|
if (wait)
|
|
@@ -2046,12 +2057,14 @@ static void throtl_downgrade_check(struct throtl_grp *tg)
|
|
}
|
|
|
|
if (tg->iops[READ][LIMIT_LOW]) {
|
|
+ tg->last_io_disp[READ] += atomic_xchg(&tg->last_io_split_cnt[READ], 0);
|
|
iops = tg->last_io_disp[READ] * HZ / elapsed_time;
|
|
if (iops >= tg->iops[READ][LIMIT_LOW])
|
|
tg->last_low_overflow_time[READ] = now;
|
|
}
|
|
|
|
if (tg->iops[WRITE][LIMIT_LOW]) {
|
|
+ tg->last_io_disp[WRITE] += atomic_xchg(&tg->last_io_split_cnt[WRITE], 0);
|
|
iops = tg->last_io_disp[WRITE] * HZ / elapsed_time;
|
|
if (iops >= tg->iops[WRITE][LIMIT_LOW])
|
|
tg->last_low_overflow_time[WRITE] = now;
|
|
@@ -2170,6 +2183,25 @@ static inline void throtl_update_latency_buckets(struct throtl_data *td)
|
|
}
|
|
#endif
|
|
|
|
+void blk_throtl_charge_bio_split(struct bio *bio)
|
|
+{
|
|
+ struct blkcg_gq *blkg = bio->bi_blkg;
|
|
+ struct throtl_grp *parent = blkg_to_tg(blkg);
|
|
+ struct throtl_service_queue *parent_sq;
|
|
+ bool rw = bio_data_dir(bio);
|
|
+
|
|
+ do {
|
|
+ if (!parent->has_rules[rw])
|
|
+ break;
|
|
+
|
|
+ atomic_inc(&parent->io_split_cnt[rw]);
|
|
+ atomic_inc(&parent->last_io_split_cnt[rw]);
|
|
+
|
|
+ parent_sq = parent->service_queue.parent_sq;
|
|
+ parent = sq_to_tg(parent_sq);
|
|
+ } while (parent);
|
|
+}
|
|
+
|
|
bool blk_throtl_bio(struct bio *bio)
|
|
{
|
|
struct request_queue *q = bio->bi_disk->queue;
|
|
diff --git a/block/blk.h b/block/blk.h
|
|
index ecfd523c68d00..f84c83300f6fa 100644
|
|
--- a/block/blk.h
|
|
+++ b/block/blk.h
|
|
@@ -299,11 +299,13 @@ int create_task_io_context(struct task_struct *task, gfp_t gfp_mask, int node);
|
|
extern int blk_throtl_init(struct request_queue *q);
|
|
extern void blk_throtl_exit(struct request_queue *q);
|
|
extern void blk_throtl_register_queue(struct request_queue *q);
|
|
+extern void blk_throtl_charge_bio_split(struct bio *bio);
|
|
bool blk_throtl_bio(struct bio *bio);
|
|
#else /* CONFIG_BLK_DEV_THROTTLING */
|
|
static inline int blk_throtl_init(struct request_queue *q) { return 0; }
|
|
static inline void blk_throtl_exit(struct request_queue *q) { }
|
|
static inline void blk_throtl_register_queue(struct request_queue *q) { }
|
|
+static inline void blk_throtl_charge_bio_split(struct bio *bio) { }
|
|
static inline bool blk_throtl_bio(struct bio *bio) { return false; }
|
|
#endif /* CONFIG_BLK_DEV_THROTTLING */
|
|
#ifdef CONFIG_BLK_DEV_THROTTLING_LOW
|
|
diff --git a/block/elevator.c b/block/elevator.c
|
|
index 293c5c81397a1..2a525863d4e92 100644
|
|
--- a/block/elevator.c
|
|
+++ b/block/elevator.c
|
|
@@ -336,6 +336,9 @@ enum elv_merge elv_merge(struct request_queue *q, struct request **req,
|
|
__rq = elv_rqhash_find(q, bio->bi_iter.bi_sector);
|
|
if (__rq && elv_bio_merge_ok(__rq, bio)) {
|
|
*req = __rq;
|
|
+
|
|
+ if (blk_discard_mergable(__rq))
|
|
+ return ELEVATOR_DISCARD_MERGE;
|
|
return ELEVATOR_BACK_MERGE;
|
|
}
|
|
|
|
diff --git a/block/mq-deadline.c b/block/mq-deadline.c
|
|
index 2b9635d0dcba8..e4e90761eab35 100644
|
|
--- a/block/mq-deadline.c
|
|
+++ b/block/mq-deadline.c
|
|
@@ -454,6 +454,8 @@ static int dd_request_merge(struct request_queue *q, struct request **rq,
|
|
|
|
if (elv_bio_merge_ok(__rq, bio)) {
|
|
*rq = __rq;
|
|
+ if (blk_discard_mergable(__rq))
|
|
+ return ELEVATOR_DISCARD_MERGE;
|
|
return ELEVATOR_FRONT_MERGE;
|
|
}
|
|
}
|
|
diff --git a/certs/Makefile b/certs/Makefile
|
|
index b6db52ebf0beb..b338799c0b242 100644
|
|
--- a/certs/Makefile
|
|
+++ b/certs/Makefile
|
|
@@ -47,11 +47,19 @@ endif
|
|
redirect_openssl = 2>&1
|
|
quiet_redirect_openssl = 2>&1
|
|
silent_redirect_openssl = 2>/dev/null
|
|
+openssl_available = $(shell openssl help 2>/dev/null && echo yes)
|
|
|
|
# We do it this way rather than having a boolean option for enabling an
|
|
# external private key, because 'make randconfig' might enable such a
|
|
# boolean option and we unfortunately can't make it depend on !RANDCONFIG.
|
|
ifeq ($(CONFIG_MODULE_SIG_KEY),"certs/signing_key.pem")
|
|
+
|
|
+ifeq ($(openssl_available),yes)
|
|
+X509TEXT=$(shell openssl x509 -in "certs/signing_key.pem" -text 2>/dev/null)
|
|
+
|
|
+$(if $(findstring rsaEncryption,$(X509TEXT)),,$(shell rm -f "certs/signing_key.pem"))
|
|
+endif
|
|
+
|
|
$(obj)/signing_key.pem: $(obj)/x509.genkey
|
|
@$(kecho) "###"
|
|
@$(kecho) "### Now generating an X.509 key pair to be used for signing modules."
|
|
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
|
|
index 61c762961ca8e..44f434acfce08 100644
|
|
--- a/drivers/ata/libata-core.c
|
|
+++ b/drivers/ata/libata-core.c
|
|
@@ -5573,7 +5573,7 @@ int ata_host_start(struct ata_host *host)
|
|
have_stop = 1;
|
|
}
|
|
|
|
- if (host->ops->host_stop)
|
|
+ if (host->ops && host->ops->host_stop)
|
|
have_stop = 1;
|
|
|
|
if (have_stop) {
|
|
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
|
|
index 85bb8742f0906..81ad4f867f02d 100644
|
|
--- a/drivers/base/dd.c
|
|
+++ b/drivers/base/dd.c
|
|
@@ -543,7 +543,8 @@ re_probe:
|
|
goto probe_failed;
|
|
}
|
|
|
|
- if (driver_sysfs_add(dev)) {
|
|
+ ret = driver_sysfs_add(dev);
|
|
+ if (ret) {
|
|
pr_err("%s: driver_sysfs_add(%s) failed\n",
|
|
__func__, dev_name(dev));
|
|
goto probe_failed;
|
|
@@ -565,15 +566,18 @@ re_probe:
|
|
goto probe_failed;
|
|
}
|
|
|
|
- if (device_add_groups(dev, drv->dev_groups)) {
|
|
+ ret = device_add_groups(dev, drv->dev_groups);
|
|
+ if (ret) {
|
|
dev_err(dev, "device_add_groups() failed\n");
|
|
goto dev_groups_failed;
|
|
}
|
|
|
|
- if (dev_has_sync_state(dev) &&
|
|
- device_create_file(dev, &dev_attr_state_synced)) {
|
|
- dev_err(dev, "state_synced sysfs add failed\n");
|
|
- goto dev_sysfs_state_synced_failed;
|
|
+ if (dev_has_sync_state(dev)) {
|
|
+ ret = device_create_file(dev, &dev_attr_state_synced);
|
|
+ if (ret) {
|
|
+ dev_err(dev, "state_synced sysfs add failed\n");
|
|
+ goto dev_sysfs_state_synced_failed;
|
|
+ }
|
|
}
|
|
|
|
if (test_remove) {
|
|
diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
|
|
index a529235e6bfe9..f41e4e4993d37 100644
|
|
--- a/drivers/base/firmware_loader/main.c
|
|
+++ b/drivers/base/firmware_loader/main.c
|
|
@@ -164,7 +164,7 @@ static inline int fw_state_wait(struct fw_priv *fw_priv)
|
|
return __fw_state_wait_common(fw_priv, MAX_SCHEDULE_TIMEOUT);
|
|
}
|
|
|
|
-static int fw_cache_piggyback_on_request(const char *name);
|
|
+static void fw_cache_piggyback_on_request(struct fw_priv *fw_priv);
|
|
|
|
static struct fw_priv *__allocate_fw_priv(const char *fw_name,
|
|
struct firmware_cache *fwc,
|
|
@@ -705,10 +705,8 @@ int assign_fw(struct firmware *fw, struct device *device)
|
|
* on request firmware.
|
|
*/
|
|
if (!(fw_priv->opt_flags & FW_OPT_NOCACHE) &&
|
|
- fw_priv->fwc->state == FW_LOADER_START_CACHE) {
|
|
- if (fw_cache_piggyback_on_request(fw_priv->fw_name))
|
|
- kref_get(&fw_priv->ref);
|
|
- }
|
|
+ fw_priv->fwc->state == FW_LOADER_START_CACHE)
|
|
+ fw_cache_piggyback_on_request(fw_priv);
|
|
|
|
/* pass the pages buffer to driver at the last minute */
|
|
fw_set_page_data(fw_priv, fw);
|
|
@@ -1257,11 +1255,11 @@ static int __fw_entry_found(const char *name)
|
|
return 0;
|
|
}
|
|
|
|
-static int fw_cache_piggyback_on_request(const char *name)
|
|
+static void fw_cache_piggyback_on_request(struct fw_priv *fw_priv)
|
|
{
|
|
- struct firmware_cache *fwc = &fw_cache;
|
|
+ const char *name = fw_priv->fw_name;
|
|
+ struct firmware_cache *fwc = fw_priv->fwc;
|
|
struct fw_cache_entry *fce;
|
|
- int ret = 0;
|
|
|
|
spin_lock(&fwc->name_lock);
|
|
if (__fw_entry_found(name))
|
|
@@ -1269,13 +1267,12 @@ static int fw_cache_piggyback_on_request(const char *name)
|
|
|
|
fce = alloc_fw_cache_entry(name);
|
|
if (fce) {
|
|
- ret = 1;
|
|
list_add(&fce->list, &fwc->fw_names);
|
|
+ kref_get(&fw_priv->ref);
|
|
pr_debug("%s: fw: %s\n", __func__, name);
|
|
}
|
|
found:
|
|
spin_unlock(&fwc->name_lock);
|
|
- return ret;
|
|
}
|
|
|
|
static void free_fw_cache_entry(struct fw_cache_entry *fce)
|
|
@@ -1506,9 +1503,8 @@ static inline void unregister_fw_pm_ops(void)
|
|
unregister_pm_notifier(&fw_cache.pm_notify);
|
|
}
|
|
#else
|
|
-static int fw_cache_piggyback_on_request(const char *name)
|
|
+static void fw_cache_piggyback_on_request(struct fw_priv *fw_priv)
|
|
{
|
|
- return 0;
|
|
}
|
|
static inline int register_fw_pm_ops(void)
|
|
{
|
|
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
|
|
index 5db536ccfcd6b..456a1787e18d0 100644
|
|
--- a/drivers/base/regmap/regmap.c
|
|
+++ b/drivers/base/regmap/regmap.c
|
|
@@ -1652,7 +1652,7 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
|
|
if (ret) {
|
|
dev_err(map->dev,
|
|
"Error in caching of register: %x ret: %d\n",
|
|
- reg + i, ret);
|
|
+ reg + regmap_get_offset(map, i), ret);
|
|
return ret;
|
|
}
|
|
}
|
|
diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
|
|
index 6535614a7dc13..1df2b5801c3bc 100644
|
|
--- a/drivers/bcma/main.c
|
|
+++ b/drivers/bcma/main.c
|
|
@@ -236,6 +236,7 @@ EXPORT_SYMBOL(bcma_core_irq);
|
|
|
|
void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core)
|
|
{
|
|
+ device_initialize(&core->dev);
|
|
core->dev.release = bcma_release_core_dev;
|
|
core->dev.bus = &bcma_bus_type;
|
|
dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index);
|
|
@@ -277,11 +278,10 @@ static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core)
|
|
{
|
|
int err;
|
|
|
|
- err = device_register(&core->dev);
|
|
+ err = device_add(&core->dev);
|
|
if (err) {
|
|
bcma_err(bus, "Could not register dev for core 0x%03X\n",
|
|
core->id.id);
|
|
- put_device(&core->dev);
|
|
return;
|
|
}
|
|
core->dev_registered = true;
|
|
@@ -372,7 +372,7 @@ void bcma_unregister_cores(struct bcma_bus *bus)
|
|
/* Now noone uses internally-handled cores, we can free them */
|
|
list_for_each_entry_safe(core, tmp, &bus->cores, list) {
|
|
list_del(&core->list);
|
|
- kfree(core);
|
|
+ put_device(&core->dev);
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
|
|
index 59c452fff8352..98274ba0701d6 100644
|
|
--- a/drivers/block/nbd.c
|
|
+++ b/drivers/block/nbd.c
|
|
@@ -1759,7 +1759,17 @@ static int nbd_dev_add(int index)
|
|
refcount_set(&nbd->refs, 1);
|
|
INIT_LIST_HEAD(&nbd->list);
|
|
disk->major = NBD_MAJOR;
|
|
+
|
|
+ /* Too big first_minor can cause duplicate creation of
|
|
+ * sysfs files/links, since first_minor will be truncated to
|
|
+ * byte in __device_add_disk().
|
|
+ */
|
|
disk->first_minor = index << part_shift;
|
|
+ if (disk->first_minor > 0xff) {
|
|
+ err = -EINVAL;
|
|
+ goto out_free_idr;
|
|
+ }
|
|
+
|
|
disk->fops = &nbd_fops;
|
|
disk->private_data = nbd;
|
|
sprintf(disk->disk_name, "nbd%d", index);
|
|
diff --git a/drivers/char/tpm/tpm_ibmvtpm.c b/drivers/char/tpm/tpm_ibmvtpm.c
|
|
index 994385bf37c0c..3ca7528322f53 100644
|
|
--- a/drivers/char/tpm/tpm_ibmvtpm.c
|
|
+++ b/drivers/char/tpm/tpm_ibmvtpm.c
|
|
@@ -106,17 +106,12 @@ static int tpm_ibmvtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count)
|
|
{
|
|
struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
|
|
u16 len;
|
|
- int sig;
|
|
|
|
if (!ibmvtpm->rtce_buf) {
|
|
dev_err(ibmvtpm->dev, "ibmvtpm device is not ready\n");
|
|
return 0;
|
|
}
|
|
|
|
- sig = wait_event_interruptible(ibmvtpm->wq, !ibmvtpm->tpm_processing_cmd);
|
|
- if (sig)
|
|
- return -EINTR;
|
|
-
|
|
len = ibmvtpm->res_len;
|
|
|
|
if (count < len) {
|
|
@@ -237,7 +232,7 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
|
* set the processing flag before the Hcall, since we may get the
|
|
* result (interrupt) before even being able to check rc.
|
|
*/
|
|
- ibmvtpm->tpm_processing_cmd = true;
|
|
+ ibmvtpm->tpm_processing_cmd = 1;
|
|
|
|
again:
|
|
rc = ibmvtpm_send_crq(ibmvtpm->vdev,
|
|
@@ -255,7 +250,7 @@ again:
|
|
goto again;
|
|
}
|
|
dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc);
|
|
- ibmvtpm->tpm_processing_cmd = false;
|
|
+ ibmvtpm->tpm_processing_cmd = 0;
|
|
}
|
|
|
|
spin_unlock(&ibmvtpm->rtce_lock);
|
|
@@ -269,7 +264,9 @@ static void tpm_ibmvtpm_cancel(struct tpm_chip *chip)
|
|
|
|
static u8 tpm_ibmvtpm_status(struct tpm_chip *chip)
|
|
{
|
|
- return 0;
|
|
+ struct ibmvtpm_dev *ibmvtpm = dev_get_drvdata(&chip->dev);
|
|
+
|
|
+ return ibmvtpm->tpm_processing_cmd;
|
|
}
|
|
|
|
/**
|
|
@@ -459,7 +456,7 @@ static const struct tpm_class_ops tpm_ibmvtpm = {
|
|
.send = tpm_ibmvtpm_send,
|
|
.cancel = tpm_ibmvtpm_cancel,
|
|
.status = tpm_ibmvtpm_status,
|
|
- .req_complete_mask = 0,
|
|
+ .req_complete_mask = 1,
|
|
.req_complete_val = 0,
|
|
.req_canceled = tpm_ibmvtpm_req_canceled,
|
|
};
|
|
@@ -552,7 +549,7 @@ static void ibmvtpm_crq_process(struct ibmvtpm_crq *crq,
|
|
case VTPM_TPM_COMMAND_RES:
|
|
/* len of the data in rtce buffer */
|
|
ibmvtpm->res_len = be16_to_cpu(crq->len);
|
|
- ibmvtpm->tpm_processing_cmd = false;
|
|
+ ibmvtpm->tpm_processing_cmd = 0;
|
|
wake_up_interruptible(&ibmvtpm->wq);
|
|
return;
|
|
default:
|
|
@@ -690,8 +687,15 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
|
|
goto init_irq_cleanup;
|
|
}
|
|
|
|
- if (!strcmp(id->compat, "IBM,vtpm20")) {
|
|
+
|
|
+ if (!strcmp(id->compat, "IBM,vtpm20"))
|
|
chip->flags |= TPM_CHIP_FLAG_TPM2;
|
|
+
|
|
+ rc = tpm_get_timeouts(chip);
|
|
+ if (rc)
|
|
+ goto init_irq_cleanup;
|
|
+
|
|
+ if (chip->flags & TPM_CHIP_FLAG_TPM2) {
|
|
rc = tpm2_get_cc_attrs_tbl(chip);
|
|
if (rc)
|
|
goto init_irq_cleanup;
|
|
diff --git a/drivers/char/tpm/tpm_ibmvtpm.h b/drivers/char/tpm/tpm_ibmvtpm.h
|
|
index b92aa7d3e93e7..51198b137461e 100644
|
|
--- a/drivers/char/tpm/tpm_ibmvtpm.h
|
|
+++ b/drivers/char/tpm/tpm_ibmvtpm.h
|
|
@@ -41,7 +41,7 @@ struct ibmvtpm_dev {
|
|
wait_queue_head_t wq;
|
|
u16 res_len;
|
|
u32 vtpm_version;
|
|
- bool tpm_processing_cmd;
|
|
+ u8 tpm_processing_cmd;
|
|
};
|
|
|
|
#define CRQ_RES_BUF_SIZE PAGE_SIZE
|
|
diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c
|
|
index 47680237d0beb..8bc893df47364 100644
|
|
--- a/drivers/clk/mvebu/kirkwood.c
|
|
+++ b/drivers/clk/mvebu/kirkwood.c
|
|
@@ -265,6 +265,7 @@ static const char *powersave_parents[] = {
|
|
static const struct clk_muxing_soc_desc kirkwood_mux_desc[] __initconst = {
|
|
{ "powersave", powersave_parents, ARRAY_SIZE(powersave_parents),
|
|
11, 1, 0 },
|
|
+ { }
|
|
};
|
|
|
|
static struct clk *clk_muxing_get_src(
|
|
diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c
|
|
index 760777458a909..2acfcc966bb54 100644
|
|
--- a/drivers/clocksource/sh_cmt.c
|
|
+++ b/drivers/clocksource/sh_cmt.c
|
|
@@ -572,7 +572,8 @@ static int sh_cmt_start(struct sh_cmt_channel *ch, unsigned long flag)
|
|
ch->flags |= flag;
|
|
|
|
/* setup timeout if no clockevent */
|
|
- if ((flag == FLAG_CLOCKSOURCE) && (!(ch->flags & FLAG_CLOCKEVENT)))
|
|
+ if (ch->cmt->num_channels == 1 &&
|
|
+ flag == FLAG_CLOCKSOURCE && (!(ch->flags & FLAG_CLOCKEVENT)))
|
|
__sh_cmt_set_next(ch, ch->max_match_value);
|
|
out:
|
|
raw_spin_unlock_irqrestore(&ch->lock, flags);
|
|
@@ -608,20 +609,25 @@ static struct sh_cmt_channel *cs_to_sh_cmt(struct clocksource *cs)
|
|
static u64 sh_cmt_clocksource_read(struct clocksource *cs)
|
|
{
|
|
struct sh_cmt_channel *ch = cs_to_sh_cmt(cs);
|
|
- unsigned long flags;
|
|
u32 has_wrapped;
|
|
- u64 value;
|
|
- u32 raw;
|
|
|
|
- raw_spin_lock_irqsave(&ch->lock, flags);
|
|
- value = ch->total_cycles;
|
|
- raw = sh_cmt_get_counter(ch, &has_wrapped);
|
|
+ if (ch->cmt->num_channels == 1) {
|
|
+ unsigned long flags;
|
|
+ u64 value;
|
|
+ u32 raw;
|
|
|
|
- if (unlikely(has_wrapped))
|
|
- raw += ch->match_value + 1;
|
|
- raw_spin_unlock_irqrestore(&ch->lock, flags);
|
|
+ raw_spin_lock_irqsave(&ch->lock, flags);
|
|
+ value = ch->total_cycles;
|
|
+ raw = sh_cmt_get_counter(ch, &has_wrapped);
|
|
+
|
|
+ if (unlikely(has_wrapped))
|
|
+ raw += ch->match_value + 1;
|
|
+ raw_spin_unlock_irqrestore(&ch->lock, flags);
|
|
+
|
|
+ return value + raw;
|
|
+ }
|
|
|
|
- return value + raw;
|
|
+ return sh_cmt_get_counter(ch, &has_wrapped);
|
|
}
|
|
|
|
static int sh_cmt_clocksource_enable(struct clocksource *cs)
|
|
@@ -684,7 +690,7 @@ static int sh_cmt_register_clocksource(struct sh_cmt_channel *ch,
|
|
cs->disable = sh_cmt_clocksource_disable;
|
|
cs->suspend = sh_cmt_clocksource_suspend;
|
|
cs->resume = sh_cmt_clocksource_resume;
|
|
- cs->mask = CLOCKSOURCE_MASK(sizeof(u64) * 8);
|
|
+ cs->mask = CLOCKSOURCE_MASK(ch->cmt->info->width);
|
|
cs->flags = CLOCK_SOURCE_IS_CONTINUOUS;
|
|
|
|
dev_info(&ch->cmt->pdev->dev, "ch%u: used as clock source\n",
|
|
diff --git a/drivers/counter/104-quad-8.c b/drivers/counter/104-quad-8.c
|
|
index 78766b6ec271a..21bb2bb767a1e 100644
|
|
--- a/drivers/counter/104-quad-8.c
|
|
+++ b/drivers/counter/104-quad-8.c
|
|
@@ -1224,12 +1224,13 @@ static ssize_t quad8_count_ceiling_write(struct counter_device *counter,
|
|
case 1:
|
|
case 3:
|
|
quad8_preset_register_set(priv, count->id, ceiling);
|
|
- break;
|
|
+ mutex_unlock(&priv->lock);
|
|
+ return len;
|
|
}
|
|
|
|
mutex_unlock(&priv->lock);
|
|
|
|
- return len;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
static ssize_t quad8_count_preset_enable_read(struct counter_device *counter,
|
|
diff --git a/drivers/crypto/mxs-dcp.c b/drivers/crypto/mxs-dcp.c
|
|
index 909a7eb748e35..7daed8b78ac83 100644
|
|
--- a/drivers/crypto/mxs-dcp.c
|
|
+++ b/drivers/crypto/mxs-dcp.c
|
|
@@ -169,15 +169,19 @@ static struct dcp *global_sdcp;
|
|
|
|
static int mxs_dcp_start_dma(struct dcp_async_ctx *actx)
|
|
{
|
|
+ int dma_err;
|
|
struct dcp *sdcp = global_sdcp;
|
|
const int chan = actx->chan;
|
|
uint32_t stat;
|
|
unsigned long ret;
|
|
struct dcp_dma_desc *desc = &sdcp->coh->desc[actx->chan];
|
|
-
|
|
dma_addr_t desc_phys = dma_map_single(sdcp->dev, desc, sizeof(*desc),
|
|
DMA_TO_DEVICE);
|
|
|
|
+ dma_err = dma_mapping_error(sdcp->dev, desc_phys);
|
|
+ if (dma_err)
|
|
+ return dma_err;
|
|
+
|
|
reinit_completion(&sdcp->completion[chan]);
|
|
|
|
/* Clear status register. */
|
|
@@ -215,18 +219,29 @@ static int mxs_dcp_start_dma(struct dcp_async_ctx *actx)
|
|
static int mxs_dcp_run_aes(struct dcp_async_ctx *actx,
|
|
struct skcipher_request *req, int init)
|
|
{
|
|
+ dma_addr_t key_phys, src_phys, dst_phys;
|
|
struct dcp *sdcp = global_sdcp;
|
|
struct dcp_dma_desc *desc = &sdcp->coh->desc[actx->chan];
|
|
struct dcp_aes_req_ctx *rctx = skcipher_request_ctx(req);
|
|
int ret;
|
|
|
|
- dma_addr_t key_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_key,
|
|
- 2 * AES_KEYSIZE_128,
|
|
- DMA_TO_DEVICE);
|
|
- dma_addr_t src_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_in_buf,
|
|
- DCP_BUF_SZ, DMA_TO_DEVICE);
|
|
- dma_addr_t dst_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_out_buf,
|
|
- DCP_BUF_SZ, DMA_FROM_DEVICE);
|
|
+ key_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_key,
|
|
+ 2 * AES_KEYSIZE_128, DMA_TO_DEVICE);
|
|
+ ret = dma_mapping_error(sdcp->dev, key_phys);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ src_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_in_buf,
|
|
+ DCP_BUF_SZ, DMA_TO_DEVICE);
|
|
+ ret = dma_mapping_error(sdcp->dev, src_phys);
|
|
+ if (ret)
|
|
+ goto err_src;
|
|
+
|
|
+ dst_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_out_buf,
|
|
+ DCP_BUF_SZ, DMA_FROM_DEVICE);
|
|
+ ret = dma_mapping_error(sdcp->dev, dst_phys);
|
|
+ if (ret)
|
|
+ goto err_dst;
|
|
|
|
if (actx->fill % AES_BLOCK_SIZE) {
|
|
dev_err(sdcp->dev, "Invalid block size!\n");
|
|
@@ -264,10 +279,12 @@ static int mxs_dcp_run_aes(struct dcp_async_ctx *actx,
|
|
ret = mxs_dcp_start_dma(actx);
|
|
|
|
aes_done_run:
|
|
+ dma_unmap_single(sdcp->dev, dst_phys, DCP_BUF_SZ, DMA_FROM_DEVICE);
|
|
+err_dst:
|
|
+ dma_unmap_single(sdcp->dev, src_phys, DCP_BUF_SZ, DMA_TO_DEVICE);
|
|
+err_src:
|
|
dma_unmap_single(sdcp->dev, key_phys, 2 * AES_KEYSIZE_128,
|
|
DMA_TO_DEVICE);
|
|
- dma_unmap_single(sdcp->dev, src_phys, DCP_BUF_SZ, DMA_TO_DEVICE);
|
|
- dma_unmap_single(sdcp->dev, dst_phys, DCP_BUF_SZ, DMA_FROM_DEVICE);
|
|
|
|
return ret;
|
|
}
|
|
@@ -556,6 +573,10 @@ static int mxs_dcp_run_sha(struct ahash_request *req)
|
|
dma_addr_t buf_phys = dma_map_single(sdcp->dev, sdcp->coh->sha_in_buf,
|
|
DCP_BUF_SZ, DMA_TO_DEVICE);
|
|
|
|
+ ret = dma_mapping_error(sdcp->dev, buf_phys);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
/* Fill in the DMA descriptor. */
|
|
desc->control0 = MXS_DCP_CONTROL0_DECR_SEMAPHORE |
|
|
MXS_DCP_CONTROL0_INTERRUPT |
|
|
@@ -588,6 +609,10 @@ static int mxs_dcp_run_sha(struct ahash_request *req)
|
|
if (rctx->fini) {
|
|
digest_phys = dma_map_single(sdcp->dev, sdcp->coh->sha_out_buf,
|
|
DCP_SHA_PAY_SZ, DMA_FROM_DEVICE);
|
|
+ ret = dma_mapping_error(sdcp->dev, digest_phys);
|
|
+ if (ret)
|
|
+ goto done_run;
|
|
+
|
|
desc->control0 |= MXS_DCP_CONTROL0_HASH_TERM;
|
|
desc->payload = digest_phys;
|
|
}
|
|
diff --git a/drivers/crypto/omap-aes.c b/drivers/crypto/omap-aes.c
|
|
index 0dd4c6b157de9..9b968ac4ee7b6 100644
|
|
--- a/drivers/crypto/omap-aes.c
|
|
+++ b/drivers/crypto/omap-aes.c
|
|
@@ -1175,9 +1175,9 @@ static int omap_aes_probe(struct platform_device *pdev)
|
|
spin_lock_init(&dd->lock);
|
|
|
|
INIT_LIST_HEAD(&dd->list);
|
|
- spin_lock(&list_lock);
|
|
+ spin_lock_bh(&list_lock);
|
|
list_add_tail(&dd->list, &dev_list);
|
|
- spin_unlock(&list_lock);
|
|
+ spin_unlock_bh(&list_lock);
|
|
|
|
/* Initialize crypto engine */
|
|
dd->engine = crypto_engine_alloc_init(dev, 1);
|
|
@@ -1264,9 +1264,9 @@ static int omap_aes_remove(struct platform_device *pdev)
|
|
if (!dd)
|
|
return -ENODEV;
|
|
|
|
- spin_lock(&list_lock);
|
|
+ spin_lock_bh(&list_lock);
|
|
list_del(&dd->list);
|
|
- spin_unlock(&list_lock);
|
|
+ spin_unlock_bh(&list_lock);
|
|
|
|
for (i = dd->pdata->algs_info_size - 1; i >= 0; i--)
|
|
for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) {
|
|
diff --git a/drivers/crypto/omap-des.c b/drivers/crypto/omap-des.c
|
|
index c9d38bcfd1c77..7fdf38e07adf8 100644
|
|
--- a/drivers/crypto/omap-des.c
|
|
+++ b/drivers/crypto/omap-des.c
|
|
@@ -1035,9 +1035,9 @@ static int omap_des_probe(struct platform_device *pdev)
|
|
|
|
|
|
INIT_LIST_HEAD(&dd->list);
|
|
- spin_lock(&list_lock);
|
|
+ spin_lock_bh(&list_lock);
|
|
list_add_tail(&dd->list, &dev_list);
|
|
- spin_unlock(&list_lock);
|
|
+ spin_unlock_bh(&list_lock);
|
|
|
|
/* Initialize des crypto engine */
|
|
dd->engine = crypto_engine_alloc_init(dev, 1);
|
|
@@ -1096,9 +1096,9 @@ static int omap_des_remove(struct platform_device *pdev)
|
|
if (!dd)
|
|
return -ENODEV;
|
|
|
|
- spin_lock(&list_lock);
|
|
+ spin_lock_bh(&list_lock);
|
|
list_del(&dd->list);
|
|
- spin_unlock(&list_lock);
|
|
+ spin_unlock_bh(&list_lock);
|
|
|
|
for (i = dd->pdata->algs_info_size - 1; i >= 0; i--)
|
|
for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--)
|
|
diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c
|
|
index 39d17ed1db2f2..48f78e34cf8dd 100644
|
|
--- a/drivers/crypto/omap-sham.c
|
|
+++ b/drivers/crypto/omap-sham.c
|
|
@@ -1735,7 +1735,7 @@ static void omap_sham_done_task(unsigned long data)
|
|
if (test_and_clear_bit(FLAGS_OUTPUT_READY, &dd->flags))
|
|
goto finish;
|
|
} else if (test_bit(FLAGS_DMA_READY, &dd->flags)) {
|
|
- if (test_and_clear_bit(FLAGS_DMA_ACTIVE, &dd->flags)) {
|
|
+ if (test_bit(FLAGS_DMA_ACTIVE, &dd->flags)) {
|
|
omap_sham_update_dma_stop(dd);
|
|
if (dd->err) {
|
|
err = dd->err;
|
|
@@ -2143,9 +2143,9 @@ static int omap_sham_probe(struct platform_device *pdev)
|
|
(rev & dd->pdata->major_mask) >> dd->pdata->major_shift,
|
|
(rev & dd->pdata->minor_mask) >> dd->pdata->minor_shift);
|
|
|
|
- spin_lock(&sham.lock);
|
|
+ spin_lock_bh(&sham.lock);
|
|
list_add_tail(&dd->list, &sham.dev_list);
|
|
- spin_unlock(&sham.lock);
|
|
+ spin_unlock_bh(&sham.lock);
|
|
|
|
dd->engine = crypto_engine_alloc_init(dev, 1);
|
|
if (!dd->engine) {
|
|
@@ -2193,9 +2193,9 @@ err_algs:
|
|
err_engine_start:
|
|
crypto_engine_exit(dd->engine);
|
|
err_engine:
|
|
- spin_lock(&sham.lock);
|
|
+ spin_lock_bh(&sham.lock);
|
|
list_del(&dd->list);
|
|
- spin_unlock(&sham.lock);
|
|
+ spin_unlock_bh(&sham.lock);
|
|
err_pm:
|
|
pm_runtime_disable(dev);
|
|
if (!dd->polling_mode)
|
|
@@ -2214,9 +2214,9 @@ static int omap_sham_remove(struct platform_device *pdev)
|
|
dd = platform_get_drvdata(pdev);
|
|
if (!dd)
|
|
return -ENODEV;
|
|
- spin_lock(&sham.lock);
|
|
+ spin_lock_bh(&sham.lock);
|
|
list_del(&dd->list);
|
|
- spin_unlock(&sham.lock);
|
|
+ spin_unlock_bh(&sham.lock);
|
|
for (i = dd->pdata->algs_info_size - 1; i >= 0; i--)
|
|
for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--) {
|
|
crypto_unregister_ahash(
|
|
diff --git a/drivers/crypto/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c b/drivers/crypto/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c
|
|
index d2fedbd7113cb..9709f29b64540 100644
|
|
--- a/drivers/crypto/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c
|
|
+++ b/drivers/crypto/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c
|
|
@@ -79,10 +79,10 @@ void adf_init_hw_data_c3xxxiov(struct adf_hw_device_data *hw_data)
|
|
hw_data->enable_error_correction = adf_vf_void_noop;
|
|
hw_data->init_admin_comms = adf_vf_int_noop;
|
|
hw_data->exit_admin_comms = adf_vf_void_noop;
|
|
- hw_data->send_admin_init = adf_vf2pf_init;
|
|
+ hw_data->send_admin_init = adf_vf2pf_notify_init;
|
|
hw_data->init_arb = adf_vf_int_noop;
|
|
hw_data->exit_arb = adf_vf_void_noop;
|
|
- hw_data->disable_iov = adf_vf2pf_shutdown;
|
|
+ hw_data->disable_iov = adf_vf2pf_notify_shutdown;
|
|
hw_data->get_accel_mask = get_accel_mask;
|
|
hw_data->get_ae_mask = get_ae_mask;
|
|
hw_data->get_num_accels = get_num_accels;
|
|
diff --git a/drivers/crypto/qat/qat_c62xvf/adf_c62xvf_hw_data.c b/drivers/crypto/qat/qat_c62xvf/adf_c62xvf_hw_data.c
|
|
index 29fd3f1091abc..5e6909d6cfc65 100644
|
|
--- a/drivers/crypto/qat/qat_c62xvf/adf_c62xvf_hw_data.c
|
|
+++ b/drivers/crypto/qat/qat_c62xvf/adf_c62xvf_hw_data.c
|
|
@@ -79,10 +79,10 @@ void adf_init_hw_data_c62xiov(struct adf_hw_device_data *hw_data)
|
|
hw_data->enable_error_correction = adf_vf_void_noop;
|
|
hw_data->init_admin_comms = adf_vf_int_noop;
|
|
hw_data->exit_admin_comms = adf_vf_void_noop;
|
|
- hw_data->send_admin_init = adf_vf2pf_init;
|
|
+ hw_data->send_admin_init = adf_vf2pf_notify_init;
|
|
hw_data->init_arb = adf_vf_int_noop;
|
|
hw_data->exit_arb = adf_vf_void_noop;
|
|
- hw_data->disable_iov = adf_vf2pf_shutdown;
|
|
+ hw_data->disable_iov = adf_vf2pf_notify_shutdown;
|
|
hw_data->get_accel_mask = get_accel_mask;
|
|
hw_data->get_ae_mask = get_ae_mask;
|
|
hw_data->get_num_accels = get_num_accels;
|
|
diff --git a/drivers/crypto/qat/qat_common/adf_common_drv.h b/drivers/crypto/qat/qat_common/adf_common_drv.h
|
|
index f22342f612c1d..469e06c93fafe 100644
|
|
--- a/drivers/crypto/qat/qat_common/adf_common_drv.h
|
|
+++ b/drivers/crypto/qat/qat_common/adf_common_drv.h
|
|
@@ -195,8 +195,8 @@ void adf_enable_vf2pf_interrupts(struct adf_accel_dev *accel_dev,
|
|
void adf_enable_pf2vf_interrupts(struct adf_accel_dev *accel_dev);
|
|
void adf_disable_pf2vf_interrupts(struct adf_accel_dev *accel_dev);
|
|
|
|
-int adf_vf2pf_init(struct adf_accel_dev *accel_dev);
|
|
-void adf_vf2pf_shutdown(struct adf_accel_dev *accel_dev);
|
|
+int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev);
|
|
+void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev);
|
|
int adf_init_pf_wq(void);
|
|
void adf_exit_pf_wq(void);
|
|
int adf_init_vf_wq(void);
|
|
@@ -219,12 +219,12 @@ static inline void adf_disable_pf2vf_interrupts(struct adf_accel_dev *accel_dev)
|
|
{
|
|
}
|
|
|
|
-static inline int adf_vf2pf_init(struct adf_accel_dev *accel_dev)
|
|
+static inline int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
-static inline void adf_vf2pf_shutdown(struct adf_accel_dev *accel_dev)
|
|
+static inline void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev)
|
|
{
|
|
}
|
|
|
|
diff --git a/drivers/crypto/qat/qat_common/adf_init.c b/drivers/crypto/qat/qat_common/adf_init.c
|
|
index 42029153408ee..5c78433d19d42 100644
|
|
--- a/drivers/crypto/qat/qat_common/adf_init.c
|
|
+++ b/drivers/crypto/qat/qat_common/adf_init.c
|
|
@@ -61,6 +61,7 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)
|
|
struct service_hndl *service;
|
|
struct list_head *list_itr;
|
|
struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
|
+ int ret;
|
|
|
|
if (!hw_data) {
|
|
dev_err(&GET_DEV(accel_dev),
|
|
@@ -127,9 +128,9 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)
|
|
}
|
|
|
|
hw_data->enable_error_correction(accel_dev);
|
|
- hw_data->enable_vf2pf_comms(accel_dev);
|
|
+ ret = hw_data->enable_vf2pf_comms(accel_dev);
|
|
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL_GPL(adf_dev_init);
|
|
|
|
diff --git a/drivers/crypto/qat/qat_common/adf_isr.c b/drivers/crypto/qat/qat_common/adf_isr.c
|
|
index da6ef007a6aef..de2f137e44ef8 100644
|
|
--- a/drivers/crypto/qat/qat_common/adf_isr.c
|
|
+++ b/drivers/crypto/qat/qat_common/adf_isr.c
|
|
@@ -15,6 +15,8 @@
|
|
#include "adf_transport_access_macros.h"
|
|
#include "adf_transport_internal.h"
|
|
|
|
+#define ADF_MAX_NUM_VFS 32
|
|
+
|
|
static int adf_enable_msix(struct adf_accel_dev *accel_dev)
|
|
{
|
|
struct adf_accel_pci *pci_dev_info = &accel_dev->accel_pci_dev;
|
|
@@ -67,7 +69,7 @@ static irqreturn_t adf_msix_isr_ae(int irq, void *dev_ptr)
|
|
struct adf_bar *pmisc =
|
|
&GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
|
|
void __iomem *pmisc_bar_addr = pmisc->virt_addr;
|
|
- u32 vf_mask;
|
|
+ unsigned long vf_mask;
|
|
|
|
/* Get the interrupt sources triggered by VFs */
|
|
vf_mask = ((ADF_CSR_RD(pmisc_bar_addr, ADF_ERRSOU5) &
|
|
@@ -88,8 +90,7 @@ static irqreturn_t adf_msix_isr_ae(int irq, void *dev_ptr)
|
|
* unless the VF is malicious and is attempting to
|
|
* flood the host OS with VF2PF interrupts.
|
|
*/
|
|
- for_each_set_bit(i, (const unsigned long *)&vf_mask,
|
|
- (sizeof(vf_mask) * BITS_PER_BYTE)) {
|
|
+ for_each_set_bit(i, &vf_mask, ADF_MAX_NUM_VFS) {
|
|
vf_info = accel_dev->pf.vf_info + i;
|
|
|
|
if (!__ratelimit(&vf_info->vf2pf_ratelimit)) {
|
|
diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
|
|
index 8b090b7ae8c6b..e829c6aaf16fd 100644
|
|
--- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
|
|
+++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
|
|
@@ -186,7 +186,6 @@ int adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
|
|
|
|
return ret;
|
|
}
|
|
-EXPORT_SYMBOL_GPL(adf_iov_putmsg);
|
|
|
|
void adf_vf2pf_req_hndl(struct adf_accel_vf_info *vf_info)
|
|
{
|
|
@@ -316,6 +315,8 @@ static int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev)
|
|
msg |= ADF_PFVF_COMPATIBILITY_VERSION << ADF_VF2PF_COMPAT_VER_REQ_SHIFT;
|
|
BUILD_BUG_ON(ADF_PFVF_COMPATIBILITY_VERSION > 255);
|
|
|
|
+ reinit_completion(&accel_dev->vf.iov_msg_completion);
|
|
+
|
|
/* Send request from VF to PF */
|
|
ret = adf_iov_putmsg(accel_dev, msg, 0);
|
|
if (ret) {
|
|
diff --git a/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c b/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c
|
|
index 2c98fb63f7b72..54b738da829d8 100644
|
|
--- a/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c
|
|
+++ b/drivers/crypto/qat/qat_common/adf_vf2pf_msg.c
|
|
@@ -5,14 +5,14 @@
|
|
#include "adf_pf2vf_msg.h"
|
|
|
|
/**
|
|
- * adf_vf2pf_init() - send init msg to PF
|
|
+ * adf_vf2pf_notify_init() - send init msg to PF
|
|
* @accel_dev: Pointer to acceleration VF device.
|
|
*
|
|
* Function sends an init messge from the VF to a PF
|
|
*
|
|
* Return: 0 on success, error code otherwise.
|
|
*/
|
|
-int adf_vf2pf_init(struct adf_accel_dev *accel_dev)
|
|
+int adf_vf2pf_notify_init(struct adf_accel_dev *accel_dev)
|
|
{
|
|
u32 msg = (ADF_VF2PF_MSGORIGIN_SYSTEM |
|
|
(ADF_VF2PF_MSGTYPE_INIT << ADF_VF2PF_MSGTYPE_SHIFT));
|
|
@@ -25,17 +25,17 @@ int adf_vf2pf_init(struct adf_accel_dev *accel_dev)
|
|
set_bit(ADF_STATUS_PF_RUNNING, &accel_dev->status);
|
|
return 0;
|
|
}
|
|
-EXPORT_SYMBOL_GPL(adf_vf2pf_init);
|
|
+EXPORT_SYMBOL_GPL(adf_vf2pf_notify_init);
|
|
|
|
/**
|
|
- * adf_vf2pf_shutdown() - send shutdown msg to PF
|
|
+ * adf_vf2pf_notify_shutdown() - send shutdown msg to PF
|
|
* @accel_dev: Pointer to acceleration VF device.
|
|
*
|
|
* Function sends a shutdown messge from the VF to a PF
|
|
*
|
|
* Return: void
|
|
*/
|
|
-void adf_vf2pf_shutdown(struct adf_accel_dev *accel_dev)
|
|
+void adf_vf2pf_notify_shutdown(struct adf_accel_dev *accel_dev)
|
|
{
|
|
u32 msg = (ADF_VF2PF_MSGORIGIN_SYSTEM |
|
|
(ADF_VF2PF_MSGTYPE_SHUTDOWN << ADF_VF2PF_MSGTYPE_SHIFT));
|
|
@@ -45,4 +45,4 @@ void adf_vf2pf_shutdown(struct adf_accel_dev *accel_dev)
|
|
dev_err(&GET_DEV(accel_dev),
|
|
"Failed to send Shutdown event to PF\n");
|
|
}
|
|
-EXPORT_SYMBOL_GPL(adf_vf2pf_shutdown);
|
|
+EXPORT_SYMBOL_GPL(adf_vf2pf_notify_shutdown);
|
|
diff --git a/drivers/crypto/qat/qat_common/adf_vf_isr.c b/drivers/crypto/qat/qat_common/adf_vf_isr.c
|
|
index 31a36288623a2..024401ec9d1ae 100644
|
|
--- a/drivers/crypto/qat/qat_common/adf_vf_isr.c
|
|
+++ b/drivers/crypto/qat/qat_common/adf_vf_isr.c
|
|
@@ -159,6 +159,7 @@ static irqreturn_t adf_isr(int irq, void *privdata)
|
|
struct adf_bar *pmisc =
|
|
&GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
|
|
void __iomem *pmisc_bar_addr = pmisc->virt_addr;
|
|
+ bool handled = false;
|
|
u32 v_int;
|
|
|
|
/* Read VF INT source CSR to determine the source of VF interrupt */
|
|
@@ -171,7 +172,7 @@ static irqreturn_t adf_isr(int irq, void *privdata)
|
|
|
|
/* Schedule tasklet to handle interrupt BH */
|
|
tasklet_hi_schedule(&accel_dev->vf.pf2vf_bh_tasklet);
|
|
- return IRQ_HANDLED;
|
|
+ handled = true;
|
|
}
|
|
|
|
/* Check bundle interrupt */
|
|
@@ -183,10 +184,10 @@ static irqreturn_t adf_isr(int irq, void *privdata)
|
|
WRITE_CSR_INT_FLAG_AND_COL(bank->csr_addr, bank->bank_number,
|
|
0);
|
|
tasklet_hi_schedule(&bank->resp_handler);
|
|
- return IRQ_HANDLED;
|
|
+ handled = true;
|
|
}
|
|
|
|
- return IRQ_NONE;
|
|
+ return handled ? IRQ_HANDLED : IRQ_NONE;
|
|
}
|
|
|
|
static int adf_request_msi_irq(struct adf_accel_dev *accel_dev)
|
|
diff --git a/drivers/crypto/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c b/drivers/crypto/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c
|
|
index 5246f0524ca34..fc4cf141b1dea 100644
|
|
--- a/drivers/crypto/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c
|
|
+++ b/drivers/crypto/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c
|
|
@@ -79,10 +79,10 @@ void adf_init_hw_data_dh895xcciov(struct adf_hw_device_data *hw_data)
|
|
hw_data->enable_error_correction = adf_vf_void_noop;
|
|
hw_data->init_admin_comms = adf_vf_int_noop;
|
|
hw_data->exit_admin_comms = adf_vf_void_noop;
|
|
- hw_data->send_admin_init = adf_vf2pf_init;
|
|
+ hw_data->send_admin_init = adf_vf2pf_notify_init;
|
|
hw_data->init_arb = adf_vf_int_noop;
|
|
hw_data->exit_arb = adf_vf_void_noop;
|
|
- hw_data->disable_iov = adf_vf2pf_shutdown;
|
|
+ hw_data->disable_iov = adf_vf2pf_notify_shutdown;
|
|
hw_data->get_accel_mask = get_accel_mask;
|
|
hw_data->get_ae_mask = get_ae_mask;
|
|
hw_data->get_num_accels = get_num_accels;
|
|
diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c
|
|
index 4912a7b883801..3a7362f968c9f 100644
|
|
--- a/drivers/edac/i10nm_base.c
|
|
+++ b/drivers/edac/i10nm_base.c
|
|
@@ -26,8 +26,8 @@
|
|
pci_read_config_dword((d)->uracu, 0xd8 + (i) * 4, &(reg))
|
|
#define I10NM_GET_DIMMMTR(m, i, j) \
|
|
readl((m)->mbase + 0x2080c + (i) * 0x4000 + (j) * 4)
|
|
-#define I10NM_GET_MCDDRTCFG(m, i, j) \
|
|
- readl((m)->mbase + 0x20970 + (i) * 0x4000 + (j) * 4)
|
|
+#define I10NM_GET_MCDDRTCFG(m, i) \
|
|
+ readl((m)->mbase + 0x20970 + (i) * 0x4000)
|
|
#define I10NM_GET_MCMTR(m, i) \
|
|
readl((m)->mbase + 0x20ef8 + (i) * 0x4000)
|
|
|
|
@@ -170,10 +170,10 @@ static int i10nm_get_dimm_config(struct mem_ctl_info *mci)
|
|
continue;
|
|
|
|
ndimms = 0;
|
|
+ mcddrtcfg = I10NM_GET_MCDDRTCFG(imc, i);
|
|
for (j = 0; j < I10NM_NUM_DIMMS; j++) {
|
|
dimm = edac_get_dimm(mci, i, j, 0);
|
|
mtr = I10NM_GET_DIMMMTR(imc, i, j);
|
|
- mcddrtcfg = I10NM_GET_MCDDRTCFG(imc, i, j);
|
|
edac_dbg(1, "dimmmtr 0x%x mcddrtcfg 0x%x (mc%d ch%d dimm%d)\n",
|
|
mtr, mcddrtcfg, imc->mc, i, j);
|
|
|
|
diff --git a/drivers/edac/mce_amd.c b/drivers/edac/mce_amd.c
|
|
index 6c474fbef32af..b6d4ae84a9a5b 100644
|
|
--- a/drivers/edac/mce_amd.c
|
|
+++ b/drivers/edac/mce_amd.c
|
|
@@ -1176,6 +1176,9 @@ static int __init mce_amd_init(void)
|
|
c->x86_vendor != X86_VENDOR_HYGON)
|
|
return -ENODEV;
|
|
|
|
+ if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
|
|
+ return -ENODEV;
|
|
+
|
|
if (boot_cpu_has(X86_FEATURE_SMCA)) {
|
|
xec_mask = 0x3f;
|
|
goto out;
|
|
diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
|
|
index 2371d08bdd17a..1d965c1252cac 100644
|
|
--- a/drivers/firmware/raspberrypi.c
|
|
+++ b/drivers/firmware/raspberrypi.c
|
|
@@ -7,6 +7,7 @@
|
|
*/
|
|
|
|
#include <linux/dma-mapping.h>
|
|
+#include <linux/kref.h>
|
|
#include <linux/mailbox_client.h>
|
|
#include <linux/module.h>
|
|
#include <linux/of_platform.h>
|
|
@@ -27,6 +28,8 @@ struct rpi_firmware {
|
|
struct mbox_chan *chan; /* The property channel. */
|
|
struct completion c;
|
|
u32 enabled;
|
|
+
|
|
+ struct kref consumers;
|
|
};
|
|
|
|
static DEFINE_MUTEX(transaction_lock);
|
|
@@ -225,12 +228,31 @@ static void rpi_register_clk_driver(struct device *dev)
|
|
-1, NULL, 0);
|
|
}
|
|
|
|
+static void rpi_firmware_delete(struct kref *kref)
|
|
+{
|
|
+ struct rpi_firmware *fw = container_of(kref, struct rpi_firmware,
|
|
+ consumers);
|
|
+
|
|
+ mbox_free_channel(fw->chan);
|
|
+ kfree(fw);
|
|
+}
|
|
+
|
|
+void rpi_firmware_put(struct rpi_firmware *fw)
|
|
+{
|
|
+ kref_put(&fw->consumers, rpi_firmware_delete);
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(rpi_firmware_put);
|
|
+
|
|
static int rpi_firmware_probe(struct platform_device *pdev)
|
|
{
|
|
struct device *dev = &pdev->dev;
|
|
struct rpi_firmware *fw;
|
|
|
|
- fw = devm_kzalloc(dev, sizeof(*fw), GFP_KERNEL);
|
|
+ /*
|
|
+ * Memory will be freed by rpi_firmware_delete() once all users have
|
|
+ * released their firmware handles. Don't use devm_kzalloc() here.
|
|
+ */
|
|
+ fw = kzalloc(sizeof(*fw), GFP_KERNEL);
|
|
if (!fw)
|
|
return -ENOMEM;
|
|
|
|
@@ -247,6 +269,7 @@ static int rpi_firmware_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
init_completion(&fw->c);
|
|
+ kref_init(&fw->consumers);
|
|
|
|
platform_set_drvdata(pdev, fw);
|
|
|
|
@@ -275,7 +298,8 @@ static int rpi_firmware_remove(struct platform_device *pdev)
|
|
rpi_hwmon = NULL;
|
|
platform_device_unregister(rpi_clk);
|
|
rpi_clk = NULL;
|
|
- mbox_free_channel(fw->chan);
|
|
+
|
|
+ rpi_firmware_put(fw);
|
|
|
|
return 0;
|
|
}
|
|
@@ -284,16 +308,32 @@ static int rpi_firmware_remove(struct platform_device *pdev)
|
|
* rpi_firmware_get - Get pointer to rpi_firmware structure.
|
|
* @firmware_node: Pointer to the firmware Device Tree node.
|
|
*
|
|
+ * The reference to rpi_firmware has to be released with rpi_firmware_put().
|
|
+ *
|
|
* Returns NULL is the firmware device is not ready.
|
|
*/
|
|
struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node)
|
|
{
|
|
struct platform_device *pdev = of_find_device_by_node(firmware_node);
|
|
+ struct rpi_firmware *fw;
|
|
|
|
if (!pdev)
|
|
return NULL;
|
|
|
|
- return platform_get_drvdata(pdev);
|
|
+ fw = platform_get_drvdata(pdev);
|
|
+ if (!fw)
|
|
+ goto err_put_device;
|
|
+
|
|
+ if (!kref_get_unless_zero(&fw->consumers))
|
|
+ goto err_put_device;
|
|
+
|
|
+ put_device(&pdev->dev);
|
|
+
|
|
+ return fw;
|
|
+
|
|
+err_put_device:
|
|
+ put_device(&pdev->dev);
|
|
+ return NULL;
|
|
}
|
|
EXPORT_SYMBOL_GPL(rpi_firmware_get);
|
|
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
|
|
index d3e51d361179e..eb68b0f1da825 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
|
|
@@ -160,17 +160,28 @@ static int acp_poweron(struct generic_pm_domain *genpd)
|
|
return 0;
|
|
}
|
|
|
|
-static struct device *get_mfd_cell_dev(const char *device_name, int r)
|
|
+static int acp_genpd_add_device(struct device *dev, void *data)
|
|
{
|
|
- char auto_dev_name[25];
|
|
- struct device *dev;
|
|
+ struct generic_pm_domain *gpd = data;
|
|
+ int ret;
|
|
|
|
- snprintf(auto_dev_name, sizeof(auto_dev_name),
|
|
- "%s.%d.auto", device_name, r);
|
|
- dev = bus_find_device_by_name(&platform_bus_type, NULL, auto_dev_name);
|
|
- dev_info(dev, "device %s added to pm domain\n", auto_dev_name);
|
|
+ ret = pm_genpd_add_device(gpd, dev);
|
|
+ if (ret)
|
|
+ dev_err(dev, "Failed to add dev to genpd %d\n", ret);
|
|
|
|
- return dev;
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static int acp_genpd_remove_device(struct device *dev, void *data)
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ ret = pm_genpd_remove_device(dev);
|
|
+ if (ret)
|
|
+ dev_err(dev, "Failed to remove dev from genpd %d\n", ret);
|
|
+
|
|
+ /* Continue to remove */
|
|
+ return 0;
|
|
}
|
|
|
|
/**
|
|
@@ -181,11 +192,10 @@ static struct device *get_mfd_cell_dev(const char *device_name, int r)
|
|
*/
|
|
static int acp_hw_init(void *handle)
|
|
{
|
|
- int r, i;
|
|
+ int r;
|
|
uint64_t acp_base;
|
|
u32 val = 0;
|
|
u32 count = 0;
|
|
- struct device *dev;
|
|
struct i2s_platform_data *i2s_pdata = NULL;
|
|
|
|
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
|
@@ -341,15 +351,10 @@ static int acp_hw_init(void *handle)
|
|
if (r)
|
|
goto failure;
|
|
|
|
- for (i = 0; i < ACP_DEVS ; i++) {
|
|
- dev = get_mfd_cell_dev(adev->acp.acp_cell[i].name, i);
|
|
- r = pm_genpd_add_device(&adev->acp.acp_genpd->gpd, dev);
|
|
- if (r) {
|
|
- dev_err(dev, "Failed to add dev to genpd\n");
|
|
- goto failure;
|
|
- }
|
|
- }
|
|
-
|
|
+ r = device_for_each_child(adev->acp.parent, &adev->acp.acp_genpd->gpd,
|
|
+ acp_genpd_add_device);
|
|
+ if (r)
|
|
+ goto failure;
|
|
|
|
/* Assert Soft reset of ACP */
|
|
val = cgs_read_register(adev->acp.cgs_device, mmACP_SOFT_RESET);
|
|
@@ -410,10 +415,8 @@ failure:
|
|
*/
|
|
static int acp_hw_fini(void *handle)
|
|
{
|
|
- int i, ret;
|
|
u32 val = 0;
|
|
u32 count = 0;
|
|
- struct device *dev;
|
|
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
|
|
|
/* return early if no ACP */
|
|
@@ -458,13 +461,8 @@ static int acp_hw_fini(void *handle)
|
|
udelay(100);
|
|
}
|
|
|
|
- for (i = 0; i < ACP_DEVS ; i++) {
|
|
- dev = get_mfd_cell_dev(adev->acp.acp_cell[i].name, i);
|
|
- ret = pm_genpd_remove_device(dev);
|
|
- /* If removal fails, dont giveup and try rest */
|
|
- if (ret)
|
|
- dev_err(dev, "remove dev from genpd failed\n");
|
|
- }
|
|
+ device_for_each_child(adev->acp.parent, NULL,
|
|
+ acp_genpd_remove_device);
|
|
|
|
mfd_remove_devices(adev->acp.parent);
|
|
kfree(adev->acp.acp_res);
|
|
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
|
|
index ca04c34e82518..997b8827fed27 100644
|
|
--- a/drivers/gpu/drm/drm_of.c
|
|
+++ b/drivers/gpu/drm/drm_of.c
|
|
@@ -315,7 +315,7 @@ static int drm_of_lvds_get_remote_pixels_type(
|
|
|
|
remote_port = of_graph_get_remote_port(endpoint);
|
|
if (!remote_port) {
|
|
- of_node_put(remote_port);
|
|
+ of_node_put(endpoint);
|
|
return -EPIPE;
|
|
}
|
|
|
|
@@ -331,8 +331,10 @@ static int drm_of_lvds_get_remote_pixels_type(
|
|
* configurations by passing the endpoints explicitly to
|
|
* drm_of_lvds_get_dual_link_pixel_order().
|
|
*/
|
|
- if (!current_pt || pixels_type != current_pt)
|
|
+ if (!current_pt || pixels_type != current_pt) {
|
|
+ of_node_put(endpoint);
|
|
return -EINVAL;
|
|
+ }
|
|
}
|
|
|
|
return pixels_type;
|
|
diff --git a/drivers/gpu/drm/gma500/oaktrail_lvds.c b/drivers/gpu/drm/gma500/oaktrail_lvds.c
|
|
index 2828360153d16..30b949d6856c0 100644
|
|
--- a/drivers/gpu/drm/gma500/oaktrail_lvds.c
|
|
+++ b/drivers/gpu/drm/gma500/oaktrail_lvds.c
|
|
@@ -117,7 +117,7 @@ static void oaktrail_lvds_mode_set(struct drm_encoder *encoder,
|
|
continue;
|
|
}
|
|
|
|
- if (!connector) {
|
|
+ if (list_entry_is_head(connector, &mode_config->connector_list, head)) {
|
|
DRM_ERROR("Couldn't find connector when setting mode");
|
|
gma_power_end(dev);
|
|
return;
|
|
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
|
|
index 758c355b4fd80..f8c7100a8acb6 100644
|
|
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
|
|
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c
|
|
@@ -340,10 +340,12 @@ static void dpu_hw_ctl_clear_all_blendstages(struct dpu_hw_ctl *ctx)
|
|
int i;
|
|
|
|
for (i = 0; i < ctx->mixer_count; i++) {
|
|
- DPU_REG_WRITE(c, CTL_LAYER(LM_0 + i), 0);
|
|
- DPU_REG_WRITE(c, CTL_LAYER_EXT(LM_0 + i), 0);
|
|
- DPU_REG_WRITE(c, CTL_LAYER_EXT2(LM_0 + i), 0);
|
|
- DPU_REG_WRITE(c, CTL_LAYER_EXT3(LM_0 + i), 0);
|
|
+ enum dpu_lm mixer_id = ctx->mixer_hw_caps[i].id;
|
|
+
|
|
+ DPU_REG_WRITE(c, CTL_LAYER(mixer_id), 0);
|
|
+ DPU_REG_WRITE(c, CTL_LAYER_EXT(mixer_id), 0);
|
|
+ DPU_REG_WRITE(c, CTL_LAYER_EXT2(mixer_id), 0);
|
|
+ DPU_REG_WRITE(c, CTL_LAYER_EXT3(mixer_id), 0);
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
|
|
index 2f75e39052022..c1c152e39918b 100644
|
|
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
|
|
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
|
|
@@ -19,30 +19,12 @@ static int mdp4_hw_init(struct msm_kms *kms)
|
|
{
|
|
struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms));
|
|
struct drm_device *dev = mdp4_kms->dev;
|
|
- uint32_t version, major, minor, dmap_cfg, vg_cfg;
|
|
+ u32 dmap_cfg, vg_cfg;
|
|
unsigned long clk;
|
|
int ret = 0;
|
|
|
|
pm_runtime_get_sync(dev->dev);
|
|
|
|
- mdp4_enable(mdp4_kms);
|
|
- version = mdp4_read(mdp4_kms, REG_MDP4_VERSION);
|
|
- mdp4_disable(mdp4_kms);
|
|
-
|
|
- major = FIELD(version, MDP4_VERSION_MAJOR);
|
|
- minor = FIELD(version, MDP4_VERSION_MINOR);
|
|
-
|
|
- DBG("found MDP4 version v%d.%d", major, minor);
|
|
-
|
|
- if (major != 4) {
|
|
- DRM_DEV_ERROR(dev->dev, "unexpected MDP version: v%d.%d\n",
|
|
- major, minor);
|
|
- ret = -ENXIO;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- mdp4_kms->rev = minor;
|
|
-
|
|
if (mdp4_kms->rev > 1) {
|
|
mdp4_write(mdp4_kms, REG_MDP4_CS_CONTROLLER0, 0x0707ffff);
|
|
mdp4_write(mdp4_kms, REG_MDP4_CS_CONTROLLER1, 0x03073f3f);
|
|
@@ -88,7 +70,6 @@ static int mdp4_hw_init(struct msm_kms *kms)
|
|
if (mdp4_kms->rev > 1)
|
|
mdp4_write(mdp4_kms, REG_MDP4_RESET_STATUS, 1);
|
|
|
|
-out:
|
|
pm_runtime_put_sync(dev->dev);
|
|
|
|
return ret;
|
|
@@ -409,6 +390,22 @@ fail:
|
|
return ret;
|
|
}
|
|
|
|
+static void read_mdp_hw_revision(struct mdp4_kms *mdp4_kms,
|
|
+ u32 *major, u32 *minor)
|
|
+{
|
|
+ struct drm_device *dev = mdp4_kms->dev;
|
|
+ u32 version;
|
|
+
|
|
+ mdp4_enable(mdp4_kms);
|
|
+ version = mdp4_read(mdp4_kms, REG_MDP4_VERSION);
|
|
+ mdp4_disable(mdp4_kms);
|
|
+
|
|
+ *major = FIELD(version, MDP4_VERSION_MAJOR);
|
|
+ *minor = FIELD(version, MDP4_VERSION_MINOR);
|
|
+
|
|
+ DRM_DEV_INFO(dev->dev, "MDP4 version v%d.%d", *major, *minor);
|
|
+}
|
|
+
|
|
struct msm_kms *mdp4_kms_init(struct drm_device *dev)
|
|
{
|
|
struct platform_device *pdev = to_platform_device(dev->dev);
|
|
@@ -417,6 +414,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
|
|
struct msm_kms *kms = NULL;
|
|
struct msm_gem_address_space *aspace;
|
|
int irq, ret;
|
|
+ u32 major, minor;
|
|
|
|
mdp4_kms = kzalloc(sizeof(*mdp4_kms), GFP_KERNEL);
|
|
if (!mdp4_kms) {
|
|
@@ -473,15 +471,6 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
|
|
if (IS_ERR(mdp4_kms->pclk))
|
|
mdp4_kms->pclk = NULL;
|
|
|
|
- if (mdp4_kms->rev >= 2) {
|
|
- mdp4_kms->lut_clk = devm_clk_get(&pdev->dev, "lut_clk");
|
|
- if (IS_ERR(mdp4_kms->lut_clk)) {
|
|
- DRM_DEV_ERROR(dev->dev, "failed to get lut_clk\n");
|
|
- ret = PTR_ERR(mdp4_kms->lut_clk);
|
|
- goto fail;
|
|
- }
|
|
- }
|
|
-
|
|
mdp4_kms->axi_clk = devm_clk_get(&pdev->dev, "bus_clk");
|
|
if (IS_ERR(mdp4_kms->axi_clk)) {
|
|
DRM_DEV_ERROR(dev->dev, "failed to get axi_clk\n");
|
|
@@ -490,8 +479,27 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
|
|
}
|
|
|
|
clk_set_rate(mdp4_kms->clk, config->max_clk);
|
|
- if (mdp4_kms->lut_clk)
|
|
+
|
|
+ read_mdp_hw_revision(mdp4_kms, &major, &minor);
|
|
+
|
|
+ if (major != 4) {
|
|
+ DRM_DEV_ERROR(dev->dev, "unexpected MDP version: v%d.%d\n",
|
|
+ major, minor);
|
|
+ ret = -ENXIO;
|
|
+ goto fail;
|
|
+ }
|
|
+
|
|
+ mdp4_kms->rev = minor;
|
|
+
|
|
+ if (mdp4_kms->rev >= 2) {
|
|
+ mdp4_kms->lut_clk = devm_clk_get(&pdev->dev, "lut_clk");
|
|
+ if (IS_ERR(mdp4_kms->lut_clk)) {
|
|
+ DRM_DEV_ERROR(dev->dev, "failed to get lut_clk\n");
|
|
+ ret = PTR_ERR(mdp4_kms->lut_clk);
|
|
+ goto fail;
|
|
+ }
|
|
clk_set_rate(mdp4_kms->lut_clk, config->max_clk);
|
|
+ }
|
|
|
|
pm_runtime_enable(dev->dev);
|
|
mdp4_kms->rpm_enabled = true;
|
|
diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c
|
|
index 627048851d99c..7e364b9c9f9e1 100644
|
|
--- a/drivers/gpu/drm/msm/dsi/dsi.c
|
|
+++ b/drivers/gpu/drm/msm/dsi/dsi.c
|
|
@@ -26,8 +26,10 @@ static int dsi_get_phy(struct msm_dsi *msm_dsi)
|
|
}
|
|
|
|
phy_pdev = of_find_device_by_node(phy_node);
|
|
- if (phy_pdev)
|
|
+ if (phy_pdev) {
|
|
msm_dsi->phy = platform_get_drvdata(phy_pdev);
|
|
+ msm_dsi->phy_dev = &phy_pdev->dev;
|
|
+ }
|
|
|
|
of_node_put(phy_node);
|
|
|
|
@@ -36,8 +38,6 @@ static int dsi_get_phy(struct msm_dsi *msm_dsi)
|
|
return -EPROBE_DEFER;
|
|
}
|
|
|
|
- msm_dsi->phy_dev = get_device(&phy_pdev->dev);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
|
|
index 17f26052e8450..f31e8ef3c258c 100644
|
|
--- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c
|
|
+++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c
|
|
@@ -51,6 +51,7 @@ static const struct mxsfb_devdata mxsfb_devdata[] = {
|
|
.hs_wdth_mask = 0xff,
|
|
.hs_wdth_shift = 24,
|
|
.has_overlay = false,
|
|
+ .has_ctrl2 = false,
|
|
},
|
|
[MXSFB_V4] = {
|
|
.transfer_count = LCDC_V4_TRANSFER_COUNT,
|
|
@@ -59,6 +60,7 @@ static const struct mxsfb_devdata mxsfb_devdata[] = {
|
|
.hs_wdth_mask = 0x3fff,
|
|
.hs_wdth_shift = 18,
|
|
.has_overlay = false,
|
|
+ .has_ctrl2 = true,
|
|
},
|
|
[MXSFB_V6] = {
|
|
.transfer_count = LCDC_V4_TRANSFER_COUNT,
|
|
@@ -67,6 +69,7 @@ static const struct mxsfb_devdata mxsfb_devdata[] = {
|
|
.hs_wdth_mask = 0x3fff,
|
|
.hs_wdth_shift = 18,
|
|
.has_overlay = true,
|
|
+ .has_ctrl2 = true,
|
|
},
|
|
};
|
|
|
|
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.h b/drivers/gpu/drm/mxsfb/mxsfb_drv.h
|
|
index 399d23e91ed10..7c720e226fdfd 100644
|
|
--- a/drivers/gpu/drm/mxsfb/mxsfb_drv.h
|
|
+++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.h
|
|
@@ -22,6 +22,7 @@ struct mxsfb_devdata {
|
|
unsigned int hs_wdth_mask;
|
|
unsigned int hs_wdth_shift;
|
|
bool has_overlay;
|
|
+ bool has_ctrl2;
|
|
};
|
|
|
|
struct mxsfb_drm_private {
|
|
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
|
|
index 9e1224d54729f..b535621f4f78d 100644
|
|
--- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c
|
|
+++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c
|
|
@@ -107,6 +107,14 @@ static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb)
|
|
clk_prepare_enable(mxsfb->clk_disp_axi);
|
|
clk_prepare_enable(mxsfb->clk);
|
|
|
|
+ /* Increase number of outstanding requests on all supported IPs */
|
|
+ if (mxsfb->devdata->has_ctrl2) {
|
|
+ reg = readl(mxsfb->base + LCDC_V4_CTRL2);
|
|
+ reg &= ~CTRL2_SET_OUTSTANDING_REQS_MASK;
|
|
+ reg |= CTRL2_SET_OUTSTANDING_REQS_16;
|
|
+ writel(reg, mxsfb->base + LCDC_V4_CTRL2);
|
|
+ }
|
|
+
|
|
/* If it was disabled, re-enable the mode again */
|
|
writel(CTRL_DOTCLK_MODE, mxsfb->base + LCDC_CTRL + REG_SET);
|
|
|
|
@@ -115,6 +123,35 @@ static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb)
|
|
reg |= VDCTRL4_SYNC_SIGNALS_ON;
|
|
writel(reg, mxsfb->base + LCDC_VDCTRL4);
|
|
|
|
+ /*
|
|
+ * Enable recovery on underflow.
|
|
+ *
|
|
+ * There is some sort of corner case behavior of the controller,
|
|
+ * which could rarely be triggered at least on i.MX6SX connected
|
|
+ * to 800x480 DPI panel and i.MX8MM connected to DPI->DSI->LVDS
|
|
+ * bridged 1920x1080 panel (and likely on other setups too), where
|
|
+ * the image on the panel shifts to the right and wraps around.
|
|
+ * This happens either when the controller is enabled on boot or
|
|
+ * even later during run time. The condition does not correct
|
|
+ * itself automatically, i.e. the display image remains shifted.
|
|
+ *
|
|
+ * It seems this problem is known and is due to sporadic underflows
|
|
+ * of the LCDIF FIFO. While the LCDIF IP does have underflow/overflow
|
|
+ * IRQs, neither of the IRQs trigger and neither IRQ status bit is
|
|
+ * asserted when this condition occurs.
|
|
+ *
|
|
+ * All known revisions of the LCDIF IP have CTRL1 RECOVER_ON_UNDERFLOW
|
|
+ * bit, which is described in the reference manual since i.MX23 as
|
|
+ * "
|
|
+ * Set this bit to enable the LCDIF block to recover in the next
|
|
+ * field/frame if there was an underflow in the current field/frame.
|
|
+ * "
|
|
+ * Enable this bit to mitigate the sporadic underflows.
|
|
+ */
|
|
+ reg = readl(mxsfb->base + LCDC_CTRL1);
|
|
+ reg |= CTRL1_RECOVER_ON_UNDERFLOW;
|
|
+ writel(reg, mxsfb->base + LCDC_CTRL1);
|
|
+
|
|
writel(CTRL_RUN, mxsfb->base + LCDC_CTRL + REG_SET);
|
|
}
|
|
|
|
@@ -206,6 +243,9 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb)
|
|
|
|
/* Clear the FIFOs */
|
|
writel(CTRL1_FIFO_CLEAR, mxsfb->base + LCDC_CTRL1 + REG_SET);
|
|
+ readl(mxsfb->base + LCDC_CTRL1);
|
|
+ writel(CTRL1_FIFO_CLEAR, mxsfb->base + LCDC_CTRL1 + REG_CLR);
|
|
+ readl(mxsfb->base + LCDC_CTRL1);
|
|
|
|
if (mxsfb->devdata->has_overlay)
|
|
writel(0, mxsfb->base + LCDC_AS_CTRL);
|
|
diff --git a/drivers/gpu/drm/mxsfb/mxsfb_regs.h b/drivers/gpu/drm/mxsfb/mxsfb_regs.h
|
|
index 55d28a27f9124..694fea13e893e 100644
|
|
--- a/drivers/gpu/drm/mxsfb/mxsfb_regs.h
|
|
+++ b/drivers/gpu/drm/mxsfb/mxsfb_regs.h
|
|
@@ -15,6 +15,7 @@
|
|
#define LCDC_CTRL 0x00
|
|
#define LCDC_CTRL1 0x10
|
|
#define LCDC_V3_TRANSFER_COUNT 0x20
|
|
+#define LCDC_V4_CTRL2 0x20
|
|
#define LCDC_V4_TRANSFER_COUNT 0x30
|
|
#define LCDC_V4_CUR_BUF 0x40
|
|
#define LCDC_V4_NEXT_BUF 0x50
|
|
@@ -54,12 +55,20 @@
|
|
#define CTRL_DF24 BIT(1)
|
|
#define CTRL_RUN BIT(0)
|
|
|
|
+#define CTRL1_RECOVER_ON_UNDERFLOW BIT(24)
|
|
#define CTRL1_FIFO_CLEAR BIT(21)
|
|
#define CTRL1_SET_BYTE_PACKAGING(x) (((x) & 0xf) << 16)
|
|
#define CTRL1_GET_BYTE_PACKAGING(x) (((x) >> 16) & 0xf)
|
|
#define CTRL1_CUR_FRAME_DONE_IRQ_EN BIT(13)
|
|
#define CTRL1_CUR_FRAME_DONE_IRQ BIT(9)
|
|
|
|
+#define CTRL2_SET_OUTSTANDING_REQS_1 0
|
|
+#define CTRL2_SET_OUTSTANDING_REQS_2 (0x1 << 21)
|
|
+#define CTRL2_SET_OUTSTANDING_REQS_4 (0x2 << 21)
|
|
+#define CTRL2_SET_OUTSTANDING_REQS_8 (0x3 << 21)
|
|
+#define CTRL2_SET_OUTSTANDING_REQS_16 (0x4 << 21)
|
|
+#define CTRL2_SET_OUTSTANDING_REQS_MASK (0x7 << 21)
|
|
+
|
|
#define TRANSFER_COUNT_SET_VCOUNT(x) (((x) & 0xffff) << 16)
|
|
#define TRANSFER_COUNT_GET_VCOUNT(x) (((x) >> 16) & 0xffff)
|
|
#define TRANSFER_COUNT_SET_HCOUNT(x) ((x) & 0xffff)
|
|
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
index bf7c34cfb84c0..c256929e859b3 100644
|
|
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
|
|
@@ -60,7 +60,8 @@ static int panfrost_clk_init(struct panfrost_device *pfdev)
|
|
if (IS_ERR(pfdev->bus_clock)) {
|
|
dev_err(pfdev->dev, "get bus_clock failed %ld\n",
|
|
PTR_ERR(pfdev->bus_clock));
|
|
- return PTR_ERR(pfdev->bus_clock);
|
|
+ err = PTR_ERR(pfdev->bus_clock);
|
|
+ goto disable_clock;
|
|
}
|
|
|
|
if (pfdev->bus_clock) {
|
|
diff --git a/drivers/i2c/busses/i2c-highlander.c b/drivers/i2c/busses/i2c-highlander.c
|
|
index 803dad70e2a71..a2add128d0843 100644
|
|
--- a/drivers/i2c/busses/i2c-highlander.c
|
|
+++ b/drivers/i2c/busses/i2c-highlander.c
|
|
@@ -379,7 +379,7 @@ static int highlander_i2c_probe(struct platform_device *pdev)
|
|
platform_set_drvdata(pdev, dev);
|
|
|
|
dev->irq = platform_get_irq(pdev, 0);
|
|
- if (iic_force_poll)
|
|
+ if (dev->irq < 0 || iic_force_poll)
|
|
dev->irq = 0;
|
|
|
|
if (dev->irq) {
|
|
diff --git a/drivers/i2c/busses/i2c-hix5hd2.c b/drivers/i2c/busses/i2c-hix5hd2.c
|
|
index ab15b1ec2ab3c..8993534bc510d 100644
|
|
--- a/drivers/i2c/busses/i2c-hix5hd2.c
|
|
+++ b/drivers/i2c/busses/i2c-hix5hd2.c
|
|
@@ -413,10 +413,8 @@ static int hix5hd2_i2c_probe(struct platform_device *pdev)
|
|
return PTR_ERR(priv->regs);
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
- if (irq <= 0) {
|
|
- dev_err(&pdev->dev, "cannot find HS-I2C IRQ\n");
|
|
+ if (irq < 0)
|
|
return irq;
|
|
- }
|
|
|
|
priv->clk = devm_clk_get(&pdev->dev, NULL);
|
|
if (IS_ERR(priv->clk)) {
|
|
diff --git a/drivers/i2c/busses/i2c-iop3xx.c b/drivers/i2c/busses/i2c-iop3xx.c
|
|
index 2f8b8050a2233..899624721c1ea 100644
|
|
--- a/drivers/i2c/busses/i2c-iop3xx.c
|
|
+++ b/drivers/i2c/busses/i2c-iop3xx.c
|
|
@@ -467,16 +467,14 @@ iop3xx_i2c_probe(struct platform_device *pdev)
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
if (irq < 0) {
|
|
- ret = -ENXIO;
|
|
+ ret = irq;
|
|
goto unmap;
|
|
}
|
|
ret = request_irq(irq, iop3xx_i2c_irq_handler, 0,
|
|
pdev->name, adapter_data);
|
|
|
|
- if (ret) {
|
|
- ret = -EIO;
|
|
+ if (ret)
|
|
goto unmap;
|
|
- }
|
|
|
|
memcpy(new_adapter->name, pdev->name, strlen(pdev->name));
|
|
new_adapter->owner = THIS_MODULE;
|
|
diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c
|
|
index dcde71ae63419..1a5f1ccd1d2f7 100644
|
|
--- a/drivers/i2c/busses/i2c-mt65xx.c
|
|
+++ b/drivers/i2c/busses/i2c-mt65xx.c
|
|
@@ -1207,7 +1207,7 @@ static int mtk_i2c_probe(struct platform_device *pdev)
|
|
return PTR_ERR(i2c->pdmabase);
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
- if (irq <= 0)
|
|
+ if (irq < 0)
|
|
return irq;
|
|
|
|
init_completion(&i2c->msg_complete);
|
|
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c
|
|
index 40fa9e4af5d1c..05831848b7bf6 100644
|
|
--- a/drivers/i2c/busses/i2c-s3c2410.c
|
|
+++ b/drivers/i2c/busses/i2c-s3c2410.c
|
|
@@ -1140,7 +1140,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
|
|
*/
|
|
if (!(i2c->quirks & QUIRK_POLL)) {
|
|
i2c->irq = ret = platform_get_irq(pdev, 0);
|
|
- if (ret <= 0) {
|
|
+ if (ret < 0) {
|
|
dev_err(&pdev->dev, "cannot find IRQ\n");
|
|
clk_unprepare(i2c->clk);
|
|
return ret;
|
|
diff --git a/drivers/i2c/busses/i2c-synquacer.c b/drivers/i2c/busses/i2c-synquacer.c
|
|
index 31be1811d5e66..e4026c5416b15 100644
|
|
--- a/drivers/i2c/busses/i2c-synquacer.c
|
|
+++ b/drivers/i2c/busses/i2c-synquacer.c
|
|
@@ -578,7 +578,7 @@ static int synquacer_i2c_probe(struct platform_device *pdev)
|
|
|
|
i2c->irq = platform_get_irq(pdev, 0);
|
|
if (i2c->irq < 0)
|
|
- return -ENODEV;
|
|
+ return i2c->irq;
|
|
|
|
ret = devm_request_irq(&pdev->dev, i2c->irq, synquacer_i2c_isr,
|
|
0, dev_name(&pdev->dev), i2c);
|
|
diff --git a/drivers/i2c/busses/i2c-xlp9xx.c b/drivers/i2c/busses/i2c-xlp9xx.c
|
|
index f2241cedf5d3f..6d24dc3855229 100644
|
|
--- a/drivers/i2c/busses/i2c-xlp9xx.c
|
|
+++ b/drivers/i2c/busses/i2c-xlp9xx.c
|
|
@@ -517,7 +517,7 @@ static int xlp9xx_i2c_probe(struct platform_device *pdev)
|
|
return PTR_ERR(priv->base);
|
|
|
|
priv->irq = platform_get_irq(pdev, 0);
|
|
- if (priv->irq <= 0)
|
|
+ if (priv->irq < 0)
|
|
return priv->irq;
|
|
/* SMBAlert irq */
|
|
priv->alert_data.irq = platform_get_irq(pdev, 1);
|
|
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
|
|
index 1005b182bab47..1bdb7acf445f4 100644
|
|
--- a/drivers/irqchip/irq-gic-v3.c
|
|
+++ b/drivers/irqchip/irq-gic-v3.c
|
|
@@ -100,6 +100,27 @@ EXPORT_SYMBOL(gic_pmr_sync);
|
|
DEFINE_STATIC_KEY_FALSE(gic_nonsecure_priorities);
|
|
EXPORT_SYMBOL(gic_nonsecure_priorities);
|
|
|
|
+/*
|
|
+ * When the Non-secure world has access to group 0 interrupts (as a
|
|
+ * consequence of SCR_EL3.FIQ == 0), reading the ICC_RPR_EL1 register will
|
|
+ * return the Distributor's view of the interrupt priority.
|
|
+ *
|
|
+ * When GIC security is enabled (GICD_CTLR.DS == 0), the interrupt priority
|
|
+ * written by software is moved to the Non-secure range by the Distributor.
|
|
+ *
|
|
+ * If both are true (which is when gic_nonsecure_priorities gets enabled),
|
|
+ * we need to shift down the priority programmed by software to match it
|
|
+ * against the value returned by ICC_RPR_EL1.
|
|
+ */
|
|
+#define GICD_INT_RPR_PRI(priority) \
|
|
+ ({ \
|
|
+ u32 __priority = (priority); \
|
|
+ if (static_branch_unlikely(&gic_nonsecure_priorities)) \
|
|
+ __priority = 0x80 | (__priority >> 1); \
|
|
+ \
|
|
+ __priority; \
|
|
+ })
|
|
+
|
|
/* ppi_nmi_refs[n] == number of cpus having ppi[n + 16] set as NMI */
|
|
static refcount_t *ppi_nmi_refs;
|
|
|
|
@@ -687,7 +708,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs
|
|
return;
|
|
|
|
if (gic_supports_nmi() &&
|
|
- unlikely(gic_read_rpr() == GICD_INT_NMI_PRI)) {
|
|
+ unlikely(gic_read_rpr() == GICD_INT_RPR_PRI(GICD_INT_NMI_PRI))) {
|
|
gic_handle_nmi(irqnr, regs);
|
|
return;
|
|
}
|
|
diff --git a/drivers/irqchip/irq-loongson-pch-pic.c b/drivers/irqchip/irq-loongson-pch-pic.c
|
|
index 9bf6b9a5f7348..90e1ad6e36120 100644
|
|
--- a/drivers/irqchip/irq-loongson-pch-pic.c
|
|
+++ b/drivers/irqchip/irq-loongson-pch-pic.c
|
|
@@ -92,18 +92,22 @@ static int pch_pic_set_type(struct irq_data *d, unsigned int type)
|
|
case IRQ_TYPE_EDGE_RISING:
|
|
pch_pic_bitset(priv, PCH_PIC_EDGE, d->hwirq);
|
|
pch_pic_bitclr(priv, PCH_PIC_POL, d->hwirq);
|
|
+ irq_set_handler_locked(d, handle_edge_irq);
|
|
break;
|
|
case IRQ_TYPE_EDGE_FALLING:
|
|
pch_pic_bitset(priv, PCH_PIC_EDGE, d->hwirq);
|
|
pch_pic_bitset(priv, PCH_PIC_POL, d->hwirq);
|
|
+ irq_set_handler_locked(d, handle_edge_irq);
|
|
break;
|
|
case IRQ_TYPE_LEVEL_HIGH:
|
|
pch_pic_bitclr(priv, PCH_PIC_EDGE, d->hwirq);
|
|
pch_pic_bitclr(priv, PCH_PIC_POL, d->hwirq);
|
|
+ irq_set_handler_locked(d, handle_level_irq);
|
|
break;
|
|
case IRQ_TYPE_LEVEL_LOW:
|
|
pch_pic_bitclr(priv, PCH_PIC_EDGE, d->hwirq);
|
|
pch_pic_bitset(priv, PCH_PIC_POL, d->hwirq);
|
|
+ irq_set_handler_locked(d, handle_level_irq);
|
|
break;
|
|
default:
|
|
ret = -EINVAL;
|
|
@@ -113,11 +117,24 @@ static int pch_pic_set_type(struct irq_data *d, unsigned int type)
|
|
return ret;
|
|
}
|
|
|
|
+static void pch_pic_ack_irq(struct irq_data *d)
|
|
+{
|
|
+ unsigned int reg;
|
|
+ struct pch_pic *priv = irq_data_get_irq_chip_data(d);
|
|
+
|
|
+ reg = readl(priv->base + PCH_PIC_EDGE + PIC_REG_IDX(d->hwirq) * 4);
|
|
+ if (reg & BIT(PIC_REG_BIT(d->hwirq))) {
|
|
+ writel(BIT(PIC_REG_BIT(d->hwirq)),
|
|
+ priv->base + PCH_PIC_CLR + PIC_REG_IDX(d->hwirq) * 4);
|
|
+ }
|
|
+ irq_chip_ack_parent(d);
|
|
+}
|
|
+
|
|
static struct irq_chip pch_pic_irq_chip = {
|
|
.name = "PCH PIC",
|
|
.irq_mask = pch_pic_mask_irq,
|
|
.irq_unmask = pch_pic_unmask_irq,
|
|
- .irq_ack = irq_chip_ack_parent,
|
|
+ .irq_ack = pch_pic_ack_irq,
|
|
.irq_set_affinity = irq_chip_set_affinity_parent,
|
|
.irq_set_type = pch_pic_set_type,
|
|
};
|
|
diff --git a/drivers/leds/leds-is31fl32xx.c b/drivers/leds/leds-is31fl32xx.c
|
|
index 2180255ad3393..899ed94b66876 100644
|
|
--- a/drivers/leds/leds-is31fl32xx.c
|
|
+++ b/drivers/leds/leds-is31fl32xx.c
|
|
@@ -385,6 +385,7 @@ static int is31fl32xx_parse_dt(struct device *dev,
|
|
dev_err(dev,
|
|
"Node %pOF 'reg' conflicts with another LED\n",
|
|
child);
|
|
+ ret = -EINVAL;
|
|
goto err;
|
|
}
|
|
|
|
diff --git a/drivers/leds/leds-lt3593.c b/drivers/leds/leds-lt3593.c
|
|
index 68e06434ac087..7dab08773a347 100644
|
|
--- a/drivers/leds/leds-lt3593.c
|
|
+++ b/drivers/leds/leds-lt3593.c
|
|
@@ -99,10 +99,9 @@ static int lt3593_led_probe(struct platform_device *pdev)
|
|
init_data.default_label = ":";
|
|
|
|
ret = devm_led_classdev_register_ext(dev, &led_data->cdev, &init_data);
|
|
- if (ret < 0) {
|
|
- fwnode_handle_put(child);
|
|
+ fwnode_handle_put(child);
|
|
+ if (ret < 0)
|
|
return ret;
|
|
- }
|
|
|
|
platform_set_drvdata(pdev, led_data);
|
|
|
|
diff --git a/drivers/leds/trigger/ledtrig-audio.c b/drivers/leds/trigger/ledtrig-audio.c
|
|
index f76621e88482d..c6b437e6369b8 100644
|
|
--- a/drivers/leds/trigger/ledtrig-audio.c
|
|
+++ b/drivers/leds/trigger/ledtrig-audio.c
|
|
@@ -6,10 +6,33 @@
|
|
#include <linux/kernel.h>
|
|
#include <linux/leds.h>
|
|
#include <linux/module.h>
|
|
+#include "../leds.h"
|
|
|
|
-static struct led_trigger *ledtrig_audio[NUM_AUDIO_LEDS];
|
|
static enum led_brightness audio_state[NUM_AUDIO_LEDS];
|
|
|
|
+static int ledtrig_audio_mute_activate(struct led_classdev *led_cdev)
|
|
+{
|
|
+ led_set_brightness_nosleep(led_cdev, audio_state[LED_AUDIO_MUTE]);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int ledtrig_audio_micmute_activate(struct led_classdev *led_cdev)
|
|
+{
|
|
+ led_set_brightness_nosleep(led_cdev, audio_state[LED_AUDIO_MICMUTE]);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static struct led_trigger ledtrig_audio[NUM_AUDIO_LEDS] = {
|
|
+ [LED_AUDIO_MUTE] = {
|
|
+ .name = "audio-mute",
|
|
+ .activate = ledtrig_audio_mute_activate,
|
|
+ },
|
|
+ [LED_AUDIO_MICMUTE] = {
|
|
+ .name = "audio-micmute",
|
|
+ .activate = ledtrig_audio_micmute_activate,
|
|
+ },
|
|
+};
|
|
+
|
|
enum led_brightness ledtrig_audio_get(enum led_audio type)
|
|
{
|
|
return audio_state[type];
|
|
@@ -19,24 +42,22 @@ EXPORT_SYMBOL_GPL(ledtrig_audio_get);
|
|
void ledtrig_audio_set(enum led_audio type, enum led_brightness state)
|
|
{
|
|
audio_state[type] = state;
|
|
- led_trigger_event(ledtrig_audio[type], state);
|
|
+ led_trigger_event(&ledtrig_audio[type], state);
|
|
}
|
|
EXPORT_SYMBOL_GPL(ledtrig_audio_set);
|
|
|
|
static int __init ledtrig_audio_init(void)
|
|
{
|
|
- led_trigger_register_simple("audio-mute",
|
|
- &ledtrig_audio[LED_AUDIO_MUTE]);
|
|
- led_trigger_register_simple("audio-micmute",
|
|
- &ledtrig_audio[LED_AUDIO_MICMUTE]);
|
|
+ led_trigger_register(&ledtrig_audio[LED_AUDIO_MUTE]);
|
|
+ led_trigger_register(&ledtrig_audio[LED_AUDIO_MICMUTE]);
|
|
return 0;
|
|
}
|
|
module_init(ledtrig_audio_init);
|
|
|
|
static void __exit ledtrig_audio_exit(void)
|
|
{
|
|
- led_trigger_unregister_simple(ledtrig_audio[LED_AUDIO_MUTE]);
|
|
- led_trigger_unregister_simple(ledtrig_audio[LED_AUDIO_MICMUTE]);
|
|
+ led_trigger_unregister(&ledtrig_audio[LED_AUDIO_MUTE]);
|
|
+ led_trigger_unregister(&ledtrig_audio[LED_AUDIO_MICMUTE]);
|
|
}
|
|
module_exit(ledtrig_audio_exit);
|
|
|
|
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
|
|
index 248bda63f0852..81f1cc5b34999 100644
|
|
--- a/drivers/md/bcache/super.c
|
|
+++ b/drivers/md/bcache/super.c
|
|
@@ -934,20 +934,20 @@ static int bcache_device_init(struct bcache_device *d, unsigned int block_size,
|
|
n = BITS_TO_LONGS(d->nr_stripes) * sizeof(unsigned long);
|
|
d->full_dirty_stripes = kvzalloc(n, GFP_KERNEL);
|
|
if (!d->full_dirty_stripes)
|
|
- return -ENOMEM;
|
|
+ goto out_free_stripe_sectors_dirty;
|
|
|
|
idx = ida_simple_get(&bcache_device_idx, 0,
|
|
BCACHE_DEVICE_IDX_MAX, GFP_KERNEL);
|
|
if (idx < 0)
|
|
- return idx;
|
|
+ goto out_free_full_dirty_stripes;
|
|
|
|
if (bioset_init(&d->bio_split, 4, offsetof(struct bbio, bio),
|
|
BIOSET_NEED_BVECS|BIOSET_NEED_RESCUER))
|
|
- goto err;
|
|
+ goto out_ida_remove;
|
|
|
|
d->disk = alloc_disk(BCACHE_MINORS);
|
|
if (!d->disk)
|
|
- goto err;
|
|
+ goto out_bioset_exit;
|
|
|
|
set_capacity(d->disk, sectors);
|
|
snprintf(d->disk->disk_name, DISK_NAME_LEN, "bcache%i", idx);
|
|
@@ -993,8 +993,14 @@ static int bcache_device_init(struct bcache_device *d, unsigned int block_size,
|
|
|
|
return 0;
|
|
|
|
-err:
|
|
+out_bioset_exit:
|
|
+ bioset_exit(&d->bio_split);
|
|
+out_ida_remove:
|
|
ida_simple_remove(&bcache_device_idx, idx);
|
|
+out_free_full_dirty_stripes:
|
|
+ kvfree(d->full_dirty_stripes);
|
|
+out_free_stripe_sectors_dirty:
|
|
+ kvfree(d->stripe_sectors_dirty);
|
|
return -ENOMEM;
|
|
|
|
}
|
|
diff --git a/drivers/media/i2c/tda1997x.c b/drivers/media/i2c/tda1997x.c
|
|
index 89bb7e6dc7a42..9554c8348c020 100644
|
|
--- a/drivers/media/i2c/tda1997x.c
|
|
+++ b/drivers/media/i2c/tda1997x.c
|
|
@@ -2233,6 +2233,7 @@ static int tda1997x_core_init(struct v4l2_subdev *sd)
|
|
/* get initial HDMI status */
|
|
state->hdmi_status = io_read(sd, REG_HDMI_FLAGS);
|
|
|
|
+ io_write(sd, REG_EDID_ENABLE, EDID_ENABLE_A_EN | EDID_ENABLE_B_EN);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/media/platform/coda/coda-bit.c b/drivers/media/platform/coda/coda-bit.c
|
|
index bf75927bac4e7..159c9de857885 100644
|
|
--- a/drivers/media/platform/coda/coda-bit.c
|
|
+++ b/drivers/media/platform/coda/coda-bit.c
|
|
@@ -2031,17 +2031,25 @@ static int __coda_start_decoding(struct coda_ctx *ctx)
|
|
u32 src_fourcc, dst_fourcc;
|
|
int ret;
|
|
|
|
+ q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
|
|
+ q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
|
+ src_fourcc = q_data_src->fourcc;
|
|
+ dst_fourcc = q_data_dst->fourcc;
|
|
+
|
|
if (!ctx->initialized) {
|
|
ret = __coda_decoder_seq_init(ctx);
|
|
if (ret < 0)
|
|
return ret;
|
|
+ } else {
|
|
+ ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | (0x3 << 9) |
|
|
+ CODA9_FRAME_TILED2LINEAR);
|
|
+ if (dst_fourcc == V4L2_PIX_FMT_NV12 || dst_fourcc == V4L2_PIX_FMT_YUYV)
|
|
+ ctx->frame_mem_ctrl |= CODA_FRAME_CHROMA_INTERLEAVE;
|
|
+ if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP)
|
|
+ ctx->frame_mem_ctrl |= (0x3 << 9) |
|
|
+ ((ctx->use_vdoa) ? 0 : CODA9_FRAME_TILED2LINEAR);
|
|
}
|
|
|
|
- q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
|
|
- q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
|
- src_fourcc = q_data_src->fourcc;
|
|
- dst_fourcc = q_data_dst->fourcc;
|
|
-
|
|
coda_write(dev, ctx->parabuf.paddr, CODA_REG_BIT_PARA_BUF_ADDR);
|
|
|
|
ret = coda_alloc_framebuffers(ctx, q_data_dst, src_fourcc);
|
|
diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
|
|
index 47246528ac7ef..e2d0fd5eaf29a 100644
|
|
--- a/drivers/media/platform/qcom/venus/venc.c
|
|
+++ b/drivers/media/platform/qcom/venus/venc.c
|
|
@@ -183,6 +183,8 @@ venc_try_fmt_common(struct venus_inst *inst, struct v4l2_format *f)
|
|
else
|
|
return NULL;
|
|
fmt = find_format(inst, pixmp->pixelformat, f->type);
|
|
+ if (!fmt)
|
|
+ return NULL;
|
|
}
|
|
|
|
pixmp->width = clamp(pixmp->width, frame_width_min(inst),
|
|
diff --git a/drivers/media/platform/rockchip/rga/rga-buf.c b/drivers/media/platform/rockchip/rga/rga-buf.c
|
|
index bf9a75b75083b..81508ed5abf34 100644
|
|
--- a/drivers/media/platform/rockchip/rga/rga-buf.c
|
|
+++ b/drivers/media/platform/rockchip/rga/rga-buf.c
|
|
@@ -79,9 +79,8 @@ static int rga_buf_start_streaming(struct vb2_queue *q, unsigned int count)
|
|
struct rockchip_rga *rga = ctx->rga;
|
|
int ret;
|
|
|
|
- ret = pm_runtime_get_sync(rga->dev);
|
|
+ ret = pm_runtime_resume_and_get(rga->dev);
|
|
if (ret < 0) {
|
|
- pm_runtime_put_noidle(rga->dev);
|
|
rga_buf_return_buffers(q, VB2_BUF_STATE_QUEUED);
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/media/platform/rockchip/rga/rga.c b/drivers/media/platform/rockchip/rga/rga.c
|
|
index 9d122429706e9..6759091b15e09 100644
|
|
--- a/drivers/media/platform/rockchip/rga/rga.c
|
|
+++ b/drivers/media/platform/rockchip/rga/rga.c
|
|
@@ -863,10 +863,12 @@ static int rga_probe(struct platform_device *pdev)
|
|
if (IS_ERR(rga->m2m_dev)) {
|
|
v4l2_err(&rga->v4l2_dev, "Failed to init mem2mem device\n");
|
|
ret = PTR_ERR(rga->m2m_dev);
|
|
- goto unreg_video_dev;
|
|
+ goto rel_vdev;
|
|
}
|
|
|
|
- pm_runtime_get_sync(rga->dev);
|
|
+ ret = pm_runtime_resume_and_get(rga->dev);
|
|
+ if (ret < 0)
|
|
+ goto rel_vdev;
|
|
|
|
rga->version.major = (rga_read(rga, RGA_VERSION_INFO) >> 24) & 0xFF;
|
|
rga->version.minor = (rga_read(rga, RGA_VERSION_INFO) >> 20) & 0x0F;
|
|
@@ -880,11 +882,23 @@ static int rga_probe(struct platform_device *pdev)
|
|
rga->cmdbuf_virt = dma_alloc_attrs(rga->dev, RGA_CMDBUF_SIZE,
|
|
&rga->cmdbuf_phy, GFP_KERNEL,
|
|
DMA_ATTR_WRITE_COMBINE);
|
|
+ if (!rga->cmdbuf_virt) {
|
|
+ ret = -ENOMEM;
|
|
+ goto rel_vdev;
|
|
+ }
|
|
|
|
rga->src_mmu_pages =
|
|
(unsigned int *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 3);
|
|
+ if (!rga->src_mmu_pages) {
|
|
+ ret = -ENOMEM;
|
|
+ goto free_dma;
|
|
+ }
|
|
rga->dst_mmu_pages =
|
|
(unsigned int *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 3);
|
|
+ if (rga->dst_mmu_pages) {
|
|
+ ret = -ENOMEM;
|
|
+ goto free_src_pages;
|
|
+ }
|
|
|
|
def_frame.stride = (def_frame.width * def_frame.fmt->depth) >> 3;
|
|
def_frame.size = def_frame.stride * def_frame.height;
|
|
@@ -892,7 +906,7 @@ static int rga_probe(struct platform_device *pdev)
|
|
ret = video_register_device(vfd, VFL_TYPE_VIDEO, -1);
|
|
if (ret) {
|
|
v4l2_err(&rga->v4l2_dev, "Failed to register video device\n");
|
|
- goto rel_vdev;
|
|
+ goto free_dst_pages;
|
|
}
|
|
|
|
v4l2_info(&rga->v4l2_dev, "Registered %s as /dev/%s\n",
|
|
@@ -900,10 +914,15 @@ static int rga_probe(struct platform_device *pdev)
|
|
|
|
return 0;
|
|
|
|
+free_dst_pages:
|
|
+ free_pages((unsigned long)rga->dst_mmu_pages, 3);
|
|
+free_src_pages:
|
|
+ free_pages((unsigned long)rga->src_mmu_pages, 3);
|
|
+free_dma:
|
|
+ dma_free_attrs(rga->dev, RGA_CMDBUF_SIZE, rga->cmdbuf_virt,
|
|
+ rga->cmdbuf_phy, DMA_ATTR_WRITE_COMBINE);
|
|
rel_vdev:
|
|
video_device_release(vfd);
|
|
-unreg_video_dev:
|
|
- video_unregister_device(rga->vfd);
|
|
unreg_v4l2_dev:
|
|
v4l2_device_unregister(&rga->v4l2_dev);
|
|
err_put_clk:
|
|
diff --git a/drivers/media/spi/cxd2880-spi.c b/drivers/media/spi/cxd2880-spi.c
|
|
index 4077217777f92..93194f03764d2 100644
|
|
--- a/drivers/media/spi/cxd2880-spi.c
|
|
+++ b/drivers/media/spi/cxd2880-spi.c
|
|
@@ -524,13 +524,13 @@ cxd2880_spi_probe(struct spi_device *spi)
|
|
if (IS_ERR(dvb_spi->vcc_supply)) {
|
|
if (PTR_ERR(dvb_spi->vcc_supply) == -EPROBE_DEFER) {
|
|
ret = -EPROBE_DEFER;
|
|
- goto fail_adapter;
|
|
+ goto fail_regulator;
|
|
}
|
|
dvb_spi->vcc_supply = NULL;
|
|
} else {
|
|
ret = regulator_enable(dvb_spi->vcc_supply);
|
|
if (ret)
|
|
- goto fail_adapter;
|
|
+ goto fail_regulator;
|
|
}
|
|
|
|
dvb_spi->spi = spi;
|
|
@@ -618,6 +618,9 @@ fail_frontend:
|
|
fail_attach:
|
|
dvb_unregister_adapter(&dvb_spi->adapter);
|
|
fail_adapter:
|
|
+ if (!dvb_spi->vcc_supply)
|
|
+ regulator_disable(dvb_spi->vcc_supply);
|
|
+fail_regulator:
|
|
kfree(dvb_spi);
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/media/usb/dvb-usb/dvb-usb-i2c.c b/drivers/media/usb/dvb-usb/dvb-usb-i2c.c
|
|
index 2e07106f46803..bc4b2abdde1a4 100644
|
|
--- a/drivers/media/usb/dvb-usb/dvb-usb-i2c.c
|
|
+++ b/drivers/media/usb/dvb-usb/dvb-usb-i2c.c
|
|
@@ -17,7 +17,8 @@ int dvb_usb_i2c_init(struct dvb_usb_device *d)
|
|
|
|
if (d->props.i2c_algo == NULL) {
|
|
err("no i2c algorithm specified");
|
|
- return -EINVAL;
|
|
+ ret = -EINVAL;
|
|
+ goto err;
|
|
}
|
|
|
|
strscpy(d->i2c_adap.name, d->desc->name, sizeof(d->i2c_adap.name));
|
|
@@ -27,11 +28,15 @@ int dvb_usb_i2c_init(struct dvb_usb_device *d)
|
|
|
|
i2c_set_adapdata(&d->i2c_adap, d);
|
|
|
|
- if ((ret = i2c_add_adapter(&d->i2c_adap)) < 0)
|
|
+ ret = i2c_add_adapter(&d->i2c_adap);
|
|
+ if (ret < 0) {
|
|
err("could not add i2c adapter");
|
|
+ goto err;
|
|
+ }
|
|
|
|
d->state |= DVB_USB_STATE_I2C;
|
|
|
|
+err:
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/media/usb/dvb-usb/dvb-usb-init.c b/drivers/media/usb/dvb-usb/dvb-usb-init.c
|
|
index 28e1fd64dd3c2..61439c8f33cab 100644
|
|
--- a/drivers/media/usb/dvb-usb/dvb-usb-init.c
|
|
+++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c
|
|
@@ -194,8 +194,8 @@ static int dvb_usb_init(struct dvb_usb_device *d, short *adapter_nums)
|
|
|
|
err_adapter_init:
|
|
dvb_usb_adapter_exit(d);
|
|
-err_i2c_init:
|
|
dvb_usb_i2c_exit(d);
|
|
+err_i2c_init:
|
|
if (d->priv && d->props.priv_destroy)
|
|
d->props.priv_destroy(d);
|
|
err_priv_init:
|
|
diff --git a/drivers/media/usb/dvb-usb/nova-t-usb2.c b/drivers/media/usb/dvb-usb/nova-t-usb2.c
|
|
index e7b290552b663..9c0eb0d40822e 100644
|
|
--- a/drivers/media/usb/dvb-usb/nova-t-usb2.c
|
|
+++ b/drivers/media/usb/dvb-usb/nova-t-usb2.c
|
|
@@ -130,7 +130,7 @@ ret:
|
|
|
|
static int nova_t_read_mac_address (struct dvb_usb_device *d, u8 mac[6])
|
|
{
|
|
- int i;
|
|
+ int i, ret;
|
|
u8 b;
|
|
|
|
mac[0] = 0x00;
|
|
@@ -139,7 +139,9 @@ static int nova_t_read_mac_address (struct dvb_usb_device *d, u8 mac[6])
|
|
|
|
/* this is a complete guess, but works for my box */
|
|
for (i = 136; i < 139; i++) {
|
|
- dibusb_read_eeprom_byte(d,i, &b);
|
|
+ ret = dibusb_read_eeprom_byte(d, i, &b);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
mac[5 - (i - 136)] = b;
|
|
}
|
|
diff --git a/drivers/media/usb/dvb-usb/vp702x.c b/drivers/media/usb/dvb-usb/vp702x.c
|
|
index bf54747e2e01a..a1d9e4801a2ba 100644
|
|
--- a/drivers/media/usb/dvb-usb/vp702x.c
|
|
+++ b/drivers/media/usb/dvb-usb/vp702x.c
|
|
@@ -291,16 +291,22 @@ static int vp702x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
|
|
static int vp702x_read_mac_addr(struct dvb_usb_device *d,u8 mac[6])
|
|
{
|
|
u8 i, *buf;
|
|
+ int ret;
|
|
struct vp702x_device_state *st = d->priv;
|
|
|
|
mutex_lock(&st->buf_mutex);
|
|
buf = st->buf;
|
|
- for (i = 6; i < 12; i++)
|
|
- vp702x_usb_in_op(d, READ_EEPROM_REQ, i, 1, &buf[i - 6], 1);
|
|
+ for (i = 6; i < 12; i++) {
|
|
+ ret = vp702x_usb_in_op(d, READ_EEPROM_REQ, i, 1,
|
|
+ &buf[i - 6], 1);
|
|
+ if (ret < 0)
|
|
+ goto err;
|
|
+ }
|
|
|
|
memcpy(mac, buf, 6);
|
|
+err:
|
|
mutex_unlock(&st->buf_mutex);
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
|
|
static int vp702x_frontend_attach(struct dvb_usb_adapter *adap)
|
|
diff --git a/drivers/media/usb/em28xx/em28xx-input.c b/drivers/media/usb/em28xx/em28xx-input.c
|
|
index 59529cbf9cd0b..0b6d77c3bec86 100644
|
|
--- a/drivers/media/usb/em28xx/em28xx-input.c
|
|
+++ b/drivers/media/usb/em28xx/em28xx-input.c
|
|
@@ -842,7 +842,6 @@ error:
|
|
kfree(ir);
|
|
ref_put:
|
|
em28xx_shutdown_buttons(dev);
|
|
- kref_put(&dev->ref, em28xx_free_device);
|
|
return err;
|
|
}
|
|
|
|
diff --git a/drivers/media/usb/go7007/go7007-driver.c b/drivers/media/usb/go7007/go7007-driver.c
|
|
index f1767be9d8685..6650eab913d81 100644
|
|
--- a/drivers/media/usb/go7007/go7007-driver.c
|
|
+++ b/drivers/media/usb/go7007/go7007-driver.c
|
|
@@ -691,49 +691,23 @@ struct go7007 *go7007_alloc(const struct go7007_board_info *board,
|
|
struct device *dev)
|
|
{
|
|
struct go7007 *go;
|
|
- int i;
|
|
|
|
go = kzalloc(sizeof(struct go7007), GFP_KERNEL);
|
|
if (go == NULL)
|
|
return NULL;
|
|
go->dev = dev;
|
|
go->board_info = board;
|
|
- go->board_id = 0;
|
|
go->tuner_type = -1;
|
|
- go->channel_number = 0;
|
|
- go->name[0] = 0;
|
|
mutex_init(&go->hw_lock);
|
|
init_waitqueue_head(&go->frame_waitq);
|
|
spin_lock_init(&go->spinlock);
|
|
go->status = STATUS_INIT;
|
|
- memset(&go->i2c_adapter, 0, sizeof(go->i2c_adapter));
|
|
- go->i2c_adapter_online = 0;
|
|
- go->interrupt_available = 0;
|
|
init_waitqueue_head(&go->interrupt_waitq);
|
|
- go->input = 0;
|
|
go7007_update_board(go);
|
|
- go->encoder_h_halve = 0;
|
|
- go->encoder_v_halve = 0;
|
|
- go->encoder_subsample = 0;
|
|
go->format = V4L2_PIX_FMT_MJPEG;
|
|
go->bitrate = 1500000;
|
|
go->fps_scale = 1;
|
|
- go->pali = 0;
|
|
go->aspect_ratio = GO7007_RATIO_1_1;
|
|
- go->gop_size = 0;
|
|
- go->ipb = 0;
|
|
- go->closed_gop = 0;
|
|
- go->repeat_seqhead = 0;
|
|
- go->seq_header_enable = 0;
|
|
- go->gop_header_enable = 0;
|
|
- go->dvd_mode = 0;
|
|
- go->interlace_coding = 0;
|
|
- for (i = 0; i < 4; ++i)
|
|
- go->modet[i].enable = 0;
|
|
- for (i = 0; i < 1624; ++i)
|
|
- go->modet_map[i] = 0;
|
|
- go->audio_deliver = NULL;
|
|
- go->audio_enabled = 0;
|
|
|
|
return go;
|
|
}
|
|
diff --git a/drivers/media/usb/go7007/go7007-usb.c b/drivers/media/usb/go7007/go7007-usb.c
|
|
index dbf0455d5d50d..eeb85981e02b6 100644
|
|
--- a/drivers/media/usb/go7007/go7007-usb.c
|
|
+++ b/drivers/media/usb/go7007/go7007-usb.c
|
|
@@ -1134,7 +1134,7 @@ static int go7007_usb_probe(struct usb_interface *intf,
|
|
|
|
ep = usb->usbdev->ep_in[4];
|
|
if (!ep)
|
|
- return -ENODEV;
|
|
+ goto allocfail;
|
|
|
|
/* Allocate the URB and buffer for receiving incoming interrupts */
|
|
usb->intr_urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
diff --git a/drivers/misc/lkdtm/core.c b/drivers/misc/lkdtm/core.c
|
|
index c802db9aaeb04..32b3d77368e37 100644
|
|
--- a/drivers/misc/lkdtm/core.c
|
|
+++ b/drivers/misc/lkdtm/core.c
|
|
@@ -81,7 +81,7 @@ static struct crashpoint crashpoints[] = {
|
|
CRASHPOINT("FS_DEVRW", "ll_rw_block"),
|
|
CRASHPOINT("MEM_SWAPOUT", "shrink_inactive_list"),
|
|
CRASHPOINT("TIMERADD", "hrtimer_start"),
|
|
- CRASHPOINT("SCSI_DISPATCH_CMD", "scsi_dispatch_cmd"),
|
|
+ CRASHPOINT("SCSI_QUEUE_RQ", "scsi_queue_rq"),
|
|
CRASHPOINT("IDE_CORE_CP", "generic_ide_ioctl"),
|
|
#endif
|
|
};
|
|
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
|
|
index 8b5d542e20f30..7f90326b1be50 100644
|
|
--- a/drivers/mmc/host/dw_mmc.c
|
|
+++ b/drivers/mmc/host/dw_mmc.c
|
|
@@ -782,6 +782,7 @@ static int dw_mci_edmac_start_dma(struct dw_mci *host,
|
|
int ret = 0;
|
|
|
|
/* Set external dma config: burst size, burst width */
|
|
+ memset(&cfg, 0, sizeof(cfg));
|
|
cfg.dst_addr = host->phy_regs + fifo_offset;
|
|
cfg.src_addr = cfg.dst_addr;
|
|
cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
|
diff --git a/drivers/mmc/host/moxart-mmc.c b/drivers/mmc/host/moxart-mmc.c
|
|
index f25079ba3bca2..2e4a7c6971dc9 100644
|
|
--- a/drivers/mmc/host/moxart-mmc.c
|
|
+++ b/drivers/mmc/host/moxart-mmc.c
|
|
@@ -631,6 +631,7 @@ static int moxart_probe(struct platform_device *pdev)
|
|
host->dma_chan_tx, host->dma_chan_rx);
|
|
host->have_dma = true;
|
|
|
|
+ memset(&cfg, 0, sizeof(cfg));
|
|
cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
|
cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
|
|
|
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
|
|
index 6cdadbb3accd5..b1e1d327cb8eb 100644
|
|
--- a/drivers/mmc/host/sdhci.c
|
|
+++ b/drivers/mmc/host/sdhci.c
|
|
@@ -1223,6 +1223,7 @@ static int sdhci_external_dma_setup(struct sdhci_host *host,
|
|
if (!host->mapbase)
|
|
return -EINVAL;
|
|
|
|
+ memset(&cfg, 0, sizeof(cfg));
|
|
cfg.src_addr = host->mapbase + SDHCI_BUFFER;
|
|
cfg.dst_addr = host->mapbase + SDHCI_BUFFER;
|
|
cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
|
|
index 59253846e8858..f26d037356191 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
|
|
@@ -417,6 +417,9 @@ static int atl_resume_common(struct device *dev, bool deep)
|
|
pci_restore_state(pdev);
|
|
|
|
if (deep) {
|
|
+ /* Reinitialize Nic/Vecs objects */
|
|
+ aq_nic_deinit(nic, !nic->aq_hw->aq_nic_cfg->wol);
|
|
+
|
|
ret = aq_nic_init(nic);
|
|
if (ret)
|
|
goto err_exit;
|
|
diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/ethernet/google/gve/gve_adminq.c
|
|
index 24ae6a28a806d..6009d76e41fc4 100644
|
|
--- a/drivers/net/ethernet/google/gve/gve_adminq.c
|
|
+++ b/drivers/net/ethernet/google/gve/gve_adminq.c
|
|
@@ -182,7 +182,8 @@ static int gve_adminq_issue_cmd(struct gve_priv *priv,
|
|
tail = ioread32be(&priv->reg_bar0->adminq_event_counter);
|
|
|
|
// Check if next command will overflow the buffer.
|
|
- if (((priv->adminq_prod_cnt + 1) & priv->adminq_mask) == tail) {
|
|
+ if (((priv->adminq_prod_cnt + 1) & priv->adminq_mask) ==
|
|
+ (tail & priv->adminq_mask)) {
|
|
int err;
|
|
|
|
// Flush existing commands to make room.
|
|
@@ -192,7 +193,8 @@ static int gve_adminq_issue_cmd(struct gve_priv *priv,
|
|
|
|
// Retry.
|
|
tail = ioread32be(&priv->reg_bar0->adminq_event_counter);
|
|
- if (((priv->adminq_prod_cnt + 1) & priv->adminq_mask) == tail) {
|
|
+ if (((priv->adminq_prod_cnt + 1) & priv->adminq_mask) ==
|
|
+ (tail & priv->adminq_mask)) {
|
|
// This should never happen. We just flushed the
|
|
// command queue so there should be enough space.
|
|
return -ENOMEM;
|
|
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
|
|
index e4f13a49c3df8..a02167cce81e1 100644
|
|
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
|
|
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
|
|
@@ -1107,12 +1107,12 @@ static int i40e_quiesce_vf_pci(struct i40e_vf *vf)
|
|
}
|
|
|
|
/**
|
|
- * i40e_getnum_vf_vsi_vlan_filters
|
|
+ * __i40e_getnum_vf_vsi_vlan_filters
|
|
* @vsi: pointer to the vsi
|
|
*
|
|
* called to get the number of VLANs offloaded on this VF
|
|
**/
|
|
-static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
|
+static int __i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
|
{
|
|
struct i40e_mac_filter *f;
|
|
u16 num_vlans = 0, bkt;
|
|
@@ -1125,6 +1125,23 @@ static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
|
return num_vlans;
|
|
}
|
|
|
|
+/**
|
|
+ * i40e_getnum_vf_vsi_vlan_filters
|
|
+ * @vsi: pointer to the vsi
|
|
+ *
|
|
+ * wrapper for __i40e_getnum_vf_vsi_vlan_filters() with spinlock held
|
|
+ **/
|
|
+static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
|
+{
|
|
+ int num_vlans;
|
|
+
|
|
+ spin_lock_bh(&vsi->mac_filter_hash_lock);
|
|
+ num_vlans = __i40e_getnum_vf_vsi_vlan_filters(vsi);
|
|
+ spin_unlock_bh(&vsi->mac_filter_hash_lock);
|
|
+
|
|
+ return num_vlans;
|
|
+}
|
|
+
|
|
/**
|
|
* i40e_get_vlan_list_sync
|
|
* @vsi: pointer to the VSI
|
|
@@ -1142,7 +1159,7 @@ static void i40e_get_vlan_list_sync(struct i40e_vsi *vsi, u16 *num_vlans,
|
|
int bkt;
|
|
|
|
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
|
- *num_vlans = i40e_getnum_vf_vsi_vlan_filters(vsi);
|
|
+ *num_vlans = __i40e_getnum_vf_vsi_vlan_filters(vsi);
|
|
*vlan_list = kcalloc(*num_vlans, sizeof(**vlan_list), GFP_ATOMIC);
|
|
if (!(*vlan_list))
|
|
goto err;
|
|
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
|
|
index a46780570cd95..5d0dc1f811e0f 100644
|
|
--- a/drivers/net/ethernet/intel/ice/ice_main.c
|
|
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
|
|
@@ -4879,6 +4879,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)
|
|
struct ice_hw *hw = &pf->hw;
|
|
struct sockaddr *addr = pi;
|
|
enum ice_status status;
|
|
+ u8 old_mac[ETH_ALEN];
|
|
u8 flags = 0;
|
|
int err = 0;
|
|
u8 *mac;
|
|
@@ -4901,8 +4902,13 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)
|
|
}
|
|
|
|
netif_addr_lock_bh(netdev);
|
|
+ ether_addr_copy(old_mac, netdev->dev_addr);
|
|
+ /* change the netdev's MAC address */
|
|
+ memcpy(netdev->dev_addr, mac, netdev->addr_len);
|
|
+ netif_addr_unlock_bh(netdev);
|
|
+
|
|
/* Clean up old MAC filter. Not an error if old filter doesn't exist */
|
|
- status = ice_fltr_remove_mac(vsi, netdev->dev_addr, ICE_FWD_TO_VSI);
|
|
+ status = ice_fltr_remove_mac(vsi, old_mac, ICE_FWD_TO_VSI);
|
|
if (status && status != ICE_ERR_DOES_NOT_EXIST) {
|
|
err = -EADDRNOTAVAIL;
|
|
goto err_update_filters;
|
|
@@ -4925,13 +4931,12 @@ err_update_filters:
|
|
if (err) {
|
|
netdev_err(netdev, "can't set MAC %pM. filter update failed\n",
|
|
mac);
|
|
+ netif_addr_lock_bh(netdev);
|
|
+ ether_addr_copy(netdev->dev_addr, old_mac);
|
|
netif_addr_unlock_bh(netdev);
|
|
return err;
|
|
}
|
|
|
|
- /* change the netdev's MAC address */
|
|
- memcpy(netdev->dev_addr, mac, netdev->addr_len);
|
|
- netif_addr_unlock_bh(netdev);
|
|
netdev_dbg(vsi->netdev, "updated MAC address to %pM\n",
|
|
netdev->dev_addr);
|
|
|
|
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
|
|
index 169ae491f9786..6fa9358e6db4f 100644
|
|
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
|
|
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
|
|
@@ -27,7 +27,7 @@
|
|
#define NIXLF_PROMISC_ENTRY 2
|
|
|
|
#define NPC_PARSE_RESULT_DMAC_OFFSET 8
|
|
-#define NPC_HW_TSTAMP_OFFSET 8
|
|
+#define NPC_HW_TSTAMP_OFFSET 8ULL
|
|
|
|
static const char def_pfl_name[] = "default";
|
|
|
|
@@ -1171,14 +1171,15 @@ int rvu_npc_init(struct rvu *rvu)
|
|
|
|
/* Enable below for Rx pkts.
|
|
* - Outer IPv4 header checksum validation.
|
|
- * - Detect outer L2 broadcast address and set NPC_RESULT_S[L2M].
|
|
+ * - Detect outer L2 broadcast address and set NPC_RESULT_S[L2B].
|
|
+ * - Detect outer L2 multicast address and set NPC_RESULT_S[L2M].
|
|
* - Inner IPv4 header checksum validation.
|
|
* - Set non zero checksum error code value
|
|
*/
|
|
rvu_write64(rvu, blkaddr, NPC_AF_PCK_CFG,
|
|
rvu_read64(rvu, blkaddr, NPC_AF_PCK_CFG) |
|
|
- BIT_ULL(32) | BIT_ULL(24) | BIT_ULL(6) |
|
|
- BIT_ULL(2) | BIT_ULL(1));
|
|
+ ((u64)NPC_EC_OIP4_CSUM << 32) | (NPC_EC_IIP4_CSUM << 24) |
|
|
+ BIT_ULL(7) | BIT_ULL(6) | BIT_ULL(2) | BIT_ULL(1));
|
|
|
|
/* Set RX and TX side MCAM search key size.
|
|
* LA..LD (ltype only) + Channel
|
|
@@ -1318,7 +1319,7 @@ static void npc_unmap_mcam_entry_and_cntr(struct rvu *rvu,
|
|
int blkaddr, u16 entry, u16 cntr)
|
|
{
|
|
u16 index = entry & (mcam->banksize - 1);
|
|
- u16 bank = npc_get_bank(mcam, entry);
|
|
+ u32 bank = npc_get_bank(mcam, entry);
|
|
|
|
/* Remove mapping and reduce counter's refcnt */
|
|
mcam->entry2cntr_map[entry] = NPC_MCAM_INVALID_MAP;
|
|
@@ -1879,8 +1880,8 @@ int rvu_mbox_handler_npc_mcam_shift_entry(struct rvu *rvu,
|
|
struct npc_mcam *mcam = &rvu->hw->mcam;
|
|
u16 pcifunc = req->hdr.pcifunc;
|
|
u16 old_entry, new_entry;
|
|
+ int blkaddr, rc = 0;
|
|
u16 index, cntr;
|
|
- int blkaddr, rc;
|
|
|
|
blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
|
|
if (blkaddr < 0)
|
|
@@ -2081,10 +2082,11 @@ int rvu_mbox_handler_npc_mcam_unmap_counter(struct rvu *rvu,
|
|
index = find_next_bit(mcam->bmap, mcam->bmap_entries, entry);
|
|
if (index >= mcam->bmap_entries)
|
|
break;
|
|
+ entry = index + 1;
|
|
+
|
|
if (mcam->entry2cntr_map[index] != req->cntr)
|
|
continue;
|
|
|
|
- entry = index + 1;
|
|
npc_unmap_mcam_entry_and_cntr(rvu, mcam, blkaddr,
|
|
index, req->cntr);
|
|
}
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
|
|
index bf5cf022e279d..4cba110f6ef8c 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
|
|
@@ -376,6 +376,48 @@ static void mlx5_devlink_set_params_init_values(struct devlink *devlink)
|
|
#endif
|
|
}
|
|
|
|
+#define MLX5_TRAP_DROP(_id, _group_id) \
|
|
+ DEVLINK_TRAP_GENERIC(DROP, DROP, _id, \
|
|
+ DEVLINK_TRAP_GROUP_GENERIC_ID_##_group_id, \
|
|
+ DEVLINK_TRAP_METADATA_TYPE_F_IN_PORT)
|
|
+
|
|
+static const struct devlink_trap mlx5_traps_arr[] = {
|
|
+ MLX5_TRAP_DROP(INGRESS_VLAN_FILTER, L2_DROPS),
|
|
+};
|
|
+
|
|
+static const struct devlink_trap_group mlx5_trap_groups_arr[] = {
|
|
+ DEVLINK_TRAP_GROUP_GENERIC(L2_DROPS, 0),
|
|
+};
|
|
+
|
|
+static int mlx5_devlink_traps_register(struct devlink *devlink)
|
|
+{
|
|
+ struct mlx5_core_dev *core_dev = devlink_priv(devlink);
|
|
+ int err;
|
|
+
|
|
+ err = devlink_trap_groups_register(devlink, mlx5_trap_groups_arr,
|
|
+ ARRAY_SIZE(mlx5_trap_groups_arr));
|
|
+ if (err)
|
|
+ return err;
|
|
+
|
|
+ err = devlink_traps_register(devlink, mlx5_traps_arr, ARRAY_SIZE(mlx5_traps_arr),
|
|
+ &core_dev->priv);
|
|
+ if (err)
|
|
+ goto err_trap_group;
|
|
+ return 0;
|
|
+
|
|
+err_trap_group:
|
|
+ devlink_trap_groups_unregister(devlink, mlx5_trap_groups_arr,
|
|
+ ARRAY_SIZE(mlx5_trap_groups_arr));
|
|
+ return err;
|
|
+}
|
|
+
|
|
+static void mlx5_devlink_traps_unregister(struct devlink *devlink)
|
|
+{
|
|
+ devlink_traps_unregister(devlink, mlx5_traps_arr, ARRAY_SIZE(mlx5_traps_arr));
|
|
+ devlink_trap_groups_unregister(devlink, mlx5_trap_groups_arr,
|
|
+ ARRAY_SIZE(mlx5_trap_groups_arr));
|
|
+}
|
|
+
|
|
int mlx5_devlink_register(struct devlink *devlink, struct device *dev)
|
|
{
|
|
int err;
|
|
@@ -390,8 +432,16 @@ int mlx5_devlink_register(struct devlink *devlink, struct device *dev)
|
|
goto params_reg_err;
|
|
mlx5_devlink_set_params_init_values(devlink);
|
|
devlink_params_publish(devlink);
|
|
+
|
|
+ err = mlx5_devlink_traps_register(devlink);
|
|
+ if (err)
|
|
+ goto traps_reg_err;
|
|
+
|
|
return 0;
|
|
|
|
+traps_reg_err:
|
|
+ devlink_params_unregister(devlink, mlx5_devlink_params,
|
|
+ ARRAY_SIZE(mlx5_devlink_params));
|
|
params_reg_err:
|
|
devlink_unregister(devlink);
|
|
return err;
|
|
@@ -399,6 +449,8 @@ params_reg_err:
|
|
|
|
void mlx5_devlink_unregister(struct devlink *devlink)
|
|
{
|
|
+ mlx5_devlink_traps_unregister(devlink);
|
|
+ devlink_params_unpublish(devlink);
|
|
devlink_params_unregister(devlink, mlx5_devlink_params,
|
|
ARRAY_SIZE(mlx5_devlink_params));
|
|
devlink_unregister(devlink);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h b/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h
|
|
index dc744702aee4a..000ca294b0a0a 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h
|
|
@@ -262,18 +262,12 @@ struct ttc_params {
|
|
|
|
void mlx5e_set_ttc_basic_params(struct mlx5e_priv *priv, struct ttc_params *ttc_params);
|
|
void mlx5e_set_ttc_ft_params(struct ttc_params *ttc_params);
|
|
-void mlx5e_set_inner_ttc_ft_params(struct ttc_params *ttc_params);
|
|
|
|
int mlx5e_create_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
|
|
struct mlx5e_ttc_table *ttc);
|
|
void mlx5e_destroy_ttc_table(struct mlx5e_priv *priv,
|
|
struct mlx5e_ttc_table *ttc);
|
|
|
|
-int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
|
|
- struct mlx5e_ttc_table *ttc);
|
|
-void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv,
|
|
- struct mlx5e_ttc_table *ttc);
|
|
-
|
|
void mlx5e_destroy_flow_table(struct mlx5e_flow_table *ft);
|
|
int mlx5e_ttc_fwd_dest(struct mlx5e_priv *priv, enum mlx5e_traffic_types type,
|
|
struct mlx5_flow_destination *new_dest);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
|
|
index 93877becfae26..f405c256b3cd0 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
|
|
@@ -1138,7 +1138,7 @@ void mlx5e_set_ttc_basic_params(struct mlx5e_priv *priv,
|
|
ttc_params->inner_ttc = &priv->fs.inner_ttc;
|
|
}
|
|
|
|
-void mlx5e_set_inner_ttc_ft_params(struct ttc_params *ttc_params)
|
|
+static void mlx5e_set_inner_ttc_ft_params(struct ttc_params *ttc_params)
|
|
{
|
|
struct mlx5_flow_table_attr *ft_attr = &ttc_params->ft_attr;
|
|
|
|
@@ -1157,8 +1157,8 @@ void mlx5e_set_ttc_ft_params(struct ttc_params *ttc_params)
|
|
ft_attr->prio = MLX5E_NIC_PRIO;
|
|
}
|
|
|
|
-int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
|
|
- struct mlx5e_ttc_table *ttc)
|
|
+static int mlx5e_create_inner_ttc_table(struct mlx5e_priv *priv, struct ttc_params *params,
|
|
+ struct mlx5e_ttc_table *ttc)
|
|
{
|
|
struct mlx5e_flow_table *ft = &ttc->ft;
|
|
int err;
|
|
@@ -1188,8 +1188,8 @@ err:
|
|
return err;
|
|
}
|
|
|
|
-void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv,
|
|
- struct mlx5e_ttc_table *ttc)
|
|
+static void mlx5e_destroy_inner_ttc_table(struct mlx5e_priv *priv,
|
|
+ struct mlx5e_ttc_table *ttc)
|
|
{
|
|
if (!mlx5e_tunnel_inner_ft_supported(priv->mdev))
|
|
return;
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
index 6b4a3d90c9f7f..6974090a7efac 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
@@ -2803,6 +2803,14 @@ static int mlx5e_modify_tirs_lro(struct mlx5e_priv *priv)
|
|
err = mlx5_core_modify_tir(mdev, priv->indir_tir[tt].tirn, in);
|
|
if (err)
|
|
goto free_in;
|
|
+
|
|
+ /* Verify inner tirs resources allocated */
|
|
+ if (!priv->inner_indir_tir[0].tirn)
|
|
+ continue;
|
|
+
|
|
+ err = mlx5_core_modify_tir(mdev, priv->inner_indir_tir[tt].tirn, in);
|
|
+ if (err)
|
|
+ goto free_in;
|
|
}
|
|
|
|
for (ix = 0; ix < priv->max_nch; ix++) {
|
|
@@ -4928,7 +4936,14 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
|
|
netdev->hw_enc_features |= NETIF_F_HW_VLAN_CTAG_TX;
|
|
netdev->hw_enc_features |= NETIF_F_HW_VLAN_CTAG_RX;
|
|
|
|
+ /* Tunneled LRO is not supported in the driver, and the same RQs are
|
|
+ * shared between inner and outer TIRs, so the driver can't disable LRO
|
|
+ * for inner TIRs while having it enabled for outer TIRs. Due to this,
|
|
+ * block LRO altogether if the firmware declares tunneled LRO support.
|
|
+ */
|
|
if (!!MLX5_CAP_ETH(mdev, lro_cap) &&
|
|
+ !MLX5_CAP_ETH(mdev, tunnel_lro_vxlan) &&
|
|
+ !MLX5_CAP_ETH(mdev, tunnel_lro_gre) &&
|
|
mlx5e_check_fragmented_striding_rq_cap(mdev))
|
|
netdev->vlan_features |= NETIF_F_LRO;
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
index c9c2962ad49fb..5801f55ff0771 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
@@ -2564,8 +2564,11 @@ int mlx5_devlink_eswitch_inline_mode_set(struct devlink *devlink, u8 mode,
|
|
|
|
switch (MLX5_CAP_ETH(dev, wqe_inline_mode)) {
|
|
case MLX5_CAP_INLINE_MODE_NOT_REQUIRED:
|
|
- if (mode == DEVLINK_ESWITCH_INLINE_MODE_NONE)
|
|
+ if (mode == DEVLINK_ESWITCH_INLINE_MODE_NONE) {
|
|
+ err = 0;
|
|
goto out;
|
|
+ }
|
|
+
|
|
fallthrough;
|
|
case MLX5_CAP_INLINE_MODE_L2:
|
|
NL_SET_ERR_MSG_MOD(extack, "Inline mode can't be set");
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
|
|
index 97b5fcb1f4064..5c6a376aa62ec 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
|
|
@@ -337,17 +337,6 @@ static int mlx5i_create_flow_steering(struct mlx5e_priv *priv)
|
|
}
|
|
|
|
mlx5e_set_ttc_basic_params(priv, &ttc_params);
|
|
- mlx5e_set_inner_ttc_ft_params(&ttc_params);
|
|
- for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++)
|
|
- ttc_params.indir_tirn[tt] = priv->inner_indir_tir[tt].tirn;
|
|
-
|
|
- err = mlx5e_create_inner_ttc_table(priv, &ttc_params, &priv->fs.inner_ttc);
|
|
- if (err) {
|
|
- netdev_err(priv->netdev, "Failed to create inner ttc table, err=%d\n",
|
|
- err);
|
|
- goto err_destroy_arfs_tables;
|
|
- }
|
|
-
|
|
mlx5e_set_ttc_ft_params(&ttc_params);
|
|
for (tt = 0; tt < MLX5E_NUM_INDIR_TIRS; tt++)
|
|
ttc_params.indir_tirn[tt] = priv->indir_tir[tt].tirn;
|
|
@@ -356,13 +345,11 @@ static int mlx5i_create_flow_steering(struct mlx5e_priv *priv)
|
|
if (err) {
|
|
netdev_err(priv->netdev, "Failed to create ttc table, err=%d\n",
|
|
err);
|
|
- goto err_destroy_inner_ttc_table;
|
|
+ goto err_destroy_arfs_tables;
|
|
}
|
|
|
|
return 0;
|
|
|
|
-err_destroy_inner_ttc_table:
|
|
- mlx5e_destroy_inner_ttc_table(priv, &priv->fs.inner_ttc);
|
|
err_destroy_arfs_tables:
|
|
mlx5e_arfs_destroy_tables(priv);
|
|
|
|
@@ -372,7 +359,6 @@ err_destroy_arfs_tables:
|
|
static void mlx5i_destroy_flow_steering(struct mlx5e_priv *priv)
|
|
{
|
|
mlx5e_destroy_ttc_table(priv, &priv->fs.ttc);
|
|
- mlx5e_destroy_inner_ttc_table(priv, &priv->fs.inner_ttc);
|
|
mlx5e_arfs_destroy_tables(priv);
|
|
}
|
|
|
|
@@ -397,7 +383,7 @@ static int mlx5i_init_rx(struct mlx5e_priv *priv)
|
|
if (err)
|
|
goto err_destroy_indirect_rqts;
|
|
|
|
- err = mlx5e_create_indirect_tirs(priv, true);
|
|
+ err = mlx5e_create_indirect_tirs(priv, false);
|
|
if (err)
|
|
goto err_destroy_direct_rqts;
|
|
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
|
|
index 51d64718ed9f0..3d94064c685db 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
|
|
@@ -91,20 +91,20 @@ int ionic_devlink_register(struct ionic *ionic)
|
|
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
|
|
devlink_port_attrs_set(&ionic->dl_port, &attrs);
|
|
err = devlink_port_register(dl, &ionic->dl_port, 0);
|
|
- if (err)
|
|
+ if (err) {
|
|
dev_err(ionic->dev, "devlink_port_register failed: %d\n", err);
|
|
- else
|
|
- devlink_port_type_eth_set(&ionic->dl_port,
|
|
- ionic->lif->netdev);
|
|
+ devlink_unregister(dl);
|
|
+ return err;
|
|
+ }
|
|
|
|
- return err;
|
|
+ devlink_port_type_eth_set(&ionic->dl_port, ionic->lif->netdev);
|
|
+ return 0;
|
|
}
|
|
|
|
void ionic_devlink_unregister(struct ionic *ionic)
|
|
{
|
|
struct devlink *dl = priv_to_devlink(ionic);
|
|
|
|
- if (ionic->dl_port.registered)
|
|
- devlink_port_unregister(&ionic->dl_port);
|
|
+ devlink_port_unregister(&ionic->dl_port);
|
|
devlink_unregister(dl);
|
|
}
|
|
diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c
|
|
index 5a3b65a6eb4f2..36bcb5db3be97 100644
|
|
--- a/drivers/net/ethernet/qualcomm/qca_spi.c
|
|
+++ b/drivers/net/ethernet/qualcomm/qca_spi.c
|
|
@@ -434,7 +434,7 @@ qcaspi_receive(struct qcaspi *qca)
|
|
skb_put(qca->rx_skb, retcode);
|
|
qca->rx_skb->protocol = eth_type_trans(
|
|
qca->rx_skb, qca->rx_skb->dev);
|
|
- qca->rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
+ skb_checksum_none_assert(qca->rx_skb);
|
|
netif_rx_ni(qca->rx_skb);
|
|
qca->rx_skb = netdev_alloc_skb_ip_align(net_dev,
|
|
net_dev->mtu + VLAN_ETH_HLEN);
|
|
diff --git a/drivers/net/ethernet/qualcomm/qca_uart.c b/drivers/net/ethernet/qualcomm/qca_uart.c
|
|
index 362b4f5c162c0..0b7301db20ed4 100644
|
|
--- a/drivers/net/ethernet/qualcomm/qca_uart.c
|
|
+++ b/drivers/net/ethernet/qualcomm/qca_uart.c
|
|
@@ -107,7 +107,7 @@ qca_tty_receive(struct serdev_device *serdev, const unsigned char *data,
|
|
skb_put(qca->rx_skb, retcode);
|
|
qca->rx_skb->protocol = eth_type_trans(
|
|
qca->rx_skb, qca->rx_skb->dev);
|
|
- qca->rx_skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
+ skb_checksum_none_assert(qca->rx_skb);
|
|
netif_rx_ni(qca->rx_skb);
|
|
qca->rx_skb = netdev_alloc_skb_ip_align(netdev,
|
|
netdev->mtu +
|
|
diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c
|
|
index dbc47702a268d..5bacddee83449 100644
|
|
--- a/drivers/net/wireless/ath/ath6kl/wmi.c
|
|
+++ b/drivers/net/wireless/ath/ath6kl/wmi.c
|
|
@@ -2504,8 +2504,10 @@ static int ath6kl_wmi_sync_point(struct wmi *wmi, u8 if_idx)
|
|
goto free_data_skb;
|
|
|
|
for (index = 0; index < num_pri_streams; index++) {
|
|
- if (WARN_ON(!data_sync_bufs[index].skb))
|
|
+ if (WARN_ON(!data_sync_bufs[index].skb)) {
|
|
+ ret = -ENOMEM;
|
|
goto free_data_skb;
|
|
+ }
|
|
|
|
ep_id = ath6kl_ac2_endpoint_id(wmi->parent_dev,
|
|
data_sync_bufs[index].
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
index 603aff421e38e..1f12dfb33938a 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
@@ -2073,7 +2073,7 @@ cleanup:
|
|
|
|
err = brcmf_pcie_probe(pdev, NULL);
|
|
if (err)
|
|
- brcmf_err(bus, "probe after resume failed, err=%d\n", err);
|
|
+ __brcmf_err(NULL, __func__, "probe after resume failed, err=%d\n", err);
|
|
|
|
return err;
|
|
}
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
|
|
index 3e5a35e26ad34..5e4faf9ce4bbe 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c
|
|
@@ -229,8 +229,8 @@ found:
|
|
IWL_EXPORT_SYMBOL(iwl_acpi_get_wifi_pkg);
|
|
|
|
int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,
|
|
- __le32 *black_list_array,
|
|
- int *black_list_size)
|
|
+ __le32 *block_list_array,
|
|
+ int *block_list_size)
|
|
{
|
|
union acpi_object *wifi_pkg, *data;
|
|
int ret, tbl_rev, i;
|
|
@@ -254,47 +254,47 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,
|
|
goto out_free;
|
|
}
|
|
|
|
- enabled = !!wifi_pkg->package.elements[0].integer.value;
|
|
+ enabled = !!wifi_pkg->package.elements[1].integer.value;
|
|
|
|
if (!enabled) {
|
|
- *black_list_size = -1;
|
|
+ *block_list_size = -1;
|
|
IWL_DEBUG_RADIO(fwrt, "TAS not enabled\n");
|
|
ret = 0;
|
|
goto out_free;
|
|
}
|
|
|
|
- if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER ||
|
|
- wifi_pkg->package.elements[1].integer.value >
|
|
+ if (wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER ||
|
|
+ wifi_pkg->package.elements[2].integer.value >
|
|
APCI_WTAS_BLACK_LIST_MAX) {
|
|
IWL_DEBUG_RADIO(fwrt, "TAS invalid array size %llu\n",
|
|
wifi_pkg->package.elements[1].integer.value);
|
|
ret = -EINVAL;
|
|
goto out_free;
|
|
}
|
|
- *black_list_size = wifi_pkg->package.elements[1].integer.value;
|
|
+ *block_list_size = wifi_pkg->package.elements[2].integer.value;
|
|
|
|
- IWL_DEBUG_RADIO(fwrt, "TAS array size %d\n", *black_list_size);
|
|
- if (*black_list_size > APCI_WTAS_BLACK_LIST_MAX) {
|
|
+ IWL_DEBUG_RADIO(fwrt, "TAS array size %d\n", *block_list_size);
|
|
+ if (*block_list_size > APCI_WTAS_BLACK_LIST_MAX) {
|
|
IWL_DEBUG_RADIO(fwrt, "TAS invalid array size value %u\n",
|
|
- *black_list_size);
|
|
+ *block_list_size);
|
|
ret = -EINVAL;
|
|
goto out_free;
|
|
}
|
|
|
|
- for (i = 0; i < *black_list_size; i++) {
|
|
+ for (i = 0; i < *block_list_size; i++) {
|
|
u32 country;
|
|
|
|
- if (wifi_pkg->package.elements[2 + i].type !=
|
|
+ if (wifi_pkg->package.elements[3 + i].type !=
|
|
ACPI_TYPE_INTEGER) {
|
|
IWL_DEBUG_RADIO(fwrt,
|
|
- "TAS invalid array elem %d\n", 2 + i);
|
|
+ "TAS invalid array elem %d\n", 3 + i);
|
|
ret = -EINVAL;
|
|
goto out_free;
|
|
}
|
|
|
|
- country = wifi_pkg->package.elements[2 + i].integer.value;
|
|
- black_list_array[i] = cpu_to_le32(country);
|
|
- IWL_DEBUG_RADIO(fwrt, "TAS black list country %d\n", country);
|
|
+ country = wifi_pkg->package.elements[3 + i].integer.value;
|
|
+ block_list_array[i] = cpu_to_le32(country);
|
|
+ IWL_DEBUG_RADIO(fwrt, "TAS block list country %d\n", country);
|
|
}
|
|
|
|
ret = 0;
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.h b/drivers/net/wireless/intel/iwlwifi/fw/acpi.h
|
|
index bddf8a44e163f..dfd341421adcf 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.h
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.h
|
|
@@ -100,7 +100,7 @@
|
|
#define ACPI_ECKV_WIFI_DATA_SIZE 2
|
|
|
|
/*
|
|
- * 1 type, 1 enabled, 1 black list size, 16 black list array
|
|
+ * 1 type, 1 enabled, 1 block list size, 16 block list array
|
|
*/
|
|
#define APCI_WTAS_BLACK_LIST_MAX 16
|
|
#define ACPI_WTAS_WIFI_DATA_SIZE (3 + APCI_WTAS_BLACK_LIST_MAX)
|
|
@@ -197,8 +197,8 @@ bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt);
|
|
int iwl_sar_geo_init(struct iwl_fw_runtime *fwrt,
|
|
struct iwl_per_chain_offset *table, u32 n_bands);
|
|
|
|
-int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, __le32 *black_list_array,
|
|
- int *black_list_size);
|
|
+int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, __le32 *block_list_array,
|
|
+ int *block_list_size);
|
|
|
|
#else /* CONFIG_ACPI */
|
|
|
|
@@ -269,8 +269,8 @@ static inline bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt)
|
|
}
|
|
|
|
static inline int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,
|
|
- __le32 *black_list_array,
|
|
- int *black_list_size)
|
|
+ __le32 *block_list_array,
|
|
+ int *block_list_size)
|
|
{
|
|
return -ENOENT;
|
|
}
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/commands.h b/drivers/net/wireless/intel/iwlwifi/fw/api/commands.h
|
|
index 8cc36dbb23117..21543bc21c16f 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/fw/api/commands.h
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/fw/api/commands.h
|
|
@@ -323,7 +323,7 @@ enum iwl_legacy_cmds {
|
|
|
|
/**
|
|
* @SCAN_OFFLOAD_UPDATE_PROFILES_CMD:
|
|
- * update scan offload (scheduled scan) profiles/blacklist/etc.
|
|
+ * update scan offload (scheduled scan) profiles/blocklist/etc.
|
|
*/
|
|
SCAN_OFFLOAD_UPDATE_PROFILES_CMD = 0x6E,
|
|
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h b/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h
|
|
index 55573168444e8..dd79bac98657b 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h
|
|
@@ -449,12 +449,12 @@ enum iwl_mcc_source {
|
|
#define IWL_TAS_BLACK_LIST_MAX 16
|
|
/**
|
|
* struct iwl_tas_config_cmd - configures the TAS
|
|
- * @black_list_size: size of relevant field in black_list_array
|
|
- * @black_list_array: black list countries (without TAS)
|
|
+ * @block_list_size: size of relevant field in block_list_array
|
|
+ * @block_list_array: block list countries (without TAS)
|
|
*/
|
|
struct iwl_tas_config_cmd {
|
|
- __le32 black_list_size;
|
|
- __le32 black_list_array[IWL_TAS_BLACK_LIST_MAX];
|
|
+ __le32 block_list_size;
|
|
+ __le32 block_list_array[IWL_TAS_BLACK_LIST_MAX];
|
|
} __packed; /* TAS_CONFIG_CMD_API_S_VER_2 */
|
|
|
|
/**
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/scan.h b/drivers/net/wireless/intel/iwlwifi/fw/api/scan.h
|
|
index 5cc33a1b71723..65d6608199664 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/fw/api/scan.h
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/fw/api/scan.h
|
|
@@ -8,7 +8,7 @@
|
|
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
|
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
|
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
|
- * Copyright(c) 2018 - 2019 Intel Corporation
|
|
+ * Copyright(c) 2018 - 2020 Intel Corporation
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of version 2 of the GNU General Public License as
|
|
@@ -31,7 +31,7 @@
|
|
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
|
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
|
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
|
- * Copyright(c) 2018 - 2019 Intel Corporation
|
|
+ * Copyright(c) 2018 - 2020 Intel Corporation
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
@@ -117,12 +117,12 @@ enum scan_framework_client {
|
|
};
|
|
|
|
/**
|
|
- * struct iwl_scan_offload_blacklist - SCAN_OFFLOAD_BLACKLIST_S
|
|
+ * struct iwl_scan_offload_blocklist - SCAN_OFFLOAD_BLACKLIST_S
|
|
* @ssid: MAC address to filter out
|
|
* @reported_rssi: AP rssi reported to the host
|
|
* @client_bitmap: clients ignore this entry - enum scan_framework_client
|
|
*/
|
|
-struct iwl_scan_offload_blacklist {
|
|
+struct iwl_scan_offload_blocklist {
|
|
u8 ssid[ETH_ALEN];
|
|
u8 reported_rssi;
|
|
u8 client_bitmap;
|
|
@@ -162,7 +162,7 @@ struct iwl_scan_offload_profile {
|
|
|
|
/**
|
|
* struct iwl_scan_offload_profile_cfg_data
|
|
- * @blacklist_len: length of blacklist
|
|
+ * @blocklist_len: length of blocklist
|
|
* @num_profiles: num of profiles in the list
|
|
* @match_notify: clients waiting for match found notification
|
|
* @pass_match: clients waiting for the results
|
|
@@ -171,7 +171,7 @@ struct iwl_scan_offload_profile {
|
|
* @reserved: reserved
|
|
*/
|
|
struct iwl_scan_offload_profile_cfg_data {
|
|
- u8 blacklist_len;
|
|
+ u8 blocklist_len;
|
|
u8 num_profiles;
|
|
u8 match_notify;
|
|
u8 pass_match;
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/file.h b/drivers/net/wireless/intel/iwlwifi/fw/file.h
|
|
index 02c64b988a138..1be9ab186bbd5 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/fw/file.h
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/fw/file.h
|
|
@@ -220,7 +220,7 @@ struct iwl_ucode_capa {
|
|
* treats good CRC threshold as a boolean
|
|
* @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
|
|
* @IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT: This uCode image supports uAPSD
|
|
- * @IWL_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of black list instead of 64 in scan
|
|
+ * @IWL_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of block list instead of 64 in scan
|
|
* offload profile config command.
|
|
* @IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six
|
|
* (rather than two) IPv6 addresses
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-config.h b/drivers/net/wireless/intel/iwlwifi/iwl-config.h
|
|
index bd04e4fbbb8ab..1a844c10c442b 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/iwl-config.h
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-config.h
|
|
@@ -376,7 +376,7 @@ struct iwl_fw_mon_regs {
|
|
* mode set
|
|
* @nvm_hw_section_num: the ID of the HW NVM section
|
|
* @mac_addr_from_csr: read HW address from CSR registers
|
|
- * @features: hw features, any combination of feature_whitelist
|
|
+ * @features: hw features, any combination of feature_passlist
|
|
* @pwr_tx_backoffs: translation table between power limits and backoffs
|
|
* @max_tx_agg_size: max TX aggregation size of the ADDBA request/response
|
|
* @max_ht_ampdu_factor: the exponent of the max length of A-MPDU that the
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
|
|
index ad374b25e2550..6348dfa61724a 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
|
|
@@ -1109,7 +1109,7 @@ static void iwl_mvm_tas_init(struct iwl_mvm *mvm)
|
|
struct iwl_tas_config_cmd cmd = {};
|
|
int list_size;
|
|
|
|
- BUILD_BUG_ON(ARRAY_SIZE(cmd.black_list_array) <
|
|
+ BUILD_BUG_ON(ARRAY_SIZE(cmd.block_list_array) <
|
|
APCI_WTAS_BLACK_LIST_MAX);
|
|
|
|
if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_TAS_CFG)) {
|
|
@@ -1117,7 +1117,7 @@ static void iwl_mvm_tas_init(struct iwl_mvm *mvm)
|
|
return;
|
|
}
|
|
|
|
- ret = iwl_acpi_get_tas(&mvm->fwrt, cmd.black_list_array, &list_size);
|
|
+ ret = iwl_acpi_get_tas(&mvm->fwrt, cmd.block_list_array, &list_size);
|
|
if (ret < 0) {
|
|
IWL_DEBUG_RADIO(mvm,
|
|
"TAS table invalid or unavailable. (%d)\n",
|
|
@@ -1129,7 +1129,7 @@ static void iwl_mvm_tas_init(struct iwl_mvm *mvm)
|
|
return;
|
|
|
|
/* list size if TAS enabled can only be non-negative */
|
|
- cmd.black_list_size = cpu_to_le32((u32)list_size);
|
|
+ cmd.block_list_size = cpu_to_le32((u32)list_size);
|
|
|
|
ret = iwl_mvm_send_cmd_pdu(mvm, WIDE_ID(REGULATORY_AND_NVM_GROUP,
|
|
TAS_CONFIG),
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
|
|
index cbdebefb854ac..5243b84e653cf 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
|
|
@@ -115,12 +115,12 @@ static void iwl_mvm_mac_tsf_id_iter(void *_data, u8 *mac,
|
|
* client in the system.
|
|
*
|
|
* The firmware will decide according to the MAC type which
|
|
- * will be the master and slave. Clients that need to sync
|
|
- * with a remote station will be the master, and an AP or GO
|
|
- * will be the slave.
|
|
+ * will be the leader and follower. Clients that need to sync
|
|
+ * with a remote station will be the leader, and an AP or GO
|
|
+ * will be the follower.
|
|
*
|
|
- * Depending on the new interface type it can be slaved to
|
|
- * or become the master of an existing interface.
|
|
+ * Depending on the new interface type it can be following
|
|
+ * or become the leader of an existing interface.
|
|
*/
|
|
switch (data->vif->type) {
|
|
case NL80211_IFTYPE_STATION:
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
|
|
index 8cba923b1ec6c..9caff70cbd276 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
|
|
@@ -2279,9 +2279,9 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
|
|
int ret;
|
|
|
|
/*
|
|
- * Re-calculate the tsf id, as the master-slave relations depend on the
|
|
- * beacon interval, which was not known when the station interface was
|
|
- * added.
|
|
+ * Re-calculate the tsf id, as the leader-follower relations depend
|
|
+ * on the beacon interval, which was not known when the station
|
|
+ * interface was added.
|
|
*/
|
|
if (changes & BSS_CHANGED_ASSOC && bss_conf->assoc) {
|
|
if (vif->bss_conf.he_support &&
|
|
@@ -2499,8 +2499,9 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw,
|
|
goto out_unlock;
|
|
|
|
/*
|
|
- * Re-calculate the tsf id, as the master-slave relations depend on the
|
|
- * beacon interval, which was not known when the AP interface was added.
|
|
+ * Re-calculate the tsf id, as the leader-follower relations depend on
|
|
+ * the beacon interval, which was not known when the AP interface
|
|
+ * was added.
|
|
*/
|
|
if (vif->type == NL80211_IFTYPE_AP)
|
|
iwl_mvm_mac_ctxt_recalc_tsf_id(mvm, vif);
|
|
@@ -3116,7 +3117,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
|
|
* than 16. We can't avoid connecting at all, so refuse the
|
|
* station state change, this will cause mac80211 to abandon
|
|
* attempts to connect to this AP, and eventually wpa_s will
|
|
- * blacklist the AP...
|
|
+ * blocklist the AP...
|
|
*/
|
|
if (vif->type == NL80211_IFTYPE_STATION &&
|
|
vif->bss_conf.beacon_int < 16) {
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
|
|
index 875281cf7fc09..aebaad45043fa 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
|
|
@@ -568,7 +568,7 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
|
{
|
|
struct iwl_scan_offload_profile *profile;
|
|
struct iwl_scan_offload_profile_cfg_v1 *profile_cfg_v1;
|
|
- struct iwl_scan_offload_blacklist *blacklist;
|
|
+ struct iwl_scan_offload_blocklist *blocklist;
|
|
struct iwl_scan_offload_profile_cfg_data *data;
|
|
int max_profiles = iwl_umac_scan_get_max_profiles(mvm->fw);
|
|
int profile_cfg_size = sizeof(*data) +
|
|
@@ -579,7 +579,7 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
|
.dataflags[0] = IWL_HCMD_DFL_NOCOPY,
|
|
.dataflags[1] = IWL_HCMD_DFL_NOCOPY,
|
|
};
|
|
- int blacklist_len;
|
|
+ int blocklist_len;
|
|
int i;
|
|
int ret;
|
|
|
|
@@ -587,22 +587,22 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
|
return -EIO;
|
|
|
|
if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_SHORT_BL)
|
|
- blacklist_len = IWL_SCAN_SHORT_BLACKLIST_LEN;
|
|
+ blocklist_len = IWL_SCAN_SHORT_BLACKLIST_LEN;
|
|
else
|
|
- blacklist_len = IWL_SCAN_MAX_BLACKLIST_LEN;
|
|
+ blocklist_len = IWL_SCAN_MAX_BLACKLIST_LEN;
|
|
|
|
- blacklist = kcalloc(blacklist_len, sizeof(*blacklist), GFP_KERNEL);
|
|
- if (!blacklist)
|
|
+ blocklist = kcalloc(blocklist_len, sizeof(*blocklist), GFP_KERNEL);
|
|
+ if (!blocklist)
|
|
return -ENOMEM;
|
|
|
|
profile_cfg_v1 = kzalloc(profile_cfg_size, GFP_KERNEL);
|
|
if (!profile_cfg_v1) {
|
|
ret = -ENOMEM;
|
|
- goto free_blacklist;
|
|
+ goto free_blocklist;
|
|
}
|
|
|
|
- cmd.data[0] = blacklist;
|
|
- cmd.len[0] = sizeof(*blacklist) * blacklist_len;
|
|
+ cmd.data[0] = blocklist;
|
|
+ cmd.len[0] = sizeof(*blocklist) * blocklist_len;
|
|
cmd.data[1] = profile_cfg_v1;
|
|
|
|
/* if max_profile is MAX_PROFILES_V2, we have the new API */
|
|
@@ -615,7 +615,7 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
|
data = &profile_cfg_v1->data;
|
|
}
|
|
|
|
- /* No blacklist configuration */
|
|
+ /* No blocklist configuration */
|
|
data->num_profiles = req->n_match_sets;
|
|
data->active_clients = SCAN_CLIENT_SCHED_SCAN;
|
|
data->pass_match = SCAN_CLIENT_SCHED_SCAN;
|
|
@@ -639,8 +639,8 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
|
|
|
ret = iwl_mvm_send_cmd(mvm, &cmd);
|
|
kfree(profile_cfg_v1);
|
|
-free_blacklist:
|
|
- kfree(blacklist);
|
|
+free_blocklist:
|
|
+ kfree(blocklist);
|
|
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
|
|
index eeb70560b746e..90b12e201795c 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
|
|
@@ -646,6 +646,7 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
|
|
IWL_DEV_INFO(0xA0F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0, NULL),
|
|
IWL_DEV_INFO(0xA0F0, 0x2074, iwl_ax201_cfg_qu_hr, NULL),
|
|
IWL_DEV_INFO(0xA0F0, 0x4070, iwl_ax201_cfg_qu_hr, NULL),
|
|
+ IWL_DEV_INFO(0xA0F0, 0x6074, iwl_ax201_cfg_qu_hr, NULL),
|
|
IWL_DEV_INFO(0x02F0, 0x0070, iwl_ax201_cfg_quz_hr, NULL),
|
|
IWL_DEV_INFO(0x02F0, 0x0074, iwl_ax201_cfg_quz_hr, NULL),
|
|
IWL_DEV_INFO(0x02F0, 0x6074, iwl_ax201_cfg_quz_hr, NULL),
|
|
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
|
|
index 99b21a2c83861..f4a26f16f00f4 100644
|
|
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
|
|
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
|
|
@@ -1038,8 +1038,10 @@ static int rsi_load_9116_firmware(struct rsi_hw *adapter)
|
|
}
|
|
|
|
ta_firmware = kmemdup(fw_entry->data, fw_entry->size, GFP_KERNEL);
|
|
- if (!ta_firmware)
|
|
+ if (!ta_firmware) {
|
|
+ status = -ENOMEM;
|
|
goto fail_release_fw;
|
|
+ }
|
|
fw_p = ta_firmware;
|
|
instructions_sz = fw_entry->size;
|
|
rsi_dbg(INFO_ZONE, "FW Length = %d bytes\n", instructions_sz);
|
|
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
|
|
index 00b5589847985..3b13de59605e1 100644
|
|
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
|
|
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
|
|
@@ -814,6 +814,7 @@ static int rsi_probe(struct usb_interface *pfunction,
|
|
} else {
|
|
rsi_dbg(ERR_ZONE, "%s: Unsupported RSI device id 0x%x\n",
|
|
__func__, id->idProduct);
|
|
+ status = -ENODEV;
|
|
goto err1;
|
|
}
|
|
|
|
diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
|
|
index e6d58402b829d..c6c2e2361b2fe 100644
|
|
--- a/drivers/nvme/host/rdma.c
|
|
+++ b/drivers/nvme/host/rdma.c
|
|
@@ -735,13 +735,13 @@ static int nvme_rdma_alloc_io_queues(struct nvme_rdma_ctrl *ctrl)
|
|
if (ret)
|
|
return ret;
|
|
|
|
- ctrl->ctrl.queue_count = nr_io_queues + 1;
|
|
- if (ctrl->ctrl.queue_count < 2) {
|
|
+ if (nr_io_queues == 0) {
|
|
dev_err(ctrl->ctrl.device,
|
|
"unable to set any I/O queues\n");
|
|
return -ENOMEM;
|
|
}
|
|
|
|
+ ctrl->ctrl.queue_count = nr_io_queues + 1;
|
|
dev_info(ctrl->ctrl.device,
|
|
"creating %d I/O queues.\n", nr_io_queues);
|
|
|
|
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
|
|
index 82b2611d39a2f..5b11d8a23813f 100644
|
|
--- a/drivers/nvme/host/tcp.c
|
|
+++ b/drivers/nvme/host/tcp.c
|
|
@@ -1755,13 +1755,13 @@ static int nvme_tcp_alloc_io_queues(struct nvme_ctrl *ctrl)
|
|
if (ret)
|
|
return ret;
|
|
|
|
- ctrl->queue_count = nr_io_queues + 1;
|
|
- if (ctrl->queue_count < 2) {
|
|
+ if (nr_io_queues == 0) {
|
|
dev_err(ctrl->device,
|
|
"unable to set any I/O queues\n");
|
|
return -ENOMEM;
|
|
}
|
|
|
|
+ ctrl->queue_count = nr_io_queues + 1;
|
|
dev_info(ctrl->device,
|
|
"creating %d I/O queues.\n", nr_io_queues);
|
|
|
|
diff --git a/drivers/nvme/target/fabrics-cmd.c b/drivers/nvme/target/fabrics-cmd.c
|
|
index 42bd12b8bf00c..e62d3d0fa6c85 100644
|
|
--- a/drivers/nvme/target/fabrics-cmd.c
|
|
+++ b/drivers/nvme/target/fabrics-cmd.c
|
|
@@ -120,6 +120,7 @@ static u16 nvmet_install_queue(struct nvmet_ctrl *ctrl, struct nvmet_req *req)
|
|
if (!sqsize) {
|
|
pr_warn("queue size zero!\n");
|
|
req->error_loc = offsetof(struct nvmf_connect_command, sqsize);
|
|
+ req->cqe->result.u32 = IPO_IATTR_CONNECT_SQE(sqsize);
|
|
ret = NVME_SC_CONNECT_INVALID_PARAM | NVME_SC_DNR;
|
|
goto err;
|
|
}
|
|
@@ -263,11 +264,11 @@ static void nvmet_execute_io_connect(struct nvmet_req *req)
|
|
}
|
|
|
|
status = nvmet_install_queue(ctrl, req);
|
|
- if (status) {
|
|
- /* pass back cntlid that had the issue of installing queue */
|
|
- req->cqe->result.u16 = cpu_to_le16(ctrl->cntlid);
|
|
+ if (status)
|
|
goto out_ctrl_put;
|
|
- }
|
|
+
|
|
+ /* pass back cntlid for successful completion */
|
|
+ req->cqe->result.u16 = cpu_to_le16(ctrl->cntlid);
|
|
|
|
pr_debug("adding queue %d to ctrl %d.\n", qid, ctrl->cntlid);
|
|
|
|
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
|
|
index 9e971fffeb6a3..29f5d699fa06d 100644
|
|
--- a/drivers/pci/pci.c
|
|
+++ b/drivers/pci/pci.c
|
|
@@ -2469,7 +2469,14 @@ static int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable
|
|
if (enable) {
|
|
int error;
|
|
|
|
- if (pci_pme_capable(dev, state))
|
|
+ /*
|
|
+ * Enable PME signaling if the device can signal PME from
|
|
+ * D3cold regardless of whether or not it can signal PME from
|
|
+ * the current target state, because that will allow it to
|
|
+ * signal PME when the hierarchy above it goes into D3cold and
|
|
+ * the device itself ends up in D3cold as a result of that.
|
|
+ */
|
|
+ if (pci_pme_capable(dev, state) || pci_pme_capable(dev, PCI_D3cold))
|
|
pci_pme_active(dev, true);
|
|
else
|
|
ret = 1;
|
|
@@ -2573,16 +2580,20 @@ static pci_power_t pci_target_state(struct pci_dev *dev, bool wakeup)
|
|
if (dev->current_state == PCI_D3cold)
|
|
target_state = PCI_D3cold;
|
|
|
|
- if (wakeup) {
|
|
+ if (wakeup && dev->pme_support) {
|
|
+ pci_power_t state = target_state;
|
|
+
|
|
/*
|
|
* Find the deepest state from which the device can generate
|
|
* PME#.
|
|
*/
|
|
- if (dev->pme_support) {
|
|
- while (target_state
|
|
- && !(dev->pme_support & (1 << target_state)))
|
|
- target_state--;
|
|
- }
|
|
+ while (state && !(dev->pme_support & (1 << state)))
|
|
+ state--;
|
|
+
|
|
+ if (state)
|
|
+ return state;
|
|
+ else if (dev->pme_support & 1)
|
|
+ return PCI_D0;
|
|
}
|
|
|
|
return target_state;
|
|
diff --git a/drivers/power/supply/axp288_fuel_gauge.c b/drivers/power/supply/axp288_fuel_gauge.c
|
|
index 148eb8105803a..be24529157be2 100644
|
|
--- a/drivers/power/supply/axp288_fuel_gauge.c
|
|
+++ b/drivers/power/supply/axp288_fuel_gauge.c
|
|
@@ -149,7 +149,7 @@ static int fuel_gauge_reg_readb(struct axp288_fg_info *info, int reg)
|
|
}
|
|
|
|
if (ret < 0) {
|
|
- dev_err(&info->pdev->dev, "axp288 reg read err:%d\n", ret);
|
|
+ dev_err(&info->pdev->dev, "Error reading reg 0x%02x err: %d\n", reg, ret);
|
|
return ret;
|
|
}
|
|
|
|
@@ -163,7 +163,7 @@ static int fuel_gauge_reg_writeb(struct axp288_fg_info *info, int reg, u8 val)
|
|
ret = regmap_write(info->regmap, reg, (unsigned int)val);
|
|
|
|
if (ret < 0)
|
|
- dev_err(&info->pdev->dev, "axp288 reg write err:%d\n", ret);
|
|
+ dev_err(&info->pdev->dev, "Error writing reg 0x%02x err: %d\n", reg, ret);
|
|
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c
|
|
index 794caf03658d7..48d3985eaa8ad 100644
|
|
--- a/drivers/power/supply/max17042_battery.c
|
|
+++ b/drivers/power/supply/max17042_battery.c
|
|
@@ -738,7 +738,7 @@ static inline void max17042_override_por_values(struct max17042_chip *chip)
|
|
struct max17042_config_data *config = chip->pdata->config_data;
|
|
|
|
max17042_override_por(map, MAX17042_TGAIN, config->tgain);
|
|
- max17042_override_por(map, MAx17042_TOFF, config->toff);
|
|
+ max17042_override_por(map, MAX17042_TOFF, config->toff);
|
|
max17042_override_por(map, MAX17042_CGAIN, config->cgain);
|
|
max17042_override_por(map, MAX17042_COFF, config->coff);
|
|
|
|
diff --git a/drivers/power/supply/smb347-charger.c b/drivers/power/supply/smb347-charger.c
|
|
index 8cfbd8d6b4786..912e2184f918c 100644
|
|
--- a/drivers/power/supply/smb347-charger.c
|
|
+++ b/drivers/power/supply/smb347-charger.c
|
|
@@ -56,6 +56,7 @@
|
|
#define CFG_PIN_EN_CTRL_ACTIVE_LOW 0x60
|
|
#define CFG_PIN_EN_APSD_IRQ BIT(1)
|
|
#define CFG_PIN_EN_CHARGER_ERROR BIT(2)
|
|
+#define CFG_PIN_EN_CTRL BIT(4)
|
|
#define CFG_THERM 0x07
|
|
#define CFG_THERM_SOFT_HOT_COMPENSATION_MASK 0x03
|
|
#define CFG_THERM_SOFT_HOT_COMPENSATION_SHIFT 0
|
|
@@ -725,6 +726,15 @@ static int smb347_hw_init(struct smb347_charger *smb)
|
|
if (ret < 0)
|
|
goto fail;
|
|
|
|
+ /* Activate pin control, making it writable. */
|
|
+ switch (smb->enable_control) {
|
|
+ case SMB3XX_CHG_ENABLE_PIN_ACTIVE_LOW:
|
|
+ case SMB3XX_CHG_ENABLE_PIN_ACTIVE_HIGH:
|
|
+ ret = regmap_set_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CTRL);
|
|
+ if (ret < 0)
|
|
+ goto fail;
|
|
+ }
|
|
+
|
|
/*
|
|
* Make the charging functionality controllable by a write to the
|
|
* command register unless pin control is specified in the platform
|
|
diff --git a/drivers/regulator/tps65910-regulator.c b/drivers/regulator/tps65910-regulator.c
|
|
index 1d5b0a1b86f78..06cbe60c990f9 100644
|
|
--- a/drivers/regulator/tps65910-regulator.c
|
|
+++ b/drivers/regulator/tps65910-regulator.c
|
|
@@ -1211,12 +1211,10 @@ static int tps65910_probe(struct platform_device *pdev)
|
|
|
|
rdev = devm_regulator_register(&pdev->dev, &pmic->desc[i],
|
|
&config);
|
|
- if (IS_ERR(rdev)) {
|
|
- dev_err(tps65910->dev,
|
|
- "failed to register %s regulator\n",
|
|
- pdev->name);
|
|
- return PTR_ERR(rdev);
|
|
- }
|
|
+ if (IS_ERR(rdev))
|
|
+ return dev_err_probe(tps65910->dev, PTR_ERR(rdev),
|
|
+ "failed to register %s regulator\n",
|
|
+ pdev->name);
|
|
|
|
/* Save regulator for cleanup */
|
|
pmic->rdev[i] = rdev;
|
|
diff --git a/drivers/regulator/vctrl-regulator.c b/drivers/regulator/vctrl-regulator.c
|
|
index cbadb1c996790..d2a37978fc3a8 100644
|
|
--- a/drivers/regulator/vctrl-regulator.c
|
|
+++ b/drivers/regulator/vctrl-regulator.c
|
|
@@ -37,7 +37,6 @@ struct vctrl_voltage_table {
|
|
struct vctrl_data {
|
|
struct regulator_dev *rdev;
|
|
struct regulator_desc desc;
|
|
- struct regulator *ctrl_reg;
|
|
bool enabled;
|
|
unsigned int min_slew_down_rate;
|
|
unsigned int ovp_threshold;
|
|
@@ -82,7 +81,12 @@ static int vctrl_calc_output_voltage(struct vctrl_data *vctrl, int ctrl_uV)
|
|
static int vctrl_get_voltage(struct regulator_dev *rdev)
|
|
{
|
|
struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
|
|
- int ctrl_uV = regulator_get_voltage_rdev(vctrl->ctrl_reg->rdev);
|
|
+ int ctrl_uV;
|
|
+
|
|
+ if (!rdev->supply)
|
|
+ return -EPROBE_DEFER;
|
|
+
|
|
+ ctrl_uV = regulator_get_voltage_rdev(rdev->supply->rdev);
|
|
|
|
return vctrl_calc_output_voltage(vctrl, ctrl_uV);
|
|
}
|
|
@@ -92,14 +96,19 @@ static int vctrl_set_voltage(struct regulator_dev *rdev,
|
|
unsigned int *selector)
|
|
{
|
|
struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
|
|
- struct regulator *ctrl_reg = vctrl->ctrl_reg;
|
|
- int orig_ctrl_uV = regulator_get_voltage_rdev(ctrl_reg->rdev);
|
|
- int uV = vctrl_calc_output_voltage(vctrl, orig_ctrl_uV);
|
|
+ int orig_ctrl_uV;
|
|
+ int uV;
|
|
int ret;
|
|
|
|
+ if (!rdev->supply)
|
|
+ return -EPROBE_DEFER;
|
|
+
|
|
+ orig_ctrl_uV = regulator_get_voltage_rdev(rdev->supply->rdev);
|
|
+ uV = vctrl_calc_output_voltage(vctrl, orig_ctrl_uV);
|
|
+
|
|
if (req_min_uV >= uV || !vctrl->ovp_threshold)
|
|
/* voltage rising or no OVP */
|
|
- return regulator_set_voltage_rdev(ctrl_reg->rdev,
|
|
+ return regulator_set_voltage_rdev(rdev->supply->rdev,
|
|
vctrl_calc_ctrl_voltage(vctrl, req_min_uV),
|
|
vctrl_calc_ctrl_voltage(vctrl, req_max_uV),
|
|
PM_SUSPEND_ON);
|
|
@@ -117,7 +126,7 @@ static int vctrl_set_voltage(struct regulator_dev *rdev,
|
|
next_uV = max_t(int, req_min_uV, uV - max_drop_uV);
|
|
next_ctrl_uV = vctrl_calc_ctrl_voltage(vctrl, next_uV);
|
|
|
|
- ret = regulator_set_voltage_rdev(ctrl_reg->rdev,
|
|
+ ret = regulator_set_voltage_rdev(rdev->supply->rdev,
|
|
next_ctrl_uV,
|
|
next_ctrl_uV,
|
|
PM_SUSPEND_ON);
|
|
@@ -134,7 +143,7 @@ static int vctrl_set_voltage(struct regulator_dev *rdev,
|
|
|
|
err:
|
|
/* Try to go back to original voltage */
|
|
- regulator_set_voltage_rdev(ctrl_reg->rdev, orig_ctrl_uV, orig_ctrl_uV,
|
|
+ regulator_set_voltage_rdev(rdev->supply->rdev, orig_ctrl_uV, orig_ctrl_uV,
|
|
PM_SUSPEND_ON);
|
|
|
|
return ret;
|
|
@@ -151,16 +160,18 @@ static int vctrl_set_voltage_sel(struct regulator_dev *rdev,
|
|
unsigned int selector)
|
|
{
|
|
struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
|
|
- struct regulator *ctrl_reg = vctrl->ctrl_reg;
|
|
unsigned int orig_sel = vctrl->sel;
|
|
int ret;
|
|
|
|
+ if (!rdev->supply)
|
|
+ return -EPROBE_DEFER;
|
|
+
|
|
if (selector >= rdev->desc->n_voltages)
|
|
return -EINVAL;
|
|
|
|
if (selector >= vctrl->sel || !vctrl->ovp_threshold) {
|
|
/* voltage rising or no OVP */
|
|
- ret = regulator_set_voltage_rdev(ctrl_reg->rdev,
|
|
+ ret = regulator_set_voltage_rdev(rdev->supply->rdev,
|
|
vctrl->vtable[selector].ctrl,
|
|
vctrl->vtable[selector].ctrl,
|
|
PM_SUSPEND_ON);
|
|
@@ -179,7 +190,7 @@ static int vctrl_set_voltage_sel(struct regulator_dev *rdev,
|
|
else
|
|
next_sel = vctrl->vtable[vctrl->sel].ovp_min_sel;
|
|
|
|
- ret = regulator_set_voltage_rdev(ctrl_reg->rdev,
|
|
+ ret = regulator_set_voltage_rdev(rdev->supply->rdev,
|
|
vctrl->vtable[next_sel].ctrl,
|
|
vctrl->vtable[next_sel].ctrl,
|
|
PM_SUSPEND_ON);
|
|
@@ -202,7 +213,7 @@ static int vctrl_set_voltage_sel(struct regulator_dev *rdev,
|
|
err:
|
|
if (vctrl->sel != orig_sel) {
|
|
/* Try to go back to original voltage */
|
|
- if (!regulator_set_voltage_rdev(ctrl_reg->rdev,
|
|
+ if (!regulator_set_voltage_rdev(rdev->supply->rdev,
|
|
vctrl->vtable[orig_sel].ctrl,
|
|
vctrl->vtable[orig_sel].ctrl,
|
|
PM_SUSPEND_ON))
|
|
@@ -234,10 +245,6 @@ static int vctrl_parse_dt(struct platform_device *pdev,
|
|
u32 pval;
|
|
u32 vrange_ctrl[2];
|
|
|
|
- vctrl->ctrl_reg = devm_regulator_get(&pdev->dev, "ctrl");
|
|
- if (IS_ERR(vctrl->ctrl_reg))
|
|
- return PTR_ERR(vctrl->ctrl_reg);
|
|
-
|
|
ret = of_property_read_u32(np, "ovp-threshold-percent", &pval);
|
|
if (!ret) {
|
|
vctrl->ovp_threshold = pval;
|
|
@@ -315,11 +322,11 @@ static int vctrl_cmp_ctrl_uV(const void *a, const void *b)
|
|
return at->ctrl - bt->ctrl;
|
|
}
|
|
|
|
-static int vctrl_init_vtable(struct platform_device *pdev)
|
|
+static int vctrl_init_vtable(struct platform_device *pdev,
|
|
+ struct regulator *ctrl_reg)
|
|
{
|
|
struct vctrl_data *vctrl = platform_get_drvdata(pdev);
|
|
struct regulator_desc *rdesc = &vctrl->desc;
|
|
- struct regulator *ctrl_reg = vctrl->ctrl_reg;
|
|
struct vctrl_voltage_range *vrange_ctrl = &vctrl->vrange.ctrl;
|
|
int n_voltages;
|
|
int ctrl_uV;
|
|
@@ -395,23 +402,19 @@ static int vctrl_init_vtable(struct platform_device *pdev)
|
|
static int vctrl_enable(struct regulator_dev *rdev)
|
|
{
|
|
struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
|
|
- int ret = regulator_enable(vctrl->ctrl_reg);
|
|
|
|
- if (!ret)
|
|
- vctrl->enabled = true;
|
|
+ vctrl->enabled = true;
|
|
|
|
- return ret;
|
|
+ return 0;
|
|
}
|
|
|
|
static int vctrl_disable(struct regulator_dev *rdev)
|
|
{
|
|
struct vctrl_data *vctrl = rdev_get_drvdata(rdev);
|
|
- int ret = regulator_disable(vctrl->ctrl_reg);
|
|
|
|
- if (!ret)
|
|
- vctrl->enabled = false;
|
|
+ vctrl->enabled = false;
|
|
|
|
- return ret;
|
|
+ return 0;
|
|
}
|
|
|
|
static int vctrl_is_enabled(struct regulator_dev *rdev)
|
|
@@ -447,6 +450,7 @@ static int vctrl_probe(struct platform_device *pdev)
|
|
struct regulator_desc *rdesc;
|
|
struct regulator_config cfg = { };
|
|
struct vctrl_voltage_range *vrange_ctrl;
|
|
+ struct regulator *ctrl_reg;
|
|
int ctrl_uV;
|
|
int ret;
|
|
|
|
@@ -461,15 +465,20 @@ static int vctrl_probe(struct platform_device *pdev)
|
|
if (ret)
|
|
return ret;
|
|
|
|
+ ctrl_reg = devm_regulator_get(&pdev->dev, "ctrl");
|
|
+ if (IS_ERR(ctrl_reg))
|
|
+ return PTR_ERR(ctrl_reg);
|
|
+
|
|
vrange_ctrl = &vctrl->vrange.ctrl;
|
|
|
|
rdesc = &vctrl->desc;
|
|
rdesc->name = "vctrl";
|
|
rdesc->type = REGULATOR_VOLTAGE;
|
|
rdesc->owner = THIS_MODULE;
|
|
+ rdesc->supply_name = "ctrl";
|
|
|
|
- if ((regulator_get_linear_step(vctrl->ctrl_reg) == 1) ||
|
|
- (regulator_count_voltages(vctrl->ctrl_reg) == -EINVAL)) {
|
|
+ if ((regulator_get_linear_step(ctrl_reg) == 1) ||
|
|
+ (regulator_count_voltages(ctrl_reg) == -EINVAL)) {
|
|
rdesc->continuous_voltage_range = true;
|
|
rdesc->ops = &vctrl_ops_cont;
|
|
} else {
|
|
@@ -486,11 +495,12 @@ static int vctrl_probe(struct platform_device *pdev)
|
|
cfg.init_data = init_data;
|
|
|
|
if (!rdesc->continuous_voltage_range) {
|
|
- ret = vctrl_init_vtable(pdev);
|
|
+ ret = vctrl_init_vtable(pdev, ctrl_reg);
|
|
if (ret)
|
|
return ret;
|
|
|
|
- ctrl_uV = regulator_get_voltage_rdev(vctrl->ctrl_reg->rdev);
|
|
+ /* Use locked consumer API when not in regulator framework */
|
|
+ ctrl_uV = regulator_get_voltage(ctrl_reg);
|
|
if (ctrl_uV < 0) {
|
|
dev_err(&pdev->dev, "failed to get control voltage\n");
|
|
return ctrl_uV;
|
|
@@ -513,6 +523,9 @@ static int vctrl_probe(struct platform_device *pdev)
|
|
}
|
|
}
|
|
|
|
+ /* Drop ctrl-supply here in favor of regulator core managed supply */
|
|
+ devm_regulator_put(ctrl_reg);
|
|
+
|
|
vctrl->rdev = devm_regulator_register(&pdev->dev, rdesc, &cfg);
|
|
if (IS_ERR(vctrl->rdev)) {
|
|
ret = PTR_ERR(vctrl->rdev);
|
|
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
|
|
index cca1a7c4bb336..305db4173dcf3 100644
|
|
--- a/drivers/s390/cio/css.c
|
|
+++ b/drivers/s390/cio/css.c
|
|
@@ -426,9 +426,26 @@ static ssize_t pimpampom_show(struct device *dev,
|
|
}
|
|
static DEVICE_ATTR_RO(pimpampom);
|
|
|
|
+static ssize_t dev_busid_show(struct device *dev,
|
|
+ struct device_attribute *attr,
|
|
+ char *buf)
|
|
+{
|
|
+ struct subchannel *sch = to_subchannel(dev);
|
|
+ struct pmcw *pmcw = &sch->schib.pmcw;
|
|
+
|
|
+ if ((pmcw->st == SUBCHANNEL_TYPE_IO ||
|
|
+ pmcw->st == SUBCHANNEL_TYPE_MSG) && pmcw->dnv)
|
|
+ return sysfs_emit(buf, "0.%x.%04x\n", sch->schid.ssid,
|
|
+ pmcw->dev);
|
|
+ else
|
|
+ return sysfs_emit(buf, "none\n");
|
|
+}
|
|
+static DEVICE_ATTR_RO(dev_busid);
|
|
+
|
|
static struct attribute *io_subchannel_type_attrs[] = {
|
|
&dev_attr_chpids.attr,
|
|
&dev_attr_pimpampom.attr,
|
|
+ &dev_attr_dev_busid.attr,
|
|
NULL,
|
|
};
|
|
ATTRIBUTE_GROUPS(io_subchannel_type);
|
|
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
|
|
index ef738b42a0926..c00a288a4eca2 100644
|
|
--- a/drivers/s390/crypto/ap_bus.c
|
|
+++ b/drivers/s390/crypto/ap_bus.c
|
|
@@ -114,22 +114,13 @@ static struct bus_type ap_bus_type;
|
|
/* Adapter interrupt definitions */
|
|
static void ap_interrupt_handler(struct airq_struct *airq, bool floating);
|
|
|
|
-static int ap_airq_flag;
|
|
+static bool ap_irq_flag;
|
|
|
|
static struct airq_struct ap_airq = {
|
|
.handler = ap_interrupt_handler,
|
|
.isc = AP_ISC,
|
|
};
|
|
|
|
-/**
|
|
- * ap_using_interrupts() - Returns non-zero if interrupt support is
|
|
- * available.
|
|
- */
|
|
-static inline int ap_using_interrupts(void)
|
|
-{
|
|
- return ap_airq_flag;
|
|
-}
|
|
-
|
|
/**
|
|
* ap_airq_ptr() - Get the address of the adapter interrupt indicator
|
|
*
|
|
@@ -139,7 +130,7 @@ static inline int ap_using_interrupts(void)
|
|
*/
|
|
void *ap_airq_ptr(void)
|
|
{
|
|
- if (ap_using_interrupts())
|
|
+ if (ap_irq_flag)
|
|
return ap_airq.lsi_ptr;
|
|
return NULL;
|
|
}
|
|
@@ -369,7 +360,7 @@ void ap_wait(enum ap_sm_wait wait)
|
|
switch (wait) {
|
|
case AP_SM_WAIT_AGAIN:
|
|
case AP_SM_WAIT_INTERRUPT:
|
|
- if (ap_using_interrupts())
|
|
+ if (ap_irq_flag)
|
|
break;
|
|
if (ap_poll_kthread) {
|
|
wake_up(&ap_poll_wait);
|
|
@@ -444,7 +435,7 @@ static void ap_tasklet_fn(unsigned long dummy)
|
|
* be received. Doing it in the beginning of the tasklet is therefor
|
|
* important that no requests on any AP get lost.
|
|
*/
|
|
- if (ap_using_interrupts())
|
|
+ if (ap_irq_flag)
|
|
xchg(ap_airq.lsi_ptr, 0);
|
|
|
|
spin_lock_bh(&ap_queues_lock);
|
|
@@ -514,7 +505,7 @@ static int ap_poll_thread_start(void)
|
|
{
|
|
int rc;
|
|
|
|
- if (ap_using_interrupts() || ap_poll_kthread)
|
|
+ if (ap_irq_flag || ap_poll_kthread)
|
|
return 0;
|
|
mutex_lock(&ap_poll_thread_mutex);
|
|
ap_poll_kthread = kthread_run(ap_poll_thread, NULL, "appoll");
|
|
@@ -1014,7 +1005,7 @@ static BUS_ATTR_RO(ap_adapter_mask);
|
|
static ssize_t ap_interrupts_show(struct bus_type *bus, char *buf)
|
|
{
|
|
return scnprintf(buf, PAGE_SIZE, "%d\n",
|
|
- ap_using_interrupts() ? 1 : 0);
|
|
+ ap_irq_flag ? 1 : 0);
|
|
}
|
|
|
|
static BUS_ATTR_RO(ap_interrupts);
|
|
@@ -1687,7 +1678,7 @@ static int __init ap_module_init(void)
|
|
/* enable interrupts if available */
|
|
if (ap_interrupts_available()) {
|
|
rc = register_adapter_interrupt(&ap_airq);
|
|
- ap_airq_flag = (rc == 0);
|
|
+ ap_irq_flag = (rc == 0);
|
|
}
|
|
|
|
/* Create /sys/bus/ap. */
|
|
@@ -1737,7 +1728,7 @@ out_bus:
|
|
bus_remove_file(&ap_bus_type, ap_bus_attrs[i]);
|
|
bus_unregister(&ap_bus_type);
|
|
out:
|
|
- if (ap_using_interrupts())
|
|
+ if (ap_irq_flag)
|
|
unregister_adapter_interrupt(&ap_airq);
|
|
kfree(ap_qci_info);
|
|
return rc;
|
|
diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h
|
|
index 5029b80132aae..ccdbd95cab706 100644
|
|
--- a/drivers/s390/crypto/ap_bus.h
|
|
+++ b/drivers/s390/crypto/ap_bus.h
|
|
@@ -77,12 +77,6 @@ static inline int ap_test_bit(unsigned int *ptr, unsigned int nr)
|
|
#define AP_FUNC_EP11 5
|
|
#define AP_FUNC_APXA 6
|
|
|
|
-/*
|
|
- * AP interrupt states
|
|
- */
|
|
-#define AP_INTR_DISABLED 0 /* AP interrupt disabled */
|
|
-#define AP_INTR_ENABLED 1 /* AP interrupt enabled */
|
|
-
|
|
/*
|
|
* AP queue state machine states
|
|
*/
|
|
@@ -109,7 +103,7 @@ enum ap_sm_event {
|
|
* AP queue state wait behaviour
|
|
*/
|
|
enum ap_sm_wait {
|
|
- AP_SM_WAIT_AGAIN, /* retry immediately */
|
|
+ AP_SM_WAIT_AGAIN = 0, /* retry immediately */
|
|
AP_SM_WAIT_TIMEOUT, /* wait for timeout */
|
|
AP_SM_WAIT_INTERRUPT, /* wait for thin interrupt (if available) */
|
|
AP_SM_WAIT_NONE, /* no wait */
|
|
@@ -182,7 +176,7 @@ struct ap_queue {
|
|
enum ap_dev_state dev_state; /* queue device state */
|
|
bool config; /* configured state */
|
|
ap_qid_t qid; /* AP queue id. */
|
|
- int interrupt; /* indicate if interrupts are enabled */
|
|
+ bool interrupt; /* indicate if interrupts are enabled */
|
|
int queue_count; /* # messages currently on AP queue. */
|
|
int pendingq_count; /* # requests on pendingq list. */
|
|
int requestq_count; /* # requests on requestq list. */
|
|
diff --git a/drivers/s390/crypto/ap_queue.c b/drivers/s390/crypto/ap_queue.c
|
|
index 337353c9655ed..639f8d25679c3 100644
|
|
--- a/drivers/s390/crypto/ap_queue.c
|
|
+++ b/drivers/s390/crypto/ap_queue.c
|
|
@@ -19,7 +19,7 @@
|
|
static void __ap_flush_queue(struct ap_queue *aq);
|
|
|
|
/**
|
|
- * ap_queue_enable_interruption(): Enable interruption on an AP queue.
|
|
+ * ap_queue_enable_irq(): Enable interrupt support on this AP queue.
|
|
* @qid: The AP queue number
|
|
* @ind: the notification indicator byte
|
|
*
|
|
@@ -27,7 +27,7 @@ static void __ap_flush_queue(struct ap_queue *aq);
|
|
* value it waits a while and tests the AP queue if interrupts
|
|
* have been switched on using ap_test_queue().
|
|
*/
|
|
-static int ap_queue_enable_interruption(struct ap_queue *aq, void *ind)
|
|
+static int ap_queue_enable_irq(struct ap_queue *aq, void *ind)
|
|
{
|
|
struct ap_queue_status status;
|
|
struct ap_qirq_ctrl qirqctrl = { 0 };
|
|
@@ -198,7 +198,8 @@ static enum ap_sm_wait ap_sm_read(struct ap_queue *aq)
|
|
return AP_SM_WAIT_NONE;
|
|
case AP_RESPONSE_NO_PENDING_REPLY:
|
|
if (aq->queue_count > 0)
|
|
- return AP_SM_WAIT_INTERRUPT;
|
|
+ return aq->interrupt ?
|
|
+ AP_SM_WAIT_INTERRUPT : AP_SM_WAIT_TIMEOUT;
|
|
aq->sm_state = AP_SM_STATE_IDLE;
|
|
return AP_SM_WAIT_NONE;
|
|
default:
|
|
@@ -252,7 +253,8 @@ static enum ap_sm_wait ap_sm_write(struct ap_queue *aq)
|
|
fallthrough;
|
|
case AP_RESPONSE_Q_FULL:
|
|
aq->sm_state = AP_SM_STATE_QUEUE_FULL;
|
|
- return AP_SM_WAIT_INTERRUPT;
|
|
+ return aq->interrupt ?
|
|
+ AP_SM_WAIT_INTERRUPT : AP_SM_WAIT_TIMEOUT;
|
|
case AP_RESPONSE_RESET_IN_PROGRESS:
|
|
aq->sm_state = AP_SM_STATE_RESET_WAIT;
|
|
return AP_SM_WAIT_TIMEOUT;
|
|
@@ -302,7 +304,7 @@ static enum ap_sm_wait ap_sm_reset(struct ap_queue *aq)
|
|
case AP_RESPONSE_NORMAL:
|
|
case AP_RESPONSE_RESET_IN_PROGRESS:
|
|
aq->sm_state = AP_SM_STATE_RESET_WAIT;
|
|
- aq->interrupt = AP_INTR_DISABLED;
|
|
+ aq->interrupt = false;
|
|
return AP_SM_WAIT_TIMEOUT;
|
|
default:
|
|
aq->dev_state = AP_DEV_STATE_ERROR;
|
|
@@ -335,7 +337,7 @@ static enum ap_sm_wait ap_sm_reset_wait(struct ap_queue *aq)
|
|
switch (status.response_code) {
|
|
case AP_RESPONSE_NORMAL:
|
|
lsi_ptr = ap_airq_ptr();
|
|
- if (lsi_ptr && ap_queue_enable_interruption(aq, lsi_ptr) == 0)
|
|
+ if (lsi_ptr && ap_queue_enable_irq(aq, lsi_ptr) == 0)
|
|
aq->sm_state = AP_SM_STATE_SETIRQ_WAIT;
|
|
else
|
|
aq->sm_state = (aq->queue_count > 0) ?
|
|
@@ -376,7 +378,7 @@ static enum ap_sm_wait ap_sm_setirq_wait(struct ap_queue *aq)
|
|
|
|
if (status.irq_enabled == 1) {
|
|
/* Irqs are now enabled */
|
|
- aq->interrupt = AP_INTR_ENABLED;
|
|
+ aq->interrupt = true;
|
|
aq->sm_state = (aq->queue_count > 0) ?
|
|
AP_SM_STATE_WORKING : AP_SM_STATE_IDLE;
|
|
}
|
|
@@ -566,7 +568,7 @@ static ssize_t interrupt_show(struct device *dev,
|
|
spin_lock_bh(&aq->lock);
|
|
if (aq->sm_state == AP_SM_STATE_SETIRQ_WAIT)
|
|
rc = scnprintf(buf, PAGE_SIZE, "Enable Interrupt pending.\n");
|
|
- else if (aq->interrupt == AP_INTR_ENABLED)
|
|
+ else if (aq->interrupt)
|
|
rc = scnprintf(buf, PAGE_SIZE, "Interrupts enabled.\n");
|
|
else
|
|
rc = scnprintf(buf, PAGE_SIZE, "Interrupts disabled.\n");
|
|
@@ -747,7 +749,7 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type)
|
|
aq->ap_dev.device.type = &ap_queue_type;
|
|
aq->ap_dev.device_type = device_type;
|
|
aq->qid = qid;
|
|
- aq->interrupt = AP_INTR_DISABLED;
|
|
+ aq->interrupt = false;
|
|
spin_lock_init(&aq->lock);
|
|
INIT_LIST_HEAD(&aq->pendingq);
|
|
INIT_LIST_HEAD(&aq->requestq);
|
|
diff --git a/drivers/s390/crypto/zcrypt_ccamisc.c b/drivers/s390/crypto/zcrypt_ccamisc.c
|
|
index b1046811450fb..ffab935ddd95b 100644
|
|
--- a/drivers/s390/crypto/zcrypt_ccamisc.c
|
|
+++ b/drivers/s390/crypto/zcrypt_ccamisc.c
|
|
@@ -1715,10 +1715,10 @@ static int fetch_cca_info(u16 cardnr, u16 domain, struct cca_info *ci)
|
|
rlen = vlen = PAGE_SIZE/2;
|
|
rc = cca_query_crypto_facility(cardnr, domain, "STATICSB",
|
|
rarray, &rlen, varray, &vlen);
|
|
- if (rc == 0 && rlen >= 10*8 && vlen >= 240) {
|
|
- ci->new_apka_mk_state = (char) rarray[7*8];
|
|
- ci->cur_apka_mk_state = (char) rarray[8*8];
|
|
- ci->old_apka_mk_state = (char) rarray[9*8];
|
|
+ if (rc == 0 && rlen >= 13*8 && vlen >= 240) {
|
|
+ ci->new_apka_mk_state = (char) rarray[10*8];
|
|
+ ci->cur_apka_mk_state = (char) rarray[11*8];
|
|
+ ci->old_apka_mk_state = (char) rarray[12*8];
|
|
if (ci->old_apka_mk_state == '2')
|
|
memcpy(&ci->old_apka_mkvp, varray + 208, 8);
|
|
if (ci->cur_apka_mk_state == '2')
|
|
diff --git a/drivers/soc/qcom/rpmhpd.c b/drivers/soc/qcom/rpmhpd.c
|
|
index e72426221a69c..c8b584d0c8fb4 100644
|
|
--- a/drivers/soc/qcom/rpmhpd.c
|
|
+++ b/drivers/soc/qcom/rpmhpd.c
|
|
@@ -310,12 +310,11 @@ static int rpmhpd_power_on(struct generic_pm_domain *domain)
|
|
static int rpmhpd_power_off(struct generic_pm_domain *domain)
|
|
{
|
|
struct rpmhpd *pd = domain_to_rpmhpd(domain);
|
|
- int ret = 0;
|
|
+ int ret;
|
|
|
|
mutex_lock(&rpmhpd_lock);
|
|
|
|
- ret = rpmhpd_aggregate_corner(pd, pd->level[0]);
|
|
-
|
|
+ ret = rpmhpd_aggregate_corner(pd, 0);
|
|
if (!ret)
|
|
pd->enabled = false;
|
|
|
|
diff --git a/drivers/soc/qcom/smsm.c b/drivers/soc/qcom/smsm.c
|
|
index 70c3c90b997c9..c428d0f78816e 100644
|
|
--- a/drivers/soc/qcom/smsm.c
|
|
+++ b/drivers/soc/qcom/smsm.c
|
|
@@ -109,7 +109,7 @@ struct smsm_entry {
|
|
DECLARE_BITMAP(irq_enabled, 32);
|
|
DECLARE_BITMAP(irq_rising, 32);
|
|
DECLARE_BITMAP(irq_falling, 32);
|
|
- u32 last_value;
|
|
+ unsigned long last_value;
|
|
|
|
u32 *remote_state;
|
|
u32 *subscription;
|
|
@@ -204,8 +204,7 @@ static irqreturn_t smsm_intr(int irq, void *data)
|
|
u32 val;
|
|
|
|
val = readl(entry->remote_state);
|
|
- changed = val ^ entry->last_value;
|
|
- entry->last_value = val;
|
|
+ changed = val ^ xchg(&entry->last_value, val);
|
|
|
|
for_each_set_bit(i, entry->irq_enabled, 32) {
|
|
if (!(changed & BIT(i)))
|
|
@@ -266,6 +265,12 @@ static void smsm_unmask_irq(struct irq_data *irqd)
|
|
struct qcom_smsm *smsm = entry->smsm;
|
|
u32 val;
|
|
|
|
+ /* Make sure our last cached state is up-to-date */
|
|
+ if (readl(entry->remote_state) & BIT(irq))
|
|
+ set_bit(irq, &entry->last_value);
|
|
+ else
|
|
+ clear_bit(irq, &entry->last_value);
|
|
+
|
|
set_bit(irq, entry->irq_enabled);
|
|
|
|
if (entry->subscription) {
|
|
diff --git a/drivers/soc/rockchip/Kconfig b/drivers/soc/rockchip/Kconfig
|
|
index 2c13bf4dd5dbe..25eb2c1e31bb2 100644
|
|
--- a/drivers/soc/rockchip/Kconfig
|
|
+++ b/drivers/soc/rockchip/Kconfig
|
|
@@ -6,8 +6,8 @@ if ARCH_ROCKCHIP || COMPILE_TEST
|
|
#
|
|
|
|
config ROCKCHIP_GRF
|
|
- bool
|
|
- default y
|
|
+ bool "Rockchip General Register Files support" if COMPILE_TEST
|
|
+ default y if ARCH_ROCKCHIP
|
|
help
|
|
The General Register Files are a central component providing
|
|
special additional settings registers for a lot of soc-components.
|
|
diff --git a/drivers/spi/spi-coldfire-qspi.c b/drivers/spi/spi-coldfire-qspi.c
|
|
index 8996115ce736a..263ce90473277 100644
|
|
--- a/drivers/spi/spi-coldfire-qspi.c
|
|
+++ b/drivers/spi/spi-coldfire-qspi.c
|
|
@@ -444,7 +444,7 @@ static int mcfqspi_remove(struct platform_device *pdev)
|
|
mcfqspi_wr_qmr(mcfqspi, MCFQSPI_QMR_MSTR);
|
|
|
|
mcfqspi_cs_teardown(mcfqspi);
|
|
- clk_disable(mcfqspi->clk);
|
|
+ clk_disable_unprepare(mcfqspi->clk);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c
|
|
index 7453a1dbbc061..fda73221f3b78 100644
|
|
--- a/drivers/spi/spi-davinci.c
|
|
+++ b/drivers/spi/spi-davinci.c
|
|
@@ -213,12 +213,6 @@ static void davinci_spi_chipselect(struct spi_device *spi, int value)
|
|
* line for the controller
|
|
*/
|
|
if (spi->cs_gpiod) {
|
|
- /*
|
|
- * FIXME: is this code ever executed? This host does not
|
|
- * set SPI_MASTER_GPIO_SS so this chipselect callback should
|
|
- * not get called from the SPI core when we are using
|
|
- * GPIOs for chip select.
|
|
- */
|
|
if (value == BITBANG_CS_ACTIVE)
|
|
gpiod_set_value(spi->cs_gpiod, 1);
|
|
else
|
|
@@ -950,7 +944,7 @@ static int davinci_spi_probe(struct platform_device *pdev)
|
|
master->bus_num = pdev->id;
|
|
master->num_chipselect = pdata->num_chipselect;
|
|
master->bits_per_word_mask = SPI_BPW_RANGE_MASK(2, 16);
|
|
- master->flags = SPI_MASTER_MUST_RX;
|
|
+ master->flags = SPI_MASTER_MUST_RX | SPI_MASTER_GPIO_SS;
|
|
master->setup = davinci_spi_setup;
|
|
master->cleanup = davinci_spi_cleanup;
|
|
master->can_dma = davinci_spi_can_dma;
|
|
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
|
|
index fb45e6af66381..fd004c9db9dc0 100644
|
|
--- a/drivers/spi/spi-fsl-dspi.c
|
|
+++ b/drivers/spi/spi-fsl-dspi.c
|
|
@@ -530,6 +530,7 @@ static int dspi_request_dma(struct fsl_dspi *dspi, phys_addr_t phy_addr)
|
|
goto err_rx_dma_buf;
|
|
}
|
|
|
|
+ memset(&cfg, 0, sizeof(cfg));
|
|
cfg.src_addr = phy_addr + SPI_POPR;
|
|
cfg.dst_addr = phy_addr + SPI_PUSHR;
|
|
cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
|
diff --git a/drivers/spi/spi-pic32.c b/drivers/spi/spi-pic32.c
|
|
index 104bde153efd2..5eb7b61bbb4d8 100644
|
|
--- a/drivers/spi/spi-pic32.c
|
|
+++ b/drivers/spi/spi-pic32.c
|
|
@@ -361,6 +361,7 @@ static int pic32_spi_dma_config(struct pic32_spi *pic32s, u32 dma_width)
|
|
struct dma_slave_config cfg;
|
|
int ret;
|
|
|
|
+ memset(&cfg, 0, sizeof(cfg));
|
|
cfg.device_fc = true;
|
|
cfg.src_addr = pic32s->dma_base + buf_offset;
|
|
cfg.dst_addr = pic32s->dma_base + buf_offset;
|
|
diff --git a/drivers/spi/spi-sprd-adi.c b/drivers/spi/spi-sprd-adi.c
|
|
index 392ec5cfa3d61..307c079b938dc 100644
|
|
--- a/drivers/spi/spi-sprd-adi.c
|
|
+++ b/drivers/spi/spi-sprd-adi.c
|
|
@@ -103,7 +103,7 @@
|
|
#define HWRST_STATUS_WATCHDOG 0xf0
|
|
|
|
/* Use default timeout 50 ms that converts to watchdog values */
|
|
-#define WDG_LOAD_VAL ((50 * 1000) / 32768)
|
|
+#define WDG_LOAD_VAL ((50 * 32768) / 1000)
|
|
#define WDG_LOAD_MASK GENMASK(15, 0)
|
|
#define WDG_UNLOCK_KEY 0xe551
|
|
|
|
diff --git a/drivers/spi/spi-zynq-qspi.c b/drivers/spi/spi-zynq-qspi.c
|
|
index 68193db8b2e3c..b635835729d66 100644
|
|
--- a/drivers/spi/spi-zynq-qspi.c
|
|
+++ b/drivers/spi/spi-zynq-qspi.c
|
|
@@ -545,7 +545,7 @@ static int zynq_qspi_exec_mem_op(struct spi_mem *mem,
|
|
zynq_qspi_write_op(xqspi, ZYNQ_QSPI_FIFO_DEPTH, true);
|
|
zynq_qspi_write(xqspi, ZYNQ_QSPI_IEN_OFFSET,
|
|
ZYNQ_QSPI_IXR_RXTX_MASK);
|
|
- if (!wait_for_completion_interruptible_timeout(&xqspi->data_completion,
|
|
+ if (!wait_for_completion_timeout(&xqspi->data_completion,
|
|
msecs_to_jiffies(1000)))
|
|
err = -ETIMEDOUT;
|
|
}
|
|
@@ -563,7 +563,7 @@ static int zynq_qspi_exec_mem_op(struct spi_mem *mem,
|
|
zynq_qspi_write_op(xqspi, ZYNQ_QSPI_FIFO_DEPTH, true);
|
|
zynq_qspi_write(xqspi, ZYNQ_QSPI_IEN_OFFSET,
|
|
ZYNQ_QSPI_IXR_RXTX_MASK);
|
|
- if (!wait_for_completion_interruptible_timeout(&xqspi->data_completion,
|
|
+ if (!wait_for_completion_timeout(&xqspi->data_completion,
|
|
msecs_to_jiffies(1000)))
|
|
err = -ETIMEDOUT;
|
|
}
|
|
@@ -579,7 +579,7 @@ static int zynq_qspi_exec_mem_op(struct spi_mem *mem,
|
|
zynq_qspi_write_op(xqspi, ZYNQ_QSPI_FIFO_DEPTH, true);
|
|
zynq_qspi_write(xqspi, ZYNQ_QSPI_IEN_OFFSET,
|
|
ZYNQ_QSPI_IXR_RXTX_MASK);
|
|
- if (!wait_for_completion_interruptible_timeout(&xqspi->data_completion,
|
|
+ if (!wait_for_completion_timeout(&xqspi->data_completion,
|
|
msecs_to_jiffies(1000)))
|
|
err = -ETIMEDOUT;
|
|
|
|
@@ -603,7 +603,7 @@ static int zynq_qspi_exec_mem_op(struct spi_mem *mem,
|
|
zynq_qspi_write_op(xqspi, ZYNQ_QSPI_FIFO_DEPTH, true);
|
|
zynq_qspi_write(xqspi, ZYNQ_QSPI_IEN_OFFSET,
|
|
ZYNQ_QSPI_IXR_RXTX_MASK);
|
|
- if (!wait_for_completion_interruptible_timeout(&xqspi->data_completion,
|
|
+ if (!wait_for_completion_timeout(&xqspi->data_completion,
|
|
msecs_to_jiffies(1000)))
|
|
err = -ETIMEDOUT;
|
|
}
|
|
diff --git a/drivers/staging/clocking-wizard/Kconfig b/drivers/staging/clocking-wizard/Kconfig
|
|
index 69cf51445f082..2324b5d737886 100644
|
|
--- a/drivers/staging/clocking-wizard/Kconfig
|
|
+++ b/drivers/staging/clocking-wizard/Kconfig
|
|
@@ -5,6 +5,6 @@
|
|
|
|
config COMMON_CLK_XLNX_CLKWZRD
|
|
tristate "Xilinx Clocking Wizard"
|
|
- depends on COMMON_CLK && OF && IOMEM
|
|
+ depends on COMMON_CLK && OF && HAS_IOMEM
|
|
help
|
|
Support for the Xilinx Clocking Wizard IP core clock generator.
|
|
diff --git a/drivers/staging/media/atomisp/i2c/atomisp-mt9m114.c b/drivers/staging/media/atomisp/i2c/atomisp-mt9m114.c
|
|
index f5de81132177d..77293579a1348 100644
|
|
--- a/drivers/staging/media/atomisp/i2c/atomisp-mt9m114.c
|
|
+++ b/drivers/staging/media/atomisp/i2c/atomisp-mt9m114.c
|
|
@@ -1533,16 +1533,19 @@ static struct v4l2_ctrl_config mt9m114_controls[] = {
|
|
static int mt9m114_detect(struct mt9m114_device *dev, struct i2c_client *client)
|
|
{
|
|
struct i2c_adapter *adapter = client->adapter;
|
|
- u32 retvalue;
|
|
+ u32 model;
|
|
+ int ret;
|
|
|
|
if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
|
|
dev_err(&client->dev, "%s: i2c error", __func__);
|
|
return -ENODEV;
|
|
}
|
|
- mt9m114_read_reg(client, MISENSOR_16BIT, (u32)MT9M114_PID, &retvalue);
|
|
- dev->real_model_id = retvalue;
|
|
+ ret = mt9m114_read_reg(client, MISENSOR_16BIT, MT9M114_PID, &model);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ dev->real_model_id = model;
|
|
|
|
- if (retvalue != MT9M114_MOD_ID) {
|
|
+ if (model != MT9M114_MOD_ID) {
|
|
dev_err(&client->dev, "%s: failed: client->addr = %x\n",
|
|
__func__, client->addr);
|
|
return -ENODEV;
|
|
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
|
|
index 2e74c88808db6..a70911a227a84 100644
|
|
--- a/drivers/tty/serial/fsl_lpuart.c
|
|
+++ b/drivers/tty/serial/fsl_lpuart.c
|
|
@@ -2597,7 +2597,7 @@ static int lpuart_probe(struct platform_device *pdev)
|
|
return PTR_ERR(sport->port.membase);
|
|
|
|
sport->port.membase += sdata->reg_off;
|
|
- sport->port.mapbase = res->start;
|
|
+ sport->port.mapbase = res->start + sdata->reg_off;
|
|
sport->port.dev = &pdev->dev;
|
|
sport->port.type = PORT_LPUART;
|
|
sport->devtype = sdata->devtype;
|
|
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
|
|
index bc5314092aa4e..669aef77a0bd0 100644
|
|
--- a/drivers/tty/tty_io.c
|
|
+++ b/drivers/tty/tty_io.c
|
|
@@ -2257,8 +2257,6 @@ static int tty_fasync(int fd, struct file *filp, int on)
|
|
* Locking:
|
|
* Called functions take tty_ldiscs_lock
|
|
* current->signal->tty check is safe without locks
|
|
- *
|
|
- * FIXME: may race normal receive processing
|
|
*/
|
|
|
|
static int tiocsti(struct tty_struct *tty, char __user *p)
|
|
@@ -2274,8 +2272,10 @@ static int tiocsti(struct tty_struct *tty, char __user *p)
|
|
ld = tty_ldisc_ref_wait(tty);
|
|
if (!ld)
|
|
return -EIO;
|
|
+ tty_buffer_lock_exclusive(tty->port);
|
|
if (ld->ops->receive_buf)
|
|
ld->ops->receive_buf(tty, &ch, &mbz, 1);
|
|
+ tty_buffer_unlock_exclusive(tty->port);
|
|
tty_ldisc_deref(ld);
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/usb/dwc3/dwc3-meson-g12a.c b/drivers/usb/dwc3/dwc3-meson-g12a.c
|
|
index ffe301d6ea359..d0f9b7c296b0d 100644
|
|
--- a/drivers/usb/dwc3/dwc3-meson-g12a.c
|
|
+++ b/drivers/usb/dwc3/dwc3-meson-g12a.c
|
|
@@ -598,6 +598,8 @@ static int dwc3_meson_g12a_otg_init(struct platform_device *pdev,
|
|
USB_R5_ID_DIG_IRQ, 0);
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
+ if (irq < 0)
|
|
+ return irq;
|
|
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
|
dwc3_meson_g12a_irq_thread,
|
|
IRQF_ONESHOT, pdev->name, priv);
|
|
diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c
|
|
index 8bd077fb1190f..2a29e2f681fe6 100644
|
|
--- a/drivers/usb/dwc3/dwc3-qcom.c
|
|
+++ b/drivers/usb/dwc3/dwc3-qcom.c
|
|
@@ -610,6 +610,10 @@ static int dwc3_qcom_acpi_register_core(struct platform_device *pdev)
|
|
qcom->acpi_pdata->dwc3_core_base_size;
|
|
|
|
irq = platform_get_irq(pdev_irq, 0);
|
|
+ if (irq < 0) {
|
|
+ ret = irq;
|
|
+ goto out;
|
|
+ }
|
|
child_res[1].flags = IORESOURCE_IRQ;
|
|
child_res[1].start = child_res[1].end = irq;
|
|
|
|
diff --git a/drivers/usb/gadget/udc/at91_udc.c b/drivers/usb/gadget/udc/at91_udc.c
|
|
index eede5cedacb4a..d9ad9adf7348f 100644
|
|
--- a/drivers/usb/gadget/udc/at91_udc.c
|
|
+++ b/drivers/usb/gadget/udc/at91_udc.c
|
|
@@ -1876,7 +1876,9 @@ static int at91udc_probe(struct platform_device *pdev)
|
|
clk_disable(udc->iclk);
|
|
|
|
/* request UDC and maybe VBUS irqs */
|
|
- udc->udp_irq = platform_get_irq(pdev, 0);
|
|
+ udc->udp_irq = retval = platform_get_irq(pdev, 0);
|
|
+ if (retval < 0)
|
|
+ goto err_unprepare_iclk;
|
|
retval = devm_request_irq(dev, udc->udp_irq, at91_udc_irq, 0,
|
|
driver_name, udc);
|
|
if (retval) {
|
|
diff --git a/drivers/usb/gadget/udc/bdc/bdc_core.c b/drivers/usb/gadget/udc/bdc/bdc_core.c
|
|
index 0bef6b3f049b9..fa1a3908ec3bb 100644
|
|
--- a/drivers/usb/gadget/udc/bdc/bdc_core.c
|
|
+++ b/drivers/usb/gadget/udc/bdc/bdc_core.c
|
|
@@ -488,27 +488,14 @@ static int bdc_probe(struct platform_device *pdev)
|
|
int irq;
|
|
u32 temp;
|
|
struct device *dev = &pdev->dev;
|
|
- struct clk *clk;
|
|
int phy_num;
|
|
|
|
dev_dbg(dev, "%s()\n", __func__);
|
|
|
|
- clk = devm_clk_get_optional(dev, "sw_usbd");
|
|
- if (IS_ERR(clk))
|
|
- return PTR_ERR(clk);
|
|
-
|
|
- ret = clk_prepare_enable(clk);
|
|
- if (ret) {
|
|
- dev_err(dev, "could not enable clock\n");
|
|
- return ret;
|
|
- }
|
|
-
|
|
bdc = devm_kzalloc(dev, sizeof(*bdc), GFP_KERNEL);
|
|
if (!bdc)
|
|
return -ENOMEM;
|
|
|
|
- bdc->clk = clk;
|
|
-
|
|
bdc->regs = devm_platform_ioremap_resource(pdev, 0);
|
|
if (IS_ERR(bdc->regs))
|
|
return PTR_ERR(bdc->regs);
|
|
@@ -545,10 +532,20 @@ static int bdc_probe(struct platform_device *pdev)
|
|
}
|
|
}
|
|
|
|
+ bdc->clk = devm_clk_get_optional(dev, "sw_usbd");
|
|
+ if (IS_ERR(bdc->clk))
|
|
+ return PTR_ERR(bdc->clk);
|
|
+
|
|
+ ret = clk_prepare_enable(bdc->clk);
|
|
+ if (ret) {
|
|
+ dev_err(dev, "could not enable clock\n");
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
ret = bdc_phy_init(bdc);
|
|
if (ret) {
|
|
dev_err(bdc->dev, "BDC phy init failure:%d\n", ret);
|
|
- return ret;
|
|
+ goto disable_clk;
|
|
}
|
|
|
|
temp = bdc_readl(bdc->regs, BDC_BDCCAP1);
|
|
@@ -560,7 +557,8 @@ static int bdc_probe(struct platform_device *pdev)
|
|
if (ret) {
|
|
dev_err(dev,
|
|
"No suitable DMA config available, abort\n");
|
|
- return -ENOTSUPP;
|
|
+ ret = -ENOTSUPP;
|
|
+ goto phycleanup;
|
|
}
|
|
dev_dbg(dev, "Using 32-bit address\n");
|
|
}
|
|
@@ -580,6 +578,8 @@ cleanup:
|
|
bdc_hw_exit(bdc);
|
|
phycleanup:
|
|
bdc_phy_exit(bdc);
|
|
+disable_clk:
|
|
+ clk_disable_unprepare(bdc->clk);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/usb/gadget/udc/mv_u3d_core.c b/drivers/usb/gadget/udc/mv_u3d_core.c
|
|
index 5486f5a708681..0db97fecf99e8 100644
|
|
--- a/drivers/usb/gadget/udc/mv_u3d_core.c
|
|
+++ b/drivers/usb/gadget/udc/mv_u3d_core.c
|
|
@@ -1921,14 +1921,6 @@ static int mv_u3d_probe(struct platform_device *dev)
|
|
goto err_get_irq;
|
|
}
|
|
u3d->irq = r->start;
|
|
- if (request_irq(u3d->irq, mv_u3d_irq,
|
|
- IRQF_SHARED, driver_name, u3d)) {
|
|
- u3d->irq = 0;
|
|
- dev_err(&dev->dev, "Request irq %d for u3d failed\n",
|
|
- u3d->irq);
|
|
- retval = -ENODEV;
|
|
- goto err_request_irq;
|
|
- }
|
|
|
|
/* initialize gadget structure */
|
|
u3d->gadget.ops = &mv_u3d_ops; /* usb_gadget_ops */
|
|
@@ -1941,6 +1933,15 @@ static int mv_u3d_probe(struct platform_device *dev)
|
|
|
|
mv_u3d_eps_init(u3d);
|
|
|
|
+ if (request_irq(u3d->irq, mv_u3d_irq,
|
|
+ IRQF_SHARED, driver_name, u3d)) {
|
|
+ u3d->irq = 0;
|
|
+ dev_err(&dev->dev, "Request irq %d for u3d failed\n",
|
|
+ u3d->irq);
|
|
+ retval = -ENODEV;
|
|
+ goto err_request_irq;
|
|
+ }
|
|
+
|
|
/* external vbus detection */
|
|
if (u3d->vbus) {
|
|
u3d->clock_gating = 1;
|
|
@@ -1964,8 +1965,8 @@ static int mv_u3d_probe(struct platform_device *dev)
|
|
|
|
err_unregister:
|
|
free_irq(u3d->irq, u3d);
|
|
-err_request_irq:
|
|
err_get_irq:
|
|
+err_request_irq:
|
|
kfree(u3d->status_req);
|
|
err_alloc_status_req:
|
|
kfree(u3d->eps);
|
|
diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c
|
|
index f1b35a39d1ba8..57d417a7c3e0a 100644
|
|
--- a/drivers/usb/gadget/udc/renesas_usb3.c
|
|
+++ b/drivers/usb/gadget/udc/renesas_usb3.c
|
|
@@ -2707,10 +2707,15 @@ static const struct renesas_usb3_priv renesas_usb3_priv_r8a77990 = {
|
|
|
|
static const struct of_device_id usb3_of_match[] = {
|
|
{
|
|
+ .compatible = "renesas,r8a774c0-usb3-peri",
|
|
+ .data = &renesas_usb3_priv_r8a77990,
|
|
+ }, {
|
|
.compatible = "renesas,r8a7795-usb3-peri",
|
|
.data = &renesas_usb3_priv_gen3,
|
|
- },
|
|
- {
|
|
+ }, {
|
|
+ .compatible = "renesas,r8a77990-usb3-peri",
|
|
+ .data = &renesas_usb3_priv_r8a77990,
|
|
+ }, {
|
|
.compatible = "renesas,rcar-gen3-usb3-peri",
|
|
.data = &renesas_usb3_priv_gen3,
|
|
},
|
|
@@ -2719,18 +2724,10 @@ static const struct of_device_id usb3_of_match[] = {
|
|
MODULE_DEVICE_TABLE(of, usb3_of_match);
|
|
|
|
static const struct soc_device_attribute renesas_usb3_quirks_match[] = {
|
|
- {
|
|
- .soc_id = "r8a774c0",
|
|
- .data = &renesas_usb3_priv_r8a77990,
|
|
- },
|
|
{
|
|
.soc_id = "r8a7795", .revision = "ES1.*",
|
|
.data = &renesas_usb3_priv_r8a7795_es1,
|
|
},
|
|
- {
|
|
- .soc_id = "r8a77990",
|
|
- .data = &renesas_usb3_priv_r8a77990,
|
|
- },
|
|
{ /* sentinel */ },
|
|
};
|
|
|
|
diff --git a/drivers/usb/gadget/udc/s3c2410_udc.c b/drivers/usb/gadget/udc/s3c2410_udc.c
|
|
index b154b62abefa1..82c4f3fb2daec 100644
|
|
--- a/drivers/usb/gadget/udc/s3c2410_udc.c
|
|
+++ b/drivers/usb/gadget/udc/s3c2410_udc.c
|
|
@@ -1784,6 +1784,10 @@ static int s3c2410_udc_probe(struct platform_device *pdev)
|
|
s3c2410_udc_reinit(udc);
|
|
|
|
irq_usbd = platform_get_irq(pdev, 0);
|
|
+ if (irq_usbd < 0) {
|
|
+ retval = irq_usbd;
|
|
+ goto err_udc_clk;
|
|
+ }
|
|
|
|
/* irq setup after old hardware state is cleaned up */
|
|
retval = request_irq(irq_usbd, s3c2410_udc_irq,
|
|
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
|
|
index a319b1df3011c..3626758b3e2aa 100644
|
|
--- a/drivers/usb/host/ehci-orion.c
|
|
+++ b/drivers/usb/host/ehci-orion.c
|
|
@@ -264,8 +264,11 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)
|
|
* the clock does not exists.
|
|
*/
|
|
priv->clk = devm_clk_get(&pdev->dev, NULL);
|
|
- if (!IS_ERR(priv->clk))
|
|
- clk_prepare_enable(priv->clk);
|
|
+ if (!IS_ERR(priv->clk)) {
|
|
+ err = clk_prepare_enable(priv->clk);
|
|
+ if (err)
|
|
+ goto err_put_hcd;
|
|
+ }
|
|
|
|
priv->phy = devm_phy_optional_get(&pdev->dev, "usb");
|
|
if (IS_ERR(priv->phy)) {
|
|
@@ -311,6 +314,7 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)
|
|
err_dis_clk:
|
|
if (!IS_ERR(priv->clk))
|
|
clk_disable_unprepare(priv->clk);
|
|
+err_put_hcd:
|
|
usb_put_hcd(hcd);
|
|
err:
|
|
dev_err(&pdev->dev, "init %s fail, %d\n",
|
|
diff --git a/drivers/usb/host/ohci-tmio.c b/drivers/usb/host/ohci-tmio.c
|
|
index 7f857bad9e95b..08ec2ab0d95a5 100644
|
|
--- a/drivers/usb/host/ohci-tmio.c
|
|
+++ b/drivers/usb/host/ohci-tmio.c
|
|
@@ -202,6 +202,9 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev)
|
|
if (!cell)
|
|
return -EINVAL;
|
|
|
|
+ if (irq < 0)
|
|
+ return irq;
|
|
+
|
|
hcd = usb_create_hcd(&ohci_tmio_hc_driver, &dev->dev, dev_name(&dev->dev));
|
|
if (!hcd) {
|
|
ret = -ENOMEM;
|
|
diff --git a/drivers/usb/phy/phy-fsl-usb.c b/drivers/usb/phy/phy-fsl-usb.c
|
|
index f34c9437a182c..972704262b02b 100644
|
|
--- a/drivers/usb/phy/phy-fsl-usb.c
|
|
+++ b/drivers/usb/phy/phy-fsl-usb.c
|
|
@@ -873,6 +873,8 @@ int usb_otg_start(struct platform_device *pdev)
|
|
|
|
/* request irq */
|
|
p_otg->irq = platform_get_irq(pdev, 0);
|
|
+ if (p_otg->irq < 0)
|
|
+ return p_otg->irq;
|
|
status = request_irq(p_otg->irq, fsl_otg_isr,
|
|
IRQF_SHARED, driver_name, p_otg);
|
|
if (status) {
|
|
diff --git a/drivers/usb/phy/phy-tahvo.c b/drivers/usb/phy/phy-tahvo.c
|
|
index baebb1f5a9737..a3e043e3e4aae 100644
|
|
--- a/drivers/usb/phy/phy-tahvo.c
|
|
+++ b/drivers/usb/phy/phy-tahvo.c
|
|
@@ -393,7 +393,9 @@ static int tahvo_usb_probe(struct platform_device *pdev)
|
|
|
|
dev_set_drvdata(&pdev->dev, tu);
|
|
|
|
- tu->irq = platform_get_irq(pdev, 0);
|
|
+ tu->irq = ret = platform_get_irq(pdev, 0);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
ret = request_threaded_irq(tu->irq, NULL, tahvo_usb_vbus_interrupt,
|
|
IRQF_ONESHOT,
|
|
"tahvo-vbus", tu);
|
|
diff --git a/drivers/usb/phy/phy-twl6030-usb.c b/drivers/usb/phy/phy-twl6030-usb.c
|
|
index 8ba6c5a915570..ab3c38a7d8ac0 100644
|
|
--- a/drivers/usb/phy/phy-twl6030-usb.c
|
|
+++ b/drivers/usb/phy/phy-twl6030-usb.c
|
|
@@ -348,6 +348,11 @@ static int twl6030_usb_probe(struct platform_device *pdev)
|
|
twl->irq2 = platform_get_irq(pdev, 1);
|
|
twl->linkstat = MUSB_UNKNOWN;
|
|
|
|
+ if (twl->irq1 < 0)
|
|
+ return twl->irq1;
|
|
+ if (twl->irq2 < 0)
|
|
+ return twl->irq2;
|
|
+
|
|
twl->comparator.set_vbus = twl6030_set_vbus;
|
|
twl->comparator.start_srp = twl6030_start_srp;
|
|
|
|
diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c
|
|
index dfc760830eb90..1cf924f3aeccd 100644
|
|
--- a/drivers/video/backlight/pwm_bl.c
|
|
+++ b/drivers/video/backlight/pwm_bl.c
|
|
@@ -417,6 +417,33 @@ static bool pwm_backlight_is_linear(struct platform_pwm_backlight_data *data)
|
|
static int pwm_backlight_initial_power_state(const struct pwm_bl_data *pb)
|
|
{
|
|
struct device_node *node = pb->dev->of_node;
|
|
+ bool active = true;
|
|
+
|
|
+ /*
|
|
+ * If the enable GPIO is present, observable (either as input
|
|
+ * or output) and off then the backlight is not currently active.
|
|
+ * */
|
|
+ if (pb->enable_gpio && gpiod_get_value_cansleep(pb->enable_gpio) == 0)
|
|
+ active = false;
|
|
+
|
|
+ if (!regulator_is_enabled(pb->power_supply))
|
|
+ active = false;
|
|
+
|
|
+ if (!pwm_is_enabled(pb->pwm))
|
|
+ active = false;
|
|
+
|
|
+ /*
|
|
+ * Synchronize the enable_gpio with the observed state of the
|
|
+ * hardware.
|
|
+ */
|
|
+ if (pb->enable_gpio)
|
|
+ gpiod_direction_output(pb->enable_gpio, active);
|
|
+
|
|
+ /*
|
|
+ * Do not change pb->enabled here! pb->enabled essentially
|
|
+ * tells us if we own one of the regulator's use counts and
|
|
+ * right now we do not.
|
|
+ */
|
|
|
|
/* Not booted with device tree or no phandle link to the node */
|
|
if (!node || !node->phandle)
|
|
@@ -428,20 +455,7 @@ static int pwm_backlight_initial_power_state(const struct pwm_bl_data *pb)
|
|
* assume that another driver will enable the backlight at the
|
|
* appropriate time. Therefore, if it is disabled, keep it so.
|
|
*/
|
|
-
|
|
- /* if the enable GPIO is disabled, do not enable the backlight */
|
|
- if (pb->enable_gpio && gpiod_get_value_cansleep(pb->enable_gpio) == 0)
|
|
- return FB_BLANK_POWERDOWN;
|
|
-
|
|
- /* The regulator is disabled, do not enable the backlight */
|
|
- if (!regulator_is_enabled(pb->power_supply))
|
|
- return FB_BLANK_POWERDOWN;
|
|
-
|
|
- /* The PWM is disabled, keep it like this */
|
|
- if (!pwm_is_enabled(pb->pwm))
|
|
- return FB_BLANK_POWERDOWN;
|
|
-
|
|
- return FB_BLANK_UNBLANK;
|
|
+ return active ? FB_BLANK_UNBLANK: FB_BLANK_POWERDOWN;
|
|
}
|
|
|
|
static int pwm_backlight_probe(struct platform_device *pdev)
|
|
@@ -494,18 +508,6 @@ static int pwm_backlight_probe(struct platform_device *pdev)
|
|
goto err_alloc;
|
|
}
|
|
|
|
- /*
|
|
- * If the GPIO is not known to be already configured as output, that
|
|
- * is, if gpiod_get_direction returns either 1 or -EINVAL, change the
|
|
- * direction to output and set the GPIO as active.
|
|
- * Do not force the GPIO to active when it was already output as it
|
|
- * could cause backlight flickering or we would enable the backlight too
|
|
- * early. Leave the decision of the initial backlight state for later.
|
|
- */
|
|
- if (pb->enable_gpio &&
|
|
- gpiod_get_direction(pb->enable_gpio) != 0)
|
|
- gpiod_direction_output(pb->enable_gpio, 1);
|
|
-
|
|
pb->power_supply = devm_regulator_get(&pdev->dev, "power");
|
|
if (IS_ERR(pb->power_supply)) {
|
|
ret = PTR_ERR(pb->power_supply);
|
|
diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
|
|
index 98030d75833b8..00939ca2065a9 100644
|
|
--- a/drivers/video/fbdev/core/fbmem.c
|
|
+++ b/drivers/video/fbdev/core/fbmem.c
|
|
@@ -962,6 +962,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
|
|
struct fb_var_screeninfo old_var;
|
|
struct fb_videomode mode;
|
|
struct fb_event event;
|
|
+ u32 unused;
|
|
|
|
if (var->activate & FB_ACTIVATE_INV_MODE) {
|
|
struct fb_videomode mode1, mode2;
|
|
@@ -1008,6 +1009,11 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
|
|
if (var->xres < 8 || var->yres < 8)
|
|
return -EINVAL;
|
|
|
|
+ /* Too huge resolution causes multiplication overflow. */
|
|
+ if (check_mul_overflow(var->xres, var->yres, &unused) ||
|
|
+ check_mul_overflow(var->xres_virtual, var->yres_virtual, &unused))
|
|
+ return -EINVAL;
|
|
+
|
|
ret = info->fbops->fb_check_var(var, info);
|
|
|
|
if (ret)
|
|
diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c
|
|
index 9bd03a2310328..171ad8b42107e 100644
|
|
--- a/fs/cifs/cifs_unicode.c
|
|
+++ b/fs/cifs/cifs_unicode.c
|
|
@@ -358,14 +358,9 @@ cifs_strndup_from_utf16(const char *src, const int maxlen,
|
|
if (!dst)
|
|
return NULL;
|
|
cifs_from_utf16(dst, (__le16 *) src, len, maxlen, codepage,
|
|
- NO_MAP_UNI_RSVD);
|
|
+ NO_MAP_UNI_RSVD);
|
|
} else {
|
|
- len = strnlen(src, maxlen);
|
|
- len++;
|
|
- dst = kmalloc(len, GFP_KERNEL);
|
|
- if (!dst)
|
|
- return NULL;
|
|
- strlcpy(dst, src, len);
|
|
+ dst = kstrndup(src, maxlen, GFP_KERNEL);
|
|
}
|
|
|
|
return dst;
|
|
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c
|
|
index 686e0ad287880..3aa5eb9ce498e 100644
|
|
--- a/fs/debugfs/file.c
|
|
+++ b/fs/debugfs/file.c
|
|
@@ -179,8 +179,10 @@ static int open_proxy_open(struct inode *inode, struct file *filp)
|
|
if (!fops_get(real_fops)) {
|
|
#ifdef CONFIG_MODULES
|
|
if (real_fops->owner &&
|
|
- real_fops->owner->state == MODULE_STATE_GOING)
|
|
+ real_fops->owner->state == MODULE_STATE_GOING) {
|
|
+ r = -ENXIO;
|
|
goto out;
|
|
+ }
|
|
#endif
|
|
|
|
/* Huh? Module did not clean up after itself at exit? */
|
|
@@ -314,8 +316,10 @@ static int full_proxy_open(struct inode *inode, struct file *filp)
|
|
if (!fops_get(real_fops)) {
|
|
#ifdef CONFIG_MODULES
|
|
if (real_fops->owner &&
|
|
- real_fops->owner->state == MODULE_STATE_GOING)
|
|
+ real_fops->owner->state == MODULE_STATE_GOING) {
|
|
+ r = -ENXIO;
|
|
goto out;
|
|
+ }
|
|
#endif
|
|
|
|
/* Huh? Module did not cleanup after itself at exit? */
|
|
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
|
|
index 5c74b29971976..6ee8b1e0e1741 100644
|
|
--- a/fs/f2fs/file.c
|
|
+++ b/fs/f2fs/file.c
|
|
@@ -259,8 +259,7 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
|
|
};
|
|
unsigned int seq_id = 0;
|
|
|
|
- if (unlikely(f2fs_readonly(inode->i_sb) ||
|
|
- is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
|
|
+ if (unlikely(f2fs_readonly(inode->i_sb)))
|
|
return 0;
|
|
|
|
trace_f2fs_sync_file_enter(inode);
|
|
@@ -274,7 +273,7 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
|
|
ret = file_write_and_wait_range(file, start, end);
|
|
clear_inode_flag(inode, FI_NEED_IPU);
|
|
|
|
- if (ret) {
|
|
+ if (ret || is_sbi_flag_set(sbi, SBI_CP_DISABLED)) {
|
|
trace_f2fs_sync_file_exit(inode, cp_reason, datasync, ret);
|
|
return ret;
|
|
}
|
|
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
|
|
index c529880678878..476b2c497d282 100644
|
|
--- a/fs/f2fs/super.c
|
|
+++ b/fs/f2fs/super.c
|
|
@@ -1764,8 +1764,17 @@ restore_flag:
|
|
|
|
static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi)
|
|
{
|
|
+ int retry = DEFAULT_RETRY_IO_COUNT;
|
|
+
|
|
/* we should flush all the data to keep data consistency */
|
|
- sync_inodes_sb(sbi->sb);
|
|
+ do {
|
|
+ sync_inodes_sb(sbi->sb);
|
|
+ cond_resched();
|
|
+ congestion_wait(BLK_RW_ASYNC, DEFAULT_IO_TIMEOUT);
|
|
+ } while (get_pages(sbi, F2FS_DIRTY_DATA) && retry--);
|
|
+
|
|
+ if (unlikely(retry < 0))
|
|
+ f2fs_warn(sbi, "checkpoint=enable has some unwritten data.");
|
|
|
|
down_write(&sbi->gc_lock);
|
|
f2fs_dirty_to_prefree(sbi);
|
|
diff --git a/fs/fcntl.c b/fs/fcntl.c
|
|
index 05b36b28f2e87..71b43538fa44c 100644
|
|
--- a/fs/fcntl.c
|
|
+++ b/fs/fcntl.c
|
|
@@ -995,13 +995,14 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
|
|
{
|
|
while (fa) {
|
|
struct fown_struct *fown;
|
|
+ unsigned long flags;
|
|
|
|
if (fa->magic != FASYNC_MAGIC) {
|
|
printk(KERN_ERR "kill_fasync: bad magic number in "
|
|
"fasync_struct!\n");
|
|
return;
|
|
}
|
|
- read_lock(&fa->fa_lock);
|
|
+ read_lock_irqsave(&fa->fa_lock, flags);
|
|
if (fa->fa_file) {
|
|
fown = &fa->fa_file->f_owner;
|
|
/* Don't send SIGURG to processes which have not set a
|
|
@@ -1010,7 +1011,7 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
|
|
if (!(sig == SIGURG && fown->signum == 0))
|
|
send_sigio(fown, fa->fa_fd, band);
|
|
}
|
|
- read_unlock(&fa->fa_lock);
|
|
+ read_unlock_irqrestore(&fa->fa_lock, flags);
|
|
fa = rcu_dereference(fa->fa_next);
|
|
}
|
|
}
|
|
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
|
|
index 8de9c24ac4ac6..c9606f2d2864d 100644
|
|
--- a/fs/fuse/file.c
|
|
+++ b/fs/fuse/file.c
|
|
@@ -194,12 +194,11 @@ void fuse_finish_open(struct inode *inode, struct file *file)
|
|
struct fuse_file *ff = file->private_data;
|
|
struct fuse_conn *fc = get_fuse_conn(inode);
|
|
|
|
- if (!(ff->open_flags & FOPEN_KEEP_CACHE))
|
|
- invalidate_inode_pages2(inode->i_mapping);
|
|
if (ff->open_flags & FOPEN_STREAM)
|
|
stream_open(inode, file);
|
|
else if (ff->open_flags & FOPEN_NONSEEKABLE)
|
|
nonseekable_open(inode, file);
|
|
+
|
|
if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) {
|
|
struct fuse_inode *fi = get_fuse_inode(inode);
|
|
|
|
@@ -207,10 +206,14 @@ void fuse_finish_open(struct inode *inode, struct file *file)
|
|
fi->attr_version = atomic64_inc_return(&fc->attr_version);
|
|
i_size_write(inode, 0);
|
|
spin_unlock(&fi->lock);
|
|
+ truncate_pagecache(inode, 0);
|
|
fuse_invalidate_attr(inode);
|
|
if (fc->writeback_cache)
|
|
file_update_time(file);
|
|
+ } else if (!(ff->open_flags & FOPEN_KEEP_CACHE)) {
|
|
+ invalidate_inode_pages2(inode->i_mapping);
|
|
}
|
|
+
|
|
if ((file->f_mode & FMODE_WRITE) && fc->writeback_cache)
|
|
fuse_link_write_file(file);
|
|
}
|
|
@@ -3237,7 +3240,7 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
|
|
|
|
static int fuse_writeback_range(struct inode *inode, loff_t start, loff_t end)
|
|
{
|
|
- int err = filemap_write_and_wait_range(inode->i_mapping, start, end);
|
|
+ int err = filemap_write_and_wait_range(inode->i_mapping, start, -1);
|
|
|
|
if (!err)
|
|
fuse_sync_writes(inode);
|
|
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
|
|
index ae9c5c1bdc508..b9ed6a6dbcf51 100644
|
|
--- a/fs/gfs2/ops_fstype.c
|
|
+++ b/fs/gfs2/ops_fstype.c
|
|
@@ -660,6 +660,7 @@ static int init_statfs(struct gfs2_sbd *sdp)
|
|
error = PTR_ERR(lsi->si_sc_inode);
|
|
fs_err(sdp, "can't find local \"sc\" file#%u: %d\n",
|
|
jd->jd_jid, error);
|
|
+ kfree(lsi);
|
|
goto free_local;
|
|
}
|
|
lsi->si_jid = jd->jd_jid;
|
|
@@ -1071,6 +1072,34 @@ void gfs2_online_uevent(struct gfs2_sbd *sdp)
|
|
kobject_uevent_env(&sdp->sd_kobj, KOBJ_ONLINE, envp);
|
|
}
|
|
|
|
+static int init_threads(struct gfs2_sbd *sdp)
|
|
+{
|
|
+ struct task_struct *p;
|
|
+ int error = 0;
|
|
+
|
|
+ p = kthread_run(gfs2_logd, sdp, "gfs2_logd");
|
|
+ if (IS_ERR(p)) {
|
|
+ error = PTR_ERR(p);
|
|
+ fs_err(sdp, "can't start logd thread: %d\n", error);
|
|
+ return error;
|
|
+ }
|
|
+ sdp->sd_logd_process = p;
|
|
+
|
|
+ p = kthread_run(gfs2_quotad, sdp, "gfs2_quotad");
|
|
+ if (IS_ERR(p)) {
|
|
+ error = PTR_ERR(p);
|
|
+ fs_err(sdp, "can't start quotad thread: %d\n", error);
|
|
+ goto fail;
|
|
+ }
|
|
+ sdp->sd_quotad_process = p;
|
|
+ return 0;
|
|
+
|
|
+fail:
|
|
+ kthread_stop(sdp->sd_logd_process);
|
|
+ sdp->sd_logd_process = NULL;
|
|
+ return error;
|
|
+}
|
|
+
|
|
/**
|
|
* gfs2_fill_super - Read in superblock
|
|
* @sb: The VFS superblock
|
|
@@ -1197,6 +1226,14 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc)
|
|
goto fail_per_node;
|
|
}
|
|
|
|
+ if (!sb_rdonly(sb)) {
|
|
+ error = init_threads(sdp);
|
|
+ if (error) {
|
|
+ gfs2_withdraw_delayed(sdp);
|
|
+ goto fail_per_node;
|
|
+ }
|
|
+ }
|
|
+
|
|
error = gfs2_freeze_lock(sdp, &freeze_gh, 0);
|
|
if (error)
|
|
goto fail_per_node;
|
|
@@ -1206,6 +1243,12 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc)
|
|
|
|
gfs2_freeze_unlock(&freeze_gh);
|
|
if (error) {
|
|
+ if (sdp->sd_quotad_process)
|
|
+ kthread_stop(sdp->sd_quotad_process);
|
|
+ sdp->sd_quotad_process = NULL;
|
|
+ if (sdp->sd_logd_process)
|
|
+ kthread_stop(sdp->sd_logd_process);
|
|
+ sdp->sd_logd_process = NULL;
|
|
fs_err(sdp, "can't make FS RW: %d\n", error);
|
|
goto fail_per_node;
|
|
}
|
|
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
|
|
index 077dc8c035a8b..6a355e1347d7f 100644
|
|
--- a/fs/gfs2/super.c
|
|
+++ b/fs/gfs2/super.c
|
|
@@ -126,34 +126,6 @@ int gfs2_jdesc_check(struct gfs2_jdesc *jd)
|
|
return 0;
|
|
}
|
|
|
|
-static int init_threads(struct gfs2_sbd *sdp)
|
|
-{
|
|
- struct task_struct *p;
|
|
- int error = 0;
|
|
-
|
|
- p = kthread_run(gfs2_logd, sdp, "gfs2_logd");
|
|
- if (IS_ERR(p)) {
|
|
- error = PTR_ERR(p);
|
|
- fs_err(sdp, "can't start logd thread: %d\n", error);
|
|
- return error;
|
|
- }
|
|
- sdp->sd_logd_process = p;
|
|
-
|
|
- p = kthread_run(gfs2_quotad, sdp, "gfs2_quotad");
|
|
- if (IS_ERR(p)) {
|
|
- error = PTR_ERR(p);
|
|
- fs_err(sdp, "can't start quotad thread: %d\n", error);
|
|
- goto fail;
|
|
- }
|
|
- sdp->sd_quotad_process = p;
|
|
- return 0;
|
|
-
|
|
-fail:
|
|
- kthread_stop(sdp->sd_logd_process);
|
|
- sdp->sd_logd_process = NULL;
|
|
- return error;
|
|
-}
|
|
-
|
|
/**
|
|
* gfs2_make_fs_rw - Turn a Read-Only FS into a Read-Write one
|
|
* @sdp: the filesystem
|
|
@@ -168,26 +140,17 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
|
|
struct gfs2_log_header_host head;
|
|
int error;
|
|
|
|
- error = init_threads(sdp);
|
|
- if (error) {
|
|
- gfs2_withdraw_delayed(sdp);
|
|
- return error;
|
|
- }
|
|
-
|
|
j_gl->gl_ops->go_inval(j_gl, DIO_METADATA);
|
|
- if (gfs2_withdrawn(sdp)) {
|
|
- error = -EIO;
|
|
- goto fail;
|
|
- }
|
|
+ if (gfs2_withdrawn(sdp))
|
|
+ return -EIO;
|
|
|
|
error = gfs2_find_jhead(sdp->sd_jdesc, &head, false);
|
|
if (error || gfs2_withdrawn(sdp))
|
|
- goto fail;
|
|
+ return error;
|
|
|
|
if (!(head.lh_flags & GFS2_LOG_HEAD_UNMOUNT)) {
|
|
gfs2_consist(sdp);
|
|
- error = -EIO;
|
|
- goto fail;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/* Initialize some head of the log stuff */
|
|
@@ -195,20 +158,8 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
|
|
gfs2_log_pointers_init(sdp, head.lh_blkno);
|
|
|
|
error = gfs2_quota_init(sdp);
|
|
- if (error || gfs2_withdrawn(sdp))
|
|
- goto fail;
|
|
-
|
|
- set_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags);
|
|
-
|
|
- return 0;
|
|
-
|
|
-fail:
|
|
- if (sdp->sd_quotad_process)
|
|
- kthread_stop(sdp->sd_quotad_process);
|
|
- sdp->sd_quotad_process = NULL;
|
|
- if (sdp->sd_logd_process)
|
|
- kthread_stop(sdp->sd_logd_process);
|
|
- sdp->sd_logd_process = NULL;
|
|
+ if (!error && !gfs2_withdrawn(sdp))
|
|
+ set_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags);
|
|
return error;
|
|
}
|
|
|
|
diff --git a/fs/io_uring.c b/fs/io_uring.c
|
|
index 108b0ed31c11a..2009d1cda606c 100644
|
|
--- a/fs/io_uring.c
|
|
+++ b/fs/io_uring.c
|
|
@@ -889,6 +889,7 @@ static const struct io_op_def io_op_defs[] = {
|
|
},
|
|
[IORING_OP_WRITE] = {
|
|
.needs_file = 1,
|
|
+ .hash_reg_file = 1,
|
|
.unbound_nonreg_file = 1,
|
|
.pollout = 1,
|
|
.async_size = sizeof(struct io_async_rw),
|
|
diff --git a/fs/iomap/swapfile.c b/fs/iomap/swapfile.c
|
|
index a5e478de14174..2ceea45aefd8c 100644
|
|
--- a/fs/iomap/swapfile.c
|
|
+++ b/fs/iomap/swapfile.c
|
|
@@ -30,11 +30,16 @@ static int iomap_swapfile_add_extent(struct iomap_swapfile_info *isi)
|
|
{
|
|
struct iomap *iomap = &isi->iomap;
|
|
unsigned long nr_pages;
|
|
+ unsigned long max_pages;
|
|
uint64_t first_ppage;
|
|
uint64_t first_ppage_reported;
|
|
uint64_t next_ppage;
|
|
int error;
|
|
|
|
+ if (unlikely(isi->nr_pages >= isi->sis->max))
|
|
+ return 0;
|
|
+ max_pages = isi->sis->max - isi->nr_pages;
|
|
+
|
|
/*
|
|
* Round the start up and the end down so that the physical
|
|
* extent aligns to a page boundary.
|
|
@@ -47,6 +52,7 @@ static int iomap_swapfile_add_extent(struct iomap_swapfile_info *isi)
|
|
if (first_ppage >= next_ppage)
|
|
return 0;
|
|
nr_pages = next_ppage - first_ppage;
|
|
+ nr_pages = min(nr_pages, max_pages);
|
|
|
|
/*
|
|
* Calculate how much swap space we're adding; the first page contains
|
|
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
|
|
index ec90773527eea..35675a1065be8 100644
|
|
--- a/fs/isofs/inode.c
|
|
+++ b/fs/isofs/inode.c
|
|
@@ -155,7 +155,6 @@ struct iso9660_options{
|
|
unsigned int overriderockperm:1;
|
|
unsigned int uid_set:1;
|
|
unsigned int gid_set:1;
|
|
- unsigned int utf8:1;
|
|
unsigned char map;
|
|
unsigned char check;
|
|
unsigned int blocksize;
|
|
@@ -355,7 +354,6 @@ static int parse_options(char *options, struct iso9660_options *popt)
|
|
popt->gid = GLOBAL_ROOT_GID;
|
|
popt->uid = GLOBAL_ROOT_UID;
|
|
popt->iocharset = NULL;
|
|
- popt->utf8 = 0;
|
|
popt->overriderockperm = 0;
|
|
popt->session=-1;
|
|
popt->sbsector=-1;
|
|
@@ -388,10 +386,13 @@ static int parse_options(char *options, struct iso9660_options *popt)
|
|
case Opt_cruft:
|
|
popt->cruft = 1;
|
|
break;
|
|
+#ifdef CONFIG_JOLIET
|
|
case Opt_utf8:
|
|
- popt->utf8 = 1;
|
|
+ kfree(popt->iocharset);
|
|
+ popt->iocharset = kstrdup("utf8", GFP_KERNEL);
|
|
+ if (!popt->iocharset)
|
|
+ return 0;
|
|
break;
|
|
-#ifdef CONFIG_JOLIET
|
|
case Opt_iocharset:
|
|
kfree(popt->iocharset);
|
|
popt->iocharset = match_strdup(&args[0]);
|
|
@@ -494,7 +495,6 @@ static int isofs_show_options(struct seq_file *m, struct dentry *root)
|
|
if (sbi->s_nocompress) seq_puts(m, ",nocompress");
|
|
if (sbi->s_overriderockperm) seq_puts(m, ",overriderockperm");
|
|
if (sbi->s_showassoc) seq_puts(m, ",showassoc");
|
|
- if (sbi->s_utf8) seq_puts(m, ",utf8");
|
|
|
|
if (sbi->s_check) seq_printf(m, ",check=%c", sbi->s_check);
|
|
if (sbi->s_mapping) seq_printf(m, ",map=%c", sbi->s_mapping);
|
|
@@ -517,9 +517,10 @@ static int isofs_show_options(struct seq_file *m, struct dentry *root)
|
|
seq_printf(m, ",fmode=%o", sbi->s_fmode);
|
|
|
|
#ifdef CONFIG_JOLIET
|
|
- if (sbi->s_nls_iocharset &&
|
|
- strcmp(sbi->s_nls_iocharset->charset, CONFIG_NLS_DEFAULT) != 0)
|
|
+ if (sbi->s_nls_iocharset)
|
|
seq_printf(m, ",iocharset=%s", sbi->s_nls_iocharset->charset);
|
|
+ else
|
|
+ seq_puts(m, ",iocharset=utf8");
|
|
#endif
|
|
return 0;
|
|
}
|
|
@@ -862,14 +863,13 @@ root_found:
|
|
sbi->s_nls_iocharset = NULL;
|
|
|
|
#ifdef CONFIG_JOLIET
|
|
- if (joliet_level && opt.utf8 == 0) {
|
|
+ if (joliet_level) {
|
|
char *p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT;
|
|
- sbi->s_nls_iocharset = load_nls(p);
|
|
- if (! sbi->s_nls_iocharset) {
|
|
- /* Fail only if explicit charset specified */
|
|
- if (opt.iocharset)
|
|
+ if (strcmp(p, "utf8") != 0) {
|
|
+ sbi->s_nls_iocharset = opt.iocharset ?
|
|
+ load_nls(opt.iocharset) : load_nls_default();
|
|
+ if (!sbi->s_nls_iocharset)
|
|
goto out_freesbi;
|
|
- sbi->s_nls_iocharset = load_nls_default();
|
|
}
|
|
}
|
|
#endif
|
|
@@ -885,7 +885,6 @@ root_found:
|
|
sbi->s_gid = opt.gid;
|
|
sbi->s_uid_set = opt.uid_set;
|
|
sbi->s_gid_set = opt.gid_set;
|
|
- sbi->s_utf8 = opt.utf8;
|
|
sbi->s_nocompress = opt.nocompress;
|
|
sbi->s_overriderockperm = opt.overriderockperm;
|
|
/*
|
|
diff --git a/fs/isofs/isofs.h b/fs/isofs/isofs.h
|
|
index 055ec6c586f7f..dcdc191ed1834 100644
|
|
--- a/fs/isofs/isofs.h
|
|
+++ b/fs/isofs/isofs.h
|
|
@@ -44,7 +44,6 @@ struct isofs_sb_info {
|
|
unsigned char s_session;
|
|
unsigned int s_high_sierra:1;
|
|
unsigned int s_rock:2;
|
|
- unsigned int s_utf8:1;
|
|
unsigned int s_cruft:1; /* Broken disks with high byte of length
|
|
* containing junk */
|
|
unsigned int s_nocompress:1;
|
|
diff --git a/fs/isofs/joliet.c b/fs/isofs/joliet.c
|
|
index be8b6a9d0b926..c0f04a1e7f695 100644
|
|
--- a/fs/isofs/joliet.c
|
|
+++ b/fs/isofs/joliet.c
|
|
@@ -41,14 +41,12 @@ uni16_to_x8(unsigned char *ascii, __be16 *uni, int len, struct nls_table *nls)
|
|
int
|
|
get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, struct inode * inode)
|
|
{
|
|
- unsigned char utf8;
|
|
struct nls_table *nls;
|
|
unsigned char len = 0;
|
|
|
|
- utf8 = ISOFS_SB(inode->i_sb)->s_utf8;
|
|
nls = ISOFS_SB(inode->i_sb)->s_nls_iocharset;
|
|
|
|
- if (utf8) {
|
|
+ if (!nls) {
|
|
len = utf16s_to_utf8s((const wchar_t *) de->name,
|
|
de->name_len[0] >> 1, UTF16_BIG_ENDIAN,
|
|
outname, PAGE_SIZE);
|
|
diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c
|
|
index 61d3cc2283dc8..498cb70c2c0d0 100644
|
|
--- a/fs/lockd/svclock.c
|
|
+++ b/fs/lockd/svclock.c
|
|
@@ -634,7 +634,7 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file,
|
|
conflock->caller = "somehost"; /* FIXME */
|
|
conflock->len = strlen(conflock->caller);
|
|
conflock->oh.len = 0; /* don't return OH info */
|
|
- conflock->svid = ((struct nlm_lockowner *)lock->fl.fl_owner)->pid;
|
|
+ conflock->svid = lock->fl.fl_pid;
|
|
conflock->fl.fl_type = lock->fl.fl_type;
|
|
conflock->fl.fl_start = lock->fl.fl_start;
|
|
conflock->fl.fl_end = lock->fl.fl_end;
|
|
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
|
|
index 80e394a2e3fd7..142aac9b63a89 100644
|
|
--- a/fs/nfsd/nfs4state.c
|
|
+++ b/fs/nfsd/nfs4state.c
|
|
@@ -2646,9 +2646,9 @@ static void force_expire_client(struct nfs4_client *clp)
|
|
struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
|
|
bool already_expired;
|
|
|
|
- spin_lock(&clp->cl_lock);
|
|
+ spin_lock(&nn->client_lock);
|
|
clp->cl_time = 0;
|
|
- spin_unlock(&clp->cl_lock);
|
|
+ spin_unlock(&nn->client_lock);
|
|
|
|
wait_event(expiry_wq, atomic_read(&clp->cl_rpc_users) == 0);
|
|
spin_lock(&nn->client_lock);
|
|
diff --git a/fs/udf/misc.c b/fs/udf/misc.c
|
|
index eab94527340dc..1614d308d0f06 100644
|
|
--- a/fs/udf/misc.c
|
|
+++ b/fs/udf/misc.c
|
|
@@ -173,13 +173,22 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type,
|
|
else
|
|
offset = le32_to_cpu(eahd->appAttrLocation);
|
|
|
|
- while (offset < iinfo->i_lenEAttr) {
|
|
+ while (offset + sizeof(*gaf) < iinfo->i_lenEAttr) {
|
|
+ uint32_t attrLength;
|
|
+
|
|
gaf = (struct genericFormat *)&ea[offset];
|
|
+ attrLength = le32_to_cpu(gaf->attrLength);
|
|
+
|
|
+ /* Detect undersized elements and buffer overflows */
|
|
+ if ((attrLength < sizeof(*gaf)) ||
|
|
+ (attrLength > (iinfo->i_lenEAttr - offset)))
|
|
+ break;
|
|
+
|
|
if (le32_to_cpu(gaf->attrType) == type &&
|
|
gaf->attrSubtype == subtype)
|
|
return gaf;
|
|
else
|
|
- offset += le32_to_cpu(gaf->attrLength);
|
|
+ offset += attrLength;
|
|
}
|
|
}
|
|
|
|
diff --git a/fs/udf/super.c b/fs/udf/super.c
|
|
index d0df217f4712a..5d2b820ef303a 100644
|
|
--- a/fs/udf/super.c
|
|
+++ b/fs/udf/super.c
|
|
@@ -108,16 +108,10 @@ struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct super_block *sb)
|
|
return NULL;
|
|
lvid = (struct logicalVolIntegrityDesc *)UDF_SB(sb)->s_lvid_bh->b_data;
|
|
partnum = le32_to_cpu(lvid->numOfPartitions);
|
|
- if ((sb->s_blocksize - sizeof(struct logicalVolIntegrityDescImpUse) -
|
|
- offsetof(struct logicalVolIntegrityDesc, impUse)) /
|
|
- (2 * sizeof(uint32_t)) < partnum) {
|
|
- udf_err(sb, "Logical volume integrity descriptor corrupted "
|
|
- "(numOfPartitions = %u)!\n", partnum);
|
|
- return NULL;
|
|
- }
|
|
/* The offset is to skip freeSpaceTable and sizeTable arrays */
|
|
offset = partnum * 2 * sizeof(uint32_t);
|
|
- return (struct logicalVolIntegrityDescImpUse *)&(lvid->impUse[offset]);
|
|
+ return (struct logicalVolIntegrityDescImpUse *)
|
|
+ (((uint8_t *)(lvid + 1)) + offset);
|
|
}
|
|
|
|
/* UDF filesystem type */
|
|
@@ -349,10 +343,10 @@ static int udf_show_options(struct seq_file *seq, struct dentry *root)
|
|
seq_printf(seq, ",lastblock=%u", sbi->s_last_block);
|
|
if (sbi->s_anchor != 0)
|
|
seq_printf(seq, ",anchor=%u", sbi->s_anchor);
|
|
- if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8))
|
|
- seq_puts(seq, ",utf8");
|
|
- if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP) && sbi->s_nls_map)
|
|
+ if (sbi->s_nls_map)
|
|
seq_printf(seq, ",iocharset=%s", sbi->s_nls_map->charset);
|
|
+ else
|
|
+ seq_puts(seq, ",iocharset=utf8");
|
|
|
|
return 0;
|
|
}
|
|
@@ -557,19 +551,24 @@ static int udf_parse_options(char *options, struct udf_options *uopt,
|
|
/* Ignored (never implemented properly) */
|
|
break;
|
|
case Opt_utf8:
|
|
- uopt->flags |= (1 << UDF_FLAG_UTF8);
|
|
+ if (!remount) {
|
|
+ unload_nls(uopt->nls_map);
|
|
+ uopt->nls_map = NULL;
|
|
+ }
|
|
break;
|
|
case Opt_iocharset:
|
|
if (!remount) {
|
|
- if (uopt->nls_map)
|
|
- unload_nls(uopt->nls_map);
|
|
- /*
|
|
- * load_nls() failure is handled later in
|
|
- * udf_fill_super() after all options are
|
|
- * parsed.
|
|
- */
|
|
+ unload_nls(uopt->nls_map);
|
|
+ uopt->nls_map = NULL;
|
|
+ }
|
|
+ /* When nls_map is not loaded then UTF-8 is used */
|
|
+ if (!remount && strcmp(args[0].from, "utf8") != 0) {
|
|
uopt->nls_map = load_nls(args[0].from);
|
|
- uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
|
|
+ if (!uopt->nls_map) {
|
|
+ pr_err("iocharset %s not found\n",
|
|
+ args[0].from);
|
|
+ return 0;
|
|
+ }
|
|
}
|
|
break;
|
|
case Opt_uforget:
|
|
@@ -1541,6 +1540,7 @@ static void udf_load_logicalvolint(struct super_block *sb, struct kernel_extent_
|
|
struct udf_sb_info *sbi = UDF_SB(sb);
|
|
struct logicalVolIntegrityDesc *lvid;
|
|
int indirections = 0;
|
|
+ u32 parts, impuselen;
|
|
|
|
while (++indirections <= UDF_MAX_LVID_NESTING) {
|
|
final_bh = NULL;
|
|
@@ -1567,15 +1567,27 @@ static void udf_load_logicalvolint(struct super_block *sb, struct kernel_extent_
|
|
|
|
lvid = (struct logicalVolIntegrityDesc *)final_bh->b_data;
|
|
if (lvid->nextIntegrityExt.extLength == 0)
|
|
- return;
|
|
+ goto check;
|
|
|
|
loc = leea_to_cpu(lvid->nextIntegrityExt);
|
|
}
|
|
|
|
udf_warn(sb, "Too many LVID indirections (max %u), ignoring.\n",
|
|
UDF_MAX_LVID_NESTING);
|
|
+out_err:
|
|
brelse(sbi->s_lvid_bh);
|
|
sbi->s_lvid_bh = NULL;
|
|
+ return;
|
|
+check:
|
|
+ parts = le32_to_cpu(lvid->numOfPartitions);
|
|
+ impuselen = le32_to_cpu(lvid->lengthOfImpUse);
|
|
+ if (parts >= sb->s_blocksize || impuselen >= sb->s_blocksize ||
|
|
+ sizeof(struct logicalVolIntegrityDesc) + impuselen +
|
|
+ 2 * parts * sizeof(u32) > sb->s_blocksize) {
|
|
+ udf_warn(sb, "Corrupted LVID (parts=%u, impuselen=%u), "
|
|
+ "ignoring.\n", parts, impuselen);
|
|
+ goto out_err;
|
|
+ }
|
|
}
|
|
|
|
/*
|
|
@@ -2138,21 +2150,6 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
|
|
if (!udf_parse_options((char *)options, &uopt, false))
|
|
goto parse_options_failure;
|
|
|
|
- if (uopt.flags & (1 << UDF_FLAG_UTF8) &&
|
|
- uopt.flags & (1 << UDF_FLAG_NLS_MAP)) {
|
|
- udf_err(sb, "utf8 cannot be combined with iocharset\n");
|
|
- goto parse_options_failure;
|
|
- }
|
|
- if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map) {
|
|
- uopt.nls_map = load_nls_default();
|
|
- if (!uopt.nls_map)
|
|
- uopt.flags &= ~(1 << UDF_FLAG_NLS_MAP);
|
|
- else
|
|
- udf_debug("Using default NLS map\n");
|
|
- }
|
|
- if (!(uopt.flags & (1 << UDF_FLAG_NLS_MAP)))
|
|
- uopt.flags |= (1 << UDF_FLAG_UTF8);
|
|
-
|
|
fileset.logicalBlockNum = 0xFFFFFFFF;
|
|
fileset.partitionReferenceNum = 0xFFFF;
|
|
|
|
@@ -2307,8 +2304,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
|
|
error_out:
|
|
iput(sbi->s_vat_inode);
|
|
parse_options_failure:
|
|
- if (uopt.nls_map)
|
|
- unload_nls(uopt.nls_map);
|
|
+ unload_nls(uopt.nls_map);
|
|
if (lvid_open)
|
|
udf_close_lvid(sb);
|
|
brelse(sbi->s_lvid_bh);
|
|
@@ -2358,8 +2354,7 @@ static void udf_put_super(struct super_block *sb)
|
|
sbi = UDF_SB(sb);
|
|
|
|
iput(sbi->s_vat_inode);
|
|
- if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
|
|
- unload_nls(sbi->s_nls_map);
|
|
+ unload_nls(sbi->s_nls_map);
|
|
if (!sb_rdonly(sb))
|
|
udf_close_lvid(sb);
|
|
brelse(sbi->s_lvid_bh);
|
|
diff --git a/fs/udf/udf_sb.h b/fs/udf/udf_sb.h
|
|
index 758efe557a199..4fa620543d302 100644
|
|
--- a/fs/udf/udf_sb.h
|
|
+++ b/fs/udf/udf_sb.h
|
|
@@ -20,8 +20,6 @@
|
|
#define UDF_FLAG_UNDELETE 6
|
|
#define UDF_FLAG_UNHIDE 7
|
|
#define UDF_FLAG_VARCONV 8
|
|
-#define UDF_FLAG_NLS_MAP 9
|
|
-#define UDF_FLAG_UTF8 10
|
|
#define UDF_FLAG_UID_FORGET 11 /* save -1 for uid to disk */
|
|
#define UDF_FLAG_GID_FORGET 12
|
|
#define UDF_FLAG_UID_SET 13
|
|
diff --git a/fs/udf/unicode.c b/fs/udf/unicode.c
|
|
index 5fcfa96463ebb..622569007b530 100644
|
|
--- a/fs/udf/unicode.c
|
|
+++ b/fs/udf/unicode.c
|
|
@@ -177,7 +177,7 @@ static int udf_name_from_CS0(struct super_block *sb,
|
|
return 0;
|
|
}
|
|
|
|
- if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
|
|
+ if (UDF_SB(sb)->s_nls_map)
|
|
conv_f = UDF_SB(sb)->s_nls_map->uni2char;
|
|
else
|
|
conv_f = NULL;
|
|
@@ -285,7 +285,7 @@ static int udf_name_to_CS0(struct super_block *sb,
|
|
if (ocu_max_len <= 0)
|
|
return 0;
|
|
|
|
- if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
|
|
+ if (UDF_SB(sb)->s_nls_map)
|
|
conv_f = UDF_SB(sb)->s_nls_map->char2uni;
|
|
else
|
|
conv_f = NULL;
|
|
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
|
|
index 542471b76f410..8aae375864b6b 100644
|
|
--- a/include/linux/blkdev.h
|
|
+++ b/include/linux/blkdev.h
|
|
@@ -1534,6 +1534,22 @@ static inline int queue_limit_discard_alignment(struct queue_limits *lim, sector
|
|
return offset << SECTOR_SHIFT;
|
|
}
|
|
|
|
+/*
|
|
+ * Two cases of handling DISCARD merge:
|
|
+ * If max_discard_segments > 1, the driver takes every bio
|
|
+ * as a range and send them to controller together. The ranges
|
|
+ * needn't to be contiguous.
|
|
+ * Otherwise, the bios/requests will be handled as same as
|
|
+ * others which should be contiguous.
|
|
+ */
|
|
+static inline bool blk_discard_mergable(struct request *req)
|
|
+{
|
|
+ if (req_op(req) == REQ_OP_DISCARD &&
|
|
+ queue_max_discard_segments(req->q) > 1)
|
|
+ return true;
|
|
+ return false;
|
|
+}
|
|
+
|
|
static inline int bdev_discard_alignment(struct block_device *bdev)
|
|
{
|
|
struct request_queue *q = bdev_get_queue(bdev);
|
|
diff --git a/include/linux/energy_model.h b/include/linux/energy_model.h
|
|
index b67a51c574b97..5f04a2b35e80b 100644
|
|
--- a/include/linux/energy_model.h
|
|
+++ b/include/linux/energy_model.h
|
|
@@ -51,6 +51,22 @@ struct em_perf_domain {
|
|
#ifdef CONFIG_ENERGY_MODEL
|
|
#define EM_MAX_POWER 0xFFFF
|
|
|
|
+/*
|
|
+ * Increase resolution of energy estimation calculations for 64-bit
|
|
+ * architectures. The extra resolution improves decision made by EAS for the
|
|
+ * task placement when two Performance Domains might provide similar energy
|
|
+ * estimation values (w/o better resolution the values could be equal).
|
|
+ *
|
|
+ * We increase resolution only if we have enough bits to allow this increased
|
|
+ * resolution (i.e. 64-bit). The costs for increasing resolution when 32-bit
|
|
+ * are pretty high and the returns do not justify the increased costs.
|
|
+ */
|
|
+#ifdef CONFIG_64BIT
|
|
+#define em_scale_power(p) ((p) * 1000)
|
|
+#else
|
|
+#define em_scale_power(p) (p)
|
|
+#endif
|
|
+
|
|
struct em_data_callback {
|
|
/**
|
|
* active_power() - Provide power at the next performance state of
|
|
diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h
|
|
index 107cedd7019a4..7f1b8549ebcee 100644
|
|
--- a/include/linux/hrtimer.h
|
|
+++ b/include/linux/hrtimer.h
|
|
@@ -318,16 +318,12 @@ struct clock_event_device;
|
|
|
|
extern void hrtimer_interrupt(struct clock_event_device *dev);
|
|
|
|
-extern void clock_was_set_delayed(void);
|
|
-
|
|
extern unsigned int hrtimer_resolution;
|
|
|
|
#else
|
|
|
|
#define hrtimer_resolution (unsigned int)LOW_RES_NSEC
|
|
|
|
-static inline void clock_was_set_delayed(void) { }
|
|
-
|
|
#endif
|
|
|
|
static inline ktime_t
|
|
@@ -351,7 +347,6 @@ hrtimer_expires_remaining_adjusted(const struct hrtimer *timer)
|
|
timer->base->get_time());
|
|
}
|
|
|
|
-extern void clock_was_set(void);
|
|
#ifdef CONFIG_TIMERFD
|
|
extern void timerfd_clock_was_set(void);
|
|
#else
|
|
diff --git a/include/linux/local_lock_internal.h b/include/linux/local_lock_internal.h
|
|
index 4a8795b21d774..3f02b818625ef 100644
|
|
--- a/include/linux/local_lock_internal.h
|
|
+++ b/include/linux/local_lock_internal.h
|
|
@@ -14,26 +14,14 @@ typedef struct {
|
|
} local_lock_t;
|
|
|
|
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
-# define LL_DEP_MAP_INIT(lockname) \
|
|
+# define LOCAL_LOCK_DEBUG_INIT(lockname) \
|
|
.dep_map = { \
|
|
.name = #lockname, \
|
|
.wait_type_inner = LD_WAIT_CONFIG, \
|
|
- }
|
|
-#else
|
|
-# define LL_DEP_MAP_INIT(lockname)
|
|
-#endif
|
|
-
|
|
-#define INIT_LOCAL_LOCK(lockname) { LL_DEP_MAP_INIT(lockname) }
|
|
+ .lock_type = LD_LOCK_PERCPU, \
|
|
+ }, \
|
|
+ .owner = NULL,
|
|
|
|
-#define __local_lock_init(lock) \
|
|
-do { \
|
|
- static struct lock_class_key __key; \
|
|
- \
|
|
- debug_check_no_locks_freed((void *)lock, sizeof(*lock));\
|
|
- lockdep_init_map_wait(&(lock)->dep_map, #lock, &__key, 0, LD_WAIT_CONFIG);\
|
|
-} while (0)
|
|
-
|
|
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
static inline void local_lock_acquire(local_lock_t *l)
|
|
{
|
|
lock_map_acquire(&l->dep_map);
|
|
@@ -48,11 +36,30 @@ static inline void local_lock_release(local_lock_t *l)
|
|
lock_map_release(&l->dep_map);
|
|
}
|
|
|
|
+static inline void local_lock_debug_init(local_lock_t *l)
|
|
+{
|
|
+ l->owner = NULL;
|
|
+}
|
|
#else /* CONFIG_DEBUG_LOCK_ALLOC */
|
|
+# define LOCAL_LOCK_DEBUG_INIT(lockname)
|
|
static inline void local_lock_acquire(local_lock_t *l) { }
|
|
static inline void local_lock_release(local_lock_t *l) { }
|
|
+static inline void local_lock_debug_init(local_lock_t *l) { }
|
|
#endif /* !CONFIG_DEBUG_LOCK_ALLOC */
|
|
|
|
+#define INIT_LOCAL_LOCK(lockname) { LOCAL_LOCK_DEBUG_INIT(lockname) }
|
|
+
|
|
+#define __local_lock_init(lock) \
|
|
+do { \
|
|
+ static struct lock_class_key __key; \
|
|
+ \
|
|
+ debug_check_no_locks_freed((void *)lock, sizeof(*lock));\
|
|
+ lockdep_init_map_type(&(lock)->dep_map, #lock, &__key, \
|
|
+ 0, LD_WAIT_CONFIG, LD_WAIT_INV, \
|
|
+ LD_LOCK_PERCPU); \
|
|
+ local_lock_debug_init(lock); \
|
|
+} while (0)
|
|
+
|
|
#define __local_lock(lock) \
|
|
do { \
|
|
preempt_disable(); \
|
|
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
|
|
index f5594879175a6..20b6797babe2c 100644
|
|
--- a/include/linux/lockdep.h
|
|
+++ b/include/linux/lockdep.h
|
|
@@ -185,12 +185,19 @@ extern void lockdep_unregister_key(struct lock_class_key *key);
|
|
* to lockdep:
|
|
*/
|
|
|
|
-extern void lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
|
|
- struct lock_class_key *key, int subclass, short inner, short outer);
|
|
+extern void lockdep_init_map_type(struct lockdep_map *lock, const char *name,
|
|
+ struct lock_class_key *key, int subclass, u8 inner, u8 outer, u8 lock_type);
|
|
+
|
|
+static inline void
|
|
+lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
|
|
+ struct lock_class_key *key, int subclass, u8 inner, u8 outer)
|
|
+{
|
|
+ lockdep_init_map_type(lock, name, key, subclass, inner, LD_WAIT_INV, LD_LOCK_NORMAL);
|
|
+}
|
|
|
|
static inline void
|
|
lockdep_init_map_wait(struct lockdep_map *lock, const char *name,
|
|
- struct lock_class_key *key, int subclass, short inner)
|
|
+ struct lock_class_key *key, int subclass, u8 inner)
|
|
{
|
|
lockdep_init_map_waits(lock, name, key, subclass, inner, LD_WAIT_INV);
|
|
}
|
|
@@ -340,6 +347,8 @@ static inline void lockdep_set_selftest_task(struct task_struct *task)
|
|
# define lock_set_class(l, n, k, s, i) do { } while (0)
|
|
# define lock_set_subclass(l, s, i) do { } while (0)
|
|
# define lockdep_init() do { } while (0)
|
|
+# define lockdep_init_map_type(lock, name, key, sub, inner, outer, type) \
|
|
+ do { (void)(name); (void)(key); } while (0)
|
|
# define lockdep_init_map_waits(lock, name, key, sub, inner, outer) \
|
|
do { (void)(name); (void)(key); } while (0)
|
|
# define lockdep_init_map_wait(lock, name, key, sub, inner) \
|
|
diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h
|
|
index 9a1fd49df17f6..2ec9ff5a7fff0 100644
|
|
--- a/include/linux/lockdep_types.h
|
|
+++ b/include/linux/lockdep_types.h
|
|
@@ -30,6 +30,12 @@ enum lockdep_wait_type {
|
|
LD_WAIT_MAX, /* must be last */
|
|
};
|
|
|
|
+enum lockdep_lock_type {
|
|
+ LD_LOCK_NORMAL = 0, /* normal, catch all */
|
|
+ LD_LOCK_PERCPU, /* percpu */
|
|
+ LD_LOCK_MAX,
|
|
+};
|
|
+
|
|
#ifdef CONFIG_LOCKDEP
|
|
|
|
/*
|
|
@@ -119,8 +125,10 @@ struct lock_class {
|
|
int name_version;
|
|
const char *name;
|
|
|
|
- short wait_type_inner;
|
|
- short wait_type_outer;
|
|
+ u8 wait_type_inner;
|
|
+ u8 wait_type_outer;
|
|
+ u8 lock_type;
|
|
+ /* u8 hole; */
|
|
|
|
#ifdef CONFIG_LOCK_STAT
|
|
unsigned long contention_point[LOCKSTAT_POINTS];
|
|
@@ -169,8 +177,10 @@ struct lockdep_map {
|
|
struct lock_class_key *key;
|
|
struct lock_class *class_cache[NR_LOCKDEP_CACHING_CLASSES];
|
|
const char *name;
|
|
- short wait_type_outer; /* can be taken in this context */
|
|
- short wait_type_inner; /* presents this context */
|
|
+ u8 wait_type_outer; /* can be taken in this context */
|
|
+ u8 wait_type_inner; /* presents this context */
|
|
+ u8 lock_type;
|
|
+ /* u8 hole; */
|
|
#ifdef CONFIG_LOCK_STAT
|
|
int cpu;
|
|
unsigned long ip;
|
|
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
|
|
index af8f4e2cf21d1..70a3664785f80 100644
|
|
--- a/include/linux/mlx5/mlx5_ifc.h
|
|
+++ b/include/linux/mlx5/mlx5_ifc.h
|
|
@@ -876,7 +876,8 @@ struct mlx5_ifc_per_protocol_networking_offload_caps_bits {
|
|
u8 scatter_fcs[0x1];
|
|
u8 enhanced_multi_pkt_send_wqe[0x1];
|
|
u8 tunnel_lso_const_out_ip_id[0x1];
|
|
- u8 reserved_at_1c[0x2];
|
|
+ u8 tunnel_lro_gre[0x1];
|
|
+ u8 tunnel_lro_vxlan[0x1];
|
|
u8 tunnel_stateless_gre[0x1];
|
|
u8 tunnel_stateless_vxlan[0x1];
|
|
|
|
diff --git a/include/linux/power/max17042_battery.h b/include/linux/power/max17042_battery.h
|
|
index d55c746ac56e2..e00ad1cfb1f1d 100644
|
|
--- a/include/linux/power/max17042_battery.h
|
|
+++ b/include/linux/power/max17042_battery.h
|
|
@@ -69,7 +69,7 @@ enum max17042_register {
|
|
MAX17042_RelaxCFG = 0x2A,
|
|
MAX17042_MiscCFG = 0x2B,
|
|
MAX17042_TGAIN = 0x2C,
|
|
- MAx17042_TOFF = 0x2D,
|
|
+ MAX17042_TOFF = 0x2D,
|
|
MAX17042_CGAIN = 0x2E,
|
|
MAX17042_COFF = 0x2F,
|
|
|
|
diff --git a/include/linux/time64.h b/include/linux/time64.h
|
|
index 5117cb5b56561..81b9686a20799 100644
|
|
--- a/include/linux/time64.h
|
|
+++ b/include/linux/time64.h
|
|
@@ -25,7 +25,9 @@ struct itimerspec64 {
|
|
#define TIME64_MIN (-TIME64_MAX - 1)
|
|
|
|
#define KTIME_MAX ((s64)~((u64)1 << 63))
|
|
+#define KTIME_MIN (-KTIME_MAX - 1)
|
|
#define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC)
|
|
+#define KTIME_SEC_MIN (KTIME_MIN / NSEC_PER_SEC)
|
|
|
|
/*
|
|
* Limits for settimeofday():
|
|
@@ -124,10 +126,13 @@ static inline bool timespec64_valid_settod(const struct timespec64 *ts)
|
|
*/
|
|
static inline s64 timespec64_to_ns(const struct timespec64 *ts)
|
|
{
|
|
- /* Prevent multiplication overflow */
|
|
- if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX)
|
|
+ /* Prevent multiplication overflow / underflow */
|
|
+ if (ts->tv_sec >= KTIME_SEC_MAX)
|
|
return KTIME_MAX;
|
|
|
|
+ if (ts->tv_sec <= KTIME_SEC_MIN)
|
|
+ return KTIME_MIN;
|
|
+
|
|
return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
|
|
}
|
|
|
|
diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
|
|
index cc9cdbc66403f..fdfef7fe40df9 100644
|
|
--- a/include/soc/bcm2835/raspberrypi-firmware.h
|
|
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
|
|
@@ -140,6 +140,7 @@ int rpi_firmware_property(struct rpi_firmware *fw,
|
|
u32 tag, void *data, size_t len);
|
|
int rpi_firmware_property_list(struct rpi_firmware *fw,
|
|
void *data, size_t tag_size);
|
|
+void rpi_firmware_put(struct rpi_firmware *fw);
|
|
struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node);
|
|
#else
|
|
static inline int rpi_firmware_property(struct rpi_firmware *fw, u32 tag,
|
|
@@ -154,6 +155,7 @@ static inline int rpi_firmware_property_list(struct rpi_firmware *fw,
|
|
return -ENOSYS;
|
|
}
|
|
|
|
+static inline void rpi_firmware_put(struct rpi_firmware *fw) { }
|
|
static inline struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node)
|
|
{
|
|
return NULL;
|
|
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
|
|
index 556216dc97030..762bf87c26a3e 100644
|
|
--- a/include/uapi/linux/bpf.h
|
|
+++ b/include/uapi/linux/bpf.h
|
|
@@ -2450,7 +2450,7 @@ union bpf_attr {
|
|
* long bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags)
|
|
* Description
|
|
* Select a **SO_REUSEPORT** socket from a
|
|
- * **BPF_MAP_TYPE_REUSEPORT_ARRAY** *map*.
|
|
+ * **BPF_MAP_TYPE_REUSEPORT_SOCKARRAY** *map*.
|
|
* It checks the selected socket is matching the incoming
|
|
* request in the socket buffer.
|
|
* Return
|
|
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
|
|
index 29d4f4e375954..cba1f86e75cdb 100644
|
|
--- a/kernel/bpf/verifier.c
|
|
+++ b/kernel/bpf/verifier.c
|
|
@@ -10456,10 +10456,11 @@ static void convert_pseudo_ld_imm64(struct bpf_verifier_env *env)
|
|
* insni[off, off + cnt). Adjust corresponding insn_aux_data by copying
|
|
* [0, off) and [off, end) to new locations, so the patched range stays zero
|
|
*/
|
|
-static int adjust_insn_aux_data(struct bpf_verifier_env *env,
|
|
- struct bpf_prog *new_prog, u32 off, u32 cnt)
|
|
+static void adjust_insn_aux_data(struct bpf_verifier_env *env,
|
|
+ struct bpf_insn_aux_data *new_data,
|
|
+ struct bpf_prog *new_prog, u32 off, u32 cnt)
|
|
{
|
|
- struct bpf_insn_aux_data *new_data, *old_data = env->insn_aux_data;
|
|
+ struct bpf_insn_aux_data *old_data = env->insn_aux_data;
|
|
struct bpf_insn *insn = new_prog->insnsi;
|
|
u32 old_seen = old_data[off].seen;
|
|
u32 prog_len;
|
|
@@ -10472,12 +10473,9 @@ static int adjust_insn_aux_data(struct bpf_verifier_env *env,
|
|
old_data[off].zext_dst = insn_has_def32(env, insn + off + cnt - 1);
|
|
|
|
if (cnt == 1)
|
|
- return 0;
|
|
+ return;
|
|
prog_len = new_prog->len;
|
|
- new_data = vzalloc(array_size(prog_len,
|
|
- sizeof(struct bpf_insn_aux_data)));
|
|
- if (!new_data)
|
|
- return -ENOMEM;
|
|
+
|
|
memcpy(new_data, old_data, sizeof(struct bpf_insn_aux_data) * off);
|
|
memcpy(new_data + off + cnt - 1, old_data + off,
|
|
sizeof(struct bpf_insn_aux_data) * (prog_len - off - cnt + 1));
|
|
@@ -10488,7 +10486,6 @@ static int adjust_insn_aux_data(struct bpf_verifier_env *env,
|
|
}
|
|
env->insn_aux_data = new_data;
|
|
vfree(old_data);
|
|
- return 0;
|
|
}
|
|
|
|
static void adjust_subprog_starts(struct bpf_verifier_env *env, u32 off, u32 len)
|
|
@@ -10523,6 +10520,14 @@ static struct bpf_prog *bpf_patch_insn_data(struct bpf_verifier_env *env, u32 of
|
|
const struct bpf_insn *patch, u32 len)
|
|
{
|
|
struct bpf_prog *new_prog;
|
|
+ struct bpf_insn_aux_data *new_data = NULL;
|
|
+
|
|
+ if (len > 1) {
|
|
+ new_data = vzalloc(array_size(env->prog->len + len - 1,
|
|
+ sizeof(struct bpf_insn_aux_data)));
|
|
+ if (!new_data)
|
|
+ return NULL;
|
|
+ }
|
|
|
|
new_prog = bpf_patch_insn_single(env->prog, off, patch, len);
|
|
if (IS_ERR(new_prog)) {
|
|
@@ -10530,10 +10535,10 @@ static struct bpf_prog *bpf_patch_insn_data(struct bpf_verifier_env *env, u32 of
|
|
verbose(env,
|
|
"insn %d cannot be patched due to 16-bit range\n",
|
|
env->insn_aux_data[off].orig_idx);
|
|
+ vfree(new_data);
|
|
return NULL;
|
|
}
|
|
- if (adjust_insn_aux_data(env, new_prog, off, len))
|
|
- return NULL;
|
|
+ adjust_insn_aux_data(env, new_data, new_prog, off, len);
|
|
adjust_subprog_starts(env, off, len);
|
|
adjust_poke_descs(new_prog, off, len);
|
|
return new_prog;
|
|
@@ -11033,6 +11038,10 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)
|
|
if (is_narrower_load && size < target_size) {
|
|
u8 shift = bpf_ctx_narrow_access_offset(
|
|
off, size, size_default) * 8;
|
|
+ if (shift && cnt + 1 >= ARRAY_SIZE(insn_buf)) {
|
|
+ verbose(env, "bpf verifier narrow ctx load misconfigured\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
if (ctx_field_size <= 4) {
|
|
if (shift)
|
|
insn_buf[cnt++] = BPF_ALU32_IMM(BPF_RSH,
|
|
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
|
|
index 53c70c470a38d..1999fcec45c71 100644
|
|
--- a/kernel/cgroup/cpuset.c
|
|
+++ b/kernel/cgroup/cpuset.c
|
|
@@ -1114,7 +1114,7 @@ enum subparts_cmd {
|
|
* cpus_allowed can be granted or an error code will be returned.
|
|
*
|
|
* For partcmd_disable, the cpuset is being transofrmed from a partition
|
|
- * root back to a non-partition root. any CPUs in cpus_allowed that are in
|
|
+ * root back to a non-partition root. Any CPUs in cpus_allowed that are in
|
|
* parent's subparts_cpus will be taken away from that cpumask and put back
|
|
* into parent's effective_cpus. 0 should always be returned.
|
|
*
|
|
@@ -1148,6 +1148,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,
|
|
struct cpuset *parent = parent_cs(cpuset);
|
|
int adding; /* Moving cpus from effective_cpus to subparts_cpus */
|
|
int deleting; /* Moving cpus from subparts_cpus to effective_cpus */
|
|
+ int new_prs;
|
|
bool part_error = false; /* Partition error? */
|
|
|
|
percpu_rwsem_assert_held(&cpuset_rwsem);
|
|
@@ -1183,6 +1184,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,
|
|
* A cpumask update cannot make parent's effective_cpus become empty.
|
|
*/
|
|
adding = deleting = false;
|
|
+ new_prs = cpuset->partition_root_state;
|
|
if (cmd == partcmd_enable) {
|
|
cpumask_copy(tmp->addmask, cpuset->cpus_allowed);
|
|
adding = true;
|
|
@@ -1225,7 +1227,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,
|
|
/*
|
|
* partcmd_update w/o newmask:
|
|
*
|
|
- * addmask = cpus_allowed & parent->effectiveb_cpus
|
|
+ * addmask = cpus_allowed & parent->effective_cpus
|
|
*
|
|
* Note that parent's subparts_cpus may have been
|
|
* pre-shrunk in case there is a change in the cpu list.
|
|
@@ -1247,11 +1249,11 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,
|
|
switch (cpuset->partition_root_state) {
|
|
case PRS_ENABLED:
|
|
if (part_error)
|
|
- cpuset->partition_root_state = PRS_ERROR;
|
|
+ new_prs = PRS_ERROR;
|
|
break;
|
|
case PRS_ERROR:
|
|
if (!part_error)
|
|
- cpuset->partition_root_state = PRS_ENABLED;
|
|
+ new_prs = PRS_ENABLED;
|
|
break;
|
|
}
|
|
/*
|
|
@@ -1260,10 +1262,10 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,
|
|
part_error = (prev_prs == PRS_ERROR);
|
|
}
|
|
|
|
- if (!part_error && (cpuset->partition_root_state == PRS_ERROR))
|
|
+ if (!part_error && (new_prs == PRS_ERROR))
|
|
return 0; /* Nothing need to be done */
|
|
|
|
- if (cpuset->partition_root_state == PRS_ERROR) {
|
|
+ if (new_prs == PRS_ERROR) {
|
|
/*
|
|
* Remove all its cpus from parent's subparts_cpus.
|
|
*/
|
|
@@ -1272,7 +1274,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,
|
|
parent->subparts_cpus);
|
|
}
|
|
|
|
- if (!adding && !deleting)
|
|
+ if (!adding && !deleting && (new_prs == cpuset->partition_root_state))
|
|
return 0;
|
|
|
|
/*
|
|
@@ -1299,6 +1301,9 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,
|
|
}
|
|
|
|
parent->nr_subparts_cpus = cpumask_weight(parent->subparts_cpus);
|
|
+
|
|
+ if (cpuset->partition_root_state != new_prs)
|
|
+ cpuset->partition_root_state = new_prs;
|
|
spin_unlock_irq(&callback_lock);
|
|
|
|
return cmd == partcmd_update;
|
|
@@ -1321,6 +1326,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)
|
|
struct cpuset *cp;
|
|
struct cgroup_subsys_state *pos_css;
|
|
bool need_rebuild_sched_domains = false;
|
|
+ int new_prs;
|
|
|
|
rcu_read_lock();
|
|
cpuset_for_each_descendant_pre(cp, pos_css, cs) {
|
|
@@ -1360,17 +1366,18 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)
|
|
* update_tasks_cpumask() again for tasks in the parent
|
|
* cpuset if the parent's subparts_cpus changes.
|
|
*/
|
|
- if ((cp != cs) && cp->partition_root_state) {
|
|
+ new_prs = cp->partition_root_state;
|
|
+ if ((cp != cs) && new_prs) {
|
|
switch (parent->partition_root_state) {
|
|
case PRS_DISABLED:
|
|
/*
|
|
* If parent is not a partition root or an
|
|
- * invalid partition root, clear the state
|
|
- * state and the CS_CPU_EXCLUSIVE flag.
|
|
+ * invalid partition root, clear its state
|
|
+ * and its CS_CPU_EXCLUSIVE flag.
|
|
*/
|
|
WARN_ON_ONCE(cp->partition_root_state
|
|
!= PRS_ERROR);
|
|
- cp->partition_root_state = 0;
|
|
+ new_prs = PRS_DISABLED;
|
|
|
|
/*
|
|
* clear_bit() is an atomic operation and
|
|
@@ -1391,11 +1398,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)
|
|
/*
|
|
* When parent is invalid, it has to be too.
|
|
*/
|
|
- cp->partition_root_state = PRS_ERROR;
|
|
- if (cp->nr_subparts_cpus) {
|
|
- cp->nr_subparts_cpus = 0;
|
|
- cpumask_clear(cp->subparts_cpus);
|
|
- }
|
|
+ new_prs = PRS_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
@@ -1407,8 +1410,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)
|
|
spin_lock_irq(&callback_lock);
|
|
|
|
cpumask_copy(cp->effective_cpus, tmp->new_cpus);
|
|
- if (cp->nr_subparts_cpus &&
|
|
- (cp->partition_root_state != PRS_ENABLED)) {
|
|
+ if (cp->nr_subparts_cpus && (new_prs != PRS_ENABLED)) {
|
|
cp->nr_subparts_cpus = 0;
|
|
cpumask_clear(cp->subparts_cpus);
|
|
} else if (cp->nr_subparts_cpus) {
|
|
@@ -1435,6 +1437,10 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)
|
|
= cpumask_weight(cp->subparts_cpus);
|
|
}
|
|
}
|
|
+
|
|
+ if (new_prs != cp->partition_root_state)
|
|
+ cp->partition_root_state = new_prs;
|
|
+
|
|
spin_unlock_irq(&callback_lock);
|
|
|
|
WARN_ON(!is_in_v2_mode() &&
|
|
@@ -1937,34 +1943,32 @@ out:
|
|
|
|
/*
|
|
* update_prstate - update partititon_root_state
|
|
- * cs: the cpuset to update
|
|
- * val: 0 - disabled, 1 - enabled
|
|
+ * cs: the cpuset to update
|
|
+ * new_prs: new partition root state
|
|
*
|
|
* Call with cpuset_mutex held.
|
|
*/
|
|
-static int update_prstate(struct cpuset *cs, int val)
|
|
+static int update_prstate(struct cpuset *cs, int new_prs)
|
|
{
|
|
- int err;
|
|
+ int err, old_prs = cs->partition_root_state;
|
|
struct cpuset *parent = parent_cs(cs);
|
|
- struct tmpmasks tmp;
|
|
+ struct tmpmasks tmpmask;
|
|
|
|
- if ((val != 0) && (val != 1))
|
|
- return -EINVAL;
|
|
- if (val == cs->partition_root_state)
|
|
+ if (old_prs == new_prs)
|
|
return 0;
|
|
|
|
/*
|
|
* Cannot force a partial or invalid partition root to a full
|
|
* partition root.
|
|
*/
|
|
- if (val && cs->partition_root_state)
|
|
+ if (new_prs && (old_prs == PRS_ERROR))
|
|
return -EINVAL;
|
|
|
|
- if (alloc_cpumasks(NULL, &tmp))
|
|
+ if (alloc_cpumasks(NULL, &tmpmask))
|
|
return -ENOMEM;
|
|
|
|
err = -EINVAL;
|
|
- if (!cs->partition_root_state) {
|
|
+ if (!old_prs) {
|
|
/*
|
|
* Turning on partition root requires setting the
|
|
* CS_CPU_EXCLUSIVE bit implicitly as well and cpus_allowed
|
|
@@ -1978,31 +1982,27 @@ static int update_prstate(struct cpuset *cs, int val)
|
|
goto out;
|
|
|
|
err = update_parent_subparts_cpumask(cs, partcmd_enable,
|
|
- NULL, &tmp);
|
|
+ NULL, &tmpmask);
|
|
if (err) {
|
|
update_flag(CS_CPU_EXCLUSIVE, cs, 0);
|
|
goto out;
|
|
}
|
|
- cs->partition_root_state = PRS_ENABLED;
|
|
} else {
|
|
/*
|
|
* Turning off partition root will clear the
|
|
* CS_CPU_EXCLUSIVE bit.
|
|
*/
|
|
- if (cs->partition_root_state == PRS_ERROR) {
|
|
- cs->partition_root_state = 0;
|
|
+ if (old_prs == PRS_ERROR) {
|
|
update_flag(CS_CPU_EXCLUSIVE, cs, 0);
|
|
err = 0;
|
|
goto out;
|
|
}
|
|
|
|
err = update_parent_subparts_cpumask(cs, partcmd_disable,
|
|
- NULL, &tmp);
|
|
+ NULL, &tmpmask);
|
|
if (err)
|
|
goto out;
|
|
|
|
- cs->partition_root_state = 0;
|
|
-
|
|
/* Turning off CS_CPU_EXCLUSIVE will not return error */
|
|
update_flag(CS_CPU_EXCLUSIVE, cs, 0);
|
|
}
|
|
@@ -2015,11 +2015,17 @@ static int update_prstate(struct cpuset *cs, int val)
|
|
update_tasks_cpumask(parent);
|
|
|
|
if (parent->child_ecpus_count)
|
|
- update_sibling_cpumasks(parent, cs, &tmp);
|
|
+ update_sibling_cpumasks(parent, cs, &tmpmask);
|
|
|
|
rebuild_sched_domains_locked();
|
|
out:
|
|
- free_cpumasks(NULL, &tmp);
|
|
+ if (!err) {
|
|
+ spin_lock_irq(&callback_lock);
|
|
+ cs->partition_root_state = new_prs;
|
|
+ spin_unlock_irq(&callback_lock);
|
|
+ }
|
|
+
|
|
+ free_cpumasks(NULL, &tmpmask);
|
|
return err;
|
|
}
|
|
|
|
@@ -3060,7 +3066,7 @@ retry:
|
|
goto retry;
|
|
}
|
|
|
|
- parent = parent_cs(cs);
|
|
+ parent = parent_cs(cs);
|
|
compute_effective_cpumask(&new_cpus, cs, parent);
|
|
nodes_and(new_mems, cs->mems_allowed, parent->effective_mems);
|
|
|
|
@@ -3082,8 +3088,10 @@ retry:
|
|
if (is_partition_root(cs) && (cpumask_empty(&new_cpus) ||
|
|
(parent->partition_root_state == PRS_ERROR))) {
|
|
if (cs->nr_subparts_cpus) {
|
|
+ spin_lock_irq(&callback_lock);
|
|
cs->nr_subparts_cpus = 0;
|
|
cpumask_clear(cs->subparts_cpus);
|
|
+ spin_unlock_irq(&callback_lock);
|
|
compute_effective_cpumask(&new_cpus, cs, parent);
|
|
}
|
|
|
|
@@ -3097,7 +3105,9 @@ retry:
|
|
cpumask_empty(&new_cpus)) {
|
|
update_parent_subparts_cpumask(cs, partcmd_disable,
|
|
NULL, tmp);
|
|
+ spin_lock_irq(&callback_lock);
|
|
cs->partition_root_state = PRS_ERROR;
|
|
+ spin_unlock_irq(&callback_lock);
|
|
}
|
|
cpuset_force_rebuild();
|
|
}
|
|
@@ -3168,6 +3178,13 @@ static void cpuset_hotplug_workfn(struct work_struct *work)
|
|
cpus_updated = !cpumask_equal(top_cpuset.effective_cpus, &new_cpus);
|
|
mems_updated = !nodes_equal(top_cpuset.effective_mems, new_mems);
|
|
|
|
+ /*
|
|
+ * In the rare case that hotplug removes all the cpus in subparts_cpus,
|
|
+ * we assumed that cpus are updated.
|
|
+ */
|
|
+ if (!cpus_updated && top_cpuset.nr_subparts_cpus)
|
|
+ cpus_updated = true;
|
|
+
|
|
/* synchronize cpus_allowed to cpu_active_mask */
|
|
if (cpus_updated) {
|
|
spin_lock_irq(&callback_lock);
|
|
diff --git a/kernel/cpu_pm.c b/kernel/cpu_pm.c
|
|
index f7e1d0eccdbc6..246efc74e3f34 100644
|
|
--- a/kernel/cpu_pm.c
|
|
+++ b/kernel/cpu_pm.c
|
|
@@ -13,19 +13,32 @@
|
|
#include <linux/spinlock.h>
|
|
#include <linux/syscore_ops.h>
|
|
|
|
-static ATOMIC_NOTIFIER_HEAD(cpu_pm_notifier_chain);
|
|
+/*
|
|
+ * atomic_notifiers use a spinlock_t, which can block under PREEMPT_RT.
|
|
+ * Notifications for cpu_pm will be issued by the idle task itself, which can
|
|
+ * never block, IOW it requires using a raw_spinlock_t.
|
|
+ */
|
|
+static struct {
|
|
+ struct raw_notifier_head chain;
|
|
+ raw_spinlock_t lock;
|
|
+} cpu_pm_notifier = {
|
|
+ .chain = RAW_NOTIFIER_INIT(cpu_pm_notifier.chain),
|
|
+ .lock = __RAW_SPIN_LOCK_UNLOCKED(cpu_pm_notifier.lock),
|
|
+};
|
|
|
|
static int cpu_pm_notify(enum cpu_pm_event event)
|
|
{
|
|
int ret;
|
|
|
|
/*
|
|
- * atomic_notifier_call_chain has a RCU read critical section, which
|
|
- * could be disfunctional in cpu idle. Copy RCU_NONIDLE code to let
|
|
- * RCU know this.
|
|
+ * This introduces a RCU read critical section, which could be
|
|
+ * disfunctional in cpu idle. Copy RCU_NONIDLE code to let RCU know
|
|
+ * this.
|
|
*/
|
|
rcu_irq_enter_irqson();
|
|
- ret = atomic_notifier_call_chain(&cpu_pm_notifier_chain, event, NULL);
|
|
+ rcu_read_lock();
|
|
+ ret = raw_notifier_call_chain(&cpu_pm_notifier.chain, event, NULL);
|
|
+ rcu_read_unlock();
|
|
rcu_irq_exit_irqson();
|
|
|
|
return notifier_to_errno(ret);
|
|
@@ -33,10 +46,13 @@ static int cpu_pm_notify(enum cpu_pm_event event)
|
|
|
|
static int cpu_pm_notify_robust(enum cpu_pm_event event_up, enum cpu_pm_event event_down)
|
|
{
|
|
+ unsigned long flags;
|
|
int ret;
|
|
|
|
rcu_irq_enter_irqson();
|
|
- ret = atomic_notifier_call_chain_robust(&cpu_pm_notifier_chain, event_up, event_down, NULL);
|
|
+ raw_spin_lock_irqsave(&cpu_pm_notifier.lock, flags);
|
|
+ ret = raw_notifier_call_chain_robust(&cpu_pm_notifier.chain, event_up, event_down, NULL);
|
|
+ raw_spin_unlock_irqrestore(&cpu_pm_notifier.lock, flags);
|
|
rcu_irq_exit_irqson();
|
|
|
|
return notifier_to_errno(ret);
|
|
@@ -49,12 +65,17 @@ static int cpu_pm_notify_robust(enum cpu_pm_event event_up, enum cpu_pm_event ev
|
|
* Add a driver to a list of drivers that are notified about
|
|
* CPU and CPU cluster low power entry and exit.
|
|
*
|
|
- * This function may sleep, and has the same return conditions as
|
|
- * raw_notifier_chain_register.
|
|
+ * This function has the same return conditions as raw_notifier_chain_register.
|
|
*/
|
|
int cpu_pm_register_notifier(struct notifier_block *nb)
|
|
{
|
|
- return atomic_notifier_chain_register(&cpu_pm_notifier_chain, nb);
|
|
+ unsigned long flags;
|
|
+ int ret;
|
|
+
|
|
+ raw_spin_lock_irqsave(&cpu_pm_notifier.lock, flags);
|
|
+ ret = raw_notifier_chain_register(&cpu_pm_notifier.chain, nb);
|
|
+ raw_spin_unlock_irqrestore(&cpu_pm_notifier.lock, flags);
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL_GPL(cpu_pm_register_notifier);
|
|
|
|
@@ -64,12 +85,17 @@ EXPORT_SYMBOL_GPL(cpu_pm_register_notifier);
|
|
*
|
|
* Remove a driver from the CPU PM notifier list.
|
|
*
|
|
- * This function may sleep, and has the same return conditions as
|
|
- * raw_notifier_chain_unregister.
|
|
+ * This function has the same return conditions as raw_notifier_chain_unregister.
|
|
*/
|
|
int cpu_pm_unregister_notifier(struct notifier_block *nb)
|
|
{
|
|
- return atomic_notifier_chain_unregister(&cpu_pm_notifier_chain, nb);
|
|
+ unsigned long flags;
|
|
+ int ret;
|
|
+
|
|
+ raw_spin_lock_irqsave(&cpu_pm_notifier.lock, flags);
|
|
+ ret = raw_notifier_chain_unregister(&cpu_pm_notifier.chain, nb);
|
|
+ raw_spin_unlock_irqrestore(&cpu_pm_notifier.lock, flags);
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL_GPL(cpu_pm_unregister_notifier);
|
|
|
|
diff --git a/kernel/irq/timings.c b/kernel/irq/timings.c
|
|
index 6990490fa67be..1f981162648a3 100644
|
|
--- a/kernel/irq/timings.c
|
|
+++ b/kernel/irq/timings.c
|
|
@@ -799,12 +799,14 @@ static int __init irq_timings_test_irqs(struct timings_intervals *ti)
|
|
|
|
__irq_timings_store(irq, irqs, ti->intervals[i]);
|
|
if (irqs->circ_timings[i & IRQ_TIMINGS_MASK] != index) {
|
|
+ ret = -EBADSLT;
|
|
pr_err("Failed to store in the circular buffer\n");
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
if (irqs->count != ti->count) {
|
|
+ ret = -ERANGE;
|
|
pr_err("Count differs\n");
|
|
goto out;
|
|
}
|
|
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
|
|
index 8ae9d7abebc08..5184f68968158 100644
|
|
--- a/kernel/locking/lockdep.c
|
|
+++ b/kernel/locking/lockdep.c
|
|
@@ -1293,6 +1293,7 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force)
|
|
class->name_version = count_matching_names(class);
|
|
class->wait_type_inner = lock->wait_type_inner;
|
|
class->wait_type_outer = lock->wait_type_outer;
|
|
+ class->lock_type = lock->lock_type;
|
|
/*
|
|
* We use RCU's safe list-add method to make
|
|
* parallel walking of the hash-list safe:
|
|
@@ -4621,9 +4622,9 @@ print_lock_invalid_wait_context(struct task_struct *curr,
|
|
*/
|
|
static int check_wait_context(struct task_struct *curr, struct held_lock *next)
|
|
{
|
|
- short next_inner = hlock_class(next)->wait_type_inner;
|
|
- short next_outer = hlock_class(next)->wait_type_outer;
|
|
- short curr_inner;
|
|
+ u8 next_inner = hlock_class(next)->wait_type_inner;
|
|
+ u8 next_outer = hlock_class(next)->wait_type_outer;
|
|
+ u8 curr_inner;
|
|
int depth;
|
|
|
|
if (!next_inner || next->trylock)
|
|
@@ -4646,7 +4647,7 @@ static int check_wait_context(struct task_struct *curr, struct held_lock *next)
|
|
|
|
for (; depth < curr->lockdep_depth; depth++) {
|
|
struct held_lock *prev = curr->held_locks + depth;
|
|
- short prev_inner = hlock_class(prev)->wait_type_inner;
|
|
+ u8 prev_inner = hlock_class(prev)->wait_type_inner;
|
|
|
|
if (prev_inner) {
|
|
/*
|
|
@@ -4695,9 +4696,9 @@ static inline int check_wait_context(struct task_struct *curr,
|
|
/*
|
|
* Initialize a lock instance's lock-class mapping info:
|
|
*/
|
|
-void lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
|
|
+void lockdep_init_map_type(struct lockdep_map *lock, const char *name,
|
|
struct lock_class_key *key, int subclass,
|
|
- short inner, short outer)
|
|
+ u8 inner, u8 outer, u8 lock_type)
|
|
{
|
|
int i;
|
|
|
|
@@ -4720,6 +4721,7 @@ void lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
|
|
|
|
lock->wait_type_outer = outer;
|
|
lock->wait_type_inner = inner;
|
|
+ lock->lock_type = lock_type;
|
|
|
|
/*
|
|
* No key, no joy, we need to hash something.
|
|
@@ -4754,7 +4756,7 @@ void lockdep_init_map_waits(struct lockdep_map *lock, const char *name,
|
|
raw_local_irq_restore(flags);
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(lockdep_init_map_waits);
|
|
+EXPORT_SYMBOL_GPL(lockdep_init_map_type);
|
|
|
|
struct lock_class_key __lockdep_no_validate__;
|
|
EXPORT_SYMBOL_GPL(__lockdep_no_validate__);
|
|
diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c
|
|
index 15ac7c4bb1117..86061901636cc 100644
|
|
--- a/kernel/locking/mutex.c
|
|
+++ b/kernel/locking/mutex.c
|
|
@@ -938,7 +938,6 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
|
|
struct ww_acquire_ctx *ww_ctx, const bool use_ww_ctx)
|
|
{
|
|
struct mutex_waiter waiter;
|
|
- bool first = false;
|
|
struct ww_mutex *ww;
|
|
int ret;
|
|
|
|
@@ -1017,6 +1016,8 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
|
|
|
|
set_current_state(state);
|
|
for (;;) {
|
|
+ bool first;
|
|
+
|
|
/*
|
|
* Once we hold wait_lock, we're serialized against
|
|
* mutex_unlock() handing the lock off to us, do a trylock
|
|
@@ -1045,15 +1046,9 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
|
|
spin_unlock(&lock->wait_lock);
|
|
schedule_preempt_disabled();
|
|
|
|
- /*
|
|
- * ww_mutex needs to always recheck its position since its waiter
|
|
- * list is not FIFO ordered.
|
|
- */
|
|
- if (ww_ctx || !first) {
|
|
- first = __mutex_waiter_is_first(lock, &waiter);
|
|
- if (first)
|
|
- __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF);
|
|
- }
|
|
+ first = __mutex_waiter_is_first(lock, &waiter);
|
|
+ if (first)
|
|
+ __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF);
|
|
|
|
set_current_state(state);
|
|
/*
|
|
diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c
|
|
index 994ca8353543a..be381eb6116a1 100644
|
|
--- a/kernel/power/energy_model.c
|
|
+++ b/kernel/power/energy_model.c
|
|
@@ -157,7 +157,9 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,
|
|
/* Compute the cost of each performance state. */
|
|
fmax = (u64) table[nr_states - 1].frequency;
|
|
for (i = 0; i < nr_states; i++) {
|
|
- table[i].cost = div64_u64(fmax * table[i].power,
|
|
+ unsigned long power_res = em_scale_power(table[i].power);
|
|
+
|
|
+ table[i].cost = div64_u64(fmax * power_res,
|
|
table[i].frequency);
|
|
}
|
|
|
|
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
|
|
index 8c3ba0185082d..8c81c05c4236a 100644
|
|
--- a/kernel/rcu/tree.c
|
|
+++ b/kernel/rcu/tree.c
|
|
@@ -2561,6 +2561,7 @@ static void rcu_do_batch(struct rcu_data *rdp)
|
|
void rcu_sched_clock_irq(int user)
|
|
{
|
|
trace_rcu_utilization(TPS("Start scheduler-tick"));
|
|
+ lockdep_assert_irqs_disabled();
|
|
raw_cpu_inc(rcu_data.ticks_this_gp);
|
|
/* The load-acquire pairs with the store-release setting to true. */
|
|
if (smp_load_acquire(this_cpu_ptr(&rcu_data.rcu_urgent_qs))) {
|
|
@@ -2574,6 +2575,7 @@ void rcu_sched_clock_irq(int user)
|
|
rcu_flavor_sched_clock_irq(user);
|
|
if (rcu_pending(user))
|
|
invoke_rcu_core();
|
|
+ lockdep_assert_irqs_disabled();
|
|
|
|
trace_rcu_utilization(TPS("End scheduler-tick"));
|
|
}
|
|
@@ -3730,6 +3732,8 @@ static int rcu_pending(int user)
|
|
struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
|
|
struct rcu_node *rnp = rdp->mynode;
|
|
|
|
+ lockdep_assert_irqs_disabled();
|
|
+
|
|
/* Check for CPU stalls, if enabled. */
|
|
check_cpu_stall(rdp);
|
|
|
|
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
|
|
index 7d4f78bf40577..574aeaac9272d 100644
|
|
--- a/kernel/rcu/tree_plugin.h
|
|
+++ b/kernel/rcu/tree_plugin.h
|
|
@@ -682,6 +682,7 @@ static void rcu_flavor_sched_clock_irq(int user)
|
|
{
|
|
struct task_struct *t = current;
|
|
|
|
+ lockdep_assert_irqs_disabled();
|
|
if (user || rcu_is_cpu_rrupt_from_idle()) {
|
|
rcu_note_voluntary_context_switch(current);
|
|
}
|
|
diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h
|
|
index ca21d28a0f98f..251a9af3709af 100644
|
|
--- a/kernel/rcu/tree_stall.h
|
|
+++ b/kernel/rcu/tree_stall.h
|
|
@@ -7,6 +7,8 @@
|
|
* Author: Paul E. McKenney <paulmck@linux.ibm.com>
|
|
*/
|
|
|
|
+#include <linux/kvm_para.h>
|
|
+
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Controlling CPU stall warnings, including delay calculation.
|
|
@@ -260,8 +262,11 @@ static int rcu_print_task_stall(struct rcu_node *rnp, unsigned long flags)
|
|
struct task_struct *t;
|
|
struct task_struct *ts[8];
|
|
|
|
- if (!rcu_preempt_blocked_readers_cgp(rnp))
|
|
+ lockdep_assert_irqs_disabled();
|
|
+ if (!rcu_preempt_blocked_readers_cgp(rnp)) {
|
|
+ raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
|
|
return 0;
|
|
+ }
|
|
pr_err("\tTasks blocked on level-%d rcu_node (CPUs %d-%d):",
|
|
rnp->level, rnp->grplo, rnp->grphi);
|
|
t = list_entry(rnp->gp_tasks->prev,
|
|
@@ -273,8 +278,8 @@ static int rcu_print_task_stall(struct rcu_node *rnp, unsigned long flags)
|
|
break;
|
|
}
|
|
raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
|
|
- for (i--; i; i--) {
|
|
- t = ts[i];
|
|
+ while (i) {
|
|
+ t = ts[--i];
|
|
if (!try_invoke_on_locked_down_task(t, check_slow_task, &rscr))
|
|
pr_cont(" P%d", t->pid);
|
|
else
|
|
@@ -284,6 +289,7 @@ static int rcu_print_task_stall(struct rcu_node *rnp, unsigned long flags)
|
|
".q"[rscr.rs.b.need_qs],
|
|
".e"[rscr.rs.b.exp_hint],
|
|
".l"[rscr.on_blkd_list]);
|
|
+ lockdep_assert_irqs_disabled();
|
|
put_task_struct(t);
|
|
ndetected++;
|
|
}
|
|
@@ -472,6 +478,8 @@ static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps)
|
|
struct rcu_node *rnp;
|
|
long totqlen = 0;
|
|
|
|
+ lockdep_assert_irqs_disabled();
|
|
+
|
|
/* Kick and suppress, if so configured. */
|
|
rcu_stall_kick_kthreads();
|
|
if (rcu_stall_is_suppressed())
|
|
@@ -493,6 +501,7 @@ static void print_other_cpu_stall(unsigned long gp_seq, unsigned long gps)
|
|
}
|
|
}
|
|
ndetected += rcu_print_task_stall(rnp, flags); // Releases rnp->lock.
|
|
+ lockdep_assert_irqs_disabled();
|
|
}
|
|
|
|
for_each_possible_cpu(cpu)
|
|
@@ -538,6 +547,8 @@ static void print_cpu_stall(unsigned long gps)
|
|
struct rcu_node *rnp = rcu_get_root();
|
|
long totqlen = 0;
|
|
|
|
+ lockdep_assert_irqs_disabled();
|
|
+
|
|
/* Kick and suppress, if so configured. */
|
|
rcu_stall_kick_kthreads();
|
|
if (rcu_stall_is_suppressed())
|
|
@@ -592,6 +603,7 @@ static void check_cpu_stall(struct rcu_data *rdp)
|
|
unsigned long js;
|
|
struct rcu_node *rnp;
|
|
|
|
+ lockdep_assert_irqs_disabled();
|
|
if ((rcu_stall_is_suppressed() && !READ_ONCE(rcu_kick_kthreads)) ||
|
|
!rcu_gp_in_progress())
|
|
return;
|
|
@@ -633,6 +645,14 @@ static void check_cpu_stall(struct rcu_data *rdp)
|
|
(READ_ONCE(rnp->qsmask) & rdp->grpmask) &&
|
|
cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) {
|
|
|
|
+ /*
|
|
+ * If a virtual machine is stopped by the host it can look to
|
|
+ * the watchdog like an RCU stall. Check to see if the host
|
|
+ * stopped the vm.
|
|
+ */
|
|
+ if (kvm_check_and_clear_guest_paused())
|
|
+ return;
|
|
+
|
|
/* We haven't checked in, so go dump stack. */
|
|
print_cpu_stall(gps);
|
|
if (READ_ONCE(rcu_cpu_stall_ftrace_dump))
|
|
@@ -642,6 +662,14 @@ static void check_cpu_stall(struct rcu_data *rdp)
|
|
ULONG_CMP_GE(j, js + RCU_STALL_RAT_DELAY) &&
|
|
cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) {
|
|
|
|
+ /*
|
|
+ * If a virtual machine is stopped by the host it can look to
|
|
+ * the watchdog like an RCU stall. Check to see if the host
|
|
+ * stopped the vm.
|
|
+ */
|
|
+ if (kvm_check_and_clear_guest_paused())
|
|
+ return;
|
|
+
|
|
/* They had a few time units to dump stack, so complain. */
|
|
print_other_cpu_stall(gs2, gps);
|
|
if (READ_ONCE(rcu_cpu_stall_ftrace_dump))
|
|
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
|
index 84c105902027c..6db20a66e8e68 100644
|
|
--- a/kernel/sched/core.c
|
|
+++ b/kernel/sched/core.c
|
|
@@ -1279,6 +1279,23 @@ static inline void uclamp_rq_dec(struct rq *rq, struct task_struct *p)
|
|
uclamp_rq_dec_id(rq, p, clamp_id);
|
|
}
|
|
|
|
+static inline void uclamp_rq_reinc_id(struct rq *rq, struct task_struct *p,
|
|
+ enum uclamp_id clamp_id)
|
|
+{
|
|
+ if (!p->uclamp[clamp_id].active)
|
|
+ return;
|
|
+
|
|
+ uclamp_rq_dec_id(rq, p, clamp_id);
|
|
+ uclamp_rq_inc_id(rq, p, clamp_id);
|
|
+
|
|
+ /*
|
|
+ * Make sure to clear the idle flag if we've transiently reached 0
|
|
+ * active tasks on rq.
|
|
+ */
|
|
+ if (clamp_id == UCLAMP_MAX && (rq->uclamp_flags & UCLAMP_FLAG_IDLE))
|
|
+ rq->uclamp_flags &= ~UCLAMP_FLAG_IDLE;
|
|
+}
|
|
+
|
|
static inline void
|
|
uclamp_update_active(struct task_struct *p)
|
|
{
|
|
@@ -1302,12 +1319,8 @@ uclamp_update_active(struct task_struct *p)
|
|
* affecting a valid clamp bucket, the next time it's enqueued,
|
|
* it will already see the updated clamp bucket value.
|
|
*/
|
|
- for_each_clamp_id(clamp_id) {
|
|
- if (p->uclamp[clamp_id].active) {
|
|
- uclamp_rq_dec_id(rq, p, clamp_id);
|
|
- uclamp_rq_inc_id(rq, p, clamp_id);
|
|
- }
|
|
- }
|
|
+ for_each_clamp_id(clamp_id)
|
|
+ uclamp_rq_reinc_id(rq, p, clamp_id);
|
|
|
|
task_rq_unlock(rq, p, &rf);
|
|
}
|
|
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
|
|
index 6b98c1fe6e7f8..a3ae00c348a8b 100644
|
|
--- a/kernel/sched/deadline.c
|
|
+++ b/kernel/sched/deadline.c
|
|
@@ -1735,6 +1735,7 @@ static void migrate_task_rq_dl(struct task_struct *p, int new_cpu __maybe_unused
|
|
*/
|
|
raw_spin_lock(&rq->lock);
|
|
if (p->dl.dl_non_contending) {
|
|
+ update_rq_clock(rq);
|
|
sub_running_bw(&p->dl, &rq->dl);
|
|
p->dl.dl_non_contending = 0;
|
|
/*
|
|
@@ -2703,7 +2704,7 @@ void __setparam_dl(struct task_struct *p, const struct sched_attr *attr)
|
|
dl_se->dl_runtime = attr->sched_runtime;
|
|
dl_se->dl_deadline = attr->sched_deadline;
|
|
dl_se->dl_period = attr->sched_period ?: dl_se->dl_deadline;
|
|
- dl_se->flags = attr->sched_flags;
|
|
+ dl_se->flags = attr->sched_flags & SCHED_DL_FLAGS;
|
|
dl_se->dl_bw = to_ratio(dl_se->dl_period, dl_se->dl_runtime);
|
|
dl_se->dl_density = to_ratio(dl_se->dl_deadline, dl_se->dl_runtime);
|
|
}
|
|
@@ -2716,7 +2717,8 @@ void __getparam_dl(struct task_struct *p, struct sched_attr *attr)
|
|
attr->sched_runtime = dl_se->dl_runtime;
|
|
attr->sched_deadline = dl_se->dl_deadline;
|
|
attr->sched_period = dl_se->dl_period;
|
|
- attr->sched_flags = dl_se->flags;
|
|
+ attr->sched_flags &= ~SCHED_DL_FLAGS;
|
|
+ attr->sched_flags |= dl_se->flags;
|
|
}
|
|
|
|
/*
|
|
@@ -2813,7 +2815,7 @@ bool dl_param_changed(struct task_struct *p, const struct sched_attr *attr)
|
|
if (dl_se->dl_runtime != attr->sched_runtime ||
|
|
dl_se->dl_deadline != attr->sched_deadline ||
|
|
dl_se->dl_period != attr->sched_period ||
|
|
- dl_se->flags != attr->sched_flags)
|
|
+ dl_se->flags != (attr->sched_flags & SCHED_DL_FLAGS))
|
|
return true;
|
|
|
|
return false;
|
|
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
|
|
index bad97d35684d2..c004e3b89c324 100644
|
|
--- a/kernel/sched/fair.c
|
|
+++ b/kernel/sched/fair.c
|
|
@@ -1533,7 +1533,7 @@ static inline bool is_core_idle(int cpu)
|
|
if (cpu == sibling)
|
|
continue;
|
|
|
|
- if (!idle_cpu(cpu))
|
|
+ if (!idle_cpu(sibling))
|
|
return false;
|
|
}
|
|
#endif
|
|
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
|
|
index 39112ac7ab347..08db8e095e48f 100644
|
|
--- a/kernel/sched/sched.h
|
|
+++ b/kernel/sched/sched.h
|
|
@@ -226,6 +226,8 @@ static inline void update_avg(u64 *avg, u64 sample)
|
|
*/
|
|
#define SCHED_FLAG_SUGOV 0x10000000
|
|
|
|
+#define SCHED_DL_FLAGS (SCHED_FLAG_RECLAIM | SCHED_FLAG_DL_OVERRUN | SCHED_FLAG_SUGOV)
|
|
+
|
|
static inline bool dl_entity_is_special(struct sched_dl_entity *dl_se)
|
|
{
|
|
#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL
|
|
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
|
|
index 9505b1f21cdf8..4ef90718c1146 100644
|
|
--- a/kernel/time/hrtimer.c
|
|
+++ b/kernel/time/hrtimer.c
|
|
@@ -758,22 +758,6 @@ static void hrtimer_switch_to_hres(void)
|
|
retrigger_next_event(NULL);
|
|
}
|
|
|
|
-static void clock_was_set_work(struct work_struct *work)
|
|
-{
|
|
- clock_was_set();
|
|
-}
|
|
-
|
|
-static DECLARE_WORK(hrtimer_work, clock_was_set_work);
|
|
-
|
|
-/*
|
|
- * Called from timekeeping and resume code to reprogram the hrtimer
|
|
- * interrupt device on all cpus.
|
|
- */
|
|
-void clock_was_set_delayed(void)
|
|
-{
|
|
- schedule_work(&hrtimer_work);
|
|
-}
|
|
-
|
|
#else
|
|
|
|
static inline int hrtimer_is_hres_enabled(void) { return 0; }
|
|
@@ -891,6 +875,22 @@ void clock_was_set(void)
|
|
timerfd_clock_was_set();
|
|
}
|
|
|
|
+static void clock_was_set_work(struct work_struct *work)
|
|
+{
|
|
+ clock_was_set();
|
|
+}
|
|
+
|
|
+static DECLARE_WORK(hrtimer_work, clock_was_set_work);
|
|
+
|
|
+/*
|
|
+ * Called from timekeeping and resume code to reprogram the hrtimer
|
|
+ * interrupt device on all cpus and to notify timerfd.
|
|
+ */
|
|
+void clock_was_set_delayed(void)
|
|
+{
|
|
+ schedule_work(&hrtimer_work);
|
|
+}
|
|
+
|
|
/*
|
|
* During resume we might have to reprogram the high resolution timer
|
|
* interrupt on all online CPUs. However, all other CPUs will be
|
|
@@ -1030,12 +1030,13 @@ static void __remove_hrtimer(struct hrtimer *timer,
|
|
* remove hrtimer, called with base lock held
|
|
*/
|
|
static inline int
|
|
-remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base, bool restart)
|
|
+remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base,
|
|
+ bool restart, bool keep_local)
|
|
{
|
|
u8 state = timer->state;
|
|
|
|
if (state & HRTIMER_STATE_ENQUEUED) {
|
|
- int reprogram;
|
|
+ bool reprogram;
|
|
|
|
/*
|
|
* Remove the timer and force reprogramming when high
|
|
@@ -1048,8 +1049,16 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base, bool rest
|
|
debug_deactivate(timer);
|
|
reprogram = base->cpu_base == this_cpu_ptr(&hrtimer_bases);
|
|
|
|
+ /*
|
|
+ * If the timer is not restarted then reprogramming is
|
|
+ * required if the timer is local. If it is local and about
|
|
+ * to be restarted, avoid programming it twice (on removal
|
|
+ * and a moment later when it's requeued).
|
|
+ */
|
|
if (!restart)
|
|
state = HRTIMER_STATE_INACTIVE;
|
|
+ else
|
|
+ reprogram &= !keep_local;
|
|
|
|
__remove_hrtimer(timer, base, state, reprogram);
|
|
return 1;
|
|
@@ -1103,9 +1112,31 @@ static int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
|
|
struct hrtimer_clock_base *base)
|
|
{
|
|
struct hrtimer_clock_base *new_base;
|
|
+ bool force_local, first;
|
|
+
|
|
+ /*
|
|
+ * If the timer is on the local cpu base and is the first expiring
|
|
+ * timer then this might end up reprogramming the hardware twice
|
|
+ * (on removal and on enqueue). To avoid that by prevent the
|
|
+ * reprogram on removal, keep the timer local to the current CPU
|
|
+ * and enforce reprogramming after it is queued no matter whether
|
|
+ * it is the new first expiring timer again or not.
|
|
+ */
|
|
+ force_local = base->cpu_base == this_cpu_ptr(&hrtimer_bases);
|
|
+ force_local &= base->cpu_base->next_timer == timer;
|
|
|
|
- /* Remove an active timer from the queue: */
|
|
- remove_hrtimer(timer, base, true);
|
|
+ /*
|
|
+ * Remove an active timer from the queue. In case it is not queued
|
|
+ * on the current CPU, make sure that remove_hrtimer() updates the
|
|
+ * remote data correctly.
|
|
+ *
|
|
+ * If it's on the current CPU and the first expiring timer, then
|
|
+ * skip reprogramming, keep the timer local and enforce
|
|
+ * reprogramming later if it was the first expiring timer. This
|
|
+ * avoids programming the underlying clock event twice (once at
|
|
+ * removal and once after enqueue).
|
|
+ */
|
|
+ remove_hrtimer(timer, base, true, force_local);
|
|
|
|
if (mode & HRTIMER_MODE_REL)
|
|
tim = ktime_add_safe(tim, base->get_time());
|
|
@@ -1115,9 +1146,24 @@ static int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
|
|
hrtimer_set_expires_range_ns(timer, tim, delta_ns);
|
|
|
|
/* Switch the timer base, if necessary: */
|
|
- new_base = switch_hrtimer_base(timer, base, mode & HRTIMER_MODE_PINNED);
|
|
+ if (!force_local) {
|
|
+ new_base = switch_hrtimer_base(timer, base,
|
|
+ mode & HRTIMER_MODE_PINNED);
|
|
+ } else {
|
|
+ new_base = base;
|
|
+ }
|
|
+
|
|
+ first = enqueue_hrtimer(timer, new_base, mode);
|
|
+ if (!force_local)
|
|
+ return first;
|
|
|
|
- return enqueue_hrtimer(timer, new_base, mode);
|
|
+ /*
|
|
+ * Timer was forced to stay on the current CPU to avoid
|
|
+ * reprogramming on removal and enqueue. Force reprogram the
|
|
+ * hardware by evaluating the new first expiring timer.
|
|
+ */
|
|
+ hrtimer_force_reprogram(new_base->cpu_base, 1);
|
|
+ return 0;
|
|
}
|
|
|
|
/**
|
|
@@ -1183,7 +1229,7 @@ int hrtimer_try_to_cancel(struct hrtimer *timer)
|
|
base = lock_hrtimer_base(timer, &flags);
|
|
|
|
if (!hrtimer_callback_running(timer))
|
|
- ret = remove_hrtimer(timer, base, false);
|
|
+ ret = remove_hrtimer(timer, base, false, false);
|
|
|
|
unlock_hrtimer_base(timer, &flags);
|
|
|
|
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
|
|
index 08c033b802569..d3d42b7637a19 100644
|
|
--- a/kernel/time/posix-cpu-timers.c
|
|
+++ b/kernel/time/posix-cpu-timers.c
|
|
@@ -1346,8 +1346,6 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clkid,
|
|
}
|
|
}
|
|
|
|
- if (!*newval)
|
|
- return;
|
|
*newval += now;
|
|
}
|
|
|
|
diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h
|
|
index 7b24961367292..5294f5b1f9550 100644
|
|
--- a/kernel/time/tick-internal.h
|
|
+++ b/kernel/time/tick-internal.h
|
|
@@ -165,3 +165,6 @@ DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases);
|
|
|
|
extern u64 get_next_timer_interrupt(unsigned long basej, u64 basem);
|
|
void timer_clear_idle(void);
|
|
+
|
|
+void clock_was_set(void);
|
|
+void clock_was_set_delayed(void);
|
|
diff --git a/lib/mpi/mpiutil.c b/lib/mpi/mpiutil.c
|
|
index 3c63710c20c69..e6c4b3180ab1d 100644
|
|
--- a/lib/mpi/mpiutil.c
|
|
+++ b/lib/mpi/mpiutil.c
|
|
@@ -148,7 +148,7 @@ int mpi_resize(MPI a, unsigned nlimbs)
|
|
return 0; /* no need to do it */
|
|
|
|
if (a->d) {
|
|
- p = kmalloc_array(nlimbs, sizeof(mpi_limb_t), GFP_KERNEL);
|
|
+ p = kcalloc(nlimbs, sizeof(mpi_limb_t), GFP_KERNEL);
|
|
if (!p)
|
|
return -ENOMEM;
|
|
memcpy(p, a->d, a->alloced * sizeof(mpi_limb_t));
|
|
diff --git a/net/6lowpan/debugfs.c b/net/6lowpan/debugfs.c
|
|
index 1c140af06d527..600b9563bfc53 100644
|
|
--- a/net/6lowpan/debugfs.c
|
|
+++ b/net/6lowpan/debugfs.c
|
|
@@ -170,7 +170,8 @@ static void lowpan_dev_debugfs_ctx_init(struct net_device *dev,
|
|
struct dentry *root;
|
|
char buf[32];
|
|
|
|
- WARN_ON_ONCE(id > LOWPAN_IPHC_CTX_TABLE_SIZE);
|
|
+ if (WARN_ON_ONCE(id >= LOWPAN_IPHC_CTX_TABLE_SIZE))
|
|
+ return;
|
|
|
|
sprintf(buf, "%d", id);
|
|
|
|
diff --git a/net/bluetooth/cmtp/cmtp.h b/net/bluetooth/cmtp/cmtp.h
|
|
index c32638dddbf94..f6b9dc4e408f2 100644
|
|
--- a/net/bluetooth/cmtp/cmtp.h
|
|
+++ b/net/bluetooth/cmtp/cmtp.h
|
|
@@ -26,7 +26,7 @@
|
|
#include <linux/types.h>
|
|
#include <net/bluetooth/bluetooth.h>
|
|
|
|
-#define BTNAMSIZ 18
|
|
+#define BTNAMSIZ 21
|
|
|
|
/* CMTP ioctl defines */
|
|
#define CMTPCONNADD _IOW('C', 200, int)
|
|
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
|
|
index 65d3f54099637..a9097fb7eb825 100644
|
|
--- a/net/bluetooth/hci_core.c
|
|
+++ b/net/bluetooth/hci_core.c
|
|
@@ -1336,6 +1336,12 @@ int hci_inquiry(void __user *arg)
|
|
goto done;
|
|
}
|
|
|
|
+ /* Restrict maximum inquiry length to 60 seconds */
|
|
+ if (ir.length > 60) {
|
|
+ err = -EINVAL;
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
hci_dev_lock(hdev);
|
|
if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||
|
|
inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) {
|
|
@@ -1726,6 +1732,14 @@ int hci_dev_do_close(struct hci_dev *hdev)
|
|
hci_request_cancel_all(hdev);
|
|
hci_req_sync_lock(hdev);
|
|
|
|
+ if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) &&
|
|
+ !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
|
|
+ test_bit(HCI_UP, &hdev->flags)) {
|
|
+ /* Execute vendor specific shutdown routine */
|
|
+ if (hdev->shutdown)
|
|
+ hdev->shutdown(hdev);
|
|
+ }
|
|
+
|
|
if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
|
|
cancel_delayed_work_sync(&hdev->cmd_timer);
|
|
hci_req_sync_unlock(hdev);
|
|
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
|
|
index 31a585fe0c7c6..08f67f91d427f 100644
|
|
--- a/net/bluetooth/mgmt.c
|
|
+++ b/net/bluetooth/mgmt.c
|
|
@@ -7464,7 +7464,7 @@ static int add_advertising(struct sock *sk, struct hci_dev *hdev,
|
|
* advertising.
|
|
*/
|
|
if (hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY))
|
|
- return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
|
|
+ return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
|
|
MGMT_STATUS_NOT_SUPPORTED);
|
|
|
|
if (cp->instance < 1 || cp->instance > hdev->le_num_of_adv_sets)
|
|
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
|
|
index 22a110f37abc6..600b1832e1dd6 100644
|
|
--- a/net/bluetooth/sco.c
|
|
+++ b/net/bluetooth/sco.c
|
|
@@ -85,7 +85,6 @@ static void sco_sock_timeout(struct timer_list *t)
|
|
sk->sk_state_change(sk);
|
|
bh_unlock_sock(sk);
|
|
|
|
- sco_sock_kill(sk);
|
|
sock_put(sk);
|
|
}
|
|
|
|
@@ -177,7 +176,6 @@ static void sco_conn_del(struct hci_conn *hcon, int err)
|
|
sco_sock_clear_timer(sk);
|
|
sco_chan_del(sk, err);
|
|
bh_unlock_sock(sk);
|
|
- sco_sock_kill(sk);
|
|
sock_put(sk);
|
|
}
|
|
|
|
@@ -394,8 +392,7 @@ static void sco_sock_cleanup_listen(struct sock *parent)
|
|
*/
|
|
static void sco_sock_kill(struct sock *sk)
|
|
{
|
|
- if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket ||
|
|
- sock_flag(sk, SOCK_DEAD))
|
|
+ if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
|
|
return;
|
|
|
|
BT_DBG("sk %p state %d", sk, sk->sk_state);
|
|
@@ -447,7 +444,6 @@ static void sco_sock_close(struct sock *sk)
|
|
lock_sock(sk);
|
|
__sco_sock_close(sk);
|
|
release_sock(sk);
|
|
- sco_sock_kill(sk);
|
|
}
|
|
|
|
static void sco_skb_put_cmsg(struct sk_buff *skb, struct msghdr *msg,
|
|
@@ -773,6 +769,11 @@ static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)
|
|
cp.max_latency = cpu_to_le16(0xffff);
|
|
cp.retrans_effort = 0xff;
|
|
break;
|
|
+ default:
|
|
+ /* use CVSD settings as fallback */
|
|
+ cp.max_latency = cpu_to_le16(0xffff);
|
|
+ cp.retrans_effort = 0xff;
|
|
+ break;
|
|
}
|
|
|
|
hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ,
|
|
diff --git a/net/core/devlink.c b/net/core/devlink.c
|
|
index 90badb6f72271..96cf4bc1f9585 100644
|
|
--- a/net/core/devlink.c
|
|
+++ b/net/core/devlink.c
|
|
@@ -3079,10 +3079,12 @@ static void devlink_param_notify(struct devlink *devlink,
|
|
struct devlink_param_item *param_item,
|
|
enum devlink_command cmd);
|
|
|
|
-static void devlink_reload_netns_change(struct devlink *devlink,
|
|
- struct net *dest_net)
|
|
+static void devlink_ns_change_notify(struct devlink *devlink,
|
|
+ struct net *dest_net, struct net *curr_net,
|
|
+ bool new)
|
|
{
|
|
struct devlink_param_item *param_item;
|
|
+ enum devlink_command cmd;
|
|
|
|
/* Userspace needs to be notified about devlink objects
|
|
* removed from original and entering new network namespace.
|
|
@@ -3090,17 +3092,18 @@ static void devlink_reload_netns_change(struct devlink *devlink,
|
|
* reload process so the notifications are generated separatelly.
|
|
*/
|
|
|
|
- list_for_each_entry(param_item, &devlink->param_list, list)
|
|
- devlink_param_notify(devlink, 0, param_item,
|
|
- DEVLINK_CMD_PARAM_DEL);
|
|
- devlink_notify(devlink, DEVLINK_CMD_DEL);
|
|
+ if (!dest_net || net_eq(dest_net, curr_net))
|
|
+ return;
|
|
|
|
- __devlink_net_set(devlink, dest_net);
|
|
+ if (new)
|
|
+ devlink_notify(devlink, DEVLINK_CMD_NEW);
|
|
|
|
- devlink_notify(devlink, DEVLINK_CMD_NEW);
|
|
+ cmd = new ? DEVLINK_CMD_PARAM_NEW : DEVLINK_CMD_PARAM_DEL;
|
|
list_for_each_entry(param_item, &devlink->param_list, list)
|
|
- devlink_param_notify(devlink, 0, param_item,
|
|
- DEVLINK_CMD_PARAM_NEW);
|
|
+ devlink_param_notify(devlink, 0, param_item, cmd);
|
|
+
|
|
+ if (!new)
|
|
+ devlink_notify(devlink, DEVLINK_CMD_DEL);
|
|
}
|
|
|
|
static bool devlink_reload_supported(const struct devlink_ops *ops)
|
|
@@ -3180,6 +3183,7 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net,
|
|
u32 *actions_performed, struct netlink_ext_ack *extack)
|
|
{
|
|
u32 remote_reload_stats[DEVLINK_RELOAD_STATS_ARRAY_SIZE];
|
|
+ struct net *curr_net;
|
|
int err;
|
|
|
|
if (!devlink->reload_enabled)
|
|
@@ -3187,18 +3191,22 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net,
|
|
|
|
memcpy(remote_reload_stats, devlink->stats.remote_reload_stats,
|
|
sizeof(remote_reload_stats));
|
|
+
|
|
+ curr_net = devlink_net(devlink);
|
|
+ devlink_ns_change_notify(devlink, dest_net, curr_net, false);
|
|
err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack);
|
|
if (err)
|
|
return err;
|
|
|
|
- if (dest_net && !net_eq(dest_net, devlink_net(devlink)))
|
|
- devlink_reload_netns_change(devlink, dest_net);
|
|
+ if (dest_net && !net_eq(dest_net, curr_net))
|
|
+ __devlink_net_set(devlink, dest_net);
|
|
|
|
err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack);
|
|
devlink_reload_failed_set(devlink, !!err);
|
|
if (err)
|
|
return err;
|
|
|
|
+ devlink_ns_change_notify(devlink, dest_net, curr_net, true);
|
|
WARN_ON(!(*actions_performed & BIT(action)));
|
|
/* Catch driver on updating the remote action within devlink reload */
|
|
WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats,
|
|
@@ -3395,7 +3403,7 @@ out_free_msg:
|
|
|
|
void devlink_flash_update_begin_notify(struct devlink *devlink)
|
|
{
|
|
- struct devlink_flash_notify params = { 0 };
|
|
+ struct devlink_flash_notify params = {};
|
|
|
|
__devlink_flash_update_notify(devlink,
|
|
DEVLINK_CMD_FLASH_UPDATE,
|
|
@@ -3405,7 +3413,7 @@ EXPORT_SYMBOL_GPL(devlink_flash_update_begin_notify);
|
|
|
|
void devlink_flash_update_end_notify(struct devlink *devlink)
|
|
{
|
|
- struct devlink_flash_notify params = { 0 };
|
|
+ struct devlink_flash_notify params = {};
|
|
|
|
__devlink_flash_update_notify(devlink,
|
|
DEVLINK_CMD_FLASH_UPDATE_END,
|
|
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
|
|
index 3d9946fd41f38..ce787c3867938 100644
|
|
--- a/net/ipv4/route.c
|
|
+++ b/net/ipv4/route.c
|
|
@@ -610,18 +610,25 @@ static void fnhe_flush_routes(struct fib_nh_exception *fnhe)
|
|
}
|
|
}
|
|
|
|
-static struct fib_nh_exception *fnhe_oldest(struct fnhe_hash_bucket *hash)
|
|
+static void fnhe_remove_oldest(struct fnhe_hash_bucket *hash)
|
|
{
|
|
- struct fib_nh_exception *fnhe, *oldest;
|
|
+ struct fib_nh_exception __rcu **fnhe_p, **oldest_p;
|
|
+ struct fib_nh_exception *fnhe, *oldest = NULL;
|
|
|
|
- oldest = rcu_dereference(hash->chain);
|
|
- for (fnhe = rcu_dereference(oldest->fnhe_next); fnhe;
|
|
- fnhe = rcu_dereference(fnhe->fnhe_next)) {
|
|
- if (time_before(fnhe->fnhe_stamp, oldest->fnhe_stamp))
|
|
+ for (fnhe_p = &hash->chain; ; fnhe_p = &fnhe->fnhe_next) {
|
|
+ fnhe = rcu_dereference_protected(*fnhe_p,
|
|
+ lockdep_is_held(&fnhe_lock));
|
|
+ if (!fnhe)
|
|
+ break;
|
|
+ if (!oldest ||
|
|
+ time_before(fnhe->fnhe_stamp, oldest->fnhe_stamp)) {
|
|
oldest = fnhe;
|
|
+ oldest_p = fnhe_p;
|
|
+ }
|
|
}
|
|
fnhe_flush_routes(oldest);
|
|
- return oldest;
|
|
+ *oldest_p = oldest->fnhe_next;
|
|
+ kfree_rcu(oldest, rcu);
|
|
}
|
|
|
|
static u32 fnhe_hashfun(__be32 daddr)
|
|
@@ -700,16 +707,21 @@ static void update_or_create_fnhe(struct fib_nh_common *nhc, __be32 daddr,
|
|
if (rt)
|
|
fill_route_from_fnhe(rt, fnhe);
|
|
} else {
|
|
- if (depth > FNHE_RECLAIM_DEPTH)
|
|
- fnhe = fnhe_oldest(hash);
|
|
- else {
|
|
- fnhe = kzalloc(sizeof(*fnhe), GFP_ATOMIC);
|
|
- if (!fnhe)
|
|
- goto out_unlock;
|
|
-
|
|
- fnhe->fnhe_next = hash->chain;
|
|
- rcu_assign_pointer(hash->chain, fnhe);
|
|
+ /* Randomize max depth to avoid some side channels attacks. */
|
|
+ int max_depth = FNHE_RECLAIM_DEPTH +
|
|
+ prandom_u32_max(FNHE_RECLAIM_DEPTH);
|
|
+
|
|
+ while (depth > max_depth) {
|
|
+ fnhe_remove_oldest(hash);
|
|
+ depth--;
|
|
}
|
|
+
|
|
+ fnhe = kzalloc(sizeof(*fnhe), GFP_ATOMIC);
|
|
+ if (!fnhe)
|
|
+ goto out_unlock;
|
|
+
|
|
+ fnhe->fnhe_next = hash->chain;
|
|
+
|
|
fnhe->fnhe_genid = genid;
|
|
fnhe->fnhe_daddr = daddr;
|
|
fnhe->fnhe_gw = gw;
|
|
@@ -717,6 +729,8 @@ static void update_or_create_fnhe(struct fib_nh_common *nhc, __be32 daddr,
|
|
fnhe->fnhe_mtu_locked = lock;
|
|
fnhe->fnhe_expires = max(1UL, expires);
|
|
|
|
+ rcu_assign_pointer(hash->chain, fnhe);
|
|
+
|
|
/* Exception created; mark the cached routes for the nexthop
|
|
* stale, so anyone caching it rechecks if this exception
|
|
* applies to them.
|
|
@@ -3064,7 +3078,7 @@ static struct sk_buff *inet_rtm_getroute_build_skb(__be32 src, __be32 dst,
|
|
udph = skb_put_zero(skb, sizeof(struct udphdr));
|
|
udph->source = sport;
|
|
udph->dest = dport;
|
|
- udph->len = sizeof(struct udphdr);
|
|
+ udph->len = htons(sizeof(struct udphdr));
|
|
udph->check = 0;
|
|
break;
|
|
}
|
|
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
|
|
index 04e259a04443c..71395e745bc5e 100644
|
|
--- a/net/ipv4/tcp_ipv4.c
|
|
+++ b/net/ipv4/tcp_ipv4.c
|
|
@@ -2417,6 +2417,7 @@ static void *tcp_get_idx(struct seq_file *seq, loff_t pos)
|
|
static void *tcp_seek_last_pos(struct seq_file *seq)
|
|
{
|
|
struct tcp_iter_state *st = seq->private;
|
|
+ int bucket = st->bucket;
|
|
int offset = st->offset;
|
|
int orig_num = st->num;
|
|
void *rc = NULL;
|
|
@@ -2427,7 +2428,7 @@ static void *tcp_seek_last_pos(struct seq_file *seq)
|
|
break;
|
|
st->state = TCP_SEQ_STATE_LISTENING;
|
|
rc = listening_get_next(seq, NULL);
|
|
- while (offset-- && rc)
|
|
+ while (offset-- && rc && bucket == st->bucket)
|
|
rc = listening_get_next(seq, rc);
|
|
if (rc)
|
|
break;
|
|
@@ -2438,7 +2439,7 @@ static void *tcp_seek_last_pos(struct seq_file *seq)
|
|
if (st->bucket > tcp_hashinfo.ehash_mask)
|
|
break;
|
|
rc = established_get_first(seq);
|
|
- while (offset-- && rc)
|
|
+ while (offset-- && rc && bucket == st->bucket)
|
|
rc = established_get_next(seq, rc);
|
|
}
|
|
|
|
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
|
|
index bcf4fae83a9bd..168a7b4d957ae 100644
|
|
--- a/net/ipv6/route.c
|
|
+++ b/net/ipv6/route.c
|
|
@@ -1655,6 +1655,7 @@ static int rt6_insert_exception(struct rt6_info *nrt,
|
|
struct in6_addr *src_key = NULL;
|
|
struct rt6_exception *rt6_ex;
|
|
struct fib6_nh *nh = res->nh;
|
|
+ int max_depth;
|
|
int err = 0;
|
|
|
|
spin_lock_bh(&rt6_exception_lock);
|
|
@@ -1709,7 +1710,9 @@ static int rt6_insert_exception(struct rt6_info *nrt,
|
|
bucket->depth++;
|
|
net->ipv6.rt6_stats->fib_rt_cache++;
|
|
|
|
- if (bucket->depth > FIB6_MAX_DEPTH)
|
|
+ /* Randomize max depth to avoid some side channels attacks. */
|
|
+ max_depth = FIB6_MAX_DEPTH + prandom_u32_max(FIB6_MAX_DEPTH);
|
|
+ while (bucket->depth > max_depth)
|
|
rt6_exception_remove_oldest(bucket);
|
|
|
|
out:
|
|
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
|
|
index 20b3581a1c43f..673ad3cf2c3ab 100644
|
|
--- a/net/mac80211/tx.c
|
|
+++ b/net/mac80211/tx.c
|
|
@@ -3229,7 +3229,9 @@ static bool ieee80211_amsdu_prepare_head(struct ieee80211_sub_if_data *sdata,
|
|
if (info->control.flags & IEEE80211_TX_CTRL_AMSDU)
|
|
return true;
|
|
|
|
- if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(*amsdu_hdr)))
|
|
+ if (!ieee80211_amsdu_realloc_pad(local, skb,
|
|
+ sizeof(*amsdu_hdr) +
|
|
+ local->hw.extra_tx_headroom))
|
|
return false;
|
|
|
|
data = skb_push(skb, sizeof(*amsdu_hdr));
|
|
diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c
|
|
index 4f50a64315cf0..50f40943c8153 100644
|
|
--- a/net/netlabel/netlabel_cipso_v4.c
|
|
+++ b/net/netlabel/netlabel_cipso_v4.c
|
|
@@ -187,14 +187,14 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,
|
|
}
|
|
doi_def->map.std->lvl.local = kcalloc(doi_def->map.std->lvl.local_size,
|
|
sizeof(u32),
|
|
- GFP_KERNEL);
|
|
+ GFP_KERNEL | __GFP_NOWARN);
|
|
if (doi_def->map.std->lvl.local == NULL) {
|
|
ret_val = -ENOMEM;
|
|
goto add_std_failure;
|
|
}
|
|
doi_def->map.std->lvl.cipso = kcalloc(doi_def->map.std->lvl.cipso_size,
|
|
sizeof(u32),
|
|
- GFP_KERNEL);
|
|
+ GFP_KERNEL | __GFP_NOWARN);
|
|
if (doi_def->map.std->lvl.cipso == NULL) {
|
|
ret_val = -ENOMEM;
|
|
goto add_std_failure;
|
|
@@ -263,7 +263,7 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,
|
|
doi_def->map.std->cat.local = kcalloc(
|
|
doi_def->map.std->cat.local_size,
|
|
sizeof(u32),
|
|
- GFP_KERNEL);
|
|
+ GFP_KERNEL | __GFP_NOWARN);
|
|
if (doi_def->map.std->cat.local == NULL) {
|
|
ret_val = -ENOMEM;
|
|
goto add_std_failure;
|
|
@@ -271,7 +271,7 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,
|
|
doi_def->map.std->cat.cipso = kcalloc(
|
|
doi_def->map.std->cat.cipso_size,
|
|
sizeof(u32),
|
|
- GFP_KERNEL);
|
|
+ GFP_KERNEL | __GFP_NOWARN);
|
|
if (doi_def->map.std->cat.cipso == NULL) {
|
|
ret_val = -ENOMEM;
|
|
goto add_std_failure;
|
|
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c
|
|
index 53d45e029c36d..4a78fcf5d4f98 100644
|
|
--- a/net/sched/sch_cbq.c
|
|
+++ b/net/sched/sch_cbq.c
|
|
@@ -1614,7 +1614,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t
|
|
err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack);
|
|
if (err) {
|
|
kfree(cl);
|
|
- return err;
|
|
+ goto failure;
|
|
}
|
|
|
|
if (tca[TCA_RATE]) {
|
|
diff --git a/samples/bpf/xdp_redirect_cpu_user.c b/samples/bpf/xdp_redirect_cpu_user.c
|
|
index f78cb18319aaf..16eb839e71f03 100644
|
|
--- a/samples/bpf/xdp_redirect_cpu_user.c
|
|
+++ b/samples/bpf/xdp_redirect_cpu_user.c
|
|
@@ -837,7 +837,7 @@ int main(int argc, char **argv)
|
|
memset(cpu, 0, n_cpus * sizeof(int));
|
|
|
|
/* Parse commands line args */
|
|
- while ((opt = getopt_long(argc, argv, "hSd:s:p:q:c:xzFf:e:r:m:",
|
|
+ while ((opt = getopt_long(argc, argv, "hSd:s:p:q:c:xzFf:e:r:m:n",
|
|
long_options, &longindex)) != -1) {
|
|
switch (opt) {
|
|
case 'd':
|
|
diff --git a/samples/pktgen/pktgen_sample04_many_flows.sh b/samples/pktgen/pktgen_sample04_many_flows.sh
|
|
index 2cd6b701400de..9db1ecf8de8bc 100755
|
|
--- a/samples/pktgen/pktgen_sample04_many_flows.sh
|
|
+++ b/samples/pktgen/pktgen_sample04_many_flows.sh
|
|
@@ -13,13 +13,15 @@ root_check_run_with_sudo "$@"
|
|
# Parameter parsing via include
|
|
source ${basedir}/parameters.sh
|
|
# Set some default params, if they didn't get set
|
|
-[ -z "$DEST_IP" ] && DEST_IP="198.18.0.42"
|
|
+if [ -z "$DEST_IP" ]; then
|
|
+ [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1"
|
|
+fi
|
|
[ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff"
|
|
[ -z "$CLONE_SKB" ] && CLONE_SKB="0"
|
|
[ -z "$COUNT" ] && COUNT="0" # Zero means indefinitely
|
|
if [ -n "$DEST_IP" ]; then
|
|
- validate_addr $DEST_IP
|
|
- read -r DST_MIN DST_MAX <<< $(parse_addr $DEST_IP)
|
|
+ validate_addr${IP6} $DEST_IP
|
|
+ read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP)
|
|
fi
|
|
if [ -n "$DST_PORT" ]; then
|
|
read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT)
|
|
@@ -65,8 +67,8 @@ for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
|
|
|
|
# Single destination
|
|
pg_set $dev "dst_mac $DST_MAC"
|
|
- pg_set $dev "dst_min $DST_MIN"
|
|
- pg_set $dev "dst_max $DST_MAX"
|
|
+ pg_set $dev "dst${IP6}_min $DST_MIN"
|
|
+ pg_set $dev "dst${IP6}_max $DST_MAX"
|
|
|
|
if [ -n "$DST_PORT" ]; then
|
|
# Single destination port or random port range
|
|
diff --git a/samples/pktgen/pktgen_sample05_flow_per_thread.sh b/samples/pktgen/pktgen_sample05_flow_per_thread.sh
|
|
index 4cb6252ade399..9fc6c6da028ac 100755
|
|
--- a/samples/pktgen/pktgen_sample05_flow_per_thread.sh
|
|
+++ b/samples/pktgen/pktgen_sample05_flow_per_thread.sh
|
|
@@ -17,14 +17,16 @@ root_check_run_with_sudo "$@"
|
|
# Parameter parsing via include
|
|
source ${basedir}/parameters.sh
|
|
# Set some default params, if they didn't get set
|
|
-[ -z "$DEST_IP" ] && DEST_IP="198.18.0.42"
|
|
+if [ -z "$DEST_IP" ]; then
|
|
+ [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1"
|
|
+fi
|
|
[ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff"
|
|
[ -z "$CLONE_SKB" ] && CLONE_SKB="0"
|
|
[ -z "$BURST" ] && BURST=32
|
|
[ -z "$COUNT" ] && COUNT="0" # Zero means indefinitely
|
|
if [ -n "$DEST_IP" ]; then
|
|
- validate_addr $DEST_IP
|
|
- read -r DST_MIN DST_MAX <<< $(parse_addr $DEST_IP)
|
|
+ validate_addr${IP6} $DEST_IP
|
|
+ read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP)
|
|
fi
|
|
if [ -n "$DST_PORT" ]; then
|
|
read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT)
|
|
@@ -55,8 +57,8 @@ for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
|
|
|
|
# Single destination
|
|
pg_set $dev "dst_mac $DST_MAC"
|
|
- pg_set $dev "dst_min $DST_MIN"
|
|
- pg_set $dev "dst_max $DST_MAX"
|
|
+ pg_set $dev "dst${IP6}_min $DST_MIN"
|
|
+ pg_set $dev "dst${IP6}_max $DST_MAX"
|
|
|
|
if [ -n "$DST_PORT" ]; then
|
|
# Single destination port or random port range
|
|
diff --git a/security/integrity/ima/Kconfig b/security/integrity/ima/Kconfig
|
|
index 12e9250c1bec6..9e72edb8d31af 100644
|
|
--- a/security/integrity/ima/Kconfig
|
|
+++ b/security/integrity/ima/Kconfig
|
|
@@ -6,7 +6,6 @@ config IMA
|
|
select SECURITYFS
|
|
select CRYPTO
|
|
select CRYPTO_HMAC
|
|
- select CRYPTO_MD5
|
|
select CRYPTO_SHA1
|
|
select CRYPTO_HASH_INFO
|
|
select TCG_TPM if HAS_IOMEM && !UML
|
|
diff --git a/security/integrity/ima/ima_mok.c b/security/integrity/ima/ima_mok.c
|
|
index 1e5c019161738..95cc31525c573 100644
|
|
--- a/security/integrity/ima/ima_mok.c
|
|
+++ b/security/integrity/ima/ima_mok.c
|
|
@@ -21,7 +21,7 @@ struct key *ima_blacklist_keyring;
|
|
/*
|
|
* Allocate the IMA blacklist keyring
|
|
*/
|
|
-__init int ima_mok_init(void)
|
|
+static __init int ima_mok_init(void)
|
|
{
|
|
struct key_restriction *restriction;
|
|
|
|
diff --git a/sound/soc/codecs/rt5682-i2c.c b/sound/soc/codecs/rt5682-i2c.c
|
|
index 547445d1e3c69..89e545eb9a8a0 100644
|
|
--- a/sound/soc/codecs/rt5682-i2c.c
|
|
+++ b/sound/soc/codecs/rt5682-i2c.c
|
|
@@ -117,6 +117,13 @@ static struct snd_soc_dai_driver rt5682_dai[] = {
|
|
},
|
|
};
|
|
|
|
+static void rt5682_i2c_disable_regulators(void *data)
|
|
+{
|
|
+ struct rt5682_priv *rt5682 = data;
|
|
+
|
|
+ regulator_bulk_disable(ARRAY_SIZE(rt5682->supplies), rt5682->supplies);
|
|
+}
|
|
+
|
|
static int rt5682_i2c_probe(struct i2c_client *i2c,
|
|
const struct i2c_device_id *id)
|
|
{
|
|
@@ -157,6 +164,11 @@ static int rt5682_i2c_probe(struct i2c_client *i2c,
|
|
return ret;
|
|
}
|
|
|
|
+ ret = devm_add_action_or_reset(&i2c->dev, rt5682_i2c_disable_regulators,
|
|
+ rt5682);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
ret = regulator_bulk_enable(ARRAY_SIZE(rt5682->supplies),
|
|
rt5682->supplies);
|
|
if (ret) {
|
|
@@ -275,6 +287,13 @@ static void rt5682_i2c_shutdown(struct i2c_client *client)
|
|
rt5682_reset(rt5682);
|
|
}
|
|
|
|
+static int rt5682_i2c_remove(struct i2c_client *client)
|
|
+{
|
|
+ rt5682_i2c_shutdown(client);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static const struct of_device_id rt5682_of_match[] = {
|
|
{.compatible = "realtek,rt5682i"},
|
|
{},
|
|
@@ -301,6 +320,7 @@ static struct i2c_driver rt5682_i2c_driver = {
|
|
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
|
|
},
|
|
.probe = rt5682_i2c_probe,
|
|
+ .remove = rt5682_i2c_remove,
|
|
.shutdown = rt5682_i2c_shutdown,
|
|
.id_table = rt5682_i2c_id,
|
|
};
|
|
diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c
|
|
index 4d2b1ec7c03bb..2677d0c3b19ba 100644
|
|
--- a/sound/soc/codecs/wcd9335.c
|
|
+++ b/sound/soc/codecs/wcd9335.c
|
|
@@ -4076,6 +4076,16 @@ static int wcd9335_setup_irqs(struct wcd9335_codec *wcd)
|
|
return ret;
|
|
}
|
|
|
|
+static void wcd9335_teardown_irqs(struct wcd9335_codec *wcd)
|
|
+{
|
|
+ int i;
|
|
+
|
|
+ /* disable interrupts on all slave ports */
|
|
+ for (i = 0; i < WCD9335_SLIM_NUM_PORT_REG; i++)
|
|
+ regmap_write(wcd->if_regmap, WCD9335_SLIM_PGD_PORT_INT_EN0 + i,
|
|
+ 0x00);
|
|
+}
|
|
+
|
|
static void wcd9335_cdc_sido_ccl_enable(struct wcd9335_codec *wcd,
|
|
bool ccl_flag)
|
|
{
|
|
@@ -4844,6 +4854,7 @@ static void wcd9335_codec_init(struct snd_soc_component *component)
|
|
static int wcd9335_codec_probe(struct snd_soc_component *component)
|
|
{
|
|
struct wcd9335_codec *wcd = dev_get_drvdata(component->dev);
|
|
+ int ret;
|
|
int i;
|
|
|
|
snd_soc_component_init_regmap(component, wcd->regmap);
|
|
@@ -4861,7 +4872,15 @@ static int wcd9335_codec_probe(struct snd_soc_component *component)
|
|
for (i = 0; i < NUM_CODEC_DAIS; i++)
|
|
INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list);
|
|
|
|
- return wcd9335_setup_irqs(wcd);
|
|
+ ret = wcd9335_setup_irqs(wcd);
|
|
+ if (ret)
|
|
+ goto free_clsh_ctrl;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+free_clsh_ctrl:
|
|
+ wcd_clsh_ctrl_free(wcd->clsh_ctrl);
|
|
+ return ret;
|
|
}
|
|
|
|
static void wcd9335_codec_remove(struct snd_soc_component *comp)
|
|
@@ -4869,7 +4888,7 @@ static void wcd9335_codec_remove(struct snd_soc_component *comp)
|
|
struct wcd9335_codec *wcd = dev_get_drvdata(comp->dev);
|
|
|
|
wcd_clsh_ctrl_free(wcd->clsh_ctrl);
|
|
- free_irq(regmap_irq_get_virq(wcd->irq_data, WCD9335_IRQ_SLIMBUS), wcd);
|
|
+ wcd9335_teardown_irqs(wcd);
|
|
}
|
|
|
|
static int wcd9335_codec_set_sysclk(struct snd_soc_component *comp,
|
|
diff --git a/sound/soc/intel/boards/kbl_da7219_max98927.c b/sound/soc/intel/boards/kbl_da7219_max98927.c
|
|
index e0149cf6127d0..884741aa48335 100644
|
|
--- a/sound/soc/intel/boards/kbl_da7219_max98927.c
|
|
+++ b/sound/soc/intel/boards/kbl_da7219_max98927.c
|
|
@@ -197,7 +197,7 @@ static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream,
|
|
}
|
|
if (!strcmp(codec_dai->component->name, MAX98373_DEV0_NAME)) {
|
|
ret = snd_soc_dai_set_tdm_slot(codec_dai,
|
|
- 0x03, 3, 8, 24);
|
|
+ 0x30, 3, 8, 16);
|
|
if (ret < 0) {
|
|
dev_err(runtime->dev,
|
|
"DEV0 TDM slot err:%d\n", ret);
|
|
@@ -206,10 +206,10 @@ static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream,
|
|
}
|
|
if (!strcmp(codec_dai->component->name, MAX98373_DEV1_NAME)) {
|
|
ret = snd_soc_dai_set_tdm_slot(codec_dai,
|
|
- 0x0C, 3, 8, 24);
|
|
+ 0xC0, 3, 8, 16);
|
|
if (ret < 0) {
|
|
dev_err(runtime->dev,
|
|
- "DEV0 TDM slot err:%d\n", ret);
|
|
+ "DEV1 TDM slot err:%d\n", ret);
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -309,24 +309,6 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
|
|
* The above 2 loops are mutually exclusive based on the stream direction,
|
|
* thus rtd_dpcm variable will never be overwritten
|
|
*/
|
|
- /*
|
|
- * Topology for kblda7219m98373 & kblmax98373 supports only S24_LE,
|
|
- * where as kblda7219m98927 & kblmax98927 supports S16_LE by default.
|
|
- * Skipping the port wise FE and BE configuration for kblda7219m98373 &
|
|
- * kblmax98373 as the topology (FE & BE) supports S24_LE only.
|
|
- */
|
|
-
|
|
- if (!strcmp(rtd->card->name, "kblda7219m98373") ||
|
|
- !strcmp(rtd->card->name, "kblmax98373")) {
|
|
- /* The ADSP will convert the FE rate to 48k, stereo */
|
|
- rate->min = rate->max = 48000;
|
|
- chan->min = chan->max = DUAL_CHANNEL;
|
|
-
|
|
- /* set SSP to 24 bit */
|
|
- snd_mask_none(fmt);
|
|
- snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S24_LE);
|
|
- return 0;
|
|
- }
|
|
|
|
/*
|
|
* The ADSP will convert the FE rate to 48k, stereo, 24 bit
|
|
@@ -477,31 +459,20 @@ static struct snd_pcm_hw_constraint_list constraints_channels_quad = {
|
|
static int kbl_fe_startup(struct snd_pcm_substream *substream)
|
|
{
|
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
|
- struct snd_soc_pcm_runtime *soc_rt = asoc_substream_to_rtd(substream);
|
|
|
|
/*
|
|
* On this platform for PCM device we support,
|
|
* 48Khz
|
|
* stereo
|
|
+ * 16 bit audio
|
|
*/
|
|
|
|
runtime->hw.channels_max = DUAL_CHANNEL;
|
|
snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
|
|
&constraints_channels);
|
|
- /*
|
|
- * Setup S24_LE (32 bit container and 24 bit valid data) for
|
|
- * kblda7219m98373 & kblmax98373. For kblda7219m98927 &
|
|
- * kblmax98927 keeping it as 16/16 due to topology FW dependency.
|
|
- */
|
|
- if (!strcmp(soc_rt->card->name, "kblda7219m98373") ||
|
|
- !strcmp(soc_rt->card->name, "kblmax98373")) {
|
|
- runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_LE;
|
|
- snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
|
|
-
|
|
- } else {
|
|
- runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
|
|
- snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
|
|
- }
|
|
+
|
|
+ runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
|
|
+ snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
|
|
|
|
snd_pcm_hw_constraint_list(runtime, 0,
|
|
SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
|
|
@@ -534,23 +505,11 @@ static int kabylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
|
|
static int kabylake_dmic_startup(struct snd_pcm_substream *substream)
|
|
{
|
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
|
- struct snd_soc_pcm_runtime *soc_rt = asoc_substream_to_rtd(substream);
|
|
|
|
runtime->hw.channels_min = runtime->hw.channels_max = QUAD_CHANNEL;
|
|
snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
|
|
&constraints_channels_quad);
|
|
|
|
- /*
|
|
- * Topology for kblda7219m98373 & kblmax98373 supports only S24_LE.
|
|
- * The DMIC also configured for S24_LE. Forcing the DMIC format to
|
|
- * S24_LE due to the topology FW dependency.
|
|
- */
|
|
- if (!strcmp(soc_rt->card->name, "kblda7219m98373") ||
|
|
- !strcmp(soc_rt->card->name, "kblmax98373")) {
|
|
- runtime->hw.formats = SNDRV_PCM_FMTBIT_S24_LE;
|
|
- snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
|
|
- }
|
|
-
|
|
return snd_pcm_hw_constraint_list(substream->runtime, 0,
|
|
SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
|
|
}
|
|
diff --git a/sound/soc/intel/common/soc-acpi-intel-cml-match.c b/sound/soc/intel/common/soc-acpi-intel-cml-match.c
|
|
index 26dde88bb2279..9b85811ffd515 100644
|
|
--- a/sound/soc/intel/common/soc-acpi-intel-cml-match.c
|
|
+++ b/sound/soc/intel/common/soc-acpi-intel-cml-match.c
|
|
@@ -62,7 +62,7 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_machines[] = {
|
|
},
|
|
{
|
|
.id = "DLGS7219",
|
|
- .drv_name = "cml_da7219_max98357a",
|
|
+ .drv_name = "cml_da7219_mx98357a",
|
|
.machine_quirk = snd_soc_acpi_codec_list,
|
|
.quirk_data = &max98390_spk_codecs,
|
|
.sof_fw_filename = "sof-cml.ri",
|
|
diff --git a/sound/soc/intel/common/soc-acpi-intel-kbl-match.c b/sound/soc/intel/common/soc-acpi-intel-kbl-match.c
|
|
index 4ed1349affc4d..20f2132a9cd66 100644
|
|
--- a/sound/soc/intel/common/soc-acpi-intel-kbl-match.c
|
|
+++ b/sound/soc/intel/common/soc-acpi-intel-kbl-match.c
|
|
@@ -87,7 +87,7 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_kbl_machines[] = {
|
|
},
|
|
{
|
|
.id = "DLGS7219",
|
|
- .drv_name = "kbl_da7219_max98357a",
|
|
+ .drv_name = "kbl_da7219_mx98357a",
|
|
.fw_filename = "intel/dsp_fw_kbl.bin",
|
|
.machine_quirk = snd_soc_acpi_codec_list,
|
|
.quirk_data = &kbl_7219_98357_codecs,
|
|
diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
|
|
index 0955cbb4e9187..73976c6dfbdc0 100644
|
|
--- a/sound/soc/intel/skylake/skl-topology.c
|
|
+++ b/sound/soc/intel/skylake/skl-topology.c
|
|
@@ -113,7 +113,7 @@ static int is_skl_dsp_widget_type(struct snd_soc_dapm_widget *w,
|
|
|
|
static void skl_dump_mconfig(struct skl_dev *skl, struct skl_module_cfg *mcfg)
|
|
{
|
|
- struct skl_module_iface *iface = &mcfg->module->formats[0];
|
|
+ struct skl_module_iface *iface = &mcfg->module->formats[mcfg->fmt_idx];
|
|
|
|
dev_dbg(skl->dev, "Dumping config\n");
|
|
dev_dbg(skl->dev, "Input Format:\n");
|
|
@@ -195,8 +195,8 @@ static void skl_tplg_update_params_fixup(struct skl_module_cfg *m_cfg,
|
|
struct skl_module_fmt *in_fmt, *out_fmt;
|
|
|
|
/* Fixups will be applied to pin 0 only */
|
|
- in_fmt = &m_cfg->module->formats[0].inputs[0].fmt;
|
|
- out_fmt = &m_cfg->module->formats[0].outputs[0].fmt;
|
|
+ in_fmt = &m_cfg->module->formats[m_cfg->fmt_idx].inputs[0].fmt;
|
|
+ out_fmt = &m_cfg->module->formats[m_cfg->fmt_idx].outputs[0].fmt;
|
|
|
|
if (params->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
|
if (is_fe) {
|
|
@@ -239,9 +239,9 @@ static void skl_tplg_update_buffer_size(struct skl_dev *skl,
|
|
/* Since fixups is applied to pin 0 only, ibs, obs needs
|
|
* change for pin 0 only
|
|
*/
|
|
- res = &mcfg->module->resources[0];
|
|
- in_fmt = &mcfg->module->formats[0].inputs[0].fmt;
|
|
- out_fmt = &mcfg->module->formats[0].outputs[0].fmt;
|
|
+ res = &mcfg->module->resources[mcfg->res_idx];
|
|
+ in_fmt = &mcfg->module->formats[mcfg->fmt_idx].inputs[0].fmt;
|
|
+ out_fmt = &mcfg->module->formats[mcfg->fmt_idx].outputs[0].fmt;
|
|
|
|
if (mcfg->m_type == SKL_MODULE_TYPE_SRCINT)
|
|
multiplier = 5;
|
|
@@ -1463,12 +1463,6 @@ static int skl_tplg_tlv_control_set(struct snd_kcontrol *kcontrol,
|
|
struct skl_dev *skl = get_skl_ctx(w->dapm->dev);
|
|
|
|
if (ac->params) {
|
|
- /*
|
|
- * Widget data is expected to be stripped of T and L
|
|
- */
|
|
- size -= 2 * sizeof(unsigned int);
|
|
- data += 2;
|
|
-
|
|
if (size > ac->max)
|
|
return -EINVAL;
|
|
ac->size = size;
|
|
@@ -1637,11 +1631,12 @@ int skl_tplg_update_pipe_params(struct device *dev,
|
|
struct skl_module_cfg *mconfig,
|
|
struct skl_pipe_params *params)
|
|
{
|
|
- struct skl_module_res *res = &mconfig->module->resources[0];
|
|
+ struct skl_module_res *res;
|
|
struct skl_dev *skl = get_skl_ctx(dev);
|
|
struct skl_module_fmt *format = NULL;
|
|
u8 cfg_idx = mconfig->pipe->cur_config_idx;
|
|
|
|
+ res = &mconfig->module->resources[mconfig->res_idx];
|
|
skl_tplg_fill_dma_id(mconfig, params);
|
|
mconfig->fmt_idx = mconfig->mod_cfg[cfg_idx].fmt_idx;
|
|
mconfig->res_idx = mconfig->mod_cfg[cfg_idx].res_idx;
|
|
@@ -1650,9 +1645,9 @@ int skl_tplg_update_pipe_params(struct device *dev,
|
|
return 0;
|
|
|
|
if (params->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
|
- format = &mconfig->module->formats[0].inputs[0].fmt;
|
|
+ format = &mconfig->module->formats[mconfig->fmt_idx].inputs[0].fmt;
|
|
else
|
|
- format = &mconfig->module->formats[0].outputs[0].fmt;
|
|
+ format = &mconfig->module->formats[mconfig->fmt_idx].outputs[0].fmt;
|
|
|
|
/* set the hw_params */
|
|
format->s_freq = params->s_freq;
|
|
diff --git a/sound/soc/mediatek/mt8183/mt8183-afe-pcm.c b/sound/soc/mediatek/mt8183/mt8183-afe-pcm.c
|
|
index c4a598cbbdaa1..14e77df06b011 100644
|
|
--- a/sound/soc/mediatek/mt8183/mt8183-afe-pcm.c
|
|
+++ b/sound/soc/mediatek/mt8183/mt8183-afe-pcm.c
|
|
@@ -1119,25 +1119,26 @@ static int mt8183_afe_pcm_dev_probe(struct platform_device *pdev)
|
|
afe->regmap = syscon_node_to_regmap(dev->parent->of_node);
|
|
if (IS_ERR(afe->regmap)) {
|
|
dev_err(dev, "could not get regmap from parent\n");
|
|
- return PTR_ERR(afe->regmap);
|
|
+ ret = PTR_ERR(afe->regmap);
|
|
+ goto err_pm_disable;
|
|
}
|
|
ret = regmap_attach_dev(dev, afe->regmap, &mt8183_afe_regmap_config);
|
|
if (ret) {
|
|
dev_warn(dev, "regmap_attach_dev fail, ret %d\n", ret);
|
|
- return ret;
|
|
+ goto err_pm_disable;
|
|
}
|
|
|
|
rstc = devm_reset_control_get(dev, "audiosys");
|
|
if (IS_ERR(rstc)) {
|
|
ret = PTR_ERR(rstc);
|
|
dev_err(dev, "could not get audiosys reset:%d\n", ret);
|
|
- return ret;
|
|
+ goto err_pm_disable;
|
|
}
|
|
|
|
ret = reset_control_reset(rstc);
|
|
if (ret) {
|
|
dev_err(dev, "failed to trigger audio reset:%d\n", ret);
|
|
- return ret;
|
|
+ goto err_pm_disable;
|
|
}
|
|
|
|
/* enable clock for regcache get default value from hw */
|
|
@@ -1147,7 +1148,7 @@ static int mt8183_afe_pcm_dev_probe(struct platform_device *pdev)
|
|
ret = regmap_reinit_cache(afe->regmap, &mt8183_afe_regmap_config);
|
|
if (ret) {
|
|
dev_err(dev, "regmap_reinit_cache fail, ret %d\n", ret);
|
|
- return ret;
|
|
+ goto err_pm_disable;
|
|
}
|
|
|
|
pm_runtime_put_sync(&pdev->dev);
|
|
@@ -1160,8 +1161,10 @@ static int mt8183_afe_pcm_dev_probe(struct platform_device *pdev)
|
|
afe->memif_size = MT8183_MEMIF_NUM;
|
|
afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),
|
|
GFP_KERNEL);
|
|
- if (!afe->memif)
|
|
- return -ENOMEM;
|
|
+ if (!afe->memif) {
|
|
+ ret = -ENOMEM;
|
|
+ goto err_pm_disable;
|
|
+ }
|
|
|
|
for (i = 0; i < afe->memif_size; i++) {
|
|
afe->memif[i].data = &memif_data[i];
|
|
@@ -1178,22 +1181,26 @@ static int mt8183_afe_pcm_dev_probe(struct platform_device *pdev)
|
|
afe->irqs_size = MT8183_IRQ_NUM;
|
|
afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),
|
|
GFP_KERNEL);
|
|
- if (!afe->irqs)
|
|
- return -ENOMEM;
|
|
+ if (!afe->irqs) {
|
|
+ ret = -ENOMEM;
|
|
+ goto err_pm_disable;
|
|
+ }
|
|
|
|
for (i = 0; i < afe->irqs_size; i++)
|
|
afe->irqs[i].irq_data = &irq_data[i];
|
|
|
|
/* request irq */
|
|
irq_id = platform_get_irq(pdev, 0);
|
|
- if (irq_id < 0)
|
|
- return irq_id;
|
|
+ if (irq_id < 0) {
|
|
+ ret = irq_id;
|
|
+ goto err_pm_disable;
|
|
+ }
|
|
|
|
ret = devm_request_irq(dev, irq_id, mt8183_afe_irq_handler,
|
|
IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);
|
|
if (ret) {
|
|
dev_err(dev, "could not request_irq for asys-isr\n");
|
|
- return ret;
|
|
+ goto err_pm_disable;
|
|
}
|
|
|
|
/* init sub_dais */
|
|
@@ -1204,7 +1211,7 @@ static int mt8183_afe_pcm_dev_probe(struct platform_device *pdev)
|
|
if (ret) {
|
|
dev_warn(afe->dev, "dai register i %d fail, ret %d\n",
|
|
i, ret);
|
|
- return ret;
|
|
+ goto err_pm_disable;
|
|
}
|
|
}
|
|
|
|
@@ -1213,7 +1220,7 @@ static int mt8183_afe_pcm_dev_probe(struct platform_device *pdev)
|
|
if (ret) {
|
|
dev_warn(afe->dev, "mtk_afe_combine_sub_dai fail, ret %d\n",
|
|
ret);
|
|
- return ret;
|
|
+ goto err_pm_disable;
|
|
}
|
|
|
|
afe->mtk_afe_hardware = &mt8183_afe_hardware;
|
|
@@ -1229,7 +1236,7 @@ static int mt8183_afe_pcm_dev_probe(struct platform_device *pdev)
|
|
NULL, 0);
|
|
if (ret) {
|
|
dev_warn(dev, "err_platform\n");
|
|
- return ret;
|
|
+ goto err_pm_disable;
|
|
}
|
|
|
|
ret = devm_snd_soc_register_component(afe->dev,
|
|
@@ -1238,10 +1245,14 @@ static int mt8183_afe_pcm_dev_probe(struct platform_device *pdev)
|
|
afe->num_dai_drivers);
|
|
if (ret) {
|
|
dev_warn(dev, "err_dai_component\n");
|
|
- return ret;
|
|
+ goto err_pm_disable;
|
|
}
|
|
|
|
return ret;
|
|
+
|
|
+err_pm_disable:
|
|
+ pm_runtime_disable(&pdev->dev);
|
|
+ return ret;
|
|
}
|
|
|
|
static int mt8183_afe_pcm_dev_remove(struct platform_device *pdev)
|
|
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
|
|
index 556216dc97030..762bf87c26a3e 100644
|
|
--- a/tools/include/uapi/linux/bpf.h
|
|
+++ b/tools/include/uapi/linux/bpf.h
|
|
@@ -2450,7 +2450,7 @@ union bpf_attr {
|
|
* long bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags)
|
|
* Description
|
|
* Select a **SO_REUSEPORT** socket from a
|
|
- * **BPF_MAP_TYPE_REUSEPORT_ARRAY** *map*.
|
|
+ * **BPF_MAP_TYPE_REUSEPORT_SOCKARRAY** *map*.
|
|
* It checks the selected socket is matching the incoming
|
|
* request in the socket buffer.
|
|
* Return
|
|
diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile
|
|
index 310f647c2d5b6..154b75fc1373e 100644
|
|
--- a/tools/lib/bpf/Makefile
|
|
+++ b/tools/lib/bpf/Makefile
|
|
@@ -4,8 +4,9 @@
|
|
RM ?= rm
|
|
srctree = $(abs_srctree)
|
|
|
|
+VERSION_SCRIPT := libbpf.map
|
|
LIBBPF_VERSION := $(shell \
|
|
- grep -oE '^LIBBPF_([0-9.]+)' libbpf.map | \
|
|
+ grep -oE '^LIBBPF_([0-9.]+)' $(VERSION_SCRIPT) | \
|
|
sort -rV | head -n1 | cut -d'_' -f2)
|
|
LIBBPF_MAJOR_VERSION := $(firstword $(subst ., ,$(LIBBPF_VERSION)))
|
|
|
|
@@ -131,7 +132,6 @@ SHARED_OBJDIR := $(OUTPUT)sharedobjs/
|
|
STATIC_OBJDIR := $(OUTPUT)staticobjs/
|
|
BPF_IN_SHARED := $(SHARED_OBJDIR)libbpf-in.o
|
|
BPF_IN_STATIC := $(STATIC_OBJDIR)libbpf-in.o
|
|
-VERSION_SCRIPT := libbpf.map
|
|
BPF_HELPER_DEFS := $(OUTPUT)bpf_helper_defs.h
|
|
|
|
LIB_TARGET := $(addprefix $(OUTPUT),$(LIB_TARGET))
|
|
@@ -184,10 +184,10 @@ $(BPF_HELPER_DEFS): $(srctree)/tools/include/uapi/linux/bpf.h
|
|
|
|
$(OUTPUT)libbpf.so: $(OUTPUT)libbpf.so.$(LIBBPF_VERSION)
|
|
|
|
-$(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN_SHARED)
|
|
+$(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN_SHARED) $(VERSION_SCRIPT)
|
|
$(QUIET_LINK)$(CC) $(LDFLAGS) \
|
|
--shared -Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \
|
|
- -Wl,--version-script=$(VERSION_SCRIPT) $^ -lelf -lz -o $@
|
|
+ -Wl,--version-script=$(VERSION_SCRIPT) $< -lelf -lz -o $@
|
|
@ln -sf $(@F) $(OUTPUT)libbpf.so
|
|
@ln -sf $(@F) $(OUTPUT)libbpf.so.$(LIBBPF_MAJOR_VERSION)
|
|
|
|
@@ -202,7 +202,7 @@ $(OUTPUT)libbpf.pc:
|
|
|
|
check: check_abi
|
|
|
|
-check_abi: $(OUTPUT)libbpf.so
|
|
+check_abi: $(OUTPUT)libbpf.so $(VERSION_SCRIPT)
|
|
@if [ "$(GLOBAL_SYM_COUNT)" != "$(VERSIONED_SYM_COUNT)" ]; then \
|
|
echo "Warning: Num of global symbols in $(BPF_IN_SHARED)" \
|
|
"($(GLOBAL_SYM_COUNT)) does NOT match with num of" \
|
|
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
|
|
index 95eef7ebdac5c..28923b776cdc8 100644
|
|
--- a/tools/lib/bpf/libbpf.c
|
|
+++ b/tools/lib/bpf/libbpf.c
|
|
@@ -4123,6 +4123,7 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map)
|
|
{
|
|
struct bpf_create_map_attr create_attr;
|
|
struct bpf_map_def *def = &map->def;
|
|
+ int err = 0;
|
|
|
|
memset(&create_attr, 0, sizeof(create_attr));
|
|
|
|
@@ -4165,8 +4166,6 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map)
|
|
|
|
if (bpf_map_type__is_map_in_map(def->type)) {
|
|
if (map->inner_map) {
|
|
- int err;
|
|
-
|
|
err = bpf_object__create_map(obj, map->inner_map);
|
|
if (err) {
|
|
pr_warn("map '%s': failed to create inner map: %d\n",
|
|
@@ -4183,8 +4182,8 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map)
|
|
if (map->fd < 0 && (create_attr.btf_key_type_id ||
|
|
create_attr.btf_value_type_id)) {
|
|
char *cp, errmsg[STRERR_BUFSIZE];
|
|
- int err = -errno;
|
|
|
|
+ err = -errno;
|
|
cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));
|
|
pr_warn("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n",
|
|
map->name, cp, err);
|
|
@@ -4196,15 +4195,14 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map)
|
|
map->fd = bpf_create_map_xattr(&create_attr);
|
|
}
|
|
|
|
- if (map->fd < 0)
|
|
- return -errno;
|
|
+ err = map->fd < 0 ? -errno : 0;
|
|
|
|
if (bpf_map_type__is_map_in_map(def->type) && map->inner_map) {
|
|
bpf_map__destroy(map->inner_map);
|
|
zfree(&map->inner_map);
|
|
}
|
|
|
|
- return 0;
|
|
+ return err;
|
|
}
|
|
|
|
static int init_map_slots(struct bpf_map *map)
|
|
@@ -6907,8 +6905,10 @@ __bpf_object__open(const char *path, const void *obj_buf, size_t obj_buf_sz,
|
|
kconfig = OPTS_GET(opts, kconfig, NULL);
|
|
if (kconfig) {
|
|
obj->kconfig = strdup(kconfig);
|
|
- if (!obj->kconfig)
|
|
- return ERR_PTR(-ENOMEM);
|
|
+ if (!obj->kconfig) {
|
|
+ err = -ENOMEM;
|
|
+ goto out;
|
|
+ }
|
|
}
|
|
|
|
err = bpf_object__elf_init(obj);
|
|
diff --git a/tools/testing/selftests/bpf/progs/bpf_iter_tcp4.c b/tools/testing/selftests/bpf/progs/bpf_iter_tcp4.c
|
|
index 54380c5e10692..aa96b604b2b31 100644
|
|
--- a/tools/testing/selftests/bpf/progs/bpf_iter_tcp4.c
|
|
+++ b/tools/testing/selftests/bpf/progs/bpf_iter_tcp4.c
|
|
@@ -122,7 +122,7 @@ static int dump_tcp_sock(struct seq_file *seq, struct tcp_sock *tp,
|
|
}
|
|
|
|
BPF_SEQ_PRINTF(seq, "%4d: %08X:%04X %08X:%04X ",
|
|
- seq_num, src, srcp, destp, destp);
|
|
+ seq_num, src, srcp, dest, destp);
|
|
BPF_SEQ_PRINTF(seq, "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d ",
|
|
state,
|
|
tp->write_seq - tp->snd_una, rx_queue,
|
|
diff --git a/tools/testing/selftests/bpf/progs/test_core_autosize.c b/tools/testing/selftests/bpf/progs/test_core_autosize.c
|
|
index 44f5aa2e8956f..9a7829c5e4a72 100644
|
|
--- a/tools/testing/selftests/bpf/progs/test_core_autosize.c
|
|
+++ b/tools/testing/selftests/bpf/progs/test_core_autosize.c
|
|
@@ -125,6 +125,16 @@ int handle_downsize(void *ctx)
|
|
return 0;
|
|
}
|
|
|
|
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
|
+#define bpf_core_read_int bpf_core_read
|
|
+#else
|
|
+#define bpf_core_read_int(dst, sz, src) ({ \
|
|
+ /* Prevent "subtraction from stack pointer prohibited" */ \
|
|
+ volatile long __off = sizeof(*dst) - (sz); \
|
|
+ bpf_core_read((char *)(dst) + __off, sz, src); \
|
|
+})
|
|
+#endif
|
|
+
|
|
SEC("raw_tp/sys_enter")
|
|
int handle_probed(void *ctx)
|
|
{
|
|
@@ -132,23 +142,23 @@ int handle_probed(void *ctx)
|
|
__u64 tmp;
|
|
|
|
tmp = 0;
|
|
- bpf_core_read(&tmp, bpf_core_field_size(in->ptr), &in->ptr);
|
|
+ bpf_core_read_int(&tmp, bpf_core_field_size(in->ptr), &in->ptr);
|
|
ptr_probed = tmp;
|
|
|
|
tmp = 0;
|
|
- bpf_core_read(&tmp, bpf_core_field_size(in->val1), &in->val1);
|
|
+ bpf_core_read_int(&tmp, bpf_core_field_size(in->val1), &in->val1);
|
|
val1_probed = tmp;
|
|
|
|
tmp = 0;
|
|
- bpf_core_read(&tmp, bpf_core_field_size(in->val2), &in->val2);
|
|
+ bpf_core_read_int(&tmp, bpf_core_field_size(in->val2), &in->val2);
|
|
val2_probed = tmp;
|
|
|
|
tmp = 0;
|
|
- bpf_core_read(&tmp, bpf_core_field_size(in->val3), &in->val3);
|
|
+ bpf_core_read_int(&tmp, bpf_core_field_size(in->val3), &in->val3);
|
|
val3_probed = tmp;
|
|
|
|
tmp = 0;
|
|
- bpf_core_read(&tmp, bpf_core_field_size(in->val4), &in->val4);
|
|
+ bpf_core_read_int(&tmp, bpf_core_field_size(in->val4), &in->val4);
|
|
val4_probed = tmp;
|
|
|
|
return 0;
|