commit:     4ee39adbcd6679173df7cf39402a7343df4f580b
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sun Jun 16 14:33:36 2024 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sun Jun 16 14:33:36 2024 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=4ee39adb

Linux patch 6.1.94

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README             |    4 +
 1093_linux-6.1.94.patch | 3788 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3792 insertions(+)

diff --git a/0000_README b/0000_README
index 87ce6763..f71731e0 100644
--- a/0000_README
+++ b/0000_README
@@ -415,6 +415,10 @@ Patch:  1092_linux-6.1.93.patch
 From:   https://www.kernel.org
 Desc:   Linux 6.1.93
 
+Patch:  1093_linux-6.1.94.patch
+From:   https://www.kernel.org
+Desc:   Linux 6.1.94
+
 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/1093_linux-6.1.94.patch b/1093_linux-6.1.94.patch
new file mode 100644
index 00000000..ef37672b
--- /dev/null
+++ b/1093_linux-6.1.94.patch
@@ -0,0 +1,3788 @@
+diff --git a/Documentation/mm/arch_pgtable_helpers.rst 
b/Documentation/mm/arch_pgtable_helpers.rst
+index cbaee9e592410..511b4314095b5 100644
+--- a/Documentation/mm/arch_pgtable_helpers.rst
++++ b/Documentation/mm/arch_pgtable_helpers.rst
+@@ -136,7 +136,8 @@ PMD Page Table Helpers
+ 
+---------------------------+--------------------------------------------------+
+ | pmd_swp_clear_soft_dirty  | Clears a soft dirty swapped PMD                 
 |
+ 
+---------------------------+--------------------------------------------------+
+-| pmd_mkinvalid             | Invalidates a mapped PMD [1]                    
 |
++| pmd_mkinvalid             | Invalidates a present PMD; do not call for      
 |
++|                           | non-present PMD [1]                             
 |
+ 
+---------------------------+--------------------------------------------------+
+ | pmd_set_huge              | Creates a PMD huge mapping                      
 |
+ 
+---------------------------+--------------------------------------------------+
+@@ -192,7 +193,8 @@ PUD Page Table Helpers
+ 
+---------------------------+--------------------------------------------------+
+ | pud_mkdevmap              | Creates a ZONE_DEVICE mapped PUD                
 |
+ 
+---------------------------+--------------------------------------------------+
+-| pud_mkinvalid             | Invalidates a mapped PUD [1]                    
 |
++| pud_mkinvalid             | Invalidates a present PUD; do not call for      
 |
++|                           | non-present PUD [1]                             
 |
+ 
+---------------------------+--------------------------------------------------+
+ | pud_set_huge              | Creates a PUD huge mapping                      
 |
