diff options
author | Thomas Deutschmann <whissi@whissi.de> | 2019-12-01 15:06:18 +0100 |
---|---|---|
committer | Thomas Deutschmann <whissi@whissi.de> | 2019-12-01 15:06:18 +0100 |
commit | 84ccfd99c9438da3264cfbc161b7bafe5bbe3245 (patch) | |
tree | 0f9bcb6e84109aae7635344653e0bcfd583a8e14 | |
parent | Linux patch 4.19.86 (diff) | |
download | linux-patches-4.19-86.tar.gz linux-patches-4.19-86.tar.bz2 linux-patches-4.19-86.zip |
Linux patch 4.19.874.19-86
Signed-off-by: Thomas Deutschmann <whissi@whissi.de>
-rw-r--r-- | 1086_linux-4.19.87.patch | 11996 |
1 files changed, 11996 insertions, 0 deletions
diff --git a/1086_linux-4.19.87.patch b/1086_linux-4.19.87.patch new file mode 100644 index 00000000..2cc0d06c --- /dev/null +++ b/1086_linux-4.19.87.patch @@ -0,0 +1,11996 @@ +diff --git a/Documentation/admin-guide/hw-vuln/mds.rst b/Documentation/admin-guide/hw-vuln/mds.rst +index e3a796c0d3a2..2d19c9f4c1fe 100644 +--- a/Documentation/admin-guide/hw-vuln/mds.rst ++++ b/Documentation/admin-guide/hw-vuln/mds.rst +@@ -265,8 +265,11 @@ time with the option "mds=". The valid arguments for this option are: + + ============ ============================================================= + +-Not specifying this option is equivalent to "mds=full". +- ++Not specifying this option is equivalent to "mds=full". For processors ++that are affected by both TAA (TSX Asynchronous Abort) and MDS, ++specifying just "mds=off" without an accompanying "tsx_async_abort=off" ++will have no effect as the same mitigation is used for both ++vulnerabilities. + + Mitigation selection guide + -------------------------- +diff --git a/Documentation/admin-guide/hw-vuln/tsx_async_abort.rst b/Documentation/admin-guide/hw-vuln/tsx_async_abort.rst +index fddbd7579c53..af6865b822d2 100644 +--- a/Documentation/admin-guide/hw-vuln/tsx_async_abort.rst ++++ b/Documentation/admin-guide/hw-vuln/tsx_async_abort.rst +@@ -174,7 +174,10 @@ the option "tsx_async_abort=". The valid arguments for this option are: + CPU is not vulnerable to cross-thread TAA attacks. + ============ ============================================================= + +-Not specifying this option is equivalent to "tsx_async_abort=full". ++Not specifying this option is equivalent to "tsx_async_abort=full". For ++processors that are affected by both TAA and MDS, specifying just ++"tsx_async_abort=off" without an accompanying "mds=off" will have no ++effect as the same mitigation is used for both vulnerabilities. + + The kernel command line also allows to control the TSX feature using the + parameter "tsx=" on CPUs which support TSX control. MSR_IA32_TSX_CTRL is used +diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt +index 475ed980b25b..ce1af89dbbb8 100644 +--- a/Documentation/admin-guide/kernel-parameters.txt ++++ b/Documentation/admin-guide/kernel-parameters.txt +@@ -2359,6 +2359,12 @@ + SMT on vulnerable CPUs + off - Unconditionally disable MDS mitigation + ++ On TAA-affected machines, mds=off can be prevented by ++ an active TAA mitigation as both vulnerabilities are ++ mitigated with the same mechanism so in order to disable ++ this mitigation, you need to specify tsx_async_abort=off ++ too. ++ + Not specifying this option is equivalent to + mds=full. + +@@ -4773,6 +4779,11 @@ + vulnerable to cross-thread TAA attacks. + off - Unconditionally disable TAA mitigation + ++ On MDS-affected machines, tsx_async_abort=off can be ++ prevented by an active MDS mitigation as both vulnerabilities ++ are mitigated with the same mechanism so in order to disable ++ this mitigation, you need to specify mds=off too. ++ + Not specifying this option is equivalent to + tsx_async_abort=full. On CPUs which are MDS affected + and deploy MDS mitigation, TAA mitigation is not +diff --git a/Documentation/devicetree/bindings/spi/spi-uniphier.txt b/Documentation/devicetree/bindings/spi/spi-uniphier.txt +index 504a4ecfc7b1..b04e66a52de5 100644 +--- a/Documentation/devicetree/bindings/spi/spi-uniphier.txt ++++ b/Documentation/devicetree/bindings/spi/spi-uniphier.txt +@@ -5,18 +5,20 @@ UniPhier SoCs have SCSSI which supports SPI single channel. + Required properties: + - compatible: should be "socionext,uniphier-scssi" + - reg: address and length of the spi master registers +- - #address-cells: must be <1>, see spi-bus.txt +- - #size-cells: must be <0>, see spi-bus.txt +- - clocks: A phandle to the clock for the device. +- - resets: A phandle to the reset control for the device. ++ - interrupts: a single interrupt specifier ++ - pinctrl-names: should be "default" ++ - pinctrl-0: pin control state for the default mode ++ - clocks: a phandle to the clock for the device ++ - resets: a phandle to the reset control for the device + + Example: + + spi0: spi@54006000 { + compatible = "socionext,uniphier-scssi"; + reg = <0x54006000 0x100>; +- #address-cells = <1>; +- #size-cells = <0>; ++ interrupts = <0 39 4>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_spi0>; + clocks = <&peri_clk 11>; + resets = <&peri_rst 11>; + }; +diff --git a/Makefile b/Makefile +index feb0568e9535..9240f36099de 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 4 + PATCHLEVEL = 19 +-SUBLEVEL = 86 ++SUBLEVEL = 87 + EXTRAVERSION = + NAME = "People's Front" + +diff --git a/arch/arc/kernel/perf_event.c b/arch/arc/kernel/perf_event.c +index 8aec462d90fb..30f66b123541 100644 +--- a/arch/arc/kernel/perf_event.c ++++ b/arch/arc/kernel/perf_event.c +@@ -490,8 +490,8 @@ static int arc_pmu_device_probe(struct platform_device *pdev) + /* loop thru all available h/w condition indexes */ + for (j = 0; j < cc_bcr.c; j++) { + write_aux_reg(ARC_REG_CC_INDEX, j); +- cc_name.indiv.word0 = read_aux_reg(ARC_REG_CC_NAME0); +- cc_name.indiv.word1 = read_aux_reg(ARC_REG_CC_NAME1); ++ cc_name.indiv.word0 = le32_to_cpu(read_aux_reg(ARC_REG_CC_NAME0)); ++ cc_name.indiv.word1 = le32_to_cpu(read_aux_reg(ARC_REG_CC_NAME1)); + + /* See if it has been mapped to a perf event_id */ + for (i = 0; i < ARRAY_SIZE(arc_pmu_ev_hw_map); i++) { +diff --git a/arch/arm/boot/dts/imx6sx-sdb.dtsi b/arch/arm/boot/dts/imx6sx-sdb.dtsi +index f8f31872fa14..d6d517e4922f 100644 +--- a/arch/arm/boot/dts/imx6sx-sdb.dtsi ++++ b/arch/arm/boot/dts/imx6sx-sdb.dtsi +@@ -115,7 +115,9 @@ + regulator-name = "enet_3v3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; +- gpios = <&gpio2 6 GPIO_ACTIVE_LOW>; ++ gpio = <&gpio2 6 GPIO_ACTIVE_LOW>; ++ regulator-boot-on; ++ regulator-always-on; + }; + + reg_pcie_gpio: regulator-pcie-gpio { +@@ -178,6 +180,7 @@ + phy-supply = <®_enet_3v3>; + phy-mode = "rgmii"; + phy-handle = <ðphy1>; ++ phy-reset-gpios = <&gpio2 7 GPIO_ACTIVE_LOW>; + status = "okay"; + + mdio { +@@ -371,6 +374,8 @@ + MX6SX_PAD_RGMII1_RD3__ENET1_RX_DATA_3 0x3081 + MX6SX_PAD_RGMII1_RX_CTL__ENET1_RX_EN 0x3081 + MX6SX_PAD_ENET2_RX_CLK__ENET2_REF_CLK_25M 0x91 ++ /* phy reset */ ++ MX6SX_PAD_ENET2_CRS__GPIO2_IO_7 0x10b0 + >; + }; + +diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c +index 70e560cf8ca0..d8cbe772f690 100644 +--- a/arch/arm/mm/mmu.c ++++ b/arch/arm/mm/mmu.c +@@ -1195,6 +1195,9 @@ void __init adjust_lowmem_bounds(void) + phys_addr_t block_start = reg->base; + phys_addr_t block_end = reg->base + reg->size; + ++ if (memblock_is_nomap(reg)) ++ continue; ++ + if (reg->base < vmalloc_limit) { + if (block_end > lowmem_limit) + /* +diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile +index 5d8787f0ca5f..9a5e28141211 100644 +--- a/arch/arm64/Makefile ++++ b/arch/arm64/Makefile +@@ -148,6 +148,7 @@ archclean: + $(Q)$(MAKE) $(clean)=$(boot) + $(Q)$(MAKE) $(clean)=$(boot)/dts + ++ifeq ($(KBUILD_EXTMOD),) + # We need to generate vdso-offsets.h before compiling certain files in kernel/. + # In order to do that, we should use the archprepare target, but we can't since + # asm-offsets.h is included in some files used to generate vdso-offsets.h, and +@@ -157,6 +158,7 @@ archclean: + prepare: vdso_prepare + vdso_prepare: prepare0 + $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso include/generated/vdso-offsets.h ++endif + + define archhelp + echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' +diff --git a/arch/arm64/include/asm/string.h b/arch/arm64/include/asm/string.h +index dd95d33a5bd5..03a6c256b7ec 100644 +--- a/arch/arm64/include/asm/string.h ++++ b/arch/arm64/include/asm/string.h +@@ -16,6 +16,7 @@ + #ifndef __ASM_STRING_H + #define __ASM_STRING_H + ++#ifndef CONFIG_KASAN + #define __HAVE_ARCH_STRRCHR + extern char *strrchr(const char *, int c); + +@@ -34,6 +35,13 @@ extern __kernel_size_t strlen(const char *); + #define __HAVE_ARCH_STRNLEN + extern __kernel_size_t strnlen(const char *, __kernel_size_t); + ++#define __HAVE_ARCH_MEMCMP ++extern int memcmp(const void *, const void *, size_t); ++ ++#define __HAVE_ARCH_MEMCHR ++extern void *memchr(const void *, int, __kernel_size_t); ++#endif ++ + #define __HAVE_ARCH_MEMCPY + extern void *memcpy(void *, const void *, __kernel_size_t); + extern void *__memcpy(void *, const void *, __kernel_size_t); +@@ -42,16 +50,10 @@ extern void *__memcpy(void *, const void *, __kernel_size_t); + extern void *memmove(void *, const void *, __kernel_size_t); + extern void *__memmove(void *, const void *, __kernel_size_t); + +-#define __HAVE_ARCH_MEMCHR +-extern void *memchr(const void *, int, __kernel_size_t); +- + #define __HAVE_ARCH_MEMSET + extern void *memset(void *, int, __kernel_size_t); + extern void *__memset(void *, int, __kernel_size_t); + +-#define __HAVE_ARCH_MEMCMP +-extern int memcmp(const void *, const void *, size_t); +- + #ifdef CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE + #define __HAVE_ARCH_MEMCPY_FLUSHCACHE + void memcpy_flushcache(void *dst, const void *src, size_t cnt); +diff --git a/arch/arm64/kernel/arm64ksyms.c b/arch/arm64/kernel/arm64ksyms.c +index d894a20b70b2..72f63a59b008 100644 +--- a/arch/arm64/kernel/arm64ksyms.c ++++ b/arch/arm64/kernel/arm64ksyms.c +@@ -44,20 +44,23 @@ EXPORT_SYMBOL(__arch_copy_in_user); + EXPORT_SYMBOL(memstart_addr); + + /* string / mem functions */ ++#ifndef CONFIG_KASAN + EXPORT_SYMBOL(strchr); + EXPORT_SYMBOL(strrchr); + EXPORT_SYMBOL(strcmp); + EXPORT_SYMBOL(strncmp); + EXPORT_SYMBOL(strlen); + EXPORT_SYMBOL(strnlen); ++EXPORT_SYMBOL(memcmp); ++EXPORT_SYMBOL(memchr); ++#endif ++ + EXPORT_SYMBOL(memset); + EXPORT_SYMBOL(memcpy); + EXPORT_SYMBOL(memmove); + EXPORT_SYMBOL(__memset); + EXPORT_SYMBOL(__memcpy); + EXPORT_SYMBOL(__memmove); +-EXPORT_SYMBOL(memchr); +-EXPORT_SYMBOL(memcmp); + + /* atomic bitops */ + EXPORT_SYMBOL(set_bit); +diff --git a/arch/arm64/lib/memchr.S b/arch/arm64/lib/memchr.S +index 4444c1d25f4b..0f164a4baf52 100644 +--- a/arch/arm64/lib/memchr.S ++++ b/arch/arm64/lib/memchr.S +@@ -30,7 +30,7 @@ + * Returns: + * x0 - address of first occurrence of 'c' or 0 + */ +-ENTRY(memchr) ++WEAK(memchr) + and w1, w1, #0xff + 1: subs x2, x2, #1 + b.mi 2f +diff --git a/arch/arm64/lib/memcmp.S b/arch/arm64/lib/memcmp.S +index 2a4e239bd17a..fb295f52e9f8 100644 +--- a/arch/arm64/lib/memcmp.S ++++ b/arch/arm64/lib/memcmp.S +@@ -58,7 +58,7 @@ pos .req x11 + limit_wd .req x12 + mask .req x13 + +-ENTRY(memcmp) ++WEAK(memcmp) + cbz limit, .Lret0 + eor tmp1, src1, src2 + tst tmp1, #7 +diff --git a/arch/arm64/lib/strchr.S b/arch/arm64/lib/strchr.S +index dae0cf5591f9..7c83091d1bcd 100644 +--- a/arch/arm64/lib/strchr.S ++++ b/arch/arm64/lib/strchr.S +@@ -29,7 +29,7 @@ + * Returns: + * x0 - address of first occurrence of 'c' or 0 + */ +-ENTRY(strchr) ++WEAK(strchr) + and w1, w1, #0xff + 1: ldrb w2, [x0], #1 + cmp w2, w1 +diff --git a/arch/arm64/lib/strcmp.S b/arch/arm64/lib/strcmp.S +index 471fe61760ef..7d5d15398bfb 100644 +--- a/arch/arm64/lib/strcmp.S ++++ b/arch/arm64/lib/strcmp.S +@@ -60,7 +60,7 @@ tmp3 .req x9 + zeroones .req x10 + pos .req x11 + +-ENTRY(strcmp) ++WEAK(strcmp) + eor tmp1, src1, src2 + mov zeroones, #REP8_01 + tst tmp1, #7 +diff --git a/arch/arm64/lib/strlen.S b/arch/arm64/lib/strlen.S +index 55ccc8e24c08..8e0b14205dcb 100644 +--- a/arch/arm64/lib/strlen.S ++++ b/arch/arm64/lib/strlen.S +@@ -56,7 +56,7 @@ pos .req x12 + #define REP8_7f 0x7f7f7f7f7f7f7f7f + #define REP8_80 0x8080808080808080 + +-ENTRY(strlen) ++WEAK(strlen) + mov zeroones, #REP8_01 + bic src, srcin, #15 + ands tmp1, srcin, #15 +diff --git a/arch/arm64/lib/strncmp.S b/arch/arm64/lib/strncmp.S +index e267044761c6..66bd145935d9 100644 +--- a/arch/arm64/lib/strncmp.S ++++ b/arch/arm64/lib/strncmp.S +@@ -64,7 +64,7 @@ limit_wd .req x13 + mask .req x14 + endloop .req x15 + +-ENTRY(strncmp) ++WEAK(strncmp) + cbz limit, .Lret0 + eor tmp1, src1, src2 + mov zeroones, #REP8_01 +diff --git a/arch/arm64/lib/strnlen.S b/arch/arm64/lib/strnlen.S +index eae38da6e0bb..355be04441fe 100644 +--- a/arch/arm64/lib/strnlen.S ++++ b/arch/arm64/lib/strnlen.S +@@ -59,7 +59,7 @@ limit_wd .req x14 + #define REP8_7f 0x7f7f7f7f7f7f7f7f + #define REP8_80 0x8080808080808080 + +-ENTRY(strnlen) ++WEAK(strnlen) + cbz limit, .Lhit_limit + mov zeroones, #REP8_01 + bic src, srcin, #15 +diff --git a/arch/arm64/lib/strrchr.S b/arch/arm64/lib/strrchr.S +index f8e2784d5752..ea84924d5990 100644 +--- a/arch/arm64/lib/strrchr.S ++++ b/arch/arm64/lib/strrchr.S +@@ -29,7 +29,7 @@ + * Returns: + * x0 - address of last occurrence of 'c' or 0 + */ +-ENTRY(strrchr) ++WEAK(strrchr) + mov x3, #0 + and w1, w1, #0xff + 1: ldrb w2, [x0], #1 +diff --git a/arch/m68k/kernel/uboot.c b/arch/m68k/kernel/uboot.c +index b29c3b241e1b..107082877064 100644 +--- a/arch/m68k/kernel/uboot.c ++++ b/arch/m68k/kernel/uboot.c +@@ -102,5 +102,5 @@ __init void process_uboot_commandline(char *commandp, int size) + } + + parse_uboot_commandline(commandp, len); +- commandp[size - 1] = 0; ++ commandp[len - 1] = 0; + } +diff --git a/arch/nds32/include/asm/bitfield.h b/arch/nds32/include/asm/bitfield.h +index 8e84fc385b94..19b2841219ad 100644 +--- a/arch/nds32/include/asm/bitfield.h ++++ b/arch/nds32/include/asm/bitfield.h +@@ -692,8 +692,8 @@ + #define PFM_CTL_offKU1 13 /* Enable user mode event counting for PFMC1 */ + #define PFM_CTL_offKU2 14 /* Enable user mode event counting for PFMC2 */ + #define PFM_CTL_offSEL0 15 /* The event selection for PFMC0 */ +-#define PFM_CTL_offSEL1 21 /* The event selection for PFMC1 */ +-#define PFM_CTL_offSEL2 27 /* The event selection for PFMC2 */ ++#define PFM_CTL_offSEL1 16 /* The event selection for PFMC1 */ ++#define PFM_CTL_offSEL2 22 /* The event selection for PFMC2 */ + /* bit 28:31 reserved */ + + #define PFM_CTL_mskEN0 ( 0x01 << PFM_CTL_offEN0 ) +diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile +index 25e3184f11f7..7d5ddf53750c 100644 +--- a/arch/powerpc/boot/Makefile ++++ b/arch/powerpc/boot/Makefile +@@ -32,8 +32,8 @@ else + endif + + BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ +- -fno-strict-aliasing -Os -msoft-float -pipe \ +- -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \ ++ -fno-strict-aliasing -Os -msoft-float -mno-altivec -mno-vsx \ ++ -pipe -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \ + -D$(compress-y) + + ifdef CONFIG_PPC64_BOOT_WRAPPER +diff --git a/arch/powerpc/boot/opal.c b/arch/powerpc/boot/opal.c +index 0272570d02de..dfb199ef5b94 100644 +--- a/arch/powerpc/boot/opal.c ++++ b/arch/powerpc/boot/opal.c +@@ -13,8 +13,6 @@ + #include <libfdt.h> + #include "../include/asm/opal-api.h" + +-#ifdef CONFIG_PPC64_BOOT_WRAPPER +- + /* Global OPAL struct used by opal-call.S */ + struct opal { + u64 base; +@@ -101,9 +99,3 @@ int opal_console_init(void *devp, struct serial_console_data *scdp) + + return 0; + } +-#else +-int opal_console_init(void *devp, struct serial_console_data *scdp) +-{ +- return -1; +-} +-#endif /* __powerpc64__ */ +diff --git a/arch/powerpc/include/asm/asm-prototypes.h b/arch/powerpc/include/asm/asm-prototypes.h +index e398173ae67d..d0609c116e4f 100644 +--- a/arch/powerpc/include/asm/asm-prototypes.h ++++ b/arch/powerpc/include/asm/asm-prototypes.h +@@ -146,8 +146,11 @@ void _kvmppc_save_tm_pr(struct kvm_vcpu *vcpu, u64 guest_msr); + /* Patch sites */ + extern s32 patch__call_flush_count_cache; + extern s32 patch__flush_count_cache_return; ++extern s32 patch__flush_link_stack_return; ++extern s32 patch__call_kvm_flush_link_stack; + extern s32 patch__memset_nocache, patch__memcpy_nocache; + + extern long flush_count_cache; ++extern long kvm_flush_link_stack; + + #endif /* _ASM_POWERPC_ASM_PROTOTYPES_H */ +diff --git a/arch/powerpc/include/asm/security_features.h b/arch/powerpc/include/asm/security_features.h +index 759597bf0fd8..ccf44c135389 100644 +--- a/arch/powerpc/include/asm/security_features.h ++++ b/arch/powerpc/include/asm/security_features.h +@@ -81,6 +81,9 @@ static inline bool security_ftr_enabled(unsigned long feature) + // Software required to flush count cache on context switch + #define SEC_FTR_FLUSH_COUNT_CACHE 0x0000000000000400ull + ++// Software required to flush link stack on context switch ++#define SEC_FTR_FLUSH_LINK_STACK 0x0000000000001000ull ++ + + // Features enabled by default + #define SEC_FTR_DEFAULT \ +diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c +index 110eba400de7..af1f3d5f9a0f 100644 +--- a/arch/powerpc/kernel/eeh_driver.c ++++ b/arch/powerpc/kernel/eeh_driver.c +@@ -281,6 +281,10 @@ static void eeh_pe_report_edev(struct eeh_dev *edev, eeh_report_fn fn, + struct pci_driver *driver; + enum pci_ers_result new_result; + ++ if (!edev->pdev) { ++ eeh_edev_info(edev, "no device"); ++ return; ++ } + device_lock(&edev->pdev->dev); + if (eeh_edev_actionable(edev)) { + driver = eeh_pcid_get(edev->pdev); +diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c +index 1b238ecc553e..210d239a9395 100644 +--- a/arch/powerpc/kernel/eeh_pe.c ++++ b/arch/powerpc/kernel/eeh_pe.c +@@ -379,7 +379,7 @@ int eeh_add_to_parent_pe(struct eeh_dev *edev) + while (parent) { + if (!(parent->type & EEH_PE_INVALID)) + break; +- parent->type &= ~(EEH_PE_INVALID | EEH_PE_KEEP); ++ parent->type &= ~EEH_PE_INVALID; + parent = parent->parent; + } + +diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S +index 7a46e0e57a36..58b50967b3e5 100644 +--- a/arch/powerpc/kernel/entry_64.S ++++ b/arch/powerpc/kernel/entry_64.S +@@ -533,6 +533,7 @@ flush_count_cache: + /* Save LR into r9 */ + mflr r9 + ++ // Flush the link stack + .rept 64 + bl .+4 + .endr +@@ -542,6 +543,11 @@ flush_count_cache: + .balign 32 + /* Restore LR */ + 1: mtlr r9 ++ ++ // If we're just flushing the link stack, return here ++3: nop ++ patch_site 3b patch__flush_link_stack_return ++ + li r9,0x7fff + mtctr r9 + +diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c +index 909c9407e392..02b69a68139c 100644 +--- a/arch/powerpc/kernel/process.c ++++ b/arch/powerpc/kernel/process.c +@@ -575,12 +575,11 @@ void flush_all_to_thread(struct task_struct *tsk) + if (tsk->thread.regs) { + preempt_disable(); + BUG_ON(tsk != current); +- save_all(tsk); +- + #ifdef CONFIG_SPE + if (tsk->thread.regs->msr & MSR_SPE) + tsk->thread.spefscr = mfspr(SPRN_SPEFSCR); + #endif ++ save_all(tsk); + + preempt_enable(); + } +diff --git a/arch/powerpc/kernel/security.c b/arch/powerpc/kernel/security.c +index 70568ccbd9fd..a5c5940d970a 100644 +--- a/arch/powerpc/kernel/security.c ++++ b/arch/powerpc/kernel/security.c +@@ -24,11 +24,12 @@ enum count_cache_flush_type { + COUNT_CACHE_FLUSH_HW = 0x4, + }; + static enum count_cache_flush_type count_cache_flush_type = COUNT_CACHE_FLUSH_NONE; ++static bool link_stack_flush_enabled; + + bool barrier_nospec_enabled; + static bool no_nospec; + static bool btb_flush_enabled; +-#ifdef CONFIG_PPC_FSL_BOOK3E ++#if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_BOOK3S_64) + static bool no_spectrev2; + #endif + +@@ -106,7 +107,7 @@ static __init int barrier_nospec_debugfs_init(void) + device_initcall(barrier_nospec_debugfs_init); + #endif /* CONFIG_DEBUG_FS */ + +-#ifdef CONFIG_PPC_FSL_BOOK3E ++#if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_BOOK3S_64) + static int __init handle_nospectre_v2(char *p) + { + no_spectrev2 = true; +@@ -114,6 +115,9 @@ static int __init handle_nospectre_v2(char *p) + return 0; + } + early_param("nospectre_v2", handle_nospectre_v2); ++#endif /* CONFIG_PPC_FSL_BOOK3E || CONFIG_PPC_BOOK3S_64 */ ++ ++#ifdef CONFIG_PPC_FSL_BOOK3E + void setup_spectre_v2(void) + { + if (no_spectrev2 || cpu_mitigations_off()) +@@ -201,11 +205,19 @@ ssize_t cpu_show_spectre_v2(struct device *dev, struct device_attribute *attr, c + + if (ccd) + seq_buf_printf(&s, "Indirect branch cache disabled"); ++ ++ if (link_stack_flush_enabled) ++ seq_buf_printf(&s, ", Software link stack flush"); ++ + } else if (count_cache_flush_type != COUNT_CACHE_FLUSH_NONE) { + seq_buf_printf(&s, "Mitigation: Software count cache flush"); + + if (count_cache_flush_type == COUNT_CACHE_FLUSH_HW) + seq_buf_printf(&s, " (hardware accelerated)"); ++ ++ if (link_stack_flush_enabled) ++ seq_buf_printf(&s, ", Software link stack flush"); ++ + } else if (btb_flush_enabled) { + seq_buf_printf(&s, "Mitigation: Branch predictor state flush"); + } else { +@@ -366,18 +378,49 @@ static __init int stf_barrier_debugfs_init(void) + device_initcall(stf_barrier_debugfs_init); + #endif /* CONFIG_DEBUG_FS */ + ++static void no_count_cache_flush(void) ++{ ++ count_cache_flush_type = COUNT_CACHE_FLUSH_NONE; ++ pr_info("count-cache-flush: software flush disabled.\n"); ++} ++ + static void toggle_count_cache_flush(bool enable) + { +- if (!enable || !security_ftr_enabled(SEC_FTR_FLUSH_COUNT_CACHE)) { ++ if (!security_ftr_enabled(SEC_FTR_FLUSH_COUNT_CACHE) && ++ !security_ftr_enabled(SEC_FTR_FLUSH_LINK_STACK)) ++ enable = false; ++ ++ if (!enable) { + patch_instruction_site(&patch__call_flush_count_cache, PPC_INST_NOP); +- count_cache_flush_type = COUNT_CACHE_FLUSH_NONE; +- pr_info("count-cache-flush: software flush disabled.\n"); ++#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE ++ patch_instruction_site(&patch__call_kvm_flush_link_stack, PPC_INST_NOP); ++#endif ++ pr_info("link-stack-flush: software flush disabled.\n"); ++ link_stack_flush_enabled = false; ++ no_count_cache_flush(); + return; + } + ++ // This enables the branch from _switch to flush_count_cache + patch_branch_site(&patch__call_flush_count_cache, + (u64)&flush_count_cache, BRANCH_SET_LINK); + ++#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE ++ // This enables the branch from guest_exit_cont to kvm_flush_link_stack ++ patch_branch_site(&patch__call_kvm_flush_link_stack, ++ (u64)&kvm_flush_link_stack, BRANCH_SET_LINK); ++#endif ++ ++ pr_info("link-stack-flush: software flush enabled.\n"); ++ link_stack_flush_enabled = true; ++ ++ // If we just need to flush the link stack, patch an early return ++ if (!security_ftr_enabled(SEC_FTR_FLUSH_COUNT_CACHE)) { ++ patch_instruction_site(&patch__flush_link_stack_return, PPC_INST_BLR); ++ no_count_cache_flush(); ++ return; ++ } ++ + if (!security_ftr_enabled(SEC_FTR_BCCTR_FLUSH_ASSIST)) { + count_cache_flush_type = COUNT_CACHE_FLUSH_SW; + pr_info("count-cache-flush: full software flush sequence enabled.\n"); +@@ -391,7 +434,26 @@ static void toggle_count_cache_flush(bool enable) + + void setup_count_cache_flush(void) + { +- toggle_count_cache_flush(true); ++ bool enable = true; ++ ++ if (no_spectrev2 || cpu_mitigations_off()) { ++ if (security_ftr_enabled(SEC_FTR_BCCTRL_SERIALISED) || ++ security_ftr_enabled(SEC_FTR_COUNT_CACHE_DISABLED)) ++ pr_warn("Spectre v2 mitigations not fully under software control, can't disable\n"); ++ ++ enable = false; ++ } ++ ++ /* ++ * There's no firmware feature flag/hypervisor bit to tell us we need to ++ * flush the link stack on context switch. So we set it here if we see ++ * either of the Spectre v2 mitigations that aim to protect userspace. ++ */ ++ if (security_ftr_enabled(SEC_FTR_COUNT_CACHE_DISABLED) || ++ security_ftr_enabled(SEC_FTR_FLUSH_COUNT_CACHE)) ++ security_ftr_set(SEC_FTR_FLUSH_LINK_STACK); ++ ++ toggle_count_cache_flush(enable); + } + + #ifdef CONFIG_DEBUG_FS +diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S +index f1878e13dd56..7fe3077a1ef6 100644 +--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S ++++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S +@@ -18,6 +18,7 @@ + */ + + #include <asm/ppc_asm.h> ++#include <asm/code-patching-asm.h> + #include <asm/kvm_asm.h> + #include <asm/reg.h> + #include <asm/mmu.h> +@@ -1559,6 +1560,10 @@ mc_cont: + 1: + #endif /* CONFIG_KVM_XICS */ + ++ /* Possibly flush the link stack here. */ ++1: nop ++ patch_site 1b patch__call_kvm_flush_link_stack ++ + /* For hash guest, read the guest SLB and save it away */ + ld r5, VCPU_KVM(r9) + lbz r0, KVM_RADIX(r5) +@@ -2107,6 +2112,29 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) + mtlr r0 + blr + ++.balign 32 ++.global kvm_flush_link_stack ++kvm_flush_link_stack: ++ /* Save LR into r0 */ ++ mflr r0 ++ ++ /* Flush the link stack. On Power8 it's up to 32 entries in size. */ ++ .rept 32 ++ bl .+4 ++ .endr ++ ++ /* And on Power9 it's up to 64. */ ++BEGIN_FTR_SECTION ++ .rept 32 ++ bl .+4 ++ .endr ++END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) ++ ++ /* Restore LR */ ++ mtlr r0 ++ blr ++ ++ + #ifdef CONFIG_PPC_TRANSACTIONAL_MEM + /* + * Softpatch interrupt for transactional memory emulation cases +diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c +index 3ea4c1f107d7..69caeb5bccb2 100644 +--- a/arch/powerpc/mm/pgtable-radix.c ++++ b/arch/powerpc/mm/pgtable-radix.c +@@ -294,15 +294,15 @@ retry: + } + + if (split_text_mapping && (mapping_size == PUD_SIZE) && +- (addr <= __pa_symbol(__init_begin)) && +- (addr + mapping_size) >= __pa_symbol(_stext)) { ++ (addr < __pa_symbol(__init_begin)) && ++ (addr + mapping_size) > __pa_symbol(__init_begin)) { + max_mapping_size = PMD_SIZE; + goto retry; + } + + if (split_text_mapping && (mapping_size == PMD_SIZE) && +- (addr <= __pa_symbol(__init_begin)) && +- (addr + mapping_size) >= __pa_symbol(_stext)) { ++ (addr < __pa_symbol(__init_begin)) && ++ (addr + mapping_size) > __pa_symbol(__init_begin)) { + mapping_size = PAGE_SIZE; + psize = mmu_virtual_psize; + } +diff --git a/arch/powerpc/mm/tlb-radix.c b/arch/powerpc/mm/tlb-radix.c +index 796ff5de26d0..1749f15fc070 100644 +--- a/arch/powerpc/mm/tlb-radix.c ++++ b/arch/powerpc/mm/tlb-radix.c +@@ -1072,7 +1072,6 @@ void radix__flush_tlb_collapsed_pmd(struct mm_struct *mm, unsigned long addr) + goto local; + } + _tlbie_va_range(addr, end, pid, PAGE_SIZE, mmu_virtual_psize, true); +- goto local; + } else { + local: + _tlbiel_va_range(addr, end, pid, PAGE_SIZE, mmu_virtual_psize, true); +diff --git a/arch/powerpc/platforms/powernv/memtrace.c b/arch/powerpc/platforms/powernv/memtrace.c +index 232bf5987f91..dd3cc4632b9a 100644 +--- a/arch/powerpc/platforms/powernv/memtrace.c ++++ b/arch/powerpc/platforms/powernv/memtrace.c +@@ -244,9 +244,11 @@ static int memtrace_online(void) + * we need to online the memory ourselves. + */ + if (!memhp_auto_online) { ++ lock_device_hotplug(); + walk_memory_range(PFN_DOWN(ent->start), + PFN_UP(ent->start + ent->size - 1), + NULL, online_mem_block); ++ unlock_device_hotplug(); + } + + /* +diff --git a/arch/powerpc/platforms/ps3/os-area.c b/arch/powerpc/platforms/ps3/os-area.c +index cdbfc5cfd6f3..f5387ad82279 100644 +--- a/arch/powerpc/platforms/ps3/os-area.c ++++ b/arch/powerpc/platforms/ps3/os-area.c +@@ -664,7 +664,7 @@ static int update_flash_db(void) + db_set_64(db, &os_area_db_id_rtc_diff, saved_params.rtc_diff); + + count = os_area_flash_write(db, sizeof(struct os_area_db), pos); +- if (count < sizeof(struct os_area_db)) { ++ if (count < 0 || count < sizeof(struct os_area_db)) { + pr_debug("%s: os_area_flash_write failed %zd\n", __func__, + count); + error = count < 0 ? count : -EIO; +diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c +index 2f166136bb50..d93ff494e778 100644 +--- a/arch/powerpc/platforms/pseries/hotplug-memory.c ++++ b/arch/powerpc/platforms/pseries/hotplug-memory.c +@@ -676,7 +676,7 @@ static int dlpar_add_lmb(struct drmem_lmb *lmb) + nid = memory_add_physaddr_to_nid(lmb->base_addr); + + /* Add the memory */ +- rc = add_memory(nid, lmb->base_addr, block_sz); ++ rc = __add_memory(nid, lmb->base_addr, block_sz); + if (rc) { + invalidate_lmb_associativity_index(lmb); + return rc; +diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c +index ea602f7f97ce..49e3a88b6a0c 100644 +--- a/arch/powerpc/platforms/pseries/lpar.c ++++ b/arch/powerpc/platforms/pseries/lpar.c +@@ -48,6 +48,7 @@ + #include <asm/kexec.h> + #include <asm/fadump.h> + #include <asm/asm-prototypes.h> ++#include <asm/debugfs.h> + + #include "pseries.h" + +@@ -1032,3 +1033,56 @@ static int __init reserve_vrma_context_id(void) + return 0; + } + machine_device_initcall(pseries, reserve_vrma_context_id); ++ ++#ifdef CONFIG_DEBUG_FS ++/* debugfs file interface for vpa data */ ++static ssize_t vpa_file_read(struct file *filp, char __user *buf, size_t len, ++ loff_t *pos) ++{ ++ int cpu = (long)filp->private_data; ++ struct lppaca *lppaca = &lppaca_of(cpu); ++ ++ return simple_read_from_buffer(buf, len, pos, lppaca, ++ sizeof(struct lppaca)); ++} ++ ++static const struct file_operations vpa_fops = { ++ .open = simple_open, ++ .read = vpa_file_read, ++ .llseek = default_llseek, ++}; ++ ++static int __init vpa_debugfs_init(void) ++{ ++ char name[16]; ++ long i; ++ static struct dentry *vpa_dir; ++ ++ if (!firmware_has_feature(FW_FEATURE_SPLPAR)) ++ return 0; ++ ++ vpa_dir = debugfs_create_dir("vpa", powerpc_debugfs_root); ++ if (!vpa_dir) { ++ pr_warn("%s: can't create vpa root dir\n", __func__); ++ return -ENOMEM; ++ } ++ ++ /* set up the per-cpu vpa file*/ ++ for_each_possible_cpu(i) { ++ struct dentry *d; ++ ++ sprintf(name, "cpu-%ld", i); ++ ++ d = debugfs_create_file(name, 0400, vpa_dir, (void *)i, ++ &vpa_fops); ++ if (!d) { ++ pr_warn("%s: can't create per-cpu vpa file\n", ++ __func__); ++ return -ENOMEM; ++ } ++ } ++ ++ return 0; ++} ++machine_arch_initcall(pseries, vpa_debugfs_init); ++#endif /* CONFIG_DEBUG_FS */ +diff --git a/arch/powerpc/xmon/Makefile b/arch/powerpc/xmon/Makefile +index 9d7d8e6d705c..9ba44e190e5e 100644 +--- a/arch/powerpc/xmon/Makefile ++++ b/arch/powerpc/xmon/Makefile +@@ -13,6 +13,12 @@ UBSAN_SANITIZE := n + ORIG_CFLAGS := $(KBUILD_CFLAGS) + KBUILD_CFLAGS = $(subst $(CC_FLAGS_FTRACE),,$(ORIG_CFLAGS)) + ++ifdef CONFIG_CC_IS_CLANG ++# clang stores addresses on the stack causing the frame size to blow ++# out. See https://github.com/ClangBuiltLinux/linux/issues/252 ++KBUILD_CFLAGS += -Wframe-larger-than=4096 ++endif ++ + ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) + + obj-y += xmon.o nonstdio.o spr_access.o +diff --git a/arch/riscv/mm/ioremap.c b/arch/riscv/mm/ioremap.c +index 70ef2724cdf6..bd2f2db557cc 100644 +--- a/arch/riscv/mm/ioremap.c ++++ b/arch/riscv/mm/ioremap.c +@@ -42,7 +42,7 @@ static void __iomem *__ioremap_caller(phys_addr_t addr, size_t size, + + /* Page-align mappings */ + offset = addr & (~PAGE_MASK); +- addr &= PAGE_MASK; ++ addr -= offset; + size = PAGE_ALIGN(size + offset); + + area = get_vm_area_caller(size, VM_IOREMAP, caller); +diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c +index 44404836e9d1..df92c2af99b6 100644 +--- a/arch/s390/kernel/perf_cpum_sf.c ++++ b/arch/s390/kernel/perf_cpum_sf.c +@@ -2045,14 +2045,17 @@ static int __init init_cpum_sampling_pmu(void) + } + + sfdbg = debug_register(KMSG_COMPONENT, 2, 1, 80); +- if (!sfdbg) ++ if (!sfdbg) { + pr_err("Registering for s390dbf failed\n"); ++ return -ENOMEM; ++ } + debug_register_view(sfdbg, &debug_sprintf_view); + + err = register_external_irq(EXT_IRQ_MEASURE_ALERT, + cpumf_measurement_alert); + if (err) { + pr_cpumsf_err(RS_INIT_FAILURE_ALRT); ++ debug_unregister(sfdbg); + goto out; + } + +@@ -2061,6 +2064,7 @@ static int __init init_cpum_sampling_pmu(void) + pr_cpumsf_err(RS_INIT_FAILURE_PERF); + unregister_external_irq(EXT_IRQ_MEASURE_ALERT, + cpumf_measurement_alert); ++ debug_unregister(sfdbg); + goto out; + } + +diff --git a/arch/sparc/include/asm/cmpxchg_64.h b/arch/sparc/include/asm/cmpxchg_64.h +index f71ef3729888..316faa0130ba 100644 +--- a/arch/sparc/include/asm/cmpxchg_64.h ++++ b/arch/sparc/include/asm/cmpxchg_64.h +@@ -52,7 +52,12 @@ static inline unsigned long xchg64(__volatile__ unsigned long *m, unsigned long + return val; + } + +-#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) ++#define xchg(ptr,x) \ ++({ __typeof__(*(ptr)) __ret; \ ++ __ret = (__typeof__(*(ptr))) \ ++ __xchg((unsigned long)(x), (ptr), sizeof(*(ptr))); \ ++ __ret; \ ++}) + + void __xchg_called_with_bad_pointer(void); + +diff --git a/arch/sparc/include/asm/parport.h b/arch/sparc/include/asm/parport.h +index 05df5f043053..3c5a1c620f0f 100644 +--- a/arch/sparc/include/asm/parport.h ++++ b/arch/sparc/include/asm/parport.h +@@ -21,6 +21,7 @@ + */ + #define HAS_DMA + ++#ifdef CONFIG_PARPORT_PC_FIFO + static DEFINE_SPINLOCK(dma_spin_lock); + + #define claim_dma_lock() \ +@@ -31,6 +32,7 @@ static DEFINE_SPINLOCK(dma_spin_lock); + + #define release_dma_lock(__flags) \ + spin_unlock_irqrestore(&dma_spin_lock, __flags); ++#endif + + static struct sparc_ebus_info { + struct ebus_dma_info info; +diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c +index 8d80b27502e6..7e524efed584 100644 +--- a/arch/um/drivers/line.c ++++ b/arch/um/drivers/line.c +@@ -261,7 +261,7 @@ static irqreturn_t line_write_interrupt(int irq, void *data) + if (err == 0) { + spin_unlock(&line->lock); + return IRQ_NONE; +- } else if (err < 0) { ++ } else if ((err < 0) && (err != -EAGAIN)) { + line->head = line->buffer; + line->tail = line->buffer; + } +@@ -284,7 +284,7 @@ int line_setup_irq(int fd, int input, int output, struct line *line, void *data) + if (err) + return err; + if (output) +- err = um_request_irq(driver->write_irq, fd, IRQ_NONE, ++ err = um_request_irq(driver->write_irq, fd, IRQ_WRITE, + line_write_interrupt, IRQF_SHARED, + driver->write_irq_name, data); + return err; +diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h +index 6de1fd3d0097..ee696efec99f 100644 +--- a/arch/x86/include/asm/ptrace.h ++++ b/arch/x86/include/asm/ptrace.h +@@ -236,24 +236,52 @@ static inline int regs_within_kernel_stack(struct pt_regs *regs, + (kernel_stack_pointer(regs) & ~(THREAD_SIZE - 1))); + } + ++/** ++ * regs_get_kernel_stack_nth_addr() - get the address of the Nth entry on stack ++ * @regs: pt_regs which contains kernel stack pointer. ++ * @n: stack entry number. ++ * ++ * regs_get_kernel_stack_nth() returns the address of the @n th entry of the ++ * kernel stack which is specified by @regs. If the @n th entry is NOT in ++ * the kernel stack, this returns NULL. ++ */ ++static inline unsigned long *regs_get_kernel_stack_nth_addr(struct pt_regs *regs, unsigned int n) ++{ ++ unsigned long *addr = (unsigned long *)kernel_stack_pointer(regs); ++ ++ addr += n; ++ if (regs_within_kernel_stack(regs, (unsigned long)addr)) ++ return addr; ++ else ++ return NULL; ++} ++ ++/* To avoid include hell, we can't include uaccess.h */ ++extern long probe_kernel_read(void *dst, const void *src, size_t size); ++ + /** + * regs_get_kernel_stack_nth() - get Nth entry of the stack + * @regs: pt_regs which contains kernel stack pointer. + * @n: stack entry number. + * + * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which +- * is specified by @regs. If the @n th entry is NOT in the kernel stack, ++ * is specified by @regs. If the @n th entry is NOT in the kernel stack + * this returns 0. + */ + static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, + unsigned int n) + { +- unsigned long *addr = (unsigned long *)kernel_stack_pointer(regs); +- addr += n; +- if (regs_within_kernel_stack(regs, (unsigned long)addr)) +- return *addr; +- else +- return 0; ++ unsigned long *addr; ++ unsigned long val; ++ long ret; ++ ++ addr = regs_get_kernel_stack_nth_addr(regs, n); ++ if (addr) { ++ ret = probe_kernel_read(&val, addr, sizeof(val)); ++ if (!ret) ++ return val; ++ } ++ return 0; + } + + #define arch_has_single_step() (1) +diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c +index 4684ad7ba793..2d23a448e72d 100644 +--- a/arch/x86/kernel/cpu/bugs.c ++++ b/arch/x86/kernel/cpu/bugs.c +@@ -39,6 +39,7 @@ static void __init spectre_v2_select_mitigation(void); + static void __init ssb_select_mitigation(void); + static void __init l1tf_select_mitigation(void); + static void __init mds_select_mitigation(void); ++static void __init mds_print_mitigation(void); + static void __init taa_select_mitigation(void); + + /* The base value of the SPEC_CTRL MSR that always has to be preserved. */ +@@ -108,6 +109,12 @@ void __init check_bugs(void) + mds_select_mitigation(); + taa_select_mitigation(); + ++ /* ++ * As MDS and TAA mitigations are inter-related, print MDS ++ * mitigation until after TAA mitigation selection is done. ++ */ ++ mds_print_mitigation(); ++ + arch_smt_update(); + + #ifdef CONFIG_X86_32 +@@ -245,6 +252,12 @@ static void __init mds_select_mitigation(void) + (mds_nosmt || cpu_mitigations_auto_nosmt())) + cpu_smt_disable(false); + } ++} ++ ++static void __init mds_print_mitigation(void) ++{ ++ if (!boot_cpu_has_bug(X86_BUG_MDS) || cpu_mitigations_off()) ++ return; + + pr_info("%s\n", mds_strings[mds_mitigation]); + } +@@ -304,8 +317,12 @@ static void __init taa_select_mitigation(void) + return; + } + +- /* TAA mitigation is turned off on the cmdline (tsx_async_abort=off) */ +- if (taa_mitigation == TAA_MITIGATION_OFF) ++ /* ++ * TAA mitigation via VERW is turned off if both ++ * tsx_async_abort=off and mds=off are specified. ++ */ ++ if (taa_mitigation == TAA_MITIGATION_OFF && ++ mds_mitigation == MDS_MITIGATION_OFF) + goto out; + + if (boot_cpu_has(X86_FEATURE_MD_CLEAR)) +@@ -339,6 +356,15 @@ static void __init taa_select_mitigation(void) + if (taa_nosmt || cpu_mitigations_auto_nosmt()) + cpu_smt_disable(false); + ++ /* ++ * Update MDS mitigation, if necessary, as the mds_user_clear is ++ * now enabled for TAA mitigation. ++ */ ++ if (mds_mitigation == MDS_MITIGATION_OFF && ++ boot_cpu_has_bug(X86_BUG_MDS)) { ++ mds_mitigation = MDS_MITIGATION_FULL; ++ mds_select_mitigation(); ++ } + out: + pr_info("%s\n", taa_strings[taa_mitigation]); + } +diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c +index cc43c5abd187..b99a04da70f6 100644 +--- a/arch/x86/kernel/cpu/intel_rdt.c ++++ b/arch/x86/kernel/cpu/intel_rdt.c +@@ -610,6 +610,13 @@ static void domain_remove_cpu(int cpu, struct rdt_resource *r) + cancel_delayed_work(&d->cqm_limbo); + } + ++ /* ++ * rdt_domain "d" is going to be freed below, so clear ++ * its pointer from pseudo_lock_region struct. ++ */ ++ if (d->plr) ++ d->plr->d = NULL; ++ + kfree(d->ctrl_val); + kfree(d->mbps_val); + kfree(d->rmid_busy_llc); +diff --git a/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c b/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c +index 968ace3c6d73..c8b72aff55e0 100644 +--- a/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c ++++ b/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c +@@ -408,8 +408,16 @@ int rdtgroup_schemata_show(struct kernfs_open_file *of, + for_each_alloc_enabled_rdt_resource(r) + seq_printf(s, "%s:uninitialized\n", r->name); + } else if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { +- seq_printf(s, "%s:%d=%x\n", rdtgrp->plr->r->name, +- rdtgrp->plr->d->id, rdtgrp->plr->cbm); ++ if (!rdtgrp->plr->d) { ++ rdt_last_cmd_clear(); ++ rdt_last_cmd_puts("Cache domain offline\n"); ++ ret = -ENODEV; ++ } else { ++ seq_printf(s, "%s:%d=%x\n", ++ rdtgrp->plr->r->name, ++ rdtgrp->plr->d->id, ++ rdtgrp->plr->cbm); ++ } + } else { + closid = rdtgrp->closid; + for_each_alloc_enabled_rdt_resource(r) { +diff --git a/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c b/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c +index 912d53939f4f..a999a58ca331 100644 +--- a/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c ++++ b/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c +@@ -1116,6 +1116,11 @@ static int pseudo_lock_measure_cycles(struct rdtgroup *rdtgrp, int sel) + goto out; + } + ++ if (!plr->d) { ++ ret = -ENODEV; ++ goto out; ++ } ++ + plr->thread_done = 0; + cpu = cpumask_first(&plr->d->cpu_mask); + if (!cpu_online(cpu)) { +@@ -1429,6 +1434,11 @@ static int pseudo_lock_dev_mmap(struct file *filp, struct vm_area_struct *vma) + + plr = rdtgrp->plr; + ++ if (!plr->d) { ++ mutex_unlock(&rdtgroup_mutex); ++ return -ENODEV; ++ } ++ + /* + * Task is required to run with affinity to the cpus associated + * with the pseudo-locked region. If this is not the case the task +diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +index ad64031e82dc..a2d7e6646cce 100644 +--- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c ++++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c +@@ -268,17 +268,27 @@ static int rdtgroup_cpus_show(struct kernfs_open_file *of, + struct seq_file *s, void *v) + { + struct rdtgroup *rdtgrp; ++ struct cpumask *mask; + int ret = 0; + + rdtgrp = rdtgroup_kn_lock_live(of->kn); + + if (rdtgrp) { +- if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) +- seq_printf(s, is_cpu_list(of) ? "%*pbl\n" : "%*pb\n", +- cpumask_pr_args(&rdtgrp->plr->d->cpu_mask)); +- else ++ if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { ++ if (!rdtgrp->plr->d) { ++ rdt_last_cmd_clear(); ++ rdt_last_cmd_puts("Cache domain offline\n"); ++ ret = -ENODEV; ++ } else { ++ mask = &rdtgrp->plr->d->cpu_mask; ++ seq_printf(s, is_cpu_list(of) ? ++ "%*pbl\n" : "%*pb\n", ++ cpumask_pr_args(mask)); ++ } ++ } else { + seq_printf(s, is_cpu_list(of) ? "%*pbl\n" : "%*pb\n", + cpumask_pr_args(&rdtgrp->cpu_mask)); ++ } + } else { + ret = -ENOENT; + } +@@ -1286,6 +1296,7 @@ static int rdtgroup_size_show(struct kernfs_open_file *of, + struct rdt_resource *r; + struct rdt_domain *d; + unsigned int size; ++ int ret = 0; + bool sep; + u32 ctrl; + +@@ -1296,11 +1307,18 @@ static int rdtgroup_size_show(struct kernfs_open_file *of, + } + + if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { +- seq_printf(s, "%*s:", max_name_width, rdtgrp->plr->r->name); +- size = rdtgroup_cbm_to_size(rdtgrp->plr->r, +- rdtgrp->plr->d, +- rdtgrp->plr->cbm); +- seq_printf(s, "%d=%u\n", rdtgrp->plr->d->id, size); ++ if (!rdtgrp->plr->d) { ++ rdt_last_cmd_clear(); ++ rdt_last_cmd_puts("Cache domain offline\n"); ++ ret = -ENODEV; ++ } else { ++ seq_printf(s, "%*s:", max_name_width, ++ rdtgrp->plr->r->name); ++ size = rdtgroup_cbm_to_size(rdtgrp->plr->r, ++ rdtgrp->plr->d, ++ rdtgrp->plr->cbm); ++ seq_printf(s, "%d=%u\n", rdtgrp->plr->d->id, size); ++ } + goto out; + } + +@@ -1330,7 +1348,7 @@ static int rdtgroup_size_show(struct kernfs_open_file *of, + out: + rdtgroup_kn_unlock(of->kn); + +- return 0; ++ return ret; + } + + /* rdtgroup information files for one cache resource. */ +diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c +index d7db7608de5f..eddf91a0e363 100644 +--- a/arch/x86/kvm/mmu.c ++++ b/arch/x86/kvm/mmu.c +@@ -3261,7 +3261,7 @@ static void transparent_hugepage_adjust(struct kvm_vcpu *vcpu, + * here. + */ + if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn) && +- level == PT_PAGE_TABLE_LEVEL && ++ !kvm_is_zone_device_pfn(pfn) && level == PT_PAGE_TABLE_LEVEL && + PageTransCompoundMap(pfn_to_page(pfn)) && + !mmu_gfn_lpage_is_disallowed(vcpu, gfn, PT_DIRECTORY_LEVEL)) { + unsigned long mask; +@@ -5709,9 +5709,9 @@ restart: + * the guest, and the guest page table is using 4K page size + * mapping if the indirect sp has level = 1. + */ +- if (sp->role.direct && +- !kvm_is_reserved_pfn(pfn) && +- PageTransCompoundMap(pfn_to_page(pfn))) { ++ if (sp->role.direct && !kvm_is_reserved_pfn(pfn) && ++ !kvm_is_zone_device_pfn(pfn) && ++ PageTransCompoundMap(pfn_to_page(pfn))) { + drop_spte(kvm, sptep); + need_tlb_flush = 1; + goto restart; +diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c +index 1ab4bb3d6a04..0b7559bf15ea 100644 +--- a/arch/x86/kvm/vmx.c ++++ b/arch/x86/kvm/vmx.c +@@ -2079,7 +2079,7 @@ static int __find_msr_index(struct vcpu_vmx *vmx, u32 msr) + return -1; + } + +-static inline void __invvpid(int ext, u16 vpid, gva_t gva) ++static inline void __invvpid(unsigned long ext, u16 vpid, gva_t gva) + { + struct { + u64 vpid : 16; +@@ -2094,7 +2094,7 @@ static inline void __invvpid(int ext, u16 vpid, gva_t gva) + BUG_ON(error); + } + +-static inline void __invept(int ext, u64 eptp, gpa_t gpa) ++static inline void __invept(unsigned long ext, u64 eptp, gpa_t gpa) + { + struct { + u64 eptp, gpa; +@@ -11013,6 +11013,10 @@ static void vmx_switch_vmcs(struct kvm_vcpu *vcpu, struct loaded_vmcs *vmcs) + vmx->loaded_vmcs = vmcs; + vmx_vcpu_load(vcpu, cpu); + put_cpu(); ++ ++ vm_entry_controls_reset_shadow(vmx); ++ vm_exit_controls_reset_shadow(vmx); ++ vmx_segment_cache_clear(vmx); + } + + /* +@@ -12690,6 +12694,9 @@ static int enter_vmx_non_root_mode(struct kvm_vcpu *vcpu, u32 *exit_qual) + if (likely(!evaluate_pending_interrupts) && kvm_vcpu_apicv_active(vcpu)) + evaluate_pending_interrupts |= vmx_has_apicv_interrupt(vcpu); + ++ if (from_vmentry && check_vmentry_postreqs(vcpu, vmcs12, exit_qual)) ++ return EXIT_REASON_INVALID_STATE; ++ + enter_guest_mode(vcpu); + + if (!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS)) +@@ -12699,7 +12706,6 @@ static int enter_vmx_non_root_mode(struct kvm_vcpu *vcpu, u32 *exit_qual) + vmx->nested.vmcs01_guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS); + + vmx_switch_vmcs(vcpu, &vmx->nested.vmcs02); +- vmx_segment_cache_clear(vmx); + + if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETING) + vcpu->arch.tsc_offset += vmcs12->tsc_offset; +@@ -12833,13 +12839,6 @@ static int nested_vmx_run(struct kvm_vcpu *vcpu, bool launch) + */ + skip_emulated_instruction(vcpu); + +- ret = check_vmentry_postreqs(vcpu, vmcs12, &exit_qual); +- if (ret) { +- nested_vmx_entry_failure(vcpu, vmcs12, +- EXIT_REASON_INVALID_STATE, exit_qual); +- return 1; +- } +- + /* + * We're finally done with prerequisite checking, and can start with + * the nested entry. +@@ -13530,9 +13529,6 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, + } + + vmx_switch_vmcs(vcpu, &vmx->vmcs01); +- vm_entry_controls_reset_shadow(vmx); +- vm_exit_controls_reset_shadow(vmx); +- vmx_segment_cache_clear(vmx); + + /* Update any VMCS fields that might have changed while L2 ran */ + vmcs_write32(VM_EXIT_MSR_LOAD_COUNT, vmx->msr_autoload.host.nr); +diff --git a/arch/x86/tools/gen-insn-attr-x86.awk b/arch/x86/tools/gen-insn-attr-x86.awk +index b02a36b2c14f..a42015b305f4 100644 +--- a/arch/x86/tools/gen-insn-attr-x86.awk ++++ b/arch/x86/tools/gen-insn-attr-x86.awk +@@ -69,7 +69,7 @@ BEGIN { + + lprefix1_expr = "\\((66|!F3)\\)" + lprefix2_expr = "\\(F3\\)" +- lprefix3_expr = "\\((F2|!F3|66\\&F2)\\)" ++ lprefix3_expr = "\\((F2|!F3|66&F2)\\)" + lprefix_expr = "\\((66|F2|F3)\\)" + max_lprefix = 4 + +@@ -257,7 +257,7 @@ function convert_operands(count,opnd, i,j,imm,mod) + return add_flags(imm, mod) + } + +-/^[0-9a-f]+\:/ { ++/^[0-9a-f]+:/ { + if (NR == 1) + next + # get index +diff --git a/block/blk-core.c b/block/blk-core.c +index 074ae9376189..ea33d6abdcfc 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -784,6 +784,9 @@ void blk_cleanup_queue(struct request_queue *q) + * prevent that q->request_fn() gets invoked after draining finished. + */ + blk_freeze_queue(q); ++ ++ rq_qos_exit(q); ++ + spin_lock_irq(lock); + queue_flag_set(QUEUE_FLAG_DEAD, q); + spin_unlock_irq(lock); +diff --git a/block/blk-merge.c b/block/blk-merge.c +index 2e042190a4f1..1dced51de1c6 100644 +--- a/block/blk-merge.c ++++ b/block/blk-merge.c +@@ -669,6 +669,31 @@ static void blk_account_io_merge(struct request *req) + part_stat_unlock(); + } + } ++/* ++ * Two cases of handling DISCARD merge: ++ * If max_discard_segments > 1, the driver takes every bio ++ * as a range and send them to controller together. The ranges ++ * needn't to be contiguous. ++ * Otherwise, the bios/requests will be handled as same as ++ * others which should be contiguous. ++ */ ++static inline bool blk_discard_mergable(struct request *req) ++{ ++ if (req_op(req) == REQ_OP_DISCARD && ++ queue_max_discard_segments(req->q) > 1) ++ return true; ++ return false; ++} ++ ++enum elv_merge blk_try_req_merge(struct request *req, struct request *next) ++{ ++ if (blk_discard_mergable(req)) ++ return ELEVATOR_DISCARD_MERGE; ++ else if (blk_rq_pos(req) + blk_rq_sectors(req) == blk_rq_pos(next)) ++ return ELEVATOR_BACK_MERGE; ++ ++ return ELEVATOR_NO_MERGE; ++} + + /* + * For non-mq, this has to be called with the request spinlock acquired. +@@ -686,12 +711,6 @@ static struct request *attempt_merge(struct request_queue *q, + if (req_op(req) != req_op(next)) + return NULL; + +- /* +- * not contiguous +- */ +- if (blk_rq_pos(req) + blk_rq_sectors(req) != blk_rq_pos(next)) +- return NULL; +- + if (rq_data_dir(req) != rq_data_dir(next) + || req->rq_disk != next->rq_disk + || req_no_special_merge(next)) +@@ -715,11 +734,19 @@ static struct request *attempt_merge(struct request_queue *q, + * counts here. Handle DISCARDs separately, as they + * have separate settings. + */ +- if (req_op(req) == REQ_OP_DISCARD) { ++ ++ switch (blk_try_req_merge(req, next)) { ++ case ELEVATOR_DISCARD_MERGE: + if (!req_attempt_discard_merge(q, req, next)) + return NULL; +- } else if (!ll_merge_requests_fn(q, req, next)) ++ break; ++ case ELEVATOR_BACK_MERGE: ++ if (!ll_merge_requests_fn(q, req, next)) ++ return NULL; ++ break; ++ default: + return NULL; ++ } + + /* + * If failfast settings disagree or any of the two is already +@@ -843,8 +870,7 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) + + enum elv_merge blk_try_merge(struct request *rq, struct bio *bio) + { +- if (req_op(rq) == REQ_OP_DISCARD && +- queue_max_discard_segments(rq->q) > 1) ++ if (blk_discard_mergable(rq)) + return ELEVATOR_DISCARD_MERGE; + else if (blk_rq_pos(rq) + blk_rq_sectors(rq) == bio->bi_iter.bi_sector) + return ELEVATOR_BACK_MERGE; +diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c +index bab47a17b96f..8286640d4d66 100644 +--- a/block/blk-sysfs.c ++++ b/block/blk-sysfs.c +@@ -997,8 +997,6 @@ void blk_unregister_queue(struct gendisk *disk) + kobject_del(&q->kobj); + blk_trace_remove_sysfs(disk_to_dev(disk)); + +- rq_qos_exit(q); +- + mutex_lock(&q->sysfs_lock); + if (q->request_fn || (q->mq_ops && q->elevator)) + elv_unregister_queue(q); +diff --git a/crypto/testmgr.c b/crypto/testmgr.c +index 3664c26f4838..13cb2ea99d6a 100644 +--- a/crypto/testmgr.c ++++ b/crypto/testmgr.c +@@ -1400,8 +1400,8 @@ static int test_comp(struct crypto_comp *tfm, + int ilen; + unsigned int dlen = COMP_BUF_SIZE; + +- memset(output, 0, sizeof(COMP_BUF_SIZE)); +- memset(decomp_output, 0, sizeof(COMP_BUF_SIZE)); ++ memset(output, 0, COMP_BUF_SIZE); ++ memset(decomp_output, 0, COMP_BUF_SIZE); + + ilen = ctemplate[i].inlen; + ret = crypto_comp_compress(tfm, ctemplate[i].input, +@@ -1445,7 +1445,7 @@ static int test_comp(struct crypto_comp *tfm, + int ilen; + unsigned int dlen = COMP_BUF_SIZE; + +- memset(decomp_output, 0, sizeof(COMP_BUF_SIZE)); ++ memset(decomp_output, 0, COMP_BUF_SIZE); + + ilen = dtemplate[i].inlen; + ret = crypto_comp_decompress(tfm, dtemplate[i].input, +diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c +index 6b0d3ef7309c..2ccfbb61ca89 100644 +--- a/drivers/acpi/acpi_memhotplug.c ++++ b/drivers/acpi/acpi_memhotplug.c +@@ -228,7 +228,7 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device) + if (node < 0) + node = memory_add_physaddr_to_nid(info->start_addr); + +- result = add_memory(node, info->start_addr, info->length); ++ result = __add_memory(node, info->start_addr, info->length); + + /* + * If the memory block has been used by the kernel, add_memory() +diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c +index e1b6231cfa1c..1dcc48b9d33c 100644 +--- a/drivers/acpi/scan.c ++++ b/drivers/acpi/scan.c +@@ -1550,6 +1550,7 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device) + */ + static const struct acpi_device_id i2c_multi_instantiate_ids[] = { + {"BSG1160", }, ++ {"INT33FE", }, + {} + }; + +diff --git a/drivers/atm/zatm.c b/drivers/atm/zatm.c +index e89146ddede6..d5c76b50d357 100644 +--- a/drivers/atm/zatm.c ++++ b/drivers/atm/zatm.c +@@ -126,7 +126,7 @@ static unsigned long dummy[2] = {0,0}; + #define zin_n(r) inl(zatm_dev->base+r*4) + #define zin(r) inl(zatm_dev->base+uPD98401_##r*4) + #define zout(v,r) outl(v,zatm_dev->base+uPD98401_##r*4) +-#define zwait while (zin(CMR) & uPD98401_BUSY) ++#define zwait() do {} while (zin(CMR) & uPD98401_BUSY) + + /* RX0, RX1, TX0, TX1 */ + static const int mbx_entries[NR_MBX] = { 1024,1024,1024,1024 }; +@@ -140,7 +140,7 @@ static const int mbx_esize[NR_MBX] = { 16,16,4,4 }; /* entry size in bytes */ + + static void zpokel(struct zatm_dev *zatm_dev,u32 value,u32 addr) + { +- zwait; ++ zwait(); + zout(value,CER); + zout(uPD98401_IND_ACC | uPD98401_IA_BALL | + (uPD98401_IA_TGT_CM << uPD98401_IA_TGT_SHIFT) | addr,CMR); +@@ -149,10 +149,10 @@ static void zpokel(struct zatm_dev *zatm_dev,u32 value,u32 addr) + + static u32 zpeekl(struct zatm_dev *zatm_dev,u32 addr) + { +- zwait; ++ zwait(); + zout(uPD98401_IND_ACC | uPD98401_IA_BALL | uPD98401_IA_RW | + (uPD98401_IA_TGT_CM << uPD98401_IA_TGT_SHIFT) | addr,CMR); +- zwait; ++ zwait(); + return zin(CER); + } + +@@ -241,7 +241,7 @@ static void refill_pool(struct atm_dev *dev,int pool) + } + if (first) { + spin_lock_irqsave(&zatm_dev->lock, flags); +- zwait; ++ zwait(); + zout(virt_to_bus(first),CER); + zout(uPD98401_ADD_BAT | (pool << uPD98401_POOL_SHIFT) | count, + CMR); +@@ -508,9 +508,9 @@ static int open_rx_first(struct atm_vcc *vcc) + } + if (zatm_vcc->pool < 0) return -EMSGSIZE; + spin_lock_irqsave(&zatm_dev->lock, flags); +- zwait; ++ zwait(); + zout(uPD98401_OPEN_CHAN,CMR); +- zwait; ++ zwait(); + DPRINTK("0x%x 0x%x\n",zin(CMR),zin(CER)); + chan = (zin(CMR) & uPD98401_CHAN_ADDR) >> uPD98401_CHAN_ADDR_SHIFT; + spin_unlock_irqrestore(&zatm_dev->lock, flags); +@@ -571,21 +571,21 @@ static void close_rx(struct atm_vcc *vcc) + pos = vcc->vci >> 1; + shift = (1-(vcc->vci & 1)) << 4; + zpokel(zatm_dev,zpeekl(zatm_dev,pos) & ~(0xffff << shift),pos); +- zwait; ++ zwait(); + zout(uPD98401_NOP,CMR); +- zwait; ++ zwait(); + zout(uPD98401_NOP,CMR); + spin_unlock_irqrestore(&zatm_dev->lock, flags); + } + spin_lock_irqsave(&zatm_dev->lock, flags); +- zwait; ++ zwait(); + zout(uPD98401_DEACT_CHAN | uPD98401_CHAN_RT | (zatm_vcc->rx_chan << + uPD98401_CHAN_ADDR_SHIFT),CMR); +- zwait; ++ zwait(); + udelay(10); /* why oh why ... ? */ + zout(uPD98401_CLOSE_CHAN | uPD98401_CHAN_RT | (zatm_vcc->rx_chan << + uPD98401_CHAN_ADDR_SHIFT),CMR); +- zwait; ++ zwait(); + if (!(zin(CMR) & uPD98401_CHAN_ADDR)) + printk(KERN_CRIT DEV_LABEL "(itf %d): can't close RX channel " + "%d\n",vcc->dev->number,zatm_vcc->rx_chan); +@@ -699,7 +699,7 @@ printk("NONONONOO!!!!\n"); + skb_queue_tail(&zatm_vcc->tx_queue,skb); + DPRINTK("QRP=0x%08lx\n",zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+ + uPD98401_TXVC_QRP)); +- zwait; ++ zwait(); + zout(uPD98401_TX_READY | (zatm_vcc->tx_chan << + uPD98401_CHAN_ADDR_SHIFT),CMR); + spin_unlock_irqrestore(&zatm_dev->lock, flags); +@@ -891,12 +891,12 @@ static void close_tx(struct atm_vcc *vcc) + } + spin_lock_irqsave(&zatm_dev->lock, flags); + #if 0 +- zwait; ++ zwait(); + zout(uPD98401_DEACT_CHAN | (chan << uPD98401_CHAN_ADDR_SHIFT),CMR); + #endif +- zwait; ++ zwait(); + zout(uPD98401_CLOSE_CHAN | (chan << uPD98401_CHAN_ADDR_SHIFT),CMR); +- zwait; ++ zwait(); + if (!(zin(CMR) & uPD98401_CHAN_ADDR)) + printk(KERN_CRIT DEV_LABEL "(itf %d): can't close TX channel " + "%d\n",vcc->dev->number,chan); +@@ -926,9 +926,9 @@ static int open_tx_first(struct atm_vcc *vcc) + zatm_vcc->tx_chan = 0; + if (vcc->qos.txtp.traffic_class == ATM_NONE) return 0; + spin_lock_irqsave(&zatm_dev->lock, flags); +- zwait; ++ zwait(); + zout(uPD98401_OPEN_CHAN,CMR); +- zwait; ++ zwait(); + DPRINTK("0x%x 0x%x\n",zin(CMR),zin(CER)); + chan = (zin(CMR) & uPD98401_CHAN_ADDR) >> uPD98401_CHAN_ADDR_SHIFT; + spin_unlock_irqrestore(&zatm_dev->lock, flags); +@@ -1557,7 +1557,7 @@ static void zatm_phy_put(struct atm_dev *dev,unsigned char value, + struct zatm_dev *zatm_dev; + + zatm_dev = ZATM_DEV(dev); +- zwait; ++ zwait(); + zout(value,CER); + zout(uPD98401_IND_ACC | uPD98401_IA_B0 | + (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) | addr,CMR); +@@ -1569,10 +1569,10 @@ static unsigned char zatm_phy_get(struct atm_dev *dev,unsigned long addr) + struct zatm_dev *zatm_dev; + + zatm_dev = ZATM_DEV(dev); +- zwait; ++ zwait(); + zout(uPD98401_IND_ACC | uPD98401_IA_B0 | uPD98401_IA_RW | + (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) | addr,CMR); +- zwait; ++ zwait(); + return zin(CER) & 0xff; + } + +diff --git a/drivers/base/memory.c b/drivers/base/memory.c +index 85ee64d0a44e..ac1574a69610 100644 +--- a/drivers/base/memory.c ++++ b/drivers/base/memory.c +@@ -228,7 +228,6 @@ static bool pages_correctly_probed(unsigned long start_pfn) + /* + * MEMORY_HOTPLUG depends on SPARSEMEM in mm/Kconfig, so it is + * OK to have direct references to sparsemem variables in here. +- * Must already be protected by mem_hotplug_begin(). + */ + static int + memory_block_action(unsigned long phys_index, unsigned long action, int online_type) +@@ -294,7 +293,6 @@ static int memory_subsys_online(struct device *dev) + if (mem->online_type < 0) + mem->online_type = MMOP_ONLINE_KEEP; + +- /* Already under protection of mem_hotplug_begin() */ + ret = memory_block_change_state(mem, MEM_ONLINE, MEM_OFFLINE); + + /* clear online_type */ +@@ -341,19 +339,11 @@ store_mem_state(struct device *dev, + goto err; + } + +- /* +- * Memory hotplug needs to hold mem_hotplug_begin() for probe to find +- * the correct memory block to online before doing device_online(dev), +- * which will take dev->mutex. Take the lock early to prevent an +- * inversion, memory_subsys_online() callbacks will be implemented by +- * assuming it's already protected. +- */ +- mem_hotplug_begin(); +- + switch (online_type) { + case MMOP_ONLINE_KERNEL: + case MMOP_ONLINE_MOVABLE: + case MMOP_ONLINE_KEEP: ++ /* mem->online_type is protected by device_hotplug_lock */ + mem->online_type = online_type; + ret = device_online(&mem->dev); + break; +@@ -364,7 +354,6 @@ store_mem_state(struct device *dev, + ret = -EINVAL; /* should never happen */ + } + +- mem_hotplug_done(); + err: + unlock_device_hotplug(); + +@@ -519,15 +508,20 @@ memory_probe_store(struct device *dev, struct device_attribute *attr, + if (phys_addr & ((pages_per_block << PAGE_SHIFT) - 1)) + return -EINVAL; + ++ ret = lock_device_hotplug_sysfs(); ++ if (ret) ++ return ret; ++ + nid = memory_add_physaddr_to_nid(phys_addr); +- ret = add_memory(nid, phys_addr, +- MIN_MEMORY_BLOCK_SIZE * sections_per_block); ++ ret = __add_memory(nid, phys_addr, ++ MIN_MEMORY_BLOCK_SIZE * sections_per_block); + + if (ret) + goto out; + + ret = count; + out: ++ unlock_device_hotplug(); + return ret; + } + +diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c +index bf5be0bfaf77..52c292d0908a 100644 +--- a/drivers/base/power/domain.c ++++ b/drivers/base/power/domain.c +@@ -467,6 +467,10 @@ static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on, + return -EAGAIN; + } + ++ /* Default to shallowest state. */ ++ if (!genpd->gov) ++ genpd->state_idx = 0; ++ + if (genpd->power_off) { + int ret; + +@@ -1686,6 +1690,8 @@ int pm_genpd_init(struct generic_pm_domain *genpd, + ret = genpd_set_default_power_state(genpd); + if (ret) + return ret; ++ } else if (!gov) { ++ pr_warn("%s : no governor for states\n", genpd->name); + } + + device_initialize(&genpd->dev); +diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c +index 3aaf6af3ec23..2158e130744e 100644 +--- a/drivers/block/amiflop.c ++++ b/drivers/block/amiflop.c +@@ -1701,11 +1701,41 @@ static const struct block_device_operations floppy_fops = { + .check_events = amiga_check_events, + }; + ++static struct gendisk *fd_alloc_disk(int drive) ++{ ++ struct gendisk *disk; ++ ++ disk = alloc_disk(1); ++ if (!disk) ++ goto out; ++ ++ disk->queue = blk_init_queue(do_fd_request, &amiflop_lock); ++ if (IS_ERR(disk->queue)) { ++ disk->queue = NULL; ++ goto out_put_disk; ++ } ++ ++ unit[drive].trackbuf = kmalloc(FLOPPY_MAX_SECTORS * 512, GFP_KERNEL); ++ if (!unit[drive].trackbuf) ++ goto out_cleanup_queue; ++ ++ return disk; ++ ++out_cleanup_queue: ++ blk_cleanup_queue(disk->queue); ++ disk->queue = NULL; ++out_put_disk: ++ put_disk(disk); ++out: ++ unit[drive].type->code = FD_NODRIVE; ++ return NULL; ++} ++ + static int __init fd_probe_drives(void) + { + int drive,drives,nomem; + +- printk(KERN_INFO "FD: probing units\nfound "); ++ pr_info("FD: probing units\nfound"); + drives=0; + nomem=0; + for(drive=0;drive<FD_MAX_UNITS;drive++) { +@@ -1713,27 +1743,17 @@ static int __init fd_probe_drives(void) + fd_probe(drive); + if (unit[drive].type->code == FD_NODRIVE) + continue; +- disk = alloc_disk(1); ++ ++ disk = fd_alloc_disk(drive); + if (!disk) { +- unit[drive].type->code = FD_NODRIVE; ++ pr_cont(" no mem for fd%d", drive); ++ nomem = 1; + continue; + } + unit[drive].gendisk = disk; +- +- disk->queue = blk_init_queue(do_fd_request, &amiflop_lock); +- if (!disk->queue) { +- unit[drive].type->code = FD_NODRIVE; +- continue; +- } +- + drives++; +- if ((unit[drive].trackbuf = kmalloc(FLOPPY_MAX_SECTORS * 512, GFP_KERNEL)) == NULL) { +- printk("no mem for "); +- unit[drive].type = &drive_types[num_dr_types - 1]; /* FD_NODRIVE */ +- drives--; +- nomem = 1; +- } +- printk("fd%d ",drive); ++ ++ pr_cont(" fd%d",drive); + disk->major = FLOPPY_MAJOR; + disk->first_minor = drive; + disk->fops = &floppy_fops; +@@ -1744,11 +1764,11 @@ static int __init fd_probe_drives(void) + } + if ((drives > 0) || (nomem == 0)) { + if (drives == 0) +- printk("no drives"); +- printk("\n"); ++ pr_cont(" no drives"); ++ pr_cont("\n"); + return drives; + } +- printk("\n"); ++ pr_cont("\n"); + return -ENOMEM; + } + +@@ -1831,30 +1851,6 @@ out_blkdev: + return ret; + } + +-#if 0 /* not safe to unload */ +-static int __exit amiga_floppy_remove(struct platform_device *pdev) +-{ +- int i; +- +- for( i = 0; i < FD_MAX_UNITS; i++) { +- if (unit[i].type->code != FD_NODRIVE) { +- struct request_queue *q = unit[i].gendisk->queue; +- del_gendisk(unit[i].gendisk); +- put_disk(unit[i].gendisk); +- kfree(unit[i].trackbuf); +- if (q) +- blk_cleanup_queue(q); +- } +- } +- blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256); +- free_irq(IRQ_AMIGA_CIAA_TB, NULL); +- free_irq(IRQ_AMIGA_DSKBLK, NULL); +- custom.dmacon = DMAF_DISK; /* disable DMA */ +- amiga_chip_free(raw_buf); +- unregister_blkdev(FLOPPY_MAJOR, "fd"); +-} +-#endif +- + static struct platform_driver amiga_floppy_driver = { + .driver = { + .name = "amiga-floppy", +diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c +index 867841c56a6d..996b1ef5f076 100644 +--- a/drivers/block/nbd.c ++++ b/drivers/block/nbd.c +@@ -945,6 +945,7 @@ static struct socket *nbd_get_socket(struct nbd_device *nbd, unsigned long fd, + if (sock->ops->shutdown == sock_no_shutdown) { + dev_err(disk_to_dev(nbd->disk), "Unsupported socket: shutdown callout must be supported.\n"); + *err = -EINVAL; ++ sockfd_put(sock); + return NULL; + } + +@@ -983,14 +984,15 @@ static int nbd_add_socket(struct nbd_device *nbd, unsigned long arg, + sockfd_put(sock); + return -ENOMEM; + } ++ ++ config->socks = socks; ++ + nsock = kzalloc(sizeof(struct nbd_sock), GFP_KERNEL); + if (!nsock) { + sockfd_put(sock); + return -ENOMEM; + } + +- config->socks = socks; +- + nsock->fallback_index = -1; + nsock->dead = false; + mutex_init(&nsock->tx_lock); +diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c +index 87b9e7fbf062..27323fa23997 100644 +--- a/drivers/block/skd_main.c ++++ b/drivers/block/skd_main.c +@@ -1416,7 +1416,7 @@ static void skd_resolve_req_exception(struct skd_device *skdev, + + case SKD_CHECK_STATUS_BUSY_IMMINENT: + skd_log_skreq(skdev, skreq, "retry(busy)"); +- blk_requeue_request(skdev->queue, req); ++ blk_mq_requeue_request(req, true); + dev_info(&skdev->pdev->dev, "drive BUSY imminent\n"); + skdev->state = SKD_DRVR_STATE_BUSY_IMMINENT; + skdev->timer_countdown = SKD_TIMER_MINUTES(20); +@@ -1426,7 +1426,7 @@ static void skd_resolve_req_exception(struct skd_device *skdev, + case SKD_CHECK_STATUS_REQUEUE_REQUEST: + if ((unsigned long) ++req->special < SKD_MAX_RETRIES) { + skd_log_skreq(skdev, skreq, "retry"); +- blk_requeue_request(skdev->queue, req); ++ blk_mq_requeue_request(req, true); + break; + } + /* fall through */ +diff --git a/drivers/bluetooth/hci_bcsp.c b/drivers/bluetooth/hci_bcsp.c +index 66fe1e6dc631..27829273f3c9 100644 +--- a/drivers/bluetooth/hci_bcsp.c ++++ b/drivers/bluetooth/hci_bcsp.c +@@ -606,6 +606,7 @@ static int bcsp_recv(struct hci_uart *hu, const void *data, int count) + if (*ptr == 0xc0) { + BT_ERR("Short BCSP packet"); + kfree_skb(bcsp->rx_skb); ++ bcsp->rx_skb = NULL; + bcsp->rx_state = BCSP_W4_PKT_START; + bcsp->rx_count = 0; + } else +@@ -621,6 +622,7 @@ static int bcsp_recv(struct hci_uart *hu, const void *data, int count) + bcsp->rx_skb->data[2])) != bcsp->rx_skb->data[3]) { + BT_ERR("Error in BCSP hdr checksum"); + kfree_skb(bcsp->rx_skb); ++ bcsp->rx_skb = NULL; + bcsp->rx_state = BCSP_W4_PKT_DELIMITER; + bcsp->rx_count = 0; + continue; +@@ -645,6 +647,7 @@ static int bcsp_recv(struct hci_uart *hu, const void *data, int count) + bscp_get_crc(bcsp)); + + kfree_skb(bcsp->rx_skb); ++ bcsp->rx_skb = NULL; + bcsp->rx_state = BCSP_W4_PKT_DELIMITER; + bcsp->rx_count = 0; + continue; +diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c +index 27a82a559ab9..933268b8d6a5 100644 +--- a/drivers/cdrom/cdrom.c ++++ b/drivers/cdrom/cdrom.c +@@ -411,10 +411,10 @@ static int cdrom_get_disc_info(struct cdrom_device_info *cdi, + * hack to have the capability flags defined const, while we can still + * change it here without gcc complaining at every line. + */ +-#define ENSURE(call, bits) \ +-do { \ +- if (cdo->call == NULL) \ +- *change_capability &= ~(bits); \ ++#define ENSURE(cdo, call, bits) \ ++do { \ ++ if (cdo->call == NULL) \ ++ WARN_ON_ONCE((cdo)->capability & (bits)); \ + } while (0) + + /* +@@ -590,7 +590,6 @@ int register_cdrom(struct cdrom_device_info *cdi) + { + static char banner_printed; + const struct cdrom_device_ops *cdo = cdi->ops; +- int *change_capability = (int *)&cdo->capability; /* hack */ + + cd_dbg(CD_OPEN, "entering register_cdrom\n"); + +@@ -602,16 +601,16 @@ int register_cdrom(struct cdrom_device_info *cdi) + cdrom_sysctl_register(); + } + +- ENSURE(drive_status, CDC_DRIVE_STATUS); ++ ENSURE(cdo, drive_status, CDC_DRIVE_STATUS); + if (cdo->check_events == NULL && cdo->media_changed == NULL) +- *change_capability = ~(CDC_MEDIA_CHANGED | CDC_SELECT_DISC); +- ENSURE(tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY); +- ENSURE(lock_door, CDC_LOCK); +- ENSURE(select_speed, CDC_SELECT_SPEED); +- ENSURE(get_last_session, CDC_MULTI_SESSION); +- ENSURE(get_mcn, CDC_MCN); +- ENSURE(reset, CDC_RESET); +- ENSURE(generic_packet, CDC_GENERIC_PACKET); ++ WARN_ON_ONCE(cdo->capability & (CDC_MEDIA_CHANGED | CDC_SELECT_DISC)); ++ ENSURE(cdo, tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY); ++ ENSURE(cdo, lock_door, CDC_LOCK); ++ ENSURE(cdo, select_speed, CDC_SELECT_SPEED); ++ ENSURE(cdo, get_last_session, CDC_MULTI_SESSION); ++ ENSURE(cdo, get_mcn, CDC_MCN); ++ ENSURE(cdo, reset, CDC_RESET); ++ ENSURE(cdo, generic_packet, CDC_GENERIC_PACKET); + cdi->mc_flags = 0; + cdi->options = CDO_USE_FFLAGS; + +diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c +index c55f6aeb4227..b353a5e5f8b1 100644 +--- a/drivers/char/virtio_console.c ++++ b/drivers/char/virtio_console.c +@@ -1349,24 +1349,24 @@ static void set_console_size(struct port *port, u16 rows, u16 cols) + port->cons.ws.ws_col = cols; + } + +-static unsigned int fill_queue(struct virtqueue *vq, spinlock_t *lock) ++static int fill_queue(struct virtqueue *vq, spinlock_t *lock) + { + struct port_buffer *buf; +- unsigned int nr_added_bufs; ++ int nr_added_bufs; + int ret; + + nr_added_bufs = 0; + do { + buf = alloc_buf(vq->vdev, PAGE_SIZE, 0); + if (!buf) +- break; ++ return -ENOMEM; + + spin_lock_irq(lock); + ret = add_inbuf(vq, buf); + if (ret < 0) { + spin_unlock_irq(lock); + free_buf(buf, true); +- break; ++ return ret; + } + nr_added_bufs++; + spin_unlock_irq(lock); +@@ -1386,7 +1386,6 @@ static int add_port(struct ports_device *portdev, u32 id) + char debugfs_name[16]; + struct port *port; + dev_t devt; +- unsigned int nr_added_bufs; + int err; + + port = kmalloc(sizeof(*port), GFP_KERNEL); +@@ -1445,11 +1444,13 @@ static int add_port(struct ports_device *portdev, u32 id) + spin_lock_init(&port->outvq_lock); + init_waitqueue_head(&port->waitqueue); + +- /* Fill the in_vq with buffers so the host can send us data. */ +- nr_added_bufs = fill_queue(port->in_vq, &port->inbuf_lock); +- if (!nr_added_bufs) { ++ /* We can safely ignore ENOSPC because it means ++ * the queue already has buffers. Buffers are removed ++ * only by virtcons_remove(), not by unplug_port() ++ */ ++ err = fill_queue(port->in_vq, &port->inbuf_lock); ++ if (err < 0 && err != -ENOSPC) { + dev_err(port->dev, "Error allocating inbufs\n"); +- err = -ENOMEM; + goto free_device; + } + +@@ -2083,14 +2084,11 @@ static int virtcons_probe(struct virtio_device *vdev) + INIT_WORK(&portdev->control_work, &control_work_handler); + + if (multiport) { +- unsigned int nr_added_bufs; +- + spin_lock_init(&portdev->c_ivq_lock); + spin_lock_init(&portdev->c_ovq_lock); + +- nr_added_bufs = fill_queue(portdev->c_ivq, +- &portdev->c_ivq_lock); +- if (!nr_added_bufs) { ++ err = fill_queue(portdev->c_ivq, &portdev->c_ivq_lock); ++ if (err < 0) { + dev_err(&vdev->dev, + "Error allocating buffers for control queue\n"); + /* +@@ -2101,7 +2099,7 @@ static int virtcons_probe(struct virtio_device *vdev) + VIRTIO_CONSOLE_DEVICE_READY, 0); + /* Device was functional: we need full cleanup. */ + virtcons_remove(vdev); +- return -ENOMEM; ++ return err; + } + } else { + /* +diff --git a/drivers/clk/at91/clk-audio-pll.c b/drivers/clk/at91/clk-audio-pll.c +index da7bafcfbe70..b3eaf654fac9 100644 +--- a/drivers/clk/at91/clk-audio-pll.c ++++ b/drivers/clk/at91/clk-audio-pll.c +@@ -509,7 +509,7 @@ static void __init of_sama5d2_clk_audio_pll_pad_setup(struct device_node *np) + + static void __init of_sama5d2_clk_audio_pll_pmc_setup(struct device_node *np) + { +- struct clk_audio_pad *apmc_ck; ++ struct clk_audio_pmc *apmc_ck; + struct clk_init_data init = {}; + + apmc_ck = kzalloc(sizeof(*apmc_ck), GFP_KERNEL); +diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c +index 0fc75c395957..d083b860f083 100644 +--- a/drivers/clk/mmp/clk-of-mmp2.c ++++ b/drivers/clk/mmp/clk-of-mmp2.c +@@ -227,8 +227,8 @@ static struct mmp_param_gate_clk apmu_gate_clks[] = { + /* The gate clocks has mux parent. */ + {MMP2_CLK_SDH0, "sdh0_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH0, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, + {MMP2_CLK_SDH1, "sdh1_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH1, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, +- {MMP2_CLK_SDH1, "sdh2_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH2, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, +- {MMP2_CLK_SDH1, "sdh3_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH3, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, ++ {MMP2_CLK_SDH2, "sdh2_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH2, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, ++ {MMP2_CLK_SDH3, "sdh3_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH3, 0x1b, 0x1b, 0x0, 0, &sdh_lock}, + {MMP2_CLK_DISP0, "disp0_clk", "disp0_div", CLK_SET_RATE_PARENT, APMU_DISP0, 0x1b, 0x1b, 0x0, 0, &disp0_lock}, + {MMP2_CLK_DISP0_SPHY, "disp0_sphy_clk", "disp0_sphy_div", CLK_SET_RATE_PARENT, APMU_DISP0, 0x1024, 0x1024, 0x0, 0, &disp0_lock}, + {MMP2_CLK_DISP1, "disp1_clk", "disp1_div", CLK_SET_RATE_PARENT, APMU_DISP1, 0x1b, 0x1b, 0x0, 0, &disp1_lock}, +diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c +index ee9c12cf3f08..2a6098179921 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c ++++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c +@@ -158,7 +158,12 @@ static SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(pll_gpu_clk, "pll-gpu", + #define SUN50I_A64_PLL_MIPI_REG 0x040 + + static struct ccu_nkm pll_mipi_clk = { +- .enable = BIT(31), ++ /* ++ * The bit 23 and 22 are called "LDO{1,2}_EN" on the SoC's ++ * user manual, and by experiments the PLL doesn't work without ++ * these bits toggled. ++ */ ++ .enable = BIT(31) | BIT(23) | BIT(22), + .lock = BIT(28), + .n = _SUNXI_CCU_MULT(8, 4), + .k = _SUNXI_CCU_MULT_MIN(4, 2, 2), +diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c +index cc857d4d4a86..68551effb5ca 100644 +--- a/drivers/clk/tegra/clk-tegra20.c ++++ b/drivers/clk/tegra/clk-tegra20.c +@@ -578,7 +578,6 @@ static struct tegra_clk tegra20_clks[tegra_clk_max] __initdata = { + [tegra_clk_afi] = { .dt_id = TEGRA20_CLK_AFI, .present = true }, + [tegra_clk_fuse] = { .dt_id = TEGRA20_CLK_FUSE, .present = true }, + [tegra_clk_kfuse] = { .dt_id = TEGRA20_CLK_KFUSE, .present = true }, +- [tegra_clk_emc] = { .dt_id = TEGRA20_CLK_EMC, .present = true }, + }; + + static unsigned long tegra20_clk_measure_input_freq(void) +@@ -799,6 +798,31 @@ static struct tegra_periph_init_data tegra_periph_nodiv_clk_list[] = { + TEGRA_INIT_DATA_NODIV("disp2", mux_pllpdc_clkm, CLK_SOURCE_DISP2, 30, 2, 26, 0, TEGRA20_CLK_DISP2), + }; + ++static void __init tegra20_emc_clk_init(void) ++{ ++ struct clk *clk; ++ ++ clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, ++ ARRAY_SIZE(mux_pllmcp_clkm), ++ CLK_SET_RATE_NO_REPARENT, ++ clk_base + CLK_SOURCE_EMC, ++ 30, 2, 0, &emc_lock); ++ ++ clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, ++ &emc_lock); ++ clks[TEGRA20_CLK_MC] = clk; ++ ++ /* ++ * Note that 'emc_mux' source and 'emc' rate shouldn't be changed at ++ * the same time due to a HW bug, this won't happen because we're ++ * defining 'emc_mux' and 'emc' as distinct clocks. ++ */ ++ clk = tegra_clk_register_divider("emc", "emc_mux", ++ clk_base + CLK_SOURCE_EMC, CLK_IS_CRITICAL, ++ TEGRA_DIVIDER_INT, 0, 8, 1, &emc_lock); ++ clks[TEGRA20_CLK_EMC] = clk; ++} ++ + static void __init tegra20_periph_clk_init(void) + { + struct tegra_periph_init_data *data; +@@ -812,15 +836,7 @@ static void __init tegra20_periph_clk_init(void) + clks[TEGRA20_CLK_AC97] = clk; + + /* emc */ +- clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm, +- ARRAY_SIZE(mux_pllmcp_clkm), +- CLK_SET_RATE_NO_REPARENT, +- clk_base + CLK_SOURCE_EMC, +- 30, 2, 0, &emc_lock); +- +- clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC, +- &emc_lock); +- clks[TEGRA20_CLK_MC] = clk; ++ tegra20_emc_clk_init(); + + /* dsi */ + clk = tegra_clk_register_periph_gate("dsi", "pll_d", 0, clk_base, 0, +diff --git a/drivers/clk/tegra/clk-tegra210.c b/drivers/clk/tegra/clk-tegra210.c +index 080bfa24863e..7264e9731034 100644 +--- a/drivers/clk/tegra/clk-tegra210.c ++++ b/drivers/clk/tegra/clk-tegra210.c +@@ -2603,7 +2603,7 @@ static struct tegra210_domain_mbist_war tegra210_pg_mbist_war[] = { + [TEGRA_POWERGATE_MPE] = { + .handle_lvl2_ovr = tegra210_generic_mbist_war, + .lvl2_offset = LVL2_CLK_GATE_OVRE, +- .lvl2_mask = BIT(2), ++ .lvl2_mask = BIT(29), + }, + [TEGRA_POWERGATE_SOR] = { + .handle_lvl2_ovr = tegra210_generic_mbist_war, +@@ -2654,14 +2654,14 @@ static struct tegra210_domain_mbist_war tegra210_pg_mbist_war[] = { + .num_clks = ARRAY_SIZE(nvdec_slcg_clkids), + .clk_init_data = nvdec_slcg_clkids, + .handle_lvl2_ovr = tegra210_generic_mbist_war, +- .lvl2_offset = LVL2_CLK_GATE_OVRC, ++ .lvl2_offset = LVL2_CLK_GATE_OVRE, + .lvl2_mask = BIT(9) | BIT(31), + }, + [TEGRA_POWERGATE_NVJPG] = { + .num_clks = ARRAY_SIZE(nvjpg_slcg_clkids), + .clk_init_data = nvjpg_slcg_clkids, + .handle_lvl2_ovr = tegra210_generic_mbist_war, +- .lvl2_offset = LVL2_CLK_GATE_OVRC, ++ .lvl2_offset = LVL2_CLK_GATE_OVRE, + .lvl2_mask = BIT(9) | BIT(31), + }, + [TEGRA_POWERGATE_AUD] = { +diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c +index ace5ec65e36f..9d8d64f706e0 100644 +--- a/drivers/cpufreq/cpufreq.c ++++ b/drivers/cpufreq/cpufreq.c +@@ -909,6 +909,9 @@ static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf) + struct freq_attr *fattr = to_attr(attr); + ssize_t ret; + ++ if (!fattr->show) ++ return -EIO; ++ + down_read(&policy->rwsem); + ret = fattr->show(policy, buf); + up_read(&policy->rwsem); +@@ -923,6 +926,9 @@ static ssize_t store(struct kobject *kobj, struct attribute *attr, + struct freq_attr *fattr = to_attr(attr); + ssize_t ret = -EINVAL; + ++ if (!fattr->store) ++ return -EIO; ++ + /* + * cpus_read_trylock() is used here to work around a circular lock + * dependency problem with respect to the cpufreq_register_driver(). +diff --git a/drivers/crypto/ccree/cc_hw_queue_defs.h b/drivers/crypto/ccree/cc_hw_queue_defs.h +index a091ae57f902..45985b955d2c 100644 +--- a/drivers/crypto/ccree/cc_hw_queue_defs.h ++++ b/drivers/crypto/ccree/cc_hw_queue_defs.h +@@ -449,8 +449,7 @@ static inline void set_flow_mode(struct cc_hw_desc *pdesc, + * @pdesc: pointer HW descriptor struct + * @mode: Any one of the modes defined in [CC7x-DESC] + */ +-static inline void set_cipher_mode(struct cc_hw_desc *pdesc, +- enum drv_cipher_mode mode) ++static inline void set_cipher_mode(struct cc_hw_desc *pdesc, int mode) + { + pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_MODE, mode); + } +@@ -461,8 +460,7 @@ static inline void set_cipher_mode(struct cc_hw_desc *pdesc, + * @pdesc: pointer HW descriptor struct + * @mode: Any one of the modes defined in [CC7x-DESC] + */ +-static inline void set_cipher_config0(struct cc_hw_desc *pdesc, +- enum drv_crypto_direction mode) ++static inline void set_cipher_config0(struct cc_hw_desc *pdesc, int mode) + { + pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_CONF0, mode); + } +diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c +index e2ab46bfa666..d350253d161a 100644 +--- a/drivers/devfreq/devfreq.c ++++ b/drivers/devfreq/devfreq.c +@@ -257,7 +257,7 @@ static struct devfreq_governor *try_then_request_governor(const char *name) + /* Restore previous state before return */ + mutex_lock(&devfreq_list_lock); + if (err) +- return ERR_PTR(err); ++ return (err < 0) ? ERR_PTR(err) : ERR_PTR(-EINVAL); + + governor = find_devfreq_governor(name); + } +diff --git a/drivers/edac/thunderx_edac.c b/drivers/edac/thunderx_edac.c +index c009d94f40c5..34be60fe6892 100644 +--- a/drivers/edac/thunderx_edac.c ++++ b/drivers/edac/thunderx_edac.c +@@ -1884,7 +1884,7 @@ static irqreturn_t thunderx_l2c_threaded_isr(int irq, void *irq_id) + default: + dev_err(&l2c->pdev->dev, "Unsupported device: %04x\n", + l2c->pdev->device); +- return IRQ_NONE; ++ goto err_free; + } + + while (CIRC_CNT(l2c->ring_head, l2c->ring_tail, +@@ -1906,7 +1906,7 @@ static irqreturn_t thunderx_l2c_threaded_isr(int irq, void *irq_id) + l2c->ring_tail++; + } + +- return IRQ_HANDLED; ++ ret = IRQ_HANDLED; + + err_free: + kfree(other); +diff --git a/drivers/firmware/google/gsmi.c b/drivers/firmware/google/gsmi.c +index c8f169bf2e27..62337be07afc 100644 +--- a/drivers/firmware/google/gsmi.c ++++ b/drivers/firmware/google/gsmi.c +@@ -480,11 +480,10 @@ static ssize_t eventlog_write(struct file *filp, struct kobject *kobj, + if (count < sizeof(u32)) + return -EINVAL; + param.type = *(u32 *)buf; +- count -= sizeof(u32); + buf += sizeof(u32); + + /* The remaining buffer is the data payload */ +- if (count > gsmi_dev.data_buf->length) ++ if ((count - sizeof(u32)) > gsmi_dev.data_buf->length) + return -EINVAL; + param.data_len = count - sizeof(u32); + +@@ -504,7 +503,7 @@ static ssize_t eventlog_write(struct file *filp, struct kobject *kobj, + + spin_unlock_irqrestore(&gsmi_dev.lock, flags); + +- return rc; ++ return (rc == 0) ? count : rc; + + } + +diff --git a/drivers/gpio/gpio-max77620.c b/drivers/gpio/gpio-max77620.c +index ac6c1c0548b6..78254ed93206 100644 +--- a/drivers/gpio/gpio-max77620.c ++++ b/drivers/gpio/gpio-max77620.c +@@ -163,13 +163,13 @@ static int max77620_gpio_set_debounce(struct max77620_gpio *mgpio, + case 0: + val = MAX77620_CNFG_GPIO_DBNC_None; + break; +- case 1000 ... 8000: ++ case 1 ... 8000: + val = MAX77620_CNFG_GPIO_DBNC_8ms; + break; +- case 9000 ... 16000: ++ case 8001 ... 16000: + val = MAX77620_CNFG_GPIO_DBNC_16ms; + break; +- case 17000 ... 32000: ++ case 16001 ... 32000: + val = MAX77620_CNFG_GPIO_DBNC_32ms; + break; + default: +diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +index c7c505095402..6bf032e81e39 100644 +--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c ++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +@@ -3472,18 +3472,31 @@ static int smu7_get_pp_table_entry(struct pp_hwmgr *hwmgr, + + static int smu7_get_gpu_power(struct pp_hwmgr *hwmgr, u32 *query) + { ++ struct amdgpu_device *adev = hwmgr->adev; + int i; + u32 tmp = 0; + + if (!query) + return -EINVAL; + +- smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetCurrPkgPwr, 0); +- tmp = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0); +- *query = tmp; ++ /* ++ * PPSMC_MSG_GetCurrPkgPwr is not supported on: ++ * - Hawaii ++ * - Bonaire ++ * - Fiji ++ * - Tonga ++ */ ++ if ((adev->asic_type != CHIP_HAWAII) && ++ (adev->asic_type != CHIP_BONAIRE) && ++ (adev->asic_type != CHIP_FIJI) && ++ (adev->asic_type != CHIP_TONGA)) { ++ smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetCurrPkgPwr, 0); ++ tmp = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0); ++ *query = tmp; + +- if (tmp != 0) +- return 0; ++ if (tmp != 0) ++ return 0; ++ } + + smum_send_msg_to_smc(hwmgr, PPSMC_MSG_PmStatusLogStart); + cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, +diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c +index 2c9b284036d1..961abb6ea18e 100644 +--- a/drivers/gpu/drm/i915/i915_gem_userptr.c ++++ b/drivers/gpu/drm/i915/i915_gem_userptr.c +@@ -691,8 +691,28 @@ i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj, + i915_gem_gtt_finish_pages(obj, pages); + + for_each_sgt_page(page, sgt_iter, pages) { +- if (obj->mm.dirty) ++ if (obj->mm.dirty && trylock_page(page)) { ++ /* ++ * As this may not be anonymous memory (e.g. shmem) ++ * but exist on a real mapping, we have to lock ++ * the page in order to dirty it -- holding ++ * the page reference is not sufficient to ++ * prevent the inode from being truncated. ++ * Play safe and take the lock. ++ * ++ * However...! ++ * ++ * The mmu-notifier can be invalidated for a ++ * migrate_page, that is alreadying holding the lock ++ * on the page. Such a try_to_unmap() will result ++ * in us calling put_pages() and so recursively try ++ * to lock the page. We avoid that deadlock with ++ * a trylock_page() and in exchange we risk missing ++ * some page dirtying. ++ */ + set_page_dirty(page); ++ unlock_page(page); ++ } + + mark_page_accessed(page); + put_page(page); +diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c +index d6c8f8fdfda5..b7fda69342fc 100644 +--- a/drivers/gpu/drm/i915/i915_pmu.c ++++ b/drivers/gpu/drm/i915/i915_pmu.c +@@ -827,8 +827,8 @@ create_event_attributes(struct drm_i915_private *i915) + const char *name; + const char *unit; + } events[] = { +- __event(I915_PMU_ACTUAL_FREQUENCY, "actual-frequency", "MHz"), +- __event(I915_PMU_REQUESTED_FREQUENCY, "requested-frequency", "MHz"), ++ __event(I915_PMU_ACTUAL_FREQUENCY, "actual-frequency", "M"), ++ __event(I915_PMU_REQUESTED_FREQUENCY, "requested-frequency", "M"), + __event(I915_PMU_INTERRUPTS, "interrupts", NULL), + __event(I915_PMU_RC6_RESIDENCY, "rc6-residency", "ns"), + }; +diff --git a/drivers/i2c/busses/i2c-uniphier-f.c b/drivers/i2c/busses/i2c-uniphier-f.c +index bc26ec822e26..dd0687e36a47 100644 +--- a/drivers/i2c/busses/i2c-uniphier-f.c ++++ b/drivers/i2c/busses/i2c-uniphier-f.c +@@ -98,6 +98,7 @@ struct uniphier_fi2c_priv { + unsigned int flags; + unsigned int busy_cnt; + unsigned int clk_cycle; ++ spinlock_t lock; /* IRQ synchronization */ + }; + + static void uniphier_fi2c_fill_txfifo(struct uniphier_fi2c_priv *priv, +@@ -142,9 +143,10 @@ static void uniphier_fi2c_set_irqs(struct uniphier_fi2c_priv *priv) + writel(priv->enabled_irqs, priv->membase + UNIPHIER_FI2C_IE); + } + +-static void uniphier_fi2c_clear_irqs(struct uniphier_fi2c_priv *priv) ++static void uniphier_fi2c_clear_irqs(struct uniphier_fi2c_priv *priv, ++ u32 mask) + { +- writel(-1, priv->membase + UNIPHIER_FI2C_IC); ++ writel(mask, priv->membase + UNIPHIER_FI2C_IC); + } + + static void uniphier_fi2c_stop(struct uniphier_fi2c_priv *priv) +@@ -162,7 +164,10 @@ static irqreturn_t uniphier_fi2c_interrupt(int irq, void *dev_id) + struct uniphier_fi2c_priv *priv = dev_id; + u32 irq_status; + ++ spin_lock(&priv->lock); ++ + irq_status = readl(priv->membase + UNIPHIER_FI2C_INT); ++ irq_status &= priv->enabled_irqs; + + dev_dbg(&priv->adap.dev, + "interrupt: enabled_irqs=%04x, irq_status=%04x\n", +@@ -207,7 +212,13 @@ static irqreturn_t uniphier_fi2c_interrupt(int irq, void *dev_id) + + if (irq_status & (UNIPHIER_FI2C_INT_RF | UNIPHIER_FI2C_INT_RB)) { + uniphier_fi2c_drain_rxfifo(priv); +- if (!priv->len) ++ /* ++ * If the number of bytes to read is multiple of the FIFO size ++ * (msg->len == 8, 16, 24, ...), the INT_RF bit is set a little ++ * earlier than INT_RB. We wait for INT_RB to confirm the ++ * completion of the current message. ++ */ ++ if (!priv->len && (irq_status & UNIPHIER_FI2C_INT_RB)) + goto data_done; + + if (unlikely(priv->flags & UNIPHIER_FI2C_MANUAL_NACK)) { +@@ -230,6 +241,8 @@ static irqreturn_t uniphier_fi2c_interrupt(int irq, void *dev_id) + goto handled; + } + ++ spin_unlock(&priv->lock); ++ + return IRQ_NONE; + + data_done: +@@ -244,7 +257,14 @@ complete: + } + + handled: +- uniphier_fi2c_clear_irqs(priv); ++ /* ++ * This controller makes a pause while any bit of the IRQ status is ++ * asserted. Clear the asserted bit to kick the controller just before ++ * exiting the handler. ++ */ ++ uniphier_fi2c_clear_irqs(priv, irq_status); ++ ++ spin_unlock(&priv->lock); + + return IRQ_HANDLED; + } +@@ -252,6 +272,8 @@ handled: + static void uniphier_fi2c_tx_init(struct uniphier_fi2c_priv *priv, u16 addr) + { + priv->enabled_irqs |= UNIPHIER_FI2C_INT_TE; ++ uniphier_fi2c_set_irqs(priv); ++ + /* do not use TX byte counter */ + writel(0, priv->membase + UNIPHIER_FI2C_TBC); + /* set slave address */ +@@ -284,6 +306,8 @@ static void uniphier_fi2c_rx_init(struct uniphier_fi2c_priv *priv, u16 addr) + priv->enabled_irqs |= UNIPHIER_FI2C_INT_RF; + } + ++ uniphier_fi2c_set_irqs(priv); ++ + /* set slave address with RD bit */ + writel(UNIPHIER_FI2C_DTTX_CMD | UNIPHIER_FI2C_DTTX_RD | addr << 1, + priv->membase + UNIPHIER_FI2C_DTTX); +@@ -307,14 +331,16 @@ static void uniphier_fi2c_recover(struct uniphier_fi2c_priv *priv) + } + + static int uniphier_fi2c_master_xfer_one(struct i2c_adapter *adap, +- struct i2c_msg *msg, bool stop) ++ struct i2c_msg *msg, bool repeat, ++ bool stop) + { + struct uniphier_fi2c_priv *priv = i2c_get_adapdata(adap); + bool is_read = msg->flags & I2C_M_RD; +- unsigned long time_left; ++ unsigned long time_left, flags; + +- dev_dbg(&adap->dev, "%s: addr=0x%02x, len=%d, stop=%d\n", +- is_read ? "receive" : "transmit", msg->addr, msg->len, stop); ++ dev_dbg(&adap->dev, "%s: addr=0x%02x, len=%d, repeat=%d, stop=%d\n", ++ is_read ? "receive" : "transmit", msg->addr, msg->len, ++ repeat, stop); + + priv->len = msg->len; + priv->buf = msg->buf; +@@ -326,22 +352,36 @@ static int uniphier_fi2c_master_xfer_one(struct i2c_adapter *adap, + priv->flags |= UNIPHIER_FI2C_STOP; + + reinit_completion(&priv->comp); +- uniphier_fi2c_clear_irqs(priv); ++ uniphier_fi2c_clear_irqs(priv, U32_MAX); + writel(UNIPHIER_FI2C_RST_TBRST | UNIPHIER_FI2C_RST_RBRST, + priv->membase + UNIPHIER_FI2C_RST); /* reset TX/RX FIFO */ + ++ spin_lock_irqsave(&priv->lock, flags); ++ + if (is_read) + uniphier_fi2c_rx_init(priv, msg->addr); + else + uniphier_fi2c_tx_init(priv, msg->addr); + +- uniphier_fi2c_set_irqs(priv); +- + dev_dbg(&adap->dev, "start condition\n"); +- writel(UNIPHIER_FI2C_CR_MST | UNIPHIER_FI2C_CR_STA, +- priv->membase + UNIPHIER_FI2C_CR); ++ /* ++ * For a repeated START condition, writing a slave address to the FIFO ++ * kicks the controller. So, the UNIPHIER_FI2C_CR register should be ++ * written only for a non-repeated START condition. ++ */ ++ if (!repeat) ++ writel(UNIPHIER_FI2C_CR_MST | UNIPHIER_FI2C_CR_STA, ++ priv->membase + UNIPHIER_FI2C_CR); ++ ++ spin_unlock_irqrestore(&priv->lock, flags); + + time_left = wait_for_completion_timeout(&priv->comp, adap->timeout); ++ ++ spin_lock_irqsave(&priv->lock, flags); ++ priv->enabled_irqs = 0; ++ uniphier_fi2c_set_irqs(priv); ++ spin_unlock_irqrestore(&priv->lock, flags); ++ + if (!time_left) { + dev_err(&adap->dev, "transaction timeout.\n"); + uniphier_fi2c_recover(priv); +@@ -394,6 +434,7 @@ static int uniphier_fi2c_master_xfer(struct i2c_adapter *adap, + struct i2c_msg *msgs, int num) + { + struct i2c_msg *msg, *emsg = msgs + num; ++ bool repeat = false; + int ret; + + ret = uniphier_fi2c_check_bus_busy(adap); +@@ -404,9 +445,11 @@ static int uniphier_fi2c_master_xfer(struct i2c_adapter *adap, + /* Emit STOP if it is the last message or I2C_M_STOP is set. */ + bool stop = (msg + 1 == emsg) || (msg->flags & I2C_M_STOP); + +- ret = uniphier_fi2c_master_xfer_one(adap, msg, stop); ++ ret = uniphier_fi2c_master_xfer_one(adap, msg, repeat, stop); + if (ret) + return ret; ++ ++ repeat = !stop; + } + + return num; +@@ -546,6 +589,7 @@ static int uniphier_fi2c_probe(struct platform_device *pdev) + + priv->clk_cycle = clk_rate / bus_speed; + init_completion(&priv->comp); ++ spin_lock_init(&priv->lock); + priv->adap.owner = THIS_MODULE; + priv->adap.algo = &uniphier_fi2c_algo; + priv->adap.dev.parent = dev; +diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h +index 96f76896488d..802942adea8e 100644 +--- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h ++++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h +@@ -120,6 +120,8 @@ struct bnxt_re_dev { + #define BNXT_RE_FLAG_HAVE_L2_REF 3 + #define BNXT_RE_FLAG_RCFW_CHANNEL_EN 4 + #define BNXT_RE_FLAG_QOS_WORK_REG 5 ++#define BNXT_RE_FLAG_RESOURCES_ALLOCATED 7 ++#define BNXT_RE_FLAG_RESOURCES_INITIALIZED 8 + #define BNXT_RE_FLAG_ISSUE_ROCE_STATS 29 + struct net_device *netdev; + unsigned int version, major, minor; +diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c +index 22bd9784fa2e..589b0d4677d5 100644 +--- a/drivers/infiniband/hw/bnxt_re/main.c ++++ b/drivers/infiniband/hw/bnxt_re/main.c +@@ -864,10 +864,8 @@ static void bnxt_re_cleanup_res(struct bnxt_re_dev *rdev) + { + int i; + +- if (rdev->nq[0].hwq.max_elements) { +- for (i = 1; i < rdev->num_msix; i++) +- bnxt_qplib_disable_nq(&rdev->nq[i - 1]); +- } ++ for (i = 1; i < rdev->num_msix; i++) ++ bnxt_qplib_disable_nq(&rdev->nq[i - 1]); + + if (rdev->qplib_res.rcfw) + bnxt_qplib_cleanup_res(&rdev->qplib_res); +@@ -876,6 +874,7 @@ static void bnxt_re_cleanup_res(struct bnxt_re_dev *rdev) + static int bnxt_re_init_res(struct bnxt_re_dev *rdev) + { + int rc = 0, i; ++ int num_vec_enabled = 0; + + bnxt_qplib_init_res(&rdev->qplib_res); + +@@ -891,9 +890,13 @@ static int bnxt_re_init_res(struct bnxt_re_dev *rdev) + "Failed to enable NQ with rc = 0x%x", rc); + goto fail; + } ++ num_vec_enabled++; + } + return 0; + fail: ++ for (i = num_vec_enabled; i >= 0; i--) ++ bnxt_qplib_disable_nq(&rdev->nq[i]); ++ + return rc; + } + +@@ -925,6 +928,7 @@ static void bnxt_re_free_res(struct bnxt_re_dev *rdev) + static int bnxt_re_alloc_res(struct bnxt_re_dev *rdev) + { + int rc = 0, i; ++ int num_vec_created = 0; + + /* Configure and allocate resources for qplib */ + rdev->qplib_res.rcfw = &rdev->rcfw; +@@ -951,7 +955,7 @@ static int bnxt_re_alloc_res(struct bnxt_re_dev *rdev) + if (rc) { + dev_err(rdev_to_dev(rdev), "Alloc Failed NQ%d rc:%#x", + i, rc); +- goto dealloc_dpi; ++ goto free_nq; + } + rc = bnxt_re_net_ring_alloc + (rdev, rdev->nq[i].hwq.pbl[PBL_LVL_0].pg_map_arr, +@@ -964,14 +968,17 @@ static int bnxt_re_alloc_res(struct bnxt_re_dev *rdev) + dev_err(rdev_to_dev(rdev), + "Failed to allocate NQ fw id with rc = 0x%x", + rc); ++ bnxt_qplib_free_nq(&rdev->nq[i]); + goto free_nq; + } ++ num_vec_created++; + } + return 0; + free_nq: +- for (i = 0; i < rdev->num_msix - 1; i++) ++ for (i = num_vec_created; i >= 0; i--) { ++ bnxt_re_net_ring_free(rdev, rdev->nq[i].ring_id); + bnxt_qplib_free_nq(&rdev->nq[i]); +-dealloc_dpi: ++ } + bnxt_qplib_dealloc_dpi(&rdev->qplib_res, + &rdev->qplib_res.dpi_tbl, + &rdev->dpi_privileged); +@@ -989,12 +996,17 @@ static void bnxt_re_dispatch_event(struct ib_device *ibdev, struct ib_qp *qp, + struct ib_event ib_event; + + ib_event.device = ibdev; +- if (qp) ++ if (qp) { + ib_event.element.qp = qp; +- else ++ ib_event.event = event; ++ if (qp->event_handler) ++ qp->event_handler(&ib_event, qp->qp_context); ++ ++ } else { + ib_event.element.port_num = port_num; +- ib_event.event = event; +- ib_dispatch_event(&ib_event); ++ ib_event.event = event; ++ ib_dispatch_event(&ib_event); ++ } + } + + #define HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_IVLAN 0x02 +@@ -1201,8 +1213,11 @@ static void bnxt_re_ib_unreg(struct bnxt_re_dev *rdev) + if (test_and_clear_bit(BNXT_RE_FLAG_QOS_WORK_REG, &rdev->flags)) + cancel_delayed_work(&rdev->worker); + +- bnxt_re_cleanup_res(rdev); +- bnxt_re_free_res(rdev); ++ if (test_and_clear_bit(BNXT_RE_FLAG_RESOURCES_INITIALIZED, ++ &rdev->flags)) ++ bnxt_re_cleanup_res(rdev); ++ if (test_and_clear_bit(BNXT_RE_FLAG_RESOURCES_ALLOCATED, &rdev->flags)) ++ bnxt_re_free_res(rdev); + + if (test_and_clear_bit(BNXT_RE_FLAG_RCFW_CHANNEL_EN, &rdev->flags)) { + rc = bnxt_qplib_deinit_rcfw(&rdev->rcfw); +@@ -1332,12 +1347,15 @@ static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev) + pr_err("Failed to allocate resources: %#x\n", rc); + goto fail; + } ++ set_bit(BNXT_RE_FLAG_RESOURCES_ALLOCATED, &rdev->flags); + rc = bnxt_re_init_res(rdev); + if (rc) { + pr_err("Failed to initialize resources: %#x\n", rc); + goto fail; + } + ++ set_bit(BNXT_RE_FLAG_RESOURCES_INITIALIZED, &rdev->flags); ++ + if (!rdev->is_virtfn) { + rc = bnxt_re_setup_qos(rdev); + if (rc) +diff --git a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c +index 6637df77d236..8b3b5fdc19bb 100644 +--- a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c ++++ b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c +@@ -614,13 +614,8 @@ void bnxt_qplib_disable_rcfw_channel(struct bnxt_qplib_rcfw *rcfw) + + bnxt_qplib_rcfw_stop_irq(rcfw, true); + +- if (rcfw->cmdq_bar_reg_iomem) +- iounmap(rcfw->cmdq_bar_reg_iomem); +- rcfw->cmdq_bar_reg_iomem = NULL; +- +- if (rcfw->creq_bar_reg_iomem) +- iounmap(rcfw->creq_bar_reg_iomem); +- rcfw->creq_bar_reg_iomem = NULL; ++ iounmap(rcfw->cmdq_bar_reg_iomem); ++ iounmap(rcfw->creq_bar_reg_iomem); + + indx = find_first_bit(rcfw->cmdq_bitmap, rcfw->bmap_size); + if (indx != rcfw->bmap_size) +@@ -629,6 +624,8 @@ void bnxt_qplib_disable_rcfw_channel(struct bnxt_qplib_rcfw *rcfw) + kfree(rcfw->cmdq_bitmap); + rcfw->bmap_size = 0; + ++ rcfw->cmdq_bar_reg_iomem = NULL; ++ rcfw->creq_bar_reg_iomem = NULL; + rcfw->aeq_handler = NULL; + rcfw->vector = 0; + } +@@ -714,6 +711,8 @@ int bnxt_qplib_enable_rcfw_channel(struct pci_dev *pdev, + dev_err(&rcfw->pdev->dev, + "QPLIB: CREQ BAR region %d mapping failed", + rcfw->creq_bar_reg); ++ iounmap(rcfw->cmdq_bar_reg_iomem); ++ rcfw->cmdq_bar_reg_iomem = NULL; + return -ENOMEM; + } + rcfw->creq_qp_event_processed = 0; +diff --git a/drivers/isdn/mISDN/tei.c b/drivers/isdn/mISDN/tei.c +index 12d9e5f4beb1..58635b5f296f 100644 +--- a/drivers/isdn/mISDN/tei.c ++++ b/drivers/isdn/mISDN/tei.c +@@ -1180,8 +1180,7 @@ static int + ctrl_teimanager(struct manager *mgr, void *arg) + { + /* currently we only have one option */ +- int *val = (int *)arg; +- int ret = 0; ++ unsigned int *val = (unsigned int *)arg; + + switch (val[0]) { + case IMCLEAR_L2: +@@ -1197,9 +1196,9 @@ ctrl_teimanager(struct manager *mgr, void *arg) + test_and_clear_bit(OPTION_L1_HOLD, &mgr->options); + break; + default: +- ret = -EINVAL; ++ return -EINVAL; + } +- return ret; ++ return 0; + } + + /* This function does create a L2 for fixed TEI in NT Mode */ +diff --git a/drivers/macintosh/windfarm_smu_sat.c b/drivers/macintosh/windfarm_smu_sat.c +index da7f4fc1a51d..a0f61eb853c5 100644 +--- a/drivers/macintosh/windfarm_smu_sat.c ++++ b/drivers/macintosh/windfarm_smu_sat.c +@@ -22,14 +22,6 @@ + + #define VERSION "1.0" + +-#define DEBUG +- +-#ifdef DEBUG +-#define DBG(args...) printk(args) +-#else +-#define DBG(args...) do { } while(0) +-#endif +- + /* If the cache is older than 800ms we'll refetch it */ + #define MAX_AGE msecs_to_jiffies(800) + +@@ -106,13 +98,10 @@ struct smu_sdbp_header *smu_sat_get_sdb_partition(unsigned int sat_id, int id, + buf[i+2] = data[3]; + buf[i+3] = data[2]; + } +-#ifdef DEBUG +- DBG(KERN_DEBUG "sat %d partition %x:", sat_id, id); +- for (i = 0; i < len; ++i) +- DBG(" %x", buf[i]); +- DBG("\n"); +-#endif + ++ printk(KERN_DEBUG "sat %d partition %x:", sat_id, id); ++ print_hex_dump(KERN_DEBUG, " ", DUMP_PREFIX_OFFSET, ++ 16, 1, buf, len, false); + if (size) + *size = len; + return (struct smu_sdbp_header *) buf; +@@ -132,13 +121,13 @@ static int wf_sat_read_cache(struct wf_sat *sat) + if (err < 0) + return err; + sat->last_read = jiffies; ++ + #ifdef LOTSA_DEBUG + { + int i; +- DBG(KERN_DEBUG "wf_sat_get: data is"); +- for (i = 0; i < 16; ++i) +- DBG(" %.2x", sat->cache[i]); +- DBG("\n"); ++ printk(KERN_DEBUG "wf_sat_get: data is"); ++ print_hex_dump(KERN_DEBUG, " ", DUMP_PREFIX_OFFSET, ++ 16, 1, sat->cache, 16, false); + } + #endif + return 0; +diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c +index b78a8a4d061c..6c9b54288261 100644 +--- a/drivers/md/dm-raid.c ++++ b/drivers/md/dm-raid.c +@@ -2475,7 +2475,7 @@ static int super_validate(struct raid_set *rs, struct md_rdev *rdev) + } + + /* Enable bitmap creation for RAID levels != 0 */ +- mddev->bitmap_info.offset = rt_is_raid0(rs->raid_type) ? 0 : to_sector(4096); ++ mddev->bitmap_info.offset = (rt_is_raid0(rs->raid_type) || rs->journal_dev.dev) ? 0 : to_sector(4096); + mddev->bitmap_info.default_offset = mddev->bitmap_info.offset; + + if (!test_and_clear_bit(FirstUse, &rdev->flags)) { +diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c +index 25e97de36717..4cf3d8ad0b4a 100644 +--- a/drivers/md/raid10.c ++++ b/drivers/md/raid10.c +@@ -229,7 +229,7 @@ static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data) + + out_free_pages: + while (--j >= 0) +- resync_free_pages(&rps[j * 2]); ++ resync_free_pages(&rps[j]); + + j = 0; + out_free_bio: +diff --git a/drivers/media/i2c/ov13858.c b/drivers/media/i2c/ov13858.c +index 0e7a85c4996c..afd66d243403 100644 +--- a/drivers/media/i2c/ov13858.c ++++ b/drivers/media/i2c/ov13858.c +@@ -1612,7 +1612,8 @@ static int ov13858_init_controls(struct ov13858 *ov13858) + OV13858_NUM_OF_LINK_FREQS - 1, + 0, + link_freq_menu_items); +- ov13858->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; ++ if (ov13858->link_freq) ++ ov13858->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; + + pixel_rate_max = link_freq_to_pixel_rate(link_freq_menu_items[0]); + pixel_rate_min = link_freq_to_pixel_rate(link_freq_menu_items[1]); +@@ -1635,7 +1636,8 @@ static int ov13858_init_controls(struct ov13858 *ov13858) + ov13858->hblank = v4l2_ctrl_new_std( + ctrl_hdlr, &ov13858_ctrl_ops, V4L2_CID_HBLANK, + hblank, hblank, 1, hblank); +- ov13858->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; ++ if (ov13858->hblank) ++ ov13858->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; + + exposure_max = mode->vts_def - 8; + ov13858->exposure = v4l2_ctrl_new_std( +diff --git a/drivers/media/platform/vivid/vivid-kthread-cap.c b/drivers/media/platform/vivid/vivid-kthread-cap.c +index 2a92e5aac9ed..ac17883a054f 100644 +--- a/drivers/media/platform/vivid/vivid-kthread-cap.c ++++ b/drivers/media/platform/vivid/vivid-kthread-cap.c +@@ -765,7 +765,11 @@ static int vivid_thread_vid_cap(void *data) + if (kthread_should_stop()) + break; + +- mutex_lock(&dev->mutex); ++ if (!mutex_trylock(&dev->mutex)) { ++ schedule_timeout_uninterruptible(1); ++ continue; ++ } ++ + cur_jiffies = jiffies; + if (dev->cap_seq_resync) { + dev->jiffies_vid_cap = cur_jiffies; +@@ -918,8 +922,6 @@ void vivid_stop_generating_vid_cap(struct vivid_dev *dev, bool *pstreaming) + + /* shutdown control thread */ + vivid_grab_controls(dev, false); +- mutex_unlock(&dev->mutex); + kthread_stop(dev->kthread_vid_cap); + dev->kthread_vid_cap = NULL; +- mutex_lock(&dev->mutex); + } +diff --git a/drivers/media/platform/vivid/vivid-kthread-out.c b/drivers/media/platform/vivid/vivid-kthread-out.c +index 488590594150..c5f466a73312 100644 +--- a/drivers/media/platform/vivid/vivid-kthread-out.c ++++ b/drivers/media/platform/vivid/vivid-kthread-out.c +@@ -135,7 +135,11 @@ static int vivid_thread_vid_out(void *data) + if (kthread_should_stop()) + break; + +- mutex_lock(&dev->mutex); ++ if (!mutex_trylock(&dev->mutex)) { ++ schedule_timeout_uninterruptible(1); ++ continue; ++ } ++ + cur_jiffies = jiffies; + if (dev->out_seq_resync) { + dev->jiffies_vid_out = cur_jiffies; +@@ -289,8 +293,6 @@ void vivid_stop_generating_vid_out(struct vivid_dev *dev, bool *pstreaming) + + /* shutdown control thread */ + vivid_grab_controls(dev, false); +- mutex_unlock(&dev->mutex); + kthread_stop(dev->kthread_vid_out); + dev->kthread_vid_out = NULL; +- mutex_lock(&dev->mutex); + } +diff --git a/drivers/media/platform/vivid/vivid-sdr-cap.c b/drivers/media/platform/vivid/vivid-sdr-cap.c +index cfb7cb4d37a8..e1794f8689d4 100644 +--- a/drivers/media/platform/vivid/vivid-sdr-cap.c ++++ b/drivers/media/platform/vivid/vivid-sdr-cap.c +@@ -137,7 +137,11 @@ static int vivid_thread_sdr_cap(void *data) + if (kthread_should_stop()) + break; + +- mutex_lock(&dev->mutex); ++ if (!mutex_trylock(&dev->mutex)) { ++ schedule_timeout_uninterruptible(1); ++ continue; ++ } ++ + cur_jiffies = jiffies; + if (dev->sdr_cap_seq_resync) { + dev->jiffies_sdr_cap = cur_jiffies; +@@ -297,10 +301,8 @@ static void sdr_cap_stop_streaming(struct vb2_queue *vq) + } + + /* shutdown control thread */ +- mutex_unlock(&dev->mutex); + kthread_stop(dev->kthread_sdr_cap); + dev->kthread_sdr_cap = NULL; +- mutex_lock(&dev->mutex); + } + + const struct vb2_ops vivid_sdr_cap_qops = { +diff --git a/drivers/media/platform/vivid/vivid-vid-cap.c b/drivers/media/platform/vivid/vivid-vid-cap.c +index 2e273f4dfc29..c58ae489f39c 100644 +--- a/drivers/media/platform/vivid/vivid-vid-cap.c ++++ b/drivers/media/platform/vivid/vivid-vid-cap.c +@@ -222,9 +222,6 @@ static int vid_cap_start_streaming(struct vb2_queue *vq, unsigned count) + if (vb2_is_streaming(&dev->vb_vid_out_q)) + dev->can_loop_video = vivid_vid_can_loop(dev); + +- if (dev->kthread_vid_cap) +- return 0; +- + dev->vid_cap_seq_count = 0; + dprintk(dev, 1, "%s\n", __func__); + for (i = 0; i < VIDEO_MAX_FRAME; i++) +diff --git a/drivers/media/platform/vivid/vivid-vid-out.c b/drivers/media/platform/vivid/vivid-vid-out.c +index 50248e2176a0..0f909500a0b8 100644 +--- a/drivers/media/platform/vivid/vivid-vid-out.c ++++ b/drivers/media/platform/vivid/vivid-vid-out.c +@@ -146,9 +146,6 @@ static int vid_out_start_streaming(struct vb2_queue *vq, unsigned count) + if (vb2_is_streaming(&dev->vb_vid_cap_q)) + dev->can_loop_video = vivid_vid_can_loop(dev); + +- if (dev->kthread_vid_out) +- return 0; +- + dev->vid_out_seq_count = 0; + dprintk(dev, 1, "%s\n", __func__); + if (dev->start_streaming_error) { +diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c +index f23a220352f7..6b10363fb6f0 100644 +--- a/drivers/media/rc/imon.c ++++ b/drivers/media/rc/imon.c +@@ -1607,8 +1607,7 @@ static void imon_incoming_packet(struct imon_context *ictx, + spin_unlock_irqrestore(&ictx->kc_lock, flags); + + /* send touchscreen events through input subsystem if touchpad data */ +- if (ictx->display_type == IMON_DISPLAY_TYPE_VGA && len == 8 && +- buf[7] == 0x86) { ++ if (ictx->touch && len == 8 && buf[7] == 0x86) { + imon_touch_event(ictx, buf); + return; + +diff --git a/drivers/media/usb/b2c2/flexcop-usb.c b/drivers/media/usb/b2c2/flexcop-usb.c +index a8f3169e30b3..ac4fddfd0a43 100644 +--- a/drivers/media/usb/b2c2/flexcop-usb.c ++++ b/drivers/media/usb/b2c2/flexcop-usb.c +@@ -537,6 +537,9 @@ static int flexcop_usb_probe(struct usb_interface *intf, + struct flexcop_device *fc = NULL; + int ret; + ++ if (intf->cur_altsetting->desc.bNumEndpoints < 1) ++ return -ENODEV; ++ + if ((fc = flexcop_device_kmalloc(sizeof(struct flexcop_usb))) == NULL) { + err("out of memory\n"); + return -ENOMEM; +diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c +index 5b51ed7d6243..5400ec99986f 100644 +--- a/drivers/media/usb/dvb-usb/cxusb.c ++++ b/drivers/media/usb/dvb-usb/cxusb.c +@@ -457,7 +457,8 @@ static int cxusb_rc_query(struct dvb_usb_device *d) + { + u8 ircode[4]; + +- cxusb_ctrl_msg(d, CMD_GET_IR_CODE, NULL, 0, ircode, 4); ++ if (cxusb_ctrl_msg(d, CMD_GET_IR_CODE, NULL, 0, ircode, 4) < 0) ++ return 0; + + if (ircode[2] || ircode[3]) + rc_keydown(d->rc_dev, RC_PROTO_NEC, +diff --git a/drivers/media/usb/usbvision/usbvision-video.c b/drivers/media/usb/usbvision/usbvision-video.c +index f29d1bef0293..cce29b604f4a 100644 +--- a/drivers/media/usb/usbvision/usbvision-video.c ++++ b/drivers/media/usb/usbvision/usbvision-video.c +@@ -327,6 +327,10 @@ static int usbvision_v4l2_open(struct file *file) + if (mutex_lock_interruptible(&usbvision->v4l2_lock)) + return -ERESTARTSYS; + ++ if (usbvision->remove_pending) { ++ err_code = -ENODEV; ++ goto unlock; ++ } + if (usbvision->user) { + err_code = -EBUSY; + } else { +@@ -390,6 +394,7 @@ unlock: + static int usbvision_v4l2_close(struct file *file) + { + struct usb_usbvision *usbvision = video_drvdata(file); ++ int r; + + PDEBUG(DBG_IO, "close"); + +@@ -404,9 +409,10 @@ static int usbvision_v4l2_close(struct file *file) + usbvision_scratch_free(usbvision); + + usbvision->user--; ++ r = usbvision->remove_pending; + mutex_unlock(&usbvision->v4l2_lock); + +- if (usbvision->remove_pending) { ++ if (r) { + printk(KERN_INFO "%s: Final disconnect\n", __func__); + usbvision_release(usbvision); + return 0; +@@ -1090,6 +1096,11 @@ static int usbvision_radio_open(struct file *file) + + if (mutex_lock_interruptible(&usbvision->v4l2_lock)) + return -ERESTARTSYS; ++ ++ if (usbvision->remove_pending) { ++ err_code = -ENODEV; ++ goto out; ++ } + err_code = v4l2_fh_open(file); + if (err_code) + goto out; +@@ -1122,6 +1133,7 @@ out: + static int usbvision_radio_close(struct file *file) + { + struct usb_usbvision *usbvision = video_drvdata(file); ++ int r; + + PDEBUG(DBG_IO, ""); + +@@ -1134,9 +1146,10 @@ static int usbvision_radio_close(struct file *file) + usbvision_audio_off(usbvision); + usbvision->radio = 0; + usbvision->user--; ++ r = usbvision->remove_pending; + mutex_unlock(&usbvision->v4l2_lock); + +- if (usbvision->remove_pending) { ++ if (r) { + printk(KERN_INFO "%s: Final disconnect\n", __func__); + v4l2_fh_release(file); + usbvision_release(usbvision); +@@ -1562,6 +1575,7 @@ err_usb: + static void usbvision_disconnect(struct usb_interface *intf) + { + struct usb_usbvision *usbvision = to_usbvision(usb_get_intfdata(intf)); ++ int u; + + PDEBUG(DBG_PROBE, ""); + +@@ -1578,13 +1592,14 @@ static void usbvision_disconnect(struct usb_interface *intf) + v4l2_device_disconnect(&usbvision->v4l2_dev); + usbvision_i2c_unregister(usbvision); + usbvision->remove_pending = 1; /* Now all ISO data will be ignored */ ++ u = usbvision->user; + + usb_put_dev(usbvision->dev); + usbvision->dev = NULL; /* USB device is no more */ + + mutex_unlock(&usbvision->v4l2_lock); + +- if (usbvision->user) { ++ if (u) { + printk(KERN_INFO "%s: In use, disconnect pending\n", + __func__); + wake_up_interruptible(&usbvision->wait_frame); +diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c +index c3ddbf6c202a..cf4feff2a48c 100644 +--- a/drivers/media/usb/uvc/uvc_driver.c ++++ b/drivers/media/usb/uvc/uvc_driver.c +@@ -2124,6 +2124,20 @@ static int uvc_probe(struct usb_interface *intf, + sizeof(dev->name) - len); + } + ++ /* Initialize the media device. */ ++#ifdef CONFIG_MEDIA_CONTROLLER ++ dev->mdev.dev = &intf->dev; ++ strscpy(dev->mdev.model, dev->name, sizeof(dev->mdev.model)); ++ if (udev->serial) ++ strscpy(dev->mdev.serial, udev->serial, ++ sizeof(dev->mdev.serial)); ++ usb_make_path(udev, dev->mdev.bus_info, sizeof(dev->mdev.bus_info)); ++ dev->mdev.hw_revision = le16_to_cpu(udev->descriptor.bcdDevice); ++ media_device_init(&dev->mdev); ++ ++ dev->vdev.mdev = &dev->mdev; ++#endif ++ + /* Parse the Video Class control descriptor. */ + if (uvc_parse_control(dev) < 0) { + uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC " +@@ -2144,19 +2158,7 @@ static int uvc_probe(struct usb_interface *intf, + "linux-uvc-devel mailing list.\n"); + } + +- /* Initialize the media device and register the V4L2 device. */ +-#ifdef CONFIG_MEDIA_CONTROLLER +- dev->mdev.dev = &intf->dev; +- strlcpy(dev->mdev.model, dev->name, sizeof(dev->mdev.model)); +- if (udev->serial) +- strlcpy(dev->mdev.serial, udev->serial, +- sizeof(dev->mdev.serial)); +- strcpy(dev->mdev.bus_info, udev->devpath); +- dev->mdev.hw_revision = le16_to_cpu(udev->descriptor.bcdDevice); +- media_device_init(&dev->mdev); +- +- dev->vdev.mdev = &dev->mdev; +-#endif ++ /* Register the V4L2 device. */ + if (v4l2_device_register(&intf->dev, &dev->vdev) < 0) + goto error; + +diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c +index 47d6d40f41cd..a4403a57ddc8 100644 +--- a/drivers/mfd/arizona-core.c ++++ b/drivers/mfd/arizona-core.c +@@ -52,8 +52,10 @@ int arizona_clk32k_enable(struct arizona *arizona) + if (ret != 0) + goto err_ref; + ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK1]); +- if (ret != 0) +- goto err_pm; ++ if (ret != 0) { ++ pm_runtime_put_sync(arizona->dev); ++ goto err_ref; ++ } + break; + case ARIZONA_32KZ_MCLK2: + ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK2]); +@@ -67,8 +69,6 @@ int arizona_clk32k_enable(struct arizona *arizona) + ARIZONA_CLK_32K_ENA); + } + +-err_pm: +- pm_runtime_put_sync(arizona->dev); + err_ref: + if (ret != 0) + arizona->clk32k_ref--; +diff --git a/drivers/mfd/intel_soc_pmic_bxtwc.c b/drivers/mfd/intel_soc_pmic_bxtwc.c +index 15bc052704a6..9ca1f8c015de 100644 +--- a/drivers/mfd/intel_soc_pmic_bxtwc.c ++++ b/drivers/mfd/intel_soc_pmic_bxtwc.c +@@ -31,8 +31,8 @@ + + /* Interrupt Status Registers */ + #define BXTWC_IRQLVL1 0x4E02 +-#define BXTWC_PWRBTNIRQ 0x4E03 + ++#define BXTWC_PWRBTNIRQ 0x4E03 + #define BXTWC_THRM0IRQ 0x4E04 + #define BXTWC_THRM1IRQ 0x4E05 + #define BXTWC_THRM2IRQ 0x4E06 +@@ -47,10 +47,9 @@ + + /* Interrupt MASK Registers */ + #define BXTWC_MIRQLVL1 0x4E0E +-#define BXTWC_MPWRTNIRQ 0x4E0F +- + #define BXTWC_MIRQLVL1_MCHGR BIT(5) + ++#define BXTWC_MPWRBTNIRQ 0x4E0F + #define BXTWC_MTHRM0IRQ 0x4E12 + #define BXTWC_MTHRM1IRQ 0x4E13 + #define BXTWC_MTHRM2IRQ 0x4E14 +@@ -66,9 +65,7 @@ + /* Whiskey Cove PMIC share same ACPI ID between different platforms */ + #define BROXTON_PMIC_WC_HRV 4 + +-/* Manage in two IRQ chips since mask registers are not consecutive */ + enum bxtwc_irqs { +- /* Level 1 */ + BXTWC_PWRBTN_LVL1_IRQ = 0, + BXTWC_TMU_LVL1_IRQ, + BXTWC_THRM_LVL1_IRQ, +@@ -77,9 +74,11 @@ enum bxtwc_irqs { + BXTWC_CHGR_LVL1_IRQ, + BXTWC_GPIO_LVL1_IRQ, + BXTWC_CRIT_LVL1_IRQ, ++}; + +- /* Level 2 */ +- BXTWC_PWRBTN_IRQ, ++enum bxtwc_irqs_pwrbtn { ++ BXTWC_PWRBTN_IRQ = 0, ++ BXTWC_UIBTN_IRQ, + }; + + enum bxtwc_irqs_bcu { +@@ -113,7 +112,10 @@ static const struct regmap_irq bxtwc_regmap_irqs[] = { + REGMAP_IRQ_REG(BXTWC_CHGR_LVL1_IRQ, 0, BIT(5)), + REGMAP_IRQ_REG(BXTWC_GPIO_LVL1_IRQ, 0, BIT(6)), + REGMAP_IRQ_REG(BXTWC_CRIT_LVL1_IRQ, 0, BIT(7)), +- REGMAP_IRQ_REG(BXTWC_PWRBTN_IRQ, 1, 0x03), ++}; ++ ++static const struct regmap_irq bxtwc_regmap_irqs_pwrbtn[] = { ++ REGMAP_IRQ_REG(BXTWC_PWRBTN_IRQ, 0, 0x01), + }; + + static const struct regmap_irq bxtwc_regmap_irqs_bcu[] = { +@@ -125,7 +127,7 @@ static const struct regmap_irq bxtwc_regmap_irqs_adc[] = { + }; + + static const struct regmap_irq bxtwc_regmap_irqs_chgr[] = { +- REGMAP_IRQ_REG(BXTWC_USBC_IRQ, 0, BIT(5)), ++ REGMAP_IRQ_REG(BXTWC_USBC_IRQ, 0, 0x20), + REGMAP_IRQ_REG(BXTWC_CHGR0_IRQ, 0, 0x1f), + REGMAP_IRQ_REG(BXTWC_CHGR1_IRQ, 1, 0x1f), + }; +@@ -144,7 +146,16 @@ static struct regmap_irq_chip bxtwc_regmap_irq_chip = { + .mask_base = BXTWC_MIRQLVL1, + .irqs = bxtwc_regmap_irqs, + .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs), +- .num_regs = 2, ++ .num_regs = 1, ++}; ++ ++static struct regmap_irq_chip bxtwc_regmap_irq_chip_pwrbtn = { ++ .name = "bxtwc_irq_chip_pwrbtn", ++ .status_base = BXTWC_PWRBTNIRQ, ++ .mask_base = BXTWC_MPWRBTNIRQ, ++ .irqs = bxtwc_regmap_irqs_pwrbtn, ++ .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs_pwrbtn), ++ .num_regs = 1, + }; + + static struct regmap_irq_chip bxtwc_regmap_irq_chip_tmu = { +@@ -472,6 +483,16 @@ static int bxtwc_probe(struct platform_device *pdev) + return ret; + } + ++ ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, ++ BXTWC_PWRBTN_LVL1_IRQ, ++ IRQF_ONESHOT, ++ &bxtwc_regmap_irq_chip_pwrbtn, ++ &pmic->irq_chip_data_pwrbtn); ++ if (ret) { ++ dev_err(&pdev->dev, "Failed to add PWRBTN IRQ chip\n"); ++ return ret; ++ } ++ + ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, + BXTWC_TMU_LVL1_IRQ, + IRQF_ONESHOT, +diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c +index 3f554c447521..d1495d76bf2c 100644 +--- a/drivers/mfd/max8997.c ++++ b/drivers/mfd/max8997.c +@@ -153,12 +153,6 @@ static struct max8997_platform_data *max8997_i2c_parse_dt_pdata( + + pd->ono = irq_of_parse_and_map(dev->of_node, 1); + +- /* +- * ToDo: the 'wakeup' member in the platform data is more of a linux +- * specfic information. Hence, there is no binding for that yet and +- * not parsed here. +- */ +- + return pd; + } + +@@ -246,7 +240,7 @@ static int max8997_i2c_probe(struct i2c_client *i2c, + */ + + /* MAX8997 has a power button input. */ +- device_init_wakeup(max8997->dev, pdata->wakeup); ++ device_init_wakeup(max8997->dev, true); + + return ret; + +diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c +index 234febfe6398..d0bf50e3568d 100644 +--- a/drivers/mfd/mc13xxx-core.c ++++ b/drivers/mfd/mc13xxx-core.c +@@ -278,7 +278,8 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode, + if (ret) + goto out; + +- adc0 = MC13XXX_ADC0_ADINC1 | MC13XXX_ADC0_ADINC2; ++ adc0 = MC13XXX_ADC0_ADINC1 | MC13XXX_ADC0_ADINC2 | ++ MC13XXX_ADC0_CHRGRAWDIV; + adc1 = MC13XXX_ADC1_ADEN | MC13XXX_ADC1_ADTRIGIGN | MC13XXX_ADC1_ASC; + + /* +diff --git a/drivers/misc/mic/scif/scif_fence.c b/drivers/misc/mic/scif/scif_fence.c +index cac3bcc308a7..7bb929f05d85 100644 +--- a/drivers/misc/mic/scif/scif_fence.c ++++ b/drivers/misc/mic/scif/scif_fence.c +@@ -272,7 +272,7 @@ static int _scif_prog_signal(scif_epd_t epd, dma_addr_t dst, u64 val) + dma_fail: + if (!x100) + dma_pool_free(ep->remote_dev->signal_pool, status, +- status->src_dma_addr); ++ src - offsetof(struct scif_status, val)); + alloc_fail: + return err; + } +diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c +index f171cce5197d..673f6a9616cd 100644 +--- a/drivers/mmc/host/mtk-sd.c ++++ b/drivers/mmc/host/mtk-sd.c +@@ -390,7 +390,6 @@ struct msdc_host { + struct clk *src_clk_cg; /* msdc source clock control gate */ + u32 mclk; /* mmc subsystem clock frequency */ + u32 src_clk_freq; /* source clock frequency */ +- u32 sclk; /* SD/MS bus clock frequency */ + unsigned char timing; + bool vqmmc_enabled; + u32 latch_ck; +@@ -635,10 +634,10 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) + + host->timeout_ns = ns; + host->timeout_clks = clks; +- if (host->sclk == 0) { ++ if (host->mmc->actual_clock == 0) { + timeout = 0; + } else { +- clk_ns = 1000000000UL / host->sclk; ++ clk_ns = 1000000000UL / host->mmc->actual_clock; + timeout = (ns + clk_ns - 1) / clk_ns + clks; + /* in 1048576 sclk cycle unit */ + timeout = (timeout + (0x1 << 20) - 1) >> 20; +@@ -683,6 +682,7 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz) + if (!hz) { + dev_dbg(host->dev, "set mclk to 0\n"); + host->mclk = 0; ++ host->mmc->actual_clock = 0; + sdr_clr_bits(host->base + MSDC_CFG, MSDC_CFG_CKPDN); + return; + } +@@ -761,7 +761,7 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz) + while (!(readl(host->base + MSDC_CFG) & MSDC_CFG_CKSTB)) + cpu_relax(); + sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_CKPDN); +- host->sclk = sclk; ++ host->mmc->actual_clock = sclk; + host->mclk = hz; + host->timing = timing; + /* need because clk changed. */ +@@ -772,7 +772,7 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz) + * mmc_select_hs400() will drop to 50Mhz and High speed mode, + * tune result of hs200/200Mhz is not suitable for 50Mhz + */ +- if (host->sclk <= 52000000) { ++ if (host->mmc->actual_clock <= 52000000) { + writel(host->def_tune_para.iocon, host->base + MSDC_IOCON); + writel(host->def_tune_para.pad_tune, host->base + tune_reg); + } else { +@@ -787,7 +787,8 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz) + sdr_set_field(host->base + tune_reg, + MSDC_PAD_TUNE_CMDRRDLY, + host->hs400_cmd_int_delay); +- dev_dbg(host->dev, "sclk: %d, timing: %d\n", host->sclk, timing); ++ dev_dbg(host->dev, "sclk: %d, timing: %d\n", host->mmc->actual_clock, ++ timing); + } + + static inline u32 msdc_cmd_find_resp(struct msdc_host *host, +@@ -1055,6 +1056,7 @@ static void msdc_start_command(struct msdc_host *host, + WARN_ON(host->cmd); + host->cmd = cmd; + ++ mod_delayed_work(system_wq, &host->req_timeout, DAT_TIMEOUT); + if (!msdc_cmd_is_ready(host, mrq, cmd)) + return; + +@@ -1066,7 +1068,6 @@ static void msdc_start_command(struct msdc_host *host, + + cmd->error = 0; + rawcmd = msdc_cmd_prepare_raw_cmd(host, mrq, cmd); +- mod_delayed_work(system_wq, &host->req_timeout, DAT_TIMEOUT); + + sdr_set_bits(host->base + MSDC_INTEN, cmd_ints_mask); + writel(cmd->arg, host->base + SDC_ARG); +diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c +index ca3655d28e00..17cec68e56b4 100644 +--- a/drivers/net/dsa/bcm_sf2.c ++++ b/drivers/net/dsa/bcm_sf2.c +@@ -1099,12 +1099,16 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev) + return ret; + } + ++ bcm_sf2_gphy_enable_set(priv->dev->ds, true); ++ + ret = bcm_sf2_mdio_register(ds); + if (ret) { + pr_err("failed to register MDIO bus\n"); + return ret; + } + ++ bcm_sf2_gphy_enable_set(priv->dev->ds, false); ++ + ret = bcm_sf2_cfp_rst(priv); + if (ret) { + pr_err("failed to reset CFP\n"); +diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c +index d075f0f7a3de..411ae9961bf4 100644 +--- a/drivers/net/dsa/mv88e6xxx/chip.c ++++ b/drivers/net/dsa/mv88e6xxx/chip.c +@@ -3028,7 +3028,7 @@ static const struct mv88e6xxx_ops mv88e6141_ops = { + .port_set_link = mv88e6xxx_port_set_link, + .port_set_duplex = mv88e6xxx_port_set_duplex, + .port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay, +- .port_set_speed = mv88e6390_port_set_speed, ++ .port_set_speed = mv88e6341_port_set_speed, + .port_tag_remap = mv88e6095_port_tag_remap, + .port_set_frame_mode = mv88e6351_port_set_frame_mode, + .port_set_egress_floods = mv88e6352_port_set_egress_floods, +@@ -3649,7 +3649,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = { + .port_set_link = mv88e6xxx_port_set_link, + .port_set_duplex = mv88e6xxx_port_set_duplex, + .port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay, +- .port_set_speed = mv88e6390_port_set_speed, ++ .port_set_speed = mv88e6341_port_set_speed, + .port_tag_remap = mv88e6095_port_tag_remap, + .port_set_frame_mode = mv88e6351_port_set_frame_mode, + .port_set_egress_floods = mv88e6352_port_set_egress_floods, +diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c +index fdeddbfa829d..2f16a310c110 100644 +--- a/drivers/net/dsa/mv88e6xxx/port.c ++++ b/drivers/net/dsa/mv88e6xxx/port.c +@@ -228,8 +228,11 @@ static int mv88e6xxx_port_set_speed(struct mv88e6xxx_chip *chip, int port, + ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_1000; + break; + case 2500: +- ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000 | +- MV88E6390_PORT_MAC_CTL_ALTSPEED; ++ if (alt_bit) ++ ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000 | ++ MV88E6390_PORT_MAC_CTL_ALTSPEED; ++ else ++ ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000; + break; + case 10000: + /* all bits set, fall through... */ +@@ -291,6 +294,24 @@ int mv88e6185_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed) + return mv88e6xxx_port_set_speed(chip, port, speed, false, false); + } + ++/* Support 10, 100, 200, 1000, 2500 Mbps (e.g. 88E6341) */ ++int mv88e6341_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed) ++{ ++ if (speed == SPEED_MAX) ++ speed = port < 5 ? 1000 : 2500; ++ ++ if (speed > 2500) ++ return -EOPNOTSUPP; ++ ++ if (speed == 200 && port != 0) ++ return -EOPNOTSUPP; ++ ++ if (speed == 2500 && port < 5) ++ return -EOPNOTSUPP; ++ ++ return mv88e6xxx_port_set_speed(chip, port, speed, !port, true); ++} ++ + /* Support 10, 100, 200, 1000 Mbps (e.g. 88E6352 family) */ + int mv88e6352_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed) + { +diff --git a/drivers/net/dsa/mv88e6xxx/port.h b/drivers/net/dsa/mv88e6xxx/port.h +index 95b59f5eb393..cbb64a7683e2 100644 +--- a/drivers/net/dsa/mv88e6xxx/port.h ++++ b/drivers/net/dsa/mv88e6xxx/port.h +@@ -280,6 +280,7 @@ int mv88e6xxx_port_set_duplex(struct mv88e6xxx_chip *chip, int port, int dup); + + int mv88e6065_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed); + int mv88e6185_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed); ++int mv88e6341_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed); + int mv88e6352_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed); + int mv88e6390_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed); + int mv88e6390x_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed); +diff --git a/drivers/net/ethernet/amazon/Kconfig b/drivers/net/ethernet/amazon/Kconfig +index 99b30353541a..9e87d7b8360f 100644 +--- a/drivers/net/ethernet/amazon/Kconfig ++++ b/drivers/net/ethernet/amazon/Kconfig +@@ -17,7 +17,7 @@ if NET_VENDOR_AMAZON + + config ENA_ETHERNET + tristate "Elastic Network Adapter (ENA) support" +- depends on (PCI_MSI && X86) ++ depends on PCI_MSI && !CPU_BIG_ENDIAN + ---help--- + This driver supports Elastic Network Adapter (ENA)" + +diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c +index bb60104b4f80..338d22380434 100644 +--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c ++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c +@@ -1169,7 +1169,7 @@ static int bcmgenet_power_down(struct bcmgenet_priv *priv, + break; + } + +- return 0; ++ return ret; + } + + static void bcmgenet_power_up(struct bcmgenet_priv *priv, +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c +index 74eeb3a985bf..f175b20ac510 100644 +--- a/drivers/net/ethernet/cadence/macb_main.c ++++ b/drivers/net/ethernet/cadence/macb_main.c +@@ -1721,7 +1721,7 @@ static int macb_pad_and_fcs(struct sk_buff **skb, struct net_device *ndev) + padlen = 0; + /* No room for FCS, need to reallocate skb. */ + else +- padlen = ETH_FCS_LEN - tailroom; ++ padlen = ETH_FCS_LEN; + } else { + /* Add room for FCS. */ + padlen += ETH_FCS_LEN; +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +index e11a7de20b8f..3708f149d0a6 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +@@ -2547,7 +2547,7 @@ static int hns3_get_vector_ring_chain(struct hns3_enet_tqp_vector *tqp_vector, + chain = devm_kzalloc(&pdev->dev, sizeof(*chain), + GFP_KERNEL); + if (!chain) +- return -ENOMEM; ++ goto err_free_chain; + + cur_chain->next = chain; + chain->tqp_index = tx_ring->tqp->tqp_index; +@@ -2577,7 +2577,7 @@ static int hns3_get_vector_ring_chain(struct hns3_enet_tqp_vector *tqp_vector, + while (rx_ring) { + chain = devm_kzalloc(&pdev->dev, sizeof(*chain), GFP_KERNEL); + if (!chain) +- return -ENOMEM; ++ goto err_free_chain; + + cur_chain->next = chain; + chain->tqp_index = rx_ring->tqp->tqp_index; +@@ -2592,6 +2592,16 @@ static int hns3_get_vector_ring_chain(struct hns3_enet_tqp_vector *tqp_vector, + } + + return 0; ++ ++err_free_chain: ++ cur_chain = head->next; ++ while (cur_chain) { ++ chain = cur_chain->next; ++ devm_kfree(&pdev->dev, chain); ++ cur_chain = chain; ++ } ++ ++ return -ENOMEM; + } + + static void hns3_free_vector_ring_chain(struct hns3_enet_tqp_vector *tqp_vector, +@@ -2836,8 +2846,10 @@ static int hns3_queue_to_ring(struct hnae3_queue *tqp, + return ret; + + ret = hns3_ring_get_cfg(tqp, priv, HNAE3_RING_TYPE_RX); +- if (ret) ++ if (ret) { ++ devm_kfree(priv->dev, priv->ring_data[tqp->tqp_index].ring); + return ret; ++ } + + return 0; + } +@@ -2864,6 +2876,12 @@ static int hns3_get_ring_config(struct hns3_nic_priv *priv) + + return 0; + err: ++ while (i--) { ++ devm_kfree(priv->dev, priv->ring_data[i].ring); ++ devm_kfree(priv->dev, ++ priv->ring_data[i + h->kinfo.num_tqps].ring); ++ } ++ + devm_kfree(&pdev->dev, priv->ring_data); + return ret; + } +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c +index 68026a5ad7e7..690f62ed87dc 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c +@@ -24,15 +24,15 @@ static int hclge_ring_space(struct hclge_cmq_ring *ring) + return ring->desc_num - used - 1; + } + +-static int is_valid_csq_clean_head(struct hclge_cmq_ring *ring, int h) ++static int is_valid_csq_clean_head(struct hclge_cmq_ring *ring, int head) + { +- int u = ring->next_to_use; +- int c = ring->next_to_clean; ++ int ntu = ring->next_to_use; ++ int ntc = ring->next_to_clean; + +- if (unlikely(h >= ring->desc_num)) +- return 0; ++ if (ntu > ntc) ++ return head >= ntc && head <= ntu; + +- return u > c ? (h > c && h <= u) : (h > c || h <= u); ++ return head >= ntc || head <= ntu; + } + + static int hclge_alloc_cmd_desc(struct hclge_cmq_ring *ring) +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +index b04df79f393f..f8cc8d1f0b20 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +@@ -2574,7 +2574,7 @@ static irqreturn_t hclge_misc_irq_handle(int irq, void *data) + } + + /* clear the source of interrupt if it is not cause by reset */ +- if (event_cause != HCLGE_VECTOR0_EVENT_RST) { ++ if (event_cause == HCLGE_VECTOR0_EVENT_MBX) { + hclge_clear_event_cause(hdev, event_cause, clearval); + hclge_enable_vector(&hdev->misc_vector, true); + } +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +index 398971a062f4..03491e8ebb73 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +@@ -54,7 +54,7 @@ static int hclge_mdio_write(struct mii_bus *bus, int phyid, int regnum, + struct hclge_desc desc; + int ret; + +- if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) ++ if (test_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state)) + return 0; + + hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_MDIO_CONFIG, false); +@@ -92,7 +92,7 @@ static int hclge_mdio_read(struct mii_bus *bus, int phyid, int regnum) + struct hclge_desc desc; + int ret; + +- if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) ++ if (test_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state)) + return 0; + + hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_MDIO_CONFIG, true); +diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c +index e707d717012f..618032612f52 100644 +--- a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c ++++ b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c +@@ -302,6 +302,28 @@ void fm10k_iov_suspend(struct pci_dev *pdev) + } + } + ++static void fm10k_mask_aer_comp_abort(struct pci_dev *pdev) ++{ ++ u32 err_mask; ++ int pos; ++ ++ pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR); ++ if (!pos) ++ return; ++ ++ /* Mask the completion abort bit in the ERR_UNCOR_MASK register, ++ * preventing the device from reporting these errors to the upstream ++ * PCIe root device. This avoids bringing down platforms which upgrade ++ * non-fatal completer aborts into machine check exceptions. Completer ++ * aborts can occur whenever a VF reads a queue it doesn't own. ++ */ ++ pci_read_config_dword(pdev, pos + PCI_ERR_UNCOR_MASK, &err_mask); ++ err_mask |= PCI_ERR_UNC_COMP_ABORT; ++ pci_write_config_dword(pdev, pos + PCI_ERR_UNCOR_MASK, err_mask); ++ ++ mmiowb(); ++} ++ + int fm10k_iov_resume(struct pci_dev *pdev) + { + struct fm10k_intfc *interface = pci_get_drvdata(pdev); +@@ -317,6 +339,12 @@ int fm10k_iov_resume(struct pci_dev *pdev) + if (!iov_data) + return -ENOMEM; + ++ /* Lower severity of completer abort error reporting as ++ * the VFs can trigger this any time they read a queue ++ * that they don't own. ++ */ ++ fm10k_mask_aer_comp_abort(pdev); ++ + /* allocate hardware resources for the VFs */ + hw->iov.ops.assign_resources(hw, num_vfs, num_vfs); + +@@ -460,20 +488,6 @@ void fm10k_iov_disable(struct pci_dev *pdev) + fm10k_iov_free_data(pdev); + } + +-static void fm10k_disable_aer_comp_abort(struct pci_dev *pdev) +-{ +- u32 err_sev; +- int pos; +- +- pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR); +- if (!pos) +- return; +- +- pci_read_config_dword(pdev, pos + PCI_ERR_UNCOR_SEVER, &err_sev); +- err_sev &= ~PCI_ERR_UNC_COMP_ABORT; +- pci_write_config_dword(pdev, pos + PCI_ERR_UNCOR_SEVER, err_sev); +-} +- + int fm10k_iov_configure(struct pci_dev *pdev, int num_vfs) + { + int current_vfs = pci_num_vf(pdev); +@@ -495,12 +509,6 @@ int fm10k_iov_configure(struct pci_dev *pdev, int num_vfs) + + /* allocate VFs if not already allocated */ + if (num_vfs && num_vfs != current_vfs) { +- /* Disable completer abort error reporting as +- * the VFs can trigger this any time they read a queue +- * that they don't own. +- */ +- fm10k_disable_aer_comp_abort(pdev); +- + err = pci_enable_sriov(pdev, num_vfs); + if (err) { + dev_err(&pdev->dev, +diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c +index 9f4d700e09df..29ced6b74d36 100644 +--- a/drivers/net/ethernet/intel/igb/igb_ptp.c ++++ b/drivers/net/ethernet/intel/igb/igb_ptp.c +@@ -51,9 +51,15 @@ + * + * The 40 bit 82580 SYSTIM overflows every + * 2^40 * 10^-9 / 60 = 18.3 minutes. ++ * ++ * SYSTIM is converted to real time using a timecounter. As ++ * timecounter_cyc2time() allows old timestamps, the timecounter ++ * needs to be updated at least once per half of the SYSTIM interval. ++ * Scheduling of delayed work is not very accurate, so we aim for 8 ++ * minutes to be sure the actual interval is shorter than 9.16 minutes. + */ + +-#define IGB_SYSTIM_OVERFLOW_PERIOD (HZ * 60 * 9) ++#define IGB_SYSTIM_OVERFLOW_PERIOD (HZ * 60 * 8) + #define IGB_PTP_TX_TIMEOUT (HZ * 15) + #define INCPERIOD_82576 BIT(E1000_TIMINCA_16NS_SHIFT) + #define INCVALUE_82576_MASK GENMASK(E1000_TIMINCA_16NS_SHIFT - 1, 0) +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +index 94c59939a8cf..e639a365ac2d 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +@@ -1745,6 +1745,7 @@ static int mlx4_en_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, + err = mlx4_en_get_flow(dev, cmd, cmd->fs.location); + break; + case ETHTOOL_GRXCLSRLALL: ++ cmd->data = MAX_NUM_OF_FS_RULES; + while ((!err || err == -ENOENT) && priority < cmd->rule_cnt) { + err = mlx4_en_get_flow(dev, cmd, i); + if (!err) +@@ -1811,6 +1812,7 @@ static int mlx4_en_set_channels(struct net_device *dev, + struct mlx4_en_dev *mdev = priv->mdev; + struct mlx4_en_port_profile new_prof; + struct mlx4_en_priv *tmp; ++ int total_tx_count; + int port_up = 0; + int xdp_count; + int err = 0; +@@ -1825,13 +1827,12 @@ static int mlx4_en_set_channels(struct net_device *dev, + + mutex_lock(&mdev->state_lock); + xdp_count = priv->tx_ring_num[TX_XDP] ? channel->rx_count : 0; +- if (channel->tx_count * priv->prof->num_up + xdp_count > +- priv->mdev->profile.max_num_tx_rings_p_up * priv->prof->num_up) { ++ total_tx_count = channel->tx_count * priv->prof->num_up + xdp_count; ++ if (total_tx_count > MAX_TX_RINGS) { + err = -EINVAL; + en_err(priv, + "Total number of TX and XDP rings (%d) exceeds the maximum supported (%d)\n", +- channel->tx_count * priv->prof->num_up + xdp_count, +- MAX_TX_RINGS); ++ total_tx_count, MAX_TX_RINGS); + goto out; + } + +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +index 0d7fd3f043cf..5868ec11db1a 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +@@ -92,6 +92,7 @@ int mlx4_en_alloc_tx_queue_per_tc(struct net_device *dev, u8 tc) + struct mlx4_en_dev *mdev = priv->mdev; + struct mlx4_en_port_profile new_prof; + struct mlx4_en_priv *tmp; ++ int total_count; + int port_up = 0; + int err = 0; + +@@ -105,6 +106,14 @@ int mlx4_en_alloc_tx_queue_per_tc(struct net_device *dev, u8 tc) + MLX4_EN_NUM_UP_HIGH; + new_prof.tx_ring_num[TX] = new_prof.num_tx_rings_p_up * + new_prof.num_up; ++ total_count = new_prof.tx_ring_num[TX] + new_prof.tx_ring_num[TX_XDP]; ++ if (total_count > MAX_TX_RINGS) { ++ err = -EINVAL; ++ en_err(priv, ++ "Total number of TX and XDP rings (%d) exceeds the maximum supported (%d)\n", ++ total_count, MAX_TX_RINGS); ++ goto out; ++ } + err = mlx4_en_try_alloc_resources(priv, tmp, &new_prof, true); + if (err) + goto out; +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +index 55ccd90beeb0..7366033cd31c 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +@@ -1861,7 +1861,7 @@ int mlx5_eswitch_set_vport_state(struct mlx5_eswitch *esw, + + unlock: + mutex_unlock(&esw->state_lock); +- return 0; ++ return err; + } + + int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw, +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +index c079f85593d6..82a53317285d 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +@@ -520,7 +520,7 @@ static void del_sw_flow_group(struct fs_node *node) + + rhashtable_destroy(&fg->ftes_hash); + ida_destroy(&fg->fte_allocator); +- if (ft->autogroup.active) ++ if (ft->autogroup.active && fg->max_ftes == ft->autogroup.group_size) + ft->autogroup.num_groups--; + err = rhltable_remove(&ft->fgs_hash, + &fg->hash, +@@ -1065,6 +1065,8 @@ mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns, + + ft->autogroup.active = true; + ft->autogroup.required_groups = max_num_groups; ++ /* We save place for flow groups in addition to max types */ ++ ft->autogroup.group_size = ft->max_fte / (max_num_groups + 1); + + return ft; + } +@@ -1270,8 +1272,7 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft + return ERR_PTR(-ENOENT); + + if (ft->autogroup.num_groups < ft->autogroup.required_groups) +- /* We save place for flow groups in addition to max types */ +- group_size = ft->max_fte / (ft->autogroup.required_groups + 1); ++ group_size = ft->autogroup.group_size; + + /* ft->max_fte == ft->autogroup.max_types */ + if (group_size == 0) +@@ -1298,7 +1299,8 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft + if (IS_ERR(fg)) + goto out; + +- ft->autogroup.num_groups++; ++ if (group_size == ft->autogroup.group_size) ++ ft->autogroup.num_groups++; + + out: + return fg; +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h +index 32070e5d993d..ba62fbce23a2 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h +@@ -121,6 +121,7 @@ struct mlx5_flow_table { + struct { + bool active; + unsigned int required_groups; ++ unsigned int group_size; + unsigned int num_groups; + } autogroup; + /* Protect fwd_rules */ +diff --git a/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c b/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c +index 2cf89126fb23..d765e7a69d6b 100644 +--- a/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c ++++ b/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c +@@ -86,6 +86,8 @@ retry: + return err; + + if (fsm_state_err != MLXFW_FSM_STATE_ERR_OK) { ++ fsm_state_err = min_t(enum mlxfw_fsm_state_err, ++ fsm_state_err, MLXFW_FSM_STATE_ERR_MAX); + pr_err("Firmware flash failed: %s\n", + mlxfw_fsm_state_err_str[fsm_state_err]); + return -EINVAL; +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +index 2ab9cf25a08a..3f54b3ca38ba 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +@@ -970,7 +970,7 @@ u32 mlxsw_sp_ipip_dev_ul_tb_id(const struct net_device *ol_dev) + if (d) + return l3mdev_fib_table(d) ? : RT_TABLE_MAIN; + else +- return l3mdev_fib_table(ol_dev) ? : RT_TABLE_MAIN; ++ return RT_TABLE_MAIN; + } + + static struct mlxsw_sp_rif * +@@ -1532,27 +1532,10 @@ static int mlxsw_sp_netdevice_ipip_ol_vrf_event(struct mlxsw_sp *mlxsw_sp, + { + struct mlxsw_sp_ipip_entry *ipip_entry = + mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev); +- enum mlxsw_sp_l3proto ul_proto; +- union mlxsw_sp_l3addr saddr; +- u32 ul_tb_id; + + if (!ipip_entry) + return 0; + +- /* For flat configuration cases, moving overlay to a different VRF might +- * cause local address conflict, and the conflicting tunnels need to be +- * demoted. +- */ +- ul_tb_id = mlxsw_sp_ipip_dev_ul_tb_id(ol_dev); +- ul_proto = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]->ul_proto; +- saddr = mlxsw_sp_ipip_netdev_saddr(ul_proto, ol_dev); +- if (mlxsw_sp_ipip_demote_tunnel_by_saddr(mlxsw_sp, ul_proto, +- saddr, ul_tb_id, +- ipip_entry)) { +- mlxsw_sp_ipip_entry_demote_tunnel(mlxsw_sp, ipip_entry); +- return 0; +- } +- + return __mlxsw_sp_ipip_entry_update_tunnel(mlxsw_sp, ipip_entry, + true, false, false, extack); + } +diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h +index dbd00982fd2b..2134045e14c3 100644 +--- a/drivers/net/ethernet/netronome/nfp/bpf/main.h ++++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h +@@ -206,6 +206,11 @@ enum nfp_bpf_map_use { + NFP_MAP_USE_ATOMIC_CNT, + }; + ++struct nfp_bpf_map_word { ++ unsigned char type :4; ++ unsigned char non_zero_update :1; ++}; ++ + /** + * struct nfp_bpf_map - private per-map data attached to BPF maps for offload + * @offmap: pointer to the offloaded BPF map +@@ -219,7 +224,7 @@ struct nfp_bpf_map { + struct nfp_app_bpf *bpf; + u32 tid; + struct list_head l; +- enum nfp_bpf_map_use use_map[]; ++ struct nfp_bpf_map_word use_map[]; + }; + + struct nfp_bpf_neutral_map { +diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c +index 1ccd6371a15b..6140e4650b71 100644 +--- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c ++++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c +@@ -299,10 +299,25 @@ static void nfp_map_bpf_byte_swap(struct nfp_bpf_map *nfp_map, void *value) + unsigned int i; + + for (i = 0; i < DIV_ROUND_UP(nfp_map->offmap->map.value_size, 4); i++) +- if (nfp_map->use_map[i] == NFP_MAP_USE_ATOMIC_CNT) ++ if (nfp_map->use_map[i].type == NFP_MAP_USE_ATOMIC_CNT) + word[i] = (__force u32)cpu_to_be32(word[i]); + } + ++/* Mark value as unsafely initialized in case it becomes atomic later ++ * and we didn't byte swap something non-byte swap neutral. ++ */ ++static void ++nfp_map_bpf_byte_swap_record(struct nfp_bpf_map *nfp_map, void *value) ++{ ++ u32 *word = value; ++ unsigned int i; ++ ++ for (i = 0; i < DIV_ROUND_UP(nfp_map->offmap->map.value_size, 4); i++) ++ if (nfp_map->use_map[i].type == NFP_MAP_UNUSED && ++ word[i] != (__force u32)cpu_to_be32(word[i])) ++ nfp_map->use_map[i].non_zero_update = 1; ++} ++ + static int + nfp_bpf_map_lookup_entry(struct bpf_offloaded_map *offmap, + void *key, void *value) +@@ -322,6 +337,7 @@ nfp_bpf_map_update_entry(struct bpf_offloaded_map *offmap, + void *key, void *value, u64 flags) + { + nfp_map_bpf_byte_swap(offmap->dev_priv, value); ++ nfp_map_bpf_byte_swap_record(offmap->dev_priv, value); + return nfp_bpf_ctrl_update_entry(offmap, key, value, flags); + } + +diff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c +index a6e9248669e1..db7e186dae56 100644 +--- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c ++++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c +@@ -108,6 +108,46 @@ exit_set_location: + nfp_prog->adjust_head_location = location; + } + ++static bool nfp_bpf_map_update_value_ok(struct bpf_verifier_env *env) ++{ ++ const struct bpf_reg_state *reg1 = cur_regs(env) + BPF_REG_1; ++ const struct bpf_reg_state *reg3 = cur_regs(env) + BPF_REG_3; ++ struct bpf_offloaded_map *offmap; ++ struct bpf_func_state *state; ++ struct nfp_bpf_map *nfp_map; ++ int off, i; ++ ++ state = env->cur_state->frame[reg3->frameno]; ++ ++ /* We need to record each time update happens with non-zero words, ++ * in case such word is used in atomic operations. ++ * Implicitly depend on nfp_bpf_stack_arg_ok(reg3) being run before. ++ */ ++ ++ offmap = map_to_offmap(reg1->map_ptr); ++ nfp_map = offmap->dev_priv; ++ off = reg3->off + reg3->var_off.value; ++ ++ for (i = 0; i < offmap->map.value_size; i++) { ++ struct bpf_stack_state *stack_entry; ++ unsigned int soff; ++ ++ soff = -(off + i) - 1; ++ stack_entry = &state->stack[soff / BPF_REG_SIZE]; ++ if (stack_entry->slot_type[soff % BPF_REG_SIZE] == STACK_ZERO) ++ continue; ++ ++ if (nfp_map->use_map[i / 4].type == NFP_MAP_USE_ATOMIC_CNT) { ++ pr_vlog(env, "value at offset %d/%d may be non-zero, bpf_map_update_elem() is required to initialize atomic counters to zero to avoid offload endian issues\n", ++ i, soff); ++ return false; ++ } ++ nfp_map->use_map[i / 4].non_zero_update = 1; ++ } ++ ++ return true; ++} ++ + static int + nfp_bpf_stack_arg_ok(const char *fname, struct bpf_verifier_env *env, + const struct bpf_reg_state *reg, +@@ -198,7 +238,8 @@ nfp_bpf_check_call(struct nfp_prog *nfp_prog, struct bpf_verifier_env *env, + bpf->helpers.map_update, reg1) || + !nfp_bpf_stack_arg_ok("map_update", env, reg2, + meta->func_id ? &meta->arg2 : NULL) || +- !nfp_bpf_stack_arg_ok("map_update", env, reg3, NULL)) ++ !nfp_bpf_stack_arg_ok("map_update", env, reg3, NULL) || ++ !nfp_bpf_map_update_value_ok(env)) + return -EOPNOTSUPP; + break; + +@@ -376,15 +417,22 @@ nfp_bpf_map_mark_used_one(struct bpf_verifier_env *env, + struct nfp_bpf_map *nfp_map, + unsigned int off, enum nfp_bpf_map_use use) + { +- if (nfp_map->use_map[off / 4] != NFP_MAP_UNUSED && +- nfp_map->use_map[off / 4] != use) { ++ if (nfp_map->use_map[off / 4].type != NFP_MAP_UNUSED && ++ nfp_map->use_map[off / 4].type != use) { + pr_vlog(env, "map value use type conflict %s vs %s off: %u\n", +- nfp_bpf_map_use_name(nfp_map->use_map[off / 4]), ++ nfp_bpf_map_use_name(nfp_map->use_map[off / 4].type), + nfp_bpf_map_use_name(use), off); + return -EOPNOTSUPP; + } + +- nfp_map->use_map[off / 4] = use; ++ if (nfp_map->use_map[off / 4].non_zero_update && ++ use == NFP_MAP_USE_ATOMIC_CNT) { ++ pr_vlog(env, "atomic counter in map value may already be initialized to non-zero value off: %u\n", ++ off); ++ return -EOPNOTSUPP; ++ } ++ ++ nfp_map->use_map[off / 4].type = use; + + return 0; + } +diff --git a/drivers/net/ethernet/qlogic/qed/qed.h b/drivers/net/ethernet/qlogic/qed/qed.h +index a60e1c8d470a..32e786a3952b 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed.h ++++ b/drivers/net/ethernet/qlogic/qed/qed.h +@@ -914,7 +914,7 @@ u16 qed_get_cm_pq_idx_llt_mtc(struct qed_hwfn *p_hwfn, u8 tc); + /* Prototypes */ + int qed_fill_dev_info(struct qed_dev *cdev, + struct qed_dev_info *dev_info); +-void qed_link_update(struct qed_hwfn *hwfn); ++void qed_link_update(struct qed_hwfn *hwfn, struct qed_ptt *ptt); + u32 qed_unzip_data(struct qed_hwfn *p_hwfn, + u32 input_len, u8 *input_buf, + u32 max_size, u8 *unzip_buf); +diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c +index 637687b766ff..049a83b40e46 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_main.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_main.c +@@ -1462,6 +1462,7 @@ static int qed_get_link_data(struct qed_hwfn *hwfn, + } + + static void qed_fill_link(struct qed_hwfn *hwfn, ++ struct qed_ptt *ptt, + struct qed_link_output *if_link) + { + struct qed_mcp_link_params params; +@@ -1542,7 +1543,7 @@ static void qed_fill_link(struct qed_hwfn *hwfn, + + /* TODO - fill duplex properly */ + if_link->duplex = DUPLEX_FULL; +- qed_mcp_get_media_type(hwfn->cdev, &media_type); ++ qed_mcp_get_media_type(hwfn, ptt, &media_type); + if_link->port = qed_get_port_type(media_type); + + if_link->autoneg = params.speed.autoneg; +@@ -1598,21 +1599,34 @@ static void qed_fill_link(struct qed_hwfn *hwfn, + static void qed_get_current_link(struct qed_dev *cdev, + struct qed_link_output *if_link) + { ++ struct qed_hwfn *hwfn; ++ struct qed_ptt *ptt; + int i; + +- qed_fill_link(&cdev->hwfns[0], if_link); ++ hwfn = &cdev->hwfns[0]; ++ if (IS_PF(cdev)) { ++ ptt = qed_ptt_acquire(hwfn); ++ if (ptt) { ++ qed_fill_link(hwfn, ptt, if_link); ++ qed_ptt_release(hwfn, ptt); ++ } else { ++ DP_NOTICE(hwfn, "Failed to fill link; No PTT\n"); ++ } ++ } else { ++ qed_fill_link(hwfn, NULL, if_link); ++ } + + for_each_hwfn(cdev, i) + qed_inform_vf_link_state(&cdev->hwfns[i]); + } + +-void qed_link_update(struct qed_hwfn *hwfn) ++void qed_link_update(struct qed_hwfn *hwfn, struct qed_ptt *ptt) + { + void *cookie = hwfn->cdev->ops_cookie; + struct qed_common_cb_ops *op = hwfn->cdev->protocol_ops.common; + struct qed_link_output if_link; + +- qed_fill_link(hwfn, &if_link); ++ qed_fill_link(hwfn, ptt, &if_link); + qed_inform_vf_link_state(hwfn); + + if (IS_LEAD_HWFN(hwfn) && cookie) +diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.c b/drivers/net/ethernet/qlogic/qed/qed_mcp.c +index 58c7eb9d8e1b..938ace333af1 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c +@@ -1382,7 +1382,7 @@ static void qed_mcp_handle_link_change(struct qed_hwfn *p_hwfn, + if (p_hwfn->mcp_info->capabilities & FW_MB_PARAM_FEATURE_SUPPORT_EEE) + qed_mcp_read_eee_config(p_hwfn, p_ptt, p_link); + +- qed_link_update(p_hwfn); ++ qed_link_update(p_hwfn, p_ptt); + out: + spin_unlock_bh(&p_hwfn->mcp_info->link_lock); + } +@@ -1849,12 +1849,10 @@ int qed_mcp_get_mbi_ver(struct qed_hwfn *p_hwfn, + return 0; + } + +-int qed_mcp_get_media_type(struct qed_dev *cdev, u32 *p_media_type) ++int qed_mcp_get_media_type(struct qed_hwfn *p_hwfn, ++ struct qed_ptt *p_ptt, u32 *p_media_type) + { +- struct qed_hwfn *p_hwfn = &cdev->hwfns[0]; +- struct qed_ptt *p_ptt; +- +- if (IS_VF(cdev)) ++ if (IS_VF(p_hwfn->cdev)) + return -EINVAL; + + if (!qed_mcp_is_init(p_hwfn)) { +@@ -1862,16 +1860,15 @@ int qed_mcp_get_media_type(struct qed_dev *cdev, u32 *p_media_type) + return -EBUSY; + } + +- *p_media_type = MEDIA_UNSPECIFIED; +- +- p_ptt = qed_ptt_acquire(p_hwfn); +- if (!p_ptt) +- return -EBUSY; +- +- *p_media_type = qed_rd(p_hwfn, p_ptt, p_hwfn->mcp_info->port_addr + +- offsetof(struct public_port, media_type)); ++ if (!p_ptt) { ++ *p_media_type = MEDIA_UNSPECIFIED; ++ return -EINVAL; ++ } + +- qed_ptt_release(p_hwfn, p_ptt); ++ *p_media_type = qed_rd(p_hwfn, p_ptt, ++ p_hwfn->mcp_info->port_addr + ++ offsetof(struct public_port, ++ media_type)); + + return 0; + } +diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.h b/drivers/net/ethernet/qlogic/qed/qed_mcp.h +index 85e6b3989e7a..80a6b5d1ff33 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_mcp.h ++++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.h +@@ -322,14 +322,15 @@ int qed_mcp_get_mbi_ver(struct qed_hwfn *p_hwfn, + * @brief Get media type value of the port. + * + * @param cdev - qed dev pointer ++ * @param p_ptt + * @param mfw_ver - media type value + * + * @return int - + * 0 - Operation was successul. + * -EBUSY - Operation failed + */ +-int qed_mcp_get_media_type(struct qed_dev *cdev, +- u32 *media_type); ++int qed_mcp_get_media_type(struct qed_hwfn *p_hwfn, ++ struct qed_ptt *p_ptt, u32 *media_type); + + /** + * @brief General function for sending commands to the MCP +diff --git a/drivers/net/ethernet/qlogic/qed/qed_vf.c b/drivers/net/ethernet/qlogic/qed/qed_vf.c +index 6ab3fb008139..5dda547772c1 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_vf.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_vf.c +@@ -1698,7 +1698,7 @@ static void qed_handle_bulletin_change(struct qed_hwfn *hwfn) + ops->ports_update(cookie, vxlan_port, geneve_port); + + /* Always update link configuration according to bulletin */ +- qed_link_update(hwfn); ++ qed_link_update(hwfn, NULL); + } + + void qed_iov_vf_task(struct work_struct *work) +diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c +index 4b76c69fe86d..834208e55f7b 100644 +--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c ++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c +@@ -883,7 +883,7 @@ static u8 qlcnic_dcb_get_capability(struct net_device *netdev, int capid, + struct qlcnic_adapter *adapter = netdev_priv(netdev); + + if (!test_bit(QLCNIC_DCB_STATE, &adapter->dcb->state)) +- return 0; ++ return 1; + + switch (capid) { + case DCB_CAP_ATTR_PG: +diff --git a/drivers/net/ethernet/sfc/ptp.c b/drivers/net/ethernet/sfc/ptp.c +index f21661532ed3..cc8fbf398c0d 100644 +--- a/drivers/net/ethernet/sfc/ptp.c ++++ b/drivers/net/ethernet/sfc/ptp.c +@@ -1534,7 +1534,8 @@ void efx_ptp_remove(struct efx_nic *efx) + (void)efx_ptp_disable(efx); + + cancel_work_sync(&efx->ptp_data->work); +- cancel_work_sync(&efx->ptp_data->pps_work); ++ if (efx->ptp_data->pps_workwq) ++ cancel_work_sync(&efx->ptp_data->pps_work); + + skb_queue_purge(&efx->ptp_data->rxq); + skb_queue_purge(&efx->ptp_data->txq); +diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c +index d2caeb9edc04..28d582c18afb 100644 +--- a/drivers/net/ethernet/socionext/netsec.c ++++ b/drivers/net/ethernet/socionext/netsec.c +@@ -274,6 +274,7 @@ struct netsec_priv { + struct clk *clk; + u32 msg_enable; + u32 freq; ++ u32 phy_addr; + bool rx_cksum_offload_flag; + }; + +@@ -1346,11 +1347,11 @@ static int netsec_netdev_stop(struct net_device *ndev) + netsec_uninit_pkt_dring(priv, NETSEC_RING_TX); + netsec_uninit_pkt_dring(priv, NETSEC_RING_RX); + +- ret = netsec_reset_hardware(priv, false); +- + phy_stop(ndev->phydev); + phy_disconnect(ndev->phydev); + ++ ret = netsec_reset_hardware(priv, false); ++ + pm_runtime_put_sync(priv->dev); + + return ret; +@@ -1360,6 +1361,7 @@ static int netsec_netdev_init(struct net_device *ndev) + { + struct netsec_priv *priv = netdev_priv(ndev); + int ret; ++ u16 data; + + ret = netsec_alloc_dring(priv, NETSEC_RING_TX); + if (ret) +@@ -1369,6 +1371,11 @@ static int netsec_netdev_init(struct net_device *ndev) + if (ret) + goto err1; + ++ /* set phy power down */ ++ data = netsec_phy_read(priv->mii_bus, priv->phy_addr, MII_BMCR) | ++ BMCR_PDOWN; ++ netsec_phy_write(priv->mii_bus, priv->phy_addr, MII_BMCR, data); ++ + ret = netsec_reset_hardware(priv, true); + if (ret) + goto err2; +@@ -1418,7 +1425,7 @@ static const struct net_device_ops netsec_netdev_ops = { + }; + + static int netsec_of_probe(struct platform_device *pdev, +- struct netsec_priv *priv) ++ struct netsec_priv *priv, u32 *phy_addr) + { + priv->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0); + if (!priv->phy_np) { +@@ -1426,6 +1433,8 @@ static int netsec_of_probe(struct platform_device *pdev, + return -EINVAL; + } + ++ *phy_addr = of_mdio_parse_addr(&pdev->dev, priv->phy_np); ++ + priv->clk = devm_clk_get(&pdev->dev, NULL); /* get by 'phy_ref_clk' */ + if (IS_ERR(priv->clk)) { + dev_err(&pdev->dev, "phy_ref_clk not found\n"); +@@ -1626,12 +1635,14 @@ static int netsec_probe(struct platform_device *pdev) + } + + if (dev_of_node(&pdev->dev)) +- ret = netsec_of_probe(pdev, priv); ++ ret = netsec_of_probe(pdev, priv, &phy_addr); + else + ret = netsec_acpi_probe(pdev, priv, &phy_addr); + if (ret) + goto free_ndev; + ++ priv->phy_addr = phy_addr; ++ + if (!priv->freq) { + dev_err(&pdev->dev, "missing PHY reference clock frequency\n"); + ret = -ENODEV; +diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c +index 1afed85550c0..8417d4c17844 100644 +--- a/drivers/net/ethernet/ti/cpsw.c ++++ b/drivers/net/ethernet/ti/cpsw.c +@@ -642,6 +642,7 @@ static void cpsw_set_promiscious(struct net_device *ndev, bool enable) + + /* Clear all mcast from ALE */ + cpsw_ale_flush_multicast(ale, ALE_ALL_PORTS, -1); ++ __dev_mc_unsync(ndev, NULL); + + /* Flood All Unicast Packets to Host port */ + cpsw_ale_control_set(ale, 0, ALE_P0_UNI_FLOOD, 1); +diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c +index 05115fb0c97a..10a8ef2d025a 100644 +--- a/drivers/net/macsec.c ++++ b/drivers/net/macsec.c +@@ -2813,9 +2813,6 @@ static int macsec_dev_open(struct net_device *dev) + struct net_device *real_dev = macsec->real_dev; + int err; + +- if (!(real_dev->flags & IFF_UP)) +- return -ENETDOWN; +- + err = dev_uc_add(real_dev, dev->dev_addr); + if (err < 0) + return err; +@@ -3305,6 +3302,9 @@ static int macsec_newlink(struct net *net, struct net_device *dev, + if (err < 0) + goto del_dev; + ++ netif_stacked_transfer_operstate(real_dev, dev); ++ linkwatch_fire_event(dev); ++ + macsec_generation++; + + return 0; +@@ -3489,6 +3489,20 @@ static int macsec_notify(struct notifier_block *this, unsigned long event, + return NOTIFY_DONE; + + switch (event) { ++ case NETDEV_DOWN: ++ case NETDEV_UP: ++ case NETDEV_CHANGE: { ++ struct macsec_dev *m, *n; ++ struct macsec_rxh_data *rxd; ++ ++ rxd = macsec_data_rtnl(real_dev); ++ list_for_each_entry_safe(m, n, &rxd->secys, secys) { ++ struct net_device *dev = m->secy.netdev; ++ ++ netif_stacked_transfer_operstate(real_dev, dev); ++ } ++ break; ++ } + case NETDEV_UNREGISTER: { + struct macsec_dev *m, *n; + struct macsec_rxh_data *rxd; +diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c +index b12023bc2cab..df8d49ad48c3 100644 +--- a/drivers/net/ntb_netdev.c ++++ b/drivers/net/ntb_netdev.c +@@ -236,7 +236,7 @@ static void ntb_netdev_tx_timer(struct timer_list *t) + struct net_device *ndev = dev->ndev; + + if (ntb_transport_tx_free_entry(dev->qp) < tx_stop) { +- mod_timer(&dev->tx_timer, jiffies + msecs_to_jiffies(tx_time)); ++ mod_timer(&dev->tx_timer, jiffies + usecs_to_jiffies(tx_time)); + } else { + /* Make sure anybody stopping the queue after this sees the new + * value of ntb_transport_tx_free_entry() +diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c +index e4bf9e7d7583..eeadfde15940 100644 +--- a/drivers/net/phy/dp83867.c ++++ b/drivers/net/phy/dp83867.c +@@ -33,10 +33,18 @@ + + /* Extended Registers */ + #define DP83867_CFG4 0x0031 ++#define DP83867_CFG4_SGMII_ANEG_MASK (BIT(5) | BIT(6)) ++#define DP83867_CFG4_SGMII_ANEG_TIMER_11MS (3 << 5) ++#define DP83867_CFG4_SGMII_ANEG_TIMER_800US (2 << 5) ++#define DP83867_CFG4_SGMII_ANEG_TIMER_2US (1 << 5) ++#define DP83867_CFG4_SGMII_ANEG_TIMER_16MS (0 << 5) ++ + #define DP83867_RGMIICTL 0x0032 + #define DP83867_STRAP_STS1 0x006E + #define DP83867_RGMIIDCTL 0x0086 + #define DP83867_IO_MUX_CFG 0x0170 ++#define DP83867_10M_SGMII_CFG 0x016F ++#define DP83867_10M_SGMII_RATE_ADAPT_MASK BIT(7) + + #define DP83867_SW_RESET BIT(15) + #define DP83867_SW_RESTART BIT(14) +@@ -294,6 +302,35 @@ static int dp83867_config_init(struct phy_device *phydev) + } + } + ++ if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { ++ /* For support SPEED_10 in SGMII mode ++ * DP83867_10M_SGMII_RATE_ADAPT bit ++ * has to be cleared by software. That ++ * does not affect SPEED_100 and ++ * SPEED_1000. ++ */ ++ val = phy_read_mmd(phydev, DP83867_DEVADDR, ++ DP83867_10M_SGMII_CFG); ++ val &= ~DP83867_10M_SGMII_RATE_ADAPT_MASK; ++ ret = phy_write_mmd(phydev, DP83867_DEVADDR, ++ DP83867_10M_SGMII_CFG, val); ++ ++ if (ret) ++ return ret; ++ ++ /* After reset SGMII Autoneg timer is set to 2us (bits 6 and 5 ++ * are 01). That is not enough to finalize autoneg on some ++ * devices. Increase this timer duration to maximum 16ms. ++ */ ++ val = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4); ++ val &= ~DP83867_CFG4_SGMII_ANEG_MASK; ++ val |= DP83867_CFG4_SGMII_ANEG_TIMER_16MS; ++ ret = phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4, val); ++ ++ if (ret) ++ return ret; ++ } ++ + /* Enable Interrupt output INT_OE in CFG3 register */ + if (phy_interrupt_is_valid(phydev)) { + val = phy_read(phydev, DP83867_CFG3); +diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c +index 9f895083bc0a..7f5ee6bb4430 100644 +--- a/drivers/net/vrf.c ++++ b/drivers/net/vrf.c +@@ -993,24 +993,23 @@ static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev, + struct sk_buff *skb) + { + int orig_iif = skb->skb_iif; +- bool need_strict; ++ bool need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr); ++ bool is_ndisc = ipv6_ndisc_frame(skb); + +- /* loopback traffic; do not push through packet taps again. +- * Reset pkt_type for upper layers to process skb ++ /* loopback, multicast & non-ND link-local traffic; do not push through ++ * packet taps again. Reset pkt_type for upper layers to process skb + */ +- if (skb->pkt_type == PACKET_LOOPBACK) { ++ if (skb->pkt_type == PACKET_LOOPBACK || (need_strict && !is_ndisc)) { + skb->dev = vrf_dev; + skb->skb_iif = vrf_dev->ifindex; + IP6CB(skb)->flags |= IP6SKB_L3SLAVE; +- skb->pkt_type = PACKET_HOST; ++ if (skb->pkt_type == PACKET_LOOPBACK) ++ skb->pkt_type = PACKET_HOST; + goto out; + } + +- /* if packet is NDISC or addressed to multicast or link-local +- * then keep the ingress interface +- */ +- need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr); +- if (!ipv6_ndisc_frame(skb) && !need_strict) { ++ /* if packet is NDISC then keep the ingress interface */ ++ if (!is_ndisc) { + vrf_rx_stats(vrf_dev, skb->len); + skb->dev = vrf_dev; + skb->skb_iif = vrf_dev->ifindex; +diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c +index d3d33cc2adfd..613ca74f1b28 100644 +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -4686,6 +4686,14 @@ static int ath10k_start(struct ieee80211_hw *hw) + goto err_core_stop; + } + ++ if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { ++ ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr); ++ if (ret) { ++ ath10k_err(ar, "failed to set prob req oui: %i\n", ret); ++ goto err_core_stop; ++ } ++ } ++ + if (test_bit(WMI_SERVICE_ADAPTIVE_OCS, ar->wmi.svc_map)) { + ret = ath10k_wmi_adaptive_qcs(ar, true); + if (ret) { +@@ -8551,12 +8559,6 @@ int ath10k_mac_register(struct ath10k *ar) + } + + if (test_bit(WMI_SERVICE_SPOOF_MAC_SUPPORT, ar->wmi.svc_map)) { +- ret = ath10k_wmi_scan_prob_req_oui(ar, ar->mac_addr); +- if (ret) { +- ath10k_err(ar, "failed to set prob req oui: %i\n", ret); +- goto err_dfs_detector_exit; +- } +- + ar->hw->wiphy->features |= + NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR; + } +diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c +index 97fa5c74f2fe..50a801a5d4f1 100644 +--- a/drivers/net/wireless/ath/ath10k/pci.c ++++ b/drivers/net/wireless/ath/ath10k/pci.c +@@ -1054,10 +1054,9 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address, + struct ath10k_ce *ce = ath10k_ce_priv(ar); + int ret = 0; + u32 *buf; +- unsigned int completed_nbytes, orig_nbytes, remaining_bytes; ++ unsigned int completed_nbytes, alloc_nbytes, remaining_bytes; + struct ath10k_ce_pipe *ce_diag; + void *data_buf = NULL; +- u32 ce_data; /* Host buffer address in CE space */ + dma_addr_t ce_data_base = 0; + int i; + +@@ -1071,9 +1070,10 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address, + * 1) 4-byte alignment + * 2) Buffer in DMA-able space + */ +- orig_nbytes = nbytes; ++ alloc_nbytes = min_t(unsigned int, nbytes, DIAG_TRANSFER_LIMIT); ++ + data_buf = (unsigned char *)dma_alloc_coherent(ar->dev, +- orig_nbytes, ++ alloc_nbytes, + &ce_data_base, + GFP_ATOMIC); + if (!data_buf) { +@@ -1081,9 +1081,6 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address, + goto done; + } + +- /* Copy caller's data to allocated DMA buf */ +- memcpy(data_buf, data, orig_nbytes); +- + /* + * The address supplied by the caller is in the + * Target CPU virtual address space. +@@ -1096,12 +1093,14 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address, + */ + address = ath10k_pci_targ_cpu_to_ce_addr(ar, address); + +- remaining_bytes = orig_nbytes; +- ce_data = ce_data_base; ++ remaining_bytes = nbytes; + while (remaining_bytes) { + /* FIXME: check cast */ + nbytes = min_t(int, remaining_bytes, DIAG_TRANSFER_LIMIT); + ++ /* Copy caller's data to allocated DMA buf */ ++ memcpy(data_buf, data, nbytes); ++ + /* Set up to receive directly into Target(!) address */ + ret = ce_diag->ops->ce_rx_post_buf(ce_diag, &address, address); + if (ret != 0) +@@ -1111,7 +1110,7 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address, + * Request CE to send caller-supplied data that + * was copied to bounce buffer to Target(!) address. + */ +- ret = ath10k_ce_send_nolock(ce_diag, NULL, (u32)ce_data, ++ ret = ath10k_ce_send_nolock(ce_diag, NULL, ce_data_base, + nbytes, 0, 0); + if (ret != 0) + goto done; +@@ -1152,12 +1151,12 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address, + + remaining_bytes -= nbytes; + address += nbytes; +- ce_data += nbytes; ++ data += nbytes; + } + + done: + if (data_buf) { +- dma_free_coherent(ar->dev, orig_nbytes, data_buf, ++ dma_free_coherent(ar->dev, alloc_nbytes, data_buf, + ce_data_base); + } + +diff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c +index fa1843a7e0fd..e2d78f77edb7 100644 +--- a/drivers/net/wireless/ath/ath10k/snoc.c ++++ b/drivers/net/wireless/ath/ath10k/snoc.c +@@ -1190,7 +1190,7 @@ static int ath10k_wcn3990_clk_init(struct ath10k *ar) + return 0; + + err_clock_config: +- for (; i >= 0; i--) { ++ for (i = i - 1; i >= 0; i--) { + clk_info = &ar_snoc->clk[i]; + + if (!clk_info->handle) +diff --git a/drivers/net/wireless/ath/ath10k/usb.c b/drivers/net/wireless/ath/ath10k/usb.c +index f09a4ad2e9de..f9c79e21ab22 100644 +--- a/drivers/net/wireless/ath/ath10k/usb.c ++++ b/drivers/net/wireless/ath/ath10k/usb.c +@@ -49,6 +49,10 @@ ath10k_usb_alloc_urb_from_pipe(struct ath10k_usb_pipe *pipe) + struct ath10k_urb_context *urb_context = NULL; + unsigned long flags; + ++ /* bail if this pipe is not initialized */ ++ if (!pipe->ar_usb) ++ return NULL; ++ + spin_lock_irqsave(&pipe->ar_usb->cs_lock, flags); + if (!list_empty(&pipe->urb_list_head)) { + urb_context = list_first_entry(&pipe->urb_list_head, +@@ -66,6 +70,10 @@ static void ath10k_usb_free_urb_to_pipe(struct ath10k_usb_pipe *pipe, + { + unsigned long flags; + ++ /* bail if this pipe is not initialized */ ++ if (!pipe->ar_usb) ++ return; ++ + spin_lock_irqsave(&pipe->ar_usb->cs_lock, flags); + + pipe->urb_cnt++; +diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +index f019a20e5a1f..983e1abbd9e4 100644 +--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +@@ -4183,7 +4183,7 @@ static void ar9003_hw_thermometer_apply(struct ath_hw *ah) + + static void ar9003_hw_thermo_cal_apply(struct ath_hw *ah) + { +- u32 data, ko, kg; ++ u32 data = 0, ko, kg; + + if (!AR_SREV_9462_20_OR_LATER(ah)) + return; +diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c +index ceace95b1595..44296c015925 100644 +--- a/drivers/net/wireless/ath/wil6210/debugfs.c ++++ b/drivers/net/wireless/ath/wil6210/debugfs.c +@@ -662,10 +662,10 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf, + enum { max_count = 4096 }; + struct wil_blob_wrapper *wil_blob = file->private_data; + struct wil6210_priv *wil = wil_blob->wil; +- loff_t pos = *ppos; ++ loff_t aligned_pos, pos = *ppos; + size_t available = wil_blob->blob.size; + void *buf; +- size_t ret; ++ size_t unaligned_bytes, aligned_count, ret; + int rc; + + if (test_bit(wil_status_suspending, wil_blob->wil->status) || +@@ -683,7 +683,12 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf, + if (count > max_count) + count = max_count; + +- buf = kmalloc(count, GFP_KERNEL); ++ /* set pos to 4 bytes aligned */ ++ unaligned_bytes = pos % 4; ++ aligned_pos = pos - unaligned_bytes; ++ aligned_count = count + unaligned_bytes; ++ ++ buf = kmalloc(aligned_count, GFP_KERNEL); + if (!buf) + return -ENOMEM; + +@@ -694,9 +699,9 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf, + } + + wil_memcpy_fromio_32(buf, (const void __iomem *) +- wil_blob->blob.data + pos, count); ++ wil_blob->blob.data + aligned_pos, aligned_count); + +- ret = copy_to_user(user_buf, buf, count); ++ ret = copy_to_user(user_buf, buf + unaligned_bytes, count); + + wil_pm_runtime_put(wil); + +diff --git a/drivers/net/wireless/ath/wil6210/main.c b/drivers/net/wireless/ath/wil6210/main.c +index 920cb233f4db..10673fa9388e 100644 +--- a/drivers/net/wireless/ath/wil6210/main.c ++++ b/drivers/net/wireless/ath/wil6210/main.c +@@ -1397,8 +1397,15 @@ static void wil_pre_fw_config(struct wil6210_priv *wil) + wil6210_clear_irq(wil); + /* CAF_ICR - clear and mask */ + /* it is W1C, clear by writing back same value */ +- wil_s(wil, RGF_CAF_ICR + offsetof(struct RGF_ICR, ICR), 0); +- wil_w(wil, RGF_CAF_ICR + offsetof(struct RGF_ICR, IMV), ~0); ++ if (wil->hw_version < HW_VER_TALYN_MB) { ++ wil_s(wil, RGF_CAF_ICR + offsetof(struct RGF_ICR, ICR), 0); ++ wil_w(wil, RGF_CAF_ICR + offsetof(struct RGF_ICR, IMV), ~0); ++ } else { ++ wil_s(wil, ++ RGF_CAF_ICR_TALYN_MB + offsetof(struct RGF_ICR, ICR), 0); ++ wil_w(wil, RGF_CAF_ICR_TALYN_MB + ++ offsetof(struct RGF_ICR, IMV), ~0); ++ } + /* clear PAL_UNIT_ICR (potential D0->D3 leftover) + * In Talyn-MB host cannot access this register due to + * access control, hence PAL_UNIT_ICR is cleared by the FW +diff --git a/drivers/net/wireless/ath/wil6210/txrx_edma.c b/drivers/net/wireless/ath/wil6210/txrx_edma.c +index 409a6fa8b6c8..5fa8d6ad6648 100644 +--- a/drivers/net/wireless/ath/wil6210/txrx_edma.c ++++ b/drivers/net/wireless/ath/wil6210/txrx_edma.c +@@ -808,23 +808,24 @@ static int wil_rx_error_check_edma(struct wil6210_priv *wil, + wil_dbg_txrx(wil, "L2 RX error, l2_rx_status=0x%x\n", + l2_rx_status); + /* Due to HW issue, KEY error will trigger a MIC error */ +- if (l2_rx_status & WIL_RX_EDMA_ERROR_MIC) { +- wil_dbg_txrx(wil, +- "L2 MIC/KEY error, dropping packet\n"); ++ if (l2_rx_status == WIL_RX_EDMA_ERROR_MIC) { ++ wil_err_ratelimited(wil, ++ "L2 MIC/KEY error, dropping packet\n"); + stats->rx_mic_error++; + } +- if (l2_rx_status & WIL_RX_EDMA_ERROR_KEY) { +- wil_dbg_txrx(wil, "L2 KEY error, dropping packet\n"); ++ if (l2_rx_status == WIL_RX_EDMA_ERROR_KEY) { ++ wil_err_ratelimited(wil, ++ "L2 KEY error, dropping packet\n"); + stats->rx_key_error++; + } +- if (l2_rx_status & WIL_RX_EDMA_ERROR_REPLAY) { +- wil_dbg_txrx(wil, +- "L2 REPLAY error, dropping packet\n"); ++ if (l2_rx_status == WIL_RX_EDMA_ERROR_REPLAY) { ++ wil_err_ratelimited(wil, ++ "L2 REPLAY error, dropping packet\n"); + stats->rx_replay++; + } +- if (l2_rx_status & WIL_RX_EDMA_ERROR_AMSDU) { +- wil_dbg_txrx(wil, +- "L2 AMSDU error, dropping packet\n"); ++ if (l2_rx_status == WIL_RX_EDMA_ERROR_AMSDU) { ++ wil_err_ratelimited(wil, ++ "L2 AMSDU error, dropping packet\n"); + stats->rx_amsdu_error++; + } + return -EFAULT; +diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h b/drivers/net/wireless/ath/wil6210/wil6210.h +index 17c294b1ead1..75fe1a3b7046 100644 +--- a/drivers/net/wireless/ath/wil6210/wil6210.h ++++ b/drivers/net/wireless/ath/wil6210/wil6210.h +@@ -319,6 +319,7 @@ struct RGF_ICR { + /* MAC timer, usec, for packet lifetime */ + #define RGF_MAC_MTRL_COUNTER_0 (0x886aa8) + ++#define RGF_CAF_ICR_TALYN_MB (0x8893d4) /* struct RGF_ICR */ + #define RGF_CAF_ICR (0x88946c) /* struct RGF_ICR */ + #define RGF_CAF_OSC_CONTROL (0x88afa4) + #define BIT_CAF_OSC_XTAL_EN BIT(0) +diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c +index 2010f771478d..8a603432f531 100644 +--- a/drivers/net/wireless/ath/wil6210/wmi.c ++++ b/drivers/net/wireless/ath/wil6210/wmi.c +@@ -1639,16 +1639,17 @@ int wmi_call(struct wil6210_priv *wil, u16 cmdid, u8 mid, void *buf, u16 len, + { + int rc; + unsigned long remain; ++ ulong flags; + + mutex_lock(&wil->wmi_mutex); + +- spin_lock(&wil->wmi_ev_lock); ++ spin_lock_irqsave(&wil->wmi_ev_lock, flags); + wil->reply_id = reply_id; + wil->reply_mid = mid; + wil->reply_buf = reply; + wil->reply_size = reply_size; + reinit_completion(&wil->wmi_call); +- spin_unlock(&wil->wmi_ev_lock); ++ spin_unlock_irqrestore(&wil->wmi_ev_lock, flags); + + rc = __wmi_send(wil, cmdid, mid, buf, len); + if (rc) +@@ -1668,12 +1669,12 @@ int wmi_call(struct wil6210_priv *wil, u16 cmdid, u8 mid, void *buf, u16 len, + } + + out: +- spin_lock(&wil->wmi_ev_lock); ++ spin_lock_irqsave(&wil->wmi_ev_lock, flags); + wil->reply_id = 0; + wil->reply_mid = U8_MAX; + wil->reply_buf = NULL; + wil->reply_size = 0; +- spin_unlock(&wil->wmi_ev_lock); ++ spin_unlock_irqrestore(&wil->wmi_ev_lock, flags); + + mutex_unlock(&wil->wmi_mutex); + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c +index 6255fb6d97a7..6188275b17e5 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c +@@ -502,6 +502,7 @@ brcms_ops_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) + } + + spin_lock_bh(&wl->lock); ++ wl->wlc->vif = vif; + wl->mute_tx = false; + brcms_c_mute(wl->wlc, false); + if (vif->type == NL80211_IFTYPE_STATION) +@@ -519,6 +520,11 @@ brcms_ops_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) + static void + brcms_ops_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) + { ++ struct brcms_info *wl = hw->priv; ++ ++ spin_lock_bh(&wl->lock); ++ wl->wlc->vif = NULL; ++ spin_unlock_bh(&wl->lock); + } + + static int brcms_ops_config(struct ieee80211_hw *hw, u32 changed) +@@ -840,8 +846,8 @@ brcms_ops_ampdu_action(struct ieee80211_hw *hw, + status = brcms_c_aggregatable(wl->wlc, tid); + spin_unlock_bh(&wl->lock); + if (!status) { +- brcms_err(wl->wlc->hw->d11core, +- "START: tid %d is not agg\'able\n", tid); ++ brcms_dbg_ht(wl->wlc->hw->d11core, ++ "START: tid %d is not agg\'able\n", tid); + return -EINVAL; + } + ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid); +@@ -937,6 +943,25 @@ static void brcms_ops_set_tsf(struct ieee80211_hw *hw, + spin_unlock_bh(&wl->lock); + } + ++static int brcms_ops_beacon_set_tim(struct ieee80211_hw *hw, ++ struct ieee80211_sta *sta, bool set) ++{ ++ struct brcms_info *wl = hw->priv; ++ struct sk_buff *beacon = NULL; ++ u16 tim_offset = 0; ++ ++ spin_lock_bh(&wl->lock); ++ if (wl->wlc->vif) ++ beacon = ieee80211_beacon_get_tim(hw, wl->wlc->vif, ++ &tim_offset, NULL); ++ if (beacon) ++ brcms_c_set_new_beacon(wl->wlc, beacon, tim_offset, ++ wl->wlc->vif->bss_conf.dtim_period); ++ spin_unlock_bh(&wl->lock); ++ ++ return 0; ++} ++ + static const struct ieee80211_ops brcms_ops = { + .tx = brcms_ops_tx, + .start = brcms_ops_start, +@@ -955,6 +980,7 @@ static const struct ieee80211_ops brcms_ops = { + .flush = brcms_ops_flush, + .get_tsf = brcms_ops_get_tsf, + .set_tsf = brcms_ops_set_tsf, ++ .set_tim = brcms_ops_beacon_set_tim, + }; + + void brcms_dpc(unsigned long data) +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h +index c4d135cff04a..9f76b880814e 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/main.h +@@ -563,6 +563,7 @@ struct brcms_c_info { + + struct wiphy *wiphy; + struct scb pri_scb; ++ struct ieee80211_vif *vif; + + struct sk_buff *beacon; + u16 beacon_tim_offset; +diff --git a/drivers/net/wireless/cisco/airo.c b/drivers/net/wireless/cisco/airo.c +index 04dd7a936593..5512c7f73fce 100644 +--- a/drivers/net/wireless/cisco/airo.c ++++ b/drivers/net/wireless/cisco/airo.c +@@ -5462,7 +5462,7 @@ static int proc_BSSList_open( struct inode *inode, struct file *file ) { + we have to add a spin lock... */ + rc = readBSSListRid(ai, doLoseSync, &BSSList_rid); + while(rc == 0 && BSSList_rid.index != cpu_to_le16(0xffff)) { +- ptr += sprintf(ptr, "%pM %*s rssi = %d", ++ ptr += sprintf(ptr, "%pM %.*s rssi = %d", + BSSList_rid.bssid, + (int)BSSList_rid.ssidLen, + BSSList_rid.ssid, +diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c +index 47ec5293c045..7b74ef71bef1 100644 +--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c ++++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c +@@ -376,11 +376,20 @@ mwifiex_cfg80211_set_tx_power(struct wiphy *wiphy, + struct mwifiex_power_cfg power_cfg; + int dbm = MBM_TO_DBM(mbm); + +- if (type == NL80211_TX_POWER_FIXED) { ++ switch (type) { ++ case NL80211_TX_POWER_FIXED: + power_cfg.is_power_auto = 0; ++ power_cfg.is_power_fixed = 1; + power_cfg.power_level = dbm; +- } else { ++ break; ++ case NL80211_TX_POWER_LIMITED: ++ power_cfg.is_power_auto = 0; ++ power_cfg.is_power_fixed = 0; ++ power_cfg.power_level = dbm; ++ break; ++ case NL80211_TX_POWER_AUTOMATIC: + power_cfg.is_power_auto = 1; ++ break; + } + + priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY); +diff --git a/drivers/net/wireless/marvell/mwifiex/ioctl.h b/drivers/net/wireless/marvell/mwifiex/ioctl.h +index 48e154e1865d..0dd592ea6e83 100644 +--- a/drivers/net/wireless/marvell/mwifiex/ioctl.h ++++ b/drivers/net/wireless/marvell/mwifiex/ioctl.h +@@ -267,6 +267,7 @@ struct mwifiex_ds_encrypt_key { + + struct mwifiex_power_cfg { + u32 is_power_auto; ++ u32 is_power_fixed; + u32 power_level; + }; + +diff --git a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c +index 843d65bba181..74e50566db1f 100644 +--- a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c ++++ b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c +@@ -688,6 +688,9 @@ int mwifiex_set_tx_power(struct mwifiex_private *priv, + txp_cfg = (struct host_cmd_ds_txpwr_cfg *) buf; + txp_cfg->action = cpu_to_le16(HostCmd_ACT_GEN_SET); + if (!power_cfg->is_power_auto) { ++ u16 dbm_min = power_cfg->is_power_fixed ? ++ dbm : priv->min_tx_power_level; ++ + txp_cfg->mode = cpu_to_le32(1); + pg_tlv = (struct mwifiex_types_power_group *) + (buf + sizeof(struct host_cmd_ds_txpwr_cfg)); +@@ -702,7 +705,7 @@ int mwifiex_set_tx_power(struct mwifiex_private *priv, + pg->last_rate_code = 0x03; + pg->modulation_class = MOD_CLASS_HR_DSSS; + pg->power_step = 0; +- pg->power_min = (s8) dbm; ++ pg->power_min = (s8) dbm_min; + pg->power_max = (s8) dbm; + pg++; + /* Power group for modulation class OFDM */ +@@ -710,7 +713,7 @@ int mwifiex_set_tx_power(struct mwifiex_private *priv, + pg->last_rate_code = 0x07; + pg->modulation_class = MOD_CLASS_OFDM; + pg->power_step = 0; +- pg->power_min = (s8) dbm; ++ pg->power_min = (s8) dbm_min; + pg->power_max = (s8) dbm; + pg++; + /* Power group for modulation class HTBW20 */ +@@ -718,7 +721,7 @@ int mwifiex_set_tx_power(struct mwifiex_private *priv, + pg->last_rate_code = 0x20; + pg->modulation_class = MOD_CLASS_HT; + pg->power_step = 0; +- pg->power_min = (s8) dbm; ++ pg->power_min = (s8) dbm_min; + pg->power_max = (s8) dbm; + pg->ht_bandwidth = HT_BW_20; + pg++; +@@ -727,7 +730,7 @@ int mwifiex_set_tx_power(struct mwifiex_private *priv, + pg->last_rate_code = 0x20; + pg->modulation_class = MOD_CLASS_HT; + pg->power_step = 0; +- pg->power_min = (s8) dbm; ++ pg->power_min = (s8) dbm_min; + pg->power_max = (s8) dbm; + pg->ht_bandwidth = HT_BW_40; + } +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c b/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +index 14e8c575f6c3..924c761f34fd 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +@@ -793,9 +793,8 @@ void mt76x0_phy_recalibrate_after_assoc(struct mt76x0_dev *dev) + mt76_wr(dev, MT_TX_ALC_CFG_0, 0); + usleep_range(500, 700); + +- reg_val = mt76_rr(dev, 0x2124); +- reg_val &= 0xffffff7e; +- mt76_wr(dev, 0x2124, reg_val); ++ reg_val = mt76_rr(dev, MT_BBP(IBI, 9)); ++ mt76_wr(dev, MT_BBP(IBI, 9), 0xffffff7e); + + mt76x0_mcu_calibrate(dev, MCU_CAL_RXDCOC, 0); + +@@ -806,7 +805,7 @@ void mt76x0_phy_recalibrate_after_assoc(struct mt76x0_dev *dev) + mt76x0_mcu_calibrate(dev, MCU_CAL_RXIQ, is_5ghz); + mt76x0_mcu_calibrate(dev, MCU_CAL_RX_GROUP_DELAY, is_5ghz); + +- mt76_wr(dev, 0x2124, reg_val); ++ mt76_wr(dev, MT_BBP(IBI, 9), reg_val); + mt76_wr(dev, MT_TX_ALC_CFG_0, tx_alc); + msleep(100); + +diff --git a/drivers/net/wireless/mediatek/mt76/tx.c b/drivers/net/wireless/mediatek/mt76/tx.c +index 20447fdce4c3..227e5ebfe3dc 100644 +--- a/drivers/net/wireless/mediatek/mt76/tx.c ++++ b/drivers/net/wireless/mediatek/mt76/tx.c +@@ -148,7 +148,8 @@ mt76_check_agg_ssn(struct mt76_txq *mtxq, struct sk_buff *skb) + { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; + +- if (!ieee80211_is_data_qos(hdr->frame_control)) ++ if (!ieee80211_is_data_qos(hdr->frame_control) || ++ !ieee80211_is_data_present(hdr->frame_control)) + return; + + mtxq->agg_ssn = le16_to_cpu(hdr->seq_ctrl) + 0x10; +diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +index 505ab1b055ff..2b4fcdf4ec5b 100644 +--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c ++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +@@ -5691,6 +5691,7 @@ static int rtl8xxxu_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, + break; + case WLAN_CIPHER_SUITE_TKIP: + key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; ++ break; + default: + return -EOPNOTSUPP; + } +diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/fw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/fw.c +index 85cedd083d2b..75bfa9dfef4a 100644 +--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/fw.c ++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/fw.c +@@ -173,7 +173,7 @@ static int _rtl92d_fw_init(struct ieee80211_hw *hw) + rtl_read_byte(rtlpriv, FW_MAC1_READY)); + } + RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, +- "Polling FW ready fail!! REG_MCUFWDL:0x%08ul\n", ++ "Polling FW ready fail!! REG_MCUFWDL:0x%08x\n", + rtl_read_dword(rtlpriv, REG_MCUFWDL)); + return -1; + } +diff --git a/drivers/net/wireless/ti/wlcore/vendor_cmd.c b/drivers/net/wireless/ti/wlcore/vendor_cmd.c +index dbe78d8491ef..7f34ec077ee5 100644 +--- a/drivers/net/wireless/ti/wlcore/vendor_cmd.c ++++ b/drivers/net/wireless/ti/wlcore/vendor_cmd.c +@@ -70,7 +70,7 @@ wlcore_vendor_cmd_smart_config_start(struct wiphy *wiphy, + out: + mutex_unlock(&wl->mutex); + +- return 0; ++ return ret; + } + + static int +diff --git a/drivers/nfc/port100.c b/drivers/nfc/port100.c +index bb43cebda9dc..60ae382f50da 100644 +--- a/drivers/nfc/port100.c ++++ b/drivers/nfc/port100.c +@@ -792,7 +792,7 @@ static int port100_send_frame_async(struct port100 *dev, struct sk_buff *out, + + rc = port100_submit_urb_for_ack(dev, GFP_KERNEL); + if (rc) +- usb_unlink_urb(dev->out_urb); ++ usb_kill_urb(dev->out_urb); + + exit: + mutex_unlock(&dev->out_urb_lock); +diff --git a/drivers/ntb/hw/intel/ntb_hw_gen1.c b/drivers/ntb/hw/intel/ntb_hw_gen1.c +index 6aa573227279..2ad263f708da 100644 +--- a/drivers/ntb/hw/intel/ntb_hw_gen1.c ++++ b/drivers/ntb/hw/intel/ntb_hw_gen1.c +@@ -265,7 +265,7 @@ static inline int ndev_db_clear_mask(struct intel_ntb_dev *ndev, u64 db_bits, + return 0; + } + +-static inline int ndev_vec_mask(struct intel_ntb_dev *ndev, int db_vector) ++static inline u64 ndev_vec_mask(struct intel_ntb_dev *ndev, int db_vector) + { + u64 shift, mask; + +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c +index 5d0f99bcc987..44da9fe5b27b 100644 +--- a/drivers/nvme/host/core.c ++++ b/drivers/nvme/host/core.c +@@ -3647,7 +3647,7 @@ void nvme_kill_queues(struct nvme_ctrl *ctrl) + down_read(&ctrl->namespaces_rwsem); + + /* Forcibly unquiesce queues to avoid blocking dispatch */ +- if (ctrl->admin_q) ++ if (ctrl->admin_q && !blk_queue_dying(ctrl->admin_q)) + blk_mq_unquiesce_queue(ctrl->admin_q); + + list_for_each_entry(ns, &ctrl->namespaces, list) +diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c +index a64a8bca0d5b..124f41157173 100644 +--- a/drivers/nvme/host/pci.c ++++ b/drivers/nvme/host/pci.c +@@ -1652,6 +1652,9 @@ static void nvme_map_cmb(struct nvme_dev *dev) + struct pci_dev *pdev = to_pci_dev(dev->dev); + int bar; + ++ if (dev->cmb_size) ++ return; ++ + dev->cmbsz = readl(dev->bar + NVME_REG_CMBSZ); + if (!dev->cmbsz) + return; +@@ -2136,7 +2139,6 @@ static void nvme_pci_disable(struct nvme_dev *dev) + { + struct pci_dev *pdev = to_pci_dev(dev->dev); + +- nvme_release_cmb(dev); + pci_free_irq_vectors(pdev); + + if (pci_is_enabled(pdev)) { +@@ -2583,19 +2585,19 @@ static void nvme_remove(struct pci_dev *pdev) + struct nvme_dev *dev = pci_get_drvdata(pdev); + + nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DELETING); +- +- cancel_work_sync(&dev->ctrl.reset_work); + pci_set_drvdata(pdev, NULL); + + if (!pci_device_is_present(pdev)) { + nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DEAD); + nvme_dev_disable(dev, true); ++ nvme_dev_remove_admin(dev); + } + + flush_work(&dev->ctrl.reset_work); + nvme_stop_ctrl(&dev->ctrl); + nvme_remove_namespaces(&dev->ctrl); + nvme_dev_disable(dev, true); ++ nvme_release_cmb(dev); + nvme_free_host_mem(dev); + nvme_dev_remove_admin(dev); + nvme_free_queues(dev, 0); +diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c +index 5251689a1d9a..291f4121f516 100644 +--- a/drivers/nvme/target/fcloop.c ++++ b/drivers/nvme/target/fcloop.c +@@ -648,6 +648,7 @@ fcloop_fcp_op(struct nvmet_fc_target_port *tgtport, + break; + + /* Fall-Thru to RSP handling */ ++ /* FALLTHRU */ + + case NVMET_FCOP_RSP: + if (fcpreq) { +diff --git a/drivers/nvme/target/io-cmd-file.c b/drivers/nvme/target/io-cmd-file.c +index 81a9dc5290a8..39d972e2595f 100644 +--- a/drivers/nvme/target/io-cmd-file.c ++++ b/drivers/nvme/target/io-cmd-file.c +@@ -246,7 +246,8 @@ static void nvmet_file_execute_discard(struct nvmet_req *req) + break; + + offset = le64_to_cpu(range.slba) << req->ns->blksize_shift; +- len = le32_to_cpu(range.nlb) << req->ns->blksize_shift; ++ len = le32_to_cpu(range.nlb); ++ len <<= req->ns->blksize_shift; + if (offset + len > req->ns->size) { + ret = NVME_SC_LBA_RANGE | NVME_SC_DNR; + break; +diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c +index bac4b4bbc33d..68f52966bbc0 100644 +--- a/drivers/of/unittest.c ++++ b/drivers/of/unittest.c +@@ -375,6 +375,7 @@ static void __init of_unittest_parse_phandle_with_args(void) + for (i = 0; i < 8; i++) { + bool passed = true; + ++ memset(&args, 0, sizeof(args)); + rc = of_parse_phandle_with_args(np, "phandle-list", + "#phandle-cells", i, &args); + +@@ -428,6 +429,7 @@ static void __init of_unittest_parse_phandle_with_args(void) + } + + /* Check for missing list property */ ++ memset(&args, 0, sizeof(args)); + rc = of_parse_phandle_with_args(np, "phandle-list-missing", + "#phandle-cells", 0, &args); + unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc); +@@ -436,6 +438,7 @@ static void __init of_unittest_parse_phandle_with_args(void) + unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc); + + /* Check for missing cells property */ ++ memset(&args, 0, sizeof(args)); + rc = of_parse_phandle_with_args(np, "phandle-list", + "#phandle-cells-missing", 0, &args); + unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); +@@ -444,6 +447,7 @@ static void __init of_unittest_parse_phandle_with_args(void) + unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); + + /* Check for bad phandle in list */ ++ memset(&args, 0, sizeof(args)); + rc = of_parse_phandle_with_args(np, "phandle-list-bad-phandle", + "#phandle-cells", 0, &args); + unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); +@@ -452,6 +456,7 @@ static void __init of_unittest_parse_phandle_with_args(void) + unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); + + /* Check for incorrectly formed argument list */ ++ memset(&args, 0, sizeof(args)); + rc = of_parse_phandle_with_args(np, "phandle-list-bad-args", + "#phandle-cells", 1, &args); + unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); +@@ -502,6 +507,7 @@ static void __init of_unittest_parse_phandle_with_args_map(void) + for (i = 0; i < 8; i++) { + bool passed = true; + ++ memset(&args, 0, sizeof(args)); + rc = of_parse_phandle_with_args_map(np, "phandle-list", + "phandle", i, &args); + +@@ -559,21 +565,25 @@ static void __init of_unittest_parse_phandle_with_args_map(void) + } + + /* Check for missing list property */ ++ memset(&args, 0, sizeof(args)); + rc = of_parse_phandle_with_args_map(np, "phandle-list-missing", + "phandle", 0, &args); + unittest(rc == -ENOENT, "expected:%i got:%i\n", -ENOENT, rc); + + /* Check for missing cells,map,mask property */ ++ memset(&args, 0, sizeof(args)); + rc = of_parse_phandle_with_args_map(np, "phandle-list", + "phandle-missing", 0, &args); + unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); + + /* Check for bad phandle in list */ ++ memset(&args, 0, sizeof(args)); + rc = of_parse_phandle_with_args_map(np, "phandle-list-bad-phandle", + "phandle", 0, &args); + unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); + + /* Check for incorrectly formed argument list */ ++ memset(&args, 0, sizeof(args)); + rc = of_parse_phandle_with_args_map(np, "phandle-list-bad-args", + "phandle", 1, &args); + unittest(rc == -EINVAL, "expected:%i got:%i\n", -EINVAL, rc); +@@ -783,7 +793,7 @@ static void __init of_unittest_parse_interrupts(void) + for (i = 0; i < 4; i++) { + bool passed = true; + +- args.args_count = 0; ++ memset(&args, 0, sizeof(args)); + rc = of_irq_parse_one(np, i, &args); + + passed &= !rc; +@@ -804,7 +814,7 @@ static void __init of_unittest_parse_interrupts(void) + for (i = 0; i < 4; i++) { + bool passed = true; + +- args.args_count = 0; ++ memset(&args, 0, sizeof(args)); + rc = of_irq_parse_one(np, i, &args); + + /* Test the values from tests-phandle.dtsi */ +@@ -860,6 +870,7 @@ static void __init of_unittest_parse_interrupts_extended(void) + for (i = 0; i < 7; i++) { + bool passed = true; + ++ memset(&args, 0, sizeof(args)); + rc = of_irq_parse_one(np, i, &args); + + /* Test the values from tests-phandle.dtsi */ +@@ -1067,20 +1078,44 @@ static void __init of_unittest_platform_populate(void) + * of np into dup node (present in live tree) and + * updates parent of children of np to dup. + * +- * @np: node already present in live tree ++ * @np: node whose properties are being added to the live tree + * @dup: node present in live tree to be updated + */ + static void update_node_properties(struct device_node *np, + struct device_node *dup) + { + struct property *prop; ++ struct property *save_next; + struct device_node *child; +- +- for_each_property_of_node(np, prop) +- of_add_property(dup, prop); ++ int ret; + + for_each_child_of_node(np, child) + child->parent = dup; ++ ++ /* ++ * "unittest internal error: unable to add testdata property" ++ * ++ * If this message reports a property in node '/__symbols__' then ++ * the respective unittest overlay contains a label that has the ++ * same name as a label in the live devicetree. The label will ++ * be in the live devicetree only if the devicetree source was ++ * compiled with the '-@' option. If you encounter this error, ++ * please consider renaming __all__ of the labels in the unittest ++ * overlay dts files with an odd prefix that is unlikely to be ++ * used in a real devicetree. ++ */ ++ ++ /* ++ * open code for_each_property_of_node() because of_add_property() ++ * sets prop->next to NULL ++ */ ++ for (prop = np->properties; prop != NULL; prop = save_next) { ++ save_next = prop->next; ++ ret = of_add_property(dup, prop); ++ if (ret) ++ pr_err("unittest internal error: unable to add testdata property %pOF/%s", ++ np, prop->name); ++ } + } + + /** +@@ -1089,18 +1124,23 @@ static void update_node_properties(struct device_node *np, + * + * @np: Node to attach to live tree + */ +-static int attach_node_and_children(struct device_node *np) ++static void attach_node_and_children(struct device_node *np) + { + struct device_node *next, *dup, *child; + unsigned long flags; + const char *full_name; + + full_name = kasprintf(GFP_KERNEL, "%pOF", np); ++ ++ if (!strcmp(full_name, "/__local_fixups__") || ++ !strcmp(full_name, "/__fixups__")) ++ return; ++ + dup = of_find_node_by_path(full_name); + kfree(full_name); + if (dup) { + update_node_properties(np, dup); +- return 0; ++ return; + } + + child = np->child; +@@ -1121,8 +1161,6 @@ static int attach_node_and_children(struct device_node *np) + attach_node_and_children(child); + child = next; + } +- +- return 0; + } + + /** +diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c +index 5e199e7d2d4f..765357b87ff6 100644 +--- a/drivers/pci/controller/dwc/pci-keystone.c ++++ b/drivers/pci/controller/dwc/pci-keystone.c +@@ -36,6 +36,7 @@ + #define PCIE_RC_K2HK 0xb008 + #define PCIE_RC_K2E 0xb009 + #define PCIE_RC_K2L 0xb00a ++#define PCIE_RC_K2G 0xb00b + + #define to_keystone_pcie(x) dev_get_drvdata((x)->dev) + +@@ -50,6 +51,8 @@ static void quirk_limit_mrrs(struct pci_dev *dev) + .class = PCI_CLASS_BRIDGE_PCI << 8, .class_mask = ~0, }, + { PCI_DEVICE(PCI_VENDOR_ID_TI, PCIE_RC_K2L), + .class = PCI_CLASS_BRIDGE_PCI << 8, .class_mask = ~0, }, ++ { PCI_DEVICE(PCI_VENDOR_ID_TI, PCIE_RC_K2G), ++ .class = PCI_CLASS_BRIDGE_PCI << 8, .class_mask = ~0, }, + { 0, }, + }; + +diff --git a/drivers/pci/controller/pcie-cadence-ep.c b/drivers/pci/controller/pcie-cadence-ep.c +index 6692654798d4..c3a088910f48 100644 +--- a/drivers/pci/controller/pcie-cadence-ep.c ++++ b/drivers/pci/controller/pcie-cadence-ep.c +@@ -355,7 +355,7 @@ static int cdns_pcie_ep_send_msi_irq(struct cdns_pcie_ep *ep, u8 fn, + ep->irq_pci_addr = (pci_addr & ~pci_addr_mask); + ep->irq_pci_fn = fn; + } +- writew(data, ep->irq_cpu_addr + (pci_addr & pci_addr_mask)); ++ writel(data, ep->irq_cpu_addr + (pci_addr & pci_addr_mask)); + + return 0; + } +diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c +index 0d100f56cb88..1bfbceb9f445 100644 +--- a/drivers/pci/controller/pcie-mediatek.c ++++ b/drivers/pci/controller/pcie-mediatek.c +@@ -394,75 +394,6 @@ static struct pci_ops mtk_pcie_ops_v2 = { + .write = mtk_pcie_config_write, + }; + +-static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port) +-{ +- struct mtk_pcie *pcie = port->pcie; +- struct resource *mem = &pcie->mem; +- const struct mtk_pcie_soc *soc = port->pcie->soc; +- u32 val; +- size_t size; +- int err; +- +- /* MT7622 platforms need to enable LTSSM and ASPM from PCIe subsys */ +- if (pcie->base) { +- val = readl(pcie->base + PCIE_SYS_CFG_V2); +- val |= PCIE_CSR_LTSSM_EN(port->slot) | +- PCIE_CSR_ASPM_L1_EN(port->slot); +- writel(val, pcie->base + PCIE_SYS_CFG_V2); +- } +- +- /* Assert all reset signals */ +- writel(0, port->base + PCIE_RST_CTRL); +- +- /* +- * Enable PCIe link down reset, if link status changed from link up to +- * link down, this will reset MAC control registers and configuration +- * space. +- */ +- writel(PCIE_LINKDOWN_RST_EN, port->base + PCIE_RST_CTRL); +- +- /* De-assert PHY, PE, PIPE, MAC and configuration reset */ +- val = readl(port->base + PCIE_RST_CTRL); +- val |= PCIE_PHY_RSTB | PCIE_PERSTB | PCIE_PIPE_SRSTB | +- PCIE_MAC_SRSTB | PCIE_CRSTB; +- writel(val, port->base + PCIE_RST_CTRL); +- +- /* Set up vendor ID and class code */ +- if (soc->need_fix_class_id) { +- val = PCI_VENDOR_ID_MEDIATEK; +- writew(val, port->base + PCIE_CONF_VEND_ID); +- +- val = PCI_CLASS_BRIDGE_HOST; +- writew(val, port->base + PCIE_CONF_CLASS_ID); +- } +- +- /* 100ms timeout value should be enough for Gen1/2 training */ +- err = readl_poll_timeout(port->base + PCIE_LINK_STATUS_V2, val, +- !!(val & PCIE_PORT_LINKUP_V2), 20, +- 100 * USEC_PER_MSEC); +- if (err) +- return -ETIMEDOUT; +- +- /* Set INTx mask */ +- val = readl(port->base + PCIE_INT_MASK); +- val &= ~INTX_MASK; +- writel(val, port->base + PCIE_INT_MASK); +- +- /* Set AHB to PCIe translation windows */ +- size = mem->end - mem->start; +- val = lower_32_bits(mem->start) | AHB2PCIE_SIZE(fls(size)); +- writel(val, port->base + PCIE_AHB_TRANS_BASE0_L); +- +- val = upper_32_bits(mem->start); +- writel(val, port->base + PCIE_AHB_TRANS_BASE0_H); +- +- /* Set PCIe to AXI translation memory space.*/ +- val = fls(0xffffffff) | WIN_ENABLE; +- writel(val, port->base + PCIE_AXI_WINDOW0); +- +- return 0; +-} +- + static void mtk_compose_msi_msg(struct irq_data *data, struct msi_msg *msg) + { + struct mtk_pcie_port *port = irq_data_get_irq_chip_data(data); +@@ -639,8 +570,6 @@ static int mtk_pcie_init_irq_domain(struct mtk_pcie_port *port, + ret = mtk_pcie_allocate_msi_domains(port); + if (ret) + return ret; +- +- mtk_pcie_enable_msi(port); + } + + return 0; +@@ -707,6 +636,78 @@ static int mtk_pcie_setup_irq(struct mtk_pcie_port *port, + return 0; + } + ++static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port) ++{ ++ struct mtk_pcie *pcie = port->pcie; ++ struct resource *mem = &pcie->mem; ++ const struct mtk_pcie_soc *soc = port->pcie->soc; ++ u32 val; ++ size_t size; ++ int err; ++ ++ /* MT7622 platforms need to enable LTSSM and ASPM from PCIe subsys */ ++ if (pcie->base) { ++ val = readl(pcie->base + PCIE_SYS_CFG_V2); ++ val |= PCIE_CSR_LTSSM_EN(port->slot) | ++ PCIE_CSR_ASPM_L1_EN(port->slot); ++ writel(val, pcie->base + PCIE_SYS_CFG_V2); ++ } ++ ++ /* Assert all reset signals */ ++ writel(0, port->base + PCIE_RST_CTRL); ++ ++ /* ++ * Enable PCIe link down reset, if link status changed from link up to ++ * link down, this will reset MAC control registers and configuration ++ * space. ++ */ ++ writel(PCIE_LINKDOWN_RST_EN, port->base + PCIE_RST_CTRL); ++ ++ /* De-assert PHY, PE, PIPE, MAC and configuration reset */ ++ val = readl(port->base + PCIE_RST_CTRL); ++ val |= PCIE_PHY_RSTB | PCIE_PERSTB | PCIE_PIPE_SRSTB | ++ PCIE_MAC_SRSTB | PCIE_CRSTB; ++ writel(val, port->base + PCIE_RST_CTRL); ++ ++ /* Set up vendor ID and class code */ ++ if (soc->need_fix_class_id) { ++ val = PCI_VENDOR_ID_MEDIATEK; ++ writew(val, port->base + PCIE_CONF_VEND_ID); ++ ++ val = PCI_CLASS_BRIDGE_PCI; ++ writew(val, port->base + PCIE_CONF_CLASS_ID); ++ } ++ ++ /* 100ms timeout value should be enough for Gen1/2 training */ ++ err = readl_poll_timeout(port->base + PCIE_LINK_STATUS_V2, val, ++ !!(val & PCIE_PORT_LINKUP_V2), 20, ++ 100 * USEC_PER_MSEC); ++ if (err) ++ return -ETIMEDOUT; ++ ++ /* Set INTx mask */ ++ val = readl(port->base + PCIE_INT_MASK); ++ val &= ~INTX_MASK; ++ writel(val, port->base + PCIE_INT_MASK); ++ ++ if (IS_ENABLED(CONFIG_PCI_MSI)) ++ mtk_pcie_enable_msi(port); ++ ++ /* Set AHB to PCIe translation windows */ ++ size = mem->end - mem->start; ++ val = lower_32_bits(mem->start) | AHB2PCIE_SIZE(fls(size)); ++ writel(val, port->base + PCIE_AHB_TRANS_BASE0_L); ++ ++ val = upper_32_bits(mem->start); ++ writel(val, port->base + PCIE_AHB_TRANS_BASE0_H); ++ ++ /* Set PCIe to AXI translation memory space.*/ ++ val = fls(0xffffffff) | WIN_ENABLE; ++ writel(val, port->base + PCIE_AXI_WINDOW0); ++ ++ return 0; ++} ++ + static void __iomem *mtk_pcie_map_bus(struct pci_bus *bus, + unsigned int devfn, int where) + { +diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c +index 65eaa6b61868..ab36e5ca1aca 100644 +--- a/drivers/pci/controller/vmd.c ++++ b/drivers/pci/controller/vmd.c +@@ -818,12 +818,12 @@ static void vmd_remove(struct pci_dev *dev) + { + struct vmd_dev *vmd = pci_get_drvdata(dev); + +- vmd_detach_resources(vmd); + sysfs_remove_link(&vmd->dev->dev.kobj, "domain"); + pci_stop_root_bus(vmd->bus); + pci_remove_root_bus(vmd->bus); + vmd_cleanup_srcu(vmd); + vmd_teardown_dma_ops(vmd); ++ vmd_detach_resources(vmd); + irq_domain_remove(vmd->irq_domain); + } + +diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c +index 08925d24180b..1bd3c10ce189 100644 +--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c ++++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c +@@ -72,10 +72,8 @@ + #define GPIO_REG_OFFSET(p) ((p) / 32) + #define GPIO_REG_SHIFT(p) ((p) % 32) + +-enum bcm2835_pinconf_param { +- /* argument: bcm2835_pinconf_pull */ +- BCM2835_PINCONF_PARAM_PULL = (PIN_CONFIG_END + 1), +-}; ++/* argument: bcm2835_pinconf_pull */ ++#define BCM2835_PINCONF_PARAM_PULL (PIN_CONFIG_END + 1) + + struct bcm2835_pinctrl { + struct device *dev; +diff --git a/drivers/pinctrl/cirrus/pinctrl-madera-core.c b/drivers/pinctrl/cirrus/pinctrl-madera-core.c +index c4f4d904e4a6..618e04407ac8 100644 +--- a/drivers/pinctrl/cirrus/pinctrl-madera-core.c ++++ b/drivers/pinctrl/cirrus/pinctrl-madera-core.c +@@ -608,7 +608,7 @@ static int madera_mux_set_mux(struct pinctrl_dev *pctldev, + unsigned int n_chip_groups = priv->chip->n_pin_groups; + const char *func_name = madera_mux_funcs[selector].name; + unsigned int reg; +- int i, ret; ++ int i, ret = 0; + + dev_dbg(priv->dev, "%s selecting %u (%s) for group %u (%s)\n", + __func__, selector, func_name, group, +diff --git a/drivers/pinctrl/pinctrl-lpc18xx.c b/drivers/pinctrl/pinctrl-lpc18xx.c +index 190f17e4bbda..1d3b88e6ab86 100644 +--- a/drivers/pinctrl/pinctrl-lpc18xx.c ++++ b/drivers/pinctrl/pinctrl-lpc18xx.c +@@ -630,14 +630,8 @@ static const struct pinctrl_pin_desc lpc18xx_pins[] = { + LPC18XX_PIN(i2c0_sda, PIN_I2C0_SDA), + }; + +-/** +- * enum lpc18xx_pin_config_param - possible pin configuration parameters +- * @PIN_CONFIG_GPIO_PIN_INT: route gpio to the gpio pin interrupt +- * controller. +- */ +-enum lpc18xx_pin_config_param { +- PIN_CONFIG_GPIO_PIN_INT = PIN_CONFIG_END + 1, +-}; ++/* PIN_CONFIG_GPIO_PIN_INT: route gpio to the gpio pin interrupt controller */ ++#define PIN_CONFIG_GPIO_PIN_INT (PIN_CONFIG_END + 1) + + static const struct pinconf_generic_params lpc18xx_params[] = { + {"nxp,gpio-pin-interrupt", PIN_CONFIG_GPIO_PIN_INT, 0}, +diff --git a/drivers/pinctrl/pinctrl-zynq.c b/drivers/pinctrl/pinctrl-zynq.c +index a0daf27042bd..90fd37e8207b 100644 +--- a/drivers/pinctrl/pinctrl-zynq.c ++++ b/drivers/pinctrl/pinctrl-zynq.c +@@ -971,15 +971,12 @@ enum zynq_io_standards { + zynq_iostd_max + }; + +-/** +- * enum zynq_pin_config_param - possible pin configuration parameters +- * @PIN_CONFIG_IOSTANDARD: if the pin can select an IO standard, the argument to ++/* ++ * PIN_CONFIG_IOSTANDARD: if the pin can select an IO standard, the argument to + * this parameter (on a custom format) tells the driver which alternative + * IO standard to use. + */ +-enum zynq_pin_config_param { +- PIN_CONFIG_IOSTANDARD = PIN_CONFIG_END + 1, +-}; ++#define PIN_CONFIG_IOSTANDARD (PIN_CONFIG_END + 1) + + static const struct pinconf_generic_params zynq_dt_params[] = { + {"io-standard", PIN_CONFIG_IOSTANDARD, zynq_iostd_lvcmos18}, +diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c +index cf82db78e69e..0c30f5eb4c71 100644 +--- a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c ++++ b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c +@@ -1028,10 +1028,23 @@ static int pmic_gpio_probe(struct platform_device *pdev) + return ret; + } + +- ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0, npins); +- if (ret) { +- dev_err(dev, "failed to add pin range\n"); +- goto err_range; ++ /* ++ * For DeviceTree-supported systems, the gpio core checks the ++ * pinctrl's device node for the "gpio-ranges" property. ++ * If it is present, it takes care of adding the pin ranges ++ * for the driver. In this case the driver can skip ahead. ++ * ++ * In order to remain compatible with older, existing DeviceTree ++ * files which don't set the "gpio-ranges" property or systems that ++ * utilize ACPI the driver has to call gpiochip_add_pin_range(). ++ */ ++ if (!of_property_read_bool(dev->of_node, "gpio-ranges")) { ++ ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0, ++ npins); ++ if (ret) { ++ dev_err(dev, "failed to add pin range\n"); ++ goto err_range; ++ } + } + + return 0; +diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c +index 26ebedc1f6d3..61aaaf58c599 100644 +--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c ++++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c +@@ -1042,6 +1042,7 @@ static int sunxi_pinctrl_add_function(struct sunxi_pinctrl *pctl, + static int sunxi_pinctrl_build_state(struct platform_device *pdev) + { + struct sunxi_pinctrl *pctl = platform_get_drvdata(pdev); ++ void *ptr; + int i; + + /* +@@ -1108,13 +1109,15 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev) + } + + /* And now allocated and fill the array for real */ +- pctl->functions = krealloc(pctl->functions, +- pctl->nfunctions * sizeof(*pctl->functions), +- GFP_KERNEL); +- if (!pctl->functions) { ++ ptr = krealloc(pctl->functions, ++ pctl->nfunctions * sizeof(*pctl->functions), ++ GFP_KERNEL); ++ if (!ptr) { + kfree(pctl->functions); ++ pctl->functions = NULL; + return -ENOMEM; + } ++ pctl->functions = ptr; + + for (i = 0; i < pctl->desc->npins; i++) { + const struct sunxi_desc_pin *pin = pctl->desc->pins + i; +diff --git a/drivers/platform/x86/intel_cht_int33fe.c b/drivers/platform/x86/intel_cht_int33fe.c +index a26f410800c2..f40b1c192106 100644 +--- a/drivers/platform/x86/intel_cht_int33fe.c ++++ b/drivers/platform/x86/intel_cht_int33fe.c +@@ -24,6 +24,7 @@ + #include <linux/i2c.h> + #include <linux/interrupt.h> + #include <linux/module.h> ++#include <linux/platform_device.h> + #include <linux/regulator/consumer.h> + #include <linux/slab.h> + +@@ -88,9 +89,9 @@ static const struct property_entry fusb302_props[] = { + { } + }; + +-static int cht_int33fe_probe(struct i2c_client *client) ++static int cht_int33fe_probe(struct platform_device *pdev) + { +- struct device *dev = &client->dev; ++ struct device *dev = &pdev->dev; + struct i2c_board_info board_info; + struct cht_int33fe_data *data; + struct i2c_client *max17047; +@@ -207,7 +208,7 @@ static int cht_int33fe_probe(struct i2c_client *client) + if (!data->pi3usb30532) + goto out_unregister_fusb302; + +- i2c_set_clientdata(client, data); ++ platform_set_drvdata(pdev, data); + + return 0; + +@@ -223,9 +224,9 @@ out_unregister_max17047: + return -EPROBE_DEFER; /* Wait for the i2c-adapter to load */ + } + +-static int cht_int33fe_remove(struct i2c_client *i2c) ++static int cht_int33fe_remove(struct platform_device *pdev) + { +- struct cht_int33fe_data *data = i2c_get_clientdata(i2c); ++ struct cht_int33fe_data *data = platform_get_drvdata(pdev); + + i2c_unregister_device(data->pi3usb30532); + i2c_unregister_device(data->fusb302); +@@ -237,29 +238,22 @@ static int cht_int33fe_remove(struct i2c_client *i2c) + return 0; + } + +-static const struct i2c_device_id cht_int33fe_i2c_id[] = { +- { } +-}; +-MODULE_DEVICE_TABLE(i2c, cht_int33fe_i2c_id); +- + static const struct acpi_device_id cht_int33fe_acpi_ids[] = { + { "INT33FE", }, + { } + }; + MODULE_DEVICE_TABLE(acpi, cht_int33fe_acpi_ids); + +-static struct i2c_driver cht_int33fe_driver = { ++static struct platform_driver cht_int33fe_driver = { + .driver = { + .name = "Intel Cherry Trail ACPI INT33FE driver", + .acpi_match_table = ACPI_PTR(cht_int33fe_acpi_ids), + }, +- .probe_new = cht_int33fe_probe, ++ .probe = cht_int33fe_probe, + .remove = cht_int33fe_remove, +- .id_table = cht_int33fe_i2c_id, +- .disable_i2c_core_irq_mapping = true, + }; + +-module_i2c_driver(cht_int33fe_driver); ++module_platform_driver(cht_int33fe_driver); + + MODULE_DESCRIPTION("Intel Cherry Trail ACPI INT33FE pseudo device driver"); + MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>"); +diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c +index 4721a264bac2..1e69c1c9ec09 100644 +--- a/drivers/pwm/pwm-lpss.c ++++ b/drivers/pwm/pwm-lpss.c +@@ -97,7 +97,7 @@ static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm, + unsigned long long on_time_div; + unsigned long c = lpwm->info->clk_rate, base_unit_range; + unsigned long long base_unit, freq = NSEC_PER_SEC; +- u32 ctrl; ++ u32 orig_ctrl, ctrl; + + do_div(freq, period_ns); + +@@ -114,13 +114,17 @@ static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm, + do_div(on_time_div, period_ns); + on_time_div = 255ULL - on_time_div; + +- ctrl = pwm_lpss_read(pwm); ++ orig_ctrl = ctrl = pwm_lpss_read(pwm); + ctrl &= ~PWM_ON_TIME_DIV_MASK; + ctrl &= ~(base_unit_range << PWM_BASE_UNIT_SHIFT); + base_unit &= base_unit_range; + ctrl |= (u32) base_unit << PWM_BASE_UNIT_SHIFT; + ctrl |= on_time_div; +- pwm_lpss_write(pwm, ctrl); ++ ++ if (orig_ctrl != ctrl) { ++ pwm_lpss_write(pwm, ctrl); ++ pwm_lpss_write(pwm, ctrl | PWM_SW_UPDATE); ++ } + } + + static inline void pwm_lpss_cond_enable(struct pwm_device *pwm, bool cond) +@@ -144,7 +148,6 @@ static int pwm_lpss_apply(struct pwm_chip *chip, struct pwm_device *pwm, + return ret; + } + pwm_lpss_prepare(lpwm, pwm, state->duty_cycle, state->period); +- pwm_lpss_write(pwm, pwm_lpss_read(pwm) | PWM_SW_UPDATE); + pwm_lpss_cond_enable(pwm, lpwm->info->bypass == false); + ret = pwm_lpss_wait_for_update(pwm); + if (ret) { +@@ -157,7 +160,6 @@ static int pwm_lpss_apply(struct pwm_chip *chip, struct pwm_device *pwm, + if (ret) + return ret; + pwm_lpss_prepare(lpwm, pwm, state->duty_cycle, state->period); +- pwm_lpss_write(pwm, pwm_lpss_read(pwm) | PWM_SW_UPDATE); + return pwm_lpss_wait_for_update(pwm); + } + } else if (pwm_is_enabled(pwm)) { +diff --git a/drivers/rtc/rtc-s35390a.c b/drivers/rtc/rtc-s35390a.c +index 77feb603cd4c..3c64dbb08109 100644 +--- a/drivers/rtc/rtc-s35390a.c ++++ b/drivers/rtc/rtc-s35390a.c +@@ -108,7 +108,7 @@ static int s35390a_get_reg(struct s35390a *s35390a, int reg, char *buf, int len) + + static int s35390a_init(struct s35390a *s35390a) + { +- char buf; ++ u8 buf; + int ret; + unsigned initcount = 0; + +diff --git a/drivers/scsi/bfa/bfa_defs_svc.h b/drivers/scsi/bfa/bfa_defs_svc.h +index 3d0c96a5c873..c19c26e0e405 100644 +--- a/drivers/scsi/bfa/bfa_defs_svc.h ++++ b/drivers/scsi/bfa/bfa_defs_svc.h +@@ -1453,7 +1453,7 @@ union bfa_aen_data_u { + struct bfa_aen_entry_s { + struct list_head qe; + enum bfa_aen_category aen_category; +- u32 aen_type; ++ int aen_type; + union bfa_aen_data_u aen_data; + u64 aen_tv_sec; + u64 aen_tv_usec; +diff --git a/drivers/scsi/bfa/bfad_im.h b/drivers/scsi/bfa/bfad_im.h +index e61ed8dad0b4..bd4ac187fd8e 100644 +--- a/drivers/scsi/bfa/bfad_im.h ++++ b/drivers/scsi/bfa/bfad_im.h +@@ -143,7 +143,7 @@ struct bfad_im_s { + static inline void bfad_im_post_vendor_event(struct bfa_aen_entry_s *entry, + struct bfad_s *drv, int cnt, + enum bfa_aen_category cat, +- enum bfa_ioc_aen_event evt) ++ int evt) + { + struct timespec64 ts; + +diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c +index 1ed2cd82129d..3943347ec3c7 100644 +--- a/drivers/scsi/dc395x.c ++++ b/drivers/scsi/dc395x.c +@@ -1969,6 +1969,11 @@ static void sg_update_list(struct ScsiReqBlk *srb, u32 left) + xferred -= psge->length; + } else { + /* Partial SG entry done */ ++ pci_dma_sync_single_for_cpu(srb->dcb-> ++ acb->dev, ++ srb->sg_bus_addr, ++ SEGMENTX_LEN, ++ PCI_DMA_TODEVICE); + psge->length -= xferred; + psge->address += xferred; + srb->sg_index = idx; +@@ -3447,14 +3452,12 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, + } + } + +- if (dir != PCI_DMA_NONE && scsi_sg_count(cmd)) +- pci_dma_sync_sg_for_cpu(acb->dev, scsi_sglist(cmd), +- scsi_sg_count(cmd), dir); +- + ckc_only = 0; + /* Check Error Conditions */ + ckc_e: + ++ pci_unmap_srb(acb, srb); ++ + if (cmd->cmnd[0] == INQUIRY) { + unsigned char *base = NULL; + struct ScsiInqData *ptr; +@@ -3507,7 +3510,6 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, + cmd, cmd->result); + srb_free_insert(acb, srb); + } +- pci_unmap_srb(acb, srb); + + cmd->scsi_done(cmd); + waiting_process_next(acb); +diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c +index fd9d82c9033d..f478d1f50dfc 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_main.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_main.c +@@ -906,6 +906,9 @@ static void hisi_sas_phy_set_linkrate(struct hisi_hba *hisi_hba, int phy_no, + _r.maximum_linkrate = max; + _r.minimum_linkrate = min; + ++ sas_phy->phy->maximum_linkrate = max; ++ sas_phy->phy->minimum_linkrate = min; ++ + hisi_hba->hw->phy_disable(hisi_hba, phy_no); + msleep(100); + hisi_hba->hw->phy_set_linkrate(hisi_hba, phy_no, &_r); +@@ -952,8 +955,7 @@ static int hisi_sas_control_phy(struct asd_sas_phy *sas_phy, enum phy_func func, + + static void hisi_sas_task_done(struct sas_task *task) + { +- if (!del_timer(&task->slow_task->timer)) +- return; ++ del_timer(&task->slow_task->timer); + complete(&task->slow_task->completion); + } + +@@ -962,13 +964,17 @@ static void hisi_sas_tmf_timedout(struct timer_list *t) + struct sas_task_slow *slow = from_timer(slow, t, timer); + struct sas_task *task = slow->task; + unsigned long flags; ++ bool is_completed = true; + + spin_lock_irqsave(&task->task_state_lock, flags); +- if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) ++ if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { + task->task_state_flags |= SAS_TASK_STATE_ABORTED; ++ is_completed = false; ++ } + spin_unlock_irqrestore(&task->task_state_lock, flags); + +- complete(&task->slow_task->completion); ++ if (!is_completed) ++ complete(&task->slow_task->completion); + } + + #define TASK_TIMEOUT 20 +@@ -1021,8 +1027,16 @@ static int hisi_sas_exec_internal_tmf_task(struct domain_device *device, + struct hisi_sas_slot *slot = task->lldd_task; + + dev_err(dev, "abort tmf: TMF task timeout and not done\n"); +- if (slot) ++ if (slot) { ++ struct hisi_sas_cq *cq = ++ &hisi_hba->cq[slot->dlvry_queue]; ++ /* ++ * flush tasklet to avoid free'ing task ++ * before using task in IO completion ++ */ ++ tasklet_kill(&cq->tasklet); + slot->task = NULL; ++ } + + goto ex_err; + } else +@@ -1398,6 +1412,17 @@ static int hisi_sas_abort_task(struct sas_task *task) + + spin_lock_irqsave(&task->task_state_lock, flags); + if (task->task_state_flags & SAS_TASK_STATE_DONE) { ++ struct hisi_sas_slot *slot = task->lldd_task; ++ struct hisi_sas_cq *cq; ++ ++ if (slot) { ++ /* ++ * flush tasklet to avoid free'ing task ++ * before using task in IO completion ++ */ ++ cq = &hisi_hba->cq[slot->dlvry_queue]; ++ tasklet_kill(&cq->tasklet); ++ } + spin_unlock_irqrestore(&task->task_state_lock, flags); + rc = TMF_RESP_FUNC_COMPLETE; + goto out; +@@ -1453,12 +1478,19 @@ static int hisi_sas_abort_task(struct sas_task *task) + /* SMP */ + struct hisi_sas_slot *slot = task->lldd_task; + u32 tag = slot->idx; ++ struct hisi_sas_cq *cq = &hisi_hba->cq[slot->dlvry_queue]; + + rc = hisi_sas_internal_task_abort(hisi_hba, device, + HISI_SAS_INT_ABT_CMD, tag); + if (((rc < 0) || (rc == TMF_RESP_FUNC_FAILED)) && +- task->lldd_task) +- hisi_sas_do_release_task(hisi_hba, task, slot); ++ task->lldd_task) { ++ /* ++ * flush tasklet to avoid free'ing task ++ * before using task in IO completion ++ */ ++ tasklet_kill(&cq->tasklet); ++ slot->task = NULL; ++ } + } + + out: +@@ -1825,8 +1857,16 @@ hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba, + if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { + struct hisi_sas_slot *slot = task->lldd_task; + +- if (slot) ++ if (slot) { ++ struct hisi_sas_cq *cq = ++ &hisi_hba->cq[slot->dlvry_queue]; ++ /* ++ * flush tasklet to avoid free'ing task ++ * before using task in IO completion ++ */ ++ tasklet_kill(&cq->tasklet); + slot->task = NULL; ++ } + dev_err(dev, "internal task abort: timeout and not done.\n"); + res = -EIO; + goto exit; +diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +index 1c4ea58da1ae..c4774d63d5d0 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +@@ -2481,7 +2481,6 @@ slot_complete_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot) + } + + out: +- hisi_sas_slot_task_free(hisi_hba, task, slot); + sts = ts->stat; + spin_lock_irqsave(&task->task_state_lock, flags); + if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { +@@ -2491,6 +2490,7 @@ out: + } + task->task_state_flags |= SAS_TASK_STATE_DONE; + spin_unlock_irqrestore(&task->task_state_lock, flags); ++ hisi_sas_slot_task_free(hisi_hba, task, slot); + + if (!is_internal && (task->task_proto != SAS_PROTOCOL_SMP)) { + spin_lock_irqsave(&device->done_lock, flags); +diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +index 3922b17e2ea3..fb2a5969181b 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -1749,7 +1749,6 @@ slot_complete_v3_hw(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot) + } + + out: +- hisi_sas_slot_task_free(hisi_hba, task, slot); + sts = ts->stat; + spin_lock_irqsave(&task->task_state_lock, flags); + if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { +@@ -1759,6 +1758,7 @@ out: + } + task->task_state_flags |= SAS_TASK_STATE_DONE; + spin_unlock_irqrestore(&task->task_state_lock, flags); ++ hisi_sas_slot_task_free(hisi_hba, task, slot); + + if (!is_internal && (task->task_proto != SAS_PROTOCOL_SMP)) { + spin_lock_irqsave(&device->done_lock, flags); +diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c +index bd6ac6b5980a..fe587ef1741d 100644 +--- a/drivers/scsi/ips.c ++++ b/drivers/scsi/ips.c +@@ -3485,6 +3485,7 @@ ips_send_cmd(ips_ha_t * ha, ips_scb_t * scb) + + case START_STOP: + scb->scsi_cmd->result = DID_OK << 16; ++ break; + + case TEST_UNIT_READY: + case INQUIRY: +diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c +index 1ee3868ade07..7b5deae68d33 100644 +--- a/drivers/scsi/isci/host.c ++++ b/drivers/scsi/isci/host.c +@@ -2717,9 +2717,9 @@ enum sci_status sci_controller_continue_io(struct isci_request *ireq) + * the task management request. + * @task_request: the handle to the task request object to start. + */ +-enum sci_task_status sci_controller_start_task(struct isci_host *ihost, +- struct isci_remote_device *idev, +- struct isci_request *ireq) ++enum sci_status sci_controller_start_task(struct isci_host *ihost, ++ struct isci_remote_device *idev, ++ struct isci_request *ireq) + { + enum sci_status status; + +@@ -2728,7 +2728,7 @@ enum sci_task_status sci_controller_start_task(struct isci_host *ihost, + "%s: SCIC Controller starting task from invalid " + "state\n", + __func__); +- return SCI_TASK_FAILURE_INVALID_STATE; ++ return SCI_FAILURE_INVALID_STATE; + } + + status = sci_remote_device_start_task(ihost, idev, ireq); +diff --git a/drivers/scsi/isci/host.h b/drivers/scsi/isci/host.h +index b3539928073c..6bc3f022630a 100644 +--- a/drivers/scsi/isci/host.h ++++ b/drivers/scsi/isci/host.h +@@ -489,7 +489,7 @@ enum sci_status sci_controller_start_io( + struct isci_remote_device *idev, + struct isci_request *ireq); + +-enum sci_task_status sci_controller_start_task( ++enum sci_status sci_controller_start_task( + struct isci_host *ihost, + struct isci_remote_device *idev, + struct isci_request *ireq); +diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c +index ed197bc8e801..2f151708b59a 100644 +--- a/drivers/scsi/isci/request.c ++++ b/drivers/scsi/isci/request.c +@@ -1626,9 +1626,9 @@ static enum sci_status atapi_d2h_reg_frame_handler(struct isci_request *ireq, + + if (status == SCI_SUCCESS) { + if (ireq->stp.rsp.status & ATA_ERR) +- status = SCI_IO_FAILURE_RESPONSE_VALID; ++ status = SCI_FAILURE_IO_RESPONSE_VALID; + } else { +- status = SCI_IO_FAILURE_RESPONSE_VALID; ++ status = SCI_FAILURE_IO_RESPONSE_VALID; + } + + if (status != SCI_SUCCESS) { +diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c +index 6dcaed0c1fc8..fb6eba331ac6 100644 +--- a/drivers/scsi/isci/task.c ++++ b/drivers/scsi/isci/task.c +@@ -258,7 +258,7 @@ static int isci_task_execute_tmf(struct isci_host *ihost, + struct isci_tmf *tmf, unsigned long timeout_ms) + { + DECLARE_COMPLETION_ONSTACK(completion); +- enum sci_task_status status = SCI_TASK_FAILURE; ++ enum sci_status status = SCI_FAILURE; + struct isci_request *ireq; + int ret = TMF_RESP_FUNC_FAILED; + unsigned long flags; +@@ -301,7 +301,7 @@ static int isci_task_execute_tmf(struct isci_host *ihost, + /* start the TMF io. */ + status = sci_controller_start_task(ihost, idev, ireq); + +- if (status != SCI_TASK_SUCCESS) { ++ if (status != SCI_SUCCESS) { + dev_dbg(&ihost->pdev->dev, + "%s: start_io failed - status = 0x%x, request = %p\n", + __func__, +diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c +index b025a0b74341..23354f206533 100644 +--- a/drivers/scsi/iscsi_tcp.c ++++ b/drivers/scsi/iscsi_tcp.c +@@ -800,7 +800,8 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost, + return rc; + + return iscsi_conn_get_addr_param((struct sockaddr_storage *) +- &addr, param, buf); ++ &addr, ++ (enum iscsi_param)param, buf); + default: + return iscsi_host_get_param(shost, param, buf); + } +diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h +index 43732e8d1347..ebcfcbb8b4cc 100644 +--- a/drivers/scsi/lpfc/lpfc.h ++++ b/drivers/scsi/lpfc/lpfc.h +@@ -490,6 +490,7 @@ struct lpfc_vport { + struct nvme_fc_local_port *localport; + uint8_t nvmei_support; /* driver supports NVME Initiator */ + uint32_t last_fcp_wqidx; ++ uint32_t rcv_flogi_cnt; /* How many unsol FLOGIs ACK'd. */ + }; + + struct hbq_s { +diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c +index f3c6801c0b31..222fa9b7f478 100644 +--- a/drivers/scsi/lpfc/lpfc_els.c ++++ b/drivers/scsi/lpfc/lpfc_els.c +@@ -1057,9 +1057,9 @@ stop_rr_fcf_flogi: + goto flogifail; + + lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS, +- "0150 FLOGI failure Status:x%x/x%x TMO:x%x\n", ++ "0150 FLOGI failure Status:x%x/x%x xri x%x TMO:x%x\n", + irsp->ulpStatus, irsp->un.ulpWord[4], +- irsp->ulpTimeout); ++ cmdiocb->sli4_xritag, irsp->ulpTimeout); + + /* FLOGI failed, so there is no fabric */ + spin_lock_irq(shost->host_lock); +@@ -1113,7 +1113,8 @@ stop_rr_fcf_flogi: + /* FLOGI completes successfully */ + lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, + "0101 FLOGI completes successfully, I/O tag:x%x, " +- "Data: x%x x%x x%x x%x x%x x%x\n", cmdiocb->iotag, ++ "xri x%x Data: x%x x%x x%x x%x x%x %x\n", ++ cmdiocb->iotag, cmdiocb->sli4_xritag, + irsp->un.ulpWord[4], sp->cmn.e_d_tov, + sp->cmn.w2.r_a_tov, sp->cmn.edtovResolution, + vport->port_state, vport->fc_flag); +@@ -1157,6 +1158,7 @@ stop_rr_fcf_flogi: + phba->fcf.fcf_flag &= ~FCF_DISCOVERY; + phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO); + spin_unlock_irq(&phba->hbalock); ++ phba->fcf.fcf_redisc_attempted = 0; /* reset */ + goto out; + } + if (!rc) { +@@ -1171,6 +1173,7 @@ stop_rr_fcf_flogi: + phba->fcf.fcf_flag &= ~FCF_DISCOVERY; + phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO); + spin_unlock_irq(&phba->hbalock); ++ phba->fcf.fcf_redisc_attempted = 0; /* reset */ + goto out; + } + } +@@ -1553,8 +1556,10 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, + */ + new_ndlp = lpfc_findnode_wwpn(vport, &sp->portName); + ++ /* return immediately if the WWPN matches ndlp */ + if (new_ndlp == ndlp && NLP_CHK_NODE_ACT(new_ndlp)) + return ndlp; ++ + if (phba->sli_rev == LPFC_SLI_REV4) { + active_rrqs_xri_bitmap = mempool_alloc(phba->active_rrq_pool, + GFP_KERNEL); +@@ -1563,9 +1568,13 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, + phba->cfg_rrq_xri_bitmap_sz); + } + +- lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, +- "3178 PLOGI confirm: ndlp %p x%x: new_ndlp %p\n", +- ndlp, ndlp->nlp_DID, new_ndlp); ++ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE, ++ "3178 PLOGI confirm: ndlp x%x x%x x%x: " ++ "new_ndlp x%x x%x x%x\n", ++ ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_fc4_type, ++ (new_ndlp ? new_ndlp->nlp_DID : 0), ++ (new_ndlp ? new_ndlp->nlp_flag : 0), ++ (new_ndlp ? new_ndlp->nlp_fc4_type : 0)); + + if (!new_ndlp) { + rc = memcmp(&ndlp->nlp_portname, name, +@@ -1614,6 +1623,14 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, + phba->cfg_rrq_xri_bitmap_sz); + } + ++ /* At this point in this routine, we know new_ndlp will be ++ * returned. however, any previous GID_FTs that were done ++ * would have updated nlp_fc4_type in ndlp, so we must ensure ++ * new_ndlp has the right value. ++ */ ++ if (vport->fc_flag & FC_FABRIC) ++ new_ndlp->nlp_fc4_type = ndlp->nlp_fc4_type; ++ + lpfc_unreg_rpi(vport, new_ndlp); + new_ndlp->nlp_DID = ndlp->nlp_DID; + new_ndlp->nlp_prev_state = ndlp->nlp_prev_state; +@@ -1663,7 +1680,6 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, + if (ndlp->nrport) { + ndlp->nrport = NULL; + lpfc_nlp_put(ndlp); +- new_ndlp->nlp_fc4_type = ndlp->nlp_fc4_type; + } + + /* We shall actually free the ndlp with both nlp_DID and +@@ -1737,6 +1753,12 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp, + active_rrqs_xri_bitmap) + mempool_free(active_rrqs_xri_bitmap, + phba->active_rrq_pool); ++ ++ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE, ++ "3173 PLOGI confirm exit: new_ndlp x%x x%x x%x\n", ++ new_ndlp->nlp_DID, new_ndlp->nlp_flag, ++ new_ndlp->nlp_fc4_type); ++ + return new_ndlp; + } + +@@ -4264,14 +4286,6 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag, + default: + return 1; + } +- /* Xmit ELS ACC response tag <ulpIoTag> */ +- lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, +- "0128 Xmit ELS ACC response tag x%x, XRI: x%x, " +- "DID: x%x, nlp_flag: x%x nlp_state: x%x RPI: x%x " +- "fc_flag x%x\n", +- elsiocb->iotag, elsiocb->iocb.ulpContext, +- ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, +- ndlp->nlp_rpi, vport->fc_flag); + if (ndlp->nlp_flag & NLP_LOGO_ACC) { + spin_lock_irq(shost->host_lock); + if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED || +@@ -4440,6 +4454,15 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb, + lpfc_els_free_iocb(phba, elsiocb); + return 1; + } ++ ++ /* Xmit ELS ACC response tag <ulpIoTag> */ ++ lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, ++ "0128 Xmit ELS ACC response Status: x%x, IoTag: x%x, " ++ "XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x " ++ "RPI: x%x, fc_flag x%x\n", ++ rc, elsiocb->iotag, elsiocb->sli4_xritag, ++ ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state, ++ ndlp->nlp_rpi, vport->fc_flag); + return 0; + } + +@@ -6450,6 +6473,11 @@ lpfc_els_rcv_flogi(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, + port_state = vport->port_state; + vport->fc_flag |= FC_PT2PT; + vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP); ++ ++ /* Acking an unsol FLOGI. Count 1 for link bounce ++ * work-around. ++ */ ++ vport->rcv_flogi_cnt++; + spin_unlock_irq(shost->host_lock); + lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, + "3311 Rcv Flogi PS x%x new PS x%x " +@@ -7847,8 +7875,9 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, + struct ls_rjt stat; + uint32_t *payload; + uint32_t cmd, did, newnode; +- uint8_t rjt_exp, rjt_err = 0; ++ uint8_t rjt_exp, rjt_err = 0, init_link = 0; + IOCB_t *icmd = &elsiocb->iocb; ++ LPFC_MBOXQ_t *mbox; + + if (!vport || !(elsiocb->context2)) + goto dropit; +@@ -7997,6 +8026,19 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, + did, vport->port_state, ndlp->nlp_flag); + + phba->fc_stat.elsRcvFLOGI++; ++ ++ /* If the driver believes fabric discovery is done and is ready, ++ * bounce the link. There is some descrepancy. ++ */ ++ if (vport->port_state >= LPFC_LOCAL_CFG_LINK && ++ vport->fc_flag & FC_PT2PT && ++ vport->rcv_flogi_cnt >= 1) { ++ rjt_err = LSRJT_LOGICAL_BSY; ++ rjt_exp = LSEXP_NOTHING_MORE; ++ init_link++; ++ goto lsrjt; ++ } ++ + lpfc_els_rcv_flogi(vport, elsiocb, ndlp); + if (newnode) + lpfc_nlp_put(ndlp); +@@ -8225,6 +8267,27 @@ lsrjt: + + lpfc_nlp_put(elsiocb->context1); + elsiocb->context1 = NULL; ++ ++ /* Special case. Driver received an unsolicited command that ++ * unsupportable given the driver's current state. Reset the ++ * link and start over. ++ */ ++ if (init_link) { ++ mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); ++ if (!mbox) ++ return; ++ lpfc_linkdown(phba); ++ lpfc_init_link(phba, mbox, ++ phba->cfg_topology, ++ phba->cfg_link_speed); ++ mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0; ++ mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl; ++ mbox->vport = vport; ++ if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT) == ++ MBX_NOT_FINISHED) ++ mempool_free(mbox, phba->mbox_mem_pool); ++ } ++ + return; + + dropit: +diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c +index db183d1f34ab..68f223882d96 100644 +--- a/drivers/scsi/lpfc/lpfc_hbadisc.c ++++ b/drivers/scsi/lpfc/lpfc_hbadisc.c +@@ -952,6 +952,7 @@ lpfc_linkdown(struct lpfc_hba *phba) + } + spin_lock_irq(shost->host_lock); + phba->pport->fc_flag &= ~(FC_PT2PT | FC_PT2PT_PLOGI); ++ phba->pport->rcv_flogi_cnt = 0; + spin_unlock_irq(shost->host_lock); + } + return 0; +@@ -1023,6 +1024,7 @@ lpfc_linkup(struct lpfc_hba *phba) + { + struct lpfc_vport **vports; + int i; ++ struct Scsi_Host *shost = lpfc_shost_from_vport(phba->pport); + + phba->link_state = LPFC_LINK_UP; + +@@ -1036,6 +1038,13 @@ lpfc_linkup(struct lpfc_hba *phba) + lpfc_linkup_port(vports[i]); + lpfc_destroy_vport_work_array(phba, vports); + ++ /* Clear the pport flogi counter in case the link down was ++ * absorbed without an ACQE. No lock here - in worker thread ++ * and discovery is synchronized. ++ */ ++ spin_lock_irq(shost->host_lock); ++ phba->pport->rcv_flogi_cnt = 0; ++ spin_unlock_irq(shost->host_lock); + return 0; + } + +@@ -1997,6 +2006,26 @@ int lpfc_sli4_fcf_rr_next_proc(struct lpfc_vport *vport, uint16_t fcf_index) + "failover and change port state:x%x/x%x\n", + phba->pport->port_state, LPFC_VPORT_UNKNOWN); + phba->pport->port_state = LPFC_VPORT_UNKNOWN; ++ ++ if (!phba->fcf.fcf_redisc_attempted) { ++ lpfc_unregister_fcf(phba); ++ ++ rc = lpfc_sli4_redisc_fcf_table(phba); ++ if (!rc) { ++ lpfc_printf_log(phba, KERN_INFO, LOG_FIP, ++ "3195 Rediscover FCF table\n"); ++ phba->fcf.fcf_redisc_attempted = 1; ++ lpfc_sli4_clear_fcf_rr_bmask(phba); ++ } else { ++ lpfc_printf_log(phba, KERN_WARNING, LOG_FIP, ++ "3196 Rediscover FCF table " ++ "failed. Status:x%x\n", rc); ++ } ++ } else { ++ lpfc_printf_log(phba, KERN_WARNING, LOG_FIP, ++ "3197 Already rediscover FCF table " ++ "attempted. No more retry\n"); ++ } + goto stop_flogi_current_fcf; + } else { + lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_ELS, +diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c +index 9acb5b44ce4c..a7d3e532e0f5 100644 +--- a/drivers/scsi/lpfc/lpfc_init.c ++++ b/drivers/scsi/lpfc/lpfc_init.c +@@ -5044,7 +5044,7 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba, + break; + } + /* If fast FCF failover rescan event is pending, do nothing */ +- if (phba->fcf.fcf_flag & FCF_REDISC_EVT) { ++ if (phba->fcf.fcf_flag & (FCF_REDISC_EVT | FCF_REDISC_PEND)) { + spin_unlock_irq(&phba->hbalock); + break; + } +diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c +index c15f3265eefe..bd8dc6a2243c 100644 +--- a/drivers/scsi/lpfc/lpfc_nportdisc.c ++++ b/drivers/scsi/lpfc/lpfc_nportdisc.c +@@ -2868,8 +2868,9 @@ lpfc_disc_state_machine(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, + /* DSM in event <evt> on NPort <nlp_DID> in state <cur_state> */ + lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY, + "0211 DSM in event x%x on NPort x%x in " +- "state %d Data: x%x\n", +- evt, ndlp->nlp_DID, cur_state, ndlp->nlp_flag); ++ "state %d Data: x%x x%x\n", ++ evt, ndlp->nlp_DID, cur_state, ++ ndlp->nlp_flag, ndlp->nlp_fc4_type); + + lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_DSM, + "DSM in: evt:%d ste:%d did:x%x", +diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c +index e704297618e0..3361ae75578f 100644 +--- a/drivers/scsi/lpfc/lpfc_sli.c ++++ b/drivers/scsi/lpfc/lpfc_sli.c +@@ -18431,15 +18431,8 @@ next_priority: + goto initial_priority; + lpfc_printf_log(phba, KERN_WARNING, LOG_FIP, + "2844 No roundrobin failover FCF available\n"); +- if (next_fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX) +- return LPFC_FCOE_FCF_NEXT_NONE; +- else { +- lpfc_printf_log(phba, KERN_WARNING, LOG_FIP, +- "3063 Only FCF available idx %d, flag %x\n", +- next_fcf_index, +- phba->fcf.fcf_pri[next_fcf_index].fcf_rec.flag); +- return next_fcf_index; +- } ++ ++ return LPFC_FCOE_FCF_NEXT_NONE; + } + + if (next_fcf_index < LPFC_SLI4_FCF_TBL_INDX_MAX && +diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h +index 399c0015c546..3dcc6615a23b 100644 +--- a/drivers/scsi/lpfc/lpfc_sli4.h ++++ b/drivers/scsi/lpfc/lpfc_sli4.h +@@ -279,6 +279,7 @@ struct lpfc_fcf { + #define FCF_REDISC_EVT 0x100 /* FCF rediscovery event to worker thread */ + #define FCF_REDISC_FOV 0x200 /* Post FCF rediscovery fast failover */ + #define FCF_REDISC_PROG (FCF_REDISC_PEND | FCF_REDISC_EVT) ++ uint16_t fcf_redisc_attempted; + uint32_t addr_mode; + uint32_t eligible_fcf_cnt; + struct lpfc_fcf_rec current_rec; +diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c +index bc37666f998e..2f31d266339f 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_base.c ++++ b/drivers/scsi/megaraid/megaraid_sas_base.c +@@ -3894,12 +3894,12 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr) + /* + * The cur_state should not last for more than max_wait secs + */ +- for (i = 0; i < (max_wait * 1000); i++) { ++ for (i = 0; i < max_wait; i++) { + curr_abs_state = instance->instancet-> + read_fw_status_reg(instance->reg_set); + + if (abs_state == curr_abs_state) { +- msleep(1); ++ msleep(1000); + } else + break; + } +@@ -5410,7 +5410,7 @@ static int megasas_init_fw(struct megasas_instance *instance) + if (!instance->msix_vectors) { + i = pci_alloc_irq_vectors(instance->pdev, 1, 1, PCI_IRQ_LEGACY); + if (i < 0) +- goto fail_setup_irqs; ++ goto fail_init_adapter; + } + + megasas_setup_reply_map(instance); +@@ -5619,9 +5619,8 @@ static int megasas_init_fw(struct megasas_instance *instance) + + fail_get_ld_pd_list: + instance->instancet->disable_intr(instance); +-fail_init_adapter: + megasas_destroy_irqs(instance); +-fail_setup_irqs: ++fail_init_adapter: + if (instance->msix_vectors) + pci_free_irq_vectors(instance->pdev); + instance->msix_vectors = 0; +diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c +index d2ab52026014..2c556c7fcf0d 100644 +--- a/drivers/scsi/mpt3sas/mpt3sas_base.c ++++ b/drivers/scsi/mpt3sas/mpt3sas_base.c +@@ -4117,7 +4117,7 @@ _base_static_config_pages(struct MPT3SAS_ADAPTER *ioc) + * flag unset in NVDATA. + */ + mpt3sas_config_get_manufacturing_pg11(ioc, &mpi_reply, &ioc->manu_pg11); +- if (ioc->manu_pg11.EEDPTagMode == 0) { ++ if (!ioc->is_gen35_ioc && ioc->manu_pg11.EEDPTagMode == 0) { + pr_err("%s: overriding NVDATA EEDPTagMode setting\n", + ioc->name); + ioc->manu_pg11.EEDPTagMode &= ~0x3; +diff --git a/drivers/scsi/mpt3sas/mpt3sas_config.c b/drivers/scsi/mpt3sas/mpt3sas_config.c +index d29a2dcc7d0e..9b01c5a7aebd 100644 +--- a/drivers/scsi/mpt3sas/mpt3sas_config.c ++++ b/drivers/scsi/mpt3sas/mpt3sas_config.c +@@ -692,10 +692,6 @@ mpt3sas_config_set_manufacturing_pg11(struct MPT3SAS_ADAPTER *ioc, + r = _config_request(ioc, &mpi_request, mpi_reply, + MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, + sizeof(*config_page)); +- mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM; +- r = _config_request(ioc, &mpi_request, mpi_reply, +- MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, +- sizeof(*config_page)); + out: + return r; + } +diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c +index 73d661a0ecbb..d3c944d99703 100644 +--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c ++++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c +@@ -3791,6 +3791,40 @@ _scsih_tm_tr_complete(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, + return _scsih_check_for_pending_tm(ioc, smid); + } + ++/** _scsih_allow_scmd_to_device - check whether scmd needs to ++ * issue to IOC or not. ++ * @ioc: per adapter object ++ * @scmd: pointer to scsi command object ++ * ++ * Returns true if scmd can be issued to IOC otherwise returns false. ++ */ ++inline bool _scsih_allow_scmd_to_device(struct MPT3SAS_ADAPTER *ioc, ++ struct scsi_cmnd *scmd) ++{ ++ ++ if (ioc->pci_error_recovery) ++ return false; ++ ++ if (ioc->hba_mpi_version_belonged == MPI2_VERSION) { ++ if (ioc->remove_host) ++ return false; ++ ++ return true; ++ } ++ ++ if (ioc->remove_host) { ++ ++ switch (scmd->cmnd[0]) { ++ case SYNCHRONIZE_CACHE: ++ case START_STOP: ++ return true; ++ default: ++ return false; ++ } ++ } ++ ++ return true; ++} + + /** + * _scsih_sas_control_complete - completion routine +@@ -4623,7 +4657,7 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) + return 0; + } + +- if (ioc->pci_error_recovery || ioc->remove_host) { ++ if (!(_scsih_allow_scmd_to_device(ioc, scmd))) { + scmd->result = DID_NO_CONNECT << 16; + scmd->scsi_done(scmd); + return 0; +diff --git a/drivers/scsi/zorro_esp.c b/drivers/scsi/zorro_esp.c +index bb70882e6b56..be79127db594 100644 +--- a/drivers/scsi/zorro_esp.c ++++ b/drivers/scsi/zorro_esp.c +@@ -245,7 +245,7 @@ static int fastlane_esp_irq_pending(struct esp *esp) + static u32 zorro_esp_dma_length_limit(struct esp *esp, u32 dma_addr, + u32 dma_len) + { +- return dma_len > 0xFFFFFF ? 0xFFFFFF : dma_len; ++ return dma_len > 0xFFFF ? 0xFFFF : dma_len; + } + + static void zorro_esp_reset_dma(struct esp *esp) +@@ -484,7 +484,6 @@ static void zorro_esp_send_blz1230_dma_cmd(struct esp *esp, u32 addr, + scsi_esp_cmd(esp, ESP_CMD_DMA); + zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW); + zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED); +- zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI); + + scsi_esp_cmd(esp, cmd); + } +@@ -529,7 +528,6 @@ static void zorro_esp_send_blz1230II_dma_cmd(struct esp *esp, u32 addr, + scsi_esp_cmd(esp, ESP_CMD_DMA); + zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW); + zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED); +- zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI); + + scsi_esp_cmd(esp, cmd); + } +@@ -574,7 +572,6 @@ static void zorro_esp_send_blz2060_dma_cmd(struct esp *esp, u32 addr, + scsi_esp_cmd(esp, ESP_CMD_DMA); + zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW); + zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED); +- zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI); + + scsi_esp_cmd(esp, cmd); + } +@@ -599,7 +596,6 @@ static void zorro_esp_send_cyber_dma_cmd(struct esp *esp, u32 addr, + + zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW); + zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED); +- zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI); + + if (write) { + /* DMA receive */ +@@ -649,7 +645,6 @@ static void zorro_esp_send_cyberII_dma_cmd(struct esp *esp, u32 addr, + + zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW); + zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED); +- zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI); + + if (write) { + /* DMA receive */ +@@ -691,7 +686,6 @@ static void zorro_esp_send_fastlane_dma_cmd(struct esp *esp, u32 addr, + + zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW); + zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED); +- zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI); + + if (write) { + /* DMA receive */ +diff --git a/drivers/soc/bcm/brcmstb/pm/pm-arm.c b/drivers/soc/bcm/brcmstb/pm/pm-arm.c +index a5577dd5eb08..8ee06347447c 100644 +--- a/drivers/soc/bcm/brcmstb/pm/pm-arm.c ++++ b/drivers/soc/bcm/brcmstb/pm/pm-arm.c +@@ -404,7 +404,7 @@ noinline int brcmstb_pm_s3_finish(void) + { + struct brcmstb_s3_params *params = ctrl.s3_params; + dma_addr_t params_pa = ctrl.s3_params_pa; +- phys_addr_t reentry = virt_to_phys(&cpu_resume); ++ phys_addr_t reentry = virt_to_phys(&cpu_resume_arm); + enum bsp_initiate_command cmd; + u32 flags; + +diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c +index e2be7da74343..eb2d2de172af 100644 +--- a/drivers/spi/spi-omap2-mcspi.c ++++ b/drivers/spi/spi-omap2-mcspi.c +@@ -299,7 +299,7 @@ static void omap2_mcspi_set_fifo(const struct spi_device *spi, + struct omap2_mcspi_cs *cs = spi->controller_state; + struct omap2_mcspi *mcspi; + unsigned int wcnt; +- int max_fifo_depth, fifo_depth, bytes_per_word; ++ int max_fifo_depth, bytes_per_word; + u32 chconf, xferlevel; + + mcspi = spi_master_get_devdata(master); +@@ -315,10 +315,6 @@ static void omap2_mcspi_set_fifo(const struct spi_device *spi, + else + max_fifo_depth = OMAP2_MCSPI_MAX_FIFODEPTH; + +- fifo_depth = gcd(t->len, max_fifo_depth); +- if (fifo_depth < 2 || fifo_depth % bytes_per_word != 0) +- goto disable_fifo; +- + wcnt = t->len / bytes_per_word; + if (wcnt > OMAP2_MCSPI_MAX_FIFOWCNT) + goto disable_fifo; +@@ -326,16 +322,17 @@ static void omap2_mcspi_set_fifo(const struct spi_device *spi, + xferlevel = wcnt << 16; + if (t->rx_buf != NULL) { + chconf |= OMAP2_MCSPI_CHCONF_FFER; +- xferlevel |= (fifo_depth - 1) << 8; ++ xferlevel |= (bytes_per_word - 1) << 8; + } ++ + if (t->tx_buf != NULL) { + chconf |= OMAP2_MCSPI_CHCONF_FFET; +- xferlevel |= fifo_depth - 1; ++ xferlevel |= bytes_per_word - 1; + } + + mcspi_write_reg(master, OMAP2_MCSPI_XFERLEVEL, xferlevel); + mcspi_write_chconf0(spi, chconf); +- mcspi->fifo_depth = fifo_depth; ++ mcspi->fifo_depth = max_fifo_depth; + + return; + } +@@ -585,7 +582,6 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer) + struct dma_slave_config cfg; + enum dma_slave_buswidth width; + unsigned es; +- u32 burst; + void __iomem *chstat_reg; + void __iomem *irqstat_reg; + int wait_res; +@@ -605,22 +601,14 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer) + } + + count = xfer->len; +- burst = 1; +- +- if (mcspi->fifo_depth > 0) { +- if (count > mcspi->fifo_depth) +- burst = mcspi->fifo_depth / es; +- else +- burst = count / es; +- } + + memset(&cfg, 0, sizeof(cfg)); + cfg.src_addr = cs->phys + OMAP2_MCSPI_RX0; + cfg.dst_addr = cs->phys + OMAP2_MCSPI_TX0; + cfg.src_addr_width = width; + cfg.dst_addr_width = width; +- cfg.src_maxburst = burst; +- cfg.dst_maxburst = burst; ++ cfg.src_maxburst = 1; ++ cfg.dst_maxburst = 1; + + rx = xfer->rx_buf; + tx = xfer->tx_buf; +diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c +index 101cd6aae2ea..30ea0a2068e0 100644 +--- a/drivers/spi/spi-sh-msiof.c ++++ b/drivers/spi/spi-sh-msiof.c +@@ -1343,8 +1343,8 @@ static int sh_msiof_spi_probe(struct platform_device *pdev) + + i = platform_get_irq(pdev, 0); + if (i < 0) { +- dev_err(&pdev->dev, "cannot get platform IRQ\n"); +- ret = -ENOENT; ++ dev_err(&pdev->dev, "cannot get IRQ\n"); ++ ret = i; + goto err1; + } + +diff --git a/drivers/staging/comedi/drivers/usbduxfast.c b/drivers/staging/comedi/drivers/usbduxfast.c +index e18c0723b760..0d38589c2600 100644 +--- a/drivers/staging/comedi/drivers/usbduxfast.c ++++ b/drivers/staging/comedi/drivers/usbduxfast.c +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: GPL-2.0+ + /* +- * Copyright (C) 2004-2014 Bernd Porr, mail@berndporr.me.uk ++ * Copyright (C) 2004-2019 Bernd Porr, mail@berndporr.me.uk + */ + + /* +@@ -8,7 +8,7 @@ + * Description: University of Stirling USB DAQ & INCITE Technology Limited + * Devices: [ITL] USB-DUX-FAST (usbduxfast) + * Author: Bernd Porr <mail@berndporr.me.uk> +- * Updated: 10 Oct 2014 ++ * Updated: 16 Nov 2019 + * Status: stable + */ + +@@ -22,6 +22,7 @@ + * + * + * Revision history: ++ * 1.0: Fixed a rounding error in usbduxfast_ai_cmdtest + * 0.9: Dropping the first data packet which seems to be from the last transfer. + * Buffer overflows in the FX2 are handed over to comedi. + * 0.92: Dropping now 4 packets. The quad buffer has to be emptied. +@@ -350,6 +351,7 @@ static int usbduxfast_ai_cmdtest(struct comedi_device *dev, + struct comedi_cmd *cmd) + { + int err = 0; ++ int err2 = 0; + unsigned int steps; + unsigned int arg; + +@@ -399,11 +401,16 @@ static int usbduxfast_ai_cmdtest(struct comedi_device *dev, + */ + steps = (cmd->convert_arg * 30) / 1000; + if (cmd->chanlist_len != 1) +- err |= comedi_check_trigger_arg_min(&steps, +- MIN_SAMPLING_PERIOD); +- err |= comedi_check_trigger_arg_max(&steps, MAX_SAMPLING_PERIOD); +- arg = (steps * 1000) / 30; +- err |= comedi_check_trigger_arg_is(&cmd->convert_arg, arg); ++ err2 |= comedi_check_trigger_arg_min(&steps, ++ MIN_SAMPLING_PERIOD); ++ else ++ err2 |= comedi_check_trigger_arg_min(&steps, 1); ++ err2 |= comedi_check_trigger_arg_max(&steps, MAX_SAMPLING_PERIOD); ++ if (err2) { ++ err |= err2; ++ arg = (steps * 1000) / 30; ++ err |= comedi_check_trigger_arg_is(&cmd->convert_arg, arg); ++ } + + if (cmd->stop_src == TRIG_COUNT) + err |= comedi_check_trigger_arg_min(&cmd->stop_arg, 1); +diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c +index e16b3cb1808c..1c9830b2c84d 100644 +--- a/drivers/thermal/armada_thermal.c ++++ b/drivers/thermal/armada_thermal.c +@@ -526,8 +526,8 @@ static int armada_thermal_probe_legacy(struct platform_device *pdev, + + /* First memory region points towards the status register */ + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- if (IS_ERR(res)) +- return PTR_ERR(res); ++ if (!res) ++ return -EIO; + + /* + * Edit the resource start address and length to map over all the +diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c +index 8df2ce94c28d..4dc30e7890f6 100644 +--- a/drivers/thermal/rcar_thermal.c ++++ b/drivers/thermal/rcar_thermal.c +@@ -434,8 +434,8 @@ static irqreturn_t rcar_thermal_irq(int irq, void *data) + rcar_thermal_for_each_priv(priv, common) { + if (rcar_thermal_had_changed(priv, status)) { + rcar_thermal_irq_disable(priv); +- schedule_delayed_work(&priv->work, +- msecs_to_jiffies(300)); ++ queue_delayed_work(system_freezable_wq, &priv->work, ++ msecs_to_jiffies(300)); + } + } + +@@ -493,7 +493,7 @@ static int rcar_thermal_probe(struct platform_device *pdev) + pm_runtime_get_sync(dev); + + for (i = 0; i < chip->nirqs; i++) { +- irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); ++ irq = platform_get_resource(pdev, IORESOURCE_IRQ, i); + if (!irq) + continue; + if (!common->base) { +diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c +index 678406e0948b..00099a8439d2 100644 +--- a/drivers/tty/pty.c ++++ b/drivers/tty/pty.c +@@ -28,6 +28,7 @@ + #include <linux/mount.h> + #include <linux/file.h> + #include <linux/ioctl.h> ++#include <linux/compat.h> + + #undef TTY_DEBUG_HANGUP + #ifdef TTY_DEBUG_HANGUP +@@ -488,6 +489,7 @@ static int pty_bsd_ioctl(struct tty_struct *tty, + return -ENOIOCTLCMD; + } + ++#ifdef CONFIG_COMPAT + static long pty_bsd_compat_ioctl(struct tty_struct *tty, + unsigned int cmd, unsigned long arg) + { +@@ -495,8 +497,11 @@ static long pty_bsd_compat_ioctl(struct tty_struct *tty, + * PTY ioctls don't require any special translation between 32-bit and + * 64-bit userspace, they are already compatible. + */ +- return pty_bsd_ioctl(tty, cmd, arg); ++ return pty_bsd_ioctl(tty, cmd, (unsigned long)compat_ptr(arg)); + } ++#else ++#define pty_bsd_compat_ioctl NULL ++#endif + + static int legacy_count = CONFIG_LEGACY_PTY_COUNT; + /* +@@ -676,6 +681,7 @@ static int pty_unix98_ioctl(struct tty_struct *tty, + return -ENOIOCTLCMD; + } + ++#ifdef CONFIG_COMPAT + static long pty_unix98_compat_ioctl(struct tty_struct *tty, + unsigned int cmd, unsigned long arg) + { +@@ -683,8 +689,12 @@ static long pty_unix98_compat_ioctl(struct tty_struct *tty, + * PTY ioctls don't require any special translation between 32-bit and + * 64-bit userspace, they are already compatible. + */ +- return pty_unix98_ioctl(tty, cmd, arg); ++ return pty_unix98_ioctl(tty, cmd, ++ cmd == TIOCSIG ? arg : (unsigned long)compat_ptr(arg)); + } ++#else ++#define pty_unix98_compat_ioctl NULL ++#endif + + /** + * ptm_unix98_lookup - find a pty master +diff --git a/drivers/tty/synclink_gt.c b/drivers/tty/synclink_gt.c +index a94086597ebd..b88ecf102764 100644 +--- a/drivers/tty/synclink_gt.c ++++ b/drivers/tty/synclink_gt.c +@@ -1186,14 +1186,13 @@ static long slgt_compat_ioctl(struct tty_struct *tty, + unsigned int cmd, unsigned long arg) + { + struct slgt_info *info = tty->driver_data; +- int rc = -ENOIOCTLCMD; ++ int rc; + + if (sanity_check(info, tty->name, "compat_ioctl")) + return -ENODEV; + DBGINFO(("%s compat_ioctl() cmd=%08X\n", info->device_name, cmd)); + + switch (cmd) { +- + case MGSL_IOCSPARAMS32: + rc = set_params32(info, compat_ptr(arg)); + break; +@@ -1213,18 +1212,11 @@ static long slgt_compat_ioctl(struct tty_struct *tty, + case MGSL_IOCWAITGPIO: + case MGSL_IOCGXSYNC: + case MGSL_IOCGXCTRL: +- case MGSL_IOCSTXIDLE: +- case MGSL_IOCTXENABLE: +- case MGSL_IOCRXENABLE: +- case MGSL_IOCTXABORT: +- case TIOCMIWAIT: +- case MGSL_IOCSIF: +- case MGSL_IOCSXSYNC: +- case MGSL_IOCSXCTRL: +- rc = ioctl(tty, cmd, arg); ++ rc = ioctl(tty, cmd, (unsigned long)compat_ptr(arg)); + break; ++ default: ++ rc = ioctl(tty, cmd, arg); + } +- + DBGINFO(("%s compat_ioctl() cmd=%08X rc=%d\n", info->device_name, cmd, rc)); + return rc; + } +diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c +index 1c6da8d6cccf..718d692b07ac 100644 +--- a/drivers/usb/misc/appledisplay.c ++++ b/drivers/usb/misc/appledisplay.c +@@ -148,8 +148,11 @@ static int appledisplay_bl_update_status(struct backlight_device *bd) + pdata->msgdata, 2, + ACD_USB_TIMEOUT); + mutex_unlock(&pdata->sysfslock); +- +- return retval; ++ ++ if (retval < 0) ++ return retval; ++ else ++ return 0; + } + + static int appledisplay_bl_get_brightness(struct backlight_device *bd) +@@ -167,7 +170,12 @@ static int appledisplay_bl_get_brightness(struct backlight_device *bd) + 0, + pdata->msgdata, 2, + ACD_USB_TIMEOUT); +- brightness = pdata->msgdata[1]; ++ if (retval < 2) { ++ if (retval >= 0) ++ retval = -EMSGSIZE; ++ } else { ++ brightness = pdata->msgdata[1]; ++ } + mutex_unlock(&pdata->sysfslock); + + if (retval < 0) +@@ -302,6 +310,7 @@ error: + if (pdata) { + if (pdata->urb) { + usb_kill_urb(pdata->urb); ++ cancel_delayed_work_sync(&pdata->work); + if (pdata->urbdata) + usb_free_coherent(pdata->udev, ACD_URB_BUFFER_LEN, + pdata->urbdata, pdata->urb->transfer_dma); +diff --git a/drivers/usb/misc/chaoskey.c b/drivers/usb/misc/chaoskey.c +index 34e6cd6f40d3..87067c3d6109 100644 +--- a/drivers/usb/misc/chaoskey.c ++++ b/drivers/usb/misc/chaoskey.c +@@ -384,13 +384,17 @@ static int _chaoskey_fill(struct chaoskey *dev) + !dev->reading, + (started ? NAK_TIMEOUT : ALEA_FIRST_TIMEOUT) ); + +- if (result < 0) ++ if (result < 0) { ++ usb_kill_urb(dev->urb); + goto out; ++ } + +- if (result == 0) ++ if (result == 0) { + result = -ETIMEDOUT; +- else ++ usb_kill_urb(dev->urb); ++ } else { + result = dev->valid; ++ } + out: + /* Let the device go back to sleep eventually */ + usb_autopm_put_interface(dev->interface); +@@ -526,7 +530,21 @@ static int chaoskey_suspend(struct usb_interface *interface, + + static int chaoskey_resume(struct usb_interface *interface) + { ++ struct chaoskey *dev; ++ struct usb_device *udev = interface_to_usbdev(interface); ++ + usb_dbg(interface, "resume"); ++ dev = usb_get_intfdata(interface); ++ ++ /* ++ * We may have lost power. ++ * In that case the device that needs a long time ++ * for the first requests needs an extended timeout ++ * again ++ */ ++ if (le16_to_cpu(udev->descriptor.idVendor) == ALEA_VENDOR_ID) ++ dev->reads_started = false; ++ + return 0; + } + #else +diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c +index e732949f6567..7ae121567098 100644 +--- a/drivers/usb/serial/cp210x.c ++++ b/drivers/usb/serial/cp210x.c +@@ -125,6 +125,7 @@ static const struct usb_device_id id_table[] = { + { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */ + { USB_DEVICE(0x10C4, 0x8382) }, /* Cygnal Integrated Products, Inc. */ + { USB_DEVICE(0x10C4, 0x83A8) }, /* Amber Wireless AMB2560 */ ++ { USB_DEVICE(0x10C4, 0x83AA) }, /* Mark-10 Digital Force Gauge */ + { USB_DEVICE(0x10C4, 0x83D8) }, /* DekTec DTA Plus VHF/UHF Booster/Attenuator */ + { USB_DEVICE(0x10C4, 0x8411) }, /* Kyocera GPS Module */ + { USB_DEVICE(0x10C4, 0x8418) }, /* IRZ Automation Teleport SG-10 GSM/GPRS Modem */ +diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c +index e8f275a0326d..c0232b67a40f 100644 +--- a/drivers/usb/serial/mos7720.c ++++ b/drivers/usb/serial/mos7720.c +@@ -1894,10 +1894,6 @@ static int mos7720_startup(struct usb_serial *serial) + product = le16_to_cpu(serial->dev->descriptor.idProduct); + dev = serial->dev; + +- /* setting configuration feature to one */ +- usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), +- (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000); +- + if (product == MOSCHIP_DEVICE_ID_7715) { + struct urb *urb = serial->port[0]->interrupt_in_urb; + +diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c +index b42bad85097a..4a7bd26841af 100644 +--- a/drivers/usb/serial/mos7840.c ++++ b/drivers/usb/serial/mos7840.c +@@ -118,11 +118,15 @@ + /* This driver also supports + * ATEN UC2324 device using Moschip MCS7840 + * ATEN UC2322 device using Moschip MCS7820 ++ * MOXA UPort 2210 device using Moschip MCS7820 + */ + #define USB_VENDOR_ID_ATENINTL 0x0557 + #define ATENINTL_DEVICE_ID_UC2324 0x2011 + #define ATENINTL_DEVICE_ID_UC2322 0x7820 + ++#define USB_VENDOR_ID_MOXA 0x110a ++#define MOXA_DEVICE_ID_2210 0x2210 ++ + /* Interrupt Routine Defines */ + + #define SERIAL_IIR_RLS 0x06 +@@ -193,6 +197,7 @@ static const struct usb_device_id id_table[] = { + {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)}, + {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)}, + {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)}, ++ {USB_DEVICE(USB_VENDOR_ID_MOXA, MOXA_DEVICE_ID_2210)}, + {} /* terminating entry */ + }; + MODULE_DEVICE_TABLE(usb, id_table); +@@ -2053,6 +2058,7 @@ static int mos7840_probe(struct usb_serial *serial, + const struct usb_device_id *id) + { + u16 product = le16_to_cpu(serial->dev->descriptor.idProduct); ++ u16 vid = le16_to_cpu(serial->dev->descriptor.idVendor); + u8 *buf; + int device_type; + +@@ -2062,6 +2068,11 @@ static int mos7840_probe(struct usb_serial *serial, + goto out; + } + ++ if (vid == USB_VENDOR_ID_MOXA && product == MOXA_DEVICE_ID_2210) { ++ device_type = MOSCHIP_DEVICE_ID_7820; ++ goto out; ++ } ++ + buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL); + if (!buf) + return -ENOMEM; +@@ -2314,11 +2325,6 @@ out: + goto error; + } else + dev_dbg(&port->dev, "ZLP_REG5 Writing success status%d\n", status); +- +- /* setting configuration feature to one */ +- usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), +- 0x03, 0x00, 0x01, 0x00, NULL, 0x00, +- MOS_WDR_TIMEOUT); + } + return 0; + error: +diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c +index 3cc659a62782..2905274e3626 100644 +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -197,6 +197,7 @@ static void option_instat_callback(struct urb *urb); + #define DELL_PRODUCT_5804_MINICARD_ATT 0x819b /* Novatel E371 */ + + #define DELL_PRODUCT_5821E 0x81d7 ++#define DELL_PRODUCT_5821E_ESIM 0x81e0 + + #define KYOCERA_VENDOR_ID 0x0c88 + #define KYOCERA_PRODUCT_KPC650 0x17da +@@ -1044,6 +1045,8 @@ static const struct usb_device_id option_ids[] = { + { USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5804_MINICARD_ATT, 0xff, 0xff, 0xff) }, + { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5821E), + .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, ++ { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5821E_ESIM), ++ .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, + { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */ + { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, + { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, +@@ -1990,6 +1993,10 @@ static const struct usb_device_id option_ids[] = { + { USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0xa31d, 0xff, 0x06, 0x13) }, + { USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0xa31d, 0xff, 0x06, 0x14) }, + { USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0xa31d, 0xff, 0x06, 0x1b) }, ++ { USB_DEVICE(0x0489, 0xe0b4), /* Foxconn T77W968 */ ++ .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, ++ { USB_DEVICE(0x0489, 0xe0b5), /* Foxconn T77W968 ESIM */ ++ .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, + { USB_DEVICE(0x1508, 0x1001), /* Fibocom NL668 */ + .driver_info = RSVD(4) | RSVD(5) | RSVD(6) }, + { USB_DEVICE(0x2cb7, 0x0104), /* Fibocom NL678 series */ +diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c +index 819ae3b2bd7e..39cf19001239 100644 +--- a/drivers/usb/typec/tcpm.c ++++ b/drivers/usb/typec/tcpm.c +@@ -3322,7 +3322,8 @@ static void run_state_machine(struct tcpm_port *port) + case SNK_HARD_RESET_SINK_OFF: + memset(&port->pps_data, 0, sizeof(port->pps_data)); + tcpm_set_vconn(port, false); +- tcpm_set_charge(port, false); ++ if (port->pd_capable) ++ tcpm_set_charge(port, false); + tcpm_set_roles(port, port->self_powered, TYPEC_SINK, + TYPEC_DEVICE); + /* +@@ -3354,6 +3355,12 @@ static void run_state_machine(struct tcpm_port *port) + * Similar, dual-mode ports in source mode should transition + * to PE_SNK_Transition_to_default. + */ ++ if (port->pd_capable) { ++ tcpm_set_current_limit(port, ++ tcpm_get_current_limit(port), ++ 5000); ++ tcpm_set_charge(port, true); ++ } + tcpm_set_attached_state(port, true); + tcpm_set_state(port, SNK_STARTUP, 0); + break; +diff --git a/drivers/usb/usbip/Kconfig b/drivers/usb/usbip/Kconfig +index a20b65cb6678..8276a20ecea7 100644 +--- a/drivers/usb/usbip/Kconfig ++++ b/drivers/usb/usbip/Kconfig +@@ -2,6 +2,7 @@ config USBIP_CORE + tristate "USB/IP support" + depends on NET + select USB_COMMON ++ select SGL_ALLOC + ---help--- + This enables pushing USB packets over IP to allow remote + machines direct access to USB devices. It provides the +diff --git a/drivers/usb/usbip/stub_rx.c b/drivers/usb/usbip/stub_rx.c +index 75d8756c6d27..8c55cd833098 100644 +--- a/drivers/usb/usbip/stub_rx.c ++++ b/drivers/usb/usbip/stub_rx.c +@@ -470,18 +470,50 @@ static void stub_recv_cmd_submit(struct stub_device *sdev, + if (pipe == -1) + return; + ++ /* ++ * Smatch reported the error case where use_sg is true and buf_len is 0. ++ * In this case, It adds SDEV_EVENT_ERROR_MALLOC and stub_priv will be ++ * released by stub event handler and connection will be shut down. ++ */ + priv = stub_priv_alloc(sdev, pdu); + if (!priv) + return; + + buf_len = (unsigned long long)pdu->u.cmd_submit.transfer_buffer_length; + ++ if (use_sg && !buf_len) { ++ dev_err(&udev->dev, "sg buffer with zero length\n"); ++ goto err_malloc; ++ } ++ + /* allocate urb transfer buffer, if needed */ + if (buf_len) { + if (use_sg) { + sgl = sgl_alloc(buf_len, GFP_KERNEL, &nents); + if (!sgl) + goto err_malloc; ++ ++ /* Check if the server's HCD supports SG */ ++ if (!udev->bus->sg_tablesize) { ++ /* ++ * If the server's HCD doesn't support SG, break ++ * a single SG request into several URBs and map ++ * each SG list entry to corresponding URB ++ * buffer. The previously allocated SG list is ++ * stored in priv->sgl (If the server's HCD ++ * support SG, SG list is stored only in ++ * urb->sg) and it is used as an indicator that ++ * the server split single SG request into ++ * several URBs. Later, priv->sgl is used by ++ * stub_complete() and stub_send_ret_submit() to ++ * reassemble the divied URBs. ++ */ ++ support_sg = 0; ++ num_urbs = nents; ++ priv->completed_urbs = 0; ++ pdu->u.cmd_submit.transfer_flags &= ++ ~URB_DMA_MAP_SG; ++ } + } else { + buffer = kzalloc(buf_len, GFP_KERNEL); + if (!buffer) +@@ -489,24 +521,6 @@ static void stub_recv_cmd_submit(struct stub_device *sdev, + } + } + +- /* Check if the server's HCD supports SG */ +- if (use_sg && !udev->bus->sg_tablesize) { +- /* +- * If the server's HCD doesn't support SG, break a single SG +- * request into several URBs and map each SG list entry to +- * corresponding URB buffer. The previously allocated SG +- * list is stored in priv->sgl (If the server's HCD support SG, +- * SG list is stored only in urb->sg) and it is used as an +- * indicator that the server split single SG request into +- * several URBs. Later, priv->sgl is used by stub_complete() and +- * stub_send_ret_submit() to reassemble the divied URBs. +- */ +- support_sg = 0; +- num_urbs = nents; +- priv->completed_urbs = 0; +- pdu->u.cmd_submit.transfer_flags &= ~URB_DMA_MAP_SG; +- } +- + /* allocate urb array */ + priv->num_urbs = num_urbs; + priv->urbs = kmalloc_array(num_urbs, sizeof(*priv->urbs), GFP_KERNEL); +diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c +index bab495d73195..8dcee4faf701 100644 +--- a/drivers/vhost/vsock.c ++++ b/drivers/vhost/vsock.c +@@ -103,7 +103,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock, + struct iov_iter iov_iter; + unsigned out, in; + size_t nbytes; +- size_t len; ++ size_t iov_len, payload_len; + int head; + + spin_lock_bh(&vsock->send_pkt_list_lock); +@@ -148,8 +148,24 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock, + break; + } + +- len = iov_length(&vq->iov[out], in); +- iov_iter_init(&iov_iter, READ, &vq->iov[out], in, len); ++ iov_len = iov_length(&vq->iov[out], in); ++ if (iov_len < sizeof(pkt->hdr)) { ++ virtio_transport_free_pkt(pkt); ++ vq_err(vq, "Buffer len [%zu] too small\n", iov_len); ++ break; ++ } ++ ++ iov_iter_init(&iov_iter, READ, &vq->iov[out], in, iov_len); ++ payload_len = pkt->len - pkt->off; ++ ++ /* If the packet is greater than the space available in the ++ * buffer, we split it using multiple buffers. ++ */ ++ if (payload_len > iov_len - sizeof(pkt->hdr)) ++ payload_len = iov_len - sizeof(pkt->hdr); ++ ++ /* Set the correct length in the header */ ++ pkt->hdr.len = cpu_to_le32(payload_len); + + nbytes = copy_to_iter(&pkt->hdr, sizeof(pkt->hdr), &iov_iter); + if (nbytes != sizeof(pkt->hdr)) { +@@ -158,33 +174,47 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock, + break; + } + +- nbytes = copy_to_iter(pkt->buf, pkt->len, &iov_iter); +- if (nbytes != pkt->len) { ++ nbytes = copy_to_iter(pkt->buf + pkt->off, payload_len, ++ &iov_iter); ++ if (nbytes != payload_len) { + virtio_transport_free_pkt(pkt); + vq_err(vq, "Faulted on copying pkt buf\n"); + break; + } + +- vhost_add_used(vq, head, sizeof(pkt->hdr) + pkt->len); ++ vhost_add_used(vq, head, sizeof(pkt->hdr) + payload_len); + added = true; + +- if (pkt->reply) { +- int val; +- +- val = atomic_dec_return(&vsock->queued_replies); +- +- /* Do we have resources to resume tx processing? */ +- if (val + 1 == tx_vq->num) +- restart_tx = true; +- } +- + /* Deliver to monitoring devices all correctly transmitted + * packets. + */ + virtio_transport_deliver_tap_pkt(pkt); + +- total_len += pkt->len; +- virtio_transport_free_pkt(pkt); ++ pkt->off += payload_len; ++ total_len += payload_len; ++ ++ /* If we didn't send all the payload we can requeue the packet ++ * to send it with the next available buffer. ++ */ ++ if (pkt->off < pkt->len) { ++ spin_lock_bh(&vsock->send_pkt_list_lock); ++ list_add(&pkt->list, &vsock->send_pkt_list); ++ spin_unlock_bh(&vsock->send_pkt_list_lock); ++ } else { ++ if (pkt->reply) { ++ int val; ++ ++ val = atomic_dec_return(&vsock->queued_replies); ++ ++ /* Do we have resources to resume tx ++ * processing? ++ */ ++ if (val + 1 == tx_vq->num) ++ restart_tx = true; ++ } ++ ++ virtio_transport_free_pkt(pkt); ++ } + } while(likely(!vhost_exceeds_weight(vq, ++pkts, total_len))); + if (added) + vhost_signal(&vsock->dev, vq); +diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c +index 9529e28e1822..6228b48d1e12 100644 +--- a/drivers/virtio/virtio_ring.c ++++ b/drivers/virtio/virtio_ring.c +@@ -431,7 +431,7 @@ unmap_release: + kfree(desc); + + END_USE(vq); +- return -EIO; ++ return -ENOMEM; + } + + /** +diff --git a/drivers/w1/slaves/w1_ds2438.c b/drivers/w1/slaves/w1_ds2438.c +index bf641a191d07..7c4e33dbee4d 100644 +--- a/drivers/w1/slaves/w1_ds2438.c ++++ b/drivers/w1/slaves/w1_ds2438.c +@@ -186,8 +186,8 @@ static int w1_ds2438_change_config_bit(struct w1_slave *sl, u8 mask, u8 value) + return -1; + } + +-static uint16_t w1_ds2438_get_voltage(struct w1_slave *sl, +- int adc_input, uint16_t *voltage) ++static int w1_ds2438_get_voltage(struct w1_slave *sl, ++ int adc_input, uint16_t *voltage) + { + unsigned int retries = W1_DS2438_RETRIES; + u8 w1_buf[DS2438_PAGE_SIZE + 1 /*for CRC*/]; +@@ -235,6 +235,25 @@ post_unlock: + return ret; + } + ++static int w1_ds2438_get_current(struct w1_slave *sl, int16_t *voltage) ++{ ++ u8 w1_buf[DS2438_PAGE_SIZE + 1 /*for CRC*/]; ++ int ret; ++ ++ mutex_lock(&sl->master->bus_mutex); ++ ++ if (w1_ds2438_get_page(sl, 0, w1_buf) == 0) { ++ /* The voltage measured across current sense resistor RSENS. */ ++ *voltage = (((int16_t) w1_buf[DS2438_CURRENT_MSB]) << 8) | ((int16_t) w1_buf[DS2438_CURRENT_LSB]); ++ ret = 0; ++ } else ++ ret = -1; ++ ++ mutex_unlock(&sl->master->bus_mutex); ++ ++ return ret; ++} ++ + static ssize_t iad_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, char *buf, + loff_t off, size_t count) +@@ -257,6 +276,27 @@ static ssize_t iad_write(struct file *filp, struct kobject *kobj, + return ret; + } + ++static ssize_t iad_read(struct file *filp, struct kobject *kobj, ++ struct bin_attribute *bin_attr, char *buf, ++ loff_t off, size_t count) ++{ ++ struct w1_slave *sl = kobj_to_w1_slave(kobj); ++ int ret; ++ int16_t voltage; ++ ++ if (off != 0) ++ return 0; ++ if (!buf) ++ return -EINVAL; ++ ++ if (w1_ds2438_get_current(sl, &voltage) == 0) { ++ ret = snprintf(buf, count, "%i\n", voltage); ++ } else ++ ret = -EIO; ++ ++ return ret; ++} ++ + static ssize_t page0_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, char *buf, + loff_t off, size_t count) +@@ -272,9 +312,13 @@ static ssize_t page0_read(struct file *filp, struct kobject *kobj, + + mutex_lock(&sl->master->bus_mutex); + ++ /* Read no more than page0 size */ ++ if (count > DS2438_PAGE_SIZE) ++ count = DS2438_PAGE_SIZE; ++ + if (w1_ds2438_get_page(sl, 0, w1_buf) == 0) { +- memcpy(buf, &w1_buf, DS2438_PAGE_SIZE); +- ret = DS2438_PAGE_SIZE; ++ memcpy(buf, &w1_buf, count); ++ ret = count; + } else + ret = -EIO; + +@@ -289,7 +333,6 @@ static ssize_t temperature_read(struct file *filp, struct kobject *kobj, + { + struct w1_slave *sl = kobj_to_w1_slave(kobj); + int ret; +- ssize_t c = PAGE_SIZE; + int16_t temp; + + if (off != 0) +@@ -298,8 +341,7 @@ static ssize_t temperature_read(struct file *filp, struct kobject *kobj, + return -EINVAL; + + if (w1_ds2438_get_temperature(sl, &temp) == 0) { +- c -= snprintf(buf + PAGE_SIZE - c, c, "%d\n", temp); +- ret = PAGE_SIZE - c; ++ ret = snprintf(buf, count, "%i\n", temp); + } else + ret = -EIO; + +@@ -312,7 +354,6 @@ static ssize_t vad_read(struct file *filp, struct kobject *kobj, + { + struct w1_slave *sl = kobj_to_w1_slave(kobj); + int ret; +- ssize_t c = PAGE_SIZE; + uint16_t voltage; + + if (off != 0) +@@ -321,8 +362,7 @@ static ssize_t vad_read(struct file *filp, struct kobject *kobj, + return -EINVAL; + + if (w1_ds2438_get_voltage(sl, DS2438_ADC_INPUT_VAD, &voltage) == 0) { +- c -= snprintf(buf + PAGE_SIZE - c, c, "%d\n", voltage); +- ret = PAGE_SIZE - c; ++ ret = snprintf(buf, count, "%u\n", voltage); + } else + ret = -EIO; + +@@ -335,7 +375,6 @@ static ssize_t vdd_read(struct file *filp, struct kobject *kobj, + { + struct w1_slave *sl = kobj_to_w1_slave(kobj); + int ret; +- ssize_t c = PAGE_SIZE; + uint16_t voltage; + + if (off != 0) +@@ -344,15 +383,14 @@ static ssize_t vdd_read(struct file *filp, struct kobject *kobj, + return -EINVAL; + + if (w1_ds2438_get_voltage(sl, DS2438_ADC_INPUT_VDD, &voltage) == 0) { +- c -= snprintf(buf + PAGE_SIZE - c, c, "%d\n", voltage); +- ret = PAGE_SIZE - c; ++ ret = snprintf(buf, count, "%u\n", voltage); + } else + ret = -EIO; + + return ret; + } + +-static BIN_ATTR(iad, S_IRUGO | S_IWUSR | S_IWGRP, NULL, iad_write, 1); ++static BIN_ATTR(iad, S_IRUGO | S_IWUSR | S_IWGRP, iad_read, iad_write, 0); + static BIN_ATTR_RO(page0, DS2438_PAGE_SIZE); + static BIN_ATTR_RO(temperature, 0/* real length varies */); + static BIN_ATTR_RO(vad, 0/* real length varies */); +diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c +index d4e8b717ce2b..747a15acbce3 100644 +--- a/drivers/xen/balloon.c ++++ b/drivers/xen/balloon.c +@@ -350,7 +350,10 @@ static enum bp_state reserve_additional_memory(void) + * callers drop the mutex before trying again. + */ + mutex_unlock(&balloon_mutex); ++ /* add_memory_resource() requires the device_hotplug lock */ ++ lock_device_hotplug(); + rc = add_memory_resource(nid, resource, memhp_auto_online); ++ unlock_device_hotplug(); + mutex_lock(&balloon_mutex); + + if (rc) { +diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c +index 9fd383285f0e..fc764f350f05 100644 +--- a/fs/btrfs/ctree.c ++++ b/fs/btrfs/ctree.c +@@ -3031,6 +3031,10 @@ int btrfs_search_old_slot(struct btrfs_root *root, const struct btrfs_key *key, + + again: + b = get_old_root(root, time_seq); ++ if (!b) { ++ ret = -EIO; ++ goto done; ++ } + level = btrfs_header_level(b); + p->locks[level] = BTRFS_READ_LOCK; + +diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c +index 7592beb53fc4..00ff4349b457 100644 +--- a/fs/btrfs/ioctl.c ++++ b/fs/btrfs/ioctl.c +@@ -1337,7 +1337,7 @@ again: + + if (i_done != page_cnt) { + spin_lock(&BTRFS_I(inode)->lock); +- BTRFS_I(inode)->outstanding_extents++; ++ btrfs_mod_outstanding_extents(BTRFS_I(inode), 1); + spin_unlock(&BTRFS_I(inode)->lock); + btrfs_delalloc_release_space(inode, data_reserved, + start_index << PAGE_SHIFT, +diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c +index 8888337a95b6..ddbad8d50949 100644 +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -1919,7 +1919,7 @@ restore: + } + + /* Used to sort the devices by max_avail(descending sort) */ +-static int btrfs_cmp_device_free_bytes(const void *dev_info1, ++static inline int btrfs_cmp_device_free_bytes(const void *dev_info1, + const void *dev_info2) + { + if (((struct btrfs_device_info *)dev_info1)->max_avail > +@@ -1948,8 +1948,8 @@ static inline void btrfs_descending_sort_devices( + * The helper to calc the free space on the devices that can be used to store + * file data. + */ +-static int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info, +- u64 *free_bytes) ++static inline int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info, ++ u64 *free_bytes) + { + struct btrfs_device_info *devices_info; + struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; +diff --git a/fs/ceph/file.c b/fs/ceph/file.c +index 92ab20433682..91a7ad259bcf 100644 +--- a/fs/ceph/file.c ++++ b/fs/ceph/file.c +@@ -1735,7 +1735,6 @@ static long ceph_fallocate(struct file *file, int mode, + struct ceph_file_info *fi = file->private_data; + struct inode *inode = file_inode(file); + struct ceph_inode_info *ci = ceph_inode(inode); +- struct ceph_fs_client *fsc = ceph_inode_to_client(inode); + struct ceph_cap_flush *prealloc_cf; + int want, got = 0; + int dirty; +@@ -1743,10 +1742,7 @@ static long ceph_fallocate(struct file *file, int mode, + loff_t endoff = 0; + loff_t size; + +- if ((offset + length) > max(i_size_read(inode), fsc->max_file_size)) +- return -EFBIG; +- +- if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) ++ if (mode != (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) + return -EOPNOTSUPP; + + if (!S_ISREG(inode->i_mode)) +@@ -1763,18 +1759,6 @@ static long ceph_fallocate(struct file *file, int mode, + goto unlock; + } + +- if (!(mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE)) && +- ceph_quota_is_max_bytes_exceeded(inode, offset + length)) { +- ret = -EDQUOT; +- goto unlock; +- } +- +- if (ceph_osdmap_flag(&fsc->client->osdc, CEPH_OSDMAP_FULL) && +- !(mode & FALLOC_FL_PUNCH_HOLE)) { +- ret = -ENOSPC; +- goto unlock; +- } +- + if (ci->i_inline_version != CEPH_INLINE_NONE) { + ret = ceph_uninline_data(file, NULL); + if (ret < 0) +@@ -1782,12 +1766,12 @@ static long ceph_fallocate(struct file *file, int mode, + } + + size = i_size_read(inode); +- if (!(mode & FALLOC_FL_KEEP_SIZE)) { +- endoff = offset + length; +- ret = inode_newsize_ok(inode, endoff); +- if (ret) +- goto unlock; +- } ++ ++ /* Are we punching a hole beyond EOF? */ ++ if (offset >= size) ++ goto unlock; ++ if ((offset + length) > size) ++ length = size - offset; + + if (fi->fmode & CEPH_FILE_MODE_LAZY) + want = CEPH_CAP_FILE_BUFFER | CEPH_CAP_FILE_LAZYIO; +@@ -1798,16 +1782,8 @@ static long ceph_fallocate(struct file *file, int mode, + if (ret < 0) + goto unlock; + +- if (mode & FALLOC_FL_PUNCH_HOLE) { +- if (offset < size) +- ceph_zero_pagecache_range(inode, offset, length); +- ret = ceph_zero_objects(inode, offset, length); +- } else if (endoff > size) { +- truncate_pagecache_range(inode, size, -1); +- if (ceph_inode_set_size(inode, endoff)) +- ceph_check_caps(ceph_inode(inode), +- CHECK_CAPS_AUTHONLY, NULL); +- } ++ ceph_zero_pagecache_range(inode, offset, length); ++ ret = ceph_zero_objects(inode, offset, length); + + if (!ret) { + spin_lock(&ci->i_ceph_lock); +@@ -1817,9 +1793,6 @@ static long ceph_fallocate(struct file *file, int mode, + spin_unlock(&ci->i_ceph_lock); + if (dirty) + __mark_inode_dirty(inode, dirty); +- if ((endoff > size) && +- ceph_quota_is_max_bytes_approaching(inode, endoff)) +- ceph_check_caps(ci, CHECK_CAPS_NODELAY, NULL); + } + + ceph_put_cap_refs(ci, got); +diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c +index acb70a6a82f0..1e438e0faf77 100644 +--- a/fs/ceph/inode.c ++++ b/fs/ceph/inode.c +@@ -1694,7 +1694,6 @@ retry_lookup: + if (IS_ERR(realdn)) { + err = PTR_ERR(realdn); + d_drop(dn); +- dn = NULL; + goto next_item; + } + dn = realdn; +diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c +index b1f5d0d28335..9194f17675c8 100644 +--- a/fs/cifs/smb2pdu.c ++++ b/fs/cifs/smb2pdu.c +@@ -2283,7 +2283,7 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path, + struct cifs_ses *ses = tcon->ses; + struct kvec iov[SMB2_CREATE_IOV_SIZE]; + struct kvec rsp_iov = {NULL, 0}; +- int resp_buftype; ++ int resp_buftype = CIFS_NO_BUFFER; + int rc = 0; + int flags = 0; + +@@ -2570,7 +2570,7 @@ SMB2_close_flags(const unsigned int xid, struct cifs_tcon *tcon, + struct cifs_ses *ses = tcon->ses; + struct kvec iov[1]; + struct kvec rsp_iov; +- int resp_buftype; ++ int resp_buftype = CIFS_NO_BUFFER; + int rc = 0; + + cifs_dbg(FYI, "Close\n"); +@@ -2723,7 +2723,7 @@ query_info(const unsigned int xid, struct cifs_tcon *tcon, + struct kvec iov[1]; + struct kvec rsp_iov; + int rc = 0; +- int resp_buftype; ++ int resp_buftype = CIFS_NO_BUFFER; + struct cifs_ses *ses = tcon->ses; + int flags = 0; + +diff --git a/fs/dlm/member.c b/fs/dlm/member.c +index 3fda3832cf6a..cad6d85911a8 100644 +--- a/fs/dlm/member.c ++++ b/fs/dlm/member.c +@@ -680,7 +680,7 @@ int dlm_ls_start(struct dlm_ls *ls) + + error = dlm_config_nodes(ls->ls_name, &nodes, &count); + if (error < 0) +- goto fail; ++ goto fail_rv; + + spin_lock(&ls->ls_recover_lock); + +@@ -712,8 +712,9 @@ int dlm_ls_start(struct dlm_ls *ls) + return 0; + + fail: +- kfree(rv); + kfree(nodes); ++ fail_rv: ++ kfree(rv); + return error; + } + +diff --git a/fs/dlm/user.c b/fs/dlm/user.c +index 2a669390cd7f..13f29409600b 100644 +--- a/fs/dlm/user.c ++++ b/fs/dlm/user.c +@@ -702,7 +702,7 @@ static int copy_result_to_user(struct dlm_user_args *ua, int compat, + result.version[0] = DLM_DEVICE_VERSION_MAJOR; + result.version[1] = DLM_DEVICE_VERSION_MINOR; + result.version[2] = DLM_DEVICE_VERSION_PATCH; +- memcpy(&result.lksb, &ua->lksb, sizeof(struct dlm_lksb)); ++ memcpy(&result.lksb, &ua->lksb, offsetof(struct dlm_lksb, sb_lvbptr)); + result.user_lksb = ua->user_lksb; + + /* FIXME: dlm1 provides for the user's bastparam/addr to not be updated +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index 3a2fd6676966..a7436ad19458 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -1782,6 +1782,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio) + /* This page is already truncated */ + if (fio->old_blkaddr == NULL_ADDR) { + ClearPageUptodate(page); ++ clear_cold_data(page); + goto out_writepage; + } + got_it: +@@ -1957,8 +1958,10 @@ done: + + out: + inode_dec_dirty_pages(inode); +- if (err) ++ if (err) { + ClearPageUptodate(page); ++ clear_cold_data(page); ++ } + + if (wbc->for_reclaim) { + f2fs_submit_merged_write_cond(sbi, inode, 0, page->index, DATA); +@@ -2573,6 +2576,8 @@ void f2fs_invalidate_page(struct page *page, unsigned int offset, + } + } + ++ clear_cold_data(page); ++ + /* This is atomic written page, keep Private */ + if (IS_ATOMIC_WRITTEN_PAGE(page)) + return f2fs_drop_inmem_page(inode, page); +@@ -2591,6 +2596,7 @@ int f2fs_release_page(struct page *page, gfp_t wait) + if (IS_ATOMIC_WRITTEN_PAGE(page)) + return 0; + ++ clear_cold_data(page); + set_page_private(page, 0); + ClearPagePrivate(page); + return 1; +diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c +index ecc3a4e2be96..cd611a57d04d 100644 +--- a/fs/f2fs/dir.c ++++ b/fs/f2fs/dir.c +@@ -733,6 +733,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page, + clear_page_dirty_for_io(page); + ClearPagePrivate(page); + ClearPageUptodate(page); ++ clear_cold_data(page); + inode_dec_dirty_pages(dir); + f2fs_remove_dirty_inode(dir); + } +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index 2dc49a541907..34e48bcf5087 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -3388,7 +3388,7 @@ static inline void f2fs_set_encrypted_inode(struct inode *inode) + { + #ifdef CONFIG_F2FS_FS_ENCRYPTION + file_set_encrypt(inode); +- inode->i_flags |= S_ENCRYPTED; ++ f2fs_set_inode_flags(inode); + #endif + } + +diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c +index 1f67e389169f..6b23dcbf52f4 100644 +--- a/fs/f2fs/namei.c ++++ b/fs/f2fs/namei.c +@@ -124,6 +124,8 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode) + if (F2FS_I(inode)->i_flags & F2FS_PROJINHERIT_FL) + set_inode_flag(inode, FI_PROJ_INHERIT); + ++ f2fs_set_inode_flags(inode); ++ + trace_f2fs_new_inode(inode, 0); + return inode; + +diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c +index d78009694f3f..43a07514c357 100644 +--- a/fs/f2fs/segment.c ++++ b/fs/f2fs/segment.c +@@ -277,8 +277,10 @@ retry: + } + next: + /* we don't need to invalidate this in the sccessful status */ +- if (drop || recover) ++ if (drop || recover) { + ClearPageUptodate(page); ++ clear_cold_data(page); ++ } + set_page_private(page, 0); + ClearPagePrivate(page); + f2fs_put_page(page, 1); +diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c +index 15779123d089..7a9cc64f5ca3 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -1837,8 +1837,7 @@ static int f2fs_quota_on(struct super_block *sb, int type, int format_id, + + inode_lock(inode); + F2FS_I(inode)->i_flags |= F2FS_NOATIME_FL | F2FS_IMMUTABLE_FL; +- inode_set_flags(inode, S_NOATIME | S_IMMUTABLE, +- S_NOATIME | S_IMMUTABLE); ++ f2fs_set_inode_flags(inode); + inode_unlock(inode); + f2fs_mark_inode_dirty_sync(inode, false); + +@@ -1863,7 +1862,7 @@ static int f2fs_quota_off(struct super_block *sb, int type) + + inode_lock(inode); + F2FS_I(inode)->i_flags &= ~(F2FS_NOATIME_FL | F2FS_IMMUTABLE_FL); +- inode_set_flags(inode, 0, S_NOATIME | S_IMMUTABLE); ++ f2fs_set_inode_flags(inode); + inode_unlock(inode); + f2fs_mark_inode_dirty_sync(inode, false); + out_put: +diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c +index 63e5387c84d2..c94c4ac1ae78 100644 +--- a/fs/gfs2/rgrp.c ++++ b/fs/gfs2/rgrp.c +@@ -642,7 +642,10 @@ static void __rs_deltree(struct gfs2_blkreserv *rs) + RB_CLEAR_NODE(&rs->rs_node); + + if (rs->rs_free) { +- struct gfs2_bitmap *bi = rbm_bi(&rs->rs_rbm); ++ u64 last_block = gfs2_rbm_to_block(&rs->rs_rbm) + ++ rs->rs_free - 1; ++ struct gfs2_rbm last_rbm = { .rgd = rs->rs_rbm.rgd, }; ++ struct gfs2_bitmap *start, *last; + + /* return reserved blocks to the rgrp */ + BUG_ON(rs->rs_rbm.rgd->rd_reserved < rs->rs_free); +@@ -653,7 +656,13 @@ static void __rs_deltree(struct gfs2_blkreserv *rs) + it will force the number to be recalculated later. */ + rgd->rd_extfail_pt += rs->rs_free; + rs->rs_free = 0; +- clear_bit(GBF_FULL, &bi->bi_flags); ++ if (gfs2_rbm_from_block(&last_rbm, last_block)) ++ return; ++ start = rbm_bi(&rs->rs_rbm); ++ last = rbm_bi(&last_rbm); ++ do ++ clear_bit(GBF_FULL, &start->bi_flags); ++ while (start++ != last); + } + } + +diff --git a/fs/hfs/brec.c b/fs/hfs/brec.c +index da25c49203cc..896396554bcc 100644 +--- a/fs/hfs/brec.c ++++ b/fs/hfs/brec.c +@@ -445,6 +445,7 @@ skip: + /* restore search_key */ + hfs_bnode_read_key(node, fd->search_key, 14); + } ++ new_node = NULL; + } + + if (!rec && node->parent) +diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c +index 9bdff5e40626..19017d296173 100644 +--- a/fs/hfs/btree.c ++++ b/fs/hfs/btree.c +@@ -220,25 +220,17 @@ static struct hfs_bnode *hfs_bmap_new_bmap(struct hfs_bnode *prev, u32 idx) + return node; + } + +-struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree) ++/* Make sure @tree has enough space for the @rsvd_nodes */ ++int hfs_bmap_reserve(struct hfs_btree *tree, int rsvd_nodes) + { +- struct hfs_bnode *node, *next_node; +- struct page **pagep; +- u32 nidx, idx; +- unsigned off; +- u16 off16; +- u16 len; +- u8 *data, byte, m; +- int i; +- +- while (!tree->free_nodes) { +- struct inode *inode = tree->inode; +- u32 count; +- int res; ++ struct inode *inode = tree->inode; ++ u32 count; ++ int res; + ++ while (tree->free_nodes < rsvd_nodes) { + res = hfs_extend_file(inode); + if (res) +- return ERR_PTR(res); ++ return res; + HFS_I(inode)->phys_size = inode->i_size = + (loff_t)HFS_I(inode)->alloc_blocks * + HFS_SB(tree->sb)->alloc_blksz; +@@ -246,9 +238,26 @@ struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree) + tree->sb->s_blocksize_bits; + inode_set_bytes(inode, inode->i_size); + count = inode->i_size >> tree->node_size_shift; +- tree->free_nodes = count - tree->node_count; ++ tree->free_nodes += count - tree->node_count; + tree->node_count = count; + } ++ return 0; ++} ++ ++struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree) ++{ ++ struct hfs_bnode *node, *next_node; ++ struct page **pagep; ++ u32 nidx, idx; ++ unsigned off; ++ u16 off16; ++ u16 len; ++ u8 *data, byte, m; ++ int i, res; ++ ++ res = hfs_bmap_reserve(tree, 1); ++ if (res) ++ return ERR_PTR(res); + + nidx = 0; + node = hfs_bnode_find(tree, nidx); +diff --git a/fs/hfs/btree.h b/fs/hfs/btree.h +index c8b252dbb26c..dcc2aab1b2c4 100644 +--- a/fs/hfs/btree.h ++++ b/fs/hfs/btree.h +@@ -82,6 +82,7 @@ struct hfs_find_data { + extern struct hfs_btree *hfs_btree_open(struct super_block *, u32, btree_keycmp); + extern void hfs_btree_close(struct hfs_btree *); + extern void hfs_btree_write(struct hfs_btree *); ++extern int hfs_bmap_reserve(struct hfs_btree *, int); + extern struct hfs_bnode * hfs_bmap_alloc(struct hfs_btree *); + extern void hfs_bmap_free(struct hfs_bnode *node); + +diff --git a/fs/hfs/catalog.c b/fs/hfs/catalog.c +index 8a66405b0f8b..d365bf0b8c77 100644 +--- a/fs/hfs/catalog.c ++++ b/fs/hfs/catalog.c +@@ -97,6 +97,14 @@ int hfs_cat_create(u32 cnid, struct inode *dir, const struct qstr *str, struct i + if (err) + return err; + ++ /* ++ * Fail early and avoid ENOSPC during the btree operations. We may ++ * have to split the root node at most once. ++ */ ++ err = hfs_bmap_reserve(fd.tree, 2 * fd.tree->depth); ++ if (err) ++ goto err2; ++ + hfs_cat_build_key(sb, fd.search_key, cnid, NULL); + entry_size = hfs_cat_build_thread(sb, &entry, S_ISDIR(inode->i_mode) ? + HFS_CDR_THD : HFS_CDR_FTH, +@@ -295,6 +303,14 @@ int hfs_cat_move(u32 cnid, struct inode *src_dir, const struct qstr *src_name, + return err; + dst_fd = src_fd; + ++ /* ++ * Fail early and avoid ENOSPC during the btree operations. We may ++ * have to split the root node at most once. ++ */ ++ err = hfs_bmap_reserve(src_fd.tree, 2 * src_fd.tree->depth); ++ if (err) ++ goto out; ++ + /* find the old dir entry and read the data */ + hfs_cat_build_key(sb, src_fd.search_key, src_dir->i_ino, src_name); + err = hfs_brec_find(&src_fd); +diff --git a/fs/hfs/extent.c b/fs/hfs/extent.c +index 5d0182654580..263d5028d9d1 100644 +--- a/fs/hfs/extent.c ++++ b/fs/hfs/extent.c +@@ -117,6 +117,10 @@ static int __hfs_ext_write_extent(struct inode *inode, struct hfs_find_data *fd) + if (HFS_I(inode)->flags & HFS_FLG_EXT_NEW) { + if (res != -ENOENT) + return res; ++ /* Fail early and avoid ENOSPC during the btree operation */ ++ res = hfs_bmap_reserve(fd->tree, fd->tree->depth + 1); ++ if (res) ++ return res; + hfs_brec_insert(fd, HFS_I(inode)->cached_extents, sizeof(hfs_extent_rec)); + HFS_I(inode)->flags &= ~(HFS_FLG_EXT_DIRTY|HFS_FLG_EXT_NEW); + } else { +@@ -300,7 +304,7 @@ int hfs_free_fork(struct super_block *sb, struct hfs_cat_file *file, int type) + return 0; + + blocks = 0; +- for (i = 0; i < 3; extent++, i++) ++ for (i = 0; i < 3; i++) + blocks += be16_to_cpu(extent[i].count); + + res = hfs_free_extents(sb, extent, blocks, blocks); +@@ -341,7 +345,9 @@ int hfs_get_block(struct inode *inode, sector_t block, + ablock = (u32)block / HFS_SB(sb)->fs_div; + + if (block >= HFS_I(inode)->fs_blocks) { +- if (block > HFS_I(inode)->fs_blocks || !create) ++ if (!create) ++ return 0; ++ if (block > HFS_I(inode)->fs_blocks) + return -EIO; + if (ablock >= HFS_I(inode)->alloc_blocks) { + res = hfs_extend_file(inode); +diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c +index a2dfa1b2a89c..da243c84e93b 100644 +--- a/fs/hfs/inode.c ++++ b/fs/hfs/inode.c +@@ -642,6 +642,8 @@ int hfs_inode_setattr(struct dentry *dentry, struct iattr * attr) + + truncate_setsize(inode, attr->ia_size); + hfs_file_truncate(inode); ++ inode->i_atime = inode->i_mtime = inode->i_ctime = ++ current_time(inode); + } + + setattr_copy(inode, attr); +diff --git a/fs/hfsplus/attributes.c b/fs/hfsplus/attributes.c +index 2bab6b3cdba4..e6d554476db4 100644 +--- a/fs/hfsplus/attributes.c ++++ b/fs/hfsplus/attributes.c +@@ -217,6 +217,11 @@ int hfsplus_create_attr(struct inode *inode, + if (err) + goto failed_init_create_attr; + ++ /* Fail early and avoid ENOSPC during the btree operation */ ++ err = hfs_bmap_reserve(fd.tree, fd.tree->depth + 1); ++ if (err) ++ goto failed_create_attr; ++ + if (name) { + err = hfsplus_attr_build_key(sb, fd.search_key, + inode->i_ino, name); +@@ -313,6 +318,11 @@ int hfsplus_delete_attr(struct inode *inode, const char *name) + if (err) + return err; + ++ /* Fail early and avoid ENOSPC during the btree operation */ ++ err = hfs_bmap_reserve(fd.tree, fd.tree->depth); ++ if (err) ++ goto out; ++ + if (name) { + err = hfsplus_attr_build_key(sb, fd.search_key, + inode->i_ino, name); +diff --git a/fs/hfsplus/brec.c b/fs/hfsplus/brec.c +index aa17a392b414..1918544a7871 100644 +--- a/fs/hfsplus/brec.c ++++ b/fs/hfsplus/brec.c +@@ -449,6 +449,7 @@ skip: + /* restore search_key */ + hfs_bnode_read_key(node, fd->search_key, 14); + } ++ new_node = NULL; + } + + if (!rec && node->parent) +diff --git a/fs/hfsplus/btree.c b/fs/hfsplus/btree.c +index 3de3bc4918b5..66774f4cb4fd 100644 +--- a/fs/hfsplus/btree.c ++++ b/fs/hfsplus/btree.c +@@ -342,26 +342,21 @@ static struct hfs_bnode *hfs_bmap_new_bmap(struct hfs_bnode *prev, u32 idx) + return node; + } + +-struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree) ++/* Make sure @tree has enough space for the @rsvd_nodes */ ++int hfs_bmap_reserve(struct hfs_btree *tree, int rsvd_nodes) + { +- struct hfs_bnode *node, *next_node; +- struct page **pagep; +- u32 nidx, idx; +- unsigned off; +- u16 off16; +- u16 len; +- u8 *data, byte, m; +- int i; ++ struct inode *inode = tree->inode; ++ struct hfsplus_inode_info *hip = HFSPLUS_I(inode); ++ u32 count; ++ int res; + +- while (!tree->free_nodes) { +- struct inode *inode = tree->inode; +- struct hfsplus_inode_info *hip = HFSPLUS_I(inode); +- u32 count; +- int res; ++ if (rsvd_nodes <= 0) ++ return 0; + ++ while (tree->free_nodes < rsvd_nodes) { + res = hfsplus_file_extend(inode, hfs_bnode_need_zeroout(tree)); + if (res) +- return ERR_PTR(res); ++ return res; + hip->phys_size = inode->i_size = + (loff_t)hip->alloc_blocks << + HFSPLUS_SB(tree->sb)->alloc_blksz_shift; +@@ -369,9 +364,26 @@ struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree) + hip->alloc_blocks << HFSPLUS_SB(tree->sb)->fs_shift; + inode_set_bytes(inode, inode->i_size); + count = inode->i_size >> tree->node_size_shift; +- tree->free_nodes = count - tree->node_count; ++ tree->free_nodes += count - tree->node_count; + tree->node_count = count; + } ++ return 0; ++} ++ ++struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree) ++{ ++ struct hfs_bnode *node, *next_node; ++ struct page **pagep; ++ u32 nidx, idx; ++ unsigned off; ++ u16 off16; ++ u16 len; ++ u8 *data, byte, m; ++ int i, res; ++ ++ res = hfs_bmap_reserve(tree, 1); ++ if (res) ++ return ERR_PTR(res); + + nidx = 0; + node = hfs_bnode_find(tree, nidx); +diff --git a/fs/hfsplus/catalog.c b/fs/hfsplus/catalog.c +index a196369ba779..35472cba750e 100644 +--- a/fs/hfsplus/catalog.c ++++ b/fs/hfsplus/catalog.c +@@ -265,6 +265,14 @@ int hfsplus_create_cat(u32 cnid, struct inode *dir, + if (err) + return err; + ++ /* ++ * Fail early and avoid ENOSPC during the btree operations. We may ++ * have to split the root node at most once. ++ */ ++ err = hfs_bmap_reserve(fd.tree, 2 * fd.tree->depth); ++ if (err) ++ goto err2; ++ + hfsplus_cat_build_key_with_cnid(sb, fd.search_key, cnid); + entry_size = hfsplus_fill_cat_thread(sb, &entry, + S_ISDIR(inode->i_mode) ? +@@ -333,6 +341,14 @@ int hfsplus_delete_cat(u32 cnid, struct inode *dir, const struct qstr *str) + if (err) + return err; + ++ /* ++ * Fail early and avoid ENOSPC during the btree operations. We may ++ * have to split the root node at most once. ++ */ ++ err = hfs_bmap_reserve(fd.tree, 2 * (int)fd.tree->depth - 2); ++ if (err) ++ goto out; ++ + if (!str) { + int len; + +@@ -433,6 +449,14 @@ int hfsplus_rename_cat(u32 cnid, + return err; + dst_fd = src_fd; + ++ /* ++ * Fail early and avoid ENOSPC during the btree operations. We may ++ * have to split the root node at most twice. ++ */ ++ err = hfs_bmap_reserve(src_fd.tree, 4 * (int)src_fd.tree->depth - 1); ++ if (err) ++ goto out; ++ + /* find the old dir entry and read the data */ + err = hfsplus_cat_build_key(sb, src_fd.search_key, + src_dir->i_ino, src_name); +diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c +index 8e0f59767694..a930ddd15681 100644 +--- a/fs/hfsplus/extents.c ++++ b/fs/hfsplus/extents.c +@@ -100,6 +100,10 @@ static int __hfsplus_ext_write_extent(struct inode *inode, + if (hip->extent_state & HFSPLUS_EXT_NEW) { + if (res != -ENOENT) + return res; ++ /* Fail early and avoid ENOSPC during the btree operation */ ++ res = hfs_bmap_reserve(fd->tree, fd->tree->depth + 1); ++ if (res) ++ return res; + hfs_brec_insert(fd, hip->cached_extents, + sizeof(hfsplus_extent_rec)); + hip->extent_state &= ~(HFSPLUS_EXT_DIRTY | HFSPLUS_EXT_NEW); +@@ -233,7 +237,9 @@ int hfsplus_get_block(struct inode *inode, sector_t iblock, + ablock = iblock >> sbi->fs_shift; + + if (iblock >= hip->fs_blocks) { +- if (iblock > hip->fs_blocks || !create) ++ if (!create) ++ return 0; ++ if (iblock > hip->fs_blocks) + return -EIO; + if (ablock >= hip->alloc_blocks) { + res = hfsplus_file_extend(inode, false); +diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h +index 8e039435958a..dd7ad9f13e3a 100644 +--- a/fs/hfsplus/hfsplus_fs.h ++++ b/fs/hfsplus/hfsplus_fs.h +@@ -311,6 +311,7 @@ static inline unsigned short hfsplus_min_io_size(struct super_block *sb) + #define hfs_btree_open hfsplus_btree_open + #define hfs_btree_close hfsplus_btree_close + #define hfs_btree_write hfsplus_btree_write ++#define hfs_bmap_reserve hfsplus_bmap_reserve + #define hfs_bmap_alloc hfsplus_bmap_alloc + #define hfs_bmap_free hfsplus_bmap_free + #define hfs_bnode_read hfsplus_bnode_read +@@ -395,6 +396,7 @@ u32 hfsplus_calc_btree_clump_size(u32 block_size, u32 node_size, u64 sectors, + struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id); + void hfs_btree_close(struct hfs_btree *tree); + int hfs_btree_write(struct hfs_btree *tree); ++int hfs_bmap_reserve(struct hfs_btree *tree, int rsvd_nodes); + struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree); + void hfs_bmap_free(struct hfs_bnode *node); + +diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c +index 8e9427a42b81..d7ab9d8c4b67 100644 +--- a/fs/hfsplus/inode.c ++++ b/fs/hfsplus/inode.c +@@ -261,6 +261,7 @@ static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr) + } + truncate_setsize(inode, attr->ia_size); + hfsplus_file_truncate(inode); ++ inode->i_mtime = inode->i_ctime = current_time(inode); + } + + setattr_copy(inode, attr); +diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c +index 9f8250df99f1..f9b84f7a3e4b 100644 +--- a/fs/ocfs2/buffer_head_io.c ++++ b/fs/ocfs2/buffer_head_io.c +@@ -99,25 +99,34 @@ out: + return ret; + } + ++/* Caller must provide a bhs[] with all NULL or non-NULL entries, so it ++ * will be easier to handle read failure. ++ */ + int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, + unsigned int nr, struct buffer_head *bhs[]) + { + int status = 0; + unsigned int i; + struct buffer_head *bh; ++ int new_bh = 0; + + trace_ocfs2_read_blocks_sync((unsigned long long)block, nr); + + if (!nr) + goto bail; + ++ /* Don't put buffer head and re-assign it to NULL if it is allocated ++ * outside since the caller can't be aware of this alternation! ++ */ ++ new_bh = (bhs[0] == NULL); ++ + for (i = 0 ; i < nr ; i++) { + if (bhs[i] == NULL) { + bhs[i] = sb_getblk(osb->sb, block++); + if (bhs[i] == NULL) { + status = -ENOMEM; + mlog_errno(status); +- goto bail; ++ break; + } + } + bh = bhs[i]; +@@ -157,9 +166,26 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, + submit_bh(REQ_OP_READ, 0, bh); + } + ++read_failure: + for (i = nr; i > 0; i--) { + bh = bhs[i - 1]; + ++ if (unlikely(status)) { ++ if (new_bh && bh) { ++ /* If middle bh fails, let previous bh ++ * finish its read and then put it to ++ * aovoid bh leak ++ */ ++ if (!buffer_jbd(bh)) ++ wait_on_buffer(bh); ++ put_bh(bh); ++ bhs[i - 1] = NULL; ++ } else if (bh && buffer_uptodate(bh)) { ++ clear_buffer_uptodate(bh); ++ } ++ continue; ++ } ++ + /* No need to wait on the buffer if it's managed by JBD. */ + if (!buffer_jbd(bh)) + wait_on_buffer(bh); +@@ -169,8 +195,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, + * so we can safely record this and loop back + * to cleanup the other buffers. */ + status = -EIO; +- put_bh(bh); +- bhs[i - 1] = NULL; ++ goto read_failure; + } + } + +@@ -178,6 +203,9 @@ bail: + return status; + } + ++/* Caller must provide a bhs[] with all NULL or non-NULL entries, so it ++ * will be easier to handle read failure. ++ */ + int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, + struct buffer_head *bhs[], int flags, + int (*validate)(struct super_block *sb, +@@ -187,6 +215,7 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, + int i, ignore_cache = 0; + struct buffer_head *bh; + struct super_block *sb = ocfs2_metadata_cache_get_super(ci); ++ int new_bh = 0; + + trace_ocfs2_read_blocks_begin(ci, (unsigned long long)block, nr, flags); + +@@ -212,6 +241,11 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, + goto bail; + } + ++ /* Don't put buffer head and re-assign it to NULL if it is allocated ++ * outside since the caller can't be aware of this alternation! ++ */ ++ new_bh = (bhs[0] == NULL); ++ + ocfs2_metadata_cache_io_lock(ci); + for (i = 0 ; i < nr ; i++) { + if (bhs[i] == NULL) { +@@ -220,7 +254,8 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, + ocfs2_metadata_cache_io_unlock(ci); + status = -ENOMEM; + mlog_errno(status); +- goto bail; ++ /* Don't forget to put previous bh! */ ++ break; + } + } + bh = bhs[i]; +@@ -314,16 +349,27 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, + } + } + +- status = 0; +- ++read_failure: + for (i = (nr - 1); i >= 0; i--) { + bh = bhs[i]; + + if (!(flags & OCFS2_BH_READAHEAD)) { +- if (status) { +- /* Clear the rest of the buffers on error */ +- put_bh(bh); +- bhs[i] = NULL; ++ if (unlikely(status)) { ++ /* Clear the buffers on error including those ++ * ever succeeded in reading ++ */ ++ if (new_bh && bh) { ++ /* If middle bh fails, let previous bh ++ * finish its read and then put it to ++ * aovoid bh leak ++ */ ++ if (!buffer_jbd(bh)) ++ wait_on_buffer(bh); ++ put_bh(bh); ++ bhs[i] = NULL; ++ } else if (bh && buffer_uptodate(bh)) { ++ clear_buffer_uptodate(bh); ++ } + continue; + } + /* We know this can't have changed as we hold the +@@ -341,9 +387,7 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, + * uptodate. */ + status = -EIO; + clear_buffer_needs_validate(bh); +- put_bh(bh); +- bhs[i] = NULL; +- continue; ++ goto read_failure; + } + + if (buffer_needs_validate(bh)) { +@@ -353,11 +397,8 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr, + BUG_ON(buffer_jbd(bh)); + clear_buffer_needs_validate(bh); + status = validate(sb, bh); +- if (status) { +- put_bh(bh); +- bhs[i] = NULL; +- continue; +- } ++ if (status) ++ goto read_failure; + } + } + +diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c +index 9b984cae4c4e..1d6dc8422899 100644 +--- a/fs/ocfs2/dlm/dlmdebug.c ++++ b/fs/ocfs2/dlm/dlmdebug.c +@@ -329,7 +329,7 @@ void dlm_print_one_mle(struct dlm_master_list_entry *mle) + { + char *buf; + +- buf = (char *) get_zeroed_page(GFP_NOFS); ++ buf = (char *) get_zeroed_page(GFP_ATOMIC); + if (buf) { + dump_mle(mle, buf, PAGE_SIZE - 1); + free_page((unsigned long)buf); +diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c +index 933aac5da193..178cb9e6772a 100644 +--- a/fs/ocfs2/dlmglue.c ++++ b/fs/ocfs2/dlmglue.c +@@ -3603,7 +3603,7 @@ static int ocfs2_downconvert_lock(struct ocfs2_super *osb, + * we can recover correctly from node failure. Otherwise, we may get + * invalid LVB in LKB, but without DLM_SBF_VALNOTVALID being set. + */ +- if (!ocfs2_is_o2cb_active() && ++ if (ocfs2_userspace_stack(osb) && + lockres->l_ops->flags & LOCK_TYPE_USES_LVB) + lvb = 1; + +diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c +index a847fe52c56e..a3e077fcfeb9 100644 +--- a/fs/ocfs2/file.c ++++ b/fs/ocfs2/file.c +@@ -2389,7 +2389,7 @@ static ssize_t ocfs2_file_write_iter(struct kiocb *iocb, + + written = __generic_file_write_iter(iocb, from); + /* buffered aio wouldn't have proper lock coverage today */ +- BUG_ON(written == -EIOCBQUEUED && !(iocb->ki_flags & IOCB_DIRECT)); ++ BUG_ON(written == -EIOCBQUEUED && !direct_io); + + /* + * deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io +@@ -2509,7 +2509,7 @@ static ssize_t ocfs2_file_read_iter(struct kiocb *iocb, + trace_generic_file_read_iter_ret(ret); + + /* buffered aio wouldn't have proper lock coverage today */ +- BUG_ON(ret == -EIOCBQUEUED && !(iocb->ki_flags & IOCB_DIRECT)); ++ BUG_ON(ret == -EIOCBQUEUED && !direct_io); + + /* see ocfs2_file_write_iter */ + if (ret == -EIOCBQUEUED || !ocfs2_iocb_is_rw_locked(iocb)) { +diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c +index c492cbb2410f..babb0ec76d67 100644 +--- a/fs/ocfs2/journal.c ++++ b/fs/ocfs2/journal.c +@@ -1379,15 +1379,23 @@ static int __ocfs2_recovery_thread(void *arg) + int rm_quota_used = 0, i; + struct ocfs2_quota_recovery *qrec; + ++ /* Whether the quota supported. */ ++ int quota_enabled = OCFS2_HAS_RO_COMPAT_FEATURE(osb->sb, ++ OCFS2_FEATURE_RO_COMPAT_USRQUOTA) ++ || OCFS2_HAS_RO_COMPAT_FEATURE(osb->sb, ++ OCFS2_FEATURE_RO_COMPAT_GRPQUOTA); ++ + status = ocfs2_wait_on_mount(osb); + if (status < 0) { + goto bail; + } + +- rm_quota = kcalloc(osb->max_slots, sizeof(int), GFP_NOFS); +- if (!rm_quota) { +- status = -ENOMEM; +- goto bail; ++ if (quota_enabled) { ++ rm_quota = kcalloc(osb->max_slots, sizeof(int), GFP_NOFS); ++ if (!rm_quota) { ++ status = -ENOMEM; ++ goto bail; ++ } + } + restart: + status = ocfs2_super_lock(osb, 1); +@@ -1423,9 +1431,14 @@ restart: + * then quota usage would be out of sync until some node takes + * the slot. So we remember which nodes need quota recovery + * and when everything else is done, we recover quotas. */ +- for (i = 0; i < rm_quota_used && rm_quota[i] != slot_num; i++); +- if (i == rm_quota_used) +- rm_quota[rm_quota_used++] = slot_num; ++ if (quota_enabled) { ++ for (i = 0; i < rm_quota_used ++ && rm_quota[i] != slot_num; i++) ++ ; ++ ++ if (i == rm_quota_used) ++ rm_quota[rm_quota_used++] = slot_num; ++ } + + status = ocfs2_recover_node(osb, node_num, slot_num); + skip_recovery: +@@ -1453,16 +1466,19 @@ skip_recovery: + /* Now it is right time to recover quotas... We have to do this under + * superblock lock so that no one can start using the slot (and crash) + * before we recover it */ +- for (i = 0; i < rm_quota_used; i++) { +- qrec = ocfs2_begin_quota_recovery(osb, rm_quota[i]); +- if (IS_ERR(qrec)) { +- status = PTR_ERR(qrec); +- mlog_errno(status); +- continue; ++ if (quota_enabled) { ++ for (i = 0; i < rm_quota_used; i++) { ++ qrec = ocfs2_begin_quota_recovery(osb, rm_quota[i]); ++ if (IS_ERR(qrec)) { ++ status = PTR_ERR(qrec); ++ mlog_errno(status); ++ continue; ++ } ++ ocfs2_queue_recovery_completion(osb->journal, ++ rm_quota[i], ++ NULL, NULL, qrec, ++ ORPHAN_NEED_TRUNCATE); + } +- ocfs2_queue_recovery_completion(osb->journal, rm_quota[i], +- NULL, NULL, qrec, +- ORPHAN_NEED_TRUNCATE); + } + + ocfs2_super_unlock(osb, 1); +@@ -1484,7 +1500,8 @@ bail: + + mutex_unlock(&osb->recovery_lock); + +- kfree(rm_quota); ++ if (quota_enabled) ++ kfree(rm_quota); + + /* no one is callint kthread_stop() for us so the kthread() api + * requires that we call do_exit(). And it isn't exported, but +diff --git a/fs/ocfs2/move_extents.c b/fs/ocfs2/move_extents.c +index f55f82ca3425..1565dd8e8856 100644 +--- a/fs/ocfs2/move_extents.c ++++ b/fs/ocfs2/move_extents.c +@@ -25,6 +25,7 @@ + #include "ocfs2_ioctl.h" + + #include "alloc.h" ++#include "localalloc.h" + #include "aops.h" + #include "dlmglue.h" + #include "extent_map.h" +@@ -222,6 +223,7 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context, + struct ocfs2_refcount_tree *ref_tree = NULL; + u32 new_phys_cpos, new_len; + u64 phys_blkno = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos); ++ int need_free = 0; + + if ((ext_flags & OCFS2_EXT_REFCOUNTED) && *len) { + BUG_ON(!ocfs2_is_refcount_inode(inode)); +@@ -312,6 +314,7 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context, + if (!partial) { + context->range->me_flags &= ~OCFS2_MOVE_EXT_FL_COMPLETE; + ret = -ENOSPC; ++ need_free = 1; + goto out_commit; + } + } +@@ -336,6 +339,20 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context, + mlog_errno(ret); + + out_commit: ++ if (need_free && context->data_ac) { ++ struct ocfs2_alloc_context *data_ac = context->data_ac; ++ ++ if (context->data_ac->ac_which == OCFS2_AC_USE_LOCAL) ++ ocfs2_free_local_alloc_bits(osb, handle, data_ac, ++ new_phys_cpos, new_len); ++ else ++ ocfs2_free_clusters(handle, ++ data_ac->ac_inode, ++ data_ac->ac_bh, ++ ocfs2_clusters_to_blocks(osb->sb, new_phys_cpos), ++ new_len); ++ } ++ + ocfs2_commit_trans(osb, handle); + + out_unlock_mutex: +diff --git a/fs/ocfs2/stackglue.c b/fs/ocfs2/stackglue.c +index d6c350ba25b9..c4b029c43464 100644 +--- a/fs/ocfs2/stackglue.c ++++ b/fs/ocfs2/stackglue.c +@@ -48,12 +48,6 @@ static char ocfs2_hb_ctl_path[OCFS2_MAX_HB_CTL_PATH] = "/sbin/ocfs2_hb_ctl"; + */ + static struct ocfs2_stack_plugin *active_stack; + +-inline int ocfs2_is_o2cb_active(void) +-{ +- return !strcmp(active_stack->sp_name, OCFS2_STACK_PLUGIN_O2CB); +-} +-EXPORT_SYMBOL_GPL(ocfs2_is_o2cb_active); +- + static struct ocfs2_stack_plugin *ocfs2_stack_lookup(const char *name) + { + struct ocfs2_stack_plugin *p; +diff --git a/fs/ocfs2/stackglue.h b/fs/ocfs2/stackglue.h +index e3036e1790e8..f2dce10fae54 100644 +--- a/fs/ocfs2/stackglue.h ++++ b/fs/ocfs2/stackglue.h +@@ -298,9 +298,6 @@ void ocfs2_stack_glue_set_max_proto_version(struct ocfs2_protocol_version *max_p + int ocfs2_stack_glue_register(struct ocfs2_stack_plugin *plugin); + void ocfs2_stack_glue_unregister(struct ocfs2_stack_plugin *plugin); + +-/* In ocfs2_downconvert_lock(), we need to know which stack we are using */ +-int ocfs2_is_o2cb_active(void); +- + extern struct kset *ocfs2_kset; + + #endif /* STACKGLUE_H */ +diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c +index 0d80e0df6c24..c146e12a8601 100644 +--- a/fs/ocfs2/xattr.c ++++ b/fs/ocfs2/xattr.c +@@ -1498,6 +1498,18 @@ static int ocfs2_xa_check_space(struct ocfs2_xa_loc *loc, + return loc->xl_ops->xlo_check_space(loc, xi); + } + ++static void ocfs2_xa_add_entry(struct ocfs2_xa_loc *loc, u32 name_hash) ++{ ++ loc->xl_ops->xlo_add_entry(loc, name_hash); ++ loc->xl_entry->xe_name_hash = cpu_to_le32(name_hash); ++ /* ++ * We can't leave the new entry's xe_name_offset at zero or ++ * add_namevalue() will go nuts. We set it to the size of our ++ * storage so that it can never be less than any other entry. ++ */ ++ loc->xl_entry->xe_name_offset = cpu_to_le16(loc->xl_size); ++} ++ + static void ocfs2_xa_add_namevalue(struct ocfs2_xa_loc *loc, + struct ocfs2_xattr_info *xi) + { +@@ -2129,31 +2141,29 @@ static int ocfs2_xa_prepare_entry(struct ocfs2_xa_loc *loc, + if (rc) + goto out; + +- if (!loc->xl_entry) { +- rc = -EINVAL; +- goto out; +- } +- +- if (ocfs2_xa_can_reuse_entry(loc, xi)) { +- orig_value_size = loc->xl_entry->xe_value_size; +- rc = ocfs2_xa_reuse_entry(loc, xi, ctxt); +- if (rc) +- goto out; +- goto alloc_value; +- } ++ if (loc->xl_entry) { ++ if (ocfs2_xa_can_reuse_entry(loc, xi)) { ++ orig_value_size = loc->xl_entry->xe_value_size; ++ rc = ocfs2_xa_reuse_entry(loc, xi, ctxt); ++ if (rc) ++ goto out; ++ goto alloc_value; ++ } + +- if (!ocfs2_xattr_is_local(loc->xl_entry)) { +- orig_clusters = ocfs2_xa_value_clusters(loc); +- rc = ocfs2_xa_value_truncate(loc, 0, ctxt); +- if (rc) { +- mlog_errno(rc); +- ocfs2_xa_cleanup_value_truncate(loc, +- "overwriting", +- orig_clusters); +- goto out; ++ if (!ocfs2_xattr_is_local(loc->xl_entry)) { ++ orig_clusters = ocfs2_xa_value_clusters(loc); ++ rc = ocfs2_xa_value_truncate(loc, 0, ctxt); ++ if (rc) { ++ mlog_errno(rc); ++ ocfs2_xa_cleanup_value_truncate(loc, ++ "overwriting", ++ orig_clusters); ++ goto out; ++ } + } +- } +- ocfs2_xa_wipe_namevalue(loc); ++ ocfs2_xa_wipe_namevalue(loc); ++ } else ++ ocfs2_xa_add_entry(loc, name_hash); + + /* + * If we get here, we have a blank entry. Fill it. We grow our +diff --git a/fs/read_write.c b/fs/read_write.c +index 5fb5ee5b8cd7..2195380620d0 100644 +--- a/fs/read_write.c ++++ b/fs/read_write.c +@@ -1715,6 +1715,34 @@ static int clone_verify_area(struct file *file, loff_t pos, u64 len, bool write) + + return security_file_permission(file, write ? MAY_WRITE : MAY_READ); + } ++/* ++ * Ensure that we don't remap a partial EOF block in the middle of something ++ * else. Assume that the offsets have already been checked for block ++ * alignment. ++ * ++ * For deduplication we always scale down to the previous block because we ++ * can't meaningfully compare post-EOF contents. ++ * ++ * For clone we only link a partial EOF block above the destination file's EOF. ++ */ ++static int generic_remap_check_len(struct inode *inode_in, ++ struct inode *inode_out, ++ loff_t pos_out, ++ u64 *len, ++ bool is_dedupe) ++{ ++ u64 blkmask = i_blocksize(inode_in) - 1; ++ ++ if ((*len & blkmask) == 0) ++ return 0; ++ ++ if (is_dedupe) ++ *len &= ~blkmask; ++ else if (pos_out + *len < i_size_read(inode_out)) ++ return -EINVAL; ++ ++ return 0; ++} + + /* + * Check that the two inodes are eligible for cloning, the ranges make +@@ -1821,6 +1849,11 @@ int vfs_clone_file_prep_inodes(struct inode *inode_in, loff_t pos_in, + return -EBADE; + } + ++ ret = generic_remap_check_len(inode_in, inode_out, pos_out, len, ++ is_dedupe); ++ if (ret) ++ return ret; ++ + return 1; + } + EXPORT_SYMBOL(vfs_clone_file_prep_inodes); +diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c +index e839907e8492..e36124546d0d 100644 +--- a/fs/xfs/xfs_buf.c ++++ b/fs/xfs/xfs_buf.c +@@ -37,6 +37,32 @@ static kmem_zone_t *xfs_buf_zone; + #define xb_to_gfp(flags) \ + ((((flags) & XBF_READ_AHEAD) ? __GFP_NORETRY : GFP_NOFS) | __GFP_NOWARN) + ++/* ++ * Locking orders ++ * ++ * xfs_buf_ioacct_inc: ++ * xfs_buf_ioacct_dec: ++ * b_sema (caller holds) ++ * b_lock ++ * ++ * xfs_buf_stale: ++ * b_sema (caller holds) ++ * b_lock ++ * lru_lock ++ * ++ * xfs_buf_rele: ++ * b_lock ++ * pag_buf_lock ++ * lru_lock ++ * ++ * xfs_buftarg_wait_rele ++ * lru_lock ++ * b_lock (trylock due to inversion) ++ * ++ * xfs_buftarg_isolate ++ * lru_lock ++ * b_lock (trylock due to inversion) ++ */ + + static inline int + xfs_buf_is_vmapped( +@@ -1006,8 +1032,18 @@ xfs_buf_rele( + + ASSERT(atomic_read(&bp->b_hold) > 0); + +- release = atomic_dec_and_lock(&bp->b_hold, &pag->pag_buf_lock); ++ /* ++ * We grab the b_lock here first to serialise racing xfs_buf_rele() ++ * calls. The pag_buf_lock being taken on the last reference only ++ * serialises against racing lookups in xfs_buf_find(). IOWs, the second ++ * to last reference we drop here is not serialised against the last ++ * reference until we take bp->b_lock. Hence if we don't grab b_lock ++ * first, the last "release" reference can win the race to the lock and ++ * free the buffer before the second-to-last reference is processed, ++ * leading to a use-after-free scenario. ++ */ + spin_lock(&bp->b_lock); ++ release = atomic_dec_and_lock(&bp->b_hold, &pag->pag_buf_lock); + if (!release) { + /* + * Drop the in-flight state if the buffer is already on the LRU +@@ -1989,6 +2025,13 @@ xfs_buf_delwri_submit_buffers( + * is only safely useable for callers that can track I/O completion by higher + * level means, e.g. AIL pushing as the @buffer_list is consumed in this + * function. ++ * ++ * Note: this function will skip buffers it would block on, and in doing so ++ * leaves them on @buffer_list so they can be retried on a later pass. As such, ++ * it is up to the caller to ensure that the buffer list is fully submitted or ++ * cancelled appropriately when they are finished with the list. Failure to ++ * cancel or resubmit the list until it is empty will result in leaked buffers ++ * at unmount time. + */ + int + xfs_buf_delwri_submit_nowait( +diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c +index 55326f971cb3..d3a4e89bf4a0 100644 +--- a/fs/xfs/xfs_trans_ail.c ++++ b/fs/xfs/xfs_trans_ail.c +@@ -531,17 +531,33 @@ xfsaild( + set_current_state(TASK_INTERRUPTIBLE); + + /* +- * Check kthread_should_stop() after we set the task state +- * to guarantee that we either see the stop bit and exit or +- * the task state is reset to runnable such that it's not +- * scheduled out indefinitely and detects the stop bit at +- * next iteration. +- * ++ * Check kthread_should_stop() after we set the task state to ++ * guarantee that we either see the stop bit and exit or the ++ * task state is reset to runnable such that it's not scheduled ++ * out indefinitely and detects the stop bit at next iteration. + * A memory barrier is included in above task state set to + * serialize again kthread_stop(). + */ + if (kthread_should_stop()) { + __set_current_state(TASK_RUNNING); ++ ++ /* ++ * The caller forces out the AIL before stopping the ++ * thread in the common case, which means the delwri ++ * queue is drained. In the shutdown case, the queue may ++ * still hold relogged buffers that haven't been ++ * submitted because they were pinned since added to the ++ * queue. ++ * ++ * Log I/O error processing stales the underlying buffer ++ * and clears the delwri state, expecting the buf to be ++ * removed on the next submission attempt. That won't ++ * happen if we're shutting down, so this is the last ++ * opportunity to release such buffers from the queue. ++ */ ++ ASSERT(list_empty(&ailp->ail_buf_list) || ++ XFS_FORCED_SHUTDOWN(ailp->ail_mount)); ++ xfs_buf_delwri_cancel(&ailp->ail_buf_list); + break; + } + +diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h +index acf5e8df3504..b71a033c781e 100644 +--- a/include/linux/bitmap.h ++++ b/include/linux/bitmap.h +@@ -204,8 +204,13 @@ extern int bitmap_print_to_pagebuf(bool list, char *buf, + #define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) & (BITS_PER_LONG - 1))) + #define BITMAP_LAST_WORD_MASK(nbits) (~0UL >> (-(nbits) & (BITS_PER_LONG - 1))) + ++/* ++ * The static inlines below do not handle constant nbits==0 correctly, ++ * so make such users (should any ever turn up) call the out-of-line ++ * versions. ++ */ + #define small_const_nbits(nbits) \ +- (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG) ++ (__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG && (nbits) > 0) + + static inline void bitmap_zero(unsigned long *dst, unsigned int nbits) + { +@@ -398,7 +403,7 @@ static __always_inline void bitmap_clear(unsigned long *map, unsigned int start, + } + + static inline void bitmap_shift_right(unsigned long *dst, const unsigned long *src, +- unsigned int shift, int nbits) ++ unsigned int shift, unsigned int nbits) + { + if (small_const_nbits(nbits)) + *dst = (*src & BITMAP_LAST_WORD_MASK(nbits)) >> shift; +diff --git a/include/linux/futex.h b/include/linux/futex.h +index 821ae502d3d8..ccaef0097785 100644 +--- a/include/linux/futex.h ++++ b/include/linux/futex.h +@@ -9,9 +9,6 @@ struct inode; + struct mm_struct; + struct task_struct; + +-extern int +-handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi); +- + /* + * Futexes are matched on equal values of this key. + * The key type depends on whether it's a shared or private mapping. +@@ -55,11 +52,6 @@ extern void exit_robust_list(struct task_struct *curr); + + long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, + u32 __user *uaddr2, u32 val2, u32 val3); +-#ifdef CONFIG_HAVE_FUTEX_CMPXCHG +-#define futex_cmpxchg_enabled 1 +-#else +-extern int futex_cmpxchg_enabled; +-#endif + #else + static inline void exit_robust_list(struct task_struct *curr) + { +diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h +index c759d1cbcedd..a64f21a97369 100644 +--- a/include/linux/inetdevice.h ++++ b/include/linux/inetdevice.h +@@ -37,7 +37,9 @@ struct in_device { + unsigned long mr_v1_seen; + unsigned long mr_v2_seen; + unsigned long mr_maxdelay; +- unsigned char mr_qrv; ++ unsigned long mr_qi; /* Query Interval */ ++ unsigned long mr_qri; /* Query Response Interval */ ++ unsigned char mr_qrv; /* Query Robustness Variable */ + unsigned char mr_gq_running; + unsigned char mr_ifc_count; + struct timer_list mr_gq_timer; /* general query timer */ +diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h +index 96207939d862..748016ae01e3 100644 +--- a/include/linux/kvm_host.h ++++ b/include/linux/kvm_host.h +@@ -911,6 +911,7 @@ int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu); + void kvm_vcpu_kick(struct kvm_vcpu *vcpu); + + bool kvm_is_reserved_pfn(kvm_pfn_t pfn); ++bool kvm_is_zone_device_pfn(kvm_pfn_t pfn); + + struct kvm_irq_ack_notifier { + struct hlist_node link; +diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h +index 34a28227068d..16487052017d 100644 +--- a/include/linux/memory_hotplug.h ++++ b/include/linux/memory_hotplug.h +@@ -322,6 +322,7 @@ static inline void remove_memory(int nid, u64 start, u64 size) {} + extern void __ref free_area_init_core_hotplug(int nid); + extern int walk_memory_range(unsigned long start_pfn, unsigned long end_pfn, + void *arg, int (*func)(struct memory_block *, void *)); ++extern int __add_memory(int nid, u64 start, u64 size); + extern int add_memory(int nid, u64 start, u64 size); + extern int add_memory_resource(int nid, struct resource *resource, bool online); + extern int arch_add_memory(int nid, u64 start, u64 size, +diff --git a/include/linux/mfd/intel_soc_pmic.h b/include/linux/mfd/intel_soc_pmic.h +index 5aacdb017a9f..806a4f095312 100644 +--- a/include/linux/mfd/intel_soc_pmic.h ++++ b/include/linux/mfd/intel_soc_pmic.h +@@ -25,6 +25,7 @@ struct intel_soc_pmic { + int irq; + struct regmap *regmap; + struct regmap_irq_chip_data *irq_chip_data; ++ struct regmap_irq_chip_data *irq_chip_data_pwrbtn; + struct regmap_irq_chip_data *irq_chip_data_tmu; + struct regmap_irq_chip_data *irq_chip_data_bcu; + struct regmap_irq_chip_data *irq_chip_data_adc; +diff --git a/include/linux/mfd/max8997.h b/include/linux/mfd/max8997.h +index cf815577bd68..3ae1fe743bc3 100644 +--- a/include/linux/mfd/max8997.h ++++ b/include/linux/mfd/max8997.h +@@ -178,7 +178,6 @@ struct max8997_led_platform_data { + struct max8997_platform_data { + /* IRQ */ + int ono; +- int wakeup; + + /* ---- PMIC ---- */ + struct max8997_regulator_data *regulators; +diff --git a/include/linux/mfd/mc13xxx.h b/include/linux/mfd/mc13xxx.h +index 54a3cd808f9e..2ad9bdc0a5ec 100644 +--- a/include/linux/mfd/mc13xxx.h ++++ b/include/linux/mfd/mc13xxx.h +@@ -249,6 +249,7 @@ struct mc13xxx_platform_data { + #define MC13XXX_ADC0_TSMOD0 (1 << 12) + #define MC13XXX_ADC0_TSMOD1 (1 << 13) + #define MC13XXX_ADC0_TSMOD2 (1 << 14) ++#define MC13XXX_ADC0_CHRGRAWDIV (1 << 15) + #define MC13XXX_ADC0_ADINC1 (1 << 16) + #define MC13XXX_ADC0_ADINC2 (1 << 17) + +diff --git a/kernel/Makefile b/kernel/Makefile +index df5e3ca30acd..ad4b324d8906 100644 +--- a/kernel/Makefile ++++ b/kernel/Makefile +@@ -50,9 +50,6 @@ obj-$(CONFIG_PROFILING) += profile.o + obj-$(CONFIG_STACKTRACE) += stacktrace.o + obj-y += time/ + obj-$(CONFIG_FUTEX) += futex.o +-ifeq ($(CONFIG_COMPAT),y) +-obj-$(CONFIG_FUTEX) += futex_compat.o +-endif + obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o + obj-$(CONFIG_SMP) += smp.o + ifneq ($(CONFIG_SMP),y) +diff --git a/kernel/auditsc.c b/kernel/auditsc.c +index b2d1f043f17f..1513873e23bd 100644 +--- a/kernel/auditsc.c ++++ b/kernel/auditsc.c +@@ -1107,7 +1107,7 @@ static void audit_log_execve_info(struct audit_context *context, + } + + /* write as much as we can to the audit log */ +- if (len_buf > 0) { ++ if (len_buf >= 0) { + /* NOTE: some magic numbers here - basically if we + * can't fit a reasonable amount of data into the + * existing audit buffer, flush it and start with +diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c +index 378cef70341c..cfa27b7d1168 100644 +--- a/kernel/bpf/btf.c ++++ b/kernel/bpf/btf.c +@@ -2067,50 +2067,44 @@ static int btf_check_sec_info(struct btf_verifier_env *env, + return 0; + } + +-static int btf_parse_hdr(struct btf_verifier_env *env, void __user *btf_data, +- u32 btf_data_size) ++static int btf_parse_hdr(struct btf_verifier_env *env) + { ++ u32 hdr_len, hdr_copy, btf_data_size; + const struct btf_header *hdr; +- u32 hdr_len, hdr_copy; +- /* +- * Minimal part of the "struct btf_header" that +- * contains the hdr_len. +- */ +- struct btf_min_header { +- u16 magic; +- u8 version; +- u8 flags; +- u32 hdr_len; +- } __user *min_hdr; + struct btf *btf; + int err; + + btf = env->btf; +- min_hdr = btf_data; ++ btf_data_size = btf->data_size; + +- if (btf_data_size < sizeof(*min_hdr)) { ++ if (btf_data_size < ++ offsetof(struct btf_header, hdr_len) + sizeof(hdr->hdr_len)) { + btf_verifier_log(env, "hdr_len not found"); + return -EINVAL; + } + +- if (get_user(hdr_len, &min_hdr->hdr_len)) +- return -EFAULT; +- ++ hdr = btf->data; ++ hdr_len = hdr->hdr_len; + if (btf_data_size < hdr_len) { + btf_verifier_log(env, "btf_header not found"); + return -EINVAL; + } + +- err = bpf_check_uarg_tail_zero(btf_data, sizeof(btf->hdr), hdr_len); +- if (err) { +- if (err == -E2BIG) +- btf_verifier_log(env, "Unsupported btf_header"); +- return err; ++ /* Ensure the unsupported header fields are zero */ ++ if (hdr_len > sizeof(btf->hdr)) { ++ u8 *expected_zero = btf->data + sizeof(btf->hdr); ++ u8 *end = btf->data + hdr_len; ++ ++ for (; expected_zero < end; expected_zero++) { ++ if (*expected_zero) { ++ btf_verifier_log(env, "Unsupported btf_header"); ++ return -E2BIG; ++ } ++ } + } + + hdr_copy = min_t(u32, hdr_len, sizeof(btf->hdr)); +- if (copy_from_user(&btf->hdr, btf_data, hdr_copy)) +- return -EFAULT; ++ memcpy(&btf->hdr, btf->data, hdr_copy); + + hdr = &btf->hdr; + +@@ -2186,10 +2180,6 @@ static struct btf *btf_parse(void __user *btf_data, u32 btf_data_size, + } + env->btf = btf; + +- err = btf_parse_hdr(env, btf_data, btf_data_size); +- if (err) +- goto errout; +- + data = kvmalloc(btf_data_size, GFP_KERNEL | __GFP_NOWARN); + if (!data) { + err = -ENOMEM; +@@ -2198,13 +2188,18 @@ static struct btf *btf_parse(void __user *btf_data, u32 btf_data_size, + + btf->data = data; + btf->data_size = btf_data_size; +- btf->nohdr_data = btf->data + btf->hdr.hdr_len; + + if (copy_from_user(data, btf_data, btf_data_size)) { + err = -EFAULT; + goto errout; + } + ++ err = btf_parse_hdr(env); ++ if (err) ++ goto errout; ++ ++ btf->nohdr_data = btf->data + btf->hdr.hdr_len; ++ + err = btf_parse_str_sec(env); + if (err) + goto errout; +diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c +index fc500ca464d0..1defea4b2755 100644 +--- a/kernel/bpf/devmap.c ++++ b/kernel/bpf/devmap.c +@@ -520,8 +520,7 @@ static int dev_map_notification(struct notifier_block *notifier, + struct bpf_dtab_netdev *dev, *odev; + + dev = READ_ONCE(dtab->netdev_map[i]); +- if (!dev || +- dev->dev->ifindex != netdev->ifindex) ++ if (!dev || netdev != dev->dev) + continue; + odev = cmpxchg(&dtab->netdev_map[i], dev, NULL); + if (dev == odev) +diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c +index 4f8a6dbf0b60..2a8c41f12d45 100644 +--- a/kernel/dma/swiotlb.c ++++ b/kernel/dma/swiotlb.c +@@ -761,34 +761,6 @@ static bool swiotlb_free_buffer(struct device *dev, size_t size, + return true; + } + +-static void +-swiotlb_full(struct device *dev, size_t size, enum dma_data_direction dir, +- int do_panic) +-{ +- if (swiotlb_force == SWIOTLB_NO_FORCE) +- return; +- +- /* +- * Ran out of IOMMU space for this operation. This is very bad. +- * Unfortunately the drivers cannot handle this operation properly. +- * unless they check for dma_mapping_error (most don't) +- * When the mapping is small enough return a static buffer to limit +- * the damage, or panic when the transfer is too big. +- */ +- dev_err_ratelimited(dev, "DMA: Out of SW-IOMMU space for %zu bytes\n", +- size); +- +- if (size <= io_tlb_overflow || !do_panic) +- return; +- +- if (dir == DMA_BIDIRECTIONAL) +- panic("DMA: Random memory could be DMA accessed\n"); +- if (dir == DMA_FROM_DEVICE) +- panic("DMA: Random memory could be DMA written\n"); +- if (dir == DMA_TO_DEVICE) +- panic("DMA: Random memory could be DMA read\n"); +-} +- + /* + * Map a single buffer of the indicated size for DMA in streaming mode. The + * physical address to use is returned. +@@ -817,10 +789,8 @@ dma_addr_t swiotlb_map_page(struct device *dev, struct page *page, + + /* Oh well, have to allocate and map a bounce buffer. */ + map = map_single(dev, phys, size, dir, attrs); +- if (map == SWIOTLB_MAP_ERROR) { +- swiotlb_full(dev, size, dir, 1); ++ if (map == SWIOTLB_MAP_ERROR) + return __phys_to_dma(dev, io_tlb_overflow_buffer); +- } + + dev_addr = __phys_to_dma(dev, map); + +@@ -954,7 +924,6 @@ swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, int nelems, + if (map == SWIOTLB_MAP_ERROR) { + /* Don't panic here, we expect map_sg users + to do proper error handling. */ +- swiotlb_full(hwdev, sg->length, dir, 0); + attrs |= DMA_ATTR_SKIP_CPU_SYNC; + swiotlb_unmap_sg_attrs(hwdev, sgl, i, dir, + attrs); +diff --git a/kernel/futex.c b/kernel/futex.c +index afdc5eadce6e..e75ad30aa7bc 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -44,6 +44,7 @@ + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ ++#include <linux/compat.h> + #include <linux/slab.h> + #include <linux/poll.h> + #include <linux/fs.h> +@@ -173,8 +174,10 @@ + * double_lock_hb() and double_unlock_hb(), respectively. + */ + +-#ifndef CONFIG_HAVE_FUTEX_CMPXCHG +-int __read_mostly futex_cmpxchg_enabled; ++#ifdef CONFIG_HAVE_FUTEX_CMPXCHG ++#define futex_cmpxchg_enabled 1 ++#else ++static int __read_mostly futex_cmpxchg_enabled; + #endif + + /* +@@ -3454,11 +3457,16 @@ err_unlock: + return ret; + } + ++/* Constants for the pending_op argument of handle_futex_death */ ++#define HANDLE_DEATH_PENDING true ++#define HANDLE_DEATH_LIST false ++ + /* + * Process a futex-list entry, check whether it's owned by the + * dying task, and do notification if so: + */ +-int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi) ++static int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, ++ bool pi, bool pending_op) + { + u32 uval, uninitialized_var(nval), mval; + int err; +@@ -3471,6 +3479,42 @@ retry: + if (get_user(uval, uaddr)) + return -1; + ++ /* ++ * Special case for regular (non PI) futexes. The unlock path in ++ * user space has two race scenarios: ++ * ++ * 1. The unlock path releases the user space futex value and ++ * before it can execute the futex() syscall to wake up ++ * waiters it is killed. ++ * ++ * 2. A woken up waiter is killed before it can acquire the ++ * futex in user space. ++ * ++ * In both cases the TID validation below prevents a wakeup of ++ * potential waiters which can cause these waiters to block ++ * forever. ++ * ++ * In both cases the following conditions are met: ++ * ++ * 1) task->robust_list->list_op_pending != NULL ++ * @pending_op == true ++ * 2) User space futex value == 0 ++ * 3) Regular futex: @pi == false ++ * ++ * If these conditions are met, it is safe to attempt waking up a ++ * potential waiter without touching the user space futex value and ++ * trying to set the OWNER_DIED bit. The user space futex value is ++ * uncontended and the rest of the user space mutex state is ++ * consistent, so a woken waiter will just take over the ++ * uncontended futex. Setting the OWNER_DIED bit would create ++ * inconsistent state and malfunction of the user space owner died ++ * handling. ++ */ ++ if (pending_op && !pi && !uval) { ++ futex_wake(uaddr, 1, 1, FUTEX_BITSET_MATCH_ANY); ++ return 0; ++ } ++ + if ((uval & FUTEX_TID_MASK) != task_pid_vnr(curr)) + return 0; + +@@ -3590,10 +3634,11 @@ void exit_robust_list(struct task_struct *curr) + * A pending lock might already be on the list, so + * don't process it twice: + */ +- if (entry != pending) ++ if (entry != pending) { + if (handle_futex_death((void __user *)entry + futex_offset, +- curr, pi)) ++ curr, pi, HANDLE_DEATH_LIST)) + return; ++ } + if (rc) + return; + entry = next_entry; +@@ -3607,9 +3652,10 @@ void exit_robust_list(struct task_struct *curr) + cond_resched(); + } + +- if (pending) ++ if (pending) { + handle_futex_death((void __user *)pending + futex_offset, +- curr, pip); ++ curr, pip, HANDLE_DEATH_PENDING); ++ } + } + + long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, +@@ -3707,6 +3753,193 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val, + return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); + } + ++#ifdef CONFIG_COMPAT ++/* ++ * Fetch a robust-list pointer. Bit 0 signals PI futexes: ++ */ ++static inline int ++compat_fetch_robust_entry(compat_uptr_t *uentry, struct robust_list __user **entry, ++ compat_uptr_t __user *head, unsigned int *pi) ++{ ++ if (get_user(*uentry, head)) ++ return -EFAULT; ++ ++ *entry = compat_ptr((*uentry) & ~1); ++ *pi = (unsigned int)(*uentry) & 1; ++ ++ return 0; ++} ++ ++static void __user *futex_uaddr(struct robust_list __user *entry, ++ compat_long_t futex_offset) ++{ ++ compat_uptr_t base = ptr_to_compat(entry); ++ void __user *uaddr = compat_ptr(base + futex_offset); ++ ++ return uaddr; ++} ++ ++/* ++ * Walk curr->robust_list (very carefully, it's a userspace list!) ++ * and mark any locks found there dead, and notify any waiters. ++ * ++ * We silently return on any sign of list-walking problem. ++ */ ++void compat_exit_robust_list(struct task_struct *curr) ++{ ++ struct compat_robust_list_head __user *head = curr->compat_robust_list; ++ struct robust_list __user *entry, *next_entry, *pending; ++ unsigned int limit = ROBUST_LIST_LIMIT, pi, pip; ++ unsigned int uninitialized_var(next_pi); ++ compat_uptr_t uentry, next_uentry, upending; ++ compat_long_t futex_offset; ++ int rc; ++ ++ if (!futex_cmpxchg_enabled) ++ return; ++ ++ /* ++ * Fetch the list head (which was registered earlier, via ++ * sys_set_robust_list()): ++ */ ++ if (compat_fetch_robust_entry(&uentry, &entry, &head->list.next, &pi)) ++ return; ++ /* ++ * Fetch the relative futex offset: ++ */ ++ if (get_user(futex_offset, &head->futex_offset)) ++ return; ++ /* ++ * Fetch any possibly pending lock-add first, and handle it ++ * if it exists: ++ */ ++ if (compat_fetch_robust_entry(&upending, &pending, ++ &head->list_op_pending, &pip)) ++ return; ++ ++ next_entry = NULL; /* avoid warning with gcc */ ++ while (entry != (struct robust_list __user *) &head->list) { ++ /* ++ * Fetch the next entry in the list before calling ++ * handle_futex_death: ++ */ ++ rc = compat_fetch_robust_entry(&next_uentry, &next_entry, ++ (compat_uptr_t __user *)&entry->next, &next_pi); ++ /* ++ * A pending lock might already be on the list, so ++ * dont process it twice: ++ */ ++ if (entry != pending) { ++ void __user *uaddr = futex_uaddr(entry, futex_offset); ++ ++ if (handle_futex_death(uaddr, curr, pi, ++ HANDLE_DEATH_LIST)) ++ return; ++ } ++ if (rc) ++ return; ++ uentry = next_uentry; ++ entry = next_entry; ++ pi = next_pi; ++ /* ++ * Avoid excessively long or circular lists: ++ */ ++ if (!--limit) ++ break; ++ ++ cond_resched(); ++ } ++ if (pending) { ++ void __user *uaddr = futex_uaddr(pending, futex_offset); ++ ++ handle_futex_death(uaddr, curr, pip, HANDLE_DEATH_PENDING); ++ } ++} ++ ++COMPAT_SYSCALL_DEFINE2(set_robust_list, ++ struct compat_robust_list_head __user *, head, ++ compat_size_t, len) ++{ ++ if (!futex_cmpxchg_enabled) ++ return -ENOSYS; ++ ++ if (unlikely(len != sizeof(*head))) ++ return -EINVAL; ++ ++ current->compat_robust_list = head; ++ ++ return 0; ++} ++ ++COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid, ++ compat_uptr_t __user *, head_ptr, ++ compat_size_t __user *, len_ptr) ++{ ++ struct compat_robust_list_head __user *head; ++ unsigned long ret; ++ struct task_struct *p; ++ ++ if (!futex_cmpxchg_enabled) ++ return -ENOSYS; ++ ++ rcu_read_lock(); ++ ++ ret = -ESRCH; ++ if (!pid) ++ p = current; ++ else { ++ p = find_task_by_vpid(pid); ++ if (!p) ++ goto err_unlock; ++ } ++ ++ ret = -EPERM; ++ if (!ptrace_may_access(p, PTRACE_MODE_READ_REALCREDS)) ++ goto err_unlock; ++ ++ head = p->compat_robust_list; ++ rcu_read_unlock(); ++ ++ if (put_user(sizeof(*head), len_ptr)) ++ return -EFAULT; ++ return put_user(ptr_to_compat(head), head_ptr); ++ ++err_unlock: ++ rcu_read_unlock(); ++ ++ return ret; ++} ++ ++COMPAT_SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val, ++ struct old_timespec32 __user *, utime, u32 __user *, uaddr2, ++ u32, val3) ++{ ++ struct timespec ts; ++ ktime_t t, *tp = NULL; ++ int val2 = 0; ++ int cmd = op & FUTEX_CMD_MASK; ++ ++ if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI || ++ cmd == FUTEX_WAIT_BITSET || ++ cmd == FUTEX_WAIT_REQUEUE_PI)) { ++ if (compat_get_timespec(&ts, utime)) ++ return -EFAULT; ++ if (!timespec_valid(&ts)) ++ return -EINVAL; ++ ++ t = timespec_to_ktime(ts); ++ if (cmd == FUTEX_WAIT) ++ t = ktime_add_safe(ktime_get(), t); ++ tp = &t; ++ } ++ if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE || ++ cmd == FUTEX_CMP_REQUEUE_PI || cmd == FUTEX_WAKE_OP) ++ val2 = (int) (unsigned long) utime; ++ ++ return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); ++} ++#endif /* CONFIG_COMPAT */ ++ + static void __init futex_detect_cmpxchg(void) + { + #ifndef CONFIG_HAVE_FUTEX_CMPXCHG +diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c +deleted file mode 100644 +index 83f830acbb5f..000000000000 +--- a/kernel/futex_compat.c ++++ /dev/null +@@ -1,202 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +-/* +- * linux/kernel/futex_compat.c +- * +- * Futex compatibililty routines. +- * +- * Copyright 2006, Red Hat, Inc., Ingo Molnar +- */ +- +-#include <linux/linkage.h> +-#include <linux/compat.h> +-#include <linux/nsproxy.h> +-#include <linux/futex.h> +-#include <linux/ptrace.h> +-#include <linux/syscalls.h> +- +-#include <linux/uaccess.h> +- +- +-/* +- * Fetch a robust-list pointer. Bit 0 signals PI futexes: +- */ +-static inline int +-fetch_robust_entry(compat_uptr_t *uentry, struct robust_list __user **entry, +- compat_uptr_t __user *head, unsigned int *pi) +-{ +- if (get_user(*uentry, head)) +- return -EFAULT; +- +- *entry = compat_ptr((*uentry) & ~1); +- *pi = (unsigned int)(*uentry) & 1; +- +- return 0; +-} +- +-static void __user *futex_uaddr(struct robust_list __user *entry, +- compat_long_t futex_offset) +-{ +- compat_uptr_t base = ptr_to_compat(entry); +- void __user *uaddr = compat_ptr(base + futex_offset); +- +- return uaddr; +-} +- +-/* +- * Walk curr->robust_list (very carefully, it's a userspace list!) +- * and mark any locks found there dead, and notify any waiters. +- * +- * We silently return on any sign of list-walking problem. +- */ +-void compat_exit_robust_list(struct task_struct *curr) +-{ +- struct compat_robust_list_head __user *head = curr->compat_robust_list; +- struct robust_list __user *entry, *next_entry, *pending; +- unsigned int limit = ROBUST_LIST_LIMIT, pi, pip; +- unsigned int uninitialized_var(next_pi); +- compat_uptr_t uentry, next_uentry, upending; +- compat_long_t futex_offset; +- int rc; +- +- if (!futex_cmpxchg_enabled) +- return; +- +- /* +- * Fetch the list head (which was registered earlier, via +- * sys_set_robust_list()): +- */ +- if (fetch_robust_entry(&uentry, &entry, &head->list.next, &pi)) +- return; +- /* +- * Fetch the relative futex offset: +- */ +- if (get_user(futex_offset, &head->futex_offset)) +- return; +- /* +- * Fetch any possibly pending lock-add first, and handle it +- * if it exists: +- */ +- if (fetch_robust_entry(&upending, &pending, +- &head->list_op_pending, &pip)) +- return; +- +- next_entry = NULL; /* avoid warning with gcc */ +- while (entry != (struct robust_list __user *) &head->list) { +- /* +- * Fetch the next entry in the list before calling +- * handle_futex_death: +- */ +- rc = fetch_robust_entry(&next_uentry, &next_entry, +- (compat_uptr_t __user *)&entry->next, &next_pi); +- /* +- * A pending lock might already be on the list, so +- * dont process it twice: +- */ +- if (entry != pending) { +- void __user *uaddr = futex_uaddr(entry, futex_offset); +- +- if (handle_futex_death(uaddr, curr, pi)) +- return; +- } +- if (rc) +- return; +- uentry = next_uentry; +- entry = next_entry; +- pi = next_pi; +- /* +- * Avoid excessively long or circular lists: +- */ +- if (!--limit) +- break; +- +- cond_resched(); +- } +- if (pending) { +- void __user *uaddr = futex_uaddr(pending, futex_offset); +- +- handle_futex_death(uaddr, curr, pip); +- } +-} +- +-COMPAT_SYSCALL_DEFINE2(set_robust_list, +- struct compat_robust_list_head __user *, head, +- compat_size_t, len) +-{ +- if (!futex_cmpxchg_enabled) +- return -ENOSYS; +- +- if (unlikely(len != sizeof(*head))) +- return -EINVAL; +- +- current->compat_robust_list = head; +- +- return 0; +-} +- +-COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid, +- compat_uptr_t __user *, head_ptr, +- compat_size_t __user *, len_ptr) +-{ +- struct compat_robust_list_head __user *head; +- unsigned long ret; +- struct task_struct *p; +- +- if (!futex_cmpxchg_enabled) +- return -ENOSYS; +- +- rcu_read_lock(); +- +- ret = -ESRCH; +- if (!pid) +- p = current; +- else { +- p = find_task_by_vpid(pid); +- if (!p) +- goto err_unlock; +- } +- +- ret = -EPERM; +- if (!ptrace_may_access(p, PTRACE_MODE_READ_REALCREDS)) +- goto err_unlock; +- +- head = p->compat_robust_list; +- rcu_read_unlock(); +- +- if (put_user(sizeof(*head), len_ptr)) +- return -EFAULT; +- return put_user(ptr_to_compat(head), head_ptr); +- +-err_unlock: +- rcu_read_unlock(); +- +- return ret; +-} +- +-COMPAT_SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val, +- struct compat_timespec __user *, utime, u32 __user *, uaddr2, +- u32, val3) +-{ +- struct timespec ts; +- ktime_t t, *tp = NULL; +- int val2 = 0; +- int cmd = op & FUTEX_CMD_MASK; +- +- if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI || +- cmd == FUTEX_WAIT_BITSET || +- cmd == FUTEX_WAIT_REQUEUE_PI)) { +- if (compat_get_timespec(&ts, utime)) +- return -EFAULT; +- if (!timespec_valid(&ts)) +- return -EINVAL; +- +- t = timespec_to_ktime(ts); +- if (cmd == FUTEX_WAIT) +- t = ktime_add_safe(ktime_get(), t); +- tp = &t; +- } +- if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE || +- cmd == FUTEX_CMP_REQUEUE_PI || cmd == FUTEX_WAKE_OP) +- val2 = (int) (unsigned long) utime; +- +- return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); +-} +diff --git a/kernel/irq/matrix.c b/kernel/irq/matrix.c +index 92337703ca9f..30cc217b8631 100644 +--- a/kernel/irq/matrix.c ++++ b/kernel/irq/matrix.c +@@ -8,7 +8,7 @@ + #include <linux/cpu.h> + #include <linux/irq.h> + +-#define IRQ_MATRIX_SIZE (BITS_TO_LONGS(IRQ_MATRIX_BITS) * sizeof(unsigned long)) ++#define IRQ_MATRIX_SIZE (BITS_TO_LONGS(IRQ_MATRIX_BITS)) + + struct cpumap { + unsigned int available; +diff --git a/kernel/panic.c b/kernel/panic.c +index 72e001e3753e..8138a676fb7d 100644 +--- a/kernel/panic.c ++++ b/kernel/panic.c +@@ -636,7 +636,7 @@ device_initcall(register_warn_debugfs); + */ + __visible void __stack_chk_fail(void) + { +- panic("stack-protector: Kernel stack is corrupted in: %pB\n", ++ panic("stack-protector: Kernel stack is corrupted in: %pB", + __builtin_return_address(0)); + } + EXPORT_SYMBOL(__stack_chk_fail); +diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c +index c7b3d5489937..845efadaf7ec 100644 +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -1105,7 +1105,7 @@ void __init setup_log_buf(int early) + { + unsigned long flags; + char *new_log_buf; +- int free; ++ unsigned int free; + + if (log_buf != __log_buf) + return; +@@ -1901,8 +1901,9 @@ asmlinkage int vprintk_emit(int facility, int level, + const char *fmt, va_list args) + { + int printed_len; +- bool in_sched = false; ++ bool in_sched = false, pending_output; + unsigned long flags; ++ u64 curr_log_seq; + + if (level == LOGLEVEL_SCHED) { + level = LOGLEVEL_DEFAULT; +@@ -1914,11 +1915,13 @@ asmlinkage int vprintk_emit(int facility, int level, + + /* This stops the holder of console_sem just where we want him */ + logbuf_lock_irqsave(flags); ++ curr_log_seq = log_next_seq; + printed_len = vprintk_store(facility, level, dict, dictlen, fmt, args); ++ pending_output = (curr_log_seq != log_next_seq); + logbuf_unlock_irqrestore(flags); + + /* If called from the scheduler, we can not call up(). */ +- if (!in_sched) { ++ if (!in_sched && pending_output) { + /* + * Disable preemption to avoid being preempted while holding + * console_sem which would prevent anyone from printing to +@@ -1935,7 +1938,8 @@ asmlinkage int vprintk_emit(int facility, int level, + preempt_enable(); + } + +- wake_up_klogd(); ++ if (pending_output) ++ wake_up_klogd(); + return printed_len; + } + EXPORT_SYMBOL(vprintk_emit); +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index e5e8f6721872..f77fcd37b226 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -8819,13 +8819,22 @@ out_all_pinned: + sd->nr_balance_failed = 0; + + out_one_pinned: ++ ld_moved = 0; ++ ++ /* ++ * idle_balance() disregards balance intervals, so we could repeatedly ++ * reach this code, which would lead to balance_interval skyrocketting ++ * in a short amount of time. Skip the balance_interval increase logic ++ * to avoid that. ++ */ ++ if (env.idle == CPU_NEWLY_IDLE) ++ goto out; ++ + /* tune up the balancing interval */ + if (((env.flags & LBF_ALL_PINNED) && + sd->balance_interval < MAX_PINNED_INTERVAL) || + (sd->balance_interval < sd->max_interval)) + sd->balance_interval *= 2; +- +- ld_moved = 0; + out: + return ld_moved; + } +diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c +index c0a751464971..74b694392f2f 100644 +--- a/kernel/sched/topology.c ++++ b/kernel/sched/topology.c +@@ -1329,7 +1329,7 @@ void sched_init_numa(void) + int level = 0; + int i, j, k; + +- sched_domains_numa_distance = kzalloc(sizeof(int) * nr_node_ids, GFP_KERNEL); ++ sched_domains_numa_distance = kzalloc(sizeof(int) * (nr_node_ids + 1), GFP_KERNEL); + if (!sched_domains_numa_distance) + return; + +diff --git a/lib/bitmap.c b/lib/bitmap.c +index 2fd07f6df0b8..c4ca9ceb09fe 100644 +--- a/lib/bitmap.c ++++ b/lib/bitmap.c +@@ -13,6 +13,7 @@ + #include <linux/bitops.h> + #include <linux/bug.h> + #include <linux/kernel.h> ++#include <linux/mm.h> + #include <linux/slab.h> + #include <linux/string.h> + #include <linux/uaccess.h> +@@ -466,14 +467,15 @@ EXPORT_SYMBOL(bitmap_parse_user); + * ranges if list is specified or hex digits grouped into comma-separated + * sets of 8 digits/set. Returns the number of characters written to buf. + * +- * It is assumed that @buf is a pointer into a PAGE_SIZE area and that +- * sufficient storage remains at @buf to accommodate the +- * bitmap_print_to_pagebuf() output. ++ * It is assumed that @buf is a pointer into a PAGE_SIZE, page-aligned ++ * area and that sufficient storage remains at @buf to accommodate the ++ * bitmap_print_to_pagebuf() output. Returns the number of characters ++ * actually printed to @buf, excluding terminating '\0'. + */ + int bitmap_print_to_pagebuf(bool list, char *buf, const unsigned long *maskp, + int nmaskbits) + { +- ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf; ++ ptrdiff_t len = PAGE_SIZE - offset_in_page(buf); + int n = 0; + + if (len > 1) +diff --git a/mm/gup_benchmark.c b/mm/gup_benchmark.c +index 7405c9d89d65..7e6f2d2dafb5 100644 +--- a/mm/gup_benchmark.c ++++ b/mm/gup_benchmark.c +@@ -23,6 +23,9 @@ static int __gup_benchmark_ioctl(unsigned int cmd, + int nr; + struct page **pages; + ++ if (gup->size > ULONG_MAX) ++ return -EINVAL; ++ + nr_pages = gup->size / PAGE_SIZE; + pages = kvcalloc(nr_pages, sizeof(void *), GFP_KERNEL); + if (!pages) +diff --git a/mm/ksm.c b/mm/ksm.c +index 5b0894b45ee5..b3ea0f0316eb 100644 +--- a/mm/ksm.c ++++ b/mm/ksm.c +@@ -870,13 +870,13 @@ static int remove_stable_node(struct stable_node *stable_node) + return 0; + } + +- if (WARN_ON_ONCE(page_mapped(page))) { +- /* +- * This should not happen: but if it does, just refuse to let +- * merge_across_nodes be switched - there is no need to panic. +- */ +- err = -EBUSY; +- } else { ++ /* ++ * Page could be still mapped if this races with __mmput() running in ++ * between ksm_exit() and exit_mmap(). Just refuse to let ++ * merge_across_nodes/max_page_sharing be switched. ++ */ ++ err = -EBUSY; ++ if (!page_mapped(page)) { + /* + * The stable node did not yet appear stale to get_ksm_page(), + * since that allows for an unmapped ksm page to be recognized +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index 5af38d8a9afd..3a3d109dce21 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -2678,7 +2678,7 @@ int memcg_kmem_charge(struct page *page, gfp_t gfp, int order) + struct mem_cgroup *memcg; + int ret = 0; + +- if (memcg_kmem_bypass()) ++ if (mem_cgroup_disabled() || memcg_kmem_bypass()) + return 0; + + memcg = get_mem_cgroup_from_current(); +diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c +index 7965112eb063..413f6709039a 100644 +--- a/mm/memory_hotplug.c ++++ b/mm/memory_hotplug.c +@@ -321,12 +321,8 @@ static unsigned long find_smallest_section_pfn(int nid, struct zone *zone, + unsigned long start_pfn, + unsigned long end_pfn) + { +- struct mem_section *ms; +- + for (; start_pfn < end_pfn; start_pfn += PAGES_PER_SECTION) { +- ms = __pfn_to_section(start_pfn); +- +- if (unlikely(!valid_section(ms))) ++ if (unlikely(!pfn_to_online_page(start_pfn))) + continue; + + if (unlikely(pfn_to_nid(start_pfn) != nid)) +@@ -346,15 +342,12 @@ static unsigned long find_biggest_section_pfn(int nid, struct zone *zone, + unsigned long start_pfn, + unsigned long end_pfn) + { +- struct mem_section *ms; + unsigned long pfn; + + /* pfn is the end pfn of a memory section. */ + pfn = end_pfn - 1; + for (; pfn >= start_pfn; pfn -= PAGES_PER_SECTION) { +- ms = __pfn_to_section(pfn); +- +- if (unlikely(!valid_section(ms))) ++ if (unlikely(!pfn_to_online_page(pfn))) + continue; + + if (unlikely(pfn_to_nid(pfn) != nid)) +@@ -376,7 +369,6 @@ static void shrink_zone_span(struct zone *zone, unsigned long start_pfn, + unsigned long z = zone_end_pfn(zone); /* zone_end_pfn namespace clash */ + unsigned long zone_end_pfn = z; + unsigned long pfn; +- struct mem_section *ms; + int nid = zone_to_nid(zone); + + zone_span_writelock(zone); +@@ -414,9 +406,7 @@ static void shrink_zone_span(struct zone *zone, unsigned long start_pfn, + */ + pfn = zone_start_pfn; + for (; pfn < zone_end_pfn; pfn += PAGES_PER_SECTION) { +- ms = __pfn_to_section(pfn); +- +- if (unlikely(!valid_section(ms))) ++ if (unlikely(!pfn_to_online_page(pfn))) + continue; + + if (page_zone(pfn_to_page(pfn)) != zone) +@@ -472,6 +462,16 @@ static void __remove_zone(struct zone *zone, unsigned long start_pfn) + int nr_pages = PAGES_PER_SECTION; + unsigned long flags; + ++#ifdef CONFIG_ZONE_DEVICE ++ /* ++ * Zone shrinking code cannot properly deal with ZONE_DEVICE. So ++ * we will not try to shrink the zones - which is okay as ++ * set_zone_contiguous() cannot deal with ZONE_DEVICE either way. ++ */ ++ if (zone_idx(zone) == ZONE_DEVICE) ++ return; ++#endif ++ + pgdat_resize_lock(zone->zone_pgdat, &flags); + shrink_zone_span(zone, start_pfn, start_pfn + nr_pages); + update_pgdat_span(pgdat); +@@ -846,7 +846,6 @@ static struct zone * __meminit move_pfn_range(int online_type, int nid, + return zone; + } + +-/* Must be protected by mem_hotplug_begin() or a device_lock */ + int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_type) + { + unsigned long flags; +@@ -858,6 +857,8 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_typ + struct memory_notify arg; + struct memory_block *mem; + ++ mem_hotplug_begin(); ++ + /* + * We can't use pfn_to_nid() because nid might be stored in struct page + * which is not yet initialized. Instead, we find nid from memory block. +@@ -923,6 +924,7 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_typ + + if (onlined_pages) + memory_notify(MEM_ONLINE, &arg); ++ mem_hotplug_done(); + return 0; + + failed_addition: +@@ -930,6 +932,7 @@ failed_addition: + (unsigned long long) pfn << PAGE_SHIFT, + (((unsigned long long) pfn + nr_pages) << PAGE_SHIFT) - 1); + memory_notify(MEM_CANCEL_ONLINE, &arg); ++ mem_hotplug_done(); + return ret; + } + #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ +@@ -1077,7 +1080,12 @@ static int online_memory_block(struct memory_block *mem, void *arg) + return device_online(&mem->dev); + } + +-/* we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG */ ++/* ++ * NOTE: The caller must call lock_device_hotplug() to serialize hotplug ++ * and online/offline operations (triggered e.g. by sysfs). ++ * ++ * we are OK calling __meminit stuff here - we have CONFIG_MEMORY_HOTPLUG ++ */ + int __ref add_memory_resource(int nid, struct resource *res, bool online) + { + u64 start, size; +@@ -1129,26 +1137,26 @@ int __ref add_memory_resource(int nid, struct resource *res, bool online) + /* create new memmap entry */ + firmware_map_add_hotplug(start, start + size, "System RAM"); + ++ /* device_online() will take the lock when calling online_pages() */ ++ mem_hotplug_done(); ++ + /* online pages if requested */ + if (online) + walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), + NULL, online_memory_block); + +- goto out; +- ++ return ret; + error: + /* rollback pgdat allocation and others */ + if (new_node) + rollback_node_hotadd(nid); + memblock_remove(start, size); +- +-out: + mem_hotplug_done(); + return ret; + } +-EXPORT_SYMBOL_GPL(add_memory_resource); + +-int __ref add_memory(int nid, u64 start, u64 size) ++/* requires device_hotplug_lock, see add_memory_resource() */ ++int __ref __add_memory(int nid, u64 start, u64 size) + { + struct resource *res; + int ret; +@@ -1162,6 +1170,17 @@ int __ref add_memory(int nid, u64 start, u64 size) + release_memory_resource(res); + return ret; + } ++ ++int add_memory(int nid, u64 start, u64 size) ++{ ++ int rc; ++ ++ lock_device_hotplug(); ++ rc = __add_memory(nid, start, size); ++ unlock_device_hotplug(); ++ ++ return rc; ++} + EXPORT_SYMBOL_GPL(add_memory); + + #ifdef CONFIG_MEMORY_HOTREMOVE +@@ -1598,10 +1617,16 @@ static int __ref __offline_pages(unsigned long start_pfn, + return -EINVAL; + if (!IS_ALIGNED(end_pfn, pageblock_nr_pages)) + return -EINVAL; ++ ++ mem_hotplug_begin(); ++ + /* This makes hotplug much easier...and readable. + we assume this for now. .*/ +- if (!test_pages_in_a_zone(start_pfn, end_pfn, &valid_start, &valid_end)) ++ if (!test_pages_in_a_zone(start_pfn, end_pfn, &valid_start, ++ &valid_end)) { ++ mem_hotplug_done(); + return -EINVAL; ++ } + + zone = page_zone(pfn_to_page(valid_start)); + node = zone_to_nid(zone); +@@ -1610,8 +1635,10 @@ static int __ref __offline_pages(unsigned long start_pfn, + /* set above range as isolated */ + ret = start_isolate_page_range(start_pfn, end_pfn, + MIGRATE_MOVABLE, true); +- if (ret) ++ if (ret) { ++ mem_hotplug_done(); + return ret; ++ } + + arg.start_pfn = start_pfn; + arg.nr_pages = nr_pages; +@@ -1682,6 +1709,7 @@ repeat: + writeback_set_ratelimit(); + + memory_notify(MEM_OFFLINE, &arg); ++ mem_hotplug_done(); + return 0; + + failed_removal: +@@ -1691,10 +1719,10 @@ failed_removal: + memory_notify(MEM_CANCEL_OFFLINE, &arg); + /* pushback to free area */ + undo_isolate_page_range(start_pfn, end_pfn, MIGRATE_MOVABLE); ++ mem_hotplug_done(); + return ret; + } + +-/* Must be protected by mem_hotplug_begin() or a device_lock */ + int offline_pages(unsigned long start_pfn, unsigned long nr_pages) + { + return __offline_pages(start_pfn, start_pfn + nr_pages); +diff --git a/mm/migrate.c b/mm/migrate.c +index 0c48191a9036..4d3588c01203 100644 +--- a/mm/migrate.c ++++ b/mm/migrate.c +@@ -2048,15 +2048,26 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, + entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); + + /* +- * Clear the old entry under pagetable lock and establish the new PTE. +- * Any parallel GUP will either observe the old page blocking on the +- * page lock, block on the page table lock or observe the new page. +- * The SetPageUptodate on the new page and page_add_new_anon_rmap +- * guarantee the copy is visible before the pagetable update. ++ * Overwrite the old entry under pagetable lock and establish ++ * the new PTE. Any parallel GUP will either observe the old ++ * page blocking on the page lock, block on the page table ++ * lock or observe the new page. The SetPageUptodate on the ++ * new page and page_add_new_anon_rmap guarantee the copy is ++ * visible before the pagetable update. + */ + flush_cache_range(vma, mmun_start, mmun_end); + page_add_anon_rmap(new_page, vma, mmun_start, true); +- pmdp_huge_clear_flush_notify(vma, mmun_start, pmd); ++ /* ++ * At this point the pmd is numa/protnone (i.e. non present) and the TLB ++ * has already been flushed globally. So no TLB can be currently ++ * caching this non present pmd mapping. There's no need to clear the ++ * pmd before doing set_pmd_at(), nor to flush the TLB after ++ * set_pmd_at(). Clearing the pmd here would introduce a race ++ * condition against MADV_DONTNEED, because MADV_DONTNEED only holds the ++ * mmap_sem for reading. If the pmd is set to NULL at any given time, ++ * MADV_DONTNEED won't wait on the pmd lock and it'll skip clearing this ++ * pmd. ++ */ + set_pmd_at(mm, mmun_start, pmd, entry); + update_mmu_cache_pmd(vma, address, &entry); + +@@ -2070,7 +2081,7 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, + * No need to double call mmu_notifier->invalidate_range() callback as + * the above pmdp_huge_clear_flush_notify() did already call it. + */ +- mmu_notifier_invalidate_range_only_end(mm, mmun_start, mmun_end); ++ mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end); + + /* Take an "isolate" reference and put new page on the LRU. */ + get_page(new_page); +diff --git a/mm/page-writeback.c b/mm/page-writeback.c +index ea4fd3af3b4b..43df0c52e1cc 100644 +--- a/mm/page-writeback.c ++++ b/mm/page-writeback.c +@@ -2149,6 +2149,13 @@ EXPORT_SYMBOL(tag_pages_for_writeback); + * not miss some pages (e.g., because some other process has cleared TOWRITE + * tag we set). The rule we follow is that TOWRITE tag can be cleared only + * by the process clearing the DIRTY tag (and submitting the page for IO). ++ * ++ * To avoid deadlocks between range_cyclic writeback and callers that hold ++ * pages in PageWriteback to aggregate IO until write_cache_pages() returns, ++ * we do not loop back to the start of the file. Doing so causes a page ++ * lock/page writeback access order inversion - we should only ever lock ++ * multiple pages in ascending page->index order, and looping back to the start ++ * of the file violates that rule and causes deadlocks. + */ + int write_cache_pages(struct address_space *mapping, + struct writeback_control *wbc, writepage_t writepage, +@@ -2163,7 +2170,6 @@ int write_cache_pages(struct address_space *mapping, + pgoff_t index; + pgoff_t end; /* Inclusive */ + pgoff_t done_index; +- int cycled; + int range_whole = 0; + int tag; + +@@ -2171,23 +2177,17 @@ int write_cache_pages(struct address_space *mapping, + if (wbc->range_cyclic) { + writeback_index = mapping->writeback_index; /* prev offset */ + index = writeback_index; +- if (index == 0) +- cycled = 1; +- else +- cycled = 0; + end = -1; + } else { + index = wbc->range_start >> PAGE_SHIFT; + end = wbc->range_end >> PAGE_SHIFT; + if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) + range_whole = 1; +- cycled = 1; /* ignore range_cyclic tests */ + } + if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages) + tag = PAGECACHE_TAG_TOWRITE; + else + tag = PAGECACHE_TAG_DIRTY; +-retry: + if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages) + tag_pages_for_writeback(mapping, index, end); + done_index = index; +@@ -2279,17 +2279,14 @@ continue_unlock: + pagevec_release(&pvec); + cond_resched(); + } +- if (!cycled && !done) { +- /* +- * range_cyclic: +- * We hit the last page and there is more work to be done: wrap +- * back to the start of the file +- */ +- cycled = 1; +- index = 0; +- end = writeback_index - 1; +- goto retry; +- } ++ ++ /* ++ * If we hit the last page and there is more work to be done: wrap ++ * back the index back to the start of the file for the next ++ * time we are called. ++ */ ++ if (wbc->range_cyclic && !done) ++ done_index = 0; + if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) + mapping->writeback_index = done_index; + +diff --git a/mm/page_io.c b/mm/page_io.c +index aafd19ec1db4..08d2eae58fce 100644 +--- a/mm/page_io.c ++++ b/mm/page_io.c +@@ -76,6 +76,7 @@ static void swap_slot_free_notify(struct page *page) + { + struct swap_info_struct *sis; + struct gendisk *disk; ++ swp_entry_t entry; + + /* + * There is no guarantee that the page is in swap cache - the software +@@ -107,11 +108,11 @@ static void swap_slot_free_notify(struct page *page) + * we again wish to reclaim it. + */ + disk = sis->bdev->bd_disk; +- if (disk->fops->swap_slot_free_notify) { +- swp_entry_t entry; ++ entry.val = page_private(page); ++ if (disk->fops->swap_slot_free_notify && ++ __swap_count(sis, entry) == 1) { + unsigned long offset; + +- entry.val = page_private(page); + offset = swp_offset(entry); + + SetPageDirty(page); +diff --git a/net/core/dev.c b/net/core/dev.c +index e96c88b1465d..91179febdeee 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -3277,7 +3277,7 @@ struct sk_buff *dev_hard_start_xmit(struct sk_buff *first, struct net_device *de + } + + skb = next; +- if (netif_xmit_stopped(txq) && skb) { ++ if (netif_tx_queue_stopped(txq) && skb) { + rc = NETDEV_TX_BUSY; + break; + } +diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c +index c0de73b12580..dbb3c0c7c132 100644 +--- a/net/core/rtnetlink.c ++++ b/net/core/rtnetlink.c +@@ -2126,6 +2126,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) + if (tb[IFLA_VF_MAC]) { + struct ifla_vf_mac *ivm = nla_data(tb[IFLA_VF_MAC]); + ++ if (ivm->vf >= INT_MAX) ++ return -EINVAL; + err = -EOPNOTSUPP; + if (ops->ndo_set_vf_mac) + err = ops->ndo_set_vf_mac(dev, ivm->vf, +@@ -2137,6 +2139,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) + if (tb[IFLA_VF_VLAN]) { + struct ifla_vf_vlan *ivv = nla_data(tb[IFLA_VF_VLAN]); + ++ if (ivv->vf >= INT_MAX) ++ return -EINVAL; + err = -EOPNOTSUPP; + if (ops->ndo_set_vf_vlan) + err = ops->ndo_set_vf_vlan(dev, ivv->vf, ivv->vlan, +@@ -2169,6 +2173,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) + if (len == 0) + return -EINVAL; + ++ if (ivvl[0]->vf >= INT_MAX) ++ return -EINVAL; + err = ops->ndo_set_vf_vlan(dev, ivvl[0]->vf, ivvl[0]->vlan, + ivvl[0]->qos, ivvl[0]->vlan_proto); + if (err < 0) +@@ -2179,6 +2185,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) + struct ifla_vf_tx_rate *ivt = nla_data(tb[IFLA_VF_TX_RATE]); + struct ifla_vf_info ivf; + ++ if (ivt->vf >= INT_MAX) ++ return -EINVAL; + err = -EOPNOTSUPP; + if (ops->ndo_get_vf_config) + err = ops->ndo_get_vf_config(dev, ivt->vf, &ivf); +@@ -2197,6 +2205,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) + if (tb[IFLA_VF_RATE]) { + struct ifla_vf_rate *ivt = nla_data(tb[IFLA_VF_RATE]); + ++ if (ivt->vf >= INT_MAX) ++ return -EINVAL; + err = -EOPNOTSUPP; + if (ops->ndo_set_vf_rate) + err = ops->ndo_set_vf_rate(dev, ivt->vf, +@@ -2209,6 +2219,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) + if (tb[IFLA_VF_SPOOFCHK]) { + struct ifla_vf_spoofchk *ivs = nla_data(tb[IFLA_VF_SPOOFCHK]); + ++ if (ivs->vf >= INT_MAX) ++ return -EINVAL; + err = -EOPNOTSUPP; + if (ops->ndo_set_vf_spoofchk) + err = ops->ndo_set_vf_spoofchk(dev, ivs->vf, +@@ -2220,6 +2232,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) + if (tb[IFLA_VF_LINK_STATE]) { + struct ifla_vf_link_state *ivl = nla_data(tb[IFLA_VF_LINK_STATE]); + ++ if (ivl->vf >= INT_MAX) ++ return -EINVAL; + err = -EOPNOTSUPP; + if (ops->ndo_set_vf_link_state) + err = ops->ndo_set_vf_link_state(dev, ivl->vf, +@@ -2233,6 +2247,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) + + err = -EOPNOTSUPP; + ivrssq_en = nla_data(tb[IFLA_VF_RSS_QUERY_EN]); ++ if (ivrssq_en->vf >= INT_MAX) ++ return -EINVAL; + if (ops->ndo_set_vf_rss_query_en) + err = ops->ndo_set_vf_rss_query_en(dev, ivrssq_en->vf, + ivrssq_en->setting); +@@ -2243,6 +2259,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) + if (tb[IFLA_VF_TRUST]) { + struct ifla_vf_trust *ivt = nla_data(tb[IFLA_VF_TRUST]); + ++ if (ivt->vf >= INT_MAX) ++ return -EINVAL; + err = -EOPNOTSUPP; + if (ops->ndo_set_vf_trust) + err = ops->ndo_set_vf_trust(dev, ivt->vf, ivt->setting); +@@ -2253,15 +2271,18 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) + if (tb[IFLA_VF_IB_NODE_GUID]) { + struct ifla_vf_guid *ivt = nla_data(tb[IFLA_VF_IB_NODE_GUID]); + ++ if (ivt->vf >= INT_MAX) ++ return -EINVAL; + if (!ops->ndo_set_vf_guid) + return -EOPNOTSUPP; +- + return handle_vf_guid(dev, ivt, IFLA_VF_IB_NODE_GUID); + } + + if (tb[IFLA_VF_IB_PORT_GUID]) { + struct ifla_vf_guid *ivt = nla_data(tb[IFLA_VF_IB_PORT_GUID]); + ++ if (ivt->vf >= INT_MAX) ++ return -EINVAL; + if (!ops->ndo_set_vf_guid) + return -EOPNOTSUPP; + +diff --git a/net/core/sock.c b/net/core/sock.c +index 6c1107821776..ba4f843cdd1d 100644 +--- a/net/core/sock.c ++++ b/net/core/sock.c +@@ -3347,6 +3347,7 @@ int sock_load_diag_module(int family, int protocol) + + #ifdef CONFIG_INET + if (family == AF_INET && ++ protocol != IPPROTO_RAW && + !rcu_access_pointer(inet_protos[protocol])) + return -ENOENT; + #endif +diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c +index b2240b7f225d..523d26f5e22e 100644 +--- a/net/ipv4/igmp.c ++++ b/net/ipv4/igmp.c +@@ -111,13 +111,10 @@ + #ifdef CONFIG_IP_MULTICAST + /* Parameter names and values are taken from igmp-v2-06 draft */ + +-#define IGMP_V1_ROUTER_PRESENT_TIMEOUT (400*HZ) +-#define IGMP_V2_ROUTER_PRESENT_TIMEOUT (400*HZ) + #define IGMP_V2_UNSOLICITED_REPORT_INTERVAL (10*HZ) + #define IGMP_V3_UNSOLICITED_REPORT_INTERVAL (1*HZ) ++#define IGMP_QUERY_INTERVAL (125*HZ) + #define IGMP_QUERY_RESPONSE_INTERVAL (10*HZ) +-#define IGMP_QUERY_ROBUSTNESS_VARIABLE 2 +- + + #define IGMP_INITIAL_REPORT_DELAY (1) + +@@ -953,13 +950,15 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb, + + max_delay = IGMP_QUERY_RESPONSE_INTERVAL; + in_dev->mr_v1_seen = jiffies + +- IGMP_V1_ROUTER_PRESENT_TIMEOUT; ++ (in_dev->mr_qrv * in_dev->mr_qi) + ++ in_dev->mr_qri; + group = 0; + } else { + /* v2 router present */ + max_delay = ih->code*(HZ/IGMP_TIMER_SCALE); + in_dev->mr_v2_seen = jiffies + +- IGMP_V2_ROUTER_PRESENT_TIMEOUT; ++ (in_dev->mr_qrv * in_dev->mr_qi) + ++ in_dev->mr_qri; + } + /* cancel the interface change timer */ + in_dev->mr_ifc_count = 0; +@@ -999,8 +998,21 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb, + if (!max_delay) + max_delay = 1; /* can't mod w/ 0 */ + in_dev->mr_maxdelay = max_delay; +- if (ih3->qrv) +- in_dev->mr_qrv = ih3->qrv; ++ ++ /* RFC3376, 4.1.6. QRV and 4.1.7. QQIC, when the most recently ++ * received value was zero, use the default or statically ++ * configured value. ++ */ ++ in_dev->mr_qrv = ih3->qrv ?: net->ipv4.sysctl_igmp_qrv; ++ in_dev->mr_qi = IGMPV3_QQIC(ih3->qqic)*HZ ?: IGMP_QUERY_INTERVAL; ++ ++ /* RFC3376, 8.3. Query Response Interval: ++ * The number of seconds represented by the [Query Response ++ * Interval] must be less than the [Query Interval]. ++ */ ++ if (in_dev->mr_qri >= in_dev->mr_qi) ++ in_dev->mr_qri = (in_dev->mr_qi/HZ - 1)*HZ; ++ + if (!group) { /* general query */ + if (ih3->nsrcs) + return true; /* no sources allowed */ +@@ -1738,18 +1750,30 @@ void ip_mc_down(struct in_device *in_dev) + ip_mc_dec_group(in_dev, IGMP_ALL_HOSTS); + } + +-void ip_mc_init_dev(struct in_device *in_dev) +-{ + #ifdef CONFIG_IP_MULTICAST ++static void ip_mc_reset(struct in_device *in_dev) ++{ + struct net *net = dev_net(in_dev->dev); ++ ++ in_dev->mr_qi = IGMP_QUERY_INTERVAL; ++ in_dev->mr_qri = IGMP_QUERY_RESPONSE_INTERVAL; ++ in_dev->mr_qrv = net->ipv4.sysctl_igmp_qrv; ++} ++#else ++static void ip_mc_reset(struct in_device *in_dev) ++{ ++} + #endif ++ ++void ip_mc_init_dev(struct in_device *in_dev) ++{ + ASSERT_RTNL(); + + #ifdef CONFIG_IP_MULTICAST + timer_setup(&in_dev->mr_gq_timer, igmp_gq_timer_expire, 0); + timer_setup(&in_dev->mr_ifc_timer, igmp_ifc_timer_expire, 0); +- in_dev->mr_qrv = net->ipv4.sysctl_igmp_qrv; + #endif ++ ip_mc_reset(in_dev); + + spin_lock_init(&in_dev->mc_tomb_lock); + } +@@ -1759,15 +1783,10 @@ void ip_mc_init_dev(struct in_device *in_dev) + void ip_mc_up(struct in_device *in_dev) + { + struct ip_mc_list *pmc; +-#ifdef CONFIG_IP_MULTICAST +- struct net *net = dev_net(in_dev->dev); +-#endif + + ASSERT_RTNL(); + +-#ifdef CONFIG_IP_MULTICAST +- in_dev->mr_qrv = net->ipv4.sysctl_igmp_qrv; +-#endif ++ ip_mc_reset(in_dev); + ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS); + + for_each_pmc_rtnl(in_dev, pmc) { +diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c +index b7a26120d552..82f341e84fae 100644 +--- a/net/ipv4/ip_sockglue.c ++++ b/net/ipv4/ip_sockglue.c +@@ -1244,7 +1244,7 @@ int ip_setsockopt(struct sock *sk, int level, + return -ENOPROTOOPT; + + err = do_ip_setsockopt(sk, level, optname, optval, optlen); +-#ifdef CONFIG_BPFILTER ++#if IS_ENABLED(CONFIG_BPFILTER_UMH) + if (optname >= BPFILTER_IPT_SO_SET_REPLACE && + optname < BPFILTER_IPT_SET_MAX) + err = bpfilter_ip_set_sockopt(sk, optname, optval, optlen); +@@ -1557,7 +1557,7 @@ int ip_getsockopt(struct sock *sk, int level, + int err; + + err = do_ip_getsockopt(sk, level, optname, optval, optlen, 0); +-#ifdef CONFIG_BPFILTER ++#if IS_ENABLED(CONFIG_BPFILTER_UMH) + if (optname >= BPFILTER_IPT_SO_GET_INFO && + optname < BPFILTER_IPT_GET_MAX) + err = bpfilter_ip_get_sockopt(sk, optname, optval, optlen); +@@ -1594,7 +1594,7 @@ int compat_ip_getsockopt(struct sock *sk, int level, int optname, + err = do_ip_getsockopt(sk, level, optname, optval, optlen, + MSG_CMSG_COMPAT); + +-#ifdef CONFIG_BPFILTER ++#if IS_ENABLED(CONFIG_BPFILTER_UMH) + if (optname >= BPFILTER_IPT_SO_GET_INFO && + optname < BPFILTER_IPT_GET_MAX) + err = bpfilter_ip_get_sockopt(sk, optname, optval, optlen); +diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c +index e7cdfa92c382..9a117a79af65 100644 +--- a/net/ipv6/tcp_ipv6.c ++++ b/net/ipv6/tcp_ipv6.c +@@ -734,6 +734,7 @@ static void tcp_v6_init_req(struct request_sock *req, + const struct sock *sk_listener, + struct sk_buff *skb) + { ++ bool l3_slave = ipv6_l3mdev_skb(TCP_SKB_CB(skb)->header.h6.flags); + struct inet_request_sock *ireq = inet_rsk(req); + const struct ipv6_pinfo *np = inet6_sk(sk_listener); + +@@ -741,7 +742,7 @@ static void tcp_v6_init_req(struct request_sock *req, + ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr; + + /* So that link locals have meaning */ +- if (!sk_listener->sk_bound_dev_if && ++ if ((!sk_listener->sk_bound_dev_if || l3_slave) && + ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL) + ireq->ir_iif = tcp_v6_iif(skb); + +diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c +index 35ae64cbef33..46aa1aa51db4 100644 +--- a/net/openvswitch/conntrack.c ++++ b/net/openvswitch/conntrack.c +@@ -1199,7 +1199,8 @@ static int ovs_ct_commit(struct net *net, struct sw_flow_key *key, + &info->labels.mask); + if (err) + return err; +- } else if (labels_nonzero(&info->labels.mask)) { ++ } else if (IS_ENABLED(CONFIG_NF_CONNTRACK_LABELS) && ++ labels_nonzero(&info->labels.mask)) { + err = ovs_ct_set_labels(ct, key, &info->labels.value, + &info->labels.mask); + if (err) +diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c +index 33c0cc5ef229..ce14fafb36a1 100644 +--- a/net/sched/act_pedit.c ++++ b/net/sched/act_pedit.c +@@ -46,7 +46,7 @@ static struct tcf_pedit_key_ex *tcf_pedit_keys_ex_parse(struct nlattr *nla, + int err = -EINVAL; + int rem; + +- if (!nla || !n) ++ if (!nla) + return NULL; + + keys_ex = kcalloc(n, sizeof(*k), GFP_KERNEL); +@@ -169,6 +169,10 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla, + } + + parm = nla_data(pattr); ++ if (!parm->nkeys) { ++ NL_SET_ERR_MSG_MOD(extack, "Pedit requires keys to be passed"); ++ return -EINVAL; ++ } + ksize = parm->nkeys * sizeof(struct tc_pedit_key); + if (nla_len(pattr) < sizeof(*parm) + ksize) { + NL_SET_ERR_MSG_ATTR(extack, pattr, "Length of TCA_PEDIT_PARMS or TCA_PEDIT_PARMS_EX pedit attribute is invalid"); +@@ -182,12 +186,6 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla, + index = parm->index; + err = tcf_idr_check_alloc(tn, &index, a, bind); + if (!err) { +- if (!parm->nkeys) { +- tcf_idr_cleanup(tn, index); +- NL_SET_ERR_MSG_MOD(extack, "Pedit requires keys to be passed"); +- ret = -EINVAL; +- goto out_free; +- } + ret = tcf_idr_create(tn, index, est, a, + &act_pedit_ops, bind, false); + if (ret) { +diff --git a/net/sched/act_tunnel_key.c b/net/sched/act_tunnel_key.c +index 43309ff2b5dc..e4fc6b2bc29d 100644 +--- a/net/sched/act_tunnel_key.c ++++ b/net/sched/act_tunnel_key.c +@@ -137,6 +137,10 @@ static int tunnel_key_copy_opts(const struct nlattr *nla, u8 *dst, + if (opt_len < 0) + return opt_len; + opts_len += opt_len; ++ if (opts_len > IP_TUNNEL_OPTS_MAX) { ++ NL_SET_ERR_MSG(extack, "Tunnel options exceeds max size"); ++ return -EINVAL; ++ } + if (dst) { + dst_len -= opt_len; + dst += opt_len; +diff --git a/net/sctp/socket.c b/net/sctp/socket.c +index c76631552722..e7a11cd7633f 100644 +--- a/net/sctp/socket.c ++++ b/net/sctp/socket.c +@@ -83,7 +83,7 @@ + #include <net/sctp/stream_sched.h> + + /* Forward declarations for internal helper functions. */ +-static int sctp_writeable(struct sock *sk); ++static bool sctp_writeable(struct sock *sk); + static void sctp_wfree(struct sk_buff *skb); + static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p, + size_t msg_len); +@@ -119,25 +119,10 @@ static void sctp_enter_memory_pressure(struct sock *sk) + /* Get the sndbuf space available at the time on the association. */ + static inline int sctp_wspace(struct sctp_association *asoc) + { +- int amt; ++ struct sock *sk = asoc->base.sk; + +- if (asoc->ep->sndbuf_policy) +- amt = asoc->sndbuf_used; +- else +- amt = sk_wmem_alloc_get(asoc->base.sk); +- +- if (amt >= asoc->base.sk->sk_sndbuf) { +- if (asoc->base.sk->sk_userlocks & SOCK_SNDBUF_LOCK) +- amt = 0; +- else { +- amt = sk_stream_wspace(asoc->base.sk); +- if (amt < 0) +- amt = 0; +- } +- } else { +- amt = asoc->base.sk->sk_sndbuf - amt; +- } +- return amt; ++ return asoc->ep->sndbuf_policy ? sk->sk_sndbuf - asoc->sndbuf_used ++ : sk_stream_wspace(sk); + } + + /* Increment the used sndbuf space count of the corresponding association by +@@ -1928,10 +1913,10 @@ static int sctp_sendmsg_to_asoc(struct sctp_association *asoc, + asoc->pmtu_pending = 0; + } + +- if (sctp_wspace(asoc) < msg_len) ++ if (sctp_wspace(asoc) < (int)msg_len) + sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc)); + +- if (!sctp_wspace(asoc)) { ++ if (sctp_wspace(asoc) <= 0) { + timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); + err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len); + if (err) +@@ -8516,7 +8501,7 @@ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p, + goto do_error; + if (signal_pending(current)) + goto do_interrupted; +- if (msg_len <= sctp_wspace(asoc)) ++ if ((int)msg_len <= sctp_wspace(asoc)) + break; + + /* Let another process have a go. Since we are going +@@ -8591,14 +8576,9 @@ void sctp_write_space(struct sock *sk) + * UDP-style sockets or TCP-style sockets, this code should work. + * - Daisy + */ +-static int sctp_writeable(struct sock *sk) ++static bool sctp_writeable(struct sock *sk) + { +- int amt = 0; +- +- amt = sk->sk_sndbuf - sk_wmem_alloc_get(sk); +- if (amt < 0) +- amt = 0; +- return amt; ++ return sk->sk_sndbuf > sk->sk_wmem_queued; + } + + /* Wait for an association to go into ESTABLISHED state. If timeout is 0, +diff --git a/net/sunrpc/auth_gss/gss_krb5_seal.c b/net/sunrpc/auth_gss/gss_krb5_seal.c +index eaad9bc7a0bd..e1f0571843c8 100644 +--- a/net/sunrpc/auth_gss/gss_krb5_seal.c ++++ b/net/sunrpc/auth_gss/gss_krb5_seal.c +@@ -63,6 +63,7 @@ + #include <linux/sunrpc/gss_krb5.h> + #include <linux/random.h> + #include <linux/crypto.h> ++#include <linux/atomic.h> + + #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) + # define RPCDBG_FACILITY RPCDBG_AUTH +diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c +index c0d7875a64ff..9dc059dea689 100644 +--- a/net/sunrpc/xprtsock.c ++++ b/net/sunrpc/xprtsock.c +@@ -129,7 +129,7 @@ static struct ctl_table xs_tunables_table[] = { + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &xprt_min_resvport_limit, +- .extra2 = &xprt_max_resvport ++ .extra2 = &xprt_max_resvport_limit + }, + { + .procname = "max_resvport", +@@ -137,7 +137,7 @@ static struct ctl_table xs_tunables_table[] = { + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, +- .extra1 = &xprt_min_resvport, ++ .extra1 = &xprt_min_resvport_limit, + .extra2 = &xprt_max_resvport_limit + }, + { +@@ -1776,11 +1776,17 @@ static void xs_udp_timer(struct rpc_xprt *xprt, struct rpc_task *task) + spin_unlock_bh(&xprt->transport_lock); + } + +-static unsigned short xs_get_random_port(void) ++static int xs_get_random_port(void) + { +- unsigned short range = xprt_max_resvport - xprt_min_resvport + 1; +- unsigned short rand = (unsigned short) prandom_u32() % range; +- return rand + xprt_min_resvport; ++ unsigned short min = xprt_min_resvport, max = xprt_max_resvport; ++ unsigned short range; ++ unsigned short rand; ++ ++ if (max < min) ++ return -EADDRINUSE; ++ range = max - min + 1; ++ rand = (unsigned short) prandom_u32() % range; ++ return rand + min; + } + + /** +@@ -1836,9 +1842,9 @@ static void xs_set_srcport(struct sock_xprt *transport, struct socket *sock) + transport->srcport = xs_sock_getport(sock); + } + +-static unsigned short xs_get_srcport(struct sock_xprt *transport) ++static int xs_get_srcport(struct sock_xprt *transport) + { +- unsigned short port = transport->srcport; ++ int port = transport->srcport; + + if (port == 0 && transport->xprt.resvport) + port = xs_get_random_port(); +@@ -1859,7 +1865,7 @@ static int xs_bind(struct sock_xprt *transport, struct socket *sock) + { + struct sockaddr_storage myaddr; + int err, nloop = 0; +- unsigned short port = xs_get_srcport(transport); ++ int port = xs_get_srcport(transport); + unsigned short last; + + /* +@@ -1877,8 +1883,8 @@ static int xs_bind(struct sock_xprt *transport, struct socket *sock) + * transport->xprt.resvport == 1) xs_get_srcport above will + * ensure that port is non-zero and we will bind as needed. + */ +- if (port == 0) +- return 0; ++ if (port <= 0) ++ return port; + + memcpy(&myaddr, &transport->srcaddr, transport->xprt.addrlen); + do { +@@ -3319,12 +3325,8 @@ static int param_set_uint_minmax(const char *val, + + static int param_set_portnr(const char *val, const struct kernel_param *kp) + { +- if (kp->arg == &xprt_min_resvport) +- return param_set_uint_minmax(val, kp, +- RPC_MIN_RESVPORT, +- xprt_max_resvport); + return param_set_uint_minmax(val, kp, +- xprt_min_resvport, ++ RPC_MIN_RESVPORT, + RPC_MAX_RESVPORT); + } + +diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c +index 231b6c032d2c..d2d6ff0c6265 100644 +--- a/net/unix/af_unix.c ++++ b/net/unix/af_unix.c +@@ -225,6 +225,8 @@ static inline void unix_release_addr(struct unix_address *addr) + + static int unix_mkname(struct sockaddr_un *sunaddr, int len, unsigned int *hashp) + { ++ *hashp = 0; ++ + if (len <= sizeof(short) || len > sizeof(*sunaddr)) + return -EINVAL; + if (!sunaddr || sunaddr->sun_family != AF_UNIX) +diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c +index 2a8651aa90c8..52242a148c70 100644 +--- a/net/vmw_vsock/virtio_transport_common.c ++++ b/net/vmw_vsock/virtio_transport_common.c +@@ -92,8 +92,17 @@ static struct sk_buff *virtio_transport_build_skb(void *opaque) + struct virtio_vsock_pkt *pkt = opaque; + struct af_vsockmon_hdr *hdr; + struct sk_buff *skb; ++ size_t payload_len; ++ void *payload_buf; + +- skb = alloc_skb(sizeof(*hdr) + sizeof(pkt->hdr) + pkt->len, ++ /* A packet could be split to fit the RX buffer, so we can retrieve ++ * the payload length from the header and the buffer pointer taking ++ * care of the offset in the original packet. ++ */ ++ payload_len = le32_to_cpu(pkt->hdr.len); ++ payload_buf = pkt->buf + pkt->off; ++ ++ skb = alloc_skb(sizeof(*hdr) + sizeof(pkt->hdr) + payload_len, + GFP_ATOMIC); + if (!skb) + return NULL; +@@ -133,8 +142,8 @@ static struct sk_buff *virtio_transport_build_skb(void *opaque) + + skb_put_data(skb, &pkt->hdr, sizeof(pkt->hdr)); + +- if (pkt->len) { +- skb_put_data(skb, pkt->buf, pkt->len); ++ if (payload_len) { ++ skb_put_data(skb, payload_buf, payload_len); + } + + return skb; +diff --git a/net/wireless/ap.c b/net/wireless/ap.c +index 882d97bdc6bf..550ac9d827fe 100644 +--- a/net/wireless/ap.c ++++ b/net/wireless/ap.c +@@ -41,6 +41,8 @@ int __cfg80211_stop_ap(struct cfg80211_registered_device *rdev, + cfg80211_sched_dfs_chan_update(rdev); + } + ++ schedule_work(&cfg80211_disconnect_work); ++ + return err; + } + +diff --git a/net/wireless/core.h b/net/wireless/core.h +index 7f52ef569320..f5d58652108d 100644 +--- a/net/wireless/core.h ++++ b/net/wireless/core.h +@@ -430,6 +430,8 @@ void cfg80211_process_wdev_events(struct wireless_dev *wdev); + bool cfg80211_does_bw_fit_range(const struct ieee80211_freq_range *freq_range, + u32 center_freq_khz, u32 bw_khz); + ++extern struct work_struct cfg80211_disconnect_work; ++ + /** + * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable + * @wiphy: the wiphy to validate against +diff --git a/net/wireless/sme.c b/net/wireless/sme.c +index d536b07582f8..07c2196e9d57 100644 +--- a/net/wireless/sme.c ++++ b/net/wireless/sme.c +@@ -642,11 +642,15 @@ static bool cfg80211_is_all_idle(void) + * All devices must be idle as otherwise if you are actively + * scanning some new beacon hints could be learned and would + * count as new regulatory hints. ++ * Also if there is any other active beaconing interface we ++ * need not issue a disconnect hint and reset any info such ++ * as chan dfs state, etc. + */ + list_for_each_entry(rdev, &cfg80211_rdev_list, list) { + list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { + wdev_lock(wdev); +- if (wdev->conn || wdev->current_bss) ++ if (wdev->conn || wdev->current_bss || ++ cfg80211_beaconing_iface_active(wdev)) + is_all_idle = false; + wdev_unlock(wdev); + } +@@ -663,7 +667,7 @@ static void disconnect_work(struct work_struct *work) + rtnl_unlock(); + } + +-static DECLARE_WORK(cfg80211_disconnect_work, disconnect_work); ++DECLARE_WORK(cfg80211_disconnect_work, disconnect_work); + + + /* +diff --git a/sound/firewire/isight.c b/sound/firewire/isight.c +index 30957477e005..0717ab9e48e3 100644 +--- a/sound/firewire/isight.c ++++ b/sound/firewire/isight.c +@@ -640,7 +640,7 @@ static int isight_probe(struct fw_unit *unit, + if (!isight->audio_base) { + dev_err(&unit->device, "audio unit base not found\n"); + err = -ENXIO; +- goto err_unit; ++ goto error; + } + fw_iso_resources_init(&isight->resources, unit); + +@@ -669,12 +669,12 @@ static int isight_probe(struct fw_unit *unit, + dev_set_drvdata(&unit->device, isight); + + return 0; +- +-err_unit: +- fw_unit_put(isight->unit); +- mutex_destroy(&isight->mutex); + error: + snd_card_free(card); ++ ++ mutex_destroy(&isight->mutex); ++ fw_unit_put(isight->unit); ++ + return err; + } + +diff --git a/sound/i2c/cs8427.c b/sound/i2c/cs8427.c +index 2647309bc675..8afa2f888466 100644 +--- a/sound/i2c/cs8427.c ++++ b/sound/i2c/cs8427.c +@@ -118,7 +118,7 @@ static int snd_cs8427_send_corudata(struct snd_i2c_device *device, + struct cs8427 *chip = device->private_data; + char *hw_data = udata ? + chip->playback.hw_udata : chip->playback.hw_status; +- char data[32]; ++ unsigned char data[32]; + int err, idx; + + if (!memcmp(hw_data, ndata, count)) +diff --git a/sound/soc/tegra/tegra_sgtl5000.c b/sound/soc/tegra/tegra_sgtl5000.c +index 45a4aa9d2a47..901457da25ec 100644 +--- a/sound/soc/tegra/tegra_sgtl5000.c ++++ b/sound/soc/tegra/tegra_sgtl5000.c +@@ -149,14 +149,14 @@ static int tegra_sgtl5000_driver_probe(struct platform_device *pdev) + dev_err(&pdev->dev, + "Property 'nvidia,i2s-controller' missing/invalid\n"); + ret = -EINVAL; +- goto err; ++ goto err_put_codec_of_node; + } + + tegra_sgtl5000_dai.platform_of_node = tegra_sgtl5000_dai.cpu_of_node; + + ret = tegra_asoc_utils_init(&machine->util_data, &pdev->dev); + if (ret) +- goto err; ++ goto err_put_cpu_of_node; + + ret = snd_soc_register_card(card); + if (ret) { +@@ -169,6 +169,13 @@ static int tegra_sgtl5000_driver_probe(struct platform_device *pdev) + + err_fini_utils: + tegra_asoc_utils_fini(&machine->util_data); ++err_put_cpu_of_node: ++ of_node_put(tegra_sgtl5000_dai.cpu_of_node); ++ tegra_sgtl5000_dai.cpu_of_node = NULL; ++ tegra_sgtl5000_dai.platform_of_node = NULL; ++err_put_codec_of_node: ++ of_node_put(tegra_sgtl5000_dai.codec_of_node); ++ tegra_sgtl5000_dai.codec_of_node = NULL; + err: + return ret; + } +@@ -183,6 +190,12 @@ static int tegra_sgtl5000_driver_remove(struct platform_device *pdev) + + tegra_asoc_utils_fini(&machine->util_data); + ++ of_node_put(tegra_sgtl5000_dai.cpu_of_node); ++ tegra_sgtl5000_dai.cpu_of_node = NULL; ++ tegra_sgtl5000_dai.platform_of_node = NULL; ++ of_node_put(tegra_sgtl5000_dai.codec_of_node); ++ tegra_sgtl5000_dai.codec_of_node = NULL; ++ + return ret; + } + +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index 726cbd63a0c7..d7778f2bcbf8 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -2949,6 +2949,9 @@ static int snd_usb_mixer_controls_badd(struct usb_mixer_interface *mixer, + continue; + + iface = usb_ifnum_to_if(dev, intf); ++ if (!iface) ++ continue; ++ + num = iface->num_altsetting; + + if (num < 2) +diff --git a/tools/bpf/bpftool/bash-completion/bpftool b/tools/bpf/bpftool/bash-completion/bpftool +index 598066c40191..c2b6b2176f3b 100644 +--- a/tools/bpf/bpftool/bash-completion/bpftool ++++ b/tools/bpf/bpftool/bash-completion/bpftool +@@ -143,7 +143,7 @@ _bpftool_map_update_map_type() + local type + type=$(bpftool -jp map show $keyword $ref | \ + command sed -n 's/.*"type": "\(.*\)",$/\1/p') +- printf $type ++ [[ -n $type ]] && printf $type + } + + _bpftool_map_update_get_id() +diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c +index be7aebff0c1e..158469f57461 100644 +--- a/tools/bpf/bpftool/common.c ++++ b/tools/bpf/bpftool/common.c +@@ -130,16 +130,17 @@ static int mnt_bpffs(const char *target, char *buff, size_t bufflen) + return 0; + } + +-int open_obj_pinned(char *path) ++int open_obj_pinned(char *path, bool quiet) + { + int fd; + + fd = bpf_obj_get(path); + if (fd < 0) { +- p_err("bpf obj get (%s): %s", path, +- errno == EACCES && !is_bpffs(dirname(path)) ? +- "directory not in bpf file system (bpffs)" : +- strerror(errno)); ++ if (!quiet) ++ p_err("bpf obj get (%s): %s", path, ++ errno == EACCES && !is_bpffs(dirname(path)) ? ++ "directory not in bpf file system (bpffs)" : ++ strerror(errno)); + return -1; + } + +@@ -151,7 +152,7 @@ int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type) + enum bpf_obj_type type; + int fd; + +- fd = open_obj_pinned(path); ++ fd = open_obj_pinned(path, false); + if (fd < 0) + return -1; + +@@ -384,7 +385,7 @@ int build_pinned_obj_table(struct pinned_obj_table *tab, + while ((ftse = fts_read(fts))) { + if (!(ftse->fts_info & FTS_F)) + continue; +- fd = open_obj_pinned(ftse->fts_path); ++ fd = open_obj_pinned(ftse->fts_path, true); + if (fd < 0) + continue; + +diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h +index 238e734d75b3..057a227bdb9f 100644 +--- a/tools/bpf/bpftool/main.h ++++ b/tools/bpf/bpftool/main.h +@@ -126,7 +126,7 @@ int cmd_select(const struct cmd *cmds, int argc, char **argv, + int get_fd_type(int fd); + const char *get_fd_type_name(enum bpf_obj_type type); + char *get_fdinfo(int fd, const char *key); +-int open_obj_pinned(char *path); ++int open_obj_pinned(char *path, bool quiet); + int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type); + int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32)); + int do_pin_fd(int fd, const char *name); +diff --git a/tools/gpio/Build b/tools/gpio/Build +index 620c1937d957..4141f35837db 100644 +--- a/tools/gpio/Build ++++ b/tools/gpio/Build +@@ -1,3 +1,4 @@ ++gpio-utils-y += gpio-utils.o + lsgpio-y += lsgpio.o gpio-utils.o + gpio-hammer-y += gpio-hammer.o gpio-utils.o + gpio-event-mon-y += gpio-event-mon.o gpio-utils.o +diff --git a/tools/gpio/Makefile b/tools/gpio/Makefile +index f8bc8656a544..6a73c06e069c 100644 +--- a/tools/gpio/Makefile ++++ b/tools/gpio/Makefile +@@ -35,11 +35,15 @@ $(OUTPUT)include/linux/gpio.h: ../../include/uapi/linux/gpio.h + + prepare: $(OUTPUT)include/linux/gpio.h + ++GPIO_UTILS_IN := $(output)gpio-utils-in.o ++$(GPIO_UTILS_IN): prepare FORCE ++ $(Q)$(MAKE) $(build)=gpio-utils ++ + # + # lsgpio + # + LSGPIO_IN := $(OUTPUT)lsgpio-in.o +-$(LSGPIO_IN): prepare FORCE ++$(LSGPIO_IN): prepare FORCE $(OUTPUT)gpio-utils-in.o + $(Q)$(MAKE) $(build)=lsgpio + $(OUTPUT)lsgpio: $(LSGPIO_IN) + $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ +@@ -48,7 +52,7 @@ $(OUTPUT)lsgpio: $(LSGPIO_IN) + # gpio-hammer + # + GPIO_HAMMER_IN := $(OUTPUT)gpio-hammer-in.o +-$(GPIO_HAMMER_IN): prepare FORCE ++$(GPIO_HAMMER_IN): prepare FORCE $(OUTPUT)gpio-utils-in.o + $(Q)$(MAKE) $(build)=gpio-hammer + $(OUTPUT)gpio-hammer: $(GPIO_HAMMER_IN) + $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ +@@ -57,7 +61,7 @@ $(OUTPUT)gpio-hammer: $(GPIO_HAMMER_IN) + # gpio-event-mon + # + GPIO_EVENT_MON_IN := $(OUTPUT)gpio-event-mon-in.o +-$(GPIO_EVENT_MON_IN): prepare FORCE ++$(GPIO_EVENT_MON_IN): prepare FORCE $(OUTPUT)gpio-utils-in.o + $(Q)$(MAKE) $(build)=gpio-event-mon + $(OUTPUT)gpio-event-mon: $(GPIO_EVENT_MON_IN) + $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ +diff --git a/tools/objtool/arch/x86/tools/gen-insn-attr-x86.awk b/tools/objtool/arch/x86/tools/gen-insn-attr-x86.awk +index b02a36b2c14f..a42015b305f4 100644 +--- a/tools/objtool/arch/x86/tools/gen-insn-attr-x86.awk ++++ b/tools/objtool/arch/x86/tools/gen-insn-attr-x86.awk +@@ -69,7 +69,7 @@ BEGIN { + + lprefix1_expr = "\\((66|!F3)\\)" + lprefix2_expr = "\\(F3\\)" +- lprefix3_expr = "\\((F2|!F3|66\\&F2)\\)" ++ lprefix3_expr = "\\((F2|!F3|66&F2)\\)" + lprefix_expr = "\\((66|F2|F3)\\)" + max_lprefix = 4 + +@@ -257,7 +257,7 @@ function convert_operands(count,opnd, i,j,imm,mod) + return add_flags(imm, mod) + } + +-/^[0-9a-f]+\:/ { ++/^[0-9a-f]+:/ { + if (NR == 1) + next + # get index +diff --git a/tools/power/acpi/tools/acpidump/apmain.c b/tools/power/acpi/tools/acpidump/apmain.c +index db213171f8d9..2d9b94b631cb 100644 +--- a/tools/power/acpi/tools/acpidump/apmain.c ++++ b/tools/power/acpi/tools/acpidump/apmain.c +@@ -106,7 +106,7 @@ static int ap_insert_action(char *argument, u32 to_be_done) + + current_action++; + if (current_action > AP_MAX_ACTIONS) { +- fprintf(stderr, "Too many table options (max %u)\n", ++ fprintf(stderr, "Too many table options (max %d)\n", + AP_MAX_ACTIONS); + return (-1); + } +diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c +index 823bbc741ad7..02d123871ef9 100644 +--- a/tools/power/x86/turbostat/turbostat.c ++++ b/tools/power/x86/turbostat/turbostat.c +@@ -1,6 +1,6 @@ + /* + * turbostat -- show CPU frequency and C-state residency +- * on modern Intel turbo-capable processors. ++ * on modern Intel and AMD processors. + * + * Copyright (c) 2013 Intel Corporation. + * Len Brown <len.brown@intel.com> +@@ -71,6 +71,8 @@ unsigned int do_irtl_snb; + unsigned int do_irtl_hsw; + unsigned int units = 1000000; /* MHz etc */ + unsigned int genuine_intel; ++unsigned int authentic_amd; ++unsigned int max_level, max_extended_level; + unsigned int has_invariant_tsc; + unsigned int do_nhm_platform_info; + unsigned int no_MSR_MISC_PWR_MGMT; +@@ -1667,30 +1669,51 @@ int get_mp(int cpu, struct msr_counter *mp, unsigned long long *counterp) + + void get_apic_id(struct thread_data *t) + { +- unsigned int eax, ebx, ecx, edx, max_level; ++ unsigned int eax, ebx, ecx, edx; + +- eax = ebx = ecx = edx = 0; ++ if (DO_BIC(BIC_APIC)) { ++ eax = ebx = ecx = edx = 0; ++ __cpuid(1, eax, ebx, ecx, edx); + +- if (!genuine_intel) ++ t->apic_id = (ebx >> 24) & 0xff; ++ } ++ ++ if (!DO_BIC(BIC_X2APIC)) + return; + +- __cpuid(0, max_level, ebx, ecx, edx); ++ if (authentic_amd) { ++ unsigned int topology_extensions; + +- __cpuid(1, eax, ebx, ecx, edx); +- t->apic_id = (ebx >> 24) & 0xf; ++ if (max_extended_level < 0x8000001e) ++ return; + +- if (max_level < 0xb) ++ eax = ebx = ecx = edx = 0; ++ __cpuid(0x80000001, eax, ebx, ecx, edx); ++ topology_extensions = ecx & (1 << 22); ++ ++ if (topology_extensions == 0) ++ return; ++ ++ eax = ebx = ecx = edx = 0; ++ __cpuid(0x8000001e, eax, ebx, ecx, edx); ++ ++ t->x2apic_id = eax; + return; ++ } + +- if (!DO_BIC(BIC_X2APIC)) ++ if (!genuine_intel) ++ return; ++ ++ if (max_level < 0xb) + return; + + ecx = 0; + __cpuid(0xb, eax, ebx, ecx, edx); + t->x2apic_id = edx; + +- if (debug && (t->apic_id != t->x2apic_id)) +- fprintf(outf, "cpu%d: apic 0x%x x2apic 0x%x\n", t->cpu_id, t->apic_id, t->x2apic_id); ++ if (debug && (t->apic_id != (t->x2apic_id & 0xff))) ++ fprintf(outf, "cpu%d: BIOS BUG: apic 0x%x x2apic 0x%x\n", ++ t->cpu_id, t->apic_id, t->x2apic_id); + } + + /* +@@ -4439,16 +4462,18 @@ void decode_c6_demotion_policy_msr(void) + + void process_cpuid() + { +- unsigned int eax, ebx, ecx, edx, max_level, max_extended_level; +- unsigned int fms, family, model, stepping; ++ unsigned int eax, ebx, ecx, edx; ++ unsigned int fms, family, model, stepping, ecx_flags, edx_flags; + unsigned int has_turbo; + + eax = ebx = ecx = edx = 0; + + __cpuid(0, max_level, ebx, ecx, edx); + +- if (ebx == 0x756e6547 && edx == 0x49656e69 && ecx == 0x6c65746e) ++ if (ebx == 0x756e6547 && ecx == 0x6c65746e && edx == 0x49656e69) + genuine_intel = 1; ++ else if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65) ++ authentic_amd = 1; + + if (!quiet) + fprintf(outf, "CPUID(0): %.4s%.4s%.4s ", +@@ -4462,25 +4487,8 @@ void process_cpuid() + family += (fms >> 20) & 0xff; + if (family >= 6) + model += ((fms >> 16) & 0xf) << 4; +- +- if (!quiet) { +- fprintf(outf, "%d CPUID levels; family:model:stepping 0x%x:%x:%x (%d:%d:%d)\n", +- max_level, family, model, stepping, family, model, stepping); +- fprintf(outf, "CPUID(1): %s %s %s %s %s %s %s %s %s %s\n", +- ecx & (1 << 0) ? "SSE3" : "-", +- ecx & (1 << 3) ? "MONITOR" : "-", +- ecx & (1 << 6) ? "SMX" : "-", +- ecx & (1 << 7) ? "EIST" : "-", +- ecx & (1 << 8) ? "TM2" : "-", +- edx & (1 << 4) ? "TSC" : "-", +- edx & (1 << 5) ? "MSR" : "-", +- edx & (1 << 22) ? "ACPI-TM" : "-", +- edx & (1 << 28) ? "HT" : "-", +- edx & (1 << 29) ? "TM" : "-"); +- } +- +- if (!(edx & (1 << 5))) +- errx(1, "CPUID: no MSR"); ++ ecx_flags = ecx; ++ edx_flags = edx; + + /* + * check max extended function levels of CPUID. +@@ -4490,6 +4498,25 @@ void process_cpuid() + ebx = ecx = edx = 0; + __cpuid(0x80000000, max_extended_level, ebx, ecx, edx); + ++ if (!quiet) { ++ fprintf(outf, "0x%x CPUID levels; 0x%x xlevels; family:model:stepping 0x%x:%x:%x (%d:%d:%d)\n", ++ max_level, max_extended_level, family, model, stepping, family, model, stepping); ++ fprintf(outf, "CPUID(1): %s %s %s %s %s %s %s %s %s %s\n", ++ ecx_flags & (1 << 0) ? "SSE3" : "-", ++ ecx_flags & (1 << 3) ? "MONITOR" : "-", ++ ecx_flags & (1 << 6) ? "SMX" : "-", ++ ecx_flags & (1 << 7) ? "EIST" : "-", ++ ecx_flags & (1 << 8) ? "TM2" : "-", ++ edx_flags & (1 << 4) ? "TSC" : "-", ++ edx_flags & (1 << 5) ? "MSR" : "-", ++ edx_flags & (1 << 22) ? "ACPI-TM" : "-", ++ edx_flags & (1 << 28) ? "HT" : "-", ++ edx_flags & (1 << 29) ? "TM" : "-"); ++ } ++ ++ if (!(edx_flags & (1 << 5))) ++ errx(1, "CPUID: no MSR"); ++ + if (max_extended_level >= 0x80000007) { + + /* +diff --git a/tools/testing/selftests/bpf/test_libbpf.sh b/tools/testing/selftests/bpf/test_libbpf.sh +index 8b1bc96d8e0c..2989b2e2d856 100755 +--- a/tools/testing/selftests/bpf/test_libbpf.sh ++++ b/tools/testing/selftests/bpf/test_libbpf.sh +@@ -6,7 +6,7 @@ export TESTNAME=test_libbpf + # Determine selftest success via shell exit code + exit_handler() + { +- if (( $? == 0 )); then ++ if [ $? -eq 0 ]; then + echo "selftests: $TESTNAME [PASS]"; + else + echo "$TESTNAME: failed at file $LAST_LOADED" 1>&2 +diff --git a/tools/testing/selftests/bpf/trace_helpers.c b/tools/testing/selftests/bpf/trace_helpers.c +index cf156b353679..82922f13dcd3 100644 +--- a/tools/testing/selftests/bpf/trace_helpers.c ++++ b/tools/testing/selftests/bpf/trace_helpers.c +@@ -41,6 +41,7 @@ int load_kallsyms(void) + syms[i].name = strdup(func); + i++; + } ++ fclose(f); + sym_cnt = i; + qsort(syms, sym_cnt, sizeof(struct ksym), ksym_cmp); + return 0; +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 +index d026ff4e562f..92ffb3bd33d8 100644 +--- a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_syntax.tc ++++ b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_syntax.tc +@@ -78,8 +78,11 @@ test_badarg "\$stackp" "\$stack0+10" "\$stack1-10" + echo "r ${PROBEFUNC} \$retval" > kprobe_events + ! echo "p ${PROBEFUNC} \$retval" > kprobe_events + ++# $comm was introduced in 4.8, older kernels reject it. ++if grep -A1 "fetcharg:" README | grep -q '\$comm' ; then + : "Comm access" + test_goodarg "\$comm" ++fi + + : "Indirect memory access" + test_goodarg "+0(${GOODREG})" "-0(${GOODREG})" "+10(\$stack)" \ +diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c +index 0c2cdc105f96..a9c4b5e21d7e 100644 +--- a/tools/testing/selftests/kvm/dirty_log_test.c ++++ b/tools/testing/selftests/kvm/dirty_log_test.c +@@ -31,9 +31,9 @@ + /* How many pages to dirty for each guest loop */ + #define TEST_PAGES_PER_LOOP 1024 + /* How many host loops to run (one KVM_GET_DIRTY_LOG for each loop) */ +-#define TEST_HOST_LOOP_N 32 ++#define TEST_HOST_LOOP_N 32UL + /* Interval for each host loop (ms) */ +-#define TEST_HOST_LOOP_INTERVAL 10 ++#define TEST_HOST_LOOP_INTERVAL 10UL + + /* + * Guest variables. We use these variables to share data between host +diff --git a/tools/testing/selftests/powerpc/cache_shape/Makefile b/tools/testing/selftests/powerpc/cache_shape/Makefile +index ede4d3dae750..689f6c8ebcd8 100644 +--- a/tools/testing/selftests/powerpc/cache_shape/Makefile ++++ b/tools/testing/selftests/powerpc/cache_shape/Makefile +@@ -1,12 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 +-TEST_PROGS := cache_shape +- +-all: $(TEST_PROGS) +- +-$(TEST_PROGS): ../harness.c ../utils.c ++TEST_GEN_PROGS := cache_shape + + top_srcdir = ../../../../.. + include ../../lib.mk + +-clean: +- rm -f $(TEST_PROGS) *.o ++$(TEST_GEN_PROGS): ../harness.c ../utils.c +diff --git a/tools/testing/selftests/powerpc/ptrace/Makefile b/tools/testing/selftests/powerpc/ptrace/Makefile +index 923d531265f8..9f9423430059 100644 +--- a/tools/testing/selftests/powerpc/ptrace/Makefile ++++ b/tools/testing/selftests/powerpc/ptrace/Makefile +@@ -1,5 +1,5 @@ + # SPDX-License-Identifier: GPL-2.0 +-TEST_PROGS := ptrace-gpr ptrace-tm-gpr ptrace-tm-spd-gpr \ ++TEST_GEN_PROGS := ptrace-gpr ptrace-tm-gpr ptrace-tm-spd-gpr \ + ptrace-tar ptrace-tm-tar ptrace-tm-spd-tar ptrace-vsx ptrace-tm-vsx \ + ptrace-tm-spd-vsx ptrace-tm-spr ptrace-hwbreak ptrace-pkey core-pkey \ + perf-hwbreak +@@ -7,14 +7,9 @@ TEST_PROGS := ptrace-gpr ptrace-tm-gpr ptrace-tm-spd-gpr \ + top_srcdir = ../../../../.. + include ../../lib.mk + +-all: $(TEST_PROGS) +- + CFLAGS += -m64 -I../../../../../usr/include -I../tm -mhtm -fno-pie + +-ptrace-pkey core-pkey: child.h +-ptrace-pkey core-pkey: LDLIBS += -pthread +- +-$(TEST_PROGS): ../harness.c ../utils.c ../lib/reg.S ptrace.h ++$(OUTPUT)/ptrace-pkey $(OUTPUT)/core-pkey: child.h ++$(OUTPUT)/ptrace-pkey $(OUTPUT)/core-pkey: LDLIBS += -pthread + +-clean: +- rm -f $(TEST_PROGS) *.o ++$(TEST_GEN_PROGS): ../harness.c ../utils.c ../lib/reg.S ptrace.h +diff --git a/tools/testing/selftests/powerpc/signal/Makefile b/tools/testing/selftests/powerpc/signal/Makefile +index 1fca25c6ace0..209a958dca12 100644 +--- a/tools/testing/selftests/powerpc/signal/Makefile ++++ b/tools/testing/selftests/powerpc/signal/Makefile +@@ -1,15 +1,10 @@ + # SPDX-License-Identifier: GPL-2.0 +-TEST_PROGS := signal signal_tm +- +-all: $(TEST_PROGS) +- +-$(TEST_PROGS): ../harness.c ../utils.c signal.S ++TEST_GEN_PROGS := signal signal_tm + + CFLAGS += -maltivec +-signal_tm: CFLAGS += -mhtm ++$(OUTPUT)/signal_tm: CFLAGS += -mhtm + + top_srcdir = ../../../../.. + include ../../lib.mk + +-clean: +- rm -f $(TEST_PROGS) *.o ++$(TEST_GEN_PROGS): ../harness.c ../utils.c signal.S +diff --git a/tools/testing/selftests/powerpc/switch_endian/Makefile b/tools/testing/selftests/powerpc/switch_endian/Makefile +index fcd2dcb8972b..bdc081afedb0 100644 +--- a/tools/testing/selftests/powerpc/switch_endian/Makefile ++++ b/tools/testing/selftests/powerpc/switch_endian/Makefile +@@ -8,6 +8,7 @@ EXTRA_CLEAN = $(OUTPUT)/*.o $(OUTPUT)/check-reversed.S + top_srcdir = ../../../../.. + include ../../lib.mk + ++$(OUTPUT)/switch_endian_test: ASFLAGS += -I $(OUTPUT) + $(OUTPUT)/switch_endian_test: $(OUTPUT)/check-reversed.S + + $(OUTPUT)/check-reversed.o: $(OUTPUT)/check.o +diff --git a/tools/testing/selftests/proc/fd-001-lookup.c b/tools/testing/selftests/proc/fd-001-lookup.c +index a2010dfb2110..60d7948e7124 100644 +--- a/tools/testing/selftests/proc/fd-001-lookup.c ++++ b/tools/testing/selftests/proc/fd-001-lookup.c +@@ -14,7 +14,7 @@ + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + // Test /proc/*/fd lookup. +-#define _GNU_SOURCE ++ + #undef NDEBUG + #include <assert.h> + #include <dirent.h> +diff --git a/tools/testing/selftests/proc/fd-003-kthread.c b/tools/testing/selftests/proc/fd-003-kthread.c +index 1d659d55368c..dc591f97b63d 100644 +--- a/tools/testing/selftests/proc/fd-003-kthread.c ++++ b/tools/testing/selftests/proc/fd-003-kthread.c +@@ -14,7 +14,7 @@ + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + // Test that /proc/$KERNEL_THREAD/fd/ is empty. +-#define _GNU_SOURCE ++ + #undef NDEBUG + #include <sys/syscall.h> + #include <assert.h> +diff --git a/tools/testing/selftests/vm/gup_benchmark.c b/tools/testing/selftests/vm/gup_benchmark.c +index 9601bc24454d..17da711f26af 100644 +--- a/tools/testing/selftests/vm/gup_benchmark.c ++++ b/tools/testing/selftests/vm/gup_benchmark.c +@@ -51,6 +51,7 @@ int main(int argc, char **argv) + break; + case 'w': + write = 1; ++ break; + default: + return -1; + } +diff --git a/tools/testing/selftests/watchdog/watchdog-test.c b/tools/testing/selftests/watchdog/watchdog-test.c +index 6e290874b70e..f1c6e025cbe5 100644 +--- a/tools/testing/selftests/watchdog/watchdog-test.c ++++ b/tools/testing/selftests/watchdog/watchdog-test.c +@@ -89,7 +89,13 @@ int main(int argc, char *argv[]) + fd = open("/dev/watchdog", O_WRONLY); + + if (fd == -1) { +- printf("Watchdog device not enabled.\n"); ++ if (errno == ENOENT) ++ printf("Watchdog device not enabled.\n"); ++ else if (errno == EACCES) ++ printf("Run watchdog as root.\n"); ++ else ++ printf("Watchdog device open failed %s\n", ++ strerror(errno)); + exit(-1); + } + +@@ -103,7 +109,7 @@ int main(int argc, char *argv[]) + printf("Last boot is caused by: %s.\n", (flags != 0) ? + "Watchdog" : "Power-On-Reset"); + else +- printf("WDIOC_GETBOOTSTATUS errno '%s'\n", strerror(errno)); ++ printf("WDIOC_GETBOOTSTATUS error '%s'\n", strerror(errno)); + break; + case 'd': + flags = WDIOS_DISABLECARD; +@@ -111,7 +117,7 @@ int main(int argc, char *argv[]) + if (!ret) + printf("Watchdog card disabled.\n"); + else +- printf("WDIOS_DISABLECARD errno '%s'\n", strerror(errno)); ++ printf("WDIOS_DISABLECARD error '%s'\n", strerror(errno)); + break; + case 'e': + flags = WDIOS_ENABLECARD; +@@ -119,7 +125,7 @@ int main(int argc, char *argv[]) + if (!ret) + printf("Watchdog card enabled.\n"); + else +- printf("WDIOS_ENABLECARD errno '%s'\n", strerror(errno)); ++ printf("WDIOS_ENABLECARD error '%s'\n", strerror(errno)); + break; + case 'p': + ping_rate = strtoul(optarg, NULL, 0); +@@ -133,7 +139,7 @@ int main(int argc, char *argv[]) + if (!ret) + printf("Watchdog timeout set to %u seconds.\n", flags); + else +- printf("WDIOC_SETTIMEOUT errno '%s'\n", strerror(errno)); ++ printf("WDIOC_SETTIMEOUT error '%s'\n", strerror(errno)); + break; + default: + usage(argv[0]); +diff --git a/tools/usb/usbip/libsrc/usbip_host_common.c b/tools/usb/usbip/libsrc/usbip_host_common.c +index dc93fadbee96..b0f7489d069d 100644 +--- a/tools/usb/usbip/libsrc/usbip_host_common.c ++++ b/tools/usb/usbip/libsrc/usbip_host_common.c +@@ -43,7 +43,7 @@ static int32_t read_attr_usbip_status(struct usbip_usb_device *udev) + int size; + int fd; + int length; +- char status; ++ char status[2] = { 0 }; + int value = 0; + + size = snprintf(status_attr_path, sizeof(status_attr_path), +@@ -61,15 +61,15 @@ static int32_t read_attr_usbip_status(struct usbip_usb_device *udev) + return -1; + } + +- length = read(fd, &status, 1); ++ length = read(fd, status, 1); + if (length < 0) { + err("error reading attribute %s", status_attr_path); + close(fd); + return -1; + } + +- value = atoi(&status); +- ++ value = atoi(status); ++ close(fd); + return value; + } + +diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c +index 7a0d86d52230..df3fc0f214ec 100644 +--- a/virt/kvm/kvm_main.c ++++ b/virt/kvm/kvm_main.c +@@ -147,10 +147,30 @@ __weak int kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm, + return 0; + } + ++bool kvm_is_zone_device_pfn(kvm_pfn_t pfn) ++{ ++ /* ++ * The metadata used by is_zone_device_page() to determine whether or ++ * not a page is ZONE_DEVICE is guaranteed to be valid if and only if ++ * the device has been pinned, e.g. by get_user_pages(). WARN if the ++ * page_count() is zero to help detect bad usage of this helper. ++ */ ++ if (!pfn_valid(pfn) || WARN_ON_ONCE(!page_count(pfn_to_page(pfn)))) ++ return false; ++ ++ return is_zone_device_page(pfn_to_page(pfn)); ++} ++ + bool kvm_is_reserved_pfn(kvm_pfn_t pfn) + { ++ /* ++ * ZONE_DEVICE pages currently set PG_reserved, but from a refcounting ++ * perspective they are "normal" pages, albeit with slightly different ++ * usage rules. ++ */ + if (pfn_valid(pfn)) +- return PageReserved(pfn_to_page(pfn)); ++ return PageReserved(pfn_to_page(pfn)) && ++ !kvm_is_zone_device_pfn(pfn); + + return true; + } +@@ -1727,7 +1747,7 @@ EXPORT_SYMBOL_GPL(kvm_release_pfn_dirty); + + void kvm_set_pfn_dirty(kvm_pfn_t pfn) + { +- if (!kvm_is_reserved_pfn(pfn)) { ++ if (!kvm_is_reserved_pfn(pfn) && !kvm_is_zone_device_pfn(pfn)) { + struct page *page = pfn_to_page(pfn); + + if (!PageReserved(page)) +@@ -1738,7 +1758,7 @@ EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty); + + void kvm_set_pfn_accessed(kvm_pfn_t pfn) + { +- if (!kvm_is_reserved_pfn(pfn)) ++ if (!kvm_is_reserved_pfn(pfn) && !kvm_is_zone_device_pfn(pfn)) + mark_page_accessed(pfn_to_page(pfn)); + } + EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed); |