diff options
205 files changed, 1916 insertions, 1103 deletions
| @@ -62,6 +62,7 @@ Frank Zago <fzago@systemfabricworks.com> | |||
| 62 | Greg Kroah-Hartman <greg@echidna.(none)> | 62 | Greg Kroah-Hartman <greg@echidna.(none)> |
| 63 | Greg Kroah-Hartman <gregkh@suse.de> | 63 | Greg Kroah-Hartman <gregkh@suse.de> |
| 64 | Greg Kroah-Hartman <greg@kroah.com> | 64 | Greg Kroah-Hartman <greg@kroah.com> |
| 65 | Gregory CLEMENT <gregory.clement@bootlin.com> <gregory.clement@free-electrons.com> | ||
| 65 | Henk Vergonet <Henk.Vergonet@gmail.com> | 66 | Henk Vergonet <Henk.Vergonet@gmail.com> |
| 66 | Henrik Kretzschmar <henne@nachtwindheim.de> | 67 | Henrik Kretzschmar <henne@nachtwindheim.de> |
| 67 | Henrik Rydberg <rydberg@bitmath.org> | 68 | Henrik Rydberg <rydberg@bitmath.org> |
diff --git a/Documentation/devicetree/bindings/iio/adc/sigma-delta-modulator.txt b/Documentation/devicetree/bindings/iio/adc/sigma-delta-modulator.txt index e9ebb8a20e0d..ba24ca7ba95e 100644 --- a/Documentation/devicetree/bindings/iio/adc/sigma-delta-modulator.txt +++ b/Documentation/devicetree/bindings/iio/adc/sigma-delta-modulator.txt | |||
| @@ -3,11 +3,11 @@ Device-Tree bindings for sigma delta modulator | |||
| 3 | Required properties: | 3 | Required properties: |
| 4 | - compatible: should be "ads1201", "sd-modulator". "sd-modulator" can be use | 4 | - compatible: should be "ads1201", "sd-modulator". "sd-modulator" can be use |
| 5 | as a generic SD modulator if modulator not specified in compatible list. | 5 | as a generic SD modulator if modulator not specified in compatible list. |
| 6 | - #io-channel-cells = <1>: See the IIO bindings section "IIO consumers". | 6 | - #io-channel-cells = <0>: See the IIO bindings section "IIO consumers". |
| 7 | 7 | ||
| 8 | Example node: | 8 | Example node: |
| 9 | 9 | ||
| 10 | ads1202: adc@0 { | 10 | ads1202: adc@0 { |
| 11 | compatible = "sd-modulator"; | 11 | compatible = "sd-modulator"; |
| 12 | #io-channel-cells = <1>; | 12 | #io-channel-cells = <0>; |
| 13 | }; | 13 | }; |
diff --git a/Documentation/isdn/INTERFACE.CAPI b/Documentation/isdn/INTERFACE.CAPI index 1688b5a1fd77..021aa9cf139d 100644 --- a/Documentation/isdn/INTERFACE.CAPI +++ b/Documentation/isdn/INTERFACE.CAPI | |||
| @@ -18,7 +18,7 @@ corresponding hardware driver. Kernel CAPI then forwards CAPI messages in both | |||
| 18 | directions between the application and the hardware driver. | 18 | directions between the application and the hardware driver. |
| 19 | 19 | ||
| 20 | Format and semantics of CAPI messages are specified in the CAPI 2.0 standard. | 20 | Format and semantics of CAPI messages are specified in the CAPI 2.0 standard. |
| 21 | This standard is freely available from http://www.capi.org. | 21 | This standard is freely available from https://www.capi.org. |
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | 2. Driver and Device Registration | 24 | 2. Driver and Device Registration |
diff --git a/Documentation/isdn/README b/Documentation/isdn/README index 32d4e80c2c03..74bd2bdb455b 100644 --- a/Documentation/isdn/README +++ b/Documentation/isdn/README | |||
| @@ -33,10 +33,10 @@ README for the ISDN-subsystem | |||
| 33 | de.alt.comm.isdn4linux | 33 | de.alt.comm.isdn4linux |
| 34 | 34 | ||
| 35 | There is also a well maintained FAQ in English available at | 35 | There is also a well maintained FAQ in English available at |
| 36 | http://www.mhessler.de/i4lfaq/ | 36 | https://www.mhessler.de/i4lfaq/ |
| 37 | It can be viewed online, or downloaded in sgml/text/html format. | 37 | It can be viewed online, or downloaded in sgml/text/html format. |
| 38 | The FAQ can also be viewed online at | 38 | The FAQ can also be viewed online at |
| 39 | http://www.isdn4linux.de/faq/ | 39 | https://www.isdn4linux.de/faq/i4lfaq.html |
| 40 | or downloaded from | 40 | or downloaded from |
| 41 | ftp://ftp.isdn4linux.de/pub/isdn4linux/FAQ/ | 41 | ftp://ftp.isdn4linux.de/pub/isdn4linux/FAQ/ |
| 42 | 42 | ||
diff --git a/Documentation/isdn/README.FAQ b/Documentation/isdn/README.FAQ index 356f7944641d..e5dd1addacdd 100644 --- a/Documentation/isdn/README.FAQ +++ b/Documentation/isdn/README.FAQ | |||
| @@ -8,9 +8,9 @@ You find it in: | |||
| 8 | 8 | ||
| 9 | In case you just want to see the FAQ online, or download the newest version, | 9 | In case you just want to see the FAQ online, or download the newest version, |
| 10 | you can have a look at my website: | 10 | you can have a look at my website: |
| 11 | http://www.mhessler.de/i4lfaq/ (view + download) | 11 | https://www.mhessler.de/i4lfaq/ (view + download) |
| 12 | or: | 12 | or: |
| 13 | http://www.isdn4linux.de/faq/ (view) | 13 | https://www.isdn4linux.de/faq/4lfaq.html (view) |
| 14 | 14 | ||
| 15 | As the extension tells, the FAQ is in SGML format, and you can convert it | 15 | As the extension tells, the FAQ is in SGML format, and you can convert it |
| 16 | into text/html/... format by using the sgml2txt/sgml2html/... tools. | 16 | into text/html/... format by using the sgml2txt/sgml2html/... tools. |
diff --git a/Documentation/isdn/README.gigaset b/Documentation/isdn/README.gigaset index 7534c6039adc..9b1ce277ca3d 100644 --- a/Documentation/isdn/README.gigaset +++ b/Documentation/isdn/README.gigaset | |||
| @@ -29,8 +29,9 @@ GigaSet 307x Device Driver | |||
| 29 | T-Com Sinus 721 data | 29 | T-Com Sinus 721 data |
| 30 | Chicago 390 USB (KPN) | 30 | Chicago 390 USB (KPN) |
| 31 | 31 | ||
| 32 | See also http://www.erbze.info/sinus_gigaset.htm and | 32 | See also http://www.erbze.info/sinus_gigaset.htm |
| 33 | http://gigaset307x.sourceforge.net/ | 33 | (archived at https://web.archive.org/web/20100717020421/http://www.erbze.info:80/sinus_gigaset.htm ) and |
| 34 | http://gigaset307x.sourceforge.net/ | ||
| 34 | 35 | ||
| 35 | We had also reports from users of Gigaset M105 who could use the drivers | 36 | We had also reports from users of Gigaset M105 who could use the drivers |
| 36 | with SX 100 and CX 100 ISDN bases (only in unimodem mode, see section 2.5.) | 37 | with SX 100 and CX 100 ISDN bases (only in unimodem mode, see section 2.5.) |
| @@ -52,7 +53,7 @@ GigaSet 307x Device Driver | |||
| 52 | to use CAPI 2.0 or ISDN4Linux for ISDN connections (voice or data). | 53 | to use CAPI 2.0 or ISDN4Linux for ISDN connections (voice or data). |
| 53 | 54 | ||
| 54 | There are some user space tools available at | 55 | There are some user space tools available at |
| 55 | http://sourceforge.net/projects/gigaset307x/ | 56 | https://sourceforge.net/projects/gigaset307x/ |
| 56 | which provide access to additional device specific functions like SMS, | 57 | which provide access to additional device specific functions like SMS, |
| 57 | phonebook or call journal. | 58 | phonebook or call journal. |
| 58 | 59 | ||
| @@ -202,7 +203,7 @@ GigaSet 307x Device Driver | |||
| 202 | You can use some configuration tool of your distribution to configure this | 203 | You can use some configuration tool of your distribution to configure this |
| 203 | "modem" or configure pppd/wvdial manually. There are some example ppp | 204 | "modem" or configure pppd/wvdial manually. There are some example ppp |
| 204 | configuration files and chat scripts in the gigaset-VERSION/ppp directory | 205 | configuration files and chat scripts in the gigaset-VERSION/ppp directory |
| 205 | in the driver packages from http://sourceforge.net/projects/gigaset307x/. | 206 | in the driver packages from https://sourceforge.net/projects/gigaset307x/. |
| 206 | Please note that the USB drivers are not able to change the state of the | 207 | Please note that the USB drivers are not able to change the state of the |
| 207 | control lines. This means you must use "Stupid Mode" if you are using | 208 | control lines. This means you must use "Stupid Mode" if you are using |
| 208 | wvdial or you should use the nocrtscts option of pppd. | 209 | wvdial or you should use the nocrtscts option of pppd. |
| @@ -361,7 +362,7 @@ GigaSet 307x Device Driver | |||
| 361 | --------------------------- | 362 | --------------------------- |
| 362 | If you can't solve problems with the driver on your own, feel free to | 363 | If you can't solve problems with the driver on your own, feel free to |
| 363 | use one of the forums, bug trackers, or mailing lists on | 364 | use one of the forums, bug trackers, or mailing lists on |
| 364 | http://sourceforge.net/projects/gigaset307x | 365 | https://sourceforge.net/projects/gigaset307x |
| 365 | or write an electronic mail to the maintainers. | 366 | or write an electronic mail to the maintainers. |
| 366 | 367 | ||
| 367 | Try to provide as much information as possible, such as | 368 | Try to provide as much information as possible, such as |
| @@ -391,11 +392,12 @@ GigaSet 307x Device Driver | |||
| 391 | 4. Links, other software | 392 | 4. Links, other software |
| 392 | --------------------- | 393 | --------------------- |
| 393 | - Sourceforge project developing this driver and associated tools | 394 | - Sourceforge project developing this driver and associated tools |
| 394 | http://sourceforge.net/projects/gigaset307x | 395 | https://sourceforge.net/projects/gigaset307x |
| 395 | - Yahoo! Group on the Siemens Gigaset family of devices | 396 | - Yahoo! Group on the Siemens Gigaset family of devices |
| 396 | http://de.groups.yahoo.com/group/Siemens-Gigaset | 397 | https://de.groups.yahoo.com/group/Siemens-Gigaset |
| 397 | - Siemens Gigaset/T-Sinus compatibility table | 398 | - Siemens Gigaset/T-Sinus compatibility table |
| 398 | http://www.erbze.info/sinus_gigaset.htm | 399 | http://www.erbze.info/sinus_gigaset.htm |
| 400 | (archived at https://web.archive.org/web/20100717020421/http://www.erbze.info:80/sinus_gigaset.htm ) | ||
| 399 | 401 | ||
| 400 | 402 | ||
| 401 | 5. Credits | 403 | 5. Credits |
diff --git a/MAINTAINERS b/MAINTAINERS index 22ef8d64fa59..cbffcd4b1320 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1060,41 +1060,42 @@ ARM PORT | |||
| 1060 | M: Russell King <linux@armlinux.org.uk> | 1060 | M: Russell King <linux@armlinux.org.uk> |
| 1061 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1061 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 1062 | W: http://www.armlinux.org.uk/ | 1062 | W: http://www.armlinux.org.uk/ |
| 1063 | S: Maintained | 1063 | S: Odd Fixes |
| 1064 | T: git git://git.armlinux.org.uk/~rmk/linux-arm.git | 1064 | T: git git://git.armlinux.org.uk/~rmk/linux-arm.git |
| 1065 | F: arch/arm/ | 1065 | F: arch/arm/ |
| 1066 | X: arch/arm/boot/dts/ | ||
| 1066 | 1067 | ||
| 1067 | ARM PRIMECELL AACI PL041 DRIVER | 1068 | ARM PRIMECELL AACI PL041 DRIVER |
| 1068 | M: Russell King <linux@armlinux.org.uk> | 1069 | M: Russell King <linux@armlinux.org.uk> |
| 1069 | S: Maintained | 1070 | S: Odd Fixes |
| 1070 | F: sound/arm/aaci.* | 1071 | F: sound/arm/aaci.* |
| 1071 | 1072 | ||
| 1072 | ARM PRIMECELL BUS SUPPORT | 1073 | ARM PRIMECELL BUS SUPPORT |
| 1073 | M: Russell King <linux@armlinux.org.uk> | 1074 | M: Russell King <linux@armlinux.org.uk> |
| 1074 | S: Maintained | 1075 | S: Odd Fixes |
| 1075 | F: drivers/amba/ | 1076 | F: drivers/amba/ |
| 1076 | F: include/linux/amba/bus.h | 1077 | F: include/linux/amba/bus.h |
| 1077 | 1078 | ||
| 1078 | ARM PRIMECELL CLCD PL110 DRIVER | 1079 | ARM PRIMECELL CLCD PL110 DRIVER |
| 1079 | M: Russell King <linux@armlinux.org.uk> | 1080 | M: Russell King <linux@armlinux.org.uk> |
| 1080 | S: Maintained | 1081 | S: Odd Fixes |
| 1081 | F: drivers/video/fbdev/amba-clcd.* | 1082 | F: drivers/video/fbdev/amba-clcd.* |
| 1082 | 1083 | ||
| 1083 | ARM PRIMECELL KMI PL050 DRIVER | 1084 | ARM PRIMECELL KMI PL050 DRIVER |
| 1084 | M: Russell King <linux@armlinux.org.uk> | 1085 | M: Russell King <linux@armlinux.org.uk> |
| 1085 | S: Maintained | 1086 | S: Odd Fixes |
| 1086 | F: drivers/input/serio/ambakmi.* | 1087 | F: drivers/input/serio/ambakmi.* |
| 1087 | F: include/linux/amba/kmi.h | 1088 | F: include/linux/amba/kmi.h |
| 1088 | 1089 | ||
| 1089 | ARM PRIMECELL MMCI PL180/1 DRIVER | 1090 | ARM PRIMECELL MMCI PL180/1 DRIVER |
| 1090 | M: Russell King <linux@armlinux.org.uk> | 1091 | M: Russell King <linux@armlinux.org.uk> |
| 1091 | S: Maintained | 1092 | S: Odd Fixes |
| 1092 | F: drivers/mmc/host/mmci.* | 1093 | F: drivers/mmc/host/mmci.* |
| 1093 | F: include/linux/amba/mmci.h | 1094 | F: include/linux/amba/mmci.h |
| 1094 | 1095 | ||
| 1095 | ARM PRIMECELL UART PL010 AND PL011 DRIVERS | 1096 | ARM PRIMECELL UART PL010 AND PL011 DRIVERS |
| 1096 | M: Russell King <linux@armlinux.org.uk> | 1097 | M: Russell King <linux@armlinux.org.uk> |
| 1097 | S: Maintained | 1098 | S: Odd Fixes |
| 1098 | F: drivers/tty/serial/amba-pl01*.c | 1099 | F: drivers/tty/serial/amba-pl01*.c |
| 1099 | F: include/linux/amba/serial.h | 1100 | F: include/linux/amba/serial.h |
| 1100 | 1101 | ||
| @@ -1152,7 +1153,7 @@ S: Maintained | |||
| 1152 | F: drivers/clk/sunxi/ | 1153 | F: drivers/clk/sunxi/ |
| 1153 | 1154 | ||
| 1154 | ARM/Allwinner sunXi SoC support | 1155 | ARM/Allwinner sunXi SoC support |
| 1155 | M: Maxime Ripard <maxime.ripard@free-electrons.com> | 1156 | M: Maxime Ripard <maxime.ripard@bootlin.com> |
| 1156 | M: Chen-Yu Tsai <wens@csie.org> | 1157 | M: Chen-Yu Tsai <wens@csie.org> |
| 1157 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1158 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 1158 | S: Maintained | 1159 | S: Maintained |
| @@ -4626,7 +4627,7 @@ F: include/uapi/drm/drm* | |||
| 4626 | F: include/linux/vga* | 4627 | F: include/linux/vga* |
| 4627 | 4628 | ||
| 4628 | DRM DRIVERS FOR ALLWINNER A10 | 4629 | DRM DRIVERS FOR ALLWINNER A10 |
| 4629 | M: Maxime Ripard <maxime.ripard@free-electrons.com> | 4630 | M: Maxime Ripard <maxime.ripard@bootlin.com> |
| 4630 | L: dri-devel@lists.freedesktop.org | 4631 | L: dri-devel@lists.freedesktop.org |
| 4631 | S: Supported | 4632 | S: Supported |
| 4632 | F: drivers/gpu/drm/sun4i/ | 4633 | F: drivers/gpu/drm/sun4i/ |
| @@ -8435,7 +8436,7 @@ S: Orphan | |||
| 8435 | F: drivers/net/wireless/marvell/libertas/ | 8436 | F: drivers/net/wireless/marvell/libertas/ |
| 8436 | 8437 | ||
| 8437 | MARVELL MACCHIATOBIN SUPPORT | 8438 | MARVELL MACCHIATOBIN SUPPORT |
| 8438 | M: Russell King <rmk@armlinux.org.uk> | 8439 | M: Russell King <linux@armlinux.org.uk> |
| 8439 | L: linux-arm-kernel@lists.infradead.org | 8440 | L: linux-arm-kernel@lists.infradead.org |
| 8440 | S: Maintained | 8441 | S: Maintained |
| 8441 | F: arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts | 8442 | F: arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts |
| @@ -8448,7 +8449,7 @@ F: drivers/net/ethernet/marvell/mv643xx_eth.* | |||
| 8448 | F: include/linux/mv643xx.h | 8449 | F: include/linux/mv643xx.h |
| 8449 | 8450 | ||
| 8450 | MARVELL MV88X3310 PHY DRIVER | 8451 | MARVELL MV88X3310 PHY DRIVER |
| 8451 | M: Russell King <rmk@armlinux.org.uk> | 8452 | M: Russell King <linux@armlinux.org.uk> |
| 8452 | L: netdev@vger.kernel.org | 8453 | L: netdev@vger.kernel.org |
| 8453 | S: Maintained | 8454 | S: Maintained |
| 8454 | F: drivers/net/phy/marvell10g.c | 8455 | F: drivers/net/phy/marvell10g.c |
| @@ -12892,6 +12893,19 @@ S: Maintained | |||
| 12892 | F: drivers/net/ethernet/socionext/netsec.c | 12893 | F: drivers/net/ethernet/socionext/netsec.c |
| 12893 | F: Documentation/devicetree/bindings/net/socionext-netsec.txt | 12894 | F: Documentation/devicetree/bindings/net/socionext-netsec.txt |
| 12894 | 12895 | ||
| 12896 | SOLIDRUN CLEARFOG SUPPORT | ||
| 12897 | M: Russell King <linux@armlinux.org.uk> | ||
| 12898 | S: Maintained | ||
| 12899 | F: arch/arm/boot/dts/armada-388-clearfog* | ||
| 12900 | F: arch/arm/boot/dts/armada-38x-solidrun-* | ||
| 12901 | |||
| 12902 | SOLIDRUN CUBOX-I/HUMMINGBOARD SUPPORT | ||
| 12903 | M: Russell King <linux@armlinux.org.uk> | ||
| 12904 | S: Maintained | ||
| 12905 | F: arch/arm/boot/dts/imx6*-cubox-i* | ||
| 12906 | F: arch/arm/boot/dts/imx6*-hummingboard* | ||
| 12907 | F: arch/arm/boot/dts/imx6*-sr-* | ||
| 12908 | |||
| 12895 | SONIC NETWORK DRIVER | 12909 | SONIC NETWORK DRIVER |
| 12896 | M: Thomas Bogendoerfer <tsbogend@alpha.franken.de> | 12910 | M: Thomas Bogendoerfer <tsbogend@alpha.franken.de> |
| 12897 | L: netdev@vger.kernel.org | 12911 | L: netdev@vger.kernel.org |
| @@ -13661,7 +13675,8 @@ S: Supported | |||
| 13661 | F: drivers/i2c/busses/i2c-tegra.c | 13675 | F: drivers/i2c/busses/i2c-tegra.c |
| 13662 | 13676 | ||
| 13663 | TEGRA IOMMU DRIVERS | 13677 | TEGRA IOMMU DRIVERS |
| 13664 | M: Hiroshi Doyu <hdoyu@nvidia.com> | 13678 | M: Thierry Reding <thierry.reding@gmail.com> |
| 13679 | L: linux-tegra@vger.kernel.org | ||
| 13665 | S: Supported | 13680 | S: Supported |
| 13666 | F: drivers/iommu/tegra* | 13681 | F: drivers/iommu/tegra* |
| 13667 | 13682 | ||
| @@ -2,7 +2,7 @@ | |||
| 2 | VERSION = 4 | 2 | VERSION = 4 |
| 3 | PATCHLEVEL = 16 | 3 | PATCHLEVEL = 16 |
| 4 | SUBLEVEL = 0 | 4 | SUBLEVEL = 0 |
| 5 | EXTRAVERSION = -rc6 | 5 | EXTRAVERSION = -rc7 |
| 6 | NAME = Fearless Coyote | 6 | NAME = Fearless Coyote |
| 7 | 7 | ||
| 8 | # *DOCUMENTATION* | 8 | # *DOCUMENTATION* |
| @@ -487,6 +487,8 @@ CLANG_GCC_TC := --gcc-toolchain=$(GCC_TOOLCHAIN) | |||
| 487 | endif | 487 | endif |
| 488 | KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) | 488 | KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) |
| 489 | KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) | 489 | KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) |
| 490 | KBUILD_CFLAGS += $(call cc-option, -no-integrated-as) | ||
| 491 | KBUILD_AFLAGS += $(call cc-option, -no-integrated-as) | ||
| 490 | endif | 492 | endif |
| 491 | 493 | ||
| 492 | RETPOLINE_CFLAGS_GCC := -mindirect-branch=thunk-extern -mindirect-branch-register | 494 | RETPOLINE_CFLAGS_GCC := -mindirect-branch=thunk-extern -mindirect-branch-register |
| @@ -743,8 +745,6 @@ KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare) | |||
| 743 | # See modpost pattern 2 | 745 | # See modpost pattern 2 |
| 744 | KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,) | 746 | KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,) |
| 745 | KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior) | 747 | KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior) |
| 746 | KBUILD_CFLAGS += $(call cc-option, -no-integrated-as) | ||
| 747 | KBUILD_AFLAGS += $(call cc-option, -no-integrated-as) | ||
| 748 | else | 748 | else |
| 749 | 749 | ||
| 750 | # These warnings generated too much noise in a regular build. | 750 | # These warnings generated too much noise in a regular build. |
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 78a647080ebc..199ebc1c4538 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug | |||
| @@ -22,6 +22,7 @@ config ARM_PTDUMP_DEBUGFS | |||
| 22 | 22 | ||
| 23 | config DEBUG_WX | 23 | config DEBUG_WX |
| 24 | bool "Warn on W+X mappings at boot" | 24 | bool "Warn on W+X mappings at boot" |
| 25 | depends on MMU | ||
| 25 | select ARM_PTDUMP_CORE | 26 | select ARM_PTDUMP_CORE |
| 26 | ---help--- | 27 | ---help--- |
| 27 | Generate a warning if any W+X mappings are found at boot. | 28 | Generate a warning if any W+X mappings are found at boot. |
diff --git a/arch/arm/boot/deflate_xip_data.sh b/arch/arm/boot/deflate_xip_data.sh index 1189598a25eb..5e7d758ebdd6 100755 --- a/arch/arm/boot/deflate_xip_data.sh +++ b/arch/arm/boot/deflate_xip_data.sh | |||
| @@ -30,7 +30,7 @@ esac | |||
| 30 | 30 | ||
| 31 | sym_val() { | 31 | sym_val() { |
| 32 | # extract hex value for symbol in $1 | 32 | # extract hex value for symbol in $1 |
| 33 | local val=$($NM "$VMLINUX" | sed -n "/ $1$/{s/ .*$//p;q}") | 33 | local val=$($NM "$VMLINUX" 2>/dev/null | sed -n "/ $1\$/{s/ .*$//p;q}") |
| 34 | [ "$val" ] || { echo "can't find $1 in $VMLINUX" 1>&2; exit 1; } | 34 | [ "$val" ] || { echo "can't find $1 in $VMLINUX" 1>&2; exit 1; } |
| 35 | # convert from hex to decimal | 35 | # convert from hex to decimal |
| 36 | echo $((0x$val)) | 36 | echo $((0x$val)) |
| @@ -48,12 +48,12 @@ data_end=$(($_edata_loc - $base_offset)) | |||
| 48 | file_end=$(stat -c "%s" "$XIPIMAGE") | 48 | file_end=$(stat -c "%s" "$XIPIMAGE") |
| 49 | if [ "$file_end" != "$data_end" ]; then | 49 | if [ "$file_end" != "$data_end" ]; then |
| 50 | printf "end of xipImage doesn't match with _edata_loc (%#x vs %#x)\n" \ | 50 | printf "end of xipImage doesn't match with _edata_loc (%#x vs %#x)\n" \ |
| 51 | $(($file_end + $base_offset)) $_edata_loc 2>&1 | 51 | $(($file_end + $base_offset)) $_edata_loc 1>&2 |
| 52 | exit 1; | 52 | exit 1; |
| 53 | fi | 53 | fi |
| 54 | 54 | ||
| 55 | # be ready to clean up | 55 | # be ready to clean up |
| 56 | trap 'rm -f "$XIPIMAGE.tmp"' 0 1 2 3 | 56 | trap 'rm -f "$XIPIMAGE.tmp"; exit 1' 1 2 3 |
| 57 | 57 | ||
| 58 | # substitute the data section by a compressed version | 58 | # substitute the data section by a compressed version |
| 59 | $DD if="$XIPIMAGE" count=$data_start iflag=count_bytes of="$XIPIMAGE.tmp" | 59 | $DD if="$XIPIMAGE" count=$data_start iflag=count_bytes of="$XIPIMAGE.tmp" |
diff --git a/arch/arm/boot/dts/aspeed-g4.dtsi b/arch/arm/boot/dts/aspeed-g4.dtsi index b0d8431a3700..ae2b8c952e80 100644 --- a/arch/arm/boot/dts/aspeed-g4.dtsi +++ b/arch/arm/boot/dts/aspeed-g4.dtsi | |||
| @@ -42,6 +42,11 @@ | |||
| 42 | }; | 42 | }; |
| 43 | }; | 43 | }; |
| 44 | 44 | ||
| 45 | memory@40000000 { | ||
| 46 | device_type = "memory"; | ||
| 47 | reg = <0x40000000 0>; | ||
| 48 | }; | ||
| 49 | |||
| 45 | ahb { | 50 | ahb { |
| 46 | compatible = "simple-bus"; | 51 | compatible = "simple-bus"; |
| 47 | #address-cells = <1>; | 52 | #address-cells = <1>; |
diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi index 40de3b66c33f..2477ebc11d9d 100644 --- a/arch/arm/boot/dts/aspeed-g5.dtsi +++ b/arch/arm/boot/dts/aspeed-g5.dtsi | |||
| @@ -42,6 +42,11 @@ | |||
| 42 | }; | 42 | }; |
| 43 | }; | 43 | }; |
| 44 | 44 | ||
| 45 | memory@80000000 { | ||
| 46 | device_type = "memory"; | ||
| 47 | reg = <0x80000000 0>; | ||
| 48 | }; | ||
| 49 | |||
| 45 | ahb { | 50 | ahb { |
| 46 | compatible = "simple-bus"; | 51 | compatible = "simple-bus"; |
| 47 | #address-cells = <1>; | 52 | #address-cells = <1>; |
diff --git a/arch/arm/boot/dts/imx7d-sdb.dts b/arch/arm/boot/dts/imx7d-sdb.dts index a7a5dc7b2700..e7d2db839d70 100644 --- a/arch/arm/boot/dts/imx7d-sdb.dts +++ b/arch/arm/boot/dts/imx7d-sdb.dts | |||
| @@ -82,7 +82,7 @@ | |||
| 82 | enable-active-high; | 82 | enable-active-high; |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | reg_usb_otg2_vbus: regulator-usb-otg1-vbus { | 85 | reg_usb_otg2_vbus: regulator-usb-otg2-vbus { |
| 86 | compatible = "regulator-fixed"; | 86 | compatible = "regulator-fixed"; |
| 87 | regulator-name = "usb_otg2_vbus"; | 87 | regulator-name = "usb_otg2_vbus"; |
| 88 | regulator-min-microvolt = <5000000>; | 88 | regulator-min-microvolt = <5000000>; |
diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index 6102e4e7f35c..354aff45c1af 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi | |||
| @@ -927,6 +927,7 @@ | |||
| 927 | i2s: i2s@ff890000 { | 927 | i2s: i2s@ff890000 { |
| 928 | compatible = "rockchip,rk3288-i2s", "rockchip,rk3066-i2s"; | 928 | compatible = "rockchip,rk3288-i2s", "rockchip,rk3066-i2s"; |
| 929 | reg = <0x0 0xff890000 0x0 0x10000>; | 929 | reg = <0x0 0xff890000 0x0 0x10000>; |
| 930 | #sound-dai-cells = <0>; | ||
| 930 | interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>; | 931 | interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>; |
| 931 | #address-cells = <1>; | 932 | #address-cells = <1>; |
| 932 | #size-cells = <0>; | 933 | #size-cells = <0>; |
| @@ -1176,6 +1177,7 @@ | |||
| 1176 | compatible = "rockchip,rk3288-dw-hdmi"; | 1177 | compatible = "rockchip,rk3288-dw-hdmi"; |
| 1177 | reg = <0x0 0xff980000 0x0 0x20000>; | 1178 | reg = <0x0 0xff980000 0x0 0x20000>; |
| 1178 | reg-io-width = <4>; | 1179 | reg-io-width = <4>; |
| 1180 | #sound-dai-cells = <0>; | ||
| 1179 | rockchip,grf = <&grf>; | 1181 | rockchip,grf = <&grf>; |
| 1180 | interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>; | 1182 | interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>; |
| 1181 | clocks = <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_HDCP>, <&cru SCLK_HDMI_CEC>; | 1183 | clocks = <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_HDCP>, <&cru SCLK_HDMI_CEC>; |
diff --git a/arch/arm/boot/dts/sun6i-a31s-sinovoip-bpi-m2.dts b/arch/arm/boot/dts/sun6i-a31s-sinovoip-bpi-m2.dts index 51e6f1d21c32..b2758dd8ce43 100644 --- a/arch/arm/boot/dts/sun6i-a31s-sinovoip-bpi-m2.dts +++ b/arch/arm/boot/dts/sun6i-a31s-sinovoip-bpi-m2.dts | |||
| @@ -42,7 +42,6 @@ | |||
| 42 | 42 | ||
| 43 | /dts-v1/; | 43 | /dts-v1/; |
| 44 | #include "sun6i-a31s.dtsi" | 44 | #include "sun6i-a31s.dtsi" |
| 45 | #include "sunxi-common-regulators.dtsi" | ||
| 46 | #include <dt-bindings/gpio/gpio.h> | 45 | #include <dt-bindings/gpio/gpio.h> |
| 47 | 46 | ||
| 48 | / { | 47 | / { |
| @@ -99,6 +98,7 @@ | |||
| 99 | pinctrl-0 = <&gmac_pins_rgmii_a>, <&gmac_phy_reset_pin_bpi_m2>; | 98 | pinctrl-0 = <&gmac_pins_rgmii_a>, <&gmac_phy_reset_pin_bpi_m2>; |
| 100 | phy = <&phy1>; | 99 | phy = <&phy1>; |
| 101 | phy-mode = "rgmii"; | 100 | phy-mode = "rgmii"; |
| 101 | phy-supply = <®_dldo1>; | ||
| 102 | snps,reset-gpio = <&pio 0 21 GPIO_ACTIVE_HIGH>; /* PA21 */ | 102 | snps,reset-gpio = <&pio 0 21 GPIO_ACTIVE_HIGH>; /* PA21 */ |
| 103 | snps,reset-active-low; | 103 | snps,reset-active-low; |
| 104 | snps,reset-delays-us = <0 10000 30000>; | 104 | snps,reset-delays-us = <0 10000 30000>; |
| @@ -118,7 +118,7 @@ | |||
| 118 | &mmc0 { | 118 | &mmc0 { |
| 119 | pinctrl-names = "default"; | 119 | pinctrl-names = "default"; |
| 120 | pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_bpi_m2>; | 120 | pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_bpi_m2>; |
| 121 | vmmc-supply = <®_vcc3v0>; | 121 | vmmc-supply = <®_dcdc1>; |
| 122 | bus-width = <4>; | 122 | bus-width = <4>; |
| 123 | cd-gpios = <&pio 0 4 GPIO_ACTIVE_HIGH>; /* PA4 */ | 123 | cd-gpios = <&pio 0 4 GPIO_ACTIVE_HIGH>; /* PA4 */ |
| 124 | cd-inverted; | 124 | cd-inverted; |
| @@ -132,7 +132,7 @@ | |||
| 132 | &mmc2 { | 132 | &mmc2 { |
| 133 | pinctrl-names = "default"; | 133 | pinctrl-names = "default"; |
| 134 | pinctrl-0 = <&mmc2_pins_a>; | 134 | pinctrl-0 = <&mmc2_pins_a>; |
| 135 | vmmc-supply = <®_vcc3v0>; | 135 | vmmc-supply = <®_aldo1>; |
| 136 | mmc-pwrseq = <&mmc2_pwrseq>; | 136 | mmc-pwrseq = <&mmc2_pwrseq>; |
| 137 | bus-width = <4>; | 137 | bus-width = <4>; |
| 138 | non-removable; | 138 | non-removable; |
| @@ -163,6 +163,8 @@ | |||
| 163 | reg = <0x68>; | 163 | reg = <0x68>; |
| 164 | interrupt-parent = <&nmi_intc>; | 164 | interrupt-parent = <&nmi_intc>; |
| 165 | interrupts = <0 IRQ_TYPE_LEVEL_LOW>; | 165 | interrupts = <0 IRQ_TYPE_LEVEL_LOW>; |
| 166 | eldoin-supply = <®_dcdc1>; | ||
| 167 | x-powers,drive-vbus-en; | ||
| 166 | }; | 168 | }; |
| 167 | }; | 169 | }; |
| 168 | 170 | ||
| @@ -193,7 +195,28 @@ | |||
| 193 | 195 | ||
| 194 | #include "axp22x.dtsi" | 196 | #include "axp22x.dtsi" |
| 195 | 197 | ||
| 198 | ®_aldo1 { | ||
| 199 | regulator-min-microvolt = <3300000>; | ||
| 200 | regulator-max-microvolt = <3300000>; | ||
| 201 | regulator-name = "vcc-wifi"; | ||
| 202 | }; | ||
| 203 | |||
| 204 | ®_aldo2 { | ||
| 205 | regulator-always-on; | ||
| 206 | regulator-min-microvolt = <2500000>; | ||
| 207 | regulator-max-microvolt = <2500000>; | ||
| 208 | regulator-name = "vcc-gmac"; | ||
| 209 | }; | ||
| 210 | |||
| 211 | ®_aldo3 { | ||
| 212 | regulator-always-on; | ||
| 213 | regulator-min-microvolt = <3000000>; | ||
| 214 | regulator-max-microvolt = <3000000>; | ||
| 215 | regulator-name = "avcc"; | ||
| 216 | }; | ||
| 217 | |||
| 196 | ®_dc5ldo { | 218 | ®_dc5ldo { |
| 219 | regulator-always-on; | ||
| 197 | regulator-min-microvolt = <700000>; | 220 | regulator-min-microvolt = <700000>; |
| 198 | regulator-max-microvolt = <1320000>; | 221 | regulator-max-microvolt = <1320000>; |
| 199 | regulator-name = "vdd-cpus"; | 222 | regulator-name = "vdd-cpus"; |
| @@ -233,6 +256,40 @@ | |||
| 233 | regulator-name = "vcc-dram"; | 256 | regulator-name = "vcc-dram"; |
| 234 | }; | 257 | }; |
| 235 | 258 | ||
| 259 | ®_dldo1 { | ||
| 260 | regulator-min-microvolt = <3000000>; | ||
| 261 | regulator-max-microvolt = <3000000>; | ||
| 262 | regulator-name = "vcc-mac"; | ||
| 263 | }; | ||
| 264 | |||
| 265 | ®_dldo2 { | ||
| 266 | regulator-min-microvolt = <2800000>; | ||
| 267 | regulator-max-microvolt = <2800000>; | ||
| 268 | regulator-name = "avdd-csi"; | ||
| 269 | }; | ||
| 270 | |||
| 271 | ®_dldo3 { | ||
| 272 | regulator-always-on; | ||
| 273 | regulator-min-microvolt = <3300000>; | ||
| 274 | regulator-max-microvolt = <3300000>; | ||
| 275 | regulator-name = "vcc-pb"; | ||
| 276 | }; | ||
| 277 | |||
| 278 | ®_eldo1 { | ||
| 279 | regulator-min-microvolt = <1800000>; | ||
| 280 | regulator-max-microvolt = <1800000>; | ||
| 281 | regulator-name = "vdd-csi"; | ||
| 282 | status = "okay"; | ||
| 283 | }; | ||
| 284 | |||
| 285 | ®_ldo_io1 { | ||
| 286 | regulator-always-on; | ||
| 287 | regulator-min-microvolt = <1800000>; | ||
| 288 | regulator-max-microvolt = <1800000>; | ||
| 289 | regulator-name = "vcc-pm-cpus"; | ||
| 290 | status = "okay"; | ||
| 291 | }; | ||
| 292 | |||
| 236 | &uart0 { | 293 | &uart0 { |
| 237 | pinctrl-names = "default"; | 294 | pinctrl-names = "default"; |
| 238 | pinctrl-0 = <&uart0_pins_a>; | 295 | pinctrl-0 = <&uart0_pins_a>; |
diff --git a/arch/arm/include/asm/vdso.h b/arch/arm/include/asm/vdso.h index 9c99e817535e..5b85889f82ee 100644 --- a/arch/arm/include/asm/vdso.h +++ b/arch/arm/include/asm/vdso.h | |||
| @@ -12,8 +12,6 @@ struct mm_struct; | |||
| 12 | 12 | ||
| 13 | void arm_install_vdso(struct mm_struct *mm, unsigned long addr); | 13 | void arm_install_vdso(struct mm_struct *mm, unsigned long addr); |
| 14 | 14 | ||
| 15 | extern char vdso_start, vdso_end; | ||
| 16 | |||
| 17 | extern unsigned int vdso_total_pages; | 15 | extern unsigned int vdso_total_pages; |
| 18 | 16 | ||
| 19 | #else /* CONFIG_VDSO */ | 17 | #else /* CONFIG_VDSO */ |
diff --git a/arch/arm/kernel/vdso.c b/arch/arm/kernel/vdso.c index a4d6dc0f2427..f4dd7f9663c1 100644 --- a/arch/arm/kernel/vdso.c +++ b/arch/arm/kernel/vdso.c | |||
| @@ -39,6 +39,8 @@ | |||
| 39 | 39 | ||
| 40 | static struct page **vdso_text_pagelist; | 40 | static struct page **vdso_text_pagelist; |
| 41 | 41 | ||
| 42 | extern char vdso_start[], vdso_end[]; | ||
| 43 | |||
| 42 | /* Total number of pages needed for the data and text portions of the VDSO. */ | 44 | /* Total number of pages needed for the data and text portions of the VDSO. */ |
| 43 | unsigned int vdso_total_pages __ro_after_init; | 45 | unsigned int vdso_total_pages __ro_after_init; |
| 44 | 46 | ||
| @@ -197,13 +199,13 @@ static int __init vdso_init(void) | |||
| 197 | unsigned int text_pages; | 199 | unsigned int text_pages; |
| 198 | int i; | 200 | int i; |
| 199 | 201 | ||
| 200 | if (memcmp(&vdso_start, "\177ELF", 4)) { | 202 | if (memcmp(vdso_start, "\177ELF", 4)) { |
| 201 | pr_err("VDSO is not a valid ELF object!\n"); | 203 | pr_err("VDSO is not a valid ELF object!\n"); |
| 202 | return -ENOEXEC; | 204 | return -ENOEXEC; |
| 203 | } | 205 | } |
| 204 | 206 | ||
| 205 | text_pages = (&vdso_end - &vdso_start) >> PAGE_SHIFT; | 207 | text_pages = (vdso_end - vdso_start) >> PAGE_SHIFT; |
| 206 | pr_debug("vdso: %i text pages at base %p\n", text_pages, &vdso_start); | 208 | pr_debug("vdso: %i text pages at base %p\n", text_pages, vdso_start); |
| 207 | 209 | ||
| 208 | /* Allocate the VDSO text pagelist */ | 210 | /* Allocate the VDSO text pagelist */ |
| 209 | vdso_text_pagelist = kcalloc(text_pages, sizeof(struct page *), | 211 | vdso_text_pagelist = kcalloc(text_pages, sizeof(struct page *), |
| @@ -218,7 +220,7 @@ static int __init vdso_init(void) | |||
| 218 | for (i = 0; i < text_pages; i++) { | 220 | for (i = 0; i < text_pages; i++) { |
| 219 | struct page *page; | 221 | struct page *page; |
| 220 | 222 | ||
| 221 | page = virt_to_page(&vdso_start + i * PAGE_SIZE); | 223 | page = virt_to_page(vdso_start + i * PAGE_SIZE); |
| 222 | vdso_text_pagelist[i] = page; | 224 | vdso_text_pagelist[i] = page; |
| 223 | } | 225 | } |
| 224 | 226 | ||
| @@ -229,7 +231,7 @@ static int __init vdso_init(void) | |||
| 229 | 231 | ||
| 230 | cntvct_ok = cntvct_functional(); | 232 | cntvct_ok = cntvct_functional(); |
| 231 | 233 | ||
| 232 | patch_vdso(&vdso_start); | 234 | patch_vdso(vdso_start); |
| 233 | 235 | ||
| 234 | return 0; | 236 | return 0; |
| 235 | } | 237 | } |
diff --git a/arch/arm/mach-davinci/board-omapl138-hawk.c b/arch/arm/mach-davinci/board-omapl138-hawk.c index a3e78074be70..62eb7d668890 100644 --- a/arch/arm/mach-davinci/board-omapl138-hawk.c +++ b/arch/arm/mach-davinci/board-omapl138-hawk.c | |||
| @@ -127,8 +127,8 @@ static struct gpiod_lookup_table mmc_gpios_table = { | |||
| 127 | .dev_id = "da830-mmc.0", | 127 | .dev_id = "da830-mmc.0", |
| 128 | .table = { | 128 | .table = { |
| 129 | /* CD: gpio3_12: gpio60: chip 1 contains gpio range 32-63*/ | 129 | /* CD: gpio3_12: gpio60: chip 1 contains gpio range 32-63*/ |
| 130 | GPIO_LOOKUP("davinci_gpio.1", 28, "cd", GPIO_ACTIVE_LOW), | 130 | GPIO_LOOKUP("davinci_gpio.0", 28, "cd", GPIO_ACTIVE_LOW), |
| 131 | GPIO_LOOKUP("davinci_gpio.1", 29, "wp", GPIO_ACTIVE_LOW), | 131 | GPIO_LOOKUP("davinci_gpio.0", 29, "wp", GPIO_ACTIVE_LOW), |
| 132 | }, | 132 | }, |
| 133 | }; | 133 | }; |
| 134 | 134 | ||
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 7e5d7a083707..36cd23c8be9b 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
| @@ -133,6 +133,9 @@ static void __init u8500_init_machine(void) | |||
| 133 | if (of_machine_is_compatible("st-ericsson,u8540")) | 133 | if (of_machine_is_compatible("st-ericsson,u8540")) |
| 134 | of_platform_populate(NULL, u8500_local_bus_nodes, | 134 | of_platform_populate(NULL, u8500_local_bus_nodes, |
| 135 | u8540_auxdata_lookup, NULL); | 135 | u8540_auxdata_lookup, NULL); |
| 136 | else | ||
| 137 | of_platform_populate(NULL, u8500_local_bus_nodes, | ||
| 138 | NULL, NULL); | ||
| 136 | } | 139 | } |
| 137 | 140 | ||
| 138 | static const char * stericsson_dt_platform_compat[] = { | 141 | static const char * stericsson_dt_platform_compat[] = { |
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index d443e481c3e9..8805a59bae53 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
| @@ -888,11 +888,8 @@ static int omap_dm_timer_probe(struct platform_device *pdev) | |||
| 888 | timer->irq = irq->start; | 888 | timer->irq = irq->start; |
| 889 | timer->pdev = pdev; | 889 | timer->pdev = pdev; |
| 890 | 890 | ||
| 891 | /* Skip pm_runtime_enable for OMAP1 */ | 891 | pm_runtime_enable(dev); |
| 892 | if (!(timer->capability & OMAP_TIMER_NEEDS_RESET)) { | 892 | pm_runtime_irq_safe(dev); |
| 893 | pm_runtime_enable(dev); | ||
| 894 | pm_runtime_irq_safe(dev); | ||
| 895 | } | ||
| 896 | 893 | ||
| 897 | if (!timer->reserved) { | 894 | if (!timer->reserved) { |
| 898 | ret = pm_runtime_get_sync(dev); | 895 | ret = pm_runtime_get_sync(dev); |
diff --git a/arch/arm/plat-omap/include/plat/sram.h b/arch/arm/plat-omap/include/plat/sram.h index fb061cf0d736..30a07730807a 100644 --- a/arch/arm/plat-omap/include/plat/sram.h +++ b/arch/arm/plat-omap/include/plat/sram.h | |||
| @@ -5,13 +5,4 @@ void omap_map_sram(unsigned long start, unsigned long size, | |||
| 5 | unsigned long skip, int cached); | 5 | unsigned long skip, int cached); |
| 6 | void omap_sram_reset(void); | 6 | void omap_sram_reset(void); |
| 7 | 7 | ||
| 8 | extern void *omap_sram_push_address(unsigned long size); | 8 | extern void *omap_sram_push(void *funcp, unsigned long size); |
| 9 | |||
| 10 | /* Macro to push a function to the internal SRAM, using the fncpy API */ | ||
| 11 | #define omap_sram_push(funcp, size) ({ \ | ||
| 12 | typeof(&(funcp)) _res = NULL; \ | ||
| 13 | void *_sram_address = omap_sram_push_address(size); \ | ||
| 14 | if (_sram_address) \ | ||
| 15 | _res = fncpy(_sram_address, &(funcp), size); \ | ||
| 16 | _res; \ | ||
| 17 | }) | ||
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index a5bc92d7e476..921840acf65c 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <asm/fncpy.h> | 23 | #include <asm/fncpy.h> |
| 24 | #include <asm/tlb.h> | 24 | #include <asm/tlb.h> |
| 25 | #include <asm/cacheflush.h> | 25 | #include <asm/cacheflush.h> |
| 26 | #include <asm/set_memory.h> | ||
| 26 | 27 | ||
| 27 | #include <asm/mach/map.h> | 28 | #include <asm/mach/map.h> |
| 28 | 29 | ||
| @@ -42,7 +43,7 @@ static void __iomem *omap_sram_ceil; | |||
| 42 | * Note that fncpy requires the returned address to be aligned | 43 | * Note that fncpy requires the returned address to be aligned |
| 43 | * to an 8-byte boundary. | 44 | * to an 8-byte boundary. |
| 44 | */ | 45 | */ |
| 45 | void *omap_sram_push_address(unsigned long size) | 46 | static void *omap_sram_push_address(unsigned long size) |
| 46 | { | 47 | { |
| 47 | unsigned long available, new_ceil = (unsigned long)omap_sram_ceil; | 48 | unsigned long available, new_ceil = (unsigned long)omap_sram_ceil; |
| 48 | 49 | ||
| @@ -60,6 +61,30 @@ void *omap_sram_push_address(unsigned long size) | |||
| 60 | return (void *)omap_sram_ceil; | 61 | return (void *)omap_sram_ceil; |
| 61 | } | 62 | } |
| 62 | 63 | ||
| 64 | void *omap_sram_push(void *funcp, unsigned long size) | ||
| 65 | { | ||
| 66 | void *sram; | ||
| 67 | unsigned long base; | ||
| 68 | int pages; | ||
| 69 | void *dst = NULL; | ||
| 70 | |||
| 71 | sram = omap_sram_push_address(size); | ||
| 72 | if (!sram) | ||
| 73 | return NULL; | ||
| 74 | |||
| 75 | base = (unsigned long)sram & PAGE_MASK; | ||
| 76 | pages = PAGE_ALIGN(size) / PAGE_SIZE; | ||
| 77 | |||
| 78 | set_memory_rw(base, pages); | ||
| 79 | |||
| 80 | dst = fncpy(sram, funcp, size); | ||
| 81 | |||
| 82 | set_memory_ro(base, pages); | ||
| 83 | set_memory_x(base, pages); | ||
| 84 | |||
| 85 | return dst; | ||
| 86 | } | ||
| 87 | |||
| 63 | /* | 88 | /* |
| 64 | * The SRAM context is lost during off-idle and stack | 89 | * The SRAM context is lost during off-idle and stack |
| 65 | * needs to be reset. | 90 | * needs to be reset. |
| @@ -75,6 +100,9 @@ void omap_sram_reset(void) | |||
| 75 | void __init omap_map_sram(unsigned long start, unsigned long size, | 100 | void __init omap_map_sram(unsigned long start, unsigned long size, |
| 76 | unsigned long skip, int cached) | 101 | unsigned long skip, int cached) |
| 77 | { | 102 | { |
| 103 | unsigned long base; | ||
| 104 | int pages; | ||
| 105 | |||
| 78 | if (size == 0) | 106 | if (size == 0) |
| 79 | return; | 107 | return; |
| 80 | 108 | ||
| @@ -95,4 +123,10 @@ void __init omap_map_sram(unsigned long start, unsigned long size, | |||
| 95 | */ | 123 | */ |
| 96 | memset_io(omap_sram_base + omap_sram_skip, 0, | 124 | memset_io(omap_sram_base + omap_sram_skip, 0, |
| 97 | omap_sram_size - omap_sram_skip); | 125 | omap_sram_size - omap_sram_skip); |
| 126 | |||
| 127 | base = (unsigned long)omap_sram_base; | ||
| 128 | pages = PAGE_ALIGN(omap_sram_size) / PAGE_SIZE; | ||
| 129 | |||
| 130 | set_memory_ro(base, pages); | ||
| 131 | set_memory_x(base, pages); | ||
| 98 | } | 132 | } |
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index 03c6a3c72f9c..4c375e11ae95 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c | |||
| @@ -648,7 +648,7 @@ int vfp_restore_user_hwstate(struct user_vfp __user *ufp, | |||
| 648 | */ | 648 | */ |
| 649 | static int vfp_dying_cpu(unsigned int cpu) | 649 | static int vfp_dying_cpu(unsigned int cpu) |
| 650 | { | 650 | { |
| 651 | vfp_force_reload(cpu, current_thread_info()); | 651 | vfp_current_hw_state[cpu] = NULL; |
| 652 | return 0; | 652 | return 0; |
| 653 | } | 653 | } |
| 654 | 654 | ||
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi index 03f195025390..204bdb9857b9 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi | |||
| @@ -406,8 +406,9 @@ | |||
| 406 | wlan_pd_n: wlan-pd-n { | 406 | wlan_pd_n: wlan-pd-n { |
| 407 | compatible = "regulator-fixed"; | 407 | compatible = "regulator-fixed"; |
| 408 | regulator-name = "wlan_pd_n"; | 408 | regulator-name = "wlan_pd_n"; |
| 409 | pinctrl-names = "default"; | ||
| 410 | pinctrl-0 = <&wlan_module_reset_l>; | ||
| 409 | 411 | ||
| 410 | /* Note the wlan_module_reset_l pinctrl */ | ||
| 411 | enable-active-high; | 412 | enable-active-high; |
| 412 | gpio = <&gpio1 11 GPIO_ACTIVE_HIGH>; | 413 | gpio = <&gpio1 11 GPIO_ACTIVE_HIGH>; |
| 413 | 414 | ||
| @@ -983,12 +984,6 @@ ap_i2c_audio: &i2c8 { | |||
| 983 | pinctrl-0 = < | 984 | pinctrl-0 = < |
| 984 | &ap_pwroff /* AP will auto-assert this when in S3 */ | 985 | &ap_pwroff /* AP will auto-assert this when in S3 */ |
| 985 | &clk_32k /* This pin is always 32k on gru boards */ | 986 | &clk_32k /* This pin is always 32k on gru boards */ |
| 986 | |||
| 987 | /* | ||
| 988 | * We want this driven low ASAP; firmware should help us, but | ||
| 989 | * we can help ourselves too. | ||
| 990 | */ | ||
| 991 | &wlan_module_reset_l | ||
| 992 | >; | 987 | >; |
| 993 | 988 | ||
| 994 | pcfg_output_low: pcfg-output-low { | 989 | pcfg_output_low: pcfg-output-low { |
| @@ -1168,12 +1163,7 @@ ap_i2c_audio: &i2c8 { | |||
| 1168 | }; | 1163 | }; |
| 1169 | 1164 | ||
| 1170 | wlan_module_reset_l: wlan-module-reset-l { | 1165 | wlan_module_reset_l: wlan-module-reset-l { |
| 1171 | /* | 1166 | rockchip,pins = <1 11 RK_FUNC_GPIO &pcfg_pull_none>; |
| 1172 | * We want this driven low ASAP (As {Soon,Strongly} As | ||
| 1173 | * Possible), to avoid leakage through the powered-down | ||
| 1174 | * WiFi. | ||
| 1175 | */ | ||
| 1176 | rockchip,pins = <1 11 RK_FUNC_GPIO &pcfg_output_low>; | ||
| 1177 | }; | 1167 | }; |
| 1178 | 1168 | ||
| 1179 | bt_host_wake_l: bt-host-wake-l { | 1169 | bt_host_wake_l: bt-host-wake-l { |
diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi index 2605118d4b4c..0b81ca1d07e7 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi | |||
| @@ -411,8 +411,8 @@ | |||
| 411 | reg = <0x0 0xfe800000 0x0 0x100000>; | 411 | reg = <0x0 0xfe800000 0x0 0x100000>; |
| 412 | interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH 0>; | 412 | interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH 0>; |
| 413 | dr_mode = "otg"; | 413 | dr_mode = "otg"; |
| 414 | phys = <&u2phy0_otg>, <&tcphy0_usb3>; | 414 | phys = <&u2phy0_otg>; |
| 415 | phy-names = "usb2-phy", "usb3-phy"; | 415 | phy-names = "usb2-phy"; |
| 416 | phy_type = "utmi_wide"; | 416 | phy_type = "utmi_wide"; |
| 417 | snps,dis_enblslpm_quirk; | 417 | snps,dis_enblslpm_quirk; |
| 418 | snps,dis-u2-freeclk-exists-quirk; | 418 | snps,dis-u2-freeclk-exists-quirk; |
| @@ -444,8 +444,8 @@ | |||
| 444 | reg = <0x0 0xfe900000 0x0 0x100000>; | 444 | reg = <0x0 0xfe900000 0x0 0x100000>; |
| 445 | interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH 0>; | 445 | interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH 0>; |
| 446 | dr_mode = "otg"; | 446 | dr_mode = "otg"; |
| 447 | phys = <&u2phy1_otg>, <&tcphy1_usb3>; | 447 | phys = <&u2phy1_otg>; |
| 448 | phy-names = "usb2-phy", "usb3-phy"; | 448 | phy-names = "usb2-phy"; |
| 449 | phy_type = "utmi_wide"; | 449 | phy_type = "utmi_wide"; |
| 450 | snps,dis_enblslpm_quirk; | 450 | snps,dis_enblslpm_quirk; |
| 451 | snps,dis-u2-freeclk-exists-quirk; | 451 | snps,dis-u2-freeclk-exists-quirk; |
diff --git a/arch/mips/lantiq/Kconfig b/arch/mips/lantiq/Kconfig index 692ae85a3e3d..8e3a1fc2bc39 100644 --- a/arch/mips/lantiq/Kconfig +++ b/arch/mips/lantiq/Kconfig | |||
| @@ -13,6 +13,8 @@ choice | |||
| 13 | config SOC_AMAZON_SE | 13 | config SOC_AMAZON_SE |
| 14 | bool "Amazon SE" | 14 | bool "Amazon SE" |
| 15 | select SOC_TYPE_XWAY | 15 | select SOC_TYPE_XWAY |
| 16 | select MFD_SYSCON | ||
| 17 | select MFD_CORE | ||
| 16 | 18 | ||
| 17 | config SOC_XWAY | 19 | config SOC_XWAY |
| 18 | bool "XWAY" | 20 | bool "XWAY" |
diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c index 52500d3b7004..e0af39b33e28 100644 --- a/arch/mips/lantiq/xway/sysctrl.c +++ b/arch/mips/lantiq/xway/sysctrl.c | |||
| @@ -549,9 +549,9 @@ void __init ltq_soc_init(void) | |||
| 549 | clkdev_add_static(ltq_ar9_cpu_hz(), ltq_ar9_fpi_hz(), | 549 | clkdev_add_static(ltq_ar9_cpu_hz(), ltq_ar9_fpi_hz(), |
| 550 | ltq_ar9_fpi_hz(), CLOCK_250M); | 550 | ltq_ar9_fpi_hz(), CLOCK_250M); |
| 551 | clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P); | 551 | clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P); |
| 552 | clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0); | 552 | clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0 | PMU_AHBM); |
| 553 | clkdev_add_pmu("1f203034.usb2-phy", "phy", 1, 0, PMU_USB1_P); | 553 | clkdev_add_pmu("1f203034.usb2-phy", "phy", 1, 0, PMU_USB1_P); |
| 554 | clkdev_add_pmu("1e106000.usb", "otg", 1, 0, PMU_USB1); | 554 | clkdev_add_pmu("1e106000.usb", "otg", 1, 0, PMU_USB1 | PMU_AHBM); |
| 555 | clkdev_add_pmu("1e180000.etop", "switch", 1, 0, PMU_SWITCH); | 555 | clkdev_add_pmu("1e180000.etop", "switch", 1, 0, PMU_SWITCH); |
| 556 | clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO); | 556 | clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO); |
| 557 | clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU); | 557 | clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU); |
| @@ -560,7 +560,7 @@ void __init ltq_soc_init(void) | |||
| 560 | } else { | 560 | } else { |
| 561 | clkdev_add_static(ltq_danube_cpu_hz(), ltq_danube_fpi_hz(), | 561 | clkdev_add_static(ltq_danube_cpu_hz(), ltq_danube_fpi_hz(), |
| 562 | ltq_danube_fpi_hz(), ltq_danube_pp32_hz()); | 562 | ltq_danube_fpi_hz(), ltq_danube_pp32_hz()); |
| 563 | clkdev_add_pmu("1f203018.usb2-phy", "ctrl", 1, 0, PMU_USB0); | 563 | clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0 | PMU_AHBM); |
| 564 | clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P); | 564 | clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P); |
| 565 | clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO); | 565 | clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO); |
| 566 | clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU); | 566 | clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU); |
diff --git a/arch/mips/ralink/mt7621.c b/arch/mips/ralink/mt7621.c index 1b274742077d..d2718de60b9b 100644 --- a/arch/mips/ralink/mt7621.c +++ b/arch/mips/ralink/mt7621.c | |||
| @@ -170,6 +170,28 @@ void prom_soc_init(struct ralink_soc_info *soc_info) | |||
| 170 | u32 n1; | 170 | u32 n1; |
| 171 | u32 rev; | 171 | u32 rev; |
| 172 | 172 | ||
| 173 | /* Early detection of CMP support */ | ||
| 174 | mips_cm_probe(); | ||
| 175 | mips_cpc_probe(); | ||
| 176 | |||
| 177 | if (mips_cps_numiocu(0)) { | ||
| 178 | /* | ||
| 179 | * mips_cm_probe() wipes out bootloader | ||
| 180 | * config for CM regions and we have to configure them | ||
| 181 | * again. This SoC cannot talk to pamlbus devices | ||
| 182 | * witout proper iocu region set up. | ||
| 183 | * | ||
| 184 | * FIXME: it would be better to do this with values | ||
| 185 | * from DT, but we need this very early because | ||
| 186 | * without this we cannot talk to pretty much anything | ||
| 187 | * including serial. | ||
| 188 | */ | ||
| 189 | write_gcr_reg0_base(MT7621_PALMBUS_BASE); | ||
| 190 | write_gcr_reg0_mask(~MT7621_PALMBUS_SIZE | | ||
| 191 | CM_GCR_REGn_MASK_CMTGT_IOCU0); | ||
| 192 | __sync(); | ||
| 193 | } | ||
| 194 | |||
| 173 | n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0); | 195 | n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0); |
| 174 | n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1); | 196 | n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1); |
| 175 | 197 | ||
| @@ -194,26 +216,6 @@ void prom_soc_init(struct ralink_soc_info *soc_info) | |||
| 194 | 216 | ||
| 195 | rt2880_pinmux_data = mt7621_pinmux_data; | 217 | rt2880_pinmux_data = mt7621_pinmux_data; |
| 196 | 218 | ||
| 197 | /* Early detection of CMP support */ | ||
| 198 | mips_cm_probe(); | ||
| 199 | mips_cpc_probe(); | ||
| 200 | |||
| 201 | if (mips_cps_numiocu(0)) { | ||
| 202 | /* | ||
| 203 | * mips_cm_probe() wipes out bootloader | ||
| 204 | * config for CM regions and we have to configure them | ||
| 205 | * again. This SoC cannot talk to pamlbus devices | ||
| 206 | * witout proper iocu region set up. | ||
| 207 | * | ||
| 208 | * FIXME: it would be better to do this with values | ||
| 209 | * from DT, but we need this very early because | ||
| 210 | * without this we cannot talk to pretty much anything | ||
| 211 | * including serial. | ||
| 212 | */ | ||
| 213 | write_gcr_reg0_base(MT7621_PALMBUS_BASE); | ||
| 214 | write_gcr_reg0_mask(~MT7621_PALMBUS_SIZE | | ||
| 215 | CM_GCR_REGn_MASK_CMTGT_IOCU0); | ||
| 216 | } | ||
| 217 | 219 | ||
| 218 | if (!register_cps_smp_ops()) | 220 | if (!register_cps_smp_ops()) |
| 219 | return; | 221 | return; |
diff --git a/arch/mips/ralink/reset.c b/arch/mips/ralink/reset.c index 64543d66e76b..e9531fea23a2 100644 --- a/arch/mips/ralink/reset.c +++ b/arch/mips/ralink/reset.c | |||
| @@ -96,16 +96,9 @@ static void ralink_restart(char *command) | |||
| 96 | unreachable(); | 96 | unreachable(); |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | static void ralink_halt(void) | ||
| 100 | { | ||
| 101 | local_irq_disable(); | ||
| 102 | unreachable(); | ||
| 103 | } | ||
| 104 | |||
| 105 | static int __init mips_reboot_setup(void) | 99 | static int __init mips_reboot_setup(void) |
| 106 | { | 100 | { |
| 107 | _machine_restart = ralink_restart; | 101 | _machine_restart = ralink_restart; |
| 108 | _machine_halt = ralink_halt; | ||
| 109 | 102 | ||
| 110 | return 0; | 103 | return 0; |
| 111 | } | 104 | } |
diff --git a/arch/powerpc/include/asm/book3s/64/mmu.h b/arch/powerpc/include/asm/book3s/64/mmu.h index 0abeb0e2d616..37671feb2bf6 100644 --- a/arch/powerpc/include/asm/book3s/64/mmu.h +++ b/arch/powerpc/include/asm/book3s/64/mmu.h | |||
| @@ -87,6 +87,9 @@ typedef struct { | |||
| 87 | /* Number of bits in the mm_cpumask */ | 87 | /* Number of bits in the mm_cpumask */ |
| 88 | atomic_t active_cpus; | 88 | atomic_t active_cpus; |
| 89 | 89 | ||
| 90 | /* Number of users of the external (Nest) MMU */ | ||
| 91 | atomic_t copros; | ||
| 92 | |||
| 90 | /* NPU NMMU context */ | 93 | /* NPU NMMU context */ |
| 91 | struct npu_context *npu_context; | 94 | struct npu_context *npu_context; |
| 92 | 95 | ||
diff --git a/arch/powerpc/include/asm/book3s/64/tlbflush-radix.h b/arch/powerpc/include/asm/book3s/64/tlbflush-radix.h index 8eea90f80e45..19b45ba6caf9 100644 --- a/arch/powerpc/include/asm/book3s/64/tlbflush-radix.h +++ b/arch/powerpc/include/asm/book3s/64/tlbflush-radix.h | |||
| @@ -47,9 +47,6 @@ extern void radix__flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmad | |||
| 47 | #endif | 47 | #endif |
| 48 | extern void radix__flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr); | 48 | extern void radix__flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr); |
| 49 | extern void radix__flush_tlb_collapsed_pmd(struct mm_struct *mm, unsigned long addr); | 49 | extern void radix__flush_tlb_collapsed_pmd(struct mm_struct *mm, unsigned long addr); |
| 50 | extern void radix__flush_tlb_lpid_va(unsigned long lpid, unsigned long gpa, | ||
| 51 | unsigned long page_size); | ||
| 52 | extern void radix__flush_tlb_lpid(unsigned long lpid); | ||
| 53 | extern void radix__flush_tlb_all(void); | 50 | extern void radix__flush_tlb_all(void); |
| 54 | extern void radix__flush_tlb_pte_p9_dd1(unsigned long old_pte, struct mm_struct *mm, | 51 | extern void radix__flush_tlb_pte_p9_dd1(unsigned long old_pte, struct mm_struct *mm, |
| 55 | unsigned long address); | 52 | unsigned long address); |
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index a2c5c95882cf..2e2bacbdf6ed 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h | |||
| @@ -203,6 +203,7 @@ static inline void cpu_feature_keys_init(void) { } | |||
| 203 | #define CPU_FTR_DAWR LONG_ASM_CONST(0x0400000000000000) | 203 | #define CPU_FTR_DAWR LONG_ASM_CONST(0x0400000000000000) |
| 204 | #define CPU_FTR_DABRX LONG_ASM_CONST(0x0800000000000000) | 204 | #define CPU_FTR_DABRX LONG_ASM_CONST(0x0800000000000000) |
| 205 | #define CPU_FTR_PMAO_BUG LONG_ASM_CONST(0x1000000000000000) | 205 | #define CPU_FTR_PMAO_BUG LONG_ASM_CONST(0x1000000000000000) |
| 206 | #define CPU_FTR_P9_TLBIE_BUG LONG_ASM_CONST(0x2000000000000000) | ||
| 206 | #define CPU_FTR_POWER9_DD1 LONG_ASM_CONST(0x4000000000000000) | 207 | #define CPU_FTR_POWER9_DD1 LONG_ASM_CONST(0x4000000000000000) |
| 207 | #define CPU_FTR_POWER9_DD2_1 LONG_ASM_CONST(0x8000000000000000) | 208 | #define CPU_FTR_POWER9_DD2_1 LONG_ASM_CONST(0x8000000000000000) |
| 208 | 209 | ||
| @@ -465,7 +466,7 @@ static inline void cpu_feature_keys_init(void) { } | |||
| 465 | CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \ | 466 | CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \ |
| 466 | CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \ | 467 | CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | \ |
| 467 | CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP | CPU_FTR_ARCH_300 | \ | 468 | CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP | CPU_FTR_ARCH_300 | \ |
| 468 | CPU_FTR_PKEY) | 469 | CPU_FTR_PKEY | CPU_FTR_P9_TLBIE_BUG) |
| 469 | #define CPU_FTRS_POWER9_DD1 ((CPU_FTRS_POWER9 | CPU_FTR_POWER9_DD1) & \ | 470 | #define CPU_FTRS_POWER9_DD1 ((CPU_FTRS_POWER9 | CPU_FTR_POWER9_DD1) & \ |
| 470 | (~CPU_FTR_SAO)) | 471 | (~CPU_FTR_SAO)) |
| 471 | #define CPU_FTRS_POWER9_DD2_0 CPU_FTRS_POWER9 | 472 | #define CPU_FTRS_POWER9_DD2_0 CPU_FTRS_POWER9 |
diff --git a/arch/powerpc/include/asm/mmu_context.h b/arch/powerpc/include/asm/mmu_context.h index 051b3d63afe3..3a15b6db9501 100644 --- a/arch/powerpc/include/asm/mmu_context.h +++ b/arch/powerpc/include/asm/mmu_context.h | |||
| @@ -92,15 +92,23 @@ static inline void dec_mm_active_cpus(struct mm_struct *mm) | |||
| 92 | static inline void mm_context_add_copro(struct mm_struct *mm) | 92 | static inline void mm_context_add_copro(struct mm_struct *mm) |
| 93 | { | 93 | { |
| 94 | /* | 94 | /* |
| 95 | * On hash, should only be called once over the lifetime of | 95 | * If any copro is in use, increment the active CPU count |
| 96 | * the context, as we can't decrement the active cpus count | 96 | * in order to force TLB invalidations to be global as to |
| 97 | * and flush properly for the time being. | 97 | * propagate to the Nest MMU. |
| 98 | */ | 98 | */ |
| 99 | inc_mm_active_cpus(mm); | 99 | if (atomic_inc_return(&mm->context.copros) == 1) |
| 100 | inc_mm_active_cpus(mm); | ||
| 100 | } | 101 | } |
| 101 | 102 | ||
| 102 | static inline void mm_context_remove_copro(struct mm_struct *mm) | 103 | static inline void mm_context_remove_copro(struct mm_struct *mm) |
| 103 | { | 104 | { |
| 105 | int c; | ||
| 106 | |||
| 107 | c = atomic_dec_if_positive(&mm->context.copros); | ||
| 108 | |||
| 109 | /* Detect imbalance between add and remove */ | ||
| 110 | WARN_ON(c < 0); | ||
| 111 | |||
| 104 | /* | 112 | /* |
| 105 | * Need to broadcast a global flush of the full mm before | 113 | * Need to broadcast a global flush of the full mm before |
| 106 | * decrementing active_cpus count, as the next TLBI may be | 114 | * decrementing active_cpus count, as the next TLBI may be |
| @@ -111,7 +119,7 @@ static inline void mm_context_remove_copro(struct mm_struct *mm) | |||
| 111 | * for the time being. Invalidations will remain global if | 119 | * for the time being. Invalidations will remain global if |
| 112 | * used on hash. | 120 | * used on hash. |
| 113 | */ | 121 | */ |
| 114 | if (radix_enabled()) { | 122 | if (c == 0 && radix_enabled()) { |
| 115 | flush_all_mm(mm); | 123 | flush_all_mm(mm); |
| 116 | dec_mm_active_cpus(mm); | 124 | dec_mm_active_cpus(mm); |
| 117 | } | 125 | } |
diff --git a/arch/powerpc/kernel/dt_cpu_ftrs.c b/arch/powerpc/kernel/dt_cpu_ftrs.c index 945e2c29ad2d..8ca5d5b74618 100644 --- a/arch/powerpc/kernel/dt_cpu_ftrs.c +++ b/arch/powerpc/kernel/dt_cpu_ftrs.c | |||
| @@ -709,6 +709,9 @@ static __init void cpufeatures_cpu_quirks(void) | |||
| 709 | cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD1; | 709 | cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD1; |
| 710 | else if ((version & 0xffffefff) == 0x004e0201) | 710 | else if ((version & 0xffffefff) == 0x004e0201) |
| 711 | cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD2_1; | 711 | cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD2_1; |
| 712 | |||
| 713 | if ((version & 0xffff0000) == 0x004e0000) | ||
| 714 | cur_cpu_spec->cpu_features |= CPU_FTR_P9_TLBIE_BUG; | ||
| 712 | } | 715 | } |
| 713 | 716 | ||
| 714 | static void __init cpufeatures_setup_finished(void) | 717 | static void __init cpufeatures_setup_finished(void) |
| @@ -720,6 +723,9 @@ static void __init cpufeatures_setup_finished(void) | |||
| 720 | cur_cpu_spec->cpu_features |= CPU_FTR_HVMODE; | 723 | cur_cpu_spec->cpu_features |= CPU_FTR_HVMODE; |
| 721 | } | 724 | } |
| 722 | 725 | ||
| 726 | /* Make sure powerpc_base_platform is non-NULL */ | ||
| 727 | powerpc_base_platform = cur_cpu_spec->platform; | ||
| 728 | |||
| 723 | system_registers.lpcr = mfspr(SPRN_LPCR); | 729 | system_registers.lpcr = mfspr(SPRN_LPCR); |
| 724 | system_registers.hfscr = mfspr(SPRN_HFSCR); | 730 | system_registers.hfscr = mfspr(SPRN_HFSCR); |
| 725 | system_registers.fscr = mfspr(SPRN_FSCR); | 731 | system_registers.fscr = mfspr(SPRN_FSCR); |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 3ac87e53b3da..1ecfd8ffb098 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
| @@ -706,7 +706,7 @@ EXC_COMMON_BEGIN(bad_addr_slb) | |||
| 706 | ld r3, PACA_EXSLB+EX_DAR(r13) | 706 | ld r3, PACA_EXSLB+EX_DAR(r13) |
| 707 | std r3, _DAR(r1) | 707 | std r3, _DAR(r1) |
| 708 | beq cr6, 2f | 708 | beq cr6, 2f |
| 709 | li r10, 0x480 /* fix trap number for I-SLB miss */ | 709 | li r10, 0x481 /* fix trap number for I-SLB miss */ |
| 710 | std r10, _TRAP(r1) | 710 | std r10, _TRAP(r1) |
| 711 | 2: bl save_nvgprs | 711 | 2: bl save_nvgprs |
| 712 | addi r3, r1, STACK_FRAME_OVERHEAD | 712 | addi r3, r1, STACK_FRAME_OVERHEAD |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index f88038847790..061aa0f47bb1 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
| @@ -476,6 +476,14 @@ void force_external_irq_replay(void) | |||
| 476 | */ | 476 | */ |
| 477 | WARN_ON(!arch_irqs_disabled()); | 477 | WARN_ON(!arch_irqs_disabled()); |
| 478 | 478 | ||
| 479 | /* | ||
| 480 | * Interrupts must always be hard disabled before irq_happened is | ||
| 481 | * modified (to prevent lost update in case of interrupt between | ||
| 482 | * load and store). | ||
| 483 | */ | ||
| 484 | __hard_irq_disable(); | ||
| 485 | local_paca->irq_happened |= PACA_IRQ_HARD_DIS; | ||
| 486 | |||
| 479 | /* Indicate in the PACA that we have an interrupt to replay */ | 487 | /* Indicate in the PACA that we have an interrupt to replay */ |
| 480 | local_paca->irq_happened |= PACA_IRQ_EE; | 488 | local_paca->irq_happened |= PACA_IRQ_EE; |
| 481 | } | 489 | } |
diff --git a/arch/powerpc/kvm/book3s_64_mmu_radix.c b/arch/powerpc/kvm/book3s_64_mmu_radix.c index 5cb4e4687107..5d9bafe9a371 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_radix.c +++ b/arch/powerpc/kvm/book3s_64_mmu_radix.c | |||
| @@ -157,6 +157,9 @@ static void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr, | |||
| 157 | asm volatile("ptesync": : :"memory"); | 157 | asm volatile("ptesync": : :"memory"); |
| 158 | asm volatile(PPC_TLBIE_5(%0, %1, 0, 0, 1) | 158 | asm volatile(PPC_TLBIE_5(%0, %1, 0, 0, 1) |
| 159 | : : "r" (addr), "r" (kvm->arch.lpid) : "memory"); | 159 | : : "r" (addr), "r" (kvm->arch.lpid) : "memory"); |
| 160 | if (cpu_has_feature(CPU_FTR_P9_TLBIE_BUG)) | ||
| 161 | asm volatile(PPC_TLBIE_5(%0, %1, 0, 0, 1) | ||
| 162 | : : "r" (addr), "r" (kvm->arch.lpid) : "memory"); | ||
| 160 | asm volatile("ptesync": : :"memory"); | 163 | asm volatile("ptesync": : :"memory"); |
| 161 | } | 164 | } |
| 162 | 165 | ||
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c index 8888e625a999..e1c083fbe434 100644 --- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c +++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c | |||
| @@ -473,6 +473,17 @@ static void do_tlbies(struct kvm *kvm, unsigned long *rbvalues, | |||
| 473 | trace_tlbie(kvm->arch.lpid, 0, rbvalues[i], | 473 | trace_tlbie(kvm->arch.lpid, 0, rbvalues[i], |
| 474 | kvm->arch.lpid, 0, 0, 0); | 474 | kvm->arch.lpid, 0, 0, 0); |
| 475 | } | 475 | } |
| 476 | |||
| 477 | if (cpu_has_feature(CPU_FTR_P9_TLBIE_BUG)) { | ||
| 478 | /* | ||
| 479 | * Need the extra ptesync to make sure we don't | ||
| 480 | * re-order the tlbie | ||
| 481 | */ | ||
| 482 | asm volatile("ptesync": : :"memory"); | ||
| 483 | asm volatile(PPC_TLBIE_5(%0,%1,0,0,0) : : | ||
| 484 | "r" (rbvalues[0]), "r" (kvm->arch.lpid)); | ||
| 485 | } | ||
| 486 | |||
| 476 | asm volatile("eieio; tlbsync; ptesync" : : : "memory"); | 487 | asm volatile("eieio; tlbsync; ptesync" : : : "memory"); |
| 477 | kvm->arch.tlbie_lock = 0; | 488 | kvm->arch.tlbie_lock = 0; |
| 478 | } else { | 489 | } else { |
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index d33264697a31..f86a20270e50 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
| @@ -1557,6 +1557,24 @@ mc_cont: | |||
| 1557 | ptesync | 1557 | ptesync |
| 1558 | 3: stw r5,VCPU_SLB_MAX(r9) | 1558 | 3: stw r5,VCPU_SLB_MAX(r9) |
| 1559 | 1559 | ||
| 1560 | /* load host SLB entries */ | ||
| 1561 | BEGIN_MMU_FTR_SECTION | ||
| 1562 | b 0f | ||
| 1563 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX) | ||
| 1564 | ld r8,PACA_SLBSHADOWPTR(r13) | ||
| 1565 | |||
| 1566 | .rept SLB_NUM_BOLTED | ||
| 1567 | li r3, SLBSHADOW_SAVEAREA | ||
| 1568 | LDX_BE r5, r8, r3 | ||
| 1569 | addi r3, r3, 8 | ||
| 1570 | LDX_BE r6, r8, r3 | ||
| 1571 | andis. r7,r5,SLB_ESID_V@h | ||
| 1572 | beq 1f | ||
| 1573 | slbmte r6,r5 | ||
| 1574 | 1: addi r8,r8,16 | ||
| 1575 | .endr | ||
| 1576 | 0: | ||
| 1577 | |||
| 1560 | guest_bypass: | 1578 | guest_bypass: |
| 1561 | stw r12, STACK_SLOT_TRAP(r1) | 1579 | stw r12, STACK_SLOT_TRAP(r1) |
| 1562 | mr r3, r12 | 1580 | mr r3, r12 |
| @@ -2018,23 +2036,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) | |||
| 2018 | mtspr SPRN_LPCR,r8 | 2036 | mtspr SPRN_LPCR,r8 |
| 2019 | isync | 2037 | isync |
| 2020 | 48: | 2038 | 48: |
| 2021 | /* load host SLB entries */ | ||
| 2022 | BEGIN_MMU_FTR_SECTION | ||
| 2023 | b 0f | ||
| 2024 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX) | ||
| 2025 | ld r8,PACA_SLBSHADOWPTR(r13) | ||
| 2026 | |||
| 2027 | .rept SLB_NUM_BOLTED | ||
| 2028 | li r3, SLBSHADOW_SAVEAREA | ||
| 2029 | LDX_BE r5, r8, r3 | ||
| 2030 | addi r3, r3, 8 | ||
| 2031 | LDX_BE r6, r8, r3 | ||
| 2032 | andis. r7,r5,SLB_ESID_V@h | ||
| 2033 | beq 1f | ||
| 2034 | slbmte r6,r5 | ||
| 2035 | 1: addi r8,r8,16 | ||
| 2036 | .endr | ||
| 2037 | 0: | ||
| 2038 | #ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING | 2039 | #ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING |
| 2039 | /* Finish timing, if we have a vcpu */ | 2040 | /* Finish timing, if we have a vcpu */ |
| 2040 | ld r4, HSTATE_KVM_VCPU(r13) | 2041 | ld r4, HSTATE_KVM_VCPU(r13) |
diff --git a/arch/powerpc/mm/hash_native_64.c b/arch/powerpc/mm/hash_native_64.c index a0675e91ad7d..656933c85925 100644 --- a/arch/powerpc/mm/hash_native_64.c +++ b/arch/powerpc/mm/hash_native_64.c | |||
| @@ -201,6 +201,15 @@ static inline unsigned long ___tlbie(unsigned long vpn, int psize, | |||
| 201 | return va; | 201 | return va; |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | static inline void fixup_tlbie(unsigned long vpn, int psize, int apsize, int ssize) | ||
| 205 | { | ||
| 206 | if (cpu_has_feature(CPU_FTR_P9_TLBIE_BUG)) { | ||
| 207 | /* Need the extra ptesync to ensure we don't reorder tlbie*/ | ||
| 208 | asm volatile("ptesync": : :"memory"); | ||
| 209 | ___tlbie(vpn, psize, apsize, ssize); | ||
| 210 | } | ||
| 211 | } | ||
| 212 | |||
| 204 | static inline void __tlbie(unsigned long vpn, int psize, int apsize, int ssize) | 213 | static inline void __tlbie(unsigned long vpn, int psize, int apsize, int ssize) |
| 205 | { | 214 | { |
| 206 | unsigned long rb; | 215 | unsigned long rb; |
| @@ -278,6 +287,7 @@ static inline void tlbie(unsigned long vpn, int psize, int apsize, | |||
| 278 | asm volatile("ptesync": : :"memory"); | 287 | asm volatile("ptesync": : :"memory"); |
| 279 | } else { | 288 | } else { |
| 280 | __tlbie(vpn, psize, apsize, ssize); | 289 | __tlbie(vpn, psize, apsize, ssize); |
| 290 | fixup_tlbie(vpn, psize, apsize, ssize); | ||
| 281 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); | 291 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); |
| 282 | } | 292 | } |
| 283 | if (lock_tlbie && !use_local) | 293 | if (lock_tlbie && !use_local) |
| @@ -771,7 +781,7 @@ static void native_hpte_clear(void) | |||
| 771 | */ | 781 | */ |
| 772 | static void native_flush_hash_range(unsigned long number, int local) | 782 | static void native_flush_hash_range(unsigned long number, int local) |
| 773 | { | 783 | { |
| 774 | unsigned long vpn; | 784 | unsigned long vpn = 0; |
| 775 | unsigned long hash, index, hidx, shift, slot; | 785 | unsigned long hash, index, hidx, shift, slot; |
| 776 | struct hash_pte *hptep; | 786 | struct hash_pte *hptep; |
| 777 | unsigned long hpte_v; | 787 | unsigned long hpte_v; |
| @@ -843,6 +853,10 @@ static void native_flush_hash_range(unsigned long number, int local) | |||
| 843 | __tlbie(vpn, psize, psize, ssize); | 853 | __tlbie(vpn, psize, psize, ssize); |
| 844 | } pte_iterate_hashed_end(); | 854 | } pte_iterate_hashed_end(); |
| 845 | } | 855 | } |
| 856 | /* | ||
| 857 | * Just do one more with the last used values. | ||
| 858 | */ | ||
| 859 | fixup_tlbie(vpn, psize, psize, ssize); | ||
| 846 | asm volatile("eieio; tlbsync; ptesync":::"memory"); | 860 | asm volatile("eieio; tlbsync; ptesync":::"memory"); |
| 847 | 861 | ||
| 848 | if (lock_tlbie) | 862 | if (lock_tlbie) |
diff --git a/arch/powerpc/mm/mmu_context_book3s64.c b/arch/powerpc/mm/mmu_context_book3s64.c index 929d9ef7083f..3f980baade4c 100644 --- a/arch/powerpc/mm/mmu_context_book3s64.c +++ b/arch/powerpc/mm/mmu_context_book3s64.c | |||
| @@ -173,6 +173,7 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm) | |||
| 173 | mm_iommu_init(mm); | 173 | mm_iommu_init(mm); |
| 174 | #endif | 174 | #endif |
| 175 | atomic_set(&mm->context.active_cpus, 0); | 175 | atomic_set(&mm->context.active_cpus, 0); |
| 176 | atomic_set(&mm->context.copros, 0); | ||
| 176 | 177 | ||
| 177 | return 0; | 178 | return 0; |
| 178 | } | 179 | } |
diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c index 28c980eb4422..adf469f312f2 100644 --- a/arch/powerpc/mm/pgtable_64.c +++ b/arch/powerpc/mm/pgtable_64.c | |||
| @@ -481,6 +481,7 @@ void mmu_partition_table_set_entry(unsigned int lpid, unsigned long dw0, | |||
| 481 | "r" (TLBIEL_INVAL_SET_LPID), "r" (lpid)); | 481 | "r" (TLBIEL_INVAL_SET_LPID), "r" (lpid)); |
| 482 | trace_tlbie(lpid, 0, TLBIEL_INVAL_SET_LPID, lpid, 2, 0, 0); | 482 | trace_tlbie(lpid, 0, TLBIEL_INVAL_SET_LPID, lpid, 2, 0, 0); |
| 483 | } | 483 | } |
| 484 | /* do we need fixup here ?*/ | ||
| 484 | asm volatile("eieio; tlbsync; ptesync" : : : "memory"); | 485 | asm volatile("eieio; tlbsync; ptesync" : : : "memory"); |
| 485 | } | 486 | } |
| 486 | EXPORT_SYMBOL_GPL(mmu_partition_table_set_entry); | 487 | EXPORT_SYMBOL_GPL(mmu_partition_table_set_entry); |
diff --git a/arch/powerpc/mm/tlb-radix.c b/arch/powerpc/mm/tlb-radix.c index 71d1b19ad1c0..a07f5372a4bf 100644 --- a/arch/powerpc/mm/tlb-radix.c +++ b/arch/powerpc/mm/tlb-radix.c | |||
| @@ -119,6 +119,49 @@ static inline void __tlbie_pid(unsigned long pid, unsigned long ric) | |||
| 119 | trace_tlbie(0, 0, rb, rs, ric, prs, r); | 119 | trace_tlbie(0, 0, rb, rs, ric, prs, r); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | static inline void __tlbiel_va(unsigned long va, unsigned long pid, | ||
| 123 | unsigned long ap, unsigned long ric) | ||
| 124 | { | ||
| 125 | unsigned long rb,rs,prs,r; | ||
| 126 | |||
| 127 | rb = va & ~(PPC_BITMASK(52, 63)); | ||
| 128 | rb |= ap << PPC_BITLSHIFT(58); | ||
| 129 | rs = pid << PPC_BITLSHIFT(31); | ||
| 130 | prs = 1; /* process scoped */ | ||
| 131 | r = 1; /* raidx format */ | ||
| 132 | |||
| 133 | asm volatile(PPC_TLBIEL(%0, %4, %3, %2, %1) | ||
| 134 | : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); | ||
| 135 | trace_tlbie(0, 1, rb, rs, ric, prs, r); | ||
| 136 | } | ||
| 137 | |||
| 138 | static inline void __tlbie_va(unsigned long va, unsigned long pid, | ||
| 139 | unsigned long ap, unsigned long ric) | ||
| 140 | { | ||
| 141 | unsigned long rb,rs,prs,r; | ||
| 142 | |||
| 143 | rb = va & ~(PPC_BITMASK(52, 63)); | ||
| 144 | rb |= ap << PPC_BITLSHIFT(58); | ||
| 145 | rs = pid << PPC_BITLSHIFT(31); | ||
| 146 | prs = 1; /* process scoped */ | ||
| 147 | r = 1; /* raidx format */ | ||
| 148 | |||
| 149 | asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1) | ||
| 150 | : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); | ||
| 151 | trace_tlbie(0, 0, rb, rs, ric, prs, r); | ||
| 152 | } | ||
| 153 | |||
| 154 | static inline void fixup_tlbie(void) | ||
| 155 | { | ||
| 156 | unsigned long pid = 0; | ||
| 157 | unsigned long va = ((1UL << 52) - 1); | ||
| 158 | |||
| 159 | if (cpu_has_feature(CPU_FTR_P9_TLBIE_BUG)) { | ||
| 160 | asm volatile("ptesync": : :"memory"); | ||
| 161 | __tlbie_va(va, pid, mmu_get_ap(MMU_PAGE_64K), RIC_FLUSH_TLB); | ||
| 162 | } | ||
| 163 | } | ||
| 164 | |||
| 122 | /* | 165 | /* |
| 123 | * We use 128 set in radix mode and 256 set in hpt mode. | 166 | * We use 128 set in radix mode and 256 set in hpt mode. |
| 124 | */ | 167 | */ |
| @@ -151,24 +194,25 @@ static inline void _tlbiel_pid(unsigned long pid, unsigned long ric) | |||
| 151 | static inline void _tlbie_pid(unsigned long pid, unsigned long ric) | 194 | static inline void _tlbie_pid(unsigned long pid, unsigned long ric) |
| 152 | { | 195 | { |
| 153 | asm volatile("ptesync": : :"memory"); | 196 | asm volatile("ptesync": : :"memory"); |
| 154 | __tlbie_pid(pid, ric); | ||
| 155 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); | ||
| 156 | } | ||
| 157 | 197 | ||
| 158 | static inline void __tlbiel_va(unsigned long va, unsigned long pid, | 198 | /* |
| 159 | unsigned long ap, unsigned long ric) | 199 | * Workaround the fact that the "ric" argument to __tlbie_pid |
| 160 | { | 200 | * must be a compile-time contraint to match the "i" constraint |
| 161 | unsigned long rb,rs,prs,r; | 201 | * in the asm statement. |
| 162 | 202 | */ | |
| 163 | rb = va & ~(PPC_BITMASK(52, 63)); | 203 | switch (ric) { |
| 164 | rb |= ap << PPC_BITLSHIFT(58); | 204 | case RIC_FLUSH_TLB: |
| 165 | rs = pid << PPC_BITLSHIFT(31); | 205 | __tlbie_pid(pid, RIC_FLUSH_TLB); |
| 166 | prs = 1; /* process scoped */ | 206 | break; |
| 167 | r = 1; /* raidx format */ | 207 | case RIC_FLUSH_PWC: |
| 168 | 208 | __tlbie_pid(pid, RIC_FLUSH_PWC); | |
| 169 | asm volatile(PPC_TLBIEL(%0, %4, %3, %2, %1) | 209 | break; |
| 170 | : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); | 210 | case RIC_FLUSH_ALL: |
| 171 | trace_tlbie(0, 1, rb, rs, ric, prs, r); | 211 | default: |
| 212 | __tlbie_pid(pid, RIC_FLUSH_ALL); | ||
| 213 | } | ||
| 214 | fixup_tlbie(); | ||
| 215 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); | ||
| 172 | } | 216 | } |
| 173 | 217 | ||
| 174 | static inline void __tlbiel_va_range(unsigned long start, unsigned long end, | 218 | static inline void __tlbiel_va_range(unsigned long start, unsigned long end, |
| @@ -203,22 +247,6 @@ static inline void _tlbiel_va_range(unsigned long start, unsigned long end, | |||
| 203 | asm volatile("ptesync": : :"memory"); | 247 | asm volatile("ptesync": : :"memory"); |
| 204 | } | 248 | } |
| 205 | 249 | ||
| 206 | static inline void __tlbie_va(unsigned long va, unsigned long pid, | ||
| 207 | unsigned long ap, unsigned long ric) | ||
| 208 | { | ||
| 209 | unsigned long rb,rs,prs,r; | ||
| 210 | |||
| 211 | rb = va & ~(PPC_BITMASK(52, 63)); | ||
| 212 | rb |= ap << PPC_BITLSHIFT(58); | ||
| 213 | rs = pid << PPC_BITLSHIFT(31); | ||
| 214 | prs = 1; /* process scoped */ | ||
| 215 | r = 1; /* raidx format */ | ||
| 216 | |||
| 217 | asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1) | ||
| 218 | : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); | ||
| 219 | trace_tlbie(0, 0, rb, rs, ric, prs, r); | ||
| 220 | } | ||
| 221 | |||
| 222 | static inline void __tlbie_va_range(unsigned long start, unsigned long end, | 250 | static inline void __tlbie_va_range(unsigned long start, unsigned long end, |
| 223 | unsigned long pid, unsigned long page_size, | 251 | unsigned long pid, unsigned long page_size, |
| 224 | unsigned long psize) | 252 | unsigned long psize) |
| @@ -237,6 +265,7 @@ static inline void _tlbie_va(unsigned long va, unsigned long pid, | |||
| 237 | 265 | ||
| 238 | asm volatile("ptesync": : :"memory"); | 266 | asm volatile("ptesync": : :"memory"); |
| 239 | __tlbie_va(va, pid, ap, ric); | 267 | __tlbie_va(va, pid, ap, ric); |
| 268 | fixup_tlbie(); | ||
| 240 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); | 269 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); |
| 241 | } | 270 | } |
| 242 | 271 | ||
| @@ -248,6 +277,7 @@ static inline void _tlbie_va_range(unsigned long start, unsigned long end, | |||
| 248 | if (also_pwc) | 277 | if (also_pwc) |
| 249 | __tlbie_pid(pid, RIC_FLUSH_PWC); | 278 | __tlbie_pid(pid, RIC_FLUSH_PWC); |
| 250 | __tlbie_va_range(start, end, pid, page_size, psize); | 279 | __tlbie_va_range(start, end, pid, page_size, psize); |
| 280 | fixup_tlbie(); | ||
| 251 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); | 281 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); |
| 252 | } | 282 | } |
| 253 | 283 | ||
| @@ -311,6 +341,16 @@ void radix__local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmadd | |||
| 311 | } | 341 | } |
| 312 | EXPORT_SYMBOL(radix__local_flush_tlb_page); | 342 | EXPORT_SYMBOL(radix__local_flush_tlb_page); |
| 313 | 343 | ||
| 344 | static bool mm_needs_flush_escalation(struct mm_struct *mm) | ||
| 345 | { | ||
| 346 | /* | ||
| 347 | * P9 nest MMU has issues with the page walk cache | ||
| 348 | * caching PTEs and not flushing them properly when | ||
| 349 | * RIC = 0 for a PID/LPID invalidate | ||
| 350 | */ | ||
| 351 | return atomic_read(&mm->context.copros) != 0; | ||
| 352 | } | ||
| 353 | |||
| 314 | #ifdef CONFIG_SMP | 354 | #ifdef CONFIG_SMP |
| 315 | void radix__flush_tlb_mm(struct mm_struct *mm) | 355 | void radix__flush_tlb_mm(struct mm_struct *mm) |
| 316 | { | 356 | { |
| @@ -321,9 +361,12 @@ void radix__flush_tlb_mm(struct mm_struct *mm) | |||
| 321 | return; | 361 | return; |
| 322 | 362 | ||
| 323 | preempt_disable(); | 363 | preempt_disable(); |
| 324 | if (!mm_is_thread_local(mm)) | 364 | if (!mm_is_thread_local(mm)) { |
| 325 | _tlbie_pid(pid, RIC_FLUSH_TLB); | 365 | if (mm_needs_flush_escalation(mm)) |
| 326 | else | 366 | _tlbie_pid(pid, RIC_FLUSH_ALL); |
| 367 | else | ||
| 368 | _tlbie_pid(pid, RIC_FLUSH_TLB); | ||
| 369 | } else | ||
| 327 | _tlbiel_pid(pid, RIC_FLUSH_TLB); | 370 | _tlbiel_pid(pid, RIC_FLUSH_TLB); |
| 328 | preempt_enable(); | 371 | preempt_enable(); |
| 329 | } | 372 | } |
| @@ -435,10 +478,14 @@ void radix__flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | |||
| 435 | } | 478 | } |
| 436 | 479 | ||
| 437 | if (full) { | 480 | if (full) { |
| 438 | if (local) | 481 | if (local) { |
| 439 | _tlbiel_pid(pid, RIC_FLUSH_TLB); | 482 | _tlbiel_pid(pid, RIC_FLUSH_TLB); |
| 440 | else | 483 | } else { |
| 441 | _tlbie_pid(pid, RIC_FLUSH_TLB); | 484 | if (mm_needs_flush_escalation(mm)) |
| 485 | _tlbie_pid(pid, RIC_FLUSH_ALL); | ||
| 486 | else | ||
| 487 | _tlbie_pid(pid, RIC_FLUSH_TLB); | ||
| 488 | } | ||
| 442 | } else { | 489 | } else { |
| 443 | bool hflush = false; | 490 | bool hflush = false; |
| 444 | unsigned long hstart, hend; | 491 | unsigned long hstart, hend; |
| @@ -465,6 +512,7 @@ void radix__flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | |||
| 465 | if (hflush) | 512 | if (hflush) |
| 466 | __tlbie_va_range(hstart, hend, pid, | 513 | __tlbie_va_range(hstart, hend, pid, |
| 467 | HPAGE_PMD_SIZE, MMU_PAGE_2M); | 514 | HPAGE_PMD_SIZE, MMU_PAGE_2M); |
| 515 | fixup_tlbie(); | ||
| 468 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); | 516 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); |
| 469 | } | 517 | } |
| 470 | } | 518 | } |
| @@ -548,6 +596,9 @@ static inline void __radix__flush_tlb_range_psize(struct mm_struct *mm, | |||
| 548 | } | 596 | } |
| 549 | 597 | ||
| 550 | if (full) { | 598 | if (full) { |
| 599 | if (!local && mm_needs_flush_escalation(mm)) | ||
| 600 | also_pwc = true; | ||
| 601 | |||
| 551 | if (local) | 602 | if (local) |
| 552 | _tlbiel_pid(pid, also_pwc ? RIC_FLUSH_ALL : RIC_FLUSH_TLB); | 603 | _tlbiel_pid(pid, also_pwc ? RIC_FLUSH_ALL : RIC_FLUSH_TLB); |
| 553 | else | 604 | else |
| @@ -603,46 +654,6 @@ void radix__flush_tlb_collapsed_pmd(struct mm_struct *mm, unsigned long addr) | |||
| 603 | } | 654 | } |
| 604 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | 655 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
| 605 | 656 | ||
| 606 | void radix__flush_tlb_lpid_va(unsigned long lpid, unsigned long gpa, | ||
| 607 | unsigned long page_size) | ||
| 608 | { | ||
| 609 | unsigned long rb,rs,prs,r; | ||
| 610 | unsigned long ap; | ||
| 611 | unsigned long ric = RIC_FLUSH_TLB; | ||
| 612 | |||
| 613 | ap = mmu_get_ap(radix_get_mmu_psize(page_size)); | ||
| 614 | rb = gpa & ~(PPC_BITMASK(52, 63)); | ||
| 615 | rb |= ap << PPC_BITLSHIFT(58); | ||
| 616 | rs = lpid & ((1UL << 32) - 1); | ||
| 617 | prs = 0; /* process scoped */ | ||
| 618 | r = 1; /* raidx format */ | ||
| 619 | |||
| 620 | asm volatile("ptesync": : :"memory"); | ||
| 621 | asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1) | ||
| 622 | : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); | ||
| 623 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); | ||
| 624 | trace_tlbie(lpid, 0, rb, rs, ric, prs, r); | ||
| 625 | } | ||
| 626 | EXPORT_SYMBOL(radix__flush_tlb_lpid_va); | ||
| 627 | |||
| 628 | void radix__flush_tlb_lpid(unsigned long lpid) | ||
| 629 | { | ||
| 630 | unsigned long rb,rs,prs,r; | ||
| 631 | unsigned long ric = RIC_FLUSH_ALL; | ||
| 632 | |||
| 633 | rb = 0x2 << PPC_BITLSHIFT(53); /* IS = 2 */ | ||
| 634 | rs = lpid & ((1UL << 32) - 1); | ||
| 635 | prs = 0; /* partition scoped */ | ||
| 636 | r = 1; /* raidx format */ | ||
| 637 | |||
| 638 | asm volatile("ptesync": : :"memory"); | ||
| 639 | asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1) | ||
| 640 | : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); | ||
| 641 | asm volatile("eieio; tlbsync; ptesync": : :"memory"); | ||
| 642 | trace_tlbie(lpid, 0, rb, rs, ric, prs, r); | ||
| 643 | } | ||
| 644 | EXPORT_SYMBOL(radix__flush_tlb_lpid); | ||
| 645 | |||
| 646 | void radix__flush_pmd_tlb_range(struct vm_area_struct *vma, | 657 | void radix__flush_pmd_tlb_range(struct vm_area_struct *vma, |
| 647 | unsigned long start, unsigned long end) | 658 | unsigned long start, unsigned long end) |
| 648 | { | 659 | { |
diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index 8b8d2297d486..638411f22267 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu | |||
| @@ -315,19 +315,6 @@ config X86_L1_CACHE_SHIFT | |||
| 315 | default "4" if MELAN || M486 || MGEODEGX1 | 315 | default "4" if MELAN || M486 || MGEODEGX1 |
| 316 | default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX | 316 | default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX |
| 317 | 317 | ||
| 318 | config X86_PPRO_FENCE | ||
| 319 | bool "PentiumPro memory ordering errata workaround" | ||
| 320 | depends on M686 || M586MMX || M586TSC || M586 || M486 || MGEODEGX1 | ||
| 321 | ---help--- | ||
| 322 | Old PentiumPro multiprocessor systems had errata that could cause | ||
| 323 | memory operations to violate the x86 ordering standard in rare cases. | ||
| 324 | Enabling this option will attempt to work around some (but not all) | ||
| 325 | occurrences of this problem, at the cost of much heavier spinlock and | ||
| 326 | memory barrier operations. | ||
| 327 | |||
| 328 | If unsure, say n here. Even distro kernels should think twice before | ||
| 329 | enabling this: there are few systems, and an unlikely bug. | ||
| 330 | |||
| 331 | config X86_F00F_BUG | 318 | config X86_F00F_BUG |
| 332 | def_bool y | 319 | def_bool y |
| 333 | depends on M586MMX || M586TSC || M586 || M486 | 320 | depends on M586MMX || M586TSC || M586 || M486 |
diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 498c1b812300..1c4d012550ec 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile | |||
| @@ -223,6 +223,15 @@ KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) | |||
| 223 | 223 | ||
| 224 | LDFLAGS := -m elf_$(UTS_MACHINE) | 224 | LDFLAGS := -m elf_$(UTS_MACHINE) |
| 225 | 225 | ||
| 226 | # | ||
| 227 | # The 64-bit kernel must be aligned to 2MB. Pass -z max-page-size=0x200000 to | ||
| 228 | # the linker to force 2MB page size regardless of the default page size used | ||
| 229 | # by the linker. | ||
| 230 | # | ||
| 231 | ifdef CONFIG_X86_64 | ||
| 232 | LDFLAGS += $(call ld-option, -z max-page-size=0x200000) | ||
| 233 | endif | ||
| 234 | |||
| 226 | # Speed up the build | 235 | # Speed up the build |
| 227 | KBUILD_CFLAGS += -pipe | 236 | KBUILD_CFLAGS += -pipe |
| 228 | # Workaround for a gcc prelease that unfortunately was shipped in a suse release | 237 | # Workaround for a gcc prelease that unfortunately was shipped in a suse release |
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 98761a1576ce..252fee320816 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
| @@ -309,6 +309,10 @@ static void parse_elf(void *output) | |||
| 309 | 309 | ||
| 310 | switch (phdr->p_type) { | 310 | switch (phdr->p_type) { |
| 311 | case PT_LOAD: | 311 | case PT_LOAD: |
| 312 | #ifdef CONFIG_X86_64 | ||
| 313 | if ((phdr->p_align % 0x200000) != 0) | ||
| 314 | error("Alignment of LOAD segment isn't multiple of 2MB"); | ||
| 315 | #endif | ||
| 312 | #ifdef CONFIG_RELOCATABLE | 316 | #ifdef CONFIG_RELOCATABLE |
| 313 | dest = output; | 317 | dest = output; |
| 314 | dest += (phdr->p_paddr - LOAD_PHYSICAL_ADDR); | 318 | dest += (phdr->p_paddr - LOAD_PHYSICAL_ADDR); |
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S index 805f52703ee3..18ed349b4f83 100644 --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S | |||
| @@ -1138,7 +1138,7 @@ apicinterrupt3 HYPERV_REENLIGHTENMENT_VECTOR \ | |||
| 1138 | #endif /* CONFIG_HYPERV */ | 1138 | #endif /* CONFIG_HYPERV */ |
| 1139 | 1139 | ||
| 1140 | idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK | 1140 | idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK |
| 1141 | idtentry int3 do_int3 has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK | 1141 | idtentry int3 do_int3 has_error_code=0 |
| 1142 | idtentry stack_segment do_stack_segment has_error_code=1 | 1142 | idtentry stack_segment do_stack_segment has_error_code=1 |
| 1143 | 1143 | ||
| 1144 | #ifdef CONFIG_XEN | 1144 | #ifdef CONFIG_XEN |
diff --git a/arch/x86/entry/vdso/vdso32/vclock_gettime.c b/arch/x86/entry/vdso/vdso32/vclock_gettime.c index 7780bbfb06ef..9242b28418d5 100644 --- a/arch/x86/entry/vdso/vdso32/vclock_gettime.c +++ b/arch/x86/entry/vdso/vdso32/vclock_gettime.c | |||
| @@ -5,8 +5,6 @@ | |||
| 5 | #undef CONFIG_OPTIMIZE_INLINING | 5 | #undef CONFIG_OPTIMIZE_INLINING |
| 6 | #endif | 6 | #endif |
| 7 | 7 | ||
| 8 | #undef CONFIG_X86_PPRO_FENCE | ||
| 9 | |||
| 10 | #ifdef CONFIG_X86_64 | 8 | #ifdef CONFIG_X86_64 |
| 11 | 9 | ||
| 12 | /* | 10 | /* |
diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c b/arch/x86/entry/vsyscall/vsyscall_64.c index 8560ef68a9d6..317be365bce3 100644 --- a/arch/x86/entry/vsyscall/vsyscall_64.c +++ b/arch/x86/entry/vsyscall/vsyscall_64.c | |||
| @@ -347,7 +347,7 @@ void __init set_vsyscall_pgtable_user_bits(pgd_t *root) | |||
| 347 | set_pgd(pgd, __pgd(pgd_val(*pgd) | _PAGE_USER)); | 347 | set_pgd(pgd, __pgd(pgd_val(*pgd) | _PAGE_USER)); |
| 348 | p4d = p4d_offset(pgd, VSYSCALL_ADDR); | 348 | p4d = p4d_offset(pgd, VSYSCALL_ADDR); |
| 349 | #if CONFIG_PGTABLE_LEVELS >= 5 | 349 | #if CONFIG_PGTABLE_LEVELS >= 5 |
| 350 | p4d->p4d |= _PAGE_USER; | 350 | set_p4d(p4d, __p4d(p4d_val(*p4d) | _PAGE_USER)); |
| 351 | #endif | 351 | #endif |
| 352 | pud = pud_offset(p4d, VSYSCALL_ADDR); | 352 | pud = pud_offset(p4d, VSYSCALL_ADDR); |
| 353 | set_pud(pud, __pud(pud_val(*pud) | _PAGE_USER)); | 353 | set_pud(pud, __pud(pud_val(*pud) | _PAGE_USER)); |
diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c index 140d33288e78..88797c80b3e0 100644 --- a/arch/x86/events/core.c +++ b/arch/x86/events/core.c | |||
| @@ -2118,7 +2118,8 @@ static int x86_pmu_event_init(struct perf_event *event) | |||
| 2118 | event->destroy(event); | 2118 | event->destroy(event); |
| 2119 | } | 2119 | } |
| 2120 | 2120 | ||
| 2121 | if (READ_ONCE(x86_pmu.attr_rdpmc)) | 2121 | if (READ_ONCE(x86_pmu.attr_rdpmc) && |
| 2122 | !(event->hw.flags & PERF_X86_EVENT_LARGE_PEBS)) | ||
| 2122 | event->hw.flags |= PERF_X86_EVENT_RDPMC_ALLOWED; | 2123 | event->hw.flags |= PERF_X86_EVENT_RDPMC_ALLOWED; |
| 2123 | 2124 | ||
| 2124 | return err; | 2125 | return err; |
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 56457cb73448..1e41d7508d99 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c | |||
| @@ -2952,9 +2952,9 @@ static void intel_pebs_aliases_skl(struct perf_event *event) | |||
| 2952 | return intel_pebs_aliases_precdist(event); | 2952 | return intel_pebs_aliases_precdist(event); |
| 2953 | } | 2953 | } |
| 2954 | 2954 | ||
| 2955 | static unsigned long intel_pmu_free_running_flags(struct perf_event *event) | 2955 | static unsigned long intel_pmu_large_pebs_flags(struct perf_event *event) |
| 2956 | { | 2956 | { |
| 2957 | unsigned long flags = x86_pmu.free_running_flags; | 2957 | unsigned long flags = x86_pmu.large_pebs_flags; |
| 2958 | 2958 | ||
| 2959 | if (event->attr.use_clockid) | 2959 | if (event->attr.use_clockid) |
| 2960 | flags &= ~PERF_SAMPLE_TIME; | 2960 | flags &= ~PERF_SAMPLE_TIME; |
| @@ -2976,8 +2976,8 @@ static int intel_pmu_hw_config(struct perf_event *event) | |||
| 2976 | if (!event->attr.freq) { | 2976 | if (!event->attr.freq) { |
| 2977 | event->hw.flags |= PERF_X86_EVENT_AUTO_RELOAD; | 2977 | event->hw.flags |= PERF_X86_EVENT_AUTO_RELOAD; |
| 2978 | if (!(event->attr.sample_type & | 2978 | if (!(event->attr.sample_type & |
| 2979 | ~intel_pmu_free_running_flags(event))) | 2979 | ~intel_pmu_large_pebs_flags(event))) |
| 2980 | event->hw.flags |= PERF_X86_EVENT_FREERUNNING; | 2980 | event->hw.flags |= PERF_X86_EVENT_LARGE_PEBS; |
| 2981 | } | 2981 | } |
| 2982 | if (x86_pmu.pebs_aliases) | 2982 | if (x86_pmu.pebs_aliases) |
| 2983 | x86_pmu.pebs_aliases(event); | 2983 | x86_pmu.pebs_aliases(event); |
| @@ -3194,7 +3194,7 @@ static unsigned bdw_limit_period(struct perf_event *event, unsigned left) | |||
| 3194 | X86_CONFIG(.event=0xc0, .umask=0x01)) { | 3194 | X86_CONFIG(.event=0xc0, .umask=0x01)) { |
| 3195 | if (left < 128) | 3195 | if (left < 128) |
| 3196 | left = 128; | 3196 | left = 128; |
| 3197 | left &= ~0x3fu; | 3197 | left &= ~0x3fULL; |
| 3198 | } | 3198 | } |
| 3199 | return left; | 3199 | return left; |
| 3200 | } | 3200 | } |
| @@ -3460,7 +3460,7 @@ static __initconst const struct x86_pmu core_pmu = { | |||
| 3460 | .event_map = intel_pmu_event_map, | 3460 | .event_map = intel_pmu_event_map, |
| 3461 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), | 3461 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), |
| 3462 | .apic = 1, | 3462 | .apic = 1, |
| 3463 | .free_running_flags = PEBS_FREERUNNING_FLAGS, | 3463 | .large_pebs_flags = LARGE_PEBS_FLAGS, |
| 3464 | 3464 | ||
| 3465 | /* | 3465 | /* |
| 3466 | * Intel PMCs cannot be accessed sanely above 32-bit width, | 3466 | * Intel PMCs cannot be accessed sanely above 32-bit width, |
| @@ -3502,7 +3502,7 @@ static __initconst const struct x86_pmu intel_pmu = { | |||
| 3502 | .event_map = intel_pmu_event_map, | 3502 | .event_map = intel_pmu_event_map, |
| 3503 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), | 3503 | .max_events = ARRAY_SIZE(intel_perfmon_event_map), |
| 3504 | .apic = 1, | 3504 | .apic = 1, |
| 3505 | .free_running_flags = PEBS_FREERUNNING_FLAGS, | 3505 | .large_pebs_flags = LARGE_PEBS_FLAGS, |
| 3506 | /* | 3506 | /* |
| 3507 | * Intel PMCs cannot be accessed sanely above 32 bit width, | 3507 | * Intel PMCs cannot be accessed sanely above 32 bit width, |
| 3508 | * so we install an artificial 1<<31 period regardless of | 3508 | * so we install an artificial 1<<31 period regardless of |
diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c index 18c25ab28557..d8015235ba76 100644 --- a/arch/x86/events/intel/ds.c +++ b/arch/x86/events/intel/ds.c | |||
| @@ -935,7 +935,7 @@ void intel_pmu_pebs_add(struct perf_event *event) | |||
| 935 | bool needed_cb = pebs_needs_sched_cb(cpuc); | 935 | bool needed_cb = pebs_needs_sched_cb(cpuc); |
| 936 | 936 | ||
| 937 | cpuc->n_pebs++; | 937 | cpuc->n_pebs++; |
| 938 | if (hwc->flags & PERF_X86_EVENT_FREERUNNING) | 938 | if (hwc->flags & PERF_X86_EVENT_LARGE_PEBS) |
| 939 | cpuc->n_large_pebs++; | 939 | cpuc->n_large_pebs++; |
| 940 | 940 | ||
| 941 | pebs_update_state(needed_cb, cpuc, event->ctx->pmu); | 941 | pebs_update_state(needed_cb, cpuc, event->ctx->pmu); |
| @@ -975,7 +975,7 @@ void intel_pmu_pebs_del(struct perf_event *event) | |||
| 975 | bool needed_cb = pebs_needs_sched_cb(cpuc); | 975 | bool needed_cb = pebs_needs_sched_cb(cpuc); |
| 976 | 976 | ||
| 977 | cpuc->n_pebs--; | 977 | cpuc->n_pebs--; |
| 978 | if (hwc->flags & PERF_X86_EVENT_FREERUNNING) | 978 | if (hwc->flags & PERF_X86_EVENT_LARGE_PEBS) |
| 979 | cpuc->n_large_pebs--; | 979 | cpuc->n_large_pebs--; |
| 980 | 980 | ||
| 981 | pebs_update_state(needed_cb, cpuc, event->ctx->pmu); | 981 | pebs_update_state(needed_cb, cpuc, event->ctx->pmu); |
| @@ -1530,7 +1530,7 @@ void __init intel_ds_init(void) | |||
| 1530 | x86_pmu.pebs_record_size = | 1530 | x86_pmu.pebs_record_size = |
| 1531 | sizeof(struct pebs_record_skl); | 1531 | sizeof(struct pebs_record_skl); |
| 1532 | x86_pmu.drain_pebs = intel_pmu_drain_pebs_nhm; | 1532 | x86_pmu.drain_pebs = intel_pmu_drain_pebs_nhm; |
| 1533 | x86_pmu.free_running_flags |= PERF_SAMPLE_TIME; | 1533 | x86_pmu.large_pebs_flags |= PERF_SAMPLE_TIME; |
| 1534 | break; | 1534 | break; |
| 1535 | 1535 | ||
| 1536 | default: | 1536 | default: |
diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c index 22ec65bc033a..c98b943e58b4 100644 --- a/arch/x86/events/intel/uncore_snbep.c +++ b/arch/x86/events/intel/uncore_snbep.c | |||
| @@ -3343,6 +3343,7 @@ static struct extra_reg skx_uncore_cha_extra_regs[] = { | |||
| 3343 | SNBEP_CBO_EVENT_EXTRA_REG(0x9134, 0xffff, 0x4), | 3343 | SNBEP_CBO_EVENT_EXTRA_REG(0x9134, 0xffff, 0x4), |
| 3344 | SNBEP_CBO_EVENT_EXTRA_REG(0x35, 0xff, 0x8), | 3344 | SNBEP_CBO_EVENT_EXTRA_REG(0x35, 0xff, 0x8), |
| 3345 | SNBEP_CBO_EVENT_EXTRA_REG(0x36, 0xff, 0x8), | 3345 | SNBEP_CBO_EVENT_EXTRA_REG(0x36, 0xff, 0x8), |
| 3346 | SNBEP_CBO_EVENT_EXTRA_REG(0x38, 0xff, 0x3), | ||
| 3346 | EVENT_EXTRA_END | 3347 | EVENT_EXTRA_END |
| 3347 | }; | 3348 | }; |
| 3348 | 3349 | ||
| @@ -3562,24 +3563,27 @@ static struct intel_uncore_type *skx_msr_uncores[] = { | |||
| 3562 | NULL, | 3563 | NULL, |
| 3563 | }; | 3564 | }; |
| 3564 | 3565 | ||
| 3566 | /* | ||
| 3567 | * To determine the number of CHAs, it should read bits 27:0 in the CAPID6 | ||
| 3568 | * register which located at Device 30, Function 3, Offset 0x9C. PCI ID 0x2083. | ||
| 3569 | */ | ||
| 3570 | #define SKX_CAPID6 0x9c | ||
| 3571 | #define SKX_CHA_BIT_MASK GENMASK(27, 0) | ||
| 3572 | |||
| 3565 | static int skx_count_chabox(void) | 3573 | static int skx_count_chabox(void) |
| 3566 | { | 3574 | { |
| 3567 | struct pci_dev *chabox_dev = NULL; | 3575 | struct pci_dev *dev = NULL; |
| 3568 | int bus, count = 0; | 3576 | u32 val = 0; |
| 3569 | 3577 | ||
| 3570 | while (1) { | 3578 | dev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x2083, dev); |
| 3571 | chabox_dev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x208d, chabox_dev); | 3579 | if (!dev) |
| 3572 | if (!chabox_dev) | 3580 | goto out; |
| 3573 | break; | ||
| 3574 | if (count == 0) | ||
| 3575 | bus = chabox_dev->bus->number; | ||
| 3576 | if (bus != chabox_dev->bus->number) | ||
| 3577 | break; | ||
| 3578 | count++; | ||
| 3579 | } | ||
| 3580 | 3581 | ||
| 3581 | pci_dev_put(chabox_dev); | 3582 | pci_read_config_dword(dev, SKX_CAPID6, &val); |
| 3582 | return count; | 3583 | val &= SKX_CHA_BIT_MASK; |
| 3584 | out: | ||
| 3585 | pci_dev_put(dev); | ||
| 3586 | return hweight32(val); | ||
| 3583 | } | 3587 | } |
| 3584 | 3588 | ||
| 3585 | void skx_uncore_cpu_init(void) | 3589 | void skx_uncore_cpu_init(void) |
diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h index 78f91ec1056e..39cd0615f04f 100644 --- a/arch/x86/events/perf_event.h +++ b/arch/x86/events/perf_event.h | |||
| @@ -69,7 +69,7 @@ struct event_constraint { | |||
| 69 | #define PERF_X86_EVENT_RDPMC_ALLOWED 0x0100 /* grant rdpmc permission */ | 69 | #define PERF_X86_EVENT_RDPMC_ALLOWED 0x0100 /* grant rdpmc permission */ |
| 70 | #define PERF_X86_EVENT_EXCL_ACCT 0x0200 /* accounted EXCL event */ | 70 | #define PERF_X86_EVENT_EXCL_ACCT 0x0200 /* accounted EXCL event */ |
| 71 | #define PERF_X86_EVENT_AUTO_RELOAD 0x0400 /* use PEBS auto-reload */ | 71 | #define PERF_X86_EVENT_AUTO_RELOAD 0x0400 /* use PEBS auto-reload */ |
| 72 | #define PERF_X86_EVENT_FREERUNNING 0x0800 /* use freerunning PEBS */ | 72 | #define PERF_X86_EVENT_LARGE_PEBS 0x0800 /* use large PEBS */ |
| 73 | 73 | ||
| 74 | 74 | ||
| 75 | struct amd_nb { | 75 | struct amd_nb { |
| @@ -88,7 +88,7 @@ struct amd_nb { | |||
| 88 | * REGS_USER can be handled for events limited to ring 3. | 88 | * REGS_USER can be handled for events limited to ring 3. |
| 89 | * | 89 | * |
| 90 | */ | 90 | */ |
| 91 | #define PEBS_FREERUNNING_FLAGS \ | 91 | #define LARGE_PEBS_FLAGS \ |
| 92 | (PERF_SAMPLE_IP | PERF_SAMPLE_TID | PERF_SAMPLE_ADDR | \ | 92 | (PERF_SAMPLE_IP | PERF_SAMPLE_TID | PERF_SAMPLE_ADDR | \ |
| 93 | PERF_SAMPLE_ID | PERF_SAMPLE_CPU | PERF_SAMPLE_STREAM_ID | \ | 93 | PERF_SAMPLE_ID | PERF_SAMPLE_CPU | PERF_SAMPLE_STREAM_ID | \ |
| 94 | PERF_SAMPLE_DATA_SRC | PERF_SAMPLE_IDENTIFIER | \ | 94 | PERF_SAMPLE_DATA_SRC | PERF_SAMPLE_IDENTIFIER | \ |
| @@ -608,7 +608,7 @@ struct x86_pmu { | |||
| 608 | struct event_constraint *pebs_constraints; | 608 | struct event_constraint *pebs_constraints; |
| 609 | void (*pebs_aliases)(struct perf_event *event); | 609 | void (*pebs_aliases)(struct perf_event *event); |
| 610 | int max_pebs_events; | 610 | int max_pebs_events; |
| 611 | unsigned long free_running_flags; | 611 | unsigned long large_pebs_flags; |
| 612 | 612 | ||
| 613 | /* | 613 | /* |
| 614 | * Intel LBR | 614 | * Intel LBR |
diff --git a/arch/x86/include/asm/barrier.h b/arch/x86/include/asm/barrier.h index e1259f043ae9..042b5e892ed1 100644 --- a/arch/x86/include/asm/barrier.h +++ b/arch/x86/include/asm/barrier.h | |||
| @@ -52,11 +52,7 @@ static inline unsigned long array_index_mask_nospec(unsigned long index, | |||
| 52 | #define barrier_nospec() alternative_2("", "mfence", X86_FEATURE_MFENCE_RDTSC, \ | 52 | #define barrier_nospec() alternative_2("", "mfence", X86_FEATURE_MFENCE_RDTSC, \ |
| 53 | "lfence", X86_FEATURE_LFENCE_RDTSC) | 53 | "lfence", X86_FEATURE_LFENCE_RDTSC) |
| 54 | 54 | ||
| 55 | #ifdef CONFIG_X86_PPRO_FENCE | ||
| 56 | #define dma_rmb() rmb() | ||
| 57 | #else | ||
| 58 | #define dma_rmb() barrier() | 55 | #define dma_rmb() barrier() |
| 59 | #endif | ||
| 60 | #define dma_wmb() barrier() | 56 | #define dma_wmb() barrier() |
| 61 | 57 | ||
| 62 | #ifdef CONFIG_X86_32 | 58 | #ifdef CONFIG_X86_32 |
| @@ -68,30 +64,6 @@ static inline unsigned long array_index_mask_nospec(unsigned long index, | |||
| 68 | #define __smp_wmb() barrier() | 64 | #define __smp_wmb() barrier() |
| 69 | #define __smp_store_mb(var, value) do { (void)xchg(&var, value); } while (0) | 65 | #define __smp_store_mb(var, value) do { (void)xchg(&var, value); } while (0) |
| 70 | 66 | ||
| 71 | #if defined(CONFIG_X86_PPRO_FENCE) | ||
| 72 | |||
| 73 | /* | ||
| 74 | * For this option x86 doesn't have a strong TSO memory | ||
| 75 | * model and we should fall back to full barriers. | ||
| 76 | */ | ||
| 77 | |||
| 78 | #define __smp_store_release(p, v) \ | ||
| 79 | do { \ | ||
| 80 | compiletime_assert_atomic_type(*p); \ | ||
| 81 | __smp_mb(); \ | ||
| 82 | WRITE_ONCE(*p, v); \ | ||
| 83 | } while (0) | ||
| 84 | |||
| 85 | #define __smp_load_acquire(p) \ | ||
| 86 | ({ \ | ||
| 87 | typeof(*p) ___p1 = READ_ONCE(*p); \ | ||
| 88 | compiletime_assert_atomic_type(*p); \ | ||
| 89 | __smp_mb(); \ | ||
| 90 | ___p1; \ | ||
| 91 | }) | ||
| 92 | |||
| 93 | #else /* regular x86 TSO memory ordering */ | ||
| 94 | |||
| 95 | #define __smp_store_release(p, v) \ | 67 | #define __smp_store_release(p, v) \ |
| 96 | do { \ | 68 | do { \ |
| 97 | compiletime_assert_atomic_type(*p); \ | 69 | compiletime_assert_atomic_type(*p); \ |
| @@ -107,8 +79,6 @@ do { \ | |||
| 107 | ___p1; \ | 79 | ___p1; \ |
| 108 | }) | 80 | }) |
| 109 | 81 | ||
| 110 | #endif | ||
| 111 | |||
| 112 | /* Atomic operations are already serializing on x86 */ | 82 | /* Atomic operations are already serializing on x86 */ |
| 113 | #define __smp_mb__before_atomic() barrier() | 83 | #define __smp_mb__before_atomic() barrier() |
| 114 | #define __smp_mb__after_atomic() barrier() | 84 | #define __smp_mb__after_atomic() barrier() |
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index 95e948627fd0..f6e5b9375d8c 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h | |||
| @@ -232,21 +232,6 @@ extern void set_iounmap_nonlazy(void); | |||
| 232 | */ | 232 | */ |
| 233 | #define __ISA_IO_base ((char __iomem *)(PAGE_OFFSET)) | 233 | #define __ISA_IO_base ((char __iomem *)(PAGE_OFFSET)) |
| 234 | 234 | ||
| 235 | /* | ||
| 236 | * Cache management | ||
| 237 | * | ||
| 238 | * This needed for two cases | ||
| 239 | * 1. Out of order aware processors | ||
| 240 | * 2. Accidentally out of order processors (PPro errata #51) | ||
| 241 | */ | ||
| 242 | |||
| 243 | static inline void flush_write_buffers(void) | ||
| 244 | { | ||
| 245 | #if defined(CONFIG_X86_PPRO_FENCE) | ||
| 246 | asm volatile("lock; addl $0,0(%%esp)": : :"memory"); | ||
| 247 | #endif | ||
| 248 | } | ||
| 249 | |||
| 250 | #endif /* __KERNEL__ */ | 235 | #endif /* __KERNEL__ */ |
| 251 | 236 | ||
| 252 | extern void native_io_delay(void); | 237 | extern void native_io_delay(void); |
diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c index 56d99be3706a..50bee5fe1140 100644 --- a/arch/x86/kernel/idt.c +++ b/arch/x86/kernel/idt.c | |||
| @@ -160,7 +160,6 @@ static const __initconst struct idt_data early_pf_idts[] = { | |||
| 160 | */ | 160 | */ |
| 161 | static const __initconst struct idt_data dbg_idts[] = { | 161 | static const __initconst struct idt_data dbg_idts[] = { |
| 162 | INTG(X86_TRAP_DB, debug), | 162 | INTG(X86_TRAP_DB, debug), |
| 163 | INTG(X86_TRAP_BP, int3), | ||
| 164 | }; | 163 | }; |
| 165 | #endif | 164 | #endif |
| 166 | 165 | ||
| @@ -183,7 +182,6 @@ gate_desc debug_idt_table[IDT_ENTRIES] __page_aligned_bss; | |||
| 183 | static const __initconst struct idt_data ist_idts[] = { | 182 | static const __initconst struct idt_data ist_idts[] = { |
| 184 | ISTG(X86_TRAP_DB, debug, DEBUG_STACK), | 183 | ISTG(X86_TRAP_DB, debug, DEBUG_STACK), |
| 185 | ISTG(X86_TRAP_NMI, nmi, NMI_STACK), | 184 | ISTG(X86_TRAP_NMI, nmi, NMI_STACK), |
| 186 | SISTG(X86_TRAP_BP, int3, DEBUG_STACK), | ||
| 187 | ISTG(X86_TRAP_DF, double_fault, DOUBLEFAULT_STACK), | 185 | ISTG(X86_TRAP_DF, double_fault, DOUBLEFAULT_STACK), |
| 188 | #ifdef CONFIG_X86_MCE | 186 | #ifdef CONFIG_X86_MCE |
| 189 | ISTG(X86_TRAP_MC, &machine_check, MCE_STACK), | 187 | ISTG(X86_TRAP_MC, &machine_check, MCE_STACK), |
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index bc1a27280c4b..fae86e36e399 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c | |||
| @@ -546,7 +546,7 @@ static void __init kvm_guest_init(void) | |||
| 546 | } | 546 | } |
| 547 | 547 | ||
| 548 | if (kvm_para_has_feature(KVM_FEATURE_PV_TLB_FLUSH) && | 548 | if (kvm_para_has_feature(KVM_FEATURE_PV_TLB_FLUSH) && |
| 549 | !kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)) | 549 | kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)) |
| 550 | pv_mmu_ops.flush_tlb_others = kvm_flush_tlb_others; | 550 | pv_mmu_ops.flush_tlb_others = kvm_flush_tlb_others; |
| 551 | 551 | ||
| 552 | if (kvm_para_has_feature(KVM_FEATURE_PV_EOI)) | 552 | if (kvm_para_has_feature(KVM_FEATURE_PV_EOI)) |
| @@ -635,7 +635,7 @@ static __init int kvm_setup_pv_tlb_flush(void) | |||
| 635 | int cpu; | 635 | int cpu; |
| 636 | 636 | ||
| 637 | if (kvm_para_has_feature(KVM_FEATURE_PV_TLB_FLUSH) && | 637 | if (kvm_para_has_feature(KVM_FEATURE_PV_TLB_FLUSH) && |
| 638 | !kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)) { | 638 | kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)) { |
| 639 | for_each_possible_cpu(cpu) { | 639 | for_each_possible_cpu(cpu) { |
| 640 | zalloc_cpumask_var_node(per_cpu_ptr(&__pv_tlb_mask, cpu), | 640 | zalloc_cpumask_var_node(per_cpu_ptr(&__pv_tlb_mask, cpu), |
| 641 | GFP_KERNEL, cpu_to_node(cpu)); | 641 | GFP_KERNEL, cpu_to_node(cpu)); |
diff --git a/arch/x86/kernel/pci-nommu.c b/arch/x86/kernel/pci-nommu.c index 618285e475c6..ac7ea3a8242f 100644 --- a/arch/x86/kernel/pci-nommu.c +++ b/arch/x86/kernel/pci-nommu.c | |||
| @@ -37,7 +37,6 @@ static dma_addr_t nommu_map_page(struct device *dev, struct page *page, | |||
| 37 | WARN_ON(size == 0); | 37 | WARN_ON(size == 0); |
| 38 | if (!check_addr("map_single", dev, bus, size)) | 38 | if (!check_addr("map_single", dev, bus, size)) |
| 39 | return NOMMU_MAPPING_ERROR; | 39 | return NOMMU_MAPPING_ERROR; |
| 40 | flush_write_buffers(); | ||
| 41 | return bus; | 40 | return bus; |
| 42 | } | 41 | } |
| 43 | 42 | ||
| @@ -72,25 +71,9 @@ static int nommu_map_sg(struct device *hwdev, struct scatterlist *sg, | |||
| 72 | return 0; | 71 | return 0; |
| 73 | s->dma_length = s->length; | 72 | s->dma_length = s->length; |
| 74 | } | 73 | } |
| 75 | flush_write_buffers(); | ||
| 76 | return nents; | 74 | return nents; |
| 77 | } | 75 | } |
| 78 | 76 | ||
| 79 | static void nommu_sync_single_for_device(struct device *dev, | ||
| 80 | dma_addr_t addr, size_t size, | ||
| 81 | enum dma_data_direction dir) | ||
| 82 | { | ||
| 83 | flush_write_buffers(); | ||
| 84 | } | ||
| 85 | |||
| 86 | |||
| 87 | static void nommu_sync_sg_for_device(struct device *dev, | ||
| 88 | struct scatterlist *sg, int nelems, | ||
| 89 | enum dma_data_direction dir) | ||
| 90 | { | ||
| 91 | flush_write_buffers(); | ||
| 92 | } | ||
| 93 | |||
| 94 | static int nommu_mapping_error(struct device *dev, dma_addr_t dma_addr) | 77 | static int nommu_mapping_error(struct device *dev, dma_addr_t dma_addr) |
| 95 | { | 78 | { |
| 96 | return dma_addr == NOMMU_MAPPING_ERROR; | 79 | return dma_addr == NOMMU_MAPPING_ERROR; |
| @@ -101,8 +84,6 @@ const struct dma_map_ops nommu_dma_ops = { | |||
| 101 | .free = dma_generic_free_coherent, | 84 | .free = dma_generic_free_coherent, |
| 102 | .map_sg = nommu_map_sg, | 85 | .map_sg = nommu_map_sg, |
| 103 | .map_page = nommu_map_page, | 86 | .map_page = nommu_map_page, |
| 104 | .sync_single_for_device = nommu_sync_single_for_device, | ||
| 105 | .sync_sg_for_device = nommu_sync_sg_for_device, | ||
| 106 | .is_phys = 1, | 87 | .is_phys = 1, |
| 107 | .mapping_error = nommu_mapping_error, | 88 | .mapping_error = nommu_mapping_error, |
| 108 | .dma_supported = x86_dma_supported, | 89 | .dma_supported = x86_dma_supported, |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 3d9b2308e7fa..03f3d7695dac 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -577,7 +577,6 @@ do_general_protection(struct pt_regs *regs, long error_code) | |||
| 577 | } | 577 | } |
| 578 | NOKPROBE_SYMBOL(do_general_protection); | 578 | NOKPROBE_SYMBOL(do_general_protection); |
| 579 | 579 | ||
| 580 | /* May run on IST stack. */ | ||
| 581 | dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code) | 580 | dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code) |
| 582 | { | 581 | { |
| 583 | #ifdef CONFIG_DYNAMIC_FTRACE | 582 | #ifdef CONFIG_DYNAMIC_FTRACE |
| @@ -592,6 +591,13 @@ dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code) | |||
| 592 | if (poke_int3_handler(regs)) | 591 | if (poke_int3_handler(regs)) |
| 593 | return; | 592 | return; |
| 594 | 593 | ||
| 594 | /* | ||
| 595 | * Use ist_enter despite the fact that we don't use an IST stack. | ||
| 596 | * We can be called from a kprobe in non-CONTEXT_KERNEL kernel | ||
| 597 | * mode or even during context tracking state changes. | ||
| 598 | * | ||
| 599 | * This means that we can't schedule. That's okay. | ||
| 600 | */ | ||
| 595 | ist_enter(regs); | 601 | ist_enter(regs); |
| 596 | RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); | 602 | RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); |
| 597 | #ifdef CONFIG_KGDB_LOW_LEVEL_TRAP | 603 | #ifdef CONFIG_KGDB_LOW_LEVEL_TRAP |
| @@ -609,15 +615,10 @@ dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code) | |||
| 609 | SIGTRAP) == NOTIFY_STOP) | 615 | SIGTRAP) == NOTIFY_STOP) |
| 610 | goto exit; | 616 | goto exit; |
| 611 | 617 | ||
| 612 | /* | ||
| 613 | * Let others (NMI) know that the debug stack is in use | ||
| 614 | * as we may switch to the interrupt stack. | ||
| 615 | */ | ||
| 616 | debug_stack_usage_inc(); | ||
| 617 | cond_local_irq_enable(regs); | 618 | cond_local_irq_enable(regs); |
| 618 | do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, NULL); | 619 | do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, NULL); |
| 619 | cond_local_irq_disable(regs); | 620 | cond_local_irq_disable(regs); |
| 620 | debug_stack_usage_dec(); | 621 | |
| 621 | exit: | 622 | exit: |
| 622 | ist_exit(regs); | 623 | ist_exit(regs); |
| 623 | } | 624 | } |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 2d87603f9179..657c93409042 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -10711,6 +10711,11 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, | |||
| 10711 | struct vcpu_vmx *vmx = to_vmx(vcpu); | 10711 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
| 10712 | u32 exec_control, vmcs12_exec_ctrl; | 10712 | u32 exec_control, vmcs12_exec_ctrl; |
| 10713 | 10713 | ||
| 10714 | if (vmx->nested.dirty_vmcs12) { | ||
| 10715 | prepare_vmcs02_full(vcpu, vmcs12, from_vmentry); | ||
| 10716 | vmx->nested.dirty_vmcs12 = false; | ||
| 10717 | } | ||
| 10718 | |||
| 10714 | /* | 10719 | /* |
| 10715 | * First, the fields that are shadowed. This must be kept in sync | 10720 | * First, the fields that are shadowed. This must be kept in sync |
| 10716 | * with vmx_shadow_fields.h. | 10721 | * with vmx_shadow_fields.h. |
| @@ -10948,11 +10953,6 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, | |||
| 10948 | /* Note: modifies VM_ENTRY/EXIT_CONTROLS and GUEST/HOST_IA32_EFER */ | 10953 | /* Note: modifies VM_ENTRY/EXIT_CONTROLS and GUEST/HOST_IA32_EFER */ |
| 10949 | vmx_set_efer(vcpu, vcpu->arch.efer); | 10954 | vmx_set_efer(vcpu, vcpu->arch.efer); |
| 10950 | 10955 | ||
| 10951 | if (vmx->nested.dirty_vmcs12) { | ||
| 10952 | prepare_vmcs02_full(vcpu, vmcs12, from_vmentry); | ||
| 10953 | vmx->nested.dirty_vmcs12 = false; | ||
| 10954 | } | ||
| 10955 | |||
| 10956 | /* Shadow page tables on either EPT or shadow page tables. */ | 10956 | /* Shadow page tables on either EPT or shadow page tables. */ |
| 10957 | if (nested_vmx_load_cr3(vcpu, vmcs12->guest_cr3, nested_cpu_has_ept(vmcs12), | 10957 | if (nested_vmx_load_cr3(vcpu, vmcs12->guest_cr3, nested_cpu_has_ept(vmcs12), |
| 10958 | entry_failure_code)) | 10958 | entry_failure_code)) |
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index c310a8284358..f9cfbc0d1f33 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c | |||
| @@ -227,7 +227,7 @@ int __init efi_alloc_page_tables(void) | |||
| 227 | if (!pud) { | 227 | if (!pud) { |
| 228 | if (CONFIG_PGTABLE_LEVELS > 4) | 228 | if (CONFIG_PGTABLE_LEVELS > 4) |
| 229 | free_page((unsigned long) pgd_page_vaddr(*pgd)); | 229 | free_page((unsigned long) pgd_page_vaddr(*pgd)); |
| 230 | free_page((unsigned long)efi_pgd); | 230 | free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER); |
| 231 | return -ENOMEM; | 231 | return -ENOMEM; |
| 232 | } | 232 | } |
| 233 | 233 | ||
diff --git a/arch/x86/um/asm/barrier.h b/arch/x86/um/asm/barrier.h index b7d73400ea29..f31e5d903161 100644 --- a/arch/x86/um/asm/barrier.h +++ b/arch/x86/um/asm/barrier.h | |||
| @@ -30,11 +30,7 @@ | |||
| 30 | 30 | ||
| 31 | #endif /* CONFIG_X86_32 */ | 31 | #endif /* CONFIG_X86_32 */ |
| 32 | 32 | ||
| 33 | #ifdef CONFIG_X86_PPRO_FENCE | ||
| 34 | #define dma_rmb() rmb() | ||
| 35 | #else /* CONFIG_X86_PPRO_FENCE */ | ||
| 36 | #define dma_rmb() barrier() | 33 | #define dma_rmb() barrier() |
| 37 | #endif /* CONFIG_X86_PPRO_FENCE */ | ||
| 38 | #define dma_wmb() barrier() | 34 | #define dma_wmb() barrier() |
| 39 | 35 | ||
| 40 | #include <asm-generic/barrier.h> | 36 | #include <asm-generic/barrier.h> |
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index 98a3a43484c8..44abb8a0a5e5 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c | |||
| @@ -3147,7 +3147,7 @@ static int ia_proc_read(struct atm_dev *dev,loff_t *pos,char *page) | |||
| 3147 | " Size of Tx Buffer : %u\n" | 3147 | " Size of Tx Buffer : %u\n" |
| 3148 | " Number of Rx Buffer: %u\n" | 3148 | " Number of Rx Buffer: %u\n" |
| 3149 | " Size of Rx Buffer : %u\n" | 3149 | " Size of Rx Buffer : %u\n" |
| 3150 | " Packets Receiverd : %u\n" | 3150 | " Packets Received : %u\n" |
| 3151 | " Packets Transmitted: %u\n" | 3151 | " Packets Transmitted: %u\n" |
| 3152 | " Cells Received : %u\n" | 3152 | " Cells Received : %u\n" |
| 3153 | " Cells Transmitted : %u\n" | 3153 | " Cells Transmitted : %u\n" |
diff --git a/drivers/dma/stm32-dmamux.c b/drivers/dma/stm32-dmamux.c index 4dbb30cf94ac..b922db90939a 100644 --- a/drivers/dma/stm32-dmamux.c +++ b/drivers/dma/stm32-dmamux.c | |||
| @@ -118,14 +118,15 @@ static void *stm32_dmamux_route_allocate(struct of_phandle_args *dma_spec, | |||
| 118 | spin_lock_irqsave(&dmamux->lock, flags); | 118 | spin_lock_irqsave(&dmamux->lock, flags); |
| 119 | mux->chan_id = find_first_zero_bit(dmamux->dma_inuse, | 119 | mux->chan_id = find_first_zero_bit(dmamux->dma_inuse, |
| 120 | dmamux->dma_requests); | 120 | dmamux->dma_requests); |
| 121 | set_bit(mux->chan_id, dmamux->dma_inuse); | ||
| 122 | spin_unlock_irqrestore(&dmamux->lock, flags); | ||
| 123 | 121 | ||
| 124 | if (mux->chan_id == dmamux->dma_requests) { | 122 | if (mux->chan_id == dmamux->dma_requests) { |
| 123 | spin_unlock_irqrestore(&dmamux->lock, flags); | ||
| 125 | dev_err(&pdev->dev, "Run out of free DMA requests\n"); | 124 | dev_err(&pdev->dev, "Run out of free DMA requests\n"); |
| 126 | ret = -ENOMEM; | 125 | ret = -ENOMEM; |
| 127 | goto error; | 126 | goto error_chan_id; |
| 128 | } | 127 | } |
| 128 | set_bit(mux->chan_id, dmamux->dma_inuse); | ||
| 129 | spin_unlock_irqrestore(&dmamux->lock, flags); | ||
| 129 | 130 | ||
| 130 | /* Look for DMA Master */ | 131 | /* Look for DMA Master */ |
| 131 | for (i = 1, min = 0, max = dmamux->dma_reqs[i]; | 132 | for (i = 1, min = 0, max = dmamux->dma_reqs[i]; |
| @@ -173,6 +174,8 @@ static void *stm32_dmamux_route_allocate(struct of_phandle_args *dma_spec, | |||
| 173 | 174 | ||
| 174 | error: | 175 | error: |
| 175 | clear_bit(mux->chan_id, dmamux->dma_inuse); | 176 | clear_bit(mux->chan_id, dmamux->dma_inuse); |
| 177 | |||
| 178 | error_chan_id: | ||
| 176 | kfree(mux); | 179 | kfree(mux); |
| 177 | return ERR_PTR(ret); | 180 | return ERR_PTR(ret); |
| 178 | } | 181 | } |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index b21285afa4ea..1bd5f26b3f00 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | |||
| @@ -821,13 +821,13 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, | |||
| 821 | pr_warn("Can't create new usermode queue because %d queues were already created\n", | 821 | pr_warn("Can't create new usermode queue because %d queues were already created\n", |
| 822 | dqm->total_queue_count); | 822 | dqm->total_queue_count); |
| 823 | retval = -EPERM; | 823 | retval = -EPERM; |
| 824 | goto out; | 824 | goto out_unlock; |
| 825 | } | 825 | } |
| 826 | 826 | ||
| 827 | if (q->properties.type == KFD_QUEUE_TYPE_SDMA) { | 827 | if (q->properties.type == KFD_QUEUE_TYPE_SDMA) { |
| 828 | retval = allocate_sdma_queue(dqm, &q->sdma_id); | 828 | retval = allocate_sdma_queue(dqm, &q->sdma_id); |
| 829 | if (retval) | 829 | if (retval) |
| 830 | goto out; | 830 | goto out_unlock; |
| 831 | q->properties.sdma_queue_id = | 831 | q->properties.sdma_queue_id = |
| 832 | q->sdma_id / CIK_SDMA_QUEUES_PER_ENGINE; | 832 | q->sdma_id / CIK_SDMA_QUEUES_PER_ENGINE; |
| 833 | q->properties.sdma_engine_id = | 833 | q->properties.sdma_engine_id = |
| @@ -838,7 +838,7 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, | |||
| 838 | 838 | ||
| 839 | if (!mqd) { | 839 | if (!mqd) { |
| 840 | retval = -ENOMEM; | 840 | retval = -ENOMEM; |
| 841 | goto out; | 841 | goto out_deallocate_sdma_queue; |
| 842 | } | 842 | } |
| 843 | 843 | ||
| 844 | dqm->asic_ops.init_sdma_vm(dqm, q, qpd); | 844 | dqm->asic_ops.init_sdma_vm(dqm, q, qpd); |
| @@ -848,7 +848,7 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, | |||
| 848 | retval = mqd->init_mqd(mqd, &q->mqd, &q->mqd_mem_obj, | 848 | retval = mqd->init_mqd(mqd, &q->mqd, &q->mqd_mem_obj, |
| 849 | &q->gart_mqd_addr, &q->properties); | 849 | &q->gart_mqd_addr, &q->properties); |
| 850 | if (retval) | 850 | if (retval) |
| 851 | goto out; | 851 | goto out_deallocate_sdma_queue; |
| 852 | 852 | ||
| 853 | list_add(&q->list, &qpd->queues_list); | 853 | list_add(&q->list, &qpd->queues_list); |
| 854 | qpd->queue_count++; | 854 | qpd->queue_count++; |
| @@ -869,7 +869,13 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, | |||
| 869 | pr_debug("Total of %d queues are accountable so far\n", | 869 | pr_debug("Total of %d queues are accountable so far\n", |
| 870 | dqm->total_queue_count); | 870 | dqm->total_queue_count); |
| 871 | 871 | ||
| 872 | out: | 872 | mutex_unlock(&dqm->lock); |
| 873 | return retval; | ||
| 874 | |||
| 875 | out_deallocate_sdma_queue: | ||
| 876 | if (q->properties.type == KFD_QUEUE_TYPE_SDMA) | ||
| 877 | deallocate_sdma_queue(dqm, q->sdma_id); | ||
| 878 | out_unlock: | ||
| 873 | mutex_unlock(&dqm->lock); | 879 | mutex_unlock(&dqm->lock); |
| 874 | return retval; | 880 | return retval; |
| 875 | } | 881 | } |
| @@ -1188,8 +1194,10 @@ static int process_termination_cpsch(struct device_queue_manager *dqm, | |||
| 1188 | 1194 | ||
| 1189 | /* Clear all user mode queues */ | 1195 | /* Clear all user mode queues */ |
| 1190 | list_for_each_entry(q, &qpd->queues_list, list) { | 1196 | list_for_each_entry(q, &qpd->queues_list, list) { |
| 1191 | if (q->properties.type == KFD_QUEUE_TYPE_SDMA) | 1197 | if (q->properties.type == KFD_QUEUE_TYPE_SDMA) { |
| 1192 | dqm->sdma_queue_count--; | 1198 | dqm->sdma_queue_count--; |
| 1199 | deallocate_sdma_queue(dqm, q->sdma_id); | ||
| 1200 | } | ||
| 1193 | 1201 | ||
| 1194 | if (q->properties.is_active) | 1202 | if (q->properties.is_active) |
| 1195 | dqm->queue_count--; | 1203 | dqm->queue_count--; |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c index 0ecbd1f9b606..0c3bc00978f7 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c | |||
| @@ -188,8 +188,7 @@ static int pm_create_map_process(struct packet_manager *pm, uint32_t *buffer, | |||
| 188 | packet->sh_mem_ape1_base = qpd->sh_mem_ape1_base; | 188 | packet->sh_mem_ape1_base = qpd->sh_mem_ape1_base; |
| 189 | packet->sh_mem_ape1_limit = qpd->sh_mem_ape1_limit; | 189 | packet->sh_mem_ape1_limit = qpd->sh_mem_ape1_limit; |
| 190 | 190 | ||
| 191 | /* TODO: scratch support */ | 191 | packet->sh_hidden_private_base_vmid = qpd->sh_hidden_private_base; |
| 192 | packet->sh_hidden_private_base_vmid = 0; | ||
| 193 | 192 | ||
| 194 | packet->gds_addr_lo = lower_32_bits(qpd->gds_context_area); | 193 | packet->gds_addr_lo = lower_32_bits(qpd->gds_context_area); |
| 195 | packet->gds_addr_hi = upper_32_bits(qpd->gds_context_area); | 194 | packet->gds_addr_hi = upper_32_bits(qpd->gds_context_area); |
diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index fbffe1948b3b..90b25ce363ca 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c | |||
| @@ -2009,9 +2009,9 @@ static const struct tegra_dc_soc_info tegra124_dc_soc_info = { | |||
| 2009 | .coupled_pm = false, | 2009 | .coupled_pm = false, |
| 2010 | .has_nvdisplay = false, | 2010 | .has_nvdisplay = false, |
| 2011 | .num_primary_formats = ARRAY_SIZE(tegra124_primary_formats), | 2011 | .num_primary_formats = ARRAY_SIZE(tegra124_primary_formats), |
| 2012 | .primary_formats = tegra114_primary_formats, | 2012 | .primary_formats = tegra124_primary_formats, |
| 2013 | .num_overlay_formats = ARRAY_SIZE(tegra124_overlay_formats), | 2013 | .num_overlay_formats = ARRAY_SIZE(tegra124_overlay_formats), |
| 2014 | .overlay_formats = tegra114_overlay_formats, | 2014 | .overlay_formats = tegra124_overlay_formats, |
| 2015 | }; | 2015 | }; |
| 2016 | 2016 | ||
| 2017 | static const struct tegra_dc_soc_info tegra210_dc_soc_info = { | 2017 | static const struct tegra_dc_soc_info tegra210_dc_soc_info = { |
| @@ -2160,7 +2160,7 @@ static int tegra_dc_couple(struct tegra_dc *dc) | |||
| 2160 | struct device_link *link; | 2160 | struct device_link *link; |
| 2161 | struct device *partner; | 2161 | struct device *partner; |
| 2162 | 2162 | ||
| 2163 | partner = driver_find_device(dc->dev->driver, NULL, 0, | 2163 | partner = driver_find_device(dc->dev->driver, NULL, NULL, |
| 2164 | tegra_dc_match_by_pipe); | 2164 | tegra_dc_match_by_pipe); |
| 2165 | if (!partner) | 2165 | if (!partner) |
| 2166 | return -EPROBE_DEFER; | 2166 | return -EPROBE_DEFER; |
diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index 50e071444a5c..8699bb969e7e 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c | |||
| @@ -417,13 +417,24 @@ __hv_pkt_iter_next(struct vmbus_channel *channel, | |||
| 417 | } | 417 | } |
| 418 | EXPORT_SYMBOL_GPL(__hv_pkt_iter_next); | 418 | EXPORT_SYMBOL_GPL(__hv_pkt_iter_next); |
| 419 | 419 | ||
| 420 | /* How many bytes were read in this iterator cycle */ | ||
| 421 | static u32 hv_pkt_iter_bytes_read(const struct hv_ring_buffer_info *rbi, | ||
| 422 | u32 start_read_index) | ||
| 423 | { | ||
| 424 | if (rbi->priv_read_index >= start_read_index) | ||
| 425 | return rbi->priv_read_index - start_read_index; | ||
| 426 | else | ||
| 427 | return rbi->ring_datasize - start_read_index + | ||
| 428 | rbi->priv_read_index; | ||
| 429 | } | ||
| 430 | |||
| 420 | /* | 431 | /* |
| 421 | * Update host ring buffer after iterating over packets. | 432 | * Update host ring buffer after iterating over packets. |
| 422 | */ | 433 | */ |
| 423 | void hv_pkt_iter_close(struct vmbus_channel *channel) | 434 | void hv_pkt_iter_close(struct vmbus_channel *channel) |
| 424 | { | 435 | { |
| 425 | struct hv_ring_buffer_info *rbi = &channel->inbound; | 436 | struct hv_ring_buffer_info *rbi = &channel->inbound; |
| 426 | u32 orig_write_sz = hv_get_bytes_to_write(rbi); | 437 | u32 curr_write_sz, pending_sz, bytes_read, start_read_index; |
| 427 | 438 | ||
| 428 | /* | 439 | /* |
| 429 | * Make sure all reads are done before we update the read index since | 440 | * Make sure all reads are done before we update the read index since |
| @@ -431,8 +442,12 @@ void hv_pkt_iter_close(struct vmbus_channel *channel) | |||
| 431 | * is updated. | 442 | * is updated. |
| 432 | */ | 443 | */ |
| 433 | virt_rmb(); | 444 | virt_rmb(); |
| 445 | start_read_index = rbi->ring_buffer->read_index; | ||
| 434 | rbi->ring_buffer->read_index = rbi->priv_read_index; | 446 | rbi->ring_buffer->read_index = rbi->priv_read_index; |
| 435 | 447 | ||
| 448 | if (!rbi->ring_buffer->feature_bits.feat_pending_send_sz) | ||
| 449 | return; | ||
| 450 | |||
| 436 | /* | 451 | /* |
| 437 | * Issue a full memory barrier before making the signaling decision. | 452 | * Issue a full memory barrier before making the signaling decision. |
| 438 | * Here is the reason for having this barrier: | 453 | * Here is the reason for having this barrier: |
| @@ -446,26 +461,29 @@ void hv_pkt_iter_close(struct vmbus_channel *channel) | |||
| 446 | */ | 461 | */ |
| 447 | virt_mb(); | 462 | virt_mb(); |
| 448 | 463 | ||
| 449 | /* If host has disabled notifications then skip */ | 464 | pending_sz = READ_ONCE(rbi->ring_buffer->pending_send_sz); |
| 450 | if (rbi->ring_buffer->interrupt_mask) | 465 | if (!pending_sz) |
| 451 | return; | 466 | return; |
| 452 | 467 | ||
| 453 | if (rbi->ring_buffer->feature_bits.feat_pending_send_sz) { | 468 | /* |
| 454 | u32 pending_sz = READ_ONCE(rbi->ring_buffer->pending_send_sz); | 469 | * Ensure the read of write_index in hv_get_bytes_to_write() |
| 470 | * happens after the read of pending_send_sz. | ||
| 471 | */ | ||
| 472 | virt_rmb(); | ||
| 473 | curr_write_sz = hv_get_bytes_to_write(rbi); | ||
| 474 | bytes_read = hv_pkt_iter_bytes_read(rbi, start_read_index); | ||
| 455 | 475 | ||
| 456 | /* | 476 | /* |
| 457 | * If there was space before we began iteration, | 477 | * If there was space before we began iteration, |
| 458 | * then host was not blocked. Also handles case where | 478 | * then host was not blocked. |
| 459 | * pending_sz is zero then host has nothing pending | 479 | */ |
| 460 | * and does not need to be signaled. | ||
| 461 | */ | ||
| 462 | if (orig_write_sz > pending_sz) | ||
| 463 | return; | ||
| 464 | 480 | ||
| 465 | /* If pending write will not fit, don't give false hope. */ | 481 | if (curr_write_sz - bytes_read > pending_sz) |
| 466 | if (hv_get_bytes_to_write(rbi) < pending_sz) | 482 | return; |
| 467 | return; | 483 | |
| 468 | } | 484 | /* If pending write will not fit, don't give false hope. */ |
| 485 | if (curr_write_sz <= pending_sz) | ||
| 486 | return; | ||
| 469 | 487 | ||
| 470 | vmbus_setevent(channel); | 488 | vmbus_setevent(channel); |
| 471 | } | 489 | } |
diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c index b445b3bb0bb1..f273e28c39db 100644 --- a/drivers/i2c/busses/i2c-stm32f7.c +++ b/drivers/i2c/busses/i2c-stm32f7.c | |||
| @@ -888,6 +888,11 @@ static int stm32f7_i2c_probe(struct platform_device *pdev) | |||
| 888 | } | 888 | } |
| 889 | 889 | ||
| 890 | setup = of_device_get_match_data(&pdev->dev); | 890 | setup = of_device_get_match_data(&pdev->dev); |
| 891 | if (!setup) { | ||
| 892 | dev_err(&pdev->dev, "Can't get device data\n"); | ||
| 893 | ret = -ENODEV; | ||
| 894 | goto clk_free; | ||
| 895 | } | ||
| 891 | i2c_dev->setup = *setup; | 896 | i2c_dev->setup = *setup; |
| 892 | 897 | ||
| 893 | ret = device_property_read_u32(i2c_dev->dev, "i2c-scl-rising-time-ns", | 898 | ret = device_property_read_u32(i2c_dev->dev, "i2c-scl-rising-time-ns", |
diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c index 6fe995cf16a6..3e6fd5a8ac5b 100644 --- a/drivers/iio/accel/st_accel_core.c +++ b/drivers/iio/accel/st_accel_core.c | |||
| @@ -920,6 +920,8 @@ static const struct iio_trigger_ops st_accel_trigger_ops = { | |||
| 920 | int st_accel_common_probe(struct iio_dev *indio_dev) | 920 | int st_accel_common_probe(struct iio_dev *indio_dev) |
| 921 | { | 921 | { |
| 922 | struct st_sensor_data *adata = iio_priv(indio_dev); | 922 | struct st_sensor_data *adata = iio_priv(indio_dev); |
| 923 | struct st_sensors_platform_data *pdata = | ||
| 924 | (struct st_sensors_platform_data *)adata->dev->platform_data; | ||
| 923 | int irq = adata->get_irq_data_ready(indio_dev); | 925 | int irq = adata->get_irq_data_ready(indio_dev); |
| 924 | int err; | 926 | int err; |
| 925 | 927 | ||
| @@ -946,7 +948,10 @@ int st_accel_common_probe(struct iio_dev *indio_dev) | |||
| 946 | &adata->sensor_settings->fs.fs_avl[0]; | 948 | &adata->sensor_settings->fs.fs_avl[0]; |
| 947 | adata->odr = adata->sensor_settings->odr.odr_avl[0].hz; | 949 | adata->odr = adata->sensor_settings->odr.odr_avl[0].hz; |
| 948 | 950 | ||
| 949 | err = st_sensors_init_sensor(indio_dev, adata->dev->platform_data); | 951 | if (!pdata) |
| 952 | pdata = (struct st_sensors_platform_data *)&default_accel_pdata; | ||
| 953 | |||
| 954 | err = st_sensors_init_sensor(indio_dev, pdata); | ||
| 950 | if (err < 0) | 955 | if (err < 0) |
| 951 | goto st_accel_power_off; | 956 | goto st_accel_power_off; |
| 952 | 957 | ||
diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c index 29fa7736d80c..ede955d9b2a4 100644 --- a/drivers/iio/adc/meson_saradc.c +++ b/drivers/iio/adc/meson_saradc.c | |||
| @@ -462,8 +462,10 @@ static int meson_sar_adc_lock(struct iio_dev *indio_dev) | |||
| 462 | regmap_read(priv->regmap, MESON_SAR_ADC_DELAY, &val); | 462 | regmap_read(priv->regmap, MESON_SAR_ADC_DELAY, &val); |
| 463 | } while (val & MESON_SAR_ADC_DELAY_BL30_BUSY && timeout--); | 463 | } while (val & MESON_SAR_ADC_DELAY_BL30_BUSY && timeout--); |
| 464 | 464 | ||
| 465 | if (timeout < 0) | 465 | if (timeout < 0) { |
| 466 | mutex_unlock(&indio_dev->mlock); | ||
| 466 | return -ETIMEDOUT; | 467 | return -ETIMEDOUT; |
| 468 | } | ||
| 467 | } | 469 | } |
| 468 | 470 | ||
| 469 | return 0; | 471 | return 0; |
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c index daa026d6a94f..01422d11753c 100644 --- a/drivers/iio/adc/stm32-dfsdm-adc.c +++ b/drivers/iio/adc/stm32-dfsdm-adc.c | |||
| @@ -54,7 +54,6 @@ struct stm32_dfsdm_adc { | |||
| 54 | struct stm32_dfsdm *dfsdm; | 54 | struct stm32_dfsdm *dfsdm; |
| 55 | const struct stm32_dfsdm_dev_data *dev_data; | 55 | const struct stm32_dfsdm_dev_data *dev_data; |
| 56 | unsigned int fl_id; | 56 | unsigned int fl_id; |
| 57 | unsigned int ch_id; | ||
| 58 | 57 | ||
| 59 | /* ADC specific */ | 58 | /* ADC specific */ |
| 60 | unsigned int oversamp; | 59 | unsigned int oversamp; |
| @@ -384,7 +383,7 @@ static ssize_t dfsdm_adc_audio_set_spiclk(struct iio_dev *indio_dev, | |||
| 384 | { | 383 | { |
| 385 | struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); | 384 | struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); |
| 386 | struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id]; | 385 | struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id]; |
| 387 | struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[adc->ch_id]; | 386 | struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[chan->channel]; |
| 388 | unsigned int sample_freq = adc->sample_freq; | 387 | unsigned int sample_freq = adc->sample_freq; |
| 389 | unsigned int spi_freq; | 388 | unsigned int spi_freq; |
| 390 | int ret; | 389 | int ret; |
| @@ -419,18 +418,20 @@ static ssize_t dfsdm_adc_audio_set_spiclk(struct iio_dev *indio_dev, | |||
| 419 | return len; | 418 | return len; |
| 420 | } | 419 | } |
| 421 | 420 | ||
| 422 | static int stm32_dfsdm_start_conv(struct stm32_dfsdm_adc *adc, bool dma) | 421 | static int stm32_dfsdm_start_conv(struct stm32_dfsdm_adc *adc, |
| 422 | const struct iio_chan_spec *chan, | ||
| 423 | bool dma) | ||
| 423 | { | 424 | { |
| 424 | struct regmap *regmap = adc->dfsdm->regmap; | 425 | struct regmap *regmap = adc->dfsdm->regmap; |
| 425 | int ret; | 426 | int ret; |
| 426 | unsigned int dma_en = 0, cont_en = 0; | 427 | unsigned int dma_en = 0, cont_en = 0; |
| 427 | 428 | ||
| 428 | ret = stm32_dfsdm_start_channel(adc->dfsdm, adc->ch_id); | 429 | ret = stm32_dfsdm_start_channel(adc->dfsdm, chan->channel); |
| 429 | if (ret < 0) | 430 | if (ret < 0) |
| 430 | return ret; | 431 | return ret; |
| 431 | 432 | ||
| 432 | ret = stm32_dfsdm_filter_configure(adc->dfsdm, adc->fl_id, | 433 | ret = stm32_dfsdm_filter_configure(adc->dfsdm, adc->fl_id, |
| 433 | adc->ch_id); | 434 | chan->channel); |
| 434 | if (ret < 0) | 435 | if (ret < 0) |
| 435 | goto stop_channels; | 436 | goto stop_channels; |
| 436 | 437 | ||
| @@ -464,12 +465,13 @@ stop_channels: | |||
| 464 | 465 | ||
| 465 | regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), | 466 | regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), |
| 466 | DFSDM_CR1_RCONT_MASK, 0); | 467 | DFSDM_CR1_RCONT_MASK, 0); |
| 467 | stm32_dfsdm_stop_channel(adc->dfsdm, adc->fl_id); | 468 | stm32_dfsdm_stop_channel(adc->dfsdm, chan->channel); |
| 468 | 469 | ||
| 469 | return ret; | 470 | return ret; |
| 470 | } | 471 | } |
| 471 | 472 | ||
| 472 | static void stm32_dfsdm_stop_conv(struct stm32_dfsdm_adc *adc) | 473 | static void stm32_dfsdm_stop_conv(struct stm32_dfsdm_adc *adc, |
| 474 | const struct iio_chan_spec *chan) | ||
| 473 | { | 475 | { |
| 474 | struct regmap *regmap = adc->dfsdm->regmap; | 476 | struct regmap *regmap = adc->dfsdm->regmap; |
| 475 | 477 | ||
| @@ -482,7 +484,7 @@ static void stm32_dfsdm_stop_conv(struct stm32_dfsdm_adc *adc) | |||
| 482 | regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), | 484 | regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), |
| 483 | DFSDM_CR1_RCONT_MASK, 0); | 485 | DFSDM_CR1_RCONT_MASK, 0); |
| 484 | 486 | ||
| 485 | stm32_dfsdm_stop_channel(adc->dfsdm, adc->ch_id); | 487 | stm32_dfsdm_stop_channel(adc->dfsdm, chan->channel); |
| 486 | } | 488 | } |
| 487 | 489 | ||
| 488 | static int stm32_dfsdm_set_watermark(struct iio_dev *indio_dev, | 490 | static int stm32_dfsdm_set_watermark(struct iio_dev *indio_dev, |
| @@ -609,6 +611,7 @@ static int stm32_dfsdm_adc_dma_start(struct iio_dev *indio_dev) | |||
| 609 | static int stm32_dfsdm_postenable(struct iio_dev *indio_dev) | 611 | static int stm32_dfsdm_postenable(struct iio_dev *indio_dev) |
| 610 | { | 612 | { |
| 611 | struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); | 613 | struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); |
| 614 | const struct iio_chan_spec *chan = &indio_dev->channels[0]; | ||
| 612 | int ret; | 615 | int ret; |
| 613 | 616 | ||
| 614 | /* Reset adc buffer index */ | 617 | /* Reset adc buffer index */ |
| @@ -618,7 +621,7 @@ static int stm32_dfsdm_postenable(struct iio_dev *indio_dev) | |||
| 618 | if (ret < 0) | 621 | if (ret < 0) |
| 619 | return ret; | 622 | return ret; |
| 620 | 623 | ||
| 621 | ret = stm32_dfsdm_start_conv(adc, true); | 624 | ret = stm32_dfsdm_start_conv(adc, chan, true); |
| 622 | if (ret) { | 625 | if (ret) { |
| 623 | dev_err(&indio_dev->dev, "Can't start conversion\n"); | 626 | dev_err(&indio_dev->dev, "Can't start conversion\n"); |
| 624 | goto stop_dfsdm; | 627 | goto stop_dfsdm; |
| @@ -635,7 +638,7 @@ static int stm32_dfsdm_postenable(struct iio_dev *indio_dev) | |||
| 635 | return 0; | 638 | return 0; |
| 636 | 639 | ||
| 637 | err_stop_conv: | 640 | err_stop_conv: |
| 638 | stm32_dfsdm_stop_conv(adc); | 641 | stm32_dfsdm_stop_conv(adc, chan); |
| 639 | stop_dfsdm: | 642 | stop_dfsdm: |
| 640 | stm32_dfsdm_stop_dfsdm(adc->dfsdm); | 643 | stm32_dfsdm_stop_dfsdm(adc->dfsdm); |
| 641 | 644 | ||
| @@ -645,11 +648,12 @@ stop_dfsdm: | |||
| 645 | static int stm32_dfsdm_predisable(struct iio_dev *indio_dev) | 648 | static int stm32_dfsdm_predisable(struct iio_dev *indio_dev) |
| 646 | { | 649 | { |
| 647 | struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); | 650 | struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); |
| 651 | const struct iio_chan_spec *chan = &indio_dev->channels[0]; | ||
| 648 | 652 | ||
| 649 | if (adc->dma_chan) | 653 | if (adc->dma_chan) |
| 650 | dmaengine_terminate_all(adc->dma_chan); | 654 | dmaengine_terminate_all(adc->dma_chan); |
| 651 | 655 | ||
| 652 | stm32_dfsdm_stop_conv(adc); | 656 | stm32_dfsdm_stop_conv(adc, chan); |
| 653 | 657 | ||
| 654 | stm32_dfsdm_stop_dfsdm(adc->dfsdm); | 658 | stm32_dfsdm_stop_dfsdm(adc->dfsdm); |
| 655 | 659 | ||
| @@ -730,7 +734,7 @@ static int stm32_dfsdm_single_conv(struct iio_dev *indio_dev, | |||
| 730 | if (ret < 0) | 734 | if (ret < 0) |
| 731 | goto stop_dfsdm; | 735 | goto stop_dfsdm; |
| 732 | 736 | ||
| 733 | ret = stm32_dfsdm_start_conv(adc, false); | 737 | ret = stm32_dfsdm_start_conv(adc, chan, false); |
| 734 | if (ret < 0) { | 738 | if (ret < 0) { |
| 735 | regmap_update_bits(adc->dfsdm->regmap, DFSDM_CR2(adc->fl_id), | 739 | regmap_update_bits(adc->dfsdm->regmap, DFSDM_CR2(adc->fl_id), |
| 736 | DFSDM_CR2_REOCIE_MASK, DFSDM_CR2_REOCIE(0)); | 740 | DFSDM_CR2_REOCIE_MASK, DFSDM_CR2_REOCIE(0)); |
| @@ -751,7 +755,7 @@ static int stm32_dfsdm_single_conv(struct iio_dev *indio_dev, | |||
| 751 | else | 755 | else |
| 752 | ret = IIO_VAL_INT; | 756 | ret = IIO_VAL_INT; |
| 753 | 757 | ||
| 754 | stm32_dfsdm_stop_conv(adc); | 758 | stm32_dfsdm_stop_conv(adc, chan); |
| 755 | 759 | ||
| 756 | stop_dfsdm: | 760 | stop_dfsdm: |
| 757 | stm32_dfsdm_stop_dfsdm(adc->dfsdm); | 761 | stm32_dfsdm_stop_dfsdm(adc->dfsdm); |
| @@ -765,7 +769,7 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev, | |||
| 765 | { | 769 | { |
| 766 | struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); | 770 | struct stm32_dfsdm_adc *adc = iio_priv(indio_dev); |
| 767 | struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id]; | 771 | struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id]; |
| 768 | struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[adc->ch_id]; | 772 | struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[chan->channel]; |
| 769 | unsigned int spi_freq = adc->spi_freq; | 773 | unsigned int spi_freq = adc->spi_freq; |
| 770 | int ret = -EINVAL; | 774 | int ret = -EINVAL; |
| 771 | 775 | ||
| @@ -972,7 +976,6 @@ static int stm32_dfsdm_adc_chan_init_one(struct iio_dev *indio_dev, | |||
| 972 | } | 976 | } |
| 973 | ch->scan_type.realbits = 24; | 977 | ch->scan_type.realbits = 24; |
| 974 | ch->scan_type.storagebits = 32; | 978 | ch->scan_type.storagebits = 32; |
| 975 | adc->ch_id = ch->channel; | ||
| 976 | 979 | ||
| 977 | return stm32_dfsdm_chan_configure(adc->dfsdm, | 980 | return stm32_dfsdm_chan_configure(adc->dfsdm, |
| 978 | &adc->dfsdm->ch_list[ch->channel]); | 981 | &adc->dfsdm->ch_list[ch->channel]); |
| @@ -1001,7 +1004,7 @@ static int stm32_dfsdm_audio_init(struct iio_dev *indio_dev) | |||
| 1001 | } | 1004 | } |
| 1002 | ch->info_mask_separate = BIT(IIO_CHAN_INFO_SAMP_FREQ); | 1005 | ch->info_mask_separate = BIT(IIO_CHAN_INFO_SAMP_FREQ); |
| 1003 | 1006 | ||
| 1004 | d_ch = &adc->dfsdm->ch_list[adc->ch_id]; | 1007 | d_ch = &adc->dfsdm->ch_list[ch->channel]; |
| 1005 | if (d_ch->src != DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL) | 1008 | if (d_ch->src != DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL) |
| 1006 | adc->spi_freq = adc->dfsdm->spi_master_freq; | 1009 | adc->spi_freq = adc->dfsdm->spi_master_freq; |
| 1007 | 1010 | ||
| @@ -1042,8 +1045,8 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev) | |||
| 1042 | return -ENOMEM; | 1045 | return -ENOMEM; |
| 1043 | 1046 | ||
| 1044 | for (chan_idx = 0; chan_idx < num_ch; chan_idx++) { | 1047 | for (chan_idx = 0; chan_idx < num_ch; chan_idx++) { |
| 1045 | ch->scan_index = chan_idx; | 1048 | ch[chan_idx].scan_index = chan_idx; |
| 1046 | ret = stm32_dfsdm_adc_chan_init_one(indio_dev, ch); | 1049 | ret = stm32_dfsdm_adc_chan_init_one(indio_dev, &ch[chan_idx]); |
| 1047 | if (ret < 0) { | 1050 | if (ret < 0) { |
| 1048 | dev_err(&indio_dev->dev, "Channels init failed\n"); | 1051 | dev_err(&indio_dev->dev, "Channels init failed\n"); |
| 1049 | return ret; | 1052 | return ret; |
diff --git a/drivers/iio/adc/stm32-dfsdm-core.c b/drivers/iio/adc/stm32-dfsdm-core.c index 6290332cfd3f..e50efdcc41ff 100644 --- a/drivers/iio/adc/stm32-dfsdm-core.c +++ b/drivers/iio/adc/stm32-dfsdm-core.c | |||
| @@ -83,7 +83,7 @@ int stm32_dfsdm_start_dfsdm(struct stm32_dfsdm *dfsdm) | |||
| 83 | { | 83 | { |
| 84 | struct dfsdm_priv *priv = container_of(dfsdm, struct dfsdm_priv, dfsdm); | 84 | struct dfsdm_priv *priv = container_of(dfsdm, struct dfsdm_priv, dfsdm); |
| 85 | struct device *dev = &priv->pdev->dev; | 85 | struct device *dev = &priv->pdev->dev; |
| 86 | unsigned int clk_div = priv->spi_clk_out_div; | 86 | unsigned int clk_div = priv->spi_clk_out_div, clk_src; |
| 87 | int ret; | 87 | int ret; |
| 88 | 88 | ||
| 89 | if (atomic_inc_return(&priv->n_active_ch) == 1) { | 89 | if (atomic_inc_return(&priv->n_active_ch) == 1) { |
| @@ -100,6 +100,14 @@ int stm32_dfsdm_start_dfsdm(struct stm32_dfsdm *dfsdm) | |||
| 100 | } | 100 | } |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | /* select clock source, e.g. 0 for "dfsdm" or 1 for "audio" */ | ||
| 104 | clk_src = priv->aclk ? 1 : 0; | ||
| 105 | ret = regmap_update_bits(dfsdm->regmap, DFSDM_CHCFGR1(0), | ||
| 106 | DFSDM_CHCFGR1_CKOUTSRC_MASK, | ||
| 107 | DFSDM_CHCFGR1_CKOUTSRC(clk_src)); | ||
| 108 | if (ret < 0) | ||
| 109 | goto disable_aclk; | ||
| 110 | |||
| 103 | /* Output the SPI CLKOUT (if clk_div == 0 clock if OFF) */ | 111 | /* Output the SPI CLKOUT (if clk_div == 0 clock if OFF) */ |
| 104 | ret = regmap_update_bits(dfsdm->regmap, DFSDM_CHCFGR1(0), | 112 | ret = regmap_update_bits(dfsdm->regmap, DFSDM_CHCFGR1(0), |
| 105 | DFSDM_CHCFGR1_CKOUTDIV_MASK, | 113 | DFSDM_CHCFGR1_CKOUTDIV_MASK, |
| @@ -274,7 +282,7 @@ static int stm32_dfsdm_probe(struct platform_device *pdev) | |||
| 274 | 282 | ||
| 275 | dfsdm->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "dfsdm", | 283 | dfsdm->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "dfsdm", |
| 276 | dfsdm->base, | 284 | dfsdm->base, |
| 277 | &stm32h7_dfsdm_regmap_cfg); | 285 | dev_data->regmap_cfg); |
| 278 | if (IS_ERR(dfsdm->regmap)) { | 286 | if (IS_ERR(dfsdm->regmap)) { |
| 279 | ret = PTR_ERR(dfsdm->regmap); | 287 | ret = PTR_ERR(dfsdm->regmap); |
| 280 | dev_err(&pdev->dev, "%s: Failed to allocate regmap: %d\n", | 288 | dev_err(&pdev->dev, "%s: Failed to allocate regmap: %d\n", |
diff --git a/drivers/iio/chemical/ccs811.c b/drivers/iio/chemical/ccs811.c index fbe2431f5b81..1ea9f5513b02 100644 --- a/drivers/iio/chemical/ccs811.c +++ b/drivers/iio/chemical/ccs811.c | |||
| @@ -133,6 +133,9 @@ static int ccs811_start_sensor_application(struct i2c_client *client) | |||
| 133 | if (ret < 0) | 133 | if (ret < 0) |
| 134 | return ret; | 134 | return ret; |
| 135 | 135 | ||
| 136 | if ((ret & CCS811_STATUS_FW_MODE_APPLICATION)) | ||
| 137 | return 0; | ||
| 138 | |||
| 136 | if ((ret & CCS811_STATUS_APP_VALID_MASK) != | 139 | if ((ret & CCS811_STATUS_APP_VALID_MASK) != |
| 137 | CCS811_STATUS_APP_VALID_LOADED) | 140 | CCS811_STATUS_APP_VALID_LOADED) |
| 138 | return -EIO; | 141 | return -EIO; |
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c index 349e5c713c03..4ddb6cf7d401 100644 --- a/drivers/iio/pressure/st_pressure_core.c +++ b/drivers/iio/pressure/st_pressure_core.c | |||
| @@ -640,7 +640,7 @@ int st_press_common_probe(struct iio_dev *indio_dev) | |||
| 640 | press_data->sensor_settings->drdy_irq.int2.addr)) | 640 | press_data->sensor_settings->drdy_irq.int2.addr)) |
| 641 | pdata = (struct st_sensors_platform_data *)&default_press_pdata; | 641 | pdata = (struct st_sensors_platform_data *)&default_press_pdata; |
| 642 | 642 | ||
| 643 | err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data); | 643 | err = st_sensors_init_sensor(indio_dev, pdata); |
| 644 | if (err < 0) | 644 | if (err < 0) |
| 645 | goto st_press_power_off; | 645 | goto st_press_power_off; |
| 646 | 646 | ||
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c index 9183d148d644..cb1d2ab13c66 100644 --- a/drivers/infiniband/core/addr.c +++ b/drivers/infiniband/core/addr.c | |||
| @@ -207,6 +207,22 @@ int rdma_addr_size(struct sockaddr *addr) | |||
| 207 | } | 207 | } |
| 208 | EXPORT_SYMBOL(rdma_addr_size); | 208 | EXPORT_SYMBOL(rdma_addr_size); |
| 209 | 209 | ||
| 210 | int rdma_addr_size_in6(struct sockaddr_in6 *addr) | ||
| 211 | { | ||
| 212 | int ret = rdma_addr_size((struct sockaddr *) addr); | ||
| 213 | |||
| 214 | return ret <= sizeof(*addr) ? ret : 0; | ||
| 215 | } | ||
| 216 | EXPORT_SYMBOL(rdma_addr_size_in6); | ||
| 217 | |||
| 218 | int rdma_addr_size_kss(struct __kernel_sockaddr_storage *addr) | ||
| 219 | { | ||
| 220 | int ret = rdma_addr_size((struct sockaddr *) addr); | ||
| 221 | |||
| 222 | return ret <= sizeof(*addr) ? ret : 0; | ||
| 223 | } | ||
| 224 | EXPORT_SYMBOL(rdma_addr_size_kss); | ||
| 225 | |||
| 210 | static struct rdma_addr_client self; | 226 | static struct rdma_addr_client self; |
| 211 | 227 | ||
| 212 | void rdma_addr_register_client(struct rdma_addr_client *client) | 228 | void rdma_addr_register_client(struct rdma_addr_client *client) |
| @@ -586,6 +602,15 @@ static void process_one_req(struct work_struct *_work) | |||
| 586 | list_del(&req->list); | 602 | list_del(&req->list); |
| 587 | mutex_unlock(&lock); | 603 | mutex_unlock(&lock); |
| 588 | 604 | ||
| 605 | /* | ||
| 606 | * Although the work will normally have been canceled by the | ||
| 607 | * workqueue, it can still be requeued as long as it is on the | ||
| 608 | * req_list, so it could have been requeued before we grabbed &lock. | ||
| 609 | * We need to cancel it after it is removed from req_list to really be | ||
| 610 | * sure it is safe to free. | ||
| 611 | */ | ||
| 612 | cancel_delayed_work(&req->work); | ||
| 613 | |||
| 589 | req->callback(req->status, (struct sockaddr *)&req->src_addr, | 614 | req->callback(req->status, (struct sockaddr *)&req->src_addr, |
| 590 | req->addr, req->context); | 615 | req->addr, req->context); |
| 591 | put_client(req->client); | 616 | put_client(req->client); |
diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c index bb065c9449be..b7459cf524e4 100644 --- a/drivers/infiniband/core/device.c +++ b/drivers/infiniband/core/device.c | |||
| @@ -290,6 +290,7 @@ void ib_dealloc_device(struct ib_device *device) | |||
| 290 | { | 290 | { |
| 291 | WARN_ON(device->reg_state != IB_DEV_UNREGISTERED && | 291 | WARN_ON(device->reg_state != IB_DEV_UNREGISTERED && |
| 292 | device->reg_state != IB_DEV_UNINITIALIZED); | 292 | device->reg_state != IB_DEV_UNINITIALIZED); |
| 293 | rdma_restrack_clean(&device->res); | ||
| 293 | put_device(&device->dev); | 294 | put_device(&device->dev); |
| 294 | } | 295 | } |
| 295 | EXPORT_SYMBOL(ib_dealloc_device); | 296 | EXPORT_SYMBOL(ib_dealloc_device); |
| @@ -600,8 +601,6 @@ void ib_unregister_device(struct ib_device *device) | |||
| 600 | } | 601 | } |
| 601 | up_read(&lists_rwsem); | 602 | up_read(&lists_rwsem); |
| 602 | 603 | ||
| 603 | rdma_restrack_clean(&device->res); | ||
| 604 | |||
| 605 | ib_device_unregister_rdmacg(device); | 604 | ib_device_unregister_rdmacg(device); |
| 606 | ib_device_unregister_sysfs(device); | 605 | ib_device_unregister_sysfs(device); |
| 607 | 606 | ||
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c index e5a1e7d81326..d933336d7e01 100644 --- a/drivers/infiniband/core/ucma.c +++ b/drivers/infiniband/core/ucma.c | |||
| @@ -632,6 +632,9 @@ static ssize_t ucma_bind_ip(struct ucma_file *file, const char __user *inbuf, | |||
| 632 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) | 632 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) |
| 633 | return -EFAULT; | 633 | return -EFAULT; |
| 634 | 634 | ||
| 635 | if (!rdma_addr_size_in6(&cmd.addr)) | ||
| 636 | return -EINVAL; | ||
| 637 | |||
| 635 | ctx = ucma_get_ctx(file, cmd.id); | 638 | ctx = ucma_get_ctx(file, cmd.id); |
| 636 | if (IS_ERR(ctx)) | 639 | if (IS_ERR(ctx)) |
| 637 | return PTR_ERR(ctx); | 640 | return PTR_ERR(ctx); |
| @@ -645,22 +648,21 @@ static ssize_t ucma_bind(struct ucma_file *file, const char __user *inbuf, | |||
| 645 | int in_len, int out_len) | 648 | int in_len, int out_len) |
| 646 | { | 649 | { |
| 647 | struct rdma_ucm_bind cmd; | 650 | struct rdma_ucm_bind cmd; |
| 648 | struct sockaddr *addr; | ||
| 649 | struct ucma_context *ctx; | 651 | struct ucma_context *ctx; |
| 650 | int ret; | 652 | int ret; |
| 651 | 653 | ||
| 652 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) | 654 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) |
| 653 | return -EFAULT; | 655 | return -EFAULT; |
| 654 | 656 | ||
| 655 | addr = (struct sockaddr *) &cmd.addr; | 657 | if (cmd.reserved || !cmd.addr_size || |
| 656 | if (cmd.reserved || !cmd.addr_size || (cmd.addr_size != rdma_addr_size(addr))) | 658 | cmd.addr_size != rdma_addr_size_kss(&cmd.addr)) |
| 657 | return -EINVAL; | 659 | return -EINVAL; |
| 658 | 660 | ||
| 659 | ctx = ucma_get_ctx(file, cmd.id); | 661 | ctx = ucma_get_ctx(file, cmd.id); |
| 660 | if (IS_ERR(ctx)) | 662 | if (IS_ERR(ctx)) |
| 661 | return PTR_ERR(ctx); | 663 | return PTR_ERR(ctx); |
| 662 | 664 | ||
| 663 | ret = rdma_bind_addr(ctx->cm_id, addr); | 665 | ret = rdma_bind_addr(ctx->cm_id, (struct sockaddr *) &cmd.addr); |
| 664 | ucma_put_ctx(ctx); | 666 | ucma_put_ctx(ctx); |
| 665 | return ret; | 667 | return ret; |
| 666 | } | 668 | } |
| @@ -670,23 +672,22 @@ static ssize_t ucma_resolve_ip(struct ucma_file *file, | |||
| 670 | int in_len, int out_len) | 672 | int in_len, int out_len) |
| 671 | { | 673 | { |
| 672 | struct rdma_ucm_resolve_ip cmd; | 674 | struct rdma_ucm_resolve_ip cmd; |
| 673 | struct sockaddr *src, *dst; | ||
| 674 | struct ucma_context *ctx; | 675 | struct ucma_context *ctx; |
| 675 | int ret; | 676 | int ret; |
| 676 | 677 | ||
| 677 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) | 678 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) |
| 678 | return -EFAULT; | 679 | return -EFAULT; |
| 679 | 680 | ||
| 680 | src = (struct sockaddr *) &cmd.src_addr; | 681 | if (!rdma_addr_size_in6(&cmd.src_addr) || |
| 681 | dst = (struct sockaddr *) &cmd.dst_addr; | 682 | !rdma_addr_size_in6(&cmd.dst_addr)) |
| 682 | if (!rdma_addr_size(src) || !rdma_addr_size(dst)) | ||
| 683 | return -EINVAL; | 683 | return -EINVAL; |
| 684 | 684 | ||
| 685 | ctx = ucma_get_ctx(file, cmd.id); | 685 | ctx = ucma_get_ctx(file, cmd.id); |
| 686 | if (IS_ERR(ctx)) | 686 | if (IS_ERR(ctx)) |
| 687 | return PTR_ERR(ctx); | 687 | return PTR_ERR(ctx); |
| 688 | 688 | ||
| 689 | ret = rdma_resolve_addr(ctx->cm_id, src, dst, cmd.timeout_ms); | 689 | ret = rdma_resolve_addr(ctx->cm_id, (struct sockaddr *) &cmd.src_addr, |
| 690 | (struct sockaddr *) &cmd.dst_addr, cmd.timeout_ms); | ||
| 690 | ucma_put_ctx(ctx); | 691 | ucma_put_ctx(ctx); |
| 691 | return ret; | 692 | return ret; |
| 692 | } | 693 | } |
| @@ -696,24 +697,23 @@ static ssize_t ucma_resolve_addr(struct ucma_file *file, | |||
| 696 | int in_len, int out_len) | 697 | int in_len, int out_len) |
| 697 | { | 698 | { |
| 698 | struct rdma_ucm_resolve_addr cmd; | 699 | struct rdma_ucm_resolve_addr cmd; |
| 699 | struct sockaddr *src, *dst; | ||
| 700 | struct ucma_context *ctx; | 700 | struct ucma_context *ctx; |
| 701 | int ret; | 701 | int ret; |
| 702 | 702 | ||
| 703 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) | 703 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) |
| 704 | return -EFAULT; | 704 | return -EFAULT; |
| 705 | 705 | ||
| 706 | src = (struct sockaddr *) &cmd.src_addr; | 706 | if (cmd.reserved || |
| 707 | dst = (struct sockaddr *) &cmd.dst_addr; | 707 | (cmd.src_size && (cmd.src_size != rdma_addr_size_kss(&cmd.src_addr))) || |
| 708 | if (cmd.reserved || (cmd.src_size && (cmd.src_size != rdma_addr_size(src))) || | 708 | !cmd.dst_size || (cmd.dst_size != rdma_addr_size_kss(&cmd.dst_addr))) |
| 709 | !cmd.dst_size || (cmd.dst_size != rdma_addr_size(dst))) | ||
| 710 | return -EINVAL; | 709 | return -EINVAL; |
| 711 | 710 | ||
| 712 | ctx = ucma_get_ctx(file, cmd.id); | 711 | ctx = ucma_get_ctx(file, cmd.id); |
| 713 | if (IS_ERR(ctx)) | 712 | if (IS_ERR(ctx)) |
| 714 | return PTR_ERR(ctx); | 713 | return PTR_ERR(ctx); |
| 715 | 714 | ||
| 716 | ret = rdma_resolve_addr(ctx->cm_id, src, dst, cmd.timeout_ms); | 715 | ret = rdma_resolve_addr(ctx->cm_id, (struct sockaddr *) &cmd.src_addr, |
| 716 | (struct sockaddr *) &cmd.dst_addr, cmd.timeout_ms); | ||
| 717 | ucma_put_ctx(ctx); | 717 | ucma_put_ctx(ctx); |
| 718 | return ret; | 718 | return ret; |
| 719 | } | 719 | } |
| @@ -1166,6 +1166,11 @@ static ssize_t ucma_init_qp_attr(struct ucma_file *file, | |||
| 1166 | if (IS_ERR(ctx)) | 1166 | if (IS_ERR(ctx)) |
| 1167 | return PTR_ERR(ctx); | 1167 | return PTR_ERR(ctx); |
| 1168 | 1168 | ||
| 1169 | if (!ctx->cm_id->device) { | ||
| 1170 | ret = -EINVAL; | ||
| 1171 | goto out; | ||
| 1172 | } | ||
| 1173 | |||
| 1169 | resp.qp_attr_mask = 0; | 1174 | resp.qp_attr_mask = 0; |
| 1170 | memset(&qp_attr, 0, sizeof qp_attr); | 1175 | memset(&qp_attr, 0, sizeof qp_attr); |
| 1171 | qp_attr.qp_state = cmd.qp_state; | 1176 | qp_attr.qp_state = cmd.qp_state; |
| @@ -1307,7 +1312,7 @@ static ssize_t ucma_set_option(struct ucma_file *file, const char __user *inbuf, | |||
| 1307 | if (IS_ERR(ctx)) | 1312 | if (IS_ERR(ctx)) |
| 1308 | return PTR_ERR(ctx); | 1313 | return PTR_ERR(ctx); |
| 1309 | 1314 | ||
| 1310 | if (unlikely(cmd.optval > KMALLOC_MAX_SIZE)) | 1315 | if (unlikely(cmd.optlen > KMALLOC_MAX_SIZE)) |
| 1311 | return -EINVAL; | 1316 | return -EINVAL; |
| 1312 | 1317 | ||
| 1313 | optval = memdup_user((void __user *) (unsigned long) cmd.optval, | 1318 | optval = memdup_user((void __user *) (unsigned long) cmd.optval, |
| @@ -1331,7 +1336,7 @@ static ssize_t ucma_notify(struct ucma_file *file, const char __user *inbuf, | |||
| 1331 | { | 1336 | { |
| 1332 | struct rdma_ucm_notify cmd; | 1337 | struct rdma_ucm_notify cmd; |
| 1333 | struct ucma_context *ctx; | 1338 | struct ucma_context *ctx; |
| 1334 | int ret; | 1339 | int ret = -EINVAL; |
| 1335 | 1340 | ||
| 1336 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) | 1341 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) |
| 1337 | return -EFAULT; | 1342 | return -EFAULT; |
| @@ -1340,7 +1345,9 @@ static ssize_t ucma_notify(struct ucma_file *file, const char __user *inbuf, | |||
| 1340 | if (IS_ERR(ctx)) | 1345 | if (IS_ERR(ctx)) |
| 1341 | return PTR_ERR(ctx); | 1346 | return PTR_ERR(ctx); |
| 1342 | 1347 | ||
| 1343 | ret = rdma_notify(ctx->cm_id, (enum ib_event_type) cmd.event); | 1348 | if (ctx->cm_id->device) |
| 1349 | ret = rdma_notify(ctx->cm_id, (enum ib_event_type)cmd.event); | ||
| 1350 | |||
| 1344 | ucma_put_ctx(ctx); | 1351 | ucma_put_ctx(ctx); |
| 1345 | return ret; | 1352 | return ret; |
| 1346 | } | 1353 | } |
| @@ -1426,7 +1433,7 @@ static ssize_t ucma_join_ip_multicast(struct ucma_file *file, | |||
| 1426 | join_cmd.response = cmd.response; | 1433 | join_cmd.response = cmd.response; |
| 1427 | join_cmd.uid = cmd.uid; | 1434 | join_cmd.uid = cmd.uid; |
| 1428 | join_cmd.id = cmd.id; | 1435 | join_cmd.id = cmd.id; |
| 1429 | join_cmd.addr_size = rdma_addr_size((struct sockaddr *) &cmd.addr); | 1436 | join_cmd.addr_size = rdma_addr_size_in6(&cmd.addr); |
| 1430 | if (!join_cmd.addr_size) | 1437 | if (!join_cmd.addr_size) |
| 1431 | return -EINVAL; | 1438 | return -EINVAL; |
| 1432 | 1439 | ||
| @@ -1445,7 +1452,7 @@ static ssize_t ucma_join_multicast(struct ucma_file *file, | |||
| 1445 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) | 1452 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) |
| 1446 | return -EFAULT; | 1453 | return -EFAULT; |
| 1447 | 1454 | ||
| 1448 | if (!rdma_addr_size((struct sockaddr *)&cmd.addr)) | 1455 | if (!rdma_addr_size_kss(&cmd.addr)) |
| 1449 | return -EINVAL; | 1456 | return -EINVAL; |
| 1450 | 1457 | ||
| 1451 | return ucma_process_join(file, &cmd, out_len); | 1458 | return ucma_process_join(file, &cmd, out_len); |
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index db2ff352d75f..ec638778661c 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c | |||
| @@ -4383,7 +4383,7 @@ err_dma_alloc_buf: | |||
| 4383 | eq->l0_dma = 0; | 4383 | eq->l0_dma = 0; |
| 4384 | 4384 | ||
| 4385 | if (mhop_num == 1) | 4385 | if (mhop_num == 1) |
| 4386 | for (i -= i; i >= 0; i--) | 4386 | for (i -= 1; i >= 0; i--) |
| 4387 | dma_free_coherent(dev, buf_chk_sz, eq->buf[i], | 4387 | dma_free_coherent(dev, buf_chk_sz, eq->buf[i], |
| 4388 | eq->buf_dma[i]); | 4388 | eq->buf_dma[i]); |
| 4389 | else if (mhop_num == 2) { | 4389 | else if (mhop_num == 2) { |
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 390e4375647e..071fd9a7b919 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
| @@ -3482,9 +3482,12 @@ static void destroy_umrc_res(struct mlx5_ib_dev *dev) | |||
| 3482 | if (err) | 3482 | if (err) |
| 3483 | mlx5_ib_warn(dev, "mr cache cleanup failed\n"); | 3483 | mlx5_ib_warn(dev, "mr cache cleanup failed\n"); |
| 3484 | 3484 | ||
| 3485 | mlx5_ib_destroy_qp(dev->umrc.qp); | 3485 | if (dev->umrc.qp) |
| 3486 | ib_free_cq(dev->umrc.cq); | 3486 | mlx5_ib_destroy_qp(dev->umrc.qp); |
| 3487 | ib_dealloc_pd(dev->umrc.pd); | 3487 | if (dev->umrc.cq) |
| 3488 | ib_free_cq(dev->umrc.cq); | ||
| 3489 | if (dev->umrc.pd) | ||
| 3490 | ib_dealloc_pd(dev->umrc.pd); | ||
| 3488 | } | 3491 | } |
| 3489 | 3492 | ||
| 3490 | enum { | 3493 | enum { |
| @@ -3586,12 +3589,15 @@ static int create_umr_res(struct mlx5_ib_dev *dev) | |||
| 3586 | 3589 | ||
| 3587 | error_4: | 3590 | error_4: |
| 3588 | mlx5_ib_destroy_qp(qp); | 3591 | mlx5_ib_destroy_qp(qp); |
| 3592 | dev->umrc.qp = NULL; | ||
| 3589 | 3593 | ||
| 3590 | error_3: | 3594 | error_3: |
| 3591 | ib_free_cq(cq); | 3595 | ib_free_cq(cq); |
| 3596 | dev->umrc.cq = NULL; | ||
| 3592 | 3597 | ||
| 3593 | error_2: | 3598 | error_2: |
| 3594 | ib_dealloc_pd(pd); | 3599 | ib_dealloc_pd(pd); |
| 3600 | dev->umrc.pd = NULL; | ||
| 3595 | 3601 | ||
| 3596 | error_0: | 3602 | error_0: |
| 3597 | kfree(attr); | 3603 | kfree(attr); |
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c index 95a36e9ea552..654bc31bc428 100644 --- a/drivers/infiniband/hw/mlx5/mr.c +++ b/drivers/infiniband/hw/mlx5/mr.c | |||
| @@ -740,6 +740,9 @@ int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev) | |||
| 740 | { | 740 | { |
| 741 | int i; | 741 | int i; |
| 742 | 742 | ||
| 743 | if (!dev->cache.wq) | ||
| 744 | return 0; | ||
| 745 | |||
| 743 | dev->cache.stopped = 1; | 746 | dev->cache.stopped = 1; |
| 744 | flush_workqueue(dev->cache.wq); | 747 | flush_workqueue(dev->cache.wq); |
| 745 | 748 | ||
diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr/main.c index eb32abb0099a..f9a645c869ce 100644 --- a/drivers/infiniband/hw/qedr/main.c +++ b/drivers/infiniband/hw/qedr/main.c | |||
| @@ -833,7 +833,8 @@ static struct qedr_dev *qedr_add(struct qed_dev *cdev, struct pci_dev *pdev, | |||
| 833 | 833 | ||
| 834 | dev->num_cnq = dev->ops->rdma_get_min_cnq_msix(cdev); | 834 | dev->num_cnq = dev->ops->rdma_get_min_cnq_msix(cdev); |
| 835 | if (!dev->num_cnq) { | 835 | if (!dev->num_cnq) { |
| 836 | DP_ERR(dev, "not enough CNQ resources.\n"); | 836 | DP_ERR(dev, "Failed. At least one CNQ is required.\n"); |
| 837 | rc = -ENOMEM; | ||
| 837 | goto init_err; | 838 | goto init_err; |
| 838 | } | 839 | } |
| 839 | 840 | ||
diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c index 7d51ef47667f..f9c3cc71f5c0 100644 --- a/drivers/infiniband/hw/qedr/verbs.c +++ b/drivers/infiniband/hw/qedr/verbs.c | |||
| @@ -1841,14 +1841,15 @@ static void qedr_reset_qp_hwq_info(struct qedr_qp_hwq_info *qph) | |||
| 1841 | 1841 | ||
| 1842 | static int qedr_update_qp_state(struct qedr_dev *dev, | 1842 | static int qedr_update_qp_state(struct qedr_dev *dev, |
| 1843 | struct qedr_qp *qp, | 1843 | struct qedr_qp *qp, |
| 1844 | enum qed_roce_qp_state cur_state, | ||
| 1844 | enum qed_roce_qp_state new_state) | 1845 | enum qed_roce_qp_state new_state) |
| 1845 | { | 1846 | { |
| 1846 | int status = 0; | 1847 | int status = 0; |
| 1847 | 1848 | ||
| 1848 | if (new_state == qp->state) | 1849 | if (new_state == cur_state) |
| 1849 | return 0; | 1850 | return 0; |
| 1850 | 1851 | ||
| 1851 | switch (qp->state) { | 1852 | switch (cur_state) { |
| 1852 | case QED_ROCE_QP_STATE_RESET: | 1853 | case QED_ROCE_QP_STATE_RESET: |
| 1853 | switch (new_state) { | 1854 | switch (new_state) { |
| 1854 | case QED_ROCE_QP_STATE_INIT: | 1855 | case QED_ROCE_QP_STATE_INIT: |
| @@ -1955,6 +1956,7 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
| 1955 | struct qedr_dev *dev = get_qedr_dev(&qp->dev->ibdev); | 1956 | struct qedr_dev *dev = get_qedr_dev(&qp->dev->ibdev); |
| 1956 | const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr); | 1957 | const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr); |
| 1957 | enum ib_qp_state old_qp_state, new_qp_state; | 1958 | enum ib_qp_state old_qp_state, new_qp_state; |
| 1959 | enum qed_roce_qp_state cur_state; | ||
| 1958 | int rc = 0; | 1960 | int rc = 0; |
| 1959 | 1961 | ||
| 1960 | DP_DEBUG(dev, QEDR_MSG_QP, | 1962 | DP_DEBUG(dev, QEDR_MSG_QP, |
| @@ -2086,18 +2088,23 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
| 2086 | SET_FIELD(qp_params.modify_flags, | 2088 | SET_FIELD(qp_params.modify_flags, |
| 2087 | QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1); | 2089 | QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1); |
| 2088 | 2090 | ||
| 2089 | qp_params.ack_timeout = attr->timeout; | 2091 | /* The received timeout value is an exponent used like this: |
| 2090 | if (attr->timeout) { | 2092 | * "12.7.34 LOCAL ACK TIMEOUT |
| 2091 | u32 temp; | 2093 | * Value representing the transport (ACK) timeout for use by |
| 2092 | 2094 | * the remote, expressed as: 4.096 * 2^timeout [usec]" | |
| 2093 | temp = 4096 * (1UL << attr->timeout) / 1000 / 1000; | 2095 | * The FW expects timeout in msec so we need to divide the usec |
| 2094 | /* FW requires [msec] */ | 2096 | * result by 1000. We'll approximate 1000~2^10, and 4.096 ~ 2^2, |
| 2095 | qp_params.ack_timeout = temp; | 2097 | * so we get: 2^2 * 2^timeout / 2^10 = 2^(timeout - 8). |
| 2096 | } else { | 2098 | * The value of zero means infinite so we use a 'max_t' to make |
| 2097 | /* Infinite */ | 2099 | * sure that sub 1 msec values will be configured as 1 msec. |
| 2100 | */ | ||
| 2101 | if (attr->timeout) | ||
| 2102 | qp_params.ack_timeout = | ||
| 2103 | 1 << max_t(int, attr->timeout - 8, 0); | ||
| 2104 | else | ||
| 2098 | qp_params.ack_timeout = 0; | 2105 | qp_params.ack_timeout = 0; |
| 2099 | } | ||
| 2100 | } | 2106 | } |
| 2107 | |||
| 2101 | if (attr_mask & IB_QP_RETRY_CNT) { | 2108 | if (attr_mask & IB_QP_RETRY_CNT) { |
| 2102 | SET_FIELD(qp_params.modify_flags, | 2109 | SET_FIELD(qp_params.modify_flags, |
| 2103 | QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1); | 2110 | QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1); |
| @@ -2170,13 +2177,25 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
| 2170 | qp->dest_qp_num = attr->dest_qp_num; | 2177 | qp->dest_qp_num = attr->dest_qp_num; |
| 2171 | } | 2178 | } |
| 2172 | 2179 | ||
| 2180 | cur_state = qp->state; | ||
| 2181 | |||
| 2182 | /* Update the QP state before the actual ramrod to prevent a race with | ||
| 2183 | * fast path. Modifying the QP state to error will cause the device to | ||
| 2184 | * flush the CQEs and while polling the flushed CQEs will considered as | ||
| 2185 | * a potential issue if the QP isn't in error state. | ||
| 2186 | */ | ||
| 2187 | if ((attr_mask & IB_QP_STATE) && qp->qp_type != IB_QPT_GSI && | ||
| 2188 | !udata && qp_params.new_state == QED_ROCE_QP_STATE_ERR) | ||
| 2189 | qp->state = QED_ROCE_QP_STATE_ERR; | ||
| 2190 | |||
| 2173 | if (qp->qp_type != IB_QPT_GSI) | 2191 | if (qp->qp_type != IB_QPT_GSI) |
| 2174 | rc = dev->ops->rdma_modify_qp(dev->rdma_ctx, | 2192 | rc = dev->ops->rdma_modify_qp(dev->rdma_ctx, |
| 2175 | qp->qed_qp, &qp_params); | 2193 | qp->qed_qp, &qp_params); |
| 2176 | 2194 | ||
| 2177 | if (attr_mask & IB_QP_STATE) { | 2195 | if (attr_mask & IB_QP_STATE) { |
| 2178 | if ((qp->qp_type != IB_QPT_GSI) && (!udata)) | 2196 | if ((qp->qp_type != IB_QPT_GSI) && (!udata)) |
| 2179 | rc = qedr_update_qp_state(dev, qp, qp_params.new_state); | 2197 | rc = qedr_update_qp_state(dev, qp, cur_state, |
| 2198 | qp_params.new_state); | ||
| 2180 | qp->state = qp_params.new_state; | 2199 | qp->state = qp_params.new_state; |
| 2181 | } | 2200 | } |
| 2182 | 2201 | ||
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index a05a560d3cba..a6b7baf31cdd 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
| @@ -887,7 +887,7 @@ static struct pgpath *parse_path(struct dm_arg_set *as, struct path_selector *ps | |||
| 887 | 887 | ||
| 888 | q = bdev_get_queue(p->path.dev->bdev); | 888 | q = bdev_get_queue(p->path.dev->bdev); |
| 889 | attached_handler_name = scsi_dh_attached_handler_name(q, GFP_KERNEL); | 889 | attached_handler_name = scsi_dh_attached_handler_name(q, GFP_KERNEL); |
| 890 | if (attached_handler_name) { | 890 | if (attached_handler_name || m->hw_handler_name) { |
| 891 | INIT_DELAYED_WORK(&p->activate_path, activate_path_work); | 891 | INIT_DELAYED_WORK(&p->activate_path, activate_path_work); |
| 892 | r = setup_scsi_dh(p->path.dev->bdev, m, attached_handler_name, &ti->error); | 892 | r = setup_scsi_dh(p->path.dev->bdev, m, attached_handler_name, &ti->error); |
| 893 | if (r) { | 893 | if (r) { |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 45328d8b2859..353ea0ede091 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
| @@ -466,7 +466,7 @@ static int dm_get_bdev_for_ioctl(struct mapped_device *md, | |||
| 466 | { | 466 | { |
| 467 | struct dm_target *tgt; | 467 | struct dm_target *tgt; |
| 468 | struct dm_table *map; | 468 | struct dm_table *map; |
| 469 | int srcu_idx, r; | 469 | int srcu_idx, r, r2; |
| 470 | 470 | ||
| 471 | retry: | 471 | retry: |
| 472 | r = -ENOTTY; | 472 | r = -ENOTTY; |
| @@ -492,9 +492,11 @@ retry: | |||
| 492 | goto out; | 492 | goto out; |
| 493 | 493 | ||
| 494 | bdgrab(*bdev); | 494 | bdgrab(*bdev); |
| 495 | r = blkdev_get(*bdev, *mode, _dm_claim_ptr); | 495 | r2 = blkdev_get(*bdev, *mode, _dm_claim_ptr); |
| 496 | if (r < 0) | 496 | if (r2 < 0) { |
| 497 | r = r2; | ||
| 497 | goto out; | 498 | goto out; |
| 499 | } | ||
| 498 | 500 | ||
| 499 | dm_put_live_table(md, srcu_idx); | 501 | dm_put_live_table(md, srcu_idx); |
| 500 | return r; | 502 | return r; |
diff --git a/drivers/media/Kconfig b/drivers/media/Kconfig index 372c074bb1b9..86c1a190d946 100644 --- a/drivers/media/Kconfig +++ b/drivers/media/Kconfig | |||
| @@ -151,7 +151,7 @@ config DVB_MMAP | |||
| 151 | select VIDEOBUF2_VMALLOC | 151 | select VIDEOBUF2_VMALLOC |
| 152 | default n | 152 | default n |
| 153 | help | 153 | help |
| 154 | This option enables DVB experimental memory-mapped API, with | 154 | This option enables DVB experimental memory-mapped API, which |
| 155 | reduces the number of context switches to read DVB buffers, as | 155 | reduces the number of context switches to read DVB buffers, as |
| 156 | the buffers can use mmap() syscalls. | 156 | the buffers can use mmap() syscalls. |
| 157 | 157 | ||
diff --git a/drivers/media/platform/tegra-cec/tegra_cec.c b/drivers/media/platform/tegra-cec/tegra_cec.c index 92f93a880015..aba488cd0e64 100644 --- a/drivers/media/platform/tegra-cec/tegra_cec.c +++ b/drivers/media/platform/tegra-cec/tegra_cec.c | |||
| @@ -172,16 +172,13 @@ static irqreturn_t tegra_cec_irq_handler(int irq, void *data) | |||
| 172 | } | 172 | } |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | if (status & (TEGRA_CEC_INT_STAT_RX_REGISTER_OVERRUN | | 175 | if (status & TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED) { |
| 176 | TEGRA_CEC_INT_STAT_RX_BUS_ANOMALY_DETECTED | | ||
| 177 | TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED | | ||
| 178 | TEGRA_CEC_INT_STAT_RX_BUS_ERROR_DETECTED)) { | ||
| 179 | cec_write(cec, TEGRA_CEC_INT_STAT, | 176 | cec_write(cec, TEGRA_CEC_INT_STAT, |
| 180 | (TEGRA_CEC_INT_STAT_RX_REGISTER_OVERRUN | | 177 | TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED); |
| 181 | TEGRA_CEC_INT_STAT_RX_BUS_ANOMALY_DETECTED | | 178 | cec->rx_done = false; |
| 182 | TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED | | 179 | cec->rx_buf_cnt = 0; |
| 183 | TEGRA_CEC_INT_STAT_RX_BUS_ERROR_DETECTED)); | 180 | } |
| 184 | } else if (status & TEGRA_CEC_INT_STAT_RX_REGISTER_FULL) { | 181 | if (status & TEGRA_CEC_INT_STAT_RX_REGISTER_FULL) { |
| 185 | u32 v; | 182 | u32 v; |
| 186 | 183 | ||
| 187 | cec_write(cec, TEGRA_CEC_INT_STAT, | 184 | cec_write(cec, TEGRA_CEC_INT_STAT, |
| @@ -255,7 +252,7 @@ static int tegra_cec_adap_enable(struct cec_adapter *adap, bool enable) | |||
| 255 | TEGRA_CEC_INT_MASK_TX_BUS_ANOMALY_DETECTED | | 252 | TEGRA_CEC_INT_MASK_TX_BUS_ANOMALY_DETECTED | |
| 256 | TEGRA_CEC_INT_MASK_TX_FRAME_TRANSMITTED | | 253 | TEGRA_CEC_INT_MASK_TX_FRAME_TRANSMITTED | |
| 257 | TEGRA_CEC_INT_MASK_RX_REGISTER_FULL | | 254 | TEGRA_CEC_INT_MASK_RX_REGISTER_FULL | |
| 258 | TEGRA_CEC_INT_MASK_RX_REGISTER_OVERRUN); | 255 | TEGRA_CEC_INT_MASK_RX_START_BIT_DETECTED); |
| 259 | 256 | ||
| 260 | cec_write(cec, TEGRA_CEC_HW_CONTROL, TEGRA_CEC_HWCTRL_TX_RX_MODE); | 257 | cec_write(cec, TEGRA_CEC_HW_CONTROL, TEGRA_CEC_HWCTRL_TX_RX_MODE); |
| 261 | return 0; | 258 | return 0; |
diff --git a/drivers/mtd/chips/jedec_probe.c b/drivers/mtd/chips/jedec_probe.c index 7c0b27d132b1..b479bd81120b 100644 --- a/drivers/mtd/chips/jedec_probe.c +++ b/drivers/mtd/chips/jedec_probe.c | |||
| @@ -1889,6 +1889,8 @@ static inline u32 jedec_read_mfr(struct map_info *map, uint32_t base, | |||
| 1889 | do { | 1889 | do { |
| 1890 | uint32_t ofs = cfi_build_cmd_addr(0 + (bank << 8), map, cfi); | 1890 | uint32_t ofs = cfi_build_cmd_addr(0 + (bank << 8), map, cfi); |
| 1891 | mask = (1 << (cfi->device_type * 8)) - 1; | 1891 | mask = (1 << (cfi->device_type * 8)) - 1; |
| 1892 | if (ofs >= map->size) | ||
| 1893 | return 0; | ||
| 1892 | result = map_read(map, base + ofs); | 1894 | result = map_read(map, base + ofs); |
| 1893 | bank++; | 1895 | bank++; |
| 1894 | } while ((result.x[0] & mask) == CFI_MFR_CONTINUATION); | 1896 | } while ((result.x[0] & mask) == CFI_MFR_CONTINUATION); |
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index de8c902059b8..7d80a8bb96fe 100644 --- a/drivers/mtd/mtdchar.c +++ b/drivers/mtd/mtdchar.c | |||
| @@ -479,7 +479,7 @@ static int shrink_ecclayout(struct mtd_info *mtd, | |||
| 479 | for (i = 0; i < MTD_MAX_ECCPOS_ENTRIES;) { | 479 | for (i = 0; i < MTD_MAX_ECCPOS_ENTRIES;) { |
| 480 | u32 eccpos; | 480 | u32 eccpos; |
| 481 | 481 | ||
| 482 | ret = mtd_ooblayout_ecc(mtd, section, &oobregion); | 482 | ret = mtd_ooblayout_ecc(mtd, section++, &oobregion); |
| 483 | if (ret < 0) { | 483 | if (ret < 0) { |
| 484 | if (ret != -ERANGE) | 484 | if (ret != -ERANGE) |
| 485 | return ret; | 485 | return ret; |
| @@ -526,7 +526,7 @@ static int get_oobinfo(struct mtd_info *mtd, struct nand_oobinfo *to) | |||
| 526 | for (i = 0; i < ARRAY_SIZE(to->eccpos);) { | 526 | for (i = 0; i < ARRAY_SIZE(to->eccpos);) { |
| 527 | u32 eccpos; | 527 | u32 eccpos; |
| 528 | 528 | ||
| 529 | ret = mtd_ooblayout_ecc(mtd, section, &oobregion); | 529 | ret = mtd_ooblayout_ecc(mtd, section++, &oobregion); |
| 530 | if (ret < 0) { | 530 | if (ret < 0) { |
| 531 | if (ret != -ERANGE) | 531 | if (ret != -ERANGE) |
| 532 | return ret; | 532 | return ret; |
diff --git a/drivers/mtd/nand/atmel/pmecc.c b/drivers/mtd/nand/atmel/pmecc.c index fcbe4fd6e684..ca0a70389ba9 100644 --- a/drivers/mtd/nand/atmel/pmecc.c +++ b/drivers/mtd/nand/atmel/pmecc.c | |||
| @@ -426,7 +426,7 @@ static int get_strength(struct atmel_pmecc_user *user) | |||
| 426 | 426 | ||
| 427 | static int get_sectorsize(struct atmel_pmecc_user *user) | 427 | static int get_sectorsize(struct atmel_pmecc_user *user) |
| 428 | { | 428 | { |
| 429 | return user->cache.cfg & PMECC_LOOKUP_TABLE_SIZE_1024 ? 1024 : 512; | 429 | return user->cache.cfg & PMECC_CFG_SECTOR1024 ? 1024 : 512; |
| 430 | } | 430 | } |
| 431 | 431 | ||
| 432 | static void atmel_pmecc_gen_syndrome(struct atmel_pmecc_user *user, int sector) | 432 | static void atmel_pmecc_gen_syndrome(struct atmel_pmecc_user *user, int sector) |
diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c index 4872a7ba6503..5a9c2f0020c2 100644 --- a/drivers/mtd/nand/fsl_ifc_nand.c +++ b/drivers/mtd/nand/fsl_ifc_nand.c | |||
| @@ -173,14 +173,9 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob) | |||
| 173 | 173 | ||
| 174 | /* returns nonzero if entire page is blank */ | 174 | /* returns nonzero if entire page is blank */ |
| 175 | static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl, | 175 | static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl, |
| 176 | u32 *eccstat, unsigned int bufnum) | 176 | u32 eccstat, unsigned int bufnum) |
| 177 | { | 177 | { |
| 178 | u32 reg = eccstat[bufnum / 4]; | 178 | return (eccstat >> ((3 - bufnum % 4) * 8)) & 15; |
| 179 | int errors; | ||
| 180 | |||
| 181 | errors = (reg >> ((3 - bufnum % 4) * 8)) & 15; | ||
| 182 | |||
| 183 | return errors; | ||
| 184 | } | 179 | } |
| 185 | 180 | ||
| 186 | /* | 181 | /* |
| @@ -193,7 +188,7 @@ static void fsl_ifc_run_command(struct mtd_info *mtd) | |||
| 193 | struct fsl_ifc_ctrl *ctrl = priv->ctrl; | 188 | struct fsl_ifc_ctrl *ctrl = priv->ctrl; |
| 194 | struct fsl_ifc_nand_ctrl *nctrl = ifc_nand_ctrl; | 189 | struct fsl_ifc_nand_ctrl *nctrl = ifc_nand_ctrl; |
| 195 | struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs; | 190 | struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs; |
| 196 | u32 eccstat[4]; | 191 | u32 eccstat; |
| 197 | int i; | 192 | int i; |
| 198 | 193 | ||
| 199 | /* set the chip select for NAND Transaction */ | 194 | /* set the chip select for NAND Transaction */ |
| @@ -228,19 +223,17 @@ static void fsl_ifc_run_command(struct mtd_info *mtd) | |||
| 228 | if (nctrl->eccread) { | 223 | if (nctrl->eccread) { |
| 229 | int errors; | 224 | int errors; |
| 230 | int bufnum = nctrl->page & priv->bufnum_mask; | 225 | int bufnum = nctrl->page & priv->bufnum_mask; |
| 231 | int sector = bufnum * chip->ecc.steps; | 226 | int sector_start = bufnum * chip->ecc.steps; |
| 232 | int sector_end = sector + chip->ecc.steps - 1; | 227 | int sector_end = sector_start + chip->ecc.steps - 1; |
| 233 | __be32 *eccstat_regs; | 228 | __be32 *eccstat_regs; |
| 234 | 229 | ||
| 235 | if (ctrl->version >= FSL_IFC_VERSION_2_0_0) | 230 | eccstat_regs = ifc->ifc_nand.nand_eccstat; |
| 236 | eccstat_regs = ifc->ifc_nand.v2_nand_eccstat; | 231 | eccstat = ifc_in32(&eccstat_regs[sector_start / 4]); |
| 237 | else | ||
| 238 | eccstat_regs = ifc->ifc_nand.v1_nand_eccstat; | ||
| 239 | 232 | ||
| 240 | for (i = sector / 4; i <= sector_end / 4; i++) | 233 | for (i = sector_start; i <= sector_end; i++) { |
| 241 | eccstat[i] = ifc_in32(&eccstat_regs[i]); | 234 | if (i != sector_start && !(i % 4)) |
| 235 | eccstat = ifc_in32(&eccstat_regs[i / 4]); | ||
| 242 | 236 | ||
| 243 | for (i = sector; i <= sector_end; i++) { | ||
| 244 | errors = check_read_ecc(mtd, ctrl, eccstat, i); | 237 | errors = check_read_ecc(mtd, ctrl, eccstat, i); |
| 245 | 238 | ||
| 246 | if (errors == 15) { | 239 | if (errors == 15) { |
| @@ -626,6 +619,7 @@ static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip) | |||
| 626 | struct fsl_ifc_ctrl *ctrl = priv->ctrl; | 619 | struct fsl_ifc_ctrl *ctrl = priv->ctrl; |
| 627 | struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs; | 620 | struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs; |
| 628 | u32 nand_fsr; | 621 | u32 nand_fsr; |
| 622 | int status; | ||
| 629 | 623 | ||
| 630 | /* Use READ_STATUS command, but wait for the device to be ready */ | 624 | /* Use READ_STATUS command, but wait for the device to be ready */ |
| 631 | ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) | | 625 | ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) | |
| @@ -640,12 +634,12 @@ static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip) | |||
| 640 | fsl_ifc_run_command(mtd); | 634 | fsl_ifc_run_command(mtd); |
| 641 | 635 | ||
| 642 | nand_fsr = ifc_in32(&ifc->ifc_nand.nand_fsr); | 636 | nand_fsr = ifc_in32(&ifc->ifc_nand.nand_fsr); |
| 643 | 637 | status = nand_fsr >> 24; | |
| 644 | /* | 638 | /* |
| 645 | * The chip always seems to report that it is | 639 | * The chip always seems to report that it is |
| 646 | * write-protected, even when it is not. | 640 | * write-protected, even when it is not. |
| 647 | */ | 641 | */ |
| 648 | return nand_fsr | NAND_STATUS_WP; | 642 | return status | NAND_STATUS_WP; |
| 649 | } | 643 | } |
| 650 | 644 | ||
| 651 | /* | 645 | /* |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index c669554d70bb..b7b113018853 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -1528,39 +1528,6 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev, | |||
| 1528 | goto err_close; | 1528 | goto err_close; |
| 1529 | } | 1529 | } |
| 1530 | 1530 | ||
| 1531 | /* If the mode uses primary, then the following is handled by | ||
| 1532 | * bond_change_active_slave(). | ||
| 1533 | */ | ||
| 1534 | if (!bond_uses_primary(bond)) { | ||
| 1535 | /* set promiscuity level to new slave */ | ||
| 1536 | if (bond_dev->flags & IFF_PROMISC) { | ||
| 1537 | res = dev_set_promiscuity(slave_dev, 1); | ||
| 1538 | if (res) | ||
| 1539 | goto err_close; | ||
| 1540 | } | ||
| 1541 | |||
| 1542 | /* set allmulti level to new slave */ | ||
| 1543 | if (bond_dev->flags & IFF_ALLMULTI) { | ||
| 1544 | res = dev_set_allmulti(slave_dev, 1); | ||
| 1545 | if (res) | ||
| 1546 | goto err_close; | ||
| 1547 | } | ||
| 1548 | |||
| 1549 | netif_addr_lock_bh(bond_dev); | ||
| 1550 | |||
| 1551 | dev_mc_sync_multiple(slave_dev, bond_dev); | ||
| 1552 | dev_uc_sync_multiple(slave_dev, bond_dev); | ||
| 1553 | |||
| 1554 | netif_addr_unlock_bh(bond_dev); | ||
| 1555 | } | ||
| 1556 | |||
| 1557 | if (BOND_MODE(bond) == BOND_MODE_8023AD) { | ||
| 1558 | /* add lacpdu mc addr to mc list */ | ||
| 1559 | u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR; | ||
| 1560 | |||
| 1561 | dev_mc_add(slave_dev, lacpdu_multicast); | ||
| 1562 | } | ||
| 1563 | |||
| 1564 | res = vlan_vids_add_by_dev(slave_dev, bond_dev); | 1531 | res = vlan_vids_add_by_dev(slave_dev, bond_dev); |
| 1565 | if (res) { | 1532 | if (res) { |
| 1566 | netdev_err(bond_dev, "Couldn't add bond vlan ids to %s\n", | 1533 | netdev_err(bond_dev, "Couldn't add bond vlan ids to %s\n", |
| @@ -1725,6 +1692,40 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev, | |||
| 1725 | goto err_upper_unlink; | 1692 | goto err_upper_unlink; |
| 1726 | } | 1693 | } |
| 1727 | 1694 | ||
| 1695 | /* If the mode uses primary, then the following is handled by | ||
| 1696 | * bond_change_active_slave(). | ||
| 1697 | */ | ||
| 1698 | if (!bond_uses_primary(bond)) { | ||
| 1699 | /* set promiscuity level to new slave */ | ||
| 1700 | if (bond_dev->flags & IFF_PROMISC) { | ||
| 1701 | res = dev_set_promiscuity(slave_dev, 1); | ||
| 1702 | if (res) | ||
| 1703 | goto err_sysfs_del; | ||
| 1704 | } | ||
| 1705 | |||
| 1706 | /* set allmulti level to new slave */ | ||
| 1707 | if (bond_dev->flags & IFF_ALLMULTI) { | ||
| 1708 | res = dev_set_allmulti(slave_dev, 1); | ||
| 1709 | if (res) { | ||
| 1710 | if (bond_dev->flags & IFF_PROMISC) | ||
| 1711 | dev_set_promiscuity(slave_dev, -1); | ||
| 1712 | goto err_sysfs_del; | ||
| 1713 | } | ||
| 1714 | } | ||
| 1715 | |||
| 1716 | netif_addr_lock_bh(bond_dev); | ||
| 1717 | dev_mc_sync_multiple(slave_dev, bond_dev); | ||
| 1718 | dev_uc_sync_multiple(slave_dev, bond_dev); | ||
| 1719 | netif_addr_unlock_bh(bond_dev); | ||
| 1720 | |||
| 1721 | if (BOND_MODE(bond) == BOND_MODE_8023AD) { | ||
| 1722 | /* add lacpdu mc addr to mc list */ | ||
| 1723 | u8 lacpdu_multicast[ETH_ALEN] = MULTICAST_LACPDU_ADDR; | ||
| 1724 | |||
| 1725 | dev_mc_add(slave_dev, lacpdu_multicast); | ||
| 1726 | } | ||
| 1727 | } | ||
| 1728 | |||
| 1728 | bond->slave_cnt++; | 1729 | bond->slave_cnt++; |
| 1729 | bond_compute_features(bond); | 1730 | bond_compute_features(bond); |
| 1730 | bond_set_carrier(bond); | 1731 | bond_set_carrier(bond); |
| @@ -1748,6 +1749,9 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev, | |||
| 1748 | return 0; | 1749 | return 0; |
| 1749 | 1750 | ||
| 1750 | /* Undo stages on error */ | 1751 | /* Undo stages on error */ |
| 1752 | err_sysfs_del: | ||
| 1753 | bond_sysfs_slave_del(new_slave); | ||
| 1754 | |||
| 1751 | err_upper_unlink: | 1755 | err_upper_unlink: |
| 1752 | bond_upper_dev_unlink(bond, new_slave); | 1756 | bond_upper_dev_unlink(bond, new_slave); |
| 1753 | 1757 | ||
| @@ -1755,9 +1759,6 @@ err_unregister: | |||
| 1755 | netdev_rx_handler_unregister(slave_dev); | 1759 | netdev_rx_handler_unregister(slave_dev); |
| 1756 | 1760 | ||
| 1757 | err_detach: | 1761 | err_detach: |
| 1758 | if (!bond_uses_primary(bond)) | ||
| 1759 | bond_hw_addr_flush(bond_dev, slave_dev); | ||
| 1760 | |||
| 1761 | vlan_vids_del_by_dev(slave_dev, bond_dev); | 1762 | vlan_vids_del_by_dev(slave_dev, bond_dev); |
| 1762 | if (rcu_access_pointer(bond->primary_slave) == new_slave) | 1763 | if (rcu_access_pointer(bond->primary_slave) == new_slave) |
| 1763 | RCU_INIT_POINTER(bond->primary_slave, NULL); | 1764 | RCU_INIT_POINTER(bond->primary_slave, NULL); |
diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c index 511ca134f13f..d244c41898dd 100644 --- a/drivers/net/dsa/mt7530.c +++ b/drivers/net/dsa/mt7530.c | |||
| @@ -1409,6 +1409,7 @@ static const struct of_device_id mt7530_of_match[] = { | |||
| 1409 | { .compatible = "mediatek,mt7530" }, | 1409 | { .compatible = "mediatek,mt7530" }, |
| 1410 | { /* sentinel */ }, | 1410 | { /* sentinel */ }, |
| 1411 | }; | 1411 | }; |
| 1412 | MODULE_DEVICE_TABLE(of, mt7530_of_match); | ||
| 1412 | 1413 | ||
| 1413 | static struct mdio_driver mt7530_mdio_driver = { | 1414 | static struct mdio_driver mt7530_mdio_driver = { |
| 1414 | .probe = mt7530_probe, | 1415 | .probe = mt7530_probe, |
| @@ -1424,4 +1425,3 @@ mdio_module_driver(mt7530_mdio_driver); | |||
| 1424 | MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); | 1425 | MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); |
| 1425 | MODULE_DESCRIPTION("Driver for Mediatek MT7530 Switch"); | 1426 | MODULE_DESCRIPTION("Driver for Mediatek MT7530 Switch"); |
| 1426 | MODULE_LICENSE("GPL"); | 1427 | MODULE_LICENSE("GPL"); |
| 1427 | MODULE_ALIAS("platform:mediatek-mt7530"); | ||
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index a58acdb5eba3..b26bcdf4cd03 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c | |||
| @@ -1132,6 +1132,7 @@ static void mvneta_port_up(struct mvneta_port *pp) | |||
| 1132 | } | 1132 | } |
| 1133 | mvreg_write(pp, MVNETA_TXQ_CMD, q_map); | 1133 | mvreg_write(pp, MVNETA_TXQ_CMD, q_map); |
| 1134 | 1134 | ||
| 1135 | q_map = 0; | ||
| 1135 | /* Enable all initialized RXQs. */ | 1136 | /* Enable all initialized RXQs. */ |
| 1136 | for (queue = 0; queue < rxq_number; queue++) { | 1137 | for (queue = 0; queue < rxq_number; queue++) { |
| 1137 | struct mvneta_rx_queue *rxq = &pp->rxqs[queue]; | 1138 | struct mvneta_rx_queue *rxq = &pp->rxqs[queue]; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c b/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c index 1a0c3bf86ead..752a72499b4f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c | |||
| @@ -156,57 +156,63 @@ static int mlx4_en_dcbnl_getnumtcs(struct net_device *netdev, int tcid, u8 *num) | |||
| 156 | static u8 mlx4_en_dcbnl_set_all(struct net_device *netdev) | 156 | static u8 mlx4_en_dcbnl_set_all(struct net_device *netdev) |
| 157 | { | 157 | { |
| 158 | struct mlx4_en_priv *priv = netdev_priv(netdev); | 158 | struct mlx4_en_priv *priv = netdev_priv(netdev); |
| 159 | struct mlx4_en_port_profile *prof = priv->prof; | ||
| 159 | struct mlx4_en_dev *mdev = priv->mdev; | 160 | struct mlx4_en_dev *mdev = priv->mdev; |
| 161 | u8 tx_pause, tx_ppp, rx_pause, rx_ppp; | ||
| 160 | 162 | ||
| 161 | if (!(priv->dcbx_cap & DCB_CAP_DCBX_VER_CEE)) | 163 | if (!(priv->dcbx_cap & DCB_CAP_DCBX_VER_CEE)) |
| 162 | return 1; | 164 | return 1; |
| 163 | 165 | ||
| 164 | if (priv->cee_config.pfc_state) { | 166 | if (priv->cee_config.pfc_state) { |
| 165 | int tc; | 167 | int tc; |
| 168 | rx_ppp = prof->rx_ppp; | ||
| 169 | tx_ppp = prof->tx_ppp; | ||
| 166 | 170 | ||
| 167 | priv->prof->rx_pause = 0; | ||
| 168 | priv->prof->tx_pause = 0; | ||
| 169 | for (tc = 0; tc < CEE_DCBX_MAX_PRIO; tc++) { | 171 | for (tc = 0; tc < CEE_DCBX_MAX_PRIO; tc++) { |
| 170 | u8 tc_mask = 1 << tc; | 172 | u8 tc_mask = 1 << tc; |
| 171 | 173 | ||
| 172 | switch (priv->cee_config.dcb_pfc[tc]) { | 174 | switch (priv->cee_config.dcb_pfc[tc]) { |
| 173 | case pfc_disabled: | 175 | case pfc_disabled: |
| 174 | priv->prof->tx_ppp &= ~tc_mask; | 176 | tx_ppp &= ~tc_mask; |
| 175 | priv->prof->rx_ppp &= ~tc_mask; | 177 | rx_ppp &= ~tc_mask; |
| 176 | break; | 178 | break; |
| 177 | case pfc_enabled_full: | 179 | case pfc_enabled_full: |
| 178 | priv->prof->tx_ppp |= tc_mask; | 180 | tx_ppp |= tc_mask; |
| 179 | priv->prof->rx_ppp |= tc_mask; | 181 | rx_ppp |= tc_mask; |
| 180 | break; | 182 | break; |
| 181 | case pfc_enabled_tx: | 183 | case pfc_enabled_tx: |
| 182 | priv->prof->tx_ppp |= tc_mask; | 184 | tx_ppp |= tc_mask; |
| 183 | priv->prof->rx_ppp &= ~tc_mask; | 185 | rx_ppp &= ~tc_mask; |
| 184 | break; | 186 | break; |
| 185 | case pfc_enabled_rx: | 187 | case pfc_enabled_rx: |
| 186 | priv->prof->tx_ppp &= ~tc_mask; | 188 | tx_ppp &= ~tc_mask; |
| 187 | priv->prof->rx_ppp |= tc_mask; | 189 | rx_ppp |= tc_mask; |
| 188 | break; | 190 | break; |
| 189 | default: | 191 | default: |
| 190 | break; | 192 | break; |
| 191 | } | 193 | } |
| 192 | } | 194 | } |
| 193 | en_dbg(DRV, priv, "Set pfc on\n"); | 195 | rx_pause = !!(rx_ppp || tx_ppp) ? 0 : prof->rx_pause; |
| 196 | tx_pause = !!(rx_ppp || tx_ppp) ? 0 : prof->tx_pause; | ||
| 194 | } else { | 197 | } else { |
| 195 | priv->prof->rx_pause = 1; | 198 | rx_ppp = 0; |
| 196 | priv->prof->tx_pause = 1; | 199 | tx_ppp = 0; |
| 197 | en_dbg(DRV, priv, "Set pfc off\n"); | 200 | rx_pause = prof->rx_pause; |
| 201 | tx_pause = prof->tx_pause; | ||
| 198 | } | 202 | } |
| 199 | 203 | ||
| 200 | if (mlx4_SET_PORT_general(mdev->dev, priv->port, | 204 | if (mlx4_SET_PORT_general(mdev->dev, priv->port, |
| 201 | priv->rx_skb_size + ETH_FCS_LEN, | 205 | priv->rx_skb_size + ETH_FCS_LEN, |
| 202 | priv->prof->tx_pause, | 206 | tx_pause, tx_ppp, rx_pause, rx_ppp)) { |
| 203 | priv->prof->tx_ppp, | ||
| 204 | priv->prof->rx_pause, | ||
| 205 | priv->prof->rx_ppp)) { | ||
| 206 | en_err(priv, "Failed setting pause params\n"); | 207 | en_err(priv, "Failed setting pause params\n"); |
| 207 | return 1; | 208 | return 1; |
| 208 | } | 209 | } |
| 209 | 210 | ||
| 211 | prof->tx_ppp = tx_ppp; | ||
| 212 | prof->rx_ppp = rx_ppp; | ||
| 213 | prof->tx_pause = tx_pause; | ||
| 214 | prof->rx_pause = rx_pause; | ||
| 215 | |||
| 210 | return 0; | 216 | return 0; |
| 211 | } | 217 | } |
| 212 | 218 | ||
| @@ -408,6 +414,7 @@ static int mlx4_en_dcbnl_ieee_setpfc(struct net_device *dev, | |||
| 408 | struct mlx4_en_priv *priv = netdev_priv(dev); | 414 | struct mlx4_en_priv *priv = netdev_priv(dev); |
| 409 | struct mlx4_en_port_profile *prof = priv->prof; | 415 | struct mlx4_en_port_profile *prof = priv->prof; |
| 410 | struct mlx4_en_dev *mdev = priv->mdev; | 416 | struct mlx4_en_dev *mdev = priv->mdev; |
| 417 | u32 tx_pause, tx_ppp, rx_pause, rx_ppp; | ||
| 411 | int err; | 418 | int err; |
| 412 | 419 | ||
| 413 | en_dbg(DRV, priv, "cap: 0x%x en: 0x%x mbc: 0x%x delay: %d\n", | 420 | en_dbg(DRV, priv, "cap: 0x%x en: 0x%x mbc: 0x%x delay: %d\n", |
| @@ -416,23 +423,26 @@ static int mlx4_en_dcbnl_ieee_setpfc(struct net_device *dev, | |||
| 416 | pfc->mbc, | 423 | pfc->mbc, |
| 417 | pfc->delay); | 424 | pfc->delay); |
| 418 | 425 | ||
| 419 | prof->rx_pause = !pfc->pfc_en; | 426 | rx_pause = prof->rx_pause && !pfc->pfc_en; |
| 420 | prof->tx_pause = !pfc->pfc_en; | 427 | tx_pause = prof->tx_pause && !pfc->pfc_en; |
| 421 | prof->rx_ppp = pfc->pfc_en; | 428 | rx_ppp = pfc->pfc_en; |
| 422 | prof->tx_ppp = pfc->pfc_en; | 429 | tx_ppp = pfc->pfc_en; |
| 423 | 430 | ||
| 424 | err = mlx4_SET_PORT_general(mdev->dev, priv->port, | 431 | err = mlx4_SET_PORT_general(mdev->dev, priv->port, |
| 425 | priv->rx_skb_size + ETH_FCS_LEN, | 432 | priv->rx_skb_size + ETH_FCS_LEN, |
| 426 | prof->tx_pause, | 433 | tx_pause, tx_ppp, rx_pause, rx_ppp); |
| 427 | prof->tx_ppp, | 434 | if (err) { |
| 428 | prof->rx_pause, | ||
| 429 | prof->rx_ppp); | ||
| 430 | if (err) | ||
| 431 | en_err(priv, "Failed setting pause params\n"); | 435 | en_err(priv, "Failed setting pause params\n"); |
| 432 | else | 436 | return err; |
| 433 | mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap, | 437 | } |
| 434 | prof->rx_ppp, prof->rx_pause, | 438 | |
| 435 | prof->tx_ppp, prof->tx_pause); | 439 | mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap, |
| 440 | rx_ppp, rx_pause, tx_ppp, tx_pause); | ||
| 441 | |||
| 442 | prof->tx_ppp = tx_ppp; | ||
| 443 | prof->rx_ppp = rx_ppp; | ||
| 444 | prof->rx_pause = rx_pause; | ||
| 445 | prof->tx_pause = tx_pause; | ||
| 436 | 446 | ||
| 437 | return err; | 447 | return err; |
| 438 | } | 448 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index 9a7a2f05ab35..a30a2e95d13f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | |||
| @@ -1060,27 +1060,32 @@ static int mlx4_en_set_pauseparam(struct net_device *dev, | |||
| 1060 | { | 1060 | { |
| 1061 | struct mlx4_en_priv *priv = netdev_priv(dev); | 1061 | struct mlx4_en_priv *priv = netdev_priv(dev); |
| 1062 | struct mlx4_en_dev *mdev = priv->mdev; | 1062 | struct mlx4_en_dev *mdev = priv->mdev; |
| 1063 | u8 tx_pause, tx_ppp, rx_pause, rx_ppp; | ||
| 1063 | int err; | 1064 | int err; |
| 1064 | 1065 | ||
| 1065 | if (pause->autoneg) | 1066 | if (pause->autoneg) |
| 1066 | return -EINVAL; | 1067 | return -EINVAL; |
| 1067 | 1068 | ||
| 1068 | priv->prof->tx_pause = pause->tx_pause != 0; | 1069 | tx_pause = !!(pause->tx_pause); |
| 1069 | priv->prof->rx_pause = pause->rx_pause != 0; | 1070 | rx_pause = !!(pause->rx_pause); |
| 1071 | rx_ppp = priv->prof->rx_ppp && !(tx_pause || rx_pause); | ||
| 1072 | tx_ppp = priv->prof->tx_ppp && !(tx_pause || rx_pause); | ||
| 1073 | |||
| 1070 | err = mlx4_SET_PORT_general(mdev->dev, priv->port, | 1074 | err = mlx4_SET_PORT_general(mdev->dev, priv->port, |
| 1071 | priv->rx_skb_size + ETH_FCS_LEN, | 1075 | priv->rx_skb_size + ETH_FCS_LEN, |
| 1072 | priv->prof->tx_pause, | 1076 | tx_pause, tx_ppp, rx_pause, rx_ppp); |
| 1073 | priv->prof->tx_ppp, | 1077 | if (err) { |
| 1074 | priv->prof->rx_pause, | 1078 | en_err(priv, "Failed setting pause params, err = %d\n", err); |
| 1075 | priv->prof->rx_ppp); | 1079 | return err; |
| 1076 | if (err) | 1080 | } |
| 1077 | en_err(priv, "Failed setting pause params\n"); | 1081 | |
| 1078 | else | 1082 | mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap, |
| 1079 | mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap, | 1083 | rx_ppp, rx_pause, tx_ppp, tx_pause); |
| 1080 | priv->prof->rx_ppp, | 1084 | |
| 1081 | priv->prof->rx_pause, | 1085 | priv->prof->tx_pause = tx_pause; |
| 1082 | priv->prof->tx_ppp, | 1086 | priv->prof->rx_pause = rx_pause; |
| 1083 | priv->prof->tx_pause); | 1087 | priv->prof->tx_ppp = tx_ppp; |
| 1088 | priv->prof->rx_ppp = rx_ppp; | ||
| 1084 | 1089 | ||
| 1085 | return err; | 1090 | return err; |
| 1086 | } | 1091 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_main.c b/drivers/net/ethernet/mellanox/mlx4/en_main.c index 2c2965497ed3..d25e16d2c319 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_main.c | |||
| @@ -163,9 +163,9 @@ static void mlx4_en_get_profile(struct mlx4_en_dev *mdev) | |||
| 163 | params->udp_rss = 0; | 163 | params->udp_rss = 0; |
| 164 | } | 164 | } |
| 165 | for (i = 1; i <= MLX4_MAX_PORTS; i++) { | 165 | for (i = 1; i <= MLX4_MAX_PORTS; i++) { |
| 166 | params->prof[i].rx_pause = 1; | 166 | params->prof[i].rx_pause = !(pfcrx || pfctx); |
| 167 | params->prof[i].rx_ppp = pfcrx; | 167 | params->prof[i].rx_ppp = pfcrx; |
| 168 | params->prof[i].tx_pause = 1; | 168 | params->prof[i].tx_pause = !(pfcrx || pfctx); |
| 169 | params->prof[i].tx_ppp = pfctx; | 169 | params->prof[i].tx_ppp = pfctx; |
| 170 | params->prof[i].tx_ring_size = MLX4_EN_DEF_TX_RING_SIZE; | 170 | params->prof[i].tx_ring_size = MLX4_EN_DEF_TX_RING_SIZE; |
| 171 | params->prof[i].rx_ring_size = MLX4_EN_DEF_RX_RING_SIZE; | 171 | params->prof[i].rx_ring_size = MLX4_EN_DEF_RX_RING_SIZE; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 606a0e0beeae..29e50f787349 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
| @@ -5088,6 +5088,7 @@ static void rem_slave_fs_rule(struct mlx4_dev *dev, int slave) | |||
| 5088 | &tracker->res_tree[RES_FS_RULE]); | 5088 | &tracker->res_tree[RES_FS_RULE]); |
| 5089 | list_del(&fs_rule->com.list); | 5089 | list_del(&fs_rule->com.list); |
| 5090 | spin_unlock_irq(mlx4_tlock(dev)); | 5090 | spin_unlock_irq(mlx4_tlock(dev)); |
| 5091 | kfree(fs_rule->mirr_mbox); | ||
| 5091 | kfree(fs_rule); | 5092 | kfree(fs_rule); |
| 5092 | state = 0; | 5093 | state = 0; |
| 5093 | break; | 5094 | break; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig index 25deaa5a534c..c032319f1cb9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig +++ b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig | |||
| @@ -46,7 +46,7 @@ config MLX5_MPFS | |||
| 46 | 46 | ||
| 47 | config MLX5_ESWITCH | 47 | config MLX5_ESWITCH |
| 48 | bool "Mellanox Technologies MLX5 SRIOV E-Switch support" | 48 | bool "Mellanox Technologies MLX5 SRIOV E-Switch support" |
| 49 | depends on MLX5_CORE_EN | 49 | depends on MLX5_CORE_EN && NET_SWITCHDEV |
| 50 | default y | 50 | default y |
| 51 | ---help--- | 51 | ---help--- |
| 52 | Mellanox Technologies Ethernet SRIOV E-Switch support in ConnectX NIC. | 52 | Mellanox Technologies Ethernet SRIOV E-Switch support in ConnectX NIC. |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c index a87d46bc2299..37fd0245b6c1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | |||
| @@ -409,6 +409,9 @@ static int mlx5e_get_coalesce(struct net_device *netdev, | |||
| 409 | return mlx5e_ethtool_get_coalesce(priv, coal); | 409 | return mlx5e_ethtool_get_coalesce(priv, coal); |
| 410 | } | 410 | } |
| 411 | 411 | ||
| 412 | #define MLX5E_MAX_COAL_TIME MLX5_MAX_CQ_PERIOD | ||
| 413 | #define MLX5E_MAX_COAL_FRAMES MLX5_MAX_CQ_COUNT | ||
| 414 | |||
| 412 | static void | 415 | static void |
| 413 | mlx5e_set_priv_channels_coalesce(struct mlx5e_priv *priv, struct ethtool_coalesce *coal) | 416 | mlx5e_set_priv_channels_coalesce(struct mlx5e_priv *priv, struct ethtool_coalesce *coal) |
| 414 | { | 417 | { |
| @@ -443,6 +446,20 @@ int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv, | |||
| 443 | if (!MLX5_CAP_GEN(mdev, cq_moderation)) | 446 | if (!MLX5_CAP_GEN(mdev, cq_moderation)) |
| 444 | return -EOPNOTSUPP; | 447 | return -EOPNOTSUPP; |
| 445 | 448 | ||
| 449 | if (coal->tx_coalesce_usecs > MLX5E_MAX_COAL_TIME || | ||
| 450 | coal->rx_coalesce_usecs > MLX5E_MAX_COAL_TIME) { | ||
| 451 | netdev_info(priv->netdev, "%s: maximum coalesce time supported is %lu usecs\n", | ||
| 452 | __func__, MLX5E_MAX_COAL_TIME); | ||
| 453 | return -ERANGE; | ||
| 454 | } | ||
| 455 | |||
| 456 | if (coal->tx_max_coalesced_frames > MLX5E_MAX_COAL_FRAMES || | ||
| 457 | coal->rx_max_coalesced_frames > MLX5E_MAX_COAL_FRAMES) { | ||
| 458 | netdev_info(priv->netdev, "%s: maximum coalesced frames supported is %lu\n", | ||
| 459 | __func__, MLX5E_MAX_COAL_FRAMES); | ||
| 460 | return -ERANGE; | ||
| 461 | } | ||
| 462 | |||
| 446 | mutex_lock(&priv->state_lock); | 463 | mutex_lock(&priv->state_lock); |
| 447 | new_channels.params = priv->channels.params; | 464 | new_channels.params = priv->channels.params; |
| 448 | 465 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 0339609cfa56..c71f4f10283b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | |||
| @@ -2702,6 +2702,9 @@ int mlx5e_open(struct net_device *netdev) | |||
| 2702 | mlx5_set_port_admin_status(priv->mdev, MLX5_PORT_UP); | 2702 | mlx5_set_port_admin_status(priv->mdev, MLX5_PORT_UP); |
| 2703 | mutex_unlock(&priv->state_lock); | 2703 | mutex_unlock(&priv->state_lock); |
| 2704 | 2704 | ||
| 2705 | if (mlx5e_vxlan_allowed(priv->mdev)) | ||
| 2706 | udp_tunnel_get_rx_info(netdev); | ||
| 2707 | |||
| 2705 | return err; | 2708 | return err; |
| 2706 | } | 2709 | } |
| 2707 | 2710 | ||
| @@ -4225,7 +4228,7 @@ static void mlx5e_set_netdev_dev_addr(struct net_device *netdev) | |||
| 4225 | } | 4228 | } |
| 4226 | } | 4229 | } |
| 4227 | 4230 | ||
| 4228 | #if IS_ENABLED(CONFIG_NET_SWITCHDEV) && IS_ENABLED(CONFIG_MLX5_ESWITCH) | 4231 | #if IS_ENABLED(CONFIG_MLX5_ESWITCH) |
| 4229 | static const struct switchdev_ops mlx5e_switchdev_ops = { | 4232 | static const struct switchdev_ops mlx5e_switchdev_ops = { |
| 4230 | .switchdev_port_attr_get = mlx5e_attr_get, | 4233 | .switchdev_port_attr_get = mlx5e_attr_get, |
| 4231 | }; | 4234 | }; |
| @@ -4334,7 +4337,7 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev) | |||
| 4334 | 4337 | ||
| 4335 | mlx5e_set_netdev_dev_addr(netdev); | 4338 | mlx5e_set_netdev_dev_addr(netdev); |
| 4336 | 4339 | ||
| 4337 | #if IS_ENABLED(CONFIG_NET_SWITCHDEV) && IS_ENABLED(CONFIG_MLX5_ESWITCH) | 4340 | #if IS_ENABLED(CONFIG_MLX5_ESWITCH) |
| 4338 | if (MLX5_VPORT_MANAGER(mdev)) | 4341 | if (MLX5_VPORT_MANAGER(mdev)) |
| 4339 | netdev->switchdev_ops = &mlx5e_switchdev_ops; | 4342 | netdev->switchdev_ops = &mlx5e_switchdev_ops; |
| 4340 | #endif | 4343 | #endif |
| @@ -4493,12 +4496,6 @@ static void mlx5e_nic_enable(struct mlx5e_priv *priv) | |||
| 4493 | #ifdef CONFIG_MLX5_CORE_EN_DCB | 4496 | #ifdef CONFIG_MLX5_CORE_EN_DCB |
| 4494 | mlx5e_dcbnl_init_app(priv); | 4497 | mlx5e_dcbnl_init_app(priv); |
| 4495 | #endif | 4498 | #endif |
| 4496 | /* Device already registered: sync netdev system state */ | ||
| 4497 | if (mlx5e_vxlan_allowed(mdev)) { | ||
| 4498 | rtnl_lock(); | ||
| 4499 | udp_tunnel_get_rx_info(netdev); | ||
| 4500 | rtnl_unlock(); | ||
| 4501 | } | ||
| 4502 | 4499 | ||
| 4503 | queue_work(priv->wq, &priv->set_rx_mode_work); | 4500 | queue_work(priv->wq, &priv->set_rx_mode_work); |
| 4504 | 4501 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index 8e70fa9ef39a..d8f68e4d1018 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | |||
| @@ -44,6 +44,11 @@ | |||
| 44 | #include "en_tc.h" | 44 | #include "en_tc.h" |
| 45 | #include "fs_core.h" | 45 | #include "fs_core.h" |
| 46 | 46 | ||
| 47 | #define MLX5E_REP_PARAMS_LOG_SQ_SIZE \ | ||
| 48 | max(0x6, MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE) | ||
| 49 | #define MLX5E_REP_PARAMS_LOG_RQ_SIZE \ | ||
| 50 | max(0x6, MLX5E_PARAMS_MINIMUM_LOG_RQ_SIZE) | ||
| 51 | |||
| 47 | static const char mlx5e_rep_driver_name[] = "mlx5e_rep"; | 52 | static const char mlx5e_rep_driver_name[] = "mlx5e_rep"; |
| 48 | 53 | ||
| 49 | static void mlx5e_rep_get_drvinfo(struct net_device *dev, | 54 | static void mlx5e_rep_get_drvinfo(struct net_device *dev, |
| @@ -209,7 +214,7 @@ static void mlx5e_sqs2vport_stop(struct mlx5_eswitch *esw, | |||
| 209 | 214 | ||
| 210 | static int mlx5e_sqs2vport_start(struct mlx5_eswitch *esw, | 215 | static int mlx5e_sqs2vport_start(struct mlx5_eswitch *esw, |
| 211 | struct mlx5_eswitch_rep *rep, | 216 | struct mlx5_eswitch_rep *rep, |
| 212 | u16 *sqns_array, int sqns_num) | 217 | u32 *sqns_array, int sqns_num) |
| 213 | { | 218 | { |
| 214 | struct mlx5_flow_handle *flow_rule; | 219 | struct mlx5_flow_handle *flow_rule; |
| 215 | struct mlx5e_rep_priv *rpriv; | 220 | struct mlx5e_rep_priv *rpriv; |
| @@ -255,9 +260,9 @@ int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv) | |||
| 255 | struct mlx5e_channel *c; | 260 | struct mlx5e_channel *c; |
| 256 | int n, tc, num_sqs = 0; | 261 | int n, tc, num_sqs = 0; |
| 257 | int err = -ENOMEM; | 262 | int err = -ENOMEM; |
| 258 | u16 *sqs; | 263 | u32 *sqs; |
| 259 | 264 | ||
| 260 | sqs = kcalloc(priv->channels.num * priv->channels.params.num_tc, sizeof(u16), GFP_KERNEL); | 265 | sqs = kcalloc(priv->channels.num * priv->channels.params.num_tc, sizeof(*sqs), GFP_KERNEL); |
| 261 | if (!sqs) | 266 | if (!sqs) |
| 262 | goto out; | 267 | goto out; |
| 263 | 268 | ||
| @@ -288,7 +293,7 @@ void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv) | |||
| 288 | static void mlx5e_rep_neigh_update_init_interval(struct mlx5e_rep_priv *rpriv) | 293 | static void mlx5e_rep_neigh_update_init_interval(struct mlx5e_rep_priv *rpriv) |
| 289 | { | 294 | { |
| 290 | #if IS_ENABLED(CONFIG_IPV6) | 295 | #if IS_ENABLED(CONFIG_IPV6) |
| 291 | unsigned long ipv6_interval = NEIGH_VAR(&ipv6_stub->nd_tbl->parms, | 296 | unsigned long ipv6_interval = NEIGH_VAR(&nd_tbl.parms, |
| 292 | DELAY_PROBE_TIME); | 297 | DELAY_PROBE_TIME); |
| 293 | #else | 298 | #else |
| 294 | unsigned long ipv6_interval = ~0UL; | 299 | unsigned long ipv6_interval = ~0UL; |
| @@ -424,7 +429,7 @@ static int mlx5e_rep_netevent_event(struct notifier_block *nb, | |||
| 424 | case NETEVENT_NEIGH_UPDATE: | 429 | case NETEVENT_NEIGH_UPDATE: |
| 425 | n = ptr; | 430 | n = ptr; |
| 426 | #if IS_ENABLED(CONFIG_IPV6) | 431 | #if IS_ENABLED(CONFIG_IPV6) |
| 427 | if (n->tbl != ipv6_stub->nd_tbl && n->tbl != &arp_tbl) | 432 | if (n->tbl != &nd_tbl && n->tbl != &arp_tbl) |
| 428 | #else | 433 | #else |
| 429 | if (n->tbl != &arp_tbl) | 434 | if (n->tbl != &arp_tbl) |
| 430 | #endif | 435 | #endif |
| @@ -472,7 +477,7 @@ static int mlx5e_rep_netevent_event(struct notifier_block *nb, | |||
| 472 | * done per device delay prob time parameter. | 477 | * done per device delay prob time parameter. |
| 473 | */ | 478 | */ |
| 474 | #if IS_ENABLED(CONFIG_IPV6) | 479 | #if IS_ENABLED(CONFIG_IPV6) |
| 475 | if (!p->dev || (p->tbl != ipv6_stub->nd_tbl && p->tbl != &arp_tbl)) | 480 | if (!p->dev || (p->tbl != &nd_tbl && p->tbl != &arp_tbl)) |
| 476 | #else | 481 | #else |
| 477 | if (!p->dev || p->tbl != &arp_tbl) | 482 | if (!p->dev || p->tbl != &arp_tbl) |
| 478 | #endif | 483 | #endif |
| @@ -668,7 +673,6 @@ static int mlx5e_rep_open(struct net_device *dev) | |||
| 668 | struct mlx5e_priv *priv = netdev_priv(dev); | 673 | struct mlx5e_priv *priv = netdev_priv(dev); |
| 669 | struct mlx5e_rep_priv *rpriv = priv->ppriv; | 674 | struct mlx5e_rep_priv *rpriv = priv->ppriv; |
| 670 | struct mlx5_eswitch_rep *rep = rpriv->rep; | 675 | struct mlx5_eswitch_rep *rep = rpriv->rep; |
| 671 | struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; | ||
| 672 | int err; | 676 | int err; |
| 673 | 677 | ||
| 674 | mutex_lock(&priv->state_lock); | 678 | mutex_lock(&priv->state_lock); |
| @@ -676,8 +680,9 @@ static int mlx5e_rep_open(struct net_device *dev) | |||
| 676 | if (err) | 680 | if (err) |
| 677 | goto unlock; | 681 | goto unlock; |
| 678 | 682 | ||
| 679 | if (!mlx5_eswitch_set_vport_state(esw, rep->vport, | 683 | if (!mlx5_modify_vport_admin_state(priv->mdev, |
| 680 | MLX5_ESW_VPORT_ADMIN_STATE_UP)) | 684 | MLX5_QUERY_VPORT_STATE_IN_OP_MOD_ESW_VPORT, |
| 685 | rep->vport, MLX5_ESW_VPORT_ADMIN_STATE_UP)) | ||
| 681 | netif_carrier_on(dev); | 686 | netif_carrier_on(dev); |
| 682 | 687 | ||
| 683 | unlock: | 688 | unlock: |
| @@ -690,11 +695,12 @@ static int mlx5e_rep_close(struct net_device *dev) | |||
| 690 | struct mlx5e_priv *priv = netdev_priv(dev); | 695 | struct mlx5e_priv *priv = netdev_priv(dev); |
| 691 | struct mlx5e_rep_priv *rpriv = priv->ppriv; | 696 | struct mlx5e_rep_priv *rpriv = priv->ppriv; |
| 692 | struct mlx5_eswitch_rep *rep = rpriv->rep; | 697 | struct mlx5_eswitch_rep *rep = rpriv->rep; |
| 693 | struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; | ||
| 694 | int ret; | 698 | int ret; |
| 695 | 699 | ||
| 696 | mutex_lock(&priv->state_lock); | 700 | mutex_lock(&priv->state_lock); |
| 697 | (void)mlx5_eswitch_set_vport_state(esw, rep->vport, MLX5_ESW_VPORT_ADMIN_STATE_DOWN); | 701 | mlx5_modify_vport_admin_state(priv->mdev, |
| 702 | MLX5_QUERY_VPORT_STATE_IN_OP_MOD_ESW_VPORT, | ||
| 703 | rep->vport, MLX5_ESW_VPORT_ADMIN_STATE_DOWN); | ||
| 698 | ret = mlx5e_close_locked(dev); | 704 | ret = mlx5e_close_locked(dev); |
| 699 | mutex_unlock(&priv->state_lock); | 705 | mutex_unlock(&priv->state_lock); |
| 700 | return ret; | 706 | return ret; |
| @@ -878,9 +884,9 @@ static void mlx5e_build_rep_params(struct mlx5_core_dev *mdev, | |||
| 878 | MLX5_CQ_PERIOD_MODE_START_FROM_EQE; | 884 | MLX5_CQ_PERIOD_MODE_START_FROM_EQE; |
| 879 | 885 | ||
| 880 | params->hard_mtu = MLX5E_ETH_HARD_MTU; | 886 | params->hard_mtu = MLX5E_ETH_HARD_MTU; |
| 881 | params->log_sq_size = MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE; | 887 | params->log_sq_size = MLX5E_REP_PARAMS_LOG_SQ_SIZE; |
| 882 | params->rq_wq_type = MLX5_WQ_TYPE_LINKED_LIST; | 888 | params->rq_wq_type = MLX5_WQ_TYPE_LINKED_LIST; |
| 883 | params->log_rq_mtu_frames = MLX5E_PARAMS_MINIMUM_LOG_RQ_SIZE; | 889 | params->log_rq_mtu_frames = MLX5E_REP_PARAMS_LOG_RQ_SIZE; |
| 884 | 890 | ||
| 885 | params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation); | 891 | params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation); |
| 886 | mlx5e_set_rx_cq_mode_params(params, cq_period_mode); | 892 | mlx5e_set_rx_cq_mode_params(params, cq_period_mode); |
| @@ -899,9 +905,7 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev) | |||
| 899 | 905 | ||
| 900 | netdev->ethtool_ops = &mlx5e_rep_ethtool_ops; | 906 | netdev->ethtool_ops = &mlx5e_rep_ethtool_ops; |
| 901 | 907 | ||
| 902 | #ifdef CONFIG_NET_SWITCHDEV | ||
| 903 | netdev->switchdev_ops = &mlx5e_rep_switchdev_ops; | 908 | netdev->switchdev_ops = &mlx5e_rep_switchdev_ops; |
| 904 | #endif | ||
| 905 | 909 | ||
| 906 | netdev->features |= NETIF_F_VLAN_CHALLENGED | NETIF_F_HW_TC | NETIF_F_NETNS_LOCAL; | 910 | netdev->features |= NETIF_F_VLAN_CHALLENGED | NETIF_F_HW_TC | NETIF_F_NETNS_LOCAL; |
| 907 | netdev->hw_features |= NETIF_F_HW_TC; | 911 | netdev->hw_features |= NETIF_F_HW_TC; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index 3e4a7e81b67f..4197001f9801 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | |||
| @@ -964,7 +964,7 @@ void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe) | |||
| 964 | tbl = &arp_tbl; | 964 | tbl = &arp_tbl; |
| 965 | #if IS_ENABLED(CONFIG_IPV6) | 965 | #if IS_ENABLED(CONFIG_IPV6) |
| 966 | else if (m_neigh->family == AF_INET6) | 966 | else if (m_neigh->family == AF_INET6) |
| 967 | tbl = ipv6_stub->nd_tbl; | 967 | tbl = &nd_tbl; |
| 968 | #endif | 968 | #endif |
| 969 | else | 969 | else |
| 970 | return; | 970 | return; |
| @@ -2614,19 +2614,19 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv, | |||
| 2614 | if (err != -EAGAIN) | 2614 | if (err != -EAGAIN) |
| 2615 | flow->flags |= MLX5E_TC_FLOW_OFFLOADED; | 2615 | flow->flags |= MLX5E_TC_FLOW_OFFLOADED; |
| 2616 | 2616 | ||
| 2617 | if (!(flow->flags & MLX5E_TC_FLOW_ESWITCH) || | ||
| 2618 | !(flow->esw_attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP)) | ||
| 2619 | kvfree(parse_attr); | ||
| 2620 | |||
| 2617 | err = rhashtable_insert_fast(&tc->ht, &flow->node, | 2621 | err = rhashtable_insert_fast(&tc->ht, &flow->node, |
| 2618 | tc->ht_params); | 2622 | tc->ht_params); |
| 2619 | if (err) | 2623 | if (err) { |
| 2620 | goto err_del_rule; | 2624 | mlx5e_tc_del_flow(priv, flow); |
| 2625 | kfree(flow); | ||
| 2626 | } | ||
| 2621 | 2627 | ||
| 2622 | if (flow->flags & MLX5E_TC_FLOW_ESWITCH && | ||
| 2623 | !(flow->esw_attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP)) | ||
| 2624 | kvfree(parse_attr); | ||
| 2625 | return err; | 2628 | return err; |
| 2626 | 2629 | ||
| 2627 | err_del_rule: | ||
| 2628 | mlx5e_tc_del_flow(priv, flow); | ||
| 2629 | |||
| 2630 | err_free: | 2630 | err_free: |
| 2631 | kvfree(parse_attr); | 2631 | kvfree(parse_attr); |
| 2632 | kfree(flow); | 2632 | kfree(flow); |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index a9ccd974c620..1904c0323d39 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | |||
| @@ -1406,6 +1406,55 @@ mlxsw_sp_ipip_entry_ol_up_event(struct mlxsw_sp *mlxsw_sp, | |||
| 1406 | decap_fib_entry); | 1406 | decap_fib_entry); |
| 1407 | } | 1407 | } |
| 1408 | 1408 | ||
| 1409 | static int | ||
| 1410 | mlxsw_sp_rif_ipip_lb_op(struct mlxsw_sp_rif_ipip_lb *lb_rif, | ||
| 1411 | struct mlxsw_sp_vr *ul_vr, bool enable) | ||
| 1412 | { | ||
| 1413 | struct mlxsw_sp_rif_ipip_lb_config lb_cf = lb_rif->lb_config; | ||
| 1414 | struct mlxsw_sp_rif *rif = &lb_rif->common; | ||
| 1415 | struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; | ||
| 1416 | char ritr_pl[MLXSW_REG_RITR_LEN]; | ||
| 1417 | u32 saddr4; | ||
| 1418 | |||
| 1419 | switch (lb_cf.ul_protocol) { | ||
| 1420 | case MLXSW_SP_L3_PROTO_IPV4: | ||
| 1421 | saddr4 = be32_to_cpu(lb_cf.saddr.addr4); | ||
| 1422 | mlxsw_reg_ritr_pack(ritr_pl, enable, MLXSW_REG_RITR_LOOPBACK_IF, | ||
| 1423 | rif->rif_index, rif->vr_id, rif->dev->mtu); | ||
| 1424 | mlxsw_reg_ritr_loopback_ipip4_pack(ritr_pl, lb_cf.lb_ipipt, | ||
| 1425 | MLXSW_REG_RITR_LOOPBACK_IPIP_OPTIONS_GRE_KEY_PRESET, | ||
| 1426 | ul_vr->id, saddr4, lb_cf.okey); | ||
| 1427 | break; | ||
| 1428 | |||
| 1429 | case MLXSW_SP_L3_PROTO_IPV6: | ||
| 1430 | return -EAFNOSUPPORT; | ||
| 1431 | } | ||
| 1432 | |||
| 1433 | return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); | ||
| 1434 | } | ||
| 1435 | |||
| 1436 | static int mlxsw_sp_netdevice_ipip_ol_update_mtu(struct mlxsw_sp *mlxsw_sp, | ||
| 1437 | struct net_device *ol_dev) | ||
| 1438 | { | ||
| 1439 | struct mlxsw_sp_ipip_entry *ipip_entry; | ||
| 1440 | struct mlxsw_sp_rif_ipip_lb *lb_rif; | ||
| 1441 | struct mlxsw_sp_vr *ul_vr; | ||
| 1442 | int err = 0; | ||
| 1443 | |||
| 1444 | ipip_entry = mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev); | ||
| 1445 | if (ipip_entry) { | ||
| 1446 | lb_rif = ipip_entry->ol_lb; | ||
| 1447 | ul_vr = &mlxsw_sp->router->vrs[lb_rif->ul_vr_id]; | ||
| 1448 | err = mlxsw_sp_rif_ipip_lb_op(lb_rif, ul_vr, true); | ||
| 1449 | if (err) | ||
| 1450 | goto out; | ||
| 1451 | lb_rif->common.mtu = ol_dev->mtu; | ||
| 1452 | } | ||
| 1453 | |||
| 1454 | out: | ||
| 1455 | return err; | ||
| 1456 | } | ||
| 1457 | |||
| 1409 | static void mlxsw_sp_netdevice_ipip_ol_up_event(struct mlxsw_sp *mlxsw_sp, | 1458 | static void mlxsw_sp_netdevice_ipip_ol_up_event(struct mlxsw_sp *mlxsw_sp, |
| 1410 | struct net_device *ol_dev) | 1459 | struct net_device *ol_dev) |
| 1411 | { | 1460 | { |
| @@ -1686,6 +1735,8 @@ int mlxsw_sp_netdevice_ipip_ol_event(struct mlxsw_sp *mlxsw_sp, | |||
| 1686 | extack = info->extack; | 1735 | extack = info->extack; |
| 1687 | return mlxsw_sp_netdevice_ipip_ol_change_event(mlxsw_sp, | 1736 | return mlxsw_sp_netdevice_ipip_ol_change_event(mlxsw_sp, |
| 1688 | ol_dev, extack); | 1737 | ol_dev, extack); |
| 1738 | case NETDEV_CHANGEMTU: | ||
| 1739 | return mlxsw_sp_netdevice_ipip_ol_update_mtu(mlxsw_sp, ol_dev); | ||
| 1689 | } | 1740 | } |
| 1690 | return 0; | 1741 | return 0; |
| 1691 | } | 1742 | } |
| @@ -6910,33 +6961,6 @@ mlxsw_sp_rif_ipip_lb_setup(struct mlxsw_sp_rif *rif, | |||
| 6910 | } | 6961 | } |
| 6911 | 6962 | ||
| 6912 | static int | 6963 | static int |
| 6913 | mlxsw_sp_rif_ipip_lb_op(struct mlxsw_sp_rif_ipip_lb *lb_rif, | ||
| 6914 | struct mlxsw_sp_vr *ul_vr, bool enable) | ||
| 6915 | { | ||
| 6916 | struct mlxsw_sp_rif_ipip_lb_config lb_cf = lb_rif->lb_config; | ||
| 6917 | struct mlxsw_sp_rif *rif = &lb_rif->common; | ||
| 6918 | struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; | ||
| 6919 | char ritr_pl[MLXSW_REG_RITR_LEN]; | ||
| 6920 | u32 saddr4; | ||
| 6921 | |||
| 6922 | switch (lb_cf.ul_protocol) { | ||
| 6923 | case MLXSW_SP_L3_PROTO_IPV4: | ||
| 6924 | saddr4 = be32_to_cpu(lb_cf.saddr.addr4); | ||
| 6925 | mlxsw_reg_ritr_pack(ritr_pl, enable, MLXSW_REG_RITR_LOOPBACK_IF, | ||
| 6926 | rif->rif_index, rif->vr_id, rif->dev->mtu); | ||
| 6927 | mlxsw_reg_ritr_loopback_ipip4_pack(ritr_pl, lb_cf.lb_ipipt, | ||
| 6928 | MLXSW_REG_RITR_LOOPBACK_IPIP_OPTIONS_GRE_KEY_PRESET, | ||
| 6929 | ul_vr->id, saddr4, lb_cf.okey); | ||
| 6930 | break; | ||
| 6931 | |||
| 6932 | case MLXSW_SP_L3_PROTO_IPV6: | ||
| 6933 | return -EAFNOSUPPORT; | ||
| 6934 | } | ||
| 6935 | |||
| 6936 | return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); | ||
| 6937 | } | ||
| 6938 | |||
| 6939 | static int | ||
| 6940 | mlxsw_sp_rif_ipip_lb_configure(struct mlxsw_sp_rif *rif) | 6964 | mlxsw_sp_rif_ipip_lb_configure(struct mlxsw_sp_rif *rif) |
| 6941 | { | 6965 | { |
| 6942 | struct mlxsw_sp_rif_ipip_lb *lb_rif = mlxsw_sp_rif_ipip_lb_rif(rif); | 6966 | struct mlxsw_sp_rif_ipip_lb *lb_rif = mlxsw_sp_rif_ipip_lb_rif(rif); |
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index 4b631e26f199..29b4e5f8c102 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c | |||
| @@ -74,7 +74,9 @@ nfp_meta_has_prev(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta) | |||
| 74 | 74 | ||
| 75 | static void nfp_prog_push(struct nfp_prog *nfp_prog, u64 insn) | 75 | static void nfp_prog_push(struct nfp_prog *nfp_prog, u64 insn) |
| 76 | { | 76 | { |
| 77 | if (nfp_prog->__prog_alloc_len == nfp_prog->prog_len) { | 77 | if (nfp_prog->__prog_alloc_len / sizeof(u64) == nfp_prog->prog_len) { |
| 78 | pr_warn("instruction limit reached (%u NFP instructions)\n", | ||
| 79 | nfp_prog->prog_len); | ||
| 78 | nfp_prog->error = -ENOSPC; | 80 | nfp_prog->error = -ENOSPC; |
| 79 | return; | 81 | return; |
| 80 | } | 82 | } |
| @@ -2732,6 +2734,8 @@ static int nfp_translate(struct nfp_prog *nfp_prog) | |||
| 2732 | err = cb(nfp_prog, meta); | 2734 | err = cb(nfp_prog, meta); |
| 2733 | if (err) | 2735 | if (err) |
| 2734 | return err; | 2736 | return err; |
| 2737 | if (nfp_prog->error) | ||
| 2738 | return nfp_prog->error; | ||
| 2735 | 2739 | ||
| 2736 | nfp_prog->n_translated++; | 2740 | nfp_prog->n_translated++; |
| 2737 | } | 2741 | } |
diff --git a/drivers/net/ethernet/qlogic/qede/qede_fp.c b/drivers/net/ethernet/qlogic/qede/qede_fp.c index dafc079ab6b9..14941303189d 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_fp.c +++ b/drivers/net/ethernet/qlogic/qede/qede_fp.c | |||
| @@ -320,13 +320,11 @@ static inline void qede_update_tx_producer(struct qede_tx_queue *txq) | |||
| 320 | barrier(); | 320 | barrier(); |
| 321 | writel(txq->tx_db.raw, txq->doorbell_addr); | 321 | writel(txq->tx_db.raw, txq->doorbell_addr); |
| 322 | 322 | ||
| 323 | /* mmiowb is needed to synchronize doorbell writes from more than one | 323 | /* Fence required to flush the write combined buffer, since another |
| 324 | * processor. It guarantees that the write arrives to the device before | 324 | * CPU may write to the same doorbell address and data may be lost |
| 325 | * the queue lock is released and another start_xmit is called (possibly | 325 | * due to relaxed order nature of write combined bar. |
| 326 | * on another CPU). Without this barrier, the next doorbell can bypass | ||
| 327 | * this doorbell. This is applicable to IA64/Altix systems. | ||
| 328 | */ | 326 | */ |
| 329 | mmiowb(); | 327 | wmb(); |
| 330 | } | 328 | } |
| 331 | 329 | ||
| 332 | static int qede_xdp_xmit(struct qede_dev *edev, struct qede_fastpath *fp, | 330 | static int qede_xdp_xmit(struct qede_dev *edev, struct qede_fastpath *fp, |
| @@ -1249,16 +1247,10 @@ static int qede_rx_process_cqe(struct qede_dev *edev, | |||
| 1249 | 1247 | ||
| 1250 | csum_flag = qede_check_csum(parse_flag); | 1248 | csum_flag = qede_check_csum(parse_flag); |
| 1251 | if (unlikely(csum_flag == QEDE_CSUM_ERROR)) { | 1249 | if (unlikely(csum_flag == QEDE_CSUM_ERROR)) { |
| 1252 | if (qede_pkt_is_ip_fragmented(fp_cqe, parse_flag)) { | 1250 | if (qede_pkt_is_ip_fragmented(fp_cqe, parse_flag)) |
| 1253 | rxq->rx_ip_frags++; | 1251 | rxq->rx_ip_frags++; |
| 1254 | } else { | 1252 | else |
| 1255 | DP_NOTICE(edev, | ||
| 1256 | "CQE has error, flags = %x, dropping incoming packet\n", | ||
| 1257 | parse_flag); | ||
| 1258 | rxq->rx_hw_errors++; | 1253 | rxq->rx_hw_errors++; |
| 1259 | qede_recycle_rx_bd_ring(rxq, fp_cqe->bd_num); | ||
| 1260 | return 0; | ||
| 1261 | } | ||
| 1262 | } | 1254 | } |
| 1263 | 1255 | ||
| 1264 | /* Basic validation passed; Need to prepare an SKB. This would also | 1256 | /* Basic validation passed; Need to prepare an SKB. This would also |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 630409e0337f..604ae78381ae 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
| @@ -8378,12 +8378,12 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 8378 | if (!tp->counters) | 8378 | if (!tp->counters) |
| 8379 | return -ENOMEM; | 8379 | return -ENOMEM; |
| 8380 | 8380 | ||
| 8381 | pci_set_drvdata(pdev, dev); | ||
| 8382 | |||
| 8381 | rc = register_netdev(dev); | 8383 | rc = register_netdev(dev); |
| 8382 | if (rc < 0) | 8384 | if (rc < 0) |
| 8383 | return rc; | 8385 | return rc; |
| 8384 | 8386 | ||
| 8385 | pci_set_drvdata(pdev, dev); | ||
| 8386 | |||
| 8387 | netif_info(tp, probe, dev, "%s at 0x%p, %pM, XID %08x IRQ %d\n", | 8387 | netif_info(tp, probe, dev, "%s at 0x%p, %pM, XID %08x IRQ %d\n", |
| 8388 | rtl_chip_infos[chipset].name, tp->mmio_addr, dev->dev_addr, | 8388 | rtl_chip_infos[chipset].name, tp->mmio_addr, dev->dev_addr, |
| 8389 | (u32)(RTL_R32(tp, TxConfig) & 0x9cf0f8ff), | 8389 | (u32)(RTL_R32(tp, TxConfig) & 0x9cf0f8ff), |
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index e2b68d9328a7..6b127be781d9 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c | |||
| @@ -863,7 +863,7 @@ static void rndis_set_multicast(struct work_struct *w) | |||
| 863 | if (flags & IFF_PROMISC) { | 863 | if (flags & IFF_PROMISC) { |
| 864 | filter = NDIS_PACKET_TYPE_PROMISCUOUS; | 864 | filter = NDIS_PACKET_TYPE_PROMISCUOUS; |
| 865 | } else { | 865 | } else { |
| 866 | if (flags & IFF_ALLMULTI) | 866 | if (!netdev_mc_empty(rdev->ndev) || (flags & IFF_ALLMULTI)) |
| 867 | filter |= NDIS_PACKET_TYPE_ALL_MULTICAST; | 867 | filter |= NDIS_PACKET_TYPE_ALL_MULTICAST; |
| 868 | if (flags & IFF_BROADCAST) | 868 | if (flags & IFF_BROADCAST) |
| 869 | filter |= NDIS_PACKET_TYPE_BROADCAST; | 869 | filter |= NDIS_PACKET_TYPE_BROADCAST; |
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 222093e878a8..a6c6ce19eeee 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
| @@ -1203,11 +1203,6 @@ static int team_port_add(struct team *team, struct net_device *port_dev, | |||
| 1203 | goto err_dev_open; | 1203 | goto err_dev_open; |
| 1204 | } | 1204 | } |
| 1205 | 1205 | ||
| 1206 | netif_addr_lock_bh(dev); | ||
| 1207 | dev_uc_sync_multiple(port_dev, dev); | ||
| 1208 | dev_mc_sync_multiple(port_dev, dev); | ||
| 1209 | netif_addr_unlock_bh(dev); | ||
| 1210 | |||
| 1211 | err = vlan_vids_add_by_dev(port_dev, dev); | 1206 | err = vlan_vids_add_by_dev(port_dev, dev); |
| 1212 | if (err) { | 1207 | if (err) { |
| 1213 | netdev_err(dev, "Failed to add vlan ids to device %s\n", | 1208 | netdev_err(dev, "Failed to add vlan ids to device %s\n", |
| @@ -1247,6 +1242,11 @@ static int team_port_add(struct team *team, struct net_device *port_dev, | |||
| 1247 | goto err_option_port_add; | 1242 | goto err_option_port_add; |
| 1248 | } | 1243 | } |
| 1249 | 1244 | ||
| 1245 | netif_addr_lock_bh(dev); | ||
| 1246 | dev_uc_sync_multiple(port_dev, dev); | ||
| 1247 | dev_mc_sync_multiple(port_dev, dev); | ||
| 1248 | netif_addr_unlock_bh(dev); | ||
| 1249 | |||
| 1250 | port->index = -1; | 1250 | port->index = -1; |
| 1251 | list_add_tail_rcu(&port->list, &team->port_list); | 1251 | list_add_tail_rcu(&port->list, &team->port_list); |
| 1252 | team_port_enable(team, port); | 1252 | team_port_enable(team, port); |
| @@ -1271,8 +1271,6 @@ err_enable_netpoll: | |||
| 1271 | vlan_vids_del_by_dev(port_dev, dev); | 1271 | vlan_vids_del_by_dev(port_dev, dev); |
| 1272 | 1272 | ||
| 1273 | err_vids_add: | 1273 | err_vids_add: |
| 1274 | dev_uc_unsync(port_dev, dev); | ||
| 1275 | dev_mc_unsync(port_dev, dev); | ||
| 1276 | dev_close(port_dev); | 1274 | dev_close(port_dev); |
| 1277 | 1275 | ||
| 1278 | err_dev_open: | 1276 | err_dev_open: |
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index 60a604cc7647..55a78eb96961 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c | |||
| @@ -2351,6 +2351,7 @@ static int lan78xx_reset(struct lan78xx_net *dev) | |||
| 2351 | u32 buf; | 2351 | u32 buf; |
| 2352 | int ret = 0; | 2352 | int ret = 0; |
| 2353 | unsigned long timeout; | 2353 | unsigned long timeout; |
| 2354 | u8 sig; | ||
| 2354 | 2355 | ||
| 2355 | ret = lan78xx_read_reg(dev, HW_CFG, &buf); | 2356 | ret = lan78xx_read_reg(dev, HW_CFG, &buf); |
| 2356 | buf |= HW_CFG_LRST_; | 2357 | buf |= HW_CFG_LRST_; |
| @@ -2450,6 +2451,15 @@ static int lan78xx_reset(struct lan78xx_net *dev) | |||
| 2450 | /* LAN7801 only has RGMII mode */ | 2451 | /* LAN7801 only has RGMII mode */ |
| 2451 | if (dev->chipid == ID_REV_CHIP_ID_7801_) | 2452 | if (dev->chipid == ID_REV_CHIP_ID_7801_) |
| 2452 | buf &= ~MAC_CR_GMII_EN_; | 2453 | buf &= ~MAC_CR_GMII_EN_; |
| 2454 | |||
| 2455 | if (dev->chipid == ID_REV_CHIP_ID_7800_) { | ||
| 2456 | ret = lan78xx_read_raw_eeprom(dev, 0, 1, &sig); | ||
| 2457 | if (!ret && sig != EEPROM_INDICATOR) { | ||
| 2458 | /* Implies there is no external eeprom. Set mac speed */ | ||
| 2459 | netdev_info(dev->net, "No External EEPROM. Setting MAC Speed\n"); | ||
| 2460 | buf |= MAC_CR_AUTO_DUPLEX_ | MAC_CR_AUTO_SPEED_; | ||
| 2461 | } | ||
| 2462 | } | ||
| 2453 | ret = lan78xx_write_reg(dev, MAC_CR, buf); | 2463 | ret = lan78xx_write_reg(dev, MAC_CR, buf); |
| 2454 | 2464 | ||
| 2455 | ret = lan78xx_read_reg(dev, MAC_TX, &buf); | 2465 | ret = lan78xx_read_reg(dev, MAC_TX, &buf); |
| @@ -2863,8 +2873,7 @@ static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf) | |||
| 2863 | if (ret < 0) { | 2873 | if (ret < 0) { |
| 2864 | netdev_warn(dev->net, | 2874 | netdev_warn(dev->net, |
| 2865 | "lan78xx_setup_irq_domain() failed : %d", ret); | 2875 | "lan78xx_setup_irq_domain() failed : %d", ret); |
| 2866 | kfree(pdata); | 2876 | goto out1; |
| 2867 | return ret; | ||
| 2868 | } | 2877 | } |
| 2869 | 2878 | ||
| 2870 | dev->net->hard_header_len += TX_OVERHEAD; | 2879 | dev->net->hard_header_len += TX_OVERHEAD; |
| @@ -2872,14 +2881,32 @@ static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf) | |||
| 2872 | 2881 | ||
| 2873 | /* Init all registers */ | 2882 | /* Init all registers */ |
| 2874 | ret = lan78xx_reset(dev); | 2883 | ret = lan78xx_reset(dev); |
| 2884 | if (ret) { | ||
| 2885 | netdev_warn(dev->net, "Registers INIT FAILED...."); | ||
| 2886 | goto out2; | ||
| 2887 | } | ||
| 2875 | 2888 | ||
| 2876 | ret = lan78xx_mdio_init(dev); | 2889 | ret = lan78xx_mdio_init(dev); |
| 2890 | if (ret) { | ||
| 2891 | netdev_warn(dev->net, "MDIO INIT FAILED....."); | ||
| 2892 | goto out2; | ||
| 2893 | } | ||
| 2877 | 2894 | ||
| 2878 | dev->net->flags |= IFF_MULTICAST; | 2895 | dev->net->flags |= IFF_MULTICAST; |
| 2879 | 2896 | ||
| 2880 | pdata->wol = WAKE_MAGIC; | 2897 | pdata->wol = WAKE_MAGIC; |
| 2881 | 2898 | ||
| 2882 | return ret; | 2899 | return ret; |
| 2900 | |||
| 2901 | out2: | ||
| 2902 | lan78xx_remove_irq_domain(dev); | ||
| 2903 | |||
| 2904 | out1: | ||
| 2905 | netdev_warn(dev->net, "Bind routine FAILED"); | ||
| 2906 | cancel_work_sync(&pdata->set_multicast); | ||
| 2907 | cancel_work_sync(&pdata->set_vlan); | ||
| 2908 | kfree(pdata); | ||
| 2909 | return ret; | ||
| 2883 | } | 2910 | } |
| 2884 | 2911 | ||
| 2885 | static void lan78xx_unbind(struct lan78xx_net *dev, struct usb_interface *intf) | 2912 | static void lan78xx_unbind(struct lan78xx_net *dev, struct usb_interface *intf) |
| @@ -2891,6 +2918,8 @@ static void lan78xx_unbind(struct lan78xx_net *dev, struct usb_interface *intf) | |||
| 2891 | lan78xx_remove_mdio(dev); | 2918 | lan78xx_remove_mdio(dev); |
| 2892 | 2919 | ||
| 2893 | if (pdata) { | 2920 | if (pdata) { |
| 2921 | cancel_work_sync(&pdata->set_multicast); | ||
| 2922 | cancel_work_sync(&pdata->set_vlan); | ||
| 2894 | netif_dbg(dev, ifdown, dev->net, "free pdata"); | 2923 | netif_dbg(dev, ifdown, dev->net, "free pdata"); |
| 2895 | kfree(pdata); | 2924 | kfree(pdata); |
| 2896 | pdata = NULL; | 2925 | pdata = NULL; |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 76ac48095c29..ca066b785e9f 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
| @@ -1104,6 +1104,9 @@ static const struct usb_device_id products[] = { | |||
| 1104 | {QMI_FIXED_INTF(0x0846, 0x68a2, 8)}, | 1104 | {QMI_FIXED_INTF(0x0846, 0x68a2, 8)}, |
| 1105 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ | 1105 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ |
| 1106 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ | 1106 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ |
| 1107 | {QMI_FIXED_INTF(0x1435, 0xd181, 3)}, /* Wistron NeWeb D18Q1 */ | ||
| 1108 | {QMI_FIXED_INTF(0x1435, 0xd181, 4)}, /* Wistron NeWeb D18Q1 */ | ||
| 1109 | {QMI_FIXED_INTF(0x1435, 0xd181, 5)}, /* Wistron NeWeb D18Q1 */ | ||
| 1107 | {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ | 1110 | {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ |
| 1108 | {QMI_FIXED_INTF(0x16d8, 0x6007, 0)}, /* CMOTech CHE-628S */ | 1111 | {QMI_FIXED_INTF(0x16d8, 0x6007, 0)}, /* CMOTech CHE-628S */ |
| 1109 | {QMI_FIXED_INTF(0x16d8, 0x6008, 0)}, /* CMOTech CMU-301 */ | 1112 | {QMI_FIXED_INTF(0x16d8, 0x6008, 0)}, /* CMOTech CMU-301 */ |
| @@ -1180,6 +1183,7 @@ static const struct usb_device_id products[] = { | |||
| 1180 | {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ | 1183 | {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ |
| 1181 | {QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */ | 1184 | {QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */ |
| 1182 | {QMI_FIXED_INTF(0x2001, 0x7e35, 4)}, /* D-Link DWM-222 */ | 1185 | {QMI_FIXED_INTF(0x2001, 0x7e35, 4)}, /* D-Link DWM-222 */ |
| 1186 | {QMI_FIXED_INTF(0x2020, 0x2033, 4)}, /* BroadMobi BM806U */ | ||
| 1183 | {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */ | 1187 | {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */ |
| 1184 | {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ | 1188 | {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ |
| 1185 | {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ | 1189 | {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ |
| @@ -1240,6 +1244,7 @@ static const struct usb_device_id products[] = { | |||
| 1240 | {QMI_FIXED_INTF(0x413c, 0x81b6, 8)}, /* Dell Wireless 5811e */ | 1244 | {QMI_FIXED_INTF(0x413c, 0x81b6, 8)}, /* Dell Wireless 5811e */ |
| 1241 | {QMI_FIXED_INTF(0x413c, 0x81b6, 10)}, /* Dell Wireless 5811e */ | 1245 | {QMI_FIXED_INTF(0x413c, 0x81b6, 10)}, /* Dell Wireless 5811e */ |
| 1242 | {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ | 1246 | {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ |
| 1247 | {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ | ||
| 1243 | {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ | 1248 | {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ |
| 1244 | {QMI_FIXED_INTF(0x1e0e, 0x9001, 5)}, /* SIMCom 7230E */ | 1249 | {QMI_FIXED_INTF(0x1e0e, 0x9001, 5)}, /* SIMCom 7230E */ |
| 1245 | {QMI_QUIRK_SET_DTR(0x2c7c, 0x0125, 4)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ | 1250 | {QMI_QUIRK_SET_DTR(0x2c7c, 0x0125, 4)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ |
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index 102582459bef..0a2b180d138a 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c | |||
| @@ -578,12 +578,13 @@ static int vrf_finish_output(struct net *net, struct sock *sk, struct sk_buff *s | |||
| 578 | if (!IS_ERR(neigh)) { | 578 | if (!IS_ERR(neigh)) { |
| 579 | sock_confirm_neigh(skb, neigh); | 579 | sock_confirm_neigh(skb, neigh); |
| 580 | ret = neigh_output(neigh, skb); | 580 | ret = neigh_output(neigh, skb); |
| 581 | rcu_read_unlock_bh(); | ||
| 582 | return ret; | ||
| 581 | } | 583 | } |
| 582 | 584 | ||
| 583 | rcu_read_unlock_bh(); | 585 | rcu_read_unlock_bh(); |
| 584 | err: | 586 | err: |
| 585 | if (unlikely(ret < 0)) | 587 | vrf_tx_error(skb->dev, skb); |
| 586 | vrf_tx_error(skb->dev, skb); | ||
| 587 | return ret; | 588 | return ret; |
| 588 | } | 589 | } |
| 589 | 590 | ||
diff --git a/drivers/pinctrl/samsung/pinctrl-exynos-arm.c b/drivers/pinctrl/samsung/pinctrl-exynos-arm.c index c32399faff57..90c274490181 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos-arm.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos-arm.c | |||
| @@ -124,7 +124,7 @@ static const struct samsung_pin_bank_data s5pv210_pin_bank[] __initconst = { | |||
| 124 | EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c), | 124 | EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c), |
| 125 | }; | 125 | }; |
| 126 | 126 | ||
| 127 | const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = { | 127 | static const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = { |
| 128 | { | 128 | { |
| 129 | /* pin-controller instance 0 data */ | 129 | /* pin-controller instance 0 data */ |
| 130 | .pin_banks = s5pv210_pin_bank, | 130 | .pin_banks = s5pv210_pin_bank, |
| @@ -137,6 +137,11 @@ const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = { | |||
| 137 | }, | 137 | }, |
| 138 | }; | 138 | }; |
| 139 | 139 | ||
| 140 | const struct samsung_pinctrl_of_match_data s5pv210_of_data __initconst = { | ||
| 141 | .ctrl = s5pv210_pin_ctrl, | ||
| 142 | .num_ctrl = ARRAY_SIZE(s5pv210_pin_ctrl), | ||
| 143 | }; | ||
| 144 | |||
| 140 | /* Pad retention control code for accessing PMU regmap */ | 145 | /* Pad retention control code for accessing PMU regmap */ |
| 141 | static atomic_t exynos_shared_retention_refcnt; | 146 | static atomic_t exynos_shared_retention_refcnt; |
| 142 | 147 | ||
| @@ -199,7 +204,7 @@ static const struct samsung_retention_data exynos3250_retention_data __initconst | |||
| 199 | * Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes | 204 | * Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes |
| 200 | * two gpio/pin-mux/pinconfig controllers. | 205 | * two gpio/pin-mux/pinconfig controllers. |
| 201 | */ | 206 | */ |
| 202 | const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = { | 207 | static const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = { |
| 203 | { | 208 | { |
| 204 | /* pin-controller instance 0 data */ | 209 | /* pin-controller instance 0 data */ |
| 205 | .pin_banks = exynos3250_pin_banks0, | 210 | .pin_banks = exynos3250_pin_banks0, |
| @@ -220,6 +225,11 @@ const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = { | |||
| 220 | }, | 225 | }, |
| 221 | }; | 226 | }; |
| 222 | 227 | ||
| 228 | const struct samsung_pinctrl_of_match_data exynos3250_of_data __initconst = { | ||
| 229 | .ctrl = exynos3250_pin_ctrl, | ||
| 230 | .num_ctrl = ARRAY_SIZE(exynos3250_pin_ctrl), | ||
| 231 | }; | ||
| 232 | |||
| 223 | /* pin banks of exynos4210 pin-controller 0 */ | 233 | /* pin banks of exynos4210 pin-controller 0 */ |
| 224 | static const struct samsung_pin_bank_data exynos4210_pin_banks0[] __initconst = { | 234 | static const struct samsung_pin_bank_data exynos4210_pin_banks0[] __initconst = { |
| 225 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), | 235 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), |
| @@ -303,7 +313,7 @@ static const struct samsung_retention_data exynos4_audio_retention_data __initco | |||
| 303 | * Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes | 313 | * Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes |
| 304 | * three gpio/pin-mux/pinconfig controllers. | 314 | * three gpio/pin-mux/pinconfig controllers. |
| 305 | */ | 315 | */ |
| 306 | const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = { | 316 | static const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = { |
| 307 | { | 317 | { |
| 308 | /* pin-controller instance 0 data */ | 318 | /* pin-controller instance 0 data */ |
| 309 | .pin_banks = exynos4210_pin_banks0, | 319 | .pin_banks = exynos4210_pin_banks0, |
| @@ -329,6 +339,11 @@ const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = { | |||
| 329 | }, | 339 | }, |
| 330 | }; | 340 | }; |
| 331 | 341 | ||
| 342 | const struct samsung_pinctrl_of_match_data exynos4210_of_data __initconst = { | ||
| 343 | .ctrl = exynos4210_pin_ctrl, | ||
| 344 | .num_ctrl = ARRAY_SIZE(exynos4210_pin_ctrl), | ||
| 345 | }; | ||
| 346 | |||
| 332 | /* pin banks of exynos4x12 pin-controller 0 */ | 347 | /* pin banks of exynos4x12 pin-controller 0 */ |
| 333 | static const struct samsung_pin_bank_data exynos4x12_pin_banks0[] __initconst = { | 348 | static const struct samsung_pin_bank_data exynos4x12_pin_banks0[] __initconst = { |
| 334 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), | 349 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), |
| @@ -391,7 +406,7 @@ static const struct samsung_pin_bank_data exynos4x12_pin_banks3[] __initconst = | |||
| 391 | * Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes | 406 | * Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes |
| 392 | * four gpio/pin-mux/pinconfig controllers. | 407 | * four gpio/pin-mux/pinconfig controllers. |
| 393 | */ | 408 | */ |
| 394 | const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = { | 409 | static const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = { |
| 395 | { | 410 | { |
| 396 | /* pin-controller instance 0 data */ | 411 | /* pin-controller instance 0 data */ |
| 397 | .pin_banks = exynos4x12_pin_banks0, | 412 | .pin_banks = exynos4x12_pin_banks0, |
| @@ -427,6 +442,11 @@ const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = { | |||
| 427 | }, | 442 | }, |
| 428 | }; | 443 | }; |
| 429 | 444 | ||
| 445 | const struct samsung_pinctrl_of_match_data exynos4x12_of_data __initconst = { | ||
| 446 | .ctrl = exynos4x12_pin_ctrl, | ||
| 447 | .num_ctrl = ARRAY_SIZE(exynos4x12_pin_ctrl), | ||
| 448 | }; | ||
| 449 | |||
| 430 | /* pin banks of exynos5250 pin-controller 0 */ | 450 | /* pin banks of exynos5250 pin-controller 0 */ |
| 431 | static const struct samsung_pin_bank_data exynos5250_pin_banks0[] __initconst = { | 451 | static const struct samsung_pin_bank_data exynos5250_pin_banks0[] __initconst = { |
| 432 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), | 452 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), |
| @@ -487,7 +507,7 @@ static const struct samsung_pin_bank_data exynos5250_pin_banks3[] __initconst = | |||
| 487 | * Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes | 507 | * Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes |
| 488 | * four gpio/pin-mux/pinconfig controllers. | 508 | * four gpio/pin-mux/pinconfig controllers. |
| 489 | */ | 509 | */ |
| 490 | const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = { | 510 | static const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = { |
| 491 | { | 511 | { |
| 492 | /* pin-controller instance 0 data */ | 512 | /* pin-controller instance 0 data */ |
| 493 | .pin_banks = exynos5250_pin_banks0, | 513 | .pin_banks = exynos5250_pin_banks0, |
| @@ -523,6 +543,11 @@ const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = { | |||
| 523 | }, | 543 | }, |
| 524 | }; | 544 | }; |
| 525 | 545 | ||
| 546 | const struct samsung_pinctrl_of_match_data exynos5250_of_data __initconst = { | ||
| 547 | .ctrl = exynos5250_pin_ctrl, | ||
| 548 | .num_ctrl = ARRAY_SIZE(exynos5250_pin_ctrl), | ||
| 549 | }; | ||
| 550 | |||
| 526 | /* pin banks of exynos5260 pin-controller 0 */ | 551 | /* pin banks of exynos5260 pin-controller 0 */ |
| 527 | static const struct samsung_pin_bank_data exynos5260_pin_banks0[] __initconst = { | 552 | static const struct samsung_pin_bank_data exynos5260_pin_banks0[] __initconst = { |
| 528 | EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpa0", 0x00), | 553 | EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpa0", 0x00), |
| @@ -567,7 +592,7 @@ static const struct samsung_pin_bank_data exynos5260_pin_banks2[] __initconst = | |||
| 567 | * Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes | 592 | * Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes |
| 568 | * three gpio/pin-mux/pinconfig controllers. | 593 | * three gpio/pin-mux/pinconfig controllers. |
| 569 | */ | 594 | */ |
| 570 | const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = { | 595 | static const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = { |
| 571 | { | 596 | { |
| 572 | /* pin-controller instance 0 data */ | 597 | /* pin-controller instance 0 data */ |
| 573 | .pin_banks = exynos5260_pin_banks0, | 598 | .pin_banks = exynos5260_pin_banks0, |
| @@ -587,6 +612,11 @@ const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = { | |||
| 587 | }, | 612 | }, |
| 588 | }; | 613 | }; |
| 589 | 614 | ||
| 615 | const struct samsung_pinctrl_of_match_data exynos5260_of_data __initconst = { | ||
| 616 | .ctrl = exynos5260_pin_ctrl, | ||
| 617 | .num_ctrl = ARRAY_SIZE(exynos5260_pin_ctrl), | ||
| 618 | }; | ||
| 619 | |||
| 590 | /* pin banks of exynos5410 pin-controller 0 */ | 620 | /* pin banks of exynos5410 pin-controller 0 */ |
| 591 | static const struct samsung_pin_bank_data exynos5410_pin_banks0[] __initconst = { | 621 | static const struct samsung_pin_bank_data exynos5410_pin_banks0[] __initconst = { |
| 592 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), | 622 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), |
| @@ -657,7 +687,7 @@ static const struct samsung_pin_bank_data exynos5410_pin_banks3[] __initconst = | |||
| 657 | * Samsung pinctrl driver data for Exynos5410 SoC. Exynos5410 SoC includes | 687 | * Samsung pinctrl driver data for Exynos5410 SoC. Exynos5410 SoC includes |
| 658 | * four gpio/pin-mux/pinconfig controllers. | 688 | * four gpio/pin-mux/pinconfig controllers. |
| 659 | */ | 689 | */ |
| 660 | const struct samsung_pin_ctrl exynos5410_pin_ctrl[] __initconst = { | 690 | static const struct samsung_pin_ctrl exynos5410_pin_ctrl[] __initconst = { |
| 661 | { | 691 | { |
| 662 | /* pin-controller instance 0 data */ | 692 | /* pin-controller instance 0 data */ |
| 663 | .pin_banks = exynos5410_pin_banks0, | 693 | .pin_banks = exynos5410_pin_banks0, |
| @@ -690,6 +720,11 @@ const struct samsung_pin_ctrl exynos5410_pin_ctrl[] __initconst = { | |||
| 690 | }, | 720 | }, |
| 691 | }; | 721 | }; |
| 692 | 722 | ||
| 723 | const struct samsung_pinctrl_of_match_data exynos5410_of_data __initconst = { | ||
| 724 | .ctrl = exynos5410_pin_ctrl, | ||
| 725 | .num_ctrl = ARRAY_SIZE(exynos5410_pin_ctrl), | ||
| 726 | }; | ||
| 727 | |||
| 693 | /* pin banks of exynos5420 pin-controller 0 */ | 728 | /* pin banks of exynos5420 pin-controller 0 */ |
| 694 | static const struct samsung_pin_bank_data exynos5420_pin_banks0[] __initconst = { | 729 | static const struct samsung_pin_bank_data exynos5420_pin_banks0[] __initconst = { |
| 695 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00), | 730 | EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00), |
| @@ -774,7 +809,7 @@ static const struct samsung_retention_data exynos5420_retention_data __initconst | |||
| 774 | * Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes | 809 | * Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes |
| 775 | * four gpio/pin-mux/pinconfig controllers. | 810 | * four gpio/pin-mux/pinconfig controllers. |
| 776 | */ | 811 | */ |
| 777 | const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = { | 812 | static const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = { |
| 778 | { | 813 | { |
| 779 | /* pin-controller instance 0 data */ | 814 | /* pin-controller instance 0 data */ |
| 780 | .pin_banks = exynos5420_pin_banks0, | 815 | .pin_banks = exynos5420_pin_banks0, |
| @@ -808,3 +843,8 @@ const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = { | |||
| 808 | .retention_data = &exynos4_audio_retention_data, | 843 | .retention_data = &exynos4_audio_retention_data, |
| 809 | }, | 844 | }, |
| 810 | }; | 845 | }; |
| 846 | |||
| 847 | const struct samsung_pinctrl_of_match_data exynos5420_of_data __initconst = { | ||
| 848 | .ctrl = exynos5420_pin_ctrl, | ||
| 849 | .num_ctrl = ARRAY_SIZE(exynos5420_pin_ctrl), | ||
| 850 | }; | ||
diff --git a/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c b/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c index fc8f7833bec0..71c9d1d9f345 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos-arm64.c | |||
| @@ -175,7 +175,7 @@ static const struct samsung_retention_data exynos5433_fsys_retention_data __init | |||
| 175 | * Samsung pinctrl driver data for Exynos5433 SoC. Exynos5433 SoC includes | 175 | * Samsung pinctrl driver data for Exynos5433 SoC. Exynos5433 SoC includes |
| 176 | * ten gpio/pin-mux/pinconfig controllers. | 176 | * ten gpio/pin-mux/pinconfig controllers. |
| 177 | */ | 177 | */ |
| 178 | const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = { | 178 | static const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = { |
| 179 | { | 179 | { |
| 180 | /* pin-controller instance 0 data */ | 180 | /* pin-controller instance 0 data */ |
| 181 | .pin_banks = exynos5433_pin_banks0, | 181 | .pin_banks = exynos5433_pin_banks0, |
| @@ -260,6 +260,11 @@ const struct samsung_pin_ctrl exynos5433_pin_ctrl[] __initconst = { | |||
| 260 | }, | 260 | }, |
| 261 | }; | 261 | }; |
| 262 | 262 | ||
| 263 | const struct samsung_pinctrl_of_match_data exynos5433_of_data __initconst = { | ||
| 264 | .ctrl = exynos5433_pin_ctrl, | ||
| 265 | .num_ctrl = ARRAY_SIZE(exynos5433_pin_ctrl), | ||
| 266 | }; | ||
| 267 | |||
| 263 | /* pin banks of exynos7 pin-controller - ALIVE */ | 268 | /* pin banks of exynos7 pin-controller - ALIVE */ |
| 264 | static const struct samsung_pin_bank_data exynos7_pin_banks0[] __initconst = { | 269 | static const struct samsung_pin_bank_data exynos7_pin_banks0[] __initconst = { |
| 265 | EXYNOS_PIN_BANK_EINTW(8, 0x000, "gpa0", 0x00), | 270 | EXYNOS_PIN_BANK_EINTW(8, 0x000, "gpa0", 0x00), |
| @@ -339,7 +344,7 @@ static const struct samsung_pin_bank_data exynos7_pin_banks9[] __initconst = { | |||
| 339 | EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04), | 344 | EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04), |
| 340 | }; | 345 | }; |
| 341 | 346 | ||
| 342 | const struct samsung_pin_ctrl exynos7_pin_ctrl[] __initconst = { | 347 | static const struct samsung_pin_ctrl exynos7_pin_ctrl[] __initconst = { |
| 343 | { | 348 | { |
| 344 | /* pin-controller instance 0 Alive data */ | 349 | /* pin-controller instance 0 Alive data */ |
| 345 | .pin_banks = exynos7_pin_banks0, | 350 | .pin_banks = exynos7_pin_banks0, |
| @@ -392,3 +397,8 @@ const struct samsung_pin_ctrl exynos7_pin_ctrl[] __initconst = { | |||
| 392 | .eint_gpio_init = exynos_eint_gpio_init, | 397 | .eint_gpio_init = exynos_eint_gpio_init, |
| 393 | }, | 398 | }, |
| 394 | }; | 399 | }; |
| 400 | |||
| 401 | const struct samsung_pinctrl_of_match_data exynos7_of_data __initconst = { | ||
| 402 | .ctrl = exynos7_pin_ctrl, | ||
| 403 | .num_ctrl = ARRAY_SIZE(exynos7_pin_ctrl), | ||
| 404 | }; | ||
diff --git a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c index 10187cb0e9b9..7e824e4d20f4 100644 --- a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c +++ b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c | |||
| @@ -565,7 +565,7 @@ static const struct samsung_pin_bank_data s3c2412_pin_banks[] __initconst = { | |||
| 565 | PIN_BANK_2BIT(13, 0x080, "gpj"), | 565 | PIN_BANK_2BIT(13, 0x080, "gpj"), |
| 566 | }; | 566 | }; |
| 567 | 567 | ||
| 568 | const struct samsung_pin_ctrl s3c2412_pin_ctrl[] __initconst = { | 568 | static const struct samsung_pin_ctrl s3c2412_pin_ctrl[] __initconst = { |
| 569 | { | 569 | { |
| 570 | .pin_banks = s3c2412_pin_banks, | 570 | .pin_banks = s3c2412_pin_banks, |
| 571 | .nr_banks = ARRAY_SIZE(s3c2412_pin_banks), | 571 | .nr_banks = ARRAY_SIZE(s3c2412_pin_banks), |
| @@ -573,6 +573,11 @@ const struct samsung_pin_ctrl s3c2412_pin_ctrl[] __initconst = { | |||
| 573 | }, | 573 | }, |
| 574 | }; | 574 | }; |
| 575 | 575 | ||
| 576 | const struct samsung_pinctrl_of_match_data s3c2412_of_data __initconst = { | ||
| 577 | .ctrl = s3c2412_pin_ctrl, | ||
| 578 | .num_ctrl = ARRAY_SIZE(s3c2412_pin_ctrl), | ||
| 579 | }; | ||
| 580 | |||
| 576 | static const struct samsung_pin_bank_data s3c2416_pin_banks[] __initconst = { | 581 | static const struct samsung_pin_bank_data s3c2416_pin_banks[] __initconst = { |
| 577 | PIN_BANK_A(27, 0x000, "gpa"), | 582 | PIN_BANK_A(27, 0x000, "gpa"), |
| 578 | PIN_BANK_2BIT(11, 0x010, "gpb"), | 583 | PIN_BANK_2BIT(11, 0x010, "gpb"), |
| @@ -587,7 +592,7 @@ static const struct samsung_pin_bank_data s3c2416_pin_banks[] __initconst = { | |||
| 587 | PIN_BANK_2BIT(2, 0x100, "gpm"), | 592 | PIN_BANK_2BIT(2, 0x100, "gpm"), |
| 588 | }; | 593 | }; |
| 589 | 594 | ||
| 590 | const struct samsung_pin_ctrl s3c2416_pin_ctrl[] __initconst = { | 595 | static const struct samsung_pin_ctrl s3c2416_pin_ctrl[] __initconst = { |
| 591 | { | 596 | { |
| 592 | .pin_banks = s3c2416_pin_banks, | 597 | .pin_banks = s3c2416_pin_banks, |
| 593 | .nr_banks = ARRAY_SIZE(s3c2416_pin_banks), | 598 | .nr_banks = ARRAY_SIZE(s3c2416_pin_banks), |
| @@ -595,6 +600,11 @@ const struct samsung_pin_ctrl s3c2416_pin_ctrl[] __initconst = { | |||
| 595 | }, | 600 | }, |
| 596 | }; | 601 | }; |
| 597 | 602 | ||
| 603 | const struct samsung_pinctrl_of_match_data s3c2416_of_data __initconst = { | ||
| 604 | .ctrl = s3c2416_pin_ctrl, | ||
| 605 | .num_ctrl = ARRAY_SIZE(s3c2416_pin_ctrl), | ||
| 606 | }; | ||
| 607 | |||
| 598 | static const struct samsung_pin_bank_data s3c2440_pin_banks[] __initconst = { | 608 | static const struct samsung_pin_bank_data s3c2440_pin_banks[] __initconst = { |
| 599 | PIN_BANK_A(25, 0x000, "gpa"), | 609 | PIN_BANK_A(25, 0x000, "gpa"), |
| 600 | PIN_BANK_2BIT(11, 0x010, "gpb"), | 610 | PIN_BANK_2BIT(11, 0x010, "gpb"), |
| @@ -607,7 +617,7 @@ static const struct samsung_pin_bank_data s3c2440_pin_banks[] __initconst = { | |||
| 607 | PIN_BANK_2BIT(13, 0x0d0, "gpj"), | 617 | PIN_BANK_2BIT(13, 0x0d0, "gpj"), |
| 608 | }; | 618 | }; |
| 609 | 619 | ||
| 610 | const struct samsung_pin_ctrl s3c2440_pin_ctrl[] __initconst = { | 620 | static const struct samsung_pin_ctrl s3c2440_pin_ctrl[] __initconst = { |
| 611 | { | 621 | { |
| 612 | .pin_banks = s3c2440_pin_banks, | 622 | .pin_banks = s3c2440_pin_banks, |
| 613 | .nr_banks = ARRAY_SIZE(s3c2440_pin_banks), | 623 | .nr_banks = ARRAY_SIZE(s3c2440_pin_banks), |
| @@ -615,6 +625,11 @@ const struct samsung_pin_ctrl s3c2440_pin_ctrl[] __initconst = { | |||
| 615 | }, | 625 | }, |
| 616 | }; | 626 | }; |
| 617 | 627 | ||
| 628 | const struct samsung_pinctrl_of_match_data s3c2440_of_data __initconst = { | ||
| 629 | .ctrl = s3c2440_pin_ctrl, | ||
| 630 | .num_ctrl = ARRAY_SIZE(s3c2440_pin_ctrl), | ||
| 631 | }; | ||
| 632 | |||
| 618 | static const struct samsung_pin_bank_data s3c2450_pin_banks[] __initconst = { | 633 | static const struct samsung_pin_bank_data s3c2450_pin_banks[] __initconst = { |
| 619 | PIN_BANK_A(28, 0x000, "gpa"), | 634 | PIN_BANK_A(28, 0x000, "gpa"), |
| 620 | PIN_BANK_2BIT(11, 0x010, "gpb"), | 635 | PIN_BANK_2BIT(11, 0x010, "gpb"), |
| @@ -630,10 +645,15 @@ static const struct samsung_pin_bank_data s3c2450_pin_banks[] __initconst = { | |||
| 630 | PIN_BANK_2BIT(2, 0x100, "gpm"), | 645 | PIN_BANK_2BIT(2, 0x100, "gpm"), |
| 631 | }; | 646 | }; |
| 632 | 647 | ||
| 633 | const struct samsung_pin_ctrl s3c2450_pin_ctrl[] __initconst = { | 648 | static const struct samsung_pin_ctrl s3c2450_pin_ctrl[] __initconst = { |
| 634 | { | 649 | { |
| 635 | .pin_banks = s3c2450_pin_banks, | 650 | .pin_banks = s3c2450_pin_banks, |
| 636 | .nr_banks = ARRAY_SIZE(s3c2450_pin_banks), | 651 | .nr_banks = ARRAY_SIZE(s3c2450_pin_banks), |
| 637 | .eint_wkup_init = s3c24xx_eint_init, | 652 | .eint_wkup_init = s3c24xx_eint_init, |
| 638 | }, | 653 | }, |
| 639 | }; | 654 | }; |
| 655 | |||
| 656 | const struct samsung_pinctrl_of_match_data s3c2450_of_data __initconst = { | ||
| 657 | .ctrl = s3c2450_pin_ctrl, | ||
| 658 | .num_ctrl = ARRAY_SIZE(s3c2450_pin_ctrl), | ||
| 659 | }; | ||
diff --git a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c index 679628ac4b31..288e6567ceb1 100644 --- a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c +++ b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c | |||
| @@ -789,7 +789,7 @@ static const struct samsung_pin_bank_data s3c64xx_pin_banks0[] __initconst = { | |||
| 789 | * Samsung pinctrl driver data for S3C64xx SoC. S3C64xx SoC includes | 789 | * Samsung pinctrl driver data for S3C64xx SoC. S3C64xx SoC includes |
| 790 | * one gpio/pin-mux/pinconfig controller. | 790 | * one gpio/pin-mux/pinconfig controller. |
| 791 | */ | 791 | */ |
| 792 | const struct samsung_pin_ctrl s3c64xx_pin_ctrl[] __initconst = { | 792 | static const struct samsung_pin_ctrl s3c64xx_pin_ctrl[] __initconst = { |
| 793 | { | 793 | { |
| 794 | /* pin-controller instance 1 data */ | 794 | /* pin-controller instance 1 data */ |
| 795 | .pin_banks = s3c64xx_pin_banks0, | 795 | .pin_banks = s3c64xx_pin_banks0, |
| @@ -798,3 +798,8 @@ const struct samsung_pin_ctrl s3c64xx_pin_ctrl[] __initconst = { | |||
| 798 | .eint_wkup_init = s3c64xx_eint_eint0_init, | 798 | .eint_wkup_init = s3c64xx_eint_eint0_init, |
| 799 | }, | 799 | }, |
| 800 | }; | 800 | }; |
| 801 | |||
| 802 | const struct samsung_pinctrl_of_match_data s3c64xx_of_data __initconst = { | ||
| 803 | .ctrl = s3c64xx_pin_ctrl, | ||
| 804 | .num_ctrl = ARRAY_SIZE(s3c64xx_pin_ctrl), | ||
| 805 | }; | ||
diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c index da58e4554137..336e88d7bdb9 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.c +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c | |||
| @@ -942,12 +942,33 @@ static int samsung_gpiolib_register(struct platform_device *pdev, | |||
| 942 | return 0; | 942 | return 0; |
| 943 | } | 943 | } |
| 944 | 944 | ||
| 945 | static const struct samsung_pin_ctrl * | ||
| 946 | samsung_pinctrl_get_soc_data_for_of_alias(struct platform_device *pdev) | ||
| 947 | { | ||
| 948 | struct device_node *node = pdev->dev.of_node; | ||
| 949 | const struct samsung_pinctrl_of_match_data *of_data; | ||
| 950 | int id; | ||
| 951 | |||
| 952 | id = of_alias_get_id(node, "pinctrl"); | ||
| 953 | if (id < 0) { | ||
| 954 | dev_err(&pdev->dev, "failed to get alias id\n"); | ||
| 955 | return NULL; | ||
| 956 | } | ||
| 957 | |||
| 958 | of_data = of_device_get_match_data(&pdev->dev); | ||
| 959 | if (id >= of_data->num_ctrl) { | ||
| 960 | dev_err(&pdev->dev, "invalid alias id %d\n", id); | ||
| 961 | return NULL; | ||
| 962 | } | ||
| 963 | |||
| 964 | return &(of_data->ctrl[id]); | ||
| 965 | } | ||
| 966 | |||
| 945 | /* retrieve the soc specific data */ | 967 | /* retrieve the soc specific data */ |
| 946 | static const struct samsung_pin_ctrl * | 968 | static const struct samsung_pin_ctrl * |
| 947 | samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d, | 969 | samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d, |
| 948 | struct platform_device *pdev) | 970 | struct platform_device *pdev) |
| 949 | { | 971 | { |
| 950 | int id; | ||
| 951 | struct device_node *node = pdev->dev.of_node; | 972 | struct device_node *node = pdev->dev.of_node; |
| 952 | struct device_node *np; | 973 | struct device_node *np; |
| 953 | const struct samsung_pin_bank_data *bdata; | 974 | const struct samsung_pin_bank_data *bdata; |
| @@ -957,13 +978,9 @@ samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d, | |||
| 957 | void __iomem *virt_base[SAMSUNG_PINCTRL_NUM_RESOURCES]; | 978 | void __iomem *virt_base[SAMSUNG_PINCTRL_NUM_RESOURCES]; |
| 958 | unsigned int i; | 979 | unsigned int i; |
| 959 | 980 | ||
| 960 | id = of_alias_get_id(node, "pinctrl"); | 981 | ctrl = samsung_pinctrl_get_soc_data_for_of_alias(pdev); |
| 961 | if (id < 0) { | 982 | if (!ctrl) |
| 962 | dev_err(&pdev->dev, "failed to get alias id\n"); | ||
| 963 | return ERR_PTR(-ENOENT); | 983 | return ERR_PTR(-ENOENT); |
| 964 | } | ||
| 965 | ctrl = of_device_get_match_data(&pdev->dev); | ||
| 966 | ctrl += id; | ||
| 967 | 984 | ||
| 968 | d->suspend = ctrl->suspend; | 985 | d->suspend = ctrl->suspend; |
| 969 | d->resume = ctrl->resume; | 986 | d->resume = ctrl->resume; |
| @@ -1188,41 +1205,41 @@ static int __maybe_unused samsung_pinctrl_resume(struct device *dev) | |||
| 1188 | static const struct of_device_id samsung_pinctrl_dt_match[] = { | 1205 | static const struct of_device_id samsung_pinctrl_dt_match[] = { |
| 1189 | #ifdef CONFIG_PINCTRL_EXYNOS_ARM | 1206 | #ifdef CONFIG_PINCTRL_EXYNOS_ARM |
| 1190 | { .compatible = "samsung,exynos3250-pinctrl", | 1207 | { .compatible = "samsung,exynos3250-pinctrl", |
| 1191 | .data = exynos3250_pin_ctrl }, | 1208 | .data = &exynos3250_of_data }, |
| 1192 | { .compatible = "samsung,exynos4210-pinctrl", | 1209 | { .compatible = "samsung,exynos4210-pinctrl", |
| 1193 | .data = exynos4210_pin_ctrl }, | 1210 | .data = &exynos4210_of_data }, |
| 1194 | { .compatible = "samsung,exynos4x12-pinctrl", | 1211 | { .compatible = "samsung,exynos4x12-pinctrl", |
| 1195 | .data = exynos4x12_pin_ctrl }, | 1212 | .data = &exynos4x12_of_data }, |
| 1196 | { .compatible = "samsung,exynos5250-pinctrl", | 1213 | { .compatible = "samsung,exynos5250-pinctrl", |
| 1197 | .data = exynos5250_pin_ctrl }, | 1214 | .data = &exynos5250_of_data }, |
| 1198 | { .compatible = "samsung,exynos5260-pinctrl", | 1215 | { .compatible = "samsung,exynos5260-pinctrl", |
| 1199 | .data = exynos5260_pin_ctrl }, | 1216 | .data = &exynos5260_of_data }, |
| 1200 | { .compatible = "samsung,exynos5410-pinctrl", | 1217 | { .compatible = "samsung,exynos5410-pinctrl", |
| 1201 | .data = exynos5410_pin_ctrl }, | 1218 | .data = &exynos5410_of_data }, |
| 1202 | { .compatible = "samsung,exynos5420-pinctrl", | 1219 | { .compatible = "samsung,exynos5420-pinctrl", |
| 1203 | .data = exynos5420_pin_ctrl }, | 1220 | .data = &exynos5420_of_data }, |
| 1204 | { .compatible = "samsung,s5pv210-pinctrl", | 1221 | { .compatible = "samsung,s5pv210-pinctrl", |
| 1205 | .data = s5pv210_pin_ctrl }, | 1222 | .data = &s5pv210_of_data }, |
| 1206 | #endif | 1223 | #endif |
| 1207 | #ifdef CONFIG_PINCTRL_EXYNOS_ARM64 | 1224 | #ifdef CONFIG_PINCTRL_EXYNOS_ARM64 |
| 1208 | { .compatible = "samsung,exynos5433-pinctrl", | 1225 | { .compatible = "samsung,exynos5433-pinctrl", |
| 1209 | .data = exynos5433_pin_ctrl }, | 1226 | .data = &exynos5433_of_data }, |
| 1210 | { .compatible = "samsung,exynos7-pinctrl", | 1227 | { .compatible = "samsung,exynos7-pinctrl", |
| 1211 | .data = exynos7_pin_ctrl }, | 1228 | .data = &exynos7_of_data }, |
| 1212 | #endif | 1229 | #endif |
| 1213 | #ifdef CONFIG_PINCTRL_S3C64XX | 1230 | #ifdef CONFIG_PINCTRL_S3C64XX |
| 1214 | { .compatible = "samsung,s3c64xx-pinctrl", | 1231 | { .compatible = "samsung,s3c64xx-pinctrl", |
| 1215 | .data = s3c64xx_pin_ctrl }, | 1232 | .data = &s3c64xx_of_data }, |
| 1216 | #endif | 1233 | #endif |
| 1217 | #ifdef CONFIG_PINCTRL_S3C24XX | 1234 | #ifdef CONFIG_PINCTRL_S3C24XX |
| 1218 | { .compatible = "samsung,s3c2412-pinctrl", | 1235 | { .compatible = "samsung,s3c2412-pinctrl", |
| 1219 | .data = s3c2412_pin_ctrl }, | 1236 | .data = &s3c2412_of_data }, |
| 1220 | { .compatible = "samsung,s3c2416-pinctrl", | 1237 | { .compatible = "samsung,s3c2416-pinctrl", |
| 1221 | .data = s3c2416_pin_ctrl }, | 1238 | .data = &s3c2416_of_data }, |
| 1222 | { .compatible = "samsung,s3c2440-pinctrl", | 1239 | { .compatible = "samsung,s3c2440-pinctrl", |
| 1223 | .data = s3c2440_pin_ctrl }, | 1240 | .data = &s3c2440_of_data }, |
| 1224 | { .compatible = "samsung,s3c2450-pinctrl", | 1241 | { .compatible = "samsung,s3c2450-pinctrl", |
| 1225 | .data = s3c2450_pin_ctrl }, | 1242 | .data = &s3c2450_of_data }, |
| 1226 | #endif | 1243 | #endif |
| 1227 | {}, | 1244 | {}, |
| 1228 | }; | 1245 | }; |
diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.h b/drivers/pinctrl/samsung/pinctrl-samsung.h index e204f609823b..f0cda9424dfe 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.h +++ b/drivers/pinctrl/samsung/pinctrl-samsung.h | |||
| @@ -282,6 +282,16 @@ struct samsung_pinctrl_drv_data { | |||
| 282 | }; | 282 | }; |
| 283 | 283 | ||
| 284 | /** | 284 | /** |
| 285 | * struct samsung_pinctrl_of_match_data: OF match device specific configuration data. | ||
| 286 | * @ctrl: array of pin controller data. | ||
| 287 | * @num_ctrl: size of array @ctrl. | ||
| 288 | */ | ||
| 289 | struct samsung_pinctrl_of_match_data { | ||
| 290 | const struct samsung_pin_ctrl *ctrl; | ||
| 291 | unsigned int num_ctrl; | ||
| 292 | }; | ||
| 293 | |||
| 294 | /** | ||
| 285 | * struct samsung_pin_group: represent group of pins of a pinmux function. | 295 | * struct samsung_pin_group: represent group of pins of a pinmux function. |
| 286 | * @name: name of the pin group, used to lookup the group. | 296 | * @name: name of the pin group, used to lookup the group. |
| 287 | * @pins: the pins included in this group. | 297 | * @pins: the pins included in this group. |
| @@ -309,20 +319,20 @@ struct samsung_pmx_func { | |||
| 309 | }; | 319 | }; |
| 310 | 320 | ||
| 311 | /* list of all exported SoC specific data */ | 321 | /* list of all exported SoC specific data */ |
| 312 | extern const struct samsung_pin_ctrl exynos3250_pin_ctrl[]; | 322 | extern const struct samsung_pinctrl_of_match_data exynos3250_of_data; |
| 313 | extern const struct samsung_pin_ctrl exynos4210_pin_ctrl[]; | 323 | extern const struct samsung_pinctrl_of_match_data exynos4210_of_data; |
| 314 | extern const struct samsung_pin_ctrl exynos4x12_pin_ctrl[]; | 324 | extern const struct samsung_pinctrl_of_match_data exynos4x12_of_data; |
| 315 | extern const struct samsung_pin_ctrl exynos5250_pin_ctrl[]; | 325 | extern const struct samsung_pinctrl_of_match_data exynos5250_of_data; |
| 316 | extern const struct samsung_pin_ctrl exynos5260_pin_ctrl[]; | 326 | extern const struct samsung_pinctrl_of_match_data exynos5260_of_data; |
| 317 | extern const struct samsung_pin_ctrl exynos5410_pin_ctrl[]; | 327 | extern const struct samsung_pinctrl_of_match_data exynos5410_of_data; |
| 318 | extern const struct samsung_pin_ctrl exynos5420_pin_ctrl[]; | 328 | extern const struct samsung_pinctrl_of_match_data exynos5420_of_data; |
| 319 | extern const struct samsung_pin_ctrl exynos5433_pin_ctrl[]; | 329 | extern const struct samsung_pinctrl_of_match_data exynos5433_of_data; |
| 320 | extern const struct samsung_pin_ctrl exynos7_pin_ctrl[]; | 330 | extern const struct samsung_pinctrl_of_match_data exynos7_of_data; |
| 321 | extern const struct samsung_pin_ctrl s3c64xx_pin_ctrl[]; | 331 | extern const struct samsung_pinctrl_of_match_data s3c64xx_of_data; |
| 322 | extern const struct samsung_pin_ctrl s3c2412_pin_ctrl[]; | 332 | extern const struct samsung_pinctrl_of_match_data s3c2412_of_data; |
| 323 | extern const struct samsung_pin_ctrl s3c2416_pin_ctrl[]; | 333 | extern const struct samsung_pinctrl_of_match_data s3c2416_of_data; |
| 324 | extern const struct samsung_pin_ctrl s3c2440_pin_ctrl[]; | 334 | extern const struct samsung_pinctrl_of_match_data s3c2440_of_data; |
| 325 | extern const struct samsung_pin_ctrl s3c2450_pin_ctrl[]; | 335 | extern const struct samsung_pinctrl_of_match_data s3c2450_of_data; |
| 326 | extern const struct samsung_pin_ctrl s5pv210_pin_ctrl[]; | 336 | extern const struct samsung_pinctrl_of_match_data s5pv210_of_data; |
| 327 | 337 | ||
| 328 | #endif /* __PINCTRL_SAMSUNG_H */ | 338 | #endif /* __PINCTRL_SAMSUNG_H */ |
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c index 18aeee592fdc..35951e7b89d2 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7795.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7795.c | |||
| @@ -1538,7 +1538,6 @@ static const struct sh_pfc_pin pinmux_pins[] = { | |||
| 1538 | SH_PFC_PIN_NAMED_CFG('B', 18, AVB_TD1, CFG_FLAGS), | 1538 | SH_PFC_PIN_NAMED_CFG('B', 18, AVB_TD1, CFG_FLAGS), |
| 1539 | SH_PFC_PIN_NAMED_CFG('B', 19, AVB_RXC, CFG_FLAGS), | 1539 | SH_PFC_PIN_NAMED_CFG('B', 19, AVB_RXC, CFG_FLAGS), |
| 1540 | SH_PFC_PIN_NAMED_CFG('C', 1, PRESETOUT#, CFG_FLAGS), | 1540 | SH_PFC_PIN_NAMED_CFG('C', 1, PRESETOUT#, CFG_FLAGS), |
| 1541 | SH_PFC_PIN_NAMED_CFG('F', 1, CLKOUT, CFG_FLAGS), | ||
| 1542 | SH_PFC_PIN_NAMED_CFG('H', 37, MLB_REF, CFG_FLAGS), | 1541 | SH_PFC_PIN_NAMED_CFG('H', 37, MLB_REF, CFG_FLAGS), |
| 1543 | SH_PFC_PIN_NAMED_CFG('V', 3, QSPI1_SPCLK, CFG_FLAGS), | 1542 | SH_PFC_PIN_NAMED_CFG('V', 3, QSPI1_SPCLK, CFG_FLAGS), |
| 1544 | SH_PFC_PIN_NAMED_CFG('V', 5, QSPI1_SSL, CFG_FLAGS), | 1543 | SH_PFC_PIN_NAMED_CFG('V', 5, QSPI1_SSL, CFG_FLAGS), |
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index dd9464920456..ef22b275d050 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c | |||
| @@ -474,6 +474,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) | |||
| 474 | shost->dma_boundary = 0xffffffff; | 474 | shost->dma_boundary = 0xffffffff; |
| 475 | 475 | ||
| 476 | shost->use_blk_mq = scsi_use_blk_mq; | 476 | shost->use_blk_mq = scsi_use_blk_mq; |
| 477 | shost->use_blk_mq = scsi_use_blk_mq || shost->hostt->force_blk_mq; | ||
| 477 | 478 | ||
| 478 | device_initialize(&shost->shost_gendev); | 479 | device_initialize(&shost->shost_gendev); |
| 479 | dev_set_name(&shost->shost_gendev, "host%d", shost->host_no); | 480 | dev_set_name(&shost->shost_gendev, "host%d", shost->host_no); |
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index 5293e6827ce5..3a9eca163db8 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c | |||
| @@ -1045,11 +1045,7 @@ static void set_performant_mode(struct ctlr_info *h, struct CommandList *c, | |||
| 1045 | c->busaddr |= 1 | (h->blockFetchTable[c->Header.SGList] << 1); | 1045 | c->busaddr |= 1 | (h->blockFetchTable[c->Header.SGList] << 1); |
| 1046 | if (unlikely(!h->msix_vectors)) | 1046 | if (unlikely(!h->msix_vectors)) |
| 1047 | return; | 1047 | return; |
| 1048 | if (likely(reply_queue == DEFAULT_REPLY_QUEUE)) | 1048 | c->Header.ReplyQueue = reply_queue; |
| 1049 | c->Header.ReplyQueue = | ||
| 1050 | raw_smp_processor_id() % h->nreply_queues; | ||
| 1051 | else | ||
| 1052 | c->Header.ReplyQueue = reply_queue % h->nreply_queues; | ||
| 1053 | } | 1049 | } |
| 1054 | } | 1050 | } |
| 1055 | 1051 | ||
| @@ -1063,10 +1059,7 @@ static void set_ioaccel1_performant_mode(struct ctlr_info *h, | |||
| 1063 | * Tell the controller to post the reply to the queue for this | 1059 | * Tell the controller to post the reply to the queue for this |
| 1064 | * processor. This seems to give the best I/O throughput. | 1060 | * processor. This seems to give the best I/O throughput. |
| 1065 | */ | 1061 | */ |
| 1066 | if (likely(reply_queue == DEFAULT_REPLY_QUEUE)) | 1062 | cp->ReplyQueue = reply_queue; |
| 1067 | cp->ReplyQueue = smp_processor_id() % h->nreply_queues; | ||
| 1068 | else | ||
| 1069 | cp->ReplyQueue = reply_queue % h->nreply_queues; | ||
| 1070 | /* | 1063 | /* |
| 1071 | * Set the bits in the address sent down to include: | 1064 | * Set the bits in the address sent down to include: |
| 1072 | * - performant mode bit (bit 0) | 1065 | * - performant mode bit (bit 0) |
| @@ -1087,10 +1080,7 @@ static void set_ioaccel2_tmf_performant_mode(struct ctlr_info *h, | |||
| 1087 | /* Tell the controller to post the reply to the queue for this | 1080 | /* Tell the controller to post the reply to the queue for this |
| 1088 | * processor. This seems to give the best I/O throughput. | 1081 | * processor. This seems to give the best I/O throughput. |
| 1089 | */ | 1082 | */ |
| 1090 | if (likely(reply_queue == DEFAULT_REPLY_QUEUE)) | 1083 | cp->reply_queue = reply_queue; |
| 1091 | cp->reply_queue = smp_processor_id() % h->nreply_queues; | ||
| 1092 | else | ||
| 1093 | cp->reply_queue = reply_queue % h->nreply_queues; | ||
| 1094 | /* Set the bits in the address sent down to include: | 1084 | /* Set the bits in the address sent down to include: |
| 1095 | * - performant mode bit not used in ioaccel mode 2 | 1085 | * - performant mode bit not used in ioaccel mode 2 |
| 1096 | * - pull count (bits 0-3) | 1086 | * - pull count (bits 0-3) |
| @@ -1109,10 +1099,7 @@ static void set_ioaccel2_performant_mode(struct ctlr_info *h, | |||
| 1109 | * Tell the controller to post the reply to the queue for this | 1099 | * Tell the controller to post the reply to the queue for this |
| 1110 | * processor. This seems to give the best I/O throughput. | 1100 | * processor. This seems to give the best I/O throughput. |
| 1111 | */ | 1101 | */ |
| 1112 | if (likely(reply_queue == DEFAULT_REPLY_QUEUE)) | 1102 | cp->reply_queue = reply_queue; |
| 1113 | cp->reply_queue = smp_processor_id() % h->nreply_queues; | ||
| 1114 | else | ||
| 1115 | cp->reply_queue = reply_queue % h->nreply_queues; | ||
| 1116 | /* | 1103 | /* |
| 1117 | * Set the bits in the address sent down to include: | 1104 | * Set the bits in the address sent down to include: |
| 1118 | * - performant mode bit not used in ioaccel mode 2 | 1105 | * - performant mode bit not used in ioaccel mode 2 |
| @@ -1157,6 +1144,8 @@ static void __enqueue_cmd_and_start_io(struct ctlr_info *h, | |||
| 1157 | { | 1144 | { |
| 1158 | dial_down_lockup_detection_during_fw_flash(h, c); | 1145 | dial_down_lockup_detection_during_fw_flash(h, c); |
| 1159 | atomic_inc(&h->commands_outstanding); | 1146 | atomic_inc(&h->commands_outstanding); |
| 1147 | |||
| 1148 | reply_queue = h->reply_map[raw_smp_processor_id()]; | ||
| 1160 | switch (c->cmd_type) { | 1149 | switch (c->cmd_type) { |
| 1161 | case CMD_IOACCEL1: | 1150 | case CMD_IOACCEL1: |
| 1162 | set_ioaccel1_performant_mode(h, c, reply_queue); | 1151 | set_ioaccel1_performant_mode(h, c, reply_queue); |
| @@ -7376,6 +7365,26 @@ static void hpsa_disable_interrupt_mode(struct ctlr_info *h) | |||
| 7376 | h->msix_vectors = 0; | 7365 | h->msix_vectors = 0; |
| 7377 | } | 7366 | } |
| 7378 | 7367 | ||
| 7368 | static void hpsa_setup_reply_map(struct ctlr_info *h) | ||
| 7369 | { | ||
| 7370 | const struct cpumask *mask; | ||
| 7371 | unsigned int queue, cpu; | ||
| 7372 | |||
| 7373 | for (queue = 0; queue < h->msix_vectors; queue++) { | ||
| 7374 | mask = pci_irq_get_affinity(h->pdev, queue); | ||
| 7375 | if (!mask) | ||
| 7376 | goto fallback; | ||
| 7377 | |||
| 7378 | for_each_cpu(cpu, mask) | ||
| 7379 | h->reply_map[cpu] = queue; | ||
| 7380 | } | ||
| 7381 | return; | ||
| 7382 | |||
| 7383 | fallback: | ||
| 7384 | for_each_possible_cpu(cpu) | ||
| 7385 | h->reply_map[cpu] = 0; | ||
| 7386 | } | ||
| 7387 | |||
| 7379 | /* If MSI/MSI-X is supported by the kernel we will try to enable it on | 7388 | /* If MSI/MSI-X is supported by the kernel we will try to enable it on |
| 7380 | * controllers that are capable. If not, we use legacy INTx mode. | 7389 | * controllers that are capable. If not, we use legacy INTx mode. |
| 7381 | */ | 7390 | */ |
| @@ -7771,6 +7780,10 @@ static int hpsa_pci_init(struct ctlr_info *h) | |||
| 7771 | err = hpsa_interrupt_mode(h); | 7780 | err = hpsa_interrupt_mode(h); |
| 7772 | if (err) | 7781 | if (err) |
| 7773 | goto clean1; | 7782 | goto clean1; |
| 7783 | |||
| 7784 | /* setup mapping between CPU and reply queue */ | ||
| 7785 | hpsa_setup_reply_map(h); | ||
| 7786 | |||
| 7774 | err = hpsa_pci_find_memory_BAR(h->pdev, &h->paddr); | 7787 | err = hpsa_pci_find_memory_BAR(h->pdev, &h->paddr); |
| 7775 | if (err) | 7788 | if (err) |
| 7776 | goto clean2; /* intmode+region, pci */ | 7789 | goto clean2; /* intmode+region, pci */ |
| @@ -8480,6 +8493,28 @@ static struct workqueue_struct *hpsa_create_controller_wq(struct ctlr_info *h, | |||
| 8480 | return wq; | 8493 | return wq; |
| 8481 | } | 8494 | } |
| 8482 | 8495 | ||
| 8496 | static void hpda_free_ctlr_info(struct ctlr_info *h) | ||
| 8497 | { | ||
| 8498 | kfree(h->reply_map); | ||
| 8499 | kfree(h); | ||
| 8500 | } | ||
| 8501 | |||
| 8502 | static struct ctlr_info *hpda_alloc_ctlr_info(void) | ||
| 8503 | { | ||
| 8504 | struct ctlr_info *h; | ||
| 8505 | |||
| 8506 | h = kzalloc(sizeof(*h), GFP_KERNEL); | ||
| 8507 | if (!h) | ||
| 8508 | return NULL; | ||
| 8509 | |||
| 8510 | h->reply_map = kzalloc(sizeof(*h->reply_map) * nr_cpu_ids, GFP_KERNEL); | ||
| 8511 | if (!h->reply_map) { | ||
| 8512 | kfree(h); | ||
| 8513 | return NULL; | ||
| 8514 | } | ||
| 8515 | return h; | ||
| 8516 | } | ||
| 8517 | |||
| 8483 | static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 8518 | static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
| 8484 | { | 8519 | { |
| 8485 | int dac, rc; | 8520 | int dac, rc; |
| @@ -8517,7 +8552,7 @@ reinit_after_soft_reset: | |||
| 8517 | * the driver. See comments in hpsa.h for more info. | 8552 | * the driver. See comments in hpsa.h for more info. |
| 8518 | */ | 8553 | */ |
| 8519 | BUILD_BUG_ON(sizeof(struct CommandList) % COMMANDLIST_ALIGNMENT); | 8554 | BUILD_BUG_ON(sizeof(struct CommandList) % COMMANDLIST_ALIGNMENT); |
| 8520 | h = kzalloc(sizeof(*h), GFP_KERNEL); | 8555 | h = hpda_alloc_ctlr_info(); |
| 8521 | if (!h) { | 8556 | if (!h) { |
| 8522 | dev_err(&pdev->dev, "Failed to allocate controller head\n"); | 8557 | dev_err(&pdev->dev, "Failed to allocate controller head\n"); |
| 8523 | return -ENOMEM; | 8558 | return -ENOMEM; |
| @@ -8916,7 +8951,7 @@ static void hpsa_remove_one(struct pci_dev *pdev) | |||
| 8916 | h->lockup_detected = NULL; /* init_one 2 */ | 8951 | h->lockup_detected = NULL; /* init_one 2 */ |
| 8917 | /* (void) pci_disable_pcie_error_reporting(pdev); */ /* init_one 1 */ | 8952 | /* (void) pci_disable_pcie_error_reporting(pdev); */ /* init_one 1 */ |
| 8918 | 8953 | ||
| 8919 | kfree(h); /* init_one 1 */ | 8954 | hpda_free_ctlr_info(h); /* init_one 1 */ |
| 8920 | } | 8955 | } |
| 8921 | 8956 | ||
| 8922 | static int hpsa_suspend(__attribute__((unused)) struct pci_dev *pdev, | 8957 | static int hpsa_suspend(__attribute__((unused)) struct pci_dev *pdev, |
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h index 018f980a701c..fb9f5e7f8209 100644 --- a/drivers/scsi/hpsa.h +++ b/drivers/scsi/hpsa.h | |||
| @@ -158,6 +158,7 @@ struct bmic_controller_parameters { | |||
| 158 | #pragma pack() | 158 | #pragma pack() |
| 159 | 159 | ||
| 160 | struct ctlr_info { | 160 | struct ctlr_info { |
| 161 | unsigned int *reply_map; | ||
| 161 | int ctlr; | 162 | int ctlr; |
| 162 | char devname[8]; | 163 | char devname[8]; |
| 163 | char *product_name; | 164 | char *product_name; |
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c index b1b1d3a3b173..daefe8172b04 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.c +++ b/drivers/scsi/ibmvscsi/ibmvfc.c | |||
| @@ -3579,11 +3579,9 @@ static void ibmvfc_tgt_implicit_logout(struct ibmvfc_target *tgt) | |||
| 3579 | static int ibmvfc_adisc_needs_plogi(struct ibmvfc_passthru_mad *mad, | 3579 | static int ibmvfc_adisc_needs_plogi(struct ibmvfc_passthru_mad *mad, |
| 3580 | struct ibmvfc_target *tgt) | 3580 | struct ibmvfc_target *tgt) |
| 3581 | { | 3581 | { |
| 3582 | if (memcmp(&mad->fc_iu.response[2], &tgt->ids.port_name, | 3582 | if (wwn_to_u64((u8 *)&mad->fc_iu.response[2]) != tgt->ids.port_name) |
| 3583 | sizeof(tgt->ids.port_name))) | ||
| 3584 | return 1; | 3583 | return 1; |
| 3585 | if (memcmp(&mad->fc_iu.response[4], &tgt->ids.node_name, | 3584 | if (wwn_to_u64((u8 *)&mad->fc_iu.response[4]) != tgt->ids.node_name) |
| 3586 | sizeof(tgt->ids.node_name))) | ||
| 3587 | return 1; | 3585 | return 1; |
| 3588 | if (be32_to_cpu(mad->fc_iu.response[6]) != tgt->scsi_id) | 3586 | if (be32_to_cpu(mad->fc_iu.response[6]) != tgt->scsi_id) |
| 3589 | return 1; | 3587 | return 1; |
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 0ad00dbf912d..6d886b13dbe9 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <linux/kfifo.h> | 37 | #include <linux/kfifo.h> |
| 38 | #include <linux/scatterlist.h> | 38 | #include <linux/scatterlist.h> |
| 39 | #include <linux/module.h> | 39 | #include <linux/module.h> |
| 40 | #include <linux/backing-dev.h> | ||
| 40 | #include <net/tcp.h> | 41 | #include <net/tcp.h> |
| 41 | #include <scsi/scsi_cmnd.h> | 42 | #include <scsi/scsi_cmnd.h> |
| 42 | #include <scsi/scsi_device.h> | 43 | #include <scsi/scsi_device.h> |
| @@ -954,6 +955,13 @@ static int iscsi_sw_tcp_slave_alloc(struct scsi_device *sdev) | |||
| 954 | 955 | ||
| 955 | static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev) | 956 | static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev) |
| 956 | { | 957 | { |
| 958 | struct iscsi_sw_tcp_host *tcp_sw_host = iscsi_host_priv(sdev->host); | ||
| 959 | struct iscsi_session *session = tcp_sw_host->session; | ||
| 960 | struct iscsi_conn *conn = session->leadconn; | ||
| 961 | |||
| 962 | if (conn->datadgst_en) | ||
| 963 | sdev->request_queue->backing_dev_info->capabilities | ||
| 964 | |= BDI_CAP_STABLE_WRITES; | ||
| 957 | blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_ANY); | 965 | blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_ANY); |
| 958 | blk_queue_dma_alignment(sdev->request_queue, 0); | 966 | blk_queue_dma_alignment(sdev->request_queue, 0); |
| 959 | return 0; | 967 | return 0; |
diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h index ba6503f37756..27fab8235ea5 100644 --- a/drivers/scsi/megaraid/megaraid_sas.h +++ b/drivers/scsi/megaraid/megaraid_sas.h | |||
| @@ -2128,6 +2128,7 @@ enum MR_PD_TYPE { | |||
| 2128 | 2128 | ||
| 2129 | struct megasas_instance { | 2129 | struct megasas_instance { |
| 2130 | 2130 | ||
| 2131 | unsigned int *reply_map; | ||
| 2131 | __le32 *producer; | 2132 | __le32 *producer; |
| 2132 | dma_addr_t producer_h; | 2133 | dma_addr_t producer_h; |
| 2133 | __le32 *consumer; | 2134 | __le32 *consumer; |
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index a71ee67df084..dde0798b8a91 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c | |||
| @@ -5165,6 +5165,26 @@ skip_alloc: | |||
| 5165 | instance->use_seqnum_jbod_fp = false; | 5165 | instance->use_seqnum_jbod_fp = false; |
| 5166 | } | 5166 | } |
| 5167 | 5167 | ||
| 5168 | static void megasas_setup_reply_map(struct megasas_instance *instance) | ||
| 5169 | { | ||
| 5170 | const struct cpumask *mask; | ||
| 5171 | unsigned int queue, cpu; | ||
| 5172 | |||
| 5173 | for (queue = 0; queue < instance->msix_vectors; queue++) { | ||
| 5174 | mask = pci_irq_get_affinity(instance->pdev, queue); | ||
| 5175 | if (!mask) | ||
| 5176 | goto fallback; | ||
| 5177 | |||
| 5178 | for_each_cpu(cpu, mask) | ||
| 5179 | instance->reply_map[cpu] = queue; | ||
| 5180 | } | ||
| 5181 | return; | ||
| 5182 | |||
| 5183 | fallback: | ||
| 5184 | for_each_possible_cpu(cpu) | ||
| 5185 | instance->reply_map[cpu] = cpu % instance->msix_vectors; | ||
| 5186 | } | ||
| 5187 | |||
| 5168 | /** | 5188 | /** |
| 5169 | * megasas_init_fw - Initializes the FW | 5189 | * megasas_init_fw - Initializes the FW |
| 5170 | * @instance: Adapter soft state | 5190 | * @instance: Adapter soft state |
| @@ -5343,6 +5363,8 @@ static int megasas_init_fw(struct megasas_instance *instance) | |||
| 5343 | goto fail_setup_irqs; | 5363 | goto fail_setup_irqs; |
| 5344 | } | 5364 | } |
| 5345 | 5365 | ||
| 5366 | megasas_setup_reply_map(instance); | ||
| 5367 | |||
| 5346 | dev_info(&instance->pdev->dev, | 5368 | dev_info(&instance->pdev->dev, |
| 5347 | "firmware supports msix\t: (%d)", fw_msix_count); | 5369 | "firmware supports msix\t: (%d)", fw_msix_count); |
| 5348 | dev_info(&instance->pdev->dev, | 5370 | dev_info(&instance->pdev->dev, |
| @@ -6123,20 +6145,29 @@ static inline int megasas_alloc_mfi_ctrl_mem(struct megasas_instance *instance) | |||
| 6123 | */ | 6145 | */ |
| 6124 | static int megasas_alloc_ctrl_mem(struct megasas_instance *instance) | 6146 | static int megasas_alloc_ctrl_mem(struct megasas_instance *instance) |
| 6125 | { | 6147 | { |
| 6148 | instance->reply_map = kzalloc(sizeof(unsigned int) * nr_cpu_ids, | ||
| 6149 | GFP_KERNEL); | ||
| 6150 | if (!instance->reply_map) | ||
| 6151 | return -ENOMEM; | ||
| 6152 | |||
| 6126 | switch (instance->adapter_type) { | 6153 | switch (instance->adapter_type) { |
| 6127 | case MFI_SERIES: | 6154 | case MFI_SERIES: |
| 6128 | if (megasas_alloc_mfi_ctrl_mem(instance)) | 6155 | if (megasas_alloc_mfi_ctrl_mem(instance)) |
| 6129 | return -ENOMEM; | 6156 | goto fail; |
| 6130 | break; | 6157 | break; |
| 6131 | case VENTURA_SERIES: | 6158 | case VENTURA_SERIES: |
| 6132 | case THUNDERBOLT_SERIES: | 6159 | case THUNDERBOLT_SERIES: |
| 6133 | case INVADER_SERIES: | 6160 | case INVADER_SERIES: |
| 6134 | if (megasas_alloc_fusion_context(instance)) | 6161 | if (megasas_alloc_fusion_context(instance)) |
| 6135 | return -ENOMEM; | 6162 | goto fail; |
| 6136 | break; | 6163 | break; |
| 6137 | } | 6164 | } |
| 6138 | 6165 | ||
| 6139 | return 0; | 6166 | return 0; |
| 6167 | fail: | ||
| 6168 | kfree(instance->reply_map); | ||
| 6169 | instance->reply_map = NULL; | ||
| 6170 | return -ENOMEM; | ||
| 6140 | } | 6171 | } |
| 6141 | 6172 | ||
| 6142 | /* | 6173 | /* |
| @@ -6148,6 +6179,7 @@ static int megasas_alloc_ctrl_mem(struct megasas_instance *instance) | |||
| 6148 | */ | 6179 | */ |
| 6149 | static inline void megasas_free_ctrl_mem(struct megasas_instance *instance) | 6180 | static inline void megasas_free_ctrl_mem(struct megasas_instance *instance) |
| 6150 | { | 6181 | { |
| 6182 | kfree(instance->reply_map); | ||
| 6151 | if (instance->adapter_type == MFI_SERIES) { | 6183 | if (instance->adapter_type == MFI_SERIES) { |
| 6152 | if (instance->producer) | 6184 | if (instance->producer) |
| 6153 | pci_free_consistent(instance->pdev, sizeof(u32), | 6185 | pci_free_consistent(instance->pdev, sizeof(u32), |
| @@ -6540,7 +6572,6 @@ fail_io_attach: | |||
| 6540 | pci_free_irq_vectors(instance->pdev); | 6572 | pci_free_irq_vectors(instance->pdev); |
| 6541 | fail_init_mfi: | 6573 | fail_init_mfi: |
| 6542 | scsi_host_put(host); | 6574 | scsi_host_put(host); |
| 6543 | |||
| 6544 | fail_alloc_instance: | 6575 | fail_alloc_instance: |
| 6545 | pci_disable_device(pdev); | 6576 | pci_disable_device(pdev); |
| 6546 | 6577 | ||
| @@ -6746,6 +6777,8 @@ megasas_resume(struct pci_dev *pdev) | |||
| 6746 | if (rval < 0) | 6777 | if (rval < 0) |
| 6747 | goto fail_reenable_msix; | 6778 | goto fail_reenable_msix; |
| 6748 | 6779 | ||
| 6780 | megasas_setup_reply_map(instance); | ||
| 6781 | |||
| 6749 | if (instance->adapter_type != MFI_SERIES) { | 6782 | if (instance->adapter_type != MFI_SERIES) { |
| 6750 | megasas_reset_reply_desc(instance); | 6783 | megasas_reset_reply_desc(instance); |
| 6751 | if (megasas_ioc_init_fusion(instance)) { | 6784 | if (megasas_ioc_init_fusion(instance)) { |
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c index dc8e850fbfd2..5ec3b74e8aed 100644 --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c | |||
| @@ -2641,11 +2641,8 @@ megasas_build_ldio_fusion(struct megasas_instance *instance, | |||
| 2641 | fp_possible = (io_info.fpOkForIo > 0) ? true : false; | 2641 | fp_possible = (io_info.fpOkForIo > 0) ? true : false; |
| 2642 | } | 2642 | } |
| 2643 | 2643 | ||
| 2644 | /* Use raw_smp_processor_id() for now until cmd->request->cpu is CPU | 2644 | cmd->request_desc->SCSIIO.MSIxIndex = |
| 2645 | id by default, not CPU group id, otherwise all MSI-X queues won't | 2645 | instance->reply_map[raw_smp_processor_id()]; |
| 2646 | be utilized */ | ||
| 2647 | cmd->request_desc->SCSIIO.MSIxIndex = instance->msix_vectors ? | ||
| 2648 | raw_smp_processor_id() % instance->msix_vectors : 0; | ||
| 2649 | 2646 | ||
| 2650 | praid_context = &io_request->RaidContext; | 2647 | praid_context = &io_request->RaidContext; |
| 2651 | 2648 | ||
| @@ -2971,10 +2968,9 @@ megasas_build_syspd_fusion(struct megasas_instance *instance, | |||
| 2971 | } | 2968 | } |
| 2972 | 2969 | ||
| 2973 | cmd->request_desc->SCSIIO.DevHandle = io_request->DevHandle; | 2970 | cmd->request_desc->SCSIIO.DevHandle = io_request->DevHandle; |
| 2974 | cmd->request_desc->SCSIIO.MSIxIndex = | ||
| 2975 | instance->msix_vectors ? | ||
| 2976 | (raw_smp_processor_id() % instance->msix_vectors) : 0; | ||
| 2977 | 2971 | ||
| 2972 | cmd->request_desc->SCSIIO.MSIxIndex = | ||
| 2973 | instance->reply_map[raw_smp_processor_id()]; | ||
| 2978 | 2974 | ||
| 2979 | if (!fp_possible) { | 2975 | if (!fp_possible) { |
| 2980 | /* system pd firmware path */ | 2976 | /* system pd firmware path */ |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 3541caf3fceb..1fa84d6a0f8b 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
| @@ -2484,6 +2484,8 @@ sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer) | |||
| 2484 | sector_size = old_sector_size; | 2484 | sector_size = old_sector_size; |
| 2485 | goto got_data; | 2485 | goto got_data; |
| 2486 | } | 2486 | } |
| 2487 | /* Remember that READ CAPACITY(16) succeeded */ | ||
| 2488 | sdp->try_rc_10_first = 0; | ||
| 2487 | } | 2489 | } |
| 2488 | } | 2490 | } |
| 2489 | 2491 | ||
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c index 7c28e8d4955a..45d04631888a 100644 --- a/drivers/scsi/virtio_scsi.c +++ b/drivers/scsi/virtio_scsi.c | |||
| @@ -91,9 +91,6 @@ struct virtio_scsi_vq { | |||
| 91 | struct virtio_scsi_target_state { | 91 | struct virtio_scsi_target_state { |
| 92 | seqcount_t tgt_seq; | 92 | seqcount_t tgt_seq; |
| 93 | 93 | ||
| 94 | /* Count of outstanding requests. */ | ||
| 95 | atomic_t reqs; | ||
| 96 | |||
| 97 | /* Currently active virtqueue for requests sent to this target. */ | 94 | /* Currently active virtqueue for requests sent to this target. */ |
| 98 | struct virtio_scsi_vq *req_vq; | 95 | struct virtio_scsi_vq *req_vq; |
| 99 | }; | 96 | }; |
| @@ -152,8 +149,6 @@ static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf) | |||
| 152 | struct virtio_scsi_cmd *cmd = buf; | 149 | struct virtio_scsi_cmd *cmd = buf; |
| 153 | struct scsi_cmnd *sc = cmd->sc; | 150 | struct scsi_cmnd *sc = cmd->sc; |
| 154 | struct virtio_scsi_cmd_resp *resp = &cmd->resp.cmd; | 151 | struct virtio_scsi_cmd_resp *resp = &cmd->resp.cmd; |
| 155 | struct virtio_scsi_target_state *tgt = | ||
| 156 | scsi_target(sc->device)->hostdata; | ||
| 157 | 152 | ||
| 158 | dev_dbg(&sc->device->sdev_gendev, | 153 | dev_dbg(&sc->device->sdev_gendev, |
| 159 | "cmd %p response %u status %#02x sense_len %u\n", | 154 | "cmd %p response %u status %#02x sense_len %u\n", |
| @@ -210,8 +205,6 @@ static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf) | |||
| 210 | } | 205 | } |
| 211 | 206 | ||
| 212 | sc->scsi_done(sc); | 207 | sc->scsi_done(sc); |
| 213 | |||
| 214 | atomic_dec(&tgt->reqs); | ||
| 215 | } | 208 | } |
| 216 | 209 | ||
| 217 | static void virtscsi_vq_done(struct virtio_scsi *vscsi, | 210 | static void virtscsi_vq_done(struct virtio_scsi *vscsi, |
| @@ -529,11 +522,20 @@ static void virtio_scsi_init_hdr_pi(struct virtio_device *vdev, | |||
| 529 | } | 522 | } |
| 530 | #endif | 523 | #endif |
| 531 | 524 | ||
| 532 | static int virtscsi_queuecommand(struct virtio_scsi *vscsi, | 525 | static struct virtio_scsi_vq *virtscsi_pick_vq_mq(struct virtio_scsi *vscsi, |
| 533 | struct virtio_scsi_vq *req_vq, | 526 | struct scsi_cmnd *sc) |
| 527 | { | ||
| 528 | u32 tag = blk_mq_unique_tag(sc->request); | ||
| 529 | u16 hwq = blk_mq_unique_tag_to_hwq(tag); | ||
| 530 | |||
| 531 | return &vscsi->req_vqs[hwq]; | ||
| 532 | } | ||
| 533 | |||
| 534 | static int virtscsi_queuecommand(struct Scsi_Host *shost, | ||
| 534 | struct scsi_cmnd *sc) | 535 | struct scsi_cmnd *sc) |
| 535 | { | 536 | { |
| 536 | struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev); | 537 | struct virtio_scsi *vscsi = shost_priv(shost); |
| 538 | struct virtio_scsi_vq *req_vq = virtscsi_pick_vq_mq(vscsi, sc); | ||
| 537 | struct virtio_scsi_cmd *cmd = scsi_cmd_priv(sc); | 539 | struct virtio_scsi_cmd *cmd = scsi_cmd_priv(sc); |
| 538 | unsigned long flags; | 540 | unsigned long flags; |
| 539 | int req_size; | 541 | int req_size; |
| @@ -576,79 +578,6 @@ static int virtscsi_queuecommand(struct virtio_scsi *vscsi, | |||
| 576 | return 0; | 578 | return 0; |
| 577 | } | 579 | } |
| 578 | 580 | ||
| 579 | static int virtscsi_queuecommand_single(struct Scsi_Host *sh, | ||
| 580 | struct scsi_cmnd *sc) | ||
| 581 | { | ||
| 582 | struct virtio_scsi *vscsi = shost_priv(sh); | ||
| 583 | struct virtio_scsi_target_state *tgt = | ||
| 584 | scsi_target(sc->device)->hostdata; | ||
| 585 | |||
| 586 | atomic_inc(&tgt->reqs); | ||
| 587 | return virtscsi_queuecommand(vscsi, &vscsi->req_vqs[0], sc); | ||
| 588 | } | ||
| 589 | |||
| 590 | static struct virtio_scsi_vq *virtscsi_pick_vq_mq(struct virtio_scsi *vscsi, | ||
| 591 | struct scsi_cmnd *sc) | ||
| 592 | { | ||
| 593 | u32 tag = blk_mq_unique_tag(sc->request); | ||
| 594 | u16 hwq = blk_mq_unique_tag_to_hwq(tag); | ||
| 595 | |||
| 596 | return &vscsi->req_vqs[hwq]; | ||
| 597 | } | ||
| 598 | |||
| 599 | static struct virtio_scsi_vq *virtscsi_pick_vq(struct virtio_scsi *vscsi, | ||
| 600 | struct virtio_scsi_target_state *tgt) | ||
| 601 | { | ||
| 602 | struct virtio_scsi_vq *vq; | ||
| 603 | unsigned long flags; | ||
| 604 | u32 queue_num; | ||
| 605 | |||
| 606 | local_irq_save(flags); | ||
| 607 | if (atomic_inc_return(&tgt->reqs) > 1) { | ||
| 608 | unsigned long seq; | ||
| 609 | |||
| 610 | do { | ||
| 611 | seq = read_seqcount_begin(&tgt->tgt_seq); | ||
| 612 | vq = tgt->req_vq; | ||
| 613 | } while (read_seqcount_retry(&tgt->tgt_seq, seq)); | ||
| 614 | } else { | ||
| 615 | /* no writes can be concurrent because of atomic_t */ | ||
| 616 | write_seqcount_begin(&tgt->tgt_seq); | ||
| 617 | |||
| 618 | /* keep previous req_vq if a reader just arrived */ | ||
| 619 | if (unlikely(atomic_read(&tgt->reqs) > 1)) { | ||
| 620 | vq = tgt->req_vq; | ||
| 621 | goto unlock; | ||
| 622 | } | ||
| 623 | |||
| 624 | queue_num = smp_processor_id(); | ||
| 625 | while (unlikely(queue_num >= vscsi->num_queues)) | ||
| 626 | queue_num -= vscsi->num_queues; | ||
| 627 | tgt->req_vq = vq = &vscsi->req_vqs[queue_num]; | ||
| 628 | unlock: | ||
| 629 | write_seqcount_end(&tgt->tgt_seq); | ||
| 630 | } | ||
| 631 | local_irq_restore(flags); | ||
| 632 | |||
| 633 | return vq; | ||
| 634 | } | ||
| 635 | |||
| 636 | static int virtscsi_queuecommand_multi(struct Scsi_Host *sh, | ||
| 637 | struct scsi_cmnd *sc) | ||
| 638 | { | ||
| 639 | struct virtio_scsi *vscsi = shost_priv(sh); | ||
| 640 | struct virtio_scsi_target_state *tgt = | ||
| 641 | scsi_target(sc->device)->hostdata; | ||
| 642 | struct virtio_scsi_vq *req_vq; | ||
| 643 | |||
| 644 | if (shost_use_blk_mq(sh)) | ||
| 645 | req_vq = virtscsi_pick_vq_mq(vscsi, sc); | ||
| 646 | else | ||
| 647 | req_vq = virtscsi_pick_vq(vscsi, tgt); | ||
| 648 | |||
| 649 | return virtscsi_queuecommand(vscsi, req_vq, sc); | ||
| 650 | } | ||
| 651 | |||
| 652 | static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd) | 581 | static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd) |
| 653 | { | 582 | { |
| 654 | DECLARE_COMPLETION_ONSTACK(comp); | 583 | DECLARE_COMPLETION_ONSTACK(comp); |
| @@ -775,7 +704,6 @@ static int virtscsi_target_alloc(struct scsi_target *starget) | |||
| 775 | return -ENOMEM; | 704 | return -ENOMEM; |
| 776 | 705 | ||
| 777 | seqcount_init(&tgt->tgt_seq); | 706 | seqcount_init(&tgt->tgt_seq); |
| 778 | atomic_set(&tgt->reqs, 0); | ||
| 779 | tgt->req_vq = &vscsi->req_vqs[0]; | 707 | tgt->req_vq = &vscsi->req_vqs[0]; |
| 780 | 708 | ||
| 781 | starget->hostdata = tgt; | 709 | starget->hostdata = tgt; |
| @@ -805,33 +733,13 @@ static enum blk_eh_timer_return virtscsi_eh_timed_out(struct scsi_cmnd *scmnd) | |||
| 805 | return BLK_EH_RESET_TIMER; | 733 | return BLK_EH_RESET_TIMER; |
| 806 | } | 734 | } |
| 807 | 735 | ||
| 808 | static struct scsi_host_template virtscsi_host_template_single = { | 736 | static struct scsi_host_template virtscsi_host_template = { |
| 809 | .module = THIS_MODULE, | ||
| 810 | .name = "Virtio SCSI HBA", | ||
| 811 | .proc_name = "virtio_scsi", | ||
| 812 | .this_id = -1, | ||
| 813 | .cmd_size = sizeof(struct virtio_scsi_cmd), | ||
| 814 | .queuecommand = virtscsi_queuecommand_single, | ||
| 815 | .change_queue_depth = virtscsi_change_queue_depth, | ||
| 816 | .eh_abort_handler = virtscsi_abort, | ||
| 817 | .eh_device_reset_handler = virtscsi_device_reset, | ||
| 818 | .eh_timed_out = virtscsi_eh_timed_out, | ||
| 819 | .slave_alloc = virtscsi_device_alloc, | ||
| 820 | |||
| 821 | .dma_boundary = UINT_MAX, | ||
| 822 | .use_clustering = ENABLE_CLUSTERING, | ||
| 823 | .target_alloc = virtscsi_target_alloc, | ||
| 824 | .target_destroy = virtscsi_target_destroy, | ||
| 825 | .track_queue_depth = 1, | ||
| 826 | }; | ||
| 827 | |||
| 828 | static struct scsi_host_template virtscsi_host_template_multi = { | ||
| 829 | .module = THIS_MODULE, | 737 | .module = THIS_MODULE, |
| 830 | .name = "Virtio SCSI HBA", | 738 | .name = "Virtio SCSI HBA", |
| 831 | .proc_name = "virtio_scsi", | 739 | .proc_name = "virtio_scsi", |
| 832 | .this_id = -1, | 740 | .this_id = -1, |
| 833 | .cmd_size = sizeof(struct virtio_scsi_cmd), | 741 | .cmd_size = sizeof(struct virtio_scsi_cmd), |
| 834 | .queuecommand = virtscsi_queuecommand_multi, | 742 | .queuecommand = virtscsi_queuecommand, |
| 835 | .change_queue_depth = virtscsi_change_queue_depth, | 743 | .change_queue_depth = virtscsi_change_queue_depth, |
| 836 | .eh_abort_handler = virtscsi_abort, | 744 | .eh_abort_handler = virtscsi_abort, |
| 837 | .eh_device_reset_handler = virtscsi_device_reset, | 745 | .eh_device_reset_handler = virtscsi_device_reset, |
| @@ -844,6 +752,7 @@ static struct scsi_host_template virtscsi_host_template_multi = { | |||
| 844 | .target_destroy = virtscsi_target_destroy, | 752 | .target_destroy = virtscsi_target_destroy, |
| 845 | .map_queues = virtscsi_map_queues, | 753 | .map_queues = virtscsi_map_queues, |
| 846 | .track_queue_depth = 1, | 754 | .track_queue_depth = 1, |
| 755 | .force_blk_mq = 1, | ||
| 847 | }; | 756 | }; |
| 848 | 757 | ||
| 849 | #define virtscsi_config_get(vdev, fld) \ | 758 | #define virtscsi_config_get(vdev, fld) \ |
| @@ -936,7 +845,6 @@ static int virtscsi_probe(struct virtio_device *vdev) | |||
| 936 | u32 sg_elems, num_targets; | 845 | u32 sg_elems, num_targets; |
| 937 | u32 cmd_per_lun; | 846 | u32 cmd_per_lun; |
| 938 | u32 num_queues; | 847 | u32 num_queues; |
| 939 | struct scsi_host_template *hostt; | ||
| 940 | 848 | ||
| 941 | if (!vdev->config->get) { | 849 | if (!vdev->config->get) { |
| 942 | dev_err(&vdev->dev, "%s failure: config access disabled\n", | 850 | dev_err(&vdev->dev, "%s failure: config access disabled\n", |
| @@ -949,12 +857,7 @@ static int virtscsi_probe(struct virtio_device *vdev) | |||
| 949 | 857 | ||
| 950 | num_targets = virtscsi_config_get(vdev, max_target) + 1; | 858 | num_targets = virtscsi_config_get(vdev, max_target) + 1; |
| 951 | 859 | ||
| 952 | if (num_queues == 1) | 860 | shost = scsi_host_alloc(&virtscsi_host_template, |
| 953 | hostt = &virtscsi_host_template_single; | ||
| 954 | else | ||
| 955 | hostt = &virtscsi_host_template_multi; | ||
| 956 | |||
| 957 | shost = scsi_host_alloc(hostt, | ||
| 958 | sizeof(*vscsi) + sizeof(vscsi->req_vqs[0]) * num_queues); | 861 | sizeof(*vscsi) + sizeof(vscsi->req_vqs[0]) * num_queues); |
| 959 | if (!shost) | 862 | if (!shost) |
| 960 | return -ENOMEM; | 863 | return -ENOMEM; |
diff --git a/drivers/staging/ncpfs/ncplib_kernel.c b/drivers/staging/ncpfs/ncplib_kernel.c index 804adfebba2f..3e047eb4cc7c 100644 --- a/drivers/staging/ncpfs/ncplib_kernel.c +++ b/drivers/staging/ncpfs/ncplib_kernel.c | |||
| @@ -981,6 +981,10 @@ ncp_read_kernel(struct ncp_server *server, const char *file_id, | |||
| 981 | goto out; | 981 | goto out; |
| 982 | } | 982 | } |
| 983 | *bytes_read = ncp_reply_be16(server, 0); | 983 | *bytes_read = ncp_reply_be16(server, 0); |
| 984 | if (*bytes_read > to_read) { | ||
| 985 | result = -EINVAL; | ||
| 986 | goto out; | ||
| 987 | } | ||
| 984 | source = ncp_reply_data(server, 2 + (offset & 1)); | 988 | source = ncp_reply_data(server, 2 + (offset & 1)); |
| 985 | 989 | ||
| 986 | memcpy(target, source, *bytes_read); | 990 | memcpy(target, source, *bytes_read); |
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 88b902c525d7..b4e57c5a8bba 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c | |||
| @@ -1727,7 +1727,7 @@ static void reset_terminal(struct vc_data *vc, int do_clear) | |||
| 1727 | default_attr(vc); | 1727 | default_attr(vc); |
| 1728 | update_attr(vc); | 1728 | update_attr(vc); |
| 1729 | 1729 | ||
| 1730 | vc->vc_tab_stop[0] = 0x01010100; | 1730 | vc->vc_tab_stop[0] = |
| 1731 | vc->vc_tab_stop[1] = | 1731 | vc->vc_tab_stop[1] = |
| 1732 | vc->vc_tab_stop[2] = | 1732 | vc->vc_tab_stop[2] = |
| 1733 | vc->vc_tab_stop[3] = | 1733 | vc->vc_tab_stop[3] = |
| @@ -1771,7 +1771,7 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) | |||
| 1771 | vc->vc_pos -= (vc->vc_x << 1); | 1771 | vc->vc_pos -= (vc->vc_x << 1); |
| 1772 | while (vc->vc_x < vc->vc_cols - 1) { | 1772 | while (vc->vc_x < vc->vc_cols - 1) { |
| 1773 | vc->vc_x++; | 1773 | vc->vc_x++; |
| 1774 | if (vc->vc_tab_stop[vc->vc_x >> 5] & (1 << (vc->vc_x & 31))) | 1774 | if (vc->vc_tab_stop[7 & (vc->vc_x >> 5)] & (1 << (vc->vc_x & 31))) |
| 1775 | break; | 1775 | break; |
| 1776 | } | 1776 | } |
| 1777 | vc->vc_pos += (vc->vc_x << 1); | 1777 | vc->vc_pos += (vc->vc_x << 1); |
| @@ -1831,7 +1831,7 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) | |||
| 1831 | lf(vc); | 1831 | lf(vc); |
| 1832 | return; | 1832 | return; |
| 1833 | case 'H': | 1833 | case 'H': |
| 1834 | vc->vc_tab_stop[vc->vc_x >> 5] |= (1 << (vc->vc_x & 31)); | 1834 | vc->vc_tab_stop[7 & (vc->vc_x >> 5)] |= (1 << (vc->vc_x & 31)); |
| 1835 | return; | 1835 | return; |
| 1836 | case 'Z': | 1836 | case 'Z': |
| 1837 | respond_ID(tty); | 1837 | respond_ID(tty); |
| @@ -2024,7 +2024,7 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) | |||
| 2024 | return; | 2024 | return; |
| 2025 | case 'g': | 2025 | case 'g': |
| 2026 | if (!vc->vc_par[0]) | 2026 | if (!vc->vc_par[0]) |
| 2027 | vc->vc_tab_stop[vc->vc_x >> 5] &= ~(1 << (vc->vc_x & 31)); | 2027 | vc->vc_tab_stop[7 & (vc->vc_x >> 5)] &= ~(1 << (vc->vc_x & 31)); |
| 2028 | else if (vc->vc_par[0] == 3) { | 2028 | else if (vc->vc_par[0] == 3) { |
| 2029 | vc->vc_tab_stop[0] = | 2029 | vc->vc_tab_stop[0] = |
| 2030 | vc->vc_tab_stop[1] = | 2030 | vc->vc_tab_stop[1] = |
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c index b0f759476900..8a1508a8e481 100644 --- a/drivers/vfio/pci/vfio_pci.c +++ b/drivers/vfio/pci/vfio_pci.c | |||
| @@ -207,9 +207,6 @@ static bool vfio_pci_nointx(struct pci_dev *pdev) | |||
| 207 | } | 207 | } |
| 208 | } | 208 | } |
| 209 | 209 | ||
| 210 | if (!pdev->irq) | ||
| 211 | return true; | ||
| 212 | |||
| 213 | return false; | 210 | return false; |
| 214 | } | 211 | } |
| 215 | 212 | ||
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index a31d9b240af8..edc6fec9ad84 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
| @@ -630,7 +630,7 @@ static int vhost_net_rx_peek_head_len(struct vhost_net *net, struct sock *sk) | |||
| 630 | 630 | ||
| 631 | if (!len && vq->busyloop_timeout) { | 631 | if (!len && vq->busyloop_timeout) { |
| 632 | /* Both tx vq and rx socket were polled here */ | 632 | /* Both tx vq and rx socket were polled here */ |
| 633 | mutex_lock(&vq->mutex); | 633 | mutex_lock_nested(&vq->mutex, 1); |
| 634 | vhost_disable_notify(&net->dev, vq); | 634 | vhost_disable_notify(&net->dev, vq); |
| 635 | 635 | ||
| 636 | preempt_disable(); | 636 | preempt_disable(); |
| @@ -763,7 +763,7 @@ static void handle_rx(struct vhost_net *net) | |||
| 763 | struct iov_iter fixup; | 763 | struct iov_iter fixup; |
| 764 | __virtio16 num_buffers; | 764 | __virtio16 num_buffers; |
| 765 | 765 | ||
| 766 | mutex_lock(&vq->mutex); | 766 | mutex_lock_nested(&vq->mutex, 0); |
| 767 | sock = vq->private_data; | 767 | sock = vq->private_data; |
| 768 | if (!sock) | 768 | if (!sock) |
| 769 | goto out; | 769 | goto out; |
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index 1b3e8d2d5c8b..5320039671b7 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
| @@ -212,8 +212,7 @@ int vhost_poll_start(struct vhost_poll *poll, struct file *file) | |||
| 212 | if (mask) | 212 | if (mask) |
| 213 | vhost_poll_wakeup(&poll->wait, 0, 0, poll_to_key(mask)); | 213 | vhost_poll_wakeup(&poll->wait, 0, 0, poll_to_key(mask)); |
| 214 | if (mask & EPOLLERR) { | 214 | if (mask & EPOLLERR) { |
| 215 | if (poll->wqh) | 215 | vhost_poll_stop(poll); |
| 216 | remove_wait_queue(poll->wqh, &poll->wait); | ||
| 217 | ret = -EINVAL; | 216 | ret = -EINVAL; |
| 218 | } | 217 | } |
| 219 | 218 | ||
| @@ -1245,14 +1244,12 @@ static int vq_log_access_ok(struct vhost_virtqueue *vq, | |||
| 1245 | /* Caller should have vq mutex and device mutex */ | 1244 | /* Caller should have vq mutex and device mutex */ |
| 1246 | int vhost_vq_access_ok(struct vhost_virtqueue *vq) | 1245 | int vhost_vq_access_ok(struct vhost_virtqueue *vq) |
| 1247 | { | 1246 | { |
| 1248 | if (vq->iotlb) { | 1247 | int ret = vq_log_access_ok(vq, vq->log_base); |
| 1249 | /* When device IOTLB was used, the access validation | 1248 | |
| 1250 | * will be validated during prefetching. | 1249 | if (ret || vq->iotlb) |
| 1251 | */ | 1250 | return ret; |
| 1252 | return 1; | 1251 | |
| 1253 | } | 1252 | return vq_access_ok(vq, vq->num, vq->desc, vq->avail, vq->used); |
| 1254 | return vq_access_ok(vq, vq->num, vq->desc, vq->avail, vq->used) && | ||
| 1255 | vq_log_access_ok(vq, vq->log_base); | ||
| 1256 | } | 1253 | } |
| 1257 | EXPORT_SYMBOL_GPL(vhost_vq_access_ok); | 1254 | EXPORT_SYMBOL_GPL(vhost_vq_access_ok); |
| 1258 | 1255 | ||
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 6639926eed4e..b67eec3532a1 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
| @@ -640,7 +640,8 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to, | |||
| 640 | struct ceph_aio_request { | 640 | struct ceph_aio_request { |
| 641 | struct kiocb *iocb; | 641 | struct kiocb *iocb; |
| 642 | size_t total_len; | 642 | size_t total_len; |
| 643 | int write; | 643 | bool write; |
| 644 | bool should_dirty; | ||
| 644 | int error; | 645 | int error; |
| 645 | struct list_head osd_reqs; | 646 | struct list_head osd_reqs; |
| 646 | unsigned num_reqs; | 647 | unsigned num_reqs; |
| @@ -750,7 +751,7 @@ static void ceph_aio_complete_req(struct ceph_osd_request *req) | |||
| 750 | } | 751 | } |
| 751 | } | 752 | } |
| 752 | 753 | ||
| 753 | ceph_put_page_vector(osd_data->pages, num_pages, !aio_req->write); | 754 | ceph_put_page_vector(osd_data->pages, num_pages, aio_req->should_dirty); |
| 754 | ceph_osdc_put_request(req); | 755 | ceph_osdc_put_request(req); |
| 755 | 756 | ||
| 756 | if (rc < 0) | 757 | if (rc < 0) |
| @@ -847,6 +848,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter, | |||
| 847 | size_t count = iov_iter_count(iter); | 848 | size_t count = iov_iter_count(iter); |
| 848 | loff_t pos = iocb->ki_pos; | 849 | loff_t pos = iocb->ki_pos; |
| 849 | bool write = iov_iter_rw(iter) == WRITE; | 850 | bool write = iov_iter_rw(iter) == WRITE; |
| 851 | bool should_dirty = !write && iter_is_iovec(iter); | ||
| 850 | 852 | ||
| 851 | if (write && ceph_snap(file_inode(file)) != CEPH_NOSNAP) | 853 | if (write && ceph_snap(file_inode(file)) != CEPH_NOSNAP) |
| 852 | return -EROFS; | 854 | return -EROFS; |
| @@ -914,6 +916,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter, | |||
| 914 | if (aio_req) { | 916 | if (aio_req) { |
| 915 | aio_req->iocb = iocb; | 917 | aio_req->iocb = iocb; |
| 916 | aio_req->write = write; | 918 | aio_req->write = write; |
| 919 | aio_req->should_dirty = should_dirty; | ||
| 917 | INIT_LIST_HEAD(&aio_req->osd_reqs); | 920 | INIT_LIST_HEAD(&aio_req->osd_reqs); |
| 918 | if (write) { | 921 | if (write) { |
| 919 | aio_req->mtime = mtime; | 922 | aio_req->mtime = mtime; |
| @@ -971,7 +974,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter, | |||
| 971 | len = ret; | 974 | len = ret; |
| 972 | } | 975 | } |
| 973 | 976 | ||
| 974 | ceph_put_page_vector(pages, num_pages, !write); | 977 | ceph_put_page_vector(pages, num_pages, should_dirty); |
| 975 | 978 | ||
| 976 | ceph_osdc_put_request(req); | 979 | ceph_osdc_put_request(req); |
| 977 | if (ret < 0) | 980 | if (ret < 0) |
diff --git a/include/linux/fsl_ifc.h b/include/linux/fsl_ifc.h index c332f0a45607..3fdfede2f0f3 100644 --- a/include/linux/fsl_ifc.h +++ b/include/linux/fsl_ifc.h | |||
| @@ -734,11 +734,7 @@ struct fsl_ifc_nand { | |||
| 734 | u32 res19[0x10]; | 734 | u32 res19[0x10]; |
| 735 | __be32 nand_fsr; | 735 | __be32 nand_fsr; |
| 736 | u32 res20; | 736 | u32 res20; |
| 737 | /* The V1 nand_eccstat is actually 4 words that overlaps the | 737 | __be32 nand_eccstat[8]; |
| 738 | * V2 nand_eccstat. | ||
| 739 | */ | ||
| 740 | __be32 v1_nand_eccstat[2]; | ||
| 741 | __be32 v2_nand_eccstat[6]; | ||
| 742 | u32 res21[0x1c]; | 738 | u32 res21[0x1c]; |
| 743 | __be32 nanndcr; | 739 | __be32 nanndcr; |
| 744 | u32 res22[0x2]; | 740 | u32 res22[0x2]; |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 24d1976c1e61..d11f41d5269f 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
| @@ -347,13 +347,24 @@ static inline int __vlan_insert_inner_tag(struct sk_buff *skb, | |||
| 347 | skb_push(skb, VLAN_HLEN); | 347 | skb_push(skb, VLAN_HLEN); |
| 348 | 348 | ||
| 349 | /* Move the mac header sans proto to the beginning of the new header. */ | 349 | /* Move the mac header sans proto to the beginning of the new header. */ |
| 350 | memmove(skb->data, skb->data + VLAN_HLEN, mac_len - ETH_TLEN); | 350 | if (likely(mac_len > ETH_TLEN)) |
| 351 | memmove(skb->data, skb->data + VLAN_HLEN, mac_len - ETH_TLEN); | ||
| 351 | skb->mac_header -= VLAN_HLEN; | 352 | skb->mac_header -= VLAN_HLEN; |
| 352 | 353 | ||
| 353 | veth = (struct vlan_ethhdr *)(skb->data + mac_len - ETH_HLEN); | 354 | veth = (struct vlan_ethhdr *)(skb->data + mac_len - ETH_HLEN); |
| 354 | 355 | ||
| 355 | /* first, the ethernet type */ | 356 | /* first, the ethernet type */ |
| 356 | veth->h_vlan_proto = vlan_proto; | 357 | if (likely(mac_len >= ETH_TLEN)) { |
| 358 | /* h_vlan_encapsulated_proto should already be populated, and | ||
| 359 | * skb->data has space for h_vlan_proto | ||
| 360 | */ | ||
| 361 | veth->h_vlan_proto = vlan_proto; | ||
| 362 | } else { | ||
| 363 | /* h_vlan_encapsulated_proto should not be populated, and | ||
| 364 | * skb->data has no space for h_vlan_proto | ||
| 365 | */ | ||
| 366 | veth->h_vlan_encapsulated_proto = skb->protocol; | ||
| 367 | } | ||
| 357 | 368 | ||
| 358 | /* now, the TCI */ | 369 | /* now, the TCI */ |
| 359 | veth->h_vlan_TCI = htons(vlan_tci); | 370 | veth->h_vlan_TCI = htons(vlan_tci); |
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index 2168cc6b8b30..b46b541c67c4 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h | |||
| @@ -151,7 +151,7 @@ extern struct jump_entry __start___jump_table[]; | |||
| 151 | extern struct jump_entry __stop___jump_table[]; | 151 | extern struct jump_entry __stop___jump_table[]; |
| 152 | 152 | ||
| 153 | extern void jump_label_init(void); | 153 | extern void jump_label_init(void); |
| 154 | extern void jump_label_invalidate_init(void); | 154 | extern void jump_label_invalidate_initmem(void); |
| 155 | extern void jump_label_lock(void); | 155 | extern void jump_label_lock(void); |
| 156 | extern void jump_label_unlock(void); | 156 | extern void jump_label_unlock(void); |
| 157 | extern void arch_jump_label_transform(struct jump_entry *entry, | 157 | extern void arch_jump_label_transform(struct jump_entry *entry, |
| @@ -199,7 +199,7 @@ static __always_inline void jump_label_init(void) | |||
| 199 | static_key_initialized = true; | 199 | static_key_initialized = true; |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | static inline void jump_label_invalidate_init(void) {} | 202 | static inline void jump_label_invalidate_initmem(void) {} |
| 203 | 203 | ||
| 204 | static __always_inline bool static_key_false(struct static_key *key) | 204 | static __always_inline bool static_key_false(struct static_key *key) |
| 205 | { | 205 | { |
diff --git a/include/linux/net_dim.h b/include/linux/net_dim.h index bebeaad897cc..29ed8fd6379a 100644 --- a/include/linux/net_dim.h +++ b/include/linux/net_dim.h | |||
| @@ -231,7 +231,7 @@ static inline void net_dim_exit_parking(struct net_dim *dim) | |||
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | #define IS_SIGNIFICANT_DIFF(val, ref) \ | 233 | #define IS_SIGNIFICANT_DIFF(val, ref) \ |
| 234 | (((100 * abs((val) - (ref))) / (ref)) > 10) /* more than 10% difference */ | 234 | (((100UL * abs((val) - (ref))) / (ref)) > 10) /* more than 10% difference */ |
| 235 | 235 | ||
| 236 | static inline int net_dim_stats_compare(struct net_dim_stats *curr, | 236 | static inline int net_dim_stats_compare(struct net_dim_stats *curr, |
| 237 | struct net_dim_stats *prev) | 237 | struct net_dim_stats *prev) |
diff --git a/include/net/llc_conn.h b/include/net/llc_conn.h index fe994d2e5286..5c40f118c0fa 100644 --- a/include/net/llc_conn.h +++ b/include/net/llc_conn.h | |||
| @@ -103,7 +103,7 @@ void llc_sk_reset(struct sock *sk); | |||
| 103 | 103 | ||
| 104 | /* Access to a connection */ | 104 | /* Access to a connection */ |
| 105 | int llc_conn_state_process(struct sock *sk, struct sk_buff *skb); | 105 | int llc_conn_state_process(struct sock *sk, struct sk_buff *skb); |
| 106 | void llc_conn_send_pdu(struct sock *sk, struct sk_buff *skb); | 106 | int llc_conn_send_pdu(struct sock *sk, struct sk_buff *skb); |
| 107 | void llc_conn_rtn_pdu(struct sock *sk, struct sk_buff *skb); | 107 | void llc_conn_rtn_pdu(struct sock *sk, struct sk_buff *skb); |
| 108 | void llc_conn_resend_i_pdu_as_cmd(struct sock *sk, u8 nr, u8 first_p_bit); | 108 | void llc_conn_resend_i_pdu_as_cmd(struct sock *sk, u8 nr, u8 first_p_bit); |
| 109 | void llc_conn_resend_i_pdu_as_rsp(struct sock *sk, u8 nr, u8 first_f_bit); | 109 | void llc_conn_resend_i_pdu_as_rsp(struct sock *sk, u8 nr, u8 first_f_bit); |
diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h index bd2a18d66189..cd368d1b8cb8 100644 --- a/include/net/netfilter/nf_tables.h +++ b/include/net/netfilter/nf_tables.h | |||
| @@ -1072,6 +1072,8 @@ struct nft_object_ops { | |||
| 1072 | int nft_register_obj(struct nft_object_type *obj_type); | 1072 | int nft_register_obj(struct nft_object_type *obj_type); |
| 1073 | void nft_unregister_obj(struct nft_object_type *obj_type); | 1073 | void nft_unregister_obj(struct nft_object_type *obj_type); |
| 1074 | 1074 | ||
| 1075 | #define NFT_FLOWTABLE_DEVICE_MAX 8 | ||
| 1076 | |||
| 1075 | /** | 1077 | /** |
| 1076 | * struct nft_flowtable - nf_tables flow table | 1078 | * struct nft_flowtable - nf_tables flow table |
| 1077 | * | 1079 | * |
| @@ -1084,6 +1086,7 @@ void nft_unregister_obj(struct nft_object_type *obj_type); | |||
| 1084 | * @genmask: generation mask | 1086 | * @genmask: generation mask |
| 1085 | * @use: number of references to this flow table | 1087 | * @use: number of references to this flow table |
| 1086 | * @handle: unique object handle | 1088 | * @handle: unique object handle |
| 1089 | * @dev_name: array of device names | ||
| 1087 | * @data: rhashtable and garbage collector | 1090 | * @data: rhashtable and garbage collector |
| 1088 | * @ops: array of hooks | 1091 | * @ops: array of hooks |
| 1089 | */ | 1092 | */ |
| @@ -1097,6 +1100,7 @@ struct nft_flowtable { | |||
| 1097 | u32 genmask:2, | 1100 | u32 genmask:2, |
| 1098 | use:30; | 1101 | use:30; |
| 1099 | u64 handle; | 1102 | u64 handle; |
| 1103 | char *dev_name[NFT_FLOWTABLE_DEVICE_MAX]; | ||
| 1100 | /* runtime data below here */ | 1104 | /* runtime data below here */ |
| 1101 | struct nf_hook_ops *ops ____cacheline_aligned; | 1105 | struct nf_hook_ops *ops ____cacheline_aligned; |
| 1102 | struct nf_flowtable data; | 1106 | struct nf_flowtable data; |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 493e311bbe93..5154c8300262 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
| @@ -30,6 +30,7 @@ struct qdisc_rate_table { | |||
| 30 | enum qdisc_state_t { | 30 | enum qdisc_state_t { |
| 31 | __QDISC_STATE_SCHED, | 31 | __QDISC_STATE_SCHED, |
| 32 | __QDISC_STATE_DEACTIVATED, | 32 | __QDISC_STATE_DEACTIVATED, |
| 33 | __QDISC_STATE_RUNNING, | ||
| 33 | }; | 34 | }; |
| 34 | 35 | ||
| 35 | struct qdisc_size_table { | 36 | struct qdisc_size_table { |
diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h index d656809f1217..415e09960017 100644 --- a/include/rdma/ib_addr.h +++ b/include/rdma/ib_addr.h | |||
| @@ -130,6 +130,8 @@ void rdma_copy_addr(struct rdma_dev_addr *dev_addr, | |||
| 130 | const unsigned char *dst_dev_addr); | 130 | const unsigned char *dst_dev_addr); |
| 131 | 131 | ||
| 132 | int rdma_addr_size(struct sockaddr *addr); | 132 | int rdma_addr_size(struct sockaddr *addr); |
| 133 | int rdma_addr_size_in6(struct sockaddr_in6 *addr); | ||
| 134 | int rdma_addr_size_kss(struct __kernel_sockaddr_storage *addr); | ||
| 133 | 135 | ||
| 134 | int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid, | 136 | int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid, |
| 135 | const union ib_gid *dgid, | 137 | const union ib_gid *dgid, |
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index a8b7bf879ced..9c1e4bad6581 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h | |||
| @@ -452,6 +452,9 @@ struct scsi_host_template { | |||
| 452 | /* True if the controller does not support WRITE SAME */ | 452 | /* True if the controller does not support WRITE SAME */ |
| 453 | unsigned no_write_same:1; | 453 | unsigned no_write_same:1; |
| 454 | 454 | ||
| 455 | /* True if the low-level driver supports blk-mq only */ | ||
| 456 | unsigned force_blk_mq:1; | ||
| 457 | |||
| 455 | /* | 458 | /* |
| 456 | * Countdown for host blocking with no commands outstanding. | 459 | * Countdown for host blocking with no commands outstanding. |
| 457 | */ | 460 | */ |
diff --git a/include/uapi/linux/lirc.h b/include/uapi/linux/lirc.h index 4fe580d36e41..f5bf06ecd87d 100644 --- a/include/uapi/linux/lirc.h +++ b/include/uapi/linux/lirc.h | |||
| @@ -54,7 +54,6 @@ | |||
| 54 | #define LIRC_CAN_SEND_RAW LIRC_MODE2SEND(LIRC_MODE_RAW) | 54 | #define LIRC_CAN_SEND_RAW LIRC_MODE2SEND(LIRC_MODE_RAW) |
| 55 | #define LIRC_CAN_SEND_PULSE LIRC_MODE2SEND(LIRC_MODE_PULSE) | 55 | #define LIRC_CAN_SEND_PULSE LIRC_MODE2SEND(LIRC_MODE_PULSE) |
| 56 | #define LIRC_CAN_SEND_MODE2 LIRC_MODE2SEND(LIRC_MODE_MODE2) | 56 | #define LIRC_CAN_SEND_MODE2 LIRC_MODE2SEND(LIRC_MODE_MODE2) |
| 57 | #define LIRC_CAN_SEND_SCANCODE LIRC_MODE2SEND(LIRC_MODE_SCANCODE) | ||
| 58 | #define LIRC_CAN_SEND_LIRCCODE LIRC_MODE2SEND(LIRC_MODE_LIRCCODE) | 57 | #define LIRC_CAN_SEND_LIRCCODE LIRC_MODE2SEND(LIRC_MODE_LIRCCODE) |
| 59 | 58 | ||
| 60 | #define LIRC_CAN_SEND_MASK 0x0000003f | 59 | #define LIRC_CAN_SEND_MASK 0x0000003f |
diff --git a/include/uapi/linux/usb/audio.h b/include/uapi/linux/usb/audio.h index 17a022c5b414..da3315ed1bcd 100644 --- a/include/uapi/linux/usb/audio.h +++ b/include/uapi/linux/usb/audio.h | |||
| @@ -370,7 +370,7 @@ static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_d | |||
| 370 | { | 370 | { |
| 371 | return (protocol == UAC_VERSION_1) ? | 371 | return (protocol == UAC_VERSION_1) ? |
| 372 | desc->baSourceID[desc->bNrInPins + 4] : | 372 | desc->baSourceID[desc->bNrInPins + 4] : |
| 373 | desc->baSourceID[desc->bNrInPins + 6]; | 373 | 2; /* in UAC2, this value is constant */ |
| 374 | } | 374 | } |
| 375 | 375 | ||
| 376 | static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc, | 376 | static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc, |
| @@ -378,7 +378,7 @@ static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_de | |||
| 378 | { | 378 | { |
| 379 | return (protocol == UAC_VERSION_1) ? | 379 | return (protocol == UAC_VERSION_1) ? |
| 380 | &desc->baSourceID[desc->bNrInPins + 5] : | 380 | &desc->baSourceID[desc->bNrInPins + 5] : |
| 381 | &desc->baSourceID[desc->bNrInPins + 7]; | 381 | &desc->baSourceID[desc->bNrInPins + 6]; |
| 382 | } | 382 | } |
| 383 | 383 | ||
| 384 | static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc, | 384 | static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc, |
diff --git a/init/main.c b/init/main.c index 969eaf140ef0..21efbf6ace93 100644 --- a/init/main.c +++ b/init/main.c | |||
| @@ -1001,7 +1001,7 @@ static int __ref kernel_init(void *unused) | |||
| 1001 | /* need to finish all async __init code before freeing the memory */ | 1001 | /* need to finish all async __init code before freeing the memory */ |
| 1002 | async_synchronize_full(); | 1002 | async_synchronize_full(); |
| 1003 | ftrace_free_init_mem(); | 1003 | ftrace_free_init_mem(); |
| 1004 | jump_label_invalidate_init(); | 1004 | jump_label_invalidate_initmem(); |
| 1005 | free_initmem(); | 1005 | free_initmem(); |
| 1006 | mark_readonly(); | 1006 | mark_readonly(); |
| 1007 | system_state = SYSTEM_RUNNING; | 1007 | system_state = SYSTEM_RUNNING; |
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index d7f309f74dec..a808f29d4c5a 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
| @@ -325,9 +325,8 @@ err: | |||
| 325 | static int mqueue_fill_super(struct super_block *sb, void *data, int silent) | 325 | static int mqueue_fill_super(struct super_block *sb, void *data, int silent) |
| 326 | { | 326 | { |
| 327 | struct inode *inode; | 327 | struct inode *inode; |
| 328 | struct ipc_namespace *ns = data; | 328 | struct ipc_namespace *ns = sb->s_fs_info; |
| 329 | 329 | ||
| 330 | sb->s_fs_info = ns; | ||
| 331 | sb->s_iflags |= SB_I_NOEXEC | SB_I_NODEV; | 330 | sb->s_iflags |= SB_I_NOEXEC | SB_I_NODEV; |
| 332 | sb->s_blocksize = PAGE_SIZE; | 331 | sb->s_blocksize = PAGE_SIZE; |
| 333 | sb->s_blocksize_bits = PAGE_SHIFT; | 332 | sb->s_blocksize_bits = PAGE_SHIFT; |
| @@ -344,44 +343,18 @@ static int mqueue_fill_super(struct super_block *sb, void *data, int silent) | |||
| 344 | return 0; | 343 | return 0; |
| 345 | } | 344 | } |
| 346 | 345 | ||
| 347 | static struct file_system_type mqueue_fs_type; | ||
| 348 | /* | ||
| 349 | * Return value is pinned only by reference in ->mq_mnt; it will | ||
| 350 | * live until ipcns dies. Caller does not need to drop it. | ||
| 351 | */ | ||
| 352 | static struct vfsmount *mq_internal_mount(void) | ||
| 353 | { | ||
| 354 | struct ipc_namespace *ns = current->nsproxy->ipc_ns; | ||
| 355 | struct vfsmount *m = ns->mq_mnt; | ||
| 356 | if (m) | ||
| 357 | return m; | ||
| 358 | m = kern_mount_data(&mqueue_fs_type, ns); | ||
| 359 | spin_lock(&mq_lock); | ||
| 360 | if (unlikely(ns->mq_mnt)) { | ||
| 361 | spin_unlock(&mq_lock); | ||
| 362 | if (!IS_ERR(m)) | ||
| 363 | kern_unmount(m); | ||
| 364 | return ns->mq_mnt; | ||
| 365 | } | ||
| 366 | if (!IS_ERR(m)) | ||
| 367 | ns->mq_mnt = m; | ||
| 368 | spin_unlock(&mq_lock); | ||
| 369 | return m; | ||
| 370 | } | ||
| 371 | |||
| 372 | static struct dentry *mqueue_mount(struct file_system_type *fs_type, | 346 | static struct dentry *mqueue_mount(struct file_system_type *fs_type, |
| 373 | int flags, const char *dev_name, | 347 | int flags, const char *dev_name, |
| 374 | void *data) | 348 | void *data) |
| 375 | { | 349 | { |
| 376 | struct vfsmount *m; | 350 | struct ipc_namespace *ns; |
| 377 | if (flags & SB_KERNMOUNT) | 351 | if (flags & SB_KERNMOUNT) { |
| 378 | return mount_nodev(fs_type, flags, data, mqueue_fill_super); | 352 | ns = data; |
| 379 | m = mq_internal_mount(); | 353 | data = NULL; |
| 380 | if (IS_ERR(m)) | 354 | } else { |
| 381 | return ERR_CAST(m); | 355 | ns = current->nsproxy->ipc_ns; |
| 382 | atomic_inc(&m->mnt_sb->s_active); | 356 | } |
| 383 | down_write(&m->mnt_sb->s_umount); | 357 | return mount_ns(fs_type, flags, data, ns, ns->user_ns, mqueue_fill_super); |
| 384 | return dget(m->mnt_root); | ||
| 385 | } | 358 | } |
| 386 | 359 | ||
| 387 | static void init_once(void *foo) | 360 | static void init_once(void *foo) |
| @@ -771,16 +744,13 @@ static int prepare_open(struct dentry *dentry, int oflag, int ro, | |||
| 771 | static int do_mq_open(const char __user *u_name, int oflag, umode_t mode, | 744 | static int do_mq_open(const char __user *u_name, int oflag, umode_t mode, |
| 772 | struct mq_attr *attr) | 745 | struct mq_attr *attr) |
| 773 | { | 746 | { |
| 774 | struct vfsmount *mnt = mq_internal_mount(); | 747 | struct vfsmount *mnt = current->nsproxy->ipc_ns->mq_mnt; |
| 775 | struct dentry *root; | 748 | struct dentry *root = mnt->mnt_root; |
| 776 | struct filename *name; | 749 | struct filename *name; |
| 777 | struct path path; | 750 | struct path path; |
| 778 | int fd, error; | 751 | int fd, error; |
| 779 | int ro; | 752 | int ro; |
| 780 | 753 | ||
| 781 | if (IS_ERR(mnt)) | ||
| 782 | return PTR_ERR(mnt); | ||
| 783 | |||
| 784 | audit_mq_open(oflag, mode, attr); | 754 | audit_mq_open(oflag, mode, attr); |
| 785 | 755 | ||
| 786 | if (IS_ERR(name = getname(u_name))) | 756 | if (IS_ERR(name = getname(u_name))) |
| @@ -791,7 +761,6 @@ static int do_mq_open(const char __user *u_name, int oflag, umode_t mode, | |||
| 791 | goto out_putname; | 761 | goto out_putname; |
| 792 | 762 | ||
| 793 | ro = mnt_want_write(mnt); /* we'll drop it in any case */ | 763 | ro = mnt_want_write(mnt); /* we'll drop it in any case */ |
| 794 | root = mnt->mnt_root; | ||
| 795 | inode_lock(d_inode(root)); | 764 | inode_lock(d_inode(root)); |
| 796 | path.dentry = lookup_one_len(name->name, root, strlen(name->name)); | 765 | path.dentry = lookup_one_len(name->name, root, strlen(name->name)); |
| 797 | if (IS_ERR(path.dentry)) { | 766 | if (IS_ERR(path.dentry)) { |
| @@ -840,9 +809,6 @@ SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name) | |||
| 840 | struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns; | 809 | struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns; |
| 841 | struct vfsmount *mnt = ipc_ns->mq_mnt; | 810 | struct vfsmount *mnt = ipc_ns->mq_mnt; |
| 842 | 811 | ||
| 843 | if (!mnt) | ||
| 844 | return -ENOENT; | ||
| 845 | |||
| 846 | name = getname(u_name); | 812 | name = getname(u_name); |
| 847 | if (IS_ERR(name)) | 813 | if (IS_ERR(name)) |
| 848 | return PTR_ERR(name); | 814 | return PTR_ERR(name); |
| @@ -1569,26 +1535,28 @@ int mq_init_ns(struct ipc_namespace *ns) | |||
| 1569 | ns->mq_msgsize_max = DFLT_MSGSIZEMAX; | 1535 | ns->mq_msgsize_max = DFLT_MSGSIZEMAX; |
| 1570 | ns->mq_msg_default = DFLT_MSG; | 1536 | ns->mq_msg_default = DFLT_MSG; |
| 1571 | ns->mq_msgsize_default = DFLT_MSGSIZE; | 1537 | ns->mq_msgsize_default = DFLT_MSGSIZE; |
| 1572 | ns->mq_mnt = NULL; | ||
| 1573 | 1538 | ||
| 1539 | ns->mq_mnt = kern_mount_data(&mqueue_fs_type, ns); | ||
| 1540 | if (IS_ERR(ns->mq_mnt)) { | ||
| 1541 | int err = PTR_ERR(ns->mq_mnt); | ||
| 1542 | ns->mq_mnt = NULL; | ||
| 1543 | return err; | ||
| 1544 | } | ||
| 1574 | return 0; | 1545 | return 0; |
| 1575 | } | 1546 | } |
| 1576 | 1547 | ||
| 1577 | void mq_clear_sbinfo(struct ipc_namespace *ns) | 1548 | void mq_clear_sbinfo(struct ipc_namespace *ns) |
| 1578 | { | 1549 | { |
| 1579 | if (ns->mq_mnt) | 1550 | ns->mq_mnt->mnt_sb->s_fs_info = NULL; |
| 1580 | ns->mq_mnt->mnt_sb->s_fs_info = NULL; | ||
| 1581 | } | 1551 | } |
| 1582 | 1552 | ||
| 1583 | void mq_put_mnt(struct ipc_namespace *ns) | 1553 | void mq_put_mnt(struct ipc_namespace *ns) |
| 1584 | { | 1554 | { |
| 1585 | if (ns->mq_mnt) | 1555 | kern_unmount(ns->mq_mnt); |
| 1586 | kern_unmount(ns->mq_mnt); | ||
| 1587 | } | 1556 | } |
| 1588 | 1557 | ||
| 1589 | static int __init init_mqueue_fs(void) | 1558 | static int __init init_mqueue_fs(void) |
| 1590 | { | 1559 | { |
| 1591 | struct vfsmount *m; | ||
| 1592 | int error; | 1560 | int error; |
| 1593 | 1561 | ||
| 1594 | mqueue_inode_cachep = kmem_cache_create("mqueue_inode_cache", | 1562 | mqueue_inode_cachep = kmem_cache_create("mqueue_inode_cache", |
| @@ -1610,10 +1578,6 @@ static int __init init_mqueue_fs(void) | |||
| 1610 | if (error) | 1578 | if (error) |
| 1611 | goto out_filesystem; | 1579 | goto out_filesystem; |
| 1612 | 1580 | ||
| 1613 | m = kern_mount_data(&mqueue_fs_type, &init_ipc_ns); | ||
| 1614 | if (IS_ERR(m)) | ||
| 1615 | goto out_filesystem; | ||
| 1616 | init_ipc_ns.mq_mnt = m; | ||
| 1617 | return 0; | 1581 | return 0; |
| 1618 | 1582 | ||
| 1619 | out_filesystem: | 1583 | out_filesystem: |
| @@ -386,6 +386,17 @@ static int shm_fault(struct vm_fault *vmf) | |||
| 386 | return sfd->vm_ops->fault(vmf); | 386 | return sfd->vm_ops->fault(vmf); |
| 387 | } | 387 | } |
| 388 | 388 | ||
| 389 | static int shm_split(struct vm_area_struct *vma, unsigned long addr) | ||
| 390 | { | ||
| 391 | struct file *file = vma->vm_file; | ||
| 392 | struct shm_file_data *sfd = shm_file_data(file); | ||
| 393 | |||
| 394 | if (sfd->vm_ops && sfd->vm_ops->split) | ||
| 395 | return sfd->vm_ops->split(vma, addr); | ||
| 396 | |||
| 397 | return 0; | ||
| 398 | } | ||
| 399 | |||
| 389 | #ifdef CONFIG_NUMA | 400 | #ifdef CONFIG_NUMA |
| 390 | static int shm_set_policy(struct vm_area_struct *vma, struct mempolicy *new) | 401 | static int shm_set_policy(struct vm_area_struct *vma, struct mempolicy *new) |
| 391 | { | 402 | { |
| @@ -510,6 +521,7 @@ static const struct vm_operations_struct shm_vm_ops = { | |||
| 510 | .open = shm_open, /* callback for a new vm-area open */ | 521 | .open = shm_open, /* callback for a new vm-area open */ |
| 511 | .close = shm_close, /* callback for when the vm-area is released */ | 522 | .close = shm_close, /* callback for when the vm-area is released */ |
| 512 | .fault = shm_fault, | 523 | .fault = shm_fault, |
| 524 | .split = shm_split, | ||
| 513 | #if defined(CONFIG_NUMA) | 525 | #if defined(CONFIG_NUMA) |
| 514 | .set_policy = shm_set_policy, | 526 | .set_policy = shm_set_policy, |
| 515 | .get_policy = shm_get_policy, | 527 | .get_policy = shm_get_policy, |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 4b838470fac4..709a55b9ad97 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -724,9 +724,15 @@ static inline void __update_cgrp_time(struct perf_cgroup *cgrp) | |||
| 724 | 724 | ||
| 725 | static inline void update_cgrp_time_from_cpuctx(struct perf_cpu_context *cpuctx) | 725 | static inline void update_cgrp_time_from_cpuctx(struct perf_cpu_context *cpuctx) |
| 726 | { | 726 | { |
| 727 | struct perf_cgroup *cgrp_out = cpuctx->cgrp; | 727 | struct perf_cgroup *cgrp = cpuctx->cgrp; |
| 728 | if (cgrp_out) | 728 | struct cgroup_subsys_state *css; |
| 729 | __update_cgrp_time(cgrp_out); | 729 | |
| 730 | if (cgrp) { | ||
| 731 | for (css = &cgrp->css; css; css = css->parent) { | ||
| 732 | cgrp = container_of(css, struct perf_cgroup, css); | ||
| 733 | __update_cgrp_time(cgrp); | ||
| 734 | } | ||
| 735 | } | ||
| 730 | } | 736 | } |
| 731 | 737 | ||
| 732 | static inline void update_cgrp_time_from_event(struct perf_event *event) | 738 | static inline void update_cgrp_time_from_event(struct perf_event *event) |
| @@ -754,6 +760,7 @@ perf_cgroup_set_timestamp(struct task_struct *task, | |||
| 754 | { | 760 | { |
| 755 | struct perf_cgroup *cgrp; | 761 | struct perf_cgroup *cgrp; |
| 756 | struct perf_cgroup_info *info; | 762 | struct perf_cgroup_info *info; |
| 763 | struct cgroup_subsys_state *css; | ||
| 757 | 764 | ||
| 758 | /* | 765 | /* |
| 759 | * ctx->lock held by caller | 766 | * ctx->lock held by caller |
| @@ -764,8 +771,12 @@ perf_cgroup_set_timestamp(struct task_struct *task, | |||
| 764 | return; | 771 | return; |
| 765 | 772 | ||
| 766 | cgrp = perf_cgroup_from_task(task, ctx); | 773 | cgrp = perf_cgroup_from_task(task, ctx); |
| 767 | info = this_cpu_ptr(cgrp->info); | 774 | |
| 768 | info->timestamp = ctx->timestamp; | 775 | for (css = &cgrp->css; css; css = css->parent) { |
| 776 | cgrp = container_of(css, struct perf_cgroup, css); | ||
| 777 | info = this_cpu_ptr(cgrp->info); | ||
| 778 | info->timestamp = ctx->timestamp; | ||
| 779 | } | ||
| 769 | } | 780 | } |
| 770 | 781 | ||
| 771 | static DEFINE_PER_CPU(struct list_head, cgrp_cpuctx_list); | 782 | static DEFINE_PER_CPU(struct list_head, cgrp_cpuctx_list); |
diff --git a/kernel/jump_label.c b/kernel/jump_label.c index e7214093dcd1..01ebdf1f9f40 100644 --- a/kernel/jump_label.c +++ b/kernel/jump_label.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/jump_label_ratelimit.h> | 16 | #include <linux/jump_label_ratelimit.h> |
| 17 | #include <linux/bug.h> | 17 | #include <linux/bug.h> |
| 18 | #include <linux/cpu.h> | 18 | #include <linux/cpu.h> |
| 19 | #include <asm/sections.h> | ||
| 19 | 20 | ||
| 20 | #ifdef HAVE_JUMP_LABEL | 21 | #ifdef HAVE_JUMP_LABEL |
| 21 | 22 | ||
| @@ -421,15 +422,15 @@ void __init jump_label_init(void) | |||
| 421 | cpus_read_unlock(); | 422 | cpus_read_unlock(); |
| 422 | } | 423 | } |
| 423 | 424 | ||
| 424 | /* Disable any jump label entries in __init code */ | 425 | /* Disable any jump label entries in __init/__exit code */ |
| 425 | void __init jump_label_invalidate_init(void) | 426 | void __init jump_label_invalidate_initmem(void) |
| 426 | { | 427 | { |
| 427 | struct jump_entry *iter_start = __start___jump_table; | 428 | struct jump_entry *iter_start = __start___jump_table; |
| 428 | struct jump_entry *iter_stop = __stop___jump_table; | 429 | struct jump_entry *iter_stop = __stop___jump_table; |
| 429 | struct jump_entry *iter; | 430 | struct jump_entry *iter; |
| 430 | 431 | ||
| 431 | for (iter = iter_start; iter < iter_stop; iter++) { | 432 | for (iter = iter_start; iter < iter_stop; iter++) { |
| 432 | if (init_kernel_text(iter->code)) | 433 | if (init_section_contains((void *)(unsigned long)iter->code, 1)) |
| 433 | iter->code = 0; | 434 | iter->code = 0; |
| 434 | } | 435 | } |
| 435 | } | 436 | } |
diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c index 858a07590e39..2048359f33d2 100644 --- a/kernel/locking/mutex.c +++ b/kernel/locking/mutex.c | |||
| @@ -1082,15 +1082,16 @@ static noinline int __sched | |||
| 1082 | __mutex_lock_interruptible_slowpath(struct mutex *lock); | 1082 | __mutex_lock_interruptible_slowpath(struct mutex *lock); |
| 1083 | 1083 | ||
| 1084 | /** | 1084 | /** |
| 1085 | * mutex_lock_interruptible - acquire the mutex, interruptible | 1085 | * mutex_lock_interruptible() - Acquire the mutex, interruptible by signals. |
| 1086 | * @lock: the mutex to be acquired | 1086 | * @lock: The mutex to be acquired. |
| 1087 | * | 1087 | * |
| 1088 | * Lock the mutex like mutex_lock(), and return 0 if the mutex has | 1088 | * Lock the mutex like mutex_lock(). If a signal is delivered while the |
| 1089 | * been acquired or sleep until the mutex becomes available. If a | 1089 | * process is sleeping, this function will return without acquiring the |
| 1090 | * signal arrives while waiting for the lock then this function | 1090 | * mutex. |
| 1091 | * returns -EINTR. | ||
| 1092 | * | 1091 | * |
| 1093 | * This function is similar to (but not equivalent to) down_interruptible(). | 1092 | * Context: Process context. |
| 1093 | * Return: 0 if the lock was successfully acquired or %-EINTR if a | ||
| 1094 | * signal arrived. | ||
| 1094 | */ | 1095 | */ |
| 1095 | int __sched mutex_lock_interruptible(struct mutex *lock) | 1096 | int __sched mutex_lock_interruptible(struct mutex *lock) |
| 1096 | { | 1097 | { |
| @@ -1104,6 +1105,18 @@ int __sched mutex_lock_interruptible(struct mutex *lock) | |||
| 1104 | 1105 | ||
| 1105 | EXPORT_SYMBOL(mutex_lock_interruptible); | 1106 | EXPORT_SYMBOL(mutex_lock_interruptible); |
| 1106 | 1107 | ||
| 1108 | /** | ||
| 1109 | * mutex_lock_killable() - Acquire the mutex, interruptible by fatal signals. | ||
| 1110 | * @lock: The mutex to be acquired. | ||
| 1111 | * | ||
| 1112 | * Lock the mutex like mutex_lock(). If a signal which will be fatal to | ||
| 1113 | * the current process is delivered while the process is sleeping, this | ||
| 1114 | * function will return without acquiring the mutex. | ||
| 1115 | * | ||
| 1116 | * Context: Process context. | ||
| 1117 | * Return: 0 if the lock was successfully acquired or %-EINTR if a | ||
| 1118 | * fatal signal arrived. | ||
| 1119 | */ | ||
| 1107 | int __sched mutex_lock_killable(struct mutex *lock) | 1120 | int __sched mutex_lock_killable(struct mutex *lock) |
| 1108 | { | 1121 | { |
| 1109 | might_sleep(); | 1122 | might_sleep(); |
| @@ -1115,6 +1128,16 @@ int __sched mutex_lock_killable(struct mutex *lock) | |||
| 1115 | } | 1128 | } |
| 1116 | EXPORT_SYMBOL(mutex_lock_killable); | 1129 | EXPORT_SYMBOL(mutex_lock_killable); |
| 1117 | 1130 | ||
| 1131 | /** | ||
| 1132 | * mutex_lock_io() - Acquire the mutex and mark the process as waiting for I/O | ||
| 1133 | * @lock: The mutex to be acquired. | ||
| 1134 | * | ||
| 1135 | * Lock the mutex like mutex_lock(). While the task is waiting for this | ||
| 1136 | * mutex, it will be accounted as being in the IO wait state by the | ||
| 1137 | * scheduler. | ||
| 1138 | * | ||
| 1139 | * Context: Process context. | ||
| 1140 | */ | ||
| 1118 | void __sched mutex_lock_io(struct mutex *lock) | 1141 | void __sched mutex_lock_io(struct mutex *lock) |
| 1119 | { | 1142 | { |
| 1120 | int token; | 1143 | int token; |
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c index 1ca0130ed4f9..72c401b3b15c 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c | |||
| @@ -32,7 +32,7 @@ static DEFINE_SPINLOCK(sched_debug_lock); | |||
| 32 | if (m) \ | 32 | if (m) \ |
| 33 | seq_printf(m, x); \ | 33 | seq_printf(m, x); \ |
| 34 | else \ | 34 | else \ |
| 35 | printk(x); \ | 35 | pr_cont(x); \ |
| 36 | } while (0) | 36 | } while (0) |
| 37 | 37 | ||
| 38 | /* | 38 | /* |
| @@ -501,12 +501,12 @@ static void print_rq(struct seq_file *m, struct rq *rq, int rq_cpu) | |||
| 501 | { | 501 | { |
| 502 | struct task_struct *g, *p; | 502 | struct task_struct *g, *p; |
| 503 | 503 | ||
| 504 | SEQ_printf(m, | 504 | SEQ_printf(m, "\n"); |
| 505 | "\nrunnable tasks:\n" | 505 | SEQ_printf(m, "runnable tasks:\n"); |
| 506 | " S task PID tree-key switches prio" | 506 | SEQ_printf(m, " S task PID tree-key switches prio" |
| 507 | " wait-time sum-exec sum-sleep\n" | 507 | " wait-time sum-exec sum-sleep\n"); |
| 508 | "-------------------------------------------------------" | 508 | SEQ_printf(m, "-------------------------------------------------------" |
| 509 | "----------------------------------------------------\n"); | 509 | "----------------------------------------------------\n"); |
| 510 | 510 | ||
| 511 | rcu_read_lock(); | 511 | rcu_read_lock(); |
| 512 | for_each_process_thread(g, p) { | 512 | for_each_process_thread(g, p) { |
| @@ -527,9 +527,11 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) | |||
| 527 | unsigned long flags; | 527 | unsigned long flags; |
| 528 | 528 | ||
| 529 | #ifdef CONFIG_FAIR_GROUP_SCHED | 529 | #ifdef CONFIG_FAIR_GROUP_SCHED |
| 530 | SEQ_printf(m, "\ncfs_rq[%d]:%s\n", cpu, task_group_path(cfs_rq->tg)); | 530 | SEQ_printf(m, "\n"); |
| 531 | SEQ_printf(m, "cfs_rq[%d]:%s\n", cpu, task_group_path(cfs_rq->tg)); | ||
| 531 | #else | 532 | #else |
| 532 | SEQ_printf(m, "\ncfs_rq[%d]:\n", cpu); | 533 | SEQ_printf(m, "\n"); |
| 534 | SEQ_printf(m, "cfs_rq[%d]:\n", cpu); | ||
| 533 | #endif | 535 | #endif |
| 534 | SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "exec_clock", | 536 | SEQ_printf(m, " .%-30s: %Ld.%06ld\n", "exec_clock", |
| 535 | SPLIT_NS(cfs_rq->exec_clock)); | 537 | SPLIT_NS(cfs_rq->exec_clock)); |
| @@ -595,9 +597,11 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) | |||
| 595 | void print_rt_rq(struct seq_file *m, int cpu, struct rt_rq *rt_rq) | 597 | void print_rt_rq(struct seq_file *m, int cpu, struct rt_rq *rt_rq) |
| 596 | { | 598 | { |
| 597 | #ifdef CONFIG_RT_GROUP_SCHED | 599 | #ifdef CONFIG_RT_GROUP_SCHED |
| 598 | SEQ_printf(m, "\nrt_rq[%d]:%s\n", cpu, task_group_path(rt_rq->tg)); | 600 | SEQ_printf(m, "\n"); |
| 601 | SEQ_printf(m, "rt_rq[%d]:%s\n", cpu, task_group_path(rt_rq->tg)); | ||
| 599 | #else | 602 | #else |
| 600 | SEQ_printf(m, "\nrt_rq[%d]:\n", cpu); | 603 | SEQ_printf(m, "\n"); |
| 604 | SEQ_printf(m, "rt_rq[%d]:\n", cpu); | ||
| 601 | #endif | 605 | #endif |
| 602 | 606 | ||
| 603 | #define P(x) \ | 607 | #define P(x) \ |
| @@ -624,7 +628,8 @@ void print_dl_rq(struct seq_file *m, int cpu, struct dl_rq *dl_rq) | |||
| 624 | { | 628 | { |
| 625 | struct dl_bw *dl_bw; | 629 | struct dl_bw *dl_bw; |
| 626 | 630 | ||
| 627 | SEQ_printf(m, "\ndl_rq[%d]:\n", cpu); | 631 | SEQ_printf(m, "\n"); |
| 632 | SEQ_printf(m, "dl_rq[%d]:\n", cpu); | ||
| 628 | 633 | ||
| 629 | #define PU(x) \ | 634 | #define PU(x) \ |
| 630 | SEQ_printf(m, " .%-30s: %lu\n", #x, (unsigned long)(dl_rq->x)) | 635 | SEQ_printf(m, " .%-30s: %lu\n", #x, (unsigned long)(dl_rq->x)) |
diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c index 75043046914e..10b7186d0638 100644 --- a/kernel/time/posix-timers.c +++ b/kernel/time/posix-timers.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include <linux/export.h> | 50 | #include <linux/export.h> |
| 51 | #include <linux/hashtable.h> | 51 | #include <linux/hashtable.h> |
| 52 | #include <linux/compat.h> | 52 | #include <linux/compat.h> |
| 53 | #include <linux/nospec.h> | ||
| 53 | 54 | ||
| 54 | #include "timekeeping.h" | 55 | #include "timekeeping.h" |
| 55 | #include "posix-timers.h" | 56 | #include "posix-timers.h" |
| @@ -1346,11 +1347,15 @@ static const struct k_clock * const posix_clocks[] = { | |||
| 1346 | 1347 | ||
| 1347 | static const struct k_clock *clockid_to_kclock(const clockid_t id) | 1348 | static const struct k_clock *clockid_to_kclock(const clockid_t id) |
| 1348 | { | 1349 | { |
| 1349 | if (id < 0) | 1350 | clockid_t idx = id; |
| 1351 | |||
| 1352 | if (id < 0) { | ||
| 1350 | return (id & CLOCKFD_MASK) == CLOCKFD ? | 1353 | return (id & CLOCKFD_MASK) == CLOCKFD ? |
| 1351 | &clock_posix_dynamic : &clock_posix_cpu; | 1354 | &clock_posix_dynamic : &clock_posix_cpu; |
| 1355 | } | ||
| 1352 | 1356 | ||
| 1353 | if (id >= ARRAY_SIZE(posix_clocks) || !posix_clocks[id]) | 1357 | if (id >= ARRAY_SIZE(posix_clocks)) |
| 1354 | return NULL; | 1358 | return NULL; |
| 1355 | return posix_clocks[id]; | 1359 | |
| 1360 | return posix_clocks[array_index_nospec(idx, ARRAY_SIZE(posix_clocks))]; | ||
| 1356 | } | 1361 | } |
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 1fad24acd444..ae4147eaebd4 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c | |||
| @@ -659,7 +659,7 @@ static int create_trace_kprobe(int argc, char **argv) | |||
| 659 | char *symbol = NULL, *event = NULL, *group = NULL; | 659 | char *symbol = NULL, *event = NULL, *group = NULL; |
| 660 | int maxactive = 0; | 660 | int maxactive = 0; |
| 661 | char *arg; | 661 | char *arg; |
| 662 | unsigned long offset = 0; | 662 | long offset = 0; |
| 663 | void *addr = NULL; | 663 | void *addr = NULL; |
| 664 | char buf[MAX_EVENT_NAME_LEN]; | 664 | char buf[MAX_EVENT_NAME_LEN]; |
| 665 | 665 | ||
| @@ -747,7 +747,7 @@ static int create_trace_kprobe(int argc, char **argv) | |||
| 747 | symbol = argv[1]; | 747 | symbol = argv[1]; |
| 748 | /* TODO: support .init module functions */ | 748 | /* TODO: support .init module functions */ |
| 749 | ret = traceprobe_split_symbol_offset(symbol, &offset); | 749 | ret = traceprobe_split_symbol_offset(symbol, &offset); |
| 750 | if (ret) { | 750 | if (ret || offset < 0 || offset > UINT_MAX) { |
| 751 | pr_info("Failed to parse either an address or a symbol.\n"); | 751 | pr_info("Failed to parse either an address or a symbol.\n"); |
| 752 | return ret; | 752 | return ret; |
| 753 | } | 753 | } |
diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c index d59357308677..daf54bda4dc8 100644 --- a/kernel/trace/trace_probe.c +++ b/kernel/trace/trace_probe.c | |||
| @@ -320,7 +320,7 @@ static fetch_func_t get_fetch_size_function(const struct fetch_type *type, | |||
| 320 | } | 320 | } |
| 321 | 321 | ||
| 322 | /* Split symbol and offset. */ | 322 | /* Split symbol and offset. */ |
| 323 | int traceprobe_split_symbol_offset(char *symbol, unsigned long *offset) | 323 | int traceprobe_split_symbol_offset(char *symbol, long *offset) |
| 324 | { | 324 | { |
| 325 | char *tmp; | 325 | char *tmp; |
| 326 | int ret; | 326 | int ret; |
| @@ -328,13 +328,11 @@ int traceprobe_split_symbol_offset(char *symbol, unsigned long *offset) | |||
| 328 | if (!offset) | 328 | if (!offset) |
| 329 | return -EINVAL; | 329 | return -EINVAL; |
| 330 | 330 | ||
| 331 | tmp = strchr(symbol, '+'); | 331 | tmp = strpbrk(symbol, "+-"); |
| 332 | if (tmp) { | 332 | if (tmp) { |
| 333 | /* skip sign because kstrtoul doesn't accept '+' */ | 333 | ret = kstrtol(tmp, 0, offset); |
| 334 | ret = kstrtoul(tmp + 1, 0, offset); | ||
| 335 | if (ret) | 334 | if (ret) |
| 336 | return ret; | 335 | return ret; |
| 337 | |||
| 338 | *tmp = '\0'; | 336 | *tmp = '\0'; |
| 339 | } else | 337 | } else |
| 340 | *offset = 0; | 338 | *offset = 0; |
diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h index e101c5bb9eda..6a4d3fa94042 100644 --- a/kernel/trace/trace_probe.h +++ b/kernel/trace/trace_probe.h | |||
| @@ -365,7 +365,7 @@ extern int traceprobe_conflict_field_name(const char *name, | |||
| 365 | extern void traceprobe_update_arg(struct probe_arg *arg); | 365 | extern void traceprobe_update_arg(struct probe_arg *arg); |
| 366 | extern void traceprobe_free_probe_arg(struct probe_arg *arg); | 366 | extern void traceprobe_free_probe_arg(struct probe_arg *arg); |
| 367 | 367 | ||
| 368 | extern int traceprobe_split_symbol_offset(char *symbol, unsigned long *offset); | 368 | extern int traceprobe_split_symbol_offset(char *symbol, long *offset); |
| 369 | 369 | ||
| 370 | /* Sum up total data length for dynamic arraies (strings) */ | 370 | /* Sum up total data length for dynamic arraies (strings) */ |
| 371 | static nokprobe_inline int | 371 | static nokprobe_inline int |
diff --git a/mm/kmemleak.c b/mm/kmemleak.c index e83987c55a08..46c2290a08f1 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c | |||
| @@ -1657,8 +1657,7 @@ static void start_scan_thread(void) | |||
| 1657 | } | 1657 | } |
| 1658 | 1658 | ||
| 1659 | /* | 1659 | /* |
| 1660 | * Stop the automatic memory scanning thread. This function must be called | 1660 | * Stop the automatic memory scanning thread. |
| 1661 | * with the scan_mutex held. | ||
| 1662 | */ | 1661 | */ |
| 1663 | static void stop_scan_thread(void) | 1662 | static void stop_scan_thread(void) |
| 1664 | { | 1663 | { |
| @@ -1921,12 +1920,15 @@ static void kmemleak_do_cleanup(struct work_struct *work) | |||
| 1921 | { | 1920 | { |
| 1922 | stop_scan_thread(); | 1921 | stop_scan_thread(); |
| 1923 | 1922 | ||
| 1923 | mutex_lock(&scan_mutex); | ||
| 1924 | /* | 1924 | /* |
| 1925 | * Once the scan thread has stopped, it is safe to no longer track | 1925 | * Once it is made sure that kmemleak_scan has stopped, it is safe to no |
| 1926 | * object freeing. Ordering of the scan thread stopping and the memory | 1926 | * longer track object freeing. Ordering of the scan thread stopping and |
| 1927 | * accesses below is guaranteed by the kthread_stop() function. | 1927 | * the memory accesses below is guaranteed by the kthread_stop() |
| 1928 | * function. | ||
| 1928 | */ | 1929 | */ |
| 1929 | kmemleak_free_enabled = 0; | 1930 | kmemleak_free_enabled = 0; |
| 1931 | mutex_unlock(&scan_mutex); | ||
| 1930 | 1932 | ||
| 1931 | if (!kmemleak_found_leaks) | 1933 | if (!kmemleak_found_leaks) |
| 1932 | __kmemleak_do_cleanup(); | 1934 | __kmemleak_do_cleanup(); |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 670e99b68aa6..9ec024b862ac 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -714,9 +714,9 @@ static struct mem_cgroup *get_mem_cgroup_from_mm(struct mm_struct *mm) | |||
| 714 | * invocations for reference counting, or use mem_cgroup_iter_break() | 714 | * invocations for reference counting, or use mem_cgroup_iter_break() |
| 715 | * to cancel a hierarchy walk before the round-trip is complete. | 715 | * to cancel a hierarchy walk before the round-trip is complete. |
| 716 | * | 716 | * |
| 717 | * Reclaimers can specify a zone and a priority level in @reclaim to | 717 | * Reclaimers can specify a node and a priority level in @reclaim to |
| 718 | * divide up the memcgs in the hierarchy among all concurrent | 718 | * divide up the memcgs in the hierarchy among all concurrent |
| 719 | * reclaimers operating on the same zone and priority. | 719 | * reclaimers operating on the same node and priority. |
| 720 | */ | 720 | */ |
| 721 | struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root, | 721 | struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root, |
| 722 | struct mem_cgroup *prev, | 722 | struct mem_cgroup *prev, |
| @@ -2299,7 +2299,7 @@ void memcg_kmem_put_cache(struct kmem_cache *cachep) | |||
| 2299 | } | 2299 | } |
| 2300 | 2300 | ||
| 2301 | /** | 2301 | /** |
| 2302 | * memcg_kmem_charge: charge a kmem page | 2302 | * memcg_kmem_charge_memcg: charge a kmem page |
| 2303 | * @page: page to charge | 2303 | * @page: page to charge |
| 2304 | * @gfp: reclaim mode | 2304 | * @gfp: reclaim mode |
| 2305 | * @order: allocation order | 2305 | * @order: allocation order |
diff --git a/mm/page_owner.c b/mm/page_owner.c index 9886c6073828..7172e0a80e13 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c | |||
| @@ -123,13 +123,13 @@ void __reset_page_owner(struct page *page, unsigned int order) | |||
| 123 | static inline bool check_recursive_alloc(struct stack_trace *trace, | 123 | static inline bool check_recursive_alloc(struct stack_trace *trace, |
| 124 | unsigned long ip) | 124 | unsigned long ip) |
| 125 | { | 125 | { |
| 126 | int i, count; | 126 | int i; |
| 127 | 127 | ||
| 128 | if (!trace->nr_entries) | 128 | if (!trace->nr_entries) |
| 129 | return false; | 129 | return false; |
| 130 | 130 | ||
| 131 | for (i = 0, count = 0; i < trace->nr_entries; i++) { | 131 | for (i = 0; i < trace->nr_entries; i++) { |
| 132 | if (trace->entries[i] == ip && ++count == 2) | 132 | if (trace->entries[i] == ip) |
| 133 | return true; | 133 | return true; |
| 134 | } | 134 | } |
| 135 | 135 | ||
| @@ -1283,6 +1283,7 @@ void __init kmem_cache_init(void) | |||
| 1283 | nr_node_ids * sizeof(struct kmem_cache_node *), | 1283 | nr_node_ids * sizeof(struct kmem_cache_node *), |
| 1284 | SLAB_HWCACHE_ALIGN, 0, 0); | 1284 | SLAB_HWCACHE_ALIGN, 0, 0); |
| 1285 | list_add(&kmem_cache->list, &slab_caches); | 1285 | list_add(&kmem_cache->list, &slab_caches); |
| 1286 | memcg_link_cache(kmem_cache); | ||
| 1286 | slab_state = PARTIAL; | 1287 | slab_state = PARTIAL; |
| 1287 | 1288 | ||
| 1288 | /* | 1289 | /* |
diff --git a/mm/vmstat.c b/mm/vmstat.c index 40b2db6db6b1..33581be705f0 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c | |||
| @@ -1839,9 +1839,11 @@ static void vmstat_update(struct work_struct *w) | |||
| 1839 | * to occur in the future. Keep on running the | 1839 | * to occur in the future. Keep on running the |
| 1840 | * update worker thread. | 1840 | * update worker thread. |
| 1841 | */ | 1841 | */ |
| 1842 | preempt_disable(); | ||
| 1842 | queue_delayed_work_on(smp_processor_id(), mm_percpu_wq, | 1843 | queue_delayed_work_on(smp_processor_id(), mm_percpu_wq, |
| 1843 | this_cpu_ptr(&vmstat_work), | 1844 | this_cpu_ptr(&vmstat_work), |
| 1844 | round_jiffies_relative(sysctl_stat_interval)); | 1845 | round_jiffies_relative(sysctl_stat_interval)); |
| 1846 | preempt_enable(); | ||
| 1845 | } | 1847 | } |
| 1846 | } | 1848 | } |
| 1847 | 1849 | ||
diff --git a/net/batman-adv/gateway_client.c b/net/batman-adv/gateway_client.c index c294f6fd43e0..8b198ee798c9 100644 --- a/net/batman-adv/gateway_client.c +++ b/net/batman-adv/gateway_client.c | |||
| @@ -746,7 +746,7 @@ bool batadv_gw_out_of_range(struct batadv_priv *bat_priv, | |||
| 746 | { | 746 | { |
| 747 | struct batadv_neigh_node *neigh_curr = NULL; | 747 | struct batadv_neigh_node *neigh_curr = NULL; |
| 748 | struct batadv_neigh_node *neigh_old = NULL; | 748 | struct batadv_neigh_node *neigh_old = NULL; |
| 749 | struct batadv_orig_node *orig_dst_node; | 749 | struct batadv_orig_node *orig_dst_node = NULL; |
| 750 | struct batadv_gw_node *gw_node = NULL; | 750 | struct batadv_gw_node *gw_node = NULL; |
| 751 | struct batadv_gw_node *curr_gw = NULL; | 751 | struct batadv_gw_node *curr_gw = NULL; |
| 752 | struct batadv_neigh_ifinfo *curr_ifinfo, *old_ifinfo; | 752 | struct batadv_neigh_ifinfo *curr_ifinfo, *old_ifinfo; |
| @@ -757,6 +757,9 @@ bool batadv_gw_out_of_range(struct batadv_priv *bat_priv, | |||
| 757 | 757 | ||
| 758 | vid = batadv_get_vid(skb, 0); | 758 | vid = batadv_get_vid(skb, 0); |
| 759 | 759 | ||
| 760 | if (is_multicast_ether_addr(ethhdr->h_dest)) | ||
| 761 | goto out; | ||
| 762 | |||
| 760 | orig_dst_node = batadv_transtable_search(bat_priv, ethhdr->h_source, | 763 | orig_dst_node = batadv_transtable_search(bat_priv, ethhdr->h_source, |
| 761 | ethhdr->h_dest, vid); | 764 | ethhdr->h_dest, vid); |
| 762 | if (!orig_dst_node) | 765 | if (!orig_dst_node) |
diff --git a/net/batman-adv/multicast.c b/net/batman-adv/multicast.c index de3a055f7dd8..a11d3d89f012 100644 --- a/net/batman-adv/multicast.c +++ b/net/batman-adv/multicast.c | |||
| @@ -869,8 +869,8 @@ static struct batadv_orig_node * | |||
| 869 | batadv_mcast_forw_tt_node_get(struct batadv_priv *bat_priv, | 869 | batadv_mcast_forw_tt_node_get(struct batadv_priv *bat_priv, |
| 870 | struct ethhdr *ethhdr) | 870 | struct ethhdr *ethhdr) |
| 871 | { | 871 | { |
| 872 | return batadv_transtable_search(bat_priv, ethhdr->h_source, | 872 | return batadv_transtable_search(bat_priv, NULL, ethhdr->h_dest, |
| 873 | ethhdr->h_dest, BATADV_NO_FLAGS); | 873 | BATADV_NO_FLAGS); |
| 874 | } | 874 | } |
| 875 | 875 | ||
| 876 | /** | 876 | /** |
diff --git a/net/core/dev.c b/net/core/dev.c index 8edb58829124..9b04a9fd1dfd 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2762,7 +2762,7 @@ __be16 skb_network_protocol(struct sk_buff *skb, int *depth) | |||
| 2762 | if (unlikely(!pskb_may_pull(skb, sizeof(struct ethhdr)))) | 2762 | if (unlikely(!pskb_may_pull(skb, sizeof(struct ethhdr)))) |
| 2763 | return 0; | 2763 | return 0; |
| 2764 | 2764 | ||
| 2765 | eth = (struct ethhdr *)skb_mac_header(skb); | 2765 | eth = (struct ethhdr *)skb->data; |
| 2766 | type = eth->h_proto; | 2766 | type = eth->h_proto; |
| 2767 | } | 2767 | } |
| 2768 | 2768 | ||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index b5c75d4fcf37..1bca1e0fc8f7 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -5047,8 +5047,10 @@ static struct sk_buff *skb_reorder_vlan_header(struct sk_buff *skb) | |||
| 5047 | } | 5047 | } |
| 5048 | 5048 | ||
| 5049 | mac_len = skb->data - skb_mac_header(skb); | 5049 | mac_len = skb->data - skb_mac_header(skb); |
| 5050 | memmove(skb_mac_header(skb) + VLAN_HLEN, skb_mac_header(skb), | 5050 | if (likely(mac_len > VLAN_HLEN + ETH_TLEN)) { |
| 5051 | mac_len - VLAN_HLEN - ETH_TLEN); | 5051 | memmove(skb_mac_header(skb) + VLAN_HLEN, skb_mac_header(skb), |
| 5052 | mac_len - VLAN_HLEN - ETH_TLEN); | ||
| 5053 | } | ||
| 5052 | skb->mac_header += VLAN_HLEN; | 5054 | skb->mac_header += VLAN_HLEN; |
| 5053 | return skb; | 5055 | return skb; |
| 5054 | } | 5056 | } |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index 5fcb17cb426b..de6d94482fe7 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
| @@ -346,12 +346,17 @@ static struct ip_tunnel *ip_tunnel_create(struct net *net, | |||
| 346 | struct ip_tunnel *nt; | 346 | struct ip_tunnel *nt; |
| 347 | struct net_device *dev; | 347 | struct net_device *dev; |
| 348 | int t_hlen; | 348 | int t_hlen; |
| 349 | int mtu; | ||
| 350 | int err; | ||
| 349 | 351 | ||
| 350 | dev = __ip_tunnel_create(net, itn->rtnl_link_ops, parms); | 352 | dev = __ip_tunnel_create(net, itn->rtnl_link_ops, parms); |
| 351 | if (IS_ERR(dev)) | 353 | if (IS_ERR(dev)) |
| 352 | return ERR_CAST(dev); | 354 | return ERR_CAST(dev); |
| 353 | 355 | ||
| 354 | dev->mtu = ip_tunnel_bind_dev(dev); | 356 | mtu = ip_tunnel_bind_dev(dev); |
| 357 | err = dev_set_mtu(dev, mtu); | ||
| 358 | if (err) | ||
| 359 | goto err_dev_set_mtu; | ||
| 355 | 360 | ||
| 356 | nt = netdev_priv(dev); | 361 | nt = netdev_priv(dev); |
| 357 | t_hlen = nt->hlen + sizeof(struct iphdr); | 362 | t_hlen = nt->hlen + sizeof(struct iphdr); |
| @@ -359,6 +364,10 @@ static struct ip_tunnel *ip_tunnel_create(struct net *net, | |||
| 359 | dev->max_mtu = 0xFFF8 - dev->hard_header_len - t_hlen; | 364 | dev->max_mtu = 0xFFF8 - dev->hard_header_len - t_hlen; |
| 360 | ip_tunnel_add(itn, nt); | 365 | ip_tunnel_add(itn, nt); |
| 361 | return nt; | 366 | return nt; |
| 367 | |||
| 368 | err_dev_set_mtu: | ||
| 369 | unregister_netdevice(dev); | ||
| 370 | return ERR_PTR(err); | ||
| 362 | } | 371 | } |
| 363 | 372 | ||
| 364 | int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, | 373 | int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, |
| @@ -1090,17 +1099,29 @@ int ip_tunnel_newlink(struct net_device *dev, struct nlattr *tb[], | |||
| 1090 | nt->fwmark = fwmark; | 1099 | nt->fwmark = fwmark; |
| 1091 | err = register_netdevice(dev); | 1100 | err = register_netdevice(dev); |
| 1092 | if (err) | 1101 | if (err) |
| 1093 | goto out; | 1102 | goto err_register_netdevice; |
| 1094 | 1103 | ||
| 1095 | if (dev->type == ARPHRD_ETHER && !tb[IFLA_ADDRESS]) | 1104 | if (dev->type == ARPHRD_ETHER && !tb[IFLA_ADDRESS]) |
| 1096 | eth_hw_addr_random(dev); | 1105 | eth_hw_addr_random(dev); |
| 1097 | 1106 | ||
| 1098 | mtu = ip_tunnel_bind_dev(dev); | 1107 | mtu = ip_tunnel_bind_dev(dev); |
| 1099 | if (!tb[IFLA_MTU]) | 1108 | if (tb[IFLA_MTU]) { |
| 1100 | dev->mtu = mtu; | 1109 | unsigned int max = 0xfff8 - dev->hard_header_len - nt->hlen; |
| 1110 | |||
| 1111 | mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU, | ||
| 1112 | (unsigned int)(max - sizeof(struct iphdr))); | ||
| 1113 | } | ||
| 1114 | |||
| 1115 | err = dev_set_mtu(dev, mtu); | ||
| 1116 | if (err) | ||
| 1117 | goto err_dev_set_mtu; | ||
| 1101 | 1118 | ||
| 1102 | ip_tunnel_add(itn, nt); | 1119 | ip_tunnel_add(itn, nt); |
| 1103 | out: | 1120 | return 0; |
| 1121 | |||
| 1122 | err_dev_set_mtu: | ||
| 1123 | unregister_netdevice(dev); | ||
| 1124 | err_register_netdevice: | ||
| 1104 | return err; | 1125 | return err; |
| 1105 | } | 1126 | } |
| 1106 | EXPORT_SYMBOL_GPL(ip_tunnel_newlink); | 1127 | EXPORT_SYMBOL_GPL(ip_tunnel_newlink); |
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index 51b1669334fe..3f091ccad9af 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c | |||
| @@ -387,8 +387,6 @@ static int vti_tunnel_init(struct net_device *dev) | |||
| 387 | memcpy(dev->dev_addr, &iph->saddr, 4); | 387 | memcpy(dev->dev_addr, &iph->saddr, 4); |
| 388 | memcpy(dev->broadcast, &iph->daddr, 4); | 388 | memcpy(dev->broadcast, &iph->daddr, 4); |
| 389 | 389 | ||
| 390 | dev->hard_header_len = LL_MAX_HEADER + sizeof(struct iphdr); | ||
| 391 | dev->mtu = ETH_DATA_LEN; | ||
| 392 | dev->flags = IFF_NOARP; | 390 | dev->flags = IFF_NOARP; |
| 393 | dev->addr_len = 4; | 391 | dev->addr_len = 4; |
| 394 | dev->features |= NETIF_F_LLTX; | 392 | dev->features |= NETIF_F_LLTX; |
diff --git a/net/ipv4/netfilter/Makefile b/net/ipv4/netfilter/Makefile index 62ede5e3a3de..7523ddb2566b 100644 --- a/net/ipv4/netfilter/Makefile +++ b/net/ipv4/netfilter/Makefile | |||
| @@ -29,7 +29,7 @@ obj-$(CONFIG_NF_NAT_H323) += nf_nat_h323.o | |||
| 29 | obj-$(CONFIG_NF_NAT_PPTP) += nf_nat_pptp.o | 29 | obj-$(CONFIG_NF_NAT_PPTP) += nf_nat_pptp.o |
| 30 | 30 | ||
| 31 | nf_nat_snmp_basic-y := nf_nat_snmp_basic-asn1.o nf_nat_snmp_basic_main.o | 31 | nf_nat_snmp_basic-y := nf_nat_snmp_basic-asn1.o nf_nat_snmp_basic_main.o |
| 32 | nf_nat_snmp_basic-y : nf_nat_snmp_basic-asn1.h nf_nat_snmp_basic-asn1.c | 32 | $(obj)/nf_nat_snmp_basic_main.o: $(obj)/nf_nat_snmp_basic-asn1.h |
| 33 | obj-$(CONFIG_NF_NAT_SNMP_BASIC) += nf_nat_snmp_basic.o | 33 | obj-$(CONFIG_NF_NAT_SNMP_BASIC) += nf_nat_snmp_basic.o |
| 34 | clean-files := nf_nat_snmp_basic-asn1.c nf_nat_snmp_basic-asn1.h | 34 | clean-files := nf_nat_snmp_basic-asn1.c nf_nat_snmp_basic-asn1.h |
| 35 | 35 | ||
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index b50721d9d30e..9db988f9a4d7 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | |||
| @@ -154,8 +154,20 @@ static unsigned int ipv4_conntrack_local(void *priv, | |||
| 154 | struct sk_buff *skb, | 154 | struct sk_buff *skb, |
| 155 | const struct nf_hook_state *state) | 155 | const struct nf_hook_state *state) |
| 156 | { | 156 | { |
| 157 | if (ip_is_fragment(ip_hdr(skb))) /* IP_NODEFRAG setsockopt set */ | 157 | if (ip_is_fragment(ip_hdr(skb))) { /* IP_NODEFRAG setsockopt set */ |
| 158 | enum ip_conntrack_info ctinfo; | ||
| 159 | struct nf_conn *tmpl; | ||
| 160 | |||
| 161 | tmpl = nf_ct_get(skb, &ctinfo); | ||
| 162 | if (tmpl && nf_ct_is_template(tmpl)) { | ||
| 163 | /* when skipping ct, clear templates to avoid fooling | ||
| 164 | * later targets/matches | ||
| 165 | */ | ||
| 166 | skb->_nfct = 0; | ||
| 167 | nf_ct_put(tmpl); | ||
| 168 | } | ||
| 158 | return NF_ACCEPT; | 169 | return NF_ACCEPT; |
| 170 | } | ||
| 159 | 171 | ||
| 160 | return nf_conntrack_in(state->net, PF_INET, state->hook, skb); | 172 | return nf_conntrack_in(state->net, PF_INET, state->hook, skb); |
| 161 | } | 173 | } |
diff --git a/net/ipv4/netfilter/nf_socket_ipv4.c b/net/ipv4/netfilter/nf_socket_ipv4.c index e9293bdebba0..4824b1e183a1 100644 --- a/net/ipv4/netfilter/nf_socket_ipv4.c +++ b/net/ipv4/netfilter/nf_socket_ipv4.c | |||
| @@ -108,10 +108,12 @@ struct sock *nf_sk_lookup_slow_v4(struct net *net, const struct sk_buff *skb, | |||
| 108 | int doff = 0; | 108 | int doff = 0; |
| 109 | 109 | ||
| 110 | if (iph->protocol == IPPROTO_UDP || iph->protocol == IPPROTO_TCP) { | 110 | if (iph->protocol == IPPROTO_UDP || iph->protocol == IPPROTO_TCP) { |
| 111 | struct udphdr _hdr, *hp; | 111 | struct tcphdr _hdr; |
| 112 | struct udphdr *hp; | ||
| 112 | 113 | ||
| 113 | hp = skb_header_pointer(skb, ip_hdrlen(skb), | 114 | hp = skb_header_pointer(skb, ip_hdrlen(skb), |
| 114 | sizeof(_hdr), &_hdr); | 115 | iph->protocol == IPPROTO_UDP ? |
| 116 | sizeof(*hp) : sizeof(_hdr), &_hdr); | ||
| 115 | if (hp == NULL) | 117 | if (hp == NULL) |
| 116 | return NULL; | 118 | return NULL; |
| 117 | 119 | ||
diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c index fda37f2862c9..c3387dfd725b 100644 --- a/net/ipv4/syncookies.c +++ b/net/ipv4/syncookies.c | |||
| @@ -349,6 +349,8 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) | |||
| 349 | req->ts_recent = tcp_opt.saw_tstamp ? tcp_opt.rcv_tsval : 0; | 349 | req->ts_recent = tcp_opt.saw_tstamp ? tcp_opt.rcv_tsval : 0; |
| 350 | treq->snt_synack = 0; | 350 | treq->snt_synack = 0; |
| 351 | treq->tfo_listener = false; | 351 | treq->tfo_listener = false; |
| 352 | if (IS_ENABLED(CONFIG_SMC)) | ||
| 353 | ireq->smc_ok = 0; | ||
| 352 | 354 | ||
| 353 | ireq->ir_iif = inet_request_bound_dev_if(sk, skb); | 355 | ireq->ir_iif = inet_request_bound_dev_if(sk, skb); |
| 354 | 356 | ||
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 451ef3012636..367def6ddeda 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -6255,6 +6255,9 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, | |||
| 6255 | if (want_cookie && !tmp_opt.saw_tstamp) | 6255 | if (want_cookie && !tmp_opt.saw_tstamp) |
| 6256 | tcp_clear_options(&tmp_opt); | 6256 | tcp_clear_options(&tmp_opt); |
| 6257 | 6257 | ||
| 6258 | if (IS_ENABLED(CONFIG_SMC) && want_cookie) | ||
| 6259 | tmp_opt.smc_ok = 0; | ||
| 6260 | |||
| 6258 | tmp_opt.tstamp_ok = tmp_opt.saw_tstamp; | 6261 | tmp_opt.tstamp_ok = tmp_opt.saw_tstamp; |
| 6259 | tcp_openreq_init(req, &tmp_opt, skb, sk); | 6262 | tcp_openreq_init(req, &tmp_opt, skb, sk); |
| 6260 | inet_rsk(req)->no_srccheck = inet_sk(sk)->transparent; | 6263 | inet_rsk(req)->no_srccheck = inet_sk(sk)->transparent; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 323d7a354ffb..e6eaa4dd9f60 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -1246,7 +1246,7 @@ static int __ip6_append_data(struct sock *sk, | |||
| 1246 | const struct sockcm_cookie *sockc) | 1246 | const struct sockcm_cookie *sockc) |
| 1247 | { | 1247 | { |
| 1248 | struct sk_buff *skb, *skb_prev = NULL; | 1248 | struct sk_buff *skb, *skb_prev = NULL; |
| 1249 | unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu; | 1249 | unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu, pmtu; |
| 1250 | int exthdrlen = 0; | 1250 | int exthdrlen = 0; |
| 1251 | int dst_exthdrlen = 0; | 1251 | int dst_exthdrlen = 0; |
| 1252 | int hh_len; | 1252 | int hh_len; |
| @@ -1283,6 +1283,12 @@ static int __ip6_append_data(struct sock *sk, | |||
| 1283 | sizeof(struct frag_hdr) : 0) + | 1283 | sizeof(struct frag_hdr) : 0) + |
| 1284 | rt->rt6i_nfheader_len; | 1284 | rt->rt6i_nfheader_len; |
| 1285 | 1285 | ||
| 1286 | /* as per RFC 7112 section 5, the entire IPv6 Header Chain must fit | ||
| 1287 | * the first fragment | ||
| 1288 | */ | ||
| 1289 | if (headersize + transhdrlen > mtu) | ||
| 1290 | goto emsgsize; | ||
| 1291 | |||
| 1286 | if (cork->length + length > mtu - headersize && ipc6->dontfrag && | 1292 | if (cork->length + length > mtu - headersize && ipc6->dontfrag && |
| 1287 | (sk->sk_protocol == IPPROTO_UDP || | 1293 | (sk->sk_protocol == IPPROTO_UDP || |
| 1288 | sk->sk_protocol == IPPROTO_RAW)) { | 1294 | sk->sk_protocol == IPPROTO_RAW)) { |
| @@ -1298,9 +1304,8 @@ static int __ip6_append_data(struct sock *sk, | |||
| 1298 | 1304 | ||
| 1299 | if (cork->length + length > maxnonfragsize - headersize) { | 1305 | if (cork->length + length > maxnonfragsize - headersize) { |
| 1300 | emsgsize: | 1306 | emsgsize: |
| 1301 | ipv6_local_error(sk, EMSGSIZE, fl6, | 1307 | pmtu = max_t(int, mtu - headersize + sizeof(struct ipv6hdr), 0); |
| 1302 | mtu - headersize + | 1308 | ipv6_local_error(sk, EMSGSIZE, fl6, pmtu); |
| 1303 | sizeof(struct ipv6hdr)); | ||
| 1304 | return -EMSGSIZE; | 1309 | return -EMSGSIZE; |
| 1305 | } | 1310 | } |
| 1306 | 1311 | ||
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c index 60b771f49fb5..6ebb2e8777f4 100644 --- a/net/ipv6/ip6_vti.c +++ b/net/ipv6/ip6_vti.c | |||
| @@ -622,11 +622,12 @@ static int vti6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 622 | return 0; | 622 | return 0; |
| 623 | } | 623 | } |
| 624 | 624 | ||
| 625 | static void vti6_link_config(struct ip6_tnl *t) | 625 | static void vti6_link_config(struct ip6_tnl *t, bool keep_mtu) |
| 626 | { | 626 | { |
| 627 | struct net_device *dev = t->dev; | 627 | struct net_device *dev = t->dev; |
| 628 | struct __ip6_tnl_parm *p = &t->parms; | 628 | struct __ip6_tnl_parm *p = &t->parms; |
| 629 | struct net_device *tdev = NULL; | 629 | struct net_device *tdev = NULL; |
| 630 | int mtu; | ||
| 630 | 631 | ||
| 631 | memcpy(dev->dev_addr, &p->laddr, sizeof(struct in6_addr)); | 632 | memcpy(dev->dev_addr, &p->laddr, sizeof(struct in6_addr)); |
| 632 | memcpy(dev->broadcast, &p->raddr, sizeof(struct in6_addr)); | 633 | memcpy(dev->broadcast, &p->raddr, sizeof(struct in6_addr)); |
| @@ -640,6 +641,11 @@ static void vti6_link_config(struct ip6_tnl *t) | |||
| 640 | else | 641 | else |
| 641 | dev->flags &= ~IFF_POINTOPOINT; | 642 | dev->flags &= ~IFF_POINTOPOINT; |
| 642 | 643 | ||
| 644 | if (keep_mtu && dev->mtu) { | ||
| 645 | dev->mtu = clamp(dev->mtu, dev->min_mtu, dev->max_mtu); | ||
| 646 | return; | ||
| 647 | } | ||
| 648 | |||
| 643 | if (p->flags & IP6_TNL_F_CAP_XMIT) { | 649 | if (p->flags & IP6_TNL_F_CAP_XMIT) { |
| 644 | int strict = (ipv6_addr_type(&p->raddr) & | 650 | int strict = (ipv6_addr_type(&p->raddr) & |
| 645 | (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL)); | 651 | (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL)); |
| @@ -656,20 +662,25 @@ static void vti6_link_config(struct ip6_tnl *t) | |||
| 656 | tdev = __dev_get_by_index(t->net, p->link); | 662 | tdev = __dev_get_by_index(t->net, p->link); |
| 657 | 663 | ||
| 658 | if (tdev) | 664 | if (tdev) |
| 659 | dev->mtu = max_t(int, tdev->mtu - dev->hard_header_len, | 665 | mtu = tdev->mtu - sizeof(struct ipv6hdr); |
| 660 | IPV6_MIN_MTU); | 666 | else |
| 667 | mtu = ETH_DATA_LEN - LL_MAX_HEADER - sizeof(struct ipv6hdr); | ||
| 668 | |||
| 669 | dev->mtu = max_t(int, mtu, IPV6_MIN_MTU); | ||
| 661 | } | 670 | } |
| 662 | 671 | ||
| 663 | /** | 672 | /** |
| 664 | * vti6_tnl_change - update the tunnel parameters | 673 | * vti6_tnl_change - update the tunnel parameters |
| 665 | * @t: tunnel to be changed | 674 | * @t: tunnel to be changed |
| 666 | * @p: tunnel configuration parameters | 675 | * @p: tunnel configuration parameters |
| 676 | * @keep_mtu: MTU was set from userspace, don't re-compute it | ||
| 667 | * | 677 | * |
| 668 | * Description: | 678 | * Description: |
| 669 | * vti6_tnl_change() updates the tunnel parameters | 679 | * vti6_tnl_change() updates the tunnel parameters |
| 670 | **/ | 680 | **/ |
| 671 | static int | 681 | static int |
| 672 | vti6_tnl_change(struct ip6_tnl *t, const struct __ip6_tnl_parm *p) | 682 | vti6_tnl_change(struct ip6_tnl *t, const struct __ip6_tnl_parm *p, |
| 683 | bool keep_mtu) | ||
| 673 | { | 684 | { |
| 674 | t->parms.laddr = p->laddr; | 685 | t->parms.laddr = p->laddr; |
| 675 | t->parms.raddr = p->raddr; | 686 | t->parms.raddr = p->raddr; |
| @@ -679,11 +690,12 @@ vti6_tnl_change(struct ip6_tnl *t, const struct __ip6_tnl_parm *p) | |||
| 679 | t->parms.proto = p->proto; | 690 | t->parms.proto = p->proto; |
| 680 | t->parms.fwmark = p->fwmark; | 691 | t->parms.fwmark = p->fwmark; |
| 681 | dst_cache_reset(&t->dst_cache); | 692 | dst_cache_reset(&t->dst_cache); |
| 682 | vti6_link_config(t); | 693 | vti6_link_config(t, keep_mtu); |
| 683 | return 0; | 694 | return 0; |
| 684 | } | 695 | } |
| 685 | 696 | ||
| 686 | static int vti6_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p) | 697 | static int vti6_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p, |
| 698 | bool keep_mtu) | ||
| 687 | { | 699 | { |
| 688 | struct net *net = dev_net(t->dev); | 700 | struct net *net = dev_net(t->dev); |
| 689 | struct vti6_net *ip6n = net_generic(net, vti6_net_id); | 701 | struct vti6_net *ip6n = net_generic(net, vti6_net_id); |
| @@ -691,7 +703,7 @@ static int vti6_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p) | |||
| 691 | 703 | ||
| 692 | vti6_tnl_unlink(ip6n, t); | 704 | vti6_tnl_unlink(ip6n, t); |
| 693 | synchronize_net(); | 705 | synchronize_net(); |
| 694 | err = vti6_tnl_change(t, p); | 706 | err = vti6_tnl_change(t, p, keep_mtu); |
| 695 | vti6_tnl_link(ip6n, t); | 707 | vti6_tnl_link(ip6n, t); |
| 696 | netdev_state_change(t->dev); | 708 | netdev_state_change(t->dev); |
| 697 | return err; | 709 | return err; |
| @@ -804,7 +816,7 @@ vti6_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 804 | } else | 816 | } else |
| 805 | t = netdev_priv(dev); | 817 | t = netdev_priv(dev); |
| 806 | 818 | ||
| 807 | err = vti6_update(t, &p1); | 819 | err = vti6_update(t, &p1, false); |
| 808 | } | 820 | } |
| 809 | if (t) { | 821 | if (t) { |
| 810 | err = 0; | 822 | err = 0; |
| @@ -866,10 +878,8 @@ static void vti6_dev_setup(struct net_device *dev) | |||
| 866 | dev->priv_destructor = vti6_dev_free; | 878 | dev->priv_destructor = vti6_dev_free; |
| 867 | 879 | ||
| 868 | dev->type = ARPHRD_TUNNEL6; | 880 | dev->type = ARPHRD_TUNNEL6; |
| 869 | dev->hard_header_len = LL_MAX_HEADER + sizeof(struct ipv6hdr); | ||
| 870 | dev->mtu = ETH_DATA_LEN; | ||
| 871 | dev->min_mtu = IPV6_MIN_MTU; | 881 | dev->min_mtu = IPV6_MIN_MTU; |
| 872 | dev->max_mtu = IP_MAX_MTU; | 882 | dev->max_mtu = IP_MAX_MTU - sizeof(struct ipv6hdr); |
| 873 | dev->flags |= IFF_NOARP; | 883 | dev->flags |= IFF_NOARP; |
| 874 | dev->addr_len = sizeof(struct in6_addr); | 884 | dev->addr_len = sizeof(struct in6_addr); |
| 875 | netif_keep_dst(dev); | 885 | netif_keep_dst(dev); |
| @@ -905,7 +915,7 @@ static int vti6_dev_init(struct net_device *dev) | |||
| 905 | 915 | ||
| 906 | if (err) | 916 | if (err) |
| 907 | return err; | 917 | return err; |
| 908 | vti6_link_config(t); | 918 | vti6_link_config(t, true); |
| 909 | return 0; | 919 | return 0; |
| 910 | } | 920 | } |
| 911 | 921 | ||
| @@ -1010,7 +1020,7 @@ static int vti6_changelink(struct net_device *dev, struct nlattr *tb[], | |||
| 1010 | } else | 1020 | } else |
| 1011 | t = netdev_priv(dev); | 1021 | t = netdev_priv(dev); |
| 1012 | 1022 | ||
| 1013 | return vti6_update(t, &p); | 1023 | return vti6_update(t, &p, tb && tb[IFLA_MTU]); |
| 1014 | } | 1024 | } |
| 1015 | 1025 | ||
| 1016 | static size_t vti6_get_size(const struct net_device *dev) | 1026 | static size_t vti6_get_size(const struct net_device *dev) |
diff --git a/net/ipv6/netfilter/nf_socket_ipv6.c b/net/ipv6/netfilter/nf_socket_ipv6.c index ebb2bf84232a..f14de4b6d639 100644 --- a/net/ipv6/netfilter/nf_socket_ipv6.c +++ b/net/ipv6/netfilter/nf_socket_ipv6.c | |||
| @@ -116,9 +116,11 @@ struct sock *nf_sk_lookup_slow_v6(struct net *net, const struct sk_buff *skb, | |||
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | if (tproto == IPPROTO_UDP || tproto == IPPROTO_TCP) { | 118 | if (tproto == IPPROTO_UDP || tproto == IPPROTO_TCP) { |
| 119 | struct udphdr _hdr, *hp; | 119 | struct tcphdr _hdr; |
| 120 | struct udphdr *hp; | ||
| 120 | 121 | ||
| 121 | hp = skb_header_pointer(skb, thoff, sizeof(_hdr), &_hdr); | 122 | hp = skb_header_pointer(skb, thoff, tproto == IPPROTO_UDP ? |
| 123 | sizeof(*hp) : sizeof(_hdr), &_hdr); | ||
| 122 | if (hp == NULL) | 124 | if (hp == NULL) |
| 123 | return NULL; | 125 | return NULL; |
| 124 | 126 | ||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index e461ef1158b6..f239f91d2efb 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -923,6 +923,9 @@ static struct rt6_info *ip6_pol_route_lookup(struct net *net, | |||
| 923 | struct rt6_info *rt, *rt_cache; | 923 | struct rt6_info *rt, *rt_cache; |
| 924 | struct fib6_node *fn; | 924 | struct fib6_node *fn; |
| 925 | 925 | ||
| 926 | if (fl6->flowi6_flags & FLOWI_FLAG_SKIP_NH_OIF) | ||
| 927 | flags &= ~RT6_LOOKUP_F_IFACE; | ||
| 928 | |||
| 926 | rcu_read_lock(); | 929 | rcu_read_lock(); |
| 927 | fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr); | 930 | fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr); |
| 928 | restart: | 931 | restart: |
| @@ -1631,11 +1634,10 @@ static void rt6_age_examine_exception(struct rt6_exception_bucket *bucket, | |||
| 1631 | struct neighbour *neigh; | 1634 | struct neighbour *neigh; |
| 1632 | __u8 neigh_flags = 0; | 1635 | __u8 neigh_flags = 0; |
| 1633 | 1636 | ||
| 1634 | neigh = dst_neigh_lookup(&rt->dst, &rt->rt6i_gateway); | 1637 | neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway); |
| 1635 | if (neigh) { | 1638 | if (neigh) |
| 1636 | neigh_flags = neigh->flags; | 1639 | neigh_flags = neigh->flags; |
| 1637 | neigh_release(neigh); | 1640 | |
| 1638 | } | ||
| 1639 | if (!(neigh_flags & NTF_ROUTER)) { | 1641 | if (!(neigh_flags & NTF_ROUTER)) { |
| 1640 | RT6_TRACE("purging route %p via non-router but gateway\n", | 1642 | RT6_TRACE("purging route %p via non-router but gateway\n", |
| 1641 | rt); | 1643 | rt); |
| @@ -1659,7 +1661,8 @@ void rt6_age_exceptions(struct rt6_info *rt, | |||
| 1659 | if (!rcu_access_pointer(rt->rt6i_exception_bucket)) | 1661 | if (!rcu_access_pointer(rt->rt6i_exception_bucket)) |
| 1660 | return; | 1662 | return; |
| 1661 | 1663 | ||
| 1662 | spin_lock_bh(&rt6_exception_lock); | 1664 | rcu_read_lock_bh(); |
| 1665 | spin_lock(&rt6_exception_lock); | ||
| 1663 | bucket = rcu_dereference_protected(rt->rt6i_exception_bucket, | 1666 | bucket = rcu_dereference_protected(rt->rt6i_exception_bucket, |
| 1664 | lockdep_is_held(&rt6_exception_lock)); | 1667 | lockdep_is_held(&rt6_exception_lock)); |
| 1665 | 1668 | ||
| @@ -1673,7 +1676,8 @@ void rt6_age_exceptions(struct rt6_info *rt, | |||
| 1673 | bucket++; | 1676 | bucket++; |
| 1674 | } | 1677 | } |
| 1675 | } | 1678 | } |
| 1676 | spin_unlock_bh(&rt6_exception_lock); | 1679 | spin_unlock(&rt6_exception_lock); |
| 1680 | rcu_read_unlock_bh(); | ||
| 1677 | } | 1681 | } |
| 1678 | 1682 | ||
| 1679 | struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, | 1683 | struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, |
diff --git a/net/ipv6/seg6_iptunnel.c b/net/ipv6/seg6_iptunnel.c index 7a78dcfda68a..f343e6f0fc95 100644 --- a/net/ipv6/seg6_iptunnel.c +++ b/net/ipv6/seg6_iptunnel.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/net.h> | 16 | #include <linux/net.h> |
| 17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
| 18 | #include <net/ip.h> | 18 | #include <net/ip.h> |
| 19 | #include <net/ip_tunnels.h> | ||
| 19 | #include <net/lwtunnel.h> | 20 | #include <net/lwtunnel.h> |
| 20 | #include <net/netevent.h> | 21 | #include <net/netevent.h> |
| 21 | #include <net/netns/generic.h> | 22 | #include <net/netns/generic.h> |
| @@ -211,11 +212,6 @@ static int seg6_do_srh(struct sk_buff *skb) | |||
| 211 | 212 | ||
| 212 | tinfo = seg6_encap_lwtunnel(dst->lwtstate); | 213 | tinfo = seg6_encap_lwtunnel(dst->lwtstate); |
| 213 | 214 | ||
| 214 | if (likely(!skb->encapsulation)) { | ||
| 215 | skb_reset_inner_headers(skb); | ||
| 216 | skb->encapsulation = 1; | ||
| 217 | } | ||
| 218 | |||
| 219 | switch (tinfo->mode) { | 215 | switch (tinfo->mode) { |
| 220 | case SEG6_IPTUN_MODE_INLINE: | 216 | case SEG6_IPTUN_MODE_INLINE: |
| 221 | if (skb->protocol != htons(ETH_P_IPV6)) | 217 | if (skb->protocol != htons(ETH_P_IPV6)) |
| @@ -224,10 +220,12 @@ static int seg6_do_srh(struct sk_buff *skb) | |||
| 224 | err = seg6_do_srh_inline(skb, tinfo->srh); | 220 | err = seg6_do_srh_inline(skb, tinfo->srh); |
| 225 | if (err) | 221 | if (err) |
| 226 | return err; | 222 | return err; |
| 227 | |||
| 228 | skb_reset_inner_headers(skb); | ||
| 229 | break; | 223 | break; |
| 230 | case SEG6_IPTUN_MODE_ENCAP: | 224 | case SEG6_IPTUN_MODE_ENCAP: |
| 225 | err = iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6); | ||
| 226 | if (err) | ||
| 227 | return err; | ||
| 228 | |||
| 231 | if (skb->protocol == htons(ETH_P_IPV6)) | 229 | if (skb->protocol == htons(ETH_P_IPV6)) |
| 232 | proto = IPPROTO_IPV6; | 230 | proto = IPPROTO_IPV6; |
| 233 | else if (skb->protocol == htons(ETH_P_IP)) | 231 | else if (skb->protocol == htons(ETH_P_IP)) |
| @@ -239,6 +237,8 @@ static int seg6_do_srh(struct sk_buff *skb) | |||
| 239 | if (err) | 237 | if (err) |
| 240 | return err; | 238 | return err; |
| 241 | 239 | ||
| 240 | skb_set_inner_transport_header(skb, skb_transport_offset(skb)); | ||
| 241 | skb_set_inner_protocol(skb, skb->protocol); | ||
| 242 | skb->protocol = htons(ETH_P_IPV6); | 242 | skb->protocol = htons(ETH_P_IPV6); |
| 243 | break; | 243 | break; |
| 244 | case SEG6_IPTUN_MODE_L2ENCAP: | 244 | case SEG6_IPTUN_MODE_L2ENCAP: |
| @@ -262,8 +262,6 @@ static int seg6_do_srh(struct sk_buff *skb) | |||
| 262 | ipv6_hdr(skb)->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); | 262 | ipv6_hdr(skb)->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); |
| 263 | skb_set_transport_header(skb, sizeof(struct ipv6hdr)); | 263 | skb_set_transport_header(skb, sizeof(struct ipv6hdr)); |
| 264 | 264 | ||
| 265 | skb_set_inner_protocol(skb, skb->protocol); | ||
| 266 | |||
| 267 | return 0; | 265 | return 0; |
| 268 | } | 266 | } |
| 269 | 267 | ||
diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c index e7a3a6b6cf56..e997141aed8c 100644 --- a/net/ipv6/syncookies.c +++ b/net/ipv6/syncookies.c | |||
| @@ -217,6 +217,8 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) | |||
| 217 | treq->snt_isn = cookie; | 217 | treq->snt_isn = cookie; |
| 218 | treq->ts_off = 0; | 218 | treq->ts_off = 0; |
| 219 | treq->txhash = net_tx_rndhash(); | 219 | treq->txhash = net_tx_rndhash(); |
| 220 | if (IS_ENABLED(CONFIG_SMC)) | ||
| 221 | ireq->smc_ok = 0; | ||
| 220 | 222 | ||
| 221 | /* | 223 | /* |
| 222 | * We need to lookup the dst_entry to get the correct window size. | 224 | * We need to lookup the dst_entry to get the correct window size. |
diff --git a/net/llc/llc_c_ac.c b/net/llc/llc_c_ac.c index f59648018060..163121192aca 100644 --- a/net/llc/llc_c_ac.c +++ b/net/llc/llc_c_ac.c | |||
| @@ -389,7 +389,7 @@ static int llc_conn_ac_send_i_cmd_p_set_0(struct sock *sk, struct sk_buff *skb) | |||
| 389 | llc_pdu_init_as_i_cmd(skb, 0, llc->vS, llc->vR); | 389 | llc_pdu_init_as_i_cmd(skb, 0, llc->vS, llc->vR); |
| 390 | rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); | 390 | rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); |
| 391 | if (likely(!rc)) { | 391 | if (likely(!rc)) { |
| 392 | llc_conn_send_pdu(sk, skb); | 392 | rc = llc_conn_send_pdu(sk, skb); |
| 393 | llc_conn_ac_inc_vs_by_1(sk, skb); | 393 | llc_conn_ac_inc_vs_by_1(sk, skb); |
| 394 | } | 394 | } |
| 395 | return rc; | 395 | return rc; |
| @@ -916,7 +916,7 @@ static int llc_conn_ac_send_i_rsp_f_set_ackpf(struct sock *sk, | |||
| 916 | llc_pdu_init_as_i_cmd(skb, llc->ack_pf, llc->vS, llc->vR); | 916 | llc_pdu_init_as_i_cmd(skb, llc->ack_pf, llc->vS, llc->vR); |
| 917 | rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); | 917 | rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac); |
| 918 | if (likely(!rc)) { | 918 | if (likely(!rc)) { |
| 919 | llc_conn_send_pdu(sk, skb); | 919 | rc = llc_conn_send_pdu(sk, skb); |
| 920 | llc_conn_ac_inc_vs_by_1(sk, skb); | 920 | llc_conn_ac_inc_vs_by_1(sk, skb); |
| 921 | } | 921 | } |
| 922 | return rc; | 922 | return rc; |
| @@ -935,14 +935,17 @@ static int llc_conn_ac_send_i_rsp_f_set_ackpf(struct sock *sk, | |||
| 935 | int llc_conn_ac_send_i_as_ack(struct sock *sk, struct sk_buff *skb) | 935 | int llc_conn_ac_send_i_as_ack(struct sock *sk, struct sk_buff *skb) |
| 936 | { | 936 | { |
| 937 | struct llc_sock *llc = llc_sk(sk); | 937 | struct llc_sock *llc = llc_sk(sk); |
| 938 | int ret; | ||
| 938 | 939 | ||
| 939 | if (llc->ack_must_be_send) { | 940 | if (llc->ack_must_be_send) { |
| 940 | llc_conn_ac_send_i_rsp_f_set_ackpf(sk, skb); | 941 | ret = llc_conn_ac_send_i_rsp_f_set_ackpf(sk, skb); |
| 941 | llc->ack_must_be_send = 0 ; | 942 | llc->ack_must_be_send = 0 ; |
| 942 | llc->ack_pf = 0; | 943 | llc->ack_pf = 0; |
| 943 | } else | 944 | } else { |
| 944 | llc_conn_ac_send_i_cmd_p_set_0(sk, skb); | 945 | ret = llc_conn_ac_send_i_cmd_p_set_0(sk, skb); |
| 945 | return 0; | 946 | } |
| 947 | |||
| 948 | return ret; | ||
| 946 | } | 949 | } |
| 947 | 950 | ||
| 948 | /** | 951 | /** |
diff --git a/net/llc/llc_conn.c b/net/llc/llc_conn.c index 9177dbb16dce..110e32bcb399 100644 --- a/net/llc/llc_conn.c +++ b/net/llc/llc_conn.c | |||
| @@ -30,7 +30,7 @@ | |||
| 30 | #endif | 30 | #endif |
| 31 | 31 | ||
| 32 | static int llc_find_offset(int state, int ev_type); | 32 | static int llc_find_offset(int state, int ev_type); |
| 33 | static void llc_conn_send_pdus(struct sock *sk); | 33 | static int llc_conn_send_pdus(struct sock *sk, struct sk_buff *skb); |
| 34 | static int llc_conn_service(struct sock *sk, struct sk_buff *skb); | 34 | static int llc_conn_service(struct sock *sk, struct sk_buff *skb); |
| 35 | static int llc_exec_conn_trans_actions(struct sock *sk, | 35 | static int llc_exec_conn_trans_actions(struct sock *sk, |
| 36 | struct llc_conn_state_trans *trans, | 36 | struct llc_conn_state_trans *trans, |
| @@ -193,11 +193,11 @@ out_skb_put: | |||
| 193 | return rc; | 193 | return rc; |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | void llc_conn_send_pdu(struct sock *sk, struct sk_buff *skb) | 196 | int llc_conn_send_pdu(struct sock *sk, struct sk_buff *skb) |
| 197 | { | 197 | { |
| 198 | /* queue PDU to send to MAC layer */ | 198 | /* queue PDU to send to MAC layer */ |
| 199 | skb_queue_tail(&sk->sk_write_queue, skb); | 199 | skb_queue_tail(&sk->sk_write_queue, skb); |
| 200 | llc_conn_send_pdus(sk); | 200 | return llc_conn_send_pdus(sk, skb); |
| 201 | } | 201 | } |
| 202 | 202 | ||
| 203 | /** | 203 | /** |
| @@ -255,7 +255,7 @@ void llc_conn_resend_i_pdu_as_cmd(struct sock *sk, u8 nr, u8 first_p_bit) | |||
| 255 | if (howmany_resend > 0) | 255 | if (howmany_resend > 0) |
| 256 | llc->vS = (llc->vS + 1) % LLC_2_SEQ_NBR_MODULO; | 256 | llc->vS = (llc->vS + 1) % LLC_2_SEQ_NBR_MODULO; |
| 257 | /* any PDUs to re-send are queued up; start sending to MAC */ | 257 | /* any PDUs to re-send are queued up; start sending to MAC */ |
| 258 | llc_conn_send_pdus(sk); | 258 | llc_conn_send_pdus(sk, NULL); |
| 259 | out:; | 259 | out:; |
| 260 | } | 260 | } |
| 261 | 261 | ||
| @@ -296,7 +296,7 @@ void llc_conn_resend_i_pdu_as_rsp(struct sock *sk, u8 nr, u8 first_f_bit) | |||
| 296 | if (howmany_resend > 0) | 296 | if (howmany_resend > 0) |
| 297 | llc->vS = (llc->vS + 1) % LLC_2_SEQ_NBR_MODULO; | 297 | llc->vS = (llc->vS + 1) % LLC_2_SEQ_NBR_MODULO; |
| 298 | /* any PDUs to re-send are queued up; start sending to MAC */ | 298 | /* any PDUs to re-send are queued up; start sending to MAC */ |
| 299 | llc_conn_send_pdus(sk); | 299 | llc_conn_send_pdus(sk, NULL); |
| 300 | out:; | 300 | out:; |
| 301 | } | 301 | } |
| 302 | 302 | ||
| @@ -340,12 +340,16 @@ out: | |||
| 340 | /** | 340 | /** |
| 341 | * llc_conn_send_pdus - Sends queued PDUs | 341 | * llc_conn_send_pdus - Sends queued PDUs |
| 342 | * @sk: active connection | 342 | * @sk: active connection |
| 343 | * @hold_skb: the skb held by caller, or NULL if does not care | ||
| 343 | * | 344 | * |
| 344 | * Sends queued pdus to MAC layer for transmission. | 345 | * Sends queued pdus to MAC layer for transmission. When @hold_skb is |
| 346 | * NULL, always return 0. Otherwise, return 0 if @hold_skb is sent | ||
| 347 | * successfully, or 1 for failure. | ||
| 345 | */ | 348 | */ |
| 346 | static void llc_conn_send_pdus(struct sock *sk) | 349 | static int llc_conn_send_pdus(struct sock *sk, struct sk_buff *hold_skb) |
| 347 | { | 350 | { |
| 348 | struct sk_buff *skb; | 351 | struct sk_buff *skb; |
| 352 | int ret = 0; | ||
| 349 | 353 | ||
| 350 | while ((skb = skb_dequeue(&sk->sk_write_queue)) != NULL) { | 354 | while ((skb = skb_dequeue(&sk->sk_write_queue)) != NULL) { |
| 351 | struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); | 355 | struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb); |
| @@ -357,10 +361,20 @@ static void llc_conn_send_pdus(struct sock *sk) | |||
| 357 | skb_queue_tail(&llc_sk(sk)->pdu_unack_q, skb); | 361 | skb_queue_tail(&llc_sk(sk)->pdu_unack_q, skb); |
| 358 | if (!skb2) | 362 | if (!skb2) |
| 359 | break; | 363 | break; |
| 360 | skb = skb2; | 364 | dev_queue_xmit(skb2); |
| 365 | } else { | ||
| 366 | bool is_target = skb == hold_skb; | ||
| 367 | int rc; | ||
| 368 | |||
| 369 | if (is_target) | ||
| 370 | skb_get(skb); | ||
| 371 | rc = dev_queue_xmit(skb); | ||
| 372 | if (is_target) | ||
| 373 | ret = rc; | ||
| 361 | } | 374 | } |
| 362 | dev_queue_xmit(skb); | ||
| 363 | } | 375 | } |
| 376 | |||
| 377 | return ret; | ||
| 364 | } | 378 | } |
| 365 | 379 | ||
| 366 | /** | 380 | /** |
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index 6e93782bbe4f..9134cc429ad4 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c | |||
| @@ -74,15 +74,77 @@ static void nft_trans_destroy(struct nft_trans *trans) | |||
| 74 | kfree(trans); | 74 | kfree(trans); |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | /* removal requests are queued in the commit_list, but not acted upon | ||
| 78 | * until after all new rules are in place. | ||
| 79 | * | ||
| 80 | * Therefore, nf_register_net_hook(net, &nat_hook) runs before pending | ||
| 81 | * nf_unregister_net_hook(). | ||
| 82 | * | ||
| 83 | * nf_register_net_hook thus fails if a nat hook is already in place | ||
| 84 | * even if the conflicting hook is about to be removed. | ||
| 85 | * | ||
| 86 | * If collision is detected, search commit_log for DELCHAIN matching | ||
| 87 | * the new nat hooknum; if we find one collision is temporary: | ||
| 88 | * | ||
| 89 | * Either transaction is aborted (new/colliding hook is removed), or | ||
| 90 | * transaction is committed (old hook is removed). | ||
| 91 | */ | ||
| 92 | static bool nf_tables_allow_nat_conflict(const struct net *net, | ||
| 93 | const struct nf_hook_ops *ops) | ||
| 94 | { | ||
| 95 | const struct nft_trans *trans; | ||
| 96 | bool ret = false; | ||
| 97 | |||
| 98 | if (!ops->nat_hook) | ||
| 99 | return false; | ||
| 100 | |||
| 101 | list_for_each_entry(trans, &net->nft.commit_list, list) { | ||
| 102 | const struct nf_hook_ops *pending_ops; | ||
| 103 | const struct nft_chain *pending; | ||
| 104 | |||
| 105 | if (trans->msg_type != NFT_MSG_NEWCHAIN && | ||
| 106 | trans->msg_type != NFT_MSG_DELCHAIN) | ||
| 107 | continue; | ||
| 108 | |||
| 109 | pending = trans->ctx.chain; | ||
| 110 | if (!nft_is_base_chain(pending)) | ||
| 111 | continue; | ||
| 112 | |||
| 113 | pending_ops = &nft_base_chain(pending)->ops; | ||
| 114 | if (pending_ops->nat_hook && | ||
| 115 | pending_ops->pf == ops->pf && | ||
| 116 | pending_ops->hooknum == ops->hooknum) { | ||
| 117 | /* other hook registration already pending? */ | ||
| 118 | if (trans->msg_type == NFT_MSG_NEWCHAIN) | ||
| 119 | return false; | ||
| 120 | |||
| 121 | ret = true; | ||
| 122 | } | ||
| 123 | } | ||
| 124 | |||
| 125 | return ret; | ||
| 126 | } | ||
| 127 | |||
| 77 | static int nf_tables_register_hook(struct net *net, | 128 | static int nf_tables_register_hook(struct net *net, |
| 78 | const struct nft_table *table, | 129 | const struct nft_table *table, |
| 79 | struct nft_chain *chain) | 130 | struct nft_chain *chain) |
| 80 | { | 131 | { |
| 132 | struct nf_hook_ops *ops; | ||
| 133 | int ret; | ||
| 134 | |||
| 81 | if (table->flags & NFT_TABLE_F_DORMANT || | 135 | if (table->flags & NFT_TABLE_F_DORMANT || |
| 82 | !nft_is_base_chain(chain)) | 136 | !nft_is_base_chain(chain)) |
| 83 | return 0; | 137 | return 0; |
| 84 | 138 | ||
| 85 | return nf_register_net_hook(net, &nft_base_chain(chain)->ops); | 139 | ops = &nft_base_chain(chain)->ops; |
| 140 | ret = nf_register_net_hook(net, ops); | ||
| 141 | if (ret == -EBUSY && nf_tables_allow_nat_conflict(net, ops)) { | ||
| 142 | ops->nat_hook = false; | ||
| 143 | ret = nf_register_net_hook(net, ops); | ||
| 144 | ops->nat_hook = true; | ||
| 145 | } | ||
| 146 | |||
| 147 | return ret; | ||
| 86 | } | 148 | } |
| 87 | 149 | ||
| 88 | static void nf_tables_unregister_hook(struct net *net, | 150 | static void nf_tables_unregister_hook(struct net *net, |
| @@ -1226,8 +1288,6 @@ static void nf_tables_chain_destroy(struct nft_ctx *ctx) | |||
| 1226 | free_percpu(basechain->stats); | 1288 | free_percpu(basechain->stats); |
| 1227 | if (basechain->stats) | 1289 | if (basechain->stats) |
| 1228 | static_branch_dec(&nft_counters_enabled); | 1290 | static_branch_dec(&nft_counters_enabled); |
| 1229 | if (basechain->ops.dev != NULL) | ||
| 1230 | dev_put(basechain->ops.dev); | ||
| 1231 | kfree(chain->name); | 1291 | kfree(chain->name); |
| 1232 | kfree(basechain); | 1292 | kfree(basechain); |
| 1233 | } else { | 1293 | } else { |
| @@ -1294,7 +1354,7 @@ static int nft_chain_parse_hook(struct net *net, | |||
| 1294 | } | 1354 | } |
| 1295 | 1355 | ||
| 1296 | nla_strlcpy(ifname, ha[NFTA_HOOK_DEV], IFNAMSIZ); | 1356 | nla_strlcpy(ifname, ha[NFTA_HOOK_DEV], IFNAMSIZ); |
| 1297 | dev = dev_get_by_name(net, ifname); | 1357 | dev = __dev_get_by_name(net, ifname); |
| 1298 | if (!dev) { | 1358 | if (!dev) { |
| 1299 | module_put(type->owner); | 1359 | module_put(type->owner); |
| 1300 | return -ENOENT; | 1360 | return -ENOENT; |
| @@ -1311,8 +1371,6 @@ static int nft_chain_parse_hook(struct net *net, | |||
| 1311 | static void nft_chain_release_hook(struct nft_chain_hook *hook) | 1371 | static void nft_chain_release_hook(struct nft_chain_hook *hook) |
| 1312 | { | 1372 | { |
| 1313 | module_put(hook->type->owner); | 1373 | module_put(hook->type->owner); |
| 1314 | if (hook->dev != NULL) | ||
| 1315 | dev_put(hook->dev); | ||
| 1316 | } | 1374 | } |
| 1317 | 1375 | ||
| 1318 | static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask, | 1376 | static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask, |
| @@ -1915,6 +1973,7 @@ static const struct nla_policy nft_rule_policy[NFTA_RULE_MAX + 1] = { | |||
| 1915 | [NFTA_RULE_POSITION] = { .type = NLA_U64 }, | 1973 | [NFTA_RULE_POSITION] = { .type = NLA_U64 }, |
| 1916 | [NFTA_RULE_USERDATA] = { .type = NLA_BINARY, | 1974 | [NFTA_RULE_USERDATA] = { .type = NLA_BINARY, |
| 1917 | .len = NFT_USERDATA_MAXLEN }, | 1975 | .len = NFT_USERDATA_MAXLEN }, |
| 1976 | [NFTA_RULE_ID] = { .type = NLA_U32 }, | ||
| 1918 | }; | 1977 | }; |
| 1919 | 1978 | ||
| 1920 | static int nf_tables_fill_rule_info(struct sk_buff *skb, struct net *net, | 1979 | static int nf_tables_fill_rule_info(struct sk_buff *skb, struct net *net, |
| @@ -2450,6 +2509,9 @@ EXPORT_SYMBOL_GPL(nft_unregister_set); | |||
| 2450 | 2509 | ||
| 2451 | static bool nft_set_ops_candidate(const struct nft_set_ops *ops, u32 flags) | 2510 | static bool nft_set_ops_candidate(const struct nft_set_ops *ops, u32 flags) |
| 2452 | { | 2511 | { |
| 2512 | if ((flags & NFT_SET_EVAL) && !ops->update) | ||
| 2513 | return false; | ||
| 2514 | |||
| 2453 | return (flags & ops->features) == (flags & NFT_SET_FEATURES); | 2515 | return (flags & ops->features) == (flags & NFT_SET_FEATURES); |
| 2454 | } | 2516 | } |
| 2455 | 2517 | ||
| @@ -2514,7 +2576,7 @@ nft_select_set_ops(const struct nft_ctx *ctx, | |||
| 2514 | if (est.space == best.space && | 2576 | if (est.space == best.space && |
| 2515 | est.lookup < best.lookup) | 2577 | est.lookup < best.lookup) |
| 2516 | break; | 2578 | break; |
| 2517 | } else if (est.size < best.size) { | 2579 | } else if (est.size < best.size || !bops) { |
| 2518 | break; | 2580 | break; |
| 2519 | } | 2581 | } |
| 2520 | continue; | 2582 | continue; |
| @@ -3319,6 +3381,8 @@ static const struct nla_policy nft_set_elem_policy[NFTA_SET_ELEM_MAX + 1] = { | |||
| 3319 | [NFTA_SET_ELEM_TIMEOUT] = { .type = NLA_U64 }, | 3381 | [NFTA_SET_ELEM_TIMEOUT] = { .type = NLA_U64 }, |
| 3320 | [NFTA_SET_ELEM_USERDATA] = { .type = NLA_BINARY, | 3382 | [NFTA_SET_ELEM_USERDATA] = { .type = NLA_BINARY, |
| 3321 | .len = NFT_USERDATA_MAXLEN }, | 3383 | .len = NFT_USERDATA_MAXLEN }, |
| 3384 | [NFTA_SET_ELEM_EXPR] = { .type = NLA_NESTED }, | ||
| 3385 | [NFTA_SET_ELEM_OBJREF] = { .type = NLA_STRING }, | ||
| 3322 | }; | 3386 | }; |
| 3323 | 3387 | ||
| 3324 | static const struct nla_policy nft_set_elem_list_policy[NFTA_SET_ELEM_LIST_MAX + 1] = { | 3388 | static const struct nla_policy nft_set_elem_list_policy[NFTA_SET_ELEM_LIST_MAX + 1] = { |
| @@ -4868,8 +4932,6 @@ nf_tables_flowtable_lookup_byhandle(const struct nft_table *table, | |||
| 4868 | return ERR_PTR(-ENOENT); | 4932 | return ERR_PTR(-ENOENT); |
| 4869 | } | 4933 | } |
| 4870 | 4934 | ||
| 4871 | #define NFT_FLOWTABLE_DEVICE_MAX 8 | ||
| 4872 | |||
| 4873 | static int nf_tables_parse_devices(const struct nft_ctx *ctx, | 4935 | static int nf_tables_parse_devices(const struct nft_ctx *ctx, |
| 4874 | const struct nlattr *attr, | 4936 | const struct nlattr *attr, |
| 4875 | struct net_device *dev_array[], int *len) | 4937 | struct net_device *dev_array[], int *len) |
| @@ -4886,7 +4948,7 @@ static int nf_tables_parse_devices(const struct nft_ctx *ctx, | |||
| 4886 | } | 4948 | } |
| 4887 | 4949 | ||
| 4888 | nla_strlcpy(ifname, tmp, IFNAMSIZ); | 4950 | nla_strlcpy(ifname, tmp, IFNAMSIZ); |
| 4889 | dev = dev_get_by_name(ctx->net, ifname); | 4951 | dev = __dev_get_by_name(ctx->net, ifname); |
| 4890 | if (!dev) { | 4952 | if (!dev) { |
| 4891 | err = -ENOENT; | 4953 | err = -ENOENT; |
| 4892 | goto err1; | 4954 | goto err1; |
| @@ -4942,13 +5004,11 @@ static int nf_tables_flowtable_parse_hook(const struct nft_ctx *ctx, | |||
| 4942 | err = nf_tables_parse_devices(ctx, tb[NFTA_FLOWTABLE_HOOK_DEVS], | 5004 | err = nf_tables_parse_devices(ctx, tb[NFTA_FLOWTABLE_HOOK_DEVS], |
| 4943 | dev_array, &n); | 5005 | dev_array, &n); |
| 4944 | if (err < 0) | 5006 | if (err < 0) |
| 4945 | goto err1; | 5007 | return err; |
| 4946 | 5008 | ||
| 4947 | ops = kzalloc(sizeof(struct nf_hook_ops) * n, GFP_KERNEL); | 5009 | ops = kzalloc(sizeof(struct nf_hook_ops) * n, GFP_KERNEL); |
| 4948 | if (!ops) { | 5010 | if (!ops) |
| 4949 | err = -ENOMEM; | 5011 | return -ENOMEM; |
| 4950 | goto err1; | ||
| 4951 | } | ||
| 4952 | 5012 | ||
| 4953 | flowtable->hooknum = hooknum; | 5013 | flowtable->hooknum = hooknum; |
| 4954 | flowtable->priority = priority; | 5014 | flowtable->priority = priority; |
| @@ -4962,13 +5022,10 @@ static int nf_tables_flowtable_parse_hook(const struct nft_ctx *ctx, | |||
| 4962 | flowtable->ops[i].priv = &flowtable->data.rhashtable; | 5022 | flowtable->ops[i].priv = &flowtable->data.rhashtable; |
| 4963 | flowtable->ops[i].hook = flowtable->data.type->hook; | 5023 | flowtable->ops[i].hook = flowtable->data.type->hook; |
| 4964 | flowtable->ops[i].dev = dev_array[i]; | 5024 | flowtable->ops[i].dev = dev_array[i]; |
| 5025 | flowtable->dev_name[i] = kstrdup(dev_array[i]->name, | ||
| 5026 | GFP_KERNEL); | ||
| 4965 | } | 5027 | } |
| 4966 | 5028 | ||
| 4967 | err = 0; | ||
| 4968 | err1: | ||
| 4969 | for (i = 0; i < n; i++) | ||
| 4970 | dev_put(dev_array[i]); | ||
| 4971 | |||
| 4972 | return err; | 5029 | return err; |
| 4973 | } | 5030 | } |
| 4974 | 5031 | ||
| @@ -5139,8 +5196,10 @@ static int nf_tables_newflowtable(struct net *net, struct sock *nlsk, | |||
| 5139 | err5: | 5196 | err5: |
| 5140 | i = flowtable->ops_len; | 5197 | i = flowtable->ops_len; |
| 5141 | err4: | 5198 | err4: |
| 5142 | for (k = i - 1; k >= 0; k--) | 5199 | for (k = i - 1; k >= 0; k--) { |
| 5200 | kfree(flowtable->dev_name[k]); | ||
| 5143 | nf_unregister_net_hook(net, &flowtable->ops[k]); | 5201 | nf_unregister_net_hook(net, &flowtable->ops[k]); |
| 5202 | } | ||
| 5144 | 5203 | ||
| 5145 | kfree(flowtable->ops); | 5204 | kfree(flowtable->ops); |
| 5146 | err3: | 5205 | err3: |
| @@ -5230,9 +5289,9 @@ static int nf_tables_fill_flowtable_info(struct sk_buff *skb, struct net *net, | |||
| 5230 | goto nla_put_failure; | 5289 | goto nla_put_failure; |
| 5231 | 5290 | ||
| 5232 | for (i = 0; i < flowtable->ops_len; i++) { | 5291 | for (i = 0; i < flowtable->ops_len; i++) { |
| 5233 | if (flowtable->ops[i].dev && | 5292 | if (flowtable->dev_name[i][0] && |
| 5234 | nla_put_string(skb, NFTA_DEVICE_NAME, | 5293 | nla_put_string(skb, NFTA_DEVICE_NAME, |
| 5235 | flowtable->ops[i].dev->name)) | 5294 | flowtable->dev_name[i])) |
| 5236 | goto nla_put_failure; | 5295 | goto nla_put_failure; |
| 5237 | } | 5296 | } |
| 5238 | nla_nest_end(skb, nest_devs); | 5297 | nla_nest_end(skb, nest_devs); |
| @@ -5474,6 +5533,7 @@ static void nft_flowtable_event(unsigned long event, struct net_device *dev, | |||
| 5474 | continue; | 5533 | continue; |
| 5475 | 5534 | ||
| 5476 | nf_unregister_net_hook(dev_net(dev), &flowtable->ops[i]); | 5535 | nf_unregister_net_hook(dev_net(dev), &flowtable->ops[i]); |
| 5536 | flowtable->dev_name[i][0] = '\0'; | ||
| 5477 | flowtable->ops[i].dev = NULL; | 5537 | flowtable->ops[i].dev = NULL; |
| 5478 | break; | 5538 | break; |
| 5479 | } | 5539 | } |
diff --git a/net/netfilter/nft_set_hash.c b/net/netfilter/nft_set_hash.c index d40591fe1b2f..fc9c6d5d64cd 100644 --- a/net/netfilter/nft_set_hash.c +++ b/net/netfilter/nft_set_hash.c | |||
| @@ -674,7 +674,7 @@ static const struct nft_set_ops * | |||
| 674 | nft_hash_select_ops(const struct nft_ctx *ctx, const struct nft_set_desc *desc, | 674 | nft_hash_select_ops(const struct nft_ctx *ctx, const struct nft_set_desc *desc, |
| 675 | u32 flags) | 675 | u32 flags) |
| 676 | { | 676 | { |
| 677 | if (desc->size && !(flags & NFT_SET_TIMEOUT)) { | 677 | if (desc->size && !(flags & (NFT_SET_EVAL | NFT_SET_TIMEOUT))) { |
| 678 | switch (desc->klen) { | 678 | switch (desc->klen) { |
| 679 | case 4: | 679 | case 4: |
| 680 | return &nft_hash_fast_ops; | 680 | return &nft_hash_fast_ops; |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index f1b02d87e336..fa556fdef57d 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -1085,6 +1085,9 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr, | |||
| 1085 | if (addr->sa_family != AF_NETLINK) | 1085 | if (addr->sa_family != AF_NETLINK) |
| 1086 | return -EINVAL; | 1086 | return -EINVAL; |
| 1087 | 1087 | ||
| 1088 | if (alen < sizeof(struct sockaddr_nl)) | ||
| 1089 | return -EINVAL; | ||
| 1090 | |||
| 1088 | if ((nladdr->nl_groups || nladdr->nl_pid) && | 1091 | if ((nladdr->nl_groups || nladdr->nl_pid) && |
| 1089 | !netlink_allowed(sock, NL_CFG_F_NONROOT_SEND)) | 1092 | !netlink_allowed(sock, NL_CFG_F_NONROOT_SEND)) |
| 1090 | return -EPERM; | 1093 | return -EPERM; |
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index 0d78b58e1898..72251241665a 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c | |||
| @@ -171,8 +171,10 @@ static int tcf_dump_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb, | |||
| 171 | continue; | 171 | continue; |
| 172 | 172 | ||
| 173 | nest = nla_nest_start(skb, n_i); | 173 | nest = nla_nest_start(skb, n_i); |
| 174 | if (!nest) | 174 | if (!nest) { |
| 175 | index--; | ||
| 175 | goto nla_put_failure; | 176 | goto nla_put_failure; |
| 177 | } | ||
| 176 | err = tcf_action_dump_1(skb, p, 0, 0); | 178 | err = tcf_action_dump_1(skb, p, 0, 0); |
| 177 | if (err < 0) { | 179 | if (err < 0) { |
| 178 | index--; | 180 | index--; |
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 7e3fbe9cc936..39c144b6ff98 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
| @@ -373,24 +373,33 @@ bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, | |||
| 373 | */ | 373 | */ |
| 374 | static inline bool qdisc_restart(struct Qdisc *q, int *packets) | 374 | static inline bool qdisc_restart(struct Qdisc *q, int *packets) |
| 375 | { | 375 | { |
| 376 | bool more, validate, nolock = q->flags & TCQ_F_NOLOCK; | ||
| 376 | spinlock_t *root_lock = NULL; | 377 | spinlock_t *root_lock = NULL; |
| 377 | struct netdev_queue *txq; | 378 | struct netdev_queue *txq; |
| 378 | struct net_device *dev; | 379 | struct net_device *dev; |
| 379 | struct sk_buff *skb; | 380 | struct sk_buff *skb; |
| 380 | bool validate; | ||
| 381 | 381 | ||
| 382 | /* Dequeue packet */ | 382 | /* Dequeue packet */ |
| 383 | if (nolock && test_and_set_bit(__QDISC_STATE_RUNNING, &q->state)) | ||
| 384 | return false; | ||
| 385 | |||
| 383 | skb = dequeue_skb(q, &validate, packets); | 386 | skb = dequeue_skb(q, &validate, packets); |
| 384 | if (unlikely(!skb)) | 387 | if (unlikely(!skb)) { |
| 388 | if (nolock) | ||
| 389 | clear_bit(__QDISC_STATE_RUNNING, &q->state); | ||
| 385 | return false; | 390 | return false; |
| 391 | } | ||
| 386 | 392 | ||
| 387 | if (!(q->flags & TCQ_F_NOLOCK)) | 393 | if (!nolock) |
| 388 | root_lock = qdisc_lock(q); | 394 | root_lock = qdisc_lock(q); |
| 389 | 395 | ||
| 390 | dev = qdisc_dev(q); | 396 | dev = qdisc_dev(q); |
| 391 | txq = skb_get_tx_queue(dev, skb); | 397 | txq = skb_get_tx_queue(dev, skb); |
| 392 | 398 | ||
| 393 | return sch_direct_xmit(skb, q, dev, txq, root_lock, validate); | 399 | more = sch_direct_xmit(skb, q, dev, txq, root_lock, validate); |
| 400 | if (nolock) | ||
| 401 | clear_bit(__QDISC_STATE_RUNNING, &q->state); | ||
| 402 | return more; | ||
| 394 | } | 403 | } |
| 395 | 404 | ||
| 396 | void __qdisc_run(struct Qdisc *q) | 405 | void __qdisc_run(struct Qdisc *q) |
diff --git a/net/smc/smc_clc.c b/net/smc/smc_clc.c index 64fbc3230e6c..3a988c22f627 100644 --- a/net/smc/smc_clc.c +++ b/net/smc/smc_clc.c | |||
| @@ -304,7 +304,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, | |||
| 304 | 304 | ||
| 305 | /* receive the complete CLC message */ | 305 | /* receive the complete CLC message */ |
| 306 | memset(&msg, 0, sizeof(struct msghdr)); | 306 | memset(&msg, 0, sizeof(struct msghdr)); |
| 307 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, buflen); | 307 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, datlen); |
| 308 | krflags = MSG_WAITALL; | 308 | krflags = MSG_WAITALL; |
| 309 | smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; | 309 | smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; |
| 310 | len = sock_recvmsg(smc->clcsock, &msg, krflags); | 310 | len = sock_recvmsg(smc->clcsock, &msg, krflags); |
diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c index 1fdab5c4eda8..b9283ce5cd85 100644 --- a/net/strparser/strparser.c +++ b/net/strparser/strparser.c | |||
| @@ -60,7 +60,7 @@ static void strp_abort_strp(struct strparser *strp, int err) | |||
| 60 | struct sock *sk = strp->sk; | 60 | struct sock *sk = strp->sk; |
| 61 | 61 | ||
| 62 | /* Report an error on the lower socket */ | 62 | /* Report an error on the lower socket */ |
| 63 | sk->sk_err = err; | 63 | sk->sk_err = -err; |
| 64 | sk->sk_error_report(sk); | 64 | sk->sk_error_report(sk); |
| 65 | } | 65 | } |
| 66 | } | 66 | } |
| @@ -458,7 +458,7 @@ static void strp_msg_timeout(struct work_struct *w) | |||
| 458 | /* Message assembly timed out */ | 458 | /* Message assembly timed out */ |
| 459 | STRP_STATS_INCR(strp->stats.msg_timeouts); | 459 | STRP_STATS_INCR(strp->stats.msg_timeouts); |
| 460 | strp->cb.lock(strp); | 460 | strp->cb.lock(strp); |
| 461 | strp->cb.abort_parser(strp, ETIMEDOUT); | 461 | strp->cb.abort_parser(strp, -ETIMEDOUT); |
| 462 | strp->cb.unlock(strp); | 462 | strp->cb.unlock(strp); |
| 463 | } | 463 | } |
| 464 | 464 | ||
diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c index 44fc54dc013c..352abca2605f 100644 --- a/net/xfrm/xfrm_input.c +++ b/net/xfrm/xfrm_input.c | |||
| @@ -27,6 +27,12 @@ struct xfrm_trans_tasklet { | |||
| 27 | }; | 27 | }; |
| 28 | 28 | ||
| 29 | struct xfrm_trans_cb { | 29 | struct xfrm_trans_cb { |
| 30 | union { | ||
| 31 | struct inet_skb_parm h4; | ||
| 32 | #if IS_ENABLED(CONFIG_IPV6) | ||
| 33 | struct inet6_skb_parm h6; | ||
| 34 | #endif | ||
| 35 | } header; | ||
| 30 | int (*finish)(struct net *net, struct sock *sk, struct sk_buff *skb); | 36 | int (*finish)(struct net *net, struct sock *sk, struct sk_buff *skb); |
| 31 | }; | 37 | }; |
| 32 | 38 | ||
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index 23468672a767..89b178a78dc7 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c | |||
| @@ -285,8 +285,9 @@ void xfrm_local_error(struct sk_buff *skb, int mtu) | |||
| 285 | return; | 285 | return; |
| 286 | 286 | ||
| 287 | afinfo = xfrm_state_get_afinfo(proto); | 287 | afinfo = xfrm_state_get_afinfo(proto); |
| 288 | if (afinfo) | 288 | if (afinfo) { |
| 289 | afinfo->local_error(skb, mtu); | 289 | afinfo->local_error(skb, mtu); |
| 290 | rcu_read_unlock(); | 290 | rcu_read_unlock(); |
| 291 | } | ||
| 291 | } | 292 | } |
| 292 | EXPORT_SYMBOL_GPL(xfrm_local_error); | 293 | EXPORT_SYMBOL_GPL(xfrm_local_error); |
diff --git a/scripts/adjust_autoksyms.sh b/scripts/adjust_autoksyms.sh index 513da1a4a2da..d67830e6e360 100755 --- a/scripts/adjust_autoksyms.sh +++ b/scripts/adjust_autoksyms.sh | |||
| @@ -84,6 +84,13 @@ while read sympath; do | |||
| 84 | depfile="include/config/ksym/${sympath}.h" | 84 | depfile="include/config/ksym/${sympath}.h" |
| 85 | mkdir -p "$(dirname "$depfile")" | 85 | mkdir -p "$(dirname "$depfile")" |
| 86 | touch "$depfile" | 86 | touch "$depfile" |
| 87 | # Filesystems with coarse time precision may create timestamps | ||
| 88 | # equal to the one from a file that was very recently built and that | ||
| 89 | # needs to be rebuild. Let's guard against that by making sure our | ||
| 90 | # dep files are always newer than the first file we created here. | ||
| 91 | while [ ! "$depfile" -nt "$new_ksyms_file" ]; do | ||
| 92 | touch "$depfile" | ||
| 93 | done | ||
| 87 | echo $((count += 1)) | 94 | echo $((count += 1)) |
| 88 | done | tail -1 ) | 95 | done | tail -1 ) |
| 89 | changed=${changed:-0} | 96 | changed=${changed:-0} |
diff --git a/scripts/package/builddeb b/scripts/package/builddeb index b4f0f2b3f8d2..13fabb1f81db 100755 --- a/scripts/package/builddeb +++ b/scripts/package/builddeb | |||
| @@ -313,7 +313,7 @@ fi | |||
| 313 | 313 | ||
| 314 | # Build kernel header package | 314 | # Build kernel header package |
| 315 | (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" | 315 | (cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl) > "$objtree/debian/hdrsrcfiles" |
| 316 | (cd $srctree; find arch/*/include include scripts -type f) >> "$objtree/debian/hdrsrcfiles" | 316 | (cd $srctree; find arch/*/include include scripts -type f -o -type l) >> "$objtree/debian/hdrsrcfiles" |
| 317 | (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" | 317 | (cd $srctree; find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform) >> "$objtree/debian/hdrsrcfiles" |
| 318 | (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" | 318 | (cd $srctree; find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f) >> "$objtree/debian/hdrsrcfiles" |
| 319 | if grep -q '^CONFIG_STACK_VALIDATION=y' $KCONFIG_CONFIG ; then | 319 | if grep -q '^CONFIG_STACK_VALIDATION=y' $KCONFIG_CONFIG ; then |
diff --git a/scripts/package/mkspec b/scripts/package/mkspec index 280027fad991..61427c6f2209 100755 --- a/scripts/package/mkspec +++ b/scripts/package/mkspec | |||
| @@ -98,7 +98,7 @@ $M make %{?_smp_mflags} INSTALL_MOD_PATH=%{buildroot} KBUILD_SRC= modules_instal | |||
| 98 | $S$M rm -f %{buildroot}/lib/modules/$KERNELRELEASE/build | 98 | $S$M rm -f %{buildroot}/lib/modules/$KERNELRELEASE/build |
| 99 | $S$M rm -f %{buildroot}/lib/modules/$KERNELRELEASE/source | 99 | $S$M rm -f %{buildroot}/lib/modules/$KERNELRELEASE/source |
| 100 | $S$M mkdir -p %{buildroot}/usr/src/kernels/$KERNELRELEASE | 100 | $S$M mkdir -p %{buildroot}/usr/src/kernels/$KERNELRELEASE |
| 101 | $S$M tar cf - . $EXCLUDES | tar xf - -C %{buildroot}/usr/src/kernels/$KERNELRELEASE | 101 | $S$M tar cf - $EXCLUDES . | tar xf - -C %{buildroot}/usr/src/kernels/$KERNELRELEASE |
| 102 | $S$M cd %{buildroot}/lib/modules/$KERNELRELEASE | 102 | $S$M cd %{buildroot}/lib/modules/$KERNELRELEASE |
| 103 | $S$M ln -sf /usr/src/kernels/$KERNELRELEASE build | 103 | $S$M ln -sf /usr/src/kernels/$KERNELRELEASE build |
| 104 | $S$M ln -sf /usr/src/kernels/$KERNELRELEASE source | 104 | $S$M ln -sf /usr/src/kernels/$KERNELRELEASE source |
diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index 02298c9c6020..441405081195 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c | |||
| @@ -1326,7 +1326,7 @@ static ssize_t snd_pcm_oss_write2(struct snd_pcm_substream *substream, const cha | |||
| 1326 | static ssize_t snd_pcm_oss_write1(struct snd_pcm_substream *substream, const char __user *buf, size_t bytes) | 1326 | static ssize_t snd_pcm_oss_write1(struct snd_pcm_substream *substream, const char __user *buf, size_t bytes) |
| 1327 | { | 1327 | { |
| 1328 | size_t xfer = 0; | 1328 | size_t xfer = 0; |
| 1329 | ssize_t tmp; | 1329 | ssize_t tmp = 0; |
| 1330 | struct snd_pcm_runtime *runtime = substream->runtime; | 1330 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 1331 | 1331 | ||
| 1332 | if (atomic_read(&substream->mmap_count)) | 1332 | if (atomic_read(&substream->mmap_count)) |
| @@ -1433,7 +1433,7 @@ static ssize_t snd_pcm_oss_read2(struct snd_pcm_substream *substream, char *buf, | |||
| 1433 | static ssize_t snd_pcm_oss_read1(struct snd_pcm_substream *substream, char __user *buf, size_t bytes) | 1433 | static ssize_t snd_pcm_oss_read1(struct snd_pcm_substream *substream, char __user *buf, size_t bytes) |
| 1434 | { | 1434 | { |
| 1435 | size_t xfer = 0; | 1435 | size_t xfer = 0; |
| 1436 | ssize_t tmp; | 1436 | ssize_t tmp = 0; |
| 1437 | struct snd_pcm_runtime *runtime = substream->runtime; | 1437 | struct snd_pcm_runtime *runtime = substream->runtime; |
| 1438 | 1438 | ||
| 1439 | if (atomic_read(&substream->mmap_count)) | 1439 | if (atomic_read(&substream->mmap_count)) |
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 77ba50ddcf9e..d18b3982548b 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
| @@ -3422,7 +3422,7 @@ int snd_pcm_lib_default_mmap(struct snd_pcm_substream *substream, | |||
| 3422 | area, | 3422 | area, |
| 3423 | substream->runtime->dma_area, | 3423 | substream->runtime->dma_area, |
| 3424 | substream->runtime->dma_addr, | 3424 | substream->runtime->dma_addr, |
| 3425 | area->vm_end - area->vm_start); | 3425 | substream->runtime->dma_bytes); |
| 3426 | #endif /* CONFIG_X86 */ | 3426 | #endif /* CONFIG_X86 */ |
| 3427 | /* mmap with fault handler */ | 3427 | /* mmap with fault handler */ |
| 3428 | area->vm_ops = &snd_pcm_vm_ops_data_fault; | 3428 | area->vm_ops = &snd_pcm_vm_ops_data_fault; |
diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c index 0333143a1fa7..1063a4377502 100644 --- a/sound/drivers/aloop.c +++ b/sound/drivers/aloop.c | |||
| @@ -192,6 +192,11 @@ static inline void loopback_timer_stop(struct loopback_pcm *dpcm) | |||
| 192 | dpcm->timer.expires = 0; | 192 | dpcm->timer.expires = 0; |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | static inline void loopback_timer_stop_sync(struct loopback_pcm *dpcm) | ||
| 196 | { | ||
| 197 | del_timer_sync(&dpcm->timer); | ||
| 198 | } | ||
| 199 | |||
| 195 | #define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK) | 200 | #define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK) |
| 196 | #define CABLE_VALID_CAPTURE (1 << SNDRV_PCM_STREAM_CAPTURE) | 201 | #define CABLE_VALID_CAPTURE (1 << SNDRV_PCM_STREAM_CAPTURE) |
| 197 | #define CABLE_VALID_BOTH (CABLE_VALID_PLAYBACK|CABLE_VALID_CAPTURE) | 202 | #define CABLE_VALID_BOTH (CABLE_VALID_PLAYBACK|CABLE_VALID_CAPTURE) |
| @@ -326,6 +331,8 @@ static int loopback_prepare(struct snd_pcm_substream *substream) | |||
| 326 | struct loopback_cable *cable = dpcm->cable; | 331 | struct loopback_cable *cable = dpcm->cable; |
| 327 | int bps, salign; | 332 | int bps, salign; |
| 328 | 333 | ||
| 334 | loopback_timer_stop_sync(dpcm); | ||
| 335 | |||
| 329 | salign = (snd_pcm_format_width(runtime->format) * | 336 | salign = (snd_pcm_format_width(runtime->format) * |
| 330 | runtime->channels) / 8; | 337 | runtime->channels) / 8; |
| 331 | bps = salign * runtime->rate; | 338 | bps = salign * runtime->rate; |
| @@ -659,7 +666,9 @@ static void free_cable(struct snd_pcm_substream *substream) | |||
| 659 | return; | 666 | return; |
| 660 | if (cable->streams[!substream->stream]) { | 667 | if (cable->streams[!substream->stream]) { |
| 661 | /* other stream is still alive */ | 668 | /* other stream is still alive */ |
| 669 | spin_lock_irq(&cable->lock); | ||
| 662 | cable->streams[substream->stream] = NULL; | 670 | cable->streams[substream->stream] = NULL; |
| 671 | spin_unlock_irq(&cable->lock); | ||
| 663 | } else { | 672 | } else { |
| 664 | /* free the cable */ | 673 | /* free the cable */ |
| 665 | loopback->cables[substream->number][dev] = NULL; | 674 | loopback->cables[substream->number][dev] = NULL; |
| @@ -698,7 +707,6 @@ static int loopback_open(struct snd_pcm_substream *substream) | |||
| 698 | loopback->cables[substream->number][dev] = cable; | 707 | loopback->cables[substream->number][dev] = cable; |
| 699 | } | 708 | } |
| 700 | dpcm->cable = cable; | 709 | dpcm->cable = cable; |
| 701 | cable->streams[substream->stream] = dpcm; | ||
| 702 | 710 | ||
| 703 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); | 711 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); |
| 704 | 712 | ||
| @@ -730,6 +738,11 @@ static int loopback_open(struct snd_pcm_substream *substream) | |||
| 730 | runtime->hw = loopback_pcm_hardware; | 738 | runtime->hw = loopback_pcm_hardware; |
| 731 | else | 739 | else |
| 732 | runtime->hw = cable->hw; | 740 | runtime->hw = cable->hw; |
| 741 | |||
| 742 | spin_lock_irq(&cable->lock); | ||
| 743 | cable->streams[substream->stream] = dpcm; | ||
| 744 | spin_unlock_irq(&cable->lock); | ||
| 745 | |||
| 733 | unlock: | 746 | unlock: |
| 734 | if (err < 0) { | 747 | if (err < 0) { |
| 735 | free_cable(substream); | 748 | free_cable(substream); |
| @@ -744,7 +757,7 @@ static int loopback_close(struct snd_pcm_substream *substream) | |||
| 744 | struct loopback *loopback = substream->private_data; | 757 | struct loopback *loopback = substream->private_data; |
| 745 | struct loopback_pcm *dpcm = substream->runtime->private_data; | 758 | struct loopback_pcm *dpcm = substream->runtime->private_data; |
| 746 | 759 | ||
| 747 | loopback_timer_stop(dpcm); | 760 | loopback_timer_stop_sync(dpcm); |
| 748 | mutex_lock(&loopback->cable_lock); | 761 | mutex_lock(&loopback->cable_lock); |
| 749 | free_cable(substream); | 762 | free_cable(substream); |
| 750 | mutex_unlock(&loopback->cable_lock); | 763 | mutex_unlock(&loopback->cable_lock); |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index d5017adf9feb..c507c69029e3 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -375,6 +375,7 @@ enum { | |||
| 375 | ((pci)->device == 0x160c)) | 375 | ((pci)->device == 0x160c)) |
| 376 | 376 | ||
| 377 | #define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98) | 377 | #define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98) |
| 378 | #define IS_CFL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa348) | ||
| 378 | 379 | ||
| 379 | static char *driver_short_names[] = { | 380 | static char *driver_short_names[] = { |
| 380 | [AZX_DRIVER_ICH] = "HDA Intel", | 381 | [AZX_DRIVER_ICH] = "HDA Intel", |
| @@ -1744,6 +1745,10 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, | |||
| 1744 | else | 1745 | else |
| 1745 | chip->bdl_pos_adj = bdl_pos_adj[dev]; | 1746 | chip->bdl_pos_adj = bdl_pos_adj[dev]; |
| 1746 | 1747 | ||
| 1748 | /* Workaround for a communication error on CFL (bko#199007) */ | ||
| 1749 | if (IS_CFL(pci)) | ||
| 1750 | chip->polling_mode = 1; | ||
| 1751 | |||
| 1747 | err = azx_bus_init(chip, model[dev], &pci_hda_io_ops); | 1752 | err = azx_bus_init(chip, model[dev], &pci_hda_io_ops); |
| 1748 | if (err < 0) { | 1753 | if (err < 0) { |
| 1749 | kfree(hda); | 1754 | kfree(hda); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 9af301c6bba2..aef1f52db7d9 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -3130,6 +3130,8 @@ static void alc256_init(struct hda_codec *codec) | |||
| 3130 | 3130 | ||
| 3131 | alc_update_coef_idx(codec, 0x46, 3 << 12, 0); | 3131 | alc_update_coef_idx(codec, 0x46, 3 << 12, 0); |
| 3132 | alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ | 3132 | alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ |
| 3133 | alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */ | ||
| 3134 | alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15); | ||
| 3133 | } | 3135 | } |
| 3134 | 3136 | ||
| 3135 | static void alc256_shutup(struct hda_codec *codec) | 3137 | static void alc256_shutup(struct hda_codec *codec) |
| @@ -3596,8 +3598,12 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled) | |||
| 3596 | pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid); | 3598 | pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid); |
| 3597 | pinval &= ~AC_PINCTL_VREFEN; | 3599 | pinval &= ~AC_PINCTL_VREFEN; |
| 3598 | pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80; | 3600 | pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80; |
| 3599 | if (spec->mute_led_nid) | 3601 | if (spec->mute_led_nid) { |
| 3602 | /* temporarily power up/down for setting VREF */ | ||
| 3603 | snd_hda_power_up_pm(codec); | ||
| 3600 | snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval); | 3604 | snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval); |
| 3605 | snd_hda_power_down_pm(codec); | ||
| 3606 | } | ||
| 3601 | } | 3607 | } |
| 3602 | 3608 | ||
| 3603 | /* Make sure the led works even in runtime suspend */ | 3609 | /* Make sure the led works even in runtime suspend */ |
| @@ -5497,6 +5503,7 @@ enum { | |||
| 5497 | ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, | 5503 | ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, |
| 5498 | ALC298_FIXUP_TPT470_DOCK, | 5504 | ALC298_FIXUP_TPT470_DOCK, |
| 5499 | ALC255_FIXUP_DUMMY_LINEOUT_VERB, | 5505 | ALC255_FIXUP_DUMMY_LINEOUT_VERB, |
| 5506 | ALC255_FIXUP_DELL_HEADSET_MIC, | ||
| 5500 | }; | 5507 | }; |
| 5501 | 5508 | ||
| 5502 | static const struct hda_fixup alc269_fixups[] = { | 5509 | static const struct hda_fixup alc269_fixups[] = { |
| @@ -6357,6 +6364,13 @@ static const struct hda_fixup alc269_fixups[] = { | |||
| 6357 | .chained = true, | 6364 | .chained = true, |
| 6358 | .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE | 6365 | .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE |
| 6359 | }, | 6366 | }, |
| 6367 | [ALC255_FIXUP_DELL_HEADSET_MIC] = { | ||
| 6368 | .type = HDA_FIXUP_PINS, | ||
| 6369 | .v.pins = (const struct hda_pintbl[]) { | ||
| 6370 | { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ | ||
| 6371 | { } | ||
| 6372 | }, | ||
| 6373 | }, | ||
| 6360 | }; | 6374 | }; |
| 6361 | 6375 | ||
| 6362 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | 6376 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
| @@ -6411,6 +6425,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 6411 | SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), | 6425 | SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), |
| 6412 | SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), | 6426 | SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), |
| 6413 | SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), | 6427 | SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), |
| 6428 | SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), | ||
| 6429 | SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), | ||
| 6414 | SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), | 6430 | SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), |
| 6415 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 6431 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 6416 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 6432 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
| @@ -7154,6 +7170,8 @@ static int patch_alc269(struct hda_codec *codec) | |||
| 7154 | break; | 7170 | break; |
| 7155 | case 0x10ec0257: | 7171 | case 0x10ec0257: |
| 7156 | spec->codec_variant = ALC269_TYPE_ALC257; | 7172 | spec->codec_variant = ALC269_TYPE_ALC257; |
| 7173 | spec->shutup = alc256_shutup; | ||
| 7174 | spec->init_hook = alc256_init; | ||
| 7157 | spec->gen.mixer_nid = 0; | 7175 | spec->gen.mixer_nid = 0; |
| 7158 | break; | 7176 | break; |
| 7159 | case 0x10ec0215: | 7177 | case 0x10ec0215: |
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index ea8f3de92fa4..794224e1d6df 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c | |||
| @@ -1171,6 +1171,7 @@ static bool is_teac_dsd_dac(unsigned int id) | |||
| 1171 | switch (id) { | 1171 | switch (id) { |
| 1172 | case USB_ID(0x0644, 0x8043): /* TEAC UD-501/UD-503/NT-503 */ | 1172 | case USB_ID(0x0644, 0x8043): /* TEAC UD-501/UD-503/NT-503 */ |
| 1173 | case USB_ID(0x0644, 0x8044): /* Esoteric D-05X */ | 1173 | case USB_ID(0x0644, 0x8044): /* Esoteric D-05X */ |
| 1174 | case USB_ID(0x0644, 0x804a): /* TEAC UD-301 */ | ||
| 1174 | return true; | 1175 | return true; |
| 1175 | } | 1176 | } |
| 1176 | return false; | 1177 | return false; |
diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c index f95fa67bb498..f509c86faede 100644 --- a/tools/bpf/bpftool/map.c +++ b/tools/bpf/bpftool/map.c | |||
| @@ -428,7 +428,7 @@ static int show_map_close_json(int fd, struct bpf_map_info *info) | |||
| 428 | jsonw_string_field(json_wtr, "name", info->name); | 428 | jsonw_string_field(json_wtr, "name", info->name); |
| 429 | 429 | ||
| 430 | jsonw_name(json_wtr, "flags"); | 430 | jsonw_name(json_wtr, "flags"); |
| 431 | jsonw_printf(json_wtr, "%#x", info->map_flags); | 431 | jsonw_printf(json_wtr, "%d", info->map_flags); |
| 432 | 432 | ||
| 433 | print_dev_json(info->ifindex, info->netns_dev, info->netns_ino); | 433 | print_dev_json(info->ifindex, info->netns_dev, info->netns_ino); |
| 434 | 434 | ||
diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_string.tc b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_string.tc new file mode 100644 index 000000000000..5ba73035e1d9 --- /dev/null +++ b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_string.tc | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # SPDX-License-Identifier: GPL-2.0 | ||
| 3 | # description: Kprobe event string type argument | ||
| 4 | |||
| 5 | [ -f kprobe_events ] || exit_unsupported # this is configurable | ||
| 6 | |||
| 7 | echo 0 > events/enable | ||
| 8 | echo > kprobe_events | ||
| 9 | |||
| 10 | case `uname -m` in | ||
| 11 | x86_64) | ||
| 12 | ARG2=%si | ||
| 13 | OFFS=8 | ||
| 14 | ;; | ||
| 15 | i[3456]86) | ||
| 16 | ARG2=%cx | ||
| 17 | OFFS=4 | ||
| 18 | ;; | ||
| 19 | aarch64) | ||
| 20 | ARG2=%x1 | ||
| 21 | OFFS=8 | ||
| 22 | ;; | ||
| 23 | arm*) | ||
| 24 | ARG2=%r1 | ||
| 25 | OFFS=4 | ||
| 26 | ;; | ||
| 27 | *) | ||
| 28 | echo "Please implement other architecture here" | ||
| 29 | exit_untested | ||
| 30 | esac | ||
| 31 | |||
| 32 | : "Test get argument (1)" | ||
| 33 | echo "p:testprobe create_trace_kprobe arg1=+0(+0(${ARG2})):string" > kprobe_events | ||
| 34 | echo 1 > events/kprobes/testprobe/enable | ||
| 35 | ! echo test >> kprobe_events | ||
| 36 | tail -n 1 trace | grep -qe "testprobe.* arg1=\"test\"" | ||
| 37 | |||
| 38 | echo 0 > events/kprobes/testprobe/enable | ||
| 39 | : "Test get argument (2)" | ||
| 40 | echo "p:testprobe create_trace_kprobe arg1=+0(+0(${ARG2})):string arg2=+0(+${OFFS}(${ARG2})):string" > kprobe_events | ||
| 41 | echo 1 > events/kprobes/testprobe/enable | ||
| 42 | ! echo test1 test2 >> kprobe_events | ||
| 43 | tail -n 1 trace | grep -qe "testprobe.* arg1=\"test1\" arg2=\"test2\"" | ||
| 44 | |||
| 45 | echo 0 > events/enable | ||
| 46 | echo > kprobe_events | ||
diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_syntax.tc b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_syntax.tc new file mode 100644 index 000000000000..231bcd2c4eb5 --- /dev/null +++ b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_syntax.tc | |||
| @@ -0,0 +1,97 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # SPDX-License-Identifier: GPL-2.0 | ||
| 3 | # description: Kprobe event argument syntax | ||
| 4 | |||
| 5 | [ -f kprobe_events ] || exit_unsupported # this is configurable | ||
| 6 | |||
| 7 | grep "x8/16/32/64" README > /dev/null || exit_unsupported # version issue | ||
| 8 | |||
| 9 | echo 0 > events/enable | ||
| 10 | echo > kprobe_events | ||
| 11 | |||
| 12 | PROBEFUNC="vfs_read" | ||
| 13 | GOODREG= | ||
| 14 | BADREG= | ||
| 15 | GOODSYM="_sdata" | ||
| 16 | if ! grep -qw ${GOODSYM} /proc/kallsyms ; then | ||
| 17 | GOODSYM=$PROBEFUNC | ||
| 18 | fi | ||
| 19 | BADSYM="deaqswdefr" | ||
| 20 | SYMADDR=0x`grep -w ${GOODSYM} /proc/kallsyms | cut -f 1 -d " "` | ||
| 21 | GOODTYPE="x16" | ||
| 22 | BADTYPE="y16" | ||
| 23 | |||
| 24 | case `uname -m` in | ||
| 25 | x86_64|i[3456]86) | ||
| 26 | GOODREG=%ax | ||
| 27 | BADREG=%ex | ||
| 28 | ;; | ||
| 29 | aarch64) | ||
| 30 | GOODREG=%x0 | ||
| 31 | BADREG=%ax | ||
| 32 | ;; | ||
| 33 | arm*) | ||
| 34 | GOODREG=%r0 | ||
| 35 | BADREG=%ax | ||
| 36 | ;; | ||
| 37 | esac | ||
| 38 | |||
| 39 | test_goodarg() # Good-args | ||
| 40 | { | ||
| 41 | while [ "$1" ]; do | ||
| 42 | echo "p ${PROBEFUNC} $1" > kprobe_events | ||
| 43 | shift 1 | ||
| 44 | done; | ||
| 45 | } | ||
| 46 | |||
| 47 | test_badarg() # Bad-args | ||
| 48 | { | ||
| 49 | while [ "$1" ]; do | ||
| 50 | ! echo "p ${PROBEFUNC} $1" > kprobe_events | ||
| 51 | shift 1 | ||
| 52 | done; | ||
| 53 | } | ||
| 54 | |||
| 55 | echo > kprobe_events | ||
| 56 | |||
| 57 | : "Register access" | ||
| 58 | test_goodarg ${GOODREG} | ||
| 59 | test_badarg ${BADREG} | ||
| 60 | |||
| 61 | : "Symbol access" | ||
| 62 | test_goodarg "@${GOODSYM}" "@${SYMADDR}" "@${GOODSYM}+10" "@${GOODSYM}-10" | ||
| 63 | test_badarg "@" "@${BADSYM}" "@${GOODSYM}*10" "@${GOODSYM}/10" \ | ||
| 64 | "@${GOODSYM}%10" "@${GOODSYM}&10" "@${GOODSYM}|10" | ||
| 65 | |||
| 66 | : "Stack access" | ||
| 67 | test_goodarg "\$stack" "\$stack0" "\$stack1" | ||
| 68 | test_badarg "\$stackp" "\$stack0+10" "\$stack1-10" | ||
| 69 | |||
| 70 | : "Retval access" | ||
| 71 | echo "r ${PROBEFUNC} \$retval" > kprobe_events | ||
| 72 | ! echo "p ${PROBEFUNC} \$retval" > kprobe_events | ||
| 73 | |||
| 74 | : "Comm access" | ||
| 75 | test_goodarg "\$comm" | ||
| 76 | |||
| 77 | : "Indirect memory access" | ||
| 78 | test_goodarg "+0(${GOODREG})" "-0(${GOODREG})" "+10(\$stack)" \ | ||
| 79 | "+0(\$stack1)" "+10(@${GOODSYM}-10)" "+0(+10(+20(\$stack)))" | ||
| 80 | test_badarg "+(${GOODREG})" "(${GOODREG}+10)" "-(${GOODREG})" "(${GOODREG})" \ | ||
| 81 | "+10(\$comm)" "+0(${GOODREG})+10" | ||
| 82 | |||
| 83 | : "Name assignment" | ||
| 84 | test_goodarg "varname=${GOODREG}" | ||
| 85 | test_badarg "varname=varname2=${GOODREG}" | ||
| 86 | |||
| 87 | : "Type syntax" | ||
| 88 | test_goodarg "${GOODREG}:${GOODTYPE}" | ||
| 89 | test_badarg "${GOODREG}::${GOODTYPE}" "${GOODREG}:${BADTYPE}" \ | ||
| 90 | "${GOODTYPE}:${GOODREG}" | ||
| 91 | |||
| 92 | : "Combination check" | ||
| 93 | |||
| 94 | test_goodarg "\$comm:string" "+0(\$stack):string" | ||
| 95 | test_badarg "\$comm:x64" "\$stack:string" "${GOODREG}:string" | ||
| 96 | |||
| 97 | echo > kprobe_events | ||
diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/probepoint.tc b/tools/testing/selftests/ftrace/test.d/kprobe/probepoint.tc new file mode 100644 index 000000000000..4fda01a08da4 --- /dev/null +++ b/tools/testing/selftests/ftrace/test.d/kprobe/probepoint.tc | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # SPDX-License-Identifier: GPL-2.0 | ||
| 3 | # description: Kprobe events - probe points | ||
| 4 | |||
| 5 | [ -f kprobe_events ] || exit_unsupported # this is configurable | ||
| 6 | |||
| 7 | TARGET_FUNC=create_trace_kprobe | ||
| 8 | |||
| 9 | dec_addr() { # hexaddr | ||
| 10 | printf "%d" "0x"`echo $1 | tail -c 8` | ||
| 11 | } | ||
| 12 | |||
| 13 | set_offs() { # prev target next | ||
| 14 | A1=`dec_addr $1` | ||
| 15 | A2=`dec_addr $2` | ||
| 16 | A3=`dec_addr $3` | ||
| 17 | TARGET="0x$2" # an address | ||
| 18 | PREV=`expr $A1 - $A2` # offset to previous symbol | ||
| 19 | NEXT=+`expr $A3 - $A2` # offset to next symbol | ||
| 20 | OVERFLOW=+`printf "0x%x" ${PREV}` # overflow offset to previous symbol | ||
| 21 | } | ||
| 22 | |||
| 23 | # We have to decode symbol addresses to get correct offsets. | ||
| 24 | # If the offset is not an instruction boundary, it cause -EILSEQ. | ||
| 25 | set_offs `grep -A1 -B1 ${TARGET_FUNC} /proc/kallsyms | cut -f 1 -d " " | xargs` | ||
| 26 | |||
| 27 | UINT_TEST=no | ||
| 28 | # printf "%x" -1 returns (unsigned long)-1. | ||
| 29 | if [ `printf "%x" -1 | wc -c` != 9 ]; then | ||
| 30 | UINT_TEST=yes | ||
| 31 | fi | ||
| 32 | |||
| 33 | echo 0 > events/enable | ||
| 34 | echo > kprobe_events | ||
| 35 | echo "p:testprobe ${TARGET_FUNC}" > kprobe_events | ||
| 36 | echo "p:testprobe ${TARGET}" > kprobe_events | ||
| 37 | echo "p:testprobe ${TARGET_FUNC}${NEXT}" > kprobe_events | ||
| 38 | ! echo "p:testprobe ${TARGET_FUNC}${PREV}" > kprobe_events | ||
| 39 | if [ "${UINT_TEST}" = yes ]; then | ||
| 40 | ! echo "p:testprobe ${TARGET_FUNC}${OVERFLOW}" > kprobe_events | ||
| 41 | fi | ||
| 42 | echo > kprobe_events | ||
| 43 | clear_trace | ||
diff --git a/tools/testing/selftests/x86/ptrace_syscall.c b/tools/testing/selftests/x86/ptrace_syscall.c index 1ae1c5a7392e..6f22238f3217 100644 --- a/tools/testing/selftests/x86/ptrace_syscall.c +++ b/tools/testing/selftests/x86/ptrace_syscall.c | |||
| @@ -183,8 +183,10 @@ static void test_ptrace_syscall_restart(void) | |||
| 183 | if (ptrace(PTRACE_TRACEME, 0, 0, 0) != 0) | 183 | if (ptrace(PTRACE_TRACEME, 0, 0, 0) != 0) |
| 184 | err(1, "PTRACE_TRACEME"); | 184 | err(1, "PTRACE_TRACEME"); |
| 185 | 185 | ||
| 186 | pid_t pid = getpid(), tid = syscall(SYS_gettid); | ||
| 187 | |||
| 186 | printf("\tChild will make one syscall\n"); | 188 | printf("\tChild will make one syscall\n"); |
| 187 | raise(SIGSTOP); | 189 | syscall(SYS_tgkill, pid, tid, SIGSTOP); |
| 188 | 190 | ||
| 189 | syscall(SYS_gettid, 10, 11, 12, 13, 14, 15); | 191 | syscall(SYS_gettid, 10, 11, 12, 13, 14, 15); |
| 190 | _exit(0); | 192 | _exit(0); |
| @@ -301,9 +303,11 @@ static void test_restart_under_ptrace(void) | |||
| 301 | if (ptrace(PTRACE_TRACEME, 0, 0, 0) != 0) | 303 | if (ptrace(PTRACE_TRACEME, 0, 0, 0) != 0) |
| 302 | err(1, "PTRACE_TRACEME"); | 304 | err(1, "PTRACE_TRACEME"); |
| 303 | 305 | ||
| 306 | pid_t pid = getpid(), tid = syscall(SYS_gettid); | ||
| 307 | |||
| 304 | printf("\tChild will take a nap until signaled\n"); | 308 | printf("\tChild will take a nap until signaled\n"); |
| 305 | setsigign(SIGUSR1, SA_RESTART); | 309 | setsigign(SIGUSR1, SA_RESTART); |
| 306 | raise(SIGSTOP); | 310 | syscall(SYS_tgkill, pid, tid, SIGSTOP); |
| 307 | 311 | ||
| 308 | syscall(SYS_pause, 0, 0, 0, 0, 0, 0); | 312 | syscall(SYS_pause, 0, 0, 0, 0, 0, 0); |
| 309 | _exit(0); | 313 | _exit(0); |
