summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--0000_README4
-rw-r--r--1075_linux-5.4.76.patch3630
2 files changed, 3634 insertions, 0 deletions
diff --git a/0000_README b/0000_README
index 8420d985..c41c32cf 100644
--- a/0000_README
+++ b/0000_README
@@ -343,6 +343,10 @@ Patch: 1074_linux-5.4.75.patch
From: http://www.kernel.org
Desc: Linux 5.4.75
+Patch: 1075_linux-5.4.76.patch
+From: http://www.kernel.org
+Desc: Linux 5.4.76
+
Patch: 1500_XATTR_USER_PREFIX.patch
From: https://bugs.gentoo.org/show_bug.cgi?id=470644
Desc: Support for namespace user.pax.* on tmpfs.
diff --git a/1075_linux-5.4.76.patch b/1075_linux-5.4.76.patch
new file mode 100644
index 00000000..8b7b8823
--- /dev/null
+++ b/1075_linux-5.4.76.patch
@@ -0,0 +1,3630 @@
+diff --git a/Documentation/asm-annotations.rst b/Documentation/asm-annotations.rst
+new file mode 100644
+index 0000000000000..29ccd6e61fe5c
+--- /dev/null
++++ b/Documentation/asm-annotations.rst
+@@ -0,0 +1,216 @@
++Assembler Annotations
++=====================
++
++Copyright (c) 2017-2019 Jiri Slaby
++
++This document describes the new macros for annotation of data and code in
++assembly. In particular, it contains information about ``SYM_FUNC_START``,
++``SYM_FUNC_END``, ``SYM_CODE_START``, and similar.
++
++Rationale
++---------
++Some code like entries, trampolines, or boot code needs to be written in
++assembly. The same as in C, such code is grouped into functions and
++accompanied with data. Standard assemblers do not force users into precisely
++marking these pieces as code, data, or even specifying their length.
++Nevertheless, assemblers provide developers with such annotations to aid
++debuggers throughout assembly. On top of that, developers also want to mark
++some functions as *global* in order to be visible outside of their translation
++units.
++
++Over time, the Linux kernel has adopted macros from various projects (like
++``binutils``) to facilitate such annotations. So for historic reasons,
++developers have been using ``ENTRY``, ``END``, ``ENDPROC``, and other
++annotations in assembly. Due to the lack of their documentation, the macros
++are used in rather wrong contexts at some locations. Clearly, ``ENTRY`` was
++intended to denote the beginning of global symbols (be it data or code).
++``END`` used to mark the end of data or end of special functions with
++*non-standard* calling convention. In contrast, ``ENDPROC`` should annotate
++only ends of *standard* functions.
++
++When these macros are used correctly, they help assemblers generate a nice
++object with both sizes and types set correctly. For example, the result of
++``arch/x86/lib/putuser.S``::
++
++ Num: Value Size Type Bind Vis Ndx Name
++ 25: 0000000000000000 33 FUNC GLOBAL DEFAULT 1 __put_user_1
++ 29: 0000000000000030 37 FUNC GLOBAL DEFAULT 1 __put_user_2
++ 32: 0000000000000060 36 FUNC GLOBAL DEFAULT 1 __put_user_4
++ 35: 0000000000000090 37 FUNC GLOBAL DEFAULT 1 __put_user_8
++
++This is not only important for debugging purposes. When there are properly
++annotated objects like this, tools can be run on them to generate more useful
++information. In particular, on properly annotated objects, ``objtool`` can be
++run to check and fix the object if needed. Currently, ``objtool`` can report
++missing frame pointer setup/destruction in functions. It can also
++automatically generate annotations for :doc:`ORC unwinder <x86/orc-unwinder>`
++for most code. Both of these are especially important to support reliable
++stack traces which are in turn necessary for :doc:`Kernel live patching
++<livepatch/livepatch>`.
++
++Caveat and Discussion
++---------------------
++As one might realize, there were only three macros previously. That is indeed
++insufficient to cover all the combinations of cases:
++
++* standard/non-standard function
++* code/data
++* global/local symbol
++
++There was a discussion_ and instead of extending the current ``ENTRY/END*``
++macros, it was decided that brand new macros should be introduced instead::
++
++ So how about using macro names that actually show the purpose, instead
++ of importing all the crappy, historic, essentially randomly chosen
++ debug symbol macro names from the binutils and older kernels?
++
++.. _discussion: https://lkml.kernel.org/r/20170217104757.28588-1-jslaby@suse.cz
++
++Macros Description
++------------------
++
++The new macros are prefixed with the ``SYM_`` prefix and can be divided into
++three main groups:
++
++1. ``SYM_FUNC_*`` -- to annotate C-like functions. This means functions with
++ standard C calling conventions, i.e. the stack contains a return address at
++ the predefined place and a return from the function can happen in a
++ standard way. When frame pointers are enabled, save/restore of frame
++ pointer shall happen at the start/end of a function, respectively, too.
++
++ Checking tools like ``objtool`` should ensure such marked functions conform
++ to these rules. The tools can also easily annotate these functions with
++ debugging information (like *ORC data*) automatically.
++
++2. ``SYM_CODE_*`` -- special functions called with special stack. Be it
++ interrupt handlers with special stack content, trampolines, or startup
++ functions.
++
++ Checking tools mostly ignore checking of these functions. But some debug
++ information still can be generated automatically. For correct debug data,
++ this code needs hints like ``UNWIND_HINT_REGS`` provided by developers.
++
++3. ``SYM_DATA*`` -- obviously data belonging to ``.data`` sections and not to
++ ``.text``. Data do not contain instructions, so they have to be treated
++ specially by the tools: they should not treat the bytes as instructions,
++ nor assign any debug information to them.
++
++Instruction Macros
++~~~~~~~~~~~~~~~~~~
++This section covers ``SYM_FUNC_*`` and ``SYM_CODE_*`` enumerated above.
++
++* ``SYM_FUNC_START`` and ``SYM_FUNC_START_LOCAL`` are supposed to be **the
++ most frequent markings**. They are used for functions with standard calling
++ conventions -- global and local. Like in C, they both align the functions to
++ architecture specific ``__ALIGN`` bytes. There are also ``_NOALIGN`` variants
++ for special cases where developers do not want this implicit alignment.
++
++ ``SYM_FUNC_START_WEAK`` and ``SYM_FUNC_START_WEAK_NOALIGN`` markings are
++ also offered as an assembler counterpart to the *weak* attribute known from
++ C.
++
++ All of these **shall** be coupled with ``SYM_FUNC_END``. First, it marks
++ the sequence of instructions as a function and computes its size to the
++ generated object file. Second, it also eases checking and processing such
++ object files as the tools can trivially find exact function boundaries.
++
++ So in most cases, developers should write something like in the following
++ example, having some asm instructions in between the macros, of course::
++
++ SYM_FUNC_START(function_hook)
++ ... asm insns ...
++ SYM_FUNC_END(function_hook)
++
++ In fact, this kind of annotation corresponds to the now deprecated ``ENTRY``
++ and ``ENDPROC`` macros.
++
++* ``SYM_FUNC_START_ALIAS`` and ``SYM_FUNC_START_LOCAL_ALIAS`` serve for those
++ who decided to have two or more names for one function. The typical use is::
++
++ SYM_FUNC_START_ALIAS(__memset)
++ SYM_FUNC_START(memset)
++ ... asm insns ...
++ SYM_FUNC_END(memset)
++ SYM_FUNC_END_ALIAS(__memset)
++
++ In this example, one can call ``__memset`` or ``memset`` with the same
++ result, except the debug information for the instructions is generated to
++ the object file only once -- for the non-``ALIAS`` case.
++
++* ``SYM_CODE_START`` and ``SYM_CODE_START_LOCAL`` should be used only in
++ special cases -- if you know what you are doing. This is used exclusively
++ for interrupt handlers and similar where the calling convention is not the C
++ one. ``_NOALIGN`` variants exist too. The use is the same as for the ``FUNC``
++ category above::
++
++ SYM_CODE_START_LOCAL(bad_put_user)
++ ... asm insns ...
++ SYM_CODE_END(bad_put_user)
++
++ Again, every ``SYM_CODE_START*`` **shall** be coupled by ``SYM_CODE_END``.
++
++ To some extent, this category corresponds to deprecated ``ENTRY`` and
++ ``END``. Except ``END`` had several other meanings too.
++
++* ``SYM_INNER_LABEL*`` is used to denote a label inside some
++ ``SYM_{CODE,FUNC}_START`` and ``SYM_{CODE,FUNC}_END``. They are very similar
++ to C labels, except they can be made global. An example of use::
++
++ SYM_CODE_START(ftrace_caller)
++ /* save_mcount_regs fills in first two parameters */
++ ...
++
++ SYM_INNER_LABEL(ftrace_caller_op_ptr, SYM_L_GLOBAL)
++ /* Load the ftrace_ops into the 3rd parameter */
++ ...
++
++ SYM_INNER_LABEL(ftrace_call, SYM_L_GLOBAL)
++ call ftrace_stub
++ ...
++ retq
++ SYM_CODE_END(ftrace_caller)
++
++Data Macros
++~~~~~~~~~~~
++Similar to instructions, there is a couple of macros to describe data in the
++assembly.
++
++* ``SYM_DATA_START`` and ``SYM_DATA_START_LOCAL`` mark the start of some data
++ and shall be used in conjunction with either ``SYM_DATA_END``, or
++ ``SYM_DATA_END_LABEL``. The latter adds also a label to the end, so that
++ people can use ``lstack`` and (local) ``lstack_end`` in the following
++ example::
++
++ SYM_DATA_START_LOCAL(lstack)
++ .skip 4096
++ SYM_DATA_END_LABEL(lstack, SYM_L_LOCAL, lstack_end)
++
++* ``SYM_DATA`` and ``SYM_DATA_LOCAL`` are variants for simple, mostly one-line
++ data::
++
++ SYM_DATA(HEAP, .long rm_heap)
++ SYM_DATA(heap_end, .long rm_stack)
++
++ In the end, they expand to ``SYM_DATA_START`` with ``SYM_DATA_END``
++ internally.
++
++Support Macros
++~~~~~~~~~~~~~~
++All the above reduce themselves to some invocation of ``SYM_START``,
++``SYM_END``, or ``SYM_ENTRY`` at last. Normally, developers should avoid using
++these.
++
++Further, in the above examples, one could see ``SYM_L_LOCAL``. There are also
++``SYM_L_GLOBAL`` and ``SYM_L_WEAK``. All are intended to denote linkage of a
++symbol marked by them. They are used either in ``_LABEL`` variants of the
++earlier macros, or in ``SYM_START``.
++
++
++Overriding Macros
++~~~~~~~~~~~~~~~~~
++Architecture can also override any of the macros in their own
++``asm/linkage.h``, including macros specifying the type of a symbol
++(``SYM_T_FUNC``, ``SYM_T_OBJECT``, and ``SYM_T_NONE``). As every macro
++described in this file is surrounded by ``#ifdef`` + ``#endif``, it is enough
++to define the macros differently in the aforementioned architecture-dependent
++header.
+diff --git a/Documentation/index.rst b/Documentation/index.rst
+index b843e313d2f2e..2ceab197246f7 100644
+--- a/Documentation/index.rst
++++ b/Documentation/index.rst
+@@ -135,6 +135,14 @@ needed).
+ mic/index
+ scheduler/index
+
++Architecture-agnostic documentation
++-----------------------------------
++
++.. toctree::
++ :maxdepth: 2
++
++ asm-annotations
++
+ Architecture-specific documentation
+ -----------------------------------
+
+diff --git a/Makefile b/Makefile
+index d38d0cab8e9aa..842ed84118107 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 4
+-SUBLEVEL = 75
++SUBLEVEL = 76
+ EXTRAVERSION =
+ NAME = Kleptomaniac Octopus
+
+diff --git a/arch/arc/kernel/stacktrace.c b/arch/arc/kernel/stacktrace.c
+index 1e440bbfa876b..fc65d2921e3bd 100644
+--- a/arch/arc/kernel/stacktrace.c
++++ b/arch/arc/kernel/stacktrace.c
+@@ -112,7 +112,7 @@ arc_unwind_core(struct task_struct *tsk, struct pt_regs *regs,
+ int (*consumer_fn) (unsigned int, void *), void *arg)
+ {
+ #ifdef CONFIG_ARC_DW2_UNWIND
+- int ret = 0;
++ int ret = 0, cnt = 0;
+ unsigned int address;
+ struct unwind_frame_info frame_info;
+
+@@ -132,6 +132,11 @@ arc_unwind_core(struct task_struct *tsk, struct pt_regs *regs,
+ break;
+
+ frame_info.regs.r63 = frame_info.regs.r31;
++
++ if (cnt++ > 128) {
++ printk("unwinder looping too long, aborting !\n");
++ return 0;
++ }
+ }
+
+ return address; /* return the last address it saw */
+diff --git a/arch/arm/boot/dts/sun4i-a10.dtsi b/arch/arm/boot/dts/sun4i-a10.dtsi
+index e0a9b371c248f..2265ca24c0c71 100644
+--- a/arch/arm/boot/dts/sun4i-a10.dtsi
++++ b/arch/arm/boot/dts/sun4i-a10.dtsi
+@@ -143,7 +143,7 @@
+ trips {
+ cpu_alert0: cpu-alert0 {
+ /* milliCelsius */
+- temperature = <850000>;
++ temperature = <85000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
+index 1234bc7974294..354ef2f3eac67 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
+@@ -167,6 +167,8 @@
+ hwrng: rng@218 {
+ compatible = "amlogic,meson-rng";
+ reg = <0x0 0x218 0x0 0x4>;
++ clocks = <&clkc CLKID_RNG0>;
++ clock-names = "core";
+ };
+ };
+
+diff --git a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
+index 05dc58c13fa41..6226e7e809807 100644
+--- a/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
++++ b/arch/arm64/boot/dts/marvell/armada-3720-espressobin.dts
+@@ -21,6 +21,10 @@
+
+ aliases {
+ ethernet0 = &eth0;
++ /* for dsa slave device */
++ ethernet1 = &switch0port1;
++ ethernet2 = &switch0port2;
++ ethernet3 = &switch0port3;
+ serial0 = &uart0;
+ serial1 = &uart1;
+ };
+@@ -147,7 +151,7 @@
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+- port@0 {
++ switch0port0: port@0 {
+ reg = <0>;
+ label = "cpu";
+ ethernet = <&eth0>;
+@@ -158,19 +162,19 @@
+ };
+ };
+
+- port@1 {
++ switch0port1: port@1 {
+ reg = <1>;
+ label = "wan";
+ phy-handle = <&switch0phy0>;
+ };
+
+- port@2 {
++ switch0port2: port@2 {
+ reg = <2>;
+ label = "lan0";
+ phy-handle = <&switch0phy1>;
+ };
+
+- port@3 {
++ switch0port3: port@3 {
+ reg = <3>;
+ label = "lan1";
+ phy-handle = <&switch0phy2>;
+diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h
+index b8cf7c85ffa2a..4a4258f17c868 100644
+--- a/arch/arm64/include/asm/assembler.h
++++ b/arch/arm64/include/asm/assembler.h
+@@ -462,6 +462,7 @@ USER(\label, ic ivau, \tmp2) // invalidate I line PoU
+ .endm
+
+ /*
++ * Deprecated! Use SYM_FUNC_{START,START_WEAK,END}_PI instead.
+ * Annotate a function as position independent, i.e., safe to be called before
+ * the kernel virtual mapping is activated.
+ */
+diff --git a/arch/arm64/include/asm/linkage.h b/arch/arm64/include/asm/linkage.h
+index 1b266292f0bee..ebee3113a62ff 100644
+--- a/arch/arm64/include/asm/linkage.h
++++ b/arch/arm64/include/asm/linkage.h
+@@ -4,4 +4,20 @@
+ #define __ALIGN .align 2
+ #define __ALIGN_STR ".align 2"
+
++/*
++ * Annotate a function as position independent, i.e., safe to be called before
++ * the kernel virtual mapping is activated.
++ */
++#define SYM_FUNC_START_PI(x) \
++ SYM_FUNC_START_ALIAS(__pi_##x); \
++ SYM_FUNC_START(x)
++
++#define SYM_FUNC_START_WEAK_PI(x) \
++ SYM_FUNC_START_ALIAS(__pi_##x); \
++ SYM_FUNC_START_WEAK(x)
++
++#define SYM_FUNC_END_PI(x) \
++ SYM_FUNC_END(x); \
++ SYM_FUNC_END_ALIAS(__pi_##x)
++
+ #endif
+diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
+index 102dc3e7f2e1d..426409e0d0713 100644
+--- a/arch/arm64/kernel/smp.c
++++ b/arch/arm64/kernel/smp.c
+@@ -215,6 +215,7 @@ asmlinkage notrace void secondary_start_kernel(void)
+ if (system_uses_irq_prio_masking())
+ init_gic_priority_masking();
+
++ rcu_cpu_starting(cpu);
+ preempt_disable();
+ trace_hardirqs_off();
+
+diff --git a/arch/arm64/lib/clear_page.S b/arch/arm64/lib/clear_page.S
+index 78a9ef66288ae..073acbf02a7c8 100644
+--- a/arch/arm64/lib/clear_page.S
++++ b/arch/arm64/lib/clear_page.S
+@@ -14,7 +14,7 @@
+ * Parameters:
+ * x0 - dest
+ */
+-ENTRY(clear_page)
++SYM_FUNC_START(clear_page)
+ mrs x1, dczid_el0
+ and w1, w1, #0xf
+ mov x2, #4
+@@ -25,5 +25,5 @@ ENTRY(clear_page)
+ tst x0, #(PAGE_SIZE - 1)
+ b.ne 1b
+ ret
+-ENDPROC(clear_page)
++SYM_FUNC_END(clear_page)
+ EXPORT_SYMBOL(clear_page)
+diff --git a/arch/arm64/lib/clear_user.S b/arch/arm64/lib/clear_user.S
+index aeafc03e961a8..48a3a26eff663 100644
+--- a/arch/arm64/lib/clear_user.S
++++ b/arch/arm64/lib/clear_user.S
+@@ -19,7 +19,7 @@
+ *
+ * Alignment fixed up by hardware.
+ */
+-ENTRY(__arch_clear_user)
++SYM_FUNC_START(__arch_clear_user)
+ mov x2, x1 // save the size for fixup return
+ subs x1, x1, #8
+ b.mi 2f
+@@ -40,7 +40,7 @@ uao_user_alternative 9f, strh, sttrh, wzr, x0, 2
+ uao_user_alternative 9f, strb, sttrb, wzr, x0, 0
+ 5: mov x0, #0
+ ret
+-ENDPROC(__arch_clear_user)
++SYM_FUNC_END(__arch_clear_user)
+ EXPORT_SYMBOL(__arch_clear_user)
+
+ .section .fixup,"ax"
+diff --git a/arch/arm64/lib/copy_from_user.S b/arch/arm64/lib/copy_from_user.S
+index ebb3c06cbb5d8..8e25e89ad01fd 100644
+--- a/arch/arm64/lib/copy_from_user.S
++++ b/arch/arm64/lib/copy_from_user.S
+@@ -53,12 +53,12 @@
+ .endm
+
+ end .req x5
+-ENTRY(__arch_copy_from_user)
++SYM_FUNC_START(__arch_copy_from_user)
+ add end, x0, x2
+ #include "copy_template.S"
+ mov x0, #0 // Nothing to copy
+ ret
+-ENDPROC(__arch_copy_from_user)
++SYM_FUNC_END(__arch_copy_from_user)
+ EXPORT_SYMBOL(__arch_copy_from_user)
+
+ .section .fixup,"ax"
+diff --git a/arch/arm64/lib/copy_in_user.S b/arch/arm64/lib/copy_in_user.S
+index 3d8153a1ebce9..667139013ed17 100644
+--- a/arch/arm64/lib/copy_in_user.S
++++ b/arch/arm64/lib/copy_in_user.S
+@@ -55,12 +55,12 @@
+
+ end .req x5
+
+-ENTRY(__arch_copy_in_user)
++SYM_FUNC_START(__arch_copy_in_user)
+ add end, x0, x2
+ #include "copy_template.S"
+ mov x0, #0
+ ret
+-ENDPROC(__arch_copy_in_user)
++SYM_FUNC_END(__arch_copy_in_user)
+ EXPORT_SYMBOL(__arch_copy_in_user)
+
+ .section .fixup,"ax"
+diff --git a/arch/arm64/lib/copy_page.S b/arch/arm64/lib/copy_page.S
+index bbb8562396afe..e125a84eb4000 100644
+--- a/arch/arm64/lib/copy_page.S
++++ b/arch/arm64/lib/copy_page.S
+@@ -17,7 +17,7 @@
+ * x0 - dest
+ * x1 - src
+ */
+-ENTRY(copy_page)
++SYM_FUNC_START(copy_page)
+ alternative_if ARM64_HAS_NO_HW_PREFETCH
+ // Prefetch three cache lines ahead.
+ prfm pldl1strm, [x1, #128]
+@@ -75,5 +75,5 @@ alternative_else_nop_endif
+ stnp x16, x17, [x0, #112]
+
+ ret
+-ENDPROC(copy_page)
++SYM_FUNC_END(copy_page)
+ EXPORT_SYMBOL(copy_page)
+diff --git a/arch/arm64/lib/copy_to_user.S b/arch/arm64/lib/copy_to_user.S
+index 357eae2c18ebb..1a104d0089f3a 100644
+--- a/arch/arm64/lib/copy_to_user.S
++++ b/arch/arm64/lib/copy_to_user.S
+@@ -52,12 +52,12 @@
+ .endm
+
+ end .req x5
+-ENTRY(__arch_copy_to_user)
++SYM_FUNC_START(__arch_copy_to_user)
+ add end, x0, x2
+ #include "copy_template.S"
+ mov x0, #0
+ ret
+-ENDPROC(__arch_copy_to_user)
++SYM_FUNC_END(__arch_copy_to_user)
+ EXPORT_SYMBOL(__arch_copy_to_user)
+
+ .section .fixup,"ax"
+diff --git a/arch/arm64/lib/crc32.S b/arch/arm64/lib/crc32.S
+index e6135f16649b1..243e107e98963 100644
+--- a/arch/arm64/lib/crc32.S
++++ b/arch/arm64/lib/crc32.S
+@@ -85,17 +85,17 @@ CPU_BE( rev16 w3, w3 )
+ .endm
+
+ .align 5
+-ENTRY(crc32_le)
++SYM_FUNC_START(crc32_le)
+ alternative_if_not ARM64_HAS_CRC32
+ b crc32_le_base
+ alternative_else_nop_endif
+ __crc32
+-ENDPROC(crc32_le)
++SYM_FUNC_END(crc32_le)
+
+ .align 5
+-ENTRY(__crc32c_le)
++SYM_FUNC_START(__crc32c_le)
+ alternative_if_not ARM64_HAS_CRC32
+ b __crc32c_le_base
+ alternative_else_nop_endif
+ __crc32 c
+-ENDPROC(__crc32c_le)
++SYM_FUNC_END(__crc32c_le)
+diff --git a/arch/arm64/lib/memchr.S b/arch/arm64/lib/memchr.S
+index 48a3ab636e4fb..edf6b970a2774 100644
+--- a/arch/arm64/lib/memchr.S
++++ b/arch/arm64/lib/memchr.S
+@@ -19,7 +19,7 @@
+ * Returns:
+ * x0 - address of first occurrence of 'c' or 0
+ */
+-WEAK(memchr)
++SYM_FUNC_START_WEAK_PI(memchr)
+ and w1, w1, #0xff
+ 1: subs x2, x2, #1
+ b.mi 2f
+@@ -30,5 +30,5 @@ WEAK(memchr)
+ ret
+ 2: mov x0, #0
+ ret
+-ENDPIPROC(memchr)
++SYM_FUNC_END_PI(memchr)
+ EXPORT_SYMBOL_NOKASAN(memchr)
+diff --git a/arch/arm64/lib/memcmp.S b/arch/arm64/lib/memcmp.S
+index b297bdaaf5498..c0671e793ea91 100644
+--- a/arch/arm64/lib/memcmp.S
++++ b/arch/arm64/lib/memcmp.S
+@@ -46,7 +46,7 @@ pos .req x11
+ limit_wd .req x12
+ mask .req x13
+
+-WEAK(memcmp)
++SYM_FUNC_START_WEAK_PI(memcmp)
+ cbz limit, .Lret0
+ eor tmp1, src1, src2
+ tst tmp1, #7
+@@ -243,5 +243,5 @@ CPU_LE( rev data2, data2 )
+ .Lret0:
+ mov result, #0
+ ret
+-ENDPIPROC(memcmp)
++SYM_FUNC_END_PI(memcmp)
+ EXPORT_SYMBOL_NOKASAN(memcmp)
+diff --git a/arch/arm64/lib/memcpy.S b/arch/arm64/lib/memcpy.S
+index d79f48994dbb2..b03cbb3455d4d 100644
+--- a/arch/arm64/lib/memcpy.S
++++ b/arch/arm64/lib/memcpy.S
+@@ -56,12 +56,11 @@
+ stp \ptr, \regB, [\regC], \val
+ .endm
+
+- .weak memcpy
+-ENTRY(__memcpy)
+-ENTRY(memcpy)
++SYM_FUNC_START_ALIAS(__memcpy)
++SYM_FUNC_START_WEAK_PI(memcpy)
+ #include "copy_template.S"
+ ret
+-ENDPIPROC(memcpy)
++SYM_FUNC_END_PI(memcpy)
+ EXPORT_SYMBOL(memcpy)
+-ENDPROC(__memcpy)
++SYM_FUNC_END_ALIAS(__memcpy)
+ EXPORT_SYMBOL(__memcpy)
+diff --git a/arch/arm64/lib/memmove.S b/arch/arm64/lib/memmove.S
+index 7847751364806..1035dce4bdaf4 100644
+--- a/arch/arm64/lib/memmove.S
++++ b/arch/arm64/lib/memmove.S
+@@ -45,9 +45,8 @@ C_h .req x12
+ D_l .req x13
+ D_h .req x14
+
+- .weak memmove
+-ENTRY(__memmove)
+-ENTRY(memmove)
++SYM_FUNC_START_ALIAS(__memmove)
++SYM_FUNC_START_WEAK_PI(memmove)
+ cmp dstin, src
+ b.lo __memcpy
+ add tmp1, src, count
+@@ -184,7 +183,7 @@ ENTRY(memmove)
+ tst count, #0x3f
+ b.ne .Ltail63
+ ret
+-ENDPIPROC(memmove)
++SYM_FUNC_END_PI(memmove)
+ EXPORT_SYMBOL(memmove)
+-ENDPROC(__memmove)
++SYM_FUNC_END_ALIAS(__memmove)
+ EXPORT_SYMBOL(__memmove)
+diff --git a/arch/arm64/lib/memset.S b/arch/arm64/lib/memset.S
+index 9fb97e6bc5602..a9c1c9a01ea90 100644
+--- a/arch/arm64/lib/memset.S
++++ b/arch/arm64/lib/memset.S
+@@ -42,9 +42,8 @@ dst .req x8
+ tmp3w .req w9
+ tmp3 .req x9
+
+- .weak memset
+-ENTRY(__memset)
+-ENTRY(memset)
++SYM_FUNC_START_ALIAS(__memset)
++SYM_FUNC_START_WEAK_PI(memset)
+ mov dst, dstin /* Preserve return value. */
+ and A_lw, val, #255
+ orr A_lw, A_lw, A_lw, lsl #8
+@@ -203,7 +202,7 @@ ENTRY(memset)
+ ands count, count, zva_bits_x
+ b.ne .Ltail_maybe_long
+ ret
+-ENDPIPROC(memset)
++SYM_FUNC_END_PI(memset)
+ EXPORT_SYMBOL(memset)
+-ENDPROC(__memset)
++SYM_FUNC_END_ALIAS(__memset)
+ EXPORT_SYMBOL(__memset)
+diff --git a/arch/arm64/lib/strchr.S b/arch/arm64/lib/strchr.S
+index ca3ec18171a43..1f47eae3b0d6d 100644
+--- a/arch/arm64/lib/strchr.S
++++ b/arch/arm64/lib/strchr.S
+@@ -18,7 +18,7 @@
+ * Returns:
+ * x0 - address of first occurrence of 'c' or 0
+ */
+-WEAK(strchr)
++SYM_FUNC_START_WEAK(strchr)
+ and w1, w1, #0xff
+ 1: ldrb w2, [x0], #1
+ cmp w2, w1
+@@ -28,5 +28,5 @@ WEAK(strchr)
+ cmp w2, w1
+ csel x0, x0, xzr, eq
+ ret
+-ENDPROC(strchr)
++SYM_FUNC_END(strchr)
+ EXPORT_SYMBOL_NOKASAN(strchr)
+diff --git a/arch/arm64/lib/strcmp.S b/arch/arm64/lib/strcmp.S
+index e9aefbe0b7401..4767540d1b94e 100644
+--- a/arch/arm64/lib/strcmp.S
++++ b/arch/arm64/lib/strcmp.S
+@@ -48,7 +48,7 @@ tmp3 .req x9
+ zeroones .req x10
+ pos .req x11
+
+-WEAK(strcmp)
++SYM_FUNC_START_WEAK_PI(strcmp)
+ eor tmp1, src1, src2
+ mov zeroones, #REP8_01
+ tst tmp1, #7
+@@ -219,5 +219,5 @@ CPU_BE( orr syndrome, diff, has_nul )
+ lsr data1, data1, #56
+ sub result, data1, data2, lsr #56
+ ret
+-ENDPIPROC(strcmp)
++SYM_FUNC_END_PI(strcmp)
+ EXPORT_SYMBOL_NOKASAN(strcmp)
+diff --git a/arch/arm64/lib/strlen.S b/arch/arm64/lib/strlen.S
+index 87b0cb066915f..ee3ed882dd79f 100644
+--- a/arch/arm64/lib/strlen.S
++++ b/arch/arm64/lib/strlen.S
+@@ -44,7 +44,7 @@ pos .req x12
+ #define REP8_7f 0x7f7f7f7f7f7f7f7f
+ #define REP8_80 0x8080808080808080
+
+-WEAK(strlen)
++SYM_FUNC_START_WEAK_PI(strlen)
+ mov zeroones, #REP8_01
+ bic src, srcin, #15
+ ands tmp1, srcin, #15
+@@ -111,5 +111,5 @@ CPU_LE( lsr tmp2, tmp2, tmp1 ) /* Shift (tmp1 & 63). */
+ csinv data1, data1, xzr, le
+ csel data2, data2, data2a, le
+ b .Lrealigned
+-ENDPIPROC(strlen)
++SYM_FUNC_END_PI(strlen)
+ EXPORT_SYMBOL_NOKASAN(strlen)
+diff --git a/arch/arm64/lib/strncmp.S b/arch/arm64/lib/strncmp.S
+index f571581888fa4..2a7ee949ed471 100644
+--- a/arch/arm64/lib/strncmp.S
++++ b/arch/arm64/lib/strncmp.S
+@@ -52,7 +52,7 @@ limit_wd .req x13
+ mask .req x14
+ endloop .req x15
+
+-WEAK(strncmp)
++SYM_FUNC_START_WEAK_PI(strncmp)
+ cbz limit, .Lret0
+ eor tmp1, src1, src2
+ mov zeroones, #REP8_01
+@@ -295,5 +295,5 @@ CPU_BE( orr syndrome, diff, has_nul )
+ .Lret0:
+ mov result, #0
+ ret
+-ENDPIPROC(strncmp)
++SYM_FUNC_END_PI(strncmp)
+ EXPORT_SYMBOL_NOKASAN(strncmp)
+diff --git a/arch/arm64/lib/strnlen.S b/arch/arm64/lib/strnlen.S
+index c0bac9493c683..b72913a990389 100644
+--- a/arch/arm64/lib/strnlen.S
++++ b/arch/arm64/lib/strnlen.S
+@@ -47,7 +47,7 @@ limit_wd .req x14
+ #define REP8_7f 0x7f7f7f7f7f7f7f7f
+ #define REP8_80 0x8080808080808080
+
+-WEAK(strnlen)
++SYM_FUNC_START_WEAK_PI(strnlen)
+ cbz limit, .Lhit_limit
+ mov zeroones, #REP8_01
+ bic src, srcin, #15
+@@ -156,5 +156,5 @@ CPU_LE( lsr tmp2, tmp2, tmp4 ) /* Shift (tmp1 & 63). */
+ .Lhit_limit:
+ mov len, limit
+ ret
+-ENDPIPROC(strnlen)
++SYM_FUNC_END_PI(strnlen)
+ EXPORT_SYMBOL_NOKASAN(strnlen)
+diff --git a/arch/arm64/lib/strrchr.S b/arch/arm64/lib/strrchr.S
+index 794ac49ea4333..13132d1ed6d12 100644
+--- a/arch/arm64/lib/strrchr.S
++++ b/arch/arm64/lib/strrchr.S
+@@ -18,7 +18,7 @@
+ * Returns:
+ * x0 - address of last occurrence of 'c' or 0
+ */
+-WEAK(strrchr)
++SYM_FUNC_START_WEAK_PI(strrchr)
+ mov x3, #0
+ and w1, w1, #0xff
+ 1: ldrb w2, [x0], #1
+@@ -29,5 +29,5 @@ WEAK(strrchr)
+ b 1b
+ 2: mov x0, x3
+ ret
+-ENDPIPROC(strrchr)
++SYM_FUNC_END_PI(strrchr)
+ EXPORT_SYMBOL_NOKASAN(strrchr)
+diff --git a/arch/arm64/lib/tishift.S b/arch/arm64/lib/tishift.S
+index 047622536535d..a88613834fb07 100644
+--- a/arch/arm64/lib/tishift.S
++++ b/arch/arm64/lib/tishift.S
+@@ -7,7 +7,7 @@
+
+ #include <asm/assembler.h>
+
+-ENTRY(__ashlti3)
++SYM_FUNC_START(__ashlti3)
+ cbz x2, 1f
+ mov x3, #64
+ sub x3, x3, x2
+@@ -26,10 +26,10 @@ ENTRY(__ashlti3)
+ lsl x1, x0, x1
+ mov x0, x2
+ ret
+-ENDPROC(__ashlti3)
++SYM_FUNC_END(__ashlti3)
+ EXPORT_SYMBOL(__ashlti3)
+
+-ENTRY(__ashrti3)
++SYM_FUNC_START(__ashrti3)
+ cbz x2, 1f
+ mov x3, #64
+ sub x3, x3, x2
+@@ -48,10 +48,10 @@ ENTRY(__ashrti3)
+ asr x0, x1, x0
+ mov x1, x2
+ ret
+-ENDPROC(__ashrti3)
++SYM_FUNC_END(__ashrti3)
+ EXPORT_SYMBOL(__ashrti3)
+
+-ENTRY(__lshrti3)
++SYM_FUNC_START(__lshrti3)
+ cbz x2, 1f
+ mov x3, #64
+ sub x3, x3, x2
+@@ -70,5 +70,5 @@ ENTRY(__lshrti3)
+ lsr x0, x1, x0
+ mov x1, x2
+ ret
+-ENDPROC(__lshrti3)
++SYM_FUNC_END(__lshrti3)
+ EXPORT_SYMBOL(__lshrti3)
+diff --git a/arch/x86/include/asm/linkage.h b/arch/x86/include/asm/linkage.h
+index 14caa9d9fb7ff..e07188e8d7632 100644
+--- a/arch/x86/include/asm/linkage.h
++++ b/arch/x86/include/asm/linkage.h
+@@ -13,9 +13,13 @@
+
+ #ifdef __ASSEMBLY__
+
+-#define GLOBAL(name) \
+- .globl name; \
+- name:
++/*
++ * GLOBAL is DEPRECATED
++ *
++ * use SYM_DATA_START, SYM_FUNC_START, SYM_INNER_LABEL, SYM_CODE_START, or
++ * similar
++ */
++#define GLOBAL(name) SYM_ENTRY(name, SYM_L_GLOBAL, SYM_A_NONE)
+
+ #if defined(CONFIG_X86_64) || defined(CONFIG_X86_ALIGNMENT_16)
+ #define __ALIGN .p2align 4, 0x90
+diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c
+index d2f4e706a428c..b8b3b84308edc 100644
+--- a/arch/x86/kernel/kexec-bzimage64.c
++++ b/arch/x86/kernel/kexec-bzimage64.c
+@@ -210,8 +210,7 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params,
+ params->hdr.hardware_subarch = boot_params.hdr.hardware_subarch;
+
+ /* Copying screen_info will do? */
+- memcpy(&params->screen_info, &boot_params.screen_info,
+- sizeof(struct screen_info));
++ memcpy(&params->screen_info, &screen_info, sizeof(struct screen_info));
+
+ /* Fill in memsize later */
+ params->screen_info.ext_mem_k = 0;
+diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
+index 0c7addcd19859..3d34ac02d76ef 100644
+--- a/block/blk-cgroup.c
++++ b/block/blk-cgroup.c
+@@ -855,13 +855,20 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
+ goto fail;
+ }
+
++ if (radix_tree_preload(GFP_KERNEL)) {
++ blkg_free(new_blkg);
++ ret = -ENOMEM;
++ goto fail;
++ }
++
+ rcu_read_lock();
+ spin_lock_irq(&q->queue_lock);
+
+ blkg = blkg_lookup_check(pos, pol, q);
+ if (IS_ERR(blkg)) {
+ ret = PTR_ERR(blkg);
+- goto fail_unlock;
++ blkg_free(new_blkg);
++ goto fail_preloaded;
+ }
+
+ if (blkg) {
+@@ -870,10 +877,12 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
+ blkg = blkg_create(pos, q, new_blkg);
+ if (IS_ERR(blkg)) {
+ ret = PTR_ERR(blkg);
+- goto fail_unlock;
++ goto fail_preloaded;
+ }
+ }
+
++ radix_tree_preload_end();
++
+ if (pos == blkcg)
+ goto success;
+ }
+@@ -883,6 +892,8 @@ success:
+ ctx->body = input;
+ return 0;
+
++fail_preloaded:
++ radix_tree_preload_end();
+ fail_unlock:
+ spin_unlock_irq(&q->queue_lock);
+ rcu_read_unlock();
+diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
+index 12d980aafc5ff..9d78f29cf9967 100644
+--- a/drivers/acpi/nfit/core.c
++++ b/drivers/acpi/nfit/core.c
+@@ -1553,7 +1553,7 @@ static ssize_t format1_show(struct device *dev,
+ le16_to_cpu(nfit_dcr->dcr->code));
+ break;
+ }
+- if (rc != ENXIO)
++ if (rc != -ENXIO)
+ break;
+ }
+ mutex_unlock(&acpi_desc->init_mutex);
+diff --git a/drivers/base/core.c b/drivers/base/core.c
+index 0fde3e9e63ee3..ddfbd62d8bfc2 100644
+--- a/drivers/base/core.c
++++ b/drivers/base/core.c
+@@ -454,8 +454,7 @@ static void __device_link_del(struct kref *kref)
+ dev_dbg(link->consumer, "Dropping the link to %s\n",
+ dev_name(link->supplier));
+
+- if (link->flags & DL_FLAG_PM_RUNTIME)
+- pm_runtime_drop_link(link->consumer);
++ pm_runtime_drop_link(link);
+
+ list_del_rcu(&link->s_node);
+ list_del_rcu(&link->c_node);
+@@ -469,8 +468,7 @@ static void __device_link_del(struct kref *kref)
+ dev_info(link->consumer, "Dropping the link to %s\n",
+ dev_name(link->supplier));
+
+- if (link->flags & DL_FLAG_PM_RUNTIME)
+- pm_runtime_drop_link(link->consumer);
++ pm_runtime_drop_link(link);
+
+ list_del(&link->s_node);
+ list_del(&link->c_node);
+diff --git a/drivers/base/dd.c b/drivers/base/dd.c
+index 84e757860ebb9..32823f36cffd0 100644
+--- a/drivers/base/dd.c
++++ b/drivers/base/dd.c
+@@ -1105,6 +1105,8 @@ static void __device_release_driver(struct device *dev, struct device *parent)
+
+ drv = dev->driver;
+ if (drv) {
++ pm_runtime_get_sync(dev);
++
+ while (device_links_busy(dev)) {
+ __device_driver_unlock(dev, parent);
+
+@@ -1116,13 +1118,12 @@ static void __device_release_driver(struct device *dev, struct device *parent)
+ * have released the driver successfully while this one
+ * was waiting, so check for that.
+ */
+- if (dev->driver != drv)
++ if (dev->driver != drv) {
++ pm_runtime_put(dev);
+ return;
++ }
+ }
+
+- pm_runtime_get_sync(dev);
+- pm_runtime_clean_up_links(dev);
+-
+ driver_sysfs_remove(dev);
+
+ if (dev->bus)
+diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
+index 4244e22e4b403..137a7ba053d78 100644
+--- a/drivers/base/power/runtime.c
++++ b/drivers/base/power/runtime.c
+@@ -1615,42 +1615,6 @@ void pm_runtime_remove(struct device *dev)
+ pm_runtime_reinit(dev);
+ }
+
+-/**
+- * pm_runtime_clean_up_links - Prepare links to consumers for driver removal.
+- * @dev: Device whose driver is going to be removed.
+- *
+- * Check links from this device to any consumers and if any of them have active
+- * runtime PM references to the device, drop the usage counter of the device
+- * (as many times as needed).
+- *
+- * Links with the DL_FLAG_MANAGED flag unset are ignored.
+- *
+- * Since the device is guaranteed to be runtime-active at the point this is
+- * called, nothing else needs to be done here.
+- *
+- * Moreover, this is called after device_links_busy() has returned 'false', so
+- * the status of each link is guaranteed to be DL_STATE_SUPPLIER_UNBIND and
+- * therefore rpm_active can't be manipulated concurrently.
+- */
+-void pm_runtime_clean_up_links(struct device *dev)
+-{
+- struct device_link *link;
+- int idx;
+-
+- idx = device_links_read_lock();
+-
+- list_for_each_entry_rcu(link, &dev->links.consumers, s_node,
+- device_links_read_lock_held()) {
+- if (!(link->flags & DL_FLAG_MANAGED))
+- continue;
+-
+- while (refcount_dec_not_one(&link->rpm_active))
+- pm_runtime_put_noidle(dev);
+- }
+-
+- device_links_read_unlock(idx);
+-}
+-
+ /**
+ * pm_runtime_get_suppliers - Resume and reference-count supplier devices.
+ * @dev: Consumer device.
+@@ -1702,7 +1666,7 @@ void pm_runtime_new_link(struct device *dev)
+ spin_unlock_irq(&dev->power.lock);
+ }
+
+-void pm_runtime_drop_link(struct device *dev)
++static void pm_runtime_drop_link_count(struct device *dev)
+ {
+ spin_lock_irq(&dev->power.lock);
+ WARN_ON(dev->power.links_count == 0);
+@@ -1710,6 +1674,25 @@ void pm_runtime_drop_link(struct device *dev)
+ spin_unlock_irq(&dev->power.lock);
+ }
+
++/**
++ * pm_runtime_drop_link - Prepare for device link removal.
++ * @link: Device link going away.
++ *
++ * Drop the link count of the consumer end of @link and decrement the supplier
++ * device's runtime PM usage counter as many times as needed to drop all of the
++ * PM runtime reference to it from the consumer.
++ */
++void pm_runtime_drop_link(struct device_link *link)
++{
++ if (!(link->flags & DL_FLAG_PM_RUNTIME))
++ return;
++
++ pm_runtime_drop_link_count(link->consumer);
++
++ while (refcount_dec_not_one(&link->rpm_active))
++ pm_runtime_put(link->supplier);
++}
++
+ static bool pm_runtime_need_not_resume(struct device *dev)
+ {
+ return atomic_read(&dev->power.usage_count) <= 1 &&
+diff --git a/drivers/crypto/chelsio/chtls/chtls_cm.c b/drivers/crypto/chelsio/chtls/chtls_cm.c
+index e2c64c943cfc7..385bd4dc66867 100644
+--- a/drivers/crypto/chelsio/chtls/chtls_cm.c
++++ b/drivers/crypto/chelsio/chtls/chtls_cm.c
+@@ -174,7 +174,7 @@ static struct sk_buff *alloc_ctrl_skb(struct sk_buff *skb, int len)
+ {
+ if (likely(skb && !skb_shared(skb) && !skb_cloned(skb))) {
+ __skb_trim(skb, 0);
+- refcount_add(2, &skb->users);
++ refcount_inc(&skb->users);
+ } else {
+ skb = alloc_skb(len, GFP_KERNEL | __GFP_NOFAIL);
+ }
+diff --git a/drivers/crypto/chelsio/chtls/chtls_hw.c b/drivers/crypto/chelsio/chtls/chtls_hw.c
+index a217fe72602d4..3ef723e089537 100644
+--- a/drivers/crypto/chelsio/chtls/chtls_hw.c
++++ b/drivers/crypto/chelsio/chtls/chtls_hw.c
+@@ -357,6 +357,9 @@ int chtls_setkey(struct chtls_sock *csk, u32 keylen, u32 optname)
+ if (ret)
+ goto out_notcb;
+
++ if (unlikely(csk_flag(sk, CSK_ABORT_SHUTDOWN)))
++ goto out_notcb;
++
+ set_wr_txq(skb, CPL_PRIORITY_DATA, csk->tlshws.txqid);
+ csk->wr_credits -= DIV_ROUND_UP(len, 16);
+ csk->wr_unacked += DIV_ROUND_UP(len, 16);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+index fa2c0f29ad4de..e8e1720104160 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+@@ -1011,6 +1011,7 @@ static const struct pci_device_id pciidlist[] = {
+ {0x1002, 0x7319, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
+ {0x1002, 0x731A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
+ {0x1002, 0x731B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
++ {0x1002, 0x731E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
+ {0x1002, 0x731F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
+ /* Navi14 */
+ {0x1002, 0x7340, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI14},
+diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
+index c169f0f70f3ae..2fa491f826824 100644
+--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
++++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
+@@ -1574,6 +1574,9 @@ static void process_csb(struct intel_engine_cs *engine)
+ if (!inject_preempt_hang(execlists))
+ ring_set_paused(engine, 0);
+
++ /* XXX Magic delay for tgl */
++ ENGINE_POSTING_READ(engine, RING_CONTEXT_STATUS_PTR);
++
+ WRITE_ONCE(execlists->pending[0], NULL);
+ break;
+
+diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
+index fe9edbba997cb..b9af329eb3a34 100644
+--- a/drivers/gpu/drm/i915/i915_gpu_error.c
++++ b/drivers/gpu/drm/i915/i915_gpu_error.c
+@@ -307,6 +307,8 @@ static int compress_page(struct compress *c,
+
+ if (zlib_deflate(zstream, Z_NO_FLUSH) != Z_OK)
+ return -EIO;
++
++ cond_resched();
+ } while (zstream->avail_in);
+
+ /* Fallback to uncompressed if we increase size? */
+@@ -392,6 +394,7 @@ static int compress_page(struct compress *c,
+ if (!i915_memcpy_from_wc(ptr, src, PAGE_SIZE))
+ memcpy(ptr, src, PAGE_SIZE);
+ dst->pages[dst->page_count++] = ptr;
++ cond_resched();
+
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
+index 9e583f13a9e48..62f8a47fda456 100644
+--- a/drivers/gpu/drm/i915/intel_uncore.c
++++ b/drivers/gpu/drm/i915/intel_uncore.c
+@@ -1124,6 +1124,18 @@ unclaimed_reg_debug(struct intel_uncore *uncore,
+ spin_unlock(&uncore->debug->lock);
+ }
+
++#define __vgpu_read(x) \
++static u##x \
++vgpu_read##x(struct intel_uncore *uncore, i915_reg_t reg, bool trace) { \
++ u##x val = __raw_uncore_read##x(uncore, reg); \
++ trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
++ return val; \
++}
++__vgpu_read(8)
++__vgpu_read(16)
++__vgpu_read(32)
++__vgpu_read(64)
++
+ #define GEN2_READ_HEADER(x) \
+ u##x val = 0; \
+ assert_rpm_wakelock_held(uncore->rpm);
+@@ -1327,6 +1339,16 @@ __gen_reg_write_funcs(gen8);
+ #undef GEN6_WRITE_FOOTER
+ #undef GEN6_WRITE_HEADER
+
++#define __vgpu_write(x) \
++static void \
++vgpu_write##x(struct intel_uncore *uncore, i915_reg_t reg, u##x val, bool trace) { \
++ trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
++ __raw_uncore_write##x(uncore, reg, val); \
++}
++__vgpu_write(8)
++__vgpu_write(16)
++__vgpu_write(32)
++
+ #define ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, x) \
+ do { \
+ (uncore)->funcs.mmio_writeb = x##_write8; \
+@@ -1647,7 +1669,10 @@ static void uncore_raw_init(struct intel_uncore *uncore)
+ {
+ GEM_BUG_ON(intel_uncore_has_forcewake(uncore));
+
+- if (IS_GEN(uncore->i915, 5)) {
++ if (intel_vgpu_active(uncore->i915)) {
++ ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, vgpu);
++ ASSIGN_RAW_READ_MMIO_VFUNCS(uncore, vgpu);
++ } else if (IS_GEN(uncore->i915, 5)) {
+ ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, gen5);
+ ASSIGN_RAW_READ_MMIO_VFUNCS(uncore, gen5);
+ } else {
+diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
+index 7d39d4949ee77..2dd9fcab464b1 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
++++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
+@@ -197,7 +197,8 @@ nouveau_gem_new(struct nouveau_cli *cli, u64 size, int align, uint32_t domain,
+ * to the caller, instead of a normal nouveau_bo ttm reference. */
+ ret = drm_gem_object_init(drm->dev, &nvbo->bo.base, size);
+ if (ret) {
+- nouveau_bo_ref(NULL, &nvbo);
++ drm_gem_object_release(&nvbo->bo.base);
++ kfree(nvbo);
+ return ret;
+ }
+
+diff --git a/drivers/gpu/drm/nouveau/nouveau_svm.c b/drivers/gpu/drm/nouveau/nouveau_svm.c
+index 824654742a604..0be4668c780bf 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_svm.c
++++ b/drivers/gpu/drm/nouveau/nouveau_svm.c
+@@ -112,11 +112,11 @@ nouveau_svmm_bind(struct drm_device *dev, void *data,
+ struct nouveau_cli *cli = nouveau_cli(file_priv);
+ struct drm_nouveau_svm_bind *args = data;
+ unsigned target, cmd, priority;
+- unsigned long addr, end, size;
++ unsigned long addr, end;
+ struct mm_struct *mm;
+
+ args->va_start &= PAGE_MASK;
+- args->va_end &= PAGE_MASK;
++ args->va_end = ALIGN(args->va_end, PAGE_SIZE);
+
+ /* Sanity check arguments */
+ if (args->reserved0 || args->reserved1)
+@@ -125,8 +125,6 @@ nouveau_svmm_bind(struct drm_device *dev, void *data,
+ return -EINVAL;
+ if (args->va_start >= args->va_end)
+ return -EINVAL;
+- if (!args->npages)
+- return -EINVAL;
+
+ cmd = args->header >> NOUVEAU_SVM_BIND_COMMAND_SHIFT;
+ cmd &= NOUVEAU_SVM_BIND_COMMAND_MASK;
+@@ -158,12 +156,6 @@ nouveau_svmm_bind(struct drm_device *dev, void *data,
+ if (args->stride)
+ return -EINVAL;
+
+- size = ((unsigned long)args->npages) << PAGE_SHIFT;
+- if ((args->va_start + size) <= args->va_start)
+- return -EINVAL;
+- if ((args->va_start + size) > args->va_end)
+- return -EINVAL;
+-
+ /*
+ * Ok we are ask to do something sane, for now we only support migrate
+ * commands but we will add things like memory policy (what to do on
+@@ -178,7 +170,7 @@ nouveau_svmm_bind(struct drm_device *dev, void *data,
+ return -EINVAL;
+ }
+
+- for (addr = args->va_start, end = args->va_start + size; addr < end;) {
++ for (addr = args->va_start, end = args->va_end; addr < end;) {
+ struct vm_area_struct *vma;
+ unsigned long next;
+
+diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c
+index c05e013bb8e3d..ac9de37a8280a 100644
+--- a/drivers/gpu/drm/panfrost/panfrost_gem.c
++++ b/drivers/gpu/drm/panfrost/panfrost_gem.c
+@@ -105,14 +105,12 @@ void panfrost_gem_mapping_put(struct panfrost_gem_mapping *mapping)
+ kref_put(&mapping->refcount, panfrost_gem_mapping_release);
+ }
+
+-void panfrost_gem_teardown_mappings(struct panfrost_gem_object *bo)
++void panfrost_gem_teardown_mappings_locked(struct panfrost_gem_object *bo)
+ {
+ struct panfrost_gem_mapping *mapping;
+
+- mutex_lock(&bo->mappings.lock);
+ list_for_each_entry(mapping, &bo->mappings.list, node)
+ panfrost_gem_teardown_mapping(mapping);
+- mutex_unlock(&bo->mappings.lock);
+ }
+
+ int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv)
+diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panfrost/panfrost_gem.h
+index b3517ff9630cb..8088d5fd8480e 100644
+--- a/drivers/gpu/drm/panfrost/panfrost_gem.h
++++ b/drivers/gpu/drm/panfrost/panfrost_gem.h
+@@ -82,7 +82,7 @@ struct panfrost_gem_mapping *
+ panfrost_gem_mapping_get(struct panfrost_gem_object *bo,
+ struct panfrost_file_priv *priv);
+ void panfrost_gem_mapping_put(struct panfrost_gem_mapping *mapping);
+-void panfrost_gem_teardown_mappings(struct panfrost_gem_object *bo);
++void panfrost_gem_teardown_mappings_locked(struct panfrost_gem_object *bo);
+
+ void panfrost_gem_shrinker_init(struct drm_device *dev);
+ void panfrost_gem_shrinker_cleanup(struct drm_device *dev);
+diff --git a/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c b/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c
+index 288e46c40673a..1b9f68d8e9aa6 100644
+--- a/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c
++++ b/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c
+@@ -40,18 +40,26 @@ static bool panfrost_gem_purge(struct drm_gem_object *obj)
+ {
+ struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+ struct panfrost_gem_object *bo = to_panfrost_bo(obj);
++ bool ret = false;
+
+ if (atomic_read(&bo->gpu_usecount))
+ return false;
+
+- if (!mutex_trylock(&shmem->pages_lock))
++ if (!mutex_trylock(&bo->mappings.lock))
+ return false;
+
+- panfrost_gem_teardown_mappings(bo);
++ if (!mutex_trylock(&shmem->pages_lock))
++ goto unlock_mappings;
++
++ panfrost_gem_teardown_mappings_locked(bo);
+ drm_gem_shmem_purge_locked(obj);
++ ret = true;
+
+ mutex_unlock(&shmem->pages_lock);
+- return true;
++
++unlock_mappings:
++ mutex_unlock(&bo->mappings.lock);
++ return ret;
+ }
+
+ static unsigned long
+diff --git a/drivers/gpu/drm/sun4i/sun4i_frontend.c b/drivers/gpu/drm/sun4i/sun4i_frontend.c
+index ec2a032e07b97..7186ba73d8e14 100644
+--- a/drivers/gpu/drm/sun4i/sun4i_frontend.c
++++ b/drivers/gpu/drm/sun4i/sun4i_frontend.c
+@@ -407,6 +407,7 @@ int sun4i_frontend_update_formats(struct sun4i_frontend *frontend,
+ struct drm_framebuffer *fb = state->fb;
+ const struct drm_format_info *format = fb->format;
+ uint64_t modifier = fb->modifier;
++ unsigned int ch1_phase_idx;
+ u32 out_fmt_val;
+ u32 in_fmt_val, in_mod_val, in_ps_val;
+ unsigned int i;
+@@ -442,18 +443,19 @@ int sun4i_frontend_update_formats(struct sun4i_frontend *frontend,
+ * I have no idea what this does exactly, but it seems to be
+ * related to the scaler FIR filter phase parameters.
+ */
++ ch1_phase_idx = (format->num_planes > 1) ? 1 : 0;
+ regmap_write(frontend->regs, SUN4I_FRONTEND_CH0_HORZPHASE_REG,
+- frontend->data->ch_phase[0].horzphase);
++ frontend->data->ch_phase[0]);
+ regmap_write(frontend->regs, SUN4I_FRONTEND_CH1_HORZPHASE_REG,
+- frontend->data->ch_phase[1].horzphase);
++ frontend->data->ch_phase[ch1_phase_idx]);
+ regmap_write(frontend->regs, SUN4I_FRONTEND_CH0_VERTPHASE0_REG,
+- frontend->data->ch_phase[0].vertphase[0]);
++ frontend->data->ch_phase[0]);
+ regmap_write(frontend->regs, SUN4I_FRONTEND_CH1_VERTPHASE0_REG,
+- frontend->data->ch_phase[1].vertphase[0]);
++ frontend->data->ch_phase[ch1_phase_idx]);
+ regmap_write(frontend->regs, SUN4I_FRONTEND_CH0_VERTPHASE1_REG,
+- frontend->data->ch_phase[0].vertphase[1]);
++ frontend->data->ch_phase[0]);
+ regmap_write(frontend->regs, SUN4I_FRONTEND_CH1_VERTPHASE1_REG,
+- frontend->data->ch_phase[1].vertphase[1]);
++ frontend->data->ch_phase[ch1_phase_idx]);
+
+ /*
+ * Checking the input format is sufficient since we currently only
+@@ -687,30 +689,12 @@ static const struct dev_pm_ops sun4i_frontend_pm_ops = {
+ };
+
+ static const struct sun4i_frontend_data sun4i_a10_frontend = {
+- .ch_phase = {
+- {
+- .horzphase = 0,
+- .vertphase = { 0, 0 },
+- },
+- {
+- .horzphase = 0xfc000,
+- .vertphase = { 0xfc000, 0xfc000 },
+- },
+- },
++ .ch_phase = { 0x000, 0xfc000 },
+ .has_coef_rdy = true,
+ };
+
+ static const struct sun4i_frontend_data sun8i_a33_frontend = {
+- .ch_phase = {
+- {
+- .horzphase = 0x400,
+- .vertphase = { 0x400, 0x400 },
+- },
+- {
+- .horzphase = 0x400,
+- .vertphase = { 0x400, 0x400 },
+- },
+- },
++ .ch_phase = { 0x400, 0xfc400 },
+ .has_coef_access_ctrl = true,
+ };
+
+diff --git a/drivers/gpu/drm/sun4i/sun4i_frontend.h b/drivers/gpu/drm/sun4i/sun4i_frontend.h
+index 0c382c1ddb0fe..2e7b76e50c2ba 100644
+--- a/drivers/gpu/drm/sun4i/sun4i_frontend.h
++++ b/drivers/gpu/drm/sun4i/sun4i_frontend.h
+@@ -115,11 +115,7 @@ struct reset_control;
+ struct sun4i_frontend_data {
+ bool has_coef_access_ctrl;
+ bool has_coef_rdy;
+-
+- struct {
+- u32 horzphase;
+- u32 vertphase[2];
+- } ch_phase[2];
++ u32 ch_phase[2];
+ };
+
+ struct sun4i_frontend {
+diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
+index 5e6fb6c2307f0..0d78ba017a29b 100644
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -309,6 +309,7 @@ unbind_all:
+ component_unbind_all(dev, drm);
+ gem_destroy:
+ vc4_gem_destroy(drm);
++ drm_mode_config_cleanup(drm);
+ vc4_bo_cache_destroy(drm);
+ dev_put:
+ drm_dev_put(drm);
+diff --git a/drivers/hwtracing/coresight/coresight-priv.h b/drivers/hwtracing/coresight/coresight-priv.h
+index dfd24b85a5775..82e563cdc8794 100644
+--- a/drivers/hwtracing/coresight/coresight-priv.h
++++ b/drivers/hwtracing/coresight/coresight-priv.h
+@@ -147,8 +147,7 @@ static inline void coresight_write_reg_pair(void __iomem *addr, u64 val,
+ void coresight_disable_path(struct list_head *path);
+ int coresight_enable_path(struct list_head *path, u32 mode, void *sink_data);
+ struct coresight_device *coresight_get_sink(struct list_head *path);
+-struct coresight_device *
+-coresight_get_enabled_sink(struct coresight_device *source);
++struct coresight_device *coresight_get_enabled_sink(bool reset);
+ struct coresight_device *coresight_get_sink_by_id(u32 id);
+ struct list_head *coresight_build_path(struct coresight_device *csdev,
+ struct coresight_device *sink);
+diff --git a/drivers/hwtracing/coresight/coresight.c b/drivers/hwtracing/coresight/coresight.c
+index 90ecd04a2f20b..0bbce0d291582 100644
+--- a/drivers/hwtracing/coresight/coresight.c
++++ b/drivers/hwtracing/coresight/coresight.c
+@@ -481,46 +481,50 @@ struct coresight_device *coresight_get_sink(struct list_head *path)
+ return csdev;
+ }
+
+-static struct coresight_device *
+-coresight_find_enabled_sink(struct coresight_device *csdev)
++static int coresight_enabled_sink(struct device *dev, const void *data)
+ {
+- int i;
+- struct coresight_device *sink;
++ const bool *reset = data;
++ struct coresight_device *csdev = to_coresight_device(dev);
+
+ if ((csdev->type == CORESIGHT_DEV_TYPE_SINK ||
+ csdev->type == CORESIGHT_DEV_TYPE_LINKSINK) &&
+- csdev->activated)
+- return csdev;
+-
+- /*
+- * Recursively explore each port found on this element.
+- */
+- for (i = 0; i < csdev->pdata->nr_outport; i++) {
+- struct coresight_device *child_dev;
++ csdev->activated) {
++ /*
++ * Now that we have a handle on the sink for this session,
++ * disable the sysFS "enable_sink" flag so that possible
++ * concurrent perf session that wish to use another sink don't
++ * trip on it. Doing so has no ramification for the current
++ * session.
++ */
++ if (*reset)
++ csdev->activated = false;
+
+- child_dev = csdev->pdata->conns[i].child_dev;
+- if (child_dev)
+- sink = coresight_find_enabled_sink(child_dev);
+- if (sink)
+- return sink;
++ return 1;
+ }
+
+- return NULL;
++ return 0;
+ }
+
+ /**
+- * coresight_get_enabled_sink - returns the first enabled sink using
+- * connection based search starting from the source reference
++ * coresight_get_enabled_sink - returns the first enabled sink found on the bus
++ * @deactivate: Whether the 'enable_sink' flag should be reset
+ *
+- * @source: Coresight source device reference
++ * When operated from perf the deactivate parameter should be set to 'true'.
++ * That way the "enabled_sink" flag of the sink that was selected can be reset,
++ * allowing for other concurrent perf sessions to choose a different sink.
++ *
++ * When operated from sysFS users have full control and as such the deactivate
++ * parameter should be set to 'false', hence mandating users to explicitly
++ * clear the flag.
+ */
+-struct coresight_device *
+-coresight_get_enabled_sink(struct coresight_device *source)
++struct coresight_device *coresight_get_enabled_sink(bool deactivate)
+ {
+- if (!source)
+- return NULL;
++ struct device *dev = NULL;
++
++ dev = bus_find_device(&coresight_bustype, NULL, &deactivate,
++ coresight_enabled_sink);
+
+- return coresight_find_enabled_sink(source);
++ return dev ? to_coresight_device(dev) : NULL;
+ }
+
+ static int coresight_sink_by_id(struct device *dev, const void *data)
+@@ -760,7 +764,11 @@ int coresight_enable(struct coresight_device *csdev)
+ goto out;
+ }
+
+- sink = coresight_get_enabled_sink(csdev);
++ /*
++ * Search for a valid sink for this session but don't reset the
++ * "enable_sink" flag in sysFS. Users get to do that explicitly.
++ */
++ sink = coresight_get_enabled_sink(false);
+ if (!sink) {
+ ret = -EINVAL;
+ goto out;
+diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
+index f417fb680cd80..40586ad17f522 100644
+--- a/drivers/mtd/spi-nor/spi-nor.c
++++ b/drivers/mtd/spi-nor/spi-nor.c
+@@ -4444,11 +4444,10 @@ static void spi_nor_sfdp_init_params(struct spi_nor *nor)
+
+ memcpy(&sfdp_params, &nor->params, sizeof(sfdp_params));
+
+- if (spi_nor_parse_sfdp(nor, &sfdp_params)) {
++ if (spi_nor_parse_sfdp(nor, &nor->params)) {
++ memcpy(&nor->params, &sfdp_params, sizeof(nor->params));
+ nor->addr_width = 0;
+ nor->flags &= ~SNOR_F_4B_OPCODES;
+- } else {
+- memcpy(&nor->params, &sfdp_params, sizeof(nor->params));
+ }
+ }
+
+diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
+index a5c4d4d66df35..3f74416bb8744 100644
+--- a/drivers/net/ethernet/cadence/macb_main.c
++++ b/drivers/net/ethernet/cadence/macb_main.c
+@@ -1718,7 +1718,8 @@ static inline int macb_clear_csum(struct sk_buff *skb)
+
+ static int macb_pad_and_fcs(struct sk_buff **skb, struct net_device *ndev)
+ {
+- bool cloned = skb_cloned(*skb) || skb_header_cloned(*skb);
++ bool cloned = skb_cloned(*skb) || skb_header_cloned(*skb) ||
++ skb_is_nonlinear(*skb);
+ int padlen = ETH_ZLEN - (*skb)->len;
+ int headroom = skb_headroom(*skb);
+ int tailroom = skb_tailroom(*skb);
+diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
+index 3978d82c95989..5cb58ab1eec97 100644
+--- a/drivers/net/ethernet/freescale/gianfar.c
++++ b/drivers/net/ethernet/freescale/gianfar.c
+@@ -1826,20 +1826,12 @@ static netdev_tx_t gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ fcb_len = GMAC_FCB_LEN + GMAC_TXPAL_LEN;
+
+ /* make space for additional header when fcb is needed */
+- if (fcb_len && unlikely(skb_headroom(skb) < fcb_len)) {
+- struct sk_buff *skb_new;
+-
+- skb_new = skb_realloc_headroom(skb, fcb_len);
+- if (!skb_new) {
++ if (fcb_len) {
++ if (unlikely(skb_cow_head(skb, fcb_len))) {
+ dev->stats.tx_errors++;
+ dev_kfree_skb_any(skb);
+ return NETDEV_TX_OK;
+ }
+-
+- if (skb->sk)
+- skb_set_owner_w(skb_new, skb->sk);
+- dev_consume_skb_any(skb);
+- skb = skb_new;
+ }
+
+ /* total number of fragments in the SKB */
+@@ -3377,7 +3369,7 @@ static int gfar_probe(struct platform_device *ofdev)
+
+ if (dev->features & NETIF_F_IP_CSUM ||
+ priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)
+- dev->needed_headroom = GMAC_FCB_LEN;
++ dev->needed_headroom = GMAC_FCB_LEN + GMAC_TXPAL_LEN;
+
+ /* Initializing some of the rx/tx queue level parameters */
+ for (i = 0; i < priv->num_tx_queues; i++) {
+diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
+index 91559a52c7adb..f357b9cbfee72 100644
+--- a/drivers/net/ethernet/ibm/ibmvnic.c
++++ b/drivers/net/ethernet/ibm/ibmvnic.c
+@@ -1109,18 +1109,27 @@ static int ibmvnic_open(struct net_device *netdev)
+ if (adapter->state != VNIC_CLOSED) {
+ rc = ibmvnic_login(netdev);
+ if (rc)
+- return rc;
++ goto out;
+
+ rc = init_resources(adapter);
+ if (rc) {
+ netdev_err(netdev, "failed to initialize resources\n");
+ release_resources(adapter);
+- return rc;
++ goto out;
+ }
+ }
+
+ rc = __ibmvnic_open(netdev);
+
++out:
++ /*
++ * If open fails due to a pending failover, set device state and
++ * return. Device operation will be handled by reset routine.
++ */
++ if (rc && adapter->failover_pending) {
++ adapter->state = VNIC_OPEN;
++ rc = 0;
++ }
+ return rc;
+ }
+
+@@ -1842,6 +1851,13 @@ static int do_reset(struct ibmvnic_adapter *adapter,
+ rwi->reset_reason);
+
+ rtnl_lock();
++ /*
++ * Now that we have the rtnl lock, clear any pending failover.
++ * This will ensure ibmvnic_open() has either completed or will
++ * block until failover is complete.
++ */
++ if (rwi->reset_reason == VNIC_RESET_FAILOVER)
++ adapter->failover_pending = false;
+
+ netif_carrier_off(netdev);
+ adapter->reset_reason = rwi->reset_reason;
+@@ -2112,6 +2128,13 @@ static void __ibmvnic_reset(struct work_struct *work)
+ /* CHANGE_PARAM requestor holds rtnl_lock */
+ rc = do_change_param_reset(adapter, rwi, reset_state);
+ } else if (adapter->force_reset_recovery) {
++ /*
++ * Since we are doing a hard reset now, clear the
++ * failover_pending flag so we don't ignore any
++ * future MOBILITY or other resets.
++ */
++ adapter->failover_pending = false;
++
+ /* Transport event occurred during previous reset */
+ if (adapter->wait_for_reset) {
+ /* Previous was CHANGE_PARAM; caller locked */
+@@ -2176,9 +2199,15 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter,
+ unsigned long flags;
+ int ret;
+
++ /*
++ * If failover is pending don't schedule any other reset.
++ * Instead let the failover complete. If there is already a
++ * a failover reset scheduled, we will detect and drop the
++ * duplicate reset when walking the ->rwi_list below.
++ */
+ if (adapter->state == VNIC_REMOVING ||
+ adapter->state == VNIC_REMOVED ||
+- adapter->failover_pending) {
++ (adapter->failover_pending && reason != VNIC_RESET_FAILOVER)) {
+ ret = EBUSY;
+ netdev_dbg(netdev, "Adapter removing or pending failover, skipping reset\n");
+ goto err;
+@@ -4532,7 +4561,6 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,
+ case IBMVNIC_CRQ_INIT:
+ dev_info(dev, "Partner initialized\n");
+ adapter->from_passive_init = true;
+- adapter->failover_pending = false;
+ if (!completion_done(&adapter->init_done)) {
+ complete(&adapter->init_done);
+ adapter->init_done_rc = -EIO;
+diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
+index 5aacc00962df7..b8de3784d9769 100644
+--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
++++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
+@@ -125,6 +125,11 @@ static int ionic_get_link_ksettings(struct net_device *netdev,
+
+ ethtool_link_ksettings_zero_link_mode(ks, supported);
+
++ if (!idev->port_info) {
++ netdev_err(netdev, "port_info not initialized\n");
++ return -EOPNOTSUPP;
++ }
++
+ /* The port_info data is found in a DMA space that the NIC keeps
+ * up-to-date, so there's no need to request the data from the
+ * NIC, we already have it in our memory space.
+diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
+index 272d5773573e7..27b67f12ec455 100644
+--- a/drivers/net/phy/sfp.c
++++ b/drivers/net/phy/sfp.c
+@@ -1970,7 +1970,8 @@ static int sfp_probe(struct platform_device *pdev)
+ continue;
+
+ sfp->gpio_irq[i] = gpiod_to_irq(sfp->gpio[i]);
+- if (!sfp->gpio_irq[i]) {
++ if (sfp->gpio_irq[i] < 0) {
++ sfp->gpio_irq[i] = 0;
+ poll = true;
+ continue;
+ }
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 21d905d90650b..868acb4101412 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -1331,6 +1331,7 @@ static const struct usb_device_id products[] = {
+ {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */
+ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
+ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1201, 2)}, /* Telit LE920, LE920A4 */
++ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1230, 2)}, /* Telit LE910Cx */
+ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1260, 2)}, /* Telit LE910Cx */
+ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1261, 2)}, /* Telit LE910Cx */
+ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1900, 1)}, /* Telit LN940 series */
+diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
+index a41ee9feab8e7..e957ad0a07f58 100644
+--- a/drivers/nvme/host/rdma.c
++++ b/drivers/nvme/host/rdma.c
+@@ -1520,6 +1520,14 @@ static void nvme_rdma_recv_done(struct ib_cq *cq, struct ib_wc *wc)
+ return;
+ }
+
++ /* sanity checking for received data length */
++ if (unlikely(wc->byte_len < len)) {
++ dev_err(queue->ctrl->ctrl.device,
++ "Unexpected nvme completion length(%d)\n", wc->byte_len);
++ nvme_rdma_error_recovery(queue->ctrl);
++ return;
++ }
++
+ ib_dma_sync_single_for_cpu(ibdev, qe->dma, len, DMA_FROM_DEVICE);
+ /*
+ * AEN requests are special as they don't time out and can
+diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
+index 6b2f1e290fa73..cca5a00c098a8 100644
+--- a/drivers/nvme/target/core.c
++++ b/drivers/nvme/target/core.c
+@@ -878,8 +878,6 @@ bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq,
+ req->error_loc = NVMET_NO_ERROR_LOC;
+ req->error_slba = 0;
+
+- trace_nvmet_req_init(req, req->cmd);
+-
+ /* no support for fused commands yet */
+ if (unlikely(flags & (NVME_CMD_FUSE_FIRST | NVME_CMD_FUSE_SECOND))) {
+ req->error_loc = offsetof(struct nvme_common_command, flags);
+@@ -913,6 +911,8 @@ bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq,
+ if (status)
+ goto fail;
+
++ trace_nvmet_req_init(req, req->cmd);
++
+ if (unlikely(!percpu_ref_tryget_live(&sq->ref))) {
+ status = NVME_SC_INVALID_FIELD | NVME_SC_DNR;
+ goto fail;
+diff --git a/drivers/nvme/target/trace.h b/drivers/nvme/target/trace.h
+index e645caa882dd3..3f61b6657175e 100644
+--- a/drivers/nvme/target/trace.h
++++ b/drivers/nvme/target/trace.h
+@@ -46,19 +46,12 @@ static inline struct nvmet_ctrl *nvmet_req_to_ctrl(struct nvmet_req *req)
+ return req->sq->ctrl;
+ }
+
+-static inline void __assign_disk_name(char *name, struct nvmet_req *req,
+- bool init)
++static inline void __assign_req_name(char *name, struct nvmet_req *req)
+ {
+- struct nvmet_ctrl *ctrl = nvmet_req_to_ctrl(req);
+- struct nvmet_ns *ns;
+-
+- if ((init && req->sq->qid) || (!init && req->cq->qid)) {
+- ns = nvmet_find_namespace(ctrl, req->cmd->rw.nsid);
+- strncpy(name, ns->device_path, DISK_NAME_LEN);
+- return;
+- }
+-
+- memset(name, 0, DISK_NAME_LEN);
++ if (req->ns)
++ strncpy(name, req->ns->device_path, DISK_NAME_LEN);
++ else
++ memset(name, 0, DISK_NAME_LEN);
+ }
+ #endif
+
+@@ -81,7 +74,7 @@ TRACE_EVENT(nvmet_req_init,
+ TP_fast_assign(
+ __entry->cmd = cmd;
+ __entry->ctrl = nvmet_req_to_ctrl(req);
+- __assign_disk_name(__entry->disk, req, true);
++ __assign_req_name(__entry->disk, req);
+ __entry->qid = req->sq->qid;
+ __entry->cid = cmd->common.command_id;
+ __entry->opcode = cmd->common.opcode;
+@@ -121,7 +114,7 @@ TRACE_EVENT(nvmet_req_complete,
+ __entry->cid = req->cqe->command_id;
+ __entry->result = le64_to_cpu(req->cqe->result.u64);
+ __entry->status = le16_to_cpu(req->cqe->status) >> 1;
+- __assign_disk_name(__entry->disk, req, false);
++ __assign_req_name(__entry->disk, req);
+ ),
+ TP_printk("nvmet%s: %sqid=%d, cmdid=%u, res=%#llx, status=%#x",
+ __print_ctrl_name(__entry->ctrl),
+diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
+index 6bd610ee2cd73..3fb5d8caffd53 100644
+--- a/drivers/of/of_reserved_mem.c
++++ b/drivers/of/of_reserved_mem.c
+@@ -200,6 +200,16 @@ static int __init __rmem_cmp(const void *a, const void *b)
+ if (ra->base > rb->base)
+ return 1;
+
++ /*
++ * Put the dynamic allocations (address == 0, size == 0) before static
++ * allocations at address 0x0 so that overlap detection works
++ * correctly.
++ */
++ if (ra->size < rb->size)
++ return -1;
++ if (ra->size > rb->size)
++ return 1;
++
+ return 0;
+ }
+
+@@ -217,8 +227,7 @@ static void __init __rmem_check_for_overlap(void)
+
+ this = &reserved_mem[i];
+ next = &reserved_mem[i + 1];
+- if (!(this->base && next->base))
+- continue;
++
+ if (this->base + this->size > next->base) {
+ phys_addr_t this_end, next_end;
+
+diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
+index ee850cffe1542..4da2d6ad22b0b 100644
+--- a/drivers/regulator/core.c
++++ b/drivers/regulator/core.c
+@@ -4045,6 +4045,8 @@ int regulator_get_voltage_rdev(struct regulator_dev *rdev)
+ ret = rdev->desc->fixed_uV;
+ } else if (rdev->supply) {
+ ret = regulator_get_voltage_rdev(rdev->supply->rdev);
++ } else if (rdev->supply_name) {
++ return -EPROBE_DEFER;
+ } else {
+ return -EINVAL;
+ }
+diff --git a/drivers/s390/crypto/pkey_api.c b/drivers/s390/crypto/pkey_api.c
+index 5c9898e934d96..0658aa5030c6f 100644
+--- a/drivers/s390/crypto/pkey_api.c
++++ b/drivers/s390/crypto/pkey_api.c
+@@ -33,9 +33,6 @@ MODULE_DESCRIPTION("s390 protected key interface");
+ #define KEYBLOBBUFSIZE 8192 /* key buffer size used for internal processing */
+ #define MAXAPQNSINLIST 64 /* max 64 apqns within a apqn list */
+
+-/* mask of available pckmo subfunctions, fetched once at module init */
+-static cpacf_mask_t pckmo_functions;
+-
+ /*
+ * debug feature data and functions
+ */
+@@ -78,6 +75,9 @@ static int pkey_clr2protkey(u32 keytype,
+ const struct pkey_clrkey *clrkey,
+ struct pkey_protkey *protkey)
+ {
++ /* mask of available pckmo subfunctions */
++ static cpacf_mask_t pckmo_functions;
++
+ long fc;
+ int keysize;
+ u8 paramblock[64];
+@@ -101,11 +101,13 @@ static int pkey_clr2protkey(u32 keytype,
+ return -EINVAL;
+ }
+
+- /*
+- * Check if the needed pckmo subfunction is available.
+- * These subfunctions can be enabled/disabled by customers
+- * in the LPAR profile or may even change on the fly.
+- */
++ /* Did we already check for PCKMO ? */
++ if (!pckmo_functions.bytes[0]) {
++ /* no, so check now */
++ if (!cpacf_query(CPACF_PCKMO, &pckmo_functions))
++ return -ENODEV;
++ }
++ /* check for the pckmo subfunction we need now */
+ if (!cpacf_test_func(&pckmo_functions, fc)) {
+ DEBUG_ERR("%s pckmo functions not available\n", __func__);
+ return -ENODEV;
+@@ -1504,7 +1506,7 @@ static struct miscdevice pkey_dev = {
+ */
+ static int __init pkey_init(void)
+ {
+- cpacf_mask_t kmc_functions;
++ cpacf_mask_t func_mask;
+
+ /*
+ * The pckmo instruction should be available - even if we don't
+@@ -1512,15 +1514,15 @@ static int __init pkey_init(void)
+ * is also the minimum level for the kmc instructions which
+ * are able to work with protected keys.
+ */
+- if (!cpacf_query(CPACF_PCKMO, &pckmo_functions))
++ if (!cpacf_query(CPACF_PCKMO, &func_mask))
+ return -ENODEV;
+
+ /* check for kmc instructions available */
+- if (!cpacf_query(CPACF_KMC, &kmc_functions))
++ if (!cpacf_query(CPACF_KMC, &func_mask))
+ return -ENODEV;
+- if (!cpacf_test_func(&kmc_functions, CPACF_KMC_PAES_128) ||
+- !cpacf_test_func(&kmc_functions, CPACF_KMC_PAES_192) ||
+- !cpacf_test_func(&kmc_functions, CPACF_KMC_PAES_256))
++ if (!cpacf_test_func(&func_mask, CPACF_KMC_PAES_128) ||
++ !cpacf_test_func(&func_mask, CPACF_KMC_PAES_192) ||
++ !cpacf_test_func(&func_mask, CPACF_KMC_PAES_256))
+ return -ENODEV;
+
+ pkey_debug_init();
+diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
+index c5711c659b517..1ab0a61e3fb59 100644
+--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
++++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
+@@ -806,6 +806,22 @@ static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code)
+ spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ }
+
++/**
++ * ibmvscsi_set_request_limit - Set the adapter request_limit in response to
++ * an adapter failure, reset, or SRP Login. Done under host lock to prevent
++ * race with SCSI command submission.
++ * @hostdata: adapter to adjust
++ * @limit: new request limit
++ */
++static void ibmvscsi_set_request_limit(struct ibmvscsi_host_data *hostdata, int limit)
++{
++ unsigned long flags;
++
++ spin_lock_irqsave(hostdata->host->host_lock, flags);
++ atomic_set(&hostdata->request_limit, limit);
++ spin_unlock_irqrestore(hostdata->host->host_lock, flags);
++}
++
+ /**
+ * ibmvscsi_reset_host - Reset the connection to the server
+ * @hostdata: struct ibmvscsi_host_data to reset
+@@ -813,7 +829,7 @@ static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code)
+ static void ibmvscsi_reset_host(struct ibmvscsi_host_data *hostdata)
+ {
+ scsi_block_requests(hostdata->host);
+- atomic_set(&hostdata->request_limit, 0);
++ ibmvscsi_set_request_limit(hostdata, 0);
+
+ purge_requests(hostdata, DID_ERROR);
+ hostdata->action = IBMVSCSI_HOST_ACTION_RESET;
+@@ -1146,13 +1162,13 @@ static void login_rsp(struct srp_event_struct *evt_struct)
+ dev_info(hostdata->dev, "SRP_LOGIN_REJ reason %u\n",
+ evt_struct->xfer_iu->srp.login_rej.reason);
+ /* Login failed. */
+- atomic_set(&hostdata->request_limit, -1);
++ ibmvscsi_set_request_limit(hostdata, -1);
+ return;
+ default:
+ dev_err(hostdata->dev, "Invalid login response typecode 0x%02x!\n",
+ evt_struct->xfer_iu->srp.login_rsp.opcode);
+ /* Login failed. */
+- atomic_set(&hostdata->request_limit, -1);
++ ibmvscsi_set_request_limit(hostdata, -1);
+ return;
+ }
+
+@@ -1163,7 +1179,7 @@ static void login_rsp(struct srp_event_struct *evt_struct)
+ * This value is set rather than added to request_limit because
+ * request_limit could have been set to -1 by this client.
+ */
+- atomic_set(&hostdata->request_limit,
++ ibmvscsi_set_request_limit(hostdata,
+ be32_to_cpu(evt_struct->xfer_iu->srp.login_rsp.req_lim_delta));
+
+ /* If we had any pending I/Os, kick them */
+@@ -1195,13 +1211,13 @@ static int send_srp_login(struct ibmvscsi_host_data *hostdata)
+ login->req_buf_fmt = cpu_to_be16(SRP_BUF_FORMAT_DIRECT |
+ SRP_BUF_FORMAT_INDIRECT);
+
+- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ /* Start out with a request limit of 0, since this is negotiated in
+ * the login request we are just sending and login requests always
+ * get sent by the driver regardless of request_limit.
+ */
+- atomic_set(&hostdata->request_limit, 0);
++ ibmvscsi_set_request_limit(hostdata, 0);
+
++ spin_lock_irqsave(hostdata->host->host_lock, flags);
+ rc = ibmvscsi_send_srp_event(evt_struct, hostdata, login_timeout * 2);
+ spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ dev_info(hostdata->dev, "sent SRP login\n");
+@@ -1781,7 +1797,7 @@ static void ibmvscsi_handle_crq(struct viosrp_crq *crq,
+ return;
+ case VIOSRP_CRQ_XPORT_EVENT: /* Hypervisor telling us the connection is closed */
+ scsi_block_requests(hostdata->host);
+- atomic_set(&hostdata->request_limit, 0);
++ ibmvscsi_set_request_limit(hostdata, 0);
+ if (crq->format == 0x06) {
+ /* We need to re-setup the interpartition connection */
+ dev_info(hostdata->dev, "Re-enabling adapter!\n");
+@@ -2137,12 +2153,12 @@ static void ibmvscsi_do_work(struct ibmvscsi_host_data *hostdata)
+ }
+
+ hostdata->action = IBMVSCSI_HOST_ACTION_NONE;
++ spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+
+ if (rc) {
+- atomic_set(&hostdata->request_limit, -1);
++ ibmvscsi_set_request_limit(hostdata, -1);
+ dev_err(hostdata->dev, "error after %s\n", action);
+ }
+- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+
+ scsi_unblock_requests(hostdata->host);
+ }
+@@ -2226,7 +2242,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)
+ init_waitqueue_head(&hostdata->work_wait_q);
+ hostdata->host = host;
+ hostdata->dev = dev;
+- atomic_set(&hostdata->request_limit, -1);
++ ibmvscsi_set_request_limit(hostdata, -1);
+ hostdata->host->max_sectors = IBMVSCSI_MAX_SECTORS_DEFAULT;
+
+ if (map_persist_bufs(hostdata)) {
+diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
+index 058079f915f18..79232cef1af16 100644
+--- a/drivers/scsi/scsi_scan.c
++++ b/drivers/scsi/scsi_scan.c
+@@ -1715,15 +1715,16 @@ static void scsi_sysfs_add_devices(struct Scsi_Host *shost)
+ */
+ static struct async_scan_data *scsi_prep_async_scan(struct Scsi_Host *shost)
+ {
+- struct async_scan_data *data;
++ struct async_scan_data *data = NULL;
+ unsigned long flags;
+
+ if (strncmp(scsi_scan_type, "sync", 4) == 0)
+ return NULL;
+
++ mutex_lock(&shost->scan_mutex);
+ if (shost->async_scan) {
+ shost_printk(KERN_DEBUG, shost, "%s called twice\n", __func__);
+- return NULL;
++ goto err;
+ }
+
+ data = kmalloc(sizeof(*data), GFP_KERNEL);
+@@ -1734,7 +1735,6 @@ static struct async_scan_data *scsi_prep_async_scan(struct Scsi_Host *shost)
+ goto err;
+ init_completion(&data->prev_finished);
+
+- mutex_lock(&shost->scan_mutex);
+ spin_lock_irqsave(shost->host_lock, flags);
+ shost->async_scan = 1;
+ spin_unlock_irqrestore(shost->host_lock, flags);
+@@ -1749,6 +1749,7 @@ static struct async_scan_data *scsi_prep_async_scan(struct Scsi_Host *shost)
+ return data;
+
+ err:
++ mutex_unlock(&shost->scan_mutex);
+ kfree(data);
+ return NULL;
+ }
+diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c
+index c88f5d99c9065..cfd9176e6413c 100644
+--- a/drivers/spi/spi-bcm2835.c
++++ b/drivers/spi/spi-bcm2835.c
+@@ -1245,18 +1245,6 @@ static int bcm2835_spi_setup(struct spi_device *spi)
+ if (!chip)
+ return 0;
+
+- /*
+- * Retrieve the corresponding GPIO line used for CS.
+- * The inversion semantics will be handled by the GPIO core
+- * code, so we pass GPIOS_OUT_LOW for "unasserted" and
+- * the correct flag for inversion semantics. The SPI_CS_HIGH
+- * on spi->mode cannot be checked for polarity in this case
+- * as the flag use_gpio_descriptors enforces SPI_CS_HIGH.
+- */
+- if (of_property_read_bool(spi->dev.of_node, "spi-cs-high"))
+- lflags = GPIO_ACTIVE_HIGH;
+- else
+- lflags = GPIO_ACTIVE_LOW;
+ spi->cs_gpiod = gpiochip_request_own_desc(chip, 8 - spi->chip_select,
+ DRV_NAME,
+ lflags,
+diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c
+index 2b59a43050771..e9eb454c24728 100644
+--- a/drivers/tty/serial/8250/8250_mtk.c
++++ b/drivers/tty/serial/8250/8250_mtk.c
+@@ -316,7 +316,7 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
+ */
+ baud = tty_termios_baud_rate(termios);
+
+- serial8250_do_set_termios(port, termios, old);
++ serial8250_do_set_termios(port, termios, NULL);
+
+ tty_termios_encode_baud_rate(termios, baud, baud);
+
+diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
+index ec8e608b46baa..6ad985e8dc653 100644
+--- a/drivers/tty/serial/fsl_lpuart.c
++++ b/drivers/tty/serial/fsl_lpuart.c
+@@ -238,6 +238,7 @@ static DEFINE_IDA(fsl_lpuart_ida);
+ enum lpuart_type {
+ VF610_LPUART,
+ LS1021A_LPUART,
++ LS1028A_LPUART,
+ IMX7ULP_LPUART,
+ IMX8QXP_LPUART,
+ };
+@@ -282,11 +283,16 @@ static const struct lpuart_soc_data vf_data = {
+ .iotype = UPIO_MEM,
+ };
+
+-static const struct lpuart_soc_data ls_data = {
++static const struct lpuart_soc_data ls1021a_data = {
+ .devtype = LS1021A_LPUART,
+ .iotype = UPIO_MEM32BE,
+ };
+
++static const struct lpuart_soc_data ls1028a_data = {
++ .devtype = LS1028A_LPUART,
++ .iotype = UPIO_MEM32,
++};
++
+ static struct lpuart_soc_data imx7ulp_data = {
+ .devtype = IMX7ULP_LPUART,
+ .iotype = UPIO_MEM32,
+@@ -301,7 +307,8 @@ static struct lpuart_soc_data imx8qxp_data = {
+
+ static const struct of_device_id lpuart_dt_ids[] = {
+ { .compatible = "fsl,vf610-lpuart", .data = &vf_data, },
+- { .compatible = "fsl,ls1021a-lpuart", .data = &ls_data, },
++ { .compatible = "fsl,ls1021a-lpuart", .data = &ls1021a_data, },
++ { .compatible = "fsl,ls1028a-lpuart", .data = &ls1028a_data, },
+ { .compatible = "fsl,imx7ulp-lpuart", .data = &imx7ulp_data, },
+ { .compatible = "fsl,imx8qxp-lpuart", .data = &imx8qxp_data, },
+ { /* sentinel */ }
+@@ -311,6 +318,12 @@ MODULE_DEVICE_TABLE(of, lpuart_dt_ids);
+ /* Forward declare this for the dma callbacks*/
+ static void lpuart_dma_tx_complete(void *arg);
+
++static inline bool is_layerscape_lpuart(struct lpuart_port *sport)
++{
++ return (sport->devtype == LS1021A_LPUART ||
++ sport->devtype == LS1028A_LPUART);
++}
++
+ static inline bool is_imx8qxp_lpuart(struct lpuart_port *sport)
+ {
+ return sport->devtype == IMX8QXP_LPUART;
+@@ -1553,6 +1566,17 @@ static int lpuart32_startup(struct uart_port *port)
+ sport->rxfifo_size = UARTFIFO_DEPTH((temp >> UARTFIFO_RXSIZE_OFF) &
+ UARTFIFO_FIFOSIZE_MASK);
+
++ /*
++ * The LS1021A and LS1028A have a fixed FIFO depth of 16 words.
++ * Although they support the RX/TXSIZE fields, their encoding is
++ * different. Eg the reference manual states 0b101 is 16 words.
++ */
++ if (is_layerscape_lpuart(sport)) {
++ sport->rxfifo_size = 16;
++ sport->txfifo_size = 16;
++ sport->port.fifosize = sport->txfifo_size;
++ }
++
+ spin_lock_irqsave(&sport->port.lock, flags);
+
+ lpuart32_setup_watermark_enable(sport);
+diff --git a/drivers/tty/serial/serial_txx9.c b/drivers/tty/serial/serial_txx9.c
+index d22ccb32aa9b7..8507f18900d09 100644
+--- a/drivers/tty/serial/serial_txx9.c
++++ b/drivers/tty/serial/serial_txx9.c
+@@ -1283,6 +1283,9 @@ static int __init serial_txx9_init(void)
+
+ #ifdef ENABLE_SERIAL_TXX9_PCI
+ ret = pci_register_driver(&serial_txx9_pci_driver);
++ if (ret) {
++ platform_driver_unregister(&serial_txx9_plat_driver);
++ }
+ #endif
+ if (ret == 0)
+ goto out;
+diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
+index d07a9c9c76081..c55b6d7ccaf78 100644
+--- a/drivers/tty/vt/vt.c
++++ b/drivers/tty/vt/vt.c
+@@ -4620,27 +4620,6 @@ static int con_font_default(struct vc_data *vc, struct console_font_op *op)
+ return rc;
+ }
+
+-static int con_font_copy(struct vc_data *vc, struct console_font_op *op)
+-{
+- int con = op->height;
+- int rc;
+-
+-
+- console_lock();
+- if (vc->vc_mode != KD_TEXT)
+- rc = -EINVAL;
+- else if (!vc->vc_sw->con_font_copy)
+- rc = -ENOSYS;
+- else if (con < 0 || !vc_cons_allocated(con))
+- rc = -ENOTTY;
+- else if (con == vc->vc_num) /* nothing to do */
+- rc = 0;
+- else
+- rc = vc->vc_sw->con_font_copy(vc, con);
+- console_unlock();
+- return rc;
+-}
+-
+ int con_font_op(struct vc_data *vc, struct console_font_op *op)
+ {
+ switch (op->op) {
+@@ -4651,7 +4630,8 @@ int con_font_op(struct vc_data *vc, struct console_font_op *op)
+ case KD_FONT_OP_SET_DEFAULT:
+ return con_font_default(vc, op);
+ case KD_FONT_OP_COPY:
+- return con_font_copy(vc, op);
++ /* was buggy and never really used */
++ return -EINVAL;
+ }
+ return -ENOSYS;
+ }
+diff --git a/drivers/usb/cdns3/gadget.h b/drivers/usb/cdns3/gadget.h
+index bc4024041ef26..ec5c05454531d 100644
+--- a/drivers/usb/cdns3/gadget.h
++++ b/drivers/usb/cdns3/gadget.h
+@@ -1057,7 +1057,7 @@ struct cdns3_trb {
+ #define TRB_TDL_SS_SIZE_GET(p) (((p) & GENMASK(23, 17)) >> 17)
+
+ /* transfer_len bitmasks - bits 31:24 */
+-#define TRB_BURST_LEN(p) (((p) << 24) & GENMASK(31, 24))
++#define TRB_BURST_LEN(p) ((unsigned int)((p) << 24) & GENMASK(31, 24))
+ #define TRB_BURST_LEN_GET(p) (((p) & GENMASK(31, 24)) >> 24)
+
+ /* Data buffer pointer bitmasks*/
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 4ee8105310989..5ad14cdd97623 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -378,6 +378,9 @@ static const struct usb_device_id usb_quirk_list[] = {
+ { USB_DEVICE(0x0926, 0x3333), .driver_info =
+ USB_QUIRK_CONFIG_INTF_STRINGS },
+
++ /* Kingston DataTraveler 3.0 */
++ { USB_DEVICE(0x0951, 0x1666), .driver_info = USB_QUIRK_NO_LPM },
++
+ /* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */
+ { USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF },
+
+diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
+index 991cab9a7491d..4de8e5f091cb9 100644
+--- a/drivers/usb/dwc3/ep0.c
++++ b/drivers/usb/dwc3/ep0.c
+@@ -1058,10 +1058,11 @@ void dwc3_ep0_send_delayed_status(struct dwc3 *dwc)
+ {
+ unsigned int direction = !dwc->ep0_expect_in;
+
++ dwc->delayed_status = false;
++
+ if (dwc->ep0state != EP0_STATUS_PHASE)
+ return;
+
+- dwc->delayed_status = false;
+ __dwc3_ep0_do_control_status(dwc, dwc->eps[direction]);
+ }
+
+diff --git a/drivers/usb/mtu3/mtu3_gadget.c b/drivers/usb/mtu3/mtu3_gadget.c
+index f93732e53fd89..08db02f3172df 100644
+--- a/drivers/usb/mtu3/mtu3_gadget.c
++++ b/drivers/usb/mtu3/mtu3_gadget.c
+@@ -587,6 +587,7 @@ static int mtu3_gadget_stop(struct usb_gadget *g)
+
+ spin_unlock_irqrestore(&mtu->lock, flags);
+
++ synchronize_irq(mtu->irq);
+ return 0;
+ }
+
+diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c
+index ebd76ab07b722..36dd688b5795c 100644
+--- a/drivers/usb/serial/cyberjack.c
++++ b/drivers/usb/serial/cyberjack.c
+@@ -357,11 +357,12 @@ static void cyberjack_write_bulk_callback(struct urb *urb)
+ struct device *dev = &port->dev;
+ int status = urb->status;
+ unsigned long flags;
++ bool resubmitted = false;
+
+- set_bit(0, &port->write_urbs_free);
+ if (status) {
+ dev_dbg(dev, "%s - nonzero write bulk status received: %d\n",
+ __func__, status);
++ set_bit(0, &port->write_urbs_free);
+ return;
+ }
+
+@@ -394,6 +395,8 @@ static void cyberjack_write_bulk_callback(struct urb *urb)
+ goto exit;
+ }
+
++ resubmitted = true;
++
+ dev_dbg(dev, "%s - priv->wrsent=%d\n", __func__, priv->wrsent);
+ dev_dbg(dev, "%s - priv->wrfilled=%d\n", __func__, priv->wrfilled);
+
+@@ -410,6 +413,8 @@ static void cyberjack_write_bulk_callback(struct urb *urb)
+
+ exit:
+ spin_unlock_irqrestore(&priv->lock, flags);
++ if (!resubmitted)
++ set_bit(0, &port->write_urbs_free);
+ usb_serial_port_softint(port);
+ }
+
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index eb5538a44ee9d..741c72bd499a9 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -250,6 +250,7 @@ static void option_instat_callback(struct urb *urb);
+ #define QUECTEL_PRODUCT_EP06 0x0306
+ #define QUECTEL_PRODUCT_EM12 0x0512
+ #define QUECTEL_PRODUCT_RM500Q 0x0800
++#define QUECTEL_PRODUCT_EC200T 0x6026
+
+ #define CMOTECH_VENDOR_ID 0x16d8
+ #define CMOTECH_PRODUCT_6001 0x6001
+@@ -1117,6 +1118,7 @@ static const struct usb_device_id option_ids[] = {
+ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) },
+ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10),
+ .driver_info = ZLP },
++ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) },
+
+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
+ { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
+@@ -1189,6 +1191,8 @@ static const struct usb_device_id option_ids[] = {
+ .driver_info = NCTRL(0) | RSVD(1) },
+ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1054, 0xff), /* Telit FT980-KS */
+ .driver_info = NCTRL(2) | RSVD(3) },
++ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1055, 0xff), /* Telit FN980 (PCIe) */
++ .driver_info = NCTRL(0) | RSVD(1) },
+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
+ .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
+@@ -1201,6 +1205,8 @@ static const struct usb_device_id option_ids[] = {
+ .driver_info = NCTRL(0) },
+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910),
+ .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
++ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1203, 0xff), /* Telit LE910Cx (RNDIS) */
++ .driver_info = NCTRL(2) | RSVD(3) },
+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4),
+ .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) | RSVD(3) },
+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920),
+@@ -1215,6 +1221,10 @@ static const struct usb_device_id option_ids[] = {
+ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920A4_1213, 0xff) },
+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920A4_1214),
+ .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) | RSVD(3) },
++ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1230, 0xff), /* Telit LE910Cx (rmnet) */
++ .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
++ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1231, 0xff), /* Telit LE910Cx (RNDIS) */
++ .driver_info = NCTRL(2) | RSVD(3) },
+ { USB_DEVICE(TELIT_VENDOR_ID, 0x1260),
+ .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
+ { USB_DEVICE(TELIT_VENDOR_ID, 0x1261),
+diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
+index 0290a22ebccf5..9e1685a30bf8d 100644
+--- a/fs/gfs2/glock.c
++++ b/fs/gfs2/glock.c
+@@ -873,7 +873,8 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
+ out_free:
+ kfree(gl->gl_lksb.sb_lvbptr);
+ kmem_cache_free(cachep, gl);
+- atomic_dec(&sdp->sd_glock_disposal);
++ if (atomic_dec_and_test(&sdp->sd_glock_disposal))
++ wake_up(&sdp->sd_glock_wait);
+
+ out:
+ return ret;
+diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
+index bf0435dbec436..b3021d9b34a5e 100644
+--- a/fs/xfs/xfs_ioctl.c
++++ b/fs/xfs/xfs_ioctl.c
+@@ -622,7 +622,6 @@ xfs_ioc_space(
+ error = xfs_break_layouts(inode, &iolock, BREAK_UNMAP);
+ if (error)
+ goto out_unlock;
+- inode_dio_wait(inode);
+
+ switch (bf->l_whence) {
+ case 0: /*SEEK_SET*/
+@@ -668,6 +667,31 @@ xfs_ioc_space(
+ goto out_unlock;
+ }
+
++ /*
++ * Must wait for all AIO to complete before we continue as AIO can
++ * change the file size on completion without holding any locks we
++ * currently hold. We must do this first because AIO can update both
++ * the on disk and in memory inode sizes, and the operations that follow
++ * require the in-memory size to be fully up-to-date.
++ */
++ inode_dio_wait(inode);
++
++ /*
++ * Now that AIO and DIO has drained we can flush and (if necessary)
++ * invalidate the cached range over the first operation we are about to
++ * run. We include zero range here because it starts with a hole punch
++ * over the target range.
++ */
++ switch (cmd) {
++ case XFS_IOC_ZERO_RANGE:
++ case XFS_IOC_UNRESVSP:
++ case XFS_IOC_UNRESVSP64:
++ error = xfs_flush_unmap_range(ip, bf->l_start, bf->l_len);
++ if (error)
++ goto out_unlock;
++ break;
++ }
++
+ switch (cmd) {
+ case XFS_IOC_ZERO_RANGE:
+ flags |= XFS_PREALLOC_SET;
+diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h
+index 6fd08cf04add7..ea39a0b54c637 100644
+--- a/include/asm-generic/pgtable.h
++++ b/include/asm-generic/pgtable.h
+@@ -1159,10 +1159,6 @@ static inline bool arch_has_pfn_modify_check(void)
+
+ #endif /* !__ASSEMBLY__ */
+
+-#ifndef io_remap_pfn_range
+-#define io_remap_pfn_range remap_pfn_range
+-#endif
+-
+ #ifndef has_transparent_hugepage
+ #ifdef CONFIG_TRANSPARENT_HUGEPAGE
+ #define has_transparent_hugepage() 1
+diff --git a/include/linux/linkage.h b/include/linux/linkage.h
+index 7e020782ade22..f3ae8f3dea2c7 100644
+--- a/include/linux/linkage.h
++++ b/include/linux/linkage.h
+@@ -75,32 +75,58 @@
+
+ #ifdef __ASSEMBLY__
+
++/* SYM_T_FUNC -- type used by assembler to mark functions */
++#ifndef SYM_T_FUNC
++#define SYM_T_FUNC STT_FUNC
++#endif
++
++/* SYM_T_OBJECT -- type used by assembler to mark data */
++#ifndef SYM_T_OBJECT
++#define SYM_T_OBJECT STT_OBJECT
++#endif
++
++/* SYM_T_NONE -- type used by assembler to mark entries of unknown type */
++#ifndef SYM_T_NONE
++#define SYM_T_NONE STT_NOTYPE
++#endif
++
++/* SYM_A_* -- align the symbol? */
++#define SYM_A_ALIGN ALIGN
++#define SYM_A_NONE /* nothing */
++
++/* SYM_L_* -- linkage of symbols */
++#define SYM_L_GLOBAL(name) .globl name
++#define SYM_L_WEAK(name) .weak name
++#define SYM_L_LOCAL(name) /* nothing */
++
+ #ifndef LINKER_SCRIPT
+ #define ALIGN __ALIGN
+ #define ALIGN_STR __ALIGN_STR
+
++/* === DEPRECATED annotations === */
++
+ #ifndef GLOBAL
++/* deprecated, use SYM_DATA*, SYM_ENTRY, or similar */
+ #define GLOBAL(name) \
+ .globl name ASM_NL \
+ name:
+ #endif
+
+ #ifndef ENTRY
++/* deprecated, use SYM_FUNC_START */
+ #define ENTRY(name) \
+- .globl name ASM_NL \
+- ALIGN ASM_NL \
+- name:
++ SYM_FUNC_START(name)
+ #endif
+ #endif /* LINKER_SCRIPT */
+
+ #ifndef WEAK
++/* deprecated, use SYM_FUNC_START_WEAK* */
+ #define WEAK(name) \
+- .weak name ASM_NL \
+- ALIGN ASM_NL \
+- name:
++ SYM_FUNC_START_WEAK(name)
+ #endif
+
+ #ifndef END
++/* deprecated, use SYM_FUNC_END, SYM_DATA_END, or SYM_END */
+ #define END(name) \
+ .size name, .-name
+ #endif
+@@ -110,11 +136,214 @@
+ * static analysis tools such as stack depth analyzer.
+ */
+ #ifndef ENDPROC
++/* deprecated, use SYM_FUNC_END */
+ #define ENDPROC(name) \
+- .type name, @function ASM_NL \
+- END(name)
++ SYM_FUNC_END(name)
++#endif
++
++/* === generic annotations === */
++
++/* SYM_ENTRY -- use only if you have to for non-paired symbols */
++#ifndef SYM_ENTRY
++#define SYM_ENTRY(name, linkage, align...) \
++ linkage(name) ASM_NL \
++ align ASM_NL \
++ name:
++#endif
++
++/* SYM_START -- use only if you have to */
++#ifndef SYM_START
++#define SYM_START(name, linkage, align...) \
++ SYM_ENTRY(name, linkage, align)
++#endif
++
++/* SYM_END -- use only if you have to */
++#ifndef SYM_END
++#define SYM_END(name, sym_type) \
++ .type name sym_type ASM_NL \
++ .size name, .-name
++#endif
++
++/* === code annotations === */
++
++/*
++ * FUNC -- C-like functions (proper stack frame etc.)
++ * CODE -- non-C code (e.g. irq handlers with different, special stack etc.)
++ *
++ * Objtool validates stack for FUNC, but not for CODE.
++ * Objtool generates debug info for both FUNC & CODE, but needs special
++ * annotations for each CODE's start (to describe the actual stack frame).
++ *
++ * ALIAS -- does not generate debug info -- the aliased function will
++ */
++
++/* SYM_INNER_LABEL_ALIGN -- only for labels in the middle of code */
++#ifndef SYM_INNER_LABEL_ALIGN
++#define SYM_INNER_LABEL_ALIGN(name, linkage) \
++ .type name SYM_T_NONE ASM_NL \
++ SYM_ENTRY(name, linkage, SYM_A_ALIGN)
++#endif
++
++/* SYM_INNER_LABEL -- only for labels in the middle of code */
++#ifndef SYM_INNER_LABEL
++#define SYM_INNER_LABEL(name, linkage) \
++ .type name SYM_T_NONE ASM_NL \
++ SYM_ENTRY(name, linkage, SYM_A_NONE)
++#endif
++
++/*
++ * SYM_FUNC_START_LOCAL_ALIAS -- use where there are two local names for one
++ * function
++ */
++#ifndef SYM_FUNC_START_LOCAL_ALIAS
++#define SYM_FUNC_START_LOCAL_ALIAS(name) \
++ SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN)
++#endif
++
++/*
++ * SYM_FUNC_START_ALIAS -- use where there are two global names for one
++ * function
++ */
++#ifndef SYM_FUNC_START_ALIAS
++#define SYM_FUNC_START_ALIAS(name) \
++ SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
++#endif
++
++/* SYM_FUNC_START -- use for global functions */
++#ifndef SYM_FUNC_START
++/*
++ * The same as SYM_FUNC_START_ALIAS, but we will need to distinguish these two
++ * later.
++ */
++#define SYM_FUNC_START(name) \
++ SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
++#endif
++
++/* SYM_FUNC_START_NOALIGN -- use for global functions, w/o alignment */
++#ifndef SYM_FUNC_START_NOALIGN
++#define SYM_FUNC_START_NOALIGN(name) \
++ SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE)
++#endif
++
++/* SYM_FUNC_START_LOCAL -- use for local functions */
++#ifndef SYM_FUNC_START_LOCAL
++/* the same as SYM_FUNC_START_LOCAL_ALIAS, see comment near SYM_FUNC_START */
++#define SYM_FUNC_START_LOCAL(name) \
++ SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN)
+ #endif
+
++/* SYM_FUNC_START_LOCAL_NOALIGN -- use for local functions, w/o alignment */
++#ifndef SYM_FUNC_START_LOCAL_NOALIGN
++#define SYM_FUNC_START_LOCAL_NOALIGN(name) \
++ SYM_START(name, SYM_L_LOCAL, SYM_A_NONE)
+ #endif
+
++/* SYM_FUNC_START_WEAK -- use for weak functions */
++#ifndef SYM_FUNC_START_WEAK
++#define SYM_FUNC_START_WEAK(name) \
++ SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN)
+ #endif
++
++/* SYM_FUNC_START_WEAK_NOALIGN -- use for weak functions, w/o alignment */
++#ifndef SYM_FUNC_START_WEAK_NOALIGN
++#define SYM_FUNC_START_WEAK_NOALIGN(name) \
++ SYM_START(name, SYM_L_WEAK, SYM_A_NONE)
++#endif
++
++/* SYM_FUNC_END_ALIAS -- the end of LOCAL_ALIASed or ALIASed function */
++#ifndef SYM_FUNC_END_ALIAS
++#define SYM_FUNC_END_ALIAS(name) \
++ SYM_END(name, SYM_T_FUNC)
++#endif
++
++/*
++ * SYM_FUNC_END -- the end of SYM_FUNC_START_LOCAL, SYM_FUNC_START,
++ * SYM_FUNC_START_WEAK, ...
++ */
++#ifndef SYM_FUNC_END
++/* the same as SYM_FUNC_END_ALIAS, see comment near SYM_FUNC_START */
++#define SYM_FUNC_END(name) \
++ SYM_END(name, SYM_T_FUNC)
++#endif
++
++/* SYM_CODE_START -- use for non-C (special) functions */
++#ifndef SYM_CODE_START
++#define SYM_CODE_START(name) \
++ SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN)
++#endif
++
++/* SYM_CODE_START_NOALIGN -- use for non-C (special) functions, w/o alignment */
++#ifndef SYM_CODE_START_NOALIGN
++#define SYM_CODE_START_NOALIGN(name) \
++ SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE)
++#endif
++
++/* SYM_CODE_START_LOCAL -- use for local non-C (special) functions */
++#ifndef SYM_CODE_START_LOCAL
++#define SYM_CODE_START_LOCAL(name) \
++ SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN)
++#endif
++
++/*
++ * SYM_CODE_START_LOCAL_NOALIGN -- use for local non-C (special) functions,
++ * w/o alignment
++ */
++#ifndef SYM_CODE_START_LOCAL_NOALIGN
++#define SYM_CODE_START_LOCAL_NOALIGN(name) \
++ SYM_START(name, SYM_L_LOCAL, SYM_A_NONE)
++#endif
++
++/* SYM_CODE_END -- the end of SYM_CODE_START_LOCAL, SYM_CODE_START, ... */
++#ifndef SYM_CODE_END
++#define SYM_CODE_END(name) \
++ SYM_END(name, SYM_T_NONE)
++#endif
++
++/* === data annotations === */
++
++/* SYM_DATA_START -- global data symbol */
++#ifndef SYM_DATA_START
++#define SYM_DATA_START(name) \
++ SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE)
++#endif
++
++/* SYM_DATA_START -- local data symbol */
++#ifndef SYM_DATA_START_LOCAL
++#define SYM_DATA_START_LOCAL(name) \
++ SYM_START(name, SYM_L_LOCAL, SYM_A_NONE)
++#endif
++
++/* SYM_DATA_END -- the end of SYM_DATA_START symbol */
++#ifndef SYM_DATA_END
++#define SYM_DATA_END(name) \
++ SYM_END(name, SYM_T_OBJECT)
++#endif
++
++/* SYM_DATA_END_LABEL -- the labeled end of SYM_DATA_START symbol */
++#ifndef SYM_DATA_END_LABEL
++#define SYM_DATA_END_LABEL(name, linkage, label) \
++ linkage(label) ASM_NL \
++ .type label SYM_T_OBJECT ASM_NL \
++ label: \
++ SYM_END(name, SYM_T_OBJECT)
++#endif
++
++/* SYM_DATA -- start+end wrapper around simple global data */
++#ifndef SYM_DATA
++#define SYM_DATA(name, data...) \
++ SYM_DATA_START(name) ASM_NL \
++ data ASM_NL \
++ SYM_DATA_END(name)
++#endif
++
++/* SYM_DATA_LOCAL -- start+end wrapper around simple local data */
++#ifndef SYM_DATA_LOCAL
++#define SYM_DATA_LOCAL(name, data...) \
++ SYM_DATA_START_LOCAL(name) ASM_NL \
++ data ASM_NL \
++ SYM_DATA_END(name)
++#endif
++
++#endif /* __ASSEMBLY__ */
++
++#endif /* _LINUX_LINKAGE_H */
+diff --git a/include/linux/mm.h b/include/linux/mm.h
+index 34119f393a802..7249cf58f78d1 100644
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -2572,6 +2572,15 @@ static inline vm_fault_t vmf_insert_page(struct vm_area_struct *vma,
+ return VM_FAULT_NOPAGE;
+ }
+
++#ifndef io_remap_pfn_range
++static inline int io_remap_pfn_range(struct vm_area_struct *vma,
++ unsigned long addr, unsigned long pfn,
++ unsigned long size, pgprot_t prot)
++{
++ return remap_pfn_range(vma, addr, pfn, size, pgprot_decrypted(prot));
++}
++#endif
++
+ static inline vm_fault_t vmf_error(int err)
+ {
+ if (err == -ENOMEM)
+diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h
+index 22af69d237a65..fe61e3b9a9ca2 100644
+--- a/include/linux/pm_runtime.h
++++ b/include/linux/pm_runtime.h
+@@ -54,11 +54,10 @@ extern u64 pm_runtime_autosuspend_expiration(struct device *dev);
+ extern void pm_runtime_update_max_time_suspended(struct device *dev,
+ s64 delta_ns);
+ extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable);
+-extern void pm_runtime_clean_up_links(struct device *dev);
+ extern void pm_runtime_get_suppliers(struct device *dev);
+ extern void pm_runtime_put_suppliers(struct device *dev);
+ extern void pm_runtime_new_link(struct device *dev);
+-extern void pm_runtime_drop_link(struct device *dev);
++extern void pm_runtime_drop_link(struct device_link *link);
+
+ static inline void pm_suspend_ignore_children(struct device *dev, bool enable)
+ {
+@@ -173,11 +172,10 @@ static inline u64 pm_runtime_autosuspend_expiration(
+ struct device *dev) { return 0; }
+ static inline void pm_runtime_set_memalloc_noio(struct device *dev,
+ bool enable){}
+-static inline void pm_runtime_clean_up_links(struct device *dev) {}
+ static inline void pm_runtime_get_suppliers(struct device *dev) {}
+ static inline void pm_runtime_put_suppliers(struct device *dev) {}
+ static inline void pm_runtime_new_link(struct device *dev) {}
+-static inline void pm_runtime_drop_link(struct device *dev) {}
++static inline void pm_runtime_drop_link(struct device_link *link) {}
+
+ #endif /* !CONFIG_PM */
+
+diff --git a/kernel/events/core.c b/kernel/events/core.c
+index 09e1cc22221fe..1b60f9c508c9a 100644
+--- a/kernel/events/core.c
++++ b/kernel/events/core.c
+@@ -9415,6 +9415,7 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
+ if (token == IF_SRC_FILE || token == IF_SRC_FILEADDR) {
+ int fpos = token == IF_SRC_FILE ? 2 : 1;
+
++ kfree(filename);
+ filename = match_strdup(&args[fpos]);
+ if (!filename) {
+ ret = -ENOMEM;
+@@ -9461,16 +9462,13 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
+ */
+ ret = -EOPNOTSUPP;
+ if (!event->ctx->task)
+- goto fail_free_name;
++ goto fail;
+
+ /* look up the path and grab its inode */
+ ret = kern_path(filename, LOOKUP_FOLLOW,
+ &filter->path);
+ if (ret)
+- goto fail_free_name;
+-
+- kfree(filename);
+- filename = NULL;
++ goto fail;
+
+ ret = -EINVAL;
+ if (!filter->path.dentry ||
+@@ -9490,13 +9488,13 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
+ if (state != IF_STATE_ACTION)
+ goto fail;
+
++ kfree(filename);
+ kfree(orig);
+
+ return 0;
+
+-fail_free_name:
+- kfree(filename);
+ fail:
++ kfree(filename);
+ free_filters_list(filters);
+ kfree(orig);
+
+diff --git a/kernel/fork.c b/kernel/fork.c
+index e3d5963d8c6f5..419fff8eb9e55 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -2100,14 +2100,9 @@ static __latent_entropy struct task_struct *copy_process(
+ /* ok, now we should be set up.. */
+ p->pid = pid_nr(pid);
+ if (clone_flags & CLONE_THREAD) {
+- p->exit_signal = -1;
+ p->group_leader = current->group_leader;
+ p->tgid = current->tgid;
+ } else {
+- if (clone_flags & CLONE_PARENT)
+- p->exit_signal = current->group_leader->exit_signal;
+- else
+- p->exit_signal = args->exit_signal;
+ p->group_leader = p;
+ p->tgid = p->pid;
+ }
+@@ -2152,9 +2147,14 @@ static __latent_entropy struct task_struct *copy_process(
+ if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) {
+ p->real_parent = current->real_parent;
+ p->parent_exec_id = current->parent_exec_id;
++ if (clone_flags & CLONE_THREAD)
++ p->exit_signal = -1;
++ else
++ p->exit_signal = current->group_leader->exit_signal;
+ } else {
+ p->real_parent = current;
+ p->parent_exec_id = current->self_exec_id;
++ p->exit_signal = args->exit_signal;
+ }
+
+ klp_copy_process(p);
+diff --git a/kernel/futex.c b/kernel/futex.c
+index 17fba7a986e0f..9c4f9b868a491 100644
+--- a/kernel/futex.c
++++ b/kernel/futex.c
+@@ -2511,10 +2511,22 @@ retry:
+ }
+
+ /*
+- * Since we just failed the trylock; there must be an owner.
++ * The trylock just failed, so either there is an owner or
++ * there is a higher priority waiter than this one.
+ */
+ newowner = rt_mutex_owner(&pi_state->pi_mutex);
+- BUG_ON(!newowner);
++ /*
++ * If the higher priority waiter has not yet taken over the
++ * rtmutex then newowner is NULL. We can't return here with
++ * that state because it's inconsistent vs. the user space
++ * state. So drop the locks and try again. It's a valid
++ * situation and not any different from the other retry
++ * conditions.
++ */
++ if (unlikely(!newowner)) {
++ err = -EAGAIN;
++ goto handle_err;
++ }
+ } else {
+ WARN_ON_ONCE(argowner != current);
+ if (oldowner == current) {
+diff --git a/kernel/kthread.c b/kernel/kthread.c
+index bfbfa481be3a5..e51f0006057df 100644
+--- a/kernel/kthread.c
++++ b/kernel/kthread.c
+@@ -873,7 +873,8 @@ void kthread_delayed_work_timer_fn(struct timer_list *t)
+ /* Move the work from worker->delayed_work_list. */
+ WARN_ON_ONCE(list_empty(&work->node));
+ list_del_init(&work->node);
+- kthread_insert_work(worker, work, &worker->work_list);
++ if (!work->canceling)
++ kthread_insert_work(worker, work, &worker->work_list);
+
+ raw_spin_unlock_irqrestore(&worker->lock, flags);
+ }
+diff --git a/kernel/signal.c b/kernel/signal.c
+index 595a36ab87d02..8c97fc72d78bd 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -391,16 +391,17 @@ static bool task_participate_group_stop(struct task_struct *task)
+
+ void task_join_group_stop(struct task_struct *task)
+ {
++ unsigned long mask = current->jobctl & JOBCTL_STOP_SIGMASK;
++ struct signal_struct *sig = current->signal;
++
++ if (sig->group_stop_count) {
++ sig->group_stop_count++;
++ mask |= JOBCTL_STOP_CONSUME;
++ } else if (!(sig->flags & SIGNAL_STOP_STOPPED))
++ return;
++
+ /* Have the new thread join an on-going signal group stop */
+- unsigned long jobctl = current->jobctl;
+- if (jobctl & JOBCTL_STOP_PENDING) {
+- struct signal_struct *sig = current->signal;
+- unsigned long signr = jobctl & JOBCTL_STOP_SIGMASK;
+- unsigned long gstop = JOBCTL_STOP_PENDING | JOBCTL_STOP_CONSUME;
+- if (task_set_jobctl_pending(task, signr | gstop)) {
+- sig->group_stop_count++;
+- }
+- }
++ task_set_jobctl_pending(task, mask | JOBCTL_STOP_PENDING);
+ }
+
+ /*
+diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
+index 67cdb401c6ce5..6e5c6b023dc32 100644
+--- a/kernel/trace/ring_buffer.c
++++ b/kernel/trace/ring_buffer.c
+@@ -422,14 +422,16 @@ struct rb_event_info {
+
+ /*
+ * Used for which event context the event is in.
+- * NMI = 0
+- * IRQ = 1
+- * SOFTIRQ = 2
+- * NORMAL = 3
++ * TRANSITION = 0
++ * NMI = 1
++ * IRQ = 2
++ * SOFTIRQ = 3
++ * NORMAL = 4
+ *
+ * See trace_recursive_lock() comment below for more details.
+ */
+ enum {
++ RB_CTX_TRANSITION,
+ RB_CTX_NMI,
+ RB_CTX_IRQ,
+ RB_CTX_SOFTIRQ,
+@@ -2660,10 +2662,10 @@ rb_wakeups(struct ring_buffer *buffer, struct ring_buffer_per_cpu *cpu_buffer)
+ * a bit of overhead in something as critical as function tracing,
+ * we use a bitmask trick.
+ *
+- * bit 0 = NMI context
+- * bit 1 = IRQ context
+- * bit 2 = SoftIRQ context
+- * bit 3 = normal context.
++ * bit 1 = NMI context
++ * bit 2 = IRQ context
++ * bit 3 = SoftIRQ context
++ * bit 4 = normal context.
+ *
+ * This works because this is the order of contexts that can
+ * preempt other contexts. A SoftIRQ never preempts an IRQ
+@@ -2686,6 +2688,30 @@ rb_wakeups(struct ring_buffer *buffer, struct ring_buffer_per_cpu *cpu_buffer)
+ * The least significant bit can be cleared this way, and it
+ * just so happens that it is the same bit corresponding to
+ * the current context.
++ *
++ * Now the TRANSITION bit breaks the above slightly. The TRANSITION bit
++ * is set when a recursion is detected at the current context, and if
++ * the TRANSITION bit is already set, it will fail the recursion.
++ * This is needed because there's a lag between the changing of
++ * interrupt context and updating the preempt count. In this case,
++ * a false positive will be found. To handle this, one extra recursion
++ * is allowed, and this is done by the TRANSITION bit. If the TRANSITION
++ * bit is already set, then it is considered a recursion and the function
++ * ends. Otherwise, the TRANSITION bit is set, and that bit is returned.
++ *
++ * On the trace_recursive_unlock(), the TRANSITION bit will be the first
++ * to be cleared. Even if it wasn't the context that set it. That is,
++ * if an interrupt comes in while NORMAL bit is set and the ring buffer
++ * is called before preempt_count() is updated, since the check will
++ * be on the NORMAL bit, the TRANSITION bit will then be set. If an
++ * NMI then comes in, it will set the NMI bit, but when the NMI code
++ * does the trace_recursive_unlock() it will clear the TRANSTION bit
++ * and leave the NMI bit set. But this is fine, because the interrupt
++ * code that set the TRANSITION bit will then clear the NMI bit when it
++ * calls trace_recursive_unlock(). If another NMI comes in, it will
++ * set the TRANSITION bit and continue.
++ *
++ * Note: The TRANSITION bit only handles a single transition between context.
+ */
+
+ static __always_inline int
+@@ -2701,8 +2727,16 @@ trace_recursive_lock(struct ring_buffer_per_cpu *cpu_buffer)
+ bit = pc & NMI_MASK ? RB_CTX_NMI :
+ pc & HARDIRQ_MASK ? RB_CTX_IRQ : RB_CTX_SOFTIRQ;
+
+- if (unlikely(val & (1 << (bit + cpu_buffer->nest))))
+- return 1;
++ if (unlikely(val & (1 << (bit + cpu_buffer->nest)))) {
++ /*
++ * It is possible that this was called by transitioning
++ * between interrupt context, and preempt_count() has not
++ * been updated yet. In this case, use the TRANSITION bit.
++ */
++ bit = RB_CTX_TRANSITION;
++ if (val & (1 << (bit + cpu_buffer->nest)))
++ return 1;
++ }
+
+ val |= (1 << (bit + cpu_buffer->nest));
+ cpu_buffer->current_context = val;
+@@ -2717,8 +2751,8 @@ trace_recursive_unlock(struct ring_buffer_per_cpu *cpu_buffer)
+ cpu_buffer->current_context - (1 << cpu_buffer->nest);
+ }
+
+-/* The recursive locking above uses 4 bits */
+-#define NESTED_BITS 4
++/* The recursive locking above uses 5 bits */
++#define NESTED_BITS 5
+
+ /**
+ * ring_buffer_nest_start - Allow to trace while nested
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
+index 5b2a664812b10..2a357bda45cf0 100644
+--- a/kernel/trace/trace.c
++++ b/kernel/trace/trace.c
+@@ -3012,7 +3012,7 @@ static char *get_trace_buf(void)
+
+ /* Interrupts must see nesting incremented before we use the buffer */
+ barrier();
+- return &buffer->buffer[buffer->nesting][0];
++ return &buffer->buffer[buffer->nesting - 1][0];
+ }
+
+ static void put_trace_buf(void)
+diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
+index 4055158c1dd25..fc3aa81a43e3c 100644
+--- a/kernel/trace/trace.h
++++ b/kernel/trace/trace.h
+@@ -592,6 +592,12 @@ enum {
+ * function is called to clear it.
+ */
+ TRACE_GRAPH_NOTRACE_BIT,
++
++ /*
++ * When transitioning between context, the preempt_count() may
++ * not be correct. Allow for a single recursion to cover this case.
++ */
++ TRACE_TRANSITION_BIT,
+ };
+
+ #define trace_recursion_set(bit) do { (current)->trace_recursion |= (1<<(bit)); } while (0)
+@@ -646,14 +652,27 @@ static __always_inline int trace_test_and_set_recursion(int start, int max)
+ return 0;
+
+ bit = trace_get_context_bit() + start;
+- if (unlikely(val & (1 << bit)))
+- return -1;
++ if (unlikely(val & (1 << bit))) {
++ /*
++ * It could be that preempt_count has not been updated during
++ * a switch between contexts. Allow for a single recursion.
++ */
++ bit = TRACE_TRANSITION_BIT;
++ if (trace_recursion_test(bit))
++ return -1;
++ trace_recursion_set(bit);
++ barrier();
++ return bit + 1;
++ }
++
++ /* Normal check passed, clear the transition to allow it again */
++ trace_recursion_clear(TRACE_TRANSITION_BIT);
+
+ val |= 1 << bit;
+ current->trace_recursion = val;
+ barrier();
+
+- return bit;
++ return bit + 1;
+ }
+
+ static __always_inline void trace_clear_recursion(int bit)
+@@ -663,6 +682,7 @@ static __always_inline void trace_clear_recursion(int bit)
+ if (!bit)
+ return;
+
++ bit--;
+ bit = 1 << bit;
+ val &= ~bit;
+
+diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c
+index 69ee8ef12cee3..0838c290ac7f3 100644
+--- a/kernel/trace/trace_selftest.c
++++ b/kernel/trace/trace_selftest.c
+@@ -492,8 +492,13 @@ trace_selftest_function_recursion(void)
+ unregister_ftrace_function(&test_rec_probe);
+
+ ret = -1;
+- if (trace_selftest_recursion_cnt != 1) {
+- pr_cont("*callback not called once (%d)* ",
++ /*
++ * Recursion allows for transitions between context,
++ * and may call the callback twice.
++ */
++ if (trace_selftest_recursion_cnt != 1 &&
++ trace_selftest_recursion_cnt != 2) {
++ pr_cont("*callback not called once (or twice) (%d)* ",
+ trace_selftest_recursion_cnt);
+ goto out;
+ }
+diff --git a/lib/crc32test.c b/lib/crc32test.c
+index 97d6a57cefcc5..61ddce2cff777 100644
+--- a/lib/crc32test.c
++++ b/lib/crc32test.c
+@@ -683,7 +683,6 @@ static int __init crc32c_test(void)
+
+ /* reduce OS noise */
+ local_irq_save(flags);
+- local_irq_disable();
+
+ nsec = ktime_get_ns();
+ for (i = 0; i < 100; i++) {
+@@ -694,7 +693,6 @@ static int __init crc32c_test(void)
+ nsec = ktime_get_ns() - nsec;
+
+ local_irq_restore(flags);
+- local_irq_enable();
+
+ pr_info("crc32c: CRC_LE_BITS = %d\n", CRC_LE_BITS);
+
+@@ -768,7 +766,6 @@ static int __init crc32_test(void)
+
+ /* reduce OS noise */
+ local_irq_save(flags);
+- local_irq_disable();
+
+ nsec = ktime_get_ns();
+ for (i = 0; i < 100; i++) {
+@@ -783,7 +780,6 @@ static int __init crc32_test(void)
+ nsec = ktime_get_ns() - nsec;
+
+ local_irq_restore(flags);
+- local_irq_enable();
+
+ pr_info("crc32: CRC_LE_BITS = %d, CRC_BE BITS = %d\n",
+ CRC_LE_BITS, CRC_BE_BITS);
+diff --git a/lib/fonts/font_10x18.c b/lib/fonts/font_10x18.c
+index 0e2deac97da0d..e02f9df24d1ee 100644
+--- a/lib/fonts/font_10x18.c
++++ b/lib/fonts/font_10x18.c
+@@ -8,7 +8,7 @@
+
+ #define FONTDATAMAX 9216
+
+-static struct font_data fontdata_10x18 = {
++static const struct font_data fontdata_10x18 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* 0 0x00 '^@' */
+ 0x00, 0x00, /* 0000000000 */
+diff --git a/lib/fonts/font_6x10.c b/lib/fonts/font_6x10.c
+index 87da8acd07db0..6e3c4b7691c85 100644
+--- a/lib/fonts/font_6x10.c
++++ b/lib/fonts/font_6x10.c
+@@ -3,7 +3,7 @@
+
+ #define FONTDATAMAX 2560
+
+-static struct font_data fontdata_6x10 = {
++static const struct font_data fontdata_6x10 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* 0 0x00 '^@' */
+ 0x00, /* 00000000 */
+diff --git a/lib/fonts/font_6x11.c b/lib/fonts/font_6x11.c
+index 5e975dfa10a53..2d22a24e816f0 100644
+--- a/lib/fonts/font_6x11.c
++++ b/lib/fonts/font_6x11.c
+@@ -9,7 +9,7 @@
+
+ #define FONTDATAMAX (11*256)
+
+-static struct font_data fontdata_6x11 = {
++static const struct font_data fontdata_6x11 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* 0 0x00 '^@' */
+ 0x00, /* 00000000 */
+diff --git a/lib/fonts/font_7x14.c b/lib/fonts/font_7x14.c
+index 86d298f385058..9cc7ae2e03f7d 100644
+--- a/lib/fonts/font_7x14.c
++++ b/lib/fonts/font_7x14.c
+@@ -8,7 +8,7 @@
+
+ #define FONTDATAMAX 3584
+
+-static struct font_data fontdata_7x14 = {
++static const struct font_data fontdata_7x14 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* 0 0x00 '^@' */
+ 0x00, /* 0000000 */
+diff --git a/lib/fonts/font_8x16.c b/lib/fonts/font_8x16.c
+index 37cedd36ca5ef..bab25dc59e8dd 100644
+--- a/lib/fonts/font_8x16.c
++++ b/lib/fonts/font_8x16.c
+@@ -10,7 +10,7 @@
+
+ #define FONTDATAMAX 4096
+
+-static struct font_data fontdata_8x16 = {
++static const struct font_data fontdata_8x16 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* 0 0x00 '^@' */
+ 0x00, /* 00000000 */
+diff --git a/lib/fonts/font_8x8.c b/lib/fonts/font_8x8.c
+index 8ab695538395d..109d0572368f4 100644
+--- a/lib/fonts/font_8x8.c
++++ b/lib/fonts/font_8x8.c
+@@ -9,7 +9,7 @@
+
+ #define FONTDATAMAX 2048
+
+-static struct font_data fontdata_8x8 = {
++static const struct font_data fontdata_8x8 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* 0 0x00 '^@' */
+ 0x00, /* 00000000 */
+diff --git a/lib/fonts/font_acorn_8x8.c b/lib/fonts/font_acorn_8x8.c
+index 069b3e80c4344..fb395f0d40317 100644
+--- a/lib/fonts/font_acorn_8x8.c
++++ b/lib/fonts/font_acorn_8x8.c
+@@ -5,7 +5,7 @@
+
+ #define FONTDATAMAX 2048
+
+-static struct font_data acorndata_8x8 = {
++static const struct font_data acorndata_8x8 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* 00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ^@ */
+ /* 01 */ 0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e, /* ^A */
+diff --git a/lib/fonts/font_mini_4x6.c b/lib/fonts/font_mini_4x6.c
+index 1449876c6a270..592774a90917b 100644
+--- a/lib/fonts/font_mini_4x6.c
++++ b/lib/fonts/font_mini_4x6.c
+@@ -43,7 +43,7 @@ __END__;
+
+ #define FONTDATAMAX 1536
+
+-static struct font_data fontdata_mini_4x6 = {
++static const struct font_data fontdata_mini_4x6 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /*{*/
+ /* Char 0: ' ' */
+diff --git a/lib/fonts/font_pearl_8x8.c b/lib/fonts/font_pearl_8x8.c
+index 32d65551e7ed2..a6f95ebce9507 100644
+--- a/lib/fonts/font_pearl_8x8.c
++++ b/lib/fonts/font_pearl_8x8.c
+@@ -14,7 +14,7 @@
+
+ #define FONTDATAMAX 2048
+
+-static struct font_data fontdata_pearl8x8 = {
++static const struct font_data fontdata_pearl8x8 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* 0 0x00 '^@' */
+ 0x00, /* 00000000 */
+diff --git a/lib/fonts/font_sun12x22.c b/lib/fonts/font_sun12x22.c
+index 641a6b4dca424..a5b65bd496045 100644
+--- a/lib/fonts/font_sun12x22.c
++++ b/lib/fonts/font_sun12x22.c
+@@ -3,7 +3,7 @@
+
+ #define FONTDATAMAX 11264
+
+-static struct font_data fontdata_sun12x22 = {
++static const struct font_data fontdata_sun12x22 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* 0 0x00 '^@' */
+ 0x00, 0x00, /* 000000000000 */
+diff --git a/lib/fonts/font_sun8x16.c b/lib/fonts/font_sun8x16.c
+index 193fe6d988e08..e577e76a6a7c0 100644
+--- a/lib/fonts/font_sun8x16.c
++++ b/lib/fonts/font_sun8x16.c
+@@ -3,7 +3,7 @@
+
+ #define FONTDATAMAX 4096
+
+-static struct font_data fontdata_sun8x16 = {
++static const struct font_data fontdata_sun8x16 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ /* */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ /* */ 0x00,0x00,0x7e,0x81,0xa5,0x81,0x81,0xbd,0x99,0x81,0x81,0x7e,0x00,0x00,0x00,0x00,
+diff --git a/lib/fonts/font_ter16x32.c b/lib/fonts/font_ter16x32.c
+index 91b9c283bd9cc..f7c3abb6b99e2 100644
+--- a/lib/fonts/font_ter16x32.c
++++ b/lib/fonts/font_ter16x32.c
+@@ -4,7 +4,7 @@
+
+ #define FONTDATAMAX 16384
+
+-static struct font_data fontdata_ter16x32 = {
++static const struct font_data fontdata_ter16x32 = {
+ { 0, 0, FONTDATAMAX, 0 }, {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfc, 0x7f, 0xfc,
+diff --git a/mm/mempolicy.c b/mm/mempolicy.c
+index 787c5fc91b217..87d165923fee2 100644
+--- a/mm/mempolicy.c
++++ b/mm/mempolicy.c
+@@ -496,7 +496,7 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr,
+ unsigned long flags = qp->flags;
+ int ret;
+ bool has_unmovable = false;
+- pte_t *pte;
++ pte_t *pte, *mapped_pte;
+ spinlock_t *ptl;
+
+ ptl = pmd_trans_huge_lock(pmd, vma);
+@@ -510,7 +510,7 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr,
+ if (pmd_trans_unstable(pmd))
+ return 0;
+
+- pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
++ mapped_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
+ for (; addr != end; pte++, addr += PAGE_SIZE) {
+ if (!pte_present(*pte))
+ continue;
+@@ -542,7 +542,7 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr,
+ } else
+ break;
+ }
+- pte_unmap_unlock(pte - 1, ptl);
++ pte_unmap_unlock(mapped_pte, ptl);
+ cond_resched();
+
+ if (has_unmovable)
+diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
+index a0b4dc54f8a60..f61c5a0b502a8 100644
+--- a/net/ipv4/ip_tunnel.c
++++ b/net/ipv4/ip_tunnel.c
+@@ -614,9 +614,6 @@ void ip_md_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
+ ttl = ip4_dst_hoplimit(&rt->dst);
+ }
+
+- if (!df && skb->protocol == htons(ETH_P_IP))
+- df = inner_iph->frag_off & htons(IP_DF);
+-
+ headroom += LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len;
+ if (headroom > dev->needed_headroom)
+ dev->needed_headroom = headroom;
+diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
+index 6927b658dad36..4b7edb3645c30 100644
+--- a/net/sctp/sm_sideeffect.c
++++ b/net/sctp/sm_sideeffect.c
+@@ -1600,12 +1600,12 @@ static int sctp_cmd_interpreter(enum sctp_event_type event_type,
+ break;
+
+ case SCTP_CMD_INIT_FAILED:
+- sctp_cmd_init_failed(commands, asoc, cmd->obj.u32);
++ sctp_cmd_init_failed(commands, asoc, cmd->obj.u16);
+ break;
+
+ case SCTP_CMD_ASSOC_FAILED:
+ sctp_cmd_assoc_failed(commands, asoc, event_type,
+- subtype, chunk, cmd->obj.u32);
++ subtype, chunk, cmd->obj.u16);
+ break;
+
+ case SCTP_CMD_INIT_COUNTER_INC:
+diff --git a/net/tipc/core.c b/net/tipc/core.c
+index 12192e7f40503..2374adb505589 100644
+--- a/net/tipc/core.c
++++ b/net/tipc/core.c
+@@ -98,6 +98,11 @@ static void __net_exit tipc_exit_net(struct net *net)
+ {
+ tipc_detach_loopback(net);
+ tipc_net_stop(net);
++
++ /* Make sure the tipc_net_finalize_work stopped
++ * before releasing the resources.
++ */
++ flush_scheduled_work();
+ tipc_bcast_stop(net);
+ tipc_nametbl_stop(net);
+ tipc_sk_rht_destroy(net);
+diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
+index 7bd6c8199ca67..3a074a03d3820 100644
+--- a/net/vmw_vsock/af_vsock.c
++++ b/net/vmw_vsock/af_vsock.c
+@@ -621,7 +621,7 @@ struct sock *__vsock_create(struct net *net,
+ vsk->owner = get_cred(psk->owner);
+ vsk->connect_timeout = psk->connect_timeout;
+ } else {
+- vsk->trusted = capable(CAP_NET_ADMIN);
++ vsk->trusted = ns_capable_noaudit(&init_user_ns, CAP_NET_ADMIN);
+ vsk->owner = get_current_cred();
+ vsk->connect_timeout = VSOCK_DEFAULT_CONNECT_TIMEOUT;
+ }
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 7a24e9f0d2fe7..d25c3bee56f87 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -5990,6 +5990,27 @@ static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
+ snd_hda_override_wcaps(codec, 0x03, 0);
+ }
+
++static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
++{
++ switch (codec->core.vendor_id) {
++ case 0x10ec0274:
++ case 0x10ec0294:
++ case 0x10ec0225:
++ case 0x10ec0295:
++ case 0x10ec0299:
++ alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
++ alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
++ break;
++ case 0x10ec0235:
++ case 0x10ec0236:
++ case 0x10ec0255:
++ case 0x10ec0256:
++ alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
++ alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
++ break;
++ }
++}
++
+ static void alc295_fixup_chromebook(struct hda_codec *codec,
+ const struct hda_fixup *fix, int action)
+ {
+@@ -6000,16 +6021,7 @@ static void alc295_fixup_chromebook(struct hda_codec *codec,
+ spec->ultra_low_power = true;
+ break;
+ case HDA_FIXUP_ACT_INIT:
+- switch (codec->core.vendor_id) {
+- case 0x10ec0295:
+- alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
+- alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
+- break;
+- case 0x10ec0236:
+- alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
+- alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
+- break;
+- }
++ alc_combo_jack_hp_jd_restart(codec);
+ break;
+ }
+ }
+@@ -6065,6 +6077,16 @@ static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
+ alc_write_coef_idx(codec, 0x65, 0x0);
+ }
+
++static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
++ const struct hda_fixup *fix, int action)
++{
++ switch (action) {
++ case HDA_FIXUP_ACT_INIT:
++ alc_combo_jack_hp_jd_restart(codec);
++ break;
++ }
++}
++
+ /* for hda_fixup_thinkpad_acpi() */
+ #include "thinkpad_helper.c"
+
+@@ -6259,6 +6281,8 @@ enum {
+ ALC256_FIXUP_INTEL_NUC8_RUGGED,
+ ALC255_FIXUP_XIAOMI_HEADSET_MIC,
+ ALC274_FIXUP_HP_MIC,
++ ALC274_FIXUP_HP_HEADSET_MIC,
++ ALC256_FIXUP_ASUS_HPE,
+ };
+
+ static const struct hda_fixup alc269_fixups[] = {
+@@ -7646,6 +7670,23 @@ static const struct hda_fixup alc269_fixups[] = {
+ { }
+ },
+ },
++ [ALC274_FIXUP_HP_HEADSET_MIC] = {
++ .type = HDA_FIXUP_FUNC,
++ .v.func = alc274_fixup_hp_headset_mic,
++ .chained = true,
++ .chain_id = ALC274_FIXUP_HP_MIC
++ },
++ [ALC256_FIXUP_ASUS_HPE] = {
++ .type = HDA_FIXUP_VERBS,
++ .v.verbs = (const struct hda_verb[]) {
++ /* Set EAPD high */
++ { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
++ { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
++ { }
++ },
++ .chained = true,
++ .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
++ },
+ };
+
+ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+@@ -7797,7 +7838,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+ SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
+ SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
+ SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
+- SND_PCI_QUIRK(0x103c, 0x874e, "HP", ALC274_FIXUP_HP_MIC),
+ SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
+ SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
+ SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
+@@ -7830,6 +7870,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+ SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
+ SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
+ SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
++ SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
+ SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
+ SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
+ SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
+@@ -8353,6 +8394,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
+ {0x1a, 0x90a70130},
+ {0x1b, 0x90170110},
+ {0x21, 0x03211020}),
++ SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
++ {0x17, 0x90170110},
++ {0x19, 0x03a11030},
++ {0x21, 0x03211020}),
+ SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
+ {0x12, 0x90a60130},
+ {0x14, 0x90170110},
+diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
+index 69cd7a81bf2ac..4b114ece58c61 100644
+--- a/sound/soc/intel/skylake/skl-topology.c
++++ b/sound/soc/intel/skylake/skl-topology.c
+@@ -14,6 +14,7 @@
+ #include <linux/uuid.h>
+ #include <sound/intel-nhlt.h>
+ #include <sound/soc.h>
++#include <sound/soc-acpi.h>
+ #include <sound/soc-topology.h>
+ #include <uapi/sound/snd_sst_tokens.h>
+ #include <uapi/sound/skl-tplg-interface.h>
+@@ -3565,8 +3566,20 @@ int skl_tplg_init(struct snd_soc_component *component, struct hdac_bus *bus)
+
+ ret = request_firmware(&fw, skl->tplg_name, bus->dev);
+ if (ret < 0) {
+- dev_info(bus->dev, "tplg fw %s load failed with %d, falling back to dfw_sst.bin",
+- skl->tplg_name, ret);
++ char alt_tplg_name[64];
++
++ snprintf(alt_tplg_name, sizeof(alt_tplg_name), "%s-tplg.bin",
++ skl->mach->drv_name);
++ dev_info(bus->dev, "tplg fw %s load failed with %d, trying alternative tplg name %s",
++ skl->tplg_name, ret, alt_tplg_name);
++
++ ret = request_firmware(&fw, alt_tplg_name, bus->dev);
++ if (!ret)
++ goto component_load;
++
++ dev_info(bus->dev, "tplg %s failed with %d, falling back to dfw_sst.bin",
++ alt_tplg_name, ret);
++
+ ret = request_firmware(&fw, "dfw_sst.bin", bus->dev);
+ if (ret < 0) {
+ dev_err(bus->dev, "Fallback tplg fw %s load failed with %d\n",
+@@ -3575,6 +3588,8 @@ int skl_tplg_init(struct snd_soc_component *component, struct hdac_bus *bus)
+ }
+ }
+
++component_load:
++
+ /*
+ * The complete tplg for SKL is loaded as index 0, we don't use
+ * any other index
+diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
+index 878f1201aad6e..1a5e555002b2b 100644
+--- a/sound/usb/pcm.c
++++ b/sound/usb/pcm.c
+@@ -323,6 +323,7 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
+ switch (subs->stream->chip->usb_id) {
+ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
+ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */
++ case USB_ID(0x22f0, 0x0006): /* Allen&Heath Qu-16 */
+ ep = 0x81;
+ ifnum = 3;
+ goto add_sync_ep_from_ifnum;
+@@ -332,6 +333,7 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
+ ifnum = 2;
+ goto add_sync_ep_from_ifnum;
+ case USB_ID(0x2466, 0x8003): /* Fractal Audio Axe-Fx II */
++ case USB_ID(0x0499, 0x172a): /* Yamaha MODX */
+ ep = 0x86;
+ ifnum = 2;
+ goto add_sync_ep_from_ifnum;
+@@ -339,6 +341,10 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
+ ep = 0x81;
+ ifnum = 2;
+ goto add_sync_ep_from_ifnum;
++ case USB_ID(0x1686, 0xf029): /* Zoom UAC-2 */
++ ep = 0x82;
++ ifnum = 2;
++ goto add_sync_ep_from_ifnum;
+ case USB_ID(0x1397, 0x0001): /* Behringer UFX1604 */
+ case USB_ID(0x1397, 0x0002): /* Behringer UFX1204 */
+ ep = 0x81;
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index cc75d9749e9fa..825b6f2efada5 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -1732,6 +1732,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
+ case 0x278b: /* Rotel? */
+ case 0x292b: /* Gustard/Ess based devices */
+ case 0x2ab6: /* T+A devices */
++ case 0x3353: /* Khadas devices */
+ case 0x3842: /* EVGA */
+ case 0xc502: /* HiBy devices */
+ if (fp->dsd_raw)