commit: fe2294750361f1dd916ca0548123a28d22fcd103 Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> AuthorDate: Wed Oct 27 11:58:03 2021 +0000 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> CommitDate: Wed Oct 27 11:58:03 2021 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=fe229475
Linux patch 5.4.156 Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> 0000_README | 4 + 1155_linux-5.4.156.patch | 2242 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2246 insertions(+) diff --git a/0000_README b/0000_README index 6bf93a2..0d389ec 100644 --- a/0000_README +++ b/0000_README @@ -663,6 +663,10 @@ Patch: 1154_linux-5.4.155.patch From: http://www.kernel.org Desc: Linux 5.4.155 +Patch: 1155_linux-5.4.156.patch +From: http://www.kernel.org +Desc: Linux 5.4.156 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1155_linux-5.4.156.patch b/1155_linux-5.4.156.patch new file mode 100644 index 0000000..3e82490 --- /dev/null +++ b/1155_linux-5.4.156.patch @@ -0,0 +1,2242 @@ +diff --git a/Makefile b/Makefile +index f7e2bf924463b..ced1f0fd48dc6 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 4 +-SUBLEVEL = 155 ++SUBLEVEL = 156 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 9aa88715f196c..4b36bbcf5a5b4 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -85,6 +85,7 @@ config ARM + select HAVE_FTRACE_MCOUNT_RECORD if !XIP_KERNEL + select HAVE_FUNCTION_GRAPH_TRACER if !THUMB2_KERNEL && !CC_IS_CLANG + select HAVE_FUNCTION_TRACER if !XIP_KERNEL && (CC_IS_GCC || CLANG_VERSION >= 100000) ++ select HAVE_FUTEX_CMPXCHG if FUTEX + select HAVE_GCC_PLUGINS + select HAVE_HW_BREAKPOINT if PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7) + select HAVE_IDE if PCI || ISA || PCMCIA +diff --git a/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts b/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts +index 89f0c9979b89c..4f63158d6b9bd 100644 +--- a/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts ++++ b/arch/arm/boot/dts/at91-sama5d27_som1_ek.dts +@@ -69,7 +69,6 @@ + isc: isc@f0008000 { + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_isc_base &pinctrl_isc_data_8bit &pinctrl_isc_data_9_10 &pinctrl_isc_data_11_12>; +- status = "okay"; + }; + + qspi1: spi@f0024000 { +diff --git a/arch/arm/boot/dts/spear3xx.dtsi b/arch/arm/boot/dts/spear3xx.dtsi +index f266b7b034823..cc88ebe7a60ce 100644 +--- a/arch/arm/boot/dts/spear3xx.dtsi ++++ b/arch/arm/boot/dts/spear3xx.dtsi +@@ -47,7 +47,7 @@ + }; + + gmac: eth@e0800000 { +- compatible = "st,spear600-gmac"; ++ compatible = "snps,dwmac-3.40a"; + reg = <0xe0800000 0x8000>; + interrupts = <23 22>; + interrupt-names = "macirq", "eth_wake_irq"; +diff --git a/arch/nios2/include/asm/irqflags.h b/arch/nios2/include/asm/irqflags.h +index b3ec3e510706d..25acf27862f91 100644 +--- a/arch/nios2/include/asm/irqflags.h ++++ b/arch/nios2/include/asm/irqflags.h +@@ -9,7 +9,7 @@ + + static inline unsigned long arch_local_save_flags(void) + { +- return RDCTL(CTL_STATUS); ++ return RDCTL(CTL_FSTATUS); + } + + /* +@@ -18,7 +18,7 @@ static inline unsigned long arch_local_save_flags(void) + */ + static inline void arch_local_irq_restore(unsigned long flags) + { +- WRCTL(CTL_STATUS, flags); ++ WRCTL(CTL_FSTATUS, flags); + } + + static inline void arch_local_irq_disable(void) +diff --git a/arch/nios2/include/asm/registers.h b/arch/nios2/include/asm/registers.h +index 183c720e454d9..95b67dd16f818 100644 +--- a/arch/nios2/include/asm/registers.h ++++ b/arch/nios2/include/asm/registers.h +@@ -11,7 +11,7 @@ + #endif + + /* control register numbers */ +-#define CTL_STATUS 0 ++#define CTL_FSTATUS 0 + #define CTL_ESTATUS 1 + #define CTL_BSTATUS 2 + #define CTL_IENABLE 3 +diff --git a/arch/parisc/math-emu/fpudispatch.c b/arch/parisc/math-emu/fpudispatch.c +index 7c46969ead9b1..01ed133227c25 100644 +--- a/arch/parisc/math-emu/fpudispatch.c ++++ b/arch/parisc/math-emu/fpudispatch.c +@@ -310,12 +310,15 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + r1 &= ~3; + fpregs[t+3] = fpregs[r1+3]; + fpregs[t+2] = fpregs[r1+2]; ++ fallthrough; + case 1: /* double */ + fpregs[t+1] = fpregs[r1+1]; ++ fallthrough; + case 0: /* single */ + fpregs[t] = fpregs[r1]; + return(NOEXCEPTION); + } ++ BUG(); + case 3: /* FABS */ + switch (fmt) { + case 2: /* illegal */ +@@ -325,13 +328,16 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + r1 &= ~3; + fpregs[t+3] = fpregs[r1+3]; + fpregs[t+2] = fpregs[r1+2]; ++ fallthrough; + case 1: /* double */ + fpregs[t+1] = fpregs[r1+1]; ++ fallthrough; + case 0: /* single */ + /* copy and clear sign bit */ + fpregs[t] = fpregs[r1] & 0x7fffffff; + return(NOEXCEPTION); + } ++ BUG(); + case 6: /* FNEG */ + switch (fmt) { + case 2: /* illegal */ +@@ -341,13 +347,16 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + r1 &= ~3; + fpregs[t+3] = fpregs[r1+3]; + fpregs[t+2] = fpregs[r1+2]; ++ fallthrough; + case 1: /* double */ + fpregs[t+1] = fpregs[r1+1]; ++ fallthrough; + case 0: /* single */ + /* copy and invert sign bit */ + fpregs[t] = fpregs[r1] ^ 0x80000000; + return(NOEXCEPTION); + } ++ BUG(); + case 7: /* FNEGABS */ + switch (fmt) { + case 2: /* illegal */ +@@ -357,13 +366,16 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + r1 &= ~3; + fpregs[t+3] = fpregs[r1+3]; + fpregs[t+2] = fpregs[r1+2]; ++ fallthrough; + case 1: /* double */ + fpregs[t+1] = fpregs[r1+1]; ++ fallthrough; + case 0: /* single */ + /* copy and set sign bit */ + fpregs[t] = fpregs[r1] | 0x80000000; + return(NOEXCEPTION); + } ++ BUG(); + case 4: /* FSQRT */ + switch (fmt) { + case 0: +@@ -376,6 +388,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + case 3: /* quad not implemented */ + return(MAJOR_0C_EXCP); + } ++ BUG(); + case 5: /* FRND */ + switch (fmt) { + case 0: +@@ -389,7 +402,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + return(MAJOR_0C_EXCP); + } + } /* end of switch (subop) */ +- ++ BUG(); + case 1: /* class 1 */ + df = extru(ir,fpdfpos,2); /* get dest format */ + if ((df & 2) || (fmt & 2)) { +@@ -419,6 +432,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + case 3: /* dbl/dbl */ + return(MAJOR_0C_EXCP); + } ++ BUG(); + case 1: /* FCNVXF */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -434,6 +448,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + return(dbl_to_dbl_fcnvxf(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 2: /* FCNVFX */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -449,6 +464,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + return(dbl_to_dbl_fcnvfx(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 3: /* FCNVFXT */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -464,6 +480,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + return(dbl_to_dbl_fcnvfxt(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 5: /* FCNVUF (PA2.0 only) */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -479,6 +496,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + return(dbl_to_dbl_fcnvuf(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 6: /* FCNVFU (PA2.0 only) */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -494,6 +512,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + return(dbl_to_dbl_fcnvfu(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 7: /* FCNVFUT (PA2.0 only) */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -509,10 +528,11 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + return(dbl_to_dbl_fcnvfut(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 4: /* undefined */ + return(MAJOR_0C_EXCP); + } /* end of switch subop */ +- ++ BUG(); + case 2: /* class 2 */ + fpu_type_flags=fpregs[FPU_TYPE_FLAG_POS]; + r2 = extru(ir, fpr2pos, 5) * sizeof(double)/sizeof(u_int); +@@ -590,6 +610,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + case 3: /* quad not implemented */ + return(MAJOR_0C_EXCP); + } ++ BUG(); + case 1: /* FTEST */ + switch (fmt) { + case 0: +@@ -609,8 +630,10 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + case 3: + return(MAJOR_0C_EXCP); + } ++ BUG(); + } /* end of switch subop */ + } /* end of else for PA1.0 & PA1.1 */ ++ BUG(); + case 3: /* class 3 */ + r2 = extru(ir,fpr2pos,5) * sizeof(double)/sizeof(u_int); + if (r2 == 0) +@@ -633,6 +656,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + case 3: /* quad not implemented */ + return(MAJOR_0C_EXCP); + } ++ BUG(); + case 1: /* FSUB */ + switch (fmt) { + case 0: +@@ -645,6 +669,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + case 3: /* quad not implemented */ + return(MAJOR_0C_EXCP); + } ++ BUG(); + case 2: /* FMPY */ + switch (fmt) { + case 0: +@@ -657,6 +682,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + case 3: /* quad not implemented */ + return(MAJOR_0C_EXCP); + } ++ BUG(); + case 3: /* FDIV */ + switch (fmt) { + case 0: +@@ -669,6 +695,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + case 3: /* quad not implemented */ + return(MAJOR_0C_EXCP); + } ++ BUG(); + case 4: /* FREM */ + switch (fmt) { + case 0: +@@ -681,6 +708,7 @@ decode_0c(u_int ir, u_int class, u_int subop, u_int fpregs[]) + case 3: /* quad not implemented */ + return(MAJOR_0C_EXCP); + } ++ BUG(); + } /* end of class 3 switch */ + } /* end of switch(class) */ + +@@ -736,10 +764,12 @@ u_int fpregs[]; + return(MAJOR_0E_EXCP); + case 1: /* double */ + fpregs[t+1] = fpregs[r1+1]; ++ fallthrough; + case 0: /* single */ + fpregs[t] = fpregs[r1]; + return(NOEXCEPTION); + } ++ BUG(); + case 3: /* FABS */ + switch (fmt) { + case 2: +@@ -747,10 +777,12 @@ u_int fpregs[]; + return(MAJOR_0E_EXCP); + case 1: /* double */ + fpregs[t+1] = fpregs[r1+1]; ++ fallthrough; + case 0: /* single */ + fpregs[t] = fpregs[r1] & 0x7fffffff; + return(NOEXCEPTION); + } ++ BUG(); + case 6: /* FNEG */ + switch (fmt) { + case 2: +@@ -758,10 +790,12 @@ u_int fpregs[]; + return(MAJOR_0E_EXCP); + case 1: /* double */ + fpregs[t+1] = fpregs[r1+1]; ++ fallthrough; + case 0: /* single */ + fpregs[t] = fpregs[r1] ^ 0x80000000; + return(NOEXCEPTION); + } ++ BUG(); + case 7: /* FNEGABS */ + switch (fmt) { + case 2: +@@ -769,10 +803,12 @@ u_int fpregs[]; + return(MAJOR_0E_EXCP); + case 1: /* double */ + fpregs[t+1] = fpregs[r1+1]; ++ fallthrough; + case 0: /* single */ + fpregs[t] = fpregs[r1] | 0x80000000; + return(NOEXCEPTION); + } ++ BUG(); + case 4: /* FSQRT */ + switch (fmt) { + case 0: +@@ -785,6 +821,7 @@ u_int fpregs[]; + case 3: + return(MAJOR_0E_EXCP); + } ++ BUG(); + case 5: /* FRMD */ + switch (fmt) { + case 0: +@@ -798,7 +835,7 @@ u_int fpregs[]; + return(MAJOR_0E_EXCP); + } + } /* end of switch (subop */ +- ++ BUG(); + case 1: /* class 1 */ + df = extru(ir,fpdfpos,2); /* get dest format */ + /* +@@ -826,6 +863,7 @@ u_int fpregs[]; + case 3: /* dbl/dbl */ + return(MAJOR_0E_EXCP); + } ++ BUG(); + case 1: /* FCNVXF */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -841,6 +879,7 @@ u_int fpregs[]; + return(dbl_to_dbl_fcnvxf(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 2: /* FCNVFX */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -856,6 +895,7 @@ u_int fpregs[]; + return(dbl_to_dbl_fcnvfx(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 3: /* FCNVFXT */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -871,6 +911,7 @@ u_int fpregs[]; + return(dbl_to_dbl_fcnvfxt(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 5: /* FCNVUF (PA2.0 only) */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -886,6 +927,7 @@ u_int fpregs[]; + return(dbl_to_dbl_fcnvuf(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 6: /* FCNVFU (PA2.0 only) */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -901,6 +943,7 @@ u_int fpregs[]; + return(dbl_to_dbl_fcnvfu(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 7: /* FCNVFUT (PA2.0 only) */ + switch(fmt) { + case 0: /* sgl/sgl */ +@@ -916,9 +959,11 @@ u_int fpregs[]; + return(dbl_to_dbl_fcnvfut(&fpregs[r1],0, + &fpregs[t],status)); + } ++ BUG(); + case 4: /* undefined */ + return(MAJOR_0C_EXCP); + } /* end of switch subop */ ++ BUG(); + case 2: /* class 2 */ + /* + * Be careful out there. +@@ -994,6 +1039,7 @@ u_int fpregs[]; + } + } /* end of switch subop */ + } /* end of else for PA1.0 & PA1.1 */ ++ BUG(); + case 3: /* class 3 */ + /* + * Be careful out there. +@@ -1026,6 +1072,7 @@ u_int fpregs[]; + return(dbl_fadd(&fpregs[r1],&fpregs[r2], + &fpregs[t],status)); + } ++ BUG(); + case 1: /* FSUB */ + switch (fmt) { + case 0: +@@ -1035,6 +1082,7 @@ u_int fpregs[]; + return(dbl_fsub(&fpregs[r1],&fpregs[r2], + &fpregs[t],status)); + } ++ BUG(); + case 2: /* FMPY or XMPYU */ + /* + * check for integer multiply (x bit set) +@@ -1071,6 +1119,7 @@ u_int fpregs[]; + &fpregs[r2],&fpregs[t],status)); + } + } ++ BUG(); + case 3: /* FDIV */ + switch (fmt) { + case 0: +@@ -1080,6 +1129,7 @@ u_int fpregs[]; + return(dbl_fdiv(&fpregs[r1],&fpregs[r2], + &fpregs[t],status)); + } ++ BUG(); + case 4: /* FREM */ + switch (fmt) { + case 0: +diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S +index d32751994a62c..c3f62c9ce7406 100644 +--- a/arch/powerpc/kernel/idle_book3s.S ++++ b/arch/powerpc/kernel/idle_book3s.S +@@ -50,28 +50,32 @@ _GLOBAL(isa300_idle_stop_mayloss) + std r1,PACAR1(r13) + mflr r4 + mfcr r5 +- /* use stack red zone rather than a new frame for saving regs */ +- std r2,-8*0(r1) +- std r14,-8*1(r1) +- std r15,-8*2(r1) +- std r16,-8*3(r1) +- std r17,-8*4(r1) +- std r18,-8*5(r1) +- std r19,-8*6(r1) +- std r20,-8*7(r1) +- std r21,-8*8(r1) +- std r22,-8*9(r1) +- std r23,-8*10(r1) +- std r24,-8*11(r1) +- std r25,-8*12(r1) +- std r26,-8*13(r1) +- std r27,-8*14(r1) +- std r28,-8*15(r1) +- std r29,-8*16(r1) +- std r30,-8*17(r1) +- std r31,-8*18(r1) +- std r4,-8*19(r1) +- std r5,-8*20(r1) ++ /* ++ * Use the stack red zone rather than a new frame for saving regs since ++ * in the case of no GPR loss the wakeup code branches directly back to ++ * the caller without deallocating the stack frame first. ++ */ ++ std r2,-8*1(r1) ++ std r14,-8*2(r1) ++ std r15,-8*3(r1) ++ std r16,-8*4(r1) ++ std r17,-8*5(r1) ++ std r18,-8*6(r1) ++ std r19,-8*7(r1) ++ std r20,-8*8(r1) ++ std r21,-8*9(r1) ++ std r22,-8*10(r1) ++ std r23,-8*11(r1) ++ std r24,-8*12(r1) ++ std r25,-8*13(r1) ++ std r26,-8*14(r1) ++ std r27,-8*15(r1) ++ std r28,-8*16(r1) ++ std r29,-8*17(r1) ++ std r30,-8*18(r1) ++ std r31,-8*19(r1) ++ std r4,-8*20(r1) ++ std r5,-8*21(r1) + /* 168 bytes */ + PPC_STOP + b . /* catch bugs */ +@@ -87,8 +91,8 @@ _GLOBAL(isa300_idle_stop_mayloss) + */ + _GLOBAL(idle_return_gpr_loss) + ld r1,PACAR1(r13) +- ld r4,-8*19(r1) +- ld r5,-8*20(r1) ++ ld r4,-8*20(r1) ++ ld r5,-8*21(r1) + mtlr r4 + mtcr r5 + /* +@@ -96,38 +100,40 @@ _GLOBAL(idle_return_gpr_loss) + * from PACATOC. This could be avoided for that less common case + * if KVM saved its r2. + */ +- ld r2,-8*0(r1) +- ld r14,-8*1(r1) +- ld r15,-8*2(r1) +- ld r16,-8*3(r1) +- ld r17,-8*4(r1) +- ld r18,-8*5(r1) +- ld r19,-8*6(r1) +- ld r20,-8*7(r1) +- ld r21,-8*8(r1) +- ld r22,-8*9(r1) +- ld r23,-8*10(r1) +- ld r24,-8*11(r1) +- ld r25,-8*12(r1) +- ld r26,-8*13(r1) +- ld r27,-8*14(r1) +- ld r28,-8*15(r1) +- ld r29,-8*16(r1) +- ld r30,-8*17(r1) +- ld r31,-8*18(r1) ++ ld r2,-8*1(r1) ++ ld r14,-8*2(r1) ++ ld r15,-8*3(r1) ++ ld r16,-8*4(r1) ++ ld r17,-8*5(r1) ++ ld r18,-8*6(r1) ++ ld r19,-8*7(r1) ++ ld r20,-8*8(r1) ++ ld r21,-8*9(r1) ++ ld r22,-8*10(r1) ++ ld r23,-8*11(r1) ++ ld r24,-8*12(r1) ++ ld r25,-8*13(r1) ++ ld r26,-8*14(r1) ++ ld r27,-8*15(r1) ++ ld r28,-8*16(r1) ++ ld r29,-8*17(r1) ++ ld r30,-8*18(r1) ++ ld r31,-8*19(r1) + blr + + /* + * This is the sequence required to execute idle instructions, as + * specified in ISA v2.07 (and earlier). MSR[IR] and MSR[DR] must be 0. +- * +- * The 0(r1) slot is used to save r2 in isa206, so use that here. ++ * We have to store a GPR somewhere, ptesync, then reload it, and create ++ * a false dependency on the result of the load. It doesn't matter which ++ * GPR we store, or where we store it. We have already stored r2 to the ++ * stack at -8(r1) in isa206_idle_insn_mayloss, so use that. + */ + #define IDLE_STATE_ENTER_SEQ_NORET(IDLE_INST) \ + /* Magic NAP/SLEEP/WINKLE mode enter sequence */ \ +- std r2,0(r1); \ ++ std r2,-8(r1); \ + ptesync; \ +- ld r2,0(r1); \ ++ ld r2,-8(r1); \ + 236: cmpd cr0,r2,r2; \ + bne 236b; \ + IDLE_INST; \ +@@ -152,28 +158,32 @@ _GLOBAL(isa206_idle_insn_mayloss) + std r1,PACAR1(r13) + mflr r4 + mfcr r5 +- /* use stack red zone rather than a new frame for saving regs */ +- std r2,-8*0(r1) +- std r14,-8*1(r1) +- std r15,-8*2(r1) +- std r16,-8*3(r1) +- std r17,-8*4(r1) +- std r18,-8*5(r1) +- std r19,-8*6(r1) +- std r20,-8*7(r1) +- std r21,-8*8(r1) +- std r22,-8*9(r1) +- std r23,-8*10(r1) +- std r24,-8*11(r1) +- std r25,-8*12(r1) +- std r26,-8*13(r1) +- std r27,-8*14(r1) +- std r28,-8*15(r1) +- std r29,-8*16(r1) +- std r30,-8*17(r1) +- std r31,-8*18(r1) +- std r4,-8*19(r1) +- std r5,-8*20(r1) ++ /* ++ * Use the stack red zone rather than a new frame for saving regs since ++ * in the case of no GPR loss the wakeup code branches directly back to ++ * the caller without deallocating the stack frame first. ++ */ ++ std r2,-8*1(r1) ++ std r14,-8*2(r1) ++ std r15,-8*3(r1) ++ std r16,-8*4(r1) ++ std r17,-8*5(r1) ++ std r18,-8*6(r1) ++ std r19,-8*7(r1) ++ std r20,-8*8(r1) ++ std r21,-8*9(r1) ++ std r22,-8*10(r1) ++ std r23,-8*11(r1) ++ std r24,-8*12(r1) ++ std r25,-8*13(r1) ++ std r26,-8*14(r1) ++ std r27,-8*15(r1) ++ std r28,-8*16(r1) ++ std r29,-8*17(r1) ++ std r30,-8*18(r1) ++ std r31,-8*19(r1) ++ std r4,-8*20(r1) ++ std r5,-8*21(r1) + cmpwi r3,PNV_THREAD_NAP + bne 1f + IDLE_STATE_ENTER_SEQ_NORET(PPC_NAP) +diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S +index feaf6ca2e76c1..f9c7326672b95 100644 +--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S ++++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S +@@ -292,13 +292,16 @@ kvm_novcpu_exit: + * r3 contains the SRR1 wakeup value, SRR1 is trashed. + */ + _GLOBAL(idle_kvm_start_guest) +- ld r4,PACAEMERGSP(r13) + mfcr r5 + mflr r0 +- std r1,0(r4) +- std r5,8(r4) +- std r0,16(r4) +- subi r1,r4,STACK_FRAME_OVERHEAD ++ std r5, 8(r1) // Save CR in caller's frame ++ std r0, 16(r1) // Save LR in caller's frame ++ // Create frame on emergency stack ++ ld r4, PACAEMERGSP(r13) ++ stdu r1, -SWITCH_FRAME_SIZE(r4) ++ // Switch to new frame on emergency stack ++ mr r1, r4 ++ std r3, 32(r1) // Save SRR1 wakeup value + SAVE_NVGPRS(r1) + + /* +@@ -350,6 +353,10 @@ kvm_unsplit_wakeup: + + kvm_secondary_got_guest: + ++ // About to go to guest, clear saved SRR1 ++ li r0, 0 ++ std r0, 32(r1) ++ + /* Set HSTATE_DSCR(r13) to something sensible */ + ld r6, PACA_DSCR_DEFAULT(r13) + std r6, HSTATE_DSCR(r13) +@@ -441,13 +448,12 @@ kvm_no_guest: + mfspr r4, SPRN_LPCR + rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1 + mtspr SPRN_LPCR, r4 +- /* set up r3 for return */ +- mfspr r3,SPRN_SRR1 ++ // Return SRR1 wakeup value, or 0 if we went into the guest ++ ld r3, 32(r1) + REST_NVGPRS(r1) +- addi r1, r1, STACK_FRAME_OVERHEAD +- ld r0, 16(r1) +- ld r5, 8(r1) +- ld r1, 0(r1) ++ ld r1, 0(r1) // Switch back to caller stack ++ ld r0, 16(r1) // Reload LR ++ ld r5, 8(r1) // Reload CR + mtlr r0 + mtcr r5 + blr +diff --git a/arch/xtensa/platforms/xtfpga/setup.c b/arch/xtensa/platforms/xtfpga/setup.c +index 829115bb381f8..4edccb4d4a5ff 100644 +--- a/arch/xtensa/platforms/xtfpga/setup.c ++++ b/arch/xtensa/platforms/xtfpga/setup.c +@@ -50,8 +50,12 @@ void platform_power_off(void) + + void platform_restart(void) + { +- /* Flush and reset the mmu, simulate a processor reset, and +- * jump to the reset vector. */ ++ /* Try software reset first. */ ++ WRITE_ONCE(*(u32 *)XTFPGA_SWRST_VADDR, 0xdead); ++ ++ /* If software reset did not work, flush and reset the mmu, ++ * simulate a processor reset, and jump to the reset vector. ++ */ + cpu_reset(); + /* control never gets here */ + } +@@ -81,7 +85,7 @@ void __init platform_calibrate_ccount(void) + + #endif + +-#ifdef CONFIG_OF ++#ifdef CONFIG_USE_OF + + static void __init xtfpga_clk_setup(struct device_node *np) + { +@@ -299,4 +303,4 @@ static int __init xtavnet_init(void) + */ + arch_initcall(xtavnet_init); + +-#endif /* CONFIG_OF */ ++#endif /* CONFIG_USE_OF */ +diff --git a/drivers/input/keyboard/snvs_pwrkey.c b/drivers/input/keyboard/snvs_pwrkey.c +index e76b7a400a1c1..248bb86f4b3f4 100644 +--- a/drivers/input/keyboard/snvs_pwrkey.c ++++ b/drivers/input/keyboard/snvs_pwrkey.c +@@ -3,6 +3,7 @@ + // Driver for the IMX SNVS ON/OFF Power Key + // Copyright (C) 2015 Freescale Semiconductor, Inc. All Rights Reserved. + ++#include <linux/clk.h> + #include <linux/device.h> + #include <linux/err.h> + #include <linux/init.h> +@@ -81,6 +82,11 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void *dev_id) + return IRQ_HANDLED; + } + ++static void imx_snvs_pwrkey_disable_clk(void *data) ++{ ++ clk_disable_unprepare(data); ++} ++ + static void imx_snvs_pwrkey_act(void *pdata) + { + struct pwrkey_drv_data *pd = pdata; +@@ -93,6 +99,7 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev) + struct pwrkey_drv_data *pdata = NULL; + struct input_dev *input = NULL; + struct device_node *np; ++ struct clk *clk; + int error; + + /* Get SNVS register Page */ +@@ -115,6 +122,28 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev) + dev_warn(&pdev->dev, "KEY_POWER without setting in dts\n"); + } + ++ clk = devm_clk_get_optional(&pdev->dev, NULL); ++ if (IS_ERR(clk)) { ++ dev_err(&pdev->dev, "Failed to get snvs clock (%pe)\n", clk); ++ return PTR_ERR(clk); ++ } ++ ++ error = clk_prepare_enable(clk); ++ if (error) { ++ dev_err(&pdev->dev, "Failed to enable snvs clock (%pe)\n", ++ ERR_PTR(error)); ++ return error; ++ } ++ ++ error = devm_add_action_or_reset(&pdev->dev, ++ imx_snvs_pwrkey_disable_clk, clk); ++ if (error) { ++ dev_err(&pdev->dev, ++ "Failed to register clock cleanup handler (%pe)\n", ++ ERR_PTR(error)); ++ return error; ++ } ++ + pdata->wakeup = of_property_read_bool(np, "wakeup-source"); + + pdata->irq = platform_get_irq(pdev, 0); +diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c +index 18de41a266ebe..aa625b7ddcce2 100644 +--- a/drivers/isdn/capi/kcapi.c ++++ b/drivers/isdn/capi/kcapi.c +@@ -565,6 +565,11 @@ int detach_capi_ctr(struct capi_ctr *ctr) + + ctr_down(ctr, CAPI_CTR_DETACHED); + ++ if (ctr->cnr < 1 || ctr->cnr - 1 >= CAPI_MAXCONTR) { ++ err = -EINVAL; ++ goto unlock_out; ++ } ++ + if (capi_controller[ctr->cnr - 1] != ctr) { + err = -EINVAL; + goto unlock_out; +diff --git a/drivers/isdn/hardware/mISDN/netjet.c b/drivers/isdn/hardware/mISDN/netjet.c +index 9e6aab04f9d61..8299defff55ae 100644 +--- a/drivers/isdn/hardware/mISDN/netjet.c ++++ b/drivers/isdn/hardware/mISDN/netjet.c +@@ -949,8 +949,8 @@ nj_release(struct tiger_hw *card) + nj_disable_hwirq(card); + mode_tiger(&card->bc[0], ISDN_P_NONE); + mode_tiger(&card->bc[1], ISDN_P_NONE); +- card->isac.release(&card->isac); + spin_unlock_irqrestore(&card->lock, flags); ++ card->isac.release(&card->isac); + release_region(card->base, card->base_s); + card->base_s = 0; + } +diff --git a/drivers/net/can/rcar/rcar_can.c b/drivers/net/can/rcar/rcar_can.c +index bf5adea9c0a38..ac52288fa3bfe 100644 +--- a/drivers/net/can/rcar/rcar_can.c ++++ b/drivers/net/can/rcar/rcar_can.c +@@ -848,10 +848,12 @@ static int __maybe_unused rcar_can_suspend(struct device *dev) + struct rcar_can_priv *priv = netdev_priv(ndev); + u16 ctlr; + +- if (netif_running(ndev)) { +- netif_stop_queue(ndev); +- netif_device_detach(ndev); +- } ++ if (!netif_running(ndev)) ++ return 0; ++ ++ netif_stop_queue(ndev); ++ netif_device_detach(ndev); ++ + ctlr = readw(&priv->regs->ctlr); + ctlr |= RCAR_CAN_CTLR_CANM_HALT; + writew(ctlr, &priv->regs->ctlr); +@@ -870,6 +872,9 @@ static int __maybe_unused rcar_can_resume(struct device *dev) + u16 ctlr; + int err; + ++ if (!netif_running(ndev)) ++ return 0; ++ + err = clk_enable(priv->clk); + if (err) { + netdev_err(ndev, "clk_enable() failed, error %d\n", err); +@@ -883,10 +888,9 @@ static int __maybe_unused rcar_can_resume(struct device *dev) + writew(ctlr, &priv->regs->ctlr); + priv->can.state = CAN_STATE_ERROR_ACTIVE; + +- if (netif_running(ndev)) { +- netif_device_attach(ndev); +- netif_start_queue(ndev); +- } ++ netif_device_attach(ndev); ++ netif_start_queue(ndev); ++ + return 0; + } + +diff --git a/drivers/net/can/sja1000/peak_pci.c b/drivers/net/can/sja1000/peak_pci.c +index 8c0244f51059e..41a63777030cb 100644 +--- a/drivers/net/can/sja1000/peak_pci.c ++++ b/drivers/net/can/sja1000/peak_pci.c +@@ -731,16 +731,15 @@ static void peak_pci_remove(struct pci_dev *pdev) + struct net_device *prev_dev = chan->prev_dev; + + dev_info(&pdev->dev, "removing device %s\n", dev->name); ++ /* do that only for first channel */ ++ if (!prev_dev && chan->pciec_card) ++ peak_pciec_remove(chan->pciec_card); + unregister_sja1000dev(dev); + free_sja1000dev(dev); + dev = prev_dev; + +- if (!dev) { +- /* do that only for first channel */ +- if (chan->pciec_card) +- peak_pciec_remove(chan->pciec_card); ++ if (!dev) + break; +- } + priv = netdev_priv(dev); + chan = priv->priv; + } +diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c +index 96bbdef672bc9..571d9b0bfe518 100644 +--- a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c ++++ b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c +@@ -551,11 +551,10 @@ static int pcan_usb_fd_decode_status(struct pcan_usb_fd_if *usb_if, + } else if (sm->channel_p_w_b & PUCAN_BUS_WARNING) { + new_state = CAN_STATE_ERROR_WARNING; + } else { +- /* no error bit (so, no error skb, back to active state) */ +- dev->can.state = CAN_STATE_ERROR_ACTIVE; ++ /* back to (or still in) ERROR_ACTIVE state */ ++ new_state = CAN_STATE_ERROR_ACTIVE; + pdev->bec.txerr = 0; + pdev->bec.rxerr = 0; +- return 0; + } + + /* state hasn't changed */ +diff --git a/drivers/net/dsa/lantiq_gswip.c b/drivers/net/dsa/lantiq_gswip.c +index 3225de0f655f2..60e36f46f8abe 100644 +--- a/drivers/net/dsa/lantiq_gswip.c ++++ b/drivers/net/dsa/lantiq_gswip.c +@@ -229,7 +229,7 @@ + #define GSWIP_SDMA_PCTRLp(p) (0xBC0 + ((p) * 0x6)) + #define GSWIP_SDMA_PCTRL_EN BIT(0) /* SDMA Port Enable */ + #define GSWIP_SDMA_PCTRL_FCEN BIT(1) /* Flow Control Enable */ +-#define GSWIP_SDMA_PCTRL_PAUFWD BIT(1) /* Pause Frame Forwarding */ ++#define GSWIP_SDMA_PCTRL_PAUFWD BIT(3) /* Pause Frame Forwarding */ + + #define GSWIP_TABLE_ACTIVE_VLAN 0x01 + #define GSWIP_TABLE_VLAN_MAPPING 0x02 +diff --git a/drivers/net/ethernet/freescale/enetc/enetc_ethtool.c b/drivers/net/ethernet/freescale/enetc/enetc_ethtool.c +index 89121d7ce3e6f..636aa6d81d8fe 100644 +--- a/drivers/net/ethernet/freescale/enetc/enetc_ethtool.c ++++ b/drivers/net/ethernet/freescale/enetc/enetc_ethtool.c +@@ -155,7 +155,7 @@ static const struct { + { ENETC_PM0_TFRM, "MAC tx frames" }, + { ENETC_PM0_TFCS, "MAC tx fcs errors" }, + { ENETC_PM0_TVLAN, "MAC tx VLAN frames" }, +- { ENETC_PM0_TERR, "MAC tx frames" }, ++ { ENETC_PM0_TERR, "MAC tx frame errors" }, + { ENETC_PM0_TUCA, "MAC tx unicast frames" }, + { ENETC_PM0_TMCA, "MAC tx multicast frames" }, + { ENETC_PM0_TBCA, "MAC tx broadcast frames" }, +diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c +index 03ca7d925e8e0..2e38c7d214c45 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c +@@ -10,6 +10,27 @@ static LIST_HEAD(hnae3_ae_algo_list); + static LIST_HEAD(hnae3_client_list); + static LIST_HEAD(hnae3_ae_dev_list); + ++void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo) ++{ ++ const struct pci_device_id *pci_id; ++ struct hnae3_ae_dev *ae_dev; ++ ++ if (!ae_algo) ++ return; ++ ++ list_for_each_entry(ae_dev, &hnae3_ae_dev_list, node) { ++ if (!hnae3_get_bit(ae_dev->flag, HNAE3_DEV_INITED_B)) ++ continue; ++ ++ pci_id = pci_match_id(ae_algo->pdev_id_table, ae_dev->pdev); ++ if (!pci_id) ++ continue; ++ if (IS_ENABLED(CONFIG_PCI_IOV)) ++ pci_disable_sriov(ae_dev->pdev); ++ } ++} ++EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare); ++ + /* we are keeping things simple and using single lock for all the + * list. This is a non-critical code so other updations, if happen + * in parallel, can wait. +diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h +index 0db835d87d09d..6cf8490110642 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h ++++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h +@@ -666,6 +666,7 @@ struct hnae3_handle { + int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev); + void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev); + ++void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo); + void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo); + void hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo); + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c +index d16488bab86f5..9076605403a74 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c +@@ -132,6 +132,15 @@ static int hclge_ets_validate(struct hclge_dev *hdev, struct ieee_ets *ets, + *changed = true; + break; + case IEEE_8021QAZ_TSA_ETS: ++ /* The hardware will switch to sp mode if bandwidth is ++ * 0, so limit ets bandwidth must be greater than 0. ++ */ ++ if (!ets->tc_tx_bw[i]) { ++ dev_err(&hdev->pdev->dev, ++ "tc%u ets bw cannot be 0\n", i); ++ return -EINVAL; ++ } ++ + if (hdev->tm_info.tc_info[i].tc_sch_mode != + HCLGE_SCH_MODE_DWRR) + *changed = true; +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +index f44e8401496b1..8ecfabaefa85b 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +@@ -10274,6 +10274,7 @@ static int hclge_init(void) + + static void hclge_exit(void) + { ++ hnae3_unregister_ae_algo_prepare(&ae_algo); + hnae3_unregister_ae_algo(&ae_algo); + } + module_init(hclge_init); +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +index 62399cc1c5a63..d98f0e2ec7aa3 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +@@ -633,6 +633,8 @@ static void hclge_tm_pg_info_init(struct hclge_dev *hdev) + hdev->tm_info.pg_info[i].tc_bit_map = hdev->hw_tc_map; + for (k = 0; k < hdev->tm_info.num_tc; k++) + hdev->tm_info.pg_info[i].tc_dwrr[k] = BW_PERCENT; ++ for (; k < HNAE3_MAX_TC; k++) ++ hdev->tm_info.pg_info[i].tc_dwrr[k] = 0; + } + } + +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c +index fad503820e040..b3365b34cac7c 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c +@@ -71,6 +71,7 @@ err_remove_config_dt: + + static const struct of_device_id dwmac_generic_match[] = { + { .compatible = "st,spear600-gmac"}, ++ { .compatible = "snps,dwmac-3.40a"}, + { .compatible = "snps,dwmac-3.50a"}, + { .compatible = "snps,dwmac-3.610"}, + { .compatible = "snps,dwmac-3.70a"}, +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index 835ac178bc8c0..94c652b9a0a8b 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -604,7 +604,7 @@ static int stmmac_hwtstamp_set(struct net_device *dev, struct ifreq *ifr) + config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; + ptp_v2 = PTP_TCR_TSVER2ENA; + snap_type_sel = PTP_TCR_SNAPTYPSEL_1; +- if (priv->synopsys_id != DWMAC_CORE_5_10) ++ if (priv->synopsys_id < DWMAC_CORE_4_10) + ts_event_en = PTP_TCR_TSEVNTENA; + ptp_over_ipv4_udp = PTP_TCR_TSIPV4ENA; + ptp_over_ipv6_udp = PTP_TCR_TSIPV6ENA; +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +index 678aa2b001e01..a46fea472bc46 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +@@ -505,6 +505,14 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac) + plat->pmt = 1; + } + ++ if (of_device_is_compatible(np, "snps,dwmac-3.40a")) { ++ plat->has_gmac = 1; ++ plat->enh_desc = 1; ++ plat->tx_coe = 1; ++ plat->bugged_jumbo = 1; ++ plat->pmt = 1; ++ } ++ + if (of_device_is_compatible(np, "snps,dwmac-4.00") || + of_device_is_compatible(np, "snps,dwmac-4.10a") || + of_device_is_compatible(np, "snps,dwmac-4.20a")) { +diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c +index bec73f0640d03..8377ff229a303 100644 +--- a/drivers/net/phy/mdio_bus.c ++++ b/drivers/net/phy/mdio_bus.c +@@ -395,6 +395,7 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner) + err = device_register(&bus->dev); + if (err) { + pr_err("mii_bus %s failed to register\n", bus->id); ++ put_device(&bus->dev); + return -EINVAL; + } + +diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig +index ca234d1a0e3bf..d7005cc76ce91 100644 +--- a/drivers/net/usb/Kconfig ++++ b/drivers/net/usb/Kconfig +@@ -117,6 +117,7 @@ config USB_LAN78XX + select PHYLIB + select MICROCHIP_PHY + select FIXED_PHY ++ select CRC32 + help + This option adds support for Microchip LAN78XX based USB 2 + & USB 3 10/100/1000 Ethernet adapters. +diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c +index bac1d040bacab..138cbc012cd89 100644 +--- a/drivers/pinctrl/stm32/pinctrl-stm32.c ++++ b/drivers/pinctrl/stm32/pinctrl-stm32.c +@@ -1554,8 +1554,8 @@ int __maybe_unused stm32_pinctrl_resume(struct device *dev) + struct stm32_pinctrl_group *g = pctl->groups; + int i; + +- for (i = g->pin; i < g->pin + pctl->ngroups; i++) +- stm32_pinctrl_restore_gpio_regs(pctl, i); ++ for (i = 0; i < pctl->ngroups; i++, g++) ++ stm32_pinctrl_restore_gpio_regs(pctl, g->pin); + + return 0; + } +diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c +index e330ec73c465d..bcb516892d01d 100644 +--- a/drivers/platform/x86/intel_scu_ipc.c ++++ b/drivers/platform/x86/intel_scu_ipc.c +@@ -181,7 +181,7 @@ static inline int busy_loop(struct intel_scu_ipc_dev *scu) + return 0; + } + +-/* Wait till ipc ioc interrupt is received or timeout in 3 HZ */ ++/* Wait till ipc ioc interrupt is received or timeout in 10 HZ */ + static inline int ipc_wait_for_interrupt(struct intel_scu_ipc_dev *scu) + { + int status; +diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c +index 7c736e4ddafe7..45885e80992fb 100644 +--- a/drivers/scsi/hosts.c ++++ b/drivers/scsi/hosts.c +@@ -219,7 +219,8 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev, + goto fail; + } + +- shost->cmd_per_lun = min_t(short, shost->cmd_per_lun, ++ /* Use min_t(int, ...) in case shost->can_queue exceeds SHRT_MAX */ ++ shost->cmd_per_lun = min_t(int, shost->cmd_per_lun, + shost->can_queue); + + error = scsi_init_sense_cache(shost); +diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c +index 4bb4c8f28cbd7..5eaef45799e61 100644 +--- a/drivers/tee/optee/core.c ++++ b/drivers/tee/optee/core.c +@@ -582,6 +582,9 @@ static struct optee *optee_probe(struct device_node *np) + if (sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) + pool = optee_config_dyn_shm(); + ++ /* Unregister OP-TEE specific client devices on TEE bus */ ++ optee_unregister_devices(); ++ + /* + * If dynamic shared memory is not available or failed - try static one + */ +diff --git a/drivers/tee/optee/device.c b/drivers/tee/optee/device.c +index e3a148521ec1d..acff7dd677d67 100644 +--- a/drivers/tee/optee/device.c ++++ b/drivers/tee/optee/device.c +@@ -65,6 +65,13 @@ static int get_devices(struct tee_context *ctx, u32 session, + return 0; + } + ++static void optee_release_device(struct device *dev) ++{ ++ struct tee_client_device *optee_device = to_tee_client_device(dev); ++ ++ kfree(optee_device); ++} ++ + static int optee_register_device(const uuid_t *device_uuid, u32 device_id) + { + struct tee_client_device *optee_device = NULL; +@@ -75,6 +82,7 @@ static int optee_register_device(const uuid_t *device_uuid, u32 device_id) + return -ENOMEM; + + optee_device->dev.bus = &tee_bus_type; ++ optee_device->dev.release = optee_release_device; + dev_set_name(&optee_device->dev, "optee-clnt%u", device_id); + uuid_copy(&optee_device->id.uuid, device_uuid); + +@@ -158,3 +166,17 @@ out_ctx: + + return rc; + } ++ ++static int __optee_unregister_device(struct device *dev, void *data) ++{ ++ if (!strncmp(dev_name(dev), "optee-clnt", strlen("optee-clnt"))) ++ device_unregister(dev); ++ ++ return 0; ++} ++ ++void optee_unregister_devices(void) ++{ ++ bus_for_each_dev(&tee_bus_type, NULL, NULL, ++ __optee_unregister_device); ++} +diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h +index 3eeaad2a28686..54c3fa01d0024 100644 +--- a/drivers/tee/optee/optee_private.h ++++ b/drivers/tee/optee/optee_private.h +@@ -175,6 +175,7 @@ void optee_fill_pages_list(u64 *dst, struct page **pages, int num_pages, + size_t page_offset); + + int optee_enumerate_devices(void); ++void optee_unregister_devices(void); + + /* + * Small helpers +diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c +index 9d358dafef367..f342055699870 100644 +--- a/fs/btrfs/tree-log.c ++++ b/fs/btrfs/tree-log.c +@@ -900,9 +900,11 @@ out: + } + + /* +- * helper function to see if a given name and sequence number found +- * in an inode back reference are already in a directory and correctly +- * point to this inode ++ * See if a given name and sequence number found in an inode back reference are ++ * already in a directory and correctly point to this inode. ++ * ++ * Returns: < 0 on error, 0 if the directory entry does not exists and 1 if it ++ * exists. + */ + static noinline int inode_in_dir(struct btrfs_root *root, + struct btrfs_path *path, +@@ -911,29 +913,35 @@ static noinline int inode_in_dir(struct btrfs_root *root, + { + struct btrfs_dir_item *di; + struct btrfs_key location; +- int match = 0; ++ int ret = 0; + + di = btrfs_lookup_dir_index_item(NULL, root, path, dirid, + index, name, name_len, 0); +- if (di && !IS_ERR(di)) { ++ if (IS_ERR(di)) { ++ if (PTR_ERR(di) != -ENOENT) ++ ret = PTR_ERR(di); ++ goto out; ++ } else if (di) { + btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location); + if (location.objectid != objectid) + goto out; +- } else ++ } else { + goto out; +- btrfs_release_path(path); ++ } + ++ btrfs_release_path(path); + di = btrfs_lookup_dir_item(NULL, root, path, dirid, name, name_len, 0); +- if (di && !IS_ERR(di)) { +- btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location); +- if (location.objectid != objectid) +- goto out; +- } else ++ if (IS_ERR(di)) { ++ ret = PTR_ERR(di); + goto out; +- match = 1; ++ } else if (di) { ++ btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location); ++ if (location.objectid == objectid) ++ ret = 1; ++ } + out: + btrfs_release_path(path); +- return match; ++ return ret; + } + + /* +@@ -1500,10 +1508,12 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, + if (ret) + goto out; + +- /* if we already have a perfect match, we're done */ +- if (!inode_in_dir(root, path, btrfs_ino(BTRFS_I(dir)), +- btrfs_ino(BTRFS_I(inode)), ref_index, +- name, namelen)) { ++ ret = inode_in_dir(root, path, btrfs_ino(BTRFS_I(dir)), ++ btrfs_ino(BTRFS_I(inode)), ref_index, ++ name, namelen); ++ if (ret < 0) { ++ goto out; ++ } else if (ret == 0) { + /* + * look for a conflicting back reference in the + * metadata. if we find one we have to unlink that name +@@ -1561,6 +1571,7 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, + + btrfs_update_inode(trans, root, inode); + } ++ /* Else, ret == 1, we already have a perfect match, we're done. */ + + ref_ptr = (unsigned long)(ref_ptr + ref_struct_size) + namelen; + kfree(name); +diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c +index 0fad044a5752b..06e9b26bf277a 100644 +--- a/fs/ceph/caps.c ++++ b/fs/ceph/caps.c +@@ -2249,7 +2249,6 @@ static int unsafe_request_wait(struct inode *inode) + + int ceph_fsync(struct file *file, loff_t start, loff_t end, int datasync) + { +- struct ceph_file_info *fi = file->private_data; + struct inode *inode = file->f_mapping->host; + struct ceph_inode_info *ci = ceph_inode(inode); + u64 flush_tid; +@@ -2280,14 +2279,9 @@ int ceph_fsync(struct file *file, loff_t start, loff_t end, int datasync) + if (err < 0) + ret = err; + +- if (errseq_check(&ci->i_meta_err, READ_ONCE(fi->meta_err))) { +- spin_lock(&file->f_lock); +- err = errseq_check_and_advance(&ci->i_meta_err, +- &fi->meta_err); +- spin_unlock(&file->f_lock); +- if (err < 0) +- ret = err; +- } ++ err = file_check_and_advance_wb_err(file); ++ if (err < 0) ++ ret = err; + out: + dout("fsync %p%s result=%d\n", inode, datasync ? " datasync" : "", ret); + return ret; +diff --git a/fs/ceph/file.c b/fs/ceph/file.c +index 34785a203461d..aa1eac6d89f2e 100644 +--- a/fs/ceph/file.c ++++ b/fs/ceph/file.c +@@ -234,7 +234,6 @@ static int ceph_init_file_info(struct inode *inode, struct file *file, + fi->fmode = fmode; + spin_lock_init(&fi->rw_contexts_lock); + INIT_LIST_HEAD(&fi->rw_contexts); +- fi->meta_err = errseq_sample(&ci->i_meta_err); + fi->filp_gen = READ_ONCE(ceph_inode_to_client(inode)->filp_gen); + + return 0; +diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c +index 5beebbbb42f09..af85a72376040 100644 +--- a/fs/ceph/inode.c ++++ b/fs/ceph/inode.c +@@ -515,8 +515,6 @@ struct inode *ceph_alloc_inode(struct super_block *sb) + + ceph_fscache_inode_init(ci); + +- ci->i_meta_err = 0; +- + return &ci->vfs_inode; + } + +diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c +index 1ef370913c007..37fb71797b341 100644 +--- a/fs/ceph/mds_client.c ++++ b/fs/ceph/mds_client.c +@@ -1272,7 +1272,6 @@ static void cleanup_session_requests(struct ceph_mds_client *mdsc, + { + struct ceph_mds_request *req; + struct rb_node *p; +- struct ceph_inode_info *ci; + + dout("cleanup_session_requests mds%d\n", session->s_mds); + mutex_lock(&mdsc->mutex); +@@ -1281,16 +1280,10 @@ static void cleanup_session_requests(struct ceph_mds_client *mdsc, + struct ceph_mds_request, r_unsafe_item); + pr_warn_ratelimited(" dropping unsafe request %llu\n", + req->r_tid); +- if (req->r_target_inode) { +- /* dropping unsafe change of inode's attributes */ +- ci = ceph_inode(req->r_target_inode); +- errseq_set(&ci->i_meta_err, -EIO); +- } +- if (req->r_unsafe_dir) { +- /* dropping unsafe directory operation */ +- ci = ceph_inode(req->r_unsafe_dir); +- errseq_set(&ci->i_meta_err, -EIO); +- } ++ if (req->r_target_inode) ++ mapping_set_error(req->r_target_inode->i_mapping, -EIO); ++ if (req->r_unsafe_dir) ++ mapping_set_error(req->r_unsafe_dir->i_mapping, -EIO); + __unregister_request(mdsc, req); + } + /* zero r_attempts, so kick_requests() will re-send requests */ +@@ -1436,7 +1429,7 @@ static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap, + spin_unlock(&mdsc->cap_dirty_lock); + + if (dirty_dropped) { +- errseq_set(&ci->i_meta_err, -EIO); ++ mapping_set_error(inode->i_mapping, -EIO); + + if (ci->i_wrbuffer_ref_head == 0 && + ci->i_wr_ref == 0 && +diff --git a/fs/ceph/super.h b/fs/ceph/super.h +index 8ffc8e88dd3d2..6db7b3387e1cc 100644 +--- a/fs/ceph/super.h ++++ b/fs/ceph/super.h +@@ -402,8 +402,6 @@ struct ceph_inode_info { + struct fscache_cookie *fscache; + u32 i_fscache_gen; + #endif +- errseq_t i_meta_err; +- + struct inode vfs_inode; /* at end */ + }; + +@@ -712,7 +710,6 @@ struct ceph_file_info { + spinlock_t rw_contexts_lock; + struct list_head rw_contexts; + +- errseq_t meta_err; + u32 filp_gen; + atomic_t num_locks; + }; +diff --git a/fs/exec.c b/fs/exec.c +index 1b4d2206d53a1..098de820abcc9 100644 +--- a/fs/exec.c ++++ b/fs/exec.c +@@ -988,7 +988,7 @@ int kernel_read_file_from_fd(int fd, void **buf, loff_t *size, loff_t max_size, + struct fd f = fdget(fd); + int ret = -EBADF; + +- if (!f.file) ++ if (!f.file || !(f.file->f_mode & FMODE_READ)) + goto out; + + ret = kernel_read_file(f.file, buf, size, max_size, id); +diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c +index 8e03d6c25097a..730386c130e0f 100644 +--- a/fs/nfsd/nfsctl.c ++++ b/fs/nfsd/nfsctl.c +@@ -792,7 +792,10 @@ out_close: + svc_xprt_put(xprt); + } + out_err: +- nfsd_destroy(net); ++ if (!list_empty(&nn->nfsd_serv->sv_permsocks)) ++ nn->nfsd_serv->sv_nrthreads--; ++ else ++ nfsd_destroy(net); + return err; + } + +diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c +index 0a6fe7d5aba74..4db87b26cf7b2 100644 +--- a/fs/ocfs2/alloc.c ++++ b/fs/ocfs2/alloc.c +@@ -7048,7 +7048,7 @@ void ocfs2_set_inode_data_inline(struct inode *inode, struct ocfs2_dinode *di) + int ocfs2_convert_inline_data_to_extents(struct inode *inode, + struct buffer_head *di_bh) + { +- int ret, i, has_data, num_pages = 0; ++ int ret, has_data, num_pages = 0; + int need_free = 0; + u32 bit_off, num; + handle_t *handle; +@@ -7057,26 +7057,17 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); + struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; + struct ocfs2_alloc_context *data_ac = NULL; +- struct page **pages = NULL; +- loff_t end = osb->s_clustersize; ++ struct page *page = NULL; + struct ocfs2_extent_tree et; + int did_quota = 0; + + has_data = i_size_read(inode) ? 1 : 0; + + if (has_data) { +- pages = kcalloc(ocfs2_pages_per_cluster(osb->sb), +- sizeof(struct page *), GFP_NOFS); +- if (pages == NULL) { +- ret = -ENOMEM; +- mlog_errno(ret); +- return ret; +- } +- + ret = ocfs2_reserve_clusters(osb, 1, &data_ac); + if (ret) { + mlog_errno(ret); +- goto free_pages; ++ goto out; + } + } + +@@ -7096,7 +7087,8 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, + } + + if (has_data) { +- unsigned int page_end; ++ unsigned int page_end = min_t(unsigned, PAGE_SIZE, ++ osb->s_clustersize); + u64 phys; + + ret = dquot_alloc_space_nodirty(inode, +@@ -7120,15 +7112,8 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, + */ + block = phys = ocfs2_clusters_to_blocks(inode->i_sb, bit_off); + +- /* +- * Non sparse file systems zero on extend, so no need +- * to do that now. +- */ +- if (!ocfs2_sparse_alloc(osb) && +- PAGE_SIZE < osb->s_clustersize) +- end = PAGE_SIZE; +- +- ret = ocfs2_grab_eof_pages(inode, 0, end, pages, &num_pages); ++ ret = ocfs2_grab_eof_pages(inode, 0, page_end, &page, ++ &num_pages); + if (ret) { + mlog_errno(ret); + need_free = 1; +@@ -7139,20 +7124,15 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, + * This should populate the 1st page for us and mark + * it up to date. + */ +- ret = ocfs2_read_inline_data(inode, pages[0], di_bh); ++ ret = ocfs2_read_inline_data(inode, page, di_bh); + if (ret) { + mlog_errno(ret); + need_free = 1; + goto out_unlock; + } + +- page_end = PAGE_SIZE; +- if (PAGE_SIZE > osb->s_clustersize) +- page_end = osb->s_clustersize; +- +- for (i = 0; i < num_pages; i++) +- ocfs2_map_and_dirty_page(inode, handle, 0, page_end, +- pages[i], i > 0, &phys); ++ ocfs2_map_and_dirty_page(inode, handle, 0, page_end, page, 0, ++ &phys); + } + + spin_lock(&oi->ip_lock); +@@ -7183,8 +7163,8 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, + } + + out_unlock: +- if (pages) +- ocfs2_unlock_and_free_pages(pages, num_pages); ++ if (page) ++ ocfs2_unlock_and_free_pages(&page, num_pages); + + out_commit: + if (ret < 0 && did_quota) +@@ -7208,8 +7188,6 @@ out_commit: + out: + if (data_ac) + ocfs2_free_alloc_context(data_ac); +-free_pages: +- kfree(pages); + return ret; + } + +diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c +index 60b4b6df1ed36..eaec97892dce8 100644 +--- a/fs/ocfs2/super.c ++++ b/fs/ocfs2/super.c +@@ -2150,11 +2150,17 @@ static int ocfs2_initialize_super(struct super_block *sb, + } + + if (ocfs2_clusterinfo_valid(osb)) { ++ /* ++ * ci_stack and ci_cluster in ocfs2_cluster_info may not be null ++ * terminated, so make sure no overflow happens here by using ++ * memcpy. Destination strings will always be null terminated ++ * because osb is allocated using kzalloc. ++ */ + osb->osb_stackflags = + OCFS2_RAW_SB(di)->s_cluster_info.ci_stackflags; +- strlcpy(osb->osb_cluster_stack, ++ memcpy(osb->osb_cluster_stack, + OCFS2_RAW_SB(di)->s_cluster_info.ci_stack, +- OCFS2_STACK_LABEL_LEN + 1); ++ OCFS2_STACK_LABEL_LEN); + if (strlen(osb->osb_cluster_stack) != OCFS2_STACK_LABEL_LEN) { + mlog(ML_ERROR, + "couldn't mount because of an invalid " +@@ -2163,9 +2169,9 @@ static int ocfs2_initialize_super(struct super_block *sb, + status = -EINVAL; + goto bail; + } +- strlcpy(osb->osb_cluster_name, ++ memcpy(osb->osb_cluster_name, + OCFS2_RAW_SB(di)->s_cluster_info.ci_cluster, +- OCFS2_CLUSTER_NAME_LEN + 1); ++ OCFS2_CLUSTER_NAME_LEN); + } else { + /* The empty string is identical with classic tools that + * don't know about s_cluster_info. */ +diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h +index b81f9e1d74b0a..9d249dfbab726 100644 +--- a/include/linux/elfcore.h ++++ b/include/linux/elfcore.h +@@ -58,7 +58,7 @@ static inline int elf_core_copy_task_xfpregs(struct task_struct *t, elf_fpxregse + } + #endif + +-#if defined(CONFIG_UM) || defined(CONFIG_IA64) ++#if (defined(CONFIG_UML) && defined(CONFIG_X86_32)) || defined(CONFIG_IA64) + /* + * These functions parameterize elf_core_dump in fs/binfmt_elf.c to write out + * extra segments containing the gate DSO contents. Dumping its +diff --git a/kernel/auditsc.c b/kernel/auditsc.c +index 4effe01ebbe2b..d33c5dccde1c7 100644 +--- a/kernel/auditsc.c ++++ b/kernel/auditsc.c +@@ -624,7 +624,7 @@ static int audit_filter_rules(struct task_struct *tsk, + result = audit_comparator(audit_loginuid_set(tsk), f->op, f->val); + break; + case AUDIT_SADDR_FAM: +- if (ctx->sockaddr) ++ if (ctx && ctx->sockaddr) + result = audit_comparator(ctx->sockaddr->ss_family, + f->op, f->val); + break; +diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c +index 01e893cf9b9f7..b28665f4d8c7a 100644 +--- a/kernel/dma/debug.c ++++ b/kernel/dma/debug.c +@@ -1354,6 +1354,12 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg, + if (unlikely(dma_debug_disabled())) + return; + ++ for_each_sg(sg, s, nents, i) { ++ check_for_stack(dev, sg_page(s), s->offset); ++ if (!PageHighMem(sg_page(s))) ++ check_for_illegal_area(dev, sg_virt(s), s->length); ++ } ++ + for_each_sg(sg, s, mapped_ents, i) { + entry = dma_entry_alloc(); + if (!entry) +@@ -1369,12 +1375,6 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg, + entry->sg_call_ents = nents; + entry->sg_mapped_ents = mapped_ents; + +- check_for_stack(dev, sg_page(s), s->offset); +- +- if (!PageHighMem(sg_page(s))) { +- check_for_illegal_area(dev, sg_virt(s), sg_dma_len(s)); +- } +- + check_sg_segment(dev, s); + + add_dma_entry(entry); +diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c +index 2b55016d5164b..efc338969b98b 100644 +--- a/kernel/trace/ftrace.c ++++ b/kernel/trace/ftrace.c +@@ -6336,7 +6336,7 @@ __ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip, + struct ftrace_ops *op; + int bit; + +- bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX); ++ bit = trace_test_and_set_recursion(TRACE_LIST_START); + if (bit < 0) + return; + +@@ -6411,7 +6411,7 @@ static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip, + { + int bit; + +- bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX); ++ bit = trace_test_and_set_recursion(TRACE_LIST_START); + if (bit < 0) + return; + +diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h +index fc3aa81a43e3c..35e9a01b54800 100644 +--- a/kernel/trace/trace.h ++++ b/kernel/trace/trace.h +@@ -518,23 +518,8 @@ struct tracer { + * When function tracing occurs, the following steps are made: + * If arch does not support a ftrace feature: + * call internal function (uses INTERNAL bits) which calls... +- * If callback is registered to the "global" list, the list +- * function is called and recursion checks the GLOBAL bits. +- * then this function calls... + * The function callback, which can use the FTRACE bits to + * check for recursion. +- * +- * Now if the arch does not suppport a feature, and it calls +- * the global list function which calls the ftrace callback +- * all three of these steps will do a recursion protection. +- * There's no reason to do one if the previous caller already +- * did. The recursion that we are protecting against will +- * go through the same steps again. +- * +- * To prevent the multiple recursion checks, if a recursion +- * bit is set that is higher than the MAX bit of the current +- * check, then we know that the check was made by the previous +- * caller, and we can skip the current check. + */ + enum { + TRACE_BUFFER_BIT, +@@ -547,12 +532,14 @@ enum { + TRACE_FTRACE_NMI_BIT, + TRACE_FTRACE_IRQ_BIT, + TRACE_FTRACE_SIRQ_BIT, ++ TRACE_FTRACE_TRANSITION_BIT, + +- /* INTERNAL_BITs must be greater than FTRACE_BITs */ ++ /* Internal use recursion bits */ + TRACE_INTERNAL_BIT, + TRACE_INTERNAL_NMI_BIT, + TRACE_INTERNAL_IRQ_BIT, + TRACE_INTERNAL_SIRQ_BIT, ++ TRACE_INTERNAL_TRANSITION_BIT, + + TRACE_BRANCH_BIT, + /* +@@ -592,12 +579,6 @@ enum { + * function is called to clear it. + */ + TRACE_GRAPH_NOTRACE_BIT, +- +- /* +- * When transitioning between context, the preempt_count() may +- * not be correct. Allow for a single recursion to cover this case. +- */ +- TRACE_TRANSITION_BIT, + }; + + #define trace_recursion_set(bit) do { (current)->trace_recursion |= (1<<(bit)); } while (0) +@@ -617,12 +598,18 @@ enum { + #define TRACE_CONTEXT_BITS 4 + + #define TRACE_FTRACE_START TRACE_FTRACE_BIT +-#define TRACE_FTRACE_MAX ((1 << (TRACE_FTRACE_START + TRACE_CONTEXT_BITS)) - 1) + + #define TRACE_LIST_START TRACE_INTERNAL_BIT +-#define TRACE_LIST_MAX ((1 << (TRACE_LIST_START + TRACE_CONTEXT_BITS)) - 1) + +-#define TRACE_CONTEXT_MASK TRACE_LIST_MAX ++#define TRACE_CONTEXT_MASK ((1 << (TRACE_LIST_START + TRACE_CONTEXT_BITS)) - 1) ++ ++enum { ++ TRACE_CTX_NMI, ++ TRACE_CTX_IRQ, ++ TRACE_CTX_SOFTIRQ, ++ TRACE_CTX_NORMAL, ++ TRACE_CTX_TRANSITION, ++}; + + static __always_inline int trace_get_context_bit(void) + { +@@ -630,59 +617,48 @@ static __always_inline int trace_get_context_bit(void) + + if (in_interrupt()) { + if (in_nmi()) +- bit = 0; ++ bit = TRACE_CTX_NMI; + + else if (in_irq()) +- bit = 1; ++ bit = TRACE_CTX_IRQ; + else +- bit = 2; ++ bit = TRACE_CTX_SOFTIRQ; + } else +- bit = 3; ++ bit = TRACE_CTX_NORMAL; + + return bit; + } + +-static __always_inline int trace_test_and_set_recursion(int start, int max) ++static __always_inline int trace_test_and_set_recursion(int start) + { + unsigned int val = current->trace_recursion; + int bit; + +- /* A previous recursion check was made */ +- if ((val & TRACE_CONTEXT_MASK) > max) +- return 0; +- + bit = trace_get_context_bit() + start; + if (unlikely(val & (1 << bit))) { + /* + * It could be that preempt_count has not been updated during + * a switch between contexts. Allow for a single recursion. + */ +- bit = TRACE_TRANSITION_BIT; ++ bit = start + TRACE_CTX_TRANSITION; + if (trace_recursion_test(bit)) + return -1; + trace_recursion_set(bit); + barrier(); +- return bit + 1; ++ return bit; + } + +- /* Normal check passed, clear the transition to allow it again */ +- trace_recursion_clear(TRACE_TRANSITION_BIT); +- + val |= 1 << bit; + current->trace_recursion = val; + barrier(); + +- return bit + 1; ++ return bit; + } + + static __always_inline void trace_clear_recursion(int bit) + { + unsigned int val = current->trace_recursion; + +- if (!bit) +- return; +- +- bit--; + bit = 1 << bit; + val &= ~bit; + +diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c +index b611cd36e22db..4e8acfe3437fd 100644 +--- a/kernel/trace/trace_functions.c ++++ b/kernel/trace/trace_functions.c +@@ -138,7 +138,7 @@ function_trace_call(unsigned long ip, unsigned long parent_ip, + pc = preempt_count(); + preempt_disable_notrace(); + +- bit = trace_test_and_set_recursion(TRACE_FTRACE_START, TRACE_FTRACE_MAX); ++ bit = trace_test_and_set_recursion(TRACE_FTRACE_START); + if (bit < 0) + goto out; + +diff --git a/mm/slub.c b/mm/slub.c +index ca7143fe25b56..63fe43c8d3323 100644 +--- a/mm/slub.c ++++ b/mm/slub.c +@@ -1455,7 +1455,8 @@ static __always_inline bool slab_free_hook(struct kmem_cache *s, void *x) + } + + static inline bool slab_free_freelist_hook(struct kmem_cache *s, +- void **head, void **tail) ++ void **head, void **tail, ++ int *cnt) + { + + void *object; +@@ -1490,6 +1491,12 @@ static inline bool slab_free_freelist_hook(struct kmem_cache *s, + *head = object; + if (!*tail) + *tail = object; ++ } else { ++ /* ++ * Adjust the reconstructed freelist depth ++ * accordingly if object's reuse is delayed. ++ */ ++ --(*cnt); + } + } while (object != old_tail); + +@@ -3049,7 +3056,7 @@ static __always_inline void slab_free(struct kmem_cache *s, struct page *page, + * With KASAN enabled slab_free_freelist_hook modifies the freelist + * to remove objects, whose reuse must be delayed. + */ +- if (slab_free_freelist_hook(s, &head, &tail)) ++ if (slab_free_freelist_hook(s, &head, &tail, &cnt)) + do_slab_free(s, page, head, tail, cnt, addr); + } + +@@ -3727,8 +3734,8 @@ static int kmem_cache_open(struct kmem_cache *s, slab_flags_t flags) + if (alloc_kmem_cache_cpus(s)) + return 0; + +- free_kmem_cache_nodes(s); + error: ++ __kmem_cache_release(s); + return -EINVAL; + } + +diff --git a/net/can/j1939/j1939-priv.h b/net/can/j1939/j1939-priv.h +index 12369b604ce95..cea712fb2a9e0 100644 +--- a/net/can/j1939/j1939-priv.h ++++ b/net/can/j1939/j1939-priv.h +@@ -326,6 +326,7 @@ int j1939_session_activate(struct j1939_session *session); + void j1939_tp_schedule_txtimer(struct j1939_session *session, int msec); + void j1939_session_timers_cancel(struct j1939_session *session); + ++#define J1939_MIN_TP_PACKET_SIZE 9 + #define J1939_MAX_TP_PACKET_SIZE (7 * 0xff) + #define J1939_MAX_ETP_PACKET_SIZE (7 * 0x00ffffff) + +diff --git a/net/can/j1939/main.c b/net/can/j1939/main.c +index 6884d18f919c7..266c189f1e809 100644 +--- a/net/can/j1939/main.c ++++ b/net/can/j1939/main.c +@@ -249,11 +249,14 @@ struct j1939_priv *j1939_netdev_start(struct net_device *ndev) + struct j1939_priv *priv, *priv_new; + int ret; + +- priv = j1939_priv_get_by_ndev(ndev); ++ spin_lock(&j1939_netdev_lock); ++ priv = j1939_priv_get_by_ndev_locked(ndev); + if (priv) { + kref_get(&priv->rx_kref); ++ spin_unlock(&j1939_netdev_lock); + return priv; + } ++ spin_unlock(&j1939_netdev_lock); + + priv = j1939_priv_create(ndev); + if (!priv) +@@ -269,10 +272,10 @@ struct j1939_priv *j1939_netdev_start(struct net_device *ndev) + /* Someone was faster than us, use their priv and roll + * back our's. + */ ++ kref_get(&priv_new->rx_kref); + spin_unlock(&j1939_netdev_lock); + dev_put(ndev); + kfree(priv); +- kref_get(&priv_new->rx_kref); + return priv_new; + } + j1939_priv_set(ndev, priv); +diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c +index 6571895228f01..7a54170da09df 100644 +--- a/net/can/j1939/transport.c ++++ b/net/can/j1939/transport.c +@@ -1230,12 +1230,11 @@ static enum hrtimer_restart j1939_tp_rxtimer(struct hrtimer *hrtimer) + session->err = -ETIME; + j1939_session_deactivate(session); + } else { +- netdev_alert(priv->ndev, "%s: 0x%p: rx timeout, send abort\n", +- __func__, session); +- + j1939_session_list_lock(session->priv); + if (session->state >= J1939_SESSION_ACTIVE && + session->state < J1939_SESSION_ACTIVE_MAX) { ++ netdev_alert(priv->ndev, "%s: 0x%p: rx timeout, send abort\n", ++ __func__, session); + j1939_session_get(session); + hrtimer_start(&session->rxtimer, + ms_to_ktime(J1939_XTP_ABORT_TIMEOUT_MS), +@@ -1597,6 +1596,8 @@ j1939_session *j1939_xtp_rx_rts_session_new(struct j1939_priv *priv, + abort = J1939_XTP_ABORT_FAULT; + else if (len > priv->tp_max_packet_size) + abort = J1939_XTP_ABORT_RESOURCE; ++ else if (len < J1939_MIN_TP_PACKET_SIZE) ++ abort = J1939_XTP_ABORT_FAULT; + } + + if (abort != J1939_XTP_NO_ABORT) { +@@ -1771,6 +1772,7 @@ static void j1939_xtp_rx_dpo(struct j1939_priv *priv, struct sk_buff *skb, + static void j1939_xtp_rx_dat_one(struct j1939_session *session, + struct sk_buff *skb) + { ++ enum j1939_xtp_abort abort = J1939_XTP_ABORT_FAULT; + struct j1939_priv *priv = session->priv; + struct j1939_sk_buff_cb *skcb; + struct sk_buff *se_skb = NULL; +@@ -1785,9 +1787,11 @@ static void j1939_xtp_rx_dat_one(struct j1939_session *session, + + skcb = j1939_skb_to_cb(skb); + dat = skb->data; +- if (skb->len <= 1) ++ if (skb->len != 8) { + /* makes no sense */ ++ abort = J1939_XTP_ABORT_UNEXPECTED_DATA; + goto out_session_cancel; ++ } + + switch (session->last_cmd) { + case 0xff: +@@ -1885,7 +1889,7 @@ static void j1939_xtp_rx_dat_one(struct j1939_session *session, + out_session_cancel: + kfree_skb(se_skb); + j1939_session_timers_cancel(session); +- j1939_session_cancel(session, J1939_XTP_ABORT_FAULT); ++ j1939_session_cancel(session, abort); + j1939_session_put(session); + } + +diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig +index 91efae88e8c2a..ef72819d9d315 100644 +--- a/net/netfilter/Kconfig ++++ b/net/netfilter/Kconfig +@@ -94,7 +94,7 @@ config NF_CONNTRACK_MARK + config NF_CONNTRACK_SECMARK + bool 'Connection tracking security mark support' + depends on NETWORK_SECMARK +- default m if NETFILTER_ADVANCED=n ++ default y if NETFILTER_ADVANCED=n + help + This option enables security markings to be applied to + connections. Typically they are copied to connections from +diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c +index f93fa0e210979..07242503d74d3 100644 +--- a/net/netfilter/ipvs/ip_vs_ctl.c ++++ b/net/netfilter/ipvs/ip_vs_ctl.c +@@ -4047,6 +4047,11 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs) + tbl[idx++].data = &ipvs->sysctl_conn_reuse_mode; + tbl[idx++].data = &ipvs->sysctl_schedule_icmp; + tbl[idx++].data = &ipvs->sysctl_ignore_tunneled; ++#ifdef CONFIG_IP_VS_DEBUG ++ /* Global sysctls must be ro in non-init netns */ ++ if (!net_eq(net, &init_net)) ++ tbl[idx++].mode = 0444; ++#endif + + ipvs->sysctl_hdr = register_net_sysctl(net, "net/ipv4/vs", tbl); + if (ipvs->sysctl_hdr == NULL) { +diff --git a/net/nfc/nci/rsp.c b/net/nfc/nci/rsp.c +index a48297b79f34f..b0ed2b47ac437 100644 +--- a/net/nfc/nci/rsp.c ++++ b/net/nfc/nci/rsp.c +@@ -277,6 +277,8 @@ static void nci_core_conn_close_rsp_packet(struct nci_dev *ndev, + ndev->cur_conn_id); + if (conn_info) { + list_del(&conn_info->list); ++ if (conn_info == ndev->rf_conn_info) ++ ndev->rf_conn_info = NULL; + devm_kfree(&ndev->nfc_dev->dev, conn_info); + } + } +diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c +index ea9ddea35a886..96773555af5ca 100644 +--- a/net/switchdev/switchdev.c ++++ b/net/switchdev/switchdev.c +@@ -476,6 +476,9 @@ static int __switchdev_handle_port_obj_add(struct net_device *dev, + * necessary to go through this helper. + */ + netdev_for_each_lower_dev(dev, lower_dev, iter) { ++ if (netif_is_bridge_master(lower_dev)) ++ continue; ++ + err = __switchdev_handle_port_obj_add(lower_dev, port_obj_info, + check_cb, add_cb); + if (err && err != -EOPNOTSUPP) +@@ -528,6 +531,9 @@ static int __switchdev_handle_port_obj_del(struct net_device *dev, + * necessary to go through this helper. + */ + netdev_for_each_lower_dev(dev, lower_dev, iter) { ++ if (netif_is_bridge_master(lower_dev)) ++ continue; ++ + err = __switchdev_handle_port_obj_del(lower_dev, port_obj_info, + check_cb, del_cb); + if (err && err != -EOPNOTSUPP) +@@ -579,6 +585,9 @@ static int __switchdev_handle_port_attr_set(struct net_device *dev, + * necessary to go through this helper. + */ + netdev_for_each_lower_dev(dev, lower_dev, iter) { ++ if (netif_is_bridge_master(lower_dev)) ++ continue; ++ + err = __switchdev_handle_port_attr_set(lower_dev, port_attr_info, + check_cb, set_cb); + if (err && err != -EOPNOTSUPP) +diff --git a/scripts/Makefile.gcc-plugins b/scripts/Makefile.gcc-plugins +index 5f7df50cfe7aa..63d21489216b0 100644 +--- a/scripts/Makefile.gcc-plugins ++++ b/scripts/Makefile.gcc-plugins +@@ -19,6 +19,10 @@ gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF) \ + += -fplugin-arg-structleak_plugin-byref + gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL) \ + += -fplugin-arg-structleak_plugin-byref-all ++ifdef CONFIG_GCC_PLUGIN_STRUCTLEAK ++ DISABLE_STRUCTLEAK_PLUGIN += -fplugin-arg-structleak_plugin-disable ++endif ++export DISABLE_STRUCTLEAK_PLUGIN + gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) \ + += -DSTRUCTLEAK_PLUGIN + +diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c +index 7e7be8e4dcf9c..87ba66dcfd478 100644 +--- a/sound/hda/hdac_controller.c ++++ b/sound/hda/hdac_controller.c +@@ -395,8 +395,9 @@ int snd_hdac_bus_reset_link(struct hdac_bus *bus, bool full_reset) + if (!full_reset) + goto skip_reset; + +- /* clear STATESTS */ +- snd_hdac_chip_writew(bus, STATESTS, STATESTS_INT_MASK); ++ /* clear STATESTS if not in reset */ ++ if (snd_hdac_chip_readb(bus, GCTL) & AZX_GCTL_RESET) ++ snd_hdac_chip_writew(bus, STATESTS, STATESTS_INT_MASK); + + /* reset controller */ + snd_hdac_bus_enter_link_reset(bus); +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index c4837c78a8624..49aefb7875e72 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -2537,6 +2537,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { + SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), + SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), + SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS), ++ SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS), + SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), + SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS), + SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS), +diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c +index 708fc4ed54eda..512f8899dcbbd 100644 +--- a/sound/soc/codecs/wm8960.c ++++ b/sound/soc/codecs/wm8960.c +@@ -752,9 +752,16 @@ static int wm8960_configure_clocking(struct snd_soc_component *component) + int i, j, k; + int ret; + +- if (!(iface1 & (1<<6))) { +- dev_dbg(component->dev, +- "Codec is slave mode, no need to configure clock\n"); ++ /* ++ * For Slave mode clocking should still be configured, ++ * so this if statement should be removed, but some platform ++ * may not work if the sysclk is not configured, to avoid such ++ * compatible issue, just add '!wm8960->sysclk' condition in ++ * this if statement. ++ */ ++ if (!(iface1 & (1 << 6)) && !wm8960->sysclk) { ++ dev_warn(component->dev, ++ "slave mode, but proceeding with no clock configuration\n"); + return 0; + } + +diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c +index 7c4d5963692dd..66f6b698a5436 100644 +--- a/sound/soc/soc-dapm.c ++++ b/sound/soc/soc-dapm.c +@@ -2546,6 +2546,7 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm, + const char *pin, int status) + { + struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); ++ int ret = 0; + + dapm_assert_locked(dapm); + +@@ -2558,13 +2559,14 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm, + dapm_mark_dirty(w, "pin configuration"); + dapm_widget_invalidate_input_paths(w); + dapm_widget_invalidate_output_paths(w); ++ ret = 1; + } + + w->connected = status; + if (status == 0) + w->force = 0; + +- return 0; ++ return ret; + } + + /** +@@ -3580,14 +3582,15 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol, + { + struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); + const char *pin = (const char *)kcontrol->private_value; ++ int ret; + + if (ucontrol->value.integer.value[0]) +- snd_soc_dapm_enable_pin(&card->dapm, pin); ++ ret = snd_soc_dapm_enable_pin(&card->dapm, pin); + else +- snd_soc_dapm_disable_pin(&card->dapm, pin); ++ ret = snd_soc_dapm_disable_pin(&card->dapm, pin); + + snd_soc_dapm_sync(&card->dapm); +- return 0; ++ return ret; + } + EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch); + +@@ -4029,7 +4032,7 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol, + + rtd->params_select = ucontrol->value.enumerated.item[0]; + +- return 0; ++ return 1; + } + + static void +diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h +index 9620ae0003ce4..01dee2074ab36 100644 +--- a/sound/usb/quirks-table.h ++++ b/sound/usb/quirks-table.h +@@ -3806,5 +3806,37 @@ ALC1220_VB_DESKTOP(0x26ce, 0x0a01), /* Asrock TRX40 Creator */ + } + } + }, ++{ ++ /* ++ * Sennheiser GSP670 ++ * Change order of interfaces loaded ++ */ ++ USB_DEVICE(0x1395, 0x0300), ++ .bInterfaceClass = USB_CLASS_PER_INTERFACE, ++ .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { ++ .ifnum = QUIRK_ANY_INTERFACE, ++ .type = QUIRK_COMPOSITE, ++ .data = &(const struct snd_usb_audio_quirk[]) { ++ // Communication ++ { ++ .ifnum = 3, ++ .type = QUIRK_AUDIO_STANDARD_INTERFACE ++ }, ++ // Recording ++ { ++ .ifnum = 4, ++ .type = QUIRK_AUDIO_STANDARD_INTERFACE ++ }, ++ // Main ++ { ++ .ifnum = 1, ++ .type = QUIRK_AUDIO_STANDARD_INTERFACE ++ }, ++ { ++ .ifnum = -1 ++ } ++ } ++ } ++}, + + #undef USB_DEVICE_VENDOR_SPEC +diff --git a/tools/testing/selftests/netfilter/nft_flowtable.sh b/tools/testing/selftests/netfilter/nft_flowtable.sh +index 16571ac1dab40..1ccb12fe2511a 100755 +--- a/tools/testing/selftests/netfilter/nft_flowtable.sh ++++ b/tools/testing/selftests/netfilter/nft_flowtable.sh +@@ -174,7 +174,6 @@ fi + ip netns exec ns1 ping -c 1 -q 10.0.2.99 > /dev/null + if [ $? -ne 0 ];then + echo "ERROR: ns1 cannot reach ns2" 1>&2 +- bash + exit 1 + fi +