+ 
+---------------------------+--------------------------------------------------+
+diff --git a/Makefile b/Makefile
+index c5147f1c46f87..6c21684b032ee 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 6
+ PATCHLEVEL = 1
+-SUBLEVEL = 93
++SUBLEVEL = 94
+ EXTRAVERSION =
+ NAME = Curry Ramen
+ 
+diff --git a/arch/arm64/boot/dts/hisilicon/hi3798cv200.dtsi 
b/arch/arm64/boot/dts/hisilicon/hi3798cv200.dtsi
+index a83b9d4f172e3..add54f4e7be97 100644
+--- a/arch/arm64/boot/dts/hisilicon/hi3798cv200.dtsi
++++ b/arch/arm64/boot/dts/hisilicon/hi3798cv200.dtsi
+@@ -58,7 +58,7 @@ cpu@3 {
+       gic: interrupt-controller@f1001000 {
+               compatible = "arm,gic-400";
+               reg = <0x0 0xf1001000 0x0 0x1000>,  /* GICD */
+-                    <0x0 0xf1002000 0x0 0x100>;   /* GICC */
++                    <0x0 0xf1002000 0x0 0x2000>;  /* GICC */
+               #address-cells = <0>;
+               #interrupt-cells = <3>;
+               interrupt-controller;
+diff --git a/arch/arm64/boot/dts/nvidia/tegra132-norrin.dts 
b/arch/arm64/boot/dts/nvidia/tegra132-norrin.dts
+index d461da0b80492..22cb4d5f0416e 100644
+--- a/arch/arm64/boot/dts/nvidia/tegra132-norrin.dts
++++ b/arch/arm64/boot/dts/nvidia/tegra132-norrin.dts
+@@ -9,8 +9,8 @@ / {
+       compatible = "nvidia,norrin", "nvidia,tegra132", "nvidia,tegra124";
+ 
+       aliases {
+-              rtc0 = "/i2c@7000d000/as3722@40";
+-              rtc1 = "/rtc@7000e000";
++              rtc0 = &as3722;
++              rtc1 = &tegra_rtc;
+               serial0 = &uarta;
+       };
+ 
+diff --git a/arch/arm64/boot/dts/nvidia/tegra132.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra132.dtsi
+index 3673f79adf1a9..ca8960f0c4ab9 100644
+--- a/arch/arm64/boot/dts/nvidia/tegra132.dtsi
++++ b/arch/arm64/boot/dts/nvidia/tegra132.dtsi
+@@ -579,7 +579,7 @@ spi@7000de00 {
+               status = "disabled";
+       };
+ 
+-      rtc@7000e000 {
++      tegra_rtc: rtc@7000e000 {
+               compatible = "nvidia,tegra124-rtc", "nvidia,tegra20-rtc";
+               reg = <0x0 0x7000e000 0x0 0x100>;
+               interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
+diff --git a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi 
b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi
+index 1678ef0f8684f..737a67e0a6ad7 100644
+--- a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi
++++ b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi
+@@ -60,7 +60,7 @@ bluetooth {
+               vddrf-supply = <&vreg_l1_1p3>;
+               vddch0-supply = <&vdd_ch0_3p3>;
+ 
+-              local-bd-address = [ 02 00 00 00 5a ad ];
++              local-bd-address = [ 00 00 00 00 00 00 ];
+ 
+               max-speed = <3200000>;
+       };
+diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
+index f44ae09a51956..5dbaf3fe90221 100644
+--- a/arch/arm64/kvm/guest.c
++++ b/arch/arm64/kvm/guest.c
+@@ -250,6 +250,7 @@ static int set_core_reg(struct kvm_vcpu *vcpu, const 
struct kvm_one_reg *reg)
+               case PSR_AA32_MODE_SVC:
+               case PSR_AA32_MODE_ABT:
+               case PSR_AA32_MODE_UND:
++              case PSR_AA32_MODE_SYS:
+                       if (!vcpu_el1_is_32bit(vcpu))
+                               return -EINVAL;
+                       break;
+@@ -270,7 +271,7 @@ static int set_core_reg(struct kvm_vcpu *vcpu, const 
struct kvm_one_reg *reg)
+       if (*vcpu_cpsr(vcpu) & PSR_MODE32_BIT) {
+               int i, nr_reg;
+ 
+-              switch (*vcpu_cpsr(vcpu)) {
++              switch (*vcpu_cpsr(vcpu) & PSR_AA32_MODE_MASK) {
+               /*
+                * Either we are dealing with user mode, and only the
+                * first 15 registers (+ PC) must be narrowed to 32bit.
+diff --git a/arch/arm64/kvm/hyp/aarch32.c b/arch/arm64/kvm/hyp/aarch32.c
+index f98cbe2626a1c..19efb41aab805 100644
+--- a/arch/arm64/kvm/hyp/aarch32.c
++++ b/arch/arm64/kvm/hyp/aarch32.c
+@@ -50,9 +50,23 @@ bool kvm_condition_valid32(const struct kvm_vcpu *vcpu)
+       u32 cpsr_cond;
+       int cond;
+ 
+-      /* Top two bits non-zero?  Unconditional. */
+-      if (kvm_vcpu_get_esr(vcpu) >> 30)
++      /*
++       * These are the exception classes that could fire with a
++       * conditional instruction.
++       */
++      switch (kvm_vcpu_trap_get_class(vcpu)) {
++      case ESR_ELx_EC_CP15_32:
++      case ESR_ELx_EC_CP15_64:
++      case ESR_ELx_EC_CP14_MR:
++      case ESR_ELx_EC_CP14_LS:
++      case ESR_ELx_EC_FP_ASIMD:
++      case ESR_ELx_EC_CP10_ID:
++      case ESR_ELx_EC_CP14_64:
++      case ESR_ELx_EC_SVC32:
++              break;
++      default:
+               return true;
++      }
+ 
+       /* Is condition field valid? */
+       cond = kvm_vcpu_get_condition(vcpu);
+diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h
+index 6faaaa3ebe9b8..e93baddf3a2e7 100644
+--- a/arch/parisc/include/asm/page.h
++++ b/arch/parisc/include/asm/page.h
+@@ -16,6 +16,7 @@
+ #define PAGE_SIZE     (_AC(1,UL) << PAGE_SHIFT)
+ #define PAGE_MASK     (~(PAGE_SIZE-1))
+ 
++#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
+ 
+ #ifndef __ASSEMBLY__
+ 
+diff --git a/arch/parisc/include/asm/signal.h 
b/arch/parisc/include/asm/signal.h
+index 715c96ba2ec81..e84883c6b4c7a 100644
+--- a/arch/parisc/include/asm/signal.h
++++ b/arch/parisc/include/asm/signal.h
+@@ -4,23 +4,11 @@
+ 
+ #include <uapi/asm/signal.h>
+ 
+-#define _NSIG         64
+-/* bits-per-word, where word apparently means 'long' not 'int' */
+-#define _NSIG_BPW     BITS_PER_LONG
+-#define _NSIG_WORDS   (_NSIG / _NSIG_BPW)
+-
+ # ifndef __ASSEMBLY__
+ 
+ /* Most things should be clean enough to redefine this at will, if care
+    is taken to make libc match.  */
+ 
+-typedef unsigned long old_sigset_t;           /* at least 32 bits */
+-
+-typedef struct {
+-      /* next_signal() assumes this is a long - no choice */
+-      unsigned long sig[_NSIG_WORDS];
+-} sigset_t;
+-
+ #include <asm/sigcontext.h>
+ 
+ #endif /* !__ASSEMBLY */
+diff --git a/arch/parisc/include/uapi/asm/signal.h 
b/arch/parisc/include/uapi/asm/signal.h
+index 8e4895c5ea5d3..40d7a574c5dd1 100644
+--- a/arch/parisc/include/uapi/asm/signal.h
++++ b/arch/parisc/include/uapi/asm/signal.h
+@@ -57,10 +57,20 @@
+ 
+ #include <asm-generic/signal-defs.h>
+ 
++#define _NSIG         64
++#define _NSIG_BPW     (sizeof(unsigned long) * 8)
++#define _NSIG_WORDS   (_NSIG / _NSIG_BPW)
++
+ # ifndef __ASSEMBLY__
+ 
+ #  include <linux/types.h>
+ 
++typedef unsigned long old_sigset_t;   /* at least 32 bits */
++
++typedef struct {
++      unsigned long sig[_NSIG_WORDS];
++} sigset_t;
++
+ /* Avoid too many header ordering problems.  */
+ struct siginfo;
+ 
+diff --git a/arch/powerpc/mm/book3s64/pgtable.c 
b/arch/powerpc/mm/book3s64/pgtable.c
+index 87aa76c737995..a3bce0895b7d2 100644
+--- a/arch/powerpc/mm/book3s64/pgtable.c
++++ b/arch/powerpc/mm/book3s64/pgtable.c
+@@ -124,6 +124,7 @@ pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned 
long address,
+ {
+       unsigned long old_pmd;
+ 
++      VM_WARN_ON_ONCE(!pmd_present(*pmdp));
+       old_pmd = pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 
_PAGE_INVALID);
+       flush_pmd_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
+       return __pmd(old_pmd);
+diff --git a/arch/powerpc/net/bpf_jit_comp32.c 
b/arch/powerpc/net/bpf_jit_comp32.c
+index 8643b2c8b76ef..7b3bf859433a5 100644
+--- a/arch/powerpc/net/bpf_jit_comp32.c
++++ b/arch/powerpc/net/bpf_jit_comp32.c
+@@ -814,6 +814,15 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, 
struct codegen_context *
+ 
+                       /* Get offset into TMP_REG */
+                       EMIT(PPC_RAW_LI(tmp_reg, off));
++                      /*
++                       * Enforce full ordering for operations with BPF_FETCH 
by emitting a 'sync'
++                       * before and after the operation.
++                       *
++                       * This is a requirement in the Linux Kernel Memory 
Model.
++                       * See __cmpxchg_u32() in asm/cmpxchg.h as an example.
++                       */
++                      if ((imm & BPF_FETCH) && IS_ENABLED(CONFIG_SMP))
++                              EMIT(PPC_RAW_SYNC());
+                       tmp_idx = ctx->idx * 4;
+                       /* load value from memory into r0 */
+                       EMIT(PPC_RAW_LWARX(_R0, tmp_reg, dst_reg, 0));
+@@ -867,6 +876,9 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, 
struct codegen_context *
+ 
+                       /* For the BPF_FETCH variant, get old data into src_reg 
*/
+                       if (imm & BPF_FETCH) {
++                              /* Emit 'sync' to enforce full ordering */
++                              if (IS_ENABLED(CONFIG_SMP))
++                                      EMIT(PPC_RAW_SYNC());
+                               EMIT(PPC_RAW_MR(ret_reg, ax_reg));
+                               if (!fp->aux->verifier_zext)
+                                       EMIT(PPC_RAW_LI(ret_reg - 1, 0)); /* 
higher 32-bit */
+diff --git a/arch/powerpc/net/bpf_jit_comp64.c 
b/arch/powerpc/net/bpf_jit_comp64.c
+index 29ee306d6302e..dcb625404938f 100644
+--- a/arch/powerpc/net/bpf_jit_comp64.c
++++ b/arch/powerpc/net/bpf_jit_comp64.c
+@@ -784,6 +784,15 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, 
struct codegen_context *
+ 
+                       /* Get offset into TMP_REG_1 */
+                       EMIT(PPC_RAW_LI(tmp1_reg, off));
++                      /*
++                       * Enforce full ordering for operations with BPF_FETCH 
by emitting a 'sync'
++                       * before and after the operation.
++                       *
++                       * This is a requirement in the Linux Kernel Memory 
Model.
++                       * See __cmpxchg_u64() in asm/cmpxchg.h as an example.
++                       */
++                      if ((imm & BPF_FETCH) && IS_ENABLED(CONFIG_SMP))
++                              EMIT(PPC_RAW_SYNC());
+                       tmp_idx = ctx->idx * 4;
+                       /* load value from memory into TMP_REG_2 */
+                       if (size == BPF_DW)
+@@ -846,6 +855,9 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, 
struct codegen_context *
+                       PPC_BCC_SHORT(COND_NE, tmp_idx);
+ 
+                       if (imm & BPF_FETCH) {
++                              /* Emit 'sync' to enforce full ordering */
++                              if (IS_ENABLED(CONFIG_SMP))
++                                      EMIT(PPC_RAW_SYNC());
+                               EMIT(PPC_RAW_MR(ret_reg, _R0));
+                               /*
+                                * Skip unnecessary zero-extension for 32-bit 
cmpxchg.
+diff --git a/arch/riscv/kernel/signal.c b/arch/riscv/kernel/signal.c
+index dee66c9290cce..36bb15af6fa82 100644
+--- a/arch/riscv/kernel/signal.c
++++ b/arch/riscv/kernel/signal.c
+@@ -246,30 +246,6 @@ static void handle_signal(struct ksignal *ksig, struct 
pt_regs *regs)
+       sigset_t *oldset = sigmask_to_save();
+       int ret;
+ 
+-      /* Are we from a system call? */
+-      if (regs->cause == EXC_SYSCALL) {
+-              /* Avoid additional syscall restarting via ret_from_exception */
+-              regs->cause = -1UL;
+-              /* If so, check system call restarting.. */
+-              switch (regs->a0) {
+-              case -ERESTART_RESTARTBLOCK:
+-              case -ERESTARTNOHAND:
+-                      regs->a0 = -EINTR;
+-                      break;
+-
+-              case -ERESTARTSYS:
+-                      if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+-                              regs->a0 = -EINTR;
+-                              break;
+-                      }
+-                      fallthrough;
+-              case -ERESTARTNOINTR:
+-                        regs->a0 = regs->orig_a0;
+-                      regs->epc -= 0x4;
+-                      break;
+-              }
+-      }
+-
+       rseq_signal_deliver(ksig, regs);
+ 
+       /* Set up the stack frame */
+@@ -283,35 +259,66 @@ static void handle_signal(struct ksignal *ksig, struct 
pt_regs *regs)
+ 
+ static void do_signal(struct pt_regs *regs)
+ {
++      unsigned long continue_addr = 0, restart_addr = 0;
++      int retval = 0;
+       struct ksignal ksig;
++      bool syscall = (regs->cause == EXC_SYSCALL);
+ 
+-      if (get_signal(&ksig)) {
+-              /* Actually deliver the signal */
+-              handle_signal(&ksig, regs);
+-              return;
+-      }
++      /* If we were from a system call, check for system call restarting */
++      if (syscall) {
++              continue_addr = regs->epc;
++              restart_addr = continue_addr - 4;
++              retval = regs->a0;
+ 
+-      /* Did we come from a system call? */
+-      if (regs->cause == EXC_SYSCALL) {
+               /* Avoid additional syscall restarting via ret_from_exception */
+               regs->cause = -1UL;
+ 
+-              /* Restart the system call - no handlers present */
+-              switch (regs->a0) {
++              /*
++               * Prepare for system call restart. We do this here so that a
++               * debugger will see the already changed PC.
++               */
++              switch (retval) {
+               case -ERESTARTNOHAND:
+               case -ERESTARTSYS:
+               case -ERESTARTNOINTR:
+-                        regs->a0 = regs->orig_a0;
+-                      regs->epc -= 0x4;
+-                      break;
+               case -ERESTART_RESTARTBLOCK:
+-                        regs->a0 = regs->orig_a0;
+-                      regs->a7 = __NR_restart_syscall;
+-                      regs->epc -= 0x4;
++                      regs->a0 = regs->orig_a0;
++                      regs->epc = restart_addr;
+                       break;
+               }
+       }
+ 
++      /*
++       * Get the signal to deliver. When running under ptrace, at this point
++       * the debugger may change all of our registers.
++       */
++      if (get_signal(&ksig)) {
++              /*
++               * Depending on the signal settings, we may need to revert the
++               * decision to restart the system call, but skip this if a
++               * debugger has chosen to restart at a different PC.
++               */
++              if (regs->epc == restart_addr &&
++                  (retval == -ERESTARTNOHAND ||
++                   retval == -ERESTART_RESTARTBLOCK ||
++                   (retval == -ERESTARTSYS &&
++                    !(ksig.ka.sa.sa_flags & SA_RESTART)))) {
++                      regs->a0 = -EINTR;
++                      regs->epc = continue_addr;
++              }
++
++              /* Actually deliver the signal */
++              handle_signal(&ksig, regs);
++              return;
++      }
++
++      /*
++       * Handle restarting a different system call. As above, if a debugger
++       * has chosen to restart at a different PC, ignore the restart.
++       */
++      if (syscall && regs->epc == restart_addr && retval == 
-ERESTART_RESTARTBLOCK)
++              regs->a7 = __NR_restart_syscall;
++
+       /*
+        * If there is no signal to deliver, we just put the saved
+        * sigmask back.
+diff --git a/arch/s390/include/asm/cpacf.h b/arch/s390/include/asm/cpacf.h
+index 646b12981f208..0f6ff2008a159 100644
+--- a/arch/s390/include/asm/cpacf.h
++++ b/arch/s390/include/asm/cpacf.h
+@@ -161,28 +161,86 @@
+ 
+ typedef struct { unsigned char bytes[16]; } cpacf_mask_t;
+ 
+-/**
+- * cpacf_query() - check if a specific CPACF function is available
+- * @opcode: the opcode of the crypto instruction
+- * @func: the function code to test for
+- *
+- * Executes the query function for the given crypto instruction @opcode
+- * and checks if @func is available
+- *
+- * Returns 1 if @func is available for @opcode, 0 otherwise
++/*
++ * Prototype for a not existing function to produce a link
++ * error if __cpacf_query() or __cpacf_check_opcode() is used
++ * with an invalid compile time const opcode.
+  */
+-static __always_inline void __cpacf_query(unsigned int opcode, cpacf_mask_t 
*mask)
++void __cpacf_bad_opcode(void);
++
++static __always_inline void __cpacf_query_rre(u32 opc, u8 r1, u8 r2,
++                                            cpacf_mask_t *mask)
+ {
+       asm volatile(
+-              "       lghi    0,0\n" /* query function */
+-              "       lgr     1,%[mask]\n"
+-              "       spm     0\n" /* pckmo doesn't change the cc */
+-              /* Parameter regs are ignored, but must be nonzero and unique */
+-              "0:     .insn   rrf,%[opc] << 16,2,4,6,0\n"
+-              "       brc     1,0b\n" /* handle partial completion */
+-              : "=m" (*mask)
+-              : [mask] "d" ((unsigned long)mask), [opc] "i" (opcode)
+-              : "cc", "0", "1");
++              "       la      %%r1,%[mask]\n"
++              "       xgr     %%r0,%%r0\n"
++              "       .insn   rre,%[opc] << 16,%[r1],%[r2]\n"
++              : [mask] "=R" (*mask)
++              : [opc] "i" (opc),
++                [r1] "i" (r1), [r2] "i" (r2)
++              : "cc", "r0", "r1");
++}
++
++static __always_inline void __cpacf_query_rrf(u32 opc,
++                                            u8 r1, u8 r2, u8 r3, u8 m4,
++                                            cpacf_mask_t *mask)
++{
++      asm volatile(
++              "       la      %%r1,%[mask]\n"
++              "       xgr     %%r0,%%r0\n"
++              "       .insn   rrf,%[opc] << 16,%[r1],%[r2],%[r3],%[m4]\n"
++              : [mask] "=R" (*mask)
++              : [opc] "i" (opc), [r1] "i" (r1), [r2] "i" (r2),
++                [r3] "i" (r3), [m4] "i" (m4)
++              : "cc", "r0", "r1");
++}
++
++static __always_inline void __cpacf_query(unsigned int opcode,
++                                        cpacf_mask_t *mask)
++{
++      switch (opcode) {
++      case CPACF_KDSA:
++              __cpacf_query_rre(CPACF_KDSA, 0, 2, mask);
++              break;
++      case CPACF_KIMD:
++              __cpacf_query_rre(CPACF_KIMD, 0, 2, mask);
++              break;
++      case CPACF_KLMD:
++              __cpacf_query_rre(CPACF_KLMD, 0, 2, mask);
++              break;
++      case CPACF_KM:
++              __cpacf_query_rre(CPACF_KM, 2, 4, mask);
++              break;
++      case CPACF_KMA:
++              __cpacf_query_rrf(CPACF_KMA, 2, 4, 6, 0, mask);
++              break;
++      case CPACF_KMAC:
++              __cpacf_query_rre(CPACF_KMAC, 0, 2, mask);
++              break;
++      case CPACF_KMC:
++              __cpacf_query_rre(CPACF_KMC, 2, 4, mask);
++              break;
++      case CPACF_KMCTR:
++              __cpacf_query_rrf(CPACF_KMCTR, 2, 4, 6, 0, mask);
++              break;
++      case CPACF_KMF:
++              __cpacf_query_rre(CPACF_KMF, 2, 4, mask);
++              break;
++      case CPACF_KMO:
++              __cpacf_query_rre(CPACF_KMO, 2, 4, mask);
++              break;
++      case CPACF_PCC:
++              __cpacf_query_rre(CPACF_PCC, 0, 0, mask);
++              break;
++      case CPACF_PCKMO:
++              __cpacf_query_rre(CPACF_PCKMO, 0, 0, mask);
++              break;
++      case CPACF_PRNO:
++              __cpacf_query_rre(CPACF_PRNO, 2, 4, mask);
++              break;
++      default:
++              __cpacf_bad_opcode();
++      }
+ }
+ 
+ static __always_inline int __cpacf_check_opcode(unsigned int opcode)
+@@ -206,10 +264,21 @@ static __always_inline int __cpacf_check_opcode(unsigned 
int opcode)
+       case CPACF_KMA:
+               return test_facility(146);      /* check for MSA8 */
+       default:
+-              BUG();
++              __cpacf_bad_opcode();
++              return 0;
+       }
+ }
+ 
++/**
++ * cpacf_query() - check if a specific CPACF function is available
++ * @opcode: the opcode of the crypto instruction
++ * @func: the function code to test for
++ *
++ * Executes the query function for the given crypto instruction @opcode
++ * and checks if @func is available
++ *
++ * Returns 1 if @func is available for @opcode, 0 otherwise
++ */
+ static __always_inline int cpacf_query(unsigned int opcode, cpacf_mask_t 
*mask)
+ {
+       if (__cpacf_check_opcode(opcode)) {
+diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
+index 11e901286414c..956300e3568a4 100644
+--- a/arch/s390/include/asm/pgtable.h
++++ b/arch/s390/include/asm/pgtable.h
+@@ -1686,8 +1686,10 @@ static inline pmd_t pmdp_huge_clear_flush(struct 
vm_area_struct *vma,
+ static inline pmd_t pmdp_invalidate(struct vm_area_struct *vma,
+                                  unsigned long addr, pmd_t *pmdp)
+ {
+-      pmd_t pmd = __pmd(pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
++      pmd_t pmd;
+ 
++      VM_WARN_ON_ONCE(!pmd_present(*pmdp));
++      pmd = __pmd(pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
+       return pmdp_xchg_direct(vma->vm_mm, addr, pmdp, pmd);
+ }
+ 
+diff --git a/arch/sparc/include/asm/smp_64.h b/arch/sparc/include/asm/smp_64.h
+index e75783b6abc42..16ab904616a0c 100644
+--- a/arch/sparc/include/asm/smp_64.h
++++ b/arch/sparc/include/asm/smp_64.h
+@@ -47,7 +47,6 @@ void arch_send_call_function_ipi_mask(const struct cpumask 
*mask);
+ int hard_smp_processor_id(void);
+ #define raw_smp_processor_id() (current_thread_info()->cpu)
+ 
+-void smp_fill_in_cpu_possible_map(void);
+ void smp_fill_in_sib_core_maps(void);
+ void cpu_play_dead(void);
+ 
+@@ -77,7 +76,6 @@ void __cpu_die(unsigned int cpu);
+ #define smp_fill_in_sib_core_maps() do { } while (0)
+ #define smp_fetch_global_regs() do { } while (0)
+ #define smp_fetch_global_pmu() do { } while (0)
+-#define smp_fill_in_cpu_possible_map() do { } while (0)
+ #define smp_init_cpu_poke() do { } while (0)
+ #define scheduler_poke() do { } while (0)
+ 
+diff --git a/arch/sparc/include/uapi/asm/termbits.h 
b/arch/sparc/include/uapi/asm/termbits.h
+index 4321322701fcf..0da2b1adc0f52 100644
+--- a/arch/sparc/include/uapi/asm/termbits.h
++++ b/arch/sparc/include/uapi/asm/termbits.h
+@@ -10,16 +10,6 @@ typedef unsigned int        tcflag_t;
+ typedef unsigned long tcflag_t;
+ #endif
+ 
+-#define NCC 8
+-struct termio {
+-      unsigned short c_iflag;         /* input mode flags */
+-      unsigned short c_oflag;         /* output mode flags */
+-      unsigned short c_cflag;         /* control mode flags */
+-      unsigned short c_lflag;         /* local mode flags */
+-      unsigned char c_line;           /* line discipline */
+-      unsigned char c_cc[NCC];        /* control characters */
+-};
+-
+ #define NCCS 17
+ struct termios {
+       tcflag_t c_iflag;               /* input mode flags */
+diff --git a/arch/sparc/include/uapi/asm/termios.h 
b/arch/sparc/include/uapi/asm/termios.h
+index ee86f4093d83e..cceb32260881e 100644
+--- a/arch/sparc/include/uapi/asm/termios.h
++++ b/arch/sparc/include/uapi/asm/termios.h
+@@ -40,5 +40,14 @@ struct winsize {
+       unsigned short ws_ypixel;
+ };
+ 
++#define NCC 8
++struct termio {
++      unsigned short c_iflag;         /* input mode flags */
++      unsigned short c_oflag;         /* output mode flags */
++      unsigned short c_cflag;         /* control mode flags */
++      unsigned short c_lflag;         /* local mode flags */
++      unsigned char c_line;           /* line discipline */
++      unsigned char c_cc[NCC];        /* control characters */
++};
+ 
+ #endif /* _UAPI_SPARC_TERMIOS_H */
+diff --git a/arch/sparc/kernel/prom_64.c b/arch/sparc/kernel/prom_64.c
+index f883a50fa3339..4eae633f71982 100644
+--- a/arch/sparc/kernel/prom_64.c
++++ b/arch/sparc/kernel/prom_64.c
+@@ -483,7 +483,9 @@ static void *record_one_cpu(struct device_node *dp, int 
cpuid, int arg)
+       ncpus_probed++;
+ #ifdef CONFIG_SMP
+       set_cpu_present(cpuid, true);
+-      set_cpu_possible(cpuid, true);
++
++      if (num_possible_cpus() < nr_cpu_ids)
++              set_cpu_possible(cpuid, true);
+ #endif
+       return NULL;
+ }
+diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c
+index 48abee4eee29d..9e6e7f983d142 100644
+--- a/arch/sparc/kernel/setup_64.c
++++ b/arch/sparc/kernel/setup_64.c
+@@ -684,7 +684,6 @@ void __init setup_arch(char **cmdline_p)
+ 
+       paging_init();
+       init_sparc64_elf_hwcap();
+-      smp_fill_in_cpu_possible_map();
+       /*
+        * Once the OF device tree and MDESC have been setup and nr_cpus has
+        * been parsed, we know the list of possible cpus.  Therefore we can
+diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
+index a55295d1b9244..35e8a1e84da60 100644
+--- a/arch/sparc/kernel/smp_64.c
++++ b/arch/sparc/kernel/smp_64.c
+@@ -1204,20 +1204,6 @@ void __init smp_setup_processor_id(void)
+               xcall_deliver_impl = hypervisor_xcall_deliver;
+ }
+ 
+-void __init smp_fill_in_cpu_possible_map(void)
+-{
+-      int possible_cpus = num_possible_cpus();
+-      int i;
+-
+-      if (possible_cpus > nr_cpu_ids)
+-              possible_cpus = nr_cpu_ids;
+-
+-      for (i = 0; i < possible_cpus; i++)
+-              set_cpu_possible(i, true);
+-      for (; i < NR_CPUS; i++)
+-              set_cpu_possible(i, false);
+-}
+-
+ void smp_fill_in_sib_core_maps(void)
+ {
+       unsigned int i;
+diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c
+index 9a725547578e8..946f33c1b032f 100644
+--- a/arch/sparc/mm/tlb.c
++++ b/arch/sparc/mm/tlb.c
+@@ -245,6 +245,7 @@ pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned 
long address,
+ {
+       pmd_t old, entry;
+ 
++      VM_WARN_ON_ONCE(!pmd_present(*pmdp));
+       entry = __pmd(pmd_val(*pmdp) & ~_PAGE_VALID);
+       old = pmdp_establish(vma, address, pmdp, entry);
+       flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
+diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
+index 8525f2876fb40..77ee0012f8497 100644
+--- a/arch/x86/mm/pgtable.c
++++ b/arch/x86/mm/pgtable.c
+@@ -615,6 +615,8 @@ int pmdp_clear_flush_young(struct vm_area_struct *vma,
+ pmd_t pmdp_invalidate_ad(struct vm_area_struct *vma, unsigned long address,
+                        pmd_t *pmdp)
+ {
++      VM_WARN_ON_ONCE(!pmd_present(*pmdp));
++
+       /*
+        * No flush is necessary. Once an invalid PTE is established, the PTE's
+        * access and dirty bits cannot be updated.
+diff --git a/crypto/ecdsa.c b/crypto/ecdsa.c
+index fbd76498aba83..3f9ec273a121f 100644
+--- a/crypto/ecdsa.c
++++ b/crypto/ecdsa.c
+@@ -373,4 +373,7 @@ module_exit(ecdsa_exit);
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Stefan Berger <[email protected]>");
+ MODULE_DESCRIPTION("ECDSA generic algorithm");
++MODULE_ALIAS_CRYPTO("ecdsa-nist-p192");
++MODULE_ALIAS_CRYPTO("ecdsa-nist-p256");
++MODULE_ALIAS_CRYPTO("ecdsa-nist-p384");
+ MODULE_ALIAS_CRYPTO("ecdsa-generic");
+diff --git a/crypto/ecrdsa.c b/crypto/ecrdsa.c
+index f3c6b5e15e75b..3811f3805b5d8 100644
+--- a/crypto/ecrdsa.c
++++ b/crypto/ecrdsa.c
+@@ -294,4 +294,5 @@ module_exit(ecrdsa_mod_fini);
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Vitaly Chikunov <[email protected]>");
+ MODULE_DESCRIPTION("EC-RDSA generic algorithm");
++MODULE_ALIAS_CRYPTO("ecrdsa");
+ MODULE_ALIAS_CRYPTO("ecrdsa-generic");
+diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c
+index 1c5c1a269fbee..d34812db1b67a 100644
+--- a/drivers/acpi/resource.c
++++ b/drivers/acpi/resource.c
+@@ -576,6 +576,18 @@ static const struct dmi_system_id lg_laptop[] = {
+                       DMI_MATCH(DMI_BOARD_NAME, "X577"),
+               },
+       },
++      {
++              /* TongFang GXxHRXx/TUXEDO InfinityBook Pro Gen9 AMD */
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "GXxHRXx"),
++              },
++      },
++      {
++              /* TongFang GMxHGxx/TUXEDO Stellaris Slim Gen1 AMD */
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "GMxHGxx"),
++              },
++      },
+       { }
+ };
+ 
+diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c
+index 03c580625c2cc..55b462ce99df0 100644
+--- a/drivers/ata/pata_legacy.c
++++ b/drivers/ata/pata_legacy.c
+@@ -173,8 +173,6 @@ static int legacy_port[NR_HOST] = { 0x1f0, 0x170, 0x1e8, 
0x168, 0x1e0, 0x160 };
+ static struct legacy_probe probe_list[NR_HOST];
+ static struct legacy_data legacy_data[NR_HOST];
+ static struct ata_host *legacy_host[NR_HOST];
+-static int nr_legacy_host;
+-
+ 
+ /**
+  *    legacy_probe_add        -       Add interface to probe list
+@@ -1276,9 +1274,11 @@ static __exit void legacy_exit(void)
+ {
+       int i;
+ 
+-      for (i = 0; i < nr_legacy_host; i++) {
++      for (i = 0; i < NR_HOST; i++) {
+               struct legacy_data *ld = &legacy_data[i];
+-              ata_host_detach(legacy_host[i]);
++
++              if (legacy_host[i])
++                      ata_host_detach(legacy_host[i]);
+               platform_device_unregister(ld->platform_dev);
+       }
+ }
+diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c
+index ead632595ce06..5671f0d9ab28c 100644
+--- a/drivers/bluetooth/btrtl.c
++++ b/drivers/bluetooth/btrtl.c
+@@ -1074,19 +1074,33 @@ MODULE_FIRMWARE("rtl_bt/rtl8723cs_vf_fw.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8723cs_vf_config.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8723cs_xx_fw.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8723cs_xx_config.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8723d_fw.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8723d_config.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8723ds_fw.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8723ds_config.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8761a_fw.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8761a_config.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8761b_fw.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8761b_config.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8761bu_fw.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8761bu_config.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8821a_fw.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8821a_config.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8821c_fw.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8821c_config.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8821cs_fw.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8821cs_config.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8822b_fw.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8822b_config.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8822cs_fw.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8822cs_config.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8822cu_fw.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8822cu_config.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8851bu_fw.bin");
++MODULE_FIRMWARE("rtl_bt/rtl8851bu_config.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8852au_fw.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8852au_config.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8852bu_fw.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8852bu_config.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8852cu_fw.bin");
+ MODULE_FIRMWARE("rtl_bt/rtl8852cu_config.bin");
+-MODULE_FIRMWARE("rtl_bt/rtl8851bu_fw.bin");
+-MODULE_FIRMWARE("rtl_bt/rtl8851bu_config.bin");
+diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
+index 90dcf26f09731..9f147e9eafb63 100644
+--- a/drivers/cpufreq/amd-pstate.c
++++ b/drivers/cpufreq/amd-pstate.c
+@@ -424,7 +424,7 @@ static int amd_pstate_set_boost(struct cpufreq_policy 
*policy, int state)
+       if (state)
+               policy->cpuinfo.max_freq = cpudata->max_freq;
+       else
+-              policy->cpuinfo.max_freq = cpudata->nominal_freq;
++              policy->cpuinfo.max_freq = cpudata->nominal_freq * 1000;
+ 
+       policy->max = policy->cpuinfo.max_freq;
+ 
+diff --git a/drivers/crypto/qat/qat_common/adf_aer.c 
b/drivers/crypto/qat/qat_common/adf_aer.c
+index 4f36b5a9164a7..d4bf6cd927a2a 100644
+--- a/drivers/crypto/qat/qat_common/adf_aer.c
++++ b/drivers/crypto/qat/qat_common/adf_aer.c
+@@ -95,8 +95,7 @@ static void adf_device_reset_worker(struct work_struct *work)
+       if (adf_dev_init(accel_dev) || adf_dev_start(accel_dev)) {
+               /* The device hanged and we can't restart it so stop here */
+               dev_err(&GET_DEV(accel_dev), "Restart device failed\n");
+-              if (reset_data->mode == ADF_DEV_RESET_ASYNC ||
+-                  completion_done(&reset_data->compl))
++              if (reset_data->mode == ADF_DEV_RESET_ASYNC)
+                       kfree(reset_data);
+               WARN(1, "QAT: device restart failed. Device is unusable\n");
+               return;
+@@ -104,16 +103,8 @@ static void adf_device_reset_worker(struct work_struct 
*work)
+       adf_dev_restarted_notify(accel_dev);
+       clear_bit(ADF_STATUS_RESTARTING, &accel_dev->status);
+ 
+-      /*
+-       * The dev is back alive. Notify the caller if in sync mode
+-       *
+-       * If device restart will take a more time than expected,
+-       * the schedule_reset() function can timeout and exit. This can be
+-       * detected by calling the completion_done() function. In this case
+-       * the reset_data structure needs to be freed here.
+-       */
+-      if (reset_data->mode == ADF_DEV_RESET_ASYNC ||
+-          completion_done(&reset_data->compl))
++      /* The dev is back alive. Notify the caller if in sync mode */
++      if (reset_data->mode == ADF_DEV_RESET_ASYNC)
+               kfree(reset_data);
+       else
+               complete(&reset_data->compl);
+@@ -148,10 +139,10 @@ static int adf_dev_aer_schedule_reset(struct 
adf_accel_dev *accel_dev,
+               if (!timeout) {
+                       dev_err(&GET_DEV(accel_dev),
+                               "Reset device timeout expired\n");
++                      cancel_work_sync(&reset_data->reset_work);
+                       ret = -EFAULT;
+-              } else {
+-                      kfree(reset_data);
+               }
++              kfree(reset_data);
+               return ret;
+       }
+       return 0;
+diff --git a/drivers/edac/igen6_edac.c b/drivers/edac/igen6_edac.c
+index 8ec70da8d84fe..c46880a934da0 100644
+--- a/drivers/edac/igen6_edac.c
++++ b/drivers/edac/igen6_edac.c
+@@ -627,7 +627,7 @@ static int errcmd_enable_error_reporting(bool enable)
+ 
+       rc = pci_read_config_word(imc->pdev, ERRCMD_OFFSET, &errcmd);
+       if (rc)
+-              return rc;
++              return pcibios_err_to_errno(rc);
+ 
+       if (enable)
+               errcmd |= ERRCMD_CE | ERRSTS_UE;
+@@ -636,7 +636,7 @@ static int errcmd_enable_error_reporting(bool enable)
+ 
+       rc = pci_write_config_word(imc->pdev, ERRCMD_OFFSET, errcmd);
+       if (rc)
+-              return rc;
++              return pcibios_err_to_errno(rc);
+ 
+       return 0;
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+index 9b97fa39d47a2..0d017dc94f013 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
+@@ -207,6 +207,7 @@ union igp_info {
+       struct atom_integrated_system_info_v1_11 v11;
+       struct atom_integrated_system_info_v1_12 v12;
+       struct atom_integrated_system_info_v2_1 v21;
++      struct atom_integrated_system_info_v2_3 v23;
+ };
+ 
+ union umc_info {
+@@ -347,6 +348,20 @@ amdgpu_atomfirmware_get_vram_info(struct amdgpu_device 
*adev,
+                                       if (vram_type)
+                                               *vram_type = 
convert_atom_mem_type_to_vram_type(adev, mem_type);
+                                       break;
++                              case 3:
++                                      mem_channel_number = 
igp_info->v23.umachannelnumber;
++                                      if (!mem_channel_number)
++                                              mem_channel_number = 1;
++                                      mem_type = igp_info->v23.memorytype;
++                                      if (mem_type == LpDdr5MemType)
++                                              mem_channel_width = 32;
++                                      else
++                                              mem_channel_width = 64;
++                                      if (vram_width)
++                                              *vram_width = 
mem_channel_number * mem_channel_width;
++                                      if (vram_type)
++                                              *vram_type = 
convert_atom_mem_type_to_vram_type(adev, mem_type);
++                                      break;
+                               default:
+                                       return -EINVAL;
+                               }
+diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c 
b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+index 97b033dfe9e45..68cdb6682776a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+@@ -2049,6 +2049,9 @@ static int sdma_v4_0_process_trap_irq(struct 
amdgpu_device *adev,
+ 
+       DRM_DEBUG("IH: SDMA trap\n");
+       instance = sdma_v4_0_irq_id_to_seq(entry->client_id);
++      if (instance < 0)
++              return instance;
++
+       switch (entry->ring_id) {
+       case 0:
+               amdgpu_fence_process(&adev->sdma.instance[instance].ring);
+diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h 
b/drivers/gpu/drm/amd/include/atomfirmware.h
+index bbe1337a8cee3..e2207f1c5bad3 100644
+--- a/drivers/gpu/drm/amd/include/atomfirmware.h
++++ b/drivers/gpu/drm/amd/include/atomfirmware.h
+@@ -1624,6 +1624,49 @@ struct atom_integrated_system_info_v2_2
+       uint32_t  reserved4[189];
+ };
+ 
++struct uma_carveout_option {
++  char       optionName[29];        //max length of string is 28chars + '\0'. 
Current design is for "minimum", "Medium", "High". This makes entire struct 
size 64bits
++  uint8_t    memoryCarvedGb;        //memory carved out with setting
++  uint8_t    memoryRemainingGb;     //memory remaining on system
++  union {
++    struct _flags {
++      uint8_t Auto     : 1;
++      uint8_t Custom   : 1;
++      uint8_t Reserved : 6;
++    } flags;
++    uint8_t all8;
++  } uma_carveout_option_flags;
++};
++
++struct atom_integrated_system_info_v2_3 {
++  struct  atom_common_table_header table_header;
++  uint32_t  vbios_misc; // enum of atom_system_vbiosmisc_def
++  uint32_t  gpucapinfo; // enum of atom_system_gpucapinf_def
++  uint32_t  system_config;
++  uint32_t  cpucapinfo;
++  uint16_t  gpuclk_ss_percentage; // unit of 0.001%,   1000 mean 1%
++  uint16_t  gpuclk_ss_type;
++  uint16_t  dpphy_override;  // bit vector, enum of 
atom_sysinfo_dpphy_override_def
++  uint8_t memorytype;       // enum of atom_dmi_t17_mem_type_def, APU memory 
type indication.
++  uint8_t umachannelnumber; // number of memory channels
++  uint8_t htc_hyst_limit;
++  uint8_t htc_tmp_limit;
++  uint8_t reserved1; // dp_ss_control
++  uint8_t gpu_package_id;
++  struct  edp_info_table  edp1_info;
++  struct  edp_info_table  edp2_info;
++  uint32_t  reserved2[8];
++  struct  atom_external_display_connection_info extdispconninfo;
++  uint8_t UMACarveoutVersion;
++  uint8_t UMACarveoutIndexMax;
++  uint8_t UMACarveoutTypeDefault;
++  uint8_t UMACarveoutIndexDefault;
++  uint8_t UMACarveoutType;           //Auto or Custom
++  uint8_t UMACarveoutIndex;
++  struct  uma_carveout_option UMASizeControlOption[20];
++  uint8_t reserved3[110];
++};
++
+ // system_config
+ enum atom_system_vbiosmisc_def{
+   INTEGRATED_SYSTEM_INFO__GET_EDID_CALLBACK_FUNC_SUPPORT = 0x01,
+diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c
+index 5de31961319a2..b464a1f7e393c 100644
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c
+@@ -222,15 +222,17 @@ static int smu_v13_0_4_system_features_control(struct 
smu_context *smu, bool en)
+       struct amdgpu_device *adev = smu->adev;
+       int ret = 0;
+ 
+-      if (!en && adev->in_s4) {
+-              /* Adds a GFX reset as workaround just before sending the
+-               * MP1_UNLOAD message to prevent GC/RLC/PMFW from entering
+-               * an invalid state.
+-               */
+-              ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_GfxDeviceDriverReset,
+-                                                    SMU_RESET_MODE_2, NULL);
+-              if (ret)
+-                      return ret;
++      if (!en && !adev->in_s0ix) {
++              if (adev->in_s4) {
++                      /* Adds a GFX reset as workaround just before sending 
the
++                       * MP1_UNLOAD message to prevent GC/RLC/PMFW from 
entering
++                       * an invalid state.
++                       */
++                      ret = smu_cmn_send_smc_msg_with_param(smu, 
SMU_MSG_GfxDeviceDriverReset,
++                                                            SMU_RESET_MODE_2, 
NULL);
++                      if (ret)
++                              return ret;
++              }
+ 
+               ret = smu_cmn_send_smc_msg(smu, SMU_MSG_PrepareMp1ForUnload, 
NULL);
+       }
+diff --git a/drivers/gpu/drm/drm_modeset_helper.c 
b/drivers/gpu/drm/drm_modeset_helper.c
+index f858dfedf2cfc..2c582020cb423 100644
+--- a/drivers/gpu/drm/drm_modeset_helper.c
++++ b/drivers/gpu/drm/drm_modeset_helper.c
+@@ -193,13 +193,22 @@ int drm_mode_config_helper_suspend(struct drm_device 
*dev)
+ 
+       if (!dev)
+               return 0;
++      /*
++       * Don't disable polling if it was never initialized
++       */
++      if (dev->mode_config.poll_enabled)
++              drm_kms_helper_poll_disable(dev);
+ 
+-      drm_kms_helper_poll_disable(dev);
+       drm_fb_helper_set_suspend_unlocked(dev->fb_helper, 1);
+       state = drm_atomic_helper_suspend(dev);
+       if (IS_ERR(state)) {
+               drm_fb_helper_set_suspend_unlocked(dev->fb_helper, 0);
+-              drm_kms_helper_poll_enable(dev);
++              /*
++               * Don't enable polling if it was never initialized
++               */
++              if (dev->mode_config.poll_enabled)
++                      drm_kms_helper_poll_enable(dev);
++
+               return PTR_ERR(state);
+       }
+ 
+@@ -239,7 +248,11 @@ int drm_mode_config_helper_resume(struct drm_device *dev)
+       dev->mode_config.suspend_state = NULL;
+ 
+       drm_fb_helper_set_suspend_unlocked(dev->fb_helper, 0);
+-      drm_kms_helper_poll_enable(dev);
++      /*
++       * Don't enable polling if it is not initialized
++       */
++      if (dev->mode_config.poll_enabled)
++              drm_kms_helper_poll_enable(dev);
+ 
+       return ret;
+ }
+diff --git a/drivers/gpu/drm/drm_probe_helper.c 
b/drivers/gpu/drm/drm_probe_helper.c
+index 52dbaf74fe164..0e5eadc6d44de 100644
+--- a/drivers/gpu/drm/drm_probe_helper.c
++++ b/drivers/gpu/drm/drm_probe_helper.c
+@@ -235,6 +235,9 @@ drm_connector_mode_valid(struct drm_connector *connector,
+  * Drivers can call this helper from their device resume implementation. It is
+  * not an error to call this even when output polling isn't enabled.
+  *
++ * If device polling was never initialized before, this call will trigger a
++ * warning and return.
++ *
+  * Note that calls to enable and disable polling must be strictly ordered, 
which
+  * is automatically the case when they're only call from suspend/resume
+  * callbacks.
+@@ -246,7 +249,8 @@ void drm_kms_helper_poll_enable(struct drm_device *dev)
+       struct drm_connector_list_iter conn_iter;
+       unsigned long delay = DRM_OUTPUT_POLL_PERIOD;
+ 
+-      if (!dev->mode_config.poll_enabled || !drm_kms_helper_poll)
++      if (drm_WARN_ON_ONCE(dev, !dev->mode_config.poll_enabled) ||
++          !drm_kms_helper_poll || dev->mode_config.poll_running)
+               return;
+ 
+       drm_connector_list_iter_begin(dev, &conn_iter);
+@@ -570,7 +574,8 @@ int drm_helper_probe_single_connector_modes(struct 
drm_connector *connector,
+       }
+ 
+       /* Re-enable polling in case the global poll config changed. */
+-      if (drm_kms_helper_poll != dev->mode_config.poll_running)
++      if (dev->mode_config.poll_enabled &&
++          (drm_kms_helper_poll != dev->mode_config.poll_running))
+               drm_kms_helper_poll_enable(dev);
+ 
+       dev->mode_config.poll_running = drm_kms_helper_poll;
+@@ -821,14 +826,18 @@ EXPORT_SYMBOL(drm_kms_helper_is_poll_worker);
+  * not an error to call this even when output polling isn't enabled or already
+  * disabled. Polling is re-enabled by calling drm_kms_helper_poll_enable().
+  *
++ * If however, the polling was never initialized, this call will trigger a
++ * warning and return
++ *
+  * Note that calls to enable and disable polling must be strictly ordered, 
which
+  * is automatically the case when they're only call from suspend/resume
+  * callbacks.
+  */
+ void drm_kms_helper_poll_disable(struct drm_device *dev)
+ {
+-      if (!dev->mode_config.poll_enabled)
++      if (drm_WARN_ON(dev, !dev->mode_config.poll_enabled))
+               return;
++
+       cancel_delayed_work_sync(&dev->mode_config.output_poll_work);
+ }
+ EXPORT_SYMBOL(drm_kms_helper_poll_disable);
+diff --git a/drivers/gpu/drm/i915/display/intel_audio.c 
b/drivers/gpu/drm/i915/display/intel_audio.c
+index aacbc6da84efa..a5fa0682110a2 100644
+--- a/drivers/gpu/drm/i915/display/intel_audio.c
++++ b/drivers/gpu/drm/i915/display/intel_audio.c
+@@ -73,19 +73,6 @@ struct intel_audio_funcs {
+                                   const struct drm_connector_state 
*old_conn_state);
+ };
+ 
+-/* DP N/M table */
+-#define LC_810M       810000
+-#define LC_540M       540000
+-#define LC_270M       270000
+-#define LC_162M       162000
+-
+-struct dp_aud_n_m {
+-      int sample_rate;
+-      int clock;
+-      u16 m;
+-      u16 n;
+-};
+-
+ struct hdmi_aud_ncts {
+       int sample_rate;
+       int clock;
+@@ -93,60 +80,6 @@ struct hdmi_aud_ncts {
+       int cts;
+ };
+ 
+-/* Values according to DP 1.4 Table 2-104 */
+-static const struct dp_aud_n_m dp_aud_n_m[] = {
+-      { 32000, LC_162M, 1024, 10125 },
+-      { 44100, LC_162M, 784, 5625 },
+-      { 48000, LC_162M, 512, 3375 },
+-      { 64000, LC_162M, 2048, 10125 },
+-      { 88200, LC_162M, 1568, 5625 },
+-      { 96000, LC_162M, 1024, 3375 },
+-      { 128000, LC_162M, 4096, 10125 },
+-      { 176400, LC_162M, 3136, 5625 },
+-      { 192000, LC_162M, 2048, 3375 },
+-      { 32000, LC_270M, 1024, 16875 },
+-      { 44100, LC_270M, 784, 9375 },
+-      { 48000, LC_270M, 512, 5625 },
+-      { 64000, LC_270M, 2048, 16875 },
+-      { 88200, LC_270M, 1568, 9375 },
+-      { 96000, LC_270M, 1024, 5625 },
+-      { 128000, LC_270M, 4096, 16875 },
+-      { 176400, LC_270M, 3136, 9375 },
+-      { 192000, LC_270M, 2048, 5625 },
+-      { 32000, LC_540M, 1024, 33750 },
+-      { 44100, LC_540M, 784, 18750 },
+-      { 48000, LC_540M, 512, 11250 },
+-      { 64000, LC_540M, 2048, 33750 },
+-      { 88200, LC_540M, 1568, 18750 },
+-      { 96000, LC_540M, 1024, 11250 },
+-      { 128000, LC_540M, 4096, 33750 },
+-      { 176400, LC_540M, 3136, 18750 },
+-      { 192000, LC_540M, 2048, 11250 },
+-      { 32000, LC_810M, 1024, 50625 },
+-      { 44100, LC_810M, 784, 28125 },
+-      { 48000, LC_810M, 512, 16875 },
+-      { 64000, LC_810M, 2048, 50625 },
+-      { 88200, LC_810M, 1568, 28125 },
+-      { 96000, LC_810M, 1024, 16875 },
+-      { 128000, LC_810M, 4096, 50625 },
+-      { 176400, LC_810M, 3136, 28125 },
+-      { 192000, LC_810M, 2048, 16875 },
+-};
+-
+-static const struct dp_aud_n_m *
+-audio_config_dp_get_n_m(const struct intel_crtc_state *crtc_state, int rate)
+-{
+-      int i;
+-
+-      for (i = 0; i < ARRAY_SIZE(dp_aud_n_m); i++) {
+-              if (rate == dp_aud_n_m[i].sample_rate &&
+-                  crtc_state->port_clock == dp_aud_n_m[i].clock)
+-                      return &dp_aud_n_m[i];
+-      }
+-
+-      return NULL;
+-}
+-
+ static const struct {
+       int clock;
+       u32 config;
+@@ -392,48 +325,17 @@ static void
+ hsw_dp_audio_config_update(struct intel_encoder *encoder,
+                          const struct intel_crtc_state *crtc_state)
+ {
+-      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+-      struct i915_audio_component *acomp = dev_priv->display.audio.component;
++      struct drm_i915_private *i915 = to_i915(encoder->base.dev);
+       enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
+-      enum port port = encoder->port;
+-      const struct dp_aud_n_m *nm;
+-      int rate;
+-      u32 tmp;
+ 
+-      rate = acomp ? acomp->aud_sample_rate[port] : 0;
+-      nm = audio_config_dp_get_n_m(crtc_state, rate);
+-      if (nm)
+-              drm_dbg_kms(&dev_priv->drm, "using Maud %u, Naud %u\n", nm->m,
+-                          nm->n);
+-      else
+-              drm_dbg_kms(&dev_priv->drm, "using automatic Maud, Naud\n");
+-
+-      tmp = intel_de_read(dev_priv, HSW_AUD_CFG(cpu_transcoder));
+-      tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
+-      tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
+-      tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
+-      tmp |= AUD_CONFIG_N_VALUE_INDEX;
+-
+-      if (nm) {
+-              tmp &= ~AUD_CONFIG_N_MASK;
+-              tmp |= AUD_CONFIG_N(nm->n);
+-              tmp |= AUD_CONFIG_N_PROG_ENABLE;
+-      }
+-
+-      intel_de_write(dev_priv, HSW_AUD_CFG(cpu_transcoder), tmp);
+-
+-      tmp = intel_de_read(dev_priv, HSW_AUD_M_CTS_ENABLE(cpu_transcoder));
+-      tmp &= ~AUD_CONFIG_M_MASK;
+-      tmp &= ~AUD_M_CTS_M_VALUE_INDEX;
+-      tmp &= ~AUD_M_CTS_M_PROG_ENABLE;
+-
+-      if (nm) {
+-              tmp |= nm->m;
+-              tmp |= AUD_M_CTS_M_VALUE_INDEX;
+-              tmp |= AUD_M_CTS_M_PROG_ENABLE;
+-      }
+-
+-      intel_de_write(dev_priv, HSW_AUD_M_CTS_ENABLE(cpu_transcoder), tmp);
++      /* Enable time stamps. Let HW calculate Maud/Naud values */
++      intel_de_rmw(i915, HSW_AUD_CFG(cpu_transcoder),
++                   AUD_CONFIG_N_VALUE_INDEX |
++                   AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK |
++                   AUD_CONFIG_UPPER_N_MASK |
++                   AUD_CONFIG_LOWER_N_MASK |
++                   AUD_CONFIG_N_PROG_ENABLE,
++                   AUD_CONFIG_N_VALUE_INDEX);
+ }
+ 
+ static void
+diff --git a/drivers/hwtracing/intel_th/pci.c 
b/drivers/hwtracing/intel_th/pci.c
+index 147d338c191e7..648893f9e4b67 100644
+--- a/drivers/hwtracing/intel_th/pci.c
++++ b/drivers/hwtracing/intel_th/pci.c
+@@ -289,6 +289,11 @@ static const struct pci_device_id intel_th_pci_id_table[] 
= {
+               PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7e24),
+               .driver_data = (kernel_ulong_t)&intel_th_2x,
+       },
++      {
++              /* Meteor Lake-S CPU */
++              PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xae24),
++              .driver_data = (kernel_ulong_t)&intel_th_2x,
++      },
+       {
+               /* Raptor Lake-S */
+               PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7a26),
+diff --git a/drivers/i3c/master/svc-i3c-master.c 
b/drivers/i3c/master/svc-i3c-master.c
+index f30d457e91196..e71c90e5ac60c 100644
+--- a/drivers/i3c/master/svc-i3c-master.c
++++ b/drivers/i3c/master/svc-i3c-master.c
+@@ -397,6 +397,19 @@ static void svc_i3c_master_ibi_work(struct work_struct 
*work)
+       int ret;
+ 
+       mutex_lock(&master->lock);
++      /*
++       * IBIWON may be set before SVC_I3C_MCTRL_REQUEST_AUTO_IBI, causing
++       * readl_relaxed_poll_timeout() to return immediately. Consequently,
++       * ibitype will be 0 since it was last updated only after the 8th SCL
++       * cycle, leading to missed client IBI handlers.
++       *
++       * A typical scenario is when IBIWON occurs and bus arbitration is lost
++       * at svc_i3c_master_priv_xfers().
++       *
++       * Clear SVC_I3C_MINT_IBIWON before sending 
SVC_I3C_MCTRL_REQUEST_AUTO_IBI.
++       */
++      writel(SVC_I3C_MINT_IBIWON, master->regs + SVC_I3C_MSTATUS);
++
+       /* Acknowledge the incoming interrupt with the AUTOIBI mechanism */
+       writel(SVC_I3C_MCTRL_REQUEST_AUTO_IBI |
+              SVC_I3C_MCTRL_IBIRESP_AUTO,
+@@ -411,9 +424,6 @@ static void svc_i3c_master_ibi_work(struct work_struct 
*work)
+               goto reenable_ibis;
+       }
+ 
+-      /* Clear the interrupt status */
+-      writel(SVC_I3C_MINT_IBIWON, master->regs + SVC_I3C_MSTATUS);
+-
+       status = readl(master->regs + SVC_I3C_MSTATUS);
+       ibitype = SVC_I3C_MSTATUS_IBITYPE(status);
+       ibiaddr = SVC_I3C_MSTATUS_IBIADDR(status);
+diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c
+index 2bba4d6aaaa28..463eb13bd0b2a 100644
+--- a/drivers/md/bcache/bset.c
++++ b/drivers/md/bcache/bset.c
+@@ -54,7 +54,7 @@ void bch_dump_bucket(struct btree_keys *b)
+ int __bch_count_data(struct btree_keys *b)
+ {
+       unsigned int ret = 0;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       struct bkey *k;
+ 
+       if (b->ops->is_extents)
+@@ -67,7 +67,7 @@ void __bch_check_keys(struct btree_keys *b, const char *fmt, 
...)
+ {
+       va_list args;
+       struct bkey *k, *p = NULL;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       const char *err;
+ 
+       for_each_key(b, k, &iter) {
+@@ -879,7 +879,7 @@ unsigned int bch_btree_insert_key(struct btree_keys *b, 
struct bkey *k,
+       unsigned int status = BTREE_INSERT_STATUS_NO_INSERT;
+       struct bset *i = bset_tree_last(b)->data;
+       struct bkey *m, *prev = NULL;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       struct bkey preceding_key_on_stack = ZERO_KEY;
+       struct bkey *preceding_key_p = &preceding_key_on_stack;
+ 
+@@ -895,9 +895,9 @@ unsigned int bch_btree_insert_key(struct btree_keys *b, 
struct bkey *k,
+       else
+               preceding_key(k, &preceding_key_p);
+ 
+-      m = bch_btree_iter_init(b, &iter, preceding_key_p);
++      m = bch_btree_iter_stack_init(b, &iter, preceding_key_p);
+ 
+-      if (b->ops->insert_fixup(b, k, &iter, replace_key))
++      if (b->ops->insert_fixup(b, k, &iter.iter, replace_key))
+               return status;
+ 
+       status = BTREE_INSERT_STATUS_INSERT;
+@@ -1100,33 +1100,33 @@ void bch_btree_iter_push(struct btree_iter *iter, 
struct bkey *k,
+                                btree_iter_cmp));
+ }
+ 
+-static struct bkey *__bch_btree_iter_init(struct btree_keys *b,
+-                                        struct btree_iter *iter,
+-                                        struct bkey *search,
+-                                        struct bset_tree *start)
++static struct bkey *__bch_btree_iter_stack_init(struct btree_keys *b,
++                                              struct btree_iter_stack *iter,
++                                              struct bkey *search,
++                                              struct bset_tree *start)
+ {
+       struct bkey *ret = NULL;
+ 
+-      iter->size = ARRAY_SIZE(iter->data);
+-      iter->used = 0;
++      iter->iter.size = ARRAY_SIZE(iter->stack_data);
++      iter->iter.used = 0;
+ 
+ #ifdef CONFIG_BCACHE_DEBUG
+-      iter->b = b;
++      iter->iter.b = b;
+ #endif
+ 
+       for (; start <= bset_tree_last(b); start++) {
+               ret = bch_bset_search(b, start, search);
+-              bch_btree_iter_push(iter, ret, bset_bkey_last(start->data));
++              bch_btree_iter_push(&iter->iter, ret, 
bset_bkey_last(start->data));
+       }
+ 
+       return ret;
+ }
+ 
+-struct bkey *bch_btree_iter_init(struct btree_keys *b,
+-                               struct btree_iter *iter,
++struct bkey *bch_btree_iter_stack_init(struct btree_keys *b,
++                               struct btree_iter_stack *iter,
+                                struct bkey *search)
+ {
+-      return __bch_btree_iter_init(b, iter, search, b->set);
++      return __bch_btree_iter_stack_init(b, iter, search, b->set);
+ }
+ 
+ static inline struct bkey *__bch_btree_iter_next(struct btree_iter *iter,
+@@ -1293,10 +1293,10 @@ void bch_btree_sort_partial(struct btree_keys *b, 
unsigned int start,
+                           struct bset_sort_state *state)
+ {
+       size_t order = b->page_order, keys = 0;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       int oldsize = bch_count_data(b);
+ 
+-      __bch_btree_iter_init(b, &iter, NULL, &b->set[start]);
++      __bch_btree_iter_stack_init(b, &iter, NULL, &b->set[start]);
+ 
+       if (start) {
+               unsigned int i;
+@@ -1307,7 +1307,7 @@ void bch_btree_sort_partial(struct btree_keys *b, 
unsigned int start,
+               order = get_order(__set_bytes(b->set->data, keys));
+       }
+ 
+-      __btree_sort(b, &iter, start, order, false, state);
++      __btree_sort(b, &iter.iter, start, order, false, state);
+ 
+       EBUG_ON(oldsize >= 0 && bch_count_data(b) != oldsize);
+ }
+@@ -1323,11 +1323,11 @@ void bch_btree_sort_into(struct btree_keys *b, struct 
btree_keys *new,
+                        struct bset_sort_state *state)
+ {
+       uint64_t start_time = local_clock();
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+ 
+-      bch_btree_iter_init(b, &iter, NULL);
++      bch_btree_iter_stack_init(b, &iter, NULL);
+ 
+-      btree_mergesort(b, new->set->data, &iter, false, true);
++      btree_mergesort(b, new->set->data, &iter.iter, false, true);
+ 
+       bch_time_stats_update(&state->time, start_time);
+ 
+diff --git a/drivers/md/bcache/bset.h b/drivers/md/bcache/bset.h
+index d795c84246b01..011f6062c4c04 100644
+--- a/drivers/md/bcache/bset.h
++++ b/drivers/md/bcache/bset.h
+@@ -321,7 +321,14 @@ struct btree_iter {
+ #endif
+       struct btree_iter_set {
+               struct bkey *k, *end;
+-      } data[MAX_BSETS];
++      } data[];
++};
++
++/* Fixed-size btree_iter that can be allocated on the stack */
++
++struct btree_iter_stack {
++      struct btree_iter iter;
++      struct btree_iter_set stack_data[MAX_BSETS];
+ };
+ 
+ typedef bool (*ptr_filter_fn)(struct btree_keys *b, const struct bkey *k);
+@@ -333,9 +340,9 @@ struct bkey *bch_btree_iter_next_filter(struct btree_iter 
*iter,
+ 
+ void bch_btree_iter_push(struct btree_iter *iter, struct bkey *k,
+                        struct bkey *end);
+-struct bkey *bch_btree_iter_init(struct btree_keys *b,
+-                               struct btree_iter *iter,
+-                               struct bkey *search);
++struct bkey *bch_btree_iter_stack_init(struct btree_keys *b,
++                                     struct btree_iter_stack *iter,
++                                     struct bkey *search);
+ 
+ struct bkey *__bch_bset_search(struct btree_keys *b, struct bset_tree *t,
+                              const struct bkey *search);
+@@ -350,13 +357,14 @@ static inline struct bkey *bch_bset_search(struct 
btree_keys *b,
+       return search ? __bch_bset_search(b, t, search) : t->data->start;
+ }
+ 
+-#define for_each_key_filter(b, k, iter, filter)                               
\
+-      for (bch_btree_iter_init((b), (iter), NULL);                    \
+-           ((k) = bch_btree_iter_next_filter((iter), (b), filter));)
++#define for_each_key_filter(b, k, stack_iter, filter)                      \
++      for (bch_btree_iter_stack_init((b), (stack_iter), NULL);           \
++           ((k) = bch_btree_iter_next_filter(&((stack_iter)->iter), (b), \
++                                             filter));)
+ 
+-#define for_each_key(b, k, iter)                                      \
+-      for (bch_btree_iter_init((b), (iter), NULL);                    \
+-           ((k) = bch_btree_iter_next(iter));)
++#define for_each_key(b, k, stack_iter)                           \
++      for (bch_btree_iter_stack_init((b), (stack_iter), NULL); \
++           ((k) = bch_btree_iter_next(&((stack_iter)->iter)));)
+ 
+ /* Sorting */
+ 
+diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
+index 6a2f57ae0f3c2..d680c810e5e12 100644
+--- a/drivers/md/bcache/btree.c
++++ b/drivers/md/bcache/btree.c
+@@ -1283,7 +1283,7 @@ static bool btree_gc_mark_node(struct btree *b, struct 
gc_stat *gc)
+       uint8_t stale = 0;
+       unsigned int keys = 0, good_keys = 0;
+       struct bkey *k;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       struct bset_tree *t;
+ 
+       gc->nodes++;
+@@ -1544,7 +1544,7 @@ static int btree_gc_rewrite_node(struct btree *b, struct 
btree_op *op,
+ static unsigned int btree_gc_count_keys(struct btree *b)
+ {
+       struct bkey *k;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       unsigned int ret = 0;
+ 
+       for_each_key_filter(&b->keys, k, &iter, bch_ptr_bad)
+@@ -1585,17 +1585,18 @@ static int btree_gc_recurse(struct btree *b, struct 
btree_op *op,
+       int ret = 0;
+       bool should_rewrite;
+       struct bkey *k;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       struct gc_merge_info r[GC_MERGE_NODES];
+       struct gc_merge_info *i, *last = r + ARRAY_SIZE(r) - 1;
+ 
+-      bch_btree_iter_init(&b->keys, &iter, &b->c->gc_done);
++      bch_btree_iter_stack_init(&b->keys, &iter, &b->c->gc_done);
+ 
+       for (i = r; i < r + ARRAY_SIZE(r); i++)
+               i->b = ERR_PTR(-EINTR);
+ 
+       while (1) {
+-              k = bch_btree_iter_next_filter(&iter, &b->keys, bch_ptr_bad);
++              k = bch_btree_iter_next_filter(&iter.iter, &b->keys,
++                                             bch_ptr_bad);
+               if (k) {
+                       r->b = bch_btree_node_get(b->c, op, k, b->level - 1,
+                                                 true, b);
+@@ -1885,7 +1886,7 @@ static int bch_btree_check_recurse(struct btree *b, 
struct btree_op *op)
+ {
+       int ret = 0;
+       struct bkey *k, *p = NULL;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+ 
+       for_each_key_filter(&b->keys, k, &iter, bch_ptr_invalid)
+               bch_initial_mark_key(b->c, b->level, k);
+@@ -1893,10 +1894,10 @@ static int bch_btree_check_recurse(struct btree *b, 
struct btree_op *op)
+       bch_initial_mark_key(b->c, b->level + 1, &b->key);
+ 
+       if (b->level) {
+-              bch_btree_iter_init(&b->keys, &iter, NULL);
++              bch_btree_iter_stack_init(&b->keys, &iter, NULL);
+ 
+               do {
+-                      k = bch_btree_iter_next_filter(&iter, &b->keys,
++                      k = bch_btree_iter_next_filter(&iter.iter, &b->keys,
+                                                      bch_ptr_bad);
+                       if (k) {
+                               btree_node_prefetch(b, k);
+@@ -1924,7 +1925,7 @@ static int bch_btree_check_thread(void *arg)
+       struct btree_check_info *info = arg;
+       struct btree_check_state *check_state = info->state;
+       struct cache_set *c = check_state->c;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       struct bkey *k, *p;
+       int cur_idx, prev_idx, skip_nr;
+ 
+@@ -1933,8 +1934,8 @@ static int bch_btree_check_thread(void *arg)
+       ret = 0;
+ 
+       /* root node keys are checked before thread created */
+-      bch_btree_iter_init(&c->root->keys, &iter, NULL);
+-      k = bch_btree_iter_next_filter(&iter, &c->root->keys, bch_ptr_bad);
++      bch_btree_iter_stack_init(&c->root->keys, &iter, NULL);
++      k = bch_btree_iter_next_filter(&iter.iter, &c->root->keys, bch_ptr_bad);
+       BUG_ON(!k);
+ 
+       p = k;
+@@ -1952,7 +1953,7 @@ static int bch_btree_check_thread(void *arg)
+               skip_nr = cur_idx - prev_idx;
+ 
+               while (skip_nr) {
+-                      k = bch_btree_iter_next_filter(&iter,
++                      k = bch_btree_iter_next_filter(&iter.iter,
+                                                      &c->root->keys,
+                                                      bch_ptr_bad);
+                       if (k)
+@@ -2025,7 +2026,7 @@ int bch_btree_check(struct cache_set *c)
+       int ret = 0;
+       int i;
+       struct bkey *k = NULL;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       struct btree_check_state check_state;
+ 
+       /* check and mark root node keys */
+@@ -2521,11 +2522,11 @@ static int bch_btree_map_nodes_recurse(struct btree 
*b, struct btree_op *op,
+ 
+       if (b->level) {
+               struct bkey *k;
+-              struct btree_iter iter;
++              struct btree_iter_stack iter;
+ 
+-              bch_btree_iter_init(&b->keys, &iter, from);
++              bch_btree_iter_stack_init(&b->keys, &iter, from);
+ 
+-              while ((k = bch_btree_iter_next_filter(&iter, &b->keys,
++              while ((k = bch_btree_iter_next_filter(&iter.iter, &b->keys,
+                                                      bch_ptr_bad))) {
+                       ret = bcache_btree(map_nodes_recurse, k, b,
+                                   op, from, fn, flags);
+@@ -2554,11 +2555,12 @@ int bch_btree_map_keys_recurse(struct btree *b, struct 
btree_op *op,
+ {
+       int ret = MAP_CONTINUE;
+       struct bkey *k;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+ 
+-      bch_btree_iter_init(&b->keys, &iter, from);
++      bch_btree_iter_stack_init(&b->keys, &iter, from);
+ 
+-      while ((k = bch_btree_iter_next_filter(&iter, &b->keys, bch_ptr_bad))) {
++      while ((k = bch_btree_iter_next_filter(&iter.iter, &b->keys,
++                                             bch_ptr_bad))) {
+               ret = !b->level
+                       ? fn(op, b, k)
+                       : bcache_btree(map_keys_recurse, k,
+diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
+index 70e5bd8961d2f..659f6777b9737 100644
+--- a/drivers/md/bcache/super.c
++++ b/drivers/md/bcache/super.c
+@@ -1915,8 +1915,9 @@ struct cache_set *bch_cache_set_alloc(struct cache_sb 
*sb)
+       INIT_LIST_HEAD(&c->btree_cache_freed);
+       INIT_LIST_HEAD(&c->data_buckets);
+ 
+-      iter_size = ((meta_bucket_pages(sb) * PAGE_SECTORS) / sb->block_size + 
1) *
+-              sizeof(struct btree_iter_set);
++      iter_size = sizeof(struct btree_iter) +
++                  ((meta_bucket_pages(sb) * PAGE_SECTORS) / sb->block_size) *
++                          sizeof(struct btree_iter_set);
+ 
+       c->devices = kcalloc(c->nr_uuids, sizeof(void *), GFP_KERNEL);
+       if (!c->devices)
+diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c
+index 025fe6479bb68..15749ba958c80 100644
+--- a/drivers/md/bcache/sysfs.c
++++ b/drivers/md/bcache/sysfs.c
+@@ -660,7 +660,7 @@ static unsigned int bch_root_usage(struct cache_set *c)
+       unsigned int bytes = 0;
+       struct bkey *k;
+       struct btree *b;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+ 
+       goto lock_root;
+ 
+diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c
+index 18c6e0d2877b5..6081dc6fd0132 100644
+--- a/drivers/md/bcache/writeback.c
++++ b/drivers/md/bcache/writeback.c
+@@ -908,15 +908,15 @@ static int bch_dirty_init_thread(void *arg)
+       struct dirty_init_thrd_info *info = arg;
+       struct bch_dirty_init_state *state = info->state;
+       struct cache_set *c = state->c;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       struct bkey *k, *p;
+       int cur_idx, prev_idx, skip_nr;
+ 
+       k = p = NULL;
+       prev_idx = 0;
+ 
+-      bch_btree_iter_init(&c->root->keys, &iter, NULL);
+-      k = bch_btree_iter_next_filter(&iter, &c->root->keys, bch_ptr_bad);
++      bch_btree_iter_stack_init(&c->root->keys, &iter, NULL);
++      k = bch_btree_iter_next_filter(&iter.iter, &c->root->keys, bch_ptr_bad);
+       BUG_ON(!k);
+ 
+       p = k;
+@@ -930,7 +930,7 @@ static int bch_dirty_init_thread(void *arg)
+               skip_nr = cur_idx - prev_idx;
+ 
+               while (skip_nr) {
+-                      k = bch_btree_iter_next_filter(&iter,
++                      k = bch_btree_iter_next_filter(&iter.iter,
+                                                      &c->root->keys,
+                                                      bch_ptr_bad);
+                       if (k)
+@@ -979,7 +979,7 @@ void bch_sectors_dirty_init(struct bcache_device *d)
+       int i;
+       struct btree *b = NULL;
+       struct bkey *k = NULL;
+-      struct btree_iter iter;
++      struct btree_iter_stack iter;
+       struct sectors_dirty_init op;
+       struct cache_set *c = d->c;
+       struct bch_dirty_init_state state;
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index 8cf2317857e0a..ed99b449d8fd4 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -36,7 +36,6 @@
+  */
+ 
+ #include <linux/blkdev.h>
+-#include <linux/delay.h>
+ #include <linux/kthread.h>
+ #include <linux/raid/pq.h>
+ #include <linux/async_tx.h>
+@@ -6797,6 +6796,9 @@ static void raid5d(struct md_thread *thread)
+               int batch_size, released;
+               unsigned int offset;
+ 
++              if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags))
++                      break;
++
+               released = release_stripe_list(conf, conf->temp_inactive_list);
+               if (released)
+                       clear_bit(R5_DID_ALLOC, &conf->cache_state);
+@@ -6833,18 +6835,7 @@ static void raid5d(struct md_thread *thread)
+                       spin_unlock_irq(&conf->device_lock);
+                       md_check_recovery(mddev);
+                       spin_lock_irq(&conf->device_lock);
+-
+-                      /*
+-                       * Waiting on MD_SB_CHANGE_PENDING below may deadlock
+-                       * seeing md_check_recovery() is needed to clear
+-                       * the flag when using mdmon.
+-                       */
+-                      continue;
+               }
+-
+-              wait_event_lock_irq(mddev->sb_wait,
+-                      !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags),
+-                      conf->device_lock);
+       }
+       pr_debug("%d stripes handled\n", handled);
+ 
+diff --git a/drivers/media/dvb-frontends/lgdt3306a.c 
b/drivers/media/dvb-frontends/lgdt3306a.c
+index 6dfa8b18ed671..fccadfcd76bef 100644
+--- a/drivers/media/dvb-frontends/lgdt3306a.c
++++ b/drivers/media/dvb-frontends/lgdt3306a.c
+@@ -2177,6 +2177,11 @@ static int lgdt3306a_probe(struct i2c_client *client,
+       struct dvb_frontend *fe;
+       int ret;
+ 
++      if (!client->dev.platform_data) {
++              dev_err(&client->dev, "platform data is mandatory\n");
++              return -EINVAL;
++      }
++
+       config = kmemdup(client->dev.platform_data,
+                        sizeof(struct lgdt3306a_config), GFP_KERNEL);
+       if (config == NULL) {
+diff --git a/drivers/media/dvb-frontends/mxl5xx.c 
b/drivers/media/dvb-frontends/mxl5xx.c
+index 934d1c0b214ae..1adadad172c04 100644
+--- a/drivers/media/dvb-frontends/mxl5xx.c
++++ b/drivers/media/dvb-frontends/mxl5xx.c
+@@ -1381,57 +1381,57 @@ static int config_ts(struct mxl *state, enum 
MXL_HYDRA_DEMOD_ID_E demod_id,
+       u32 nco_count_min = 0;
+       u32 clk_type = 0;
+ 
+-      struct MXL_REG_FIELD_T xpt_sync_polarity[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T 
xpt_sync_polarity[MXL_HYDRA_DEMOD_MAX] = {
+               {0x90700010, 8, 1}, {0x90700010, 9, 1},
+               {0x90700010, 10, 1}, {0x90700010, 11, 1},
+               {0x90700010, 12, 1}, {0x90700010, 13, 1},
+               {0x90700010, 14, 1}, {0x90700010, 15, 1} };
+-      struct MXL_REG_FIELD_T xpt_clock_polarity[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T 
xpt_clock_polarity[MXL_HYDRA_DEMOD_MAX] = {
+               {0x90700010, 16, 1}, {0x90700010, 17, 1},
+               {0x90700010, 18, 1}, {0x90700010, 19, 1},
+               {0x90700010, 20, 1}, {0x90700010, 21, 1},
+               {0x90700010, 22, 1}, {0x90700010, 23, 1} };
+-      struct MXL_REG_FIELD_T xpt_valid_polarity[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T 
xpt_valid_polarity[MXL_HYDRA_DEMOD_MAX] = {
+               {0x90700014, 0, 1}, {0x90700014, 1, 1},
+               {0x90700014, 2, 1}, {0x90700014, 3, 1},
+               {0x90700014, 4, 1}, {0x90700014, 5, 1},
+               {0x90700014, 6, 1}, {0x90700014, 7, 1} };
+-      struct MXL_REG_FIELD_T xpt_ts_clock_phase[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T 
xpt_ts_clock_phase[MXL_HYDRA_DEMOD_MAX] = {
+               {0x90700018, 0, 3}, {0x90700018, 4, 3},
+               {0x90700018, 8, 3}, {0x90700018, 12, 3},
+               {0x90700018, 16, 3}, {0x90700018, 20, 3},
+               {0x90700018, 24, 3}, {0x90700018, 28, 3} };
+-      struct MXL_REG_FIELD_T xpt_lsb_first[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T xpt_lsb_first[MXL_HYDRA_DEMOD_MAX] 
= {
+               {0x9070000C, 16, 1}, {0x9070000C, 17, 1},
+               {0x9070000C, 18, 1}, {0x9070000C, 19, 1},
+               {0x9070000C, 20, 1}, {0x9070000C, 21, 1},
+               {0x9070000C, 22, 1}, {0x9070000C, 23, 1} };
+-      struct MXL_REG_FIELD_T xpt_sync_byte[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T xpt_sync_byte[MXL_HYDRA_DEMOD_MAX] 
= {
+               {0x90700010, 0, 1}, {0x90700010, 1, 1},
+               {0x90700010, 2, 1}, {0x90700010, 3, 1},
+               {0x90700010, 4, 1}, {0x90700010, 5, 1},
+               {0x90700010, 6, 1}, {0x90700010, 7, 1} };
+-      struct MXL_REG_FIELD_T xpt_enable_output[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T 
xpt_enable_output[MXL_HYDRA_DEMOD_MAX] = {
+               {0x9070000C, 0, 1}, {0x9070000C, 1, 1},
+               {0x9070000C, 2, 1}, {0x9070000C, 3, 1},
+               {0x9070000C, 4, 1}, {0x9070000C, 5, 1},
+               {0x9070000C, 6, 1}, {0x9070000C, 7, 1} };
+-      struct MXL_REG_FIELD_T xpt_err_replace_sync[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T 
xpt_err_replace_sync[MXL_HYDRA_DEMOD_MAX] = {
+               {0x9070000C, 24, 1}, {0x9070000C, 25, 1},
+               {0x9070000C, 26, 1}, {0x9070000C, 27, 1},
+               {0x9070000C, 28, 1}, {0x9070000C, 29, 1},
+               {0x9070000C, 30, 1}, {0x9070000C, 31, 1} };
+-      struct MXL_REG_FIELD_T xpt_err_replace_valid[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T 
xpt_err_replace_valid[MXL_HYDRA_DEMOD_MAX] = {
+               {0x90700014, 8, 1}, {0x90700014, 9, 1},
+               {0x90700014, 10, 1}, {0x90700014, 11, 1},
+               {0x90700014, 12, 1}, {0x90700014, 13, 1},
+               {0x90700014, 14, 1}, {0x90700014, 15, 1} };
+-      struct MXL_REG_FIELD_T xpt_continuous_clock[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T 
xpt_continuous_clock[MXL_HYDRA_DEMOD_MAX] = {
+               {0x907001D4, 0, 1}, {0x907001D4, 1, 1},
+               {0x907001D4, 2, 1}, {0x907001D4, 3, 1},
+               {0x907001D4, 4, 1}, {0x907001D4, 5, 1},
+               {0x907001D4, 6, 1}, {0x907001D4, 7, 1} };
+-      struct MXL_REG_FIELD_T xpt_nco_clock_rate[MXL_HYDRA_DEMOD_MAX] = {
++      static const struct MXL_REG_FIELD_T 
xpt_nco_clock_rate[MXL_HYDRA_DEMOD_MAX] = {
+               {0x90700044, 16, 80}, {0x90700044, 16, 81},
+               {0x90700044, 16, 82}, {0x90700044, 16, 83},
+               {0x90700044, 16, 84}, {0x90700044, 16, 85},
+diff --git a/drivers/media/mc/mc-devnode.c b/drivers/media/mc/mc-devnode.c
+index 680fbb3a93402..94abd042045da 100644
+--- a/drivers/media/mc/mc-devnode.c
++++ b/drivers/media/mc/mc-devnode.c
+@@ -246,15 +246,14 @@ int __must_check media_devnode_register(struct 
media_device *mdev,
+       kobject_set_name(&devnode->cdev.kobj, "media%d", devnode->minor);
+ 
+       /* Part 3: Add the media and char device */
++      set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
+       ret = cdev_device_add(&devnode->cdev, &devnode->dev);
+       if (ret < 0) {
++              clear_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
+               pr_err("%s: cdev_device_add failed\n", __func__);
+               goto cdev_add_error;
+       }
+ 
+-      /* Part 4: Activate this minor. The char device can now be used. */
+-      set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
+-
+       return 0;
+ 
+ cdev_add_error:
+diff --git a/drivers/media/mc/mc-entity.c b/drivers/media/mc/mc-entity.c
+index 8919df09e3e8d..bdb8f512be578 100644
+--- a/drivers/media/mc/mc-entity.c
++++ b/drivers/media/mc/mc-entity.c
+@@ -593,6 +593,12 @@ static int media_pipeline_explore_next_link(struct 
media_pipeline *pipe,
+       link = list_entry(entry->links, typeof(*link), list);
+       last_link = media_pipeline_walk_pop(walk);
+ 
++      if ((link->flags & MEDIA_LNK_FL_LINK_TYPE) != MEDIA_LNK_FL_DATA_LINK) {
++              dev_dbg(walk->mdev->dev,
++                      "media pipeline: skipping link (not data-link)\n");
++              return 0;
++      }
++
+       dev_dbg(walk->mdev->dev,
+               "media pipeline: exploring link '%s':%u -> '%s':%u\n",
+               link->source->entity->name, link->source->index,
+diff --git a/drivers/media/v4l2-core/v4l2-dev.c 
b/drivers/media/v4l2-core/v4l2-dev.c
+index 397d553177fa7..e73c749c99bd5 100644
+--- a/drivers/media/v4l2-core/v4l2-dev.c
++++ b/drivers/media/v4l2-core/v4l2-dev.c
+@@ -1033,8 +1033,10 @@ int __video_register_device(struct video_device *vdev,
+       vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor);
+       vdev->dev.parent = vdev->dev_parent;
+       dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num);
++      mutex_lock(&videodev_lock);
+       ret = device_register(&vdev->dev);
+       if (ret < 0) {
++              mutex_unlock(&videodev_lock);
+               pr_err("%s: device_register failed\n", __func__);
+               goto cleanup;
+       }
+@@ -1054,6 +1056,7 @@ int __video_register_device(struct video_device *vdev,
+ 
+       /* Part 6: Activate this minor. The char device can now be used. */
+       set_bit(V4L2_FL_REGISTERED, &vdev->flags);
++      mutex_unlock(&videodev_lock);
+ 
+       return 0;
+ 
+diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
+index 25c152ef5d60e..67230d486c283 100644
+--- a/drivers/mmc/core/host.c
++++ b/drivers/mmc/core/host.c
+@@ -119,13 +119,12 @@ void mmc_retune_enable(struct mmc_host *host)
+ 
+ /*
+  * Pause re-tuning for a small set of operations.  The pause begins after the
+- * next command and after first doing re-tuning.
++ * next command.
+  */
+ void mmc_retune_pause(struct mmc_host *host)
+ {
+       if (!host->retune_paused) {
+               host->retune_paused = 1;
+-              mmc_retune_needed(host);
+               mmc_retune_hold(host);
+       }
+ }
+diff --git a/drivers/mmc/core/slot-gpio.c b/drivers/mmc/core/slot-gpio.c
+index e3c69c6b85a6c..d5145c1ee81e7 100644
+--- a/drivers/mmc/core/slot-gpio.c
++++ b/drivers/mmc/core/slot-gpio.c
+@@ -206,6 +206,26 @@ int mmc_gpiod_request_cd(struct mmc_host *host, const 
char *con_id,
+ }
+ EXPORT_SYMBOL(mmc_gpiod_request_cd);
+ 
++/**
++ * mmc_gpiod_set_cd_config - set config for card-detection GPIO
++ * @host: mmc host
++ * @config: Generic pinconf config (from pinconf_to_config_packed())
++ *
++ * This can be used by mmc host drivers to fixup a card-detection GPIO's 
config
++ * (e.g. set PIN_CONFIG_BIAS_PULL_UP) after acquiring the GPIO descriptor
++ * through mmc_gpiod_request_cd().
++ *
++ * Returns:
++ * 0 on success, or a negative errno value on error.
++ */
++int mmc_gpiod_set_cd_config(struct mmc_host *host, unsigned long config)
++{
++      struct mmc_gpio *ctx = host->slot.handler_priv;
++
++      return gpiod_set_config(ctx->cd_gpio, config);
++}
++EXPORT_SYMBOL(mmc_gpiod_set_cd_config);
++
+ bool mmc_can_gpio_cd(struct mmc_host *host)
+ {
+       struct mmc_gpio *ctx = host->slot.handler_priv;
+diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c
+index b917060a258a4..eea0a7ddb5514 100644
+--- a/drivers/mmc/host/sdhci-acpi.c
++++ b/drivers/mmc/host/sdhci-acpi.c
+@@ -10,6 +10,7 @@
+ #include <linux/export.h>
+ #include <linux/module.h>
+ #include <linux/device.h>
++#include <linux/pinctrl/pinconf-generic.h>
+ #include <linux/platform_device.h>
+ #include <linux/ioport.h>
+ #include <linux/io.h>
+@@ -80,6 +81,8 @@ struct sdhci_acpi_host {
+ enum {
+       DMI_QUIRK_RESET_SD_SIGNAL_VOLT_ON_SUSP                  = BIT(0),
+       DMI_QUIRK_SD_NO_WRITE_PROTECT                           = BIT(1),
++      DMI_QUIRK_SD_CD_ACTIVE_HIGH                             = BIT(2),
++      DMI_QUIRK_SD_CD_ENABLE_PULL_UP                          = BIT(3),
+ };
+ 
+ static inline void *sdhci_acpi_priv(struct sdhci_acpi_host *c)
+@@ -719,7 +722,28 @@ static const struct acpi_device_id sdhci_acpi_ids[] = {
+ };
+ MODULE_DEVICE_TABLE(acpi, sdhci_acpi_ids);
+ 
++/* Please keep this list sorted alphabetically */
+ static const struct dmi_system_id sdhci_acpi_quirks[] = {
++      {
++              /*
++               * The Acer Aspire Switch 10 (SW5-012) microSD slot always
++               * reports the card being write-protected even though microSD
++               * cards do not have a write-protect switch at all.
++               */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
++              },
++              .driver_data = (void *)DMI_QUIRK_SD_NO_WRITE_PROTECT,
++      },
++      {
++              /* Asus T100TA, needs pull-up for cd but DSDT GpioInt has 
NoPull set */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "T100TA"),
++              },
++              .driver_data = (void *)DMI_QUIRK_SD_CD_ENABLE_PULL_UP,
++      },
+       {
+               /*
+                * The Lenovo Miix 320-10ICR has a bug in the _PS0 method of
+@@ -736,15 +760,23 @@ static const struct dmi_system_id sdhci_acpi_quirks[] = {
+       },
+       {
+               /*
+-               * The Acer Aspire Switch 10 (SW5-012) microSD slot always
+-               * reports the card being write-protected even though microSD
+-               * cards do not have a write-protect switch at all.
++               * Lenovo Yoga Tablet 2 Pro 1380F/L (13" Android version) this
++               * has broken WP reporting and an inverted CD signal.
++               * Note this has more or less the same BIOS as the Lenovo Yoga
++               * Tablet 2 830F/L or 1050F/L (8" and 10" Android), but unlike
++               * the 830 / 1050 models which share the same mainboard this
++               * model has a different mainboard and the inverted CD and
++               * broken WP are unique to this board.
+                */
+               .matches = {
+-                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
++                      DMI_MATCH(DMI_SYS_VENDOR, "Intel Corp."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "VALLEYVIEW C0 PLATFORM"),
++                      DMI_MATCH(DMI_BOARD_NAME, "BYT-T FFD8"),
++                      /* Full match so as to NOT match the 830/1050 BIOS */
++                      DMI_MATCH(DMI_BIOS_VERSION, 
"BLADE_21.X64.0005.R00.1504101516"),
+               },
+-              .driver_data = (void *)DMI_QUIRK_SD_NO_WRITE_PROTECT,
++              .driver_data = (void *)(DMI_QUIRK_SD_NO_WRITE_PROTECT |
++                                      DMI_QUIRK_SD_CD_ACTIVE_HIGH),
+       },
+       {
+               /*
+@@ -757,6 +789,17 @@ static const struct dmi_system_id sdhci_acpi_quirks[] = {
+               },
+               .driver_data = (void *)DMI_QUIRK_SD_NO_WRITE_PROTECT,
+       },
++      {
++              /*
++               * The Toshiba WT10-A's microSD slot always reports the card 
being
++               * write-protected.
++               */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "TOSHIBA WT10-A"),
++              },
++              .driver_data = (void *)DMI_QUIRK_SD_NO_WRITE_PROTECT,
++      },
+       {} /* Terminating entry */
+ };
+ 
+@@ -866,12 +909,18 @@ static int sdhci_acpi_probe(struct platform_device *pdev)
+       if (sdhci_acpi_flag(c, SDHCI_ACPI_SD_CD)) {
+               bool v = sdhci_acpi_flag(c, SDHCI_ACPI_SD_CD_OVERRIDE_LEVEL);
+ 
++              if (quirks & DMI_QUIRK_SD_CD_ACTIVE_HIGH)
++                      host->mmc->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
++
+               err = mmc_gpiod_request_cd(host->mmc, NULL, 0, v, 0);
+               if (err) {
+                       if (err == -EPROBE_DEFER)
+                               goto err_free;
+                       dev_warn(dev, "failed to setup card detect gpio\n");
+                       c->use_runtime_pm = false;
++              } else if (quirks & DMI_QUIRK_SD_CD_ENABLE_PULL_UP) {
++                      mmc_gpiod_set_cd_config(host->mmc,
++                                              
PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 20000));
+               }
+ 
+               if (quirks & DMI_QUIRK_RESET_SD_SIGNAL_VOLT_ON_SUSP)
+diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
+index ad73d528a1bd4..111f7c6770605 100644
+--- a/drivers/mmc/host/sdhci.c
++++ b/drivers/mmc/host/sdhci.c
+@@ -3466,12 +3466,18 @@ static void sdhci_data_irq(struct sdhci_host *host, 
u32 intmask)
+               host->data->error = -EILSEQ;
+               if (!mmc_op_tuning(SDHCI_GET_CMD(sdhci_readw(host, 
SDHCI_COMMAND))))
+                       sdhci_err_stats_inc(host, DAT_CRC);
+-      } else if ((intmask & SDHCI_INT_DATA_CRC) &&
++      } else if ((intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_TUNING_ERROR)) &&
+               SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND))
+                       != MMC_BUS_TEST_R) {
+               host->data->error = -EILSEQ;
+               if (!mmc_op_tuning(SDHCI_GET_CMD(sdhci_readw(host, 
SDHCI_COMMAND))))
+                       sdhci_err_stats_inc(host, DAT_CRC);
++              if (intmask & SDHCI_INT_TUNING_ERROR) {
++                      u16 ctrl2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
++
++                      ctrl2 &= ~SDHCI_CTRL_TUNED_CLK;
++                      sdhci_writew(host, ctrl2, SDHCI_HOST_CONTROL2);
++              }
+       } else if (intmask & SDHCI_INT_ADMA_ERROR) {
+               pr_err("%s: ADMA error: 0x%08x\n", mmc_hostname(host->mmc),
+                      intmask);
+@@ -4006,7 +4012,7 @@ bool sdhci_cqe_irq(struct sdhci_host *host, u32 intmask, 
int *cmd_error,
+       } else
+               *cmd_error = 0;
+ 
+-      if (intmask & (SDHCI_INT_DATA_END_BIT | SDHCI_INT_DATA_CRC)) {
++      if (intmask & (SDHCI_INT_DATA_END_BIT | SDHCI_INT_DATA_CRC | 
SDHCI_INT_TUNING_ERROR)) {
+               *data_error = -EILSEQ;
+               if (!mmc_op_tuning(SDHCI_GET_CMD(sdhci_readw(host, 
SDHCI_COMMAND))))
+                       sdhci_err_stats_inc(host, DAT_CRC);
+diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
+index 5ce7cdcc192fd..901482d5e73f7 100644
+--- a/drivers/mmc/host/sdhci.h
++++ b/drivers/mmc/host/sdhci.h
+@@ -151,6 +151,7 @@
+ #define  SDHCI_INT_BUS_POWER  0x00800000
+ #define  SDHCI_INT_AUTO_CMD_ERR       0x01000000
+ #define  SDHCI_INT_ADMA_ERROR 0x02000000
++#define  SDHCI_INT_TUNING_ERROR       0x04000000
+ 
+ #define  SDHCI_INT_NORMAL_MASK        0x00007FFF
+ #define  SDHCI_INT_ERROR_MASK 0xFFFF8000
+@@ -162,7 +163,7 @@
+               SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \
+               SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC | \
+               SDHCI_INT_DATA_END_BIT | SDHCI_INT_ADMA_ERROR | \
+-              SDHCI_INT_BLK_GAP)
++              SDHCI_INT_BLK_GAP | SDHCI_INT_TUNING_ERROR)
+ #define SDHCI_INT_ALL_MASK    ((unsigned int)-1)
+ 
+ #define SDHCI_CQE_INT_ERR_MASK ( \
+diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
+index 01ce289f4abf0..a7ae68f490c4c 100644
+--- a/drivers/net/vxlan/vxlan_core.c
++++ b/drivers/net/vxlan/vxlan_core.c
+@@ -1662,10 +1662,6 @@ static bool vxlan_set_mac(struct vxlan_dev *vxlan,
+       if (ether_addr_equal(eth_hdr(skb)->h_source, vxlan->dev->dev_addr))
+               return false;
+ 
+-      /* Ignore packets from invalid src-address */
+-      if (!is_valid_ether_addr(eth_hdr(skb)->h_source))
+-              return false;
+-
+       /* Get address from the outer IP header */
+       if (vxlan_get_sk_family(vs) == AF_INET) {
+               saddr.sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
+diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c 
b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+index ccac47dd781d6..9ccf8550a0679 100644
+--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+@@ -1389,13 +1389,13 @@ rtl8xxxu_gen1_set_tx_power(struct rtl8xxxu_priv *priv, 
int channel, bool ht40)
+       u8 cck[RTL8723A_MAX_RF_PATHS], ofdm[RTL8723A_MAX_RF_PATHS];
+       u8 ofdmbase[RTL8723A_MAX_RF_PATHS], mcsbase[RTL8723A_MAX_RF_PATHS];
+       u32 val32, ofdm_a, ofdm_b, mcs_a, mcs_b;
+-      u8 val8;
++      u8 val8, base;
+       int group, i;
+ 
+       group = rtl8xxxu_gen1_channel_to_group(channel);
+ 
+-      cck[0] = priv->cck_tx_power_index_A[group] - 1;
+-      cck[1] = priv->cck_tx_power_index_B[group] - 1;
++      cck[0] = priv->cck_tx_power_index_A[group];
++      cck[1] = priv->cck_tx_power_index_B[group];
+ 
+       if (priv->hi_pa) {
+               if (cck[0] > 0x20)
+@@ -1406,10 +1406,6 @@ rtl8xxxu_gen1_set_tx_power(struct rtl8xxxu_priv *priv, 
int channel, bool ht40)
+ 
+       ofdm[0] = priv->ht40_1s_tx_power_index_A[group];
+       ofdm[1] = priv->ht40_1s_tx_power_index_B[group];
+-      if (ofdm[0])
+-              ofdm[0] -= 1;
+-      if (ofdm[1])
+-              ofdm[1] -= 1;
+ 
+       ofdmbase[0] = ofdm[0] + priv->ofdm_tx_power_index_diff[group].a;
+       ofdmbase[1] = ofdm[1] + priv->ofdm_tx_power_index_diff[group].b;
+@@ -1498,20 +1494,19 @@ rtl8xxxu_gen1_set_tx_power(struct rtl8xxxu_priv *priv, 
int channel, bool ht40)
+ 
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS15_MCS12,
+                        mcs_a + power_base->reg_0e1c);
++      val8 = u32_get_bits(mcs_a + power_base->reg_0e1c, 0xff000000);
+       for (i = 0; i < 3; i++) {
+-              if (i != 2)
+-                      val8 = (mcsbase[0] > 8) ? (mcsbase[0] - 8) : 0;
+-              else
+-                      val8 = (mcsbase[0] > 6) ? (mcsbase[0] - 6) : 0;
++              base = i != 2 ? 8 : 6;
++              val8 = max_t(int, val8 - base, 0);
+               rtl8xxxu_write8(priv, REG_OFDM0_XC_TX_IQ_IMBALANCE + i, val8);
+       }
++
+       rtl8xxxu_write32(priv, REG_TX_AGC_B_MCS15_MCS12,
+                        mcs_b + power_base->reg_0868);
++      val8 = u32_get_bits(mcs_b + power_base->reg_0868, 0xff000000);
+       for (i = 0; i < 3; i++) {
+-              if (i != 2)
+-                      val8 = (mcsbase[1] > 8) ? (mcsbase[1] - 8) : 0;
+-              else
+-                      val8 = (mcsbase[1] > 6) ? (mcsbase[1] - 6) : 0;
++              base = i != 2 ? 8 : 6;
++              val8 = max_t(int, val8 - base, 0);
+               rtl8xxxu_write8(priv, REG_OFDM0_XD_TX_IQ_IMBALANCE + i, val8);
+       }
+ }
+diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c
+index d835a27429f0f..56b5cd032a9ac 100644
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c
+@@ -892,8 +892,8 @@ static u8 _rtl92c_phy_get_rightchnlplace(u8 chnl)
+       u8 place = chnl;
+ 
+       if (chnl > 14) {
+-              for (place = 14; place < ARRAY_SIZE(channel5g); place++) {
+-                      if (channel5g[place] == chnl) {
++              for (place = 14; place < ARRAY_SIZE(channel_all); place++) {
++                      if (channel_all[place] == chnl) {
+                               place++;
+                               break;
+                       }
+diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c
+index 807b66c16e111..b1456fb921c2f 100644
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c
+@@ -35,7 +35,7 @@ static long _rtl92de_translate_todbm(struct ieee80211_hw *hw,
+ 
+ static void _rtl92de_query_rxphystatus(struct ieee80211_hw *hw,
+                                      struct rtl_stats *pstats,
+-                                     struct rx_desc_92d *pdesc,
++                                     __le32 *pdesc,
+                                      struct rx_fwinfo_92d *p_drvinfo,
+                                      bool packet_match_bssid,
+                                      bool packet_toself,
+@@ -49,8 +49,10 @@ static void _rtl92de_query_rxphystatus(struct ieee80211_hw 
*hw,
+       u8 i, max_spatial_stream;
+       u32 rssi, total_rssi = 0;
+       bool is_cck_rate;
++      u8 rxmcs;
+ 
+-      is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
++      rxmcs = get_rx_desc_rxmcs(pdesc);
++      is_cck_rate = rxmcs <= DESC_RATE11M;
+       pstats->packet_matchbssid = packet_match_bssid;
+       pstats->packet_toself = packet_toself;
+       pstats->packet_beacon = packet_beacon;
+@@ -158,8 +160,8 @@ static void _rtl92de_query_rxphystatus(struct ieee80211_hw 
*hw,
+               pstats->rx_pwdb_all = pwdb_all;
+               pstats->rxpower = rx_pwr_all;
+               pstats->recvsignalpower = rx_pwr_all;
+-              if (pdesc->rxht && pdesc->rxmcs >= DESC_RATEMCS8 &&
+-                  pdesc->rxmcs <= DESC_RATEMCS15)
++              if (get_rx_desc_rxht(pdesc) && rxmcs >= DESC_RATEMCS8 &&
++                  rxmcs <= DESC_RATEMCS15)
+                       max_spatial_stream = 2;
+               else
+                       max_spatial_stream = 1;
+@@ -365,7 +367,7 @@ static void _rtl92de_process_phyinfo(struct ieee80211_hw 
*hw,
+ static void _rtl92de_translate_rx_signal_stuff(struct ieee80211_hw *hw,
+                                              struct sk_buff *skb,
+                                              struct rtl_stats *pstats,
+-                                             struct rx_desc_92d *pdesc,
++                                             __le32 *pdesc,
+                                              struct rx_fwinfo_92d *p_drvinfo)
+ {
+       struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
+@@ -414,7 +416,8 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,        
struct rtl_stats *stats,
+       stats->icv = (u16)get_rx_desc_icv(pdesc);
+       stats->crc = (u16)get_rx_desc_crc32(pdesc);
+       stats->hwerror = (stats->crc | stats->icv);
+-      stats->decrypted = !get_rx_desc_swdec(pdesc);
++      stats->decrypted = !get_rx_desc_swdec(pdesc) &&
++                         get_rx_desc_enc_type(pdesc) != RX_DESC_ENC_NONE;
+       stats->rate = (u8)get_rx_desc_rxmcs(pdesc);
+       stats->shortpreamble = (u16)get_rx_desc_splcp(pdesc);
+       stats->isampdu = (bool)(get_rx_desc_paggr(pdesc) == 1);
+@@ -427,8 +430,6 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,        
struct rtl_stats *stats,
+       rx_status->band = hw->conf.chandef.chan->band;
+       if (get_rx_desc_crc32(pdesc))
+               rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
+-      if (!get_rx_desc_swdec(pdesc))
+-              rx_status->flag |= RX_FLAG_DECRYPTED;
+       if (get_rx_desc_bw(pdesc))
+               rx_status->bw = RATE_INFO_BW_40;
+       if (get_rx_desc_rxht(pdesc))
+@@ -442,9 +443,7 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,        
struct rtl_stats *stats,
+       if (phystatus) {
+               p_drvinfo = (struct rx_fwinfo_92d *)(skb->data +
+                                                    stats->rx_bufshift);
+-              _rtl92de_translate_rx_signal_stuff(hw,
+-                                                 skb, stats,
+-                                                 (struct rx_desc_92d *)pdesc,
++              _rtl92de_translate_rx_signal_stuff(hw, skb, stats, pdesc,
+                                                  p_drvinfo);
+       }
+       /*rx_status->qual = stats->signal; */
+diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h
+index d01578875cd5f..eb3f768140b5b 100644
+--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h
++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h
+@@ -14,6 +14,15 @@
+ #define USB_HWDESC_HEADER_LEN                 32
+ #define CRCLENGTH                             4
+ 
++enum rtl92d_rx_desc_enc {
++      RX_DESC_ENC_NONE        = 0,
++      RX_DESC_ENC_WEP40       = 1,
++      RX_DESC_ENC_TKIP_WO_MIC = 2,
++      RX_DESC_ENC_TKIP_MIC    = 3,
++      RX_DESC_ENC_AES         = 4,
++      RX_DESC_ENC_WEP104      = 5,
++};
++
+ /* macros to read/write various fields in RX or TX descriptors */
+ 
+ static inline void set_tx_desc_pkt_size(__le32 *__pdesc, u32 __val)
+@@ -246,6 +255,11 @@ static inline u32 get_rx_desc_drv_info_size(__le32 
*__pdesc)
+       return le32_get_bits(*__pdesc, GENMASK(19, 16));
+ }
+ 
++static inline u32 get_rx_desc_enc_type(__le32 *__pdesc)
++{
++      return le32_get_bits(*__pdesc, GENMASK(22, 20));
++}
++
+ static inline u32 get_rx_desc_shift(__le32 *__pdesc)
+ {
+       return le32_get_bits(*__pdesc, GENMASK(25, 24));
+@@ -380,10 +394,17 @@ struct rx_fwinfo_92d {
+       u8 csi_target[2];
+       u8 sigevm;
+       u8 max_ex_pwr;
++#ifdef __LITTLE_ENDIAN
+       u8 ex_intf_flag:1;
+       u8 sgi_en:1;
+       u8 rxsc:2;
+       u8 reserve:4;
++#else
++      u8 reserve:4;
++      u8 rxsc:2;
++      u8 sgi_en:1;
++      u8 ex_intf_flag:1;
++#endif
+ } __packed;
+ 
+ struct tx_desc_92d {
+@@ -488,64 +509,6 @@ struct tx_desc_92d {
+       u32 reserve_pass_pcie_mm_limit[4];
+ } __packed;
+ 
+-struct rx_desc_92d {
+-      u32 length:14;
+-      u32 crc32:1;
+-      u32 icverror:1;
+-      u32 drv_infosize:4;
+-      u32 security:3;
+-      u32 qos:1;
+-      u32 shift:2;
+-      u32 phystatus:1;
+-      u32 swdec:1;
+-      u32 lastseg:1;
+-      u32 firstseg:1;
+-      u32 eor:1;
+-      u32 own:1;
+-
+-      u32 macid:5;
+-      u32 tid:4;
+-      u32 hwrsvd:5;
+-      u32 paggr:1;
+-      u32 faggr:1;
+-      u32 a1_fit:4;
+-      u32 a2_fit:4;
+-      u32 pam:1;
+-      u32 pwr:1;
+-      u32 moredata:1;
+-      u32 morefrag:1;
+-      u32 type:2;
+-      u32 mc:1;
+-      u32 bc:1;
+-
+-      u32 seq:12;
+-      u32 frag:4;
+-      u32 nextpktlen:14;
+-      u32 nextind:1;
+-      u32 rsvd:1;
+-
+-      u32 rxmcs:6;
+-      u32 rxht:1;
+-      u32 amsdu:1;
+-      u32 splcp:1;
+-      u32 bandwidth:1;
+-      u32 htc:1;
+-      u32 tcpchk_rpt:1;
+-      u32 ipcchk_rpt:1;
+-      u32 tcpchk_valid:1;
+-      u32 hwpcerr:1;
+-      u32 hwpcind:1;
+-      u32 iv0:16;
+-
+-      u32 iv1;
+-
+-      u32 tsfl;
+-
+-      u32 bufferaddress;
+-      u32 bufferaddress64;
+-
+-} __packed;
+-
+ void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
+                         struct ieee80211_hdr *hdr, u8 *pdesc,
+                         u8 *pbd_desc_tx, struct ieee80211_tx_info *info,
+diff --git a/drivers/net/wireless/realtek/rtw89/mac80211.c 
b/drivers/net/wireless/realtek/rtw89/mac80211.c
+index a8f478f0cde90..3a108b13aa596 100644
+--- a/drivers/net/wireless/realtek/rtw89/mac80211.c
++++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
+@@ -263,7 +263,7 @@ static u8 rtw89_aifsn_to_aifs(struct rtw89_dev *rtwdev,
+       u8 sifs;
+ 
+       slot_time = vif->bss_conf.use_short_slot ? 9 : 20;
+-      sifs = chan->band_type == RTW89_BAND_5G ? 16 : 10;
++      sifs = chan->band_type == RTW89_BAND_2G ? 10 : 16;
+ 
+       return aifsn * slot_time + sifs;
+ }
+diff --git a/drivers/net/wireless/realtek/rtw89/pci.c 
b/drivers/net/wireless/realtek/rtw89/pci.c
+index 4a012962cd441..58b6f7d4cab8b 100644
+--- a/drivers/net/wireless/realtek/rtw89/pci.c
++++ b/drivers/net/wireless/realtek/rtw89/pci.c
+@@ -948,7 +948,8 @@ u32 __rtw89_pci_check_and_reclaim_tx_resource_noio(struct 
rtw89_dev *rtwdev,
+ 
+       spin_lock_bh(&rtwpci->trx_lock);
+       cnt = rtw89_pci_get_avail_txbd_num(tx_ring);
+-      cnt = min(cnt, wd_ring->curr_num);
++      if (txch != RTW89_TXCH_CH12)
++              cnt = min(cnt, wd_ring->curr_num);
+       spin_unlock_bh(&rtwpci->trx_lock);
+ 
+       return cnt;
+diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
+index 4c0f9fe1ba779..c692b55dd1169 100644
+--- a/drivers/s390/crypto/ap_bus.c
++++ b/drivers/s390/crypto/ap_bus.c
+@@ -1088,7 +1088,7 @@ static int hex2bitmap(const char *str, unsigned long 
*bitmap, int bits)
+  */
+ static int modify_bitmap(const char *str, unsigned long *bitmap, int bits)
+ {
+-      int a, i, z;
++      unsigned long a, i, z;
+       char *np, sign;
+ 
+       /* bits needs to be a multiple of 8 */
+diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
+index e70ab8db30142..7b79cd435d7ab 100644
+--- a/drivers/scsi/scsi.c
++++ b/drivers/scsi/scsi.c
+@@ -350,6 +350,13 @@ static int scsi_get_vpd_size(struct scsi_device *sdev, u8 
page)
+               if (result < SCSI_VPD_HEADER_SIZE)
+                       return 0;
+ 
++              if (result > sizeof(vpd)) {
++                      dev_warn_once(&sdev->sdev_gendev,
++                                    "%s: long VPD page 0 length: %d bytes\n",
++                                    __func__, result);
++                      result = sizeof(vpd);
++              }
++
+               result -= SCSI_VPD_HEADER_SIZE;
+               if (!memchr(&vpd[SCSI_VPD_HEADER_SIZE], page, result))
+                       return 0;
+diff --git a/drivers/soc/qcom/cmd-db.c b/drivers/soc/qcom/cmd-db.c
+index 629a7188b576f..2a7d089ec7270 100644
+--- a/drivers/soc/qcom/cmd-db.c
++++ b/drivers/soc/qcom/cmd-db.c
+@@ -1,6 +1,10 @@
+ /* SPDX-License-Identifier: GPL-2.0 */
+-/* Copyright (c) 2016-2018, 2020, The Linux Foundation. All rights reserved. 
*/
++/*
++ * Copyright (c) 2016-2018, 2020, The Linux Foundation. All rights reserved.
++ * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
++ */
+ 
++#include <linux/bitfield.h>
+ #include <linux/debugfs.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+@@ -17,6 +21,8 @@
+ #define MAX_SLV_ID            8
+ #define SLAVE_ID_MASK         0x7
+ #define SLAVE_ID_SHIFT                16
++#define SLAVE_ID(addr)                FIELD_GET(GENMASK(19, 16), addr)
++#define VRM_ADDR(addr)                FIELD_GET(GENMASK(19, 4), addr)
+ 
+ /**
+  * struct entry_header: header for each entry in cmddb
+@@ -220,6 +226,30 @@ const void *cmd_db_read_aux_data(const char *id, size_t 
*len)
+ }
+ EXPORT_SYMBOL(cmd_db_read_aux_data);
+ 
++/**
++ * cmd_db_match_resource_addr() - Compare if both Resource addresses are same
++ *
++ * @addr1: Resource address to compare
++ * @addr2: Resource address to compare
++ *
++ * Return: true if two addresses refer to the same resource, false otherwise
++ */
++bool cmd_db_match_resource_addr(u32 addr1, u32 addr2)
++{
++      /*
++       * Each RPMh VRM accelerator resource has 3 or 4 contiguous 4-byte
++       * aligned addresses associated with it. Ignore the offset to check
++       * for VRM requests.
++       */
++      if (addr1 == addr2)
++              return true;
++      else if (SLAVE_ID(addr1) == CMD_DB_HW_VRM && VRM_ADDR(addr1) == 
VRM_ADDR(addr2))
++              return true;
++
++      return false;
++}
++EXPORT_SYMBOL_GPL(cmd_db_match_resource_addr);
++
+ /**
+  * cmd_db_read_slave_id - Get the slave ID for a given resource address
+  *
+diff --git a/drivers/soc/qcom/rpmh-rsc.c b/drivers/soc/qcom/rpmh-rsc.c
+index 01c2f50cb97ef..5e7bb6338707d 100644
+--- a/drivers/soc/qcom/rpmh-rsc.c
++++ b/drivers/soc/qcom/rpmh-rsc.c
+@@ -1,6 +1,7 @@
+ // SPDX-License-Identifier: GPL-2.0
+ /*
+  * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
++ * Copyright (c) 2023-2024, Qualcomm Innovation Center, Inc. All rights 
reserved.
+  */
+ 
+ #define pr_fmt(fmt) "%s " fmt, KBUILD_MODNAME
+@@ -519,7 +520,7 @@ static int check_for_req_inflight(struct rsc_drv *drv, 
struct tcs_group *tcs,
+               for_each_set_bit(j, &curr_enabled, MAX_CMDS_PER_TCS) {
+                       addr = read_tcs_cmd(drv, RSC_DRV_CMD_ADDR, i, j);
+                       for (k = 0; k < msg->num_cmds; k++) {
+-                              if (addr == msg->cmds[k].addr)
++                              if 
(cmd_db_match_resource_addr(msg->cmds[k].addr, addr))
+                                       return -EBUSY;
+                       }
+               }
+diff --git a/drivers/thermal/qcom/lmh.c b/drivers/thermal/qcom/lmh.c
+index 4122a51e98741..97cf0dc3a6c38 100644
+--- a/drivers/thermal/qcom/lmh.c
++++ b/drivers/thermal/qcom/lmh.c
+@@ -95,6 +95,9 @@ static int lmh_probe(struct platform_device *pdev)
+       unsigned int enable_alg;
+       u32 node_id;
+ 
++      if (!qcom_scm_is_available())
++              return -EPROBE_DEFER;
++
+       lmh_data = devm_kzalloc(dev, sizeof(*lmh_data), GFP_KERNEL);
+       if (!lmh_data)
+               return -ENOMEM;
+diff --git a/drivers/video/fbdev/savage/savagefb_driver.c 
b/drivers/video/fbdev/savage/savagefb_driver.c
+index a7b63c475f954..78eee242fc992 100644
+--- a/drivers/video/fbdev/savage/savagefb_driver.c
++++ b/drivers/video/fbdev/savage/savagefb_driver.c
+@@ -2277,7 +2277,10 @@ static int savagefb_probe(struct pci_dev *dev, const 
struct pci_device_id *id)
+       if (info->var.xres_virtual > 0x1000)
+               info->var.xres_virtual = 0x1000;
+ #endif
+-      savagefb_check_var(&info->var, info);
++      err = savagefb_check_var(&info->var, info);
++      if (err)
++              goto failed;
++
+       savagefb_set_fix(info);
+ 
+       /*
+diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c
+index ea617c0f97470..fe27039f6f5ae 100644
+--- a/drivers/watchdog/rti_wdt.c
++++ b/drivers/watchdog/rti_wdt.c
+@@ -52,6 +52,8 @@
+ 
+ #define DWDST                 BIT(1)
+ 
++#define MAX_HW_ERROR          250
++
+ static int heartbeat = DEFAULT_HEARTBEAT;
+ 
+ /*
+@@ -90,7 +92,7 @@ static int rti_wdt_start(struct watchdog_device *wdd)
+        * to be 50% or less than that; we obviouly want to configure the open
+        * window as large as possible so we select the 50% option.
+        */
+-      wdd->min_hw_heartbeat_ms = 500 * wdd->timeout;
++      wdd->min_hw_heartbeat_ms = 520 * wdd->timeout + MAX_HW_ERROR;
+ 
+       /* Generate NMI when wdt expires */
+       writel_relaxed(RTIWWDRX_NMI, wdt->base + RTIWWDRXCTRL);
+@@ -124,31 +126,33 @@ static int rti_wdt_setup_hw_hb(struct watchdog_device 
*wdd, u32 wsize)
+        * be petted during the open window; not too early or not too late.
+        * The HW configuration options only allow for the open window size
+        * to be 50% or less than that.
++       * To avoid any glitches, we accommodate 2% + max hardware error
++       * safety margin.
+        */
+       switch (wsize) {
+       case RTIWWDSIZE_50P:
+-              /* 50% open window => 50% min heartbeat */
+-              wdd->min_hw_heartbeat_ms = 500 * heartbeat;
++              /* 50% open window => 52% min heartbeat */
++              wdd->min_hw_heartbeat_ms = 520 * heartbeat + MAX_HW_ERROR;
+               break;
+ 
+       case RTIWWDSIZE_25P:
+-              /* 25% open window => 75% min heartbeat */
+-              wdd->min_hw_heartbeat_ms = 750 * heartbeat;
++              /* 25% open window => 77% min heartbeat */
++              wdd->min_hw_heartbeat_ms = 770 * heartbeat + MAX_HW_ERROR;
+               break;
+ 
+       case RTIWWDSIZE_12P5:
+-              /* 12.5% open window => 87.5% min heartbeat */
+-              wdd->min_hw_heartbeat_ms = 875 * heartbeat;
++              /* 12.5% open window => 89.5% min heartbeat */
++              wdd->min_hw_heartbeat_ms = 895 * heartbeat + MAX_HW_ERROR;
+               break;
+ 
+       case RTIWWDSIZE_6P25:
+-              /* 6.5% open window => 93.5% min heartbeat */
+-              wdd->min_hw_heartbeat_ms = 935 * heartbeat;
++              /* 6.5% open window => 95.5% min heartbeat */
++              wdd->min_hw_heartbeat_ms = 955 * heartbeat + MAX_HW_ERROR;
+               break;
+ 
+       case RTIWWDSIZE_3P125:
+-              /* 3.125% open window => 96.9% min heartbeat */
+-              wdd->min_hw_heartbeat_ms = 969 * heartbeat;
++              /* 3.125% open window => 98.9% min heartbeat */
++              wdd->min_hw_heartbeat_ms = 989 * heartbeat + MAX_HW_ERROR;
+               break;
+ 
+       default:
+@@ -221,14 +225,6 @@ static int rti_wdt_probe(struct platform_device *pdev)
+               return -EINVAL;
+       }
+ 
+-      /*
+-       * If watchdog is running at 32k clock, it is not accurate.
+-       * Adjust frequency down in this case so that we don't pet
+-       * the watchdog too often.
+-       */
+-      if (wdt->freq < 32768)
+-              wdt->freq = wdt->freq * 9 / 10;
+-
+       pm_runtime_enable(dev);
+       ret = pm_runtime_resume_and_get(dev);
+       if (ret < 0) {
+diff --git a/fs/9p/vfs_dentry.c b/fs/9p/vfs_dentry.c
+index f89f01734587b..55990098795ec 100644
+--- a/fs/9p/vfs_dentry.c
++++ b/fs/9p/vfs_dentry.c
+@@ -50,12 +50,17 @@ static int v9fs_cached_dentry_delete(const struct dentry 
*dentry)
+ static void v9fs_dentry_release(struct dentry *dentry)
+ {
+       struct hlist_node *p, *n;
++      struct hlist_head head;
+ 
+       p9_debug(P9_DEBUG_VFS, " dentry: %pd (%p)\n",
+                dentry, dentry);
+-      hlist_for_each_safe(p, n, (struct hlist_head *)&dentry->d_fsdata)
++
++      spin_lock(&dentry->d_lock);
++      hlist_move_list((struct hlist_head *)&dentry->d_fsdata, &head);
++      spin_unlock(&dentry->d_lock);
++
++      hlist_for_each_safe(p, n, &head)
+               p9_fid_put(hlist_entry(p, struct p9_fid, dlist));
+-      dentry->d_fsdata = NULL;
+ }
+ 
+ static int v9fs_lookup_revalidate(struct dentry *dentry, unsigned int flags)
+diff --git a/fs/afs/mntpt.c b/fs/afs/mntpt.c
+index 97f50e9fd9eb0..297487ee83231 100644
+--- a/fs/afs/mntpt.c
++++ b/fs/afs/mntpt.c
+@@ -140,6 +140,11 @@ static int afs_mntpt_set_params(struct fs_context *fc, 
struct dentry *mntpt)
+               put_page(page);
+               if (ret < 0)
+                       return ret;
++
++              /* Don't cross a backup volume mountpoint from a backup volume 
*/
++              if (src_as->volume && src_as->volume->type == AFSVL_BACKVOL &&
++                  ctx->type == AFSVL_BACKVOL)
++                      return -ENODEV;
+       }
+ 
+       return 0;
+diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
+index 7c33b28c02aeb..b7a5bf88193f9 100644
+--- a/fs/btrfs/tree-log.c
++++ b/fs/btrfs/tree-log.c
+@@ -4845,18 +4845,23 @@ static int btrfs_log_prealloc_extents(struct 
btrfs_trans_handle *trans,
+                       path->slots[0]++;
+                       continue;
+               }
+-              if (!dropped_extents) {
+-                      /*
+-                       * Avoid logging extent items logged in past fsync calls
+-                       * and leading to duplicate keys in the log tree.
+-                       */
++              /*
++               * Avoid overlapping items in the log tree. The first time we
++               * get here, get rid of everything from a past fsync. After
++               * that, if the current extent starts before the end of the last
++               * extent we copied, truncate the last one. This can happen if
++               * an ordered extent completion modifies the subvolume tree
++               * while btrfs_next_leaf() has the tree unlocked.
++               */
++              if (!dropped_extents || key.offset < truncate_offset) {
+                       ret = truncate_inode_items(trans, root->log_root, inode,
+-                                                 truncate_offset,
++                                                 min(key.offset, 
truncate_offset),
+                                                  BTRFS_EXTENT_DATA_KEY);
+                       if (ret)
+                               goto out;
+                       dropped_extents = true;
+               }
++              truncate_offset = btrfs_file_extent_end(path);
+               if (ins_nr == 0)
+                       start_slot = slot;
+               ins_nr++;
+diff --git a/fs/ext4/mballoc.h b/fs/ext4/mballoc.h
+index 00b3898df4a76..538703499d083 100644
+--- a/fs/ext4/mballoc.h
++++ b/fs/ext4/mballoc.h
+@@ -180,8 +180,8 @@ struct ext4_allocation_context {
+ 
+       __u32 ac_groups_considered;
+       __u32 ac_flags;         /* allocation hints */
++      __u32 ac_groups_linear_remaining;
+       __u16 ac_groups_scanned;
+-      __u16 ac_groups_linear_remaining;
+       __u16 ac_found;
+       __u16 ac_tail;
+       __u16 ac_buddy;
+diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
+index eaed9fd2f890c..28d00ed833db4 100644
+--- a/fs/ext4/xattr.c
++++ b/fs/ext4/xattr.c
+@@ -3076,8 +3076,10 @@ ext4_xattr_block_cache_find(struct inode *inode,
+ 
+               bh = ext4_sb_bread(inode->i_sb, ce->e_value, REQ_PRIO);
+               if (IS_ERR(bh)) {
+-                      if (PTR_ERR(bh) == -ENOMEM)
++                      if (PTR_ERR(bh) == -ENOMEM) {
++                              mb_cache_entry_put(ea_block_cache, ce);
+                               return NULL;
++                      }
+                       bh = NULL;
+                       EXT4_ERROR_INODE(inode, "block %lu read error",
+                                        (unsigned long)ce->e_value);
+diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
+index 869bb6ec107cc..35b1c672644ee 100644
+--- a/fs/f2fs/inode.c
++++ b/fs/f2fs/inode.c
+@@ -298,6 +298,12 @@ static bool sanity_check_inode(struct inode *inode, 
struct page *node_page)
+               }
+       }
+ 
++      if (fi->i_xattr_nid && f2fs_check_nid_range(sbi, fi->i_xattr_nid)) {
++              f2fs_warn(sbi, "%s: inode (ino=%lx) has corrupted i_xattr_nid: 
%u, run fsck to fix.",
++                        __func__, inode->i_ino, fi->i_xattr_nid);
++              return false;
++      }
++
+       return true;
+ }
+ 
+diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
+index b3b801e7c4bc5..d921d7b7bec64 100644
+--- a/fs/nfs/internal.h
++++ b/fs/nfs/internal.h
+@@ -695,9 +695,9 @@ unsigned long nfs_block_bits(unsigned long bsize, unsigned 
char *nrbitsp)
+       if ((bsize & (bsize - 1)) || nrbitsp) {
+               unsigned char   nrbits;
+ 
+-              for (nrbits = 31; nrbits && !(bsize & (1 << nrbits)); nrbits--)
++              for (nrbits = 31; nrbits && !(bsize & (1UL << nrbits)); 
nrbits--)
+                       ;
+-              bsize = 1 << nrbits;
++              bsize = 1UL << nrbits;
+               if (nrbitsp)
+                       *nrbitsp = nrbits;
+       }
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index 7cc74f7451d67..bda3050817c90 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -5441,7 +5441,7 @@ static bool nfs4_read_plus_not_supported(struct rpc_task 
*task,
+       struct rpc_message *msg = &task->tk_msg;
+ 
+       if (msg->rpc_proc == &nfs4_procedures[NFSPROC4_CLNT_READ_PLUS] &&
+-          server->caps & NFS_CAP_READ_PLUS && task->tk_status == -ENOTSUPP) {
++          task->tk_status == -ENOTSUPP) {
+               server->caps &= ~NFS_CAP_READ_PLUS;
+               msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
+               rpc_restart_call_prepare(task);
+diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
+index 006df4eac9fab..dfc459a62fb30 100644
+--- a/fs/nilfs2/segment.c
++++ b/fs/nilfs2/segment.c
+@@ -2159,8 +2159,10 @@ static void nilfs_segctor_start_timer(struct 
nilfs_sc_info *sci)
+ {
+       spin_lock(&sci->sc_state_lock);
+       if (!(sci->sc_state & NILFS_SEGCTOR_COMMIT)) {
+-              sci->sc_timer.expires = jiffies + sci->sc_interval;
+-              add_timer(&sci->sc_timer);
++              if (sci->sc_task) {
++                      sci->sc_timer.expires = jiffies + sci->sc_interval;
++                      add_timer(&sci->sc_timer);
++              }
+               sci->sc_state |= NILFS_SEGCTOR_COMMIT;
+       }
+       spin_unlock(&sci->sc_state_lock);
+@@ -2378,10 +2380,21 @@ int nilfs_construct_dsync_segment(struct super_block 
*sb, struct inode *inode,
+  */
+ static void nilfs_segctor_accept(struct nilfs_sc_info *sci)
+ {
++      bool thread_is_alive;
++
+       spin_lock(&sci->sc_state_lock);
+       sci->sc_seq_accepted = sci->sc_seq_request;
++      thread_is_alive = (bool)sci->sc_task;
+       spin_unlock(&sci->sc_state_lock);
+-      del_timer_sync(&sci->sc_timer);
++
++      /*
++       * This function does not race with the log writer thread's
++       * termination.  Therefore, deleting sc_timer, which should not be
++       * done after the log writer thread exits, can be done safely outside
++       * the area protected by sc_state_lock.
++       */
++      if (thread_is_alive)
++              del_timer_sync(&sci->sc_timer);
+ }
+ 
+ /**
+@@ -2407,7 +2420,7 @@ static void nilfs_segctor_notify(struct nilfs_sc_info 
*sci, int mode, int err)
+                       sci->sc_flush_request &= ~FLUSH_DAT_BIT;
+ 
+               /* re-enable timer if checkpoint creation was not done */
+-              if ((sci->sc_state & NILFS_SEGCTOR_COMMIT) &&
++              if ((sci->sc_state & NILFS_SEGCTOR_COMMIT) && sci->sc_task &&
+                   time_before(jiffies, sci->sc_timer.expires))
+                       add_timer(&sci->sc_timer);
+       }
+@@ -2597,6 +2610,7 @@ static int nilfs_segctor_thread(void *arg)
+       int timeout = 0;
+ 
+       sci->sc_timer_task = current;
++      timer_setup(&sci->sc_timer, nilfs_construction_timeout, 0);
+ 
+       /* start sync. */
+       sci->sc_task = current;
+@@ -2663,6 +2677,7 @@ static int nilfs_segctor_thread(void *arg)
+  end_thread:
+       /* end sync. */
+       sci->sc_task = NULL;
++      del_timer_sync(&sci->sc_timer);
+       wake_up(&sci->sc_wait_task); /* for nilfs_segctor_kill_thread() */
+       spin_unlock(&sci->sc_state_lock);
+       return 0;
+@@ -2726,7 +2741,6 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct 
super_block *sb,
+       INIT_LIST_HEAD(&sci->sc_gc_inodes);
+       INIT_LIST_HEAD(&sci->sc_iput_queue);
+       INIT_WORK(&sci->sc_iput_work, nilfs_iput_work_func);
+-      timer_setup(&sci->sc_timer, nilfs_construction_timeout, 0);
+ 
+       sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT;
+       sci->sc_mjcp_freq = HZ * NILFS_SC_DEFAULT_SR_FREQ;
+@@ -2812,7 +2826,6 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info 
*sci)
+ 
+       down_write(&nilfs->ns_segctor_sem);
+ 
+-      del_timer_sync(&sci->sc_timer);
+       kfree(sci);
+ }
+ 
+diff --git a/fs/smb/client/smb2transport.c b/fs/smb/client/smb2transport.c
+index 69dbd08fd4419..763cf946e8491 100644
+--- a/fs/smb/client/smb2transport.c
++++ b/fs/smb/client/smb2transport.c
+@@ -213,8 +213,8 @@ smb2_find_smb_tcon(struct TCP_Server_Info *server, __u64 
ses_id, __u32  tid)
+       }
+       tcon = smb2_find_smb_sess_tcon_unlocked(ses, tid);
+       if (!tcon) {
+-              cifs_put_smb_ses(ses);
+               spin_unlock(&cifs_tcp_ses_lock);
++              cifs_put_smb_ses(ses);
+               return NULL;
+       }
+       spin_unlock(&cifs_tcp_ses_lock);
+diff --git a/include/linux/mmc/slot-gpio.h b/include/linux/mmc/slot-gpio.h
+index 4ae2f2908f993..d4a1567c94d0d 100644
+--- a/include/linux/mmc/slot-gpio.h
++++ b/include/linux/mmc/slot-gpio.h
+@@ -20,6 +20,7 @@ int mmc_gpiod_request_cd(struct mmc_host *host, const char 
*con_id,
+                        unsigned int debounce);
+ int mmc_gpiod_request_ro(struct mmc_host *host, const char *con_id,
+                        unsigned int idx, unsigned int debounce);
++int mmc_gpiod_set_cd_config(struct mmc_host *host, unsigned long config);
+ void mmc_gpio_set_cd_isr(struct mmc_host *host,
+                        irqreturn_t (*isr)(int irq, void *dev_id));
+ int mmc_gpio_set_cd_wake(struct mmc_host *host, bool on);
+diff --git a/include/linux/smp.h b/include/linux/smp.h
+index a80ab58ae3f1d..5b977f20c1399 100644
+--- a/include/linux/smp.h
++++ b/include/linux/smp.h
+@@ -211,6 +211,8 @@ smp_call_function_any(const struct cpumask *mask, 
smp_call_func_t func,
+ static inline void kick_all_cpus_sync(void) {  }
+ static inline void wake_up_all_idle_cpus(void) {  }
+ 
++#define setup_max_cpus 0
++
+ #ifdef CONFIG_UP_LATE_INIT
+ extern void __init up_late_init(void);
+ static inline void smp_init(void) { up_late_init(); }
+diff --git a/include/net/dst_ops.h b/include/net/dst_ops.h
+index 632086b2f644a..3ae2fda295073 100644
+--- a/include/net/dst_ops.h
++++ b/include/net/dst_ops.h
+@@ -24,7 +24,7 @@ struct dst_ops {
+       void                    (*destroy)(struct dst_entry *);
+       void                    (*ifdown)(struct dst_entry *,
+                                         struct net_device *dev, int how);
+-      struct dst_entry *      (*negative_advice)(struct dst_entry *);
++      void                    (*negative_advice)(struct sock *sk, struct 
dst_entry *);
+       void                    (*link_failure)(struct sk_buff *);
+       void                    (*update_pmtu)(struct dst_entry *dst, struct 
sock *sk,
+                                              struct sk_buff *skb, u32 mtu,
+diff --git a/include/net/sock.h b/include/net/sock.h
+index 77298c74822a6..9dab482078743 100644
+--- a/include/net/sock.h
++++ b/include/net/sock.h
+@@ -2212,17 +2212,10 @@ sk_dst_get(struct sock *sk)
+ 
+ static inline void __dst_negative_advice(struct sock *sk)
+ {
+-      struct dst_entry *ndst, *dst = __sk_dst_get(sk);
++      struct dst_entry *dst = __sk_dst_get(sk);
+ 
+-      if (dst && dst->ops->negative_advice) {
+-              ndst = dst->ops->negative_advice(dst);
+-
+-              if (ndst != dst) {
+-                      rcu_assign_pointer(sk->sk_dst_cache, ndst);
+-                      sk_tx_queue_clear(sk);
+-                      WRITE_ONCE(sk->sk_dst_pending_confirm, 0);
+-              }
+-      }
++      if (dst && dst->ops->negative_advice)
++              dst->ops->negative_advice(sk, dst);
+ }
+ 
+ static inline void dst_negative_advice(struct sock *sk)
+diff --git a/include/soc/qcom/cmd-db.h b/include/soc/qcom/cmd-db.h
+index c8bb56e6852a8..47a6cab75e630 100644
+--- a/include/soc/qcom/cmd-db.h
++++ b/include/soc/qcom/cmd-db.h
+@@ -1,5 +1,8 @@
+ /* SPDX-License-Identifier: GPL-2.0 */
+-/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. */
++/*
++ * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
++ * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
++ */
+ 
+ #ifndef __QCOM_COMMAND_DB_H__
+ #define __QCOM_COMMAND_DB_H__
+@@ -21,6 +24,8 @@ u32 cmd_db_read_addr(const char *resource_id);
+ 
+ const void *cmd_db_read_aux_data(const char *resource_id, size_t *len);
+ 
++bool cmd_db_match_resource_addr(u32 addr1, u32 addr2);
++
+ enum cmd_db_hw_type cmd_db_read_slave_id(const char *resource_id);
+ 
+ int cmd_db_ready(void);
+@@ -31,6 +36,9 @@ static inline u32 cmd_db_read_addr(const char *resource_id)
+ static inline const void *cmd_db_read_aux_data(const char *resource_id, 
size_t *len)
+ { return ERR_PTR(-ENODEV); }
+ 
++static inline bool cmd_db_match_resource_addr(u32 addr1, u32 addr2)
++{ return false; }
++
+ static inline enum cmd_db_hw_type cmd_db_read_slave_id(const char 
*resource_id)
+ { return -ENODEV; }
+ 
+diff --git a/init/main.c b/init/main.c
+index 2c339793511b5..e46aa00b3c997 100644
+--- a/init/main.c
++++ b/init/main.c
+@@ -607,7 +607,6 @@ static int __init rdinit_setup(char *str)
+ __setup("rdinit=", rdinit_setup);
+ 
+ #ifndef CONFIG_SMP
+-static const unsigned int setup_max_cpus = NR_CPUS;
+ static inline void setup_nr_cpu_ids(void) { }
+ static inline void smp_prepare_cpus(unsigned int maxcpus) { }
+ #endif
+diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c
+index 67d3c48a15222..b1f79d5a5a60e 100644
+--- a/kernel/debug/kdb/kdb_io.c
++++ b/kernel/debug/kdb/kdb_io.c
+@@ -171,6 +171,33 @@ char kdb_getchar(void)
+       unreachable();
+ }
+ 
++/**
++ * kdb_position_cursor() - Place cursor in the correct horizontal position
++ * @prompt: Nil-terminated string containing the prompt string
++ * @buffer: Nil-terminated string containing the entire command line
++ * @cp: Cursor position, pointer the character in buffer where the cursor
++ *      should be positioned.
++ *
++ * The cursor is positioned by sending a carriage-return and then printing
++ * the content of the line until we reach the correct cursor position.
++ *
++ * There is some additional fine detail here.
++ *
++ * Firstly, even though kdb_printf() will correctly format zero-width fields
++ * we want the second call to kdb_printf() to be conditional. That keeps 
things
++ * a little cleaner when LOGGING=1.
++ *
++ * Secondly, we can't combine everything into one call to kdb_printf() since
++ * that renders into a fixed length buffer and the combined print could result
++ * in unwanted truncation.
++ */
++static void kdb_position_cursor(char *prompt, char *buffer, char *cp)
++{
++      kdb_printf("\r%s", kdb_prompt_str);
++      if (cp > buffer)
++              kdb_printf("%.*s", (int)(cp - buffer), buffer);
++}
++
+ /*
+  * kdb_read
+  *
+@@ -199,7 +226,6 @@ static char *kdb_read(char *buffer, size_t bufsize)
+                                                * and null byte */
+       char *lastchar;
+       char *p_tmp;
+-      char tmp;
+       static char tmpbuffer[CMD_BUFLEN];
+       int len = strlen(buffer);
+       int len_tmp;
+@@ -236,12 +262,8 @@ static char *kdb_read(char *buffer, size_t bufsize)
+                       }
+                       *(--lastchar) = '\0';
+                       --cp;
+-                      kdb_printf("\b%s \r", cp);
+-                      tmp = *cp;
+-                      *cp = '\0';
+-                      kdb_printf(kdb_prompt_str);
+-                      kdb_printf("%s", buffer);
+-                      *cp = tmp;
++                      kdb_printf("\b%s ", cp);
++                      kdb_position_cursor(kdb_prompt_str, buffer, cp);
+               }
+               break;
+       case 13: /* enter */
+@@ -258,19 +280,14 @@ static char *kdb_read(char *buffer, size_t bufsize)
+                       memcpy(tmpbuffer, cp+1, lastchar - cp - 1);
+                       memcpy(cp, tmpbuffer, lastchar - cp - 1);
+                       *(--lastchar) = '\0';
+-                      kdb_printf("%s \r", cp);
+-                      tmp = *cp;
+-                      *cp = '\0';
+-                      kdb_printf(kdb_prompt_str);
+-                      kdb_printf("%s", buffer);
+-                      *cp = tmp;
++                      kdb_printf("%s ", cp);
++                      kdb_position_cursor(kdb_prompt_str, buffer, cp);
+               }
+               break;
+       case 1: /* Home */
+               if (cp > buffer) {
+-                      kdb_printf("\r");
+-                      kdb_printf(kdb_prompt_str);
+                       cp = buffer;
++                      kdb_position_cursor(kdb_prompt_str, buffer, cp);
+               }
+               break;
+       case 5: /* End */
+@@ -286,11 +303,10 @@ static char *kdb_read(char *buffer, size_t bufsize)
+               }
+               break;
+       case 14: /* Down */
+-              memset(tmpbuffer, ' ',
+-                     strlen(kdb_prompt_str) + (lastchar-buffer));
+-              *(tmpbuffer+strlen(kdb_prompt_str) +
+-                (lastchar-buffer)) = '\0';
+-              kdb_printf("\r%s\r", tmpbuffer);
++      case 16: /* Up */
++              kdb_printf("\r%*c\r",
++                         (int)(strlen(kdb_prompt_str) + (lastchar - buffer)),
++                         ' ');
+               *lastchar = (char)key;
+               *(lastchar+1) = '\0';
+               return lastchar;
+@@ -300,15 +316,6 @@ static char *kdb_read(char *buffer, size_t bufsize)
+                       ++cp;
+               }
+               break;
+-      case 16: /* Up */
+-              memset(tmpbuffer, ' ',
+-                     strlen(kdb_prompt_str) + (lastchar-buffer));
+-              *(tmpbuffer+strlen(kdb_prompt_str) +
+-                (lastchar-buffer)) = '\0';
+-              kdb_printf("\r%s\r", tmpbuffer);
+-              *lastchar = (char)key;
+-              *(lastchar+1) = '\0';
+-              return lastchar;
+       case 9: /* Tab */
+               if (tab < 2)
+                       ++tab;
+@@ -352,15 +359,25 @@ static char *kdb_read(char *buffer, size_t bufsize)
+                       kdb_printf("\n");
+                       kdb_printf(kdb_prompt_str);
+                       kdb_printf("%s", buffer);
++                      if (cp != lastchar)
++                              kdb_position_cursor(kdb_prompt_str, buffer, cp);
+               } else if (tab != 2 && count > 0) {
+-                      len_tmp = strlen(p_tmp);
+-                      strncpy(p_tmp+len_tmp, cp, lastchar-cp+1);
+-                      len_tmp = strlen(p_tmp);
+-                      strncpy(cp, p_tmp+len, len_tmp-len + 1);
+-                      len = len_tmp - len;
+-                      kdb_printf("%s", cp);
+-                      cp += len;
+-                      lastchar += len;
++                      /* How many new characters do we want from tmpbuffer? */
++                      len_tmp = strlen(p_tmp) - len;
++                      if (lastchar + len_tmp >= bufend)
++                              len_tmp = bufend - lastchar;
++
++                      if (len_tmp) {
++                              /* + 1 ensures the '\0' is memmove'd */
++                              memmove(cp+len_tmp, cp, (lastchar-cp) + 1);
++                              memcpy(cp, p_tmp+len, len_tmp);
++                              kdb_printf("%s", cp);
++                              cp += len_tmp;
++                              lastchar += len_tmp;
++                              if (cp != lastchar)
++                                      kdb_position_cursor(kdb_prompt_str,
++                                                          buffer, cp);
++                      }
+               }
+               kdb_nextline = 1; /* reset output line number */
+               break;
+@@ -371,13 +388,9 @@ static char *kdb_read(char *buffer, size_t bufsize)
+                               memcpy(cp+1, tmpbuffer, lastchar - cp);
+                               *++lastchar = '\0';
+                               *cp = key;
+-                              kdb_printf("%s\r", cp);
++                              kdb_printf("%s", cp);
+                               ++cp;
+-                              tmp = *cp;
+-                              *cp = '\0';
+-                              kdb_printf(kdb_prompt_str);
+-                              kdb_printf("%s", buffer);
+-                              *cp = tmp;
++                              kdb_position_cursor(kdb_prompt_str, buffer, cp);
+                       } else {
+                               *++lastchar = '\0';
+                               *cp++ = key;
+diff --git a/lib/maple_tree.c b/lib/maple_tree.c
+index 4976522e3e481..9a5bdf1e8e92a 100644
+--- a/lib/maple_tree.c
++++ b/lib/maple_tree.c
+@@ -5277,25 +5277,28 @@ static inline void mas_fill_gap(struct ma_state *mas, 
void *entry,
+  * @size: The size of the gap
+  * @fwd: Searching forward or back
+  */
+-static inline void mas_sparse_area(struct ma_state *mas, unsigned long min,
++static inline int mas_sparse_area(struct ma_state *mas, unsigned long min,
+                               unsigned long max, unsigned long size, bool fwd)
+ {
+-      unsigned long start = 0;
+-
+-      if (!unlikely(mas_is_none(mas)))
+-              start++;
++      if (!unlikely(mas_is_none(mas)) && min == 0) {
++              min++;
++              /*
++               * At this time, min is increased, we need to recheck whether
++               * the size is satisfied.
++               */
++              if (min > max || max - min + 1 < size)
++                      return -EBUSY;
++      }
+       /* mas_is_ptr */
+ 
+-      if (start < min)
+-              start = min;
+-
+       if (fwd) {
+-              mas->index = start;
+-              mas->last = start + size - 1;
+-              return;
++              mas->index = min;
++              mas->last = min + size - 1;
++      } else {
++              mas->last = max;
++              mas->index = max - size + 1;
+       }
+-
+-      mas->index = max;
++      return 0;
+ }
+ 
+ /*
+@@ -5324,10 +5327,8 @@ int mas_empty_area(struct ma_state *mas, unsigned long 
min,
+               return -EBUSY;
+ 
+       /* Empty set */
+-      if (mas_is_none(mas) || mas_is_ptr(mas)) {
+-              mas_sparse_area(mas, min, max, size, true);
+-              return 0;
+-      }
++      if (mas_is_none(mas) || mas_is_ptr(mas))
++              return mas_sparse_area(mas, min, max, size, true);
+ 
+       /* The start of the window can only be within these values */
+       mas->index = min;
+@@ -5367,20 +5368,18 @@ int mas_empty_area_rev(struct ma_state *mas, unsigned 
long min,
+       if (min >= max)
+               return -EINVAL;
+ 
+-      if (mas_is_start(mas)) {
++      if (mas_is_start(mas))
+               mas_start(mas);
+-              mas->offset = mas_data_end(mas);
+-      } else if (mas->offset >= 2) {
+-              mas->offset -= 2;
+-      } else if (!mas_rewind_node(mas)) {
++      else if ((mas->offset < 2) && (!mas_rewind_node(mas)))
+               return -EBUSY;
+-      }
+ 
+-      /* Empty set. */
+-      if (mas_is_none(mas) || mas_is_ptr(mas)) {
+-              mas_sparse_area(mas, min, max, size, false);
+-              return 0;
+-      }
++      if (unlikely(mas_is_none(mas) || mas_is_ptr(mas)))
++              return mas_sparse_area(mas, min, max, size, false);
++      else if (mas->offset >= 2)
++              mas->offset -= 2;
++      else
++              mas->offset = mas_data_end(mas);
++
+ 
+       /* The start of the window can only be within these values. */
+       mas->index = min;
+diff --git a/mm/cma.c b/mm/cma.c
+index 30b6ca30009bb..01e9d0b2d8757 100644
+--- a/mm/cma.c
++++ b/mm/cma.c
+@@ -186,10 +186,6 @@ int __init cma_init_reserved_mem(phys_addr_t base, 
phys_addr_t size,
+       if (!size || !memblock_is_region_reserved(base, size))
+               return -EINVAL;
+ 
+-      /* alignment should be aligned with order_per_bit */
+-      if (!IS_ALIGNED(CMA_MIN_ALIGNMENT_PAGES, 1 << order_per_bit))
+-              return -EINVAL;
+-
+       /* ensure minimal alignment required by mm core */
+       if (!IS_ALIGNED(base | size, CMA_MIN_ALIGNMENT_BYTES))
+               return -EINVAL;
+diff --git a/mm/huge_memory.c b/mm/huge_memory.c
+index 9736e762184bd..1b7f5950d6037 100644
+--- a/mm/huge_memory.c
++++ b/mm/huge_memory.c
+@@ -2108,32 +2108,11 @@ static void __split_huge_pmd_locked(struct 
vm_area_struct *vma, pmd_t *pmd,
+               return __split_huge_zero_page_pmd(vma, haddr, pmd);
+       }
+ 
+-      /*
+-       * Up to this point the pmd is present and huge and userland has the
+-       * whole access to the hugepage during the split (which happens in
+-       * place). If we overwrite the pmd with the not-huge version pointing
+-       * to the pte here (which of course we could if all CPUs were bug
+-       * free), userland could trigger a small page size TLB miss on the
+-       * small sized TLB while the hugepage TLB entry is still established in
+-       * the huge TLB. Some CPU doesn't like that.
+-       * See http://support.amd.com/TechDocs/41322_10h_Rev_Gd.pdf, Erratum
+-       * 383 on page 105. Intel should be safe but is also warns that it's
+-       * only safe if the permission and cache attributes of the two entries
+-       * loaded in the two TLB is identical (which should be the case here).
+-       * But it is generally safer to never allow small and huge TLB entries
+-       * for the same virtual address to be loaded simultaneously. So instead
+-       * of doing "pmd_populate(); flush_pmd_tlb_range();" we first mark the
+-       * current pmd notpresent (atomically because here the pmd_trans_huge
+-       * must remain set at all times on the pmd until the split is complete
+-       * for this pmd), then we flush the SMP TLB and finally we write the
+-       * non-huge version of the pmd entry with pmd_populate.
+-       */
+-      old_pmd = pmdp_invalidate(vma, haddr, pmd);
+-
+-      pmd_migration = is_pmd_migration_entry(old_pmd);
++      pmd_migration = is_pmd_migration_entry(*pmd);
+       if (unlikely(pmd_migration)) {
+               swp_entry_t entry;
+ 
++              old_pmd = *pmd;
+               entry = pmd_to_swp_entry(old_pmd);
+               page = pfn_swap_entry_to_page(entry);
+               write = is_writable_migration_entry(entry);
+@@ -2144,6 +2123,30 @@ static void __split_huge_pmd_locked(struct 
vm_area_struct *vma, pmd_t *pmd,
+               soft_dirty = pmd_swp_soft_dirty(old_pmd);
+               uffd_wp = pmd_swp_uffd_wp(old_pmd);
+       } else {
++              /*
++               * Up to this point the pmd is present and huge and userland has
++               * the whole access to the hugepage during the split (which
++               * happens in place). If we overwrite the pmd with the not-huge
++               * version pointing to the pte here (which of course we could if
++               * all CPUs were bug free), userland could trigger a small page
++               * size TLB miss on the small sized TLB while the hugepage TLB
++               * entry is still established in the huge TLB. Some CPU doesn't
++               * like that. See
++               * http://support.amd.com/TechDocs/41322_10h_Rev_Gd.pdf, Erratum
++               * 383 on page 105. Intel should be safe but is also warns that
++               * it's only safe if the permission and cache attributes of the
++               * two entries loaded in the two TLB is identical (which should
++               * be the case here). But it is generally safer to never allow
++               * small and huge TLB entries for the same virtual address to be
++               * loaded simultaneously. So instead of doing "pmd_populate();
++               * flush_pmd_tlb_range();" we first mark the current pmd
++               * notpresent (atomically because here the pmd_trans_huge must
++               * remain set at all times on the pmd until the split is
++               * complete for this pmd), then we flush the SMP TLB and finally
++               * we write the non-huge version of the pmd entry with
++               * pmd_populate.
++               */
++              old_pmd = pmdp_invalidate(vma, haddr, pmd);
+               page = pmd_page(old_pmd);
+               if (pmd_dirty(old_pmd)) {
+                       dirty = true;
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 4361dcf70139f..87a14638fad09 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -7669,9 +7669,9 @@ void __init hugetlb_cma_reserve(int order)
+                * huge page demotion.
+                */
+               res = cma_declare_contiguous_nid(0, size, 0,
+-                                              PAGE_SIZE << HUGETLB_PAGE_ORDER,
+-                                               0, false, name,
+-                                               &hugetlb_cma[nid], nid);
++                                      PAGE_SIZE << HUGETLB_PAGE_ORDER,
++                                      HUGETLB_PAGE_ORDER, false, name,
++                                      &hugetlb_cma[nid], nid);
+               if (res) {
+                       pr_warn("hugetlb_cma: reservation failed: err %d, node 
%d",
+                               res, nid);
+diff --git a/mm/kmsan/core.c b/mm/kmsan/core.c
+index 112dce135c7f6..dff759f32bbb3 100644
+--- a/mm/kmsan/core.c
++++ b/mm/kmsan/core.c
+@@ -258,8 +258,7 @@ void kmsan_internal_set_shadow_origin(void *addr, size_t 
size, int b,
+                                     u32 origin, bool checked)
+ {
+       u64 address = (u64)addr;
+-      void *shadow_start;
+-      u32 *origin_start;
++      u32 *shadow_start, *origin_start;
+       size_t pad = 0;
+ 
+       KMSAN_WARN_ON(!kmsan_metadata_is_contiguous(addr, size));
+@@ -287,8 +286,16 @@ void kmsan_internal_set_shadow_origin(void *addr, size_t 
size, int b,
+       origin_start =
+               (u32 *)kmsan_get_metadata((void *)address, KMSAN_META_ORIGIN);
+ 
+-      for (int i = 0; i < size / KMSAN_ORIGIN_SIZE; i++)
+-              origin_start[i] = origin;
++      /*
++       * If the new origin is non-zero, assume that the shadow byte is also 
non-zero,
++       * and unconditionally overwrite the old origin slot.
++       * If the new origin is zero, overwrite the old origin slot iff the
++       * corresponding shadow slot is zero.
++       */
++      for (int i = 0; i < size / KMSAN_ORIGIN_SIZE; i++) {
++              if (origin || !shadow_start[i])
++                      origin_start[i] = origin;
++      }
+ }
+ 
+ struct page *kmsan_vmalloc_to_page_or_null(void *vaddr)
+diff --git a/mm/pgtable-generic.c b/mm/pgtable-generic.c
+index 90ab721a12a82..6a582cc07023f 100644
+--- a/mm/pgtable-generic.c
++++ b/mm/pgtable-generic.c
+@@ -195,6 +195,7 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct 
*mm, pmd_t *pmdp)
+ pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
+                    pmd_t *pmdp)
+ {
++      VM_WARN_ON_ONCE(!pmd_present(*pmdp));
+       pmd_t old = pmdp_establish(vma, address, pmdp, pmd_mkinvalid(*pmdp));
+       flush_pmd_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
+       return old;
+@@ -205,6 +206,7 @@ pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned 
long address,
+ pmd_t pmdp_invalidate_ad(struct vm_area_struct *vma, unsigned long address,
+                        pmd_t *pmdp)
+ {
++      VM_WARN_ON_ONCE(!pmd_present(*pmdp));
+       return pmdp_invalidate(vma, address, pmdp);
+ }
+ #endif
+diff --git a/net/9p/client.c b/net/9p/client.c
+index 1d9a8a1f3f107..0fc2d706d9c23 100644
+--- a/net/9p/client.c
++++ b/net/9p/client.c
+@@ -231,6 +231,8 @@ static int p9_fcall_init(struct p9_client *c, struct 
p9_fcall *fc,
+       if (!fc->sdata)
+               return -ENOMEM;
+       fc->capacity = alloc_msize;
++      fc->id = 0;
++      fc->tag = P9_NOTAG;
+       return 0;
+ }
+ 
+diff --git a/net/ipv4/route.c b/net/ipv4/route.c
+index 6c0f1e347b855..fcbacd39febe0 100644
+--- a/net/ipv4/route.c
++++ b/net/ipv4/route.c
+@@ -132,7 +132,8 @@ struct dst_entry   *ipv4_dst_check(struct dst_entry *dst, 
u32 cookie);
+ static unsigned int    ipv4_default_advmss(const struct dst_entry *dst);
+ INDIRECT_CALLABLE_SCOPE
+ unsigned int          ipv4_mtu(const struct dst_entry *dst);
+-static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst);
++static void           ipv4_negative_advice(struct sock *sk,
++                                           struct dst_entry *dst);
+ static void            ipv4_link_failure(struct sk_buff *skb);
+ static void            ip_rt_update_pmtu(struct dst_entry *dst, struct sock 
*sk,
+                                          struct sk_buff *skb, u32 mtu,
+@@ -837,22 +838,15 @@ static void ip_do_redirect(struct dst_entry *dst, struct 
sock *sk, struct sk_buf
+       __ip_do_redirect(rt, skb, &fl4, true);
+ }
+ 
+-static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst)
++static void ipv4_negative_advice(struct sock *sk,
++                               struct dst_entry *dst)
+ {
+       struct rtable *rt = (struct rtable *)dst;
+-      struct dst_entry *ret = dst;
+ 
+-      if (rt) {
+-              if (dst->obsolete > 0) {
+-                      ip_rt_put(rt);
+-                      ret = NULL;
+-              } else if ((rt->rt_flags & RTCF_REDIRECTED) ||
+-                         rt->dst.expires) {
+-                      ip_rt_put(rt);
+-                      ret = NULL;
+-              }
+-      }
+-      return ret;
++      if ((dst->obsolete > 0) ||
++          (rt->rt_flags & RTCF_REDIRECTED) ||
++          rt->dst.expires)
++              sk_dst_reset(sk);
+ }
+ 
+ /*
+diff --git a/net/ipv6/route.c b/net/ipv6/route.c
+index 887599d351b8d..258e87055836f 100644
+--- a/net/ipv6/route.c
++++ b/net/ipv6/route.c
+@@ -87,7 +87,8 @@ struct dst_entry     *ip6_dst_check(struct dst_entry *dst, 
u32 cookie);
+ static unsigned int    ip6_default_advmss(const struct dst_entry *dst);
+ INDIRECT_CALLABLE_SCOPE
+ unsigned int          ip6_mtu(const struct dst_entry *dst);
+-static struct dst_entry *ip6_negative_advice(struct dst_entry *);
++static void           ip6_negative_advice(struct sock *sk,
++                                          struct dst_entry *dst);
+ static void           ip6_dst_destroy(struct dst_entry *);
+ static void           ip6_dst_ifdown(struct dst_entry *,
+                                      struct net_device *dev, int how);
+@@ -2762,24 +2763,24 @@ INDIRECT_CALLABLE_SCOPE struct dst_entry 
*ip6_dst_check(struct dst_entry *dst,
+ }
+ EXPORT_INDIRECT_CALLABLE(ip6_dst_check);
+ 
+-static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
++static void ip6_negative_advice(struct sock *sk,
++                              struct dst_entry *dst)
+ {
+       struct rt6_info *rt = (struct rt6_info *) dst;
+ 
+-      if (rt) {
+-              if (rt->rt6i_flags & RTF_CACHE) {
+-                      rcu_read_lock();
+-                      if (rt6_check_expired(rt)) {
+-                              rt6_remove_exception_rt(rt);
+-                              dst = NULL;
+-                      }
+-                      rcu_read_unlock();
+-              } else {
+-                      dst_release(dst);
+-                      dst = NULL;
++      if (rt->rt6i_flags & RTF_CACHE) {
++              rcu_read_lock();
++              if (rt6_check_expired(rt)) {
++                      /* counteract the dst_release() in sk_dst_reset() */
++                      dst_hold(dst);
++                      sk_dst_reset(sk);
++
++                      rt6_remove_exception_rt(rt);
+               }
++              rcu_read_unlock();
++              return;
+       }
+-      return dst;
++      sk_dst_reset(sk);
+ }
+ 
+ static void ip6_link_failure(struct sk_buff *skb)
+@@ -4435,7 +4436,7 @@ static void rtmsg_to_fib6_config(struct net *net,
+               .fc_table = l3mdev_fib_table_by_index(net, 
rtmsg->rtmsg_ifindex) ?
+                        : RT6_TABLE_MAIN,
+               .fc_ifindex = rtmsg->rtmsg_ifindex,
+-              .fc_metric = rtmsg->rtmsg_metric ? : IP6_RT_PRIO_USER,
++              .fc_metric = rtmsg->rtmsg_metric,
+               .fc_expires = rtmsg->rtmsg_info,
+               .fc_dst_len = rtmsg->rtmsg_dst_len,
+               .fc_src_len = rtmsg->rtmsg_src_len,
+@@ -4465,6 +4466,9 @@ int ipv6_route_ioctl(struct net *net, unsigned int cmd, 
struct in6_rtmsg *rtmsg)
+       rtnl_lock();
+       switch (cmd) {
+       case SIOCADDRT:
++              /* Only do the default setting of fc_metric in route adding */
++              if (cfg.fc_metric == 0)
++                      cfg.fc_metric = IP6_RT_PRIO_USER;
+               err = ip6_route_add(&cfg, GFP_KERNEL, NULL);
+               break;
+       case SIOCDELRT:
+diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
+index 2bc37773e7803..eaed858c0ff94 100644
+--- a/net/mptcp/protocol.h
++++ b/net/mptcp/protocol.h
+@@ -288,6 +288,9 @@ struct mptcp_sock {
+                       fastopening:1,
+                       in_accept_queue:1,
+                       free_first:1;
++      int             keepalive_cnt;
++      int             keepalive_idle;
++      int             keepalive_intvl;
+       struct work_struct work;
+       struct sk_buff  *ooo_last_skb;
+       struct rb_root  out_of_order_queue;
+diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c
+index e59e46e07b5c9..ff82fc062ae76 100644
+--- a/net/mptcp/sockopt.c
++++ b/net/mptcp/sockopt.c
+@@ -616,20 +616,57 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct 
mptcp_sock *msk, sockptr_t
+       return ret;
+ }
+ 
+-static int mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, sockptr_t 
optval,
+-                                       unsigned int optlen)
++static int __tcp_sock_set_keepintvl(struct sock *sk, int val)
+ {
+-      struct mptcp_subflow_context *subflow;
+-      struct sock *sk = (struct sock *)msk;
+-      int val;
++      if (val < 1 || val > MAX_TCP_KEEPINTVL)
++              return -EINVAL;
+ 
+-      if (optlen < sizeof(int))
++      WRITE_ONCE(tcp_sk(sk)->keepalive_intvl, val * HZ);
++
++      return 0;
++}
++
++static int __tcp_sock_set_keepcnt(struct sock *sk, int val)
++{
++      if (val < 1 || val > MAX_TCP_KEEPCNT)
+               return -EINVAL;
+ 
+-      if (copy_from_sockptr(&val, optval, sizeof(val)))
+-              return -EFAULT;
++      /* Paired with READ_ONCE() in keepalive_probes() */
++      WRITE_ONCE(tcp_sk(sk)->keepalive_probes, val);
++
++      return 0;
++}
++
++static int __mptcp_setsockopt_set_val(struct mptcp_sock *msk, int max,
++                                    int (*set_val)(struct sock *, int),
++                                    int *msk_val, int val)
++{
++      struct mptcp_subflow_context *subflow;
++      int err = 0;
++
++      mptcp_for_each_subflow(msk, subflow) {
++              struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
++              int ret;
++
++              lock_sock(ssk);
++              ret = set_val(ssk, val);
++              err = err ? : ret;
++              release_sock(ssk);
++      }
++
++      if (!err) {
++              *msk_val = val;
++              sockopt_seq_inc(msk);
++      }
++
++      return err;
++}
++
++static int __mptcp_setsockopt_sol_tcp_cork(struct mptcp_sock *msk, int val)
++{
++      struct mptcp_subflow_context *subflow;
++      struct sock *sk = (struct sock *)msk;
+ 
+-      lock_sock(sk);
+       sockopt_seq_inc(msk);
+       msk->cork = !!val;
+       mptcp_for_each_subflow(msk, subflow) {
+@@ -641,25 +678,15 @@ static int mptcp_setsockopt_sol_tcp_cork(struct 
mptcp_sock *msk, sockptr_t optva
+       }
+       if (!val)
+               mptcp_check_and_set_pending(sk);
+-      release_sock(sk);
+ 
+       return 0;
+ }
+ 
+-static int mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, sockptr_t 
optval,
+-                                          unsigned int optlen)
++static int __mptcp_setsockopt_sol_tcp_nodelay(struct mptcp_sock *msk, int val)
+ {
+       struct mptcp_subflow_context *subflow;
+       struct sock *sk = (struct sock *)msk;
+-      int val;
+-
+-      if (optlen < sizeof(int))
+-              return -EINVAL;
+-
+-      if (copy_from_sockptr(&val, optval, sizeof(val)))
+-              return -EFAULT;
+ 
+-      lock_sock(sk);
+       sockopt_seq_inc(msk);
+       msk->nodelay = !!val;
+       mptcp_for_each_subflow(msk, subflow) {
+@@ -671,8 +698,6 @@ static int mptcp_setsockopt_sol_tcp_nodelay(struct 
mptcp_sock *msk, sockptr_t op
+       }
+       if (val)
+               mptcp_check_and_set_pending(sk);
+-      release_sock(sk);
+-
+       return 0;
+ }
+ 
+@@ -797,25 +822,10 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock 
*msk, int optname,
+       int ret, val;
+ 
+       switch (optname) {
+-      case TCP_INQ:
+-              ret = mptcp_get_int_option(msk, optval, optlen, &val);
+-              if (ret)
+-                      return ret;
+-              if (val < 0 || val > 1)
+-                      return -EINVAL;
+-
+-              lock_sock(sk);
+-              msk->recvmsg_inq = !!val;
+-              release_sock(sk);
+-              return 0;
+       case TCP_ULP:
+               return -EOPNOTSUPP;
+       case TCP_CONGESTION:
+               return mptcp_setsockopt_sol_tcp_congestion(msk, optval, optlen);
+-      case TCP_CORK:
+-              return mptcp_setsockopt_sol_tcp_cork(msk, optval, optlen);
+-      case TCP_NODELAY:
+-              return mptcp_setsockopt_sol_tcp_nodelay(msk, optval, optlen);
+       case TCP_DEFER_ACCEPT:
+               return mptcp_setsockopt_sol_tcp_defer(msk, optval, optlen);
+       case TCP_FASTOPEN_CONNECT:
+@@ -823,7 +833,46 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock 
*msk, int optname,
+                                                     optval, optlen);
+       }
+ 
+-      return -EOPNOTSUPP;
++      ret = mptcp_get_int_option(msk, optval, optlen, &val);
++      if (ret)
++              return ret;
++
++      lock_sock(sk);
++      switch (optname) {
++      case TCP_INQ:
++              if (val < 0 || val > 1)
++                      ret = -EINVAL;
++              else
++                      msk->recvmsg_inq = !!val;
++              break;
++      case TCP_CORK:
++              ret = __mptcp_setsockopt_sol_tcp_cork(msk, val);
++              break;
++      case TCP_NODELAY:
++              ret = __mptcp_setsockopt_sol_tcp_nodelay(msk, val);
++              break;
++      case TCP_KEEPIDLE:
++              ret = __mptcp_setsockopt_set_val(msk, MAX_TCP_KEEPIDLE,
++                                               &tcp_sock_set_keepidle_locked,
++                                               &msk->keepalive_idle, val);
++              break;
++      case TCP_KEEPINTVL:
++              ret = __mptcp_setsockopt_set_val(msk, MAX_TCP_KEEPINTVL,
++                                               &__tcp_sock_set_keepintvl,
++                                               &msk->keepalive_intvl, val);
++              break;
++      case TCP_KEEPCNT:
++              ret = __mptcp_setsockopt_set_val(msk, MAX_TCP_KEEPCNT,
++                                               &__tcp_sock_set_keepcnt,
++                                               &msk->keepalive_cnt,
++                                               val);
++              break;
++      default:
++              ret = -ENOPROTOOPT;
++      }
++
++      release_sock(sk);
++      return ret;
+ }
+ 
+ int mptcp_setsockopt(struct sock *sk, int level, int optname,
+@@ -1176,6 +1225,8 @@ static int mptcp_put_int_option(struct mptcp_sock *msk, 
char __user *optval,
+ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
+                                   char __user *optval, int __user *optlen)
+ {
++      struct sock *sk = (void *)msk;
++
+       switch (optname) {
+       case TCP_ULP:
+       case TCP_CONGESTION:
+@@ -1191,6 +1242,18 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock 
*msk, int optname,
+               return mptcp_put_int_option(msk, optval, optlen, msk->cork);
+       case TCP_NODELAY:
+               return mptcp_put_int_option(msk, optval, optlen, msk->nodelay);
++      case TCP_KEEPIDLE:
++              return mptcp_put_int_option(msk, optval, optlen,
++                                          msk->keepalive_idle ? :
++                                          
READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_keepalive_time) / HZ);
++      case TCP_KEEPINTVL:
++              return mptcp_put_int_option(msk, optval, optlen,
++                                          msk->keepalive_intvl ? :
++                                          
READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_keepalive_intvl) / HZ);
++      case TCP_KEEPCNT:
++              return mptcp_put_int_option(msk, optval, optlen,
++                                          msk->keepalive_cnt ? :
++                                          
READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_keepalive_probes));
+       }
+       return -EOPNOTSUPP;
+ }
+@@ -1295,6 +1358,9 @@ static void sync_socket_options(struct mptcp_sock *msk, 
struct sock *ssk)
+               tcp_set_congestion_control(ssk, msk->ca_name, false, true);
+       __tcp_sock_set_cork(ssk, !!msk->cork);
+       __tcp_sock_set_nodelay(ssk, !!msk->nodelay);
++      tcp_sock_set_keepidle_locked(ssk, msk->keepalive_idle);
++      __tcp_sock_set_keepintvl(ssk, msk->keepalive_intvl);
++      __tcp_sock_set_keepcnt(ssk, msk->keepalive_cnt);
+ 
+       inet_sk(ssk)->transparent = inet_sk(sk)->transparent;
+       inet_sk(ssk)->freebind = inet_sk(sk)->freebind;
+diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
+index e47c670c7e2cd..5fddde2d5bc48 100644
+--- a/net/xfrm/xfrm_policy.c
++++ b/net/xfrm/xfrm_policy.c
+@@ -3772,15 +3772,10 @@ static void xfrm_link_failure(struct sk_buff *skb)
+       /* Impossible. Such dst must be popped before reaches point of failure. 
*/
+ }
+ 
+-static struct dst_entry *xfrm_negative_advice(struct dst_entry *dst)
++static void xfrm_negative_advice(struct sock *sk, struct dst_entry *dst)
+ {
+-      if (dst) {
+-              if (dst->obsolete) {
+-                      dst_release(dst);
+-                      dst = NULL;
+-              }
+-      }
+-      return dst;
++      if (dst->obsolete)
++              sk_dst_reset(sk);
+ }
+ 
+ static void xfrm_init_pmtu(struct xfrm_dst **bundle, int nr)
+diff --git a/scripts/gdb/linux/constants.py.in 
b/scripts/gdb/linux/constants.py.in
+index 08f0587d15ea1..0ff707bc18960 100644
+--- a/scripts/gdb/linux/constants.py.in
++++ b/scripts/gdb/linux/constants.py.in
+@@ -46,12 +46,12 @@ if IS_BUILTIN(CONFIG_COMMON_CLK):
+     LX_GDBPARSED(CLK_GET_RATE_NOCACHE)
+ 
+ /* linux/fs.h */
+-LX_VALUE(SB_RDONLY)
+-LX_VALUE(SB_SYNCHRONOUS)
+-LX_VALUE(SB_MANDLOCK)
+-LX_VALUE(SB_DIRSYNC)
+-LX_VALUE(SB_NOATIME)
+-LX_VALUE(SB_NODIRATIME)
++LX_GDBPARSED(SB_RDONLY)
++LX_GDBPARSED(SB_SYNCHRONOUS)
++LX_GDBPARSED(SB_MANDLOCK)
++LX_GDBPARSED(SB_DIRSYNC)
++LX_GDBPARSED(SB_NOATIME)
++LX_GDBPARSED(SB_NODIRATIME)
+ 
+ /* linux/htimer.h */
+ LX_GDBPARSED(hrtimer_resolution)

Reply via email to