summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoan Figueras2018-11-13 23:38:18 +0100
committerJoan Figueras2018-11-13 23:38:18 +0100
commit1d448d090ca64a018895891f720cbe7c7d4a14ea (patch)
treeab5e334cce23af09c677cc207fae569137887e1f
parent7a4fe9c51ad29910f63e66b81760c58500d7871b (diff)
downloadaur-1d448d090ca64a018895891f720cbe7c7d4a14ea.tar.gz
4.18.19
-rw-r--r--.SRCINFO8
-rw-r--r--PKGBUILD10
-rw-r--r--linux_v4.18.16-v4.18.18.patch6176
-rw-r--r--linux_v4.18.16-v4.18.19.patch.gzbin0 -> 201390 bytes
4 files changed, 9 insertions, 6185 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 2c1c7f769765..fe8406834c36 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,5 +1,5 @@
pkgbase = linux-bld
- pkgver = 4.18.18
+ pkgver = 4.18.19
pkgrel = 1
url = https://github.com/rmullick/linux
arch = x86_64
@@ -11,7 +11,7 @@ pkgbase = linux-bld
makedepends = libelf
options = !strip
source = https://git.archlinux.org/linux.git/snapshot/linux-4.18.16-arch1.tar.xz
- source = linux_v4.18.16-v4.18.18.patch
+ source = linux_v4.18.16-v4.18.19.patch.gz
source = 60-linux.hook
source = 90-linux.hook
source = linux-bld.preset
@@ -20,11 +20,11 @@ pkgbase = linux-bld
validpgpkeys = ABAF11C65A2970B130ABE3C479BE3E4300411886
validpgpkeys = 647F28654894E3BD457199BE38DBBDC86092693E
sha256sums = 3f64579d5584a85fb0b15fda1f9803cbc924dcd4007c7e17b1bb449bc653f5ec
- sha256sums = 38e863df7729d7d710119cc2ec34bdbaacf0191315909d3a8abf522af7a70d80
+ sha256sums = ddf39ea01942bcffe45ba1cd23a858b832754c48debd05e5be83249466647c59
sha256sums = ae2e95db94ef7176207c690224169594d49445e04249d2499e9d2fbc117a0b21
sha256sums = 75f99f5239e03238f88d1a834c50043ec32b1dc568f2cc291b07d04718483919
sha256sums = 5b51a1eacb3e00b304ca54d31f467ec1fb15fdfce93f1c62963d087bf753e812
- sha256sums = 0e0d831763f080c65c07e06389007ada9f7d77f8148859ac5a2223263cc966e7
+ sha256sums = 8a4cd4ce29da74ce7d465416a6224ab64614ca106682c7908e50196b36fbd4a9
sha256sums = 53c93e1b5c05a749a976ed4702daeab5524326d779c157f8878308125de2e68b
pkgname = linux-bld
diff --git a/PKGBUILD b/PKGBUILD
index 6532dca3b1f5..22e22a080a45 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -5,10 +5,10 @@
pkgbase=linux-bld
pkgname=(linux-bld linux-bld-headers)
_kernelname=-bld
-pkgver=4.18.18
+pkgver=4.18.19
#_archlinux_linux_version=$pkgver-arch1
_archlinux_linux_version=4.18.16-arch1
-_diff_file=linux_v4.18.16-v4.18.18.patch
+_diff_file=linux_v4.18.16-v4.18.19.patch
_srcname=linux-4.18
_pkgver2=${_srcname#*-}.0
pkgrel=1
@@ -21,7 +21,7 @@ _BLDpatch="BLD-${_srcname#*-}.patch"
arch_config_trunk=bbd102b10ab31063993d61829be3dea000f85724
source=("https://git.archlinux.org/linux.git/snapshot/linux-${_archlinux_linux_version}.tar.xz"
- "${_diff_file}"
+ "${_diff_file}.gz"
'60-linux.hook' # pacman hook for depmod
'90-linux.hook' # pacman hook for initramfs regeneration
# standard config files for mkinitcpio ramdisk
@@ -33,11 +33,11 @@ source=("https://git.archlinux.org/linux.git/snapshot/linux-${_archlinux_linux_v
)
sha256sums=('3f64579d5584a85fb0b15fda1f9803cbc924dcd4007c7e17b1bb449bc653f5ec'
- '38e863df7729d7d710119cc2ec34bdbaacf0191315909d3a8abf522af7a70d80'
+ 'ddf39ea01942bcffe45ba1cd23a858b832754c48debd05e5be83249466647c59'
'ae2e95db94ef7176207c690224169594d49445e04249d2499e9d2fbc117a0b21'
'75f99f5239e03238f88d1a834c50043ec32b1dc568f2cc291b07d04718483919'
'5b51a1eacb3e00b304ca54d31f467ec1fb15fdfce93f1c62963d087bf753e812'
- '0e0d831763f080c65c07e06389007ada9f7d77f8148859ac5a2223263cc966e7'
+ '8a4cd4ce29da74ce7d465416a6224ab64614ca106682c7908e50196b36fbd4a9'
'53c93e1b5c05a749a976ed4702daeab5524326d779c157f8878308125de2e68b')
validpgpkeys=(
diff --git a/linux_v4.18.16-v4.18.18.patch b/linux_v4.18.16-v4.18.18.patch
deleted file mode 100644
index c241a52ccba7..000000000000
--- a/linux_v4.18.16-v4.18.18.patch
+++ /dev/null
@@ -1,6176 +0,0 @@
-diff --git a/Makefile b/Makefile
-index 034dd990b0ae..7b35c1ec0427 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,7 +1,7 @@
- # SPDX-License-Identifier: GPL-2.0
- VERSION = 4
- PATCHLEVEL = 18
--SUBLEVEL = 16
-+SUBLEVEL = 18
--EXTRAVERSION = -arch1
-+EXTRAVERSION =
- NAME = Merciless Moray
-
-diff --git a/arch/Kconfig b/arch/Kconfig
-index f03b72644902..a18371a36e03 100644
---- a/arch/Kconfig
-+++ b/arch/Kconfig
-@@ -977,4 +977,12 @@ config REFCOUNT_FULL
- against various use-after-free conditions that can be used in
- security flaw exploits.
-
-+config HAVE_ARCH_COMPILER_H
-+ bool
-+ help
-+ An architecture can select this if it provides an
-+ asm/compiler.h header that should be included after
-+ linux/compiler-*.h in order to override macro definitions that those
-+ headers generally provide.
-+
- source "kernel/gcov/Kconfig"
-diff --git a/arch/arm/boot/dts/bcm63138.dtsi b/arch/arm/boot/dts/bcm63138.dtsi
-index 43ee992ccdcf..6df61518776f 100644
---- a/arch/arm/boot/dts/bcm63138.dtsi
-+++ b/arch/arm/boot/dts/bcm63138.dtsi
-@@ -106,21 +106,23 @@
- global_timer: timer@1e200 {
- compatible = "arm,cortex-a9-global-timer";
- reg = <0x1e200 0x20>;
-- interrupts = <GIC_PPI 11 IRQ_TYPE_LEVEL_HIGH>;
-+ interrupts = <GIC_PPI 11 IRQ_TYPE_EDGE_RISING>;
- clocks = <&axi_clk>;
- };
-
- local_timer: local-timer@1e600 {
- compatible = "arm,cortex-a9-twd-timer";
- reg = <0x1e600 0x20>;
-- interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_HIGH>;
-+ interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) |
-+ IRQ_TYPE_EDGE_RISING)>;
- clocks = <&axi_clk>;
- };
-
- twd_watchdog: watchdog@1e620 {
- compatible = "arm,cortex-a9-twd-wdt";
- reg = <0x1e620 0x20>;
-- interrupts = <GIC_PPI 14 IRQ_TYPE_LEVEL_HIGH>;
-+ interrupts = <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) |
-+ IRQ_TYPE_LEVEL_HIGH)>;
- };
-
- armpll: armpll {
-@@ -158,7 +160,7 @@
- serial0: serial@600 {
- compatible = "brcm,bcm6345-uart";
- reg = <0x600 0x1b>;
-- interrupts = <GIC_SPI 32 0>;
-+ interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
- clocks = <&periph_clk>;
- clock-names = "periph";
- status = "disabled";
-@@ -167,7 +169,7 @@
- serial1: serial@620 {
- compatible = "brcm,bcm6345-uart";
- reg = <0x620 0x1b>;
-- interrupts = <GIC_SPI 33 0>;
-+ interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
- clocks = <&periph_clk>;
- clock-names = "periph";
- status = "disabled";
-@@ -180,7 +182,7 @@
- reg = <0x2000 0x600>, <0xf0 0x10>;
- reg-names = "nand", "nand-int-base";
- status = "disabled";
-- interrupts = <GIC_SPI 38 0>;
-+ interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
- interrupt-names = "nand";
- };
-
-diff --git a/arch/arm/boot/dts/imx53-qsb-common.dtsi b/arch/arm/boot/dts/imx53-qsb-common.dtsi
-index ef7658a78836..c1548adee789 100644
---- a/arch/arm/boot/dts/imx53-qsb-common.dtsi
-+++ b/arch/arm/boot/dts/imx53-qsb-common.dtsi
-@@ -123,6 +123,17 @@
- };
- };
-
-+&cpu0 {
-+ /* CPU rated to 1GHz, not 1.2GHz as per the default settings */
-+ operating-points = <
-+ /* kHz uV */
-+ 166666 850000
-+ 400000 900000
-+ 800000 1050000
-+ 1000000 1200000
-+ >;
-+};
-+
- &esdhc1 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_esdhc1>;
-diff --git a/arch/arm/kernel/vmlinux.lds.h b/arch/arm/kernel/vmlinux.lds.h
-index ae5fdff18406..8247bc15addc 100644
---- a/arch/arm/kernel/vmlinux.lds.h
-+++ b/arch/arm/kernel/vmlinux.lds.h
-@@ -49,6 +49,8 @@
- #define ARM_DISCARD \
- *(.ARM.exidx.exit.text) \
- *(.ARM.extab.exit.text) \
-+ *(.ARM.exidx.text.exit) \
-+ *(.ARM.extab.text.exit) \
- ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) \
- ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) \
- ARM_EXIT_DISCARD(EXIT_TEXT) \
-diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c
-index fc91205ff46c..5bf9443cfbaa 100644
---- a/arch/arm/mm/ioremap.c
-+++ b/arch/arm/mm/ioremap.c
-@@ -473,7 +473,7 @@ void pci_ioremap_set_mem_type(int mem_type)
-
- int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr)
- {
-- BUG_ON(offset + SZ_64K > IO_SPACE_LIMIT);
-+ BUG_ON(offset + SZ_64K - 1 > IO_SPACE_LIMIT);
-
- return ioremap_page_range(PCI_IO_VIRT_BASE + offset,
- PCI_IO_VIRT_BASE + offset + SZ_64K,
-diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
-index 192b3ba07075..f85be2f8b140 100644
---- a/arch/arm64/mm/hugetlbpage.c
-+++ b/arch/arm64/mm/hugetlbpage.c
-@@ -117,11 +117,14 @@ static pte_t get_clear_flush(struct mm_struct *mm,
-
- /*
- * If HW_AFDBM is enabled, then the HW could turn on
-- * the dirty bit for any page in the set, so check
-- * them all. All hugetlb entries are already young.
-+ * the dirty or accessed bit for any page in the set,
-+ * so check them all.
- */
- if (pte_dirty(pte))
- orig_pte = pte_mkdirty(orig_pte);
-+
-+ if (pte_young(pte))
-+ orig_pte = pte_mkyoung(orig_pte);
- }
-
- if (valid) {
-@@ -340,10 +343,13 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma,
- if (!pte_same(orig_pte, pte))
- changed = 1;
-
-- /* Make sure we don't lose the dirty state */
-+ /* Make sure we don't lose the dirty or young state */
- if (pte_dirty(orig_pte))
- pte = pte_mkdirty(pte);
-
-+ if (pte_young(orig_pte))
-+ pte = pte_mkyoung(pte);
-+
- hugeprot = pte_pgprot(pte);
- for (i = 0; i < ncontig; i++, ptep++, addr += pgsize, pfn += dpfn)
- set_pte_at(vma->vm_mm, addr, ptep, pfn_pte(pfn, hugeprot));
-diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
-index 59d07bd5374a..055b211b7126 100644
---- a/arch/powerpc/mm/numa.c
-+++ b/arch/powerpc/mm/numa.c
-@@ -1217,9 +1217,10 @@ int find_and_online_cpu_nid(int cpu)
- * Need to ensure that NODE_DATA is initialized for a node from
- * available memory (see memblock_alloc_try_nid). If unable to
- * init the node, then default to nearest node that has memory
-- * installed.
-+ * installed. Skip onlining a node if the subsystems are not
-+ * yet initialized.
- */
-- if (try_online_node(new_nid))
-+ if (!topology_inited || try_online_node(new_nid))
- new_nid = first_online_node;
- #else
- /*
-diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c
-index 0efa5b29d0a3..dcff272aee06 100644
---- a/arch/riscv/kernel/setup.c
-+++ b/arch/riscv/kernel/setup.c
-@@ -165,7 +165,7 @@ static void __init setup_bootmem(void)
- BUG_ON(mem_size == 0);
-
- set_max_mapnr(PFN_DOWN(mem_size));
-- max_low_pfn = pfn_base + PFN_DOWN(mem_size);
-+ max_low_pfn = memblock_end_of_DRAM();
-
- #ifdef CONFIG_BLK_DEV_INITRD
- setup_initrd();
-diff --git a/arch/sparc/include/asm/cpudata_64.h b/arch/sparc/include/asm/cpudata_64.h
-index 666d6b5c0440..9c3fc03abe9a 100644
---- a/arch/sparc/include/asm/cpudata_64.h
-+++ b/arch/sparc/include/asm/cpudata_64.h
-@@ -28,7 +28,7 @@ typedef struct {
- unsigned short sock_id; /* physical package */
- unsigned short core_id;
- unsigned short max_cache_id; /* groupings of highest shared cache */
-- unsigned short proc_id; /* strand (aka HW thread) id */
-+ signed short proc_id; /* strand (aka HW thread) id */
- } cpuinfo_sparc;
-
- DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data);
-diff --git a/arch/sparc/include/asm/switch_to_64.h b/arch/sparc/include/asm/switch_to_64.h
-index 4ff29b1406a9..b1d4e2e3210f 100644
---- a/arch/sparc/include/asm/switch_to_64.h
-+++ b/arch/sparc/include/asm/switch_to_64.h
-@@ -67,6 +67,7 @@ do { save_and_clear_fpu(); \
- } while(0)
-
- void synchronize_user_stack(void);
--void fault_in_user_windows(void);
-+struct pt_regs;
-+void fault_in_user_windows(struct pt_regs *);
-
- #endif /* __SPARC64_SWITCH_TO_64_H */
-diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c
-index d3149baaa33c..67b3e6b3ce5d 100644
---- a/arch/sparc/kernel/perf_event.c
-+++ b/arch/sparc/kernel/perf_event.c
-@@ -24,6 +24,7 @@
- #include <asm/cpudata.h>
- #include <linux/uaccess.h>
- #include <linux/atomic.h>
-+#include <linux/sched/clock.h>
- #include <asm/nmi.h>
- #include <asm/pcr.h>
- #include <asm/cacheflush.h>
-@@ -927,6 +928,8 @@ static void read_in_all_counters(struct cpu_hw_events *cpuc)
- sparc_perf_event_update(cp, &cp->hw,
- cpuc->current_idx[i]);
- cpuc->current_idx[i] = PIC_NO_INDEX;
-+ if (cp->hw.state & PERF_HES_STOPPED)
-+ cp->hw.state |= PERF_HES_ARCH;
- }
- }
- }
-@@ -959,10 +962,12 @@ static void calculate_single_pcr(struct cpu_hw_events *cpuc)
-
- enc = perf_event_get_enc(cpuc->events[i]);
- cpuc->pcr[0] &= ~mask_for_index(idx);
-- if (hwc->state & PERF_HES_STOPPED)
-+ if (hwc->state & PERF_HES_ARCH) {
- cpuc->pcr[0] |= nop_for_index(idx);
-- else
-+ } else {
- cpuc->pcr[0] |= event_encoding(enc, idx);
-+ hwc->state = 0;
-+ }
- }
- out:
- cpuc->pcr[0] |= cpuc->event[0]->hw.config_base;
-@@ -988,6 +993,9 @@ static void calculate_multiple_pcrs(struct cpu_hw_events *cpuc)
-
- cpuc->current_idx[i] = idx;
-
-+ if (cp->hw.state & PERF_HES_ARCH)
-+ continue;
-+
- sparc_pmu_start(cp, PERF_EF_RELOAD);
- }
- out:
-@@ -1079,6 +1087,8 @@ static void sparc_pmu_start(struct perf_event *event, int flags)
- event->hw.state = 0;
-
- sparc_pmu_enable_event(cpuc, &event->hw, idx);
-+
-+ perf_event_update_userpage(event);
- }
-
- static void sparc_pmu_stop(struct perf_event *event, int flags)
-@@ -1371,9 +1381,9 @@ static int sparc_pmu_add(struct perf_event *event, int ef_flags)
- cpuc->events[n0] = event->hw.event_base;
- cpuc->current_idx[n0] = PIC_NO_INDEX;
-
-- event->hw.state = PERF_HES_UPTODATE;
-+ event->hw.state = PERF_HES_UPTODATE | PERF_HES_STOPPED;
- if (!(ef_flags & PERF_EF_START))
-- event->hw.state |= PERF_HES_STOPPED;
-+ event->hw.state |= PERF_HES_ARCH;
-
- /*
- * If group events scheduling transaction was started,
-@@ -1603,6 +1613,8 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
- struct perf_sample_data data;
- struct cpu_hw_events *cpuc;
- struct pt_regs *regs;
-+ u64 finish_clock;
-+ u64 start_clock;
- int i;
-
- if (!atomic_read(&active_events))
-@@ -1616,6 +1628,8 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
- return NOTIFY_DONE;
- }
-
-+ start_clock = sched_clock();
-+
- regs = args->regs;
-
- cpuc = this_cpu_ptr(&cpu_hw_events);
-@@ -1654,6 +1668,10 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self,
- sparc_pmu_stop(event, 0);
- }
-
-+ finish_clock = sched_clock();
-+
-+ perf_sample_event_took(finish_clock - start_clock);
-+
- return NOTIFY_STOP;
- }
-
-diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c
-index 6c086086ca8f..59eaf6227af1 100644
---- a/arch/sparc/kernel/process_64.c
-+++ b/arch/sparc/kernel/process_64.c
-@@ -36,6 +36,7 @@
- #include <linux/sysrq.h>
- #include <linux/nmi.h>
- #include <linux/context_tracking.h>
-+#include <linux/signal.h>
-
- #include <linux/uaccess.h>
- #include <asm/page.h>
-@@ -521,7 +522,12 @@ static void stack_unaligned(unsigned long sp)
- force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *) sp, 0, current);
- }
-
--void fault_in_user_windows(void)
-+static const char uwfault32[] = KERN_INFO \
-+ "%s[%d]: bad register window fault: SP %08lx (orig_sp %08lx) TPC %08lx O7 %08lx\n";
-+static const char uwfault64[] = KERN_INFO \
-+ "%s[%d]: bad register window fault: SP %016lx (orig_sp %016lx) TPC %08lx O7 %016lx\n";
-+
-+void fault_in_user_windows(struct pt_regs *regs)
- {
- struct thread_info *t = current_thread_info();
- unsigned long window;
-@@ -534,9 +540,9 @@ void fault_in_user_windows(void)
- do {
- struct reg_window *rwin = &t->reg_window[window];
- int winsize = sizeof(struct reg_window);
-- unsigned long sp;
-+ unsigned long sp, orig_sp;
-
-- sp = t->rwbuf_stkptrs[window];
-+ orig_sp = sp = t->rwbuf_stkptrs[window];
-
- if (test_thread_64bit_stack(sp))
- sp += STACK_BIAS;
-@@ -547,8 +553,16 @@ void fault_in_user_windows(void)
- stack_unaligned(sp);
-
- if (unlikely(copy_to_user((char __user *)sp,
-- rwin, winsize)))
-+ rwin, winsize))) {
-+ if (show_unhandled_signals)
-+ printk_ratelimited(is_compat_task() ?
-+ uwfault32 : uwfault64,
-+ current->comm, current->pid,
-+ sp, orig_sp,
-+ regs->tpc,
-+ regs->u_regs[UREG_I7]);
- goto barf;
-+ }
- } while (window--);
- }
- set_thread_wsaved(0);
-@@ -556,8 +570,7 @@ void fault_in_user_windows(void)
-
- barf:
- set_thread_wsaved(window + 1);
-- user_exit();
-- do_exit(SIGILL);
-+ force_sig(SIGSEGV, current);
- }
-
- asmlinkage long sparc_do_fork(unsigned long clone_flags,
-diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S
-index f6528884a2c8..29aa34f11720 100644
---- a/arch/sparc/kernel/rtrap_64.S
-+++ b/arch/sparc/kernel/rtrap_64.S
-@@ -39,6 +39,7 @@ __handle_preemption:
- wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
-
- __handle_user_windows:
-+ add %sp, PTREGS_OFF, %o0
- call fault_in_user_windows
- 661: wrpr %g0, RTRAP_PSTATE, %pstate
- /* If userspace is using ADI, it could potentially pass
-@@ -84,8 +85,9 @@ __handle_signal:
- ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
- sethi %hi(0xf << 20), %l4
- and %l1, %l4, %l4
-+ andn %l1, %l4, %l1
- ba,pt %xcc, __handle_preemption_continue
-- andn %l1, %l4, %l1
-+ srl %l4, 20, %l4
-
- /* When returning from a NMI (%pil==15) interrupt we want to
- * avoid running softirqs, doing IRQ tracing, preempting, etc.
-diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c
-index 44d379db3f64..4c5b3fcbed94 100644
---- a/arch/sparc/kernel/signal32.c
-+++ b/arch/sparc/kernel/signal32.c
-@@ -371,7 +371,11 @@ static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs,
- get_sigframe(ksig, regs, sigframe_size);
-
- if (invalid_frame_pointer(sf, sigframe_size)) {
-- do_exit(SIGILL);
-+ if (show_unhandled_signals)
-+ pr_info("%s[%d] bad frame in setup_frame32: %08lx TPC %08lx O7 %08lx\n",
-+ current->comm, current->pid, (unsigned long)sf,
-+ regs->tpc, regs->u_regs[UREG_I7]);
-+ force_sigsegv(ksig->sig, current);
- return -EINVAL;
- }
-
-@@ -501,7 +505,11 @@ static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs,
- get_sigframe(ksig, regs, sigframe_size);
-
- if (invalid_frame_pointer(sf, sigframe_size)) {
-- do_exit(SIGILL);
-+ if (show_unhandled_signals)
-+ pr_info("%s[%d] bad frame in setup_rt_frame32: %08lx TPC %08lx O7 %08lx\n",
-+ current->comm, current->pid, (unsigned long)sf,
-+ regs->tpc, regs->u_regs[UREG_I7]);
-+ force_sigsegv(ksig->sig, current);
- return -EINVAL;
- }
-
-diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c
-index 48366e5eb5b2..e9de1803a22e 100644
---- a/arch/sparc/kernel/signal_64.c
-+++ b/arch/sparc/kernel/signal_64.c
-@@ -370,7 +370,11 @@ setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
- get_sigframe(ksig, regs, sf_size);
-
- if (invalid_frame_pointer (sf)) {
-- do_exit(SIGILL); /* won't return, actually */
-+ if (show_unhandled_signals)
-+ pr_info("%s[%d] bad frame in setup_rt_frame: %016lx TPC %016lx O7 %016lx\n",
-+ current->comm, current->pid, (unsigned long)sf,
-+ regs->tpc, regs->u_regs[UREG_I7]);
-+ force_sigsegv(ksig->sig, current);
- return -EINVAL;
- }
-
-diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S
-index 387ef993880a..25699462ad5b 100644
---- a/arch/sparc/kernel/systbls_64.S
-+++ b/arch/sparc/kernel/systbls_64.S
-@@ -47,9 +47,9 @@ sys_call_table32:
- .word sys_recvfrom, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate
- /*130*/ .word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_sendto, sys_shutdown
- .word sys_socketpair, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64
--/*140*/ .word sys_sendfile64, sys_nis_syscall, compat_sys_futex, sys_gettid, compat_sys_getrlimit
-+/*140*/ .word sys_sendfile64, sys_getpeername, compat_sys_futex, sys_gettid, compat_sys_getrlimit
- .word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write
--/*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64
-+/*150*/ .word sys_getsockname, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64
- .word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount
- /*160*/ .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall
- .word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys_setxattr
-diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
-index f396048a0d68..39822f611c01 100644
---- a/arch/sparc/mm/init_64.c
-+++ b/arch/sparc/mm/init_64.c
-@@ -1383,6 +1383,7 @@ int __node_distance(int from, int to)
- }
- return numa_latency[from][to];
- }
-+EXPORT_SYMBOL(__node_distance);
-
- static int __init find_best_numa_node_for_mlgroup(struct mdesc_mlgroup *grp)
- {
-diff --git a/arch/sparc/vdso/vclock_gettime.c b/arch/sparc/vdso/vclock_gettime.c
-index 3feb3d960ca5..75dca9aab737 100644
---- a/arch/sparc/vdso/vclock_gettime.c
-+++ b/arch/sparc/vdso/vclock_gettime.c
-@@ -33,9 +33,19 @@
- #define TICK_PRIV_BIT (1ULL << 63)
- #endif
-
-+#ifdef CONFIG_SPARC64
- #define SYSCALL_STRING \
- "ta 0x6d;" \
-- "sub %%g0, %%o0, %%o0;" \
-+ "bcs,a 1f;" \
-+ " sub %%g0, %%o0, %%o0;" \
-+ "1:"
-+#else
-+#define SYSCALL_STRING \
-+ "ta 0x10;" \
-+ "bcs,a 1f;" \
-+ " sub %%g0, %%o0, %%o0;" \
-+ "1:"
-+#endif
-
- #define SYSCALL_CLOBBERS \
- "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
-diff --git a/arch/x86/events/amd/uncore.c b/arch/x86/events/amd/uncore.c
-index 981ba5e8241b..8671de126eac 100644
---- a/arch/x86/events/amd/uncore.c
-+++ b/arch/x86/events/amd/uncore.c
-@@ -36,6 +36,7 @@
-
- static int num_counters_llc;
- static int num_counters_nb;
-+static bool l3_mask;
-
- static HLIST_HEAD(uncore_unused_list);
-
-@@ -209,6 +210,13 @@ static int amd_uncore_event_init(struct perf_event *event)
- hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB;
- hwc->idx = -1;
-
-+ /*
-+ * SliceMask and ThreadMask need to be set for certain L3 events in
-+ * Family 17h. For other events, the two fields do not affect the count.
-+ */
-+ if (l3_mask)
-+ hwc->config |= (AMD64_L3_SLICE_MASK | AMD64_L3_THREAD_MASK);
-+
- if (event->cpu < 0)
- return -EINVAL;
-
-@@ -525,6 +533,7 @@ static int __init amd_uncore_init(void)
- amd_llc_pmu.name = "amd_l3";
- format_attr_event_df.show = &event_show_df;
- format_attr_event_l3.show = &event_show_l3;
-+ l3_mask = true;
- } else {
- num_counters_nb = NUM_COUNTERS_NB;
- num_counters_llc = NUM_COUNTERS_L2;
-@@ -532,6 +541,7 @@ static int __init amd_uncore_init(void)
- amd_llc_pmu.name = "amd_l2";
- format_attr_event_df = format_attr_event;
- format_attr_event_l3 = format_attr_event;
-+ l3_mask = false;
- }
-
- amd_nb_pmu.attr_groups = amd_uncore_attr_groups_df;
-diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c
-index 51d7c117e3c7..c07bee31abe8 100644
---- a/arch/x86/events/intel/uncore_snbep.c
-+++ b/arch/x86/events/intel/uncore_snbep.c
-@@ -3061,7 +3061,7 @@ static struct event_constraint bdx_uncore_pcu_constraints[] = {
-
- void bdx_uncore_cpu_init(void)
- {
-- int pkg = topology_phys_to_logical_pkg(0);
-+ int pkg = topology_phys_to_logical_pkg(boot_cpu_data.phys_proc_id);
-
- if (bdx_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores)
- bdx_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores;
-@@ -3931,16 +3931,16 @@ static const struct pci_device_id skx_uncore_pci_ids[] = {
- .driver_data = UNCORE_PCI_DEV_FULL_DATA(21, 5, SKX_PCI_UNCORE_M2PCIE, 3),
- },
- { /* M3UPI0 Link 0 */
-- PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204C),
-- .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 0, SKX_PCI_UNCORE_M3UPI, 0),
-+ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D),
-+ .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 1, SKX_PCI_UNCORE_M3UPI, 0),
- },
- { /* M3UPI0 Link 1 */
-- PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D),
-- .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 1, SKX_PCI_UNCORE_M3UPI, 1),
-+ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204E),
-+ .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 2, SKX_PCI_UNCORE_M3UPI, 1),
- },
- { /* M3UPI1 Link 2 */
-- PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204C),
-- .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 4, SKX_PCI_UNCORE_M3UPI, 2),
-+ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D),
-+ .driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 5, SKX_PCI_UNCORE_M3UPI, 2),
- },
- { /* end: all zeroes */ }
- };
-diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
-index a38bf5a1e37a..69dcdf195b61 100644
---- a/arch/x86/include/asm/fpu/internal.h
-+++ b/arch/x86/include/asm/fpu/internal.h
-@@ -528,7 +528,7 @@ static inline void fpregs_activate(struct fpu *fpu)
- static inline void
- switch_fpu_prepare(struct fpu *old_fpu, int cpu)
- {
-- if (old_fpu->initialized) {
-+ if (static_cpu_has(X86_FEATURE_FPU) && old_fpu->initialized) {
- if (!copy_fpregs_to_fpstate(old_fpu))
- old_fpu->last_cpu = -1;
- else
-diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h
-index a06b07399d17..6abf3af96fc8 100644
---- a/arch/x86/include/asm/percpu.h
-+++ b/arch/x86/include/asm/percpu.h
-@@ -185,22 +185,22 @@ do { \
- typeof(var) pfo_ret__; \
- switch (sizeof(var)) { \
- case 1: \
-- asm(op "b "__percpu_arg(1)",%0" \
-+ asm volatile(op "b "__percpu_arg(1)",%0"\
- : "=q" (pfo_ret__) \
- : "m" (var)); \
- break; \
- case 2: \
-- asm(op "w "__percpu_arg(1)",%0" \
-+ asm volatile(op "w "__percpu_arg(1)",%0"\
- : "=r" (pfo_ret__) \
- : "m" (var)); \
- break; \
- case 4: \
-- asm(op "l "__percpu_arg(1)",%0" \
-+ asm volatile(op "l "__percpu_arg(1)",%0"\
- : "=r" (pfo_ret__) \
- : "m" (var)); \
- break; \
- case 8: \
-- asm(op "q "__percpu_arg(1)",%0" \
-+ asm volatile(op "q "__percpu_arg(1)",%0"\
- : "=r" (pfo_ret__) \
- : "m" (var)); \
- break; \
-diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h
-index 12f54082f4c8..78241b736f2a 100644
---- a/arch/x86/include/asm/perf_event.h
-+++ b/arch/x86/include/asm/perf_event.h
-@@ -46,6 +46,14 @@
- #define INTEL_ARCH_EVENT_MASK \
- (ARCH_PERFMON_EVENTSEL_UMASK | ARCH_PERFMON_EVENTSEL_EVENT)
-
-+#define AMD64_L3_SLICE_SHIFT 48
-+#define AMD64_L3_SLICE_MASK \
-+ ((0xFULL) << AMD64_L3_SLICE_SHIFT)
-+
-+#define AMD64_L3_THREAD_SHIFT 56
-+#define AMD64_L3_THREAD_MASK \
-+ ((0xFFULL) << AMD64_L3_THREAD_SHIFT)
-+
- #define X86_RAW_EVENT_MASK \
- (ARCH_PERFMON_EVENTSEL_EVENT | \
- ARCH_PERFMON_EVENTSEL_UMASK | \
-diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
-index 930c88341e4e..1fbf38dde84c 100644
---- a/arch/x86/kernel/paravirt.c
-+++ b/arch/x86/kernel/paravirt.c
-@@ -90,7 +90,7 @@ unsigned paravirt_patch_call(void *insnbuf,
-
- if (len < 5) {
- #ifdef CONFIG_RETPOLINE
-- WARN_ONCE("Failing to patch indirect CALL in %ps\n", (void *)addr);
-+ WARN_ONCE(1, "Failing to patch indirect CALL in %ps\n", (void *)addr);
- #endif
- return len; /* call too long for patch site */
- }
-@@ -110,7 +110,7 @@ unsigned paravirt_patch_jmp(void *insnbuf, const void *target,
-
- if (len < 5) {
- #ifdef CONFIG_RETPOLINE
-- WARN_ONCE("Failing to patch indirect JMP in %ps\n", (void *)addr);
-+ WARN_ONCE(1, "Failing to patch indirect JMP in %ps\n", (void *)addr);
- #endif
- return len; /* call too long for patch site */
- }
-diff --git a/arch/x86/kernel/pci-swiotlb.c b/arch/x86/kernel/pci-swiotlb.c
-index 661583662430..71c0b01d93b1 100644
---- a/arch/x86/kernel/pci-swiotlb.c
-+++ b/arch/x86/kernel/pci-swiotlb.c
-@@ -42,10 +42,8 @@ IOMMU_INIT_FINISH(pci_swiotlb_detect_override,
- int __init pci_swiotlb_detect_4gb(void)
- {
- /* don't initialize swiotlb if iommu=off (no_iommu=1) */
--#ifdef CONFIG_X86_64
- if (!no_iommu && max_possible_pfn > MAX_DMA32_PFN)
- swiotlb = 1;
--#endif
-
- /*
- * If SME is active then swiotlb will be set to 1 so that bounce
-diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
-index 74b4472ba0a6..f32472acf66c 100644
---- a/arch/x86/kernel/setup.c
-+++ b/arch/x86/kernel/setup.c
-@@ -1258,7 +1258,7 @@ void __init setup_arch(char **cmdline_p)
- x86_init.hyper.guest_late_init();
-
- e820__reserve_resources();
-- e820__register_nosave_regions(max_low_pfn);
-+ e820__register_nosave_regions(max_pfn);
-
- x86_init.resources.reserve_resources();
-
-diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c
-index be01328eb755..fddaefc51fb6 100644
---- a/arch/x86/kernel/time.c
-+++ b/arch/x86/kernel/time.c
-@@ -25,7 +25,7 @@
- #include <asm/time.h>
-
- #ifdef CONFIG_X86_64
--__visible volatile unsigned long jiffies __cacheline_aligned = INITIAL_JIFFIES;
-+__visible volatile unsigned long jiffies __cacheline_aligned_in_smp = INITIAL_JIFFIES;
- #endif
-
- unsigned long profile_pc(struct pt_regs *regs)
-diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
-index a10481656d82..2f4af9598f62 100644
---- a/arch/x86/kernel/tsc.c
-+++ b/arch/x86/kernel/tsc.c
-@@ -60,7 +60,7 @@ struct cyc2ns {
-
- static DEFINE_PER_CPU_ALIGNED(struct cyc2ns, cyc2ns);
-
--void cyc2ns_read_begin(struct cyc2ns_data *data)
-+void __always_inline cyc2ns_read_begin(struct cyc2ns_data *data)
- {
- int seq, idx;
-
-@@ -77,7 +77,7 @@ void cyc2ns_read_begin(struct cyc2ns_data *data)
- } while (unlikely(seq != this_cpu_read(cyc2ns.seq.sequence)));
- }
-
--void cyc2ns_read_end(void)
-+void __always_inline cyc2ns_read_end(void)
- {
- preempt_enable_notrace();
- }
-@@ -123,7 +123,7 @@ static void __init cyc2ns_init(int cpu)
- seqcount_init(&c2n->seq);
- }
-
--static inline unsigned long long cycles_2_ns(unsigned long long cyc)
-+static __always_inline unsigned long long cycles_2_ns(unsigned long long cyc)
- {
- struct cyc2ns_data data;
- unsigned long long ns;
-diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
-index ef772e5634d4..3e59a187fe30 100644
---- a/arch/x86/kvm/svm.c
-+++ b/arch/x86/kvm/svm.c
-@@ -436,14 +436,18 @@ static inline struct kvm_svm *to_kvm_svm(struct kvm *kvm)
-
- static inline bool svm_sev_enabled(void)
- {
-- return max_sev_asid;
-+ return IS_ENABLED(CONFIG_KVM_AMD_SEV) ? max_sev_asid : 0;
- }
-
- static inline bool sev_guest(struct kvm *kvm)
- {
-+#ifdef CONFIG_KVM_AMD_SEV
- struct kvm_sev_info *sev = &to_kvm_svm(kvm)->sev_info;
-
- return sev->active;
-+#else
-+ return false;
-+#endif
- }
-
- static inline int sev_get_asid(struct kvm *kvm)
-diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
-index 32721ef9652d..9efe130ea2e6 100644
---- a/arch/x86/kvm/vmx.c
-+++ b/arch/x86/kvm/vmx.c
-@@ -819,6 +819,7 @@ struct nested_vmx {
-
- /* to migrate it to L2 if VM_ENTRY_LOAD_DEBUG_CONTROLS is off */
- u64 vmcs01_debugctl;
-+ u64 vmcs01_guest_bndcfgs;
-
- u16 vpid02;
- u16 last_vpid;
-@@ -3395,9 +3396,6 @@ static void nested_vmx_setup_ctls_msrs(struct nested_vmx_msrs *msrs, bool apicv)
- VM_EXIT_LOAD_IA32_EFER | VM_EXIT_SAVE_IA32_EFER |
- VM_EXIT_SAVE_VMX_PREEMPTION_TIMER | VM_EXIT_ACK_INTR_ON_EXIT;
-
-- if (kvm_mpx_supported())
-- msrs->exit_ctls_high |= VM_EXIT_CLEAR_BNDCFGS;
--
- /* We support free control of debug control saving. */
- msrs->exit_ctls_low &= ~VM_EXIT_SAVE_DEBUG_CONTROLS;
-
-@@ -3414,8 +3412,6 @@ static void nested_vmx_setup_ctls_msrs(struct nested_vmx_msrs *msrs, bool apicv)
- VM_ENTRY_LOAD_IA32_PAT;
- msrs->entry_ctls_high |=
- (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR | VM_ENTRY_LOAD_IA32_EFER);
-- if (kvm_mpx_supported())
-- msrs->entry_ctls_high |= VM_ENTRY_LOAD_BNDCFGS;
-
- /* We support free control of debug control loading. */
- msrs->entry_ctls_low &= ~VM_ENTRY_LOAD_DEBUG_CONTROLS;
-@@ -10825,6 +10821,23 @@ static void nested_vmx_cr_fixed1_bits_update(struct kvm_vcpu *vcpu)
- #undef cr4_fixed1_update
- }
-
-+static void nested_vmx_entry_exit_ctls_update(struct kvm_vcpu *vcpu)
-+{
-+ struct vcpu_vmx *vmx = to_vmx(vcpu);
-+
-+ if (kvm_mpx_supported()) {
-+ bool mpx_enabled = guest_cpuid_has(vcpu, X86_FEATURE_MPX);
-+
-+ if (mpx_enabled) {
-+ vmx->nested.msrs.entry_ctls_high |= VM_ENTRY_LOAD_BNDCFGS;
-+ vmx->nested.msrs.exit_ctls_high |= VM_EXIT_CLEAR_BNDCFGS;
-+ } else {
-+ vmx->nested.msrs.entry_ctls_high &= ~VM_ENTRY_LOAD_BNDCFGS;
-+ vmx->nested.msrs.exit_ctls_high &= ~VM_EXIT_CLEAR_BNDCFGS;
-+ }
-+ }
-+}
-+
- static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
- {
- struct vcpu_vmx *vmx = to_vmx(vcpu);
-@@ -10841,8 +10854,10 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
- to_vmx(vcpu)->msr_ia32_feature_control_valid_bits &=
- ~FEATURE_CONTROL_VMXON_ENABLED_OUTSIDE_SMX;
-
-- if (nested_vmx_allowed(vcpu))
-+ if (nested_vmx_allowed(vcpu)) {
- nested_vmx_cr_fixed1_bits_update(vcpu);
-+ nested_vmx_entry_exit_ctls_update(vcpu);
-+ }
- }
-
- static void vmx_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry)
-@@ -11553,8 +11568,13 @@ static void prepare_vmcs02_full(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
-
- set_cr4_guest_host_mask(vmx);
-
-- if (vmx_mpx_supported())
-- vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs);
-+ if (kvm_mpx_supported()) {
-+ if (vmx->nested.nested_run_pending &&
-+ (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS))
-+ vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs);
-+ else
-+ vmcs_write64(GUEST_BNDCFGS, vmx->nested.vmcs01_guest_bndcfgs);
-+ }
-
- if (enable_vpid) {
- if (nested_cpu_has_vpid(vmcs12) && vmx->nested.vpid02)
-@@ -12068,6 +12088,9 @@ static int enter_vmx_non_root_mode(struct kvm_vcpu *vcpu)
-
- if (!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS))
- vmx->nested.vmcs01_debugctl = vmcs_read64(GUEST_IA32_DEBUGCTL);
-+ if (kvm_mpx_supported() &&
-+ !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS))
-+ vmx->nested.vmcs01_guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS);
-
- vmx_switch_vmcs(vcpu, &vmx->nested.vmcs02);
- vmx_segment_cache_clear(vmx);
-diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
-index 97fcac34e007..3cd58a5eb449 100644
---- a/arch/x86/kvm/x86.c
-+++ b/arch/x86/kvm/x86.c
-@@ -4625,7 +4625,7 @@ static void kvm_init_msr_list(void)
- */
- switch (msrs_to_save[i]) {
- case MSR_IA32_BNDCFGS:
-- if (!kvm_x86_ops->mpx_supported())
-+ if (!kvm_mpx_supported())
- continue;
- break;
- case MSR_TSC_AUX:
-diff --git a/drivers/clk/mvebu/armada-37xx-periph.c b/drivers/clk/mvebu/armada-37xx-periph.c
-index 6f7637b19738..e764dfdea53f 100644
---- a/drivers/clk/mvebu/armada-37xx-periph.c
-+++ b/drivers/clk/mvebu/armada-37xx-periph.c
-@@ -419,7 +419,6 @@ static unsigned int armada_3700_pm_dvfs_get_cpu_parent(struct regmap *base)
- static u8 clk_pm_cpu_get_parent(struct clk_hw *hw)
- {
- struct clk_pm_cpu *pm_cpu = to_clk_pm_cpu(hw);
-- int num_parents = clk_hw_get_num_parents(hw);
- u32 val;
-
- if (armada_3700_pm_dvfs_is_enabled(pm_cpu->nb_pm_base)) {
-diff --git a/drivers/clk/sunxi-ng/ccu-sun4i-a10.c b/drivers/clk/sunxi-ng/ccu-sun4i-a10.c
-index ffa5dac221e4..129ebd2588fd 100644
---- a/drivers/clk/sunxi-ng/ccu-sun4i-a10.c
-+++ b/drivers/clk/sunxi-ng/ccu-sun4i-a10.c
-@@ -1434,8 +1434,16 @@ static void __init sun4i_ccu_init(struct device_node *node,
- return;
- }
-
-- /* Force the PLL-Audio-1x divider to 1 */
- val = readl(reg + SUN4I_PLL_AUDIO_REG);
-+
-+ /*
-+ * Force VCO and PLL bias current to lowest setting. Higher
-+ * settings interfere with sigma-delta modulation and result
-+ * in audible noise and distortions when using SPDIF or I2S.
-+ */
-+ val &= ~GENMASK(25, 16);
-+
-+ /* Force the PLL-Audio-1x divider to 1 */
- val &= ~GENMASK(29, 26);
- writel(val | (1 << 26), reg + SUN4I_PLL_AUDIO_REG);
-
-diff --git a/drivers/gpio/gpio-mxs.c b/drivers/gpio/gpio-mxs.c
-index e2831ee70cdc..deb539b3316b 100644
---- a/drivers/gpio/gpio-mxs.c
-+++ b/drivers/gpio/gpio-mxs.c
-@@ -18,8 +18,6 @@
- #include <linux/platform_device.h>
- #include <linux/slab.h>
- #include <linux/gpio/driver.h>
--/* FIXME: for gpio_get_value(), replace this by direct register read */
--#include <linux/gpio.h>
- #include <linux/module.h>
-
- #define MXS_SET 0x4
-@@ -86,7 +84,7 @@ static int mxs_gpio_set_irq_type(struct irq_data *d, unsigned int type)
- port->both_edges &= ~pin_mask;
- switch (type) {
- case IRQ_TYPE_EDGE_BOTH:
-- val = gpio_get_value(port->gc.base + d->hwirq);
-+ val = port->gc.get(&port->gc, d->hwirq);
- if (val)
- edge = GPIO_INT_FALL_EDGE;
- else
-diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
-index 06dce16e22bb..70f0dedca59f 100644
---- a/drivers/gpio/gpiolib.c
-+++ b/drivers/gpio/gpiolib.c
-@@ -1675,7 +1675,8 @@ static void gpiochip_set_cascaded_irqchip(struct gpio_chip *gpiochip,
- irq_set_chained_handler_and_data(parent_irq, parent_handler,
- gpiochip);
-
-- gpiochip->irq.parents = &parent_irq;
-+ gpiochip->irq.parent_irq = parent_irq;
-+ gpiochip->irq.parents = &gpiochip->irq.parent_irq;
- gpiochip->irq.num_parents = 1;
- }
-
-diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
-index e484d0a94bdc..5b9cc3aeaa55 100644
---- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
-+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
-@@ -4494,12 +4494,18 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
- }
- spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
-
-- /* Signal HW programming completion */
-- drm_atomic_helper_commit_hw_done(state);
-
- if (wait_for_vblank)
- drm_atomic_helper_wait_for_flip_done(dev, state);
-
-+ /*
-+ * FIXME:
-+ * Delay hw_done() until flip_done() is signaled. This is to block
-+ * another commit from freeing the CRTC state while we're still
-+ * waiting on flip_done.
-+ */
-+ drm_atomic_helper_commit_hw_done(state);
-+
- drm_atomic_helper_cleanup_planes(dev, state);
-
- /* Finally, drop a runtime PM reference for each newly disabled CRTC,
-diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
-index c7b4481c90d7..d74d9a8cde2a 100644
---- a/drivers/gpu/drm/drm_edid.c
-+++ b/drivers/gpu/drm/drm_edid.c
-@@ -113,6 +113,9 @@ static const struct edid_quirk {
- /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */
- { "AEO", 0, EDID_QUIRK_FORCE_6BPC },
-
-+ /* BOE model on HP Pavilion 15-n233sl reports 8 bpc, but is a 6 bpc panel */
-+ { "BOE", 0x78b, EDID_QUIRK_FORCE_6BPC },
-+
- /* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */
- { "CPT", 0x17df, EDID_QUIRK_FORCE_6BPC },
-
-@@ -4279,7 +4282,7 @@ static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector,
- struct drm_hdmi_info *hdmi = &connector->display_info.hdmi;
-
- dc_mask = db[7] & DRM_EDID_YCBCR420_DC_MASK;
-- hdmi->y420_dc_modes |= dc_mask;
-+ hdmi->y420_dc_modes = dc_mask;
- }
-
- static void drm_parse_hdmi_forum_vsdb(struct drm_connector *connector,
-diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
-index 2ee1eaa66188..1ebac724fe7b 100644
---- a/drivers/gpu/drm/drm_fb_helper.c
-+++ b/drivers/gpu/drm/drm_fb_helper.c
-@@ -1561,6 +1561,25 @@ int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,
- }
- EXPORT_SYMBOL(drm_fb_helper_ioctl);
-
-+static bool drm_fb_pixel_format_equal(const struct fb_var_screeninfo *var_1,
-+ const struct fb_var_screeninfo *var_2)
-+{
-+ return var_1->bits_per_pixel == var_2->bits_per_pixel &&
-+ var_1->grayscale == var_2->grayscale &&
-+ var_1->red.offset == var_2->red.offset &&
-+ var_1->red.length == var_2->red.length &&
-+ var_1->red.msb_right == var_2->red.msb_right &&
-+ var_1->green.offset == var_2->green.offset &&
-+ var_1->green.length == var_2->green.length &&
-+ var_1->green.msb_right == var_2->green.msb_right &&
-+ var_1->blue.offset == var_2->blue.offset &&
-+ var_1->blue.length == var_2->blue.length &&
-+ var_1->blue.msb_right == var_2->blue.msb_right &&
-+ var_1->transp.offset == var_2->transp.offset &&
-+ var_1->transp.length == var_2->transp.length &&
-+ var_1->transp.msb_right == var_2->transp.msb_right;
-+}
-+
- /**
- * drm_fb_helper_check_var - implementation for &fb_ops.fb_check_var
- * @var: screeninfo to check
-@@ -1571,7 +1590,6 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
- {
- struct drm_fb_helper *fb_helper = info->par;
- struct drm_framebuffer *fb = fb_helper->fb;
-- int depth;
-
- if (var->pixclock != 0 || in_dbg_master())
- return -EINVAL;
-@@ -1591,72 +1609,15 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
- return -EINVAL;
- }
-
-- switch (var->bits_per_pixel) {
-- case 16:
-- depth = (var->green.length == 6) ? 16 : 15;
-- break;
-- case 32:
-- depth = (var->transp.length > 0) ? 32 : 24;
-- break;
-- default:
-- depth = var->bits_per_pixel;
-- break;
-- }
--
-- switch (depth) {
-- case 8:
-- var->red.offset = 0;
-- var->green.offset = 0;
-- var->blue.offset = 0;
-- var->red.length = 8;
-- var->green.length = 8;
-- var->blue.length = 8;
-- var->transp.length = 0;
-- var->transp.offset = 0;
-- break;
-- case 15:
-- var->red.offset = 10;
-- var->green.offset = 5;
-- var->blue.offset = 0;
-- var->red.length = 5;
-- var->green.length = 5;
-- var->blue.length = 5;
-- var->transp.length = 1;
-- var->transp.offset = 15;
-- break;
-- case 16:
-- var->red.offset = 11;
-- var->green.offset = 5;
-- var->blue.offset = 0;
-- var->red.length = 5;
-- var->green.length = 6;
-- var->blue.length = 5;
-- var->transp.length = 0;
-- var->transp.offset = 0;
-- break;
-- case 24:
-- var->red.offset = 16;
-- var->green.offset = 8;
-- var->blue.offset = 0;
-- var->red.length = 8;
-- var->green.length = 8;
-- var->blue.length = 8;
-- var->transp.length = 0;
-- var->transp.offset = 0;
-- break;
-- case 32:
-- var->red.offset = 16;
-- var->green.offset = 8;
-- var->blue.offset = 0;
-- var->red.length = 8;
-- var->green.length = 8;
-- var->blue.length = 8;
-- var->transp.length = 8;
-- var->transp.offset = 24;
-- break;
-- default:
-+ /*
-+ * drm fbdev emulation doesn't support changing the pixel format at all,
-+ * so reject all pixel format changing requests.
-+ */
-+ if (!drm_fb_pixel_format_equal(var, &info->var)) {
-+ DRM_DEBUG("fbdev emulation doesn't support changing the pixel format\n");
- return -EINVAL;
- }
-+
- return 0;
- }
- EXPORT_SYMBOL(drm_fb_helper_check_var);
-diff --git a/drivers/gpu/drm/i2c/tda9950.c b/drivers/gpu/drm/i2c/tda9950.c
-index 3f7396caad48..ccd355d0c123 100644
---- a/drivers/gpu/drm/i2c/tda9950.c
-+++ b/drivers/gpu/drm/i2c/tda9950.c
-@@ -188,7 +188,8 @@ static irqreturn_t tda9950_irq(int irq, void *data)
- break;
- }
- /* TDA9950 executes all retries for us */
-- tx_status |= CEC_TX_STATUS_MAX_RETRIES;
-+ if (tx_status != CEC_TX_STATUS_OK)
-+ tx_status |= CEC_TX_STATUS_MAX_RETRIES;
- cec_transmit_done(priv->adap, tx_status, arb_lost_cnt,
- nack_cnt, 0, err_cnt);
- break;
-@@ -307,7 +308,7 @@ static void tda9950_release(struct tda9950_priv *priv)
- /* Wait up to .5s for it to signal non-busy */
- do {
- csr = tda9950_read(client, REG_CSR);
-- if (!(csr & CSR_BUSY) || --timeout)
-+ if (!(csr & CSR_BUSY) || !--timeout)
- break;
- msleep(10);
- } while (1);
-diff --git a/drivers/gpu/drm/sun4i/sun4i_dotclock.c b/drivers/gpu/drm/sun4i/sun4i_dotclock.c
-index e36004fbe453..2a15f2f9271e 100644
---- a/drivers/gpu/drm/sun4i/sun4i_dotclock.c
-+++ b/drivers/gpu/drm/sun4i/sun4i_dotclock.c
-@@ -81,9 +81,19 @@ static long sun4i_dclk_round_rate(struct clk_hw *hw, unsigned long rate,
- int i;
-
- for (i = tcon->dclk_min_div; i <= tcon->dclk_max_div; i++) {
-- unsigned long ideal = rate * i;
-+ u64 ideal = (u64)rate * i;
- unsigned long rounded;
-
-+ /*
-+ * ideal has overflowed the max value that can be stored in an
-+ * unsigned long, and every clk operation we might do on a
-+ * truncated u64 value will give us incorrect results.
-+ * Let's just stop there since bigger dividers will result in
-+ * the same overflow issue.
-+ */
-+ if (ideal > ULONG_MAX)
-+ goto out;
-+
- rounded = clk_hw_round_rate(clk_hw_get_parent(hw),
- ideal);
-
-diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
-index eee6b79fb131..ae5b72269e27 100644
---- a/drivers/hid/hid-ids.h
-+++ b/drivers/hid/hid-ids.h
-@@ -974,7 +974,6 @@
- #define USB_DEVICE_ID_SIS817_TOUCH 0x0817
- #define USB_DEVICE_ID_SIS_TS 0x1013
- #define USB_DEVICE_ID_SIS1030_TOUCH 0x1030
--#define USB_DEVICE_ID_SIS10FB_TOUCH 0x10fb
-
- #define USB_VENDOR_ID_SKYCABLE 0x1223
- #define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07
-diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
-index 37013b58098c..d17cf6e323b2 100644
---- a/drivers/hid/i2c-hid/i2c-hid.c
-+++ b/drivers/hid/i2c-hid/i2c-hid.c
-@@ -47,8 +47,7 @@
- /* quirks to control the device */
- #define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV BIT(0)
- #define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET BIT(1)
--#define I2C_HID_QUIRK_RESEND_REPORT_DESCR BIT(2)
--#define I2C_HID_QUIRK_NO_RUNTIME_PM BIT(3)
-+#define I2C_HID_QUIRK_NO_RUNTIME_PM BIT(2)
-
- /* flags */
- #define I2C_HID_STARTED 0
-@@ -172,8 +171,6 @@ static const struct i2c_hid_quirks {
- { I2C_VENDOR_ID_HANTICK, I2C_PRODUCT_ID_HANTICK_5288,
- I2C_HID_QUIRK_NO_IRQ_AFTER_RESET |
- I2C_HID_QUIRK_NO_RUNTIME_PM },
-- { USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS10FB_TOUCH,
-- I2C_HID_QUIRK_RESEND_REPORT_DESCR },
- { 0, 0 }
- };
-
-@@ -1241,22 +1238,13 @@ static int i2c_hid_resume(struct device *dev)
-
- /* Instead of resetting device, simply powers the device on. This
- * solves "incomplete reports" on Raydium devices 2386:3118 and
-- * 2386:4B33
-+ * 2386:4B33 and fixes various SIS touchscreens no longer sending
-+ * data after a suspend/resume.
- */
- ret = i2c_hid_set_power(client, I2C_HID_PWR_ON);
- if (ret)
- return ret;
-
-- /* Some devices need to re-send report descr cmd
-- * after resume, after this it will be back normal.
-- * otherwise it issues too many incomplete reports.
-- */
-- if (ihid->quirks & I2C_HID_QUIRK_RESEND_REPORT_DESCR) {
-- ret = i2c_hid_command(client, &hid_report_descr_cmd, NULL, 0);
-- if (ret)
-- return ret;
-- }
--
- if (hid->driver && hid->driver->reset_resume) {
- ret = hid->driver->reset_resume(hid);
- return ret;
-diff --git a/drivers/infiniband/core/ucm.c b/drivers/infiniband/core/ucm.c
-index 9eef96dacbd7..d93a719d25c1 100644
---- a/drivers/infiniband/core/ucm.c
-+++ b/drivers/infiniband/core/ucm.c
-@@ -46,6 +46,8 @@
- #include <linux/mutex.h>
- #include <linux/slab.h>
-
-+#include <linux/nospec.h>
-+
- #include <linux/uaccess.h>
-
- #include <rdma/ib.h>
-@@ -1123,6 +1125,7 @@ static ssize_t ib_ucm_write(struct file *filp, const char __user *buf,
-
- if (hdr.cmd >= ARRAY_SIZE(ucm_cmd_table))
- return -EINVAL;
-+ hdr.cmd = array_index_nospec(hdr.cmd, ARRAY_SIZE(ucm_cmd_table));
-
- if (hdr.in + sizeof(hdr) > len)
- return -EINVAL;
-diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c
-index 21863ddde63e..01d68ed46c1b 100644
---- a/drivers/infiniband/core/ucma.c
-+++ b/drivers/infiniband/core/ucma.c
-@@ -44,6 +44,8 @@
- #include <linux/module.h>
- #include <linux/nsproxy.h>
-
-+#include <linux/nospec.h>
-+
- #include <rdma/rdma_user_cm.h>
- #include <rdma/ib_marshall.h>
- #include <rdma/rdma_cm.h>
-@@ -1676,6 +1678,7 @@ static ssize_t ucma_write(struct file *filp, const char __user *buf,
-
- if (hdr.cmd >= ARRAY_SIZE(ucma_cmd_table))
- return -EINVAL;
-+ hdr.cmd = array_index_nospec(hdr.cmd, ARRAY_SIZE(ucma_cmd_table));
-
- if (hdr.in + sizeof(hdr) > len)
- return -EINVAL;
-diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
-index 308456d28afb..73339fd47dd8 100644
---- a/drivers/infiniband/hw/mlx5/mr.c
-+++ b/drivers/infiniband/hw/mlx5/mr.c
-@@ -544,6 +544,9 @@ void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
- int shrink = 0;
- int c;
-
-+ if (!mr->allocated_from_cache)
-+ return;
-+
- c = order2idx(dev, mr->order);
- if (c < 0 || c >= MAX_MR_CACHE_ENTRIES) {
- mlx5_ib_warn(dev, "order %d, cache index %d\n", mr->order, c);
-@@ -1647,18 +1650,19 @@ static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr)
- umem = NULL;
- }
- #endif
--
- clean_mr(dev, mr);
-
-+ /*
-+ * We should unregister the DMA address from the HCA before
-+ * remove the DMA mapping.
-+ */
-+ mlx5_mr_cache_free(dev, mr);
- if (umem) {
- ib_umem_release(umem);
- atomic_sub(npages, &dev->mdev->priv.reg_pages);
- }
--
- if (!mr->allocated_from_cache)
- kfree(mr);
-- else
-- mlx5_mr_cache_free(dev, mr);
- }
-
- int mlx5_ib_dereg_mr(struct ib_mr *ibmr)
-diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c
-index f5ae24865355..b0f9d19b3410 100644
---- a/drivers/input/mouse/elan_i2c_core.c
-+++ b/drivers/input/mouse/elan_i2c_core.c
-@@ -1346,6 +1346,7 @@ static const struct acpi_device_id elan_acpi_id[] = {
- { "ELAN0611", 0 },
- { "ELAN0612", 0 },
- { "ELAN0618", 0 },
-+ { "ELAN061C", 0 },
- { "ELAN061D", 0 },
- { "ELAN0622", 0 },
- { "ELAN1000", 0 },
-diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
-index f5cc517d1131..7e50e1d6f58c 100644
---- a/drivers/misc/eeprom/at24.c
-+++ b/drivers/misc/eeprom/at24.c
-@@ -478,6 +478,23 @@ static void at24_properties_to_pdata(struct device *dev,
- if (device_property_present(dev, "no-read-rollover"))
- chip->flags |= AT24_FLAG_NO_RDROL;
-
-+ err = device_property_read_u32(dev, "address-width", &val);
-+ if (!err) {
-+ switch (val) {
-+ case 8:
-+ if (chip->flags & AT24_FLAG_ADDR16)
-+ dev_warn(dev, "Override address width to be 8, while default is 16\n");
-+ chip->flags &= ~AT24_FLAG_ADDR16;
-+ break;
-+ case 16:
-+ chip->flags |= AT24_FLAG_ADDR16;
-+ break;
-+ default:
-+ dev_warn(dev, "Bad \"address-width\" property: %u\n",
-+ val);
-+ }
-+ }
-+
- err = device_property_read_u32(dev, "size", &val);
- if (!err)
- chip->byte_len = val;
-diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c
-index 9697977b80f0..6b9ad8673218 100644
---- a/drivers/net/bonding/bond_netlink.c
-+++ b/drivers/net/bonding/bond_netlink.c
-@@ -638,8 +638,7 @@ static int bond_fill_info(struct sk_buff *skb,
- goto nla_put_failure;
-
- if (nla_put(skb, IFLA_BOND_AD_ACTOR_SYSTEM,
-- sizeof(bond->params.ad_actor_system),
-- &bond->params.ad_actor_system))
-+ ETH_ALEN, &bond->params.ad_actor_system))
- goto nla_put_failure;
- }
- if (!bond_3ad_get_active_agg_info(bond, &info)) {
-diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
-index 1b01cd2820ba..000f0d42a710 100644
---- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
-+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
-@@ -1580,8 +1580,6 @@ static int ena_up_complete(struct ena_adapter *adapter)
- if (rc)
- return rc;
-
-- ena_init_napi(adapter);
--
- ena_change_mtu(adapter->netdev, adapter->netdev->mtu);
-
- ena_refill_all_rx_bufs(adapter);
-@@ -1735,6 +1733,13 @@ static int ena_up(struct ena_adapter *adapter)
-
- ena_setup_io_intr(adapter);
-
-+ /* napi poll functions should be initialized before running
-+ * request_irq(), to handle a rare condition where there is a pending
-+ * interrupt, causing the ISR to fire immediately while the poll
-+ * function wasn't set yet, causing a null dereference
-+ */
-+ ena_init_napi(adapter);
-+
- rc = ena_request_io_irq(adapter);
- if (rc)
- goto err_req_irq;
-@@ -2648,7 +2653,11 @@ static int ena_restore_device(struct ena_adapter *adapter)
- ena_free_mgmnt_irq(adapter);
- ena_disable_msix(adapter);
- err_device_destroy:
-+ ena_com_abort_admin_commands(ena_dev);
-+ ena_com_wait_for_abort_completion(ena_dev);
- ena_com_admin_destroy(ena_dev);
-+ ena_com_mmio_reg_read_request_destroy(ena_dev);
-+ ena_com_dev_reset(ena_dev, ENA_REGS_RESET_DRIVER_INVALID_STATE);
- err:
- clear_bit(ENA_FLAG_DEVICE_RUNNING, &adapter->flags);
- clear_bit(ENA_FLAG_ONGOING_RESET, &adapter->flags);
-@@ -3128,15 +3137,8 @@ static int ena_rss_init_default(struct ena_adapter *adapter)
-
- static void ena_release_bars(struct ena_com_dev *ena_dev, struct pci_dev *pdev)
- {
-- int release_bars;
--
-- if (ena_dev->mem_bar)
-- devm_iounmap(&pdev->dev, ena_dev->mem_bar);
--
-- if (ena_dev->reg_bar)
-- devm_iounmap(&pdev->dev, ena_dev->reg_bar);
-+ int release_bars = pci_select_bars(pdev, IORESOURCE_MEM) & ENA_BAR_MASK;
-
-- release_bars = pci_select_bars(pdev, IORESOURCE_MEM) & ENA_BAR_MASK;
- pci_release_selected_regions(pdev, release_bars);
- }
-
-diff --git a/drivers/net/ethernet/amd/declance.c b/drivers/net/ethernet/amd/declance.c
-index 116997a8b593..00332a1ea84b 100644
---- a/drivers/net/ethernet/amd/declance.c
-+++ b/drivers/net/ethernet/amd/declance.c
-@@ -1031,6 +1031,7 @@ static int dec_lance_probe(struct device *bdev, const int type)
- int i, ret;
- unsigned long esar_base;
- unsigned char *esar;
-+ const char *desc;
-
- if (dec_lance_debug && version_printed++ == 0)
- printk(version);
-@@ -1216,19 +1217,20 @@ static int dec_lance_probe(struct device *bdev, const int type)
- */
- switch (type) {
- case ASIC_LANCE:
-- printk("%s: IOASIC onboard LANCE", name);
-+ desc = "IOASIC onboard LANCE";
- break;
- case PMAD_LANCE:
-- printk("%s: PMAD-AA", name);
-+ desc = "PMAD-AA";
- break;
- case PMAX_LANCE:
-- printk("%s: PMAX onboard LANCE", name);
-+ desc = "PMAX onboard LANCE";
- break;
- }
- for (i = 0; i < 6; i++)
- dev->dev_addr[i] = esar[i * 4];
-
-- printk(", addr = %pM, irq = %d\n", dev->dev_addr, dev->irq);
-+ printk("%s: %s, addr = %pM, irq = %d\n",
-+ name, desc, dev->dev_addr, dev->irq);
-
- dev->netdev_ops = &lance_netdev_ops;
- dev->watchdog_timeo = 5*HZ;
-diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
-index 4241ae928d4a..34af5f1569c8 100644
---- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
-+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
-@@ -321,9 +321,12 @@ int bcmgenet_mii_probe(struct net_device *dev)
- phydev->advertising = phydev->supported;
-
- /* The internal PHY has its link interrupts routed to the
-- * Ethernet MAC ISRs
-+ * Ethernet MAC ISRs. On GENETv5 there is a hardware issue
-+ * that prevents the signaling of link UP interrupts when
-+ * the link operates at 10Mbps, so fallback to polling for
-+ * those versions of GENET.
- */
-- if (priv->internal_phy)
-+ if (priv->internal_phy && !GENET_IS_V5(priv))
- dev->phydev->irq = PHY_IGNORE_INTERRUPT;
-
- return 0;
-diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
-index dfa045f22ef1..db568232ff3e 100644
---- a/drivers/net/ethernet/cadence/macb_main.c
-+++ b/drivers/net/ethernet/cadence/macb_main.c
-@@ -2089,6 +2089,7 @@ static void macb_configure_dma(struct macb *bp)
- else
- dmacfg &= ~GEM_BIT(TXCOEN);
-
-+ dmacfg &= ~GEM_BIT(ADDR64);
- #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
- if (bp->hw_dma_cap & HW_DMA_CAP_64B)
- dmacfg |= GEM_BIT(ADDR64);
-diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-index a19172dbe6be..c34ea385fe4a 100644
---- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-+++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
-@@ -2159,6 +2159,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- return -EPERM;
- if (copy_from_user(&t, useraddr, sizeof(t)))
- return -EFAULT;
-+ if (t.cmd != CHELSIO_SET_QSET_PARAMS)
-+ return -EINVAL;
- if (t.qset_idx >= SGE_QSETS)
- return -EINVAL;
- if (!in_range(t.intr_lat, 0, M_NEWTIMER) ||
-@@ -2258,6 +2260,9 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- if (copy_from_user(&t, useraddr, sizeof(t)))
- return -EFAULT;
-
-+ if (t.cmd != CHELSIO_GET_QSET_PARAMS)
-+ return -EINVAL;
-+
- /* Display qsets for all ports when offload enabled */
- if (test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map)) {
- q1 = 0;
-@@ -2303,6 +2308,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- return -EBUSY;
- if (copy_from_user(&edata, useraddr, sizeof(edata)))
- return -EFAULT;
-+ if (edata.cmd != CHELSIO_SET_QSET_NUM)
-+ return -EINVAL;
- if (edata.val < 1 ||
- (edata.val > 1 && !(adapter->flags & USING_MSIX)))
- return -EINVAL;
-@@ -2343,6 +2350,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- return -EPERM;
- if (copy_from_user(&t, useraddr, sizeof(t)))
- return -EFAULT;
-+ if (t.cmd != CHELSIO_LOAD_FW)
-+ return -EINVAL;
- /* Check t.len sanity ? */
- fw_data = memdup_user(useraddr + sizeof(t), t.len);
- if (IS_ERR(fw_data))
-@@ -2366,6 +2375,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- return -EBUSY;
- if (copy_from_user(&m, useraddr, sizeof(m)))
- return -EFAULT;
-+ if (m.cmd != CHELSIO_SETMTUTAB)
-+ return -EINVAL;
- if (m.nmtus != NMTUS)
- return -EINVAL;
- if (m.mtus[0] < 81) /* accommodate SACK */
-@@ -2407,6 +2418,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- return -EBUSY;
- if (copy_from_user(&m, useraddr, sizeof(m)))
- return -EFAULT;
-+ if (m.cmd != CHELSIO_SET_PM)
-+ return -EINVAL;
- if (!is_power_of_2(m.rx_pg_sz) ||
- !is_power_of_2(m.tx_pg_sz))
- return -EINVAL; /* not power of 2 */
-@@ -2440,6 +2453,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- return -EIO; /* need the memory controllers */
- if (copy_from_user(&t, useraddr, sizeof(t)))
- return -EFAULT;
-+ if (t.cmd != CHELSIO_GET_MEM)
-+ return -EINVAL;
- if ((t.addr & 7) || (t.len & 7))
- return -EINVAL;
- if (t.mem_id == MEM_CM)
-@@ -2492,6 +2507,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
- return -EAGAIN;
- if (copy_from_user(&t, useraddr, sizeof(t)))
- return -EFAULT;
-+ if (t.cmd != CHELSIO_SET_TRACE_FILTER)
-+ return -EINVAL;
-
- tp = (const struct trace_params *)&t.sip;
- if (t.config_tx)
-diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
-index 8f755009ff38..c8445a4135a9 100644
---- a/drivers/net/ethernet/emulex/benet/be_main.c
-+++ b/drivers/net/ethernet/emulex/benet/be_main.c
-@@ -3915,8 +3915,6 @@ static int be_enable_vxlan_offloads(struct be_adapter *adapter)
- netdev->hw_enc_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
- NETIF_F_TSO | NETIF_F_TSO6 |
- NETIF_F_GSO_UDP_TUNNEL;
-- netdev->hw_features |= NETIF_F_GSO_UDP_TUNNEL;
-- netdev->features |= NETIF_F_GSO_UDP_TUNNEL;
-
- dev_info(dev, "Enabled VxLAN offloads for UDP port %d\n",
- be16_to_cpu(port));
-@@ -3938,8 +3936,6 @@ static void be_disable_vxlan_offloads(struct be_adapter *adapter)
- adapter->vxlan_port = 0;
-
- netdev->hw_enc_features = 0;
-- netdev->hw_features &= ~(NETIF_F_GSO_UDP_TUNNEL);
-- netdev->features &= ~(NETIF_F_GSO_UDP_TUNNEL);
- }
-
- static void be_calculate_vf_res(struct be_adapter *adapter, u16 num_vfs,
-@@ -5232,6 +5228,7 @@ static void be_netdev_init(struct net_device *netdev)
- struct be_adapter *adapter = netdev_priv(netdev);
-
- netdev->hw_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 |
-+ NETIF_F_GSO_UDP_TUNNEL |
- NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
- NETIF_F_HW_VLAN_CTAG_TX;
- if ((be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS))
-diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
-index 4778b663653e..bf80855dd0dd 100644
---- a/drivers/net/ethernet/freescale/fec.h
-+++ b/drivers/net/ethernet/freescale/fec.h
-@@ -452,6 +452,10 @@ struct bufdesc_ex {
- * initialisation.
- */
- #define FEC_QUIRK_MIB_CLEAR (1 << 15)
-+/* Only i.MX25/i.MX27/i.MX28 controller supports FRBR,FRSR registers,
-+ * those FIFO receive registers are resolved in other platforms.
-+ */
-+#define FEC_QUIRK_HAS_FRREG (1 << 16)
-
- struct bufdesc_prop {
- int qid;
-diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
-index c729665107f5..11f90bb2d2a9 100644
---- a/drivers/net/ethernet/freescale/fec_main.c
-+++ b/drivers/net/ethernet/freescale/fec_main.c
-@@ -90,14 +90,16 @@ static struct platform_device_id fec_devtype[] = {
- .driver_data = 0,
- }, {
- .name = "imx25-fec",
-- .driver_data = FEC_QUIRK_USE_GASKET | FEC_QUIRK_MIB_CLEAR,
-+ .driver_data = FEC_QUIRK_USE_GASKET | FEC_QUIRK_MIB_CLEAR |
-+ FEC_QUIRK_HAS_FRREG,
- }, {
- .name = "imx27-fec",
-- .driver_data = FEC_QUIRK_MIB_CLEAR,
-+ .driver_data = FEC_QUIRK_MIB_CLEAR | FEC_QUIRK_HAS_FRREG,
- }, {
- .name = "imx28-fec",
- .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME |
-- FEC_QUIRK_SINGLE_MDIO | FEC_QUIRK_HAS_RACC,
-+ FEC_QUIRK_SINGLE_MDIO | FEC_QUIRK_HAS_RACC |
-+ FEC_QUIRK_HAS_FRREG,
- }, {
- .name = "imx6q-fec",
- .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
-@@ -1157,7 +1159,7 @@ static void fec_enet_timeout_work(struct work_struct *work)
- napi_disable(&fep->napi);
- netif_tx_lock_bh(ndev);
- fec_restart(ndev);
-- netif_wake_queue(ndev);
-+ netif_tx_wake_all_queues(ndev);
- netif_tx_unlock_bh(ndev);
- napi_enable(&fep->napi);
- }
-@@ -1272,7 +1274,7 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
-
- /* Since we have freed up a buffer, the ring is no longer full
- */
-- if (netif_queue_stopped(ndev)) {
-+ if (netif_tx_queue_stopped(nq)) {
- entries_free = fec_enet_get_free_txdesc_num(txq);
- if (entries_free >= txq->tx_wake_threshold)
- netif_tx_wake_queue(nq);
-@@ -1745,7 +1747,7 @@ static void fec_enet_adjust_link(struct net_device *ndev)
- napi_disable(&fep->napi);
- netif_tx_lock_bh(ndev);
- fec_restart(ndev);
-- netif_wake_queue(ndev);
-+ netif_tx_wake_all_queues(ndev);
- netif_tx_unlock_bh(ndev);
- napi_enable(&fep->napi);
- }
-@@ -2163,7 +2165,13 @@ static void fec_enet_get_regs(struct net_device *ndev,
- memset(buf, 0, regs->len);
-
- for (i = 0; i < ARRAY_SIZE(fec_enet_register_offset); i++) {
-- off = fec_enet_register_offset[i] / 4;
-+ off = fec_enet_register_offset[i];
-+
-+ if ((off == FEC_R_BOUND || off == FEC_R_FSTART) &&
-+ !(fep->quirks & FEC_QUIRK_HAS_FRREG))
-+ continue;
-+
-+ off >>= 2;
- buf[off] = readl(&theregs[off]);
- }
- }
-@@ -2246,7 +2254,7 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
- napi_disable(&fep->napi);
- netif_tx_lock_bh(ndev);
- fec_restart(ndev);
-- netif_wake_queue(ndev);
-+ netif_tx_wake_all_queues(ndev);
- netif_tx_unlock_bh(ndev);
- napi_enable(&fep->napi);
- }
-diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
-index d3a1dd20e41d..fb6c72cf70a0 100644
---- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
-+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
-@@ -429,10 +429,9 @@ static inline u16 mlx5e_icosq_wrap_cnt(struct mlx5e_icosq *sq)
-
- static inline void mlx5e_fill_icosq_frag_edge(struct mlx5e_icosq *sq,
- struct mlx5_wq_cyc *wq,
-- u16 pi, u16 frag_pi)
-+ u16 pi, u16 nnops)
- {
- struct mlx5e_sq_wqe_info *edge_wi, *wi = &sq->db.ico_wqe[pi];
-- u8 nnops = mlx5_wq_cyc_get_frag_size(wq) - frag_pi;
-
- edge_wi = wi + nnops;
-
-@@ -451,15 +450,14 @@ static int mlx5e_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
- struct mlx5_wq_cyc *wq = &sq->wq;
- struct mlx5e_umr_wqe *umr_wqe;
- u16 xlt_offset = ix << (MLX5E_LOG_ALIGNED_MPWQE_PPW - 1);
-- u16 pi, frag_pi;
-+ u16 pi, contig_wqebbs_room;
- int err;
- int i;
-
- pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
-- frag_pi = mlx5_wq_cyc_ctr2fragix(wq, sq->pc);
--
-- if (unlikely(frag_pi + MLX5E_UMR_WQEBBS > mlx5_wq_cyc_get_frag_size(wq))) {
-- mlx5e_fill_icosq_frag_edge(sq, wq, pi, frag_pi);
-+ contig_wqebbs_room = mlx5_wq_cyc_get_contig_wqebbs(wq, pi);
-+ if (unlikely(contig_wqebbs_room < MLX5E_UMR_WQEBBS)) {
-+ mlx5e_fill_icosq_frag_edge(sq, wq, pi, contig_wqebbs_room);
- pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
- }
-
-@@ -693,43 +691,15 @@ static inline bool is_last_ethertype_ip(struct sk_buff *skb, int *network_depth)
- return (ethertype == htons(ETH_P_IP) || ethertype == htons(ETH_P_IPV6));
- }
-
--static __be32 mlx5e_get_fcs(struct sk_buff *skb)
-+static u32 mlx5e_get_fcs(const struct sk_buff *skb)
- {
-- int last_frag_sz, bytes_in_prev, nr_frags;
-- u8 *fcs_p1, *fcs_p2;
-- skb_frag_t *last_frag;
-- __be32 fcs_bytes;
--
-- if (!skb_is_nonlinear(skb))
-- return *(__be32 *)(skb->data + skb->len - ETH_FCS_LEN);
--
-- nr_frags = skb_shinfo(skb)->nr_frags;
-- last_frag = &skb_shinfo(skb)->frags[nr_frags - 1];
-- last_frag_sz = skb_frag_size(last_frag);
--
-- /* If all FCS data is in last frag */
-- if (last_frag_sz >= ETH_FCS_LEN)
-- return *(__be32 *)(skb_frag_address(last_frag) +
-- last_frag_sz - ETH_FCS_LEN);
--
-- fcs_p2 = (u8 *)skb_frag_address(last_frag);
-- bytes_in_prev = ETH_FCS_LEN - last_frag_sz;
--
-- /* Find where the other part of the FCS is - Linear or another frag */
-- if (nr_frags == 1) {
-- fcs_p1 = skb_tail_pointer(skb);
-- } else {
-- skb_frag_t *prev_frag = &skb_shinfo(skb)->frags[nr_frags - 2];
--
-- fcs_p1 = skb_frag_address(prev_frag) +
-- skb_frag_size(prev_frag);
-- }
-- fcs_p1 -= bytes_in_prev;
-+ const void *fcs_bytes;
-+ u32 _fcs_bytes;
-
-- memcpy(&fcs_bytes, fcs_p1, bytes_in_prev);
-- memcpy(((u8 *)&fcs_bytes) + bytes_in_prev, fcs_p2, last_frag_sz);
-+ fcs_bytes = skb_header_pointer(skb, skb->len - ETH_FCS_LEN,
-+ ETH_FCS_LEN, &_fcs_bytes);
-
-- return fcs_bytes;
-+ return __get_unaligned_cpu32(fcs_bytes);
- }
-
- static inline void mlx5e_handle_csum(struct net_device *netdev,
-@@ -762,8 +732,9 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,
- network_depth - ETH_HLEN,
- skb->csum);
- if (unlikely(netdev->features & NETIF_F_RXFCS))
-- skb->csum = csum_add(skb->csum,
-- (__force __wsum)mlx5e_get_fcs(skb));
-+ skb->csum = csum_block_add(skb->csum,
-+ (__force __wsum)mlx5e_get_fcs(skb),
-+ skb->len - ETH_FCS_LEN);
- stats->csum_complete++;
- return;
- }
-diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
-index f29deb44bf3b..1e774d979c85 100644
---- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
-+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
-@@ -287,10 +287,9 @@ mlx5e_txwqe_build_dsegs(struct mlx5e_txqsq *sq, struct sk_buff *skb,
-
- static inline void mlx5e_fill_sq_frag_edge(struct mlx5e_txqsq *sq,
- struct mlx5_wq_cyc *wq,
-- u16 pi, u16 frag_pi)
-+ u16 pi, u16 nnops)
- {
- struct mlx5e_tx_wqe_info *edge_wi, *wi = &sq->db.wqe_info[pi];
-- u8 nnops = mlx5_wq_cyc_get_frag_size(wq) - frag_pi;
-
- edge_wi = wi + nnops;
-
-@@ -345,8 +344,8 @@ netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
- struct mlx5e_tx_wqe_info *wi;
-
- struct mlx5e_sq_stats *stats = sq->stats;
-+ u16 headlen, ihs, contig_wqebbs_room;
- u16 ds_cnt, ds_cnt_inl = 0;
-- u16 headlen, ihs, frag_pi;
- u8 num_wqebbs, opcode;
- u32 num_bytes;
- int num_dma;
-@@ -383,9 +382,9 @@ netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
- }
-
- num_wqebbs = DIV_ROUND_UP(ds_cnt, MLX5_SEND_WQEBB_NUM_DS);
-- frag_pi = mlx5_wq_cyc_ctr2fragix(wq, sq->pc);
-- if (unlikely(frag_pi + num_wqebbs > mlx5_wq_cyc_get_frag_size(wq))) {
-- mlx5e_fill_sq_frag_edge(sq, wq, pi, frag_pi);
-+ contig_wqebbs_room = mlx5_wq_cyc_get_contig_wqebbs(wq, pi);
-+ if (unlikely(contig_wqebbs_room < num_wqebbs)) {
-+ mlx5e_fill_sq_frag_edge(sq, wq, pi, contig_wqebbs_room);
- mlx5e_sq_fetch_wqe(sq, &wqe, &pi);
- }
-
-@@ -629,7 +628,7 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
- struct mlx5e_tx_wqe_info *wi;
-
- struct mlx5e_sq_stats *stats = sq->stats;
-- u16 headlen, ihs, pi, frag_pi;
-+ u16 headlen, ihs, pi, contig_wqebbs_room;
- u16 ds_cnt, ds_cnt_inl = 0;
- u8 num_wqebbs, opcode;
- u32 num_bytes;
-@@ -665,13 +664,14 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
- }
-
- num_wqebbs = DIV_ROUND_UP(ds_cnt, MLX5_SEND_WQEBB_NUM_DS);
-- frag_pi = mlx5_wq_cyc_ctr2fragix(wq, sq->pc);
-- if (unlikely(frag_pi + num_wqebbs > mlx5_wq_cyc_get_frag_size(wq))) {
-+ pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
-+ contig_wqebbs_room = mlx5_wq_cyc_get_contig_wqebbs(wq, pi);
-+ if (unlikely(contig_wqebbs_room < num_wqebbs)) {
-+ mlx5e_fill_sq_frag_edge(sq, wq, pi, contig_wqebbs_room);
- pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
-- mlx5e_fill_sq_frag_edge(sq, wq, pi, frag_pi);
- }
-
-- mlx5i_sq_fetch_wqe(sq, &wqe, &pi);
-+ mlx5i_sq_fetch_wqe(sq, &wqe, pi);
-
- /* fill wqe */
- wi = &sq->db.wqe_info[pi];
-diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
-index 406c23862f5f..01ccc8201052 100644
---- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
-+++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
-@@ -269,7 +269,7 @@ static void eq_pf_process(struct mlx5_eq *eq)
- case MLX5_PFAULT_SUBTYPE_WQE:
- /* WQE based event */
- pfault->type =
-- be32_to_cpu(pf_eqe->wqe.pftype_wq) >> 24;
-+ (be32_to_cpu(pf_eqe->wqe.pftype_wq) >> 24) & 0x7;
- pfault->token =
- be32_to_cpu(pf_eqe->wqe.token);
- pfault->wqe.wq_num =
-diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c
-index 5645a4facad2..b8ee9101c506 100644
---- a/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c
-+++ b/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c
-@@ -245,7 +245,7 @@ static void *mlx5_fpga_ipsec_cmd_exec(struct mlx5_core_dev *mdev,
- return ERR_PTR(res);
- }
-
-- /* Context will be freed by wait func after completion */
-+ /* Context should be freed by the caller after completion. */
- return context;
- }
-
-@@ -418,10 +418,8 @@ static int mlx5_fpga_ipsec_set_caps(struct mlx5_core_dev *mdev, u32 flags)
- cmd.cmd = htonl(MLX5_FPGA_IPSEC_CMD_OP_SET_CAP);
- cmd.flags = htonl(flags);
- context = mlx5_fpga_ipsec_cmd_exec(mdev, &cmd, sizeof(cmd));
-- if (IS_ERR(context)) {
-- err = PTR_ERR(context);
-- goto out;
-- }
-+ if (IS_ERR(context))
-+ return PTR_ERR(context);
-
- err = mlx5_fpga_ipsec_cmd_wait(context);
- if (err)
-@@ -435,6 +433,7 @@ static int mlx5_fpga_ipsec_set_caps(struct mlx5_core_dev *mdev, u32 flags)
- }
-
- out:
-+ kfree(context);
- return err;
- }
-
-diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h
-index 08eac92fc26c..0982c579ec74 100644
---- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h
-+++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.h
-@@ -109,12 +109,11 @@ struct mlx5i_tx_wqe {
-
- static inline void mlx5i_sq_fetch_wqe(struct mlx5e_txqsq *sq,
- struct mlx5i_tx_wqe **wqe,
-- u16 *pi)
-+ u16 pi)
- {
- struct mlx5_wq_cyc *wq = &sq->wq;
-
-- *pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
-- *wqe = mlx5_wq_cyc_get_wqe(wq, *pi);
-+ *wqe = mlx5_wq_cyc_get_wqe(wq, pi);
- memset(*wqe, 0, sizeof(**wqe));
- }
-
-diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wq.c b/drivers/net/ethernet/mellanox/mlx5/core/wq.c
-index d838af9539b1..9046475c531c 100644
---- a/drivers/net/ethernet/mellanox/mlx5/core/wq.c
-+++ b/drivers/net/ethernet/mellanox/mlx5/core/wq.c
-@@ -39,11 +39,6 @@ u32 mlx5_wq_cyc_get_size(struct mlx5_wq_cyc *wq)
- return (u32)wq->fbc.sz_m1 + 1;
- }
-
--u16 mlx5_wq_cyc_get_frag_size(struct mlx5_wq_cyc *wq)
--{
-- return wq->fbc.frag_sz_m1 + 1;
--}
--
- u32 mlx5_cqwq_get_size(struct mlx5_cqwq *wq)
- {
- return wq->fbc.sz_m1 + 1;
-diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wq.h b/drivers/net/ethernet/mellanox/mlx5/core/wq.h
-index 16476cc1a602..311256554520 100644
---- a/drivers/net/ethernet/mellanox/mlx5/core/wq.h
-+++ b/drivers/net/ethernet/mellanox/mlx5/core/wq.h
-@@ -80,7 +80,6 @@ int mlx5_wq_cyc_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
- void *wqc, struct mlx5_wq_cyc *wq,
- struct mlx5_wq_ctrl *wq_ctrl);
- u32 mlx5_wq_cyc_get_size(struct mlx5_wq_cyc *wq);
--u16 mlx5_wq_cyc_get_frag_size(struct mlx5_wq_cyc *wq);
-
- int mlx5_wq_qp_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
- void *qpc, struct mlx5_wq_qp *wq,
-@@ -140,11 +139,6 @@ static inline u16 mlx5_wq_cyc_ctr2ix(struct mlx5_wq_cyc *wq, u16 ctr)
- return ctr & wq->fbc.sz_m1;
- }
-
--static inline u16 mlx5_wq_cyc_ctr2fragix(struct mlx5_wq_cyc *wq, u16 ctr)
--{
-- return ctr & wq->fbc.frag_sz_m1;
--}
--
- static inline u16 mlx5_wq_cyc_get_head(struct mlx5_wq_cyc *wq)
- {
- return mlx5_wq_cyc_ctr2ix(wq, wq->wqe_ctr);
-@@ -160,6 +154,11 @@ static inline void *mlx5_wq_cyc_get_wqe(struct mlx5_wq_cyc *wq, u16 ix)
- return mlx5_frag_buf_get_wqe(&wq->fbc, ix);
- }
-
-+static inline u16 mlx5_wq_cyc_get_contig_wqebbs(struct mlx5_wq_cyc *wq, u16 ix)
-+{
-+ return mlx5_frag_buf_get_idx_last_contig_stride(&wq->fbc, ix) - ix + 1;
-+}
-+
- static inline int mlx5_wq_cyc_cc_bigger(u16 cc1, u16 cc2)
- {
- int equal = (cc1 == cc2);
-diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
-index f9c724752a32..13636a537f37 100644
---- a/drivers/net/ethernet/mellanox/mlxsw/core.c
-+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
-@@ -985,8 +985,8 @@ static int mlxsw_devlink_core_bus_device_reload(struct devlink *devlink,
- mlxsw_core->bus,
- mlxsw_core->bus_priv, true,
- devlink);
-- if (err)
-- mlxsw_core->reload_fail = true;
-+ mlxsw_core->reload_fail = !!err;
-+
- return err;
- }
-
-@@ -1126,8 +1126,15 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
- const char *device_kind = mlxsw_core->bus_info->device_kind;
- struct devlink *devlink = priv_to_devlink(mlxsw_core);
-
-- if (mlxsw_core->reload_fail)
-- goto reload_fail;
-+ if (mlxsw_core->reload_fail) {
-+ if (!reload)
-+ /* Only the parts that were not de-initialized in the
-+ * failed reload attempt need to be de-initialized.
-+ */
-+ goto reload_fail_deinit;
-+ else
-+ return;
-+ }
-
- if (mlxsw_core->driver->fini)
- mlxsw_core->driver->fini(mlxsw_core);
-@@ -1140,9 +1147,12 @@ void mlxsw_core_bus_device_unregister(struct mlxsw_core *mlxsw_core,
- if (!reload)
- devlink_resources_unregister(devlink, NULL);
- mlxsw_core->bus->fini(mlxsw_core->bus_priv);
-- if (reload)
-- return;
--reload_fail:
-+
-+ return;
-+
-+reload_fail_deinit:
-+ devlink_unregister(devlink);
-+ devlink_resources_unregister(devlink, NULL);
- devlink_free(devlink);
- mlxsw_core_driver_put(device_kind);
- }
-diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
-index 6cb43dda8232..9883e48d8a21 100644
---- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
-+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
-@@ -2307,8 +2307,6 @@ static void mlxsw_sp_switchdev_event_work(struct work_struct *work)
- break;
- case SWITCHDEV_FDB_DEL_TO_DEVICE:
- fdb_info = &switchdev_work->fdb_info;
-- if (!fdb_info->added_by_user)
-- break;
- mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, false);
- break;
- case SWITCHDEV_FDB_ADD_TO_BRIDGE: /* fall through */
-diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
-index 90a2b53096e2..51bbb0e5b514 100644
---- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
-+++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
-@@ -1710,7 +1710,7 @@ qed_iwarp_parse_rx_pkt(struct qed_hwfn *p_hwfn,
-
- cm_info->local_ip[0] = ntohl(iph->daddr);
- cm_info->remote_ip[0] = ntohl(iph->saddr);
-- cm_info->ip_version = TCP_IPV4;
-+ cm_info->ip_version = QED_TCP_IPV4;
-
- ip_hlen = (iph->ihl) * sizeof(u32);
- *payload_len = ntohs(iph->tot_len) - ip_hlen;
-@@ -1730,7 +1730,7 @@ qed_iwarp_parse_rx_pkt(struct qed_hwfn *p_hwfn,
- cm_info->remote_ip[i] =
- ntohl(ip6h->saddr.in6_u.u6_addr32[i]);
- }
-- cm_info->ip_version = TCP_IPV6;
-+ cm_info->ip_version = QED_TCP_IPV6;
-
- ip_hlen = sizeof(*ip6h);
- *payload_len = ntohs(ip6h->payload_len);
-diff --git a/drivers/net/ethernet/qlogic/qed/qed_roce.c b/drivers/net/ethernet/qlogic/qed/qed_roce.c
-index b5ce1581645f..79424e6f0976 100644
---- a/drivers/net/ethernet/qlogic/qed/qed_roce.c
-+++ b/drivers/net/ethernet/qlogic/qed/qed_roce.c
-@@ -138,23 +138,16 @@ static void qed_rdma_copy_gids(struct qed_rdma_qp *qp, __le32 *src_gid,
-
- static enum roce_flavor qed_roce_mode_to_flavor(enum roce_mode roce_mode)
- {
-- enum roce_flavor flavor;
--
- switch (roce_mode) {
- case ROCE_V1:
-- flavor = PLAIN_ROCE;
-- break;
-+ return PLAIN_ROCE;
- case ROCE_V2_IPV4:
-- flavor = RROCE_IPV4;
-- break;
-+ return RROCE_IPV4;
- case ROCE_V2_IPV6:
-- flavor = ROCE_V2_IPV6;
-- break;
-+ return RROCE_IPV6;
- default:
-- flavor = MAX_ROCE_MODE;
-- break;
-+ return MAX_ROCE_FLAVOR;
- }
-- return flavor;
- }
-
- void qed_roce_free_cid_pair(struct qed_hwfn *p_hwfn, u16 cid)
-diff --git a/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c b/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c
-index 8de644b4721e..77b6248ad3b9 100644
---- a/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c
-+++ b/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c
-@@ -154,7 +154,7 @@ qed_set_pf_update_tunn_mode(struct qed_tunnel_info *p_tun,
- static void qed_set_tunn_cls_info(struct qed_tunnel_info *p_tun,
- struct qed_tunnel_info *p_src)
- {
-- enum tunnel_clss type;
-+ int type;
-
- p_tun->b_update_rx_cls = p_src->b_update_rx_cls;
- p_tun->b_update_tx_cls = p_src->b_update_tx_cls;
-diff --git a/drivers/net/ethernet/qlogic/qed/qed_vf.c b/drivers/net/ethernet/qlogic/qed/qed_vf.c
-index be6ddde1a104..c4766e4ac485 100644
---- a/drivers/net/ethernet/qlogic/qed/qed_vf.c
-+++ b/drivers/net/ethernet/qlogic/qed/qed_vf.c
-@@ -413,7 +413,6 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn)
- }
-
- if (!p_iov->b_pre_fp_hsi &&
-- ETH_HSI_VER_MINOR &&
- (resp->pfdev_info.minor_fp_hsi < ETH_HSI_VER_MINOR)) {
- DP_INFO(p_hwfn,
- "PF is using older fastpath HSI; %02x.%02x is configured\n",
-@@ -572,7 +571,7 @@ int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn)
- static void
- __qed_vf_prep_tunn_req_tlv(struct vfpf_update_tunn_param_tlv *p_req,
- struct qed_tunn_update_type *p_src,
-- enum qed_tunn_clss mask, u8 *p_cls)
-+ enum qed_tunn_mode mask, u8 *p_cls)
- {
- if (p_src->b_update_mode) {
- p_req->tun_mode_update_mask |= BIT(mask);
-@@ -587,7 +586,7 @@ __qed_vf_prep_tunn_req_tlv(struct vfpf_update_tunn_param_tlv *p_req,
- static void
- qed_vf_prep_tunn_req_tlv(struct vfpf_update_tunn_param_tlv *p_req,
- struct qed_tunn_update_type *p_src,
-- enum qed_tunn_clss mask,
-+ enum qed_tunn_mode mask,
- u8 *p_cls, struct qed_tunn_update_udp_port *p_port,
- u8 *p_update_port, u16 *p_udp_port)
- {
-diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
-index 627c5cd8f786..f18087102d40 100644
---- a/drivers/net/ethernet/realtek/r8169.c
-+++ b/drivers/net/ethernet/realtek/r8169.c
-@@ -7044,17 +7044,15 @@ static int rtl8169_poll(struct napi_struct *napi, int budget)
- struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
- struct net_device *dev = tp->dev;
- u16 enable_mask = RTL_EVENT_NAPI | tp->event_slow;
-- int work_done= 0;
-+ int work_done;
- u16 status;
-
- status = rtl_get_events(tp);
- rtl_ack_events(tp, status & ~tp->event_slow);
-
-- if (status & RTL_EVENT_NAPI_RX)
-- work_done = rtl_rx(dev, tp, (u32) budget);
-+ work_done = rtl_rx(dev, tp, (u32) budget);
-
-- if (status & RTL_EVENT_NAPI_TX)
-- rtl_tx(dev, tp);
-+ rtl_tx(dev, tp);
-
- if (status & tp->event_slow) {
- enable_mask &= ~tp->event_slow;
-diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
-index 5df1a608e566..541602d70c24 100644
---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
-@@ -133,7 +133,7 @@ static int stmmac_mdio_write(struct mii_bus *bus, int phyaddr, int phyreg,
- */
- int stmmac_mdio_reset(struct mii_bus *bus)
- {
--#if defined(CONFIG_STMMAC_PLATFORM)
-+#if IS_ENABLED(CONFIG_STMMAC_PLATFORM)
- struct net_device *ndev = bus->priv;
- struct stmmac_priv *priv = netdev_priv(ndev);
- unsigned int mii_address = priv->hw->mii.addr;
-diff --git a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c
-index 16ec7af6ab7b..ba9df430fca6 100644
---- a/drivers/net/hamradio/yam.c
-+++ b/drivers/net/hamradio/yam.c
-@@ -966,6 +966,8 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
- sizeof(struct yamdrv_ioctl_mcs));
- if (IS_ERR(ym))
- return PTR_ERR(ym);
-+ if (ym->cmd != SIOCYAMSMCS)
-+ return -EINVAL;
- if (ym->bitrate > YAM_MAXBITRATE) {
- kfree(ym);
- return -EINVAL;
-@@ -981,6 +983,8 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
- if (copy_from_user(&yi, ifr->ifr_data, sizeof(struct yamdrv_ioctl_cfg)))
- return -EFAULT;
-
-+ if (yi.cmd != SIOCYAMSCFG)
-+ return -EINVAL;
- if ((yi.cfg.mask & YAM_IOBASE) && netif_running(dev))
- return -EINVAL; /* Cannot change this parameter when up */
- if ((yi.cfg.mask & YAM_IRQ) && netif_running(dev))
-diff --git a/drivers/net/usb/asix_common.c b/drivers/net/usb/asix_common.c
-index e95dd12edec4..023b8d0bf175 100644
---- a/drivers/net/usb/asix_common.c
-+++ b/drivers/net/usb/asix_common.c
-@@ -607,6 +607,9 @@ int asix_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
- struct usbnet *dev = netdev_priv(net);
- u8 opt = 0;
-
-+ if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC))
-+ return -EINVAL;
-+
- if (wolinfo->wolopts & WAKE_PHY)
- opt |= AX_MONITOR_LINK;
- if (wolinfo->wolopts & WAKE_MAGIC)
-diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
-index 9e8ad372f419..2207f7a7d1ff 100644
---- a/drivers/net/usb/ax88179_178a.c
-+++ b/drivers/net/usb/ax88179_178a.c
-@@ -566,6 +566,9 @@ ax88179_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
- struct usbnet *dev = netdev_priv(net);
- u8 opt = 0;
-
-+ if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC))
-+ return -EINVAL;
-+
- if (wolinfo->wolopts & WAKE_PHY)
- opt |= AX_MONITOR_MODE_RWLC;
- if (wolinfo->wolopts & WAKE_MAGIC)
-diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
-index aeca484a75b8..2bb3a081ff10 100644
---- a/drivers/net/usb/lan78xx.c
-+++ b/drivers/net/usb/lan78xx.c
-@@ -1401,19 +1401,10 @@ static int lan78xx_set_wol(struct net_device *netdev,
- if (ret < 0)
- return ret;
-
-- pdata->wol = 0;
-- if (wol->wolopts & WAKE_UCAST)
-- pdata->wol |= WAKE_UCAST;
-- if (wol->wolopts & WAKE_MCAST)
-- pdata->wol |= WAKE_MCAST;
-- if (wol->wolopts & WAKE_BCAST)
-- pdata->wol |= WAKE_BCAST;
-- if (wol->wolopts & WAKE_MAGIC)
-- pdata->wol |= WAKE_MAGIC;
-- if (wol->wolopts & WAKE_PHY)
-- pdata->wol |= WAKE_PHY;
-- if (wol->wolopts & WAKE_ARP)
-- pdata->wol |= WAKE_ARP;
-+ if (wol->wolopts & ~WAKE_ALL)
-+ return -EINVAL;
-+
-+ pdata->wol = wol->wolopts;
-
- device_set_wakeup_enable(&dev->udev->dev, (bool)wol->wolopts);
-
-diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
-index 1b07bb5e110d..9a55d75f7f10 100644
---- a/drivers/net/usb/r8152.c
-+++ b/drivers/net/usb/r8152.c
-@@ -4503,6 +4503,9 @@ static int rtl8152_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
- if (!rtl_can_wakeup(tp))
- return -EOPNOTSUPP;
-
-+ if (wol->wolopts & ~WAKE_ANY)
-+ return -EINVAL;
-+
- ret = usb_autopm_get_interface(tp->intf);
- if (ret < 0)
- goto out_set_wol;
-diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
-index b64b1ee56d2d..ec287c9741e8 100644
---- a/drivers/net/usb/smsc75xx.c
-+++ b/drivers/net/usb/smsc75xx.c
-@@ -731,6 +731,9 @@ static int smsc75xx_ethtool_set_wol(struct net_device *net,
- struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
- int ret;
-
-+ if (wolinfo->wolopts & ~SUPPORTED_WAKE)
-+ return -EINVAL;
-+
- pdata->wolopts = wolinfo->wolopts & SUPPORTED_WAKE;
-
- ret = device_set_wakeup_enable(&dev->udev->dev, pdata->wolopts);
-diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
-index 06b4d290784d..262e7a3c23cb 100644
---- a/drivers/net/usb/smsc95xx.c
-+++ b/drivers/net/usb/smsc95xx.c
-@@ -774,6 +774,9 @@ static int smsc95xx_ethtool_set_wol(struct net_device *net,
- struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
- int ret;
-
-+ if (wolinfo->wolopts & ~SUPPORTED_WAKE)
-+ return -EINVAL;
-+
- pdata->wolopts = wolinfo->wolopts & SUPPORTED_WAKE;
-
- ret = device_set_wakeup_enable(&dev->udev->dev, pdata->wolopts);
-diff --git a/drivers/net/usb/sr9800.c b/drivers/net/usb/sr9800.c
-index 9277a0f228df..35f39f23d881 100644
---- a/drivers/net/usb/sr9800.c
-+++ b/drivers/net/usb/sr9800.c
-@@ -421,6 +421,9 @@ sr_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
- struct usbnet *dev = netdev_priv(net);
- u8 opt = 0;
-
-+ if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC))
-+ return -EINVAL;
-+
- if (wolinfo->wolopts & WAKE_PHY)
- opt |= SR_MONITOR_LINK;
- if (wolinfo->wolopts & WAKE_MAGIC)
-diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
-index 2b6ec927809e..500e2d8f10bc 100644
---- a/drivers/net/virtio_net.c
-+++ b/drivers/net/virtio_net.c
-@@ -2162,8 +2162,9 @@ static void virtnet_freeze_down(struct virtio_device *vdev)
- /* Make sure no work handler is accessing the device */
- flush_work(&vi->config_work);
-
-+ netif_tx_lock_bh(vi->dev);
- netif_device_detach(vi->dev);
-- netif_tx_disable(vi->dev);
-+ netif_tx_unlock_bh(vi->dev);
- cancel_delayed_work_sync(&vi->refill);
-
- if (netif_running(vi->dev)) {
-@@ -2199,7 +2200,9 @@ static int virtnet_restore_up(struct virtio_device *vdev)
- }
- }
-
-+ netif_tx_lock_bh(vi->dev);
- netif_device_attach(vi->dev);
-+ netif_tx_unlock_bh(vi->dev);
- return err;
- }
-
-diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
-index 80e2c8595c7c..58dd217811c8 100644
---- a/drivers/net/wireless/mac80211_hwsim.c
-+++ b/drivers/net/wireless/mac80211_hwsim.c
-@@ -519,7 +519,6 @@ struct mac80211_hwsim_data {
- int channels, idx;
- bool use_chanctx;
- bool destroy_on_close;
-- struct work_struct destroy_work;
- u32 portid;
- char alpha2[2];
- const struct ieee80211_regdomain *regd;
-@@ -2812,8 +2811,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
- hwsim_radios_generation++;
- spin_unlock_bh(&hwsim_radio_lock);
-
-- if (idx > 0)
-- hwsim_mcast_new_radio(idx, info, param);
-+ hwsim_mcast_new_radio(idx, info, param);
-
- return idx;
-
-@@ -3442,30 +3440,27 @@ static struct genl_family hwsim_genl_family __ro_after_init = {
- .n_mcgrps = ARRAY_SIZE(hwsim_mcgrps),
- };
-
--static void destroy_radio(struct work_struct *work)
--{
-- struct mac80211_hwsim_data *data =
-- container_of(work, struct mac80211_hwsim_data, destroy_work);
--
-- hwsim_radios_generation++;
-- mac80211_hwsim_del_radio(data, wiphy_name(data->hw->wiphy), NULL);
--}
--
- static void remove_user_radios(u32 portid)
- {
- struct mac80211_hwsim_data *entry, *tmp;
-+ LIST_HEAD(list);
-
- spin_lock_bh(&hwsim_radio_lock);
- list_for_each_entry_safe(entry, tmp, &hwsim_radios, list) {
- if (entry->destroy_on_close && entry->portid == portid) {
-- list_del(&entry->list);
-+ list_move(&entry->list, &list);
- rhashtable_remove_fast(&hwsim_radios_rht, &entry->rht,
- hwsim_rht_params);
-- INIT_WORK(&entry->destroy_work, destroy_radio);
-- queue_work(hwsim_wq, &entry->destroy_work);
-+ hwsim_radios_generation++;
- }
- }
- spin_unlock_bh(&hwsim_radio_lock);
-+
-+ list_for_each_entry_safe(entry, tmp, &list, list) {
-+ list_del(&entry->list);
-+ mac80211_hwsim_del_radio(entry, wiphy_name(entry->hw->wiphy),
-+ NULL);
-+ }
- }
-
- static int mac80211_hwsim_netlink_notify(struct notifier_block *nb,
-@@ -3523,6 +3518,7 @@ static __net_init int hwsim_init_net(struct net *net)
- static void __net_exit hwsim_exit_net(struct net *net)
- {
- struct mac80211_hwsim_data *data, *tmp;
-+ LIST_HEAD(list);
-
- spin_lock_bh(&hwsim_radio_lock);
- list_for_each_entry_safe(data, tmp, &hwsim_radios, list) {
-@@ -3533,17 +3529,19 @@ static void __net_exit hwsim_exit_net(struct net *net)
- if (data->netgroup == hwsim_net_get_netgroup(&init_net))
- continue;
-
-- list_del(&data->list);
-+ list_move(&data->list, &list);
- rhashtable_remove_fast(&hwsim_radios_rht, &data->rht,
- hwsim_rht_params);
- hwsim_radios_generation++;
-- spin_unlock_bh(&hwsim_radio_lock);
-+ }
-+ spin_unlock_bh(&hwsim_radio_lock);
-+
-+ list_for_each_entry_safe(data, tmp, &list, list) {
-+ list_del(&data->list);
- mac80211_hwsim_del_radio(data,
- wiphy_name(data->hw->wiphy),
- NULL);
-- spin_lock_bh(&hwsim_radio_lock);
- }
-- spin_unlock_bh(&hwsim_radio_lock);
-
- ida_simple_remove(&hwsim_netgroup_ida, hwsim_net_get_netgroup(net));
- }
-diff --git a/drivers/net/wireless/marvell/libertas/if_sdio.c b/drivers/net/wireless/marvell/libertas/if_sdio.c
-index 43743c26c071..39bf85d0ade0 100644
---- a/drivers/net/wireless/marvell/libertas/if_sdio.c
-+++ b/drivers/net/wireless/marvell/libertas/if_sdio.c
-@@ -1317,6 +1317,10 @@ static int if_sdio_suspend(struct device *dev)
- if (priv->wol_criteria == EHS_REMOVE_WAKEUP) {
- dev_info(dev, "Suspend without wake params -- powering down card\n");
- if (priv->fw_ready) {
-+ ret = lbs_suspend(priv);
-+ if (ret)
-+ return ret;
-+
- priv->power_up_on_resume = true;
- if_sdio_power_off(card);
- }
-diff --git a/drivers/ptp/ptp_chardev.c b/drivers/ptp/ptp_chardev.c
-index 01b0e2bb3319..2012551d93e0 100644
---- a/drivers/ptp/ptp_chardev.c
-+++ b/drivers/ptp/ptp_chardev.c
-@@ -24,6 +24,8 @@
- #include <linux/slab.h>
- #include <linux/timekeeping.h>
-
-+#include <linux/nospec.h>
-+
- #include "ptp_private.h"
-
- static int ptp_disable_pinfunc(struct ptp_clock_info *ops,
-@@ -248,6 +250,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
- err = -EINVAL;
- break;
- }
-+ pin_index = array_index_nospec(pin_index, ops->n_pins);
- if (mutex_lock_interruptible(&ptp->pincfg_mux))
- return -ERESTARTSYS;
- pd = ops->pin_config[pin_index];
-@@ -266,6 +269,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
- err = -EINVAL;
- break;
- }
-+ pin_index = array_index_nospec(pin_index, ops->n_pins);
- if (mutex_lock_interruptible(&ptp->pincfg_mux))
- return -ERESTARTSYS;
- err = ptp_set_pinfunc(ptp, pin_index, pd.func, pd.chan);
-diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
-index 3e18a68c2b03..054e66d93ed6 100644
---- a/drivers/scsi/qedi/qedi_main.c
-+++ b/drivers/scsi/qedi/qedi_main.c
-@@ -2472,6 +2472,7 @@ static int __qedi_probe(struct pci_dev *pdev, int mode)
- /* start qedi context */
- spin_lock_init(&qedi->hba_lock);
- spin_lock_init(&qedi->task_idx_lock);
-+ mutex_init(&qedi->stats_lock);
- }
- qedi_ops->ll2->register_cb_ops(qedi->cdev, &qedi_ll2_cb_ops, qedi);
- qedi_ops->ll2->start(qedi->cdev, &params);
-diff --git a/drivers/soc/fsl/qbman/qman.c b/drivers/soc/fsl/qbman/qman.c
-index ecb22749df0b..8cc015183043 100644
---- a/drivers/soc/fsl/qbman/qman.c
-+++ b/drivers/soc/fsl/qbman/qman.c
-@@ -2729,6 +2729,9 @@ static int qman_alloc_range(struct gen_pool *p, u32 *result, u32 cnt)
- {
- unsigned long addr;
-
-+ if (!p)
-+ return -ENODEV;
-+
- addr = gen_pool_alloc(p, cnt);
- if (!addr)
- return -ENOMEM;
-diff --git a/drivers/soc/fsl/qe/ucc.c b/drivers/soc/fsl/qe/ucc.c
-index c646d8713861..681f7d4b7724 100644
---- a/drivers/soc/fsl/qe/ucc.c
-+++ b/drivers/soc/fsl/qe/ucc.c
-@@ -626,7 +626,7 @@ static u32 ucc_get_tdm_sync_shift(enum comm_dir mode, u32 tdm_num)
- {
- u32 shift;
-
-- shift = (mode == COMM_DIR_RX) ? RX_SYNC_SHIFT_BASE : RX_SYNC_SHIFT_BASE;
-+ shift = (mode == COMM_DIR_RX) ? RX_SYNC_SHIFT_BASE : TX_SYNC_SHIFT_BASE;
- shift -= tdm_num * 2;
-
- return shift;
-diff --git a/drivers/thunderbolt/icm.c b/drivers/thunderbolt/icm.c
-index 500911f16498..5bad9fdec5f8 100644
---- a/drivers/thunderbolt/icm.c
-+++ b/drivers/thunderbolt/icm.c
-@@ -653,14 +653,6 @@ icm_fr_xdomain_connected(struct tb *tb, const struct icm_pkg_header *hdr)
- bool approved;
- u64 route;
-
-- /*
-- * After NVM upgrade adding root switch device fails because we
-- * initiated reset. During that time ICM might still send
-- * XDomain connected message which we ignore here.
-- */
-- if (!tb->root_switch)
-- return;
--
- link = pkg->link_info & ICM_LINK_INFO_LINK_MASK;
- depth = (pkg->link_info & ICM_LINK_INFO_DEPTH_MASK) >>
- ICM_LINK_INFO_DEPTH_SHIFT;
-@@ -950,14 +942,6 @@ icm_tr_device_connected(struct tb *tb, const struct icm_pkg_header *hdr)
- if (pkg->hdr.packet_id)
- return;
-
-- /*
-- * After NVM upgrade adding root switch device fails because we
-- * initiated reset. During that time ICM might still send device
-- * connected message which we ignore here.
-- */
-- if (!tb->root_switch)
-- return;
--
- route = get_route(pkg->route_hi, pkg->route_lo);
- authorized = pkg->link_info & ICM_LINK_INFO_APPROVED;
- security_level = (pkg->hdr.flags & ICM_FLAGS_SLEVEL_MASK) >>
-@@ -1317,19 +1301,26 @@ static void icm_handle_notification(struct work_struct *work)
-
- mutex_lock(&tb->lock);
-
-- switch (n->pkg->code) {
-- case ICM_EVENT_DEVICE_CONNECTED:
-- icm->device_connected(tb, n->pkg);
-- break;
-- case ICM_EVENT_DEVICE_DISCONNECTED:
-- icm->device_disconnected(tb, n->pkg);
-- break;
-- case ICM_EVENT_XDOMAIN_CONNECTED:
-- icm->xdomain_connected(tb, n->pkg);
-- break;
-- case ICM_EVENT_XDOMAIN_DISCONNECTED:
-- icm->xdomain_disconnected(tb, n->pkg);
-- break;
-+ /*
-+ * When the domain is stopped we flush its workqueue but before
-+ * that the root switch is removed. In that case we should treat
-+ * the queued events as being canceled.
-+ */
-+ if (tb->root_switch) {
-+ switch (n->pkg->code) {
-+ case ICM_EVENT_DEVICE_CONNECTED:
-+ icm->device_connected(tb, n->pkg);
-+ break;
-+ case ICM_EVENT_DEVICE_DISCONNECTED:
-+ icm->device_disconnected(tb, n->pkg);
-+ break;
-+ case ICM_EVENT_XDOMAIN_CONNECTED:
-+ icm->xdomain_connected(tb, n->pkg);
-+ break;
-+ case ICM_EVENT_XDOMAIN_DISCONNECTED:
-+ icm->xdomain_disconnected(tb, n->pkg);
-+ break;
-+ }
- }
-
- mutex_unlock(&tb->lock);
-diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
-index f5a33e88e676..2d042150e41c 100644
---- a/drivers/thunderbolt/nhi.c
-+++ b/drivers/thunderbolt/nhi.c
-@@ -1147,5 +1147,5 @@ static void __exit nhi_unload(void)
- tb_domain_exit();
- }
-
--fs_initcall(nhi_init);
-+rootfs_initcall(nhi_init);
- module_exit(nhi_unload);
-diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
-index af842000188c..a25f6ea5c784 100644
---- a/drivers/tty/serial/8250/8250_dw.c
-+++ b/drivers/tty/serial/8250/8250_dw.c
-@@ -576,10 +576,6 @@ static int dw8250_probe(struct platform_device *pdev)
- if (!data->skip_autocfg)
- dw8250_setup_port(p);
-
--#ifdef CONFIG_PM
-- uart.capabilities |= UART_CAP_RPM;
--#endif
--
- /* If we have a valid fifosize, try hooking up DMA */
- if (p->fifosize) {
- data->dma.rxconf.src_maxburst = p->fifosize / 4;
-diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
-index 84f52774810a..b61d101894ef 100644
---- a/drivers/usb/class/cdc-acm.c
-+++ b/drivers/usb/class/cdc-acm.c
-@@ -309,17 +309,17 @@ static void acm_process_notification(struct acm *acm, unsigned char *buf)
-
- if (difference & ACM_CTRL_DSR)
- acm->iocount.dsr++;
-- if (difference & ACM_CTRL_BRK)
-- acm->iocount.brk++;
-- if (difference & ACM_CTRL_RI)
-- acm->iocount.rng++;
- if (difference & ACM_CTRL_DCD)
- acm->iocount.dcd++;
-- if (difference & ACM_CTRL_FRAMING)
-+ if (newctrl & ACM_CTRL_BRK)
-+ acm->iocount.brk++;
-+ if (newctrl & ACM_CTRL_RI)
-+ acm->iocount.rng++;
-+ if (newctrl & ACM_CTRL_FRAMING)
- acm->iocount.frame++;
-- if (difference & ACM_CTRL_PARITY)
-+ if (newctrl & ACM_CTRL_PARITY)
- acm->iocount.parity++;
-- if (difference & ACM_CTRL_OVERRUN)
-+ if (newctrl & ACM_CTRL_OVERRUN)
- acm->iocount.overrun++;
- spin_unlock(&acm->read_lock);
-
-@@ -354,7 +354,6 @@ static void acm_ctrl_irq(struct urb *urb)
- case -ENOENT:
- case -ESHUTDOWN:
- /* this urb is terminated, clean up */
-- acm->nb_index = 0;
- dev_dbg(&acm->control->dev,
- "%s - urb shutting down with status: %d\n",
- __func__, status);
-@@ -1642,6 +1641,7 @@ static int acm_pre_reset(struct usb_interface *intf)
- struct acm *acm = usb_get_intfdata(intf);
-
- clear_bit(EVENT_RX_STALL, &acm->flags);
-+ acm->nb_index = 0; /* pending control transfers are lost */
-
- return 0;
- }
-diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
-index e1e0c90ce569..2e66711dac9c 100644
---- a/drivers/usb/core/devio.c
-+++ b/drivers/usb/core/devio.c
-@@ -1473,8 +1473,6 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb
- u = 0;
- switch (uurb->type) {
- case USBDEVFS_URB_TYPE_CONTROL:
-- if (is_in)
-- allow_short = true;
- if (!usb_endpoint_xfer_control(&ep->desc))
- return -EINVAL;
- /* min 8 byte setup packet */
-@@ -1504,6 +1502,8 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb
- is_in = 0;
- uurb->endpoint &= ~USB_DIR_IN;
- }
-+ if (is_in)
-+ allow_short = true;
- snoop(&ps->dev->dev, "control urb: bRequestType=%02x "
- "bRequest=%02x wValue=%04x "
- "wIndex=%04x wLength=%04x\n",
-diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c
-index acecd13dcbd9..b29620e5df83 100644
---- a/drivers/usb/gadget/function/f_mass_storage.c
-+++ b/drivers/usb/gadget/function/f_mass_storage.c
-@@ -222,6 +222,8 @@
- #include <linux/usb/gadget.h>
- #include <linux/usb/composite.h>
-
-+#include <linux/nospec.h>
-+
- #include "configfs.h"
-
-
-@@ -3171,6 +3173,7 @@ static struct config_group *fsg_lun_make(struct config_group *group,
- fsg_opts = to_fsg_opts(&group->cg_item);
- if (num >= FSG_MAX_LUNS)
- return ERR_PTR(-ERANGE);
-+ num = array_index_nospec(num, FSG_MAX_LUNS);
-
- mutex_lock(&fsg_opts->lock);
- if (fsg_opts->refcnt || fsg_opts->common->luns[num]) {
-diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
-index 722860eb5a91..51dd8e00c4f8 100644
---- a/drivers/usb/host/xhci-pci.c
-+++ b/drivers/usb/host/xhci-pci.c
-@@ -179,10 +179,12 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
- xhci->quirks |= XHCI_PME_STUCK_QUIRK;
- }
- if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
-- pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI) {
-+ pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI)
- xhci->quirks |= XHCI_SSIC_PORT_UNUSED;
-+ if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
-+ (pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI ||
-+ pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI))
- xhci->quirks |= XHCI_INTEL_USB_ROLE_SW;
-- }
- if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
- (pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI ||
- pdev->device == PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI ||
-diff --git a/drivers/usb/roles/intel-xhci-usb-role-switch.c b/drivers/usb/roles/intel-xhci-usb-role-switch.c
-index 1fb3dd0f1dfa..277de96181f9 100644
---- a/drivers/usb/roles/intel-xhci-usb-role-switch.c
-+++ b/drivers/usb/roles/intel-xhci-usb-role-switch.c
-@@ -161,6 +161,8 @@ static int intel_xhci_usb_remove(struct platform_device *pdev)
- {
- struct intel_xhci_usb_data *data = platform_get_drvdata(pdev);
-
-+ pm_runtime_disable(&pdev->dev);
-+
- usb_role_switch_unregister(data->role_sw);
- return 0;
- }
-diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c
-index d11f3f8dad40..1e592ec94ba4 100644
---- a/drivers/usb/usbip/vhci_hcd.c
-+++ b/drivers/usb/usbip/vhci_hcd.c
-@@ -318,8 +318,9 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
- struct vhci_hcd *vhci_hcd;
- struct vhci *vhci;
- int retval = 0;
-- int rhport;
-+ int rhport = -1;
- unsigned long flags;
-+ bool invalid_rhport = false;
-
- u32 prev_port_status[VHCI_HC_PORTS];
-
-@@ -334,9 +335,19 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
- usbip_dbg_vhci_rh("typeReq %x wValue %x wIndex %x\n", typeReq, wValue,
- wIndex);
-
-- if (wIndex > VHCI_HC_PORTS)
-- pr_err("invalid port number %d\n", wIndex);
-- rhport = wIndex - 1;
-+ /*
-+ * wIndex can be 0 for some request types (typeReq). rhport is
-+ * in valid range when wIndex >= 1 and < VHCI_HC_PORTS.
-+ *
-+ * Reference port_status[] only with valid rhport when
-+ * invalid_rhport is false.
-+ */
-+ if (wIndex < 1 || wIndex > VHCI_HC_PORTS) {
-+ invalid_rhport = true;
-+ if (wIndex > VHCI_HC_PORTS)
-+ pr_err("invalid port number %d\n", wIndex);
-+ } else
-+ rhport = wIndex - 1;
-
- vhci_hcd = hcd_to_vhci_hcd(hcd);
- vhci = vhci_hcd->vhci;
-@@ -345,8 +356,9 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
-
- /* store old status and compare now and old later */
- if (usbip_dbg_flag_vhci_rh) {
-- memcpy(prev_port_status, vhci_hcd->port_status,
-- sizeof(prev_port_status));
-+ if (!invalid_rhport)
-+ memcpy(prev_port_status, vhci_hcd->port_status,
-+ sizeof(prev_port_status));
- }
-
- switch (typeReq) {
-@@ -354,8 +366,10 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
- usbip_dbg_vhci_rh(" ClearHubFeature\n");
- break;
- case ClearPortFeature:
-- if (rhport < 0)
-+ if (invalid_rhport) {
-+ pr_err("invalid port number %d\n", wIndex);
- goto error;
-+ }
- switch (wValue) {
- case USB_PORT_FEAT_SUSPEND:
- if (hcd->speed == HCD_USB3) {
-@@ -415,9 +429,10 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
- break;
- case GetPortStatus:
- usbip_dbg_vhci_rh(" GetPortStatus port %x\n", wIndex);
-- if (wIndex < 1) {
-+ if (invalid_rhport) {
- pr_err("invalid port number %d\n", wIndex);
- retval = -EPIPE;
-+ goto error;
- }
-
- /* we do not care about resume. */
-@@ -513,16 +528,20 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
- goto error;
- }
-
-- if (rhport < 0)
-+ if (invalid_rhport) {
-+ pr_err("invalid port number %d\n", wIndex);
- goto error;
-+ }
-
- vhci_hcd->port_status[rhport] |= USB_PORT_STAT_SUSPEND;
- break;
- case USB_PORT_FEAT_POWER:
- usbip_dbg_vhci_rh(
- " SetPortFeature: USB_PORT_FEAT_POWER\n");
-- if (rhport < 0)
-+ if (invalid_rhport) {
-+ pr_err("invalid port number %d\n", wIndex);
- goto error;
-+ }
- if (hcd->speed == HCD_USB3)
- vhci_hcd->port_status[rhport] |= USB_SS_PORT_STAT_POWER;
- else
-@@ -531,8 +550,10 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
- case USB_PORT_FEAT_BH_PORT_RESET:
- usbip_dbg_vhci_rh(
- " SetPortFeature: USB_PORT_FEAT_BH_PORT_RESET\n");
-- if (rhport < 0)
-+ if (invalid_rhport) {
-+ pr_err("invalid port number %d\n", wIndex);
- goto error;
-+ }
- /* Applicable only for USB3.0 hub */
- if (hcd->speed != HCD_USB3) {
- pr_err("USB_PORT_FEAT_BH_PORT_RESET req not "
-@@ -543,8 +564,10 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
- case USB_PORT_FEAT_RESET:
- usbip_dbg_vhci_rh(
- " SetPortFeature: USB_PORT_FEAT_RESET\n");
-- if (rhport < 0)
-+ if (invalid_rhport) {
-+ pr_err("invalid port number %d\n", wIndex);
- goto error;
-+ }
- /* if it's already enabled, disable */
- if (hcd->speed == HCD_USB3) {
- vhci_hcd->port_status[rhport] = 0;
-@@ -565,8 +588,10 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
- default:
- usbip_dbg_vhci_rh(" SetPortFeature: default %d\n",
- wValue);
-- if (rhport < 0)
-+ if (invalid_rhport) {
-+ pr_err("invalid port number %d\n", wIndex);
- goto error;
-+ }
- if (hcd->speed == HCD_USB3) {
- if ((vhci_hcd->port_status[rhport] &
- USB_SS_PORT_STAT_POWER) != 0) {
-@@ -608,7 +633,7 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
- if (usbip_dbg_flag_vhci_rh) {
- pr_debug("port %d\n", rhport);
- /* Only dump valid port status */
-- if (rhport >= 0) {
-+ if (!invalid_rhport) {
- dump_port_status_diff(prev_port_status[rhport],
- vhci_hcd->port_status[rhport],
- hcd->speed == HCD_USB3);
-@@ -618,8 +643,10 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
-
- spin_unlock_irqrestore(&vhci->lock, flags);
-
-- if ((vhci_hcd->port_status[rhport] & PORT_C_MASK) != 0)
-+ if (!invalid_rhport &&
-+ (vhci_hcd->port_status[rhport] & PORT_C_MASK) != 0) {
- usb_hcd_poll_rh_status(hcd);
-+ }
-
- return retval;
- }
-diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
-index 560ed8711706..c4424cbd9943 100644
---- a/drivers/vhost/vhost.c
-+++ b/drivers/vhost/vhost.c
-@@ -30,6 +30,7 @@
- #include <linux/sched/mm.h>
- #include <linux/sched/signal.h>
- #include <linux/interval_tree_generic.h>
-+#include <linux/nospec.h>
-
- #include "vhost.h"
-
-@@ -1362,6 +1363,7 @@ long vhost_vring_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *arg
- if (idx >= d->nvqs)
- return -ENOBUFS;
-
-+ idx = array_index_nospec(idx, d->nvqs);
- vq = d->vqs[idx];
-
- mutex_lock(&vq->mutex);
-diff --git a/drivers/video/fbdev/pxa168fb.c b/drivers/video/fbdev/pxa168fb.c
-index def3a501acd6..d059d04c63ac 100644
---- a/drivers/video/fbdev/pxa168fb.c
-+++ b/drivers/video/fbdev/pxa168fb.c
-@@ -712,7 +712,7 @@ static int pxa168fb_probe(struct platform_device *pdev)
- /*
- * enable controller clock
- */
-- clk_enable(fbi->clk);
-+ clk_prepare_enable(fbi->clk);
-
- pxa168fb_set_par(info);
-
-@@ -767,7 +767,7 @@ static int pxa168fb_probe(struct platform_device *pdev)
- failed_free_cmap:
- fb_dealloc_cmap(&info->cmap);
- failed_free_clk:
-- clk_disable(fbi->clk);
-+ clk_disable_unprepare(fbi->clk);
- failed_free_fbmem:
- dma_free_coherent(fbi->dev, info->fix.smem_len,
- info->screen_base, fbi->fb_start_dma);
-@@ -807,7 +807,7 @@ static int pxa168fb_remove(struct platform_device *pdev)
- dma_free_wc(fbi->dev, PAGE_ALIGN(info->fix.smem_len),
- info->screen_base, info->fix.smem_start);
-
-- clk_disable(fbi->clk);
-+ clk_disable_unprepare(fbi->clk);
-
- framebuffer_release(info);
-
-diff --git a/fs/afs/cell.c b/fs/afs/cell.c
-index f3d0bef16d78..6127f0fcd62c 100644
---- a/fs/afs/cell.c
-+++ b/fs/afs/cell.c
-@@ -514,6 +514,8 @@ static int afs_alloc_anon_key(struct afs_cell *cell)
- */
- static int afs_activate_cell(struct afs_net *net, struct afs_cell *cell)
- {
-+ struct hlist_node **p;
-+ struct afs_cell *pcell;
- int ret;
-
- if (!cell->anonymous_key) {
-@@ -534,7 +536,18 @@ static int afs_activate_cell(struct afs_net *net, struct afs_cell *cell)
- return ret;
-
- mutex_lock(&net->proc_cells_lock);
-- list_add_tail(&cell->proc_link, &net->proc_cells);
-+ for (p = &net->proc_cells.first; *p; p = &(*p)->next) {
-+ pcell = hlist_entry(*p, struct afs_cell, proc_link);
-+ if (strcmp(cell->name, pcell->name) < 0)
-+ break;
-+ }
-+
-+ cell->proc_link.pprev = p;
-+ cell->proc_link.next = *p;
-+ rcu_assign_pointer(*p, &cell->proc_link.next);
-+ if (cell->proc_link.next)
-+ cell->proc_link.next->pprev = &cell->proc_link.next;
-+
- afs_dynroot_mkdir(net, cell);
- mutex_unlock(&net->proc_cells_lock);
- return 0;
-@@ -550,7 +563,7 @@ static void afs_deactivate_cell(struct afs_net *net, struct afs_cell *cell)
- afs_proc_cell_remove(cell);
-
- mutex_lock(&net->proc_cells_lock);
-- list_del_init(&cell->proc_link);
-+ hlist_del_rcu(&cell->proc_link);
- afs_dynroot_rmdir(net, cell);
- mutex_unlock(&net->proc_cells_lock);
-
-diff --git a/fs/afs/dynroot.c b/fs/afs/dynroot.c
-index 174e843f0633..7de7223843cc 100644
---- a/fs/afs/dynroot.c
-+++ b/fs/afs/dynroot.c
-@@ -286,7 +286,7 @@ int afs_dynroot_populate(struct super_block *sb)
- return -ERESTARTSYS;
-
- net->dynroot_sb = sb;
-- list_for_each_entry(cell, &net->proc_cells, proc_link) {
-+ hlist_for_each_entry(cell, &net->proc_cells, proc_link) {
- ret = afs_dynroot_mkdir(net, cell);
- if (ret < 0)
- goto error;
-diff --git a/fs/afs/internal.h b/fs/afs/internal.h
-index 9778df135717..270d1caa27c6 100644
---- a/fs/afs/internal.h
-+++ b/fs/afs/internal.h
-@@ -241,7 +241,7 @@ struct afs_net {
- seqlock_t cells_lock;
-
- struct mutex proc_cells_lock;
-- struct list_head proc_cells;
-+ struct hlist_head proc_cells;
-
- /* Known servers. Theoretically each fileserver can only be in one
- * cell, but in practice, people create aliases and subsets and there's
-@@ -319,7 +319,7 @@ struct afs_cell {
- struct afs_net *net;
- struct key *anonymous_key; /* anonymous user key for this cell */
- struct work_struct manager; /* Manager for init/deinit/dns */
-- struct list_head proc_link; /* /proc cell list link */
-+ struct hlist_node proc_link; /* /proc cell list link */
- #ifdef CONFIG_AFS_FSCACHE
- struct fscache_cookie *cache; /* caching cookie */
- #endif
-diff --git a/fs/afs/main.c b/fs/afs/main.c
-index e84fe822a960..107427688edd 100644
---- a/fs/afs/main.c
-+++ b/fs/afs/main.c
-@@ -87,7 +87,7 @@ static int __net_init afs_net_init(struct net *net_ns)
- timer_setup(&net->cells_timer, afs_cells_timer, 0);
-
- mutex_init(&net->proc_cells_lock);
-- INIT_LIST_HEAD(&net->proc_cells);
-+ INIT_HLIST_HEAD(&net->proc_cells);
-
- seqlock_init(&net->fs_lock);
- net->fs_servers = RB_ROOT;
-diff --git a/fs/afs/proc.c b/fs/afs/proc.c
-index 476dcbb79713..9101f62707af 100644
---- a/fs/afs/proc.c
-+++ b/fs/afs/proc.c
-@@ -33,9 +33,8 @@ static inline struct afs_net *afs_seq2net_single(struct seq_file *m)
- static int afs_proc_cells_show(struct seq_file *m, void *v)
- {
- struct afs_cell *cell = list_entry(v, struct afs_cell, proc_link);
-- struct afs_net *net = afs_seq2net(m);
-
-- if (v == &net->proc_cells) {
-+ if (v == SEQ_START_TOKEN) {
- /* display header on line 1 */
- seq_puts(m, "USE NAME\n");
- return 0;
-@@ -50,12 +49,12 @@ static void *afs_proc_cells_start(struct seq_file *m, loff_t *_pos)
- __acquires(rcu)
- {
- rcu_read_lock();
-- return seq_list_start_head(&afs_seq2net(m)->proc_cells, *_pos);
-+ return seq_hlist_start_head_rcu(&afs_seq2net(m)->proc_cells, *_pos);
- }
-
- static void *afs_proc_cells_next(struct seq_file *m, void *v, loff_t *pos)
- {
-- return seq_list_next(v, &afs_seq2net(m)->proc_cells, pos);
-+ return seq_hlist_next_rcu(v, &afs_seq2net(m)->proc_cells, pos);
- }
-
- static void afs_proc_cells_stop(struct seq_file *m, void *v)
-diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c
-index af2b17b21b94..95983c744164 100644
---- a/fs/cachefiles/namei.c
-+++ b/fs/cachefiles/namei.c
-@@ -343,7 +343,7 @@ static int cachefiles_bury_object(struct cachefiles_cache *cache,
- trap = lock_rename(cache->graveyard, dir);
-
- /* do some checks before getting the grave dentry */
-- if (rep->d_parent != dir) {
-+ if (rep->d_parent != dir || IS_DEADDIR(d_inode(rep))) {
- /* the entry was probably culled when we dropped the parent dir
- * lock */
- unlock_rename(cache->graveyard, dir);
-diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c
-index 3aef8630a4b9..95d2c716e0da 100644
---- a/fs/fat/fatent.c
-+++ b/fs/fat/fatent.c
-@@ -681,6 +681,7 @@ int fat_count_free_clusters(struct super_block *sb)
- if (ops->ent_get(&fatent) == FAT_ENT_FREE)
- free++;
- } while (fat_ent_next(sbi, &fatent));
-+ cond_resched();
- }
- sbi->free_clusters = free;
- sbi->free_clus_valid = 1;
-diff --git a/fs/fscache/cookie.c b/fs/fscache/cookie.c
-index 83bfe04456b6..c550512ce335 100644
---- a/fs/fscache/cookie.c
-+++ b/fs/fscache/cookie.c
-@@ -70,20 +70,7 @@ void fscache_free_cookie(struct fscache_cookie *cookie)
- }
-
- /*
-- * initialise an cookie jar slab element prior to any use
-- */
--void fscache_cookie_init_once(void *_cookie)
--{
-- struct fscache_cookie *cookie = _cookie;
--
-- memset(cookie, 0, sizeof(*cookie));
-- spin_lock_init(&cookie->lock);
-- spin_lock_init(&cookie->stores_lock);
-- INIT_HLIST_HEAD(&cookie->backing_objects);
--}
--
--/*
-- * Set the index key in a cookie. The cookie struct has space for a 12-byte
-+ * Set the index key in a cookie. The cookie struct has space for a 16-byte
- * key plus length and hash, but if that's not big enough, it's instead a
- * pointer to a buffer containing 3 bytes of hash, 1 byte of length and then
- * the key data.
-@@ -93,20 +80,18 @@ static int fscache_set_key(struct fscache_cookie *cookie,
- {
- unsigned long long h;
- u32 *buf;
-+ int bufs;
- int i;
-
-- cookie->key_len = index_key_len;
-+ bufs = DIV_ROUND_UP(index_key_len, sizeof(*buf));
-
- if (index_key_len > sizeof(cookie->inline_key)) {
-- buf = kzalloc(index_key_len, GFP_KERNEL);
-+ buf = kcalloc(bufs, sizeof(*buf), GFP_KERNEL);
- if (!buf)
- return -ENOMEM;
- cookie->key = buf;
- } else {
- buf = (u32 *)cookie->inline_key;
-- buf[0] = 0;
-- buf[1] = 0;
-- buf[2] = 0;
- }
-
- memcpy(buf, index_key, index_key_len);
-@@ -116,7 +101,8 @@ static int fscache_set_key(struct fscache_cookie *cookie,
- */
- h = (unsigned long)cookie->parent;
- h += index_key_len + cookie->type;
-- for (i = 0; i < (index_key_len + sizeof(u32) - 1) / sizeof(u32); i++)
-+
-+ for (i = 0; i < bufs; i++)
- h += buf[i];
-
- cookie->key_hash = h ^ (h >> 32);
-@@ -161,7 +147,7 @@ struct fscache_cookie *fscache_alloc_cookie(
- struct fscache_cookie *cookie;
-
- /* allocate and initialise a cookie */
-- cookie = kmem_cache_alloc(fscache_cookie_jar, GFP_KERNEL);
-+ cookie = kmem_cache_zalloc(fscache_cookie_jar, GFP_KERNEL);
- if (!cookie)
- return NULL;
-
-@@ -192,6 +178,9 @@ struct fscache_cookie *fscache_alloc_cookie(
- cookie->netfs_data = netfs_data;
- cookie->flags = (1 << FSCACHE_COOKIE_NO_DATA_YET);
- cookie->type = def->type;
-+ spin_lock_init(&cookie->lock);
-+ spin_lock_init(&cookie->stores_lock);
-+ INIT_HLIST_HEAD(&cookie->backing_objects);
-
- /* radix tree insertion won't use the preallocation pool unless it's
- * told it may not wait */
-diff --git a/fs/fscache/internal.h b/fs/fscache/internal.h
-index f83328a7f048..d6209022e965 100644
---- a/fs/fscache/internal.h
-+++ b/fs/fscache/internal.h
-@@ -51,7 +51,6 @@ extern struct fscache_cache *fscache_select_cache_for_object(
- extern struct kmem_cache *fscache_cookie_jar;
-
- extern void fscache_free_cookie(struct fscache_cookie *);
--extern void fscache_cookie_init_once(void *);
- extern struct fscache_cookie *fscache_alloc_cookie(struct fscache_cookie *,
- const struct fscache_cookie_def *,
- const void *, size_t,
-diff --git a/fs/fscache/main.c b/fs/fscache/main.c
-index 7dce110bf17d..30ad89db1efc 100644
---- a/fs/fscache/main.c
-+++ b/fs/fscache/main.c
-@@ -143,9 +143,7 @@ static int __init fscache_init(void)
-
- fscache_cookie_jar = kmem_cache_create("fscache_cookie_jar",
- sizeof(struct fscache_cookie),
-- 0,
-- 0,
-- fscache_cookie_init_once);
-+ 0, 0, NULL);
- if (!fscache_cookie_jar) {
- pr_notice("Failed to allocate a cookie jar\n");
- ret = -ENOMEM;
-diff --git a/fs/ioctl.c b/fs/ioctl.c
-index b445b13fc59b..5444fec607ce 100644
---- a/fs/ioctl.c
-+++ b/fs/ioctl.c
-@@ -229,7 +229,7 @@ static long ioctl_file_clone(struct file *dst_file, unsigned long srcfd,
- ret = -EXDEV;
- if (src_file.file->f_path.mnt != dst_file->f_path.mnt)
- goto fdput;
-- ret = do_clone_file_range(src_file.file, off, dst_file, destoff, olen);
-+ ret = vfs_clone_file_range(src_file.file, off, dst_file, destoff, olen);
- fdput:
- fdput(src_file);
- return ret;
-diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
-index b0555d7d8200..613d2fe2dddd 100644
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -541,7 +541,8 @@ __be32 nfsd4_set_nfs4_label(struct svc_rqst *rqstp, struct svc_fh *fhp,
- __be32 nfsd4_clone_file_range(struct file *src, u64 src_pos, struct file *dst,
- u64 dst_pos, u64 count)
- {
-- return nfserrno(do_clone_file_range(src, src_pos, dst, dst_pos, count));
-+ return nfserrno(vfs_clone_file_range(src, src_pos, dst, dst_pos,
-+ count));
- }
-
- ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst,
-diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c
-index 7869622af22a..7a5ee145c733 100644
---- a/fs/ocfs2/refcounttree.c
-+++ b/fs/ocfs2/refcounttree.c
-@@ -2946,6 +2946,7 @@ int ocfs2_duplicate_clusters_by_page(handle_t *handle,
- if (map_end & (PAGE_SIZE - 1))
- to = map_end & (PAGE_SIZE - 1);
-
-+retry:
- page = find_or_create_page(mapping, page_index, GFP_NOFS);
- if (!page) {
- ret = -ENOMEM;
-@@ -2954,11 +2955,18 @@ int ocfs2_duplicate_clusters_by_page(handle_t *handle,
- }
-
- /*
-- * In case PAGE_SIZE <= CLUSTER_SIZE, This page
-- * can't be dirtied before we CoW it out.
-+ * In case PAGE_SIZE <= CLUSTER_SIZE, we do not expect a dirty
-+ * page, so write it back.
- */
-- if (PAGE_SIZE <= OCFS2_SB(sb)->s_clustersize)
-- BUG_ON(PageDirty(page));
-+ if (PAGE_SIZE <= OCFS2_SB(sb)->s_clustersize) {
-+ if (PageDirty(page)) {
-+ /*
-+ * write_on_page will unlock the page on return
-+ */
-+ ret = write_one_page(page);
-+ goto retry;
-+ }
-+ }
-
- if (!PageUptodate(page)) {
- ret = block_read_full_page(page, ocfs2_get_block);
-diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
-index ddaddb4ce4c3..26b477f2538d 100644
---- a/fs/overlayfs/copy_up.c
-+++ b/fs/overlayfs/copy_up.c
-@@ -156,7 +156,7 @@ static int ovl_copy_up_data(struct path *old, struct path *new, loff_t len)
- }
-
- /* Try to use clone_file_range to clone up within the same fs */
-- error = vfs_clone_file_range(old_file, 0, new_file, 0, len);
-+ error = do_clone_file_range(old_file, 0, new_file, 0, len);
- if (!error)
- goto out;
- /* Couldn't clone, so now we try to copy the data */
-diff --git a/fs/read_write.c b/fs/read_write.c
-index 153f8f690490..c9d489684335 100644
---- a/fs/read_write.c
-+++ b/fs/read_write.c
-@@ -1818,8 +1818,8 @@ int vfs_clone_file_prep_inodes(struct inode *inode_in, loff_t pos_in,
- }
- EXPORT_SYMBOL(vfs_clone_file_prep_inodes);
-
--int vfs_clone_file_range(struct file *file_in, loff_t pos_in,
-- struct file *file_out, loff_t pos_out, u64 len)
-+int do_clone_file_range(struct file *file_in, loff_t pos_in,
-+ struct file *file_out, loff_t pos_out, u64 len)
- {
- struct inode *inode_in = file_inode(file_in);
- struct inode *inode_out = file_inode(file_out);
-@@ -1866,6 +1866,19 @@ int vfs_clone_file_range(struct file *file_in, loff_t pos_in,
-
- return ret;
- }
-+EXPORT_SYMBOL(do_clone_file_range);
-+
-+int vfs_clone_file_range(struct file *file_in, loff_t pos_in,
-+ struct file *file_out, loff_t pos_out, u64 len)
-+{
-+ int ret;
-+
-+ file_start_write(file_out);
-+ ret = do_clone_file_range(file_in, pos_in, file_out, pos_out, len);
-+ file_end_write(file_out);
-+
-+ return ret;
-+}
- EXPORT_SYMBOL(vfs_clone_file_range);
-
- /*
-diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
-index e373e2e10f6a..83b930988e21 100644
---- a/include/asm-generic/vmlinux.lds.h
-+++ b/include/asm-generic/vmlinux.lds.h
-@@ -70,7 +70,7 @@
- */
- #ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
- #define TEXT_MAIN .text .text.[0-9a-zA-Z_]*
--#define DATA_MAIN .data .data.[0-9a-zA-Z_]*
-+#define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..LPBX*
- #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]*
- #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]*
- #define BSS_MAIN .bss .bss.[0-9a-zA-Z_]*
-@@ -617,8 +617,8 @@
-
- #define EXIT_DATA \
- *(.exit.data .exit.data.*) \
-- *(.fini_array) \
-- *(.dtors) \
-+ *(.fini_array .fini_array.*) \
-+ *(.dtors .dtors.*) \
- MEM_DISCARD(exit.data*) \
- MEM_DISCARD(exit.rodata*)
-
-diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
-index b25d12ef120a..e3c404833115 100644
---- a/include/drm/drm_edid.h
-+++ b/include/drm/drm_edid.h
-@@ -214,9 +214,9 @@ struct detailed_timing {
- #define DRM_EDID_HDMI_DC_Y444 (1 << 3)
-
- /* YCBCR 420 deep color modes */
--#define DRM_EDID_YCBCR420_DC_48 (1 << 6)
--#define DRM_EDID_YCBCR420_DC_36 (1 << 5)
--#define DRM_EDID_YCBCR420_DC_30 (1 << 4)
-+#define DRM_EDID_YCBCR420_DC_48 (1 << 2)
-+#define DRM_EDID_YCBCR420_DC_36 (1 << 1)
-+#define DRM_EDID_YCBCR420_DC_30 (1 << 0)
- #define DRM_EDID_YCBCR420_DC_MASK (DRM_EDID_YCBCR420_DC_48 | \
- DRM_EDID_YCBCR420_DC_36 | \
- DRM_EDID_YCBCR420_DC_30)
-diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
-index 38b04f559ad3..1fd6fa822d2c 100644
---- a/include/linux/bpf_verifier.h
-+++ b/include/linux/bpf_verifier.h
-@@ -50,6 +50,9 @@ struct bpf_reg_state {
- * PTR_TO_MAP_VALUE_OR_NULL
- */
- struct bpf_map *map_ptr;
-+
-+ /* Max size from any of the above. */
-+ unsigned long raw;
- };
- /* Fixed part of pointer offset, pointer types only */
- s32 off;
-diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
-index a8ba6b04152c..55e4be8b016b 100644
---- a/include/linux/compiler_types.h
-+++ b/include/linux/compiler_types.h
-@@ -78,6 +78,18 @@ extern void __chk_io_ptr(const volatile void __iomem *);
- #include <linux/compiler-clang.h>
- #endif
-
-+/*
-+ * Some architectures need to provide custom definitions of macros provided
-+ * by linux/compiler-*.h, and can do so using asm/compiler.h. We include that
-+ * conditionally rather than using an asm-generic wrapper in order to avoid
-+ * build failures if any C compilation, which will include this file via an
-+ * -include argument in c_flags, occurs prior to the asm-generic wrappers being
-+ * generated.
-+ */
-+#ifdef CONFIG_HAVE_ARCH_COMPILER_H
-+#include <asm/compiler.h>
-+#endif
-+
- /*
- * Generic compiler-dependent macros required for kernel
- * build go below this comment. Actual compiler/compiler version
-diff --git a/include/linux/fs.h b/include/linux/fs.h
-index a3afa50bb79f..e73363bd8646 100644
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1813,8 +1813,10 @@ extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *,
- extern int vfs_clone_file_prep_inodes(struct inode *inode_in, loff_t pos_in,
- struct inode *inode_out, loff_t pos_out,
- u64 *len, bool is_dedupe);
-+extern int do_clone_file_range(struct file *file_in, loff_t pos_in,
-+ struct file *file_out, loff_t pos_out, u64 len);
- extern int vfs_clone_file_range(struct file *file_in, loff_t pos_in,
-- struct file *file_out, loff_t pos_out, u64 len);
-+ struct file *file_out, loff_t pos_out, u64 len);
- extern int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
- struct inode *dest, loff_t destoff,
- loff_t len, bool *is_same);
-@@ -2755,19 +2757,6 @@ static inline void file_end_write(struct file *file)
- __sb_end_write(file_inode(file)->i_sb, SB_FREEZE_WRITE);
- }
-
--static inline int do_clone_file_range(struct file *file_in, loff_t pos_in,
-- struct file *file_out, loff_t pos_out,
-- u64 len)
--{
-- int ret;
--
-- file_start_write(file_out);
-- ret = vfs_clone_file_range(file_in, pos_in, file_out, pos_out, len);
-- file_end_write(file_out);
--
-- return ret;
--}
--
- /*
- * get_write_access() gets write permission for a file.
- * put_write_access() releases this write permission.
-diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h
-index 5382b5183b7e..82a953ec5ef0 100644
---- a/include/linux/gpio/driver.h
-+++ b/include/linux/gpio/driver.h
-@@ -94,6 +94,13 @@ struct gpio_irq_chip {
- */
- unsigned int num_parents;
-
-+ /**
-+ * @parent_irq:
-+ *
-+ * For use by gpiochip_set_cascaded_irqchip()
-+ */
-+ unsigned int parent_irq;
-+
- /**
- * @parents:
- *
-diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
-index 64f450593b54..b49bfc8e68b0 100644
---- a/include/linux/mlx5/driver.h
-+++ b/include/linux/mlx5/driver.h
-@@ -1022,6 +1022,14 @@ static inline void *mlx5_frag_buf_get_wqe(struct mlx5_frag_buf_ctrl *fbc,
- ((fbc->frag_sz_m1 & ix) << fbc->log_stride);
- }
-
-+static inline u32
-+mlx5_frag_buf_get_idx_last_contig_stride(struct mlx5_frag_buf_ctrl *fbc, u32 ix)
-+{
-+ u32 last_frag_stride_idx = (ix + fbc->strides_offset) | fbc->frag_sz_m1;
-+
-+ return min_t(u32, last_frag_stride_idx - fbc->strides_offset, fbc->sz_m1);
-+}
-+
- int mlx5_cmd_init(struct mlx5_core_dev *dev);
- void mlx5_cmd_cleanup(struct mlx5_core_dev *dev);
- void mlx5_cmd_use_events(struct mlx5_core_dev *dev);
-diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h
-index dd2052f0efb7..11b7b8ab0696 100644
---- a/include/linux/netfilter.h
-+++ b/include/linux/netfilter.h
-@@ -215,6 +215,8 @@ static inline int nf_hook(u_int8_t pf, unsigned int hook, struct net *net,
- break;
- case NFPROTO_ARP:
- #ifdef CONFIG_NETFILTER_FAMILY_ARP
-+ if (WARN_ON_ONCE(hook >= ARRAY_SIZE(net->nf.hooks_arp)))
-+ break;
- hook_head = rcu_dereference(net->nf.hooks_arp[hook]);
- #endif
- break;
-diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
-index 3d4930528db0..2d31e22babd8 100644
---- a/include/net/ip6_fib.h
-+++ b/include/net/ip6_fib.h
-@@ -159,6 +159,10 @@ struct fib6_info {
- struct rt6_info * __percpu *rt6i_pcpu;
- struct rt6_exception_bucket __rcu *rt6i_exception_bucket;
-
-+#ifdef CONFIG_IPV6_ROUTER_PREF
-+ unsigned long last_probe;
-+#endif
-+
- u32 fib6_metric;
- u8 fib6_protocol;
- u8 fib6_type;
-diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h
-index 5ef1bad81ef5..9e3d32746430 100644
---- a/include/net/sctp/sm.h
-+++ b/include/net/sctp/sm.h
-@@ -347,7 +347,7 @@ static inline __u16 sctp_data_size(struct sctp_chunk *chunk)
- __u16 size;
-
- size = ntohs(chunk->chunk_hdr->length);
-- size -= sctp_datahdr_len(&chunk->asoc->stream);
-+ size -= sctp_datachk_len(&chunk->asoc->stream);
-
- return size;
- }
-diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h
-index 4fff00e9da8a..0a774b64fc29 100644
---- a/include/trace/events/rxrpc.h
-+++ b/include/trace/events/rxrpc.h
-@@ -56,7 +56,6 @@ enum rxrpc_peer_trace {
- rxrpc_peer_new,
- rxrpc_peer_processing,
- rxrpc_peer_put,
-- rxrpc_peer_queued_error,
- };
-
- enum rxrpc_conn_trace {
-@@ -257,8 +256,7 @@ enum rxrpc_tx_fail_trace {
- EM(rxrpc_peer_got, "GOT") \
- EM(rxrpc_peer_new, "NEW") \
- EM(rxrpc_peer_processing, "PRO") \
-- EM(rxrpc_peer_put, "PUT") \
-- E_(rxrpc_peer_queued_error, "QER")
-+ E_(rxrpc_peer_put, "PUT")
-
- #define rxrpc_conn_traces \
- EM(rxrpc_conn_got, "GOT") \
-diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
-index 82e8edef6ea0..b000686fa1a1 100644
---- a/kernel/bpf/verifier.c
-+++ b/kernel/bpf/verifier.c
-@@ -2731,7 +2731,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
- dst_reg->umax_value = umax_ptr;
- dst_reg->var_off = ptr_reg->var_off;
- dst_reg->off = ptr_reg->off + smin_val;
-- dst_reg->range = ptr_reg->range;
-+ dst_reg->raw = ptr_reg->raw;
- break;
- }
- /* A new variable offset is created. Note that off_reg->off
-@@ -2761,10 +2761,11 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
- }
- dst_reg->var_off = tnum_add(ptr_reg->var_off, off_reg->var_off);
- dst_reg->off = ptr_reg->off;
-+ dst_reg->raw = ptr_reg->raw;
- if (reg_is_pkt_pointer(ptr_reg)) {
- dst_reg->id = ++env->id_gen;
- /* something was added to pkt_ptr, set range to zero */
-- dst_reg->range = 0;
-+ dst_reg->raw = 0;
- }
- break;
- case BPF_SUB:
-@@ -2793,7 +2794,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
- dst_reg->var_off = ptr_reg->var_off;
- dst_reg->id = ptr_reg->id;
- dst_reg->off = ptr_reg->off - smin_val;
-- dst_reg->range = ptr_reg->range;
-+ dst_reg->raw = ptr_reg->raw;
- break;
- }
- /* A new variable offset is created. If the subtrahend is known
-@@ -2819,11 +2820,12 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
- }
- dst_reg->var_off = tnum_sub(ptr_reg->var_off, off_reg->var_off);
- dst_reg->off = ptr_reg->off;
-+ dst_reg->raw = ptr_reg->raw;
- if (reg_is_pkt_pointer(ptr_reg)) {
- dst_reg->id = ++env->id_gen;
- /* something was added to pkt_ptr, set range to zero */
- if (smin_val < 0)
-- dst_reg->range = 0;
-+ dst_reg->raw = 0;
- }
- break;
- case BPF_AND:
-diff --git a/kernel/events/core.c b/kernel/events/core.c
-index ae22d93701db..fc072b7f839d 100644
---- a/kernel/events/core.c
-+++ b/kernel/events/core.c
-@@ -8319,6 +8319,8 @@ void perf_tp_event(u16 event_type, u64 count, void *record, int entry_size,
- goto unlock;
-
- list_for_each_entry_rcu(event, &ctx->event_list, event_entry) {
-+ if (event->cpu != smp_processor_id())
-+ continue;
- if (event->attr.type != PERF_TYPE_TRACEPOINT)
- continue;
- if (event->attr.config != entry->type)
-@@ -9436,9 +9438,7 @@ static void free_pmu_context(struct pmu *pmu)
- if (pmu->task_ctx_nr > perf_invalid_context)
- return;
-
-- mutex_lock(&pmus_lock);
- free_percpu(pmu->pmu_cpu_context);
-- mutex_unlock(&pmus_lock);
- }
-
- /*
-@@ -9694,12 +9694,8 @@ EXPORT_SYMBOL_GPL(perf_pmu_register);
-
- void perf_pmu_unregister(struct pmu *pmu)
- {
-- int remove_device;
--
- mutex_lock(&pmus_lock);
-- remove_device = pmu_bus_running;
- list_del_rcu(&pmu->entry);
-- mutex_unlock(&pmus_lock);
-
- /*
- * We dereference the pmu list under both SRCU and regular RCU, so
-@@ -9711,13 +9707,14 @@ void perf_pmu_unregister(struct pmu *pmu)
- free_percpu(pmu->pmu_disable_count);
- if (pmu->type >= PERF_TYPE_MAX)
- idr_remove(&pmu_idr, pmu->type);
-- if (remove_device) {
-+ if (pmu_bus_running) {
- if (pmu->nr_addr_filters)
- device_remove_file(pmu->dev, &dev_attr_nr_addr_filters);
- device_del(pmu->dev);
- put_device(pmu->dev);
- }
- free_pmu_context(pmu);
-+ mutex_unlock(&pmus_lock);
- }
- EXPORT_SYMBOL_GPL(perf_pmu_unregister);
-
-diff --git a/kernel/locking/test-ww_mutex.c b/kernel/locking/test-ww_mutex.c
-index 0e4cd64ad2c0..654977862b06 100644
---- a/kernel/locking/test-ww_mutex.c
-+++ b/kernel/locking/test-ww_mutex.c
-@@ -260,7 +260,7 @@ static void test_cycle_work(struct work_struct *work)
- {
- struct test_cycle *cycle = container_of(work, typeof(*cycle), work);
- struct ww_acquire_ctx ctx;
-- int err;
-+ int err, erra = 0;
-
- ww_acquire_init(&ctx, &ww_class);
- ww_mutex_lock(&cycle->a_mutex, &ctx);
-@@ -270,17 +270,19 @@ static void test_cycle_work(struct work_struct *work)
-
- err = ww_mutex_lock(cycle->b_mutex, &ctx);
- if (err == -EDEADLK) {
-+ err = 0;
- ww_mutex_unlock(&cycle->a_mutex);
- ww_mutex_lock_slow(cycle->b_mutex, &ctx);
-- err = ww_mutex_lock(&cycle->a_mutex, &ctx);
-+ erra = ww_mutex_lock(&cycle->a_mutex, &ctx);
- }
-
- if (!err)
- ww_mutex_unlock(cycle->b_mutex);
-- ww_mutex_unlock(&cycle->a_mutex);
-+ if (!erra)
-+ ww_mutex_unlock(&cycle->a_mutex);
- ww_acquire_fini(&ctx);
-
-- cycle->result = err;
-+ cycle->result = err ?: erra;
- }
-
- static int __test_cycle(unsigned int nthreads)
-diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
-index 26526fc41f0d..b27b9509ea89 100644
---- a/kernel/sched/fair.c
-+++ b/kernel/sched/fair.c
-@@ -4797,9 +4797,13 @@ static void throttle_cfs_rq(struct cfs_rq *cfs_rq)
-
- /*
- * Add to the _head_ of the list, so that an already-started
-- * distribute_cfs_runtime will not see us
-+ * distribute_cfs_runtime will not see us. If disribute_cfs_runtime is
-+ * not running add to the tail so that later runqueues don't get starved.
- */
-- list_add_rcu(&cfs_rq->throttled_list, &cfs_b->throttled_cfs_rq);
-+ if (cfs_b->distribute_running)
-+ list_add_rcu(&cfs_rq->throttled_list, &cfs_b->throttled_cfs_rq);
-+ else
-+ list_add_tail_rcu(&cfs_rq->throttled_list, &cfs_b->throttled_cfs_rq);
-
- /*
- * If we're the first throttled task, make sure the bandwidth
-@@ -4943,14 +4947,16 @@ static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun)
- * in us over-using our runtime if it is all used during this loop, but
- * only by limited amounts in that extreme case.
- */
-- while (throttled && cfs_b->runtime > 0) {
-+ while (throttled && cfs_b->runtime > 0 && !cfs_b->distribute_running) {
- runtime = cfs_b->runtime;
-+ cfs_b->distribute_running = 1;
- raw_spin_unlock(&cfs_b->lock);
- /* we can't nest cfs_b->lock while distributing bandwidth */
- runtime = distribute_cfs_runtime(cfs_b, runtime,
- runtime_expires);
- raw_spin_lock(&cfs_b->lock);
-
-+ cfs_b->distribute_running = 0;
- throttled = !list_empty(&cfs_b->throttled_cfs_rq);
-
- cfs_b->runtime -= min(runtime, cfs_b->runtime);
-@@ -5061,6 +5067,11 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b)
-
- /* confirm we're still not at a refresh boundary */
- raw_spin_lock(&cfs_b->lock);
-+ if (cfs_b->distribute_running) {
-+ raw_spin_unlock(&cfs_b->lock);
-+ return;
-+ }
-+
- if (runtime_refresh_within(cfs_b, min_bandwidth_expiration)) {
- raw_spin_unlock(&cfs_b->lock);
- return;
-@@ -5070,6 +5081,9 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b)
- runtime = cfs_b->runtime;
-
- expires = cfs_b->runtime_expires;
-+ if (runtime)
-+ cfs_b->distribute_running = 1;
-+
- raw_spin_unlock(&cfs_b->lock);
-
- if (!runtime)
-@@ -5080,6 +5094,7 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b)
- raw_spin_lock(&cfs_b->lock);
- if (expires == cfs_b->runtime_expires)
- cfs_b->runtime -= min(runtime, cfs_b->runtime);
-+ cfs_b->distribute_running = 0;
- raw_spin_unlock(&cfs_b->lock);
- }
-
-@@ -5188,6 +5203,7 @@ void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b)
- cfs_b->period_timer.function = sched_cfs_period_timer;
- hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
- cfs_b->slack_timer.function = sched_cfs_slack_timer;
-+ cfs_b->distribute_running = 0;
- }
-
- static void init_cfs_rq_runtime(struct cfs_rq *cfs_rq)
-diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
-index c7742dcc136c..4565c3f9ecc5 100644
---- a/kernel/sched/sched.h
-+++ b/kernel/sched/sched.h
-@@ -346,6 +346,8 @@ struct cfs_bandwidth {
- int nr_periods;
- int nr_throttled;
- u64 throttled_time;
-+
-+ bool distribute_running;
- #endif
- };
-
-diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
-index aae18af94c94..6c78bc2b7fff 100644
---- a/kernel/trace/trace_events_hist.c
-+++ b/kernel/trace/trace_events_hist.c
-@@ -747,16 +747,30 @@ static void free_synth_field(struct synth_field *field)
- kfree(field);
- }
-
--static struct synth_field *parse_synth_field(char *field_type,
-- char *field_name)
-+static struct synth_field *parse_synth_field(int argc, char **argv,
-+ int *consumed)
- {
- struct synth_field *field;
-+ const char *prefix = NULL;
-+ char *field_type = argv[0], *field_name;
- int len, ret = 0;
- char *array;
-
- if (field_type[0] == ';')
- field_type++;
-
-+ if (!strcmp(field_type, "unsigned")) {
-+ if (argc < 3)
-+ return ERR_PTR(-EINVAL);
-+ prefix = "unsigned ";
-+ field_type = argv[1];
-+ field_name = argv[2];
-+ *consumed = 3;
-+ } else {
-+ field_name = argv[1];
-+ *consumed = 2;
-+ }
-+
- len = strlen(field_name);
- if (field_name[len - 1] == ';')
- field_name[len - 1] = '\0';
-@@ -769,11 +783,15 @@ static struct synth_field *parse_synth_field(char *field_type,
- array = strchr(field_name, '[');
- if (array)
- len += strlen(array);
-+ if (prefix)
-+ len += strlen(prefix);
- field->type = kzalloc(len, GFP_KERNEL);
- if (!field->type) {
- ret = -ENOMEM;
- goto free;
- }
-+ if (prefix)
-+ strcat(field->type, prefix);
- strcat(field->type, field_type);
- if (array) {
- strcat(field->type, array);
-@@ -1018,7 +1036,7 @@ static int create_synth_event(int argc, char **argv)
- struct synth_field *field, *fields[SYNTH_FIELDS_MAX];
- struct synth_event *event = NULL;
- bool delete_event = false;
-- int i, n_fields = 0, ret = 0;
-+ int i, consumed = 0, n_fields = 0, ret = 0;
- char *name;
-
- mutex_lock(&synth_event_mutex);
-@@ -1070,16 +1088,16 @@ static int create_synth_event(int argc, char **argv)
- goto err;
- }
-
-- field = parse_synth_field(argv[i], argv[i + 1]);
-+ field = parse_synth_field(argc - i, &argv[i], &consumed);
- if (IS_ERR(field)) {
- ret = PTR_ERR(field);
- goto err;
- }
-- fields[n_fields] = field;
-- i++; n_fields++;
-+ fields[n_fields++] = field;
-+ i += consumed - 1;
- }
-
-- if (i < argc) {
-+ if (i < argc && strcmp(argv[i], ";") != 0) {
- ret = -EINVAL;
- goto err;
- }
-diff --git a/mm/gup_benchmark.c b/mm/gup_benchmark.c
-index 6a473709e9b6..7405c9d89d65 100644
---- a/mm/gup_benchmark.c
-+++ b/mm/gup_benchmark.c
-@@ -19,7 +19,8 @@ static int __gup_benchmark_ioctl(unsigned int cmd,
- struct gup_benchmark *gup)
- {
- ktime_t start_time, end_time;
-- unsigned long i, nr, nr_pages, addr, next;
-+ unsigned long i, nr_pages, addr, next;
-+ int nr;
- struct page **pages;
-
- nr_pages = gup->size / PAGE_SIZE;
-diff --git a/mm/migrate.c b/mm/migrate.c
-index 2a55289ee9f1..f49eb9589d73 100644
---- a/mm/migrate.c
-+++ b/mm/migrate.c
-@@ -1415,7 +1415,7 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page,
- * we encounter them after the rest of the list
- * is processed.
- */
-- if (PageTransHuge(page)) {
-+ if (PageTransHuge(page) && !PageHuge(page)) {
- lock_page(page);
- rc = split_huge_page_to_list(page, from);
- unlock_page(page);
-diff --git a/mm/vmscan.c b/mm/vmscan.c
-index fc0436407471..03822f86f288 100644
---- a/mm/vmscan.c
-+++ b/mm/vmscan.c
-@@ -386,17 +386,6 @@ static unsigned long do_shrink_slab(struct shrink_control *shrinkctl,
- delta = freeable >> priority;
- delta *= 4;
- do_div(delta, shrinker->seeks);
--
-- /*
-- * Make sure we apply some minimal pressure on default priority
-- * even on small cgroups. Stale objects are not only consuming memory
-- * by themselves, but can also hold a reference to a dying cgroup,
-- * preventing it from being reclaimed. A dying cgroup with all
-- * corresponding structures like per-cpu stats and kmem caches
-- * can be really big, so it may lead to a significant waste of memory.
-- */
-- delta = max_t(unsigned long long, delta, min(freeable, batch_size));
--
- total_scan += delta;
- if (total_scan < 0) {
- pr_err("shrink_slab: %pF negative objects to delete nr=%ld\n",
-diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
-index 8a80d48d89c4..1b9984f653dd 100644
---- a/net/bluetooth/mgmt.c
-+++ b/net/bluetooth/mgmt.c
-@@ -2298,9 +2298,8 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
- /* LE address type */
- addr_type = le_addr_type(cp->addr.type);
-
-- hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type);
--
-- err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type);
-+ /* Abort any ongoing SMP pairing. Removes ltk and irk if they exist. */
-+ err = smp_cancel_and_remove_pairing(hdev, &cp->addr.bdaddr, addr_type);
- if (err < 0) {
- err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
- MGMT_STATUS_NOT_PAIRED, &rp,
-@@ -2314,8 +2313,6 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
- goto done;
- }
-
-- /* Abort any ongoing SMP pairing */
-- smp_cancel_pairing(conn);
-
- /* Defer clearing up the connection parameters until closing to
- * give a chance of keeping them if a repairing happens.
-diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
-index 3a7b0773536b..73f7211d0431 100644
---- a/net/bluetooth/smp.c
-+++ b/net/bluetooth/smp.c
-@@ -2422,30 +2422,51 @@ int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
- return ret;
- }
-
--void smp_cancel_pairing(struct hci_conn *hcon)
-+int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr,
-+ u8 addr_type)
- {
-- struct l2cap_conn *conn = hcon->l2cap_data;
-+ struct hci_conn *hcon;
-+ struct l2cap_conn *conn;
- struct l2cap_chan *chan;
- struct smp_chan *smp;
-+ int err;
-+
-+ err = hci_remove_ltk(hdev, bdaddr, addr_type);
-+ hci_remove_irk(hdev, bdaddr, addr_type);
-+
-+ hcon = hci_conn_hash_lookup_le(hdev, bdaddr, addr_type);
-+ if (!hcon)
-+ goto done;
-
-+ conn = hcon->l2cap_data;
- if (!conn)
-- return;
-+ goto done;
-
- chan = conn->smp;
- if (!chan)
-- return;
-+ goto done;
-
- l2cap_chan_lock(chan);
-
- smp = chan->data;
- if (smp) {
-+ /* Set keys to NULL to make sure smp_failure() does not try to
-+ * remove and free already invalidated rcu list entries. */
-+ smp->ltk = NULL;
-+ smp->slave_ltk = NULL;
-+ smp->remote_irk = NULL;
-+
- if (test_bit(SMP_FLAG_COMPLETE, &smp->flags))
- smp_failure(conn, 0);
- else
- smp_failure(conn, SMP_UNSPECIFIED);
-+ err = 0;
- }
-
- l2cap_chan_unlock(chan);
-+
-+done:
-+ return err;
- }
-
- static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
-diff --git a/net/bluetooth/smp.h b/net/bluetooth/smp.h
-index 0ff6247eaa6c..121edadd5f8d 100644
---- a/net/bluetooth/smp.h
-+++ b/net/bluetooth/smp.h
-@@ -181,7 +181,8 @@ enum smp_key_pref {
- };
-
- /* SMP Commands */
--void smp_cancel_pairing(struct hci_conn *hcon);
-+int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr,
-+ u8 addr_type);
- bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
- enum smp_key_pref key_pref);
- int smp_conn_security(struct hci_conn *hcon, __u8 sec_level);
-diff --git a/net/bpfilter/bpfilter_kern.c b/net/bpfilter/bpfilter_kern.c
-index f0fc182d3db7..d5dd6b8b4248 100644
---- a/net/bpfilter/bpfilter_kern.c
-+++ b/net/bpfilter/bpfilter_kern.c
-@@ -23,9 +23,11 @@ static void shutdown_umh(struct umh_info *info)
-
- if (!info->pid)
- return;
-- tsk = pid_task(find_vpid(info->pid), PIDTYPE_PID);
-- if (tsk)
-+ tsk = get_pid_task(find_vpid(info->pid), PIDTYPE_PID);
-+ if (tsk) {
- force_sig(SIGKILL, tsk);
-+ put_task_struct(tsk);
-+ }
- fput(info->pipe_to_umh);
- fput(info->pipe_from_umh);
- info->pid = 0;
-diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
-index 920665dd92db..6059a47f5e0c 100644
---- a/net/bridge/br_multicast.c
-+++ b/net/bridge/br_multicast.c
-@@ -1420,7 +1420,14 @@ static void br_multicast_query_received(struct net_bridge *br,
- return;
-
- br_multicast_update_query_timer(br, query, max_delay);
-- br_multicast_mark_router(br, port);
-+
-+ /* Based on RFC4541, section 2.1.1 IGMP Forwarding Rules,
-+ * the arrival port for IGMP Queries where the source address
-+ * is 0.0.0.0 should not be added to router port list.
-+ */
-+ if ((saddr->proto == htons(ETH_P_IP) && saddr->u.ip4) ||
-+ saddr->proto == htons(ETH_P_IPV6))
-+ br_multicast_mark_router(br, port);
- }
-
- static int br_ip4_multicast_query(struct net_bridge *br,
-diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c
-index 9b16eaf33819..58240cc185e7 100644
---- a/net/bridge/br_netfilter_hooks.c
-+++ b/net/bridge/br_netfilter_hooks.c
-@@ -834,7 +834,8 @@ static unsigned int ip_sabotage_in(void *priv,
- struct sk_buff *skb,
- const struct nf_hook_state *state)
- {
-- if (skb->nf_bridge && !skb->nf_bridge->in_prerouting) {
-+ if (skb->nf_bridge && !skb->nf_bridge->in_prerouting &&
-+ !netif_is_l3_master(skb->dev)) {
- state->okfn(state->net, state->sk, skb);
- return NF_STOLEN;
- }
-diff --git a/net/core/datagram.c b/net/core/datagram.c
-index 9938952c5c78..16f0eb0970c4 100644
---- a/net/core/datagram.c
-+++ b/net/core/datagram.c
-@@ -808,8 +808,9 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
- return -EINVAL;
- }
-
-- if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
-- netdev_rx_csum_fault(skb->dev);
-+ if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
-+ !skb->csum_complete_sw)
-+ netdev_rx_csum_fault(NULL);
- }
- return 0;
- fault:
-diff --git a/net/core/ethtool.c b/net/core/ethtool.c
-index 6c04f1bf377d..548d0e615bc7 100644
---- a/net/core/ethtool.c
-+++ b/net/core/ethtool.c
-@@ -2461,13 +2461,17 @@ static int ethtool_set_per_queue_coalesce(struct net_device *dev,
- return ret;
- }
-
--static int ethtool_set_per_queue(struct net_device *dev, void __user *useraddr)
-+static int ethtool_set_per_queue(struct net_device *dev,
-+ void __user *useraddr, u32 sub_cmd)
- {
- struct ethtool_per_queue_op per_queue_opt;
-
- if (copy_from_user(&per_queue_opt, useraddr, sizeof(per_queue_opt)))
- return -EFAULT;
-
-+ if (per_queue_opt.sub_command != sub_cmd)
-+ return -EINVAL;
-+
- switch (per_queue_opt.sub_command) {
- case ETHTOOL_GCOALESCE:
- return ethtool_get_per_queue_coalesce(dev, useraddr, &per_queue_opt);
-@@ -2838,7 +2842,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
- rc = ethtool_get_phy_stats(dev, useraddr);
- break;
- case ETHTOOL_PERQUEUE:
-- rc = ethtool_set_per_queue(dev, useraddr);
-+ rc = ethtool_set_per_queue(dev, useraddr, sub_cmd);
- break;
- case ETHTOOL_GLINKSETTINGS:
- rc = ethtool_get_link_ksettings(dev, useraddr);
-diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
-index 18de39dbdc30..4b25fd14bc5a 100644
---- a/net/core/rtnetlink.c
-+++ b/net/core/rtnetlink.c
-@@ -3480,6 +3480,11 @@ static int rtnl_fdb_add(struct sk_buff *skb, struct nlmsghdr *nlh,
- return -EINVAL;
- }
-
-+ if (dev->type != ARPHRD_ETHER) {
-+ NL_SET_ERR_MSG(extack, "FDB delete only supported for Ethernet devices");
-+ return -EINVAL;
-+ }
-+
- addr = nla_data(tb[NDA_LLADDR]);
-
- err = fdb_vid_parse(tb[NDA_VLAN], &vid, extack);
-@@ -3584,6 +3589,11 @@ static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
- return -EINVAL;
- }
-
-+ if (dev->type != ARPHRD_ETHER) {
-+ NL_SET_ERR_MSG(extack, "FDB add only supported for Ethernet devices");
-+ return -EINVAL;
-+ }
-+
- addr = nla_data(tb[NDA_LLADDR]);
-
- err = fdb_vid_parse(tb[NDA_VLAN], &vid, extack);
-diff --git a/net/core/skbuff.c b/net/core/skbuff.c
-index 3680912f056a..c45916b91a9c 100644
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -1845,8 +1845,9 @@ int pskb_trim_rcsum_slow(struct sk_buff *skb, unsigned int len)
- if (skb->ip_summed == CHECKSUM_COMPLETE) {
- int delta = skb->len - len;
-
-- skb->csum = csum_sub(skb->csum,
-- skb_checksum(skb, len, delta, 0));
-+ skb->csum = csum_block_sub(skb->csum,
-+ skb_checksum(skb, len, delta, 0),
-+ len);
- }
- return __pskb_trim(skb, len);
- }
-diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
-index d14d741fb05e..9d3bdce1ad8a 100644
---- a/net/ipv4/ip_fragment.c
-+++ b/net/ipv4/ip_fragment.c
-@@ -657,10 +657,14 @@ struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user)
- if (ip_is_fragment(&iph)) {
- skb = skb_share_check(skb, GFP_ATOMIC);
- if (skb) {
-- if (!pskb_may_pull(skb, netoff + iph.ihl * 4))
-- return skb;
-- if (pskb_trim_rcsum(skb, netoff + len))
-- return skb;
-+ if (!pskb_may_pull(skb, netoff + iph.ihl * 4)) {
-+ kfree_skb(skb);
-+ return NULL;
-+ }
-+ if (pskb_trim_rcsum(skb, netoff + len)) {
-+ kfree_skb(skb);
-+ return NULL;
-+ }
- memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
- if (ip_defrag(net, skb, user))
- return NULL;
-diff --git a/net/ipv4/ipmr_base.c b/net/ipv4/ipmr_base.c
-index cafb0506c8c9..33be09791c74 100644
---- a/net/ipv4/ipmr_base.c
-+++ b/net/ipv4/ipmr_base.c
-@@ -295,8 +295,6 @@ int mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb,
- next_entry:
- e++;
- }
-- e = 0;
-- s_e = 0;
-
- spin_lock_bh(lock);
- list_for_each_entry(mfc, &mrt->mfc_unres_queue, list) {
-diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
-index a12df801de94..2fe7e2713350 100644
---- a/net/ipv4/udp.c
-+++ b/net/ipv4/udp.c
-@@ -2124,8 +2124,24 @@ static inline int udp4_csum_init(struct sk_buff *skb, struct udphdr *uh,
- /* Note, we are only interested in != 0 or == 0, thus the
- * force to int.
- */
-- return (__force int)skb_checksum_init_zero_check(skb, proto, uh->check,
-- inet_compute_pseudo);
-+ err = (__force int)skb_checksum_init_zero_check(skb, proto, uh->check,
-+ inet_compute_pseudo);
-+ if (err)
-+ return err;
-+
-+ if (skb->ip_summed == CHECKSUM_COMPLETE && !skb->csum_valid) {
-+ /* If SW calculated the value, we know it's bad */
-+ if (skb->csum_complete_sw)
-+ return 1;
-+
-+ /* HW says the value is bad. Let's validate that.
-+ * skb->csum is no longer the full packet checksum,
-+ * so don't treat it as such.
-+ */
-+ skb_checksum_complete_unset(skb);
-+ }
-+
-+ return 0;
- }
-
- /* wrapper for udp_queue_rcv_skb tacking care of csum conversion and
-diff --git a/net/ipv4/xfrm4_input.c b/net/ipv4/xfrm4_input.c
-index bcfc00e88756..f8de2482a529 100644
---- a/net/ipv4/xfrm4_input.c
-+++ b/net/ipv4/xfrm4_input.c
-@@ -67,6 +67,7 @@ int xfrm4_transport_finish(struct sk_buff *skb, int async)
-
- if (xo && (xo->flags & XFRM_GRO)) {
- skb_mac_header_rebuild(skb);
-+ skb_reset_transport_header(skb);
- return 0;
- }
-
-diff --git a/net/ipv4/xfrm4_mode_transport.c b/net/ipv4/xfrm4_mode_transport.c
-index 3d36644890bb..1ad2c2c4e250 100644
---- a/net/ipv4/xfrm4_mode_transport.c
-+++ b/net/ipv4/xfrm4_mode_transport.c
-@@ -46,7 +46,6 @@ static int xfrm4_transport_output(struct xfrm_state *x, struct sk_buff *skb)
- static int xfrm4_transport_input(struct xfrm_state *x, struct sk_buff *skb)
- {
- int ihl = skb->data - skb_transport_header(skb);
-- struct xfrm_offload *xo = xfrm_offload(skb);
-
- if (skb->transport_header != skb->network_header) {
- memmove(skb_transport_header(skb),
-@@ -54,8 +53,7 @@ static int xfrm4_transport_input(struct xfrm_state *x, struct sk_buff *skb)
- skb->network_header = skb->transport_header;
- }
- ip_hdr(skb)->tot_len = htons(skb->len + ihl);
-- if (!xo || !(xo->flags & XFRM_GRO))
-- skb_reset_transport_header(skb);
-+ skb_reset_transport_header(skb);
- return 0;
- }
-
-diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index 3484c7020fd9..ac3de1aa1cd3 100644
---- a/net/ipv6/addrconf.c
-+++ b/net/ipv6/addrconf.c
-@@ -4930,8 +4930,8 @@ static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb,
-
- /* unicast address incl. temp addr */
- list_for_each_entry(ifa, &idev->addr_list, if_list) {
-- if (++ip_idx < s_ip_idx)
-- continue;
-+ if (ip_idx < s_ip_idx)
-+ goto next;
- err = inet6_fill_ifaddr(skb, ifa,
- NETLINK_CB(cb->skb).portid,
- cb->nlh->nlmsg_seq,
-@@ -4940,6 +4940,8 @@ static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb,
- if (err < 0)
- break;
- nl_dump_check_consistent(cb, nlmsg_hdr(skb));
-+next:
-+ ip_idx++;
- }
- break;
- }
-diff --git a/net/ipv6/ip6_checksum.c b/net/ipv6/ip6_checksum.c
-index 547515e8450a..377717045f8f 100644
---- a/net/ipv6/ip6_checksum.c
-+++ b/net/ipv6/ip6_checksum.c
-@@ -88,8 +88,24 @@ int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto)
- * Note, we are only interested in != 0 or == 0, thus the
- * force to int.
- */
-- return (__force int)skb_checksum_init_zero_check(skb, proto, uh->check,
-- ip6_compute_pseudo);
-+ err = (__force int)skb_checksum_init_zero_check(skb, proto, uh->check,
-+ ip6_compute_pseudo);
-+ if (err)
-+ return err;
-+
-+ if (skb->ip_summed == CHECKSUM_COMPLETE && !skb->csum_valid) {
-+ /* If SW calculated the value, we know it's bad */
-+ if (skb->csum_complete_sw)
-+ return 1;
-+
-+ /* HW says the value is bad. Let's validate that.
-+ * skb->csum is no longer the full packet checksum,
-+ * so don't treat is as such.
-+ */
-+ skb_checksum_complete_unset(skb);
-+ }
-+
-+ return 0;
- }
- EXPORT_SYMBOL(udp6_csum_init);
-
-diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
-index f5b5b0574a2d..009b508127e6 100644
---- a/net/ipv6/ip6_tunnel.c
-+++ b/net/ipv6/ip6_tunnel.c
-@@ -1184,10 +1184,6 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
- }
- skb_dst_set(skb, dst);
-
-- if (encap_limit >= 0) {
-- init_tel_txopt(&opt, encap_limit);
-- ipv6_push_frag_opts(skb, &opt.ops, &proto);
-- }
- hop_limit = hop_limit ? : ip6_dst_hoplimit(dst);
-
- /* Calculate max headroom for all the headers and adjust
-@@ -1202,6 +1198,11 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
- if (err)
- return err;
-
-+ if (encap_limit >= 0) {
-+ init_tel_txopt(&opt, encap_limit);
-+ ipv6_push_frag_opts(skb, &opt.ops, &proto);
-+ }
-+
- skb_push(skb, sizeof(struct ipv6hdr));
- skb_reset_network_header(skb);
- ipv6h = ipv6_hdr(skb);
-diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
-index f60f310785fd..131440ea6b51 100644
---- a/net/ipv6/mcast.c
-+++ b/net/ipv6/mcast.c
-@@ -2436,17 +2436,17 @@ static int ip6_mc_leave_src(struct sock *sk, struct ipv6_mc_socklist *iml,
- {
- int err;
-
-- /* callers have the socket lock and rtnl lock
-- * so no other readers or writers of iml or its sflist
-- */
-+ write_lock_bh(&iml->sflock);
- if (!iml->sflist) {
- /* any-source empty exclude case */
-- return ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0);
-+ err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0);
-+ } else {
-+ err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode,
-+ iml->sflist->sl_count, iml->sflist->sl_addr, 0);
-+ sock_kfree_s(sk, iml->sflist, IP6_SFLSIZE(iml->sflist->sl_max));
-+ iml->sflist = NULL;
- }
-- err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode,
-- iml->sflist->sl_count, iml->sflist->sl_addr, 0);
-- sock_kfree_s(sk, iml->sflist, IP6_SFLSIZE(iml->sflist->sl_max));
-- iml->sflist = NULL;
-+ write_unlock_bh(&iml->sflock);
- return err;
- }
-
-diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
-index 0ec273997d1d..673a4a932f2a 100644
---- a/net/ipv6/ndisc.c
-+++ b/net/ipv6/ndisc.c
-@@ -1732,10 +1732,9 @@ int ndisc_rcv(struct sk_buff *skb)
- return 0;
- }
-
-- memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
--
- switch (msg->icmph.icmp6_type) {
- case NDISC_NEIGHBOUR_SOLICITATION:
-+ memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
- ndisc_recv_ns(skb);
- break;
-
-diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
-index e4d9e6976d3c..a452d99c9f52 100644
---- a/net/ipv6/netfilter/nf_conntrack_reasm.c
-+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
-@@ -585,8 +585,6 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user)
- fq->q.meat == fq->q.len &&
- nf_ct_frag6_reasm(fq, skb, dev))
- ret = 0;
-- else
-- skb_dst_drop(skb);
-
- out_unlock:
- spin_unlock_bh(&fq->q.lock);
-diff --git a/net/ipv6/route.c b/net/ipv6/route.c
-index ed526e257da6..a243d5249b51 100644
---- a/net/ipv6/route.c
-+++ b/net/ipv6/route.c
-@@ -517,10 +517,11 @@ static void rt6_probe_deferred(struct work_struct *w)
-
- static void rt6_probe(struct fib6_info *rt)
- {
-- struct __rt6_probe_work *work;
-+ struct __rt6_probe_work *work = NULL;
- const struct in6_addr *nh_gw;
- struct neighbour *neigh;
- struct net_device *dev;
-+ struct inet6_dev *idev;
-
- /*
- * Okay, this does not seem to be appropriate
-@@ -536,15 +537,12 @@ static void rt6_probe(struct fib6_info *rt)
- nh_gw = &rt->fib6_nh.nh_gw;
- dev = rt->fib6_nh.nh_dev;
- rcu_read_lock_bh();
-+ idev = __in6_dev_get(dev);
- neigh = __ipv6_neigh_lookup_noref(dev, nh_gw);
- if (neigh) {
-- struct inet6_dev *idev;
--
- if (neigh->nud_state & NUD_VALID)
- goto out;
-
-- idev = __in6_dev_get(dev);
-- work = NULL;
- write_lock(&neigh->lock);
- if (!(neigh->nud_state & NUD_VALID) &&
- time_after(jiffies,
-@@ -554,11 +552,13 @@ static void rt6_probe(struct fib6_info *rt)
- __neigh_set_probe_once(neigh);
- }
- write_unlock(&neigh->lock);
-- } else {
-+ } else if (time_after(jiffies, rt->last_probe +
-+ idev->cnf.rtr_probe_interval)) {
- work = kmalloc(sizeof(*work), GFP_ATOMIC);
- }
-
- if (work) {
-+ rt->last_probe = jiffies;
- INIT_WORK(&work->work, rt6_probe_deferred);
- work->target = *nh_gw;
- dev_hold(dev);
-@@ -2792,6 +2792,8 @@ static int ip6_route_check_nh_onlink(struct net *net,
- grt = ip6_nh_lookup_table(net, cfg, gw_addr, tbid, 0);
- if (grt) {
- if (!grt->dst.error &&
-+ /* ignore match if it is the default route */
-+ grt->from && !ipv6_addr_any(&grt->from->fib6_dst.addr) &&
- (grt->rt6i_flags & flags || dev != grt->dst.dev)) {
- NL_SET_ERR_MSG(extack,
- "Nexthop has invalid gateway or device mismatch");
-diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
-index 39d0cab919bb..4f2c7a196365 100644
---- a/net/ipv6/udp.c
-+++ b/net/ipv6/udp.c
-@@ -762,11 +762,9 @@ static int udp6_unicast_rcv_skb(struct sock *sk, struct sk_buff *skb,
-
- ret = udpv6_queue_rcv_skb(sk, skb);
-
-- /* a return value > 0 means to resubmit the input, but
-- * it wants the return to be -protocol, or 0
-- */
-+ /* a return value > 0 means to resubmit the input */
- if (ret > 0)
-- return -ret;
-+ return ret;
- return 0;
- }
-
-diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c
-index 841f4a07438e..9ef490dddcea 100644
---- a/net/ipv6/xfrm6_input.c
-+++ b/net/ipv6/xfrm6_input.c
-@@ -59,6 +59,7 @@ int xfrm6_transport_finish(struct sk_buff *skb, int async)
-
- if (xo && (xo->flags & XFRM_GRO)) {
- skb_mac_header_rebuild(skb);
-+ skb_reset_transport_header(skb);
- return -1;
- }
-
-diff --git a/net/ipv6/xfrm6_mode_transport.c b/net/ipv6/xfrm6_mode_transport.c
-index 9ad07a91708e..3c29da5defe6 100644
---- a/net/ipv6/xfrm6_mode_transport.c
-+++ b/net/ipv6/xfrm6_mode_transport.c
-@@ -51,7 +51,6 @@ static int xfrm6_transport_output(struct xfrm_state *x, struct sk_buff *skb)
- static int xfrm6_transport_input(struct xfrm_state *x, struct sk_buff *skb)
- {
- int ihl = skb->data - skb_transport_header(skb);
-- struct xfrm_offload *xo = xfrm_offload(skb);
-
- if (skb->transport_header != skb->network_header) {
- memmove(skb_transport_header(skb),
-@@ -60,8 +59,7 @@ static int xfrm6_transport_input(struct xfrm_state *x, struct sk_buff *skb)
- }
- ipv6_hdr(skb)->payload_len = htons(skb->len + ihl -
- sizeof(struct ipv6hdr));
-- if (!xo || !(xo->flags & XFRM_GRO))
-- skb_reset_transport_header(skb);
-+ skb_reset_transport_header(skb);
- return 0;
- }
-
-diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c
-index 5959ce9620eb..6a74080005cf 100644
---- a/net/ipv6/xfrm6_output.c
-+++ b/net/ipv6/xfrm6_output.c
-@@ -170,9 +170,11 @@ static int __xfrm6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
-
- if (toobig && xfrm6_local_dontfrag(skb)) {
- xfrm6_local_rxpmtu(skb, mtu);
-+ kfree_skb(skb);
- return -EMSGSIZE;
- } else if (!skb->ignore_df && toobig && skb->sk) {
- xfrm_local_error(skb, mtu);
-+ kfree_skb(skb);
- return -EMSGSIZE;
- }
-
-diff --git a/net/llc/llc_conn.c b/net/llc/llc_conn.c
-index c0ac522b48a1..4ff89cb7c86f 100644
---- a/net/llc/llc_conn.c
-+++ b/net/llc/llc_conn.c
-@@ -734,6 +734,7 @@ void llc_sap_add_socket(struct llc_sap *sap, struct sock *sk)
- llc_sk(sk)->sap = sap;
-
- spin_lock_bh(&sap->sk_lock);
-+ sock_set_flag(sk, SOCK_RCU_FREE);
- sap->sk_count++;
- sk_nulls_add_node_rcu(sk, laddr_hb);
- hlist_add_head(&llc->dev_hash_node, dev_hb);
-diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h
-index ee56f18cad3f..21526630bf65 100644
---- a/net/mac80211/mesh.h
-+++ b/net/mac80211/mesh.h
-@@ -217,7 +217,8 @@ void mesh_rmc_free(struct ieee80211_sub_if_data *sdata);
- int mesh_rmc_init(struct ieee80211_sub_if_data *sdata);
- void ieee80211s_init(void);
- void ieee80211s_update_metric(struct ieee80211_local *local,
-- struct sta_info *sta, struct sk_buff *skb);
-+ struct sta_info *sta,
-+ struct ieee80211_tx_status *st);
- void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata);
- void ieee80211_mesh_teardown_sdata(struct ieee80211_sub_if_data *sdata);
- int ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata);
-diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
-index daf9db3c8f24..6950cd0bf594 100644
---- a/net/mac80211/mesh_hwmp.c
-+++ b/net/mac80211/mesh_hwmp.c
-@@ -295,15 +295,12 @@ int mesh_path_error_tx(struct ieee80211_sub_if_data *sdata,
- }
-
- void ieee80211s_update_metric(struct ieee80211_local *local,
-- struct sta_info *sta, struct sk_buff *skb)
-+ struct sta_info *sta,
-+ struct ieee80211_tx_status *st)
- {
-- struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
-- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-+ struct ieee80211_tx_info *txinfo = st->info;
- int failed;
-
-- if (!ieee80211_is_data(hdr->frame_control))
-- return;
--
- failed = !(txinfo->flags & IEEE80211_TX_STAT_ACK);
-
- /* moving average, scaled to 100.
-diff --git a/net/mac80211/status.c b/net/mac80211/status.c
-index 9a6d7208bf4f..91d7c0cd1882 100644
---- a/net/mac80211/status.c
-+++ b/net/mac80211/status.c
-@@ -479,11 +479,6 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
- if (!skb)
- return;
-
-- if (dropped) {
-- dev_kfree_skb_any(skb);
-- return;
-- }
--
- if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) {
- u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie;
- struct ieee80211_sub_if_data *sdata;
-@@ -506,6 +501,8 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
- }
- rcu_read_unlock();
-
-+ dev_kfree_skb_any(skb);
-+ } else if (dropped) {
- dev_kfree_skb_any(skb);
- } else {
- /* consumes skb */
-@@ -811,7 +808,7 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
-
- rate_control_tx_status(local, sband, status);
- if (ieee80211_vif_is_mesh(&sta->sdata->vif))
-- ieee80211s_update_metric(local, sta, skb);
-+ ieee80211s_update_metric(local, sta, status);
-
- if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked)
- ieee80211_frame_acked(sta, skb);
-@@ -972,6 +969,8 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
- }
-
- rate_control_tx_status(local, sband, status);
-+ if (ieee80211_vif_is_mesh(&sta->sdata->vif))
-+ ieee80211s_update_metric(local, sta, status);
- }
-
- if (acked || noack_success) {
-diff --git a/net/mac80211/tdls.c b/net/mac80211/tdls.c
-index 5cd5e6e5834e..6c647f425e05 100644
---- a/net/mac80211/tdls.c
-+++ b/net/mac80211/tdls.c
-@@ -16,6 +16,7 @@
- #include "ieee80211_i.h"
- #include "driver-ops.h"
- #include "rate.h"
-+#include "wme.h"
-
- /* give usermode some time for retries in setting up the TDLS session */
- #define TDLS_PEER_SETUP_TIMEOUT (15 * HZ)
-@@ -1010,14 +1011,13 @@ ieee80211_tdls_prep_mgmt_packet(struct wiphy *wiphy, struct net_device *dev,
- switch (action_code) {
- case WLAN_TDLS_SETUP_REQUEST:
- case WLAN_TDLS_SETUP_RESPONSE:
-- skb_set_queue_mapping(skb, IEEE80211_AC_BK);
-- skb->priority = 2;
-+ skb->priority = 256 + 2;
- break;
- default:
-- skb_set_queue_mapping(skb, IEEE80211_AC_VI);
-- skb->priority = 5;
-+ skb->priority = 256 + 5;
- break;
- }
-+ skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb));
-
- /*
- * Set the WLAN_TDLS_TEARDOWN flag to indicate a teardown in progress.
-diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
-index 9b3b069e418a..361f2f6cc839 100644
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1886,7 +1886,7 @@ static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata,
- sdata->vif.hw_queue[skb_get_queue_mapping(skb)];
-
- if (invoke_tx_handlers_early(&tx))
-- return false;
-+ return true;
-
- if (ieee80211_queue_skb(local, sdata, tx.sta, tx.skb))
- return true;
-diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c
-index 8e67910185a0..1004fb5930de 100644
---- a/net/netfilter/nf_conntrack_proto_tcp.c
-+++ b/net/netfilter/nf_conntrack_proto_tcp.c
-@@ -1239,8 +1239,8 @@ static const struct nla_policy tcp_nla_policy[CTA_PROTOINFO_TCP_MAX+1] = {
- #define TCP_NLATTR_SIZE ( \
- NLA_ALIGN(NLA_HDRLEN + 1) + \
- NLA_ALIGN(NLA_HDRLEN + 1) + \
-- NLA_ALIGN(NLA_HDRLEN + sizeof(sizeof(struct nf_ct_tcp_flags))) + \
-- NLA_ALIGN(NLA_HDRLEN + sizeof(sizeof(struct nf_ct_tcp_flags))))
-+ NLA_ALIGN(NLA_HDRLEN + sizeof(struct nf_ct_tcp_flags)) + \
-+ NLA_ALIGN(NLA_HDRLEN + sizeof(struct nf_ct_tcp_flags)))
-
- static int nlattr_to_tcp(struct nlattr *cda[], struct nf_conn *ct)
- {
-diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c
-index 9873d734b494..8ad78b82c8e2 100644
---- a/net/netfilter/nft_set_rbtree.c
-+++ b/net/netfilter/nft_set_rbtree.c
-@@ -355,12 +355,11 @@ static void nft_rbtree_walk(const struct nft_ctx *ctx,
-
- static void nft_rbtree_gc(struct work_struct *work)
- {
-+ struct nft_rbtree_elem *rbe, *rbe_end = NULL, *rbe_prev = NULL;
- struct nft_set_gc_batch *gcb = NULL;
-- struct rb_node *node, *prev = NULL;
-- struct nft_rbtree_elem *rbe;
- struct nft_rbtree *priv;
-+ struct rb_node *node;
- struct nft_set *set;
-- int i;
-
- priv = container_of(work, struct nft_rbtree, gc_work.work);
- set = nft_set_container_of(priv);
-@@ -371,7 +370,7 @@ static void nft_rbtree_gc(struct work_struct *work)
- rbe = rb_entry(node, struct nft_rbtree_elem, node);
-
- if (nft_rbtree_interval_end(rbe)) {
-- prev = node;
-+ rbe_end = rbe;
- continue;
- }
- if (!nft_set_elem_expired(&rbe->ext))
-@@ -379,29 +378,30 @@ static void nft_rbtree_gc(struct work_struct *work)
- if (nft_set_elem_mark_busy(&rbe->ext))
- continue;
-
-+ if (rbe_prev) {
-+ rb_erase(&rbe_prev->node, &priv->root);
-+ rbe_prev = NULL;
-+ }
- gcb = nft_set_gc_batch_check(set, gcb, GFP_ATOMIC);
- if (!gcb)
- break;
-
- atomic_dec(&set->nelems);
- nft_set_gc_batch_add(gcb, rbe);
-+ rbe_prev = rbe;
-
-- if (prev) {
-- rbe = rb_entry(prev, struct nft_rbtree_elem, node);
-+ if (rbe_end) {
- atomic_dec(&set->nelems);
-- nft_set_gc_batch_add(gcb, rbe);
-- prev = NULL;
-+ nft_set_gc_batch_add(gcb, rbe_end);
-+ rb_erase(&rbe_end->node, &priv->root);
-+ rbe_end = NULL;
- }
- node = rb_next(node);
- if (!node)
- break;
- }
-- if (gcb) {
-- for (i = 0; i < gcb->head.cnt; i++) {
-- rbe = gcb->elems[i];
-- rb_erase(&rbe->node, &priv->root);
-- }
-- }
-+ if (rbe_prev)
-+ rb_erase(&rbe_prev->node, &priv->root);
- write_seqcount_end(&priv->count);
- write_unlock_bh(&priv->lock);
-
-diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c
-index 492ab0c36f7c..8b1ba43b1ece 100644
---- a/net/openvswitch/flow_netlink.c
-+++ b/net/openvswitch/flow_netlink.c
-@@ -2990,7 +2990,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
- * is already present */
- if (mac_proto != MAC_PROTO_NONE)
- return -EINVAL;
-- mac_proto = MAC_PROTO_NONE;
-+ mac_proto = MAC_PROTO_ETHERNET;
- break;
-
- case OVS_ACTION_ATTR_POP_ETH:
-@@ -2998,7 +2998,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
- return -EINVAL;
- if (vlan_tci & htons(VLAN_TAG_PRESENT))
- return -EINVAL;
-- mac_proto = MAC_PROTO_ETHERNET;
-+ mac_proto = MAC_PROTO_NONE;
- break;
-
- case OVS_ACTION_ATTR_PUSH_NSH:
-diff --git a/net/rds/send.c b/net/rds/send.c
-index 59f17a2335f4..0e54ca0f4e9e 100644
---- a/net/rds/send.c
-+++ b/net/rds/send.c
-@@ -1006,7 +1006,8 @@ static int rds_cmsg_send(struct rds_sock *rs, struct rds_message *rm,
- return ret;
- }
-
--static int rds_send_mprds_hash(struct rds_sock *rs, struct rds_connection *conn)
-+static int rds_send_mprds_hash(struct rds_sock *rs,
-+ struct rds_connection *conn, int nonblock)
- {
- int hash;
-
-@@ -1022,10 +1023,16 @@ static int rds_send_mprds_hash(struct rds_sock *rs, struct rds_connection *conn)
- * used. But if we are interrupted, we have to use the zero
- * c_path in case the connection ends up being non-MP capable.
- */
-- if (conn->c_npaths == 0)
-+ if (conn->c_npaths == 0) {
-+ /* Cannot wait for the connection be made, so just use
-+ * the base c_path.
-+ */
-+ if (nonblock)
-+ return 0;
- if (wait_event_interruptible(conn->c_hs_waitq,
- conn->c_npaths != 0))
- hash = 0;
-+ }
- if (conn->c_npaths == 1)
- hash = 0;
- }
-@@ -1170,7 +1177,7 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
- }
-
- if (conn->c_trans->t_mp_capable)
-- cpath = &conn->c_path[rds_send_mprds_hash(rs, conn)];
-+ cpath = &conn->c_path[rds_send_mprds_hash(rs, conn, nonblock)];
- else
- cpath = &conn->c_path[0];
-
-diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
-index 707630ab4713..330372c04940 100644
---- a/net/rxrpc/ar-internal.h
-+++ b/net/rxrpc/ar-internal.h
-@@ -293,7 +293,6 @@ struct rxrpc_peer {
- struct hlist_node hash_link;
- struct rxrpc_local *local;
- struct hlist_head error_targets; /* targets for net error distribution */
-- struct work_struct error_distributor;
- struct rb_root service_conns; /* Service connections */
- struct list_head keepalive_link; /* Link in net->peer_keepalive[] */
- time64_t last_tx_at; /* Last time packet sent here */
-@@ -304,8 +303,6 @@ struct rxrpc_peer {
- unsigned int maxdata; /* data size (MTU - hdrsize) */
- unsigned short hdrsize; /* header size (IP + UDP + RxRPC) */
- int debug_id; /* debug ID for printks */
-- int error_report; /* Net (+0) or local (+1000000) to distribute */
--#define RXRPC_LOCAL_ERROR_OFFSET 1000000
- struct sockaddr_rxrpc srx; /* remote address */
-
- /* calculated RTT cache */
-@@ -449,8 +446,7 @@ struct rxrpc_connection {
- spinlock_t state_lock; /* state-change lock */
- enum rxrpc_conn_cache_state cache_state;
- enum rxrpc_conn_proto_state state; /* current state of connection */
-- u32 local_abort; /* local abort code */
-- u32 remote_abort; /* remote abort code */
-+ u32 abort_code; /* Abort code of connection abort */
- int debug_id; /* debug ID for printks */
- atomic_t serial; /* packet serial number counter */
- unsigned int hi_serial; /* highest serial number received */
-@@ -460,8 +456,19 @@ struct rxrpc_connection {
- u8 security_size; /* security header size */
- u8 security_ix; /* security type */
- u8 out_clientflag; /* RXRPC_CLIENT_INITIATED if we are client */
-+ short error; /* Local error code */
- };
-
-+static inline bool rxrpc_to_server(const struct rxrpc_skb_priv *sp)
-+{
-+ return sp->hdr.flags & RXRPC_CLIENT_INITIATED;
-+}
-+
-+static inline bool rxrpc_to_client(const struct rxrpc_skb_priv *sp)
-+{
-+ return !rxrpc_to_server(sp);
-+}
-+
- /*
- * Flags in call->flags.
- */
-@@ -1029,7 +1036,6 @@ void rxrpc_send_keepalive(struct rxrpc_peer *);
- * peer_event.c
- */
- void rxrpc_error_report(struct sock *);
--void rxrpc_peer_error_distributor(struct work_struct *);
- void rxrpc_peer_add_rtt(struct rxrpc_call *, enum rxrpc_rtt_rx_trace,
- rxrpc_serial_t, rxrpc_serial_t, ktime_t, ktime_t);
- void rxrpc_peer_keepalive_worker(struct work_struct *);
-@@ -1048,7 +1054,6 @@ void rxrpc_destroy_all_peers(struct rxrpc_net *);
- struct rxrpc_peer *rxrpc_get_peer(struct rxrpc_peer *);
- struct rxrpc_peer *rxrpc_get_peer_maybe(struct rxrpc_peer *);
- void rxrpc_put_peer(struct rxrpc_peer *);
--void __rxrpc_queue_peer_error(struct rxrpc_peer *);
-
- /*
- * proc.c
-diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c
-index 9d1e298b784c..0e378d73e856 100644
---- a/net/rxrpc/call_accept.c
-+++ b/net/rxrpc/call_accept.c
-@@ -422,11 +422,11 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local,
-
- case RXRPC_CONN_REMOTELY_ABORTED:
- rxrpc_set_call_completion(call, RXRPC_CALL_REMOTELY_ABORTED,
-- conn->remote_abort, -ECONNABORTED);
-+ conn->abort_code, conn->error);
- break;
- case RXRPC_CONN_LOCALLY_ABORTED:
- rxrpc_abort_call("CON", call, sp->hdr.seq,
-- conn->local_abort, -ECONNABORTED);
-+ conn->abort_code, conn->error);
- break;
- default:
- BUG();
-diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c
-index f6734d8cb01a..ed69257203c2 100644
---- a/net/rxrpc/call_object.c
-+++ b/net/rxrpc/call_object.c
-@@ -400,7 +400,7 @@ void rxrpc_incoming_call(struct rxrpc_sock *rx,
- rcu_assign_pointer(conn->channels[chan].call, call);
-
- spin_lock(&conn->params.peer->lock);
-- hlist_add_head(&call->error_link, &conn->params.peer->error_targets);
-+ hlist_add_head_rcu(&call->error_link, &conn->params.peer->error_targets);
- spin_unlock(&conn->params.peer->lock);
-
- _net("CALL incoming %d on CONN %d", call->debug_id, call->conn->debug_id);
-diff --git a/net/rxrpc/conn_client.c b/net/rxrpc/conn_client.c
-index 5736f643c516..0be19132202b 100644
---- a/net/rxrpc/conn_client.c
-+++ b/net/rxrpc/conn_client.c
-@@ -709,8 +709,8 @@ int rxrpc_connect_call(struct rxrpc_call *call,
- }
-
- spin_lock_bh(&call->conn->params.peer->lock);
-- hlist_add_head(&call->error_link,
-- &call->conn->params.peer->error_targets);
-+ hlist_add_head_rcu(&call->error_link,
-+ &call->conn->params.peer->error_targets);
- spin_unlock_bh(&call->conn->params.peer->lock);
-
- out:
-diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c
-index 3fde001fcc39..5e7c8239e703 100644
---- a/net/rxrpc/conn_event.c
-+++ b/net/rxrpc/conn_event.c
-@@ -126,7 +126,7 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
-
- switch (chan->last_type) {
- case RXRPC_PACKET_TYPE_ABORT:
-- _proto("Tx ABORT %%%u { %d } [re]", serial, conn->local_abort);
-+ _proto("Tx ABORT %%%u { %d } [re]", serial, conn->abort_code);
- break;
- case RXRPC_PACKET_TYPE_ACK:
- trace_rxrpc_tx_ack(NULL, serial, chan->last_seq, 0,
-@@ -148,13 +148,12 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
- * pass a connection-level abort onto all calls on that connection
- */
- static void rxrpc_abort_calls(struct rxrpc_connection *conn,
-- enum rxrpc_call_completion compl,
-- u32 abort_code, int error)
-+ enum rxrpc_call_completion compl)
- {
- struct rxrpc_call *call;
- int i;
-
-- _enter("{%d},%x", conn->debug_id, abort_code);
-+ _enter("{%d},%x", conn->debug_id, conn->abort_code);
-
- spin_lock(&conn->channel_lock);
-
-@@ -167,9 +166,11 @@ static void rxrpc_abort_calls(struct rxrpc_connection *conn,
- trace_rxrpc_abort(call->debug_id,
- "CON", call->cid,
- call->call_id, 0,
-- abort_code, error);
-+ conn->abort_code,
-+ conn->error);
- if (rxrpc_set_call_completion(call, compl,
-- abort_code, error))
-+ conn->abort_code,
-+ conn->error))
- rxrpc_notify_socket(call);
- }
- }
-@@ -202,10 +203,12 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn,
- return 0;
- }
-
-+ conn->error = error;
-+ conn->abort_code = abort_code;
- conn->state = RXRPC_CONN_LOCALLY_ABORTED;
- spin_unlock_bh(&conn->state_lock);
-
-- rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED, abort_code, error);
-+ rxrpc_abort_calls(conn, RXRPC_CALL_LOCALLY_ABORTED);
-
- msg.msg_name = &conn->params.peer->srx.transport;
- msg.msg_namelen = conn->params.peer->srx.transport_len;
-@@ -224,7 +227,7 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn,
- whdr._rsvd = 0;
- whdr.serviceId = htons(conn->service_id);
-
-- word = htonl(conn->local_abort);
-+ word = htonl(conn->abort_code);
-
- iov[0].iov_base = &whdr;
- iov[0].iov_len = sizeof(whdr);
-@@ -235,7 +238,7 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn,
-
- serial = atomic_inc_return(&conn->serial);
- whdr.serial = htonl(serial);
-- _proto("Tx CONN ABORT %%%u { %d }", serial, conn->local_abort);
-+ _proto("Tx CONN ABORT %%%u { %d }", serial, conn->abort_code);
-
- ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
- if (ret < 0) {
-@@ -308,9 +311,10 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
- abort_code = ntohl(wtmp);
- _proto("Rx ABORT %%%u { ac=%d }", sp->hdr.serial, abort_code);
-
-+ conn->error = -ECONNABORTED;
-+ conn->abort_code = abort_code;
- conn->state = RXRPC_CONN_REMOTELY_ABORTED;
-- rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED,
-- abort_code, -ECONNABORTED);
-+ rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED);
- return -ECONNABORTED;
-
- case RXRPC_PACKET_TYPE_CHALLENGE:
-diff --git a/net/rxrpc/conn_object.c b/net/rxrpc/conn_object.c
-index 4c77a78a252a..e0d6d0fb7426 100644
---- a/net/rxrpc/conn_object.c
-+++ b/net/rxrpc/conn_object.c
-@@ -99,7 +99,7 @@ struct rxrpc_connection *rxrpc_find_connection_rcu(struct rxrpc_local *local,
- k.epoch = sp->hdr.epoch;
- k.cid = sp->hdr.cid & RXRPC_CIDMASK;
-
-- if (sp->hdr.flags & RXRPC_CLIENT_INITIATED) {
-+ if (rxrpc_to_server(sp)) {
- /* We need to look up service connections by the full protocol
- * parameter set. We look up the peer first as an intermediate
- * step and then the connection from the peer's tree.
-@@ -214,7 +214,7 @@ void rxrpc_disconnect_call(struct rxrpc_call *call)
- call->peer->cong_cwnd = call->cong_cwnd;
-
- spin_lock_bh(&conn->params.peer->lock);
-- hlist_del_init(&call->error_link);
-+ hlist_del_rcu(&call->error_link);
- spin_unlock_bh(&conn->params.peer->lock);
-
- if (rxrpc_is_client_call(call))
-diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c
-index 608d078a4981..a81240845224 100644
---- a/net/rxrpc/input.c
-+++ b/net/rxrpc/input.c
-@@ -216,10 +216,11 @@ static void rxrpc_send_ping(struct rxrpc_call *call, struct sk_buff *skb,
- /*
- * Apply a hard ACK by advancing the Tx window.
- */
--static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to,
-+static bool rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to,
- struct rxrpc_ack_summary *summary)
- {
- struct sk_buff *skb, *list = NULL;
-+ bool rot_last = false;
- int ix;
- u8 annotation;
-
-@@ -243,15 +244,17 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to,
- skb->next = list;
- list = skb;
-
-- if (annotation & RXRPC_TX_ANNO_LAST)
-+ if (annotation & RXRPC_TX_ANNO_LAST) {
- set_bit(RXRPC_CALL_TX_LAST, &call->flags);
-+ rot_last = true;
-+ }
- if ((annotation & RXRPC_TX_ANNO_MASK) != RXRPC_TX_ANNO_ACK)
- summary->nr_rot_new_acks++;
- }
-
- spin_unlock(&call->lock);
-
-- trace_rxrpc_transmit(call, (test_bit(RXRPC_CALL_TX_LAST, &call->flags) ?
-+ trace_rxrpc_transmit(call, (rot_last ?
- rxrpc_transmit_rotate_last :
- rxrpc_transmit_rotate));
- wake_up(&call->waitq);
-@@ -262,6 +265,8 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to,
- skb->next = NULL;
- rxrpc_free_skb(skb, rxrpc_skb_tx_freed);
- }
-+
-+ return rot_last;
- }
-
- /*
-@@ -273,23 +278,26 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to,
- static bool rxrpc_end_tx_phase(struct rxrpc_call *call, bool reply_begun,
- const char *abort_why)
- {
-+ unsigned int state;
-
- ASSERT(test_bit(RXRPC_CALL_TX_LAST, &call->flags));
-
- write_lock(&call->state_lock);
-
-- switch (call->state) {
-+ state = call->state;
-+ switch (state) {
- case RXRPC_CALL_CLIENT_SEND_REQUEST:
- case RXRPC_CALL_CLIENT_AWAIT_REPLY:
- if (reply_begun)
-- call->state = RXRPC_CALL_CLIENT_RECV_REPLY;
-+ call->state = state = RXRPC_CALL_CLIENT_RECV_REPLY;
- else
-- call->state = RXRPC_CALL_CLIENT_AWAIT_REPLY;
-+ call->state = state = RXRPC_CALL_CLIENT_AWAIT_REPLY;
- break;
-
- case RXRPC_CALL_SERVER_AWAIT_ACK:
- __rxrpc_call_completed(call);
- rxrpc_notify_socket(call);
-+ state = call->state;
- break;
-
- default:
-@@ -297,11 +305,10 @@ static bool rxrpc_end_tx_phase(struct rxrpc_call *call, bool reply_begun,
- }
-
- write_unlock(&call->state_lock);
-- if (call->state == RXRPC_CALL_CLIENT_AWAIT_REPLY) {
-+ if (state == RXRPC_CALL_CLIENT_AWAIT_REPLY)
- trace_rxrpc_transmit(call, rxrpc_transmit_await_reply);
-- } else {
-+ else
- trace_rxrpc_transmit(call, rxrpc_transmit_end);
-- }
- _leave(" = ok");
- return true;
-
-@@ -332,11 +339,11 @@ static bool rxrpc_receiving_reply(struct rxrpc_call *call)
- trace_rxrpc_timer(call, rxrpc_timer_init_for_reply, now);
- }
-
-- if (!test_bit(RXRPC_CALL_TX_LAST, &call->flags))
-- rxrpc_rotate_tx_window(call, top, &summary);
- if (!test_bit(RXRPC_CALL_TX_LAST, &call->flags)) {
-- rxrpc_proto_abort("TXL", call, top);
-- return false;
-+ if (!rxrpc_rotate_tx_window(call, top, &summary)) {
-+ rxrpc_proto_abort("TXL", call, top);
-+ return false;
-+ }
- }
- if (!rxrpc_end_tx_phase(call, true, "ETD"))
- return false;
-@@ -616,13 +623,14 @@ static void rxrpc_input_requested_ack(struct rxrpc_call *call,
- if (!skb)
- continue;
-
-+ sent_at = skb->tstamp;
-+ smp_rmb(); /* Read timestamp before serial. */
- sp = rxrpc_skb(skb);
- if (sp->hdr.serial != orig_serial)
- continue;
-- smp_rmb();
-- sent_at = skb->tstamp;
- goto found;
- }
-+
- return;
-
- found:
-@@ -854,6 +862,16 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
- rxrpc_propose_ack_respond_to_ack);
- }
-
-+ /* Discard any out-of-order or duplicate ACKs. */
-+ if (before_eq(sp->hdr.serial, call->acks_latest)) {
-+ _debug("discard ACK %d <= %d",
-+ sp->hdr.serial, call->acks_latest);
-+ return;
-+ }
-+ call->acks_latest_ts = skb->tstamp;
-+ call->acks_latest = sp->hdr.serial;
-+
-+ /* Parse rwind and mtu sizes if provided. */
- ioffset = offset + nr_acks + 3;
- if (skb->len >= ioffset + sizeof(buf.info)) {
- if (skb_copy_bits(skb, ioffset, &buf.info, sizeof(buf.info)) < 0)
-@@ -875,23 +893,18 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
- return;
- }
-
-- /* Discard any out-of-order or duplicate ACKs. */
-- if (before_eq(sp->hdr.serial, call->acks_latest)) {
-- _debug("discard ACK %d <= %d",
-- sp->hdr.serial, call->acks_latest);
-- return;
-- }
-- call->acks_latest_ts = skb->tstamp;
-- call->acks_latest = sp->hdr.serial;
--
- if (before(hard_ack, call->tx_hard_ack) ||
- after(hard_ack, call->tx_top))
- return rxrpc_proto_abort("AKW", call, 0);
- if (nr_acks > call->tx_top - hard_ack)
- return rxrpc_proto_abort("AKN", call, 0);
-
-- if (after(hard_ack, call->tx_hard_ack))
-- rxrpc_rotate_tx_window(call, hard_ack, &summary);
-+ if (after(hard_ack, call->tx_hard_ack)) {
-+ if (rxrpc_rotate_tx_window(call, hard_ack, &summary)) {
-+ rxrpc_end_tx_phase(call, false, "ETA");
-+ return;
-+ }
-+ }
-
- if (nr_acks > 0) {
- if (skb_copy_bits(skb, offset, buf.acks, nr_acks) < 0)
-@@ -900,11 +913,6 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,
- &summary);
- }
-
-- if (test_bit(RXRPC_CALL_TX_LAST, &call->flags)) {
-- rxrpc_end_tx_phase(call, false, "ETA");
-- return;
-- }
--
- if (call->rxtx_annotations[call->tx_top & RXRPC_RXTX_BUFF_MASK] &
- RXRPC_TX_ANNO_LAST &&
- summary.nr_acks == call->tx_top - hard_ack &&
-@@ -926,8 +934,7 @@ static void rxrpc_input_ackall(struct rxrpc_call *call, struct sk_buff *skb)
-
- _proto("Rx ACKALL %%%u", sp->hdr.serial);
-
-- rxrpc_rotate_tx_window(call, call->tx_top, &summary);
-- if (test_bit(RXRPC_CALL_TX_LAST, &call->flags))
-+ if (rxrpc_rotate_tx_window(call, call->tx_top, &summary))
- rxrpc_end_tx_phase(call, false, "ETL");
- }
-
-@@ -1137,6 +1144,9 @@ void rxrpc_data_ready(struct sock *udp_sk)
- return;
- }
-
-+ if (skb->tstamp == 0)
-+ skb->tstamp = ktime_get_real();
-+
- rxrpc_new_skb(skb, rxrpc_skb_rx_received);
-
- _net("recv skb %p", skb);
-@@ -1171,10 +1181,6 @@ void rxrpc_data_ready(struct sock *udp_sk)
-
- trace_rxrpc_rx_packet(sp);
-
-- _net("Rx RxRPC %s ep=%x call=%x:%x",
-- sp->hdr.flags & RXRPC_CLIENT_INITIATED ? "ToServer" : "ToClient",
-- sp->hdr.epoch, sp->hdr.cid, sp->hdr.callNumber);
--
- if (sp->hdr.type >= RXRPC_N_PACKET_TYPES ||
- !((RXRPC_SUPPORTED_PACKET_TYPES >> sp->hdr.type) & 1)) {
- _proto("Rx Bad Packet Type %u", sp->hdr.type);
-@@ -1183,13 +1189,13 @@ void rxrpc_data_ready(struct sock *udp_sk)
-
- switch (sp->hdr.type) {
- case RXRPC_PACKET_TYPE_VERSION:
-- if (!(sp->hdr.flags & RXRPC_CLIENT_INITIATED))
-+ if (rxrpc_to_client(sp))
- goto discard;
- rxrpc_post_packet_to_local(local, skb);
- goto out;
-
- case RXRPC_PACKET_TYPE_BUSY:
-- if (sp->hdr.flags & RXRPC_CLIENT_INITIATED)
-+ if (rxrpc_to_server(sp))
- goto discard;
- /* Fall through */
-
-@@ -1269,7 +1275,7 @@ void rxrpc_data_ready(struct sock *udp_sk)
- call = rcu_dereference(chan->call);
-
- if (sp->hdr.callNumber > chan->call_id) {
-- if (!(sp->hdr.flags & RXRPC_CLIENT_INITIATED)) {
-+ if (rxrpc_to_client(sp)) {
- rcu_read_unlock();
- goto reject_packet;
- }
-@@ -1292,7 +1298,7 @@ void rxrpc_data_ready(struct sock *udp_sk)
- }
-
- if (!call || atomic_read(&call->usage) == 0) {
-- if (!(sp->hdr.type & RXRPC_CLIENT_INITIATED) ||
-+ if (rxrpc_to_client(sp) ||
- sp->hdr.callNumber == 0 ||
- sp->hdr.type != RXRPC_PACKET_TYPE_DATA)
- goto bad_message_unlock;
-diff --git a/net/rxrpc/local_object.c b/net/rxrpc/local_object.c
-index b493e6b62740..386dc1f20c73 100644
---- a/net/rxrpc/local_object.c
-+++ b/net/rxrpc/local_object.c
-@@ -135,10 +135,10 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
- }
-
- switch (local->srx.transport.family) {
-- case AF_INET:
-- /* we want to receive ICMP errors */
-+ case AF_INET6:
-+ /* we want to receive ICMPv6 errors */
- opt = 1;
-- ret = kernel_setsockopt(local->socket, SOL_IP, IP_RECVERR,
-+ ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_RECVERR,
- (char *) &opt, sizeof(opt));
- if (ret < 0) {
- _debug("setsockopt failed");
-@@ -146,19 +146,22 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
- }
-
- /* we want to set the don't fragment bit */
-- opt = IP_PMTUDISC_DO;
-- ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER,
-+ opt = IPV6_PMTUDISC_DO;
-+ ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_MTU_DISCOVER,
- (char *) &opt, sizeof(opt));
- if (ret < 0) {
- _debug("setsockopt failed");
- goto error;
- }
-- break;
-
-- case AF_INET6:
-+ /* Fall through and set IPv4 options too otherwise we don't get
-+ * errors from IPv4 packets sent through the IPv6 socket.
-+ */
-+
-+ case AF_INET:
- /* we want to receive ICMP errors */
- opt = 1;
-- ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_RECVERR,
-+ ret = kernel_setsockopt(local->socket, SOL_IP, IP_RECVERR,
- (char *) &opt, sizeof(opt));
- if (ret < 0) {
- _debug("setsockopt failed");
-@@ -166,13 +169,22 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
- }
-
- /* we want to set the don't fragment bit */
-- opt = IPV6_PMTUDISC_DO;
-- ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_MTU_DISCOVER,
-+ opt = IP_PMTUDISC_DO;
-+ ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER,
- (char *) &opt, sizeof(opt));
- if (ret < 0) {
- _debug("setsockopt failed");
- goto error;
- }
-+
-+ /* We want receive timestamps. */
-+ opt = 1;
-+ ret = kernel_setsockopt(local->socket, SOL_SOCKET, SO_TIMESTAMPNS,
-+ (char *)&opt, sizeof(opt));
-+ if (ret < 0) {
-+ _debug("setsockopt failed");
-+ goto error;
-+ }
- break;
-
- default:
-diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c
-index 4774c8f5634d..6ac21bb2071d 100644
---- a/net/rxrpc/output.c
-+++ b/net/rxrpc/output.c
-@@ -124,7 +124,6 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping,
- struct kvec iov[2];
- rxrpc_serial_t serial;
- rxrpc_seq_t hard_ack, top;
-- ktime_t now;
- size_t len, n;
- int ret;
- u8 reason;
-@@ -196,9 +195,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping,
- /* We need to stick a time in before we send the packet in case
- * the reply gets back before kernel_sendmsg() completes - but
- * asking UDP to send the packet can take a relatively long
-- * time, so we update the time after, on the assumption that
-- * the packet transmission is more likely to happen towards the
-- * end of the kernel_sendmsg() call.
-+ * time.
- */
- call->ping_time = ktime_get_real();
- set_bit(RXRPC_CALL_PINGING, &call->flags);
-@@ -206,9 +203,6 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping,
- }
-
- ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
-- now = ktime_get_real();
-- if (ping)
-- call->ping_time = now;
- conn->params.peer->last_tx_at = ktime_get_seconds();
- if (ret < 0)
- trace_rxrpc_tx_fail(call->debug_id, serial, ret,
-@@ -357,8 +351,14 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
-
- /* If our RTT cache needs working on, request an ACK. Also request
- * ACKs if a DATA packet appears to have been lost.
-+ *
-+ * However, we mustn't request an ACK on the last reply packet of a
-+ * service call, lest OpenAFS incorrectly send us an ACK with some
-+ * soft-ACKs in it and then never follow up with a proper hard ACK.
- */
-- if (!(sp->hdr.flags & RXRPC_LAST_PACKET) &&
-+ if ((!(sp->hdr.flags & RXRPC_LAST_PACKET) ||
-+ rxrpc_to_server(sp)
-+ ) &&
- (test_and_clear_bit(RXRPC_CALL_EV_ACK_LOST, &call->events) ||
- retrans ||
- call->cong_mode == RXRPC_CALL_SLOW_START ||
-@@ -384,6 +384,11 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
- goto send_fragmentable;
-
- down_read(&conn->params.local->defrag_sem);
-+
-+ sp->hdr.serial = serial;
-+ smp_wmb(); /* Set serial before timestamp */
-+ skb->tstamp = ktime_get_real();
-+
- /* send the packet by UDP
- * - returns -EMSGSIZE if UDP would have to fragment the packet
- * to go out of the interface
-@@ -404,12 +409,8 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
- trace_rxrpc_tx_data(call, sp->hdr.seq, serial, whdr.flags,
- retrans, lost);
- if (ret >= 0) {
-- ktime_t now = ktime_get_real();
-- skb->tstamp = now;
-- smp_wmb();
-- sp->hdr.serial = serial;
- if (whdr.flags & RXRPC_REQUEST_ACK) {
-- call->peer->rtt_last_req = now;
-+ call->peer->rtt_last_req = skb->tstamp;
- trace_rxrpc_rtt_tx(call, rxrpc_rtt_tx_data, serial);
- if (call->peer->rtt_usage > 1) {
- unsigned long nowj = jiffies, ack_lost_at;
-@@ -448,6 +449,10 @@ int rxrpc_send_data_packet(struct rxrpc_call *call, struct sk_buff *skb,
-
- down_write(&conn->params.local->defrag_sem);
-
-+ sp->hdr.serial = serial;
-+ smp_wmb(); /* Set serial before timestamp */
-+ skb->tstamp = ktime_get_real();
-+
- switch (conn->params.local->srx.transport.family) {
- case AF_INET:
- opt = IP_PMTUDISC_DONT;
-diff --git a/net/rxrpc/peer_event.c b/net/rxrpc/peer_event.c
-index 4f9da2f51c69..f3e6fc670da2 100644
---- a/net/rxrpc/peer_event.c
-+++ b/net/rxrpc/peer_event.c
-@@ -23,6 +23,8 @@
- #include "ar-internal.h"
-
- static void rxrpc_store_error(struct rxrpc_peer *, struct sock_exterr_skb *);
-+static void rxrpc_distribute_error(struct rxrpc_peer *, int,
-+ enum rxrpc_call_completion);
-
- /*
- * Find the peer associated with an ICMP packet.
-@@ -194,8 +196,6 @@ void rxrpc_error_report(struct sock *sk)
- rcu_read_unlock();
- rxrpc_free_skb(skb, rxrpc_skb_rx_freed);
-
-- /* The ref we obtained is passed off to the work item */
-- __rxrpc_queue_peer_error(peer);
- _leave("");
- }
-
-@@ -205,6 +205,7 @@ void rxrpc_error_report(struct sock *sk)
- static void rxrpc_store_error(struct rxrpc_peer *peer,
- struct sock_exterr_skb *serr)
- {
-+ enum rxrpc_call_completion compl = RXRPC_CALL_NETWORK_ERROR;
- struct sock_extended_err *ee;
- int err;
-
-@@ -255,7 +256,7 @@ static void rxrpc_store_error(struct rxrpc_peer *peer,
- case SO_EE_ORIGIN_NONE:
- case SO_EE_ORIGIN_LOCAL:
- _proto("Rx Received local error { error=%d }", err);
-- err += RXRPC_LOCAL_ERROR_OFFSET;
-+ compl = RXRPC_CALL_LOCAL_ERROR;
- break;
-
- case SO_EE_ORIGIN_ICMP6:
-@@ -264,48 +265,23 @@ static void rxrpc_store_error(struct rxrpc_peer *peer,
- break;
- }
-
-- peer->error_report = err;
-+ rxrpc_distribute_error(peer, err, compl);
- }
-
- /*
-- * Distribute an error that occurred on a peer
-+ * Distribute an error that occurred on a peer.
- */
--void rxrpc_peer_error_distributor(struct work_struct *work)
-+static void rxrpc_distribute_error(struct rxrpc_peer *peer, int error,
-+ enum rxrpc_call_completion compl)
- {
-- struct rxrpc_peer *peer =
-- container_of(work, struct rxrpc_peer, error_distributor);
- struct rxrpc_call *call;
-- enum rxrpc_call_completion compl;
-- int error;
--
-- _enter("");
--
-- error = READ_ONCE(peer->error_report);
-- if (error < RXRPC_LOCAL_ERROR_OFFSET) {
-- compl = RXRPC_CALL_NETWORK_ERROR;
-- } else {
-- compl = RXRPC_CALL_LOCAL_ERROR;
-- error -= RXRPC_LOCAL_ERROR_OFFSET;
-- }
-
-- _debug("ISSUE ERROR %s %d", rxrpc_call_completions[compl], error);
--
-- spin_lock_bh(&peer->lock);
--
-- while (!hlist_empty(&peer->error_targets)) {
-- call = hlist_entry(peer->error_targets.first,
-- struct rxrpc_call, error_link);
-- hlist_del_init(&call->error_link);
-+ hlist_for_each_entry_rcu(call, &peer->error_targets, error_link) {
- rxrpc_see_call(call);
--
-- if (rxrpc_set_call_completion(call, compl, 0, -error))
-+ if (call->state < RXRPC_CALL_COMPLETE &&
-+ rxrpc_set_call_completion(call, compl, 0, -error))
- rxrpc_notify_socket(call);
- }
--
-- spin_unlock_bh(&peer->lock);
--
-- rxrpc_put_peer(peer);
-- _leave("");
- }
-
- /*
-diff --git a/net/rxrpc/peer_object.c b/net/rxrpc/peer_object.c
-index 24ec7cdcf332..ef4c2e8a35cc 100644
---- a/net/rxrpc/peer_object.c
-+++ b/net/rxrpc/peer_object.c
-@@ -222,8 +222,6 @@ struct rxrpc_peer *rxrpc_alloc_peer(struct rxrpc_local *local, gfp_t gfp)
- atomic_set(&peer->usage, 1);
- peer->local = local;
- INIT_HLIST_HEAD(&peer->error_targets);
-- INIT_WORK(&peer->error_distributor,
-- &rxrpc_peer_error_distributor);
- peer->service_conns = RB_ROOT;
- seqlock_init(&peer->service_conn_lock);
- spin_lock_init(&peer->lock);
-@@ -415,21 +413,6 @@ struct rxrpc_peer *rxrpc_get_peer_maybe(struct rxrpc_peer *peer)
- return peer;
- }
-
--/*
-- * Queue a peer record. This passes the caller's ref to the workqueue.
-- */
--void __rxrpc_queue_peer_error(struct rxrpc_peer *peer)
--{
-- const void *here = __builtin_return_address(0);
-- int n;
--
-- n = atomic_read(&peer->usage);
-- if (rxrpc_queue_work(&peer->error_distributor))
-- trace_rxrpc_peer(peer, rxrpc_peer_queued_error, n, here);
-- else
-- rxrpc_put_peer(peer);
--}
--
- /*
- * Discard a peer record.
- */
-diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
-index f74513a7c7a8..c855fd045a3c 100644
---- a/net/sched/cls_api.c
-+++ b/net/sched/cls_api.c
-@@ -31,6 +31,8 @@
- #include <net/pkt_sched.h>
- #include <net/pkt_cls.h>
-
-+extern const struct nla_policy rtm_tca_policy[TCA_MAX + 1];
-+
- /* The list of all installed classifier types */
- static LIST_HEAD(tcf_proto_base);
-
-@@ -1083,7 +1085,7 @@ static int tc_new_tfilter(struct sk_buff *skb, struct nlmsghdr *n,
- replay:
- tp_created = 0;
-
-- err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, NULL, extack);
-+ err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, rtm_tca_policy, extack);
- if (err < 0)
- return err;
-
-@@ -1226,7 +1228,7 @@ static int tc_del_tfilter(struct sk_buff *skb, struct nlmsghdr *n,
- if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN))
- return -EPERM;
-
-- err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, NULL, extack);
-+ err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, rtm_tca_policy, extack);
- if (err < 0)
- return err;
-
-@@ -1334,7 +1336,7 @@ static int tc_get_tfilter(struct sk_buff *skb, struct nlmsghdr *n,
- void *fh = NULL;
- int err;
-
-- err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, NULL, extack);
-+ err = nlmsg_parse(n, sizeof(*t), tca, TCA_MAX, rtm_tca_policy, extack);
- if (err < 0)
- return err;
-
-@@ -1488,7 +1490,8 @@ static int tc_dump_tfilter(struct sk_buff *skb, struct netlink_callback *cb)
- if (nlmsg_len(cb->nlh) < sizeof(*tcm))
- return skb->len;
-
-- err = nlmsg_parse(cb->nlh, sizeof(*tcm), tca, TCA_MAX, NULL, NULL);
-+ err = nlmsg_parse(cb->nlh, sizeof(*tcm), tca, TCA_MAX, rtm_tca_policy,
-+ NULL);
- if (err)
- return err;
-
-diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
-index 99cc25aae503..57f71765febe 100644
---- a/net/sched/sch_api.c
-+++ b/net/sched/sch_api.c
-@@ -2052,7 +2052,8 @@ static int tc_dump_tclass_root(struct Qdisc *root, struct sk_buff *skb,
-
- if (tcm->tcm_parent) {
- q = qdisc_match_from_root(root, TC_H_MAJ(tcm->tcm_parent));
-- if (q && tc_dump_tclass_qdisc(q, skb, tcm, cb, t_p, s_t) < 0)
-+ if (q && q != root &&
-+ tc_dump_tclass_qdisc(q, skb, tcm, cb, t_p, s_t) < 0)
- return -1;
- return 0;
- }
-diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c
-index cbe4831f46f4..4a042abf844c 100644
---- a/net/sched/sch_gred.c
-+++ b/net/sched/sch_gred.c
-@@ -413,7 +413,7 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt,
- if (tb[TCA_GRED_PARMS] == NULL && tb[TCA_GRED_STAB] == NULL) {
- if (tb[TCA_GRED_LIMIT] != NULL)
- sch->limit = nla_get_u32(tb[TCA_GRED_LIMIT]);
-- return gred_change_table_def(sch, opt);
-+ return gred_change_table_def(sch, tb[TCA_GRED_DPS]);
- }
-
- if (tb[TCA_GRED_PARMS] == NULL ||
-diff --git a/net/sctp/socket.c b/net/sctp/socket.c
-index 50ee07cd20c4..9d903b870790 100644
---- a/net/sctp/socket.c
-+++ b/net/sctp/socket.c
-@@ -270,11 +270,10 @@ struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id)
-
- spin_lock_bh(&sctp_assocs_id_lock);
- asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id);
-+ if (asoc && (asoc->base.sk != sk || asoc->base.dead))
-+ asoc = NULL;
- spin_unlock_bh(&sctp_assocs_id_lock);
-
-- if (!asoc || (asoc->base.sk != sk) || asoc->base.dead)
-- return NULL;
--
- return asoc;
- }
-
-@@ -1940,8 +1939,10 @@ static int sctp_sendmsg_to_asoc(struct sctp_association *asoc,
- if (sp->strm_interleave) {
- timeo = sock_sndtimeo(sk, 0);
- err = sctp_wait_for_connect(asoc, &timeo);
-- if (err)
-+ if (err) {
-+ err = -ESRCH;
- goto err;
-+ }
- } else {
- wait_connect = true;
- }
-diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c
-index add82b0266f3..3be95f77ec7f 100644
---- a/net/smc/smc_core.c
-+++ b/net/smc/smc_core.c
-@@ -114,22 +114,17 @@ static void __smc_lgr_unregister_conn(struct smc_connection *conn)
- sock_put(&smc->sk); /* sock_hold in smc_lgr_register_conn() */
- }
-
--/* Unregister connection and trigger lgr freeing if applicable
-+/* Unregister connection from lgr
- */
- static void smc_lgr_unregister_conn(struct smc_connection *conn)
- {
- struct smc_link_group *lgr = conn->lgr;
-- int reduced = 0;
-
- write_lock_bh(&lgr->conns_lock);
- if (conn->alert_token_local) {
-- reduced = 1;
- __smc_lgr_unregister_conn(conn);
- }
- write_unlock_bh(&lgr->conns_lock);
-- if (!reduced || lgr->conns_num)
-- return;
-- smc_lgr_schedule_free_work(lgr);
- }
-
- static void smc_lgr_free_work(struct work_struct *work)
-@@ -238,7 +233,8 @@ static int smc_lgr_create(struct smc_sock *smc,
- return rc;
- }
-
--static void smc_buf_unuse(struct smc_connection *conn)
-+static void smc_buf_unuse(struct smc_connection *conn,
-+ struct smc_link_group *lgr)
- {
- if (conn->sndbuf_desc)
- conn->sndbuf_desc->used = 0;
-@@ -248,8 +244,6 @@ static void smc_buf_unuse(struct smc_connection *conn)
- conn->rmb_desc->used = 0;
- } else {
- /* buf registration failed, reuse not possible */
-- struct smc_link_group *lgr = conn->lgr;
--
- write_lock_bh(&lgr->rmbs_lock);
- list_del(&conn->rmb_desc->list);
- write_unlock_bh(&lgr->rmbs_lock);
-@@ -262,11 +256,16 @@ static void smc_buf_unuse(struct smc_connection *conn)
- /* remove a finished connection from its link group */
- void smc_conn_free(struct smc_connection *conn)
- {
-- if (!conn->lgr)
-+ struct smc_link_group *lgr = conn->lgr;
-+
-+ if (!lgr)
- return;
- smc_cdc_tx_dismiss_slots(conn);
-- smc_lgr_unregister_conn(conn);
-- smc_buf_unuse(conn);
-+ smc_lgr_unregister_conn(conn); /* unsets conn->lgr */
-+ smc_buf_unuse(conn, lgr); /* allow buffer reuse */
-+
-+ if (!lgr->conns_num)
-+ smc_lgr_schedule_free_work(lgr);
- }
-
- static void smc_link_clear(struct smc_link *lnk)
-diff --git a/net/socket.c b/net/socket.c
-index d4187ac17d55..fcb18a7ed14b 100644
---- a/net/socket.c
-+++ b/net/socket.c
-@@ -2887,9 +2887,14 @@ static int ethtool_ioctl(struct net *net, struct compat_ifreq __user *ifr32)
- copy_in_user(&rxnfc->fs.ring_cookie,
- &compat_rxnfc->fs.ring_cookie,
- (void __user *)(&rxnfc->fs.location + 1) -
-- (void __user *)&rxnfc->fs.ring_cookie) ||
-- copy_in_user(&rxnfc->rule_cnt, &compat_rxnfc->rule_cnt,
-- sizeof(rxnfc->rule_cnt)))
-+ (void __user *)&rxnfc->fs.ring_cookie))
-+ return -EFAULT;
-+ if (ethcmd == ETHTOOL_GRXCLSRLALL) {
-+ if (put_user(rule_cnt, &rxnfc->rule_cnt))
-+ return -EFAULT;
-+ } else if (copy_in_user(&rxnfc->rule_cnt,
-+ &compat_rxnfc->rule_cnt,
-+ sizeof(rxnfc->rule_cnt)))
- return -EFAULT;
- }
-
-diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c
-index 51b4b96f89db..3cfeb9df64b0 100644
---- a/net/tipc/name_distr.c
-+++ b/net/tipc/name_distr.c
-@@ -115,7 +115,7 @@ struct sk_buff *tipc_named_withdraw(struct net *net, struct publication *publ)
- struct sk_buff *buf;
- struct distr_item *item;
-
-- list_del(&publ->binding_node);
-+ list_del_rcu(&publ->binding_node);
-
- if (publ->scope == TIPC_NODE_SCOPE)
- return NULL;
-@@ -147,7 +147,7 @@ static void named_distribute(struct net *net, struct sk_buff_head *list,
- ITEM_SIZE) * ITEM_SIZE;
- u32 msg_rem = msg_dsz;
-
-- list_for_each_entry(publ, pls, binding_node) {
-+ list_for_each_entry_rcu(publ, pls, binding_node) {
- /* Prepare next buffer: */
- if (!skb) {
- skb = named_prepare_buf(net, PUBLICATION, msg_rem,
-diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
-index 9fab8e5a4a5b..994ddc7ec9b1 100644
---- a/net/tls/tls_sw.c
-+++ b/net/tls/tls_sw.c
-@@ -286,7 +286,7 @@ static int zerocopy_from_iter(struct sock *sk, struct iov_iter *from,
- int length, int *pages_used,
- unsigned int *size_used,
- struct scatterlist *to, int to_max_pages,
-- bool charge, bool revert)
-+ bool charge)
- {
- struct page *pages[MAX_SKB_FRAGS];
-
-@@ -335,10 +335,10 @@ static int zerocopy_from_iter(struct sock *sk, struct iov_iter *from,
- }
-
- out:
-+ if (rc)
-+ iov_iter_revert(from, size - *size_used);
- *size_used = size;
- *pages_used = num_elem;
-- if (revert)
-- iov_iter_revert(from, size);
-
- return rc;
- }
-@@ -440,7 +440,7 @@ int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
- &ctx->sg_plaintext_size,
- ctx->sg_plaintext_data,
- ARRAY_SIZE(ctx->sg_plaintext_data),
-- true, false);
-+ true);
- if (ret)
- goto fallback_to_reg_send;
-
-@@ -453,8 +453,6 @@ int tls_sw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
-
- copied -= try_to_copy;
- fallback_to_reg_send:
-- iov_iter_revert(&msg->msg_iter,
-- ctx->sg_plaintext_size - orig_size);
- trim_sg(sk, ctx->sg_plaintext_data,
- &ctx->sg_plaintext_num_elem,
- &ctx->sg_plaintext_size,
-@@ -828,7 +826,7 @@ int tls_sw_recvmsg(struct sock *sk,
- err = zerocopy_from_iter(sk, &msg->msg_iter,
- to_copy, &pages,
- &chunk, &sgin[1],
-- MAX_SKB_FRAGS, false, true);
-+ MAX_SKB_FRAGS, false);
- if (err < 0)
- goto fallback_to_reg_recv;
-
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 733ccf867972..214f9ef79a64 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -3699,6 +3699,7 @@ static bool ht_rateset_to_mask(struct ieee80211_supported_band *sband,
- return false;
-
- /* check availability */
-+ ridx = array_index_nospec(ridx, IEEE80211_HT_MCS_MASK_LEN);
- if (sband->ht_cap.mcs.rx_mask[ridx] & rbit)
- mcs[ridx] |= rbit;
- else
-@@ -10124,7 +10125,7 @@ static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
- struct wireless_dev *wdev = dev->ieee80211_ptr;
- s32 last, low, high;
- u32 hyst;
-- int i, n;
-+ int i, n, low_index;
- int err;
-
- /* RSSI reporting disabled? */
-@@ -10161,10 +10162,19 @@ static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
- if (last < wdev->cqm_config->rssi_thresholds[i])
- break;
-
-- low = i > 0 ?
-- (wdev->cqm_config->rssi_thresholds[i - 1] - hyst) : S32_MIN;
-- high = i < n ?
-- (wdev->cqm_config->rssi_thresholds[i] + hyst - 1) : S32_MAX;
-+ low_index = i - 1;
-+ if (low_index >= 0) {
-+ low_index = array_index_nospec(low_index, n);
-+ low = wdev->cqm_config->rssi_thresholds[low_index] - hyst;
-+ } else {
-+ low = S32_MIN;
-+ }
-+ if (i < n) {
-+ i = array_index_nospec(i, n);
-+ high = wdev->cqm_config->rssi_thresholds[i] + hyst - 1;
-+ } else {
-+ high = S32_MAX;
-+ }
-
- return rdev_set_cqm_rssi_range_config(rdev, dev, low, high);
- }
-diff --git a/net/wireless/reg.c b/net/wireless/reg.c
-index 2f702adf2912..24cfa2776f50 100644
---- a/net/wireless/reg.c
-+++ b/net/wireless/reg.c
-@@ -2661,11 +2661,12 @@ static void reg_process_hint(struct regulatory_request *reg_request)
- {
- struct wiphy *wiphy = NULL;
- enum reg_request_treatment treatment;
-+ enum nl80211_reg_initiator initiator = reg_request->initiator;
-
- if (reg_request->wiphy_idx != WIPHY_IDX_INVALID)
- wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);
-
-- switch (reg_request->initiator) {
-+ switch (initiator) {
- case NL80211_REGDOM_SET_BY_CORE:
- treatment = reg_process_hint_core(reg_request);
- break;
-@@ -2683,7 +2684,7 @@ static void reg_process_hint(struct regulatory_request *reg_request)
- treatment = reg_process_hint_country_ie(wiphy, reg_request);
- break;
- default:
-- WARN(1, "invalid initiator %d\n", reg_request->initiator);
-+ WARN(1, "invalid initiator %d\n", initiator);
- goto out_free;
- }
-
-@@ -2698,7 +2699,7 @@ static void reg_process_hint(struct regulatory_request *reg_request)
- */
- if (treatment == REG_REQ_ALREADY_SET && wiphy &&
- wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
-- wiphy_update_regulatory(wiphy, reg_request->initiator);
-+ wiphy_update_regulatory(wiphy, initiator);
- wiphy_all_share_dfs_chan_state(wiphy);
- reg_check_channels();
- }
-@@ -2867,6 +2868,7 @@ static int regulatory_hint_core(const char *alpha2)
- request->alpha2[0] = alpha2[0];
- request->alpha2[1] = alpha2[1];
- request->initiator = NL80211_REGDOM_SET_BY_CORE;
-+ request->wiphy_idx = WIPHY_IDX_INVALID;
-
- queue_regulatory_request(request);
-
-diff --git a/net/wireless/scan.c b/net/wireless/scan.c
-index d36c3eb7b931..d0e7472dd9fd 100644
---- a/net/wireless/scan.c
-+++ b/net/wireless/scan.c
-@@ -1058,13 +1058,23 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
- return NULL;
- }
-
-+/*
-+ * Update RX channel information based on the available frame payload
-+ * information. This is mainly for the 2.4 GHz band where frames can be received
-+ * from neighboring channels and the Beacon frames use the DSSS Parameter Set
-+ * element to indicate the current (transmitting) channel, but this might also
-+ * be needed on other bands if RX frequency does not match with the actual
-+ * operating channel of a BSS.
-+ */
- static struct ieee80211_channel *
- cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
-- struct ieee80211_channel *channel)
-+ struct ieee80211_channel *channel,
-+ enum nl80211_bss_scan_width scan_width)
- {
- const u8 *tmp;
- u32 freq;
- int channel_number = -1;
-+ struct ieee80211_channel *alt_channel;
-
- tmp = cfg80211_find_ie(WLAN_EID_DS_PARAMS, ie, ielen);
- if (tmp && tmp[1] == 1) {
-@@ -1078,16 +1088,45 @@ cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
- }
- }
-
-- if (channel_number < 0)
-+ if (channel_number < 0) {
-+ /* No channel information in frame payload */
- return channel;
-+ }
-
- freq = ieee80211_channel_to_frequency(channel_number, channel->band);
-- channel = ieee80211_get_channel(wiphy, freq);
-- if (!channel)
-- return NULL;
-- if (channel->flags & IEEE80211_CHAN_DISABLED)
-+ alt_channel = ieee80211_get_channel(wiphy, freq);
-+ if (!alt_channel) {
-+ if (channel->band == NL80211_BAND_2GHZ) {
-+ /*
-+ * Better not allow unexpected channels when that could
-+ * be going beyond the 1-11 range (e.g., discovering
-+ * BSS on channel 12 when radio is configured for
-+ * channel 11.
-+ */
-+ return NULL;
-+ }
-+
-+ /* No match for the payload channel number - ignore it */
-+ return channel;
-+ }
-+
-+ if (scan_width == NL80211_BSS_CHAN_WIDTH_10 ||
-+ scan_width == NL80211_BSS_CHAN_WIDTH_5) {
-+ /*
-+ * Ignore channel number in 5 and 10 MHz channels where there
-+ * may not be an n:1 or 1:n mapping between frequencies and
-+ * channel numbers.
-+ */
-+ return channel;
-+ }
-+
-+ /*
-+ * Use the channel determined through the payload channel number
-+ * instead of the RX channel reported by the driver.
-+ */
-+ if (alt_channel->flags & IEEE80211_CHAN_DISABLED)
- return NULL;
-- return channel;
-+ return alt_channel;
- }
-
- /* Returned bss is reference counted and must be cleaned up appropriately. */
-@@ -1112,7 +1151,8 @@ cfg80211_inform_bss_data(struct wiphy *wiphy,
- (data->signal < 0 || data->signal > 100)))
- return NULL;
-
-- channel = cfg80211_get_bss_channel(wiphy, ie, ielen, data->chan);
-+ channel = cfg80211_get_bss_channel(wiphy, ie, ielen, data->chan,
-+ data->scan_width);
- if (!channel)
- return NULL;
-
-@@ -1210,7 +1250,7 @@ cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
- return NULL;
-
- channel = cfg80211_get_bss_channel(wiphy, mgmt->u.beacon.variable,
-- ielen, data->chan);
-+ ielen, data->chan, data->scan_width);
- if (!channel)
- return NULL;
-
-diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c
-index 352abca2605f..86f5afbd0a0c 100644
---- a/net/xfrm/xfrm_input.c
-+++ b/net/xfrm/xfrm_input.c
-@@ -453,6 +453,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
- XFRM_INC_STATS(net, LINUX_MIB_XFRMINHDRERROR);
- goto drop;
- }
-+ crypto_done = false;
- } while (!err);
-
- err = xfrm_rcv_cb(skb, family, x->type->proto, 0);
-diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c
-index 89b178a78dc7..36d15a38ce5e 100644
---- a/net/xfrm/xfrm_output.c
-+++ b/net/xfrm/xfrm_output.c
-@@ -101,6 +101,10 @@ static int xfrm_output_one(struct sk_buff *skb, int err)
- spin_unlock_bh(&x->lock);
-
- skb_dst_force(skb);
-+ if (!skb_dst(skb)) {
-+ XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR);
-+ goto error_nolock;
-+ }
-
- if (xfrm_offload(skb)) {
- x->type_offload->encap(x, skb);
-diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
-index a94983e03a8b..526e6814ed4b 100644
---- a/net/xfrm/xfrm_policy.c
-+++ b/net/xfrm/xfrm_policy.c
-@@ -2551,6 +2551,10 @@ int __xfrm_route_forward(struct sk_buff *skb, unsigned short family)
- }
-
- skb_dst_force(skb);
-+ if (!skb_dst(skb)) {
-+ XFRM_INC_STATS(net, LINUX_MIB_XFRMFWDHDRERROR);
-+ return 0;
-+ }
-
- dst = xfrm_lookup(net, skb_dst(skb), &fl, NULL, XFRM_LOOKUP_QUEUE);
- if (IS_ERR(dst)) {
-diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
-index 33878e6e0d0a..d0672c400c2f 100644
---- a/net/xfrm/xfrm_user.c
-+++ b/net/xfrm/xfrm_user.c
-@@ -151,10 +151,16 @@ static int verify_newsa_info(struct xfrm_usersa_info *p,
- err = -EINVAL;
- switch (p->family) {
- case AF_INET:
-+ if (p->sel.prefixlen_d > 32 || p->sel.prefixlen_s > 32)
-+ goto out;
-+
- break;
-
- case AF_INET6:
- #if IS_ENABLED(CONFIG_IPV6)
-+ if (p->sel.prefixlen_d > 128 || p->sel.prefixlen_s > 128)
-+ goto out;
-+
- break;
- #else
- err = -EAFNOSUPPORT;
-@@ -1359,10 +1365,16 @@ static int verify_newpolicy_info(struct xfrm_userpolicy_info *p)
-
- switch (p->sel.family) {
- case AF_INET:
-+ if (p->sel.prefixlen_d > 32 || p->sel.prefixlen_s > 32)
-+ return -EINVAL;
-+
- break;
-
- case AF_INET6:
- #if IS_ENABLED(CONFIG_IPV6)
-+ if (p->sel.prefixlen_d > 128 || p->sel.prefixlen_s > 128)
-+ return -EINVAL;
-+
- break;
- #else
- return -EAFNOSUPPORT;
-@@ -1443,6 +1455,9 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family)
- (ut[i].family != prev_family))
- return -EINVAL;
-
-+ if (ut[i].mode >= XFRM_MODE_MAX)
-+ return -EINVAL;
-+
- prev_family = ut[i].family;
-
- switch (ut[i].family) {
-diff --git a/tools/perf/Makefile b/tools/perf/Makefile
-index 225454416ed5..7902a5681fc8 100644
---- a/tools/perf/Makefile
-+++ b/tools/perf/Makefile
-@@ -84,10 +84,10 @@ endif # has_clean
- endif # MAKECMDGOALS
-
- #
--# The clean target is not really parallel, don't print the jobs info:
-+# Explicitly disable parallelism for the clean target.
- #
- clean:
-- $(make)
-+ $(make) -j1
-
- #
- # The build-test target is not really parallel, don't print the jobs info,
-diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
-index 22dbb6612b41..b70cce40ca97 100644
---- a/tools/perf/util/machine.c
-+++ b/tools/perf/util/machine.c
-@@ -2246,7 +2246,8 @@ static int append_inlines(struct callchain_cursor *cursor,
- if (!symbol_conf.inline_name || !map || !sym)
- return ret;
-
-- addr = map__rip_2objdump(map, ip);
-+ addr = map__map_ip(map, ip);
-+ addr = map__rip_2objdump(map, addr);
-
- inline_node = inlines__tree_find(&map->dso->inlined_nodes, addr);
- if (!inline_node) {
-@@ -2272,7 +2273,7 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)
- {
- struct callchain_cursor *cursor = arg;
- const char *srcline = NULL;
-- u64 addr;
-+ u64 addr = entry->ip;
-
- if (symbol_conf.hide_unresolved && entry->sym == NULL)
- return 0;
-@@ -2284,7 +2285,8 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)
- * Convert entry->ip from a virtual address to an offset in
- * its corresponding binary.
- */
-- addr = map__map_ip(entry->map, entry->ip);
-+ if (entry->map)
-+ addr = map__map_ip(entry->map, entry->ip);
-
- srcline = callchain_srcline(entry->map, entry->sym, addr);
- return callchain_cursor_append(cursor, entry->ip,
-diff --git a/tools/perf/util/setup.py b/tools/perf/util/setup.py
-index 001be4f9d3b9..a5f9e236cc71 100644
---- a/tools/perf/util/setup.py
-+++ b/tools/perf/util/setup.py
-@@ -27,7 +27,7 @@ class install_lib(_install_lib):
-
- cflags = getenv('CFLAGS', '').split()
- # switch off several checks (need to be at the end of cflags list)
--cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter' ]
-+cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls' ]
- if cc != "clang":
- cflags += ['-Wno-cast-function-type' ]
-
-diff --git a/tools/testing/selftests/net/fib-onlink-tests.sh b/tools/testing/selftests/net/fib-onlink-tests.sh
-index 3991ad1a368d..864f865eee55 100755
---- a/tools/testing/selftests/net/fib-onlink-tests.sh
-+++ b/tools/testing/selftests/net/fib-onlink-tests.sh
-@@ -167,8 +167,8 @@ setup()
- # add vrf table
- ip li add ${VRF} type vrf table ${VRF_TABLE}
- ip li set ${VRF} up
-- ip ro add table ${VRF_TABLE} unreachable default
-- ip -6 ro add table ${VRF_TABLE} unreachable default
-+ ip ro add table ${VRF_TABLE} unreachable default metric 8192
-+ ip -6 ro add table ${VRF_TABLE} unreachable default metric 8192
-
- # create test interfaces
- ip li add ${NETIFS[p1]} type veth peer name ${NETIFS[p2]}
-@@ -185,20 +185,20 @@ setup()
- for n in 1 3 5 7; do
- ip li set ${NETIFS[p${n}]} up
- ip addr add ${V4ADDRS[p${n}]}/24 dev ${NETIFS[p${n}]}
-- ip addr add ${V6ADDRS[p${n}]}/64 dev ${NETIFS[p${n}]}
-+ ip addr add ${V6ADDRS[p${n}]}/64 dev ${NETIFS[p${n}]} nodad
- done
-
- # move peer interfaces to namespace and add addresses
- for n in 2 4 6 8; do
- ip li set ${NETIFS[p${n}]} netns ${PEER_NS} up
- ip -netns ${PEER_NS} addr add ${V4ADDRS[p${n}]}/24 dev ${NETIFS[p${n}]}
-- ip -netns ${PEER_NS} addr add ${V6ADDRS[p${n}]}/64 dev ${NETIFS[p${n}]}
-+ ip -netns ${PEER_NS} addr add ${V6ADDRS[p${n}]}/64 dev ${NETIFS[p${n}]} nodad
- done
-
-- set +e
-+ ip -6 ro add default via ${V6ADDRS[p3]/::[0-9]/::64}
-+ ip -6 ro add table ${VRF_TABLE} default via ${V6ADDRS[p7]/::[0-9]/::64}
-
-- # let DAD complete - assume default of 1 probe
-- sleep 1
-+ set +e
- }
-
- cleanup()
-diff --git a/tools/testing/selftests/net/rtnetlink.sh b/tools/testing/selftests/net/rtnetlink.sh
-index 0d7a44fa30af..8e509cbcb209 100755
---- a/tools/testing/selftests/net/rtnetlink.sh
-+++ b/tools/testing/selftests/net/rtnetlink.sh
-@@ -1,4 +1,4 @@
--#!/bin/sh
-+#!/bin/bash
- #
- # This test is for checking rtnetlink callpaths, and get as much coverage as possible.
- #
-diff --git a/tools/testing/selftests/net/udpgso_bench.sh b/tools/testing/selftests/net/udpgso_bench.sh
-index 850767befa47..99e537ab5ad9 100755
---- a/tools/testing/selftests/net/udpgso_bench.sh
-+++ b/tools/testing/selftests/net/udpgso_bench.sh
-@@ -1,4 +1,4 @@
--#!/bin/sh
-+#!/bin/bash
- # SPDX-License-Identifier: GPL-2.0
- #
- # Run a series of udpgso benchmarks
diff --git a/linux_v4.18.16-v4.18.19.patch.gz b/linux_v4.18.16-v4.18.19.patch.gz
new file mode 100644
index 000000000000..7e68736f50c5
--- /dev/null
+++ b/linux_v4.18.16-v4.18.19.patch.gz
Binary files differ