commit:     52ea92c5b1054000b9633c25305d864bd15c610c
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed Mar  2 13:06:23 2022 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed Mar  2 13:06:23 2022 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=52ea92c5

Linux patch 5.10.103

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

 0000_README               |    4 +
 1102_linux-5.10.103.patch | 2970 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2974 insertions(+)

diff --git a/0000_README b/0000_README
index 3438f96a..7f478841 100644
--- a/0000_README
+++ b/0000_README
@@ -451,6 +451,10 @@ Patch:  1101_linux-5.10.102.patch
 From:   http://www.kernel.org
 Desc:   Linux 5.10.102
 
+Patch:  1102_linux-5.10.103.patch
+From:   http://www.kernel.org
+Desc:   Linux 5.10.103
+
 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/1102_linux-5.10.103.patch b/1102_linux-5.10.103.patch
new file mode 100644
index 00000000..713f7c90
--- /dev/null
+++ b/1102_linux-5.10.103.patch
@@ -0,0 +1,2970 @@
+diff --git a/Makefile b/Makefile
+index f71684d435e5a..829a66a36807e 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 10
+-SUBLEVEL = 102
++SUBLEVEL = 103
+ EXTRAVERSION =
+ NAME = Dare mighty things
+ 
+diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c
+index 237d20dd5622d..286cec4d86d7b 100644
+--- a/arch/parisc/kernel/unaligned.c
++++ b/arch/parisc/kernel/unaligned.c
+@@ -340,7 +340,7 @@ static int emulate_stw(struct pt_regs *regs, int frreg, 
int flop)
+       : "r" (val), "r" (regs->ior), "r" (regs->isr)
+       : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER );
+ 
+-      return 0;
++      return ret;
+ }
+ static int emulate_std(struct pt_regs *regs, int frreg, int flop)
+ {
+@@ -397,7 +397,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, 
int flop)
+       __asm__ __volatile__ (
+ "     mtsp    %4, %%sr1\n"
+ "     zdep    %2, 29, 2, %%r19\n"
+-"     dep     %%r0, 31, 2, %2\n"
++"     dep     %%r0, 31, 2, %3\n"
+ "     mtsar   %%r19\n"
+ "     zvdepi  -2, 32, %%r19\n"
+ "1:   ldw     0(%%sr1,%3),%%r20\n"
+@@ -409,7 +409,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, 
int flop)
+ "     andcm   %%r21, %%r19, %%r21\n"
+ "     or      %1, %%r20, %1\n"
+ "     or      %2, %%r21, %2\n"
+-"3:   stw     %1,0(%%sr1,%1)\n"
++"3:   stw     %1,0(%%sr1,%3)\n"
+ "4:   stw     %%r1,4(%%sr1,%3)\n"
+ "5:   stw     %2,8(%%sr1,%3)\n"
+ "     copy    %%r0, %0\n"
+@@ -596,7 +596,6 @@ void handle_unaligned(struct pt_regs *regs)
+               ret = ERR_NOTHANDLED;   /* "undefined", but lets kill them. */
+               break;
+       }
+-#ifdef CONFIG_PA20
+       switch (regs->iir & OPCODE2_MASK)
+       {
+       case OPCODE_FLDD_L:
+@@ -607,22 +606,23 @@ void handle_unaligned(struct pt_regs *regs)
+               flop=1;
+               ret = emulate_std(regs, R2(regs->iir),1);
+               break;
++#ifdef CONFIG_PA20
+       case OPCODE_LDD_L:
+               ret = emulate_ldd(regs, R2(regs->iir),0);
+               break;
+       case OPCODE_STD_L:
+               ret = emulate_std(regs, R2(regs->iir),0);
+               break;
+-      }
+ #endif
++      }
+       switch (regs->iir & OPCODE3_MASK)
+       {
+       case OPCODE_FLDW_L:
+               flop=1;
+-              ret = emulate_ldw(regs, R2(regs->iir),0);
++              ret = emulate_ldw(regs, R2(regs->iir), 1);
+               break;
+       case OPCODE_LDW_M:
+-              ret = emulate_ldw(regs, R2(regs->iir),1);
++              ret = emulate_ldw(regs, R2(regs->iir), 0);
+               break;
+ 
+       case OPCODE_FSTW_L:
+diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
+index 62de075fc60c0..bc49d5f2302b6 100644
+--- a/arch/riscv/kernel/Makefile
++++ b/arch/riscv/kernel/Makefile
+@@ -44,6 +44,8 @@ obj-$(CONFIG_MODULE_SECTIONS)        += module-sections.o
+ obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o
+ obj-$(CONFIG_DYNAMIC_FTRACE)  += mcount-dyn.o
+ 
++obj-$(CONFIG_TRACE_IRQFLAGS)  += trace_irq.o
++
+ obj-$(CONFIG_RISCV_BASE_PMU)  += perf_event.o
+ obj-$(CONFIG_PERF_EVENTS)     += perf_callchain.o
+ obj-$(CONFIG_HAVE_PERF_REGS)  += perf_regs.o
+diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S
+index 76274a4a1d8e6..5214c578a6023 100644
+--- a/arch/riscv/kernel/entry.S
++++ b/arch/riscv/kernel/entry.S
+@@ -98,7 +98,7 @@ _save_context:
+ .option pop
+ 
+ #ifdef CONFIG_TRACE_IRQFLAGS
+-      call trace_hardirqs_off
++      call __trace_hardirqs_off
+ #endif
+ 
+ #ifdef CONFIG_CONTEXT_TRACKING
+@@ -131,7 +131,7 @@ skip_context_tracking:
+       andi t0, s1, SR_PIE
+       beqz t0, 1f
+ #ifdef CONFIG_TRACE_IRQFLAGS
+-      call trace_hardirqs_on
++      call __trace_hardirqs_on
+ #endif
+       csrs CSR_STATUS, SR_IE
+ 
+@@ -222,7 +222,7 @@ ret_from_exception:
+       REG_L s0, PT_STATUS(sp)
+       csrc CSR_STATUS, SR_IE
+ #ifdef CONFIG_TRACE_IRQFLAGS
+-      call trace_hardirqs_off
++      call __trace_hardirqs_off
+ #endif
+ #ifdef CONFIG_RISCV_M_MODE
+       /* the MPP value is too large to be used as an immediate arg for addi */
+@@ -258,10 +258,10 @@ restore_all:
+       REG_L s1, PT_STATUS(sp)
+       andi t0, s1, SR_PIE
+       beqz t0, 1f
+-      call trace_hardirqs_on
++      call __trace_hardirqs_on
+       j 2f
+ 1:
+-      call trace_hardirqs_off
++      call __trace_hardirqs_off
+ 2:
+ #endif
+       REG_L a0, PT_STATUS(sp)
+diff --git a/arch/riscv/kernel/trace_irq.c b/arch/riscv/kernel/trace_irq.c
+new file mode 100644
+index 0000000000000..095ac976d7da1
+--- /dev/null
++++ b/arch/riscv/kernel/trace_irq.c
+@@ -0,0 +1,27 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Copyright (C) 2022 Changbin Du <[email protected]>
++ */
++
++#include <linux/irqflags.h>
++#include <linux/kprobes.h>
++#include "trace_irq.h"
++
++/*
++ * trace_hardirqs_on/off require the caller to setup frame pointer properly.
++ * Otherwise, CALLER_ADDR1 might trigger an pagging exception in kernel.
++ * Here we add one extra level so they can be safely called by low
++ * level entry code which $fp is used for other purpose.
++ */
++
++void __trace_hardirqs_on(void)
++{
++      trace_hardirqs_on();
++}
++NOKPROBE_SYMBOL(__trace_hardirqs_on);
++
++void __trace_hardirqs_off(void)
++{
++      trace_hardirqs_off();
++}
++NOKPROBE_SYMBOL(__trace_hardirqs_off);
+diff --git a/arch/riscv/kernel/trace_irq.h b/arch/riscv/kernel/trace_irq.h
+new file mode 100644
+index 0000000000000..99fe67377e5ed
+--- /dev/null
++++ b/arch/riscv/kernel/trace_irq.h
+@@ -0,0 +1,11 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++/*
++ * Copyright (C) 2022 Changbin Du <[email protected]>
++ */
++#ifndef __TRACE_IRQ_H
++#define __TRACE_IRQ_H
++
++void __trace_hardirqs_on(void);
++void __trace_hardirqs_off(void);
++
++#endif /* __TRACE_IRQ_H */
+diff --git a/arch/x86/include/asm/fpu/internal.h 
b/arch/x86/include/asm/fpu/internal.h
+index 4e5af2b00d89b..70b9bc5403c5e 100644
+--- a/arch/x86/include/asm/fpu/internal.h
++++ b/arch/x86/include/asm/fpu/internal.h
+@@ -531,9 +531,11 @@ static inline void __fpregs_load_activate(void)
+  * The FPU context is only stored/restored for a user task and
+  * PF_KTHREAD is used to distinguish between kernel and user threads.
+  */
+-static inline void switch_fpu_prepare(struct fpu *old_fpu, int cpu)
++static inline void switch_fpu_prepare(struct task_struct *prev, int cpu)
+ {
+-      if (static_cpu_has(X86_FEATURE_FPU) && !(current->flags & PF_KTHREAD)) {
++      struct fpu *old_fpu = &prev->thread.fpu;
++
++      if (static_cpu_has(X86_FEATURE_FPU) && !(prev->flags & PF_KTHREAD)) {
+               if (!copy_fpregs_to_fpstate(old_fpu))
+                       old_fpu->last_cpu = -1;
+               else
+@@ -552,10 +554,11 @@ static inline void switch_fpu_prepare(struct fpu 
*old_fpu, int cpu)
+  * Load PKRU from the FPU context if available. Delay loading of the
+  * complete FPU state until the return to userland.
+  */
+-static inline void switch_fpu_finish(struct fpu *new_fpu)
++static inline void switch_fpu_finish(struct task_struct *next)
+ {
+       u32 pkru_val = init_pkru_value;
+       struct pkru_state *pk;
++      struct fpu *next_fpu = &next->thread.fpu;
+ 
+       if (!static_cpu_has(X86_FEATURE_FPU))
+               return;
+@@ -569,7 +572,7 @@ static inline void switch_fpu_finish(struct fpu *new_fpu)
+        * PKRU state is switched eagerly because it needs to be valid before we
+        * return to userland e.g. for a copy_to_user() operation.
+        */
+-      if (!(current->flags & PF_KTHREAD)) {
++      if (!(next->flags & PF_KTHREAD)) {
+               /*
+                * If the PKRU bit in xsave.header.xfeatures is not set,
+                * then the PKRU component was in init state, which means
+@@ -578,7 +581,7 @@ static inline void switch_fpu_finish(struct fpu *new_fpu)
+                * in memory is not valid. This means pkru_val has to be
+                * set to 0 and not to init_pkru_value.
+                */
+-              pk = get_xsave_addr(&new_fpu->state.xsave, XFEATURE_PKRU);
++              pk = get_xsave_addr(&next_fpu->state.xsave, XFEATURE_PKRU);
+               pkru_val = pk ? pk->pkru : 0;
+       }
+       __write_pkru(pkru_val);
+diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
+index 4f2f54e1281c3..98bf8fd189025 100644
+--- a/arch/x86/kernel/process_32.c
++++ b/arch/x86/kernel/process_32.c
+@@ -159,14 +159,12 @@ __switch_to(struct task_struct *prev_p, struct 
task_struct *next_p)
+ {
+       struct thread_struct *prev = &prev_p->thread,
+                            *next = &next_p->thread;
+-      struct fpu *prev_fpu = &prev->fpu;
+-      struct fpu *next_fpu = &next->fpu;
+       int cpu = smp_processor_id();
+ 
+       /* never put a printk in __switch_to... printk() calls wake_up*() 
indirectly */
+ 
+       if (!test_thread_flag(TIF_NEED_FPU_LOAD))
+-              switch_fpu_prepare(prev_fpu, cpu);
++              switch_fpu_prepare(prev_p, cpu);
+ 
+       /*
+        * Save away %gs. No need to save %fs, as it was saved on the
+@@ -213,7 +211,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct 
*next_p)
+ 
+       this_cpu_write(current_task, next_p);
+ 
+-      switch_fpu_finish(next_fpu);
++      switch_fpu_finish(next_p);
+ 
+       /* Load the Intel cache allocation PQR MSR. */
+       resctrl_sched_in();
+diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
+index df342bedea88a..ad3f82a18de9d 100644
+--- a/arch/x86/kernel/process_64.c
++++ b/arch/x86/kernel/process_64.c
+@@ -535,15 +535,13 @@ __switch_to(struct task_struct *prev_p, struct 
task_struct *next_p)
+ {
+       struct thread_struct *prev = &prev_p->thread;
+       struct thread_struct *next = &next_p->thread;
+-      struct fpu *prev_fpu = &prev->fpu;
+-      struct fpu *next_fpu = &next->fpu;
+       int cpu = smp_processor_id();
+ 
+       WARN_ON_ONCE(IS_ENABLED(CONFIG_DEBUG_ENTRY) &&
+                    this_cpu_read(irq_count) != -1);
+ 
+       if (!test_thread_flag(TIF_NEED_FPU_LOAD))
+-              switch_fpu_prepare(prev_fpu, cpu);
++              switch_fpu_prepare(prev_p, cpu);
+ 
+       /* We must save %fs and %gs before load_TLS() because
+        * %fs and %gs may be cleared by load_TLS().
+@@ -595,7 +593,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct 
*next_p)
+       this_cpu_write(current_task, next_p);
+       this_cpu_write(cpu_current_top_of_stack, task_top_of_stack(next_p));
+ 
+-      switch_fpu_finish(next_fpu);
++      switch_fpu_finish(next_p);
+ 
+       /* Reload sp0. */
+       update_task_stack(next_p);
+diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
+index c2516ddc3cbec..20d29ae8ed702 100644
+--- a/arch/x86/kvm/mmu/mmu.c
++++ b/arch/x86/kvm/mmu/mmu.c
+@@ -3631,12 +3631,23 @@ static void shadow_page_table_clear_flood(struct 
kvm_vcpu *vcpu, gva_t addr)
+       walk_shadow_page_lockless_end(vcpu);
+ }
+ 
++static u32 alloc_apf_token(struct kvm_vcpu *vcpu)
++{
++      /* make sure the token value is not 0 */
++      u32 id = vcpu->arch.apf.id;
++
++      if (id << 12 == 0)
++              vcpu->arch.apf.id = 1;
++
++      return (vcpu->arch.apf.id++ << 12) | vcpu->vcpu_id;
++}
++
+ static bool kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,
+                                   gfn_t gfn)
+ {
+       struct kvm_arch_async_pf arch;
+ 
+-      arch.token = (vcpu->arch.apf.id++ << 12) | vcpu->vcpu_id;
++      arch.token = alloc_apf_token(vcpu);
+       arch.gfn = gfn;
+       arch.direct_map = vcpu->arch.mmu->direct_map;
+       arch.cr3 = vcpu->arch.mmu->get_guest_pgd(vcpu);
+diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c
+index fad6c6a873130..499a947d56ddb 100644
+--- a/drivers/ata/pata_hpt37x.c
++++ b/drivers/ata/pata_hpt37x.c
+@@ -917,6 +917,20 @@ static int hpt37x_init_one(struct pci_dev *dev, const 
struct pci_device_id *id)
+       irqmask &= ~0x10;
+       pci_write_config_byte(dev, 0x5a, irqmask);
+ 
++      /*
++       * HPT371 chips physically have only one channel, the secondary one,
++       * but the primary channel registers do exist!  Go figure...
++       * So,  we manually disable the non-existing channel here
++       * (if the BIOS hasn't done this already).
++       */
++      if (dev->device == PCI_DEVICE_ID_TTI_HPT371) {
++              u8 mcr1;
++
++              pci_read_config_byte(dev, 0x50, &mcr1);
++              mcr1 &= ~0x04;
++              pci_write_config_byte(dev, 0x50, mcr1);
++      }
++
+       /*
+        * default to pci clock. make sure MA15/16 are set to output
+        * to prevent drives having problems with 40-pin cables. Needed
+diff --git a/drivers/base/dd.c b/drivers/base/dd.c
+index 81ad4f867f02d..64ff137408b8c 100644
+--- a/drivers/base/dd.c
++++ b/drivers/base/dd.c
+@@ -592,6 +592,9 @@ re_probe:
+                       drv->remove(dev);
+ 
+               devres_release_all(dev);
++              arch_teardown_dma_ops(dev);
++              kfree(dev->dma_range_map);
++              dev->dma_range_map = NULL;
+               driver_sysfs_remove(dev);
+               dev->driver = NULL;
+               dev_set_drvdata(dev, NULL);
+@@ -1168,6 +1171,8 @@ static void __device_release_driver(struct device *dev, 
struct device *parent)
+ 
+               devres_release_all(dev);
+               arch_teardown_dma_ops(dev);
++              kfree(dev->dma_range_map);
++              dev->dma_range_map = NULL;
+               dev->driver = NULL;
+               dev_set_drvdata(dev, NULL);
+               if (dev->pm_domain && dev->pm_domain->dismiss)
+diff --git a/drivers/base/regmap/regmap-irq.c 
b/drivers/base/regmap/regmap-irq.c
+index ad5c2de395d1f..87c5c421e0f46 100644
+--- a/drivers/base/regmap/regmap-irq.c
++++ b/drivers/base/regmap/regmap-irq.c
+@@ -170,11 +170,9 @@ static void regmap_irq_sync_unlock(struct irq_data *data)
+                               ret = regmap_write(map, reg, d->mask_buf[i]);
+                       if (d->chip->clear_ack) {
+                               if (d->chip->ack_invert && !ret)
+-                                      ret = regmap_write(map, reg,
+-                                                         d->mask_buf[i]);
++                                      ret = regmap_write(map, reg, UINT_MAX);
+                               else if (!ret)
+-                                      ret = regmap_write(map, reg,
+-                                                         ~d->mask_buf[i]);
++                                      ret = regmap_write(map, reg, 0);
+                       }
+                       if (ret != 0)
+                               dev_err(d->map->dev, "Failed to ack 0x%x: %d\n",
+@@ -509,11 +507,9 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
+                                               data->status_buf[i]);
+                       if (chip->clear_ack) {
+                               if (chip->ack_invert && !ret)
+-                                      ret = regmap_write(map, reg,
+-                                                      data->status_buf[i]);
++                                      ret = regmap_write(map, reg, UINT_MAX);
+                               else if (!ret)
+-                                      ret = regmap_write(map, reg,
+-                                                      ~data->status_buf[i]);
++                                      ret = regmap_write(map, reg, 0);
+                       }
+                       if (ret != 0)
+                               dev_err(map->dev, "Failed to ack 0x%x: %d\n",
+@@ -745,13 +741,9 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle 
*fwnode,
+                                       d->status_buf[i] & d->mask_buf[i]);
+                       if (chip->clear_ack) {
+                               if (chip->ack_invert && !ret)
+-                                      ret = regmap_write(map, reg,
+-                                              (d->status_buf[i] &
+-                                               d->mask_buf[i]));
++                                      ret = regmap_write(map, reg, UINT_MAX);
+                               else if (!ret)
+-                                      ret = regmap_write(map, reg,
+-                                              ~(d->status_buf[i] &
+-                                                d->mask_buf[i]));
++                                      ret = regmap_write(map, reg, 0);
+                       }
+                       if (ret != 0) {
+                               dev_err(map->dev, "Failed to ack 0x%x: %d\n",
+diff --git a/drivers/clk/ingenic/jz4725b-cgu.c 
b/drivers/clk/ingenic/jz4725b-cgu.c
+index 8c38e72d14a79..786e361a4a6a4 100644
+--- a/drivers/clk/ingenic/jz4725b-cgu.c
++++ b/drivers/clk/ingenic/jz4725b-cgu.c
+@@ -139,11 +139,10 @@ static const struct ingenic_cgu_clk_info 
jz4725b_cgu_clocks[] = {
+       },
+ 
+       [JZ4725B_CLK_I2S] = {
+-              "i2s", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
++              "i2s", CGU_CLK_MUX | CGU_CLK_DIV,
+               .parents = { JZ4725B_CLK_EXT, JZ4725B_CLK_PLL_HALF, -1, -1 },
+               .mux = { CGU_REG_CPCCR, 31, 1 },
+               .div = { CGU_REG_I2SCDR, 0, 1, 9, -1, -1, -1 },
+-              .gate = { CGU_REG_CLKGR, 6 },
+       },
+ 
+       [JZ4725B_CLK_SPI] = {
+diff --git a/drivers/gpio/gpio-tegra186.c b/drivers/gpio/gpio-tegra186.c
+index 9500074b1f1b5..7fbe5f0681b95 100644
+--- a/drivers/gpio/gpio-tegra186.c
++++ b/drivers/gpio/gpio-tegra186.c
+@@ -337,9 +337,12 @@ static int tegra186_gpio_of_xlate(struct gpio_chip *chip,
+       return offset + pin;
+ }
+ 
++#define to_tegra_gpio(x) container_of((x), struct tegra_gpio, gpio)
++
+ static void tegra186_irq_ack(struct irq_data *data)
+ {
+-      struct tegra_gpio *gpio = irq_data_get_irq_chip_data(data);
++      struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
++      struct tegra_gpio *gpio = to_tegra_gpio(gc);
+       void __iomem *base;
+ 
+       base = tegra186_gpio_get_base(gpio, data->hwirq);
+@@ -351,7 +354,8 @@ static void tegra186_irq_ack(struct irq_data *data)
+ 
+ static void tegra186_irq_mask(struct irq_data *data)
+ {
+-      struct tegra_gpio *gpio = irq_data_get_irq_chip_data(data);
++      struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
++      struct tegra_gpio *gpio = to_tegra_gpio(gc);
+       void __iomem *base;
+       u32 value;
+ 
+@@ -366,7 +370,8 @@ static void tegra186_irq_mask(struct irq_data *data)
+ 
+ static void tegra186_irq_unmask(struct irq_data *data)
+ {
+-      struct tegra_gpio *gpio = irq_data_get_irq_chip_data(data);
++      struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
++      struct tegra_gpio *gpio = to_tegra_gpio(gc);
+       void __iomem *base;
+       u32 value;
+ 
+@@ -381,7 +386,8 @@ static void tegra186_irq_unmask(struct irq_data *data)
+ 
+ static int tegra186_irq_set_type(struct irq_data *data, unsigned int type)
+ {
+-      struct tegra_gpio *gpio = irq_data_get_irq_chip_data(data);
++      struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
++      struct tegra_gpio *gpio = to_tegra_gpio(gc);
+       void __iomem *base;
+       u32 value;
+ 
+diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c 
b/drivers/gpu/drm/amd/amdgpu/soc15.c
+index 37226cbbbd11a..7212b9900e0ab 100644
+--- a/drivers/gpu/drm/amd/amdgpu/soc15.c
++++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
+@@ -1194,8 +1194,11 @@ static int soc15_common_early_init(void *handle)
+                               AMD_CG_SUPPORT_SDMA_MGCG |
+                               AMD_CG_SUPPORT_SDMA_LS;
+ 
++                      /*
++                       * MMHUB PG needs to be disabled for Picasso for
++                       * stability reasons.
++                       */
+                       adev->pg_flags = AMD_PG_SUPPORT_SDMA |
+-                              AMD_PG_SUPPORT_MMHUB |
+                               AMD_PG_SUPPORT_VCN;
+               } else {
+                       adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
+diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
+index add317bd8d55c..3d7593ea79f14 100644
+--- a/drivers/gpu/drm/drm_edid.c
++++ b/drivers/gpu/drm/drm_edid.c
+@@ -5132,6 +5132,7 @@ u32 drm_add_display_info(struct drm_connector 
*connector, const struct edid *edi
+       if (!(edid->input & DRM_EDID_INPUT_DIGITAL))
+               return quirks;
+ 
++      info->color_formats |= DRM_COLOR_FORMAT_RGB444;
+       drm_parse_cea_ext(connector, edid);
+ 
+       /*
+@@ -5180,7 +5181,6 @@ u32 drm_add_display_info(struct drm_connector 
*connector, const struct edid *edi
+       DRM_DEBUG("%s: Assigning EDID-1.4 digital sink color depth as %d 
bpc.\n",
+                         connector->name, info->bpc);
+ 
+-      info->color_formats |= DRM_COLOR_FORMAT_RGB444;
+       if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444)
+               info->color_formats |= DRM_COLOR_FORMAT_YCRCB444;
+       if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422)
+diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
+index e51ca7ca0a2a7..472aaea75ef84 100644
+--- a/drivers/gpu/drm/i915/intel_pm.c
++++ b/drivers/gpu/drm/i915/intel_pm.c
+@@ -3996,6 +3996,17 @@ static int intel_compute_sagv_mask(struct 
intel_atomic_state *state)
+                       return ret;
+       }
+ 
++      if (intel_can_enable_sagv(dev_priv, new_bw_state) !=
++          intel_can_enable_sagv(dev_priv, old_bw_state)) {
++              ret = intel_atomic_serialize_global_state(&new_bw_state->base);
++              if (ret)
++                      return ret;
++      } else if (new_bw_state->pipe_sagv_reject != 
old_bw_state->pipe_sagv_reject) {
++              ret = intel_atomic_lock_global_state(&new_bw_state->base);
++              if (ret)
++                      return ret;
++      }
++
+       for_each_new_intel_crtc_in_state(state, crtc,
+                                        new_crtc_state, i) {
+               struct skl_pipe_wm *pipe_wm = &new_crtc_state->wm.skl.optimal;
+@@ -4010,17 +4021,6 @@ static int intel_compute_sagv_mask(struct 
intel_atomic_state *state)
+                                      intel_can_enable_sagv(dev_priv, 
new_bw_state);
+       }
+ 
+-      if (intel_can_enable_sagv(dev_priv, new_bw_state) !=
+-          intel_can_enable_sagv(dev_priv, old_bw_state)) {
+-              ret = intel_atomic_serialize_global_state(&new_bw_state->base);
+-              if (ret)
+-                      return ret;
+-      } else if (new_bw_state->pipe_sagv_reject != 
old_bw_state->pipe_sagv_reject) {
+-              ret = intel_atomic_lock_global_state(&new_bw_state->base);
+-              if (ret)
+-                      return ret;
+-      }
+-
+       return 0;
+ }
+ 
+diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
+index e5a83f7492677..d649fea829994 100644
+--- a/drivers/hwmon/hwmon.c
++++ b/drivers/hwmon/hwmon.c
+@@ -178,12 +178,14 @@ static int hwmon_thermal_add_sensor(struct device *dev, 
int index)
+ 
+       tzd = devm_thermal_zone_of_sensor_register(dev, index, tdata,
+                                                  &hwmon_thermal_ops);
+-      /*
+-       * If CONFIG_THERMAL_OF is disabled, this returns -ENODEV,
+-       * so ignore that error but forward any other error.
+-       */
+-      if (IS_ERR(tzd) && (PTR_ERR(tzd) != -ENODEV))
+-              return PTR_ERR(tzd);
++      if (IS_ERR(tzd)) {
++              if (PTR_ERR(tzd) != -ENODEV)
++                      return PTR_ERR(tzd);
++              dev_info(dev, "temp%d_input not attached to any thermal zone\n",
++                       index + 1);
++              devm_kfree(dev, tdata);
++              return 0;
++      }
+ 
+       err = devm_add_action(dev, hwmon_thermal_remove_sensor, &tdata->node);
+       if (err)
+diff --git a/drivers/iio/accel/bmc150-accel-core.c 
b/drivers/iio/accel/bmc150-accel-core.c
+index 48435865fdaf3..792526462f1c9 100644
+--- a/drivers/iio/accel/bmc150-accel-core.c
++++ b/drivers/iio/accel/bmc150-accel-core.c
+@@ -1648,11 +1648,14 @@ int bmc150_accel_core_probe(struct device *dev, struct 
regmap *regmap, int irq,
+       ret = iio_device_register(indio_dev);
+       if (ret < 0) {
+               dev_err(dev, "Unable to register iio device\n");
+-              goto err_trigger_unregister;
++              goto err_pm_cleanup;
+       }
+ 
+       return 0;
+ 
++err_pm_cleanup:
++      pm_runtime_dont_use_autosuspend(dev);
++      pm_runtime_disable(dev);
+ err_trigger_unregister:
+       bmc150_accel_unregister_triggers(data, BMC150_ACCEL_TRIGGERS - 1);
+ err_buffer_cleanup:
+diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
+index 2eaf85b6e39f4..89e0a89d95d6b 100644
+--- a/drivers/iio/accel/kxcjk-1013.c
++++ b/drivers/iio/accel/kxcjk-1013.c
+@@ -1429,11 +1429,14 @@ static int kxcjk1013_probe(struct i2c_client *client,
+       ret = iio_device_register(indio_dev);
+       if (ret < 0) {
+               dev_err(&client->dev, "unable to register iio device\n");
+-              goto err_buffer_cleanup;
++              goto err_pm_cleanup;
+       }
+ 
+       return 0;
+ 
++err_pm_cleanup:
++      pm_runtime_dont_use_autosuspend(&client->dev);
++      pm_runtime_disable(&client->dev);
+ err_buffer_cleanup:
+       iio_triggered_buffer_cleanup(indio_dev);
+ err_trigger_unregister:
+diff --git a/drivers/iio/accel/mma9551.c b/drivers/iio/accel/mma9551.c
+index 08a2303cc9df3..26421e8e82639 100644
+--- a/drivers/iio/accel/mma9551.c
++++ b/drivers/iio/accel/mma9551.c
+@@ -495,11 +495,14 @@ static int mma9551_probe(struct i2c_client *client,
+       ret = iio_device_register(indio_dev);
+       if (ret < 0) {
+               dev_err(&client->dev, "unable to register iio device\n");
+-              goto out_poweroff;
++              goto err_pm_cleanup;
+       }
+ 
+       return 0;
+ 
++err_pm_cleanup:
++      pm_runtime_dont_use_autosuspend(&client->dev);
++      pm_runtime_disable(&client->dev);
+ out_poweroff:
+       mma9551_set_device_state(client, false);
+ 
+diff --git a/drivers/iio/accel/mma9553.c b/drivers/iio/accel/mma9553.c
+index c15908faa3816..a23a7685d1f93 100644
+--- a/drivers/iio/accel/mma9553.c
++++ b/drivers/iio/accel/mma9553.c
+@@ -1134,12 +1134,15 @@ static int mma9553_probe(struct i2c_client *client,
+       ret = iio_device_register(indio_dev);
+       if (ret < 0) {
+               dev_err(&client->dev, "unable to register iio device\n");
+-              goto out_poweroff;
++              goto err_pm_cleanup;
+       }
+ 
+       dev_dbg(&indio_dev->dev, "Registered device %s\n", name);
+       return 0;
+ 
++err_pm_cleanup:
++      pm_runtime_dont_use_autosuspend(&client->dev);
++      pm_runtime_disable(&client->dev);
+ out_poweroff:
+       mma9551_set_device_state(client, false);
+       return ret;
+diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c
+index 9c2401c5848ec..bd35009950376 100644
+--- a/drivers/iio/adc/ad7124.c
++++ b/drivers/iio/adc/ad7124.c
+@@ -74,7 +74,7 @@
+ #define AD7124_CONFIG_REF_SEL(x)      FIELD_PREP(AD7124_CONFIG_REF_SEL_MSK, x)
+ #define AD7124_CONFIG_PGA_MSK         GENMASK(2, 0)
+ #define AD7124_CONFIG_PGA(x)          FIELD_PREP(AD7124_CONFIG_PGA_MSK, x)
+-#define AD7124_CONFIG_IN_BUFF_MSK     GENMASK(7, 6)
++#define AD7124_CONFIG_IN_BUFF_MSK     GENMASK(6, 5)
+ #define AD7124_CONFIG_IN_BUFF(x)      FIELD_PREP(AD7124_CONFIG_IN_BUFF_MSK, x)
+ 
+ /* AD7124_FILTER_X */
+diff --git a/drivers/iio/adc/men_z188_adc.c b/drivers/iio/adc/men_z188_adc.c
+index 42ea8bc7e7805..adc5ceaef8c93 100644
+--- a/drivers/iio/adc/men_z188_adc.c
++++ b/drivers/iio/adc/men_z188_adc.c
+@@ -103,6 +103,7 @@ static int men_z188_probe(struct mcb_device *dev,
+       struct z188_adc *adc;
+       struct iio_dev *indio_dev;
+       struct resource *mem;
++      int ret;
+ 
+       indio_dev = devm_iio_device_alloc(&dev->dev, sizeof(struct z188_adc));
+       if (!indio_dev)
+@@ -128,8 +129,14 @@ static int men_z188_probe(struct mcb_device *dev,
+       adc->mem = mem;
+       mcb_set_drvdata(dev, indio_dev);
+ 
+-      return iio_device_register(indio_dev);
++      ret = iio_device_register(indio_dev);
++      if (ret)
++              goto err_unmap;
++
++      return 0;
+ 
++err_unmap:
++      iounmap(adc->base);
+ err:
+       mcb_release_mem(mem);
+       return -ENXIO;
+diff --git a/drivers/iio/gyro/bmg160_core.c b/drivers/iio/gyro/bmg160_core.c
+index 39fe0b1785920..b6b90eebec0b9 100644
+--- a/drivers/iio/gyro/bmg160_core.c
++++ b/drivers/iio/gyro/bmg160_core.c
+@@ -1170,11 +1170,14 @@ int bmg160_core_probe(struct device *dev, struct 
regmap *regmap, int irq,
+       ret = iio_device_register(indio_dev);
+       if (ret < 0) {
+               dev_err(dev, "unable to register iio device\n");
+-              goto err_buffer_cleanup;
++              goto err_pm_cleanup;
+       }
+ 
+       return 0;
+ 
++err_pm_cleanup:
++      pm_runtime_dont_use_autosuspend(dev);
++      pm_runtime_disable(dev);
+ err_buffer_cleanup:
+       iio_triggered_buffer_cleanup(indio_dev);
+ err_trigger_unregister:
+diff --git a/drivers/iio/imu/kmx61.c b/drivers/iio/imu/kmx61.c
+index 61885e99d3fc1..89133315e6aaf 100644
+--- a/drivers/iio/imu/kmx61.c
++++ b/drivers/iio/imu/kmx61.c
+@@ -1392,7 +1392,7 @@ static int kmx61_probe(struct i2c_client *client,
+       ret = iio_device_register(data->acc_indio_dev);
+       if (ret < 0) {
+               dev_err(&client->dev, "Failed to register acc iio device\n");
+-              goto err_buffer_cleanup_mag;
++              goto err_pm_cleanup;
+       }
+ 
+       ret = iio_device_register(data->mag_indio_dev);
+@@ -1405,6 +1405,9 @@ static int kmx61_probe(struct i2c_client *client,
+ 
+ err_iio_unregister_acc:
+       iio_device_unregister(data->acc_indio_dev);
++err_pm_cleanup:
++      pm_runtime_dont_use_autosuspend(&client->dev);
++      pm_runtime_disable(&client->dev);
+ err_buffer_cleanup_mag:
+       if (client->irq > 0)
+               iio_triggered_buffer_cleanup(data->mag_indio_dev);
+diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c 
b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+index 558ca3843bb95..2c528425b03b4 100644
+--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
++++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+@@ -1558,8 +1558,12 @@ static int st_lsm6dsx_read_oneshot(struct 
st_lsm6dsx_sensor *sensor,
+       if (err < 0)
+               return err;
+ 
++      /*
++       * we need to wait for sensor settling time before
++       * reading data in order to avoid corrupted samples
++       */
+       delay = 1000000000 / sensor->odr;
+-      usleep_range(delay, 2 * delay);
++      usleep_range(3 * delay, 4 * delay);
+ 
+       err = st_lsm6dsx_read_locked(hw, addr, &data, sizeof(data));
+       if (err < 0)
+diff --git a/drivers/iio/magnetometer/bmc150_magn.c 
b/drivers/iio/magnetometer/bmc150_magn.c
+index 8eacfaf584cfd..620537d0104d4 100644
+--- a/drivers/iio/magnetometer/bmc150_magn.c
++++ b/drivers/iio/magnetometer/bmc150_magn.c
+@@ -941,13 +941,14 @@ int bmc150_magn_probe(struct device *dev, struct regmap 
*regmap,
+       ret = iio_device_register(indio_dev);
+       if (ret < 0) {
+               dev_err(dev, "unable to register iio device\n");
+-              goto err_disable_runtime_pm;
++              goto err_pm_cleanup;
+       }
+ 
+       dev_dbg(dev, "Registered device %s\n", name);
+       return 0;
+ 
+-err_disable_runtime_pm:
++err_pm_cleanup:
++      pm_runtime_dont_use_autosuspend(dev);
+       pm_runtime_disable(dev);
+ err_buffer_cleanup:
+       iio_triggered_buffer_cleanup(indio_dev);
+diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
+index ce492134c1e5c..fbb0efbe25f84 100644
+--- a/drivers/infiniband/core/cma.c
++++ b/drivers/infiniband/core/cma.c
+@@ -3321,22 +3321,30 @@ err:
+ static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
+                        const struct sockaddr *dst_addr)
+ {
+-      if (!src_addr || !src_addr->sa_family) {
+-              src_addr = (struct sockaddr *) &id->route.addr.src_addr;
+-              src_addr->sa_family = dst_addr->sa_family;
+-              if (IS_ENABLED(CONFIG_IPV6) &&
+-                  dst_addr->sa_family == AF_INET6) {
+-                      struct sockaddr_in6 *src_addr6 = (struct sockaddr_in6 
*) src_addr;
+-                      struct sockaddr_in6 *dst_addr6 = (struct sockaddr_in6 
*) dst_addr;
+-                      src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id;
+-                      if (ipv6_addr_type(&dst_addr6->sin6_addr) & 
IPV6_ADDR_LINKLOCAL)
+-                              id->route.addr.dev_addr.bound_dev_if = 
dst_addr6->sin6_scope_id;
+-              } else if (dst_addr->sa_family == AF_IB) {
+-                      ((struct sockaddr_ib *) src_addr)->sib_pkey =
+-                              ((struct sockaddr_ib *) dst_addr)->sib_pkey;
+-              }
+-      }
+-      return rdma_bind_addr(id, src_addr);
++      struct sockaddr_storage zero_sock = {};
++
++      if (src_addr && src_addr->sa_family)
++              return rdma_bind_addr(id, src_addr);
++
++      /*
++       * When the src_addr is not specified, automatically supply an any addr
++       */
++      zero_sock.ss_family = dst_addr->sa_family;
++      if (IS_ENABLED(CONFIG_IPV6) && dst_addr->sa_family == AF_INET6) {
++              struct sockaddr_in6 *src_addr6 =
++                      (struct sockaddr_in6 *)&zero_sock;
++              struct sockaddr_in6 *dst_addr6 =
++                      (struct sockaddr_in6 *)dst_addr;
++
++              src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id;
++              if (ipv6_addr_type(&dst_addr6->sin6_addr) & IPV6_ADDR_LINKLOCAL)
++                      id->route.addr.dev_addr.bound_dev_if =
++                              dst_addr6->sin6_scope_id;
++      } else if (dst_addr->sa_family == AF_IB) {
++              ((struct sockaddr_ib *)&zero_sock)->sib_pkey =
++                      ((struct sockaddr_ib *)dst_addr)->sib_pkey;
++      }
++      return rdma_bind_addr(id, (struct sockaddr *)&zero_sock);
+ }
+ 
+ /*
+diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c 
b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+index 46fad202a380e..13634eda833de 100644
+--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c
++++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c
+@@ -1328,6 +1328,12 @@ out_err:
+ 
+ static void free_permits(struct rtrs_clt *clt)
+ {
++      if (clt->permits_map) {
++              size_t sz = clt->queue_depth;
++
++              wait_event(clt->permits_wait,
++                         find_first_bit(clt->permits_map, sz) >= sz);
++      }
+       kfree(clt->permits_map);
+       clt->permits_map = NULL;
+       kfree(clt->permits);
+@@ -2540,6 +2546,8 @@ static void rtrs_clt_dev_release(struct device *dev)
+ {
+       struct rtrs_clt *clt = container_of(dev, struct rtrs_clt, dev);
+ 
++      mutex_destroy(&clt->paths_ev_mutex);
++      mutex_destroy(&clt->paths_mutex);
+       kfree(clt);
+ }
+ 
+@@ -2571,6 +2579,8 @@ static struct rtrs_clt *alloc_clt(const char *sessname, 
size_t paths_num,
+               return ERR_PTR(-ENOMEM);
+       }
+ 
++      clt->dev.class = rtrs_clt_dev_class;
++      clt->dev.release = rtrs_clt_dev_release;
+       uuid_gen(&clt->paths_uuid);
+       INIT_LIST_HEAD_RCU(&clt->paths_list);
+       clt->paths_num = paths_num;
+@@ -2588,64 +2598,51 @@ static struct rtrs_clt *alloc_clt(const char 
*sessname, size_t paths_num,
+       init_waitqueue_head(&clt->permits_wait);
+       mutex_init(&clt->paths_ev_mutex);
+       mutex_init(&clt->paths_mutex);
++      device_initialize(&clt->dev);
+ 
+-      clt->dev.class = rtrs_clt_dev_class;
+-      clt->dev.release = rtrs_clt_dev_release;
+       err = dev_set_name(&clt->dev, "%s", sessname);
+       if (err)
+-              goto err;
++              goto err_put;
++
+       /*
+        * Suppress user space notification until
+        * sysfs files are created
+        */
+       dev_set_uevent_suppress(&clt->dev, true);
+-      err = device_register(&clt->dev);
+-      if (err) {
+-              put_device(&clt->dev);
+-              goto err;
+-      }
++      err = device_add(&clt->dev);
++      if (err)
++              goto err_put;
+ 
+       clt->kobj_paths = kobject_create_and_add("paths", &clt->dev.kobj);
+       if (!clt->kobj_paths) {
+               err = -ENOMEM;
+-              goto err_dev;
++              goto err_del;
+       }
+       err = rtrs_clt_create_sysfs_root_files(clt);
+       if (err) {
+               kobject_del(clt->kobj_paths);
+               kobject_put(clt->kobj_paths);
+-              goto err_dev;
++              goto err_del;
+       }
+       dev_set_uevent_suppress(&clt->dev, false);
+       kobject_uevent(&clt->dev.kobj, KOBJ_ADD);
+ 
+       return clt;
+-err_dev:
+-      device_unregister(&clt->dev);
+-err:
++err_del:
++      device_del(&clt->dev);
++err_put:
+       free_percpu(clt->pcpu_path);
+-      kfree(clt);
++      put_device(&clt->dev);
+       return ERR_PTR(err);
+ }
+ 
+-static void wait_for_inflight_permits(struct rtrs_clt *clt)
+-{
+-      if (clt->permits_map) {
+-              size_t sz = clt->queue_depth;
+-
+-              wait_event(clt->permits_wait,
+-                         find_first_bit(clt->permits_map, sz) >= sz);
+-      }
+-}
+-
+ static void free_clt(struct rtrs_clt *clt)
+ {
+-      wait_for_inflight_permits(clt);
+-      free_permits(clt);
+       free_percpu(clt->pcpu_path);
+-      mutex_destroy(&clt->paths_ev_mutex);
+-      mutex_destroy(&clt->paths_mutex);
+-      /* release callback will free clt in last put */
++
++      /*
++       * release callback will free clt and destroy mutexes in last put
++       */
+       device_unregister(&clt->dev);
+ }
+ 
+@@ -2761,6 +2758,7 @@ void rtrs_clt_close(struct rtrs_clt *clt)
+               rtrs_clt_destroy_sess_files(sess, NULL);
+               kobject_put(&sess->kobj);
+       }
++      free_permits(clt);
+       free_clt(clt);
+ }
+ EXPORT_SYMBOL(rtrs_clt_close);
+diff --git a/drivers/infiniband/ulp/srp/ib_srp.c 
b/drivers/infiniband/ulp/srp/ib_srp.c
+index 86d5c4c92b363..b4ccb333a8342 100644
+--- a/drivers/infiniband/ulp/srp/ib_srp.c
++++ b/drivers/infiniband/ulp/srp/ib_srp.c
+@@ -4045,9 +4045,11 @@ static void srp_remove_one(struct ib_device *device, 
void *client_data)
+               spin_unlock(&host->target_lock);
+ 
+               /*
+-               * Wait for tl_err and target port removal tasks.
++               * srp_queue_remove_work() queues a call to
++               * srp_remove_target(). The latter function cancels
++               * target->tl_err_work so waiting for the remove works to
++               * finish is sufficient.
+                */
+-              flush_workqueue(system_long_wq);
+               flush_workqueue(srp_remove_wq);
+ 
+               kfree(host);
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+index 9a86367a26369..7fa271db41b07 100644
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+@@ -100,6 +100,9 @@ MODULE_LICENSE("GPL");
+ MODULE_FIRMWARE(FW_FILE_NAME_E1);
+ MODULE_FIRMWARE(FW_FILE_NAME_E1H);
+ MODULE_FIRMWARE(FW_FILE_NAME_E2);
++MODULE_FIRMWARE(FW_FILE_NAME_E1_V15);
++MODULE_FIRMWARE(FW_FILE_NAME_E1H_V15);
++MODULE_FIRMWARE(FW_FILE_NAME_E2_V15);
+ 
+ int bnx2x_num_queues;
+ module_param_named(num_queues, bnx2x_num_queues, int, 0444);
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+index 6f9196ff2ac4f..98087b278d1f4 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+@@ -1926,6 +1926,9 @@ static int bnxt_get_fecparam(struct net_device *dev,
+       case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_RS272_IEEE_ACTIVE:
+               fec->active_fec |= ETHTOOL_FEC_LLRS;
+               break;
++      case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_NONE_ACTIVE:
++              fec->active_fec |= ETHTOOL_FEC_OFF;
++              break;
+       }
+       return 0;
+ }
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+index bc7c1962f9e66..6a1b1363ac16a 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+@@ -1746,7 +1746,7 @@ static int mlx5e_get_module_eeprom(struct net_device 
*netdev,
+               if (size_read < 0) {
+                       netdev_err(priv->netdev, "%s: mlx5_query_eeprom 
failed:0x%x\n",
+                                  __func__, size_read);
+-                      return 0;
++                      return size_read;
+               }
+ 
+               i += size_read;
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+index d384403d73f69..b8637547800f9 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+@@ -985,7 +985,8 @@ static inline void mlx5e_handle_csum(struct net_device 
*netdev,
+       }
+ 
+       /* True when explicitly set via priv flag, or XDP prog is loaded */
+-      if (test_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &rq->state))
++      if (test_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &rq->state) ||
++          get_cqe_tls_offload(cqe))
+               goto csum_unnecessary;
+ 
+       /* CQE csum doesn't cover padding octets in short ethernet
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c 
b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+index e06b1ba7d2349..ccc7dd3e738a4 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+@@ -2037,10 +2037,6 @@ esw_check_vport_match_metadata_supported(const struct 
mlx5_eswitch *esw)
+       if (!MLX5_CAP_ESW_FLOWTABLE(esw->dev, flow_source))
+               return false;
+ 
+-      if (mlx5_core_is_ecpf_esw_manager(esw->dev) ||
+-          mlx5_ecpf_vport_exists(esw->dev))
+-              return false;
+-
+       return true;
+ }
+ 
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c 
b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+index 0ff034b0866e2..55772f0cbbf8f 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+@@ -2034,6 +2034,8 @@ void mlx5_del_flow_rules(struct mlx5_flow_handle *handle)
+               fte->node.del_hw_func = NULL;
+               up_write_ref_node(&fte->node, false);
+               tree_put_node(&fte->node, false);
++      } else {
++              up_write_ref_node(&fte->node, false);
+       }
+       kfree(handle);
+ }
+diff --git a/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c 
b/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c
+index d3d5b663a4a3c..088ceac07b805 100644
+--- a/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c
++++ b/drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c
+@@ -922,8 +922,8 @@ nfp_tunnel_add_shared_mac(struct nfp_app *app, struct 
net_device *netdev,
+                         int port, bool mod)
+ {
+       struct nfp_flower_priv *priv = app->priv;
+-      int ida_idx = NFP_MAX_MAC_INDEX, err;
+       struct nfp_tun_offloaded_mac *entry;
++      int ida_idx = -1, err;
+       u16 nfp_mac_idx = 0;
+ 
+       entry = nfp_tunnel_lookup_offloaded_macs(app, netdev->dev_addr);
+@@ -997,7 +997,7 @@ err_remove_hash:
+ err_free_entry:
+       kfree(entry);
+ err_free_ida:
+-      if (ida_idx != NFP_MAX_MAC_INDEX)
++      if (ida_idx != -1)
+               ida_simple_remove(&priv->tun.mac_off_ids, ida_idx);
+ 
+       return err;
+diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c 
b/drivers/net/ethernet/xilinx/ll_temac_main.c
+index 650ffb93796f1..130f4b707bdc4 100644
+--- a/drivers/net/ethernet/xilinx/ll_temac_main.c
++++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
+@@ -1421,6 +1421,8 @@ static int temac_probe(struct platform_device *pdev)
+               lp->indirect_lock = devm_kmalloc(&pdev->dev,
+                                                sizeof(*lp->indirect_lock),
+                                                GFP_KERNEL);
++              if (!lp->indirect_lock)
++                      return -ENOMEM;
+               spin_lock_init(lp->indirect_lock);
+       }
+ 
+diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
+index 6aaa0675c28a3..43ddbe61dc58e 100644
+--- a/drivers/net/usb/cdc_ether.c
++++ b/drivers/net/usb/cdc_ether.c
+@@ -570,6 +570,11 @@ static const struct usb_device_id products[] = {
+       .bInterfaceSubClass     = USB_CDC_SUBCLASS_ETHERNET, \
+       .bInterfaceProtocol     = USB_CDC_PROTO_NONE
+ 
++#define ZAURUS_FAKE_INTERFACE \
++      .bInterfaceClass        = USB_CLASS_COMM, \
++      .bInterfaceSubClass     = USB_CDC_SUBCLASS_MDLM, \
++      .bInterfaceProtocol     = USB_CDC_PROTO_NONE
++
+ /* SA-1100 based Sharp Zaurus ("collie"), or compatible;
+  * wire-incompatible with true CDC Ethernet implementations.
+  * (And, it seems, needlessly so...)
+@@ -623,6 +628,13 @@ static const struct usb_device_id products[] = {
+       .idProduct              = 0x9032,       /* SL-6000 */
+       ZAURUS_MASTER_INTERFACE,
+       .driver_info            = 0,
++}, {
++      .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
++               | USB_DEVICE_ID_MATCH_DEVICE,
++      .idVendor               = 0x04DD,
++      .idProduct              = 0x9032,       /* SL-6000 */
++      ZAURUS_FAKE_INTERFACE,
++      .driver_info            = 0,
+ }, {
+       .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
+                | USB_DEVICE_ID_MATCH_DEVICE,
+diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
+index eaaa5aee58251..ab91fa5b0194d 100644
+--- a/drivers/net/usb/cdc_ncm.c
++++ b/drivers/net/usb/cdc_ncm.c
+@@ -1702,10 +1702,10 @@ int cdc_ncm_rx_fixup(struct usbnet *dev, struct 
sk_buff *skb_in)
+ {
+       struct sk_buff *skb;
+       struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
+-      int len;
++      unsigned int len;
+       int nframes;
+       int x;
+-      int offset;
++      unsigned int offset;
+       union {
+               struct usb_cdc_ncm_ndp16 *ndp16;
+               struct usb_cdc_ncm_ndp32 *ndp32;
+@@ -1777,8 +1777,8 @@ next_ndp:
+                       break;
+               }
+ 
+-              /* sanity checking */
+-              if (((offset + len) > skb_in->len) ||
++              /* sanity checking - watch out for integer wrap*/
++              if ((offset > skb_in->len) || (len > skb_in->len - offset) ||
+                               (len > ctx->rx_max) || (len < ETH_HLEN)) {
+                       netif_dbg(dev, rx_err, dev->net,
+                                 "invalid frame detected (ignored) 
offset[%u]=%u, length=%u, skb=%p\n",
+diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c
+index e04c8054c2cf3..fce6713e970ba 100644
+--- a/drivers/net/usb/sr9700.c
++++ b/drivers/net/usb/sr9700.c
+@@ -410,7 +410,7 @@ static int sr9700_rx_fixup(struct usbnet *dev, struct 
sk_buff *skb)
+               /* ignore the CRC length */
+               len = (skb->data[1] | (skb->data[2] << 8)) - 4;
+ 
+-              if (len > ETH_FRAME_LEN)
++              if (len > ETH_FRAME_LEN || len > skb->len)
+                       return 0;
+ 
+               /* the last packet of current skb */
+diff --git a/drivers/net/usb/zaurus.c b/drivers/net/usb/zaurus.c
+index 8e717a0b559b3..7984f2157d222 100644
+--- a/drivers/net/usb/zaurus.c
++++ b/drivers/net/usb/zaurus.c
+@@ -256,6 +256,11 @@ static const struct usb_device_id products [] = {
+       .bInterfaceSubClass     = USB_CDC_SUBCLASS_ETHERNET, \
+       .bInterfaceProtocol     = USB_CDC_PROTO_NONE
+ 
++#define ZAURUS_FAKE_INTERFACE \
++      .bInterfaceClass        = USB_CLASS_COMM, \
++      .bInterfaceSubClass     = USB_CDC_SUBCLASS_MDLM, \
++      .bInterfaceProtocol     = USB_CDC_PROTO_NONE
++
+ /* SA-1100 based Sharp Zaurus ("collie"), or compatible. */
+ {
+       .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
+@@ -313,6 +318,13 @@ static const struct usb_device_id products [] = {
+       .idProduct              = 0x9032,       /* SL-6000 */
+       ZAURUS_MASTER_INTERFACE,
+       .driver_info = ZAURUS_PXA_INFO,
++}, {
++      .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
++                          | USB_DEVICE_ID_MATCH_DEVICE,
++      .idVendor               = 0x04DD,
++      .idProduct              = 0x9032,       /* SL-6000 */
++      ZAURUS_FAKE_INTERFACE,
++      .driver_info = (unsigned long)&bogus_mdlm_info,
+ }, {
+       .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
+                | USB_DEVICE_ID_MATCH_DEVICE,
+diff --git a/drivers/platform/x86/surface3_power.c 
b/drivers/platform/x86/surface3_power.c
+index cc4f9cba68563..01aacf1bee074 100644
+--- a/drivers/platform/x86/surface3_power.c
++++ b/drivers/platform/x86/surface3_power.c
+@@ -233,14 +233,21 @@ static int mshw0011_bix(struct mshw0011_data *cdata, 
struct bix *bix)
+       }
+       bix->last_full_charg_capacity = ret;
+ 
+-      /* get serial number */
++      /*
++       * Get serial number, on some devices (with unofficial replacement
++       * battery?) reading any of the serial number range addresses gets
++       * nacked in this case just leave the serial number empty.
++       */
+       ret = i2c_smbus_read_i2c_block_data(client, MSHW0011_BAT0_REG_SERIAL_NO,
+                                           sizeof(buf), buf);
+-      if (ret != sizeof(buf)) {
++      if (ret == -EREMOTEIO) {
++              /* no serial number available */
++      } else if (ret != sizeof(buf)) {
+               dev_err(&client->dev, "Error reading serial no: %d\n", ret);
+               return ret;
++      } else {
++              snprintf(bix->serial, ARRAY_SIZE(bix->serial), "%3pE%6pE", buf 
+ 7, buf);
+       }
+-      snprintf(bix->serial, ARRAY_SIZE(bix->serial), "%3pE%6pE", buf + 7, 
buf);
+ 
+       /* get cycle count */
+       ret = i2c_smbus_read_word_data(client, MSHW0011_BAT0_REG_CYCLE_CNT);
+diff --git a/drivers/spi/spi-zynq-qspi.c b/drivers/spi/spi-zynq-qspi.c
+index b635835729d66..13c0b15fe1764 100644
+--- a/drivers/spi/spi-zynq-qspi.c
++++ b/drivers/spi/spi-zynq-qspi.c
+@@ -570,6 +570,9 @@ static int zynq_qspi_exec_mem_op(struct spi_mem *mem,
+ 
+       if (op->dummy.nbytes) {
+               tmpbuf = kzalloc(op->dummy.nbytes, GFP_KERNEL);
++              if (!tmpbuf)
++                      return -ENOMEM;
++
+               memset(tmpbuf, 0xff, op->dummy.nbytes);
+               reinit_completion(&xqspi->data_completion);
+               xqspi->txbuf = tmpbuf;
+diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c
+index f255a96ae5a48..6ea80add7378f 100644
+--- a/drivers/tee/optee/core.c
++++ b/drivers/tee/optee/core.c
+@@ -588,6 +588,7 @@ static int optee_remove(struct platform_device *pdev)
+       /* Unregister OP-TEE specific client devices on TEE bus */
+       optee_unregister_devices();
+ 
++      teedev_close_context(optee->ctx);
+       /*
+        * Ask OP-TEE to free all cached shared memory objects to decrease
+        * reference counters and also avoid wild pointers in secure world
+@@ -633,6 +634,7 @@ static int optee_probe(struct platform_device *pdev)
+       struct optee *optee = NULL;
+       void *memremaped_shm = NULL;
+       struct tee_device *teedev;
++      struct tee_context *ctx;
+       u32 sec_caps;
+       int rc;
+ 
+@@ -719,6 +721,12 @@ static int optee_probe(struct platform_device *pdev)
+       optee_supp_init(&optee->supp);
+       optee->memremaped_shm = memremaped_shm;
+       optee->pool = pool;
++      ctx = teedev_open(optee->teedev);
++      if (IS_ERR(ctx)) {
++              rc = PTR_ERR(ctx);
++              goto err;
++      }
++      optee->ctx = ctx;
+ 
+       /*
+        * Ensure that there are no pre-existing shm objects before enabling
+diff --git a/drivers/tee/optee/optee_private.h 
b/drivers/tee/optee/optee_private.h
+index f6bb4a763ba94..ea09533e30cde 100644
+--- a/drivers/tee/optee/optee_private.h
++++ b/drivers/tee/optee/optee_private.h
+@@ -70,6 +70,7 @@ struct optee_supp {
+  * struct optee - main service struct
+  * @supp_teedev:      supplicant device
+  * @teedev:           client device
++ * @ctx:              driver internal TEE context
+  * @invoke_fn:                function to issue smc or hvc
+  * @call_queue:               queue of threads waiting to call @invoke_fn
+  * @wait_queue:               queue of threads from secure world waiting for a
+@@ -87,6 +88,7 @@ struct optee {
+       struct tee_device *supp_teedev;
+       struct tee_device *teedev;
+       optee_invoke_fn *invoke_fn;
++      struct tee_context *ctx;
+       struct optee_call_queue call_queue;
+       struct optee_wait_queue wait_queue;
+       struct optee_supp supp;
+diff --git a/drivers/tee/optee/rpc.c b/drivers/tee/optee/rpc.c
+index 9dbdd783d6f2d..f1e0332b0f6e8 100644
+--- a/drivers/tee/optee/rpc.c
++++ b/drivers/tee/optee/rpc.c
+@@ -284,6 +284,7 @@ static struct tee_shm *cmd_alloc_suppl(struct tee_context 
*ctx, size_t sz)
+ }
+ 
+ static void handle_rpc_func_cmd_shm_alloc(struct tee_context *ctx,
++                                        struct optee *optee,
+                                         struct optee_msg_arg *arg,
+                                         struct optee_call_ctx *call_ctx)
+ {
+@@ -313,7 +314,8 @@ static void handle_rpc_func_cmd_shm_alloc(struct 
tee_context *ctx,
+               shm = cmd_alloc_suppl(ctx, sz);
+               break;
+       case OPTEE_MSG_RPC_SHM_TYPE_KERNEL:
+-              shm = tee_shm_alloc(ctx, sz, TEE_SHM_MAPPED | TEE_SHM_PRIV);
++              shm = tee_shm_alloc(optee->ctx, sz,
++                                  TEE_SHM_MAPPED | TEE_SHM_PRIV);
+               break;
+       default:
+               arg->ret = TEEC_ERROR_BAD_PARAMETERS;
+@@ -470,7 +472,7 @@ static void handle_rpc_func_cmd(struct tee_context *ctx, 
struct optee *optee,
+               break;
+       case OPTEE_MSG_RPC_CMD_SHM_ALLOC:
+               free_pages_list(call_ctx);
+-              handle_rpc_func_cmd_shm_alloc(ctx, arg, call_ctx);
++              handle_rpc_func_cmd_shm_alloc(ctx, optee, arg, call_ctx);
+               break;
+       case OPTEE_MSG_RPC_CMD_SHM_FREE:
+               handle_rpc_func_cmd_shm_free(ctx, arg);
+@@ -501,7 +503,7 @@ void optee_handle_rpc(struct tee_context *ctx, struct 
optee_rpc_param *param,
+ 
+       switch (OPTEE_SMC_RETURN_GET_RPC_FUNC(param->a0)) {
+       case OPTEE_SMC_RPC_FUNC_ALLOC:
+-              shm = tee_shm_alloc(ctx, param->a1,
++              shm = tee_shm_alloc(optee->ctx, param->a1,
+                                   TEE_SHM_MAPPED | TEE_SHM_PRIV);
+               if (!IS_ERR(shm) && !tee_shm_get_pa(shm, 0, &pa)) {
+                       reg_pair_from_64(&param->a1, &param->a2, pa);
+diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c
+index dfc239c64ce3c..e07f997cf8dd3 100644
+--- a/drivers/tee/tee_core.c
++++ b/drivers/tee/tee_core.c
+@@ -43,7 +43,7 @@ static DEFINE_SPINLOCK(driver_lock);
+ static struct class *tee_class;
+ static dev_t tee_devt;
+ 
+-static struct tee_context *teedev_open(struct tee_device *teedev)
++struct tee_context *teedev_open(struct tee_device *teedev)
+ {
+       int rc;
+       struct tee_context *ctx;
+@@ -70,6 +70,7 @@ err:
+       return ERR_PTR(rc);
+ 
+ }
++EXPORT_SYMBOL_GPL(teedev_open);
+ 
+ void teedev_ctx_get(struct tee_context *ctx)
+ {
+@@ -96,13 +97,14 @@ void teedev_ctx_put(struct tee_context *ctx)
+       kref_put(&ctx->refcount, teedev_ctx_release);
+ }
+ 
+-static void teedev_close_context(struct tee_context *ctx)
++void teedev_close_context(struct tee_context *ctx)
+ {
+       struct tee_device *teedev = ctx->teedev;
+ 
+       teedev_ctx_put(ctx);
+       tee_device_put(teedev);
+ }
++EXPORT_SYMBOL_GPL(teedev_close_context);
+ 
+ static int tee_open(struct inode *inode, struct file *filp)
+ {
+diff --git a/drivers/thermal/intel/int340x_thermal/int3400_thermal.c 
b/drivers/thermal/intel/int340x_thermal/int3400_thermal.c
+index 0966551cbaaa0..793d7b58fc650 100644
+--- a/drivers/thermal/intel/int340x_thermal/int3400_thermal.c
++++ b/drivers/thermal/intel/int340x_thermal/int3400_thermal.c
+@@ -402,6 +402,10 @@ static void int3400_notify(acpi_handle handle,
+       thermal_prop[3] = kasprintf(GFP_KERNEL, "EVENT=%d", therm_event);
+       thermal_prop[4] = NULL;
+       kobject_uevent_env(&priv->thermal->device.kobj, KOBJ_CHANGE, 
thermal_prop);
++      kfree(thermal_prop[0]);
++      kfree(thermal_prop[1]);
++      kfree(thermal_prop[2]);
++      kfree(thermal_prop[3]);
+ }
+ 
+ static int int3400_thermal_get_temp(struct thermal_zone_device *thermal,
+diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
+index b8f8621537720..05562b3cca451 100644
+--- a/drivers/tty/n_gsm.c
++++ b/drivers/tty/n_gsm.c
+@@ -434,7 +434,7 @@ static u8 gsm_encode_modem(const struct gsm_dlci *dlci)
+               modembits |= MDM_RTR;
+       if (dlci->modem_tx & TIOCM_RI)
+               modembits |= MDM_IC;
+-      if (dlci->modem_tx & TIOCM_CD)
++      if (dlci->modem_tx & TIOCM_CD || dlci->gsm->initiator)
+               modembits |= MDM_DV;
+       return modembits;
+ }
+@@ -1426,6 +1426,9 @@ static void gsm_dlci_close(struct gsm_dlci *dlci)
+       if (dlci->addr != 0) {
+               tty_port_tty_hangup(&dlci->port, false);
+               kfifo_reset(&dlci->fifo);
++              /* Ensure that gsmtty_open() can return. */
++              tty_port_set_initialized(&dlci->port, 0);
++              wake_up_interruptible(&dlci->port.open_wait);
+       } else
+               dlci->gsm->dead = true;
+       wake_up(&dlci->gsm->event);
+@@ -1485,7 +1488,7 @@ static void gsm_dlci_t1(struct timer_list *t)
+                       dlci->mode = DLCI_MODE_ADM;
+                       gsm_dlci_open(dlci);
+               } else {
+-                      gsm_dlci_close(dlci);
++                      gsm_dlci_begin_close(dlci); /* prevent half open link */
+               }
+ 
+               break;
+@@ -1719,7 +1722,12 @@ static void gsm_dlci_release(struct gsm_dlci *dlci)
+               gsm_destroy_network(dlci);
+               mutex_unlock(&dlci->mutex);
+ 
+-              tty_hangup(tty);
++              /* We cannot use tty_hangup() because in tty_kref_put() the tty
++               * driver assumes that the hangup queue is free and reuses it to
++               * queue release_one_tty() -> NULL pointer panic in
++               * process_one_work().
++               */
++              tty_vhangup(tty);
+ 
+               tty_port_tty_set(&dlci->port, NULL);
+               tty_kref_put(tty);
+@@ -3173,9 +3181,9 @@ static void gsmtty_throttle(struct tty_struct *tty)
+       if (dlci->state == DLCI_CLOSED)
+               return;
+       if (C_CRTSCTS(tty))
+-              dlci->modem_tx &= ~TIOCM_DTR;
++              dlci->modem_tx &= ~TIOCM_RTS;
+       dlci->throttled = true;
+-      /* Send an MSC with DTR cleared */
++      /* Send an MSC with RTS cleared */
+       gsmtty_modem_update(dlci, 0);
+ }
+ 
+@@ -3185,9 +3193,9 @@ static void gsmtty_unthrottle(struct tty_struct *tty)
+       if (dlci->state == DLCI_CLOSED)
+               return;
+       if (C_CRTSCTS(tty))
+-              dlci->modem_tx |= TIOCM_DTR;
++              dlci->modem_tx |= TIOCM_RTS;
+       dlci->throttled = false;
+-      /* Send an MSC with DTR set */
++      /* Send an MSC with RTS set */
+       gsmtty_modem_update(dlci, 0);
+ }
+ 
+diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c
+index 9adb8362578c5..04b4ed5d06341 100644
+--- a/drivers/tty/serial/sc16is7xx.c
++++ b/drivers/tty/serial/sc16is7xx.c
+@@ -734,12 +734,15 @@ static irqreturn_t sc16is7xx_irq(int irq, void *dev_id)
+ static void sc16is7xx_tx_proc(struct kthread_work *ws)
+ {
+       struct uart_port *port = &(to_sc16is7xx_one(ws, tx_work)->port);
++      struct sc16is7xx_port *s = dev_get_drvdata(port->dev);
+ 
+       if ((port->rs485.flags & SER_RS485_ENABLED) &&
+           (port->rs485.delay_rts_before_send > 0))
+               msleep(port->rs485.delay_rts_before_send);
+ 
++      mutex_lock(&s->efr_lock);
+       sc16is7xx_handle_tx(port);
++      mutex_unlock(&s->efr_lock);
+ }
+ 
+ static void sc16is7xx_reconf_rs485(struct uart_port *port)
+diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
+index 641e4251cb7f1..03d16a08261d8 100644
+--- a/drivers/usb/dwc2/core.h
++++ b/drivers/usb/dwc2/core.h
+@@ -1406,6 +1406,7 @@ void dwc2_hsotg_core_connect(struct dwc2_hsotg *hsotg);
+ void dwc2_hsotg_disconnect(struct dwc2_hsotg *dwc2);
+ int dwc2_hsotg_set_test_mode(struct dwc2_hsotg *hsotg, int testmode);
+ #define dwc2_is_device_connected(hsotg) (hsotg->connected)
++#define dwc2_is_device_enabled(hsotg) (hsotg->enabled)
+ int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg);
+ int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg, int 
remote_wakeup);
+ int dwc2_gadget_enter_hibernation(struct dwc2_hsotg *hsotg);
+@@ -1434,6 +1435,7 @@ static inline int dwc2_hsotg_set_test_mode(struct 
dwc2_hsotg *hsotg,
+                                          int testmode)
+ { return 0; }
+ #define dwc2_is_device_connected(hsotg) (0)
++#define dwc2_is_device_enabled(hsotg) (0)
+ static inline int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg)
+ { return 0; }
+ static inline int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg,
+diff --git a/drivers/usb/dwc2/drd.c b/drivers/usb/dwc2/drd.c
+index aa6eb76f64ddc..36f2c38416e5e 100644
+--- a/drivers/usb/dwc2/drd.c
++++ b/drivers/usb/dwc2/drd.c
+@@ -109,8 +109,10 @@ static int dwc2_drd_role_sw_set(struct usb_role_switch 
*sw, enum usb_role role)
+               already = dwc2_ovr_avalid(hsotg, true);
+       } else if (role == USB_ROLE_DEVICE) {
+               already = dwc2_ovr_bvalid(hsotg, true);
+-              /* This clear DCTL.SFTDISCON bit */
+-              dwc2_hsotg_core_connect(hsotg);
++              if (dwc2_is_device_enabled(hsotg)) {
++                      /* This clear DCTL.SFTDISCON bit */
++                      dwc2_hsotg_core_connect(hsotg);
++              }
+       } else {
+               if (dwc2_is_device_mode(hsotg)) {
+                       if (!dwc2_ovr_bvalid(hsotg, false))
+diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
+index 17117870f6cea..98df8d52c765c 100644
+--- a/drivers/usb/dwc3/dwc3-pci.c
++++ b/drivers/usb/dwc3/dwc3-pci.c
+@@ -81,8 +81,8 @@ static const struct acpi_gpio_mapping acpi_dwc3_byt_gpios[] 
= {
+ static struct gpiod_lookup_table platform_bytcr_gpios = {
+       .dev_id         = "0000:00:16.0",
+       .table          = {
+-              GPIO_LOOKUP("INT33FC:00", 54, "reset", GPIO_ACTIVE_HIGH),
+-              GPIO_LOOKUP("INT33FC:02", 14, "cs", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("INT33FC:00", 54, "cs", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("INT33FC:02", 14, "reset", GPIO_ACTIVE_HIGH),
+               {}
+       },
+ };
+diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
+index 9095ce52c28c6..b68fe48ac5792 100644
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -3775,9 +3775,11 @@ static irqreturn_t dwc3_thread_interrupt(int irq, void 
*_evt)
+       unsigned long flags;
+       irqreturn_t ret = IRQ_NONE;
+ 
++      local_bh_disable();
+       spin_lock_irqsave(&dwc->lock, flags);
+       ret = dwc3_process_event_buf(evt);
+       spin_unlock_irqrestore(&dwc->lock, flags);
++      local_bh_enable();
+ 
+       return ret;
+ }
+diff --git a/drivers/usb/gadget/function/rndis.c 
b/drivers/usb/gadget/function/rndis.c
+index d9ed651f06ac3..0f14c5291af07 100644
+--- a/drivers/usb/gadget/function/rndis.c
++++ b/drivers/usb/gadget/function/rndis.c
+@@ -922,6 +922,7 @@ struct rndis_params *rndis_register(void 
(*resp_avail)(void *v), void *v)
+       params->resp_avail = resp_avail;
+       params->v = v;
+       INIT_LIST_HEAD(&params->resp_queue);
++      spin_lock_init(&params->resp_lock);
+       pr_debug("%s: configNr = %d\n", __func__, i);
+ 
+       return params;
+@@ -1015,12 +1016,14 @@ void rndis_free_response(struct rndis_params *params, 
u8 *buf)
+ {
+       rndis_resp_t *r, *n;
+ 
++      spin_lock(&params->resp_lock);
+       list_for_each_entry_safe(r, n, &params->resp_queue, list) {
+               if (r->buf == buf) {
+                       list_del(&r->list);
+                       kfree(r);
+               }
+       }
++      spin_unlock(&params->resp_lock);
+ }
+ EXPORT_SYMBOL_GPL(rndis_free_response);
+ 
+@@ -1030,14 +1033,17 @@ u8 *rndis_get_next_response(struct rndis_params 
*params, u32 *length)
+ 
+       if (!length) return NULL;
+ 
++      spin_lock(&params->resp_lock);
+       list_for_each_entry_safe(r, n, &params->resp_queue, list) {
+               if (!r->send) {
+                       r->send = 1;
+                       *length = r->length;
++                      spin_unlock(&params->resp_lock);
+                       return r->buf;
+               }
+       }
+ 
++      spin_unlock(&params->resp_lock);
+       return NULL;
+ }
+ EXPORT_SYMBOL_GPL(rndis_get_next_response);
+@@ -1054,7 +1060,9 @@ static rndis_resp_t *rndis_add_response(struct 
rndis_params *params, u32 length)
+       r->length = length;
+       r->send = 0;
+ 
++      spin_lock(&params->resp_lock);
+       list_add_tail(&r->list, &params->resp_queue);
++      spin_unlock(&params->resp_lock);
+       return r;
+ }
+ 
+diff --git a/drivers/usb/gadget/function/rndis.h 
b/drivers/usb/gadget/function/rndis.h
+index f6167f7fea82b..6206b8b7490f6 100644
+--- a/drivers/usb/gadget/function/rndis.h
++++ b/drivers/usb/gadget/function/rndis.h
+@@ -174,6 +174,7 @@ typedef struct rndis_params {
+       void                    (*resp_avail)(void *v);
+       void                    *v;
+       struct list_head        resp_queue;
++      spinlock_t              resp_lock;
+ } rndis_params;
+ 
+ /* RNDIS Message parser and other useless functions */
+diff --git a/drivers/usb/gadget/udc/udc-xilinx.c 
b/drivers/usb/gadget/udc/udc-xilinx.c
+index d5e9d20c097d2..096f56a09e6a2 100644
+--- a/drivers/usb/gadget/udc/udc-xilinx.c
++++ b/drivers/usb/gadget/udc/udc-xilinx.c
+@@ -1612,6 +1612,8 @@ static void xudc_getstatus(struct xusb_udc *udc)
+               break;
+       case USB_RECIP_ENDPOINT:
+               epnum = udc->setup.wIndex & USB_ENDPOINT_NUMBER_MASK;
++              if (epnum >= XUSB_MAX_ENDPOINTS)
++                      goto stall;
+               target_ep = &udc->ep[epnum];
+               epcfgreg = udc->read_fn(udc->addr + target_ep->offset);
+               halt = epcfgreg & XUSB_EP_CFG_STALL_MASK;
+@@ -1679,6 +1681,10 @@ static void xudc_set_clear_feature(struct xusb_udc *udc)
+       case USB_RECIP_ENDPOINT:
+               if (!udc->setup.wValue) {
+                       endpoint = udc->setup.wIndex & USB_ENDPOINT_NUMBER_MASK;
++                      if (endpoint >= XUSB_MAX_ENDPOINTS) {
++                              xudc_ep0_stall(udc);
++                              return;
++                      }
+                       target_ep = &udc->ep[endpoint];
+                       outinbit = udc->setup.wIndex & USB_ENDPOINT_DIR_MASK;
+                       outinbit = outinbit >> 7;
+diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
+index 325eb1609f8c5..49f74299d3f57 100644
+--- a/drivers/usb/host/xhci.c
++++ b/drivers/usb/host/xhci.c
+@@ -1091,6 +1091,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
+       int                     retval = 0;
+       bool                    comp_timer_running = false;
+       bool                    pending_portevent = false;
++      bool                    reinit_xhc = false;
+ 
+       if (!hcd->state)
+               return 0;
+@@ -1107,10 +1108,11 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
+       set_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags);
+ 
+       spin_lock_irq(&xhci->lock);
+-      if ((xhci->quirks & XHCI_RESET_ON_RESUME) || xhci->broken_suspend)
+-              hibernated = true;
+ 
+-      if (!hibernated) {
++      if (hibernated || xhci->quirks & XHCI_RESET_ON_RESUME || 
xhci->broken_suspend)
++              reinit_xhc = true;
++
++      if (!reinit_xhc) {
+               /*
+                * Some controllers might lose power during suspend, so wait
+                * for controller not ready bit to clear, just as in xHC init.
+@@ -1143,12 +1145,17 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
+                       spin_unlock_irq(&xhci->lock);
+                       return -ETIMEDOUT;
+               }
+-              temp = readl(&xhci->op_regs->status);
+       }
+ 
+-      /* If restore operation fails, re-initialize the HC during resume */
+-      if ((temp & STS_SRE) || hibernated) {
++      temp = readl(&xhci->op_regs->status);
+ 
++      /* re-initialize the HC on Restore Error, or Host Controller Error */
++      if (temp & (STS_SRE | STS_HCE)) {
++              reinit_xhc = true;
++              xhci_warn(xhci, "xHC error in resume, USBSTS 0x%x, Reinit\n", 
temp);
++      }
++
++      if (reinit_xhc) {
+               if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
+                               !(xhci_all_ports_seen_u0(xhci))) {
+                       del_timer_sync(&xhci->comp_mode_recovery_timer);
+@@ -1480,9 +1487,12 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct 
urb *urb, gfp_t mem_flag
+       struct urb_priv *urb_priv;
+       int num_tds;
+ 
+-      if (!urb || xhci_check_args(hcd, urb->dev, urb->ep,
+-                                      true, true, __func__) <= 0)
++      if (!urb)
+               return -EINVAL;
++      ret = xhci_check_args(hcd, urb->dev, urb->ep,
++                                      true, true, __func__);
++      if (ret <= 0)
++              return ret ? ret : -EINVAL;
+ 
+       slot_id = urb->dev->slot_id;
+       ep_index = xhci_get_endpoint_index(&urb->ep->desc);
+@@ -3282,7 +3292,7 @@ static int xhci_check_streams_endpoint(struct xhci_hcd 
*xhci,
+               return -EINVAL;
+       ret = xhci_check_args(xhci_to_hcd(xhci), udev, ep, 1, true, __func__);
+       if (ret <= 0)
+-              return -EINVAL;
++              return ret ? ret : -EINVAL;
+       if (usb_ss_max_streams(&ep->ss_ep_comp) == 0) {
+               xhci_warn(xhci, "WARN: SuperSpeed Endpoint Companion"
+                               " descriptor for ep 0x%x does not support 
streams\n",
+diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c
+index 8716ada0b1387..a2a38fc76ca53 100644
+--- a/drivers/usb/serial/ch341.c
++++ b/drivers/usb/serial/ch341.c
+@@ -81,7 +81,6 @@
+ #define CH341_QUIRK_SIMULATE_BREAK    BIT(1)
+ 
+ static const struct usb_device_id id_table[] = {
+-      { USB_DEVICE(0x1a86, 0x5512) },
+       { USB_DEVICE(0x1a86, 0x5523) },
+       { USB_DEVICE(0x1a86, 0x7522) },
+       { USB_DEVICE(0x1a86, 0x7523) },
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index c39c505b081b1..b878f4c87fee8 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -198,6 +198,8 @@ static void option_instat_callback(struct urb *urb);
+ 
+ #define DELL_PRODUCT_5821E                    0x81d7
+ #define DELL_PRODUCT_5821E_ESIM                       0x81e0
++#define DELL_PRODUCT_5829E_ESIM                       0x81e4
++#define DELL_PRODUCT_5829E                    0x81e6
+ 
+ #define KYOCERA_VENDOR_ID                     0x0c88
+ #define KYOCERA_PRODUCT_KPC650                        0x17da
+@@ -1063,6 +1065,10 @@ static const struct usb_device_id option_ids[] = {
+         .driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
+       { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5821E_ESIM),
+         .driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E),
++        .driver_info = RSVD(0) | RSVD(6) },
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E_ESIM),
++        .driver_info = RSVD(0) | RSVD(6) },
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },   /* 
ADU-E100, ADU-310 */
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
+@@ -1273,10 +1279,16 @@ static const struct usb_device_id option_ids[] = {
+         .driver_info = NCTRL(2) },
+       { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x7011, 0xff),    /* 
Telit LE910-S1 (ECM) */
+         .driver_info = NCTRL(2) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x701a, 0xff),    /* 
Telit LE910R1 (RNDIS) */
++        .driver_info = NCTRL(2) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x701b, 0xff),    /* 
Telit LE910R1 (ECM) */
++        .driver_info = NCTRL(2) },
+       { USB_DEVICE(TELIT_VENDOR_ID, 0x9010),                          /* 
Telit SBL FN980 flashing device */
+         .driver_info = NCTRL(0) | ZLP },
+       { USB_DEVICE(TELIT_VENDOR_ID, 0x9200),                          /* 
Telit LE910S1 flashing device */
+         .driver_info = NCTRL(0) | ZLP },
++      { USB_DEVICE(TELIT_VENDOR_ID, 0x9201),                          /* 
Telit LE910R1 flashing device */
++        .driver_info = NCTRL(0) | ZLP },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 
0xff, 0xff) }, /* ZTE WCDMA products */
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 
0xff),
+         .driver_info = RSVD(1) },
+diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
+index 5cd1ee66d2326..c282fc0d04bd1 100644
+--- a/drivers/vhost/vsock.c
++++ b/drivers/vhost/vsock.c
+@@ -573,16 +573,18 @@ err:
+       return ret;
+ }
+ 
+-static int vhost_vsock_stop(struct vhost_vsock *vsock)
++static int vhost_vsock_stop(struct vhost_vsock *vsock, bool check_owner)
+ {
+       size_t i;
+-      int ret;
++      int ret = 0;
+ 
+       mutex_lock(&vsock->dev.mutex);
+ 
+-      ret = vhost_dev_check_owner(&vsock->dev);
+-      if (ret)
+-              goto err;
++      if (check_owner) {
++              ret = vhost_dev_check_owner(&vsock->dev);
++              if (ret)
++                      goto err;
++      }
+ 
+       for (i = 0; i < ARRAY_SIZE(vsock->vqs); i++) {
+               struct vhost_virtqueue *vq = &vsock->vqs[i];
+@@ -697,7 +699,12 @@ static int vhost_vsock_dev_release(struct inode *inode, 
struct file *file)
+        * inefficient.  Room for improvement here. */
+       vsock_for_each_connected_socket(vhost_vsock_reset_orphans);
+ 
+-      vhost_vsock_stop(vsock);
++      /* Don't check the owner, because we are in the release path, so we
++       * need to stop the vsock device in any case.
++       * vhost_vsock_stop() can not fail in this case, so we don't need to
++       * check the return code.
++       */
++      vhost_vsock_stop(vsock, false);
+       vhost_vsock_flush(vsock);
+       vhost_dev_stop(&vsock->dev);
+ 
+@@ -801,7 +808,7 @@ static long vhost_vsock_dev_ioctl(struct file *f, unsigned 
int ioctl,
+               if (start)
+                       return vhost_vsock_start(vsock);
+               else
+-                      return vhost_vsock_stop(vsock);
++                      return vhost_vsock_stop(vsock, true);
+       case VHOST_GET_FEATURES:
+               features = VHOST_VSOCK_FEATURES;
+               if (copy_to_user(argp, &features, sizeof(features)))
+diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c
+index d4a3a56726aa8..32f1b15b25dcc 100644
+--- a/fs/btrfs/tree-checker.c
++++ b/fs/btrfs/tree-checker.c
+@@ -947,6 +947,7 @@ static int check_dev_item(struct extent_buffer *leaf,
+                         struct btrfs_key *key, int slot)
+ {
+       struct btrfs_dev_item *ditem;
++      const u32 item_size = btrfs_item_size_nr(leaf, slot);
+ 
+       if (key->objectid != BTRFS_DEV_ITEMS_OBJECTID) {
+               dev_item_err(leaf, slot,
+@@ -954,6 +955,13 @@ static int check_dev_item(struct extent_buffer *leaf,
+                            key->objectid, BTRFS_DEV_ITEMS_OBJECTID);
+               return -EUCLEAN;
+       }
++
++      if (unlikely(item_size != sizeof(*ditem))) {
++              dev_item_err(leaf, slot, "invalid item size: has %u expect %zu",
++                           item_size, sizeof(*ditem));
++              return -EUCLEAN;
++      }
++
+       ditem = btrfs_item_ptr(leaf, slot, struct btrfs_dev_item);
+       if (btrfs_device_id(leaf, ditem) != key->offset) {
+               dev_item_err(leaf, slot,
+@@ -989,6 +997,7 @@ static int check_inode_item(struct extent_buffer *leaf,
+       struct btrfs_inode_item *iitem;
+       u64 super_gen = btrfs_super_generation(fs_info->super_copy);
+       u32 valid_mask = (S_IFMT | S_ISUID | S_ISGID | S_ISVTX | 0777);
++      const u32 item_size = btrfs_item_size_nr(leaf, slot);
+       u32 mode;
+       int ret;
+ 
+@@ -996,6 +1005,12 @@ static int check_inode_item(struct extent_buffer *leaf,
+       if (ret < 0)
+               return ret;
+ 
++      if (unlikely(item_size != sizeof(*iitem))) {
++              generic_err(leaf, slot, "invalid item size: has %u expect %zu",
++                          item_size, sizeof(*iitem));
++              return -EUCLEAN;
++      }
++
+       iitem = btrfs_item_ptr(leaf, slot, struct btrfs_inode_item);
+ 
+       /* Here we use super block generation + 1 to handle log tree */
+diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c
+index 32ddad3ec5d53..5ad27e484014f 100644
+--- a/fs/configfs/dir.c
++++ b/fs/configfs/dir.c
+@@ -36,6 +36,14 @@
+  */
+ DEFINE_SPINLOCK(configfs_dirent_lock);
+ 
++/*
++ * All of link_obj/unlink_obj/link_group/unlink_group require that
++ * subsys->su_mutex is held.
++ * But parent configfs_subsystem is NULL when config_item is root.
++ * Use this mutex when config_item is root.
++ */
++static DEFINE_MUTEX(configfs_subsystem_mutex);
++
+ static void configfs_d_iput(struct dentry * dentry,
+                           struct inode * inode)
+ {
+@@ -1884,7 +1892,9 @@ int configfs_register_subsystem(struct 
configfs_subsystem *subsys)
+               group->cg_item.ci_name = group->cg_item.ci_namebuf;
+ 
+       sd = root->d_fsdata;
++      mutex_lock(&configfs_subsystem_mutex);
+       link_group(to_config_group(sd->s_element), group);
++      mutex_unlock(&configfs_subsystem_mutex);
+ 
+       inode_lock_nested(d_inode(root), I_MUTEX_PARENT);
+ 
+@@ -1909,7 +1919,9 @@ int configfs_register_subsystem(struct 
configfs_subsystem *subsys)
+       inode_unlock(d_inode(root));
+ 
+       if (err) {
++              mutex_lock(&configfs_subsystem_mutex);
+               unlink_group(group);
++              mutex_unlock(&configfs_subsystem_mutex);
+               configfs_release_fs();
+       }
+       put_fragment(frag);
+@@ -1956,7 +1968,9 @@ void configfs_unregister_subsystem(struct 
configfs_subsystem *subsys)
+ 
+       dput(dentry);
+ 
++      mutex_lock(&configfs_subsystem_mutex);
+       unlink_group(group);
++      mutex_unlock(&configfs_subsystem_mutex);
+       configfs_release_fs();
+ }
+ 
+diff --git a/fs/io_uring.c b/fs/io_uring.c
+index 104dff9c71314..019cbde8c3d67 100644
+--- a/fs/io_uring.c
++++ b/fs/io_uring.c
+@@ -4058,6 +4058,7 @@ static int io_add_buffers(struct io_provide_buf *pbuf, 
struct io_buffer **head)
+               } else {
+                       list_add_tail(&buf->list, &(*head)->list);
+               }
++              cond_resched();
+       }
+ 
+       return i ? i : -ENOMEM;
+diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c
+index ade05887070dd..8b7315c22f0d1 100644
+--- a/fs/tracefs/inode.c
++++ b/fs/tracefs/inode.c
+@@ -262,7 +262,6 @@ static int tracefs_parse_options(char *data, struct 
tracefs_mount_opts *opts)
+                       if (!gid_valid(gid))
+                               return -EINVAL;
+                       opts->gid = gid;
+-                      set_gid(tracefs_mount->mnt_root, gid);
+                       break;
+               case Opt_mode:
+                       if (match_octal(&args[0], &option))
+@@ -289,7 +288,9 @@ static int tracefs_apply_options(struct super_block *sb)
+       inode->i_mode |= opts->mode;
+ 
+       inode->i_uid = opts->uid;
+-      inode->i_gid = opts->gid;
++
++      /* Set all the group ids to the mount option */
++      set_gid(sb->s_root, opts->gid);
+ 
+       return 0;
+ }
+diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h
+index 0c6c1de6f3b77..18a9949bba187 100644
+--- a/include/linux/tee_drv.h
++++ b/include/linux/tee_drv.h
+@@ -582,4 +582,18 @@ struct tee_client_driver {
+ #define to_tee_client_driver(d) \
+               container_of(d, struct tee_client_driver, driver)
+ 
++/**
++ * teedev_open() - Open a struct tee_device
++ * @teedev:   Device to open
++ *
++ * @return a pointer to struct tee_context on success or an ERR_PTR on 
failure.
++ */
++struct tee_context *teedev_open(struct tee_device *teedev);
++
++/**
++ * teedev_close_context() - closes a struct tee_context
++ * @ctx:      The struct tee_context to close
++ */
++void teedev_close_context(struct tee_context *ctx);
++
+ #endif /*__TEE_DRV_H*/
+diff --git a/include/net/checksum.h b/include/net/checksum.h
+index 0d05b9e8690b8..8b7d0c31598f5 100644
+--- a/include/net/checksum.h
++++ b/include/net/checksum.h
+@@ -22,7 +22,7 @@
+ #include <asm/checksum.h>
+ 
+ #ifndef _HAVE_ARCH_COPY_AND_CSUM_FROM_USER
+-static inline
++static __always_inline
+ __wsum csum_and_copy_from_user (const void __user *src, void *dst,
+                                     int len)
+ {
+@@ -33,7 +33,7 @@ __wsum csum_and_copy_from_user (const void __user *src, void 
*dst,
+ #endif
+ 
+ #ifndef HAVE_CSUM_COPY_USER
+-static __inline__ __wsum csum_and_copy_to_user
++static __always_inline __wsum csum_and_copy_to_user
+ (const void *src, void __user *dst, int len)
+ {
+       __wsum sum = csum_partial(src, len, ~0U);
+@@ -45,7 +45,7 @@ static __inline__ __wsum csum_and_copy_to_user
+ #endif
+ 
+ #ifndef _HAVE_ARCH_CSUM_AND_COPY
+-static inline __wsum
++static __always_inline __wsum
+ csum_partial_copy_nocheck(const void *src, void *dst, int len)
+ {
+       memcpy(dst, src, len);
+@@ -54,7 +54,7 @@ csum_partial_copy_nocheck(const void *src, void *dst, int 
len)
+ #endif
+ 
+ #ifndef HAVE_ARCH_CSUM_ADD
+-static inline __wsum csum_add(__wsum csum, __wsum addend)
++static __always_inline __wsum csum_add(__wsum csum, __wsum addend)
+ {
+       u32 res = (__force u32)csum;
+       res += (__force u32)addend;
+@@ -62,12 +62,12 @@ static inline __wsum csum_add(__wsum csum, __wsum addend)
+ }
+ #endif
+ 
+-static inline __wsum csum_sub(__wsum csum, __wsum addend)
++static __always_inline __wsum csum_sub(__wsum csum, __wsum addend)
+ {
+       return csum_add(csum, ~addend);
+ }
+ 
+-static inline __sum16 csum16_add(__sum16 csum, __be16 addend)
++static __always_inline __sum16 csum16_add(__sum16 csum, __be16 addend)
+ {
+       u16 res = (__force u16)csum;
+ 
+@@ -75,12 +75,12 @@ static inline __sum16 csum16_add(__sum16 csum, __be16 
addend)
+       return (__force __sum16)(res + (res < (__force u16)addend));
+ }
+ 
+-static inline __sum16 csum16_sub(__sum16 csum, __be16 addend)
++static __always_inline __sum16 csum16_sub(__sum16 csum, __be16 addend)
+ {
+       return csum16_add(csum, ~addend);
+ }
+ 
+-static inline __wsum
++static __always_inline __wsum
+ csum_block_add(__wsum csum, __wsum csum2, int offset)
+ {
+       u32 sum = (__force u32)csum2;
+@@ -92,36 +92,37 @@ csum_block_add(__wsum csum, __wsum csum2, int offset)
+       return csum_add(csum, (__force __wsum)sum);
+ }
+ 
+-static inline __wsum
++static __always_inline __wsum
+ csum_block_add_ext(__wsum csum, __wsum csum2, int offset, int len)
+ {
+       return csum_block_add(csum, csum2, offset);
+ }
+ 
+-static inline __wsum
++static __always_inline __wsum
+ csum_block_sub(__wsum csum, __wsum csum2, int offset)
+ {
+       return csum_block_add(csum, ~csum2, offset);
+ }
+ 
+-static inline __wsum csum_unfold(__sum16 n)
++static __always_inline __wsum csum_unfold(__sum16 n)
+ {
+       return (__force __wsum)n;
+ }
+ 
+-static inline __wsum csum_partial_ext(const void *buff, int len, __wsum sum)
++static __always_inline
++__wsum csum_partial_ext(const void *buff, int len, __wsum sum)
+ {
+       return csum_partial(buff, len, sum);
+ }
+ 
+ #define CSUM_MANGLED_0 ((__force __sum16)0xffff)
+ 
+-static inline void csum_replace_by_diff(__sum16 *sum, __wsum diff)
++static __always_inline void csum_replace_by_diff(__sum16 *sum, __wsum diff)
+ {
+       *sum = csum_fold(csum_add(diff, ~csum_unfold(*sum)));
+ }
+ 
+-static inline void csum_replace4(__sum16 *sum, __be32 from, __be32 to)
++static __always_inline void csum_replace4(__sum16 *sum, __be32 from, __be32 
to)
+ {
+       __wsum tmp = csum_sub(~csum_unfold(*sum), (__force __wsum)from);
+ 
+@@ -134,11 +135,16 @@ static inline void csum_replace4(__sum16 *sum, __be32 
from, __be32 to)
+  *  m : old value of a 16bit field
+  *  m' : new value of a 16bit field
+  */
+-static inline void csum_replace2(__sum16 *sum, __be16 old, __be16 new)
++static __always_inline void csum_replace2(__sum16 *sum, __be16 old, __be16 
new)
+ {
+       *sum = ~csum16_add(csum16_sub(~(*sum), old), new);
+ }
+ 
++static inline void csum_replace(__wsum *csum, __wsum old, __wsum new)
++{
++      *csum = csum_add(csum_sub(*csum, old), new);
++}
++
+ struct sk_buff;
+ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
+                             __be32 from, __be32 to, bool pseudohdr);
+@@ -148,16 +154,16 @@ void inet_proto_csum_replace16(__sum16 *sum, struct 
sk_buff *skb,
+ void inet_proto_csum_replace_by_diff(__sum16 *sum, struct sk_buff *skb,
+                                    __wsum diff, bool pseudohdr);
+ 
+-static inline void inet_proto_csum_replace2(__sum16 *sum, struct sk_buff *skb,
+-                                          __be16 from, __be16 to,
+-                                          bool pseudohdr)
++static __always_inline
++void inet_proto_csum_replace2(__sum16 *sum, struct sk_buff *skb,
++                            __be16 from, __be16 to, bool pseudohdr)
+ {
+       inet_proto_csum_replace4(sum, skb, (__force __be32)from,
+                                (__force __be32)to, pseudohdr);
+ }
+ 
+-static inline __wsum remcsum_adjust(void *ptr, __wsum csum,
+-                                  int start, int offset)
++static __always_inline __wsum remcsum_adjust(void *ptr, __wsum csum,
++                                           int start, int offset)
+ {
+       __sum16 *psum = (__sum16 *)(ptr + offset);
+       __wsum delta;
+@@ -173,7 +179,7 @@ static inline __wsum remcsum_adjust(void *ptr, __wsum csum,
+       return delta;
+ }
+ 
+-static inline void remcsum_unadjust(__sum16 *psum, __wsum delta)
++static __always_inline void remcsum_unadjust(__sum16 *psum, __wsum delta)
+ {
+       *psum = csum_fold(csum_sub(delta, (__force __wsum)*psum));
+ }
+diff --git a/include/net/netfilter/nf_tables.h 
b/include/net/netfilter/nf_tables.h
+index ed4a9d098164f..76bfb6cd5815d 100644
+--- a/include/net/netfilter/nf_tables.h
++++ b/include/net/netfilter/nf_tables.h
+@@ -825,7 +825,7 @@ struct nft_expr_ops {
+       int                             (*offload)(struct nft_offload_ctx *ctx,
+                                                  struct nft_flow_rule *flow,
+                                                  const struct nft_expr *expr);
+-      u32                             offload_flags;
++      bool                            (*offload_action)(const struct nft_expr 
*expr);
+       const struct nft_expr_type      *type;
+       void                            *data;
+ };
+diff --git a/include/net/netfilter/nf_tables_offload.h 
b/include/net/netfilter/nf_tables_offload.h
+index 434a6158852f3..7a453a35a41dd 100644
+--- a/include/net/netfilter/nf_tables_offload.h
++++ b/include/net/netfilter/nf_tables_offload.h
+@@ -67,8 +67,6 @@ struct nft_flow_rule {
+       struct flow_rule        *rule;
+ };
+ 
+-#define NFT_OFFLOAD_F_ACTION  (1 << 0)
+-
+ void nft_flow_rule_set_addr_type(struct nft_flow_rule *flow,
+                                enum flow_dissector_key_id addr_type);
+ 
+diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
+index 209e6567cdab0..419dbc3d060ee 100644
+--- a/kernel/bpf/syscall.c
++++ b/kernel/bpf/syscall.c
+@@ -1308,6 +1308,7 @@ int generic_map_delete_batch(struct bpf_map *map,
+               maybe_wait_bpf_programs(map);
+               if (err)
+                       break;
++              cond_resched();
+       }
+       if (copy_to_user(&uattr->batch.count, &cp, sizeof(cp)))
+               err = -EFAULT;
+@@ -1365,6 +1366,7 @@ int generic_map_update_batch(struct bpf_map *map,
+ 
+               if (err)
+                       break;
++              cond_resched();
+       }
+ 
+       if (copy_to_user(&uattr->batch.count, &cp, sizeof(cp)))
+@@ -1462,6 +1464,7 @@ int generic_map_lookup_batch(struct bpf_map *map,
+               swap(prev_key, key);
+               retry = MAP_LOOKUP_RETRIES;
+               cp++;
++              cond_resched();
+       }
+ 
+       if (err == -EFAULT)
+diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
+index ef6b3a7f31c17..0aa224c31f10a 100644
+--- a/kernel/cgroup/cpuset.c
++++ b/kernel/cgroup/cpuset.c
+@@ -2212,6 +2212,7 @@ static void cpuset_attach(struct cgroup_taskset *tset)
+       cgroup_taskset_first(tset, &css);
+       cs = css_cs(css);
+ 
++      cpus_read_lock();
+       percpu_down_write(&cpuset_rwsem);
+ 
+       /* prepare for attach */
+@@ -2267,6 +2268,7 @@ static void cpuset_attach(struct cgroup_taskset *tset)
+               wake_up(&cpuset_attach_wq);
+ 
+       percpu_up_write(&cpuset_rwsem);
++      cpus_read_unlock();
+ }
+ 
+ /* The various types of files and directories in a cpuset file system */
+diff --git a/kernel/trace/trace_events_trigger.c 
b/kernel/trace/trace_events_trigger.c
+index f725802160c0b..d0309de2f84fe 100644
+--- a/kernel/trace/trace_events_trigger.c
++++ b/kernel/trace/trace_events_trigger.c
+@@ -940,6 +940,16 @@ static void
+ traceon_trigger(struct event_trigger_data *data, void *rec,
+               struct ring_buffer_event *event)
+ {
++      struct trace_event_file *file = data->private_data;
++
++      if (file) {
++              if (tracer_tracing_is_on(file->tr))
++                      return;
++
++              tracer_tracing_on(file->tr);
++              return;
++      }
++
+       if (tracing_is_on())
+               return;
+ 
+@@ -950,8 +960,15 @@ static void
+ traceon_count_trigger(struct event_trigger_data *data, void *rec,
+                     struct ring_buffer_event *event)
+ {
+-      if (tracing_is_on())
+-              return;
++      struct trace_event_file *file = data->private_data;
++
++      if (file) {
++              if (tracer_tracing_is_on(file->tr))
++                      return;
++      } else {
++              if (tracing_is_on())
++                      return;
++      }
+ 
+       if (!data->count)
+               return;
+@@ -959,13 +976,26 @@ traceon_count_trigger(struct event_trigger_data *data, 
void *rec,
+       if (data->count != -1)
+               (data->count)--;
+ 
+-      tracing_on();
++      if (file)
++              tracer_tracing_on(file->tr);
++      else
++              tracing_on();
+ }
+ 
+ static void
+ traceoff_trigger(struct event_trigger_data *data, void *rec,
+                struct ring_buffer_event *event)
+ {
++      struct trace_event_file *file = data->private_data;
++
++      if (file) {
++              if (!tracer_tracing_is_on(file->tr))
++                      return;
++
++              tracer_tracing_off(file->tr);
++              return;
++      }
++
+       if (!tracing_is_on())
+               return;
+ 
+@@ -976,8 +1006,15 @@ static void
+ traceoff_count_trigger(struct event_trigger_data *data, void *rec,
+                      struct ring_buffer_event *event)
+ {
+-      if (!tracing_is_on())
+-              return;
++      struct trace_event_file *file = data->private_data;
++
++      if (file) {
++              if (!tracer_tracing_is_on(file->tr))
++                      return;
++      } else {
++              if (!tracing_is_on())
++                      return;
++      }
+ 
+       if (!data->count)
+               return;
+@@ -985,7 +1022,10 @@ traceoff_count_trigger(struct event_trigger_data *data, 
void *rec,
+       if (data->count != -1)
+               (data->count)--;
+ 
+-      tracing_off();
++      if (file)
++              tracer_tracing_off(file->tr);
++      else
++              tracing_off();
+ }
+ 
+ static int
+diff --git a/mm/memblock.c b/mm/memblock.c
+index faa4de579b3db..f72d539570339 100644
+--- a/mm/memblock.c
++++ b/mm/memblock.c
+@@ -366,14 +366,20 @@ void __init memblock_discard(void)
+               addr = __pa(memblock.reserved.regions);
+               size = PAGE_ALIGN(sizeof(struct memblock_region) *
+                                 memblock.reserved.max);
+-              __memblock_free_late(addr, size);
++              if (memblock_reserved_in_slab)
++                      kfree(memblock.reserved.regions);
++              else
++                      __memblock_free_late(addr, size);
+       }
+ 
+       if (memblock.memory.regions != memblock_memory_init_regions) {
+               addr = __pa(memblock.memory.regions);
+               size = PAGE_ALIGN(sizeof(struct memblock_region) *
+                                 memblock.memory.max);
+-              __memblock_free_late(addr, size);
++              if (memblock_memory_in_slab)
++                      kfree(memblock.memory.regions);
++              else
++                      __memblock_free_late(addr, size);
+       }
+ 
+       memblock_memory = NULL;
+diff --git a/net/core/filter.c b/net/core/filter.c
+index 7fa4283f2a8c0..659a328024713 100644
+--- a/net/core/filter.c
++++ b/net/core/filter.c
+@@ -2730,6 +2730,9 @@ BPF_CALL_4(bpf_msg_push_data, struct sk_msg *, msg, u32, 
start,
+       if (unlikely(flags))
+               return -EINVAL;
+ 
++      if (unlikely(len == 0))
++              return 0;
++
+       /* First find the starting scatterlist element */
+       i = msg->sg.start;
+       do {
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index 0215ae898e836..fccc42c8ca0c7 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -2139,7 +2139,7 @@ void *__pskb_pull_tail(struct sk_buff *skb, int delta)
+               /* Free pulled out fragments. */
+               while ((list = skb_shinfo(skb)->frag_list) != insp) {
+                       skb_shinfo(skb)->frag_list = list->next;
+-                      kfree_skb(list);
++                      consume_skb(list);
+               }
+               /* And insert new clone at head. */
+               if (clone) {
+@@ -6044,7 +6044,7 @@ static int pskb_carve_frag_list(struct sk_buff *skb,
+       /* Free pulled out fragments. */
+       while ((list = shinfo->frag_list) != insp) {
+               shinfo->frag_list = list->next;
+-              kfree_skb(list);
++              consume_skb(list);
+       }
+       /* And insert new clone at head. */
+       if (clone) {
+diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
+index e2f85a16fad9b..742218594741a 100644
+--- a/net/ipv4/af_inet.c
++++ b/net/ipv4/af_inet.c
+@@ -1374,8 +1374,11 @@ struct sk_buff *inet_gso_segment(struct sk_buff *skb,
+       }
+ 
+       ops = rcu_dereference(inet_offloads[proto]);
+-      if (likely(ops && ops->callbacks.gso_segment))
++      if (likely(ops && ops->callbacks.gso_segment)) {
+               segs = ops->callbacks.gso_segment(skb, features);
++              if (!segs)
++                      skb->network_header = skb_mac_header(skb) + nhoff - 
skb->head;
++      }
+ 
+       if (IS_ERR_OR_NULL(segs))
+               goto out;
+diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
+index 323cb231cb580..e60ca03543a53 100644
+--- a/net/ipv4/ping.c
++++ b/net/ipv4/ping.c
+@@ -187,7 +187,6 @@ static struct sock *ping_lookup(struct net *net, struct 
sk_buff *skb, u16 ident)
+                        (int)ident, &ipv6_hdr(skb)->daddr, dif);
+ #endif
+       } else {
+-              pr_err("ping: protocol(%x) is not supported\n", 
ntohs(skb->protocol));
+               return NULL;
+       }
+ 
+diff --git a/net/ipv4/udp_tunnel_nic.c b/net/ipv4/udp_tunnel_nic.c
+index b91003538d87a..bc3a043a5d5c7 100644
+--- a/net/ipv4/udp_tunnel_nic.c
++++ b/net/ipv4/udp_tunnel_nic.c
+@@ -846,7 +846,7 @@ udp_tunnel_nic_unregister(struct net_device *dev, struct 
udp_tunnel_nic *utn)
+               list_for_each_entry(node, &info->shared->devices, list)
+                       if (node->dev == dev)
+                               break;
+-              if (node->dev != dev)
++              if (list_entry_is_head(node, &info->shared->devices, list))
+                       return;
+ 
+               list_del(&node->list);
+diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c
+index a80f90bf3ae7d..15c8eef1ef443 100644
+--- a/net/ipv6/ip6_offload.c
++++ b/net/ipv6/ip6_offload.c
+@@ -113,6 +113,8 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff 
*skb,
+       if (likely(ops && ops->callbacks.gso_segment)) {
+               skb_reset_transport_header(skb);
+               segs = ops->callbacks.gso_segment(skb, features);
++              if (!segs)
++                      skb->network_header = skb_mac_header(skb) + nhoff - 
skb->head;
+       }
+ 
+       if (IS_ERR_OR_NULL(segs))
+diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
+index b781ba97c474e..fdd1da9ecea9e 100644
+--- a/net/netfilter/nf_tables_api.c
++++ b/net/netfilter/nf_tables_api.c
+@@ -5924,12 +5924,15 @@ static int nf_tables_updobj(const struct nft_ctx *ctx,
+ {
+       struct nft_object *newobj;
+       struct nft_trans *trans;
+-      int err;
++      int err = -ENOMEM;
++
++      if (!try_module_get(type->owner))
++              return -ENOENT;
+ 
+       trans = nft_trans_alloc(ctx, NFT_MSG_NEWOBJ,
+                               sizeof(struct nft_trans_obj));
+       if (!trans)
+-              return -ENOMEM;
++              goto err_trans;
+ 
+       newobj = nft_obj_init(ctx, type, attr);
+       if (IS_ERR(newobj)) {
+@@ -5946,6 +5949,8 @@ static int nf_tables_updobj(const struct nft_ctx *ctx,
+ 
+ err_free_trans:
+       kfree(trans);
++err_trans:
++      module_put(type->owner);
+       return err;
+ }
+ 
+@@ -7555,7 +7560,7 @@ static void nft_obj_commit_update(struct nft_trans 
*trans)
+       if (obj->ops->update)
+               obj->ops->update(obj, newobj);
+ 
+-      kfree(newobj);
++      nft_obj_destroy(&trans->ctx, newobj);
+ }
+ 
+ static void nft_commit_release(struct nft_trans *trans)
+@@ -8202,7 +8207,7 @@ static int __nf_tables_abort(struct net *net, enum 
nfnl_abort_action action)
+                       break;
+               case NFT_MSG_NEWOBJ:
+                       if (nft_trans_obj_update(trans)) {
+-                              kfree(nft_trans_obj_newobj(trans));
++                              nft_obj_destroy(&trans->ctx, 
nft_trans_obj_newobj(trans));
+                               nft_trans_destroy(trans);
+                       } else {
+                               trans->ctx.table->use--;
+diff --git a/net/netfilter/nf_tables_offload.c 
b/net/netfilter/nf_tables_offload.c
+index e5fcbb0e4b8e5..839fd09f1bb4a 100644
+--- a/net/netfilter/nf_tables_offload.c
++++ b/net/netfilter/nf_tables_offload.c
+@@ -94,7 +94,8 @@ struct nft_flow_rule *nft_flow_rule_create(struct net *net,
+ 
+       expr = nft_expr_first(rule);
+       while (nft_expr_more(rule, expr)) {
+-              if (expr->ops->offload_flags & NFT_OFFLOAD_F_ACTION)
++              if (expr->ops->offload_action &&
++                  expr->ops->offload_action(expr))
+                       num_actions++;
+ 
+               expr = nft_expr_next(expr);
+diff --git a/net/netfilter/nft_dup_netdev.c b/net/netfilter/nft_dup_netdev.c
+index 40788b3f1071a..70c457476b874 100644
+--- a/net/netfilter/nft_dup_netdev.c
++++ b/net/netfilter/nft_dup_netdev.c
+@@ -67,6 +67,11 @@ static int nft_dup_netdev_offload(struct nft_offload_ctx 
*ctx,
+       return nft_fwd_dup_netdev_offload(ctx, flow, FLOW_ACTION_MIRRED, oif);
+ }
+ 
++static bool nft_dup_netdev_offload_action(const struct nft_expr *expr)
++{
++      return true;
++}
++
+ static struct nft_expr_type nft_dup_netdev_type;
+ static const struct nft_expr_ops nft_dup_netdev_ops = {
+       .type           = &nft_dup_netdev_type,
+@@ -75,6 +80,7 @@ static const struct nft_expr_ops nft_dup_netdev_ops = {
+       .init           = nft_dup_netdev_init,
+       .dump           = nft_dup_netdev_dump,
+       .offload        = nft_dup_netdev_offload,
++      .offload_action = nft_dup_netdev_offload_action,
+ };
+ 
+ static struct nft_expr_type nft_dup_netdev_type __read_mostly = {
+diff --git a/net/netfilter/nft_fwd_netdev.c b/net/netfilter/nft_fwd_netdev.c
+index b77985986b24e..3b0dcd170551b 100644
+--- a/net/netfilter/nft_fwd_netdev.c
++++ b/net/netfilter/nft_fwd_netdev.c
+@@ -77,6 +77,11 @@ static int nft_fwd_netdev_offload(struct nft_offload_ctx 
*ctx,
+       return nft_fwd_dup_netdev_offload(ctx, flow, FLOW_ACTION_REDIRECT, oif);
+ }
+ 
++static bool nft_fwd_netdev_offload_action(const struct nft_expr *expr)
++{
++      return true;
++}
++
+ struct nft_fwd_neigh {
+       enum nft_registers      sreg_dev:8;
+       enum nft_registers      sreg_addr:8;
+@@ -219,6 +224,7 @@ static const struct nft_expr_ops nft_fwd_netdev_ops = {
+       .dump           = nft_fwd_netdev_dump,
+       .validate       = nft_fwd_validate,
+       .offload        = nft_fwd_netdev_offload,
++      .offload_action = nft_fwd_netdev_offload_action,
+ };
+ 
+ static const struct nft_expr_ops *
+diff --git a/net/netfilter/nft_immediate.c b/net/netfilter/nft_immediate.c
+index c63eb3b171784..5c9d88560a474 100644
+--- a/net/netfilter/nft_immediate.c
++++ b/net/netfilter/nft_immediate.c
+@@ -213,6 +213,16 @@ static int nft_immediate_offload(struct nft_offload_ctx 
*ctx,
+       return 0;
+ }
+ 
++static bool nft_immediate_offload_action(const struct nft_expr *expr)
++{
++      const struct nft_immediate_expr *priv = nft_expr_priv(expr);
++
++      if (priv->dreg == NFT_REG_VERDICT)
++              return true;
++
++      return false;
++}
++
+ static const struct nft_expr_ops nft_imm_ops = {
+       .type           = &nft_imm_type,
+       .size           = NFT_EXPR_SIZE(sizeof(struct nft_immediate_expr)),
+@@ -224,7 +234,7 @@ static const struct nft_expr_ops nft_imm_ops = {
+       .dump           = nft_immediate_dump,
+       .validate       = nft_immediate_validate,
+       .offload        = nft_immediate_offload,
+-      .offload_flags  = NFT_OFFLOAD_F_ACTION,
++      .offload_action = nft_immediate_offload_action,
+ };
+ 
+ struct nft_expr_type nft_imm_type __read_mostly = {
+diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
+index fc487f9812fc5..525c1540f10e6 100644
+--- a/net/openvswitch/actions.c
++++ b/net/openvswitch/actions.c
+@@ -422,12 +422,43 @@ static void set_ipv6_addr(struct sk_buff *skb, u8 
l4_proto,
+       memcpy(addr, new_addr, sizeof(__be32[4]));
+ }
+ 
+-static void set_ipv6_fl(struct ipv6hdr *nh, u32 fl, u32 mask)
++static void set_ipv6_dsfield(struct sk_buff *skb, struct ipv6hdr *nh, u8 
ipv6_tclass, u8 mask)
+ {
++      u8 old_ipv6_tclass = ipv6_get_dsfield(nh);
++
++      ipv6_tclass = OVS_MASKED(old_ipv6_tclass, ipv6_tclass, mask);
++
++      if (skb->ip_summed == CHECKSUM_COMPLETE)
++              csum_replace(&skb->csum, (__force __wsum)(old_ipv6_tclass << 
12),
++                           (__force __wsum)(ipv6_tclass << 12));
++
++      ipv6_change_dsfield(nh, ~mask, ipv6_tclass);
++}
++
++static void set_ipv6_fl(struct sk_buff *skb, struct ipv6hdr *nh, u32 fl, u32 
mask)
++{
++      u32 ofl;
++
++      ofl = nh->flow_lbl[0] << 16 |  nh->flow_lbl[1] << 8 |  nh->flow_lbl[2];
++      fl = OVS_MASKED(ofl, fl, mask);
++
+       /* Bits 21-24 are always unmasked, so this retains their values. */
+-      OVS_SET_MASKED(nh->flow_lbl[0], (u8)(fl >> 16), (u8)(mask >> 16));
+-      OVS_SET_MASKED(nh->flow_lbl[1], (u8)(fl >> 8), (u8)(mask >> 8));
+-      OVS_SET_MASKED(nh->flow_lbl[2], (u8)fl, (u8)mask);
++      nh->flow_lbl[0] = (u8)(fl >> 16);
++      nh->flow_lbl[1] = (u8)(fl >> 8);
++      nh->flow_lbl[2] = (u8)fl;
++
++      if (skb->ip_summed == CHECKSUM_COMPLETE)
++              csum_replace(&skb->csum, (__force __wsum)htonl(ofl), (__force 
__wsum)htonl(fl));
++}
++
++static void set_ipv6_ttl(struct sk_buff *skb, struct ipv6hdr *nh, u8 new_ttl, 
u8 mask)
++{
++      new_ttl = OVS_MASKED(nh->hop_limit, new_ttl, mask);
++
++      if (skb->ip_summed == CHECKSUM_COMPLETE)
++              csum_replace(&skb->csum, (__force __wsum)(nh->hop_limit << 8),
++                           (__force __wsum)(new_ttl << 8));
++      nh->hop_limit = new_ttl;
+ }
+ 
+ static void set_ip_ttl(struct sk_buff *skb, struct iphdr *nh, u8 new_ttl,
+@@ -545,18 +576,17 @@ static int set_ipv6(struct sk_buff *skb, struct 
sw_flow_key *flow_key,
+               }
+       }
+       if (mask->ipv6_tclass) {
+-              ipv6_change_dsfield(nh, ~mask->ipv6_tclass, key->ipv6_tclass);
++              set_ipv6_dsfield(skb, nh, key->ipv6_tclass, mask->ipv6_tclass);
+               flow_key->ip.tos = ipv6_get_dsfield(nh);
+       }
+       if (mask->ipv6_label) {
+-              set_ipv6_fl(nh, ntohl(key->ipv6_label),
++              set_ipv6_fl(skb, nh, ntohl(key->ipv6_label),
+                           ntohl(mask->ipv6_label));
+               flow_key->ipv6.label =
+                   *(__be32 *)nh & htonl(IPV6_FLOWINFO_FLOWLABEL);
+       }
+       if (mask->ipv6_hlimit) {
+-              OVS_SET_MASKED(nh->hop_limit, key->ipv6_hlimit,
+-                             mask->ipv6_hlimit);
++              set_ipv6_ttl(skb, nh, key->ipv6_hlimit, mask->ipv6_hlimit);
+               flow_key->ip.ttl = nh->hop_limit;
+       }
+       return 0;
+diff --git a/net/sched/act_ct.c b/net/sched/act_ct.c
+index 812c3c70a53a0..825b3e9b55f7e 100644
+--- a/net/sched/act_ct.c
++++ b/net/sched/act_ct.c
+@@ -514,11 +514,6 @@ static bool tcf_ct_flow_table_lookup(struct tcf_ct_params 
*p,
+       struct nf_conn *ct;
+       u8 dir;
+ 
+-      /* Previously seen or loopback */
+-      ct = nf_ct_get(skb, &ctinfo);
+-      if ((ct && !nf_ct_is_template(ct)) || ctinfo == IP_CT_UNTRACKED)
+-              return false;
+-
+       switch (family) {
+       case NFPROTO_IPV4:
+               if (!tcf_ct_flow_table_fill_tuple_ipv4(skb, &tuple, &tcph))
+diff --git a/net/smc/smc_pnet.c b/net/smc/smc_pnet.c
+index f3c18b991d35c..9007c7e3bae4e 100644
+--- a/net/smc/smc_pnet.c
++++ b/net/smc/smc_pnet.c
+@@ -112,7 +112,7 @@ static int smc_pnet_remove_by_pnetid(struct net *net, char 
*pnet_name)
+       pnettable = &sn->pnettable;
+ 
+       /* remove table entry */
+-      write_lock(&pnettable->lock);
++      mutex_lock(&pnettable->lock);
+       list_for_each_entry_safe(pnetelem, tmp_pe, &pnettable->pnetlist,
+                                list) {
+               if (!pnet_name ||
+@@ -130,7 +130,7 @@ static int smc_pnet_remove_by_pnetid(struct net *net, char 
*pnet_name)
+                       rc = 0;
+               }
+       }
+-      write_unlock(&pnettable->lock);
++      mutex_unlock(&pnettable->lock);
+ 
+       /* if this is not the initial namespace, stop here */
+       if (net != &init_net)
+@@ -191,7 +191,7 @@ static int smc_pnet_add_by_ndev(struct net_device *ndev)
+       sn = net_generic(net, smc_net_id);
+       pnettable = &sn->pnettable;
+ 
+-      write_lock(&pnettable->lock);
++      mutex_lock(&pnettable->lock);
+       list_for_each_entry_safe(pnetelem, tmp_pe, &pnettable->pnetlist, list) {
+               if (pnetelem->type == SMC_PNET_ETH && !pnetelem->ndev &&
+                   !strncmp(pnetelem->eth_name, ndev->name, IFNAMSIZ)) {
+@@ -205,7 +205,7 @@ static int smc_pnet_add_by_ndev(struct net_device *ndev)
+                       break;
+               }
+       }
+-      write_unlock(&pnettable->lock);
++      mutex_unlock(&pnettable->lock);
+       return rc;
+ }
+ 
+@@ -223,7 +223,7 @@ static int smc_pnet_remove_by_ndev(struct net_device *ndev)
+       sn = net_generic(net, smc_net_id);
+       pnettable = &sn->pnettable;
+ 
+-      write_lock(&pnettable->lock);
++      mutex_lock(&pnettable->lock);
+       list_for_each_entry_safe(pnetelem, tmp_pe, &pnettable->pnetlist, list) {
+               if (pnetelem->type == SMC_PNET_ETH && pnetelem->ndev == ndev) {
+                       dev_put(pnetelem->ndev);
+@@ -236,7 +236,7 @@ static int smc_pnet_remove_by_ndev(struct net_device *ndev)
+                       break;
+               }
+       }
+-      write_unlock(&pnettable->lock);
++      mutex_unlock(&pnettable->lock);
+       return rc;
+ }
+ 
+@@ -371,7 +371,7 @@ static int smc_pnet_add_eth(struct smc_pnettable 
*pnettable, struct net *net,
+ 
+       rc = -EEXIST;
+       new_netdev = true;
+-      write_lock(&pnettable->lock);
++      mutex_lock(&pnettable->lock);
+       list_for_each_entry(tmp_pe, &pnettable->pnetlist, list) {
+               if (tmp_pe->type == SMC_PNET_ETH &&
+                   !strncmp(tmp_pe->eth_name, eth_name, IFNAMSIZ)) {
+@@ -381,9 +381,9 @@ static int smc_pnet_add_eth(struct smc_pnettable 
*pnettable, struct net *net,
+       }
+       if (new_netdev) {
+               list_add_tail(&new_pe->list, &pnettable->pnetlist);
+-              write_unlock(&pnettable->lock);
++              mutex_unlock(&pnettable->lock);
+       } else {
+-              write_unlock(&pnettable->lock);
++              mutex_unlock(&pnettable->lock);
+               kfree(new_pe);
+               goto out_put;
+       }
+@@ -445,7 +445,7 @@ static int smc_pnet_add_ib(struct smc_pnettable 
*pnettable, char *ib_name,
+       new_pe->ib_port = ib_port;
+ 
+       new_ibdev = true;
+-      write_lock(&pnettable->lock);
++      mutex_lock(&pnettable->lock);
+       list_for_each_entry(tmp_pe, &pnettable->pnetlist, list) {
+               if (tmp_pe->type == SMC_PNET_IB &&
+                   !strncmp(tmp_pe->ib_name, ib_name, IB_DEVICE_NAME_MAX)) {
+@@ -455,9 +455,9 @@ static int smc_pnet_add_ib(struct smc_pnettable 
*pnettable, char *ib_name,
+       }
+       if (new_ibdev) {
+               list_add_tail(&new_pe->list, &pnettable->pnetlist);
+-              write_unlock(&pnettable->lock);
++              mutex_unlock(&pnettable->lock);
+       } else {
+-              write_unlock(&pnettable->lock);
++              mutex_unlock(&pnettable->lock);
+               kfree(new_pe);
+       }
+       return (new_ibdev) ? 0 : -EEXIST;
+@@ -602,7 +602,7 @@ static int _smc_pnet_dump(struct net *net, struct sk_buff 
*skb, u32 portid,
+       pnettable = &sn->pnettable;
+ 
+       /* dump pnettable entries */
+-      read_lock(&pnettable->lock);
++      mutex_lock(&pnettable->lock);
+       list_for_each_entry(pnetelem, &pnettable->pnetlist, list) {
+               if (pnetid && !smc_pnet_match(pnetelem->pnet_name, pnetid))
+                       continue;
+@@ -617,7 +617,7 @@ static int _smc_pnet_dump(struct net *net, struct sk_buff 
*skb, u32 portid,
+                       break;
+               }
+       }
+-      read_unlock(&pnettable->lock);
++      mutex_unlock(&pnettable->lock);
+       return idx;
+ }
+ 
+@@ -859,7 +859,7 @@ int smc_pnet_net_init(struct net *net)
+       struct smc_pnetids_ndev *pnetids_ndev = &sn->pnetids_ndev;
+ 
+       INIT_LIST_HEAD(&pnettable->pnetlist);
+-      rwlock_init(&pnettable->lock);
++      mutex_init(&pnettable->lock);
+       INIT_LIST_HEAD(&pnetids_ndev->list);
+       rwlock_init(&pnetids_ndev->lock);
+ 
+@@ -939,7 +939,7 @@ static int smc_pnet_find_ndev_pnetid_by_table(struct 
net_device *ndev,
+       sn = net_generic(net, smc_net_id);
+       pnettable = &sn->pnettable;
+ 
+-      read_lock(&pnettable->lock);
++      mutex_lock(&pnettable->lock);
+       list_for_each_entry(pnetelem, &pnettable->pnetlist, list) {
+               if (pnetelem->type == SMC_PNET_ETH && ndev == pnetelem->ndev) {
+                       /* get pnetid of netdev device */
+@@ -948,7 +948,7 @@ static int smc_pnet_find_ndev_pnetid_by_table(struct 
net_device *ndev,
+                       break;
+               }
+       }
+-      read_unlock(&pnettable->lock);
++      mutex_unlock(&pnettable->lock);
+       return rc;
+ }
+ 
+@@ -1129,7 +1129,7 @@ int smc_pnetid_by_table_ib(struct smc_ib_device 
*smcibdev, u8 ib_port)
+       sn = net_generic(&init_net, smc_net_id);
+       pnettable = &sn->pnettable;
+ 
+-      read_lock(&pnettable->lock);
++      mutex_lock(&pnettable->lock);
+       list_for_each_entry(tmp_pe, &pnettable->pnetlist, list) {
+               if (tmp_pe->type == SMC_PNET_IB &&
+                   !strncmp(tmp_pe->ib_name, ib_name, IB_DEVICE_NAME_MAX) &&
+@@ -1139,7 +1139,7 @@ int smc_pnetid_by_table_ib(struct smc_ib_device 
*smcibdev, u8 ib_port)
+                       break;
+               }
+       }
+-      read_unlock(&pnettable->lock);
++      mutex_unlock(&pnettable->lock);
+ 
+       return rc;
+ }
+@@ -1158,7 +1158,7 @@ int smc_pnetid_by_table_smcd(struct smcd_dev *smcddev)
+       sn = net_generic(&init_net, smc_net_id);
+       pnettable = &sn->pnettable;
+ 
+-      read_lock(&pnettable->lock);
++      mutex_lock(&pnettable->lock);
+       list_for_each_entry(tmp_pe, &pnettable->pnetlist, list) {
+               if (tmp_pe->type == SMC_PNET_IB &&
+                   !strncmp(tmp_pe->ib_name, ib_name, IB_DEVICE_NAME_MAX)) {
+@@ -1167,7 +1167,7 @@ int smc_pnetid_by_table_smcd(struct smcd_dev *smcddev)
+                       break;
+               }
+       }
+-      read_unlock(&pnettable->lock);
++      mutex_unlock(&pnettable->lock);
+ 
+       return rc;
+ }
+diff --git a/net/smc/smc_pnet.h b/net/smc/smc_pnet.h
+index 14039272f7e42..80a88eea49491 100644
+--- a/net/smc/smc_pnet.h
++++ b/net/smc/smc_pnet.h
+@@ -29,7 +29,7 @@ struct smc_link_group;
+  * @pnetlist: List of PNETIDs
+  */
+ struct smc_pnettable {
+-      rwlock_t lock;
++      struct mutex lock;
+       struct list_head pnetlist;
+ };
+ 
+diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c
+index f6a6acef42235..54c5328f492d2 100644
+--- a/net/tipc/name_table.c
++++ b/net/tipc/name_table.c
+@@ -931,7 +931,7 @@ static int __tipc_nl_add_nametable_publ(struct tipc_nl_msg 
*msg,
+               list_for_each_entry(p, &sr->all_publ, all_publ)
+                       if (p->key == *last_key)
+                               break;
+-              if (p->key != *last_key)
++              if (list_entry_is_head(p, &sr->all_publ, all_publ))
+                       return -EPIPE;
+       } else {
+               p = list_first_entry(&sr->all_publ,
+diff --git a/net/tipc/socket.c b/net/tipc/socket.c
+index ce957ee5383c4..8d2c98531af45 100644
+--- a/net/tipc/socket.c
++++ b/net/tipc/socket.c
+@@ -3743,7 +3743,7 @@ static int __tipc_nl_list_sk_publ(struct sk_buff *skb,
+                       if (p->key == *last_publ)
+                               break;
+               }
+-              if (p->key != *last_publ) {
++              if (list_entry_is_head(p, &tsk->publications, binding_sock)) {
+                       /* We never set seq or call nl_dump_check_consistent()
+                        * this means that setting prev_seq here will cause the
+                        * consistence check to fail in the netlink callback
+diff --git a/tools/perf/util/data.c b/tools/perf/util/data.c
+index bcb494dc816a0..48754083791d8 100644
+--- a/tools/perf/util/data.c
++++ b/tools/perf/util/data.c
+@@ -44,10 +44,6 @@ int perf_data__create_dir(struct perf_data *data, int nr)
+       if (!files)
+               return -ENOMEM;
+ 
+-      data->dir.version = PERF_DIR_VERSION;
+-      data->dir.files   = files;
+-      data->dir.nr      = nr;
+-
+       for (i = 0; i < nr; i++) {
+               struct perf_data_file *file = &files[i];
+ 
+@@ -62,6 +58,9 @@ int perf_data__create_dir(struct perf_data *data, int nr)
+               file->fd = ret;
+       }
+ 
++      data->dir.version = PERF_DIR_VERSION;
++      data->dir.files   = files;
++      data->dir.nr      = nr;
+       return 0;
+ 
+ out_err:
+diff --git a/tools/testing/selftests/bpf/progs/test_sockmap_kern.h 
b/tools/testing/selftests/bpf/progs/test_sockmap_kern.h
+index 1858435de7aaf..5cb90ca292186 100644
+--- a/tools/testing/selftests/bpf/progs/test_sockmap_kern.h
++++ b/tools/testing/selftests/bpf/progs/test_sockmap_kern.h
+@@ -235,7 +235,7 @@ SEC("sk_msg1")
+ int bpf_prog4(struct sk_msg_md *msg)
+ {
+       int *bytes, zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5;
+-      int *start, *end, *start_push, *end_push, *start_pop, *pop;
++      int *start, *end, *start_push, *end_push, *start_pop, *pop, err = 0;
+ 
+       bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
+       if (bytes)
+@@ -249,8 +249,11 @@ int bpf_prog4(struct sk_msg_md *msg)
+               bpf_msg_pull_data(msg, *start, *end, 0);
+       start_push = bpf_map_lookup_elem(&sock_bytes, &two);
+       end_push = bpf_map_lookup_elem(&sock_bytes, &three);
+-      if (start_push && end_push)
+-              bpf_msg_push_data(msg, *start_push, *end_push, 0);
++      if (start_push && end_push) {
++              err = bpf_msg_push_data(msg, *start_push, *end_push, 0);
++              if (err)
++                      return SK_DROP;
++      }
+       start_pop = bpf_map_lookup_elem(&sock_bytes, &four);
+       pop = bpf_map_lookup_elem(&sock_bytes, &five);
+       if (start_pop && pop)
+@@ -263,6 +266,7 @@ int bpf_prog6(struct sk_msg_md *msg)
+ {
+       int zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5, key = 0;
+       int *bytes, *start, *end, *start_push, *end_push, *start_pop, *pop, *f;
++      int err = 0;
+       __u64 flags = 0;
+ 
+       bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
+@@ -279,8 +283,11 @@ int bpf_prog6(struct sk_msg_md *msg)
+ 
+       start_push = bpf_map_lookup_elem(&sock_bytes, &two);
+       end_push = bpf_map_lookup_elem(&sock_bytes, &three);
+-      if (start_push && end_push)
+-              bpf_msg_push_data(msg, *start_push, *end_push, 0);
++      if (start_push && end_push) {
++              err = bpf_msg_push_data(msg, *start_push, *end_push, 0);
++              if (err)
++                      return SK_DROP;
++      }
+ 
+       start_pop = bpf_map_lookup_elem(&sock_bytes, &four);
+       pop = bpf_map_lookup_elem(&sock_bytes, &five);
+@@ -338,7 +345,7 @@ SEC("sk_msg5")
+ int bpf_prog10(struct sk_msg_md *msg)
+ {
+       int *bytes, *start, *end, *start_push, *end_push, *start_pop, *pop;
+-      int zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5;
++      int zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5, err = 0;
+ 
+       bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
+       if (bytes)
+@@ -352,8 +359,11 @@ int bpf_prog10(struct sk_msg_md *msg)
+               bpf_msg_pull_data(msg, *start, *end, 0);
+       start_push = bpf_map_lookup_elem(&sock_bytes, &two);
+       end_push = bpf_map_lookup_elem(&sock_bytes, &three);
+-      if (start_push && end_push)
+-              bpf_msg_push_data(msg, *start_push, *end_push, 0);
++      if (start_push && end_push) {
++              err = bpf_msg_push_data(msg, *start_push, *end_push, 0);
++              if (err)
++                      return SK_PASS;
++      }
+       start_pop = bpf_map_lookup_elem(&sock_bytes, &four);
+       pop = bpf_map_lookup_elem(&sock_bytes, &five);
+       if (start_pop && pop)

Reply via email to